@agentteams/cli 0.1.83 → 0.1.85
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/.eslintcache +1 -1
- package/dist/api/plan.d.ts +2 -0
- package/dist/api/plan.d.ts.map +1 -1
- package/dist/api/plan.js.map +1 -1
- package/dist/auth/activeCredential.d.ts +22 -0
- package/dist/auth/activeCredential.d.ts.map +1 -0
- package/dist/auth/activeCredential.js +25 -0
- package/dist/auth/activeCredential.js.map +1 -0
- package/dist/auth/credentialStore.d.ts +118 -0
- package/dist/auth/credentialStore.d.ts.map +1 -0
- package/dist/auth/credentialStore.js +340 -0
- package/dist/auth/credentialStore.js.map +1 -0
- package/dist/auth/personalTokenClient.d.ts +189 -0
- package/dist/auth/personalTokenClient.d.ts.map +1 -0
- package/dist/auth/personalTokenClient.js +379 -0
- package/dist/auth/personalTokenClient.js.map +1 -0
- package/dist/auth/personalTokenStore.d.ts +17 -0
- package/dist/auth/personalTokenStore.d.ts.map +1 -0
- package/dist/auth/personalTokenStore.js +27 -0
- package/dist/auth/personalTokenStore.js.map +1 -0
- package/dist/auth/refreshLock.d.ts +74 -0
- package/dist/auth/refreshLock.d.ts.map +1 -0
- package/dist/auth/refreshLock.js +225 -0
- package/dist/auth/refreshLock.js.map +1 -0
- package/dist/commands/agentConfig.d.ts.map +1 -1
- package/dist/commands/agentConfig.js +8 -6
- package/dist/commands/agentConfig.js.map +1 -1
- package/dist/commands/attachment.d.ts.map +1 -1
- package/dist/commands/attachment.js +10 -2
- package/dist/commands/attachment.js.map +1 -1
- package/dist/commands/auth.d.ts +97 -0
- package/dist/commands/auth.d.ts.map +1 -0
- package/dist/commands/auth.js +245 -0
- package/dist/commands/auth.js.map +1 -0
- package/dist/commands/config.d.ts.map +1 -1
- package/dist/commands/config.js +16 -2
- package/dist/commands/config.js.map +1 -1
- package/dist/commands/convention.d.ts +11 -0
- package/dist/commands/convention.d.ts.map +1 -1
- package/dist/commands/convention.js +35 -11
- package/dist/commands/convention.js.map +1 -1
- package/dist/commands/dependency.d.ts.map +1 -1
- package/dist/commands/dependency.js +8 -6
- package/dist/commands/dependency.js.map +1 -1
- package/dist/commands/index.d.ts.map +1 -1
- package/dist/commands/index.js +19 -14
- package/dist/commands/index.js.map +1 -1
- package/dist/commands/init.d.ts +17 -0
- package/dist/commands/init.d.ts.map +1 -1
- package/dist/commands/init.js +90 -9
- package/dist/commands/init.js.map +1 -1
- package/dist/commands/plan.d.ts +15 -0
- package/dist/commands/plan.d.ts.map +1 -1
- package/dist/commands/plan.js +28 -0
- package/dist/commands/plan.js.map +1 -1
- package/dist/index.js +106 -16
- package/dist/index.js.map +1 -1
- package/dist/mcp/context.d.ts +15 -1
- package/dist/mcp/context.d.ts.map +1 -1
- package/dist/mcp/context.js +24 -5
- package/dist/mcp/context.js.map +1 -1
- package/dist/mcp/server.d.ts +1 -1
- package/dist/mcp/server.d.ts.map +1 -1
- package/dist/mcp/server.js +5 -2
- package/dist/mcp/server.js.map +1 -1
- package/dist/mcp/tools.d.ts.map +1 -1
- package/dist/mcp/tools.js +25 -22
- package/dist/mcp/tools.js.map +1 -1
- package/dist/mcp-registration/clients.d.ts.map +1 -1
- package/dist/mcp-registration/clients.js +1 -9
- package/dist/mcp-registration/clients.js.map +1 -1
- package/dist/mcp-registration/doctor.d.ts +38 -0
- package/dist/mcp-registration/doctor.d.ts.map +1 -0
- package/dist/mcp-registration/doctor.js +379 -0
- package/dist/mcp-registration/doctor.js.map +1 -0
- package/dist/mcp-registration/index.d.ts +7 -5
- package/dist/mcp-registration/index.d.ts.map +1 -1
- package/dist/mcp-registration/index.js +46 -21
- package/dist/mcp-registration/index.js.map +1 -1
- package/dist/mcp-registration/install.d.ts.map +1 -1
- package/dist/mcp-registration/install.js +12 -15
- package/dist/mcp-registration/install.js.map +1 -1
- package/dist/mcp-registration/render.d.ts +8 -6
- package/dist/mcp-registration/render.d.ts.map +1 -1
- package/dist/mcp-registration/render.js +15 -36
- package/dist/mcp-registration/render.js.map +1 -1
- package/dist/mcp-registration/serverSpec.d.ts +31 -18
- package/dist/mcp-registration/serverSpec.d.ts.map +1 -1
- package/dist/mcp-registration/serverSpec.js +36 -20
- package/dist/mcp-registration/serverSpec.js.map +1 -1
- package/dist/mcp-registration/types.d.ts +0 -3
- package/dist/mcp-registration/types.d.ts.map +1 -1
- package/dist/types/index.d.ts +10 -0
- package/dist/types/index.d.ts.map +1 -1
- package/dist/utils/apiKeyInput.d.ts +16 -0
- package/dist/utils/apiKeyInput.d.ts.map +1 -0
- package/dist/utils/apiKeyInput.js +47 -0
- package/dist/utils/apiKeyInput.js.map +1 -0
- package/dist/utils/authFormat.d.ts +18 -0
- package/dist/utils/authFormat.d.ts.map +1 -0
- package/dist/utils/authFormat.js +130 -0
- package/dist/utils/authFormat.js.map +1 -0
- package/dist/utils/authServer.d.ts +32 -3
- package/dist/utils/authServer.d.ts.map +1 -1
- package/dist/utils/authServer.js +46 -6
- package/dist/utils/authServer.js.map +1 -1
- package/dist/utils/config.d.ts +127 -15
- package/dist/utils/config.d.ts.map +1 -1
- package/dist/utils/config.js +201 -8
- package/dist/utils/config.js.map +1 -1
- package/dist/utils/errors.d.ts.map +1 -1
- package/dist/utils/errors.js +16 -0
- package/dist/utils/errors.js.map +1 -1
- package/dist/utils/httpClient.d.ts.map +1 -1
- package/dist/utils/httpClient.js +25 -0
- package/dist/utils/httpClient.js.map +1 -1
- package/dist/utils/initOutput.d.ts.map +1 -1
- package/dist/utils/initOutput.js +30 -0
- package/dist/utils/initOutput.js.map +1 -1
- package/package.json +1 -1
|
@@ -1,29 +1,45 @@
|
|
|
1
|
-
import {
|
|
2
|
-
import {
|
|
1
|
+
import { existsSync } from 'node:fs';
|
|
2
|
+
import { delimiter, isAbsolute, join, resolve } from 'node:path';
|
|
3
3
|
/** Server name registered in every client. Kept stable so re-runs update rather than duplicate. */
|
|
4
4
|
export const MCP_SERVER_NAME = 'agentteams';
|
|
5
|
-
|
|
6
|
-
|
|
7
|
-
|
|
8
|
-
|
|
9
|
-
|
|
10
|
-
|
|
11
|
-
|
|
12
|
-
|
|
13
|
-
|
|
14
|
-
|
|
15
|
-
|
|
16
|
-
|
|
17
|
-
|
|
18
|
-
|
|
19
|
-
|
|
20
|
-
if (credentials.apiUrl && credentials.apiUrl !== DEFAULT_API_URL) {
|
|
21
|
-
env[CREDENTIAL_ENV_KEYS.apiUrl] = credentials.apiUrl;
|
|
5
|
+
/** Published package the `npx` fallback runs. */
|
|
6
|
+
export const MCP_RUNTIME_PACKAGE = '@agentteams/cli';
|
|
7
|
+
/** Name of the globally installed executable, when there is one. */
|
|
8
|
+
export const MCP_GLOBAL_EXECUTABLE = 'agentteams';
|
|
9
|
+
function executableSuffixes() {
|
|
10
|
+
return process.platform === 'win32' ? ['', '.cmd', '.exe', '.bat', '.ps1'] : [''];
|
|
11
|
+
}
|
|
12
|
+
/** Is a bare `agentteams` resolvable from this context's PATH? */
|
|
13
|
+
export function hasGlobalExecutable(context, fileExists = existsSync) {
|
|
14
|
+
const pathDirs = (context.env.PATH ?? '').split(delimiter).filter((entry) => entry.length > 0);
|
|
15
|
+
for (const directory of pathDirs) {
|
|
16
|
+
for (const suffix of executableSuffixes()) {
|
|
17
|
+
if (fileExists(join(directory, `${MCP_GLOBAL_EXECUTABLE}${suffix}`)))
|
|
18
|
+
return true;
|
|
19
|
+
}
|
|
22
20
|
}
|
|
21
|
+
return false;
|
|
22
|
+
}
|
|
23
|
+
/**
|
|
24
|
+
* What the client will spawn.
|
|
25
|
+
*
|
|
26
|
+
* A bare `agentteams` is the fast path, but it is only correct when the package is
|
|
27
|
+
* installed globally *and* the client inherits a PATH that contains it — neither holds
|
|
28
|
+
* for `npx @agentteams/cli mcp install` or for a GUI-launched client that never sourced
|
|
29
|
+
* a login shell. Those failures surface as an opaque "server failed to start" inside the
|
|
30
|
+
* client, so when the executable is not resolvable the spec falls back to `npx`, which
|
|
31
|
+
* works in both cases.
|
|
32
|
+
*/
|
|
33
|
+
export function buildServerSpec(options) {
|
|
34
|
+
const { serverEntry } = options;
|
|
35
|
+
const env = {};
|
|
23
36
|
if (serverEntry) {
|
|
24
37
|
const entryPath = isAbsolute(serverEntry) ? serverEntry : resolve(serverEntry);
|
|
25
38
|
return { command: 'node', args: [entryPath, 'mcp'], env };
|
|
26
39
|
}
|
|
27
|
-
|
|
40
|
+
if (options.context && !hasGlobalExecutable(options.context, options.fileExists)) {
|
|
41
|
+
return { command: 'npx', args: ['-y', MCP_RUNTIME_PACKAGE, 'mcp'], env };
|
|
42
|
+
}
|
|
43
|
+
return { command: MCP_GLOBAL_EXECUTABLE, args: ['mcp'], env };
|
|
28
44
|
}
|
|
29
45
|
//# sourceMappingURL=serverSpec.js.map
|
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"serverSpec.js","sourceRoot":"","sources":["../../src/mcp-registration/serverSpec.ts"],"names":[],"mappings":"AAAA,OAAO,EAAE,UAAU,EAAE,
|
|
1
|
+
{"version":3,"file":"serverSpec.js","sourceRoot":"","sources":["../../src/mcp-registration/serverSpec.ts"],"names":[],"mappings":"AAAA,OAAO,EAAE,UAAU,EAAE,MAAM,SAAS,CAAC;AACrC,OAAO,EAAE,SAAS,EAAE,UAAU,EAAE,IAAI,EAAE,OAAO,EAAE,MAAM,WAAW,CAAC;AAGjE,mGAAmG;AACnG,MAAM,CAAC,MAAM,eAAe,GAAG,YAAY,CAAC;AAE5C,iDAAiD;AACjD,MAAM,CAAC,MAAM,mBAAmB,GAAG,iBAAiB,CAAC;AAErD,oEAAoE;AACpE,MAAM,CAAC,MAAM,qBAAqB,GAAG,YAAY,CAAC;AA2BlD,SAAS,kBAAkB;IACzB,OAAO,OAAO,CAAC,QAAQ,KAAK,OAAO,CAAC,CAAC,CAAC,CAAC,EAAE,EAAE,MAAM,EAAE,MAAM,EAAE,MAAM,EAAE,MAAM,CAAC,CAAC,CAAC,CAAC,CAAC,EAAE,CAAC,CAAC;AACpF,CAAC;AAED,kEAAkE;AAClE,MAAM,UAAU,mBAAmB,CACjC,OAAuB,EACvB,aAAwC,UAAU;IAElD,MAAM,QAAQ,GAAG,CAAC,OAAO,CAAC,GAAG,CAAC,IAAI,IAAI,EAAE,CAAC,CAAC,KAAK,CAAC,SAAS,CAAC,CAAC,MAAM,CAAC,CAAC,KAAK,EAAE,EAAE,CAAC,KAAK,CAAC,MAAM,GAAG,CAAC,CAAC,CAAC;IAE/F,KAAK,MAAM,SAAS,IAAI,QAAQ,EAAE,CAAC;QACjC,KAAK,MAAM,MAAM,IAAI,kBAAkB,EAAE,EAAE,CAAC;YAC1C,IAAI,UAAU,CAAC,IAAI,CAAC,SAAS,EAAE,GAAG,qBAAqB,GAAG,MAAM,EAAE,CAAC,CAAC;gBAAE,OAAO,IAAI,CAAC;QACpF,CAAC;IACH,CAAC;IAED,OAAO,KAAK,CAAC;AACf,CAAC;AAED;;;;;;;;;GASG;AACH,MAAM,UAAU,eAAe,CAAC,OAA+B;IAC7D,MAAM,EAAE,WAAW,EAAE,GAAG,OAAO,CAAC;IAChC,MAAM,GAAG,GAA2B,EAAE,CAAC;IAEvC,IAAI,WAAW,EAAE,CAAC;QAChB,MAAM,SAAS,GAAG,UAAU,CAAC,WAAW,CAAC,CAAC,CAAC,CAAC,WAAW,CAAC,CAAC,CAAC,OAAO,CAAC,WAAW,CAAC,CAAC;QAC/E,OAAO,EAAE,OAAO,EAAE,MAAM,EAAE,IAAI,EAAE,CAAC,SAAS,EAAE,KAAK,CAAC,EAAE,GAAG,EAAE,CAAC;IAC5D,CAAC;IAED,IAAI,OAAO,CAAC,OAAO,IAAI,CAAC,mBAAmB,CAAC,OAAO,CAAC,OAAO,EAAE,OAAO,CAAC,UAAU,CAAC,EAAE,CAAC;QACjF,OAAO,EAAE,OAAO,EAAE,KAAK,EAAE,IAAI,EAAE,CAAC,IAAI,EAAE,mBAAmB,EAAE,KAAK,CAAC,EAAE,GAAG,EAAE,CAAC;IAC3E,CAAC;IAED,OAAO,EAAE,OAAO,EAAE,qBAAqB,EAAE,IAAI,EAAE,CAAC,KAAK,CAAC,EAAE,GAAG,EAAE,CAAC;AAChE,CAAC"}
|
|
@@ -2,8 +2,6 @@
|
|
|
2
2
|
export declare const MCP_CLIENT_IDS: readonly ["claude-code", "codex", "copilot-cli", "opencode", "amp", "cursor-cli", "kimi-cli", "antigravity"];
|
|
3
3
|
export type McpClientId = (typeof MCP_CLIENT_IDS)[number];
|
|
4
4
|
export type McpScope = 'user' | 'project';
|
|
5
|
-
/** Syntax the client uses to inherit a secret from its parent process. */
|
|
6
|
-
export type McpSecretReference = 'dollarBraces' | 'opencodeEnv' | 'codexEnvVars';
|
|
7
5
|
/** How the AgentTeams entry reaches the client's configuration. */
|
|
8
6
|
export type McpInstallStrategy =
|
|
9
7
|
/** The client owns the format; we shell out to its documented non-interactive command. */
|
|
@@ -61,7 +59,6 @@ export interface McpClientDefinition {
|
|
|
61
59
|
label: string;
|
|
62
60
|
/** Executable names looked up on PATH. */
|
|
63
61
|
executables: string[];
|
|
64
|
-
secretReference: McpSecretReference;
|
|
65
62
|
/** Extra directories to probe when the client installs outside PATH (e.g. Kimi). */
|
|
66
63
|
extraBinDirs?: (context: McpPathContext) => string[];
|
|
67
64
|
/** Files/directories whose presence proves the client has been configured on this machine. */
|
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"types.d.ts","sourceRoot":"","sources":["../../src/mcp-registration/types.ts"],"names":[],"mappings":"AAAA,+HAA+H;AAC/H,eAAO,MAAM,cAAc,8GASjB,CAAC;AAEX,MAAM,MAAM,WAAW,GAAG,CAAC,OAAO,cAAc,CAAC,CAAC,MAAM,CAAC,CAAC;AAE1D,MAAM,MAAM,QAAQ,GAAG,MAAM,GAAG,SAAS,CAAC;AAE1C,
|
|
1
|
+
{"version":3,"file":"types.d.ts","sourceRoot":"","sources":["../../src/mcp-registration/types.ts"],"names":[],"mappings":"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"}
|
package/dist/types/index.d.ts
CHANGED
|
@@ -6,6 +6,14 @@
|
|
|
6
6
|
* CLI Configuration stored in .agentteams/config.json
|
|
7
7
|
* Contains credentials and project context for API communication
|
|
8
8
|
*/
|
|
9
|
+
/**
|
|
10
|
+
* Which credential family this project is configured to authenticate with.
|
|
11
|
+
*
|
|
12
|
+
* `personal-token` is the default: project config stays secret-free while a
|
|
13
|
+
* rotating refresh token lives in the OS credential store. `api-key` is the
|
|
14
|
+
* explicit compatibility path for existing automation and legacy projects.
|
|
15
|
+
*/
|
|
16
|
+
export type AuthMode = 'api-key' | 'personal-token';
|
|
9
17
|
export interface Config {
|
|
10
18
|
/** Team ID from AgentTeams */
|
|
11
19
|
teamId: string;
|
|
@@ -15,6 +23,8 @@ export interface Config {
|
|
|
15
23
|
apiKey: string;
|
|
16
24
|
/** API URL (e.g., "http://localhost:3001") */
|
|
17
25
|
apiUrl: string;
|
|
26
|
+
/** Legacy migration marker; absent configs choose by whether an apiKey exists. */
|
|
27
|
+
authMode?: AuthMode;
|
|
18
28
|
}
|
|
19
29
|
/**
|
|
20
30
|
* Plan from API
|
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"index.d.ts","sourceRoot":"","sources":["../../src/types/index.ts"],"names":[],"mappings":"AAAA;;;GAGG;AAMH;;;GAGG;AACH,MAAM,WAAW,MAAM;IACrB,8BAA8B;IAC9B,MAAM,EAAE,MAAM,CAAC;IACf,iCAAiC;IACjC,SAAS,EAAE,MAAM,CAAC;IAClB,mDAAmD;IACnD,MAAM,EAAE,MAAM,CAAC;IACf,8CAA8C;IAC9C,MAAM,EAAE,MAAM,CAAC;
|
|
1
|
+
{"version":3,"file":"index.d.ts","sourceRoot":"","sources":["../../src/types/index.ts"],"names":[],"mappings":"AAAA;;;GAGG;AAMH;;;GAGG;AACH;;;;;;GAMG;AACH,MAAM,MAAM,QAAQ,GAAG,SAAS,GAAG,gBAAgB,CAAC;AAEpD,MAAM,WAAW,MAAM;IACrB,8BAA8B;IAC9B,MAAM,EAAE,MAAM,CAAC;IACf,iCAAiC;IACjC,SAAS,EAAE,MAAM,CAAC;IAClB,mDAAmD;IACnD,MAAM,EAAE,MAAM,CAAC;IACf,8CAA8C;IAC9C,MAAM,EAAE,MAAM,CAAC;IACf,kFAAkF;IAClF,QAAQ,CAAC,EAAE,QAAQ,CAAC;CACrB;AAMD;;;GAGG;AACH,MAAM,WAAW,IAAI;IACnB,wBAAwB;IACxB,EAAE,EAAE,MAAM,CAAC;IACX,iBAAiB;IACjB,KAAK,EAAE,MAAM,CAAC;IACd,2BAA2B;IAC3B,WAAW,EAAE,MAAM,CAAC;IACpB,IAAI,CAAC,EAAE,MAAM,GAAG,IAAI,CAAC;IACrB,2DAA2D;IAC3D,MAAM,EAAE,MAAM,CAAC;IACf,qDAAqD;IACrD,UAAU,EAAE,MAAM,GAAG,IAAI,CAAC;IAC1B,qDAAqD;IACrD,QAAQ,EAAE,MAAM,CAAC;IACjB,iBAAiB,CAAC,EAAE,MAAM,GAAG,IAAI,CAAC;IAClC,gBAAgB,CAAC,EAAE,MAAM,GAAG,IAAI,CAAC;IACjC,aAAa,CAAC,EAAE,MAAM,GAAG,IAAI,CAAC;IAC9B,oCAAoC;IACpC,SAAS,EAAE,MAAM,CAAC;IAClB,uCAAuC;IACvC,SAAS,EAAE,MAAM,CAAC;IAClB,+CAA+C;IAC/C,SAAS,EAAE,MAAM,GAAG,IAAI,CAAC;CAC1B;AAMD;;GAEG;AACH,MAAM,MAAM,YAAY,GAAG,MAAM,CAAC"}
|
|
@@ -0,0 +1,16 @@
|
|
|
1
|
+
export interface ApiKeyInputOptions {
|
|
2
|
+
apiKey?: string;
|
|
3
|
+
apiKeyFile?: string;
|
|
4
|
+
}
|
|
5
|
+
export interface ApiKeyInputDependencies {
|
|
6
|
+
readFile: (path: string) => string;
|
|
7
|
+
readStdin: () => string;
|
|
8
|
+
warn: (message: string) => void;
|
|
9
|
+
}
|
|
10
|
+
/**
|
|
11
|
+
* Resolve explicit credential input without ever writing the credential to
|
|
12
|
+
* output. The legacy argv path remains compatible, but every use explains the
|
|
13
|
+
* safer environment, file and stdin alternatives on stderr.
|
|
14
|
+
*/
|
|
15
|
+
export declare function resolveApiKeyInput(options: ApiKeyInputOptions, dependencies?: ApiKeyInputDependencies): string | undefined;
|
|
16
|
+
//# sourceMappingURL=apiKeyInput.d.ts.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"apiKeyInput.d.ts","sourceRoot":"","sources":["../../src/utils/apiKeyInput.ts"],"names":[],"mappings":"AAEA,MAAM,WAAW,kBAAkB;IACjC,MAAM,CAAC,EAAE,MAAM,CAAC;IAChB,UAAU,CAAC,EAAE,MAAM,CAAC;CACrB;AAED,MAAM,WAAW,uBAAuB;IACtC,QAAQ,EAAE,CAAC,IAAI,EAAE,MAAM,KAAK,MAAM,CAAC;IACnC,SAAS,EAAE,MAAM,MAAM,CAAC;IACxB,IAAI,EAAE,CAAC,OAAO,EAAE,MAAM,KAAK,IAAI,CAAC;CACjC;AAmBD;;;;GAIG;AACH,wBAAgB,kBAAkB,CAChC,OAAO,EAAE,kBAAkB,EAC3B,YAAY,GAAE,uBAA6C,GAC1D,MAAM,GAAG,SAAS,CA8BpB"}
|
|
@@ -0,0 +1,47 @@
|
|
|
1
|
+
import { readFileSync } from 'node:fs';
|
|
2
|
+
const defaultDependencies = {
|
|
3
|
+
readFile: (path) => readFileSync(path, 'utf-8'),
|
|
4
|
+
readStdin: () => readFileSync(0, 'utf-8'),
|
|
5
|
+
warn: (message) => process.stderr.write(message),
|
|
6
|
+
};
|
|
7
|
+
const normalizeApiKey = (value, source) => {
|
|
8
|
+
const normalized = value.trim();
|
|
9
|
+
if (!normalized) {
|
|
10
|
+
throw new Error(`${source} is empty.`);
|
|
11
|
+
}
|
|
12
|
+
if (/\s/.test(normalized)) {
|
|
13
|
+
throw new Error(`${source} must contain exactly one API key without whitespace.`);
|
|
14
|
+
}
|
|
15
|
+
return normalized;
|
|
16
|
+
};
|
|
17
|
+
/**
|
|
18
|
+
* Resolve explicit credential input without ever writing the credential to
|
|
19
|
+
* output. The legacy argv path remains compatible, but every use explains the
|
|
20
|
+
* safer environment, file and stdin alternatives on stderr.
|
|
21
|
+
*/
|
|
22
|
+
export function resolveApiKeyInput(options, dependencies = defaultDependencies) {
|
|
23
|
+
if (options.apiKey !== undefined && options.apiKeyFile !== undefined) {
|
|
24
|
+
throw new Error('--api-key and --api-key-file cannot be used together.');
|
|
25
|
+
}
|
|
26
|
+
if (options.apiKey !== undefined) {
|
|
27
|
+
dependencies.warn('[warn] --api-key exposes credentials in shell history and process listings. Prefer AGENTTEAMS_API_KEY, --api-key-file <path>, or --api-key-file - for stdin.\n');
|
|
28
|
+
return normalizeApiKey(options.apiKey, '--api-key');
|
|
29
|
+
}
|
|
30
|
+
if (options.apiKeyFile === undefined) {
|
|
31
|
+
return undefined;
|
|
32
|
+
}
|
|
33
|
+
const source = options.apiKeyFile === '-' ? 'stdin' : `API key file ${options.apiKeyFile}`;
|
|
34
|
+
try {
|
|
35
|
+
const value = options.apiKeyFile === '-' ? dependencies.readStdin() : dependencies.readFile(options.apiKeyFile);
|
|
36
|
+
return normalizeApiKey(value, source);
|
|
37
|
+
}
|
|
38
|
+
catch (error) {
|
|
39
|
+
if (error instanceof Error &&
|
|
40
|
+
(error.message.endsWith('is empty.') || error.message.includes('exactly one API key'))) {
|
|
41
|
+
throw error;
|
|
42
|
+
}
|
|
43
|
+
const detail = error instanceof Error ? error.message : String(error);
|
|
44
|
+
throw new Error(`Could not read ${source}: ${detail}`);
|
|
45
|
+
}
|
|
46
|
+
}
|
|
47
|
+
//# sourceMappingURL=apiKeyInput.js.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"apiKeyInput.js","sourceRoot":"","sources":["../../src/utils/apiKeyInput.ts"],"names":[],"mappings":"AAAA,OAAO,EAAE,YAAY,EAAE,MAAM,SAAS,CAAC;AAavC,MAAM,mBAAmB,GAA4B;IACnD,QAAQ,EAAE,CAAC,IAAI,EAAE,EAAE,CAAC,YAAY,CAAC,IAAI,EAAE,OAAO,CAAC;IAC/C,SAAS,EAAE,GAAG,EAAE,CAAC,YAAY,CAAC,CAAC,EAAE,OAAO,CAAC;IACzC,IAAI,EAAE,CAAC,OAAO,EAAE,EAAE,CAAC,OAAO,CAAC,MAAM,CAAC,KAAK,CAAC,OAAO,CAAC;CACjD,CAAC;AAEF,MAAM,eAAe,GAAG,CAAC,KAAa,EAAE,MAAc,EAAU,EAAE;IAChE,MAAM,UAAU,GAAG,KAAK,CAAC,IAAI,EAAE,CAAC;IAChC,IAAI,CAAC,UAAU,EAAE,CAAC;QAChB,MAAM,IAAI,KAAK,CAAC,GAAG,MAAM,YAAY,CAAC,CAAC;IACzC,CAAC;IACD,IAAI,IAAI,CAAC,IAAI,CAAC,UAAU,CAAC,EAAE,CAAC;QAC1B,MAAM,IAAI,KAAK,CAAC,GAAG,MAAM,uDAAuD,CAAC,CAAC;IACpF,CAAC;IACD,OAAO,UAAU,CAAC;AACpB,CAAC,CAAC;AAEF;;;;GAIG;AACH,MAAM,UAAU,kBAAkB,CAChC,OAA2B,EAC3B,eAAwC,mBAAmB;IAE3D,IAAI,OAAO,CAAC,MAAM,KAAK,SAAS,IAAI,OAAO,CAAC,UAAU,KAAK,SAAS,EAAE,CAAC;QACrE,MAAM,IAAI,KAAK,CAAC,uDAAuD,CAAC,CAAC;IAC3E,CAAC;IAED,IAAI,OAAO,CAAC,MAAM,KAAK,SAAS,EAAE,CAAC;QACjC,YAAY,CAAC,IAAI,CACf,gKAAgK,CACjK,CAAC;QACF,OAAO,eAAe,CAAC,OAAO,CAAC,MAAM,EAAE,WAAW,CAAC,CAAC;IACtD,CAAC;IAED,IAAI,OAAO,CAAC,UAAU,KAAK,SAAS,EAAE,CAAC;QACrC,OAAO,SAAS,CAAC;IACnB,CAAC;IAED,MAAM,MAAM,GAAG,OAAO,CAAC,UAAU,KAAK,GAAG,CAAC,CAAC,CAAC,OAAO,CAAC,CAAC,CAAC,gBAAgB,OAAO,CAAC,UAAU,EAAE,CAAC;IAC3F,IAAI,CAAC;QACH,MAAM,KAAK,GAAG,OAAO,CAAC,UAAU,KAAK,GAAG,CAAC,CAAC,CAAC,YAAY,CAAC,SAAS,EAAE,CAAC,CAAC,CAAC,YAAY,CAAC,QAAQ,CAAC,OAAO,CAAC,UAAU,CAAC,CAAC;QAChH,OAAO,eAAe,CAAC,KAAK,EAAE,MAAM,CAAC,CAAC;IACxC,CAAC;IAAC,OAAO,KAAK,EAAE,CAAC;QACf,IACE,KAAK,YAAY,KAAK;YACtB,CAAC,KAAK,CAAC,OAAO,CAAC,QAAQ,CAAC,WAAW,CAAC,IAAI,KAAK,CAAC,OAAO,CAAC,QAAQ,CAAC,qBAAqB,CAAC,CAAC,EACtF,CAAC;YACD,MAAM,KAAK,CAAC;QACd,CAAC;QACD,MAAM,MAAM,GAAG,KAAK,YAAY,KAAK,CAAC,CAAC,CAAC,KAAK,CAAC,OAAO,CAAC,CAAC,CAAC,MAAM,CAAC,KAAK,CAAC,CAAC;QACtE,MAAM,IAAI,KAAK,CAAC,kBAAkB,MAAM,KAAK,MAAM,EAAE,CAAC,CAAC;IACzD,CAAC;AACH,CAAC"}
|
|
@@ -0,0 +1,18 @@
|
|
|
1
|
+
/**
|
|
2
|
+
* Human-readable rendering of `agentteams auth` results.
|
|
3
|
+
*
|
|
4
|
+
* `auth` is read by a person deciding what to do next — "am I signed in, as whom,
|
|
5
|
+
* and against which server" — not by a script assembling a payload. The JSON view
|
|
6
|
+
* is still available behind an explicit `--format json` for the scripts that read
|
|
7
|
+
* the documented fields.
|
|
8
|
+
*
|
|
9
|
+
* Lines are `Label: value` so the output stays greppable, and every line answers a
|
|
10
|
+
* question a user actually asks. Anything the payload does not contain is omitted
|
|
11
|
+
* rather than printed as `null`.
|
|
12
|
+
*/
|
|
13
|
+
/**
|
|
14
|
+
* Render an `auth` result as text. Unknown actions fall back to JSON so a new
|
|
15
|
+
* subcommand is never silently reduced to nothing.
|
|
16
|
+
*/
|
|
17
|
+
export declare function formatAuthResultText(action: string, result: unknown): string;
|
|
18
|
+
//# sourceMappingURL=authFormat.d.ts.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"authFormat.d.ts","sourceRoot":"","sources":["../../src/utils/authFormat.ts"],"names":[],"mappings":"AAAA;;;;;;;;;;;GAWG;AAkHH;;;GAGG;AACH,wBAAgB,oBAAoB,CAAC,MAAM,EAAE,MAAM,EAAE,MAAM,EAAE,OAAO,GAAG,MAAM,CAqB5E"}
|
|
@@ -0,0 +1,130 @@
|
|
|
1
|
+
/**
|
|
2
|
+
* Human-readable rendering of `agentteams auth` results.
|
|
3
|
+
*
|
|
4
|
+
* `auth` is read by a person deciding what to do next — "am I signed in, as whom,
|
|
5
|
+
* and against which server" — not by a script assembling a payload. The JSON view
|
|
6
|
+
* is still available behind an explicit `--format json` for the scripts that read
|
|
7
|
+
* the documented fields.
|
|
8
|
+
*
|
|
9
|
+
* Lines are `Label: value` so the output stays greppable, and every line answers a
|
|
10
|
+
* question a user actually asks. Anything the payload does not contain is omitted
|
|
11
|
+
* rather than printed as `null`.
|
|
12
|
+
*/
|
|
13
|
+
const asString = (value) => typeof value === 'string' && value.trim().length > 0 ? value : undefined;
|
|
14
|
+
const asRecord = (value) => value && typeof value === 'object' ? value : {};
|
|
15
|
+
/** `nickname <email>`, falling back to whichever half is present. */
|
|
16
|
+
function describeIdentity(identity) {
|
|
17
|
+
const record = asRecord(identity);
|
|
18
|
+
const email = asString(record.email);
|
|
19
|
+
const nickname = asString(record.nickname);
|
|
20
|
+
if (email && nickname)
|
|
21
|
+
return `${nickname} <${email}>`;
|
|
22
|
+
return email ?? nickname ?? asString(record.memberId);
|
|
23
|
+
}
|
|
24
|
+
/** "macOS keychain (OK)" — the backend plus why it can or cannot persist. */
|
|
25
|
+
function describeStore(backend, reason, persisted) {
|
|
26
|
+
const labels = {
|
|
27
|
+
'macos-keychain': 'macOS keychain',
|
|
28
|
+
'windows-credential-manager': 'Windows Credential Manager',
|
|
29
|
+
libsecret: 'libsecret (Secret Service)',
|
|
30
|
+
none: 'none',
|
|
31
|
+
};
|
|
32
|
+
const backendLabel = labels[String(backend)] ?? asString(backend);
|
|
33
|
+
if (!backendLabel)
|
|
34
|
+
return undefined;
|
|
35
|
+
const reasonLabel = asString(reason);
|
|
36
|
+
const suffix = persisted === false ? 'session only — nothing is written to disk' : reasonLabel;
|
|
37
|
+
return suffix ? `${backendLabel} (${suffix})` : backendLabel;
|
|
38
|
+
}
|
|
39
|
+
const CREDENTIAL_SOURCE_LABELS = {
|
|
40
|
+
'personal-token': 'personal login',
|
|
41
|
+
'config-api-key': 'project API key',
|
|
42
|
+
'explicit-api-key': 'API key passed to this command',
|
|
43
|
+
};
|
|
44
|
+
function formatLogin(result) {
|
|
45
|
+
const lines = [];
|
|
46
|
+
const identity = describeIdentity(result.identity);
|
|
47
|
+
lines.push(identity ? `Signed in as ${identity}` : 'Signed in');
|
|
48
|
+
const apiUrl = asString(result.apiUrl);
|
|
49
|
+
if (apiUrl)
|
|
50
|
+
lines.push(`Server: ${apiUrl}`);
|
|
51
|
+
const store = describeStore(result.storeBackend, result.storeReason, result.persisted);
|
|
52
|
+
if (store)
|
|
53
|
+
lines.push(`Stored in: ${store}`);
|
|
54
|
+
const configPath = asString(result.configPath);
|
|
55
|
+
// configPath is null when the project was not switched over, which the warning
|
|
56
|
+
// below explains — so only claim the switch when it actually happened.
|
|
57
|
+
if (configPath)
|
|
58
|
+
lines.push(`Project: ${configPath} (switched to personal login)`);
|
|
59
|
+
return lines;
|
|
60
|
+
}
|
|
61
|
+
function formatStatus(result) {
|
|
62
|
+
const lines = [];
|
|
63
|
+
const token = asRecord(result.personalToken);
|
|
64
|
+
const source = asString(result.credentialSource);
|
|
65
|
+
lines.push(`Credential: ${source ? (CREDENTIAL_SOURCE_LABELS[source] ?? source) : 'none usable'}`);
|
|
66
|
+
const identity = describeIdentity(token.identity);
|
|
67
|
+
if (identity)
|
|
68
|
+
lines.push(`Signed in as ${identity}`);
|
|
69
|
+
const apiUrl = asString(result.apiUrl);
|
|
70
|
+
if (apiUrl)
|
|
71
|
+
lines.push(`Server: ${apiUrl}`);
|
|
72
|
+
const configPath = asString(result.configPath);
|
|
73
|
+
if (configPath) {
|
|
74
|
+
const authMode = asString(result.authMode);
|
|
75
|
+
lines.push(`Project: ${configPath}${authMode === 'personal-token' ? ' (personal login)' : ''}`);
|
|
76
|
+
}
|
|
77
|
+
const store = describeStore(token.storeBackend, token.storeReason, token.persisted);
|
|
78
|
+
if (store)
|
|
79
|
+
lines.push(`Store: ${store}`);
|
|
80
|
+
const expiresAt = asString(token.expiresAt);
|
|
81
|
+
if (expiresAt)
|
|
82
|
+
lines.push(`Access token expires: ${expiresAt}`);
|
|
83
|
+
// A stored-but-rejected token is the case where "connected" alone misleads.
|
|
84
|
+
if (token.reconnectRequired === true) {
|
|
85
|
+
lines.push("Sign-in required: the stored login was rejected. Run 'agentteams auth login'.");
|
|
86
|
+
}
|
|
87
|
+
return lines;
|
|
88
|
+
}
|
|
89
|
+
function formatLogout(result) {
|
|
90
|
+
const lines = ['Signed out'];
|
|
91
|
+
const apiUrl = asString(result.apiUrl);
|
|
92
|
+
if (apiUrl)
|
|
93
|
+
lines.push(`Server: ${apiUrl}`);
|
|
94
|
+
lines.push(result.revokedOnServer === true
|
|
95
|
+
? 'Server-side token: revoked'
|
|
96
|
+
: 'Server-side token: still valid — revoke it in the AgentTeams web app');
|
|
97
|
+
const configPath = asString(result.configPath);
|
|
98
|
+
if (configPath)
|
|
99
|
+
lines.push(`Project: ${configPath} (personal login setting removed)`);
|
|
100
|
+
if (result.fellBackToApiKey === true) {
|
|
101
|
+
lines.push('This project fell back to the API key still in its config.');
|
|
102
|
+
}
|
|
103
|
+
return lines;
|
|
104
|
+
}
|
|
105
|
+
/**
|
|
106
|
+
* Render an `auth` result as text. Unknown actions fall back to JSON so a new
|
|
107
|
+
* subcommand is never silently reduced to nothing.
|
|
108
|
+
*/
|
|
109
|
+
export function formatAuthResultText(action, result) {
|
|
110
|
+
const record = asRecord(result);
|
|
111
|
+
const lines = action === 'login'
|
|
112
|
+
? formatLogin(record)
|
|
113
|
+
: action === 'status'
|
|
114
|
+
? formatStatus(record)
|
|
115
|
+
: action === 'logout'
|
|
116
|
+
? formatLogout(record)
|
|
117
|
+
: null;
|
|
118
|
+
if (!lines)
|
|
119
|
+
return JSON.stringify(result, null, 2);
|
|
120
|
+
// `problem` and `warning` are the reason a user ran the command at all, so they
|
|
121
|
+
// go last where the eye lands.
|
|
122
|
+
const problem = asString(record.problem);
|
|
123
|
+
if (problem)
|
|
124
|
+
lines.push(`Problem: ${problem}`);
|
|
125
|
+
const warning = asString(record.warning);
|
|
126
|
+
if (warning)
|
|
127
|
+
lines.push(`Warning: ${warning}`);
|
|
128
|
+
return lines.join('\n');
|
|
129
|
+
}
|
|
130
|
+
//# sourceMappingURL=authFormat.js.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"authFormat.js","sourceRoot":"","sources":["../../src/utils/authFormat.ts"],"names":[],"mappings":"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"}
|
|
@@ -7,9 +7,18 @@ export type AuthResult = {
|
|
|
7
7
|
configId: string;
|
|
8
8
|
seedPlanId?: string | null;
|
|
9
9
|
};
|
|
10
|
-
|
|
10
|
+
/**
|
|
11
|
+
* The authorization-code callback. Deliberately smaller than {@link AuthResult}:
|
|
12
|
+
* a single-use code that is worthless without the `code_verifier` this process
|
|
13
|
+
* never sent anywhere, instead of a long-lived key travelling through a browser.
|
|
14
|
+
*/
|
|
15
|
+
export type AuthorizationCodeResult = {
|
|
16
|
+
code: string;
|
|
17
|
+
state: string;
|
|
18
|
+
};
|
|
19
|
+
type AuthServerResult<T> = {
|
|
11
20
|
server: Server;
|
|
12
|
-
waitForCallback: () => Promise<
|
|
21
|
+
waitForCallback: () => Promise<T>;
|
|
13
22
|
port: number;
|
|
14
23
|
/** Echo this back through the authorize URL; the callback is rejected without it. */
|
|
15
24
|
state: string;
|
|
@@ -19,6 +28,26 @@ type StartLocalAuthServerOptions = {
|
|
|
19
28
|
};
|
|
20
29
|
/** Unguessable value that proves a callback belongs to the login this process started. */
|
|
21
30
|
export declare function createAuthState(): string;
|
|
22
|
-
export
|
|
31
|
+
export type PkcePair = {
|
|
32
|
+
/** Stays in this process. Without it a stolen code cannot be redeemed. */
|
|
33
|
+
verifier: string;
|
|
34
|
+
/** S256 hash sent through the browser. */
|
|
35
|
+
challenge: string;
|
|
36
|
+
};
|
|
37
|
+
/**
|
|
38
|
+
* PKCE S256 pair.
|
|
39
|
+
*
|
|
40
|
+
* 48 random bytes base64url-encode to 64 characters, inside the server's
|
|
41
|
+
* 43–128 range (`api/src/routes/desktop-auth/index.ts`).
|
|
42
|
+
*/
|
|
43
|
+
export declare function createPkcePair(): PkcePair;
|
|
44
|
+
/**
|
|
45
|
+
* Legacy login callback: the web posts the issued agent key back to this port.
|
|
46
|
+
* Kept unchanged for CLI/web combinations that predate the authorization-code
|
|
47
|
+
* path; `P3` is where it goes away.
|
|
48
|
+
*/
|
|
49
|
+
export declare function startLocalAuthServer(options?: StartLocalAuthServerOptions): Promise<AuthServerResult<AuthResult>>;
|
|
50
|
+
/** Authorization-code login callback: only `{ code, state }` crosses this boundary. */
|
|
51
|
+
export declare function startAuthorizationCodeServer(options?: StartLocalAuthServerOptions): Promise<AuthServerResult<AuthorizationCodeResult>>;
|
|
23
52
|
export {};
|
|
24
53
|
//# sourceMappingURL=authServer.d.ts.map
|
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"authServer.d.ts","sourceRoot":"","sources":["../../src/utils/authServer.ts"],"names":[],"mappings":"AACA,OAAO,EAAgB,KAAK,MAAM,EAA6C,MAAM,WAAW,CAAC;AAejG,MAAM,MAAM,UAAU,GAAG;IACvB,MAAM,EAAE,MAAM,CAAC;IACf,SAAS,EAAE,MAAM,CAAC;IAClB,SAAS,EAAE,MAAM,CAAC;IAClB,MAAM,EAAE,MAAM,CAAC;IACf,QAAQ,EAAE,MAAM,CAAC;IACjB,UAAU,CAAC,EAAE,MAAM,GAAG,IAAI,CAAC;CAC5B,CAAC;AAEF,KAAK,gBAAgB,
|
|
1
|
+
{"version":3,"file":"authServer.d.ts","sourceRoot":"","sources":["../../src/utils/authServer.ts"],"names":[],"mappings":"AACA,OAAO,EAAgB,KAAK,MAAM,EAA6C,MAAM,WAAW,CAAC;AAejG,MAAM,MAAM,UAAU,GAAG;IACvB,MAAM,EAAE,MAAM,CAAC;IACf,SAAS,EAAE,MAAM,CAAC;IAClB,SAAS,EAAE,MAAM,CAAC;IAClB,MAAM,EAAE,MAAM,CAAC;IACf,QAAQ,EAAE,MAAM,CAAC;IACjB,UAAU,CAAC,EAAE,MAAM,GAAG,IAAI,CAAC;CAC5B,CAAC;AAEF;;;;GAIG;AACH,MAAM,MAAM,uBAAuB,GAAG;IACpC,IAAI,EAAE,MAAM,CAAC;IACb,KAAK,EAAE,MAAM,CAAC;CACf,CAAC;AAEF,KAAK,gBAAgB,CAAC,CAAC,IAAI;IACzB,MAAM,EAAE,MAAM,CAAC;IACf,eAAe,EAAE,MAAM,OAAO,CAAC,CAAC,CAAC,CAAC;IAClC,IAAI,EAAE,MAAM,CAAC;IACb,qFAAqF;IACrF,KAAK,EAAE,MAAM,CAAC;CACf,CAAC;AAEF,KAAK,2BAA2B,GAAG;IACjC,KAAK,CAAC,EAAE,MAAM,CAAC;CAChB,CAAC;AAEF,0FAA0F;AAC1F,wBAAgB,eAAe,IAAI,MAAM,CAExC;AAED,MAAM,MAAM,QAAQ,GAAG;IACrB,0EAA0E;IAC1E,QAAQ,EAAE,MAAM,CAAC;IACjB,0CAA0C;IAC1C,SAAS,EAAE,MAAM,CAAC;CACnB,CAAC;AAEF;;;;;GAKG;AACH,wBAAgB,cAAc,IAAI,QAAQ,CAGzC;AAkUD;;;;GAIG;AACH,wBAAgB,oBAAoB,CAAC,OAAO,CAAC,EAAE,2BAA2B,GAAG,OAAO,CAAC,gBAAgB,CAAC,UAAU,CAAC,CAAC,CAEjH;AAED,uFAAuF;AACvF,wBAAgB,4BAA4B,CAC1C,OAAO,CAAC,EAAE,2BAA2B,GACpC,OAAO,CAAC,gBAAgB,CAAC,uBAAuB,CAAC,CAAC,CAKpD"}
|
package/dist/utils/authServer.js
CHANGED
|
@@ -1,4 +1,4 @@
|
|
|
1
|
-
import { randomBytes, timingSafeEqual } from 'node:crypto';
|
|
1
|
+
import { createHash, randomBytes, timingSafeEqual } from 'node:crypto';
|
|
2
2
|
import { createServer } from 'node:http';
|
|
3
3
|
const CALLBACK_TIMEOUT_MS = 60_000;
|
|
4
4
|
const DEFAULT_WEB_URL = 'https://agentteams.run';
|
|
@@ -14,6 +14,22 @@ const WEB_UPDATE_HINT = 'The AgentTeams web page did not echo the login state, s
|
|
|
14
14
|
export function createAuthState() {
|
|
15
15
|
return randomBytes(AUTH_STATE_BYTES).toString('base64url');
|
|
16
16
|
}
|
|
17
|
+
/**
|
|
18
|
+
* PKCE S256 pair.
|
|
19
|
+
*
|
|
20
|
+
* 48 random bytes base64url-encode to 64 characters, inside the server's
|
|
21
|
+
* 43–128 range (`api/src/routes/desktop-auth/index.ts`).
|
|
22
|
+
*/
|
|
23
|
+
export function createPkcePair() {
|
|
24
|
+
const verifier = randomBytes(48).toString('base64url');
|
|
25
|
+
return { verifier, challenge: createHash('sha256').update(verifier).digest('base64url') };
|
|
26
|
+
}
|
|
27
|
+
function isAuthorizationCodeResult(value) {
|
|
28
|
+
if (!value || typeof value !== 'object')
|
|
29
|
+
return false;
|
|
30
|
+
const candidate = value;
|
|
31
|
+
return typeof candidate.code === 'string' && candidate.code.length > 0;
|
|
32
|
+
}
|
|
17
33
|
function listenOnEphemeralPort(server) {
|
|
18
34
|
return new Promise((resolve, reject) => {
|
|
19
35
|
const onListening = () => {
|
|
@@ -138,7 +154,15 @@ function sendJson(response, statusCode, payload, request) {
|
|
|
138
154
|
});
|
|
139
155
|
response.end(body);
|
|
140
156
|
}
|
|
141
|
-
|
|
157
|
+
/**
|
|
158
|
+
* The hardened loopback callback server, shared by both login paths.
|
|
159
|
+
*
|
|
160
|
+
* Origin allow-listing, constant-time state comparison, the ephemeral port, and
|
|
161
|
+
* the "a forged callback must not consume this login" rule all live here once:
|
|
162
|
+
* the authorization-code path must not get a second, weaker copy of them. The
|
|
163
|
+
* only difference between the two callers is which payload shape they accept.
|
|
164
|
+
*/
|
|
165
|
+
async function startCallbackServer(parsePayload, options) {
|
|
142
166
|
const expectedState = options?.state ?? createAuthState();
|
|
143
167
|
let settled = false;
|
|
144
168
|
let timeoutHandle = null;
|
|
@@ -203,12 +227,16 @@ export async function startLocalAuthServer(options) {
|
|
|
203
227
|
}
|
|
204
228
|
try {
|
|
205
229
|
const rawBody = await readRequestBody(request);
|
|
206
|
-
const
|
|
207
|
-
|
|
230
|
+
const rawPayload = JSON.parse(rawBody);
|
|
231
|
+
const payload = parsePayload(rawPayload);
|
|
232
|
+
if (!payload) {
|
|
208
233
|
sendJson(response, 400, { message: 'Invalid OAuth callback payload.' }, request);
|
|
209
234
|
return;
|
|
210
235
|
}
|
|
211
|
-
|
|
236
|
+
// The state is read from the raw body, not from the parsed result: the
|
|
237
|
+
// legacy parser strips every field the CLI does not trust, `state`
|
|
238
|
+
// included, and it must still be checked before anything is accepted.
|
|
239
|
+
const receivedState = rawPayload.state;
|
|
212
240
|
if (typeof receivedState !== 'string' || receivedState.length === 0) {
|
|
213
241
|
sendJson(response, 400, { message: `Missing OAuth callback state. ${WEB_UPDATE_HINT}` }, request);
|
|
214
242
|
return;
|
|
@@ -222,7 +250,7 @@ export async function startLocalAuthServer(options) {
|
|
|
222
250
|
}
|
|
223
251
|
sendJson(response, 200, { success: true }, request);
|
|
224
252
|
setTimeout(() => {
|
|
225
|
-
resolveAuth(
|
|
253
|
+
resolveAuth(payload);
|
|
226
254
|
}, 100);
|
|
227
255
|
}
|
|
228
256
|
catch {
|
|
@@ -259,4 +287,16 @@ export async function startLocalAuthServer(options) {
|
|
|
259
287
|
state: expectedState,
|
|
260
288
|
};
|
|
261
289
|
}
|
|
290
|
+
/**
|
|
291
|
+
* Legacy login callback: the web posts the issued agent key back to this port.
|
|
292
|
+
* Kept unchanged for CLI/web combinations that predate the authorization-code
|
|
293
|
+
* path; `P3` is where it goes away.
|
|
294
|
+
*/
|
|
295
|
+
export function startLocalAuthServer(options) {
|
|
296
|
+
return startCallbackServer((value) => (isAuthResult(value) ? toAuthResult(value) : null), options);
|
|
297
|
+
}
|
|
298
|
+
/** Authorization-code login callback: only `{ code, state }` crosses this boundary. */
|
|
299
|
+
export function startAuthorizationCodeServer(options) {
|
|
300
|
+
return startCallbackServer((value) => (isAuthorizationCodeResult(value) ? { code: value.code, state: value.state } : null), options);
|
|
301
|
+
}
|
|
262
302
|
//# sourceMappingURL=authServer.js.map
|
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"authServer.js","sourceRoot":"","sources":["../../src/utils/authServer.ts"],"names":[],"mappings":"AAAA,OAAO,EAAE,WAAW,EAAE,eAAe,EAAE,MAAM,aAAa,CAAC;
|
|
1
|
+
{"version":3,"file":"authServer.js","sourceRoot":"","sources":["../../src/utils/authServer.ts"],"names":[],"mappings":"AAAA,OAAO,EAAE,UAAU,EAAE,WAAW,EAAE,eAAe,EAAE,MAAM,aAAa,CAAC;AACvE,OAAO,EAAE,YAAY,EAA0D,MAAM,WAAW,CAAC;AAEjG,MAAM,mBAAmB,GAAG,MAAM,CAAC;AACnC,MAAM,eAAe,GAAG,wBAAwB,CAAC;AACjD,2FAA2F;AAC3F,MAAM,gBAAgB,GAAG,EAAE,CAAC;AAE5B,+EAA+E;AAC/E,iFAAiF;AACjF,8EAA8E;AAC9E,MAAM,eAAe,GACnB,sFAAsF;IACtF,qGAAqG;IACrG,4EAA4E,CAAC;AAiC/E,0FAA0F;AAC1F,MAAM,UAAU,eAAe;IAC7B,OAAO,WAAW,CAAC,gBAAgB,CAAC,CAAC,QAAQ,CAAC,WAAW,CAAC,CAAC;AAC7D,CAAC;AASD;;;;;GAKG;AACH,MAAM,UAAU,cAAc;IAC5B,MAAM,QAAQ,GAAG,WAAW,CAAC,EAAE,CAAC,CAAC,QAAQ,CAAC,WAAW,CAAC,CAAC;IACvD,OAAO,EAAE,QAAQ,EAAE,SAAS,EAAE,UAAU,CAAC,QAAQ,CAAC,CAAC,MAAM,CAAC,QAAQ,CAAC,CAAC,MAAM,CAAC,WAAW,CAAC,EAAE,CAAC;AAC5F,CAAC;AAED,SAAS,yBAAyB,CAAC,KAAc;IAC/C,IAAI,CAAC,KAAK,IAAI,OAAO,KAAK,KAAK,QAAQ;QAAE,OAAO,KAAK,CAAC;IACtD,MAAM,SAAS,GAAG,KAAgC,CAAC;IACnD,OAAO,OAAO,SAAS,CAAC,IAAI,KAAK,QAAQ,IAAI,SAAS,CAAC,IAAI,CAAC,MAAM,GAAG,CAAC,CAAC;AACzE,CAAC;AAED,SAAS,qBAAqB,CAAC,MAAc;IAC3C,OAAO,IAAI,OAAO,CAAC,CAAC,OAAO,EAAE,MAAM,EAAE,EAAE;QACrC,MAAM,WAAW,GAAG,GAAS,EAAE;YAC7B,MAAM,CAAC,cAAc,CAAC,OAAO,EAAE,OAAO,CAAC,CAAC;YACxC,MAAM,OAAO,GAAG,MAAM,CAAC,OAAO,EAAE,CAAC;YACjC,IAAI,CAAC,OAAO,IAAI,OAAO,OAAO,KAAK,QAAQ,EAAE,CAAC;gBAC5C,MAAM,CAAC,IAAI,KAAK,CAAC,4DAA4D,CAAC,CAAC,CAAC;gBAChF,OAAO;YACT,CAAC;YACD,OAAO,CAAC,OAAO,CAAC,IAAI,CAAC,CAAC;QACxB,CAAC,CAAC;QACF,MAAM,OAAO,GAAG,CAAC,KAAY,EAAQ,EAAE;YACrC,MAAM,CAAC,cAAc,CAAC,WAAW,EAAE,WAAW,CAAC,CAAC;YAChD,MAAM,CAAC,KAAK,CAAC,CAAC;QAChB,CAAC,CAAC;QAEF,MAAM,CAAC,IAAI,CAAC,WAAW,EAAE,WAAW,CAAC,CAAC;QACtC,MAAM,CAAC,IAAI,CAAC,OAAO,EAAE,OAAO,CAAC,CAAC;QAC9B,2EAA2E;QAC3E,yDAAyD;QACzD,MAAM,CAAC,MAAM,CAAC,CAAC,EAAE,WAAW,CAAC,CAAC;IAChC,CAAC,CAAC,CAAC;AACL,CAAC;AAED,SAAS,YAAY,CAAC,KAAc;IAClC,IAAI,CAAC,KAAK,IAAI,OAAO,KAAK,KAAK,QAAQ,EAAE,CAAC;QACxC,OAAO,KAAK,CAAC;IACf,CAAC;IAED,MAAM,SAAS,GAAG,KAAgC,CAAC;IACnD,MAAM,eAAe,GACnB,SAAS,CAAC,UAAU,KAAK,SAAS,IAAI,SAAS,CAAC,UAAU,KAAK,IAAI,IAAI,OAAO,SAAS,CAAC,UAAU,KAAK,QAAQ,CAAC;IAElH,OAAO,CACL,OAAO,SAAS,CAAC,MAAM,KAAK,QAAQ;QACpC,OAAO,SAAS,CAAC,SAAS,KAAK,QAAQ;QACvC,OAAO,SAAS,CAAC,SAAS,KAAK,QAAQ;QACvC,OAAO,SAAS,CAAC,MAAM,KAAK,QAAQ;QACpC,OAAO,SAAS,CAAC,QAAQ,KAAK,QAAQ;QACtC,eAAe,CAChB,CAAC;AACJ,CAAC;AAED;;;GAGG;AACH,SAAS,YAAY,CAAC,OAA6C;IACjE,MAAM,MAAM,GAAe;QACzB,MAAM,EAAE,OAAO,CAAC,MAAM;QACtB,SAAS,EAAE,OAAO,CAAC,SAAS;QAC5B,SAAS,EAAE,OAAO,CAAC,SAAS;QAC5B,MAAM,EAAE,OAAO,CAAC,MAAM;QACtB,QAAQ,EAAE,OAAO,CAAC,QAAQ;KAC3B,CAAC;IAEF,IAAI,OAAO,CAAC,UAAU,KAAK,SAAS,EAAE,CAAC;QACrC,MAAM,CAAC,UAAU,GAAG,OAAO,CAAC,UAAU,CAAC;IACzC,CAAC;IAED,OAAO,MAAM,CAAC;AAChB,CAAC;AAED,SAAS,WAAW,CAAC,QAAgB,EAAE,QAAgB;IACrD,MAAM,aAAa,GAAG,MAAM,CAAC,IAAI,CAAC,QAAQ,EAAE,OAAO,CAAC,CAAC;IACrD,MAAM,aAAa,GAAG,MAAM,CAAC,IAAI,CAAC,QAAQ,EAAE,OAAO,CAAC,CAAC;IAErD,IAAI,aAAa,CAAC,MAAM,KAAK,aAAa,CAAC,MAAM,EAAE,CAAC;QAClD,OAAO,KAAK,CAAC;IACf,CAAC;IAED,OAAO,eAAe,CAAC,aAAa,EAAE,aAAa,CAAC,CAAC;AACvD,CAAC;AAED,SAAS,eAAe,CAAC,OAAwB;IAC/C,OAAO,IAAI,OAAO,CAAC,CAAC,OAAO,EAAE,MAAM,EAAE,EAAE;QACrC,MAAM,MAAM,GAAa,EAAE,CAAC;QAC5B,OAAO,CAAC,EAAE,CAAC,MAAM,EAAE,CAAC,KAAa,EAAE,EAAE,CAAC,MAAM,CAAC,IAAI,CAAC,KAAK,CAAC,CAAC,CAAC;QAC1D,OAAO,CAAC,EAAE,CAAC,KAAK,EAAE,GAAG,EAAE,CAAC,OAAO,CAAC,MAAM,CAAC,MAAM,CAAC,MAAM,CAAC,CAAC,QAAQ,CAAC,OAAO,CAAC,CAAC,CAAC,CAAC;QAC1E,OAAO,CAAC,EAAE,CAAC,OAAO,EAAE,MAAM,CAAC,CAAC;IAC9B,CAAC,CAAC,CAAC;AACL,CAAC;AAED,SAAS,eAAe,CAAC,KAAa;IACpC,IAAI,CAAC;QACH,OAAO,IAAI,GAAG,CAAC,KAAK,CAAC,CAAC,MAAM,CAAC;IAC/B,CAAC;IAAC,MAAM,CAAC;QACP,OAAO,IAAI,CAAC;IACd,CAAC;AACH,CAAC;AAED;;;;;GAKG;AACH,SAAS,iBAAiB;IACxB,MAAM,OAAO,GAAG,IAAI,GAAG,EAAU,CAAC;IAElC,MAAM,SAAS,GAAG,eAAe,CAAC,OAAO,CAAC,GAAG,CAAC,kBAAkB,IAAI,eAAe,CAAC,CAAC;IACrF,IAAI,SAAS,EAAE,CAAC;QACd,OAAO,CAAC,GAAG,CAAC,SAAS,CAAC,CAAC;IACzB,CAAC;IAED,KAAK,MAAM,KAAK,IAAI,CAAC,OAAO,CAAC,GAAG,CAAC,gCAAgC,IAAI,EAAE,CAAC,CAAC,KAAK,CAAC,GAAG,CAAC,EAAE,CAAC;QACpF,MAAM,OAAO,GAAG,KAAK,CAAC,IAAI,EAAE,CAAC;QAC7B,IAAI,OAAO,CAAC,MAAM,KAAK,CAAC,EAAE,CAAC;YACzB,SAAS;QACX,CAAC;QAED,MAAM,MAAM,GAAG,eAAe,CAAC,OAAO,CAAC,CAAC;QACxC,IAAI,MAAM,EAAE,CAAC;YACX,OAAO,CAAC,GAAG,CAAC,MAAM,CAAC,CAAC;QACtB,CAAC;IACH,CAAC;IAED,OAAO,KAAK,CAAC,IAAI,CAAC,OAAO,CAAC,MAAM,EAAE,CAAC,CAAC;AACtC,CAAC;AAED,SAAS,eAAe,CAAC,MAA0B;IACjD,IAAI,CAAC,MAAM,EAAE,CAAC;QACZ,OAAO,KAAK,CAAC;IACf,CAAC;IAED,OAAO,iBAAiB,EAAE,CAAC,QAAQ,CAAC,MAAM,CAAC,CAAC;AAC9C,CAAC;AAED,SAAS,cAAc,CAAC,QAAwB,EAAE,OAAyB;IACzE,MAAM,MAAM,GAAG,OAAO,EAAE,OAAO,CAAC,MAAM,CAAC;IAEvC,IAAI,eAAe,CAAC,MAAM,CAAC,EAAE,CAAC;QAC5B,QAAQ,CAAC,SAAS,CAAC,6BAA6B,EAAE,MAAM,CAAC,CAAC;QAC1D,QAAQ,CAAC,SAAS,CAAC,MAAM,EAAE,QAAQ,CAAC,CAAC;IACvC,CAAC;IAED,QAAQ,CAAC,SAAS,CAAC,8BAA8B,EAAE,eAAe,CAAC,CAAC;IACpE,QAAQ,CAAC,SAAS,CAAC,8BAA8B,EAAE,cAAc,CAAC,CAAC;AACrE,CAAC;AAED,SAAS,QAAQ,CAAC,QAAwB,EAAE,UAAkB,EAAE,OAAgB,EAAE,OAAyB;IACzG,MAAM,IAAI,GAAG,IAAI,CAAC,SAAS,CAAC,OAAO,CAAC,CAAC;IACrC,cAAc,CAAC,QAAQ,EAAE,OAAO,CAAC,CAAC;IAClC,QAAQ,CAAC,SAAS,CAAC,UAAU,EAAE;QAC7B,cAAc,EAAE,kBAAkB;QAClC,gBAAgB,EAAE,MAAM,CAAC,UAAU,CAAC,IAAI,CAAC;KAC1C,CAAC,CAAC;IACH,QAAQ,CAAC,GAAG,CAAC,IAAI,CAAC,CAAC;AACrB,CAAC;AAED;;;;;;;GAOG;AACH,KAAK,UAAU,mBAAmB,CAChC,YAA0C,EAC1C,OAAqC;IAErC,MAAM,aAAa,GAAG,OAAO,EAAE,KAAK,IAAI,eAAe,EAAE,CAAC;IAE1D,IAAI,OAAO,GAAG,KAAK,CAAC;IACpB,IAAI,aAAa,GAA0B,IAAI,CAAC;IAChD,IAAI,SAAS,GAAG,KAAK,CAAC;IAEtB,IAAI,eAAkD,CAAC;IACvD,IAAI,cAAoD,CAAC;IAEzD,MAAM,eAAe,GAAG,IAAI,OAAO,CAAI,CAAC,OAAO,EAAE,MAAM,EAAE,EAAE;QACzD,eAAe,GAAG,OAAO,CAAC;QAC1B,cAAc,GAAG,MAAM,CAAC;IAC1B,CAAC,CAAC,CAAC;IAEH,MAAM,UAAU,GAAG,GAAS,EAAE;QAC5B,IAAI,CAAC,MAAM,CAAC,SAAS,EAAE,CAAC;YACtB,OAAO;QACT,CAAC;QAED,MAAM,CAAC,KAAK,EAAE,CAAC;IACjB,CAAC,CAAC;IAEF,MAAM,kBAAkB,GAAG,GAAS,EAAE;QACpC,IAAI,CAAC,aAAa,EAAE,CAAC;YACnB,OAAO;QACT,CAAC;QAED,YAAY,CAAC,aAAa,CAAC,CAAC;QAC5B,aAAa,GAAG,IAAI,CAAC;IACvB,CAAC,CAAC;IAEF,MAAM,WAAW,GAAG,CAAC,OAAU,EAAQ,EAAE;QACvC,IAAI,OAAO,EAAE,CAAC;YACZ,OAAO;QACT,CAAC;QAED,OAAO,GAAG,IAAI,CAAC;QACf,kBAAkB,EAAE,CAAC;QACrB,eAAe,EAAE,CAAC,OAAO,CAAC,CAAC;QAC3B,UAAU,EAAE,CAAC;IACf,CAAC,CAAC;IAEF,MAAM,UAAU,GAAG,CAAC,KAAY,EAAQ,EAAE;QACxC,IAAI,OAAO,EAAE,CAAC;YACZ,OAAO;QACT,CAAC;QAED,OAAO,GAAG,IAAI,CAAC;QACf,kBAAkB,EAAE,CAAC;QACrB,cAAc,EAAE,CAAC,KAAK,CAAC,CAAC;QACxB,UAAU,EAAE,CAAC;IACf,CAAC,CAAC;IAEF,MAAM,MAAM,GAAG,YAAY,CAAC,KAAK,EAAE,OAAwB,EAAE,QAAwB,EAAE,EAAE;QACvF,IAAI,OAAO,CAAC,MAAM,KAAK,SAAS,EAAE,CAAC;YACjC,cAAc,CAAC,QAAQ,EAAE,OAAO,CAAC,CAAC;YAClC,QAAQ,CAAC,SAAS,CAAC,GAAG,CAAC,CAAC;YACxB,QAAQ,CAAC,GAAG,EAAE,CAAC;YACf,OAAO;QACT,CAAC;QAED,IAAI,OAAO,CAAC,MAAM,KAAK,MAAM,IAAI,OAAO,CAAC,GAAG,KAAK,WAAW,EAAE,CAAC;YAC7D,QAAQ,CAAC,QAAQ,EAAE,GAAG,EAAE,EAAE,OAAO,EAAE,YAAY,EAAE,EAAE,OAAO,CAAC,CAAC;YAC5D,OAAO;QACT,CAAC;QAED,4EAA4E;QAC5E,gEAAgE;QAChE,IAAI,CAAC,eAAe,CAAC,OAAO,CAAC,OAAO,CAAC,MAAM,CAAC,EAAE,CAAC;YAC7C,QAAQ,CAAC,QAAQ,EAAE,GAAG,EAAE,EAAE,OAAO,EAAE,uCAAuC,EAAE,EAAE,OAAO,CAAC,CAAC;YACvF,OAAO;QACT,CAAC;QAED,IAAI,OAAO,EAAE,CAAC;YACZ,QAAQ,CAAC,QAAQ,EAAE,GAAG,EAAE,EAAE,OAAO,EAAE,mCAAmC,EAAE,EAAE,OAAO,CAAC,CAAC;YACnF,OAAO;QACT,CAAC;QAED,IAAI,CAAC;YACH,MAAM,OAAO,GAAG,MAAM,eAAe,CAAC,OAAO,CAAC,CAAC;YAC/C,MAAM,UAAU,GAAY,IAAI,CAAC,KAAK,CAAC,OAAO,CAAC,CAAC;YAChD,MAAM,OAAO,GAAG,YAAY,CAAC,UAAU,CAAC,CAAC;YAEzC,IAAI,CAAC,OAAO,EAAE,CAAC;gBACb,QAAQ,CAAC,QAAQ,EAAE,GAAG,EAAE,EAAE,OAAO,EAAE,iCAAiC,EAAE,EAAE,OAAO,CAAC,CAAC;gBACjF,OAAO;YACT,CAAC;YAED,uEAAuE;YACvE,mEAAmE;YACnE,sEAAsE;YACtE,MAAM,aAAa,GAAI,UAAsC,CAAC,KAAK,CAAC;YACpE,IAAI,OAAO,aAAa,KAAK,QAAQ,IAAI,aAAa,CAAC,MAAM,KAAK,CAAC,EAAE,CAAC;gBACpE,QAAQ,CAAC,QAAQ,EAAE,GAAG,EAAE,EAAE,OAAO,EAAE,iCAAiC,eAAe,EAAE,EAAE,EAAE,OAAO,CAAC,CAAC;gBAClG,OAAO;YACT,CAAC;YAED,2EAA2E;YAC3E,wEAAwE;YACxE,6BAA6B;YAC7B,IAAI,CAAC,WAAW,CAAC,aAAa,EAAE,aAAa,CAAC,EAAE,CAAC;gBAC/C,QAAQ,CAAC,QAAQ,EAAE,GAAG,EAAE,EAAE,OAAO,EAAE,iDAAiD,EAAE,EAAE,OAAO,CAAC,CAAC;gBACjG,OAAO;YACT,CAAC;YAED,QAAQ,CAAC,QAAQ,EAAE,GAAG,EAAE,EAAE,OAAO,EAAE,IAAI,EAAE,EAAE,OAAO,CAAC,CAAC;YAEpD,UAAU,CAAC,GAAG,EAAE;gBACd,WAAW,CAAC,OAAO,CAAC,CAAC;YACvB,CAAC,EAAE,GAAG,CAAC,CAAC;QACV,CAAC;QAAC,MAAM,CAAC;YACP,QAAQ,CAAC,QAAQ,EAAE,GAAG,EAAE,EAAE,OAAO,EAAE,oBAAoB,EAAE,EAAE,OAAO,CAAC,CAAC;QACtE,CAAC;IACH,CAAC,CAAC,CAAC;IAEH,MAAM,IAAI,GAAG,MAAM,qBAAqB,CAAC,MAAM,CAAC,CAAC;IAEjD,MAAM,CAAC,EAAE,CAAC,OAAO,EAAE,CAAC,KAAY,EAAE,EAAE;QAClC,UAAU,CAAC,IAAI,KAAK,CAAC,iCAAiC,KAAK,CAAC,OAAO,EAAE,CAAC,CAAC,CAAC;IAC1E,CAAC,CAAC,CAAC;IAEH,MAAM,CAAC,IAAI,CAAC,OAAO,EAAE,GAAG,EAAE;QACxB,IAAI,CAAC,OAAO,IAAI,SAAS,EAAE,CAAC;YAC1B,UAAU,CAAC,IAAI,KAAK,CAAC,yDAAyD,CAAC,CAAC,CAAC;YACjF,OAAO;QACT,CAAC;QAED,IAAI,CAAC,OAAO,EAAE,CAAC;YACb,OAAO,GAAG,IAAI,CAAC;YACf,kBAAkB,EAAE,CAAC;QACvB,CAAC;IACH,CAAC,CAAC,CAAC;IAEH,MAAM,eAAe,GAAG,GAAe,EAAE;QACvC,IAAI,CAAC,SAAS,EAAE,CAAC;YACf,SAAS,GAAG,IAAI,CAAC;YACjB,aAAa,GAAG,UAAU,CAAC,GAAG,EAAE;gBAC9B,UAAU,CAAC,IAAI,KAAK,CAAC,4CAA4C,CAAC,CAAC,CAAC;YACtE,CAAC,EAAE,mBAAmB,CAAC,CAAC;QAC1B,CAAC;QAED,OAAO,eAAe,CAAC;IACzB,CAAC,CAAC;IAEF,OAAO;QACL,MAAM;QACN,eAAe;QACf,IAAI;QACJ,KAAK,EAAE,aAAa;KACrB,CAAC;AACJ,CAAC;AAED;;;;GAIG;AACH,MAAM,UAAU,oBAAoB,CAAC,OAAqC;IACxE,OAAO,mBAAmB,CAAa,CAAC,KAAK,EAAE,EAAE,CAAC,CAAC,YAAY,CAAC,KAAK,CAAC,CAAC,CAAC,CAAC,YAAY,CAAC,KAAK,CAAC,CAAC,CAAC,CAAC,IAAI,CAAC,EAAE,OAAO,CAAC,CAAC;AACjH,CAAC;AAED,uFAAuF;AACvF,MAAM,UAAU,4BAA4B,CAC1C,OAAqC;IAErC,OAAO,mBAAmB,CACxB,CAAC,KAAK,EAAE,EAAE,CAAC,CAAC,yBAAyB,CAAC,KAAK,CAAC,CAAC,CAAC,CAAC,EAAE,IAAI,EAAE,KAAK,CAAC,IAAI,EAAE,KAAK,EAAE,KAAK,CAAC,KAAK,EAAE,CAAC,CAAC,CAAC,IAAI,CAAC,EAC/F,OAAO,CACR,CAAC;AACJ,CAAC"}
|