bizboost 6.6.8 → 6.6.13

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.
Files changed (57) hide show
  1. package/README.md +20 -0
  2. package/dist/auth/InteractiveLogin.d.ts.map +1 -1
  3. package/dist/auth/InteractiveLogin.js +3 -1
  4. package/dist/auth/InteractiveLogin.js.map +1 -1
  5. package/dist/auth/PortalAuthClient.js +3 -1
  6. package/dist/auth/TokenManager.d.ts +22 -0
  7. package/dist/auth/TokenManager.d.ts.map +1 -1
  8. package/dist/auth/TokenManager.js +3 -1
  9. package/dist/auth/TokenManager.js.map +1 -1
  10. package/dist/bin/bluelamp-secret.mjs +2 -0
  11. package/dist/bin/bluelamp-vscode-base.mjs +3 -1
  12. package/dist/i18n/en.d.ts +1 -2
  13. package/dist/i18n/en.d.ts.map +1 -1
  14. package/dist/i18n/en.js +1 -1
  15. package/dist/i18n/en.js.map +1 -1
  16. package/dist/i18n/ja.d.ts +1 -2
  17. package/dist/i18n/ja.d.ts.map +1 -1
  18. package/dist/i18n/ja.js +1 -1
  19. package/dist/i18n/ja.js.map +1 -1
  20. package/dist/lib/claudeAccount.d.ts +3 -2
  21. package/dist/lib/claudeAccount.d.ts.map +1 -1
  22. package/dist/lib/claudeAccount.js.map +1 -1
  23. package/dist/lib/claudeAccountLine.d.ts +24 -0
  24. package/dist/lib/claudeAccountLine.d.ts.map +1 -0
  25. package/dist/lib/claudeAccountLine.js +1 -0
  26. package/dist/lib/claudeAccountLine.js.map +1 -0
  27. package/dist/lib/connectResilience.d.ts +43 -0
  28. package/dist/lib/connectResilience.d.ts.map +1 -0
  29. package/dist/lib/connectResilience.js +1 -0
  30. package/dist/lib/connectResilience.js.map +1 -0
  31. package/dist/lib/headlessLaunch.d.ts +27 -0
  32. package/dist/lib/headlessLaunch.d.ts.map +1 -1
  33. package/dist/lib/headlessLaunch.js +1 -1
  34. package/dist/lib/headlessLaunch.js.map +1 -1
  35. package/dist/lib/mcp-server/index.cjs +1 -1
  36. package/dist/lib/mcp-server/install-package.cjs +1 -1
  37. package/dist/lib/mcp-server/portal-api-client.cjs +1 -1
  38. package/dist/lib/secretExec.d.ts +86 -0
  39. package/dist/lib/secretExec.d.ts.map +1 -0
  40. package/dist/lib/secretExec.js +1 -0
  41. package/dist/lib/secretExec.js.map +1 -0
  42. package/dist/lib/slotKeywordResolve.d.ts +21 -24
  43. package/dist/lib/slotKeywordResolve.d.ts.map +1 -1
  44. package/dist/lib/slotKeywordResolve.js +1 -1
  45. package/dist/lib/slotKeywordResolve.js.map +1 -1
  46. package/dist/lib/sysPromptHandoff.d.ts +9 -0
  47. package/dist/lib/sysPromptHandoff.d.ts.map +1 -0
  48. package/dist/lib/sysPromptHandoff.js +1 -0
  49. package/dist/lib/sysPromptHandoff.js.map +1 -0
  50. package/dist/lib/whoami.d.ts +2 -3
  51. package/dist/lib/whoami.d.ts.map +1 -1
  52. package/dist/lib/whoami.js.map +1 -1
  53. package/package.json +4 -1
  54. package/dist/lib/accountAssurance.d.ts +0 -41
  55. package/dist/lib/accountAssurance.d.ts.map +0 -1
  56. package/dist/lib/accountAssurance.js +0 -1
  57. package/dist/lib/accountAssurance.js.map +0 -1
@@ -1 +1 @@
1
- "use strict";const fs=require("fs"),path=require("path"),PRESERVE_ACROSS_SWAP=["node_modules"];function backupPathFor(r,e=new Date){return`${r}.bak-${e.toISOString().replace(/[-:]/g,"").replace(/\.\d{3}Z$/,"Z")}`}function assertInsideInstallDir(r,e){const t=path.resolve(r),n=path.resolve(e);if(n!==t&&!n.startsWith(t+path.sep))throw new Error(`install: 展開先が installDir の外を指しています(${n})`);return n}function rmrf(r){fs.rmSync(r,{recursive:!0,force:!0})}function installPackageFiles(r){const{installDir:e,files:t,needsNpmInstall:n=!1,runNpmInstall:a,now:s}=r,o=fs.existsSync(e),l=o?backupPathFor(e,s):null;o&&fs.renameSync(e,l);const c=(r,t)=>{try{rmrf(e)}catch(r){}if(!l)return{ok:!1,rolledBack:!1,backupPath:null,stage:r,error:t};try{return fs.renameSync(l,e),{ok:!1,rolledBack:!0,backupPath:null,stage:r,error:t}}catch(e){return{ok:!1,rolledBack:!1,restoreFailed:!0,backupPath:l,stage:r,error:new Error(`${t.message} / さらに旧版の復元にも失敗: ${e.message}`)}}};let i=!1;try{fs.mkdirSync(e,{recursive:!0});for(const r of t){const t=assertInsideInstallDir(e,path.join(e,r.path));if(fs.mkdirSync(path.dirname(t),{recursive:!0}),fs.writeFileSync(t,r.content,"utf-8"),"number"==typeof r.mode)try{fs.chmodSync(t,511&r.mode)}catch(r){}}if(l&&!n)for(const r of PRESERVE_ACROSS_SWAP){const t=path.join(l,r),n=path.join(e,r);fs.existsSync(t)&&!fs.existsSync(n)&&(fs.renameSync(t,n),i=!0)}}catch(r){return c("extract",r)}if(n&&fs.existsSync(path.join(e,"package.json")))try{if("function"!=typeof a)throw new Error("runNpmInstall が渡されていません");a(e)}catch(r){return c("npm-install",r)}if(l)try{rmrf(l)}catch(r){}return{ok:!0,installDir:e,fileCount:t.length,restoredNodeModules:i}}function formatInstallFailure(r,e){const t="npm-install"===e.stage?"npm install":"ファイル展開";return e.restoreFailed?`❌ MCP「${r}」の${t}に失敗し、**旧版の復元にも失敗しました**。\n🚨 この機体の ${r} は壊れています。退避は次の場所に在ります:\n ${e.backupPath}\n詳細: ${e.error.message}`:e.rolledBack?`❌ MCP「${r}」の${t}に失敗したため、**旧版へ戻しました**(機体は元の状態です)。\n詳細: ${e.error.message}`:`❌ MCP「${r}」の${t}に失敗しました(新規インストールのため、作りかけは削除しました)。\n詳細: ${e.error.message}`}module.exports={installPackageFiles:installPackageFiles,formatInstallFailure:formatInstallFailure,backupPathFor:backupPathFor,PRESERVE_ACROSS_SWAP:PRESERVE_ACROSS_SWAP};
1
+ "use strict";const fs=require("fs"),path=require("path"),PRESERVE_ACROSS_SWAP=["node_modules"];function backupPathFor(e,t=new Date){return`${e}.bak-${t.toISOString().replace(/[-:]/g,"").replace(/\.\d{3}Z$/,"Z")}`}function assertInsideInstallDir(e,t){const n=path.resolve(e),r=path.resolve(t);if(r!==n&&!r.startsWith(n+path.sep))throw new Error(`install: 展開先が installDir の外を指しています(${r})`);return r}function rmrf(e){fs.rmSync(e,{recursive:!0,force:!0})}function installPackageFiles(e){const{installDir:t,files:n,needsNpmInstall:r=!1,runNpmInstall:s,now:a}=e,o=fs.existsSync(t),c=o?backupPathFor(t,a):null;o&&fs.renameSync(t,c);const i=(e,n)=>{try{rmrf(t)}catch(e){}if(!c)return{ok:!1,rolledBack:!1,backupPath:null,stage:e,error:n};try{return fs.renameSync(c,t),{ok:!1,rolledBack:!0,backupPath:null,stage:e,error:n}}catch(t){return{ok:!1,rolledBack:!1,restoreFailed:!0,backupPath:c,stage:e,error:new Error(`${n.message} / さらに旧版の復元にも失敗: ${t.message}`)}}};let l=!1;try{fs.mkdirSync(t,{recursive:!0});for(const e of n){const n=assertInsideInstallDir(t,path.join(t,e.path));if(fs.mkdirSync(path.dirname(n),{recursive:!0}),fs.writeFileSync(n,e.content,"utf-8"),"number"==typeof e.mode)try{fs.chmodSync(n,511&e.mode)}catch(e){}}if(c&&!r)for(const e of PRESERVE_ACROSS_SWAP){const n=path.join(c,e),r=path.join(t,e);fs.existsSync(n)&&!fs.existsSync(r)&&(fs.renameSync(n,r),l=!0)}}catch(e){return i("extract",e)}if(r&&fs.existsSync(path.join(t,"package.json")))try{if("function"!=typeof s)throw new Error("runNpmInstall が渡されていません");s(t)}catch(e){return i("npm-install",e)}if(c)try{rmrf(c)}catch(e){}return{ok:!0,installDir:t,fileCount:n.length,restoredNodeModules:l}}function formatInstallFailure(e,t){const n="npm-install"===t.stage?"npm install":"ファイル展開";return t.restoreFailed?`❌ MCP「${e}」の${n}に失敗し、**旧版の復元にも失敗しました**。\n🚨 この機体の ${e} は壊れています。退避は次の場所に在ります:\n ${t.backupPath}\n詳細: ${t.error.message}`:t.rolledBack?`❌ MCP「${e}」の${n}に失敗したため、**旧版へ戻しました**(機体は元の状態です)。\n詳細: ${t.error.message}`:`❌ MCP「${e}」の${n}に失敗しました(新規インストールのため、作りかけは削除しました)。\n詳細: ${t.error.message}`}function withoutDevDependencies(e){const t=JSON.parse(e);return Object.prototype.hasOwnProperty.call(t,"devDependencies")?(delete t.devDependencies,`${JSON.stringify(t,null,2)}\n`):e}const PRODUCTION_NPM_INSTALL="npm install --omit=dev --no-audit --no-fund",NPM_INSTALL_TIMEOUT_MS=9e5;function runProductionNpmInstall(e,{exec:t=require("child_process").execSync}={}){const n=path.join(e,"package.json"),r=fs.readFileSync(n,"utf-8"),s=withoutDevDependencies(r);s!==r&&fs.writeFileSync(n,s,"utf-8");try{t(PRODUCTION_NPM_INSTALL,{cwd:e,timeout:9e5,stdio:"pipe"})}catch(e){if(e&&"ETIMEDOUT"===e.code)throw new Error(`npm install が 15 分で終わらず打ち切りました(網が極端に遅いか npm が固まった見込み)。撃ち直すと、取得済みの分は npm の置き場から使われます。(${e.message})`);throw e}}module.exports={installPackageFiles:installPackageFiles,formatInstallFailure:formatInstallFailure,backupPathFor:backupPathFor,PRESERVE_ACROSS_SWAP:PRESERVE_ACROSS_SWAP,withoutDevDependencies:withoutDevDependencies,runProductionNpmInstall:runProductionNpmInstall,PRODUCTION_NPM_INSTALL:PRODUCTION_NPM_INSTALL,NPM_INSTALL_TIMEOUT_MS:9e5};
@@ -1 +1 @@
1
- const fetch=(...t)=>import("node-fetch").then(({default:e})=>e(...t)),https=require("https"),fs=require("fs"),path=require("path"),os=require("os"),{requireFromPackage:requireFromPackage}=require("../requireFromPackage.cjs"),{logger:logger}=requireFromPackage(require,"../../utils/logger"),{t:t}=requireFromPackage(require,"../../i18n"),PORTAL_URL_ENV=process.env.BLUELAMP_PORTAL_API_BASE_URL||process.env.PORTAL_URL||"",isDevEnvironment=PORTAL_URL_ENV.includes("localhost"),httpsAgent=new https.Agent({rejectUnauthorized:!isDevEnvironment}),PORTAL_URL=PORTAL_URL_ENV||(isDevEnvironment?"http://localhost:8430/api/bluelamp":"https://api.motohi.jp/api/bluelamp"),LOG_DIR=path.join(os.homedir(),".bluelamp-vscode","logs"),LOG_FILE=path.join(LOG_DIR,"mcp.log");function log(t){const e=`[${(new Date).toISOString()}] ${t}\n`;fs.appendFileSync(LOG_FILE,e),logger.debug(t)}let _cliVersion;function getCliVersion(){if(void 0!==_cliVersion)return _cliVersion;let t=__dirname;for(let e=0;e<6;e++){try{const e=require(path.join(t,"package.json"));if(e&&e.version&&e.bin&&Object.keys(e.bin).some(t=>/^[a-z]+\d+$/.test(t)))return _cliVersion=e.version,_cliVersion}catch(t){}const e=path.dirname(t);if(e===t)break;t=e}return _cliVersion=null,_cliVersion}async function getPromptFromPortal(e,o,s="ja"){try{if(log(`[portal-api-client] getPromptFromPortal called with keyword: ${e}, lang: ${s}, token: ${o?"present":"missing"}`),!o)return log("[portal-api-client] No authentication token provided"),{success:!1,error:t("mcp.noAuthToken")};const r=process.env.MUSUHI_TENANT_ID||"",a=encodeURIComponent(e);let n=`${PORTAL_URL}/cli/prompts/knowledge-injection/${a}?lang=${s}`;r&&(n+=`&tenant_id=${encodeURIComponent(r)}`),log(`[portal-api-client] Direct keyword search: ${n}`),log("[portal-api-client] About to call fetch...");const c=await fetch(n,{method:"GET",headers:{"X-CLI-Token":o,...getCliVersion()?{"X-CLI-Version":getCliVersion()}:{},...r?{"X-Tenant-ID":r}:{},"Content-Type":"application/json","User-Agent":"BizBoost-VSCode-MCP/1.0"},agent:n.startsWith("https")?httpsAgent:void 0});if(log("[portal-api-client] Fetch completed"),log(`[portal-api-client] Response status: ${c.status}`),log(`[portal-api-client] Response headers: ${JSON.stringify(Object.fromEntries(c.headers.entries()))}`),!c.ok){log(`[portal-api-client] Portal API error: ${c.status}`);const e=await c.text();log(`[portal-api-client] Error response: ${e}`);let o=t("mcp.portalApiError",{status:c.status}),s=null;try{const t=JSON.parse(e);t.message&&(o=t.message),t.code&&(s=t.code)}catch(t){}return{success:!1,error:o,status:c.status,code:s}}const i=await c.json();if(log("[portal-api-client] Direct keyword search completed successfully"),!i.success)return log("[portal-api-client] API returned success: false"),{success:!1,error:i.message||t("mcp.apiReturnedError")};const l=i.data;if(!l)return log(`[portal-api-client] No prompt found for keyword: ${e}`),{success:!1,error:t("mcp.promptNotFoundForKeyword",{keyword:e})};if(log(`[portal-api-client] Found prompt: ${l.title}`),l.content||l.text)return{success:!0,knowledge:l.content||l.text,title:l.title,tags:l.tags||[]};try{const t=`${PORTAL_URL}/cli/prompts/${l.id}`;log(`[portal-api-client] Fetching prompt details from: ${t}`);const e=await fetch(t,{method:"GET",headers:{"X-CLI-Token":o,"Content-Type":"application/json","User-Agent":"BizBoost-VSCode-MCP/1.0"},agent:httpsAgent});if(e.ok){const t=await e.json();if(t.success&&t.data?.prompt?.content)return log("[portal-api-client] Successfully fetched prompt content"),{success:!0,knowledge:t.data.prompt.content,title:l.title||l.name,tags:l.tags}}}catch(t){log(`[portal-api-client] Error fetching prompt details: ${t.message}`)}return{success:!0,knowledge:l.description||`# ${l.title}\n\n${t("mcp.knowledgeLoadError",{error:"detail fetch failed"})}`,title:l.title||l.name,tags:l.tags}}catch(e){return log(`[portal-api-client] FATAL ERROR in getPromptFromPortal: ${e.message}`),log(`[portal-api-client] Error stack: ${e.stack}`),logger.error(`Failed to get prompt from Portal: ${e.message}`),{success:!1,error:t("mcp.portalCommunicationError",{error:e.message})}}}async function getSlotConfig(t,e){try{if(!e)return log("[portal-api-client] getSlotConfig: No token"),{ok:!1,reason:"no-token"};const o=process.env.MUSUHI_TENANT_ID||"",s=`${PORTAL_URL}/cli/slot-config/${t}`;log(`[portal-api-client] Fetching slot config: ${s}${o?` (tenant=${o})`:""}`);const r=await fetch(s,{method:"GET",headers:{"X-CLI-Token":e,...getCliVersion()?{"X-CLI-Version":getCliVersion()}:{},...o?{"X-Tenant-ID":o}:{},"Content-Type":"application/json","User-Agent":"BizBoost-VSCode-MCP/1.0"},agent:s.startsWith("https")?httpsAgent:void 0});if(!r.ok){log(`[portal-api-client] Slot config API error: ${r.status}`);let t=null;try{const e=await r.json();t=e?.error?.message||e?.message||null}catch{t=null}return 404===r.status?{ok:!1,reason:"not-configured",status:404,message:t}:403===r.status?{ok:!1,reason:"rank",status:403,message:t}:{ok:!1,reason:"http",status:r.status,message:t}}const a=await r.json();return a.success&&a.data?.keyword?(log(`[portal-api-client] Slot ${t}: custom keyword "${a.data.keyword}"`),{ok:!0,keyword:a.data.keyword}):(log(`[portal-api-client] Slot ${t}: no custom config`),{ok:!0,keyword:null})}catch(t){return log(`[portal-api-client] getSlotConfig error: ${t.message}`),{ok:!1,reason:"network",status:null,message:t.message}}}async function reportViolation(e,o,s,r){try{if(log(`[portal-api-client] reportViolation called: severity=${o}`),!s)return{success:!1,error:t("mcp.violationNoToken")};const a=`${PORTAL_URL}/cli/report-violation`,n={reason:e,severity:o};r&&(n.userMessage=r);const c=await fetch(a,{method:"POST",headers:{"X-CLI-Token":s,"Content-Type":"application/json","User-Agent":"BizBoost-VSCode-MCP/1.0"},agent:a.startsWith("https")?httpsAgent:void 0,body:JSON.stringify(n)});if(!c.ok){const e=await c.text();return log(`[portal-api-client] reportViolation error: ${c.status} ${e}`),{success:!1,error:t("mcp.violationApiError",{status:c.status})}}const i=await c.json();return log(`[portal-api-client] reportViolation result: action=${i.action}, count=${i.violationCount}`),i}catch(e){return log(`[portal-api-client] reportViolation FATAL: ${e.message}`),{success:!1,error:t("mcp.violationCommunicationError",{error:e.message})}}}async function listAvailableMcps(e={},o,s="ja"){try{if(log(`[portal-api-client] listAvailableMcps called: ${JSON.stringify(e)}`),!o)return{success:!1,error:t("mcp.noAuthToken")};const r=new URLSearchParams;e.search&&r.set("search",e.search),e.limit&&r.set("limit",String(e.limit)),r.set("lang",s);const a=`${PORTAL_URL}/mcp/catalog?${r.toString()}`;log(`[portal-api-client] Fetching MCP catalog: ${a}`);const n=await fetch(a,{method:"GET",headers:{"X-CLI-Token":o,"Content-Type":"application/json","User-Agent":"BizBoost-VSCode-MCP/1.0"},agent:a.startsWith("https")?httpsAgent:void 0});if(!n.ok){const e=await n.text();log(`[portal-api-client] listAvailableMcps error: ${n.status} ${e}`);let o=t("mcp.listMcpsFailed",{error:`HTTP ${n.status}`});try{const t=JSON.parse(e);t.message&&(o=t.message)}catch(t){}return{success:!1,error:o}}const c=await n.json();return log(`[portal-api-client] listAvailableMcps: ${c.data?.length||0} MCPs found`),{success:!0,data:c.data||[]}}catch(e){return log(`[portal-api-client] listAvailableMcps FATAL: ${e.message}`),{success:!1,error:t("mcp.portalCommunicationError",{error:e.message})}}}async function getMcpInfo(e,o,s="ja"){try{if(log(`[portal-api-client] getMcpInfo called: mcpId=${e}`),!o)return{success:!1,error:t("mcp.noAuthToken")};const r=`${PORTAL_URL}/mcp/${encodeURIComponent(e)}/details?lang=${s}`;log(`[portal-api-client] Fetching MCP info: ${r}`);const a=await fetch(r,{method:"GET",headers:{"X-CLI-Token":o,"Content-Type":"application/json","User-Agent":"BizBoost-VSCode-MCP/1.0"},agent:r.startsWith("https")?httpsAgent:void 0});if(!a.ok){const e=await a.text();log(`[portal-api-client] getMcpInfo error: ${a.status} ${e}`);let o=t("mcp.getMcpInfoFailed",{error:`HTTP ${a.status}`});try{const t=JSON.parse(e);t.message&&(o=t.message)}catch(t){}return{success:!1,error:o}}const n=await a.json();return log(`[portal-api-client] getMcpInfo: found ${n.data?.name||e}`),{success:!0,data:n.data}}catch(e){return log(`[portal-api-client] getMcpInfo FATAL: ${e.message}`),{success:!1,error:t("mcp.portalCommunicationError",{error:e.message})}}}async function callMcpTool(e,o,s,r){try{if(log(`[portal-api-client] callMcpTool called: mcpId=${e}, tool=${o}`),!r)return{success:!1,error:t("mcp.noAuthToken")};const a=`${PORTAL_URL}/mcp/${encodeURIComponent(e)}/call`,n={tool_name:o,arguments:s};log(`[portal-api-client] Calling MCP tool: ${a}`);const c=await fetch(a,{method:"POST",headers:{"X-CLI-Token":r,"Content-Type":"application/json","User-Agent":"BizBoost-VSCode-MCP/1.0"},agent:a.startsWith("https")?httpsAgent:void 0,body:JSON.stringify(n)});if(!c.ok){const e=await c.text();log(`[portal-api-client] callMcpTool error: ${c.status} ${e}`);let o=t("mcp.callToolFailed",{error:`HTTP ${c.status}`});try{const t=JSON.parse(e);t.message&&(o=t.message)}catch(t){}return{success:!1,error:o}}const i=await c.json();return log("[portal-api-client] callMcpTool: success"),{success:!0,data:i.data}}catch(e){return log(`[portal-api-client] callMcpTool FATAL: ${e.message}`),{success:!1,error:t("mcp.portalCommunicationError",{error:e.message})}}}async function scanMcpCode(e,o){try{if(log("[portal-api-client] scanMcpCode called"),!o)return{success:!1,error:t("mcp.noAuthToken")};const s=`${PORTAL_URL}/mcp/scan`,r=await fetch(s,{method:"POST",headers:{"X-CLI-Token":o,"Content-Type":"application/json","User-Agent":"BizBoost-VSCode-MCP/1.0"},agent:s.startsWith("https")?httpsAgent:void 0,body:JSON.stringify({code:e})});if(!r.ok){const t=await r.text();return log(`[portal-api-client] scanMcpCode error: ${r.status} ${t}`),{success:!1,error:`HTTP ${r.status}`}}return{success:!0,data:(await r.json()).data}}catch(e){return log(`[portal-api-client] scanMcpCode FATAL: ${e.message}`),{success:!1,error:t("mcp.portalCommunicationError",{error:e.message})}}}async function deployUserMcp(e,o){try{if(log(`[portal-api-client] deployUserMcp called: name=${e.name}`),!o)return{success:!1,error:t("mcp.noAuthToken")};const s=`${PORTAL_URL}/mcp/deploy`,r=await fetch(s,{method:"POST",headers:{"X-CLI-Token":o,"Content-Type":"application/json","User-Agent":"BizBoost-VSCode-MCP/1.0"},agent:s.startsWith("https")?httpsAgent:void 0,body:JSON.stringify(e)});if(!r.ok){const t=await r.text();log(`[portal-api-client] deployUserMcp error: ${r.status} ${t}`);let e=`HTTP ${r.status}`;try{const o=JSON.parse(t);if(o.error&&(e=o.error),o.details)return{success:!1,error:e,details:o.details}}catch(t){}return{success:!1,error:e}}return{success:!0,data:(await r.json()).data}}catch(e){return log(`[portal-api-client] deployUserMcp FATAL: ${e.message}`),{success:!1,error:t("mcp.portalCommunicationError",{error:e.message})}}}async function listUserCreatedMcps(e){try{if(log("[portal-api-client] listUserCreatedMcps called"),!e)return{success:!1,error:t("mcp.noAuthToken")};const o=`${PORTAL_URL}/mcp/user/me/created`,s=await fetch(o,{method:"GET",headers:{"X-CLI-Token":e,"Content-Type":"application/json","User-Agent":"BizBoost-VSCode-MCP/1.0"},agent:o.startsWith("https")?httpsAgent:void 0});return s.ok?{success:!0,data:(await s.json()).data}:(await s.text(),log(`[portal-api-client] listUserCreatedMcps error: ${s.status}`),{success:!1,error:`HTTP ${s.status}`})}catch(e){return log(`[portal-api-client] listUserCreatedMcps FATAL: ${e.message}`),{success:!1,error:t("mcp.portalCommunicationError",{error:e.message})}}}async function deleteUserMcp(e,o){try{if(log(`[portal-api-client] deleteUserMcp called: mcpId=${e}`),!o)return{success:!1,error:t("mcp.noAuthToken")};const s=`${PORTAL_URL}/mcp/${encodeURIComponent(e)}`,r=await fetch(s,{method:"DELETE",headers:{"X-CLI-Token":o,"Content-Type":"application/json","User-Agent":"BizBoost-VSCode-MCP/1.0"},agent:s.startsWith("https")?httpsAgent:void 0});if(!r.ok){const t=await r.text();log(`[portal-api-client] deleteUserMcp error: ${r.status}`);let e=`HTTP ${r.status}`;try{const o=JSON.parse(t);o.error&&(e=o.error)}catch(t){}return{success:!1,error:e}}return{success:!0,data:(await r.json()).data}}catch(e){return log(`[portal-api-client] deleteUserMcp FATAL: ${e.message}`),{success:!1,error:t("mcp.portalCommunicationError",{error:e.message})}}}async function listMyPrompts(e){try{if(log("[portal-api-client] listMyPrompts called"),!e)return{success:!1,error:t("mcp.noAuthToken")};const o=`${PORTAL_URL}/cli/my-agents`,s=await fetch(o,{method:"GET",headers:{"X-CLI-Token":e,"Content-Type":"application/json","User-Agent":"BizBoost-VSCode-MCP/1.0"},agent:o.startsWith("https")?httpsAgent:void 0});return s.ok?{success:!0,data:(await s.json()).data||[]}:(await s.text(),log(`[portal-api-client] listMyPrompts error: ${s.status}`),{success:!1,error:`HTTP ${s.status}`})}catch(e){return log(`[portal-api-client] listMyPrompts FATAL: ${e.message}`),{success:!1,error:t("mcp.portalCommunicationError",{error:e.message})}}}async function saveMyPrompt(e,o){try{if(log(`[portal-api-client] saveMyPrompt called: title=${e.title}`),!o)return{success:!1,error:t("mcp.noAuthToken")};const s=`${PORTAL_URL}/cli/my-agents`,r=await fetch(s,{method:"POST",headers:{"X-CLI-Token":o,"Content-Type":"application/json","User-Agent":"BizBoost-VSCode-MCP/1.0"},agent:s.startsWith("https")?httpsAgent:void 0,body:JSON.stringify(e)});if(!r.ok){const t=await r.text();log(`[portal-api-client] saveMyPrompt error: ${r.status} ${t}`);let e=`HTTP ${r.status}`;try{const o=JSON.parse(t);o.message&&(e=o.message)}catch(t){}return{success:!1,error:e}}return{success:!0,data:(await r.json()).data}}catch(e){return log(`[portal-api-client] saveMyPrompt FATAL: ${e.message}`),{success:!1,error:t("mcp.portalCommunicationError",{error:e.message})}}}async function deleteMyPrompt(e,o){try{if(log(`[portal-api-client] deleteMyPrompt called: id=${e}`),!o)return{success:!1,error:t("mcp.noAuthToken")};const s=`${PORTAL_URL}/cli/my-agents/${encodeURIComponent(e)}`,r=await fetch(s,{method:"DELETE",headers:{"X-CLI-Token":o,"Content-Type":"application/json","User-Agent":"BizBoost-VSCode-MCP/1.0"},agent:s.startsWith("https")?httpsAgent:void 0});if(!r.ok){const t=await r.text();log(`[portal-api-client] deleteMyPrompt error: ${r.status}`);let e=`HTTP ${r.status}`;try{const o=JSON.parse(t);o.message&&(e=o.message)}catch(t){}return{success:!1,error:e}}return{success:!0,data:(await r.json()).data}}catch(e){return log(`[portal-api-client] deleteMyPrompt FATAL: ${e.message}`),{success:!1,error:t("mcp.portalCommunicationError",{error:e.message})}}}async function downloadMcpPackage(e,o){try{if(log(`[portal-api-client] downloadMcpPackage called: mcpId=${e}`),!o)return{success:!1,error:t("mcp.noAuthToken")};const s=`${PORTAL_URL}/mcp/${encodeURIComponent(e)}/download`;log(`[portal-api-client] Downloading MCP package: ${s}`);const r=await fetch(s,{method:"GET",headers:{"X-CLI-Token":o,"Content-Type":"application/json","User-Agent":"BizBoost-VSCode-MCP/1.0"},agent:s.startsWith("https")?httpsAgent:void 0});if(!r.ok){const t=await r.text();log(`[portal-api-client] downloadMcpPackage error: ${r.status} ${t}`);let e=`Download failed: HTTP ${r.status}`;try{const o=JSON.parse(t);o.message&&(e=o.message)}catch(t){}return{success:!1,error:e}}const a=await r.json();return log(`[portal-api-client] downloadMcpPackage: ${a.data?.files?.length||0} files`),{success:!0,data:a.data}}catch(e){return log(`[portal-api-client] downloadMcpPackage FATAL: ${e.message}`),{success:!1,error:t("mcp.portalCommunicationError",{error:e.message})}}}async function getGatewayConfig(t){try{if(!t)return{success:!1,error:"No token"};const e=`${PORTAL_URL}/mcp/user/me/gateway-config`;log(`[portal-api-client] getGatewayConfig: ${e}`);const o=await fetch(e,{method:"GET",headers:{"X-CLI-Token":t,"Content-Type":"application/json"},agent:e.startsWith("https")?httpsAgent:void 0});if(!o.ok)return{success:!1,error:`HTTP ${o.status}`};const s=await o.json();return log(`[portal-api-client] getGatewayConfig: ${s.data?.services?.length||0} services`),{success:!0,data:s.data}}catch(t){return log(`[portal-api-client] getGatewayConfig error: ${t.message}`),{success:!1,error:t.message}}}async function searchMcpServices(t,e){try{if(!e)return{success:!1,error:"No token"};const o=`${PORTAL_URL}/mcp/search?q=${encodeURIComponent(t)}`;log(`[portal-api-client] searchMcpServices: ${o}`);const s=await fetch(o,{method:"GET",headers:{"X-CLI-Token":e,"Content-Type":"application/json"},agent:o.startsWith("https")?httpsAgent:void 0});return s.ok?{success:!0,data:(await s.json()).data}:{success:!1,error:`HTTP ${s.status}`}}catch(t){return log(`[portal-api-client] searchMcpServices error: ${t.message}`),{success:!1,error:t.message}}}async function installMcpService(t,e,o,s){try{if(!o)return{success:!1,error:"No token"};const r=`${PORTAL_URL}/mcp/user/me/install`,a={mcpId:t,alwaysOn:e??!1};s&&Object.keys(s).length>0&&(a.envOverrides=s);const n=await fetch(r,{method:"POST",headers:{"X-CLI-Token":o,"Content-Type":"application/json"},agent:r.startsWith("https")?httpsAgent:void 0,body:JSON.stringify(a)});return n.ok?{success:!0,data:(await n.json()).data}:{success:!1,error:`HTTP ${n.status}`}}catch(t){return log(`[portal-api-client] installMcpService error: ${t.message}`),{success:!1,error:t.message}}}async function setServiceDeactivated(t,e,o){try{if(!o)return{success:!1,error:"No token"};const s=e?"deactivate":"activate",r=`${PORTAL_URL}/mcp/user/me/services/${encodeURIComponent(t)}/${s}`,a=await fetch(r,{method:"POST",headers:{"X-CLI-Token":o,"Content-Type":"application/json"},agent:r.startsWith("https")?httpsAgent:void 0});return a.ok?{success:!0,data:(await a.json()).data}:{success:!1,error:`HTTP ${a.status}`}}catch(t){return log(`[portal-api-client] setServiceDeactivated error: ${t.message}`),{success:!1,error:t.message}}}async function uninstallMcpService(t,e){try{if(!e)return{success:!1,error:"No token"};const o=`${PORTAL_URL}/mcp/user/me/services/${encodeURIComponent(t)}`,s=await fetch(o,{method:"DELETE",headers:{"X-CLI-Token":e,"Content-Type":"application/json"},agent:o.startsWith("https")?httpsAgent:void 0});return s.ok?{success:!0,data:(await s.json()).data}:{success:!1,error:`HTTP ${s.status}`}}catch(t){return log(`[portal-api-client] uninstallMcpService error: ${t.message}`),{success:!1,error:t.message}}}async function updateMcpEnv(t,e,o){try{if(!o)return{success:!1,error:"No token"};const s=`${PORTAL_URL}/mcp/user/me/services/${encodeURIComponent(t)}/env`,r=await fetch(s,{method:"PUT",headers:{"X-CLI-Token":o,"Content-Type":"application/json"},agent:s.startsWith("https")?httpsAgent:void 0,body:JSON.stringify({env:e})});if(!r.ok)return{success:!1,error:`HTTP ${r.status}`};const a=await r.json();return{success:!0,data:a.data,warning:a.warning||null}}catch(t){return log(`[portal-api-client] updateMcpEnv error: ${t.message}`),{success:!1,error:t.message}}}async function callMcpToolProxy(t,e,o,s){try{if(!s)return{success:!1,error:"No token"};const r=`${PORTAL_URL}/mcp/${encodeURIComponent(t)}/call`,a=await fetch(r,{method:"POST",headers:{"X-CLI-Token":s,"Content-Type":"application/json"},agent:r.startsWith("https")?httpsAgent:void 0,body:JSON.stringify({tool_name:e,arguments:o})});if(!a.ok){const t=await a.text();return{success:!1,error:`HTTP ${a.status}: ${t.slice(0,200)}`}}return await a.json()}catch(t){return log(`[portal-api-client] callMcpToolProxy error: ${t.message}`),{success:!1,error:t.message}}}fs.existsSync(LOG_DIR)||fs.mkdirSync(LOG_DIR,{recursive:!0}),module.exports={getPromptFromPortal:getPromptFromPortal,getSlotConfig:getSlotConfig,reportViolation:reportViolation,listAvailableMcps:listAvailableMcps,getMcpInfo:getMcpInfo,downloadMcpPackage:downloadMcpPackage,callMcpTool:callMcpTool,scanMcpCode:scanMcpCode,deployUserMcp:deployUserMcp,listUserCreatedMcps:listUserCreatedMcps,deleteUserMcp:deleteUserMcp,listMyPrompts:listMyPrompts,saveMyPrompt:saveMyPrompt,deleteMyPrompt:deleteMyPrompt,getGatewayConfig:getGatewayConfig,searchMcpServices:searchMcpServices,installMcpService:installMcpService,setServiceDeactivated:setServiceDeactivated,uninstallMcpService:uninstallMcpService,updateMcpEnv:updateMcpEnv,callMcpToolProxy:callMcpToolProxy};
1
+ const fetch=(...t)=>import("node-fetch").then(({default:e})=>e(...t)),https=require("https"),fs=require("fs"),path=require("path"),os=require("os"),{requireFromPackage:requireFromPackage}=require("../requireFromPackage.cjs"),{logger:logger}=requireFromPackage(require,"../../utils/logger"),{t:t}=requireFromPackage(require,"../../i18n"),PORTAL_URL_ENV=process.env.BLUELAMP_PORTAL_API_BASE_URL||process.env.PORTAL_URL||"",isDevEnvironment=PORTAL_URL_ENV.includes("localhost"),httpsAgent=new https.Agent({rejectUnauthorized:!isDevEnvironment}),PORTAL_URL=PORTAL_URL_ENV||(isDevEnvironment?"http://localhost:8430/api/bluelamp":"https://api.motohi.jp/api/bluelamp"),LOG_DIR=path.join(os.homedir(),".bluelamp-vscode","logs"),LOG_FILE=path.join(LOG_DIR,"mcp.log");function log(t){const e=`[${(new Date).toISOString()}] ${t}\n`;fs.appendFileSync(LOG_FILE,e),logger.debug(t)}let _cliVersion;function getCliVersion(){if(void 0!==_cliVersion)return _cliVersion;let t=__dirname;for(let e=0;e<6;e++){try{const e=require(path.join(t,"package.json"));if(e&&e.version&&e.bin&&Object.keys(e.bin).some(t=>/^[a-z]+\d+$/.test(t)))return _cliVersion=e.version,_cliVersion}catch(t){}const e=path.dirname(t);if(e===t)break;t=e}return _cliVersion=null,_cliVersion}async function getPromptFromPortal(e,o,s="ja"){try{if(log(`[portal-api-client] getPromptFromPortal called with keyword: ${e}, lang: ${s}, token: ${o?"present":"missing"}`),!o)return log("[portal-api-client] No authentication token provided"),{success:!1,error:t("mcp.noAuthToken")};const r=process.env.MUSUHI_TENANT_ID||"",a=encodeURIComponent(e);let n=`${PORTAL_URL}/cli/prompts/knowledge-injection/${a}?lang=${s}`;r&&(n+=`&tenant_id=${encodeURIComponent(r)}`),log(`[portal-api-client] Direct keyword search: ${n}`),log("[portal-api-client] About to call fetch...");const c=await fetch(n,{method:"GET",headers:{"X-CLI-Token":o,...getCliVersion()?{"X-CLI-Version":getCliVersion()}:{},...r?{"X-Tenant-ID":r}:{},"Content-Type":"application/json","User-Agent":"BizBoost-VSCode-MCP/1.0"},agent:n.startsWith("https")?httpsAgent:void 0});if(log("[portal-api-client] Fetch completed"),log(`[portal-api-client] Response status: ${c.status}`),log(`[portal-api-client] Response headers: ${JSON.stringify(Object.fromEntries(c.headers.entries()))}`),!c.ok){log(`[portal-api-client] Portal API error: ${c.status}`);const e=await c.text();log(`[portal-api-client] Error response: ${e}`);let o=t("mcp.portalApiError",{status:c.status}),s=null;try{const t=JSON.parse(e);t.message&&(o=t.message),t.code&&(s=t.code)}catch(t){}return{success:!1,error:o,status:c.status,code:s}}const i=await c.json();if(log("[portal-api-client] Direct keyword search completed successfully"),!i.success)return log("[portal-api-client] API returned success: false"),{success:!1,error:i.message||t("mcp.apiReturnedError")};const l=i.data;if(!l)return log(`[portal-api-client] No prompt found for keyword: ${e}`),{success:!1,error:t("mcp.promptNotFoundForKeyword",{keyword:e})};if(log(`[portal-api-client] Found prompt: ${l.title}`),l.content||l.text)return{success:!0,knowledge:l.content||l.text,title:l.title,tags:l.tags||[]};try{const t=`${PORTAL_URL}/cli/prompts/${l.id}`;log(`[portal-api-client] Fetching prompt details from: ${t}`);const e=await fetch(t,{method:"GET",headers:{"X-CLI-Token":o,"Content-Type":"application/json","User-Agent":"BizBoost-VSCode-MCP/1.0"},agent:httpsAgent});if(e.ok){const t=await e.json();if(t.success&&t.data?.prompt?.content)return log("[portal-api-client] Successfully fetched prompt content"),{success:!0,knowledge:t.data.prompt.content,title:l.title||l.name,tags:l.tags}}}catch(t){log(`[portal-api-client] Error fetching prompt details: ${t.message}`)}return{success:!0,knowledge:l.description||`# ${l.title}\n\n${t("mcp.knowledgeLoadError",{error:"detail fetch failed"})}`,title:l.title||l.name,tags:l.tags}}catch(e){return log(`[portal-api-client] FATAL ERROR in getPromptFromPortal: ${e.message}`),log(`[portal-api-client] Error stack: ${e.stack}`),logger.error(`Failed to get prompt from Portal: ${e.message}`),{success:!1,error:t("mcp.portalCommunicationError",{error:e.message}),networkFailure:Boolean(e&&"FetchError"===e.name)}}}async function getSlotConfig(t,e){try{if(!e)return log("[portal-api-client] getSlotConfig: No token"),{ok:!1,reason:"no-token"};const o=process.env.MUSUHI_TENANT_ID||"",s=`${PORTAL_URL}/cli/slot-config/${t}`;log(`[portal-api-client] Fetching slot config: ${s}${o?` (tenant=${o})`:""}`);const r=await fetch(s,{method:"GET",headers:{"X-CLI-Token":e,...getCliVersion()?{"X-CLI-Version":getCliVersion()}:{},...o?{"X-Tenant-ID":o}:{},"Content-Type":"application/json","User-Agent":"BizBoost-VSCode-MCP/1.0"},agent:s.startsWith("https")?httpsAgent:void 0});if(!r.ok){log(`[portal-api-client] Slot config API error: ${r.status}`);let t=null;try{const e=await r.json();t=e?.error?.message||e?.message||null}catch{t=null}return 404===r.status?{ok:!1,reason:"not-configured",status:404,message:t}:403===r.status?{ok:!1,reason:"rank",status:403,message:t}:{ok:!1,reason:"http",status:r.status,message:t}}const a=await r.json();return a.success&&a.data?.keyword?(log(`[portal-api-client] Slot ${t}: custom keyword "${a.data.keyword}"`),{ok:!0,keyword:a.data.keyword}):(log(`[portal-api-client] Slot ${t}: no custom config`),{ok:!0,keyword:null})}catch(t){return log(`[portal-api-client] getSlotConfig error: ${t.message}`),{ok:!1,reason:"network",status:null,message:t.message}}}async function reportViolation(e,o,s,r){try{if(log(`[portal-api-client] reportViolation called: severity=${o}`),!s)return{success:!1,error:t("mcp.violationNoToken")};const a=`${PORTAL_URL}/cli/report-violation`,n={reason:e,severity:o};r&&(n.userMessage=r);const c=await fetch(a,{method:"POST",headers:{"X-CLI-Token":s,"Content-Type":"application/json","User-Agent":"BizBoost-VSCode-MCP/1.0"},agent:a.startsWith("https")?httpsAgent:void 0,body:JSON.stringify(n)});if(!c.ok){const e=await c.text();return log(`[portal-api-client] reportViolation error: ${c.status} ${e}`),{success:!1,error:t("mcp.violationApiError",{status:c.status})}}const i=await c.json();return log(`[portal-api-client] reportViolation result: action=${i.action}, count=${i.violationCount}`),i}catch(e){return log(`[portal-api-client] reportViolation FATAL: ${e.message}`),{success:!1,error:t("mcp.violationCommunicationError",{error:e.message})}}}async function listAvailableMcps(e={},o,s="ja"){try{if(log(`[portal-api-client] listAvailableMcps called: ${JSON.stringify(e)}`),!o)return{success:!1,error:t("mcp.noAuthToken")};const r=new URLSearchParams;e.search&&r.set("search",e.search),e.limit&&r.set("limit",String(e.limit)),r.set("lang",s);const a=`${PORTAL_URL}/mcp/catalog?${r.toString()}`;log(`[portal-api-client] Fetching MCP catalog: ${a}`);const n=await fetch(a,{method:"GET",headers:{"X-CLI-Token":o,"Content-Type":"application/json","User-Agent":"BizBoost-VSCode-MCP/1.0"},agent:a.startsWith("https")?httpsAgent:void 0});if(!n.ok){const e=await n.text();log(`[portal-api-client] listAvailableMcps error: ${n.status} ${e}`);let o=t("mcp.listMcpsFailed",{error:`HTTP ${n.status}`});try{const t=JSON.parse(e);t.message&&(o=t.message)}catch(t){}return{success:!1,error:o}}const c=await n.json();return log(`[portal-api-client] listAvailableMcps: ${c.data?.length||0} MCPs found`),{success:!0,data:c.data||[]}}catch(e){return log(`[portal-api-client] listAvailableMcps FATAL: ${e.message}`),{success:!1,error:t("mcp.portalCommunicationError",{error:e.message})}}}async function getMcpInfo(e,o,s="ja"){try{if(log(`[portal-api-client] getMcpInfo called: mcpId=${e}`),!o)return{success:!1,error:t("mcp.noAuthToken")};const r=`${PORTAL_URL}/mcp/${encodeURIComponent(e)}/details?lang=${s}`;log(`[portal-api-client] Fetching MCP info: ${r}`);const a=await fetch(r,{method:"GET",headers:{"X-CLI-Token":o,"Content-Type":"application/json","User-Agent":"BizBoost-VSCode-MCP/1.0"},agent:r.startsWith("https")?httpsAgent:void 0});if(!a.ok){const e=await a.text();log(`[portal-api-client] getMcpInfo error: ${a.status} ${e}`);let o=t("mcp.getMcpInfoFailed",{error:`HTTP ${a.status}`});try{const t=JSON.parse(e);t.message&&(o=t.message)}catch(t){}return{success:!1,error:o}}const n=await a.json();return log(`[portal-api-client] getMcpInfo: found ${n.data?.name||e}`),{success:!0,data:n.data}}catch(e){return log(`[portal-api-client] getMcpInfo FATAL: ${e.message}`),{success:!1,error:t("mcp.portalCommunicationError",{error:e.message})}}}async function callMcpTool(e,o,s,r){try{if(log(`[portal-api-client] callMcpTool called: mcpId=${e}, tool=${o}`),!r)return{success:!1,error:t("mcp.noAuthToken")};const a=`${PORTAL_URL}/mcp/${encodeURIComponent(e)}/call`,n={tool_name:o,arguments:s};log(`[portal-api-client] Calling MCP tool: ${a}`);const c=await fetch(a,{method:"POST",headers:{"X-CLI-Token":r,"Content-Type":"application/json","User-Agent":"BizBoost-VSCode-MCP/1.0"},agent:a.startsWith("https")?httpsAgent:void 0,body:JSON.stringify(n)});if(!c.ok){const e=await c.text();log(`[portal-api-client] callMcpTool error: ${c.status} ${e}`);let o=t("mcp.callToolFailed",{error:`HTTP ${c.status}`});try{const t=JSON.parse(e);t.message&&(o=t.message)}catch(t){}return{success:!1,error:o}}const i=await c.json();return log("[portal-api-client] callMcpTool: success"),{success:!0,data:i.data}}catch(e){return log(`[portal-api-client] callMcpTool FATAL: ${e.message}`),{success:!1,error:t("mcp.portalCommunicationError",{error:e.message})}}}async function scanMcpCode(e,o){try{if(log("[portal-api-client] scanMcpCode called"),!o)return{success:!1,error:t("mcp.noAuthToken")};const s=`${PORTAL_URL}/mcp/scan`,r=await fetch(s,{method:"POST",headers:{"X-CLI-Token":o,"Content-Type":"application/json","User-Agent":"BizBoost-VSCode-MCP/1.0"},agent:s.startsWith("https")?httpsAgent:void 0,body:JSON.stringify({code:e})});if(!r.ok){const t=await r.text();return log(`[portal-api-client] scanMcpCode error: ${r.status} ${t}`),{success:!1,error:`HTTP ${r.status}`}}return{success:!0,data:(await r.json()).data}}catch(e){return log(`[portal-api-client] scanMcpCode FATAL: ${e.message}`),{success:!1,error:t("mcp.portalCommunicationError",{error:e.message})}}}async function deployUserMcp(e,o){try{if(log(`[portal-api-client] deployUserMcp called: name=${e.name}`),!o)return{success:!1,error:t("mcp.noAuthToken")};const s=`${PORTAL_URL}/mcp/deploy`,r=await fetch(s,{method:"POST",headers:{"X-CLI-Token":o,"Content-Type":"application/json","User-Agent":"BizBoost-VSCode-MCP/1.0"},agent:s.startsWith("https")?httpsAgent:void 0,body:JSON.stringify(e)});if(!r.ok){const t=await r.text();log(`[portal-api-client] deployUserMcp error: ${r.status} ${t}`);let e=`HTTP ${r.status}`;try{const o=JSON.parse(t);if(o.error&&(e=o.error),o.details)return{success:!1,error:e,details:o.details}}catch(t){}return{success:!1,error:e}}return{success:!0,data:(await r.json()).data}}catch(e){return log(`[portal-api-client] deployUserMcp FATAL: ${e.message}`),{success:!1,error:t("mcp.portalCommunicationError",{error:e.message})}}}async function listUserCreatedMcps(e){try{if(log("[portal-api-client] listUserCreatedMcps called"),!e)return{success:!1,error:t("mcp.noAuthToken")};const o=`${PORTAL_URL}/mcp/user/me/created`,s=await fetch(o,{method:"GET",headers:{"X-CLI-Token":e,"Content-Type":"application/json","User-Agent":"BizBoost-VSCode-MCP/1.0"},agent:o.startsWith("https")?httpsAgent:void 0});return s.ok?{success:!0,data:(await s.json()).data}:(await s.text(),log(`[portal-api-client] listUserCreatedMcps error: ${s.status}`),{success:!1,error:`HTTP ${s.status}`})}catch(e){return log(`[portal-api-client] listUserCreatedMcps FATAL: ${e.message}`),{success:!1,error:t("mcp.portalCommunicationError",{error:e.message})}}}async function deleteUserMcp(e,o){try{if(log(`[portal-api-client] deleteUserMcp called: mcpId=${e}`),!o)return{success:!1,error:t("mcp.noAuthToken")};const s=`${PORTAL_URL}/mcp/${encodeURIComponent(e)}`,r=await fetch(s,{method:"DELETE",headers:{"X-CLI-Token":o,"Content-Type":"application/json","User-Agent":"BizBoost-VSCode-MCP/1.0"},agent:s.startsWith("https")?httpsAgent:void 0});if(!r.ok){const t=await r.text();log(`[portal-api-client] deleteUserMcp error: ${r.status}`);let e=`HTTP ${r.status}`;try{const o=JSON.parse(t);o.error&&(e=o.error)}catch(t){}return{success:!1,error:e}}return{success:!0,data:(await r.json()).data}}catch(e){return log(`[portal-api-client] deleteUserMcp FATAL: ${e.message}`),{success:!1,error:t("mcp.portalCommunicationError",{error:e.message})}}}async function listMyPrompts(e){try{if(log("[portal-api-client] listMyPrompts called"),!e)return{success:!1,error:t("mcp.noAuthToken")};const o=`${PORTAL_URL}/cli/my-agents`,s=await fetch(o,{method:"GET",headers:{"X-CLI-Token":e,"Content-Type":"application/json","User-Agent":"BizBoost-VSCode-MCP/1.0"},agent:o.startsWith("https")?httpsAgent:void 0});return s.ok?{success:!0,data:(await s.json()).data||[]}:(await s.text(),log(`[portal-api-client] listMyPrompts error: ${s.status}`),{success:!1,error:`HTTP ${s.status}`})}catch(e){return log(`[portal-api-client] listMyPrompts FATAL: ${e.message}`),{success:!1,error:t("mcp.portalCommunicationError",{error:e.message})}}}async function saveMyPrompt(e,o){try{if(log(`[portal-api-client] saveMyPrompt called: title=${e.title}`),!o)return{success:!1,error:t("mcp.noAuthToken")};const s=`${PORTAL_URL}/cli/my-agents`,r=await fetch(s,{method:"POST",headers:{"X-CLI-Token":o,"Content-Type":"application/json","User-Agent":"BizBoost-VSCode-MCP/1.0"},agent:s.startsWith("https")?httpsAgent:void 0,body:JSON.stringify(e)});if(!r.ok){const t=await r.text();log(`[portal-api-client] saveMyPrompt error: ${r.status} ${t}`);let e=`HTTP ${r.status}`;try{const o=JSON.parse(t);o.message&&(e=o.message)}catch(t){}return{success:!1,error:e}}return{success:!0,data:(await r.json()).data}}catch(e){return log(`[portal-api-client] saveMyPrompt FATAL: ${e.message}`),{success:!1,error:t("mcp.portalCommunicationError",{error:e.message})}}}async function deleteMyPrompt(e,o){try{if(log(`[portal-api-client] deleteMyPrompt called: id=${e}`),!o)return{success:!1,error:t("mcp.noAuthToken")};const s=`${PORTAL_URL}/cli/my-agents/${encodeURIComponent(e)}`,r=await fetch(s,{method:"DELETE",headers:{"X-CLI-Token":o,"Content-Type":"application/json","User-Agent":"BizBoost-VSCode-MCP/1.0"},agent:s.startsWith("https")?httpsAgent:void 0});if(!r.ok){const t=await r.text();log(`[portal-api-client] deleteMyPrompt error: ${r.status}`);let e=`HTTP ${r.status}`;try{const o=JSON.parse(t);o.message&&(e=o.message)}catch(t){}return{success:!1,error:e}}return{success:!0,data:(await r.json()).data}}catch(e){return log(`[portal-api-client] deleteMyPrompt FATAL: ${e.message}`),{success:!1,error:t("mcp.portalCommunicationError",{error:e.message})}}}async function downloadMcpPackage(e,o){try{if(log(`[portal-api-client] downloadMcpPackage called: mcpId=${e}`),!o)return{success:!1,error:t("mcp.noAuthToken")};const s=`${PORTAL_URL}/mcp/${encodeURIComponent(e)}/download`;log(`[portal-api-client] Downloading MCP package: ${s}`);const r=await fetch(s,{method:"GET",headers:{"X-CLI-Token":o,"Content-Type":"application/json","User-Agent":"BizBoost-VSCode-MCP/1.0"},agent:s.startsWith("https")?httpsAgent:void 0});if(!r.ok){const t=await r.text();log(`[portal-api-client] downloadMcpPackage error: ${r.status} ${t}`);let e=`Download failed: HTTP ${r.status}`;try{const o=JSON.parse(t);o.message&&(e=o.message)}catch(t){}return{success:!1,error:e}}const a=await r.json();return log(`[portal-api-client] downloadMcpPackage: ${a.data?.files?.length||0} files`),{success:!0,data:a.data}}catch(e){return log(`[portal-api-client] downloadMcpPackage FATAL: ${e.message}`),{success:!1,error:t("mcp.portalCommunicationError",{error:e.message})}}}async function getGatewayConfig(t){try{if(!t)return{success:!1,error:"No token"};const e=`${PORTAL_URL}/mcp/user/me/gateway-config`;log(`[portal-api-client] getGatewayConfig: ${e}`);const o=await fetch(e,{method:"GET",headers:{"X-CLI-Token":t,"Content-Type":"application/json"},agent:e.startsWith("https")?httpsAgent:void 0});if(!o.ok)return{success:!1,error:`HTTP ${o.status}`};const s=await o.json();return log(`[portal-api-client] getGatewayConfig: ${s.data?.services?.length||0} services`),{success:!0,data:s.data}}catch(t){return log(`[portal-api-client] getGatewayConfig error: ${t.message}`),{success:!1,error:t.message}}}async function searchMcpServices(t,e){try{if(!e)return{success:!1,error:"No token"};const o=`${PORTAL_URL}/mcp/search?q=${encodeURIComponent(t)}`;log(`[portal-api-client] searchMcpServices: ${o}`);const s=await fetch(o,{method:"GET",headers:{"X-CLI-Token":e,"Content-Type":"application/json"},agent:o.startsWith("https")?httpsAgent:void 0});return s.ok?{success:!0,data:(await s.json()).data}:{success:!1,error:`HTTP ${s.status}`}}catch(t){return log(`[portal-api-client] searchMcpServices error: ${t.message}`),{success:!1,error:t.message}}}async function installMcpService(t,e,o,s){try{if(!o)return{success:!1,error:"No token"};const r=`${PORTAL_URL}/mcp/user/me/install`,a={mcpId:t,alwaysOn:e??!1};s&&Object.keys(s).length>0&&(a.envOverrides=s);const n=await fetch(r,{method:"POST",headers:{"X-CLI-Token":o,"Content-Type":"application/json"},agent:r.startsWith("https")?httpsAgent:void 0,body:JSON.stringify(a)});return n.ok?{success:!0,data:(await n.json()).data}:{success:!1,error:`HTTP ${n.status}`}}catch(t){return log(`[portal-api-client] installMcpService error: ${t.message}`),{success:!1,error:t.message}}}async function setServiceDeactivated(t,e,o){try{if(!o)return{success:!1,error:"No token"};const s=e?"deactivate":"activate",r=`${PORTAL_URL}/mcp/user/me/services/${encodeURIComponent(t)}/${s}`,a=await fetch(r,{method:"POST",headers:{"X-CLI-Token":o,"Content-Type":"application/json"},agent:r.startsWith("https")?httpsAgent:void 0});return a.ok?{success:!0,data:(await a.json()).data}:{success:!1,error:`HTTP ${a.status}`}}catch(t){return log(`[portal-api-client] setServiceDeactivated error: ${t.message}`),{success:!1,error:t.message}}}async function uninstallMcpService(t,e){try{if(!e)return{success:!1,error:"No token"};const o=`${PORTAL_URL}/mcp/user/me/services/${encodeURIComponent(t)}`,s=await fetch(o,{method:"DELETE",headers:{"X-CLI-Token":e,"Content-Type":"application/json"},agent:o.startsWith("https")?httpsAgent:void 0});return s.ok?{success:!0,data:(await s.json()).data}:{success:!1,error:`HTTP ${s.status}`}}catch(t){return log(`[portal-api-client] uninstallMcpService error: ${t.message}`),{success:!1,error:t.message}}}async function updateMcpEnv(t,e,o){try{if(!o)return{success:!1,error:"No token"};const s=`${PORTAL_URL}/mcp/user/me/services/${encodeURIComponent(t)}/env`,r=await fetch(s,{method:"PUT",headers:{"X-CLI-Token":o,"Content-Type":"application/json"},agent:s.startsWith("https")?httpsAgent:void 0,body:JSON.stringify({env:e})});if(!r.ok)return{success:!1,error:`HTTP ${r.status}`};const a=await r.json();return{success:!0,data:a.data,warning:a.warning||null}}catch(t){return log(`[portal-api-client] updateMcpEnv error: ${t.message}`),{success:!1,error:t.message}}}async function callMcpToolProxy(t,e,o,s){try{if(!s)return{success:!1,error:"No token"};const r=`${PORTAL_URL}/mcp/${encodeURIComponent(t)}/call`,a=await fetch(r,{method:"POST",headers:{"X-CLI-Token":s,"Content-Type":"application/json"},agent:r.startsWith("https")?httpsAgent:void 0,body:JSON.stringify({tool_name:e,arguments:o})});if(!a.ok){const t=await a.text();return{success:!1,error:`HTTP ${a.status}: ${t.slice(0,200)}`}}return await a.json()}catch(t){return log(`[portal-api-client] callMcpToolProxy error: ${t.message}`),{success:!1,error:t.message}}}fs.existsSync(LOG_DIR)||fs.mkdirSync(LOG_DIR,{recursive:!0}),module.exports={getPromptFromPortal:getPromptFromPortal,getSlotConfig:getSlotConfig,reportViolation:reportViolation,listAvailableMcps:listAvailableMcps,getMcpInfo:getMcpInfo,downloadMcpPackage:downloadMcpPackage,callMcpTool:callMcpTool,scanMcpCode:scanMcpCode,deployUserMcp:deployUserMcp,listUserCreatedMcps:listUserCreatedMcps,deleteUserMcp:deleteUserMcp,listMyPrompts:listMyPrompts,saveMyPrompt:saveMyPrompt,deleteMyPrompt:deleteMyPrompt,getGatewayConfig:getGatewayConfig,searchMcpServices:searchMcpServices,installMcpService:installMcpService,setServiceDeactivated:setServiceDeactivated,uninstallMcpService:uninstallMcpService,updateMcpEnv:updateMcpEnv,callMcpToolProxy:callMcpToolProxy};
@@ -0,0 +1,86 @@
1
+ /**
2
+ * `bluelamp-secret exec` — 金庫の値を**子プロセスの環境変数にだけ**入れてコマンドを走らせる(箱 n=2018 設計④)。
3
+ *
4
+ * 🕳 塞いでいる穴: MCP の `get_secret` は値を返り値にしていたため、値が会話の転写に残った。
5
+ * その口を閉じると、値を Bash で使っていた手順(21 日で 235 回)が壊れる。⇒ 値を「見せずに使う」口をここに置く。
6
+ *
7
+ * 🔑 値の通り道は「金庫の HTTP 応答 → 子の env」の 1 本だけ。
8
+ * ⛔ argv・標準出力・標準エラー・ログ・ファイル・エラーの文言に値を出さない。
9
+ * ⛔ HTTP の本文・fetch の例外をそのまま出さない(本文は値を、例外は要求を引用しうる)。
10
+ * 失敗は「どの ENV 名・どの金庫の名前が・なぜ」だけを返す。
11
+ * 🔑 使用の記録: `GET /vault/:service` は backend 側で監査 `get`(誰が・どの秘密を)を 1 行書く。
12
+ *
13
+ * 判定と組み立ては純粋関数(unit で直接撃つ)、網と子プロセスは `runSecretExec` の deps に寄せる。
14
+ */
15
+ /** ENV 名として受ける形。⛔ これ以外(小文字・記号・先頭数字)は受けない */
16
+ export declare const ENV_NAME_PATTERN: RegExp;
17
+ /** 既定のポータル API(lib/mcp-server/portal-api-client.cjs・TokenManager と同じ値) */
18
+ export declare const DEFAULT_PORTAL_API_BASE_URL = "https://api.motohi.jp/api/bluelamp";
19
+ export declare const USAGE: string;
20
+ export interface SecretBinding {
21
+ env: string;
22
+ name: string;
23
+ }
24
+ export type ParseResult = {
25
+ ok: true;
26
+ bindings: SecretBinding[];
27
+ command: string;
28
+ args: string[];
29
+ } | {
30
+ ok: false;
31
+ help: boolean;
32
+ error: string;
33
+ };
34
+ /** 引数を解析する(`process.argv.slice(2)` を受ける)。値はここに来ない=金庫の名前だけ */
35
+ export declare function parseExecArgs(argv: readonly string[]): ParseResult;
36
+ /** 基底 URL(BLUELAMP_PORTAL_API_BASE_URL > PORTAL_URL > 既定。portal-api-client.cjs と同じ順) */
37
+ export declare function resolvePortalApiBaseUrl(env: Readonly<Record<string, string | undefined>>): string;
38
+ /**
39
+ * 金庫の 1 件を引く URL。
40
+ * 🔑 vault の sub-app は内部で `/api/vault/...` に経路を切るが、bluelamp module ごと `/api/bluelamp` に
41
+ * 載っているので外から見える経路は `<base>/vault/...`(base は /api/bluelamp まで含む)。
42
+ * 🔬 実測(無認証): `/api/bluelamp/api/vault/x` → 404/`/api/bluelamp/vault/x` → 401。
43
+ * mcp-list/bluelamp/playwright/src/fillSecret.ts の VAULT_FILL_PATH と同じ結論。
44
+ */
45
+ export declare function buildVaultUrl(baseUrl: string, name: string): string;
46
+ /** 子の env を合成する(親を書き換えない) */
47
+ export declare function composeChildEnv(parentEnv: Readonly<Record<string, string | undefined>>, values: Readonly<Record<string, string>>): Record<string, string>;
48
+ /** 金庫の応答本文から値を取り出す。形が違えば null(⛔ 本文を呼び手へ返さない) */
49
+ export declare function extractSecretValue(body: unknown): string | null;
50
+ /** HTTP の状態を理由の文言にする(⛔ 本文は使わない) */
51
+ export declare function describeVaultStatus(status: number): string;
52
+ /** 子の終わり方を終了コードにする(シグナルは 128+番号=シェルと同じ) */
53
+ export declare function exitCodeOf(code: number | null, signal: string | null, signalNumbers: Readonly<Record<string, number>>): number;
54
+ interface FetchResponseLike {
55
+ ok: boolean;
56
+ status: number;
57
+ json(): Promise<unknown>;
58
+ }
59
+ interface ChildLike {
60
+ on(event: 'exit', cb: (code: number | null, signal: string | null) => void): unknown;
61
+ on(event: 'error', cb: (err: {
62
+ code?: string;
63
+ }) => void): unknown;
64
+ kill(signal?: string): unknown;
65
+ }
66
+ export interface SecretExecDeps {
67
+ env: Readonly<Record<string, string | undefined>>;
68
+ loadToken: () => string | null;
69
+ fetch: (url: string, init: {
70
+ method: string;
71
+ headers: Record<string, string>;
72
+ }) => Promise<FetchResponseLike>;
73
+ spawn: (command: string, args: string[], options: {
74
+ stdio: 'inherit';
75
+ shell: false;
76
+ env: Record<string, string>;
77
+ }) => ChildLike;
78
+ stderr: (text: string) => void;
79
+ signalNumbers: Readonly<Record<string, number>>;
80
+ /** 親が受けたシグナルを子へ回す口(無ければ回さない)。戻り値は解除関数 */
81
+ onParentSignal?: (forward: (signal: string) => void) => () => void;
82
+ }
83
+ /** 実行する。戻り値は終了コード */
84
+ export declare function runSecretExec(argv: readonly string[], deps: SecretExecDeps): Promise<number>;
85
+ export {};
86
+ //# sourceMappingURL=secretExec.d.ts.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"secretExec.d.ts","sourceRoot":"","sources":["../../src/lib/secretExec.ts"],"names":[],"mappings":"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"}
@@ -0,0 +1 @@
1
+ "use strict";function parseExecArgs(e){if(0===e.length||"-h"===e[0]||"--help"===e[0]||"help"===e[0])return{ok:!1,help:!0,error:""};if("exec"!==e[0])return{ok:!1,help:!1,error:"不明な操作です(受けるのは exec だけ)"};const r=e.indexOf("--");if(-1===r)return{ok:!1,help:!1,error:"`--` の後に実行するコマンドを書いてください"};const t=e.slice(1,r),o=e[r+1];if(void 0===o||""===o)return{ok:!1,help:!1,error:"`--` の後に実行するコマンドがありません"};if(0===t.length)return{ok:!1,help:!1,error:"<ENV名>=<金庫の名前> を 1 つ以上書いてください"};const n=[],s=new Set;for(const e of t){const r=e.indexOf("=");if(r<=0)return{ok:!1,help:!1,error:`<ENV名>=<金庫の名前> の形ではない引数があります(${n.length+1} 番目)`};const t=e.slice(0,r),o=e.slice(r+1);if(!exports.ENV_NAME_PATTERN.test(t))return{ok:!1,help:!1,error:`ENV 名は ^[A-Z_][A-Z0-9_]*$ の形だけ受けます(${n.length+1} 番目)`};if(""===o)return{ok:!1,help:!1,error:`${t}: 金庫の名前が空です`};if("."===o||".."===o)return{ok:!1,help:!1,error:`${t}: 金庫の名前に . / .. は使えません`};if(s.has(t))return{ok:!1,help:!1,error:`${t}: 同じ ENV 名が 2 回あります`};s.add(t),n.push({env:t,name:o})}return{ok:!0,bindings:n,command:o,args:e.slice(r+2)}}function resolvePortalApiBaseUrl(e){return(e.BLUELAMP_PORTAL_API_BASE_URL||e.PORTAL_URL||exports.DEFAULT_PORTAL_API_BASE_URL).replace(/\/+$/,"")}function buildVaultUrl(e,r){return`${e}/vault/${encodeURIComponent(r)}`}function composeChildEnv(e,r){const t={};for(const[r,o]of Object.entries(e))"string"==typeof o&&(t[r]=o);for(const[e,o]of Object.entries(r))t[e]=o;return t}function extractSecretValue(e){if(!e||"object"!=typeof e)return null;const r=e;return!0===r.success&&r.data&&"object"==typeof r.data&&"string"==typeof r.data.secret?r.data.secret:null}function describeVaultStatus(e){return 401===e?"未ログインかトークンが無効です(bluelamp1 などでログインし直してください)":403===e?"この秘密へのアクセス権がありません":404===e?"金庫に見つかりません":`金庫が HTTP ${e} を返しました`}function exitCodeOf(e,r,t){return"number"==typeof e?e:r&&"number"==typeof t[r]?128+t[r]:1}Object.defineProperty(exports,"__esModule",{value:!0}),exports.USAGE=exports.DEFAULT_PORTAL_API_BASE_URL=exports.ENV_NAME_PATTERN=void 0,exports.parseExecArgs=parseExecArgs,exports.resolvePortalApiBaseUrl=resolvePortalApiBaseUrl,exports.buildVaultUrl=buildVaultUrl,exports.composeChildEnv=composeChildEnv,exports.extractSecretValue=extractSecretValue,exports.describeVaultStatus=describeVaultStatus,exports.exitCodeOf=exitCodeOf,exports.runSecretExec=runSecretExec,exports.ENV_NAME_PATTERN=/^[A-Z_][A-Z0-9_]*$/,exports.DEFAULT_PORTAL_API_BASE_URL="https://api.motohi.jp/api/bluelamp",exports.USAGE='使い方: bluelamp-secret exec <ENV名>=<金庫の名前> [<ENV名>=<金庫の名前> …] -- <コマンド> [引数…]\n 金庫の値を子プロセスの環境変数にだけ入れて <コマンド> を実行し、その終了コードで終わります。\n 値は画面・引数・ログに出ません。シェルの展開が要るときは -- sh -c \'psql "$PGURL" -c "select 1"\' のように渡します。\n';const PREFIX="bluelamp-secret: ";async function runSecretExec(e,r){const t=parseExecArgs(e);if(!t.ok)return t.help?(r.stderr(exports.USAGE),0===e.length?2:0):(r.stderr(`${PREFIX}${t.error}\n${exports.USAGE}`),2);const o=r.loadToken();if(!o)return r.stderr(`${PREFIX}未ログインです(bluelamp1 などでログインしてから撃ってください)\n`),1;const n=resolvePortalApiBaseUrl(r.env),s={};for(const{env:e,name:c}of t.bindings){let t,l;try{t=await r.fetch(buildVaultUrl(n,c),{method:"GET",headers:{"X-CLI-Token":o,Accept:"application/json","User-Agent":"bluelamp-secret/1"}})}catch{return r.stderr(`${PREFIX}${e}=${c}: ポータルに届きませんでした\n`),1}if(!t.ok)return r.stderr(`${PREFIX}${e}=${c}: ${describeVaultStatus(t.status)}\n`),1;try{l=await t.json()}catch{return r.stderr(`${PREFIX}${e}=${c}: 金庫の応答を読めませんでした\n`),1}const a=extractSecretValue(l);if(null===a)return r.stderr(`${PREFIX}${e}=${c}: 金庫の応答に値がありませんでした\n`),1;s[e]=a}const c=composeChildEnv(r.env,s);return new Promise(e=>{let o=!1,n=()=>{};const s=r=>{o||(o=!0,n(),e(r))};let l;try{l=r.spawn(t.command,t.args,{stdio:"inherit",shell:!1,env:c})}catch(e){const o=e?.code;return r.stderr(`${PREFIX}コマンドを起動できませんでした: ${t.command}${o?`(${o})`:""}\n`),void s(127)}r.onParentSignal&&(n=r.onParentSignal(e=>{try{l.kill(e)}catch{}})),l.on("error",e=>{r.stderr(`${PREFIX}コマンドを起動できませんでした: ${t.command}${e?.code?`(${e.code})`:""}\n`),s(127)}),l.on("exit",(e,t)=>s(exitCodeOf(e,t,r.signalNumbers)))})}
@@ -0,0 +1 @@
1
+ {"version":3,"file":"secretExec.js","sourceRoot":"","sources":["../../src/lib/secretExec.ts"],"names":[],"mappings":"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"}
@@ -4,17 +4,21 @@
4
4
  * 【直した欠陥・板 n=1715】
5
5
  * `getSlotConfig` は **5 通りの意味を全部 `null` で返していた**——
6
6
  * ① token 無し ② 404(スロット未設定)③ 403(階級/プラン不足)④ 通信/500 ⑤ 正当に custom 設定が無い。
7
- * ⇒ 呼び出し側は「既定表で救ってよい場合(⑤)」と「止めるべき場合(②③④)」を区別できず、
8
- * 既定表(`bluelamp1`〜`bluelamp18` の **18 個だけ**)に無い番号(19 番以降・101 番〜)は
9
- * `undefined` を掴んだまま `/cli/prompts/knowledge-injection/undefined` を取りに行っていた。
10
- * 会員のターミナルには原因の分からない fetch エラーだけが出て、自力で辿れない。
11
- * 🚨 `!response.ok` の時点で **status は分かっているのに `log()` に書いて捨てていた**
12
- * (しかも `log()` は会員の画面ではなくログファイルに出るので、会員には何も伝わらない)。
7
+ * ⇒ 理由を判別できる形にし、取れなかったときは `undefined` を返さず理由を 1 行で述べて止める。
8
+ *
9
+ * 【直した欠陥・板 n=1900】
10
+ * ① 取れなかったときの 1 行が、会員に管理者の作業(「ポータルの『エージェント配置』で割り当てて」)を
11
+ * 振っていた。会員にその画面は無く、ポータル・スロット・配置は会員の言葉ではない。
12
+ * ② 1〜18 番は取れないと開発製品用の既定表(1 番=@要件定義)へ**黙って**落ちていた。落ちた先は
13
+ * その所属先に用意の無い席で、初伝の会員に奥伝の席が立った(通しテスト 2026-09-20)。本番 30 日で
14
+ * 1〜18 番の取得は 200 が 14,626 件・404 が 60 件(0.4%)=救いとして使われていない。
15
+ * ⇒ 既定表を撤去し、**番号に関係なく**止めて案内する。
13
16
  *
14
17
  * 【この関数の規律】
15
- * - 既定表に在る番号(1〜18)は **取得が失敗しても従来どおり既定表で救う**(救済を壊さない)。
16
- * - 既定表に無い番号で取得が失敗したら **`undefined` を返さず、理由を 1 行で述べて止める**。
17
- * - 理由は ②③④ を **混ぜない**(「更新してください」の一律案内にしない)。対処が正反対だから。
18
+ * - 取れなかったら **`undefined` を返さず、理由を 1 行で述べて止める**(⛔ 別の席へ黙って落ちない)。
19
+ * - 理由は ②③④ を **混ぜない**(対処が正反対だから)。
20
+ * - 1 行は**会員が読む文**。⛔ 管理者の作業を振らない・中の言葉(ポータル・スロット・配置・CLI・
21
+ * トークン・MCP・コマンド 等)を出さない。次に何をすればよいか(待つ・誰に言うか)を必ず 1 つ入れる。
18
22
  */
19
23
  /** `getSlotConfig` の戻り(5 通りの `null` を判別できる形にしたもの) */
20
24
  export type SlotConfigOutcome = {
@@ -32,38 +36,31 @@ export interface ResolveSlotKeywordInput {
32
36
  slotNumber: number;
33
37
  /** `getSlotConfig` の戻り。互換: 旧実装の `string | null` も受ける(設置コピーが部分更新でも壊さない) */
34
38
  outcome: SlotConfigOutcome | string | null | undefined;
35
- /** 既定表 `DEFAULT_PROMPT_MAPPING['bluelamp<N>']` の引き当て結果(呼び出し側が引いて渡す) */
36
- defaultKeyword?: string | null;
39
+ /** 会員が打った名前(`bluelamp55` 等・白ラベルなら `bizboost55`)。無ければ `bluelamp<N>` */
40
+ commandName?: string | null;
37
41
  }
38
42
  export type ResolveSlotKeywordResult = {
39
43
  ok: true;
40
44
  keyword: string;
41
- source: 'custom' | 'default';
45
+ source: 'custom';
42
46
  } | {
43
47
  ok: false;
44
48
  message: string;
45
49
  };
46
50
  /**
47
- * 失敗の理由だけを短く言う(既定表で救えた 1〜18 番の ⚠️ 行に使う)。
48
- * ⛔ ここに対処を書かない(救えている=会員が何かをする必要は無い。事実だけ残す)。
49
- */
50
- export declare function describeSlotConfigFailure(outcome: SlotConfigOutcome | string | null | undefined): string;
51
- /**
52
- * 失敗の理由を 1 行にする。⛔ ②③④ を 1 つにまとめない(対処が別物)。
53
- * 行末に「何をすれば直るか」を必ず 1 つだけ入れる。
51
+ * 失敗の理由を 1 行にする(会員が読む文)。⛔ ②③④ を 1 つにまとめない(対処が別物)。
52
+ * 行末に「次に何をすればよいか」を必ず 1 つだけ入れる。
54
53
  */
55
- export declare function buildSlotConfigFailureLine(slotNumber: number, outcome: SlotConfigOutcome | string | null | undefined): string;
54
+ export declare function buildSlotConfigFailureLine(slotNumber: number, outcome: SlotConfigOutcome | string | null | undefined, commandName?: string | null): string;
56
55
  /**
57
56
  * 起動キーワードを決める。
58
- * 1. custom 設定が取れていれば それ
59
- * 2. 既定表に在れば それ(🔬 1〜18 番の救済=取得が失敗していても従来どおり)
60
- * 3. どちらも無ければ **失敗**(⛔ `undefined` を返さない)
57
+ * 1. 呼び出す相手(custom 設定)が取れていれば それ
58
+ * 2. 取れなければ **失敗**(⛔ `undefined` を返さない・⛔ 別の席へ黙って落ちない)
61
59
  */
62
60
  export declare function resolveSlotKeyword(input: ResolveSlotKeywordInput): ResolveSlotKeywordResult;
63
61
  declare const _default: {
64
62
  resolveSlotKeyword: typeof resolveSlotKeyword;
65
63
  buildSlotConfigFailureLine: typeof buildSlotConfigFailureLine;
66
- describeSlotConfigFailure: typeof describeSlotConfigFailure;
67
64
  };
68
65
  export default _default;
69
66
  //# sourceMappingURL=slotKeywordResolve.d.ts.map
@@ -1 +1 @@
1
- {"version":3,"file":"slotKeywordResolve.d.ts","sourceRoot":"","sources":["../../src/lib/slotKeywordResolve.ts"],"names":[],"mappings":"AAAA;;;;;;;;;;;;;;;;;GAiBG;AAEH,qDAAqD;AACrD,MAAM,MAAM,iBAAiB,GACzB;IAAE,EAAE,EAAE,IAAI,CAAC;IAAC,OAAO,EAAE,MAAM,GAAG,IAAI,CAAA;CAAE,GACpC;IACE,EAAE,EAAE,KAAK,CAAC;IACV,sFAAsF;IACtF,MAAM,EAAE,UAAU,GAAG,gBAAgB,GAAG,MAAM,GAAG,MAAM,GAAG,SAAS,CAAC;IACpE,MAAM,CAAC,EAAE,MAAM,GAAG,IAAI,CAAC;IACvB,OAAO,CAAC,EAAE,MAAM,GAAG,IAAI,CAAC;CACzB,CAAC;AAEN,MAAM,WAAW,uBAAuB;IACtC,2BAA2B;IAC3B,UAAU,EAAE,MAAM,CAAC;IACnB,0EAA0E;IAC1E,OAAO,EAAE,iBAAiB,GAAG,MAAM,GAAG,IAAI,GAAG,SAAS,CAAC;IACvD,uEAAuE;IACvE,cAAc,CAAC,EAAE,MAAM,GAAG,IAAI,CAAC;CAChC;AAED,MAAM,MAAM,wBAAwB,GAChC;IAAE,EAAE,EAAE,IAAI,CAAC;IAAC,OAAO,EAAE,MAAM,CAAC;IAAC,MAAM,EAAE,QAAQ,GAAG,SAAS,CAAA;CAAE,GAC3D;IAAE,EAAE,EAAE,KAAK,CAAC;IAAC,OAAO,EAAE,MAAM,CAAA;CAAE,CAAC;AAiBnC;;;GAGG;AACH,wBAAgB,yBAAyB,CAAC,OAAO,EAAE,iBAAiB,GAAG,MAAM,GAAG,IAAI,GAAG,SAAS,GAAG,MAAM,CAgBxG;AAED;;;GAGG;AACH,wBAAgB,0BAA0B,CACxC,UAAU,EAAE,MAAM,EAClB,OAAO,EAAE,iBAAiB,GAAG,MAAM,GAAG,IAAI,GAAG,SAAS,GACrD,MAAM,CA6BR;AAED;;;;;GAKG;AACH,wBAAgB,kBAAkB,CAAC,KAAK,EAAE,uBAAuB,GAAG,wBAAwB,CAW3F;;;;;;AAED,wBAA6F"}
1
+ {"version":3,"file":"slotKeywordResolve.d.ts","sourceRoot":"","sources":["../../src/lib/slotKeywordResolve.ts"],"names":[],"mappings":"AAAA;;;;;;;;;;;;;;;;;;;;;GAqBG;AAEH,qDAAqD;AACrD,MAAM,MAAM,iBAAiB,GACzB;IAAE,EAAE,EAAE,IAAI,CAAC;IAAC,OAAO,EAAE,MAAM,GAAG,IAAI,CAAA;CAAE,GACpC;IACE,EAAE,EAAE,KAAK,CAAC;IACV,sFAAsF;IACtF,MAAM,EAAE,UAAU,GAAG,gBAAgB,GAAG,MAAM,GAAG,MAAM,GAAG,SAAS,CAAC;IACpE,MAAM,CAAC,EAAE,MAAM,GAAG,IAAI,CAAC;IACvB,OAAO,CAAC,EAAE,MAAM,GAAG,IAAI,CAAC;CACzB,CAAC;AAEN,MAAM,WAAW,uBAAuB;IACtC,2BAA2B;IAC3B,UAAU,EAAE,MAAM,CAAC;IACnB,0EAA0E;IAC1E,OAAO,EAAE,iBAAiB,GAAG,MAAM,GAAG,IAAI,GAAG,SAAS,CAAC;IACvD,sEAAsE;IACtE,WAAW,CAAC,EAAE,MAAM,GAAG,IAAI,CAAC;CAC7B;AAED,MAAM,MAAM,wBAAwB,GAChC;IAAE,EAAE,EAAE,IAAI,CAAC;IAAC,OAAO,EAAE,MAAM,CAAC;IAAC,MAAM,EAAE,QAAQ,CAAA;CAAE,GAC/C;IAAE,EAAE,EAAE,KAAK,CAAC;IAAC,OAAO,EAAE,MAAM,CAAA;CAAE,CAAC;AAiBnC;;;GAGG;AACH,wBAAgB,0BAA0B,CACxC,UAAU,EAAE,MAAM,EAClB,OAAO,EAAE,iBAAiB,GAAG,MAAM,GAAG,IAAI,GAAG,SAAS,EACtD,WAAW,CAAC,EAAE,MAAM,GAAG,IAAI,GAC1B,MAAM,CAsBR;AAED;;;;GAIG;AACH,wBAAgB,kBAAkB,CAAC,KAAK,EAAE,uBAAuB,GAAG,wBAAwB,CAQ3F;;;;;AAED,wBAAkE"}
@@ -1 +1 @@
1
- "use strict";function normalize(e){return"string"==typeof e?{ok:!0,keyword:e}:e&&"object"==typeof e&&"boolean"==typeof e.ok?e:{ok:!1,reason:"http",status:null,message:null}}function withDetail(e,o){const t=(o??"").trim();return t?`${e}(${t})`:e}function describeSlotConfigFailure(e){const o=normalize(e);if(o.ok)return"このスロットに配置がありません";switch(o.reason){case"no-token":return"ログイン情報(CLI トークン)がありません";case"not-configured":return"HTTP 404: このスロットに配置がありません";case"rank":return withDetail("HTTP 403: プラン/ランク不足",o.message);case"network":return withDetail("通信エラー",o.message);default:return withDetail(`HTTP ${o.status??"不明"}`,o.message)}}function buildSlotConfigFailureLine(e,o){const t=normalize(o),r=`❌ スロット ${e} の設定を取得できないため起動を中止しました`;if(t.ok)return`${r}: このスロットにエージェントが配置されていません。BlueLamp ポータルの「エージェント配置」で ${e} 番に割り当ててください。`;switch(t.reason){case"no-token":return`${r}: ログイン情報(CLI トークン)がありません。bluelamp-account MCP の logout を実行し、起動し直して再ログインしてください。`;case"not-configured":return`${r}: このスロットにエージェントが配置されていません(HTTP 404)。BlueLamp ポータルの「エージェント配置」で ${e} 番に割り当ててください。`;case"rank":return withDetail(`${r}: 現在のプラン/ランクではこのスロットを利用できません(HTTP 403)。テナント管理者にランクの引き上げを依頼してください`,t.message)+"。";case"network":return withDetail(`${r}: BlueLamp ポータルに接続できませんでした(通信エラー)。ネットワーク/プロキシを確認して再実行してください`,t.message)+"。";default:return withDetail(`${r}: BlueLamp ポータルが応答しませんでした(HTTP ${t.status??"不明"})。時間をおいて再実行し、続く場合はこの 1 行をサポートへ伝えてください`,t.message)+"。"}}function resolveSlotKeyword(e){const{slotNumber:o,defaultKeyword:t}=e,r=normalize(e.outcome);return r.ok&&"string"==typeof r.keyword&&""!==r.keyword.trim()?{ok:!0,keyword:r.keyword,source:"custom"}:"string"==typeof t&&""!==t.trim()?{ok:!0,keyword:t,source:"default"}:{ok:!1,message:buildSlotConfigFailureLine(o,r)}}Object.defineProperty(exports,"__esModule",{value:!0}),exports.describeSlotConfigFailure=describeSlotConfigFailure,exports.buildSlotConfigFailureLine=buildSlotConfigFailureLine,exports.resolveSlotKeyword=resolveSlotKeyword,exports.default={resolveSlotKeyword:resolveSlotKeyword,buildSlotConfigFailureLine:buildSlotConfigFailureLine,describeSlotConfigFailure:describeSlotConfigFailure};
1
+ "use strict";function normalize(e){return"string"==typeof e?{ok:!0,keyword:e}:e&&"object"==typeof e&&"boolean"==typeof e.ok?e:{ok:!1,reason:"http",status:null,message:null}}function withDetail(e,o){const t=(o??"").trim();return t?`${e}(${t})`:e}function buildSlotConfigFailureLine(e,o,t){const r=normalize(o),n=(t??"").trim()||`bluelamp${e}`,l=`❌ ${n} を起動できませんでした`;if(r.ok||"not-configured"===r.reason)return`${l}: いまお使いの所属先では、${n} で呼び出す相手がまだ用意されていません。BlueLamp を案内してくれた運営の方に「${n} が起動できない」とお伝えください。`;switch(r.reason){case"no-token":return`${l}: ログインが切れています。もう一度起動して、ログインし直してください。`;case"rank":return withDetail(`${l}: いまのご契約の段階では、${n} はまだお使いいただけません。使いたい場合は運営の方にご相談ください`,r.message)+"。";case"network":return`${l}: BlueLamp につながりませんでした。インターネットの接続を確かめてから、もう一度お試しください。`;default:return`${l}: BlueLamp が一時的に応答していません(${r.status??"不明"})。少し時間をおいてから、もう一度お試しください。続くときは、この 1 行をそのまま運営の方にお伝えください。`}}function resolveSlotKeyword(e){const{slotNumber:o,commandName:t}=e,r=normalize(e.outcome);return r.ok&&"string"==typeof r.keyword&&""!==r.keyword.trim()?{ok:!0,keyword:r.keyword,source:"custom"}:{ok:!1,message:buildSlotConfigFailureLine(o,r,t)}}Object.defineProperty(exports,"__esModule",{value:!0}),exports.buildSlotConfigFailureLine=buildSlotConfigFailureLine,exports.resolveSlotKeyword=resolveSlotKeyword,exports.default={resolveSlotKeyword:resolveSlotKeyword,buildSlotConfigFailureLine:buildSlotConfigFailureLine};
@@ -1 +1 @@
1
- {"version":3,"file":"slotKeywordResolve.js","sourceRoot":"","sources":["../../src/lib/slotKeywordResolve.ts"],"names":[],"mappings":";AAAA;;;;;;;;;;;;;;;;;GAiBG;;AA6CH,8DAgBC;AAMD,gEAgCC;AAQD,gDAWC;AA5FD,wDAAwD;AACxD,SAAS,SAAS,CAAC,OAAsD;IACvE,IAAI,OAAO,OAAO,KAAK,QAAQ;QAAE,OAAO,EAAE,EAAE,EAAE,IAAI,EAAE,OAAO,EAAE,OAAO,EAAE,CAAC;IACvE,IAAI,CAAC,OAAO,IAAI,OAAO,OAAO,KAAK,QAAQ,IAAI,OAAQ,OAA6B,CAAC,EAAE,KAAK,SAAS,EAAE,CAAC;QACtG,gDAAgD;QAChD,OAAO,EAAE,EAAE,EAAE,KAAK,EAAE,MAAM,EAAE,MAAM,EAAE,MAAM,EAAE,IAAI,EAAE,OAAO,EAAE,IAAI,EAAE,CAAC;IACpE,CAAC;IACD,OAAO,OAA4B,CAAC;AACtC,CAAC;AAED,SAAS,UAAU,CAAC,IAAY,EAAE,MAAsB;IACtD,MAAM,CAAC,GAAG,CAAC,MAAM,IAAI,EAAE,CAAC,CAAC,IAAI,EAAE,CAAC;IAChC,OAAO,CAAC,CAAC,CAAC,CAAC,GAAG,IAAI,IAAI,CAAC,GAAG,CAAC,CAAC,CAAC,IAAI,CAAC;AACpC,CAAC;AAED;;;GAGG;AACH,SAAgB,yBAAyB,CAAC,OAAsD;IAC9F,MAAM,CAAC,GAAG,SAAS,CAAC,OAAO,CAAC,CAAC;IAC7B,IAAI,CAAC,CAAC,EAAE;QAAE,OAAO,iBAAiB,CAAC;IACnC,QAAQ,CAAC,CAAC,MAAM,EAAE,CAAC;QACjB,KAAK,UAAU;YACb,OAAO,wBAAwB,CAAC;QAClC,KAAK,gBAAgB;YACnB,OAAO,2BAA2B,CAAC;QACrC,KAAK,MAAM;YACT,OAAO,UAAU,CAAC,qBAAqB,EAAE,CAAC,CAAC,OAAO,CAAC,CAAC;QACtD,KAAK,SAAS;YACZ,OAAO,UAAU,CAAC,OAAO,EAAE,CAAC,CAAC,OAAO,CAAC,CAAC;QACxC,KAAK,MAAM,CAAC;QACZ;YACE,OAAO,UAAU,CAAC,QAAQ,CAAC,CAAC,MAAM,IAAI,IAAI,EAAE,EAAE,CAAC,CAAC,OAAO,CAAC,CAAC;IAC7D,CAAC;AACH,CAAC;AAED;;;GAGG;AACH,SAAgB,0BAA0B,CACxC,UAAkB,EAClB,OAAsD;IAEtD,MAAM,CAAC,GAAG,SAAS,CAAC,OAAO,CAAC,CAAC;IAC7B,MAAM,IAAI,GAAG,UAAU,UAAU,wBAAwB,CAAC;IAC1D,IAAI,CAAC,CAAC,EAAE,EAAE,CAAC;QACT,qCAAqC;QACrC,OAAO,GAAG,IAAI,uDAAuD,UAAU,eAAe,CAAC;IACjG,CAAC;IACD,QAAQ,CAAC,CAAC,MAAM,EAAE,CAAC;QACjB,KAAK,UAAU;YACb,OAAO,GAAG,IAAI,gFAAgF,CAAC;QACjG,KAAK,gBAAgB;YACnB,OAAO,GAAG,IAAI,iEAAiE,UAAU,eAAe,CAAC;QAC3G,KAAK,MAAM;YACT,OAAO,UAAU,CACf,GAAG,IAAI,kEAAkE,EACzE,CAAC,CAAC,OAAO,CACV,GAAG,GAAG,CAAC;QACV,KAAK,SAAS;YACZ,OAAO,UAAU,CACf,GAAG,IAAI,6DAA6D,EACpE,CAAC,CAAC,OAAO,CACV,GAAG,GAAG,CAAC;QACV,KAAK,MAAM,CAAC;QACZ;YACE,OAAO,UAAU,CACf,GAAG,IAAI,kCAAkC,CAAC,CAAC,MAAM,IAAI,IAAI,uCAAuC,EAChG,CAAC,CAAC,OAAO,CACV,GAAG,GAAG,CAAC;IACZ,CAAC;AACH,CAAC;AAED;;;;;GAKG;AACH,SAAgB,kBAAkB,CAAC,KAA8B;IAC/D,MAAM,EAAE,UAAU,EAAE,cAAc,EAAE,GAAG,KAAK,CAAC;IAC7C,MAAM,OAAO,GAAG,SAAS,CAAC,KAAK,CAAC,OAAO,CAAC,CAAC;IAEzC,IAAI,OAAO,CAAC,EAAE,IAAI,OAAO,OAAO,CAAC,OAAO,KAAK,QAAQ,IAAI,OAAO,CAAC,OAAO,CAAC,IAAI,EAAE,KAAK,EAAE,EAAE,CAAC;QACvF,OAAO,EAAE,EAAE,EAAE,IAAI,EAAE,OAAO,EAAE,OAAO,CAAC,OAAO,EAAE,MAAM,EAAE,QAAQ,EAAE,CAAC;IAClE,CAAC;IACD,IAAI,OAAO,cAAc,KAAK,QAAQ,IAAI,cAAc,CAAC,IAAI,EAAE,KAAK,EAAE,EAAE,CAAC;QACvE,OAAO,EAAE,EAAE,EAAE,IAAI,EAAE,OAAO,EAAE,cAAc,EAAE,MAAM,EAAE,SAAS,EAAE,CAAC;IAClE,CAAC;IACD,OAAO,EAAE,EAAE,EAAE,KAAK,EAAE,OAAO,EAAE,0BAA0B,CAAC,UAAU,EAAE,OAAO,CAAC,EAAE,CAAC;AACjF,CAAC;AAED,kBAAe,EAAE,kBAAkB,EAAE,0BAA0B,EAAE,yBAAyB,EAAE,CAAC"}
1
+ {"version":3,"file":"slotKeywordResolve.js","sourceRoot":"","sources":["../../src/lib/slotKeywordResolve.ts"],"names":[],"mappings":";AAAA;;;;;;;;;;;;;;;;;;;;;GAqBG;;AA6CH,gEA0BC;AAOD,gDAQC;AA5DD,wDAAwD;AACxD,SAAS,SAAS,CAAC,OAAsD;IACvE,IAAI,OAAO,OAAO,KAAK,QAAQ;QAAE,OAAO,EAAE,EAAE,EAAE,IAAI,EAAE,OAAO,EAAE,OAAO,EAAE,CAAC;IACvE,IAAI,CAAC,OAAO,IAAI,OAAO,OAAO,KAAK,QAAQ,IAAI,OAAQ,OAA6B,CAAC,EAAE,KAAK,SAAS,EAAE,CAAC;QACtG,gDAAgD;QAChD,OAAO,EAAE,EAAE,EAAE,KAAK,EAAE,MAAM,EAAE,MAAM,EAAE,MAAM,EAAE,IAAI,EAAE,OAAO,EAAE,IAAI,EAAE,CAAC;IACpE,CAAC;IACD,OAAO,OAA4B,CAAC;AACtC,CAAC;AAED,SAAS,UAAU,CAAC,IAAY,EAAE,MAAsB;IACtD,MAAM,CAAC,GAAG,CAAC,MAAM,IAAI,EAAE,CAAC,CAAC,IAAI,EAAE,CAAC;IAChC,OAAO,CAAC,CAAC,CAAC,CAAC,GAAG,IAAI,IAAI,CAAC,GAAG,CAAC,CAAC,CAAC,IAAI,CAAC;AACpC,CAAC;AAED;;;GAGG;AACH,SAAgB,0BAA0B,CACxC,UAAkB,EAClB,OAAsD,EACtD,WAA2B;IAE3B,MAAM,CAAC,GAAG,SAAS,CAAC,OAAO,CAAC,CAAC;IAC7B,MAAM,IAAI,GAAG,CAAC,WAAW,IAAI,EAAE,CAAC,CAAC,IAAI,EAAE,IAAI,WAAW,UAAU,EAAE,CAAC;IACnE,MAAM,IAAI,GAAG,KAAK,IAAI,cAAc,CAAC;IACrC,IAAI,CAAC,CAAC,EAAE,IAAI,CAAC,CAAC,MAAM,KAAK,gBAAgB,EAAE,CAAC;QAC1C,mDAAmD;QACnD,OAAO,GAAG,IAAI,iBAAiB,IAAI,+CAA+C,IAAI,oBAAoB,CAAC;IAC7G,CAAC;IACD,QAAQ,CAAC,CAAC,MAAM,EAAE,CAAC;QACjB,KAAK,UAAU;YACb,OAAO,GAAG,IAAI,sCAAsC,CAAC;QACvD,KAAK,MAAM;YACT,OAAO,UAAU,CACf,GAAG,IAAI,iBAAiB,IAAI,oCAAoC,EAChE,CAAC,CAAC,OAAO,CACV,GAAG,GAAG,CAAC;QACV,KAAK,SAAS;YACZ,OAAO,GAAG,IAAI,uDAAuD,CAAC;QACxE,KAAK,MAAM,CAAC;QACZ;YACE,OAAO,GAAG,IAAI,4BAA4B,CAAC,CAAC,MAAM,IAAI,IAAI,yDAAyD,CAAC;IACxH,CAAC;AACH,CAAC;AAED;;;;GAIG;AACH,SAAgB,kBAAkB,CAAC,KAA8B;IAC/D,MAAM,EAAE,UAAU,EAAE,WAAW,EAAE,GAAG,KAAK,CAAC;IAC1C,MAAM,OAAO,GAAG,SAAS,CAAC,KAAK,CAAC,OAAO,CAAC,CAAC;IAEzC,IAAI,OAAO,CAAC,EAAE,IAAI,OAAO,OAAO,CAAC,OAAO,KAAK,QAAQ,IAAI,OAAO,CAAC,OAAO,CAAC,IAAI,EAAE,KAAK,EAAE,EAAE,CAAC;QACvF,OAAO,EAAE,EAAE,EAAE,IAAI,EAAE,OAAO,EAAE,OAAO,CAAC,OAAO,EAAE,MAAM,EAAE,QAAQ,EAAE,CAAC;IAClE,CAAC;IACD,OAAO,EAAE,EAAE,EAAE,KAAK,EAAE,OAAO,EAAE,0BAA0B,CAAC,UAAU,EAAE,OAAO,EAAE,WAAW,CAAC,EAAE,CAAC;AAC9F,CAAC;AAED,kBAAe,EAAE,kBAAkB,EAAE,0BAA0B,EAAE,CAAC"}
@@ -0,0 +1,9 @@
1
+ /** 起動子 → gateway へ一時ファイルのパスを渡す env 名。 */
2
+ export declare const SYS_PROMPT_ENV = "BLUELAMP_SYS_PROMPT_FILE";
3
+ /** gateway が起きなかったときに起動子が消すまでの上限(ms)。 */
4
+ export declare const SYS_PROMPT_SAFETY_CAP_MS: number;
5
+ /** 起動子が作る一時ファイル名(`randomHex` は 8 byte の hex=16 文字)。 */
6
+ export declare function sysPromptFileName(randomHex: string): string;
7
+ /** `candidate` が起動子の作る形で `tmpdir` の直下にあるか(消してよいか)。 */
8
+ export declare function isOwnSysPromptPath(candidate: string | undefined | null, tmpdir: string): boolean;
9
+ //# sourceMappingURL=sysPromptHandoff.d.ts.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"sysPromptHandoff.d.ts","sourceRoot":"","sources":["../../src/lib/sysPromptHandoff.ts"],"names":[],"mappings":"AAmBA,yCAAyC;AACzC,eAAO,MAAM,cAAc,6BAA6B,CAAC;AAEzD,yCAAyC;AACzC,eAAO,MAAM,wBAAwB,QAAiB,CAAC;AAIvD,uDAAuD;AACvD,wBAAgB,iBAAiB,CAAC,SAAS,EAAE,MAAM,GAAG,MAAM,CAE3D;AAED,sDAAsD;AACtD,wBAAgB,kBAAkB,CAAC,SAAS,EAAE,MAAM,GAAG,SAAS,GAAG,IAAI,EAAE,MAAM,EAAE,MAAM,GAAG,OAAO,CAIhG"}
@@ -0,0 +1 @@
1
+ "use strict";var __createBinding=this&&this.__createBinding||(Object.create?function(t,e,r,n){void 0===n&&(n=r);var o=Object.getOwnPropertyDescriptor(e,r);o&&!("get"in o?!e.__esModule:o.writable||o.configurable)||(o={enumerable:!0,get:function(){return e[r]}}),Object.defineProperty(t,n,o)}:function(t,e,r,n){void 0===n&&(n=r),t[n]=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=[];for(var r in t)Object.prototype.hasOwnProperty.call(t,r)&&(e[e.length]=r);return e},t(e)};return function(e){if(e&&e.__esModule)return e;var r={};if(null!=e)for(var n=t(e),o=0;o<n.length;o++)"default"!==n[o]&&__createBinding(r,e,n[o]);return __setModuleDefault(r,e),r}}();Object.defineProperty(exports,"__esModule",{value:!0}),exports.SYS_PROMPT_SAFETY_CAP_MS=exports.SYS_PROMPT_ENV=void 0,exports.sysPromptFileName=sysPromptFileName,exports.isOwnSysPromptPath=isOwnSysPromptPath;const path=__importStar(require("node:path"));exports.SYS_PROMPT_ENV="BLUELAMP_SYS_PROMPT_FILE",exports.SYS_PROMPT_SAFETY_CAP_MS=6e5;const SYS_PROMPT_NAME=/^bl-sys-[0-9a-f]{16}\.txt$/;function sysPromptFileName(t){return`bl-sys-${t}.txt`}function isOwnSysPromptPath(t,e){if(!t||!path.isAbsolute(t))return!1;const r=path.resolve(t);return path.dirname(r)===path.resolve(e)&&SYS_PROMPT_NAME.test(path.basename(r))}
@@ -0,0 +1 @@
1
+ {"version":3,"file":"sysPromptHandoff.js","sourceRoot":"","sources":["../../src/lib/sysPromptHandoff.ts"],"names":[],"mappings":";;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;AA4BA,8CAEC;AAGD,gDAIC;AArCD;;;;;;;;;;;;;;;;GAgBG;AACH,gDAAkC;AAElC,yCAAyC;AAC5B,QAAA,cAAc,GAAG,0BAA0B,CAAC;AAEzD,yCAAyC;AAC5B,QAAA,wBAAwB,GAAG,EAAE,GAAG,EAAE,GAAG,IAAI,CAAC;AAEvD,MAAM,eAAe,GAAG,4BAA4B,CAAC;AAErD,uDAAuD;AACvD,SAAgB,iBAAiB,CAAC,SAAiB;IACjD,OAAO,UAAU,SAAS,MAAM,CAAC;AACnC,CAAC;AAED,sDAAsD;AACtD,SAAgB,kBAAkB,CAAC,SAAoC,EAAE,MAAc;IACrF,IAAI,CAAC,SAAS,IAAI,CAAC,IAAI,CAAC,UAAU,CAAC,SAAS,CAAC;QAAE,OAAO,KAAK,CAAC;IAC5D,MAAM,QAAQ,GAAG,IAAI,CAAC,OAAO,CAAC,SAAS,CAAC,CAAC;IACzC,OAAO,IAAI,CAAC,OAAO,CAAC,QAAQ,CAAC,KAAK,IAAI,CAAC,OAAO,CAAC,MAAM,CAAC,IAAI,eAAe,CAAC,IAAI,CAAC,IAAI,CAAC,QAAQ,CAAC,QAAQ,CAAC,CAAC,CAAC;AAC1G,CAAC"}
@@ -15,9 +15,8 @@ export interface WhoamiFacts {
15
15
  tokenPresent: boolean;
16
16
  /**
17
17
  * portal が「有効」と明示的に答えたときだけ true。それ以外は null。
18
- * TokenManager.validateToken は通信失敗も valid:false に潰すため、
19
- * 「無効」と「繋がらなかった」を我々の側で区別できない。区別できないものを
20
- * 断定しない(推測を案内文に混ぜない)ため false は作らず、理由は note に載せる。
18
+ * 「無効」と「繋がらなかった」は TokenManager.validateToken の `verdict` で区別できる(n=1945)。
19
+ * ⚠️ ただしこの申告は従来どおり false を作らず、理由は note に載せる(案内文の断定を増やさない)。
21
20
  */
22
21
  validated: true | null;
23
22
  /** portal が返した理由 / 通信エラー文(そのまま載せる一次情報) */
@@ -1 +1 @@
1
- {"version":3,"file":"whoami.d.ts","sourceRoot":"","sources":["../../src/lib/whoami.ts"],"names":[],"mappings":"AAAA;;;;;;;;;;;GAWG;AAEH,MAAM,WAAW,WAAW;IAC1B,oBAAoB;IACpB,YAAY,EAAE,OAAO,CAAC;IACtB;;;;;OAKG;IACH,SAAS,EAAE,IAAI,GAAG,IAAI,CAAC;IACvB,0CAA0C;IAC1C,IAAI,CAAC,EAAE,MAAM,GAAG,IAAI,CAAC;IACrB,KAAK,CAAC,EAAE,MAAM,GAAG,IAAI,CAAC;IACtB,IAAI,CAAC,EAAE,MAAM,GAAG,IAAI,CAAC;IACrB,IAAI,CAAC,EAAE,MAAM,GAAG,IAAI,CAAC;IACrB,gCAAgC;IAChC,QAAQ,CAAC,EAAE,MAAM,GAAG,IAAI,CAAC;IACzB,6BAA6B;IAC7B,SAAS,CAAC,EAAE,MAAM,GAAG,IAAI,CAAC;CAC3B;AAOD,wBAAgB,YAAY,CAAC,KAAK,EAAE,WAAW,GAAG,MAAM,CAkCvD"}
1
+ {"version":3,"file":"whoami.d.ts","sourceRoot":"","sources":["../../src/lib/whoami.ts"],"names":[],"mappings":"AAAA;;;;;;;;;;;GAWG;AAEH,MAAM,WAAW,WAAW;IAC1B,oBAAoB;IACpB,YAAY,EAAE,OAAO,CAAC;IACtB;;;;OAIG;IACH,SAAS,EAAE,IAAI,GAAG,IAAI,CAAC;IACvB,0CAA0C;IAC1C,IAAI,CAAC,EAAE,MAAM,GAAG,IAAI,CAAC;IACrB,KAAK,CAAC,EAAE,MAAM,GAAG,IAAI,CAAC;IACtB,IAAI,CAAC,EAAE,MAAM,GAAG,IAAI,CAAC;IACrB,IAAI,CAAC,EAAE,MAAM,GAAG,IAAI,CAAC;IACrB,gCAAgC;IAChC,QAAQ,CAAC,EAAE,MAAM,GAAG,IAAI,CAAC;IACzB,6BAA6B;IAC7B,SAAS,CAAC,EAAE,MAAM,GAAG,IAAI,CAAC;CAC3B;AAOD,wBAAgB,YAAY,CAAC,KAAK,EAAE,WAAW,GAAG,MAAM,CAkCvD"}
@@ -1 +1 @@
1
- {"version":3,"file":"whoami.js","sourceRoot":"","sources":["../../src/lib/whoami.ts"],"names":[],"mappings":";AAAA;;;;;;;;;;;GAWG;;AA4BH,oCAkCC;AAvCD,SAAS,IAAI,CAAC,KAAa,EAAE,KAAc;IACzC,IAAI,KAAK,KAAK,IAAI,IAAI,KAAK,KAAK,SAAS,IAAI,MAAM,CAAC,KAAK,CAAC,CAAC,IAAI,EAAE,CAAC,MAAM,KAAK,CAAC;QAAE,OAAO,IAAI,CAAC;IAC5F,OAAO,GAAG,KAAK,KAAK,MAAM,CAAC,KAAK,CAAC,CAAC,IAAI,EAAE,EAAE,CAAC;AAC7C,CAAC;AAED,SAAgB,YAAY,CAAC,KAAkB;IAC7C,IAAI,CAAC,KAAK,CAAC,YAAY,EAAE,CAAC;QACxB,OAAO;YACL,mCAAmC;YACnC,sCAAsC;YACtC,KAAK,CAAC,SAAS,CAAC,CAAC,CAAC,WAAW,KAAK,CAAC,SAAS,EAAE,CAAC,CAAC,CAAC,IAAI;SACtD;aACE,MAAM,CAAC,CAAC,CAAC,EAAe,EAAE,CAAC,CAAC,KAAK,IAAI,CAAC;aACtC,IAAI,CAAC,IAAI,CAAC,CAAC;IAChB,CAAC;IAED,MAAM,QAAQ,GACZ,KAAK,CAAC,SAAS,KAAK,IAAI;QACtB,CAAC,CAAC,qBAAqB;QACvB,CAAC,CAAC,gFAAgF,CAAC;IAEvF,MAAM,IAAI,GAAG;QACX,KAAK,CAAC,SAAS,KAAK,IAAI,CAAC,CAAC,CAAC,IAAI,CAAC,CAAC,CAAC,IAAI,CAAC,eAAe,EAAE,KAAK,CAAC,IAAI,CAAC;QACnE,IAAI,CAAC,OAAO,EAAE,KAAK,CAAC,IAAI,CAAC;QACzB,IAAI,CAAC,QAAQ,EAAE,KAAK,CAAC,KAAK,CAAC;QAC3B,IAAI,CAAC,SAAS,EAAE,KAAK,CAAC,IAAI,CAAC;QAC3B,KAAK,CAAC,QAAQ;YACZ,CAAC,CAAC,IAAI,CAAC,cAAc,EAAE,KAAK,CAAC,QAAQ,CAAC;YACtC,CAAC,CAAC,+CAA+C;QACnD,IAAI,CAAC,SAAS,EAAE,KAAK,CAAC,SAAS,CAAC;KACjC,CAAC,MAAM,CAAC,CAAC,CAAC,EAAe,EAAE,CAAC,CAAC,KAAK,IAAI,CAAC,CAAC;IAEzC,OAAO;QACL,QAAQ;QACR,GAAG,IAAI;QACP,EAAE;QACF,iEAAiE;QACjE,0DAA0D;KAC3D,CAAC,IAAI,CAAC,IAAI,CAAC,CAAC;AACf,CAAC"}
1
+ {"version":3,"file":"whoami.js","sourceRoot":"","sources":["../../src/lib/whoami.ts"],"names":[],"mappings":";AAAA;;;;;;;;;;;GAWG;;AA2BH,oCAkCC;AAvCD,SAAS,IAAI,CAAC,KAAa,EAAE,KAAc;IACzC,IAAI,KAAK,KAAK,IAAI,IAAI,KAAK,KAAK,SAAS,IAAI,MAAM,CAAC,KAAK,CAAC,CAAC,IAAI,EAAE,CAAC,MAAM,KAAK,CAAC;QAAE,OAAO,IAAI,CAAC;IAC5F,OAAO,GAAG,KAAK,KAAK,MAAM,CAAC,KAAK,CAAC,CAAC,IAAI,EAAE,EAAE,CAAC;AAC7C,CAAC;AAED,SAAgB,YAAY,CAAC,KAAkB;IAC7C,IAAI,CAAC,KAAK,CAAC,YAAY,EAAE,CAAC;QACxB,OAAO;YACL,mCAAmC;YACnC,sCAAsC;YACtC,KAAK,CAAC,SAAS,CAAC,CAAC,CAAC,WAAW,KAAK,CAAC,SAAS,EAAE,CAAC,CAAC,CAAC,IAAI;SACtD;aACE,MAAM,CAAC,CAAC,CAAC,EAAe,EAAE,CAAC,CAAC,KAAK,IAAI,CAAC;aACtC,IAAI,CAAC,IAAI,CAAC,CAAC;IAChB,CAAC;IAED,MAAM,QAAQ,GACZ,KAAK,CAAC,SAAS,KAAK,IAAI;QACtB,CAAC,CAAC,qBAAqB;QACvB,CAAC,CAAC,gFAAgF,CAAC;IAEvF,MAAM,IAAI,GAAG;QACX,KAAK,CAAC,SAAS,KAAK,IAAI,CAAC,CAAC,CAAC,IAAI,CAAC,CAAC,CAAC,IAAI,CAAC,eAAe,EAAE,KAAK,CAAC,IAAI,CAAC;QACnE,IAAI,CAAC,OAAO,EAAE,KAAK,CAAC,IAAI,CAAC;QACzB,IAAI,CAAC,QAAQ,EAAE,KAAK,CAAC,KAAK,CAAC;QAC3B,IAAI,CAAC,SAAS,EAAE,KAAK,CAAC,IAAI,CAAC;QAC3B,KAAK,CAAC,QAAQ;YACZ,CAAC,CAAC,IAAI,CAAC,cAAc,EAAE,KAAK,CAAC,QAAQ,CAAC;YACtC,CAAC,CAAC,+CAA+C;QACnD,IAAI,CAAC,SAAS,EAAE,KAAK,CAAC,SAAS,CAAC;KACjC,CAAC,MAAM,CAAC,CAAC,CAAC,EAAe,EAAE,CAAC,CAAC,KAAK,IAAI,CAAC,CAAC;IAEzC,OAAO;QACL,QAAQ;QACR,GAAG,IAAI;QACP,EAAE;QACF,iEAAiE;QACjE,0DAA0D;KAC3D,CAAC,IAAI,CAAC,IAAI,CAAC,CAAC;AACf,CAAC"}
package/package.json CHANGED
@@ -1,6 +1,6 @@
1
1
  {
2
2
  "name": "bizboost",
3
- "version": "6.6.8",
3
+ "version": "6.6.13",
4
4
  "description": "BizBoost CLI: 旧 bluelampportal/mcp の auth / 200+ bizboost1-N binary / postinstall scripts を TypeScript 化して monorepo に統合したパッケージ。",
5
5
  "keywords": [
6
6
  "bizboost",
@@ -22,6 +22,9 @@
22
22
  "access": "public"
23
23
  },
24
24
  "preferGlobal": true,
25
+ "bluelampLauncherFeatures": [
26
+ "task-file"
27
+ ],
25
28
  "repository": {
26
29
  "type": "git",
27
30
  "url": "git+https://github.com/mikoto-co-jp/mikoto-monorepo.git",
@@ -1,41 +0,0 @@
1
- /**
2
- * BlueLamp と Claude のログインアカウントを起動時に見せる行を組み立てる(板 #526 F3・純関数)。
3
- *
4
- * 仕様(要件書 §3 確定仕様=主君 13:2x の更新後):
5
- * 1. **常時 2 行**: 既存 `📧 Email:`(BlueLamp) の並びに `🤖 Claude:` を**毎回**出す
6
- * 2. Claude 未ログイン(`.claude.json` 無し/壊れ/`oauthAccount` 無し)は
7
- * `🤖 Claude: 未ログイン(初回起動時にログイン画面が出ます)`
8
- * 3. **不一致のときだけ**追加で ⚠️ 警告を **1 行**(CTO 裁可 C 2026-08-30 で確定)。
9
- * ⛔ 警告にアドレスを埋めない——両アドレスは直上の常時 2 行(`📧` / `🤖`)に既に出ており、
10
- * 繰り返しても情報は 1 つも増えない(主君の「1 行」を守っても情報は落ちない)
11
- * 4. ⛔ プラン名(無料/Pro/Max)を断定しない——`organizationType` は本機 1 サンプルしか
12
- * 観測できておらず、無料アカウントで何が入るか未確認。**アドレス不一致の指摘だけで主因は潰せる**
13
- * 5. ⛔ ブロックしない(例外・遅延・戻り値で起動を止めない)
14
- *
15
- * ⚠️ 本モジュールは `console` を持たない。**行を組み立てて返すだけ**で、出力は `bin/` 側が行う
16
- * (出力順の検証は実出力で行い、ここは文字列として単体で測れる状態に保つ)。
17
- */
18
- import type { ClaudeAccount } from './claudeAccount.js';
19
- export interface AccountAssurance {
20
- /** 常時 1 行。Claude 側のアドレス、または未ログインの案内 */
21
- readonly infoLine: string;
22
- /** 不一致のときだけ中身が入る。一致・比較不能なら空配列(=警告が 1 行も増えない) */
23
- readonly warnLines: readonly string[];
24
- }
25
- /**
26
- * 比較用の正規化。前後空白を落とし小文字化する。
27
- * ドメイン部は元来大小を区別せず、実運用の identity provider もローカル部を区別しない。
28
- * ⇒ 大文字違いを「別アカウント」と誤警告する方が実害が大きいので、大小は無視する。
29
- */
30
- export declare function normalizeEmail(email: string | null | undefined): string;
31
- /**
32
- * 不一致か。**どちらかが空なら比較不能=不一致とは言わない**(false)。
33
- * 「分からない」を「食い違っている」と言わない(潔癖性)。
34
- */
35
- export declare function isAccountMismatch(bluelampEmail: string | null | undefined, claudeEmail: string | null | undefined): boolean;
36
- /**
37
- * 表示行(常時)と警告行(不一致時のみ)を組み立てる。
38
- * 表示には**利用者が入力した元の綴り**をそのまま使う(正規化は比較にだけ使う)。
39
- */
40
- export declare function buildAccountAssurance(bluelampEmail: string | null | undefined, claudeAccount: ClaudeAccount | null): AccountAssurance;
41
- //# sourceMappingURL=accountAssurance.d.ts.map
@@ -1 +0,0 @@
1
- {"version":3,"file":"accountAssurance.d.ts","sourceRoot":"","sources":["../../src/lib/accountAssurance.ts"],"names":[],"mappings":"AAAA;;;;;;;;;;;;;;;;GAgBG;AAGH,OAAO,KAAK,EAAE,aAAa,EAAE,MAAM,oBAAoB,CAAC;AAExD,MAAM,WAAW,gBAAgB;IAC/B,uCAAuC;IACvC,QAAQ,CAAC,QAAQ,EAAE,MAAM,CAAC;IAC1B,gDAAgD;IAChD,QAAQ,CAAC,SAAS,EAAE,SAAS,MAAM,EAAE,CAAC;CACvC;AAED;;;;GAIG;AACH,wBAAgB,cAAc,CAAC,KAAK,EAAE,MAAM,GAAG,IAAI,GAAG,SAAS,GAAG,MAAM,CAEvE;AAED;;;GAGG;AACH,wBAAgB,iBAAiB,CAC/B,aAAa,EAAE,MAAM,GAAG,IAAI,GAAG,SAAS,EACxC,WAAW,EAAE,MAAM,GAAG,IAAI,GAAG,SAAS,GACrC,OAAO,CAKT;AAED;;;GAGG;AACH,wBAAgB,qBAAqB,CACnC,aAAa,EAAE,MAAM,GAAG,IAAI,GAAG,SAAS,EACxC,aAAa,EAAE,aAAa,GAAG,IAAI,GAClC,gBAAgB,CAelB"}
@@ -1 +0,0 @@
1
- "use strict";Object.defineProperty(exports,"__esModule",{value:!0}),exports.normalizeEmail=normalizeEmail,exports.isAccountMismatch=isAccountMismatch,exports.buildAccountAssurance=buildAccountAssurance;const index_js_1=require("../i18n/index.js");function normalizeEmail(n){return(n??"").trim().toLowerCase()}function isAccountMismatch(n,e){const i=normalizeEmail(n),t=normalizeEmail(e);return 0!==i.length&&0!==t.length&&i!==t}function buildAccountAssurance(n,e){if(!e)return{infoLine:`🤖 ${(0,index_js_1.t)("base.claudeAccountNotLoggedIn")}`,warnLines:[]};const i=e.emailAddress,t=`🤖 ${(0,index_js_1.t)("base.claudeAccountLabel",{email:i})}`;return isAccountMismatch(n,i)?{infoLine:t,warnLines:[`⚠️ ${(0,index_js_1.t)("base.claudeAccountMismatch")}`]}:{infoLine:t,warnLines:[]}}
@@ -1 +0,0 @@
1
- {"version":3,"file":"accountAssurance.js","sourceRoot":"","sources":["../../src/lib/accountAssurance.ts"],"names":[],"mappings":";AAAA;;;;;;;;;;;;;;;;GAgBG;;AAiBH,wCAEC;AAMD,8CAQC;AAMD,sDAkBC;AAvDD,+CAAqC;AAUrC;;;;GAIG;AACH,SAAgB,cAAc,CAAC,KAAgC;IAC7D,OAAO,CAAC,KAAK,IAAI,EAAE,CAAC,CAAC,IAAI,EAAE,CAAC,WAAW,EAAE,CAAC;AAC5C,CAAC;AAED;;;GAGG;AACH,SAAgB,iBAAiB,CAC/B,aAAwC,EACxC,WAAsC;IAEtC,MAAM,CAAC,GAAG,cAAc,CAAC,aAAa,CAAC,CAAC;IACxC,MAAM,CAAC,GAAG,cAAc,CAAC,WAAW,CAAC,CAAC;IACtC,IAAI,CAAC,CAAC,MAAM,KAAK,CAAC,IAAI,CAAC,CAAC,MAAM,KAAK,CAAC;QAAE,OAAO,KAAK,CAAC;IACnD,OAAO,CAAC,KAAK,CAAC,CAAC;AACjB,CAAC;AAED;;;GAGG;AACH,SAAgB,qBAAqB,CACnC,aAAwC,EACxC,aAAmC;IAEnC,IAAI,CAAC,aAAa,EAAE,CAAC;QACnB,OAAO,EAAE,QAAQ,EAAE,MAAM,IAAA,YAAC,EAAC,+BAA+B,CAAC,EAAE,EAAE,SAAS,EAAE,EAAE,EAAE,CAAC;IACjF,CAAC;IAED,MAAM,WAAW,GAAG,aAAa,CAAC,YAAY,CAAC;IAC/C,MAAM,QAAQ,GAAG,MAAM,IAAA,YAAC,EAAC,yBAAyB,EAAE,EAAE,KAAK,EAAE,WAAW,EAAE,CAAC,EAAE,CAAC;IAE9E,IAAI,CAAC,iBAAiB,CAAC,aAAa,EAAE,WAAW,CAAC,EAAE,CAAC;QACnD,OAAO,EAAE,QAAQ,EAAE,SAAS,EAAE,EAAE,EAAE,CAAC;IACrC,CAAC;IAED,+DAA+D;IAC/D,iDAAiD;IACjD,OAAO,EAAE,QAAQ,EAAE,SAAS,EAAE,CAAC,MAAM,IAAA,YAAC,EAAC,4BAA4B,CAAC,EAAE,CAAC,EAAE,CAAC;AAC5E,CAAC"}