@vibetonomy/agent 1.5.2 → 1.5.4
This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
- package/bridge/dist/index.js +7 -7
- package/package.json +6 -6
package/bridge/dist/index.js
CHANGED
|
@@ -1,11 +1,11 @@
|
|
|
1
|
-
import{createInterface as _e}from"node:readline";import{readdir as V,readFile as Z,rm as fe}from"node:fs/promises";import{join as
|
|
1
|
+
import{createInterface as _e}from"node:readline";import{readdir as V,readFile as Z,rm as fe}from"node:fs/promises";import{join as P,basename as Se,resolve as X}from"node:path";import{homedir as pe}from"node:os";function G(t,e,n){if(e.session_id&&typeof e.session_id=="string"&&e.session_id!==t.cliSessionId&&(t.cliSessionId=e.session_id,n({type:"session_id",cliSessionId:t.cliSessionId,...t.relaySessionId?{relaySessionId:t.relaySessionId}:{}})),e.uuid&&typeof e.uuid=="string"&&(e.type==="user"&&!e.parent_tool_use_id?n({type:"message_uuid",uuid:e.uuid,messageType:"user"}):e.type==="assistant"&&n({type:"message_uuid",uuid:e.uuid,messageType:"assistant"})),e.type==="system"&&e.subtype==="init"){e.slash_commands&&Array.isArray(e.slash_commands)&&n({type:"slash_commands",commands:e.slash_commands}),e.model&&typeof e.model=="string"&&n({type:"model_info",model:e.model,models:[]}),e.fast_mode_state&&typeof e.fast_mode_state=="string"&&n({type:"fast_mode_state",state:e.fast_mode_state});return}if(e.type==="stream_event"&&e.event){ce(t,e.event,n);return}if((e.type==="assistant"||e.type==="user")&&e.message&&typeof e.message=="object"){let o=e.message.content;if(e.parent_tool_use_id&&typeof e.parent_tool_use_id=="string"){ue(t,e,n);return}if(e.type==="assistant"&&!t.streamedText&&Array.isArray(o)){let s=o.filter(i=>i.type==="text").map(i=>i.text).join("");s&&n({type:"delta",text:s})}if(e.type==="user"){let s="";if(typeof o=="string"?s=o:Array.isArray(o)&&(s=o.filter(i=>i.type==="text").map(i=>i.text).join(`
|
|
2
2
|
`)),s.indexOf("local-command-stdout")!==-1){let i=s.match(/<local-command-stdout>([\s\S]*?)<\/local-command-stdout>/);i&&n({type:"slash_command_result",text:i[1].trim()})}}if(Array.isArray(o)){for(let s of o)if(s.type==="tool_result"&&typeof s.tool_use_id=="string"&&!t.sentToolResults[s.tool_use_id]){t.activeTaskToolIds[s.tool_use_id]&&(n({type:"subagent_done",parentToolId:s.tool_use_id}),delete t.activeTaskToolIds[s.tool_use_id]);let i=t.teammateMap[s.tool_use_id];i&&(n({type:"teammate_status",parentToolId:s.tool_use_id,teammateName:i,status:s.is_error?"error":"idle"}),delete t.teammateMap[s.tool_use_id]);let c="";typeof s.content=="string"?c=s.content:Array.isArray(s.content)&&(c=s.content.filter(f=>f.type==="text").map(f=>f.text).join(`
|
|
3
|
-
`)),t.sentToolResults[s.tool_use_id]=!0,n({type:"tool_result",id:s.tool_use_id,content:c,is_error:s.is_error||!1})}}return}if(e.type==="result"){t.blocks={},t.sentToolResults={},t.activeTaskToolIds={},t.taskIdMap={},t.teammateMap={},t.isProcessing=!1,n({type:"result",cost:e.total_cost_usd??null,duration:e.duration_ms??null,usage:e.usage??null,modelUsage:e.modelUsage??null,sessionId:e.session_id}),e.fast_mode_state&&typeof e.fast_mode_state=="string"&&n({type:"fast_mode_state",state:e.fast_mode_state}),n({type:"done",code:0}),t.responsePreview="",t.streamedText=!1;return}if(e.type==="system"&&e.subtype==="status"){e.status==="compacting"?(n({type:"compacting",active:!0}),t.compacting=!0):t.compacting&&(n({type:"compacting",active:!1}),t.compacting=!1);return}if(e.type==="system"&&e.subtype==="task_started"){let a=e.tool_use_id;a&&(e.task_id&&(t.taskIdMap[a]=e.task_id),n({type:"task_started",parentToolId:a,taskId:e.task_id||"",description:e.description||""}));return}if(e.type==="system"&&e.subtype==="task_progress"){let a=e.tool_use_id||void 0,o=e.task_id,s=a||(o?Object.keys(t.taskIdMap).find(i=>t.taskIdMap[i]===o):void 0);if(s){n({type:"task_progress",parentToolId:s,taskId:o,usage:e.usage??null,lastToolName:e.last_tool_name||void 0,description:e.description||""});let i=t.teammateMap[s];if(i){let c=e.description||(e.last_tool_name?`Running ${e.last_tool_name}...`:void 0);n({type:"teammate_status",parentToolId:s,teammateName:i,status:"active",activityText:c})}}return}if(e.type==="tool_progress"){let a=e.parent_tool_use_id;if(a){n({type:"subagent_activity",parentToolId:a,text:e.content||""});let o=t.teammateMap[a];o&&n({type:"teammate_status",parentToolId:a,teammateName:o,status:"active",activityText:e.content||void 0})}return}if(e.type==="system"&&e.subtype==="task_notification"){let a=e.tool_use_id||void 0,o=e.task_id,s=a||(o?Object.keys(t.taskIdMap).find(i=>t.taskIdMap[i]===o):void 0);if(s){n({type:"subagent_done",parentToolId:s,status:e.status||"completed",summary:e.summary||"",usage:e.usage??null});let i=t.teammateMap[s];if(i){let c=e.status==="error"||e.status==="failed";n({type:"teammate_status",parentToolId:s,teammateName:i,status:c?"error":"idle",activityText:e.summary||void 0}),delete t.teammateMap[s]}}if(o){for(let i of Object.keys(t.taskIdMap))if(t.taskIdMap[i]===o){delete t.taskIdMap[i];break}}return}if(e.type==="rate_limit_event"&&e.rate_limit_info){let a=e.rate_limit_info;(a.status==="allowed_warning"||a.status==="rejected")&&n({type:"rate_limit",status:a.status,resetsAt:a.resetsAt?a.resetsAt*1e3:null,rateLimitType:a.rateLimitType||null,utilization:a.utilization||null});return}if(e.type==="prompt_suggestion"){n({type:"prompt_suggestion",suggestion:e.suggestion||""});return}}function ce(t,e,n){if(e.type==="content_block_start"){let a=e.content_block,o=e.index;a.type==="tool_use"?(t.blocks[o]={type:"tool_use",id:a.id,name:a.name,inputJson:""},n({type:"tool_start",id:a.id,name:a.name})):a.type==="thinking"?(t.blocks[o]={type:"thinking",thinkingText:"",startTime:Date.now()},n({type:"thinking_start"})):a.type==="text"&&(t.blocks[o]={type:"text"});return}if(e.type==="content_block_delta"&&e.delta){let a=e.index,o=e.delta;if(o.type==="text_delta"&&typeof o.text=="string"){if(t.streamedText=!0,t.responsePreview.length<200&&(t.responsePreview+=o.text),n({type:"delta",text:o.text}),t.teamActive){let s=o.text.matchAll(/teammate_id="([^"]+)"/g);for(let i of s){let c=i[1];(o.text.includes("idle_notification")||o.text.includes('"idleReason"'))&&n({type:"teammate_status",parentToolId:"",teammateName:c,status:"idle",activityText:"Idle"})}}}else o.type==="input_json_delta"&&t.blocks[a]?t.blocks[a].inputJson=(t.blocks[a].inputJson||"")+o.partial_json:o.type==="thinking_delta"&&t.blocks[a]&&(t.blocks[a].thinkingText=(t.blocks[a].thinkingText||"")+o.thinking,n({type:"thinking_delta",text:o.thinking}));return}if(e.type==="content_block_stop"){let a=e.index,o=t.blocks[a];if(o&&o.type==="tool_use"){let s={};try{s=JSON.parse(o.inputJson||"{}")}catch{}n({type:"tool_executing",id:o.id,name:o.name,input:s});let i=o.name;if((i==="Task"||i==="Agent"||i==="TeammateTool")&&(t.activeTaskToolIds[o.id]=!0,t.teamActive)){let c=s;if(c){let f=c.teammate_name||c.name||c.subagent_type,_=c.team_name||void 0;f&&(t.teammateMap[o.id]=f,n({type:"teammate_spawned",parentToolId:o.id,teammateName:f,teamName:_,description:c.description||c.prompt||""}))}}if(t.teamActive&&i==="SendMessage"){let c=s;if(c){let f=c.to;f&&f!=="*"&&n({type:"teammate_status",parentToolId:o.id,teammateName:f,status:"active",activityText:"Processing message\u2026"})}}}else if(o&&o.type==="thinking"){let s=o.startTime?(Date.now()-o.startTime)/1e3:0;n({type:"thinking_stop",duration:s})}delete t.blocks[a];return}}function ue(t,e,n){let a=e.parent_tool_use_id,s=e.message.content;if(Array.isArray(s)&&e.type==="assistant")for(let i of s)if(i.type==="tool_use"){let c=de(i.name,i.input);n({type:"subagent_tool",parentToolId:a,toolName:i.name,toolId:i.id,text:c})}else i.type==="thinking"?n({type:"subagent_activity",parentToolId:a,text:"Thinking..."}):i.type==="text"&&i.text&&n({type:"subagent_activity",parentToolId:a,text:"Writing response..."})}function de(t,e){return t==="Bash"&&e?.description?e.description:t==="Read"&&e?.file_path?"Reading "+e.file_path.split("/").pop():t==="Edit"&&e?.file_path?"Editing "+e.file_path.split("/").pop():t==="Write"&&e?.file_path?"Writing "+e.file_path.split("/").pop():t==="Grep"&&e?.pattern?"Searching for "+e.pattern:t==="Glob"&&e?.pattern?"Finding "+e.pattern:t==="WebSearch"&&e?.query?"Searching: "+e.query:t==="WebFetch"?"Fetching URL...":t==="Task"&&e?.description?e.description:"Running "+t+"..."}function q(){let t=[],e=null,n=!1;return{push(a){if(!n)if(e){let o=e;e=null,o({value:a,done:!1})}else t.push(a)},end(){if(n=!0,e){let a=e;e=null,a({value:void 0,done:!0})}},[Symbol.asyncIterator](){return{next(){return t.length>0?Promise.resolve({value:t.shift(),done:!1}):n?Promise.resolve({value:void 0,done:!0}):new Promise(a=>{e=a})}}}}}import{randomUUID as me}from"node:crypto";function H(t){let e={},n={},a={};return{handleCanUseTool(o,s,i){return o==="AskUserQuestion"?new Promise(c=>{n[i.toolUseID]={resolve:c,input:s},i.signal&&i.signal.addEventListener("abort",()=>{delete n[i.toolUseID],t({type:"ask_user_answered",toolId:i.toolUseID}),c({behavior:"deny",message:"Cancelled"})})}):a[o]?Promise.resolve({behavior:"allow",updatedInput:s}):new Promise(c=>{let f=me();e[f]={resolve:c,requestId:f,toolName:o,toolInput:s,toolUseId:i.toolUseID},t({type:"permission_request",requestId:f,toolName:o,toolInput:s,toolUseId:i.toolUseID,decisionReason:i.decisionReason||""}),i.signal&&i.signal.addEventListener("abort",()=>{delete e[f],t({type:"permission_cancel",requestId:f}),c({behavior:"deny",message:"Request cancelled"})})})},handlePermissionResponse(o,s,i){let c=e[o];if(!c&&o.startsWith("hydrated-")){let f=o.slice(9),_=Object.keys(e).find(I=>e[I].toolUseId===f);_&&(c=e[_])}c&&(delete e[c.requestId],t({type:"permission_resolved",requestId:c.requestId,decision:s}),o!==c.requestId&&t({type:"permission_resolved",requestId:o,decision:s}),s==="allow"?(i&&(a[c.toolName]=!0),c.resolve({behavior:"allow",updatedInput:c.toolInput})):c.resolve({behavior:"deny",message:"User denied"}))},handleAskUserResponse(o,s){let i=n[o];if(!i)return;delete n[o],t({type:"ask_user_answered",toolId:o});let c=Object.assign({},i.input,{answers:s});i.resolve({behavior:"allow",updatedInput:c})},clearPending(o){for(let s of Object.keys(n))o({type:"ask_user_answered",toolId:s}),n[s].resolve({behavior:"deny",message:"Session ended"}),delete n[s];for(let s of Object.keys(e))o({type:"permission_cancel",requestId:s}),e[s].resolve({behavior:"deny",message:"Session ended"}),delete e[s]}}}function O(){return{cliSessionId:null,resumeToken:null,relaySessionId:null,blocks:{},sentToolResults:{},streamedText:!1,responsePreview:"",activeTaskToolIds:{},taskIdMap:{},teammateMap:{},teamActive:!1,isProcessing:!1,compacting:!1}}var A={agents:[],teamName:null,leadSessionId:null,teamConfigDir:null};function ee(t,e){let n=JSON.parse(t);if(!n.members||n.members.length===0)return A;let a=[];for(let o of n.members)o.agentType!=="team-lead"&&a.push({id:o.name.toLowerCase().replace(/\s+/g,"-"),name:o.name,description:o.prompt||`${o.agentType} agent`,systemPrompt:o.prompt||"",defaultModel:o.model,agentType:o.agentType,color:o.color});return{agents:a,teamName:n.name||null,leadSessionId:n.leadSessionId||null,teamConfigDir:e}}async function ye(t){let e=C(pe(),".claude","teams"),n=X(t);try{let a=await V(e);for(let o of a)try{let s=C(e,o),i=await Z(C(s,"config.json"),"utf-8");if(!JSON.parse(i).members?.some(_=>_.cwd&&X(_.cwd)===n))continue;return ee(i,s)}catch{}return A}catch{return A}}async function ge(t){let e=C(t,".claude","teams");try{let n=await V(e);for(let a of n)try{let o=C(e,a),s=await Z(C(o,"config.json"),"utf-8");return ee(s,o)}catch{}return A}catch{return A}}var L=3,F=[2e3,5e3,1e4];function W(t){let e=t.toLowerCase();return e.includes("prompt is too long")||e.includes("context_length")||e.includes("maximum context length")||e.includes("no conversation found with session id")}function te(t){let e=null,n=null,a=null,o=null,s=O(),i=null,c="",f=[],_="acceptEdits",I="medium",E="",x=0,T=A,B=!1,$=null,k=t;t=r=>{if(r.type==="model_info"&&(r.models&&r.models.length>0&&(f=r.models),r.models=f,r.model&&(c=r.model)),$){$(r);return}k(r)};async function J(){if(e)return e;try{return e=await import("@anthropic-ai/claude-agent-sdk"),e}catch(r){let l=r;throw new Error(`Failed to load Claude SDK: ${l.message}`)}}async function z(r,l,m,u=L){let p;for(let d=0;d<u;d++){let y=F[d]??F[F.length-1];if(t({type:"info",text:`Reconnecting to Claude session (attempt ${d+1}/${u})...`}),await new Promise(w=>setTimeout(w,y)),l!==x)return console.error(`[sdk-runner] session generation changed during ${m}, aborting`),{ok:!1,reason:"generation-changed"};try{return r(d),console.error(`[sdk-runner] ${m} succeeded on attempt ${d+1}`),t({type:"info",text:"Reconnected to Claude session."}),{ok:!0}}catch(w){if(p=w,console.error(`[sdk-runner] ${m} attempt ${d+1} failed: ${p.message}`),W(p.message))return console.error(`[sdk-runner] non-retryable error during ${m}, giving up`),{ok:!1,reason:"non-retryable",error:p}}}return console.error(`[sdk-runner] ${m} all attempts exhausted`),{ok:!1,reason:"exhausted",error:p}}function se(r,l){if(l.length===0||l.find(d=>d.value===r))return r;let u=r.toLowerCase(),p=l.find(d=>d.value.toLowerCase().split("-").some(y=>y===u));return p?p.value:r}function K(r){return r.map(l=>({value:l.value,displayName:l.displayName,description:l.description,supportsEffort:l.supportsEffort,supportedEffortLevels:l.supportedEffortLevels}))}async function re(r,l){let m={[Symbol.asyncIterator](){return{next:()=>Promise.resolve({value:void 0,done:!0})}}},u=null;try{u=r.query({prompt:m,options:{cwd:l}}),u[Symbol.asyncIterator]().next().catch(()=>{});let d=null,y=!!u.initializationResult,w=!!u.supportedModels;if(console.error(`[sdk-runner] probe: initializationResult=${y}, supportedModels=${w}`),u.initializationResult){let g=await Promise.race([u.initializationResult(),new Promise(h=>setTimeout(()=>h(null),8e3))]);if(g?.models?.length)d=g.models,console.error(`[sdk-runner] probe: initializationResult returned ${d.length} models`);else if(console.error("[sdk-runner] probe: initializationResult returned no models, trying supportedModels fallback"),u.supportedModels){let h=await Promise.race([u.supportedModels(),new Promise(v=>setTimeout(()=>v(null),8e3))]);h?.length?(d=h,console.error(`[sdk-runner] probe: supportedModels fallback returned ${d.length} models`)):console.error("[sdk-runner] probe: supportedModels fallback returned no models")}}else if(u.supportedModels){let g=await Promise.race([u.supportedModels(),new Promise(h=>setTimeout(()=>h(null),8e3))]);g?.length?(d=g,console.error(`[sdk-runner] probe: supportedModels returned ${d.length} models`)):console.error("[sdk-runner] probe: supportedModels returned no models")}else console.error("[sdk-runner] probe: neither initializationResult nor supportedModels available");d&&d.length>0?(f=K(d),!c&&f.length>0&&(c=f[0].value),console.error(`[sdk-runner] probe: sending model_info with ${f.length} models`),t({type:"model_info",model:c,models:f})):console.error("[sdk-runner] probe: no models found from any method")}catch(p){console.error(`[sdk-runner] probe: error fetching models: ${p.message}`)}finally{u?.close&&u.close()}}async function Q(){if(!a)return;let r=x;try{for await(let l of a)G(s,l,t)}catch(l){if(r!==x)return;let m=l,u=m.name==="AbortError"||o&&o.signal.aborted,p=m.message||String(m),d=W(p);if(!u&&!d&&s.resumeToken&&(console.error(`[sdk-runner] query stream crashed: ${m.message}, attempting recovery`),await ae(r)))return;s.isProcessing&&(s.isProcessing=!1,u?(t({type:"info",text:"Interrupted"}),t({type:"done",code:0})):d?(t({type:"error",text:"Conversation too long to continue."}),t({type:"done",code:1})):(t({type:"error",text:`Claude process error: ${m.message}`}),t({type:"done",code:1})))}finally{r===x&&(a=null,n=null,o=null,i&&i.clearPending(t))}}function ne(r,l){let m={cwd:E,settingSources:["user","project","local"],includePartialMessages:!0,enableFileCheckpointing:!0,enableAutoMode:!0,abortController:l,promptSuggestions:!0,resume:r,permissionMode:_,effort:I};return c&&(m.model=c),i&&(m.canUseTool=(u,p,d)=>i.handleCanUseTool(u,p,d)),T.teamName&&(m.env={...process.env,CLAUDE_CODE_EXPERIMENTAL_AGENT_TEAMS:"1",CLAUDE_CODE_TEAM_NAME:T.teamName.toLowerCase()}),m}async function ae(r){if(!e)return!1;let l=e,m=s.resumeToken;return m?(await z(()=>{n=q(),o=new AbortController;let p=ne(m,o);a=l.query({prompt:n,options:p}),s.isProcessing=!0,x++,Q().catch(d=>{console.error("[sdk-runner] recovered stream error:",d)})},r,"stream-crash-recovery")).ok:!1}let M="done",R="",D=0,N=0,U=null;function ie(){$=r=>{if(r.type==="delta"&&typeof r.text=="string"&&(R+=r.text),r.type==="delta"&&typeof r.text=="string"){let l=r.text,m=l.matchAll(/teammate_id="([^"]+)"/g);for(let u of m){let p=u[1];(l.includes("idle_notification")||l.includes("online"))&&k({type:"teammate_status",parentToolId:"",teammateName:p,status:"idle",activityText:"Online"})}}if(r.type==="done"||r.type==="result"){if(M==="broadcast_test"){let l=R.toUpperCase(),m=l.includes("TEAM_READY")||l.includes("BROADCAST")&&l.includes("SUCCESS")||l.includes("MESSAGE SENT"),u=l.includes("TEAM_NEEDS_REBUILD")||l.includes("NOT IN A TEAM")||l.includes("NO TEAM")||l.includes("ERROR");m&&!u?(M="done",$=null,k({type:"agent_mode_status",statusText:"Team is ready!"}),k({type:"agent_mode_ready",success:!0}),k(r)):(M="spawning",R="",k({type:"agent_mode_status",statusText:"Spawning teammates\u2026"}),le());return}if(M==="spawning"){B=!0,M="waiting_for_teammates",N=0,D=T.agents.filter(l=>l.agentType!=="team-lead").length,k({type:"agent_mode_status",statusText:`Waiting for ${D} teammates to come online\u2026`}),k(r),U=setTimeout(()=>{M==="waiting_for_teammates"&&(M="done",$=null,k({type:"agent_mode_status",statusText:"Team is ready!"}),k({type:"agent_mode_ready",success:!0}))},45e3);return}}if(M!=="done"){(r.type==="teammate_spawned"||r.type==="teammate_status"||r.type==="session_id")&&(k(r),M==="waiting_for_teammates"&&r.type==="teammate_spawned"&&(N++,k({type:"agent_mode_status",statusText:`Teammates online: ${N}/${D}\u2026`}),N>=D&&(U&&(clearTimeout(U),U=null),M="done",$=null,k({type:"agent_mode_status",statusText:"Team is ready!"}),k({type:"agent_mode_ready",success:!0}))));return}k(r)}}function le(){if(!n||!T.teamName){k({type:"agent_mode_ready",success:!1,error:"Cannot spawn team \u2014 no session or template"});return}(T.teamConfigDir?fe(T.teamConfigDir,{recursive:!0,force:!0}).catch(()=>{}):Promise.resolve()).then(()=>{let l=T.agents.map(u=>{let p=u.defaultModel?` (model: ${u.defaultModel})`:"";return`- **${u.name}** \u2014 ${u.agentType||"general-purpose"}${p}: ${u.description}`}).join(`
|
|
3
|
+
`)),t.sentToolResults[s.tool_use_id]=!0,n({type:"tool_result",id:s.tool_use_id,content:c,is_error:s.is_error||!1})}}return}if(e.type==="result"){t.blocks={},t.sentToolResults={},t.activeTaskToolIds={},t.taskIdMap={},t.teammateMap={},t.isProcessing=!1,n({type:"result",cost:e.total_cost_usd??null,duration:e.duration_ms??null,usage:e.usage??null,modelUsage:e.modelUsage??null,sessionId:e.session_id}),e.fast_mode_state&&typeof e.fast_mode_state=="string"&&n({type:"fast_mode_state",state:e.fast_mode_state}),n({type:"done",code:0}),t.responsePreview="",t.streamedText=!1;return}if(e.type==="system"&&e.subtype==="status"){e.status==="compacting"?(n({type:"compacting",active:!0}),t.compacting=!0):t.compacting&&(n({type:"compacting",active:!1}),t.compacting=!1);return}if(e.type==="system"&&e.subtype==="task_started"){let a=e.tool_use_id;a&&(e.task_id&&(t.taskIdMap[a]=e.task_id),n({type:"task_started",parentToolId:a,taskId:e.task_id||"",description:e.description||""}));return}if(e.type==="system"&&e.subtype==="task_progress"){let a=e.tool_use_id||void 0,o=e.task_id,s=a||(o?Object.keys(t.taskIdMap).find(i=>t.taskIdMap[i]===o):void 0);if(s){n({type:"task_progress",parentToolId:s,taskId:o,usage:e.usage??null,lastToolName:e.last_tool_name||void 0,description:e.description||""});let i=t.teammateMap[s];if(i){let c=e.description||(e.last_tool_name?`Running ${e.last_tool_name}...`:void 0);n({type:"teammate_status",parentToolId:s,teammateName:i,status:"active",activityText:c})}}return}if(e.type==="tool_progress"){let a=e.parent_tool_use_id;if(a){n({type:"subagent_activity",parentToolId:a,text:e.content||""});let o=t.teammateMap[a];o&&n({type:"teammate_status",parentToolId:a,teammateName:o,status:"active",activityText:e.content||void 0})}return}if(e.type==="system"&&e.subtype==="task_notification"){let a=e.tool_use_id||void 0,o=e.task_id,s=a||(o?Object.keys(t.taskIdMap).find(i=>t.taskIdMap[i]===o):void 0);if(s){n({type:"subagent_done",parentToolId:s,status:e.status||"completed",summary:e.summary||"",usage:e.usage??null});let i=t.teammateMap[s];if(i){let c=e.status==="error"||e.status==="failed";n({type:"teammate_status",parentToolId:s,teammateName:i,status:c?"error":"idle",activityText:e.summary||void 0}),delete t.teammateMap[s]}}if(o){for(let i of Object.keys(t.taskIdMap))if(t.taskIdMap[i]===o){delete t.taskIdMap[i];break}}return}if(e.type==="rate_limit_event"&&e.rate_limit_info){let a=e.rate_limit_info;(a.status==="allowed_warning"||a.status==="rejected")&&n({type:"rate_limit",status:a.status,resetsAt:a.resetsAt?a.resetsAt*1e3:null,rateLimitType:a.rateLimitType||null,utilization:a.utilization||null});return}if(e.type==="prompt_suggestion"){n({type:"prompt_suggestion",suggestion:e.suggestion||""});return}}function ce(t,e,n){if(e.type==="content_block_start"){let a=e.content_block,o=e.index;a.type==="tool_use"?(t.blocks[o]={type:"tool_use",id:a.id,name:a.name,inputJson:""},n({type:"tool_start",id:a.id,name:a.name})):a.type==="thinking"?(t.blocks[o]={type:"thinking",thinkingText:"",startTime:Date.now()},n({type:"thinking_start"})):a.type==="text"&&(t.blocks[o]={type:"text"});return}if(e.type==="content_block_delta"&&e.delta){let a=e.index,o=e.delta;if(o.type==="text_delta"&&typeof o.text=="string"){if(t.streamedText=!0,t.responsePreview.length<200&&(t.responsePreview+=o.text),n({type:"delta",text:o.text}),t.teamActive){let s=o.text.matchAll(/teammate_id="([^"]+)"/g);for(let i of s){let c=i[1];(o.text.includes("idle_notification")||o.text.includes('"idleReason"'))&&n({type:"teammate_status",parentToolId:"",teammateName:c,status:"idle",activityText:"Idle"})}}}else o.type==="input_json_delta"&&t.blocks[a]?t.blocks[a].inputJson=(t.blocks[a].inputJson||"")+o.partial_json:o.type==="thinking_delta"&&t.blocks[a]&&(t.blocks[a].thinkingText=(t.blocks[a].thinkingText||"")+o.thinking,n({type:"thinking_delta",text:o.thinking}));return}if(e.type==="content_block_stop"){let a=e.index,o=t.blocks[a];if(o&&o.type==="tool_use"){let s={};try{s=JSON.parse(o.inputJson||"{}")}catch{}n({type:"tool_executing",id:o.id,name:o.name,input:s});let i=o.name;if((i==="Task"||i==="Agent"||i==="TeammateTool")&&(t.activeTaskToolIds[o.id]=!0,t.teamActive)){let c=s;if(c){let f=c.teammate_name||c.name||c.subagent_type,_=c.team_name||void 0;f&&(t.teammateMap[o.id]=f,n({type:"teammate_spawned",parentToolId:o.id,teammateName:f,teamName:_,description:c.description||c.prompt||""}))}}if(t.teamActive&&i==="SendMessage"){let c=s;if(c){let f=c.to;f&&f!=="*"&&n({type:"teammate_status",parentToolId:o.id,teammateName:f,status:"active",activityText:"Processing message\u2026"})}}}else if(o&&o.type==="thinking"){let s=o.startTime?(Date.now()-o.startTime)/1e3:0;n({type:"thinking_stop",duration:s})}delete t.blocks[a];return}}function ue(t,e,n){let a=e.parent_tool_use_id,s=e.message.content;if(Array.isArray(s)&&e.type==="assistant")for(let i of s)if(i.type==="tool_use"){let c=de(i.name,i.input);n({type:"subagent_tool",parentToolId:a,toolName:i.name,toolId:i.id,text:c})}else i.type==="thinking"?n({type:"subagent_activity",parentToolId:a,text:"Thinking..."}):i.type==="text"&&i.text&&n({type:"subagent_activity",parentToolId:a,text:"Writing response..."})}function de(t,e){return t==="Bash"&&e?.description?e.description:t==="Read"&&e?.file_path?"Reading "+e.file_path.split("/").pop():t==="Edit"&&e?.file_path?"Editing "+e.file_path.split("/").pop():t==="Write"&&e?.file_path?"Writing "+e.file_path.split("/").pop():t==="Grep"&&e?.pattern?"Searching for "+e.pattern:t==="Glob"&&e?.pattern?"Finding "+e.pattern:t==="WebSearch"&&e?.query?"Searching: "+e.query:t==="WebFetch"?"Fetching URL...":t==="Task"&&e?.description?e.description:"Running "+t+"..."}function q(){let t=[],e=null,n=!1;return{push(a){if(!n)if(e){let o=e;e=null,o({value:a,done:!1})}else t.push(a)},end(){if(n=!0,e){let a=e;e=null,a({value:void 0,done:!0})}},[Symbol.asyncIterator](){return{next(){return t.length>0?Promise.resolve({value:t.shift(),done:!1}):n?Promise.resolve({value:void 0,done:!0}):new Promise(a=>{e=a})}}}}}import{randomUUID as me}from"node:crypto";function H(t){let e={},n={},a={};return{handleCanUseTool(o,s,i){return o==="AskUserQuestion"?new Promise(c=>{n[i.toolUseID]={resolve:c,input:s},i.signal&&i.signal.addEventListener("abort",()=>{delete n[i.toolUseID],t({type:"ask_user_answered",toolId:i.toolUseID}),c({behavior:"deny",message:"Cancelled"})})}):a[o]?Promise.resolve({behavior:"allow",updatedInput:s}):new Promise(c=>{let f=me();e[f]={resolve:c,requestId:f,toolName:o,toolInput:s,toolUseId:i.toolUseID},t({type:"permission_request",requestId:f,toolName:o,toolInput:s,toolUseId:i.toolUseID,decisionReason:i.decisionReason||""}),i.signal&&i.signal.addEventListener("abort",()=>{delete e[f],t({type:"permission_cancel",requestId:f}),c({behavior:"deny",message:"Request cancelled"})})})},handlePermissionResponse(o,s,i){let c=e[o];if(!c&&o.startsWith("hydrated-")){let f=o.slice(9),_=Object.keys(e).find(I=>e[I].toolUseId===f);_&&(c=e[_])}c&&(delete e[c.requestId],t({type:"permission_resolved",requestId:c.requestId,decision:s}),o!==c.requestId&&t({type:"permission_resolved",requestId:o,decision:s}),s==="allow"?(i&&(a[c.toolName]=!0),c.resolve({behavior:"allow",updatedInput:c.toolInput})):c.resolve({behavior:"deny",message:"User denied"}))},handleAskUserResponse(o,s){let i=n[o];if(!i)return;delete n[o],t({type:"ask_user_answered",toolId:o});let c=Object.assign({},i.input,{answers:s});i.resolve({behavior:"allow",updatedInput:c})},clearPending(o){for(let s of Object.keys(n))o({type:"ask_user_answered",toolId:s}),n[s].resolve({behavior:"deny",message:"Session ended"}),delete n[s];for(let s of Object.keys(e))o({type:"permission_cancel",requestId:s}),e[s].resolve({behavior:"deny",message:"Session ended"}),delete e[s]}}}function O(){return{cliSessionId:null,resumeToken:null,relaySessionId:null,blocks:{},sentToolResults:{},streamedText:!1,responsePreview:"",activeTaskToolIds:{},taskIdMap:{},teammateMap:{},teamActive:!1,isProcessing:!1,compacting:!1}}var A={agents:[],teamName:null,leadSessionId:null,teamConfigDir:null};function ee(t,e){let n=JSON.parse(t);if(!n.members||n.members.length===0)return A;let a=[];for(let o of n.members)o.agentType!=="team-lead"&&a.push({id:o.name.toLowerCase().replace(/\s+/g,"-"),name:o.name,description:o.prompt||`${o.agentType} agent`,systemPrompt:o.prompt||"",defaultModel:o.model,agentType:o.agentType,color:o.color});return{agents:a,teamName:n.name||null,leadSessionId:n.leadSessionId||null,teamConfigDir:e}}async function ye(t){let e=P(pe(),".claude","teams"),n=X(t);try{let a=await V(e);for(let o of a)try{let s=P(e,o),i=await Z(P(s,"config.json"),"utf-8");if(!JSON.parse(i).members?.some(_=>_.cwd&&X(_.cwd)===n))continue;return ee(i,s)}catch{}return A}catch{return A}}async function ge(t){let e=P(t,".claude","teams");try{let n=await V(e);for(let a of n)try{let o=P(e,a),s=await Z(P(o,"config.json"),"utf-8");return ee(s,o)}catch{}return A}catch{return A}}var L=3,F=[2e3,5e3,1e4];function W(t){let e=t.toLowerCase();return e.includes("prompt is too long")||e.includes("context_length")||e.includes("maximum context length")||e.includes("no conversation found with session id")}function te(t){let e=null,n=null,a=null,o=null,s=O(),i=null,c="",f=[],_="acceptEdits",I="medium",$="",x=0,T=A,B=!1,C=null,k=t;t=r=>{if(r.type==="model_info"&&(r.models&&r.models.length>0&&(f=r.models),r.models=f,r.model&&(c=r.model)),C){C(r);return}k(r)};async function J(){if(e)return e;try{return e=await import("@anthropic-ai/claude-agent-sdk"),e}catch(r){let l=r;throw new Error(`Failed to load Claude SDK: ${l.message}`)}}async function z(r,l,m,u=L){let p;for(let d=0;d<u;d++){let y=F[d]??F[F.length-1];if(t({type:"info",text:`Reconnecting to Claude session (attempt ${d+1}/${u})...`}),await new Promise(b=>setTimeout(b,y)),l!==x)return console.error(`[sdk-runner] session generation changed during ${m}, aborting`),{ok:!1,reason:"generation-changed"};try{return r(d),console.error(`[sdk-runner] ${m} succeeded on attempt ${d+1}`),t({type:"info",text:"Reconnected to Claude session."}),{ok:!0}}catch(b){if(p=b,console.error(`[sdk-runner] ${m} attempt ${d+1} failed: ${p.message}`),W(p.message))return console.error(`[sdk-runner] non-retryable error during ${m}, giving up`),{ok:!1,reason:"non-retryable",error:p}}}return console.error(`[sdk-runner] ${m} all attempts exhausted`),{ok:!1,reason:"exhausted",error:p}}function se(r,l){if(l.length===0||l.find(d=>d.value===r))return r;let u=r.toLowerCase(),p=l.find(d=>d.value.toLowerCase().split("-").some(y=>y===u));return p?p.value:r}function K(r){return r.map(l=>({value:l.value,displayName:l.displayName,description:l.description,supportsEffort:l.supportsEffort,supportedEffortLevels:l.supportedEffortLevels}))}async function re(r,l){let m={[Symbol.asyncIterator](){return{next:()=>Promise.resolve({value:void 0,done:!0})}}},u=null;try{u=r.query({prompt:m,options:{cwd:l}}),u[Symbol.asyncIterator]().next().catch(()=>{});let d=null,y=!!u.initializationResult,b=!!u.supportedModels;if(console.error(`[sdk-runner] probe: initializationResult=${y}, supportedModels=${b}`),u.initializationResult){let g=await Promise.race([u.initializationResult(),new Promise(h=>setTimeout(()=>h(null),8e3))]);if(g?.models?.length)d=g.models,console.error(`[sdk-runner] probe: initializationResult returned ${d.length} models`);else if(console.error("[sdk-runner] probe: initializationResult returned no models, trying supportedModels fallback"),u.supportedModels){let h=await Promise.race([u.supportedModels(),new Promise(v=>setTimeout(()=>v(null),8e3))]);h?.length?(d=h,console.error(`[sdk-runner] probe: supportedModels fallback returned ${d.length} models`)):console.error("[sdk-runner] probe: supportedModels fallback returned no models")}}else if(u.supportedModels){let g=await Promise.race([u.supportedModels(),new Promise(h=>setTimeout(()=>h(null),8e3))]);g?.length?(d=g,console.error(`[sdk-runner] probe: supportedModels returned ${d.length} models`)):console.error("[sdk-runner] probe: supportedModels returned no models")}else console.error("[sdk-runner] probe: neither initializationResult nor supportedModels available");d&&d.length>0?(f=K(d),!c&&f.length>0&&(c=f[0].value),console.error(`[sdk-runner] probe: sending model_info with ${f.length} models`),t({type:"model_info",model:c,models:f})):console.error("[sdk-runner] probe: no models found from any method")}catch(p){console.error(`[sdk-runner] probe: error fetching models: ${p.message}`)}finally{u?.close&&u.close()}}async function Q(){if(!a)return;let r=x;try{for await(let l of a)G(s,l,t)}catch(l){if(r!==x)return;let m=l,u=m.name==="AbortError"||o&&o.signal.aborted,p=m.message||String(m),d=W(p);if(!u&&!d&&s.resumeToken&&(console.error(`[sdk-runner] query stream crashed: ${m.message}, attempting recovery`),await ae(r)))return;s.isProcessing&&(s.isProcessing=!1,u?(t({type:"info",text:"Interrupted"}),t({type:"done",code:0})):d?(t({type:"error",text:"Conversation too long to continue."}),t({type:"done",code:1})):(t({type:"error",text:`Claude process error: ${m.message}`}),t({type:"done",code:1})))}finally{r===x&&(a=null,n=null,o=null,i&&i.clearPending(t))}}function ne(r,l){let m={cwd:$,settingSources:["user","project","local"],includePartialMessages:!0,enableFileCheckpointing:!0,enableAutoMode:!0,abortController:l,promptSuggestions:!0,resume:r,permissionMode:_,effort:I};return c&&(m.model=c),i&&(m.canUseTool=(u,p,d)=>i.handleCanUseTool(u,p,d)),T.teamName&&(m.env={...process.env,CLAUDE_CODE_EXPERIMENTAL_AGENT_TEAMS:"1",CLAUDE_CODE_TEAM_NAME:T.teamName.toLowerCase()}),m}async function ae(r){if(!e)return!1;let l=e,m=s.resumeToken;return m?(await z(()=>{n=q(),o=new AbortController;let p=ne(m,o);a=l.query({prompt:n,options:p}),s.isProcessing=!0,x++,Q().catch(d=>{console.error("[sdk-runner] recovered stream error:",d)})},r,"stream-crash-recovery")).ok:!1}let M="done",R="",D=0,N=0,U=null;function ie(){C=r=>{if(r.type==="delta"&&typeof r.text=="string"&&(R+=r.text),r.type==="delta"&&typeof r.text=="string"){let l=r.text,m=l.matchAll(/teammate_id="([^"]+)"/g);for(let u of m){let p=u[1];(l.includes("idle_notification")||l.includes("online"))&&k({type:"teammate_status",parentToolId:"",teammateName:p,status:"idle",activityText:"Online"})}}if(r.type==="done"||r.type==="result"){if(M==="broadcast_test"){let l=R.toUpperCase(),m=l.includes("TEAM_READY")||l.includes("BROADCAST")&&l.includes("SUCCESS")||l.includes("MESSAGE SENT"),u=l.includes("TEAM_NEEDS_REBUILD")||l.includes("NOT IN A TEAM")||l.includes("NO TEAM")||l.includes("ERROR");m&&!u?(M="done",C=null,k({type:"agent_mode_status",statusText:"Team is ready!"}),k({type:"agent_mode_ready",success:!0}),k(r)):(M="spawning",R="",k({type:"agent_mode_status",statusText:"Spawning teammates\u2026"}),le());return}if(M==="spawning"){B=!0,M="waiting_for_teammates",N=0,D=T.agents.filter(l=>l.agentType!=="team-lead").length,k({type:"agent_mode_status",statusText:`Waiting for ${D} teammates to come online\u2026`}),k(r),U=setTimeout(()=>{M==="waiting_for_teammates"&&(M="done",C=null,k({type:"agent_mode_status",statusText:"Team is ready!"}),k({type:"agent_mode_ready",success:!0}))},45e3);return}}if(M!=="done"){(r.type==="teammate_spawned"||r.type==="teammate_status"||r.type==="session_id")&&(k(r),M==="waiting_for_teammates"&&r.type==="teammate_spawned"&&(N++,k({type:"agent_mode_status",statusText:`Teammates online: ${N}/${D}\u2026`}),N>=D&&(U&&(clearTimeout(U),U=null),M="done",C=null,k({type:"agent_mode_status",statusText:"Team is ready!"}),k({type:"agent_mode_ready",success:!0}))));return}k(r)}}function le(){if(!n||!T.teamName){k({type:"agent_mode_ready",success:!1,error:"Cannot spawn team \u2014 no session or template"});return}(T.teamConfigDir?fe(T.teamConfigDir,{recursive:!0,force:!0}).catch(()=>{}):Promise.resolve()).then(()=>{let l=T.agents.map(u=>{let p=u.defaultModel?` (model: ${u.defaultModel})`:"";return`- **${u.name}** \u2014 ${u.agentType||"general-purpose"}${p}: ${u.description}`}).join(`
|
|
4
4
|
`),m=[`Create an agent team called "${T.teamName.toLowerCase()}" with the following teammates, all using in-process mode:`,"",l,"","Use teammate-mode in-process. Spawn all teammates now. After they are all running, confirm the team is ready.","Do NOT start any tasks yet \u2014 just set up the team."].join(`
|
|
5
|
-
`);n.push({type:"user",message:{role:"user",content:[{type:"text",text:m}]}})})}let j={async startSession(r){let l=await J();f.length===0?(console.error("[sdk-runner] startSession: no cached models, launching probe"),re(l,r.cwd).catch(y=>{console.error(`[sdk-runner] startSession: probe failed: ${y.message}`)})):console.error(`[sdk-runner] startSession: ${f.length} models already cached, skipping probe`),B=!1;let m=A;try{m=await ge(r.cwd)}catch{}let u=A;try{u=await ye(r.cwd)}catch{}m.agents.length>0?T={agents:m.agents,teamName:m.teamName||u.teamName,leadSessionId:u.leadSessionId,teamConfigDir:u.teamConfigDir}:T={agents:[],teamName:u.teamName,leadSessionId:u.leadSessionId,teamConfigDir:u.teamConfigDir},t({type:"agent_team_loaded",agents:T.agents}),x++;let p=x;s=O(),s.isProcessing=!0,s.teamActive=T.agents.length>0,r.relaySessionId&&(s.relaySessionId=r.relaySessionId),i=H(t),n=q(),r.initialMessage&&n.push(r.initialMessage),o=new AbortController
|
|
5
|
+
`);n.push({type:"user",message:{role:"user",content:[{type:"text",text:m}]}})})}let j={async startSession(r){let l=await J();f.length===0?(console.error("[sdk-runner] startSession: no cached models, launching probe"),re(l,r.cwd).catch(y=>{console.error(`[sdk-runner] startSession: probe failed: ${y.message}`)})):console.error(`[sdk-runner] startSession: ${f.length} models already cached, skipping probe`),B=!1;let m=A;try{m=await ge(r.cwd)}catch{}let u=A;try{u=await ye(r.cwd)}catch{}m.agents.length>0?T={agents:m.agents,teamName:m.teamName||u.teamName,leadSessionId:u.leadSessionId,teamConfigDir:u.teamConfigDir}:T={agents:[],teamName:u.teamName,leadSessionId:u.leadSessionId,teamConfigDir:u.teamConfigDir},t({type:"agent_team_loaded",agents:T.agents}),x++;let p=x;s=O(),s.isProcessing=!0,s.teamActive=T.agents.length>0,r.relaySessionId&&(s.relaySessionId=r.relaySessionId),i=H(t),n=q(),r.initialMessage&&n.push(r.initialMessage),o=new AbortController,$=r.cwd;let d={cwd:r.cwd,settingSources:["user","project","local"],includePartialMessages:!0,enableFileCheckpointing:!0,enableAutoMode:!0,abortController:o,promptSuggestions:!0,canUseTool:(y,b,g)=>i.handleCanUseTool(y,b,g)};if(T.teamName&&(d.env={...process.env,CLAUDE_CODE_EXPERIMENTAL_AGENT_TEAMS:"1",CLAUDE_CODE_TEAM_NAME:T.teamName.toLowerCase()}),r.model&&(d.model=r.model,c=r.model),r.permissionMode?(d.permissionMode=r.permissionMode,_=r.permissionMode):d.permissionMode=_,d.effort=I,r.resume){if(d.resume=r.resume,s.cliSessionId=r.resume,s.resumeToken=r.resume,l.getSessionMessages)try{let y=await l.getSessionMessages(r.resume);y&&y.length>0&&t({type:"session_history",messages:y,...s.relaySessionId?{relaySessionId:s.relaySessionId}:{}})}catch(y){t({type:"info",text:`Could not restore session history: ${y.message}`})}t({type:"config_state",model:c,mode:_,effort:I,betas:[]})}try{a=l.query({prompt:n,options:d})}catch(y){let b=y;if(console.error(`[sdk-runner] query start failed (attempt 1/${L+1}): ${b.message}`),W(b.message)){s.isProcessing=!1,a=null,n=null,o=null,t({type:"error",text:`Failed to start query: ${b.message}`}),t({type:"done",code:1}),t({type:"session_ready",error:b.message});return}let g=await z(()=>{n=q(),o=new AbortController,d.abortController=o,a=l.query({prompt:n,options:d})},p,"query-start-retry");if(!g.ok){if(g.reason!=="generation-changed"){s.isProcessing=!1,a=null,n=null,o=null;let h=g.reason==="exhausted"?`Failed to start query after ${L+1} attempts: ${g.error?.message??b.message}`:`Failed to start query: ${g.error?.message??b.message}`;t({type:"error",text:h}),t({type:"done",code:1}),t({type:"session_ready",error:h})}return}}if(a?.supportedModels){let y=a;(async()=>{let g=[500,1500,3e3,5e3];for(let h=0;h<g.length;h++){if(f.length>0){console.error(`[sdk-runner] real query: models already populated (attempt ${h}), skipping`);return}try{console.error(`[sdk-runner] real query: calling supportedModels() attempt ${h}`);let v=await Promise.race([y.supportedModels(),new Promise(Y=>setTimeout(()=>Y(null),g[h]))]);if(v&&v.length>0){f=K(v),!c&&f.length>0&&(c=f[0].value),console.error(`[sdk-runner] real query: supportedModels returned ${f.length} models on attempt ${h}`),t({type:"model_info",model:c,models:f});return}console.error(`[sdk-runner] real query: supportedModels returned empty on attempt ${h}`)}catch(v){console.error(`[sdk-runner] real query: supportedModels error on attempt ${h}: ${v.message}`)}h<g.length-1&&await new Promise(v=>setTimeout(v,g[h]))}console.error("[sdk-runner] real query: all supportedModels attempts exhausted")})().catch(()=>{})}else console.error("[sdk-runner] real query: supportedModels not available on query instance");Q().catch(()=>{}),t({type:"session_ready"})},activateAgentMode(){if(!n){k({type:"agent_mode_ready",success:!1,error:"No active session"});return}if(T.agents.length===0||!T.teamName){k({type:"agent_mode_ready",success:!1,error:"No team template found"});return}if(M!=="done")return;k({type:"agent_mode_status",statusText:"Checking team status\u2026"}),M="broadcast_test",R="",ie();let r=['You are activating VibeAgent mode. First, try to broadcast a ping to the team using SendMessage with to="*".',"If the broadcast succeeds, respond with exactly: TEAM_READY",'If the broadcast fails (e.g. "Not in a team context" or no teammates found), respond with exactly: TEAM_NEEDS_REBUILD',"Do not explain anything else \u2014 just respond with one of those two phrases."].join(`
|
|
6
6
|
`);n.push({type:"user",message:{role:"user",content:[{type:"text",text:r}]}})},async requestHistory(r,l){let m=await J(),u=l||s.relaySessionId;if(r&&m.getSessionMessages)try{let p=await m.getSessionMessages(r);if(p&&p.length>0)t({type:"session_history",messages:p,...u?{relaySessionId:u}:{}});else if(s.cliSessionId&&s.cliSessionId!==r){let d=await m.getSessionMessages(s.cliSessionId);d&&d.length>0&&(t({type:"session_history",messages:d,...u?{relaySessionId:u}:{}}),t({type:"session_id",cliSessionId:s.cliSessionId,...u?{relaySessionId:u}:{}}))}}catch(p){t({type:"info",text:`Could not restore session history: ${p.message}`})}f.length>0&&t({type:"model_info",model:c,models:f,...u?{relaySessionId:u}:{}}),t({type:"config_state",model:c,mode:_,effort:I,betas:[],...u?{relaySessionId:u}:{}})},pushUserMessage(r,l,m){if(m&&r&&(r=`Use SendMessage to send the following to teammate "${m}":
|
|
7
7
|
|
|
8
|
-
${r}`),r&&r.startsWith("/")){let p=r.split(/\s/)[0].toLowerCase();if(p==="/clear"){x++,o&&o.abort(),n&&n.end(),this.startSession({cwd
|
|
9
|
-
`)});return}}if(!n){if(
|
|
10
|
-
`)}function
|
|
11
|
-
`)}var S=te(
|
|
8
|
+
${r}`),r&&r.startsWith("/")){let p=r.split(/\s/)[0].toLowerCase();if(p==="/clear"){x++,o&&o.abort(),n&&n.end(),this.startSession({cwd:$,model:c||void 0,permissionMode:_||void 0}).then(()=>{t({type:"slash_command_result",command:"clear",text:"Conversation cleared."})}).catch(d=>{t({type:"error",text:`Failed to clear session: ${d.message}`})});return}if(p==="/status"){let d=["**Bridge Status**","",`**Model:** ${c||"(not set)"}`,`**Available Models:** ${f.length>0?f.map(y=>`${y.displayName} (${y.value})`).join(", "):"(none discovered yet)"}`,`**Effort:** ${I}`,`**Permission Mode:** ${_}`,`**Session Active:** ${a?"yes":"no"}`,`**CLI Session:** ${s.cliSessionId||"(none)"}`,`**Working Directory:** ${$||"(not set)"}`,"","**Raw SDK Model Data:**","```json",JSON.stringify(f,null,2),"```"];t({type:"slash_command_result",command:"status",text:d.join(`
|
|
9
|
+
`)});return}}if(!n){if($){console.error("[sdk-runner] pushUserMessage: no active stream, restarting bridge"),t({type:"info",text:"Reconnecting..."});let p=[];if(l&&l.length>0)for(let g of l)p.push({type:"image",source:{type:"base64",media_type:g.mediaType,data:g.data}});r&&p.push({type:"text",text:r});let d={type:"user",message:{role:"user",content:p}},y={cwd:$,model:c||void 0,permissionMode:_||void 0};(async()=>{try{await j.startSession({...y,...s.resumeToken?{resume:s.resumeToken}:{},initialMessage:d})}catch(g){console.error(`[sdk-runner] resume restart failed: ${g.message}, trying fresh`);try{await j.startSession({...y,initialMessage:d})}catch(h){t({type:"error",text:`Session restart failed: ${h.message}`}),t({type:"done",code:1})}}})();return}t({type:"error",text:"No active session"});return}let u=[];if(l&&l.length>0)for(let p of l)u.push({type:"image",source:{type:"base64",media_type:p.mediaType,data:p.data}});r&&u.push({type:"text",text:r}),s.isProcessing=!0,s.streamedText=!1,s.responsePreview="",s.blocks={},s.sentToolResults={},n.push({type:"user",message:{role:"user",content:u}})},interrupt(){a?.interrupt?a.interrupt().catch(()=>{o&&o.abort()}):o&&o.abort()},async setModel(r){let l=se(r,f);if(!a?.setModel){c=l,t({type:"model_info",model:l,models:f});return}try{await a.setModel(l),c=l,t({type:"model_info",model:l,models:[]}),t({type:"config_state",model:c,mode:_,effort:I,betas:[]})}catch(m){t({type:"error",text:`Failed to switch model: ${m.message}`})}},async setMode(r){if(!a?.setPermissionMode){_=r,t({type:"config_state",model:c,mode:_,effort:I,betas:[]});return}try{await a.setPermissionMode(r),_=r,t({type:"config_state",model:c,mode:_,effort:I,betas:[]})}catch(l){t({type:"error",text:`Failed to set permission mode: ${l.message}`})}},setEffort(r){["low","medium","high","max"].includes(r)||(console.warn(`[sdk-runner] Unknown effort level "${r}", defaulting to medium`),r="medium"),I=r,t({type:"config_state",model:c,mode:_,effort:I,betas:[]})},handlePermissionResponse(r,l,m){i?.handlePermissionResponse(r,l,m)},handleAskUserResponse(r,l){i?.handleAskUserResponse(r,l)},shutdown(){a?.close?a.close():o&&o.abort(),n&&n.end()}};return j}function E(t){let e=JSON.stringify(t);process.stdout.write(e+`
|
|
10
|
+
`)}function w(t,e,n){let a={level:t,message:e,ts:new Date().toISOString(),...n};process.stderr.write(JSON.stringify(a)+`
|
|
11
|
+
`)}var S=te(E),oe=_e({input:process.stdin,crlfDelay:1/0});oe.on("line",async t=>{if(!t.trim())return;let e;try{e=JSON.parse(t)}catch{w("error","Failed to parse inbound message",{raw:t.slice(0,200)});return}try{switch(e.type){case"start_session":w("info","Starting session",{cwd:e.cwd,model:e.model});try{await S.startSession({cwd:e.cwd,model:e.model,permissionMode:e.permissionMode,resume:e.resume,relaySessionId:e.relaySessionId}),E({type:"session_ready"})}catch(n){E({type:"session_ready",error:String(n)})}break;case"user_message":w("info","User message received",{textLength:e.text?.length??0,targetAgentId:e.targetAgentId}),S.pushUserMessage(e.text,e.images,e.targetAgentId);break;case"interrupt":w("info","Interrupt requested"),S.interrupt();break;case"permission_response":w("info","Permission response",{requestId:e.requestId,decision:e.decision}),S.handlePermissionResponse(e.requestId,e.decision,e.allowForSession);break;case"ask_user_response":w("info","Ask user response",{toolId:e.toolId}),S.handleAskUserResponse(e.toolId,e.answers);break;case"set_model":w("info","Set model",{model:e.model}),await S.setModel(e.model);break;case"set_mode":w("info","Set mode",{mode:e.mode}),await S.setMode(e.mode);break;case"set_effort":w("info","Set effort",{effort:e.effort}),S.setEffort(e.effort);break;case"activate_agent_mode":w("info","Activate agent mode requested"),S.activateAgentMode();break;case"request_history":w("info","History request",{resume:e.resume}),await S.requestHistory(e.resume,e.relaySessionId);break;case"ping":E({type:"pong"});break;case"shutdown":w("info","Shutdown requested"),S.shutdown(),setTimeout(()=>process.exit(0),500);break;default:w("warn","Unknown message type",{type:e.type})}}catch(n){let a=n;w("error",`Error handling message type=${e.type}`,{error:a.message}),E({type:"error",text:`Internal bridge error: ${a.message}`})}});oe.on("close",()=>{w("info","stdin closed, shutting down"),S.shutdown(),setTimeout(()=>process.exit(0),500)});process.on("uncaughtException",t=>{w("error","Uncaught exception",{error:t.message,stack:t.stack}),E({type:"error",text:`Bridge crash: ${t.message}`}),E({type:"done",code:1}),process.exit(1)});process.on("unhandledRejection",t=>{let e=t instanceof Error?t.message:String(t);w("error","Unhandled rejection",{error:e})});E({type:"ready"});w("info","SDK bridge ready");
|
package/package.json
CHANGED
|
@@ -1,6 +1,6 @@
|
|
|
1
1
|
{
|
|
2
2
|
"name": "@vibetonomy/agent",
|
|
3
|
-
"version": "1.5.
|
|
3
|
+
"version": "1.5.4",
|
|
4
4
|
"description": "Vibetonomy agent — managed Claude Code sessions via npx",
|
|
5
5
|
"license": "UNLICENSED",
|
|
6
6
|
"type": "module",
|
|
@@ -15,11 +15,11 @@
|
|
|
15
15
|
"@anthropic-ai/claude-agent-sdk": "0.2.87"
|
|
16
16
|
},
|
|
17
17
|
"optionalDependencies": {
|
|
18
|
-
"@vibetonomy/agent-linux-x64": "1.5.
|
|
19
|
-
"@vibetonomy/agent-linux-arm64": "1.5.
|
|
20
|
-
"@vibetonomy/agent-darwin-arm64": "1.5.
|
|
21
|
-
"@vibetonomy/agent-darwin-x64": "1.5.
|
|
22
|
-
"@vibetonomy/agent-win-x64": "1.5.
|
|
18
|
+
"@vibetonomy/agent-linux-x64": "1.5.4",
|
|
19
|
+
"@vibetonomy/agent-linux-arm64": "1.5.4",
|
|
20
|
+
"@vibetonomy/agent-darwin-arm64": "1.5.4",
|
|
21
|
+
"@vibetonomy/agent-darwin-x64": "1.5.4",
|
|
22
|
+
"@vibetonomy/agent-win-x64": "1.5.4"
|
|
23
23
|
},
|
|
24
24
|
"engines": {
|
|
25
25
|
"node": ">=18.0.0"
|