crewly 1.20.298 → 1.20.300
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/config/skills/orchestrator/drive-logs/SKILL.md +42 -0
- package/config/skills/orchestrator/drive-logs/execute.sh +37 -0
- package/dist/backend/backend/src/constants.d.ts +9 -0
- package/dist/backend/backend/src/constants.d.ts.map +1 -1
- package/dist/backend/backend/src/constants.js +9 -0
- package/dist/backend/backend/src/constants.js.map +1 -1
- package/dist/backend/backend/src/controllers/drive-logs/drive-logs.controller.d.ts +31 -0
- package/dist/backend/backend/src/controllers/drive-logs/drive-logs.controller.d.ts.map +1 -0
- package/dist/backend/backend/src/controllers/drive-logs/drive-logs.controller.js +58 -0
- package/dist/backend/backend/src/controllers/drive-logs/drive-logs.controller.js.map +1 -0
- package/dist/backend/backend/src/controllers/messaging/messenger.routes.d.ts.map +1 -1
- package/dist/backend/backend/src/controllers/messaging/messenger.routes.js +2 -1
- package/dist/backend/backend/src/controllers/messaging/messenger.routes.js.map +1 -1
- package/dist/backend/backend/src/index.d.ts.map +1 -1
- package/dist/backend/backend/src/index.js +7 -0
- package/dist/backend/backend/src/index.js.map +1 -1
- package/dist/backend/backend/src/routes/api.routes.d.ts.map +1 -1
- package/dist/backend/backend/src/routes/api.routes.js +3 -0
- package/dist/backend/backend/src/routes/api.routes.js.map +1 -1
- package/dist/backend/backend/src/services/briefing/briefing.service.d.ts +15 -0
- package/dist/backend/backend/src/services/briefing/briefing.service.d.ts.map +1 -1
- package/dist/backend/backend/src/services/briefing/briefing.service.js +6 -0
- package/dist/backend/backend/src/services/briefing/briefing.service.js.map +1 -1
- package/dist/backend/backend/src/services/cloud/cloud-client.service.d.ts +2 -19
- package/dist/backend/backend/src/services/cloud/cloud-client.service.d.ts.map +1 -1
- package/dist/backend/backend/src/services/cloud/cloud-client.service.js +14 -10
- package/dist/backend/backend/src/services/cloud/cloud-client.service.js.map +1 -1
- package/dist/backend/backend/src/services/cloud/cloud-config-file.d.ts +84 -0
- package/dist/backend/backend/src/services/cloud/cloud-config-file.d.ts.map +1 -0
- package/dist/backend/backend/src/services/cloud/cloud-config-file.js +86 -0
- package/dist/backend/backend/src/services/cloud/cloud-config-file.js.map +1 -0
- package/dist/backend/backend/src/services/cloud/cloud-disconnect-notice.service.d.ts +5 -0
- package/dist/backend/backend/src/services/cloud/cloud-disconnect-notice.service.d.ts.map +1 -1
- package/dist/backend/backend/src/services/cloud/cloud-disconnect-notice.service.js +9 -3
- package/dist/backend/backend/src/services/cloud/cloud-disconnect-notice.service.js.map +1 -1
- package/dist/backend/backend/src/services/cloud/cloud-disconnect-notice.utils.d.ts +5 -1
- package/dist/backend/backend/src/services/cloud/cloud-disconnect-notice.utils.d.ts.map +1 -1
- package/dist/backend/backend/src/services/cloud/cloud-disconnect-notice.utils.js +17 -3
- package/dist/backend/backend/src/services/cloud/cloud-disconnect-notice.utils.js.map +1 -1
- package/dist/backend/backend/src/services/cloud/cloud-sync.service.d.ts.map +1 -1
- package/dist/backend/backend/src/services/cloud/cloud-sync.service.js +2 -1
- package/dist/backend/backend/src/services/cloud/cloud-sync.service.js.map +1 -1
- package/dist/backend/backend/src/services/cloud/device-identity.service.d.ts.map +1 -1
- package/dist/backend/backend/src/services/cloud/device-identity.service.js +3 -2
- package/dist/backend/backend/src/services/cloud/device-identity.service.js.map +1 -1
- package/dist/backend/backend/src/services/core/api-token.service.d.ts.map +1 -1
- package/dist/backend/backend/src/services/core/api-token.service.js +2 -3
- package/dist/backend/backend/src/services/core/api-token.service.js.map +1 -1
- package/dist/backend/backend/src/services/drive/drive-agent.service.d.ts +10 -1
- package/dist/backend/backend/src/services/drive/drive-agent.service.d.ts.map +1 -1
- package/dist/backend/backend/src/services/drive/drive-agent.service.js +25 -3
- package/dist/backend/backend/src/services/drive/drive-agent.service.js.map +1 -1
- package/dist/backend/backend/src/services/drive/drive-briefing-snapshot.d.ts +5 -1
- package/dist/backend/backend/src/services/drive/drive-briefing-snapshot.d.ts.map +1 -1
- package/dist/backend/backend/src/services/drive/drive-briefing-snapshot.js +8 -2
- package/dist/backend/backend/src/services/drive/drive-briefing-snapshot.js.map +1 -1
- package/dist/backend/backend/src/services/drive/drive-briefing.contract.d.ts +32 -0
- package/dist/backend/backend/src/services/drive/drive-briefing.contract.d.ts.map +1 -1
- package/dist/backend/backend/src/services/drive/drive-briefing.wiring.d.ts +3 -0
- package/dist/backend/backend/src/services/drive/drive-briefing.wiring.d.ts.map +1 -1
- package/dist/backend/backend/src/services/drive/drive-briefing.wiring.js +2 -1
- package/dist/backend/backend/src/services/drive/drive-briefing.wiring.js.map +1 -1
- package/dist/backend/backend/src/services/drive/drive-cloud.contract.d.ts +1 -1
- package/dist/backend/backend/src/services/drive/drive-cloud.contract.d.ts.map +1 -1
- package/dist/backend/backend/src/services/drive/drive-cloud.contract.js +1 -1
- package/dist/backend/backend/src/services/drive/drive-cloud.contract.js.map +1 -1
- package/dist/backend/backend/src/services/drive/drive-log.store.d.ts +81 -0
- package/dist/backend/backend/src/services/drive/drive-log.store.d.ts.map +1 -0
- package/dist/backend/backend/src/services/drive/drive-log.store.js +140 -0
- package/dist/backend/backend/src/services/drive/drive-log.store.js.map +1 -0
- package/dist/backend/backend/src/services/drive/drive-org-overview.d.ts +45 -0
- package/dist/backend/backend/src/services/drive/drive-org-overview.d.ts.map +1 -0
- package/dist/backend/backend/src/services/drive/drive-org-overview.js +102 -0
- package/dist/backend/backend/src/services/drive/drive-org-overview.js.map +1 -0
- package/dist/backend/backend/src/utils/file-io.utils.d.ts +66 -5
- package/dist/backend/backend/src/utils/file-io.utils.d.ts.map +1 -1
- package/dist/backend/backend/src/utils/file-io.utils.js +169 -15
- package/dist/backend/backend/src/utils/file-io.utils.js.map +1 -1
- package/dist/backend/build-info.json +2 -2
- package/dist/cli/backend/src/constants.d.ts +9 -0
- package/dist/cli/backend/src/constants.d.ts.map +1 -1
- package/dist/cli/backend/src/constants.js +9 -0
- package/dist/cli/backend/src/constants.js.map +1 -1
- package/dist/cli/backend/src/services/cloud/cloud-client.service.d.ts +2 -19
- package/dist/cli/backend/src/services/cloud/cloud-client.service.d.ts.map +1 -1
- package/dist/cli/backend/src/services/cloud/cloud-client.service.js +14 -10
- package/dist/cli/backend/src/services/cloud/cloud-client.service.js.map +1 -1
- package/dist/cli/backend/src/services/cloud/cloud-config-file.d.ts +84 -0
- package/dist/cli/backend/src/services/cloud/cloud-config-file.d.ts.map +1 -0
- package/dist/cli/backend/src/services/cloud/cloud-config-file.js +86 -0
- package/dist/cli/backend/src/services/cloud/cloud-config-file.js.map +1 -0
- package/dist/cli/backend/src/services/cloud/cloud-sync.service.d.ts.map +1 -1
- package/dist/cli/backend/src/services/cloud/cloud-sync.service.js +2 -1
- package/dist/cli/backend/src/services/cloud/cloud-sync.service.js.map +1 -1
- package/dist/cli/backend/src/services/cloud/device-identity.service.d.ts.map +1 -1
- package/dist/cli/backend/src/services/cloud/device-identity.service.js +3 -2
- package/dist/cli/backend/src/services/cloud/device-identity.service.js.map +1 -1
- package/dist/cli/backend/src/services/core/api-token.service.d.ts.map +1 -1
- package/dist/cli/backend/src/services/core/api-token.service.js +2 -3
- package/dist/cli/backend/src/services/core/api-token.service.js.map +1 -1
- package/dist/cli/backend/src/utils/file-io.utils.d.ts +66 -5
- package/dist/cli/backend/src/utils/file-io.utils.d.ts.map +1 -1
- package/dist/cli/backend/src/utils/file-io.utils.js +169 -15
- package/dist/cli/backend/src/utils/file-io.utils.js.map +1 -1
- package/dist/cli/cli/src/commands/cloud.d.ts.map +1 -1
- package/dist/cli/cli/src/commands/cloud.js +10 -28
- package/dist/cli/cli/src/commands/cloud.js.map +1 -1
- package/package.json +1 -1
|
@@ -7,7 +7,8 @@
|
|
|
7
7
|
*
|
|
8
8
|
* @module services/cloud/device-identity.service
|
|
9
9
|
*/
|
|
10
|
-
import { readFile,
|
|
10
|
+
import { readFile, mkdir } from 'fs/promises';
|
|
11
|
+
import { atomicWriteJson } from '../../utils/file-io.utils.js';
|
|
11
12
|
import { existsSync } from 'fs';
|
|
12
13
|
import { join } from 'path';
|
|
13
14
|
import { homedir, hostname } from 'os';
|
|
@@ -135,7 +136,7 @@ export class DeviceIdentityService {
|
|
|
135
136
|
if (!existsSync(this.crewlyHome)) {
|
|
136
137
|
await mkdir(this.crewlyHome, { recursive: true });
|
|
137
138
|
}
|
|
138
|
-
await
|
|
139
|
+
await atomicWriteJson(this.deviceFilePath, identity);
|
|
139
140
|
}
|
|
140
141
|
catch (error) {
|
|
141
142
|
this.logger.error('Failed to persist device identity', {
|
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"device-identity.service.js","sourceRoot":"","sources":["../../../../../../backend/src/services/cloud/device-identity.service.ts"],"names":[],"mappings":"AAAA;;;;;;;;GAQG;AAEH,OAAO,EAAE,QAAQ,EAAE,
|
|
1
|
+
{"version":3,"file":"device-identity.service.js","sourceRoot":"","sources":["../../../../../../backend/src/services/cloud/device-identity.service.ts"],"names":[],"mappings":"AAAA;;;;;;;;GAQG;AAEH,OAAO,EAAE,QAAQ,EAAE,KAAK,EAAE,MAAM,aAAa,CAAC;AAC9C,OAAO,EAAE,eAAe,EAAE,MAAM,8BAA8B,CAAC;AAC/D,OAAO,EAAE,UAAU,EAAE,MAAM,IAAI,CAAC;AAChC,OAAO,EAAE,IAAI,EAAE,MAAM,MAAM,CAAC;AAC5B,OAAO,EAAE,OAAO,EAAE,QAAQ,EAAE,MAAM,IAAI,CAAC;AACvC,OAAO,EAAE,EAAE,IAAI,MAAM,EAAE,MAAM,MAAM,CAAC;AACpC,OAAO,EAAE,aAAa,EAAwB,MAAM,2BAA2B,CAAC;AAgBhF,0DAA0D;AAC1D,MAAM,WAAW,GAAG,aAAa,CAAC;AAElC;;;;;;;;;;;;GAYG;AACH,MAAM,OAAO,qBAAqB;IACxB,MAAM,CAAC,QAAQ,GAAiC,IAAI,CAAC;IAC5C,MAAM,CAAkB;IACxB,UAAU,CAAS;IACnB,cAAc,CAAS;IAChC,cAAc,GAA0B,IAAI,CAAC;IAErD;;;;OAIG;IACH,YAAY,UAAmB;QAC7B,IAAI,CAAC,MAAM,GAAG,aAAa,CAAC,WAAW,EAAE,CAAC,qBAAqB,CAAC,uBAAuB,CAAC,CAAC;QACzF,IAAI,CAAC,UAAU,GAAG,UAAU,IAAI,IAAI,CAAC,OAAO,EAAE,EAAE,SAAS,CAAC,CAAC;QAC3D,IAAI,CAAC,cAAc,GAAG,IAAI,CAAC,IAAI,CAAC,UAAU,EAAE,WAAW,CAAC,CAAC;IAC3D,CAAC;IAED;;;;OAIG;IACH,MAAM,CAAC,WAAW;QAChB,IAAI,CAAC,qBAAqB,CAAC,QAAQ,EAAE,CAAC;YACpC,qBAAqB,CAAC,QAAQ,GAAG,IAAI,qBAAqB,EAAE,CAAC;QAC/D,CAAC;QACD,OAAO,qBAAqB,CAAC,QAAQ,CAAC;IACxC,CAAC;IAED;;OAEG;IACH,MAAM,CAAC,aAAa;QAClB,qBAAqB,CAAC,QAAQ,GAAG,IAAI,CAAC;IACxC,CAAC;IAED;;;;;;OAMG;IACH,KAAK,CAAC,mBAAmB;QACvB,IAAI,IAAI,CAAC,cAAc,EAAE,CAAC;YACxB,OAAO,IAAI,CAAC,cAAc,CAAC;QAC7B,CAAC;QAED,IAAI,CAAC;YACH,IAAI,UAAU,CAAC,IAAI,CAAC,cAAc,CAAC,EAAE,CAAC;gBACpC,MAAM,OAAO,GAAG,MAAM,QAAQ,CAAC,IAAI,CAAC,cAAc,EAAE,OAAO,CAAC,CAAC;gBAC7D,MAAM,QAAQ,GAAG,IAAI,CAAC,KAAK,CAAC,OAAO,CAAmB,CAAC;gBACvD,IAAI,CAAC,cAAc,GAAG,QAAQ,CAAC;gBAC/B,IAAI,CAAC,MAAM,CAAC,KAAK,CAAC,kCAAkC,EAAE,EAAE,QAAQ,EAAE,QAAQ,CAAC,QAAQ,EAAE,CAAC,CAAC;gBACvF,OAAO,QAAQ,CAAC;YAClB,CAAC;QACH,CAAC;QAAC,OAAO,KAAK,EAAE,CAAC;YACf,IAAI,CAAC,MAAM,CAAC,IAAI,CAAC,kDAAkD,EAAE;gBACnE,KAAK,EAAE,KAAK,YAAY,KAAK,CAAC,CAAC,CAAC,KAAK,CAAC,OAAO,CAAC,CAAC,CAAC,MAAM,CAAC,KAAK,CAAC;aAC9D,CAAC,CAAC;QACL,CAAC;QAED,sBAAsB;QACtB,MAAM,QAAQ,GAAmB;YAC/B,QAAQ,EAAE,MAAM,EAAE;YAClB,UAAU,EAAE,QAAQ,EAAE;YACtB,SAAS,EAAE,IAAI,IAAI,EAAE,CAAC,WAAW,EAAE;YACnC,UAAU,EAAE,IAAI,IAAI,EAAE,CAAC,WAAW,EAAE;SACrC,CAAC;QAEF,MAAM,IAAI,CAAC,eAAe,CAAC,QAAQ,CAAC,CAAC;QACrC,IAAI,CAAC,cAAc,GAAG,QAAQ,CAAC;QAC/B,IAAI,CAAC,MAAM,CAAC,IAAI,CAAC,6BAA6B,EAAE,EAAE,QAAQ,EAAE,QAAQ,CAAC,QAAQ,EAAE,UAAU,EAAE,QAAQ,CAAC,UAAU,EAAE,CAAC,CAAC;QAClH,OAAO,QAAQ,CAAC;IAClB,CAAC;IAED;;OAEG;IACH,KAAK,CAAC,cAAc;QAClB,MAAM,QAAQ,GAAG,MAAM,IAAI,CAAC,mBAAmB,EAAE,CAAC;QAClD,QAAQ,CAAC,UAAU,GAAG,IAAI,IAAI,EAAE,CAAC,WAAW,EAAE,CAAC;QAC/C,MAAM,IAAI,CAAC,eAAe,CAAC,QAAQ,CAAC,CAAC;QACrC,IAAI,CAAC,MAAM,CAAC,KAAK,CAAC,oBAAoB,EAAE,EAAE,QAAQ,EAAE,QAAQ,CAAC,QAAQ,EAAE,CAAC,CAAC;IAC3E,CAAC;IAED;;;;OAIG;IACH,KAAK,CAAC,WAAW;QACf,MAAM,QAAQ,GAAG,MAAM,IAAI,CAAC,mBAAmB,EAAE,CAAC;QAClD,OAAO,QAAQ,CAAC,QAAQ,CAAC;IAC3B,CAAC;IAED;;;;OAIG;IACH,KAAK,CAAC,aAAa;QACjB,MAAM,QAAQ,GAAG,MAAM,IAAI,CAAC,mBAAmB,EAAE,CAAC;QAClD,OAAO,QAAQ,CAAC,UAAU,CAAC;IAC7B,CAAC;IAED;;;;OAIG;IACK,KAAK,CAAC,eAAe,CAAC,QAAwB;QACpD,IAAI,CAAC;YACH,IAAI,CAAC,UAAU,CAAC,IAAI,CAAC,UAAU,CAAC,EAAE,CAAC;gBACjC,MAAM,KAAK,CAAC,IAAI,CAAC,UAAU,EAAE,EAAE,SAAS,EAAE,IAAI,EAAE,CAAC,CAAC;YACpD,CAAC;YACD,MAAM,eAAe,CAAC,IAAI,CAAC,cAAc,EAAE,QAAQ,CAAC,CAAC;QACvD,CAAC;QAAC,OAAO,KAAK,EAAE,CAAC;YACf,IAAI,CAAC,MAAM,CAAC,KAAK,CAAC,mCAAmC,EAAE;gBACrD,KAAK,EAAE,KAAK,YAAY,KAAK,CAAC,CAAC,CAAC,KAAK,CAAC,OAAO,CAAC,CAAC,CAAC,MAAM,CAAC,KAAK,CAAC;aAC9D,CAAC,CAAC;YACH,MAAM,KAAK,CAAC;QACd,CAAC;IACH,CAAC"}
|
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"api-token.service.d.ts","sourceRoot":"","sources":["../../../../../../backend/src/services/core/api-token.service.ts"],"names":[],"mappings":"AAAA;;;;;;;;;;;;;;;;;;GAkBG;
|
|
1
|
+
{"version":3,"file":"api-token.service.d.ts","sourceRoot":"","sources":["../../../../../../backend/src/services/core/api-token.service.ts"],"names":[],"mappings":"AAAA;;;;;;;;;;;;;;;;;;GAkBG;AAeH,kCAAkC;AAClC,MAAM,MAAM,cAAc,GAAG,KAAK,GAAG,MAAM,GAAG,WAAW,CAAC;AAE1D,uEAAuE;AACvE,MAAM,WAAW,gBAAgB;IAC/B,2BAA2B;IAC3B,KAAK,EAAE,MAAM,CAAC;IACd,0BAA0B;IAC1B,MAAM,EAAE,cAAc,CAAC;IACvB,gFAAgF;IAChF,QAAQ,EAAE,MAAM,CAAC;CAClB;AAED;;;;GAIG;AACH,wBAAgB,mBAAmB,IAAI,MAAM,CAE5C;AAED;;;;GAIG;AACH,wBAAgB,gBAAgB,IAAI,MAAM,CAEzC;AA4BD;;;;;;;;GAQG;AACH,wBAAgB,eAAe,IAAI,gBAAgB,CAyBlD;AAED,6CAA6C;AAC7C,MAAM,MAAM,oBAAoB,GAAG,SAAS,GAAG,SAAS,GAAG,SAAS,GAAG,WAAW,GAAG,QAAQ,CAAC;AAE9F;;;;;;;;;;;;;;;;GAgBG;AACH,wBAAgB,oBAAoB,IAAI,oBAAoB,CAY3D;AAED;;;;;;GAMG;AACH,wBAAgB,oBAAoB,IAAI,MAAM,GAAG,IAAI,CAIpD;AAED;;;;GAIG;AACH,wBAAgB,WAAW,IAAI,MAAM,CAEpC;AAED;;;;;GAKG;AACH,wBAAgB,sBAAsB,CAAC,KAAK,GAAE,MAAsB,GAAG,MAAM,CAK5E;AAED;;;;;GAKG;AACH,wBAAgB,cAAc,CAAC,SAAS,EAAE,MAAM,GAAG,IAAI,GAAG,SAAS,GAAG,OAAO,CAU5E;AAED;;;GAGG;AACH,wBAAgB,kBAAkB,IAAI,IAAI,CAGzC"}
|
|
@@ -21,6 +21,7 @@ import * as fs from 'fs';
|
|
|
21
21
|
import * as path from 'path';
|
|
22
22
|
import { createHash, randomBytes, timingSafeEqual } from 'crypto';
|
|
23
23
|
import { getCrewlyHomePath } from './crewly-home.utils.js';
|
|
24
|
+
import { atomicWriteFileSync } from '../../utils/file-io.utils.js';
|
|
24
25
|
import { API_SECURITY_CONSTANTS } from '../../../../config/constants.js';
|
|
25
26
|
/** Lazily-resolved token cache for the process lifetime. */
|
|
26
27
|
let cachedToken = null;
|
|
@@ -65,9 +66,7 @@ function readTokenFile(filePath) {
|
|
|
65
66
|
*/
|
|
66
67
|
function writeTokenFile(filePath, token) {
|
|
67
68
|
fs.mkdirSync(path.dirname(filePath), { recursive: true });
|
|
68
|
-
|
|
69
|
-
// writeFileSync only applies `mode` on creation; enforce it for pre-existing files too.
|
|
70
|
-
fs.chmodSync(filePath, API_SECURITY_CONSTANTS.TOKEN_FILE_MODE);
|
|
69
|
+
atomicWriteFileSync(filePath, `${token}\n`, { mode: API_SECURITY_CONSTANTS.TOKEN_FILE_MODE });
|
|
71
70
|
}
|
|
72
71
|
/**
|
|
73
72
|
* Resolve the active API token with provenance.
|
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"api-token.service.js","sourceRoot":"","sources":["../../../../../../backend/src/services/core/api-token.service.ts"],"names":[],"mappings":"AAAA;;;;;;;;;;;;;;;;;;GAkBG;AAEH,OAAO,KAAK,EAAE,MAAM,IAAI,CAAC;AACzB,OAAO,KAAK,IAAI,MAAM,MAAM,CAAC;AAC7B,OAAO,EAAE,UAAU,EAAE,WAAW,EAAE,eAAe,EAAE,MAAM,QAAQ,CAAC;AAClE,OAAO,EAAE,iBAAiB,EAAE,MAAM,wBAAwB,CAAC;AAC3D,OAAO,EAAE,sBAAsB,EAAE,MAAM,iCAAiC,CAAC;AAEzE,4DAA4D;AAC5D,IAAI,WAAW,GAAkB,IAAI,CAAC;AAEtC,uEAAuE;AACvE,IAAI,YAAY,GAA0B,IAAI,CAAC;AAe/C;;;;GAIG;AACH,MAAM,UAAU,mBAAmB;IACjC,OAAO,IAAI,CAAC,IAAI,CAAC,iBAAiB,EAAE,EAAE,sBAAsB,CAAC,eAAe,CAAC,CAAC;AAChF,CAAC;AAED;;;;GAIG;AACH,MAAM,UAAU,gBAAgB;IAC9B,OAAO,WAAW,CAAC,sBAAsB,CAAC,WAAW,CAAC,CAAC,QAAQ,CAAC,KAAK,CAAC,CAAC;AACzE,CAAC;AAED;;;;;GAKG;AACH,SAAS,aAAa,CAAC,QAAgB;IACrC,IAAI,CAAC;QACH,MAAM,GAAG,GAAG,EAAE,CAAC,YAAY,CAAC,QAAQ,EAAE,MAAM,CAAC,CAAC,IAAI,EAAE,CAAC;QACrD,OAAO,GAAG,CAAC,MAAM,GAAG,CAAC,CAAC,CAAC,CAAC,GAAG,CAAC,CAAC,CAAC,IAAI,CAAC;IACrC,CAAC;IAAC,MAAM,CAAC;QACP,OAAO,IAAI,CAAC;IACd,CAAC;AACH,CAAC;AAED;;;;;GAKG;AACH,SAAS,cAAc,CAAC,QAAgB,EAAE,KAAa;IACrD,EAAE,CAAC,SAAS,CAAC,IAAI,CAAC,OAAO,CAAC,QAAQ,CAAC,EAAE,EAAE,SAAS,EAAE,IAAI,EAAE,CAAC,CAAC;IAC1D,
|
|
1
|
+
{"version":3,"file":"api-token.service.js","sourceRoot":"","sources":["../../../../../../backend/src/services/core/api-token.service.ts"],"names":[],"mappings":"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"}
|
|
@@ -70,11 +70,19 @@ export declare function withFileLock<T>(lockKey: string, operation: () => Promis
|
|
|
70
70
|
* @returns The result of the operation
|
|
71
71
|
*/
|
|
72
72
|
export declare function withOperationLock<T>(lockKey: string, operation: () => Promise<T>): Promise<T>;
|
|
73
|
+
/** Options for the atomic writers. */
|
|
74
|
+
export interface AtomicWriteOptions {
|
|
75
|
+
/** File mode for the new file (e.g. `0o600` for credentials). Default: the process umask. */
|
|
76
|
+
mode?: number;
|
|
77
|
+
}
|
|
73
78
|
/**
|
|
74
|
-
* Write a string to a file atomically (temp file
|
|
79
|
+
* Write a string to a file atomically (temp file in the same directory →
|
|
80
|
+
* fsync → rename).
|
|
75
81
|
*
|
|
76
82
|
* Acquires a per-path file lock so concurrent callers targeting the
|
|
77
|
-
* same path are serialized.
|
|
83
|
+
* same path are serialized. Readers (and a crash at any point) see either
|
|
84
|
+
* the old file or the new one, never a mix; a shorter write can never leave
|
|
85
|
+
* the tail of a longer one behind.
|
|
78
86
|
*
|
|
79
87
|
* **Precondition:** The parent directory must already exist. This function
|
|
80
88
|
* does not create intermediate directories — use {@link ensureDir} first
|
|
@@ -82,15 +90,17 @@ export declare function withOperationLock<T>(lockKey: string, operation: () => P
|
|
|
82
90
|
*
|
|
83
91
|
* @param filePath - Destination file path
|
|
84
92
|
* @param content - String content to write
|
|
93
|
+
* @param options - Optional file mode
|
|
85
94
|
*/
|
|
86
|
-
export declare function atomicWriteFile(filePath: string, content: string): Promise<void>;
|
|
95
|
+
export declare function atomicWriteFile(filePath: string, content: string, options?: AtomicWriteOptions): Promise<void>;
|
|
87
96
|
/**
|
|
88
97
|
* Serialize a JavaScript value to JSON and write it atomically.
|
|
89
98
|
*
|
|
90
99
|
* @param filePath - Destination file path
|
|
91
100
|
* @param data - Value to serialize (via `JSON.stringify`)
|
|
101
|
+
* @param options - Optional file mode
|
|
92
102
|
*/
|
|
93
|
-
export declare function atomicWriteJson<T>(filePath: string, data: T): Promise<void>;
|
|
103
|
+
export declare function atomicWriteJson<T>(filePath: string, data: T, options?: AtomicWriteOptions): Promise<void>;
|
|
94
104
|
/**
|
|
95
105
|
* Synchronous {@link atomicWriteFile} for stores that persist synchronously
|
|
96
106
|
* (temp file in the same directory → fsync → rename).
|
|
@@ -103,8 +113,9 @@ export declare function atomicWriteJson<T>(filePath: string, data: T): Promise<v
|
|
|
103
113
|
*
|
|
104
114
|
* @param filePath - Destination file path
|
|
105
115
|
* @param content - String content to write
|
|
116
|
+
* @param options - Optional file mode
|
|
106
117
|
*/
|
|
107
|
-
export declare function atomicWriteFileSync(filePath: string, content: string): void;
|
|
118
|
+
export declare function atomicWriteFileSync(filePath: string, content: string, options?: AtomicWriteOptions): void;
|
|
108
119
|
/**
|
|
109
120
|
* Where a bad store file is copied: `<file>.corrupt-<ISO timestamp>`
|
|
110
121
|
* (colons and dots replaced so the name is valid everywhere).
|
|
@@ -172,6 +183,56 @@ export declare function readJsonStoreSync<T>(filePath: string, options?: {
|
|
|
172
183
|
validate?: (data: unknown) => string | null;
|
|
173
184
|
logger?: FileIOLogger;
|
|
174
185
|
}): JsonStoreRead<T>;
|
|
186
|
+
/**
|
|
187
|
+
* Decode the first JSON object at the start of `raw` and ignore whatever
|
|
188
|
+
* follows (Python's `json.JSONDecoder.raw_decode`). Recovers a file that holds
|
|
189
|
+
* a valid object followed by the tail of an older, longer write.
|
|
190
|
+
*
|
|
191
|
+
* @param raw - File text
|
|
192
|
+
* @returns The first object and the number of trailing non-whitespace bytes, or null when `raw` does not start with a complete JSON object
|
|
193
|
+
*/
|
|
194
|
+
export declare function decodeFirstJsonObject(raw: string): {
|
|
195
|
+
value: Record<string, unknown>;
|
|
196
|
+
trailingChars: number;
|
|
197
|
+
} | null;
|
|
198
|
+
/** Result of {@link readJsonObjectWithRepairSync}. */
|
|
199
|
+
export type JsonRepairRead<T> = {
|
|
200
|
+
status: 'missing';
|
|
201
|
+
} | {
|
|
202
|
+
status: 'ok';
|
|
203
|
+
data: T;
|
|
204
|
+
repaired: boolean;
|
|
205
|
+
} | {
|
|
206
|
+
status: 'damaged';
|
|
207
|
+
reason: string;
|
|
208
|
+
quarantinedTo: string | null;
|
|
209
|
+
};
|
|
210
|
+
/**
|
|
211
|
+
* Read a JSON object file that holds credentials or other state that must not
|
|
212
|
+
* be silently dropped.
|
|
213
|
+
*
|
|
214
|
+
* - missing → `missing`;
|
|
215
|
+
* - parses and passes `validate` → `ok`;
|
|
216
|
+
* - does not parse, but starts with a complete object that passes `validate`
|
|
217
|
+
* (stale trailing bytes) → the file is rewritten atomically with just that
|
|
218
|
+
* object, a WARN is logged, `ok` with `repaired: true`;
|
|
219
|
+
* - anything else → a copy is kept at `<file>.corrupt-<ts>` and `damaged` is
|
|
220
|
+
* returned (the original is left in place; the next atomic write replaces it).
|
|
221
|
+
* The copy is made once per distinct damaged file content, not on every read.
|
|
222
|
+
*
|
|
223
|
+
* Other read errors (EACCES, EIO…) are rethrown: the file may be fine.
|
|
224
|
+
*
|
|
225
|
+
* @param filePath - File to read
|
|
226
|
+
* @param options.validate - Shape check; return an error text to reject
|
|
227
|
+
* @param options.logger - Optional logger
|
|
228
|
+
* @param options.mode - Mode for the repaired file
|
|
229
|
+
* @returns What was found
|
|
230
|
+
*/
|
|
231
|
+
export declare function readJsonObjectWithRepairSync<T>(filePath: string, options: {
|
|
232
|
+
validate: (data: unknown) => string | null;
|
|
233
|
+
logger?: FileIOLogger;
|
|
234
|
+
mode?: number;
|
|
235
|
+
}): JsonRepairRead<T>;
|
|
175
236
|
/**
|
|
176
237
|
* Read and parse a JSON file safely.
|
|
177
238
|
*
|
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"file-io.utils.d.ts","sourceRoot":"","sources":["../../../../../backend/src/utils/file-io.utils.ts"],"names":[],"mappings":"AAAA;;;;;;;;GAQG;
|
|
1
|
+
{"version":3,"file":"file-io.utils.d.ts","sourceRoot":"","sources":["../../../../../backend/src/utils/file-io.utils.ts"],"names":[],"mappings":"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"}
|
|
@@ -9,6 +9,7 @@
|
|
|
9
9
|
*/
|
|
10
10
|
import * as fs from 'fs/promises';
|
|
11
11
|
import * as fsSync from 'fs';
|
|
12
|
+
import { createHash } from 'crypto';
|
|
12
13
|
/**
|
|
13
14
|
* A JSON store file exists but cannot be read or parsed, AND it could not be
|
|
14
15
|
* copied aside. The caller must not overwrite it: that would destroy the only
|
|
@@ -124,14 +125,24 @@ export async function withFileLock(lockKey, operation) {
|
|
|
124
125
|
export async function withOperationLock(lockKey, operation) {
|
|
125
126
|
return withLock(operationLocks, lockKey, operation);
|
|
126
127
|
}
|
|
127
|
-
// ──────────────────────────────────────────────────────────────────────
|
|
128
|
-
// Atomic write
|
|
129
|
-
// ──────────────────────────────────────────────────────────────────────
|
|
130
128
|
/**
|
|
131
|
-
*
|
|
129
|
+
* Unique sibling temp path (same directory, so the rename stays on one filesystem).
|
|
130
|
+
* Includes the pid so two processes never share a temp file.
|
|
131
|
+
*
|
|
132
|
+
* @param filePath - Destination file
|
|
133
|
+
* @returns Temp path
|
|
134
|
+
*/
|
|
135
|
+
function tempPathFor(filePath) {
|
|
136
|
+
return `${filePath}.tmp.${process.pid}.${Date.now()}.${Math.random().toString(36).substring(2)}`;
|
|
137
|
+
}
|
|
138
|
+
/**
|
|
139
|
+
* Write a string to a file atomically (temp file in the same directory →
|
|
140
|
+
* fsync → rename).
|
|
132
141
|
*
|
|
133
142
|
* Acquires a per-path file lock so concurrent callers targeting the
|
|
134
|
-
* same path are serialized.
|
|
143
|
+
* same path are serialized. Readers (and a crash at any point) see either
|
|
144
|
+
* the old file or the new one, never a mix; a shorter write can never leave
|
|
145
|
+
* the tail of a longer one behind.
|
|
135
146
|
*
|
|
136
147
|
* **Precondition:** The parent directory must already exist. This function
|
|
137
148
|
* does not create intermediate directories — use {@link ensureDir} first
|
|
@@ -139,16 +150,25 @@ export async function withOperationLock(lockKey, operation) {
|
|
|
139
150
|
*
|
|
140
151
|
* @param filePath - Destination file path
|
|
141
152
|
* @param content - String content to write
|
|
153
|
+
* @param options - Optional file mode
|
|
142
154
|
*/
|
|
143
|
-
export async function atomicWriteFile(filePath, content) {
|
|
155
|
+
export async function atomicWriteFile(filePath, content, options = {}) {
|
|
144
156
|
await withFileLock(filePath, async () => {
|
|
145
|
-
const tempPath =
|
|
157
|
+
const tempPath = tempPathFor(filePath);
|
|
146
158
|
try {
|
|
147
|
-
|
|
159
|
+
// 'wx': a fresh file only — never reuse (and never inherit the tail of) an existing one
|
|
160
|
+
await fs.writeFile(tempPath, content, { encoding: 'utf8', flag: 'wx', mode: options.mode });
|
|
148
161
|
// Ensure data hits the disk before the atomic rename
|
|
149
162
|
const handle = await fs.open(tempPath, 'r+');
|
|
150
|
-
|
|
151
|
-
|
|
163
|
+
try {
|
|
164
|
+
await handle.sync();
|
|
165
|
+
}
|
|
166
|
+
finally {
|
|
167
|
+
await handle.close();
|
|
168
|
+
}
|
|
169
|
+
// `mode` is subject to the umask on create; make it exact.
|
|
170
|
+
if (options.mode !== undefined)
|
|
171
|
+
await fs.chmod(tempPath, options.mode);
|
|
152
172
|
await fs.rename(tempPath, filePath);
|
|
153
173
|
}
|
|
154
174
|
catch (error) {
|
|
@@ -168,9 +188,10 @@ export async function atomicWriteFile(filePath, content) {
|
|
|
168
188
|
*
|
|
169
189
|
* @param filePath - Destination file path
|
|
170
190
|
* @param data - Value to serialize (via `JSON.stringify`)
|
|
191
|
+
* @param options - Optional file mode
|
|
171
192
|
*/
|
|
172
|
-
export async function atomicWriteJson(filePath, data) {
|
|
173
|
-
await atomicWriteFile(filePath, JSON.stringify(data, null, 2));
|
|
193
|
+
export async function atomicWriteJson(filePath, data, options = {}) {
|
|
194
|
+
await atomicWriteFile(filePath, JSON.stringify(data, null, 2), options);
|
|
174
195
|
}
|
|
175
196
|
/**
|
|
176
197
|
* Synchronous {@link atomicWriteFile} for stores that persist synchronously
|
|
@@ -184,16 +205,19 @@ export async function atomicWriteJson(filePath, data) {
|
|
|
184
205
|
*
|
|
185
206
|
* @param filePath - Destination file path
|
|
186
207
|
* @param content - String content to write
|
|
208
|
+
* @param options - Optional file mode
|
|
187
209
|
*/
|
|
188
|
-
export function atomicWriteFileSync(filePath, content) {
|
|
189
|
-
const tempPath =
|
|
210
|
+
export function atomicWriteFileSync(filePath, content, options = {}) {
|
|
211
|
+
const tempPath = tempPathFor(filePath);
|
|
190
212
|
let fd = null;
|
|
191
213
|
try {
|
|
192
|
-
fd = fsSync.openSync(tempPath, '
|
|
214
|
+
fd = fsSync.openSync(tempPath, 'wx', options.mode);
|
|
193
215
|
fsSync.writeFileSync(fd, content, 'utf8');
|
|
194
216
|
fsSync.fsyncSync(fd);
|
|
195
217
|
fsSync.closeSync(fd);
|
|
196
218
|
fd = null;
|
|
219
|
+
if (options.mode !== undefined)
|
|
220
|
+
fsSync.chmodSync(tempPath, options.mode);
|
|
197
221
|
fsSync.renameSync(tempPath, filePath);
|
|
198
222
|
}
|
|
199
223
|
catch (error) {
|
|
@@ -352,6 +376,136 @@ function parseStore(raw, validate) {
|
|
|
352
376
|
return rejected ? { ok: false, reason: rejected } : { ok: true, data };
|
|
353
377
|
}
|
|
354
378
|
// ──────────────────────────────────────────────────────────────────────
|
|
379
|
+
// Lenient read + repair (raw_decode style)
|
|
380
|
+
// ──────────────────────────────────────────────────────────────────────
|
|
381
|
+
/**
|
|
382
|
+
* Decode the first JSON object at the start of `raw` and ignore whatever
|
|
383
|
+
* follows (Python's `json.JSONDecoder.raw_decode`). Recovers a file that holds
|
|
384
|
+
* a valid object followed by the tail of an older, longer write.
|
|
385
|
+
*
|
|
386
|
+
* @param raw - File text
|
|
387
|
+
* @returns The first object and the number of trailing non-whitespace bytes, or null when `raw` does not start with a complete JSON object
|
|
388
|
+
*/
|
|
389
|
+
export function decodeFirstJsonObject(raw) {
|
|
390
|
+
const start = raw.search(/\S/);
|
|
391
|
+
if (start < 0 || raw[start] !== '{')
|
|
392
|
+
return null;
|
|
393
|
+
let depth = 0;
|
|
394
|
+
let inString = false;
|
|
395
|
+
let escaped = false;
|
|
396
|
+
for (let i = start; i < raw.length; i++) {
|
|
397
|
+
const ch = raw[i];
|
|
398
|
+
if (inString) {
|
|
399
|
+
if (escaped)
|
|
400
|
+
escaped = false;
|
|
401
|
+
else if (ch === '\\')
|
|
402
|
+
escaped = true;
|
|
403
|
+
else if (ch === '"')
|
|
404
|
+
inString = false;
|
|
405
|
+
continue;
|
|
406
|
+
}
|
|
407
|
+
if (ch === '"')
|
|
408
|
+
inString = true;
|
|
409
|
+
else if (ch === '{')
|
|
410
|
+
depth++;
|
|
411
|
+
else if (ch === '}' && --depth === 0) {
|
|
412
|
+
try {
|
|
413
|
+
const value = JSON.parse(raw.slice(start, i + 1));
|
|
414
|
+
if (typeof value !== 'object' || value === null || Array.isArray(value))
|
|
415
|
+
return null;
|
|
416
|
+
return { value: value, trailingChars: raw.slice(i + 1).trim().length };
|
|
417
|
+
}
|
|
418
|
+
catch {
|
|
419
|
+
return null;
|
|
420
|
+
}
|
|
421
|
+
}
|
|
422
|
+
}
|
|
423
|
+
return null;
|
|
424
|
+
}
|
|
425
|
+
/**
|
|
426
|
+
* Read a JSON object file that holds credentials or other state that must not
|
|
427
|
+
* be silently dropped.
|
|
428
|
+
*
|
|
429
|
+
* - missing → `missing`;
|
|
430
|
+
* - parses and passes `validate` → `ok`;
|
|
431
|
+
* - does not parse, but starts with a complete object that passes `validate`
|
|
432
|
+
* (stale trailing bytes) → the file is rewritten atomically with just that
|
|
433
|
+
* object, a WARN is logged, `ok` with `repaired: true`;
|
|
434
|
+
* - anything else → a copy is kept at `<file>.corrupt-<ts>` and `damaged` is
|
|
435
|
+
* returned (the original is left in place; the next atomic write replaces it).
|
|
436
|
+
* The copy is made once per distinct damaged file content, not on every read.
|
|
437
|
+
*
|
|
438
|
+
* Other read errors (EACCES, EIO…) are rethrown: the file may be fine.
|
|
439
|
+
*
|
|
440
|
+
* @param filePath - File to read
|
|
441
|
+
* @param options.validate - Shape check; return an error text to reject
|
|
442
|
+
* @param options.logger - Optional logger
|
|
443
|
+
* @param options.mode - Mode for the repaired file
|
|
444
|
+
* @returns What was found
|
|
445
|
+
*/
|
|
446
|
+
export function readJsonObjectWithRepairSync(filePath, options) {
|
|
447
|
+
let raw;
|
|
448
|
+
try {
|
|
449
|
+
raw = fsSync.readFileSync(filePath, 'utf-8');
|
|
450
|
+
}
|
|
451
|
+
catch (err) {
|
|
452
|
+
if (err.code === 'ENOENT')
|
|
453
|
+
return { status: 'missing' };
|
|
454
|
+
throw err;
|
|
455
|
+
}
|
|
456
|
+
let reason;
|
|
457
|
+
try {
|
|
458
|
+
const data = JSON.parse(raw);
|
|
459
|
+
const rejected = options.validate(data);
|
|
460
|
+
if (!rejected)
|
|
461
|
+
return { status: 'ok', data: data, repaired: false };
|
|
462
|
+
reason = rejected;
|
|
463
|
+
}
|
|
464
|
+
catch (err) {
|
|
465
|
+
reason = `invalid JSON (${raw.length} bytes): ${errText(err)}`;
|
|
466
|
+
const first = decodeFirstJsonObject(raw);
|
|
467
|
+
if (first && !options.validate(first.value)) {
|
|
468
|
+
try {
|
|
469
|
+
atomicWriteFileSync(filePath, JSON.stringify(first.value, null, 2), { mode: options.mode });
|
|
470
|
+
options.logger?.warn('Repaired a JSON file that had stale trailing bytes after a complete object', {
|
|
471
|
+
filePath, trailingChars: first.trailingChars,
|
|
472
|
+
});
|
|
473
|
+
}
|
|
474
|
+
catch (writeErr) {
|
|
475
|
+
options.logger?.warn('JSON file had stale trailing bytes; using the first object but could not rewrite the file', {
|
|
476
|
+
filePath, error: errText(writeErr),
|
|
477
|
+
});
|
|
478
|
+
}
|
|
479
|
+
return { status: 'ok', data: first.value, repaired: true };
|
|
480
|
+
}
|
|
481
|
+
}
|
|
482
|
+
return { status: 'damaged', reason, quarantinedTo: quarantineOnce(filePath, raw, reason, options.logger) };
|
|
483
|
+
}
|
|
484
|
+
/** Damaged-content signatures already copied aside this process (path → length:hash). */
|
|
485
|
+
const quarantinedContent = new Map();
|
|
486
|
+
/**
|
|
487
|
+
* Copy a damaged file aside, at most once per distinct content.
|
|
488
|
+
*
|
|
489
|
+
* @param filePath - Damaged file
|
|
490
|
+
* @param raw - Its content
|
|
491
|
+
* @param reason - Why it is damaged
|
|
492
|
+
* @param logger - Optional logger
|
|
493
|
+
* @returns Backup path, or null when already copied / the copy failed
|
|
494
|
+
*/
|
|
495
|
+
function quarantineOnce(filePath, raw, reason, logger) {
|
|
496
|
+
const sig = `${raw.length}:${createHash('sha1').update(raw).digest('hex')}`;
|
|
497
|
+
if (quarantinedContent.get(filePath) === sig)
|
|
498
|
+
return null;
|
|
499
|
+
try {
|
|
500
|
+
const target = quarantineCorruptFileSync(filePath, reason, logger);
|
|
501
|
+
quarantinedContent.set(filePath, sig);
|
|
502
|
+
return target;
|
|
503
|
+
}
|
|
504
|
+
catch {
|
|
505
|
+
return null; // already logged by quarantineCorruptFileSync
|
|
506
|
+
}
|
|
507
|
+
}
|
|
508
|
+
// ──────────────────────────────────────────────────────────────────────
|
|
355
509
|
// Safe read
|
|
356
510
|
// ──────────────────────────────────────────────────────────────────────
|
|
357
511
|
/**
|
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"file-io.utils.js","sourceRoot":"","sources":["../../../../../backend/src/utils/file-io.utils.ts"],"names":[],"mappings":"AAAA;;;;;;;;GAQG;AAEH,OAAO,KAAK,EAAE,MAAM,aAAa,CAAC;AAClC,OAAO,KAAK,MAAM,MAAM,IAAI,CAAC;AAa7B;;;;GAIG;AACH,MAAM,OAAO,oBAAqB,SAAQ,KAAK;IAC7C,iCAAiC;IACxB,QAAQ,CAAS;IAC1B,qDAAqD;IAC5C,MAAM,CAAS;IAExB;;;;OAIG;IACH,YAAY,QAAgB,EAAE,MAAc,EAAE,SAAiB;QAC7D,KAAK,CAAC,cAAc,QAAQ,mBAAmB,MAAM,iCAAiC,SAAS,6BAA6B,CAAC,CAAC;QAC9H,IAAI,CAAC,IAAI,GAAG,sBAAsB,CAAC;QACnC,IAAI,CAAC,QAAQ,GAAG,QAAQ,CAAC;QACzB,IAAI,CAAC,MAAM,GAAG,MAAM,CAAC;IACvB,CAAC;CACF;AAQD;;;;;GAKG;AACH,SAAS,OAAO,CAAC,GAAY;IAC3B,OAAO,GAAG,YAAY,KAAK,CAAC,CAAC,CAAC,GAAG,CAAC,OAAO,CAAC,CAAC,CAAC,MAAM,CAAC,GAAG,CAAC,CAAC;AAC1D,CAAC;AAED;;;;;;GAMG;AACH,SAAS,QAAQ,CAAC,MAAgC,EAAE,OAAe,EAAE,IAA6B;IAChG,IAAI,CAAC,MAAM;QAAE,OAAO;IACpB,IAAI,MAAM,CAAC,KAAK;QAAE,MAAM,CAAC,KAAK,CAAC,OAAO,EAAE,IAAI,CAAC,CAAC;;QACzC,MAAM,CAAC,IAAI,CAAC,OAAO,EAAE,IAAI,CAAC,CAAC;AAClC,CAAC;AAED,yEAAyE;AACzE,oEAAoE;AACpE,yEAAyE;AAEzE,MAAM,SAAS,GAA+B,IAAI,GAAG,EAAE,CAAC;AACxD,MAAM,cAAc,GAA+B,IAAI,GAAG,EAAE,CAAC;AAE7D,yEAAyE;AACzE,qBAAqB;AACrB,yEAAyE;AAEzE;;;;GAIG;AACH,MAAM,CAAC,KAAK,UAAU,SAAS,CAAC,OAAe;IAC7C,MAAM,EAAE,CAAC,KAAK,CAAC,OAAO,EAAE,EAAE,SAAS,EAAE,IAAI,EAAE,CAAC,CAAC;AAC/C,CAAC;AAED,yEAAyE;AACzE,WAAW;AACX,yEAAyE;AAEzE;;;;;;GAMG;AACH,KAAK,UAAU,QAAQ,CACrB,OAAmC,EACnC,OAAe,EACf,SAA2B;IAE3B,qEAAqE;IACrE,MAAM,QAAQ,GAAG,OAAO,CAAC,GAAG,CAAC,OAAO,CAAC,IAAI,OAAO,CAAC,OAAO,EAAE,CAAC;IAE3D,IAAI,WAAuB,CAAC;IAC5B,MAAM,MAAM,GAAG,IAAI,OAAO,CAAO,CAAC,OAAO,EAAE,EAAE,GAAG,WAAW,GAAG,OAAO,CAAC,CAAC,CAAC,CAAC,CAAC;IAC1E,OAAO,CAAC,GAAG,CAAC,OAAO,EAAE,MAAM,CAAC,CAAC;IAE7B,yCAAyC;IACzC,MAAM,QAAQ,CAAC;IAEf,IAAI,CAAC;QACH,OAAO,MAAM,SAAS,EAAE,CAAC;IAC3B,CAAC;YAAS,CAAC;QACT,WAAY,EAAE,CAAC;QACf,qDAAqD;QACrD,IAAI,OAAO,CAAC,GAAG,CAAC,OAAO,CAAC,KAAK,MAAM,EAAE,CAAC;YACpC,OAAO,CAAC,MAAM,CAAC,OAAO,CAAC,CAAC;QAC1B,CAAC;IACH,CAAC;AACH,CAAC;AAED;;;;;;GAMG;AACH,MAAM,CAAC,KAAK,UAAU,YAAY,CAAI,OAAe,EAAE,SAA2B;IAChF,OAAO,QAAQ,CAAC,SAAS,EAAE,OAAO,EAAE,SAAS,CAAC,CAAC;AACjD,CAAC;AAED;;;;;;;;;;GAUG;AACH,MAAM,CAAC,KAAK,UAAU,iBAAiB,CAAI,OAAe,EAAE,SAA2B;IACrF,OAAO,QAAQ,CAAC,cAAc,EAAE,OAAO,EAAE,SAAS,CAAC,CAAC;AACtD,CAAC;AAED,yEAAyE;AACzE,gBAAgB;AAChB,yEAAyE;AAEzE;;;;;;;;;;;;GAYG;AACH,MAAM,CAAC,KAAK,UAAU,eAAe,CAAC,QAAgB,EAAE,OAAe;IACrE,MAAM,YAAY,CAAC,QAAQ,EAAE,KAAK,IAAI,EAAE;QACtC,MAAM,QAAQ,GAAG,GAAG,QAAQ,QAAQ,IAAI,CAAC,GAAG,EAAE,IAAI,IAAI,CAAC,MAAM,EAAE,CAAC,QAAQ,CAAC,EAAE,CAAC,CAAC,SAAS,CAAC,CAAC,CAAC,EAAE,CAAC;QAE5F,IAAI,CAAC;YACH,MAAM,EAAE,CAAC,SAAS,CAAC,QAAQ,EAAE,OAAO,EAAE,MAAM,CAAC,CAAC;YAE9C,qDAAqD;YACrD,MAAM,MAAM,GAAG,MAAM,EAAE,CAAC,IAAI,CAAC,QAAQ,EAAE,IAAI,CAAC,CAAC;YAC7C,MAAM,MAAM,CAAC,IAAI,EAAE,CAAC;YACpB,MAAM,MAAM,CAAC,KAAK,EAAE,CAAC;YAErB,MAAM,EAAE,CAAC,MAAM,CAAC,QAAQ,EAAE,QAAQ,CAAC,CAAC;QACtC,CAAC;QAAC,OAAO,KAAK,EAAE,CAAC;YACf,gCAAgC;YAChC,IAAI,CAAC;gBACH,MAAM,EAAE,CAAC,MAAM,CAAC,QAAQ,CAAC,CAAC;YAC5B,CAAC;YAAC,MAAM,CAAC;gBACP,wBAAwB;YAC1B,CAAC;YACD,MAAM,KAAK,CAAC;QACd,CAAC;IACH,CAAC,CAAC,CAAC;AACL,CAAC;AAED;;;;;GAKG;AACH,MAAM,CAAC,KAAK,UAAU,eAAe,CAAI,QAAgB,EAAE,IAAO;IAChE,MAAM,eAAe,CAAC,QAAQ,EAAE,IAAI,CAAC,SAAS,CAAC,IAAI,EAAE,IAAI,EAAE,CAAC,CAAC,CAAC,CAAC;AACjE,CAAC;AAED;;;;;;;;;;;;GAYG;AACH,MAAM,UAAU,mBAAmB,CAAC,QAAgB,EAAE,OAAe;IACnE,MAAM,QAAQ,GAAG,GAAG,QAAQ,QAAQ,IAAI,CAAC,GAAG,EAAE,IAAI,IAAI,CAAC,MAAM,EAAE,CAAC,QAAQ,CAAC,EAAE,CAAC,CAAC,SAAS,CAAC,CAAC,CAAC,EAAE,CAAC;IAC5F,IAAI,EAAE,GAAkB,IAAI,CAAC;IAC7B,IAAI,CAAC;QACH,EAAE,GAAG,MAAM,CAAC,QAAQ,CAAC,QAAQ,EAAE,GAAG,CAAC,CAAC;QACpC,MAAM,CAAC,aAAa,CAAC,EAAE,EAAE,OAAO,EAAE,MAAM,CAAC,CAAC;QAC1C,MAAM,CAAC,SAAS,CAAC,EAAE,CAAC,CAAC;QACrB,MAAM,CAAC,SAAS,CAAC,EAAE,CAAC,CAAC;QACrB,EAAE,GAAG,IAAI,CAAC;QACV,MAAM,CAAC,UAAU,CAAC,QAAQ,EAAE,QAAQ,CAAC,CAAC;IACxC,CAAC;IAAC,OAAO,KAAK,EAAE,CAAC;QACf,IAAI,EAAE,KAAK,IAAI,EAAE,CAAC;YAChB,IAAI,CAAC;gBAAC,MAAM,CAAC,SAAS,CAAC,EAAE,CAAC,CAAC;YAAC,CAAC;YAAC,MAAM,CAAC,CAAC,YAAY,CAAC,CAAC;QACtD,CAAC;QACD,IAAI,CAAC;YAAC,MAAM,CAAC,UAAU,CAAC,QAAQ,CAAC,CAAC;QAAC,CAAC;QAAC,MAAM,CAAC,CAAC,YAAY,CAAC,CAAC;QAC3D,MAAM,KAAK,CAAC;IACd,CAAC;AACH,CAAC;AAED,yEAAyE;AACzE,4BAA4B;AAC5B,yEAAyE;AAEzE;;;;;;;GAOG;AACH,MAAM,UAAU,iBAAiB,CAAC,QAAgB,EAAE,MAAY,IAAI,IAAI,EAAE;IACxE,OAAO,GAAG,QAAQ,YAAY,GAAG,CAAC,WAAW,EAAE,CAAC,OAAO,CAAC,OAAO,EAAE,GAAG,CAAC,EAAE,CAAC;AAC1E,CAAC;AAED;;;;;;;;;;;GAWG;AACH,MAAM,CAAC,KAAK,UAAU,qBAAqB,CAAC,QAAgB,EAAE,MAAc,EAAE,MAAqB;IACjG,MAAM,MAAM,GAAG,iBAAiB,CAAC,QAAQ,CAAC,CAAC;IAC3C,IAAI,CAAC;QACH,MAAM,EAAE,CAAC,QAAQ,CAAC,QAAQ,EAAE,MAAM,CAAC,CAAC;IACtC,CAAC;IAAC,OAAO,OAAO,EAAE,CAAC;QACjB,QAAQ,CAAC,MAAM,EAAE,iFAAiF,EAAE;YAClG,QAAQ,EAAE,MAAM,EAAE,SAAS,EAAE,OAAO,CAAC,OAAO,CAAC;SAC9C,CAAC,CAAC;QACH,MAAM,IAAI,oBAAoB,CAAC,QAAQ,EAAE,MAAM,EAAE,OAAO,CAAC,OAAO,CAAC,CAAC,CAAC;IACrE,CAAC;IACD,QAAQ,CAAC,MAAM,EAAE,4DAA4D,EAAE,EAAE,QAAQ,EAAE,aAAa,EAAE,MAAM,EAAE,MAAM,EAAE,CAAC,CAAC;IAC5H,OAAO,MAAM,CAAC;AAChB,CAAC;AAED;;;;;;;;GAQG;AACH,MAAM,UAAU,yBAAyB,CAAC,QAAgB,EAAE,MAAc,EAAE,MAAqB;IAC/F,MAAM,MAAM,GAAG,iBAAiB,CAAC,QAAQ,CAAC,CAAC;IAC3C,IAAI,CAAC;QACH,MAAM,CAAC,YAAY,CAAC,QAAQ,EAAE,MAAM,CAAC,CAAC;IACxC,CAAC;IAAC,OAAO,OAAO,EAAE,CAAC;QACjB,QAAQ,CAAC,MAAM,EAAE,iFAAiF,EAAE;YAClG,QAAQ,EAAE,MAAM,EAAE,SAAS,EAAE,OAAO,CAAC,OAAO,CAAC;SAC9C,CAAC,CAAC;QACH,MAAM,IAAI,oBAAoB,CAAC,QAAQ,EAAE,MAAM,EAAE,OAAO,CAAC,OAAO,CAAC,CAAC,CAAC;IACrE,CAAC;IACD,QAAQ,CAAC,MAAM,EAAE,4DAA4D,EAAE,EAAE,QAAQ,EAAE,aAAa,EAAE,MAAM,EAAE,MAAM,EAAE,CAAC,CAAC;IAC5H,OAAO,MAAM,CAAC;AAChB,CAAC;AAED;;;;;;;;;;;;;;;;GAgBG;AACH,MAAM,CAAC,KAAK,UAAU,aAAa,CACjC,QAAgB,EAChB,UAAkF,EAAE;IAEpF,IAAI,GAAW,CAAC;IAChB,IAAI,CAAC;QACH,GAAG,GAAG,MAAM,EAAE,CAAC,QAAQ,CAAC,QAAQ,EAAE,OAAO,CAAC,CAAC;IAC7C,CAAC;IAAC,OAAO,GAAG,EAAE,CAAC;QACb,IAAK,GAA6B,CAAC,IAAI,KAAK,QAAQ;YAAE,OAAO,EAAE,MAAM,EAAE,SAAS,EAAE,CAAC;QACnF,qEAAqE;QACrE,uEAAuE;QACvE,yCAAyC;QACzC,MAAM,GAAG,CAAC;IACZ,CAAC;IACD,MAAM,MAAM,GAAG,UAAU,CAAC,GAAG,EAAE,OAAO,CAAC,QAAQ,CAAC,CAAC;IACjD,IAAI,MAAM,CAAC,EAAE;QAAE,OAAO,EAAE,MAAM,EAAE,IAAI,EAAE,IAAI,EAAE,MAAM,CAAC,IAAS,EAAE,CAAC;IAC/D,OAAO,EAAE,MAAM,EAAE,aAAa,EAAE,aAAa,EAAE,MAAM,qBAAqB,CAAC,QAAQ,EAAE,MAAM,CAAC,MAAM,EAAE,OAAO,CAAC,MAAM,CAAC,EAAE,MAAM,EAAE,MAAM,CAAC,MAAM,EAAE,CAAC;AAC/I,CAAC;AAED;;;;;;;;;GASG;AACH,MAAM,UAAU,iBAAiB,CAC/B,QAAgB,EAChB,UAAkF,EAAE;IAEpF,IAAI,GAAW,CAAC;IAChB,IAAI,CAAC;QACH,GAAG,GAAG,MAAM,CAAC,YAAY,CAAC,QAAQ,EAAE,OAAO,CAAC,CAAC;IAC/C,CAAC;IAAC,OAAO,GAAG,EAAE,CAAC;QACb,IAAK,GAA6B,CAAC,IAAI,KAAK,QAAQ;YAAE,OAAO,EAAE,MAAM,EAAE,SAAS,EAAE,CAAC;QACnF,MAAM,GAAG,CAAC,CAAC,oDAAoD;IACjE,CAAC;IACD,MAAM,MAAM,GAAG,UAAU,CAAC,GAAG,EAAE,OAAO,CAAC,QAAQ,CAAC,CAAC;IACjD,IAAI,MAAM,CAAC,EAAE;QAAE,OAAO,EAAE,MAAM,EAAE,IAAI,EAAE,IAAI,EAAE,MAAM,CAAC,IAAS,EAAE,CAAC;IAC/D,OAAO,EAAE,MAAM,EAAE,aAAa,EAAE,aAAa,EAAE,yBAAyB,CAAC,QAAQ,EAAE,MAAM,CAAC,MAAM,EAAE,OAAO,CAAC,MAAM,CAAC,EAAE,MAAM,EAAE,MAAM,CAAC,MAAM,EAAE,CAAC;AAC7I,CAAC;AAED;;;;;;GAMG;AACH,SAAS,UAAU,CAAC,GAAW,EAAE,QAA2C;IAC1E,IAAI,IAAa,CAAC;IAClB,IAAI,CAAC;QACH,IAAI,GAAG,IAAI,CAAC,KAAK,CAAC,GAAG,CAAC,CAAC;IACzB,CAAC;IAAC,OAAO,GAAG,EAAE,CAAC;QACb,OAAO,EAAE,EAAE,EAAE,KAAK,EAAE,MAAM,EAAE,iBAAiB,GAAG,CAAC,MAAM,YAAY,OAAO,CAAC,GAAG,CAAC,EAAE,EAAE,CAAC;IACtF,CAAC;IACD,MAAM,QAAQ,GAAG,QAAQ,EAAE,CAAC,IAAI,CAAC,IAAI,IAAI,CAAC;IAC1C,OAAO,QAAQ,CAAC,CAAC,CAAC,EAAE,EAAE,EAAE,KAAK,EAAE,MAAM,EAAE,QAAQ,EAAE,CAAC,CAAC,CAAC,EAAE,EAAE,EAAE,IAAI,EAAE,IAAI,EAAE,CAAC;AACzE,CAAC;AAED,yEAAyE;AACzE,aAAa;AACb,yEAAyE;AAEzE;;;;;;;;;;;;;;GAcG;AACH,MAAM,CAAC,KAAK,UAAU,YAAY,CAAI,QAAgB,EAAE,YAAe,EAAE,MAAqB;IAC5F,IAAI,GAAW,CAAC;IAChB,IAAI,CAAC;QACH,GAAG,GAAG,MAAM,EAAE,CAAC,QAAQ,CAAC,QAAQ,EAAE,OAAO,CAAC,CAAC;IAC7C,CAAC;IAAC,OAAO,KAAK,EAAE,CAAC;QACf,uDAAuD;QACvD,IAAK,KAA+B,CAAC,IAAI,KAAK,QAAQ,EAAE,CAAC;YACvD,OAAO,YAAY,CAAC;QACtB,CAAC;QACD,MAAM,KAAK,CAAC,CAAC,uCAAuC;IACtD,CAAC;IAED,IAAI,CAAC;QACH,OAAO,IAAI,CAAC,KAAK,CAAC,GAAG,CAAM,CAAC;IAC9B,CAAC;IAAC,OAAO,QAAQ,EAAE,CAAC;QAClB,kEAAkE;QAClE,MAAM,UAAU,GAAG,iBAAiB,CAAC,QAAQ,CAAC,CAAC;QAC/C,IAAI,CAAC;YACH,MAAM,EAAE,CAAC,QAAQ,CAAC,QAAQ,EAAE,UAAU,CAAC,CAAC;YACxC,MAAM,EAAE,IAAI,CAAC,6BAA6B,EAAE,EAAE,QAAQ,EAAE,UAAU,EAAE,CAAC,CAAC;QACxE,CAAC;QAAC,OAAO,OAAO,EAAE,CAAC;YACjB,QAAQ,CAAC,MAAM,EAAE,2EAA2E,EAAE,EAAE,QAAQ,EAAE,CAAC,CAAC;YAC5G,MAAM,IAAI,oBAAoB,CAAC,QAAQ,EAAE,iBAAiB,OAAO,CAAC,QAAQ,CAAC,EAAE,EAAE,OAAO,CAAC,OAAO,CAAC,CAAC,CAAC;QACnG,CAAC;QACD,OAAO,YAAY,CAAC;IACtB,CAAC;AACH,CAAC;AAED,yEAAyE;AACzE,4BAA4B;AAC5B,yEAAyE;AAEzE;;;;;;;;;;;;;;;;;;GAkBG;AACH,MAAM,CAAC,KAAK,UAAU,cAAc,CAClC,QAAgB,EAChB,YAAe,EACf,OAAoC,EACpC,MAAqB;IAErB,OAAO,iBAAiB,CAAC,QAAQ,EAAE,KAAK,IAAI,EAAE;QAC5C,MAAM,IAAI,GAAG,MAAM,YAAY,CAAC,QAAQ,EAAE,YAAY,EAAE,MAAM,CAAC,CAAC;QAChE,MAAM,MAAM,GAAG,MAAM,OAAO,CAAC,IAAI,CAAC,CAAC;QACnC,wEAAwE;QACxE,sEAAsE;QACtE,MAAM,OAAO,GAAG,MAAM,KAAK,SAAS,CAAC,CAAC,CAAC,IAAI,CAAC,CAAC,CAAC,MAAM,CAAC;QACrD,MAAM,eAAe,CAAC,QAAQ,EAAE,OAAO,CAAC,CAAC;QACzC,OAAO,MAAM,CAAC;IAChB,CAAC,CAAC,CAAC;AACL,CAAC;AAED,yEAAyE;AACzE,eAAe;AACf,yEAAyE;AAEzE;;GAEG;AACH,MAAM,UAAU,cAAc;IAC5B,SAAS,CAAC,KAAK,EAAE,CAAC;IAClB,cAAc,CAAC,KAAK,EAAE,CAAC;AACzB,CAAC"}
|
|
1
|
+
{"version":3,"file":"file-io.utils.js","sourceRoot":"","sources":["../../../../../backend/src/utils/file-io.utils.ts"],"names":[],"mappings":"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"}
|
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"cloud.d.ts","sourceRoot":"","sources":["../../../../../cli/src/commands/cloud.ts"],"names":[],"mappings":"AAAA;;;;;;;;;;;;;;;;;;;;;;GAsBG;AAIH,OAAO,IAAI,MAAM,MAAM,CAAC;
|
|
1
|
+
{"version":3,"file":"cloud.d.ts","sourceRoot":"","sources":["../../../../../cli/src/commands/cloud.ts"],"names":[],"mappings":"AAAA;;;;;;;;;;;;;;;;;;;;;;GAsBG;AAIH,OAAO,IAAI,MAAM,MAAM,CAAC;AAUxB,OAAO,EACL,uBAAuB,EAEvB,KAAK,oBAAoB,EAEzB,KAAK,sBAAsB,EAC5B,MAAM,oEAAoE,CAAC;AAuC5E;;;;;;;GAOG;AACH,wBAAgB,iBAAiB,IAAI,MAAM,CAE1C;AAED;;;;GAIG;AACH,wBAAgB,kBAAkB,IAAI,MAAM,CAE3C;AAMD,uCAAuC;AACvC,MAAM,WAAW,YAAY;IAC3B,KAAK,CAAC,EAAE,MAAM,CAAC;IACf,kEAAkE;IAClE,OAAO,CAAC,EAAE,OAAO,CAAC;IAClB,6FAA6F;IAC7F,GAAG,CAAC,EAAE,OAAO,CAAC;IACd,yFAAyF;IACzF,KAAK,CAAC,EAAE,OAAO,CAAC;CACjB;AAED,yCAAyC;AACzC,MAAM,WAAW,SAAS;IACxB,YAAY,EAAE,OAAO,uBAAuB,CAAC;IAC7C,eAAe,EAAE,CAAC,OAAO,EAAE,sBAAsB,KAAK,OAAO,CAAC,oBAAoB,CAAC,CAAC;CACrF;AAQD;;;;;GAKG;AACH,UAAU,gBAAgB;IACxB,QAAQ,EAAE,MAAM,CAAC;IACjB,KAAK,EAAE,MAAM,CAAC;IACd,YAAY,CAAC,EAAE,MAAM,CAAC;IACtB,IAAI,EAAE,MAAM,CAAC;IACb,WAAW,EAAE,MAAM,CAAC;CACrB;AAcD;;;;;;;;GAQG;AACH,wBAAgB,oBAAoB,CAAC,KAAK,EAAE,MAAM,EAAE,YAAY,CAAC,EAAE,MAAM,GAAG,IAAI,CAiB/E;AAED;;;;GAIG;AACH,wBAAgB,oBAAoB,IAAI,gBAAgB,GAAG,IAAI,CAG9D;AAED;;;;;;;;GAQG;AACH,wBAAgB,cAAc,IAAI,OAAO,CA0BxC;AAED;;;;;;GAMG;AACH,wBAAgB,WAAW,CAAC,GAAG,EAAE,MAAM,GAAG,IAAI,CAG7C;AAiCD;;;;;;;;;GASG;AACH,wBAAgB,mBAAmB,IAAI;IACrC,MAAM,EAAE,IAAI,CAAC,MAAM,CAAC;IACpB,IAAI,EAAE,OAAO,CAAC,MAAM,CAAC,CAAC;IACtB,WAAW,EAAE,OAAO,CAAC;QAAE,KAAK,EAAE,MAAM,CAAC;QAAC,YAAY,CAAC,EAAE,MAAM,CAAA;KAAE,CAAC,CAAC;CAChE,CAsDA;AAED;;;;;;;;GAQG;AACH,wBAAgB,cAAc,CAAC,MAAM,EAAE,MAAM,GAAG,OAAO,CAAC,MAAM,CAAC,CAY9D;AAED;;;;;;;;GAQG;AACH,wBAAsB,YAAY,CAAC,OAAO,EAAE,YAAY,EAAE,IAAI,GAAE,SAA8B,GAAG,OAAO,CAAC,IAAI,CAAC,CAuB7G;AA2OD;;;;;GAKG;AACH,wBAAsB,aAAa,IAAI,OAAO,CAAC,IAAI,CAAC,CAqCnD;AAMD;;;;GAIG;AACH,wBAAsB,aAAa,IAAI,OAAO,CAAC,IAAI,CAAC,CAkBnD"}
|
|
@@ -26,11 +26,12 @@ import axios from 'axios';
|
|
|
26
26
|
import http from 'http';
|
|
27
27
|
import readline from 'readline';
|
|
28
28
|
import { exec } from 'child_process';
|
|
29
|
-
import { existsSync
|
|
29
|
+
import { existsSync } from 'fs';
|
|
30
30
|
import { join } from 'path';
|
|
31
31
|
import { hostname, platform } from 'os';
|
|
32
32
|
import { DEFAULT_WEB_PORT } from '../constants.js';
|
|
33
33
|
import { CLOUD_DEVICE_PAIRING_CONSTANTS } from '../../../config/constants.js';
|
|
34
|
+
import { readCloudConfigFile, writeCloudConfigFileSync } from '../../../backend/src/services/cloud/cloud-config-file.js';
|
|
34
35
|
import { getCrewlyHomePath } from '../../../backend/src/services/core/crewly-home.utils.js';
|
|
35
36
|
import { startCloudDevicePairing, waitForCloudDeviceApproval, } from '../../../backend/src/services/cloud/cloud-device-pairing.client.js';
|
|
36
37
|
// ---------------------------------------------------------------------------
|
|
@@ -95,21 +96,10 @@ const DEFAULT_LOGIN_DEPS = {
|
|
|
95
96
|
* @param refreshToken - Optional refresh token for auto-renewal
|
|
96
97
|
*/
|
|
97
98
|
export function saveCloudCredentials(token, refreshToken) {
|
|
98
|
-
|
|
99
|
-
|
|
100
|
-
|
|
101
|
-
|
|
102
|
-
}
|
|
103
|
-
// Merge with existing config to preserve fields the backend may have written
|
|
104
|
-
let existing = {};
|
|
105
|
-
try {
|
|
106
|
-
if (existsSync(configFile)) {
|
|
107
|
-
existing = JSON.parse(readFileSync(configFile, 'utf-8'));
|
|
108
|
-
}
|
|
109
|
-
}
|
|
110
|
-
catch {
|
|
111
|
-
// Ignore parse errors — overwrite with new credentials
|
|
112
|
-
}
|
|
99
|
+
// Merge with existing config to preserve fields the backend may have written.
|
|
100
|
+
// A damaged file reads as "nothing to preserve": this login is the repair.
|
|
101
|
+
const read = readCloudConfigFile();
|
|
102
|
+
const existing = read.status === 'ok' ? read.config : {};
|
|
113
103
|
const credentials = {
|
|
114
104
|
cloudUrl: existing.cloudUrl || CLOUD_API_URL,
|
|
115
105
|
token,
|
|
@@ -119,7 +109,8 @@ export function saveCloudCredentials(token, refreshToken) {
|
|
|
119
109
|
// Preserve existing refreshToken if new one not provided
|
|
120
110
|
...(!refreshToken && existing.refreshToken && { refreshToken: existing.refreshToken }),
|
|
121
111
|
};
|
|
122
|
-
|
|
112
|
+
// Atomic + owner-only: the backend may be rewriting this file at the same moment.
|
|
113
|
+
writeCloudConfigFileSync(credentials);
|
|
123
114
|
}
|
|
124
115
|
/**
|
|
125
116
|
* Load cloud credentials from $CREWLY_HOME/cloud/config.json.
|
|
@@ -127,17 +118,8 @@ export function saveCloudCredentials(token, refreshToken) {
|
|
|
127
118
|
* @returns The saved credentials, or null if the file does not exist or is invalid
|
|
128
119
|
*/
|
|
129
120
|
export function loadCloudCredentials() {
|
|
130
|
-
const
|
|
131
|
-
|
|
132
|
-
return null;
|
|
133
|
-
}
|
|
134
|
-
try {
|
|
135
|
-
const raw = readFileSync(configFile, 'utf-8');
|
|
136
|
-
return JSON.parse(raw);
|
|
137
|
-
}
|
|
138
|
-
catch {
|
|
139
|
-
return null;
|
|
140
|
-
}
|
|
121
|
+
const read = readCloudConfigFile();
|
|
122
|
+
return read.status === 'ok' ? read.config : null;
|
|
141
123
|
}
|
|
142
124
|
/**
|
|
143
125
|
* Detect whether the current environment can open a browser.
|