@vibetonomy/agent 1.2.1 → 1.3.0

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