@cybedefend/vibedefend 1.3.1 → 1.4.0
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 +32 -5
- package/bin/resolve.js +19 -0
- package/bin/vibedefend.js +4 -1
- package/dist/api/projects.js +158 -0
- package/dist/api/projects.js.map +1 -0
- package/dist/clients/claude-code.js +2 -2
- package/dist/clients/claude-code.js.map +1 -1
- package/dist/clients/codex.js +2 -2
- package/dist/clients/codex.js.map +1 -1
- package/dist/clients/cursor.js +2 -2
- package/dist/clients/cursor.js.map +1 -1
- package/dist/clients/vscode.js +2 -2
- package/dist/clients/vscode.js.map +1 -1
- package/dist/clients/windsurf.js +2 -2
- package/dist/clients/windsurf.js.map +1 -1
- package/dist/config.js +2 -0
- package/dist/config.js.map +1 -1
- package/dist/custom-regions.js +5 -0
- package/dist/custom-regions.js.map +1 -1
- package/dist/endpoints.js +59 -0
- package/dist/endpoints.js.map +1 -0
- package/dist/git.js +103 -0
- package/dist/git.js.map +1 -0
- package/dist/hook-runner.js +554 -281
- package/dist/hooks/install.js +49 -6
- package/dist/hooks/install.js.map +1 -1
- package/dist/hooks/runtime/fetch-rules.js +5 -3
- package/dist/hooks/runtime/fetch-rules.js.map +1 -1
- package/dist/hooks/runtime/judge-injection.js +65 -0
- package/dist/hooks/runtime/judge-injection.js.map +1 -0
- package/dist/hooks/runtime/near-miss.js +6 -1
- package/dist/hooks/runtime/near-miss.js.map +1 -1
- package/dist/hooks/runtime/repo-link-cache.js +116 -0
- package/dist/hooks/runtime/repo-link-cache.js.map +1 -0
- package/dist/hooks/runtime/resolve.js +79 -0
- package/dist/hooks/runtime/resolve.js.map +1 -1
- package/dist/hooks/runtime/session-review.js +10 -3
- package/dist/hooks/runtime/session-review.js.map +1 -1
- package/dist/hooks/runtime/session-start.js +5 -3
- package/dist/hooks/runtime/session-start.js.map +1 -1
- package/dist/hooks/runtime/user-prompt-submit.js +10 -7
- package/dist/hooks/runtime/user-prompt-submit.js.map +1 -1
- package/dist/index.js +40 -2
- package/dist/index.js.map +1 -1
- package/dist/install.js +142 -88
- package/dist/install.js.map +1 -1
- package/dist/link.js +325 -0
- package/dist/link.js.map +1 -0
- package/dist/login.js +2 -23
- package/dist/login.js.map +1 -1
- package/dist/logout.js +87 -0
- package/dist/logout.js.map +1 -0
- package/dist/org-gate.js +110 -0
- package/dist/org-gate.js.map +1 -0
- package/dist/prompts.js +5 -7
- package/dist/prompts.js.map +1 -1
- package/package.json +1 -1
|
@@ -9,7 +9,7 @@
|
|
|
9
9
|
* the body only nudges if proposals exist)
|
|
10
10
|
*/
|
|
11
11
|
import { sniff } from './sniff.js';
|
|
12
|
-
import {
|
|
12
|
+
import { resolveProjectIdWithApi, resolveToken, } from './resolve.js';
|
|
13
13
|
import { fetchProposalsCount } from './api.js';
|
|
14
14
|
import { emitContext } from './emit.js';
|
|
15
15
|
import { loadRuntimeConfig, readStdinJson } from './config.js';
|
|
@@ -18,7 +18,7 @@ import { pkg } from '../../version.js';
|
|
|
18
18
|
export async function sessionStartHook(deps = {}) {
|
|
19
19
|
const readStdin = deps.readStdin ?? readStdinJson;
|
|
20
20
|
const loadConfig = deps.loadConfig ?? loadRuntimeConfig;
|
|
21
|
-
const resolveProject = deps.resolveProject ??
|
|
21
|
+
const resolveProject = deps.resolveProject ?? resolveProjectIdWithApi;
|
|
22
22
|
const resolveTok = deps.resolveTokenFn ?? resolveToken;
|
|
23
23
|
const fetchProposals = deps.fetchProposalsFn ?? fetchProposalsCount;
|
|
24
24
|
const selfUpdateCheckFn = deps.selfUpdateCheckFn ?? selfUpdateCheck;
|
|
@@ -31,7 +31,9 @@ export async function sessionStartHook(deps = {}) {
|
|
|
31
31
|
const config = loadConfig();
|
|
32
32
|
if (!config)
|
|
33
33
|
return;
|
|
34
|
-
|
|
34
|
+
// Async: falls back to git-origin auto-discovery (cache + bounded 4s
|
|
35
|
+
// gateway call) when no env var / config.json projectId exists.
|
|
36
|
+
const { projectId, apiBase: configApiBase } = await resolveProject();
|
|
35
37
|
if (!projectId)
|
|
36
38
|
return;
|
|
37
39
|
const apiBase = process.env.CYBEDEFEND_API_BASE ?? configApiBase ?? config.region.apiBase;
|
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"session-start.js","sourceRoot":"","sources":["../../../src/hooks/runtime/session-start.ts"],"names":[],"mappings":"AAAA;;;;;;;;;GASG;AACH,OAAO,EAAE,KAAK,EAAE,MAAM,YAAY,CAAC;AACnC,OAAO,
|
|
1
|
+
{"version":3,"file":"session-start.js","sourceRoot":"","sources":["../../../src/hooks/runtime/session-start.ts"],"names":[],"mappings":"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"}
|
|
@@ -23,16 +23,17 @@
|
|
|
23
23
|
* - If the API/token is unavailable, the doctrine still surfaces with
|
|
24
24
|
* a "could not verify, call cybe_rules_list_proposals yourself"
|
|
25
25
|
* fallback — never blocks the user's prompt.
|
|
26
|
-
* - When projectId can't be resolved (no
|
|
27
|
-
*
|
|
28
|
-
*
|
|
29
|
-
*
|
|
26
|
+
* - When projectId can't be resolved (no env var, no
|
|
27
|
+
* `.cybedefend/config.json`, and git-origin auto-discovery found no
|
|
28
|
+
* unique match), the hook is a silent no-op — there's no project
|
|
29
|
+
* context to anchor the doctrine against and emitting a half-finished
|
|
30
|
+
* reminder would confuse more than help.
|
|
30
31
|
*/
|
|
31
32
|
import { existsSync, mkdirSync, readFileSync, writeFileSync } from 'node:fs';
|
|
32
33
|
import { homedir } from 'node:os';
|
|
33
34
|
import { join } from 'node:path';
|
|
34
35
|
import { sniff } from './sniff.js';
|
|
35
|
-
import {
|
|
36
|
+
import { resolveProjectIdWithApi, resolveToken, } from './resolve.js';
|
|
36
37
|
import { fetchProposalsCount } from './api.js';
|
|
37
38
|
import { emit } from './emit.js';
|
|
38
39
|
import { loadRuntimeConfig, readStdinJson } from './config.js';
|
|
@@ -85,7 +86,7 @@ export function defaultSessionTracker(file = defaultSessionsFile()) {
|
|
|
85
86
|
export async function userPromptSubmitHook(deps = {}) {
|
|
86
87
|
const readStdin = deps.readStdin ?? readStdinJson;
|
|
87
88
|
const loadConfig = deps.loadConfig ?? loadRuntimeConfig;
|
|
88
|
-
const resolveProject = deps.resolveProject ??
|
|
89
|
+
const resolveProject = deps.resolveProject ?? resolveProjectIdWithApi;
|
|
89
90
|
const resolveTok = deps.resolveTokenFn ?? resolveToken;
|
|
90
91
|
const fetchProposals = deps.fetchProposalsFn ?? fetchProposalsCount;
|
|
91
92
|
const emitFn = deps.emitFn ?? emit;
|
|
@@ -105,7 +106,9 @@ export async function userPromptSubmitHook(deps = {}) {
|
|
|
105
106
|
const config = loadConfig();
|
|
106
107
|
if (!config)
|
|
107
108
|
return;
|
|
108
|
-
|
|
109
|
+
// Async: falls back to git-origin auto-discovery (cache + bounded 4s
|
|
110
|
+
// gateway call) when no env var / config.json projectId exists.
|
|
111
|
+
const { projectId, apiBase: configApiBase } = await resolveProject();
|
|
109
112
|
if (!projectId)
|
|
110
113
|
return; // silent no-op — see file header
|
|
111
114
|
const apiBase = process.env.CYBEDEFEND_API_BASE ?? configApiBase ?? config.region.apiBase;
|
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"user-prompt-submit.js","sourceRoot":"","sources":["../../../src/hooks/runtime/user-prompt-submit.ts"],"names":[],"mappings":"AAAA
|
|
1
|
+
{"version":3,"file":"user-prompt-submit.js","sourceRoot":"","sources":["../../../src/hooks/runtime/user-prompt-submit.ts"],"names":[],"mappings":"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"}
|
package/dist/index.js
CHANGED
|
@@ -4,7 +4,9 @@ import { Command, Option } from 'commander';
|
|
|
4
4
|
import updateNotifier from 'update-notifier';
|
|
5
5
|
import { runDoctor } from './doctor.js';
|
|
6
6
|
import { runInstall } from './install.js';
|
|
7
|
+
import { runLinkCommand } from './link.js';
|
|
7
8
|
import { runLoginCommand } from './login.js';
|
|
9
|
+
import { runLogout } from './logout.js';
|
|
8
10
|
import { selfUpdate, detectInstallMode, resolveScriptPath, fetchLatestVersion, } from './self-update.js';
|
|
9
11
|
import { runUpdate } from './update.js';
|
|
10
12
|
import { runStatus } from './status.js';
|
|
@@ -44,9 +46,10 @@ program
|
|
|
44
46
|
program
|
|
45
47
|
.command('install')
|
|
46
48
|
.description('Interactive installer: pick a region, register the MCP, configure hooks for each detected agent.')
|
|
47
|
-
.
|
|
49
|
+
.option('--force', 'Force the browser sign-in step even if a VibeDefend session already exists (useful for testing sign-out / sign-in).')
|
|
50
|
+
.action(async (opts) => {
|
|
48
51
|
try {
|
|
49
|
-
await runInstall();
|
|
52
|
+
await runInstall({}, { force: opts.force });
|
|
50
53
|
}
|
|
51
54
|
catch (err) {
|
|
52
55
|
const message = err instanceof Error ? err.message : String(err);
|
|
@@ -126,6 +129,41 @@ program
|
|
|
126
129
|
process.exit(1);
|
|
127
130
|
}
|
|
128
131
|
});
|
|
132
|
+
program
|
|
133
|
+
.command('logout')
|
|
134
|
+
.description("Sign out of CybeDefend: clear VibeDefend's stored credentials so the next install/login prompts a fresh browser sign-in.")
|
|
135
|
+
.option('--region <id>', 'Only sign out of this region (default: all configured regions).')
|
|
136
|
+
.action((opts) => {
|
|
137
|
+
try {
|
|
138
|
+
runLogout(opts);
|
|
139
|
+
}
|
|
140
|
+
catch (err) {
|
|
141
|
+
const message = err instanceof Error ? err.message : String(err);
|
|
142
|
+
log.err(`Logout failed: ${message}`);
|
|
143
|
+
process.exit(1);
|
|
144
|
+
}
|
|
145
|
+
});
|
|
146
|
+
program
|
|
147
|
+
.command('link')
|
|
148
|
+
.description('Link a repository to a CybeDefend project: resolves the project (via --project, ' +
|
|
149
|
+
'the git origin, or an interactive picker) and writes .cybedefend/config.json.')
|
|
150
|
+
.option('--project <id>', 'Project UUID to link directly, skipping auto-discovery.')
|
|
151
|
+
.option('--path <dir>', 'Directory to write .cybedefend/config.json into (default: current directory).')
|
|
152
|
+
.option('--region <id>', 'Region id to use when VibeDefend is not installed yet (e.g. eu, us).')
|
|
153
|
+
.action(async (opts) => {
|
|
154
|
+
try {
|
|
155
|
+
await runLinkCommand(opts);
|
|
156
|
+
}
|
|
157
|
+
catch (err) {
|
|
158
|
+
const message = err instanceof Error ? err.message : String(err);
|
|
159
|
+
if (isUserCancellation(err)) {
|
|
160
|
+
log.info('Link cancelled by user.');
|
|
161
|
+
process.exit(130);
|
|
162
|
+
}
|
|
163
|
+
log.err(`Link failed: ${message}`);
|
|
164
|
+
process.exit(1);
|
|
165
|
+
}
|
|
166
|
+
});
|
|
129
167
|
program
|
|
130
168
|
.command('status')
|
|
131
169
|
.description('Show the VibeDefend install state: region, agents, caches, and a live API check.')
|
package/dist/index.js.map
CHANGED
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"index.js","sourceRoot":"","sources":["../src/index.ts"],"names":[],"mappings":";AACA,OAAO,EAAE,SAAS,EAAE,MAAM,oBAAoB,CAAC;AAE/C,OAAO,EAAE,OAAO,EAAE,MAAM,EAAE,MAAM,WAAW,CAAC;AAC5C,OAAO,cAAc,MAAM,iBAAiB,CAAC;AAE7C,OAAO,EAAE,SAAS,EAAE,MAAM,aAAa,CAAC;AACxC,OAAO,EAAE,UAAU,EAAE,MAAM,cAAc,CAAC;AAC1C,OAAO,EAAE,eAAe,EAAE,MAAM,YAAY,CAAC;AAC7C,OAAO,EACL,UAAU,EACV,iBAAiB,EACjB,iBAAiB,EACjB,kBAAkB,GACnB,MAAM,kBAAkB,CAAC;AAC1B,OAAO,EAAE,SAAS,EAAE,MAAM,aAAa,CAAC;AACxC,OAAO,EAAE,SAAS,EAAE,MAAM,aAAa,CAAC;AACxC,OAAO,EAAE,GAAG,EAAE,kBAAkB,EAAE,MAAM,YAAY,CAAC;AACrD,OAAO,EAAE,GAAG,EAAE,MAAM,cAAc,CAAC;AAEnC;;;;;;;;;;;;;;;GAeG;AACH,MAAM,QAAQ,GAAG,cAAc,CAAC;IAC9B,GAAG,EAAE,EAAE,IAAI,EAAE,GAAG,CAAC,IAAI,EAAE,OAAO,EAAE,GAAG,CAAC,OAAO,EAAE;IAC7C,mBAAmB,EAAE,IAAI,GAAG,EAAE,GAAG,EAAE,GAAG,EAAE,EAAE,eAAe;CAC1D,CAAC,CAAC;AACH,QAAQ,CAAC,MAAM,CAAC;IACd,OAAO,EACL,gEAAgE;QAChE,4CAA4C;IAC9C,KAAK,EAAE,KAAK,EAAE,oDAAoD;IAClE,QAAQ,EAAE,IAAI;CACf,CAAC,CAAC;AAEH,MAAM,OAAO,GAAG,IAAI,OAAO,EAAE,CAAC;AAE9B,OAAO;KACJ,IAAI,CAAC,YAAY,CAAC;KAClB,WAAW,CACV,6HAA6H,CAC9H;KACA,OAAO,CAAC,GAAG,CAAC,OAAO,CAAC,CAAC;AAExB,OAAO;KACJ,OAAO,CAAC,SAAS,CAAC;KAClB,WAAW,CACV,kGAAkG,CACnG;KACA,MAAM,CAAC,KAAK,
|
|
1
|
+
{"version":3,"file":"index.js","sourceRoot":"","sources":["../src/index.ts"],"names":[],"mappings":"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"}
|
package/dist/install.js
CHANGED
|
@@ -1,32 +1,45 @@
|
|
|
1
|
+
import { confirm as confirmImpl } from '@inquirer/prompts';
|
|
1
2
|
import kleur from 'kleur';
|
|
2
3
|
import { adapterFor } from './clients/registry.js';
|
|
3
4
|
import { checkPlatformSupport } from './clients/claude-code.js';
|
|
5
|
+
import { deriveDashboardUrl, deriveLogtoEndpoint } from './endpoints.js';
|
|
4
6
|
import { installHookRuntime } from './hooks/install.js';
|
|
5
|
-
import { runLogin } from './login.js';
|
|
6
|
-
import { hasStoredAuth } from './auth/auth.js';
|
|
7
|
-
import {
|
|
7
|
+
import { runLogin as runLoginImpl } from './login.js';
|
|
8
|
+
import { hasStoredAuth as hasStoredAuthImpl } from './auth/auth.js';
|
|
9
|
+
import { ensureOrganization as ensureOrganizationImpl } from './org-gate.js';
|
|
10
|
+
import { askClientSelection as askClientSelectionImpl, askHookConfig as askHookConfigImpl, askRegion as askRegionImpl, } from './prompts.js';
|
|
8
11
|
import { stampInstalledVersion } from './self-update.js';
|
|
9
|
-
import { detectPlatform, home, log } from './utils.js';
|
|
12
|
+
import { detectPlatform, home, isUserCancellation, log } from './utils.js';
|
|
10
13
|
import { pkg } from './version.js';
|
|
11
14
|
/**
|
|
12
15
|
* Top-level installer.
|
|
13
16
|
*
|
|
14
|
-
* Flow:
|
|
17
|
+
* Flow (login-first, spec §2.3):
|
|
15
18
|
* 1. Banner + platform sanity check (Windows hooks unsupported)
|
|
16
19
|
* 2. Region pick (Production EU / US)
|
|
17
|
-
* 3.
|
|
18
|
-
*
|
|
19
|
-
*
|
|
20
|
-
*
|
|
21
|
-
*
|
|
22
|
-
*
|
|
23
|
-
* -
|
|
24
|
-
*
|
|
25
|
-
*
|
|
26
|
-
* 7.
|
|
27
|
-
* 8.
|
|
20
|
+
* 3. LOGIN — immediately after the region: skip if credentials are already
|
|
21
|
+
* stored; else run the browser PKCE flow. On failure, offer exactly ONE
|
|
22
|
+
* retry, then abort with exit code 1 (everything after this point needs
|
|
23
|
+
* an authenticated user).
|
|
24
|
+
* 4. ORGANIZATION GATE — the account must belong to ≥1 organization to be
|
|
25
|
+
* useful. If it doesn't, open the dashboard on-boarding page and wait
|
|
26
|
+
* (poll). Ctrl-C / timeout skips with a warning; install continues.
|
|
27
|
+
* 5. Multi-select: which agents to wire hooks into?
|
|
28
|
+
* 6. Hook config (threshold, auto-propose)
|
|
29
|
+
* 7. For each selected adapter: registerMcp + writeSettings
|
|
30
|
+
* 8. Write the universal hook runner to ~/.cybedefend/
|
|
31
|
+
* 9. Stamp ~/.cybedefend/version (auto-update plumbing)
|
|
32
|
+
* 10. Print next-steps footer
|
|
28
33
|
*/
|
|
29
|
-
export async function runInstall() {
|
|
34
|
+
export async function runInstall(deps = {}, opts = {}) {
|
|
35
|
+
const askRegion = deps.askRegion ?? askRegionImpl;
|
|
36
|
+
const hasStoredAuth = deps.hasStoredAuth ?? hasStoredAuthImpl;
|
|
37
|
+
const runLogin = deps.runLogin ?? runLoginImpl;
|
|
38
|
+
const ensureOrganization = deps.ensureOrganization ?? ensureOrganizationImpl;
|
|
39
|
+
const askClientSelection = deps.askClientSelection ?? askClientSelectionImpl;
|
|
40
|
+
const askHookConfig = deps.askHookConfig ?? askHookConfigImpl;
|
|
41
|
+
const confirm = deps.confirm ?? confirmImpl;
|
|
42
|
+
const exit = deps.exit ?? ((code) => process.exit(code));
|
|
30
43
|
banner();
|
|
31
44
|
const p = detectPlatform();
|
|
32
45
|
const platformSupport = checkPlatformSupport();
|
|
@@ -34,22 +47,72 @@ export async function runInstall() {
|
|
|
34
47
|
if (!platformSupport.hooksSupported) {
|
|
35
48
|
log.warn(platformSupport.reason ?? 'Hooks unsupported on this platform.');
|
|
36
49
|
}
|
|
37
|
-
|
|
38
|
-
|
|
39
|
-
log.
|
|
40
|
-
log.hint(`
|
|
41
|
-
|
|
50
|
+
// ── ① Region ────────────────────────────────────────────────────────────────
|
|
51
|
+
const region = await askRegion();
|
|
52
|
+
log.step('Region selected: ' + kleur.bold(region.label));
|
|
53
|
+
log.hint(`MCP URL: ${region.mcpUrl}`);
|
|
54
|
+
log.hint(`API base: ${region.apiBase}`);
|
|
55
|
+
// ── ② Login (before anything else touches the gateway) ─────────────────────
|
|
56
|
+
//
|
|
57
|
+
// Why first? Everything downstream — the organization gate, project
|
|
58
|
+
// auto-resolution from the git origin, the hooks' very first rules fetch —
|
|
59
|
+
// needs a signed-in user. Failing login late (the pre-1.4 flow logged in
|
|
60
|
+
// AFTER wiring hooks) left half-installed setups behind.
|
|
61
|
+
//
|
|
62
|
+
// We check `hasStoredAuth` (which validates OUR specific bundle shape:
|
|
63
|
+
// accessToken + refreshToken + expiresAt + logtoEndpoint + cliAppId +
|
|
64
|
+
// logtoResource) rather than the legacy `resolveToken` resolver. The legacy
|
|
65
|
+
// resolver also matches Codex CLI's own MCP credential (stored under the
|
|
66
|
+
// same keychain service `Codex MCP Credentials` but with a different account
|
|
67
|
+
// shape), which would falsely tell us "already configured" even though our
|
|
68
|
+
// hook can't actually use Codex's MCP-scoped JWT to call the gateway.
|
|
69
|
+
const logtoEndpoint = region.logtoEndpoint ??
|
|
70
|
+
deriveLogtoEndpoint(region.apiBase);
|
|
71
|
+
if (hasStoredAuth(region.mcpName) && !opts.force) {
|
|
72
|
+
log.ok('VibeDefend credentials already present. Skipping login.');
|
|
73
|
+
}
|
|
74
|
+
else {
|
|
75
|
+
log.step('Sign in to CybeDefend');
|
|
76
|
+
log.hint('Your browser will open for a one-time sign-in (instant if you already have a session).');
|
|
77
|
+
// Force the actual OAuth here. We only reach this branch when VibeDefend
|
|
78
|
+
// has NO stored bundle of its OWN (hasStoredAuth === false), or the user
|
|
79
|
+
// asked for it (--force). A token that merely belongs to a coding agent —
|
|
80
|
+
// which `runLogin`'s internal `resolveToken` check would match and use to
|
|
81
|
+
// short-circuit — must NOT skip the browser step: otherwise `logout` +
|
|
82
|
+
// `install` silently signs you back in whenever Claude Code / Codex still
|
|
83
|
+
// hold an MCP token, and the org-gate never gets a fresh VibeDefend token.
|
|
84
|
+
const loginOk = await loginWithOneRetry({
|
|
85
|
+
mcpName: region.mcpName,
|
|
86
|
+
apiBase: region.apiBase,
|
|
87
|
+
logtoEndpoint,
|
|
88
|
+
force: true,
|
|
89
|
+
}, runLogin, confirm);
|
|
90
|
+
if (!loginOk) {
|
|
91
|
+
log.err('VibeDefend needs a signed-in CybeDefend account to install. ' +
|
|
92
|
+
'Run `vibedefend install` again when you are ready to sign in.');
|
|
93
|
+
exit(1);
|
|
94
|
+
return; // In tests `exit` is a spy — never continue past an abort.
|
|
95
|
+
}
|
|
96
|
+
}
|
|
97
|
+
// ── ③ Organization gate ─────────────────────────────────────────────────────
|
|
98
|
+
// An account without an organization can't hold projects, rules, or scans.
|
|
99
|
+
// The gate nudges the user through dashboard onboarding but NEVER blocks:
|
|
100
|
+
// Ctrl-C / timeout / gateway-unreachable all continue with a warning.
|
|
101
|
+
await ensureOrganization({
|
|
102
|
+
apiBase: region.apiBase,
|
|
103
|
+
dashboardUrl: deriveDashboardUrl(region),
|
|
104
|
+
mcpName: region.mcpName,
|
|
105
|
+
});
|
|
106
|
+
// ── ④ Agents + hook config ──────────────────────────────────────────────────
|
|
107
|
+
const selectedClients = await askClientSelection();
|
|
108
|
+
if (selectedClients.length === 0) {
|
|
42
109
|
log.info('No agents selected. The MCP URL is printed above — add it to your client manually if needed. ' +
|
|
43
110
|
'The doctrine arrives via Server.instructions on every supported client.');
|
|
44
111
|
stampInstalledVersion(home, pkg.version);
|
|
45
|
-
printDoneFooter([],
|
|
112
|
+
printDoneFooter([], region);
|
|
46
113
|
return;
|
|
47
114
|
}
|
|
48
|
-
|
|
49
|
-
// Shouldn't happen — prompts guarantees hooks when selection > 0.
|
|
50
|
-
log.err('Hook config missing despite selected agents — aborting.');
|
|
51
|
-
process.exit(1);
|
|
52
|
-
}
|
|
115
|
+
const hooks = await askHookConfig();
|
|
53
116
|
// Install the Node-based hook runner ONCE — one bundled file serves
|
|
54
117
|
// every adapter. The runner reads runtime-config.json at every
|
|
55
118
|
// invocation, so re-running `vibedefend update` propagates new
|
|
@@ -58,8 +121,8 @@ export async function runInstall() {
|
|
|
58
121
|
if (platformSupport.hooksSupported) {
|
|
59
122
|
log.step('Installing universal hook runner');
|
|
60
123
|
const { runnerPath, configPath } = installHookRuntime({
|
|
61
|
-
region
|
|
62
|
-
hooks
|
|
124
|
+
region,
|
|
125
|
+
hooks,
|
|
63
126
|
installedVersion: pkg.version,
|
|
64
127
|
});
|
|
65
128
|
log.ok(`Runner: ${runnerPath}`);
|
|
@@ -71,14 +134,14 @@ export async function runInstall() {
|
|
|
71
134
|
// Now wire each selected client's settings file. Adapters are
|
|
72
135
|
// responsible for their own idempotency + error handling.
|
|
73
136
|
const installedLabels = [];
|
|
74
|
-
for (const id of
|
|
137
|
+
for (const id of selectedClients) {
|
|
75
138
|
const adapter = adapterFor(id);
|
|
76
139
|
log.step(`Wiring ${adapter.label}`);
|
|
77
140
|
if (adapter.registerMcp) {
|
|
78
|
-
adapter.registerMcp({ region
|
|
141
|
+
adapter.registerMcp({ region });
|
|
79
142
|
}
|
|
80
143
|
if (adapter.postRegister) {
|
|
81
|
-
adapter.postRegister({ region
|
|
144
|
+
adapter.postRegister({ region });
|
|
82
145
|
}
|
|
83
146
|
if (platformSupport.hooksSupported) {
|
|
84
147
|
adapter.writeSettings({
|
|
@@ -86,70 +149,59 @@ export async function runInstall() {
|
|
|
86
149
|
// `~/.cybedefend/hook-runner.js`. Adapters compose `node <path>
|
|
87
150
|
// <subcommand>` via `hookCommand(...)` and ignore this field.
|
|
88
151
|
hookDir: home('.cybedefend'),
|
|
89
|
-
enableSessionReview:
|
|
90
|
-
region
|
|
91
|
-
hooks
|
|
152
|
+
enableSessionReview: hooks.enableSessionReview,
|
|
153
|
+
region,
|
|
154
|
+
hooks,
|
|
92
155
|
});
|
|
93
156
|
}
|
|
94
157
|
installedLabels.push(adapter.label);
|
|
95
158
|
}
|
|
96
|
-
if (
|
|
159
|
+
if (hooks.autoProposeMode) {
|
|
97
160
|
log.warn('Auto-propose mode is ON — the agent will call cybe_rules_report_missing ' +
|
|
98
161
|
'without asking you first. You will still review proposals at the next session ' +
|
|
99
162
|
'start (Accept/Reject picker), but they land without a chat-side prompt.');
|
|
100
163
|
}
|
|
101
164
|
stampInstalledVersion(home, pkg.version);
|
|
102
165
|
log.hint(`Version stamp: ~/.cybedefend/version (v${pkg.version})`);
|
|
103
|
-
//
|
|
104
|
-
//
|
|
105
|
-
//
|
|
106
|
-
|
|
107
|
-
// We check `hasStoredAuth` (which validates OUR specific bundle shape:
|
|
108
|
-
// accessToken + refreshToken + expiresAt + logtoEndpoint + cliAppId +
|
|
109
|
-
// logtoResource) rather than the legacy `resolveToken` resolver. The legacy
|
|
110
|
-
// resolver also matches Codex CLI's own MCP credential (stored under the
|
|
111
|
-
// same keychain service `Codex MCP Credentials` but with a different account
|
|
112
|
-
// shape), which would falsely tell us "already configured" even though our
|
|
113
|
-
// hook can't actually use Codex's MCP-scoped JWT to call the gateway.
|
|
114
|
-
//
|
|
115
|
-
// Note for users who already have Codex set up: yes, you'll see the login
|
|
116
|
-
// flow once. Codex's MCP-scoped token has `aud: cybedefend-mcp` and limited
|
|
117
|
-
// Permify rights; vibedefend's runtime hook needs a USER token (`aud:
|
|
118
|
-
// cybedefend-api`) to call /effective-rules and friends. They are NOT
|
|
119
|
-
// interchangeable. After one Logto SSO consent (instant if your browser
|
|
120
|
-
// already has a session) the refresh_token persists for 14 days.
|
|
121
|
-
if (hasStoredAuth(selection.region.mcpName)) {
|
|
122
|
-
log.ok('VibeDefend credentials already present. Skipping login.');
|
|
123
|
-
}
|
|
124
|
-
else {
|
|
125
|
-
log.info('No VibeDefend credentials found. Running login flow...');
|
|
126
|
-
try {
|
|
127
|
-
await runLogin({
|
|
128
|
-
mcpName: selection.region.mcpName,
|
|
129
|
-
apiBase: selection.region.apiBase,
|
|
130
|
-
logtoEndpoint: selection.region.logtoEndpoint ??
|
|
131
|
-
deriveLogtoEndpoint(selection.region.apiBase),
|
|
132
|
-
});
|
|
133
|
-
}
|
|
134
|
-
catch (e) {
|
|
135
|
-
const msg = e instanceof Error ? e.message : String(e);
|
|
136
|
-
log.warn(`Login skipped (${msg}). Run \`vibedefend login\` to authenticate.`);
|
|
137
|
-
}
|
|
138
|
-
}
|
|
139
|
-
printDoneFooter(installedLabels, selection.region.mcpName);
|
|
166
|
+
// NOTE: the pre-1.4 end-of-install auto-login used to live here. Login now
|
|
167
|
+
// happens FIRST (step ② above) — by this point the user is guaranteed to be
|
|
168
|
+
// authenticated, so there is nothing left to do.
|
|
169
|
+
printDoneFooter(installedLabels, region);
|
|
140
170
|
}
|
|
141
171
|
/**
|
|
142
|
-
*
|
|
143
|
-
*
|
|
172
|
+
* Run the login flow with exactly one confirm-gated retry.
|
|
173
|
+
* Returns true when a login attempt succeeded, false when the user declined
|
|
174
|
+
* the retry or the retry also failed. A Ctrl-C inside the confirm prompt
|
|
175
|
+
* propagates up (handled as a clean cancel by the CLI action wrapper).
|
|
144
176
|
*/
|
|
145
|
-
function
|
|
146
|
-
|
|
147
|
-
|
|
177
|
+
async function loginWithOneRetry(loginOpts, runLogin, confirm) {
|
|
178
|
+
try {
|
|
179
|
+
await runLogin(loginOpts);
|
|
180
|
+
return true;
|
|
181
|
+
}
|
|
182
|
+
catch (e) {
|
|
183
|
+
if (isUserCancellation(e))
|
|
184
|
+
throw e;
|
|
185
|
+
const msg = e instanceof Error ? e.message : String(e);
|
|
186
|
+
log.warn(`Sign-in failed: ${msg}`);
|
|
187
|
+
}
|
|
188
|
+
const retry = await confirm({
|
|
189
|
+
message: 'Try signing in again?',
|
|
190
|
+
default: true,
|
|
191
|
+
});
|
|
192
|
+
if (!retry)
|
|
193
|
+
return false;
|
|
194
|
+
try {
|
|
195
|
+
await runLogin(loginOpts);
|
|
196
|
+
return true;
|
|
148
197
|
}
|
|
149
|
-
|
|
150
|
-
|
|
198
|
+
catch (e) {
|
|
199
|
+
if (isUserCancellation(e))
|
|
200
|
+
throw e;
|
|
201
|
+
const msg = e instanceof Error ? e.message : String(e);
|
|
202
|
+
log.warn(`Sign-in failed again: ${msg}`);
|
|
203
|
+
return false;
|
|
151
204
|
}
|
|
152
|
-
return apiBase;
|
|
153
205
|
}
|
|
154
206
|
function banner() {
|
|
155
207
|
console.log();
|
|
@@ -158,7 +210,7 @@ function banner() {
|
|
|
158
210
|
console.log(kleur.dim(' Sets up the MCP server, hooks, and project link.'));
|
|
159
211
|
console.log();
|
|
160
212
|
}
|
|
161
|
-
function printDoneFooter(installedLabels,
|
|
213
|
+
function printDoneFooter(installedLabels, region) {
|
|
162
214
|
console.log();
|
|
163
215
|
log.ok('Install complete.');
|
|
164
216
|
console.log();
|
|
@@ -168,11 +220,13 @@ function printDoneFooter(installedLabels, mcpName) {
|
|
|
168
220
|
console.log();
|
|
169
221
|
}
|
|
170
222
|
console.log(kleur.bold('Next steps:'));
|
|
171
|
-
console.log(` ${kleur.cyan('1.')} Open your IDE in your repo
|
|
172
|
-
|
|
173
|
-
|
|
174
|
-
console.log(kleur.
|
|
175
|
-
|
|
223
|
+
console.log(` ${kleur.cyan('1.')} Open your IDE in your repo — you are already signed in, so the MCP tools work right away.`);
|
|
224
|
+
console.log(` ${kleur.cyan('2.')} Repos imported from GitHub/GitLab are matched to their CybeDefend project ` +
|
|
225
|
+
`automatically via the git origin — nothing to do.`);
|
|
226
|
+
console.log(` ${kleur.cyan('3.')} For any other repo, link it once: ${kleur.dim('`vibedefend link`')} ` +
|
|
227
|
+
`(or ${kleur.dim('`npx -y @cybedefend/vibedefend@latest link`')}).`);
|
|
228
|
+
console.log(kleur.dim(' A `.cybedefend/config.json` with { "projectId": "<uuid>" } remains a supported override.'));
|
|
229
|
+
console.log(` ${kleur.cyan('4.')} Verify (Claude Code): ${kleur.dim('`claude mcp list`')} should show ${kleur.bold(region.mcpName)}.`);
|
|
176
230
|
console.log();
|
|
177
231
|
console.log(kleur.dim(' Tunables (set per-shell or per-project to override defaults):'));
|
|
178
232
|
console.log(kleur.dim(' CYBEDEFEND_REVIEW_THRESHOLD — edits before the Stop hook fires'));
|
package/dist/install.js.map
CHANGED
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"install.js","sourceRoot":"","sources":["../src/install.ts"],"names":[],"mappings":"AAAA,OAAO,KAAK,MAAM,OAAO,CAAC;AAE1B,OAAO,EAAE,UAAU,EAAE,MAAM,uBAAuB,CAAC;AACnD,OAAO,EAAE,oBAAoB,EAAE,MAAM,0BAA0B,CAAC;AAChE,OAAO,EAAE,kBAAkB,EAAE,MAAM,oBAAoB,CAAC;AACxD,OAAO,EAAE,QAAQ,EAAE,MAAM,YAAY,CAAC;
|
|
1
|
+
{"version":3,"file":"install.js","sourceRoot":"","sources":["../src/install.ts"],"names":[],"mappings":"AAAA,OAAO,EAAE,OAAO,IAAI,WAAW,EAAE,MAAM,mBAAmB,CAAC;AAC3D,OAAO,KAAK,MAAM,OAAO,CAAC;AAE1B,OAAO,EAAE,UAAU,EAAE,MAAM,uBAAuB,CAAC;AACnD,OAAO,EAAE,oBAAoB,EAAE,MAAM,0BAA0B,CAAC;AAChE,OAAO,EAAE,kBAAkB,EAAE,mBAAmB,EAAE,MAAM,gBAAgB,CAAC;AACzE,OAAO,EAAE,kBAAkB,EAAE,MAAM,oBAAoB,CAAC;AACxD,OAAO,EAAE,QAAQ,IAAI,YAAY,EAAE,MAAM,YAAY,CAAC;AACtD,OAAO,EAAE,aAAa,IAAI,iBAAiB,EAAE,MAAM,gBAAgB,CAAC;AACpE,OAAO,EAAE,kBAAkB,IAAI,sBAAsB,EAAE,MAAM,eAAe,CAAC;AAC7E,OAAO,EACL,kBAAkB,IAAI,sBAAsB,EAC5C,aAAa,IAAI,iBAAiB,EAClC,SAAS,IAAI,aAAa,GAE3B,MAAM,cAAc,CAAC;AAGtB,OAAO,EAAE,qBAAqB,EAAE,MAAM,kBAAkB,CAAC;AACzD,OAAO,EAAE,cAAc,EAAE,IAAI,EAAE,kBAAkB,EAAE,GAAG,EAAE,MAAM,YAAY,CAAC;AAC3E,OAAO,EAAE,GAAG,EAAE,MAAM,cAAc,CAAC;AAqCnC;;;;;;;;;;;;;;;;;;;GAmBG;AACH,MAAM,CAAC,KAAK,UAAU,UAAU,CAC9B,OAAoB,EAAE,EACtB,OAA4B,EAAE;IAE9B,MAAM,SAAS,GAAG,IAAI,CAAC,SAAS,IAAI,aAAa,CAAC;IAClD,MAAM,aAAa,GAAG,IAAI,CAAC,aAAa,IAAI,iBAAiB,CAAC;IAC9D,MAAM,QAAQ,GAAG,IAAI,CAAC,QAAQ,IAAI,YAAY,CAAC;IAC/C,MAAM,kBAAkB,GAAG,IAAI,CAAC,kBAAkB,IAAI,sBAAsB,CAAC;IAC7E,MAAM,kBAAkB,GAAG,IAAI,CAAC,kBAAkB,IAAI,sBAAsB,CAAC;IAC7E,MAAM,aAAa,GAAG,IAAI,CAAC,aAAa,IAAI,iBAAiB,CAAC;IAC9D,MAAM,OAAO,GAAG,IAAI,CAAC,OAAO,IAAI,WAAW,CAAC;IAC5C,MAAM,IAAI,GAAG,IAAI,CAAC,IAAI,IAAI,CAAC,CAAC,IAAY,EAAE,EAAE,CAAC,OAAO,CAAC,IAAI,CAAC,IAAI,CAAC,CAAC,CAAC;IAEjE,MAAM,EAAE,CAAC;IAET,MAAM,CAAC,GAAG,cAAc,EAAE,CAAC;IAC3B,MAAM,eAAe,GAAG,oBAAoB,EAAE,CAAC;IAE/C,GAAG,CAAC,IAAI,CAAC,aAAa,KAAK,CAAC,IAAI,CAAC,CAAC,CAAC,EAAE,CAAC,CAAC;IACvC,IAAI,CAAC,eAAe,CAAC,cAAc,EAAE,CAAC;QACpC,GAAG,CAAC,IAAI,CAAC,eAAe,CAAC,MAAM,IAAI,qCAAqC,CAAC,CAAC;IAC5E,CAAC;IAED,+EAA+E;IAC/E,MAAM,MAAM,GAAG,MAAM,SAAS,EAAE,CAAC;IAEjC,GAAG,CAAC,IAAI,CAAC,mBAAmB,GAAG,KAAK,CAAC,IAAI,CAAC,MAAM,CAAC,KAAK,CAAC,CAAC,CAAC;IACzD,GAAG,CAAC,IAAI,CAAC,YAAY,MAAM,CAAC,MAAM,EAAE,CAAC,CAAC;IACtC,GAAG,CAAC,IAAI,CAAC,aAAa,MAAM,CAAC,OAAO,EAAE,CAAC,CAAC;IAExC,8EAA8E;IAC9E,EAAE;IACF,oEAAoE;IACpE,2EAA2E;IAC3E,yEAAyE;IACzE,yDAAyD;IACzD,EAAE;IACF,uEAAuE;IACvE,sEAAsE;IACtE,4EAA4E;IAC5E,yEAAyE;IACzE,6EAA6E;IAC7E,2EAA2E;IAC3E,sEAAsE;IACtE,MAAM,aAAa,GAChB,MAAqC,CAAC,aAAa;QACpD,mBAAmB,CAAC,MAAM,CAAC,OAAO,CAAC,CAAC;IAEtC,IAAI,aAAa,CAAC,MAAM,CAAC,OAAO,CAAC,IAAI,CAAC,IAAI,CAAC,KAAK,EAAE,CAAC;QACjD,GAAG,CAAC,EAAE,CAAC,yDAAyD,CAAC,CAAC;IACpE,CAAC;SAAM,CAAC;QACN,GAAG,CAAC,IAAI,CAAC,uBAAuB,CAAC,CAAC;QAClC,GAAG,CAAC,IAAI,CACN,wFAAwF,CACzF,CAAC;QACF,yEAAyE;QACzE,yEAAyE;QACzE,0EAA0E;QAC1E,0EAA0E;QAC1E,uEAAuE;QACvE,0EAA0E;QAC1E,2EAA2E;QAC3E,MAAM,OAAO,GAAG,MAAM,iBAAiB,CACrC;YACE,OAAO,EAAE,MAAM,CAAC,OAAO;YACvB,OAAO,EAAE,MAAM,CAAC,OAAO;YACvB,aAAa;YACb,KAAK,EAAE,IAAI;SACZ,EACD,QAAQ,EACR,OAAO,CACR,CAAC;QACF,IAAI,CAAC,OAAO,EAAE,CAAC;YACb,GAAG,CAAC,GAAG,CACL,8DAA8D;gBAC5D,+DAA+D,CAClE,CAAC;YACF,IAAI,CAAC,CAAC,CAAC,CAAC;YACR,OAAO,CAAC,2DAA2D;QACrE,CAAC;IACH,CAAC;IAED,+EAA+E;IAC/E,2EAA2E;IAC3E,0EAA0E;IAC1E,sEAAsE;IACtE,MAAM,kBAAkB,CAAC;QACvB,OAAO,EAAE,MAAM,CAAC,OAAO;QACvB,YAAY,EAAE,kBAAkB,CAAC,MAAM,CAAC;QACxC,OAAO,EAAE,MAAM,CAAC,OAAO;KACxB,CAAC,CAAC;IAEH,+EAA+E;IAC/E,MAAM,eAAe,GAAG,MAAM,kBAAkB,EAAE,CAAC;IAEnD,IAAI,eAAe,CAAC,MAAM,KAAK,CAAC,EAAE,CAAC;QACjC,GAAG,CAAC,IAAI,CACN,+FAA+F;YAC7F,yEAAyE,CAC5E,CAAC;QACF,qBAAqB,CAAC,IAAI,EAAE,GAAG,CAAC,OAAO,CAAC,CAAC;QACzC,eAAe,CAAC,EAAE,EAAE,MAAM,CAAC,CAAC;QAC5B,OAAO;IACT,CAAC;IAED,MAAM,KAAK,GAAG,MAAM,aAAa,EAAE,CAAC;IAEpC,oEAAoE;IACpE,+DAA+D;IAC/D,+DAA+D;IAC/D,kEAAkE;IAClE,oEAAoE;IACpE,IAAI,eAAe,CAAC,cAAc,EAAE,CAAC;QACnC,GAAG,CAAC,IAAI,CAAC,kCAAkC,CAAC,CAAC;QAC7C,MAAM,EAAE,UAAU,EAAE,UAAU,EAAE,GAAG,kBAAkB,CAAC;YACpD,MAAM;YACN,KAAK;YACL,gBAAgB,EAAE,GAAG,CAAC,OAAO;SAC9B,CAAC,CAAC;QACH,GAAG,CAAC,EAAE,CAAC,YAAY,UAAU,EAAE,CAAC,CAAC;QACjC,GAAG,CAAC,IAAI,CAAC,YAAY,UAAU,EAAE,CAAC,CAAC;IACrC,CAAC;SAAM,CAAC;QACN,GAAG,CAAC,IAAI,CACN,wFAAwF,CACzF,CAAC;IACJ,CAAC;IAED,8DAA8D;IAC9D,0DAA0D;IAC1D,MAAM,eAAe,GAAa,EAAE,CAAC;IACrC,KAAK,MAAM,EAAE,IAAI,eAAe,EAAE,CAAC;QACjC,MAAM,OAAO,GAAG,UAAU,CAAC,EAAE,CAAC,CAAC;QAC/B,GAAG,CAAC,IAAI,CAAC,UAAU,OAAO,CAAC,KAAK,EAAE,CAAC,CAAC;QAEpC,IAAI,OAAO,CAAC,WAAW,EAAE,CAAC;YACxB,OAAO,CAAC,WAAW,CAAC,EAAE,MAAM,EAAE,CAAC,CAAC;QAClC,CAAC;QAED,IAAI,OAAO,CAAC,YAAY,EAAE,CAAC;YACzB,OAAO,CAAC,YAAY,CAAC,EAAE,MAAM,EAAE,CAAC,CAAC;QACnC,CAAC;QAED,IAAI,eAAe,CAAC,cAAc,EAAE,CAAC;YACnC,OAAO,CAAC,aAAa,CAAC;gBACpB,uDAAuD;gBACvD,gEAAgE;gBAChE,8DAA8D;gBAC9D,OAAO,EAAE,IAAI,CAAC,aAAa,CAAC;gBAC5B,mBAAmB,EAAE,KAAK,CAAC,mBAAmB;gBAC9C,MAAM;gBACN,KAAK;aACN,CAAC,CAAC;QACL,CAAC;QACD,eAAe,CAAC,IAAI,CAAC,OAAO,CAAC,KAAK,CAAC,CAAC;IACtC,CAAC;IAED,IAAI,KAAK,CAAC,eAAe,EAAE,CAAC;QAC1B,GAAG,CAAC,IAAI,CACN,0EAA0E;YACxE,gFAAgF;YAChF,yEAAyE,CAC5E,CAAC;IACJ,CAAC;IAED,qBAAqB,CAAC,IAAI,EAAE,GAAG,CAAC,OAAO,CAAC,CAAC;IACzC,GAAG,CAAC,IAAI,CAAC,0CAA0C,GAAG,CAAC,OAAO,GAAG,CAAC,CAAC;IAEnE,2EAA2E;IAC3E,4EAA4E;IAC5E,iDAAiD;IAEjD,eAAe,CAAC,eAAe,EAAE,MAAM,CAAC,CAAC;AAC3C,CAAC;AAED;;;;;GAKG;AACH,KAAK,UAAU,iBAAiB,CAC9B,SAKC,EACD,QAA8C,EAC9C,OAA4C;IAE5C,IAAI,CAAC;QACH,MAAM,QAAQ,CAAC,SAAS,CAAC,CAAC;QAC1B,OAAO,IAAI,CAAC;IACd,CAAC;IAAC,OAAO,CAAC,EAAE,CAAC;QACX,IAAI,kBAAkB,CAAC,CAAC,CAAC;YAAE,MAAM,CAAC,CAAC;QACnC,MAAM,GAAG,GAAG,CAAC,YAAY,KAAK,CAAC,CAAC,CAAC,CAAC,CAAC,OAAO,CAAC,CAAC,CAAC,MAAM,CAAC,CAAC,CAAC,CAAC;QACvD,GAAG,CAAC,IAAI,CAAC,mBAAmB,GAAG,EAAE,CAAC,CAAC;IACrC,CAAC;IAED,MAAM,KAAK,GAAG,MAAM,OAAO,CAAC;QAC1B,OAAO,EAAE,uBAAuB;QAChC,OAAO,EAAE,IAAI;KACd,CAAC,CAAC;IACH,IAAI,CAAC,KAAK;QAAE,OAAO,KAAK,CAAC;IAEzB,IAAI,CAAC;QACH,MAAM,QAAQ,CAAC,SAAS,CAAC,CAAC;QAC1B,OAAO,IAAI,CAAC;IACd,CAAC;IAAC,OAAO,CAAC,EAAE,CAAC;QACX,IAAI,kBAAkB,CAAC,CAAC,CAAC;YAAE,MAAM,CAAC,CAAC;QACnC,MAAM,GAAG,GAAG,CAAC,YAAY,KAAK,CAAC,CAAC,CAAC,CAAC,CAAC,OAAO,CAAC,CAAC,CAAC,MAAM,CAAC,CAAC,CAAC,CAAC;QACvD,GAAG,CAAC,IAAI,CAAC,yBAAyB,GAAG,EAAE,CAAC,CAAC;QACzC,OAAO,KAAK,CAAC;IACf,CAAC;AACH,CAAC;AAED,SAAS,MAAM;IACb,OAAO,CAAC,GAAG,EAAE,CAAC;IACd,OAAO,CAAC,GAAG,CACT,KAAK,CAAC,IAAI,EAAE,CAAC,IAAI,CAAC,gBAAgB,CAAC;QACjC,KAAK,CAAC,GAAG,CAAC,6CAA6C,CAAC,CAC3D,CAAC;IACF,OAAO,CAAC,GAAG,CACT,KAAK,CAAC,GAAG,CAAC,oDAAoD,CAAC,CAChE,CAAC;IACF,OAAO,CAAC,GAAG,EAAE,CAAC;AAChB,CAAC;AAED,SAAS,eAAe,CAAC,eAAyB,EAAE,MAAoB;IACtE,OAAO,CAAC,GAAG,EAAE,CAAC;IACd,GAAG,CAAC,EAAE,CAAC,mBAAmB,CAAC,CAAC;IAC5B,OAAO,CAAC,GAAG,EAAE,CAAC;IACd,IAAI,eAAe,CAAC,MAAM,GAAG,CAAC,EAAE,CAAC;QAC/B,OAAO,CAAC,GAAG,CACT,KAAK,CAAC,IAAI,CAAC,uBAAuB,CAAC;YACjC,eAAe,CAAC,GAAG,CAAC,CAAC,CAAC,EAAE,EAAE,CAAC,KAAK,CAAC,KAAK,CAAC,CAAC,CAAC,CAAC,CAAC,IAAI,CAAC,IAAI,CAAC,CACxD,CAAC;QACF,OAAO,CAAC,GAAG,EAAE,CAAC;IAChB,CAAC;IACD,OAAO,CAAC,GAAG,CAAC,KAAK,CAAC,IAAI,CAAC,aAAa,CAAC,CAAC,CAAC;IACvC,OAAO,CAAC,GAAG,CACT,KAAK,KAAK,CAAC,IAAI,CAAC,IAAI,CAAC,4FAA4F,CAClH,CAAC;IACF,OAAO,CAAC,GAAG,CACT,KAAK,KAAK,CAAC,IAAI,CAAC,IAAI,CAAC,6EAA6E;QAChG,mDAAmD,CACtD,CAAC;IACF,OAAO,CAAC,GAAG,CACT,KAAK,KAAK,CAAC,IAAI,CAAC,IAAI,CAAC,sCAAsC,KAAK,CAAC,GAAG,CAAC,mBAAmB,CAAC,GAAG;QAC1F,OAAO,KAAK,CAAC,GAAG,CAAC,6CAA6C,CAAC,IAAI,CACtE,CAAC;IACF,OAAO,CAAC,GAAG,CACT,KAAK,CAAC,GAAG,CACP,+FAA+F,CAChG,CACF,CAAC;IACF,OAAO,CAAC,GAAG,CACT,KAAK,KAAK,CAAC,IAAI,CAAC,IAAI,CAAC,0BAA0B,KAAK,CAAC,GAAG,CAAC,mBAAmB,CAAC,gBAAgB,KAAK,CAAC,IAAI,CAAC,MAAM,CAAC,OAAO,CAAC,GAAG,CAC3H,CAAC;IACF,OAAO,CAAC,GAAG,EAAE,CAAC;IACd,OAAO,CAAC,GAAG,CACT,KAAK,CAAC,GAAG,CAAC,iEAAiE,CAAC,CAC7E,CAAC;IACF,OAAO,CAAC,GAAG,CACT,KAAK,CAAC,GAAG,CAAC,qEAAqE,CAAC,CACjF,CAAC;IACF,OAAO,CAAC,GAAG,CACT,KAAK,CAAC,GAAG,CAAC,2DAA2D,CAAC,CACvE,CAAC;IACF,OAAO,CAAC,GAAG,CACT,KAAK,CAAC,GAAG,CAAC,qEAAqE,CAAC,CACjF,CAAC;IACF,OAAO,CAAC,GAAG,EAAE,CAAC;AAChB,CAAC"}
|