@productbrain/cli 0.1.0-beta.9254 → 0.1.0-beta.9276
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/__tests__/login.test.js +18 -1
- package/dist/__tests__/login.test.js.map +1 -1
- package/dist/__tests__/profiles.test.js +31 -1
- package/dist/__tests__/profiles.test.js.map +1 -1
- package/dist/commands/connect-config.test.js +11 -3
- package/dist/commands/connect-config.test.js.map +1 -1
- package/dist/commands/connect-integration.test.js +9 -5
- package/dist/commands/connect-integration.test.js.map +1 -1
- package/dist/commands/connect-legacy-migration.test.js +19 -19
- package/dist/commands/connect-legacy-migration.test.js.map +1 -1
- package/dist/commands/connect.d.ts +7 -9
- package/dist/commands/connect.d.ts.map +1 -1
- package/dist/commands/connect.js +70 -125
- package/dist/commands/connect.js.map +1 -1
- package/dist/commands/connect.test.js +73 -141
- package/dist/commands/connect.test.js.map +1 -1
- package/dist/commands/login.d.ts.map +1 -1
- package/dist/commands/login.js +15 -11
- package/dist/commands/login.js.map +1 -1
- package/dist/lib/connectProfileName.d.ts +36 -0
- package/dist/lib/connectProfileName.d.ts.map +1 -0
- package/dist/lib/connectProfileName.js +72 -0
- package/dist/lib/connectProfileName.js.map +1 -0
- package/dist/lib/connectProfileName.test.d.ts +2 -0
- package/dist/lib/connectProfileName.test.d.ts.map +1 -0
- package/dist/lib/connectProfileName.test.js +100 -0
- package/dist/lib/connectProfileName.test.js.map +1 -0
- package/dist/lib/errors.d.ts +3 -4
- package/dist/lib/errors.d.ts.map +1 -1
- package/dist/lib/errors.js +3 -4
- package/dist/lib/errors.js.map +1 -1
- package/dist/lib/profiles.d.ts +10 -8
- package/dist/lib/profiles.d.ts.map +1 -1
- package/dist/lib/profiles.js +15 -15
- package/dist/lib/profiles.js.map +1 -1
- package/package.json +1 -1
|
@@ -0,0 +1,72 @@
|
|
|
1
|
+
/**
|
|
2
|
+
* The profile name `pb connect` gives a connection (TASK-638, DEC-1961): `<workspace>-<folder>`,
|
|
3
|
+
* so several folders on one machine can each hold their own key for one workspace:
|
|
4
|
+
* - the folder is the main clone's directory, read from the git common dir, so a Superset
|
|
5
|
+
* worktree names the same profile as its main clone (DEC-1606 copies the pin across);
|
|
6
|
+
* outside git it is the current directory;
|
|
7
|
+
* - a folder whose slug already is, or starts with, the workspace slug is the name on its own
|
|
8
|
+
* (`product-brain` + `product-brain-positioning` → `product-brain-positioning`);
|
|
9
|
+
* - the name fits PROFILE_NAME_RE (32 chars): the folder part is cut first, then the workspace
|
|
10
|
+
* part, and a `-N` clash suffix always fits.
|
|
11
|
+
*/
|
|
12
|
+
import { execFileSync } from 'node:child_process';
|
|
13
|
+
import { basename, dirname } from 'node:path';
|
|
14
|
+
const PROFILE_NAME_MAX = 32;
|
|
15
|
+
/** The folder part keeps at least this many characters before the workspace part is cut. */
|
|
16
|
+
const MIN_FOLDER_CHARS = 12;
|
|
17
|
+
/** Bounded search for a free `-N`; a machine with 99 same-named folders is refused, not looped. */
|
|
18
|
+
const MAX_CLASH_SUFFIX = 99;
|
|
19
|
+
/** Lowercase, every run of other characters becomes one hyphen, no leading or trailing hyphen. */
|
|
20
|
+
export function slugify(name) {
|
|
21
|
+
return name.toLowerCase().replace(/[^a-z0-9]+/g, '-').replace(/^-+|-+$/g, '');
|
|
22
|
+
}
|
|
23
|
+
function cut(slug, max) {
|
|
24
|
+
return slug.slice(0, max).replace(/-+$/, '');
|
|
25
|
+
}
|
|
26
|
+
/**
|
|
27
|
+
* The folder a connect is named after: the directory holding the git common dir (the main
|
|
28
|
+
* clone, also from inside a worktree), or `cwd` itself outside git.
|
|
29
|
+
*/
|
|
30
|
+
export function connectFolderName(cwd) {
|
|
31
|
+
try {
|
|
32
|
+
const commonDir = execFileSync('git', ['rev-parse', '--path-format=absolute', '--git-common-dir'], {
|
|
33
|
+
cwd,
|
|
34
|
+
encoding: 'utf8',
|
|
35
|
+
stdio: ['ignore', 'pipe', 'ignore'],
|
|
36
|
+
}).trim();
|
|
37
|
+
return basename(dirname(commonDir));
|
|
38
|
+
}
|
|
39
|
+
catch {
|
|
40
|
+
// Not inside a git repository: the folder itself names the connection.
|
|
41
|
+
return basename(cwd);
|
|
42
|
+
}
|
|
43
|
+
}
|
|
44
|
+
/** The name for clash attempt `n` (1 = no suffix, 2 → `-2`, …), always within 32 chars. */
|
|
45
|
+
export function composeProfileName(workspaceName, folderName, n = 1) {
|
|
46
|
+
const suffix = n === 1 ? '' : `-${n}`;
|
|
47
|
+
const budget = PROFILE_NAME_MAX - suffix.length;
|
|
48
|
+
const ws = slugify(workspaceName) || 'workspace';
|
|
49
|
+
const folder = slugify(folderName);
|
|
50
|
+
if (!folder)
|
|
51
|
+
return cut(ws, budget) + suffix;
|
|
52
|
+
if (folder === ws || folder.startsWith(`${ws}-`))
|
|
53
|
+
return cut(folder, budget) + suffix;
|
|
54
|
+
const over = ws.length + 1 + folder.length - budget;
|
|
55
|
+
if (over <= 0)
|
|
56
|
+
return `${ws}-${folder}${suffix}`;
|
|
57
|
+
const folderPart = cut(folder, Math.max(folder.length - over, Math.min(folder.length, MIN_FOLDER_CHARS)));
|
|
58
|
+
const wsPart = cut(ws, budget - 1 - folderPart.length);
|
|
59
|
+
return `${wsPart}-${folderPart}${suffix}`;
|
|
60
|
+
}
|
|
61
|
+
/**
|
|
62
|
+
* Pick the profile a connect writes. This folder's own pin, if it is any of this folder's names,
|
|
63
|
+
* is replaced in place first; otherwise the first free `-N`. Never another folder's profile.
|
|
64
|
+
*/
|
|
65
|
+
export function pickConnectProfileName(args) {
|
|
66
|
+
const names = Array.from({ length: MAX_CLASH_SUFFIX }, (_, i) => composeProfileName(args.workspaceName, args.folderName, i + 1));
|
|
67
|
+
if (args.ownPin && names.includes(args.ownPin))
|
|
68
|
+
return { profileName: args.ownPin, replace: true };
|
|
69
|
+
const free = names.find((name) => !args.isTaken(name));
|
|
70
|
+
return free ? { profileName: free, replace: false } : null;
|
|
71
|
+
}
|
|
72
|
+
//# sourceMappingURL=connectProfileName.js.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"connectProfileName.js","sourceRoot":"","sources":["../../src/lib/connectProfileName.ts"],"names":[],"mappings":"AAAA;;;;;;;;;;GAUG;AAEH,OAAO,EAAE,YAAY,EAAE,MAAM,oBAAoB,CAAC;AAClD,OAAO,EAAE,QAAQ,EAAE,OAAO,EAAE,MAAM,WAAW,CAAC;AAE9C,MAAM,gBAAgB,GAAG,EAAE,CAAC;AAC5B,4FAA4F;AAC5F,MAAM,gBAAgB,GAAG,EAAE,CAAC;AAC5B,mGAAmG;AACnG,MAAM,gBAAgB,GAAG,EAAE,CAAC;AAE5B,kGAAkG;AAClG,MAAM,UAAU,OAAO,CAAC,IAAY;IAClC,OAAO,IAAI,CAAC,WAAW,EAAE,CAAC,OAAO,CAAC,aAAa,EAAE,GAAG,CAAC,CAAC,OAAO,CAAC,UAAU,EAAE,EAAE,CAAC,CAAC;AAChF,CAAC;AAED,SAAS,GAAG,CAAC,IAAY,EAAE,GAAW;IACpC,OAAO,IAAI,CAAC,KAAK,CAAC,CAAC,EAAE,GAAG,CAAC,CAAC,OAAO,CAAC,KAAK,EAAE,EAAE,CAAC,CAAC;AAC/C,CAAC;AAED;;;GAGG;AACH,MAAM,UAAU,iBAAiB,CAAC,GAAW;IAC3C,IAAI,CAAC;QACH,MAAM,SAAS,GAAG,YAAY,CAAC,KAAK,EAAE,CAAC,WAAW,EAAE,wBAAwB,EAAE,kBAAkB,CAAC,EAAE;YACjG,GAAG;YACH,QAAQ,EAAE,MAAM;YAChB,KAAK,EAAE,CAAC,QAAQ,EAAE,MAAM,EAAE,QAAQ,CAAC;SACpC,CAAC,CAAC,IAAI,EAAE,CAAC;QACV,OAAO,QAAQ,CAAC,OAAO,CAAC,SAAS,CAAC,CAAC,CAAC;IACtC,CAAC;IAAC,MAAM,CAAC;QACP,uEAAuE;QACvE,OAAO,QAAQ,CAAC,GAAG,CAAC,CAAC;IACvB,CAAC;AACH,CAAC;AAED,2FAA2F;AAC3F,MAAM,UAAU,kBAAkB,CAAC,aAAqB,EAAE,UAAkB,EAAE,CAAC,GAAG,CAAC;IACjF,MAAM,MAAM,GAAG,CAAC,KAAK,CAAC,CAAC,CAAC,CAAC,EAAE,CAAC,CAAC,CAAC,IAAI,CAAC,EAAE,CAAC;IACtC,MAAM,MAAM,GAAG,gBAAgB,GAAG,MAAM,CAAC,MAAM,CAAC;IAChD,MAAM,EAAE,GAAG,OAAO,CAAC,aAAa,CAAC,IAAI,WAAW,CAAC;IACjD,MAAM,MAAM,GAAG,OAAO,CAAC,UAAU,CAAC,CAAC;IAEnC,IAAI,CAAC,MAAM;QAAE,OAAO,GAAG,CAAC,EAAE,EAAE,MAAM,CAAC,GAAG,MAAM,CAAC;IAC7C,IAAI,MAAM,KAAK,EAAE,IAAI,MAAM,CAAC,UAAU,CAAC,GAAG,EAAE,GAAG,CAAC;QAAE,OAAO,GAAG,CAAC,MAAM,EAAE,MAAM,CAAC,GAAG,MAAM,CAAC;IAEtF,MAAM,IAAI,GAAG,EAAE,CAAC,MAAM,GAAG,CAAC,GAAG,MAAM,CAAC,MAAM,GAAG,MAAM,CAAC;IACpD,IAAI,IAAI,IAAI,CAAC;QAAE,OAAO,GAAG,EAAE,IAAI,MAAM,GAAG,MAAM,EAAE,CAAC;IACjD,MAAM,UAAU,GAAG,GAAG,CAAC,MAAM,EAAE,IAAI,CAAC,GAAG,CAAC,MAAM,CAAC,MAAM,GAAG,IAAI,EAAE,IAAI,CAAC,GAAG,CAAC,MAAM,CAAC,MAAM,EAAE,gBAAgB,CAAC,CAAC,CAAC,CAAC;IAC1G,MAAM,MAAM,GAAG,GAAG,CAAC,EAAE,EAAE,MAAM,GAAG,CAAC,GAAG,UAAU,CAAC,MAAM,CAAC,CAAC;IACvD,OAAO,GAAG,MAAM,IAAI,UAAU,GAAG,MAAM,EAAE,CAAC;AAC5C,CAAC;AAQD;;;GAGG;AACH,MAAM,UAAU,sBAAsB,CAAC,IAKtC;IACC,MAAM,KAAK,GAAG,KAAK,CAAC,IAAI,CAAC,EAAE,MAAM,EAAE,gBAAgB,EAAE,EAAE,CAAC,CAAC,EAAE,CAAC,EAAE,EAAE,CAAC,kBAAkB,CAAC,IAAI,CAAC,aAAa,EAAE,IAAI,CAAC,UAAU,EAAE,CAAC,GAAG,CAAC,CAAC,CAAC,CAAC;IACjI,IAAI,IAAI,CAAC,MAAM,IAAI,KAAK,CAAC,QAAQ,CAAC,IAAI,CAAC,MAAM,CAAC;QAAE,OAAO,EAAE,WAAW,EAAE,IAAI,CAAC,MAAM,EAAE,OAAO,EAAE,IAAI,EAAE,CAAC;IACnG,MAAM,IAAI,GAAG,KAAK,CAAC,IAAI,CAAC,CAAC,IAAI,EAAE,EAAE,CAAC,CAAC,IAAI,CAAC,OAAO,CAAC,IAAI,CAAC,CAAC,CAAC;IACvD,OAAO,IAAI,CAAC,CAAC,CAAC,EAAE,WAAW,EAAE,IAAI,EAAE,OAAO,EAAE,KAAK,EAAE,CAAC,CAAC,CAAC,IAAI,CAAC;AAC7D,CAAC"}
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"connectProfileName.test.d.ts","sourceRoot":"","sources":["../../src/lib/connectProfileName.test.ts"],"names":[],"mappings":""}
|
|
@@ -0,0 +1,100 @@
|
|
|
1
|
+
/**
|
|
2
|
+
* The pb connect profile-name rule (TASK-638 doneWhen 1, DEC-1961).
|
|
3
|
+
*/
|
|
4
|
+
import { afterAll, beforeAll, describe, expect, it } from 'vitest';
|
|
5
|
+
import { execFileSync } from 'node:child_process';
|
|
6
|
+
import { mkdtempSync, mkdirSync, realpathSync, rmSync, writeFileSync } from 'node:fs';
|
|
7
|
+
import { tmpdir } from 'node:os';
|
|
8
|
+
import { join } from 'node:path';
|
|
9
|
+
import { composeProfileName, connectFolderName, pickConnectProfileName } from './connectProfileName.js';
|
|
10
|
+
const PROFILE_NAME_RE = /^[a-z0-9][a-z0-9-]{0,31}$/;
|
|
11
|
+
// TEN-3088: a git hook's GIT_* env would point git at the real repo — stripped for the fixture
|
|
12
|
+
// spawns here and, in beforeAll, for connectFolderName's own git call.
|
|
13
|
+
const GIT_FIXTURE_ENV = Object.fromEntries(Object.entries(process.env).filter(([key]) => !key.startsWith('GIT_')));
|
|
14
|
+
describe('composeProfileName', () => {
|
|
15
|
+
it('joins workspace and folder: product-brain + Product-OS -> product-brain-product-os', () => {
|
|
16
|
+
expect(composeProfileName('Product Brain', 'Product-OS')).toBe('product-brain-product-os');
|
|
17
|
+
});
|
|
18
|
+
it('a folder already named after the workspace stands alone: product-brain-positioning', () => {
|
|
19
|
+
expect(composeProfileName('Product Brain', 'product-brain-positioning')).toBe('product-brain-positioning');
|
|
20
|
+
expect(composeProfileName('Product Brain', 'Product Brain')).toBe('product-brain');
|
|
21
|
+
});
|
|
22
|
+
it('a mere prefix is not a match: product-brainy -> product-brain-product-brainy', () => {
|
|
23
|
+
expect(composeProfileName('Product Brain', 'product-brainy')).toBe('product-brain-product-brainy');
|
|
24
|
+
});
|
|
25
|
+
it('a 40-char workspace and a 40-char folder give a valid 32-char name', () => {
|
|
26
|
+
const name = composeProfileName('w'.repeat(40), 'f'.repeat(40));
|
|
27
|
+
expect(name).toHaveLength(32);
|
|
28
|
+
expect(name).toMatch(PROFILE_NAME_RE);
|
|
29
|
+
expect(name).toBe(`${'w'.repeat(19)}-${'f'.repeat(12)}`);
|
|
30
|
+
});
|
|
31
|
+
it('a clash suffix always fits the 32-char cap', () => {
|
|
32
|
+
const name = composeProfileName('w'.repeat(40), 'f'.repeat(40), 17);
|
|
33
|
+
expect(name).toMatch(PROFILE_NAME_RE);
|
|
34
|
+
expect(name.endsWith('-17')).toBe(true);
|
|
35
|
+
});
|
|
36
|
+
it('never ends a cut part on a hyphen', () => {
|
|
37
|
+
const name = composeProfileName('a'.repeat(18) + ' b', 'c'.repeat(11) + ' ' + 'd'.repeat(30));
|
|
38
|
+
expect(name).not.toMatch(/--|-$/);
|
|
39
|
+
});
|
|
40
|
+
});
|
|
41
|
+
describe('pickConnectProfileName', () => {
|
|
42
|
+
const base = { workspaceName: 'Product Brain', folderName: 'Product-OS' };
|
|
43
|
+
it('a free name is created', () => {
|
|
44
|
+
expect(pickConnectProfileName({ ...base, ownPin: null, isTaken: () => false }))
|
|
45
|
+
.toEqual({ profileName: 'product-brain-product-os', replace: false });
|
|
46
|
+
});
|
|
47
|
+
it("another folder's profile holds the name -> the next free -2", () => {
|
|
48
|
+
const taken = new Set(['product-brain-product-os']);
|
|
49
|
+
expect(pickConnectProfileName({ ...base, ownPin: null, isTaken: (n) => taken.has(n) }))
|
|
50
|
+
.toEqual({ profileName: 'product-brain-product-os-2', replace: false });
|
|
51
|
+
});
|
|
52
|
+
it("this clone's own pin names the profile -> replaced in place", () => {
|
|
53
|
+
expect(pickConnectProfileName({ ...base, ownPin: 'product-brain-product-os', isTaken: () => true }))
|
|
54
|
+
.toEqual({ profileName: 'product-brain-product-os', replace: true });
|
|
55
|
+
});
|
|
56
|
+
it("this clone's own pin on a -2 is replaced even when the base name is free again", () => {
|
|
57
|
+
const taken = new Set(['product-brain-product-os-2']);
|
|
58
|
+
expect(pickConnectProfileName({ ...base, ownPin: 'product-brain-product-os-2', isTaken: (n) => taken.has(n) }))
|
|
59
|
+
.toEqual({ profileName: 'product-brain-product-os-2', replace: true });
|
|
60
|
+
});
|
|
61
|
+
it('a pin naming some other profile is never renamed or reused: the folder still gets its own name', () => {
|
|
62
|
+
expect(pickConnectProfileName({ ...base, ownPin: 'product-brain', isTaken: (n) => n === 'product-brain' }))
|
|
63
|
+
.toEqual({ profileName: 'product-brain-product-os', replace: false });
|
|
64
|
+
});
|
|
65
|
+
it('the clash search is bounded', () => {
|
|
66
|
+
expect(pickConnectProfileName({ ...base, ownPin: null, isTaken: () => true })).toBeNull();
|
|
67
|
+
});
|
|
68
|
+
});
|
|
69
|
+
describe('connectFolderName', () => {
|
|
70
|
+
let root = '';
|
|
71
|
+
beforeAll(() => {
|
|
72
|
+
for (const key of Object.keys(process.env))
|
|
73
|
+
if (key.startsWith('GIT_'))
|
|
74
|
+
delete process.env[key];
|
|
75
|
+
root = realpathSync(mkdtempSync(join(tmpdir(), 'pb-connect-name-')));
|
|
76
|
+
});
|
|
77
|
+
afterAll(() => rmSync(root, { recursive: true, force: true }));
|
|
78
|
+
function git(cwd, ...args) {
|
|
79
|
+
execFileSync('git', ['-c', 'user.email=t@example.com', '-c', 'user.name=t', ...args], { cwd, stdio: 'ignore', env: GIT_FIXTURE_ENV });
|
|
80
|
+
}
|
|
81
|
+
it('from a worktree -> the main clone folder name', () => {
|
|
82
|
+
const main = join(root, 'Main-Clone');
|
|
83
|
+
mkdirSync(main);
|
|
84
|
+
git(main, 'init', '-q');
|
|
85
|
+
writeFileSync(join(main, 'README'), 'x');
|
|
86
|
+
git(main, 'add', 'README');
|
|
87
|
+
git(main, 'commit', '-q', '-m', 'init');
|
|
88
|
+
git(main, 'worktree', 'add', '-q', '-b', 'side', join(root, 'some-worktree'));
|
|
89
|
+
expect(connectFolderName(main)).toBe('Main-Clone');
|
|
90
|
+
expect(connectFolderName(join(root, 'some-worktree'))).toBe('Main-Clone');
|
|
91
|
+
mkdirSync(join(main, 'sub'));
|
|
92
|
+
expect(connectFolderName(join(main, 'sub'))).toBe('Main-Clone');
|
|
93
|
+
});
|
|
94
|
+
it('outside git -> the current folder name', () => {
|
|
95
|
+
const plain = join(root, 'plain-folder');
|
|
96
|
+
mkdirSync(plain);
|
|
97
|
+
expect(connectFolderName(plain)).toBe('plain-folder');
|
|
98
|
+
});
|
|
99
|
+
});
|
|
100
|
+
//# sourceMappingURL=connectProfileName.test.js.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"connectProfileName.test.js","sourceRoot":"","sources":["../../src/lib/connectProfileName.test.ts"],"names":[],"mappings":"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"}
|
package/dist/lib/errors.d.ts
CHANGED
|
@@ -94,10 +94,9 @@ export declare const ErrorCode: {
|
|
|
94
94
|
readonly PROFILE_IS_LAST: "PROFILE_IS_LAST";
|
|
95
95
|
readonly PROFILE_NAME_INVALID: "PROFILE_NAME_INVALID";
|
|
96
96
|
/**
|
|
97
|
-
* `
|
|
98
|
-
* (TEN-2851).
|
|
99
|
-
*
|
|
100
|
-
* (`PB_PROFILE=<other-name>`).
|
|
97
|
+
* `PB_PROFILE` names a profile that already exists, so `pb connect` would overwrite another
|
|
98
|
+
* key (TEN-2851, TASK-638). Refused before the token is redeemed; the escape hatch is a free
|
|
99
|
+
* name or no PB_PROFILE at all.
|
|
101
100
|
*/
|
|
102
101
|
readonly PROFILE_CREDENTIALS_CONFLICT: "PROFILE_CREDENTIALS_CONFLICT";
|
|
103
102
|
readonly NON_INTERACTIVE: "NON_INTERACTIVE";
|
package/dist/lib/errors.d.ts.map
CHANGED
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"errors.d.ts","sourceRoot":"","sources":["../../src/lib/errors.ts"],"names":[],"mappings":"AAAA;;;;;;;GAOG;AAEH,0DAA0D;AAC1D,MAAM,MAAM,aAAa,GAAG,MAAM,GAAG,SAAS,GAAG,QAAQ,GAAG,YAAY,GAAG,SAAS,GAAG,SAAS,GAAG,UAAU,CAAC;AAE9G,sEAAsE;AACtE,eAAO,MAAM,SAAS;;;;;;;;;IAapB,iGAAiG;;;IAIjG,sIAAsI;;IAEtI,6DAA6D;;IAE7D;;;OAGG;;IAEH;;;;;OAKG;;IAEH;;;;;;;OAOG;;IAEH;;;;OAIG;;IAEH;;;;;OAKG;;IAEH;;;;;OAKG;;IAEH;;;;;;OAMG;;IAEH;;;;;;OAMG;;IAEH;;;;OAIG;;;;;;;IAQH;;;;;
|
|
1
|
+
{"version":3,"file":"errors.d.ts","sourceRoot":"","sources":["../../src/lib/errors.ts"],"names":[],"mappings":"AAAA;;;;;;;GAOG;AAEH,0DAA0D;AAC1D,MAAM,MAAM,aAAa,GAAG,MAAM,GAAG,SAAS,GAAG,QAAQ,GAAG,YAAY,GAAG,SAAS,GAAG,SAAS,GAAG,UAAU,CAAC;AAE9G,sEAAsE;AACtE,eAAO,MAAM,SAAS;;;;;;;;;IAapB,iGAAiG;;;IAIjG,sIAAsI;;IAEtI,6DAA6D;;IAE7D;;;OAGG;;IAEH;;;;;OAKG;;IAEH;;;;;;;OAOG;;IAEH;;;;OAIG;;IAEH;;;;;OAKG;;IAEH;;;;;OAKG;;IAEH;;;;;;OAMG;;IAEH;;;;;;OAMG;;IAEH;;;;OAIG;;;;;;;IAQH;;;;OAIG;;;;;CAOK,CAAC;AAEX,MAAM,MAAM,cAAc,GAAG,CAAC,OAAO,SAAS,CAAC,CAAC,MAAM,OAAO,SAAS,CAAC,CAAC;AAExE;;;;;;;;;GASG;AACH,qBAAa,QAAS,SAAQ,KAAK;IACjC,QAAQ,CAAC,IAAI,EAAE,cAAc,CAAC;IAC9B,QAAQ,CAAC,QAAQ,EAAE,aAAa,CAAC;IACjC,QAAQ,CAAC,QAAQ,CAAC,EAAE,MAAM,CAAC;IAC3B,0FAA0F;IAC1F,QAAQ,CAAC,SAAS,CAAC,EAAE;QAAE,cAAc,CAAC,EAAE,MAAM,CAAC;QAAC,WAAW,CAAC,EAAE,OAAO,CAAA;KAAE,CAAC;gBAGtE,OAAO,EAAE,MAAM,EACf,OAAO,CAAC,EAAE;QACR,IAAI,CAAC,EAAE,cAAc,CAAC;QACtB,QAAQ,CAAC,EAAE,aAAa,CAAC;QACzB,QAAQ,CAAC,EAAE,MAAM,CAAC;QAClB,SAAS,CAAC,EAAE;YAAE,cAAc,CAAC,EAAE,MAAM,CAAC;YAAC,WAAW,CAAC,EAAE,OAAO,CAAA;SAAE,CAAC;KAChE;IAUH,uCAAuC;IACvC,MAAM,IAAI;QAAE,KAAK,EAAE,MAAM,CAAC;QAAC,IAAI,EAAE,MAAM,CAAC;QAAC,QAAQ,EAAE,MAAM,CAAC;QAAC,QAAQ,CAAC,EAAE,MAAM,CAAC;QAAC,SAAS,CAAC,EAAE;YAAE,cAAc,CAAC,EAAE,MAAM,CAAC;YAAC,WAAW,CAAC,EAAE,OAAO,CAAA;SAAE,CAAA;KAAE;CAS/I"}
|
package/dist/lib/errors.js
CHANGED
|
@@ -98,10 +98,9 @@ export const ErrorCode = {
|
|
|
98
98
|
PROFILE_IS_LAST: 'PROFILE_IS_LAST',
|
|
99
99
|
PROFILE_NAME_INVALID: 'PROFILE_NAME_INVALID',
|
|
100
100
|
/**
|
|
101
|
-
* `
|
|
102
|
-
* (TEN-2851).
|
|
103
|
-
*
|
|
104
|
-
* (`PB_PROFILE=<other-name>`).
|
|
101
|
+
* `PB_PROFILE` names a profile that already exists, so `pb connect` would overwrite another
|
|
102
|
+
* key (TEN-2851, TASK-638). Refused before the token is redeemed; the escape hatch is a free
|
|
103
|
+
* name or no PB_PROFILE at all.
|
|
105
104
|
*/
|
|
106
105
|
PROFILE_CREDENTIALS_CONFLICT: 'PROFILE_CREDENTIALS_CONFLICT',
|
|
107
106
|
// Interactive
|
package/dist/lib/errors.js.map
CHANGED
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"errors.js","sourceRoot":"","sources":["../../src/lib/errors.ts"],"names":[],"mappings":"AAAA;;;;;;;GAOG;AAKH,sEAAsE;AACtE,MAAM,CAAC,MAAM,SAAS,GAAG;IACvB,OAAO;IACP,YAAY,EAAE,cAAc;IAC5B,YAAY,EAAE,cAAc;IAC5B,WAAW,EAAE,aAAa;IAC1B,UAAU;IACV,mBAAmB,EAAE,qBAAqB;IAC1C,eAAe,EAAE,iBAAiB;IAClC,SAAS;IACT,cAAc,EAAE,gBAAgB;IAChC,cAAc,EAAE,gBAAgB;IAChC,UAAU;IACV,gBAAgB,EAAE,kBAAkB;IACpC,iGAAiG;IACjG,eAAe,EAAE,iBAAiB;IAClC,aAAa;IACb,iBAAiB,EAAE,mBAAmB;IACtC,sIAAsI;IACtI,SAAS,EAAE,WAAW;IACtB,6DAA6D;IAC7D,oBAAoB,EAAE,sBAAsB;IAC5C;;;OAGG;IACH,sBAAsB,EAAE,wBAAwB;IAChD;;;;;OAKG;IACH,6BAA6B,EAAE,+BAA+B;IAC9D;;;;;;;OAOG;IACH,0BAA0B,EAAE,4BAA4B;IACxD;;;;OAIG;IACH,qBAAqB,EAAE,uBAAuB;IAC9C;;;;;OAKG;IACH,mBAAmB,EAAE,qBAAqB;IAC1C;;;;;OAKG;IACH,0BAA0B,EAAE,4BAA4B;IACxD;;;;;;OAMG;IACH,qBAAqB,EAAE,uBAAuB;IAC9C;;;;;;OAMG;IACH,uBAAuB,EAAE,yBAAyB;IAClD;;;;OAIG;IACH,YAAY,EAAE,cAAc;IAC5B,sBAAsB;IACtB,iBAAiB,EAAE,mBAAmB;IACtC,sBAAsB,EAAE,wBAAwB;IAChD,iBAAiB,EAAE,mBAAmB;IACtC,eAAe,EAAE,iBAAiB;IAClC,oBAAoB,EAAE,sBAAsB;IAC5C
|
|
1
|
+
{"version":3,"file":"errors.js","sourceRoot":"","sources":["../../src/lib/errors.ts"],"names":[],"mappings":"AAAA;;;;;;;GAOG;AAKH,sEAAsE;AACtE,MAAM,CAAC,MAAM,SAAS,GAAG;IACvB,OAAO;IACP,YAAY,EAAE,cAAc;IAC5B,YAAY,EAAE,cAAc;IAC5B,WAAW,EAAE,aAAa;IAC1B,UAAU;IACV,mBAAmB,EAAE,qBAAqB;IAC1C,eAAe,EAAE,iBAAiB;IAClC,SAAS;IACT,cAAc,EAAE,gBAAgB;IAChC,cAAc,EAAE,gBAAgB;IAChC,UAAU;IACV,gBAAgB,EAAE,kBAAkB;IACpC,iGAAiG;IACjG,eAAe,EAAE,iBAAiB;IAClC,aAAa;IACb,iBAAiB,EAAE,mBAAmB;IACtC,sIAAsI;IACtI,SAAS,EAAE,WAAW;IACtB,6DAA6D;IAC7D,oBAAoB,EAAE,sBAAsB;IAC5C;;;OAGG;IACH,sBAAsB,EAAE,wBAAwB;IAChD;;;;;OAKG;IACH,6BAA6B,EAAE,+BAA+B;IAC9D;;;;;;;OAOG;IACH,0BAA0B,EAAE,4BAA4B;IACxD;;;;OAIG;IACH,qBAAqB,EAAE,uBAAuB;IAC9C;;;;;OAKG;IACH,mBAAmB,EAAE,qBAAqB;IAC1C;;;;;OAKG;IACH,0BAA0B,EAAE,4BAA4B;IACxD;;;;;;OAMG;IACH,qBAAqB,EAAE,uBAAuB;IAC9C;;;;;;OAMG;IACH,uBAAuB,EAAE,yBAAyB;IAClD;;;;OAIG;IACH,YAAY,EAAE,cAAc;IAC5B,sBAAsB;IACtB,iBAAiB,EAAE,mBAAmB;IACtC,sBAAsB,EAAE,wBAAwB;IAChD,iBAAiB,EAAE,mBAAmB;IACtC,eAAe,EAAE,iBAAiB;IAClC,oBAAoB,EAAE,sBAAsB;IAC5C;;;;OAIG;IACH,4BAA4B,EAAE,8BAA8B;IAC5D,cAAc;IACd,eAAe,EAAE,iBAAiB;IAClC,WAAW;IACX,cAAc,EAAE,gBAAgB;IAChC,QAAQ,EAAE,UAAU;CACZ,CAAC;AAIX;;;;;;;;;GASG;AACH,MAAM,OAAO,QAAS,SAAQ,KAAK;IACxB,IAAI,CAAiB;IACrB,QAAQ,CAAgB;IACxB,QAAQ,CAAU;IAC3B,0FAA0F;IACjF,SAAS,CAAsD;IAExE,YACE,OAAe,EACf,OAKC;QAED,KAAK,CAAC,OAAO,CAAC,CAAC;QACf,IAAI,CAAC,IAAI,GAAG,UAAU,CAAC;QACvB,IAAI,CAAC,IAAI,GAAG,OAAO,EAAE,IAAI,IAAI,SAAS,CAAC,QAAQ,CAAC;QAChD,IAAI,CAAC,QAAQ,GAAG,OAAO,EAAE,QAAQ,IAAI,UAAU,CAAC;QAChD,IAAI,CAAC,QAAQ,GAAG,OAAO,EAAE,QAAQ,CAAC;QAClC,IAAI,CAAC,SAAS,GAAG,OAAO,EAAE,SAAS,CAAC;IACtC,CAAC;IAED,uCAAuC;IACvC,MAAM;QACJ,OAAO;YACL,KAAK,EAAE,IAAI,CAAC,OAAO;YACnB,IAAI,EAAE,IAAI,CAAC,IAAI;YACf,QAAQ,EAAE,IAAI,CAAC,QAAQ;YACvB,GAAG,CAAC,IAAI,CAAC,QAAQ,CAAC,CAAC,CAAC,EAAE,QAAQ,EAAE,IAAI,CAAC,QAAQ,EAAE,CAAC,CAAC,CAAC,EAAE,CAAC;YACrD,GAAG,CAAC,IAAI,CAAC,SAAS,CAAC,CAAC,CAAC,EAAE,SAAS,EAAE,IAAI,CAAC,SAAS,EAAE,CAAC,CAAC,CAAC,EAAE,CAAC;SACzD,CAAC;IACJ,CAAC;CACF"}
|
package/dist/lib/profiles.d.ts
CHANGED
|
@@ -28,14 +28,16 @@ export interface ResolvedProfileConfig extends ProfileConfig {
|
|
|
28
28
|
}
|
|
29
29
|
/**
|
|
30
30
|
* Validate a profile name — lowercase alphanumeric + hyphens, 1-32 chars, no path
|
|
31
|
-
* separators.
|
|
32
|
-
* (
|
|
33
|
-
*
|
|
34
|
-
* write (TEN-2851 Copilot review: connect.ts's read-before-write called
|
|
35
|
-
* `resolveNamedProfileConfig()` — which resolves a path but never validated — before
|
|
36
|
-
* name validation ever ran).
|
|
31
|
+
* separators. profilePath() runs it on every name, so no caller can turn an untrusted name
|
|
32
|
+
* (`PB_PROFILE`, a committed pin, the active-profile file) into a path outside the profiles
|
|
33
|
+
* folder (TEN-4503).
|
|
37
34
|
*/
|
|
38
35
|
export declare function validateProfileName(name: string): void;
|
|
36
|
+
/**
|
|
37
|
+
* The one place a profile name becomes a file path. It validates the name first, so
|
|
38
|
+
* `../x` or an absolute name is refused before any read or write (TEN-4503).
|
|
39
|
+
*/
|
|
40
|
+
export declare function profilePath(name: string): string;
|
|
39
41
|
/**
|
|
40
42
|
* Auto-migrate legacy ~/.config/productbrain/.env to profiles/default.env.
|
|
41
43
|
* Only runs if legacy file exists AND no profiles directory exists.
|
|
@@ -57,8 +59,8 @@ export declare function getActiveProfile(): string | null;
|
|
|
57
59
|
* TEN-2851: refuses to overwrite an existing profile file by default — a caller wanting to
|
|
58
60
|
* replace an occupied profile's credentials must pass `{ overwrite: true }` explicitly (the
|
|
59
61
|
* act stays deliberate at every call site, never a silent side-effect of a name collision).
|
|
60
|
-
* `pb connect`
|
|
61
|
-
*
|
|
62
|
+
* `pb connect` is the one caller that passes it, and only for the profile this folder's own
|
|
63
|
+
* pin already names — a key rotation (TASK-638, connect.ts saveKeyAsProfile).
|
|
62
64
|
*/
|
|
63
65
|
export declare function createProfile(name: string, apiKey: string, siteUrl?: string, opts?: {
|
|
64
66
|
overwrite?: boolean;
|
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"profiles.d.ts","sourceRoot":"","sources":["../../src/lib/profiles.ts"],"names":[],"mappings":"AAAA;;;;;;;GAOG;AAOH,QAAA,MAAM,eAAe,QAAgD,CAAC;AACtE,QAAA,MAAM,YAAY,QAAuC,CAAC;AAC1D,QAAA,MAAM,mBAAmB,QAA6C,CAAC;AACvE,QAAA,MAAM,eAAe,QAAmC,CAAC;AAKzD,MAAM,WAAW,aAAa;IAC5B,MAAM,EAAE,MAAM,CAAC;IACf,OAAO,CAAC,EAAE,MAAM,CAAC;CAClB;AAED;;;;;;;;GAQG;AACH,MAAM,WAAW,qBAAsB,SAAQ,aAAa;IAC1D,WAAW,EAAE,MAAM,GAAG,IAAI,CAAC;CAC5B;AAED
|
|
1
|
+
{"version":3,"file":"profiles.d.ts","sourceRoot":"","sources":["../../src/lib/profiles.ts"],"names":[],"mappings":"AAAA;;;;;;;GAOG;AAOH,QAAA,MAAM,eAAe,QAAgD,CAAC;AACtE,QAAA,MAAM,YAAY,QAAuC,CAAC;AAC1D,QAAA,MAAM,mBAAmB,QAA6C,CAAC;AACvE,QAAA,MAAM,eAAe,QAAmC,CAAC;AAKzD,MAAM,WAAW,aAAa;IAC5B,MAAM,EAAE,MAAM,CAAC;IACf,OAAO,CAAC,EAAE,MAAM,CAAC;CAClB;AAED;;;;;;;;GAQG;AACH,MAAM,WAAW,qBAAsB,SAAQ,aAAa;IAC1D,WAAW,EAAE,MAAM,GAAG,IAAI,CAAC;CAC5B;AAED;;;;;GAKG;AACH,wBAAgB,mBAAmB,CAAC,IAAI,EAAE,MAAM,GAAG,IAAI,CAOtD;AAED;;;GAGG;AACH,wBAAgB,WAAW,CAAC,IAAI,EAAE,MAAM,GAAG,MAAM,CAGhD;AAwBD;;;;;;;GAOG;AACH,wBAAgB,WAAW,IAAI,OAAO,CAarC;AAED,uCAAuC;AACvC,wBAAgB,YAAY,IAAI,MAAM,EAAE,CAOvC;AAED,qEAAqE;AACrE,wBAAgB,sBAAsB,IAAI,MAAM,GAAG,IAAI,CAMtD;AAED,+EAA+E;AAC/E,wBAAgB,gBAAgB,IAAI,MAAM,GAAG,IAAI,CAIhD;AAED;;;;;;;;GAQG;AACH,wBAAgB,aAAa,CAC3B,IAAI,EAAE,MAAM,EACZ,MAAM,EAAE,MAAM,EACd,OAAO,CAAC,EAAE,MAAM,EAChB,IAAI,CAAC,EAAE;IAAE,SAAS,CAAC,EAAE,OAAO,CAAA;CAAE,GAC7B,IAAI,CA4CN;AAED,iCAAiC;AACjC,wBAAgB,UAAU,CAAC,IAAI,EAAE,MAAM,GAAG,IAAI,CAO7C;AAED,8EAA8E;AAC9E,wBAAgB,aAAa,CAAC,IAAI,EAAE,MAAM,GAAG,IAAI,CAiBhD;AAED;;;;GAIG;AACH,wBAAgB,oBAAoB,IAAI,qBAAqB,GAAG,IAAI,CAgCnE;AAED;;;;;;GAMG;AACH,wBAAgB,yBAAyB,CAAC,IAAI,EAAE,MAAM,GAAG,aAAa,GAAG,IAAI,CAE5E;AAED,4FAA4F;AAC5F,wBAAgB,iBAAiB,CAAC,IAAI,EAAE,MAAM,GAAG,OAAO,CAEvD;AAGD,OAAO,EAAE,YAAY,EAAE,mBAAmB,EAAE,eAAe,EAAE,eAAe,EAAE,CAAC"}
|
package/dist/lib/profiles.js
CHANGED
|
@@ -18,19 +18,21 @@ const LEGACY_ENV_PATH = resolve(HOME_CONFIG_DIR, '.env');
|
|
|
18
18
|
const PROFILE_NAME_RE = /^[a-z0-9][a-z0-9-]{0,31}$/;
|
|
19
19
|
/**
|
|
20
20
|
* Validate a profile name — lowercase alphanumeric + hyphens, 1-32 chars, no path
|
|
21
|
-
* separators.
|
|
22
|
-
* (
|
|
23
|
-
*
|
|
24
|
-
* write (TEN-2851 Copilot review: connect.ts's read-before-write called
|
|
25
|
-
* `resolveNamedProfileConfig()` — which resolves a path but never validated — before
|
|
26
|
-
* name validation ever ran).
|
|
21
|
+
* separators. profilePath() runs it on every name, so no caller can turn an untrusted name
|
|
22
|
+
* (`PB_PROFILE`, a committed pin, the active-profile file) into a path outside the profiles
|
|
23
|
+
* folder (TEN-4503).
|
|
27
24
|
*/
|
|
28
25
|
export function validateProfileName(name) {
|
|
29
26
|
if (!PROFILE_NAME_RE.test(name)) {
|
|
30
27
|
throw new CLIError(`Invalid profile name "${name}". Must be 1-32 chars, lowercase alphanumeric + hyphens, starting with alphanumeric.`, { code: ErrorCode.PROFILE_NAME_INVALID, category: 'profile' });
|
|
31
28
|
}
|
|
32
29
|
}
|
|
33
|
-
|
|
30
|
+
/**
|
|
31
|
+
* The one place a profile name becomes a file path. It validates the name first, so
|
|
32
|
+
* `../x` or an absolute name is refused before any read or write (TEN-4503).
|
|
33
|
+
*/
|
|
34
|
+
export function profilePath(name) {
|
|
35
|
+
validateProfileName(name);
|
|
34
36
|
return resolve(PROFILES_DIR, `${name}.env`);
|
|
35
37
|
}
|
|
36
38
|
function parseEnvFile(content) {
|
|
@@ -110,11 +112,11 @@ export function getActiveProfile() {
|
|
|
110
112
|
* TEN-2851: refuses to overwrite an existing profile file by default — a caller wanting to
|
|
111
113
|
* replace an occupied profile's credentials must pass `{ overwrite: true }` explicitly (the
|
|
112
114
|
* act stays deliberate at every call site, never a silent side-effect of a name collision).
|
|
113
|
-
* `pb connect`
|
|
114
|
-
*
|
|
115
|
+
* `pb connect` is the one caller that passes it, and only for the profile this folder's own
|
|
116
|
+
* pin already names — a key rotation (TASK-638, connect.ts saveKeyAsProfile).
|
|
115
117
|
*/
|
|
116
118
|
export function createProfile(name, apiKey, siteUrl, opts) {
|
|
117
|
-
|
|
119
|
+
const path = profilePath(name);
|
|
118
120
|
mkdirSync(PROFILES_DIR, { recursive: true });
|
|
119
121
|
const lines = [
|
|
120
122
|
`# Product Brain CLI profile: ${name}`,
|
|
@@ -131,14 +133,14 @@ export function createProfile(name, apiKey, siteUrl, opts) {
|
|
|
131
133
|
// exclusive-create flag 'wx' so the filesystem is the atomic guard: EEXIST (whether from
|
|
132
134
|
// a pre-existing file or one created in the race window) surfaces as the SAME
|
|
133
135
|
// PROFILE_ALREADY_EXISTS error every existing caller already handles. `{ overwrite: true }`
|
|
134
|
-
// is an explicit
|
|
136
|
+
// is an explicit replace of this folder's own profile (see connect.ts saveKeyAsProfile) and
|
|
135
137
|
// intentionally keeps the plain 'w' flag — it means to replace whatever is there.
|
|
136
138
|
if (opts?.overwrite) {
|
|
137
|
-
writeFileSync(
|
|
139
|
+
writeFileSync(path, content, { mode: 0o600 });
|
|
138
140
|
}
|
|
139
141
|
else {
|
|
140
142
|
try {
|
|
141
|
-
writeFileSync(
|
|
143
|
+
writeFileSync(path, content, { mode: 0o600, flag: 'wx' });
|
|
142
144
|
}
|
|
143
145
|
catch (err) {
|
|
144
146
|
if (err && typeof err === 'object' && 'code' in err && err.code === 'EEXIST') {
|
|
@@ -159,7 +161,6 @@ export function createProfile(name, apiKey, siteUrl, opts) {
|
|
|
159
161
|
}
|
|
160
162
|
/** Switch the active profile. */
|
|
161
163
|
export function useProfile(name) {
|
|
162
|
-
validateProfileName(name);
|
|
163
164
|
if (!existsSync(profilePath(name))) {
|
|
164
165
|
throw new CLIError(`Profile "${name}" does not exist.`, { code: ErrorCode.PROFILE_NOT_FOUND, category: 'profile' });
|
|
165
166
|
}
|
|
@@ -168,7 +169,6 @@ export function useProfile(name) {
|
|
|
168
169
|
}
|
|
169
170
|
/** Delete a profile. Cannot delete the last profile or the active profile. */
|
|
170
171
|
export function deleteProfile(name) {
|
|
171
|
-
validateProfileName(name);
|
|
172
172
|
const path = profilePath(name);
|
|
173
173
|
if (!existsSync(path)) {
|
|
174
174
|
throw new CLIError(`Profile "${name}" does not exist.`, { code: ErrorCode.PROFILE_NOT_FOUND, category: 'profile' });
|
package/dist/lib/profiles.js.map
CHANGED
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"profiles.js","sourceRoot":"","sources":["../../src/lib/profiles.ts"],"names":[],"mappings":"AAAA;;;;;;;GAOG;AAEH,OAAO,EAAE,UAAU,EAAE,YAAY,EAAE,aAAa,EAAE,UAAU,EAAE,SAAS,EAAE,WAAW,EAAE,MAAM,IAAI,CAAC;AACjG,OAAO,EAAE,OAAO,EAAE,MAAM,MAAM,CAAC;AAC/B,OAAO,EAAE,OAAO,EAAE,MAAM,IAAI,CAAC;AAC7B,OAAO,EAAE,QAAQ,EAAE,SAAS,EAAE,MAAM,aAAa,CAAC;AAElD,MAAM,eAAe,GAAG,OAAO,CAAC,OAAO,EAAE,EAAE,SAAS,EAAE,cAAc,CAAC,CAAC;AACtE,MAAM,YAAY,GAAG,OAAO,CAAC,eAAe,EAAE,UAAU,CAAC,CAAC;AAC1D,MAAM,mBAAmB,GAAG,OAAO,CAAC,eAAe,EAAE,gBAAgB,CAAC,CAAC;AACvE,MAAM,eAAe,GAAG,OAAO,CAAC,eAAe,EAAE,MAAM,CAAC,CAAC;AAEzD,6EAA6E;AAC7E,MAAM,eAAe,GAAG,2BAA2B,CAAC;AAoBpD
|
|
1
|
+
{"version":3,"file":"profiles.js","sourceRoot":"","sources":["../../src/lib/profiles.ts"],"names":[],"mappings":"AAAA;;;;;;;GAOG;AAEH,OAAO,EAAE,UAAU,EAAE,YAAY,EAAE,aAAa,EAAE,UAAU,EAAE,SAAS,EAAE,WAAW,EAAE,MAAM,IAAI,CAAC;AACjG,OAAO,EAAE,OAAO,EAAE,MAAM,MAAM,CAAC;AAC/B,OAAO,EAAE,OAAO,EAAE,MAAM,IAAI,CAAC;AAC7B,OAAO,EAAE,QAAQ,EAAE,SAAS,EAAE,MAAM,aAAa,CAAC;AAElD,MAAM,eAAe,GAAG,OAAO,CAAC,OAAO,EAAE,EAAE,SAAS,EAAE,cAAc,CAAC,CAAC;AACtE,MAAM,YAAY,GAAG,OAAO,CAAC,eAAe,EAAE,UAAU,CAAC,CAAC;AAC1D,MAAM,mBAAmB,GAAG,OAAO,CAAC,eAAe,EAAE,gBAAgB,CAAC,CAAC;AACvE,MAAM,eAAe,GAAG,OAAO,CAAC,eAAe,EAAE,MAAM,CAAC,CAAC;AAEzD,6EAA6E;AAC7E,MAAM,eAAe,GAAG,2BAA2B,CAAC;AAoBpD;;;;;GAKG;AACH,MAAM,UAAU,mBAAmB,CAAC,IAAY;IAC9C,IAAI,CAAC,eAAe,CAAC,IAAI,CAAC,IAAI,CAAC,EAAE,CAAC;QAChC,MAAM,IAAI,QAAQ,CAChB,yBAAyB,IAAI,sFAAsF,EACnH,EAAE,IAAI,EAAE,SAAS,CAAC,oBAAoB,EAAE,QAAQ,EAAE,SAAS,EAAE,CAC9D,CAAC;IACJ,CAAC;AACH,CAAC;AAED;;;GAGG;AACH,MAAM,UAAU,WAAW,CAAC,IAAY;IACtC,mBAAmB,CAAC,IAAI,CAAC,CAAC;IAC1B,OAAO,OAAO,CAAC,YAAY,EAAE,GAAG,IAAI,MAAM,CAAC,CAAC;AAC9C,CAAC;AAED,SAAS,YAAY,CAAC,OAAe;IACnC,MAAM,IAAI,GAA2B,EAAE,CAAC;IACxC,KAAK,MAAM,IAAI,IAAI,OAAO,CAAC,KAAK,CAAC,IAAI,CAAC,EAAE,CAAC;QACvC,MAAM,CAAC,GAAG,IAAI,CAAC,KAAK,CAAC,iBAAiB,CAAC,CAAC;QACxC,IAAI,CAAC,EAAE,CAAC;YACN,IAAI,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,IAAI,EAAE,CAAC,GAAG,CAAC,CAAC,CAAC,CAAC,CAAC,IAAI,EAAE,CAAC,OAAO,CAAC,cAAc,EAAE,EAAE,CAAC,CAAC;QAC9D,CAAC;IACH,CAAC;IACD,OAAO,IAAI,CAAC;AACd,CAAC;AAED,SAAS,eAAe,CAAC,IAAY;IACnC,IAAI,CAAC,UAAU,CAAC,IAAI,CAAC;QAAE,OAAO,IAAI,CAAC;IACnC,MAAM,IAAI,GAAG,YAAY,CAAC,YAAY,CAAC,IAAI,EAAE,MAAM,CAAC,CAAC,CAAC;IACtD,MAAM,MAAM,GAAG,IAAI,CAAC,sBAAsB,CAAC,IAAI,EAAE,CAAC;IAClD,IAAI,CAAC,MAAM;QAAE,OAAO,IAAI,CAAC;IACzB,OAAO;QACL,MAAM;QACN,OAAO,EAAE,IAAI,CAAC,iBAAiB,CAAC,IAAI,SAAS;KAC9C,CAAC;AACJ,CAAC;AAED;;;;;;;GAOG;AACH,MAAM,UAAU,WAAW;IACzB,IAAI,UAAU,CAAC,YAAY,CAAC,EAAE,CAAC;QAC7B,IAAI,UAAU,CAAC,eAAe,CAAC;YAAE,UAAU,CAAC,eAAe,CAAC,CAAC;QAC7D,OAAO,KAAK,CAAC;IACf,CAAC;IACD,IAAI,CAAC,UAAU,CAAC,eAAe,CAAC;QAAE,OAAO,KAAK,CAAC;IAE/C,SAAS,CAAC,YAAY,EAAE,EAAE,SAAS,EAAE,IAAI,EAAE,CAAC,CAAC;IAC7C,MAAM,OAAO,GAAG,YAAY,CAAC,eAAe,EAAE,MAAM,CAAC,CAAC;IACtD,aAAa,CAAC,WAAW,CAAC,SAAS,CAAC,EAAE,OAAO,EAAE,EAAE,IAAI,EAAE,KAAK,EAAE,CAAC,CAAC;IAChE,aAAa,CAAC,mBAAmB,EAAE,SAAS,EAAE,EAAE,IAAI,EAAE,KAAK,EAAE,CAAC,CAAC;IAC/D,UAAU,CAAC,eAAe,CAAC,CAAC;IAC5B,OAAO,IAAI,CAAC;AACd,CAAC;AAED,uCAAuC;AACvC,MAAM,UAAU,YAAY;IAC1B,WAAW,EAAE,CAAC;IACd,IAAI,CAAC,UAAU,CAAC,YAAY,CAAC;QAAE,OAAO,EAAE,CAAC;IACzC,OAAO,WAAW,CAAC,YAAY,CAAC;SAC7B,MAAM,CAAC,CAAC,CAAC,EAAE,EAAE,CAAC,CAAC,CAAC,QAAQ,CAAC,MAAM,CAAC,CAAC;SACjC,GAAG,CAAC,CAAC,CAAC,EAAE,EAAE,CAAC,CAAC,CAAC,OAAO,CAAC,QAAQ,EAAE,EAAE,CAAC,CAAC;SACnC,IAAI,EAAE,CAAC;AACZ,CAAC;AAED,qEAAqE;AACrE,MAAM,UAAU,sBAAsB;IACpC,IAAI,UAAU,CAAC,mBAAmB,CAAC,EAAE,CAAC;QACpC,MAAM,IAAI,GAAG,YAAY,CAAC,mBAAmB,EAAE,MAAM,CAAC,CAAC,IAAI,EAAE,CAAC;QAC9D,IAAI,IAAI;YAAE,OAAO,IAAI,CAAC;IACxB,CAAC;IACD,OAAO,IAAI,CAAC;AACd,CAAC;AAED,+EAA+E;AAC/E,MAAM,UAAU,gBAAgB;IAC9B,MAAM,UAAU,GAAG,OAAO,CAAC,GAAG,CAAC,UAAU,EAAE,IAAI,EAAE,CAAC;IAClD,IAAI,UAAU;QAAE,OAAO,UAAU,CAAC;IAClC,OAAO,sBAAsB,EAAE,CAAC;AAClC,CAAC;AAED;;;;;;;;GAQG;AACH,MAAM,UAAU,aAAa,CAC3B,IAAY,EACZ,MAAc,EACd,OAAgB,EAChB,IAA8B;IAE9B,MAAM,IAAI,GAAG,WAAW,CAAC,IAAI,CAAC,CAAC;IAC/B,SAAS,CAAC,YAAY,EAAE,EAAE,SAAS,EAAE,IAAI,EAAE,CAAC,CAAC;IAE7C,MAAM,KAAK,GAAG;QACZ,gCAAgC,IAAI,EAAE;QACtC,wBAAwB,MAAM,EAAE;KACjC,CAAC;IACF,IAAI,OAAO,EAAE,CAAC;QACZ,KAAK,CAAC,IAAI,CAAC,mBAAmB,OAAO,EAAE,CAAC,CAAC;IAC3C,CAAC;IACD,KAAK,CAAC,IAAI,CAAC,EAAE,CAAC,CAAC;IACf,MAAM,OAAO,GAAG,KAAK,CAAC,IAAI,CAAC,IAAI,CAAC,CAAC;IAEjC,sFAAsF;IACtF,oFAAoF;IACpF,yFAAyF;IACzF,yFAAyF;IACzF,8EAA8E;IAC9E,4FAA4F;IAC5F,4FAA4F;IAC5F,kFAAkF;IAClF,IAAI,IAAI,EAAE,SAAS,EAAE,CAAC;QACpB,aAAa,CAAC,IAAI,EAAE,OAAO,EAAE,EAAE,IAAI,EAAE,KAAK,EAAE,CAAC,CAAC;IAChD,CAAC;SAAM,CAAC;QACN,IAAI,CAAC;YACH,aAAa,CAAC,IAAI,EAAE,OAAO,EAAE,EAAE,IAAI,EAAE,KAAK,EAAE,IAAI,EAAE,IAAI,EAAE,CAAC,CAAC;QAC5D,CAAC;QAAC,OAAO,GAAY,EAAE,CAAC;YACtB,IAAI,GAAG,IAAI,OAAO,GAAG,KAAK,QAAQ,IAAI,MAAM,IAAI,GAAG,IAAK,GAA6B,CAAC,IAAI,KAAK,QAAQ,EAAE,CAAC;gBACxG,MAAM,IAAI,QAAQ,CAAC,YAAY,IAAI,mBAAmB,EAAE,EAAE,IAAI,EAAE,SAAS,CAAC,sBAAsB,EAAE,QAAQ,EAAE,SAAS,EAAE,CAAC,CAAC;YAC3H,CAAC;YACD,MAAM,GAAG,CAAC;QACZ,CAAC;IACH,CAAC;IAED,0FAA0F;IAC1F,yFAAyF;IACzF,wFAAwF;IACxF,2FAA2F;IAC3F,uFAAuF;IACvF,iFAAiF;IACjF,IAAI,CAAC,IAAI,EAAE,SAAS,IAAI,CAAC,UAAU,CAAC,mBAAmB,CAAC,EAAE,CAAC;QACzD,aAAa,CAAC,mBAAmB,EAAE,IAAI,EAAE,EAAE,IAAI,EAAE,KAAK,EAAE,CAAC,CAAC;IAC5D,CAAC;AACH,CAAC;AAED,iCAAiC;AACjC,MAAM,UAAU,UAAU,CAAC,IAAY;IACrC,IAAI,CAAC,UAAU,CAAC,WAAW,CAAC,IAAI,CAAC,CAAC,EAAE,CAAC;QACnC,MAAM,IAAI,QAAQ,CAAC,YAAY,IAAI,mBAAmB,EAAE,EAAE,IAAI,EAAE,SAAS,CAAC,iBAAiB,EAAE,QAAQ,EAAE,SAAS,EAAE,CAAC,CAAC;IACtH,CAAC;IAED,SAAS,CAAC,eAAe,EAAE,EAAE,SAAS,EAAE,IAAI,EAAE,CAAC,CAAC;IAChD,aAAa,CAAC,mBAAmB,EAAE,IAAI,EAAE,EAAE,IAAI,EAAE,KAAK,EAAE,CAAC,CAAC;AAC5D,CAAC;AAED,8EAA8E;AAC9E,MAAM,UAAU,aAAa,CAAC,IAAY;IACxC,MAAM,IAAI,GAAG,WAAW,CAAC,IAAI,CAAC,CAAC;IAC/B,IAAI,CAAC,UAAU,CAAC,IAAI,CAAC,EAAE,CAAC;QACtB,MAAM,IAAI,QAAQ,CAAC,YAAY,IAAI,mBAAmB,EAAE,EAAE,IAAI,EAAE,SAAS,CAAC,iBAAiB,EAAE,QAAQ,EAAE,SAAS,EAAE,CAAC,CAAC;IACtH,CAAC;IAED,MAAM,QAAQ,GAAG,YAAY,EAAE,CAAC;IAChC,IAAI,QAAQ,CAAC,MAAM,IAAI,CAAC,EAAE,CAAC;QACzB,MAAM,IAAI,QAAQ,CAAC,mCAAmC,IAAI,IAAI,EAAE,EAAE,IAAI,EAAE,SAAS,CAAC,eAAe,EAAE,QAAQ,EAAE,SAAS,EAAE,CAAC,CAAC;IAC5H,CAAC;IAED,MAAM,MAAM,GAAG,gBAAgB,EAAE,CAAC;IAClC,IAAI,MAAM,KAAK,IAAI,EAAE,CAAC;QACpB,MAAM,IAAI,QAAQ,CAAC,qCAAqC,IAAI,qCAAqC,EAAE,EAAE,IAAI,EAAE,SAAS,CAAC,iBAAiB,EAAE,QAAQ,EAAE,SAAS,EAAE,QAAQ,EAAE,6CAA6C,EAAE,CAAC,CAAC;IAC1N,CAAC;IAED,UAAU,CAAC,IAAI,CAAC,CAAC;AACnB,CAAC;AAED;;;;GAIG;AACH,MAAM,UAAU,oBAAoB;IAClC,WAAW,EAAE,CAAC;IAEd,8BAA8B;IAC9B,MAAM,UAAU,GAAG,OAAO,CAAC,GAAG,CAAC,UAAU,EAAE,IAAI,EAAE,CAAC;IAClD,IAAI,UAAU,EAAE,CAAC;QACf,MAAM,MAAM,GAAG,eAAe,CAAC,WAAW,CAAC,UAAU,CAAC,CAAC,CAAC;QACxD,IAAI,MAAM;YAAE,OAAO,EAAE,GAAG,MAAM,EAAE,WAAW,EAAE,UAAU,EAAE,CAAC;IAC5D,CAAC;IAED,+BAA+B;IAC/B,IAAI,UAAU,CAAC,mBAAmB,CAAC,EAAE,CAAC;QACpC,MAAM,IAAI,GAAG,YAAY,CAAC,mBAAmB,EAAE,MAAM,CAAC,CAAC,IAAI,EAAE,CAAC;QAC9D,IAAI,IAAI,EAAE,CAAC;YACT,MAAM,MAAM,GAAG,eAAe,CAAC,WAAW,CAAC,IAAI,CAAC,CAAC,CAAC;YAClD,IAAI,MAAM;gBAAE,OAAO,EAAE,GAAG,MAAM,EAAE,WAAW,EAAE,IAAI,EAAE,CAAC;QACtD,CAAC;IACH,CAAC;IAED,6BAA6B;IAC7B,CAAC;QACC,MAAM,MAAM,GAAG,eAAe,CAAC,WAAW,CAAC,SAAS,CAAC,CAAC,CAAC;QACvD,IAAI,MAAM;YAAE,OAAO,EAAE,GAAG,MAAM,EAAE,WAAW,EAAE,SAAS,EAAE,CAAC;IAC3D,CAAC;IAED,wEAAwE;IACxE,CAAC;QACC,MAAM,MAAM,GAAG,eAAe,CAAC,eAAe,CAAC,CAAC;QAChD,IAAI,MAAM;YAAE,OAAO,EAAE,GAAG,MAAM,EAAE,WAAW,EAAE,IAAI,EAAE,CAAC;IACtD,CAAC;IAED,OAAO,IAAI,CAAC;AACd,CAAC;AAED;;;;;;GAMG;AACH,MAAM,UAAU,yBAAyB,CAAC,IAAY;IACpD,OAAO,eAAe,CAAC,WAAW,CAAC,IAAI,CAAC,CAAC,CAAC;AAC5C,CAAC;AAED,4FAA4F;AAC5F,MAAM,UAAU,iBAAiB,CAAC,IAAY;IAC5C,OAAO,UAAU,CAAC,WAAW,CAAC,IAAI,CAAC,CAAC,CAAC;AACvC,CAAC;AAED,uBAAuB;AACvB,OAAO,EAAE,YAAY,EAAE,mBAAmB,EAAE,eAAe,EAAE,eAAe,EAAE,CAAC"}
|