@caracalai/core 0.1.6-rc.3 → 0.2.0-rc.2
This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
- package/dist/audit.d.ts.map +1 -1
- package/dist/audit.js +4 -1
- package/dist/audit.js.map +1 -1
- package/dist/crypto.d.ts +0 -14
- package/dist/crypto.d.ts.map +1 -1
- package/dist/crypto.js +5 -67
- package/dist/crypto.js.map +1 -1
- package/dist/errors.d.ts +10 -1
- package/dist/errors.d.ts.map +1 -1
- package/dist/errors.js +16 -0
- package/dist/errors.js.map +1 -1
- package/dist/index.d.ts +1 -12
- package/dist/index.d.ts.map +1 -1
- package/dist/index.js +2 -13
- package/dist/index.js.map +1 -1
- package/dist/json.d.ts.map +1 -1
- package/dist/logging.d.ts.map +1 -1
- package/dist/logging.js.map +1 -1
- package/package.json +4 -11
- package/dist/accountAssertion.d.ts +0 -5
- package/dist/accountAssertion.d.ts.map +0 -1
- package/dist/accountAssertion.js +0 -62
- package/dist/accountAssertion.js.map +0 -1
- package/dist/async.d.ts +0 -2
- package/dist/async.d.ts.map +0 -1
- package/dist/async.js +0 -27
- package/dist/async.js.map +0 -1
- package/dist/config.d.ts +0 -6
- package/dist/config.d.ts.map +0 -1
- package/dist/config.js +0 -60
- package/dist/config.js.map +0 -1
- package/dist/consoleToken.d.ts +0 -3
- package/dist/consoleToken.d.ts.map +0 -1
- package/dist/consoleToken.js +0 -33
- package/dist/consoleToken.js.map +0 -1
- package/dist/env.d.ts +0 -5
- package/dist/env.d.ts.map +0 -1
- package/dist/env.js +0 -28
- package/dist/env.js.map +0 -1
- package/dist/envfile.d.ts +0 -19
- package/dist/envfile.d.ts.map +0 -1
- package/dist/envfile.js +0 -167
- package/dist/envfile.js.map +0 -1
- package/dist/lifecycle.d.ts +0 -17
- package/dist/lifecycle.d.ts.map +0 -1
- package/dist/lifecycle.js +0 -66
- package/dist/lifecycle.js.map +0 -1
- package/dist/metrics.d.ts +0 -4
- package/dist/metrics.d.ts.map +0 -1
- package/dist/metrics.js +0 -43
- package/dist/metrics.js.map +0 -1
- package/dist/operatorAssertion.d.ts +0 -8
- package/dist/operatorAssertion.d.ts.map +0 -1
- package/dist/operatorAssertion.js +0 -70
- package/dist/operatorAssertion.js.map +0 -1
- package/dist/telemetry.d.ts +0 -10
- package/dist/telemetry.d.ts.map +0 -1
- package/dist/telemetry.js +0 -98
- package/dist/telemetry.js.map +0 -1
- package/dist/url.d.ts +0 -3
- package/dist/url.d.ts.map +0 -1
- package/dist/url.js +0 -10
- package/dist/url.js.map +0 -1
package/dist/config.js
DELETED
|
@@ -1,60 +0,0 @@
|
|
|
1
|
-
// Copyright (C) 2026 Garudex Labs. All Rights Reserved.
|
|
2
|
-
// Caracal, a product of Garudex Labs
|
|
3
|
-
//
|
|
4
|
-
// Shared environment variable accessors for TypeScript services.
|
|
5
|
-
import { readFileSync } from 'node:fs';
|
|
6
|
-
export function mustGetenv(key) {
|
|
7
|
-
const v = process.env[key];
|
|
8
|
-
if (!v)
|
|
9
|
-
throw new Error(`Required env var missing: ${key}`);
|
|
10
|
-
return v;
|
|
11
|
-
}
|
|
12
|
-
export function getenv(key, fallback) {
|
|
13
|
-
return process.env[key] ?? fallback;
|
|
14
|
-
}
|
|
15
|
-
export function intEnv(key, fallback, min = 0) {
|
|
16
|
-
const raw = process.env[key];
|
|
17
|
-
if (raw === undefined || raw === '')
|
|
18
|
-
return fallback;
|
|
19
|
-
const n = parseInt(raw, 10);
|
|
20
|
-
if (!Number.isFinite(n) || n < min) {
|
|
21
|
-
throw new Error(`Invalid integer env var ${key}: ${raw}`);
|
|
22
|
-
}
|
|
23
|
-
return n;
|
|
24
|
-
}
|
|
25
|
-
export function boolEnv(key, fallback) {
|
|
26
|
-
const raw = process.env[key];
|
|
27
|
-
if (raw === undefined || raw === '')
|
|
28
|
-
return fallback;
|
|
29
|
-
switch (raw.toLowerCase()) {
|
|
30
|
-
case '1':
|
|
31
|
-
case 'true':
|
|
32
|
-
case 'yes':
|
|
33
|
-
case 'on': return true;
|
|
34
|
-
case '0':
|
|
35
|
-
case 'false':
|
|
36
|
-
case 'no':
|
|
37
|
-
case 'off': return false;
|
|
38
|
-
default: throw new Error(`Invalid boolean env var ${key}: ${raw}`);
|
|
39
|
-
}
|
|
40
|
-
}
|
|
41
|
-
// resolveFileSecrets reads `${KEY}_FILE` for each given key and, when set,
|
|
42
|
-
// loads the file contents into `process.env[KEY]`. The `_FILE` variable is
|
|
43
|
-
// cleared so secrets do not appear in the process environment beyond what is
|
|
44
|
-
// actually needed at runtime. Existing values for `KEY` are preserved.
|
|
45
|
-
export function resolveFileSecrets(keys) {
|
|
46
|
-
for (const key of keys) {
|
|
47
|
-
if (process.env[key])
|
|
48
|
-
continue;
|
|
49
|
-
const fileVar = `${key}_FILE`;
|
|
50
|
-
const path = process.env[fileVar];
|
|
51
|
-
if (!path)
|
|
52
|
-
continue;
|
|
53
|
-
const value = readFileSync(path, 'utf8').replace(/\s+$/, '');
|
|
54
|
-
if (!value)
|
|
55
|
-
throw new Error(`Secret file empty: ${fileVar}=${path}`);
|
|
56
|
-
process.env[key] = value;
|
|
57
|
-
delete process.env[fileVar];
|
|
58
|
-
}
|
|
59
|
-
}
|
|
60
|
-
//# sourceMappingURL=config.js.map
|
package/dist/config.js.map
DELETED
|
@@ -1 +0,0 @@
|
|
|
1
|
-
{"version":3,"file":"config.js","sourceRoot":"","sources":["../src/config.ts"],"names":[],"mappings":"AAAA,yDAAyD;AACzD,qCAAqC;AACrC,EAAE;AACF,iEAAiE;AAEjE,OAAO,EAAE,YAAY,EAAE,MAAM,SAAS,CAAC;AAEvC,MAAM,UAAU,UAAU,CAAC,GAAW;IACpC,MAAM,CAAC,GAAG,OAAO,CAAC,GAAG,CAAC,GAAG,CAAC,CAAC;IAC3B,IAAI,CAAC,CAAC;QAAE,MAAM,IAAI,KAAK,CAAC,6BAA6B,GAAG,EAAE,CAAC,CAAC;IAC5D,OAAO,CAAC,CAAC;AACX,CAAC;AAED,MAAM,UAAU,MAAM,CAAC,GAAW,EAAE,QAAgB;IAClD,OAAO,OAAO,CAAC,GAAG,CAAC,GAAG,CAAC,IAAI,QAAQ,CAAC;AACtC,CAAC;AAED,MAAM,UAAU,MAAM,CAAC,GAAW,EAAE,QAAgB,EAAE,GAAG,GAAG,CAAC;IAC3D,MAAM,GAAG,GAAG,OAAO,CAAC,GAAG,CAAC,GAAG,CAAC,CAAC;IAC7B,IAAI,GAAG,KAAK,SAAS,IAAI,GAAG,KAAK,EAAE;QAAE,OAAO,QAAQ,CAAC;IACrD,MAAM,CAAC,GAAG,QAAQ,CAAC,GAAG,EAAE,EAAE,CAAC,CAAC;IAC5B,IAAI,CAAC,MAAM,CAAC,QAAQ,CAAC,CAAC,CAAC,IAAI,CAAC,GAAG,GAAG,EAAE,CAAC;QACnC,MAAM,IAAI,KAAK,CAAC,2BAA2B,GAAG,KAAK,GAAG,EAAE,CAAC,CAAC;IAC5D,CAAC;IACD,OAAO,CAAC,CAAC;AACX,CAAC;AAED,MAAM,UAAU,OAAO,CAAC,GAAW,EAAE,QAAiB;IACpD,MAAM,GAAG,GAAG,OAAO,CAAC,GAAG,CAAC,GAAG,CAAC,CAAC;IAC7B,IAAI,GAAG,KAAK,SAAS,IAAI,GAAG,KAAK,EAAE;QAAE,OAAO,QAAQ,CAAC;IACrD,QAAQ,GAAG,CAAC,WAAW,EAAE,EAAE,CAAC;QAC1B,KAAK,GAAG,CAAC;QAAC,KAAK,MAAM,CAAC;QAAC,KAAK,KAAK,CAAC;QAAC,KAAK,IAAI,CAAC,CAAC,OAAO,IAAI,CAAC;QAC1D,KAAK,GAAG,CAAC;QAAC,KAAK,OAAO,CAAC;QAAC,KAAK,IAAI,CAAC;QAAC,KAAK,KAAK,CAAC,CAAC,OAAO,KAAK,CAAC;QAC5D,OAAO,CAAC,CAAC,MAAM,IAAI,KAAK,CAAC,2BAA2B,GAAG,KAAK,GAAG,EAAE,CAAC,CAAC;IACrE,CAAC;AACH,CAAC;AAED,2EAA2E;AAC3E,2EAA2E;AAC3E,6EAA6E;AAC7E,uEAAuE;AACvE,MAAM,UAAU,kBAAkB,CAAC,IAAuB;IACxD,KAAK,MAAM,GAAG,IAAI,IAAI,EAAE,CAAC;QACvB,IAAI,OAAO,CAAC,GAAG,CAAC,GAAG,CAAC;YAAE,SAAS;QAC/B,MAAM,OAAO,GAAG,GAAG,GAAG,OAAO,CAAC;QAC9B,MAAM,IAAI,GAAG,OAAO,CAAC,GAAG,CAAC,OAAO,CAAC,CAAC;QAClC,IAAI,CAAC,IAAI;YAAE,SAAS;QACpB,MAAM,KAAK,GAAG,YAAY,CAAC,IAAI,EAAE,MAAM,CAAC,CAAC,OAAO,CAAC,MAAM,EAAE,EAAE,CAAC,CAAC;QAC7D,IAAI,CAAC,KAAK;YAAE,MAAM,IAAI,KAAK,CAAC,sBAAsB,OAAO,IAAI,IAAI,EAAE,CAAC,CAAC;QACrE,OAAO,CAAC,GAAG,CAAC,GAAG,CAAC,GAAG,KAAK,CAAC;QACzB,OAAO,OAAO,CAAC,GAAG,CAAC,OAAO,CAAC,CAAC;IAC9B,CAAC;AACH,CAAC"}
|
package/dist/consoleToken.d.ts
DELETED
|
@@ -1 +0,0 @@
|
|
|
1
|
-
{"version":3,"file":"consoleToken.d.ts","sourceRoot":"","sources":["../src/consoleToken.ts"],"names":[],"mappings":"AAyBA,wBAAgB,sBAAsB,CAAC,UAAU,EAAE,MAAM,GAAG,MAAM,CAEjE;AAOD,wBAAgB,uBAAuB,CAAC,UAAU,EAAE,MAAM,GAAG,MAAM,CAElE"}
|
package/dist/consoleToken.js
DELETED
|
@@ -1,33 +0,0 @@
|
|
|
1
|
-
// Copyright (C) 2026 Garudex Labs. All Rights Reserved.
|
|
2
|
-
// Caracal, a product of Garudex Labs
|
|
3
|
-
//
|
|
4
|
-
// Deterministic derivation of the Console BFF's operational admin tokens from the deployment admin token.
|
|
5
|
-
import { createHmac } from 'node:crypto';
|
|
6
|
-
// The reserved domain-separation labels for the Console BFF's derived operational tokens. Each
|
|
7
|
-
// is derived from the deployment's admin (god) token so the BFF and the API agree on its value
|
|
8
|
-
// with no shared secret file to manage and no minting round-trip. Distinct labels keep the read
|
|
9
|
-
// and write credentials independent; versioned so a derivation can be rotated without ambiguity.
|
|
10
|
-
const CONSOLE_READ_TOKEN_LABEL = 'caracal:console:read-only:v1';
|
|
11
|
-
const CONSOLE_WRITE_TOKEN_LABEL = 'caracal:console:write:v1';
|
|
12
|
-
function deriveConsoleToken(adminToken, label) {
|
|
13
|
-
const mac = createHmac('sha256', adminToken).update(label).digest('base64url');
|
|
14
|
-
return `cat_${mac}`;
|
|
15
|
-
}
|
|
16
|
-
// Derives the Console BFF's read-only admin token deterministically from the deployment admin
|
|
17
|
-
// token. The result is HMAC-SHA256(adminToken, label) rendered in the cat_ admin-token format,
|
|
18
|
-
// so both the API (which provisions the read-capability row) and the BFF (which presents it on
|
|
19
|
-
// read traffic) compute the identical value independently. The derived token is strictly weaker
|
|
20
|
-
// than the admin token it comes from, so deriving it discloses nothing the holder of the admin
|
|
21
|
-
// token did not already have.
|
|
22
|
-
export function deriveConsoleReadToken(adminToken) {
|
|
23
|
-
return deriveConsoleToken(adminToken, CONSOLE_READ_TOKEN_LABEL);
|
|
24
|
-
}
|
|
25
|
-
// Derives the Console BFF's write admin token, the credential it presents on mutating traffic so
|
|
26
|
-
// the deployment admin token is reserved as a break-glass fallback rather than the everyday
|
|
27
|
-
// operational credential. It is independently revocable from the bootstrap admin token (rotating
|
|
28
|
-
// the admin token rotates it), yet derivable only by a holder of the admin token, who already
|
|
29
|
-
// has full authority - so its existence grants nothing new.
|
|
30
|
-
export function deriveConsoleWriteToken(adminToken) {
|
|
31
|
-
return deriveConsoleToken(adminToken, CONSOLE_WRITE_TOKEN_LABEL);
|
|
32
|
-
}
|
|
33
|
-
//# sourceMappingURL=consoleToken.js.map
|
package/dist/consoleToken.js.map
DELETED
|
@@ -1 +0,0 @@
|
|
|
1
|
-
{"version":3,"file":"consoleToken.js","sourceRoot":"","sources":["../src/consoleToken.ts"],"names":[],"mappings":"AAAA,yDAAyD;AACzD,qCAAqC;AACrC,EAAE;AACF,0GAA0G;AAE1G,OAAO,EAAE,UAAU,EAAE,MAAM,aAAa,CAAA;AAExC,+FAA+F;AAC/F,+FAA+F;AAC/F,gGAAgG;AAChG,iGAAiG;AACjG,MAAM,wBAAwB,GAAG,8BAA8B,CAAA;AAC/D,MAAM,yBAAyB,GAAG,0BAA0B,CAAA;AAE5D,SAAS,kBAAkB,CAAC,UAAkB,EAAE,KAAa;IAC3D,MAAM,GAAG,GAAG,UAAU,CAAC,QAAQ,EAAE,UAAU,CAAC,CAAC,MAAM,CAAC,KAAK,CAAC,CAAC,MAAM,CAAC,WAAW,CAAC,CAAA;IAC9E,OAAO,OAAO,GAAG,EAAE,CAAA;AACrB,CAAC;AAED,8FAA8F;AAC9F,+FAA+F;AAC/F,+FAA+F;AAC/F,gGAAgG;AAChG,+FAA+F;AAC/F,8BAA8B;AAC9B,MAAM,UAAU,sBAAsB,CAAC,UAAkB;IACvD,OAAO,kBAAkB,CAAC,UAAU,EAAE,wBAAwB,CAAC,CAAA;AACjE,CAAC;AAED,iGAAiG;AACjG,4FAA4F;AAC5F,iGAAiG;AACjG,8FAA8F;AAC9F,4DAA4D;AAC5D,MAAM,UAAU,uBAAuB,CAAC,UAAkB;IACxD,OAAO,kBAAkB,CAAC,UAAU,EAAE,yBAAyB,CAAC,CAAA;AAClE,CAAC"}
|
package/dist/env.d.ts
DELETED
package/dist/env.d.ts.map
DELETED
|
@@ -1 +0,0 @@
|
|
|
1
|
-
{"version":3,"file":"env.d.ts","sourceRoot":"","sources":["../src/env.ts"],"names":[],"mappings":"AAKA,MAAM,MAAM,WAAW,GAAG,KAAK,GAAG,IAAI,GAAG,QAAQ,CAAC;AAElD,wBAAgB,WAAW,IAAI,WAAW,CAKzC;AAED,wBAAgB,WAAW,IAAI,OAAO,CAErC;AAED,wBAAgB,mBAAmB,IAAI,IAAI,CAU1C"}
|
package/dist/env.js
DELETED
|
@@ -1,28 +0,0 @@
|
|
|
1
|
-
// Copyright (C) 2026 Garudex Labs. All Rights Reserved.
|
|
2
|
-
// Caracal, a product of Garudex Labs
|
|
3
|
-
//
|
|
4
|
-
// Shared environment classification for TypeScript services.
|
|
5
|
-
export function caracalMode() {
|
|
6
|
-
const raw = (process.env.CARACAL_MODE ?? '').trim().toLowerCase();
|
|
7
|
-
if (raw === '')
|
|
8
|
-
return 'stable';
|
|
9
|
-
if (raw === 'dev' || raw === 'rc' || raw === 'stable')
|
|
10
|
-
return raw;
|
|
11
|
-
throw new Error(`CARACAL_MODE must be 'dev', 'rc', or 'stable' (got '${raw}')`);
|
|
12
|
-
}
|
|
13
|
-
export function isPublished() {
|
|
14
|
-
return caracalMode() !== 'dev';
|
|
15
|
-
}
|
|
16
|
-
export function assertPublishedSafe() {
|
|
17
|
-
if (!isPublished())
|
|
18
|
-
return;
|
|
19
|
-
const forbidden = ['INSECURE_STS', 'INSECURE_HTTP'];
|
|
20
|
-
const set = forbidden.filter((k) => {
|
|
21
|
-
const v = (process.env[k] ?? '').toLowerCase();
|
|
22
|
-
return v === 'true' || v === '1' || v === 'yes';
|
|
23
|
-
});
|
|
24
|
-
if (set.length > 0) {
|
|
25
|
-
throw new Error(`CARACAL_MODE=rc or CARACAL_MODE=stable forbids: ${set.join(', ')}`);
|
|
26
|
-
}
|
|
27
|
-
}
|
|
28
|
-
//# sourceMappingURL=env.js.map
|
package/dist/env.js.map
DELETED
|
@@ -1 +0,0 @@
|
|
|
1
|
-
{"version":3,"file":"env.js","sourceRoot":"","sources":["../src/env.ts"],"names":[],"mappings":"AAAA,yDAAyD;AACzD,qCAAqC;AACrC,EAAE;AACF,6DAA6D;AAI7D,MAAM,UAAU,WAAW;IACzB,MAAM,GAAG,GAAG,CAAC,OAAO,CAAC,GAAG,CAAC,YAAY,IAAI,EAAE,CAAC,CAAC,IAAI,EAAE,CAAC,WAAW,EAAE,CAAC;IAClE,IAAI,GAAG,KAAK,EAAE;QAAE,OAAO,QAAQ,CAAC;IAChC,IAAI,GAAG,KAAK,KAAK,IAAI,GAAG,KAAK,IAAI,IAAI,GAAG,KAAK,QAAQ;QAAE,OAAO,GAAG,CAAC;IAClE,MAAM,IAAI,KAAK,CAAC,uDAAuD,GAAG,IAAI,CAAC,CAAC;AAClF,CAAC;AAED,MAAM,UAAU,WAAW;IACzB,OAAO,WAAW,EAAE,KAAK,KAAK,CAAC;AACjC,CAAC;AAED,MAAM,UAAU,mBAAmB;IACjC,IAAI,CAAC,WAAW,EAAE;QAAE,OAAO;IAC3B,MAAM,SAAS,GAAG,CAAC,cAAc,EAAE,eAAe,CAAC,CAAC;IACpD,MAAM,GAAG,GAAG,SAAS,CAAC,MAAM,CAAC,CAAC,CAAC,EAAE,EAAE;QACjC,MAAM,CAAC,GAAG,CAAC,OAAO,CAAC,GAAG,CAAC,CAAC,CAAC,IAAI,EAAE,CAAC,CAAC,WAAW,EAAE,CAAC;QAC/C,OAAO,CAAC,KAAK,MAAM,IAAI,CAAC,KAAK,GAAG,IAAI,CAAC,KAAK,KAAK,CAAC;IAClD,CAAC,CAAC,CAAC;IACH,IAAI,GAAG,CAAC,MAAM,GAAG,CAAC,EAAE,CAAC;QACnB,MAAM,IAAI,KAAK,CAAC,mDAAmD,GAAG,CAAC,IAAI,CAAC,IAAI,CAAC,EAAE,CAAC,CAAC;IACvF,CAAC;AACH,CAAC"}
|
package/dist/envfile.d.ts
DELETED
|
@@ -1,19 +0,0 @@
|
|
|
1
|
-
export declare function readEnvFile(path: string): Record<string, string>;
|
|
2
|
-
/**
|
|
3
|
-
* Resolve the installed home written to by `caracal up`.
|
|
4
|
-
* Mirrors the layout in packages/engine/src/runtime.ts.
|
|
5
|
-
*/
|
|
6
|
-
export declare function installedHome(): string;
|
|
7
|
-
export declare function devSecretsHome(): string;
|
|
8
|
-
export interface DiscoverTokenOptions {
|
|
9
|
-
preferGenerated?: boolean;
|
|
10
|
-
}
|
|
11
|
-
export declare function discoverRepoRoot(): string | undefined;
|
|
12
|
-
export interface ManagedSecretDirOptions {
|
|
13
|
-
preferDev?: boolean;
|
|
14
|
-
}
|
|
15
|
-
export declare function managedSecretDirs(opts?: ManagedSecretDirOptions): string[];
|
|
16
|
-
export declare function discoverAdminToken(explicit?: string, opts?: DiscoverTokenOptions): string | undefined;
|
|
17
|
-
export declare function discoverCoordinatorToken(explicit?: string, opts?: DiscoverTokenOptions): string | undefined;
|
|
18
|
-
export declare function discoverMetricsBearer(explicit?: string, opts?: DiscoverTokenOptions): string | undefined;
|
|
19
|
-
//# sourceMappingURL=envfile.d.ts.map
|
package/dist/envfile.d.ts.map
DELETED
|
@@ -1 +0,0 @@
|
|
|
1
|
-
{"version":3,"file":"envfile.d.ts","sourceRoot":"","sources":["../src/envfile.ts"],"names":[],"mappings":"AASA,wBAAgB,WAAW,CAAC,IAAI,EAAE,MAAM,GAAG,MAAM,CAAC,MAAM,EAAE,MAAM,CAAC,CAahE;AAED;;;GAGG;AACH,wBAAgB,aAAa,IAAI,MAAM,CAWtC;AAED,wBAAgB,cAAc,IAAI,MAAM,CAGvC;AAQD,MAAM,WAAW,oBAAoB;IACnC,eAAe,CAAC,EAAE,OAAO,CAAA;CAC1B;AAED,wBAAgB,gBAAgB,IAAI,MAAM,GAAG,SAAS,CAWrD;AAED,MAAM,WAAW,uBAAuB;IACtC,SAAS,CAAC,EAAE,OAAO,CAAA;CACpB;AAED,wBAAgB,iBAAiB,CAAC,IAAI,GAAE,uBAA4B,GAAG,MAAM,EAAE,CAQ9E;AAYD,wBAAgB,kBAAkB,CAAC,QAAQ,CAAC,EAAE,MAAM,EAAE,IAAI,GAAE,oBAAyB,GAAG,MAAM,GAAG,SAAS,CAoBzG;AAED,wBAAgB,wBAAwB,CAAC,QAAQ,CAAC,EAAE,MAAM,EAAE,IAAI,GAAE,oBAAyB,GAAG,MAAM,GAAG,SAAS,CAoB/G;AAED,wBAAgB,qBAAqB,CAAC,QAAQ,CAAC,EAAE,MAAM,EAAE,IAAI,GAAE,oBAAyB,GAAG,MAAM,GAAG,SAAS,CAoB5G"}
|
package/dist/envfile.js
DELETED
|
@@ -1,167 +0,0 @@
|
|
|
1
|
-
// Copyright (C) 2026 Garudex Labs. All Rights Reserved.
|
|
2
|
-
// Caracal, a product of Garudex Labs
|
|
3
|
-
//
|
|
4
|
-
// Helpers for reading dotenv files and discovering Caracal managed secrets.
|
|
5
|
-
import { existsSync, readFileSync } from 'node:fs';
|
|
6
|
-
import { homedir, platform } from 'node:os';
|
|
7
|
-
import { dirname, join } from 'node:path';
|
|
8
|
-
export function readEnvFile(path) {
|
|
9
|
-
if (!existsSync(path))
|
|
10
|
-
return {};
|
|
11
|
-
const out = {};
|
|
12
|
-
for (const line of readFileSync(path, 'utf8').split(/\r?\n/)) {
|
|
13
|
-
const m = line.match(/^\s*([A-Z_][A-Z0-9_]*)\s*=\s*(.*)\s*$/);
|
|
14
|
-
if (!m)
|
|
15
|
-
continue;
|
|
16
|
-
let value = m[2];
|
|
17
|
-
if ((value.startsWith('"') && value.endsWith('"')) || (value.startsWith("'") && value.endsWith("'"))) {
|
|
18
|
-
value = value.slice(1, -1);
|
|
19
|
-
}
|
|
20
|
-
out[m[1]] = value;
|
|
21
|
-
}
|
|
22
|
-
return out;
|
|
23
|
-
}
|
|
24
|
-
/**
|
|
25
|
-
* Resolve the installed home written to by `caracal up`.
|
|
26
|
-
* Mirrors the layout in packages/engine/src/runtime.ts.
|
|
27
|
-
*/
|
|
28
|
-
export function installedHome() {
|
|
29
|
-
if (process.env.CARACAL_HOME)
|
|
30
|
-
return process.env.CARACAL_HOME;
|
|
31
|
-
const xdg = process.env.XDG_DATA_HOME;
|
|
32
|
-
if (xdg && xdg.length > 0)
|
|
33
|
-
return join(xdg, 'caracal');
|
|
34
|
-
if (platform() === 'darwin') {
|
|
35
|
-
return join(homedir(), 'Library', 'Application Support', 'caracal');
|
|
36
|
-
}
|
|
37
|
-
if (platform() === 'win32') {
|
|
38
|
-
return join(process.env.LOCALAPPDATA || join(homedir(), 'AppData', 'Local'), 'caracal');
|
|
39
|
-
}
|
|
40
|
-
return join(homedir(), '.local', 'share', 'caracal');
|
|
41
|
-
}
|
|
42
|
-
export function devSecretsHome() {
|
|
43
|
-
if (process.env.CARACAL_DEV_SECRETS_DIR)
|
|
44
|
-
return process.env.CARACAL_DEV_SECRETS_DIR;
|
|
45
|
-
return join(installedHome(), 'dev-secrets');
|
|
46
|
-
}
|
|
47
|
-
function readSecretFile(path) {
|
|
48
|
-
if (!existsSync(path))
|
|
49
|
-
return undefined;
|
|
50
|
-
const value = readFileSync(path, 'utf8').trim();
|
|
51
|
-
return value.length > 0 ? value : undefined;
|
|
52
|
-
}
|
|
53
|
-
export function discoverRepoRoot() {
|
|
54
|
-
if (process.env.CARACAL_REPO_ROOT)
|
|
55
|
-
return process.env.CARACAL_REPO_ROOT;
|
|
56
|
-
let dir = process.cwd();
|
|
57
|
-
while (true) {
|
|
58
|
-
if (existsSync(join(dir, 'pnpm-workspace.yaml')) && existsSync(join(dir, 'package.json'))) {
|
|
59
|
-
return dir;
|
|
60
|
-
}
|
|
61
|
-
const parent = dirname(dir);
|
|
62
|
-
if (parent === dir)
|
|
63
|
-
return undefined;
|
|
64
|
-
dir = parent;
|
|
65
|
-
}
|
|
66
|
-
}
|
|
67
|
-
export function managedSecretDirs(opts = {}) {
|
|
68
|
-
const root = discoverRepoRoot();
|
|
69
|
-
const explicit = process.env.CARACAL_SECRETS_DIR;
|
|
70
|
-
const installedPath = join(installedHome(), 'secrets');
|
|
71
|
-
const devPath = devSecretsHome();
|
|
72
|
-
const workspacePath = process.env.CARACAL_ALLOW_WORKSPACE_SECRETS === 'true' && root ? join(root, 'infra', 'secrets', 'files') : undefined;
|
|
73
|
-
const generated = opts.preferDev ? [devPath, installedPath] : [installedPath, devPath];
|
|
74
|
-
return [...new Set([explicit, ...generated, workspacePath].filter((path) => Boolean(path)))];
|
|
75
|
-
}
|
|
76
|
-
function readGeneratedSecret(fileName) {
|
|
77
|
-
const root = discoverRepoRoot();
|
|
78
|
-
const preferDev = process.env.CARACAL_MODE === 'dev' || (!process.env.CARACAL_HOME && root !== undefined);
|
|
79
|
-
for (const dir of managedSecretDirs({ preferDev })) {
|
|
80
|
-
const value = readSecretFile(join(dir, fileName));
|
|
81
|
-
if (value)
|
|
82
|
-
return value;
|
|
83
|
-
}
|
|
84
|
-
return undefined;
|
|
85
|
-
}
|
|
86
|
-
export function discoverAdminToken(explicit, opts = {}) {
|
|
87
|
-
if (explicit)
|
|
88
|
-
return explicit;
|
|
89
|
-
if (opts.preferGenerated) {
|
|
90
|
-
const generated = readGeneratedSecret('caracalAdminToken');
|
|
91
|
-
if (generated)
|
|
92
|
-
return generated;
|
|
93
|
-
}
|
|
94
|
-
if (process.env.CARACAL_ADMIN_TOKEN)
|
|
95
|
-
return process.env.CARACAL_ADMIN_TOKEN;
|
|
96
|
-
if (process.env.CARACAL_ADMIN_TOKEN_FILE) {
|
|
97
|
-
const value = readSecretFile(process.env.CARACAL_ADMIN_TOKEN_FILE);
|
|
98
|
-
if (value)
|
|
99
|
-
return value;
|
|
100
|
-
}
|
|
101
|
-
if (!opts.preferGenerated) {
|
|
102
|
-
const generated = readGeneratedSecret('caracalAdminToken');
|
|
103
|
-
if (generated)
|
|
104
|
-
return generated;
|
|
105
|
-
}
|
|
106
|
-
if (process.env.CARACAL_ENV_FILE) {
|
|
107
|
-
const env = readEnvFile(process.env.CARACAL_ENV_FILE);
|
|
108
|
-
if (env.CARACAL_ADMIN_TOKEN)
|
|
109
|
-
return env.CARACAL_ADMIN_TOKEN;
|
|
110
|
-
}
|
|
111
|
-
return undefined;
|
|
112
|
-
}
|
|
113
|
-
export function discoverCoordinatorToken(explicit, opts = {}) {
|
|
114
|
-
if (explicit)
|
|
115
|
-
return explicit;
|
|
116
|
-
if (opts.preferGenerated) {
|
|
117
|
-
const generated = readGeneratedSecret('caracalCoordinatorToken');
|
|
118
|
-
if (generated)
|
|
119
|
-
return generated;
|
|
120
|
-
}
|
|
121
|
-
if (process.env.CARACAL_COORDINATOR_TOKEN)
|
|
122
|
-
return process.env.CARACAL_COORDINATOR_TOKEN;
|
|
123
|
-
if (process.env.CARACAL_COORDINATOR_TOKEN_FILE) {
|
|
124
|
-
const value = readSecretFile(process.env.CARACAL_COORDINATOR_TOKEN_FILE);
|
|
125
|
-
if (value)
|
|
126
|
-
return value;
|
|
127
|
-
}
|
|
128
|
-
if (!opts.preferGenerated) {
|
|
129
|
-
const generated = readGeneratedSecret('caracalCoordinatorToken');
|
|
130
|
-
if (generated)
|
|
131
|
-
return generated;
|
|
132
|
-
}
|
|
133
|
-
if (process.env.CARACAL_ENV_FILE) {
|
|
134
|
-
const env = readEnvFile(process.env.CARACAL_ENV_FILE);
|
|
135
|
-
if (env.CARACAL_COORDINATOR_TOKEN)
|
|
136
|
-
return env.CARACAL_COORDINATOR_TOKEN;
|
|
137
|
-
}
|
|
138
|
-
return undefined;
|
|
139
|
-
}
|
|
140
|
-
export function discoverMetricsBearer(explicit, opts = {}) {
|
|
141
|
-
if (explicit)
|
|
142
|
-
return explicit;
|
|
143
|
-
if (opts.preferGenerated) {
|
|
144
|
-
const generated = readGeneratedSecret('metricsBearer');
|
|
145
|
-
if (generated)
|
|
146
|
-
return generated;
|
|
147
|
-
}
|
|
148
|
-
if (process.env.METRICS_BEARER)
|
|
149
|
-
return process.env.METRICS_BEARER;
|
|
150
|
-
if (process.env.METRICS_BEARER_FILE) {
|
|
151
|
-
const value = readSecretFile(process.env.METRICS_BEARER_FILE);
|
|
152
|
-
if (value)
|
|
153
|
-
return value;
|
|
154
|
-
}
|
|
155
|
-
if (!opts.preferGenerated) {
|
|
156
|
-
const generated = readGeneratedSecret('metricsBearer');
|
|
157
|
-
if (generated)
|
|
158
|
-
return generated;
|
|
159
|
-
}
|
|
160
|
-
if (process.env.CARACAL_ENV_FILE) {
|
|
161
|
-
const env = readEnvFile(process.env.CARACAL_ENV_FILE);
|
|
162
|
-
if (env.METRICS_BEARER)
|
|
163
|
-
return env.METRICS_BEARER;
|
|
164
|
-
}
|
|
165
|
-
return undefined;
|
|
166
|
-
}
|
|
167
|
-
//# sourceMappingURL=envfile.js.map
|
package/dist/envfile.js.map
DELETED
|
@@ -1 +0,0 @@
|
|
|
1
|
-
{"version":3,"file":"envfile.js","sourceRoot":"","sources":["../src/envfile.ts"],"names":[],"mappings":"AAAA,yDAAyD;AACzD,qCAAqC;AACrC,EAAE;AACF,4EAA4E;AAE5E,OAAO,EAAE,UAAU,EAAE,YAAY,EAAE,MAAM,SAAS,CAAA;AAClD,OAAO,EAAE,OAAO,EAAE,QAAQ,EAAE,MAAM,SAAS,CAAA;AAC3C,OAAO,EAAE,OAAO,EAAE,IAAI,EAAE,MAAM,WAAW,CAAA;AAEzC,MAAM,UAAU,WAAW,CAAC,IAAY;IACtC,IAAI,CAAC,UAAU,CAAC,IAAI,CAAC;QAAE,OAAO,EAAE,CAAA;IAChC,MAAM,GAAG,GAA2B,EAAE,CAAA;IACtC,KAAK,MAAM,IAAI,IAAI,YAAY,CAAC,IAAI,EAAE,MAAM,CAAC,CAAC,KAAK,CAAC,OAAO,CAAC,EAAE,CAAC;QAC7D,MAAM,CAAC,GAAG,IAAI,CAAC,KAAK,CAAC,uCAAuC,CAAC,CAAA;QAC7D,IAAI,CAAC,CAAC;YAAE,SAAQ;QAChB,IAAI,KAAK,GAAG,CAAC,CAAC,CAAC,CAAE,CAAA;QACjB,IAAI,CAAC,KAAK,CAAC,UAAU,CAAC,GAAG,CAAC,IAAI,KAAK,CAAC,QAAQ,CAAC,GAAG,CAAC,CAAC,IAAI,CAAC,KAAK,CAAC,UAAU,CAAC,GAAG,CAAC,IAAI,KAAK,CAAC,QAAQ,CAAC,GAAG,CAAC,CAAC,EAAE,CAAC;YACrG,KAAK,GAAG,KAAK,CAAC,KAAK,CAAC,CAAC,EAAE,CAAC,CAAC,CAAC,CAAA;QAC5B,CAAC;QACD,GAAG,CAAC,CAAC,CAAC,CAAC,CAAE,CAAC,GAAG,KAAK,CAAA;IACpB,CAAC;IACD,OAAO,GAAG,CAAA;AACZ,CAAC;AAED;;;GAGG;AACH,MAAM,UAAU,aAAa;IAC3B,IAAI,OAAO,CAAC,GAAG,CAAC,YAAY;QAAE,OAAO,OAAO,CAAC,GAAG,CAAC,YAAY,CAAA;IAC7D,MAAM,GAAG,GAAG,OAAO,CAAC,GAAG,CAAC,aAAa,CAAA;IACrC,IAAI,GAAG,IAAI,GAAG,CAAC,MAAM,GAAG,CAAC;QAAE,OAAO,IAAI,CAAC,GAAG,EAAE,SAAS,CAAC,CAAA;IACtD,IAAI,QAAQ,EAAE,KAAK,QAAQ,EAAE,CAAC;QAC5B,OAAO,IAAI,CAAC,OAAO,EAAE,EAAE,SAAS,EAAE,qBAAqB,EAAE,SAAS,CAAC,CAAA;IACrE,CAAC;IACD,IAAI,QAAQ,EAAE,KAAK,OAAO,EAAE,CAAC;QAC3B,OAAO,IAAI,CAAC,OAAO,CAAC,GAAG,CAAC,YAAY,IAAI,IAAI,CAAC,OAAO,EAAE,EAAE,SAAS,EAAE,OAAO,CAAC,EAAE,SAAS,CAAC,CAAA;IACzF,CAAC;IACD,OAAO,IAAI,CAAC,OAAO,EAAE,EAAE,QAAQ,EAAE,OAAO,EAAE,SAAS,CAAC,CAAA;AACtD,CAAC;AAED,MAAM,UAAU,cAAc;IAC5B,IAAI,OAAO,CAAC,GAAG,CAAC,uBAAuB;QAAE,OAAO,OAAO,CAAC,GAAG,CAAC,uBAAuB,CAAA;IACnF,OAAO,IAAI,CAAC,aAAa,EAAE,EAAE,aAAa,CAAC,CAAA;AAC7C,CAAC;AAED,SAAS,cAAc,CAAC,IAAY;IAClC,IAAI,CAAC,UAAU,CAAC,IAAI,CAAC;QAAE,OAAO,SAAS,CAAA;IACvC,MAAM,KAAK,GAAG,YAAY,CAAC,IAAI,EAAE,MAAM,CAAC,CAAC,IAAI,EAAE,CAAA;IAC/C,OAAO,KAAK,CAAC,MAAM,GAAG,CAAC,CAAC,CAAC,CAAC,KAAK,CAAC,CAAC,CAAC,SAAS,CAAA;AAC7C,CAAC;AAMD,MAAM,UAAU,gBAAgB;IAC9B,IAAI,OAAO,CAAC,GAAG,CAAC,iBAAiB;QAAE,OAAO,OAAO,CAAC,GAAG,CAAC,iBAAiB,CAAA;IACvE,IAAI,GAAG,GAAG,OAAO,CAAC,GAAG,EAAE,CAAA;IACvB,OAAO,IAAI,EAAE,CAAC;QACZ,IAAI,UAAU,CAAC,IAAI,CAAC,GAAG,EAAE,qBAAqB,CAAC,CAAC,IAAI,UAAU,CAAC,IAAI,CAAC,GAAG,EAAE,cAAc,CAAC,CAAC,EAAE,CAAC;YAC1F,OAAO,GAAG,CAAA;QACZ,CAAC;QACD,MAAM,MAAM,GAAG,OAAO,CAAC,GAAG,CAAC,CAAA;QAC3B,IAAI,MAAM,KAAK,GAAG;YAAE,OAAO,SAAS,CAAA;QACpC,GAAG,GAAG,MAAM,CAAA;IACd,CAAC;AACH,CAAC;AAMD,MAAM,UAAU,iBAAiB,CAAC,OAAgC,EAAE;IAClE,MAAM,IAAI,GAAG,gBAAgB,EAAE,CAAA;IAC/B,MAAM,QAAQ,GAAG,OAAO,CAAC,GAAG,CAAC,mBAAmB,CAAA;IAChD,MAAM,aAAa,GAAG,IAAI,CAAC,aAAa,EAAE,EAAE,SAAS,CAAC,CAAA;IACtD,MAAM,OAAO,GAAG,cAAc,EAAE,CAAA;IAChC,MAAM,aAAa,GAAG,OAAO,CAAC,GAAG,CAAC,+BAA+B,KAAK,MAAM,IAAI,IAAI,CAAC,CAAC,CAAC,IAAI,CAAC,IAAI,EAAE,OAAO,EAAE,SAAS,EAAE,OAAO,CAAC,CAAC,CAAC,CAAC,SAAS,CAAA;IAC1I,MAAM,SAAS,GAAG,IAAI,CAAC,SAAS,CAAC,CAAC,CAAC,CAAC,OAAO,EAAE,aAAa,CAAC,CAAC,CAAC,CAAC,CAAC,aAAa,EAAE,OAAO,CAAC,CAAA;IACtF,OAAO,CAAC,GAAG,IAAI,GAAG,CAAC,CAAC,QAAQ,EAAE,GAAG,SAAS,EAAE,aAAa,CAAC,CAAC,MAAM,CAAC,CAAC,IAAI,EAAkB,EAAE,CAAC,OAAO,CAAC,IAAI,CAAC,CAAC,CAAC,CAAC,CAAA;AAC9G,CAAC;AAED,SAAS,mBAAmB,CAAC,QAAgB;IAC3C,MAAM,IAAI,GAAG,gBAAgB,EAAE,CAAA;IAC/B,MAAM,SAAS,GAAG,OAAO,CAAC,GAAG,CAAC,YAAY,KAAK,KAAK,IAAI,CAAC,CAAC,OAAO,CAAC,GAAG,CAAC,YAAY,IAAI,IAAI,KAAK,SAAS,CAAC,CAAA;IACzG,KAAK,MAAM,GAAG,IAAI,iBAAiB,CAAC,EAAE,SAAS,EAAE,CAAC,EAAE,CAAC;QACnD,MAAM,KAAK,GAAG,cAAc,CAAC,IAAI,CAAC,GAAG,EAAE,QAAQ,CAAC,CAAC,CAAA;QACjD,IAAI,KAAK;YAAE,OAAO,KAAK,CAAA;IACzB,CAAC;IACD,OAAO,SAAS,CAAA;AAClB,CAAC;AAED,MAAM,UAAU,kBAAkB,CAAC,QAAiB,EAAE,OAA6B,EAAE;IACnF,IAAI,QAAQ;QAAE,OAAO,QAAQ,CAAA;IAC7B,IAAI,IAAI,CAAC,eAAe,EAAE,CAAC;QACzB,MAAM,SAAS,GAAG,mBAAmB,CAAC,mBAAmB,CAAC,CAAA;QAC1D,IAAI,SAAS;YAAE,OAAO,SAAS,CAAA;IACjC,CAAC;IACD,IAAI,OAAO,CAAC,GAAG,CAAC,mBAAmB;QAAE,OAAO,OAAO,CAAC,GAAG,CAAC,mBAAmB,CAAA;IAC3E,IAAI,OAAO,CAAC,GAAG,CAAC,wBAAwB,EAAE,CAAC;QACzC,MAAM,KAAK,GAAG,cAAc,CAAC,OAAO,CAAC,GAAG,CAAC,wBAAwB,CAAC,CAAA;QAClE,IAAI,KAAK;YAAE,OAAO,KAAK,CAAA;IACzB,CAAC;IACD,IAAI,CAAC,IAAI,CAAC,eAAe,EAAE,CAAC;QAC1B,MAAM,SAAS,GAAG,mBAAmB,CAAC,mBAAmB,CAAC,CAAA;QAC1D,IAAI,SAAS;YAAE,OAAO,SAAS,CAAA;IACjC,CAAC;IACD,IAAI,OAAO,CAAC,GAAG,CAAC,gBAAgB,EAAE,CAAC;QACjC,MAAM,GAAG,GAAG,WAAW,CAAC,OAAO,CAAC,GAAG,CAAC,gBAAgB,CAAC,CAAA;QACrD,IAAI,GAAG,CAAC,mBAAmB;YAAE,OAAO,GAAG,CAAC,mBAAmB,CAAA;IAC7D,CAAC;IACD,OAAO,SAAS,CAAA;AAClB,CAAC;AAED,MAAM,UAAU,wBAAwB,CAAC,QAAiB,EAAE,OAA6B,EAAE;IACzF,IAAI,QAAQ;QAAE,OAAO,QAAQ,CAAA;IAC7B,IAAI,IAAI,CAAC,eAAe,EAAE,CAAC;QACzB,MAAM,SAAS,GAAG,mBAAmB,CAAC,yBAAyB,CAAC,CAAA;QAChE,IAAI,SAAS;YAAE,OAAO,SAAS,CAAA;IACjC,CAAC;IACD,IAAI,OAAO,CAAC,GAAG,CAAC,yBAAyB;QAAE,OAAO,OAAO,CAAC,GAAG,CAAC,yBAAyB,CAAA;IACvF,IAAI,OAAO,CAAC,GAAG,CAAC,8BAA8B,EAAE,CAAC;QAC/C,MAAM,KAAK,GAAG,cAAc,CAAC,OAAO,CAAC,GAAG,CAAC,8BAA8B,CAAC,CAAA;QACxE,IAAI,KAAK;YAAE,OAAO,KAAK,CAAA;IACzB,CAAC;IACD,IAAI,CAAC,IAAI,CAAC,eAAe,EAAE,CAAC;QAC1B,MAAM,SAAS,GAAG,mBAAmB,CAAC,yBAAyB,CAAC,CAAA;QAChE,IAAI,SAAS;YAAE,OAAO,SAAS,CAAA;IACjC,CAAC;IACD,IAAI,OAAO,CAAC,GAAG,CAAC,gBAAgB,EAAE,CAAC;QACjC,MAAM,GAAG,GAAG,WAAW,CAAC,OAAO,CAAC,GAAG,CAAC,gBAAgB,CAAC,CAAA;QACrD,IAAI,GAAG,CAAC,yBAAyB;YAAE,OAAO,GAAG,CAAC,yBAAyB,CAAA;IACzE,CAAC;IACD,OAAO,SAAS,CAAA;AAClB,CAAC;AAED,MAAM,UAAU,qBAAqB,CAAC,QAAiB,EAAE,OAA6B,EAAE;IACtF,IAAI,QAAQ;QAAE,OAAO,QAAQ,CAAA;IAC7B,IAAI,IAAI,CAAC,eAAe,EAAE,CAAC;QACzB,MAAM,SAAS,GAAG,mBAAmB,CAAC,eAAe,CAAC,CAAA;QACtD,IAAI,SAAS;YAAE,OAAO,SAAS,CAAA;IACjC,CAAC;IACD,IAAI,OAAO,CAAC,GAAG,CAAC,cAAc;QAAE,OAAO,OAAO,CAAC,GAAG,CAAC,cAAc,CAAA;IACjE,IAAI,OAAO,CAAC,GAAG,CAAC,mBAAmB,EAAE,CAAC;QACpC,MAAM,KAAK,GAAG,cAAc,CAAC,OAAO,CAAC,GAAG,CAAC,mBAAmB,CAAC,CAAA;QAC7D,IAAI,KAAK;YAAE,OAAO,KAAK,CAAA;IACzB,CAAC;IACD,IAAI,CAAC,IAAI,CAAC,eAAe,EAAE,CAAC;QAC1B,MAAM,SAAS,GAAG,mBAAmB,CAAC,eAAe,CAAC,CAAA;QACtD,IAAI,SAAS;YAAE,OAAO,SAAS,CAAA;IACjC,CAAC;IACD,IAAI,OAAO,CAAC,GAAG,CAAC,gBAAgB,EAAE,CAAC;QACjC,MAAM,GAAG,GAAG,WAAW,CAAC,OAAO,CAAC,GAAG,CAAC,gBAAgB,CAAC,CAAA;QACrD,IAAI,GAAG,CAAC,cAAc;YAAE,OAAO,GAAG,CAAC,cAAc,CAAA;IACnD,CAAC;IACD,OAAO,SAAS,CAAA;AAClB,CAAC"}
|
package/dist/lifecycle.d.ts
DELETED
|
@@ -1,17 +0,0 @@
|
|
|
1
|
-
export type ShutdownFn = () => Promise<void> | void;
|
|
2
|
-
export declare class ShutdownRegistry {
|
|
3
|
-
private readonly opts;
|
|
4
|
-
private entries;
|
|
5
|
-
private installed;
|
|
6
|
-
private firing;
|
|
7
|
-
constructor(opts: {
|
|
8
|
-
timeoutMs: number;
|
|
9
|
-
log: (level: 'info' | 'warn' | 'error', msg: string, meta?: Record<string, unknown>) => void;
|
|
10
|
-
exit?: (code: number) => void;
|
|
11
|
-
});
|
|
12
|
-
register(name: string, fn: ShutdownFn): void;
|
|
13
|
-
get draining(): boolean;
|
|
14
|
-
install(signals?: NodeJS.Signals[]): void;
|
|
15
|
-
fire(reason: string, code?: number): Promise<void>;
|
|
16
|
-
}
|
|
17
|
-
//# sourceMappingURL=lifecycle.d.ts.map
|
package/dist/lifecycle.d.ts.map
DELETED
|
@@ -1 +0,0 @@
|
|
|
1
|
-
{"version":3,"file":"lifecycle.d.ts","sourceRoot":"","sources":["../src/lifecycle.ts"],"names":[],"mappings":"AAOA,MAAM,MAAM,UAAU,GAAG,MAAM,OAAO,CAAC,IAAI,CAAC,GAAG,IAAI,CAAC;AAOpD,qBAAa,gBAAgB;IAMzB,OAAO,CAAC,QAAQ,CAAC,IAAI;IALvB,OAAO,CAAC,OAAO,CAAe;IAC9B,OAAO,CAAC,SAAS,CAAS;IAC1B,OAAO,CAAC,MAAM,CAAS;gBAGJ,IAAI,EAAE;QACrB,SAAS,EAAE,MAAM,CAAC;QAClB,GAAG,EAAE,CAAC,KAAK,EAAE,MAAM,GAAG,MAAM,GAAG,OAAO,EAAE,GAAG,EAAE,MAAM,EAAE,IAAI,CAAC,EAAE,MAAM,CAAC,MAAM,EAAE,OAAO,CAAC,KAAK,IAAI,CAAC;QAC7F,IAAI,CAAC,EAAE,CAAC,IAAI,EAAE,MAAM,KAAK,IAAI,CAAC;KAC/B;IAGH,QAAQ,CAAC,IAAI,EAAE,MAAM,EAAE,EAAE,EAAE,UAAU,GAAG,IAAI;IAI5C,IAAI,QAAQ,IAAI,OAAO,CAEtB;IAED,OAAO,CAAC,OAAO,GAAE,MAAM,CAAC,OAAO,EAA0B,GAAG,IAAI;IAU1D,IAAI,CAAC,MAAM,EAAE,MAAM,EAAE,IAAI,SAAI,GAAG,OAAO,CAAC,IAAI,CAAC;CAuCpD"}
|
package/dist/lifecycle.js
DELETED
|
@@ -1,66 +0,0 @@
|
|
|
1
|
-
// Copyright (C) 2026 Garudex Labs. All Rights Reserved.
|
|
2
|
-
// Caracal, a product of Garudex Labs
|
|
3
|
-
//
|
|
4
|
-
// Shared graceful shutdown registry for TypeScript services.
|
|
5
|
-
import { withTimeout } from './async.js';
|
|
6
|
-
export class ShutdownRegistry {
|
|
7
|
-
opts;
|
|
8
|
-
entries = [];
|
|
9
|
-
installed = false;
|
|
10
|
-
firing = false;
|
|
11
|
-
constructor(opts) {
|
|
12
|
-
this.opts = opts;
|
|
13
|
-
}
|
|
14
|
-
register(name, fn) {
|
|
15
|
-
this.entries.push({ name, fn });
|
|
16
|
-
}
|
|
17
|
-
get draining() {
|
|
18
|
-
return this.firing;
|
|
19
|
-
}
|
|
20
|
-
install(signals = ['SIGTERM', 'SIGINT']) {
|
|
21
|
-
if (this.installed)
|
|
22
|
-
return;
|
|
23
|
-
this.installed = true;
|
|
24
|
-
for (const sig of signals) {
|
|
25
|
-
process.once(sig, () => {
|
|
26
|
-
void this.fire(sig, 0);
|
|
27
|
-
});
|
|
28
|
-
}
|
|
29
|
-
}
|
|
30
|
-
async fire(reason, code = 0) {
|
|
31
|
-
if (this.firing)
|
|
32
|
-
return;
|
|
33
|
-
this.firing = true;
|
|
34
|
-
this.opts.log('info', 'shutdown initiated', { reason, entries: this.entries.length });
|
|
35
|
-
const exit = this.opts.exit ?? ((exitCode) => process.exit(exitCode));
|
|
36
|
-
const deadline = Date.now() + this.opts.timeoutMs;
|
|
37
|
-
const timeout = setTimeout(() => {
|
|
38
|
-
this.opts.log('error', 'shutdown timed out; forcing exit', { timeoutMs: this.opts.timeoutMs });
|
|
39
|
-
exit(1);
|
|
40
|
-
}, this.opts.timeoutMs);
|
|
41
|
-
timeout.unref();
|
|
42
|
-
let exitCode = code;
|
|
43
|
-
for (const entry of [...this.entries].reverse()) {
|
|
44
|
-
const remaining = deadline - Date.now();
|
|
45
|
-
if (remaining <= 0) {
|
|
46
|
-
this.opts.log('error', 'shutdown deadline exceeded; skipping remaining', { skipped: entry.name });
|
|
47
|
-
exitCode = 1;
|
|
48
|
-
break;
|
|
49
|
-
}
|
|
50
|
-
try {
|
|
51
|
-
await withTimeout(Promise.resolve(entry.fn()), remaining, `shutdown step ${entry.name} did not complete within ${remaining}ms`);
|
|
52
|
-
this.opts.log('info', 'shutdown step completed', { entry: entry.name });
|
|
53
|
-
}
|
|
54
|
-
catch (err) {
|
|
55
|
-
this.opts.log('error', 'shutdown step failed', {
|
|
56
|
-
entry: entry.name,
|
|
57
|
-
err: err.message,
|
|
58
|
-
});
|
|
59
|
-
exitCode = 1;
|
|
60
|
-
}
|
|
61
|
-
}
|
|
62
|
-
clearTimeout(timeout);
|
|
63
|
-
exit(exitCode);
|
|
64
|
-
}
|
|
65
|
-
}
|
|
66
|
-
//# sourceMappingURL=lifecycle.js.map
|
package/dist/lifecycle.js.map
DELETED
|
@@ -1 +0,0 @@
|
|
|
1
|
-
{"version":3,"file":"lifecycle.js","sourceRoot":"","sources":["../src/lifecycle.ts"],"names":[],"mappings":"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"}
|
package/dist/metrics.d.ts
DELETED
package/dist/metrics.d.ts.map
DELETED
|
@@ -1 +0,0 @@
|
|
|
1
|
-
{"version":3,"file":"metrics.d.ts","sourceRoot":"","sources":["../src/metrics.ts"],"names":[],"mappings":"AAMA,OAAO,KAAK,EAAE,WAAW,EAAE,MAAM,YAAY,CAAC;AAwB9C,4EAA4E;AAC5E,wBAAgB,0BAA0B,CAAC,KAAK,CAAC,EAAE,WAAW,GAAG,MAAM,CAuBtE"}
|
package/dist/metrics.js
DELETED
|
@@ -1,43 +0,0 @@
|
|
|
1
|
-
// Copyright (C) 2026 Garudex Labs. All Rights Reserved.
|
|
2
|
-
// Caracal, a product of Garudex Labs
|
|
3
|
-
//
|
|
4
|
-
// Prometheus text-format renderer for Caracal counter snapshots.
|
|
5
|
-
import { devLogMetrics } from './logging.js';
|
|
6
|
-
function renderCounters(counters) {
|
|
7
|
-
const lines = [];
|
|
8
|
-
for (const c of counters) {
|
|
9
|
-
lines.push(`# HELP ${c.name} ${c.help}`);
|
|
10
|
-
lines.push(`# TYPE ${c.name} counter`);
|
|
11
|
-
lines.push(`${c.name} ${c.value}`);
|
|
12
|
-
}
|
|
13
|
-
return lines.join('\n') + '\n';
|
|
14
|
-
}
|
|
15
|
-
function renderGauges(gauges) {
|
|
16
|
-
const lines = [];
|
|
17
|
-
for (const g of gauges) {
|
|
18
|
-
lines.push(`# HELP ${g.name} ${g.help}`);
|
|
19
|
-
lines.push(`# TYPE ${g.name} gauge`);
|
|
20
|
-
lines.push(`${g.name} ${g.value}`);
|
|
21
|
-
}
|
|
22
|
-
return lines.join('\n') + '\n';
|
|
23
|
-
}
|
|
24
|
-
/** Render dev-log + (optional) audit counters in Prometheus text format. */
|
|
25
|
-
export function renderObservabilityMetrics(audit) {
|
|
26
|
-
const log = devLogMetrics();
|
|
27
|
-
const counters = [
|
|
28
|
-
{ name: 'caracal_log_emitted_total', help: 'Dev log records emitted', value: log.emitted },
|
|
29
|
-
{ name: 'caracal_log_dropped_total', help: 'Dev log records dropped due to backpressure', value: log.dropped },
|
|
30
|
-
{ name: 'caracal_log_sampled_total', help: 'Debug log records dropped by sampler', value: log.sampled },
|
|
31
|
-
];
|
|
32
|
-
if (audit) {
|
|
33
|
-
const a = audit.snapshot();
|
|
34
|
-
counters.push({ name: 'caracal_audit_emitted_total', help: 'Audit events accepted into buffer', value: a.emitted }, { name: 'caracal_audit_dropped_total', help: 'Audit events dropped due to full buffer', value: a.dropped }, { name: 'caracal_audit_persisted_total', help: 'Audit events spilled to disk for later replay', value: a.persisted }, { name: 'caracal_audit_drained_total', help: 'Audit events replayed from disk', value: a.drained }, { name: 'caracal_audit_sink_errors_total', help: 'Audit sink (XADD) errors', value: a.sink_errors });
|
|
35
|
-
const gauges = [
|
|
36
|
-
{ name: 'caracal_audit_queue_depth', help: 'Audit buffer depth', value: a.queue_depth },
|
|
37
|
-
{ name: 'caracal_audit_queue_cap', help: 'Audit buffer capacity', value: a.queue_cap },
|
|
38
|
-
];
|
|
39
|
-
return renderCounters(counters) + renderGauges(gauges);
|
|
40
|
-
}
|
|
41
|
-
return renderCounters(counters);
|
|
42
|
-
}
|
|
43
|
-
//# sourceMappingURL=metrics.js.map
|
package/dist/metrics.js.map
DELETED
|
@@ -1 +0,0 @@
|
|
|
1
|
-
{"version":3,"file":"metrics.js","sourceRoot":"","sources":["../src/metrics.ts"],"names":[],"mappings":"AAAA,yDAAyD;AACzD,qCAAqC;AACrC,EAAE;AACF,iEAAiE;AAEjE,OAAO,EAAE,aAAa,EAAE,MAAM,cAAc,CAAC;AAK7C,SAAS,cAAc,CAAC,QAAmB;IACzC,MAAM,KAAK,GAAa,EAAE,CAAC;IAC3B,KAAK,MAAM,CAAC,IAAI,QAAQ,EAAE,CAAC;QACzB,KAAK,CAAC,IAAI,CAAC,UAAU,CAAC,CAAC,IAAI,IAAI,CAAC,CAAC,IAAI,EAAE,CAAC,CAAC;QACzC,KAAK,CAAC,IAAI,CAAC,UAAU,CAAC,CAAC,IAAI,UAAU,CAAC,CAAC;QACvC,KAAK,CAAC,IAAI,CAAC,GAAG,CAAC,CAAC,IAAI,IAAI,CAAC,CAAC,KAAK,EAAE,CAAC,CAAC;IACrC,CAAC;IACD,OAAO,KAAK,CAAC,IAAI,CAAC,IAAI,CAAC,GAAG,IAAI,CAAC;AACjC,CAAC;AAED,SAAS,YAAY,CAAC,MAAiB;IACrC,MAAM,KAAK,GAAa,EAAE,CAAC;IAC3B,KAAK,MAAM,CAAC,IAAI,MAAM,EAAE,CAAC;QACvB,KAAK,CAAC,IAAI,CAAC,UAAU,CAAC,CAAC,IAAI,IAAI,CAAC,CAAC,IAAI,EAAE,CAAC,CAAC;QACzC,KAAK,CAAC,IAAI,CAAC,UAAU,CAAC,CAAC,IAAI,QAAQ,CAAC,CAAC;QACrC,KAAK,CAAC,IAAI,CAAC,GAAG,CAAC,CAAC,IAAI,IAAI,CAAC,CAAC,KAAK,EAAE,CAAC,CAAC;IACrC,CAAC;IACD,OAAO,KAAK,CAAC,IAAI,CAAC,IAAI,CAAC,GAAG,IAAI,CAAC;AACjC,CAAC;AAED,4EAA4E;AAC5E,MAAM,UAAU,0BAA0B,CAAC,KAAmB;IAC5D,MAAM,GAAG,GAAG,aAAa,EAAE,CAAC;IAC5B,MAAM,QAAQ,GAAc;QAC1B,EAAE,IAAI,EAAE,2BAA2B,EAAE,IAAI,EAAE,yBAAyB,EAAE,KAAK,EAAE,GAAG,CAAC,OAAO,EAAE;QAC1F,EAAE,IAAI,EAAE,2BAA2B,EAAE,IAAI,EAAE,6CAA6C,EAAE,KAAK,EAAE,GAAG,CAAC,OAAO,EAAE;QAC9G,EAAE,IAAI,EAAE,2BAA2B,EAAE,IAAI,EAAE,sCAAsC,EAAE,KAAK,EAAE,GAAG,CAAC,OAAO,EAAE;KACxG,CAAC;IACF,IAAI,KAAK,EAAE,CAAC;QACV,MAAM,CAAC,GAAG,KAAK,CAAC,QAAQ,EAAE,CAAC;QAC3B,QAAQ,CAAC,IAAI,CACX,EAAE,IAAI,EAAE,6BAA6B,EAAE,IAAI,EAAE,mCAAmC,EAAE,KAAK,EAAE,CAAC,CAAC,OAAO,EAAE,EACpG,EAAE,IAAI,EAAE,6BAA6B,EAAE,IAAI,EAAE,yCAAyC,EAAE,KAAK,EAAE,CAAC,CAAC,OAAO,EAAE,EAC1G,EAAE,IAAI,EAAE,+BAA+B,EAAE,IAAI,EAAE,+CAA+C,EAAE,KAAK,EAAE,CAAC,CAAC,SAAS,EAAE,EACpH,EAAE,IAAI,EAAE,6BAA6B,EAAE,IAAI,EAAE,iCAAiC,EAAE,KAAK,EAAE,CAAC,CAAC,OAAO,EAAE,EAClG,EAAE,IAAI,EAAE,iCAAiC,EAAE,IAAI,EAAE,0BAA0B,EAAE,KAAK,EAAE,CAAC,CAAC,WAAW,EAAE,CACpG,CAAC;QACF,MAAM,MAAM,GAAc;YACxB,EAAE,IAAI,EAAE,2BAA2B,EAAE,IAAI,EAAE,oBAAoB,EAAE,KAAK,EAAE,CAAC,CAAC,WAAW,EAAE;YACvF,EAAE,IAAI,EAAE,yBAAyB,EAAE,IAAI,EAAE,uBAAuB,EAAE,KAAK,EAAE,CAAC,CAAC,SAAS,EAAE;SACvF,CAAC;QACF,OAAO,cAAc,CAAC,QAAQ,CAAC,GAAG,YAAY,CAAC,MAAM,CAAC,CAAC;IACzD,CAAC;IACD,OAAO,cAAc,CAAC,QAAQ,CAAC,CAAC;AAClC,CAAC"}
|
|
@@ -1,8 +0,0 @@
|
|
|
1
|
-
export interface OperatorIdentity {
|
|
2
|
-
id: string;
|
|
3
|
-
name: string;
|
|
4
|
-
email: string;
|
|
5
|
-
}
|
|
6
|
-
export declare function signOperatorAssertion(adminToken: string, identity: OperatorIdentity, exp: number): string;
|
|
7
|
-
export declare function verifyOperatorAssertion(adminToken: string, assertion: string, now: number): OperatorIdentity | null;
|
|
8
|
-
//# sourceMappingURL=operatorAssertion.d.ts.map
|
|
@@ -1 +0,0 @@
|
|
|
1
|
-
{"version":3,"file":"operatorAssertion.d.ts","sourceRoot":"","sources":["../src/operatorAssertion.ts"],"names":[],"mappings":"AAkBA,MAAM,WAAW,gBAAgB;IAC/B,EAAE,EAAE,MAAM,CAAA;IACV,IAAI,EAAE,MAAM,CAAA;IACZ,KAAK,EAAE,MAAM,CAAA;CACd;AAsBD,wBAAgB,qBAAqB,CAAC,UAAU,EAAE,MAAM,EAAE,QAAQ,EAAE,gBAAgB,EAAE,GAAG,EAAE,MAAM,GAAG,MAAM,CAGzG;AAMD,wBAAgB,uBAAuB,CAAC,UAAU,EAAE,MAAM,EAAE,SAAS,EAAE,MAAM,EAAE,GAAG,EAAE,MAAM,GAAG,gBAAgB,GAAG,IAAI,CAqBnH"}
|
|
@@ -1,70 +0,0 @@
|
|
|
1
|
-
// Copyright (C) 2026 Garudex Labs. All Rights Reserved.
|
|
2
|
-
// Caracal, a product of Garudex Labs
|
|
3
|
-
//
|
|
4
|
-
// Deterministic signing and verification of the Console BFF's operator-identity assertion that carries the authenticated operator's display name and email to the API for creator attribution.
|
|
5
|
-
import { createHmac, timingSafeEqual } from 'node:crypto';
|
|
6
|
-
// The domain-separation label for the operator-identity MAC, versioned and distinct from the
|
|
7
|
-
// account assertion so the two signals can never be confused for one another. It is keyed by the
|
|
8
|
-
// deployment admin token both the BFF and API hold, so forging it needs a credential whose holder
|
|
9
|
-
// already has full deployment authority - it grants nothing new, exactly like the account assertion.
|
|
10
|
-
const OPERATOR_ASSERTION_LABEL = 'caracal:operator:v1';
|
|
11
|
-
const OPERATOR_ASSERTION_PREFIX = 'v1';
|
|
12
|
-
// A defensive ceiling on the serialized identity so a malformed or hostile header cannot blow up
|
|
13
|
-
// the MAC computation. A name and email pair is well within this.
|
|
14
|
-
const MAX_IDENTITY_BYTES = 1024;
|
|
15
|
-
function b64url(value) {
|
|
16
|
-
return Buffer.from(value, 'utf8').toString('base64url');
|
|
17
|
-
}
|
|
18
|
-
function fromB64url(value) {
|
|
19
|
-
try {
|
|
20
|
-
return Buffer.from(value, 'base64url').toString('utf8');
|
|
21
|
-
}
|
|
22
|
-
catch {
|
|
23
|
-
return null;
|
|
24
|
-
}
|
|
25
|
-
}
|
|
26
|
-
function mac(adminToken, payload, exp) {
|
|
27
|
-
return createHmac('sha256', adminToken).update(`${OPERATOR_ASSERTION_LABEL}:${payload}:${exp}`).digest('base64url');
|
|
28
|
-
}
|
|
29
|
-
// Signs an assertion binding the operator's identity to an expiry. The result is a compact dotted
|
|
30
|
-
// token `v1.<b64url(json)>.<exp>.<mac>` the BFF attaches to each proxied request; the API recomputes
|
|
31
|
-
// the MAC with the same admin token to verify it. exp is an absolute Unix time in seconds, kept short
|
|
32
|
-
// by the caller so a captured assertion is only briefly replayable.
|
|
33
|
-
export function signOperatorAssertion(adminToken, identity, exp) {
|
|
34
|
-
const payload = b64url(JSON.stringify({ id: identity.id, name: identity.name, email: identity.email }));
|
|
35
|
-
return `${OPERATOR_ASSERTION_PREFIX}.${payload}.${exp}.${mac(adminToken, payload, exp)}`;
|
|
36
|
-
}
|
|
37
|
-
// Verifies an assertion and returns the bound identity, or null if it is malformed, expired, or its
|
|
38
|
-
// MAC does not match - so the caller attributes to the operator only on a positively verified
|
|
39
|
-
// assertion and otherwise falls back to the admin token's own name. The MAC comparison is
|
|
40
|
-
// constant-time. now is an injectable Unix time in seconds.
|
|
41
|
-
export function verifyOperatorAssertion(adminToken, assertion, now) {
|
|
42
|
-
const parts = assertion.split('.');
|
|
43
|
-
if (parts.length !== 4 || parts[0] !== OPERATOR_ASSERTION_PREFIX)
|
|
44
|
-
return null;
|
|
45
|
-
const payload = parts[1];
|
|
46
|
-
if (payload.length === 0 || Buffer.byteLength(payload, 'utf8') > MAX_IDENTITY_BYTES)
|
|
47
|
-
return null;
|
|
48
|
-
const exp = Number(parts[2]);
|
|
49
|
-
if (!Number.isInteger(exp) || exp <= now)
|
|
50
|
-
return null;
|
|
51
|
-
const expected = mac(adminToken, payload, exp);
|
|
52
|
-
const got = parts[3];
|
|
53
|
-
const expectedBuf = Buffer.from(expected, 'utf8');
|
|
54
|
-
const gotBuf = Buffer.from(got, 'utf8');
|
|
55
|
-
if (expectedBuf.length !== gotBuf.length || !timingSafeEqual(expectedBuf, gotBuf))
|
|
56
|
-
return null;
|
|
57
|
-
const json = fromB64url(payload);
|
|
58
|
-
if (json === null)
|
|
59
|
-
return null;
|
|
60
|
-
try {
|
|
61
|
-
const parsed = JSON.parse(json);
|
|
62
|
-
if (typeof parsed.id !== 'string' || typeof parsed.name !== 'string' || typeof parsed.email !== 'string')
|
|
63
|
-
return null;
|
|
64
|
-
return { id: parsed.id, name: parsed.name, email: parsed.email };
|
|
65
|
-
}
|
|
66
|
-
catch {
|
|
67
|
-
return null;
|
|
68
|
-
}
|
|
69
|
-
}
|
|
70
|
-
//# sourceMappingURL=operatorAssertion.js.map
|
|
@@ -1 +0,0 @@
|
|
|
1
|
-
{"version":3,"file":"operatorAssertion.js","sourceRoot":"","sources":["../src/operatorAssertion.ts"],"names":[],"mappings":"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"}
|
package/dist/telemetry.d.ts
DELETED
|
@@ -1,10 +0,0 @@
|
|
|
1
|
-
type Log = {
|
|
2
|
-
error?: (msg: string, meta?: Record<string, unknown>) => void;
|
|
3
|
-
};
|
|
4
|
-
type FastifyLike = {
|
|
5
|
-
addHook: (name: string, handler: (...args: unknown[]) => unknown) => void;
|
|
6
|
-
};
|
|
7
|
-
export declare function initNodeTelemetry(serviceName: string, log?: Log): () => Promise<void>;
|
|
8
|
-
export declare function instrumentFastifyApp(app: FastifyLike, serviceName: string): void;
|
|
9
|
-
export {};
|
|
10
|
-
//# sourceMappingURL=telemetry.d.ts.map
|
package/dist/telemetry.d.ts.map
DELETED
|
@@ -1 +0,0 @@
|
|
|
1
|
-
{"version":3,"file":"telemetry.d.ts","sourceRoot":"","sources":["../src/telemetry.ts"],"names":[],"mappings":"AAWA,KAAK,GAAG,GAAG;IAAE,KAAK,CAAC,EAAE,CAAC,GAAG,EAAE,MAAM,EAAE,IAAI,CAAC,EAAE,MAAM,CAAC,MAAM,EAAE,OAAO,CAAC,KAAK,IAAI,CAAA;CAAE,CAAA;AAC5E,KAAK,WAAW,GAAG;IACjB,OAAO,EAAE,CAAC,IAAI,EAAE,MAAM,EAAE,OAAO,EAAE,CAAC,GAAG,IAAI,EAAE,OAAO,EAAE,KAAK,OAAO,KAAK,IAAI,CAAA;CAC1E,CAAA;AAID,wBAAgB,iBAAiB,CAAC,WAAW,EAAE,MAAM,EAAE,GAAG,CAAC,EAAE,GAAG,GAAG,MAAM,OAAO,CAAC,IAAI,CAAC,CAmBrF;AAED,wBAAgB,oBAAoB,CAAC,GAAG,EAAE,WAAW,EAAE,WAAW,EAAE,MAAM,GAAG,IAAI,CAyChF"}
|