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

Function yXK

package/cli.js:3806–3938  ·  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
3810
3811Fork yourself (omit \`subagent_type\`) when the intermediate tool output isn't worth keeping in your context. The criterion is qualitative — "will I need this output again" — not task size.
3812- **Research**: fork open-ended questions. If research can be broken into independent questions, launch parallel forks in one message. A fork beats a fresh subagent for this — it inherits context and shares your cache.
3813- **Implementation**: prefer to fork implementation work that requires more than a couple of edits. Do research before jumping to implementation.
3814
3815Forks are cheap because they share your prompt cache. Don't set \`model\` on a fork — a different model can't reuse the parent's cache. Pass a short \`name\` (one or two words, lowercase) so the user can see the fork in the teams panel and steer it mid-run.
3816
3817**Don't peek.** The tool result includes an \`output_file\` path — do not Read or tail it unless the user explicitly asks for a progress check. You get a completion notification; trust it. Reading the transcript mid-flight pulls the fork's tool noise into your context, which defeats the point of forking.
3818
3819**Don't race.** After launching, you know nothing about what the fork found. Never fabricate or predict fork results in any format — not as prose, summary, or structured output. The notification arrives as a user-role message in a later turn; it is never something you write yourself. If the user asks a follow-up before the notification lands, tell them the fork is still running — give status, not a guess.
3820
3821**Writing a fork prompt.** Since the fork inherits your context, the prompt is a *directive* — what to do, not what the situation is. Be specific about scope: what's in, what's out, what another agent is handling. Don't re-explain background.
3822`:"",A=`
3823
3824## Writing the prompt
3825
3826${Y?"When spawning a fresh agent (with a `subagent_type`), it starts with zero context. ":""}Brief the agent like a smart colleague who just walked into the room — it hasn't seen this conversation, doesn't know what you've tried, doesn't understand why this task matters.
3827- Explain what you're trying to accomplish and why.
3828- Describe what you've already learned or ruled out.
3829- Give enough context about the surrounding problem that the agent can make judgment calls rather than just following a narrow instruction.
3830- If you need a short response, say so ("report in under 200 words").
3831- Lookups: hand over the exact command. Investigations: hand over the question — prescribed steps become dead weight when the premise is wrong.
3832
3833${Y?"For fresh agents, terse":"Terse"} command-style prompts produce shallow, generic work.
3834
3835**Never delegate understanding.** Don't write "based on your findings, fix the bug" or "based on the research, implement it." Those phrases push synthesis onto the agent instead of doing it yourself. Write prompts that prove you understood: include file paths, line numbers, what specifically to change.
3836`,O=`Example usage:
3837
3838<example>
3839user: "What's left on this branch before we can ship?"
3840assistant: <thinking>Forking this — it's a survey question. I want the punch list, not the git output in my context.</thinking>
3841${v4}({
3842 name: "ship-audit",
3843 description: "Branch ship-readiness audit",
3844 prompt: "Audit what's left before this branch can ship. Check: uncommitted changes, commits ahead of main, whether tests exist, whether the GrowthBook gate is wired up, whether CI-relevant files changed. Report a punch list — done vs. missing. Under 200 words."
3845})
3846assistant: Ship-readiness audit running.
3847<commentary>
3848Turn ends here. The coordinator knows nothing about the findings yet. What follows is a SEPARATE turn — the notification arrives from outside, as a user-role message. It is not something the coordinator writes.
3849</commentary>
3850[later turn — notification arrives as user message]
3851assistant: Audit's back. Three blockers: no tests for the new prompt path, GrowthBook gate wired but not in build_flags.yaml, and one uncommitted file.
3852</example>
3853
3854<example>
3855user: "so is the gate wired up or not"
3856<commentary>
3857User asks mid-wait. The audit fork was launched to answer exactly this, and it hasn't returned. The coordinator does not have this answer. Give status, not a fabricated result.
3858</commentary>
3859assistant: Still waiting on the audit — that's one of the things it's checking. Should land shortly.
3860</example>
3861
3862<example>
3863user: "Can you get a second opinion on whether this migration is safe?"

Callers 1

promptFunction · 0.85

Calls 11

LbFunction · 0.85
Z67Function · 0.85
f67Function · 0.85
NjFunction · 0.85
yKFunction · 0.85
i6Function · 0.85
cWFunction · 0.85
$YFunction · 0.85
filterMethod · 0.80
includesMethod · 0.80
joinMethod · 0.45

Tested by

no test coverage detected