@shin1ohno/sage 0.11.1 → 0.12.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 +39 -0
- package/dist/cli/http-server-with-config.d.ts.map +1 -1
- package/dist/cli/http-server-with-config.js +45 -1
- package/dist/cli/http-server-with-config.js.map +1 -1
- package/dist/oauth/google-oauth-callback-handler.d.ts +57 -0
- package/dist/oauth/google-oauth-callback-handler.d.ts.map +1 -0
- package/dist/oauth/google-oauth-callback-handler.js +291 -0
- package/dist/oauth/google-oauth-callback-handler.js.map +1 -0
- package/dist/oauth/index.d.ts +2 -0
- package/dist/oauth/index.d.ts.map +1 -1
- package/dist/oauth/index.js +4 -0
- package/dist/oauth/index.js.map +1 -1
- package/dist/oauth/pending-google-auth-store.d.ts +88 -0
- package/dist/oauth/pending-google-auth-store.d.ts.map +1 -0
- package/dist/oauth/pending-google-auth-store.js +218 -0
- package/dist/oauth/pending-google-auth-store.js.map +1 -0
- package/dist/tools/oauth/authenticate-google.d.ts +18 -7
- package/dist/tools/oauth/authenticate-google.d.ts.map +1 -1
- package/dist/tools/oauth/authenticate-google.js +95 -9
- package/dist/tools/oauth/authenticate-google.js.map +1 -1
- package/package.json +1 -1
package/README.md
CHANGED
|
@@ -103,6 +103,45 @@ sage now supports multiple calendar sources:
|
|
|
103
103
|
|
|
104
104
|
**Setup**: See [Configuration Guide](docs/CONFIGURATION.md#google-calendar-integration) for Google OAuth setup instructions.
|
|
105
105
|
|
|
106
|
+
### Remote Server Google OAuth Setup
|
|
107
|
+
|
|
108
|
+
When running sage as a remote MCP server (e.g., on a VPS or cloud instance), you can use Google Calendar by setting up a Web Application OAuth client:
|
|
109
|
+
|
|
110
|
+
**1. Create OAuth Client in Google Cloud Console**
|
|
111
|
+
|
|
112
|
+
1. Go to [Google Cloud Console](https://console.cloud.google.com/)
|
|
113
|
+
2. Navigate to "APIs & Services" → "Credentials" → "Create Credentials" → "OAuth client ID"
|
|
114
|
+
3. Application type: **Web application**
|
|
115
|
+
4. Authorized redirect URIs:
|
|
116
|
+
- Local development: `http://localhost:3000/oauth/callback`
|
|
117
|
+
- Production server: `https://mcp.example.com/oauth/google/callback`
|
|
118
|
+
|
|
119
|
+
**2. Configure Environment Variables**
|
|
120
|
+
|
|
121
|
+
```bash
|
|
122
|
+
export GOOGLE_CLIENT_ID="your-client-id.apps.googleusercontent.com"
|
|
123
|
+
export GOOGLE_CLIENT_SECRET="your-client-secret"
|
|
124
|
+
export GOOGLE_REDIRECT_URI="https://mcp.example.com/oauth/google/callback"
|
|
125
|
+
```
|
|
126
|
+
|
|
127
|
+
**3. Authenticate**
|
|
128
|
+
|
|
129
|
+
From Claude, run the `authenticate_google` tool:
|
|
130
|
+
|
|
131
|
+
1. The tool returns an authorization URL
|
|
132
|
+
2. Open the URL in your browser
|
|
133
|
+
3. Complete Google authentication
|
|
134
|
+
4. The server receives the callback automatically
|
|
135
|
+
5. A success page is displayed - close the window and return to Claude
|
|
136
|
+
|
|
137
|
+
**Troubleshooting**
|
|
138
|
+
|
|
139
|
+
| Issue | Solution |
|
|
140
|
+
|-------|----------|
|
|
141
|
+
| `redirect_uri_mismatch` | Ensure the redirect URI in Google Cloud Console exactly matches `GOOGLE_REDIRECT_URI` |
|
|
142
|
+
| Session expired | Complete authentication within 10 minutes |
|
|
143
|
+
| 503 from callback | Verify `GOOGLE_CLIENT_ID` and `GOOGLE_CLIENT_SECRET` are set |
|
|
144
|
+
|
|
106
145
|
### Smart Reminder Routing
|
|
107
146
|
|
|
108
147
|
Tasks are automatically routed to the appropriate system:
|
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"http-server-with-config.d.ts","sourceRoot":"","sources":["../../src/cli/http-server-with-config.ts"],"names":[],"mappings":"AAAA;;;;;;GAMG;AAIH,OAAO,EAEL,YAAY,EAGb,MAAM,2BAA2B,CAAC;
|
|
1
|
+
{"version":3,"file":"http-server-with-config.d.ts","sourceRoot":"","sources":["../../src/cli/http-server-with-config.ts"],"names":[],"mappings":"AAAA;;;;;;GAMG;AAIH,OAAO,EAEL,YAAY,EAGb,MAAM,2BAA2B,CAAC;AAanC;;GAEG;AACH,MAAM,WAAW,2BAA2B;IAC1C,uEAAuE;IACvE,UAAU,CAAC,EAAE,MAAM,CAAC;IACpB,6BAA6B;IAC7B,IAAI,CAAC,EAAE,MAAM,CAAC;IACd,6BAA6B;IAC7B,IAAI,CAAC,EAAE,MAAM,CAAC;IACd,4CAA4C;IAC5C,UAAU,CAAC,EAAE,MAAM,CAAC;IACpB,2BAA2B;IAC3B,KAAK,CAAC,EAAE,OAAO,CAAC;CACjB;AAED;;GAEG;AACH,MAAM,WAAW,oBAAoB;IACnC,KAAK,IAAI,OAAO,CAAC,IAAI,CAAC,CAAC;IACvB,IAAI,IAAI,OAAO,CAAC,IAAI,CAAC,CAAC;IACtB,SAAS,IAAI,OAAO,CAAC;IACrB,OAAO,IAAI,MAAM,CAAC;IAClB,OAAO,IAAI,MAAM,CAAC;IAClB,aAAa,IAAI,OAAO,CAAC;IACzB,SAAS,IAAI,YAAY,CAAC;CAC3B;AA8qBD;;GAEG;AACH,wBAAsB,0BAA0B,CAC9C,OAAO,GAAE,2BAAgC,GACxC,OAAO,CAAC,oBAAoB,CAAC,CAU/B"}
|
|
@@ -10,7 +10,8 @@ import { VERSION } from '../version.js';
|
|
|
10
10
|
import { loadRemoteConfig, DEFAULT_REMOTE_CONFIG_PATH, } from './remote-config-loader.js';
|
|
11
11
|
import { createSecretAuthenticator } from './secret-auth.js';
|
|
12
12
|
import { createMCPHandler } from './mcp-handler.js';
|
|
13
|
-
import { OAuthServer, OAuthHandler } from '../oauth/index.js';
|
|
13
|
+
import { OAuthServer, OAuthHandler, PendingGoogleAuthStore, GoogleOAuthCallbackHandler, GoogleOAuthHandler, } from '../oauth/index.js';
|
|
14
|
+
import { setSharedPendingAuthStore } from '../tools/oauth/authenticate-google.js';
|
|
14
15
|
import { cliLogger } from '../utils/logger.js';
|
|
15
16
|
/**
|
|
16
17
|
* Cookie name for session token
|
|
@@ -54,6 +55,9 @@ class HTTPServerWithConfigImpl {
|
|
|
54
55
|
oauthServer = null;
|
|
55
56
|
oauthHandler = null;
|
|
56
57
|
debug = false;
|
|
58
|
+
// Google OAuth remote mode handlers
|
|
59
|
+
pendingGoogleAuthStore = null;
|
|
60
|
+
googleOAuthCallbackHandler = null;
|
|
57
61
|
constructor(config, options) {
|
|
58
62
|
this.config = config;
|
|
59
63
|
this.debug = options.debug ?? false;
|
|
@@ -103,6 +107,27 @@ class HTTPServerWithConfigImpl {
|
|
|
103
107
|
}
|
|
104
108
|
// Initialize MCP handler
|
|
105
109
|
this.mcpHandler = await createMCPHandler();
|
|
110
|
+
// Initialize Google OAuth callback handler for remote mode
|
|
111
|
+
if (process.env.GOOGLE_CLIENT_ID && process.env.GOOGLE_CLIENT_SECRET) {
|
|
112
|
+
const redirectUri = process.env.GOOGLE_REDIRECT_URI;
|
|
113
|
+
// Only enable remote mode if redirect URI is not localhost
|
|
114
|
+
if (redirectUri && !redirectUri.toLowerCase().includes('localhost') && !redirectUri.toLowerCase().includes('127.0.0.1')) {
|
|
115
|
+
this.pendingGoogleAuthStore = new PendingGoogleAuthStore();
|
|
116
|
+
await this.pendingGoogleAuthStore.initialize();
|
|
117
|
+
// Share the store with authenticate_google tool
|
|
118
|
+
setSharedPendingAuthStore(this.pendingGoogleAuthStore);
|
|
119
|
+
const googleOAuthHandler = new GoogleOAuthHandler({
|
|
120
|
+
clientId: process.env.GOOGLE_CLIENT_ID,
|
|
121
|
+
clientSecret: process.env.GOOGLE_CLIENT_SECRET,
|
|
122
|
+
redirectUri,
|
|
123
|
+
});
|
|
124
|
+
this.googleOAuthCallbackHandler = new GoogleOAuthCallbackHandler({
|
|
125
|
+
pendingAuthStore: this.pendingGoogleAuthStore,
|
|
126
|
+
googleOAuthHandler,
|
|
127
|
+
});
|
|
128
|
+
cliLogger.info({ redirectUri }, 'Google OAuth remote mode enabled');
|
|
129
|
+
}
|
|
130
|
+
}
|
|
106
131
|
// Initialize OAuth if configured (Requirements 21-31)
|
|
107
132
|
if (this.config.remote.auth.type === 'oauth2') {
|
|
108
133
|
const oauthConfig = this.config.remote.auth;
|
|
@@ -166,6 +191,10 @@ class HTTPServerWithConfigImpl {
|
|
|
166
191
|
cliLogger.info('Shutting down, flushing OAuth data...');
|
|
167
192
|
await this.oauthServer.shutdown();
|
|
168
193
|
}
|
|
194
|
+
// Shutdown Google OAuth pending auth store
|
|
195
|
+
if (this.pendingGoogleAuthStore) {
|
|
196
|
+
await this.pendingGoogleAuthStore.shutdown();
|
|
197
|
+
}
|
|
169
198
|
return new Promise((resolve) => {
|
|
170
199
|
this.server.close(() => {
|
|
171
200
|
this.running = false;
|
|
@@ -229,6 +258,21 @@ class HTTPServerWithConfigImpl {
|
|
|
229
258
|
this.handleOAuthHealthCheck(res);
|
|
230
259
|
return;
|
|
231
260
|
}
|
|
261
|
+
// Google OAuth callback endpoint (no auth required - receives redirect from Google)
|
|
262
|
+
if (path === '/oauth/google/callback' && method === 'GET') {
|
|
263
|
+
if (this.googleOAuthCallbackHandler) {
|
|
264
|
+
this.googleOAuthCallbackHandler.handleCallback(req, res).catch((error) => {
|
|
265
|
+
cliLogger.error({ err: error }, 'Google OAuth callback failed');
|
|
266
|
+
res.writeHead(500, { 'Content-Type': 'text/html; charset=utf-8' });
|
|
267
|
+
res.end('<h1>Internal Server Error</h1>');
|
|
268
|
+
});
|
|
269
|
+
}
|
|
270
|
+
else {
|
|
271
|
+
res.writeHead(503, { 'Content-Type': 'application/json' });
|
|
272
|
+
res.end(JSON.stringify({ error: 'Google OAuth not configured' }));
|
|
273
|
+
}
|
|
274
|
+
return;
|
|
275
|
+
}
|
|
232
276
|
// OAuth endpoints (Requirements 21-31)
|
|
233
277
|
if (this.oauthHandler) {
|
|
234
278
|
const oauthPaths = [
|
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"http-server-with-config.js","sourceRoot":"","sources":["../../src/cli/http-server-with-config.ts"],"names":[],"mappings":"AAAA;;;;;;GAMG;AAEH,OAAO,EAAE,YAAY,EAA2C,MAAM,MAAM,CAAC;AAC7E,OAAO,EAAE,OAAO,EAAE,MAAM,eAAe,CAAC;AACxC,OAAO,EACL,gBAAgB,EAEhB,0BAA0B,GAE3B,MAAM,2BAA2B,CAAC;AACnC,OAAO,EAAE,yBAAyB,EAAuB,MAAM,kBAAkB,CAAC;AAClF,OAAO,EAAE,gBAAgB,EAA0B,MAAM,kBAAkB,CAAC;AAC5E,OAAO,EAAE,WAAW,EAAE,YAAY,EAAE,MAAM,mBAAmB,CAAC;AAC9D,OAAO,EAAE,SAAS,EAAE,MAAM,oBAAoB,CAAC;AA0C/C;;GAEG;AACH,MAAM,mBAAmB,GAAG,cAAc,CAAC;AAE3C;;GAEG;AACH,SAAS,YAAY,CAAC,YAAqB;IACzC,IAAI,CAAC,YAAY,EAAE,CAAC;QAClB,OAAO,EAAE,CAAC;IACZ,CAAC;IAED,MAAM,OAAO,GAA2B,EAAE,CAAC;IAC3C,YAAY,CAAC,KAAK,CAAC,GAAG,CAAC,CAAC,OAAO,CAAC,MAAM,CAAC,EAAE;QACvC,MAAM,CAAC,IAAI,EAAE,GAAG,IAAI,CAAC,GAAG,MAAM,CAAC,KAAK,CAAC,GAAG,CAAC,CAAC;QAC1C,IAAI,IAAI,IAAI,IAAI,CAAC,MAAM,GAAG,CAAC,EAAE,CAAC;YAC5B,OAAO,CAAC,IAAI,CAAC,IAAI,EAAE,CAAC,GAAG,IAAI,CAAC,IAAI,CAAC,GAAG,CAAC,CAAC,IAAI,EAAE,CAAC;QAC/C,CAAC;IACH,CAAC,CAAC,CAAC;IAEH,OAAO,OAAO,CAAC;AACjB,CAAC;AAED;;GAEG;AACH,SAAS,mBAAmB,CAAC,KAAa,EAAE,SAAiB,KAAK;IAChE,wCAAwC;IACxC,OAAO,GAAG,mBAAmB,IAAI,KAAK,qDAAqD,MAAM,EAAE,CAAC;AACtG,CAAC;AAED;;GAEG;AACH,MAAM,wBAAwB;IACpB,MAAM,GAAkB,IAAI,CAAC;IAC7B,OAAO,GAAY,KAAK,CAAC;IACzB,SAAS,GAAgB,IAAI,CAAC;IAC9B,MAAM,CAAe;IACrB,aAAa,CAAS;IACtB,aAAa,CAAS;IACtB,aAAa,GAA+B,IAAI,CAAC;IACjD,UAAU,GAAsB,IAAI,CAAC;IACrC,WAAW,GAAuB,IAAI,CAAC;IACvC,YAAY,GAAwB,IAAI,CAAC;IACzC,KAAK,GAAY,KAAK,CAAC;IAE/B,YAAY,MAAoB,EAAE,OAAoC;QACpE,IAAI,CAAC,MAAM,GAAG,MAAM,CAAC;QACrB,IAAI,CAAC,KAAK,GAAG,OAAO,CAAC,KAAK,IAAI,KAAK,CAAC;QAEpC,uDAAuD;QACvD,IAAI,CAAC,aAAa,GAAG,OAAO,CAAC,IAAI,IAAI,MAAM,CAAC,MAAM,CAAC,IAAI,CAAC;QACxD,IAAI,CAAC,aAAa,GAAG,OAAO,CAAC,IAAI,IAAI,MAAM,CAAC,MAAM,CAAC,IAAI,CAAC;QAExD,qCAAqC;QACrC,IAAI,MAAM,CAAC,MAAM,CAAC,IAAI,CAAC,IAAI,KAAK,QAAQ,EAAE,CAAC;YACzC,uCAAuC;YACvC,mDAAmD;YACnD,MAAM,WAAW,GAAG,MAAM,CAAC,MAAM,CAAC,IAAI,CAAC;YACvC,IAAI,WAAW,CAAC,iBAAiB,IAAI,WAAW,CAAC,iBAAiB,EAAE,CAAC;gBACnE,IAAI,CAAC,aAAa,GAAG,yBAAyB,CAAC;oBAC7C,MAAM,EAAE,WAAW,CAAC,iBAAiB;oBACrC,SAAS,EAAE,WAAW,CAAC,iBAAiB,IAAI,IAAI;iBACjD,CAAC,CAAC;YACL,CAAC;QACH,CAAC;aAAM,IAAI,MAAM,CAAC,MAAM,CAAC,IAAI,CAAC,IAAI,KAAK,KAAK,EAAE,CAAC;YAC7C,sCAAsC;YACtC,MAAM,SAAS,GAAG,MAAM,CAAC,MAAM,CAAC,IAAI,CAAC;YACrC,MAAM,MAAM,GAAG,OAAO,CAAC,UAAU,IAAI,SAAS,CAAC,MAAM,CAAC;YAEtD,IAAI,MAAM,EAAE,CAAC;gBACX,IAAI,CAAC,aAAa,GAAG,yBAAyB,CAAC;oBAC7C,MAAM;oBACN,SAAS,EAAE,SAAS,CAAC,SAAS,IAAI,KAAK;iBACxC,CAAC,CAAC;YACL,CAAC;QACH,CAAC;aAAM,IAAI,OAAO,CAAC,UAAU,EAAE,CAAC;YAC9B,kEAAkE;YAClE,IAAI,CAAC,aAAa,GAAG,yBAAyB,CAAC;gBAC7C,MAAM,EAAE,OAAO,CAAC,UAAU;gBAC1B,SAAS,EAAE,KAAK;aACjB,CAAC,CAAC;YACH,uDAAuD;YACvD,IAAI,CAAC,MAAM,CAAC,MAAM,CAAC,IAAI,GAAG;gBACxB,IAAI,EAAE,KAAK;gBACX,MAAM,EAAE,OAAO,CAAC,UAAU;gBAC1B,SAAS,EAAE,KAAK;aACjB,CAAC;QACJ,CAAC;IACH,CAAC;IAED,KAAK,CAAC,KAAK;QACT,IAAI,IAAI,CAAC,OAAO,EAAE,CAAC;YACjB,OAAO;QACT,CAAC;QAED,yBAAyB;QACzB,IAAI,CAAC,UAAU,GAAG,MAAM,gBAAgB,EAAE,CAAC;QAE3C,sDAAsD;QACtD,IAAI,IAAI,CAAC,MAAM,CAAC,MAAM,CAAC,IAAI,CAAC,IAAI,KAAK,QAAQ,EAAE,CAAC;YAC9C,MAAM,WAAW,GAAG,IAAI,CAAC,MAAM,CAAC,MAAM,CAAC,IAAuB,CAAC;YAC/D,MAAM,MAAM,GAAG,WAAW,CAAC,MAAM,IAAI,UAAU,IAAI,CAAC,aAAa,IAAI,IAAI,CAAC,aAAa,EAAE,CAAC;YAE1F,qCAAqC;YACrC,MAAM,KAAK,GAAG,WAAW,CAAC,KAAK,CAAC,GAAG,CAAC,CAAC,CAAC,EAAE,CAAC,EAAE,EAAE,CAAC,CAAC;gBAC7C,EAAE,EAAE,QAAQ,CAAC,EAAE;gBACf,QAAQ,EAAE,CAAC,CAAC,QAAQ;gBACpB,YAAY,EAAE,CAAC,CAAC,YAAY;gBAC5B,SAAS,EAAE,IAAI,CAAC,GAAG,EAAE;aACtB,CAAC,CAAC,CAAC;YAEJ,IAAI,CAAC,WAAW,GAAG,IAAI,WAAW,CAAC;gBACjC,MAAM;gBACN,iBAAiB,EAAE,WAAW,CAAC,iBAAiB,IAAI,IAAI;gBACxD,kBAAkB,EAAE,WAAW,CAAC,kBAAkB,IAAI,KAAK;gBAC3D,uBAAuB,EAAE,KAAK;gBAC9B,mBAAmB,EAAE,WAAW,CAAC,mBAAmB,IAAI,EAAE;gBAC1D,KAAK;gBACL,iBAAiB,EAAE,IAAI;aACxB,CAAC,CAAC;YAEH,MAAM,IAAI,CAAC,WAAW,CAAC,UAAU,EAAE,CAAC;YAEpC,SAAS,CAAC,IAAI,CAAC,iEAAiE,CAAC,CAAC;YAClF,SAAS,CAAC,IAAI,CAAC,EAAE,eAAe,EAAE,UAAU,EAAE,EAAE,wBAAwB,CAAC,CAAC;YAC1E,IAAI,CAAC,YAAY,GAAG,IAAI,YAAY,CAAC,IAAI,CAAC,WAAW,EAAE;gBACrD,MAAM;gBACN,iBAAiB,EAAE,WAAW,CAAC,iBAAiB,IAAI,IAAI;gBACxD,kBAAkB,EAAE,WAAW,CAAC,kBAAkB,IAAI,KAAK;gBAC3D,mBAAmB,EAAE,WAAW,CAAC,mBAAmB,IAAI,EAAE;gBAC1D,KAAK;aACN,CAAC,CAAC;YAEH,mDAAmD;YACnD,MAAM,eAAe,GAAG,KAAK,IAAI,EAAE;gBACjC,SAAS,CAAC,IAAI,CAAC,uCAAuC,CAAC,CAAC;gBACxD,MAAM,IAAI,CAAC,WAAY,CAAC,QAAQ,EAAE,CAAC;gBACnC,OAAO,CAAC,IAAI,CAAC,CAAC,CAAC,CAAC;YAClB,CAAC,CAAC;YAEF,OAAO,CAAC,EAAE,CAAC,SAAS,EAAE,eAAe,CAAC,CAAC;YACvC,OAAO,CAAC,EAAE,CAAC,QAAQ,EAAE,eAAe,CAAC,CAAC;QACxC,CAAC;QAED,OAAO,IAAI,OAAO,CAAC,CAAC,OAAO,EAAE,MAAM,EAAE,EAAE;YACrC,IAAI,CAAC;gBACH,IAAI,CAAC,MAAM,GAAG,YAAY,CAAC,IAAI,CAAC,aAAa,CAAC,IAAI,CAAC,IAAI,CAAC,CAAC,CAAC;gBAE1D,IAAI,CAAC,MAAM,CAAC,MAAM,CAAC,IAAI,CAAC,aAAa,EAAE,IAAI,CAAC,aAAa,EAAE,GAAG,EAAE;oBAC9D,IAAI,CAAC,OAAO,GAAG,IAAI,CAAC;oBACpB,IAAI,CAAC,SAAS,GAAG,IAAI,IAAI,EAAE,CAAC;oBAC5B,OAAO,EAAE,CAAC;gBACZ,CAAC,CAAC,CAAC;gBAEH,IAAI,CAAC,MAAM,CAAC,EAAE,CAAC,OAAO,EAAE,MAAM,CAAC,CAAC;YAClC,CAAC;YAAC,OAAO,KAAK,EAAE,CAAC;gBACf,MAAM,CAAC,KAAK,CAAC,CAAC;YAChB,CAAC;QACH,CAAC,CAAC,CAAC;IACL,CAAC;IAED,KAAK,CAAC,IAAI;QACR,IAAI,CAAC,IAAI,CAAC,OAAO,IAAI,CAAC,IAAI,CAAC,MAAM,EAAE,CAAC;YAClC,OAAO;QACT,CAAC;QAED,8BAA8B;QAC9B,IAAI,IAAI,CAAC,WAAW,EAAE,CAAC;YACrB,SAAS,CAAC,IAAI,CAAC,uCAAuC,CAAC,CAAC;YACxD,MAAM,IAAI,CAAC,WAAW,CAAC,QAAQ,EAAE,CAAC;QACpC,CAAC;QAED,OAAO,IAAI,OAAO,CAAC,CAAC,OAAO,EAAE,EAAE;YAC7B,IAAI,CAAC,MAAO,CAAC,KAAK,CAAC,GAAG,EAAE;gBACtB,IAAI,CAAC,OAAO,GAAG,KAAK,CAAC;gBACrB,IAAI,CAAC,SAAS,GAAG,IAAI,CAAC;gBACtB,OAAO,EAAE,CAAC;YACZ,CAAC,CAAC,CAAC;QACL,CAAC,CAAC,CAAC;IACL,CAAC;IAED,SAAS;QACP,OAAO,IAAI,CAAC,OAAO,CAAC;IACtB,CAAC;IAED,OAAO;QACL,OAAO,IAAI,CAAC,aAAa,CAAC;IAC5B,CAAC;IAED,OAAO;QACL,OAAO,IAAI,CAAC,aAAa,CAAC;IAC5B,CAAC;IAED,aAAa;QACX,OAAO,CACL,CAAC,IAAI,CAAC,MAAM,CAAC,MAAM,CAAC,IAAI,CAAC,IAAI,KAAK,KAAK,IAAI,IAAI,CAAC,aAAa,KAAK,IAAI,CAAC;YACvE,CAAC,IAAI,CAAC,MAAM,CAAC,MAAM,CAAC,IAAI,CAAC,IAAI,KAAK,QAAQ,IAAI,IAAI,CAAC,WAAW,KAAK,IAAI,CAAC,CACzE,CAAC;IACJ,CAAC;IAED,cAAc;QACZ,OAAO,IAAI,CAAC,MAAM,CAAC,MAAM,CAAC,IAAI,CAAC,IAAI,KAAK,QAAQ,IAAI,IAAI,CAAC,WAAW,KAAK,IAAI,CAAC;IAChF,CAAC;IAED,SAAS;QACP,OAAO,IAAI,CAAC,MAAM,CAAC;IACrB,CAAC;IAED;;OAEG;IACK,QAAQ,CAAC,OAAe,EAAE,IAA8B;QAC9D,IAAI,IAAI,CAAC,KAAK,EAAE,CAAC;YACf,SAAS,CAAC,KAAK,CAAC,IAAI,IAAI,EAAE,EAAE,OAAO,CAAC,CAAC;QACvC,CAAC;IACH,CAAC;IAEO,aAAa,CAAC,GAAoB,EAAE,GAAmB;QAC7D,MAAM,GAAG,GAAG,GAAG,CAAC,GAAG,IAAI,GAAG,CAAC;QAC3B,MAAM,MAAM,GAAG,GAAG,CAAC,MAAM,IAAI,KAAK,CAAC;QACnC,MAAM,MAAM,GAAG,GAAG,CAAC,OAAO,CAAC,MAAM,CAAC;QAClC,oDAAoD;QACpD,MAAM,IAAI,GAAG,GAAG,CAAC,KAAK,CAAC,GAAG,CAAC,CAAC,CAAC,CAAC,CAAC;QAE/B,IAAI,CAAC,QAAQ,CAAC,GAAG,MAAM,IAAI,IAAI,EAAE,EAAE,EAAE,MAAM,EAAE,OAAO,EAAE,GAAG,CAAC,OAAkC,EAAE,CAAC,CAAC;QAEhG,mBAAmB;QACnB,MAAM,WAAW,GAAG,IAAI,CAAC,cAAc,CAAC,MAAM,CAAC,CAAC;QAChD,KAAK,MAAM,CAAC,GAAG,EAAE,KAAK,CAAC,IAAI,MAAM,CAAC,OAAO,CAAC,WAAW,CAAC,EAAE,CAAC;YACvD,GAAG,CAAC,SAAS,CAAC,GAAG,EAAE,KAAK,CAAC,CAAC;QAC5B,CAAC;QAED,mBAAmB;QACnB,IAAI,MAAM,KAAK,SAAS,EAAE,CAAC;YACzB,GAAG,CAAC,SAAS,CAAC,GAAG,CAAC,CAAC;YACnB,GAAG,CAAC,GAAG,EAAE,CAAC;YACV,OAAO;QACT,CAAC;QAED,2CAA2C;QAC3C,IAAI,IAAI,KAAK,SAAS,IAAI,MAAM,KAAK,KAAK,EAAE,CAAC;YAC3C,IAAI,CAAC,iBAAiB,CAAC,GAAG,CAAC,CAAC;YAC5B,OAAO;QACT,CAAC;QAED,iDAAiD;QACjD,IAAI,IAAI,KAAK,eAAe,IAAI,MAAM,KAAK,KAAK,EAAE,CAAC;YACjD,IAAI,CAAC,sBAAsB,CAAC,GAAG,CAAC,CAAC;YACjC,OAAO;QACT,CAAC;QAED,uCAAuC;QACvC,IAAI,IAAI,CAAC,YAAY,EAAE,CAAC;YACtB,MAAM,UAAU,GAAG;gBACjB,uCAAuC;gBACvC,yCAAyC;gBACzC,iBAAiB;gBACjB,kBAAkB;gBAClB,cAAc;gBACd,cAAc;aACf,CAAC;YAEF,IAAI,UAAU,CAAC,QAAQ,CAAC,IAAI,CAAC,EAAE,CAAC;gBAC9B,IAAI,CAAC,YAAY,CAAC,aAAa,CAAC,GAAG,EAAE,GAAG,CAAC,CAAC,KAAK,CAAC,GAAG,EAAE;oBACnD,GAAG,CAAC,SAAS,CAAC,GAAG,EAAE,EAAE,cAAc,EAAE,kBAAkB,EAAE,CAAC,CAAC;oBAC3D,GAAG,CAAC,GAAG,CAAC,IAAI,CAAC,SAAS,CAAC,EAAE,KAAK,EAAE,uBAAuB,EAAE,CAAC,CAAC,CAAC;gBAC9D,CAAC,CAAC,CAAC;gBACH,OAAO;YACT,CAAC;QACH,CAAC;QAED,qCAAqC;QACrC,IAAI,IAAI,KAAK,aAAa,IAAI,MAAM,KAAK,MAAM,IAAI,CAAC,IAAI,CAAC,cAAc,EAAE,EAAE,CAAC;YAC1E,IAAI,CAAC,eAAe,CAAC,GAAG,EAAE,GAAG,CAAC,CAAC;YAC/B,OAAO;QACT,CAAC;QAED,0CAA0C;QAC1C,IAAI,IAAI,KAAK,MAAM,IAAI,MAAM,KAAK,MAAM,EAAE,CAAC;YACzC,IAAI,CAAC,gBAAgB,CAAC,GAAG,EAAE,GAAG,CAAC,CAAC;YAChC,OAAO;QACT,CAAC;QAED,+BAA+B;QAC/B,IAAI,CAAC,IAAI,KAAK,GAAG,IAAI,IAAI,KAAK,EAAE,CAAC,IAAI,MAAM,KAAK,KAAK,EAAE,CAAC;YACtD,GAAG,CAAC,SAAS,CAAC,GAAG,EAAE,EAAE,cAAc,EAAE,kBAAkB,EAAE,CAAC,CAAC;YAC3D,GAAG,CAAC,GAAG,CAAC,IAAI,CAAC,SAAS,CAAC;gBACrB,IAAI,EAAE,MAAM;gBACZ,OAAO,EAAE,OAAO;gBAChB,MAAM,EAAE,SAAS;gBACjB,SAAS,EAAE;oBACT,GAAG,EAAE,MAAM;oBACX,MAAM,EAAE,SAAS;oBACjB,KAAK,EAAE,IAAI,CAAC,cAAc,EAAE,CAAC,CAAC,CAAC;wBAC7B,QAAQ,EAAE,yCAAyC;wBACnD,SAAS,EAAE,kBAAkB;wBAC7B,KAAK,EAAE,cAAc;wBACrB,QAAQ,EAAE,iBAAiB;qBAC5B,CAAC,CAAC,CAAC,SAAS;iBACd;aACF,CAAC,CAAC,CAAC;YACJ,OAAO;QACT,CAAC;QAED,yBAAyB;QACzB,GAAG,CAAC,SAAS,CAAC,GAAG,EAAE,EAAE,cAAc,EAAE,kBAAkB,EAAE,CAAC,CAAC;QAC3D,GAAG,CAAC,GAAG,CAAC,IAAI,CAAC,SAAS,CAAC,EAAE,KAAK,EAAE,WAAW,EAAE,CAAC,CAAC,CAAC;IAClD,CAAC;IAEO,cAAc,CAAC,MAAe;QACpC,MAAM,cAAc,GAAG,IAAI,CAAC,MAAM,CAAC,MAAM,CAAC,IAAI,CAAC,cAAc,CAAC;QAE9D,IAAI,WAAW,GAAG,GAAG,CAAC;QACtB,IAAI,cAAc,CAAC,QAAQ,CAAC,GAAG,CAAC,EAAE,CAAC;YACjC,WAAW,GAAG,GAAG,CAAC;QACpB,CAAC;aAAM,IAAI,MAAM,IAAI,cAAc,CAAC,QAAQ,CAAC,MAAM,CAAC,EAAE,CAAC;YACrD,WAAW,GAAG,MAAM,CAAC;QACvB,CAAC;aAAM,IAAI,cAAc,CAAC,MAAM,KAAK,CAAC,EAAE,CAAC;YACvC,WAAW,GAAG,cAAc,CAAC,CAAC,CAAC,CAAC;QAClC,CAAC;QAED,OAAO;YACL,6BAA6B,EAAE,WAAW;YAC1C,8BAA8B,EAAE,oBAAoB;YACpD,8BAA8B,EAAE,6BAA6B;YAC7D,wBAAwB,EAAE,OAAO;SAClC,CAAC;IACJ,CAAC;IAEO,iBAAiB,CAAC,GAAmB;QAC3C,MAAM,MAAM,GAAG,IAAI,CAAC,SAAS,CAAC,CAAC,CAAC,IAAI,CAAC,GAAG,EAAE,GAAG,IAAI,CAAC,SAAS,CAAC,OAAO,EAAE,CAAC,CAAC,CAAC,CAAC,CAAC;QAE1E,MAAM,MAAM,GAAwB;YAClC,MAAM,EAAE,IAAI,CAAC,OAAO,CAAC,CAAC,CAAC,IAAI,CAAC,CAAC,CAAC,OAAO;YACrC,MAAM;YACN,OAAO,EAAE,OAAO;YAChB,SAAS,EAAE,IAAI,IAAI,EAAE,CAAC,WAAW,EAAE;YACnC,WAAW,EAAE,IAAI,CAAC,aAAa,EAAE;SAClC,CAAC;QAEF,GAAG,CAAC,SAAS,CAAC,GAAG,EAAE,EAAE,cAAc,EAAE,kBAAkB,EAAE,CAAC,CAAC;QAC3D,GAAG,CAAC,GAAG,CAAC,IAAI,CAAC,SAAS,CAAC,MAAM,CAAC,CAAC,CAAC;IAClC,CAAC;IAED;;OAEG;IACK,sBAAsB,CAAC,GAAmB;QAChD,IAAI,CAAC,IAAI,CAAC,WAAW,EAAE,CAAC;YACtB,GAAG,CAAC,SAAS,CAAC,GAAG,EAAE,EAAE,cAAc,EAAE,kBAAkB,EAAE,CAAC,CAAC;YAC3D,GAAG,CAAC,GAAG,CAAC,IAAI,CAAC,SAAS,CAAC,EAAE,KAAK,EAAE,mBAAmB,EAAE,CAAC,CAAC,CAAC;YACxD,OAAO;QACT,CAAC;QAED,IAAI,CAAC;YACH,MAAM,MAAM,GAAG,IAAI,CAAC,WAAW,CAAC,eAAe,EAAE,CAAC;YAClD,MAAM,OAAO,GAAG,IAAI,CAAC,WAAW,CAAC,UAAU,EAAE,CAAC;YAE9C,MAAM,QAAQ,GAAG;gBACf,GAAG,MAAM;gBACT,OAAO;gBACP,SAAS,EAAE,IAAI,IAAI,EAAE,CAAC,WAAW,EAAE;aACpC,CAAC;YAEF,MAAM,UAAU,GAAG,MAAM,CAAC,OAAO,CAAC,CAAC,CAAC,GAAG,CAAC,CAAC,CAAC,GAAG,CAAC;YAC9C,GAAG,CAAC,SAAS,CAAC,UAAU,EAAE,EAAE,cAAc,EAAE,kBAAkB,EAAE,CAAC,CAAC;YAClE,GAAG,CAAC,GAAG,CAAC,IAAI,CAAC,SAAS,CAAC,QAAQ,EAAE,IAAI,EAAE,CAAC,CAAC,CAAC,CAAC;YAE3C,IAAI,CAAC,QAAQ,CAAC,qBAAqB,EAAE,QAAQ,CAAC,CAAC;QACjD,CAAC;QAAC,OAAO,KAAK,EAAE,CAAC;YACf,GAAG,CAAC,SAAS,CAAC,GAAG,EAAE,EAAE,cAAc,EAAE,kBAAkB,EAAE,CAAC,CAAC;YAC3D,GAAG,CAAC,GAAG,CAAC,IAAI,CAAC,SAAS,CAAC;gBACrB,OAAO,EAAE,KAAK;gBACd,KAAK,EAAE,6BAA6B;gBACpC,SAAS,EAAE,IAAI,IAAI,EAAE,CAAC,WAAW,EAAE;aACpC,CAAC,CAAC,CAAC;QACN,CAAC;IACH,CAAC;IAEO,eAAe,CAAC,GAAoB,EAAE,GAAmB;QAC/D,2BAA2B;QAC3B,IAAI,CAAC,IAAI,CAAC,aAAa,EAAE,IAAI,CAAC,IAAI,CAAC,aAAa,EAAE,CAAC;YACjD,GAAG,CAAC,SAAS,CAAC,GAAG,EAAE,EAAE,cAAc,EAAE,kBAAkB,EAAE,CAAC,CAAC;YAC3D,GAAG,CAAC,GAAG,CAAC,IAAI,CAAC,SAAS,CAAC,EAAE,KAAK,EAAE,4BAA4B,EAAE,CAAC,CAAC,CAAC;YACjE,OAAO;QACT,CAAC;QAED,oBAAoB;QACpB,IAAI,IAAI,GAAG,EAAE,CAAC;QACd,GAAG,CAAC,EAAE,CAAC,MAAM,EAAE,CAAC,KAAK,EAAE,EAAE;YACvB,IAAI,IAAI,KAAK,CAAC,QAAQ,EAAE,CAAC;QAC3B,CAAC,CAAC,CAAC;QAEH,GAAG,CAAC,EAAE,CAAC,KAAK,EAAE,KAAK,IAAI,EAAE;YACvB,IAAI,CAAC;gBACH,MAAM,MAAM,GAAG,IAAI,CAAC,KAAK,CAAC,IAAI,CAAC,CAAC;gBAChC,MAAM,MAAM,GAAG,MAAM,CAAC,MAAM,CAAC;gBAE7B,IAAI,CAAC,MAAM,EAAE,CAAC;oBACZ,GAAG,CAAC,SAAS,CAAC,GAAG,EAAE,EAAE,cAAc,EAAE,kBAAkB,EAAE,CAAC,CAAC;oBAC3D,GAAG,CAAC,GAAG,CAAC,IAAI,CAAC,SAAS,CAAC,EAAE,KAAK,EAAE,oBAAoB,EAAE,CAAC,CAAC,CAAC;oBACzD,OAAO;gBACT,CAAC;gBAED,MAAM,MAAM,GAAG,MAAM,IAAI,CAAC,aAAc,CAAC,YAAY,CAAC,MAAM,CAAC,CAAC;gBAE9D,IAAI,MAAM,CAAC,OAAO,EAAE,CAAC;oBACnB,oDAAoD;oBACpD,GAAG,CAAC,SAAS,CAAC,GAAG,EAAE;wBACjB,cAAc,EAAE,kBAAkB;wBAClC,YAAY,EAAE,mBAAmB,CAAC,MAAM,CAAC,KAAM,CAAC;qBACjD,CAAC,CAAC;oBACH,GAAG,CAAC,GAAG,CACL,IAAI,CAAC,SAAS,CAAC;wBACb,KAAK,EAAE,MAAM,CAAC,KAAK;wBACnB,SAAS,EAAE,MAAM,CAAC,SAAS;qBAC5B,CAAC,CACH,CAAC;gBACJ,CAAC;qBAAM,CAAC;oBACN,GAAG,CAAC,SAAS,CAAC,GAAG,EAAE,EAAE,cAAc,EAAE,kBAAkB,EAAE,CAAC,CAAC;oBAC3D,GAAG,CAAC,GAAG,CAAC,IAAI,CAAC,SAAS,CAAC,EAAE,KAAK,EAAE,MAAM,CAAC,KAAK,IAAI,gBAAgB,EAAE,CAAC,CAAC,CAAC;gBACvE,CAAC;YACH,CAAC;YAAC,MAAM,CAAC;gBACP,GAAG,CAAC,SAAS,CAAC,GAAG,EAAE,EAAE,cAAc,EAAE,kBAAkB,EAAE,CAAC,CAAC;gBAC3D,GAAG,CAAC,GAAG,CAAC,IAAI,CAAC,SAAS,CAAC,EAAE,KAAK,EAAE,sBAAsB,EAAE,CAAC,CAAC,CAAC;YAC7D,CAAC;QACH,CAAC,CAAC,CAAC;IACL,CAAC;IAED;;OAEG;IACK,YAAY,CAAC,GAAoB;QACvC,iCAAiC;QACjC,MAAM,UAAU,GAAG,GAAG,CAAC,OAAO,CAAC,aAAa,CAAC;QAC7C,IAAI,UAAU,EAAE,CAAC;YACf,MAAM,KAAK,GAAG,UAAU,CAAC,KAAK,CAAC,GAAG,CAAC,CAAC;YACpC,IAAI,KAAK,CAAC,MAAM,KAAK,CAAC,IAAI,KAAK,CAAC,CAAC,CAAC,CAAC,WAAW,EAAE,KAAK,QAAQ,EAAE,CAAC;gBAC9D,OAAO,KAAK,CAAC,CAAC,CAAC,CAAC;YAClB,CAAC;QACH,CAAC;QAED,sBAAsB;QACtB,MAAM,OAAO,GAAG,YAAY,CAAC,GAAG,CAAC,OAAO,CAAC,MAAM,CAAC,CAAC;QACjD,IAAI,OAAO,CAAC,mBAAmB,CAAC,EAAE,CAAC;YACjC,OAAO,OAAO,CAAC,mBAAmB,CAAC,CAAC;QACtC,CAAC;QAED,OAAO,IAAI,CAAC;IACd,CAAC;IAGD;;OAEG;IACK,KAAK,CAAC,oBAAoB,CAAC,GAAoB;QACrD,MAAM,KAAK,GAAG,IAAI,CAAC,YAAY,CAAC,GAAG,CAAC,CAAC;QAErC,IAAI,CAAC,KAAK,EAAE,CAAC;YACX,IAAI,CAAC,QAAQ,CAAC,0CAA0C,CAAC,CAAC;YAC1D,OAAO,EAAE,KAAK,EAAE,KAAK,EAAE,KAAK,EAAE,yBAAyB,EAAE,CAAC;QAC5D,CAAC;QAED,IAAI,CAAC,QAAQ,CAAC,oBAAoB,CAAC,CAAC;QAEpC,4CAA4C;QAC5C,IAAI,IAAI,CAAC,WAAW,EAAE,CAAC;YACrB,MAAM,MAAM,GAAG,MAAM,IAAI,CAAC,WAAW,CAAC,iBAAiB,CAAC,KAAK,CAAC,CAAC;YAC/D,IAAI,MAAM,CAAC,KAAK,EAAE,CAAC;gBACjB,IAAI,CAAC,QAAQ,CAAC,mCAAmC,CAAC,CAAC;gBACnD,OAAO,EAAE,KAAK,EAAE,IAAI,EAAE,KAAK,EAAE,CAAC;YAChC,CAAC;YACD,8EAA8E;YAC9E,IAAI,IAAI,CAAC,aAAa,EAAE,CAAC;gBACvB,MAAM,YAAY,GAAG,MAAM,IAAI,CAAC,aAAa,CAAC,WAAW,CAAC,KAAK,CAAC,CAAC;gBACjE,IAAI,YAAY,CAAC,KAAK,EAAE,CAAC;oBACvB,IAAI,CAAC,QAAQ,CAAC,oCAAoC,CAAC,CAAC;oBACpD,OAAO,EAAE,KAAK,EAAE,IAAI,EAAE,KAAK,EAAE,CAAC;gBAChC,CAAC;YACH,CAAC;YACD,IAAI,CAAC,QAAQ,CAAC,2BAA2B,EAAE,EAAE,KAAK,EAAE,MAAM,CAAC,KAAK,EAAE,CAAC,CAAC;YACpE,OAAO,EAAE,KAAK,EAAE,KAAK,EAAE,KAAK,EAAE,MAAM,CAAC,KAAK,EAAE,CAAC;QAC/C,CAAC;QAED,qCAAqC;QACrC,IAAI,IAAI,CAAC,aAAa,EAAE,CAAC;YACvB,MAAM,MAAM,GAAG,MAAM,IAAI,CAAC,aAAa,CAAC,WAAW,CAAC,KAAK,CAAC,CAAC;YAC3D,IAAI,CAAC,QAAQ,CAAC,wBAAwB,EAAE,EAAE,KAAK,EAAE,MAAM,CAAC,KAAK,EAAE,CAAC,CAAC;YACjE,OAAO,EAAE,KAAK,EAAE,MAAM,CAAC,KAAK,EAAE,KAAK,EAAE,MAAM,CAAC,KAAK,EAAE,KAAK,EAAE,MAAM,CAAC,KAAK,CAAC,CAAC,CAAC,KAAK,CAAC,CAAC,CAAC,SAAS,EAAE,CAAC;QAC/F,CAAC;QAED,IAAI,CAAC,QAAQ,CAAC,8BAA8B,CAAC,CAAC;QAC9C,OAAO,EAAE,KAAK,EAAE,KAAK,EAAE,KAAK,EAAE,8BAA8B,EAAE,CAAC;IACjE,CAAC;IAEO,gBAAgB,CAAC,GAAoB,EAAE,GAAmB;QAChE,kCAAkC;QAClC,IAAI,IAAI,CAAC,aAAa,EAAE,EAAE,CAAC;YACzB,2DAA2D;YAC3D,IAAI,IAAI,CAAC,cAAc,EAAE,IAAI,IAAI,CAAC,WAAW,EAAE,CAAC;gBAC9C,GAAG,CAAC,SAAS,CAAC,kBAAkB,EAAE,IAAI,CAAC,WAAW,CAAC,wBAAwB,EAAE,CAAC,CAAC;YACjF,CAAC;YAED,IAAI,CAAC,oBAAoB,CAAC,GAAG,CAAC,CAAC,IAAI,CAAC,CAAC,MAAM,EAAE,EAAE;gBAC7C,IAAI,CAAC,MAAM,CAAC,KAAK,EAAE,CAAC;oBAClB,GAAG,CAAC,SAAS,CAAC,GAAG,EAAE,EAAE,cAAc,EAAE,kBAAkB,EAAE,CAAC,CAAC;oBAC3D,GAAG,CAAC,GAAG,CACL,IAAI,CAAC,SAAS,CAAC;wBACb,OAAO,EAAE,KAAK;wBACd,EAAE,EAAE,IAAI;wBACR,KAAK,EAAE;4BACL,IAAI,EAAE,CAAC,KAAK;4BACZ,OAAO,EAAE,MAAM,CAAC,KAAK,IAAI,eAAe;yBACzC;qBACF,CAAC,CACH,CAAC;oBACF,OAAO;gBACT,CAAC;gBAED,2DAA2D;gBAC3D,IAAI,MAAM,CAAC,KAAK,IAAI,CAAC,GAAG,CAAC,OAAO,CAAC,MAAM,EAAE,QAAQ,CAAC,mBAAmB,CAAC,EAAE,CAAC;oBACvE,GAAG,CAAC,SAAS,CAAC,YAAY,EAAE,mBAAmB,CAAC,MAAM,CAAC,KAAK,CAAC,CAAC,CAAC;gBACjE,CAAC;gBAED,IAAI,CAAC,iBAAiB,CAAC,GAAG,EAAE,GAAG,CAAC,CAAC;YACnC,CAAC,CAAC,CAAC,KAAK,CAAC,GAAG,EAAE;gBACZ,GAAG,CAAC,SAAS,CAAC,GAAG,EAAE,EAAE,cAAc,EAAE,kBAAkB,EAAE,CAAC,CAAC;gBAC3D,GAAG,CAAC,GAAG,CAAC,IAAI,CAAC,SAAS,CAAC,EAAE,KAAK,EAAE,2BAA2B,EAAE,CAAC,CAAC,CAAC;YAClE,CAAC,CAAC,CAAC;QACL,CAAC;aAAM,CAAC;YACN,IAAI,CAAC,iBAAiB,CAAC,GAAG,EAAE,GAAG,CAAC,CAAC;QACnC,CAAC;IACH,CAAC;IAED;;OAEG;IACK,iBAAiB,CAAC,GAAoB,EAAE,GAAmB;QACjE,IAAI,IAAI,GAAG,EAAE,CAAC;QACd,GAAG,CAAC,EAAE,CAAC,MAAM,EAAE,CAAC,KAAK,EAAE,EAAE;YACvB,IAAI,IAAI,KAAK,CAAC,QAAQ,EAAE,CAAC;QAC3B,CAAC,CAAC,CAAC;QAEH,GAAG,CAAC,EAAE,CAAC,KAAK,EAAE,KAAK,IAAI,EAAE;YACvB,IAAI,CAAC;gBACH,MAAM,OAAO,GAAG,IAAI,CAAC,mBAAmB,CAAC,IAAI,CAAC,CAAC;gBAE/C,IAAI,CAAC,IAAI,CAAC,UAAU,EAAE,CAAC;oBACrB,GAAG,CAAC,SAAS,CAAC,GAAG,EAAE,EAAE,cAAc,EAAE,kBAAkB,EAAE,CAAC,CAAC;oBAC3D,GAAG,CAAC,GAAG,CACL,IAAI,CAAC,SAAS,CAAC;wBACb,OAAO,EAAE,KAAK;wBACd,EAAE,EAAE,OAAO,CAAC,EAAE;wBACd,KAAK,EAAE;4BACL,IAAI,EAAE,CAAC,KAAK;4BACZ,OAAO,EAAE,6BAA6B;yBACvC;qBACF,CAAC,CACH,CAAC;oBACF,OAAO;gBACT,CAAC;gBAED,MAAM,UAAU,GAAe;oBAC7B,OAAO,EAAE,KAAK;oBACd,EAAE,EAAE,OAAO,CAAC,EAAE;oBACd,MAAM,EAAE,OAAO,CAAC,MAAM;oBACtB,MAAM,EAAE,OAAO,CAAC,MAAM;iBACvB,CAAC;gBAEF,MAAM,WAAW,GAAG,MAAM,IAAI,CAAC,UAAU,CAAC,aAAa,CAAC,UAAU,CAAC,CAAC;gBAEpE,GAAG,CAAC,SAAS,CAAC,GAAG,EAAE,EAAE,cAAc,EAAE,kBAAkB,EAAE,CAAC,CAAC;gBAC3D,GAAG,CAAC,GAAG,CAAC,IAAI,CAAC,SAAS,CAAC,WAAW,CAAC,CAAC,CAAC;YACvC,CAAC;YAAC,OAAO,KAAK,EAAE,CAAC;gBACf,GAAG,CAAC,SAAS,CAAC,GAAG,EAAE,EAAE,cAAc,EAAE,kBAAkB,EAAE,CAAC,CAAC;gBAC3D,GAAG,CAAC,GAAG,CACL,IAAI,CAAC,SAAS,CAAC;oBACb,OAAO,EAAE,KAAK;oBACd,EAAE,EAAE,IAAI;oBACR,KAAK,EAAE;wBACL,IAAI,EAAE,CAAC,KAAK;wBACZ,OAAO,EAAE,KAAK,YAAY,KAAK,CAAC,CAAC,CAAC,KAAK,CAAC,OAAO,CAAC,CAAC,CAAC,aAAa;qBAChE;iBACF,CAAC,CACH,CAAC;YACJ,CAAC;QACH,CAAC,CAAC,CAAC;IACL,CAAC;IAEO,mBAAmB,CAAC,IAAY;QAMtC,IAAI,MAAe,CAAC;QACpB,IAAI,CAAC;YACH,MAAM,GAAG,IAAI,CAAC,KAAK,CAAC,IAAI,CAAC,CAAC;QAC5B,CAAC;QAAC,MAAM,CAAC;YACP,MAAM,IAAI,KAAK,CAAC,cAAc,CAAC,CAAC;QAClC,CAAC;QAED,MAAM,OAAO,GAAG,MAAiC,CAAC;QAElD,IAAI,CAAC,OAAO,CAAC,OAAO,IAAI,OAAO,CAAC,OAAO,KAAK,KAAK,EAAE,CAAC;YAClD,MAAM,IAAI,KAAK,CAAC,0BAA0B,CAAC,CAAC;QAC9C,CAAC;QAED,IAAI,OAAO,CAAC,MAAM,KAAK,SAAS,EAAE,CAAC;YACjC,MAAM,IAAI,KAAK,CAAC,0CAA0C,CAAC,CAAC;QAC9D,CAAC;QAED,OAAO;YACL,OAAO,EAAE,KAAK;YACd,EAAE,EAAG,OAAO,CAAC,EAAsB,IAAI,IAAI;YAC3C,MAAM,EAAE,OAAO,CAAC,MAAgB;YAChC,MAAM,EAAE,OAAO,CAAC,MAA6C;SAC9D,CAAC;IACJ,CAAC;CACF;AAED;;GAEG;AACH,MAAM,CAAC,KAAK,UAAU,0BAA0B,CAC9C,UAAuC,EAAE;IAEzC,qBAAqB;IACrB,MAAM,UAAU,GAAG,OAAO,CAAC,UAAU,IAAI,0BAA0B,CAAC;IACpE,MAAM,MAAM,GAAG,MAAM,gBAAgB,CAAC,UAAU,CAAC,CAAC;IAElD,0BAA0B;IAC1B,MAAM,MAAM,GAAG,IAAI,wBAAwB,CAAC,MAAM,EAAE,OAAO,CAAC,CAAC;IAC7D,MAAM,MAAM,CAAC,KAAK,EAAE,CAAC;IAErB,OAAO,MAAM,CAAC;AAChB,CAAC"}
|
|
1
|
+
{"version":3,"file":"http-server-with-config.js","sourceRoot":"","sources":["../../src/cli/http-server-with-config.ts"],"names":[],"mappings":"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"}
|
|
@@ -0,0 +1,57 @@
|
|
|
1
|
+
/**
|
|
2
|
+
* Google OAuth Callback Handler
|
|
3
|
+
* Requirements: FR-1 (OAuth Callback Endpoint), FR-4 (Token Exchange)
|
|
4
|
+
*
|
|
5
|
+
* Handles HTTP callbacks from Google OAuth for remote server mode.
|
|
6
|
+
* Processes authorization codes, exchanges for tokens, and renders
|
|
7
|
+
* success/error pages to the browser.
|
|
8
|
+
*/
|
|
9
|
+
import type { IncomingMessage, ServerResponse } from 'http';
|
|
10
|
+
import { PendingGoogleAuthStore } from './pending-google-auth-store.js';
|
|
11
|
+
import { GoogleOAuthHandler } from './google-oauth-handler.js';
|
|
12
|
+
/**
|
|
13
|
+
* Options for GoogleOAuthCallbackHandler
|
|
14
|
+
*/
|
|
15
|
+
export interface GoogleOAuthCallbackHandlerOptions {
|
|
16
|
+
pendingAuthStore: PendingGoogleAuthStore;
|
|
17
|
+
googleOAuthHandler: GoogleOAuthHandler;
|
|
18
|
+
}
|
|
19
|
+
/**
|
|
20
|
+
* Google OAuth Callback Handler
|
|
21
|
+
*
|
|
22
|
+
* Processes OAuth callbacks from Google and exchanges
|
|
23
|
+
* authorization codes for tokens.
|
|
24
|
+
*/
|
|
25
|
+
export declare class GoogleOAuthCallbackHandler {
|
|
26
|
+
private readonly pendingAuthStore;
|
|
27
|
+
private readonly googleOAuthHandler;
|
|
28
|
+
constructor(options: GoogleOAuthCallbackHandlerOptions);
|
|
29
|
+
/**
|
|
30
|
+
* Handle OAuth callback request
|
|
31
|
+
*
|
|
32
|
+
* @param req - HTTP request
|
|
33
|
+
* @param res - HTTP response
|
|
34
|
+
*/
|
|
35
|
+
handleCallback(req: IncomingMessage, res: ServerResponse): Promise<void>;
|
|
36
|
+
/**
|
|
37
|
+
* Parse callback parameters from URL
|
|
38
|
+
*/
|
|
39
|
+
private parseCallbackParams;
|
|
40
|
+
/**
|
|
41
|
+
* Exchange authorization code for tokens
|
|
42
|
+
*/
|
|
43
|
+
private exchangeCodeForTokens;
|
|
44
|
+
/**
|
|
45
|
+
* Render success HTML page
|
|
46
|
+
*/
|
|
47
|
+
private renderSuccessPage;
|
|
48
|
+
/**
|
|
49
|
+
* Render error HTML page
|
|
50
|
+
*/
|
|
51
|
+
private renderErrorPage;
|
|
52
|
+
/**
|
|
53
|
+
* Escape HTML special characters
|
|
54
|
+
*/
|
|
55
|
+
private escapeHtml;
|
|
56
|
+
}
|
|
57
|
+
//# sourceMappingURL=google-oauth-callback-handler.d.ts.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"google-oauth-callback-handler.d.ts","sourceRoot":"","sources":["../../src/oauth/google-oauth-callback-handler.ts"],"names":[],"mappings":"AAAA;;;;;;;GAOG;AAEH,OAAO,KAAK,EAAE,eAAe,EAAE,cAAc,EAAE,MAAM,MAAM,CAAC;AAE5D,OAAO,EAAE,sBAAsB,EAAqB,MAAM,gCAAgC,CAAC;AAC3F,OAAO,EAAE,kBAAkB,EAAE,MAAM,2BAA2B,CAAC;AAG/D;;GAEG;AACH,MAAM,WAAW,iCAAiC;IAChD,gBAAgB,EAAE,sBAAsB,CAAC;IACzC,kBAAkB,EAAE,kBAAkB,CAAC;CACxC;AAYD;;;;;GAKG;AACH,qBAAa,0BAA0B;IACrC,OAAO,CAAC,QAAQ,CAAC,gBAAgB,CAAyB;IAC1D,OAAO,CAAC,QAAQ,CAAC,kBAAkB,CAAqB;gBAE5C,OAAO,EAAE,iCAAiC;IAKtD;;;;;OAKG;IACG,cAAc,CAAC,GAAG,EAAE,eAAe,EAAE,GAAG,EAAE,cAAc,GAAG,OAAO,CAAC,IAAI,CAAC;IAwD9E;;OAEG;IACH,OAAO,CAAC,mBAAmB;IAkB3B;;OAEG;YACW,qBAAqB;IAmCnC;;OAEG;IACH,OAAO,CAAC,iBAAiB;IAyEzB;;OAEG;IACH,OAAO,CAAC,eAAe;IAyFvB;;OAEG;IACH,OAAO,CAAC,UAAU;CAQnB"}
|
|
@@ -0,0 +1,291 @@
|
|
|
1
|
+
/**
|
|
2
|
+
* Google OAuth Callback Handler
|
|
3
|
+
* Requirements: FR-1 (OAuth Callback Endpoint), FR-4 (Token Exchange)
|
|
4
|
+
*
|
|
5
|
+
* Handles HTTP callbacks from Google OAuth for remote server mode.
|
|
6
|
+
* Processes authorization codes, exchanges for tokens, and renders
|
|
7
|
+
* success/error pages to the browser.
|
|
8
|
+
*/
|
|
9
|
+
import { URL } from 'url';
|
|
10
|
+
import { oauthLogger } from '../utils/logger.js';
|
|
11
|
+
/**
|
|
12
|
+
* Google OAuth Callback Handler
|
|
13
|
+
*
|
|
14
|
+
* Processes OAuth callbacks from Google and exchanges
|
|
15
|
+
* authorization codes for tokens.
|
|
16
|
+
*/
|
|
17
|
+
export class GoogleOAuthCallbackHandler {
|
|
18
|
+
pendingAuthStore;
|
|
19
|
+
googleOAuthHandler;
|
|
20
|
+
constructor(options) {
|
|
21
|
+
this.pendingAuthStore = options.pendingAuthStore;
|
|
22
|
+
this.googleOAuthHandler = options.googleOAuthHandler;
|
|
23
|
+
}
|
|
24
|
+
/**
|
|
25
|
+
* Handle OAuth callback request
|
|
26
|
+
*
|
|
27
|
+
* @param req - HTTP request
|
|
28
|
+
* @param res - HTTP response
|
|
29
|
+
*/
|
|
30
|
+
async handleCallback(req, res) {
|
|
31
|
+
try {
|
|
32
|
+
const params = this.parseCallbackParams(req.url || '');
|
|
33
|
+
oauthLogger.info({ state: params.state, hasCode: !!params.code, error: params.error }, 'Processing OAuth callback');
|
|
34
|
+
// Check for OAuth error
|
|
35
|
+
if (params.error) {
|
|
36
|
+
const errorMessage = params.error === 'access_denied'
|
|
37
|
+
? '認証が拒否されました。'
|
|
38
|
+
: `OAuth エラー: ${params.error}`;
|
|
39
|
+
this.renderErrorPage(res, errorMessage, params.errorDescription);
|
|
40
|
+
return;
|
|
41
|
+
}
|
|
42
|
+
// Validate required parameters
|
|
43
|
+
if (!params.state) {
|
|
44
|
+
this.renderErrorPage(res, '認証セッションが見つかりません。', 'state パラメータがありません。');
|
|
45
|
+
return;
|
|
46
|
+
}
|
|
47
|
+
if (!params.code) {
|
|
48
|
+
this.renderErrorPage(res, '認証コードが見つかりません。', 'code パラメータがありません。');
|
|
49
|
+
return;
|
|
50
|
+
}
|
|
51
|
+
// Find pending session
|
|
52
|
+
const session = this.pendingAuthStore.findByState(params.state);
|
|
53
|
+
if (!session) {
|
|
54
|
+
this.renderErrorPage(res, '認証セッションが見つかりません。', 'セッションが期限切れか、無効な state です。再度認証を開始してください。');
|
|
55
|
+
return;
|
|
56
|
+
}
|
|
57
|
+
// Exchange code for tokens
|
|
58
|
+
await this.exchangeCodeForTokens(params.code, session);
|
|
59
|
+
// Remove session after successful exchange
|
|
60
|
+
this.pendingAuthStore.remove(params.state);
|
|
61
|
+
// Render success page
|
|
62
|
+
this.renderSuccessPage(res);
|
|
63
|
+
oauthLogger.info({ state: params.state }, 'OAuth callback completed successfully');
|
|
64
|
+
}
|
|
65
|
+
catch (error) {
|
|
66
|
+
oauthLogger.error({ err: error }, 'OAuth callback failed');
|
|
67
|
+
const errorMessage = error instanceof Error ? error.message : 'Unknown error';
|
|
68
|
+
this.renderErrorPage(res, '認証に失敗しました。', errorMessage);
|
|
69
|
+
}
|
|
70
|
+
}
|
|
71
|
+
/**
|
|
72
|
+
* Parse callback parameters from URL
|
|
73
|
+
*/
|
|
74
|
+
parseCallbackParams(urlString) {
|
|
75
|
+
try {
|
|
76
|
+
// Handle relative URLs by adding a base
|
|
77
|
+
const url = new URL(urlString, 'http://localhost');
|
|
78
|
+
const searchParams = url.searchParams;
|
|
79
|
+
return {
|
|
80
|
+
code: searchParams.get('code') || undefined,
|
|
81
|
+
state: searchParams.get('state') || undefined,
|
|
82
|
+
error: searchParams.get('error') || undefined,
|
|
83
|
+
errorDescription: searchParams.get('error_description') || undefined,
|
|
84
|
+
};
|
|
85
|
+
}
|
|
86
|
+
catch (error) {
|
|
87
|
+
oauthLogger.error({ err: error, url: urlString }, 'Failed to parse callback URL');
|
|
88
|
+
return {};
|
|
89
|
+
}
|
|
90
|
+
}
|
|
91
|
+
/**
|
|
92
|
+
* Exchange authorization code for tokens
|
|
93
|
+
*/
|
|
94
|
+
async exchangeCodeForTokens(code, session) {
|
|
95
|
+
// Use googleapis directly for token exchange since we have the code_verifier
|
|
96
|
+
// stored in the session (GoogleOAuthHandler requires calling getAuthorizationUrl()
|
|
97
|
+
// first to set its internal codeVerifier, which doesn't work for remote mode)
|
|
98
|
+
const { google } = await import('googleapis');
|
|
99
|
+
const oauth2Client = new google.auth.OAuth2(process.env.GOOGLE_CLIENT_ID, process.env.GOOGLE_CLIENT_SECRET, session.redirectUri);
|
|
100
|
+
const { tokens } = await oauth2Client.getToken({
|
|
101
|
+
code,
|
|
102
|
+
codeVerifier: session.codeVerifier,
|
|
103
|
+
});
|
|
104
|
+
if (!tokens.access_token || !tokens.refresh_token) {
|
|
105
|
+
throw new Error('トークンの取得に失敗しました。access_token または refresh_token がありません。');
|
|
106
|
+
}
|
|
107
|
+
// Store tokens using the GoogleOAuthHandler
|
|
108
|
+
await this.googleOAuthHandler.storeTokens({
|
|
109
|
+
accessToken: tokens.access_token,
|
|
110
|
+
refreshToken: tokens.refresh_token,
|
|
111
|
+
expiresAt: tokens.expiry_date || Date.now() + 3600 * 1000,
|
|
112
|
+
scope: tokens.scope ? tokens.scope.split(' ') : ['https://www.googleapis.com/auth/calendar'],
|
|
113
|
+
});
|
|
114
|
+
oauthLogger.info('Tokens exchanged and stored successfully');
|
|
115
|
+
}
|
|
116
|
+
/**
|
|
117
|
+
* Render success HTML page
|
|
118
|
+
*/
|
|
119
|
+
renderSuccessPage(res) {
|
|
120
|
+
const html = `<!DOCTYPE html>
|
|
121
|
+
<html lang="ja">
|
|
122
|
+
<head>
|
|
123
|
+
<title>sage - Google Calendar 認証完了</title>
|
|
124
|
+
<meta charset="utf-8">
|
|
125
|
+
<meta name="viewport" content="width=device-width, initial-scale=1">
|
|
126
|
+
<style>
|
|
127
|
+
* { box-sizing: border-box; margin: 0; padding: 0; }
|
|
128
|
+
body {
|
|
129
|
+
font-family: -apple-system, BlinkMacSystemFont, 'Segoe UI', Roboto, 'Helvetica Neue', Arial, sans-serif;
|
|
130
|
+
text-align: center;
|
|
131
|
+
padding: 50px 20px;
|
|
132
|
+
background: linear-gradient(135deg, #f5f7fa 0%, #c3cfe2 100%);
|
|
133
|
+
min-height: 100vh;
|
|
134
|
+
display: flex;
|
|
135
|
+
align-items: center;
|
|
136
|
+
justify-content: center;
|
|
137
|
+
}
|
|
138
|
+
.container {
|
|
139
|
+
max-width: 400px;
|
|
140
|
+
background: white;
|
|
141
|
+
padding: 40px;
|
|
142
|
+
border-radius: 16px;
|
|
143
|
+
box-shadow: 0 10px 40px rgba(0, 0, 0, 0.1);
|
|
144
|
+
}
|
|
145
|
+
.success-icon {
|
|
146
|
+
width: 80px;
|
|
147
|
+
height: 80px;
|
|
148
|
+
background: #22c55e;
|
|
149
|
+
border-radius: 50%;
|
|
150
|
+
display: flex;
|
|
151
|
+
align-items: center;
|
|
152
|
+
justify-content: center;
|
|
153
|
+
margin: 0 auto 24px;
|
|
154
|
+
}
|
|
155
|
+
.success-icon svg {
|
|
156
|
+
width: 40px;
|
|
157
|
+
height: 40px;
|
|
158
|
+
stroke: white;
|
|
159
|
+
stroke-width: 3;
|
|
160
|
+
fill: none;
|
|
161
|
+
}
|
|
162
|
+
h1 {
|
|
163
|
+
color: #111827;
|
|
164
|
+
font-size: 24px;
|
|
165
|
+
margin-bottom: 12px;
|
|
166
|
+
}
|
|
167
|
+
p {
|
|
168
|
+
color: #6b7280;
|
|
169
|
+
font-size: 16px;
|
|
170
|
+
line-height: 1.5;
|
|
171
|
+
}
|
|
172
|
+
</style>
|
|
173
|
+
</head>
|
|
174
|
+
<body>
|
|
175
|
+
<div class="container">
|
|
176
|
+
<div class="success-icon">
|
|
177
|
+
<svg viewBox="0 0 24 24"><polyline points="20 6 9 17 4 12"></polyline></svg>
|
|
178
|
+
</div>
|
|
179
|
+
<h1>認証が完了しました</h1>
|
|
180
|
+
<p>このウィンドウを閉じて、Claude に戻ってください。</p>
|
|
181
|
+
</div>
|
|
182
|
+
</body>
|
|
183
|
+
</html>`;
|
|
184
|
+
res.writeHead(200, {
|
|
185
|
+
'Content-Type': 'text/html; charset=utf-8',
|
|
186
|
+
'Cache-Control': 'no-store',
|
|
187
|
+
});
|
|
188
|
+
res.end(html);
|
|
189
|
+
}
|
|
190
|
+
/**
|
|
191
|
+
* Render error HTML page
|
|
192
|
+
*/
|
|
193
|
+
renderErrorPage(res, error, detail) {
|
|
194
|
+
const detailHtml = detail
|
|
195
|
+
? `<div class="error-detail">${this.escapeHtml(detail)}</div>`
|
|
196
|
+
: '';
|
|
197
|
+
const html = `<!DOCTYPE html>
|
|
198
|
+
<html lang="ja">
|
|
199
|
+
<head>
|
|
200
|
+
<title>sage - Google Calendar 認証エラー</title>
|
|
201
|
+
<meta charset="utf-8">
|
|
202
|
+
<meta name="viewport" content="width=device-width, initial-scale=1">
|
|
203
|
+
<style>
|
|
204
|
+
* { box-sizing: border-box; margin: 0; padding: 0; }
|
|
205
|
+
body {
|
|
206
|
+
font-family: -apple-system, BlinkMacSystemFont, 'Segoe UI', Roboto, 'Helvetica Neue', Arial, sans-serif;
|
|
207
|
+
text-align: center;
|
|
208
|
+
padding: 50px 20px;
|
|
209
|
+
background: linear-gradient(135deg, #fef2f2 0%, #fee2e2 100%);
|
|
210
|
+
min-height: 100vh;
|
|
211
|
+
display: flex;
|
|
212
|
+
align-items: center;
|
|
213
|
+
justify-content: center;
|
|
214
|
+
}
|
|
215
|
+
.container {
|
|
216
|
+
max-width: 400px;
|
|
217
|
+
background: white;
|
|
218
|
+
padding: 40px;
|
|
219
|
+
border-radius: 16px;
|
|
220
|
+
box-shadow: 0 10px 40px rgba(0, 0, 0, 0.1);
|
|
221
|
+
}
|
|
222
|
+
.error-icon {
|
|
223
|
+
width: 80px;
|
|
224
|
+
height: 80px;
|
|
225
|
+
background: #ef4444;
|
|
226
|
+
border-radius: 50%;
|
|
227
|
+
display: flex;
|
|
228
|
+
align-items: center;
|
|
229
|
+
justify-content: center;
|
|
230
|
+
margin: 0 auto 24px;
|
|
231
|
+
}
|
|
232
|
+
.error-icon svg {
|
|
233
|
+
width: 40px;
|
|
234
|
+
height: 40px;
|
|
235
|
+
stroke: white;
|
|
236
|
+
stroke-width: 3;
|
|
237
|
+
fill: none;
|
|
238
|
+
}
|
|
239
|
+
h1 {
|
|
240
|
+
color: #111827;
|
|
241
|
+
font-size: 24px;
|
|
242
|
+
margin-bottom: 12px;
|
|
243
|
+
}
|
|
244
|
+
p {
|
|
245
|
+
color: #6b7280;
|
|
246
|
+
font-size: 16px;
|
|
247
|
+
line-height: 1.5;
|
|
248
|
+
margin-bottom: 16px;
|
|
249
|
+
}
|
|
250
|
+
.error-detail {
|
|
251
|
+
background: #fef2f2;
|
|
252
|
+
color: #991b1b;
|
|
253
|
+
padding: 12px 16px;
|
|
254
|
+
border-radius: 8px;
|
|
255
|
+
font-size: 14px;
|
|
256
|
+
text-align: left;
|
|
257
|
+
word-break: break-word;
|
|
258
|
+
}
|
|
259
|
+
</style>
|
|
260
|
+
</head>
|
|
261
|
+
<body>
|
|
262
|
+
<div class="container">
|
|
263
|
+
<div class="error-icon">
|
|
264
|
+
<svg viewBox="0 0 24 24"><line x1="18" y1="6" x2="6" y2="18"></line><line x1="6" y1="6" x2="18" y2="18"></line></svg>
|
|
265
|
+
</div>
|
|
266
|
+
<h1>認証に失敗しました</h1>
|
|
267
|
+
<p>${this.escapeHtml(error)}</p>
|
|
268
|
+
${detailHtml}
|
|
269
|
+
<p style="margin-top: 16px;">Claude に戻って再試行してください。</p>
|
|
270
|
+
</div>
|
|
271
|
+
</body>
|
|
272
|
+
</html>`;
|
|
273
|
+
res.writeHead(200, {
|
|
274
|
+
'Content-Type': 'text/html; charset=utf-8',
|
|
275
|
+
'Cache-Control': 'no-store',
|
|
276
|
+
});
|
|
277
|
+
res.end(html);
|
|
278
|
+
}
|
|
279
|
+
/**
|
|
280
|
+
* Escape HTML special characters
|
|
281
|
+
*/
|
|
282
|
+
escapeHtml(text) {
|
|
283
|
+
return text
|
|
284
|
+
.replace(/&/g, '&')
|
|
285
|
+
.replace(/</g, '<')
|
|
286
|
+
.replace(/>/g, '>')
|
|
287
|
+
.replace(/"/g, '"')
|
|
288
|
+
.replace(/'/g, ''');
|
|
289
|
+
}
|
|
290
|
+
}
|
|
291
|
+
//# sourceMappingURL=google-oauth-callback-handler.js.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"google-oauth-callback-handler.js","sourceRoot":"","sources":["../../src/oauth/google-oauth-callback-handler.ts"],"names":[],"mappings":"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"}
|
package/dist/oauth/index.d.ts
CHANGED
|
@@ -13,4 +13,6 @@ export { OAuthHandler, createOAuthHandler, OAuthHandlerConfig } from './oauth-ha
|
|
|
13
13
|
export { FileMutex, FileMutexMetrics } from './file-mutex.js';
|
|
14
14
|
export { OAuthCallbackServer, OAuthCallbackServerOptions, CallbackResult, } from './oauth-callback-server.js';
|
|
15
15
|
export { GoogleOAuthHandler, GoogleOAuthConfig, GoogleOAuthTokens } from './google-oauth-handler.js';
|
|
16
|
+
export { PendingGoogleAuthStore, PendingGoogleAuth, CreatePendingAuthResult, } from './pending-google-auth-store.js';
|
|
17
|
+
export { GoogleOAuthCallbackHandler, GoogleOAuthCallbackHandlerOptions, } from './google-oauth-callback-handler.js';
|
|
16
18
|
//# sourceMappingURL=index.d.ts.map
|
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"index.d.ts","sourceRoot":"","sources":["../../src/oauth/index.ts"],"names":[],"mappings":"AAAA;;;GAGG;AAGH,cAAc,YAAY,CAAC;AAG3B,OAAO,EAAE,oBAAoB,EAAE,qBAAqB,EAAE,mBAAmB,EAAE,mBAAmB,EAAE,oBAAoB,EAAE,MAAM,WAAW,CAAC;AAGxI,OAAO,EAAE,kBAAkB,EAAE,eAAe,EAAE,YAAY,EAAE,MAAM,oBAAoB,CAAC;AAGvF,OAAO,EAAE,4BAA4B,EAAE,sBAAsB,EAAE,MAAM,iBAAiB,CAAC;AAGvF,OAAO,EAAE,uBAAuB,EAAE,iBAAiB,EAAE,MAAM,0BAA0B,CAAC;AAGtF,OAAO,EAAE,iBAAiB,EAAE,WAAW,EAAE,MAAM,mBAAmB,CAAC;AAGnE,OAAO,EAAE,WAAW,EAAE,iBAAiB,EAAE,iBAAiB,EAAE,MAAM,mBAAmB,CAAC;AAGtF,OAAO,EAAE,YAAY,EAAE,kBAAkB,EAAE,kBAAkB,EAAE,MAAM,oBAAoB,CAAC;AAG1F,OAAO,EAAE,SAAS,EAAE,gBAAgB,EAAE,MAAM,iBAAiB,CAAC;AAG9D,OAAO,EACL,mBAAmB,EACnB,0BAA0B,EAC1B,cAAc,GACf,MAAM,4BAA4B,CAAC;AAGpC,OAAO,EAAE,kBAAkB,EAAE,iBAAiB,EAAE,iBAAiB,EAAE,MAAM,2BAA2B,CAAC"}
|
|
1
|
+
{"version":3,"file":"index.d.ts","sourceRoot":"","sources":["../../src/oauth/index.ts"],"names":[],"mappings":"AAAA;;;GAGG;AAGH,cAAc,YAAY,CAAC;AAG3B,OAAO,EAAE,oBAAoB,EAAE,qBAAqB,EAAE,mBAAmB,EAAE,mBAAmB,EAAE,oBAAoB,EAAE,MAAM,WAAW,CAAC;AAGxI,OAAO,EAAE,kBAAkB,EAAE,eAAe,EAAE,YAAY,EAAE,MAAM,oBAAoB,CAAC;AAGvF,OAAO,EAAE,4BAA4B,EAAE,sBAAsB,EAAE,MAAM,iBAAiB,CAAC;AAGvF,OAAO,EAAE,uBAAuB,EAAE,iBAAiB,EAAE,MAAM,0BAA0B,CAAC;AAGtF,OAAO,EAAE,iBAAiB,EAAE,WAAW,EAAE,MAAM,mBAAmB,CAAC;AAGnE,OAAO,EAAE,WAAW,EAAE,iBAAiB,EAAE,iBAAiB,EAAE,MAAM,mBAAmB,CAAC;AAGtF,OAAO,EAAE,YAAY,EAAE,kBAAkB,EAAE,kBAAkB,EAAE,MAAM,oBAAoB,CAAC;AAG1F,OAAO,EAAE,SAAS,EAAE,gBAAgB,EAAE,MAAM,iBAAiB,CAAC;AAG9D,OAAO,EACL,mBAAmB,EACnB,0BAA0B,EAC1B,cAAc,GACf,MAAM,4BAA4B,CAAC;AAGpC,OAAO,EAAE,kBAAkB,EAAE,iBAAiB,EAAE,iBAAiB,EAAE,MAAM,2BAA2B,CAAC;AAGrG,OAAO,EACL,sBAAsB,EACtB,iBAAiB,EACjB,uBAAuB,GACxB,MAAM,gCAAgC,CAAC;AAGxC,OAAO,EACL,0BAA0B,EAC1B,iCAAiC,GAClC,MAAM,oCAAoC,CAAC"}
|
package/dist/oauth/index.js
CHANGED
|
@@ -24,4 +24,8 @@ export { FileMutex } from './file-mutex.js';
|
|
|
24
24
|
export { OAuthCallbackServer, } from './oauth-callback-server.js';
|
|
25
25
|
// Google OAuth Handler
|
|
26
26
|
export { GoogleOAuthHandler } from './google-oauth-handler.js';
|
|
27
|
+
// Pending Google Auth Store (for remote OAuth mode)
|
|
28
|
+
export { PendingGoogleAuthStore, } from './pending-google-auth-store.js';
|
|
29
|
+
// Google OAuth Callback Handler (for remote OAuth mode)
|
|
30
|
+
export { GoogleOAuthCallbackHandler, } from './google-oauth-callback-handler.js';
|
|
27
31
|
//# sourceMappingURL=index.js.map
|
package/dist/oauth/index.js.map
CHANGED
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"index.js","sourceRoot":"","sources":["../../src/oauth/index.ts"],"names":[],"mappings":"AAAA;;;GAGG;AAEH,QAAQ;AACR,cAAc,YAAY,CAAC;AAE3B,OAAO;AACP,OAAO,EAAE,oBAAoB,EAAE,qBAAqB,EAAE,mBAAmB,EAAE,mBAAmB,EAAE,oBAAoB,EAAE,MAAM,WAAW,CAAC;AAExI,gBAAgB;AAChB,OAAO,EAAE,kBAAkB,EAAE,eAAe,EAAgB,MAAM,oBAAoB,CAAC;AAEvF,2BAA2B;AAC3B,OAAO,EAAE,4BAA4B,EAA0B,MAAM,iBAAiB,CAAC;AAEvF,sBAAsB;AACtB,OAAO,EAAE,uBAAuB,EAAqB,MAAM,0BAA0B,CAAC;AAEtF,eAAe;AACf,OAAO,EAAE,iBAAiB,EAAe,MAAM,mBAAmB,CAAC;AAEnE,eAAe;AACf,OAAO,EAAE,WAAW,EAAE,iBAAiB,EAAqB,MAAM,mBAAmB,CAAC;AAEtF,gBAAgB;AAChB,OAAO,EAAE,YAAY,EAAE,kBAAkB,EAAsB,MAAM,oBAAoB,CAAC;AAE1F,+CAA+C;AAC/C,OAAO,EAAE,SAAS,EAAoB,MAAM,iBAAiB,CAAC;AAE9D,gDAAgD;AAChD,OAAO,EACL,mBAAmB,GAGpB,MAAM,4BAA4B,CAAC;AAEpC,uBAAuB;AACvB,OAAO,EAAE,kBAAkB,EAAwC,MAAM,2BAA2B,CAAC"}
|
|
1
|
+
{"version":3,"file":"index.js","sourceRoot":"","sources":["../../src/oauth/index.ts"],"names":[],"mappings":"AAAA;;;GAGG;AAEH,QAAQ;AACR,cAAc,YAAY,CAAC;AAE3B,OAAO;AACP,OAAO,EAAE,oBAAoB,EAAE,qBAAqB,EAAE,mBAAmB,EAAE,mBAAmB,EAAE,oBAAoB,EAAE,MAAM,WAAW,CAAC;AAExI,gBAAgB;AAChB,OAAO,EAAE,kBAAkB,EAAE,eAAe,EAAgB,MAAM,oBAAoB,CAAC;AAEvF,2BAA2B;AAC3B,OAAO,EAAE,4BAA4B,EAA0B,MAAM,iBAAiB,CAAC;AAEvF,sBAAsB;AACtB,OAAO,EAAE,uBAAuB,EAAqB,MAAM,0BAA0B,CAAC;AAEtF,eAAe;AACf,OAAO,EAAE,iBAAiB,EAAe,MAAM,mBAAmB,CAAC;AAEnE,eAAe;AACf,OAAO,EAAE,WAAW,EAAE,iBAAiB,EAAqB,MAAM,mBAAmB,CAAC;AAEtF,gBAAgB;AAChB,OAAO,EAAE,YAAY,EAAE,kBAAkB,EAAsB,MAAM,oBAAoB,CAAC;AAE1F,+CAA+C;AAC/C,OAAO,EAAE,SAAS,EAAoB,MAAM,iBAAiB,CAAC;AAE9D,gDAAgD;AAChD,OAAO,EACL,mBAAmB,GAGpB,MAAM,4BAA4B,CAAC;AAEpC,uBAAuB;AACvB,OAAO,EAAE,kBAAkB,EAAwC,MAAM,2BAA2B,CAAC;AAErG,oDAAoD;AACpD,OAAO,EACL,sBAAsB,GAGvB,MAAM,gCAAgC,CAAC;AAExC,wDAAwD;AACxD,OAAO,EACL,0BAA0B,GAE3B,MAAM,oCAAoC,CAAC"}
|
|
@@ -0,0 +1,88 @@
|
|
|
1
|
+
/**
|
|
2
|
+
* Pending Google Auth Store
|
|
3
|
+
* Requirements: FR-3 (Pending Auth Session Management)
|
|
4
|
+
*
|
|
5
|
+
* Manages pending Google OAuth authentication sessions for remote mode.
|
|
6
|
+
* Sessions are stored encrypted and expire after a configurable timeout.
|
|
7
|
+
*/
|
|
8
|
+
/**
|
|
9
|
+
* Pending Google Auth Session
|
|
10
|
+
*/
|
|
11
|
+
export interface PendingGoogleAuth {
|
|
12
|
+
state: string;
|
|
13
|
+
codeVerifier: string;
|
|
14
|
+
redirectUri: string;
|
|
15
|
+
createdAt: number;
|
|
16
|
+
expiresAt: number;
|
|
17
|
+
}
|
|
18
|
+
/**
|
|
19
|
+
* Result of creating a new pending auth session
|
|
20
|
+
*/
|
|
21
|
+
export interface CreatePendingAuthResult {
|
|
22
|
+
state: string;
|
|
23
|
+
codeVerifier: string;
|
|
24
|
+
codeChallenge: string;
|
|
25
|
+
}
|
|
26
|
+
/**
|
|
27
|
+
* Pending Google Auth Store
|
|
28
|
+
*
|
|
29
|
+
* Manages pending OAuth sessions with encrypted persistence.
|
|
30
|
+
*/
|
|
31
|
+
export declare class PendingGoogleAuthStore {
|
|
32
|
+
private sessions;
|
|
33
|
+
private readonly storagePath;
|
|
34
|
+
private readonly encryptionService;
|
|
35
|
+
private readonly sessionTimeoutMs;
|
|
36
|
+
private cleanupTimer;
|
|
37
|
+
private initialized;
|
|
38
|
+
constructor(encryptionKey?: string);
|
|
39
|
+
/**
|
|
40
|
+
* Initialize the store and start cleanup timer
|
|
41
|
+
*/
|
|
42
|
+
initialize(): Promise<void>;
|
|
43
|
+
/**
|
|
44
|
+
* Create a new pending auth session
|
|
45
|
+
*
|
|
46
|
+
* @param redirectUri - The OAuth callback URL
|
|
47
|
+
* @returns Session state, code_verifier, and code_challenge
|
|
48
|
+
*/
|
|
49
|
+
create(redirectUri: string): CreatePendingAuthResult;
|
|
50
|
+
/**
|
|
51
|
+
* Find a session by state
|
|
52
|
+
*
|
|
53
|
+
* @param state - The session state (UUID)
|
|
54
|
+
* @returns The session or null if not found/expired
|
|
55
|
+
*/
|
|
56
|
+
findByState(state: string): PendingGoogleAuth | null;
|
|
57
|
+
/**
|
|
58
|
+
* Remove a session by state
|
|
59
|
+
*
|
|
60
|
+
* @param state - The session state to remove
|
|
61
|
+
*/
|
|
62
|
+
remove(state: string): void;
|
|
63
|
+
/**
|
|
64
|
+
* Clean up expired sessions
|
|
65
|
+
*/
|
|
66
|
+
cleanupExpired(): void;
|
|
67
|
+
/**
|
|
68
|
+
* Get session timeout in seconds
|
|
69
|
+
*/
|
|
70
|
+
getSessionTimeoutSeconds(): number;
|
|
71
|
+
/**
|
|
72
|
+
* Persist sessions to encrypted file
|
|
73
|
+
*/
|
|
74
|
+
persist(): Promise<void>;
|
|
75
|
+
/**
|
|
76
|
+
* Load sessions from encrypted file
|
|
77
|
+
*/
|
|
78
|
+
load(): Promise<void>;
|
|
79
|
+
/**
|
|
80
|
+
* Shutdown the store and stop cleanup timer
|
|
81
|
+
*/
|
|
82
|
+
shutdown(): Promise<void>;
|
|
83
|
+
/**
|
|
84
|
+
* Get the number of active sessions
|
|
85
|
+
*/
|
|
86
|
+
getSessionCount(): number;
|
|
87
|
+
}
|
|
88
|
+
//# sourceMappingURL=pending-google-auth-store.d.ts.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"pending-google-auth-store.d.ts","sourceRoot":"","sources":["../../src/oauth/pending-google-auth-store.ts"],"names":[],"mappings":"AAAA;;;;;;GAMG;AASH;;GAEG;AACH,MAAM,WAAW,iBAAiB;IAChC,KAAK,EAAE,MAAM,CAAC;IACd,YAAY,EAAE,MAAM,CAAC;IACrB,WAAW,EAAE,MAAM,CAAC;IACpB,SAAS,EAAE,MAAM,CAAC;IAClB,SAAS,EAAE,MAAM,CAAC;CACnB;AAUD;;GAEG;AACH,MAAM,WAAW,uBAAuB;IACtC,KAAK,EAAE,MAAM,CAAC;IACd,YAAY,EAAE,MAAM,CAAC;IACrB,aAAa,EAAE,MAAM,CAAC;CACvB;AAYD;;;;GAIG;AACH,qBAAa,sBAAsB;IACjC,OAAO,CAAC,QAAQ,CAA6C;IAC7D,OAAO,CAAC,QAAQ,CAAC,WAAW,CAAS;IACrC,OAAO,CAAC,QAAQ,CAAC,iBAAiB,CAAoB;IACtD,OAAO,CAAC,QAAQ,CAAC,gBAAgB,CAAS;IAC1C,OAAO,CAAC,YAAY,CAA+B;IACnD,OAAO,CAAC,WAAW,CAAkB;gBAEzB,aAAa,CAAC,EAAE,MAAM;IAalC;;OAEG;IACG,UAAU,IAAI,OAAO,CAAC,IAAI,CAAC;IAoBjC;;;;;OAKG;IACH,MAAM,CAAC,WAAW,EAAE,MAAM,GAAG,uBAAuB;IA8BpD;;;;;OAKG;IACH,WAAW,CAAC,KAAK,EAAE,MAAM,GAAG,iBAAiB,GAAG,IAAI;IAiBpD;;;;OAIG;IACH,MAAM,CAAC,KAAK,EAAE,MAAM,GAAG,IAAI;IAa3B;;OAEG;IACH,cAAc,IAAI,IAAI;IAqBtB;;OAEG;IACH,wBAAwB,IAAI,MAAM;IAIlC;;OAEG;IACG,OAAO,IAAI,OAAO,CAAC,IAAI,CAAC;IAmB9B;;OAEG;IACG,IAAI,IAAI,OAAO,CAAC,IAAI,CAAC;IA+B3B;;OAEG;IACG,QAAQ,IAAI,OAAO,CAAC,IAAI,CAAC;IAY/B;;OAEG;IACH,eAAe,IAAI,MAAM;CAG1B"}
|
|
@@ -0,0 +1,218 @@
|
|
|
1
|
+
/**
|
|
2
|
+
* Pending Google Auth Store
|
|
3
|
+
* Requirements: FR-3 (Pending Auth Session Management)
|
|
4
|
+
*
|
|
5
|
+
* Manages pending Google OAuth authentication sessions for remote mode.
|
|
6
|
+
* Sessions are stored encrypted and expire after a configurable timeout.
|
|
7
|
+
*/
|
|
8
|
+
import { randomUUID } from 'crypto';
|
|
9
|
+
import { join } from 'path';
|
|
10
|
+
import { homedir } from 'os';
|
|
11
|
+
import { generateCodeVerifier, generateCodeChallenge } from './pkce.js';
|
|
12
|
+
import { EncryptionService } from './encryption-service.js';
|
|
13
|
+
import { oauthLogger } from '../utils/logger.js';
|
|
14
|
+
/**
|
|
15
|
+
* Default session timeout (10 minutes)
|
|
16
|
+
*/
|
|
17
|
+
const DEFAULT_SESSION_TIMEOUT_MS = 10 * 60 * 1000;
|
|
18
|
+
/**
|
|
19
|
+
* Cleanup interval (5 minutes)
|
|
20
|
+
*/
|
|
21
|
+
const CLEANUP_INTERVAL_MS = 5 * 60 * 1000;
|
|
22
|
+
/**
|
|
23
|
+
* Pending Google Auth Store
|
|
24
|
+
*
|
|
25
|
+
* Manages pending OAuth sessions with encrypted persistence.
|
|
26
|
+
*/
|
|
27
|
+
export class PendingGoogleAuthStore {
|
|
28
|
+
sessions = new Map();
|
|
29
|
+
storagePath;
|
|
30
|
+
encryptionService;
|
|
31
|
+
sessionTimeoutMs;
|
|
32
|
+
cleanupTimer = null;
|
|
33
|
+
initialized = false;
|
|
34
|
+
constructor(encryptionKey) {
|
|
35
|
+
this.storagePath = join(homedir(), '.sage', 'google_pending_auth.enc');
|
|
36
|
+
this.encryptionService = new EncryptionService({
|
|
37
|
+
encryptionKey: encryptionKey || process.env.SAGE_ENCRYPTION_KEY,
|
|
38
|
+
});
|
|
39
|
+
// Parse session timeout from environment or use default
|
|
40
|
+
const timeoutEnv = process.env.GOOGLE_AUTH_SESSION_TIMEOUT;
|
|
41
|
+
this.sessionTimeoutMs = timeoutEnv
|
|
42
|
+
? parseInt(timeoutEnv, 10) * 1000
|
|
43
|
+
: DEFAULT_SESSION_TIMEOUT_MS;
|
|
44
|
+
}
|
|
45
|
+
/**
|
|
46
|
+
* Initialize the store and start cleanup timer
|
|
47
|
+
*/
|
|
48
|
+
async initialize() {
|
|
49
|
+
if (this.initialized) {
|
|
50
|
+
return;
|
|
51
|
+
}
|
|
52
|
+
await this.encryptionService.initialize();
|
|
53
|
+
await this.load();
|
|
54
|
+
// Start periodic cleanup
|
|
55
|
+
this.cleanupTimer = setInterval(() => {
|
|
56
|
+
this.cleanupExpired();
|
|
57
|
+
}, CLEANUP_INTERVAL_MS);
|
|
58
|
+
// Don't prevent process exit
|
|
59
|
+
this.cleanupTimer.unref();
|
|
60
|
+
this.initialized = true;
|
|
61
|
+
oauthLogger.info('PendingGoogleAuthStore initialized');
|
|
62
|
+
}
|
|
63
|
+
/**
|
|
64
|
+
* Create a new pending auth session
|
|
65
|
+
*
|
|
66
|
+
* @param redirectUri - The OAuth callback URL
|
|
67
|
+
* @returns Session state, code_verifier, and code_challenge
|
|
68
|
+
*/
|
|
69
|
+
create(redirectUri) {
|
|
70
|
+
const state = randomUUID();
|
|
71
|
+
const codeVerifier = generateCodeVerifier();
|
|
72
|
+
const codeChallenge = generateCodeChallenge(codeVerifier);
|
|
73
|
+
const now = Date.now();
|
|
74
|
+
const session = {
|
|
75
|
+
state,
|
|
76
|
+
codeVerifier,
|
|
77
|
+
redirectUri,
|
|
78
|
+
createdAt: now,
|
|
79
|
+
expiresAt: now + this.sessionTimeoutMs,
|
|
80
|
+
};
|
|
81
|
+
this.sessions.set(state, session);
|
|
82
|
+
// Persist asynchronously (don't block)
|
|
83
|
+
this.persist().catch(err => {
|
|
84
|
+
oauthLogger.error({ err }, 'Failed to persist pending auth session');
|
|
85
|
+
});
|
|
86
|
+
oauthLogger.info({ state }, 'Created pending auth session');
|
|
87
|
+
return {
|
|
88
|
+
state,
|
|
89
|
+
codeVerifier,
|
|
90
|
+
codeChallenge,
|
|
91
|
+
};
|
|
92
|
+
}
|
|
93
|
+
/**
|
|
94
|
+
* Find a session by state
|
|
95
|
+
*
|
|
96
|
+
* @param state - The session state (UUID)
|
|
97
|
+
* @returns The session or null if not found/expired
|
|
98
|
+
*/
|
|
99
|
+
findByState(state) {
|
|
100
|
+
const session = this.sessions.get(state);
|
|
101
|
+
if (!session) {
|
|
102
|
+
return null;
|
|
103
|
+
}
|
|
104
|
+
// Check expiration
|
|
105
|
+
if (Date.now() > session.expiresAt) {
|
|
106
|
+
this.sessions.delete(state);
|
|
107
|
+
oauthLogger.info({ state }, 'Session expired');
|
|
108
|
+
return null;
|
|
109
|
+
}
|
|
110
|
+
return session;
|
|
111
|
+
}
|
|
112
|
+
/**
|
|
113
|
+
* Remove a session by state
|
|
114
|
+
*
|
|
115
|
+
* @param state - The session state to remove
|
|
116
|
+
*/
|
|
117
|
+
remove(state) {
|
|
118
|
+
const existed = this.sessions.delete(state);
|
|
119
|
+
if (existed) {
|
|
120
|
+
oauthLogger.info({ state }, 'Removed pending auth session');
|
|
121
|
+
// Persist asynchronously
|
|
122
|
+
this.persist().catch(err => {
|
|
123
|
+
oauthLogger.error({ err }, 'Failed to persist after session removal');
|
|
124
|
+
});
|
|
125
|
+
}
|
|
126
|
+
}
|
|
127
|
+
/**
|
|
128
|
+
* Clean up expired sessions
|
|
129
|
+
*/
|
|
130
|
+
cleanupExpired() {
|
|
131
|
+
const now = Date.now();
|
|
132
|
+
let removedCount = 0;
|
|
133
|
+
for (const [state, session] of this.sessions.entries()) {
|
|
134
|
+
if (now > session.expiresAt) {
|
|
135
|
+
this.sessions.delete(state);
|
|
136
|
+
removedCount++;
|
|
137
|
+
}
|
|
138
|
+
}
|
|
139
|
+
if (removedCount > 0) {
|
|
140
|
+
oauthLogger.info({ removedCount }, 'Cleaned up expired sessions');
|
|
141
|
+
// Persist asynchronously
|
|
142
|
+
this.persist().catch(err => {
|
|
143
|
+
oauthLogger.error({ err }, 'Failed to persist after cleanup');
|
|
144
|
+
});
|
|
145
|
+
}
|
|
146
|
+
}
|
|
147
|
+
/**
|
|
148
|
+
* Get session timeout in seconds
|
|
149
|
+
*/
|
|
150
|
+
getSessionTimeoutSeconds() {
|
|
151
|
+
return Math.floor(this.sessionTimeoutMs / 1000);
|
|
152
|
+
}
|
|
153
|
+
/**
|
|
154
|
+
* Persist sessions to encrypted file
|
|
155
|
+
*/
|
|
156
|
+
async persist() {
|
|
157
|
+
try {
|
|
158
|
+
const storage = {
|
|
159
|
+
version: 1,
|
|
160
|
+
sessions: Array.from(this.sessions.values()),
|
|
161
|
+
};
|
|
162
|
+
await this.encryptionService.encryptToFile(JSON.stringify(storage), this.storagePath);
|
|
163
|
+
oauthLogger.debug({ sessionCount: this.sessions.size }, 'Persisted pending auth sessions');
|
|
164
|
+
}
|
|
165
|
+
catch (error) {
|
|
166
|
+
oauthLogger.error({ err: error }, 'Failed to persist pending auth sessions');
|
|
167
|
+
throw error;
|
|
168
|
+
}
|
|
169
|
+
}
|
|
170
|
+
/**
|
|
171
|
+
* Load sessions from encrypted file
|
|
172
|
+
*/
|
|
173
|
+
async load() {
|
|
174
|
+
try {
|
|
175
|
+
const data = await this.encryptionService.decryptFromFile(this.storagePath);
|
|
176
|
+
if (data === null) {
|
|
177
|
+
oauthLogger.debug('No existing pending auth sessions found');
|
|
178
|
+
return;
|
|
179
|
+
}
|
|
180
|
+
const storage = JSON.parse(data);
|
|
181
|
+
if (storage.version !== 1) {
|
|
182
|
+
oauthLogger.warn({ version: storage.version }, 'Unknown storage version, ignoring');
|
|
183
|
+
return;
|
|
184
|
+
}
|
|
185
|
+
// Load sessions and filter out expired ones
|
|
186
|
+
const now = Date.now();
|
|
187
|
+
for (const session of storage.sessions) {
|
|
188
|
+
if (now < session.expiresAt) {
|
|
189
|
+
this.sessions.set(session.state, session);
|
|
190
|
+
}
|
|
191
|
+
}
|
|
192
|
+
oauthLogger.info({ sessionCount: this.sessions.size }, 'Loaded pending auth sessions');
|
|
193
|
+
}
|
|
194
|
+
catch (error) {
|
|
195
|
+
oauthLogger.error({ err: error }, 'Failed to load pending auth sessions');
|
|
196
|
+
// Don't throw - start with empty sessions
|
|
197
|
+
}
|
|
198
|
+
}
|
|
199
|
+
/**
|
|
200
|
+
* Shutdown the store and stop cleanup timer
|
|
201
|
+
*/
|
|
202
|
+
async shutdown() {
|
|
203
|
+
if (this.cleanupTimer) {
|
|
204
|
+
clearInterval(this.cleanupTimer);
|
|
205
|
+
this.cleanupTimer = null;
|
|
206
|
+
}
|
|
207
|
+
// Final persist
|
|
208
|
+
await this.persist();
|
|
209
|
+
oauthLogger.info('PendingGoogleAuthStore shutdown');
|
|
210
|
+
}
|
|
211
|
+
/**
|
|
212
|
+
* Get the number of active sessions
|
|
213
|
+
*/
|
|
214
|
+
getSessionCount() {
|
|
215
|
+
return this.sessions.size;
|
|
216
|
+
}
|
|
217
|
+
}
|
|
218
|
+
//# sourceMappingURL=pending-google-auth-store.js.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"pending-google-auth-store.js","sourceRoot":"","sources":["../../src/oauth/pending-google-auth-store.ts"],"names":[],"mappings":"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"}
|
|
@@ -3,15 +3,15 @@
|
|
|
3
3
|
* Requirements: FR-1 (authenticate_google MCP Tool)
|
|
4
4
|
*
|
|
5
5
|
* Orchestrates the complete Google OAuth flow:
|
|
6
|
-
*
|
|
7
|
-
*
|
|
8
|
-
*
|
|
9
|
-
*
|
|
10
|
-
*
|
|
11
|
-
*
|
|
12
|
-
* 7. Store tokens
|
|
6
|
+
* - Local mode: Start callback server, open browser, wait for callback
|
|
7
|
+
* - Remote mode: Return authorization URL for user to open manually
|
|
8
|
+
*
|
|
9
|
+
* Mode is determined by GOOGLE_REDIRECT_URI:
|
|
10
|
+
* - Contains 'localhost' or '127.0.0.1' -> Local mode
|
|
11
|
+
* - Otherwise -> Remote mode (server receives callback directly)
|
|
13
12
|
*/
|
|
14
13
|
import { z } from 'zod';
|
|
14
|
+
import { PendingGoogleAuthStore } from '../../oauth/pending-google-auth-store.js';
|
|
15
15
|
import type { OAuthToolsContext } from './index.js';
|
|
16
16
|
/**
|
|
17
17
|
* Arguments for authenticate_google tool
|
|
@@ -40,7 +40,18 @@ export interface AuthenticateGoogleResult {
|
|
|
40
40
|
scopes?: string[];
|
|
41
41
|
authorizationUrl?: string;
|
|
42
42
|
error?: string;
|
|
43
|
+
state?: string;
|
|
44
|
+
pendingAuth?: boolean;
|
|
45
|
+
expiresIn?: number;
|
|
43
46
|
}
|
|
47
|
+
/**
|
|
48
|
+
* Export the pending auth store for use by HTTP server
|
|
49
|
+
*/
|
|
50
|
+
export declare function getSharedPendingAuthStore(): PendingGoogleAuthStore | null;
|
|
51
|
+
/**
|
|
52
|
+
* Set the shared pending auth store (called by HTTP server)
|
|
53
|
+
*/
|
|
54
|
+
export declare function setSharedPendingAuthStore(store: PendingGoogleAuthStore): void;
|
|
44
55
|
/**
|
|
45
56
|
* Handle authenticate_google tool call
|
|
46
57
|
*
|
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"authenticate-google.d.ts","sourceRoot":"","sources":["../../../src/tools/oauth/authenticate-google.ts"],"names":[],"mappings":"AAAA
|
|
1
|
+
{"version":3,"file":"authenticate-google.d.ts","sourceRoot":"","sources":["../../../src/tools/oauth/authenticate-google.ts"],"names":[],"mappings":"AAAA;;;;;;;;;;;GAWG;AAEH,OAAO,EAAE,CAAC,EAAE,MAAM,KAAK,CAAC;AAGxB,OAAO,EAAE,sBAAsB,EAAE,MAAM,0CAA0C,CAAC;AAGlF,OAAO,KAAK,EAAE,iBAAiB,EAAE,MAAM,YAAY,CAAC;AAEpD;;GAEG;AACH,eAAO,MAAM,4BAA4B;IACvC,mDAAmD;;IAEnD,oDAAoD;;;;;;;;EAEpD,CAAC;AAEH,MAAM,MAAM,sBAAsB,GAAG,CAAC,CAAC,KAAK,CAAC,OAAO,4BAA4B,CAAC,CAAC;AAElF;;GAEG;AACH,MAAM,WAAW,wBAAwB;IACvC,OAAO,EAAE,OAAO,CAAC;IACjB,OAAO,EAAE,MAAM,CAAC;IAChB,oBAAoB,CAAC,EAAE,OAAO,CAAC;IAC/B,SAAS,CAAC,EAAE,MAAM,CAAC;IACnB,MAAM,CAAC,EAAE,MAAM,EAAE,CAAC;IAClB,gBAAgB,CAAC,EAAE,MAAM,CAAC;IAC1B,KAAK,CAAC,EAAE,MAAM,CAAC;IAEf,KAAK,CAAC,EAAE,MAAM,CAAC;IACf,WAAW,CAAC,EAAE,OAAO,CAAC;IACtB,SAAS,CAAC,EAAE,MAAM,CAAC;CACpB;AAkBD;;GAEG;AACH,wBAAgB,yBAAyB,IAAI,sBAAsB,GAAG,IAAI,CAEzE;AAED;;GAEG;AACH,wBAAgB,yBAAyB,CAAC,KAAK,EAAE,sBAAsB,GAAG,IAAI,CAE7E;AAkBD;;;;;;;;GAQG;AACH,wBAAsB,wBAAwB,CAC5C,IAAI,EAAE,sBAAsB,EAC5B,QAAQ,EAAE,iBAAiB,GAC1B,OAAO,CAAC,wBAAwB,CAAC,CA2KnC"}
|
|
@@ -3,17 +3,17 @@
|
|
|
3
3
|
* Requirements: FR-1 (authenticate_google MCP Tool)
|
|
4
4
|
*
|
|
5
5
|
* Orchestrates the complete Google OAuth flow:
|
|
6
|
-
*
|
|
7
|
-
*
|
|
8
|
-
*
|
|
9
|
-
*
|
|
10
|
-
*
|
|
11
|
-
*
|
|
12
|
-
* 7. Store tokens
|
|
6
|
+
* - Local mode: Start callback server, open browser, wait for callback
|
|
7
|
+
* - Remote mode: Return authorization URL for user to open manually
|
|
8
|
+
*
|
|
9
|
+
* Mode is determined by GOOGLE_REDIRECT_URI:
|
|
10
|
+
* - Contains 'localhost' or '127.0.0.1' -> Local mode
|
|
11
|
+
* - Otherwise -> Remote mode (server receives callback directly)
|
|
13
12
|
*/
|
|
14
13
|
import { z } from 'zod';
|
|
15
14
|
import { OAuthCallbackServer } from '../../oauth/oauth-callback-server.js';
|
|
16
|
-
import { GoogleOAuthHandler } from '../../oauth/google-oauth-handler.js';
|
|
15
|
+
import { GoogleOAuthHandler, GOOGLE_CALENDAR_SCOPES } from '../../oauth/google-oauth-handler.js';
|
|
16
|
+
import { PendingGoogleAuthStore } from '../../oauth/pending-google-auth-store.js';
|
|
17
17
|
import { openBrowser } from '../../utils/browser-opener.js';
|
|
18
18
|
import { oauthLogger } from '../../utils/logger.js';
|
|
19
19
|
/**
|
|
@@ -25,6 +25,46 @@ export const AuthenticateGoogleArgsSchema = z.object({
|
|
|
25
25
|
/** Timeout in seconds (default: 300 = 5 minutes) */
|
|
26
26
|
timeout: z.number().optional().default(300),
|
|
27
27
|
});
|
|
28
|
+
/**
|
|
29
|
+
* Singleton instance of PendingGoogleAuthStore for remote mode
|
|
30
|
+
*/
|
|
31
|
+
let pendingAuthStore = null;
|
|
32
|
+
/**
|
|
33
|
+
* Get or create the pending auth store
|
|
34
|
+
*/
|
|
35
|
+
async function getPendingAuthStore() {
|
|
36
|
+
if (!pendingAuthStore) {
|
|
37
|
+
pendingAuthStore = new PendingGoogleAuthStore();
|
|
38
|
+
await pendingAuthStore.initialize();
|
|
39
|
+
}
|
|
40
|
+
return pendingAuthStore;
|
|
41
|
+
}
|
|
42
|
+
/**
|
|
43
|
+
* Export the pending auth store for use by HTTP server
|
|
44
|
+
*/
|
|
45
|
+
export function getSharedPendingAuthStore() {
|
|
46
|
+
return pendingAuthStore;
|
|
47
|
+
}
|
|
48
|
+
/**
|
|
49
|
+
* Set the shared pending auth store (called by HTTP server)
|
|
50
|
+
*/
|
|
51
|
+
export function setSharedPendingAuthStore(store) {
|
|
52
|
+
pendingAuthStore = store;
|
|
53
|
+
}
|
|
54
|
+
/**
|
|
55
|
+
* Check if running in remote mode
|
|
56
|
+
*
|
|
57
|
+
* Remote mode is enabled when GOOGLE_REDIRECT_URI is set and
|
|
58
|
+
* does not point to localhost/127.0.0.1.
|
|
59
|
+
*/
|
|
60
|
+
function isRemoteMode() {
|
|
61
|
+
const redirectUri = process.env.GOOGLE_REDIRECT_URI;
|
|
62
|
+
if (!redirectUri) {
|
|
63
|
+
return false;
|
|
64
|
+
}
|
|
65
|
+
const lowerUri = redirectUri.toLowerCase();
|
|
66
|
+
return !lowerUri.includes('localhost') && !lowerUri.includes('127.0.0.1');
|
|
67
|
+
}
|
|
28
68
|
/**
|
|
29
69
|
* Handle authenticate_google tool call
|
|
30
70
|
*
|
|
@@ -95,7 +135,11 @@ export async function handleAuthenticateGoogle(args, _context) {
|
|
|
95
135
|
oauthLogger.debug({ error }, 'No existing tokens found');
|
|
96
136
|
}
|
|
97
137
|
}
|
|
98
|
-
//
|
|
138
|
+
// Remote mode: return authorization URL for user to open manually
|
|
139
|
+
if (isRemoteMode()) {
|
|
140
|
+
return handleRemoteModeAuth(oauthHandler, redirectUri);
|
|
141
|
+
}
|
|
142
|
+
// Local mode: Start callback server
|
|
99
143
|
const callbackServer = new OAuthCallbackServer({
|
|
100
144
|
timeout: timeout * 1000, // Convert to milliseconds
|
|
101
145
|
});
|
|
@@ -177,4 +221,46 @@ export async function handleAuthenticateGoogle(args, _context) {
|
|
|
177
221
|
await callbackServer.shutdown();
|
|
178
222
|
}
|
|
179
223
|
}
|
|
224
|
+
/**
|
|
225
|
+
* Handle remote mode authentication
|
|
226
|
+
*
|
|
227
|
+
* In remote mode, we return the authorization URL for the user to open
|
|
228
|
+
* manually in their browser. The server will receive the callback directly.
|
|
229
|
+
*/
|
|
230
|
+
async function handleRemoteModeAuth(_oauthHandler, redirectUri) {
|
|
231
|
+
try {
|
|
232
|
+
const store = await getPendingAuthStore();
|
|
233
|
+
// Create pending auth session (codeVerifier is stored in the session for later use)
|
|
234
|
+
const { state, codeChallenge } = store.create(redirectUri);
|
|
235
|
+
// Generate authorization URL with PKCE
|
|
236
|
+
const { google } = await import('googleapis');
|
|
237
|
+
const oauth2Client = new google.auth.OAuth2(process.env.GOOGLE_CLIENT_ID, process.env.GOOGLE_CLIENT_SECRET, redirectUri);
|
|
238
|
+
const authorizationUrl = oauth2Client.generateAuthUrl({
|
|
239
|
+
access_type: 'offline',
|
|
240
|
+
scope: GOOGLE_CALENDAR_SCOPES,
|
|
241
|
+
code_challenge: codeChallenge,
|
|
242
|
+
code_challenge_method: 'S256',
|
|
243
|
+
prompt: 'consent',
|
|
244
|
+
state,
|
|
245
|
+
});
|
|
246
|
+
oauthLogger.info({ state, redirectUri }, 'Generated remote mode authorization URL');
|
|
247
|
+
return {
|
|
248
|
+
success: true,
|
|
249
|
+
message: '以下のURLをブラウザで開いてGoogle認証を完了してください。',
|
|
250
|
+
authorizationUrl,
|
|
251
|
+
state,
|
|
252
|
+
pendingAuth: true,
|
|
253
|
+
expiresIn: store.getSessionTimeoutSeconds(),
|
|
254
|
+
};
|
|
255
|
+
}
|
|
256
|
+
catch (error) {
|
|
257
|
+
const errorMessage = error instanceof Error ? error.message : 'Unknown error';
|
|
258
|
+
oauthLogger.error({ error }, 'Remote mode auth failed');
|
|
259
|
+
return {
|
|
260
|
+
success: false,
|
|
261
|
+
message: '認証URLの生成に失敗しました。',
|
|
262
|
+
error: errorMessage,
|
|
263
|
+
};
|
|
264
|
+
}
|
|
265
|
+
}
|
|
180
266
|
//# sourceMappingURL=authenticate-google.js.map
|
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"authenticate-google.js","sourceRoot":"","sources":["../../../src/tools/oauth/authenticate-google.ts"],"names":[],"mappings":"AAAA
|
|
1
|
+
{"version":3,"file":"authenticate-google.js","sourceRoot":"","sources":["../../../src/tools/oauth/authenticate-google.ts"],"names":[],"mappings":"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"}
|