MCPcopy Index your code
hub / github.com/ChinaSiro/claude-code-sourcemap / tqY

Function tqY

package/cli.js:3806–3806  ·  view source on GitHub ↗
(q,K,_)

Source from the content-addressed store, hash-verified

3804\`\`\`
3805
3806Approving shutdown terminates your process. Rejecting plan sends the teammate back to revise. Don't originate \`shutdown_request\` unless asked. Don't send structured JSON status messages — use TaskUpdate.
3807`.trim()}var cMK="Send a message to another agent";function nMK(q){if(typeof q.message!=="object"||q.message===null)return null;if(q.message.type==="plan_approval_response")return q.message.approve?`approve plan from: ${q.to}`:`reject plan from: ${q.to}`;return null}function iMK(q,K,{verbose:_}){let z=typeof q==="string"?r8(q):q;if("routing"in z&&z.routing)return null;if("request_id"in z&&"target"in z)return null;return M67.default.createElement(s8,null,M67.default.createElement(k,{dimColor:!0},z.message))}var M67;var rMK=y(()=>{gK();s6();l8();M67=O6(D6(),1)});var oMK={};T8(oMK,{SendMessageTool:()=>z4Y});function oqY(q,K){let _=q.teamContext?.teammates;if(!_)return;for(let z of Object.values(_))if("name"in z&&z.name===K)return z.color;return}async function aqY(q,K,_,z){let Y=z.getAppState(),$=$9(Y.teamContext),A=M_()||($Y()?"teammate":wz),O=vj();await R_(q,{from:A,text:K,summary:_,timestamp:new Date().toISOString(),color:O},$);let w=oqY(Y,q);return{data:{success:!0,message:`Message sent to ${q}'s inbox`,routing:{sender:A,senderColor:O,target:`@${q}`,targetColor:w,summary:_,content:K}}}}async function sqY(q,K,_){let z=_.getAppState(),Y=$9(z.teamContext);if(!Y)throw Error("Not in a team context. Create a team with Teammate spawnTeam first, or set CLAUDE_CODE_TEAM_NAME.");let $=await jb(Y);if(!$)throw Error(`Team "${Y}" does not exist`);let A=M_()||($Y()?"teammate":wz);if(!A)throw Error("Cannot broadcast: sender name is required. Set CLAUDE_CODE_AGENT_NAME.");let O=vj(),w=[];for(let j of $.members){if(j.name.toLowerCase()===A.toLowerCase())continue;w.push(j.name)}if(w.length===0)return{data:{success:!0,message:"No teammates to broadcast to (you are the only team member)",recipients:[]}};for(let j of w)await R_(j,{from:A,text:q,summary:K,timestamp:new Date().toISOString(),color:O},Y);return{data:{success:!0,message:`Message broadcast to ${w.length} teammate(s): ${w.join(", ")}`,recipients:w,routing:{sender:A,senderColor:O,target:"@team",summary:K,content:q}}}}async function tqY(q,K,_){let z=_.getAppState(),Y=$9(z.teamContext),$=M_()||wz,A=jE6("shutdown",q),O=DE6({requestId:A,from:$,reason:K});return await R_(q,{from:$,text:g6(O),timestamp:new Date().toISOString(),color:vj()},Y),{data:{success:!0,message:`Shutdown request sent to ${q}. Request ID: ${A}`,request_id:A,target:q}}}async function eqY(q,K){let _=$9(),z=NP(),Y=M_()||"teammate";N(`[SendMessageTool] handleShutdownApproval: teamName=${_}, agentId=${z}, agentName=${Y}`);let $,A;if(_){let w=await jb(_);if(w&&z){let j=w.members.find((H)=>H.agentId===z);if(j)$=j.tmuxPaneId,A=j.backendType}}let O=Mi1({requestId:q,from:Y,paneId:$,backendType:A});if(await R_(wz,{from:Y,text:g6(O),timestamp:new Date().toISOString(),color:vj()},_),A==="in-process"){if(N(`[SendMessageTool] In-process teammate ${Y} approving shutdown - signaling abort`),z){let w=K.getAppState(),j=kQ(z,w.tasks);if(j?.abortController)j.abortController.abort(),N(`[SendMessageTool] Aborted controller for in-process teammate ${Y}`);else N(`[SendMessageTool] Warning: Could not find task/abortController for ${Y}`)}}else{if(z){let w=K.getAppState(),j=kQ(z,w.tasks);if(j?.abortController)return N(`[SendMessageTool] Fallback: Found in-process task for ${Y} via AppState, aborting`),j.abortController.abort(),{data:{success:!0,message:`Shutdown approved (fallback path). Agent ${Y} is now exiting.`,request_id:q}}}setImmediate(async()=>{await xK(0,"other")})}return{data:{success:!0,message:`Shutdown approved. Sent confirmation to team-lead. Agent ${Y} is now exiting.`,request_id:q}}}async function q4Y(q,K){let _=$9(),z=M_()||"teammate",Y=Xi1({requestId:q,from:z,reason:K});return await R_(wz,{from:z,text:g6(Y),timestamp:new Date().toISOString(),color:vj()},_),{data:{success:!0,message:`Shutdown rejected. Reason: "${K}". Continuing to work.`,request_id:q}}}async function K4Y(q,K,_){let z=_.getAppState(),Y=z.teamContext?.teamName;if(!MG(z.teamContext))throw Error("Only the team lead can approve plans. Teammates cannot approve their own or other plans.");let $=z.toolPermissionContext.mode,A=$==="plan"?"default":$,O={type:"plan_approval_response",requestId:K,approved:!0,timestamp:new Date().toISOString(),permissionMode:A};return await R_(q,{from:wz,text:g6(O),timestamp:new Date().toISOString()},Y),{data:{success:!0,message:`Plan approved for ${q}. They will receive the approval and can proceed with implementation.`,request_id:K}}}async function _4Y(q,K,_,z){let Y=z.getAppState(),$=Y.teamContext?.teamName;if(!MG(Y.teamContext))throw Error("Only the team lead can reject plans. Teammates cannot reject their own or other plans.");let A={type:"plan_approval_response",requestId:K,approved:!1,feedback:_,timestamp:new Date().toISOString()};return await R_(q,{from:wz,text:g6(A),timestamp:new Date().toISOString()},$),{data:{success:!0,message:`Plan rejected for ${q} with feedback: "${_}"`,request_id:K}}}var iqY,rqY,z4Y;var aMK=y(()=>{x7();v8();j67();Bq();Hb();gP();gm8();M0();i$();_8();y8();U7();RA();TK6();l8();RD();AY();RJ();H67();rMK();iqY=B6(()=>L.discriminatedUnion("type",[L.object({type:L.literal("shutdown_request"),reason:L.string().optional()}),L.object({type:L.literal("shutdown_response"),request_id:L.string(),approve:BX(),reason:L.string().optional()}),L.object({type:L.literal("plan_approval_response"),request_id:L.string(),approve:BX(),feedback:L.string().optional()})])),rqY=B6(()=>L.object({to:L.string().describe('Recipient: teammate name, or "*" for broadcast to all teammates'),summary:L.string().optional().describe("A 5-10 word summary shown as a preview in the UI (required when message is a string)"),message:L.union([L.string().describe("Plain text message content"),iqY()])}));z4Y=sq({name:wD,searchHint:"send messages to agent teammates (swarm protocol)",maxResultSizeChars:1e5,userFacingName(){return"SendMessage"},get inputSchema(){return rqY()},shouldDefer:!0,isEnabled(){return nq()},isReadOnly(q){return typeof q.message==="string"},backfillObservableInput(q){if("type"in q)return;if(typeof q.to!=="string")return;if(q.to==="*"){if(q.type="broadcast",typeof q.message==="string")q.content=q.message}else if(typeof q.message==="string")q.type="message",q.recipient=q.to,q.content=q.message;else if(typeof q.message==="object"&&q.message!==null){let K=q.message;if(q.type=K.type,q.recipient=q.to,K.request_id!==void 0)q.request_id=K.request_id;if(K.approve!==void 0)q.approve=K.approve;let _=K.reason??K.feedback;if(_!==void 0)q.content=_}},toAutoClassifierInput(q){if(typeof q.message==="string")return`to ${q.to}: ${q.message}`;switch(q.message.type){case"shutdown_request":return`shutdown_request to ${q.to}`;case"shutdown_response":return`shutdown_response ${q.message.approve?"approve":"reject"} ${q.message.request_id}`;case"plan_approval_response":return`plan_approval ${q.message.approve?"approve":"reject"} to ${q.to}`}},async checkPermissions(q,K){return{behavior:"allow",updatedInput:q}},async validateInput(q,K){if(q.to.trim().length===0)return{result:!1,message:"to must not be empty",errorCode:9};let _=pMK(q.to);if((_.scheme==="bridge"||_.scheme==="uds")&&_.target.trim().length===0)return{result:!1,message:"address target must not be empty",errorCode:9};if(q.to.includes("@"))return{result:!1,message:'to must be a bare teammate name or "*" — there is only one team per session',errorCode:9};if(typeof q.message==="string"){if(!q.summary||q.summary.trim().length===0)return{result:!1,message:"summary is required when message is a string",errorCode:9};return{result:!0}}if(q.to==="*")return{result:!1,message:'structured messages cannot be broadcast (to: "*")',errorCode:9};if(q.message.type==="shutdown_response"&&q.to!==wz)return{result:!1,message:`shutdown_response must be sent to "${wz}"`,errorCode:9};if(q.message.type==="shutdown_response"&&!q.message.approve&&(!q.message.reason||q.message.reason.trim().length===0))return{result:!1,message:"reason is required when rejecting a shutdown request",errorCode:9};return{result:!0}},async description(){return cMK},async prompt(){return lMK()},mapToolResultToToolResultBlockParam(q,K){return{tool_use_id:K,type:"tool_result",content:[{type:"text",text:g6(q)}]}},async call(q,K,_,z){if(typeof q.message==="string"&&q.to!=="*"){let Y=K.getAppState(),A=Y.agentNameRegistry.get(q.to)??py4(q.to);if(A){let O=Y.tasks[A];if(EJ(O)&&!Bm8(O)){if(O.status==="running")return Um8(A,q.message,K.setAppStateForTasks??K.setAppState),{data:{success:!0,message:`Message queued for delivery to ${q.to} at its next tool round.`}};try{let w=await F88({agentId:A,prompt:q.message,toolUseContext:K,canUseTool:_,invokingRequestId:z?.requestId});return{data:{success:!0,message:`Agent "${q.to}" was stopped (${O.status}); resumed it in the background with your message. You'll be notified when it finishes. Output: ${w.outputFile}`}}}catch(w){return{data:{success:!1,message:`Agent "${q.to}" is stopped (${O.status}) and could not be resumed: ${d6(w)}`}}}}else try{let w=await F88({agentId:A,prompt:q.message,toolUseContext:K,canUseTool:_,invokingRequestId:z?.requestId});return{data:{success:!0,message:`Agent "${q.to}" had no active task; resumed from transcript in the background with your message. You'll be notified when it finishes. Output: ${w.outputFile}`}}}catch(w){return{data:{success:!1,message:`Agent "${q.to}" is registered but has no transcript to resume. It may have been cleaned up. (${d6(w)})`}}}}}if(typeof q.message==="string"){if(q.to==="*")return sqY(q.message,q.summary,K);return aqY(q.to,q.message,q.summary,K)}if(q.to==="*")throw Error("structured messages cannot be broadcast");switch(q.message.type){case"shutdown_request":return tqY(q.to,q.message.reason,K);case"shutdown_response":if(q.message.approve)return eqY(q.message.request_id,K);return q4Y(q.message.request_id,q.message.reason);case"plan_approval_response":if(q.message.approve)return K4Y(q.to,q.message.request_id,K);return _4Y(q.to,q.message.request_id,q.message.feedback??"Plan needs revision",K)}},renderToolUseMessage:nMK,renderToolResultMessage:iMK})});function PXK(q){let K=q.toLowerCase();if(!j4Y.includes(K))return null;return K}function X67(){let q=UK6(),K=q.map((_)=>_.isEnabled());return q.filter((_,z)=>K[z]).map((_)=>_.name)}function UK6(){return[Qm8,Zm8,R4,...Nj()?[]:[kb,$R],pD,i_,UX,QX,qp,mD,im,Gm8,Wm8,GR6,WK6,C88,...[],...[],...tMK?[tMK]:[],...jXK?[jXK]:[],...IH()?[pJK,UJK,lJK,aJK]:[],...AXK?[AXK]:[],...OXK?[OXK]:[],...wXK?[wXK]:[],...i6("true")?[ce1]:[],...bR6()?[cHK,tHK]:[],w4Y(),...JXK?[JXK]:[],...nq()?[A4Y(),O4Y()]:[],...$XK?[$XK]:[],...[],...MXK?[MXK]:[],...eMK?[eMK]:[],...$4Y,...qXK?[qXK]:[],...KXK?[KXK]:[],Ee1,..._XK?[_XK]:[],...zXK?[zXK]:[],...YXK?[YXK]:[],...XXK()?[XXK()]:[],...HXK?[HXK]:[],...[],cr,sr,...yL()?[Tr6]:[]]}function uR6(q,K){return q.filter((_)=>!dm8(K,_))}function nQ(q,K){let _=gD(q),z=uR6(K,q),Y=($,A)=>$.name.localeCompare(A.name);return u2([..._].sort(Y).concat(z.sort(Y)),"name")}var sMK=null,tMK=null,eMK=null,$4Y,qXK,KXK=null,_XK=null,zXK=null,YXK=null,A4Y=()=>(kMK(),Eq(vMK)).TeamCreateTool,O4Y=()=>(RMK(),Eq(LMK)).TeamDeleteTool,w4Y=()=>(aMK(),Eq(oMK)).SendMessageTool,$XK=null,AXK=null,OXK=null,wXK=null,jXK=null,HXK=null,JXK=null,MXK=null,XXK=()=>{if(!Rk6())return null;return(xL6(),Eq(UI8)).PowerShellTool},j4Y,gD=(q)=>{if(i6(process.env.CLAUDE_CODE_SIMPLE)){if(i$6()&&sMK)return uR6([sMK],q);return uR6([R4,i_,UX],q)}let K=new Set([cr.name,sr.name,MD]),_=UK6().filter(($)=>!K.has($.name)),z=uR6(_,q);if(i$6()){if(z.some((A)=>g_(A,FS)))z=z.filter((A)=>!Noq.has(A.name))}let Y=z.map(($)=>$.isEnabled());return z.filter(($,A)=>Y[A])};var BD=y(()=>{Bq();rb8();Fx8();p0();LK6();$p();ka();tL6();eL6();WR6();ke1();dQ();Ce1();xe1();q68();R88();KHK();lj6();vm8();hHK();Iy8();ZE8();Uk8();le1();lHK();eHK();xJK();BJK();QJK();nJK();sJK();Fu();RC();gj();GU();ho6();Fj();ju();m8();Hr();i$();k16();$4Y=[(OMK(),Eq(AMK)).CronCreateTool,(jMK(),Eq(wMK)).CronDeleteTool,(JMK(),Eq(HMK)).CronListTool],qXK=(ZMK(),Eq(fMK)).RemoteTriggerTool,j4Y=["default"]});function WXK(q){let K=z6(44),{onDone:_,tmuxAvailable:z}=q,[Y,$]=S5.useState("initial"),[A,O]=S5.useState(null),[w,j]=S5.useState(null),H=o5(),J,M;if(K[0]===Symbol.for("react.memo_cache_sentinel"))J=()=>{g7K().then((U)=>{O(U)})},M=[],K[0]=J,K[1]=M;else J=K[0],M=K[1];S5.useEffect(J,M);let X;if(K[2]!==_)X=()=>{_("cancelled")},K[2]=_,K[3]=X;else X=K[3];let P=X,W=Y!=="installing"&&Y!=="verifying",D;if(K[4]!==W)D={context:"Confirmation",isActive:W},K[4]=W,K[5]=D;else D=K[5];P1("confirm:no",P,D);let f;if(K[6]!==_||K[7]!==Y)f=(U,c)=>{if(Y==="api-instructions"&&c.return)$("verifying"),Vi1().then((K6)=>{if(K6.success)Ni1(),$("success"),setTimeout(_,1500,"installed");else j(K6.error||"Verification failed"),$("failed")})},K[6]=_,K[7]=Y,K[8]=f;else f=K[8];k4(f);let G;if(K[9]!==A)G=async function(){if(!A){j("No Python package manager found (uvx, pipx, or pip)"),$("failed");return}$("installing");let c=await F7K(A);if(c.success)$("api-instructions");else j(c.error||"Installation failed"),$("install-failed")},K[9]=A,K[10]=G;else G=K[10];let Z=G,T;if(K[11]!==_)T=function(){Q7K(!0),_("use-tmux")},K[11]=_,K[12]=T;else T=K[12];let v=T,V,E,S,R,x,I,B,p;if(K[13]!==w||K[14]!==Z||K[15]!==v||K[16]!==_||K[17]!==A||K[18]!==Y||K[19]!==z){let c=function(){let M6=[{label:"Install it2 now",value:"install",description:A?`Uses ${A} to install the it2 CLI tool`:"Requires Python (uvx, pipx, or pip)"}];if(z)M6.push({label:"Use tmux instead",value:"tmux",description:"Opens teammates in a separate tmux session"});return M6.push({label:"Cancel",value:"cancel",description:"Skip teammate spawning for now"}),S5.default.createElement(u,{flexDirection:"column",gap:1},S5.default.createElement(k,null,"To use native iTerm2 split panes for teammates, you need the"," ",S5.default.createElement(k,{bold:!0},"it2")," CLI tool."),S5.default.createElement(k,{dimColor:!0},"This enables teammates to appear as split panes within your current window."),S5.default.createElement(u,{marginTop:1},S5.default.createElement(H1,{options:M6,onChange:(j6)=>{q:switch(j6){case"install":{Z();break q}case"tmux":{v();break q}case"cancel":_("cancelled")}},onCancel:()=>_("cancelled")})))},K6=function(){return S5.default.createElement(u,{flexDirection:"column",gap:1},S5.default.createElement(u,null,S5.default.createElement(IK,null),S5.default.createElement(k,null," Installing it2 using ",A,"…")),S5.default.createElement(k,{dimColor:!0},"This may take a moment."))},t=function(){let M6=[{label:"Try again",value:"retry",description:"Retry the installation"}];if(z)M6.push({label:"Use tmux instead",value:"tmux",description:"Falls back to tmux for teammate panes"});return M6.push({label:"Cancel",value:"cancel",description:"Skip teammate spawning for now"}),S5.default.createElement(u,{flexDirection:"column",gap:1},S5.default.createElement(k,{color:"error"},"Installation failed"),w&&S5.default.createElement(k,{dimColor:!0},w),S5.default.createElement(k,{dimColor:!0},"You can try installing manually:"," ",A==="uvx"?"uv tool install it2":A==="pipx"?"pipx install it2":"pip install --user it2"),S5.default.createElement(u,{marginTop:1},S5.default.createElement(H1,{options:M6,onChange:(j6)=>{q:switch(j6){case"retry":{Z();break q}case"tmux":{v();break q}case"cancel":_("cancelled")}},onCancel:()=>_("cancelled")})))},q6=function(){let M6=U7K();return S5.default.createElement(u,{flexDirection:"column",gap:1},S5.default.createElement(k,{color:"success"},"✓ it2 installed successfully"),S5.default.createElement(u,{flexDirection:"column",marginTop:1},M6.map(H4Y)),S5.default.createElement(u,{marginTop:1},S5.default.createElement(k,{dimColor:!0},"Press Enter when ready to verify…")))},e=function(){return S5.default.createElement(u,null,S5.default.createElement(IK,null),S5.default.createElement(k,null," Verifying it2 can communicate with iTerm2…"))},i=function(){return S5.default.createElement(u,{flexDirection:"column"},S5.default.createElement(k,{color:"success"},"✓ iTerm2 split pane support is ready"),S5.default.createElement(k,{dimColor:!0},"Teammates will now appear as split panes."))},$6=function(){let M6=[{label:"Try again",value:"retry",description:"Verify the connection again"}];if(z)M6.push({label:"Use tmux instead",value:"tmux",description:"Falls back to tmux for teammate panes"});return M6.push({label:"Cancel",value:"cancel",description:"Skip teammate spawning for now"}),S5.default.createElement(u,{flexDirection:"column",gap:1},S5.default.createElement(k,{color:"error"},"Verification failed"),w&&S5.default.createElement(k,{dimColor:!0},w),S5.default.createElement(k,null,"Make sure:"),S5.default.createElement(u,{flexDirection:"column",paddingLeft:2},S5.default.createElement(k,null,"· Python API is enabled in iTerm2 preferences"),S5.default.createElement(k,null,"· You may need to restart iTerm2 after enabling")),S5.default.createElement(u,{marginTop:1},S5.default.createElement(H1,{options:M6,onChange:(j6)=>{q:switch(j6){case"retry":{$("verifying"),Vi1().then((G6)=>{if(G6.success)Ni1(),$("success"),setTimeout(_,1500,"installed");else j(G6.error||"Verification failed"),$("failed")});break q}case"tmux":{v();break q}case"cancel":_("cancelled")}},onCancel:()=>_("cancelled")})))},U=()=>{switch(Y){case"initial":return c();case"installing":return K6();case"install-failed":return t();case"api-instructions":return q6();case"verifying":return e();case"success":return i();case"failed":return $6();default:return null}};if(E=Q_,B="permission",V=u,p="column",S=1,R=1,K[28]===Symbol.for("react.memo_cache_sentinel"))x=S5.default.createElement(k,{bold:!0,color:"permission"},"iTerm2 Split Pane Setup"),K[28]=x;else x=K[28];I=U(),K[13]=w,K[14]=Z,K[15]=v,K[16]=_,K[17]=A,K[18]=Y,K[19]=z,K[20]=V,K[21]=E,K[22]=S,K[23]=R,K[24]=x,K[25]=I,K[26]=B,K[27]=p}else V=K[20],E=K[21],S=K[22],R=K[23],x=K[24],I=K[25],B=K[26],p=K[27];let C;if(K[29]!==H||K[30]!==Y)C=Y!=="installing"&&Y!=="verifying"&&Y!=="success"&&S5.default.createElement(k,{dimColor:!0,italic:!0},H.pending?S5.default.createElement(S5.default.Fragment,null,"Press ",H.keyName," again to exit"):S5.default.createElement(S5.default.Fragment,null,"Esc to cancel")),K[29]=H,K[30]=Y,K[31]=C;else C=K[31];let g;if(K[32]!==V||K[33]!==S||K[34]!==R||K[35]!==x||K[36]!==I||K[37]!==C||K[38]!==p)g=S5.default.createElement(V,{flexDirection:p,gap:S,paddingBottom:R},x,I,C),K[32]=V,K[33]=S,K[34]=R,K[35]=x,K[36]=I,K[37]=C,K[38]=p,K[39]=g;else g=K[39];let F;if(K[40]!==E||K[41]!==B||K[42]!==g)F=S5.default.createElement(E,{color:B},g),K[40]=E,K[41]=B,K[42]=g,K[43]=F;else F=K[43];return F}function H4Y(q,K){return S5.default.createElement(k,{key:K},q)}var S5;var DXK=y(()=>{q8();d_();pP();Q2();z2();s6();Oq();yi1();S5=O6(D6(),1)});function Q88(){return G06[E7()]}var P67=y(()=>{TF6();Az()});function fXK(q){let K=j8().teammateDefaultModel;if(K===null)return q??Q88();if(K!==void 0)return A5(K);return Q88()}function W67(q,K){if(q==="inherit")return K??fXK(K);return q??fXK(K)}async function J4Y(q){return(await a8(h0,["has-session","-t",q])).code===0}async function M4Y(q){if(!await J4Y(q)){let _=await a8(h0,["new-session","-d","-s",q]);if(_.code!==0)throw Error(`Failed to create tmux session '${q}': ${_.stderr||"Unknown error"}`)}}function TXK(){if(process.env[ME6])return process.env[ME6];return jj()?process.execPath:process.argv[1]}function vXK(q){let K=[],{planModeRequired:_,permissionMode:z}=q||{};if(_);else if(z==="bypassPermissions"||s36())K.push("--dangerously-skip-permissions");else if(z==="acceptEdits")K.push("--permission-mode acceptEdits");else if(z==="auto")K.push("--permission-mode auto");let Y=yx();if(Y)K.push(`--model ${E4([Y])}`);let $=xt();if($)K.push(`--settings ${E4([$])}`);let A=ep();for(let w of A)K.push(`--plugin-dir ${E4([w])}`);let O=lb6();if(O===!0)K.push("--chrome");else if(O===!1)K.push("--no-chrome");return K.join(" ")}async function D67(q,K){if(!K)return q;let _=await jb(K);if(!_)return q;let z=new Set(_.members.map(($)=>$.name.toLowerCase()));if(!z.has(q.toLowerCase()))return q;let Y=2;while(z.has(`${q}-${Y}`.toLowerCase()))Y++;return`${q}-${Y}`}async function X4Y(q,K){let{setAppState:_,getAppState:z}=K,{name:Y,prompt:$,agent_type:A,cwd:O,plan_mode_required:w}=q,j=W67(q.model,z().mainLoopModel);if(!Y||!$)throw Error("name and prompt are required for spawn operation");let H=z(),J=q.team_name||H.teamContext?.teamName;if(!J)throw Error("team_name is required for spawn operation. Either provide team_name in input or call spawnTeam first to establish team context.");let M=await D67(Y,J),X=he6(M),P=iL(X,J),W=O||Z8(),D=await r46();if(D.needsIt2Setup&&K.setToolJSX){let C=await l46(),g=await new Promise((F)=>{K.setToolJSX({jsx:GXK.default.createElement(WXK,{onDone:F,tmuxAvailable:C}),shouldHidePromptInput:!0})});if(K.setToolJSX(null),g==="cancelled")throw Error("Teammate spawn cancelled - iTerm2 setup required");if(g==="installed"||g==="use-tmux")ci1(),D=await r46()}let f=await r7K(),G=ro(P),{paneId:Z,isFirstTeammate:T}=await o7K(X,G);if(T&&f)await a7K();let v=TXK(),V=[`--agent-id ${E4([P])}`,`--agent-name ${E4([X])}`,`--team-name ${E4([J])}`,`--agent-color ${E4([G])}`,`--parent-session-id ${E4([N8()])}`,w?"--plan-mode-required":"",A?`--agent-type ${E4([A])}`:""].filter(Boolean).join(" "),E=vXK({planModeRequired:w,permissionMode:H.toolPermissionContext.mode});if(j)E=E.split(" ").filter((C,g,F)=>C!=="--model"&&F[g-1]!=="--model").join(" "),E=E?`${E} --model ${E4([j])}`:`--model ${E4([j])}`;let S=E?` ${E}`:"",R=Ee6(),x=`cd ${E4([W])} && env ${R} ${E4([v])} ${V}${S}`;await s7K(Z,x,!f);let I=f?"current":nN,B=f?"current":"swarm-view";_((C)=>({...C,teamContext:{...C.teamContext,teamName:J??C.teamContext?.teamName??"default",teamFilePath:C.teamContext?.teamFilePath??"",leadAgentId:C.teamContext?.leadAgentId??"",teammates:{...C.teamContext?.teammates||{},[P]:{name:X,agentType:A,color:G,tmuxSessionName:I,tmuxPaneId:Z,cwd:W,spawnedAt:Date.now()}}}})),kXK(_,{teammateId:P,sanitizedName:X,teamName:J,teammateColor:G,prompt:$,plan_mode_required:w,paneId:Z,insideTmux:f,backendType:D.backend.type,toolUseId:K.toolUseId});let p=await jb(J);if(!p)throw Error(`Team "${J}" does not exist. Call spawnTeam first to create the team.`);return p.members.push({agentId:P,name:X,agentType:A,model:j,prompt:$,color:G,planModeRequired:w,joinedAt:Date.now(),tmuxPaneId:Z,cwd:W,subscriptions:[],backendType:D.backend.type}),await a46(J,p),await R_(X,{from:wz,text:$,timestamp:new Date().toISOString()},J),{data:{teammate_id:P,agent_id:P,agent_type:A,model:j,name:X,color:G,tmux_session_name:I,tmux_window_name:B,tmux_pane_id:Z,team_name:J,is_splitpane:!0,plan_mode_required:w}}}async function P4Y(q,K){let{setAppState:_,getAppState:z}=K,{name:Y,prompt:$,agent_type:A,cwd:O,plan_mode_required:w}=q,j=W67(q.model,z().mainLoopModel);if(!Y||!$)throw Error("name and prompt are required for spawn operation");let H=z(),J=q.team_name||H.teamContext?.teamName;if(!J)throw Error("team_name is required for spawn operation. Either provide team_name in input or call spawnTeam first to establish team context.");let M=await D67(Y,J),X=he6(M),P=iL(X,J),W=`teammate-${o46(X)}`,D=O||Z8();await M4Y(nN);let f=ro(P),G=await a8(h0,["new-window","-t",nN,"-n",W,"-P","-F","#{pane_id}"]);if(G.code!==0)throw Error(`Failed to create tmux window: ${G.stderr}`);let Z=G.stdout.trim(),T=TXK(),v=[`--agent-id ${E4([P])}`,`--agent-name ${E4([X])}`,`--team-name ${E4([J])}`,`--agent-color ${E4([f])}`,`--parent-session-id ${E4([N8()])}`,w?"--plan-mode-required":"",A?`--agent-type ${E4([A])}`:""].filter(Boolean).join(" "),V=vXK({planModeRequired:w,permissionMode:H.toolPermissionContext.mode});if(j)V=V.split(" ").filter((B,p,C)=>B!=="--model"&&C[p-1]!=="--model").join(" "),V=V?`${V} --model ${E4([j])}`:`--model ${E4([j])}`;let E=V?` ${V}`:"",S=Ee6(),R=`cd ${E4([D])} && env ${S} ${E4([T])} ${v}${E}`,x=await a8(h0,["send-keys","-t",`${nN}:${W}`,R,"Enter"]);if(x.code!==0)throw Error(`Failed to send command to tmux window: ${x.stderr}`);_((B)=>({...B,teamContext:{...B.teamContext,teamName:J??B.teamContext?.teamName??"default",teamFilePath:B.teamContext?.teamFilePath??"",leadAgentId:B.teamContext?.leadAgentId??"",teammates:{...B.teamContext?.teammates||{},[P]:{name:X,agentType:A,color:f,tmuxSessionName:nN,tmuxPaneId:Z,cwd:D,spawnedAt:Date.now()}}}})),kXK(_,{teammateId:P,sanitizedName:X,teamName:J,teammateColor:f,prompt:$,plan_mode_required:w,paneId:Z,insideTmux:!1,backendType:"tmux",toolUseId:K.toolUseId});let I=await jb(J);if(!I)throw Error(`Team "${J}" does not exist. Call spawnTeam first to create the team.`);return I.members.push({agentId:P,name:X,agentType:A,model:j,prompt:$,color:f,planModeRequired:w,joinedAt:Date.now(),tmuxPaneId:Z,cwd:D,subscriptions:[],backendType:"tmux"}),await a46(J,I),await R_(X,{from:wz,text:$,timestamp:new Date().toISOString()},J),{data:{teammate_id:P,agent_id:P,agent_type:A,model:j,name:X,color:f,tmux_session_name:nN,tmux_window_name:W,tmux_pane_id:Z,team_name:J,is_splitpane:!1,plan_mode_required:w}}}function kXK(q,{teammateId:K,sanitizedName:_,teamName:z,teammateColor:Y,prompt:$,plan_mode_required:A,paneId:O,insideTmux:w,backendType:j,toolUseId:H}){let J=aL("in_process_teammate"),M=`${_}: ${$.substring(0,50)}${$.length>50?"...":""}`,X=new AbortController,P={...C0(J,"in_process_teammate",M,H),type:"in_process_teammate",status:"running",identity:{agentId:K,agentName:_,teamName:z,color:Y,planModeRequired:A??!1,parentSessionId:N8()},prompt:$,abortController:X,awaitingPlanApproval:!1,permissionMode:A?"plan":"default",isIdle:!1,shutdownRequested:!1,lastReportedToolCount:0,lastReportedTokenCount:0,pendingUserMessages:[]};H0(P,q),X.signal.addEventListener("abort",()=>{if(d26(j))t26(j).killPane(O,!w)},{once:!0})}async function ZXK(q,K){let{setAppState:_,getAppState:z}=K,{name:Y,prompt:$,agent_type:A,plan_mode_required:O}=q,w=W67(q.model,z().mainLoopModel);if(!Y||!$)throw Error("name and prompt are required for spawn operation");let j=z(),H=q.team_name||j.teamContext?.teamName;if(!H)throw Error("team_name is required for spawn operation. Either provide team_name in input or call spawnTeam first to establish team context.");let J=await D67(Y,H),M=he6(J),X=iL(M,H),P=ro(X),W;if(A){let T=K.options.agentDefinitions.activeAgents.find((v)=>v.agentType===A);if(T&&ni6(T))W=T;N(`[handleSpawnInProcess] agent_type=${A}, found=${!!W}`)}let f=await aC8({name:M,teamName:H,prompt:$,color:P,planModeRequired:O??!1,model:w},K);if(!f.success)throw Error(f.error??"Failed to spawn in-process teammate");if(N(`[handleSpawnInProcess] spawn result: taskId=${f.taskId}, hasContext=${!!f.teammateContext}, hasAbort=${!!f.abortController}`),f.taskId&&f.teammateContext&&f.abortController)oC8({identity:{agentId:X,agentName:M,teamName:H,color:P,planModeRequired:O??!1,parentSessionId:f.teammateContext.parentSessionId},taskId:f.taskId,prompt:$,description:q.description,model:w,agentDefinition:W,teammateContext:f.teammateContext,toolUseContext:{...K,messages:[]},abortController:f.abortController,invokingRequestId:q.invokingRequestId}),N(`[handleSpawnInProcess] Started agent execution for ${X}`);_((Z)=>{let T=!Z.teamContext?.leadAgentId,v=T?iL(wz,H):Z.teamContext.leadAgentId,V=Z.teamContext?.teammates||{},E=T?{[v]:{name:wz,agentType:wz,color:ro(v),tmuxSessionName:"in-process",tmuxPaneId:"leader",cwd:Z8(),spawnedAt:Date.now()}}:{};return{...Z,teamContext:{...Z.teamContext,teamName:H??Z.teamContext?.teamName??"default",teamFilePath:Z.teamContext?.teamFilePath??"",leadAgentId:v,teammates:{...V,...E,[X]:{name:M,agentType:A,color:P,tmuxSessionName:"in-process",tmuxPaneId:"in-process",cwd:Z8(),spawnedAt:Date.now()}}}}});let G=await jb(H);if(!G)throw Error(`Team "${H}" does not exist. Call spawnTeam first to create the team.`);return G.members.push({agentId:X,name:M,agentType:A,model:w,prompt:$,color:P,planModeRequired:O,joinedAt:Date.now(),tmuxPaneId:"in-process",cwd:Z8(),subscriptions:[],backendType:"in-process"}),await a46(H,G),{data:{teammate_id:X,agent_id:X,agent_type:A,model:w,name:M,color:P,tmux_session_name:"in-process",tmux_window_name:"in-process",tmux_pane_id:"in-process",team_name:H,is_splitpane:!1,plan_mode_required:O}}}async function W4Y(q,K){if(pm())return ZXK(q,K);try{await r46()}catch(z){if(a26()!=="auto")throw z;return N(`[handleSpawn] No pane backend available, falling back to in-process: ${d6(z)}`),Qi1(),ZXK(q,K)}if(q.use_splitpane!==!1)return X4Y(q,K);return P4Y(q,K)}async function VXK(q,K){return W4Y(q,K)}var GXK;var NXK=y(()=>{v8();GN();NX();V1();I7();_8();y8();XK();aq();wb();Jb();s26();DXK();vi1();tC8();hi1();RD();Le6();P67();J0();RJ();SP();GXK=O6(D6(),1)});function D4Y(q){let{tools:K,disallowedTools:_}=q,z=K&&K.length>0,Y=_&&_.length>0;if(z&&Y){let $=new Set(_),A=K.filter((O)=>!$.has(O));if(A.length===0)return"None";return A.join(", ")}else if(z)return K.join(", ");else if(Y)return`All tools except ${_.join(", ")}`;return"All tools"}function f67(q){let K=D4Y(q);return`- ${q.agentType}: ${q.whenToUse} (Tools: ${K})`}function Z67(){if(i6(process.env.CLAUDE_CODE_AGENT_LIST_IN_MESSAGES))return!0;if(k_(process.env.CLAUDE_CODE_AGENT_LIST_IN_MESSAGES))return!1;return g8("tengu_agent_list_attach",!1)}async function yXK(q,K,_){let z=_?q.filter((f)=>_.includes(f.agentType)):q,Y=Lb(),$=Y?`
3808
3809## When to fork

Callers 1

callFunction · 0.85

Calls 7

$9Function · 0.85
M_Function · 0.85
jE6Function · 0.85
DE6Function · 0.85
R_Function · 0.85
g6Function · 0.85
vjFunction · 0.85

Tested by

no test coverage detected