frely-cli 0.6.2 → 0.6.6
This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
- package/README.md +117 -50
- package/dist/agent-help.d.ts +47 -58
- package/dist/agent-help.js +24 -10
- package/dist/agent-help.js.map +1 -1
- package/dist/cloud.d.ts +7 -0
- package/dist/cloud.js +263 -0
- package/dist/cloud.js.map +1 -0
- package/dist/device/connection-status.d.ts +42 -0
- package/dist/device/connection-status.js +112 -0
- package/dist/device/connection-status.js.map +1 -0
- package/dist/device/relay-client.d.ts +5 -1
- package/dist/device/relay-client.js +101 -43
- package/dist/device/relay-client.js.map +1 -1
- package/dist/diagnostics.d.ts +66 -4
- package/dist/diagnostics.js +133 -25
- package/dist/diagnostics.js.map +1 -1
- package/dist/index.js +35 -16
- package/dist/index.js.map +1 -1
- package/dist/mcp-authorization.js +3 -3
- package/dist/mcp-authorization.js.map +1 -1
- package/dist/mcp-command.d.ts +9 -0
- package/dist/mcp-command.js +68 -0
- package/dist/mcp-command.js.map +1 -0
- package/dist/runtime/mcp.d.ts +2 -0
- package/dist/runtime/mcp.js +8 -3
- package/dist/runtime/mcp.js.map +1 -1
- package/dist/service.d.ts +4 -0
- package/dist/service.js +28 -4
- package/dist/service.js.map +1 -1
- package/dist/upgrade/installation.d.ts +24 -0
- package/dist/upgrade/installation.js +137 -0
- package/dist/upgrade/installation.js.map +1 -0
- package/dist/upgrade/maintenance.d.ts +15 -0
- package/dist/upgrade/maintenance.js +133 -0
- package/dist/upgrade/maintenance.js.map +1 -0
- package/dist/upgrade/release.d.ts +9 -0
- package/dist/upgrade/release.js +45 -0
- package/dist/upgrade/release.js.map +1 -0
- package/dist/upgrade/service-refresh.d.ts +38 -0
- package/dist/upgrade/service-refresh.js +138 -0
- package/dist/upgrade/service-refresh.js.map +1 -0
- package/dist/upgrade/update.d.ts +49 -0
- package/dist/upgrade/update.js +228 -0
- package/dist/upgrade/update.js.map +1 -0
- package/package.json +1 -1
package/dist/service.js.map
CHANGED
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"service.js","sourceRoot":"","sources":["../src/service.ts"],"names":[],"mappings":"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"}
|
|
1
|
+
{"version":3,"file":"service.js","sourceRoot":"","sources":["../src/service.ts"],"names":[],"mappings":"AAAA,OAAO,EAAE,QAAQ,IAAI,gBAAgB,EAAE,MAAM,oBAAoB,CAAC;AAClE,OAAO,EAAE,KAAK,EAAE,KAAK,EAAE,QAAQ,EAAE,QAAQ,EAAE,EAAE,EAAE,SAAS,EAAE,MAAM,kBAAkB,CAAC;AACnF,OAAO,EAAE,OAAO,EAAE,MAAM,SAAS,CAAC;AAClC,OAAO,EAAE,OAAO,EAAE,IAAI,EAAE,OAAO,EAAE,MAAM,WAAW,CAAC;AACnD,OAAO,EAAE,SAAS,EAAE,MAAM,WAAW,CAAC;AACtC,OAAO,EAAE,kBAAkB,EAAE,aAAa,EAAE,MAAM,iBAAiB,CAAC;AACpE,OAAO,EAAE,cAAc,EAAE,MAAM,sBAAsB,CAAC;AAEtD,MAAM,QAAQ,GAAG,SAAS,CAAC,gBAAgB,CAAC,CAAC;AAC7C,MAAM,KAAK,GAAG,qBAAqB,CAAC;AAGpC,MAAM,CAAC,KAAK,UAAU,iBAAiB,CAAC,cAAsB;IAC5D,OAAO,yBAAyB,CAAC,cAAc,CAAC,CAAC;AACnD,CAAC;AACD,MAAM,CAAC,KAAK,UAAU,yBAAyB,CAAC,cAAuB;IACrE,MAAM,QAAQ,GAAG,MAAM,iBAAiB,EAAE,CAAC;IAC3C,MAAM,SAAS,GAAG,cAAc,CAAC,CAAC,CAAC,MAAM,QAAQ,CAAC,OAAO,CAAC,cAAc,CAAC,CAAC,CAAC,CAAC,CAAC,QAAQ,EAAE,SAAS,CAAC;IACjG,MAAM,KAAK,GAAG,aAAa,CAAC,CAAC,CAAC,OAAO,CAAC,QAAQ,CAAC,CAAC,CAAC,MAAM,QAAQ,CAAC,OAAO,CAAC,IAAI,CAAC,CAAC,CAAC,IAAI,EAAE,CAAC,CAAC;IACvF,MAAM,QAAQ,GAAG,aAAa,EAAE,CAAC;IACjC,MAAM,KAAK,CAAC,QAAQ,EAAE,EAAE,SAAS,EAAE,IAAI,EAAE,IAAI,EAAE,KAAK,EAAE,CAAC,CAAC;IACxD,IAAI,OAAO,CAAC,QAAQ,KAAK,OAAO;QAAE,MAAM,KAAK,CAAC,QAAQ,EAAE,KAAK,CAAC,CAAC;IAC/D,MAAM,OAAO,GAAG,sBAAsB,CAAC,KAAK,EAAE,SAAS,CAAC,CAAC;IACzD,MAAM,kBAAkB,CAAC,SAAS,CAAC,CAAC;IACpC,IAAI,OAAO,CAAC,QAAQ,KAAK,QAAQ,EAAE,CAAC;QAClC,MAAM,IAAI,GAAG,eAAe,EAAE,CAAC;QAC/B,MAAM,eAAe,CAAC,IAAI,EAAE,gBAAgB,CAAC,OAAO,EAAE,QAAQ,CAAC,CAAC,CAAC;QACjE,MAAM,MAAM,GAAG,OAAO,OAAO,CAAC,MAAM,EAAE,EAAE,IAAI,CAAC,EAAE,CAAC;QAChD,MAAM,QAAQ,CAAC,WAAW,EAAE,CAAC,SAAS,EAAE,MAAM,EAAE,IAAI,CAAC,CAAC,CAAC,KAAK,CAAC,GAAG,EAAE,CAAC,SAAS,CAAC,CAAC;QAC9E,MAAM,QAAQ,CAAC,WAAW,EAAE,CAAC,WAAW,EAAE,MAAM,EAAE,IAAI,CAAC,CAAC,CAAC;QACzD,MAAM,QAAQ,CAAC,WAAW,EAAE,CAAC,WAAW,EAAE,IAAI,EAAE,GAAG,MAAM,IAAI,KAAK,EAAE,CAAC,CAAC,CAAC;IACzE,CAAC;SAAM,IAAI,OAAO,CAAC,QAAQ,KAAK,OAAO,EAAE,CAAC;QACxC,MAAM,eAAe,CAAC,eAAe,EAAE,EAAE,WAAW,CAAC,OAAO,CAAC,CAAC,CAAC;QAC/D,MAAM,QAAQ,CAAC,WAAW,EAAE,CAAC,QAAQ,EAAE,eAAe,CAAC,CAAC,CAAC;QACzD,MAAM,QAAQ,CAAC,WAAW,EAAE,CAAC,QAAQ,EAAE,QAAQ,EAAE,OAAO,EAAE,mBAAmB,CAAC,CAAC,CAAC;QAChF,MAAM,QAAQ,CAAC,WAAW,EAAE,CAAC,QAAQ,EAAE,SAAS,EAAE,mBAAmB,CAAC,CAAC,CAAC;IAC1E,CAAC;SAAM,IAAI,OAAO,CAAC,QAAQ,KAAK,OAAO,EAAE,CAAC;QACxC,MAAM,cAAc,CAAC,SAAS,EAAE,OAAO,CAAC,CAAC;IAC3C,CAAC;;QAAM,MAAM,IAAI,KAAK,CAAC,oEAAoE,CAAC,CAAC;IAC7F,OAAO,aAAa,EAAE,CAAC;AACzB,CAAC;AACD,MAAM,CAAC,KAAK,UAAU,eAAe;IACnC,IAAI,OAAO,CAAC,QAAQ,KAAK,QAAQ,EAAE,CAAC;QAClC,MAAM,MAAM,GAAG,OAAO,OAAO,CAAC,MAAM,EAAE,EAAE,IAAI,CAAC,EAAE,CAAC;QAChD,MAAM,QAAQ,CAAC,WAAW,EAAE,CAAC,WAAW,EAAE,MAAM,EAAE,eAAe,EAAE,CAAC,CAAC,CAAC,KAAK,CAAC,KAAK,IAAI,EAAE;YACrF,MAAM,QAAQ,CAAC,WAAW,EAAE,CAAC,WAAW,EAAE,IAAI,EAAE,GAAG,MAAM,IAAI,KAAK,EAAE,CAAC,CAAC,CAAC;QACzE,CAAC,CAAC,CAAC;IACL,CAAC;SAAM,IAAI,OAAO,CAAC,QAAQ,KAAK,OAAO;QAAE,MAAM,QAAQ,CAAC,WAAW,EAAE,CAAC,QAAQ,EAAE,OAAO,EAAE,mBAAmB,CAAC,CAAC,CAAC;SAC1G,IAAI,OAAO,CAAC,QAAQ,KAAK,OAAO;QAAE,MAAM,cAAc,CAAC,OAAO,CAAC,CAAC;;QAChE,MAAM,IAAI,KAAK,CAAC,qDAAqD,CAAC,CAAC;IAC5E,OAAO,aAAa,EAAE,CAAC;AACzB,CAAC;AACD,MAAM,CAAC,KAAK,UAAU,cAAc;IAClC,IAAI,OAAO,CAAC,QAAQ,KAAK,QAAQ;QAAE,MAAM,QAAQ,CAAC,WAAW,EAAE,CAAC,SAAS,EAAE,OAAO,OAAO,CAAC,MAAM,EAAE,EAAE,IAAI,CAAC,EAAE,EAAE,eAAe,EAAE,CAAC,CAAC,CAAC,KAAK,CAAC,GAAG,EAAE,CAAC,SAAS,CAAC,CAAC;SACnJ,IAAI,OAAO,CAAC,QAAQ,KAAK,OAAO;QAAE,MAAM,QAAQ,CAAC,WAAW,EAAE,CAAC,QAAQ,EAAE,MAAM,EAAE,mBAAmB,CAAC,CAAC,CAAC;SACvG,IAAI,OAAO,CAAC,QAAQ,KAAK,OAAO;QAAE,MAAM,cAAc,CAAC,MAAM,CAAC,CAAC;;QAC/D,MAAM,IAAI,KAAK,CAAC,qDAAqD,CAAC,CAAC;IAC5E,OAAO,aAAa,EAAE,CAAC;AACzB,CAAC;AACD,MAAM,CAAC,KAAK,UAAU,mBAAmB;IACvC,IAAI,OAAO,CAAC,QAAQ,KAAK,OAAO;QAAE,MAAM,cAAc,CAAC,WAAW,CAAC,CAAC;SAC/D,CAAC;QACJ,MAAM,cAAc,EAAE,CAAC;QACvB,IAAI,OAAO,CAAC,QAAQ,KAAK,QAAQ;YAAE,MAAM,EAAE,CAAC,eAAe,EAAE,EAAE,EAAE,KAAK,EAAE,IAAI,EAAE,CAAC,CAAC;aAC3E,IAAI,OAAO,CAAC,QAAQ,KAAK,OAAO,EAAE,CAAC;YACtC,MAAM,QAAQ,CAAC,WAAW,EAAE,CAAC,QAAQ,EAAE,SAAS,EAAE,mBAAmB,CAAC,CAAC,CAAC;YACxE,MAAM,EAAE,CAAC,eAAe,EAAE,EAAE,EAAE,KAAK,EAAE,IAAI,EAAE,CAAC,CAAC;YAC7C,MAAM,QAAQ,CAAC,WAAW,EAAE,CAAC,QAAQ,EAAE,eAAe,CAAC,CAAC,CAAC;QAC3D,CAAC;IACH,CAAC;IACD,MAAM,EAAE,CAAC,iBAAiB,EAAE,EAAE,EAAE,KAAK,EAAE,IAAI,EAAE,CAAC,CAAC;AACjD,CAAC;AACD,MAAM,CAAC,KAAK,UAAU,aAAa;IACjC,MAAM,MAAM,GAAG,MAAM,iBAAiB,EAAE,CAAC;IACzC,MAAM,MAAM,GAAG,EAAE,QAAQ,EAAE,OAAO,CAAC,QAAQ,EAAE,GAAG,CAAC,MAAM,EAAE,SAAS,CAAC,CAAC,CAAC,EAAE,SAAS,EAAE,MAAM,CAAC,SAAS,EAAE,CAAC,CAAC,CAAC,EAAE,CAAC,EAAE,CAAC;IAC7G,IAAI,OAAO,CAAC,QAAQ,KAAK,OAAO;QAAE,OAAO,EAAE,GAAG,MAAM,EAAE,GAAG,MAAM,cAAc,CAAC,QAAQ,CAAC,EAAE,CAAC;IAC1F,IAAI,OAAO,CAAC,QAAQ,KAAK,QAAQ,EAAE,CAAC;QAClC,MAAM,IAAI,GAAG,eAAe,EAAE,EAAE,SAAS,GAAG,MAAM,UAAU,CAAC,IAAI,CAAC,CAAC;QACnE,MAAM,MAAM,GAAG,SAAS,CAAC,CAAC,CAAC,MAAM,QAAQ,CAAC,WAAW,EAAE,CAAC,OAAO,EAAE,OAAO,OAAO,CAAC,MAAM,EAAE,EAAE,IAAI,CAAC,IAAI,KAAK,EAAE,CAAC,CAAC,CAAC,IAAI,CAAC,CAAC,EAAE,MAAM,EAAE,EAAE,EAAE,CAAC,MAAM,EAAE,GAAG,EAAE,CAAC,EAAE,CAAC,CAAC,CAAC,CAAC,EAAE,CAAC;QACzJ,MAAM,GAAG,GAAG,MAAM,CAAC,gBAAgB,CAAC,IAAI,CAAC,MAAM,CAAC,EAAE,CAAC,CAAC,CAAC,CAAC,IAAI,SAAS,CAAC;QACpE,MAAM,MAAM,GAAG,OAAO,CAAC,GAAG,IAAI,oBAAoB,CAAC,IAAI,CAAC,MAAM,CAAC,CAAC,CAAC;QACjE,OAAO,EAAE,GAAG,MAAM,EAAE,SAAS,EAAE,MAAM,EAAE,GAAG,CAAC,GAAG,CAAC,CAAC,CAAC,EAAE,GAAG,EAAE,CAAC,CAAC,CAAC,EAAE,CAAC,EAAE,GAAG,CAAC,SAAS,CAAC,CAAC,CAAC,EAAE,cAAc,EAAE,IAAI,EAAE,CAAC,CAAC,CAAC,EAAE,CAAC,EAAE,CAAC;IACnH,CAAC;IACD,IAAI,OAAO,CAAC,QAAQ,KAAK,OAAO,EAAE,CAAC;QACjC,MAAM,IAAI,GAAG,eAAe,EAAE,EAAE,SAAS,GAAG,MAAM,UAAU,CAAC,IAAI,CAAC,CAAC;QACnE,MAAM,MAAM,GAAG,SAAS,IAAI,MAAM,QAAQ,CAAC,WAAW,EAAE,CAAC,QAAQ,EAAE,WAAW,EAAE,SAAS,EAAE,mBAAmB,CAAC,CAAC,CAAC,IAAI,CAAC,GAAG,EAAE,CAAC,IAAI,EAAE,GAAG,EAAE,CAAC,KAAK,CAAC,CAAC;QAC/I,MAAM,GAAG,GAAG,MAAM,CAAC,CAAC,CAAC,MAAM,QAAQ,CAAC,WAAW,EAAE,CAAC,QAAQ,EAAE,MAAM,EAAE,oBAAoB,EAAE,SAAS,EAAE,mBAAmB,CAAC,CAAC,CAAC,IAAI,CAAC,CAAC,EAAE,MAAM,EAAE,EAAE,EAAE,CAAC,MAAM,CAAC,MAAM,CAAC,IAAI,EAAE,CAAC,IAAI,SAAS,EAAE,GAAG,EAAE,CAAC,SAAS,CAAC,CAAC,CAAC,CAAC,SAAS,CAAC;QACjN,OAAO,EAAE,GAAG,MAAM,EAAE,SAAS,EAAE,MAAM,EAAE,GAAG,CAAC,GAAG,CAAC,CAAC,CAAC,EAAE,GAAG,EAAE,CAAC,CAAC,CAAC,EAAE,CAAC,EAAE,GAAG,CAAC,SAAS,CAAC,CAAC,CAAC,EAAE,cAAc,EAAE,IAAI,EAAE,CAAC,CAAC,CAAC,EAAE,CAAC,EAAE,CAAC;IACnH,CAAC;IACD,OAAO,EAAE,GAAG,MAAM,EAAE,SAAS,EAAE,KAAK,EAAE,MAAM,EAAE,KAAK,EAAE,CAAC;AACxD,CAAC;AAED,2FAA2F;AAC3F,MAAM,UAAU,sBAAsB,CAAC,KAAa,EAAE,SAAkB;IACtE,MAAM,IAAI,GAAG,OAAO,CAAC,GAAG,CAAC,oBAAoB,KAAK,SAAS,CAAC,CAAC,CAAC,gBAAgB,CAAC,CAAC,CAAC,OAAO,CAAC,GAAG,CAAC,sBAAsB,IAAI,MAAM,CAAC;IAC9H,OAAO,kBAAkB,CAAC,KAAK,EAAE,CAAC,KAAK,EAAE,OAAO,EAAE,uBAAuB,EAAE,OAAO,CAAC,OAAO,CAAC,GAAG,CAAC,eAAe,IAAI,IAAI,CAAC,OAAO,EAAE,EAAE,SAAS,CAAC,CAAC;QAC3I,4BAA4B,EAAE,IAAI,EAAE,GAAG,CAAC,SAAS,CAAC,CAAC,CAAC,CAAC,aAAa,EAAE,SAAS,CAAC,CAAC,CAAC,CAAC,CAAC,iBAAiB,CAAC,CAAC,CAAC,CAAC,CAAC;AAC5G,CAAC;AACD,SAAS,cAAc,KAAa,OAAO,IAAI,CAAC,OAAO,CAAC,GAAG,CAAC,eAAe,IAAI,IAAI,CAAC,OAAO,EAAE,EAAE,SAAS,CAAC,EAAE,OAAO,CAAC,CAAC,CAAC,CAAC;AACtH,SAAS,aAAa,KAAa,OAAO,IAAI,CAAC,OAAO,CAAC,GAAG,CAAC,cAAc,IAAI,IAAI,CAAC,OAAO,EAAE,EAAE,QAAQ,EAAE,OAAO,CAAC,EAAE,OAAO,CAAC,CAAC,CAAC,CAAC;AAC5H,SAAS,iBAAiB,KAAa,OAAO,IAAI,CAAC,cAAc,EAAE,EAAE,kBAAkB,CAAC,CAAC,CAAC,CAAC;AAC3F,SAAS,eAAe,KAAa,OAAO,IAAI,CAAC,OAAO,EAAE,EAAE,SAAS,EAAE,cAAc,EAAE,GAAG,KAAK,QAAQ,CAAC,CAAC,CAAC,CAAC;AAC3G,MAAM,UAAU,eAAe,KAAa,OAAO,IAAI,CAAC,OAAO,CAAC,GAAG,CAAC,eAAe,IAAI,IAAI,CAAC,OAAO,EAAE,EAAE,SAAS,CAAC,EAAE,SAAS,EAAE,MAAM,EAAE,mBAAmB,CAAC,CAAC,CAAC,CAAC;AAC7J,KAAK,UAAU,kBAAkB,CAAC,SAAkB;IAClD,MAAM,IAAI,GAAG,iBAAiB,EAAE,CAAC;IACjC,MAAM,KAAK,CAAC,OAAO,CAAC,IAAI,CAAC,EAAE,EAAE,SAAS,EAAE,IAAI,EAAE,IAAI,EAAE,KAAK,EAAE,CAAC,CAAC;IAC7D,MAAM,SAAS,CAAC,IAAI,EAAE,GAAG,IAAI,CAAC,SAAS,CAAC,EAAE,OAAO,EAAE,CAAC,EAAE,GAAG,CAAC,SAAS,CAAC,CAAC,CAAC,EAAE,SAAS,EAAE,CAAC,CAAC,CAAC,EAAE,CAAC,EAAE,EAAE,IAAI,EAAE,CAAC,CAAC,IAAI,EAAE,EAAE,IAAI,EAAE,KAAK,EAAE,CAAC,CAAC;AAC9H,CAAC;AACD,KAAK,UAAU,iBAAiB;IAC9B,MAAM,GAAG,GAAG,MAAM,QAAQ,CAAC,iBAAiB,EAAE,EAAE,MAAM,CAAC,CAAC,KAAK,CAAC,GAAG,EAAE,CAAC,IAAI,CAAC,CAAC;IAC1E,IAAI,CAAC,GAAG;QAAE,OAAO,IAAI,CAAC;IACtB,IAAI,CAAC;QAAC,MAAM,KAAK,GAAG,IAAI,CAAC,KAAK,CAAC,GAAG,CAA4B,CAAC;QAAC,OAAO,KAAK,CAAC,OAAO,KAAK,CAAC,IAAI,KAAK,CAAC,OAAO,KAAK,CAAC,CAAC,CAAC,CAAC,OAAO,KAAK,CAAC,SAAS,KAAK,QAAQ,CAAC,CAAC,CAAC,EAAE,SAAS,EAAE,KAAK,CAAC,SAAS,EAAE,CAAC,CAAC,CAAC,EAAE,CAAC,CAAC,CAAC,IAAI,CAAC;IAAC,CAAC;IACvM,MAAM,CAAC;QAAC,OAAO,IAAI,CAAC;IAAC,CAAC;AACxB,CAAC;AACD,KAAK,UAAU,UAAU,CAAC,IAAY,IAAsB,OAAO,QAAQ,CAAC,IAAI,CAAC,CAAC,IAAI,CAAC,GAAG,EAAE,CAAC,IAAI,EAAE,GAAG,EAAE,CAAC,KAAK,CAAC,CAAC,CAAC,CAAC;AAClH,KAAK,UAAU,eAAe,CAAC,IAAY,EAAE,KAAa;IACxD,MAAM,KAAK,CAAC,OAAO,CAAC,IAAI,CAAC,EAAE,EAAE,SAAS,EAAE,IAAI,EAAE,IAAI,EAAE,KAAK,EAAE,CAAC,CAAC;IAC7D,MAAM,SAAS,CAAC,IAAI,EAAE,KAAK,EAAE,EAAE,IAAI,EAAE,KAAK,EAAE,CAAC,CAAC;AAChD,CAAC;AACD,MAAM,UAAU,gBAAgB,CAAC,OAAiB,EAAE,QAAgB;IAClE,MAAM,YAAY,GAAG,OAAO,CAAC,GAAG,CAAC,CAAC,KAAK,EAAE,EAAE,CAAC,WAAW,GAAG,CAAC,KAAK,CAAC,WAAW,CAAC,CAAC,IAAI,CAAC,EAAE,CAAC,CAAC;IACvF,OAAO,wMAAwM,KAAK,gDAAgD,YAAY,yEAAyE,GAAG,CAAC,OAAO,CAAC,GAAG,CAAC,IAAI,IAAI,8BAA8B,CAAC,+GAA+G,GAAG,CAAC,IAAI,CAAC,QAAQ,EAAE,SAAS,CAAC,CAAC,kDAAkD,GAAG,CAAC,IAAI,CAAC,QAAQ,EAAE,SAAS,CAAC,CAAC,8BAA8B,CAAC;AAC9oB,CAAC;AACD,MAAM,UAAU,WAAW,CAAC,OAAiB;IAC3C,MAAM,IAAI,GAAG,OAAO,CAAC,GAAG,CAAC,YAAY,CAAC,CAAC,IAAI,CAAC,GAAG,CAAC,CAAC;IACjD,OAAO,4GAA4G,IAAI,+CAA+C,YAAY,CAAC,QAAQ,OAAO,CAAC,GAAG,CAAC,IAAI,IAAI,8BAA8B,EAAE,CAAC,0CAA0C,CAAC;AAC7R,CAAC;AACD,SAAS,GAAG,CAAC,KAAa;IACxB,IAAI,kBAAkB,CAAC,IAAI,CAAC,KAAK,CAAC;QAAE,MAAM,IAAI,KAAK,CAAC,+CAA+C,CAAC,CAAC;IACrG,OAAO,KAAK,CAAC,OAAO,CAAC,KAAK,EAAE,OAAO,CAAC,CAAC,OAAO,CAAC,KAAK,EAAE,MAAM,CAAC,CAAC,OAAO,CAAC,KAAK,EAAE,MAAM,CAAC,CAAC,OAAO,CAAC,KAAK,EAAE,QAAQ,CAAC,CAAC,OAAO,CAAC,KAAK,EAAE,QAAQ,CAAC,CAAC;AACvI,CAAC;AACD,SAAS,YAAY,CAAC,KAAa;IACjC,IAAI,kBAAkB,CAAC,IAAI,CAAC,KAAK,CAAC;QAAE,MAAM,IAAI,KAAK,CAAC,+CAA+C,CAAC,CAAC;IACrG,OAAO,GAAG,GAAG,KAAK,CAAC,OAAO,CAAC,KAAK,EAAE,IAAI,CAAC,CAAC,OAAO,CAAC,MAAM,EAAE,GAAG,EAAE,CAAC,IAAI,CAAC,CAAC,OAAO,CAAC,MAAM,EAAE,MAAM,CAAC,CAAC,OAAO,CAAC,KAAK,EAAE,KAAK,CAAC,GAAG,GAAG,CAAC;AAC1H,CAAC;AAED,mGAAmG;AACnG,MAAM,CAAC,KAAK,UAAU,cAAc;IAClC,MAAM,IAAI,GAAG,OAAO,CAAC,QAAQ,KAAK,QAAQ,CAAC,CAAC,CAAC,eAAe,EAAE,CAAC,CAAC,CAAC,OAAO,CAAC,QAAQ,KAAK,OAAO,CAAC,CAAC,CAAC,eAAe,EAAE,CAAC,CAAC,CAAC,IAAI,CAAC;IACzH,OAAO,IAAI,CAAC,CAAC,CAAC,mBAAmB,CAAC,OAAO,CAAC,QAAQ,EAAE,MAAM,QAAQ,CAAC,IAAI,EAAE,MAAM,CAAC,CAAC,CAAC,CAAC,CAAC,IAAI,CAAC;AAC3F,CAAC;AAED,MAAM,UAAU,mBAAmB,CAAC,QAAgB,EAAE,IAAY;IAChE,IAAI,QAAQ,KAAK,QAAQ,EAAE,CAAC;QAC1B,MAAM,KAAK,GAAG,4DAA4D,CAAC,IAAI,CAAC,IAAI,CAAC,EAAE,CAAC,CAAC,CAAC,CAAC;QAC3F,IAAI,CAAC,KAAK;YAAE,OAAO,IAAI,CAAC;QACxB,OAAO,CAAC,GAAG,KAAK,CAAC,QAAQ,CAAC,gCAAgC,CAAC,CAAC,CAAC,GAAG,CAAC,CAAC,CAAC,EAAE,EAAE,CAAC,CAAC,CAAC,CAAC,CAAE;aAC1E,OAAO,CAAC,UAAU,EAAE,GAAG,CAAC,CAAC,OAAO,CAAC,UAAU,EAAE,IAAI,CAAC,CAAC,OAAO,CAAC,QAAQ,EAAE,GAAG,CAAC,CAAC,OAAO,CAAC,QAAQ,EAAE,GAAG,CAAC,CAAC,OAAO,CAAC,SAAS,EAAE,GAAG,CAAC,CAAC,CAAC;IAC/H,CAAC;IACD,IAAI,QAAQ,KAAK,OAAO,EAAE,CAAC;QACzB,MAAM,IAAI,GAAG,oBAAoB,CAAC,IAAI,CAAC,IAAI,CAAC,EAAE,CAAC,CAAC,CAAC,CAAC;QAClD,IAAI,CAAC,IAAI,IAAI,CAAC,8BAA8B,CAAC,IAAI,CAAC,IAAI,CAAC;YAAE,OAAO,IAAI,CAAC;QACrE,OAAO,CAAC,GAAG,IAAI,CAAC,QAAQ,CAAC,uBAAuB,CAAC,CAAC,CAAC,GAAG,CAAC,CAAC,CAAC,EAAE,EAAE,CAAC,CAAC,CAAC,CAAC,CAAE;aAChE,OAAO,CAAC,aAAa,EAAE,IAAI,CAAC,CAAC,OAAO,CAAC,MAAM,EAAE,GAAG,CAAC,CAAC,OAAO,CAAC,QAAQ,EAAE,GAAG,CAAC,CAAC,CAAC;IAC/E,CAAC;IACD,OAAO,IAAI,CAAC;AACd,CAAC"}
|
|
@@ -0,0 +1,24 @@
|
|
|
1
|
+
export type InstallMethod = "standalone" | "npm" | "bun" | "source" | "unknown";
|
|
2
|
+
export interface Installation {
|
|
3
|
+
method: InstallMethod;
|
|
4
|
+
entry: string;
|
|
5
|
+
platform: NodeJS.Platform;
|
|
6
|
+
manager?: string;
|
|
7
|
+
prefix?: string;
|
|
8
|
+
reason?: string;
|
|
9
|
+
}
|
|
10
|
+
export type CommandRunner = (file: string, args: string[]) => Promise<string>;
|
|
11
|
+
export declare const runCommand: CommandRunner;
|
|
12
|
+
export declare function findExecutable(name: string): Promise<string | undefined>;
|
|
13
|
+
export declare function inspectInstallation(options?: {
|
|
14
|
+
entry?: string;
|
|
15
|
+
executable?: string;
|
|
16
|
+
standalone?: boolean;
|
|
17
|
+
platform?: NodeJS.Platform;
|
|
18
|
+
find?: typeof findExecutable;
|
|
19
|
+
run?: CommandRunner;
|
|
20
|
+
}): Promise<Installation>;
|
|
21
|
+
export declare function packageArguments(installation: Installation, version: string): string[];
|
|
22
|
+
export declare function shellQuote(value: string, windows?: boolean): string;
|
|
23
|
+
/** Copyable instructions only: no self-replacement process on Windows. */
|
|
24
|
+
export declare function manualUpgradeCommand(installation: Installation, version: string, serviceActive?: boolean): string;
|
|
@@ -0,0 +1,137 @@
|
|
|
1
|
+
import { execFile as execFileCallback } from "node:child_process";
|
|
2
|
+
import { access, lstat, readFile, realpath } from "node:fs/promises";
|
|
3
|
+
import { constants } from "node:fs";
|
|
4
|
+
import { homedir } from "node:os";
|
|
5
|
+
import { basename, delimiter, dirname, join, resolve } from "node:path";
|
|
6
|
+
import { promisify } from "node:util";
|
|
7
|
+
import { IS_STANDALONE } from "../cli-launch.js";
|
|
8
|
+
const execFile = promisify(execFileCallback);
|
|
9
|
+
export const runCommand = async (file, args) => {
|
|
10
|
+
// npm's Windows shim is not an executable. Invoke the packaged npm CLI with Node.
|
|
11
|
+
if (process.platform === "win32" && /npm\.cmd$/iu.test(file)) {
|
|
12
|
+
const cli = join(dirname(file), "node_modules", "npm", "bin", "npm-cli.js");
|
|
13
|
+
return (await execFile(process.execPath, [cli, ...args], { cwd: homedir(), timeout: 5000, maxBuffer: 1024 * 1024 })).stdout.trim();
|
|
14
|
+
}
|
|
15
|
+
return (await execFile(file, args, { cwd: homedir(), timeout: 5000, maxBuffer: 1024 * 1024 })).stdout.trim();
|
|
16
|
+
};
|
|
17
|
+
export async function findExecutable(name) {
|
|
18
|
+
for (const directory of (process.env.PATH ?? "").split(delimiter).filter(Boolean)) {
|
|
19
|
+
for (const suffix of process.platform === "win32" ? [".exe", ".cmd", ""] : [""]) {
|
|
20
|
+
const path = resolve(directory, name + suffix);
|
|
21
|
+
if (await access(path, constants.X_OK).then(() => true, () => false))
|
|
22
|
+
return path;
|
|
23
|
+
}
|
|
24
|
+
}
|
|
25
|
+
return undefined;
|
|
26
|
+
}
|
|
27
|
+
export async function inspectInstallation(options = {}) {
|
|
28
|
+
const platform = options.platform ?? process.platform;
|
|
29
|
+
const standalone = options.standalone ?? IS_STANDALONE;
|
|
30
|
+
const original = standalone ? options.executable ?? process.execPath : options.entry ?? process.argv[1] ?? "";
|
|
31
|
+
const entry = await realpath(original).catch(() => resolve(original));
|
|
32
|
+
const base = { entry, platform };
|
|
33
|
+
if (standalone) {
|
|
34
|
+
if ((await lstat(original)).isSymbolicLink())
|
|
35
|
+
return { ...base, method: "unknown", reason: "The executable is managed through a symbolic link. Update it using its owner." };
|
|
36
|
+
return { ...base, method: "standalone" };
|
|
37
|
+
}
|
|
38
|
+
const root = dirname(dirname(entry));
|
|
39
|
+
const metadata = await readFile(join(root, "package.json"), "utf8").then((raw) => JSON.parse(raw), () => null).catch(() => null);
|
|
40
|
+
if (metadata?.name !== "frely-cli")
|
|
41
|
+
return { ...base, method: "unknown", reason: "Cannot identify this installation's package root." };
|
|
42
|
+
if (await lstat(join(root, ".git")).then(() => true, () => false))
|
|
43
|
+
return { ...base, method: "source", reason: "Source checkout or local link. Update and build the checkout using its development workflow." };
|
|
44
|
+
const find = options.find ?? findExecutable, run = options.run ?? runCommand;
|
|
45
|
+
const candidates = [];
|
|
46
|
+
const npm = await find("npm");
|
|
47
|
+
if (npm) {
|
|
48
|
+
try {
|
|
49
|
+
const globalRoot = await run(npm, ["root", "--global"]);
|
|
50
|
+
const expected = join(globalRoot, "frely-cli");
|
|
51
|
+
if (!(await lstat(expected)).isSymbolicLink() && await realpath(expected) === root) {
|
|
52
|
+
const prefix = await run(npm, ["prefix", "--global"]);
|
|
53
|
+
candidates.push({ ...base, method: "npm", manager: npm, prefix });
|
|
54
|
+
}
|
|
55
|
+
}
|
|
56
|
+
catch { /* A missing/broken manager is not proof of ownership. */ }
|
|
57
|
+
if (!candidates.length && basename(dirname(root)) === "node_modules") {
|
|
58
|
+
// An explicit `npm install -g --prefix ...` need not be the manager's current default.
|
|
59
|
+
const prefix = platform === "win32" ? dirname(dirname(root)) : basename(dirname(dirname(root))) === "lib" ? dirname(dirname(dirname(root))) : undefined;
|
|
60
|
+
if (prefix)
|
|
61
|
+
try {
|
|
62
|
+
const wrapper = platform === "win32" ? join(prefix, "frely.cmd") : join(prefix, "bin", "frely");
|
|
63
|
+
const wrapperMatches = platform === "win32"
|
|
64
|
+
? /node_modules[\\/]+frely-cli[\\/]+dist[\\/]+index\.js/iu.test(await readFile(wrapper, "utf8"))
|
|
65
|
+
: await realpath(wrapper) === entry;
|
|
66
|
+
const globalRoot = await run(npm, ["root", "--global", "--prefix", prefix]);
|
|
67
|
+
const expected = join(globalRoot, "frely-cli");
|
|
68
|
+
if (wrapperMatches && !(await lstat(expected)).isSymbolicLink() && await realpath(expected) === root) {
|
|
69
|
+
candidates.push({ ...base, method: "npm", manager: npm, prefix });
|
|
70
|
+
}
|
|
71
|
+
}
|
|
72
|
+
catch { /* No matching global wrapper: leave project dependencies untouched. */ }
|
|
73
|
+
}
|
|
74
|
+
}
|
|
75
|
+
const bun = await find("bun");
|
|
76
|
+
if (bun) {
|
|
77
|
+
try {
|
|
78
|
+
const bin = await run(bun, ["pm", "bin", "--global"]);
|
|
79
|
+
let linkedEntry;
|
|
80
|
+
if (platform === "win32") {
|
|
81
|
+
// Bun uses an executable shim on Windows. Recognize its standard global tree;
|
|
82
|
+
// an unrecognized custom layout stays manual rather than guessing ownership.
|
|
83
|
+
const expected = join(process.env.BUN_INSTALL || join(homedir(), ".bun"), "install", "global", "node_modules", "frely-cli");
|
|
84
|
+
if (await realpath(expected) !== root || !(await lstat(join(bin, "frely.exe"))).isFile())
|
|
85
|
+
throw new Error("Unknown Bun shim.");
|
|
86
|
+
linkedEntry = entry;
|
|
87
|
+
}
|
|
88
|
+
else
|
|
89
|
+
linkedEntry = await realpath(join(bin, "frely"));
|
|
90
|
+
// Bun links its global bin to dist/index.js on POSIX. A source/file dependency is not a registry install.
|
|
91
|
+
const globalMetadata = JSON.parse(await readFile(join(dirname(dirname(root)), "package.json"), "utf8"));
|
|
92
|
+
const spec = globalMetadata.dependencies?.["frely-cli"];
|
|
93
|
+
if (linkedEntry === entry && spec && /^(?:[~^]?[0-9]|latest$|next$)/u.test(spec) && !(await lstat(root)).isSymbolicLink()) {
|
|
94
|
+
candidates.push({ ...base, method: "bun", manager: bun });
|
|
95
|
+
}
|
|
96
|
+
}
|
|
97
|
+
catch { /* Never guess Bun ownership from the runtime or PATH alone. */ }
|
|
98
|
+
}
|
|
99
|
+
return candidates.length === 1 ? candidates[0] : { ...base, method: "unknown", reason: "This is a project, temporary runner, local link, or unrecognized global installation. Update it with the original installer." };
|
|
100
|
+
}
|
|
101
|
+
export function packageArguments(installation, version) {
|
|
102
|
+
return installation.method === "npm"
|
|
103
|
+
? ["install", "--global", "--ignore-scripts", "--prefix", installation.prefix, `frely-cli@${version}`]
|
|
104
|
+
: ["add", "--global", "--ignore-scripts", `frely-cli@${version}`];
|
|
105
|
+
}
|
|
106
|
+
export function shellQuote(value, windows = false) {
|
|
107
|
+
return "'" + value.replace(/'/gu, windows ? "''" : "'\\''") + "'";
|
|
108
|
+
}
|
|
109
|
+
/** Copyable instructions only: no self-replacement process on Windows. */
|
|
110
|
+
export function manualUpgradeCommand(installation, version, serviceActive = false) {
|
|
111
|
+
const windows = installation.platform === "win32";
|
|
112
|
+
const quote = (s) => shellQuote(s, windows);
|
|
113
|
+
let command;
|
|
114
|
+
if (installation.method === "npm" || installation.method === "bun") {
|
|
115
|
+
command = `${windows ? "& " : ""}${quote(installation.manager)} ${packageArguments(installation, version).map(quote).join(" ")}`;
|
|
116
|
+
if (windows)
|
|
117
|
+
command += "; if ($LASTEXITCODE -ne 0) { throw 'Frely installation failed' }";
|
|
118
|
+
}
|
|
119
|
+
else if (installation.method === "standalone") {
|
|
120
|
+
const base = `https://github.com/FrelyHQ/frely-cli/releases/download/v${version}`;
|
|
121
|
+
command = windows
|
|
122
|
+
? `$env:FRELY_CLI_VERSION = ${quote(version)}; $env:FRELY_INSTALL_DIR = ${quote(dirname(installation.entry))}; $env:FRELY_INSTALL_NO_PROFILE = '1'; & ([scriptblock]::Create((Invoke-WebRequest ${quote(base + "/install.ps1")} -UseBasicParsing).Content))`
|
|
123
|
+
: `curl -fsSL ${quote(base + "/install.sh")} | FRELY_CLI_VERSION=${quote(version)} FRELY_INSTALL_DIR=${quote(dirname(installation.entry))} FRELY_INSTALL_NO_PROFILE=1 sh`;
|
|
124
|
+
}
|
|
125
|
+
else
|
|
126
|
+
return installation.reason ?? "Update this installation using its original installer.";
|
|
127
|
+
if (windows) {
|
|
128
|
+
const frely = installation.method === "standalone" ? `& ${quote(installation.entry)}` : `& ${quote(process.execPath)} ${quote(installation.entry)}`;
|
|
129
|
+
const body = serviceActive
|
|
130
|
+
? `${frely} mcp service stop; if ($LASTEXITCODE -ne 0) { throw 'Could not stop Frely service' }; try { ${command} } finally { ${frely} mcp service start }`
|
|
131
|
+
: command;
|
|
132
|
+
// Child PowerShell keeps installer environment changes out of the user's shell.
|
|
133
|
+
return `powershell -NoProfile -Command ${quote(`$ErrorActionPreference = 'Stop'; ${body}`)}`;
|
|
134
|
+
}
|
|
135
|
+
return command;
|
|
136
|
+
}
|
|
137
|
+
//# sourceMappingURL=installation.js.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"installation.js","sourceRoot":"","sources":["../../src/upgrade/installation.ts"],"names":[],"mappings":"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"}
|
|
@@ -0,0 +1,15 @@
|
|
|
1
|
+
/** An existing relay owns this gate; no updater daemon or remote upgrade jobs. */
|
|
2
|
+
export declare class MaintenanceGate {
|
|
3
|
+
private paused;
|
|
4
|
+
private requests;
|
|
5
|
+
private readonly processes;
|
|
6
|
+
enter(): () => void;
|
|
7
|
+
track(): () => void;
|
|
8
|
+
registerProcesses(count: () => number): () => void;
|
|
9
|
+
pause(): void;
|
|
10
|
+
resume(): void;
|
|
11
|
+
get idle(): boolean;
|
|
12
|
+
}
|
|
13
|
+
export declare function maintenancePath(pid: number): string;
|
|
14
|
+
export declare function serveMaintenance(gate: MaintenanceGate, path?: string): Promise<() => Promise<void>>;
|
|
15
|
+
export declare function acquireMaintenance(pid: number, path?: string): Promise<() => void>;
|
|
@@ -0,0 +1,133 @@
|
|
|
1
|
+
import { createConnection, createServer } from "node:net";
|
|
2
|
+
import { chmod, lstat, mkdir, rm } from "node:fs/promises";
|
|
3
|
+
import { homedir } from "node:os";
|
|
4
|
+
import { dirname, join } from "node:path";
|
|
5
|
+
/** An existing relay owns this gate; no updater daemon or remote upgrade jobs. */
|
|
6
|
+
export class MaintenanceGate {
|
|
7
|
+
paused = false;
|
|
8
|
+
requests = 0;
|
|
9
|
+
processes = new Set();
|
|
10
|
+
enter() {
|
|
11
|
+
if (this.paused)
|
|
12
|
+
throw new Error("Frely is preparing an upgrade. Retry after it completes.");
|
|
13
|
+
return this.track();
|
|
14
|
+
}
|
|
15
|
+
track() {
|
|
16
|
+
this.requests++;
|
|
17
|
+
let done = false;
|
|
18
|
+
return () => { if (!done) {
|
|
19
|
+
done = true;
|
|
20
|
+
this.requests--;
|
|
21
|
+
} };
|
|
22
|
+
}
|
|
23
|
+
registerProcesses(count) {
|
|
24
|
+
this.processes.add(count);
|
|
25
|
+
return () => this.processes.delete(count);
|
|
26
|
+
}
|
|
27
|
+
pause() {
|
|
28
|
+
if (this.paused)
|
|
29
|
+
throw new Error("Another upgrade holds this service.");
|
|
30
|
+
this.paused = true;
|
|
31
|
+
}
|
|
32
|
+
resume() { this.paused = false; }
|
|
33
|
+
get idle() { return this.requests === 0 && [...this.processes].every((count) => count() === 0); }
|
|
34
|
+
}
|
|
35
|
+
export function maintenancePath(pid) {
|
|
36
|
+
return join(process.env.XDG_CONFIG_HOME || join(homedir(), ".config"), "frely", `upgrade-${pid}.sock`);
|
|
37
|
+
}
|
|
38
|
+
export async function serveMaintenance(gate, path = maintenancePath(process.pid)) {
|
|
39
|
+
await mkdir(dirname(path), { recursive: true, mode: 0o700 });
|
|
40
|
+
const directory = await lstat(dirname(path));
|
|
41
|
+
if (directory.isSymbolicLink() || !directory.isDirectory() || directory.uid !== process.getuid?.())
|
|
42
|
+
throw new Error("Unsafe maintenance directory.");
|
|
43
|
+
await chmod(dirname(path), 0o700);
|
|
44
|
+
let owner;
|
|
45
|
+
const sockets = new Set();
|
|
46
|
+
const server = createServer((socket) => {
|
|
47
|
+
sockets.add(socket);
|
|
48
|
+
socket.on("error", () => socket.destroy());
|
|
49
|
+
socket.on("close", () => { sockets.delete(socket); if (owner === socket) {
|
|
50
|
+
owner = undefined;
|
|
51
|
+
gate.resume();
|
|
52
|
+
} });
|
|
53
|
+
socket.setTimeout(2000, () => socket.destroy());
|
|
54
|
+
let input = "";
|
|
55
|
+
socket.on("data", (data) => {
|
|
56
|
+
input += data.toString("utf8");
|
|
57
|
+
if (input.length > 32 || owner === socket) {
|
|
58
|
+
socket.destroy();
|
|
59
|
+
return;
|
|
60
|
+
}
|
|
61
|
+
if (!input.includes("\n"))
|
|
62
|
+
return;
|
|
63
|
+
if (input !== "drain\n" || owner) {
|
|
64
|
+
socket.end("busy\n");
|
|
65
|
+
return;
|
|
66
|
+
}
|
|
67
|
+
// The runtime may own maintenance for an external installation refresh.
|
|
68
|
+
try {
|
|
69
|
+
gate.pause();
|
|
70
|
+
}
|
|
71
|
+
catch {
|
|
72
|
+
socket.end("busy\n");
|
|
73
|
+
return;
|
|
74
|
+
}
|
|
75
|
+
owner = socket;
|
|
76
|
+
socket.setTimeout(0);
|
|
77
|
+
const deadline = Date.now() + 3000;
|
|
78
|
+
const interval = setInterval(() => {
|
|
79
|
+
if (gate.idle) {
|
|
80
|
+
clearInterval(interval);
|
|
81
|
+
socket.write("ready\n");
|
|
82
|
+
}
|
|
83
|
+
else if (Date.now() >= deadline) {
|
|
84
|
+
clearInterval(interval);
|
|
85
|
+
socket.end("busy\n");
|
|
86
|
+
}
|
|
87
|
+
}, 50);
|
|
88
|
+
socket.once("close", () => clearInterval(interval));
|
|
89
|
+
});
|
|
90
|
+
});
|
|
91
|
+
server.maxConnections = 4;
|
|
92
|
+
// Refuse an existing socket instead of unlinking another runtime's endpoint.
|
|
93
|
+
await new Promise((resolve, reject) => {
|
|
94
|
+
server.once("error", reject);
|
|
95
|
+
server.listen(path, () => { server.off("error", reject); resolve(); });
|
|
96
|
+
});
|
|
97
|
+
await chmod(path, 0o600);
|
|
98
|
+
return async () => {
|
|
99
|
+
for (const socket of sockets)
|
|
100
|
+
socket.destroy();
|
|
101
|
+
await new Promise((resolve) => server.close(() => resolve()));
|
|
102
|
+
await rm(path, { force: true });
|
|
103
|
+
};
|
|
104
|
+
}
|
|
105
|
+
export async function acquireMaintenance(pid, path = maintenancePath(pid)) {
|
|
106
|
+
const info = await lstat(path).catch(() => null);
|
|
107
|
+
if (!info?.isSocket() || info.uid !== process.getuid?.() || (info.mode & 0o077) !== 0) {
|
|
108
|
+
throw new Error("The running service has no private upgrade endpoint. Finish its tasks and restart it from a local terminal before upgrading.");
|
|
109
|
+
}
|
|
110
|
+
return new Promise((resolve, reject) => {
|
|
111
|
+
const socket = createConnection(path);
|
|
112
|
+
const fail = () => { socket.destroy(); reject(new Error("The service is busy or cannot enter maintenance. Finish its tasks, then run frely upgrade in a local terminal.")); };
|
|
113
|
+
socket.setTimeout(5000, fail);
|
|
114
|
+
socket.once("error", fail);
|
|
115
|
+
socket.once("connect", () => socket.write("drain\n"));
|
|
116
|
+
let text = "", ready = false;
|
|
117
|
+
socket.on("data", (data) => {
|
|
118
|
+
text += data.toString("utf8");
|
|
119
|
+
if (text.length > 32 || (text.includes("\n") && text !== "ready\n")) {
|
|
120
|
+
fail();
|
|
121
|
+
return;
|
|
122
|
+
}
|
|
123
|
+
if (text === "ready\n") {
|
|
124
|
+
ready = true;
|
|
125
|
+
socket.setTimeout(0);
|
|
126
|
+
resolve(() => socket.destroy());
|
|
127
|
+
}
|
|
128
|
+
});
|
|
129
|
+
socket.once("close", () => { if (!ready)
|
|
130
|
+
fail(); });
|
|
131
|
+
});
|
|
132
|
+
}
|
|
133
|
+
//# sourceMappingURL=maintenance.js.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"maintenance.js","sourceRoot":"","sources":["../../src/upgrade/maintenance.ts"],"names":[],"mappings":"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"}
|
|
@@ -0,0 +1,9 @@
|
|
|
1
|
+
import type { Installation } from "./installation.js";
|
|
2
|
+
export interface Release {
|
|
3
|
+
version: string;
|
|
4
|
+
baseUrl?: string;
|
|
5
|
+
}
|
|
6
|
+
export declare function stableVersion(value: unknown): string;
|
|
7
|
+
export declare function compareVersions(a: string, b: string): number;
|
|
8
|
+
export declare function latestRelease(installation: Installation, request?: typeof fetch): Promise<Release>;
|
|
9
|
+
export declare function standaloneAsset(platform?: NodeJS.Platform, arch?: NodeJS.Architecture, target?: string | undefined): string;
|
|
@@ -0,0 +1,45 @@
|
|
|
1
|
+
export function stableVersion(value) {
|
|
2
|
+
if (typeof value !== "string" || !/^(0|[1-9]\d*)\.(0|[1-9]\d*)\.(0|[1-9]\d*)$/u.test(value))
|
|
3
|
+
throw new Error("Release source did not return a stable version.");
|
|
4
|
+
return value;
|
|
5
|
+
}
|
|
6
|
+
export function compareVersions(a, b) {
|
|
7
|
+
const parse = (v) => {
|
|
8
|
+
const core = v.split("-")[0].split("+")[0];
|
|
9
|
+
return stableVersion(core).split(".").map(BigInt);
|
|
10
|
+
};
|
|
11
|
+
const aa = parse(a), bb = parse(b);
|
|
12
|
+
for (let i = 0; i < 3; i++)
|
|
13
|
+
if (aa[i] !== bb[i])
|
|
14
|
+
return aa[i] > bb[i] ? 1 : -1;
|
|
15
|
+
return a.includes("-") === b.includes("-") ? 0 : a.includes("-") ? -1 : 1;
|
|
16
|
+
}
|
|
17
|
+
export async function latestRelease(installation, request = fetch) {
|
|
18
|
+
const standalone = installation.method === "standalone";
|
|
19
|
+
const response = await request(standalone
|
|
20
|
+
? "https://api.github.com/repos/FrelyHQ/frely-cli/releases/latest"
|
|
21
|
+
: "https://registry.npmjs.org/frely-cli/latest", {
|
|
22
|
+
headers: { accept: "application/json", "user-agent": "frely-cli" },
|
|
23
|
+
signal: AbortSignal.timeout(4000), redirect: "error",
|
|
24
|
+
});
|
|
25
|
+
if (!response.ok)
|
|
26
|
+
throw new Error(`Release lookup failed (HTTP ${response.status}).`);
|
|
27
|
+
const text = await response.text();
|
|
28
|
+
if (text.length > 1024 * 1024)
|
|
29
|
+
throw new Error("Release metadata is too large.");
|
|
30
|
+
const data = JSON.parse(text);
|
|
31
|
+
if (standalone && (data.draft !== false || data.prerelease !== false))
|
|
32
|
+
throw new Error("GitHub release is not a stable published release.");
|
|
33
|
+
const version = stableVersion(standalone ? String(data.tag_name).replace(/^v/u, "") : data.version);
|
|
34
|
+
if (!standalone && data.name !== "frely-cli")
|
|
35
|
+
throw new Error("Release package name does not match frely-cli.");
|
|
36
|
+
return { version, ...(standalone ? { baseUrl: `https://github.com/FrelyHQ/frely-cli/releases/download/v${version}` } : {}) };
|
|
37
|
+
}
|
|
38
|
+
export function standaloneAsset(platform = process.platform, arch = process.arch, target = typeof FRELY_BUILD_TARGET === "string" ? FRELY_BUILD_TARGET : undefined) {
|
|
39
|
+
// Compiled target includes libc, so an Alpine executable never changes distribution during an upgrade.
|
|
40
|
+
const value = target ?? `${platform === "win32" ? "windows" : platform}-${arch}`;
|
|
41
|
+
if (!/^(?:darwin-(?:arm64|x64)|linux-(?:arm64|x64)(?:-musl)?|windows-(?:arm64|x64))$/u.test(value))
|
|
42
|
+
throw new Error("This platform has no standalone release.");
|
|
43
|
+
return `frely-${value}${value.startsWith("windows") ? ".exe" : ""}`;
|
|
44
|
+
}
|
|
45
|
+
//# sourceMappingURL=release.js.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"release.js","sourceRoot":"","sources":["../../src/upgrade/release.ts"],"names":[],"mappings":"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"}
|
|
@@ -0,0 +1,38 @@
|
|
|
1
|
+
import { type DiagnosticLog } from "../runtime/diagnostics.js";
|
|
2
|
+
import { type Installation } from "./installation.js";
|
|
3
|
+
import type { MaintenanceGate } from "./maintenance.js";
|
|
4
|
+
export interface InstalledCandidate {
|
|
5
|
+
fingerprint: string;
|
|
6
|
+
version: string;
|
|
7
|
+
}
|
|
8
|
+
export interface RefreshProbe {
|
|
9
|
+
read(): Promise<InstalledCandidate>;
|
|
10
|
+
verify(candidate: InstalledCandidate): Promise<boolean>;
|
|
11
|
+
}
|
|
12
|
+
/** Inspect only the installation this process already runs; never follow PATH or download code. */
|
|
13
|
+
export declare function installationProbe(installation: Installation): RefreshProbe;
|
|
14
|
+
/** One tick at a time. Busy work keeps its connection and admission; only idle runtimes drain. */
|
|
15
|
+
export declare class ServiceRefresh {
|
|
16
|
+
private readonly options;
|
|
17
|
+
private candidate;
|
|
18
|
+
private checking;
|
|
19
|
+
private restarting;
|
|
20
|
+
private deferredFingerprint;
|
|
21
|
+
constructor(options: {
|
|
22
|
+
probe: RefreshProbe;
|
|
23
|
+
gate: MaintenanceGate;
|
|
24
|
+
signal: AbortSignal;
|
|
25
|
+
restart: () => void;
|
|
26
|
+
log?: DiagnosticLog;
|
|
27
|
+
currentVersion?: string;
|
|
28
|
+
});
|
|
29
|
+
check(): Promise<void>;
|
|
30
|
+
}
|
|
31
|
+
/** Only an already-running managed POSIX service watches its supported installation. */
|
|
32
|
+
export declare function watchServiceInstallation(options: {
|
|
33
|
+
gate: MaintenanceGate;
|
|
34
|
+
signal: AbortSignal;
|
|
35
|
+
restart: () => void;
|
|
36
|
+
log?: DiagnosticLog;
|
|
37
|
+
onEnabled?: () => void;
|
|
38
|
+
}): Promise<() => void>;
|
|
@@ -0,0 +1,138 @@
|
|
|
1
|
+
import { execFile as execFileCallback } from "node:child_process";
|
|
2
|
+
import { readFile, stat } from "node:fs/promises";
|
|
3
|
+
import { dirname, join } from "node:path";
|
|
4
|
+
import { homedir } from "node:os";
|
|
5
|
+
import { promisify } from "node:util";
|
|
6
|
+
import { VERSION } from "../version.js";
|
|
7
|
+
import { diagnostic } from "../runtime/diagnostics.js";
|
|
8
|
+
import { inspectInstallation } from "./installation.js";
|
|
9
|
+
const execFile = promisify(execFileCallback);
|
|
10
|
+
/** Inspect only the installation this process already runs; never follow PATH or download code. */
|
|
11
|
+
export function installationProbe(installation) {
|
|
12
|
+
let standaloneCache;
|
|
13
|
+
const version = async () => {
|
|
14
|
+
const standalone = installation.method === "standalone";
|
|
15
|
+
const result = await execFile(standalone ? installation.entry : process.execPath, standalone ? ["--version"] : [installation.entry, "--version"], { cwd: homedir(), timeout: 10000, maxBuffer: 65536 });
|
|
16
|
+
const value = result.stdout.trim();
|
|
17
|
+
if (!/^\d+\.\d+\.\d+(?:-[0-9A-Za-z.-]+)?(?:\+[0-9A-Za-z.-]+)?$/u.test(value))
|
|
18
|
+
throw new Error("Invalid installed CLI version.");
|
|
19
|
+
return value;
|
|
20
|
+
};
|
|
21
|
+
const fingerprint = async () => {
|
|
22
|
+
const files = installation.method === "standalone" ? [installation.entry]
|
|
23
|
+
: [installation.entry, join(dirname(dirname(installation.entry)), "package.json")];
|
|
24
|
+
return (await Promise.all(files.map(async (path) => {
|
|
25
|
+
const info = await stat(path, { bigint: true });
|
|
26
|
+
if (!info.isFile())
|
|
27
|
+
throw new Error("Installed CLI file is unavailable.");
|
|
28
|
+
return [info.dev, info.ino, info.size, info.mtimeNs, info.ctimeNs].join(":");
|
|
29
|
+
}))).join("|");
|
|
30
|
+
};
|
|
31
|
+
return {
|
|
32
|
+
async read() {
|
|
33
|
+
const before = await fingerprint();
|
|
34
|
+
let installed;
|
|
35
|
+
if (installation.method === "standalone") {
|
|
36
|
+
if (standaloneCache?.fingerprint === before)
|
|
37
|
+
return standaloneCache;
|
|
38
|
+
installed = await version();
|
|
39
|
+
}
|
|
40
|
+
else {
|
|
41
|
+
const metadata = JSON.parse(await readFile(join(dirname(dirname(installation.entry)), "package.json"), "utf8"));
|
|
42
|
+
if (metadata.name !== "frely-cli" || typeof metadata.version !== "string")
|
|
43
|
+
throw new Error("Installed package is unavailable.");
|
|
44
|
+
installed = metadata.version;
|
|
45
|
+
}
|
|
46
|
+
if (before !== await fingerprint())
|
|
47
|
+
throw new Error("Installation is changing.");
|
|
48
|
+
const candidate = { fingerprint: before, version: installed };
|
|
49
|
+
if (installation.method === "standalone")
|
|
50
|
+
standaloneCache = candidate;
|
|
51
|
+
return candidate;
|
|
52
|
+
},
|
|
53
|
+
async verify(candidate) {
|
|
54
|
+
return await fingerprint() === candidate.fingerprint && await version() === candidate.version
|
|
55
|
+
&& await fingerprint() === candidate.fingerprint;
|
|
56
|
+
},
|
|
57
|
+
};
|
|
58
|
+
}
|
|
59
|
+
/** One tick at a time. Busy work keeps its connection and admission; only idle runtimes drain. */
|
|
60
|
+
export class ServiceRefresh {
|
|
61
|
+
options;
|
|
62
|
+
candidate;
|
|
63
|
+
checking = false;
|
|
64
|
+
restarting = false;
|
|
65
|
+
deferredFingerprint;
|
|
66
|
+
constructor(options) {
|
|
67
|
+
this.options = options;
|
|
68
|
+
}
|
|
69
|
+
async check() {
|
|
70
|
+
if (this.checking || this.restarting || this.options.signal.aborted)
|
|
71
|
+
return;
|
|
72
|
+
this.checking = true;
|
|
73
|
+
let paused = false;
|
|
74
|
+
const { probe, gate, signal, restart, log } = this.options;
|
|
75
|
+
try {
|
|
76
|
+
const candidate = await probe.read();
|
|
77
|
+
if (candidate.version === (this.options.currentVersion ?? VERSION)) {
|
|
78
|
+
this.candidate = undefined;
|
|
79
|
+
return;
|
|
80
|
+
}
|
|
81
|
+
// Two observations, separated by the polling interval, avoid switching during package extraction.
|
|
82
|
+
if (this.candidate?.fingerprint !== candidate.fingerprint || this.candidate.version !== candidate.version) {
|
|
83
|
+
this.candidate = candidate;
|
|
84
|
+
return;
|
|
85
|
+
}
|
|
86
|
+
if (signal.aborted)
|
|
87
|
+
return;
|
|
88
|
+
if (!gate.idle) {
|
|
89
|
+
if (this.deferredFingerprint !== candidate.fingerprint) {
|
|
90
|
+
diagnostic(log, "relay.upgrade_deferred");
|
|
91
|
+
this.deferredFingerprint = candidate.fingerprint;
|
|
92
|
+
}
|
|
93
|
+
return;
|
|
94
|
+
}
|
|
95
|
+
// An explicit frely upgrade may already own maintenance. Never resume another owner's gate.
|
|
96
|
+
try {
|
|
97
|
+
gate.pause();
|
|
98
|
+
paused = true;
|
|
99
|
+
}
|
|
100
|
+
catch {
|
|
101
|
+
return;
|
|
102
|
+
}
|
|
103
|
+
if (!await probe.verify(candidate) || signal.aborted || !gate.idle)
|
|
104
|
+
return;
|
|
105
|
+
diagnostic(log, "relay.upgrade_restart");
|
|
106
|
+
restart();
|
|
107
|
+
this.restarting = true;
|
|
108
|
+
// Keep admission closed while the relay flushes and exits. Its existing supervisor restarts it.
|
|
109
|
+
}
|
|
110
|
+
catch {
|
|
111
|
+
// Missing files and unsuccessful startup are expected during external installation.
|
|
112
|
+
// Keep the loaded runtime alive and require two fresh observations before retrying.
|
|
113
|
+
this.candidate = undefined;
|
|
114
|
+
}
|
|
115
|
+
finally {
|
|
116
|
+
if (paused && !this.restarting)
|
|
117
|
+
gate.resume();
|
|
118
|
+
this.checking = false;
|
|
119
|
+
}
|
|
120
|
+
}
|
|
121
|
+
}
|
|
122
|
+
/** Only an already-running managed POSIX service watches its supported installation. */
|
|
123
|
+
export async function watchServiceInstallation(options) {
|
|
124
|
+
if (options.signal.aborted || !["darwin", "linux"].includes(process.platform))
|
|
125
|
+
return () => { };
|
|
126
|
+
const installation = await inspectInstallation();
|
|
127
|
+
if (options.signal.aborted || !["standalone", "npm", "bun"].includes(installation.method))
|
|
128
|
+
return () => { };
|
|
129
|
+
options.onEnabled?.();
|
|
130
|
+
const refresh = new ServiceRefresh({ ...options, probe: installationProbe(installation) });
|
|
131
|
+
const timer = setInterval(() => { void refresh.check(); }, 5000);
|
|
132
|
+
timer.unref();
|
|
133
|
+
const close = () => { clearInterval(timer); options.signal.removeEventListener("abort", close); };
|
|
134
|
+
options.signal.addEventListener("abort", close, { once: true });
|
|
135
|
+
void refresh.check();
|
|
136
|
+
return close;
|
|
137
|
+
}
|
|
138
|
+
//# sourceMappingURL=service-refresh.js.map
|