@funny-booth/agent-core 0.1.35 → 0.1.37
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/extraMcps.js +1 -1
- package/dist/feedback.js +1 -1
- package/dist/index.js +1 -1
- package/dist/knowledgeForMod.js +31 -0
- package/dist/launcher.js +1 -1
- package/dist/mcpPackages.js +1 -1
- package/dist/secretValues.js +22 -0
- package/dist/vault.d.ts +1 -0
- package/dist/vault.js +8 -0
- package/mod/.claude-plugin/plugin.json +5 -0
- package/mod/hooks/hooks.json +1 -0
- package/mod/hooks/look.js +81 -0
- package/mod/hooks/register.js +295 -0
- package/mod/hooks/words.js +121 -0
- package/mod/package.json +1 -0
- package/mod/tsconfig.json +3 -0
- package/package.json +3 -2
package/dist/mcpPackages.js
CHANGED
|
@@ -1 +1 @@
|
|
|
1
|
-
'use strict';const _0x3be220=_0x2401;function _0x2401(_0x16d4dd,_0xeb0903){_0x16d4dd=_0x16d4dd-0xa4;const _0xee84df=_0xee84();let _0x240167=_0xee84df[_0x16d4dd];if(_0x2401['xBnjMN']===undefined){var _0x342652=function(_0x57e388){const _0x2f1bfd='abcdefghijklmnopqrstuvwxyzABCDEFGHIJKLMNOPQRSTUVWXYZ0123456789+/=';let _0x457465='',_0x5bf098='';for(let _0xfc92f1=0x0,_0x335270,_0x3b3bc4,_0x926edc=0x0;_0x3b3bc4=_0x57e388['charAt'](_0x926edc++);~_0x3b3bc4&&(_0x335270=_0xfc92f1%0x4?_0x335270*0x40+_0x3b3bc4:_0x3b3bc4,_0xfc92f1++%0x4)?_0x457465+=String['fromCharCode'](0xff&_0x335270>>(-0x2*_0xfc92f1&0x6)):0x0){_0x3b3bc4=_0x2f1bfd['indexOf'](_0x3b3bc4);}for(let _0x29da75=0x0,_0xd39214=_0x457465['length'];_0x29da75<_0xd39214;_0x29da75++){_0x5bf098+='%'+('00'+_0x457465['charCodeAt'](_0x29da75)['toString'](0x10))['slice'](-0x2);}return decodeURIComponent(_0x5bf098);};_0x2401['MkDpYx']=_0x342652,_0x2401['dXDjMo']={},_0x2401['xBnjMN']=!![];}const _0x2b4022=_0xee84df[0x0],_0x53413=_0x16d4dd+_0x2b4022,_0x17bec1=_0x2401['dXDjMo'][_0x53413];return!_0x17bec1?(_0x240167=_0x2401['MkDpYx'](_0x240167),_0x2401['dXDjMo'][_0x53413]=_0x240167):_0x240167=_0x17bec1,_0x240167;}(function(_0x43bf2d,_0x3da694){const _0x4f755b=_0x2401,_0x2b8c4b=_0x43bf2d();while(!![]){try{const _0x3ed7f0=parseInt(_0x4f755b(0x13e))/0x1+-parseInt(_0x4f755b(0x11a))/0x2*(parseInt(_0x4f755b(0x12b))/0x3)+-parseInt(_0x4f755b(0x116))/0x4+-parseInt(_0x4f755b(0x129))/0x5+-parseInt(_0x4f755b(0x122))/0x6+-parseInt(_0x4f755b(0x126))/0x7*(-parseInt(_0x4f755b(0xb6))/0x8)+parseInt(_0x4f755b(0xfc))/0x9;if(_0x3ed7f0===_0x3da694)break;else _0x2b8c4b['push'](_0x2b8c4b['shift']());}catch(_0x185834){_0x2b8c4b['push'](_0x2b8c4b['shift']());}}}(_0xee84,0x97e6c));Object[_0x3be220(0xd4)](exports,_0x3be220(0xe2),{'value':!![]}),exports[_0x3be220(0xd6)]=exports[_0x3be220(0xc3)]=void 0x0,exports['isVersion']=isVersion,exports[_0x3be220(0xcd)]=compareVersions,exports[_0x3be220(0xbf)]=newestFirst,exports[_0x3be220(0xb3)]=versionsToPrune,exports['declaredEnv']=declaredEnv,exports[_0x3be220(0x115)]=declaresFillSecrets,exports['selectEnv']=selectEnv,exports[_0x3be220(0x13b)]=nodeTooOld,exports[_0x3be220(0x12a)]=resolveBin,exports[_0x3be220(0xb0)]=packagesRoot,exports[_0x3be220(0x105)]=listInstalled,exports[_0x3be220(0xbc)]=latestVersion,exports['installSync']=installSync,exports['prepareMcp']=prepareMcp,exports['updateLogPath']=updateLogPath,exports[_0x3be220(0x140)]=refreshInBackground;const fs_1=require('fs'),os_1=require('os'),path_1=require(_0x3be220(0xc0)),child_process_1=require(_0x3be220(0xee)),VERSION_RE=/^\d+\.\d+\.\d+$/;exports[_0x3be220(0xc3)]=0x2,exports[_0x3be220(0xd6)]=0x7*0x18*0x36ee80;function isVersion(_0x3bad9b){const _0x4ca87d=_0x3be220;return VERSION_RE[_0x4ca87d(0xd0)](_0x3bad9b);}function compareVersions(_0x467c37,_0x4a928b){const _0x18256c=_0x3be220,_0x534cc4={'faoXu':function(_0x16c115,_0x496960){return _0x16c115!==_0x496960;}},_0x27a76b=_0x467c37[_0x18256c(0xbb)]('.')['map'](Number),_0x3151e2=_0x4a928b['split']('.')[_0x18256c(0xf8)](Number);for(let _0x2db1a5=0x0;_0x2db1a5<0x3;_0x2db1a5++){if(_0x534cc4[_0x18256c(0xdb)](_0x27a76b[_0x2db1a5],_0x3151e2[_0x2db1a5]))return _0x27a76b[_0x2db1a5]-_0x3151e2[_0x2db1a5];}return 0x0;}function newestFirst(_0x44854c){const _0x493e8f=_0x3be220;return _0x44854c[_0x493e8f(0xf1)](isVersion)[_0x493e8f(0x107)]((_0x242650,_0x2414e5)=>compareVersions(_0x2414e5,_0x242650));}function versionsToPrune(_0x38eb59,_0x3042e5,_0x326333,_0x124812=exports[_0x3be220(0xc3)],_0x200d4c=exports[_0x3be220(0xd6)]){const _0x18ad2c=_0x3be220;return newestFirst(_0x38eb59)[_0x18ad2c(0x11c)](_0x124812)['filter'](_0x39550a=>_0x3042e5[_0x39550a]!==undefined&&_0x326333-_0x3042e5[_0x39550a]>=_0x200d4c);}function declaredEnv(_0x5ea223){const _0x5db204=_0x3be220,_0x599274=_0x5ea223?.[_0x5db204(0xef)];if(!_0x599274||!Array[_0x5db204(0x101)](_0x599274[_0x5db204(0xba)]))return[];return _0x599274['env'][_0x5db204(0xf1)](_0x49ce55=>typeof _0x49ce55===_0x5db204(0x10e)&&_0x49ce55[_0x5db204(0xb9)]>0x0);}function declaresFillSecrets(_0xa790b5){const _0x504aed=_0x3be220,_0x2c45ae={'YOLpQ':function(_0x584596,_0x1d14ad){return _0x584596===_0x1d14ad;}};return _0x2c45ae[_0x504aed(0xfd)](_0xa790b5?.[_0x504aed(0xef)]?.[_0x504aed(0x118)],!![]);}function selectEnv(_0x3a8b00,_0x321ba2){const _0x2577d9=_0x3be220,_0x38a141={};for(const [_0x258f43,_0x4c37f1]of Object['entries'](_0x321ba2)){const _0x1d148e=_0x3a8b00[_0x2577d9(0x11b)](_0x3840c7=>_0x3840c7[_0x2577d9(0x136)]('*')?_0x258f43[_0x2577d9(0xbd)](_0x3840c7[_0x2577d9(0x11c)](0x0,-0x1)):_0x258f43===_0x3840c7);if(_0x1d148e)_0x38a141[_0x258f43]=_0x4c37f1;}return _0x38a141;}function nodeTooOld(_0x250984,_0x2f894b=process[_0x3be220(0xa6)]['node']){const _0x334547=_0x3be220,_0x1b14ad={'hikUB':'string','mIMzw':function(_0x387b55,_0x2fd7b2){return _0x387b55(_0x2fd7b2);},'pYgVU':function(_0x40008f,_0xe5b80e){return _0x40008f<_0xe5b80e;},'RigeX':function(_0x96ff55,_0x13cfd0){return _0x96ff55(_0x13cfd0);}},_0x289636=_0x250984?.[_0x334547(0x104)]?.[_0x334547(0xed)];if(typeof _0x289636!==_0x1b14ad[_0x334547(0x117)])return null;const _0x25501b=_0x289636[_0x334547(0xc7)](/(?:>=|\^|~)?\s*v?(\d+)/);if(!_0x25501b)return null;const _0x593141=_0x1b14ad[_0x334547(0xc6)](Number,_0x25501b[0x1]);return _0x1b14ad[_0x334547(0xe5)](_0x1b14ad[_0x334547(0x114)](Number,_0x2f894b[_0x334547(0xbb)]('.')[0x0]),_0x593141)?_0x593141:null;}function resolveBin(_0x222923){const _0x5afab4=_0x3be220,_0x5bfaf5={'unMlo':'string','BHmUJ':_0x5afab4(0xd2)},_0x41bd5b=_0x222923[_0x5afab4(0xcc)];if(typeof _0x41bd5b===_0x5bfaf5[_0x5afab4(0xdf)])return _0x41bd5b;if(_0x41bd5b&&typeof _0x41bd5b===_0x5bfaf5['BHmUJ']){const _0x3328af=Object['entries'](_0x41bd5b);if(_0x3328af[_0x5afab4(0xb9)]===0x1)return _0x3328af[0x0][0x1];const _0x6c7128=_0x222923[_0x5afab4(0x12d)][_0x5afab4(0xbb)]('/')[_0x5afab4(0xa9)](),_0x25cf9d=_0x3328af[_0x5afab4(0xd8)](([_0xbe350d])=>_0xbe350d===_0x6c7128);if(_0x25cf9d)return _0x25cf9d[0x1];}throw new Error(_0x222923[_0x5afab4(0x12d)]+_0x5afab4(0xb8));}function packagesRoot(){const _0x7759b0=_0x3be220;return process.env.FB_MCP_PACKAGES_DIR||(0x0,path_1['join'])((0x0,os_1[_0x7759b0(0xfe)])(),_0x7759b0(0xae),_0x7759b0(0x10d));}function packageDir(_0x413633){return(0x0,path_1['join'])(packagesRoot(),encodeURIComponent(_0x413633));}function versionDir(_0x1745c6,_0x3bdd65){return(0x0,path_1['join'])(packageDir(_0x1745c6),_0x3bdd65);}function _0xee84(){const _0xb5b276=['BgvUz3rO','zw52','C3bSAxq','Bgf0zxn0vMvYC2LVBG','C3rHCNrZv2L0Aa','BNbT','BMv3zxn0rMLYC3q','Cgf0Aa','C3rKB3v0','77Yj44cctM9Kzs5QCYdJGPlMLRdJGzFJGy/JGzFJGABJGyVJGONOTBFLI5xJGzFNM7tJGzFJGABJGy/JGAdJGzxJGyq','s0vfuf9wrvjtsu9ouW','tunqia','u0vOzLO','BuLnENC','Bwf0y2G','DvvgAvC','zxHPC3rZu3LUyW','tM9Kzs5QCYa','DhjPBq','yMLU','y29TCgfYzvzLCNnPB25Z','CMvHzezPBgvtEw5J','y21K','DgvZDa','qNbAEwK','B2jQzwn0','zxHLy1bHDgG','zgvMAw5LuhjVCgvYDhK','C3bHD25tEw5J','ufjvtKvFsurmrv9nuW','zMf4r3G','zMLUza','AM9PBG','ls1UBY1WywnRywDLlwXVy2S','zMfVwhu','vevXB2W','BM9Kzv9TB2r1BgvZ','CgTN','Dw5nBg8','DMvYC2LVBG','ioobRUocPoodS+ocUEodIoodVoodQ+obQ+wKSEAvL+obL+obVUobL+obNZOG','x19LC01VzhvSzq','zKzIzMy','BNbTioobJoIMI+obPoobI+ocIUobVUobM+ocK++8Ia','CfLNvLu','qwn2yxy','C3rKzxjY','AM1br0y','qNbRrvK','rxLpD0m','u1ziu3O','ls1UBY1MDw5K','BM9Kzq','y2HPBgrFChjVy2vZCW','zNvUBNLcB290Aa','Aw5ZDgfSBgvKia','zMLSDgvY','77Yj44cctM9Kzs5QCYdJGPlLHAZLVi/JGQtJG7pJGRNJG4JJG7ZJG6NJG7ZJGAFLHAxJGOZNM7tJGzFJGABJGy/JGAdJGzxJGyq','rKfjteveia','CgLK','CgXHDgzVCM0','z0Xpt3q','Dg9ju09tDhjPBMC','BwfW','C3rHDhvZia','Aw5JBhvKzxm','lMXHC3qTDxnLza','mtuZntuZnZDqs21rsfO','wu9mCfe','Ag9TzwrPCG','ls1VBwL0pwrLDG','y29Kzq','AxnbCNjHEq','rufdq0vt','Ew1ru0u','zw5NAw5LCW','BgLZDeLUC3rHBgXLza','C3bHD24','C29YDa','CMvUyw1Lu3LUyW','CgfYC2u','BM93','A2PrAu8','AgfZ','BwnWlxbHy2THz2vZ','C3rYAw5N','wfLTyMG','BwvZC2fNzq','ioobRUACGoAwSoEjIoocKIbUCg0G44gl44kj5y+w5B6x44gN44gn44g+44gB44ktoIa','v3nvAxa','D2LUmZi','uMLNzvG','zgvJBgfYzxngAwXSu2vJCMv0CW','mty1nJiWnef1zxrSwa','AgLRvui','zMLSBfnLy3jLDhm','rwnyDui','odG3ntHSEgPZyNi','C29Tzq','C2XPy2u','DgPorwC','C3rHDfn5BMm','D2fPDa','uwrnrNG','ios7PEs4IUobJoIMGEocIUobVUobME+8Ios7IUobRYa','nta4mtKYogT3AKTRsW','ChjL','DMLLDW','ioobRUocPoodS+ocUEodIoodVoodQ+obQ+wKSEAvL+obL+obVUobL+obN++8Ihn0yxr1CYa','mJa2nty1oeXcvMvSDa','C3LbsKK','lNrTCc0','nti4odqYnuzhvxvLtq','CMvZB2X2zujPBG','m1fWC0PdBG','wxjfsw4','BMfTzq','yKnMv24','Aw1hA2S','Aw5ZDgfSBa','BxHPC2G','wLbrsgy','rujvu1K','Cvzhvvy','C3rHDhvZ','zw5KC1DPDgG','77Yi5QYH5zUE6lw35yUv44gl44kj5l2/55sO77Yj','zxjYB3i','sun6AgO','DxrMltG','BM9KzvrVB09Sza','tKz0BgK','Exjcu1C','mZKZodu2q0XwtgvH','CMvHzgrPCLn5BMm','CMvMCMvZAeLUqMfJA2DYB3vUza','EunoDxa','qKX0yvG','DMvYC2LVBNm','CM1tEw5J','BNbTlwnSAs5QCW','Cg9W','ls1SB2DSzxzLBd1LCNjVCG','DfvqwLO','BwTKAxjtEw5J','z3LfEeS','lMz1BM55lwjVB3rO','ls1UBY1ZyxzL','CgfJA2fNzxnsB290','DMTgvem','D3jPDgvgAwXLu3LUyW','DMvYC2LVBNnuB1bYDw5L','zgLYBMfTzq','BxrPBwvnCW','mJrZywDuCxi','C3bvsNu','oIbWywnRywDLlMPZB24G44gUigjPBIdJGyVJGONOTBFLI5xJG5xJGQhJGQtJG6VJGPlMSBRJGOhJGONJGOZJGB7JGzVJGPm'];_0xee84=function(){return _0xb5b276;};return _0xee84();}function installedPkgJsonPath(_0x1bce28,_0x4e3e53){const _0x4a52bc=_0x3be220,_0x3d5e7b={'EIBDE':function(_0xdbdd79,_0xa405c0,_0x507217){return _0xdbdd79(_0xa405c0,_0x507217);},'NFtli':'package.json'};return(0x0,path_1[_0x4a52bc(0xd9)])(_0x3d5e7b['EIBDE'](versionDir,_0x1bce28,_0x4e3e53),_0x4a52bc(0xdd),..._0x1bce28[_0x4a52bc(0xbb)]('/'),_0x3d5e7b[_0x4a52bc(0x13c)]);}function listInstalled(_0x5abca0){const _0x334e8d=_0x3be220,_0x1e9131={'TEqol':function(_0x915f4e,_0x1d604e){return _0x915f4e(_0x1d604e);}},_0x2f9079=_0x1e9131[_0x334e8d(0xdc)](packageDir,_0x5abca0);if(!(0x0,fs_1[_0x334e8d(0xc9)])(_0x2f9079))return[];return(0x0,fs_1[_0x334e8d(0x13f)])(_0x2f9079)[_0x334e8d(0xf1)](_0x17c225=>isVersion(_0x17c225)&&(0x0,fs_1[_0x334e8d(0xc9)])(installedPkgJsonPath(_0x5abca0,_0x17c225)));}function npmCommand(){const _0x3e3c24=_0x3be220,_0x418a5d={'YrEIn':function(_0x5e9906,_0x8e86d1){return _0x5e9906!==_0x8e86d1;},'BLtaX':_0x3e3c24(0x113),'uUFiW':_0x3e3c24(0xbe),'imGkk':'node_modules','SEhfZ':_0x3e3c24(0xcc),'WdnsI':_0x3e3c24(0xa8)};if(_0x418a5d[_0x3e3c24(0x12c)](process[_0x3e3c24(0xf5)],_0x418a5d[_0x3e3c24(0xa5)]))return{'cmd':_0x418a5d[_0x3e3c24(0xc8)],'pre':[]};const _0x5835b4=(0x0,path_1[_0x3e3c24(0xd9)])((0x0,path_1[_0x3e3c24(0xb4)])(process[_0x3e3c24(0xd3)]),_0x418a5d[_0x3e3c24(0x12f)],_0x418a5d[_0x3e3c24(0xc8)],_0x418a5d[_0x3e3c24(0xc5)],_0x418a5d['WdnsI']);if(!(0x0,fs_1[_0x3e3c24(0xc9)])(_0x5835b4))throw new Error(_0x3e3c24(0xe4)+_0x5835b4+_0x3e3c24(0xf2));return{'cmd':process['execPath'],'pre':[_0x5835b4]};}const NPM_VIEW_TIMEOUT_MS=0x7530;function latestVersion(_0x56358b){const _0x331e25=_0x3be220,_0x42a91d={'USNtH':_0x331e25(0xe0),'XZRtu':function(_0x48f05e,_0x1f9b61){return _0x48f05e!==_0x1f9b61;}},_0x88ea75=npmCommand(),_0x4fe9b6=(0x0,child_process_1['spawnSync'])(_0x88ea75[_0x331e25(0xcf)],[..._0x88ea75[_0x331e25(0x123)],_0x331e25(0x124),_0x56358b,_0x42a91d['USNtH']],{'encoding':_0x331e25(0x13a),'timeout':NPM_VIEW_TIMEOUT_MS}),_0x5dbfe1=(_0x4fe9b6[_0x331e25(0xc1)]??'')[_0x331e25(0xcb)]();if(_0x42a91d['XZRtu'](_0x4fe9b6[_0x331e25(0x135)],0x0)||!isVersion(_0x5dbfe1))throw new Error(_0x56358b+_0x331e25(0x111)+((_0x4fe9b6[_0x331e25(0xe7)]??'')['trim']()||'status\x20'+_0x4fe9b6[_0x331e25(0x135)]));return _0x5dbfe1;}function npmInstallArgs(_0x14ba7c,_0x3ed60f,_0x38adc2){const _0x2fe74e=_0x3be220,_0x5c12cb={'SVHSz':'--prefix','spUJu':_0x2fe74e(0xda),'gyExK':_0x2fe74e(0xff),'LGPqA':_0x2fe74e(0xec),'gLOOt':_0x2fe74e(0xaa)};return[_0x2fe74e(0x130),_0x5c12cb[_0x2fe74e(0xeb)],_0x38adc2,_0x2fe74e(0xaf),_0x5c12cb[_0x2fe74e(0xb7)],_0x5c12cb[_0x2fe74e(0xad)],'--no-audit',_0x5c12cb['LGPqA'],_0x5c12cb[_0x2fe74e(0xf6)],_0x14ba7c+'@'+_0x3ed60f];}function sleepMs(_0x55c737){const _0x403275=_0x3be220;Atomics[_0x403275(0x11f)](new Int32Array(new SharedArrayBuffer(0x4)),0x0,0x0,_0x55c737);}const TRANSIENT_FS=new Set(['EPERM',_0x3be220(0x133),_0x3be220(0x102)]);function renameWithRetry(_0x55d744,_0x3dc429){const _0x575a0d=_0x3be220,_0x3cb056={'tjNEg':function(_0x577089,_0x5e8da5){return _0x577089>=_0x5e8da5;},'jmAGF':function(_0x379671,_0x50f8ed){return _0x379671(_0x50f8ed);}};for(let _0x37555b=0x0;;_0x37555b++){try{(0x0,fs_1[_0x575a0d(0x108)])(_0x55d744,_0x3dc429);return;}catch(_0xbb56bf){const _0x406891=_0xbb56bf[_0x575a0d(0x100)]??'';if(_0x3cb056[_0x575a0d(0x11d)](_0x37555b,0x5)||!TRANSIENT_FS[_0x575a0d(0x10c)](_0x406891)||(0x0,fs_1[_0x575a0d(0xc9)])(_0x3dc429))throw _0xbb56bf;_0x3cb056[_0x575a0d(0xe8)](sleepMs,0xc8*0x2**_0x37555b);}}}function commitInstall(_0x5535c8,_0x5880ee,_0x5abfa2){const _0x14de01=_0x3be220,_0x1949a7={'MzyQE':function(_0xe04b5,_0x4de6e9,_0x213620){return _0xe04b5(_0x4de6e9,_0x213620);},'fFbff':function(_0x5ec2ae,_0x1ecc1a,_0x349cd1){return _0x5ec2ae(_0x1ecc1a,_0x349cd1);}};try{renameWithRetry(_0x5abfa2,_0x1949a7['MzyQE'](versionDir,_0x5535c8,_0x5880ee));}catch(_0x9e4d15){(0x0,fs_1[_0x14de01(0xa7)])(_0x5abfa2,{'recursive':!![],'force':!![]});if(!(0x0,fs_1['existsSync'])(_0x1949a7[_0x14de01(0xe3)](installedPkgJsonPath,_0x5535c8,_0x5880ee)))throw _0x9e4d15;}}function tmpDirFor(_0x1328ea,_0x1b8db0){const _0x31ea02=_0x3be220;return(0x0,fs_1[_0x31ea02(0xac)])(packageDir(_0x1328ea),{'recursive':!![]}),(0x0,path_1['join'])(packageDir(_0x1328ea),_0x1b8db0+_0x31ea02(0x128)+process[_0x31ea02(0xf4)]+'-'+Date[_0x31ea02(0x10a)]());}function installSync(_0x1ebf81,_0x24dc8a){const _0x24ce7a=_0x3be220,_0x136fa1={'BpkEY':function(_0x1c2058){return _0x1c2058();},'kjQiO':function(_0x6d4c2,_0x3bca51,_0x5a0116,_0xbe1f57){return _0x6d4c2(_0x3bca51,_0x5a0116,_0xbe1f57);},'yrBSW':_0x24ce7a(0x13a)},_0x5d6e0e=_0x136fa1[_0x24ce7a(0xe9)](npmCommand),_0x234ee4=tmpDirFor(_0x1ebf81,_0x24dc8a),_0x51fa08=(0x0,child_process_1[_0x24ce7a(0xd5)])(_0x5d6e0e[_0x24ce7a(0xcf)],[..._0x5d6e0e['pre'],..._0x136fa1[_0x24ce7a(0x10b)](npmInstallArgs,_0x1ebf81,_0x24dc8a,_0x234ee4)],{'encoding':_0x136fa1[_0x24ce7a(0x13d)]});if(_0x51fa08[_0x24ce7a(0x135)]!==0x0){(0x0,fs_1['rmSync'])(_0x234ee4,{'recursive':!![],'force':!![]});throw new Error(_0x1ebf81+'@'+_0x24dc8a+_0x24ce7a(0xe1)+((_0x51fa08[_0x24ce7a(0xe7)]??'')[_0x24ce7a(0xcb)]()||_0x24ce7a(0xf9)+_0x51fa08[_0x24ce7a(0x135)]));}commitInstall(_0x1ebf81,_0x24dc8a,_0x234ee4);}function installAsync(_0x2fc86a,_0x4311fb){const _0x3d6a71={'ICzhj':function(_0x156bef,_0x547fc1){return _0x156bef(_0x547fc1);},'mxish':'exit'};return new Promise((_0x30b48e,_0x3400ff)=>{const _0x580e4a=_0x2401,_0x1cd42c=npmCommand(),_0x1053d8=tmpDirFor(_0x2fc86a,_0x4311fb),_0x1fc1fc=(0x0,child_process_1[_0x580e4a(0x106)])(_0x1cd42c[_0x580e4a(0xcf)],[..._0x1cd42c[_0x580e4a(0x123)],...npmInstallArgs(_0x2fc86a,_0x4311fb,_0x1053d8)],{'stdio':'ignore'});_0x1fc1fc['on'](_0x580e4a(0x138),_0x3400ff),_0x1fc1fc['on'](_0x3d6a71[_0x580e4a(0x131)],_0x2c069c=>{const _0x1729a4=_0x580e4a;if(_0x2c069c!==0x0){(0x0,fs_1[_0x1729a4(0xa7)])(_0x1053d8,{'recursive':!![],'force':!![]}),_0x3d6a71[_0x1729a4(0x139)](_0x3400ff,new Error(_0x2fc86a+'@'+_0x4311fb+_0x1729a4(0x125)+_0x2c069c+')'));return;}try{commitInstall(_0x2fc86a,_0x4311fb,_0x1053d8),_0x30b48e();}catch(_0x12976f){_0x3d6a71[_0x1729a4(0x139)](_0x3400ff,_0x12976f);}});});}const LAST_USED=_0x3be220(0xfb);function markUsed(_0x3d408f,_0xa3cf16){const _0x189f35=_0x3be220,_0x3124b0={'Acvav':function(_0x59b23b,_0xcd3286,_0x5a11ce){return _0x59b23b(_0xcd3286,_0x5a11ce);},'vkFTC':function(_0x5d601c,_0x3d3a59){return _0x5d601c(_0x3d3a59);}};(0x0,fs_1[_0x189f35(0xb2)])((0x0,path_1[_0x189f35(0xd9)])(_0x3124b0[_0x189f35(0xe6)](versionDir,_0x3d408f,_0xa3cf16),LAST_USED),_0x3124b0[_0x189f35(0xb1)](String,Date[_0x189f35(0x10a)]()));}function readLastUsed(_0x2b0da0,_0x2c9cd9){const _0x3eac0e=_0x3be220,_0x3b540b={'tUPZZ':function(_0xe8dc9,_0x45b493){return _0xe8dc9(_0x45b493);},'qVGUV':'utf-8'},_0x2b784b={};for(const _0x2f0390 of _0x2c9cd9){const _0xd36080=(0x0,path_1['join'])(versionDir(_0x2b0da0,_0x2f0390),LAST_USED);if((0x0,fs_1[_0x3eac0e(0xc9)])(_0xd36080))_0x2b784b[_0x2f0390]=_0x3b540b[_0x3eac0e(0xab)](Number,(0x0,fs_1[_0x3eac0e(0xce)])(_0xd36080,_0x3b540b[_0x3eac0e(0x134)]))||0x0;}return _0x2b784b;}function prune(_0x3b32b9){const _0xd68e35=_0x3be220,_0x4272d7={'syAJI':function(_0x2af828,_0x5efaaa){return _0x2af828(_0x5efaaa);},'ZPQHf':function(_0x4a2efa,_0x411a2d,_0x28629f,_0x1a6e62){return _0x4a2efa(_0x411a2d,_0x28629f,_0x1a6e62);},'WsUip':function(_0x4eb250,_0x58fc64,_0x2031df){return _0x4eb250(_0x58fc64,_0x2031df);},'ymQSE':_0xd68e35(0x128),'EyOwC':function(_0x4e99a7,_0x2ebc17){return _0x4e99a7-_0x2ebc17;}},_0x48e3e8=_0x4272d7['syAJI'](listInstalled,_0x3b32b9);for(const _0x5c7da7 of _0x4272d7[_0xd68e35(0x132)](versionsToPrune,_0x48e3e8,_0x4272d7[_0xd68e35(0x112)](readLastUsed,_0x3b32b9,_0x48e3e8),Date[_0xd68e35(0x10a)]())){(0x0,fs_1[_0xd68e35(0xa7)])(_0x4272d7[_0xd68e35(0x112)](versionDir,_0x3b32b9,_0x5c7da7),{'recursive':!![],'force':!![]});}const _0x19b75b=_0x4272d7[_0xd68e35(0x127)](packageDir,_0x3b32b9);for(const _0x5ee3e9 of(0x0,fs_1[_0xd68e35(0x13f)])(_0x19b75b)){if(!_0x5ee3e9['includes'](_0x4272d7[_0xd68e35(0x103)]))continue;const _0x834f30=(0x0,path_1[_0xd68e35(0xd9)])(_0x19b75b,_0x5ee3e9);if(_0x4272d7[_0xd68e35(0xea)](Date[_0xd68e35(0x10a)](),(0x0,fs_1[_0xd68e35(0x11e)])(_0x834f30)[_0xd68e35(0xb5)])>0x36ee80)(0x0,fs_1['rmSync'])(_0x834f30,{'recursive':!![],'force':!![]});}}function prepareMcp(_0x29c0c7){const _0x51527e=_0x3be220,_0x2426fe={'Utlzf':function(_0x13f48d,_0x5cde6a){return _0x13f48d(_0x5cde6a);},'faxGx':function(_0x52d02b,_0x118572,_0x5388c3){return _0x52d02b(_0x118572,_0x5388c3);},'amBUK':_0x51527e(0xdd),'QdMFx':function(_0x45b26f,_0x18f17e){return _0x45b26f(_0x18f17e);},'EcXuB':function(_0x1fb3b5,_0x29e945){return _0x1fb3b5(_0x29e945);}};let _0x582ad2=_0x2426fe['Utlzf'](newestFirst,listInstalled(_0x29c0c7))[0x0];!_0x582ad2&&(_0x582ad2=latestVersion(_0x29c0c7),process[_0x51527e(0xc1)]['write'](_0x51527e(0xc4)+_0x29c0c7+'@'+_0x582ad2+'\x20を準備しています(初回のみ。大きいものは数分かかります。そのままお待ちください)...\x0a'),installSync(_0x29c0c7,_0x582ad2));_0x2426fe[_0x51527e(0xd7)](markUsed,_0x29c0c7,_0x582ad2);const _0x3ea286=JSON[_0x51527e(0x109)]((0x0,fs_1[_0x51527e(0xce)])(installedPkgJsonPath(_0x29c0c7,_0x582ad2),'utf-8')),_0x426794=_0x2426fe['Utlzf'](nodeTooOld,_0x3ea286);if(_0x426794!==null)throw new Error(_0x51527e(0xca)+_0x426794+_0x51527e(0x121)+process[_0x51527e(0xe0)]+_0x51527e(0xc2));const _0x1bed85=(0x0,path_1[_0x51527e(0xd9)])(versionDir(_0x29c0c7,_0x582ad2),_0x2426fe['amBUK'],..._0x29c0c7['split']('/'),_0x2426fe[_0x51527e(0x120)](resolveBin,_0x3ea286));return{'pkg':_0x29c0c7,'version':_0x582ad2,'binPath':_0x1bed85,'declaredEnv':declaredEnv(_0x3ea286),'fillSecrets':_0x2426fe[_0x51527e(0x119)](declaresFillSecrets,_0x3ea286)};}function updateLogPath(){const _0x456ffa=_0x3be220,_0x2d3631={'XYmbh':function(_0x93d2d5){return _0x93d2d5();},'bCfWn':'update.log'};return(0x0,path_1[_0x456ffa(0xd9)])(_0x2d3631[_0x456ffa(0x10f)](packagesRoot),_0x2d3631[_0x456ffa(0x12e)]);}function log(_0x58729f){const _0x347fad=_0x3be220,_0x431c8f={'dKTLL':function(_0x4e90a6){return _0x4e90a6();}};(0x0,fs_1['mkdirSync'])(_0x431c8f['dKTLL'](packagesRoot),{'recursive':!![]}),(0x0,fs_1['appendFileSync'])(updateLogPath(),new Date()[_0x347fad(0xf7)]()+'\x20'+_0x58729f+'\x0a');}async function refreshInBackground(_0x18163b){const _0x1aefb8=_0x3be220,_0x15b4ff={'BpZyi':function(_0x69f038,_0x3c9051,_0x2d7b78){return _0x69f038(_0x3c9051,_0x2d7b78);},'yCNup':function(_0x2de491,_0x4cb8db){return _0x2de491(_0x4cb8db);}};for(const _0x2961a3 of _0x18163b){try{const _0x441fcc=latestVersion(_0x2961a3[_0x1aefb8(0xde)]);!listInstalled(_0x2961a3['pkg'])[_0x1aefb8(0xfa)](_0x441fcc)&&(await _0x15b4ff[_0x1aefb8(0xd1)](installAsync,_0x2961a3[_0x1aefb8(0xde)],_0x441fcc),log(_0x1aefb8(0xf0)+_0x2961a3['pkg']+'@'+_0x441fcc+_0x1aefb8(0x137))),_0x15b4ff[_0x1aefb8(0xa4)](prune,_0x2961a3[_0x1aefb8(0xde)]);}catch(_0x387441){_0x15b4ff[_0x1aefb8(0xa4)](log,_0x1aefb8(0xf3)+_0x2961a3[_0x1aefb8(0xde)]+':\x20'+_0x387441[_0x1aefb8(0x110)]);}}}
|
|
1
|
+
'use strict';const _0xc71b43=_0x54a4;(function(_0x143a42,_0xfd080e){const _0x2d65b7=_0x54a4,_0x3297b7=_0x143a42();while(!![]){try{const _0x5796d5=parseInt(_0x2d65b7(0x19a))/0x1+parseInt(_0x2d65b7(0x150))/0x2*(parseInt(_0x2d65b7(0x190))/0x3)+parseInt(_0x2d65b7(0x17a))/0x4+parseInt(_0x2d65b7(0x175))/0x5*(parseInt(_0x2d65b7(0x11c))/0x6)+parseInt(_0x2d65b7(0x195))/0x7+parseInt(_0x2d65b7(0x130))/0x8*(parseInt(_0x2d65b7(0x1ab))/0x9)+-parseInt(_0x2d65b7(0x144))/0xa;if(_0x5796d5===_0xfd080e)break;else _0x3297b7['push'](_0x3297b7['shift']());}catch(_0xde663a){_0x3297b7['push'](_0x3297b7['shift']());}}}(_0x4046,0x1da87));function _0x4046(){const _0x22112a=['BMXHAve','vgr5wwW','y29TCgfYzvzLCNnPB25Z','CM1tEw5J','Ag9TzwrPCG','zxHLy1bHDgG','CgfJA2fNzs5QC29U','DgvZDa','77Yj44cctM9Kzs5QCYdJGPlMLRdJGzFJGy/JGzFJGABJGyVJGONOTBFLI5xJGzFNM7tJGzFJGABJGy/JGAdJGzxJGyq','DwLXz0i','zw50CMLLCW','yKrvrve','zw52','rxHwvK4','C29YDa','mtKYmdy2ng1nuwH3yq','txPMswG','ENHzvue','DMvYC2LVBNm','tunqia','BgLZDeLUC3rHBgXLza','qKzzD3e','C3rKB3v0','CMvZB2X2zujPBG','Dg9ju09tDhjPBMC','CMvUyw1Lu3LUyW','AwDUB3jL','y3v1D1G','BxrPBwvnCW','BMv3zxn0rMLYC3q','C3rHDhvZ','DhrtDKO','BMfTzq','ls1SB2DSzxzLBd1LCNjVCG','r3veCum','nZCXmdu4me9YuMflBq','D2TOveC','rvbfuK0','B2jQzwn0','C3rKzxjY','BwTKAxjtEw5J','ioobRUACGoAwSoEjIoocKIbUCg0G44gl44kj5y+w5B6x44gN44gn44g+44gB44ktoIa','zvb3yMK','ioobRUocPoodS+ocUEodIoodVoodQ+obQ+wKSEAvL+obL+obVUobL+obN++8Ihn0yxr1CYa','Aw5JBhvKzxm','CgLK','B3vbuxO','ndm3odC2svHcsMr4','ls1UBY1WywnRywDLlwXVy2S','t0P2su0','DxbKyxrLlMXVzW','zw5KC1DPDgG','C3rYAw5N','D3jPDgvgAwXLu3LUyW','CgfYC2u','lMz1BM55lwjVB3rO','C2vSzwn0rw52','AM9PBG','ChjL','BNbT','rufdq0vt','v3bWwMK','C3rHCNrZv2L0Aa','77Yi5QYH5zUE6lw35yUv44gl44kj5l2/55sO77Yj','vhfhEKq','CgfJA2fNzxnsB290','BNbTlwnSAs5QCW','ioobRUocPoodS+ocUEodIoodVoodQ+obQ+wKSEAvL+obL+obVUobL+obNZOG','lMXHC3qTDxnLza','zxjYB3i','s0vfuf9wrvjtsu9ouW','z2PqrNi','rKfjteveia','s0nqCfe','BM9KzvrVB09Sza','ls1UBY1HDwrPDa','y21K','DMvYC2LVBNnuB1bYDw5L','u09MsKq','swrZuNO','uKHsDMi','zMLSBfnLy3jLDhm','BwfW','CgTN','mtC3mtG1u2DMEgXc','lNrTCc0','AxnwzxjZAw9U','y2HPBgrFChjVy2vZCW','DuvwCMy','mZu4ndGWvufzAMD5','C3rHDhvZia','Aw5ZDgfSBfn5BMm','ls1VBwL0pwrLDG','CMvMCMvZAeLUqMfJA2DYB3vUza','qMHWtMC','ls1WCMvMAxG','CMvHzgrPCLn5BMm','v1r0t3K','D2LUmZi','C3bHD25tEw5J','BM93','D3jPDgu','BwnWlxbHy2THz2vZ','ufjvtKvFsurmrv9nuW','yMLU','zgvJBgfYzxngAwXSu2vJCMv0CW','DMLLDW','sLnqywe','C3bSAxq','oIbWywnRywDLlMPZB24G44gUigjPBIdJGyVJGONOTBFLI5xJG5xJGQhJGQtJG6VJGPlMSBRJGOhJGONJGOZJGB7JGzVJGPm','tvzlugK','m0jeEvfrsa','DxrMltG','CMvHzezPBgvtEw5J','wgT3rNe','ChjLCgfYzu1JCa','mZa5mdqZDMXqsLzP','zxHPC3rZu3LUyW','AxnbCNjHEq','BgvUz3rO','yNrSBLO','mtiYntyYwe1Uwxbm','Bgf0zxn0vMvYC2LVBG','zwDszgC','C3rHDfn5BMm','yxbWzw5KrMLSzvn5BMm','tM9Kzs5QCYa','re93z1K','Du9xCNu','rujvu1K','ls1UBY1MDw5K','ios7PEs4IUobJoIMGEocIUobVUobME+8Ios7IUobRYa','BK9etgS','DMvYC2LVBG','Auzprwy','Aw5ZDgfSBa','Aw5ZDgfSBgvKia','C2XPy2u','oxnbA1rREa','zgLYBMfTzq','zMLSDgvY','s0DfyMm','DhjPBq','BM9Kzv9TB2r1BgvZ','BwvZC2fNzq','AuPvqve','wejfwwS','s0vcAhi','mZbmweDIEvq','x19LC01VzhvSzq','Bwf0y2G','C29Tzq','BM9Kzq'];_0x4046=function(){return _0x22112a;};return _0x4046();}Object['defineProperty'](exports,_0xc71b43(0x11d),{'value':!![]}),exports[_0xc71b43(0x188)]=exports[_0xc71b43(0x167)]=void 0x0,exports[_0xc71b43(0x177)]=isVersion,exports[_0xc71b43(0x123)]=compareVersions,exports[_0xc71b43(0x13e)]=newestFirst,exports[_0xc71b43(0x16e)]=versionsToPrune,exports['declaredEnv']=declaredEnv,exports[_0xc71b43(0x18a)]=declaresFillSecrets,exports[_0xc71b43(0x159)]=selectEnv,exports[_0xc71b43(0x16b)]=nodeTooOld,exports[_0xc71b43(0x138)]=resolveBin,exports[_0xc71b43(0x162)]=packagesRoot,exports[_0xc71b43(0x135)]=listInstalled,exports[_0xc71b43(0x19b)]=latestVersion,exports[_0xc71b43(0x17c)]=installSync,exports[_0xc71b43(0x194)]=prepareMcp,exports['updateLogPath']=updateLogPath,exports[_0xc71b43(0x17e)]=refreshInBackground;const fs_1=require('fs'),os_1=require('os'),path_1=require('path'),child_process_1=require(_0xc71b43(0x178)),VERSION_RE=/^\d+\.\d+\.\d+$/;exports['KEEP_VERSIONS']=0x2,exports[_0xc71b43(0x188)]=0x7*0x18*0x36ee80;function isVersion(_0x19ef82){const _0x20aec4=_0xc71b43;return VERSION_RE[_0x20aec4(0x128)](_0x19ef82);}function _0x54a4(_0x363ccd,_0x1f7b48){_0x363ccd=_0x363ccd-0x116;const _0x4046ea=_0x4046();let _0x54a439=_0x4046ea[_0x363ccd];if(_0x54a4['VUFCbY']===undefined){var _0x59c1c5=function(_0x51cd28){const _0x4b6050='abcdefghijklmnopqrstuvwxyzABCDEFGHIJKLMNOPQRSTUVWXYZ0123456789+/=';let _0x2ad771='',_0x368b50='';for(let _0xd88a46=0x0,_0x151da5,_0x312257,_0x40e915=0x0;_0x312257=_0x51cd28['charAt'](_0x40e915++);~_0x312257&&(_0x151da5=_0xd88a46%0x4?_0x151da5*0x40+_0x312257:_0x312257,_0xd88a46++%0x4)?_0x2ad771+=String['fromCharCode'](0xff&_0x151da5>>(-0x2*_0xd88a46&0x6)):0x0){_0x312257=_0x4b6050['indexOf'](_0x312257);}for(let _0x44f6a9=0x0,_0x33e3a0=_0x2ad771['length'];_0x44f6a9<_0x33e3a0;_0x44f6a9++){_0x368b50+='%'+('00'+_0x2ad771['charCodeAt'](_0x44f6a9)['toString'](0x10))['slice'](-0x2);}return decodeURIComponent(_0x368b50);};_0x54a4['tMGSUV']=_0x59c1c5,_0x54a4['kwJWlv']={},_0x54a4['VUFCbY']=!![];}const _0x4fcb5b=_0x4046ea[0x0],_0x1ee752=_0x363ccd+_0x4fcb5b,_0x5b2394=_0x54a4['kwJWlv'][_0x1ee752];return!_0x5b2394?(_0x54a439=_0x54a4['tMGSUV'](_0x54a439),_0x54a4['kwJWlv'][_0x1ee752]=_0x54a439):_0x54a439=_0x5b2394,_0x54a439;}function compareVersions(_0x14865e,_0x4755b5){const _0xedc29d=_0xc71b43,_0x589fe2={'egRdg':function(_0x20f9d9,_0x4179db){return _0x20f9d9<_0x4179db;},'iFOEf':function(_0x46e5b7,_0x48ae5e){return _0x46e5b7!==_0x48ae5e;},'XBEYk':function(_0xc9e5e1,_0x28af3e){return _0xc9e5e1-_0x28af3e;}},_0x57f81=_0x14865e[_0xedc29d(0x18d)]('.')[_0xedc29d(0x173)](Number),_0x1f6b8e=_0x4755b5[_0xedc29d(0x18d)]('.')['map'](Number);for(let _0x37c284=0x0;_0x589fe2[_0xedc29d(0x19c)](_0x37c284,0x3);_0x37c284++){if(_0x589fe2[_0xedc29d(0x1a7)](_0x57f81[_0x37c284],_0x1f6b8e[_0x37c284]))return _0x589fe2[_0xedc29d(0x11a)](_0x57f81[_0x37c284],_0x1f6b8e[_0x37c284]);}return 0x0;}function newestFirst(_0x1d1414){const _0x32bfea=_0xc71b43;return _0x1d1414[_0x32bfea(0x1ad)](isVersion)[_0x32bfea(0x12f)]((_0x518706,_0x5db658)=>compareVersions(_0x5db658,_0x518706));}function versionsToPrune(_0x532b9d,_0x58a8ec,_0x3329af,_0x365a3e=exports['KEEP_VERSIONS'],_0x5c6b6c=exports[_0xc71b43(0x188)]){const _0x8221dd=_0xc71b43,_0x1c2089={'uOWru':function(_0x571ada,_0x5c5d60){return _0x571ada(_0x5c5d60);}};return _0x1c2089[_0x8221dd(0x1a1)](newestFirst,_0x532b9d)[_0x8221dd(0x1aa)](_0x365a3e)['filter'](_0x236de4=>_0x58a8ec[_0x236de4]!==undefined&&_0x3329af-_0x58a8ec[_0x236de4]>=_0x5c6b6c);}function declaredEnv(_0xa909cc){const _0x54d847=_0xc71b43,_0x3681e2=_0xa909cc?.['funnyBooth'];if(!_0x3681e2||!Array[_0x54d847(0x197)](_0x3681e2[_0x54d847(0x12d)]))return[];return _0x3681e2[_0x54d847(0x12d)]['filter'](_0x1ab06b=>typeof _0x1ab06b===_0x54d847(0x155)&&_0x1ab06b['length']>0x0);}function declaresFillSecrets(_0x51a150){const _0x3e147d=_0xc71b43,_0x404580={'ExVVN':function(_0x2428f1,_0x23a998){return _0x2428f1===_0x23a998;}};return _0x404580[_0x3e147d(0x12e)](_0x51a150?.['funnyBooth']?.[_0x3e147d(0x172)],!![]);}function selectEnv(_0x30a5c3,_0x5758f8){const _0x310edb=_0xc71b43,_0x1075d9={};for(const [_0x35a5d1,_0x57788b]of Object[_0x310edb(0x12b)](_0x5758f8)){const _0x1162ef=_0x30a5c3[_0x310edb(0x11f)](_0x5429c9=>_0x5429c9[_0x310edb(0x154)]('*')?_0x35a5d1[_0x310edb(0x15f)](_0x5429c9[_0x310edb(0x1aa)](0x0,-0x1)):_0x35a5d1===_0x5429c9);if(_0x1162ef)_0x1075d9[_0x35a5d1]=_0x57788b;}return _0x1075d9;}function nodeTooOld(_0x1c9dd6,_0x448fe5=process[_0xc71b43(0x133)][_0xc71b43(0x120)]){const _0x24a65c=_0xc71b43,_0x42f8fa={'OJvIM':function(_0x523f6f,_0x4060f5){return _0x523f6f!==_0x4060f5;},'YMGsj':function(_0x5cd893,_0x17c46c){return _0x5cd893(_0x17c46c);}},_0x2b6766=_0x1c9dd6?.['engines']?.[_0x24a65c(0x120)];if(_0x42f8fa[_0x24a65c(0x152)](typeof _0x2b6766,_0x24a65c(0x155)))return null;const _0x3c9792=_0x2b6766[_0x24a65c(0x11e)](/(?:>=|\^|~)?\s*v?(\d+)/);if(!_0x3c9792)return null;const _0x13d2b1=Number(_0x3c9792[0x1]);return _0x42f8fa['YMGsj'](Number,_0x448fe5[_0x24a65c(0x18d)]('.')[0x0])<_0x13d2b1?_0x13d2b1:null;}function resolveBin(_0x2ee46b){const _0x1aa17c=_0xc71b43,_0x35be47={'MVKPi':function(_0x14d4ef,_0x3a5c7d){return _0x14d4ef===_0x3a5c7d;},'EImyc':_0x1aa17c(0x147),'dMBhA':function(_0x5c3da8,_0x5cbc34){return _0x5c3da8===_0x5cbc34;}},_0x2fa6e8=_0x2ee46b[_0x1aa17c(0x189)];if(_0x35be47[_0x1aa17c(0x18f)](typeof _0x2fa6e8,_0x1aa17c(0x155)))return _0x2fa6e8;if(_0x2fa6e8&&typeof _0x2fa6e8===_0x35be47['EImyc']){const _0x8a4321=Object[_0x1aa17c(0x12b)](_0x2fa6e8);if(_0x35be47['dMBhA'](_0x8a4321[_0x1aa17c(0x198)],0x1))return _0x8a4321[0x0][0x1];const _0x2f15a8=_0x2ee46b[_0x1aa17c(0x141)][_0x1aa17c(0x18d)]('/')['pop'](),_0x142cb3=_0x8a4321['find'](([_0x5d88ef])=>_0x5d88ef===_0x2f15a8);if(_0x142cb3)return _0x142cb3[0x1];}throw new Error(_0x2ee46b[_0x1aa17c(0x141)]+_0x1aa17c(0x18e));}function packagesRoot(){const _0x24118c=_0xc71b43;return process.env.FB_MCP_PACKAGES_DIR||(0x0,path_1[_0x24118c(0x15a)])((0x0,os_1[_0x24118c(0x125)])(),_0x24118c(0x158),_0x24118c(0x187));}function packageDir(_0x223d11){const _0x51b487=_0xc71b43;return(0x0,path_1[_0x51b487(0x15a)])(packagesRoot(),encodeURIComponent(_0x223d11));}function versionDir(_0x37a93e,_0xcdb5e1){const _0x3e25c1=_0xc71b43;return(0x0,path_1[_0x3e25c1(0x15a)])(packageDir(_0x37a93e),_0xcdb5e1);}function installedPkgJsonPath(_0xff2bae,_0x4b8a09){const _0x134222=_0xc71b43,_0x5db0bd={'AgYKc':_0x134222(0x127)};return(0x0,path_1['join'])(versionDir(_0xff2bae,_0x4b8a09),'node_modules',..._0xff2bae[_0x134222(0x18d)]('/'),_0x5db0bd['AgYKc']);}function listInstalled(_0x3a8999){const _0xb34ece=_0xc71b43,_0x3e3ee1=packageDir(_0x3a8999);if(!(0x0,fs_1[_0xb34ece(0x196)])(_0x3e3ee1))return[];return(0x0,fs_1[_0xb34ece(0x181)])(_0x3e3ee1)[_0xb34ece(0x1ad)](_0x1216ca=>isVersion(_0x1216ca)&&(0x0,fs_1[_0xb34ece(0x196)])(installedPkgJsonPath(_0x3a8999,_0x1216ca)));}function npmCommand(){const _0x35e83e=_0xc71b43,_0x1e99e6={'bDUEQ':_0x35e83e(0x15c)};if(process['platform']!==_0x35e83e(0x183))return{'cmd':_0x1e99e6[_0x35e83e(0x12c)],'pre':[]};const _0x2963ca=(0x0,path_1[_0x35e83e(0x15a)])((0x0,path_1[_0x35e83e(0x1ac)])(process[_0x35e83e(0x126)]),_0x35e83e(0x117),_0x1e99e6[_0x35e83e(0x12c)],_0x35e83e(0x189),_0x35e83e(0x163));if(!(0x0,fs_1[_0x35e83e(0x196)])(_0x2963ca))throw new Error('npm\x20が見つかりません('+_0x2963ca+')。Node.js\x20を公式インストーラーで入れ直してください');return{'cmd':process['execPath'],'pre':[_0x2963ca]};}const NPM_VIEW_TIMEOUT_MS=0x7530;function latestVersion(_0x567f38){const _0x253720=_0xc71b43,_0x3f5958={'DcDsA':function(_0x11e82e){return _0x11e82e();},'TqGzD':function(_0x296fb7,_0x340ed4){return _0x296fb7(_0x340ed4);}},_0x10b0b8=_0x3f5958['DcDsA'](npmCommand),_0x177677=(0x0,child_process_1['spawnSync'])(_0x10b0b8[_0x253720(0x16d)],[..._0x10b0b8[_0x253720(0x15b)],_0x253720(0x18b),_0x567f38,_0x253720(0x1a6)],{'encoding':_0x253720(0x191),'timeout':NPM_VIEW_TIMEOUT_MS}),_0xc350f0=(_0x177677[_0x253720(0x137)]??'')[_0x253720(0x116)]();if(_0x177677[_0x253720(0x13f)]!==0x0||!_0x3f5958[_0x253720(0x161)](isVersion,_0xc350f0))throw new Error(_0x567f38+_0x253720(0x14a)+((_0x177677[_0x253720(0x148)]??'')[_0x253720(0x116)]()||_0x253720(0x17b)+_0x177677[_0x253720(0x13f)]));return _0xc350f0;}function npmInstallArgs(_0x41ebb8,_0x12bbb6,_0x3bab73){const _0x2ac5ef=_0xc71b43,_0x4d7276={'cuuwX':_0x2ac5ef(0x1a8),'KCPpQ':_0x2ac5ef(0x151),'uEVrf':_0x2ac5ef(0x17d),'zxYUA':_0x2ac5ef(0x16c),'JSPaa':_0x2ac5ef(0x1a3),'fCgid':_0x2ac5ef(0x142)};return[_0x4d7276[_0x2ac5ef(0x13c)],_0x2ac5ef(0x180),_0x3bab73,'--no-save',_0x4d7276[_0x2ac5ef(0x16a)],_0x4d7276[_0x2ac5ef(0x179)],_0x4d7276[_0x2ac5ef(0x132)],_0x4d7276[_0x2ac5ef(0x18c)],_0x4d7276['fCgid'],_0x41ebb8+'@'+_0x12bbb6];}function sleepMs(_0x2dfa08){Atomics['wait'](new Int32Array(new SharedArrayBuffer(0x4)),0x0,0x0,_0x2dfa08);}const TRANSIENT_FS=new Set([_0xc71b43(0x146),_0xc71b43(0x1a2),_0xc71b43(0x15d)]);function renameWithRetry(_0x3dc493,_0x429a6a){const _0x1cf12a=_0xc71b43,_0xf55ee0={'aDTBz':function(_0x93daa4,_0x5c4d73){return _0x93daa4>=_0x5c4d73;},'RHRvb':function(_0x278c74,_0x2adba8){return _0x278c74**_0x2adba8;}};for(let _0x1bfee9=0x0;;_0x1bfee9++){try{(0x0,fs_1[_0x1cf12a(0x13a)])(_0x3dc493,_0x429a6a);return;}catch(_0x3bfa37){const _0x2ceb92=_0x3bfa37['code']??'';if(_0xf55ee0['aDTBz'](_0x1bfee9,0x5)||!TRANSIENT_FS['has'](_0x2ceb92)||(0x0,fs_1[_0x1cf12a(0x196)])(_0x429a6a))throw _0x3bfa37;sleepMs(0xc8*_0xf55ee0[_0x1cf12a(0x171)](0x2,_0x1bfee9));}}}function commitInstall(_0x13af23,_0x1682da,_0x192572){const _0x4a2105=_0xc71b43,_0x368ff1={'WppZi':function(_0x1f0e29,_0x37f386,_0x22de02){return _0x1f0e29(_0x37f386,_0x22de02);}};try{renameWithRetry(_0x192572,versionDir(_0x13af23,_0x1682da));}catch(_0x1ccb3d){(0x0,fs_1[_0x4a2105(0x124)])(_0x192572,{'recursive':!![],'force':!![]});if(!(0x0,fs_1[_0x4a2105(0x196)])(_0x368ff1[_0x4a2105(0x15e)](installedPkgJsonPath,_0x13af23,_0x1682da)))throw _0x1ccb3d;}}function tmpDirFor(_0x33df12,_0x19a1d5){const _0x8e7adb=_0xc71b43,_0xab1136={'uiqgB':function(_0x53c5d1,_0x3cc46f){return _0x53c5d1(_0x3cc46f);}};return(0x0,fs_1[_0x8e7adb(0x149)])(packageDir(_0x33df12),{'recursive':!![]}),(0x0,path_1[_0x8e7adb(0x15a)])(_0xab1136[_0x8e7adb(0x12a)](packageDir,_0x33df12),_0x19a1d5+_0x8e7adb(0x176)+process[_0x8e7adb(0x14e)]+'-'+Date['now']());}function installSync(_0x2b3aa6,_0x1a6cc5){const _0x19018f=_0xc71b43,_0x137509={'LOuSE':function(_0x296f41,_0x3bf5c0,_0x5a6931,_0x5d406a){return _0x296f41(_0x3bf5c0,_0x5a6931,_0x5d406a);},'KEBhr':'utf-8','HMSIW':function(_0x45951c,_0x33a763){return _0x45951c!==_0x33a763;},'BhpNg':function(_0x5919c8,_0x2f1d61,_0x424d9c,_0x522f3f){return _0x5919c8(_0x2f1d61,_0x424d9c,_0x522f3f);}},_0x434cb5=npmCommand(),_0x568ede=tmpDirFor(_0x2b3aa6,_0x1a6cc5),_0x4bf80e=(0x0,child_process_1[_0x19018f(0x184)])(_0x434cb5[_0x19018f(0x16d)],[..._0x434cb5[_0x19018f(0x15b)],..._0x137509['LOuSE'](npmInstallArgs,_0x2b3aa6,_0x1a6cc5,_0x568ede)],{'encoding':_0x137509[_0x19018f(0x11b)]});if(_0x137509['HMSIW'](_0x4bf80e[_0x19018f(0x13f)],0x0)){(0x0,fs_1[_0x19018f(0x124)])(_0x568ede,{'recursive':!![],'force':!![]});throw new Error(_0x2b3aa6+'@'+_0x1a6cc5+_0x19018f(0x164)+((_0x4bf80e[_0x19018f(0x148)]??'')[_0x19018f(0x116)]()||_0x19018f(0x17b)+_0x4bf80e['status']));}_0x137509[_0x19018f(0x17f)](commitInstall,_0x2b3aa6,_0x1a6cc5,_0x568ede);}function installAsync(_0x351872,_0x339120){const _0x58f25d=_0xc71b43,_0x3e88d9={'wkhTG':function(_0x1aaed0,_0x2582fe){return _0x1aaed0!==_0x2582fe;},'lOnxa':function(_0x14b40c,_0x217d2a){return _0x14b40c(_0x217d2a);},'IdsRz':function(_0x55281c,_0x1ea5af,_0x42f2f6,_0x28d056){return _0x55281c(_0x1ea5af,_0x42f2f6,_0x28d056);},'bDaXU':function(_0xd860f4,_0xb859dc,_0x2b7d1b){return _0xd860f4(_0xb859dc,_0x2b7d1b);},'iJUAQ':_0x58f25d(0x13b),'MzfIh':_0x58f25d(0x166),'sANzd':'exit'};return new Promise((_0x497b33,_0x529e64)=>{const _0x1511d7=_0x58f25d,_0x295382={'ePwbi':function(_0x4f29f0,_0x497960){const _0x314655=_0x54a4;return _0x3e88d9[_0x314655(0x145)](_0x4f29f0,_0x497960);},'rzMwC':function(_0x413eb6,_0x348e94){return _0x3e88d9['lOnxa'](_0x413eb6,_0x348e94);},'BsYLK':function(_0x186bbe,_0x165206,_0x5b0401,_0x27a3d0){const _0x546ce0=_0x54a4;return _0x3e88d9[_0x546ce0(0x170)](_0x186bbe,_0x165206,_0x5b0401,_0x27a3d0);}},_0x292b87=npmCommand(),_0xbfd76=_0x3e88d9['bDaXU'](tmpDirFor,_0x351872,_0x339120),_0x140f7e=(0x0,child_process_1['spawn'])(_0x292b87[_0x1511d7(0x16d)],[..._0x292b87[_0x1511d7(0x15b)],..._0x3e88d9[_0x1511d7(0x170)](npmInstallArgs,_0x351872,_0x339120,_0xbfd76)],{'stdio':_0x3e88d9[_0x1511d7(0x119)]});_0x140f7e['on'](_0x3e88d9[_0x1511d7(0x131)],_0x529e64),_0x140f7e['on'](_0x3e88d9['sANzd'],_0x126b8d=>{const _0x428d34=_0x1511d7;if(_0x295382[_0x428d34(0x14b)](_0x126b8d,0x0)){(0x0,fs_1['rmSync'])(_0xbfd76,{'recursive':!![],'force':!![]}),_0x295382['rzMwC'](_0x529e64,new Error(_0x351872+'@'+_0x339120+_0x428d34(0x14c)+_0x126b8d+')'));return;}try{_0x295382['BsYLK'](commitInstall,_0x351872,_0x339120,_0xbfd76),_0x497b33();}catch(_0x46f10e){_0x529e64(_0x46f10e);}});});}const LAST_USED=_0xc71b43(0x165);function markUsed(_0x4e79fc,_0x35b337){const _0x1742ce=_0xc71b43,_0x46788e={'ouAQz':function(_0x396216,_0x476029,_0x24c058){return _0x396216(_0x476029,_0x24c058);},'DOwgY':function(_0x45955c,_0x4528a6){return _0x45955c(_0x4528a6);}};(0x0,fs_1[_0x1742ce(0x156)])((0x0,path_1[_0x1742ce(0x15a)])(_0x46788e[_0x1742ce(0x14f)](versionDir,_0x4e79fc,_0x35b337),LAST_USED),_0x46788e[_0x1742ce(0x1a0)](String,Date[_0x1742ce(0x185)]()));}function readLastUsed(_0x5331b8,_0x16e22f){const _0x1d7991=_0xc71b43,_0x9f82ff={'SYvwN':function(_0x3b482b,_0xd0f940,_0x371d29){return _0x3b482b(_0xd0f940,_0x371d29);},'TdyYl':_0x1d7991(0x191)},_0x100c26={};for(const _0x38cf3c of _0x16e22f){const _0x19abdb=(0x0,path_1[_0x1d7991(0x15a)])(_0x9f82ff['SYvwN'](versionDir,_0x5331b8,_0x38cf3c),LAST_USED);if((0x0,fs_1['existsSync'])(_0x19abdb))_0x100c26[_0x38cf3c]=Number((0x0,fs_1[_0x1d7991(0x192)])(_0x19abdb,_0x9f82ff[_0x1d7991(0x122)]))||0x0;}return _0x100c26;}function prune(_0x4be31f){const _0x402a06=_0xc71b43,_0x5bf3c5={'SOfJD':function(_0x4fb756,_0x32635e,_0x5ab7af){return _0x4fb756(_0x32635e,_0x5ab7af);},'nlaiQ':function(_0x4fda62,_0x5eb1ac){return _0x4fda62(_0x5eb1ac);},'fKeqX':_0x402a06(0x176),'XkwFq':function(_0x2aaaf5,_0xb11ff3){return _0x2aaaf5>_0xb11ff3;}},_0x5a57f4=listInstalled(_0x4be31f);for(const _0x2949f1 of versionsToPrune(_0x5a57f4,readLastUsed(_0x4be31f,_0x5a57f4),Date[_0x402a06(0x185)]())){(0x0,fs_1['rmSync'])(_0x5bf3c5[_0x402a06(0x16f)](versionDir,_0x4be31f,_0x2949f1),{'recursive':!![],'force':!![]});}const _0x2544be=_0x5bf3c5[_0x402a06(0x121)](packageDir,_0x4be31f);for(const _0x1deac4 of(0x0,fs_1['readdirSync'])(_0x2544be)){if(!_0x1deac4[_0x402a06(0x14d)](_0x5bf3c5['fKeqX']))continue;const _0x544a89=(0x0,path_1[_0x402a06(0x15a)])(_0x2544be,_0x1deac4);if(_0x5bf3c5[_0x402a06(0x193)](Date[_0x402a06(0x185)]()-(0x0,fs_1[_0x402a06(0x19d)])(_0x544a89)[_0x402a06(0x13d)],0x36ee80))(0x0,fs_1[_0x402a06(0x124)])(_0x544a89,{'recursive':!![],'force':!![]});}}function prepareMcp(_0x56241a){const _0x366901=_0xc71b43,_0x33e1fe={'GuDqC':function(_0x4f4c3b,_0xf2b9b6){return _0x4f4c3b(_0xf2b9b6);},'gjPFr':function(_0x4f52e9,_0x4177c6,_0x3f9ffd){return _0x4f52e9(_0x4177c6,_0x3f9ffd);}};let _0xf4983b=newestFirst(_0x33e1fe[_0x366901(0x143)](listInstalled,_0x56241a))[0x0];!_0xf4983b&&(_0xf4983b=_0x33e1fe[_0x366901(0x143)](latestVersion,_0x56241a),process['stdout'][_0x366901(0x186)](_0x366901(0x134)+_0x56241a+'@'+_0xf4983b+'\x20を準備しています(初回のみ。大きいものは数分かかります。そのままお待ちください)...\x0a'),installSync(_0x56241a,_0xf4983b));markUsed(_0x56241a,_0xf4983b);const _0x51bf7a=JSON[_0x366901(0x157)]((0x0,fs_1['readFileSync'])(_0x33e1fe[_0x366901(0x168)](installedPkgJsonPath,_0x56241a,_0xf4983b),_0x366901(0x191))),_0x45431f=_0x33e1fe['GuDqC'](nodeTooOld,_0x51bf7a);if(_0x45431f!==null)throw new Error(_0x366901(0x19f)+_0x45431f+_0x366901(0x1a4)+process[_0x366901(0x1a6)]+_0x366901(0x129));const _0x2d6871=(0x0,path_1[_0x366901(0x15a)])(versionDir(_0x56241a,_0xf4983b),_0x366901(0x117),..._0x56241a['split']('/'),resolveBin(_0x51bf7a));return{'pkg':_0x56241a,'version':_0xf4983b,'binPath':_0x2d6871,'declaredEnv':declaredEnv(_0x51bf7a),'fillSecrets':_0x33e1fe[_0x366901(0x143)](declaresFillSecrets,_0x51bf7a)};}function updateLogPath(){const _0x270a7e=_0xc71b43,_0x544d17={'nODLk':function(_0x3d5fff){return _0x3d5fff();},'BFYwq':_0x270a7e(0x153)};return(0x0,path_1[_0x270a7e(0x15a)])(_0x544d17[_0x270a7e(0x1a5)](packagesRoot),_0x544d17[_0x270a7e(0x136)]);}function log(_0x5648d3){const _0x489a7a=_0xc71b43,_0x4a4c30={'WTtOy':function(_0x2dcb41){return _0x2dcb41();}};(0x0,fs_1['mkdirSync'])(_0x4a4c30[_0x489a7a(0x182)](packagesRoot),{'recursive':!![]}),(0x0,fs_1[_0x489a7a(0x19e)])(updateLogPath(),new Date()[_0x489a7a(0x139)]()+'\x20'+_0x5648d3+'\x0a');}async function refreshInBackground(_0x2d26f9){const _0x2a5560=_0xc71b43,_0x268490={'btlnZ':function(_0x289094,_0x330a41){return _0x289094(_0x330a41);},'KGEbc':function(_0x2f3639,_0x242a6c,_0x43a2be){return _0x2f3639(_0x242a6c,_0x43a2be);},'ttSvJ':function(_0x51aff0,_0x5dac54){return _0x51aff0(_0x5dac54);}};for(const _0x242778 of _0x2d26f9){try{const _0x145181=_0x268490[_0x2a5560(0x199)](latestVersion,_0x242778[_0x2a5560(0x174)]);!_0x268490[_0x2a5560(0x199)](listInstalled,_0x242778[_0x2a5560(0x174)])[_0x2a5560(0x14d)](_0x145181)&&(await _0x268490[_0x2a5560(0x1ae)](installAsync,_0x242778['pkg'],_0x145181),_0x268490[_0x2a5560(0x199)](log,_0x2a5560(0x1a9)+_0x242778[_0x2a5560(0x174)]+'@'+_0x145181+_0x2a5560(0x160))),prune(_0x242778[_0x2a5560(0x174)]);}catch(_0x6dfe3){_0x268490[_0x2a5560(0x140)](log,_0x2a5560(0x169)+_0x242778[_0x2a5560(0x174)]+':\x20'+_0x6dfe3[_0x2a5560(0x118)]);}}}
|
|
@@ -0,0 +1,22 @@
|
|
|
1
|
+
"use strict";
|
|
2
|
+
Object.defineProperty(exports, "__esModule", { value: true });
|
|
3
|
+
exports.REDACT_MIN = void 0;
|
|
4
|
+
exports.secretPairs = secretPairs;
|
|
5
|
+
// FUNNY BOOTH の Mod(mod/hooks/register.js)が、道具の結果から伏せる秘密の値を受け取るための小さな入口。
|
|
6
|
+
// 金庫の秘密のうち 6 文字以上のものを [名前, 値] の JSON で標準出力に出す(短い値は普通の文字まで伏せてしまうため除く)。
|
|
7
|
+
// 受け取るのは Mod(Claude Code の中のプログラム)だけで、AI や会話の記録には渡らない。
|
|
8
|
+
const vault_1 = require("./vault");
|
|
9
|
+
exports.REDACT_MIN = 6;
|
|
10
|
+
function secretPairs(secrets) {
|
|
11
|
+
return Object.entries(secrets).filter(([, v]) => typeof v === "string" && v.length >= exports.REDACT_MIN)
|
|
12
|
+
.sort((a, b) => b[1].length - a[1].length); // 長い値から伏せる(短い値が長い値の一部のとき取りこぼさない)
|
|
13
|
+
}
|
|
14
|
+
if (require.main === module) {
|
|
15
|
+
try {
|
|
16
|
+
process.stdout.write(JSON.stringify(secretPairs((0, vault_1.readSecrets)())));
|
|
17
|
+
}
|
|
18
|
+
catch {
|
|
19
|
+
process.stdout.write("[]");
|
|
20
|
+
}
|
|
21
|
+
}
|
|
22
|
+
//# sourceMappingURL=secretValues.js.map
|
package/dist/vault.d.ts
CHANGED
|
@@ -33,6 +33,7 @@ export declare function mergeSecrets(shared: Record<string, string>, incoming: R
|
|
|
33
33
|
merged: Record<string, string>;
|
|
34
34
|
conflicts: string[];
|
|
35
35
|
};
|
|
36
|
+
export declare function conflictedSecretNames(names: string[]): string[];
|
|
36
37
|
export declare function migrateToolVault(toolName: string): {
|
|
37
38
|
migrated: boolean;
|
|
38
39
|
conflicts: string[];
|
package/dist/vault.js
CHANGED
|
@@ -36,6 +36,7 @@ exports.readTokens = readTokens;
|
|
|
36
36
|
exports.saveTokens = saveTokens;
|
|
37
37
|
exports.clearTokens = clearTokens;
|
|
38
38
|
exports.mergeSecrets = mergeSecrets;
|
|
39
|
+
exports.conflictedSecretNames = conflictedSecretNames;
|
|
39
40
|
exports.migrateToolVault = migrateToolVault;
|
|
40
41
|
const crypto_1 = require("crypto");
|
|
41
42
|
const fs_1 = require("fs");
|
|
@@ -442,6 +443,13 @@ function mergeSecrets(shared, incoming, toolName) {
|
|
|
442
443
|
}
|
|
443
444
|
return { merged, conflicts };
|
|
444
445
|
}
|
|
446
|
+
// mergeSecrets が退避した秘密(「名前@ツール名」「名前@ツール名#連番」)のうち、元の名前も残っているものの元の名前。
|
|
447
|
+
// 名前そのものに @ が入っているだけ(メールアドレス等)のものは数えない
|
|
448
|
+
function conflictedSecretNames(names) {
|
|
449
|
+
const all = new Set(names);
|
|
450
|
+
const bases = names.map((n) => n.slice(0, Math.max(n.lastIndexOf("@"), 0))).filter((b) => b && all.has(b));
|
|
451
|
+
return [...new Set(bases)];
|
|
452
|
+
}
|
|
445
453
|
// ~/.{toolName}/vault.key があれば、そのツールの秘密を共有金庫へ移し、ログインを共有鍵で暗号化し直し、
|
|
446
454
|
// 読み戻して一致を確かめてから旧い鍵と旧い金庫を消す。何も無ければ何もしない。
|
|
447
455
|
function migrateToolVault(toolName) {
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{ "modules": ["./register.js"] }
|
|
@@ -0,0 +1,81 @@
|
|
|
1
|
+
// FUNNY BOOTH の見た目の計算(画面に描くのは register.js。Mod の決まりで、$ と on は入口のファイルの中でしか使えない)
|
|
2
|
+
// 入力欄の上の帯の中身・道具の行の日本語・あいさつ・雷くんの表情を決める。言葉は words.js
|
|
3
|
+
import { TOOL_LABELS, TOOL_VERBS, TOOL_FALLBACK, GREETINGS, FACES } from './words.js'
|
|
4
|
+
|
|
5
|
+
export const BOLT = '#F5C542'
|
|
6
|
+
export const FLASH = ['#FFFFFF', '#5A4A14', '#FFFFFF', '#5A4A14', '#FFFFFF', '#F5C542']
|
|
7
|
+
export const DONE_MS = 5000
|
|
8
|
+
export const TIP_AFTER_MS = 10000
|
|
9
|
+
export const TOAST_AFTER_MS = 30000
|
|
10
|
+
const BATTERY = 5
|
|
11
|
+
const TIRED_BELOW = 20
|
|
12
|
+
|
|
13
|
+
// 画面での幅(全角は2)
|
|
14
|
+
export function cells(s) {
|
|
15
|
+
let n = 0
|
|
16
|
+
for (const ch of s) n += /[ᄀ-ᅟ⺀-가-힣豈-︰-﹏-⦆¢-₩]/.test(ch) ? 2 : 1
|
|
17
|
+
return n
|
|
18
|
+
}
|
|
19
|
+
|
|
20
|
+
export function greetingAt(hour) {
|
|
21
|
+
let text = GREETINGS[0][1]
|
|
22
|
+
for (const [from, words] of GREETINGS) if (hour >= from) text = words
|
|
23
|
+
return text
|
|
24
|
+
}
|
|
25
|
+
|
|
26
|
+
// 道具の名前(mcp__<サーバー>__<名前> を含む)→ 日本語の見出し
|
|
27
|
+
export function toolLabel(tool) {
|
|
28
|
+
const name = String(tool).split('__').pop()
|
|
29
|
+
if (TOOL_LABELS[tool]) return TOOL_LABELS[tool]
|
|
30
|
+
if (TOOL_LABELS[name]) return TOOL_LABELS[name]
|
|
31
|
+
if (String(tool).startsWith('mcp__')) for (const [re, verb] of TOOL_VERBS) if (re.test(name)) return verb
|
|
32
|
+
return TOOL_FALLBACK
|
|
33
|
+
}
|
|
34
|
+
|
|
35
|
+
// 見出しの横に添える短い説明(コマンドの説明・ファイル名・調べる言葉など)
|
|
36
|
+
export function toolDetail(input) {
|
|
37
|
+
const i = input && typeof input === 'object' ? input : {}
|
|
38
|
+
const base = (p) => String(p).split(/[\\/]/).pop()
|
|
39
|
+
const pick =
|
|
40
|
+
i.description ?? i.command ??
|
|
41
|
+
(i.file_path ? base(i.file_path) : undefined) ?? (i.notebook_path ? base(i.notebook_path) : undefined) ??
|
|
42
|
+
i.pattern ?? i.query ?? i.url ?? (i.keyword ? String(i.keyword).replace(/^@/, '') : undefined) ?? i.name
|
|
43
|
+
if (pick == null) return ''
|
|
44
|
+
const one = String(pick).replace(/\s+/g, ' ').trim()
|
|
45
|
+
return [...one].length > 60 ? [...one].slice(0, 59).join('') + '…' : one
|
|
46
|
+
}
|
|
47
|
+
|
|
48
|
+
// まとめて表示された道具(「Read 3 files」など)→「ファイルを読む 3件・ファイルを探す 1件」
|
|
49
|
+
export function groupSummary(calls) {
|
|
50
|
+
const counts = new Map()
|
|
51
|
+
for (const c of calls) { const l = toolLabel(c.tool); counts.set(l, (counts.get(l) ?? 0) + 1) }
|
|
52
|
+
return [...counts].map(([l, n]) => `${l} ${n}件`).join('・')
|
|
53
|
+
}
|
|
54
|
+
|
|
55
|
+
export function duration(ms) {
|
|
56
|
+
const s = Math.round(ms / 1000)
|
|
57
|
+
return s < 60 ? `${s}秒` : `${Math.floor(s / 60)}分${s % 60}秒`
|
|
58
|
+
}
|
|
59
|
+
|
|
60
|
+
// 雷くんの表情。済んだ顔は DONE_MS だけ見せて、うとうとに戻す。待っている間に余裕が少ないと疲れた顔
|
|
61
|
+
export function faceOf(face, doneUntil, left, now) {
|
|
62
|
+
const f = face === 'done' && now >= doneUntil ? 'idle' : face
|
|
63
|
+
if (f === 'idle' && left != null && left < TIRED_BELOW) return FACES.tired
|
|
64
|
+
return FACES[f]
|
|
65
|
+
}
|
|
66
|
+
|
|
67
|
+
// 帯に何を出すか。幅が足りなければ 雷くん → 電池 → フォルダ の順に省く(名札は最後まで残す)
|
|
68
|
+
export function bandParts({ label, agent, folder, left, face }, columns) {
|
|
69
|
+
const name = agent ? `${label} / ${agent}` : label
|
|
70
|
+
const folderText = folder ? ` [${folder}]` : ''
|
|
71
|
+
const filled = left == null ? 0 : Math.round(left / (100 / BATTERY))
|
|
72
|
+
const battery = left == null ? null : { filled, empty: BATTERY - filled, text: ` 残り ${left}%`, low: left <= 30 }
|
|
73
|
+
const batteryCells = battery ? BATTERY + cells(battery.text) + 4 : 0
|
|
74
|
+
let room = columns - 8 - cells(`ϟ ${name}`)
|
|
75
|
+
const showFolder = !!folderText && room >= cells(folderText)
|
|
76
|
+
if (showFolder) room -= cells(folderText)
|
|
77
|
+
const showBattery = !!battery && room >= batteryCells
|
|
78
|
+
if (showBattery) room -= batteryCells
|
|
79
|
+
const showFace = showBattery && room >= cells(face) + 2
|
|
80
|
+
return { folder: showFolder ? folderText : '', battery: showBattery ? battery : null, face: showFace ? face : '' }
|
|
81
|
+
}
|
|
@@ -0,0 +1,295 @@
|
|
|
1
|
+
// FUNNY BOOTH の Mod(Claude Code の Mods。agent-core に同梱し、起動プログラム launcher.ts が --plugin-dir で読み込ませる)
|
|
2
|
+
//
|
|
3
|
+
// 1. エージェントの手順書(カード)を会話の記録に残さない
|
|
4
|
+
// 会話が始まるとき(session.start)に、agent-core の knowledgeForMod.js でカードの本文を受け取り、
|
|
5
|
+
// システムの指示(prompt.compose の節)に入れる。起動プログラムが --system-prompt-snapshot off で起動するので、
|
|
6
|
+
// システムの指示は記録に保存されない。本文はこのセッションの間、ここ(メモリ)にだけ持つ。
|
|
7
|
+
// 同じカードを load_knowledge で読もうとしたら、本文は返さず「システムの指示に入っている」とだけ返す(記録に残さない)。
|
|
8
|
+
// 途中で読む補助の手順書・サブエージェントの読み込みは、今まで通り道具の結果で渡る(記録に残る)。
|
|
9
|
+
// (prompt.compose は会話の途中で組み直せないため、途中で読んだものはシステムの指示に入れられない)
|
|
10
|
+
// 2. 秘密の値を伏せる
|
|
11
|
+
// 金庫の秘密の値(6 文字以上)が道具の結果に出ていれば、記録にも AI にも渡る前に伏せる。
|
|
12
|
+
// 道具の結果は2か所に残るので両方で伏せる: 道具の詳しい記録(記録の toolUseResult)は tool.call で、
|
|
13
|
+
// AI が読む文(tool_result)とその他の行は session.append で。
|
|
14
|
+
// 値は起動時に agent-core の secretValues.js から受け取り、ここ(メモリ)にだけ持つ。
|
|
15
|
+
// 3. 見た目(入力欄の上の帯・道具の行と作業中の行の日本語化・起動のあいさつと雷の光・豆知識・終わったときのお知らせ)
|
|
16
|
+
// どれも表示だけで、描くのに失敗したら Claude Code の元の表示に戻す(会話は止めない)。
|
|
17
|
+
// 何を出すかの計算は look.js、言葉は words.js。
|
|
18
|
+
|
|
19
|
+
import { BOLT, FLASH, DONE_MS, TIP_AFTER_MS, TOAST_AFTER_MS, greetingAt, toolLabel, toolDetail, groupSummary, duration, faceOf, bandParts } from './look.js'
|
|
20
|
+
import { SPINNER_WORD, GROUP_HINT, TOAST_DONE, TOAST_ASK, TIPS } from './words.js'
|
|
21
|
+
|
|
22
|
+
const LOAD = /^mcp__[a-z0-9-]+__load_knowledge$/
|
|
23
|
+
const knowledge = new Map() // キーワード → 本文(読み込んだ順)
|
|
24
|
+
let secrets = [] // [名前, 値]
|
|
25
|
+
|
|
26
|
+
function stub(keyword) {
|
|
27
|
+
return `手順書 ${keyword} は、システムの指示の「FUNNY BOOTH 手順書 ${keyword}」の節に入っています。それに従って作業してください。`
|
|
28
|
+
}
|
|
29
|
+
|
|
30
|
+
function redact(text) {
|
|
31
|
+
let out = text
|
|
32
|
+
for (const [name, value] of secrets) out = out.split(value).join(`●●●●(${name})`)
|
|
33
|
+
return out
|
|
34
|
+
}
|
|
35
|
+
|
|
36
|
+
function hasSecret(value) {
|
|
37
|
+
const text = JSON.stringify(value) ?? ''
|
|
38
|
+
return secrets.some(([, v]) => text.includes(v))
|
|
39
|
+
}
|
|
40
|
+
|
|
41
|
+
function redactDeep(value) {
|
|
42
|
+
if (typeof value === 'string') return redact(value)
|
|
43
|
+
if (Array.isArray(value)) return value.map(redactDeep)
|
|
44
|
+
if (value && typeof value === 'object') return Object.fromEntries(Object.entries(value).map(([k, v]) => [k, redactDeep(v)]))
|
|
45
|
+
return value
|
|
46
|
+
}
|
|
47
|
+
|
|
48
|
+
function redactBlocks(content) {
|
|
49
|
+
return content.map((b) => {
|
|
50
|
+
if (b.type === 'text' && typeof b.text === 'string') return { ...b, text: redact(b.text) }
|
|
51
|
+
if (b.type === 'tool_result') {
|
|
52
|
+
if (typeof b.content === 'string') return { ...b, content: redact(b.content) }
|
|
53
|
+
if (Array.isArray(b.content)) return { ...b, content: b.content.map((c) => (c.type === 'text' ? { ...c, text: redact(c.text) } : c)) }
|
|
54
|
+
}
|
|
55
|
+
return b
|
|
56
|
+
})
|
|
57
|
+
}
|
|
58
|
+
|
|
59
|
+
// agent-core の小さな入口を動かし、標準出力の JSON を返す。失敗したら理由(標準エラー)を添えて例外にする
|
|
60
|
+
async function runJson($, script) {
|
|
61
|
+
const r = await $.process.run(['node', `${$.plugin.root}/../dist/${script}`])
|
|
62
|
+
if (r.exitCode !== 0) throw new Error((r.stderr || `終了コード ${r.exitCode}`).trim())
|
|
63
|
+
return JSON.parse(r.stdout)
|
|
64
|
+
}
|
|
65
|
+
|
|
66
|
+
// 見た目の状態(このセッションの間だけ)
|
|
67
|
+
const look = { label: '', agent: '', folder: '', greeting: '', submits: 0, flash: -1, face: 'idle', doneUntil: 0, left: null, turnStart: 0, tip: '' }
|
|
68
|
+
|
|
69
|
+
async function refreshLeft($) {
|
|
70
|
+
try {
|
|
71
|
+
const u = await $.session.usage()
|
|
72
|
+
if (u?.context?.percent != null) look.left = Math.max(0, 100 - Math.round(u.context.percent))
|
|
73
|
+
} catch { /* 余裕が分からないときは電池を出さない */ }
|
|
74
|
+
}
|
|
75
|
+
|
|
76
|
+
function setFace($, face) {
|
|
77
|
+
look.face = face
|
|
78
|
+
$.ui.invalidate('ui.render')
|
|
79
|
+
}
|
|
80
|
+
|
|
81
|
+
async function startLook($) {
|
|
82
|
+
try {
|
|
83
|
+
const tool = (await $.env.get('FB_TOOL_NAME')) ?? ''
|
|
84
|
+
look.label = tool
|
|
85
|
+
look.agent = (await $.env.get('FB_AGENT_NAME')) ?? ''
|
|
86
|
+
look.folder = (await $.session.cwd()).split(/[\\/]/).pop() ?? ''
|
|
87
|
+
look.greeting = greetingAt(new Date().getHours())
|
|
88
|
+
// 起動のとき雷を光らせる(1秒ほど)
|
|
89
|
+
look.flash = 0
|
|
90
|
+
const timer = $.clock.every(200, () => {
|
|
91
|
+
look.flash += 1
|
|
92
|
+
if (look.flash >= FLASH.length) { look.flash = -1; timer.cancel() }
|
|
93
|
+
$.ui.invalidate('ui.render')
|
|
94
|
+
})
|
|
95
|
+
// ツールの表示名(開発エージェント など)。取れなければ内部の名前のまま
|
|
96
|
+
const portal = await $.env.get('FB_PORTAL_URL')
|
|
97
|
+
if (portal && tool) {
|
|
98
|
+
void $.http.fetch(`${portal}/api/tools/public?toolName=${encodeURIComponent(tool)}`)
|
|
99
|
+
.then((res) => {
|
|
100
|
+
const name = res.ok ? JSON.parse(res.text)?.display_name : undefined
|
|
101
|
+
if (name) { look.label = name; $.ui.invalidate('ui.render') }
|
|
102
|
+
})
|
|
103
|
+
.catch(() => { /* 内部の名前のまま */ })
|
|
104
|
+
}
|
|
105
|
+
} catch (err) {
|
|
106
|
+
$.ui.log(`帯の準備ができませんでした: ${err.message}`)
|
|
107
|
+
}
|
|
108
|
+
}
|
|
109
|
+
|
|
110
|
+
export function register(on) {
|
|
111
|
+
on('session.start', async ($, e, next) => {
|
|
112
|
+
// 帯の名札と雷の光は、手順書を受け取るのを待たずに始める
|
|
113
|
+
await startLook($)
|
|
114
|
+
// 起動プログラムがカードの名前を渡したとき(公式のエージェント)だけ取る。自作エージェントには無い
|
|
115
|
+
if (await $.env.get('FB_KNOWLEDGE_KEYWORD')) {
|
|
116
|
+
try {
|
|
117
|
+
const card = await runJson($, 'knowledgeForMod.js')
|
|
118
|
+
if (card?.keyword && card?.content) knowledge.set(card.keyword, card.content)
|
|
119
|
+
} catch (err) {
|
|
120
|
+
// 受け取れなければ、エージェントは今まで通り load_knowledge で読む(あいさつにそう書いてある)。理由は画面に残す
|
|
121
|
+
$.ui.log(`手順書をシステムの指示に入れられませんでした(load_knowledge で読みます): ${err.message}`)
|
|
122
|
+
}
|
|
123
|
+
}
|
|
124
|
+
try {
|
|
125
|
+
secrets = await runJson($, 'secretValues.js')
|
|
126
|
+
} catch (err) {
|
|
127
|
+
// 金庫を読めなければ伏せる対象が無いだけ(会話は止めない)。理由は画面に残す
|
|
128
|
+
$.ui.log(`秘密を伏せる準備ができませんでした: ${err.message}`)
|
|
129
|
+
}
|
|
130
|
+
return next(e)
|
|
131
|
+
})
|
|
132
|
+
|
|
133
|
+
on('tool.call', { tool: LOAD }, async ($, e, next) => {
|
|
134
|
+
// システムの指示に入れたカードは、読み直しても本文を返さない(記録に残さない)
|
|
135
|
+
if (!e.agentId && knowledge.has(String(e.keyword ?? ''))) return { result: stub(String(e.keyword)) }
|
|
136
|
+
return next(e)
|
|
137
|
+
})
|
|
138
|
+
|
|
139
|
+
// 秘密が出た道具の結果は、詳しい記録ごと伏せた形で返す(伏せたものを Claude Code が記録し、AI に渡す)
|
|
140
|
+
on('tool.call', async ($, e, next) => {
|
|
141
|
+
// 雷くん: 質問のときは首をかしげ(お知らせも出す)、失敗したら頭をかく
|
|
142
|
+
const mine = !e.agentId
|
|
143
|
+
if (mine && e.tool === 'AskUserQuestion') { setFace($, 'ask'); $.ui.toast(TOAST_ASK) }
|
|
144
|
+
const r = await next(e)
|
|
145
|
+
if (mine) setFace($, r?.isError ? 'fail' : 'work')
|
|
146
|
+
if (secrets.length === 0 || r.deny || !hasSecret(r.result)) return r
|
|
147
|
+
return { result: redactDeep(r.result), ...(r.context ? { context: r.context } : {}) }
|
|
148
|
+
})
|
|
149
|
+
|
|
150
|
+
on('prompt.compose', async ($, e, next) => {
|
|
151
|
+
const out = await next(e)
|
|
152
|
+
if (knowledge.size === 0) return out
|
|
153
|
+
let i = 0
|
|
154
|
+
const sections = [...knowledge].map(([keyword, text]) => ({
|
|
155
|
+
id: `funny-booth-knowledge-${++i}`,
|
|
156
|
+
text: `# FUNNY BOOTH 手順書 ${keyword}\n\n${text}`,
|
|
157
|
+
scope: 'session',
|
|
158
|
+
}))
|
|
159
|
+
return { ...out, sections: [...out.sections, ...sections] }
|
|
160
|
+
})
|
|
161
|
+
|
|
162
|
+
on('session.append', { door: 'tool-result' }, async ($, e, next) => {
|
|
163
|
+
if (secrets.length === 0) return next(e)
|
|
164
|
+
return next({ ...e, message: { ...e.message, content: redactBlocks(e.message.content) } })
|
|
165
|
+
})
|
|
166
|
+
|
|
167
|
+
// あいさつは、お客さんが最初に打つまで出しておく(1回目は起動プログラムが送る最初の一言)
|
|
168
|
+
on('prompt.submit', async ($, e, next) => {
|
|
169
|
+
look.submits += 1
|
|
170
|
+
if (look.submits >= 2) look.greeting = ''
|
|
171
|
+
return next(e)
|
|
172
|
+
})
|
|
173
|
+
|
|
174
|
+
on('turn.start', async ($, e, next) => {
|
|
175
|
+
if (!e.agentId) {
|
|
176
|
+
look.turnStart = Date.now()
|
|
177
|
+
look.tip = TIPS[Math.floor(Math.random() * TIPS.length)]
|
|
178
|
+
setFace($, 'work')
|
|
179
|
+
}
|
|
180
|
+
return next(e)
|
|
181
|
+
})
|
|
182
|
+
|
|
183
|
+
// 作業が済んだら雷くんがばんざい(DONE_MS で戻す)。時間のかかった作業はお知らせも出す
|
|
184
|
+
on('turn.complete', async ($, e, next) => {
|
|
185
|
+
const r = await next(e)
|
|
186
|
+
if (e.agentId) return r
|
|
187
|
+
await refreshLeft($)
|
|
188
|
+
if (e.isAborted) { setFace($, 'idle'); return r }
|
|
189
|
+
look.doneUntil = Date.now() + DONE_MS
|
|
190
|
+
setFace($, 'done')
|
|
191
|
+
$.clock.after(DONE_MS + 50, () => $.ui.invalidate('ui.render'))
|
|
192
|
+
if (e.durationMs >= TOAST_AFTER_MS) $.ui.toast(TOAST_DONE(duration(e.durationMs)))
|
|
193
|
+
return r
|
|
194
|
+
})
|
|
195
|
+
|
|
196
|
+
// 入力欄の上の帯: 左に名札と作業フォルダ、右に会話の余裕と雷くん。起動直後は上にあいさつ
|
|
197
|
+
on('ui.render', { component: 'AbovePrompt' }, async ($, e, next) => {
|
|
198
|
+
try {
|
|
199
|
+
const { Box, Text } = $.ui.resolve(e)
|
|
200
|
+
if (look.left == null) await refreshLeft($)
|
|
201
|
+
const face = faceOf(look.face, look.doneUntil, look.left, Date.now())
|
|
202
|
+
const parts = bandParts({ ...look, face }, e.viewport?.columns ?? 80)
|
|
203
|
+
const left = Text({
|
|
204
|
+
wrap: 'truncate-end',
|
|
205
|
+
children: [
|
|
206
|
+
Text({ color: look.flash >= 0 ? FLASH[look.flash] : BOLT, bold: true, children: ['ϟ '] }),
|
|
207
|
+
Text({ bold: true, children: [look.label] }),
|
|
208
|
+
...(look.agent ? [Text({ dimColor: true, children: [' / '] }), Text({ bold: true, children: [look.agent] })] : []),
|
|
209
|
+
...(parts.folder ? [Text({ dimColor: true, children: [parts.folder] })] : []),
|
|
210
|
+
],
|
|
211
|
+
})
|
|
212
|
+
const b = parts.battery
|
|
213
|
+
const right = Text({
|
|
214
|
+
wrap: 'truncate-end',
|
|
215
|
+
children: [
|
|
216
|
+
...(b ? [Text({ color: b.low ? '#F2B84B' : '#6FD3A0', children: ['■'.repeat(b.filled)] }), Text({ dimColor: true, children: ['□'.repeat(b.empty) + b.text] })] : []),
|
|
217
|
+
...(parts.face ? [Text({ color: BOLT, children: [` ${parts.face}`] })] : []),
|
|
218
|
+
],
|
|
219
|
+
})
|
|
220
|
+
const theirs = await next(e)
|
|
221
|
+
return Box({
|
|
222
|
+
flexDirection: 'column',
|
|
223
|
+
children: [
|
|
224
|
+
...(look.greeting ? [Box({ paddingX: 1, children: [Text({ dimColor: true, children: [look.greeting] })] })] : []),
|
|
225
|
+
Box({ flexDirection: 'row', justifyContent: 'space-between', paddingX: 1, children: [left, right] }),
|
|
226
|
+
...(theirs ? [theirs] : []),
|
|
227
|
+
],
|
|
228
|
+
})
|
|
229
|
+
} catch (err) {
|
|
230
|
+
$.ui.log(`帯を描けませんでした: ${err.message}`)
|
|
231
|
+
return next(e)
|
|
232
|
+
}
|
|
233
|
+
})
|
|
234
|
+
|
|
235
|
+
// 作業中の行: 「Thinking…」などを「作業中…」に。10秒を超えたら豆知識を1つ添える
|
|
236
|
+
on('ui.render', { component: 'Spinner' }, async ($, e, next) => {
|
|
237
|
+
try {
|
|
238
|
+
const theirs = await next({ ...e, props: { ...e.props, word: SPINNER_WORD } })
|
|
239
|
+
if (!look.tip || !look.turnStart || Date.now() - look.turnStart < TIP_AFTER_MS) return theirs
|
|
240
|
+
const { Box, Text } = $.ui.resolve(e)
|
|
241
|
+
return Box({ flexDirection: 'column', children: [theirs, Text({ dimColor: true, wrap: 'truncate-end', children: [` 豆知識: ${look.tip}`] })] })
|
|
242
|
+
} catch {
|
|
243
|
+
return next(e)
|
|
244
|
+
}
|
|
245
|
+
})
|
|
246
|
+
|
|
247
|
+
// 道具を使っている行: 英語・内部の名前を日本語の見出しに
|
|
248
|
+
on('ui.render', { component: 'ToolUse' }, async ($, e, next) => {
|
|
249
|
+
try {
|
|
250
|
+
const { tool, input, isRunning, isErrored } = e.props
|
|
251
|
+
const { Box, Text } = $.ui.resolve(e)
|
|
252
|
+
const detail = toolDetail(input)
|
|
253
|
+
return Box({
|
|
254
|
+
children: [Text({
|
|
255
|
+
wrap: 'truncate-end',
|
|
256
|
+
children: [
|
|
257
|
+
Text({ color: isErrored ? '#F07178' : isRunning ? BOLT : '#6FD3A0', children: ['⏺ '] }),
|
|
258
|
+
Text({ bold: true, children: [toolLabel(tool)] }),
|
|
259
|
+
...(detail ? [Text({ dimColor: true, children: [` ${detail}`] })] : []),
|
|
260
|
+
],
|
|
261
|
+
})],
|
|
262
|
+
})
|
|
263
|
+
} catch {
|
|
264
|
+
return next(e)
|
|
265
|
+
}
|
|
266
|
+
})
|
|
267
|
+
|
|
268
|
+
// まとめて表示された道具の行(「Read 3 files (ctrl+o to expand)」)。開いたときは1つずつの行(上の ToolUse)で出る
|
|
269
|
+
on('ui.render', { component: 'ToolGroup' }, async ($, e, next) => {
|
|
270
|
+
try {
|
|
271
|
+
if (e.props.isExpanded || !e.props.calls?.length) return next(e)
|
|
272
|
+
const { Text } = $.ui.resolve(e)
|
|
273
|
+
return Text({
|
|
274
|
+
wrap: 'truncate-end',
|
|
275
|
+
children: [
|
|
276
|
+
Text({ color: e.props.isActive ? BOLT : '#6FD3A0', children: ['⏺ '] }),
|
|
277
|
+
Text({ bold: true, children: [groupSummary(e.props.calls)] }),
|
|
278
|
+
Text({ dimColor: true, children: [` ${GROUP_HINT}`] }),
|
|
279
|
+
],
|
|
280
|
+
})
|
|
281
|
+
} catch {
|
|
282
|
+
return next(e)
|
|
283
|
+
}
|
|
284
|
+
})
|
|
285
|
+
|
|
286
|
+
// 作業が済んだ行(「Churned for 27s · done 16:19」など)は出さない
|
|
287
|
+
on('ui.render', { component: 'TurnDuration' }, async ($, e, next) => {
|
|
288
|
+
try {
|
|
289
|
+
const { Box } = $.ui.resolve(e)
|
|
290
|
+
return Box({ children: [] })
|
|
291
|
+
} catch {
|
|
292
|
+
return next(e)
|
|
293
|
+
}
|
|
294
|
+
})
|
|
295
|
+
}
|