ideawave 0.0.78 → 0.0.79

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.
Files changed (2) hide show
  1. package/dist/index.mjs +2 -2
  2. package/package.json +1 -1
package/dist/index.mjs CHANGED
@@ -1058,7 +1058,7 @@ ${J}`:null].filter(Boolean).join(`
1058
1058
 
1059
1059
  `));return P0(X)}function t4(X,W){if(!W)return X;if(!X)return W;if(X===W||X.endsWith(W))return X;if(W.startsWith(X))return W;return _0(`${X}
1060
1060
 
1061
- ${W}`)}function v2(X){if(!Array.isArray(X))return null;let W=X.flatMap((Z)=>{if(!Z||typeof Z!=="object")return[];let K=Z;if(typeof K.path!=="string"||!K.path.trim())return[];let J=typeof K.line==="number"?`:${K.line}`:"";return[`${K.path}${J}`]});return W.length>0?W.slice(0,5):null}function e4(X){let{ctx:W,appendText:Z,appendToolActivity:K}=X,J=X.flushIntervalMs??z5,Y="",H="",U=0,F=null,w={},B=new Map,b=(M)=>{if(B.set(M.toolCallId,M),!K)return;K({boardId:W.boardId,cardId:W.cardId,runId:W.runId,entry:M}).catch((P)=>{console.warn("[streamAdapter] appendToolActivity failed",P)})},R=(M)=>{let P=`${W.runId}:thought`,$=B.get(P);if(!$||$.status!=="running")return;b({...$,status:"completed",completedAt:$.completedAt??M})},f=(M)=>{for(let P of B.values()){if(P.status!=="running"||P.rawTitle.toLowerCase()!=="toolsearch")continue;b({...P,status:"completed",completedAt:P.completedAt??M})}},v=(M)=>{for(let P of Array.from(B.values())){if(P.status!=="running")continue;if(P.kind==="thought"||P.rawTitle==="agent_thought")continue;b({...P,status:"completed",completedAt:P.completedAt??M})}},O="",h=0,C=null,g=null,N=(M)=>{if(M===O)return;O=M,h=Date.now(),Z({boardId:W.boardId,cardId:W.cardId,runId:W.runId,text:M}).catch((P)=>{console.warn("[streamAdapter] appendText failed",P)})},m=()=>{if(C!==null)clearTimeout(C),C=null;if(g!==null){let M=g;g=null,N(M)}},u=(M)=>{let P=Date.now()-h;if(P>=J&&C===null){N(M);return}if(g=M,C===null){let $=Math.max(0,J-P);C=setTimeout(()=>{C=null,m()},$)}};return{onSessionUpdate:async(M)=>{let P=M.update;switch(w[P.sessionUpdate]=(w[P.sessionUpdate]??0)+1,P.sessionUpdate){case"agent_message_chunk":{let $=new Date().toISOString();if(R($),P.content.type==="text")Y+=P.content.text,u(Y);else{let E=`agent_message_chunk:${P.content.type}`;w[E]=(w[E]??0)+1}return}case"agent_thought_chunk":{if(P.content.type!=="text")return;H+=P.content.text;let $=new Date().toISOString(),E=`${W.runId}:thought`,A=B.get(E);b({toolCallId:E,rawTitle:"agent_thought",title:"Thought",kind:"thought",status:"running",startedAt:A?.startedAt??$,completedAt:null,contentPreview:_0(H.trim())});return}case"user_message_chunk":return;case"tool_call":{U+=1;let $=o4(P.title),E=B2(P.status),A=new Date().toISOString();R(A),f(A),b({toolCallId:P.toolCallId,rawTitle:$,title:P2($,P.rawInput),kind:L2(P.kind),status:E,startedAt:A,completedAt:E==="running"?null:A,inputPreview:P0(P.rawInput),outputPreview:x2(P.rawOutput),contentPreview:UX(P.content),locations:v2(P.locations)});return}case"tool_call_update":{let $=B.get(P.toolCallId);if(!$){let T=o4(P.title),X0=B2(P.status),r=new Date().toISOString();b({toolCallId:P.toolCallId,rawTitle:T,title:P2(T,P.rawInput),kind:L2(P.kind),status:X0,startedAt:r,completedAt:X0==="running"?null:r,inputPreview:P0(P.rawInput),outputPreview:x2(P.rawOutput),contentPreview:UX(P.content),locations:v2(P.locations)});return}let E=P.status===void 0||P.status===null?$.status:B2(P.status),A=typeof P.title==="string"&&P.title.trim().length>0?P.title:$.rawTitle,q0=typeof P.title==="string"&&P.title.trim().length>0,x0=E==="running"?$.completedAt:$.completedAt??new Date().toISOString(),k=P.content===void 0?$.contentPreview:t4($.contentPreview,UX(P.content)),d=P.rawOutput===void 0?$.outputPreview:t4($.outputPreview,x2(P.rawOutput));b({...$,rawTitle:A,title:q0?P2(A,P.rawInput):$.title,kind:P.kind===void 0?$.kind:L2(P.kind),status:E,completedAt:x0,inputPreview:P.rawInput===void 0?$.inputPreview:P0(P.rawInput),outputPreview:d,contentPreview:k,locations:P.locations===void 0?$.locations:v2(P.locations)});return}case"plan":F=P.entries;return;case"available_commands_update":return;case"current_mode_update":return;default:return}},getFinalText:()=>Y,getToolCallCount:()=>U,getLatestPlan:()=>F,getUpdateTypeCounts:()=>({...w}),flush:(M)=>{let P=new Date().toISOString();if(R(P),M?.completeOpenToolCalls)v(P);m()}}}var P1=1,X3=-32000;function W3(X){if(X.awaitingInput)return!1;return X.nowMs-X.lastUpdateMs>=X.windowMs}function K3(X){if(!X||typeof X!=="object")return!1;return X.code===X3}var U5=60000,F5=U5,q5=5000;function B5(X){let W=Math.max(1,Math.round(X/1000));return`Runtime has not responded for ${W} ${W===1?"second":"seconds"}. Retry the agent run.`}function J3(){return{name:"ideawave-cli",title:"IdeaWave CLI",version:"0.0.78".trim()?"0.0.78":"dev"}}function V3(X){if(X===P1)return;throw new I(`Unsupported ACP protocol version ${X}; expected ${P1}`)}function Y3(X){return H5.toWeb(X)}function z3(X){return w5.toWeb(X)}function b2(X){return X!==null&&typeof X==="object"}function L5(X){if(!Array.isArray(X))return[];let W=[];for(let Z of X){if(!b2(Z))continue;if(typeof Z.group==="string"&&Array.isArray(Z.options)){let K=typeof Z.name==="string"?Z.name:Z.group;for(let J of Z.options){if(!b2(J))continue;if(typeof J.value!=="string"||typeof J.name!=="string")continue;W.push({value:J.value,name:J.name,description:typeof J.description==="string"?J.description:null,group:Z.group,groupName:K})}continue}if(typeof Z.value!=="string"||typeof Z.name!=="string")continue;W.push({value:Z.value,name:Z.name,description:typeof Z.description==="string"?Z.description:null,group:null,groupName:null})}return W}function P5(X){if(!b2(X))return null;if(typeof X.id!=="string"||typeof X.name!=="string")return null;let W=typeof X.category==="string"?X.category:null,Z=typeof X.description==="string"?X.description:null;if(X.type==="select"){let K=typeof X.currentValue==="string"?X.currentValue:null;return{id:X.id,name:X.name,category:W,description:Z,type:"select",currentValue:K,options:L5(X.options)}}if(X.type==="boolean"){let K=typeof X.currentValue==="boolean"?X.currentValue:typeof X.value==="boolean"?X.value:null;return{id:X.id,name:X.name,category:W,description:Z,type:"boolean",currentValue:K,options:[]}}return null}function y2(X){let W=(X.configOptions??[]).map(P5).filter((U)=>U!==null),Z=W.find((U)=>U.type==="select"&&U.category==="model")??W.find((U)=>U.type==="select"&&U.id==="model")??null,K=Z?.options.map((U)=>({id:U.value,name:U.name,description:U.description??null})),J=x5(X.models),Y=K&&K.length>0?K:J&&J.length>0?J:null,H=(typeof Z?.currentValue==="string"?Z.currentValue:null)??v5(X.models)??null;return{models:Y,currentModelId:H,configOptions:W,modelConfigId:Z?.id??null}}function x5(X){if(!X||!Array.isArray(X.availableModels))return null;let W=[];for(let Z of X.availableModels){if(typeof Z.modelId!=="string")continue;W.push({id:Z.modelId,name:typeof Z.name==="string"?Z.name:null,description:typeof Z.description==="string"?Z.description:null})}return W.length>0?W:null}function v5(X){return typeof X?.currentModelId==="string"?X.currentModelId:null}function b5(X,W){let Z=[];if(X.trim())Z.push({type:"text",text:X});for(let K of W)if(K.content.trim())Z.push({type:"text",text:K.content});return Z}function y5(X){if(typeof X.value==="boolean")return{sessionId:X.sessionId,configId:X.configId,type:"boolean",value:X.value};return{sessionId:X.sessionId,configId:X.configId,value:X.value}}function f5(X,W){let Z=y2({configOptions:W.configOptions});return{models:Z.models??X.models,currentModelId:Z.currentModelId??X.currentModelId,configOptions:Z.configOptions,modelConfigId:Z.modelConfigId??X.modelConfigId}}function j3(X,W){if(X==="default")return null;if(!W||W.length===0)return X;let Z=W.find((w)=>w.id===X);if(Z)return Z.id;let K=X.toLowerCase(),J=K.includes("opus")?"opus":K.includes("sonnet")?"sonnet":K.includes("haiku")?"haiku":null;if(!J)return X;let Y=(w)=>`${w.id} ${w.name??""} ${w.description??""}`.toLowerCase(),H=W.filter((w)=>Y(w).includes(J));if(H.length===0)return X;let F=(K.includes("1m")?H.find((w)=>Y(w).includes("1m")):void 0)??H[0];return F?F.id:X}async function qX(X){try{let W=await X.conn.setSessionConfigOption(y5({sessionId:X.sessionId,configId:X.configId,value:X.value}));return f5(X.metadata,W)}catch(W){return console.warn(`[acp] setSessionConfigOption(${X.label}) failed; using agent default.`,W instanceof Error?W.message:W),X.metadata}}async function f2(X){let W=F2(X.spawn),Z=[],K=0,J=4096;W.stderr.on("data",(k)=>{Z.push(k),K+=k.length;while(K>J*2&&Z.length>1){let d=Z.shift();if(d)K-=d.length}});let Y=()=>{let k=Buffer.concat(Z).toString("utf8");return k.length>J?k.slice(-J):k},H=s4(X.spawn.cwd),U={current:null},F={current:null},w={at:Date.now()},B=null,b=z3(W.stdin),R=Y3(W.stdout),f=Q3(b,R),O=new Z3((k)=>({requestPermission:async(d)=>{let T=d.options,X0=T?.find((r)=>r.kind==="allow_once")??T?.find((r)=>r.kind==="allow_always");if(X0)return{outcome:{outcome:"selected",optionId:X0.optionId}};return{outcome:{outcome:"cancelled"}}},sessionUpdate:async(d)=>{w.at=Date.now();let T=F.current;if(T){let r=d.update.sessionUpdate;if(T.updateCount+=1,T.updateCount===1||T.lastUpdateType!==r||r==="tool_call"||r==="tool_call_update")G("acp.session_update",{runId:T.runId,cardId:T.cardId,sessionId:B,updateType:r,updateCount:T.updateCount,elapsedMs:Date.now()-T.startedAt});T.lastUpdateType=r}let X0=U.current;if(X0)await X0.onSessionUpdate(d)},readTextFile:H.readTextFile}),f),h=()=>W.kill();if(X.signal)X.signal.addEventListener("abort",h);let C=()=>{if(X.signal)X.signal.removeEventListener("abort",h)},g=async(k,d)=>{if(C(),W.kill(),K3(k))throw new l0(k.message??"Authentication required",d);if(k instanceof Error&&k.message==="ACP connection closed"){if(X.signal?.aborted)throw new I("ACP session cancelled: abort signal received");let T=await Promise.race([W.processCrashed,W.waitForExit,new Promise((X0)=>setTimeout(()=>X0({stderr:""}),500))]);throw new I(`Runtime process exited before completion: ${T.stderr?.trim()??""}`)}throw k},N;try{N=await O.initialize({protocolVersion:P1,clientCapabilities:U2,clientInfo:J3()})}catch(k){throw await g(k,[]),Error("unreachable")}try{V3(N.protocolVersion)}catch(k){throw C(),W.kill(),k}let m=N.authMethods?.map((k)=>k.id)??[],u;try{u=await O.newSession({cwd:X.spawn.cwd,mcpServers:X.mcpServers??[]})}catch(k){throw await g(k,m),Error("unreachable")}let M=u.sessionId;B=M;let P=y2(u),$=X.modelId??null,E=$?j3($,P.models):null;if(E&&E!==P.currentModelId)if(P.modelConfigId)P=await qX({conn:O,sessionId:M,configId:P.modelConfigId,value:E,metadata:P,label:`${P.modelConfigId}=${E}`});else console.warn(`[acp] runtime did not advertise a model config option for ${E}; using agent default.`);for(let[k,d]of Object.entries(X.configValues??{}).sort(([T],[X0])=>T.localeCompare(X0))){if(k===P.modelConfigId)continue;if(!P.configOptions.some((T)=>T.id===k))continue;P=await qX({conn:O,sessionId:M,configId:k,value:d,metadata:P,label:`${k}=${String(d)}`})}C();let A=!1,q0=async()=>{if(A)return;A=!0,W.kill(),await Promise.race([W.waitForExit,new Promise((k)=>setTimeout(k,2000))])},x0=!1;return W.processCrashed.then(()=>{x0=!0}),{sessionId:M,availableModels:P.models,currentModelId:P.currentModelId,availableConfigOptions:P.configOptions,isAlive:()=>!A&&!x0,dispose:q0,prompt:(k)=>R5({proc:W,conn:O,sessionId:M,activeAdapter:U,activeTrace:F,lastUpdate:w,collectStderrTail:Y},k)}}async function R5(X,W){let{proc:Z,conn:K,sessionId:J,activeAdapter:Y,activeTrace:H,lastUpdate:U}=X,F=Date.now(),w=W.heartbeatMs??F5,B=B5(w),b={boardId:W.boardId,cardId:W.cardId,runId:W.runId},R=e4({ctx:b,appendText:W.appendText,appendToolActivity:W.appendToolActivity});Y.current=R,H.current={runId:W.runId,cardId:W.cardId,startedAt:F,updateCount:0,lastUpdateType:null},U.at=Date.now(),G("acp.prompt_started",{runId:W.runId,cardId:W.cardId,sessionId:J,heartbeatWindowMs:w});let f=!1,v=null,O=()=>Z.kill();W.signal.addEventListener("abort",O);try{let h=async()=>{let m=Math.min(q5,Math.max(50,Math.floor(w/2)));v=setInterval(()=>{let M=W.isAwaitingInput?.()??!1;if(M){U.at=Date.now();return}if(W3({nowMs:Date.now(),lastUpdateMs:U.at,windowMs:w,awaitingInput:M}))f=!0,G("acp.inactivity_timeout",{runId:W.runId,cardId:W.cardId,sessionId:J,windowMs:w,silentForMs:Date.now()-U.at}),K.cancel({sessionId:J}).catch(()=>{return}),Z.kill()},m);let u=b5(W.prompt.systemPrompt,W.prompt.messages);await K.prompt({sessionId:J,prompt:u}),G("acp.prompt_resolved",{runId:W.runId,cardId:W.cardId,sessionId:J,elapsedMs:Date.now()-F}),R.flush({completeOpenToolCalls:!0})},C=Z.waitForExit.then((m)=>({kind:"exited",exit:m})),g=h().then(()=>({kind:"ok"})).catch(async(m)=>{if(m instanceof Error&&m.message==="ACP connection closed")return{kind:"crashed",exit:await Promise.race([Z.processCrashed,Z.waitForExit])};throw m}),N;try{N=await Promise.race([g,Z.processCrashed.then((m)=>({kind:"crashed",exit:m})),C])}catch(m){if(f)throw new H0(B);throw m}if(f)throw new H0(B);if(N.kind==="crashed")throw new I(`Runtime process exited before completion: ${N.exit.stderr.trim()}`);if(N.kind==="exited"){if(W.signal.aborted)throw new I("ACP session cancelled: abort signal received");if(f)throw new H0(B);throw new I(`Runtime process exited unexpectedly: ${N.exit.stderr.trim()}`)}return{modelReported:"unknown",finalText:R.getFinalText(),toolCallsExecuted:R.getToolCallCount(),stderrTail:X.collectStderrTail(),updateTypeCounts:R.getUpdateTypeCounts()}}finally{if(G("acp.prompt_finished",{runId:W.runId,cardId:W.cardId,sessionId:J,elapsedMs:Date.now()-F,timedOut:f,updateCount:H.current?.updateCount??0}),v!==null)clearInterval(v);W.signal.removeEventListener("abort",O),R.flush({completeOpenToolCalls:!0}),Y.current=null,H.current=null}}var O5=30000;async function H3(X){let W=F2(X.spawn),Z=z3(W.stdin),K=Y3(W.stdout),J=Q3(Z,K),H=new Z3((w)=>({requestPermission:async()=>({outcome:{outcome:"cancelled"}}),sessionUpdate:async()=>{return},readTextFile:async()=>({content:""})}),J),U=()=>W.kill();if(X.signal)X.signal.addEventListener("abort",U);let F=null;try{let w=(async()=>{let b=await H.initialize({protocolVersion:P1,clientCapabilities:U2,clientInfo:J3()});V3(b.protocolVersion);let R=b.authMethods?.map((N)=>N.id)??[],f;try{f=await H.newSession({cwd:X.spawn.cwd,mcpServers:[]})}catch(N){if(K3(N))throw new l0(N.message??"Authentication required",R);throw N}let v=y2(f),O=X.modelId??null,h=O?j3(O,v.models):null;if(h&&h!==v.currentModelId)if(v.modelConfigId)v=await qX({conn:H,sessionId:f.sessionId,configId:v.modelConfigId,value:h,metadata:v,label:`${v.modelConfigId}=${h}`});else console.warn(`[acp] runtime did not advertise a model config option for ${h}; discovering agent default models.`);for(let[N,m]of Object.entries(X.configValues??{}).sort(([u],[M])=>u.localeCompare(M))){if(N===v.modelConfigId)continue;if(!v.configOptions.some((u)=>u.id===N))continue;v=await qX({conn:H,sessionId:f.sessionId,configId:N,value:m,metadata:v,label:`${N}=${String(m)}`})}let C=v.models??[],g=v.currentModelId;return H.cancel({sessionId:f.sessionId}).catch(()=>{return}),{models:C,configOptions:v.configOptions,currentModelId:g}})(),B=new Promise((b,R)=>{F=setTimeout(()=>{R(new H0)},O5)});return await Promise.race([w,B])}catch(w){if(w instanceof Error&&w.message==="ACP connection closed"){if(X.signal?.aborted)throw new I("ACP model discovery cancelled: abort signal received");throw new I("Runtime process exited during model discovery.")}throw w}finally{if(F)clearTimeout(F);if(X.signal)X.signal.removeEventListener("abort",U);W.kill()}}import C5 from"node:fs/promises";import BX from"node:os";async function w3(X){let W={version:1,globalDefaultConfigId:null,runtimes:[],boardOverrides:{},cardOverrides:{}},Z;try{Z=await C5.readFile(X,"utf-8")}catch(K){if(K.code==="ENOENT")return structuredClone(W);throw K}return m1.parse(JSON.parse(Z))}function R2(X,W,Z){return{...X.defaultConfigValues??{},...W?.configValues??{},...Z?.configValues??{}}}async function O0(X){let W=X.configPath?await w3(X.configPath):await Q0(),Z=X.cardId?W.cardOverrides[X.cardId]:void 0;if(Z?.runtimeConfigId){let J=W.runtimes.find((Y)=>Y.id===Z.runtimeConfigId);if(J)return{entry:J,adapter:w0(J),runFolder:Z.runFolder??J.runFolder??BX.homedir(),modelId:Z.modelId??J.defaultModelId??null,configValues:R2(J,void 0,Z)}}let K=W.boardOverrides[X.boardId];if(K?.runtimeConfigId){let J=W.runtimes.find((Y)=>Y.id===K.runtimeConfigId);if(J)return{entry:J,adapter:w0(J),runFolder:K.runFolder??J.runFolder??BX.homedir(),modelId:K.modelId??J.defaultModelId??null,configValues:R2(J,K)}}if(W.globalDefaultConfigId){let J=W.runtimes.find((Y)=>Y.id===W.globalDefaultConfigId);if(J)return{entry:J,adapter:w0(J),runFolder:Z?.runFolder??K?.runFolder??J.runFolder??BX.homedir(),modelId:Z?.modelId??K?.modelId??J.defaultModelId??null,configValues:R2(J,K,Z)}}throw new D0}async function U3(X,W={}){let K=(W.configPath?await w3(W.configPath):await Q0()).runtimes.find((J)=>J.id===X);if(!K)return null;return{entry:K,adapter:w0(K),runFolder:K.runFolder??BX.homedir(),modelId:W.modelId??K.defaultModelId??null,configValues:{...K.defaultConfigValues??{},...W.configValues??{}}}}var F3=new Map;function O2(X,W){if(!X)return;F3.set(X,W)}function q3(X){if(!X)return!1;return F3.get(X)??!1}var k0=new Map,C2=new Set;function h2(X){k0.get(X)?.controller.abort()}function B3(X){for(let[W,Z]of k0){if(Z.frontendSessionId!==X)continue;Z.controller.abort(),k0.delete(W)}}function L3(){for(let X of k0.values())X.controller.abort();k0.clear()}function P3(X,W){if(W?.aborted)return!0;return X instanceof Error&&/abort signal received|session cancelled/i.test(X.message)}function x3(X,W,Z,K){if((!W.availableModels||W.availableModels.length===0)&&W.availableConfigOptions.length===0)return;Y0((J)=>{let Y=J.runtimes.find((H)=>H.id===X);if(Y){if(W.availableModels&&W.availableModels.length>0)Y.discoveredModels=zX({adapterId:Z,models:W.availableModels,currentModelId:W.currentModelId??K});if(W.availableConfigOptions.length>0)Y.discoveredConfigOptions=W.availableConfigOptions}}).catch(()=>{return})}function h5(X,W){return`${X}
1061
+ ${W}`)}function v2(X){if(!Array.isArray(X))return null;let W=X.flatMap((Z)=>{if(!Z||typeof Z!=="object")return[];let K=Z;if(typeof K.path!=="string"||!K.path.trim())return[];let J=typeof K.line==="number"?`:${K.line}`:"";return[`${K.path}${J}`]});return W.length>0?W.slice(0,5):null}function e4(X){let{ctx:W,appendText:Z,appendToolActivity:K}=X,J=X.flushIntervalMs??z5,Y="",H="",U=0,F=null,w={},B=new Map,b=(M)=>{if(B.set(M.toolCallId,M),!K)return;K({boardId:W.boardId,cardId:W.cardId,runId:W.runId,entry:M}).catch((P)=>{console.warn("[streamAdapter] appendToolActivity failed",P)})},R=(M)=>{let P=`${W.runId}:thought`,$=B.get(P);if(!$||$.status!=="running")return;b({...$,status:"completed",completedAt:$.completedAt??M})},f=(M)=>{for(let P of B.values()){if(P.status!=="running"||P.rawTitle.toLowerCase()!=="toolsearch")continue;b({...P,status:"completed",completedAt:P.completedAt??M})}},v=(M)=>{for(let P of Array.from(B.values())){if(P.status!=="running")continue;if(P.kind==="thought"||P.rawTitle==="agent_thought")continue;b({...P,status:"completed",completedAt:P.completedAt??M})}},O="",h=0,C=null,g=null,N=(M)=>{if(M===O)return;O=M,h=Date.now(),Z({boardId:W.boardId,cardId:W.cardId,runId:W.runId,text:M}).catch((P)=>{console.warn("[streamAdapter] appendText failed",P)})},m=()=>{if(C!==null)clearTimeout(C),C=null;if(g!==null){let M=g;g=null,N(M)}},u=(M)=>{let P=Date.now()-h;if(P>=J&&C===null){N(M);return}if(g=M,C===null){let $=Math.max(0,J-P);C=setTimeout(()=>{C=null,m()},$)}};return{onSessionUpdate:async(M)=>{let P=M.update;switch(w[P.sessionUpdate]=(w[P.sessionUpdate]??0)+1,P.sessionUpdate){case"agent_message_chunk":{let $=new Date().toISOString();if(R($),P.content.type==="text")Y+=P.content.text,u(Y);else{let E=`agent_message_chunk:${P.content.type}`;w[E]=(w[E]??0)+1}return}case"agent_thought_chunk":{if(P.content.type!=="text")return;H+=P.content.text;let $=new Date().toISOString(),E=`${W.runId}:thought`,A=B.get(E);b({toolCallId:E,rawTitle:"agent_thought",title:"Thought",kind:"thought",status:"running",startedAt:A?.startedAt??$,completedAt:null,contentPreview:_0(H.trim())});return}case"user_message_chunk":return;case"tool_call":{U+=1;let $=o4(P.title),E=B2(P.status),A=new Date().toISOString();R(A),f(A),b({toolCallId:P.toolCallId,rawTitle:$,title:P2($,P.rawInput),kind:L2(P.kind),status:E,startedAt:A,completedAt:E==="running"?null:A,inputPreview:P0(P.rawInput),outputPreview:x2(P.rawOutput),contentPreview:UX(P.content),locations:v2(P.locations)});return}case"tool_call_update":{let $=B.get(P.toolCallId);if(!$){let T=o4(P.title),X0=B2(P.status),r=new Date().toISOString();b({toolCallId:P.toolCallId,rawTitle:T,title:P2(T,P.rawInput),kind:L2(P.kind),status:X0,startedAt:r,completedAt:X0==="running"?null:r,inputPreview:P0(P.rawInput),outputPreview:x2(P.rawOutput),contentPreview:UX(P.content),locations:v2(P.locations)});return}let E=P.status===void 0||P.status===null?$.status:B2(P.status),A=typeof P.title==="string"&&P.title.trim().length>0?P.title:$.rawTitle,q0=typeof P.title==="string"&&P.title.trim().length>0,x0=E==="running"?$.completedAt:$.completedAt??new Date().toISOString(),k=P.content===void 0?$.contentPreview:t4($.contentPreview,UX(P.content)),d=P.rawOutput===void 0?$.outputPreview:t4($.outputPreview,x2(P.rawOutput));b({...$,rawTitle:A,title:q0?P2(A,P.rawInput):$.title,kind:P.kind===void 0?$.kind:L2(P.kind),status:E,completedAt:x0,inputPreview:P.rawInput===void 0?$.inputPreview:P0(P.rawInput),outputPreview:d,contentPreview:k,locations:P.locations===void 0?$.locations:v2(P.locations)});return}case"plan":F=P.entries;return;case"available_commands_update":return;case"current_mode_update":return;default:return}},getFinalText:()=>Y,getToolCallCount:()=>U,getLatestPlan:()=>F,getUpdateTypeCounts:()=>({...w}),flush:(M)=>{let P=new Date().toISOString();if(R(P),M?.completeOpenToolCalls)v(P);m()}}}var P1=1,X3=-32000;function W3(X){if(X.awaitingInput)return!1;return X.nowMs-X.lastUpdateMs>=X.windowMs}function K3(X){if(!X||typeof X!=="object")return!1;return X.code===X3}var U5=60000,F5=U5,q5=5000;function B5(X){let W=Math.max(1,Math.round(X/1000));return`Runtime has not responded for ${W} ${W===1?"second":"seconds"}. Retry the agent run.`}function J3(){return{name:"ideawave-cli",title:"IdeaWave CLI",version:"0.0.79".trim()?"0.0.79":"dev"}}function V3(X){if(X===P1)return;throw new I(`Unsupported ACP protocol version ${X}; expected ${P1}`)}function Y3(X){return H5.toWeb(X)}function z3(X){return w5.toWeb(X)}function b2(X){return X!==null&&typeof X==="object"}function L5(X){if(!Array.isArray(X))return[];let W=[];for(let Z of X){if(!b2(Z))continue;if(typeof Z.group==="string"&&Array.isArray(Z.options)){let K=typeof Z.name==="string"?Z.name:Z.group;for(let J of Z.options){if(!b2(J))continue;if(typeof J.value!=="string"||typeof J.name!=="string")continue;W.push({value:J.value,name:J.name,description:typeof J.description==="string"?J.description:null,group:Z.group,groupName:K})}continue}if(typeof Z.value!=="string"||typeof Z.name!=="string")continue;W.push({value:Z.value,name:Z.name,description:typeof Z.description==="string"?Z.description:null,group:null,groupName:null})}return W}function P5(X){if(!b2(X))return null;if(typeof X.id!=="string"||typeof X.name!=="string")return null;let W=typeof X.category==="string"?X.category:null,Z=typeof X.description==="string"?X.description:null;if(X.type==="select"){let K=typeof X.currentValue==="string"?X.currentValue:null;return{id:X.id,name:X.name,category:W,description:Z,type:"select",currentValue:K,options:L5(X.options)}}if(X.type==="boolean"){let K=typeof X.currentValue==="boolean"?X.currentValue:typeof X.value==="boolean"?X.value:null;return{id:X.id,name:X.name,category:W,description:Z,type:"boolean",currentValue:K,options:[]}}return null}function y2(X){let W=(X.configOptions??[]).map(P5).filter((U)=>U!==null),Z=W.find((U)=>U.type==="select"&&U.category==="model")??W.find((U)=>U.type==="select"&&U.id==="model")??null,K=Z?.options.map((U)=>({id:U.value,name:U.name,description:U.description??null})),J=x5(X.models),Y=K&&K.length>0?K:J&&J.length>0?J:null,H=(typeof Z?.currentValue==="string"?Z.currentValue:null)??v5(X.models)??null;return{models:Y,currentModelId:H,configOptions:W,modelConfigId:Z?.id??null}}function x5(X){if(!X||!Array.isArray(X.availableModels))return null;let W=[];for(let Z of X.availableModels){if(typeof Z.modelId!=="string")continue;W.push({id:Z.modelId,name:typeof Z.name==="string"?Z.name:null,description:typeof Z.description==="string"?Z.description:null})}return W.length>0?W:null}function v5(X){return typeof X?.currentModelId==="string"?X.currentModelId:null}function b5(X,W){let Z=[];if(X.trim())Z.push({type:"text",text:X});for(let K of W)if(K.content.trim())Z.push({type:"text",text:K.content});return Z}function y5(X){if(typeof X.value==="boolean")return{sessionId:X.sessionId,configId:X.configId,type:"boolean",value:X.value};return{sessionId:X.sessionId,configId:X.configId,value:X.value}}function f5(X,W){let Z=y2({configOptions:W.configOptions});return{models:Z.models??X.models,currentModelId:Z.currentModelId??X.currentModelId,configOptions:Z.configOptions,modelConfigId:Z.modelConfigId??X.modelConfigId}}function j3(X,W){if(X==="default")return null;if(!W||W.length===0)return X;let Z=W.find((w)=>w.id===X);if(Z)return Z.id;let K=X.toLowerCase(),J=K.includes("opus")?"opus":K.includes("sonnet")?"sonnet":K.includes("haiku")?"haiku":null;if(!J)return X;let Y=(w)=>`${w.id} ${w.name??""} ${w.description??""}`.toLowerCase(),H=W.filter((w)=>Y(w).includes(J));if(H.length===0)return X;let F=(K.includes("1m")?H.find((w)=>Y(w).includes("1m")):void 0)??H[0];return F?F.id:X}async function qX(X){try{let W=await X.conn.setSessionConfigOption(y5({sessionId:X.sessionId,configId:X.configId,value:X.value}));return f5(X.metadata,W)}catch(W){return console.warn(`[acp] setSessionConfigOption(${X.label}) failed; using agent default.`,W instanceof Error?W.message:W),X.metadata}}async function f2(X){let W=F2(X.spawn),Z=[],K=0,J=4096;W.stderr.on("data",(k)=>{Z.push(k),K+=k.length;while(K>J*2&&Z.length>1){let d=Z.shift();if(d)K-=d.length}});let Y=()=>{let k=Buffer.concat(Z).toString("utf8");return k.length>J?k.slice(-J):k},H=s4(X.spawn.cwd),U={current:null},F={current:null},w={at:Date.now()},B=null,b=z3(W.stdin),R=Y3(W.stdout),f=Q3(b,R),O=new Z3((k)=>({requestPermission:async(d)=>{let T=d.options,X0=T?.find((r)=>r.kind==="allow_once")??T?.find((r)=>r.kind==="allow_always");if(X0)return{outcome:{outcome:"selected",optionId:X0.optionId}};return{outcome:{outcome:"cancelled"}}},sessionUpdate:async(d)=>{w.at=Date.now();let T=F.current;if(T){let r=d.update.sessionUpdate;if(T.updateCount+=1,T.updateCount===1||T.lastUpdateType!==r||r==="tool_call"||r==="tool_call_update")G("acp.session_update",{runId:T.runId,cardId:T.cardId,sessionId:B,updateType:r,updateCount:T.updateCount,elapsedMs:Date.now()-T.startedAt});T.lastUpdateType=r}let X0=U.current;if(X0)await X0.onSessionUpdate(d)},readTextFile:H.readTextFile}),f),h=()=>W.kill();if(X.signal)X.signal.addEventListener("abort",h);let C=()=>{if(X.signal)X.signal.removeEventListener("abort",h)},g=async(k,d)=>{if(C(),W.kill(),K3(k))throw new l0(k.message??"Authentication required",d);if(k instanceof Error&&k.message==="ACP connection closed"){if(X.signal?.aborted)throw new I("ACP session cancelled: abort signal received");let T=await Promise.race([W.processCrashed,W.waitForExit,new Promise((X0)=>setTimeout(()=>X0({stderr:""}),500))]);throw new I(`Runtime process exited before completion: ${T.stderr?.trim()??""}`)}throw k},N;try{N=await O.initialize({protocolVersion:P1,clientCapabilities:U2,clientInfo:J3()})}catch(k){throw await g(k,[]),Error("unreachable")}try{V3(N.protocolVersion)}catch(k){throw C(),W.kill(),k}let m=N.authMethods?.map((k)=>k.id)??[],u;try{u=await O.newSession({cwd:X.spawn.cwd,mcpServers:X.mcpServers??[]})}catch(k){throw await g(k,m),Error("unreachable")}let M=u.sessionId;B=M;let P=y2(u),$=X.modelId??null,E=$?j3($,P.models):null;if(E&&E!==P.currentModelId)if(P.modelConfigId)P=await qX({conn:O,sessionId:M,configId:P.modelConfigId,value:E,metadata:P,label:`${P.modelConfigId}=${E}`});else console.warn(`[acp] runtime did not advertise a model config option for ${E}; using agent default.`);for(let[k,d]of Object.entries(X.configValues??{}).sort(([T],[X0])=>T.localeCompare(X0))){if(k===P.modelConfigId)continue;if(!P.configOptions.some((T)=>T.id===k))continue;P=await qX({conn:O,sessionId:M,configId:k,value:d,metadata:P,label:`${k}=${String(d)}`})}C();let A=!1,q0=async()=>{if(A)return;A=!0,W.kill(),await Promise.race([W.waitForExit,new Promise((k)=>setTimeout(k,2000))])},x0=!1;return W.processCrashed.then(()=>{x0=!0}),{sessionId:M,availableModels:P.models,currentModelId:P.currentModelId,availableConfigOptions:P.configOptions,isAlive:()=>!A&&!x0,dispose:q0,prompt:(k)=>R5({proc:W,conn:O,sessionId:M,activeAdapter:U,activeTrace:F,lastUpdate:w,collectStderrTail:Y},k)}}async function R5(X,W){let{proc:Z,conn:K,sessionId:J,activeAdapter:Y,activeTrace:H,lastUpdate:U}=X,F=Date.now(),w=W.heartbeatMs??F5,B=B5(w),b={boardId:W.boardId,cardId:W.cardId,runId:W.runId},R=e4({ctx:b,appendText:W.appendText,appendToolActivity:W.appendToolActivity});Y.current=R,H.current={runId:W.runId,cardId:W.cardId,startedAt:F,updateCount:0,lastUpdateType:null},U.at=Date.now(),G("acp.prompt_started",{runId:W.runId,cardId:W.cardId,sessionId:J,heartbeatWindowMs:w});let f=!1,v=null,O=()=>Z.kill();W.signal.addEventListener("abort",O);try{let h=async()=>{let m=Math.min(q5,Math.max(50,Math.floor(w/2)));v=setInterval(()=>{let M=W.isAwaitingInput?.()??!1;if(M){U.at=Date.now();return}if(W3({nowMs:Date.now(),lastUpdateMs:U.at,windowMs:w,awaitingInput:M}))f=!0,G("acp.inactivity_timeout",{runId:W.runId,cardId:W.cardId,sessionId:J,windowMs:w,silentForMs:Date.now()-U.at}),K.cancel({sessionId:J}).catch(()=>{return}),Z.kill()},m);let u=b5(W.prompt.systemPrompt,W.prompt.messages);await K.prompt({sessionId:J,prompt:u}),G("acp.prompt_resolved",{runId:W.runId,cardId:W.cardId,sessionId:J,elapsedMs:Date.now()-F}),R.flush({completeOpenToolCalls:!0})},C=Z.waitForExit.then((m)=>({kind:"exited",exit:m})),g=h().then(()=>({kind:"ok"})).catch(async(m)=>{if(m instanceof Error&&m.message==="ACP connection closed")return{kind:"crashed",exit:await Promise.race([Z.processCrashed,Z.waitForExit])};throw m}),N;try{N=await Promise.race([g,Z.processCrashed.then((m)=>({kind:"crashed",exit:m})),C])}catch(m){if(f)throw new H0(B);throw m}if(f)throw new H0(B);if(N.kind==="crashed")throw new I(`Runtime process exited before completion: ${N.exit.stderr.trim()}`);if(N.kind==="exited"){if(W.signal.aborted)throw new I("ACP session cancelled: abort signal received");if(f)throw new H0(B);throw new I(`Runtime process exited unexpectedly: ${N.exit.stderr.trim()}`)}return{modelReported:"unknown",finalText:R.getFinalText(),toolCallsExecuted:R.getToolCallCount(),stderrTail:X.collectStderrTail(),updateTypeCounts:R.getUpdateTypeCounts()}}finally{if(G("acp.prompt_finished",{runId:W.runId,cardId:W.cardId,sessionId:J,elapsedMs:Date.now()-F,timedOut:f,updateCount:H.current?.updateCount??0}),v!==null)clearInterval(v);W.signal.removeEventListener("abort",O),R.flush({completeOpenToolCalls:!0}),Y.current=null,H.current=null}}var O5=30000;async function H3(X){let W=F2(X.spawn),Z=z3(W.stdin),K=Y3(W.stdout),J=Q3(Z,K),H=new Z3((w)=>({requestPermission:async()=>({outcome:{outcome:"cancelled"}}),sessionUpdate:async()=>{return},readTextFile:async()=>({content:""})}),J),U=()=>W.kill();if(X.signal)X.signal.addEventListener("abort",U);let F=null;try{let w=(async()=>{let b=await H.initialize({protocolVersion:P1,clientCapabilities:U2,clientInfo:J3()});V3(b.protocolVersion);let R=b.authMethods?.map((N)=>N.id)??[],f;try{f=await H.newSession({cwd:X.spawn.cwd,mcpServers:[]})}catch(N){if(K3(N))throw new l0(N.message??"Authentication required",R);throw N}let v=y2(f),O=X.modelId??null,h=O?j3(O,v.models):null;if(h&&h!==v.currentModelId)if(v.modelConfigId)v=await qX({conn:H,sessionId:f.sessionId,configId:v.modelConfigId,value:h,metadata:v,label:`${v.modelConfigId}=${h}`});else console.warn(`[acp] runtime did not advertise a model config option for ${h}; discovering agent default models.`);for(let[N,m]of Object.entries(X.configValues??{}).sort(([u],[M])=>u.localeCompare(M))){if(N===v.modelConfigId)continue;if(!v.configOptions.some((u)=>u.id===N))continue;v=await qX({conn:H,sessionId:f.sessionId,configId:N,value:m,metadata:v,label:`${N}=${String(m)}`})}let C=v.models??[],g=v.currentModelId;return H.cancel({sessionId:f.sessionId}).catch(()=>{return}),{models:C,configOptions:v.configOptions,currentModelId:g}})(),B=new Promise((b,R)=>{F=setTimeout(()=>{R(new H0)},O5)});return await Promise.race([w,B])}catch(w){if(w instanceof Error&&w.message==="ACP connection closed"){if(X.signal?.aborted)throw new I("ACP model discovery cancelled: abort signal received");throw new I("Runtime process exited during model discovery.")}throw w}finally{if(F)clearTimeout(F);if(X.signal)X.signal.removeEventListener("abort",U);W.kill()}}import C5 from"node:fs/promises";import BX from"node:os";async function w3(X){let W={version:1,globalDefaultConfigId:null,runtimes:[],boardOverrides:{},cardOverrides:{}},Z;try{Z=await C5.readFile(X,"utf-8")}catch(K){if(K.code==="ENOENT")return structuredClone(W);throw K}return m1.parse(JSON.parse(Z))}function R2(X,W,Z){return{...X.defaultConfigValues??{},...W?.configValues??{},...Z?.configValues??{}}}async function O0(X){let W=X.configPath?await w3(X.configPath):await Q0(),Z=X.cardId?W.cardOverrides[X.cardId]:void 0;if(Z?.runtimeConfigId){let J=W.runtimes.find((Y)=>Y.id===Z.runtimeConfigId);if(J)return{entry:J,adapter:w0(J),runFolder:Z.runFolder??J.runFolder??BX.homedir(),modelId:Z.modelId??J.defaultModelId??null,configValues:R2(J,void 0,Z)}}let K=W.boardOverrides[X.boardId];if(K?.runtimeConfigId){let J=W.runtimes.find((Y)=>Y.id===K.runtimeConfigId);if(J)return{entry:J,adapter:w0(J),runFolder:K.runFolder??J.runFolder??BX.homedir(),modelId:K.modelId??J.defaultModelId??null,configValues:R2(J,K)}}if(W.globalDefaultConfigId){let J=W.runtimes.find((Y)=>Y.id===W.globalDefaultConfigId);if(J)return{entry:J,adapter:w0(J),runFolder:Z?.runFolder??K?.runFolder??J.runFolder??BX.homedir(),modelId:Z?.modelId??K?.modelId??J.defaultModelId??null,configValues:R2(J,K,Z)}}throw new D0}async function U3(X,W={}){let K=(W.configPath?await w3(W.configPath):await Q0()).runtimes.find((J)=>J.id===X);if(!K)return null;return{entry:K,adapter:w0(K),runFolder:K.runFolder??BX.homedir(),modelId:W.modelId??K.defaultModelId??null,configValues:{...K.defaultConfigValues??{},...W.configValues??{}}}}var F3=new Map;function O2(X,W){if(!X)return;F3.set(X,W)}function q3(X){if(!X)return!1;return F3.get(X)??!1}var k0=new Map,C2=new Set;function h2(X){k0.get(X)?.controller.abort()}function B3(X){for(let[W,Z]of k0){if(Z.frontendSessionId!==X)continue;Z.controller.abort(),k0.delete(W)}}function L3(){for(let X of k0.values())X.controller.abort();k0.clear()}function P3(X,W){if(W?.aborted)return!0;return X instanceof Error&&/abort signal received|session cancelled/i.test(X.message)}function x3(X,W,Z,K){if((!W.availableModels||W.availableModels.length===0)&&W.availableConfigOptions.length===0)return;Y0((J)=>{let Y=J.runtimes.find((H)=>H.id===X);if(Y){if(W.availableModels&&W.availableModels.length>0)Y.discoveredModels=zX({adapterId:Z,models:W.availableModels,currentModelId:W.currentModelId??K});if(W.availableConfigOptions.length>0)Y.discoveredConfigOptions=W.availableConfigOptions}}).catch(()=>{return})}function h5(X,W){return`${X}
1062
1062
 
1063
1063
  Runtime run folder:
1064
1064
  - Effective run folder: ${W}
@@ -1068,4 +1068,4 @@ Runtime run folder:
1068
1068
  Connection: close\r
1069
1069
  Content-Length: ${Buffer.byteLength(Z)}\r
1070
1070
  \r
1071
- ${Z}`),X.destroy()}function L7(X,W){return new Promise((Z,K)=>{let J=(H)=>{X.off("listening",Y),K(H)},Y=()=>{X.off("error",J);let H=X.address();if(!H||typeof H==="string"){K(Error("Failed to read CLI bridge server address"));return}Z(H.port)};X.once("error",J),X.once("listening",Y),X.listen(W,"127.0.0.1")})}function u3(X){return new Promise((W,Z)=>{X.close((K)=>{if(K)Z(K);else W()})})}async function T3(X,W=_2()){let Z=new Map,K=new Map,J=X.maxMessageSize??K7,Y=!1,H=(f)=>{let v=K.get(f);if(v)clearTimeout(v);K.delete(f)},U=(f)=>{K.delete(f);let{activeRunIds:v}=X.registry.disconnect(f);X.onDisconnect(f,v)},F=(f,v)=>{let O={type:"cli_status",connected:!0,runtime:X.runtime,mcpReady:X.mcpReady(),error:v,capabilities:X.capabilities??[],cliVersion:X.cliVersion,browserRuntime:X.browserRuntimeStatus?.()};if(f){let h=Z.get(f);if(h)o0(h,O);return}for(let h of Z.values())o0(h,O)},w=(f,v)=>{let O=v.sessionId.trim(),h=v.userId.trim();if(!O||!h){o0(f,{type:"cli_status",connected:!1,runtime:X.runtime,mcpReady:X.mcpReady(),error:"Missing frontend session or user id"}),f.close();return}H(O);let C=Z.get(O);if(C&&C!==f)C.close();f.data.frontendSessionId=O,Z.set(O,f),X.registry.register({frontendSessionId:O,userId:h,tools:v.tools,send:(g)=>o0(f,g)}),F(O),X.onToolMetadata?.(O)},B=(f,v)=>{let O=X.registry.getUserId(f);if(!O)return;switch(v.type){case"bridge_ping":{let h=Z.get(f);if(h)o0(h,{type:"bridge_pong"});break}case"tool_metadata":X.registry.setMetadata(f,v.tools),X.onToolMetadata?.(f);break;case"tool_result":X.registry.handleToolResult(f,v);break;case"run_turn":G("bridge.run_received",{runId:v.run.runId,cardId:v.run.cardId,frontendSessionId:f}),X.registry.markRunActive(f,v.run.runId,v.run.cardId),X.onRunTurn(f,{...v.run,frontendSessionId:f,userId:O});break;case"cancel_run":if(X.registry.ownsRun(f,v.runId))X.onCancelRun(f,v.runId);break;case"runtime_rpc":X.onRuntimeRpc(f,v);break;case"browser_rpc":X.onBrowserRpc?.(f,Z.get(f)?.data.frontendOrigin??"",v);break;case"warmup_run":X.onWarmupRun(f,{...v,frontendSessionId:f},O);break;default:break}},b=(f,v)=>{let O=bX(f.headers.origin),h=k2(O),C={Vary:"Origin"};if(h&&O)C["Access-Control-Allow-Origin"]=O,C["Access-Control-Allow-Private-Network"]="true";if(f.method==="OPTIONS"){v.writeHead(204,{...C,"Access-Control-Allow-Methods":"GET, OPTIONS","Access-Control-Allow-Headers":"*","Access-Control-Max-Age":"600"}),v.end();return}if(f.method!=="GET"){v.writeHead(405,C),v.end();return}v.writeHead(200,{...C,"content-type":"application/json","cache-control":"no-store"}),v.end(JSON.stringify({ideawave:!0,runtime:X.runtime,mcpReady:X.mcpReady(),capabilities:X.capabilities??[],cliVersion:X.cliVersion,browserRuntime:X.browserRuntimeStatus?.()}))},R=(f,v)=>{let O=bX(f.headers.origin),h=k2(O),C={Vary:"Origin"};if(h&&O)C["Access-Control-Allow-Origin"]=O,C["Access-Control-Allow-Private-Network"]="true";if(f.method==="OPTIONS"){v.writeHead(204,{...C,"Access-Control-Allow-Methods":"POST, OPTIONS","Access-Control-Allow-Headers":"content-type","Access-Control-Max-Age":"600"}),v.end();return}if(!h){v.writeHead(403,C),v.end();return}if(f.method!=="POST"){v.writeHead(405,C),v.end();return}let g={...C,"content-type":"application/json"},N=(M,P)=>{v.writeHead(M,g),v.end(JSON.stringify(P))},m="",u=!1;f.on("data",(M)=>{if(m+=M.toString("utf8"),m.length>z7)u=!0,f.destroy()}),f.on("end",()=>{if(u){N(400,{ok:!1,error:"Request body too large"});return}let M;try{M=JSON.parse(m)}catch{N(400,{ok:!1,error:"Invalid JSON body"});return}let P=typeof M.url==="string"?M.url:"";if(!G3(P)){N(400,{ok:!1,error:"url must be an http(s) loopback or /static_boards/ page URL"});return}let $=(E,A)=>{let q0=typeof E==="number"?E:Number.NaN;if(!Number.isFinite(q0))return A;return Math.min(4000,Math.max(200,Math.round(q0)))};E3({url:P,width:$(M.width,1440),height:$(M.height,900)}).then((E)=>N(200,{ok:!0,path:E.path,engine:E.engine})).catch((E)=>{let A=E instanceof v1?503:E instanceof vX?429:500;N(A,{ok:!1,...E instanceof v1?{installing:!0}:{},error:E instanceof Error?E.message:String(E)})})})};for(let f of W){let v=Z7((C,g)=>{(async()=>{let N=new URL(C.url??"/","http://127.0.0.1").pathname;if(N===g3){b(C,g);return}if(N===Y7){R(C,g);return}if(await X.onHttpRequest?.(C,g))return;g.writeHead(404,{"content-type":"text/plain"}),g.end("IdeaWave CLI bridge")})().catch((N)=>{if(g.headersSent){g.destroy(N instanceof Error?N:void 0);return}g.writeHead(500,{"content-type":"text/plain"}),g.end("IdeaWave CLI bridge request failed")})}),O=new Q7({noServer:!0,maxPayload:J}),h=(C)=>{if(C.idleTimer)clearTimeout(C.idleTimer);C.idleTimer=setTimeout(()=>{C.close()},J7),C.idleTimer.unref?.()};O.on("connection",(C,g)=>{let N=C;N.data={id:W7(),frontendSessionId:null,frontendOrigin:new URL(bX(g.headers.origin)??S3).origin},N.idleTimer=null,h(N),N.on("ping",()=>h(N)),N.on("pong",()=>h(N)),N.on("error",()=>{if(N.idleTimer)clearTimeout(N.idleTimer);N.close()}),N.on("message",(m)=>{h(N);let u=B7(m);if(J>0&&u.length>J)return;let M=g1(u);if(!M)return;let P=N.data.frontendSessionId;if(!P){if(M.type==="bridge_probe")o0(N,{type:"bridge_probe_ack",protocolVersion:M.protocolVersion});else if(M.type==="frontend_hello")w(N,M);return}B(P,M)}),N.on("close",()=>{if(N.idleTimer)clearTimeout(N.idleTimer);let m=N.data.frontendSessionId;if(!m)return;if(Z.get(m)!==N)return;if(Z.delete(m),H(m),Y)return;K.set(m,setTimeout(()=>U(m),V7))})}),v.on("upgrade",(C,g,N)=>{let m=new URL(C.url??"/","http://127.0.0.1").pathname;if(X.onHttpUpgrade?.(C,g,N))return;if(m!==E2){k3(g,404,"Not Found");return}if(!k2(bX(C.headers.origin))){k3(g,403,"Forbidden");return}O.handleUpgrade(C,g,N,(u)=>{O.emit("connection",u,C)})});try{let C=await L7(v,f);return{url:`ws://127.0.0.1:${C}${E2}`,port:C,sendStatus:F,close:async()=>{Y=!0;for(let g of K.values())clearTimeout(g);K.clear();for(let g of O.clients){let N=g;if(N.idleTimer)clearTimeout(N.idleTimer);N.close()}O.close(),await u3(v).catch(()=>{return})}}}catch(C){if(O.close(),await u3(v).catch(()=>{return}),C?.code==="EADDRINUSE")continue;throw C}}throw Error(`No free IdeaWave CLI bridge port found in ${W[0]}-${W.at(-1)}`)}import{lstat as $7,readFile as G7}from"node:fs/promises";import E7 from"node:os";import y1 from"node:path";import{Server as _7}from"@modelcontextprotocol/sdk/server/index.js";import{CallToolRequestSchema as k7,ListToolsRequestSchema as u7}from"@modelcontextprotocol/sdk/types.js";var u2=new Set(["list_boards","get_board","screenshot_board","list_nodes","list_edges","inspect_node","list_context_sources","read_context_card","read_context_file","read_context_image","list_context_folder","get_board_wiki","search_board","get_card_messages","list_agent_cards","inspect_neighbors"]),P7=["screenshot_board","inspect_diagram","ask_user_question","create_agent_card","append_user_message","spawn_child_agents"],x7=new Set(P7),WY=new Set([...u2].filter((X)=>!x7.has(X)));import{randomUUID as b7}from"node:crypto";import{createServer as y7}from"node:http";import{StreamableHTTPServerTransport as f7}from"@modelcontextprotocol/sdk/server/streamableHttp.js";import{isInitializeRequest as i3}from"@modelcontextprotocol/sdk/types.js";var A3=new Set(["127.0.0.1","localhost","[::1]","::1"]);function v7(X){let W=X.trim();if(W.length===0)return null;if(W.startsWith("[")){let Y=W.indexOf("]");if(Y===-1)return null;let H=W.slice(0,Y+1),U=W.slice(Y+1);if(U.length===0)return{host:H,port:null};if(!U.startsWith(":"))return null;let F=Number(U.slice(1));if(!Number.isInteger(F)||F<=0||F>65535)return null;return{host:H,port:F}}let Z=W.lastIndexOf(":");if(Z===-1)return{host:W,port:null};let K=W.slice(Z+1),J=Number(K);if(!Number.isInteger(J)||J<=0||J>65535)return{host:W,port:null};return{host:W.slice(0,Z),port:J}}function c3(X){return A3.has(X)||A3.has(X.toLowerCase())}function a3(X,W){let Z=X.headers.host;if(typeof Z!=="string")return{ok:!1,status:403,reason:"missing-host"};let K=v7(Z);if(!K)return{ok:!1,status:403,reason:"bad-host"};if(!c3(K.host))return{ok:!1,status:403,reason:"non-loopback-host"};if(K.port!==null&&K.port!==W)return{ok:!1,status:403,reason:"host-port-mismatch"};let J=X.headers.origin;if(typeof J==="string"&&J.length>0){if(J!=="null"){let Y;try{Y=new URL(J)}catch{return{ok:!1,status:403,reason:"bad-origin"}}if(!c3(Y.hostname))return{ok:!1,status:403,reason:"non-loopback-origin"}}}return{ok:!0}}var d3="/mcp",R7=43274,r3=16777216,O7=1800000,C7=300000,p3=200,h7=-32700,h0=-32600,I2=-32603;function V0(X,W,Z,K,J){X.statusCode=W,X.setHeader("content-type","application/json"),X.end(JSON.stringify({jsonrpc:"2.0",error:{code:Z,message:K,...J?{data:J}:{}},id:null}))}class S2 extends Error{constructor(){super("expected application/json");this.name="BadContentTypeError"}}class l2 extends Error{constructor(){super(`body exceeds ${r3} bytes`);this.name="BodyTooLargeError"}}async function N7(X){if(X.method&&X.method!=="POST")return;let W=X.headers["content-type"];if(typeof W==="string"&&W.trim().length>0){if(!W.toLowerCase().includes("application/json"))throw new S2}let Z=0,K=[];for await(let Y of X){let H=typeof Y==="string"?Buffer.from(Y):Y;if(Z+=H.byteLength,Z>r3)throw new l2;K.push(H)}if(K.length===0)return;let J=Buffer.concat(K).toString("utf8");if(J.length===0)return;return JSON.parse(J)}function M7(X){if(Array.isArray(X))return X.some(i3);return i3(X)}function g7(X){if(typeof X==="number")return X;let W=process.env.IDEAWAVE_MCP_PORT;if(W&&W.trim().length>0){let Z=Number(W);if(Number.isInteger(Z)&&Z>=0&&Z<65536)return Z}return R7}async function D7(X,W){let Z=(J)=>new Promise((Y,H)=>{let U=(w)=>{X.off("listening",F),H(w)},F=()=>{X.off("error",U),Y()};X.once("error",U),X.once("listening",F),X.listen(J,"127.0.0.1")});try{await Z(W)}catch(J){if(J.code!=="EADDRINUSE"||W===0)throw J;console.warn(`[mcp] port ${W} in use, falling back to an OS-assigned port; external CLIs will need to re-paste the install command from Settings → External agents`),await Z(0)}let K=X.address();if(K==null||typeof K==="string")throw Error("[mcp] failed to read bound address");return K.port}function m7(X,W){if(W&&typeof W==="object"&&!Array.isArray(W)){let K=W.params;if(K&&typeof K==="object"&&!Array.isArray(K)){let J=K.clientInfo;if(J&&typeof J==="object"&&!Array.isArray(J)){let Y=J.name;if(typeof Y==="string"&&Y.trim().length>0)return Y.trim()}}}let Z=X.headers["user-agent"];if(typeof Z==="string"&&Z.trim().length>0)return Z.trim();return null}async function s3(X){let W=new Map,Z=0;function K(w){let B=W.get(w);if(B)B.lastActivity=Date.now()}async function J(w,B){W.delete(w),await B.transport.close().catch(()=>{return})}async function Y(){let w=null,B=1/0;for(let[b,R]of W)if(R.lastActivity<B)B=R.lastActivity,w=b;if(w!==null){let b=W.get(w);if(b)console.warn(`[mcp] session cap of ${p3} reached; evicting ${w}`),await J(w,b)}}let H=setInterval(()=>{let w=Date.now()-O7;for(let[B,b]of W)if(b.lastActivity<w)console.log(`[mcp] sweeping idle session ${B}`),J(B,b)},C7);H.unref?.();let U=y7((w,B)=>{(async()=>{let b;try{b=new URL(w.url??"/","http://127.0.0.1").pathname}catch{V0(B,400,h0,"bad-url");return}if(b!==d3){V0(B,404,h0,"not-found");return}let R=w.method??"POST";if(R!=="POST"&&R!=="GET"&&R!=="DELETE"){B.setHeader("Allow","GET, POST, DELETE"),V0(B,405,h0,"method-not-allowed");return}let f=a3(w,Z);if(!f.ok){V0(B,f.status,h0,"forbidden",{reason:f.reason});return}let v=w.headers["mcp-session-id"],O=typeof v==="string"?v:void 0;if(R==="GET"||R==="DELETE"){if(!O||!W.has(O)){V0(B,400,h0,"no-session",{hint:"Open a POST initialize first to receive an Mcp-Session-Id."});return}let g=W.get(O).transport;K(O);try{await g.handleRequest(w,B)}catch(N){if(console.error("[mcp] transport.handleRequest (GET/DELETE) threw",N),!B.headersSent)V0(B,500,I2,"internal")}return}let h;try{h=await N7(w)}catch(g){if(g instanceof S2){V0(B,415,h0,"expected-application-json");return}if(g instanceof l2){V0(B,413,h0,"body-too-large");return}V0(B,400,h7,"invalid-json");return}let C;if(O&&W.has(O))C=W.get(O).transport,K(O);else if(!O&&h!==void 0&&M7(h)){let g=w.headers["x-ideawave-user-id"],N=typeof g==="string"&&g.trim().length>0?g.trim():null,m=w.headers["x-ideawave-frontend-session-id"],u=typeof m==="string"&&m.trim().length>0?m.trim():null,M=w.headers["x-ideawave-tool-surface"],P=typeof M==="string"&&M.trim()==="read"?"read":"full",$=w.headers["x-ideawave-images-supported"],E=typeof $==="string"&&$.trim()==="1",A=w.headers["x-ideawave-card-id"],q0=typeof A==="string"&&A.trim().length>0?A.trim():null,x0=w.headers["x-ideawave-board-id"],k=typeof x0==="string"&&x0.trim().length>0?x0.trim():null,d=w.headers["x-ideawave-run-folder"],T=typeof d==="string"&&d.trim().length>0?d.trim():null,X0=m7(w,h);if(W.size>=p3)await Y();let r=null,g0=new f7({sessionIdGenerator:()=>b7(),onsessioninitialized:(S0)=>{r=S0,W.set(S0,{transport:g0,lastActivity:Date.now()})},onsessionclosed:(S0)=>{W.delete(S0)}});g0.onclose=()=>{if(g0.sessionId)W.delete(g0.sessionId)};try{await X.buildServer({userId:N,frontendSessionId:u,boardId:k,toolSurface:P,imagesSupported:E,cardId:q0,runFolder:T,clientHint:X0}).connect(g0)}catch(S0){if(console.error("[mcp] buildServer/connect failed",S0),r)W.delete(r);await g0.close().catch(()=>{return}),V0(B,500,I2,"server-init-failed");return}C=g0}else{V0(B,400,h0,"no-session",{hint:"Non-initialize requests must include a valid Mcp-Session-Id header obtained from a prior initialize."});return}try{await C.handleRequest(w,B,h)}catch(g){if(console.error("[mcp] transport.handleRequest threw",g),!B.headersSent)V0(B,500,I2,"internal")}})().catch((b)=>{console.error("[mcp] unhandled request handler error:",b)})});return Z=await D7(U,g7(X.port)),{url:`http://127.0.0.1:${Z}${d3}`,port:Z,close:async()=>{clearInterval(H);for(let w of W.values())await w.transport.close().catch(()=>{return});W.clear(),await new Promise((w)=>U.close(()=>w()))}}}var I7={name:"ideawave-board",version:"1.0.0"},yX="list_run_folder",fX="read_run_folder_file",t3=new Set([...u2,yX,fX]),e3=new Set(["inspect_diagram"]),S7=[{name:yX,description:"List visible files and folders under the selected runtime run folder. Hidden/config folders are omitted.",inputSchema:{type:"object",properties:{path:{type:"string",description:"Optional relative path inside the selected run folder. Defaults to the run-folder root."}},additionalProperties:!1}},{name:fX,description:"Read a text file inside the selected runtime run folder. Hidden/config paths and outside-folder paths are denied.",inputSchema:{type:"object",properties:{path:{type:"string",description:"Relative path to a text file inside the selected run folder."}},required:["path"],additionalProperties:!1}}];function T2(X){return{content:[{type:"text",text:X}]}}function l7(X){return T2(JSON.stringify(X,null,2))}function o3(X){return{...T2(X),isError:!0}}async function T7(X,W){if(!W||X.isError)return X;let Z=X.content.find((Y)=>Y.type==="text");if(!Z)return X;let K;try{let Y=JSON.parse(Z.text);if(typeof Y.path!=="string")return X;K=y1.resolve(Y.path)}catch{return X}let J=y1.resolve(y1.join(E7.tmpdir(),"ideawave-screenshots"));if(y1.dirname(K)!==J||!/^board-[a-z0-9-]+\.png$/i.test(y1.basename(K)))return X;try{if(!(await $7(K)).isFile())return X;let H=await G7(K);if(H.byteLength<1024||H.byteLength>26214400||!H.subarray(0,8).equals(Buffer.from([137,80,78,71,13,10,26,10])))return X;return{...X,content:[...X.content,{type:"image",data:H.toString("base64"),mimeType:"image/png"}]}}catch{return X}}function A7(X,W,Z="full",K=!1){return X.getMetadata(W).filter((J)=>{let Y=wX(J.name);if(Z==="read"&&!t3.has(Y))return!1;if(!K&&e3.has(Y))return!1;return!0}).map((J)=>({name:J.name,description:J.description,inputSchema:J.inputSchema}))}function c7(X,W,Z={}){let K=A7(X,W,Z.toolSurface??"full",Z.imagesSupported??!1);return Z.includeRunFolderTools?[...K,...S7]:K}function n3(X,W){if(!X||typeof X!=="object"||Array.isArray(X))return null;let Z=X[W];return typeof Z==="string"?Z:null}async function a7(X,W,Z){if(Z&&Z.trim().length>0)return Z.trim();if(!X||!W)throw Error("Run-folder tools require an active IdeaWave board and card.");return(await O0({boardId:X,cardId:W})).runFolder}async function i7(X){let W=await a7(X.boardId,X.cardId,X.runFolder);if(X.name===yX){let Z=n3(X.args,"path")??"",K=await r4(W,Z);return l7(K)}if(X.name===fX){let Z=n3(X.args,"path");if(!Z)return o3("read_run_folder_file requires a path.");return T2(await HX(W,Z))}return o3(`Unknown local tool "${X.name}"`)}function d7(X,W,Z,K,J,Y="full",H=!1){let U=new _7(I7,{capabilities:{tools:{}}}),F=async()=>{if(H)return!0;if(q3(K))return!0;if(Z&&K)try{return(await O0({boardId:Z,cardId:K})).adapter.supportsImages===!0}catch{return!1}return!1};return U.setRequestHandler(u7,async()=>({tools:c7(X,W,{includeRunFolderTools:Boolean(J||Z&&K),toolSurface:Y,imagesSupported:await F()})})),U.setRequestHandler(k7,async(w)=>{let{name:B,arguments:b}=w.params,R=wX(B),f=Date.now();G("mcp.tool_call_received",{frontendSessionId:W,cardId:K,toolName:R});try{if(R===yX||R===fX)return await i7({name:R,args:b,boardId:Z,cardId:K,runFolder:J});if(Y==="read"&&!t3.has(R))throw Error(`Tool "${B}" is not available in read-only mode`);if(e3.has(R)&&!await F())throw Error(`Tool "${B}" requires a runtime that supports image input`);let v=await X.callTool(W,R,b??{},void 0,K??void 0);if(G("mcp.tool_result_returned",{frontendSessionId:W,cardId:K,toolName:R,elapsedMs:Date.now()-f}),v&&typeof v==="object"&&Array.isArray(v.content)){let O=v;return R==="screenshot_board"?await T7(O,await F()):O}return{content:[{type:"text",text:typeof v==="string"?v:JSON.stringify(v)}]}}catch(v){return G("mcp.tool_result_returned",{frontendSessionId:W,cardId:K,toolName:R,elapsedMs:Date.now()-f,hasError:!0}),{content:[{type:"text",text:v instanceof Error?v.message:"Tool call failed"}],isError:!0}}}),U}function X8(X,W){return s3({buildServer:(Z)=>d7(X,Z.frontendSessionId,Z.boardId,Z.cardId,Z.runFolder,Z.toolSurface,Z.imagesSupported),port:W})}import RX from"node:fs/promises";import A2 from"node:os";import OX from"node:path";function W8(){return`cfg_${crypto.randomUUID().replace(/-/g,"").slice(0,16)}`}async function p7(){let[X,W]=await Promise.all([Q0(),k6()]),Z=X.globalDefaultConfigId?X.runtimes.find((K)=>K.id===X.globalDefaultConfigId)??null:null;return{runtimes:X.runtimes,globalDefaultConfigId:X.globalDefaultConfigId,globalDefaultEffective:Z?{runFolder:Z.runFolder??A2.homedir(),modelId:Z.defaultModelId??null,configValues:Z.defaultConfigValues??{}}:null,knownAdapters:A0().map((K)=>({id:K.id,displayName:K.displayName})),readiness:W}}async function r7(X){try{let W=await O0({boardId:X.boardId,cardId:X.cardId});return{resolved:{configId:W.entry.id,adapterId:W.entry.kind==="registered"?W.entry.adapterId:null,displayName:W.entry.displayName,runFolder:W.runFolder,modelId:W.modelId,configValues:W.configValues}}}catch(W){if(W instanceof D0)return{resolved:null};throw W}}async function s7(X){return Y0((W)=>{let Z=W.runtimes.find((Y)=>Y.kind==="registered"&&Y.adapterId===X.adapterId);if(Z)return Z;let K=A0().find((Y)=>Y.id===X.adapterId);if(!K)throw Error(`Unknown adapterId: ${X.adapterId}`);let J={id:W8(),kind:"registered",adapterId:X.adapterId,displayName:K.displayName,runFolder:null,defaultModelId:null,defaultConfigValues:{},discoveredModels:[],discoveredConfigOptions:[],discoveredAt:null};return W.runtimes.push(J),J})}async function o7(X){return Y0((W)=>{let Z={id:W8(),kind:"custom",displayName:X.displayName,command:X.command,args:X.args,env:X.env,runFolder:X.runFolder,defaultModelId:null,defaultConfigValues:{},discoveredModels:[],discoveredConfigOptions:[],discoveredAt:null};return W.runtimes.push(Z),Z})}async function n7(X){await Y0((W)=>{if(W.runtimes=W.runtimes.filter((Z)=>Z.id!==X.runtimeConfigId),W.globalDefaultConfigId===X.runtimeConfigId)W.globalDefaultConfigId=null;for(let Z of Object.keys(W.boardOverrides))if(W.boardOverrides[Z].runtimeConfigId===X.runtimeConfigId)delete W.boardOverrides[Z];for(let Z of Object.keys(W.cardOverrides))if(W.cardOverrides[Z].runtimeConfigId===X.runtimeConfigId)delete W.cardOverrides[Z]})}async function t7(X){await Y0((W)=>{let Z=W.runtimes.find((K)=>K.id===X.runtimeConfigId);if(!Z)throw Error(`Runtime config not found: ${X.runtimeConfigId}`);if(W.globalDefaultConfigId=X.runtimeConfigId,X.runFolder!==void 0)Z.runFolder=X.runFolder;if(X.modelId!==void 0)Z.defaultModelId=X.modelId;if(X.configValues!==void 0)Z.defaultConfigValues=X.configValues})}async function e7(X){X.boardId,await Y0((W)=>{if(X.runtimeConfigId===null){delete W.cardOverrides[X.cardId];return}if(!W.runtimes.some((J)=>J.id===X.runtimeConfigId))throw Error(`Runtime config not found: ${X.runtimeConfigId}`);let K=W.cardOverrides[X.cardId];W.cardOverrides[X.cardId]={runtimeConfigId:X.runtimeConfigId,runFolder:X.runFolder!==void 0?X.runFolder:K?.runFolder??null,modelId:X.modelId!==void 0?X.modelId:K?.modelId??null,configValues:X.configValues!==void 0?X.configValues:K?.configValues??{}}})}async function XQ(X){let Z=(await Q0()).runtimes.find((H)=>H.id===X.runtimeConfigId);if(!Z)throw Error(`Runtime config not found: ${X.runtimeConfigId}`);let K=w0(Z),J=await K.resolveSpawnConfig(Z),Y=Z.runFolder??A2.homedir();try{let H=await H3({spawn:{...J,cwd:Y},modelId:X.modelId??Z.defaultModelId??null,configValues:X.configValues??Z.defaultConfigValues??{}}),U=zX({adapterId:K.id,models:H.models,currentModelId:H.currentModelId}),F=new Date().toISOString();return await Y0((w)=>{let B=w.runtimes.find((b)=>b.id===X.runtimeConfigId);if(B)B.discoveredModels=U,B.discoveredConfigOptions=H.configOptions,B.discoveredAt=F}),{ok:!0,models:U,configOptions:H.configOptions,currentModelId:H.currentModelId}}catch(H){if(H instanceof l0)throw Error(`${H.message}${K.authHint?` ${K.authHint}`:""}`);if(H instanceof I||H instanceof H0)throw Error(H.message);throw H}}async function WQ(X){let W=A2.homedir(),Z=X.path?.trim()?X.path.trim():W,K=OX.resolve(Z),J=!0;try{if(!(await RX.stat(K)).isDirectory())K=OX.dirname(K)}catch{J=!1,K=W}let Y=[];try{Y=(await RX.readdir(K,{withFileTypes:!0})).filter((F)=>F.isDirectory()&&!F.name.startsWith(".")).map((F)=>({name:F.name,path:OX.join(K,F.name)})).sort((F,w)=>F.name.localeCompare(w.name))}catch{Y=[]}let H=OX.dirname(K);return{path:K,parent:H===K?null:H,home:W,exists:J,entries:Y}}var Z8={list:p7,getEffectiveForCard:r7,registerRegistered:s7,registerCustom:o7,unregister:n7,setUserDefault:t7,setCardOverride:e7,refreshModels:XQ,browseFolder:WQ};var ZQ=[{id:"claude-code",displayName:"Claude Code"},{id:"codex",displayName:"Codex"},{id:"copilot",displayName:"Copilot"},{id:"opencode",displayName:"OpenCode"}];function QQ(){return`cfg_${crypto.randomUUID().replace(/-/g,"").slice(0,16)}`}async function Q8(){try{let X=await Q0();if(X.globalDefaultConfigId){if(X.runtimes.some((Z)=>Z.id===X.globalDefaultConfigId))return X.globalDefaultConfigId}for(let W of ZQ){if((await u6(W.id))?.status!=="ready")continue;let K=null;if(await Y0((J)=>{if(J.globalDefaultConfigId){if(J.runtimes.some((U)=>U.id===J.globalDefaultConfigId)){K=J.globalDefaultConfigId;return}}let Y=J.runtimes.find((H)=>H.kind==="registered"&&H.adapterId===W.id);if(!Y){let H={id:QQ(),kind:"registered",adapterId:W.id,displayName:W.displayName,runFolder:null,defaultModelId:null,defaultConfigValues:{},discoveredModels:[],discoveredConfigOptions:[],discoveredAt:null};J.runtimes.push(H),Y=H}J.globalDefaultConfigId=Y.id,K=Y.id}),K)return console.log(`[ideawave-cli] using agent runtime: ${W.displayName}`),K}return console.warn("[ideawave-cli] no agent runtime detected on PATH (tried claude, codex, gh copilot, opencode). Install one to run agents."),null}catch(X){return console.warn("[ideawave-cli] runtime auto-seed failed",X),null}}var KQ=120000;function JQ(){if(typeof crypto<"u"&&"randomUUID"in crypto)return`call_${crypto.randomUUID()}`;return`call_${Date.now()}_${Math.random().toString(16).slice(2)}`}class c2{sessions=new Map;createCallId;toolCallTimeoutMs;constructor(X={}){this.createCallId=X.createCallId??JQ,this.toolCallTimeoutMs=X.toolCallTimeoutMs??KQ}register(X){let W=this.sessions.get(X.frontendSessionId);if(W){if(W.userId!==X.userId)this.rejectPending(W,"frontend session user changed"),W.activeRunIds.clear();this.sessions.set(X.frontendSessionId,{frontendSessionId:X.frontendSessionId,userId:X.userId,tools:X.tools,send:X.send,pendingToolCalls:W.pendingToolCalls,activeRunIds:W.activeRunIds,activeRunCardIds:W.activeRunCardIds});return}this.sessions.set(X.frontendSessionId,{frontendSessionId:X.frontendSessionId,userId:X.userId,tools:X.tools,send:X.send,pendingToolCalls:new Map,activeRunIds:new Set,activeRunCardIds:new Map})}disconnect(X,W="frontend session disconnected"){let Z=this.sessions.get(X);if(!Z)return{activeRunIds:[]};return this.sessions.delete(X),this.rejectPending(Z,W),{activeRunIds:Array.from(Z.activeRunIds)}}sessionCount(){return this.sessions.size}has(X){return this.sessions.has(X)}getUserId(X){return this.sessions.get(X)?.userId??null}setMetadata(X,W){let Z=this.sessions.get(X);if(Z)Z.tools=W}getMetadata(X){if(!X)return[];return this.sessions.get(X)?.tools??[]}sendToSession(X,W){let Z=this.sessions.get(X);if(!Z)return!1;return Z.send(W),!0}callTool(X,W,Z,K,J){if(!X)return Promise.reject(Error("MCP tool call is missing a frontend session id"));let Y=this.sessions.get(X);if(!Y)return Promise.reject(Error(`Frontend session ${X} is not connected`));let H=this.createCallId();return new Promise((U,F)=>{let w=K??(J?this.getActiveRunIdForCard(Y,J):this.getSoleActiveRunId(Y)),B=J??(w?Y.activeRunCardIds.get(w):void 0),b=Date.now(),R=setTimeout(()=>{Y.pendingToolCalls.delete(H),G("tool_queue.timeout",{frontendSessionId:X,runId:w,cardId:B,callId:H,toolName:W,elapsedMs:Date.now()-b,queueDepth:Y.pendingToolCalls.size}),F(Error(`Tool "${W}" timed out waiting for the frontend`))},this.toolCallTimeoutMs);Y.pendingToolCalls.set(H,{resolve:U,reject:F,timer:R,name:W,runId:w??null,cardId:B??null,startedAt:b}),G("tool_queue.forwarded_to_browser",{frontendSessionId:X,runId:w,cardId:B,callId:H,toolName:W,queueDepth:Y.pendingToolCalls.size}),Y.send({type:"tool_call",callId:H,name:W,args:Z,...w?{runId:w}:{},...B?{cardId:B}:{}})})}handleToolResult(X,W){let Z=this.sessions.get(X);if(!Z)return;let K=Z.pendingToolCalls.get(W.callId);if(!K)return;if(Z.pendingToolCalls.delete(W.callId),clearTimeout(K.timer),G("tool_queue.result_received",{frontendSessionId:X,runId:K.runId,cardId:K.cardId,callId:W.callId,toolName:K.name,elapsedMs:Date.now()-K.startedAt,queueDepth:Z.pendingToolCalls.size,ok:W.ok}),W.ok){K.resolve(W.result);return}let J=W.result;if(J&&typeof J==="object"&&Array.isArray(J.content)){K.resolve({...J,isError:!0});return}K.reject(Error(W.error??"Tool execution failed"))}markRunActive(X,W,Z){let K=this.sessions.get(X);if(!K)return;if(K.activeRunIds.add(W),Z)K.activeRunCardIds.set(W,Z)}markRunSettled(X,W){let Z=this.sessions.get(X);if(!Z)return;Z.activeRunIds.delete(W),Z.activeRunCardIds.delete(W)}ownsRun(X,W){return this.sessions.get(X)?.activeRunIds.has(W)??!1}rejectPending(X,W){for(let Z of X.pendingToolCalls.values())clearTimeout(Z.timer),G("tool_queue.rejected",{frontendSessionId:X.frontendSessionId,runId:Z.runId,cardId:Z.cardId,toolName:Z.name,elapsedMs:Date.now()-Z.startedAt}),Z.reject(Error(W));X.pendingToolCalls.clear()}getSoleActiveRunId(X){return X.activeRunIds.size===1?X.activeRunIds.values().next().value:void 0}getActiveRunIdForCard(X,W){let Z=[...X.activeRunCardIds.entries()].filter(([K,J])=>X.activeRunIds.has(K)&&J===W).map(([K])=>K);return Z.length===1?Z[0]:void 0}}function J8(){return"0.0.78".trim()?"0.0.78":"dev"}var VQ=process.argv.slice(2),i2=_3(VQ,process.env);if(i2.allowRailwayPrPreviews)process.env[b1]="1";var M0=i2.cliArgs[0],{browserKitEnabled:R1,captureEngineEnabled:YQ}=i2;if(M0==="--help"||M0==="-h"||M0==="help")console.log("ideawave — host the local bridge for a running ideawave.app session."),console.log(""),console.log("Usage:"),console.log(" ideawave Serve the browser bridge and MCP forwarder."),console.log(" ideawave --version Print the CLI version."),process.exit(0);if(M0==="--version"||M0==="-v"||M0==="version")console.log(J8()),process.exit(0);if(M0)console.error(`Unknown command: ${M0}`),console.error("Run `ideawave --help` for usage."),process.exit(1);var O1=new c2,I0=null,zQ=R1?{phase:"ready",message:"Local browser-kit proxy is ready"}:{phase:"idle"},n0=new YX;function N0(X,W){O1.sendToSession(X,W)}async function jQ(X,W){try{let Z=Z8[W.method],K=await Z(W.params);N0(X,{type:"runtime_rpc_result",requestId:W.requestId,ok:!0,result:K})}catch(Z){N0(X,{type:"runtime_rpc_result",requestId:W.requestId,ok:!1,error:Z instanceof Error?Z.message:String(Z)})}}var C1=!1,f1=null;async function a2(){if(C1)return;if(f1)return f1;return f1=(async()=>{try{let X=await X8(O1);t2({...X,requestedPort:X.port}),console.log(`[ideawave-cli] MCP endpoint for the agent: ${X.url}`);try{await P6({onStatusChange:(W)=>{if(I6(),I0?.sendStatus(),W.status==="failed")console.warn(`[ideawave-cli] ACP bridge setup failed for ${W.packageName}: ${W.error??"unknown error"}`)}})}catch(W){console.warn("[ideawave-cli] ACP bridge setup skipped:",W instanceof Error?W.message:String(W))}await Q8(),C1=!0,console.log("[ideawave-cli] ready — agent runs will drive the board."),I0?.sendStatus()}catch(X){console.error("[ideawave-cli] failed to start agent host:",X),I0?.sendStatus(void 0,X instanceof Error?X.message:String(X))}finally{f1=null}})(),f1}if(process.env.APP_ENV!=="development"){let X=await l3();if(X)console.error(`[ideawave-cli] An IdeaWave CLI is already running at ${X}.`),console.error("[ideawave-cli] Only one CLI per machine is supported — it already serves every browser tab. Exiting."),process.exit(0)}if(YQ)C3().then((X)=>{if(X.phase==="ready")console.log("[ideawave-cli] screenshot engine ready");else if(X.phase==="failed")console.warn(`[ideawave-cli] screenshot engine setup failed: ${X.error??"unknown error"}`)});I0=await T3({registry:O1,runtime:null,mcpReady:()=>C1,capabilities:R1?[e2,X6,W6]:[],cliVersion:J8(),browserRuntimeStatus:()=>zQ,onToolMetadata:(X)=>{console.log(`[ideawave-cli] session ${X} advertised ${O1.getMetadata(X).length} tools`),a2()},onRunTurn:(X,W)=>{console.log(`[ideawave-cli] running agent turn for card ${W.cardId} (session ${X})`),(async()=>{if(await a2(),!C1){N0(X,{type:"run_settled",runId:W.runId,cardId:W.cardId,result:{assistantContent:"",model:null,latencyMs:0,errorText:"IdeaWave CLI agent host is not ready",partialText:null}});return}await v3(W,(Z)=>N0(X,Z))})().catch(()=>{return}).finally(()=>O1.markRunSettled(X,W.runId))},onCancelRun:(X,W)=>{h2(W)},onRuntimeRpc:(X,W)=>{jQ(X,W)},onBrowserRpc:(X,W,Z)=>{if(!R1){N0(X,{type:"browser_rpc_result",requestId:Z.requestId,ok:!1,error:"The development browser-kit proxy is not enabled"});return}n0.handleRpc(X,W,Z).then((K)=>{N0(X,{type:"browser_rpc_result",requestId:Z.requestId,ok:!0,result:K})},(K)=>{N0(X,{type:"browser_rpc_result",requestId:Z.requestId,ok:!1,error:K instanceof Error?K.message:String(K)})})},onHttpRequest:(X,W)=>R1?n0.handleHttpRequest(X,W):!1,onHttpUpgrade:(X,W,Z)=>R1?n0.handleUpgrade(X,W,Z):!1,onWarmupRun:(X,W,Z)=>{(async()=>{if(await a2(),!C1)return{status:"retryable",error:"agent host is not ready"};return b3({cardId:W.cardId,boardId:W.boardId,userId:Z,frontendSessionId:X})})().then((K)=>{if(!W.warmupId)return;N0(X,{type:"warmup_result",warmupId:W.warmupId,cardId:W.cardId,...K})})},onDisconnect:(X,W)=>{n0.closeFrontendSession(X),B3(X);for(let Z of W)h2(Z);G("bridge.frontend_disconnected",{frontendSessionId:X,activeRuns:W.length}),r2(X).catch((Z)=>{console.warn(`[ideawave-cli] failed to evict sessions for ${X}:`,Z instanceof Error?Z.message:String(Z))}),console.log(`[ideawave-cli] browser session ${X} disconnected`)}});n0.setPort(I0.port);console.log(`[ideawave-cli] browser bridge listening on ${I0.url}`);console.log("[ideawave-cli] waiting for ideawave.app browser sessions…");var K8=!1;for(let X of["SIGINT","SIGTERM"])process.once(X,()=>{if(K8)return;K8=!0,L3(),(async()=>{await n0.close(),await M3(),await I0?.close().catch(()=>{return}),process.exit(0)})()});
1071
+ ${Z}`),X.destroy()}function L7(X,W){return new Promise((Z,K)=>{let J=(H)=>{X.off("listening",Y),K(H)},Y=()=>{X.off("error",J);let H=X.address();if(!H||typeof H==="string"){K(Error("Failed to read CLI bridge server address"));return}Z(H.port)};X.once("error",J),X.once("listening",Y),X.listen(W,"127.0.0.1")})}function u3(X){return new Promise((W,Z)=>{X.close((K)=>{if(K)Z(K);else W()})})}async function T3(X,W=_2()){let Z=new Map,K=new Map,J=X.maxMessageSize??K7,Y=!1,H=(f)=>{let v=K.get(f);if(v)clearTimeout(v);K.delete(f)},U=(f)=>{K.delete(f);let{activeRunIds:v}=X.registry.disconnect(f);X.onDisconnect(f,v)},F=(f,v)=>{let O={type:"cli_status",connected:!0,runtime:X.runtime,mcpReady:X.mcpReady(),error:v,capabilities:X.capabilities??[],cliVersion:X.cliVersion,browserRuntime:X.browserRuntimeStatus?.()};if(f){let h=Z.get(f);if(h)o0(h,O);return}for(let h of Z.values())o0(h,O)},w=(f,v)=>{let O=v.sessionId.trim(),h=v.userId.trim();if(!O||!h){o0(f,{type:"cli_status",connected:!1,runtime:X.runtime,mcpReady:X.mcpReady(),error:"Missing frontend session or user id"}),f.close();return}H(O);let C=Z.get(O);if(C&&C!==f)C.close();f.data.frontendSessionId=O,Z.set(O,f),X.registry.register({frontendSessionId:O,userId:h,tools:v.tools,send:(g)=>o0(f,g)}),F(O),X.onToolMetadata?.(O)},B=(f,v)=>{let O=X.registry.getUserId(f);if(!O)return;switch(v.type){case"bridge_ping":{let h=Z.get(f);if(h)o0(h,{type:"bridge_pong"});break}case"tool_metadata":X.registry.setMetadata(f,v.tools),X.onToolMetadata?.(f);break;case"tool_result":X.registry.handleToolResult(f,v);break;case"run_turn":G("bridge.run_received",{runId:v.run.runId,cardId:v.run.cardId,frontendSessionId:f}),X.registry.markRunActive(f,v.run.runId,v.run.cardId),X.onRunTurn(f,{...v.run,frontendSessionId:f,userId:O});break;case"cancel_run":if(X.registry.ownsRun(f,v.runId))X.onCancelRun(f,v.runId);break;case"runtime_rpc":X.onRuntimeRpc(f,v);break;case"browser_rpc":X.onBrowserRpc?.(f,Z.get(f)?.data.frontendOrigin??"",v);break;case"warmup_run":X.onWarmupRun(f,{...v,frontendSessionId:f},O);break;default:break}},b=(f,v)=>{let O=bX(f.headers.origin),h=k2(O),C={Vary:"Origin"};if(h&&O)C["Access-Control-Allow-Origin"]=O,C["Access-Control-Allow-Private-Network"]="true";if(f.method==="OPTIONS"){v.writeHead(204,{...C,"Access-Control-Allow-Methods":"GET, OPTIONS","Access-Control-Allow-Headers":"*","Access-Control-Max-Age":"600"}),v.end();return}if(f.method!=="GET"){v.writeHead(405,C),v.end();return}v.writeHead(200,{...C,"content-type":"application/json","cache-control":"no-store"}),v.end(JSON.stringify({ideawave:!0,runtime:X.runtime,mcpReady:X.mcpReady(),capabilities:X.capabilities??[],cliVersion:X.cliVersion,browserRuntime:X.browserRuntimeStatus?.()}))},R=(f,v)=>{let O=bX(f.headers.origin),h=k2(O),C={Vary:"Origin"};if(h&&O)C["Access-Control-Allow-Origin"]=O,C["Access-Control-Allow-Private-Network"]="true";if(f.method==="OPTIONS"){v.writeHead(204,{...C,"Access-Control-Allow-Methods":"POST, OPTIONS","Access-Control-Allow-Headers":"content-type","Access-Control-Max-Age":"600"}),v.end();return}if(!h){v.writeHead(403,C),v.end();return}if(f.method!=="POST"){v.writeHead(405,C),v.end();return}let g={...C,"content-type":"application/json"},N=(M,P)=>{v.writeHead(M,g),v.end(JSON.stringify(P))},m="",u=!1;f.on("data",(M)=>{if(m+=M.toString("utf8"),m.length>z7)u=!0,f.destroy()}),f.on("end",()=>{if(u){N(400,{ok:!1,error:"Request body too large"});return}let M;try{M=JSON.parse(m)}catch{N(400,{ok:!1,error:"Invalid JSON body"});return}let P=typeof M.url==="string"?M.url:"";if(!G3(P)){N(400,{ok:!1,error:"url must be an http(s) loopback or /static_boards/ page URL"});return}let $=(E,A)=>{let q0=typeof E==="number"?E:Number.NaN;if(!Number.isFinite(q0))return A;return Math.min(4000,Math.max(200,Math.round(q0)))};E3({url:P,width:$(M.width,1440),height:$(M.height,900)}).then((E)=>N(200,{ok:!0,path:E.path,engine:E.engine})).catch((E)=>{let A=E instanceof v1?503:E instanceof vX?429:500;N(A,{ok:!1,...E instanceof v1?{installing:!0}:{},error:E instanceof Error?E.message:String(E)})})})};for(let f of W){let v=Z7((C,g)=>{(async()=>{let N=new URL(C.url??"/","http://127.0.0.1").pathname;if(N===g3){b(C,g);return}if(N===Y7){R(C,g);return}if(await X.onHttpRequest?.(C,g))return;g.writeHead(404,{"content-type":"text/plain"}),g.end("IdeaWave CLI bridge")})().catch((N)=>{if(g.headersSent){g.destroy(N instanceof Error?N:void 0);return}g.writeHead(500,{"content-type":"text/plain"}),g.end("IdeaWave CLI bridge request failed")})}),O=new Q7({noServer:!0,maxPayload:J}),h=(C)=>{if(C.idleTimer)clearTimeout(C.idleTimer);C.idleTimer=setTimeout(()=>{C.close()},J7),C.idleTimer.unref?.()};O.on("connection",(C,g)=>{let N=C;N.data={id:W7(),frontendSessionId:null,frontendOrigin:new URL(bX(g.headers.origin)??S3).origin},N.idleTimer=null,h(N),N.on("ping",()=>h(N)),N.on("pong",()=>h(N)),N.on("error",()=>{if(N.idleTimer)clearTimeout(N.idleTimer);N.close()}),N.on("message",(m)=>{h(N);let u=B7(m);if(J>0&&u.length>J)return;let M=g1(u);if(!M)return;let P=N.data.frontendSessionId;if(!P){if(M.type==="bridge_probe")o0(N,{type:"bridge_probe_ack",protocolVersion:M.protocolVersion});else if(M.type==="frontend_hello")w(N,M);return}B(P,M)}),N.on("close",()=>{if(N.idleTimer)clearTimeout(N.idleTimer);let m=N.data.frontendSessionId;if(!m)return;if(Z.get(m)!==N)return;if(Z.delete(m),H(m),Y)return;K.set(m,setTimeout(()=>U(m),V7))})}),v.on("upgrade",(C,g,N)=>{let m=new URL(C.url??"/","http://127.0.0.1").pathname;if(X.onHttpUpgrade?.(C,g,N))return;if(m!==E2){k3(g,404,"Not Found");return}if(!k2(bX(C.headers.origin))){k3(g,403,"Forbidden");return}O.handleUpgrade(C,g,N,(u)=>{O.emit("connection",u,C)})});try{let C=await L7(v,f);return{url:`ws://127.0.0.1:${C}${E2}`,port:C,sendStatus:F,close:async()=>{Y=!0;for(let g of K.values())clearTimeout(g);K.clear();for(let g of O.clients){let N=g;if(N.idleTimer)clearTimeout(N.idleTimer);N.close()}O.close(),await u3(v).catch(()=>{return})}}}catch(C){if(O.close(),await u3(v).catch(()=>{return}),C?.code==="EADDRINUSE")continue;throw C}}throw Error(`No free IdeaWave CLI bridge port found in ${W[0]}-${W.at(-1)}`)}import{lstat as $7,readFile as G7}from"node:fs/promises";import E7 from"node:os";import y1 from"node:path";import{Server as _7}from"@modelcontextprotocol/sdk/server/index.js";import{CallToolRequestSchema as k7,ListToolsRequestSchema as u7}from"@modelcontextprotocol/sdk/types.js";var u2=new Set(["list_boards","get_board","screenshot_board","list_nodes","list_edges","inspect_node","list_context_sources","read_context_card","read_context_file","read_context_image","list_context_folder","get_board_wiki","search_board","get_card_messages","list_agent_cards","inspect_neighbors"]),P7=["screenshot_board","inspect_diagram","ask_user_question","create_agent_card","append_user_message","spawn_child_agents"],x7=new Set(P7),WY=new Set([...u2].filter((X)=>!x7.has(X)));import{randomUUID as b7}from"node:crypto";import{createServer as y7}from"node:http";import{StreamableHTTPServerTransport as f7}from"@modelcontextprotocol/sdk/server/streamableHttp.js";import{isInitializeRequest as i3}from"@modelcontextprotocol/sdk/types.js";var A3=new Set(["127.0.0.1","localhost","[::1]","::1"]);function v7(X){let W=X.trim();if(W.length===0)return null;if(W.startsWith("[")){let Y=W.indexOf("]");if(Y===-1)return null;let H=W.slice(0,Y+1),U=W.slice(Y+1);if(U.length===0)return{host:H,port:null};if(!U.startsWith(":"))return null;let F=Number(U.slice(1));if(!Number.isInteger(F)||F<=0||F>65535)return null;return{host:H,port:F}}let Z=W.lastIndexOf(":");if(Z===-1)return{host:W,port:null};let K=W.slice(Z+1),J=Number(K);if(!Number.isInteger(J)||J<=0||J>65535)return{host:W,port:null};return{host:W.slice(0,Z),port:J}}function c3(X){return A3.has(X)||A3.has(X.toLowerCase())}function a3(X,W){let Z=X.headers.host;if(typeof Z!=="string")return{ok:!1,status:403,reason:"missing-host"};let K=v7(Z);if(!K)return{ok:!1,status:403,reason:"bad-host"};if(!c3(K.host))return{ok:!1,status:403,reason:"non-loopback-host"};if(K.port!==null&&K.port!==W)return{ok:!1,status:403,reason:"host-port-mismatch"};let J=X.headers.origin;if(typeof J==="string"&&J.length>0){if(J!=="null"){let Y;try{Y=new URL(J)}catch{return{ok:!1,status:403,reason:"bad-origin"}}if(!c3(Y.hostname))return{ok:!1,status:403,reason:"non-loopback-origin"}}}return{ok:!0}}var d3="/mcp",R7=43274,r3=16777216,O7=1800000,C7=300000,p3=200,h7=-32700,h0=-32600,I2=-32603;function V0(X,W,Z,K,J){X.statusCode=W,X.setHeader("content-type","application/json"),X.end(JSON.stringify({jsonrpc:"2.0",error:{code:Z,message:K,...J?{data:J}:{}},id:null}))}class S2 extends Error{constructor(){super("expected application/json");this.name="BadContentTypeError"}}class l2 extends Error{constructor(){super(`body exceeds ${r3} bytes`);this.name="BodyTooLargeError"}}async function N7(X){if(X.method&&X.method!=="POST")return;let W=X.headers["content-type"];if(typeof W==="string"&&W.trim().length>0){if(!W.toLowerCase().includes("application/json"))throw new S2}let Z=0,K=[];for await(let Y of X){let H=typeof Y==="string"?Buffer.from(Y):Y;if(Z+=H.byteLength,Z>r3)throw new l2;K.push(H)}if(K.length===0)return;let J=Buffer.concat(K).toString("utf8");if(J.length===0)return;return JSON.parse(J)}function M7(X){if(Array.isArray(X))return X.some(i3);return i3(X)}function g7(X){if(typeof X==="number")return X;let W=process.env.IDEAWAVE_MCP_PORT;if(W&&W.trim().length>0){let Z=Number(W);if(Number.isInteger(Z)&&Z>=0&&Z<65536)return Z}return R7}async function D7(X,W){let Z=(J)=>new Promise((Y,H)=>{let U=(w)=>{X.off("listening",F),H(w)},F=()=>{X.off("error",U),Y()};X.once("error",U),X.once("listening",F),X.listen(J,"127.0.0.1")});try{await Z(W)}catch(J){if(J.code!=="EADDRINUSE"||W===0)throw J;console.warn(`[mcp] port ${W} in use, falling back to an OS-assigned port; external CLIs will need to re-paste the install command from Settings → External agents`),await Z(0)}let K=X.address();if(K==null||typeof K==="string")throw Error("[mcp] failed to read bound address");return K.port}function m7(X,W){if(W&&typeof W==="object"&&!Array.isArray(W)){let K=W.params;if(K&&typeof K==="object"&&!Array.isArray(K)){let J=K.clientInfo;if(J&&typeof J==="object"&&!Array.isArray(J)){let Y=J.name;if(typeof Y==="string"&&Y.trim().length>0)return Y.trim()}}}let Z=X.headers["user-agent"];if(typeof Z==="string"&&Z.trim().length>0)return Z.trim();return null}async function s3(X){let W=new Map,Z=0;function K(w){let B=W.get(w);if(B)B.lastActivity=Date.now()}async function J(w,B){W.delete(w),await B.transport.close().catch(()=>{return})}async function Y(){let w=null,B=1/0;for(let[b,R]of W)if(R.lastActivity<B)B=R.lastActivity,w=b;if(w!==null){let b=W.get(w);if(b)console.warn(`[mcp] session cap of ${p3} reached; evicting ${w}`),await J(w,b)}}let H=setInterval(()=>{let w=Date.now()-O7;for(let[B,b]of W)if(b.lastActivity<w)console.log(`[mcp] sweeping idle session ${B}`),J(B,b)},C7);H.unref?.();let U=y7((w,B)=>{(async()=>{let b;try{b=new URL(w.url??"/","http://127.0.0.1").pathname}catch{V0(B,400,h0,"bad-url");return}if(b!==d3){V0(B,404,h0,"not-found");return}let R=w.method??"POST";if(R!=="POST"&&R!=="GET"&&R!=="DELETE"){B.setHeader("Allow","GET, POST, DELETE"),V0(B,405,h0,"method-not-allowed");return}let f=a3(w,Z);if(!f.ok){V0(B,f.status,h0,"forbidden",{reason:f.reason});return}let v=w.headers["mcp-session-id"],O=typeof v==="string"?v:void 0;if(R==="GET"||R==="DELETE"){if(!O||!W.has(O)){V0(B,400,h0,"no-session",{hint:"Open a POST initialize first to receive an Mcp-Session-Id."});return}let g=W.get(O).transport;K(O);try{await g.handleRequest(w,B)}catch(N){if(console.error("[mcp] transport.handleRequest (GET/DELETE) threw",N),!B.headersSent)V0(B,500,I2,"internal")}return}let h;try{h=await N7(w)}catch(g){if(g instanceof S2){V0(B,415,h0,"expected-application-json");return}if(g instanceof l2){V0(B,413,h0,"body-too-large");return}V0(B,400,h7,"invalid-json");return}let C;if(O&&W.has(O))C=W.get(O).transport,K(O);else if(!O&&h!==void 0&&M7(h)){let g=w.headers["x-ideawave-user-id"],N=typeof g==="string"&&g.trim().length>0?g.trim():null,m=w.headers["x-ideawave-frontend-session-id"],u=typeof m==="string"&&m.trim().length>0?m.trim():null,M=w.headers["x-ideawave-tool-surface"],P=typeof M==="string"&&M.trim()==="read"?"read":"full",$=w.headers["x-ideawave-images-supported"],E=typeof $==="string"&&$.trim()==="1",A=w.headers["x-ideawave-card-id"],q0=typeof A==="string"&&A.trim().length>0?A.trim():null,x0=w.headers["x-ideawave-board-id"],k=typeof x0==="string"&&x0.trim().length>0?x0.trim():null,d=w.headers["x-ideawave-run-folder"],T=typeof d==="string"&&d.trim().length>0?d.trim():null,X0=m7(w,h);if(W.size>=p3)await Y();let r=null,g0=new f7({sessionIdGenerator:()=>b7(),onsessioninitialized:(S0)=>{r=S0,W.set(S0,{transport:g0,lastActivity:Date.now()})},onsessionclosed:(S0)=>{W.delete(S0)}});g0.onclose=()=>{if(g0.sessionId)W.delete(g0.sessionId)};try{await X.buildServer({userId:N,frontendSessionId:u,boardId:k,toolSurface:P,imagesSupported:E,cardId:q0,runFolder:T,clientHint:X0}).connect(g0)}catch(S0){if(console.error("[mcp] buildServer/connect failed",S0),r)W.delete(r);await g0.close().catch(()=>{return}),V0(B,500,I2,"server-init-failed");return}C=g0}else{V0(B,400,h0,"no-session",{hint:"Non-initialize requests must include a valid Mcp-Session-Id header obtained from a prior initialize."});return}try{await C.handleRequest(w,B,h)}catch(g){if(console.error("[mcp] transport.handleRequest threw",g),!B.headersSent)V0(B,500,I2,"internal")}})().catch((b)=>{console.error("[mcp] unhandled request handler error:",b)})});return Z=await D7(U,g7(X.port)),{url:`http://127.0.0.1:${Z}${d3}`,port:Z,close:async()=>{clearInterval(H);for(let w of W.values())await w.transport.close().catch(()=>{return});W.clear(),await new Promise((w)=>U.close(()=>w()))}}}var I7={name:"ideawave-board",version:"1.0.0"},yX="list_run_folder",fX="read_run_folder_file",t3=new Set([...u2,yX,fX]),e3=new Set(["inspect_diagram"]),S7=[{name:yX,description:"List visible files and folders under the selected runtime run folder. Hidden/config folders are omitted.",inputSchema:{type:"object",properties:{path:{type:"string",description:"Optional relative path inside the selected run folder. Defaults to the run-folder root."}},additionalProperties:!1}},{name:fX,description:"Read a text file inside the selected runtime run folder. Hidden/config paths and outside-folder paths are denied.",inputSchema:{type:"object",properties:{path:{type:"string",description:"Relative path to a text file inside the selected run folder."}},required:["path"],additionalProperties:!1}}];function T2(X){return{content:[{type:"text",text:X}]}}function l7(X){return T2(JSON.stringify(X,null,2))}function o3(X){return{...T2(X),isError:!0}}async function T7(X,W){if(!W||X.isError)return X;let Z=X.content.find((Y)=>Y.type==="text");if(!Z)return X;let K;try{let Y=JSON.parse(Z.text);if(typeof Y.path!=="string")return X;K=y1.resolve(Y.path)}catch{return X}let J=y1.resolve(y1.join(E7.tmpdir(),"ideawave-screenshots"));if(y1.dirname(K)!==J||!/^board-[a-z0-9-]+\.png$/i.test(y1.basename(K)))return X;try{if(!(await $7(K)).isFile())return X;let H=await G7(K);if(H.byteLength<1024||H.byteLength>26214400||!H.subarray(0,8).equals(Buffer.from([137,80,78,71,13,10,26,10])))return X;return{...X,content:[...X.content,{type:"image",data:H.toString("base64"),mimeType:"image/png"}]}}catch{return X}}function A7(X,W,Z="full",K=!1){return X.getMetadata(W).filter((J)=>{let Y=wX(J.name);if(Z==="read"&&!t3.has(Y))return!1;if(!K&&e3.has(Y))return!1;return!0}).map((J)=>({name:J.name,description:J.description,inputSchema:J.inputSchema}))}function c7(X,W,Z={}){let K=A7(X,W,Z.toolSurface??"full",Z.imagesSupported??!1);return Z.includeRunFolderTools?[...K,...S7]:K}function n3(X,W){if(!X||typeof X!=="object"||Array.isArray(X))return null;let Z=X[W];return typeof Z==="string"?Z:null}async function a7(X,W,Z){if(Z&&Z.trim().length>0)return Z.trim();if(!X||!W)throw Error("Run-folder tools require an active IdeaWave board and card.");return(await O0({boardId:X,cardId:W})).runFolder}async function i7(X){let W=await a7(X.boardId,X.cardId,X.runFolder);if(X.name===yX){let Z=n3(X.args,"path")??"",K=await r4(W,Z);return l7(K)}if(X.name===fX){let Z=n3(X.args,"path");if(!Z)return o3("read_run_folder_file requires a path.");return T2(await HX(W,Z))}return o3(`Unknown local tool "${X.name}"`)}function d7(X,W,Z,K,J,Y="full",H=!1){let U=new _7(I7,{capabilities:{tools:{}}}),F=async()=>{if(H)return!0;if(q3(K))return!0;if(Z&&K)try{return(await O0({boardId:Z,cardId:K})).adapter.supportsImages===!0}catch{return!1}return!1};return U.setRequestHandler(u7,async()=>({tools:c7(X,W,{includeRunFolderTools:Boolean(J||Z&&K),toolSurface:Y,imagesSupported:await F()})})),U.setRequestHandler(k7,async(w)=>{let{name:B,arguments:b}=w.params,R=wX(B),f=Date.now();G("mcp.tool_call_received",{frontendSessionId:W,cardId:K,toolName:R});try{if(R===yX||R===fX)return await i7({name:R,args:b,boardId:Z,cardId:K,runFolder:J});if(Y==="read"&&!t3.has(R))throw Error(`Tool "${B}" is not available in read-only mode`);if(e3.has(R)&&!await F())throw Error(`Tool "${B}" requires a runtime that supports image input`);let v=await X.callTool(W,R,b??{},void 0,K??void 0);if(G("mcp.tool_result_returned",{frontendSessionId:W,cardId:K,toolName:R,elapsedMs:Date.now()-f}),v&&typeof v==="object"&&Array.isArray(v.content)){let O=v;return R==="screenshot_board"?await T7(O,await F()):O}return{content:[{type:"text",text:typeof v==="string"?v:JSON.stringify(v)}]}}catch(v){return G("mcp.tool_result_returned",{frontendSessionId:W,cardId:K,toolName:R,elapsedMs:Date.now()-f,hasError:!0}),{content:[{type:"text",text:v instanceof Error?v.message:"Tool call failed"}],isError:!0}}}),U}function X8(X,W){return s3({buildServer:(Z)=>d7(X,Z.frontendSessionId,Z.boardId,Z.cardId,Z.runFolder,Z.toolSurface,Z.imagesSupported),port:W})}import RX from"node:fs/promises";import A2 from"node:os";import OX from"node:path";function W8(){return`cfg_${crypto.randomUUID().replace(/-/g,"").slice(0,16)}`}async function p7(){let[X,W]=await Promise.all([Q0(),k6()]),Z=X.globalDefaultConfigId?X.runtimes.find((K)=>K.id===X.globalDefaultConfigId)??null:null;return{runtimes:X.runtimes,globalDefaultConfigId:X.globalDefaultConfigId,globalDefaultEffective:Z?{runFolder:Z.runFolder??A2.homedir(),modelId:Z.defaultModelId??null,configValues:Z.defaultConfigValues??{}}:null,knownAdapters:A0().map((K)=>({id:K.id,displayName:K.displayName})),readiness:W}}async function r7(X){try{let W=await O0({boardId:X.boardId,cardId:X.cardId});return{resolved:{configId:W.entry.id,adapterId:W.entry.kind==="registered"?W.entry.adapterId:null,displayName:W.entry.displayName,runFolder:W.runFolder,modelId:W.modelId,configValues:W.configValues}}}catch(W){if(W instanceof D0)return{resolved:null};throw W}}async function s7(X){return Y0((W)=>{let Z=W.runtimes.find((Y)=>Y.kind==="registered"&&Y.adapterId===X.adapterId);if(Z)return Z;let K=A0().find((Y)=>Y.id===X.adapterId);if(!K)throw Error(`Unknown adapterId: ${X.adapterId}`);let J={id:W8(),kind:"registered",adapterId:X.adapterId,displayName:K.displayName,runFolder:null,defaultModelId:null,defaultConfigValues:{},discoveredModels:[],discoveredConfigOptions:[],discoveredAt:null};return W.runtimes.push(J),J})}async function o7(X){return Y0((W)=>{let Z={id:W8(),kind:"custom",displayName:X.displayName,command:X.command,args:X.args,env:X.env,runFolder:X.runFolder,defaultModelId:null,defaultConfigValues:{},discoveredModels:[],discoveredConfigOptions:[],discoveredAt:null};return W.runtimes.push(Z),Z})}async function n7(X){await Y0((W)=>{if(W.runtimes=W.runtimes.filter((Z)=>Z.id!==X.runtimeConfigId),W.globalDefaultConfigId===X.runtimeConfigId)W.globalDefaultConfigId=null;for(let Z of Object.keys(W.boardOverrides))if(W.boardOverrides[Z].runtimeConfigId===X.runtimeConfigId)delete W.boardOverrides[Z];for(let Z of Object.keys(W.cardOverrides))if(W.cardOverrides[Z].runtimeConfigId===X.runtimeConfigId)delete W.cardOverrides[Z]})}async function t7(X){await Y0((W)=>{let Z=W.runtimes.find((K)=>K.id===X.runtimeConfigId);if(!Z)throw Error(`Runtime config not found: ${X.runtimeConfigId}`);if(W.globalDefaultConfigId=X.runtimeConfigId,X.runFolder!==void 0)Z.runFolder=X.runFolder;if(X.modelId!==void 0)Z.defaultModelId=X.modelId;if(X.configValues!==void 0)Z.defaultConfigValues=X.configValues})}async function e7(X){X.boardId,await Y0((W)=>{if(X.runtimeConfigId===null){delete W.cardOverrides[X.cardId];return}if(!W.runtimes.some((J)=>J.id===X.runtimeConfigId))throw Error(`Runtime config not found: ${X.runtimeConfigId}`);let K=W.cardOverrides[X.cardId];W.cardOverrides[X.cardId]={runtimeConfigId:X.runtimeConfigId,runFolder:X.runFolder!==void 0?X.runFolder:K?.runFolder??null,modelId:X.modelId!==void 0?X.modelId:K?.modelId??null,configValues:X.configValues!==void 0?X.configValues:K?.configValues??{}}})}async function XQ(X){let Z=(await Q0()).runtimes.find((H)=>H.id===X.runtimeConfigId);if(!Z)throw Error(`Runtime config not found: ${X.runtimeConfigId}`);let K=w0(Z),J=await K.resolveSpawnConfig(Z),Y=Z.runFolder??A2.homedir();try{let H=await H3({spawn:{...J,cwd:Y},modelId:X.modelId??Z.defaultModelId??null,configValues:X.configValues??Z.defaultConfigValues??{}}),U=zX({adapterId:K.id,models:H.models,currentModelId:H.currentModelId}),F=new Date().toISOString();return await Y0((w)=>{let B=w.runtimes.find((b)=>b.id===X.runtimeConfigId);if(B)B.discoveredModels=U,B.discoveredConfigOptions=H.configOptions,B.discoveredAt=F}),{ok:!0,models:U,configOptions:H.configOptions,currentModelId:H.currentModelId}}catch(H){if(H instanceof l0)throw Error(`${H.message}${K.authHint?` ${K.authHint}`:""}`);if(H instanceof I||H instanceof H0)throw Error(H.message);throw H}}async function WQ(X){let W=A2.homedir(),Z=X.path?.trim()?X.path.trim():W,K=OX.resolve(Z),J=!0;try{if(!(await RX.stat(K)).isDirectory())K=OX.dirname(K)}catch{J=!1,K=W}let Y=[];try{Y=(await RX.readdir(K,{withFileTypes:!0})).filter((F)=>F.isDirectory()&&!F.name.startsWith(".")).map((F)=>({name:F.name,path:OX.join(K,F.name)})).sort((F,w)=>F.name.localeCompare(w.name))}catch{Y=[]}let H=OX.dirname(K);return{path:K,parent:H===K?null:H,home:W,exists:J,entries:Y}}var Z8={list:p7,getEffectiveForCard:r7,registerRegistered:s7,registerCustom:o7,unregister:n7,setUserDefault:t7,setCardOverride:e7,refreshModels:XQ,browseFolder:WQ};var ZQ=[{id:"claude-code",displayName:"Claude Code"},{id:"codex",displayName:"Codex"},{id:"copilot",displayName:"Copilot"},{id:"opencode",displayName:"OpenCode"}];function QQ(){return`cfg_${crypto.randomUUID().replace(/-/g,"").slice(0,16)}`}async function Q8(){try{let X=await Q0();if(X.globalDefaultConfigId){if(X.runtimes.some((Z)=>Z.id===X.globalDefaultConfigId))return X.globalDefaultConfigId}for(let W of ZQ){if((await u6(W.id))?.status!=="ready")continue;let K=null;if(await Y0((J)=>{if(J.globalDefaultConfigId){if(J.runtimes.some((U)=>U.id===J.globalDefaultConfigId)){K=J.globalDefaultConfigId;return}}let Y=J.runtimes.find((H)=>H.kind==="registered"&&H.adapterId===W.id);if(!Y){let H={id:QQ(),kind:"registered",adapterId:W.id,displayName:W.displayName,runFolder:null,defaultModelId:null,defaultConfigValues:{},discoveredModels:[],discoveredConfigOptions:[],discoveredAt:null};J.runtimes.push(H),Y=H}J.globalDefaultConfigId=Y.id,K=Y.id}),K)return console.log(`[ideawave-cli] using agent runtime: ${W.displayName}`),K}return console.warn("[ideawave-cli] no agent runtime detected on PATH (tried claude, codex, gh copilot, opencode). Install one to run agents."),null}catch(X){return console.warn("[ideawave-cli] runtime auto-seed failed",X),null}}var KQ=120000;function JQ(){if(typeof crypto<"u"&&"randomUUID"in crypto)return`call_${crypto.randomUUID()}`;return`call_${Date.now()}_${Math.random().toString(16).slice(2)}`}class c2{sessions=new Map;createCallId;toolCallTimeoutMs;constructor(X={}){this.createCallId=X.createCallId??JQ,this.toolCallTimeoutMs=X.toolCallTimeoutMs??KQ}register(X){let W=this.sessions.get(X.frontendSessionId);if(W){if(W.userId!==X.userId)this.rejectPending(W,"frontend session user changed"),W.activeRunIds.clear();this.sessions.set(X.frontendSessionId,{frontendSessionId:X.frontendSessionId,userId:X.userId,tools:X.tools,send:X.send,pendingToolCalls:W.pendingToolCalls,activeRunIds:W.activeRunIds,activeRunCardIds:W.activeRunCardIds});return}this.sessions.set(X.frontendSessionId,{frontendSessionId:X.frontendSessionId,userId:X.userId,tools:X.tools,send:X.send,pendingToolCalls:new Map,activeRunIds:new Set,activeRunCardIds:new Map})}disconnect(X,W="frontend session disconnected"){let Z=this.sessions.get(X);if(!Z)return{activeRunIds:[]};return this.sessions.delete(X),this.rejectPending(Z,W),{activeRunIds:Array.from(Z.activeRunIds)}}sessionCount(){return this.sessions.size}has(X){return this.sessions.has(X)}getUserId(X){return this.sessions.get(X)?.userId??null}setMetadata(X,W){let Z=this.sessions.get(X);if(Z)Z.tools=W}getMetadata(X){if(!X)return[];return this.sessions.get(X)?.tools??[]}sendToSession(X,W){let Z=this.sessions.get(X);if(!Z)return!1;return Z.send(W),!0}callTool(X,W,Z,K,J){if(!X)return Promise.reject(Error("MCP tool call is missing a frontend session id"));let Y=this.sessions.get(X);if(!Y)return Promise.reject(Error(`Frontend session ${X} is not connected`));let H=this.createCallId();return new Promise((U,F)=>{let w=K??(J?this.getActiveRunIdForCard(Y,J):this.getSoleActiveRunId(Y)),B=J??(w?Y.activeRunCardIds.get(w):void 0),b=Date.now(),R=setTimeout(()=>{Y.pendingToolCalls.delete(H),G("tool_queue.timeout",{frontendSessionId:X,runId:w,cardId:B,callId:H,toolName:W,elapsedMs:Date.now()-b,queueDepth:Y.pendingToolCalls.size}),F(Error(`Tool "${W}" timed out waiting for the frontend`))},this.toolCallTimeoutMs);Y.pendingToolCalls.set(H,{resolve:U,reject:F,timer:R,name:W,runId:w??null,cardId:B??null,startedAt:b}),G("tool_queue.forwarded_to_browser",{frontendSessionId:X,runId:w,cardId:B,callId:H,toolName:W,queueDepth:Y.pendingToolCalls.size}),Y.send({type:"tool_call",callId:H,name:W,args:Z,...w?{runId:w}:{},...B?{cardId:B}:{}})})}handleToolResult(X,W){let Z=this.sessions.get(X);if(!Z)return;let K=Z.pendingToolCalls.get(W.callId);if(!K)return;if(Z.pendingToolCalls.delete(W.callId),clearTimeout(K.timer),G("tool_queue.result_received",{frontendSessionId:X,runId:K.runId,cardId:K.cardId,callId:W.callId,toolName:K.name,elapsedMs:Date.now()-K.startedAt,queueDepth:Z.pendingToolCalls.size,ok:W.ok}),W.ok){K.resolve(W.result);return}let J=W.result;if(J&&typeof J==="object"&&Array.isArray(J.content)){K.resolve({...J,isError:!0});return}K.reject(Error(W.error??"Tool execution failed"))}markRunActive(X,W,Z){let K=this.sessions.get(X);if(!K)return;if(K.activeRunIds.add(W),Z)K.activeRunCardIds.set(W,Z)}markRunSettled(X,W){let Z=this.sessions.get(X);if(!Z)return;Z.activeRunIds.delete(W),Z.activeRunCardIds.delete(W)}ownsRun(X,W){return this.sessions.get(X)?.activeRunIds.has(W)??!1}rejectPending(X,W){for(let Z of X.pendingToolCalls.values())clearTimeout(Z.timer),G("tool_queue.rejected",{frontendSessionId:X.frontendSessionId,runId:Z.runId,cardId:Z.cardId,toolName:Z.name,elapsedMs:Date.now()-Z.startedAt}),Z.reject(Error(W));X.pendingToolCalls.clear()}getSoleActiveRunId(X){return X.activeRunIds.size===1?X.activeRunIds.values().next().value:void 0}getActiveRunIdForCard(X,W){let Z=[...X.activeRunCardIds.entries()].filter(([K,J])=>X.activeRunIds.has(K)&&J===W).map(([K])=>K);return Z.length===1?Z[0]:void 0}}function J8(){return"0.0.79".trim()?"0.0.79":"dev"}var VQ=process.argv.slice(2),i2=_3(VQ,process.env);if(i2.allowRailwayPrPreviews)process.env[b1]="1";var M0=i2.cliArgs[0],{browserKitEnabled:R1,captureEngineEnabled:YQ}=i2;if(M0==="--help"||M0==="-h"||M0==="help")console.log("ideawave — host the local bridge for a running ideawave.app session."),console.log(""),console.log("Usage:"),console.log(" ideawave Serve the browser bridge and MCP forwarder."),console.log(" ideawave --version Print the CLI version."),process.exit(0);if(M0==="--version"||M0==="-v"||M0==="version")console.log(J8()),process.exit(0);if(M0)console.error(`Unknown command: ${M0}`),console.error("Run `ideawave --help` for usage."),process.exit(1);var O1=new c2,I0=null,zQ=R1?{phase:"ready",message:"Local browser-kit proxy is ready"}:{phase:"idle"},n0=new YX;function N0(X,W){O1.sendToSession(X,W)}async function jQ(X,W){try{let Z=Z8[W.method],K=await Z(W.params);N0(X,{type:"runtime_rpc_result",requestId:W.requestId,ok:!0,result:K})}catch(Z){N0(X,{type:"runtime_rpc_result",requestId:W.requestId,ok:!1,error:Z instanceof Error?Z.message:String(Z)})}}var C1=!1,f1=null;async function a2(){if(C1)return;if(f1)return f1;return f1=(async()=>{try{let X=await X8(O1);t2({...X,requestedPort:X.port}),console.log(`[ideawave-cli] MCP endpoint for the agent: ${X.url}`);try{await P6({onStatusChange:(W)=>{if(I6(),I0?.sendStatus(),W.status==="failed")console.warn(`[ideawave-cli] ACP bridge setup failed for ${W.packageName}: ${W.error??"unknown error"}`)}})}catch(W){console.warn("[ideawave-cli] ACP bridge setup skipped:",W instanceof Error?W.message:String(W))}await Q8(),C1=!0,console.log("[ideawave-cli] ready — agent runs will drive the board."),I0?.sendStatus()}catch(X){console.error("[ideawave-cli] failed to start agent host:",X),I0?.sendStatus(void 0,X instanceof Error?X.message:String(X))}finally{f1=null}})(),f1}if(process.env.APP_ENV!=="development"){let X=await l3();if(X)console.error(`[ideawave-cli] An IdeaWave CLI is already running at ${X}.`),console.error("[ideawave-cli] Only one CLI per machine is supported — it already serves every browser tab. Exiting."),process.exit(0)}if(YQ)C3().then((X)=>{if(X.phase==="ready")console.log("[ideawave-cli] screenshot engine ready");else if(X.phase==="failed")console.warn(`[ideawave-cli] screenshot engine setup failed: ${X.error??"unknown error"}`)});I0=await T3({registry:O1,runtime:null,mcpReady:()=>C1,capabilities:R1?[e2,X6,W6]:[],cliVersion:J8(),browserRuntimeStatus:()=>zQ,onToolMetadata:(X)=>{console.log(`[ideawave-cli] session ${X} advertised ${O1.getMetadata(X).length} tools`),a2()},onRunTurn:(X,W)=>{console.log(`[ideawave-cli] running agent turn for card ${W.cardId} (session ${X})`),(async()=>{if(await a2(),!C1){N0(X,{type:"run_settled",runId:W.runId,cardId:W.cardId,result:{assistantContent:"",model:null,latencyMs:0,errorText:"IdeaWave CLI agent host is not ready",partialText:null}});return}await v3(W,(Z)=>N0(X,Z))})().catch(()=>{return}).finally(()=>O1.markRunSettled(X,W.runId))},onCancelRun:(X,W)=>{h2(W)},onRuntimeRpc:(X,W)=>{jQ(X,W)},onBrowserRpc:(X,W,Z)=>{if(!R1){N0(X,{type:"browser_rpc_result",requestId:Z.requestId,ok:!1,error:"The development browser-kit proxy is not enabled"});return}n0.handleRpc(X,W,Z).then((K)=>{N0(X,{type:"browser_rpc_result",requestId:Z.requestId,ok:!0,result:K})},(K)=>{N0(X,{type:"browser_rpc_result",requestId:Z.requestId,ok:!1,error:K instanceof Error?K.message:String(K)})})},onHttpRequest:(X,W)=>R1?n0.handleHttpRequest(X,W):!1,onHttpUpgrade:(X,W,Z)=>R1?n0.handleUpgrade(X,W,Z):!1,onWarmupRun:(X,W,Z)=>{(async()=>{if(await a2(),!C1)return{status:"retryable",error:"agent host is not ready"};return b3({cardId:W.cardId,boardId:W.boardId,userId:Z,frontendSessionId:X})})().then((K)=>{if(!W.warmupId)return;N0(X,{type:"warmup_result",warmupId:W.warmupId,cardId:W.cardId,...K})})},onDisconnect:(X,W)=>{n0.closeFrontendSession(X),B3(X);for(let Z of W)h2(Z);G("bridge.frontend_disconnected",{frontendSessionId:X,activeRuns:W.length}),r2(X).catch((Z)=>{console.warn(`[ideawave-cli] failed to evict sessions for ${X}:`,Z instanceof Error?Z.message:String(Z))}),console.log(`[ideawave-cli] browser session ${X} disconnected`)}});n0.setPort(I0.port);console.log(`[ideawave-cli] browser bridge listening on ${I0.url}`);console.log("[ideawave-cli] waiting for ideawave.app browser sessions…");var K8=!1;for(let X of["SIGINT","SIGTERM"])process.once(X,()=>{if(K8)return;K8=!0,L3(),(async()=>{await n0.close(),await M3(),await I0?.close().catch(()=>{return}),process.exit(0)})()});
package/package.json CHANGED
@@ -1,6 +1,6 @@
1
1
  {
2
2
  "name": "ideawave",
3
- "version": "0.0.78",
3
+ "version": "0.0.79",
4
4
  "description": "IdeaWave CLI",
5
5
  "type": "module",
6
6
  "bin": {