@shin1ohno/sage 0.9.3 → 0.11.0
This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
- package/dist/cli/mcp-handler.d.ts.map +1 -1
- package/dist/cli/mcp-handler.js +154 -6
- package/dist/cli/mcp-handler.js.map +1 -1
- package/dist/cli/signal-handler.d.ts +23 -0
- package/dist/cli/signal-handler.d.ts.map +1 -0
- package/dist/cli/signal-handler.js +51 -0
- package/dist/cli/signal-handler.js.map +1 -0
- package/dist/config/config-differ.d.ts +21 -0
- package/dist/config/config-differ.d.ts.map +1 -0
- package/dist/config/config-differ.js +194 -0
- package/dist/config/config-differ.js.map +1 -0
- package/dist/config/config-reload-service.d.ts +84 -0
- package/dist/config/config-reload-service.d.ts.map +1 -0
- package/dist/config/config-reload-service.js +234 -0
- package/dist/config/config-reload-service.js.map +1 -0
- package/dist/config/config-watcher.d.ts +78 -0
- package/dist/config/config-watcher.d.ts.map +1 -0
- package/dist/config/config-watcher.js +244 -0
- package/dist/config/config-watcher.js.map +1 -0
- package/dist/config/hot-reload-config.d.ts +16 -0
- package/dist/config/hot-reload-config.d.ts.map +1 -0
- package/dist/config/hot-reload-config.js +61 -0
- package/dist/config/hot-reload-config.js.map +1 -0
- package/dist/index.js +109 -0
- package/dist/index.js.map +1 -1
- 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/oauth-callback-server.d.ts +100 -0
- package/dist/oauth/oauth-callback-server.d.ts.map +1 -0
- package/dist/oauth/oauth-callback-server.js +276 -0
- package/dist/oauth/oauth-callback-server.js.map +1 -0
- package/dist/services/reloadable/calendar-source-manager-adapter.d.ts +45 -0
- package/dist/services/reloadable/calendar-source-manager-adapter.d.ts.map +1 -0
- package/dist/services/reloadable/calendar-source-manager-adapter.js +106 -0
- package/dist/services/reloadable/calendar-source-manager-adapter.js.map +1 -0
- package/dist/services/reloadable/index.d.ts +46 -0
- package/dist/services/reloadable/index.d.ts.map +1 -0
- package/dist/services/reloadable/index.js +88 -0
- package/dist/services/reloadable/index.js.map +1 -0
- package/dist/services/reloadable/notion-service-adapter.d.ts +45 -0
- package/dist/services/reloadable/notion-service-adapter.d.ts.map +1 -0
- package/dist/services/reloadable/notion-service-adapter.js +86 -0
- package/dist/services/reloadable/notion-service-adapter.js.map +1 -0
- package/dist/services/reloadable/priority-engine-adapter.d.ts +73 -0
- package/dist/services/reloadable/priority-engine-adapter.d.ts.map +1 -0
- package/dist/services/reloadable/priority-engine-adapter.js +105 -0
- package/dist/services/reloadable/priority-engine-adapter.js.map +1 -0
- package/dist/services/reloadable/reminder-manager-adapter.d.ts +45 -0
- package/dist/services/reloadable/reminder-manager-adapter.d.ts.map +1 -0
- package/dist/services/reloadable/reminder-manager-adapter.js +80 -0
- package/dist/services/reloadable/reminder-manager-adapter.js.map +1 -0
- package/dist/services/reloadable/todo-list-manager-adapter.d.ts +45 -0
- package/dist/services/reloadable/todo-list-manager-adapter.d.ts.map +1 -0
- package/dist/services/reloadable/todo-list-manager-adapter.js +80 -0
- package/dist/services/reloadable/todo-list-manager-adapter.js.map +1 -0
- package/dist/services/reloadable/working-cadence-adapter.d.ts +52 -0
- package/dist/services/reloadable/working-cadence-adapter.d.ts.map +1 -0
- package/dist/services/reloadable/working-cadence-adapter.js +77 -0
- package/dist/services/reloadable/working-cadence-adapter.js.map +1 -0
- package/dist/services/service-registry.d.ts +85 -0
- package/dist/services/service-registry.d.ts.map +1 -0
- package/dist/services/service-registry.js +166 -0
- package/dist/services/service-registry.js.map +1 -0
- package/dist/tools/config/index.d.ts +9 -0
- package/dist/tools/config/index.d.ts.map +1 -0
- package/dist/tools/config/index.js +8 -0
- package/dist/tools/config/index.js.map +1 -0
- package/dist/tools/config/reload-handler.d.ts +35 -0
- package/dist/tools/config/reload-handler.d.ts.map +1 -0
- package/dist/tools/config/reload-handler.js +63 -0
- package/dist/tools/config/reload-handler.js.map +1 -0
- package/dist/tools/integrations/handlers.d.ts +2 -0
- package/dist/tools/integrations/handlers.d.ts.map +1 -1
- package/dist/tools/integrations/handlers.js.map +1 -1
- package/dist/tools/oauth/authenticate-google.d.ts +54 -0
- package/dist/tools/oauth/authenticate-google.d.ts.map +1 -0
- package/dist/tools/oauth/authenticate-google.js +180 -0
- package/dist/tools/oauth/authenticate-google.js.map +1 -0
- package/dist/tools/oauth/index.d.ts +26 -0
- package/dist/tools/oauth/index.d.ts.map +1 -0
- package/dist/tools/oauth/index.js +9 -0
- package/dist/tools/oauth/index.js.map +1 -0
- package/dist/tools/setup/handlers.d.ts +2 -0
- package/dist/tools/setup/handlers.d.ts.map +1 -1
- package/dist/tools/setup/handlers.js +14 -0
- package/dist/tools/setup/handlers.js.map +1 -1
- package/dist/types/hot-reload.d.ts +131 -0
- package/dist/types/hot-reload.d.ts.map +1 -0
- package/dist/types/hot-reload.js +5 -0
- package/dist/types/hot-reload.js.map +1 -0
- package/dist/utils/browser-opener.d.ts +35 -0
- package/dist/utils/browser-opener.d.ts.map +1 -0
- package/dist/utils/browser-opener.js +71 -0
- package/dist/utils/browser-opener.js.map +1 -0
- package/dist/version.js +1 -1
- package/dist/version.js.map +1 -1
- package/package.json +1 -1
|
@@ -0,0 +1,180 @@
|
|
|
1
|
+
/**
|
|
2
|
+
* authenticate_google Tool Handler
|
|
3
|
+
* Requirements: FR-1 (authenticate_google MCP Tool)
|
|
4
|
+
*
|
|
5
|
+
* Orchestrates the complete Google OAuth flow:
|
|
6
|
+
* 1. Check for existing tokens
|
|
7
|
+
* 2. Start callback server
|
|
8
|
+
* 3. Generate authorization URL
|
|
9
|
+
* 4. Open browser
|
|
10
|
+
* 5. Wait for callback
|
|
11
|
+
* 6. Exchange code for tokens
|
|
12
|
+
* 7. Store tokens
|
|
13
|
+
*/
|
|
14
|
+
import { z } from 'zod';
|
|
15
|
+
import { OAuthCallbackServer } from '../../oauth/oauth-callback-server.js';
|
|
16
|
+
import { GoogleOAuthHandler } from '../../oauth/google-oauth-handler.js';
|
|
17
|
+
import { openBrowser } from '../../utils/browser-opener.js';
|
|
18
|
+
import { oauthLogger } from '../../utils/logger.js';
|
|
19
|
+
/**
|
|
20
|
+
* Arguments for authenticate_google tool
|
|
21
|
+
*/
|
|
22
|
+
export const AuthenticateGoogleArgsSchema = z.object({
|
|
23
|
+
/** Force re-authentication even if tokens exist */
|
|
24
|
+
force: z.boolean().optional().default(false),
|
|
25
|
+
/** Timeout in seconds (default: 300 = 5 minutes) */
|
|
26
|
+
timeout: z.number().optional().default(300),
|
|
27
|
+
});
|
|
28
|
+
/**
|
|
29
|
+
* Handle authenticate_google tool call
|
|
30
|
+
*
|
|
31
|
+
* Orchestrates the complete OAuth flow for Google Calendar authentication.
|
|
32
|
+
*
|
|
33
|
+
* @param args - Tool arguments
|
|
34
|
+
* @param context - OAuth tools context (unused, handler creates its own handler)
|
|
35
|
+
* @returns Authentication result
|
|
36
|
+
*/
|
|
37
|
+
export async function handleAuthenticateGoogle(args, _context) {
|
|
38
|
+
// Validate arguments
|
|
39
|
+
const validatedArgs = AuthenticateGoogleArgsSchema.parse(args);
|
|
40
|
+
const { force, timeout } = validatedArgs;
|
|
41
|
+
// Check environment variables
|
|
42
|
+
const clientId = process.env.GOOGLE_CLIENT_ID;
|
|
43
|
+
const clientSecret = process.env.GOOGLE_CLIENT_SECRET;
|
|
44
|
+
if (!clientId || !clientSecret) {
|
|
45
|
+
return {
|
|
46
|
+
success: false,
|
|
47
|
+
message: 'Google OAuth設定が見つかりません。',
|
|
48
|
+
error: '環境変数 GOOGLE_CLIENT_ID と GOOGLE_CLIENT_SECRET を設定してください。\n' +
|
|
49
|
+
'Google Cloud Console で OAuth クライアントを作成し、認証情報を取得してください。\n' +
|
|
50
|
+
'https://console.cloud.google.com/apis/credentials',
|
|
51
|
+
};
|
|
52
|
+
}
|
|
53
|
+
// Create OAuth handler
|
|
54
|
+
const redirectUri = process.env.GOOGLE_REDIRECT_URI || 'http://127.0.0.1:3000/oauth/callback';
|
|
55
|
+
const oauthHandler = new GoogleOAuthHandler({
|
|
56
|
+
clientId,
|
|
57
|
+
clientSecret,
|
|
58
|
+
redirectUri,
|
|
59
|
+
});
|
|
60
|
+
// Check for existing tokens (unless force is true)
|
|
61
|
+
if (!force) {
|
|
62
|
+
try {
|
|
63
|
+
const existingTokens = await oauthHandler.getTokens();
|
|
64
|
+
if (existingTokens) {
|
|
65
|
+
const isValid = await oauthHandler.validateToken(existingTokens);
|
|
66
|
+
if (isValid) {
|
|
67
|
+
return {
|
|
68
|
+
success: true,
|
|
69
|
+
message: '既に Google Calendar で認証済みです。',
|
|
70
|
+
alreadyAuthenticated: true,
|
|
71
|
+
expiresAt: new Date(existingTokens.expiresAt).toISOString(),
|
|
72
|
+
scopes: existingTokens.scope,
|
|
73
|
+
};
|
|
74
|
+
}
|
|
75
|
+
// Token expired, try to refresh
|
|
76
|
+
try {
|
|
77
|
+
const refreshedTokens = await oauthHandler.refreshAccessToken(existingTokens.refreshToken);
|
|
78
|
+
await oauthHandler.storeTokens(refreshedTokens);
|
|
79
|
+
return {
|
|
80
|
+
success: true,
|
|
81
|
+
message: 'トークンを更新しました。',
|
|
82
|
+
alreadyAuthenticated: true,
|
|
83
|
+
expiresAt: new Date(refreshedTokens.expiresAt).toISOString(),
|
|
84
|
+
scopes: refreshedTokens.scope,
|
|
85
|
+
};
|
|
86
|
+
}
|
|
87
|
+
catch (refreshError) {
|
|
88
|
+
// Refresh failed, need to re-authenticate
|
|
89
|
+
oauthLogger.info('Token refresh failed, initiating re-authentication');
|
|
90
|
+
}
|
|
91
|
+
}
|
|
92
|
+
}
|
|
93
|
+
catch (error) {
|
|
94
|
+
// No tokens or error reading tokens, proceed with authentication
|
|
95
|
+
oauthLogger.debug({ error }, 'No existing tokens found');
|
|
96
|
+
}
|
|
97
|
+
}
|
|
98
|
+
// Start callback server
|
|
99
|
+
const callbackServer = new OAuthCallbackServer({
|
|
100
|
+
timeout: timeout * 1000, // Convert to milliseconds
|
|
101
|
+
});
|
|
102
|
+
let serverInfo;
|
|
103
|
+
try {
|
|
104
|
+
serverInfo = await callbackServer.start();
|
|
105
|
+
}
|
|
106
|
+
catch (error) {
|
|
107
|
+
const errorMessage = error instanceof Error ? error.message : 'Unknown error';
|
|
108
|
+
return {
|
|
109
|
+
success: false,
|
|
110
|
+
message: 'コールバックサーバーの起動に失敗しました。',
|
|
111
|
+
error: `${errorMessage}\nポートが使用中の可能性があります。他のアプリケーションを終了してから再試行してください。`,
|
|
112
|
+
};
|
|
113
|
+
}
|
|
114
|
+
try {
|
|
115
|
+
// Generate authorization URL with the callback server's URL
|
|
116
|
+
// Update the redirect URI to use the actual callback URL
|
|
117
|
+
const oauthHandlerWithCallback = new GoogleOAuthHandler({
|
|
118
|
+
clientId,
|
|
119
|
+
clientSecret,
|
|
120
|
+
redirectUri: serverInfo.callbackUrl,
|
|
121
|
+
});
|
|
122
|
+
const authorizationUrl = await oauthHandlerWithCallback.getAuthorizationUrl(serverInfo.callbackUrl);
|
|
123
|
+
oauthLogger.info({ authorizationUrl: authorizationUrl.substring(0, 100) + '...' }, 'Generated authorization URL');
|
|
124
|
+
// Try to open browser
|
|
125
|
+
const browserResult = await openBrowser(authorizationUrl);
|
|
126
|
+
if (!browserResult.success) {
|
|
127
|
+
oauthLogger.warn({ error: browserResult.error }, 'Failed to open browser automatically');
|
|
128
|
+
// Return URL for manual opening
|
|
129
|
+
return {
|
|
130
|
+
success: false,
|
|
131
|
+
message: 'ブラウザを自動で開けませんでした。以下のURLを手動でブラウザに貼り付けてください。',
|
|
132
|
+
authorizationUrl,
|
|
133
|
+
error: browserResult.error,
|
|
134
|
+
};
|
|
135
|
+
}
|
|
136
|
+
oauthLogger.info('Browser opened, waiting for callback...');
|
|
137
|
+
// Wait for callback
|
|
138
|
+
const callbackResult = await callbackServer.waitForCallback();
|
|
139
|
+
if (!callbackResult.success) {
|
|
140
|
+
return {
|
|
141
|
+
success: false,
|
|
142
|
+
message: '認証がキャンセルされたか、エラーが発生しました。',
|
|
143
|
+
error: `${callbackResult.error}: ${callbackResult.errorDescription}`,
|
|
144
|
+
};
|
|
145
|
+
}
|
|
146
|
+
if (!callbackResult.code) {
|
|
147
|
+
return {
|
|
148
|
+
success: false,
|
|
149
|
+
message: '認証コードを取得できませんでした。',
|
|
150
|
+
error: 'Authorization code was not received',
|
|
151
|
+
};
|
|
152
|
+
}
|
|
153
|
+
// Exchange code for tokens
|
|
154
|
+
oauthLogger.info('Exchanging authorization code for tokens...');
|
|
155
|
+
const tokens = await oauthHandlerWithCallback.exchangeCodeForTokens(callbackResult.code, serverInfo.callbackUrl);
|
|
156
|
+
// Store tokens
|
|
157
|
+
await oauthHandlerWithCallback.storeTokens(tokens);
|
|
158
|
+
oauthLogger.info('OAuth tokens stored successfully');
|
|
159
|
+
return {
|
|
160
|
+
success: true,
|
|
161
|
+
message: 'Google Calendar の認証が完了しました!',
|
|
162
|
+
expiresAt: new Date(tokens.expiresAt).toISOString(),
|
|
163
|
+
scopes: tokens.scope,
|
|
164
|
+
};
|
|
165
|
+
}
|
|
166
|
+
catch (error) {
|
|
167
|
+
const errorMessage = error instanceof Error ? error.message : 'Unknown error';
|
|
168
|
+
oauthLogger.error({ error }, 'OAuth flow failed');
|
|
169
|
+
return {
|
|
170
|
+
success: false,
|
|
171
|
+
message: '認証フローでエラーが発生しました。',
|
|
172
|
+
error: errorMessage,
|
|
173
|
+
};
|
|
174
|
+
}
|
|
175
|
+
finally {
|
|
176
|
+
// Always shutdown the server
|
|
177
|
+
await callbackServer.shutdown();
|
|
178
|
+
}
|
|
179
|
+
}
|
|
180
|
+
//# sourceMappingURL=authenticate-google.js.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"authenticate-google.js","sourceRoot":"","sources":["../../../src/tools/oauth/authenticate-google.ts"],"names":[],"mappings":"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"}
|
|
@@ -0,0 +1,26 @@
|
|
|
1
|
+
/**
|
|
2
|
+
* OAuth Tools Module
|
|
3
|
+
* Requirements: FR-1 (authenticate_google MCP Tool)
|
|
4
|
+
*
|
|
5
|
+
* Exports OAuth-related MCP tool handlers and context.
|
|
6
|
+
*/
|
|
7
|
+
import { GoogleOAuthHandler } from '../../oauth/google-oauth-handler.js';
|
|
8
|
+
/**
|
|
9
|
+
* OAuth Tools Context
|
|
10
|
+
*
|
|
11
|
+
* Provides access to OAuth-related services for tool handlers.
|
|
12
|
+
*/
|
|
13
|
+
export interface OAuthToolsContext {
|
|
14
|
+
/**
|
|
15
|
+
* Get GoogleOAuthHandler instance
|
|
16
|
+
* Returns null if Google OAuth is not configured
|
|
17
|
+
*/
|
|
18
|
+
getGoogleOAuthHandler: () => GoogleOAuthHandler | null;
|
|
19
|
+
/**
|
|
20
|
+
* Create a new GoogleOAuthHandler with the current config
|
|
21
|
+
*/
|
|
22
|
+
createGoogleOAuthHandler: () => GoogleOAuthHandler | null;
|
|
23
|
+
}
|
|
24
|
+
export { handleAuthenticateGoogle } from './authenticate-google.js';
|
|
25
|
+
export type { AuthenticateGoogleArgs, AuthenticateGoogleResult } from './authenticate-google.js';
|
|
26
|
+
//# sourceMappingURL=index.d.ts.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"index.d.ts","sourceRoot":"","sources":["../../../src/tools/oauth/index.ts"],"names":[],"mappings":"AAAA;;;;;GAKG;AAEH,OAAO,EAAE,kBAAkB,EAAE,MAAM,qCAAqC,CAAC;AAEzE;;;;GAIG;AACH,MAAM,WAAW,iBAAiB;IAChC;;;OAGG;IACH,qBAAqB,EAAE,MAAM,kBAAkB,GAAG,IAAI,CAAC;IAEvD;;OAEG;IACH,wBAAwB,EAAE,MAAM,kBAAkB,GAAG,IAAI,CAAC;CAC3D;AAGD,OAAO,EAAE,wBAAwB,EAAE,MAAM,0BAA0B,CAAC;AAGpE,YAAY,EAAE,sBAAsB,EAAE,wBAAwB,EAAE,MAAM,0BAA0B,CAAC"}
|
|
@@ -0,0 +1,9 @@
|
|
|
1
|
+
/**
|
|
2
|
+
* OAuth Tools Module
|
|
3
|
+
* Requirements: FR-1 (authenticate_google MCP Tool)
|
|
4
|
+
*
|
|
5
|
+
* Exports OAuth-related MCP tool handlers and context.
|
|
6
|
+
*/
|
|
7
|
+
// Export handler
|
|
8
|
+
export { handleAuthenticateGoogle } from './authenticate-google.js';
|
|
9
|
+
//# sourceMappingURL=index.js.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"index.js","sourceRoot":"","sources":["../../../src/tools/oauth/index.ts"],"names":[],"mappings":"AAAA;;;;;GAKG;AAsBH,iBAAiB;AACjB,OAAO,EAAE,wBAAwB,EAAE,MAAM,0BAA0B,CAAC"}
|
|
@@ -9,6 +9,7 @@
|
|
|
9
9
|
*/
|
|
10
10
|
import { SetupWizard } from '../../setup/wizard.js';
|
|
11
11
|
import type { UserConfig } from '../../types/index.js';
|
|
12
|
+
import type { ConfigReloadService } from '../../config/config-reload-service.js';
|
|
12
13
|
/**
|
|
13
14
|
* Wizard session type (from SetupWizard)
|
|
14
15
|
*/
|
|
@@ -22,6 +23,7 @@ export interface SetupContext {
|
|
|
22
23
|
getWizardSession: () => WizardSession | null;
|
|
23
24
|
setWizardSession: (session: WizardSession | null) => void;
|
|
24
25
|
initializeServices: (config: UserConfig) => void;
|
|
26
|
+
getConfigReloadService?: () => ConfigReloadService | null;
|
|
25
27
|
}
|
|
26
28
|
/**
|
|
27
29
|
* check_setup_status handler
|
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"handlers.d.ts","sourceRoot":"","sources":["../../../src/tools/setup/handlers.ts"],"names":[],"mappings":"AAAA;;;;;;;;GAQG;AAGH,OAAO,EAAE,WAAW,EAAE,MAAM,uBAAuB,CAAC;AACpD,OAAO,KAAK,EAAE,UAAU,EAAE,MAAM,sBAAsB,CAAC;
|
|
1
|
+
{"version":3,"file":"handlers.d.ts","sourceRoot":"","sources":["../../../src/tools/setup/handlers.ts"],"names":[],"mappings":"AAAA;;;;;;;;GAQG;AAGH,OAAO,EAAE,WAAW,EAAE,MAAM,uBAAuB,CAAC;AACpD,OAAO,KAAK,EAAE,UAAU,EAAE,MAAM,sBAAsB,CAAC;AAEvD,OAAO,KAAK,EAAE,mBAAmB,EAAE,MAAM,uCAAuC,CAAC;AAGjF;;GAEG;AACH,MAAM,MAAM,aAAa,GAAG,UAAU,CAAC,OAAO,WAAW,CAAC,aAAa,CAAC,CAAC;AAEzE;;GAEG;AACH,MAAM,WAAW,YAAY;IAC3B,SAAS,EAAE,MAAM,UAAU,GAAG,IAAI,CAAC;IACnC,SAAS,EAAE,CAAC,MAAM,EAAE,UAAU,KAAK,IAAI,CAAC;IACxC,gBAAgB,EAAE,MAAM,aAAa,GAAG,IAAI,CAAC;IAC7C,gBAAgB,EAAE,CAAC,OAAO,EAAE,aAAa,GAAG,IAAI,KAAK,IAAI,CAAC;IAC1D,kBAAkB,EAAE,CAAC,MAAM,EAAE,UAAU,KAAK,IAAI,CAAC;IACjD,sBAAsB,CAAC,EAAE,MAAM,mBAAmB,GAAG,IAAI,CAAC;CAC3D;AAED;;;;;GAKG;AACH,wBAAsB,sBAAsB,CAAC,GAAG,EAAE,YAAY;;;;;GA0D7D;AAED;;;;;GAKG;AACH,wBAAsB,sBAAsB,CAC1C,GAAG,EAAE,YAAY,EACjB,IAAI,EAAE;IAAE,IAAI,CAAC,EAAE,MAAM,GAAG,OAAO,CAAA;CAAE;;;;;GAyBlC;AAED;;;;;GAKG;AACH,wBAAsB,0BAA0B,CAC9C,GAAG,EAAE,YAAY,EACjB,IAAI,EAAE;IAAE,UAAU,EAAE,MAAM,CAAC;IAAC,MAAM,EAAE,MAAM,GAAG,MAAM,EAAE,CAAA;CAAE;;;;;GAoDxD;AAED;;;;;GAKG;AACH,wBAAsB,gBAAgB,CACpC,GAAG,EAAE,YAAY,EACjB,IAAI,EAAE;IAAE,OAAO,EAAE,OAAO,CAAA;CAAE;;;;;GA2C3B"}
|
|
@@ -36,6 +36,18 @@ export async function handleCheckSetupStatus(ctx) {
|
|
|
36
36
|
nextAction: 'start_setup_wizard',
|
|
37
37
|
});
|
|
38
38
|
}
|
|
39
|
+
// Build hot reload status if service is available
|
|
40
|
+
let hotReload;
|
|
41
|
+
if (ctx.getConfigReloadService) {
|
|
42
|
+
const configReloadService = ctx.getConfigReloadService();
|
|
43
|
+
if (configReloadService) {
|
|
44
|
+
hotReload = {
|
|
45
|
+
enabled: configReloadService.isAutoReloadEnabled(),
|
|
46
|
+
watching: configReloadService.isAutoReloadEnabled(), // Watching when auto-reload is enabled
|
|
47
|
+
lastReload: configReloadService.getLastReloadResult(),
|
|
48
|
+
};
|
|
49
|
+
}
|
|
50
|
+
}
|
|
39
51
|
return createToolResponse({
|
|
40
52
|
setupComplete: true,
|
|
41
53
|
configExists: true,
|
|
@@ -47,7 +59,9 @@ export async function handleCheckSetupStatus(ctx) {
|
|
|
47
59
|
'find_available_slots',
|
|
48
60
|
'sync_to_notion',
|
|
49
61
|
'update_config',
|
|
62
|
+
'reload_config',
|
|
50
63
|
],
|
|
64
|
+
...(hotReload && { hotReload }),
|
|
51
65
|
});
|
|
52
66
|
}
|
|
53
67
|
/**
|
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"handlers.js","sourceRoot":"","sources":["../../../src/tools/setup/handlers.ts"],"names":[],"mappings":"AAAA;;;;;;;;GAQG;AAEH,OAAO,EAAE,YAAY,EAAE,MAAM,wBAAwB,CAAC;AACtD,OAAO,EAAE,WAAW,EAAE,MAAM,uBAAuB,CAAC;
|
|
1
|
+
{"version":3,"file":"handlers.js","sourceRoot":"","sources":["../../../src/tools/setup/handlers.ts"],"names":[],"mappings":"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"}
|
|
@@ -0,0 +1,131 @@
|
|
|
1
|
+
/**
|
|
2
|
+
* Hot Reload type definitions
|
|
3
|
+
*/
|
|
4
|
+
import type { UserConfig } from './config.js';
|
|
5
|
+
/**
|
|
6
|
+
* Result of a configuration reload operation
|
|
7
|
+
*/
|
|
8
|
+
export interface ReloadResult {
|
|
9
|
+
/** Whether the reload was successful */
|
|
10
|
+
success: boolean;
|
|
11
|
+
/** List of config sections that were changed */
|
|
12
|
+
changedSections: string[];
|
|
13
|
+
/** List of services that were re-initialized */
|
|
14
|
+
reinitializedServices: string[];
|
|
15
|
+
/** Error message if reload failed */
|
|
16
|
+
error?: string;
|
|
17
|
+
/** ISO 8601 timestamp of the reload */
|
|
18
|
+
timestamp: string;
|
|
19
|
+
/** Duration of the reload operation in milliseconds */
|
|
20
|
+
durationMs: number;
|
|
21
|
+
}
|
|
22
|
+
/**
|
|
23
|
+
* State of the config file watcher
|
|
24
|
+
*/
|
|
25
|
+
export interface WatcherState {
|
|
26
|
+
/** Whether the watcher is currently active */
|
|
27
|
+
isWatching: boolean;
|
|
28
|
+
/** List of file paths being watched */
|
|
29
|
+
watchedPaths: string[];
|
|
30
|
+
/** ISO 8601 timestamp of last detected change */
|
|
31
|
+
lastChangeDetected?: string;
|
|
32
|
+
/** Number of errors encountered during watching */
|
|
33
|
+
errorCount: number;
|
|
34
|
+
}
|
|
35
|
+
/**
|
|
36
|
+
* Hot reload status for MCP tool responses
|
|
37
|
+
*/
|
|
38
|
+
export interface ReloadStatus {
|
|
39
|
+
/** Whether auto-reload is enabled */
|
|
40
|
+
autoReloadEnabled: boolean;
|
|
41
|
+
/** Current state of the file watcher */
|
|
42
|
+
watcherState: WatcherState;
|
|
43
|
+
/** Result of the last reload operation */
|
|
44
|
+
lastReloadResult: ReloadResult | null;
|
|
45
|
+
/** Summary of current config */
|
|
46
|
+
currentConfig: {
|
|
47
|
+
lastUpdated: string;
|
|
48
|
+
sections: string[];
|
|
49
|
+
};
|
|
50
|
+
}
|
|
51
|
+
/**
|
|
52
|
+
* Interface for services that can be reloaded without restart
|
|
53
|
+
*/
|
|
54
|
+
export interface ReloadableService {
|
|
55
|
+
/** Unique name identifying this service */
|
|
56
|
+
readonly name: string;
|
|
57
|
+
/** Config sections this service depends on */
|
|
58
|
+
readonly dependsOnSections: readonly string[];
|
|
59
|
+
/**
|
|
60
|
+
* Re-initialize the service with new configuration
|
|
61
|
+
* @param config The new configuration to use
|
|
62
|
+
*/
|
|
63
|
+
reinitialize(config: UserConfig): Promise<void>;
|
|
64
|
+
/**
|
|
65
|
+
* Gracefully shutdown the service before re-initialization
|
|
66
|
+
*/
|
|
67
|
+
shutdown(): Promise<void>;
|
|
68
|
+
}
|
|
69
|
+
/**
|
|
70
|
+
* Options for ConfigWatcher
|
|
71
|
+
*/
|
|
72
|
+
export interface ConfigWatcherOptions {
|
|
73
|
+
/** Debounce delay in milliseconds (default: 500) */
|
|
74
|
+
debounceMs?: number;
|
|
75
|
+
/** Config file paths to watch (defaults to user and remote config paths) */
|
|
76
|
+
configPaths?: string[];
|
|
77
|
+
}
|
|
78
|
+
/**
|
|
79
|
+
* Options for ConfigReloadService
|
|
80
|
+
*/
|
|
81
|
+
export interface ConfigReloadServiceOptions {
|
|
82
|
+
/** ConfigWatcher instance to use */
|
|
83
|
+
watcher?: ConfigWatcher;
|
|
84
|
+
/** Whether to enable automatic reload on file changes (default: true) */
|
|
85
|
+
enableAutoReload?: boolean;
|
|
86
|
+
/** Callback invoked after each reload attempt */
|
|
87
|
+
onReload?: (result: ReloadResult) => void;
|
|
88
|
+
}
|
|
89
|
+
/**
|
|
90
|
+
* Hot reload configuration from environment variables
|
|
91
|
+
*/
|
|
92
|
+
export interface HotReloadConfig {
|
|
93
|
+
/** Whether hot reload is disabled */
|
|
94
|
+
disabled: boolean;
|
|
95
|
+
/** Debounce delay in milliseconds */
|
|
96
|
+
debounceMs: number;
|
|
97
|
+
}
|
|
98
|
+
/**
|
|
99
|
+
* Result of config diff operation
|
|
100
|
+
*/
|
|
101
|
+
export interface ConfigDiff {
|
|
102
|
+
/** Top-level sections that have changed */
|
|
103
|
+
changedSections: string[];
|
|
104
|
+
/** Keys that were added */
|
|
105
|
+
addedKeys: Record<string, unknown>;
|
|
106
|
+
/** Keys that were removed */
|
|
107
|
+
removedKeys: string[];
|
|
108
|
+
/** Keys that were modified with old and new values */
|
|
109
|
+
modifiedKeys: Record<string, {
|
|
110
|
+
old: unknown;
|
|
111
|
+
new: unknown;
|
|
112
|
+
}>;
|
|
113
|
+
}
|
|
114
|
+
/**
|
|
115
|
+
* ConfigWatcher event types
|
|
116
|
+
*/
|
|
117
|
+
export interface ConfigWatcherEvents {
|
|
118
|
+
change: (path: string) => void;
|
|
119
|
+
error: (error: Error) => void;
|
|
120
|
+
}
|
|
121
|
+
/**
|
|
122
|
+
* Abstract interface for ConfigWatcher (for type reference in options)
|
|
123
|
+
*/
|
|
124
|
+
export interface ConfigWatcher {
|
|
125
|
+
start(): Promise<void>;
|
|
126
|
+
stop(): void;
|
|
127
|
+
isWatching(): boolean;
|
|
128
|
+
on<K extends keyof ConfigWatcherEvents>(event: K, listener: ConfigWatcherEvents[K]): this;
|
|
129
|
+
off<K extends keyof ConfigWatcherEvents>(event: K, listener: ConfigWatcherEvents[K]): this;
|
|
130
|
+
}
|
|
131
|
+
//# sourceMappingURL=hot-reload.d.ts.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"hot-reload.d.ts","sourceRoot":"","sources":["../../src/types/hot-reload.ts"],"names":[],"mappings":"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"}
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"hot-reload.js","sourceRoot":"","sources":["../../src/types/hot-reload.ts"],"names":[],"mappings":"AAAA;;GAEG"}
|
|
@@ -0,0 +1,35 @@
|
|
|
1
|
+
/**
|
|
2
|
+
* Browser Opener Utility
|
|
3
|
+
* Requirements: FR-3 (Browser Opening)
|
|
4
|
+
*
|
|
5
|
+
* Cross-platform utility to open URLs in the default browser.
|
|
6
|
+
*/
|
|
7
|
+
/**
|
|
8
|
+
* Result of browser open operation
|
|
9
|
+
*/
|
|
10
|
+
export interface BrowserOpenResult {
|
|
11
|
+
success: boolean;
|
|
12
|
+
error?: string;
|
|
13
|
+
}
|
|
14
|
+
/**
|
|
15
|
+
* Open URL in default browser
|
|
16
|
+
*
|
|
17
|
+
* Uses platform-appropriate command:
|
|
18
|
+
* - macOS: open
|
|
19
|
+
* - Linux: xdg-open
|
|
20
|
+
* - Windows: start
|
|
21
|
+
*
|
|
22
|
+
* @param url - URL to open
|
|
23
|
+
* @returns Result indicating success or failure
|
|
24
|
+
*/
|
|
25
|
+
export declare function openBrowser(url: string): Promise<BrowserOpenResult>;
|
|
26
|
+
/**
|
|
27
|
+
* Get the command that would be used to open a URL
|
|
28
|
+
*
|
|
29
|
+
* Useful for testing and debugging.
|
|
30
|
+
*
|
|
31
|
+
* @param url - URL to open
|
|
32
|
+
* @returns Command string
|
|
33
|
+
*/
|
|
34
|
+
export declare function getBrowserCommand(url: string): string;
|
|
35
|
+
//# sourceMappingURL=browser-opener.d.ts.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"browser-opener.d.ts","sourceRoot":"","sources":["../../src/utils/browser-opener.ts"],"names":[],"mappings":"AAAA;;;;;GAKG;AAOH;;GAEG;AACH,MAAM,WAAW,iBAAiB;IAChC,OAAO,EAAE,OAAO,CAAC;IACjB,KAAK,CAAC,EAAE,MAAM,CAAC;CAChB;AAED;;;;;;;;;;GAUG;AACH,wBAAsB,WAAW,CAAC,GAAG,EAAE,MAAM,GAAG,OAAO,CAAC,iBAAiB,CAAC,CA8BzE;AAED;;;;;;;GAOG;AACH,wBAAgB,iBAAiB,CAAC,GAAG,EAAE,MAAM,GAAG,MAAM,CAYrD"}
|
|
@@ -0,0 +1,71 @@
|
|
|
1
|
+
/**
|
|
2
|
+
* Browser Opener Utility
|
|
3
|
+
* Requirements: FR-3 (Browser Opening)
|
|
4
|
+
*
|
|
5
|
+
* Cross-platform utility to open URLs in the default browser.
|
|
6
|
+
*/
|
|
7
|
+
import { exec } from 'child_process';
|
|
8
|
+
import { promisify } from 'util';
|
|
9
|
+
const execAsync = promisify(exec);
|
|
10
|
+
/**
|
|
11
|
+
* Open URL in default browser
|
|
12
|
+
*
|
|
13
|
+
* Uses platform-appropriate command:
|
|
14
|
+
* - macOS: open
|
|
15
|
+
* - Linux: xdg-open
|
|
16
|
+
* - Windows: start
|
|
17
|
+
*
|
|
18
|
+
* @param url - URL to open
|
|
19
|
+
* @returns Result indicating success or failure
|
|
20
|
+
*/
|
|
21
|
+
export async function openBrowser(url) {
|
|
22
|
+
const platform = process.platform;
|
|
23
|
+
let command;
|
|
24
|
+
switch (platform) {
|
|
25
|
+
case 'darwin':
|
|
26
|
+
// macOS
|
|
27
|
+
command = `open "${url}"`;
|
|
28
|
+
break;
|
|
29
|
+
case 'win32':
|
|
30
|
+
// Windows - use start with empty title
|
|
31
|
+
command = `start "" "${url}"`;
|
|
32
|
+
break;
|
|
33
|
+
case 'linux':
|
|
34
|
+
default:
|
|
35
|
+
// Linux and other Unix-like systems
|
|
36
|
+
command = `xdg-open "${url}"`;
|
|
37
|
+
break;
|
|
38
|
+
}
|
|
39
|
+
try {
|
|
40
|
+
await execAsync(command);
|
|
41
|
+
return { success: true };
|
|
42
|
+
}
|
|
43
|
+
catch (error) {
|
|
44
|
+
const errorMessage = error instanceof Error ? error.message : 'Unknown error';
|
|
45
|
+
return {
|
|
46
|
+
success: false,
|
|
47
|
+
error: `Failed to open browser: ${errorMessage}`,
|
|
48
|
+
};
|
|
49
|
+
}
|
|
50
|
+
}
|
|
51
|
+
/**
|
|
52
|
+
* Get the command that would be used to open a URL
|
|
53
|
+
*
|
|
54
|
+
* Useful for testing and debugging.
|
|
55
|
+
*
|
|
56
|
+
* @param url - URL to open
|
|
57
|
+
* @returns Command string
|
|
58
|
+
*/
|
|
59
|
+
export function getBrowserCommand(url) {
|
|
60
|
+
const platform = process.platform;
|
|
61
|
+
switch (platform) {
|
|
62
|
+
case 'darwin':
|
|
63
|
+
return `open "${url}"`;
|
|
64
|
+
case 'win32':
|
|
65
|
+
return `start "" "${url}"`;
|
|
66
|
+
case 'linux':
|
|
67
|
+
default:
|
|
68
|
+
return `xdg-open "${url}"`;
|
|
69
|
+
}
|
|
70
|
+
}
|
|
71
|
+
//# sourceMappingURL=browser-opener.js.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"browser-opener.js","sourceRoot":"","sources":["../../src/utils/browser-opener.ts"],"names":[],"mappings":"AAAA;;;;;GAKG;AAEH,OAAO,EAAE,IAAI,EAAE,MAAM,eAAe,CAAC;AACrC,OAAO,EAAE,SAAS,EAAE,MAAM,MAAM,CAAC;AAEjC,MAAM,SAAS,GAAG,SAAS,CAAC,IAAI,CAAC,CAAC;AAUlC;;;;;;;;;;GAUG;AACH,MAAM,CAAC,KAAK,UAAU,WAAW,CAAC,GAAW;IAC3C,MAAM,QAAQ,GAAG,OAAO,CAAC,QAAQ,CAAC;IAClC,IAAI,OAAe,CAAC;IAEpB,QAAQ,QAAQ,EAAE,CAAC;QACjB,KAAK,QAAQ;YACX,QAAQ;YACR,OAAO,GAAG,SAAS,GAAG,GAAG,CAAC;YAC1B,MAAM;QACR,KAAK,OAAO;YACV,uCAAuC;YACvC,OAAO,GAAG,aAAa,GAAG,GAAG,CAAC;YAC9B,MAAM;QACR,KAAK,OAAO,CAAC;QACb;YACE,oCAAoC;YACpC,OAAO,GAAG,aAAa,GAAG,GAAG,CAAC;YAC9B,MAAM;IACV,CAAC;IAED,IAAI,CAAC;QACH,MAAM,SAAS,CAAC,OAAO,CAAC,CAAC;QACzB,OAAO,EAAE,OAAO,EAAE,IAAI,EAAE,CAAC;IAC3B,CAAC;IAAC,OAAO,KAAK,EAAE,CAAC;QACf,MAAM,YAAY,GAAG,KAAK,YAAY,KAAK,CAAC,CAAC,CAAC,KAAK,CAAC,OAAO,CAAC,CAAC,CAAC,eAAe,CAAC;QAC9E,OAAO;YACL,OAAO,EAAE,KAAK;YACd,KAAK,EAAE,2BAA2B,YAAY,EAAE;SACjD,CAAC;IACJ,CAAC;AACH,CAAC;AAED;;;;;;;GAOG;AACH,MAAM,UAAU,iBAAiB,CAAC,GAAW;IAC3C,MAAM,QAAQ,GAAG,OAAO,CAAC,QAAQ,CAAC;IAElC,QAAQ,QAAQ,EAAE,CAAC;QACjB,KAAK,QAAQ;YACX,OAAO,SAAS,GAAG,GAAG,CAAC;QACzB,KAAK,OAAO;YACV,OAAO,aAAa,GAAG,GAAG,CAAC;QAC7B,KAAK,OAAO,CAAC;QACb;YACE,OAAO,aAAa,GAAG,GAAG,CAAC;IAC/B,CAAC;AACH,CAAC"}
|
package/dist/version.js
CHANGED
|
@@ -7,7 +7,7 @@
|
|
|
7
7
|
import { readFileSync, existsSync } from 'fs';
|
|
8
8
|
import { join } from 'path';
|
|
9
9
|
// Fallback version - keep in sync with package.json
|
|
10
|
-
const FALLBACK_VERSION = '0.
|
|
10
|
+
const FALLBACK_VERSION = '0.11.0';
|
|
11
11
|
function getVersion() {
|
|
12
12
|
// Try to find package.json from current working directory
|
|
13
13
|
const pkgPath = join(process.cwd(), 'package.json');
|
package/dist/version.js.map
CHANGED
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"version.js","sourceRoot":"","sources":["../src/version.ts"],"names":[],"mappings":"AAAA;;;;;GAKG;AAEH,OAAO,EAAE,YAAY,EAAE,UAAU,EAAE,MAAM,IAAI,CAAC;AAC9C,OAAO,EAAE,IAAI,EAAE,MAAM,MAAM,CAAC;AAE5B,oDAAoD;AACpD,MAAM,gBAAgB,GAAG,
|
|
1
|
+
{"version":3,"file":"version.js","sourceRoot":"","sources":["../src/version.ts"],"names":[],"mappings":"AAAA;;;;;GAKG;AAEH,OAAO,EAAE,YAAY,EAAE,UAAU,EAAE,MAAM,IAAI,CAAC;AAC9C,OAAO,EAAE,IAAI,EAAE,MAAM,MAAM,CAAC;AAE5B,oDAAoD;AACpD,MAAM,gBAAgB,GAAG,QAAQ,CAAC;AAElC,SAAS,UAAU;IACjB,0DAA0D;IAC1D,MAAM,OAAO,GAAG,IAAI,CAAC,OAAO,CAAC,GAAG,EAAE,EAAE,cAAc,CAAC,CAAC;IACpD,IAAI,CAAC;QACH,IAAI,UAAU,CAAC,OAAO,CAAC,EAAE,CAAC;YACxB,MAAM,GAAG,GAAG,IAAI,CAAC,KAAK,CAAC,YAAY,CAAC,OAAO,EAAE,OAAO,CAAC,CAAC,CAAC;YACvD,IAAI,GAAG,CAAC,IAAI,KAAK,iBAAiB,EAAE,CAAC;gBACnC,OAAO,GAAG,CAAC,OAAO,CAAC;YACrB,CAAC;QACH,CAAC;IACH,CAAC;IAAC,MAAM,CAAC;QACP,0BAA0B;IAC5B,CAAC;IACD,OAAO,gBAAgB,CAAC;AAC1B,CAAC;AAED,MAAM,CAAC,MAAM,OAAO,GAAG,UAAU,EAAE,CAAC;AACpC,MAAM,CAAC,MAAM,WAAW,GAAG,MAAM,CAAC"}
|