bluelamp 6.6.0 → 6.6.2

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/i18n/en.d.ts CHANGED
@@ -93,7 +93,7 @@ export declare const en: {
93
93
  readonly portalApiError: "Portal API error (HTTP {status})";
94
94
  readonly portalApiFailed: "Failed to retrieve knowledge from Portal API: {error}";
95
95
  readonly portalCommunicationError: "Portal API communication error: {error}";
96
- readonly noAuthToken: "No auth token set. Please log in with the bluelamp login command.";
96
+ readonly noAuthToken: "No auth token set. Run any of bluelamp1-300 in a terminal to open the login screen (this creates ~/.musuhi/portal-token.enc).";
97
97
  readonly listMcpsFailed: "Failed to list MCPs: {error}";
98
98
  readonly getMcpInfoFailed: "Failed to get MCP info: {error}";
99
99
  readonly callToolFailed: "Tool execution failed: {error}";
@@ -1 +1 @@
1
- {"version":3,"file":"en.d.ts","sourceRoot":"","sources":["../../src/i18n/en.ts"],"names":[],"mappings":"AAAA;;GAEG;AACH,eAAO,MAAM,EAAE;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;CAsGL,CAAC"}
1
+ {"version":3,"file":"en.d.ts","sourceRoot":"","sources":["../../src/i18n/en.ts"],"names":[],"mappings":"AAAA;;GAEG;AACH,eAAO,MAAM,EAAE;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;CAuGL,CAAC"}
package/dist/i18n/en.js CHANGED
@@ -1 +1 @@
1
- "use strict";Object.defineProperty(exports,"__esModule",{value:!0}),exports.en=void 0,exports.en={base:{loadedEnvLocal:"Loaded .env.local",loadedEnv:"Loaded .env",undefinedCommand:"Undefined command: {commandName}",customSlotConfig:'Custom slot config: slot{slotNumber} → "{keyword}"',slotConfigError:"Slot config error, using default: {error}",brandTitle:"B l u e L a m p",commandInfo:"Command: {commandName}{slotInfo}",debugMode:"Debug mode: enabled",logFile:"Log file: {path}",promptInfo:"Prompt: {keyword}",initialPromptTitle:"Let's get started",initialPromptLoadContext:'BlueLamp MCP reference materials "{keyword}" are available for this session.\nPlease use the load_knowledge tool to load "{keyword}" before starting.',initialPromptKeywordNote:"If MCP tools are not yet loaded, please wait a moment and try again.",initialPromptReady:"",launchingClaude:"Launching Claude...",mcpServer:"MCP Server: BlueLamp",knowledge:"Knowledge: {keyword}",debugInfo:"Debug info:",debugCommand:"Command: {command}",debugArgs:"Args: {args}",debugConfigFile:"MCP config file: {path}",debugEnvKeyword:"Env BLUELAMP_KEYWORD: {keyword}",debugEnvToken:"CLI token (portal-token.enc): {token}...",debugEnvPortal:"Env PORTAL_URL: {url}",debugConfigContent:"MCP config file contents:",claudeStartError:"Claude launch error: {error}",sessionEnd:"BlueLamp session ended",shuttingDown:"Shutting down BlueLamp...",unexpectedError:"Unexpected error: {error}",authActivated:"Connected to BlueLamp",extendedMode:"Connected to BlueLamp"},auth:{portalAuthTitle:"BlueLamp - Portal Auth",checkingSavedToken:"Checking saved token...",validationResult:"Validation result:",existingTokenValid:"Existing token is valid",savedTokenInvalid:"Saved token is invalid",enterCredentials:"Enter your Portal login credentials",invalidEmail:"Invalid email address format",emptyPassword:"Password was not entered",kiLimitExceeded:"Knowledge injection usage limit reached",kiLimitCheckPortal:"Check your usage on the Portal",authError:"Auth error: {error}",savingToken:"Saving token...",tokenSaveFailed:"Token save failed (auth succeeded)",tokenSaved:"Token saved securely",unexpectedError:"Unexpected error: {error}",authSuccess:"Portal auth successful",userLabel:"User: {name}",emailLabel:"Email: {email}",roleLabel:"Role: {role}",usingCachedToken:"Using cached token",firstLoginComplete:"First login complete",logoutTitle:"BlueLamp - Logout",confirmLogout:"Delete login credentials? (y/N): ",logoutSuccess:"Login credentials deleted",logoutNotFound:"No login credentials found",logoutCancelled:"Cancelled",envUpdateFailed:"Failed to update .env file: {error}",authAttempt:"Auth attempt {attempt}/{max}...",authOk:"Portal auth successful",tokenOk:"Token acquired",authRetry:"Retrying in {delay}ms...",portalAuthError:"Portal auth error: {error}",portalAuthHelp1:"1. Check your internet connection",portalAuthHelp2:"2. Verify your Portal credentials",portalAuthHelp3:"3. Check if {url} is accessible",portalAuthHelpTitle:"Troubleshooting:",tokenSaveComplete:"Token saved",tokenSaveError:"Token save error: {error}",tokenLoadError:"Token load error: {error}",tokenDeleteError:"Token delete error: {error}",invalidTokenFormat:"Only Portal-issued cli_ format tokens are supported",networkError:"Network error: {error}",requestTimeout:"Request timed out",responseParseError:"Response parse error: {error}"},mcp:{toolDescriptionLoadKnowledge:"Retrieve project reference materials from BlueLamp",keywordDescription:"Keyword (e.g. @相談 — use as-is, no prefix needed)",knowledgeLoadSuccess:"BlueLamp Specialized Context Loaded",knowledgeApplied:"Reference information loaded. Please refer to the above content for assistance.",knowledgeNotFound:'No knowledge found for keyword "{keyword}"',knowledgeLoadError:"Error loading knowledge: {error}",promptNotFoundForKeyword:'No prompt found for keyword "{keyword}"',apiReturnedError:"API returned an error",portalApiError:"Portal API error (HTTP {status})",portalApiFailed:"Failed to retrieve knowledge from Portal API: {error}",portalCommunicationError:"Portal API communication error: {error}",noAuthToken:"No auth token set. Please log in with the bluelamp login command.",listMcpsFailed:"Failed to list MCPs: {error}",getMcpInfoFailed:"Failed to get MCP info: {error}",callToolFailed:"Tool execution failed: {error}",violationNoToken:"No auth token set",violationApiError:"Violation report error (HTTP {status})",violationCommunicationError:"Violation report communication error: {error}"}};
1
+ "use strict";Object.defineProperty(exports,"__esModule",{value:!0}),exports.en=void 0,exports.en={base:{loadedEnvLocal:"Loaded .env.local",loadedEnv:"Loaded .env",undefinedCommand:"Undefined command: {commandName}",customSlotConfig:'Custom slot config: slot{slotNumber} → "{keyword}"',slotConfigError:"Slot config error, using default: {error}",brandTitle:"B l u e L a m p",commandInfo:"Command: {commandName}{slotInfo}",debugMode:"Debug mode: enabled",logFile:"Log file: {path}",promptInfo:"Prompt: {keyword}",initialPromptTitle:"Let's get started",initialPromptLoadContext:'BlueLamp MCP reference materials "{keyword}" are available for this session.\nPlease use the load_knowledge tool to load "{keyword}" before starting.',initialPromptKeywordNote:"If MCP tools are not yet loaded, please wait a moment and try again.",initialPromptReady:"",launchingClaude:"Launching Claude...",mcpServer:"MCP Server: BlueLamp",knowledge:"Knowledge: {keyword}",debugInfo:"Debug info:",debugCommand:"Command: {command}",debugArgs:"Args: {args}",debugConfigFile:"MCP config file: {path}",debugEnvKeyword:"Env BLUELAMP_KEYWORD: {keyword}",debugEnvToken:"CLI token (portal-token.enc): {token}...",debugEnvPortal:"Env PORTAL_URL: {url}",debugConfigContent:"MCP config file contents:",claudeStartError:"Claude launch error: {error}",sessionEnd:"BlueLamp session ended",shuttingDown:"Shutting down BlueLamp...",unexpectedError:"Unexpected error: {error}",authActivated:"Connected to BlueLamp",extendedMode:"Connected to BlueLamp"},auth:{portalAuthTitle:"BlueLamp - Portal Auth",checkingSavedToken:"Checking saved token...",validationResult:"Validation result:",existingTokenValid:"Existing token is valid",savedTokenInvalid:"Saved token is invalid",enterCredentials:"Enter your Portal login credentials",invalidEmail:"Invalid email address format",emptyPassword:"Password was not entered",kiLimitExceeded:"Knowledge injection usage limit reached",kiLimitCheckPortal:"Check your usage on the Portal",authError:"Auth error: {error}",savingToken:"Saving token...",tokenSaveFailed:"Token save failed (auth succeeded)",tokenSaved:"Token saved securely",unexpectedError:"Unexpected error: {error}",authSuccess:"Portal auth successful",userLabel:"User: {name}",emailLabel:"Email: {email}",roleLabel:"Role: {role}",usingCachedToken:"Using cached token",firstLoginComplete:"First login complete",logoutTitle:"BlueLamp - Logout",confirmLogout:"Delete login credentials? (y/N): ",logoutSuccess:"Login credentials deleted",logoutNotFound:"No login credentials found",logoutCancelled:"Cancelled",envUpdateFailed:"Failed to update .env file: {error}",authAttempt:"Auth attempt {attempt}/{max}...",authOk:"Portal auth successful",tokenOk:"Token acquired",authRetry:"Retrying in {delay}ms...",portalAuthError:"Portal auth error: {error}",portalAuthHelp1:"1. Check your internet connection",portalAuthHelp2:"2. Verify your Portal credentials",portalAuthHelp3:"3. Check if {url} is accessible",portalAuthHelpTitle:"Troubleshooting:",tokenSaveComplete:"Token saved",tokenSaveError:"Token save error: {error}",tokenLoadError:"Token load error: {error}",tokenDeleteError:"Token delete error: {error}",invalidTokenFormat:"Only Portal-issued cli_ format tokens are supported",networkError:"Network error: {error}",requestTimeout:"Request timed out",responseParseError:"Response parse error: {error}"},mcp:{toolDescriptionLoadKnowledge:"Retrieve project reference materials from BlueLamp",keywordDescription:"Keyword (e.g. @相談 — use as-is, no prefix needed)",knowledgeLoadSuccess:"BlueLamp Specialized Context Loaded",knowledgeApplied:"Reference information loaded. Please refer to the above content for assistance.",knowledgeNotFound:'No knowledge found for keyword "{keyword}"',knowledgeLoadError:"Error loading knowledge: {error}",promptNotFoundForKeyword:'No prompt found for keyword "{keyword}"',apiReturnedError:"API returned an error",portalApiError:"Portal API error (HTTP {status})",portalApiFailed:"Failed to retrieve knowledge from Portal API: {error}",portalCommunicationError:"Portal API communication error: {error}",noAuthToken:"No auth token set. Run any of bluelamp1-300 in a terminal to open the login screen (this creates ~/.musuhi/portal-token.enc).",listMcpsFailed:"Failed to list MCPs: {error}",getMcpInfoFailed:"Failed to get MCP info: {error}",callToolFailed:"Tool execution failed: {error}",violationNoToken:"No auth token set",violationApiError:"Violation report error (HTTP {status})",violationCommunicationError:"Violation report communication error: {error}"}};
@@ -1 +1 @@
1
- {"version":3,"file":"en.js","sourceRoot":"","sources":["../../src/i18n/en.ts"],"names":[],"mappings":"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"}
1
+ {"version":3,"file":"en.js","sourceRoot":"","sources":["../../src/i18n/en.ts"],"names":[],"mappings":"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"}
package/dist/i18n/ja.d.ts CHANGED
@@ -94,7 +94,7 @@ export declare const ja: {
94
94
  readonly portalApiError: "Portal APIエラー (HTTP {status})";
95
95
  readonly portalApiFailed: "Portal APIから知識を取得できませんでした: {error}";
96
96
  readonly portalCommunicationError: "Portal API通信エラー: {error}";
97
- readonly noAuthToken: "認証トークンが設定されていません。bluelamp login コマンドでログインしてください。";
97
+ readonly noAuthToken: "認証トークンが設定されていません。ターミナルで bluelamp1〜300 のいずれかを実行するとログイン画面が出ます(~/.musuhi/portal-token.enc が作成されます)。";
98
98
  readonly listMcpsFailed: "MCP一覧の取得に失敗しました: {error}";
99
99
  readonly getMcpInfoFailed: "MCP情報の取得に失敗しました: {error}";
100
100
  readonly callToolFailed: "ツール実行に失敗しました: {error}";
@@ -1 +1 @@
1
- {"version":3,"file":"ja.d.ts","sourceRoot":"","sources":["../../src/i18n/ja.ts"],"names":[],"mappings":"AAAA;;;GAGG;AACH,eAAO,MAAM,EAAE;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;CAsGL,CAAC"}
1
+ {"version":3,"file":"ja.d.ts","sourceRoot":"","sources":["../../src/i18n/ja.ts"],"names":[],"mappings":"AAAA;;;GAGG;AACH,eAAO,MAAM,EAAE;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;CAuGL,CAAC"}
package/dist/i18n/ja.js CHANGED
@@ -1 +1 @@
1
- "use strict";Object.defineProperty(exports,"__esModule",{value:!0}),exports.ja=void 0,exports.ja={base:{loadedEnvLocal:"Loaded .env.local",loadedEnv:"Loaded .env",undefinedCommand:"未定義のコマンド: {commandName}",customSlotConfig:'カスタムスロット設定: slot{slotNumber} → "{keyword}"',slotConfigError:"スロット設定取得エラー、デフォルトを使用: {error}",brandTitle:"B l u e L a m p",commandInfo:"コマンド: {commandName}{slotInfo}",debugMode:"デバッグモード: 有効",logFile:"ログファイル: {path}",promptInfo:"プロンプト: {keyword}",initialPromptTitle:"さあ始めましょう",initialPromptLoadContext:'このセッションではBlueLamp MCPの参考資料 "{keyword}" が利用可能です。\nload_knowledge ツールで "{keyword}" を読み込んでから始めてください。',initialPromptKeywordNote:"MCPツールがまだ読み込まれていない場合は、少し待ってから再度お試しください。",initialPromptReady:"",launchingClaude:"Claude 起動中...",mcpServer:"MCP Server: BlueLamp",knowledge:"Knowledge: {keyword}",debugInfo:"デバッグ情報:",debugCommand:"コマンド: {command}",debugArgs:"引数: {args}",debugConfigFile:"MCP設定ファイル: {path}",debugEnvKeyword:"環境変数 MUSUHI_KEYWORD: {keyword}",debugEnvToken:"CLI トークン (portal-token.enc): {token}...",debugEnvPortal:"環境変数 PORTAL_URL: {url}",debugConfigContent:"MCP設定ファイル内容:",claudeStartError:"Claude 起動エラー: {error}",sessionEnd:"BlueLamp セッション終了",shuttingDown:"BlueLamp を終了しています...",unexpectedError:"予期しないエラー: {error}",authActivated:"BlueLamp に接続しました",extendedMode:"BlueLamp に接続しました"},auth:{portalAuthTitle:"BlueLamp ─ 認証",checkingSavedToken:"保存されたトークンを確認中...",validationResult:"検証結果:",existingTokenValid:"既存のトークンが有効です",savedTokenInvalid:"保存されたトークンが無効です",enterCredentials:"Portalログイン情報を入力してください",invalidEmail:"無効なメールアドレス形式です",emptyPassword:"パスワードが入力されていません",kiLimitExceeded:"ナレッジインジェクション使用回数が上限に達しています",kiLimitCheckPortal:"Portalで使用状況を確認してください",authError:"認証エラー: {error}",savingToken:"トークンを保存中...",tokenSaveFailed:"トークン保存に失敗しました(認証は成功)",tokenSaved:"トークンを安全に保存しました",unexpectedError:"予期しないエラー: {error}",authSuccess:"Portal認証成功",userLabel:"ユーザー: {name}",emailLabel:"Email: {email}",roleLabel:"ロール: {role}",usingCachedToken:"保存済みトークンを使用",firstLoginComplete:"初回ログイン完了",logoutTitle:"BlueLamp - ログアウト",confirmLogout:"ログイン情報を削除しますか? (y/N): ",logoutSuccess:"ログイン情報を削除しました",logoutNotFound:"ログイン情報が見つかりません",logoutCancelled:"キャンセルしました",envUpdateFailed:"envファイルの更新に失敗: {error}",authAttempt:"認証試行 {attempt}/{max}...",authOk:"Portal認証成功",tokenOk:"トークン取得成功",authRetry:"{delay}ms後にリトライ...",portalAuthError:"Portal認証エラー: {error}",portalAuthHelp1:"1. インターネット接続を確認してください",portalAuthHelp2:"2. Portal認証情報が正しいか確認してください",portalAuthHelp3:"3. {url} にアクセスできるか確認してください",portalAuthHelpTitle:"解決方法:",tokenSaveComplete:"トークン保存完了",tokenSaveError:"トークン保存エラー: {error}",tokenLoadError:"トークン読み込みエラー: {error}",tokenDeleteError:"トークン削除エラー: {error}",invalidTokenFormat:"CLI形式トークンのみサポートされています(CLI_xxx形式)",networkError:"ネットワークエラー: {error}",requestTimeout:"リクエストタイムアウト",responseParseError:"レスポンス解析エラー: {error}"},mcp:{toolDescriptionLoadKnowledge:"プロジェクトの参考資料を取得します",keywordDescription:"キーワード(@相談 など、そのまま指定してください。プレフィックスの追加は不要です)",knowledgeLoadSuccess:"BlueLamp 専門コンテキスト読み込み完了",knowledgeApplied:"参考情報の読み込みが完了しました。上記の内容を参考にしてご支援ください。",knowledgeNotFound:'キーワード "{keyword}" に対応する知識が見つかりませんでした',knowledgeLoadError:"知識の読み込み中にエラーが発生しました: {error}",promptNotFoundForKeyword:'キーワード "{keyword}" に対応するプロンプトが見つかりませんでした',apiReturnedError:"APIがエラーを返しました",portalApiError:"Portal APIエラー (HTTP {status})",portalApiFailed:"Portal APIから知識を取得できませんでした: {error}",portalCommunicationError:"Portal API通信エラー: {error}",noAuthToken:"認証トークンが設定されていません。bluelamp login コマンドでログインしてください。",listMcpsFailed:"MCP一覧の取得に失敗しました: {error}",getMcpInfoFailed:"MCP情報の取得に失敗しました: {error}",callToolFailed:"ツール実行に失敗しました: {error}",violationNoToken:"認証トークンが設定されていません",violationApiError:"違反報告エラー (HTTP {status})",violationCommunicationError:"違反報告通信エラー: {error}"}};
1
+ "use strict";Object.defineProperty(exports,"__esModule",{value:!0}),exports.ja=void 0,exports.ja={base:{loadedEnvLocal:"Loaded .env.local",loadedEnv:"Loaded .env",undefinedCommand:"未定義のコマンド: {commandName}",customSlotConfig:'カスタムスロット設定: slot{slotNumber} → "{keyword}"',slotConfigError:"スロット設定取得エラー、デフォルトを使用: {error}",brandTitle:"B l u e L a m p",commandInfo:"コマンド: {commandName}{slotInfo}",debugMode:"デバッグモード: 有効",logFile:"ログファイル: {path}",promptInfo:"プロンプト: {keyword}",initialPromptTitle:"さあ始めましょう",initialPromptLoadContext:'このセッションではBlueLamp MCPの参考資料 "{keyword}" が利用可能です。\nload_knowledge ツールで "{keyword}" を読み込んでから始めてください。',initialPromptKeywordNote:"MCPツールがまだ読み込まれていない場合は、少し待ってから再度お試しください。",initialPromptReady:"",launchingClaude:"Claude 起動中...",mcpServer:"MCP Server: BlueLamp",knowledge:"Knowledge: {keyword}",debugInfo:"デバッグ情報:",debugCommand:"コマンド: {command}",debugArgs:"引数: {args}",debugConfigFile:"MCP設定ファイル: {path}",debugEnvKeyword:"環境変数 MUSUHI_KEYWORD: {keyword}",debugEnvToken:"CLI トークン (portal-token.enc): {token}...",debugEnvPortal:"環境変数 PORTAL_URL: {url}",debugConfigContent:"MCP設定ファイル内容:",claudeStartError:"Claude 起動エラー: {error}",sessionEnd:"BlueLamp セッション終了",shuttingDown:"BlueLamp を終了しています...",unexpectedError:"予期しないエラー: {error}",authActivated:"BlueLamp に接続しました",extendedMode:"BlueLamp に接続しました"},auth:{portalAuthTitle:"BlueLamp ─ 認証",checkingSavedToken:"保存されたトークンを確認中...",validationResult:"検証結果:",existingTokenValid:"既存のトークンが有効です",savedTokenInvalid:"保存されたトークンが無効です",enterCredentials:"Portalログイン情報を入力してください",invalidEmail:"無効なメールアドレス形式です",emptyPassword:"パスワードが入力されていません",kiLimitExceeded:"ナレッジインジェクション使用回数が上限に達しています",kiLimitCheckPortal:"Portalで使用状況を確認してください",authError:"認証エラー: {error}",savingToken:"トークンを保存中...",tokenSaveFailed:"トークン保存に失敗しました(認証は成功)",tokenSaved:"トークンを安全に保存しました",unexpectedError:"予期しないエラー: {error}",authSuccess:"Portal認証成功",userLabel:"ユーザー: {name}",emailLabel:"Email: {email}",roleLabel:"ロール: {role}",usingCachedToken:"保存済みトークンを使用",firstLoginComplete:"初回ログイン完了",logoutTitle:"BlueLamp - ログアウト",confirmLogout:"ログイン情報を削除しますか? (y/N): ",logoutSuccess:"ログイン情報を削除しました",logoutNotFound:"ログイン情報が見つかりません",logoutCancelled:"キャンセルしました",envUpdateFailed:"envファイルの更新に失敗: {error}",authAttempt:"認証試行 {attempt}/{max}...",authOk:"Portal認証成功",tokenOk:"トークン取得成功",authRetry:"{delay}ms後にリトライ...",portalAuthError:"Portal認証エラー: {error}",portalAuthHelp1:"1. インターネット接続を確認してください",portalAuthHelp2:"2. Portal認証情報が正しいか確認してください",portalAuthHelp3:"3. {url} にアクセスできるか確認してください",portalAuthHelpTitle:"解決方法:",tokenSaveComplete:"トークン保存完了",tokenSaveError:"トークン保存エラー: {error}",tokenLoadError:"トークン読み込みエラー: {error}",tokenDeleteError:"トークン削除エラー: {error}",invalidTokenFormat:"CLI形式トークンのみサポートされています(CLI_xxx形式)",networkError:"ネットワークエラー: {error}",requestTimeout:"リクエストタイムアウト",responseParseError:"レスポンス解析エラー: {error}"},mcp:{toolDescriptionLoadKnowledge:"プロジェクトの参考資料を取得します",keywordDescription:"キーワード(@相談 など、そのまま指定してください。プレフィックスの追加は不要です)",knowledgeLoadSuccess:"BlueLamp 専門コンテキスト読み込み完了",knowledgeApplied:"参考情報の読み込みが完了しました。上記の内容を参考にしてご支援ください。",knowledgeNotFound:'キーワード "{keyword}" に対応する知識が見つかりませんでした',knowledgeLoadError:"知識の読み込み中にエラーが発生しました: {error}",promptNotFoundForKeyword:'キーワード "{keyword}" に対応するプロンプトが見つかりませんでした',apiReturnedError:"APIがエラーを返しました",portalApiError:"Portal APIエラー (HTTP {status})",portalApiFailed:"Portal APIから知識を取得できませんでした: {error}",portalCommunicationError:"Portal API通信エラー: {error}",noAuthToken:"認証トークンが設定されていません。ターミナルで bluelamp1〜300 のいずれかを実行するとログイン画面が出ます(~/.musuhi/portal-token.enc が作成されます)。",listMcpsFailed:"MCP一覧の取得に失敗しました: {error}",getMcpInfoFailed:"MCP情報の取得に失敗しました: {error}",callToolFailed:"ツール実行に失敗しました: {error}",violationNoToken:"認証トークンが設定されていません",violationApiError:"違反報告エラー (HTTP {status})",violationCommunicationError:"違反報告通信エラー: {error}"}};
@@ -1 +1 @@
1
- {"version":3,"file":"ja.js","sourceRoot":"","sources":["../../src/i18n/ja.ts"],"names":[],"mappings":"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"}
1
+ {"version":3,"file":"ja.js","sourceRoot":"","sources":["../../src/i18n/ja.ts"],"names":[],"mappings":";;;AAAA;;;GAGG;AACU,QAAA,EAAE,GAAG;IAChB,IAAI,EAAE;QACJ,cAAc,EAAE,mBAAmB;QACnC,SAAS,EAAE,aAAa;QACxB,gBAAgB,EAAE,yBAAyB;QAC3C,gBAAgB,EAAE,4CAA4C;QAC9D,eAAe,EAAE,+BAA+B;QAChD,UAAU,EAAE,iBAAiB;QAC7B,WAAW,EAAE,+BAA+B;QAC5C,SAAS,EAAE,aAAa;QACxB,OAAO,EAAE,gBAAgB;QACzB,UAAU,EAAE,kBAAkB;QAC9B,kBAAkB,EAAE,UAAU;QAC9B,wBAAwB,EACtB,mGAAmG;QACrG,wBAAwB,EACtB,yCAAyC;QAC3C,kBAAkB,EAAE,EAAE;QACtB,eAAe,EAAE,eAAe;QAChC,SAAS,EAAE,sBAAsB;QACjC,SAAS,EAAE,sBAAsB;QACjC,SAAS,EAAE,SAAS;QACpB,YAAY,EAAE,iBAAiB;QAC/B,SAAS,EAAE,YAAY;QACvB,eAAe,EAAE,mBAAmB;QACpC,eAAe,EAAE,gCAAgC;QACjD,aAAa,EAAE,yCAAyC;QACxD,cAAc,EAAE,wBAAwB;QACxC,kBAAkB,EAAE,cAAc;QAClC,gBAAgB,EAAE,uBAAuB;QACzC,UAAU,EAAE,kBAAkB;QAC9B,YAAY,EAAE,sBAAsB;QACpC,eAAe,EAAE,mBAAmB;QACpC,aAAa,EAAE,kBAAkB;QACjC,YAAY,EAAE,kBAAkB;KACjC;IACD,IAAI,EAAE;QACJ,eAAe,EAAE,eAAe;QAChC,kBAAkB,EAAE,kBAAkB;QACtC,gBAAgB,EAAE,OAAO;QACzB,kBAAkB,EAAE,cAAc;QAClC,iBAAiB,EAAE,gBAAgB;QACnC,gBAAgB,EAAE,uBAAuB;QACzC,YAAY,EAAE,gBAAgB;QAC9B,aAAa,EAAE,iBAAiB;QAChC,eAAe,EAAE,4BAA4B;QAC7C,kBAAkB,EAAE,sBAAsB;QAC1C,SAAS,EAAE,gBAAgB;QAC3B,WAAW,EAAE,aAAa;QAC1B,eAAe,EAAE,sBAAsB;QACvC,UAAU,EAAE,gBAAgB;QAC5B,eAAe,EAAE,mBAAmB;QACpC,WAAW,EAAE,YAAY;QACzB,SAAS,EAAE,cAAc;QACzB,UAAU,EAAE,gBAAgB;QAC5B,SAAS,EAAE,aAAa;QACxB,gBAAgB,EAAE,aAAa;QAC/B,kBAAkB,EAAE,UAAU;QAC9B,WAAW,EAAE,kBAAkB;QAC/B,aAAa,EAAE,wBAAwB;QACvC,aAAa,EAAE,eAAe;QAC9B,cAAc,EAAE,gBAAgB;QAChC,eAAe,EAAE,WAAW;QAC5B,eAAe,EAAE,wBAAwB;QACzC,WAAW,EAAE,yBAAyB;QACtC,MAAM,EAAE,YAAY;QACpB,OAAO,EAAE,UAAU;QACnB,SAAS,EAAE,oBAAoB;QAC/B,eAAe,EAAE,sBAAsB;QACvC,eAAe,EAAE,uBAAuB;QACxC,eAAe,EAAE,4BAA4B;QAC7C,eAAe,EAAE,4BAA4B;QAC7C,mBAAmB,EAAE,OAAO;QAC5B,iBAAiB,EAAE,UAAU;QAC7B,cAAc,EAAE,oBAAoB;QACpC,cAAc,EAAE,sBAAsB;QACtC,gBAAgB,EAAE,oBAAoB;QACtC,kBAAkB,EAAE,kCAAkC;QACtD,YAAY,EAAE,oBAAoB;QAClC,cAAc,EAAE,aAAa;QAC7B,kBAAkB,EAAE,qBAAqB;KAC1C;IACD,GAAG,EAAE;QACH,4BAA4B,EAAE,mBAAmB;QACjD,kBAAkB,EAAE,4CAA4C;QAChE,oBAAoB,EAAE,yBAAyB;QAC/C,gBAAgB,EAAE,sCAAsC;QACxD,iBAAiB,EAAE,sCAAsC;QACzD,kBAAkB,EAAE,8BAA8B;QAClD,wBAAwB,EAAE,yCAAyC;QACnE,gBAAgB,EAAE,eAAe;QACjC,cAAc,EAAE,+BAA+B;QAC/C,eAAe,EAAE,oCAAoC;QACrD,wBAAwB,EAAE,0BAA0B;QACpD,WAAW,EACT,kGAAkG;QACpG,cAAc,EAAE,0BAA0B;QAC1C,gBAAgB,EAAE,0BAA0B;QAC5C,cAAc,EAAE,uBAAuB;QACvC,gBAAgB,EAAE,kBAAkB;QACpC,iBAAiB,EAAE,yBAAyB;QAC5C,2BAA2B,EAAE,oBAAoB;KAClD;CACO,CAAC"}
@@ -1,2 +1,2 @@
1
1
  #!/usr/bin/env node
2
- const{Server:Server}=require("@modelcontextprotocol/sdk/server/index.js"),{StdioServerTransport:StdioServerTransport}=require("@modelcontextprotocol/sdk/server/stdio.js"),{CallToolRequestSchema:CallToolRequestSchema,ListToolsRequestSchema:ListToolsRequestSchema}=require("@modelcontextprotocol/sdk/types.js"),{getPromptFromPortal:getPromptFromPortal,listAvailableMcps:listAvailableMcps,downloadMcpPackage:downloadMcpPackage,getGatewayConfig:getGatewayConfig,searchMcpServices:searchMcpServices,installMcpService:installMcpService,setServiceAlwaysOn:setServiceAlwaysOn,uninstallMcpService:uninstallMcpService,updateMcpEnv:updateMcpEnv,callMcpToolProxy:callMcpToolProxy}=require("./portal-api-client.cjs"),{logger:logger}=require("../../utils/logger"),{t:t,setLanguage:setLanguage}=require("../../i18n"),{collectUpdateNotices:collectUpdateNotices,buildUpdateNoticeText:buildUpdateNoticeText}=require("./mcp-version-advisor.cjs"),spawn=require("cross-spawn"),path=require("path"),fs=require("fs"),os=require("os"),dotenvLocalPath=path.join(__dirname,"../../.env.local"),dotenvPath=path.join(__dirname,"../../.env");fs.existsSync(dotenvLocalPath)?(require("dotenv").config({path:dotenvLocalPath}),logger.debug("[MCP Server] Loaded .env.local")):fs.existsSync(dotenvPath)&&(require("dotenv").config({path:dotenvPath}),logger.debug("[MCP Server] Loaded .env"));const KEYWORD=process.env.MUSUHI_KEYWORD||"BL-要件定義",{TokenManager:TokenManager}=require("../../auth/TokenManager"),TOKEN=TokenManager.loadTokenStringSync(),PORTAL_URL_ENV=process.env.BLUELAMP_PORTAL_API_BASE_URL||process.env.PORTAL_URL||"",isDevEnv=PORTAL_URL_ENV.includes("localhost"),PORTAL_URL=PORTAL_URL_ENV||(isDevEnv?"http://localhost:8430/api/bluelamp":"https://api.motohi.jp/api/bluelamp"),LANGUAGE=process.env.MUSUHI_LANGUAGE||"ja";setLanguage(LANGUAGE);const LOG_DIR=path.join(os.homedir(),".bluelamp-vscode","logs"),LOG_FILE=path.join(LOG_DIR,"mcp.log");function log(e){const t=`[${(new Date).toISOString()}] ${e}\n`;fs.appendFileSync(LOG_FILE,t),logger.info(`[MCP Server] ${e}`)}fs.existsSync(LOG_DIR)||fs.mkdirSync(LOG_DIR,{recursive:!0}),log(`MCP Server started - Log file: ${LOG_FILE}`),log("Environment variables:"),log(` KEYWORD: ${KEYWORD}`),log(" TOKEN: "+(TOKEN?TOKEN.substring(0,20)+"...":"NOT SET")),log(` PORTAL_URL: ${PORTAL_URL}`),log(` LANGUAGE: ${LANGUAGE}`);const LEGACY_REGISTRY=path.join(os.homedir(),".bluelamp","registry.json");if(fs.existsSync(LEGACY_REGISTRY))try{fs.unlinkSync(LEGACY_REGISTRY),log(`[startup] Legacy registry.json removed: ${LEGACY_REGISTRY}`)}catch(e){log(`[startup] Failed to remove legacy registry.json: ${e.message}`)}class ChildMcpProcess{constructor(e,t,r,s){this.serviceId=e,this.command=t,this.args=(r||[]).map(e=>"string"==typeof e?e.replace(/^~\//,os.homedir()+"/"):e),this.env={...process.env,...s},this.process=null,this.tools=[],this.requestId=0,this.pending=new Map,this.buffer="",this.stderrTail=""}async start(){return new Promise((e,t)=>{let r=!1;const s=(e,t)=>{r||(r=!0,clearTimeout(o),e(t))},o=setTimeout(()=>{s(t,new Error(`Timeout: "${this.serviceId}" failed to start within 90s`)),this.stop()},9e4);try{this.process=spawn(this.command,this.args,{env:this.env,stdio:["pipe","pipe","pipe"]}),this.process.on("error",e=>{s(t,new Error(`Spawn error for "${this.serviceId}": ${e.message}`))}),this.process.stdin.on("error",e=>{log(`[ChildMcp:${this.serviceId}:stdin] ${e.message}`)}),this.process.on("exit",(e,r)=>{log(`[ChildMcp] "${this.serviceId}" exited (code=${e}, signal=${r})`);const o=this.stderrTail.trim();s(t,new Error(`"${this.serviceId}" exited before ready (code=${e}, signal=${r})${o?` | stderr: ${o}`:""}`)),this.pending.forEach(e=>e.reject(new Error("Process exited"))),this.pending.clear()}),this.process.stderr.on("data",e=>{const t=e.toString();this.stderrTail=(this.stderrTail+t).slice(-500),log(`[ChildMcp:${this.serviceId}:stderr] ${t.trim()}`)}),this.process.stdout.on("data",e=>{this.buffer+=e.toString(),this._processBuffer()}),this._sendRequest("initialize",{protocolVersion:"2024-11-05",capabilities:{},clientInfo:{name:"bluelamp-gateway",version:"1.0.0"}}).then(e=>(log(`[ChildMcp] "${this.serviceId}" initialized: ${JSON.stringify(e.serverInfo||{})}`),this._sendNotification("notifications/initialized",{}),this._sendRequest("tools/list",{}))).then(t=>{const r=t.tools||[];this.tools=r.map(e=>({...e,name:`${this.serviceId}__${e.name}`,_originalName:e.name})),log(`[ChildMcp] "${this.serviceId}" ready: ${this.tools.length} tools`),s(e,this.tools)}).catch(e=>{s(t,e)})}catch(e){s(t,e)}})}async callTool(e,t){return await this._sendRequest("tools/call",{name:e,arguments:t})}stop(){this.process&&(this.process.kill(),this.process=null),this.pending.forEach(e=>e.reject(new Error("Process stopped"))),this.pending.clear()}_sendRequest(e,t){return new Promise((r,s)=>{const o=++this.requestId,i=JSON.stringify({jsonrpc:"2.0",id:o,method:e,params:t})+"\n";this.pending.set(o,{resolve:r,reject:s});try{this.process.stdin.write(i)}catch(e){this.pending.delete(o),s(new Error(`Write error: ${e.message}`))}})}_sendNotification(e,t){const r=JSON.stringify({jsonrpc:"2.0",method:e,params:t})+"\n";try{this.process.stdin.write(r)}catch(e){log(`[ChildMcp] Notification write error: ${e.message}`)}}_processBuffer(){const e=this.buffer.split("\n");this.buffer=e.pop();for(const t of e){const e=t.trim();if(e)try{const t=JSON.parse(e);if(t.id&&this.pending.has(t.id)){const e=this.pending.get(t.id);this.pending.delete(t.id),t.error?e.reject(new Error(`JSON-RPC error: ${JSON.stringify(t.error)}`)):e.resolve(t.result)}}catch(t){log(`[ChildMcp:${this.serviceId}] Parse error: ${t.message} | line: ${e.substring(0,200)}`)}}}}class ChildMcpManager{constructor(){this.children=new Map}async activateExternal(e,t){const r=new ChildMcpProcess(e,t.command,t.args||[],t.env||{}),s=await r.start();return this.children.set(e,{type:"external",process:r,tools:s,service:t}),s}deactivate(e){const t=this.children.get(e);t&&("external"===t.type&&t.process&&t.process.stop(),this.children.delete(e))}isActive(e){return this.children.has(e)}getActiveTools(){const e=[];for(const t of this.children.values())e.push(...t.tools||[]);return e}async callTool(e,t){for(const[r,s]of this.children)if("external"===s.type){const r=s.tools.find(t=>t.name===e);if(r)return{found:!0,result:await s.process.callTool(r._originalName,t)}}return{found:!1}}getActiveServiceIds(){return[...this.children.keys()]}}class BlueLampServer{constructor(){this.childManager=new ChildMcpManager,this.updateNoticeText=null,this.server=new Server({name:"bluelamp",version:"2.0.0"},{capabilities:{tools:{listChanged:!0}}}),this.setupHandlers()}checkAuth(){return TOKEN?{ok:!0}:{ok:!1,error:"BlueLamp にログインしてください。ターミナルで `bluelamp1` を一度実行すると ~/.musuhi/portal-token.enc が作成されます。"}}buildToolList(){const e=[{name:"load_knowledge",description:t("mcp.toolDescriptionLoadKnowledge"),annotations:{readOnlyHint:!0,idempotentHint:!0},inputSchema:{type:"object",properties:{keyword:{type:"string",description:t("mcp.keywordDescription")}},required:["keyword"]}},{name:"search_mcp",description:'キーワードでインストール済みMCPサービスを検索します。使いたい機能を自然言語で説明してください。(例: "ブラウザ操作", "メール送信", "画像生成")',inputSchema:{type:"object",properties:{query:{type:"string",description:"検索キーワード(自然言語OK)"}},required:["query"]}},{name:"activate_service",description:"MCPサービスを有効化してツールを追加します。search_mcpで見つけたservice_idを指定してください。always_on: trueで次回以降も自動的に有効化されます。",inputSchema:{type:"object",properties:{service_id:{type:"string",description:"サービスID"},always_on:{type:"boolean",description:"trueにすると常時アクティブ(毎回自動起動)になります"}},required:["service_id"]}},{name:"deactivate_service",description:"MCPサービスの常時アクティブ(alwaysOn)設定を解除します。次回起動時から自動有効化されなくなります。",inputSchema:{type:"object",properties:{service_id:{type:"string",description:"サービスID"}},required:["service_id"]}},{name:"restart_service",description:"MCPサービスのプロセスを再起動します。コード更新や設定変更の反映に使用します。",inputSchema:{type:"object",properties:{service_id:{type:"string",description:"サービスID"}},required:["service_id"]}},{name:"unregister_service",description:"MCPサービスをレジストリから完全に削除します。プロセスも停止します。",inputSchema:{type:"object",properties:{service_id:{type:"string",description:"削除するサービスID"}},required:["service_id"]}},{name:"register_service",description:"新しいMCPサービスをゲートウェイに登録します。",inputSchema:{type:"object",properties:{service_id:{type:"string",description:'サービスID(英数字、例: "microcms")'},name:{type:"string",description:"サービス表示名"},description:{type:"string",description:"サービスの説明"},tags:{type:"array",items:{type:"string"},description:"検索用タグ"},command:{type:"string",description:'実行コマンド("npx" or "node")'},args:{type:"array",items:{type:"string"},description:"コマンド引数"},env:{type:"object",description:"環境変数"}},required:["service_id","name","description","tags"]}},{name:"browse_mcp_store",description:"MCPストア(Portal)からインストール可能なMCP一覧を取得します。",inputSchema:{type:"object",properties:{category:{type:"string",description:"カテゴリでフィルタ(省略可)"}},required:[]}},{name:"install_from_store",description:"MCPストアからMCPをダウンロードしてインストールします。browse_mcp_storeで見つけたmcp_idを指定してください。",inputSchema:{type:"object",properties:{mcp_id:{type:"string",description:"インストールするMCPのID"}},required:["mcp_id"]}},{name:"save_mcp_env",description:"MCPの環境変数(APIキー等)をサーバーに安全に保存します。ローカルには保存されません。次回起動時にサーバーから自動取得されます。解約時はアクセスできなくなります。",inputSchema:{type:"object",properties:{service_id:{type:"string",description:"MCP サービスID(例: heygen, gemini-image)"},env:{type:"object",description:'環境変数のキーと値(例: {"HEYGEN_API_KEY": "sk_xxx"})',additionalProperties:{type:"string"}}},required:["service_id","env"]}}];if(e.push(...this.childManager.getActiveTools()),this._cloudProxyTools)for(const[t,r]of this._cloudProxyTools)e.push({name:t,description:r.description||`[${r.mcpId}] ${r.toolName}`,inputSchema:r.inputSchema||{type:"object",properties:{}}});return e}setupHandlers(){this.server.setRequestHandler(ListToolsRequestSchema,async()=>{const e=this.buildToolList(),t=this.childManager.getActiveServiceIds();return log(`[ListTools] ${e.length} tools (active: ${t.join(", ")||"none"})`),{tools:e}}),this.server.setRequestHandler(CallToolRequestSchema,async e=>{const{name:r,arguments:s}=e.params;if(log(`[CallTool] ${r}`),"load_knowledge"===r){const{keyword:e}=s;log(`[load_knowledge] keyword: ${e}`);try{const r=await getPromptFromPortal(e,TOKEN,LANGUAGE);if(!r||!r.success){const s=r?.error||t("mcp.knowledgeNotFound",{keyword:e});return{content:[{type:"text",text:`❌ ${t("mcp.portalApiFailed",{error:s})}`}],isError:!0}}const s="ja"!==LANGUAGE?"\n\n[Note] The user's preferred language is English.":"",o=this.updateNoticeText?`\n\n${this.updateNoticeText}`:"";return{content:[{type:"text",text:`✅ ${t("mcp.knowledgeLoadSuccess")}\n\n${r.knowledge}${s}\n\n━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━\n${t("mcp.knowledgeApplied")}${o}`}]}}catch(e){return log(`[load_knowledge] Exception: ${e.message}`),{content:[{type:"text",text:`❌ ${t("mcp.knowledgeLoadError",{error:e.message})}`}],isError:!0}}}if("search_mcp"===r){const e=this.checkAuth();if(!e.ok)return{content:[{type:"text",text:`🔒 ${e.error}`}],isError:!0};if(!TOKEN)return{content:[{type:"text",text:"❌ 未認証です。MCPカタログの検索にはログインが必要です。"}],isError:!0};let t=[];try{const e=await searchMcpServices(s.query,TOKEN);if(!e.success)return{content:[{type:"text",text:`❌ MCPカタログ検索に失敗: ${e.error||"Unknown"}`}],isError:!0};t=(e.data||[]).map(e=>({id:e.mcp_id,service:{name:e.name,description:e.description,tags:[],alwaysOn:e.alwaysOn||!1},isInstalled:e.isInstalled||!1}))}catch(e){return log(`[search_mcp] Server search failed: ${e.message}`),{content:[{type:"text",text:`❌ MCPカタログ検索に失敗: ${e.message}`}],isError:!0}}if(0===t.length)return{content:[{type:"text",text:`🔍 「${s.query}」に一致するサービスはありません。\n\n別のキーワードで試すか、browse_mcp_storeでカタログを確認してください。`}]};let r=`🔍 「${s.query}」の検索結果(${t.length}件)\n\n`;for(const e of t.slice(0,10)){const t=e.id,s=e.service,o=this.childManager.isActive(t),i=s.alwaysOn,n=e.isInstalled?"":" [未インストール]",c=i?" [常時アクティブ]":"";r+=`${i?"🔒":o?"🟢":"⚪"} **${s.name}**${c}${n} (id: \`${t}\`)\n`,r+=` ${s.description}\n\n`}return r+="有効化: activate_service | インストール: install_from_store",{content:[{type:"text",text:r}]}}if("activate_service"===r){const e=this.checkAuth();if(!e.ok)return{content:[{type:"text",text:`🔒 ${e.error}`}],isError:!0};const{service_id:t,always_on:r}=s,o=await getGatewayConfig(TOKEN);if(!o.success)return{content:[{type:"text",text:`❌ サーバー設定の取得に失敗: ${o.error||"Unknown"}`}],isError:!0};const i=(o.data?.services||[]).find(e=>e.mcpId===t);if(!i)return{content:[{type:"text",text:`❌ サービス "${t}" はインストールされていません。install_from_storeでインストールしてください。`}],isError:!0};if(r&&(setServiceAlwaysOn(t,!0,TOKEN).catch(e=>log(`[activate] Server sync failed: ${e.message}`)),log(`[activate] "${t}" set alwaysOn: true`)),this.childManager.isActive(t))return{content:[{type:"text",text:`ℹ️ "${t}" は既に有効です。${r?"(常時アクティブに設定しました)":""}`}]};if("cloud_proxy"===i.hostingType){const e=Array.isArray(i.tools)?i.tools:[];if(0===e.length)return{content:[{type:"text",text:`❌ "${t}" (cloud_proxy) にツール定義がありません。`}],isError:!0};this._cloudProxyTools=this._cloudProxyTools||new Map;for(const r of e){const e=`${t}__${r.name}`;this._cloudProxyTools.set(e,{mcpId:t,toolName:r.name,description:r.description,inputSchema:r.inputSchema})}log(`[activate] "${t}" (cloud_proxy) → ${e.length} proxy tools registered`);try{await this.server.notification({method:"notifications/tools/list_changed"})}catch(e){log(`[activate] notification error: ${e.message}`)}const s=e.map(e=>`${t}__${e.name}`).join(", "),o=r?" 🔒常時アクティブ":"";return{content:[{type:"text",text:`✅ "${i.name}" を有効化しました${o}(cloud_proxy ツール${e.length}個追加)\n\n追加ツール: ${s}`}]}}const n=path.join(os.homedir(),".claude","mcp-servers",t),c=i.entryPoint||"dist/index.js",a={name:i.name,description:i.description,type:"external",command:i.command||"node",args:i.args&&i.args.length?i.args:[path.join(n,c)],env:i.env||{}};let l;try{l=await this.childManager.activateExternal(t,a)}catch(e){return log(`[activate] Failed "${t}": ${e.message}`),{content:[{type:"text",text:`❌ "${t}" の起動に失敗しました: ${e.message}`}],isError:!0}}const p=l.map(e=>e.name).join(", "),d=r?" 🔒常時アクティブ":"";log(`[activate] "${t}" → ${l.length} tools${r?" (alwaysOn)":""}. Sending list_changed.`);try{await this.server.notification({method:"notifications/tools/list_changed"})}catch(e){log(`[activate] notification error: ${e.message}`)}return{content:[{type:"text",text:`✅ "${a.name}" を有効化しました${d}(ツール${l.length}個追加)\n\n追加ツール: ${p||"(なし)"}`}]}}if("deactivate_service"===r){const{service_id:e}=s;if(!TOKEN)return{content:[{type:"text",text:"🔒 未認証です。ログインが必要です。"}],isError:!0};const t=await setServiceAlwaysOn(e,!1,TOKEN);if(!t.success)return{content:[{type:"text",text:`❌ "${e}" の解除に失敗: ${t.error||"Unknown"}`}],isError:!0};log(`[deactivate] "${e}" set alwaysOn: false`);let r=0;if(this._cloudProxyTools){const t=`${e}__`;for(const e of[...this._cloudProxyTools.keys()])e.startsWith(t)&&(this._cloudProxyTools.delete(e),r++);r>0&&log(`[deactivate] "${e}" (cloud_proxy) → ${r} proxy tools removed`)}let o=!1;if(this.childManager.isActive(e)&&(this.childManager.deactivate(e),log(`[deactivate] "${e}" child process stopped`),o=!0),r>0||o)try{await this.server.notification({method:"notifications/tools/list_changed"})}catch(e){log(`[deactivate] notification error: ${e.message}`)}let i=`✅ "${e}" の常時アクティブを解除しました。`;return r>0&&(i+=` cloud_proxy ツール${r}個を削除しました。`),o&&(i+=" 子プロセスを停止しました。"),i+=" 次回起動時から自動有効化されません。",{content:[{type:"text",text:i}]}}if("restart_service"===r){const{service_id:e}=s,t=this.childManager.children.get(e),r=t?.service;if(!r)return{content:[{type:"text",text:`❌ "${e}" は現在アクティブではありません。activate_service で有効化してください。`}],isError:!0};let o,i=r;if(TOKEN)try{const t=await getGatewayConfig(TOKEN);if(t.success){const s=(t.data?.services||[]).find(t=>t.mcpId===e);s&&s.env&&(i={...r,env:s.env},log(`[restart] "${e}" env refreshed from server (keys=${Object.keys(s.env).join(",")||"none"})`))}}catch(e){log(`[restart] env refresh failed (using cached): ${e.message}`)}this.childManager.deactivate(e),log(`[restart] "${e}" stopped`);try{o=await this.childManager.activateExternal(e,i)}catch(t){return log(`[restart] Failed "${e}": ${t.message}`),{content:[{type:"text",text:`❌ "${e}" の再起動に失敗しました: ${t.message}`}],isError:!0}}log(`[restart] "${e}" → ${o.length} tools. Sending list_changed.`);try{await this.server.notification({method:"notifications/tools/list_changed"})}catch(e){log(`[restart] notification error: ${e.message}`)}const n=o.map(e=>e.name).join(", ");return{content:[{type:"text",text:`🔄 "${i.name}" を再起動しました(ツール${o.length}個)\n\nツール: ${n||"(なし)"}`}]}}if("unregister_service"===r){const{service_id:e}=s;if(!TOKEN)return{content:[{type:"text",text:"🔒 未認証です。ログインが必要です。"}],isError:!0};this.childManager.isActive(e)&&(this.childManager.deactivate(e),log(`[unregister] "${e}" stopped`));const t=await uninstallMcpService(e,TOKEN);if(!t.success)return{content:[{type:"text",text:`❌ "${e}" のサーバー削除に失敗: ${t.error||"Unknown"}`}],isError:!0};log(`[unregister] "${e}" uninstalled from server`);try{await this.server.notification({method:"notifications/tools/list_changed"})}catch(e){log(`[unregister] notification error: ${e.message}`)}return{content:[{type:"text",text:`🗑️ "${e}" を削除しました。プロセスも停止済みです。`}]}}if("register_service"===r){const e=this.checkAuth();if(!e.ok)return{content:[{type:"text",text:`🔒 ${e.error}`}],isError:!0};const{service_id:t,env:r}=s;if(!TOKEN)return{content:[{type:"text",text:"🔒 未認証です。ログインが必要です。"}],isError:!0};const o=r||{},i=await installMcpService(t,!1,TOKEN,o);return i.success?(log(`[register] "${t}" installed on server`),{content:[{type:"text",text:`✅ サービス "${t}" をサーバーに登録しました。\n\n次のステップ:\n- save_mcp_env で APIキー等を設定\n- activate_service で有効化`}]}):{content:[{type:"text",text:`❌ "${t}" の登録に失敗しました: ${i.error||"Unknown"}\n\n※ MCP はサーバーカタログに登録されている必要があります。browse_mcp_store で確認してください。`}],isError:!0}}if("save_mcp_env"===r){const e=this.checkAuth();if(!e.ok)return{content:[{type:"text",text:`🔒 ${e.error}`}],isError:!0};const{service_id:t,env:r}=s;if(!t||!r||0===Object.keys(r).length)return{content:[{type:"text",text:"❌ service_id と env(キー/値のペア)が必要です"}],isError:!0};log(`[save_mcp_env] ${t}: ${Object.keys(r).join(", ")}`);try{const e=await updateMcpEnv(t,r,TOKEN);return e.success?{content:[{type:"text",text:`🔐 環境変数をサーバーに保存しました\n\nサービス: ${t}\n保存キー: ${Object.keys(r).join(", ")}\n\n※ ローカルには保存されません。次回起動時にサーバーから自動取得されます。`}]}:{content:[{type:"text",text:`❌ サーバー保存失敗: ${e.error}`}],isError:!0}}catch(e){return log(`[save_mcp_env] error: ${e.message}`),{content:[{type:"text",text:`❌ ${e.message}`}],isError:!0}}}if("browse_mcp_store"===r){const{category:e}=s||{};log(`[browse_mcp_store] category=${e||"all"}`);try{const t=e?{category:e}:{},r=await listAvailableMcps(t,TOKEN,LANGUAGE);if(!r||!r.success)return{content:[{type:"text",text:`❌ MCPカタログの取得に失敗: ${r?.error||"Unknown"}`}],isError:!0};const s=r.data||[];if(0===s.length)return{content:[{type:"text",text:"📦 インストール可能なMCPはありません。"}]};let o=`📦 MCPストア一覧 (${s.length}件)\n\n`;return s.forEach(e=>{const t=e.hasAccess?"✅":"🔒",r=e.isOfficial?" [公式]":"";o+=`${t} **${e.name}**${r}\n`,o+=` ID: ${e.mcpId}\n`,o+=` ${e.description}\n`,o+=` カテゴリ: ${e.category} | ツール数: ${e.toolCount}\n\n`}),o+='\nインストールするには: install_from_store(mcp_id: "MCP_ID")',{content:[{type:"text",text:o}]}}catch(e){return log(`[browse_mcp_store] error: ${e.message}`),{content:[{type:"text",text:`❌ ${e.message}`}],isError:!0}}}if("install_from_store"===r){const{mcp_id:e}=s;log(`[install_from_store] mcp_id=${e}`);try{const t=await downloadMcpPackage(e,TOKEN);if(!t||!t.success)return{content:[{type:"text",text:`❌ MCPダウンロードに失敗: ${t?.error||"Unknown"}`}],isError:!0};const r=t.data,s=r.packageSource||{},o=r.files||[];let i=s.hostingType||s.hosting&&s.hosting.type||null;if(TOKEN){let t=!1;try{const r=await getGatewayConfig(TOKEN);if(r.success){const s=(r.data?.services||[]).find(t=>t.mcpId===e);s&&(t=!0===s.alwaysOn,i||(i=s.hostingType))}}catch(e){}const r=await installMcpService(e,t,TOKEN);if(!r.success)return{content:[{type:"text",text:`❌ サーバー登録失敗: ${r.error||"Unknown"}`}],isError:!0};log(`[install_from_store] Server sync OK: ${e} (alwaysOn=${t})`)}if("cloud_proxy"===i){log(`[install_from_store] "${e}" is cloud_proxy, skipping local extract`);let t=`✅ MCP「${s.name||e}」をインストールしました(cloud_proxy)\n\n`;return t+="☁ クラウド実行のためローカル展開は不要です\n",s.installNotes&&(t+=`\n📝 ${s.installNotes}\n`),t+=`\nactivate_service(service_id: "${e}") で有効化できます。`,{content:[{type:"text",text:t}]}}if(0===o.length)return{content:[{type:"text",text:"❌ MCPパッケージにファイルが含まれていません。"}],isError:!0};const n=path.join(os.homedir(),".claude","mcp-servers",e);fs.mkdirSync(n,{recursive:!0});for(const e of o){const t=path.join(n,e.path);if(fs.mkdirSync(path.dirname(t),{recursive:!0}),fs.writeFileSync(t,e.content,"utf-8"),"number"==typeof e.mode)try{fs.chmodSync(t,511&e.mode)}catch(e){}}if(log(`[install_from_store] ${o.length} files written to ${n}`),s.needsNpmInstall&&fs.existsSync(path.join(n,"package.json"))){const{execSync:e}=require("child_process");try{e("npm install --production",{cwd:n,timeout:6e4,stdio:"pipe"})}catch(e){return{content:[{type:"text",text:`⚠️ ファイル展開完了、npm install失敗: ${e.message}`}]}}}let c=`✅ MCP「${s.name||e}」をインストールしました\n\n`;c+=`📁 インストール先: ${n}\n`,c+=`📄 ファイル数: ${o.length}\n`,s.installNotes&&(c+=`\n📝 ${s.installNotes}\n`);const a=(s.requiredEnvVars||[]).filter(e=>!process.env[e]);return a.length>0&&(c+="\n⚠️ 以下の環境変数を save_mcp_env で設定してください:\n",a.forEach(e=>{c+=` - ${e}\n`})),c+=`\nactivate_service(service_id: "${e}") で有効化できます。`,{content:[{type:"text",text:c}]}}catch(e){return log(`[install_from_store] error: ${e.message}`),{content:[{type:"text",text:`❌ ${e.message}`}],isError:!0}}}if(this._cloudProxyTools&&this._cloudProxyTools.has(r)){const e=this._cloudProxyTools.get(r);log(`[callTool] Cloud proxy: ${r} → ${e.mcpId}/${e.toolName}`);try{const t=await callMcpToolProxy(e.mcpId,e.toolName,s,TOKEN);return t.success&&t.data?t.data.content?t.data:{content:[{type:"text",text:JSON.stringify(t.data,null,2)}]}:{content:[{type:"text",text:`❌ プロキシエラー: ${t.error||"Unknown"}`}],isError:!0}}catch(e){return log(`[callTool] Cloud proxy error "${r}": ${e.message}`),{content:[{type:"text",text:`❌ クラウドプロキシエラー: ${e.message}`}],isError:!0}}}try{const{found:e,result:t}=await this.childManager.callTool(r,s);if(e)return t&&t.content?t:{content:[{type:"text",text:String(t)}]}}catch(e){return log(`[callTool] Error proxying "${r}": ${e.message}`),{content:[{type:"text",text:`❌ ツール実行エラー: ${e.message}`}],isError:!0}}return{content:[{type:"text",text:`❌ Unknown tool: ${r}`}],isError:!0}})}async autoActivate(){if(!TOKEN)return void log("[autoActivate] No token, skipping auto-activation");let e=[];try{const t=await getGatewayConfig(TOKEN);if(!t.success)return void log(`[autoActivate] Server config failed: ${t.error||"Unknown"}. Starting with no services.`);e=t.data?.services||[],log(`[autoActivate] Server config: ${e.length} services`);try{const t=collectUpdateNotices(e);this.updateNoticeText=buildUpdateNoticeText(t);for(const e of t)"not-applicable"!==e.status&&log(`[versionCheck] ${e.mcpId}: ${e.status} (${e.reason}) catalog=${e.catalogVersion} local=${e.localVersion}`)}catch(e){log(`[versionCheck] skipped: ${e.message}`)}}catch(e){return void log(`[autoActivate] Server config error: ${e.message}. Starting with no services.`)}for(const t of e)if(t.alwaysOn)if("cloud_proxy"===t.hostingType){const e=Array.isArray(t.tools)?t.tools:[];if(0===e.length){log(`[autoActivate] "${t.mcpId}" (cloud_proxy) has no tools, skipping`);continue}for(const r of e){const e=`${t.mcpId}__${r.name}`;this._cloudProxyTools=this._cloudProxyTools||new Map,this._cloudProxyTools.set(e,{mcpId:t.mcpId,toolName:r.name,description:r.description,inputSchema:r.inputSchema})}log(`[autoActivate] "${t.mcpId}" (cloud_proxy) → ${e.length} proxy tools registered`)}else{const e=path.join(os.homedir(),".claude","mcp-servers",t.mcpId),r=t.entryPoint||"dist/index.js",s={name:t.name,description:t.description,type:"external",command:t.command||"node",args:t.args&&t.args.length?t.args:[path.join(e,r)],env:t.env||{}};log(`[autoActivate] Activating "${t.mcpId}" (${t.hostingType})...`);try{const e=await this.childManager.activateExternal(t.mcpId,s);log(`[autoActivate] "${t.mcpId}" ready: ${e.length} tools`)}catch(e){log(`[autoActivate] "${t.mcpId}" failed: ${e.message}`)}}}async run(){const e=new StdioServerTransport;if(await this.server.connect(e),log("[Gateway] BlueLamp Gateway v2.0.0 started."),await this.autoActivate(),this.childManager.getActiveServiceIds().length>0)try{await this.server.notification({method:"notifications/tools/list_changed"}),log("[Gateway] Initial list_changed sent after autoActivate.")}catch(e){log(`[Gateway] Initial list_changed error: ${e.message}`)}if(KEYWORD&&TOKEN){log(`[Gateway] Auto-loading knowledge for keyword: ${KEYWORD}`);const e=await getPromptFromPortal(KEYWORD,TOKEN,LANGUAGE);e&&e.success?log(`[Gateway] Auto-load successful: ${e.title}`):log(`[Gateway] Auto-load failed for keyword: ${KEYWORD}`)}}}if(module.exports={ChildMcpProcess:ChildMcpProcess,ChildMcpManager:ChildMcpManager},require.main===module){const e=new BlueLampServer;let t=!1;const r=r=>{if(!t){t=!0;try{log(`[Gateway] Shutdown (${r}) - cleaning up children...`)}catch(e){}if(e&&e.childManager&&e.childManager.children)for(const[t,r]of e.childManager.children)try{try{log(`[Gateway] Stopping child: ${t}`)}catch(e){}r&&"external"===r.type&&r.process&&"function"==typeof r.process.stop&&r.process.stop()}catch(e){}setTimeout(()=>process.exit(0),200).unref()}};process.on("SIGTERM",()=>r("SIGTERM")),process.on("SIGINT",()=>r("SIGINT")),process.on("SIGHUP",()=>r("SIGHUP")),process.stdin.on("end",()=>r("stdin-end")),process.stdin.on("close",()=>r("stdin-close")),process.on("exit",()=>{if(e&&e.childManager&&e.childManager.children)for(const[t,r]of e.childManager.children)try{r&&r.process&&r.process.process&&"function"==typeof r.process.process.kill&&r.process.process.kill("SIGKILL")}catch(e){}}),e.run().catch(e=>{log(`[Gateway] Fatal: ${e.message}`),process.exit(1)})}
2
+ const{Server:Server}=require("@modelcontextprotocol/sdk/server/index.js"),{StdioServerTransport:StdioServerTransport}=require("@modelcontextprotocol/sdk/server/stdio.js"),{CallToolRequestSchema:CallToolRequestSchema,ListToolsRequestSchema:ListToolsRequestSchema}=require("@modelcontextprotocol/sdk/types.js"),{getPromptFromPortal:getPromptFromPortal,listAvailableMcps:listAvailableMcps,downloadMcpPackage:downloadMcpPackage,getGatewayConfig:getGatewayConfig,searchMcpServices:searchMcpServices,installMcpService:installMcpService,setServiceAlwaysOn:setServiceAlwaysOn,uninstallMcpService:uninstallMcpService,updateMcpEnv:updateMcpEnv,callMcpToolProxy:callMcpToolProxy}=require("./portal-api-client.cjs"),{logger:logger}=require("../../utils/logger"),{t:t,setLanguage:setLanguage}=require("../../i18n"),{collectUpdateNotices:collectUpdateNotices,buildUpdateNoticeText:buildUpdateNoticeText}=require("./mcp-version-advisor.cjs"),spawn=require("cross-spawn"),path=require("path"),fs=require("fs"),os=require("os"),dotenvLocalPath=path.join(__dirname,"../../.env.local"),dotenvPath=path.join(__dirname,"../../.env");fs.existsSync(dotenvLocalPath)?(require("dotenv").config({path:dotenvLocalPath}),logger.debug("[MCP Server] Loaded .env.local")):fs.existsSync(dotenvPath)&&(require("dotenv").config({path:dotenvPath}),logger.debug("[MCP Server] Loaded .env"));const KEYWORD=process.env.MUSUHI_KEYWORD||"BL-要件定義",{TokenManager:TokenManager}=require("../../auth/TokenManager");function resolveToken(){return TokenManager.loadTokenStringSync()}const PORTAL_URL_ENV=process.env.BLUELAMP_PORTAL_API_BASE_URL||process.env.PORTAL_URL||"",isDevEnv=PORTAL_URL_ENV.includes("localhost"),PORTAL_URL=PORTAL_URL_ENV||(isDevEnv?"http://localhost:8430/api/bluelamp":"https://api.motohi.jp/api/bluelamp"),LANGUAGE=process.env.MUSUHI_LANGUAGE||"ja";setLanguage(LANGUAGE);const LOG_DIR=path.join(os.homedir(),".bluelamp-vscode","logs"),LOG_FILE=path.join(LOG_DIR,"mcp.log");function log(e){const t=`[${(new Date).toISOString()}] ${e}\n`;fs.appendFileSync(LOG_FILE,t),logger.info(`[MCP Server] ${e}`)}fs.existsSync(LOG_DIR)||fs.mkdirSync(LOG_DIR,{recursive:!0}),log(`MCP Server started - Log file: ${LOG_FILE}`),log("Environment variables:"),log(` KEYWORD: ${KEYWORD}`);{const e=resolveToken();log(" TOKEN (起動時スナップショット): "+(e?e.substring(0,20)+"...":"NOT SET"))}log(` PORTAL_URL: ${PORTAL_URL}`),log(` LANGUAGE: ${LANGUAGE}`);const LEGACY_REGISTRY=path.join(os.homedir(),".bluelamp","registry.json");if(fs.existsSync(LEGACY_REGISTRY))try{fs.unlinkSync(LEGACY_REGISTRY),log(`[startup] Legacy registry.json removed: ${LEGACY_REGISTRY}`)}catch(e){log(`[startup] Failed to remove legacy registry.json: ${e.message}`)}class ChildMcpProcess{constructor(e,t,r,o){this.serviceId=e,this.command=t,this.args=(r||[]).map(e=>"string"==typeof e?e.replace(/^~\//,os.homedir()+"/"):e),this.env={...process.env,...o},this.process=null,this.tools=[],this.requestId=0,this.pending=new Map,this.buffer="",this.stderrTail=""}async start(){return new Promise((e,t)=>{let r=!1;const o=(e,t)=>{r||(r=!0,clearTimeout(s),e(t))},s=setTimeout(()=>{o(t,new Error(`Timeout: "${this.serviceId}" failed to start within 90s`)),this.stop()},9e4);try{this.process=spawn(this.command,this.args,{env:this.env,stdio:["pipe","pipe","pipe"]}),this.process.on("error",e=>{o(t,new Error(`Spawn error for "${this.serviceId}": ${e.message}`))}),this.process.stdin.on("error",e=>{log(`[ChildMcp:${this.serviceId}:stdin] ${e.message}`)}),this.process.on("exit",(e,r)=>{log(`[ChildMcp] "${this.serviceId}" exited (code=${e}, signal=${r})`);const s=this.stderrTail.trim();o(t,new Error(`"${this.serviceId}" exited before ready (code=${e}, signal=${r})${s?` | stderr: ${s}`:""}`)),this.pending.forEach(e=>e.reject(new Error("Process exited"))),this.pending.clear()}),this.process.stderr.on("data",e=>{const t=e.toString();this.stderrTail=(this.stderrTail+t).slice(-500),log(`[ChildMcp:${this.serviceId}:stderr] ${t.trim()}`)}),this.process.stdout.on("data",e=>{this.buffer+=e.toString(),this._processBuffer()}),this._sendRequest("initialize",{protocolVersion:"2024-11-05",capabilities:{},clientInfo:{name:"bluelamp-gateway",version:"1.0.0"}}).then(e=>(log(`[ChildMcp] "${this.serviceId}" initialized: ${JSON.stringify(e.serverInfo||{})}`),this._sendNotification("notifications/initialized",{}),this._sendRequest("tools/list",{}))).then(t=>{const r=t.tools||[];this.tools=r.map(e=>({...e,name:`${this.serviceId}__${e.name}`,_originalName:e.name})),log(`[ChildMcp] "${this.serviceId}" ready: ${this.tools.length} tools`),o(e,this.tools)}).catch(e=>{o(t,e)})}catch(e){o(t,e)}})}async callTool(e,t){return await this._sendRequest("tools/call",{name:e,arguments:t})}stop(){this.process&&(this.process.kill(),this.process=null),this.pending.forEach(e=>e.reject(new Error("Process stopped"))),this.pending.clear()}_sendRequest(e,t){return new Promise((r,o)=>{const s=++this.requestId,i=JSON.stringify({jsonrpc:"2.0",id:s,method:e,params:t})+"\n";this.pending.set(s,{resolve:r,reject:o});try{this.process.stdin.write(i)}catch(e){this.pending.delete(s),o(new Error(`Write error: ${e.message}`))}})}_sendNotification(e,t){const r=JSON.stringify({jsonrpc:"2.0",method:e,params:t})+"\n";try{this.process.stdin.write(r)}catch(e){log(`[ChildMcp] Notification write error: ${e.message}`)}}_processBuffer(){const e=this.buffer.split("\n");this.buffer=e.pop();for(const t of e){const e=t.trim();if(e)try{const t=JSON.parse(e);if(t.id&&this.pending.has(t.id)){const e=this.pending.get(t.id);this.pending.delete(t.id),t.error?e.reject(new Error(`JSON-RPC error: ${JSON.stringify(t.error)}`)):e.resolve(t.result)}}catch(t){log(`[ChildMcp:${this.serviceId}] Parse error: ${t.message} | line: ${e.substring(0,200)}`)}}}}class ChildMcpManager{constructor(){this.children=new Map}async activateExternal(e,t){const r=new ChildMcpProcess(e,t.command,t.args||[],t.env||{}),o=await r.start();return this.children.set(e,{type:"external",process:r,tools:o,service:t}),o}deactivate(e){const t=this.children.get(e);t&&("external"===t.type&&t.process&&t.process.stop(),this.children.delete(e))}isActive(e){return this.children.has(e)}getActiveTools(){const e=[];for(const t of this.children.values())e.push(...t.tools||[]);return e}async callTool(e,t){for(const[r,o]of this.children)if("external"===o.type){const r=o.tools.find(t=>t.name===e);if(r)return{found:!0,result:await o.process.callTool(r._originalName,t)}}return{found:!1}}getActiveServiceIds(){return[...this.children.keys()]}}class BlueLampServer{constructor(){this.childManager=new ChildMcpManager,this.updateNoticeText=null,this.server=new Server({name:"bluelamp",version:"2.0.0"},{capabilities:{tools:{listChanged:!0}}}),this.setupHandlers()}checkAuth(){return resolveToken()?{ok:!0}:{ok:!1,error:"BlueLamp にログインしてください。ターミナルで `bluelamp1` を一度実行すると ~/.musuhi/portal-token.enc が作成されます。"}}buildToolList(){const e=[{name:"load_knowledge",description:t("mcp.toolDescriptionLoadKnowledge"),annotations:{readOnlyHint:!0,idempotentHint:!0},inputSchema:{type:"object",properties:{keyword:{type:"string",description:t("mcp.keywordDescription")}},required:["keyword"]}},{name:"search_mcp",description:'キーワードでインストール済みMCPサービスを検索します。使いたい機能を自然言語で説明してください。(例: "ブラウザ操作", "メール送信", "画像生成")',inputSchema:{type:"object",properties:{query:{type:"string",description:"検索キーワード(自然言語OK)"}},required:["query"]}},{name:"activate_service",description:"MCPサービスを有効化してツールを追加します。search_mcpで見つけたservice_idを指定してください。always_on: trueで次回以降も自動的に有効化されます。",inputSchema:{type:"object",properties:{service_id:{type:"string",description:"サービスID"},always_on:{type:"boolean",description:"trueにすると常時アクティブ(毎回自動起動)になります"}},required:["service_id"]}},{name:"deactivate_service",description:"MCPサービスの常時アクティブ(alwaysOn)設定を解除します。次回起動時から自動有効化されなくなります。",inputSchema:{type:"object",properties:{service_id:{type:"string",description:"サービスID"}},required:["service_id"]}},{name:"restart_service",description:"MCPサービスのプロセスを再起動します。コード更新や設定変更の反映に使用します。",inputSchema:{type:"object",properties:{service_id:{type:"string",description:"サービスID"}},required:["service_id"]}},{name:"unregister_service",description:"MCPサービスをレジストリから完全に削除します。プロセスも停止します。",inputSchema:{type:"object",properties:{service_id:{type:"string",description:"削除するサービスID"}},required:["service_id"]}},{name:"register_service",description:"新しいMCPサービスをゲートウェイに登録します。",inputSchema:{type:"object",properties:{service_id:{type:"string",description:'サービスID(英数字、例: "microcms")'},name:{type:"string",description:"サービス表示名"},description:{type:"string",description:"サービスの説明"},tags:{type:"array",items:{type:"string"},description:"検索用タグ"},command:{type:"string",description:'実行コマンド("npx" or "node")'},args:{type:"array",items:{type:"string"},description:"コマンド引数"},env:{type:"object",description:"環境変数"}},required:["service_id","name","description","tags"]}},{name:"browse_mcp_store",description:"MCPストア(Portal)からインストール可能なMCP一覧を取得します。",inputSchema:{type:"object",properties:{category:{type:"string",description:"カテゴリでフィルタ(省略可)"}},required:[]}},{name:"install_from_store",description:"MCPストアからMCPをダウンロードしてインストールします。browse_mcp_storeで見つけたmcp_idを指定してください。",inputSchema:{type:"object",properties:{mcp_id:{type:"string",description:"インストールするMCPのID"}},required:["mcp_id"]}},{name:"save_mcp_env",description:"MCPの環境変数(APIキー等)をサーバーに安全に保存します。ローカルには保存されません。次回起動時にサーバーから自動取得されます。解約時はアクセスできなくなります。",inputSchema:{type:"object",properties:{service_id:{type:"string",description:"MCP サービスID(例: heygen, gemini-image)"},env:{type:"object",description:'環境変数のキーと値(例: {"HEYGEN_API_KEY": "sk_xxx"})',additionalProperties:{type:"string"}}},required:["service_id","env"]}}];if(e.push(...this.childManager.getActiveTools()),this._cloudProxyTools)for(const[t,r]of this._cloudProxyTools)e.push({name:t,description:r.description||`[${r.mcpId}] ${r.toolName}`,inputSchema:r.inputSchema||{type:"object",properties:{}}});return e}setupHandlers(){this.server.setRequestHandler(ListToolsRequestSchema,async()=>{const e=this.buildToolList(),t=this.childManager.getActiveServiceIds();return log(`[ListTools] ${e.length} tools (active: ${t.join(", ")||"none"})`),{tools:e}}),this.server.setRequestHandler(CallToolRequestSchema,async e=>{const{name:r,arguments:o}=e.params;log(`[CallTool] ${r}`);const s=resolveToken();if("load_knowledge"===r){const{keyword:e}=o;log(`[load_knowledge] keyword: ${e}`);try{const r=await getPromptFromPortal(e,s,LANGUAGE);if(!r||!r.success){const o=r?.error||t("mcp.knowledgeNotFound",{keyword:e});return{content:[{type:"text",text:`❌ ${t("mcp.portalApiFailed",{error:o})}`}],isError:!0}}const o="ja"!==LANGUAGE?"\n\n[Note] The user's preferred language is English.":"",i=this.updateNoticeText?`\n\n${this.updateNoticeText}`:"";return{content:[{type:"text",text:`✅ ${t("mcp.knowledgeLoadSuccess")}\n\n${r.knowledge}${o}\n\n━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━\n${t("mcp.knowledgeApplied")}${i}`}]}}catch(e){return log(`[load_knowledge] Exception: ${e.message}`),{content:[{type:"text",text:`❌ ${t("mcp.knowledgeLoadError",{error:e.message})}`}],isError:!0}}}if("search_mcp"===r){const e=this.checkAuth();if(!e.ok)return{content:[{type:"text",text:`🔒 ${e.error}`}],isError:!0};if(!s)return{content:[{type:"text",text:"❌ 未認証です。MCPカタログの検索にはログインが必要です。"}],isError:!0};let t=[];try{const e=await searchMcpServices(o.query,s);if(!e.success)return{content:[{type:"text",text:`❌ MCPカタログ検索に失敗: ${e.error||"Unknown"}`}],isError:!0};t=(e.data||[]).map(e=>({id:e.mcp_id,service:{name:e.name,description:e.description,tags:[],alwaysOn:e.alwaysOn||!1},isInstalled:e.isInstalled||!1}))}catch(e){return log(`[search_mcp] Server search failed: ${e.message}`),{content:[{type:"text",text:`❌ MCPカタログ検索に失敗: ${e.message}`}],isError:!0}}if(0===t.length)return{content:[{type:"text",text:`🔍 「${o.query}」に一致するサービスはありません。\n\n別のキーワードで試すか、browse_mcp_storeでカタログを確認してください。`}]};let r=`🔍 「${o.query}」の検索結果(${t.length}件)\n\n`;for(const e of t.slice(0,10)){const t=e.id,o=e.service,s=this.childManager.isActive(t),i=o.alwaysOn,n=e.isInstalled?"":" [未インストール]",c=i?" [常時アクティブ]":"";r+=`${i?"🔒":s?"🟢":"⚪"} **${o.name}**${c}${n} (id: \`${t}\`)\n`,r+=` ${o.description}\n\n`}return r+="有効化: activate_service | インストール: install_from_store",{content:[{type:"text",text:r}]}}if("activate_service"===r){const e=this.checkAuth();if(!e.ok)return{content:[{type:"text",text:`🔒 ${e.error}`}],isError:!0};const{service_id:t,always_on:r}=o,i=await getGatewayConfig(s);if(!i.success)return{content:[{type:"text",text:`❌ サーバー設定の取得に失敗: ${i.error||"Unknown"}`}],isError:!0};const n=(i.data?.services||[]).find(e=>e.mcpId===t);if(!n)return{content:[{type:"text",text:`❌ サービス "${t}" はインストールされていません。install_from_storeでインストールしてください。`}],isError:!0};if(r&&(setServiceAlwaysOn(t,!0,s).catch(e=>log(`[activate] Server sync failed: ${e.message}`)),log(`[activate] "${t}" set alwaysOn: true`)),this.childManager.isActive(t))return{content:[{type:"text",text:`ℹ️ "${t}" は既に有効です。${r?"(常時アクティブに設定しました)":""}`}]};if("cloud_proxy"===n.hostingType){const e=Array.isArray(n.tools)?n.tools:[];if(0===e.length)return{content:[{type:"text",text:`❌ "${t}" (cloud_proxy) にツール定義がありません。`}],isError:!0};this._cloudProxyTools=this._cloudProxyTools||new Map;for(const r of e){const e=`${t}__${r.name}`;this._cloudProxyTools.set(e,{mcpId:t,toolName:r.name,description:r.description,inputSchema:r.inputSchema})}log(`[activate] "${t}" (cloud_proxy) → ${e.length} proxy tools registered`);try{await this.server.notification({method:"notifications/tools/list_changed"})}catch(e){log(`[activate] notification error: ${e.message}`)}const o=e.map(e=>`${t}__${e.name}`).join(", "),s=r?" 🔒常時アクティブ":"";return{content:[{type:"text",text:`✅ "${n.name}" を有効化しました${s}(cloud_proxy ツール${e.length}個追加)\n\n追加ツール: ${o}`}]}}const c=path.join(os.homedir(),".claude","mcp-servers",t),a=n.entryPoint||"dist/index.js",l={name:n.name,description:n.description,type:"external",command:n.command||"node",args:n.args&&n.args.length?n.args:[path.join(c,a)],env:n.env||{}};let p;try{p=await this.childManager.activateExternal(t,l)}catch(e){return log(`[activate] Failed "${t}": ${e.message}`),{content:[{type:"text",text:`❌ "${t}" の起動に失敗しました: ${e.message}`}],isError:!0}}const d=p.map(e=>e.name).join(", "),h=r?" 🔒常時アクティブ":"";log(`[activate] "${t}" → ${p.length} tools${r?" (alwaysOn)":""}. Sending list_changed.`);try{await this.server.notification({method:"notifications/tools/list_changed"})}catch(e){log(`[activate] notification error: ${e.message}`)}return{content:[{type:"text",text:`✅ "${l.name}" を有効化しました${h}(ツール${p.length}個追加)\n\n追加ツール: ${d||"(なし)"}`}]}}if("deactivate_service"===r){const{service_id:e}=o;if(!s)return{content:[{type:"text",text:"🔒 未認証です。ログインが必要です。"}],isError:!0};const t=await setServiceAlwaysOn(e,!1,s);if(!t.success)return{content:[{type:"text",text:`❌ "${e}" の解除に失敗: ${t.error||"Unknown"}`}],isError:!0};log(`[deactivate] "${e}" set alwaysOn: false`);let r=0;if(this._cloudProxyTools){const t=`${e}__`;for(const e of[...this._cloudProxyTools.keys()])e.startsWith(t)&&(this._cloudProxyTools.delete(e),r++);r>0&&log(`[deactivate] "${e}" (cloud_proxy) → ${r} proxy tools removed`)}let i=!1;if(this.childManager.isActive(e)&&(this.childManager.deactivate(e),log(`[deactivate] "${e}" child process stopped`),i=!0),r>0||i)try{await this.server.notification({method:"notifications/tools/list_changed"})}catch(e){log(`[deactivate] notification error: ${e.message}`)}let n=`✅ "${e}" の常時アクティブを解除しました。`;return r>0&&(n+=` cloud_proxy ツール${r}個を削除しました。`),i&&(n+=" 子プロセスを停止しました。"),n+=" 次回起動時から自動有効化されません。",{content:[{type:"text",text:n}]}}if("restart_service"===r){const{service_id:e}=o,t=this.childManager.children.get(e),r=t?.service;if(!r)return{content:[{type:"text",text:`❌ "${e}" は現在アクティブではありません。activate_service で有効化してください。`}],isError:!0};let i,n=r;if(s)try{const t=await getGatewayConfig(s);if(t.success){const o=(t.data?.services||[]).find(t=>t.mcpId===e);o&&o.env&&(n={...r,env:o.env},log(`[restart] "${e}" env refreshed from server (keys=${Object.keys(o.env).join(",")||"none"})`))}}catch(e){log(`[restart] env refresh failed (using cached): ${e.message}`)}this.childManager.deactivate(e),log(`[restart] "${e}" stopped`);try{i=await this.childManager.activateExternal(e,n)}catch(t){return log(`[restart] Failed "${e}": ${t.message}`),{content:[{type:"text",text:`❌ "${e}" の再起動に失敗しました: ${t.message}`}],isError:!0}}log(`[restart] "${e}" → ${i.length} tools. Sending list_changed.`);try{await this.server.notification({method:"notifications/tools/list_changed"})}catch(e){log(`[restart] notification error: ${e.message}`)}const c=i.map(e=>e.name).join(", ");return{content:[{type:"text",text:`🔄 "${n.name}" を再起動しました(ツール${i.length}個)\n\nツール: ${c||"(なし)"}`}]}}if("unregister_service"===r){const{service_id:e}=o;if(!s)return{content:[{type:"text",text:"🔒 未認証です。ログインが必要です。"}],isError:!0};this.childManager.isActive(e)&&(this.childManager.deactivate(e),log(`[unregister] "${e}" stopped`));const t=await uninstallMcpService(e,s);if(!t.success)return{content:[{type:"text",text:`❌ "${e}" のサーバー削除に失敗: ${t.error||"Unknown"}`}],isError:!0};log(`[unregister] "${e}" uninstalled from server`);try{await this.server.notification({method:"notifications/tools/list_changed"})}catch(e){log(`[unregister] notification error: ${e.message}`)}return{content:[{type:"text",text:`🗑️ "${e}" を削除しました。プロセスも停止済みです。`}]}}if("register_service"===r){const e=this.checkAuth();if(!e.ok)return{content:[{type:"text",text:`🔒 ${e.error}`}],isError:!0};const{service_id:t,env:r}=o;if(!s)return{content:[{type:"text",text:"🔒 未認証です。ログインが必要です。"}],isError:!0};const i=r||{},n=await installMcpService(t,!1,s,i);return n.success?(log(`[register] "${t}" installed on server`),{content:[{type:"text",text:`✅ サービス "${t}" をサーバーに登録しました。\n\n次のステップ:\n- save_mcp_env で APIキー等を設定\n- activate_service で有効化`}]}):{content:[{type:"text",text:`❌ "${t}" の登録に失敗しました: ${n.error||"Unknown"}\n\n※ MCP はサーバーカタログに登録されている必要があります。browse_mcp_store で確認してください。`}],isError:!0}}if("save_mcp_env"===r){const e=this.checkAuth();if(!e.ok)return{content:[{type:"text",text:`🔒 ${e.error}`}],isError:!0};const{service_id:t,env:r}=o;if(!t||!r||0===Object.keys(r).length)return{content:[{type:"text",text:"❌ service_id と env(キー/値のペア)が必要です"}],isError:!0};log(`[save_mcp_env] ${t}: ${Object.keys(r).join(", ")}`);try{const e=await updateMcpEnv(t,r,s);return e.success?{content:[{type:"text",text:`🔐 環境変数をサーバーに保存しました\n\nサービス: ${t}\n保存キー: ${Object.keys(r).join(", ")}\n\n※ ローカルには保存されません。次回起動時にサーバーから自動取得されます。`}]}:{content:[{type:"text",text:`❌ サーバー保存失敗: ${e.error}`}],isError:!0}}catch(e){return log(`[save_mcp_env] error: ${e.message}`),{content:[{type:"text",text:`❌ ${e.message}`}],isError:!0}}}if("browse_mcp_store"===r){const{category:e}=o||{};log(`[browse_mcp_store] category=${e||"all"}`);try{const t=e?{category:e}:{},r=await listAvailableMcps(t,s,LANGUAGE);if(!r||!r.success)return{content:[{type:"text",text:`❌ MCPカタログの取得に失敗: ${r?.error||"Unknown"}`}],isError:!0};const o=r.data||[];if(0===o.length)return{content:[{type:"text",text:"📦 インストール可能なMCPはありません。"}]};let i=`📦 MCPストア一覧 (${o.length}件)\n\n`;return o.forEach(e=>{const t=e.hasAccess?"✅":"🔒",r=e.isOfficial?" [公式]":"";i+=`${t} **${e.name}**${r}\n`,i+=` ID: ${e.mcpId}\n`,i+=` ${e.description}\n`,i+=` カテゴリ: ${e.category} | ツール数: ${e.toolCount}\n\n`}),i+='\nインストールするには: install_from_store(mcp_id: "MCP_ID")',{content:[{type:"text",text:i}]}}catch(e){return log(`[browse_mcp_store] error: ${e.message}`),{content:[{type:"text",text:`❌ ${e.message}`}],isError:!0}}}if("install_from_store"===r){const{mcp_id:e}=o;log(`[install_from_store] mcp_id=${e}`);try{const t=await downloadMcpPackage(e,s);if(!t||!t.success)return{content:[{type:"text",text:`❌ MCPダウンロードに失敗: ${t?.error||"Unknown"}`}],isError:!0};const r=t.data,o=r.packageSource||{},i=r.files||[];let n=o.hostingType||o.hosting&&o.hosting.type||null;if(s){let t=!1;try{const r=await getGatewayConfig(s);if(r.success){const o=(r.data?.services||[]).find(t=>t.mcpId===e);o&&(t=!0===o.alwaysOn,n||(n=o.hostingType))}}catch(e){}const r=await installMcpService(e,t,s);if(!r.success)return{content:[{type:"text",text:`❌ サーバー登録失敗: ${r.error||"Unknown"}`}],isError:!0};log(`[install_from_store] Server sync OK: ${e} (alwaysOn=${t})`)}if("cloud_proxy"===n){log(`[install_from_store] "${e}" is cloud_proxy, skipping local extract`);let t=`✅ MCP「${o.name||e}」をインストールしました(cloud_proxy)\n\n`;return t+="☁ クラウド実行のためローカル展開は不要です\n",o.installNotes&&(t+=`\n📝 ${o.installNotes}\n`),t+=`\nactivate_service(service_id: "${e}") で有効化できます。`,{content:[{type:"text",text:t}]}}if(0===i.length)return{content:[{type:"text",text:"❌ MCPパッケージにファイルが含まれていません。"}],isError:!0};const c=path.join(os.homedir(),".claude","mcp-servers",e);fs.mkdirSync(c,{recursive:!0});for(const e of i){const t=path.join(c,e.path);if(fs.mkdirSync(path.dirname(t),{recursive:!0}),fs.writeFileSync(t,e.content,"utf-8"),"number"==typeof e.mode)try{fs.chmodSync(t,511&e.mode)}catch(e){}}if(log(`[install_from_store] ${i.length} files written to ${c}`),o.needsNpmInstall&&fs.existsSync(path.join(c,"package.json"))){const{execSync:e}=require("child_process");try{e("npm install --production",{cwd:c,timeout:6e4,stdio:"pipe"})}catch(e){return{content:[{type:"text",text:`⚠️ ファイル展開完了、npm install失敗: ${e.message}`}]}}}let a=`✅ MCP「${o.name||e}」をインストールしました\n\n`;a+=`📁 インストール先: ${c}\n`,a+=`📄 ファイル数: ${i.length}\n`,o.installNotes&&(a+=`\n📝 ${o.installNotes}\n`);const l=(o.requiredEnvVars||[]).filter(e=>!process.env[e]);return l.length>0&&(a+="\n⚠️ 以下の環境変数を save_mcp_env で設定してください:\n",l.forEach(e=>{a+=` - ${e}\n`})),a+=`\nactivate_service(service_id: "${e}") で有効化できます。`,{content:[{type:"text",text:a}]}}catch(e){return log(`[install_from_store] error: ${e.message}`),{content:[{type:"text",text:`❌ ${e.message}`}],isError:!0}}}if(this._cloudProxyTools&&this._cloudProxyTools.has(r)){const e=this._cloudProxyTools.get(r);log(`[callTool] Cloud proxy: ${r} → ${e.mcpId}/${e.toolName}`);try{const t=await callMcpToolProxy(e.mcpId,e.toolName,o,s);return t.success&&t.data?t.data.content?t.data:{content:[{type:"text",text:JSON.stringify(t.data,null,2)}]}:{content:[{type:"text",text:`❌ プロキシエラー: ${t.error||"Unknown"}`}],isError:!0}}catch(e){return log(`[callTool] Cloud proxy error "${r}": ${e.message}`),{content:[{type:"text",text:`❌ クラウドプロキシエラー: ${e.message}`}],isError:!0}}}try{const{found:e,result:t}=await this.childManager.callTool(r,o);if(e)return t&&t.content?t:{content:[{type:"text",text:String(t)}]}}catch(e){return log(`[callTool] Error proxying "${r}": ${e.message}`),{content:[{type:"text",text:`❌ ツール実行エラー: ${e.message}`}],isError:!0}}return{content:[{type:"text",text:`❌ Unknown tool: ${r}`}],isError:!0}})}async autoActivate(){const e=resolveToken();if(!e)return void log("[autoActivate] No token, skipping auto-activation");let t=[];try{const r=await getGatewayConfig(e);if(!r.success)return void log(`[autoActivate] Server config failed: ${r.error||"Unknown"}. Starting with no services.`);t=r.data?.services||[],log(`[autoActivate] Server config: ${t.length} services`);try{const e=collectUpdateNotices(t);this.updateNoticeText=buildUpdateNoticeText(e);for(const t of e)"not-applicable"!==t.status&&log(`[versionCheck] ${t.mcpId}: ${t.status} (${t.reason}) catalog=${t.catalogVersion} local=${t.localVersion}`)}catch(e){log(`[versionCheck] skipped: ${e.message}`)}}catch(e){return void log(`[autoActivate] Server config error: ${e.message}. Starting with no services.`)}for(const e of t)if(e.alwaysOn)if("cloud_proxy"===e.hostingType){const t=Array.isArray(e.tools)?e.tools:[];if(0===t.length){log(`[autoActivate] "${e.mcpId}" (cloud_proxy) has no tools, skipping`);continue}for(const r of t){const t=`${e.mcpId}__${r.name}`;this._cloudProxyTools=this._cloudProxyTools||new Map,this._cloudProxyTools.set(t,{mcpId:e.mcpId,toolName:r.name,description:r.description,inputSchema:r.inputSchema})}log(`[autoActivate] "${e.mcpId}" (cloud_proxy) → ${t.length} proxy tools registered`)}else{const t=path.join(os.homedir(),".claude","mcp-servers",e.mcpId),r=e.entryPoint||"dist/index.js",o={name:e.name,description:e.description,type:"external",command:e.command||"node",args:e.args&&e.args.length?e.args:[path.join(t,r)],env:e.env||{}};log(`[autoActivate] Activating "${e.mcpId}" (${e.hostingType})...`);try{const t=await this.childManager.activateExternal(e.mcpId,o);log(`[autoActivate] "${e.mcpId}" ready: ${t.length} tools`)}catch(t){log(`[autoActivate] "${e.mcpId}" failed: ${t.message}`)}}}async run(){const e=new StdioServerTransport;if(await this.server.connect(e),log("[Gateway] BlueLamp Gateway v2.0.0 started."),await this.autoActivate(),this.childManager.getActiveServiceIds().length>0)try{await this.server.notification({method:"notifications/tools/list_changed"}),log("[Gateway] Initial list_changed sent after autoActivate.")}catch(e){log(`[Gateway] Initial list_changed error: ${e.message}`)}const t=resolveToken();if(KEYWORD&&t){log(`[Gateway] Auto-loading knowledge for keyword: ${KEYWORD}`);const e=await getPromptFromPortal(KEYWORD,t,LANGUAGE);e&&e.success?log(`[Gateway] Auto-load successful: ${e.title}`):log(`[Gateway] Auto-load failed for keyword: ${KEYWORD}`)}}}if(module.exports={ChildMcpProcess:ChildMcpProcess,ChildMcpManager:ChildMcpManager},require.main===module){const e=new BlueLampServer;let t=!1;const r=r=>{if(!t){t=!0;try{log(`[Gateway] Shutdown (${r}) - cleaning up children...`)}catch(e){}if(e&&e.childManager&&e.childManager.children)for(const[t,r]of e.childManager.children)try{try{log(`[Gateway] Stopping child: ${t}`)}catch(e){}r&&"external"===r.type&&r.process&&"function"==typeof r.process.stop&&r.process.stop()}catch(e){}setTimeout(()=>process.exit(0),200).unref()}};process.on("SIGTERM",()=>r("SIGTERM")),process.on("SIGINT",()=>r("SIGINT")),process.on("SIGHUP",()=>r("SIGHUP")),process.stdin.on("end",()=>r("stdin-end")),process.stdin.on("close",()=>r("stdin-close")),process.on("exit",()=>{if(e&&e.childManager&&e.childManager.children)for(const[t,r]of e.childManager.children)try{r&&r.process&&r.process.process&&"function"==typeof r.process.process.kill&&r.process.process.kill("SIGKILL")}catch(e){}}),e.run().catch(e=>{log(`[Gateway] Fatal: ${e.message}`),process.exit(1)})}
@@ -0,0 +1,79 @@
1
+ /**
2
+ * launcher が起動のたびに `os.tmpdir()` へ書く一時 MCP config の、命名・掃除・在使用判定。
3
+ *
4
+ * 背景(2026-08-22 CTO 実測 / 2026-08-23 実装席 実測):
5
+ * `createMCPConfig()` が書く `bluelamp-mcp-*.json` には **CLI トークンが平文で入る**。
6
+ * 旧版は `writeFileSync` に mode を渡しておらず **0644**(他ユーザが読める)で、しかも
7
+ * 終了経路によっては消えずに残っていた。実測で ami の `$TMPDIR` に 5 件、機体全体
8
+ * (`/var/folders` 横断)で 253 件が **全件 0644** のまま数日分積もっていた。
9
+ *
10
+ * 🚨 安全要件(この便の設計判断・CTO 承認 2026-08-23):
11
+ * 掃除は「古いから消す」では**絶対にやらない**。実測で、3 日前に作られた
12
+ * `bluelamp-mcp-1787195847391.json` が **走行中の CTO セッションに参照され続けていた**
13
+ * (tmux `cto25` の作成時刻と一致・pid 98912 が保持)。年齢だけで消す実装は、
14
+ * その席の MCP 構成を丸ごと奪う。
15
+ * ⇒ 消してよいのは次の **すべて** を満たすものだけ:
16
+ * 1. 自分の uid が所有している(他人のものに触らない)
17
+ * 2. **どの走行中プロセスも `--mcp-config` で参照していない**
18
+ * 3. 一定時間より古い(`ps` に現れる前の生まれたてを巻き込まない保険)
19
+ * 4. 名前に埋めた作成元 pid が死んでいる(新形式のみ。判らなければ判定しない)
20
+ * ⇒ そして **参照状況が測れなかったら 1 件も消さない**(deny by default)。
21
+ * 「0 件だった」は「走査が届いていない」と区別がつかないため、`ps` の結果は
22
+ * **自分自身の pid が見えるか**という陽性対照で妥当性を確かめてから使う。
23
+ */
24
+ /** 一時 config の名前の頭。掃除の対象を見分ける唯一の手掛かりなので固定する */
25
+ export declare const TEMP_CONFIG_PREFIX = "bluelamp-mcp-";
26
+ /** `ps` に現れる猶予。在使用判定が主で、これはその取りこぼしを埋める保険 */
27
+ export declare const DEFAULT_MIN_AGE_MS: number;
28
+ export interface SweepCandidate {
29
+ /** 絶対パス。`--mcp-config` に渡る形と一致させる */
30
+ path: string;
31
+ /** ファイル名のみ */
32
+ name: string;
33
+ /** 所有者 uid */
34
+ uid: number;
35
+ /** 最終更新時刻(ms) */
36
+ mtimeMs: number;
37
+ /** 通常ファイルか(symlink 等は対象外) */
38
+ isFile: boolean;
39
+ }
40
+ export interface SweepPlanInput {
41
+ candidates: SweepCandidate[];
42
+ /** 走行中プロセスが握っているパス。**null は「測れなかった」** を意味する */
43
+ inUsePaths: ReadonlySet<string> | null;
44
+ nowMs: number;
45
+ /** 自分の uid。判らない環境(Windows 等)では null にして uid 判定を省く */
46
+ ownUid: number | null;
47
+ minAgeMs: number;
48
+ isProcessAlive: (pid: number) => boolean;
49
+ }
50
+ /** 名前から作成元 pid を取る。旧形式・対象外はそれぞれ null / undefined を返す */
51
+ export declare function parseTempConfigName(name: string): {
52
+ ownerPid: number | null;
53
+ } | null;
54
+ /** この起動が使う一時 config のファイル名。pid を埋めて「誰が作ったか」を後から辿れるようにする */
55
+ export declare function tempConfigFileName(pid: number, randomHex: string): string;
56
+ /**
57
+ * 消してよいパスだけを返す純粋関数。I/O を持たないので、危険な条件分岐を全部テストできる。
58
+ * `inUsePaths` が null(測定不能)なら **空配列**を返す=1 件も消さない。
59
+ */
60
+ export declare function planTempMcpConfigSweep(input: SweepPlanInput): string[];
61
+ /** pid が生きているか。他ユーザ所有(EPERM)は「生きている」に倒す=消さない側へ */
62
+ export declare function isProcessAlive(pid: number): boolean;
63
+ /**
64
+ * 走行中プロセスが `--mcp-config` で握っているパスの集合。
65
+ * **測れなかったら null**(呼び出し側は掃除を中止する)。
66
+ * 妥当性は「自分自身の pid が一覧に見えるか」という陽性対照で確かめる——
67
+ * これが取れないときの空集合は「誰も使っていない」ではなく「計器が効いていない」。
68
+ */
69
+ export declare function readInUseMcpConfigPaths(): Set<string> | null;
70
+ /** `ps` 出力から `--mcp-config <path>` / `--mcp-config=<path>` を拾う(純粋) */
71
+ export declare function collectMcpConfigPaths(psOutput: string): Set<string>;
72
+ /** 掃除対象の候補を tmpdir から集める(I/O シェル)。読めないものは黙って飛ばす */
73
+ export declare function collectSweepCandidates(dir: string): SweepCandidate[];
74
+ /**
75
+ * 起動時の掃除本体。best-effort で、失敗しても launcher の起動は止めない。
76
+ * 消した件数を返す(呼び出し側でのログ・テスト用)。
77
+ */
78
+ export declare function sweepStaleTempMcpConfigs(dir?: string, minAgeMs?: number): number;
79
+ //# sourceMappingURL=tempMcpConfig.d.ts.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"tempMcpConfig.d.ts","sourceRoot":"","sources":["../../src/lib/tempMcpConfig.ts"],"names":[],"mappings":"AAAA;;;;;;;;;;;;;;;;;;;;;;GAsBG;AAOH,+CAA+C;AAC/C,eAAO,MAAM,kBAAkB,kBAAkB,CAAC;AAQlD,4CAA4C;AAC5C,eAAO,MAAM,kBAAkB,QAAiB,CAAC;AAEjD,MAAM,WAAW,cAAc;IAC7B,qCAAqC;IACrC,IAAI,EAAE,MAAM,CAAC;IACb,cAAc;IACd,IAAI,EAAE,MAAM,CAAC;IACb,cAAc;IACd,GAAG,EAAE,MAAM,CAAC;IACZ,iBAAiB;IACjB,OAAO,EAAE,MAAM,CAAC;IAChB,6BAA6B;IAC7B,MAAM,EAAE,OAAO,CAAC;CACjB;AAED,MAAM,WAAW,cAAc;IAC7B,UAAU,EAAE,cAAc,EAAE,CAAC;IAC7B,+CAA+C;IAC/C,UAAU,EAAE,WAAW,CAAC,MAAM,CAAC,GAAG,IAAI,CAAC;IACvC,KAAK,EAAE,MAAM,CAAC;IACd,qDAAqD;IACrD,MAAM,EAAE,MAAM,GAAG,IAAI,CAAC;IACtB,QAAQ,EAAE,MAAM,CAAC;IACjB,cAAc,EAAE,CAAC,GAAG,EAAE,MAAM,KAAK,OAAO,CAAC;CAC1C;AAED,wDAAwD;AACxD,wBAAgB,mBAAmB,CAAC,IAAI,EAAE,MAAM,GAAG;IAAE,QAAQ,EAAE,MAAM,GAAG,IAAI,CAAA;CAAE,GAAG,IAAI,CAIpF;AAED,2DAA2D;AAC3D,wBAAgB,kBAAkB,CAAC,GAAG,EAAE,MAAM,EAAE,SAAS,EAAE,MAAM,GAAG,MAAM,CAEzE;AAED;;;GAGG;AACH,wBAAgB,sBAAsB,CAAC,KAAK,EAAE,cAAc,GAAG,MAAM,EAAE,CAgBtE;AAED,kDAAkD;AAClD,wBAAgB,cAAc,CAAC,GAAG,EAAE,MAAM,GAAG,OAAO,CAQnD;AAED;;;;;GAKG;AACH,wBAAgB,uBAAuB,IAAI,GAAG,CAAC,MAAM,CAAC,GAAG,IAAI,CAmB5D;AAED,sEAAsE;AACtE,wBAAgB,qBAAqB,CAAC,QAAQ,EAAE,MAAM,GAAG,GAAG,CAAC,MAAM,CAAC,CAQnE;AAED,mDAAmD;AACnD,wBAAgB,sBAAsB,CAAC,GAAG,EAAE,MAAM,GAAG,cAAc,EAAE,CAyBpE;AAED;;;GAGG;AACH,wBAAgB,wBAAwB,CACtC,GAAG,GAAE,MAAoB,EACzB,QAAQ,GAAE,MAA2B,GACpC,MAAM,CAuBR"}
@@ -0,0 +1 @@
1
+ "use strict";var __createBinding=this&&this.__createBinding||(Object.create?function(e,t,n,o){void 0===o&&(o=n);var r=Object.getOwnPropertyDescriptor(t,n);r&&!("get"in r?!t.__esModule:r.writable||r.configurable)||(r={enumerable:!0,get:function(){return t[n]}}),Object.defineProperty(e,o,r)}:function(e,t,n,o){void 0===o&&(o=n),e[o]=t[n]}),__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=[];for(var n in e)Object.prototype.hasOwnProperty.call(e,n)&&(t[t.length]=n);return t},e(t)};return function(t){if(t&&t.__esModule)return t;var n={};if(null!=t)for(var o=e(t),r=0;r<o.length;r++)"default"!==o[r]&&__createBinding(n,t,o[r]);return __setModuleDefault(n,t),n}}();Object.defineProperty(exports,"__esModule",{value:!0}),exports.DEFAULT_MIN_AGE_MS=exports.TEMP_CONFIG_PREFIX=void 0,exports.parseTempConfigName=parseTempConfigName,exports.tempConfigFileName=tempConfigFileName,exports.planTempMcpConfigSweep=planTempMcpConfigSweep,exports.isProcessAlive=isProcessAlive,exports.readInUseMcpConfigPaths=readInUseMcpConfigPaths,exports.collectMcpConfigPaths=collectMcpConfigPaths,exports.collectSweepCandidates=collectSweepCandidates,exports.sweepStaleTempMcpConfigs=sweepStaleTempMcpConfigs;const node_child_process_1=require("node:child_process"),fs=__importStar(require("node:fs")),os=__importStar(require("node:os")),path=__importStar(require("node:path"));exports.TEMP_CONFIG_PREFIX="bluelamp-mcp-";const TEMP_CONFIG_NAME=/^bluelamp-mcp-(?:(\d+)-[0-9a-f]+|\d+)\.json$/;function parseTempConfigName(e){const t=TEMP_CONFIG_NAME.exec(e);return t?{ownerPid:t[1]?Number(t[1]):null}:null}function tempConfigFileName(e,t){return`${exports.TEMP_CONFIG_PREFIX}${e}-${t}.json`}function planTempMcpConfigSweep(e){const{candidates:t,inUsePaths:n,nowMs:o,ownUid:r,minAgeMs:s,isProcessAlive:i}=e;if(null===n)return[];const c=[];for(const e of t){const t=parseTempConfigName(e.name);t&&e.isFile&&(n.has(e.path)||null!==r&&e.uid!==r||o-e.mtimeMs<s||null!==t.ownerPid&&i(t.ownerPid)||c.push(e.path))}return c}function isProcessAlive(e){if(!Number.isInteger(e)||e<=0)return!0;try{return process.kill(e,0),!0}catch(e){return"EPERM"===e?.code}}function readInUseMcpConfigPaths(){let e;try{const t=(0,node_child_process_1.spawnSync)("ps",["-Awwo","pid=,command="],{encoding:"utf8",maxBuffer:67108864});if(t.error||"string"!=typeof t.stdout)return null;e=t.stdout}catch{return null}const t=e.split("\n"),n=String(process.pid);return t.some(e=>e.trim().split(/\s+/)[0]===n)?collectMcpConfigPaths(e):null}function collectMcpConfigPaths(e){const t=new Set,n=/--mcp-config[=\s]+(\S+)/g;let o;for(;null!==(o=n.exec(e));)t.add(o[1]);return t}function collectSweepCandidates(e){let t;try{t=fs.readdirSync(e)}catch{return[]}const n=[];for(const o of t){if(!parseTempConfigName(o))continue;const t=path.join(e,o);try{const e=fs.lstatSync(t);n.push({path:t,name:o,uid:e.uid,mtimeMs:e.mtimeMs,isFile:e.isFile()})}catch{}}return n}function sweepStaleTempMcpConfigs(e=os.tmpdir(),t=exports.DEFAULT_MIN_AGE_MS){try{const n=planTempMcpConfigSweep({candidates:collectSweepCandidates(e),inUsePaths:readInUseMcpConfigPaths(),nowMs:Date.now(),ownUid:"function"==typeof process.getuid?process.getuid():null,minAgeMs:t,isProcessAlive:isProcessAlive});let o=0;for(const e of n)try{fs.unlinkSync(e),o+=1}catch{}return o}catch{return 0}}exports.DEFAULT_MIN_AGE_MS=36e5;
@@ -0,0 +1 @@
1
+ {"version":3,"file":"tempMcpConfig.js","sourceRoot":"","sources":["../../src/lib/tempMcpConfig.ts"],"names":[],"mappings":"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"}
package/package.json CHANGED
@@ -1,6 +1,6 @@
1
1
  {
2
2
  "name": "bluelamp",
3
- "version": "6.6.0",
3
+ "version": "6.6.2",
4
4
  "description": "BlueLamp CLI: 旧 bluelampportal/mcp の auth / 200+ bluelamp1-N binary / postinstall scripts を TypeScript 化して monorepo に統合したパッケージ。",
5
5
  "keywords": [
6
6
  "bluelamp",
@@ -40,6 +40,7 @@
40
40
  "prepublishOnly": "pnpm run build"
41
41
  },
42
42
  "dependencies": {
43
+ "@bluelamp/cli-token": "1.0.1",
43
44
  "@modelcontextprotocol/sdk": "^1.0.0",
44
45
  "cross-spawn": "^7.0.6",
45
46
  "dotenv": "^16.6.1",