@provos/ironcurtain 0.8.0 → 0.9.1
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 +11 -10
- package/dist/auth/auth-command.d.ts +15 -0
- package/dist/auth/auth-command.js +424 -0
- package/dist/auth/auth-command.js.map +1 -0
- package/dist/auth/oauth-flow.d.ts +46 -0
- package/dist/auth/oauth-flow.js +279 -0
- package/dist/auth/oauth-flow.js.map +1 -0
- package/dist/auth/oauth-provider.d.ts +55 -0
- package/dist/auth/oauth-provider.js +73 -0
- package/dist/auth/oauth-provider.js.map +1 -0
- package/dist/auth/oauth-registry.d.ts +34 -0
- package/dist/auth/oauth-registry.js +69 -0
- package/dist/auth/oauth-registry.js.map +1 -0
- package/dist/auth/oauth-token-provider.d.ts +52 -0
- package/dist/auth/oauth-token-provider.js +159 -0
- package/dist/auth/oauth-token-provider.js.map +1 -0
- package/dist/auth/oauth-token-store.d.ts +30 -0
- package/dist/auth/oauth-token-store.js +93 -0
- package/dist/auth/oauth-token-store.js.map +1 -0
- package/dist/auth/providers/google-scopes.d.ts +35 -0
- package/dist/auth/providers/google-scopes.js +183 -0
- package/dist/auth/providers/google-scopes.js.map +1 -0
- package/dist/auth/providers/google.d.ts +2 -0
- package/dist/auth/providers/google.js +28 -0
- package/dist/auth/providers/google.js.map +1 -0
- package/dist/cli.js +6 -0
- package/dist/cli.js.map +1 -1
- package/dist/config/config-command.js +39 -1
- package/dist/config/config-command.js.map +1 -1
- package/dist/config/constitution-readonly.md +14 -11
- package/dist/config/constitution-user-base.md +15 -0
- package/dist/config/generated/test-scenarios.json +1 -1
- package/dist/config/generated/tool-annotations.json +10617 -296
- package/dist/config/generated-readonly/compiled-policy.json +787 -244
- package/dist/config/index.d.ts +2 -2
- package/dist/config/index.js +8 -0
- package/dist/config/index.js.map +1 -1
- package/dist/config/mcp-servers.json +23 -0
- package/dist/config/paths.d.ts +15 -0
- package/dist/config/paths.js +35 -0
- package/dist/config/paths.js.map +1 -1
- package/dist/config/types.d.ts +8 -0
- package/dist/config/user-config.d.ts +2 -0
- package/dist/config/user-config.js +2 -0
- package/dist/config/user-config.js.map +1 -1
- package/dist/cron/headless-transport.d.ts +4 -0
- package/dist/cron/headless-transport.js +1 -1
- package/dist/cron/headless-transport.js.map +1 -1
- package/dist/daemon/ironcurtain-daemon.js +6 -1
- package/dist/daemon/ironcurtain-daemon.js.map +1 -1
- package/dist/docker/docker-agent-session.d.ts +3 -1
- package/dist/docker/docker-agent-session.js +49 -28
- package/dist/docker/docker-agent-session.js.map +1 -1
- package/dist/docker/docker-infrastructure.js +39 -11
- package/dist/docker/docker-infrastructure.js.map +1 -1
- package/dist/docker/docker-manager.d.ts +2 -0
- package/dist/docker/docker-manager.js +9 -1
- package/dist/docker/docker-manager.js.map +1 -1
- package/dist/docker/mitm-proxy.d.ts +50 -0
- package/dist/docker/mitm-proxy.js +220 -31
- package/dist/docker/mitm-proxy.js.map +1 -1
- package/dist/docker/oauth-credentials.d.ts +45 -6
- package/dist/docker/oauth-credentials.js +151 -24
- package/dist/docker/oauth-credentials.js.map +1 -1
- package/dist/docker/oauth-token-manager.d.ts +15 -16
- package/dist/docker/oauth-token-manager.js +23 -17
- package/dist/docker/oauth-token-manager.js.map +1 -1
- package/dist/docker/platform.d.ts +6 -6
- package/dist/docker/platform.js +8 -6
- package/dist/docker/platform.js.map +1 -1
- package/dist/docker/proxy-tools.d.ts +80 -0
- package/dist/docker/proxy-tools.js +248 -0
- package/dist/docker/proxy-tools.js.map +1 -0
- package/dist/docker/pty-session.js +48 -29
- package/dist/docker/pty-session.js.map +1 -1
- package/dist/docker/pty-types.d.ts +4 -0
- package/dist/docker/pty-types.js.map +1 -1
- package/dist/escalation/escalation-watcher.d.ts +3 -1
- package/dist/escalation/escalation-watcher.js +6 -2
- package/dist/escalation/escalation-watcher.js.map +1 -1
- package/dist/escalation/listener-command.js +24 -10
- package/dist/escalation/listener-command.js.map +1 -1
- package/dist/escalation/listener-lock.d.ts +5 -0
- package/dist/escalation/listener-lock.js +14 -0
- package/dist/escalation/listener-lock.js.map +1 -1
- package/dist/index.js +6 -1
- package/dist/index.js.map +1 -1
- package/dist/memory/auto-save.d.ts +25 -0
- package/dist/memory/auto-save.js +89 -0
- package/dist/memory/auto-save.js.map +1 -0
- package/dist/mux/mux-app.d.ts +4 -0
- package/dist/mux/mux-app.js +186 -21
- package/dist/mux/mux-app.js.map +1 -1
- package/dist/mux/mux-command.d.ts +2 -2
- package/dist/mux/mux-command.js +14 -22
- package/dist/mux/mux-command.js.map +1 -1
- package/dist/mux/mux-escalation-manager.d.ts +9 -3
- package/dist/mux/mux-escalation-manager.js +69 -19
- package/dist/mux/mux-escalation-manager.js.map +1 -1
- package/dist/mux/mux-input-handler.d.ts +33 -1
- package/dist/mux/mux-input-handler.js +112 -29
- package/dist/mux/mux-input-handler.js.map +1 -1
- package/dist/mux/mux-renderer.d.ts +17 -1
- package/dist/mux/mux-renderer.js +288 -7
- package/dist/mux/mux-renderer.js.map +1 -1
- package/dist/mux/pty-bridge.d.ts +4 -0
- package/dist/mux/pty-bridge.js +13 -1
- package/dist/mux/pty-bridge.js.map +1 -1
- package/dist/mux/types.d.ts +24 -1
- package/dist/mux/types.js +10 -1
- package/dist/mux/types.js.map +1 -1
- package/dist/persona/persona-command.js +0 -5
- package/dist/persona/persona-command.js.map +1 -1
- package/dist/pipeline/annotate.js +1 -7
- package/dist/pipeline/annotate.js.map +1 -1
- package/dist/pipeline/compile.d.ts +5 -2
- package/dist/pipeline/compile.js +23 -11
- package/dist/pipeline/compile.js.map +1 -1
- package/dist/pipeline/constitution-compiler.d.ts +302 -3
- package/dist/pipeline/constitution-compiler.js +285 -23
- package/dist/pipeline/constitution-compiler.js.map +1 -1
- package/dist/pipeline/generate-with-repair.d.ts +2 -2
- package/dist/pipeline/generate-with-repair.js +2 -2
- package/dist/pipeline/handwritten-scenarios.d.ts +20 -7
- package/dist/pipeline/handwritten-scenarios.js +20 -41
- package/dist/pipeline/handwritten-scenarios.js.map +1 -1
- package/dist/pipeline/list-resolver.d.ts +18 -20
- package/dist/pipeline/list-resolver.js +28 -36
- package/dist/pipeline/list-resolver.js.map +1 -1
- package/dist/pipeline/pipeline-runner.d.ts +102 -13
- package/dist/pipeline/pipeline-runner.js +497 -237
- package/dist/pipeline/pipeline-runner.js.map +1 -1
- package/dist/pipeline/pipeline-shared.d.ts +7 -9
- package/dist/pipeline/pipeline-shared.js +8 -18
- package/dist/pipeline/pipeline-shared.js.map +1 -1
- package/dist/pipeline/policy-verifier.d.ts +32 -5
- package/dist/pipeline/policy-verifier.js +137 -8
- package/dist/pipeline/policy-verifier.js.map +1 -1
- package/dist/pipeline/proxy-mcp-connections.d.ts +25 -0
- package/dist/pipeline/proxy-mcp-connections.js +121 -0
- package/dist/pipeline/proxy-mcp-connections.js.map +1 -0
- package/dist/pipeline/refresh-lists.js +21 -13
- package/dist/pipeline/refresh-lists.js.map +1 -1
- package/dist/pipeline/scenario-generator.d.ts +29 -49
- package/dist/pipeline/scenario-generator.js +180 -143
- package/dist/pipeline/scenario-generator.js.map +1 -1
- package/dist/pipeline/scenario-schema-validator.d.ts +51 -0
- package/dist/pipeline/scenario-schema-validator.js +132 -0
- package/dist/pipeline/scenario-schema-validator.js.map +1 -0
- package/dist/pipeline/tool-annotator.d.ts +9 -8
- package/dist/pipeline/tool-annotator.js +48 -95
- package/dist/pipeline/tool-annotator.js.map +1 -1
- package/dist/pipeline/types.d.ts +31 -24
- package/dist/sandbox/index.js +20 -0
- package/dist/sandbox/index.js.map +1 -1
- package/dist/servers/fetch-server.js +10 -5
- package/dist/servers/fetch-server.js.map +1 -1
- package/dist/session/agent-session.d.ts +6 -19
- package/dist/session/agent-session.js +18 -69
- package/dist/session/agent-session.js.map +1 -1
- package/dist/session/base-transport.d.ts +17 -1
- package/dist/session/base-transport.js +25 -1
- package/dist/session/base-transport.js.map +1 -1
- package/dist/session/cli-transport.d.ts +5 -0
- package/dist/session/cli-transport.js +48 -25
- package/dist/session/cli-transport.js.map +1 -1
- package/dist/session/preflight.js +15 -16
- package/dist/session/preflight.js.map +1 -1
- package/dist/session/prompts.js +0 -1
- package/dist/session/prompts.js.map +1 -1
- package/dist/session/session-manager.d.ts +6 -0
- package/dist/session/session-manager.js +12 -0
- package/dist/session/session-manager.js.map +1 -1
- package/dist/session/types.d.ts +6 -1
- package/dist/session/types.js.map +1 -1
- package/dist/signal/signal-bot-daemon.js +24 -8
- package/dist/signal/signal-bot-daemon.js.map +1 -1
- package/dist/signal/signal-transport.d.ts +5 -2
- package/dist/signal/signal-transport.js +3 -3
- package/dist/signal/signal-transport.js.map +1 -1
- package/dist/trusted-process/approval-whitelist.d.ts +117 -0
- package/dist/trusted-process/approval-whitelist.js +237 -0
- package/dist/trusted-process/approval-whitelist.js.map +1 -0
- package/dist/trusted-process/gworkspace-credentials.d.ts +40 -0
- package/dist/trusted-process/gworkspace-credentials.js +45 -0
- package/dist/trusted-process/gworkspace-credentials.js.map +1 -0
- package/dist/trusted-process/index.d.ts +11 -1
- package/dist/trusted-process/index.js +63 -27
- package/dist/trusted-process/index.js.map +1 -1
- package/dist/trusted-process/mcp-proxy-server.d.ts +14 -0
- package/dist/trusted-process/mcp-proxy-server.js +325 -64
- package/dist/trusted-process/mcp-proxy-server.js.map +1 -1
- package/dist/trusted-process/policy-engine.d.ts +8 -2
- package/dist/trusted-process/policy-engine.js +18 -22
- package/dist/trusted-process/policy-engine.js.map +1 -1
- package/dist/trusted-process/policy-types.d.ts +17 -0
- package/dist/trusted-process/sandbox-integration.d.ts +23 -0
- package/dist/trusted-process/sandbox-integration.js +115 -3
- package/dist/trusted-process/sandbox-integration.js.map +1 -1
- package/dist/trusted-process/token-file-refresher.d.ts +69 -0
- package/dist/trusted-process/token-file-refresher.js +120 -0
- package/dist/trusted-process/token-file-refresher.js.map +1 -0
- package/dist/types/argument-roles.d.ts +7 -1
- package/dist/types/argument-roles.js +50 -0
- package/dist/types/argument-roles.js.map +1 -1
- package/dist/types/audit.d.ts +11 -0
- package/docker/Dockerfile.claude-code +2 -2
- package/docker/entrypoint-claude-code.sh +15 -5
- package/package.json +3 -2
- package/src/config/constitution-user-base.md +15 -0
- package/src/config/generated/test-scenarios.json +1 -1
- package/src/config/generated/tool-annotations.json +10617 -296
- package/src/config/mcp-servers.json +23 -0
- package/dist/pipeline/mcp-connections.d.ts +0 -16
- package/dist/pipeline/mcp-connections.js +0 -61
- package/dist/pipeline/mcp-connections.js.map +0 -1
|
@@ -0,0 +1,159 @@
|
|
|
1
|
+
/**
|
|
2
|
+
* Runtime OAuth token provider with transparent refresh.
|
|
3
|
+
*
|
|
4
|
+
* Provides valid access tokens for a specific OAuth provider, handling
|
|
5
|
+
* token expiry detection and refresh with deduplication. Follows the
|
|
6
|
+
* re-read-before-refresh pattern from OAuthTokenManager to coordinate
|
|
7
|
+
* with other processes that may refresh concurrently.
|
|
8
|
+
*/
|
|
9
|
+
import { existsSync } from 'node:fs';
|
|
10
|
+
import { getOAuthTokenPath } from '../config/paths.js';
|
|
11
|
+
import { fetchWithTimeout, safeResponseJson } from './oauth-flow.js';
|
|
12
|
+
import { loadOAuthToken, saveOAuthToken, isTokenExpired } from './oauth-token-store.js';
|
|
13
|
+
// ---------------------------------------------------------------------------
|
|
14
|
+
// Error
|
|
15
|
+
// ---------------------------------------------------------------------------
|
|
16
|
+
export class OAuthTokenExpiredError extends Error {
|
|
17
|
+
providerId;
|
|
18
|
+
constructor(providerId, message, options) {
|
|
19
|
+
super(message ??
|
|
20
|
+
`OAuth token for "${providerId}" has expired and could not be refreshed. Run 'ironcurtain auth ${providerId}' to re-authorize.`, options);
|
|
21
|
+
this.providerId = providerId;
|
|
22
|
+
this.name = 'OAuthTokenExpiredError';
|
|
23
|
+
}
|
|
24
|
+
}
|
|
25
|
+
/**
|
|
26
|
+
* Exchanges a refresh token for a new access token.
|
|
27
|
+
* Returns the updated StoredOAuthToken, preserving the original refresh token
|
|
28
|
+
* if the provider does not issue a new one.
|
|
29
|
+
*/
|
|
30
|
+
async function refreshAccessToken(provider, clientCredentials, currentToken) {
|
|
31
|
+
const body = new URLSearchParams({
|
|
32
|
+
grant_type: 'refresh_token',
|
|
33
|
+
client_id: clientCredentials.clientId,
|
|
34
|
+
client_secret: clientCredentials.clientSecret,
|
|
35
|
+
refresh_token: currentToken.refreshToken,
|
|
36
|
+
});
|
|
37
|
+
const REFRESH_TIMEOUT_MS = 30_000;
|
|
38
|
+
let response;
|
|
39
|
+
try {
|
|
40
|
+
response = await fetchWithTimeout(provider.tokenUrl, {
|
|
41
|
+
method: 'POST',
|
|
42
|
+
headers: { 'Content-Type': 'application/x-www-form-urlencoded' },
|
|
43
|
+
body: body.toString(),
|
|
44
|
+
}, REFRESH_TIMEOUT_MS);
|
|
45
|
+
}
|
|
46
|
+
catch (err) {
|
|
47
|
+
if (err instanceof Error && err.name === 'TimeoutError') {
|
|
48
|
+
throw new OAuthTokenExpiredError(provider.id, `Token refresh timed out for "${provider.id}". Run 'ironcurtain auth ${provider.id}' to re-authorize.`, { cause: err });
|
|
49
|
+
}
|
|
50
|
+
throw err;
|
|
51
|
+
}
|
|
52
|
+
if (!response.ok) {
|
|
53
|
+
const text = await response.text();
|
|
54
|
+
throw new OAuthTokenExpiredError(provider.id, `Token refresh failed for "${provider.id}" (${response.status}): ${text}. Run 'ironcurtain auth ${provider.id}' to re-authorize.`);
|
|
55
|
+
}
|
|
56
|
+
let data;
|
|
57
|
+
try {
|
|
58
|
+
data = (await safeResponseJson(response));
|
|
59
|
+
}
|
|
60
|
+
catch (err) {
|
|
61
|
+
throw new OAuthTokenExpiredError(provider.id, `Token refresh returned non-JSON response for "${provider.id}". Run 'ironcurtain auth ${provider.id}' to re-authorize.`, { cause: err });
|
|
62
|
+
}
|
|
63
|
+
if (!data.access_token) {
|
|
64
|
+
throw new OAuthTokenExpiredError(provider.id, `Token refresh response missing access_token for "${provider.id}". Run 'ironcurtain auth ${provider.id}' to re-authorize.`);
|
|
65
|
+
}
|
|
66
|
+
if (!data.expires_in || data.expires_in <= 0) {
|
|
67
|
+
throw new OAuthTokenExpiredError(provider.id, `Token refresh response missing expires_in for "${provider.id}". Run 'ironcurtain auth ${provider.id}' to re-authorize.`);
|
|
68
|
+
}
|
|
69
|
+
const expiresAt = Date.now() + data.expires_in * 1000;
|
|
70
|
+
return {
|
|
71
|
+
accessToken: data.access_token,
|
|
72
|
+
refreshToken: data.refresh_token ?? currentToken.refreshToken,
|
|
73
|
+
expiresAt,
|
|
74
|
+
scopes: data.scope ? data.scope.split(' ') : [...currentToken.scopes],
|
|
75
|
+
};
|
|
76
|
+
}
|
|
77
|
+
// ---------------------------------------------------------------------------
|
|
78
|
+
// OAuthTokenProvider
|
|
79
|
+
// ---------------------------------------------------------------------------
|
|
80
|
+
/**
|
|
81
|
+
* Provides valid access tokens for a specific OAuth provider at runtime.
|
|
82
|
+
* Handles transparent refresh with deduplication (single in-flight refresh).
|
|
83
|
+
*/
|
|
84
|
+
export class OAuthTokenProvider {
|
|
85
|
+
provider;
|
|
86
|
+
clientCredentials;
|
|
87
|
+
inflightRefresh = null;
|
|
88
|
+
constructor(provider, clientCredentials) {
|
|
89
|
+
this.provider = provider;
|
|
90
|
+
this.clientCredentials = clientCredentials;
|
|
91
|
+
}
|
|
92
|
+
/**
|
|
93
|
+
* Returns a valid access token, refreshing if near expiry.
|
|
94
|
+
* Uses the re-read-before-refresh pattern: checks if another process
|
|
95
|
+
* already refreshed the token before attempting our own refresh.
|
|
96
|
+
*/
|
|
97
|
+
async getValidAccessToken() {
|
|
98
|
+
const token = loadOAuthToken(this.provider.id);
|
|
99
|
+
if (!token) {
|
|
100
|
+
throw new OAuthTokenExpiredError(this.provider.id, `No stored token for "${this.provider.id}". Run 'ironcurtain auth ${this.provider.id}' to authorize.`);
|
|
101
|
+
}
|
|
102
|
+
if (!isTokenExpired(token)) {
|
|
103
|
+
return token.accessToken;
|
|
104
|
+
}
|
|
105
|
+
return this.doRefresh();
|
|
106
|
+
}
|
|
107
|
+
/**
|
|
108
|
+
* Forces a token refresh regardless of current expiry.
|
|
109
|
+
* Used by the TokenFileRefresher which has a more aggressive threshold
|
|
110
|
+
* (10 min) than the normal getValidAccessToken (5 min).
|
|
111
|
+
*/
|
|
112
|
+
async forceRefresh() {
|
|
113
|
+
return this.doRefresh(true);
|
|
114
|
+
}
|
|
115
|
+
/** Returns true if a token file exists for this provider. */
|
|
116
|
+
isAuthorized() {
|
|
117
|
+
return existsSync(getOAuthTokenPath(this.provider.id));
|
|
118
|
+
}
|
|
119
|
+
/** Returns the scopes granted during the last authorization flow. */
|
|
120
|
+
getGrantedScopes() {
|
|
121
|
+
const token = loadOAuthToken(this.provider.id);
|
|
122
|
+
return token?.scopes ?? [];
|
|
123
|
+
}
|
|
124
|
+
/**
|
|
125
|
+
* Core refresh with deduplication. Concurrent callers share a single
|
|
126
|
+
* in-flight refresh promise.
|
|
127
|
+
*/
|
|
128
|
+
doRefresh(force = false) {
|
|
129
|
+
if (this.inflightRefresh) {
|
|
130
|
+
return this.inflightRefresh;
|
|
131
|
+
}
|
|
132
|
+
this.inflightRefresh = this.executeRefresh(force).finally(() => {
|
|
133
|
+
this.inflightRefresh = null;
|
|
134
|
+
});
|
|
135
|
+
return this.inflightRefresh;
|
|
136
|
+
}
|
|
137
|
+
/**
|
|
138
|
+
* Re-read-before-refresh pattern: another process may have already
|
|
139
|
+
* refreshed the token since our initial check.
|
|
140
|
+
*
|
|
141
|
+
* When force=true, skips the early return so the token is always
|
|
142
|
+
* refreshed via the provider's token endpoint.
|
|
143
|
+
*/
|
|
144
|
+
async executeRefresh(force = false) {
|
|
145
|
+
// Re-read from disk -- another process may have refreshed already
|
|
146
|
+
const reread = loadOAuthToken(this.provider.id);
|
|
147
|
+
if (!force && reread && !isTokenExpired(reread)) {
|
|
148
|
+
return reread.accessToken;
|
|
149
|
+
}
|
|
150
|
+
// The re-read returned an expired token (or null if the file was deleted)
|
|
151
|
+
if (!reread) {
|
|
152
|
+
throw new OAuthTokenExpiredError(this.provider.id);
|
|
153
|
+
}
|
|
154
|
+
const refreshed = await refreshAccessToken(this.provider, this.clientCredentials, reread);
|
|
155
|
+
saveOAuthToken(this.provider.id, refreshed);
|
|
156
|
+
return refreshed.accessToken;
|
|
157
|
+
}
|
|
158
|
+
}
|
|
159
|
+
//# sourceMappingURL=oauth-token-provider.js.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"oauth-token-provider.js","sourceRoot":"","sources":["../../src/auth/oauth-token-provider.ts"],"names":[],"mappings":"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"}
|
|
@@ -0,0 +1,30 @@
|
|
|
1
|
+
/**
|
|
2
|
+
* OAuth token persistence for third-party providers.
|
|
3
|
+
*
|
|
4
|
+
* Stores tokens as JSON files in ~/.ironcurtain/oauth/{providerId}.json
|
|
5
|
+
* with owner-only (0o600) permissions, following the same pattern as
|
|
6
|
+
* saveOAuthCredentials in src/docker/oauth-credentials.ts.
|
|
7
|
+
*/
|
|
8
|
+
import type { StoredOAuthToken } from './oauth-provider.js';
|
|
9
|
+
/**
|
|
10
|
+
* Loads a stored OAuth token for a provider.
|
|
11
|
+
* Returns null if no token file exists.
|
|
12
|
+
* Throws if the file exists but contains invalid JSON or is missing required fields.
|
|
13
|
+
*/
|
|
14
|
+
export declare function loadOAuthToken(providerId: string): StoredOAuthToken | null;
|
|
15
|
+
/**
|
|
16
|
+
* Saves an OAuth token for a provider.
|
|
17
|
+
* Creates the oauth directory if it does not exist.
|
|
18
|
+
* Sets file permissions to 0o600 (owner-only read/write).
|
|
19
|
+
*/
|
|
20
|
+
export declare function saveOAuthToken(providerId: string, token: StoredOAuthToken): void;
|
|
21
|
+
/**
|
|
22
|
+
* Deletes a stored OAuth token for a provider.
|
|
23
|
+
* No-op if the file does not exist.
|
|
24
|
+
*/
|
|
25
|
+
export declare function deleteOAuthToken(providerId: string): void;
|
|
26
|
+
/**
|
|
27
|
+
* Checks whether a stored token is expired or near expiry.
|
|
28
|
+
* Returns true if fewer than 5 minutes of validity remain.
|
|
29
|
+
*/
|
|
30
|
+
export declare function isTokenExpired(token: StoredOAuthToken): boolean;
|
|
@@ -0,0 +1,93 @@
|
|
|
1
|
+
/**
|
|
2
|
+
* OAuth token persistence for third-party providers.
|
|
3
|
+
*
|
|
4
|
+
* Stores tokens as JSON files in ~/.ironcurtain/oauth/{providerId}.json
|
|
5
|
+
* with owner-only (0o600) permissions, following the same pattern as
|
|
6
|
+
* saveOAuthCredentials in src/docker/oauth-credentials.ts.
|
|
7
|
+
*/
|
|
8
|
+
import { chmodSync, existsSync, mkdirSync, readFileSync, unlinkSync, writeFileSync } from 'node:fs';
|
|
9
|
+
import { getOAuthDir, getOAuthTokenPath } from '../config/paths.js';
|
|
10
|
+
/** 5-minute buffer before expiry, matching OAuthTokenManager convention. */
|
|
11
|
+
const TOKEN_EXPIRY_BUFFER_MS = 5 * 60 * 1000;
|
|
12
|
+
/**
|
|
13
|
+
* Loads a stored OAuth token for a provider.
|
|
14
|
+
* Returns null if no token file exists.
|
|
15
|
+
* Throws if the file exists but contains invalid JSON or is missing required fields.
|
|
16
|
+
*/
|
|
17
|
+
export function loadOAuthToken(providerId) {
|
|
18
|
+
const tokenPath = getOAuthTokenPath(providerId);
|
|
19
|
+
if (!existsSync(tokenPath)) {
|
|
20
|
+
return null;
|
|
21
|
+
}
|
|
22
|
+
const raw = readFileSync(tokenPath, 'utf-8');
|
|
23
|
+
const parsed = parseTokenJson(raw, tokenPath);
|
|
24
|
+
return validateTokenShape(parsed, tokenPath);
|
|
25
|
+
}
|
|
26
|
+
/**
|
|
27
|
+
* Saves an OAuth token for a provider.
|
|
28
|
+
* Creates the oauth directory if it does not exist.
|
|
29
|
+
* Sets file permissions to 0o600 (owner-only read/write).
|
|
30
|
+
*/
|
|
31
|
+
export function saveOAuthToken(providerId, token) {
|
|
32
|
+
const dir = getOAuthDir();
|
|
33
|
+
mkdirSync(dir, { recursive: true });
|
|
34
|
+
const tokenPath = getOAuthTokenPath(providerId);
|
|
35
|
+
writeFileSync(tokenPath, JSON.stringify(token, null, 2) + '\n', { mode: 0o600 });
|
|
36
|
+
// chmod after write -- writeFileSync's mode only applies when creating new files;
|
|
37
|
+
// existing files with broader permissions need an explicit chmod.
|
|
38
|
+
chmodSync(tokenPath, 0o600);
|
|
39
|
+
}
|
|
40
|
+
/**
|
|
41
|
+
* Deletes a stored OAuth token for a provider.
|
|
42
|
+
* No-op if the file does not exist.
|
|
43
|
+
*/
|
|
44
|
+
export function deleteOAuthToken(providerId) {
|
|
45
|
+
const tokenPath = getOAuthTokenPath(providerId);
|
|
46
|
+
if (existsSync(tokenPath)) {
|
|
47
|
+
unlinkSync(tokenPath);
|
|
48
|
+
}
|
|
49
|
+
}
|
|
50
|
+
/**
|
|
51
|
+
* Checks whether a stored token is expired or near expiry.
|
|
52
|
+
* Returns true if fewer than 5 minutes of validity remain.
|
|
53
|
+
*/
|
|
54
|
+
export function isTokenExpired(token) {
|
|
55
|
+
return Date.now() + TOKEN_EXPIRY_BUFFER_MS >= token.expiresAt;
|
|
56
|
+
}
|
|
57
|
+
// ---------------------------------------------------------------------------
|
|
58
|
+
// Internal helpers
|
|
59
|
+
// ---------------------------------------------------------------------------
|
|
60
|
+
function parseTokenJson(raw, filePath) {
|
|
61
|
+
try {
|
|
62
|
+
return JSON.parse(raw);
|
|
63
|
+
}
|
|
64
|
+
catch (err) {
|
|
65
|
+
const message = err instanceof Error ? err.message : String(err);
|
|
66
|
+
throw new Error(`Invalid JSON in ${filePath}: ${message}`, { cause: err });
|
|
67
|
+
}
|
|
68
|
+
}
|
|
69
|
+
function validateTokenShape(parsed, filePath) {
|
|
70
|
+
if (typeof parsed !== 'object' || parsed === null || Array.isArray(parsed)) {
|
|
71
|
+
throw new Error(`Invalid token format in ${filePath}: expected a JSON object`);
|
|
72
|
+
}
|
|
73
|
+
const obj = parsed;
|
|
74
|
+
if (typeof obj.accessToken !== 'string' || obj.accessToken.length === 0) {
|
|
75
|
+
throw new Error(`Missing or empty accessToken in ${filePath}`);
|
|
76
|
+
}
|
|
77
|
+
if (typeof obj.refreshToken !== 'string' || obj.refreshToken.length === 0) {
|
|
78
|
+
throw new Error(`Missing or empty refreshToken in ${filePath}`);
|
|
79
|
+
}
|
|
80
|
+
if (typeof obj.expiresAt !== 'number' || !Number.isFinite(obj.expiresAt)) {
|
|
81
|
+
throw new Error(`Missing or invalid expiresAt in ${filePath}`);
|
|
82
|
+
}
|
|
83
|
+
if (!Array.isArray(obj.scopes) || !obj.scopes.every((s) => typeof s === 'string')) {
|
|
84
|
+
throw new Error(`Missing or invalid scopes in ${filePath}`);
|
|
85
|
+
}
|
|
86
|
+
return {
|
|
87
|
+
accessToken: obj.accessToken,
|
|
88
|
+
refreshToken: obj.refreshToken,
|
|
89
|
+
expiresAt: obj.expiresAt,
|
|
90
|
+
scopes: obj.scopes,
|
|
91
|
+
};
|
|
92
|
+
}
|
|
93
|
+
//# sourceMappingURL=oauth-token-store.js.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"oauth-token-store.js","sourceRoot":"","sources":["../../src/auth/oauth-token-store.ts"],"names":[],"mappings":"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"}
|
|
@@ -0,0 +1,35 @@
|
|
|
1
|
+
/**
|
|
2
|
+
* Google OAuth scope definitions and interactive scope picker.
|
|
3
|
+
*
|
|
4
|
+
* Provides a registry of Google Workspace scopes grouped by service,
|
|
5
|
+
* a `groupMultiselect` picker for interactive authorization, and a
|
|
6
|
+
* short-name resolver for the `--scopes` CLI flag.
|
|
7
|
+
*/
|
|
8
|
+
export interface GoogleScopeEntry {
|
|
9
|
+
/** Short name used in --scopes flag (e.g. "gmail.send") */
|
|
10
|
+
readonly shortName: string;
|
|
11
|
+
/** Full OAuth scope URL */
|
|
12
|
+
readonly fullScope: string;
|
|
13
|
+
/** Human-readable label for the picker */
|
|
14
|
+
readonly label: string;
|
|
15
|
+
/** Display group name (e.g. "Gmail") */
|
|
16
|
+
readonly group: string;
|
|
17
|
+
/** Access level hint shown in the picker (e.g. "read-only") */
|
|
18
|
+
readonly access: string;
|
|
19
|
+
/** Whether this scope is selected by default */
|
|
20
|
+
readonly isDefault: boolean;
|
|
21
|
+
}
|
|
22
|
+
export declare const GOOGLE_SCOPES: readonly GoogleScopeEntry[];
|
|
23
|
+
/**
|
|
24
|
+
* Shows a grouped multi-select checkbox UI for Google OAuth scopes.
|
|
25
|
+
*
|
|
26
|
+
* Pre-selects `existingScopes` if non-empty, otherwise falls back to defaults.
|
|
27
|
+
* Returns the selected full scope URLs, or the cancel symbol if the user aborts.
|
|
28
|
+
*/
|
|
29
|
+
export declare function promptGoogleScopes(existingScopes: readonly string[]): Promise<readonly string[] | symbol>;
|
|
30
|
+
/**
|
|
31
|
+
* Maps short scope names (e.g. "gmail.send") to full OAuth URLs.
|
|
32
|
+
* Passes through values that are already full URLs unchanged.
|
|
33
|
+
* Throws on unrecognized short names.
|
|
34
|
+
*/
|
|
35
|
+
export declare function resolveGoogleShortScopes(shortNames: readonly string[]): readonly string[];
|
|
@@ -0,0 +1,183 @@
|
|
|
1
|
+
/**
|
|
2
|
+
* Google OAuth scope definitions and interactive scope picker.
|
|
3
|
+
*
|
|
4
|
+
* Provides a registry of Google Workspace scopes grouped by service,
|
|
5
|
+
* a `groupMultiselect` picker for interactive authorization, and a
|
|
6
|
+
* short-name resolver for the `--scopes` CLI flag.
|
|
7
|
+
*/
|
|
8
|
+
import { groupMultiselect, isCancel } from '@clack/prompts';
|
|
9
|
+
const SCOPE_BASE = 'https://www.googleapis.com/auth';
|
|
10
|
+
export const GOOGLE_SCOPES = [
|
|
11
|
+
// Gmail
|
|
12
|
+
{
|
|
13
|
+
shortName: 'gmail.readonly',
|
|
14
|
+
fullScope: `${SCOPE_BASE}/gmail.readonly`,
|
|
15
|
+
label: 'Gmail (read)',
|
|
16
|
+
group: 'Gmail',
|
|
17
|
+
access: 'read-only',
|
|
18
|
+
isDefault: true,
|
|
19
|
+
},
|
|
20
|
+
{
|
|
21
|
+
shortName: 'gmail.send',
|
|
22
|
+
fullScope: `${SCOPE_BASE}/gmail.send`,
|
|
23
|
+
label: 'Gmail (send)',
|
|
24
|
+
group: 'Gmail',
|
|
25
|
+
access: 'write -- send emails',
|
|
26
|
+
isDefault: false,
|
|
27
|
+
},
|
|
28
|
+
{
|
|
29
|
+
shortName: 'gmail.modify',
|
|
30
|
+
fullScope: `${SCOPE_BASE}/gmail.modify`,
|
|
31
|
+
label: 'Gmail (modify)',
|
|
32
|
+
group: 'Gmail',
|
|
33
|
+
access: 'write -- read, send, delete, manage labels',
|
|
34
|
+
isDefault: false,
|
|
35
|
+
},
|
|
36
|
+
{
|
|
37
|
+
shortName: 'gmail.compose',
|
|
38
|
+
fullScope: `${SCOPE_BASE}/gmail.compose`,
|
|
39
|
+
label: 'Gmail (compose)',
|
|
40
|
+
group: 'Gmail',
|
|
41
|
+
access: 'write -- create & modify drafts',
|
|
42
|
+
isDefault: false,
|
|
43
|
+
},
|
|
44
|
+
{
|
|
45
|
+
shortName: 'gmail.labels',
|
|
46
|
+
fullScope: `${SCOPE_BASE}/gmail.labels`,
|
|
47
|
+
label: 'Gmail (labels)',
|
|
48
|
+
group: 'Gmail',
|
|
49
|
+
access: 'write -- create, update & delete labels',
|
|
50
|
+
isDefault: false,
|
|
51
|
+
},
|
|
52
|
+
// Calendar
|
|
53
|
+
{
|
|
54
|
+
shortName: 'calendar.readonly',
|
|
55
|
+
fullScope: `${SCOPE_BASE}/calendar.readonly`,
|
|
56
|
+
label: 'Calendar (read)',
|
|
57
|
+
group: 'Google Calendar',
|
|
58
|
+
access: 'read-only',
|
|
59
|
+
isDefault: true,
|
|
60
|
+
},
|
|
61
|
+
{
|
|
62
|
+
shortName: 'calendar.events',
|
|
63
|
+
fullScope: `${SCOPE_BASE}/calendar.events`,
|
|
64
|
+
label: 'Calendar (events)',
|
|
65
|
+
group: 'Google Calendar',
|
|
66
|
+
access: 'write -- create & modify events',
|
|
67
|
+
isDefault: false,
|
|
68
|
+
},
|
|
69
|
+
// Drive
|
|
70
|
+
{
|
|
71
|
+
shortName: 'drive.readonly',
|
|
72
|
+
fullScope: `${SCOPE_BASE}/drive.readonly`,
|
|
73
|
+
label: 'Drive (read)',
|
|
74
|
+
group: 'Google Drive',
|
|
75
|
+
access: 'read-only',
|
|
76
|
+
isDefault: true,
|
|
77
|
+
},
|
|
78
|
+
{
|
|
79
|
+
shortName: 'drive.file',
|
|
80
|
+
fullScope: `${SCOPE_BASE}/drive.file`,
|
|
81
|
+
label: 'Drive (per-file)',
|
|
82
|
+
group: 'Google Drive',
|
|
83
|
+
access: 'write -- files created or opened by the app',
|
|
84
|
+
isDefault: false,
|
|
85
|
+
},
|
|
86
|
+
// Docs
|
|
87
|
+
{
|
|
88
|
+
shortName: 'documents',
|
|
89
|
+
fullScope: `${SCOPE_BASE}/documents`,
|
|
90
|
+
label: 'Docs (read/write)',
|
|
91
|
+
group: 'Google Docs',
|
|
92
|
+
access: 'write -- read & edit documents',
|
|
93
|
+
isDefault: false,
|
|
94
|
+
},
|
|
95
|
+
// Sheets
|
|
96
|
+
{
|
|
97
|
+
shortName: 'spreadsheets',
|
|
98
|
+
fullScope: `${SCOPE_BASE}/spreadsheets`,
|
|
99
|
+
label: 'Sheets (read/write)',
|
|
100
|
+
group: 'Google Sheets',
|
|
101
|
+
access: 'write -- read & edit spreadsheets',
|
|
102
|
+
isDefault: false,
|
|
103
|
+
},
|
|
104
|
+
// Slides
|
|
105
|
+
{
|
|
106
|
+
shortName: 'presentations',
|
|
107
|
+
fullScope: `${SCOPE_BASE}/presentations`,
|
|
108
|
+
label: 'Slides (read/write)',
|
|
109
|
+
group: 'Google Slides',
|
|
110
|
+
access: 'write -- read & edit presentations',
|
|
111
|
+
isDefault: false,
|
|
112
|
+
},
|
|
113
|
+
];
|
|
114
|
+
// ---------------------------------------------------------------------------
|
|
115
|
+
// Lookup indices (built once)
|
|
116
|
+
// ---------------------------------------------------------------------------
|
|
117
|
+
const shortNameToScope = new Map(GOOGLE_SCOPES.map((s) => [s.shortName, s.fullScope]));
|
|
118
|
+
const fullScopeToEntry = new Map(GOOGLE_SCOPES.map((s) => [s.fullScope, s]));
|
|
119
|
+
// ---------------------------------------------------------------------------
|
|
120
|
+
// Interactive scope picker
|
|
121
|
+
// ---------------------------------------------------------------------------
|
|
122
|
+
/**
|
|
123
|
+
* Shows a grouped multi-select checkbox UI for Google OAuth scopes.
|
|
124
|
+
*
|
|
125
|
+
* Pre-selects `existingScopes` if non-empty, otherwise falls back to defaults.
|
|
126
|
+
* Returns the selected full scope URLs, or the cancel symbol if the user aborts.
|
|
127
|
+
*/
|
|
128
|
+
export async function promptGoogleScopes(existingScopes) {
|
|
129
|
+
const initialValues = existingScopes.length > 0
|
|
130
|
+
? existingScopes.filter((s) => fullScopeToEntry.has(s))
|
|
131
|
+
: GOOGLE_SCOPES.filter((s) => s.isDefault).map((s) => s.fullScope);
|
|
132
|
+
const groups = buildGroupOptions();
|
|
133
|
+
const result = await groupMultiselect({
|
|
134
|
+
message: 'Select Google Workspace scopes to authorize:',
|
|
135
|
+
options: groups,
|
|
136
|
+
initialValues,
|
|
137
|
+
});
|
|
138
|
+
if (isCancel(result)) {
|
|
139
|
+
return result;
|
|
140
|
+
}
|
|
141
|
+
return result;
|
|
142
|
+
}
|
|
143
|
+
/**
|
|
144
|
+
* Builds the `Record<string, Option[]>` structure expected by `groupMultiselect`.
|
|
145
|
+
*/
|
|
146
|
+
function buildGroupOptions() {
|
|
147
|
+
const groups = new Map();
|
|
148
|
+
for (const entry of GOOGLE_SCOPES) {
|
|
149
|
+
let group = groups.get(entry.group);
|
|
150
|
+
if (!group) {
|
|
151
|
+
group = [];
|
|
152
|
+
groups.set(entry.group, group);
|
|
153
|
+
}
|
|
154
|
+
group.push({
|
|
155
|
+
value: entry.fullScope,
|
|
156
|
+
label: entry.label,
|
|
157
|
+
hint: entry.access,
|
|
158
|
+
});
|
|
159
|
+
}
|
|
160
|
+
return Object.fromEntries(groups);
|
|
161
|
+
}
|
|
162
|
+
// ---------------------------------------------------------------------------
|
|
163
|
+
// Short-name resolver (for --scopes flag)
|
|
164
|
+
// ---------------------------------------------------------------------------
|
|
165
|
+
/**
|
|
166
|
+
* Maps short scope names (e.g. "gmail.send") to full OAuth URLs.
|
|
167
|
+
* Passes through values that are already full URLs unchanged.
|
|
168
|
+
* Throws on unrecognized short names.
|
|
169
|
+
*/
|
|
170
|
+
export function resolveGoogleShortScopes(shortNames) {
|
|
171
|
+
return shortNames.map((name) => {
|
|
172
|
+
if (name.startsWith('https://')) {
|
|
173
|
+
return name;
|
|
174
|
+
}
|
|
175
|
+
const full = shortNameToScope.get(name);
|
|
176
|
+
if (!full) {
|
|
177
|
+
const known = GOOGLE_SCOPES.map((s) => s.shortName).join(', ');
|
|
178
|
+
throw new Error(`Unknown Google scope "${name}". Known scopes: ${known}`);
|
|
179
|
+
}
|
|
180
|
+
return full;
|
|
181
|
+
});
|
|
182
|
+
}
|
|
183
|
+
//# sourceMappingURL=google-scopes.js.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"google-scopes.js","sourceRoot":"","sources":["../../../src/auth/providers/google-scopes.ts"],"names":[],"mappings":"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"}
|
|
@@ -0,0 +1,28 @@
|
|
|
1
|
+
import { promptGoogleScopes, resolveGoogleShortScopes } from './google-scopes.js';
|
|
2
|
+
export const googleOAuthProvider = {
|
|
3
|
+
id: 'google',
|
|
4
|
+
displayName: 'Google Workspace',
|
|
5
|
+
authorizationUrl: 'https://accounts.google.com/o/oauth2/v2/auth',
|
|
6
|
+
tokenUrl: 'https://oauth2.googleapis.com/token',
|
|
7
|
+
defaultScopes: [
|
|
8
|
+
'https://www.googleapis.com/auth/gmail.readonly',
|
|
9
|
+
'https://www.googleapis.com/auth/calendar.readonly',
|
|
10
|
+
'https://www.googleapis.com/auth/drive.readonly',
|
|
11
|
+
],
|
|
12
|
+
callbackPath: '/callback',
|
|
13
|
+
usePkce: true,
|
|
14
|
+
serverNames: ['google-workspace'],
|
|
15
|
+
tokenEnvVar: 'GOOGLE_ACCESS_TOKEN',
|
|
16
|
+
refreshTokenEnvVar: 'GOOGLE_REFRESH_TOKEN',
|
|
17
|
+
clientIdEnvVar: 'GOOGLE_CLIENT_ID',
|
|
18
|
+
clientSecretEnvVar: 'GOOGLE_CLIENT_SECRET',
|
|
19
|
+
credentialsFilename: 'google-credentials.json',
|
|
20
|
+
revocationUrl: 'https://oauth2.googleapis.com/revoke',
|
|
21
|
+
extraAuthParams: { access_type: 'offline', prompt: 'consent', include_granted_scopes: 'true' },
|
|
22
|
+
scopePicker: promptGoogleScopes,
|
|
23
|
+
resolveShortScopes: resolveGoogleShortScopes,
|
|
24
|
+
nonDefaultScopeWarning: 'Make sure these scopes are enabled in your Google Cloud\n' +
|
|
25
|
+
"project's OAuth consent screen before proceeding.\n" +
|
|
26
|
+
'See: APIs & Services > OAuth consent screen > Scopes',
|
|
27
|
+
};
|
|
28
|
+
//# sourceMappingURL=google.js.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"google.js","sourceRoot":"","sources":["../../../src/auth/providers/google.ts"],"names":[],"mappings":"AACA,OAAO,EAAE,kBAAkB,EAAE,wBAAwB,EAAE,MAAM,oBAAoB,CAAC;AAElF,MAAM,CAAC,MAAM,mBAAmB,GAAwB;IACtD,EAAE,EAAE,QAAQ;IACZ,WAAW,EAAE,kBAAkB;IAC/B,gBAAgB,EAAE,8CAA8C;IAChE,QAAQ,EAAE,qCAAqC;IAC/C,aAAa,EAAE;QACb,gDAAgD;QAChD,mDAAmD;QACnD,gDAAgD;KACjD;IACD,YAAY,EAAE,WAAW;IACzB,OAAO,EAAE,IAAI;IACb,WAAW,EAAE,CAAC,kBAAkB,CAAC;IACjC,WAAW,EAAE,qBAAqB;IAClC,kBAAkB,EAAE,sBAAsB;IAC1C,cAAc,EAAE,kBAAkB;IAClC,kBAAkB,EAAE,sBAAsB;IAC1C,mBAAmB,EAAE,yBAAyB;IAC9C,aAAa,EAAE,sCAAsC;IACrD,eAAe,EAAE,EAAE,WAAW,EAAE,SAAS,EAAE,MAAM,EAAE,SAAS,EAAE,sBAAsB,EAAE,MAAM,EAAE;IAC9F,WAAW,EAAE,kBAAkB;IAC/B,kBAAkB,EAAE,wBAAwB;IAC5C,sBAAsB,EACpB,2DAA2D;QAC3D,qDAAqD;QACrD,sDAAsD;CACzD,CAAC"}
|
package/dist/cli.js
CHANGED
|
@@ -23,6 +23,7 @@ const topLevelSpec = {
|
|
|
23
23
|
{ name: 'escalation-listener', description: 'Aggregate escalation notifications from PTY sessions' },
|
|
24
24
|
{ name: 'bot', description: "Alias for 'daemon' (backward compatible)" },
|
|
25
25
|
{ name: 'persona', description: 'Manage personas (named policy profiles)' },
|
|
26
|
+
{ name: 'auth', description: 'Manage OAuth providers (import credentials, authorize, revoke)' },
|
|
26
27
|
{ name: 'setup', description: 'Run the first-start wizard (always runs)' },
|
|
27
28
|
{ name: 'setup-signal', description: 'Interactive Signal transport onboarding' },
|
|
28
29
|
{ name: 'annotate-tools', description: 'Classify MCP tool arguments via LLM' },
|
|
@@ -112,6 +113,11 @@ switch (subcommand) {
|
|
|
112
113
|
await personaMain(process.argv.slice(3));
|
|
113
114
|
break;
|
|
114
115
|
}
|
|
116
|
+
case 'auth': {
|
|
117
|
+
const { runAuthCommand } = await import('./auth/auth-command.js');
|
|
118
|
+
await runAuthCommand(process.argv.slice(3));
|
|
119
|
+
break;
|
|
120
|
+
}
|
|
115
121
|
case 'setup': {
|
|
116
122
|
const { runFirstStart } = await import('./config/first-start.js');
|
|
117
123
|
await runFirstStart();
|
package/dist/cli.js.map
CHANGED
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"cli.js","sourceRoot":"","sources":["../src/cli.ts"],"names":[],"mappings":";AACA,OAAO,eAAe,CAAC;AACvB,OAAO,EAAE,YAAY,EAAE,MAAM,SAAS,CAAC;AACvC,OAAO,EAAE,OAAO,EAAE,OAAO,EAAE,MAAM,WAAW,CAAC;AAC7C,OAAO,EAAE,aAAa,EAAE,MAAM,UAAU,CAAC;AACzC,OAAO,EAAE,SAAS,EAAE,MAAM,WAAW,CAAC;AACtC,OAAO,EAAE,SAAS,EAAE,SAAS,IAAI,aAAa,EAAoB,MAAM,eAAe,CAAC;AAExF,MAAM,SAAS,GAAG,OAAO,CAAC,aAAa,CAAC,MAAM,CAAC,IAAI,CAAC,GAAG,CAAC,CAAC,CAAC;AAE1D,SAAS,UAAU;IACjB,oFAAoF;IACpF,MAAM,eAAe,GAAG,OAAO,CAAC,SAAS,EAAE,IAAI,EAAE,cAAc,CAAC,CAAC;IACjE,MAAM,GAAG,GAAG,IAAI,CAAC,KAAK,CAAC,YAAY,CAAC,eAAe,EAAE,OAAO,CAAC,CAAwB,CAAC;IACtF,OAAO,GAAG,CAAC,OAAO,CAAC;AACrB,CAAC;AAED,MAAM,YAAY,GAAgB;IAChC,IAAI,EAAE,aAAa;IACnB,WAAW,EAAE,wDAAwD;IACrE,KAAK,EAAE,CAAC,iCAAiC,CAAC;IAC1C,WAAW,EAAE;QACX,EAAE,IAAI,EAAE,cAAc,EAAE,WAAW,EAAE,4CAA4C,EAAE;QACnF,EAAE,IAAI,EAAE,QAAQ,EAAE,WAAW,EAAE,8BAA8B,EAAE;QAC/D,EAAE,IAAI,EAAE,KAAK,EAAE,WAAW,EAAE,2DAA2D,EAAE;QACzF,EAAE,IAAI,EAAE,qBAAqB,EAAE,WAAW,EAAE,sDAAsD,EAAE;QACpG,EAAE,IAAI,EAAE,KAAK,EAAE,WAAW,EAAE,0CAA0C,EAAE;QACxE,EAAE,IAAI,EAAE,SAAS,EAAE,WAAW,EAAE,yCAAyC,EAAE;QAC3E,EAAE,IAAI,EAAE,OAAO,EAAE,WAAW,EAAE,0CAA0C,EAAE;QAC1E,EAAE,IAAI,EAAE,cAAc,EAAE,WAAW,EAAE,yCAAyC,EAAE;QAChF,EAAE,IAAI,EAAE,gBAAgB,EAAE,WAAW,EAAE,qCAAqC,EAAE;QAC9E,EAAE,IAAI,EAAE,gBAAgB,EAAE,WAAW,EAAE,oDAAoD,EAAE;QAC7F,EAAE,IAAI,EAAE,eAAe,EAAE,WAAW,EAAE,qDAAqD,EAAE;QAC7F,EAAE,IAAI,EAAE,kBAAkB,EAAE,WAAW,EAAE,qDAAqD,EAAE;QAChG,EAAE,IAAI,EAAE,QAAQ,EAAE,WAAW,EAAE,kCAAkC,EAAE;QACnE,EAAE,IAAI,EAAE,MAAM,EAAE,WAAW,EAAE,wBAAwB,EAAE;KACxD;IACD,OAAO,EAAE;QACP,EAAE,IAAI,EAAE,MAAM,EAAE,KAAK,EAAE,GAAG,EAAE,WAAW,EAAE,wBAAwB,EAAE;QACnE,EAAE,IAAI,EAAE,SAAS,EAAE,KAAK,EAAE,GAAG,EAAE,WAAW,EAAE,qBAAqB,EAAE;KACpE;IACD,QAAQ,EAAE;QACR,mEAAmE;QACnE,sEAAsE;QACtE,mEAAmE;QACnE,6EAA6E;QAC7E,sEAAsE;QACtE,2DAA2D;QAC3D,mEAAmE;QACnE,sEAAsE;QACtE,iEAAiE;QACjE,wEAAwE;KACzE;CACF,CAAC;AAEF,MAAM,eAAe,GAAgB;IACnC,IAAI,EAAE,0BAA0B;IAChC,WAAW,EAAE,yCAAyC;IACtD,KAAK,EAAE,CAAC,oCAAoC,CAAC;IAC7C,OAAO,EAAE,CAAC,EAAE,IAAI,EAAE,UAAU,EAAE,WAAW,EAAE,kCAAkC,EAAE,CAAC;CACjF,CAAC;AAEF,MAAM,EAAE,MAAM,EAAE,WAAW,EAAE,GAAG,SAAS,CAAC;IACxC,IAAI,EAAE,OAAO,CAAC,IAAI,CAAC,KAAK,CAAC,CAAC,CAAC;IAC3B,OAAO,EAAE;QACP,IAAI,EAAE,EAAE,IAAI,EAAE,SAAS,EAAE,KAAK,EAAE,GAAG,EAAE;QACrC,OAAO,EAAE,EAAE,IAAI,EAAE,SAAS,EAAE,KAAK,EAAE,GAAG,EAAE;KACzC;IACD,gBAAgB,EAAE,IAAI;IACtB,MAAM,EAAE,KAAK;CACd,CAAC,CAAC;AAEH,IAAI,MAAM,CAAC,OAAO,EAAE,CAAC;IACnB,OAAO,CAAC,GAAG,CAAC,UAAU,EAAE,CAAC,CAAC;IAC1B,OAAO,CAAC,IAAI,CAAC,CAAC,CAAC,CAAC;AAClB,CAAC;AAED,MAAM,UAAU,GAAG,WAAW,CAAC,CAAC,CAAC,CAAC;AAElC,+EAA+E;AAC/E,wEAAwE;AACxE,gDAAgD;AAChD,IAAI,CAAC,UAAU,IAAI,UAAU,KAAK,MAAM,EAAE,CAAC;IACzC,aAAa,CAAC,YAAY,CAAC,CAAC;IAC5B,OAAO,CAAC,IAAI,CAAC,CAAC,CAAC,CAAC;AAClB,CAAC;AAED,QAAQ,UAAU,EAAE,CAAC;IACnB,KAAK,OAAO,CAAC,CAAC,CAAC;QACb,MAAM,EAAE,IAAI,EAAE,GAAG,MAAM,MAAM,CAAC,YAAY,CAAC,CAAC;QAC5C,MAAM,IAAI,CAAC,OAAO,CAAC,IAAI,CAAC,KAAK,CAAC,CAAC,CAAC,CAAC,CAAC;QAClC,MAAM;IACR,CAAC;IACD,KAAK,gBAAgB,CAAC,CAAC,CAAC;QACtB,MAAM,EAAE,IAAI,EAAE,GAAG,MAAM,MAAM,CAAC,wBAAwB,CAAC,CAAC;QACxD,MAAM,IAAI,EAAE,CAAC;QACb,MAAM;IACR,CAAC;IACD,KAAK,gBAAgB,CAAC,CAAC,CAAC;QACtB,MAAM,EAAE,IAAI,EAAE,GAAG,MAAM,MAAM,CAAC,uBAAuB,CAAC,CAAC;QACvD,MAAM,IAAI,EAAE,CAAC;QACb,MAAM;IACR,CAAC;IACD,KAAK,eAAe,CAAC,CAAC,CAAC;QACrB,MAAM,EAAE,IAAI,EAAE,GAAG,MAAM,MAAM,CAAC,6BAA6B,CAAC,CAAC;QAC7D,MAAM,IAAI,CAAC,OAAO,CAAC,IAAI,CAAC,KAAK,CAAC,CAAC,CAAC,CAAC,CAAC;QAClC,MAAM;IACR,CAAC;IACD,KAAK,kBAAkB,CAAC,CAAC,CAAC;QACxB,MAAM,EAAE,IAAI,EAAE,GAAG,MAAM,MAAM,CAAC,uCAAuC,CAAC,CAAC;QACvE,MAAM,IAAI,EAAE,CAAC;QACb,MAAM;IACR,CAAC;IACD,KAAK,QAAQ,CAAC,CAAC,CAAC;QACd,MAAM,EAAE,gBAAgB,EAAE,GAAG,MAAM,MAAM,CAAC,4BAA4B,CAAC,CAAC;QACxE,MAAM,gBAAgB,EAAE,CAAC;QACzB,MAAM;IACR,CAAC;IACD,KAAK,SAAS,CAAC,CAAC,CAAC;QACf,MAAM,EAAE,IAAI,EAAE,WAAW,EAAE,GAAG,MAAM,MAAM,CAAC,8BAA8B,CAAC,CAAC;QAC3E,MAAM,WAAW,CAAC,OAAO,CAAC,IAAI,CAAC,KAAK,CAAC,CAAC,CAAC,CAAC,CAAC;QACzC,MAAM;IACR,CAAC;IACD,KAAK,OAAO,CAAC,CAAC,CAAC;QACb,MAAM,EAAE,aAAa,EAAE,GAAG,MAAM,MAAM,CAAC,yBAAyB,CAAC,CAAC;QAClE,MAAM,aAAa,EAAE,CAAC;QACtB,MAAM;IACR,CAAC;IACD,KAAK,QAAQ,CAAC,CAAC,CAAC;QACd,MAAM,EAAE,gBAAgB,EAAE,GAAG,MAAM,MAAM,CAAC,4BAA4B,CAAC,CAAC;QACxE,MAAM,gBAAgB,CAAC,OAAO,CAAC,IAAI,CAAC,KAAK,CAAC,CAAC,CAAC,CAAC,CAAC;QAC9C,MAAM;IACR,CAAC;IACD,KAAK,KAAK,CAAC,CAAC,CAAC;QACX,0DAA0D;QAC1D,MAAM,OAAO,GAAG,OAAO,CAAC,IAAI,CAAC,KAAK,CAAC,CAAC,CAAC,CAAC;QACtC,IAAI,OAAO,CAAC,QAAQ,CAAC,QAAQ,CAAC,IAAI,OAAO,CAAC,QAAQ,CAAC,IAAI,CAAC,EAAE,CAAC;YACzD,MAAM,EAAE,OAAO,EAAE,GAAG,MAAM,MAAM,CAAC,yBAAyB,CAAC,CAAC;YAC5D,aAAa,CAAC,OAAO,CAAC,CAAC;YACvB,MAAM;QACR,CAAC;QACD,MAAM,SAAS,GAAG,MAAM,CAAC,KAA2B,CAAC;QACrD,IAAI,OAAO,CAAC,IAAI,CAAC,CAAC,CAAC,EAAE,EAAE,CAAC,CAAC,CAAC,CAAC,UAAU,CAAC,GAAG,CAAC,CAAC,EAAE,CAAC;YAC5C,kDAAkD;YAClD,MAAM,EAAE,gBAAgB,EAAE,GAAG,MAAM,MAAM,CAAC,4BAA4B,CAAC,CAAC;YACxE,MAAM,gBAAgB,CAAC,OAAO,CAAC,CAAC;QAClC,CAAC;aAAM,CAAC;YACN,0CAA0C;YAC1C,MAAM,EAAE,MAAM,EAAE,GAAG,MAAM,MAAM,CAAC,yBAAyB,CAAC,CAAC;YAC3D,MAAM,MAAM,CAAC,EAAE,KAAK,EAAE,SAAS,EAAE,CAAC,CAAC;QACrC,CAAC;QACD,MAAM;IACR,CAAC;IACD,KAAK,KAAK,CAAC,CAAC,CAAC;QACX,MAAM,EAAE,IAAI,EAAE,OAAO,EAAE,GAAG,MAAM,MAAM,CAAC,sBAAsB,CAAC,CAAC;QAC/D,MAAM,OAAO,CAAC,OAAO,CAAC,IAAI,CAAC,KAAK,CAAC,CAAC,CAAC,CAAC,CAAC;QACrC,MAAM;IACR,CAAC;IACD,KAAK,qBAAqB,CAAC,CAAC,CAAC;QAC3B,MAAM,EAAE,IAAI,EAAE,YAAY,EAAE,GAAG,MAAM,MAAM,CAAC,kCAAkC,CAAC,CAAC;QAChF,MAAM,YAAY,EAAE,CAAC;QACrB,MAAM;IACR,CAAC;IACD,KAAK,cAAc,CAAC,CAAC,CAAC;QACpB,IAAI,SAAS,CAAC,EAAE,IAAI,EAAE,OAAO,CAAC,IAAI,CAAC,QAAQ,CAAC,QAAQ,CAAC,IAAI,OAAO,CAAC,IAAI,CAAC,QAAQ,CAAC,IAAI,CAAC,EAAE,EAAE,eAAe,CAAC;YAAE,MAAM;QAChH,MAAM,OAAO,GAAG,OAAO,CAAC,IAAI,CAAC,QAAQ,CAAC,YAAY,CAAC,CAAC;QACpD,MAAM,EAAE,cAAc,EAAE,GAAG,MAAM,MAAM,CAAC,0BAA0B,CAAC,CAAC;QACpE,MAAM,cAAc,CAAC,EAAE,OAAO,EAAE,CAAC,CAAC;QAClC,MAAM;IACR,CAAC;IACD;QACE,OAAO,CAAC,KAAK,CAAC,oBAAoB,UAAU,IAAI,CAAC,CAAC;QAClD,aAAa,CAAC,YAAY,CAAC,CAAC;QAC5B,OAAO,CAAC,IAAI,CAAC,CAAC,CAAC,CAAC;AACpB,CAAC"}
|
|
1
|
+
{"version":3,"file":"cli.js","sourceRoot":"","sources":["../src/cli.ts"],"names":[],"mappings":"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"}
|