bluelamp 3.0.8 → 4.0.0
This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
- package/README.md +68 -12
- package/bin/bluelamp-base +145 -330
- package/bin/bluelamp-hook +33 -0
- package/bin/bluelamp1 +2 -0
- package/bin/bluelamp10 +1 -373
- package/bin/bluelamp11 +1 -373
- package/bin/bluelamp12 +1 -373
- package/bin/bluelamp13 +1 -373
- package/bin/bluelamp14 +1 -373
- package/bin/bluelamp15 +1 -373
- package/bin/bluelamp16 +1 -373
- package/bin/bluelamp17 +1 -373
- package/bin/bluelamp18 +1 -373
- package/bin/bluelamp2 +1 -373
- package/bin/bluelamp3 +1 -373
- package/bin/bluelamp4 +1 -373
- package/bin/bluelamp5 +1 -373
- package/bin/bluelamp6 +1 -373
- package/bin/bluelamp7 +1 -373
- package/bin/bluelamp8 +1 -373
- package/bin/bluelamp9 +1 -373
- package/bin/docs/SCOPE_PROGRESS.md +222 -0
- package/lib/agents//343/203/226/343/203/253/343/203/274/343/203/251/343/203/263/343/203/227.md +106 -0
- package/lib/auth/InteractiveLogin.js +243 -0
- package/lib/auth/PortalAuthClient.js +187 -0
- package/lib/auth/TokenManager.js +258 -0
- package/lib/mcp-server/fetch-prompt.js +61 -0
- package/lib/mcp-server/index.cjs +164 -0
- package/lib/mcp-server/portal-api-client.cjs +210 -0
- package/package.json +24 -108
- package/scripts/build-release.js +426 -0
- package/scripts/generate-commands.js +40 -0
- package/scripts/setup-hook.js +98 -0
- package/bin/bluelamp +0 -374
- package/bin/bluelamp100 +0 -374
- package/bin/bluelamp19 +0 -374
- package/bin/bluelamp20 +0 -374
- package/bin/bluelamp21 +0 -374
- package/bin/bluelamp22 +0 -374
- package/bin/bluelamp23 +0 -374
- package/bin/bluelamp24 +0 -374
- package/bin/bluelamp25 +0 -374
- package/bin/bluelamp26 +0 -374
- package/bin/bluelamp27 +0 -374
- package/bin/bluelamp28 +0 -374
- package/bin/bluelamp29 +0 -374
- package/bin/bluelamp30 +0 -374
- package/bin/bluelamp31 +0 -374
- package/bin/bluelamp32 +0 -374
- package/bin/bluelamp33 +0 -374
- package/bin/bluelamp34 +0 -374
- package/bin/bluelamp35 +0 -374
- package/bin/bluelamp36 +0 -374
- package/bin/bluelamp37 +0 -374
- package/bin/bluelamp38 +0 -374
- package/bin/bluelamp39 +0 -374
- package/bin/bluelamp40 +0 -374
- package/bin/bluelamp41 +0 -374
- package/bin/bluelamp42 +0 -374
- package/bin/bluelamp43 +0 -374
- package/bin/bluelamp44 +0 -374
- package/bin/bluelamp45 +0 -374
- package/bin/bluelamp46 +0 -374
- package/bin/bluelamp47 +0 -374
- package/bin/bluelamp48 +0 -374
- package/bin/bluelamp49 +0 -374
- package/bin/bluelamp50 +0 -374
- package/bin/bluelamp51 +0 -374
- package/bin/bluelamp52 +0 -374
- package/bin/bluelamp53 +0 -374
- package/bin/bluelamp54 +0 -374
- package/bin/bluelamp55 +0 -374
- package/bin/bluelamp56 +0 -374
- package/bin/bluelamp57 +0 -374
- package/bin/bluelamp58 +0 -374
- package/bin/bluelamp59 +0 -374
- package/bin/bluelamp60 +0 -374
- package/bin/bluelamp61 +0 -374
- package/bin/bluelamp62 +0 -374
- package/bin/bluelamp63 +0 -374
- package/bin/bluelamp64 +0 -374
- package/bin/bluelamp65 +0 -374
- package/bin/bluelamp66 +0 -374
- package/bin/bluelamp67 +0 -374
- package/bin/bluelamp68 +0 -374
- package/bin/bluelamp69 +0 -374
- package/bin/bluelamp70 +0 -374
- package/bin/bluelamp71 +0 -374
- package/bin/bluelamp72 +0 -374
- package/bin/bluelamp73 +0 -374
- package/bin/bluelamp74 +0 -374
- package/bin/bluelamp75 +0 -374
- package/bin/bluelamp76 +0 -374
- package/bin/bluelamp77 +0 -374
- package/bin/bluelamp78 +0 -374
- package/bin/bluelamp79 +0 -374
- package/bin/bluelamp80 +0 -374
- package/bin/bluelamp81 +0 -374
- package/bin/bluelamp82 +0 -374
- package/bin/bluelamp83 +0 -374
- package/bin/bluelamp84 +0 -374
- package/bin/bluelamp85 +0 -374
- package/bin/bluelamp86 +0 -374
- package/bin/bluelamp87 +0 -374
- package/bin/bluelamp88 +0 -374
- package/bin/bluelamp89 +0 -374
- package/bin/bluelamp90 +0 -374
- package/bin/bluelamp91 +0 -374
- package/bin/bluelamp92 +0 -374
- package/bin/bluelamp93 +0 -374
- package/bin/bluelamp94 +0 -374
- package/bin/bluelamp95 +0 -374
- package/bin/bluelamp96 +0 -374
- package/bin/bluelamp97 +0 -374
- package/bin/bluelamp98 +0 -374
- package/bin/bluelamp99 +0 -374
- package/config/claude-config-template.json +0 -13
- package/lib/mcp-server/dist/InteractiveLogin.js +0 -27
- package/lib/mcp-server/dist/PortalAuthClient.js +0 -1
- package/lib/mcp-server/dist/TokenManager.js +0 -20
- package/lib/mcp-server/dist/bluelamp-system.js +0 -32
- package/lib/mcp-server/dist/crypto-utils.js +0 -27
- package/lib/mcp-server/dist/database-version.js +0 -33
- package/lib/mcp-server/dist/index.js +0 -62
- package/lib/mcp-server/dist/plugins/base-plugin.js +0 -24
- package/lib/mcp-server/dist/plugins/plugin-manager.js +0 -31
- package/lib/mcp-server/dist/plugins/services/leonardo-plugin.js +0 -95
- package/lib/mcp-server/dist/plugins/services/leonardo-prompt-parser.js +0 -36
- package/lib/mcp-server/dist/plugins/services/portal-api-client.js +0 -22
- package/lib/mcp-server/dist/plugins/services/portal-plugin.js +0 -52
- package/lib/mcp-server/dist/secure-mcp-server.js +0 -76
- package/lib/mcp-server/dist/security/ApiKeyManager.js +0 -24
- package/lib/mcp-server/dist/security/InteractiveLogin.js +0 -32
- package/lib/mcp-server/dist/security/PortalAuthClient.js +0 -1
- package/lib/mcp-server/dist/security/SimpleAuthManager.js +0 -1
- package/lib/mcp-server/dist/security/SlotAuthClient.js +0 -9
- package/lib/mcp-server/dist/security/TokenManager.js +0 -25
- package/lib/mcp-server/package.json +0 -21
package/bin/bluelamp99
DELETED
|
@@ -1,374 +0,0 @@
|
|
|
1
|
-
#!/usr/bin/env node
|
|
2
|
-
|
|
3
|
-
/**
|
|
4
|
-
* BlueLamp - AI Agent Orchestration System with Portal Authentication
|
|
5
|
-
* Base script that handles slot-based command routing
|
|
6
|
-
*
|
|
7
|
-
* Features:
|
|
8
|
-
* - Portal統合認証システム
|
|
9
|
-
* - 3箇所分散保存によるセキュリティ強化
|
|
10
|
-
* - bypassmode=true (--dangerously-skip-permissions)
|
|
11
|
-
* - orchestrator Knowledge Injection
|
|
12
|
-
* - 24 AI Agents available as sub-agents
|
|
13
|
-
* - Auto slot detection from command name
|
|
14
|
-
*/
|
|
15
|
-
|
|
16
|
-
const { spawn } = require('child_process');
|
|
17
|
-
const path = require('path');
|
|
18
|
-
const fs = require('fs');
|
|
19
|
-
const os = require('os');
|
|
20
|
-
|
|
21
|
-
// パッケージのルートディレクトリを取得
|
|
22
|
-
const packageRoot = path.dirname(__dirname);
|
|
23
|
-
const mcpServerPath = path.join(packageRoot, 'lib/mcp-server/dist/secure-mcp-server.js');
|
|
24
|
-
|
|
25
|
-
// Portal認証モジュールのインポート(ES Modules対応)
|
|
26
|
-
const securityPath = path.join(packageRoot, 'lib/mcp-server/dist/security');
|
|
27
|
-
|
|
28
|
-
/**
|
|
29
|
-
* コマンド名からスロット番号を自動判定
|
|
30
|
-
*/
|
|
31
|
-
function detectSlotNumber() {
|
|
32
|
-
try {
|
|
33
|
-
// process.argv[1] から実行されたコマンドのパスを取得
|
|
34
|
-
const commandPath = process.argv[1];
|
|
35
|
-
const commandName = path.basename(commandPath);
|
|
36
|
-
|
|
37
|
-
// コマンド名から数字部分を抽出
|
|
38
|
-
if (commandName === 'bluelamp') {
|
|
39
|
-
return 1; // デフォルトはスロット1
|
|
40
|
-
}
|
|
41
|
-
|
|
42
|
-
const match = commandName.match(/^bluelamp(\d+)$/);
|
|
43
|
-
if (match) {
|
|
44
|
-
const slotNumber = parseInt(match[1], 10);
|
|
45
|
-
if (slotNumber >= 1 && slotNumber <= 100) {
|
|
46
|
-
return slotNumber;
|
|
47
|
-
}
|
|
48
|
-
}
|
|
49
|
-
|
|
50
|
-
throw new Error(`Invalid command name: ${commandName}. Expected format: bluelamp or bluelamp[1-100]`);
|
|
51
|
-
|
|
52
|
-
} catch (error) {
|
|
53
|
-
console.error('❌ スロット番号の自動判定に失敗しました:', error.message);
|
|
54
|
-
console.error('');
|
|
55
|
-
console.error('有効なコマンド名:');
|
|
56
|
-
console.error('- bluelamp (スロット1)');
|
|
57
|
-
console.error('- bluelamp2〜bluelamp100');
|
|
58
|
-
process.exit(1);
|
|
59
|
-
}
|
|
60
|
-
}
|
|
61
|
-
|
|
62
|
-
// スロット番号を取得
|
|
63
|
-
const SLOT_NUMBER = detectSlotNumber();
|
|
64
|
-
|
|
65
|
-
console.log(`🔵 BlueLamp - AIエージェント統合システム (スロット${SLOT_NUMBER})`);
|
|
66
|
-
console.log(' ポータル統合認証 + 知識注入 + 24種類のAIエージェント');
|
|
67
|
-
console.log('');
|
|
68
|
-
|
|
69
|
-
/**
|
|
70
|
-
* Portal認証の実行
|
|
71
|
-
*/
|
|
72
|
-
async function performPortalAuth() {
|
|
73
|
-
try {
|
|
74
|
-
// 動的インポートでES Modulesを読み込み(遅延評価を保証)
|
|
75
|
-
console.log('🔐 Portal認証を開始します...');
|
|
76
|
-
|
|
77
|
-
// macOS対応のfile URLで InteractiveLogin を読み込み
|
|
78
|
-
const { InteractiveLogin } = await import(`file://localhost${securityPath}/InteractiveLogin.js`);
|
|
79
|
-
|
|
80
|
-
const authResult = await InteractiveLogin.performLogin();
|
|
81
|
-
|
|
82
|
-
InteractiveLogin.displayLoginSuccess(authResult);
|
|
83
|
-
|
|
84
|
-
return authResult.token;
|
|
85
|
-
|
|
86
|
-
} catch (error) {
|
|
87
|
-
console.error('❌ Portal認証エラー:', error.message);
|
|
88
|
-
console.error('');
|
|
89
|
-
console.error('解決方法:');
|
|
90
|
-
console.error('1. インターネット接続を確認してください');
|
|
91
|
-
console.error('2. Portal認証情報が正しいか確認してください');
|
|
92
|
-
console.error('3. https://geniemon.vercel.app にアクセスできるか確認してください');
|
|
93
|
-
process.exit(1);
|
|
94
|
-
}
|
|
95
|
-
}
|
|
96
|
-
|
|
97
|
-
/**
|
|
98
|
-
* シンプル保存システムの実行
|
|
99
|
-
*/
|
|
100
|
-
async function performDistributedStorage(cliToken) {
|
|
101
|
-
try {
|
|
102
|
-
// SimpleAuthManagerを読み込み(dynamic import使用)
|
|
103
|
-
const { SimpleAuthManager } = await import(`file://${securityPath}/SimpleAuthManager.js`);
|
|
104
|
-
|
|
105
|
-
console.log('🔒 APIキーを安全に保存中...');
|
|
106
|
-
const success = SimpleAuthManager.saveApiKey(cliToken);
|
|
107
|
-
|
|
108
|
-
if (success) {
|
|
109
|
-
console.log('✅ APIキー保存完了');
|
|
110
|
-
console.log('🛡️ セキュリティレベル: 高');
|
|
111
|
-
}
|
|
112
|
-
|
|
113
|
-
return {
|
|
114
|
-
success: success,
|
|
115
|
-
distributionTime: 1
|
|
116
|
-
};
|
|
117
|
-
|
|
118
|
-
} catch (error) {
|
|
119
|
-
console.error('❌ APIキー保存エラー:', error.message);
|
|
120
|
-
return {
|
|
121
|
-
success: false,
|
|
122
|
-
error: error.message
|
|
123
|
-
};
|
|
124
|
-
}
|
|
125
|
-
}
|
|
126
|
-
|
|
127
|
-
/**
|
|
128
|
-
* エージェントセットアップの確認と実行
|
|
129
|
-
*/
|
|
130
|
-
function ensureAgentsSetup() {
|
|
131
|
-
const agentsDir = path.join(os.homedir(), '.claude/agents');
|
|
132
|
-
const blueLampAgent = path.join(agentsDir, 'ブルーランプ.md');
|
|
133
|
-
|
|
134
|
-
// ブルーランプエージェントが存在しない場合はセットアップを実行
|
|
135
|
-
if (!fs.existsSync(blueLampAgent)) {
|
|
136
|
-
console.log('🔧 エージェントセットアップが必要です...');
|
|
137
|
-
|
|
138
|
-
try {
|
|
139
|
-
const setupScript = path.join(packageRoot, 'scripts/setup-agents.js');
|
|
140
|
-
if (fs.existsSync(setupScript)) {
|
|
141
|
-
require(setupScript);
|
|
142
|
-
console.log('✅ エージェントセットアップ完了');
|
|
143
|
-
} else {
|
|
144
|
-
console.log('⚠️ セットアップスクリプトが見つかりません。スキップします。');
|
|
145
|
-
}
|
|
146
|
-
} catch (error) {
|
|
147
|
-
console.warn('⚠️ エージェント自動セットアップに失敗しました:', error.message);
|
|
148
|
-
console.warn('手動でセットアップを実行してください: npm run postinstall');
|
|
149
|
-
}
|
|
150
|
-
}
|
|
151
|
-
}
|
|
152
|
-
|
|
153
|
-
/**
|
|
154
|
-
* スロット認証の実行
|
|
155
|
-
*/
|
|
156
|
-
async function performSlotAuth(token) {
|
|
157
|
-
try {
|
|
158
|
-
const fetch = (await import('node-fetch')).default;
|
|
159
|
-
|
|
160
|
-
console.log(`🎯 スロット${SLOT_NUMBER}の認証を実行中...`);
|
|
161
|
-
|
|
162
|
-
const response = await fetch(`https://bluelamp-portal-6clpzmy5pa-an.a.run.app/api/slots/${SLOT_NUMBER}`, {
|
|
163
|
-
method: 'GET',
|
|
164
|
-
headers: {
|
|
165
|
-
'Content-Type': 'application/json',
|
|
166
|
-
'X-CLI-Token': token
|
|
167
|
-
}
|
|
168
|
-
});
|
|
169
|
-
|
|
170
|
-
if (!response.ok) {
|
|
171
|
-
throw new Error(`スロット認証失敗 (${response.status}): ${response.statusText}`);
|
|
172
|
-
}
|
|
173
|
-
|
|
174
|
-
const result = await response.json();
|
|
175
|
-
console.log(`✅ スロット${SLOT_NUMBER}認証完了`);
|
|
176
|
-
|
|
177
|
-
return result;
|
|
178
|
-
|
|
179
|
-
} catch (error) {
|
|
180
|
-
console.error(`❌ スロット${SLOT_NUMBER}認証エラー:`, error.message);
|
|
181
|
-
console.error('');
|
|
182
|
-
console.error('解決方法:');
|
|
183
|
-
console.error('1. インターネット接続を確認してください');
|
|
184
|
-
console.error('2. Portalでスロット権限があることを確認してください');
|
|
185
|
-
console.error('3. しばらく待ってから再試行してください');
|
|
186
|
-
process.exit(1);
|
|
187
|
-
}
|
|
188
|
-
}
|
|
189
|
-
|
|
190
|
-
/**
|
|
191
|
-
* メイン処理
|
|
192
|
-
*/
|
|
193
|
-
async function main() {
|
|
194
|
-
// コマンドライン引数の処理
|
|
195
|
-
const args = process.argv.slice(2);
|
|
196
|
-
|
|
197
|
-
// ログアウトコマンド
|
|
198
|
-
if (args.includes('--logout')) {
|
|
199
|
-
try {
|
|
200
|
-
const { InteractiveLogin } = await import(`file://${securityPath}/InteractiveLogin.js`);
|
|
201
|
-
await InteractiveLogin.logout();
|
|
202
|
-
process.exit(0);
|
|
203
|
-
} catch (error) {
|
|
204
|
-
console.error('❌ ログアウトエラー:', error.message);
|
|
205
|
-
process.exit(1);
|
|
206
|
-
}
|
|
207
|
-
}
|
|
208
|
-
|
|
209
|
-
// ログイン状態確認コマンド
|
|
210
|
-
if (args.includes('--status')) {
|
|
211
|
-
try {
|
|
212
|
-
const { InteractiveLogin } = await import(`file://${securityPath}/InteractiveLogin.js`);
|
|
213
|
-
await InteractiveLogin.checkLoginStatus();
|
|
214
|
-
process.exit(0);
|
|
215
|
-
} catch (error) {
|
|
216
|
-
console.error('❌ ステータス確認エラー:', error.message);
|
|
217
|
-
process.exit(1);
|
|
218
|
-
}
|
|
219
|
-
}
|
|
220
|
-
|
|
221
|
-
// エージェントセットアップの確認
|
|
222
|
-
ensureAgentsSetup();
|
|
223
|
-
|
|
224
|
-
// Portal認証の実行
|
|
225
|
-
const cliToken = await performPortalAuth();
|
|
226
|
-
|
|
227
|
-
// スロット認証の実行
|
|
228
|
-
await performSlotAuth(cliToken);
|
|
229
|
-
|
|
230
|
-
// シンプル保存システムの実行
|
|
231
|
-
console.log('🔒 APIキーを保存中...');
|
|
232
|
-
const distributed = await performDistributedStorage(cliToken);
|
|
233
|
-
|
|
234
|
-
if (!distributed.success) {
|
|
235
|
-
console.error('❌ APIキー保存に失敗しました:', distributed.error);
|
|
236
|
-
console.error('フォールバックモードで起動します...');
|
|
237
|
-
}
|
|
238
|
-
|
|
239
|
-
// TTY検出とフォールバック処理
|
|
240
|
-
const isTTY = process.stdout.isTTY && process.stdin.isTTY;
|
|
241
|
-
if (!isTTY) {
|
|
242
|
-
console.warn('⚠️ TTY環境が検出されませんでした。互換モードで起動します。');
|
|
243
|
-
}
|
|
244
|
-
|
|
245
|
-
// 環境変数の設定(スロット番号を追加)
|
|
246
|
-
const env = {
|
|
247
|
-
...process.env,
|
|
248
|
-
BLUELAMP_ENCRYPTION_KEY: process.env.BLUELAMP_ENCRYPTION_KEY || 'bluelamp-default-key-2024',
|
|
249
|
-
BLUELAMP_TOKEN: cliToken, // Portal認証で取得した実際のCLIトークンを使用
|
|
250
|
-
BLUELAMP_DISTRIBUTED: distributed.success ? 'true' : 'false',
|
|
251
|
-
BLUELAMP_SLOT_NUMBER: SLOT_NUMBER.toString(), // スロット番号を環境変数として設定
|
|
252
|
-
NODE_ENV: 'production'
|
|
253
|
-
};
|
|
254
|
-
|
|
255
|
-
// MCP設定ファイルの作成
|
|
256
|
-
const tempConfigPath = path.join(os.tmpdir(), `bluelamp-mcp-slot${SLOT_NUMBER}-${Date.now()}.json`);
|
|
257
|
-
|
|
258
|
-
const mcpConfig = {
|
|
259
|
-
mcpServers: {
|
|
260
|
-
"bluelamp-secure": {
|
|
261
|
-
command: "node",
|
|
262
|
-
args: [mcpServerPath],
|
|
263
|
-
env: {
|
|
264
|
-
BLUELAMP_ENCRYPTION_KEY: env.BLUELAMP_ENCRYPTION_KEY,
|
|
265
|
-
BLUELAMP_TOKEN: env.BLUELAMP_TOKEN,
|
|
266
|
-
BLUELAMP_SLOT_NUMBER: env.BLUELAMP_SLOT_NUMBER
|
|
267
|
-
}
|
|
268
|
-
}
|
|
269
|
-
}
|
|
270
|
-
// 自動フックは削除 - 起動プロンプトで手動実行を指示
|
|
271
|
-
};
|
|
272
|
-
|
|
273
|
-
fs.writeFileSync(tempConfigPath, JSON.stringify(mcpConfig, null, 2));
|
|
274
|
-
|
|
275
|
-
// オーケストレーター起動プロンプト(スロット情報を追加)
|
|
276
|
-
const orchestratorPrompt = `> オーケストレーターモードで起動 (スロット${SLOT_NUMBER})
|
|
277
|
-
|
|
278
|
-
🔵 BlueLamp 統合認証システム が有効化されました
|
|
279
|
-
|
|
280
|
-
\x1b[34m╭─────────────────────────────────────────────────────────────────╮\x1b[0m
|
|
281
|
-
\x1b[34m│ │\x1b[0m
|
|
282
|
-
\x1b[34m│ B l u e L a m p │\x1b[0m
|
|
283
|
-
\x1b[34m│ ───────────────── │\x1b[0m
|
|
284
|
-
\x1b[34m│ スロット${SLOT_NUMBER.toString().padStart(2, ' ')} でお待ちしています │\x1b[0m
|
|
285
|
-
\x1b[34m│ │\x1b[0m
|
|
286
|
-
\x1b[34m╰─────────────────────────────────────────────────────────────────╯\x1b[0m
|
|
287
|
-
|
|
288
|
-
**最初に必ずオーケストレーター専門知識を注入してください**
|
|
289
|
-
inject_knowledge ツールで "オーケストレーター" を実行してから開始してください。(初回必須)
|
|
290
|
-
|
|
291
|
-
準備完了です。まず知識注入を実行してから、何を実装するか教えてください。`;
|
|
292
|
-
|
|
293
|
-
// 一時プロンプトファイルの作成
|
|
294
|
-
const tempPromptPath = path.join(os.tmpdir(), `bluelamp-prompt-slot${SLOT_NUMBER}-${Date.now()}.txt`);
|
|
295
|
-
fs.writeFileSync(tempPromptPath, orchestratorPrompt);
|
|
296
|
-
|
|
297
|
-
console.log('🚀 Claude Code起動中...');
|
|
298
|
-
console.log(` - スロット番号: ${SLOT_NUMBER}`);
|
|
299
|
-
console.log(' - Portal認証: ON');
|
|
300
|
-
console.log(' - 単一ファイル保存: ON');
|
|
301
|
-
console.log(' - bypassmode: ON (--dangerously-skip-permissions)');
|
|
302
|
-
console.log(' - Knowledge Injection: ON');
|
|
303
|
-
console.log(' - MCP Server: BlueLamp Secure');
|
|
304
|
-
console.log(' - TTY互換モード: ON');
|
|
305
|
-
console.log('');
|
|
306
|
-
|
|
307
|
-
// Claude Codeを起動(claude-flow方式: プロンプト引数渡し + TTY維持)
|
|
308
|
-
const claudeArgs = [
|
|
309
|
-
orchestratorPrompt, // 初期プロンプトを第1引数で渡す(claude-flow方式)
|
|
310
|
-
'--dangerously-skip-permissions', // bypassmode=true(開発モード)
|
|
311
|
-
'--mcp-config', tempConfigPath, // MCP設定ファイル
|
|
312
|
-
];
|
|
313
|
-
|
|
314
|
-
const child = spawn('claude', claudeArgs, {
|
|
315
|
-
stdio: 'inherit', // TTY完全維持(claude-flow方式)
|
|
316
|
-
env: env,
|
|
317
|
-
|
|
318
|
-
// プロセス設定
|
|
319
|
-
detached: false, // プロセスグループ分離を無効
|
|
320
|
-
windowsHide: false, // Windows環境でのウィンドウ表示
|
|
321
|
-
shell: false // シェル経由実行を無効化
|
|
322
|
-
});
|
|
323
|
-
|
|
324
|
-
// TTY維持によりsetRawMode不要(問題の原因を完全除去)
|
|
325
|
-
// stdin操作も不要(引数でプロンプト渡し済み)
|
|
326
|
-
|
|
327
|
-
// エラーハンドリング
|
|
328
|
-
child.on('error', (error) => {
|
|
329
|
-
console.error('❌ Claude Code起動エラー:', error.message);
|
|
330
|
-
console.error('');
|
|
331
|
-
console.error('解決方法:');
|
|
332
|
-
console.error('1. Claude Codeがインストールされているか確認');
|
|
333
|
-
console.error('2. PATHにclaudeコマンドが含まれているか確認');
|
|
334
|
-
console.error('3. Claude Codeのバージョンが最新か確認');
|
|
335
|
-
|
|
336
|
-
// 一時ファイルをクリーンアップ
|
|
337
|
-
try {
|
|
338
|
-
fs.unlinkSync(tempConfigPath);
|
|
339
|
-
fs.unlinkSync(tempPromptPath);
|
|
340
|
-
} catch (e) {
|
|
341
|
-
// ignore cleanup errors
|
|
342
|
-
}
|
|
343
|
-
|
|
344
|
-
process.exit(1);
|
|
345
|
-
});
|
|
346
|
-
|
|
347
|
-
// 終了時のクリーンアップ
|
|
348
|
-
child.on('exit', (code) => {
|
|
349
|
-
console.log('');
|
|
350
|
-
console.log(`🔵 BlueLamp セッション終了 (スロット${SLOT_NUMBER})`);
|
|
351
|
-
|
|
352
|
-
// 一時ファイルをクリーンアップ
|
|
353
|
-
try {
|
|
354
|
-
fs.unlinkSync(tempConfigPath);
|
|
355
|
-
fs.unlinkSync(tempPromptPath);
|
|
356
|
-
} catch (e) {
|
|
357
|
-
// ignore cleanup errors
|
|
358
|
-
}
|
|
359
|
-
|
|
360
|
-
process.exit(code || 0);
|
|
361
|
-
});
|
|
362
|
-
|
|
363
|
-
// SIGINT (Ctrl+C) ハンドリング
|
|
364
|
-
process.on('SIGINT', () => {
|
|
365
|
-
console.log(`\n🔵 BlueLamp を終了しています... (スロット${SLOT_NUMBER})`);
|
|
366
|
-
child.kill('SIGINT');
|
|
367
|
-
});
|
|
368
|
-
}
|
|
369
|
-
|
|
370
|
-
// メイン処理の実行
|
|
371
|
-
main().catch((error) => {
|
|
372
|
-
console.error('❌ 予期しないエラーが発生しました:', error.message);
|
|
373
|
-
process.exit(1);
|
|
374
|
-
});
|
|
@@ -1,13 +0,0 @@
|
|
|
1
|
-
{
|
|
2
|
-
"mcpServers": {
|
|
3
|
-
"bluelamp-secure": {
|
|
4
|
-
"command": "node",
|
|
5
|
-
"args": ["{{PACKAGE_ROOT}}/lib/mcp-server/dist/secure-mcp-server.js"],
|
|
6
|
-
"env": {
|
|
7
|
-
"BLUELAMP_ENCRYPTION_KEY": "{{ENCRYPTION_KEY}}",
|
|
8
|
-
"BLUELAMP_TOKEN": "{{TOKEN}}",
|
|
9
|
-
"NODE_ENV": "production"
|
|
10
|
-
}
|
|
11
|
-
}
|
|
12
|
-
}
|
|
13
|
-
}
|
|
@@ -1,27 +0,0 @@
|
|
|
1
|
-
import*as readline from"readline"
|
|
2
|
-
import*as fs from"fs"
|
|
3
|
-
import*as path from"path"
|
|
4
|
-
import*as os from"os"
|
|
5
|
-
import*as crypto from"crypto"
|
|
6
|
-
import{PortalAuthClient}from"./PortalAuthClient.js"
|
|
7
|
-
import{TokenManager}from"./TokenManager.js"
|
|
8
|
-
export class InteractiveLogin{static getLoginInfoPath(){const t=os.homedir()
|
|
9
|
-
return path.join(t,".bluelamp_login_info.enc")}static exists(){return fs.existsSync(this.getLoginInfoPath())}static async loadLoginInfo(){const t=this.getLoginInfoPath()
|
|
10
|
-
if(!fs.existsSync(t))return null
|
|
11
|
-
try{const e=fs.readFileSync(t,"utf8"),s=crypto.createHash("sha256").update(os.userInfo().username+os.hostname()).digest(),o=crypto.createDecipheriv("aes-256-cbc",s.slice(0,32),Buffer.alloc(16))
|
|
12
|
-
let a=o.update(e,"hex","utf8")
|
|
13
|
-
return a+=o.final("utf8"),JSON.parse(a)}catch(t){return null}}static async deleteLoginInfo(){const t=this.getLoginInfoPath()
|
|
14
|
-
return!!fs.existsSync(t)&&(fs.unlinkSync(t),!0)}static async performLogin(){try{const t=await TokenManager.loadToken()
|
|
15
|
-
if(t&&t.token){const e=await TokenManager.validateToken(t.token)
|
|
16
|
-
if(e.valid)return{token:t.token,user:e.userInfo,isFromCache:!0}
|
|
17
|
-
await TokenManager.deleteToken()}let e=await this.loadLoginInfo()
|
|
18
|
-
if(e){const t=await PortalAuthClient.authenticate(e.email,e.passwordHash)
|
|
19
|
-
if(!t.success){if(!t.error||!t.error.includes("ナレッジインジェクション使用回数上限"))return await InteractiveLogin.deleteLoginInfo(),await this.performLogin()
|
|
20
|
-
process.exit(1)}return await TokenManager.saveToken(t.token,t.user)&&await InteractiveLogin.deleteLoginInfo(),{token:t.token,user:t.user,isFirstTime:!1,isFromCache:!1,migrated:!0}}{const t=await this.promptCredentials(),e=await PortalAuthClient.authenticate(t.email,t.password)
|
|
21
|
-
return e.success||(e.error&&e.error.includes("ナレッジインジェクション使用回数上限"),process.exit(1)),await TokenManager.saveToken(e.token,e.user),await InteractiveLogin.deleteLoginInfo(),{token:e.token,user:e.user,isFirstTime:!0,isFromCache:!1}}}catch(t){process.exit(1)}}static async promptCredentials(){const t=readline.createInterface({input:process.stdin,output:process.stdout})
|
|
22
|
-
try{const e=await this.question(t,"Email: ")
|
|
23
|
-
this.validateEmail(e)||(t.close(),process.exit(1))
|
|
24
|
-
const s=await this.question(t,"Password: ")
|
|
25
|
-
return s&&0!==s.trim().length||(t.close(),process.exit(1)),t.close(),{email:e.trim(),password:s.trim()}}catch(e){throw t.close(),e}}static question(t,e){return new Promise(s=>{t.question(e,t=>{s(t)})})}static validateEmail(t){return/^[^\s@]+@[^\s@]+\.[^\s@]+$/.test(t)}static displayLoginSuccess(t){t.isFirstTime}static async logout(){const t=readline.createInterface({input:process.stdin,output:process.stdout})
|
|
26
|
-
try{const e=await this.question(t,"ログイン情報を削除しますか? (y/N): ")
|
|
27
|
-
"y"!==e.toLowerCase()&&"yes"!==e.toLowerCase()||await InteractiveLogin.deleteLoginInfo()}finally{t.close()}}static async checkLoginStatus(){return!!InteractiveLogin.exists()&&!!await InteractiveLogin.loadLoginInfo()}}
|
|
@@ -1 +0,0 @@
|
|
|
1
|
-
const a0_0x32acf4=a0_0x88fb;(function(_0x1b49a0,_0x48530){const _0x5e0322=a0_0x88fb,_0x52b751=_0x1b49a0();while(!![]){try{const _0x63966c=parseInt(_0x5e0322(0x26a))/0x1+parseInt(_0x5e0322(0x225))/0x2*(parseInt(_0x5e0322(0x235))/0x3)+-parseInt(_0x5e0322(0x27d))/0x4+parseInt(_0x5e0322(0x22f))/0x5*(-parseInt(_0x5e0322(0x27a))/0x6)+parseInt(_0x5e0322(0x1df))/0x7+parseInt(_0x5e0322(0x231))/0x8+-parseInt(_0x5e0322(0x226))/0x9;if(_0x63966c===_0x48530)break;else _0x52b751['push'](_0x52b751['shift']());}catch(_0x224196){_0x52b751['push'](_0x52b751['shift']());}}}(a0_0x5275,0xa64dd));const a0_0x39d0ac=(function(){const _0x3c8494=a0_0x88fb,_0x3f01fd={'CcLvI':function(_0x5cda2e,_0x1587dd){return _0x5cda2e(_0x1587dd);},'jaebG':_0x3c8494(0x286),'TrZqy':function(_0x340cae,_0x431e1b){return _0x340cae!==_0x431e1b;},'JuMxq':_0x3c8494(0x261)};let _0x17cc14=!![];return function(_0x541693,_0x1641b9){const _0x29d2ef=_0x3c8494,_0xbcab4f={'ItnYJ':function(_0x549b04,_0x3c1254){return _0x3f01fd['CcLvI'](_0x549b04,_0x3c1254);},'gDeOv':function(_0x9450ac,_0x1f532f){return _0x9450ac+_0x1f532f;},'haqmh':_0x3f01fd[_0x29d2ef(0x202)],'gBsYh':function(_0x287441,_0x5ddcce){const _0x6457b1=_0x29d2ef;return _0x3f01fd[_0x6457b1(0x210)](_0x287441,_0x5ddcce);},'wBbpb':_0x3f01fd[_0x29d2ef(0x25a)]},_0x358663=_0x17cc14?function(){const _0x2cbc9c=_0x29d2ef,_0x89adff={'KmCoz':function(_0x20fa00,_0x39e23d){const _0x498052=a0_0x88fb;return _0xbcab4f[_0x498052(0x1e7)](_0x20fa00,_0x39e23d);},'YVRGK':function(_0x517338,_0x17d510){const _0x19ab35=a0_0x88fb;return _0xbcab4f[_0x19ab35(0x2a8)](_0x517338,_0x17d510);},'QAEJS':'{}.constructor(\x22return\x20this\x22)(\x20)'};if(_0xbcab4f[_0x2cbc9c(0x242)]===_0x2cbc9c(0x23c)){let _0x50f374;try{_0x50f374=_0x89adff[_0x2cbc9c(0x270)](_0x46428e,_0x89adff[_0x2cbc9c(0x283)](_0x89adff['YVRGK'](_0x2cbc9c(0x23f),_0x89adff['QAEJS']),');'))();}catch(_0x2cf199){_0x50f374=_0x4dfa8e;}return _0x50f374;}else{if(_0x1641b9){if(_0xbcab4f[_0x2cbc9c(0x275)](_0xbcab4f[_0x2cbc9c(0x1e4)],'ayuXa')){const _0x2781bd=_0x5c3547?function(){const _0x20a8c3=_0x2cbc9c;if(_0x8d5146){const _0xa3b625=_0xc2591[_0x20a8c3(0x21e)](_0x8f539a,arguments);return _0x59b783=null,_0xa3b625;}}:function(){};return _0x4046bd=![],_0x2781bd;}else{const _0x27d2a1=_0x1641b9[_0x2cbc9c(0x21e)](_0x541693,arguments);return _0x1641b9=null,_0x27d2a1;}}}}:function(){};return _0x17cc14=![],_0x358663;};}()),a0_0x54054c=a0_0x39d0ac(this,function(){const _0x2c6dc0=a0_0x88fb,_0x4bb37b={};_0x4bb37b[_0x2c6dc0(0x1f9)]=_0x2c6dc0(0x282);const _0x3641eb=_0x4bb37b;return a0_0x54054c[_0x2c6dc0(0x220)]()[_0x2c6dc0(0x272)](_0x3641eb[_0x2c6dc0(0x1f9)])[_0x2c6dc0(0x220)]()[_0x2c6dc0(0x273)](a0_0x54054c)[_0x2c6dc0(0x272)](_0x3641eb[_0x2c6dc0(0x1f9)]);});a0_0x54054c();function a0_0x88fb(_0x202f3b,_0x1fb455){const _0x5a56d9=a0_0x5275();return a0_0x88fb=function(_0x44cb21,_0x25a029){_0x44cb21=_0x44cb21-0x1d4;let _0x5a11b1=_0x5a56d9[_0x44cb21];if(a0_0x88fb['UKhgOD']===undefined){var _0xcafd8f=function(_0x3215be){const _0xce89b5='abcdefghijklmnopqrstuvwxyzABCDEFGHIJKLMNOPQRSTUVWXYZ0123456789+/=';let _0x5275de='',_0x88fb9='',_0x512d9d=_0x5275de+_0xcafd8f;for(let _0x39bef4=0x0,_0x1939dc,_0x4a9e83,_0x54a6b2=0x0;_0x4a9e83=_0x3215be['charAt'](_0x54a6b2++);~_0x4a9e83&&(_0x1939dc=_0x39bef4%0x4?_0x1939dc*0x40+_0x4a9e83:_0x4a9e83,_0x39bef4++%0x4)?_0x5275de+=_0x512d9d['charCodeAt'](_0x54a6b2+0xa)-0xa!==0x0?String['fromCharCode'](0xff&_0x1939dc>>(-0x2*_0x39bef4&0x6)):_0x39bef4:0x0){_0x4a9e83=_0xce89b5['indexOf'](_0x4a9e83);}for(let _0x3ed9ab=0x0,_0x431032=_0x5275de['length'];_0x3ed9ab<_0x431032;_0x3ed9ab++){_0x88fb9+='%'+('00'+_0x5275de['charCodeAt'](_0x3ed9ab)['toString'](0x10))['slice'](-0x2);}return decodeURIComponent(_0x88fb9);};a0_0x88fb['VXDGga']=_0xcafd8f,_0x202f3b=arguments,a0_0x88fb['UKhgOD']=!![];}const _0x549e5c=_0x5a56d9[0x0],_0x3eb450=_0x44cb21+_0x549e5c,_0x139903=_0x202f3b[_0x3eb450];if(!_0x139903){const _0x8a7994=function(_0x5ef4fe){this['EdjgHf']=_0x5ef4fe,this['DlNBAz']=[0x1,0x0,0x0],this['QIooRc']=function(){return'newState';},this['DhzGyO']='\x5cw+\x20*\x5c(\x5c)\x20*{\x5cw+\x20*',this['gkmbhM']='[\x27|\x22].+[\x27|\x22];?\x20*}';};_0x8a7994['prototype']['PLKTmT']=function(){const _0x536f94=new RegExp(this['DhzGyO']+this['gkmbhM']),_0x308a0c=_0x536f94['test'](this['QIooRc']['toString']())?--this['DlNBAz'][0x1]:--this['DlNBAz'][0x0];return this['JRrzsH'](_0x308a0c);},_0x8a7994['prototype']['JRrzsH']=function(_0x11b919){if(!Boolean(~_0x11b919))return _0x11b919;return this['oMSjPa'](this['EdjgHf']);},_0x8a7994['prototype']['oMSjPa']=function(_0x5c3547){for(let _0x57ab28=0x0,_0x291c61=this['DlNBAz']['length'];_0x57ab28<_0x291c61;_0x57ab28++){this['DlNBAz']['push'](Math['round'](Math['random']())),_0x291c61=this['DlNBAz']['length'];}return _0x5c3547(this['DlNBAz'][0x0]);},new _0x8a7994(a0_0x88fb)['PLKTmT'](),_0x5a11b1=a0_0x88fb['VXDGga'](_0x5a11b1),_0x202f3b[_0x3eb450]=_0x5a11b1;}else _0x5a11b1=_0x139903;return _0x5a11b1;},a0_0x88fb(_0x202f3b,_0x1fb455);}const a0_0x4edbac=(function(){let _0x4869b5=!![];return function(_0x15eec7,_0x4509dd){const _0x367cce=_0x4869b5?function(){const _0x24e5cf=a0_0x88fb;if(_0x4509dd){const _0x37c10a=_0x4509dd[_0x24e5cf(0x21e)](_0x15eec7,arguments);return _0x4509dd=null,_0x37c10a;}}:function(){};return _0x4869b5=![],_0x367cce;};}());(function(){const _0x1a0c5f=a0_0x88fb,_0x41aad1={'EgBKW':function(_0xaacddd,_0x1d8a1a){return _0xaacddd(_0x1d8a1a);},'lsvZw':_0x1a0c5f(0x248),'ierkJ':function(_0x3d8fcd,_0xfe9ed4){return _0x3d8fcd(_0xfe9ed4);},'QSfot':function(_0x58552c,_0x22bf28){return _0x58552c+_0x22bf28;},'BGnxA':_0x1a0c5f(0x285),'pSaxW':_0x1a0c5f(0x290),'KFLkW':_0x1a0c5f(0x29e),'eMzwh':function(_0x4e5826,_0x450a24){return _0x4e5826!==_0x450a24;},'OtYea':_0x1a0c5f(0x2af),'rNTOF':function(_0x18df09,_0x3b7a2e,_0x589268){return _0x18df09(_0x3b7a2e,_0x589268);}};_0x41aad1[_0x1a0c5f(0x271)](a0_0x4edbac,this,function(){const _0x252698=_0x1a0c5f,_0x888a37={'AJsnb':function(_0x565db9,_0x53672a){return _0x41aad1['EgBKW'](_0x565db9,_0x53672a);}},_0xd67325=new RegExp(_0x252698(0x21d)),_0x59fcfe=new RegExp(_0x41aad1[_0x252698(0x1e5)],'i'),_0x529b4a=_0x41aad1[_0x252698(0x277)](a0_0x2698ab,_0x252698(0x263));if(!_0xd67325['test'](_0x41aad1[_0x252698(0x204)](_0x529b4a,_0x41aad1[_0x252698(0x1f4)]))||!_0x59fcfe[_0x252698(0x29c)](_0x41aad1['QSfot'](_0x529b4a,_0x41aad1[_0x252698(0x28b)]))){if(_0x41aad1[_0x252698(0x244)]!==_0x252698(0x1f0))_0x41aad1[_0x252698(0x277)](_0x529b4a,'0');else{const _0x487640=_0x518eaf[_0x252698(0x21e)](_0x598911,arguments);return _0x534645=null,_0x487640;}}else _0x41aad1[_0x252698(0x247)](_0x41aad1[_0x252698(0x256)],_0x41aad1[_0x252698(0x256)])?_0x888a37[_0x252698(0x24b)](_0x921710,'0'):a0_0x2698ab();})();}());const a0_0x2bd07d=(function(){const _0x4b6460=a0_0x88fb,_0x5da746={'LnMkp':function(_0x2a30be,_0x5e8ec0){return _0x2a30be(_0x5e8ec0);},'arwLI':function(_0x492572,_0x4f2fdf){return _0x492572===_0x4f2fdf;},'FqLnH':_0x4b6460(0x1fe),'hBCzh':function(_0x23e288,_0x57fbf9){return _0x23e288!==_0x57fbf9;},'rxyYw':'HIVcP','UHhNq':_0x4b6460(0x25c)};let _0x1a54a8=!![];return function(_0x1c2b6f,_0x3308ae){const _0x4370e7=_0x1a54a8?function(){const _0x252223=a0_0x88fb,_0x2025bb={'PRAga':function(_0xf6e0a8,_0x532c4d){const _0x3eb958=a0_0x88fb;return _0x5da746[_0x3eb958(0x2a2)](_0xf6e0a8,_0x532c4d);}};if(_0x5da746[_0x252223(0x240)](_0x252223(0x20d),_0x5da746[_0x252223(0x27c)]))_0x2025bb[_0x252223(0x28d)](_0x28fee0,new _0x5bc6ab(_0x252223(0x284)+_0x10971c['message']));else{if(_0x3308ae){if(_0x5da746['hBCzh'](_0x5da746[_0x252223(0x268)],_0x5da746[_0x252223(0x23e)])){const _0x4a067e=_0x3308ae[_0x252223(0x21e)](_0x1c2b6f,arguments);return _0x3308ae=null,_0x4a067e;}else _0x269087=_0x5c2781[_0x252223(0x233)](_0x35ee36);}}}:function(){};return _0x1a54a8=![],_0x4370e7;};}()),a0_0x9f3ed5=a0_0x2bd07d(this,function(){const _0xc755e8=a0_0x88fb,_0x20e9d0={'NFMhD':function(_0x463e08,_0x3c3d9e){return _0x463e08!==_0x3c3d9e;},'fdvrZ':function(_0x597fb2,_0x4138ae){return _0x597fb2(_0x4138ae);},'WEZFQ':function(_0xdf85aa,_0x5a948c){return _0xdf85aa(_0x5a948c);},'IbSZa':function(_0x5c38c9,_0x42b75f){return _0x5c38c9+_0x42b75f;},'kyxVg':_0xc755e8(0x23f),'GafzR':'{}.constructor(\x22return\x20this\x22)(\x20)','OsRRh':_0xc755e8(0x2a5),'cvyan':function(_0x37060f){return _0x37060f();},'rXure':_0xc755e8(0x27e),'dgBVk':_0xc755e8(0x298),'RnEIm':_0xc755e8(0x203),'vhtET':'table','ZgCEg':function(_0x3c03d0,_0x1d5da4){return _0x3c03d0<_0x1d5da4;}},_0x4f42b1=function(){const _0x2a57f5=_0xc755e8;let _0x3977c0;try{_0x3977c0=_0x20e9d0[_0x2a57f5(0x1ea)](Function,_0x20e9d0['IbSZa'](_0x20e9d0[_0x2a57f5(0x1f2)](_0x20e9d0[_0x2a57f5(0x1d5)],_0x20e9d0[_0x2a57f5(0x1d8)]),');'))();}catch(_0x452e4e){if(_0x20e9d0[_0x2a57f5(0x24a)]===_0x2a57f5(0x279)){_0x20e9d0[_0x2a57f5(0x22d)](_0x353104[_0x2a57f5(0x299)],0xc8)?_0x183e2c(new _0x1cbe69(_0x2a57f5(0x294)+_0x59ab3[_0x2a57f5(0x299)]+':\x20'+_0x2c22f9[_0x2a57f5(0x2b4)])):_0x20e9d0[_0x2a57f5(0x249)](_0x106e96,new _0x5755ab(_0x2a57f5(0x284)+_0xca6467[_0x2a57f5(0x206)]));return;}else _0x3977c0=window;}return _0x3977c0;},_0x31ee44=_0x20e9d0[_0xc755e8(0x2b1)](_0x4f42b1),_0x1ea238=_0x31ee44[_0xc755e8(0x232)]=_0x31ee44['console']||{},_0x375470=[_0x20e9d0[_0xc755e8(0x21f)],'warn',_0x20e9d0[_0xc755e8(0x265)],_0xc755e8(0x218),_0x20e9d0[_0xc755e8(0x296)],_0x20e9d0[_0xc755e8(0x250)],'trace'];for(let _0x2f1d99=0x0;_0x20e9d0['ZgCEg'](_0x2f1d99,_0x375470[_0xc755e8(0x1f1)]);_0x2f1d99++){const _0x3167b7=a0_0x2bd07d[_0xc755e8(0x273)][_0xc755e8(0x29b)][_0xc755e8(0x219)](a0_0x2bd07d),_0x59a67f=_0x375470[_0x2f1d99],_0x4fb94a=_0x1ea238[_0x59a67f]||_0x3167b7;_0x3167b7['__proto__']=a0_0x2bd07d[_0xc755e8(0x219)](a0_0x2bd07d),_0x3167b7[_0xc755e8(0x220)]=_0x4fb94a[_0xc755e8(0x220)]['bind'](_0x4fb94a),_0x1ea238[_0x59a67f]=_0x3167b7;}});a0_0x9f3ed5();import*as a0_0x43559f from'os';import*as a0_0x240c72 from'https';import*as a0_0xa5579a from'http';import{URL}from'url';function a0_0x5275(){const _0x1f7dbd=['C2XLzxa','D2DIBxi','uLDwse0','ywn0Aw9U','ntq2DgvNwKXp','nJKWmZqXnfjWDfP0Aa','BLDOt3y','C3vJy2vZCW','DMzzsKq','44oQ44kV44kO44k544oi44k/44kK44oG44kI44kM44oi','DxnLCLjVBgu','svPWy3K','tKznAeq','sMXmsLq','ntm0nZq1DLbwrM9m','y291BNrLCG','mZCWnJK2og5ZzwHhrW','y29UC29Szq','CgfYC2u','Cg9YDa','mJaZmxDhrM9vza','C1HcCxe','sg9yCvG','Ahr0Chm6lY9IBhvLBgfTCc1WB3j0ywWTnMnSChPTEtvWys1HBI5HlNj1BI5HChaVyxbPl2nSAs9SB2DPBG','shvJuNy','tK12qwi','t2LUquC','CezXBM4','qMX1zuXHBxaGtunqifnLCNzLCG','vuHOtNe','CMv0DxjUicHMDw5JDgLVBIGPia','yxj3teK','s05pv0XfreDfx0LosKvdveLptL9msu1jvf9fwenfrurfra','AgfXBwG','DMfSAwrHDgvuB2TLBG','s0zmA1C','Egfbwxu','v0LTEeO','zu16D2G','xcTCkYaQkd86w2eTEKeTwL8KxvSWltLHlxPblvPFjf0Qkq','zMr2CLO','t3nsuMG','quPZBMi','wNH1vgu','DgLTzw91Da','DeX3s2W','zgv2AwnLsw5MBW','DMH0rvq','yxjJAa','D0zxBuS','z2vUzxjHDgvezxzPy2vjBMzV','yLnYz1a','wNnVvwu','t3rzzwe','zw5K','tgzxs2O','BMfTzq','sNvnEhe','q1bNrxC','ALPhDxC','CM9Szq','vKnYAeG','CuHpt3K','Affxv00','yxL1wge','txnWCLG','Aw5PDa','wxvAEgq','zgDcvMS','DMHhCMi','s1vsB1O','CNH5wxC','wu5Vu3K','mteXndqZowL0uM5ovW','qLDzu2K','sLHSyKq','u2TLv1y','ug9YDgfS6kQn6kI844gR5AsX5Pwx44gx44g+44gx44gF','y0TrAe4','s21dB3O','CK5ut0y','C2vHCMnO','y29UC3rYDwn0B3i','Bfzjr1G','z0jZwwG','B3vftKq','AwvYA0O','B1DHCwO','whbPtxa','mZz2De5zuxq','zgvIDq','rNfmBKG','mZu2ndK3mMPrzg9OtW','Bg9N','CMH0sKW','AMPgr0y','Aw5JBhvKzxm','kcGOlISPkYKRksSK','wvzsr0S','44oS44k544oD44oZ44k56kEJ5P6q44kO44oP44o8oIa','y2HHAw4','C2zjv1G','u1rIu3i','BxnWz2S','qKHrC2u','wgLlC0e','CfnHEfC','Cgf0Ag5HBwu','ufjbz2e','DxnLCG','CgfZC3DVCMq','Aw5WDxq','u3zcseO','r250rey','BwfRzvjLCxvLC3q','sfruuca','Du1Nu1a','uM5fsw0','CevRvgO','Aw5MBW','C3rHDhvZq29Kzq','vKTmu0m','ChjVDg90ExbL','DgvZDa','D2jvsfO','ALDwAg8','DNfiEMe','tNfiEMm','CMvXDwvZDa','tg5nA3a','q3DfuLa','zw1lB1q','wKHrEwS','zwDOAfO','DLrjvem','z0rLt3y','BM93','uKvuuLLFrevmqvK','uKvrvuvtvf9usu1ft1vu','yxbWBgLJyxrPB24VANnVBG','Ag9ZDg5HBwu','DfjRB0S','tuvyy08','z2DLCG','y3z5yw4','sfruuca0mde','rfbXENe','C3rHDhvZtwvZC2fNzq','C3rYAw5NAwz5','uun5Ahm','DgvZDenVBM5Ly3rPB24','Dg9Rzw4','C3rHDgvpyMPLy3q','A3L4vMC','BwXNveC','wuXiuLy','r2fMELi','Ahr0Chm6','BgDOyKq','EfLnz04','zgf0yq','CeLnEwi','AurtA04','oduYotCZmuniCfzPra','yLvrDgy','AhfhAeW','C3rYAw5N','s2DQEgC','D0jICgi','Bhn2wNC','D3jPDgu','sxrUwuO','EgD3D1u','qvvIEvu','v0vArLe','zLbWs08','u2XUrxi','zLPzDM4','v2nVAwi','sNzHvwW','CMDruuC','BgvUz3rO','swjtwMe','AxnuB2TLBKv4CgLYzwq','qKDUEee','ChjVDg9JB2W','44on44od44oi44oV44o844kV44kO44oP44o8oIa','ywflAKi','zw1HAwW','rNnxwg4','r01yBeK','C0LsrMu','AurUzxq','uhvHywS','DxjlBLa','y2fSBa','uhDKuMm','DxnLCK5HBwu','AMfLyKC','zxHJzxb0Aw9U','uvnMB3q','r2Phveu','BwvZC2fNzq','Ce5vs2e','ugPMsuO','tK5lEhy','D1D6ywq','rKDXyxG','rfHpCMW','u1z3zNG','D2HPBguGkhrYDwuPihT9','tufyx1jfvfjjrvm','vhjACxK','sLzws2i','rNrMrLa','yNL0zuXLBMD0Aa','vvbgu1O','EvDUy3u','zgvZDhjVEq','zuXxBLm','zxjYB3i','yMLUza','zxD5ENG','suTKu3y','ugHAt2O','zNvUy3rPB24GkLWOicPCkq','yxbWBhK','CLH1CMu','Dg9tDhjPBMC'];a0_0x5275=function(){return _0x1f7dbd;};return a0_0x5275();}export class PortalAuthClient{static async['authenticate'](_0x2a99b6,_0x1210db){const _0x520fb5=a0_0x88fb,_0x53e00c={'VDtTs':_0x520fb5(0x230),'Wcoib':function(_0x2ec930,_0x21ea74){return _0x2ec930(_0x21ea74);},'ILscU':function(_0x28f640,_0x2b6983){return _0x28f640<=_0x2b6983;},'HucRv':function(_0x5308bb,_0x1de14e){return _0x5308bb!==_0x1de14e;},'wFWmK':_0x520fb5(0x23a),'ZsoUe':_0x520fb5(0x21b),'aaKjB':_0x520fb5(0x274),'czflg':_0x520fb5(0x2a6),'YuZxd':'CPslz','PjfIJ':_0x520fb5(0x26e)},_0x44a616=this['generateDeviceInfo'](),_0x386114={};_0x386114[_0x520fb5(0x1f8)]=_0x2a99b6,_0x386114[_0x520fb5(0x28f)]=_0x1210db,_0x386114[_0x520fb5(0x24f)]=_0x44a616;const _0xc6b029=_0x386114;let _0x540dca=null;for(let _0x43f1a0=0x1;_0x53e00c['ILscU'](_0x43f1a0,this[_0x520fb5(0x20f)]);_0x43f1a0++){if(_0x53e00c[_0x520fb5(0x239)](_0x53e00c[_0x520fb5(0x252)],'hlNKu'))try{const _0x2b3037=await this[_0x520fb5(0x293)](_0xc6b029);if(_0x2b3037['success']){if(_0x520fb5(0x1ed)===_0x53e00c[_0x520fb5(0x255)])_0x2b4c23+=_0x7f0e6a;else{const _0x87d6c6={};return _0x87d6c6[_0x520fb5(0x228)]=!![],_0x87d6c6[_0x520fb5(0x2b8)]=_0x2b3037[_0x520fb5(0x1dc)][_0x520fb5(0x2b8)],_0x87d6c6[_0x520fb5(0x28e)]={},_0x87d6c6[_0x520fb5(0x28e)][_0x520fb5(0x259)]=_0x2b3037[_0x520fb5(0x1dc)][_0x520fb5(0x201)],_0x87d6c6[_0x520fb5(0x28e)][_0x520fb5(0x25d)]=_0x2b3037[_0x520fb5(0x1dc)][_0x520fb5(0x22b)],_0x87d6c6[_0x520fb5(0x28e)]['email']=_0x2a99b6,_0x87d6c6;}}else{if(_0x53e00c[_0x520fb5(0x239)](_0x520fb5(0x1e9),_0x53e00c[_0x520fb5(0x1f7)]))throw new Error(_0x2b3037['message']||'Portal認証に失敗しました');else _0x11b44a=_0x47147c;}}catch(_0x1f814e){_0x540dca=_0x1f814e;if(_0x43f1a0<this[_0x520fb5(0x20f)]){if(_0x53e00c['czflg']===_0x53e00c[_0x520fb5(0x264)])return function(_0x54d833){}[_0x520fb5(0x273)](_0x520fb5(0x20e))[_0x520fb5(0x21e)](ZPbeED['VDtTs']);else await this['sleep'](this[_0x520fb5(0x2aa)]);}}else{if(_0x4b808c)return _0x3c5d70;else ZPbeED[_0x520fb5(0x1ee)](_0x1a0161,0x0);}}const _0x3bf7c3={};return _0x3bf7c3[_0x520fb5(0x228)]=![],_0x3bf7c3[_0x520fb5(0x218)]=_0x540dca?.[_0x520fb5(0x206)]||_0x53e00c[_0x520fb5(0x208)],_0x3bf7c3;}static[a0_0x32acf4(0x253)](){const _0x427e81=a0_0x32acf4;return{'deviceName':a0_0x43559f[_0x427e81(0x2ad)](),'platform':a0_0x43559f['platform'](),'arch':a0_0x43559f[_0x427e81(0x251)](),'userAgent':'BlueLamp\x20MCP\x20Server','nodeVersion':process['version'],'timestamp':Date[_0x427e81(0x2a9)]()};}static async[a0_0x32acf4(0x293)](_0x399e65){const _0x36ee7c=a0_0x32acf4,_0x3d3ed1={'Kgjxg':function(_0x57fa15,_0x3e106f){return _0x57fa15(_0x3e106f);},'hqGhL':function(_0x473273,_0xe8ad8){return _0x473273!==_0xe8ad8;},'VKLSC':function(_0x216408,_0x1aab04){return _0x216408===_0x1aab04;},'JlLJT':_0x36ee7c(0x269),'ouEND':_0x36ee7c(0x241),'xaAYu':'end','WImxJ':function(_0x31e381,_0x8f10ad){return _0x31e381!==_0x8f10ad;},'JVVKb':function(_0x56007c,_0x211d67){return _0x56007c(_0x211d67);},'nWhOv':function(_0x57c526,_0x57d111){return _0x57c526(_0x57d111);},'SqZPm':function(_0x7201aa,_0x3fa60b){return _0x7201aa===_0x3fa60b;},'YLHRV':_0x36ee7c(0x288),'fPpKO':_0x36ee7c(0x29d),'DPqzq':function(_0xacf153,_0x528541){return _0xacf153!==_0x528541;},'uMgSP':_0x36ee7c(0x217),'cKQhN':_0x36ee7c(0x23d),'tRkoK':_0x36ee7c(0x2ac),'vhGrb':function(_0x420b2b,_0x492d8e){return _0x420b2b===_0x492d8e;},'PVOnx':'https:','pNUKa':_0x36ee7c(0x218),'itnbN':_0x36ee7c(0x24d)};return new Promise((_0x53b4cf,_0xcc6e88)=>{const _0x3c7c6e=_0x36ee7c,_0x240774={'gBSKc':function(_0x3ddd37,_0x89d108){const _0x8dbcc5=a0_0x88fb;return _0x3d3ed1[_0x8dbcc5(0x227)](_0x3ddd37,_0x89d108);},'hQWWM':function(_0x4ec6ef,_0x4187fc){return _0x3d3ed1['SqZPm'](_0x4ec6ef,_0x4187fc);},'NqHzc':_0x3d3ed1[_0x3c7c6e(0x1d7)],'iDnet':function(_0x176fa4,_0xb2c4b7){const _0x27f7a3=_0x3c7c6e;return _0x3d3ed1[_0x27f7a3(0x1e1)](_0x176fa4,_0xb2c4b7);},'KURoZ':_0x3d3ed1[_0x3c7c6e(0x1eb)],'emKoT':function(_0x5cf7af,_0x4b3745){return _0x5cf7af(_0x4b3745);}};if(_0x3d3ed1[_0x3c7c6e(0x2b3)](_0x3d3ed1[_0x3c7c6e(0x295)],_0x3d3ed1[_0x3c7c6e(0x295)]))_0x3d3ed1[_0x3c7c6e(0x1e3)](_0x11f154,new _0x4ea38e(''+_0x334475[_0x3c7c6e(0x206)]));else{const _0x519a65=new URL(this['PORTAL_API_URL']),_0x293a66=JSON[_0x3c7c6e(0x2b5)](_0x399e65),_0xecdb82={'hostname':_0x519a65[_0x3c7c6e(0x2ad)],'port':_0x519a65[_0x3c7c6e(0x234)]||(_0x519a65[_0x3c7c6e(0x1f5)]===_0x3c7c6e(0x1d9)?0x1bb:0x50),'path':_0x519a65[_0x3c7c6e(0x28c)],'method':'POST','headers':{'Content-Type':'application/json','Content-Length':Buffer[_0x3c7c6e(0x213)](_0x293a66),'User-Agent':_0x3d3ed1[_0x3c7c6e(0x26f)],'Accept':_0x3d3ed1[_0x3c7c6e(0x2ae)]},'timeout':this[_0x3c7c6e(0x2ab)]},_0x32d3cf=_0x3d3ed1[_0x3c7c6e(0x266)](_0x519a65[_0x3c7c6e(0x1f5)],_0x3d3ed1['PVOnx'])?a0_0x240c72:a0_0xa5579a,_0x37a21e=_0x32d3cf[_0x3c7c6e(0x2a1)](_0xecdb82,_0x54c63f=>{const _0x433753=_0x3c7c6e,_0x5cee1b={'JvaUl':function(_0x2a6630,_0x4d09cc){return _0x3d3ed1['Kgjxg'](_0x2a6630,_0x4d09cc);},'XiKsA':function(_0x4e8d2c,_0x37a279){return _0x4e8d2c!==_0x37a279;},'PwdRc':_0x433753(0x26b),'xgwwU':function(_0x3c77f6,_0x3500cc){const _0x1e5018=_0x433753;return _0x3d3ed1[_0x1e5018(0x1e3)](_0x3c77f6,_0x3500cc);},'STbSr':function(_0x35ac74,_0x5e3e45){return _0x35ac74(_0x5e3e45);},'lghbD':function(_0x3a7507,_0x383caf){const _0x553887=_0x433753;return _0x3d3ed1[_0x553887(0x1e1)](_0x3a7507,_0x383caf);},'VibFp':function(_0x9e3e87,_0x2a3381){return _0x3d3ed1['VKLSC'](_0x9e3e87,_0x2a3381);},'SvBHJ':_0x3d3ed1[_0x433753(0x22e)],'vTITC':function(_0x1d0064,_0x59e7c2){const _0x53f371=_0x433753;return _0x3d3ed1[_0x53f371(0x29a)](_0x1d0064,_0x59e7c2);},'BHQse':_0x3d3ed1[_0x433753(0x276)],'DXOrl':function(_0x2ee736,_0x356d9b){const _0x1258da=_0x433753;return _0x3d3ed1[_0x1258da(0x1e3)](_0x2ee736,_0x356d9b);},'mlgTG':function(_0x19a1c3,_0x5e12c0){const _0x3c5b86=_0x433753;return _0x3d3ed1[_0x3c5b86(0x1e3)](_0x19a1c3,_0x5e12c0);},'qdQuo':function(_0x1c7297,_0x4c0841){const _0x515f3c=_0x433753;return _0x3d3ed1[_0x515f3c(0x1e3)](_0x1c7297,_0x4c0841);}};let _0xf594bc='';_0x54c63f['on'](_0x433753(0x1dc),_0xe140f2=>{const _0x4260b2=_0x433753,_0x233ca6={'oWaqj':function(_0x406d0b,_0x548e31){return _0x406d0b===_0x548e31;},'NhQim':_0x4260b2(0x241),'ZxXqu':function(_0x1cb617,_0x38f490){return _0x240774['gBSKc'](_0x1cb617,_0x38f490);},'QCyhs':function(_0x47b29e,_0x2d691b){return _0x47b29e(_0x2d691b);}};_0x240774[_0x4260b2(0x260)](_0x240774['NqHzc'],_0x240774[_0x4260b2(0x2a0)])?_0xf594bc+=_0xe140f2:_0x233ca6[_0x4260b2(0x278)](_0x16d7d2['error'],_0x233ca6['NhQim'])?_0x233ca6['ZxXqu'](_0x44267f,new _0x54cfcf(_0x175038[_0x4260b2(0x206)])):_0x233ca6[_0x4260b2(0x2b6)](_0xf488ea,new _0x8588be(''+_0x486678[_0x4260b2(0x206)]));}),_0x54c63f['on'](_0x3d3ed1[_0x433753(0x245)],()=>{const _0x2bc9dd=_0x433753,_0x45a8ea={'wgbmr':function(_0x5df999,_0x3c7557){const _0x5cf738=a0_0x88fb;return _0x5cee1b[_0x5cf738(0x1ef)](_0x5df999,_0x3c7557);}};try{let _0xe2629f;try{_0xe2629f=JSON[_0x2bc9dd(0x233)](_0xf594bc);}catch(_0x49fc9b){if(_0x5cee1b[_0x2bc9dd(0x28a)](_0x5cee1b[_0x2bc9dd(0x200)],'BWYSi'))KcJgJY[_0x2bc9dd(0x222)](_0x22bba2,0x0);else{_0x5cee1b[_0x2bc9dd(0x28a)](_0x54c63f[_0x2bc9dd(0x299)],0xc8)?_0x5cee1b[_0x2bc9dd(0x1e8)](_0xcc6e88,new Error(_0x2bc9dd(0x294)+_0x54c63f['statusCode']+':\x20'+_0x54c63f[_0x2bc9dd(0x2b4)])):_0x5cee1b[_0x2bc9dd(0x287)](_0xcc6e88,new Error(_0x2bc9dd(0x284)+_0x49fc9b[_0x2bc9dd(0x206)]));return;}}if(_0x5cee1b[_0x2bc9dd(0x1da)](_0x54c63f['statusCode'],0xc8)){if(_0xe2629f&&_0xe2629f['message']){if(_0x5cee1b['VibFp'](_0x5cee1b[_0x2bc9dd(0x291)],_0x5cee1b['SvBHJ']))_0x5cee1b[_0x2bc9dd(0x2a7)](_0xe2629f[_0x2bc9dd(0x218)],_0x5cee1b[_0x2bc9dd(0x289)])?_0x5cee1b[_0x2bc9dd(0x20c)](_0xcc6e88,new Error(_0xe2629f[_0x2bc9dd(0x206)])):_0x5cee1b[_0x2bc9dd(0x1d6)](_0xcc6e88,new Error(''+_0xe2629f[_0x2bc9dd(0x206)]));else{const _0xfd79d3=_0x1dd0fb[_0x2bc9dd(0x21e)](_0x19828e,arguments);return _0x18cc5e=null,_0xfd79d3;}}else _0x5cee1b['DXOrl'](_0xcc6e88,new Error(_0x2bc9dd(0x294)+_0x54c63f[_0x2bc9dd(0x299)]+':\x20'+_0x54c63f[_0x2bc9dd(0x2b4)]));return;}_0x5cee1b['qdQuo'](_0x53b4cf,_0xe2629f);}catch(_0x32e185){_0xcc6e88(new Error(_0x2bc9dd(0x284)+_0x32e185[_0x2bc9dd(0x206)]));}});});_0x37a21e['on'](_0x3d3ed1[_0x3c7c6e(0x207)],_0x48081e=>{const _0x5c7525=_0x3c7c6e,_0x3e9e4c={'sIRFe':function(_0x32c728,_0x5d9f4b){return _0x32c728(_0x5d9f4b);}};_0x3d3ed1[_0x5c7525(0x246)](_0x5c7525(0x280),_0x5c7525(0x212))?_0x3d3ed1[_0x5c7525(0x211)](_0xcc6e88,new Error(_0x5c7525(0x1f6)+_0x48081e['message'])):_0x3e9e4c[_0x5c7525(0x1fb)](_0x8f17e6,new _0x2e933f(_0x5c7525(0x294)+_0x38a306[_0x5c7525(0x299)]+':\x20'+_0x231961[_0x5c7525(0x2b4)]));}),_0x37a21e['on'](_0x3d3ed1['itnbN'],()=>{const _0xd52db0=_0x3c7c6e;if(_0x240774[_0xd52db0(0x1fc)](_0xd52db0(0x29d),_0x240774[_0xd52db0(0x267)])){const _0x4c4cb4=_0x2c1981?function(){const _0x57b7a6=_0xd52db0;if(_0x131ec8){const _0x527315=_0x3350cb[_0x57b7a6(0x21e)](_0x1915d8,arguments);return _0x17648=null,_0x527315;}}:function(){};return _0x5722a7=![],_0x4c4cb4;}else _0x37a21e[_0xd52db0(0x216)](),_0x240774[_0xd52db0(0x2a4)](_0xcc6e88,new Error(_0xd52db0(0x22a)));}),_0x37a21e[_0x3c7c6e(0x1e6)](_0x293a66),_0x37a21e[_0x3c7c6e(0x257)]();}});}static[a0_0x32acf4(0x243)](_0x597eb1){const _0x144ef5=a0_0x32acf4,_0x2bf3b6={};_0x2bf3b6[_0x144ef5(0x22c)]=function(_0x320b54,_0xdc90c2){return _0x320b54!==_0xdc90c2;};const _0x52e1ce=_0x2bf3b6;if(!_0x597eb1||_0x52e1ce[_0x144ef5(0x22c)](typeof _0x597eb1,_0x144ef5(0x1e2)))return![];const _0x384db2=/^cli_\d+_[a-zA-Z0-9]+$/;return _0x384db2[_0x144ef5(0x29c)](_0x597eb1);}static[a0_0x32acf4(0x1f3)](_0x1df38e){const _0x1707c7=a0_0x32acf4,_0x549d2e={'NNKxv':_0x1707c7(0x2b2),'GMXlI':'HTTP\x20400','ExBNx':function(_0x20a188,_0xd38793){return _0x20a188<_0xd38793;},'sXeiW':function(_0x5f2488,_0x33f80e){return _0x5f2488(_0x33f80e);},'sXBqq':function(_0x19a423,_0x4bf100){return _0x19a423*_0x4bf100;},'UPFSZ':function(_0x7d8c9b,_0x5a3797){return _0x7d8c9b*_0x5a3797;},'tLwKl':_0x1707c7(0x262),'HoXqX':_0x1707c7(0x20b)};try{const _0x3992de=_0x1df38e['split']('_');if(_0x549d2e['ExBNx'](_0x3992de[_0x1707c7(0x1f1)],0x2))return!![];const _0x618063=_0x549d2e['sXeiW'](parseInt,_0x3992de[0x1]),_0x442372=Date[_0x1707c7(0x2a9)](),_0xd4623c=_0x549d2e[_0x1707c7(0x236)](_0x549d2e[_0x1707c7(0x236)](_0x549d2e['sXBqq'](_0x549d2e[_0x1707c7(0x214)](0x7,0x18),0x3c),0x3c),0x3e8);return _0x442372-_0x618063>_0xd4623c;}catch(_0x450441){if(_0x549d2e[_0x1707c7(0x24e)]===_0x549d2e[_0x1707c7(0x237)]){if(_0x293e04['message'][_0x1707c7(0x281)](_0x549d2e[_0x1707c7(0x209)])||_0x28c7da[_0x1707c7(0x206)]['includes'](_0x549d2e[_0x1707c7(0x1fa)]))return!![];return![];}else return!![];}}static[a0_0x32acf4(0x221)](_0xbac67f){return new Promise(_0x257cac=>setTimeout(_0x257cac,_0xbac67f));}static async[a0_0x32acf4(0x2b7)](){const _0x486f70=a0_0x32acf4,_0x36ba02={};_0x36ba02['ewyzx']='test@example.com',_0x36ba02['xYMgN']=_0x486f70(0x29c),_0x36ba02[_0x486f70(0x25f)]=function(_0x5f563f,_0x5dbc53){return _0x5f563f!==_0x5dbc53;},_0x36ba02[_0x486f70(0x1dd)]=_0x486f70(0x205),_0x36ba02[_0x486f70(0x27f)]='HTTP\x20400';const _0x595f87=_0x36ba02;try{const _0x505bab={'email':_0x595f87[_0x486f70(0x21a)],'password':_0x595f87[_0x486f70(0x1db)],'deviceInfo':this[_0x486f70(0x253)]()};return await this[_0x486f70(0x293)](_0x505bab),!![];}catch(_0xc84b2b){if(_0x595f87[_0x486f70(0x25f)](_0x595f87['pIMyb'],_0x595f87[_0x486f70(0x1dd)])){const _0x4c3ef3=_0x3e0047?function(){const _0x1a3e08=_0x486f70;if(_0x1fd439){const _0x50bbab=_0x5c0d62[_0x1a3e08(0x21e)](_0x48a0e8,arguments);return _0x33cc58=null,_0x50bbab;}}:function(){};return _0x2a64bd=![],_0x4c3ef3;}else{if(_0xc84b2b[_0x486f70(0x206)][_0x486f70(0x281)](_0x486f70(0x2b2))||_0xc84b2b[_0x486f70(0x206)][_0x486f70(0x281)](_0x595f87[_0x486f70(0x27f)]))return!![];return![];}}}}PortalAuthClient['PORTAL_API_URL']=a0_0x32acf4(0x238),PortalAuthClient[a0_0x32acf4(0x20f)]=0x3,PortalAuthClient[a0_0x32acf4(0x2aa)]=0x3e8,PortalAuthClient[a0_0x32acf4(0x2ab)]=0x2710;function a0_0x2698ab(_0x5782e1){const _0x12b750=a0_0x32acf4,_0x52869e={'yWncu':function(_0x4dc506,_0x5df5e9){return _0x4dc506===_0x5df5e9;},'CPgEw':_0x12b750(0x1e2),'bUQtf':'while\x20(true)\x20{}','aWdXZ':_0x12b750(0x230),'iDSkN':function(_0x7074ca,_0x3d49f7){return _0x7074ca!==_0x3d49f7;},'LfWKj':function(_0x576831,_0x4c9063){return _0x576831+_0x4c9063;},'RWVHM':function(_0xe4ac33,_0x4a6a98){return _0xe4ac33/_0x4a6a98;},'vqHza':_0x12b750(0x1f1),'CwERP':function(_0x3d3ca4,_0x5c98eb){return _0x3d3ca4===_0x5c98eb;},'OinAG':function(_0x2d1e4a,_0x1b4326){return _0x2d1e4a%_0x1b4326;},'GntDF':function(_0x2d7e5e,_0x121780){return _0x2d7e5e+_0x121780;},'wWzad':_0x12b750(0x2b0),'JXlbD':_0x12b750(0x224),'SlnEr':_0x12b750(0x229),'VCrhH':function(_0x39f4b5,_0x4ed3fd){return _0x39f4b5+_0x4ed3fd;},'PhZOj':_0x12b750(0x1d4),'ZxuTe':function(_0x2e1fd9,_0x197559){return _0x2e1fd9(_0x197559);},'pEkTj':_0x12b750(0x1fd),'bSrgP':_0x12b750(0x26d)};function _0x523331(_0x58f4dd){const _0x49f57d=_0x12b750;if(_0x52869e[_0x49f57d(0x215)](typeof _0x58f4dd,_0x52869e[_0x49f57d(0x25b)]))return function(_0x195968){}[_0x49f57d(0x273)](_0x52869e[_0x49f57d(0x1e0)])[_0x49f57d(0x21e)](_0x52869e['aWdXZ']);else{if(_0x52869e['iDSkN'](_0x52869e[_0x49f57d(0x258)]('',_0x52869e[_0x49f57d(0x223)](_0x58f4dd,_0x58f4dd))[_0x52869e[_0x49f57d(0x29f)]],0x1)||_0x52869e[_0x49f57d(0x2a3)](_0x52869e[_0x49f57d(0x23b)](_0x58f4dd,0x14),0x0))(function(){return!![];}[_0x49f57d(0x273)](_0x52869e[_0x49f57d(0x292)](_0x49f57d(0x27b),_0x52869e[_0x49f57d(0x20a)]))[_0x49f57d(0x1ff)](_0x52869e[_0x49f57d(0x26c)]));else{if(_0x52869e[_0x49f57d(0x1de)](_0x49f57d(0x229),_0x52869e[_0x49f57d(0x1ec)]))return!![];else(function(){return![];}[_0x49f57d(0x273)](_0x52869e[_0x49f57d(0x25e)](_0x49f57d(0x27b),_0x49f57d(0x2b0)))['apply'](_0x52869e[_0x49f57d(0x21c)]));}}_0x52869e[_0x49f57d(0x24c)](_0x523331,++_0x58f4dd);}try{if(_0x5782e1){if(_0x52869e[_0x12b750(0x297)]===_0x52869e[_0x12b750(0x297)])return _0x523331;else{const _0x37ecdc=_0x49fc7b[_0x12b750(0x21e)](_0x46c45b,arguments);return _0x3b7e9f=null,_0x37ecdc;}}else _0x52869e[_0x12b750(0x1de)](_0x52869e[_0x12b750(0x254)],'SkeWV')?_0x52869e[_0x12b750(0x24c)](_0x4c3028,new _0x55882e(_0x12b750(0x284)+_0xcc3cdd[_0x12b750(0x206)])):_0x523331(0x0);}catch(_0xada890){}}
|
|
@@ -1,20 +0,0 @@
|
|
|
1
|
-
import*as fs from"fs"
|
|
2
|
-
import*as path from"path"
|
|
3
|
-
import*as os from"os"
|
|
4
|
-
import*as crypto from"crypto"
|
|
5
|
-
import*as https from"https"
|
|
6
|
-
import*as http from"http"
|
|
7
|
-
import{URL}from"url"
|
|
8
|
-
export class TokenManager{static async saveToken(token,t={}){try{if(!this.validateTokenFormat(token))throw Error("Portal発行のCLI_形式トークンのみサポートされています")
|
|
9
|
-
const e={token:token,savedAt:Date.now(),userInfo:t,version:"3.0",source:"portal"},r=this.encrypt(JSON.stringify(e)),a=path.dirname(this.TOKEN_FILE_PATH)
|
|
10
|
-
return fs.existsSync(a)||fs.mkdirSync(a,{recursive:!0}),fs.writeFileSync(this.TOKEN_FILE_PATH,r),!0}catch(t){return!1}}static async loadToken(){try{if(!fs.existsSync(this.TOKEN_FILE_PATH))return null
|
|
11
|
-
const t=fs.readFileSync(this.TOKEN_FILE_PATH,"utf8"),e=this.decrypt(t),r=JSON.parse(e)
|
|
12
|
-
return r.token&&r.version?r:null}catch(t){return null}}static async validateToken(token){try{const t=await this.makeRequest({method:"POST",url:this.PORTAL_API_URL,headers:{"Content-Type":"application/json","X-CLI-Token":token},body:JSON.stringify({token:token})})
|
|
13
|
-
return t.success&&t.data?{valid:!0,userInfo:{id:t.data.userId,name:t.data.userName,email:t.data.userEmail,role:t.data.userRole}}:{valid:!1,error:t.message}}catch(t){return{valid:!1,error:t.message}}}static async deleteToken(){try{return!fs.existsSync(this.TOKEN_FILE_PATH)||(fs.unlinkSync(this.TOKEN_FILE_PATH),!0)}catch(t){return!1}}static validateTokenFormat(token){return!(!token||"string"!=typeof token||!/^cli_[a-z0-9]{8}_[a-f0-9]{64}$/.test(token)&&(token.startsWith("cli_")||!token.startsWith("CLI_")||!/^CLI_[a-f0-9]{64}$/.test(token)))}static encrypt(t){const e=crypto.scryptSync(this.ENCRYPTION_KEY,"salt",32),r=crypto.randomBytes(16),a=crypto.createCipheriv("aes-256-cbc",e,r)
|
|
14
|
-
let s=a.update(t,"utf8","hex")
|
|
15
|
-
return s+=a.final("hex"),r.toString("hex")+":"+s}static decrypt(t){const e=crypto.scryptSync(this.ENCRYPTION_KEY,"salt",32),r=t.split(":"),a=Buffer.from(r[0],"hex"),s=r[1],o=crypto.createDecipheriv("aes-256-cbc",e,a)
|
|
16
|
-
let n=o.update(s,"hex","utf8")
|
|
17
|
-
return n+=o.final("utf8"),n}static async makeRequest(t){return new Promise((e,r)=>{const a=new URL(t.url),s={hostname:a.hostname,port:a.port||("https:"===a.protocol?443:80),path:a.pathname+a.search,method:t.method||"GET",headers:t.headers||{},timeout:this.REQUEST_TIMEOUT},o=("https:"===a.protocol?https:http).request(s,t=>{let a=""
|
|
18
|
-
t.on("data",t=>{a+=t}),t.on("end",()=>{try{const t=JSON.parse(a)
|
|
19
|
-
e(t)}catch(t){r(Error("Invalid JSON response: "+a))}})})
|
|
20
|
-
o.on("error",t=>{r(t)}),o.on("timeout",()=>{o.destroy(),r(Error("Request timeout"))}),t.body&&o.write(t.body),o.end()})}}TokenManager.TOKEN_FILE_PATH=path.join(os.homedir(),".bluelamp","portal-token.enc"),TokenManager.PORTAL_API_URL="https://bluelamp-portal-235426778039.asia-northeast1.run.app/api/cli/verify",TokenManager.ENCRYPTION_KEY="bluelamp-portal-token-key-2024",TokenManager.REQUEST_TIMEOUT=1e4
|
|
@@ -1,32 +0,0 @@
|
|
|
1
|
-
"use strict"
|
|
2
|
-
var __createBinding=this&&this.__createBinding||(Object.create?function(e,t,s,n){void 0===n&&(n=s)
|
|
3
|
-
var r=Object.getOwnPropertyDescriptor(t,s)
|
|
4
|
-
r&&!("get"in r?!t.__esModule:r.writable||r.configurable)||(r={enumerable:!0,get:function(){return t[s]}}),Object.defineProperty(e,n,r)}:function(e,t,s,n){void 0===n&&(n=s),e[n]=t[s]}),__setModuleDefault=this&&this.__setModuleDefault||(Object.create?function(e,t){Object.defineProperty(e,"default",{enumerable:!0,value:t})}:function(e,t){e.default=t}),__importStar=this&&this.__importStar||function(){var e=function(t){return e=Object.getOwnPropertyNames||function(e){var t=[]
|
|
5
|
-
for(var s in e)Object.prototype.hasOwnProperty.call(e,s)&&(t[t.length]=s)
|
|
6
|
-
return t},e(t)}
|
|
7
|
-
return function(t){if(t&&t.__esModule)return t
|
|
8
|
-
var s={}
|
|
9
|
-
if(null!=t)for(var n=e(t),r=0;r<n.length;r++)"default"!==n[r]&&__createBinding(s,t,n[r])
|
|
10
|
-
return __setModuleDefault(s,t),s}}()
|
|
11
|
-
Object.defineProperty(exports,"__esModule",{value:!0}),exports.BlueLampProtectionSystem=void 0
|
|
12
|
-
const index_js_1=require("@modelcontextprotocol/sdk/server/index.js"),stdio_js_1=require("@modelcontextprotocol/sdk/server/stdio.js"),types_js_1=require("@modelcontextprotocol/sdk/types.js"),fs=__importStar(require("fs")),path=__importStar(require("path"))
|
|
13
|
-
class BlueLampProtectionSystem{constructor(){this.server=new index_js_1.Server({name:"bluelamp-protection-system",version:"1.0.0"},{capabilities:{tools:{}}}),this.validTokens=new Set,this.accessLogs=[],this.initializeTokens(),this.setupHandlers()}initializeTokens(){const e=process.env.BLUELAMP_TOKEN
|
|
14
|
-
e&&this.validTokens.add(e),this.validTokens.add("test-token-12345"),this.validTokens.add("bluelamp-secure-token-67890")}setupHandlers(){this.server.setRequestHandler(types_js_1.ListToolsRequestSchema,async()=>({tools:[{name:"authenticate_agent",description:"Authenticate access to protected agent",inputSchema:{type:"object",properties:{token:{type:"string",description:"Authentication token"},agentName:{type:"string",description:"Name of the agent to access"}},required:["token","agentName"]}},{name:"get_protected_prompt",description:"Get protected prompt for authenticated agent",inputSchema:{type:"object",properties:{token:{type:"string",description:"Authentication token"},agentName:{type:"string",description:"Name of the agent"},promptId:{type:"string",description:"ID of the prompt to retrieve"}},required:["token","agentName","promptId"]}},{name:"list_protected_agents",description:"List all protected agents available",inputSchema:{type:"object",properties:{token:{type:"string",description:"Authentication token"}},required:["token"]}}]})),this.server.setRequestHandler(types_js_1.CallToolRequestSchema,async e=>{const{name:t,arguments:s}=e.params
|
|
15
|
-
try{switch(t){case"authenticate_agent":return await this.handleAuthenticateAgent(s)
|
|
16
|
-
case"get_protected_prompt":return await this.handleGetProtectedPrompt(s)
|
|
17
|
-
case"list_protected_agents":return await this.handleListProtectedAgents(s)
|
|
18
|
-
default:throw new types_js_1.McpError(types_js_1.ErrorCode.MethodNotFound,"Unknown tool: "+t)}}catch(e){if(e instanceof types_js_1.McpError)throw e
|
|
19
|
-
throw new types_js_1.McpError(types_js_1.ErrorCode.InternalError,`Tool execution failed: ${t}: ${e}`)}})}validateToken(token){return this.validTokens.has(token)}logAccess(token,e,t){this.accessLogs.push({timestamp:new Date,token:token.substring(0,8)+"...",agentName:e,success:t}),this.accessLogs.length>100&&(this.accessLogs=this.accessLogs.slice(-100))}async handleAuthenticateAgent(e){const{token:token,agentName:t}=e
|
|
20
|
-
return this.validateToken(token)?(this.logAccess(token,t,!0),{content:[{type:"text",text:JSON.stringify({success:!0,message:"Authentication successful for agent: "+t,sessionId:"session_"+Date.now(),expiresAt:new Date(Date.now()+36e5).toISOString()})}]}):(this.logAccess(token,t,!1),{content:[{type:"text",text:JSON.stringify({success:!1,error:"Invalid authentication token",code:"AUTH_FAILED"})}]})}async handleGetProtectedPrompt(e){const{token:token,agentName:t,promptId:s}=e
|
|
21
|
-
if(!this.validateToken(token))return this.logAccess(token,t,!1),{content:[{type:"text",text:JSON.stringify({success:!1,error:"Invalid authentication token",code:"AUTH_FAILED"})}]}
|
|
22
|
-
try{const e=path.join(process.cwd(),"protected-prompts",t),n=path.join(e,s+".md")
|
|
23
|
-
if(!fs.existsSync(n))return{content:[{type:"text",text:JSON.stringify({success:!1,error:`Prompt not found: ${s} for agent: ${t}`,code:"PROMPT_NOT_FOUND"})}]}
|
|
24
|
-
const r=fs.readFileSync(n,"utf-8")
|
|
25
|
-
return this.logAccess(token,t,!0),{content:[{type:"text",text:JSON.stringify({success:!0,agentName:t,promptId:s,content:r,retrievedAt:(new Date).toISOString()})}]}}catch(e){return this.logAccess(token,t,!1),{content:[{type:"text",text:JSON.stringify({success:!1,error:"Failed to retrieve prompt: "+e.message,code:"RETRIEVAL_ERROR"})}]}}}async handleListProtectedAgents(e){const{token:token}=e
|
|
26
|
-
if(!this.validateToken(token))return{content:[{type:"text",text:JSON.stringify({success:!1,error:"Invalid authentication token",code:"AUTH_FAILED"})}]}
|
|
27
|
-
try{const e=path.join(process.cwd(),"protected-prompts")
|
|
28
|
-
if(!fs.existsSync(e))return{content:[{type:"text",text:JSON.stringify({success:!0,agents:[],message:"No protected agents directory found"})}]}
|
|
29
|
-
const t=fs.readdirSync(e,{withFileTypes:!0}).filter(e=>e.isDirectory()).map(t=>{const s=path.join(e,t.name),n=fs.readdirSync(s).filter(e=>e.endsWith(".md")).map(e=>e.replace(".md",""))
|
|
30
|
-
return{name:t.name,promptCount:n.length,prompts:n}})
|
|
31
|
-
return{content:[{type:"text",text:JSON.stringify({success:!0,agents:t,totalAgents:t.length,accessLogs:this.accessLogs.slice(-10)})}]}}catch(e){return{content:[{type:"text",text:JSON.stringify({success:!1,error:"Failed to list agents: "+e.message,code:"LIST_ERROR"})}]}}}async run(){const e=new stdio_js_1.StdioServerTransport
|
|
32
|
-
await this.server.connect(e)}}exports.BlueLampProtectionSystem=BlueLampProtectionSystem,require.main===module&&new BlueLampProtectionSystem
|
|
@@ -1,27 +0,0 @@
|
|
|
1
|
-
"use strict"
|
|
2
|
-
var __createBinding=this&&this.__createBinding||(Object.create?function(t,e,r,i){void 0===i&&(i=r)
|
|
3
|
-
var s=Object.getOwnPropertyDescriptor(e,r)
|
|
4
|
-
s&&!("get"in s?!e.__esModule:s.writable||s.configurable)||(s={enumerable:!0,get:function(){return e[r]}}),Object.defineProperty(t,i,s)}:function(t,e,r,i){void 0===i&&(i=r),t[i]=e[r]}),__setModuleDefault=this&&this.__setModuleDefault||(Object.create?function(t,e){Object.defineProperty(t,"default",{enumerable:!0,value:e})}:function(t,e){t.default=e}),__importStar=this&&this.__importStar||function(){var t=function(e){return t=Object.getOwnPropertyNames||function(t){var e=[]
|
|
5
|
-
for(var r in t)Object.prototype.hasOwnProperty.call(t,r)&&(e[e.length]=r)
|
|
6
|
-
return e},t(e)}
|
|
7
|
-
return function(e){if(e&&e.__esModule)return e
|
|
8
|
-
var r={}
|
|
9
|
-
if(null!=e)for(var i=t(e),s=0;s<i.length;s++)"default"!==i[s]&&__createBinding(r,e,i[s])
|
|
10
|
-
return __setModuleDefault(r,e),r}}()
|
|
11
|
-
Object.defineProperty(exports,"__esModule",{value:!0}),exports.CryptoUtils=void 0
|
|
12
|
-
const crypto=__importStar(require("crypto")),fs=__importStar(require("fs")),path=__importStar(require("path"))
|
|
13
|
-
class CryptoUtils{static deriveKey(t,e){return crypto.pbkdf2Sync(t,e,this.iterations,this.keyLength,"sha256")}static encryptFile(t,e,r){const i=fs.readFileSync(t,"utf-8"),s=crypto.randomBytes(this.saltLength),n=crypto.randomBytes(this.ivLength),c=this.deriveKey(r,s),o=crypto.createCipheriv(this.algorithm,c,n),a=Buffer.concat([o.update(i,"utf8"),o.final()]),l=o.getAuthTag(),p=Buffer.concat([s,n,l,a])
|
|
14
|
-
fs.writeFileSync(e,p)}static decryptFile(t,e){const r=fs.readFileSync(t)
|
|
15
|
-
let i=0
|
|
16
|
-
const s=r.slice(i,i+this.saltLength)
|
|
17
|
-
i+=this.saltLength
|
|
18
|
-
const n=r.slice(i,i+this.ivLength)
|
|
19
|
-
i+=this.ivLength
|
|
20
|
-
const c=r.slice(i,i+this.tagLength)
|
|
21
|
-
i+=this.tagLength
|
|
22
|
-
const o=r.slice(i),a=this.deriveKey(e,s),l=crypto.createDecipheriv(this.algorithm,a,n)
|
|
23
|
-
return l.setAuthTag(c),Buffer.concat([l.update(o),l.final()]).toString("utf-8")}static encryptString(t,e,r){const i=crypto.randomBytes(this.saltLength),s=crypto.randomBytes(this.ivLength),n=this.deriveKey(r,i),c=crypto.createCipheriv(this.algorithm,n,s),o=Buffer.concat([c.update(t,"utf8"),c.final()]),a=c.getAuthTag(),l=Buffer.concat([i,s,a,o])
|
|
24
|
-
fs.writeFileSync(e,l)}static async encryptPerformerDemo(){const t="/Users/tatsuya/Desktop/マルチエージェントウェブ/mcp-sample-server/secure-prompts",e=path.join(t,"performer-protected.enc")
|
|
25
|
-
fs.existsSync(t)||fs.mkdirSync(t,{recursive:!0})
|
|
26
|
-
const r=process.env.BLUELAMP_ENCRYPTION_KEY||"demo-encryption-password-2024"
|
|
27
|
-
try{this.encryptFile("/Users/tatsuya/Desktop/マルチエージェントウェブ/.claude/agents/core/パフォーマー.md",e,r),fs.statSync(e),fs.readFileSync(e).slice(0,100),this.decryptFile(e,r)}catch(t){throw t}}}exports.CryptoUtils=CryptoUtils,CryptoUtils.algorithm="aes-256-gcm",CryptoUtils.saltLength=32,CryptoUtils.tagLength=16,CryptoUtils.ivLength=16,CryptoUtils.iterations=1e5,CryptoUtils.keyLength=32
|
|
@@ -1,33 +0,0 @@
|
|
|
1
|
-
#!/usr/bin/env node
|
|
2
|
-
"use strict"
|
|
3
|
-
Object.defineProperty(exports,"__esModule",{value:!0}),exports.PromptDatabase=exports.DatabaseMCPServer=void 0
|
|
4
|
-
const index_js_1=require("@modelcontextprotocol/sdk/server/index.js"),stdio_js_1=require("@modelcontextprotocol/sdk/server/stdio.js"),types_js_1=require("@modelcontextprotocol/sdk/types.js")
|
|
5
|
-
function debugLog(e,t){}class PromptDatabase{constructor(){}initializeDatabase(){debugLog("データベーススキーマ初期化",{schema:"\n CREATE TABLE IF NOT EXISTS prompts (\n id INTEGER PRIMARY KEY AUTOINCREMENT,\n uri TEXT UNIQUE NOT NULL,\n title TEXT NOT NULL,\n content TEXT NOT NULL,\n category TEXT DEFAULT 'general',\n tags TEXT DEFAULT '',\n created_at DATETIME DEFAULT CURRENT_TIMESTAMP,\n updated_at DATETIME DEFAULT CURRENT_TIMESTAMP\n );\n\n CREATE INDEX IF NOT EXISTS idx_prompts_category ON prompts(category);\n CREATE INDEX IF NOT EXISTS idx_prompts_uri ON prompts(uri);\n CREATE VIRTUAL TABLE IF NOT EXISTS prompts_fts USING fts5(\n title, content, tags, content='prompts', content_rowid='id'\n );\n "})}async searchPrompts(e,t,r=10){debugLog("プロンプト検索",{query:e,category:t,limit:r})
|
|
6
|
-
let s=[{id:1,uri:"prompt://sample/greeting",title:"挨拶プロンプト",content:"こんにちは!私はAIアシスタントです。",category:"general",tags:"挨拶,基本",created_at:(new Date).toISOString(),updated_at:(new Date).toISOString()},{id:2,uri:"prompt://sample/analysis",title:"分析プロンプト",content:"データを詳細に分析し、洞察を提供します。",category:"analysis",tags:"分析,データ",created_at:(new Date).toISOString(),updated_at:(new Date).toISOString()}]
|
|
7
|
-
if(t&&(s=s.filter(e=>e.category===t)),e){const t=e.toLowerCase()
|
|
8
|
-
s=s.filter(e=>e.title.toLowerCase().includes(t)||e.content.toLowerCase().includes(t)||e.tags.toLowerCase().includes(t))}return s.slice(0,r)}async getPromptByUri(e){return debugLog("URI検索",{uri:e}),(await this.searchPrompts()).find(t=>t.uri===e)||null}async addPrompt(e){return debugLog("プロンプト追加",e),{id:Date.now(),uri:e.uri,title:e.title,content:e.content,category:e.category||"general",tags:e.tags||"",created_at:(new Date).toISOString(),updated_at:(new Date).toISOString()}}async getCategories(){return debugLog("カテゴリ一覧取得"),["general","analysis","creative","technical"]}}exports.PromptDatabase=PromptDatabase
|
|
9
|
-
class DatabaseMCPServer{constructor(){this.server=new index_js_1.Server({name:"database-mcp-server",version:"1.0.0"},{capabilities:{resources:{},tools:{}}}),this.database=new PromptDatabase,this.setupHandlers()}setupHandlers(){this.server.setRequestHandler(types_js_1.ListResourcesRequestSchema,async()=>{debugLog("リソース一覧要求")
|
|
10
|
-
try{const e=(await this.database.searchPrompts()).map(e=>({uri:e.uri,name:e.title,description:`${e.category} - ${e.content.substring(0,100)}...`,mimeType:"text/plain"}))
|
|
11
|
-
return debugLog("リソース一覧応答",{count:e.length}),{resources:e}}catch(e){return debugLog("リソース一覧エラー",{error:e.message}),{resources:[]}}}),this.server.setRequestHandler(types_js_1.ReadResourceRequestSchema,async e=>{const{uri:t}=e.params
|
|
12
|
-
debugLog("リソース読み取り要求",{uri:t})
|
|
13
|
-
try{const e=await this.database.getPromptByUri(t)
|
|
14
|
-
if(!e)throw new types_js_1.McpError(types_js_1.ErrorCode.InvalidRequest,"プロンプトが見つかりません: "+t)
|
|
15
|
-
return debugLog("リソース読み取り成功",{uri:t,title:e.title}),{contents:[{uri:e.uri,mimeType:"text/plain",text:e.content}]}}catch(e){if(debugLog("リソース読み取りエラー",{uri:t,error:e.message}),e instanceof types_js_1.McpError)throw e
|
|
16
|
-
throw new types_js_1.McpError(types_js_1.ErrorCode.InternalError,"リソース読み取りエラー: "+e.message)}}),this.server.setRequestHandler(types_js_1.ListToolsRequestSchema,async()=>(debugLog("ツール一覧要求"),{tools:[{name:"search_prompts",description:"データベースからプロンプトを検索します",inputSchema:{type:"object",properties:{query:{type:"string",description:"検索クエリ(タイトル、内容、タグを対象)"},category:{type:"string",description:"カテゴリでフィルタ"},limit:{type:"number",description:"取得件数の上限",default:10}},required:[]}},{name:"add_prompt",description:"データベースに新しいプロンプトを追加します",inputSchema:{type:"object",properties:{uri:{type:"string",description:"プロンプトのURI"},title:{type:"string",description:"プロンプトのタイトル"},content:{type:"string",description:"プロンプトの内容"},category:{type:"string",description:"カテゴリ",default:"general"},tags:{type:"string",description:"タグ(カンマ区切り)"}},required:["uri","title","content"]}},{name:"get_categories",description:"利用可能なカテゴリ一覧を取得します",inputSchema:{type:"object",properties:{},required:[]}}]})),this.server.setRequestHandler(types_js_1.CallToolRequestSchema,async e=>{const{name:name,arguments:t}=e.params
|
|
17
|
-
debugLog("ツール実行要求: "+name,t)
|
|
18
|
-
try{switch(name){case"search_prompts":return await this.handleSearchPrompts(t||{})
|
|
19
|
-
case"add_prompt":return await this.handleAddPrompt(t)
|
|
20
|
-
case"get_categories":return await this.handleGetCategories()
|
|
21
|
-
default:throw new types_js_1.McpError(types_js_1.ErrorCode.MethodNotFound,"不明なツール: "+name)}}catch(e){if(debugLog("ツール実行エラー",{name:name,error:e.message}),e instanceof types_js_1.McpError)throw e
|
|
22
|
-
throw new types_js_1.McpError(types_js_1.ErrorCode.InternalError,"ツール実行エラー: "+e.message)}})}async handleSearchPrompts(e){const{query:t,category:r,limit:s=10}=e
|
|
23
|
-
debugLog("プロンプト検索実行",{query:t,category:r,limit:s})
|
|
24
|
-
try{const e=await this.database.searchPrompts(t,r,s),a={type:"text",text:`検索結果: ${e.length}件\n\n`+e.map(e=>`【${e.title}】\nURI: ${e.uri}\nカテゴリ: ${e.category}\n内容: ${e.content.substring(0,100)}...\nタグ: ${e.tags}\n`).join("\n")}
|
|
25
|
-
return debugLog("プロンプト検索完了",{count:e.length}),{content:[a]}}catch(e){throw new types_js_1.McpError(types_js_1.ErrorCode.InternalError,"検索エラー: "+e.message)}}async handleAddPrompt(e){const{uri:t,title:r,content:s,category:a,tags:o}=e
|
|
26
|
-
if(!t||!r||!s)throw new types_js_1.McpError(types_js_1.ErrorCode.InvalidParams,"uri, title, contentは必須です")
|
|
27
|
-
debugLog("プロンプト追加実行",{uri:t,title:r,category:a})
|
|
28
|
-
try{const e=await this.database.addPrompt({uri:t,title:r,content:s,category:a,tags:o}),n={type:"text",text:`プロンプトを追加しました:\n\n【${e.title}】\nURI: ${e.uri}\nカテゴリ: ${e.category}\nID: ${e.id}\n作成日時: `+e.created_at}
|
|
29
|
-
return debugLog("プロンプト追加完了",{id:e.id,uri:e.uri}),{content:[n]}}catch(e){throw new types_js_1.McpError(types_js_1.ErrorCode.InternalError,"追加エラー: "+e.message)}}async handleGetCategories(){debugLog("カテゴリ一覧取得実行")
|
|
30
|
-
try{const e=await this.database.getCategories(),t={type:"text",text:"利用可能なカテゴリ:\n\n"+e.map(e=>"- "+e).join("\n")}
|
|
31
|
-
return debugLog("カテゴリ一覧取得完了",{count:e.length}),{content:[t]}}catch(e){throw new types_js_1.McpError(types_js_1.ErrorCode.InternalError,"カテゴリ取得エラー: "+e.message)}}async run(){debugLog("データベース版MCPサーバー開始")
|
|
32
|
-
const e=new stdio_js_1.StdioServerTransport
|
|
33
|
-
await this.server.connect(e),debugLog("データベース版MCPサーバー接続完了")}}exports.DatabaseMCPServer=DatabaseMCPServer,require.main===module&&(new DatabaseMCPServer).run().catch(e=>{process.exit(1)})
|