sliccy 5.56.2 → 5.56.4
This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
- package/README.md +1 -1
- package/dist/node-server/_cloud_core/src/operations/resume.d.ts.map +1 -1
- package/dist/node-server/_cloud_core/src/operations/resume.js +7 -28
- package/dist/node-server/_cloud_core/tests/resume-cone-config.test.js +9 -0
- package/dist/node-server/_shared/index.d.ts +1 -0
- package/dist/node-server/_shared/index.d.ts.map +1 -1
- package/dist/node-server/_shared/index.js +1 -0
- package/dist/node-server/_shared/index.js.map +1 -1
- package/dist/node-server/_shared/secret-env-schema.d.ts +39 -0
- package/dist/node-server/_shared/secret-env-schema.d.ts.map +1 -0
- package/dist/node-server/_shared/secret-env-schema.js +105 -0
- package/dist/node-server/_shared/secret-env-schema.js.map +1 -0
- package/dist/node-server/secrets/env-file.d.ts +2 -23
- package/dist/node-server/secrets/env-file.js +2 -48
- package/dist/node-server/secrets/env-secret-store.d.ts +1 -0
- package/dist/node-server/secrets/env-secret-store.js +6 -30
- package/dist/ui/assets/{account-store-DZ3SVLqc.js → account-store-ZT-kF0Z5.js} +1 -1
- package/dist/ui/assets/{account-store-CNse7UUC.js → account-store-pCe_G2B1.js} +2 -2
- package/dist/ui/assets/{adobe-Cxw3fCzh.js → adobe-DCJSeXrF.js} +1 -1
- package/dist/ui/assets/{adobe-DmrVfS4n.js → adobe-DWiooaZ1.js} +1 -1
- package/dist/ui/assets/{adobe-oauth-state-Dr9AYOTE.js → adobe-oauth-state-fiYAFkdH.js} +1 -1
- package/dist/ui/assets/{agent-message-to-chat-CNDL3ObJ.js → agent-message-to-chat-C_CJGyRM.js} +1 -1
- package/dist/ui/assets/{apps-TFJpW-So.js → apps-CZM85tzt.js} +1 -1
- package/dist/ui/assets/{azure-openai-DmU6DGAr.js → azure-openai-BeldioUS.js} +1 -1
- package/dist/ui/assets/{azure-openai-HWZw_iJi.js → azure-openai-fycGL23u.js} +1 -1
- package/dist/ui/assets/{cerebras-BAnHXxV6.js → cerebras-C50Ng0py.js} +1 -1
- package/dist/ui/assets/{cerebras-CgiX8_vW.js → cerebras-DPgnMNqV.js} +1 -1
- package/dist/ui/assets/clipboard-BNvuE9sr.js +1 -0
- package/dist/ui/assets/{connect-surface-BWjyhuwa.js → connect-surface-27yJCkKN.js} +1 -1
- package/dist/ui/assets/dip-CoyZN4vg.js +1 -0
- package/dist/ui/assets/{dist-BrF-aw7y.js → dist-BN89Ns_Z.js} +1 -1
- package/dist/ui/assets/{dist-EzJs7qm4.js → dist-xQ8LUAri.js} +1 -1
- package/dist/ui/assets/{ensure-speech-assets-D7FGmNhW.js → ensure-speech-assets-Boz5geHw.js} +1 -1
- package/dist/ui/assets/{fs-DhBMy1Dm.js → fs-BHd6JW9e.js} +1 -1
- package/dist/ui/assets/{fs-CvYSSVR-.js → fs-BajLUSqC.js} +2 -2
- package/dist/ui/assets/{github-DvaBAVh9.js → github-C-IiiKSW.js} +1 -1
- package/dist/ui/assets/{github-CxPJNvs0.js → github-C3AkXDPc.js} +2 -2
- package/dist/ui/assets/{github-copilot-lC3Btu53.js → github-copilot-CAzN1qVJ.js} +1 -1
- package/dist/ui/assets/{github-copilot-GxsphPkp.js → github-copilot-DMdrrmrd.js} +1 -1
- package/dist/ui/assets/{hear-1wSd6v_V.js → hear-CESRi1WI.js} +1 -1
- package/dist/ui/assets/{kernel-worker-CbdtLsMn.js → kernel-worker-fcbnV1d4.js} +21 -21
- package/dist/ui/assets/{kokoro-engine-BrIOFvPA.js → kokoro-engine-C1UjYFIW.js} +1 -1
- package/dist/ui/assets/{lick-ws-bridge-twlr1mTO.js → lick-ws-bridge-B3IIpL0z.js} +1 -1
- package/dist/ui/assets/{lick-ws-bridge-Dx6C5KIE.js → lick-ws-bridge-DTdNMdp8.js} +1 -1
- package/dist/ui/assets/{local-llm-BELTh83x.js → local-llm-BvqXUyGO.js} +1 -1
- package/dist/ui/assets/{main-CpNp1h9f.js → main-c8_fnhvT.js} +4 -4
- package/dist/ui/assets/{mount-BDil5kem.js → mount-1T2jNp_h.js} +2 -2
- package/dist/ui/assets/{mount-BDhFRm__.js → mount-C1ncrq5s.js} +1 -1
- package/dist/ui/assets/{new-session-Chbp8cZw.js → new-session-BIdviJR9.js} +2 -2
- package/dist/ui/assets/{oauth-bootstrap-B0HE0v5q.js → oauth-bootstrap-DkurXF54.js} +2 -2
- package/dist/ui/assets/{openai-codex-zk6-YLQh.js → openai-codex-C0Vg6Bdl.js} +1 -1
- package/dist/ui/assets/{openai-codex-CbFt-rc9.js → openai-codex-mxxEmXow.js} +1 -1
- package/dist/ui/assets/{page-follower-tray-Cw4AVN-s.js → page-follower-tray-D2_jps3s.js} +1 -1
- package/dist/ui/assets/{panel-rpc-handlers-B97WQrbo.js → panel-rpc-handlers-BEKYfGnT.js} +2 -2
- package/dist/ui/assets/{provider-Ru9h0epE.js → provider-WqZhBxuz.js} +2 -2
- package/dist/ui/assets/{provider-settings-Bil2k5w6.js → provider-settings-B9NX_v6q.js} +1 -1
- package/dist/ui/assets/provider-store-access-C4aWjJ_m.js +1 -0
- package/dist/ui/assets/provider-store-access-DPKGJUYZ.js +1 -0
- package/dist/ui/assets/{provider-BSnMUFjA.js → provider-uz3hz7bX.js} +1 -1
- package/dist/ui/assets/{providers-BoRjEI13.js → providers-5CMl3egP.js} +1 -1
- package/dist/ui/assets/{providers-B4ygBQ0y.js → providers-BlAmRs-y.js} +2 -2
- package/dist/ui/assets/{quick-llm-B9RexYt4.js → quick-llm-CBNMU21h.js} +1 -1
- package/dist/ui/assets/session-freezer-Bvu1pTYK.js +1 -0
- package/dist/ui/assets/{speak-DPXlyY9O.js → speak-BtLWwLBh.js} +1 -1
- package/dist/ui/assets/{sprinkle-manager-DStv4By6.js → sprinkle-manager-BxPqHA5e.js} +1 -1
- package/dist/ui/assets/{store-Bd61RaaO.js → store-tfOed8sr.js} +1 -1
- package/dist/ui/assets/{sudo-Dg_iQKsV.js → sudo-BzPrFnJV.js} +1 -1
- package/dist/ui/assets/{transformers-env-pS9BHGRq.js → transformers-env-BECmKWsq.js} +1 -1
- package/dist/ui/assets/{tray-leader-BqdDosmM.js → tray-leader-BRM51tU5.js} +1 -1
- package/dist/ui/assets/{tray-leave-runtime-d2LxWDYd.js → tray-leave-runtime-DeGl9wFv.js} +1 -1
- package/dist/ui/assets/{upgrade-detection-B2lsGcZD.js → upgrade-detection-BVgjVcEI.js} +1 -1
- package/dist/ui/assets/{voice-reply-BXYF5IKD.js → voice-reply-Dmvfw2QY.js} +1 -1
- package/dist/ui/assets/{wc-attach-Bpeli3DL.js → wc-attach-DtoX_woX.js} +2 -2
- package/dist/ui/assets/{wc-extension-j6NSpD57.js → wc-extension-C8cYvich.js} +2 -2
- package/dist/ui/assets/{wc-follower-Cqwji5Fs.js → wc-follower-BwE4SemL.js} +3 -3
- package/dist/ui/assets/{wc-live-Bxmztnvh.js → wc-live-jdJrGeVC.js} +5 -5
- package/dist/ui/assets/{wc-nav-CwfrHz0i.js → wc-nav-DCnXY50K.js} +2 -2
- package/dist/ui/assets/{wc-onboarding-By3vWT_i.js → wc-onboarding-lf4_CPiT.js} +2 -2
- package/dist/ui/assets/{wc-placeholder-gJxtelm_.js → wc-placeholder-xZN1JS6m.js} +3 -3
- package/dist/ui/assets/{wc-settings-BjQi0u3p.js → wc-settings-CObccJBQ.js} +3 -3
- package/dist/ui/assets/{wc-shell-6IYEoh_u.js → wc-shell-Dr5IUYTg.js} +3 -3
- package/dist/ui/assets/{wc-sprinkles-DNgSlSPo.js → wc-sprinkles-D44hf7r-.js} +2 -2
- package/dist/ui/assets/{wc-tray-Cg-JCdkj.js → wc-tray-hW5ggGID.js} +2 -2
- package/dist/ui/assets/{whisper-engine-DyfM_VhO.js → whisper-engine-BDl6-gsg.js} +1 -1
- package/dist/ui/assets/{xai-grok-s_25BJGJ.js → xai-grok-4_10S87t.js} +1 -1
- package/dist/ui/assets/{xai-grok-Cz-snRkW.js → xai-grok-BDOro0Q8.js} +1 -1
- package/dist/ui/index.html +3 -3
- package/dist/ui/llm-proxy-sw.js +1 -1
- package/dist/ui/packages/webapp/index.html +3 -3
- package/package.json +1 -1
- package/dist/ui/assets/clipboard-C68uXccl.js +0 -1
- package/dist/ui/assets/dip-DqdbxsNe.js +0 -1
- package/dist/ui/assets/provider-store-access-BdsKYjib.js +0 -1
- package/dist/ui/assets/provider-store-access-CyB4-bOG.js +0 -1
- package/dist/ui/assets/session-freezer-CkVKNAGk.js +0 -1
package/README.md
CHANGED
|
@@ -11,7 +11,7 @@ If this scares, confuses, or excites you, keep reading.
|
|
|
11
11
|
|
|
12
12
|
# slicc — Self-Licking Ice Cream Cone
|
|
13
13
|
|
|
14
|
-
[](https://github.com/ai-ecoverse/vibe-coded-badge-action)
|
|
15
15
|
|
|
16
16
|
[](https://www.npmjs.com/package/sliccy)
|
|
17
17
|
|
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"resume.d.ts","sourceRoot":"","sources":["../../../src/operations/resume.ts"],"names":[],"mappings":"
|
|
1
|
+
{"version":3,"file":"resume.d.ts","sourceRoot":"","sources":["../../../src/operations/resume.ts"],"names":[],"mappings":"AACA,OAAO,EAIL,KAAK,eAAe,EACpB,KAAK,eAAe,EAGrB,MAAM,yBAAyB,CAAC;AAGjC,OAAO,KAAK,EAAE,QAAQ,EAAE,MAAM,gBAAgB,CAAC;AAC/C,OAAO,KAAK,EAAiB,gBAAgB,EAAE,MAAM,iBAAiB,CAAC;AACvE,OAAO,KAAK,EAAE,YAAY,EAAE,MAAM,aAAa,CAAC;AAEhD,MAAM,WAAW,cAAc;IAC7B,SAAS,EAAE,gBAAgB,CAAC;IAC5B,QAAQ,EAAE,QAAQ,CAAC;CACpB;AAED,MAAM,WAAW,cAAc;IAC7B,KAAK,EAAE,MAAM,CAAC;IACd,iBAAiB,EAAE,MAAM,CAAC;IAC1B;;4FAEwF;IACxF,sBAAsB,CAAC,EAAE,MAAM,CAAC;IAChC,0EAA0E;IAC1E,eAAe,CAAC,EAAE,eAAe,CAAC;IAClC,cAAc,CAAC,EAAE,MAAM,CAAC;IACxB,aAAa,CAAC,EAAE,MAAM,CAAC;IACvB;kEAC8D;IAC9D,cAAc,CAAC,EAAE,OAAO,CAAC;CAC1B;AAWD;;;;GAIG;AACH,wBAAgB,oBAAoB,CAClC,cAAc,EAAE,MAAM,GAAG,IAAI,EAC7B,UAAU,EAAE,MAAM,EAClB,KAAK,EAAE,eAAe,GACrB;IAAE,cAAc,EAAE,MAAM,CAAC;IAAC,UAAU,EAAE,MAAM,CAAC;IAAC,KAAK,EAAE,eAAe,CAAA;CAAE,CA+BxE;AAED,wBAAsB,UAAU,CAC9B,IAAI,EAAE,cAAc,EACpB,IAAI,EAAE,cAAc,GACnB,OAAO,CAAC,YAAY,CAAC,CA+FvB"}
|
|
@@ -1,3 +1,4 @@
|
|
|
1
|
+
import { pairEnvEntriesToSecrets, parseEnvFilePreservingValues } from '../../../_shared/index.js';
|
|
1
2
|
import { bundleIndex, bundleToFiles, mergeConeConfig, validateConeConfig, } from '../cone-config/index.js';
|
|
2
3
|
import { CloudError } from '../errors.js';
|
|
3
4
|
import { pollForRefreshedStatus } from '../polling.js';
|
|
@@ -7,32 +8,6 @@ import { pollForRefreshedStatus } from '../polling.js';
|
|
|
7
8
|
// Therefore: no `|| true`; we parse status from stdout AND check exitCode.
|
|
8
9
|
const KICK_CMD = 'curl -sS -X POST http://localhost:5710/api/leader-restart -o /dev/null -w "%{http_code}"';
|
|
9
10
|
const DEFAULT_MODEL = 'adobe:claude-opus-4-6';
|
|
10
|
-
function parseSecretsEnv(text) {
|
|
11
|
-
const domains = new Map();
|
|
12
|
-
for (const l of text.split('\n')) {
|
|
13
|
-
const eq = l.indexOf('=');
|
|
14
|
-
if (eq < 0)
|
|
15
|
-
continue;
|
|
16
|
-
const key = l.slice(0, eq);
|
|
17
|
-
if (key.endsWith('_DOMAINS')) {
|
|
18
|
-
domains.set(key.slice(0, -'_DOMAINS'.length), l
|
|
19
|
-
.slice(eq + 1)
|
|
20
|
-
.split(',')
|
|
21
|
-
.filter(Boolean));
|
|
22
|
-
}
|
|
23
|
-
}
|
|
24
|
-
const out = [];
|
|
25
|
-
for (const l of text.split('\n')) {
|
|
26
|
-
const eq = l.indexOf('=');
|
|
27
|
-
if (eq < 0)
|
|
28
|
-
continue;
|
|
29
|
-
const name = l.slice(0, eq);
|
|
30
|
-
if (name.endsWith('_DOMAINS'))
|
|
31
|
-
continue;
|
|
32
|
-
out.push({ name, value: l.slice(eq + 1), domains: domains.get(name) ?? [] });
|
|
33
|
-
}
|
|
34
|
-
return out;
|
|
35
|
-
}
|
|
36
11
|
/**
|
|
37
12
|
* Merge `delta` over the existing files; returns new file contents + names index.
|
|
38
13
|
* When `coneConfigJson` is null (a pre-feature cone), synthesizes a degenerate
|
|
@@ -53,11 +28,15 @@ export function applyConeConfigDelta(coneConfigJson, secretsEnv, delta) {
|
|
|
53
28
|
base = validateConeConfig({
|
|
54
29
|
model: parsed.model ?? DEFAULT_MODEL,
|
|
55
30
|
accounts: parsed.accounts ?? [],
|
|
56
|
-
secrets:
|
|
31
|
+
secrets: pairEnvEntriesToSecrets(parseEnvFilePreservingValues(secretsEnv)),
|
|
57
32
|
});
|
|
58
33
|
}
|
|
59
34
|
else {
|
|
60
|
-
base = {
|
|
35
|
+
base = {
|
|
36
|
+
model: DEFAULT_MODEL,
|
|
37
|
+
accounts: [],
|
|
38
|
+
secrets: pairEnvEntriesToSecrets(parseEnvFilePreservingValues(secretsEnv)),
|
|
39
|
+
};
|
|
61
40
|
}
|
|
62
41
|
// Validate the MERGED result, not just the base: delta upserts arrive as
|
|
63
42
|
// unknown from the worker and are otherwise unvalidated, so this is where a
|
|
@@ -46,6 +46,15 @@ describe('applyConeConfigDelta (read-modify-write of both files)', () => {
|
|
|
46
46
|
const out = applyConeConfigDelta(JSON.stringify({ model: 'adobe:claude-opus-4-6', accounts: [] }), 'JWT=aa.bb==.cc\nJWT_DOMAINS=api.example.com\n', {});
|
|
47
47
|
expect(out.secretsEnv).toContain('JWT=aa.bb==.cc');
|
|
48
48
|
});
|
|
49
|
+
it('preserves quoted and whitespace-padded raw secret values on resume', () => {
|
|
50
|
+
const out = applyConeConfigDelta(JSON.stringify({ model: 'adobe:claude-opus-4-6', accounts: [] }), 'QUOTED="abc"\nQUOTED_DOMAINS=api.example.com\nPADDED= token \nPADDED_DOMAINS=api.example.com\n', {});
|
|
51
|
+
expect(out.secretsEnv).toContain('QUOTED="abc"');
|
|
52
|
+
expect(out.secretsEnv).toContain('PADDED= token ');
|
|
53
|
+
});
|
|
54
|
+
it('trims domain CSV entries when restoring a pre-feature cone', () => {
|
|
55
|
+
const out = applyConeConfigDelta(null, 'TOKEN=value\nTOKEN_DOMAINS=api.example.com, *.example.com\n', {});
|
|
56
|
+
expect(out.secretsEnv).toContain('TOKEN_DOMAINS=api.example.com,*.example.com');
|
|
57
|
+
});
|
|
49
58
|
it('rejects a merged result with a newline-injecting delta secret', () => {
|
|
50
59
|
expect(() => applyConeConfigDelta(null, '', {
|
|
51
60
|
upsert: { secrets: [{ name: 'X', value: 'a\nEVIL=1', domains: ['x.com'] }] },
|
|
@@ -5,6 +5,7 @@ export * from './cdp-frame-unmask.js';
|
|
|
5
5
|
export * from './electron-overlay-route.js';
|
|
6
6
|
export * from './oauth-extra-domains-storage.js';
|
|
7
7
|
export * from './preview-url.js';
|
|
8
|
+
export * from './secret-env-schema.js';
|
|
8
9
|
export * from './secret-masking.js';
|
|
9
10
|
export * from './secrets-pipeline.js';
|
|
10
11
|
export * from './session-secret-store.js';
|
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"index.d.ts","sourceRoot":"","sources":["../src/index.ts"],"names":[],"mappings":"AAEA,cAAc,uBAAuB,CAAC;AACtC,cAAc,aAAa,CAAC;AAC5B,cAAc,sBAAsB,CAAC;AACrC,cAAc,uBAAuB,CAAC;AACtC,cAAc,6BAA6B,CAAC;AAC5C,cAAc,kCAAkC,CAAC;AACjD,cAAc,kBAAkB,CAAC;AACjC,cAAc,qBAAqB,CAAC;AACpC,cAAc,uBAAuB,CAAC;AACtC,cAAc,2BAA2B,CAAC;AAC1C,cAAc,uBAAuB,CAAC;AACtC,cAAc,YAAY,CAAC;AAC3B,cAAc,qBAAqB,CAAC;AACpC,cAAc,yBAAyB,CAAC"}
|
|
1
|
+
{"version":3,"file":"index.d.ts","sourceRoot":"","sources":["../src/index.ts"],"names":[],"mappings":"AAEA,cAAc,uBAAuB,CAAC;AACtC,cAAc,aAAa,CAAC;AAC5B,cAAc,sBAAsB,CAAC;AACrC,cAAc,uBAAuB,CAAC;AACtC,cAAc,6BAA6B,CAAC;AAC5C,cAAc,kCAAkC,CAAC;AACjD,cAAc,kBAAkB,CAAC;AACjC,cAAc,wBAAwB,CAAC;AACvC,cAAc,qBAAqB,CAAC;AACpC,cAAc,uBAAuB,CAAC;AACtC,cAAc,2BAA2B,CAAC;AAC1C,cAAc,uBAAuB,CAAC;AACtC,cAAc,YAAY,CAAC;AAC3B,cAAc,qBAAqB,CAAC;AACpC,cAAc,yBAAyB,CAAC"}
|
|
@@ -6,6 +6,7 @@ export * from './cdp-frame-unmask.js';
|
|
|
6
6
|
export * from './electron-overlay-route.js';
|
|
7
7
|
export * from './oauth-extra-domains-storage.js';
|
|
8
8
|
export * from './preview-url.js';
|
|
9
|
+
export * from './secret-env-schema.js';
|
|
9
10
|
export * from './secret-masking.js';
|
|
10
11
|
export * from './secrets-pipeline.js';
|
|
11
12
|
export * from './session-secret-store.js';
|
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"index.js","sourceRoot":"","sources":["../src/index.ts"],"names":[],"mappings":"AAAA,iFAAiF;AAEjF,cAAc,uBAAuB,CAAC;AACtC,cAAc,aAAa,CAAC;AAC5B,cAAc,sBAAsB,CAAC;AACrC,cAAc,uBAAuB,CAAC;AACtC,cAAc,6BAA6B,CAAC;AAC5C,cAAc,kCAAkC,CAAC;AACjD,cAAc,kBAAkB,CAAC;AACjC,cAAc,qBAAqB,CAAC;AACpC,cAAc,uBAAuB,CAAC;AACtC,cAAc,2BAA2B,CAAC;AAC1C,cAAc,uBAAuB,CAAC;AACtC,cAAc,YAAY,CAAC;AAC3B,cAAc,qBAAqB,CAAC;AACpC,cAAc,yBAAyB,CAAC"}
|
|
1
|
+
{"version":3,"file":"index.js","sourceRoot":"","sources":["../src/index.ts"],"names":[],"mappings":"AAAA,iFAAiF;AAEjF,cAAc,uBAAuB,CAAC;AACtC,cAAc,aAAa,CAAC;AAC5B,cAAc,sBAAsB,CAAC;AACrC,cAAc,uBAAuB,CAAC;AACtC,cAAc,6BAA6B,CAAC;AAC5C,cAAc,kCAAkC,CAAC;AACjD,cAAc,kBAAkB,CAAC;AACjC,cAAc,wBAAwB,CAAC;AACvC,cAAc,qBAAqB,CAAC;AACpC,cAAc,uBAAuB,CAAC;AACtC,cAAc,2BAA2B,CAAC;AAC1C,cAAc,uBAAuB,CAAC;AACtC,cAAc,YAAY,CAAC;AAC3B,cAAc,qBAAqB,CAAC;AACpC,cAAc,yBAAyB,CAAC"}
|
|
@@ -0,0 +1,39 @@
|
|
|
1
|
+
/** Canonical NAME=value / NAME_DOMAINS=csv secret-storage schema. */
|
|
2
|
+
export declare const DOMAINS_SUFFIX = "_DOMAINS";
|
|
3
|
+
export interface EnvEntry {
|
|
4
|
+
key: string;
|
|
5
|
+
value: string;
|
|
6
|
+
}
|
|
7
|
+
export interface SecretEnvEntry {
|
|
8
|
+
name: string;
|
|
9
|
+
value: string;
|
|
10
|
+
domains: string[];
|
|
11
|
+
}
|
|
12
|
+
export declare function parseDomainsCsv(raw: string): string[];
|
|
13
|
+
/** Pair values with non-empty domain companions, preserving first-name order. */
|
|
14
|
+
export declare function pairEnvEntriesToSecrets(entries: EnvEntry[]): SecretEnvEntry[];
|
|
15
|
+
/** Parse the shared, deliberately small .env subset used for secret storage. */
|
|
16
|
+
export declare function parseEnvFile(content: string): EnvEntry[];
|
|
17
|
+
/** Parse assignment lines while preserving every character after the first `=`. */
|
|
18
|
+
export declare function parseEnvFilePreservingValues(content: string): EnvEntry[];
|
|
19
|
+
export declare function serializeEnvFile(entries: EnvEntry[]): string;
|
|
20
|
+
/** Profile name validation shared by every S3 secret-schema writer. */
|
|
21
|
+
export declare const PROFILE_RE: RegExp;
|
|
22
|
+
/** Derive the default authorized-host wildcard for an S3-compatible endpoint. */
|
|
23
|
+
export declare function deriveS3Domains(endpoint: string | undefined): string[];
|
|
24
|
+
export interface S3ProfileInput {
|
|
25
|
+
profile: string;
|
|
26
|
+
accessKey: string;
|
|
27
|
+
secretKey: string;
|
|
28
|
+
region?: string;
|
|
29
|
+
endpoint?: string;
|
|
30
|
+
pathStyle?: boolean;
|
|
31
|
+
domains?: string[];
|
|
32
|
+
}
|
|
33
|
+
export interface S3ProfileValidation {
|
|
34
|
+
ok: boolean;
|
|
35
|
+
error?: string;
|
|
36
|
+
resolvedDomains?: string[];
|
|
37
|
+
}
|
|
38
|
+
export declare function validateS3ProfileInput(input: S3ProfileInput): S3ProfileValidation;
|
|
39
|
+
//# sourceMappingURL=secret-env-schema.d.ts.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"secret-env-schema.d.ts","sourceRoot":"","sources":["../src/secret-env-schema.ts"],"names":[],"mappings":"AAAA,qEAAqE;AAErE,eAAO,MAAM,cAAc,aAAa,CAAC;AAEzC,MAAM,WAAW,QAAQ;IACvB,GAAG,EAAE,MAAM,CAAC;IACZ,KAAK,EAAE,MAAM,CAAC;CACf;AAED,MAAM,WAAW,cAAc;IAC7B,IAAI,EAAE,MAAM,CAAC;IACb,KAAK,EAAE,MAAM,CAAC;IACd,OAAO,EAAE,MAAM,EAAE,CAAC;CACnB;AAED,wBAAgB,eAAe,CAAC,GAAG,EAAE,MAAM,GAAG,MAAM,EAAE,CAKrD;AAED,iFAAiF;AACjF,wBAAgB,uBAAuB,CAAC,OAAO,EAAE,QAAQ,EAAE,GAAG,cAAc,EAAE,CAsB7E;AAED,gFAAgF;AAChF,wBAAgB,YAAY,CAAC,OAAO,EAAE,MAAM,GAAG,QAAQ,EAAE,CAmBxD;AAED,mFAAmF;AACnF,wBAAgB,4BAA4B,CAAC,OAAO,EAAE,MAAM,GAAG,QAAQ,EAAE,CAYxE;AAED,wBAAgB,gBAAgB,CAAC,OAAO,EAAE,QAAQ,EAAE,GAAG,MAAM,CAO5D;AAED,uEAAuE;AACvE,eAAO,MAAM,UAAU,QAAsB,CAAC;AAE9C,iFAAiF;AACjF,wBAAgB,eAAe,CAAC,QAAQ,EAAE,MAAM,GAAG,SAAS,GAAG,MAAM,EAAE,CAStE;AAED,MAAM,WAAW,cAAc;IAC7B,OAAO,EAAE,MAAM,CAAC;IAChB,SAAS,EAAE,MAAM,CAAC;IAClB,SAAS,EAAE,MAAM,CAAC;IAClB,MAAM,CAAC,EAAE,MAAM,CAAC;IAChB,QAAQ,CAAC,EAAE,MAAM,CAAC;IAClB,SAAS,CAAC,EAAE,OAAO,CAAC;IACpB,OAAO,CAAC,EAAE,MAAM,EAAE,CAAC;CACpB;AAED,MAAM,WAAW,mBAAmB;IAClC,EAAE,EAAE,OAAO,CAAC;IACZ,KAAK,CAAC,EAAE,MAAM,CAAC;IACf,eAAe,CAAC,EAAE,MAAM,EAAE,CAAC;CAC5B;AAED,wBAAgB,sBAAsB,CAAC,KAAK,EAAE,cAAc,GAAG,mBAAmB,CASjF"}
|
|
@@ -0,0 +1,105 @@
|
|
|
1
|
+
/** Canonical NAME=value / NAME_DOMAINS=csv secret-storage schema. */
|
|
2
|
+
export const DOMAINS_SUFFIX = '_DOMAINS';
|
|
3
|
+
export function parseDomainsCsv(raw) {
|
|
4
|
+
return raw
|
|
5
|
+
.split(',')
|
|
6
|
+
.map((domain) => domain.trim())
|
|
7
|
+
.filter((domain) => domain.length > 0);
|
|
8
|
+
}
|
|
9
|
+
/** Pair values with non-empty domain companions, preserving first-name order. */
|
|
10
|
+
export function pairEnvEntriesToSecrets(entries) {
|
|
11
|
+
const values = new Map();
|
|
12
|
+
const domains = new Map();
|
|
13
|
+
const order = [];
|
|
14
|
+
for (const entry of entries) {
|
|
15
|
+
if (entry.key.endsWith(DOMAINS_SUFFIX)) {
|
|
16
|
+
const name = entry.key.slice(0, -DOMAINS_SUFFIX.length);
|
|
17
|
+
if (name)
|
|
18
|
+
domains.set(name, parseDomainsCsv(entry.value));
|
|
19
|
+
}
|
|
20
|
+
else {
|
|
21
|
+
if (!values.has(entry.key))
|
|
22
|
+
order.push(entry.key);
|
|
23
|
+
values.set(entry.key, entry.value);
|
|
24
|
+
}
|
|
25
|
+
}
|
|
26
|
+
return order.flatMap((name) => {
|
|
27
|
+
const value = values.get(name);
|
|
28
|
+
const allowedDomains = domains.get(name);
|
|
29
|
+
return value !== undefined && allowedDomains?.length
|
|
30
|
+
? [{ name, value, domains: allowedDomains }]
|
|
31
|
+
: [];
|
|
32
|
+
});
|
|
33
|
+
}
|
|
34
|
+
/** Parse the shared, deliberately small .env subset used for secret storage. */
|
|
35
|
+
export function parseEnvFile(content) {
|
|
36
|
+
const entries = [];
|
|
37
|
+
for (const raw of content.split('\n')) {
|
|
38
|
+
const line = raw.trim();
|
|
39
|
+
if (line === '' || line.startsWith('#'))
|
|
40
|
+
continue;
|
|
41
|
+
const eqIndex = line.indexOf('=');
|
|
42
|
+
if (eqIndex === -1)
|
|
43
|
+
continue;
|
|
44
|
+
const key = line.slice(0, eqIndex).trim();
|
|
45
|
+
let value = line.slice(eqIndex + 1).trim();
|
|
46
|
+
if ((value.startsWith('"') && value.endsWith('"')) ||
|
|
47
|
+
(value.startsWith("'") && value.endsWith("'"))) {
|
|
48
|
+
value = value.slice(1, -1);
|
|
49
|
+
}
|
|
50
|
+
if (key)
|
|
51
|
+
entries.push({ key, value });
|
|
52
|
+
}
|
|
53
|
+
return entries;
|
|
54
|
+
}
|
|
55
|
+
/** Parse assignment lines while preserving every character after the first `=`. */
|
|
56
|
+
export function parseEnvFilePreservingValues(content) {
|
|
57
|
+
const entries = [];
|
|
58
|
+
for (const raw of content.split('\n')) {
|
|
59
|
+
const line = raw.trimStart();
|
|
60
|
+
if (line === '' || line.startsWith('#'))
|
|
61
|
+
continue;
|
|
62
|
+
const eqIndex = raw.indexOf('=');
|
|
63
|
+
if (eqIndex === -1)
|
|
64
|
+
continue;
|
|
65
|
+
const key = raw.slice(0, eqIndex).trim();
|
|
66
|
+
if (key)
|
|
67
|
+
entries.push({ key, value: raw.slice(eqIndex + 1) });
|
|
68
|
+
}
|
|
69
|
+
return entries;
|
|
70
|
+
}
|
|
71
|
+
export function serializeEnvFile(entries) {
|
|
72
|
+
const lines = entries.map(({ key, value }) => {
|
|
73
|
+
const needsQuoting = /[\s#"']/.test(value);
|
|
74
|
+
const serialized = needsQuoting ? `"${value.replace(/"/g, '\\"')}"` : value;
|
|
75
|
+
return `${key}=${serialized}`;
|
|
76
|
+
});
|
|
77
|
+
return `${lines.join('\n')}\n`;
|
|
78
|
+
}
|
|
79
|
+
/** Profile name validation shared by every S3 secret-schema writer. */
|
|
80
|
+
export const PROFILE_RE = /^[a-zA-Z0-9._-]+$/;
|
|
81
|
+
/** Derive the default authorized-host wildcard for an S3-compatible endpoint. */
|
|
82
|
+
export function deriveS3Domains(endpoint) {
|
|
83
|
+
if (!endpoint)
|
|
84
|
+
return ['*.amazonaws.com'];
|
|
85
|
+
try {
|
|
86
|
+
const url = new URL(endpoint);
|
|
87
|
+
const parts = url.host.split('.');
|
|
88
|
+
return parts.length >= 3 ? [`*.${parts.slice(1).join('.')}`] : [url.host];
|
|
89
|
+
}
|
|
90
|
+
catch {
|
|
91
|
+
return ['*.amazonaws.com'];
|
|
92
|
+
}
|
|
93
|
+
}
|
|
94
|
+
export function validateS3ProfileInput(input) {
|
|
95
|
+
if (!input.profile || !PROFILE_RE.test(input.profile)) {
|
|
96
|
+
return { ok: false, error: 'Profile name must be alphanumeric / dot / underscore / hyphen' };
|
|
97
|
+
}
|
|
98
|
+
if (!input.accessKey)
|
|
99
|
+
return { ok: false, error: 'Access Key ID is required' };
|
|
100
|
+
if (!input.secretKey)
|
|
101
|
+
return { ok: false, error: 'Secret Access Key is required' };
|
|
102
|
+
const resolvedDomains = input.domains && input.domains.length > 0 ? input.domains : deriveS3Domains(input.endpoint);
|
|
103
|
+
return { ok: true, resolvedDomains };
|
|
104
|
+
}
|
|
105
|
+
//# sourceMappingURL=secret-env-schema.js.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"secret-env-schema.js","sourceRoot":"","sources":["../src/secret-env-schema.ts"],"names":[],"mappings":"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"}
|
|
@@ -1,23 +1,2 @@
|
|
|
1
|
-
/**
|
|
2
|
-
|
|
3
|
-
*
|
|
4
|
-
* Supports:
|
|
5
|
-
* - KEY=VALUE lines (no quoting required)
|
|
6
|
-
* - Single- and double-quoted values (quotes stripped)
|
|
7
|
-
* - Comment lines starting with #
|
|
8
|
-
* - Blank lines and comments are stripped on round-trip
|
|
9
|
-
*/
|
|
10
|
-
export interface EnvEntry {
|
|
11
|
-
key: string;
|
|
12
|
-
value: string;
|
|
13
|
-
}
|
|
14
|
-
/**
|
|
15
|
-
* Parse .env file content into key-value pairs.
|
|
16
|
-
* Blank lines and comments are skipped.
|
|
17
|
-
*/
|
|
18
|
-
export declare function parseEnvFile(content: string): EnvEntry[];
|
|
19
|
-
/**
|
|
20
|
-
* Serialize key-value pairs back to .env format.
|
|
21
|
-
* Values containing spaces, #, or quotes are double-quoted.
|
|
22
|
-
*/
|
|
23
|
-
export declare function serializeEnvFile(entries: EnvEntry[]): string;
|
|
1
|
+
/** Compatibility re-export; the wire format is owned by @slicc/shared-ts. */
|
|
2
|
+
export { type EnvEntry, parseEnvFile, serializeEnvFile } from '../_shared/index.js';
|
|
@@ -1,48 +1,2 @@
|
|
|
1
|
-
/**
|
|
2
|
-
|
|
3
|
-
*
|
|
4
|
-
* Supports:
|
|
5
|
-
* - KEY=VALUE lines (no quoting required)
|
|
6
|
-
* - Single- and double-quoted values (quotes stripped)
|
|
7
|
-
* - Comment lines starting with #
|
|
8
|
-
* - Blank lines and comments are stripped on round-trip
|
|
9
|
-
*/
|
|
10
|
-
/**
|
|
11
|
-
* Parse .env file content into key-value pairs.
|
|
12
|
-
* Blank lines and comments are skipped.
|
|
13
|
-
*/
|
|
14
|
-
export function parseEnvFile(content) {
|
|
15
|
-
const entries = [];
|
|
16
|
-
for (const raw of content.split('\n')) {
|
|
17
|
-
const line = raw.trim();
|
|
18
|
-
if (line === '' || line.startsWith('#'))
|
|
19
|
-
continue;
|
|
20
|
-
const eqIndex = line.indexOf('=');
|
|
21
|
-
if (eqIndex === -1)
|
|
22
|
-
continue; // malformed line, skip
|
|
23
|
-
const key = line.slice(0, eqIndex).trim();
|
|
24
|
-
let value = line.slice(eqIndex + 1).trim();
|
|
25
|
-
// Strip matching quotes
|
|
26
|
-
if ((value.startsWith('"') && value.endsWith('"')) ||
|
|
27
|
-
(value.startsWith("'") && value.endsWith("'"))) {
|
|
28
|
-
value = value.slice(1, -1);
|
|
29
|
-
}
|
|
30
|
-
if (key) {
|
|
31
|
-
entries.push({ key, value });
|
|
32
|
-
}
|
|
33
|
-
}
|
|
34
|
-
return entries;
|
|
35
|
-
}
|
|
36
|
-
/**
|
|
37
|
-
* Serialize key-value pairs back to .env format.
|
|
38
|
-
* Values containing spaces, #, or quotes are double-quoted.
|
|
39
|
-
*/
|
|
40
|
-
export function serializeEnvFile(entries) {
|
|
41
|
-
const lines = [];
|
|
42
|
-
for (const { key, value } of entries) {
|
|
43
|
-
const needsQuoting = /[\s#"']/.test(value);
|
|
44
|
-
const serialized = needsQuoting ? `"${value.replace(/"/g, '\\"')}"` : value;
|
|
45
|
-
lines.push(`${key}=${serialized}`);
|
|
46
|
-
}
|
|
47
|
-
return lines.join('\n') + '\n';
|
|
48
|
-
}
|
|
1
|
+
/** Compatibility re-export; the wire format is owned by @slicc/shared-ts. */
|
|
2
|
+
export { parseEnvFile, serializeEnvFile } from '../_shared/index.js';
|
|
@@ -9,8 +9,8 @@
|
|
|
9
9
|
import { chmodSync, existsSync, mkdirSync, readFileSync, writeFileSync } from 'node:fs';
|
|
10
10
|
import { homedir } from 'node:os';
|
|
11
11
|
import { dirname, resolve } from 'node:path';
|
|
12
|
+
import { DOMAINS_SUFFIX, pairEnvEntriesToSecrets } from '../_shared/index.js';
|
|
12
13
|
import { parseEnvFile, serializeEnvFile } from './env-file.js';
|
|
13
|
-
const DOMAINS_SUFFIX = '_DOMAINS';
|
|
14
14
|
const DEFAULT_PATH = resolve(homedir(), '.slicc', 'secrets.env');
|
|
15
15
|
const FILE_MODE = 0o600;
|
|
16
16
|
export class EnvSecretStore {
|
|
@@ -19,15 +19,7 @@ export class EnvSecretStore {
|
|
|
19
19
|
this.filePath = filePath ?? process.env['SLICC_SECRETS_FILE'] ?? DEFAULT_PATH;
|
|
20
20
|
}
|
|
21
21
|
get(name) {
|
|
22
|
-
|
|
23
|
-
const valueEntry = entries.find((e) => e.key === name);
|
|
24
|
-
const domainsEntry = entries.find((e) => e.key === name + DOMAINS_SUFFIX);
|
|
25
|
-
if (!valueEntry || !domainsEntry)
|
|
26
|
-
return null;
|
|
27
|
-
const domains = parseDomains(domainsEntry.value);
|
|
28
|
-
if (domains.length === 0)
|
|
29
|
-
return null;
|
|
30
|
-
return { name, value: valueEntry.value, domains };
|
|
22
|
+
return this.readSecrets().find((secret) => secret.name === name) ?? null;
|
|
31
23
|
}
|
|
32
24
|
set(name, value, domains) {
|
|
33
25
|
if (domains.length === 0) {
|
|
@@ -46,20 +38,7 @@ export class EnvSecretStore {
|
|
|
46
38
|
this.writeEntries(filtered);
|
|
47
39
|
}
|
|
48
40
|
list() {
|
|
49
|
-
|
|
50
|
-
const result = [];
|
|
51
|
-
for (const entry of entries) {
|
|
52
|
-
if (entry.key.endsWith(DOMAINS_SUFFIX))
|
|
53
|
-
continue;
|
|
54
|
-
const domainsEntry = entries.find((e) => e.key === entry.key + DOMAINS_SUFFIX);
|
|
55
|
-
if (!domainsEntry)
|
|
56
|
-
continue; // no _DOMAINS → skip (rejected)
|
|
57
|
-
const domains = parseDomains(domainsEntry.value);
|
|
58
|
-
if (domains.length > 0) {
|
|
59
|
-
result.push({ name: entry.key, domains });
|
|
60
|
-
}
|
|
61
|
-
}
|
|
62
|
-
return result;
|
|
41
|
+
return this.readSecrets().map(({ name, domains }) => ({ name, domains }));
|
|
63
42
|
}
|
|
64
43
|
// -- internal helpers --
|
|
65
44
|
readEntries() {
|
|
@@ -68,6 +47,9 @@ export class EnvSecretStore {
|
|
|
68
47
|
const content = readFileSync(this.filePath, 'utf-8');
|
|
69
48
|
return parseEnvFile(content);
|
|
70
49
|
}
|
|
50
|
+
readSecrets() {
|
|
51
|
+
return pairEnvEntriesToSecrets(this.readEntries());
|
|
52
|
+
}
|
|
71
53
|
writeEntries(entries) {
|
|
72
54
|
const dir = dirname(this.filePath);
|
|
73
55
|
if (!existsSync(dir)) {
|
|
@@ -84,12 +66,6 @@ export class EnvSecretStore {
|
|
|
84
66
|
}
|
|
85
67
|
}
|
|
86
68
|
}
|
|
87
|
-
function parseDomains(value) {
|
|
88
|
-
return value
|
|
89
|
-
.split(',')
|
|
90
|
-
.map((d) => d.trim())
|
|
91
|
-
.filter((d) => d.length > 0);
|
|
92
|
-
}
|
|
93
69
|
function upsertEntry(entries, key, value) {
|
|
94
70
|
const idx = entries.findIndex((e) => e.key === key);
|
|
95
71
|
if (idx >= 0) {
|
|
@@ -1,5 +1,5 @@
|
|
|
1
1
|
const __vite__mapDeps=(i,m=__vite__mapDeps,d=(m.f||(m.f=["assets/oauth-service-w5HZt7Xx.js","assets/preload-helper-CZgWQFsJ.js","assets/proxied-fetch-D3wsof0i.js","assets/rolldown-runtime-aKtaBQYM.js","assets/src-BvERX0WZ.js","assets/runtime-env-DH4NDw4t.js","assets/fetch-body-D2PwksUW.js","assets/panel-rpc-DmJSNs0I.js","assets/wc-permissions-registry-Blyunq37.js"])))=>i.map(i=>d[i]);
|
|
2
|
-
import{n as e,t}from"./rolldown-runtime-aKtaBQYM.js";import{t as n}from"./preload-helper-CZgWQFsJ.js";import{i as r,n as i,r as a}from"./compat-FrhC6T45.js";import"./context-compaction-LYFtS2_f.js";import{t as o}from"./logger-DDBAeTLF.js";import{a as s,i as c}from"./src-BvERX0WZ.js";import{o as l,t as u}from"./proxied-fetch-D3wsof0i.js";import{t as d}from"./secret-topology-_rfIhUjY.js";import{t as f}from"./secrets-bridge-client-a5aLwwny.js";import"./tool-ui-DfXu6quJ.js";import{n as p,o as m,t as h}from"./providers-
|
|
2
|
+
import{n as e,t}from"./rolldown-runtime-aKtaBQYM.js";import{t as n}from"./preload-helper-CZgWQFsJ.js";import{i as r,n as i,r as a}from"./compat-FrhC6T45.js";import"./context-compaction-LYFtS2_f.js";import{t as o}from"./logger-DDBAeTLF.js";import{a as s,i as c}from"./src-BvERX0WZ.js";import{o as l,t as u}from"./proxied-fetch-D3wsof0i.js";import{t as d}from"./secret-topology-_rfIhUjY.js";import{t as f}from"./secrets-bridge-client-a5aLwwny.js";import"./tool-ui-DfXu6quJ.js";import{n as p,o as m,t as h}from"./providers-BlAmRs-y.js";import{n as g,t as _}from"./panel-rpc-DmJSNs0I.js";import{r as v,t as y}from"./bedrock-camp-CZFsedRI.js";var b=Symbol.for(`yaml.alias`),x=Symbol.for(`yaml.document`),S=Symbol.for(`yaml.map`),C=Symbol.for(`yaml.pair`),w=Symbol.for(`yaml.scalar`),T=Symbol.for(`yaml.seq`),E=Symbol.for(`yaml.node.type`),D=e=>!!e&&typeof e==`object`&&e[E]===b,O=e=>!!e&&typeof e==`object`&&e[E]===x,ee=e=>!!e&&typeof e==`object`&&e[E]===S,k=e=>!!e&&typeof e==`object`&&e[E]===C,A=e=>!!e&&typeof e==`object`&&e[E]===w,te=e=>!!e&&typeof e==`object`&&e[E]===T;function j(e){if(e&&typeof e==`object`)switch(e[E]){case S:case T:return!0}return!1}function M(e){if(e&&typeof e==`object`)switch(e[E]){case b:case S:case w:case T:return!0}return!1}var ne=e=>(A(e)||j(e))&&!!e.anchor,N=Symbol(`break visit`),re=Symbol(`skip children`),P=Symbol(`remove node`);function F(e,t){let n=oe(t);O(e)?ie(null,e.contents,n,Object.freeze([e]))===P&&(e.contents=null):ie(null,e,n,Object.freeze([]))}F.BREAK=N,F.SKIP=re,F.REMOVE=P;function ie(e,t,n,r){let i=se(e,t,n,r);if(M(i)||k(i))return ce(e,r,i),ie(e,i,n,r);if(typeof i!=`symbol`){if(j(t)){r=Object.freeze(r.concat(t));for(let e=0;e<t.items.length;++e){let i=ie(e,t.items[e],n,r);if(typeof i==`number`)e=i-1;else if(i===N)return N;else i===P&&(t.items.splice(e,1),--e)}}else if(k(t)){r=Object.freeze(r.concat(t));let e=ie(`key`,t.key,n,r);if(e===N)return N;e===P&&(t.key=null);let i=ie(`value`,t.value,n,r);if(i===N)return N;i===P&&(t.value=null)}}return i}async function ae(e,t){let n=oe(t);O(e)?await I(null,e.contents,n,Object.freeze([e]))===P&&(e.contents=null):await I(null,e,n,Object.freeze([]))}ae.BREAK=N,ae.SKIP=re,ae.REMOVE=P;async function I(e,t,n,r){let i=await se(e,t,n,r);if(M(i)||k(i))return ce(e,r,i),I(e,i,n,r);if(typeof i!=`symbol`){if(j(t)){r=Object.freeze(r.concat(t));for(let e=0;e<t.items.length;++e){let i=await I(e,t.items[e],n,r);if(typeof i==`number`)e=i-1;else if(i===N)return N;else i===P&&(t.items.splice(e,1),--e)}}else if(k(t)){r=Object.freeze(r.concat(t));let e=await I(`key`,t.key,n,r);if(e===N)return N;e===P&&(t.key=null);let i=await I(`value`,t.value,n,r);if(i===N)return N;i===P&&(t.value=null)}}return i}function oe(e){return typeof e==`object`&&(e.Collection||e.Node||e.Value)?Object.assign({Alias:e.Node,Map:e.Node,Scalar:e.Node,Seq:e.Node},e.Value&&{Map:e.Value,Scalar:e.Value,Seq:e.Value},e.Collection&&{Map:e.Collection,Seq:e.Collection},e):e}function se(e,t,n,r){if(typeof n==`function`)return n(e,t,r);if(ee(t))return n.Map?.(e,t,r);if(te(t))return n.Seq?.(e,t,r);if(k(t))return n.Pair?.(e,t,r);if(A(t))return n.Scalar?.(e,t,r);if(D(t))return n.Alias?.(e,t,r)}function ce(e,t,n){let r=t[t.length-1];if(j(r))r.items[e]=n;else if(k(r))e===`key`?r.key=n:r.value=n;else if(O(r))r.contents=n;else{let e=D(r)?`alias`:`scalar`;throw Error(`Cannot replace node with ${e} parent`)}}var le={"!":`%21`,",":`%2C`,"[":`%5B`,"]":`%5D`,"{":`%7B`,"}":`%7D`},ue=e=>e.replace(/[!,[\]{}]/g,e=>le[e]),de=class e{constructor(t,n){this.docStart=null,this.docEnd=!1,this.yaml=Object.assign({},e.defaultYaml,t),this.tags=Object.assign({},e.defaultTags,n)}clone(){let t=new e(this.yaml,this.tags);return t.docStart=this.docStart,t}atDocument(){let t=new e(this.yaml,this.tags);switch(this.yaml.version){case`1.1`:this.atNextDocument=!0;break;case`1.2`:this.atNextDocument=!1,this.yaml={explicit:e.defaultYaml.explicit,version:`1.2`},this.tags=Object.assign({},e.defaultTags);break}return t}add(t,n){this.atNextDocument&&=(this.yaml={explicit:e.defaultYaml.explicit,version:`1.1`},this.tags=Object.assign({},e.defaultTags),!1);let r=t.trim().split(/[ \t]+/),i=r.shift();switch(i){case`%TAG`:{if(r.length!==2&&(n(0,`%TAG directive should contain exactly two parts`),r.length<2))return!1;let[e,t]=r;return this.tags[e]=t,!0}case`%YAML`:{if(this.yaml.explicit=!0,r.length!==1)return n(0,`%YAML directive should contain exactly one part`),!1;let[e]=r;if(e===`1.1`||e===`1.2`)return this.yaml.version=e,!0;{let t=/^\d+\.\d+$/.test(e);return n(6,`Unsupported YAML version ${e}`,t),!1}}default:return n(0,`Unknown directive ${i}`,!0),!1}}tagName(e,t){if(e===`!`)return`!`;if(e[0]!==`!`)return t(`Not a valid tag: ${e}`),null;if(e[1]===`<`){let n=e.slice(2,-1);return n===`!`||n===`!!`?(t(`Verbatim tags aren't resolved, so ${e} is invalid.`),null):(e[e.length-1]!==`>`&&t(`Verbatim tags must end with a >`),n)}let[,n,r]=e.match(/^(.*!)([^!]*)$/s);r||t(`The ${e} tag has no suffix`);let i=this.tags[n];if(i)try{return i+decodeURIComponent(r)}catch(e){return t(String(e)),null}return n===`!`?e:(t(`Could not resolve tag: ${e}`),null)}tagString(e){for(let[t,n]of Object.entries(this.tags))if(e.startsWith(n))return t+ue(e.substring(n.length));return e[0]===`!`?e:`!<${e}>`}toString(e){let t=this.yaml.explicit?[`%YAML ${this.yaml.version||`1.2`}`]:[],n=Object.entries(this.tags),r;if(e&&n.length>0&&M(e.contents)){let t={};F(e.contents,(e,n)=>{M(n)&&n.tag&&(t[n.tag]=!0)}),r=Object.keys(t)}else r=[];for(let[i,a]of n)i===`!!`&&a===`tag:yaml.org,2002:`||(!e||r.some(e=>e.startsWith(a)))&&t.push(`%TAG ${i} ${a}`);return t.join(`
|
|
3
3
|
`)}};de.defaultYaml={explicit:!1,version:`1.2`},de.defaultTags={"!!":`tag:yaml.org,2002:`};function fe(e){if(/[\x00-\x19\s,[\]{}]/.test(e)){let t=`Anchor must not contain whitespace or control characters: ${JSON.stringify(e)}`;throw Error(t)}return!0}function pe(e,t,n,r){if(r&&typeof r==`object`)if(Array.isArray(r))for(let t=0,n=r.length;t<n;++t){let n=r[t],i=pe(e,r,String(t),n);i===void 0?delete r[t]:i!==n&&(r[t]=i)}else if(r instanceof Map)for(let t of Array.from(r.keys())){let n=r.get(t),i=pe(e,r,t,n);i===void 0?r.delete(t):i!==n&&r.set(t,i)}else if(r instanceof Set)for(let t of Array.from(r)){let n=pe(e,r,t,t);n===void 0?r.delete(t):n!==t&&(r.delete(t),r.add(n))}else for(let[t,n]of Object.entries(r)){let i=pe(e,r,t,n);i===void 0?delete r[t]:i!==n&&(r[t]=i)}return e.call(t,n,r)}function L(e,t,n){if(Array.isArray(e))return e.map((e,t)=>L(e,String(t),n));if(e&&typeof e.toJSON==`function`){if(!n||!ne(e))return e.toJSON(t,n);let r={aliasCount:0,count:1,res:void 0};n.anchors.set(e,r),n.onCreate=e=>{r.res=e,delete n.onCreate};let i=e.toJSON(t,n);return n.onCreate&&n.onCreate(i),i}return typeof e==`bigint`&&!n?.keep?Number(e):e}var me=class{constructor(e){Object.defineProperty(this,E,{value:e})}clone(){let e=Object.create(Object.getPrototypeOf(this),Object.getOwnPropertyDescriptors(this));return this.range&&(e.range=this.range.slice()),e}toJS(e,{mapAsMap:t,maxAliasCount:n,onAnchor:r,reviver:i}={}){if(!O(e))throw TypeError(`A document argument is required`);let a={anchors:new Map,doc:e,keep:!0,mapAsMap:t===!0,mapKeyWarned:!1,maxAliasCount:typeof n==`number`?n:100},o=L(this,``,a);if(typeof r==`function`)for(let{count:e,res:t}of a.anchors.values())r(t,e);return typeof i==`function`?pe(i,{"":o},``,o):o}},he=class extends me{constructor(e){super(b),this.source=e,Object.defineProperty(this,"tag",{set(){throw Error(`Alias nodes cannot have tags`)}})}resolve(e,t){if(t?.maxAliasCount===0)throw ReferenceError(`Alias resolution is disabled`);let n;t?.aliasResolveCache?n=t.aliasResolveCache:(n=[],F(e,{Node:(e,t)=>{(D(t)||ne(t))&&n.push(t)}}),t&&(t.aliasResolveCache=n));let r;for(let e of n){if(e===this)break;e.anchor===this.source&&(r=e)}return r}toJSON(e,t){if(!t)return{source:this.source};let{anchors:n,doc:r,maxAliasCount:i}=t,a=this.resolve(r,t);if(!a){let e=`Unresolved alias (the anchor must be set before the alias): ${this.source}`;throw ReferenceError(e)}let o=n.get(a);if(o||=(L(a,null,t),n.get(a)),o?.res===void 0)throw ReferenceError(`This should not happen: Alias anchor was not resolved?`);if(i>=0&&(o.count+=1,o.aliasCount===0&&(o.aliasCount=ge(r,a,n)),o.count*o.aliasCount>i))throw ReferenceError(`Excessive alias count indicates a resource exhaustion attack`);return o.res}toString(e,t,n){let r=`*${this.source}`;if(e){if(fe(this.source),e.options.verifyAliasOrder&&!e.anchors.has(this.source)){let e=`Unresolved alias (the anchor must be set before the alias): ${this.source}`;throw Error(e)}if(e.implicitKey)return`${r} `}return r}};function ge(e,t,n){if(D(t)){let r=t.resolve(e),i=n&&r&&n.get(r);return i?i.count*i.aliasCount:0}else if(j(t)){let r=0;for(let i of t.items){let t=ge(e,i,n);t>r&&(r=t)}return r}else if(k(t)){let r=ge(e,t.key,n),i=ge(e,t.value,n);return Math.max(r,i)}return 1}var _e=e=>!e||typeof e!=`function`&&typeof e!=`object`,R=class extends me{constructor(e){super(w),this.value=e}toJSON(e,t){return t?.keep?this.value:L(this.value,e,t)}toString(){return String(this.value)}};R.BLOCK_FOLDED=`BLOCK_FOLDED`,R.BLOCK_LITERAL=`BLOCK_LITERAL`,R.PLAIN=`PLAIN`,R.QUOTE_DOUBLE=`QUOTE_DOUBLE`,R.QUOTE_SINGLE=`QUOTE_SINGLE`;var ve=`tag:yaml.org,2002:`;function ye(e,t,n){if(t){let e=n.filter(e=>e.tag===t),r=e.find(e=>!e.format)??e[0];if(!r)throw Error(`Tag ${t} not found`);return r}return n.find(t=>t.identify?.(e)&&!t.format)}function be(e,t,n){if(O(e)&&(e=e.contents),M(e))return e;if(k(e)){let t=n.schema[S].createNode?.(n.schema,null,n);return t.items.push(e),t}(e instanceof String||e instanceof Number||e instanceof Boolean||typeof BigInt<`u`&&e instanceof BigInt)&&(e=e.valueOf());let{aliasDuplicateObjects:r,onAnchor:i,onTagObj:a,schema:o,sourceObjects:s}=n,c;if(r&&e&&typeof e==`object`){if(c=s.get(e),c)return c.anchor??=i(e),new he(c.anchor);c={anchor:null,node:null},s.set(e,c)}t?.startsWith(`!!`)&&(t=ve+t.slice(2));let l=ye(e,t,o.tags);if(!l){if(e&&typeof e.toJSON==`function`&&(e=e.toJSON()),!e||typeof e!=`object`){let t=new R(e);return c&&(c.node=t),t}l=e instanceof Map?o[S]:Symbol.iterator in Object(e)?o[T]:o[S]}a&&(a(l),delete n.onTagObj);let u=l?.createNode?l.createNode(n.schema,e,n):typeof l?.nodeClass?.from==`function`?l.nodeClass.from(n.schema,e,n):new R(e);return t?u.tag=t:l.default||(u.tag=l.tag),c&&(c.node=u),u}function xe(e,t,n){let r=n;for(let e=t.length-1;e>=0;--e){let n=t[e];if(typeof n==`number`&&Number.isInteger(n)&&n>=0){let e=[];e[n]=r,r=e}else r=new Map([[n,r]])}return be(r,void 0,{aliasDuplicateObjects:!1,keepUndefined:!1,onAnchor:()=>{throw Error(`This should not happen, please report a bug.`)},schema:e,sourceObjects:new Map})}var Se=e=>e==null||typeof e==`object`&&!!e[Symbol.iterator]().next().done,Ce=class extends me{constructor(e,t){super(e),Object.defineProperty(this,"schema",{value:t,configurable:!0,enumerable:!1,writable:!0})}clone(e){let t=Object.create(Object.getPrototypeOf(this),Object.getOwnPropertyDescriptors(this));return e&&(t.schema=e),t.items=t.items.map(t=>M(t)||k(t)?t.clone(e):t),this.range&&(t.range=this.range.slice()),t}addIn(e,t){if(Se(e))this.add(t);else{let[n,...r]=e,i=this.get(n,!0);if(j(i))i.addIn(r,t);else if(i===void 0&&this.schema)this.set(n,xe(this.schema,r,t));else throw Error(`Expected YAML collection at ${n}. Remaining path: ${r}`)}}deleteIn(e){let[t,...n]=e;if(n.length===0)return this.delete(t);let r=this.get(t,!0);if(j(r))return r.deleteIn(n);throw Error(`Expected YAML collection at ${t}. Remaining path: ${n}`)}getIn(e,t){let[n,...r]=e,i=this.get(n,!0);return r.length===0?!t&&A(i)?i.value:i:j(i)?i.getIn(r,t):void 0}hasAllNullValues(e){return this.items.every(t=>{if(!k(t))return!1;let n=t.value;return n==null||e&&A(n)&&n.value==null&&!n.commentBefore&&!n.comment&&!n.tag})}hasIn(e){let[t,...n]=e;if(n.length===0)return this.has(t);let r=this.get(t,!0);return j(r)?r.hasIn(n):!1}setIn(e,t){let[n,...r]=e;if(r.length===0)this.set(n,t);else{let e=this.get(n,!0);if(j(e))e.setIn(r,t);else if(e===void 0&&this.schema)this.set(n,xe(this.schema,r,t));else throw Error(`Expected YAML collection at ${n}. Remaining path: ${r}`)}}},we=e=>e.replace(/^(?!$)(?: $)?/gm,`#`);function Te(e,t){return/^\n+$/.test(e)?e.substring(1):t?e.replace(/^(?! *$)/gm,t):e}var z=(e,t,n)=>e.endsWith(`
|
|
4
4
|
`)?Te(n,t):n.includes(`
|
|
5
5
|
`)?`
|