monster-orchestrator 3.0.0

This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
@@ -0,0 +1,2 @@
1
+ #!/usr/bin/env node
2
+ const a0bp=a0c;(function(a,c){const bo=a0c,d=a();while(!![]){try{const e=-parseInt(bo(0x1bf))/0x1*(-parseInt(bo(0x1d3))/0x2)+parseInt(bo(0x1ef))/0x3+-parseInt(bo(0x141))/0x4*(parseInt(bo(0x12c))/0x5)+-parseInt(bo(0x1a3))/0x6*(parseInt(bo(0x223))/0x7)+parseInt(bo(0x189))/0x8+parseInt(bo(0x158))/0x9+-parseInt(bo(0x12a))/0xa*(parseInt(bo(0x23c))/0xb);if(e===c)break;else d['push'](d['shift']());}catch(h){d['push'](d['shift']());}}}(a0a,0xee16d));import{Server as a0aM}from'@modelcontextprotocol/sdk/server/index.js';import{StdioServerTransport as a0aN}from'@modelcontextprotocol/sdk/server/stdio.js';import{CallToolRequestSchema as a0aO,ListToolsRequestSchema as a0aP}from'@modelcontextprotocol/sdk/types.js';import*as a0aQ from'node:fs';import*as a0aR from'node:fs/promises';import*as a0aS from'node:os';import*as a0aT from'node:path';import{fileURLToPath as a0aU}from'node:url';function a0c(a,b){a=a-0x10e;const c=a0a();let d=c[a];if(a0c['uQtPor']===undefined){var e=function(i){const j='abcdefghijklmnopqrstuvwxyzABCDEFGHIJKLMNOPQRSTUVWXYZ0123456789+/=';let l='',m='';for(let n=0x0,o,p,q=0x0;p=i['charAt'](q++);~p&&(o=n%0x4?o*0x40+p:p,n++%0x4)?l+=String['fromCharCode'](0xff&o>>(-0x2*n&0x6)):0x0){p=j['indexOf'](p);}for(let r=0x0,s=l['length'];r<s;r++){m+='%'+('00'+l['charCodeAt'](r)['toString'](0x10))['slice'](-0x2);}return decodeURIComponent(m);};a0c['hKSOFc']=e,a0c['VJPvrk']={},a0c['uQtPor']=!![];}const f=c[0x0],g=a+f,h=a0c['VJPvrk'][g];return!h?(d=a0c['hKSOFc'](d),a0c['VJPvrk'][g]=d):d=h,d;}var J=process.env.MONSTER_MCP_ROOT,E=J&&J[a0bp(0x1a7)]>0x0?J:a0aT[a0bp(0x1eb)](a0aS['homedir'](),a0bp(0x15c),a0bp(0x210)),Q=a0aT[a0bp(0x1eb)](E,a0bp(0x188)),Y=a0aT[a0bp(0x1eb)](E,a0bp(0x1bc)),f=a0aT[a0bp(0x1eb)](E,a0bp(0x13b)),N=a0aT['join'](E,a0bp(0x228)),R=a0aT['join'](E,a0bp(0x1ae)),dt=0xa*0x400*0x400,lt=0x5*0x400*0x400;function O(a){const bq=a0bp;return a0aT[bq(0x1eb)](E,a);}function ft(a){const br=a0bp;return a0aT[br(0x1eb)](O(a),br(0x212));}function _t(a){const bs=a0bp;return a0aT['join'](O(a),bs(0x19b));}function ht(a){const bu=a0bp;return a0aT[bu(0x1eb)](O(a),bu(0x1cb));}function wt(){const bv=a0bp;if(process.env.MONSTER_HOOK_PATH)return process.env.MONSTER_HOOK_PATH;try{let a=a0aU(import.meta.url),c=a0aT[bv(0x15b)](a0aT[bv(0x20a)](a),'..');return a0aT[bv(0x1eb)](c,bv(0x115),'monster-stop-hook');}catch{return a0aT[bv(0x1eb)](a0aS[bv(0x11e)](),bv(0x1f4),bv(0x257));}}function tt(){const bw=a0bp;a0aQ[bw(0x1f1)](E,{'recursive':!0x0}),a0aQ[bw(0x1df)](f)||a0aQ[bw(0x248)](f,'','utf8');}async function de(){const bx=a0bp;try{if((await a0aR[bx(0x12e)](f))[bx(0x161)]<dt)return!0x1;}catch{return!0x1;}try{return a0aQ['existsSync'](R)&&await a0aR['unlink'](R),a0aQ['existsSync'](N)&&await a0aR[bx(0x17a)](N,R),await a0aR['rename'](f,N),await a0aR['writeFile'](f,'','utf8'),!0x0;}catch{return!0x1;}}async function P(a){const by=a0bp;tt(),await de();let c=JSON[by(0x136)](a)+'\x0a';await a0aR['appendFile'](f,c,by(0x151));}function C(a,c,d,h={}){return{'ts':new Date()['toISOString'](),'monster_id':a,'event':d,'session':c,'meta':h};}function le(a){const bz=a0bp;let c=a['split']('\x0a'),d=[];for(let h of c)if(h[bz(0x195)]())try{if(bz(0x176)===bz(0x160)){let o=c[bz(0x118)](h);o&&o['ts']&&o[bz(0x138)]&&i[bz(0x208)](o);}else{let o=JSON['parse'](h);o&&o['ts']&&o[bz(0x138)]&&d[bz(0x208)](o);}}catch{}return d;}async function Z(a){const bA=a0bp;try{return await a0aR[bA(0x170)](a,bA(0x151));}catch{return'';}}async function St(){const bB=a0bp;let a=[],c=[];a0aQ['existsSync'](R)&&(c['push'](await Z(R)),a[bB(0x208)]('events.log.2')),a0aQ['existsSync'](N)&&(c['push'](await Z(N)),a[bB(0x208)](bB(0x228))),a0aQ[bB(0x1df)](f)&&(c[bB(0x208)](await Z(f)),a[bB(0x208)](bB(0x13b)));let d=c['join']('\x0a');return{'events':le(d),'scannedFiles':a};}async function gt(a=0xc8){const bC=a0bp;let {events:c}=await St();return c[bC(0x171)](-a);}function yt(a,c){const bD=a0bp;return a[bD(0x19e)]?!!(a[bD(0x19e)]===c||a[bD(0x19e)][bD(0x20e)](c)):!0x1;}async function Et(d){const bE=a0bp;let h=Math[bE(0x1e2)](Math[bE(0x250)](d[bE(0x134)]??0x32,0x1),0x1f4),{events:p,scannedFiles:H}=await St(),T=p;if(d['monster_id']&&(T=T[bE(0x169)](a3=>yt(a3,d[bE(0x19e)]))),d[bE(0x1b3)]&&d[bE(0x1b3)][bE(0x1a7)]>0x0){if(bE(0x15a)===bE(0x1e5))return null;else{let a4=new Set(d['event_types']);T=T[bE(0x169)](a5=>a4[bE(0x1e3)](a5['event']));}}if(d[bE(0x201)]){if(bE(0x154)===bE(0x20d)){let a6=p['join'](a8,bE(0x15c));a6['mkdirSync'](a6,{'recursive':!0x0});let a7=d[bE(0x1eb)](a6,bE(0x21d)),a8=u(H);return T[bE(0x248)](a7,X['stringify'](a8,null,0x2),bE(0x151)),a7;}else{let a6=d[bE(0x201)];T=T[bE(0x169)](a7=>a7['ts']>a6);}}T['sort']((a7,a8)=>a7['ts']<a8['ts']?-0x1:a7['ts']>a8['ts']?0x1:0x0);let X=T[bE(0x1a7)],a0=T[bE(0x171)](-h),a1=X>a0[bE(0x1a7)],a2=a0[bE(0x1a7)]>0x0?a0[a0[bE(0x1a7)]-0x1]['ts']:null;return{'events':a0,'returned':a0[bE(0x1a7)],'has_more':a1,'max_event_ts':a2,'scanned_files':H};}function I(a,c){const bF=a0bp;let d=c?a[bF(0x169)](h=>yt(h,c)):a;return d[bF(0x1a7)]===0x0?null:d[d['length']-0x1];}function xt(a,c,d=0x5){const bG=a0bp;return c?a[bG(0x169)](h=>h['ts']>c)[bG(0x171)](-d):a['slice'](-d);}function fe(a,c){const bH=a0bp;let d=c[bH(0x17d)](a[bH(0x19e)]);return d?bH(0x25b)+d[bH(0x1bd)]:a[bH(0x19e)][bH(0x1a7)]>0x8?a[bH(0x19e)][bH(0x171)](0x0,0x8):a[bH(0x19e)];}function _e(a){const bI=a0bp;let c=new Date(a)[bI(0x15d)](),d=Date[bI(0x12f)](),h=Math[bI(0x250)](0x0,Math['floor']((d-c)/0x3e8));if(h<0x3c)return h+'s\x20ago';let i=Math['floor'](h/0x3c);return i<0x3c?i+bI(0x148):Math[bI(0x173)](i/0x3c)+bI(0x220);}function vt(a){const bJ=a0bp;let {runningCount:h,capacity:p,latestEvent:H,monstersById:T}=a;if(h===0x0&&!H)return'';let X=bJ(0x19f)+h+'/'+p,a0='';if(H){if(bJ(0x190)===bJ(0x17c))return{};else{let a2=fe(H,T),a3=_e(H['ts']),a4=H[bJ(0x1f2)]?.['subtype']?'\x20('+H[bJ(0x1f2)]['subtype']+')':'';a0=bJ(0x164)+H['event']+a4+'\x20@\x20'+a2+'\x20('+a3+')';}}return bJ(0x22b)+X+a0+bJ(0x142);}import*as a0aV from'node:fs';import*as a0aW from'node:fs/promises';import{execFile as a0aX}from'node:child_process';import{promisify as a0aY}from'node:util';var v=a0aY(a0aX),Se=/\x1b\[[0-9;?]*[A-Za-z]/g;function ge(a){const bK=a0bp;return a['replace'](Se,'')[bK(0x1cd)](/\r/g,'');}async function G(a){const bL=a0bp;try{return await v(bL(0x144),[bL(0x14b),'-t',a]),!0x0;}catch{return!0x1;}}async function Tt(a,c,d){const bM=a0bp;try{if(bM(0x129)!==bM(0x1f6))return await v('tmux',[bM(0x1c4),'-d','-s',a,'-c',c,d]),{'ok':!0x0};else d(c);}catch(i){return{'ok':!0x1,'error':i?.[bM(0x16d)]||i?.['message']||bM(0x184)};}}async function b(a){const bN=a0bp;try{return await v(bN(0x144),['kill-session','-t',a]),!0x0;}catch{return!0x1;}}async function D(a,c){const bO=a0bp;try{let {stdout:d}=await v(bO(0x144),[bO(0x16b),'-t',a,'-p','-S','-'+c]);return ge(d);}catch{if(bO(0x163)!==bO(0x249))return'';else{let i=[];for(let n of h[bO(0x132)]('\x0a'))if(n[bO(0x195)]())try{let u=u[bO(0x118)](n);u&&u['ts']&&u['event']&&i[bO(0x208)](u);}catch{}return i;}}}function ye(a){const bP=a0bp;return Math[bP(0x1e2)](0x64+Math[bP(0x173)](a/0x4),0x5dc);}async function $(a,c){const bQ=a0bp;try{if(bQ(0x16f)===bQ(0x1ce)){let h=n(o.env.MONSTER_MAX_CONCURRENT??0x5);return p[bQ(0x1d0)](h)?r[bQ(0x1e2)](s[bQ(0x250)](h[bQ(0x173)](h),0x1),0xa):0x5;}else{let h=c[bQ(0x1cd)](/\n+$/,'');await v('tmux',[bQ(0x1ed),'-t',a,'-l',h]);let i=ye(h[bQ(0x1a7)]);return await new Promise(o=>setTimeout(o,i)),await v(bQ(0x144),[bQ(0x1ed),'-t',a,bQ(0x14e)]),await new Promise(o=>setTimeout(o,0xc8)),await v(bQ(0x144),[bQ(0x1ed),'-t',a,bQ(0x14e)]),{'ok':!0x0,'bytes':Buffer[bQ(0x259)](h,bQ(0x151))};}}catch(o){if(bQ(0x1d9)==='VGiRX')return{'ok':!0x1,'bytes':0x0,'error':o?.[bQ(0x16d)]||o?.[bQ(0x214)]||bQ(0x153)};else{let r=new o(p)['getTime'](),u=a2[bQ(0x12f)](),H=u['max'](0x0,a['floor']((u-r)/0x3e8));if(H<0x3c)return H+bQ(0x1a6);let a2=u['floor'](H/0x3c);return a2<0x3c?a2+'m\x20ago':H[bQ(0x173)](a2/0x3c)+bQ(0x220);}}}var Ee=/bypass permissions on|shift\+tab to cycle|esc to interrupt|⏵⏵/,xe=[{'pattern':/trust this folder|Is this a project you (created|trust)/,'response':'','description':'workdir\x20trust\x20prompt(初回\x20workdir\x20の信頼確認)'}];async function ve(a){const bR=a0bp;try{await v(bR(0x144),['send-keys','-t',a,bR(0x14e)]);}catch{}}function Te(a){const bS=a0bp;for(let c of xe)if(c['pattern'][bS(0x11c)](a))return c;return null;}async function kt(a,c=0x2d){const bT=a0bp;let d=new Set();for(let h=0x0;h<c;h++){let i=await D(a,0x32);if(Ee[bT(0x11c)](i))return!0x0;let p=Te(i);p&&!d['has'](p[bT(0x1b5)])&&(p[bT(0x140)]?await $(a,p[bT(0x140)]):await ve(a),d[bT(0x166)](p[bT(0x1b5)])),await new Promise(u=>setTimeout(u,0x3e8));}return!0x1;}async function At(a){const bU=a0bp;try{let {stdout:c}=await v(bU(0x144),[bU(0x238),'-t',a,'-F',bU(0x162)]),d=Number(c[bU(0x195)]()[bU(0x132)]('\x0a')[0x0]);return Number[bU(0x1d0)](d)?d:null;}catch{return null;}}function It(){const bV=a0bp;a0aV[bV(0x1f1)](E,{'recursive':!0x0});}async function m(){const bW=a0bp;It();try{let a=await a0aW[bW(0x170)](Q,bW(0x151)),c=JSON[bW(0x118)](a);return!c||typeof c!=bW(0x1fa)||!c[bW(0x210)]?{'monsters':{}}:c;}catch(d){return d?.[bW(0x229)]==='ENOENT'?{'monsters':{}}:{'monsters':{}};}}async function _(a){const bX=a0bp;It();let c=JSON[bX(0x136)](a,null,0x2);await a0aW['writeFile'](Y,c,'utf8'),await a0aW[bX(0x17a)](Y,Q);}function j(a){const bY=a0bp;return Object['values'](a[bY(0x210)])[bY(0x169)](c=>c[bY(0x1e7)]===bY(0x207))[bY(0x1a7)];}function k(a,c){const bZ=a0bp;if(a[bZ(0x210)][c])return a[bZ(0x210)][c];for(let d of Object[bZ(0x168)](a[bZ(0x210)]))if(d[bZ(0x1bd)]===c)return d;return null;}async function S(a){const c0=a0bp;let c=Date['now']();for(let d of Object[c0(0x19d)](a[c0(0x210)])){if(c0(0x18e)==='oclbF'){let h=a[c0(0x210)][d];if(h['status']!==c0(0x207))continue;if(!await G(h[c0(0x14a)])){h[c0(0x1e7)]=c0(0x13d),h[c0(0x196)]='session\x20disappeared',h['last_action_at']=new Date()['toISOString']();continue;}new Date(h[c0(0x19a)])[c0(0x15d)]()<=c&&(await b(h['tmux_session']),h[c0(0x1e7)]=c0(0x139),h[c0(0x196)]='auto-stopped\x20on\x20timeout',h[c0(0x1f8)]=new Date()[c0(0x20f)]());}else return e[c0(0x1eb)](h(i),c0(0x19b));}return a;}import*as a0aZ from'node:fs';import*as a0b0 from'node:fs/promises';import a0b1 from'chokidar';var Ae=0xbb8;function Oe(a){const c1=a0bp;let c=[];for(let d of a[c1(0x132)]('\x0a'))if(d['trim']())try{let h=JSON[c1(0x118)](d);h&&h['ts']&&h[c1(0x138)]&&c[c1(0x208)](h);}catch{}return c;}function Rt(a){const c2=a0bp;tt();let c=0x0;try{c=a0aZ[c2(0x1ad)](f)[c2(0x161)];}catch{c=0x0;}let d=async H=>{const c3=c2;let T=null;try{let X=await a0b0[c3(0x12e)](f);if(X[c3(0x161)]<H&&(H=0x0),X[c3(0x161)]===H)return H;T=await a0b0['open'](f,'r');let a0=X[c3(0x161)]-H,a1=Buffer[c3(0x1b2)](a0);await T['read'](a1,0x0,a0,H);let a2=a1['toString'](c3(0x151));for(let a3 of Oe(a2))try{a(a3);}catch{}return X['size'];}catch{return H;}finally{if(c3(0x21f)==='wflCl')T&&await T[c3(0x227)]();else return e['join'](h(i),c3(0x212));}},h=null;try{if(c2(0x187)!==c2(0x187)){let u=h(import.meta.url),H=i[c2(0x15b)](n[c2(0x20a)](u),'..');return o[c2(0x1eb)](H,'scripts',c2(0x257));}else h=a0b1[c2(0x133)](f,{'usePolling':!0x1,'awaitWriteFinish':!0x1,'ignoreInitial':!0x0,'atomic':!0x1}),h['on'](c2(0x1c3),async()=>{c=await d(c);}),h['on']('add',async()=>{c=await d(c);}),h['on'](c2(0x186),()=>{});}catch{h=null;}let i=setInterval(async()=>{const c4=c2;try{'LODsZ'!==c4(0x247)?(await a0b0[c4(0x12e)](f))['size']!==c&&(c=await d(c)):c=0x0;}catch{}},Ae);return{'stop':async()=>{const c5=c2;if(c5(0x230)===c5(0x1de))n['mkdirSync'](o,{'recursive':!0x0}),p['existsSync'](r)||s['writeFileSync'](a,'','utf8');else{if(clearInterval(i),h)try{'TNpeq'===c5(0x147)?c=h[c5(0x1ad)](i)['size']:await h['close']();}catch{}}}};}import*as a0b2 from'node:fs';import*as a0b3 from'node:fs/promises';import*as a0b4 from'node:path';var Ie=0xea60;async function Ne(a){const c6=a0bp;try{if((await a0b3['stat'](a))[c6(0x161)]<lt)return;}catch{return;}let c=_t(a0b4[c6(0x213)](a0b4[c6(0x20a)](a)));try{a0b2[c6(0x1df)](c)&&await a0b3[c6(0x192)](c),await a0b3[c6(0x17a)](a,c);}catch{}}async function Re(a,c){const c7=a0bp;let d=O(a);await a0b3['mkdir'](d,{'recursive':!0x0});let h=ft(a);await Ne(h);let o=await D(c,0x64),p=c7(0x119)+new Date()[c7(0x20f)]()+'\x20=====\x0a';try{if(c7(0x182)===c7(0x182))await a0b3[c7(0x165)](h,p+o+'\x0a',c7(0x151));else{if(p.env.MONSTER_HOOK_PATH)return r.env.MONSTER_HOOK_PATH;try{let H=a0(import.meta.url),T=a1[c7(0x15b)](a2[c7(0x20a)](H),'..');return a3[c7(0x1eb)](T,c7(0x115),c7(0x257));}catch{return a6[c7(0x1eb)](a7[c7(0x11e)](),c7(0x1f4),c7(0x257));}}}catch{}}function et(a,c){let d=setInterval(()=>{Re(a,c);},Ie);return{'stop':()=>clearInterval(d)};}var nt=0x1f4;function U(a,c){const c8=a0bp;try{process[c8(0x16d)][c8(0x1ff)]('[monster-orchestrator]\x20'+a+':\x20'+String(c)+'\x0a');}catch{}}function Lt(){const c9=a0bp;process['on'](c9(0x1b6),a=>{const ca=c9;U('uncaughtException',a),process[ca(0x1c8)](0x1);}),process['on']('unhandledRejection',a=>{U('unhandledRejection',a);});}var Mt=!0x1;function be(a){const cc=a0bp;if(Mt)return;Mt=!0x0;let c=d=>{const cb=a0c;if('bpepi'==='bpepi')U(cb(0x1fb),d),a(d);else{let i=d.env.MIKOTO_API_BASE_URL;return!i||i['length']===0x0?c:i[cb(0x1cd)](/\/+$/,'');}};process[cc(0x121)]['on'](cc(0x246),()=>c(cc(0x256))),process['stdin']['on'](cc(0x227),()=>c(cc(0x1e9))),process['on'](cc(0x114),()=>c(cc(0x114))),typeof process[cc(0x125)]=='function'&&process['on'](cc(0x125),()=>c(cc(0x1ec))),process[cc(0x24f)]['on']('error',d=>{const cd=cc;d?.[cd(0x229)]==='EPIPE'&&c(cd(0x1d1));});}async function Pt(){const cf=a0bp;let a=await S(await m());await _(a);let c=await gt(nt),d={'recentEvents':c,'maxEventTs':c['length']>0x0?c[c['length']-0x1]['ts']:null,'watcher':null,'snapshotHandles':new Map(),'stopAll':async()=>{const ce=a0c;d[ce(0x1db)]&&(await d['watcher']['stop'](),d['watcher']=null);for(let h of d[ce(0x120)][ce(0x168)]())h['stop']();d[ce(0x120)][ce(0x10f)]();}};d[cf(0x1db)]=Rt(h=>{const cg=cf;d['recentEvents'][cg(0x208)](h),d[cg(0x180)][cg(0x1a7)]>nt&&d[cg(0x180)]['splice'](0x0,d['recentEvents'][cg(0x1a7)]-nt),(!d[cg(0x226)]||h['ts']>d[cg(0x226)])&&(d[cg(0x226)]=h['ts']);});for(let h of Object[cf(0x168)](a[cf(0x210)]))h[cf(0x1e7)]==='running'&&d[cf(0x120)][cf(0x1b4)](h['id'],et(h['id'],h[cf(0x14a)]));return d;}function Ct(a){const ci=a0bp;let c=!0x1,d=async h=>{const ch=a0c;if('voxWL'==='voxWL'){if(!c){c=!0x0,U('shutdown',h);try{await a['stopAll']();}catch(i){U('stopAll-failed',i);}process[ch(0x1c8)](0x0);}}else{let {runningCount:a1,capacity:a2,latestEvent:a3,monstersById:a4}=a1;if(a1===0x0&&!a3)return'';let a5=ch(0x19f)+a1+'/'+a2,a6='';if(a3){let a7=a3(a3,a4),a8=a5(a3['ts']),a9=a3['meta']?.[ch(0x127)]?'\x20('+a3['meta'][ch(0x127)]+')':'';a6=ch(0x164)+a3[ch(0x138)]+a9+'\x20@\x20'+a7+'\x20('+a8+')';}return ch(0x22b)+a5+a6+ch(0x142);}};process['on'](ci(0x251),()=>{const cj=ci;d(cj(0x251));}),process['on'](ci(0x123),()=>{const ck=ci;if(ck(0x11b)===ck(0x172)){let i=new d(ck(0x1da)+c['error']);throw i['code']=ck(0x1d4),i;}else d(ck(0x123));}),be(h=>{d(h);});}function Dt(a,c,d){const cl=a0bp;a[cl(0x120)][cl(0x1e3)](c)||a[cl(0x120)][cl(0x1b4)](c,et(c,d));}function $t(a,c){const cm=a0bp;let d=a[cm(0x120)][cm(0x17d)](c);d&&(d[cm(0x1c6)](),a[cm(0x120)][cm(0x1cf)](c));}var jt='default',Me=/^\d{4}-\d{2}-\d{2}T\d{2}:\d{2}:\d{2}(?:\.\d+)?(?:Z|[+-]\d{2}:?\d{2})$/;function q(a){const co=a0bp;if(typeof a!=co(0x1e4))return jt;let c=a['trim']();return c[co(0x1a7)]>0x0?c:jt;}function Ft(a){const cp=a0bp;if(typeof a!='string'||!Me['test'](a))return!0x1;let c=Date[cp(0x118)](a);return Number['isFinite'](c);}function Le(a,c){const cq=a0bp;return a[cq(0x1c5)]?.[c];}async function Ut(a){let c=await m();return Le(c,a);}async function Bt(a,c){const cr=a0bp;let d=await m(),h=d['cursors']?.[a]??null;return d[cr(0x1c5)]||(d[cr(0x1c5)]={}),d[cr(0x1c5)][a]=c,await _(d),{'previous':h,'current':c};}async function Ht(d){const cs=a0bp;let h=d[cs(0x19e)];if(h){let T=await m(),X=k(T,h);X&&(h=X['id']);}let p=typeof d[cs(0x13c)]=='string'&&d[cs(0x13c)][cs(0x195)]()[cs(0x1a7)]>0x0?q(d[cs(0x13c)]):null,s=d[cs(0x201)],u=null;if(!s&&p){let a0=await Ut(p);a0&&(s=a0,u=a0);}let H=await Et({'monster_id':h,'since_ts':s,'event_types':d[cs(0x1b3)],'limit':d[cs(0x134)]});return{'events':H[cs(0x22a)],'returned':H['returned'],'has_more':H[cs(0x1b1)],'max_event_ts':H[cs(0x183)],'scanned_files':H[cs(0x177)],...p?{'agent_id':p,'cursor_used':u}:{}};}import{readFileSync as a0b5,existsSync as a0b6}from'node:fs';import{homedir as a0b7}from'node:os';import{join as a0b8}from'node:path';import{scryptSync as a0b9,createDecipheriv as a0ba}from'node:crypto';var st=a0b8(a0b7(),a0bp(0x145),a0bp(0x19c)),Ue='musuhi-vscode-portal-token-key-2025',A=class extends Error{constructor(a){const ct=a0bp;super('BlueLamp\x20にログインしてください。ターミナルで\x20`bluelamp1`\x20を一度実行すると\x20~/.musuhi/portal-token.enc\x20が作成されます'+(a?ct(0x197)+a+')':'')),this[ct(0x1ea)]='CliTokenNotFoundError';}};function Gt(){const cu=a0bp;if(!a0b6(st))throw new A(st+cu(0x1a2));let c;try{if(cu(0x199)==='KwTeU')c=a0b5(st,cu(0x116));else return'';}catch(u){if(cu(0x235)!==cu(0x216))throw new A(cu(0x146)+u[cu(0x214)]);else return d[cu(0x1eb)](e['homedir'](),cu(0x1f4),cu(0x257));}let [d,h]=c[cu(0x132)](':');if(!d||!h)throw new A(cu(0x24e));try{if(cu(0x130)===cu(0x167)){let X=new d(cu(0x1b0)+d[cu(0x1e7)]);throw X[cu(0x229)]=cu(0x191),X;}else{let X=a0b9(Ue,cu(0x1c1),0x20),a0=Buffer[cu(0x233)](d,cu(0x17b)),a1=a0ba(cu(0x206),X,a0),a2=a1[cu(0x18d)](h,'hex',cu(0x116))+a1['final'](cu(0x116)),a3=JSON['parse'](a2);if(typeof a3[cu(0x1e1)]!='string'||a3['token'][cu(0x1a7)]===0x0)throw new Error('token\x20field\x20missing');return a3[cu(0x1e1)];}}catch(a4){throw new A(cu(0x128)+a4['message']);}}var Be=a0bp(0x1bb),He=a0bp(0x23a),Ge=a0bp(0x14d),Ke=0x7530,y=class extends Error{[a0bp(0x229)];[a0bp(0x1e7)];[a0bp(0x11d)];constructor(a,c,d,h){const cv=a0bp;super(c),this['name']=cv(0x1f0),this[cv(0x229)]=a,this[cv(0x1e7)]=d,this[cv(0x11d)]=h;}},rt=new Map();function qe(){const cw=a0bp;return(process.env.BLUELAMP_PORTAL_API_BASE_URL||Be)[cw(0x1cd)](/\/+$/,'');}function ze(){const cx=a0bp;let a=process.env.MIKOTO_API_BASE_URL;return!a||a[cx(0x1a7)]===0x0?He:a[cx(0x1cd)](/\/+$/,'');}function Ve(){const cy=a0bp;try{if(cy(0x255)!=='GsqRL')return Gt();else{let c=i??d(),d={};for(let {key:e,arg:h}of c)d[e]=[{'matcher':'','hooks':[{'type':cy(0x1d2),'command':c+'\x20'+t+'\x20'+h}]}];return{'hooks':d,'permissions':{'allow':r}};}}catch(c){throw c instanceof A?new y('LOGIN_REQUIRED',c['message']):new y(cy(0x200),cy(0x243)+c[cy(0x214)]);}}function qt(a){const cz=a0bp;return[...a][cz(0x23d)]()[cz(0x1eb)](',');}async function Xe(a){const cA=a0bp;try{if('tqJfP'===cA(0x237))d(cA(0x219),e);else{let d=await a[cA(0x24c)]();return{'message':typeof d?.['message']==cA(0x1e4)?d[cA(0x214)]:void 0x0,'code':typeof d?.[cA(0x229)]==cA(0x1e4)?d['code']:void 0x0,'raw':d};}}catch{return{};}}async function zt(a){const cB=a0bp;let c=await Xe(a);throw a['status']===0x191?new y(cB(0x200),cB(0x1b7),0x191,c[cB(0x11a)]):a['status']===0x193&&c[cB(0x229)]==='RANK_INSUFFICIENT'?new y(cB(0x24d),c[cB(0x214)]??cB(0x253),0x193,c[cB(0x11a)]):a[cB(0x1e7)]===0x1ad&&c['code']==='QUOTA_EXCEEDED'?new y(cB(0x205),c[cB(0x214)]??cB(0x1cc),0x1ad,c[cB(0x11a)]):a[cB(0x1e7)]>=0x1f4?new y(cB(0x156),c[cB(0x214)]??'backend\x20unavailable\x20('+a[cB(0x1e7)]+')',a[cB(0x1e7)],c[cB(0x11a)]):new y(cB(0x1ab),c[cB(0x214)]??cB(0x17f)+a[cB(0x1e7)]+')',a['status'],c[cB(0x11a)]);}async function ot(a,c){const cC=a0bp;try{return await fetch(a,c);}catch(d){if(cC(0x1f5)===cC(0x1e8))c(cC(0x251));else{let i=d instanceof Error?d[cC(0x214)]:String(d);throw new y(cC(0x156),cC(0x22e)+i);}}}async function Kt(d){const cD=a0bp;let h=qt(d),p=rt['get'](h);if(p&&Date['now']()<p[cD(0x245)]-Ke)return p['token'];let u=Ve(),H=qe()+'/auth/exchange',T=await ot(H,{'method':cD(0x20c),'headers':{'Content-Type':cD(0x239),'X-CLI-Token':u},'body':JSON[cD(0x136)]({'mcp_id':Ge,'requested_scopes':d})});T['ok']||await zt(T);let X=await T[cD(0x24c)](),a0=X?.[cD(0x234)]?.[cD(0x21b)],a1=X?.[cD(0x234)]?.['expires_in'];if(!X?.[cD(0x11f)]||typeof a0!=cD(0x1e4)||typeof a1!=cD(0x150))throw new y(cD(0x1ab),cD(0x174));return rt['set'](h,{'token':a0,'expiresAt':Date['now']()+a1*0x3e8}),a0;}function Je(a){rt['delete'](qt(a));}async function it(c,d,h,p){const cE=a0bp;let u=''+ze()+d,H=a0=>({'method':c,'headers':{'Authorization':cE(0x152)+a0,'Content-Type':cE(0x239)},'body':h!==void 0x0?JSON['stringify'](h):void 0x0}),T=await Kt([p]),X=await ot(u,H(T));return X[cE(0x1e7)]===0x191&&(Je([p]),T=await Kt([p]),X=await ot(u,H(T))),X['ok']||await zt(X),await X[cE(0x24c)]();}async function Vt(a){const cF=a0bp;return await it(cF(0x20c),'/monster/authorize-spawn',a,cF(0x1fc));}async function Xt(a){const cG=a0bp;return await it(cG(0x20c),cG(0x16a),{'session_id':a},'monster:write');}async function Jt(a){const cH=a0bp;let c=a===void 0x0?'/monster/sessions':cH(0x13e)+encodeURIComponent(a[cH(0x1eb)](','));return await it('GET',c,void 0x0,'monster:read');}import*as a0bb from'node:fs';import*as a0bc from'node:path';import{randomUUID as a0bd}from'node:crypto';import*as a0bf from'node:fs';import*as a0bg from'node:path';var We=[{'key':a0bp(0x13a),'arg':a0bp(0x20b)},{'key':a0bp(0x1f9),'arg':a0bp(0x179)},{'key':'UserPromptSubmit','arg':'user_prompt'},{'key':a0bp(0x1dd),'arg':'session_end'},{'key':a0bp(0x202),'arg':a0bp(0x15f)}],Qe=['Bash',a0bp(0x17e),'Write','Edit',a0bp(0x232),'Grep','WebFetch',a0bp(0x1ee),'Task',a0bp(0x1a9),a0bp(0x1d5)];function Ye(a,c){const cI=a0bp;let d=c??wt(),h={};for(let {key:i,arg:p}of We)h[i]=[{'matcher':'','hooks':[{'type':cI(0x1d2),'command':d+'\x20'+a+'\x20'+p}]}];return{'hooks':h,'permissions':{'allow':Qe}};}function Wt(a,c){const cJ=a0bp;let d=a0bg['join'](a,cJ(0x15c));a0bf[cJ(0x1f1)](d,{'recursive':!0x0});let h=a0bg[cJ(0x1eb)](d,cJ(0x21d)),i=Ye(c);return a0bf[cJ(0x248)](h,JSON['stringify'](i,null,0x2),cJ(0x151)),h;}function a0a(){const d2=['zxHPDa','Cxj2v1O','ve1vwf9qqvnurv9gquLmruq6ia','D29YA3nWywnL','5lIM5yIxiduG5lIk6zMq44gR6ygu44gx44gM44ge44g+44gz','CMvWBgfJzq','EuDxDhG','zgvSzxrL','AxngAw5PDgu','C3rKB3v0luvqsvbf','y29TBwfUza','mtGWndyZnMLRuvz1wG','ve1vwf9tuefxtL9gquLmruq','tM90zwjVB2TfzgL0','ywDLBNrFAwqGAxmGCMvXDwLYzwqGkg5VBI1LBxb0EsbZDhjPBMCP','5zg844gZ5yE644gx5ywdigfNzw50ioobRUITMowiPEwTKo+8Ios+IZOGDgvJAc1SzwfKlw1HAw4GlYb0zwnOlwXLywqTBwLRB3rVlwTHAwrLBI1ywo+8IEoaGNnPBMnLx3rZioECGEEvPEAzGUobRUobV+wpGUEfP+obLEocJooaGwn1CNnVCNnBywDLBNrFAwrDioocKUIhQUwlLsbMywXSyMfJAYdJGAJJGzFJGABKVB/NLkJJGilNQBRJGB7JGz/JGA/MNkRMJiFLRPRJGARJGOKGy3vYC29YioocKUs9V+ocJ+obMUwfQos7TIbZy2fU77Yi5B6m5PA55lQs5O+B77Yj44cc','Dgv4Da','vKDPuLG','ve1vwf9tuefxtL9gquLmruq6ia','D2f0y2HLCG','zvf0ELm','u2vZC2LVBKvUza','rw51yMe','zxHPC3rZu3LUyW','C3rVCf9TB25ZDgvY','Dg9Rzw4','BwLU','AgfZ','C3rYAw5N','DxvZCLe','5y+w5B6x6kgm5PwW44cczgvMyxvSDca1mooaGw1HEca1mddJGii','C3rHDhvZ','uu1Zv2u','C3rKAw4Ty2XVC2u','BMfTzq','AM9PBG','AxbJlwrPC2nVBM5Ly3q','C2vUzc1RzxLZ','v2vIu2vHCMnO','mZKYndeZmLj5wwPUrW','qMfJA2vUzevYCM9Y','BwTKAxjtEw5J','Bwv0yq','BM9KztPMCW','yMLU','t1fSrvy','B3DTChq','DgLTzw91Df9TAw4','BgfZDf9Hy3rPB25Fyxq','tM90AwzPy2f0Aw9U','B2jQzwn0','CgfYzw50lwDVBMu','Bw9UC3rLCJP3CML0zq','Dg11EcbHDhrHy2GGlxqG','y2XHDwrL','D3jPDgu','te9hsu5FuKvrvuLsruq','C2LUy2vFDhm','u3vIywDLBNrtDg9W','C3bHD25FDgLTzw91Da','Aw5JBhvKzv9ZDg9WCgvK','uvvpvefFrvHdruveruq','ywvZlti1nI1JyMm','CNvUBMLUzW','ChvZAa','CMvHC29U','zgLYBMfTzq','AwrSzq','ue9tva','r3DOu2C','C3rHCNrZv2L0Aa','Dg9ju09tDhjPBMC','Bw9UC3rLCNm','yxjNDw1LBNrZ','C2vZC2LVBI5SB2C','yMfZzw5HBwu','BwvZC2fNzq','z2v0x21VBNn0zxjFzxzLBNrZ','qK5ptwK','C3bHD25Lza','Dg11EcbZzxnZAw9Uia','Dw5Oyw5KBgvKuMvQzwn0Aw9U','ru5pru5u','ywnJzxnZx3rVA2vU','BM9Kzq','C2v0DgLUz3mUANnVBG','BM9KztPWyxrO','D2zSq2W','AcbHz28','lM1JCc5QC29U','5yID5zUE5OYh56s677Yi6ksh5PwW6kgm5y+V77Yj','n0XXq2vvAq','yMX1zwXHBxaX','DMvYC2LVBG','Bwf4rxzLBNruCW','y2XVC2u','zxzLBNrZlMXVzY4X','y29Kzq','zxzLBNrZ','cUkuGokuGokuGokuGaO','Bw9UC3rLCIdJGA4GDg11EcbWyw5LioACQ+wWVIboioIHJoocKUwpLUw+L+obMEocI++8Iefou0KGC3rYAxaG5RIi77Yj44cc','BwfYA19LDMvUDhnFC2vLBG','yMfJA2vUzcb1BNjLywnOywjSztOG','BwfW','BunsBe8','ihn0yxj0zwqk','r2XVyG','zNjVBq','zgf0yq','thrMBue','tKzfq3q','r1nvAe8','BgLZDc1Wyw5LCW','yxbWBgLJyxrPB24VANnVBG','Ahr0Chm6lY95yw1HDg92AxnPB24TBwnWlwjHy2TLBMqTmJm1ndi2nZC4mdm5lMfZAweTBM9YDgHLyxn0ms5YDw4UyxbWl2fWAq','Bw9UC3rLCL9PzcdJGB7JGz/JGA8GC2HVCNrFAwq','mtfpwKzNvwC','C29YDa','Dw5RBM93BG','D2HPy2G','rvbjueu','Bw9UC3rLCIdJGPlLGzZMRAlVViH0Bxv4igTPBgWTC2vZC2LVBU+8IEobLYb3yxrJAgvYioocKIbKzxrHy2GG44gz44kl44cc','CxvLCMLLza','q0XjihrVA2vUioIQREobV+I+VoobV+wKSEAvLZOG','qK5bDeS','zxHWAxjLC0f0','zw5K','ugPTDvy','D3jPDgvgAwXLu3LUyW','Cg9Asfu','tufyx0nptKnvuLjftLrFuKvbq0Hfra','w21VBNn0zxiTB3jJAgvZDhjHDg9YxsbIywnRzw5Kihn0B3btzxnZAw9UigzHAwXLzcaOBg9JywWGC3rVCcbZDgLSBcbZDwnJzwvKzwqPoIa','ANnVBG','uKfos19jtLnvrKzjq0LftLq','Aw52ywXPzcbMAwXLigzVCM1HDa','C3rKB3v0','Bwf4','u0Lhvevstq','C2vW','55Qg5lYD5lUL5lIk44gm5B+f6kAb44gN44gz','Bw9UC3rLCIa','reHtDwu','C3rKAw4Tzw5K','Bw9UC3rLCI1ZDg9WlwHVB2S','C3rVChbLzcbIEsb1C2vY','yNL0zuXLBMD0Aa','zxzLBNrZlMXVzYdJGAVOQjJPJllJGzxJGOZJGOVLGzZMRAlNKiBNLle','Bw9UC3rLCI0','Bw9UC3rLCIdJGA4Gy3DKioobP+obR+obQUobJYbGls1HzgqTzgLYycdJGAFOQQ3JGB/MM7JJGy3OQlhLJ6/JGzxJGOZJGOVOV73LIQaGCgf0Ao+8IoE1TUwVVUodKEocUE+8IEoaGMn3zcdJGA8GBw9UC3rLCIbOB21L77YiFI8Uy2XHDwrLl21VBNn0zxjZl3TPzh0V77Yj44gR5zU65A6A77YiAg9VAYdOQk3LRPRJGA7OP6pMSBRJGA7JGz/JGOhMHi/LM7pNMOtVViNJGilNNihNLAxMMylJGA8GFI8Uy2XHDwrLl21VBNn0zxjZl3TPzh0VD29YA3nWywnLlYdJGPlMLRdOPO/KVzZMIjdJGzCGls1HzgqTzgLYiowVVUIXOEobQoobMEocI+oaGG','y2XLyxi','AwqGyw5Kig1LC3nHz2uGyxjLihjLCxvPCMvK','sNDIDha','Bw9UC3rLCI1VCMnOzxn0CMf0B3iGzMf0ywW6ia','ueDvDfG','u0Lhsfvq','C2nYAxb0CW','DxrMltG','vND2CeS','CgfYC2u','cJ09pt09ia','CMf3','wurdBhK','DgvZDa','zgv0ywLSCW','Ag9TzwrPCG','C3vJy2vZCW','C25HChnOB3riyw5KBgvZ','C3rKAw4','svnpidG2mdeG5PMc5yI744cc44gt44gU5PMc5yI75lUL6zMn44gU44kK44oz44oZ44oi44ks5lUy5lIo','u0Lhsu5u','ic0TBwnWlwnVBMzPzYaI','zgLZy29UBMvJDa','yNj3vhi','C3vIDhLWzq','zgvJCNLWDcbMywLSzwq6ia','vgfHBeK','mtuWodqWntbTCfHWrwq','yM9VBgvHBG','ntvwuMzzBuG','DKHXrw8','C3rHDa','BM93','D2rVrxu','DxnLCL9WCM9TChq','C3bSAxq','D2f0y2G','BgLTAxq','C2vUDa','C3rYAw5NAwz5','zxzLBNrZlMXVz++8IcSGCM90yxrLioA4IcaUms8UmU+8IEobI+ocIsborePtt04G44kK44oz44oZ44oi44ks44oA44o844k444oZ44kW5y+w5B6x44gz44kl44ccBw9UC3rLCL9PzcaVihnPBMnLx3rZic8GzxzLBNrFDhLWzxmG44gN44ov44kJ44oR44k/44cbBgLTAxqG44gN5lU25PwW5yI26zMq77YizgvMyxvSDca1mooaGw1HEca1mddVViNJGij2mI4ZlJaG44gl44kjigfNzw50x2LKioocKUA4OEobMEobQcbZAw5Jzv90CYdNNihNLAxMMylJGASGC3rHDguUANnVBI5JDxjZB3jZw2fNzw50x2LKxsdJGPlOH6RLI5uGzMfSBgjHy2SG44gO44gx44gM5l2/44gg77Yi5yMn5zUEig1HCMTFzxzLBNrZx3nLzw4G44gN6kIy6yYY44gx44gF5PMc5yI75lUL6zMn44gU44g/5y+w5B6x77Yj44cc44og44od44kV44oQ44o844oj5z6ligfNzw50ioobRYbHz2vUDf9Pzd0NDgvJAc1SzwfKlw1HAw4NioETIEocKUAmH+wUMIaRiowpLUw+L+w+JcbTyxHFzxzLBNrFDhmG44gNig1HCMTFzxzLBNrZx3nLzw4G44ks5zg844g26ygl55sO44ks5O6O5AwO44cc','zxzLBNq','DgLTzw91Da','u3rVCa','zxzLBNrZlMXVzW','ywDLBNrFAwq','C3rVChbLza','l21VBNn0zxiVC2vZC2LVBNm/ywXPDMu9','vvvjrcdJGB7JGz/JGA8GC2HVCNrFAwtJGilNNihNLAxMMylJGA/LHAGGBw9UC3rLCUoaGG','CMvZCg9UC2u','nZm0ntziCxnjuMS','cVcFKQeG57Az57AA55UJ6kAwoIaVBg9VCca2mhmGl2nOzwnRlw1VBNn0zxjZ77Yi56I85yon44k844oT44gN6iEQ5BEX57wc5lQg77Yj','D29YA2rPCG','Dg11Ea','lM11C3vOAq','CMvHzcbMywLSzwq6ia','r09JBxa','BsbHz28','CgfYyw1Z','Dg11Ef9ZzxnZAw9U','AgfZlxnLC3nPB24','DgfZAYaOC3rYAw5NksbPCYbYzxf1AxjLza','Bw9UC3rLCI1VCMnOzxn0CMf0B3i','rw50zxi','whjWqvy','BNvTyMvY','DxrMoa','qMvHCMvYia','Dg11EcbZzw5KlwTLExmGzMfPBgvK','zvvyB1q','5PYa5AsN5lU25PwW44cczgvMyxvSDca1mooaGw1HEca1mddJGii','qKfds0vorf9vtKfwquLmqujmrq','DgfZAW','nduYoduXmLneEKDMsq','DhmGAxmGCMvXDwLYzwqGyw5Kig11C3qGyMuGsvnpidG2mdeGkguUzY4GmJaYnI0Wnc0ZmfqXmJOZndO1nLOP','zMHkrem','CMvZB2X2zq','lMnSyxvKzq','z2v0vgLTzq','Aw5PDgLHBf9JB250zxH0','C3vIywDLBNrFC3rVCa','CwvMyMK','C2L6zq','i3TWyw5Lx3bPzh0','q2TKrM4','icb8icdWN5oSioACGoAwSoocPoodMEodS+odIdOG','yxbWzw5KrMLSzq','ywrK','EeTXrgm','DMfSDwvZ','zMLSDgvY','l21VBNn0zxiVC3rVCa','y2fWDhvYzs1Wyw5L','ve1vwf9qqvnurv9gquLmruq','C3rKzxjY','yK5nDNu','swDcDKi','CMvHzezPBgu','C2XPy2u','AuDHs2e','zMXVB3i','Dg9Rzw4GzxHJAgfUz2uG44oS44k544oD44oZ44k544gm5lIn5Q2J44gN44gz77YiywnJzxnZx3rVA2vUic8GzxHWAxjLC19PBIdLJ5BLVPFKUi3LJ6/VViK','C3bHD25FBw9UC3rLCG','Efjgqwu','C2nHBM5Lzf9MAwXLCW','ic0TywrKlwrPCIaI','yxDHAxrPBMDFAw5WDxq','CMvUyw1L','Agv4','Bhn0vfm','z2v0','uMvHza','yMfJA2vUzcbLCNjVCIaO','CMvJzw50rxzLBNrZ','BwnWlxnLCNzLCG','r0zYq0W','Bwf4x2v2zw50x3rZ','Dg11EcbUzxCTC2vZC2LVBIbMywLSzwq','Bw9UC3rLCI1VCMnOzxn0CMf0B3iGtunqihnLCNzLCIb2','zxjYB3i','DwLjC0q','C3rHDguUANnVBG','mti3mJKYohr0z3DWDG','svnpidG2mdeG5PMc5yI744cc44gt44gU5PMc5yI75lUL6zMn44ks6l+u44gz44cc','BgLZDf9TB25ZDgvYCW','y3vYCMvUDa','DxbKyxrL','B2nSyKy','5zg844gZ5yE644gx5ywdigfNzw50ioobRUITMowiPEwTKo+8Ios+IZOGDgvJAc1SzwfKlw1HAw7VViNJGilNQBRMLOFLRzFKUi3LJ6/JGii','z3zfr04','tu9ou1rfuL9ot1rFuLvotKLorW','Dw5SAw5R','6ycb5l+H44gz44kl44oH44od44k744o844k477Yi5Ps56kgm5y+V77Yj','w21VBNn0zxiTB3jJAgvZDhjHDg9YxsbIywnRzw5KigXPC3rtzxnZAw9UCYbMywLSzwqGkgXVy2fSigXPC3qGC3rPBgWGCMv0DxjUzwqPoIa','DhjPBq','BgfZDf9Hy3rPB24','icJOQBpNTla6ia','CxvLCNLFBw9UC3rLCG','s3Duzvu','zxHWAxjLC19HDa','C2vZC2LVBI5SB2CUmq','Cg9YDgfSlxrVA2vUlMvUyW','A2v5CW','Bw9UC3rLCL9Pza','8j+tIIdNQlZLG43KUk06ia','Aw5KzxGUy2PZ','vKXtu2K','ig5VDcbMB3vUza','mteYmJe0neTuyxnhvq','igfSCMvHzhKGzxHPC3rZ','5ygC5Q2I5RIi44g/44ks5zcR44kb44kl77YizgvMyxvSDcbMywXZzE+8Iq','CYbHz28','BgvUz3rO','C2vUzf90B19TB25ZDgvY','vg9KB1DYAxrL','CgfJA2fNzs5QC29U','qKfds0vorf9fuLjpuG','ic0TzgfUz2vYB3vZBhKTC2TPCc1WzxjTAxnZAw9UCW','C3rHDfn5BMm','zxzLBNrZlMXVzY4Y','ywDLBNqG44gu44gO44gUigv2zw50CYdNORROQO3JGQVJG7ZJGR3JG6VJGPlMM7tMLRdJGzNJGOVJGijNzxrFBw9UC3rLCL9LDMvUDhmG44gN5y+w5B6x44gx44gFig1HEf9LDMvUDf90CYdJGPlMUkhJGzNJGzpJGAJJGAFJGihMRkhLM57LKiWGywDLBNrFAwqG44gN44gUigDLDf9TB25ZDgvYx2v2zw50CYdJGyZJGiZMNkRNORROQO3JGQtJG5NJG7pJG4JJGA7JGB/JGi3JGPlOV5tJGzNJGOJJGyBJGAVJGARJGOVJGijtDg9WigHVB2SGkh4VlMnSyxvKzs9OB29RCY9JAgvJAY1TB25ZDgvYlwv2zw50CY5ZAcKG44gO44gU6yEn6ksh5AcX5zgk6zIY5Q2I44gR44kc5l2/55sO44cc','tu9ou1rfuL9ot1rFuLvotKLorZOGy3vYCMvUDcbZDgf0DxmG','AgfZx21VCMu','ywXSB2m','zxzLBNrFDhLWzxm','C2v0','Cgf0DgvYBG','Dw5JyxvNAhrfEgnLChrPB24','q0XjihrVA2vUioobJoACQUIOREwUMIbVCIdLPlhLIRNJGihLHO0GAw5ZDgfSBcdJGzFJGABJGy/JGAdJGzxJGyq','Ahr0Chm6lY9HCgKUBw90B2HPlMPW','y2f0y2G','u1HQuM4','Ahr0Chm6lY9HCgKUBw90B2HPlMPWl2fWAs9IBhvLBgfTCa','C3rHDguUANnVBI50Bxa','C2HVCNrFAwq','q0XbvurflM1K','mu9UDwXIsq','C2vZC2LVBL9LBMq','C2fSDa','y29UBMvJDa','y2HHBMDL','BMv3lxnLC3nPB24','y3vYC29YCW','C3rVCa','C2v0uMvXDwvZDeHHBMrSzxi'];a0a=function(){return d2;};return a0a();}import{execFileSync as a0bh}from'node:child_process';import{existsSync as a0bi,realpathSync as a0bj,writeFileSync as a0bk}from'node:fs';import{dirname as a0bl,join as a0bm,resolve as a0bn}from'node:path';var rn=a0bp(0x1b8);function on(){return process.env.BLUELAMP_PORTAL_API_BASE_URL||rn;}function an(){const cK=a0bp;let a;try{if(cK(0x244)!=='smBjd')a=a0bh(cK(0x23f),[cK(0x224)],{'encoding':cK(0x116)})[cK(0x195)]();else return d[cK(0x168)](e['monsters'])[cK(0x169)](o=>o[cK(0x1e7)]==='running')['length'];}catch{return'vIcHN'===cK(0x111)?e[cK(0x1e2)](0x64+h[cK(0x173)](i/0x4),0x5dc):null;}if(!a||!a0bi(a))return null;let c;try{if(cK(0x113)!==cK(0x117))c=a0bj(a);else{for(let r of h)if(r[cK(0x1b5)][cK(0x11c)](i))return r;return null;}}catch{return null;}let d=a0bn(a0bl(c),'..'),h=a0bm(d,'lib',cK(0x181),cK(0x1a0));return a0bi(h)?h:null;}function Zt(a){const cL=a0bp;let c=an();if(!c)return null;let d=on(),h={'mcpServers':{'bluelamp':{'command':cL(0x21c),'args':[c],'env':{'PORTAL_URL':d}}}},i=a0bm(a,cL(0x221));return a0bk(i,JSON[cL(0x136)](h,null,0x2),cL(0x116)),i;}var un=process.env.MONSTER_CLAUDE_BIN??a0bp(0x1fe);function pn(){const cM=a0bp;let a=Number(process.env.MONSTER_MAX_CONCURRENT??0x5);return Number[cM(0x1d0)](a)?Math[cM(0x1e2)](Math[cM(0x250)](Math[cM(0x173)](a),0x1),0xa):0x5;}function mn(){const cN=a0bp;let a=Number(process.env.MONSTER_DEFAULT_TIMEOUT_MIN??0x168);return Number[cN(0x1d0)](a)?Math[cN(0x1e2)](Math[cN(0x250)](Math['floor'](a),0x12c),0x5a0):0x168;}var L=pn();function dn(a){const cO=a0bp;let c=a??mn();return Number['isFinite'](c)?Math['min'](Math[cO(0x250)](Math[cO(0x173)](c),0x12c),0x5a0):0x168;}async function te(T,a0){const cP=a0bp;if(!T['task']||typeof T['task']!=cP(0x1e4))throw new Error(cP(0x14c));let a1=await S(await m());if(j(a1)>=L){if(cP(0x16e)===cP(0x1c9)){let am=d[cP(0x132)]('\x0a'),ao=[];for(let ap of am)if(ap[cP(0x195)]())try{let aq=i[cP(0x118)](ap);aq&&aq['ts']&&aq['event']&&ao[cP(0x208)](aq);}catch{}return ao;}else{let am=new Error('MAX_CONCURRENT_REACHED:\x20running='+j(a1)+'\x20cap='+L);throw am[cP(0x229)]=cP(0x24a),am;}}let a2=a0bd(),a3=a2[cP(0x171)](0x0,0x8),a4=cP(0x25b)+a3;if(await G(a4))throw new Error(cP(0x218)+a4+cP(0x1a4));let a5=T[cP(0x143)]??ht(a2),a6=dn(T[cP(0x1f7)]);await Vt({'session_id':a2,'workdir':a5,'metadata':{'task_head':T[cP(0x157)][cP(0x171)](0x0,0xc8),'has_initial_context':!!T[cP(0x15e)],'timeout_min':a6}}),a0bb[cP(0x1f1)](a5,{'recursive':!0x0});let a7=O(a2);a0bb['mkdirSync'](a7,{'recursive':!0x0}),T[cP(0x15e)]&&a0bb[cP(0x248)](a0bc[cP(0x1eb)](a7,cP(0x1be)),T['initial_context'],'utf8'),Wt(a7,a2);let a8=a6,a9=new Date(),aa=new Date(a9[cP(0x15d)]()+a8*0xea60),ab=a5===a7||a5[cP(0x20e)](a7+a0bc[cP(0x252)])?'':cP(0x178)+a5+'\x22',ac=Zt(a7),ad=ac?cP(0x124)+ac+'\x22':'',af=un+cP(0x1ac)+ab+ad,ag=await Tt(a4,a7,af);if(!ag['ok']){if(cP(0x12d)!==cP(0x12d))return a0[cP(0x1eb)](h(i),cP(0x1cb));else{let ap=new Error('TMUX_SPAWN_FAILED:\x20'+ag[cP(0x186)]);throw ap[cP(0x229)]=cP(0x1d4),ap;}}let ah=await At(a4);if(!await kt(a4,0x2d)){let aq=await m(),ar={'id':a2,'short_id':a3,'tmux_session':a4,'workdir':a5,'task':T[cP(0x157)]['slice'](0x0,0xc8),'has_initial_context':!!T[cP(0x15e)],'spawned_at':a9[cP(0x20f)](),'expires_at':aa[cP(0x20f)](),'status':'running','last_action':cP(0x203),'last_action_at':new Date()['toISOString'](),'ready_timeout':!0x0,'pgid':ah};return aq[cP(0x210)][a2]=ar,await _(aq),await P(C(a2,a4,cP(0x203),{'pgid':ah??null,'timeout_sec':0x2d})),{'monster_id':a2,'short_id':a3,'tmux_session':a4,'workdir':a5,'spawned_at':a9[cP(0x20f)](),'ready_timeout':!0x0,'recovery_hint':'ready\x20signal\x20未検出。tmux\x20session\x20は存在。send_to_monster\x20でタスク再送可能'};}await new Promise(as=>setTimeout(as,0x320));let ai=await $(a4,T[cP(0x157)]);if(!ai['ok']){if(cP(0x1dc)!==cP(0x1dc))return!0x1;else{await b(a4);let au=new Error(cP(0x1ca)+ai[cP(0x186)]);throw au[cP(0x229)]=cP(0x16c),au;}}let aj={'id':a2,'short_id':a3,'tmux_session':a4,'workdir':a5,'task':T['task'][cP(0x171)](0x0,0xc8),'has_initial_context':!!T[cP(0x15e)],'spawned_at':a9[cP(0x20f)](),'expires_at':aa['toISOString'](),'status':'running','last_action':cP(0x217),'last_action_at':a9['toISOString'](),'ready_timeout':!0x1,'pgid':ah},ak=await m();return ak['monsters'][a2]=aj,await _(ak),await P(C(a2,a4,'spawned',{'pgid':ah??null,'initial_context':!!T[cP(0x15e)]})),Dt(a0,a2,a4),{'monster_id':a2,'short_id':a3,'tmux_session':a4,'workdir':a5,'spawned_at':aj['spawned_at'],'expires_at':aj['expires_at'],'ready_timeout':!0x1,'attach_command':cP(0x1fd)+a4};}async function ee(h,i){const cQ=a0bp;let H=await S(await m());await _(H);let X=h[cQ(0x204)]===!0x0,a0=Object[cQ(0x168)](H['monsters']),a1=a0[cQ(0x169)](a6=>a6[cQ(0x1e7)]==='running')[cQ(0x22f)](a6=>a6['id']);try{await Jt(a1);}catch(a6){let a7=a6 instanceof Error?a6[cQ(0x214)]:String(a6);process['stderr'][cQ(0x1ff)](cQ(0x194)+a7+'\x0a');}let a2=(X?a0:a0['filter'](a8=>a8[cQ(0x1e7)]===cQ(0x207)))[cQ(0x22f)](a8=>{const cR=cQ;let a9=I(i[cR(0x180)],a8['id']);return{'id':a8['id'],'short_id':a8[cR(0x1bd)],'tmux_session':a8['tmux_session'],'status':a8[cR(0x1e7)],'workdir':a8[cR(0x143)],'spawned_at':a8['spawned_at'],'expires_at':a8[cR(0x19a)],'task_head':a8['task'],'latest_event':a9?{'event':a9[cR(0x138)],'subtype':typeof a9[cR(0x1f2)]?.[cR(0x127)]=='string'?a9['meta'][cR(0x127)]:void 0x0,'ts':a9['ts']}:void 0x0};}),a3=a0[cQ(0x169)](a8=>a8['status']==='running')[cQ(0x1a7)],a4=xt(i[cQ(0x180)],h[cQ(0x201)],0x5),a5=a4['length']>0x0?a4[a4[cQ(0x1a7)]-0x1]['ts']:i['maxEventTs'];return{'total':a0[cQ(0x1a7)],'running':a3,'capacity':L,'monsters':a2,'recent_events':a4,'max_event_ts':a5};}async function ne(a){const cS=a0bp;if(typeof a?.[cS(0x13c)]!=cS(0x1e4)||a[cS(0x13c)][cS(0x195)]()[cS(0x1a7)]===0x0)throw new Error(cS(0x1d6));if(!Ft(a?.['ts']))throw new Error(cS(0x159));let c=q(a[cS(0x13c)]),d=await Bt(c,a['ts']);return{'agent_id':c,'ts':d[cS(0x18c)],'previous_ts':d['previous']};}async function se(c,d){const cT=a0bp;if(!c['id'])throw new Error('id\x20is\x20required');let h=await S(await m()),p=k(h,c['id']);if(!p)throw new Error(cT(0x254)+c['id']+'\x20not\x20found');let u=Math[cT(0x1e2)](Math[cT(0x250)](c['tail_lines']??0x32,0x1),0x1f4);if(p[cT(0x1e7)]!=='running'){let X=I(d[cT(0x180)],p['id']);return{'status':p[cT(0x1e7)],'tmux_session':p[cT(0x14a)],'tail_lines':u,'content':'','latest_event':X?{'event':X[cT(0x138)],'ts':X['ts']}:void 0x0};}let H=await D(p[cT(0x14a)],u);p['last_action']=cT(0x242),p[cT(0x1f8)]=new Date()['toISOString'](),await _(h);let T=I(d[cT(0x180)],p['id']);return{'status':p[cT(0x1e7)],'tmux_session':p[cT(0x14a)],'tail_lines':u,'content':H,'latest_event':T?{'event':T[cT(0x138)],'ts':T['ts']}:void 0x0};}async function re(a){const cU=a0bp;if(!a['id']||!a['message'])throw new Error(cU(0x110));let c=await S(await m()),d=k(c,a['id']);if(!d)throw new Error('monster\x20'+a['id']+cU(0x1a2));if(d[cU(0x1e7)]!==cU(0x207)){if('BcFXP'==='WLNgD')return c?.['code']===cU(0x21a)?{'monsters':{}}:{'monsters':{}};else{let u=new Error(cU(0x1b0)+d[cU(0x1e7)]);throw u[cU(0x229)]=cU(0x191),u;}}let h=await $(d['tmux_session'],a[cU(0x214)]);if(!h['ok']){if(cU(0x1a1)!==cU(0x1a1))return!0x1;else{let T=new Error(cU(0x1ca)+h[cU(0x186)]);throw T['code']=cU(0x16c),T;}}let i=new Date()[cU(0x20f)]();return d[cU(0x196)]=cU(0x135),d[cU(0x1f8)]=i,await _(c),{'sent_at':i,'monster_id':d['id'],'bytes_sent':h['bytes']};}async function oe(a,c){const cV=a0bp;if(!a['id'])throw new Error('id\x20is\x20required');let d=await S(await m()),h=k(d,a['id']);if(!h)throw new Error(cV(0x254)+a['id']+'\x20not\x20found');if(!h['id'])throw new Error('stop:\x20resolved\x20monster\x20has\x20no\x20id\x20(state\x20corruption)');let p=a[cV(0x209)]??cV(0x258);h[cV(0x1e7)]===cV(0x207)&&await b(h[cV(0x14a)]),h[cV(0x1e7)]='stopped',h['last_action']='stopped:\x20'+p,h[cV(0x1f8)]=new Date()[cV(0x20f)](),await _(d),$t(c,h['id']),await P(C(h['id'],h[cV(0x14a)],cV(0x13d),{'reason':p}));try{if(cV(0x1ba)!==cV(0x236))await Xt(h['id']);else throw new d(cV(0x128)+c[cV(0x214)]);}catch(H){if(cV(0x14f)!==cV(0x14f))throw n instanceof H?new p('LOGIN_REQUIRED',r[cV(0x214)]):new s('LOGIN_REQUIRED',cV(0x243)+a[cV(0x214)]);else{let X=H instanceof Error?H[cV(0x214)]:String(H);process[cV(0x16d)]['write'](cV(0x24b)+X+'\x0a');}}return{'stopped_at':h[cV(0x1f8)],'monster_id':h['id'],'reason':p,'remaining_running':j(d)};}var wn=[{'name':a0bp(0x175),'description':'新しい\x20monster(独立\x20tmux\x20session\x20の\x20Claude\x20Code\x20CLI)を起動し、初回\x20task\x20を送信する。ready\x20signal\x20を\x2045\x20秒以内に検出できない場合は\x20spawn_timeout\x20応答を返す(tmux\x20session\x20は残存、send_to_monster\x20でリカバリ可能)。.claude/settings.json\x20に\x205\x20種\x20hook\x20を注入して\x20events.log\x20に状態遷移を記録。','inputSchema':{'type':a0bp(0x1fa),'properties':{'task':{'type':'string','description':a0bp(0x222)},'workdir':{'type':a0bp(0x1e4),'description':a0bp(0x10e)},'initial_context':{'type':a0bp(0x1e4),'description':'CLAUDE.md\x20に書き込む追加コンテキスト(任意)'},'timeout_min':{'type':a0bp(0x150),'description':'自動停止までの分数。default\x20360\x20(6h)、min\x20300\x20(5h)、max\x201440\x20(24h)。'}},'required':[a0bp(0x157)]}},{'name':a0bp(0x18b),'description':'全\x20monster\x20を列挙(reconcile\x20+\x20未読イベント最新\x205\x20件を添付)。include_stopped=true\x20で停止済みも返す。since_ts\x20指定でその時刻以降のイベントを\x20recent_events\x20として返す。','inputSchema':{'type':'object','properties':{'include_stopped':{'type':a0bp(0x12b),'description':a0bp(0x1a5)},'since_ts':{'type':a0bp(0x1e4),'description':a0bp(0x122)}}}},{'name':a0bp(0x198),'description':a0bp(0x22c),'inputSchema':{'type':a0bp(0x1fa),'properties':{'id':{'type':a0bp(0x1e4),'description':'monster_id(UUID)または\x20short_id(8\x20文字)'},'tail_lines':{'type':a0bp(0x150),'description':a0bp(0x1e6)}},'required':['id']}},{'name':a0bp(0x1a8),'description':'monster\x20に追加指示を送信する(tmux\x20send-keys\x20-l\x20直送信方式、load-buffer/paste-buffer\x20は使わない)。','inputSchema':{'type':a0bp(0x1fa),'properties':{'id':{'type':a0bp(0x1e4),'description':'monster_id\x20または\x20short_id'},'message':{'type':a0bp(0x1e4),'description':a0bp(0x193)}},'required':['id',a0bp(0x214)]}},{'name':a0bp(0x1e0),'description':a0bp(0x241),'inputSchema':{'type':a0bp(0x1fa),'properties':{'id':{'type':a0bp(0x1e4),'description':a0bp(0x23b)},'reason':{'type':'string','description':a0bp(0x25a)}},'required':['id']}},{'name':a0bp(0x215),'description':a0bp(0x137),'inputSchema':{'type':a0bp(0x1fa),'properties':{'monster_id':{'type':a0bp(0x1e4),'description':a0bp(0x13f)},'since_ts':{'type':a0bp(0x1e4),'description':a0bp(0x18a)},'event_types':{'type':'array','items':{'type':'string','enum':['spawned',a0bp(0x203),a0bp(0x20b),a0bp(0x179),a0bp(0x131),a0bp(0x1c0),a0bp(0x15f),'stopped',a0bp(0x186)]}},'limit':{'type':a0bp(0x150),'description':a0bp(0x155)},'agent_id':{'type':a0bp(0x1e4),'description':a0bp(0x1d7)}}}},{'name':a0bp(0x22d),'description':a0bp(0x1af),'inputSchema':{'type':a0bp(0x1fa),'properties':{'agent_id':{'type':'string','description':a0bp(0x18f)},'ts':{'type':a0bp(0x1e4),'description':'ISO\x208601\x20時刻。通常は直前\x20get_monster_events\x20の\x20max_event_ts\x20をそのまま渡す。'}},'required':[a0bp(0x13c),'ts']}}];async function ie(d,h){const cW=a0bp;let p=JSON[cW(0x136)](h,null,0x2),u=await m(),H=Object[cW(0x168)](u[cW(0x210)]),T=H['filter'](a2=>a2[cW(0x1e7)]===cW(0x207))[cW(0x1a7)],X=new Map(H['map'](a2=>[a2['id'],a2])),a0=I(d['recentEvents']),a1=vt({'runningCount':T,'capacity':L,'latestEvent':a0,'monstersById':X});return a1?''+p+a1:p;}function Sn(a){const cX=a0bp;let c=a instanceof Error?a['message']:String(a),d=a&&typeof a==cX(0x1fa)&&cX(0x229)in a?String(a[cX(0x229)]):void 0x0;return{'msg':c,'code':d};}async function gn(a,c,d){const cY=a0bp;switch(a){case cY(0x175):return te(c,d);case cY(0x18b):return ee(c,d);case'query_monster':return se(c,d);case cY(0x1a8):return re(c);case cY(0x1e0):return oe(c,d);case cY(0x215):return Ht(c);case cY(0x22d):return ne(c);default:throw new Error('unknown\x20tool:\x20'+a);}}async function yn(){const cZ=a0bp;Lt();let d=await Pt();Ct(d);let h=new a0aM({'name':cZ(0x14d),'version':'2.3.0'},{'capabilities':{'tools':{}}});h[cZ(0x1c7)](a0aP,async()=>({'tools':wn})),h[cZ(0x1c7)](a0aO,async H=>{const d0=cZ;let T=H['params']['name'],X=H[d0(0x149)][d0(0x211)]??{};try{let a0=await gn(T,X,d);return{'content':[{'type':d0(0x1d8),'text':await ie(d,a0)}]};}catch(a1){let {msg:a2,code:a3}=Sn(a1);return{'content':[{'type':d0(0x1d8),'text':await ie(d,{'error':a2,'code':a3})}],'isError':!0x0};}});let p=new a0aN();await h[cZ(0x1c2)](p);let u='unknown';try{if(cZ(0x126)===cZ(0x126)){let {readFileSync:H}=await import(cZ(0x1f3)),{fileURLToPath:T}=await import('node:url'),{dirname:X,join:a0}=await import(cZ(0x21e)),a1=a0(X(T(import.meta.url)),'..',cZ(0x1aa));u=JSON['parse'](H(a1,'utf-8'))[cZ(0x225)]||cZ(0x23e);}else d?.['code']===cZ(0x240)&&e(cZ(0x1d1));}catch{}process['stderr']['write'](cZ(0x185)+u+cZ(0x231));}yn()[a0bp(0x1b9)](a=>{const d1=a0bp;process[d1(0x16d)]['write'](d1(0x112)+String(a)+'\x0a'),process['exit'](0x1);});
@@ -0,0 +1,73 @@
1
+ {
2
+ "mcpId": "monster-orchestrator",
3
+ "name": "Monster Orchestrator",
4
+ "description": "Claude Code CLI を独立サブプロセス(tmux session)として起動・送信・監視・停止する。v2.0.0 から ready signal polling / spawn_timeout / events.log NDJSON + ローテーション / Claude Code 5種 hook 注入 / 60秒ごとの session.log スナップショットに対応。v2.1 から spawn / stop / list は BlueLamp 認証(X-CLI-Token)必須で、皆伝(tenant_rank>=4)以上が並列 5 セッションまで利用可能。v2.3 から agent 別の events 確認カーソル(state.json.cursors)と mark_events_seen tool を追加し、未確認 awaiting_input / stopped を能動把握できる(推奨運用: get_monster_events に agent_id を渡し、取得後 max_event_ts を mark_events_seen で記録)。v3.0.0 から backend を yamatovision-mcp-backend に分離(Phase 103-A.3、 mikoto 社 Tier 2 MCP 専用 backend)。JWT exchange は mikoto-backend (api.motohi.jp/api/bluelamp/auth/exchange) のまま、 monster API のみ yamatovision-mcp-backend に向く。主エージェントが複数 monster を並列制御する汎用オーケストレータ。",
5
+ "category": "automation",
6
+ "tier": 2,
7
+ "tenantSlug": "mikoto",
8
+ "allowedMinRank": 4,
9
+ "hosting": {
10
+ "type": "local"
11
+ },
12
+ "entryPoint": "dist-obf/index.js",
13
+ "configTarget": "home-mcp",
14
+ "needsNpmInstall": true,
15
+ "requiredEnvVars": [],
16
+ "optionalEnvVars": [
17
+ "BLUELAMP_API_BASE_URL",
18
+ "MIKOTO_API_BASE_URL",
19
+ "MONSTER_MAX_CONCURRENT",
20
+ "MONSTER_DEFAULT_TIMEOUT_MIN",
21
+ "MONSTER_CLAUDE_BIN",
22
+ "MONSTER_HOOK_PATH"
23
+ ],
24
+ "externalApi": {
25
+ "enabled": true,
26
+ "baseUrl": "https://yamatovision-mcp-backend-235426778039.asia-northeast1.run.app/api",
27
+ "audience": "https://yamatovision-mcp-backend-235426778039.asia-northeast1.run.app",
28
+ "scopes": [
29
+ "monster:read",
30
+ "monster:write"
31
+ ],
32
+ "tokenLifetime": 600,
33
+ "description": "mikoto 社 Tier 2 専用 yamatovision-mcp-backend の Monster Session API(Phase 103-A.3 で分離)"
34
+ },
35
+ "tags": [
36
+ "orchestrator",
37
+ "tmux",
38
+ "claude",
39
+ "parallel",
40
+ "monster",
41
+ "agent"
42
+ ],
43
+ "tools": [
44
+ {
45
+ "name": "spawn_monster",
46
+ "description": "新しい monster(Claude Code CLI tmux session)を起動し初回 task を送信する。ready signal を 45 秒以内に検出できなければ spawn_timeout 応答を返す。BlueLamp backend の authorize-spawn で皆伝(tenant_rank>=4)以上 / 並列 5 までを enforce。なお `workdir` 引数は monster の cwd ではなく `--add-dir` で読み書き許可される追加 path。cwd は monster home(~/.claude/monsters/{id}/)に固定され、hook 設定の解決のためこの設計は意図的。"
47
+ },
48
+ {
49
+ "name": "list_monsters",
50
+ "description": "稼働中・停止済みを含む全 monster を列挙し、未読イベント最新 5 件を添付する。手元の active tmux session を backend に報告して stale 検知も走らせる。"
51
+ },
52
+ {
53
+ "name": "query_monster",
54
+ "description": "monster の tmux pane 末尾 N 行を取得する(ANSI strip 済、デフォルト 50 行)。"
55
+ },
56
+ {
57
+ "name": "send_to_monster",
58
+ "description": "monster に追加指示を送信する(tmux send-keys -l 直送信方式)。"
59
+ },
60
+ {
61
+ "name": "stop_monster",
62
+ "description": "monster を停止(tmux kill-session)し watcher を detach する。backend 側 session 行も stopped に更新。"
63
+ },
64
+ {
65
+ "name": "get_monster_events",
66
+ "description": "events.log(+ rotate 済ファイル)から NDJSON イベントをページング取得する(since_ts / event_types / limit フィルタ対応)。v2.3.0 から agent_id を渡すと since_ts 省略時に state.json.cursors[agent_id] を自動 fallback として使い、未確認イベントだけを返す。テックリード型 agent は agent_id='tech-lead-main'(皆伝個別なら 'tech-lead-mikoto-kaiden-{slug}')を毎ターン渡し、取得後 max_event_ts で mark_events_seen を呼ぶ運用が標準。"
67
+ },
68
+ {
69
+ "name": "mark_events_seen",
70
+ "description": "agent ごとの events 確認カーソルを更新する(state.json.cursors[agent_id] = ts)。get_monster_events で取得した max_event_ts を渡すことで、次回呼び出しが「未確認イベントのみ」を返す。Stop hook (~/.claude/hooks/check-monster-events.sh) と協調し重複報告を防止。agent_id は呼び出し元 agent が自由に命名(例: tech-lead-main / tech-lead-mikoto-kaiden-XX)。"
71
+ }
72
+ ]
73
+ }
@@ -0,0 +1,33 @@
1
+ {
2
+ "name": "monster-orchestrator",
3
+ "version": "3.0.0",
4
+ "type": "module",
5
+ "main": "dist-obf/index.js",
6
+ "bin": {
7
+ "monster-orchestrator": "dist-obf/index.js"
8
+ },
9
+ "files": [
10
+ "dist-obf/",
11
+ "manifest.json",
12
+ "README.md"
13
+ ],
14
+ "engines": {
15
+ "node": ">=20"
16
+ },
17
+ "scripts": {
18
+ "build": "tsc",
19
+ "build:obfuscated": "bash scripts/build-obfuscated.sh",
20
+ "test": "vitest run"
21
+ },
22
+ "dependencies": {
23
+ "@modelcontextprotocol/sdk": "^1.0.0",
24
+ "chokidar": "^3.6.0"
25
+ },
26
+ "devDependencies": {
27
+ "@types/node": "^22.10.2",
28
+ "esbuild": "^0.28.0",
29
+ "javascript-obfuscator": "^5.4.1",
30
+ "typescript": "^5.7.2",
31
+ "vitest": "^4.1.5"
32
+ }
33
+ }
package/manifest.json ADDED
@@ -0,0 +1,73 @@
1
+ {
2
+ "mcpId": "monster-orchestrator",
3
+ "name": "Monster Orchestrator",
4
+ "description": "Claude Code CLI を独立サブプロセス(tmux session)として起動・送信・監視・停止する。v2.0.0 から ready signal polling / spawn_timeout / events.log NDJSON + ローテーション / Claude Code 5種 hook 注入 / 60秒ごとの session.log スナップショットに対応。v2.1 から spawn / stop / list は BlueLamp 認証(X-CLI-Token)必須で、皆伝(tenant_rank>=4)以上が並列 5 セッションまで利用可能。v2.3 から agent 別の events 確認カーソル(state.json.cursors)と mark_events_seen tool を追加し、未確認 awaiting_input / stopped を能動把握できる(推奨運用: get_monster_events に agent_id を渡し、取得後 max_event_ts を mark_events_seen で記録)。v3.0.0 から backend を yamatovision-mcp-backend に分離(Phase 103-A.3、 mikoto 社 Tier 2 MCP 専用 backend)。JWT exchange は mikoto-backend (api.motohi.jp/api/bluelamp/auth/exchange) のまま、 monster API のみ yamatovision-mcp-backend に向く。主エージェントが複数 monster を並列制御する汎用オーケストレータ。",
5
+ "category": "automation",
6
+ "tier": 2,
7
+ "tenantSlug": "mikoto",
8
+ "allowedMinRank": 4,
9
+ "hosting": {
10
+ "type": "local"
11
+ },
12
+ "entryPoint": "dist-obf/index.js",
13
+ "configTarget": "home-mcp",
14
+ "needsNpmInstall": true,
15
+ "requiredEnvVars": [],
16
+ "optionalEnvVars": [
17
+ "BLUELAMP_API_BASE_URL",
18
+ "MIKOTO_API_BASE_URL",
19
+ "MONSTER_MAX_CONCURRENT",
20
+ "MONSTER_DEFAULT_TIMEOUT_MIN",
21
+ "MONSTER_CLAUDE_BIN",
22
+ "MONSTER_HOOK_PATH"
23
+ ],
24
+ "externalApi": {
25
+ "enabled": true,
26
+ "baseUrl": "https://yamatovision-mcp-backend-235426778039.asia-northeast1.run.app/api",
27
+ "audience": "https://yamatovision-mcp-backend-235426778039.asia-northeast1.run.app",
28
+ "scopes": [
29
+ "monster:read",
30
+ "monster:write"
31
+ ],
32
+ "tokenLifetime": 600,
33
+ "description": "mikoto 社 Tier 2 専用 yamatovision-mcp-backend の Monster Session API(Phase 103-A.3 で分離)"
34
+ },
35
+ "tags": [
36
+ "orchestrator",
37
+ "tmux",
38
+ "claude",
39
+ "parallel",
40
+ "monster",
41
+ "agent"
42
+ ],
43
+ "tools": [
44
+ {
45
+ "name": "spawn_monster",
46
+ "description": "新しい monster(Claude Code CLI tmux session)を起動し初回 task を送信する。ready signal を 45 秒以内に検出できなければ spawn_timeout 応答を返す。BlueLamp backend の authorize-spawn で皆伝(tenant_rank>=4)以上 / 並列 5 までを enforce。なお `workdir` 引数は monster の cwd ではなく `--add-dir` で読み書き許可される追加 path。cwd は monster home(~/.claude/monsters/{id}/)に固定され、hook 設定の解決のためこの設計は意図的。"
47
+ },
48
+ {
49
+ "name": "list_monsters",
50
+ "description": "稼働中・停止済みを含む全 monster を列挙し、未読イベント最新 5 件を添付する。手元の active tmux session を backend に報告して stale 検知も走らせる。"
51
+ },
52
+ {
53
+ "name": "query_monster",
54
+ "description": "monster の tmux pane 末尾 N 行を取得する(ANSI strip 済、デフォルト 50 行)。"
55
+ },
56
+ {
57
+ "name": "send_to_monster",
58
+ "description": "monster に追加指示を送信する(tmux send-keys -l 直送信方式)。"
59
+ },
60
+ {
61
+ "name": "stop_monster",
62
+ "description": "monster を停止(tmux kill-session)し watcher を detach する。backend 側 session 行も stopped に更新。"
63
+ },
64
+ {
65
+ "name": "get_monster_events",
66
+ "description": "events.log(+ rotate 済ファイル)から NDJSON イベントをページング取得する(since_ts / event_types / limit フィルタ対応)。v2.3.0 から agent_id を渡すと since_ts 省略時に state.json.cursors[agent_id] を自動 fallback として使い、未確認イベントだけを返す。テックリード型 agent は agent_id='tech-lead-main'(皆伝個別なら 'tech-lead-mikoto-kaiden-{slug}')を毎ターン渡し、取得後 max_event_ts で mark_events_seen を呼ぶ運用が標準。"
67
+ },
68
+ {
69
+ "name": "mark_events_seen",
70
+ "description": "agent ごとの events 確認カーソルを更新する(state.json.cursors[agent_id] = ts)。get_monster_events で取得した max_event_ts を渡すことで、次回呼び出しが「未確認イベントのみ」を返す。Stop hook (~/.claude/hooks/check-monster-events.sh) と協調し重複報告を防止。agent_id は呼び出し元 agent が自由に命名(例: tech-lead-main / tech-lead-mikoto-kaiden-XX)。"
71
+ }
72
+ ]
73
+ }
package/package.json ADDED
@@ -0,0 +1,33 @@
1
+ {
2
+ "name": "monster-orchestrator",
3
+ "version": "3.0.0",
4
+ "type": "module",
5
+ "main": "dist-obf/index.js",
6
+ "bin": {
7
+ "monster-orchestrator": "dist-obf/index.js"
8
+ },
9
+ "files": [
10
+ "dist-obf/",
11
+ "manifest.json",
12
+ "README.md"
13
+ ],
14
+ "engines": {
15
+ "node": ">=20"
16
+ },
17
+ "scripts": {
18
+ "build": "tsc",
19
+ "build:obfuscated": "bash scripts/build-obfuscated.sh",
20
+ "test": "vitest run"
21
+ },
22
+ "dependencies": {
23
+ "@modelcontextprotocol/sdk": "^1.0.0",
24
+ "chokidar": "^3.6.0"
25
+ },
26
+ "devDependencies": {
27
+ "@types/node": "^22.10.2",
28
+ "esbuild": "^0.28.0",
29
+ "javascript-obfuscator": "^5.4.1",
30
+ "typescript": "^5.7.2",
31
+ "vitest": "^4.1.5"
32
+ }
33
+ }