@covro/covro 0.6.1-dev.3 → 0.6.1-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 (115) hide show
  1. package/README.md +2 -2
  2. package/README.zh-CN.md +2 -2
  3. package/dist/cli/background.js +10 -7
  4. package/dist/cli/background.js.map +2 -2
  5. package/dist/cli/daemon.js +3 -1
  6. package/dist/cli/daemon.js.map +2 -2
  7. package/dist/cli/launch-environment.js +5 -2
  8. package/dist/cli/launch-environment.js.map +2 -2
  9. package/dist/cli/launchd.js +14 -8
  10. package/dist/cli/launchd.js.map +2 -2
  11. package/dist/cli/runtime-launch.js +108 -0
  12. package/dist/cli/runtime-launch.js.map +7 -0
  13. package/dist/cli/runtime.js +12 -0
  14. package/dist/cli/runtime.js.map +7 -0
  15. package/dist/cli/service.js +7 -4
  16. package/dist/cli/service.js.map +2 -2
  17. package/dist/shared/updates.js.map +2 -2
  18. package/dist/update-worker.cjs +1111 -754
  19. package/dist/updates/manager.js +89 -8
  20. package/dist/updates/manager.js.map +2 -2
  21. package/dist/updates/registry.js +7 -6
  22. package/dist/updates/registry.js.map +2 -2
  23. package/dist/updates/runtime.js +183 -0
  24. package/dist/updates/runtime.js.map +7 -0
  25. package/dist/updates/transaction.js +8 -4
  26. package/dist/updates/transaction.js.map +2 -2
  27. package/dist/updates/worker.js +177 -112
  28. package/dist/updates/worker.js.map +3 -3
  29. package/dist/web/assets/{abnfDiagram-WEYOIA3C-BzVXOBcA.js → abnfDiagram-WEYOIA3C--q3UKu-m.js} +1 -1
  30. package/dist/web/assets/{arc-CyQWAnQd.js → arc-CsDLrA4o.js} +1 -1
  31. package/dist/web/assets/{architecture-WOLXFQ4H-BEoyxwG0.js → architecture-WOLXFQ4H-6TbwoUek.js} +1 -1
  32. package/dist/web/assets/{architectureDiagram-ZHVYKT53-CCXl4OZW.js → architectureDiagram-ZHVYKT53-GNeotXgT.js} +1 -1
  33. package/dist/web/assets/{blockDiagram-RJAE7QA3-D7dGEImG.js → blockDiagram-RJAE7QA3-Ric8Njom.js} +1 -1
  34. package/dist/web/assets/{c4Diagram-XDPPPE54-DV8znYp0.js → c4Diagram-XDPPPE54-CSFzq9_N.js} +1 -1
  35. package/dist/web/assets/channel-M3Agpi7p.js +1 -0
  36. package/dist/web/assets/{chunk-2E7WHVMD-0QrTjfW_.js → chunk-2E7WHVMD-BwjaS8bo.js} +1 -1
  37. package/dist/web/assets/{chunk-4EMNKR2T-D-zlzBAy.js → chunk-4EMNKR2T-V38rR2JO.js} +1 -1
  38. package/dist/web/assets/{chunk-55XCU76K-CVHEMROA.js → chunk-55XCU76K-DjF4oGX1.js} +1 -1
  39. package/dist/web/assets/{chunk-7S6XSTFO-C2rIevGp.js → chunk-7S6XSTFO-5YHKdb3u.js} +1 -1
  40. package/dist/web/assets/{chunk-AQDTSKZB-DYAv-Riy.js → chunk-AQDTSKZB-BGqebfJY.js} +1 -1
  41. package/dist/web/assets/{chunk-DSNLSHJZ-DWI7CHhD.js → chunk-DSNLSHJZ-DoWMycRk.js} +1 -1
  42. package/dist/web/assets/{chunk-HAGFOTED-CO_q1459.js → chunk-HAGFOTED-D23fXc2S.js} +1 -1
  43. package/dist/web/assets/{chunk-HNE4Q36P-CgksCWEg.js → chunk-HNE4Q36P-BIJsRvPs.js} +1 -1
  44. package/dist/web/assets/{chunk-NQOKRVIF-BkpxlXF9.js → chunk-NQOKRVIF-C54OjZSl.js} +1 -1
  45. package/dist/web/assets/{chunk-UHW7PFBP-BMZQKGkg.js → chunk-UHW7PFBP-C0X5au9W.js} +1 -1
  46. package/dist/web/assets/{chunk-VQ5W62QI-DxCsqxIr.js → chunk-VQ5W62QI-C2vDy1Kl.js} +1 -1
  47. package/dist/web/assets/{chunk-WQQL4CDK-Drs4qCbY.js → chunk-WQQL4CDK-CcesvmQO.js} +1 -1
  48. package/dist/web/assets/{chunk-XXDRQBXY--mv0FkSH.js → chunk-XXDRQBXY-EiI0PYcn.js} +1 -1
  49. package/dist/web/assets/{chunk-YZO67HFG-BrXN1Efx.js → chunk-YZO67HFG-BqeaVf9n.js} +1 -1
  50. package/dist/web/assets/{chunk-ZAUX2LTX-DWiVb0QN.js → chunk-ZAUX2LTX-DW6sEeTI.js} +1 -1
  51. package/dist/web/assets/{chunk-ZCHMQSOR-p8m3-BJN.js → chunk-ZCHMQSOR-BrlOBygH.js} +1 -1
  52. package/dist/web/assets/{classDiagram-v2-4MYWR3UA-lnHHmraY.js → classDiagram-v2-4MYWR3UA-DFpCrr_A.js} +1 -1
  53. package/dist/web/assets/{cose-bilkent-JH36ORCC-B1BVV8Wv.js → cose-bilkent-JH36ORCC-CAWPSnN6.js} +1 -1
  54. package/dist/web/assets/{cynefin-EF2NZ3EQ-C4TULYfr.js → cynefin-EF2NZ3EQ-DMeYqL7r.js} +1 -1
  55. package/dist/web/assets/{cynefinDiagram-WF24UDRP-rExRJUWB.js → cynefinDiagram-WF24UDRP-DI-bFsxF.js} +1 -1
  56. package/dist/web/assets/{dagre-NK4GIZVX-DI6KC0Pk.js → dagre-NK4GIZVX-CdoitF7O.js} +1 -1
  57. package/dist/web/assets/{diagram-CBK3MWTC-Don_Jr-E.js → diagram-CBK3MWTC-DVTPnBLF.js} +1 -1
  58. package/dist/web/assets/{diagram-I5XIIV2D-BW1FwPhX.js → diagram-I5XIIV2D-3eS1TE4r.js} +1 -1
  59. package/dist/web/assets/{diagram-ODIL2UCW-DxqQXqCa.js → diagram-ODIL2UCW-cLU1ehlH.js} +1 -1
  60. package/dist/web/assets/{diagram-PFBEJUXE-DeFKndZw.js → diagram-PFBEJUXE-Bd1TAqaL.js} +1 -1
  61. package/dist/web/assets/{diagram-RJA3I4VV-CM31q1uK.js → diagram-RJA3I4VV-CQqVlBOF.js} +1 -1
  62. package/dist/web/assets/{diagram-TYUNFSNR-DTq2AOnu.js → diagram-TYUNFSNR-CCGCiVOv.js} +1 -1
  63. package/dist/web/assets/{dist-V4sbzI-h.js → dist-BE4VEq-n.js} +1 -1
  64. package/dist/web/assets/{ebnfDiagram-V4P3TTPT-DF58HT_y.js → ebnfDiagram-V4P3TTPT-BGOHdBAS.js} +1 -1
  65. package/dist/web/assets/{elk-QONTBCTQ-BwrVYRCb.js → elk-QONTBCTQ-D5OlAFYO.js} +1 -1
  66. package/dist/web/assets/{erDiagram-KYQIGQAA-P1WxHJun.js → erDiagram-KYQIGQAA-DUtlMKNi.js} +1 -1
  67. package/dist/web/assets/{eventmodeling-K75KTNOO-BtccOmRK.js → eventmodeling-K75KTNOO-DXK-D1Z0.js} +1 -1
  68. package/dist/web/assets/flowDiagram-IUGLLWBU-4EVBAMrs.js +1 -0
  69. package/dist/web/assets/{ganttDiagram-R7GPNTJY-D3qJC4vO.js → ganttDiagram-R7GPNTJY-BVGsal-Q.js} +1 -1
  70. package/dist/web/assets/{gitGraph-VSP46ZUC-BVY9Gtih.js → gitGraph-VSP46ZUC-DV6-WqhO.js} +1 -1
  71. package/dist/web/assets/{gitGraphDiagram-PDYL7XHY-CZvvvj3Q.js → gitGraphDiagram-PDYL7XHY-0QK_COI_.js} +1 -1
  72. package/dist/web/assets/{index-B9qAZAx0.js → index-BBPzwzxe.js} +46 -44
  73. package/dist/web/assets/{index-_yn3Nt0h.css → index-CSpioreu.css} +1 -1
  74. package/dist/web/assets/{info-OHQRW6UA-BGqiJ9Yx.js → info-OHQRW6UA-BZipuOqr.js} +1 -1
  75. package/dist/web/assets/{infoDiagram-MVDRKAX5-DxdTuj3n.js → infoDiagram-MVDRKAX5-1db4SZ4k.js} +1 -1
  76. package/dist/web/assets/{ishikawaDiagram-HPEHV2GE-DbhjLHsb.js → ishikawaDiagram-HPEHV2GE-DTrI4oTY.js} +1 -1
  77. package/dist/web/assets/{journeyDiagram-BOSHW7O7-DJROkZUW.js → journeyDiagram-BOSHW7O7-Bk5sPpaD.js} +1 -1
  78. package/dist/web/assets/{kanban-definition-FNSA4HC5-D4HijqrG.js → kanban-definition-FNSA4HC5-smf99L9V.js} +1 -1
  79. package/dist/web/assets/{line-d2EHEr40.js → line-9F_GFNcI.js} +1 -1
  80. package/dist/web/assets/{linear-CnT_m8Aq.js → linear-B80ozVj0.js} +1 -1
  81. package/dist/web/assets/{mermaid-parser.core-BqD0_cdI.js → mermaid-parser.core-DldmXGom.js} +3 -3
  82. package/dist/web/assets/{mermaid.core-Dd1sHHm2.js → mermaid.core-DIZvVrdE.js} +4 -4
  83. package/dist/web/assets/{mindmap-definition-6OY57UG3-KPpq2dAV.js → mindmap-definition-6OY57UG3-CLhpt9eO.js} +1 -1
  84. package/dist/web/assets/{packet-JDAUHWVQ-CXnrw9bC.js → packet-JDAUHWVQ-CL3Q6msP.js} +1 -1
  85. package/dist/web/assets/{pegDiagram-ECIUJNBX-BIXIhs7W.js → pegDiagram-ECIUJNBX-BeBvMY1a.js} +1 -1
  86. package/dist/web/assets/{pie-XZMESJXO-TrDzTbhs.js → pie-XZMESJXO-D_fdN7qT.js} +1 -1
  87. package/dist/web/assets/{pieDiagram-GNMPY74T-D8a4Sfn1.js → pieDiagram-GNMPY74T-DROrBz0o.js} +1 -1
  88. package/dist/web/assets/{quadrantDiagram-D57K4MC3-Bt2I_ygO.js → quadrantDiagram-D57K4MC3-C57SBgx7.js} +1 -1
  89. package/dist/web/assets/{radar-ABXABTNO-BZDG4zL1.js → radar-ABXABTNO-B0-FyoLn.js} +1 -1
  90. package/dist/web/assets/{railroad-I3PHUGI6-CVZI3RsT.js → railroad-I3PHUGI6-_ocCyblF.js} +1 -1
  91. package/dist/web/assets/{railroad-abnf-LNEFI6M7-BLFBfBsa.js → railroad-abnf-LNEFI6M7-Ct1oCv45.js} +1 -1
  92. package/dist/web/assets/{railroad-ebnf-DWYD2UWJ-CKhl-KNN.js → railroad-ebnf-DWYD2UWJ-Dz3MdcvL.js} +1 -1
  93. package/dist/web/assets/{railroad-peg-JR7BVNR7-CaxuMu1-.js → railroad-peg-JR7BVNR7-Ds4ONRXC.js} +1 -1
  94. package/dist/web/assets/{railroadDiagram-Y72NRBL7-BmN9o9yG.js → railroadDiagram-Y72NRBL7-DqS1adHB.js} +1 -1
  95. package/dist/web/assets/{requirementDiagram-EQYSW5RA-CytiXIk0.js → requirementDiagram-EQYSW5RA-BReuC0TK.js} +1 -1
  96. package/dist/web/assets/{sankeyDiagram-SY24JHO5-2oasnbjI.js → sankeyDiagram-SY24JHO5-DDjUr4b9.js} +1 -1
  97. package/dist/web/assets/{sequenceDiagram-BLEHNHQU-CgKYeJhF.js → sequenceDiagram-BLEHNHQU-D71Uv16-.js} +1 -1
  98. package/dist/web/assets/{src-DeJ6DlL6.js → src-DiejhDC1.js} +1 -1
  99. package/dist/web/assets/{stateDiagram-v2-A6IESKWZ-BcBo9Tt9.js → stateDiagram-v2-A6IESKWZ-B8w400YH.js} +1 -1
  100. package/dist/web/assets/{swimlanes-B3ENRKFQ-DHvDY449.js → swimlanes-B3ENRKFQ-Cx8dbIra.js} +1 -1
  101. package/dist/web/assets/swimlanesDiagram-AYQRV4AK-DLuNBE0x.js +8 -0
  102. package/dist/web/assets/{timeline-definition-JXYKGLGB-DHOYx58-.js → timeline-definition-JXYKGLGB-wEhTG9mn.js} +1 -1
  103. package/dist/web/assets/{treeView-D4JQ5SDB-BKzsH1H3.js → treeView-D4JQ5SDB-J1xTBv_o.js} +1 -1
  104. package/dist/web/assets/{treemap-SAJKECNS-Dznq3JYy.js → treemap-SAJKECNS-B-HfL4ut.js} +1 -1
  105. package/dist/web/assets/{usecaseDiagram-WPOLBNNX-B_Qb6GIb.js → usecaseDiagram-WPOLBNNX-Bqvh0bcu.js} +1 -1
  106. package/dist/web/assets/{vennDiagram-Q3Y3IDCW-DDRYcnZj.js → vennDiagram-Q3Y3IDCW-B2TB6cEs.js} +1 -1
  107. package/dist/web/assets/{wardley-7MLQ67FV-CwCK5TZf.js → wardley-7MLQ67FV-BF1eXS8d.js} +1 -1
  108. package/dist/web/assets/{wardleyDiagram-IVAIDKWA-DW68fX4l.js → wardleyDiagram-IVAIDKWA-BZzFLzrU.js} +1 -1
  109. package/dist/web/assets/{xychartDiagram-4URNHDU4-Cdk5RxaR.js → xychartDiagram-4URNHDU4-Dh0JpuLV.js} +1 -1
  110. package/dist/web/index.html +2 -2
  111. package/dist/web/notification-worker.js +33 -0
  112. package/package.json +3 -3
  113. package/dist/web/assets/channel-kBOj6wNa.js +0 -1
  114. package/dist/web/assets/flowDiagram-IUGLLWBU-DnTlbOxw.js +0 -1
  115. package/dist/web/assets/swimlanesDiagram-AYQRV4AK-2cPOFNNL.js +0 -8
@@ -1,7 +1,7 @@
1
1
  import { npmPackageName } from "../shared/package.js";
2
2
  import { rename, rm } from "node:fs/promises";
3
3
  import { dirname, join } from "node:path";
4
- async function activateUpdate(paths, effects) {
4
+ async function activateUpdate(paths, effects, reuseTarget = false) {
5
5
  let stopped = false;
6
6
  let moved = false;
7
7
  let backedUp = false;
@@ -14,9 +14,12 @@ async function activateUpdate(paths, effects) {
14
14
  await effects.stop();
15
15
  await effects.backup();
16
16
  backedUp = true;
17
- await rename(paths.root, paths.previous);
18
- moved = true;
19
- await rename(paths.candidate, paths.root);
17
+ if (!reuseTarget) {
18
+ await rename(paths.root, paths.previous);
19
+ moved = true;
20
+ await rename(paths.candidate, paths.root);
21
+ }
22
+ await effects.switchLaunch?.();
20
23
  await effects.phase("verifying", "\u6B63\u5728\u542F\u52A8\u65B0\u7248\u3001\u8FC1\u79FB\u6570\u636E\u5E93\u5E76\u9A8C\u8BC1\uFF1B\u4E1A\u52A1\u5199\u5165\u4FDD\u6301\u6682\u505C");
21
24
  await effects.start(true);
22
25
  await effects.verify();
@@ -37,6 +40,7 @@ async function activateUpdate(paths, effects) {
37
40
  await rename(paths.previous, paths.root);
38
41
  }
39
42
  if (backedUp) await effects.restore();
43
+ await effects.restoreLaunch?.();
40
44
  await effects.phase(
41
45
  "rolledBack",
42
46
  `\u65B0\u7248\u542F\u52A8\u5931\u8D25\uFF0C\u5DF2\u6062\u590D\u65E7\u7248\uFF1A${error instanceof Error ? error.message : String(error)}`
@@ -1,7 +1,7 @@
1
1
  {
2
2
  "version": 3,
3
3
  "sources": ["../../src/updates/transaction.ts"],
4
- "sourcesContent": ["import { npmPackageName } from '../shared/package.js';\nimport { rename, rm } from 'node:fs/promises';\nimport { dirname, join } from 'node:path';\nimport type { UpdateRun } from '../shared/updates.js';\n\nexport interface TransactionPaths {\n root: string;\n prefix: string;\n candidate: string;\n previous: string;\n backup: string;\n dataDir: string;\n config: string;\n}\nexport interface UpdateEffects {\n waitForIdle(): Promise<void>;\n backup(): Promise<void>;\n restore(): Promise<void>;\n stop(): Promise<void>;\n start(candidate: boolean): Promise<void>;\n verify(): Promise<void>;\n commit(): Promise<void>;\n hasCommitted?(): Promise<boolean>;\n resume?(): Promise<void>;\n phase(phase: UpdateRun['phase'], message: string): Promise<void>;\n}\n/** Rollback is confined to admission: no new business writes are accepted before commit. */\nexport async function activateUpdate(paths: TransactionPaths, effects: UpdateEffects) {\n let stopped = false;\n let moved = false;\n let backedUp = false;\n let committed = false;\n try {\n await effects.phase('waiting', '\u5019\u9009\u5305\u5DF2\u51C6\u5907\u597D\uFF0C\u7B49\u5F85\u6240\u6709\u4EFB\u52A1\u3001\u5BA1\u6279\u4E0E\u5F85\u6838\u5BF9\u64CD\u4F5C\u7ED3\u675F');\n await effects.waitForIdle();\n await effects.phase('stopping', '\u5DF2\u5173\u95ED\u65B0\u4EFB\u52A1\u5165\u53E3\uFF0C\u6B63\u5728\u505C\u6B62\u65E7\u670D\u52A1\u5E76\u5907\u4EFD\u6570\u636E');\n // stop may fail after the process has already exited; recovery must restart the old service.\n stopped = true;\n await effects.stop();\n await effects.backup();\n backedUp = true;\n await rename(paths.root, paths.previous);\n moved = true;\n await rename(paths.candidate, paths.root);\n await effects.phase('verifying', '\u6B63\u5728\u542F\u52A8\u65B0\u7248\u3001\u8FC1\u79FB\u6570\u636E\u5E93\u5E76\u9A8C\u8BC1\uFF1B\u4E1A\u52A1\u5199\u5165\u4FDD\u6301\u6682\u505C');\n await effects.start(true);\n await effects.verify();\n await effects.commit();\n committed = true;\n // The new gateway persists the commit before admitting requests. Never restore its data later.\n return;\n } catch (error) {\n if (committed || (await effects.hasCommitted?.())) return;\n if (!stopped) {\n await effects.resume?.();\n await effects.phase('failed', error instanceof Error ? error.message : String(error));\n throw error;\n }\n try {\n await effects.stop();\n if (moved) {\n await rm(paths.root, { recursive: true, force: true });\n await rename(paths.previous, paths.root);\n }\n if (backedUp) await effects.restore();\n await effects.phase(\n 'rolledBack',\n `\u65B0\u7248\u542F\u52A8\u5931\u8D25\uFF0C\u5DF2\u6062\u590D\u65E7\u7248\uFF1A${error instanceof Error ? error.message : String(error)}`,\n );\n await effects.start(false);\n } catch (recovery) {\n await effects.phase(\n 'failed',\n `\u5347\u7EA7\u5931\u8D25\u4E14\u6062\u590D\u5C1A\u672A\u5B8C\u6210\uFF1B\u4FDD\u7559\u5907\u4EFD ${paths.backup}\u3002${String(error)}\uFF1B\u6062\u590D\uFF1A${String(recovery)}`,\n );\n throw recovery;\n }\n throw error;\n }\n}\n\nexport function transactionPaths(\n root: string,\n id: string,\n dataDir: string,\n config: string,\n backup: string,\n): TransactionPaths {\n const prefix = join(dirname(root), `.covro-stage-${id}`);\n return {\n root,\n prefix,\n candidate: join(\n prefix,\n process.platform === 'win32' ? 'node_modules' : 'lib/node_modules',\n npmPackageName,\n ),\n previous: join(dirname(root), `.covro-previous-${id}`),\n backup,\n dataDir,\n config,\n };\n}\n"],
5
- "mappings": "AAAA,SAAS,sBAAsB;AAC/B,SAAS,QAAQ,UAAU;AAC3B,SAAS,SAAS,YAAY;AAyB9B,eAAsB,eAAe,OAAyB,SAAwB;AACpF,MAAI,UAAU;AACd,MAAI,QAAQ;AACZ,MAAI,WAAW;AACf,MAAI,YAAY;AAChB,MAAI;AACF,UAAM,QAAQ,MAAM,WAAW,wJAA2B;AAC1D,UAAM,QAAQ,YAAY;AAC1B,UAAM,QAAQ,MAAM,YAAY,gIAAuB;AAEvD,cAAU;AACV,UAAM,QAAQ,KAAK;AACnB,UAAM,QAAQ,OAAO;AACrB,eAAW;AACX,UAAM,OAAO,MAAM,MAAM,MAAM,QAAQ;AACvC,YAAQ;AACR,UAAM,OAAO,MAAM,WAAW,MAAM,IAAI;AACxC,UAAM,QAAQ,MAAM,aAAa,kJAA0B;AAC3D,UAAM,QAAQ,MAAM,IAAI;AACxB,UAAM,QAAQ,OAAO;AACrB,UAAM,QAAQ,OAAO;AACrB,gBAAY;AAEZ;AAAA,EACF,SAAS,OAAO;AACd,QAAI,aAAc,MAAM,QAAQ,eAAe,EAAI;AACnD,QAAI,CAAC,SAAS;AACZ,YAAM,QAAQ,SAAS;AACvB,YAAM,QAAQ,MAAM,UAAU,iBAAiB,QAAQ,MAAM,UAAU,OAAO,KAAK,CAAC;AACpF,YAAM;AAAA,IACR;AACA,QAAI;AACF,YAAM,QAAQ,KAAK;AACnB,UAAI,OAAO;AACT,cAAM,GAAG,MAAM,MAAM,EAAE,WAAW,MAAM,OAAO,KAAK,CAAC;AACrD,cAAM,OAAO,MAAM,UAAU,MAAM,IAAI;AAAA,MACzC;AACA,UAAI,SAAU,OAAM,QAAQ,QAAQ;AACpC,YAAM,QAAQ;AAAA,QACZ;AAAA,QACA,iFAAgB,iBAAiB,QAAQ,MAAM,UAAU,OAAO,KAAK,CAAC;AAAA,MACxE;AACA,YAAM,QAAQ,MAAM,KAAK;AAAA,IAC3B,SAAS,UAAU;AACjB,YAAM,QAAQ;AAAA,QACZ;AAAA,QACA,oGAAoB,MAAM,MAAM,SAAI,OAAO,KAAK,CAAC,2BAAO,OAAO,QAAQ,CAAC;AAAA,MAC1E;AACA,YAAM;AAAA,IACR;AACA,UAAM;AAAA,EACR;AACF;AAEO,SAAS,iBACd,MACA,IACA,SACA,QACA,QACkB;AAClB,QAAM,SAAS,KAAK,QAAQ,IAAI,GAAG,gBAAgB,EAAE,EAAE;AACvD,SAAO;AAAA,IACL;AAAA,IACA;AAAA,IACA,WAAW;AAAA,MACT;AAAA,MACA,QAAQ,aAAa,UAAU,iBAAiB;AAAA,MAChD;AAAA,IACF;AAAA,IACA,UAAU,KAAK,QAAQ,IAAI,GAAG,mBAAmB,EAAE,EAAE;AAAA,IACrD;AAAA,IACA;AAAA,IACA;AAAA,EACF;AACF;",
4
+ "sourcesContent": ["import { npmPackageName } from '../shared/package.js';\nimport { rename, rm } from 'node:fs/promises';\nimport { dirname, join } from 'node:path';\nimport type { UpdateRun } from '../shared/updates.js';\n\nexport interface TransactionPaths {\n root: string;\n prefix: string;\n candidate: string;\n previous: string;\n backup: string;\n dataDir: string;\n config: string;\n}\nexport interface UpdateEffects {\n waitForIdle(): Promise<void>;\n backup(): Promise<void>;\n restore(): Promise<void>;\n stop(): Promise<void>;\n start(candidate: boolean): Promise<void>;\n verify(): Promise<void>;\n commit(): Promise<void>;\n hasCommitted?(): Promise<boolean>;\n resume?(): Promise<void>;\n phase(phase: UpdateRun['phase'], message: string): Promise<void>;\n switchLaunch?(): Promise<void>;\n restoreLaunch?(): Promise<void>;\n}\n/** Rollback is confined to admission: no new business writes are accepted before commit. */\nexport async function activateUpdate(\n paths: TransactionPaths,\n effects: UpdateEffects,\n reuseTarget = false,\n) {\n let stopped = false;\n let moved = false;\n let backedUp = false;\n let committed = false;\n try {\n await effects.phase('waiting', '\u5019\u9009\u5305\u5DF2\u51C6\u5907\u597D\uFF0C\u7B49\u5F85\u6240\u6709\u4EFB\u52A1\u3001\u5BA1\u6279\u4E0E\u5F85\u6838\u5BF9\u64CD\u4F5C\u7ED3\u675F');\n await effects.waitForIdle();\n await effects.phase('stopping', '\u5DF2\u5173\u95ED\u65B0\u4EFB\u52A1\u5165\u53E3\uFF0C\u6B63\u5728\u505C\u6B62\u65E7\u670D\u52A1\u5E76\u5907\u4EFD\u6570\u636E');\n // stop may fail after the process has already exited; recovery must restart the old service.\n stopped = true;\n await effects.stop();\n await effects.backup();\n backedUp = true;\n if (!reuseTarget) {\n await rename(paths.root, paths.previous);\n moved = true;\n await rename(paths.candidate, paths.root);\n }\n await effects.switchLaunch?.();\n await effects.phase('verifying', '\u6B63\u5728\u542F\u52A8\u65B0\u7248\u3001\u8FC1\u79FB\u6570\u636E\u5E93\u5E76\u9A8C\u8BC1\uFF1B\u4E1A\u52A1\u5199\u5165\u4FDD\u6301\u6682\u505C');\n await effects.start(true);\n await effects.verify();\n await effects.commit();\n committed = true;\n // The new gateway persists the commit before admitting requests. Never restore its data later.\n return;\n } catch (error) {\n if (committed || (await effects.hasCommitted?.())) return;\n if (!stopped) {\n await effects.resume?.();\n await effects.phase('failed', error instanceof Error ? error.message : String(error));\n throw error;\n }\n try {\n await effects.stop();\n if (moved) {\n await rm(paths.root, { recursive: true, force: true });\n await rename(paths.previous, paths.root);\n }\n if (backedUp) await effects.restore();\n await effects.restoreLaunch?.();\n await effects.phase(\n 'rolledBack',\n `\u65B0\u7248\u542F\u52A8\u5931\u8D25\uFF0C\u5DF2\u6062\u590D\u65E7\u7248\uFF1A${error instanceof Error ? error.message : String(error)}`,\n );\n await effects.start(false);\n } catch (recovery) {\n await effects.phase(\n 'failed',\n `\u5347\u7EA7\u5931\u8D25\u4E14\u6062\u590D\u5C1A\u672A\u5B8C\u6210\uFF1B\u4FDD\u7559\u5907\u4EFD ${paths.backup}\u3002${String(error)}\uFF1B\u6062\u590D\uFF1A${String(recovery)}`,\n );\n throw recovery;\n }\n throw error;\n }\n}\n\nexport function transactionPaths(\n root: string,\n id: string,\n dataDir: string,\n config: string,\n backup: string,\n): TransactionPaths {\n const prefix = join(dirname(root), `.covro-stage-${id}`);\n return {\n root,\n prefix,\n candidate: join(\n prefix,\n process.platform === 'win32' ? 'node_modules' : 'lib/node_modules',\n npmPackageName,\n ),\n previous: join(dirname(root), `.covro-previous-${id}`),\n backup,\n dataDir,\n config,\n };\n}\n"],
5
+ "mappings": "AAAA,SAAS,sBAAsB;AAC/B,SAAS,QAAQ,UAAU;AAC3B,SAAS,SAAS,YAAY;AA2B9B,eAAsB,eACpB,OACA,SACA,cAAc,OACd;AACA,MAAI,UAAU;AACd,MAAI,QAAQ;AACZ,MAAI,WAAW;AACf,MAAI,YAAY;AAChB,MAAI;AACF,UAAM,QAAQ,MAAM,WAAW,wJAA2B;AAC1D,UAAM,QAAQ,YAAY;AAC1B,UAAM,QAAQ,MAAM,YAAY,gIAAuB;AAEvD,cAAU;AACV,UAAM,QAAQ,KAAK;AACnB,UAAM,QAAQ,OAAO;AACrB,eAAW;AACX,QAAI,CAAC,aAAa;AAChB,YAAM,OAAO,MAAM,MAAM,MAAM,QAAQ;AACvC,cAAQ;AACR,YAAM,OAAO,MAAM,WAAW,MAAM,IAAI;AAAA,IAC1C;AACA,UAAM,QAAQ,eAAe;AAC7B,UAAM,QAAQ,MAAM,aAAa,kJAA0B;AAC3D,UAAM,QAAQ,MAAM,IAAI;AACxB,UAAM,QAAQ,OAAO;AACrB,UAAM,QAAQ,OAAO;AACrB,gBAAY;AAEZ;AAAA,EACF,SAAS,OAAO;AACd,QAAI,aAAc,MAAM,QAAQ,eAAe,EAAI;AACnD,QAAI,CAAC,SAAS;AACZ,YAAM,QAAQ,SAAS;AACvB,YAAM,QAAQ,MAAM,UAAU,iBAAiB,QAAQ,MAAM,UAAU,OAAO,KAAK,CAAC;AACpF,YAAM;AAAA,IACR;AACA,QAAI;AACF,YAAM,QAAQ,KAAK;AACnB,UAAI,OAAO;AACT,cAAM,GAAG,MAAM,MAAM,EAAE,WAAW,MAAM,OAAO,KAAK,CAAC;AACrD,cAAM,OAAO,MAAM,UAAU,MAAM,IAAI;AAAA,MACzC;AACA,UAAI,SAAU,OAAM,QAAQ,QAAQ;AACpC,YAAM,QAAQ,gBAAgB;AAC9B,YAAM,QAAQ;AAAA,QACZ;AAAA,QACA,iFAAgB,iBAAiB,QAAQ,MAAM,UAAU,OAAO,KAAK,CAAC;AAAA,MACxE;AACA,YAAM,QAAQ,MAAM,KAAK;AAAA,IAC3B,SAAS,UAAU;AACjB,YAAM,QAAQ;AAAA,QACZ;AAAA,QACA,oGAAoB,MAAM,MAAM,SAAI,OAAO,KAAK,CAAC,2BAAO,OAAO,QAAQ,CAAC;AAAA,MAC1E;AACA,YAAM;AAAA,IACR;AACA,UAAM;AAAA,EACR;AACF;AAEO,SAAS,iBACd,MACA,IACA,SACA,QACA,QACkB;AAClB,QAAM,SAAS,KAAK,QAAQ,IAAI,GAAG,gBAAgB,EAAE,EAAE;AACvD,SAAO;AAAA,IACL;AAAA,IACA;AAAA,IACA,WAAW;AAAA,MACT;AAAA,MACA,QAAQ,aAAa,UAAU,iBAAiB;AAAA,MAChD;AAAA,IACF;AAAA,IACA,UAAU,KAAK,QAAQ,IAAI,GAAG,mBAAmB,EAAE,EAAE;AAAA,IACrD;AAAA,IACA;AAAA,IACA;AAAA,EACF;AACF;",
6
6
  "names": []
7
7
  }
@@ -21,10 +21,26 @@ import { startBackground, stopBackground } from "../cli/background.js";
21
21
  import { copyDurable, readJson, saveJson } from "./files.js";
22
22
  import { activateUpdate, transactionPaths } from "./transaction.js";
23
23
  import { inspectInstallation, registry } from "./registry.js";
24
+ import {
25
+ assertRuntime,
26
+ resolveRuntimeTarget,
27
+ targetNpmEnvironment,
28
+ verifyRuntimeExecutable
29
+ } from "./runtime.js";
30
+ import {
31
+ snapshotLaunch,
32
+ switchLaunch,
33
+ restoreLaunch
34
+ } from "../cli/runtime-launch.js";
24
35
  const exec = promisify(execFile);
25
36
  const message = (error) => error instanceof Error ? error.message : String(error);
26
- async function startService(context) {
27
- await startBackground(context.location, join(context.root, "bin/covro.mjs"));
37
+ async function startService(context, candidate = false) {
38
+ const target = candidate ? context.target : void 0;
39
+ await startBackground(
40
+ context.location,
41
+ join(context.root, "bin/covro.mjs"),
42
+ target ? { node: target.node, entry: target.entry, path: target.path } : context.source
43
+ );
28
44
  }
29
45
  async function stopService(context) {
30
46
  await stopBackground(context.location);
@@ -35,6 +51,8 @@ async function verifyRestoredService(context, version) {
35
51
  const restored = await control(context.location, "status");
36
52
  if (restored.version !== version || restored.maintenance)
37
53
  throw new Error("\u65E7\u7248\u6062\u590D\u8EAB\u4EFD\u4E0D\u5339\u914D");
54
+ const record = await readJson(join(context.directory, "run.json"));
55
+ if (record?.runtime) assertRuntime(restored.runtime, record.runtime.from);
38
56
  return;
39
57
  } catch (error) {
40
58
  if (attempt === 239) throw error;
@@ -84,7 +102,7 @@ async function worker(directory) {
84
102
  await saveJson(join(directory, "run.json"), record);
85
103
  };
86
104
  const paths = transactionPaths(
87
- context.root,
105
+ context.target?.root ?? context.root,
88
106
  record.id,
89
107
  context.dataDir,
90
108
  context.location.config,
@@ -92,32 +110,34 @@ async function worker(directory) {
92
110
  );
93
111
  let releaseMaintenance;
94
112
  let releaseData;
95
- const previousMetadata = await readJson(
96
- join(paths.previous, "package.json")
97
- );
98
- const originalRoot = previousMetadata?.version === record.from ? paths.previous : context.root;
99
- const originalMetadata = await readJson(join(originalRoot, "package.json"));
100
- const Sqlite = createRequire(join(originalRoot, "package.json"))(
101
- "better-sqlite3"
102
- );
103
- const migrations = readMigrations(join(originalRoot, "dist/drizzle"));
104
- const backups = new BackupStore({
105
- directory: backupDirectory(context.location.home, context.dataDir),
106
- config: paths.config,
107
- dataDir: paths.dataDir,
108
- appVersion: record.from,
109
- commit: originalMetadata?.covroCommit,
110
- contract: databaseCompatibilitySchema.parse(
111
- originalMetadata?.covroDatabase ?? {
112
- schemaVersion: migrations.length,
113
- minRestorableSchemaVersion: 1,
114
- backupFormatVersion: 1
115
- }
116
- ),
117
- Sqlite,
118
- migrations
119
- });
120
113
  try {
114
+ if (record.runtime) await verifyRuntimeExecutable(record.runtime.from);
115
+ const previousMetadata = await readJson(
116
+ join(paths.previous, "package.json")
117
+ );
118
+ const sameRoot = paths.root.replace(/\/$/, "") === context.root.replace(/\/$/, "");
119
+ const originalRoot = sameRoot && previousMetadata?.version === record.from ? paths.previous : context.root;
120
+ const originalMetadata = await readJson(join(originalRoot, "package.json"));
121
+ const Sqlite = createRequire(join(originalRoot, "package.json"))(
122
+ "better-sqlite3"
123
+ );
124
+ const migrations = readMigrations(join(originalRoot, "dist/drizzle"));
125
+ const backups = new BackupStore({
126
+ directory: backupDirectory(context.location.home, context.dataDir),
127
+ config: paths.config,
128
+ dataDir: paths.dataDir,
129
+ appVersion: record.from,
130
+ commit: originalMetadata?.covroCommit,
131
+ contract: databaseCompatibilitySchema.parse(
132
+ originalMetadata?.covroDatabase ?? {
133
+ schemaVersion: migrations.length,
134
+ minRestorableSchemaVersion: 1,
135
+ backupFormatVersion: 1
136
+ }
137
+ ),
138
+ Sqlite,
139
+ migrations
140
+ });
121
141
  if (process.argv[3] === "--repair") {
122
142
  releaseMaintenance = await acquireMaintenanceLock(context.dataDir);
123
143
  if (!await readJson(join(paths.backup, "snapshot.json")))
@@ -134,10 +154,10 @@ async function worker(directory) {
134
154
  const previous = await readJson(
135
155
  join(paths.previous, "package.json")
136
156
  );
137
- if (previous) {
157
+ if (previous || context.reuseTarget) {
138
158
  if (active && !active.maintenance)
139
159
  throw new Error("\u65E7\u670D\u52A1\u5DF2\u6062\u590D\u4E1A\u52A1\u5199\u5165\uFF1B\u62D2\u7EDD\u7528\u5347\u7EA7\u524D\u5FEB\u7167\u8986\u76D6\u73B0\u6709\u6570\u636E\uFF0C\u8BF7\u4FDD\u7559\u73B0\u573A\u68C0\u67E5\u3002");
140
- if (previous.name !== npmPackageName || previous.version !== record.from)
160
+ if (previous && (previous.name !== npmPackageName || previous.version !== (context.target?.version ?? record.from)))
141
161
  throw new Error("\u65E7\u7248\u5907\u4EFD\u8EAB\u4EFD\u4E0D\u5339\u914D");
142
162
  const snapshot = await readJson(
143
163
  join(paths.backup, "snapshot.json")
@@ -147,7 +167,7 @@ async function worker(directory) {
147
167
  if (verified.appVersion !== record.from || verified.protectedBy !== record.id || verified.configPath !== paths.config || verified.dataDir !== paths.dataDir)
148
168
  throw new Error("\u5907\u4EFD\u8EAB\u4EFD\u4E0D\u5339\u914D");
149
169
  } else await verifyLegacySnapshot(paths.backup, Sqlite, join(originalRoot, "dist/drizzle"));
150
- } else {
170
+ } else if (sameRoot) {
151
171
  const original = await readJson(
152
172
  join(paths.root, "package.json")
153
173
  );
@@ -163,6 +183,8 @@ async function worker(directory) {
163
183
  if (previous) {
164
184
  await rm(paths.root, { recursive: true, force: true });
165
185
  await rename(paths.previous, paths.root);
186
+ }
187
+ if (previous || context.reuseTarget) {
166
188
  for (const name of ["app.sqlite", "app.sqlite-wal", "app.sqlite-shm"]) {
167
189
  await rm(join(paths.dataDir, name), { force: true });
168
190
  try {
@@ -173,8 +195,10 @@ async function worker(directory) {
173
195
  }
174
196
  await copyDurable(join(paths.backup, "config.json"), paths.config);
175
197
  }
198
+ const launch2 = await readJson(join(directory, `launch-${record.id}.json`));
199
+ if (launch2) await restoreLaunch(context.location, launch2);
176
200
  const restored = await readJson(
177
- join(paths.root, "package.json")
201
+ join(context.root, "package.json")
178
202
  );
179
203
  if (restored?.name !== npmPackageName || restored.version !== record.from)
180
204
  throw new Error("\u672A\u627E\u5230\u5B8C\u6574\u7684\u4E0A\u4E00\u7248\u672C\u5B89\u88C5");
@@ -198,7 +222,8 @@ async function worker(directory) {
198
222
  const instance = await readJson(
199
223
  join(context.location.home, "instances", key, "instance.json")
200
224
  );
201
- if (instance?.root !== context.root) continue;
225
+ if (!instance || ![context.root.replace(/\/$/, ""), paths.root].includes(instance.root.replace(/\/$/, "")))
226
+ continue;
202
227
  try {
203
228
  await control({ ...context.location, socket: instance.socket }, "status");
204
229
  throw new Error("\u540C\u4E00 npm \u5B89\u88C5\u8FD8\u6709\u5176\u4ED6 Covro \u5B9E\u4F8B\uFF0C\u8BF7\u5148\u505C\u6B62\u5176\u4ED6\u5B9E\u4F8B\u518D\u5347\u7EA7\u3002");
@@ -207,23 +232,38 @@ async function worker(directory) {
207
232
  }
208
233
  }
209
234
  await access(dirname(context.root), constants.W_OK);
210
- await exec(
211
- "npm",
212
- [
213
- "install",
214
- "--global",
215
- "--prefix",
216
- paths.prefix,
217
- "--omit=dev",
218
- "--no-audit",
219
- "--no-fund",
220
- `--registry=${registry}`,
221
- "--allow-scripts=better-sqlite3",
222
- `${npmPackageName}@${record.target}`
223
- ],
224
- { timeout: 10 * 6e4, maxBuffer: 2 * 1024 * 1024 }
235
+ await access(dirname(paths.root), constants.W_OK);
236
+ if (context.target) {
237
+ const target = await resolveRuntimeTarget();
238
+ assertRuntime(target, context.target);
239
+ if (target.npm !== context.target.npm || target.npmVersion !== context.target.npmVersion || target.prefix !== context.target.prefix || target.path !== context.target.path || target.version !== context.target.version)
240
+ throw new Error("\u76EE\u6807 Node/npm \u73AF\u5883\u5728\u68C0\u67E5\u540E\u53D8\u5316\uFF0C\u8BF7\u91CD\u65B0\u68C0\u67E5\u66F4\u65B0\u3002");
241
+ }
242
+ const candidateRoot = context.reuseTarget ? paths.root : paths.candidate;
243
+ const node = context.target?.node ?? process.execPath;
244
+ const env = targetNpmEnvironment(
245
+ context.target?.path ?? process.env.PATH ?? "/usr/bin:/bin",
246
+ context.target?.npmConfig
225
247
  );
226
- const candidate = await readJson(join(paths.candidate, "package.json"));
248
+ if (!context.reuseTarget)
249
+ await exec(
250
+ context.target?.node ?? "npm",
251
+ [
252
+ ...context.target ? [context.target.npm] : [],
253
+ "install",
254
+ "--global",
255
+ "--prefix",
256
+ paths.prefix,
257
+ "--omit=dev",
258
+ "--no-audit",
259
+ "--no-fund",
260
+ `--registry=${registry}`,
261
+ "--allow-scripts=better-sqlite3",
262
+ `${npmPackageName}@${record.target}`
263
+ ],
264
+ { env, timeout: 10 * 6e4, maxBuffer: 2 * 1024 * 1024 }
265
+ );
266
+ const candidate = await readJson(join(candidateRoot, "package.json"));
227
267
  if (candidate?.name !== npmPackageName || candidate.version !== record.target)
228
268
  throw new Error("\u5019\u9009\u5305\u8EAB\u4EFD\u6216\u7248\u672C\u4E0D\u5339\u914D");
229
269
  if (record.commit && (candidate.covroCommit ?? candidate.gitHead) !== record.commit)
@@ -243,79 +283,104 @@ async function worker(directory) {
243
283
  );
244
284
  };
245
285
  await checkCodex();
246
- await exec(process.execPath, [join(paths.candidate, "bin/covro.mjs"), "--version"], {
247
- timeout: 3e4
286
+ const versionProbe = await exec(node, [join(candidateRoot, "bin/covro.mjs"), "--version"], {
287
+ timeout: 3e4,
288
+ env
248
289
  });
290
+ if (versionProbe.stdout.trim() !== record.target)
291
+ throw new Error("\u76EE\u6807 Node \u6267\u884C Covro \u5165\u53E3\u540E\u8FD4\u56DE\u7684\u7248\u672C\u4E0D\u5339\u914D");
249
292
  const nativeProbe = 'const {createRequire}=await import("node:module"); const r=createRequire(process.argv[1]); const DB=r("better-sqlite3"); const db=new DB(":memory:"); db.close();';
250
293
  await exec(
251
- process.execPath,
252
- ["--input-type=module", "-e", nativeProbe, join(paths.candidate, "package.json")],
253
- { timeout: 3e4 }
294
+ node,
295
+ ["--input-type=module", "-e", nativeProbe, join(candidateRoot, "package.json")],
296
+ { env, timeout: 3e4 }
297
+ );
298
+ await verifyMigrations(context, candidateRoot);
299
+ const launch = await snapshotLaunch(
300
+ context.location,
301
+ context.source ?? {
302
+ node: process.execPath,
303
+ entry: join(context.root, "bin/covro.mjs"),
304
+ path: process.env.PATH ?? "/usr/bin:/bin"
305
+ }
254
306
  );
255
- await verifyMigrations(context, paths.candidate);
307
+ if (context.target)
308
+ launch.target = { node, entry: context.target.entry, path: context.target.path };
309
+ await saveJson(join(directory, `launch-${record.id}.json`), launch);
256
310
  releaseMaintenance = await acquireMaintenanceLock(context.dataDir);
257
- await activateUpdate(paths, {
258
- backup: async () => {
259
- releaseData = await acquireInstanceLock(context.dataDir);
260
- await backups.create({ id: record.id, trigger: "preUpgrade", protectedBy: record.id });
261
- },
262
- restore: async () => {
263
- releaseData ??= await acquireInstanceLock(context.dataDir);
264
- await backups.restoreFiles(record.id);
265
- },
266
- phase: update,
267
- waitForIdle: async () => {
268
- for (; ; ) {
269
- await checkCodex();
270
- const result = await control(
271
- context.location,
272
- "prepare-update"
273
- );
274
- if (result.ready) {
311
+ await activateUpdate(
312
+ paths,
313
+ {
314
+ backup: async () => {
315
+ releaseData = await acquireInstanceLock(context.dataDir);
316
+ await backups.create({ id: record.id, trigger: "preUpgrade", protectedBy: record.id });
317
+ },
318
+ restore: async () => {
319
+ releaseData ??= await acquireInstanceLock(context.dataDir);
320
+ await backups.restoreFiles(record.id);
321
+ },
322
+ switchLaunch: context.target ? () => switchLaunch(
323
+ context.location,
324
+ { node, entry: context.target.entry, path: context.target.path },
325
+ launch
326
+ ) : void 0,
327
+ restoreLaunch: () => restoreLaunch(context.location, launch),
328
+ phase: update,
329
+ waitForIdle: async () => {
330
+ for (; ; ) {
275
331
  await checkCodex();
276
- return;
332
+ const result = await control(
333
+ context.location,
334
+ "prepare-update"
335
+ );
336
+ if (result.ready) {
337
+ await checkCodex();
338
+ return;
339
+ }
340
+ await update("waiting", result.reason ?? "\u7B49\u5F85\u6240\u6709\u4EFB\u52A1\u7ED3\u675F");
341
+ await setTimeout(2e3);
277
342
  }
278
- await update("waiting", result.reason ?? "\u7B49\u5F85\u6240\u6709\u4EFB\u52A1\u7ED3\u675F");
279
- await setTimeout(2e3);
280
- }
281
- },
282
- stop: () => stopService(context),
283
- start: async (candidate2) => {
284
- await releaseData?.();
285
- releaseData = void 0;
286
- await startService(context);
287
- if (!candidate2) await verifyRestoredService(context, record.from);
288
- },
289
- verify: async () => {
290
- for (let attempt = 0; attempt < 240; attempt++) {
291
- const current = await control(context.location, "status").catch(
292
- () => void 0
293
- );
294
- if (current) {
295
- if (current.version !== record.target || !current.maintenance)
296
- throw new Error("\u65B0\u7248\u670D\u52A1\u8EAB\u4EFD\u6216\u7EF4\u62A4\u72B6\u6001\u4E0D\u5339\u914D");
297
- await checkCodex(current);
298
- if (current.codexReady) return;
343
+ },
344
+ stop: () => stopService(context),
345
+ start: async (candidate2) => {
346
+ await releaseData?.();
347
+ releaseData = void 0;
348
+ await startService(context, candidate2);
349
+ if (!candidate2) await verifyRestoredService(context, record.from);
350
+ },
351
+ verify: async () => {
352
+ for (let attempt = 0; attempt < 240; attempt++) {
353
+ const current = await control(context.location, "status").catch(
354
+ () => void 0
355
+ );
356
+ if (current) {
357
+ if (current.version !== record.target || !current.maintenance)
358
+ throw new Error("\u65B0\u7248\u670D\u52A1\u8EAB\u4EFD\u6216\u7EF4\u62A4\u72B6\u6001\u4E0D\u5339\u914D");
359
+ if (record.runtime) assertRuntime(current.runtime, record.runtime.target);
360
+ await checkCodex(current);
361
+ if (current.codexReady) return;
362
+ }
363
+ await setTimeout(250);
299
364
  }
300
- await setTimeout(250);
365
+ throw new Error("\u65B0\u7248\u670D\u52A1\u6216 Codex \u8FDE\u63A5\u672A\u5C31\u7EEA\uFF0C\u62D2\u7EDD\u6FC0\u6D3B");
366
+ },
367
+ commit: async () => {
368
+ await control(context.location, "activate-update", {
369
+ id: record.id,
370
+ channel: record.channel
371
+ });
372
+ const final = await readJson(join(directory, "run.json"));
373
+ if (!final?.committed) throw new Error("\u65B0\u7248\u5C1A\u672A\u786E\u8BA4\u5347\u7EA7\u63D0\u4EA4");
374
+ record = final;
375
+ },
376
+ hasCommitted: async () => Boolean((await readJson(join(directory, "run.json")))?.committed),
377
+ resume: async () => {
378
+ await control(context.location, "cancel-update").catch(() => {
379
+ });
301
380
  }
302
- throw new Error("\u65B0\u7248\u670D\u52A1\u6216 Codex \u8FDE\u63A5\u672A\u5C31\u7EEA\uFF0C\u62D2\u7EDD\u6FC0\u6D3B");
303
- },
304
- commit: async () => {
305
- await control(context.location, "activate-update", {
306
- id: record.id,
307
- channel: record.channel
308
- });
309
- const final = await readJson(join(directory, "run.json"));
310
- if (!final?.committed) throw new Error("\u65B0\u7248\u5C1A\u672A\u786E\u8BA4\u5347\u7EA7\u63D0\u4EA4");
311
- record = final;
312
381
  },
313
- hasCommitted: async () => Boolean((await readJson(join(directory, "run.json")))?.committed),
314
- resume: async () => {
315
- await control(context.location, "cancel-update").catch(() => {
316
- });
317
- }
318
- });
382
+ context.reuseTarget
383
+ );
319
384
  } catch (error) {
320
385
  const latest = await readJson(join(directory, "run.json"));
321
386
  if (latest?.committed) {
@@ -1,7 +1,7 @@
1
1
  {
2
2
  "version": 3,
3
3
  "sources": ["../../src/updates/worker.ts"],
4
- "sourcesContent": ["import { BackupStore, backupDirectory, verifyLegacySnapshot } from '../backups/store.js';\nimport { acquireMaintenanceLock } from '../backups/lock.js';\nimport { acquireInstanceLock } from '../server/instance-lock.js';\nimport { inspectDatabase, readMigrations } from '../server/db/history.js';\nimport { databaseCompatibilitySchema } from '../shared/database.js';\nimport { npmPackageName } from '../shared/package.js';\nimport {\n codexCompatibilitySchema,\n requireCodexCompatibility,\n} from '../shared/codex-compatibility.js';\n// Bundled with its pure JavaScript dependencies and copied outside the installation before launch.\nimport { execFile } from 'node:child_process';\nimport { promisify } from 'node:util';\nimport { createRequire } from 'node:module';\nimport { access, mkdir, readdir, rm, rename } from 'node:fs/promises';\nimport { constants } from 'node:fs';\nimport { dirname, join } from 'node:path';\nimport { setTimeout } from 'node:timers/promises';\nimport lockfile from 'proper-lockfile';\nimport type Database from 'better-sqlite3';\nimport type { UpdateRun } from '../shared/updates.js';\nimport type { UpdateContext } from './manager.js';\nimport { control, isNotRunning } from '../cli/control.js';\nimport { startBackground, stopBackground } from '../cli/background.js';\nimport { copyDurable, readJson, saveJson } from './files.js';\nimport { activateUpdate, transactionPaths } from './transaction.js';\nimport { inspectInstallation, registry } from './registry.js';\n\nconst exec = promisify(execFile);\nconst message = (error: unknown) => (error instanceof Error ? error.message : String(error));\ntype DaemonStatus = {\n version: string;\n pid: number;\n maintenance?: boolean;\n codexVersion?: string | null;\n codexReady?: boolean;\n};\n\nasync function startService(context: UpdateContext) {\n // Shared with `covro start`: never inherit a Background security session on macOS.\n // Activation is checked from the durable update record by the daemon.\n await startBackground(context.location, join(context.root, 'bin/covro.mjs'));\n}\nasync function stopService(context: UpdateContext) {\n await stopBackground(context.location);\n}\n\nasync function verifyRestoredService(context: UpdateContext, version: string) {\n for (let attempt = 0; attempt < 240; attempt++) {\n try {\n const restored = await control<DaemonStatus>(context.location, 'status');\n if (restored.version !== version || restored.maintenance)\n throw new Error('\u65E7\u7248\u6062\u590D\u8EAB\u4EFD\u4E0D\u5339\u914D');\n return;\n } catch (error) {\n if (attempt === 239) throw error;\n }\n await setTimeout(250);\n }\n}\n\nasync function verifyMigrations(context: UpdateContext, candidate: string) {\n // Loading the existing native addon happens before any package path is replaced.\n const require = createRequire(join(context.root, 'package.json'));\n const Sqlite = require('better-sqlite3') as typeof Database;\n const filename = join(context.dataDir, 'app.sqlite');\n try {\n await access(filename);\n } catch (error) {\n if ((error as NodeJS.ErrnoException).code === 'ENOENT') return;\n throw error;\n }\n const db = new Sqlite(filename, { readonly: true, fileMustExist: true });\n try {\n const migrations = readMigrations(join(candidate, 'dist/drizzle'));\n const metadata = await readJson<{ covroDatabase?: unknown }>(join(candidate, 'package.json'));\n if (metadata?.covroDatabase) {\n const contract = databaseCompatibilitySchema.parse(metadata.covroDatabase);\n if (contract.schemaVersion !== migrations.length)\n throw new Error('\u76EE\u6807\u7248\u672C\u7684 Schema \u58F0\u660E\u4E0E\u8FC1\u79FB\u4E0D\u4E00\u81F4');\n }\n inspectDatabase(db, migrations);\n } finally {\n db.close();\n }\n}\n\nasync function worker(directory: string) {\n await mkdir(directory, { recursive: true, mode: 0o700 });\n const release = await lockfile.lock(directory, {\n stale: 10_000,\n update: 2_000,\n retries: { retries: 30, minTimeout: 100, maxTimeout: 500 },\n });\n let record = await readJson<UpdateRun>(join(directory, 'run.json'));\n const context = await readJson<UpdateContext>(join(directory, 'context.json'));\n if (!record || !context) {\n await release();\n throw new Error('\u7F3A\u5C11\u5347\u7EA7\u8BB0\u5F55');\n }\n const update = async (phase: UpdateRun['phase'], detail: string) => {\n record = { ...record!, phase, message: detail, updatedAt: Date.now() };\n await saveJson(join(directory, 'run.json'), record);\n };\n const paths = transactionPaths(\n context.root,\n record.id,\n context.dataDir,\n context.location.config,\n join(backupDirectory(context.location.home, context.dataDir), record.id),\n );\n let releaseMaintenance: (() => Promise<void>) | undefined;\n let releaseData: (() => Promise<void>) | undefined;\n const previousMetadata = await readJson<{ version: string }>(\n join(paths.previous, 'package.json'),\n );\n const originalRoot = previousMetadata?.version === record.from ? paths.previous : context.root;\n const originalMetadata = await readJson<{\n version: string;\n covroCommit?: string;\n covroDatabase?: unknown;\n }>(join(originalRoot, 'package.json'));\n const Sqlite = createRequire(join(originalRoot, 'package.json'))(\n 'better-sqlite3',\n ) as typeof Database;\n const migrations = readMigrations(join(originalRoot, 'dist/drizzle'));\n const backups = new BackupStore({\n directory: backupDirectory(context.location.home, context.dataDir),\n config: paths.config,\n dataDir: paths.dataDir,\n appVersion: record.from,\n commit: originalMetadata?.covroCommit,\n contract: databaseCompatibilitySchema.parse(\n originalMetadata?.covroDatabase ?? {\n schemaVersion: migrations.length,\n minRestorableSchemaVersion: 1,\n backupFormatVersion: 1,\n },\n ),\n Sqlite,\n migrations,\n });\n try {\n if (process.argv[3] === '--repair') {\n releaseMaintenance = await acquireMaintenanceLock(context.dataDir);\n if (!(await readJson(join(paths.backup, 'snapshot.json'))))\n paths.backup = join(directory, `backup-${record.id}`);\n const active = await control<DaemonStatus>(context.location, 'status').catch(\n (error: unknown) => {\n if (isNotRunning(error)) return undefined;\n throw error;\n },\n );\n if (record.committed) return;\n if (active && !active.maintenance && active.version !== record.from)\n throw new Error('\u5F53\u524D\u670D\u52A1\u53EF\u80FD\u5DF2\u63A5\u53D7\u65B0\u7248\u4E1A\u52A1\u6570\u636E\uFF1B\u62D2\u7EDD\u6062\u590D\u65E7\u5FEB\u7167\uFF0C\u8BF7\u4F7F\u7528\u517C\u5BB9\u7248\u672C\u68C0\u67E5\u3002');\n const previous = await readJson<{ version: string; name: string }>(\n join(paths.previous, 'package.json'),\n );\n if (previous) {\n if (active && !active.maintenance)\n throw new Error('\u65E7\u670D\u52A1\u5DF2\u6062\u590D\u4E1A\u52A1\u5199\u5165\uFF1B\u62D2\u7EDD\u7528\u5347\u7EA7\u524D\u5FEB\u7167\u8986\u76D6\u73B0\u6709\u6570\u636E\uFF0C\u8BF7\u4FDD\u7559\u73B0\u573A\u68C0\u67E5\u3002');\n if (previous.name !== npmPackageName || previous.version !== record.from)\n throw new Error('\u65E7\u7248\u5907\u4EFD\u8EAB\u4EFD\u4E0D\u5339\u914D');\n const snapshot = await readJson<{ complete: boolean; formatVersion?: number }>(\n join(paths.backup, 'snapshot.json'),\n );\n if (snapshot?.formatVersion === 1) {\n const verified = await backups.verify(record.id);\n if (\n verified.appVersion !== record.from ||\n verified.protectedBy !== record.id ||\n verified.configPath !== paths.config ||\n verified.dataDir !== paths.dataDir\n )\n throw new Error('\u5907\u4EFD\u8EAB\u4EFD\u4E0D\u5339\u914D');\n } else await verifyLegacySnapshot(paths.backup, Sqlite, join(originalRoot, 'dist/drizzle'));\n } else {\n const original = await readJson<{ name: string; version: string }>(\n join(paths.root, 'package.json'),\n );\n if (original?.name !== npmPackageName || original.version !== record.from)\n throw new Error('\u672A\u627E\u5230\u5B8C\u6574\u7684\u4E0A\u4E00\u7248\u672C\u5B89\u88C5');\n }\n if (active && !active.maintenance) {\n const admission = await control<{ ready: boolean }>(context.location, 'prepare-update');\n if (!admission.ready) throw new Error('\u4ECD\u6709\u4EFB\u52A1\u3001\u5BA1\u6279\u6216\u5F85\u6838\u5BF9\u64CD\u4F5C\uFF0C\u4E0D\u80FD\u6062\u590D\u65E7\u5B89\u88C5');\n }\n await stopService(context);\n releaseData = await acquireInstanceLock(context.dataDir);\n if (previous) {\n await rm(paths.root, { recursive: true, force: true });\n await rename(paths.previous, paths.root);\n for (const name of ['app.sqlite', 'app.sqlite-wal', 'app.sqlite-shm']) {\n await rm(join(paths.dataDir, name), { force: true });\n try {\n await copyDurable(join(paths.backup, name), join(paths.dataDir, name));\n } catch (error) {\n if ((error as NodeJS.ErrnoException).code !== 'ENOENT') throw error;\n }\n }\n await copyDurable(join(paths.backup, 'config.json'), paths.config);\n }\n const restored = await readJson<{ name: string; version: string }>(\n join(paths.root, 'package.json'),\n );\n if (restored?.name !== npmPackageName || restored.version !== record.from)\n throw new Error('\u672A\u627E\u5230\u5B8C\u6574\u7684\u4E0A\u4E00\u7248\u672C\u5B89\u88C5');\n await update('rolledBack', '\u5DF2\u6062\u590D\u4E0A\u6B21\u672A\u5B8C\u6210\u7684\u5347\u7EA7\uFF0C\u6B63\u5728\u542F\u52A8\u4E0A\u4E00\u7248\u672C');\n try {\n await releaseData?.();\n releaseData = undefined;\n await startService(context);\n await verifyRestoredService(context, record.from);\n await update('rolledBack', '\u5DF2\u6062\u590D\u4E0A\u6B21\u672A\u5B8C\u6210\u7684\u5347\u7EA7\uFF0C\u4E0A\u4E00\u7248\u672C\u5DF2\u5C31\u7EEA');\n } catch (error) {\n await update('failed', `\u65E7\u7248\u6062\u590D\u542F\u52A8\u5931\u8D25\uFF0C\u4FDD\u7559\u5907\u4EFD\uFF1A${message(error)}`);\n throw error;\n }\n return;\n }\n const reason = await inspectInstallation(context.root);\n if (reason) throw new Error(reason);\n // A second managed configuration must be stopped before replacing their shared npm package.\n for (const key of await readdir(join(context.location.home, 'instances'))) {\n if (key === context.location.key) continue;\n const instance = await readJson<{ root: string; config: string; socket: string }>(\n join(context.location.home, 'instances', key, 'instance.json'),\n );\n if (instance?.root !== context.root) continue;\n try {\n await control({ ...context.location, socket: instance.socket }, 'status');\n throw new Error('\u540C\u4E00 npm \u5B89\u88C5\u8FD8\u6709\u5176\u4ED6 Covro \u5B9E\u4F8B\uFF0C\u8BF7\u5148\u505C\u6B62\u5176\u4ED6\u5B9E\u4F8B\u518D\u5347\u7EA7\u3002');\n } catch (error) {\n if (!isNotRunning(error)) throw error;\n }\n }\n await access(dirname(context.root), constants.W_OK);\n // npm global layout keeps production dependencies nested in the package being swapped.\n await exec(\n 'npm',\n [\n 'install',\n '--global',\n '--prefix',\n paths.prefix,\n '--omit=dev',\n '--no-audit',\n '--no-fund',\n `--registry=${registry}`,\n '--allow-scripts=better-sqlite3',\n `${npmPackageName}@${record.target}`,\n ],\n { timeout: 10 * 60_000, maxBuffer: 2 * 1024 * 1024 },\n );\n const candidate = await readJson<{\n name: string;\n version: string;\n covroCodex?: unknown;\n covroCommit?: string;\n gitHead?: string;\n }>(join(paths.candidate, 'package.json'));\n if (candidate?.name !== npmPackageName || candidate.version !== record.target)\n throw new Error('\u5019\u9009\u5305\u8EAB\u4EFD\u6216\u7248\u672C\u4E0D\u5339\u914D');\n if (record.commit && (candidate.covroCommit ?? candidate.gitHead) !== record.commit)\n throw new Error('\u5019\u9009\u5305\u6E90\u7801\u63D0\u4EA4\u4E0E\u68C0\u67E5\u65F6\u4E0D\u4E00\u81F4\uFF0C\u62D2\u7EDD\u5207\u6362');\n if (!record.codex) throw new Error('\u7F3A\u5C11 Codex \u5347\u7EA7\u6821\u9A8C\u8BB0\u5F55\uFF0C\u8BF7\u91CD\u65B0\u68C0\u67E5\u66F4\u65B0');\n const manifest = codexCompatibilitySchema.parse(candidate.covroCodex);\n if (JSON.stringify(manifest) !== JSON.stringify(record.codex.manifest))\n throw new Error('\u5019\u9009\u5305\u7684 Codex \u517C\u5BB9\u58F0\u660E\u4E0E\u68C0\u67E5\u65F6\u4E0D\u4E00\u81F4\uFF0C\u62D2\u7EDD\u5207\u6362');\n const checkCodex = async (current?: DaemonStatus) => {\n const state = current ?? (await control<DaemonStatus>(context.location, 'status'));\n if (state.codexVersion !== record!.codex!.version)\n throw new Error('Codex \u7248\u672C\u5728\u7B49\u5F85\u5347\u7EA7\u671F\u95F4\u53D1\u751F\u53D8\u5316\uFF0C\u8BF7\u91CD\u65B0\u68C0\u67E5\u66F4\u65B0');\n requireCodexCompatibility(\n manifest,\n state.codexVersion ?? null,\n record!.codex!.confirmedUnverified,\n );\n };\n await checkCodex();\n await exec(process.execPath, [join(paths.candidate, 'bin/covro.mjs'), '--version'], {\n timeout: 30_000,\n });\n const nativeProbe =\n 'const {createRequire}=await import(\"node:module\"); const r=createRequire(process.argv[1]); const DB=r(\"better-sqlite3\"); const db=new DB(\":memory:\"); db.close();';\n await exec(\n process.execPath,\n ['--input-type=module', '-e', nativeProbe, join(paths.candidate, 'package.json')],\n { timeout: 30_000 },\n );\n await verifyMigrations(context, paths.candidate);\n releaseMaintenance = await acquireMaintenanceLock(context.dataDir);\n await activateUpdate(paths, {\n backup: async () => {\n releaseData = await acquireInstanceLock(context.dataDir);\n await backups.create({ id: record!.id, trigger: 'preUpgrade', protectedBy: record!.id });\n },\n restore: async () => {\n releaseData ??= await acquireInstanceLock(context.dataDir);\n await backups.restoreFiles(record!.id);\n },\n phase: update,\n waitForIdle: async () => {\n // Queue without blocking normal work; admission closes atomically only after all blockers clear.\n for (;;) {\n await checkCodex();\n const result = await control<{ ready: boolean; reason?: string }>(\n context.location,\n 'prepare-update',\n );\n if (result.ready) {\n await checkCodex();\n return;\n }\n await update('waiting', result.reason ?? '\u7B49\u5F85\u6240\u6709\u4EFB\u52A1\u7ED3\u675F');\n await setTimeout(2_000);\n }\n },\n stop: () => stopService(context),\n start: async (candidate) => {\n await releaseData?.();\n releaseData = undefined;\n await startService(context);\n if (!candidate) await verifyRestoredService(context, record!.from);\n },\n verify: async () => {\n for (let attempt = 0; attempt < 240; attempt++) {\n const current = await control<DaemonStatus>(context.location, 'status').catch(\n () => undefined,\n );\n if (current) {\n if (current.version !== record!.target || !current.maintenance)\n throw new Error('\u65B0\u7248\u670D\u52A1\u8EAB\u4EFD\u6216\u7EF4\u62A4\u72B6\u6001\u4E0D\u5339\u914D');\n await checkCodex(current);\n if (current.codexReady) return;\n }\n await setTimeout(250);\n }\n throw new Error('\u65B0\u7248\u670D\u52A1\u6216 Codex \u8FDE\u63A5\u672A\u5C31\u7EEA\uFF0C\u62D2\u7EDD\u6FC0\u6D3B');\n },\n commit: async () => {\n // Gateway commits the durable result before reopening task admission.\n await control(context.location, 'activate-update', {\n id: record!.id,\n channel: record!.channel,\n });\n const final = await readJson<UpdateRun>(join(directory, 'run.json'));\n if (!final?.committed) throw new Error('\u65B0\u7248\u5C1A\u672A\u786E\u8BA4\u5347\u7EA7\u63D0\u4EA4');\n record = final;\n },\n hasCommitted: async () =>\n Boolean((await readJson<UpdateRun>(join(directory, 'run.json')))?.committed),\n resume: async () => {\n await control(context.location, 'cancel-update').catch(() => {});\n },\n });\n } catch (error) {\n const latest = await readJson<UpdateRun>(join(directory, 'run.json'));\n if (latest?.committed) {\n // A lost commit response cannot authorize restoring older data.\n record = latest;\n } else if (!['rolledBack', 'failed'].includes(record.phase))\n await update('failed', message(error));\n console.error(message(error));\n process.exitCode = record.committed || record.phase === 'rolledBack' ? 0 : 1;\n } finally {\n await releaseData?.();\n await releaseMaintenance?.();\n await release();\n // Keep the last good installation and database backup for explicit recovery.\n if (record.phase === 'succeeded' || record.phase === 'rolledBack') {\n await rm(paths.prefix, { recursive: true, force: true });\n }\n }\n}\n\nif (process.argv[2])\n void worker(process.argv[2]).catch((error: unknown) => {\n console.error(message(error));\n process.exitCode = 1;\n });\n"],
5
- "mappings": "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",
6
- "names": ["require", "candidate"]
4
+ "sourcesContent": ["import { BackupStore, backupDirectory, verifyLegacySnapshot } from '../backups/store.js';\nimport { acquireMaintenanceLock } from '../backups/lock.js';\nimport { acquireInstanceLock } from '../server/instance-lock.js';\nimport { inspectDatabase, readMigrations } from '../server/db/history.js';\nimport { databaseCompatibilitySchema } from '../shared/database.js';\nimport { npmPackageName } from '../shared/package.js';\nimport {\n codexCompatibilitySchema,\n requireCodexCompatibility,\n} from '../shared/codex-compatibility.js';\n// Bundled with its pure JavaScript dependencies and copied outside the installation before launch.\nimport { execFile } from 'node:child_process';\nimport { promisify } from 'node:util';\nimport { createRequire } from 'node:module';\nimport { access, mkdir, readdir, rm, rename } from 'node:fs/promises';\nimport { constants } from 'node:fs';\nimport { dirname, join } from 'node:path';\nimport { setTimeout } from 'node:timers/promises';\nimport lockfile from 'proper-lockfile';\nimport type Database from 'better-sqlite3';\nimport type { UpdateRun, RuntimeIdentity } from '../shared/updates.js';\nimport type { UpdateContext } from './manager.js';\nimport { control, isNotRunning } from '../cli/control.js';\nimport { startBackground, stopBackground } from '../cli/background.js';\nimport { copyDurable, readJson, saveJson } from './files.js';\nimport { activateUpdate, transactionPaths } from './transaction.js';\nimport { inspectInstallation, registry } from './registry.js';\nimport {\n assertRuntime,\n resolveRuntimeTarget,\n targetNpmEnvironment,\n verifyRuntimeExecutable,\n} from './runtime.js';\nimport {\n snapshotLaunch,\n switchLaunch,\n restoreLaunch,\n type LaunchSnapshot,\n} from '../cli/runtime-launch.js';\n\nconst exec = promisify(execFile);\nconst message = (error: unknown) => (error instanceof Error ? error.message : String(error));\ntype DaemonStatus = {\n version: string;\n pid: number;\n maintenance?: boolean;\n codexVersion?: string | null;\n codexReady?: boolean;\n runtime?: RuntimeIdentity;\n};\n\nasync function startService(context: UpdateContext, candidate = false) {\n // Shared with `covro start`: never inherit a Background security session on macOS.\n // Activation is checked from the durable update record by the daemon.\n const target = candidate ? context.target : undefined;\n await startBackground(\n context.location,\n join(context.root, 'bin/covro.mjs'),\n target ? { node: target.node, entry: target.entry, path: target.path } : context.source,\n );\n}\nasync function stopService(context: UpdateContext) {\n await stopBackground(context.location);\n}\n\nasync function verifyRestoredService(context: UpdateContext, version: string) {\n for (let attempt = 0; attempt < 240; attempt++) {\n try {\n const restored = await control<DaemonStatus>(context.location, 'status');\n if (restored.version !== version || restored.maintenance)\n throw new Error('\u65E7\u7248\u6062\u590D\u8EAB\u4EFD\u4E0D\u5339\u914D');\n const record = await readJson<UpdateRun>(join(context.directory, 'run.json'));\n if (record?.runtime) assertRuntime(restored.runtime, record.runtime.from);\n return;\n } catch (error) {\n if (attempt === 239) throw error;\n }\n await setTimeout(250);\n }\n}\n\nasync function verifyMigrations(context: UpdateContext, candidate: string) {\n // Loading the existing native addon happens before any package path is replaced.\n const require = createRequire(join(context.root, 'package.json'));\n const Sqlite = require('better-sqlite3') as typeof Database;\n const filename = join(context.dataDir, 'app.sqlite');\n try {\n await access(filename);\n } catch (error) {\n if ((error as NodeJS.ErrnoException).code === 'ENOENT') return;\n throw error;\n }\n const db = new Sqlite(filename, { readonly: true, fileMustExist: true });\n try {\n const migrations = readMigrations(join(candidate, 'dist/drizzle'));\n const metadata = await readJson<{ covroDatabase?: unknown }>(join(candidate, 'package.json'));\n if (metadata?.covroDatabase) {\n const contract = databaseCompatibilitySchema.parse(metadata.covroDatabase);\n if (contract.schemaVersion !== migrations.length)\n throw new Error('\u76EE\u6807\u7248\u672C\u7684 Schema \u58F0\u660E\u4E0E\u8FC1\u79FB\u4E0D\u4E00\u81F4');\n }\n inspectDatabase(db, migrations);\n } finally {\n db.close();\n }\n}\n\nasync function worker(directory: string) {\n await mkdir(directory, { recursive: true, mode: 0o700 });\n const release = await lockfile.lock(directory, {\n stale: 10_000,\n update: 2_000,\n retries: { retries: 30, minTimeout: 100, maxTimeout: 500 },\n });\n let record = await readJson<UpdateRun>(join(directory, 'run.json'));\n const context = await readJson<UpdateContext>(join(directory, 'context.json'));\n if (!record || !context) {\n await release();\n throw new Error('\u7F3A\u5C11\u5347\u7EA7\u8BB0\u5F55');\n }\n const update = async (phase: UpdateRun['phase'], detail: string) => {\n record = { ...record!, phase, message: detail, updatedAt: Date.now() };\n await saveJson(join(directory, 'run.json'), record);\n };\n const paths = transactionPaths(\n context.target?.root ?? context.root,\n record.id,\n context.dataDir,\n context.location.config,\n join(backupDirectory(context.location.home, context.dataDir), record.id),\n );\n let releaseMaintenance: (() => Promise<void>) | undefined;\n let releaseData: (() => Promise<void>) | undefined;\n try {\n if (record.runtime) await verifyRuntimeExecutable(record.runtime.from);\n const previousMetadata = await readJson<{ version: string }>(\n join(paths.previous, 'package.json'),\n );\n const sameRoot = paths.root.replace(/\\/$/, '') === context.root.replace(/\\/$/, '');\n const originalRoot =\n sameRoot && previousMetadata?.version === record.from ? paths.previous : context.root;\n const originalMetadata = await readJson<{\n version: string;\n covroCommit?: string;\n covroDatabase?: unknown;\n }>(join(originalRoot, 'package.json'));\n const Sqlite = createRequire(join(originalRoot, 'package.json'))(\n 'better-sqlite3',\n ) as typeof Database;\n const migrations = readMigrations(join(originalRoot, 'dist/drizzle'));\n const backups = new BackupStore({\n directory: backupDirectory(context.location.home, context.dataDir),\n config: paths.config,\n dataDir: paths.dataDir,\n appVersion: record.from,\n commit: originalMetadata?.covroCommit,\n contract: databaseCompatibilitySchema.parse(\n originalMetadata?.covroDatabase ?? {\n schemaVersion: migrations.length,\n minRestorableSchemaVersion: 1,\n backupFormatVersion: 1,\n },\n ),\n Sqlite,\n migrations,\n });\n if (process.argv[3] === '--repair') {\n releaseMaintenance = await acquireMaintenanceLock(context.dataDir);\n if (!(await readJson(join(paths.backup, 'snapshot.json'))))\n paths.backup = join(directory, `backup-${record.id}`);\n const active = await control<DaemonStatus>(context.location, 'status').catch(\n (error: unknown) => {\n if (isNotRunning(error)) return undefined;\n throw error;\n },\n );\n if (record.committed) return;\n if (active && !active.maintenance && active.version !== record.from)\n throw new Error('\u5F53\u524D\u670D\u52A1\u53EF\u80FD\u5DF2\u63A5\u53D7\u65B0\u7248\u4E1A\u52A1\u6570\u636E\uFF1B\u62D2\u7EDD\u6062\u590D\u65E7\u5FEB\u7167\uFF0C\u8BF7\u4F7F\u7528\u517C\u5BB9\u7248\u672C\u68C0\u67E5\u3002');\n const previous = await readJson<{ version: string; name: string }>(\n join(paths.previous, 'package.json'),\n );\n if (previous || context.reuseTarget) {\n if (active && !active.maintenance)\n throw new Error('\u65E7\u670D\u52A1\u5DF2\u6062\u590D\u4E1A\u52A1\u5199\u5165\uFF1B\u62D2\u7EDD\u7528\u5347\u7EA7\u524D\u5FEB\u7167\u8986\u76D6\u73B0\u6709\u6570\u636E\uFF0C\u8BF7\u4FDD\u7559\u73B0\u573A\u68C0\u67E5\u3002');\n if (\n previous &&\n (previous.name !== npmPackageName ||\n previous.version !== (context.target?.version ?? record.from))\n )\n throw new Error('\u65E7\u7248\u5907\u4EFD\u8EAB\u4EFD\u4E0D\u5339\u914D');\n const snapshot = await readJson<{ complete: boolean; formatVersion?: number }>(\n join(paths.backup, 'snapshot.json'),\n );\n if (snapshot?.formatVersion === 1) {\n const verified = await backups.verify(record.id);\n if (\n verified.appVersion !== record.from ||\n verified.protectedBy !== record.id ||\n verified.configPath !== paths.config ||\n verified.dataDir !== paths.dataDir\n )\n throw new Error('\u5907\u4EFD\u8EAB\u4EFD\u4E0D\u5339\u914D');\n } else await verifyLegacySnapshot(paths.backup, Sqlite, join(originalRoot, 'dist/drizzle'));\n } else if (sameRoot) {\n const original = await readJson<{ name: string; version: string }>(\n join(paths.root, 'package.json'),\n );\n if (original?.name !== npmPackageName || original.version !== record.from)\n throw new Error('\u672A\u627E\u5230\u5B8C\u6574\u7684\u4E0A\u4E00\u7248\u672C\u5B89\u88C5');\n }\n if (active && !active.maintenance) {\n const admission = await control<{ ready: boolean }>(context.location, 'prepare-update');\n if (!admission.ready) throw new Error('\u4ECD\u6709\u4EFB\u52A1\u3001\u5BA1\u6279\u6216\u5F85\u6838\u5BF9\u64CD\u4F5C\uFF0C\u4E0D\u80FD\u6062\u590D\u65E7\u5B89\u88C5');\n }\n await stopService(context);\n releaseData = await acquireInstanceLock(context.dataDir);\n if (previous) {\n await rm(paths.root, { recursive: true, force: true });\n await rename(paths.previous, paths.root);\n }\n if (previous || context.reuseTarget) {\n for (const name of ['app.sqlite', 'app.sqlite-wal', 'app.sqlite-shm']) {\n await rm(join(paths.dataDir, name), { force: true });\n try {\n await copyDurable(join(paths.backup, name), join(paths.dataDir, name));\n } catch (error) {\n if ((error as NodeJS.ErrnoException).code !== 'ENOENT') throw error;\n }\n }\n await copyDurable(join(paths.backup, 'config.json'), paths.config);\n }\n const launch = await readJson<LaunchSnapshot>(join(directory, `launch-${record.id}.json`));\n if (launch) await restoreLaunch(context.location, launch);\n const restored = await readJson<{ name: string; version: string }>(\n join(context.root, 'package.json'),\n );\n if (restored?.name !== npmPackageName || restored.version !== record.from)\n throw new Error('\u672A\u627E\u5230\u5B8C\u6574\u7684\u4E0A\u4E00\u7248\u672C\u5B89\u88C5');\n await update('rolledBack', '\u5DF2\u6062\u590D\u4E0A\u6B21\u672A\u5B8C\u6210\u7684\u5347\u7EA7\uFF0C\u6B63\u5728\u542F\u52A8\u4E0A\u4E00\u7248\u672C');\n try {\n await releaseData?.();\n releaseData = undefined;\n await startService(context);\n await verifyRestoredService(context, record.from);\n await update('rolledBack', '\u5DF2\u6062\u590D\u4E0A\u6B21\u672A\u5B8C\u6210\u7684\u5347\u7EA7\uFF0C\u4E0A\u4E00\u7248\u672C\u5DF2\u5C31\u7EEA');\n } catch (error) {\n await update('failed', `\u65E7\u7248\u6062\u590D\u542F\u52A8\u5931\u8D25\uFF0C\u4FDD\u7559\u5907\u4EFD\uFF1A${message(error)}`);\n throw error;\n }\n return;\n }\n const reason = await inspectInstallation(context.root);\n if (reason) throw new Error(reason);\n // A second managed configuration must be stopped before replacing their shared npm package.\n for (const key of await readdir(join(context.location.home, 'instances'))) {\n if (key === context.location.key) continue;\n const instance = await readJson<{ root: string; config: string; socket: string }>(\n join(context.location.home, 'instances', key, 'instance.json'),\n );\n if (\n !instance ||\n ![context.root.replace(/\\/$/, ''), paths.root].includes(instance.root.replace(/\\/$/, ''))\n )\n continue;\n try {\n await control({ ...context.location, socket: instance.socket }, 'status');\n throw new Error('\u540C\u4E00 npm \u5B89\u88C5\u8FD8\u6709\u5176\u4ED6 Covro \u5B9E\u4F8B\uFF0C\u8BF7\u5148\u505C\u6B62\u5176\u4ED6\u5B9E\u4F8B\u518D\u5347\u7EA7\u3002');\n } catch (error) {\n if (!isNotRunning(error)) throw error;\n }\n }\n await access(dirname(context.root), constants.W_OK);\n await access(dirname(paths.root), constants.W_OK);\n if (context.target) {\n const target = await resolveRuntimeTarget();\n assertRuntime(target, context.target);\n if (\n target.npm !== context.target.npm ||\n target.npmVersion !== context.target.npmVersion ||\n target.prefix !== context.target.prefix ||\n target.path !== context.target.path ||\n target.version !== context.target.version\n )\n throw new Error('\u76EE\u6807 Node/npm \u73AF\u5883\u5728\u68C0\u67E5\u540E\u53D8\u5316\uFF0C\u8BF7\u91CD\u65B0\u68C0\u67E5\u66F4\u65B0\u3002');\n }\n const candidateRoot = context.reuseTarget ? paths.root : paths.candidate;\n const node = context.target?.node ?? process.execPath;\n const env = targetNpmEnvironment(\n context.target?.path ?? process.env.PATH ?? '/usr/bin:/bin',\n context.target?.npmConfig,\n );\n // npm global layout keeps production dependencies nested in the package being swapped.\n if (!context.reuseTarget)\n await exec(\n context.target?.node ?? 'npm',\n [\n ...(context.target ? [context.target.npm] : []),\n 'install',\n '--global',\n '--prefix',\n paths.prefix,\n '--omit=dev',\n '--no-audit',\n '--no-fund',\n `--registry=${registry}`,\n '--allow-scripts=better-sqlite3',\n `${npmPackageName}@${record.target}`,\n ],\n { env, timeout: 10 * 60_000, maxBuffer: 2 * 1024 * 1024 },\n );\n const candidate = await readJson<{\n name: string;\n version: string;\n covroCodex?: unknown;\n covroCommit?: string;\n gitHead?: string;\n }>(join(candidateRoot, 'package.json'));\n if (candidate?.name !== npmPackageName || candidate.version !== record.target)\n throw new Error('\u5019\u9009\u5305\u8EAB\u4EFD\u6216\u7248\u672C\u4E0D\u5339\u914D');\n if (record.commit && (candidate.covroCommit ?? candidate.gitHead) !== record.commit)\n throw new Error('\u5019\u9009\u5305\u6E90\u7801\u63D0\u4EA4\u4E0E\u68C0\u67E5\u65F6\u4E0D\u4E00\u81F4\uFF0C\u62D2\u7EDD\u5207\u6362');\n if (!record.codex) throw new Error('\u7F3A\u5C11 Codex \u5347\u7EA7\u6821\u9A8C\u8BB0\u5F55\uFF0C\u8BF7\u91CD\u65B0\u68C0\u67E5\u66F4\u65B0');\n const manifest = codexCompatibilitySchema.parse(candidate.covroCodex);\n if (JSON.stringify(manifest) !== JSON.stringify(record.codex.manifest))\n throw new Error('\u5019\u9009\u5305\u7684 Codex \u517C\u5BB9\u58F0\u660E\u4E0E\u68C0\u67E5\u65F6\u4E0D\u4E00\u81F4\uFF0C\u62D2\u7EDD\u5207\u6362');\n const checkCodex = async (current?: DaemonStatus) => {\n const state = current ?? (await control<DaemonStatus>(context.location, 'status'));\n if (state.codexVersion !== record!.codex!.version)\n throw new Error('Codex \u7248\u672C\u5728\u7B49\u5F85\u5347\u7EA7\u671F\u95F4\u53D1\u751F\u53D8\u5316\uFF0C\u8BF7\u91CD\u65B0\u68C0\u67E5\u66F4\u65B0');\n requireCodexCompatibility(\n manifest,\n state.codexVersion ?? null,\n record!.codex!.confirmedUnverified,\n );\n };\n await checkCodex();\n const versionProbe = await exec(node, [join(candidateRoot, 'bin/covro.mjs'), '--version'], {\n timeout: 30_000,\n env,\n });\n if (versionProbe.stdout.trim() !== record.target)\n throw new Error('\u76EE\u6807 Node \u6267\u884C Covro \u5165\u53E3\u540E\u8FD4\u56DE\u7684\u7248\u672C\u4E0D\u5339\u914D');\n const nativeProbe =\n 'const {createRequire}=await import(\"node:module\"); const r=createRequire(process.argv[1]); const DB=r(\"better-sqlite3\"); const db=new DB(\":memory:\"); db.close();';\n await exec(\n node,\n ['--input-type=module', '-e', nativeProbe, join(candidateRoot, 'package.json')],\n { env, timeout: 30_000 },\n );\n await verifyMigrations(context, candidateRoot);\n const launch: LaunchSnapshot = await snapshotLaunch(\n context.location,\n context.source ?? {\n node: process.execPath,\n entry: join(context.root, 'bin/covro.mjs'),\n path: process.env.PATH ?? '/usr/bin:/bin',\n },\n );\n if (context.target)\n launch.target = { node, entry: context.target.entry, path: context.target.path };\n await saveJson(join(directory, `launch-${record.id}.json`), launch);\n releaseMaintenance = await acquireMaintenanceLock(context.dataDir);\n await activateUpdate(\n paths,\n {\n backup: async () => {\n releaseData = await acquireInstanceLock(context.dataDir);\n await backups.create({ id: record!.id, trigger: 'preUpgrade', protectedBy: record!.id });\n },\n restore: async () => {\n releaseData ??= await acquireInstanceLock(context.dataDir);\n await backups.restoreFiles(record!.id);\n },\n switchLaunch: context.target\n ? () =>\n switchLaunch(\n context.location,\n { node, entry: context.target!.entry, path: context.target!.path },\n launch,\n )\n : undefined,\n restoreLaunch: () => restoreLaunch(context.location, launch),\n phase: update,\n waitForIdle: async () => {\n // Queue without blocking normal work; admission closes atomically only after all blockers clear.\n for (;;) {\n await checkCodex();\n const result = await control<{ ready: boolean; reason?: string }>(\n context.location,\n 'prepare-update',\n );\n if (result.ready) {\n await checkCodex();\n return;\n }\n await update('waiting', result.reason ?? '\u7B49\u5F85\u6240\u6709\u4EFB\u52A1\u7ED3\u675F');\n await setTimeout(2_000);\n }\n },\n stop: () => stopService(context),\n start: async (candidate) => {\n await releaseData?.();\n releaseData = undefined;\n await startService(context, candidate);\n if (!candidate) await verifyRestoredService(context, record!.from);\n },\n verify: async () => {\n for (let attempt = 0; attempt < 240; attempt++) {\n const current = await control<DaemonStatus>(context.location, 'status').catch(\n () => undefined,\n );\n if (current) {\n if (current.version !== record!.target || !current.maintenance)\n throw new Error('\u65B0\u7248\u670D\u52A1\u8EAB\u4EFD\u6216\u7EF4\u62A4\u72B6\u6001\u4E0D\u5339\u914D');\n if (record!.runtime) assertRuntime(current.runtime, record!.runtime.target);\n await checkCodex(current);\n if (current.codexReady) return;\n }\n await setTimeout(250);\n }\n throw new Error('\u65B0\u7248\u670D\u52A1\u6216 Codex \u8FDE\u63A5\u672A\u5C31\u7EEA\uFF0C\u62D2\u7EDD\u6FC0\u6D3B');\n },\n commit: async () => {\n // Gateway commits the durable result before reopening task admission.\n await control(context.location, 'activate-update', {\n id: record!.id,\n channel: record!.channel,\n });\n const final = await readJson<UpdateRun>(join(directory, 'run.json'));\n if (!final?.committed) throw new Error('\u65B0\u7248\u5C1A\u672A\u786E\u8BA4\u5347\u7EA7\u63D0\u4EA4');\n record = final;\n },\n hasCommitted: async () =>\n Boolean((await readJson<UpdateRun>(join(directory, 'run.json')))?.committed),\n resume: async () => {\n await control(context.location, 'cancel-update').catch(() => {});\n },\n },\n context.reuseTarget,\n );\n } catch (error) {\n const latest = await readJson<UpdateRun>(join(directory, 'run.json'));\n if (latest?.committed) {\n // A lost commit response cannot authorize restoring older data.\n record = latest;\n } else if (!['rolledBack', 'failed'].includes(record.phase))\n await update('failed', message(error));\n console.error(message(error));\n process.exitCode = record.committed || record.phase === 'rolledBack' ? 0 : 1;\n } finally {\n await releaseData?.();\n await releaseMaintenance?.();\n await release();\n // Keep the last good installation and database backup for explicit recovery.\n if (record.phase === 'succeeded' || record.phase === 'rolledBack') {\n await rm(paths.prefix, { recursive: true, force: true });\n }\n }\n}\n\nif (process.argv[2])\n void worker(process.argv[2]).catch((error: unknown) => {\n console.error(message(error));\n process.exitCode = 1;\n });\n"],
5
+ "mappings": "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",
6
+ "names": ["require", "launch", "candidate"]
7
7
  }
@@ -1 +1 @@
1
- import{m as e,t}from"./mermaid-parser.core-BqD0_cdI.js";import{n}from"./chunk-Y2CYZVJY-DsF7k-Jl.js";import{m as r}from"./src-DeJ6DlL6.js";import"./chunk-DSNLSHJZ-DWI7CHhD.js";import{n as i,r as a,t as o}from"./chunk-2E7WHVMD-0QrTjfW_.js";import{t as s}from"./chunk-JWPE2WC7-DVXcaiue.js";import"./mermaid.core-Dd1sHHm2.js";var c=e().RailroadAbnf.parser.LangiumParser,l=n(e=>{let t=e.alternatives.map(u);return t.length===1?t[0]:{type:`choice`,alternatives:t}},`transformAlternation`),u=n(e=>{let t=e.elements.map(f);return t.length===1?t[0]:{type:`sequence`,elements:t}},`transformConcatenation`),d=n(e=>{if(e.includes(`*`)){let[t,n]=e.split(`*`);return{min:t?parseInt(t,10):0,max:n?parseInt(n,10):1/0}}let t=parseInt(e,10);return{min:t,max:t}},`parseRepeat`),f=n(e=>{let t=p(e.primary);if(!e.repeat)return t;let{min:n,max:r}=d(e.repeat);return n===0&&r===1?{type:`optional`,element:t}:{type:`repetition`,element:t,min:n,max:r}},`transformElement`),p=n(e=>{switch(e.$type){case`AbnfStringLiteral`:return{type:`terminal`,value:e.value};case`AbnfNumVal`:return{type:`terminal`,value:e.value};case`AbnfRuleName`:return{type:`nonterminal`,name:e.name};case`AbnfGroup`:return l(e.element);case`AbnfOptionalGroup`:return{type:`optional`,element:l(e.element)};default:throw Error(`Unsupported ABNF primary node: ${e.$type}`)}},`transformPrimary`),m=n(e=>({name:e.name,definition:l(e.definition)}),`transformRule`),h=n(e=>{s(e,o),e.title&&o.setTitle(e.title),e.rules.map(e=>o.addRule(m(e)))},`populateDb`),g={parser:{parse:n(e=>{o.clear(),r.debug(`[ABNF Parser] Starting Langium parse`);let n=c.parse(e);if(n.lexerErrors.length>0||n.parserErrors.length>0)throw new t(n);let i=n.value;r.debug(`[ABNF Parser] Parsed rules:`,i.rules.length),h(i),r.debug(`[ABNF Parser] Parse complete`)},`parse`),parser:{yy:o}},db:o,renderer:a,styles:i};export{g as diagram};
1
+ import{m as e,t}from"./mermaid-parser.core-DldmXGom.js";import{n}from"./chunk-Y2CYZVJY-DsF7k-Jl.js";import{m as r}from"./src-DiejhDC1.js";import"./chunk-DSNLSHJZ-DoWMycRk.js";import{n as i,r as a,t as o}from"./chunk-2E7WHVMD-BwjaS8bo.js";import{t as s}from"./chunk-JWPE2WC7-DVXcaiue.js";import"./mermaid.core-DIZvVrdE.js";var c=e().RailroadAbnf.parser.LangiumParser,l=n(e=>{let t=e.alternatives.map(u);return t.length===1?t[0]:{type:`choice`,alternatives:t}},`transformAlternation`),u=n(e=>{let t=e.elements.map(f);return t.length===1?t[0]:{type:`sequence`,elements:t}},`transformConcatenation`),d=n(e=>{if(e.includes(`*`)){let[t,n]=e.split(`*`);return{min:t?parseInt(t,10):0,max:n?parseInt(n,10):1/0}}let t=parseInt(e,10);return{min:t,max:t}},`parseRepeat`),f=n(e=>{let t=p(e.primary);if(!e.repeat)return t;let{min:n,max:r}=d(e.repeat);return n===0&&r===1?{type:`optional`,element:t}:{type:`repetition`,element:t,min:n,max:r}},`transformElement`),p=n(e=>{switch(e.$type){case`AbnfStringLiteral`:return{type:`terminal`,value:e.value};case`AbnfNumVal`:return{type:`terminal`,value:e.value};case`AbnfRuleName`:return{type:`nonterminal`,name:e.name};case`AbnfGroup`:return l(e.element);case`AbnfOptionalGroup`:return{type:`optional`,element:l(e.element)};default:throw Error(`Unsupported ABNF primary node: ${e.$type}`)}},`transformPrimary`),m=n(e=>({name:e.name,definition:l(e.definition)}),`transformRule`),h=n(e=>{s(e,o),e.title&&o.setTitle(e.title),e.rules.map(e=>o.addRule(m(e)))},`populateDb`),g={parser:{parse:n(e=>{o.clear(),r.debug(`[ABNF Parser] Starting Langium parse`);let n=c.parse(e);if(n.lexerErrors.length>0||n.parserErrors.length>0)throw new t(n);let i=n.value;r.debug(`[ABNF Parser] Parsed rules:`,i.rules.length),h(i),r.debug(`[ABNF Parser] Parse complete`)},`parse`),parser:{yy:o}},db:o,renderer:a,styles:i};export{g as diagram};
@@ -1 +1 @@
1
- import{n as e,t}from"./path-fybaL0A-.js";import{a as n,c as r,d as i,f as a,i as o,l as s,m as c,n as l,o as u,p as d,r as f,u as p}from"./dist-V4sbzI-h.js";function m(e){return e.innerRadius}function h(e){return e.outerRadius}function g(e){return e.startAngle}function _(e){return e.endAngle}function v(e){return e&&e.padAngle}function y(e,t,n,r,i,a,o,s){var c=n-e,l=r-t,u=o-i,d=s-a,f=d*c-u*l;if(!(f*f<1e-12))return f=(u*(t-a)-d*(e-i))/f,[e+f*c,t+f*l]}function b(e,t,n,r,i,a,o){var c=e-n,l=t-r,u=(o?a:-a)/d(c*c+l*l),f=u*l,p=-u*c,m=e+f,h=t+p,g=n+f,_=r+p,v=(m+g)/2,y=(h+_)/2,b=g-m,x=_-h,S=b*b+x*x,C=i-a,w=m*_-g*h,T=(x<0?-1:1)*d(s(0,C*C*S-w*w)),E=(w*x-b*T)/S,D=(-w*b-x*T)/S,O=(w*x+b*T)/S,k=(-w*b+x*T)/S,A=E-v,j=D-y,M=O-v,N=k-y;return A*A+j*j>M*M+N*N&&(E=O,D=k),{cx:E,cy:D,x01:-f,y01:-p,x11:E*(i/C-1),y11:D*(i/C-1)}}function x(){var s=m,x=h,S=e(0),C=null,w=g,T=_,E=v,D=null,O=t(k);function k(){var e,t,m=+s.apply(this,arguments),h=+x.apply(this,arguments),g=w.apply(this,arguments)-r,_=T.apply(this,arguments)-r,v=l(_-g),k=_>g;if(D||=e=O(),h<m&&(t=h,h=m,m=t),!(h>1e-12))D.moveTo(0,0);else if(v>c-1e-12)D.moveTo(h*u(g),h*a(g)),D.arc(0,0,h,g,_,!k),m>1e-12&&(D.moveTo(m*u(_),m*a(_)),D.arc(0,0,m,_,g,k));else{var A=g,j=_,M=g,N=_,P=v,F=v,I=E.apply(this,arguments)/2,L=I>1e-12&&(C?+C.apply(this,arguments):d(m*m+h*h)),R=p(l(h-m)/2,+S.apply(this,arguments)),z=R,B=R,V,H;if(L>1e-12){var U=o(L/m*a(I)),W=o(L/h*a(I));(P-=U*2)>1e-12?(U*=k?1:-1,M+=U,N-=U):(P=0,M=N=(g+_)/2),(F-=W*2)>1e-12?(W*=k?1:-1,A+=W,j-=W):(F=0,A=j=(g+_)/2)}var G=h*u(A),K=h*a(A),q=m*u(N),J=m*a(N);if(R>1e-12){var Y=h*u(j),X=h*a(j),Z=m*u(M),Q=m*a(M),$;if(v<i){if($=y(G,K,Z,Q,Y,X,q,J)){var ee=G-$[0],te=K-$[1],ne=Y-$[0],re=X-$[1],ie=1/a(f((ee*ne+te*re)/(d(ee*ee+te*te)*d(ne*ne+re*re)))/2),ae=d($[0]*$[0]+$[1]*$[1]);z=p(R,(m-ae)/(ie-1)),B=p(R,(h-ae)/(ie+1))}else z=B=0}}F>1e-12?B>1e-12?(V=b(Z,Q,G,K,h,B,k),H=b(Y,X,q,J,h,B,k),D.moveTo(V.cx+V.x01,V.cy+V.y01),B<R?D.arc(V.cx,V.cy,B,n(V.y01,V.x01),n(H.y01,H.x01),!k):(D.arc(V.cx,V.cy,B,n(V.y01,V.x01),n(V.y11,V.x11),!k),D.arc(0,0,h,n(V.cy+V.y11,V.cx+V.x11),n(H.cy+H.y11,H.cx+H.x11),!k),D.arc(H.cx,H.cy,B,n(H.y11,H.x11),n(H.y01,H.x01),!k))):(D.moveTo(G,K),D.arc(0,0,h,A,j,!k)):D.moveTo(G,K),!(m>1e-12)||!(P>1e-12)?D.lineTo(q,J):z>1e-12?(V=b(q,J,Y,X,m,-z,k),H=b(G,K,Z,Q,m,-z,k),D.lineTo(V.cx+V.x01,V.cy+V.y01),z<R?D.arc(V.cx,V.cy,z,n(V.y01,V.x01),n(H.y01,H.x01),!k):(D.arc(V.cx,V.cy,z,n(V.y01,V.x01),n(V.y11,V.x11),!k),D.arc(0,0,m,n(V.cy+V.y11,V.cx+V.x11),n(H.cy+H.y11,H.cx+H.x11),k),D.arc(H.cx,H.cy,z,n(H.y11,H.x11),n(H.y01,H.x01),!k))):D.arc(0,0,m,N,M,k)}if(D.closePath(),e)return D=null,e+``||null}return k.centroid=function(){var e=(+s.apply(this,arguments)+ +x.apply(this,arguments))/2,t=(+w.apply(this,arguments)+ +T.apply(this,arguments))/2-i/2;return[u(t)*e,a(t)*e]},k.innerRadius=function(t){return arguments.length?(s=typeof t==`function`?t:e(+t),k):s},k.outerRadius=function(t){return arguments.length?(x=typeof t==`function`?t:e(+t),k):x},k.cornerRadius=function(t){return arguments.length?(S=typeof t==`function`?t:e(+t),k):S},k.padRadius=function(t){return arguments.length?(C=t==null?null:typeof t==`function`?t:e(+t),k):C},k.startAngle=function(t){return arguments.length?(w=typeof t==`function`?t:e(+t),k):w},k.endAngle=function(t){return arguments.length?(T=typeof t==`function`?t:e(+t),k):T},k.padAngle=function(t){return arguments.length?(E=typeof t==`function`?t:e(+t),k):E},k.context=function(e){return arguments.length?(D=e??null,k):D},k}export{x as t};
1
+ import{n as e,t}from"./path-fybaL0A-.js";import{a as n,c as r,d as i,f as a,i as o,l as s,m as c,n as l,o as u,p as d,r as f,u as p}from"./dist-BE4VEq-n.js";function m(e){return e.innerRadius}function h(e){return e.outerRadius}function g(e){return e.startAngle}function _(e){return e.endAngle}function v(e){return e&&e.padAngle}function y(e,t,n,r,i,a,o,s){var c=n-e,l=r-t,u=o-i,d=s-a,f=d*c-u*l;if(!(f*f<1e-12))return f=(u*(t-a)-d*(e-i))/f,[e+f*c,t+f*l]}function b(e,t,n,r,i,a,o){var c=e-n,l=t-r,u=(o?a:-a)/d(c*c+l*l),f=u*l,p=-u*c,m=e+f,h=t+p,g=n+f,_=r+p,v=(m+g)/2,y=(h+_)/2,b=g-m,x=_-h,S=b*b+x*x,C=i-a,w=m*_-g*h,T=(x<0?-1:1)*d(s(0,C*C*S-w*w)),E=(w*x-b*T)/S,D=(-w*b-x*T)/S,O=(w*x+b*T)/S,k=(-w*b+x*T)/S,A=E-v,j=D-y,M=O-v,N=k-y;return A*A+j*j>M*M+N*N&&(E=O,D=k),{cx:E,cy:D,x01:-f,y01:-p,x11:E*(i/C-1),y11:D*(i/C-1)}}function x(){var s=m,x=h,S=e(0),C=null,w=g,T=_,E=v,D=null,O=t(k);function k(){var e,t,m=+s.apply(this,arguments),h=+x.apply(this,arguments),g=w.apply(this,arguments)-r,_=T.apply(this,arguments)-r,v=l(_-g),k=_>g;if(D||=e=O(),h<m&&(t=h,h=m,m=t),!(h>1e-12))D.moveTo(0,0);else if(v>c-1e-12)D.moveTo(h*u(g),h*a(g)),D.arc(0,0,h,g,_,!k),m>1e-12&&(D.moveTo(m*u(_),m*a(_)),D.arc(0,0,m,_,g,k));else{var A=g,j=_,M=g,N=_,P=v,F=v,I=E.apply(this,arguments)/2,L=I>1e-12&&(C?+C.apply(this,arguments):d(m*m+h*h)),R=p(l(h-m)/2,+S.apply(this,arguments)),z=R,B=R,V,H;if(L>1e-12){var U=o(L/m*a(I)),W=o(L/h*a(I));(P-=U*2)>1e-12?(U*=k?1:-1,M+=U,N-=U):(P=0,M=N=(g+_)/2),(F-=W*2)>1e-12?(W*=k?1:-1,A+=W,j-=W):(F=0,A=j=(g+_)/2)}var G=h*u(A),K=h*a(A),q=m*u(N),J=m*a(N);if(R>1e-12){var Y=h*u(j),X=h*a(j),Z=m*u(M),Q=m*a(M),$;if(v<i){if($=y(G,K,Z,Q,Y,X,q,J)){var ee=G-$[0],te=K-$[1],ne=Y-$[0],re=X-$[1],ie=1/a(f((ee*ne+te*re)/(d(ee*ee+te*te)*d(ne*ne+re*re)))/2),ae=d($[0]*$[0]+$[1]*$[1]);z=p(R,(m-ae)/(ie-1)),B=p(R,(h-ae)/(ie+1))}else z=B=0}}F>1e-12?B>1e-12?(V=b(Z,Q,G,K,h,B,k),H=b(Y,X,q,J,h,B,k),D.moveTo(V.cx+V.x01,V.cy+V.y01),B<R?D.arc(V.cx,V.cy,B,n(V.y01,V.x01),n(H.y01,H.x01),!k):(D.arc(V.cx,V.cy,B,n(V.y01,V.x01),n(V.y11,V.x11),!k),D.arc(0,0,h,n(V.cy+V.y11,V.cx+V.x11),n(H.cy+H.y11,H.cx+H.x11),!k),D.arc(H.cx,H.cy,B,n(H.y11,H.x11),n(H.y01,H.x01),!k))):(D.moveTo(G,K),D.arc(0,0,h,A,j,!k)):D.moveTo(G,K),!(m>1e-12)||!(P>1e-12)?D.lineTo(q,J):z>1e-12?(V=b(q,J,Y,X,m,-z,k),H=b(G,K,Z,Q,m,-z,k),D.lineTo(V.cx+V.x01,V.cy+V.y01),z<R?D.arc(V.cx,V.cy,z,n(V.y01,V.x01),n(H.y01,H.x01),!k):(D.arc(V.cx,V.cy,z,n(V.y01,V.x01),n(V.y11,V.x11),!k),D.arc(0,0,m,n(V.cy+V.y11,V.cx+V.x11),n(H.cy+H.y11,H.cx+H.x11),k),D.arc(H.cx,H.cy,z,n(H.y11,H.x11),n(H.y01,H.x01),!k))):D.arc(0,0,m,N,M,k)}if(D.closePath(),e)return D=null,e+``||null}return k.centroid=function(){var e=(+s.apply(this,arguments)+ +x.apply(this,arguments))/2,t=(+w.apply(this,arguments)+ +T.apply(this,arguments))/2-i/2;return[u(t)*e,a(t)*e]},k.innerRadius=function(t){return arguments.length?(s=typeof t==`function`?t:e(+t),k):s},k.outerRadius=function(t){return arguments.length?(x=typeof t==`function`?t:e(+t),k):x},k.cornerRadius=function(t){return arguments.length?(S=typeof t==`function`?t:e(+t),k):S},k.padRadius=function(t){return arguments.length?(C=t==null?null:typeof t==`function`?t:e(+t),k):C},k.startAngle=function(t){return arguments.length?(w=typeof t==`function`?t:e(+t),k):w},k.endAngle=function(t){return arguments.length?(T=typeof t==`function`?t:e(+t),k):T},k.padAngle=function(t){return arguments.length?(E=typeof t==`function`?t:e(+t),k):E},k.context=function(e){return arguments.length?(D=e??null,k):D},k}export{x as t};