ideawave 0.0.92 → 0.0.93
This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
- package/dist/index.mjs +2 -2
- package/package.json +1 -1
package/dist/index.mjs
CHANGED
|
@@ -1060,7 +1060,7 @@ ${K}`:null].filter(Boolean).join(`
|
|
|
1060
1060
|
|
|
1061
1061
|
${Z}`)}function CX(X){if(!Array.isArray(X))return null;let Z=X.flatMap((W)=>{if(!W||typeof W!=="object")return[];let J=W;if(typeof J.path!=="string"||!J.path.trim())return[];let K=typeof J.line==="number"?`:${J.line}`:"";return[`${J.path}${K}`]});return Z.length>0?Z.slice(0,5):null}function W4(X){let{ctx:Z,appendText:W,appendToolActivity:J}=X,K=X.flushIntervalMs??h7,V="",H="",U=0,F=null,w=!1,q={},y=new Map,O=(h)=>{if(y.set(h.toolCallId,h),!J)return;J({boardId:Z.boardId,cardId:Z.cardId,runId:Z.runId,entry:h}).catch((x)=>{console.warn("[streamAdapter] appendToolActivity failed",x)})},b=(h)=>{let x=`${Z.runId}:thought`,$=y.get(x);if(!$||$.status!=="running")return;O({...$,status:"completed",completedAt:$.completedAt??h})},v=(h)=>{for(let x of y.values()){if(x.status!=="running"||x.rawTitle.toLowerCase()!=="toolsearch")continue;O({...x,status:"completed",completedAt:x.completedAt??h})}},f=(h)=>{for(let x of Array.from(y.values())){if(x.status!=="running")continue;if(x.kind==="thought"||x.rawTitle==="agent_thought")continue;O({...x,status:"completed",completedAt:x.completedAt??h})}},C="",N=0,g=null,M=null,G=(h)=>{if(h===C)return;C=h,N=Date.now(),W({boardId:Z.boardId,cardId:Z.cardId,runId:Z.runId,text:h}).catch((x)=>{console.warn("[streamAdapter] appendText failed",x)})},I=()=>{if(g!==null)clearTimeout(g),g=null;if(M!==null){let h=M;M=null,G(h)}},m=(h)=>{let x=Date.now()-N;if(x>=K&&g===null){G(h);return}if(M=h,g===null){let $=Math.max(0,K-x);g=setTimeout(()=>{g=null,I()},$)}};return{onSessionUpdate:async(h)=>{X.onAnyUpdate?.();let x=h.update;switch(q[x.sessionUpdate]=(q[x.sessionUpdate]??0)+1,x.sessionUpdate){case"agent_message_chunk":{let $=new Date().toISOString();if(b($),x.content.type==="text"){if(x.content.text.length>0){if(w&&V.length>0&&!/\s$/.test(V)&&!/^\s/.test(x.content.text))V+=`
|
|
1062
1062
|
|
|
1063
|
-
`;V+=x.content.text,w=!1,m(V)}}else{let T=`agent_message_chunk:${x.content.type}`;q[T]=(q[T]??0)+1}return}case"agent_thought_chunk":{if(x.content.type!=="text")return;H+=x.content.text;let $=new Date().toISOString(),T=`${Z.runId}:thought`,i=y.get(T);O({toolCallId:T,rawTitle:"agent_thought",title:"Thought",kind:"thought",status:"running",startedAt:i?.startedAt??$,completedAt:null,contentPreview:E0(H.trim())});return}case"user_message_chunk":return;case"tool_call":{U+=1,w=V.length>0;let $=e6(x.title),T=yX(x.status),i=new Date().toISOString();b(i),v(i),O({toolCallId:x.toolCallId,rawTitle:$,title:OX($,x.rawInput),kind:RX(x.kind),status:T,startedAt:i,completedAt:T==="running"?null:i,inputPreview:x0(x.rawInput),outputPreview:fX(x.rawOutput),contentPreview:H2(x.content),locations:CX(x.locations)});return}case"tool_call_update":{let $=y.get(x.toolCallId);if(!$){let Z0=e6(x.title),W0=yX(x.status),h1=new Date().toISOString();O({toolCallId:x.toolCallId,rawTitle:Z0,title:OX(Z0,x.rawInput),kind:RX(x.kind),status:W0,startedAt:h1,completedAt:W0==="running"?null:h1,inputPreview:x0(x.rawInput),outputPreview:fX(x.rawOutput),contentPreview:H2(x.content),locations:CX(x.locations)});return}let T=x.status===void 0||x.status===null?$.status:yX(x.status),i=typeof x.title==="string"&&x.title.trim().length>0?x.title:$.rawTitle,S0=typeof x.title==="string"&&x.title.trim().length>0,_=T==="running"?$.completedAt:$.completedAt??new Date().toISOString(),s=x.content===void 0?$.contentPreview:Z4($.contentPreview,H2(x.content)),A=x.rawOutput===void 0?$.outputPreview:Z4($.outputPreview,fX(x.rawOutput));O({...$,rawTitle:i,title:S0?OX(i,x.rawInput):$.title,kind:x.kind===void 0?$.kind:RX(x.kind),status:T,completedAt:_,inputPreview:x.rawInput===void 0?$.inputPreview:x0(x.rawInput),outputPreview:A,contentPreview:s,locations:x.locations===void 0?$.locations:CX(x.locations)});return}case"plan":F=x.entries;return;case"available_commands_update":return;case"current_mode_update":return;default:return}},getFinalText:()=>V,getToolCallCount:()=>U,getLatestPlan:()=>F,getUpdateTypeCounts:()=>({...q}),flush:(h)=>{let x=new Date().toISOString();if(b(x),h?.completeOpenToolCalls)f(x);I()}}}var M7=new Set(["ECONNRESET","EPIPE"]);function U2(X){if(!X||typeof X!=="object")return!1;if(X instanceof Error&&X.message==="ACP connection closed")return!0;let Z="code"in X?X.code:void 0;return typeof Z==="string"&&M7.has(Z)}var P1=1,Q4=-32000;function J4(X){if(X.awaitingInput)return!1;return X.nowMs-X.lastUpdateMs>=X.windowMs}function Y4(X){if(!X||typeof X!=="object")return!1;return X.code===Q4}var $7=300000,G7=$7,m7=5000;function E7(X){let Z=Math.max(1,Math.round(X/1000));return`Runtime has not responded for ${Z} ${Z===1?"second":"seconds"}. Retry the agent run.`}function z4(){return{name:"ideawave-cli",title:"IdeaWave CLI",version:"0.0.92".trim()?"0.0.92":"dev"}}function j4(X){if(X===P1)return;throw new S(`Unsupported ACP protocol version ${X}; expected ${P1}`)}function H4(X){return g7.toWeb(X)}function w4(X){return D7.toWeb(X)}function hX(X){return X!==null&&typeof X==="object"}function k7(X){if(!Array.isArray(X))return[];let Z=[];for(let W of X){if(!hX(W))continue;if(typeof W.group==="string"&&Array.isArray(W.options)){let J=typeof W.name==="string"?W.name:W.group;for(let K of W.options){if(!hX(K))continue;if(typeof K.value!=="string"||typeof K.name!=="string")continue;Z.push({value:K.value,name:K.name,description:typeof K.description==="string"?K.description:null,group:W.group,groupName:J})}continue}if(typeof W.value!=="string"||typeof W.name!=="string")continue;Z.push({value:W.value,name:W.name,description:typeof W.description==="string"?W.description:null,group:null,groupName:null})}return Z}function _7(X){if(!hX(X))return null;if(typeof X.id!=="string"||typeof X.name!=="string")return null;let Z=typeof X.category==="string"?X.category:null,W=typeof X.description==="string"?X.description:null;if(X.type==="select"){let J=typeof X.currentValue==="string"?X.currentValue:null;return{id:X.id,name:X.name,category:Z,description:W,type:"select",currentValue:J,options:k7(X.options)}}if(X.type==="boolean"){let J=typeof X.currentValue==="boolean"?X.currentValue:typeof X.value==="boolean"?X.value:null;return{id:X.id,name:X.name,category:Z,description:W,type:"boolean",currentValue:J,options:[]}}return null}function NX(X){let Z=(X.configOptions??[]).map(_7).filter((U)=>U!==null),W=Z.find((U)=>U.type==="select"&&U.category==="model")??Z.find((U)=>U.type==="select"&&U.id==="model")??null,J=W?.options.map((U)=>({id:U.value,name:U.name,description:U.description??null})),K=I7(X.models),V=J&&J.length>0?J:K&&K.length>0?K:null,H=(typeof W?.currentValue==="string"?W.currentValue:null)??S7(X.models)??null;return{models:V,currentModelId:H,configOptions:Z,modelConfigId:W?.id??null}}function I7(X){if(!X||!Array.isArray(X.availableModels))return null;let Z=[];for(let W of X.availableModels){if(typeof W.modelId!=="string")continue;Z.push({id:W.modelId,name:typeof W.name==="string"?W.name:null,description:typeof W.description==="string"?W.description:null})}return Z.length>0?Z:null}function S7(X){return typeof X?.currentModelId==="string"?X.currentModelId:null}function u7(X,Z){let W=[];if(X.trim())W.push({type:"text",text:X});for(let J of Z)if(J.content.trim())W.push({type:"text",text:J.content});return W}var l7=500;function U4(X){return new Promise((Z)=>{let W=setTimeout(()=>Z({code:null,signal:null,stderr:""}),l7);X.then((J)=>{clearTimeout(W),Z(J)})})}function A7(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 T7(X,Z){let W=NX({configOptions:Z.configOptions});return{models:W.models??X.models,currentModelId:W.currentModelId??X.currentModelId,configOptions:W.configOptions,modelConfigId:W.modelConfigId??X.modelConfigId}}function F4(X,Z){if(X==="default")return null;if(!Z||Z.length===0)return X;let W=Z.find((w)=>w.id===X);if(W)return W.id;let J=X.toLowerCase(),K=J.includes("opus")?"opus":J.includes("sonnet")?"sonnet":J.includes("haiku")?"haiku":null;if(!K)return X;let V=(w)=>`${w.id} ${w.name??""} ${w.description??""}`.toLowerCase(),H=Z.filter((w)=>V(w).includes(K));if(H.length===0)return X;let F=(J.includes("1m")?H.find((w)=>V(w).includes("1m")):void 0)??H[0];return F?F.id:X}async function F2(X){try{let Z=await X.conn.setSessionConfigOption(A7({sessionId:X.sessionId,configId:X.configId,value:X.value}));return T7(X.metadata,Z)}catch(Z){return console.warn(`[acp] setSessionConfigOption(${X.label}) failed; using agent default.`,Z instanceof Error?Z.message:Z),X.metadata}}async function MX(X){let Z=bX(X.spawn),W=[],J=0,K=4096;Z.stderr.on("data",(_)=>{W.push(_),J+=_.length;while(J>K*2&&W.length>1){let s=W.shift();if(s)J-=s.length}});let V=()=>{let _=Buffer.concat(W).toString("utf8");return _.length>K?_.slice(-K):_},H=t6(X.spawn.cwd),U={current:null},F={current:null},w={at:Date.now()},q=null,y=w4(Z.stdin),O=H4(Z.stdout),b=V4(y,O),f=new K4((_)=>({requestPermission:async(s)=>{let A=s.options,Z0=A?.find((W0)=>W0.kind==="allow_once")??A?.find((W0)=>W0.kind==="allow_always");if(Z0)return{outcome:{outcome:"selected",optionId:Z0.optionId}};return{outcome:{outcome:"cancelled"}}},sessionUpdate:async(s)=>{w.at=Date.now();let A=F.current;if(A){let W0=s.update.sessionUpdate;if(A.updateCount+=1,A.updateCount===1||A.lastUpdateType!==W0||W0==="tool_call"||W0==="tool_call_update")E("acp.session_update",{runId:A.runId,cardId:A.cardId,sessionId:q,updateType:W0,updateCount:A.updateCount,elapsedMs:Date.now()-A.startedAt});A.lastUpdateType=W0}let Z0=U.current;if(Z0)await Z0.onSessionUpdate(s)},readTextFile:H.readTextFile}),b),C=()=>Z.kill();if(X.signal)X.signal.addEventListener("abort",C);let N=()=>{if(X.signal)X.signal.removeEventListener("abort",C)},g=async(_,s)=>{if(N(),Z.kill(),Y4(_))throw new l0(_.message??"Authentication required",s);if(U2(_)){if(X.signal?.aborted)throw new S("ACP session cancelled: abort signal received");let A=await U4(Z.waitForExit);throw new S(`Runtime process exited before completion: ${A.stderr?.trim()??""}`)}throw _},M;try{M=await f.initialize({protocolVersion:P1,clientCapabilities:xX,clientInfo:z4()})}catch(_){throw await g(_,[]),Error("unreachable")}try{j4(M.protocolVersion)}catch(_){throw N(),Z.kill(),_}let G=M.authMethods?.map((_)=>_.id)??[],I;try{I=await f.newSession({cwd:X.spawn.cwd,mcpServers:X.mcpServers??[],...X.isolateAmbientToolSources?{_meta:{claudeCode:{options:{settingSources:[]}}}}:{}})}catch(_){throw await g(_,G),Error("unreachable")}let m=I.sessionId;q=m;let h=NX(I),x=X.modelId??null,$=x?F4(x,h.models):null;if($&&$!==h.currentModelId)if(h.modelConfigId)h=await F2({conn:f,sessionId:m,configId:h.modelConfigId,value:$,metadata:h,label:`${h.modelConfigId}=${$}`});else console.warn(`[acp] runtime did not advertise a model config option for ${$}; using agent default.`);for(let[_,s]of Object.entries(X.configValues??{}).sort(([A],[Z0])=>A.localeCompare(Z0))){if(_===h.modelConfigId)continue;if(!h.configOptions.some((A)=>A.id===_))continue;h=await F2({conn:f,sessionId:m,configId:_,value:s,metadata:h,label:`${_}=${String(s)}`})}N();let T=!1,i=async()=>{if(T)return;T=!0,Z.kill(),await Promise.race([Z.waitForExit,new Promise((_)=>setTimeout(_,2000))])},S0=!1;return Z.processCrashed.then(()=>{S0=!0}),{sessionId:m,availableModels:h.models,currentModelId:h.currentModelId,availableConfigOptions:h.configOptions,isAlive:()=>!T&&!S0,dispose:i,prompt:(_)=>c7({proc:Z,conn:f,sessionId:m,activeAdapter:U,activeTrace:F,lastUpdate:w,collectStderrTail:V},_)}}async function c7(X,Z){let{proc:W,conn:J,sessionId:K,activeAdapter:V,activeTrace:H,lastUpdate:U}=X,F=Date.now(),w=Z.heartbeatMs??G7,q=E7(w),y={boardId:Z.boardId,cardId:Z.cardId,runId:Z.runId},O=W4({ctx:y,appendText:Z.appendText,appendToolActivity:Z.appendToolActivity,onAnyUpdate:Z.onAnyUpdate});V.current=O,H.current={runId:Z.runId,cardId:Z.cardId,startedAt:F,updateCount:0,lastUpdateType:null},U.at=Date.now(),E("acp.prompt_started",{runId:Z.runId,cardId:Z.cardId,sessionId:K,heartbeatWindowMs:w});let b=!1,v=null,f=()=>W.kill();Z.signal.addEventListener("abort",f);try{let C=async()=>{let G=Math.min(m7,Math.max(50,Math.floor(w/2)));v=setInterval(()=>{let m=Z.isAwaitingInput?.()??!1;if(m){U.at=Date.now();return}if(J4({nowMs:Date.now(),lastUpdateMs:U.at,windowMs:w,awaitingInput:m}))b=!0,E("acp.inactivity_timeout",{runId:Z.runId,cardId:Z.cardId,sessionId:K,windowMs:w,silentForMs:Date.now()-U.at}),J.cancel({sessionId:K}).catch(()=>{return}),W.kill()},G);let I=u7(Z.prompt.systemPrompt,Z.prompt.messages);await J.prompt({sessionId:K,prompt:I}),E("acp.prompt_resolved",{runId:Z.runId,cardId:Z.cardId,sessionId:K,elapsedMs:Date.now()-F}),O.flush({completeOpenToolCalls:!0})},N=W.waitForExit.then((G)=>({kind:"exited",exit:G})),g=C().then(()=>({kind:"ok"})).catch(async(G)=>{if(U2(G))return W.kill(),{kind:"crashed",exit:await U4(W.waitForExit)};throw G}),M;try{M=await Promise.race([g,W.processCrashed.then((G)=>({kind:"crashed",exit:G})),N])}catch(G){if(b)throw new w0(q);throw G}if(b)throw new w0(q);if(M.kind!=="ok"&&Z.signal.aborted)throw new S("ACP session cancelled: abort signal received");if(M.kind==="crashed")throw new S(`Runtime process exited before completion: ${M.exit.stderr.trim()}`);if(M.kind==="exited"){if(b)throw new w0(q);throw new S(`Runtime process exited unexpectedly: ${M.exit.stderr.trim()}`)}return{modelReported:"unknown",finalText:O.getFinalText(),toolCallsExecuted:O.getToolCallCount(),stderrTail:X.collectStderrTail(),updateTypeCounts:O.getUpdateTypeCounts()}}finally{if(E("acp.prompt_finished",{runId:Z.runId,cardId:Z.cardId,sessionId:K,elapsedMs:Date.now()-F,timedOut:b,updateCount:H.current?.updateCount??0}),v!==null)clearInterval(v);Z.signal.removeEventListener("abort",f),O.flush({completeOpenToolCalls:!0}),V.current=null,H.current=null}}var a7=30000;async function B4(X){let Z=bX(X.spawn),W=w4(Z.stdin),J=H4(Z.stdout),K=V4(W,J),H=new K4((w)=>({requestPermission:async()=>({outcome:{outcome:"cancelled"}}),sessionUpdate:async()=>{return},readTextFile:async()=>({content:""})}),K),U=()=>Z.kill();if(X.signal)X.signal.addEventListener("abort",U);let F=null;try{let w=(async()=>{let y=await H.initialize({protocolVersion:P1,clientCapabilities:xX,clientInfo:z4()});j4(y.protocolVersion);let O=y.authMethods?.map((M)=>M.id)??[],b;try{b=await H.newSession({cwd:X.spawn.cwd,mcpServers:[]})}catch(M){if(Y4(M))throw new l0(M.message??"Authentication required",O);throw M}let v=NX(b),f=X.modelId??null,C=f?F4(f,v.models):null;if(C&&C!==v.currentModelId)if(v.modelConfigId)v=await F2({conn:H,sessionId:b.sessionId,configId:v.modelConfigId,value:C,metadata:v,label:`${v.modelConfigId}=${C}`});else console.warn(`[acp] runtime did not advertise a model config option for ${C}; discovering agent default models.`);for(let[M,G]of Object.entries(X.configValues??{}).sort(([I],[m])=>I.localeCompare(m))){if(M===v.modelConfigId)continue;if(!v.configOptions.some((I)=>I.id===M))continue;v=await F2({conn:H,sessionId:b.sessionId,configId:M,value:G,metadata:v,label:`${M}=${String(G)}`})}let N=v.models??[],g=v.currentModelId;return H.cancel({sessionId:b.sessionId}).catch(()=>{return}),{models:N,configOptions:v.configOptions,currentModelId:g}})(),q=new Promise((y,O)=>{F=setTimeout(()=>{O(new w0)},a7)});return await Promise.race([w,q])}catch(w){if(U2(w)){if(X.signal?.aborted)throw new S("ACP model discovery cancelled: abort signal received");throw new S("Runtime process exited during model discovery.")}throw w}finally{if(F)clearTimeout(F);if(X.signal)X.signal.removeEventListener("abort",U);Z.kill()}}import d7 from"node:fs/promises";import B2 from"node:os";async function q4(X){let Z={version:1,globalDefaultConfigId:null,runtimes:[],boardOverrides:{},cardOverrides:{}},W;try{W=await d7.readFile(X,"utf-8")}catch(J){if(J.code==="ENOENT")return structuredClone(Z);throw J}return $1.parse(JSON.parse(W))}function gX(X,Z,W){return{...X.defaultConfigValues??{},...Z?.configValues??{},...W?.configValues??{}}}async function O0(X){let Z=X.configPath?await q4(X.configPath):await J0(),W=X.cardId?Z.cardOverrides[X.cardId]:void 0;if(W?.runtimeConfigId){let K=Z.runtimes.find((V)=>V.id===W.runtimeConfigId);if(K)return{entry:K,adapter:U0(K),runFolder:W.runFolder??K.runFolder??B2.homedir(),modelId:W.modelId??K.defaultModelId??null,configValues:gX(K,void 0,W)}}let J=Z.boardOverrides[X.boardId];if(J?.runtimeConfigId){let K=Z.runtimes.find((V)=>V.id===J.runtimeConfigId);if(K)return{entry:K,adapter:U0(K),runFolder:J.runFolder??K.runFolder??B2.homedir(),modelId:J.modelId??K.defaultModelId??null,configValues:gX(K,J)}}if(Z.globalDefaultConfigId){let K=Z.runtimes.find((V)=>V.id===Z.globalDefaultConfigId);if(K)return{entry:K,adapter:U0(K),runFolder:W?.runFolder??J?.runFolder??K.runFolder??B2.homedir(),modelId:W?.modelId??J?.modelId??K.defaultModelId??null,configValues:gX(K,J,W)}}throw new g0}async function L4(X,Z={}){let J=(Z.configPath?await q4(Z.configPath):await J0()).runtimes.find((K)=>K.id===X);if(!J)return null;return{entry:J,adapter:U0(J),runFolder:J.runFolder??B2.homedir(),modelId:Z.modelId??J.defaultModelId??null,configValues:{...J.defaultConfigValues??{},...Z.configValues??{}}}}var P4=new Map;function DX(X,Z){if(!X)return;P4.set(X,Z)}function x4(X){if(!X)return!1;return P4.get(X)??!1}var k0=new Map,$X=new Set;function GX(X){k0.get(X)?.controller.abort()}function b4(X){for(let[Z,W]of k0){if(W.frontendSessionId!==X)continue;W.controller.abort(),k0.delete(Z)}}function v4(){for(let X of k0.values())X.controller.abort();k0.clear()}function y4(X,Z){if(Z?.aborted)return!0;return X instanceof Error&&/abort signal received|session cancelled/i.test(X.message)}function R4(X,Z,W,J){if((!Z.availableModels||Z.availableModels.length===0)&&Z.availableConfigOptions.length===0)return;z0((K)=>{let V=K.runtimes.find((H)=>H.id===X);if(V){if(Z.availableModels&&Z.availableModels.length>0)V.discoveredModels=V2({adapterId:W,models:Z.availableModels,currentModelId:Z.currentModelId??J});if(Z.availableConfigOptions.length>0)V.discoveredConfigOptions=Z.availableConfigOptions}}).catch(()=>{return})}function i7(X,Z){return`${X}
|
|
1063
|
+
`;V+=x.content.text,w=!1,m(V)}}else{let T=`agent_message_chunk:${x.content.type}`;q[T]=(q[T]??0)+1}return}case"agent_thought_chunk":{if(x.content.type!=="text")return;H+=x.content.text;let $=new Date().toISOString(),T=`${Z.runId}:thought`,i=y.get(T);O({toolCallId:T,rawTitle:"agent_thought",title:"Thought",kind:"thought",status:"running",startedAt:i?.startedAt??$,completedAt:null,contentPreview:E0(H.trim())});return}case"user_message_chunk":return;case"tool_call":{U+=1,w=V.length>0;let $=e6(x.title),T=yX(x.status),i=new Date().toISOString();b(i),v(i),O({toolCallId:x.toolCallId,rawTitle:$,title:OX($,x.rawInput),kind:RX(x.kind),status:T,startedAt:i,completedAt:T==="running"?null:i,inputPreview:x0(x.rawInput),outputPreview:fX(x.rawOutput),contentPreview:H2(x.content),locations:CX(x.locations)});return}case"tool_call_update":{let $=y.get(x.toolCallId);if(!$){let Z0=e6(x.title),W0=yX(x.status),h1=new Date().toISOString();O({toolCallId:x.toolCallId,rawTitle:Z0,title:OX(Z0,x.rawInput),kind:RX(x.kind),status:W0,startedAt:h1,completedAt:W0==="running"?null:h1,inputPreview:x0(x.rawInput),outputPreview:fX(x.rawOutput),contentPreview:H2(x.content),locations:CX(x.locations)});return}let T=x.status===void 0||x.status===null?$.status:yX(x.status),i=typeof x.title==="string"&&x.title.trim().length>0?x.title:$.rawTitle,S0=typeof x.title==="string"&&x.title.trim().length>0,_=T==="running"?$.completedAt:$.completedAt??new Date().toISOString(),s=x.content===void 0?$.contentPreview:Z4($.contentPreview,H2(x.content)),A=x.rawOutput===void 0?$.outputPreview:Z4($.outputPreview,fX(x.rawOutput));O({...$,rawTitle:i,title:S0?OX(i,x.rawInput):$.title,kind:x.kind===void 0?$.kind:RX(x.kind),status:T,completedAt:_,inputPreview:x.rawInput===void 0?$.inputPreview:x0(x.rawInput),outputPreview:A,contentPreview:s,locations:x.locations===void 0?$.locations:CX(x.locations)});return}case"plan":F=x.entries;return;case"available_commands_update":return;case"current_mode_update":return;default:return}},getFinalText:()=>V,getToolCallCount:()=>U,getLatestPlan:()=>F,getUpdateTypeCounts:()=>({...q}),flush:(h)=>{let x=new Date().toISOString();if(b(x),h?.completeOpenToolCalls)f(x);I()}}}var M7=new Set(["ECONNRESET","EPIPE"]);function U2(X){if(!X||typeof X!=="object")return!1;if(X instanceof Error&&X.message==="ACP connection closed")return!0;let Z="code"in X?X.code:void 0;return typeof Z==="string"&&M7.has(Z)}var P1=1,Q4=-32000;function J4(X){if(X.awaitingInput)return!1;return X.nowMs-X.lastUpdateMs>=X.windowMs}function Y4(X){if(!X||typeof X!=="object")return!1;return X.code===Q4}var $7=300000,G7=$7,m7=5000;function E7(X){let Z=Math.max(1,Math.round(X/1000));return`Runtime has not responded for ${Z} ${Z===1?"second":"seconds"}. Retry the agent run.`}function z4(){return{name:"ideawave-cli",title:"IdeaWave CLI",version:"0.0.93".trim()?"0.0.93":"dev"}}function j4(X){if(X===P1)return;throw new S(`Unsupported ACP protocol version ${X}; expected ${P1}`)}function H4(X){return g7.toWeb(X)}function w4(X){return D7.toWeb(X)}function hX(X){return X!==null&&typeof X==="object"}function k7(X){if(!Array.isArray(X))return[];let Z=[];for(let W of X){if(!hX(W))continue;if(typeof W.group==="string"&&Array.isArray(W.options)){let J=typeof W.name==="string"?W.name:W.group;for(let K of W.options){if(!hX(K))continue;if(typeof K.value!=="string"||typeof K.name!=="string")continue;Z.push({value:K.value,name:K.name,description:typeof K.description==="string"?K.description:null,group:W.group,groupName:J})}continue}if(typeof W.value!=="string"||typeof W.name!=="string")continue;Z.push({value:W.value,name:W.name,description:typeof W.description==="string"?W.description:null,group:null,groupName:null})}return Z}function _7(X){if(!hX(X))return null;if(typeof X.id!=="string"||typeof X.name!=="string")return null;let Z=typeof X.category==="string"?X.category:null,W=typeof X.description==="string"?X.description:null;if(X.type==="select"){let J=typeof X.currentValue==="string"?X.currentValue:null;return{id:X.id,name:X.name,category:Z,description:W,type:"select",currentValue:J,options:k7(X.options)}}if(X.type==="boolean"){let J=typeof X.currentValue==="boolean"?X.currentValue:typeof X.value==="boolean"?X.value:null;return{id:X.id,name:X.name,category:Z,description:W,type:"boolean",currentValue:J,options:[]}}return null}function NX(X){let Z=(X.configOptions??[]).map(_7).filter((U)=>U!==null),W=Z.find((U)=>U.type==="select"&&U.category==="model")??Z.find((U)=>U.type==="select"&&U.id==="model")??null,J=W?.options.map((U)=>({id:U.value,name:U.name,description:U.description??null})),K=I7(X.models),V=J&&J.length>0?J:K&&K.length>0?K:null,H=(typeof W?.currentValue==="string"?W.currentValue:null)??S7(X.models)??null;return{models:V,currentModelId:H,configOptions:Z,modelConfigId:W?.id??null}}function I7(X){if(!X||!Array.isArray(X.availableModels))return null;let Z=[];for(let W of X.availableModels){if(typeof W.modelId!=="string")continue;Z.push({id:W.modelId,name:typeof W.name==="string"?W.name:null,description:typeof W.description==="string"?W.description:null})}return Z.length>0?Z:null}function S7(X){return typeof X?.currentModelId==="string"?X.currentModelId:null}function u7(X,Z){let W=[];if(X.trim())W.push({type:"text",text:X});for(let J of Z)if(J.content.trim())W.push({type:"text",text:J.content});return W}var l7=500;function U4(X){return new Promise((Z)=>{let W=setTimeout(()=>Z({code:null,signal:null,stderr:""}),l7);X.then((J)=>{clearTimeout(W),Z(J)})})}function A7(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 T7(X,Z){let W=NX({configOptions:Z.configOptions});return{models:W.models??X.models,currentModelId:W.currentModelId??X.currentModelId,configOptions:W.configOptions,modelConfigId:W.modelConfigId??X.modelConfigId}}function F4(X,Z){if(X==="default")return null;if(!Z||Z.length===0)return X;let W=Z.find((w)=>w.id===X);if(W)return W.id;let J=X.toLowerCase(),K=J.includes("opus")?"opus":J.includes("sonnet")?"sonnet":J.includes("haiku")?"haiku":null;if(!K)return X;let V=(w)=>`${w.id} ${w.name??""} ${w.description??""}`.toLowerCase(),H=Z.filter((w)=>V(w).includes(K));if(H.length===0)return X;let F=(J.includes("1m")?H.find((w)=>V(w).includes("1m")):void 0)??H[0];return F?F.id:X}async function F2(X){try{let Z=await X.conn.setSessionConfigOption(A7({sessionId:X.sessionId,configId:X.configId,value:X.value}));return T7(X.metadata,Z)}catch(Z){return console.warn(`[acp] setSessionConfigOption(${X.label}) failed; using agent default.`,Z instanceof Error?Z.message:Z),X.metadata}}async function MX(X){let Z=bX(X.spawn),W=[],J=0,K=4096;Z.stderr.on("data",(_)=>{W.push(_),J+=_.length;while(J>K*2&&W.length>1){let s=W.shift();if(s)J-=s.length}});let V=()=>{let _=Buffer.concat(W).toString("utf8");return _.length>K?_.slice(-K):_},H=t6(X.spawn.cwd),U={current:null},F={current:null},w={at:Date.now()},q=null,y=w4(Z.stdin),O=H4(Z.stdout),b=V4(y,O),f=new K4((_)=>({requestPermission:async(s)=>{let A=s.options,Z0=A?.find((W0)=>W0.kind==="allow_once")??A?.find((W0)=>W0.kind==="allow_always");if(Z0)return{outcome:{outcome:"selected",optionId:Z0.optionId}};return{outcome:{outcome:"cancelled"}}},sessionUpdate:async(s)=>{w.at=Date.now();let A=F.current;if(A){let W0=s.update.sessionUpdate;if(A.updateCount+=1,A.updateCount===1||A.lastUpdateType!==W0||W0==="tool_call"||W0==="tool_call_update")E("acp.session_update",{runId:A.runId,cardId:A.cardId,sessionId:q,updateType:W0,updateCount:A.updateCount,elapsedMs:Date.now()-A.startedAt});A.lastUpdateType=W0}let Z0=U.current;if(Z0)await Z0.onSessionUpdate(s)},readTextFile:H.readTextFile}),b),C=()=>Z.kill();if(X.signal)X.signal.addEventListener("abort",C);let N=()=>{if(X.signal)X.signal.removeEventListener("abort",C)},g=async(_,s)=>{if(N(),Z.kill(),Y4(_))throw new l0(_.message??"Authentication required",s);if(U2(_)){if(X.signal?.aborted)throw new S("ACP session cancelled: abort signal received");let A=await U4(Z.waitForExit);throw new S(`Runtime process exited before completion: ${A.stderr?.trim()??""}`)}throw _},M;try{M=await f.initialize({protocolVersion:P1,clientCapabilities:xX,clientInfo:z4()})}catch(_){throw await g(_,[]),Error("unreachable")}try{j4(M.protocolVersion)}catch(_){throw N(),Z.kill(),_}let G=M.authMethods?.map((_)=>_.id)??[],I;try{I=await f.newSession({cwd:X.spawn.cwd,mcpServers:X.mcpServers??[],...X.isolateAmbientToolSources?{_meta:{claudeCode:{options:{settingSources:[]}}}}:{}})}catch(_){throw await g(_,G),Error("unreachable")}let m=I.sessionId;q=m;let h=NX(I),x=X.modelId??null,$=x?F4(x,h.models):null;if($&&$!==h.currentModelId)if(h.modelConfigId)h=await F2({conn:f,sessionId:m,configId:h.modelConfigId,value:$,metadata:h,label:`${h.modelConfigId}=${$}`});else console.warn(`[acp] runtime did not advertise a model config option for ${$}; using agent default.`);for(let[_,s]of Object.entries(X.configValues??{}).sort(([A],[Z0])=>A.localeCompare(Z0))){if(_===h.modelConfigId)continue;if(!h.configOptions.some((A)=>A.id===_))continue;h=await F2({conn:f,sessionId:m,configId:_,value:s,metadata:h,label:`${_}=${String(s)}`})}N();let T=!1,i=async()=>{if(T)return;T=!0,Z.kill(),await Promise.race([Z.waitForExit,new Promise((_)=>setTimeout(_,2000))])},S0=!1;return Z.processCrashed.then(()=>{S0=!0}),{sessionId:m,availableModels:h.models,currentModelId:h.currentModelId,availableConfigOptions:h.configOptions,isAlive:()=>!T&&!S0,dispose:i,prompt:(_)=>c7({proc:Z,conn:f,sessionId:m,activeAdapter:U,activeTrace:F,lastUpdate:w,collectStderrTail:V},_)}}async function c7(X,Z){let{proc:W,conn:J,sessionId:K,activeAdapter:V,activeTrace:H,lastUpdate:U}=X,F=Date.now(),w=Z.heartbeatMs??G7,q=E7(w),y={boardId:Z.boardId,cardId:Z.cardId,runId:Z.runId},O=W4({ctx:y,appendText:Z.appendText,appendToolActivity:Z.appendToolActivity,onAnyUpdate:Z.onAnyUpdate});V.current=O,H.current={runId:Z.runId,cardId:Z.cardId,startedAt:F,updateCount:0,lastUpdateType:null},U.at=Date.now(),E("acp.prompt_started",{runId:Z.runId,cardId:Z.cardId,sessionId:K,heartbeatWindowMs:w});let b=!1,v=null,f=()=>W.kill();Z.signal.addEventListener("abort",f);try{let C=async()=>{let G=Math.min(m7,Math.max(50,Math.floor(w/2)));v=setInterval(()=>{let m=Z.isAwaitingInput?.()??!1;if(m){U.at=Date.now();return}if(J4({nowMs:Date.now(),lastUpdateMs:U.at,windowMs:w,awaitingInput:m}))b=!0,E("acp.inactivity_timeout",{runId:Z.runId,cardId:Z.cardId,sessionId:K,windowMs:w,silentForMs:Date.now()-U.at}),J.cancel({sessionId:K}).catch(()=>{return}),W.kill()},G);let I=u7(Z.prompt.systemPrompt,Z.prompt.messages);await J.prompt({sessionId:K,prompt:I}),E("acp.prompt_resolved",{runId:Z.runId,cardId:Z.cardId,sessionId:K,elapsedMs:Date.now()-F}),O.flush({completeOpenToolCalls:!0})},N=W.waitForExit.then((G)=>({kind:"exited",exit:G})),g=C().then(()=>({kind:"ok"})).catch(async(G)=>{if(U2(G))return W.kill(),{kind:"crashed",exit:await U4(W.waitForExit)};throw G}),M;try{M=await Promise.race([g,W.processCrashed.then((G)=>({kind:"crashed",exit:G})),N])}catch(G){if(b)throw new w0(q);throw G}if(b)throw new w0(q);if(M.kind!=="ok"&&Z.signal.aborted)throw new S("ACP session cancelled: abort signal received");if(M.kind==="crashed")throw new S(`Runtime process exited before completion: ${M.exit.stderr.trim()}`);if(M.kind==="exited"){if(b)throw new w0(q);throw new S(`Runtime process exited unexpectedly: ${M.exit.stderr.trim()}`)}return{modelReported:"unknown",finalText:O.getFinalText(),toolCallsExecuted:O.getToolCallCount(),stderrTail:X.collectStderrTail(),updateTypeCounts:O.getUpdateTypeCounts()}}finally{if(E("acp.prompt_finished",{runId:Z.runId,cardId:Z.cardId,sessionId:K,elapsedMs:Date.now()-F,timedOut:b,updateCount:H.current?.updateCount??0}),v!==null)clearInterval(v);Z.signal.removeEventListener("abort",f),O.flush({completeOpenToolCalls:!0}),V.current=null,H.current=null}}var a7=30000;async function B4(X){let Z=bX(X.spawn),W=w4(Z.stdin),J=H4(Z.stdout),K=V4(W,J),H=new K4((w)=>({requestPermission:async()=>({outcome:{outcome:"cancelled"}}),sessionUpdate:async()=>{return},readTextFile:async()=>({content:""})}),K),U=()=>Z.kill();if(X.signal)X.signal.addEventListener("abort",U);let F=null;try{let w=(async()=>{let y=await H.initialize({protocolVersion:P1,clientCapabilities:xX,clientInfo:z4()});j4(y.protocolVersion);let O=y.authMethods?.map((M)=>M.id)??[],b;try{b=await H.newSession({cwd:X.spawn.cwd,mcpServers:[]})}catch(M){if(Y4(M))throw new l0(M.message??"Authentication required",O);throw M}let v=NX(b),f=X.modelId??null,C=f?F4(f,v.models):null;if(C&&C!==v.currentModelId)if(v.modelConfigId)v=await F2({conn:H,sessionId:b.sessionId,configId:v.modelConfigId,value:C,metadata:v,label:`${v.modelConfigId}=${C}`});else console.warn(`[acp] runtime did not advertise a model config option for ${C}; discovering agent default models.`);for(let[M,G]of Object.entries(X.configValues??{}).sort(([I],[m])=>I.localeCompare(m))){if(M===v.modelConfigId)continue;if(!v.configOptions.some((I)=>I.id===M))continue;v=await F2({conn:H,sessionId:b.sessionId,configId:M,value:G,metadata:v,label:`${M}=${String(G)}`})}let N=v.models??[],g=v.currentModelId;return H.cancel({sessionId:b.sessionId}).catch(()=>{return}),{models:N,configOptions:v.configOptions,currentModelId:g}})(),q=new Promise((y,O)=>{F=setTimeout(()=>{O(new w0)},a7)});return await Promise.race([w,q])}catch(w){if(U2(w)){if(X.signal?.aborted)throw new S("ACP model discovery cancelled: abort signal received");throw new S("Runtime process exited during model discovery.")}throw w}finally{if(F)clearTimeout(F);if(X.signal)X.signal.removeEventListener("abort",U);Z.kill()}}import d7 from"node:fs/promises";import B2 from"node:os";async function q4(X){let Z={version:1,globalDefaultConfigId:null,runtimes:[],boardOverrides:{},cardOverrides:{}},W;try{W=await d7.readFile(X,"utf-8")}catch(J){if(J.code==="ENOENT")return structuredClone(Z);throw J}return $1.parse(JSON.parse(W))}function gX(X,Z,W){return{...X.defaultConfigValues??{},...Z?.configValues??{},...W?.configValues??{}}}async function O0(X){let Z=X.configPath?await q4(X.configPath):await J0(),W=X.cardId?Z.cardOverrides[X.cardId]:void 0;if(W?.runtimeConfigId){let K=Z.runtimes.find((V)=>V.id===W.runtimeConfigId);if(K)return{entry:K,adapter:U0(K),runFolder:W.runFolder??K.runFolder??B2.homedir(),modelId:W.modelId??K.defaultModelId??null,configValues:gX(K,void 0,W)}}let J=Z.boardOverrides[X.boardId];if(J?.runtimeConfigId){let K=Z.runtimes.find((V)=>V.id===J.runtimeConfigId);if(K)return{entry:K,adapter:U0(K),runFolder:J.runFolder??K.runFolder??B2.homedir(),modelId:J.modelId??K.defaultModelId??null,configValues:gX(K,J)}}if(Z.globalDefaultConfigId){let K=Z.runtimes.find((V)=>V.id===Z.globalDefaultConfigId);if(K)return{entry:K,adapter:U0(K),runFolder:W?.runFolder??J?.runFolder??K.runFolder??B2.homedir(),modelId:W?.modelId??J?.modelId??K.defaultModelId??null,configValues:gX(K,J,W)}}throw new g0}async function L4(X,Z={}){let J=(Z.configPath?await q4(Z.configPath):await J0()).runtimes.find((K)=>K.id===X);if(!J)return null;return{entry:J,adapter:U0(J),runFolder:J.runFolder??B2.homedir(),modelId:Z.modelId??J.defaultModelId??null,configValues:{...J.defaultConfigValues??{},...Z.configValues??{}}}}var P4=new Map;function DX(X,Z){if(!X)return;P4.set(X,Z)}function x4(X){if(!X)return!1;return P4.get(X)??!1}var k0=new Map,$X=new Set;function GX(X){k0.get(X)?.controller.abort()}function b4(X){for(let[Z,W]of k0){if(W.frontendSessionId!==X)continue;W.controller.abort(),k0.delete(Z)}}function v4(){for(let X of k0.values())X.controller.abort();k0.clear()}function y4(X,Z){if(Z?.aborted)return!0;return X instanceof Error&&/abort signal received|session cancelled/i.test(X.message)}function R4(X,Z,W,J){if((!Z.availableModels||Z.availableModels.length===0)&&Z.availableConfigOptions.length===0)return;z0((K)=>{let V=K.runtimes.find((H)=>H.id===X);if(V){if(Z.availableModels&&Z.availableModels.length>0)V.discoveredModels=V2({adapterId:W,models:Z.availableModels,currentModelId:Z.currentModelId??J});if(Z.availableConfigOptions.length>0)V.discoveredConfigOptions=Z.availableConfigOptions}}).catch(()=>{return})}function i7(X,Z){return`${X}
|
|
1064
1064
|
|
|
1065
1065
|
Runtime run folder:
|
|
1066
1066
|
- Effective run folder: ${Z}
|
|
@@ -1070,4 +1070,4 @@ Runtime run folder:
|
|
|
1070
1070
|
Connection: close\r
|
|
1071
1071
|
Content-Length: ${Buffer.byteLength(W)}\r
|
|
1072
1072
|
\r
|
|
1073
|
-
${W}`),X.destroy()}function IW(X,Z){return new Promise((W,J)=>{let K=(H)=>{X.off("listening",V),J(H)},V=()=>{X.off("error",K);let H=X.address();if(!H||typeof H==="string"){J(Error("Failed to read CLI bridge server address"));return}W(H.port)};X.once("error",K),X.once("listening",V),X.listen(Z,"127.0.0.1")})}function i4(X){return new Promise((Z,W)=>{X.close((J)=>{if(J)W(J);else Z()})})}async function o4(X,Z=AX()){let W=new Map,J=new Map,K=X.maxMessageSize??CW,V=!1,H=(b)=>{let v=J.get(b);if(v)clearTimeout(v);J.delete(b)},U=(b)=>{J.delete(b);let{activeRunIds:v}=X.registry.disconnect(b);X.onDisconnect(b,v)},F=(b,v)=>{let f={type:"cli_status",connected:!0,runtime:X.runtime,mcpReady:X.mcpReady(),error:v,capabilities:X.capabilities??[],cliVersion:X.cliVersion,browserRuntime:X.browserRuntimeStatus?.()};if(b){let C=W.get(b);if(C)o0(C,f);return}for(let C of W.values())o0(C,f)},w=(b,v)=>{let f=v.sessionId.trim(),C=v.userId.trim();if(!f||!C){o0(b,{type:"cli_status",connected:!1,runtime:X.runtime,mcpReady:X.mcpReady(),error:"Missing frontend session or user id"}),b.close();return}H(f);let N=W.get(f);if(N&&N!==b)N.close();b.data.frontendSessionId=f,W.set(f,b),X.registry.register({frontendSessionId:f,userId:C,tools:v.tools,send:(g)=>o0(b,g)}),F(f),X.onToolMetadata?.(f)},q=(b,v)=>{let f=X.registry.getUserId(b);if(!f)return;switch(v.type){case"bridge_ping":{let C=W.get(b);if(C)o0(C,{type:"bridge_pong"});break}case"tool_metadata":X.registry.setMetadata(b,v.tools),X.onToolMetadata?.(b);break;case"tool_result":X.registry.handleToolResult(b,v);break;case"run_turn":E("bridge.run_received",{runId:v.run.runId,cardId:v.run.cardId,frontendSessionId:b}),X.registry.markRunActive(b,v.run.runId,v.run.cardId),X.onRunTurn(b,{...v.run,frontendSessionId:b,userId:f});break;case"cancel_run":if(X.registry.ownsRun(b,v.runId))X.onCancelRun(b,v.runId);break;case"runtime_rpc":X.onRuntimeRpc(b,v);break;case"browser_rpc":X.onBrowserRpc?.(b,W.get(b)?.data.frontendOrigin??"",v);break;case"warmup_run":X.onWarmupRun(b,{...v,frontendSessionId:b},f);break;default:break}},y=(b,v)=>{let f=y2(b.headers.origin),C=TX(f),N={Vary:"Origin"};if(C&&f)N["Access-Control-Allow-Origin"]=f,N["Access-Control-Allow-Private-Network"]="true";if(b.method==="OPTIONS"){v.writeHead(204,{...N,"Access-Control-Allow-Methods":"GET, OPTIONS","Access-Control-Allow-Headers":"*","Access-Control-Max-Age":"600"}),v.end();return}if(b.method!=="GET"){v.writeHead(405,N),v.end();return}v.writeHead(200,{...N,"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?.()}))},O=(b,v)=>{let f=y2(b.headers.origin),C=TX(f),N={Vary:"Origin"};if(C&&f)N["Access-Control-Allow-Origin"]=f,N["Access-Control-Allow-Private-Network"]="true";if(b.method==="OPTIONS"){v.writeHead(204,{...N,"Access-Control-Allow-Methods":"POST, OPTIONS","Access-Control-Allow-Headers":"content-type","Access-Control-Max-Age":"600"}),v.end();return}if(!C){v.writeHead(403,N),v.end();return}if(b.method!=="POST"){v.writeHead(405,N),v.end();return}let g={...N,"content-type":"application/json"},M=(m,h)=>{v.writeHead(m,g),v.end(JSON.stringify(h))},G="",I=!1;b.on("data",(m)=>{if(G+=m.toString("utf8"),G.length>gW)I=!0,b.destroy()}),b.on("end",()=>{if(I){M(400,{ok:!1,error:"Request body too large"});return}let m;try{m=JSON.parse(G)}catch{M(400,{ok:!1,error:"Invalid JSON body"});return}let h=typeof m.url==="string"?m.url:"";if(!T4(h)){M(400,{ok:!1,error:"url must be an http(s) loopback or /static_boards/ page URL"});return}let x=($,T)=>{let i=typeof $==="number"?$:Number.NaN;if(!Number.isFinite(i))return T;return Math.min(4000,Math.max(200,Math.round(i)))};c4({url:h,width:x(m.width,1440),height:x(m.height,900)}).then(($)=>M(200,{ok:!0,path:$.path,engine:$.engine})).catch(($)=>{let T=$ instanceof b1?503:$ instanceof v2?429:500;M(T,{ok:!1,...$ instanceof b1?{installing:!0}:{},error:$ instanceof Error?$.message:String($)})})})};for(let b of Z){let v=OW((N,g)=>{(async()=>{let M=new URL(N.url??"/","http://127.0.0.1").pathname;if(M===S4){y(N,g);return}if(M===MW){O(N,g);return}if(await X.onHttpRequest?.(N,g))return;g.writeHead(404,{"content-type":"text/plain"}),g.end("IdeaWave CLI bridge")})().catch((M)=>{if(g.headersSent){g.destroy(M instanceof Error?M:void 0);return}g.writeHead(500,{"content-type":"text/plain"}),g.end("IdeaWave CLI bridge request failed")})}),f=new fW({noServer:!0,maxPayload:K}),C=(N)=>{if(N.idleTimer)clearTimeout(N.idleTimer);N.idleTimer=setTimeout(()=>{N.close()},hW),N.idleTimer.unref?.()};f.on("connection",(N,g)=>{let M=N;M.data={id:RW(),frontendSessionId:null,frontendOrigin:new URL(y2(g.headers.origin)??s4).origin},M.idleTimer=null,C(M),M.on("ping",()=>C(M)),M.on("pong",()=>C(M)),M.on("error",()=>{if(M.idleTimer)clearTimeout(M.idleTimer);M.close()}),M.on("message",(G)=>{C(M);let I=_W(G);if(K>0&&I.length>K)return;let m=q2(I);if(!m)return;let h=M.data.frontendSessionId;if(!h){if(m.type==="bridge_probe")o0(M,{type:"bridge_probe_ack",protocolVersion:m.protocolVersion});else if(m.type==="frontend_hello")w(M,m);return}q(h,m)}),M.on("close",()=>{if(M.idleTimer)clearTimeout(M.idleTimer);let G=M.data.frontendSessionId;if(!G)return;if(W.get(G)!==M)return;if(W.delete(G),H(G),V)return;J.set(G,setTimeout(()=>U(G),NW))})}),v.on("upgrade",(N,g,M)=>{let G=new URL(N.url??"/","http://127.0.0.1").pathname;if(X.onHttpUpgrade?.(N,g,M))return;if(G!==lX){d4(g,404,"Not Found");return}if(!TX(y2(N.headers.origin))){d4(g,403,"Forbidden");return}f.handleUpgrade(N,g,M,(I)=>{f.emit("connection",I,N)})});try{let N=await IW(v,b);return{url:`ws://127.0.0.1:${N}${lX}`,port:N,sendStatus:F,close:async()=>{V=!0;for(let g of J.values())clearTimeout(g);J.clear();for(let g of f.clients){let M=g;if(M.idleTimer)clearTimeout(M.idleTimer);M.close()}f.close(),await i4(v).catch(()=>{return})}}}catch(N){if(f.close(),await i4(v).catch(()=>{return}),N?.code==="EADDRINUSE")continue;throw N}}throw Error(`No free IdeaWave CLI bridge port found in ${Z[0]}-${Z.at(-1)}`)}import{lstat as XQ,readFile as ZQ}from"node:fs/promises";import WQ from"node:os";import y1 from"node:path";import{Server as QQ}from"@modelcontextprotocol/sdk/server/index.js";import{CallToolRequestSchema as JQ,ListToolsRequestSchema as KQ}from"@modelcontextprotocol/sdk/types.js";var n4=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"]),SW=["screenshot_board","inspect_diagram","ask_user_question","create_agent_card","append_user_message","spawn_child_agents"],uW=new Set(SW),NY=new Set([...n4].filter((X)=>!uW.has(X)));var t4=new Set(["inspect_ideate_context","get_ideate_run_status","screenshot_ideate_context","submit_ideate_plan","revise_ideate_plan","set_ideate_placement","ask_ideate_question"]),e4=new Set(["inspect_ideate_context","get_ideate_run_status","get_ideate_worker_context","screenshot_ideate_context","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","inspect_neighbors","read_diagram_guide","inspect_browser","locate_browser_element","ideate_create_note","ideate_create_code","ideate_create_shape","ideate_create_browser","ideate_add_browser_note","ideate_add_board_callout","ideate_create_diagram","ideate_create_edge","ideate_update_note","ideate_update_code","ideate_update_shape","ideate_update_diagram","ideate_update_edge","ideate_delete_node","ideate_delete_edge"]),lW=new Set([...t4,...e4].filter((X)=>X.startsWith("ideate_")||X.includes("ideate_")));function X8(X,Z){if(Z==="full")return!lW.has(X);if(Z==="read")return n4.has(X);if(Z==="ideate-coordinator")return t4.has(X);return e4.has(X)}import{randomUUID as TW}from"node:crypto";import{createServer as cW}from"node:http";import{StreamableHTTPServerTransport as aW}from"@modelcontextprotocol/sdk/server/streamableHttp.js";import{isInitializeRequest as J8}from"@modelcontextprotocol/sdk/types.js";var Z8=new Set(["127.0.0.1","localhost","[::1]","::1"]);function AW(X){let Z=X.trim();if(Z.length===0)return null;if(Z.startsWith("[")){let V=Z.indexOf("]");if(V===-1)return null;let H=Z.slice(0,V+1),U=Z.slice(V+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 W=Z.lastIndexOf(":");if(W===-1)return{host:Z,port:null};let J=Z.slice(W+1),K=Number(J);if(!Number.isInteger(K)||K<=0||K>65535)return{host:Z,port:null};return{host:Z.slice(0,W),port:K}}function W8(X){return Z8.has(X)||Z8.has(X.toLowerCase())}function Q8(X,Z){let W=X.headers.host;if(typeof W!=="string")return{ok:!1,status:403,reason:"missing-host"};let J=AW(W);if(!J)return{ok:!1,status:403,reason:"bad-host"};if(!W8(J.host))return{ok:!1,status:403,reason:"non-loopback-host"};if(J.port!==null&&J.port!==Z)return{ok:!1,status:403,reason:"host-port-mismatch"};let K=X.headers.origin;if(typeof K==="string"&&K.length>0){if(K!=="null"){let V;try{V=new URL(K)}catch{return{ok:!1,status:403,reason:"bad-origin"}}if(!W8(V.hostname))return{ok:!1,status:403,reason:"non-loopback-origin"}}}return{ok:!0}}var K8="/mcp",dW=43274,Y8=16777216,iW=1800000,pW=300000,V8=200,sW=-32700,C0=-32600,cX=-32603;function Y0(X,Z,W,J,K){X.statusCode=Z,X.setHeader("content-type","application/json"),X.end(JSON.stringify({jsonrpc:"2.0",error:{code:W,message:J,...K?{data:K}:{}},id:null}))}class aX extends Error{constructor(){super("expected application/json");this.name="BadContentTypeError"}}class dX extends Error{constructor(){super(`body exceeds ${Y8} bytes`);this.name="BodyTooLargeError"}}async function rW(X){if(X.method&&X.method!=="POST")return;let Z=X.headers["content-type"];if(typeof Z==="string"&&Z.trim().length>0){if(!Z.toLowerCase().includes("application/json"))throw new aX}let W=0,J=[];for await(let V of X){let H=typeof V==="string"?Buffer.from(V):V;if(W+=H.byteLength,W>Y8)throw new dX;J.push(H)}if(J.length===0)return;let K=Buffer.concat(J).toString("utf8");if(K.length===0)return;return JSON.parse(K)}function oW(X){if(Array.isArray(X))return X.some(J8);return J8(X)}function nW(X){if(typeof X==="number")return X;let Z=process.env.IDEAWAVE_MCP_PORT;if(Z&&Z.trim().length>0){let W=Number(Z);if(Number.isInteger(W)&&W>=0&&W<65536)return W}return dW}async function tW(X,Z){let W=(K)=>new Promise((V,H)=>{let U=(w)=>{X.off("listening",F),H(w)},F=()=>{X.off("error",U),V()};X.once("error",U),X.once("listening",F),X.listen(K,"127.0.0.1")});try{await W(Z)}catch(K){if(K.code!=="EADDRINUSE"||Z===0)throw K;console.warn(`[mcp] port ${Z} in use, falling back to an OS-assigned port; external CLIs will need to re-paste the install command from Settings → External agents`),await W(0)}let J=X.address();if(J==null||typeof J==="string")throw Error("[mcp] failed to read bound address");return J.port}function eW(X,Z){if(Z&&typeof Z==="object"&&!Array.isArray(Z)){let J=Z.params;if(J&&typeof J==="object"&&!Array.isArray(J)){let K=J.clientInfo;if(K&&typeof K==="object"&&!Array.isArray(K)){let V=K.name;if(typeof V==="string"&&V.trim().length>0)return V.trim()}}}let W=X.headers["user-agent"];if(typeof W==="string"&&W.trim().length>0)return W.trim();return null}async function z8(X){let Z=new Map,W=0;function J(w){let q=Z.get(w);if(q)q.lastActivity=Date.now()}async function K(w,q){Z.delete(w),await q.transport.close().catch(()=>{return})}async function V(){let w=null,q=1/0;for(let[y,O]of Z)if(O.lastActivity<q)q=O.lastActivity,w=y;if(w!==null){let y=Z.get(w);if(y)console.warn(`[mcp] session cap of ${V8} reached; evicting ${w}`),await K(w,y)}}let H=setInterval(()=>{let w=Date.now()-iW;for(let[q,y]of Z)if(y.lastActivity<w)console.log(`[mcp] sweeping idle session ${q}`),K(q,y)},pW);H.unref?.();let U=cW((w,q)=>{(async()=>{let y;try{y=new URL(w.url??"/","http://127.0.0.1").pathname}catch{Y0(q,400,C0,"bad-url");return}if(y!==K8){Y0(q,404,C0,"not-found");return}let O=w.method??"POST";if(O!=="POST"&&O!=="GET"&&O!=="DELETE"){q.setHeader("Allow","GET, POST, DELETE"),Y0(q,405,C0,"method-not-allowed");return}let b=Q8(w,W);if(!b.ok){Y0(q,b.status,C0,"forbidden",{reason:b.reason});return}let v=w.headers["mcp-session-id"],f=typeof v==="string"?v:void 0;if(O==="GET"||O==="DELETE"){if(!f||!Z.has(f)){Y0(q,400,C0,"no-session",{hint:"Open a POST initialize first to receive an Mcp-Session-Id."});return}let g=Z.get(f).transport;J(f);try{await g.handleRequest(w,q)}catch(M){if(console.error("[mcp] transport.handleRequest (GET/DELETE) threw",M),!q.headersSent)Y0(q,500,cX,"internal")}return}let C;try{C=await rW(w)}catch(g){if(g instanceof aX){Y0(q,415,C0,"expected-application-json");return}if(g instanceof dX){Y0(q,413,C0,"body-too-large");return}Y0(q,400,sW,"invalid-json");return}let N;if(f&&Z.has(f))N=Z.get(f).transport,J(f);else if(!f&&C!==void 0&&oW(C)){let g=w.headers["x-ideawave-user-id"],M=typeof g==="string"&&g.trim().length>0?g.trim():null,G=w.headers["x-ideawave-frontend-session-id"],I=typeof G==="string"&&G.trim().length>0?G.trim():null,m=w.headers["x-ideawave-tool-surface"],h=typeof m==="string"?m.trim():"full",x=h==="read"||h==="ideate-coordinator"||h==="ideate-worker"?h:"full",$=w.headers["x-ideawave-images-supported"],T=typeof $==="string"&&$.trim()==="1",i=w.headers["x-ideawave-card-id"],S0=typeof i==="string"&&i.trim().length>0?i.trim():null,_=w.headers["x-ideawave-execution-kind"],s=w.headers["x-ideawave-execution-id"],A=typeof _==="string"?_.trim():"",Z0=typeof s==="string"?s.trim():"",h1=Z0&&new Set(["agent-card","ideate-coordinator","ideate-step","ideate-participant","board-insight","board-auto-title"]).has(A)?{kind:A,id:Z0}:null,h2=w.headers["x-ideawave-ideate-claims"],N2=null;if(typeof h2==="string"&&h2.length>0)try{N2=JSON.parse(h2)}catch{N2=null}let M2=w.headers["x-ideawave-board-id"],b8=typeof M2==="string"&&M2.trim().length>0?M2.trim():null,g2=w.headers["x-ideawave-run-folder"],v8=typeof g2==="string"&&g2.trim().length>0?g2.trim():null,y8=eW(w,C);if(Z.size>=V8)await V();let D2=null,M0=new aW({sessionIdGenerator:()=>TW(),onsessioninitialized:(u0)=>{D2=u0,Z.set(u0,{transport:M0,lastActivity:Date.now()})},onsessionclosed:(u0)=>{Z.delete(u0)}});M0.onclose=()=>{if(M0.sessionId)Z.delete(M0.sessionId)};try{await X.buildServer({userId:M,frontendSessionId:I,boardId:b8,toolSurface:x,imagesSupported:T,cardId:S0,executionTarget:h1,ideateClaims:N2,runFolder:v8,clientHint:y8}).connect(M0)}catch(u0){if(console.error("[mcp] buildServer/connect failed",u0),D2)Z.delete(D2);await M0.close().catch(()=>{return}),Y0(q,500,cX,"server-init-failed");return}N=M0}else{Y0(q,400,C0,"no-session",{hint:"Non-initialize requests must include a valid Mcp-Session-Id header obtained from a prior initialize."});return}try{await N.handleRequest(w,q,C)}catch(g){if(console.error("[mcp] transport.handleRequest threw",g),!q.headersSent)Y0(q,500,cX,"internal")}})().catch((y)=>{console.error("[mcp] unhandled request handler error:",y)})});return W=await tW(U,nW(X.port)),{url:`http://127.0.0.1:${W}${K8}`,port:W,close:async()=>{clearInterval(H);for(let w of Z.values())await w.transport.close().catch(()=>{return});Z.clear(),await new Promise((w)=>U.close(()=>w()))}}}var VQ={name:"ideawave-board",version:"1.0.0"},R2="list_run_folder",O2="read_run_folder_file",w8=new Set(["inspect_diagram"]);function U8(X,Z){if(X===R2||X===O2)return Z!=="ideate-coordinator";return X8(X,Z)}var YQ=[{name:R2,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:O2,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 iX(X){return{content:[{type:"text",text:X}]}}function zQ(X){return iX(JSON.stringify(X,null,2))}function j8(X){return{...iX(X),isError:!0}}async function jQ(X,Z){if(!Z||X.isError)return X;let W=X.content.find((V)=>V.type==="text");if(!W)return X;let J;try{let V=JSON.parse(W.text);if(typeof V.path!=="string")return X;J=y1.resolve(V.path)}catch{return X}let K=y1.resolve(y1.join(WQ.tmpdir(),"ideawave-screenshots"));if(y1.dirname(J)!==K||!/^board-[a-z0-9-]+\.png$/i.test(y1.basename(J)))return X;try{if(!(await XQ(J)).isFile())return X;let H=await ZQ(J);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 HQ(X,Z,W="full",J=!1){return X.getMetadata(Z).filter((K)=>{let V=j2(K.name);if(!U8(V,W))return!1;if(!J&&w8.has(V))return!1;return!0}).map((K)=>({name:K.name,description:K.description,inputSchema:K.inputSchema}))}function wQ(X,Z,W={}){let J=HQ(X,Z,W.toolSurface??"full",W.imagesSupported??!1);return W.includeRunFolderTools?[...J,...YQ]:J}function H8(X,Z){if(!X||typeof X!=="object"||Array.isArray(X))return null;let W=X[Z];return typeof W==="string"?W:null}async function UQ(X,Z,W){if(W&&W.trim().length>0)return W.trim();if(!X||!Z)throw Error("Run-folder tools require an active IdeaWave board and card.");return(await O0({boardId:X,cardId:Z})).runFolder}async function FQ(X){let Z=await UQ(X.boardId,X.cardId,X.runFolder);if(X.name===R2){let W=H8(X.args,"path")??"",J=await n6(Z,W);return zQ(J)}if(X.name===O2){let W=H8(X.args,"path");if(!W)return j8("read_run_folder_file requires a path.");return iX(await z2(Z,W))}return j8(`Unknown local tool "${X.name}"`)}function BQ(X,Z,W,J,K,V="full",H=!1,U=null,F=null){let w=new QQ(VQ,{capabilities:{tools:{}}}),q=async()=>{if(H)return!0;if(x4(J))return!0;if(W&&J)try{return(await O0({boardId:W,cardId:J})).adapter.supportsImages===!0}catch{return!1}return!1};return w.setRequestHandler(KQ,async()=>({tools:wQ(X,Z,{includeRunFolderTools:V!=="ideate-coordinator"&&Boolean(K||W&&J),toolSurface:V,imagesSupported:await q()})})),w.setRequestHandler(JQ,async(y)=>{let{name:O,arguments:b}=y.params,v=j2(O),f=Date.now();E("mcp.tool_call_received",{frontendSessionId:Z,cardId:J,toolName:v});try{if(!U8(v,V))throw Error(`Tool "${O}" is not available on the ${V} surface`);if(v===R2||v===O2)return await FQ({name:v,args:b,boardId:W,cardId:J,runFolder:K});if(w8.has(v)&&!await q())throw Error(`Tool "${O}" requires a runtime that supports image input`);let C=await X.callTool(Z,v,b??{},F?.runId,J??void 0,U??void 0,F??void 0,V);if(E("mcp.tool_result_returned",{frontendSessionId:Z,cardId:J,toolName:v,elapsedMs:Date.now()-f}),C&&typeof C==="object"&&Array.isArray(C.content)){let N=C;return v==="screenshot_board"||v==="screenshot_ideate_context"?await jQ(N,await q()):N}return{content:[{type:"text",text:typeof C==="string"?C:JSON.stringify(C)}]}}catch(C){return E("mcp.tool_result_returned",{frontendSessionId:Z,cardId:J,toolName:v,elapsedMs:Date.now()-f,hasError:!0}),{content:[{type:"text",text:C instanceof Error?C.message:"Tool call failed"}],isError:!0}}}),w}function F8(X,Z){return z8({buildServer:(W)=>BQ(X,W.frontendSessionId,W.boardId,W.cardId,W.runFolder,W.toolSurface,W.imagesSupported,W.executionTarget,W.ideateClaims),port:Z})}import f2 from"node:fs/promises";import pX from"node:os";import C2 from"node:path";function B8(){return`cfg_${crypto.randomUUID().replace(/-/g,"").slice(0,16)}`}async function qQ(){let[X,Z]=await Promise.all([J0(),u3()]),W=X.globalDefaultConfigId?X.runtimes.find((J)=>J.id===X.globalDefaultConfigId)??null:null;return{runtimes:X.runtimes,globalDefaultConfigId:X.globalDefaultConfigId,globalDefaultEffective:W?{runFolder:W.runFolder??pX.homedir(),modelId:W.defaultModelId??null,configValues:W.defaultConfigValues??{}}:null,knownAdapters:T0().map((J)=>({id:J.id,displayName:J.displayName})),readiness:Z}}async function LQ(X){try{let Z=await O0({boardId:X.boardId,cardId:X.cardId});return{resolved:{configId:Z.entry.id,adapterId:Z.entry.kind==="registered"?Z.entry.adapterId:null,displayName:Z.entry.displayName,runFolder:Z.runFolder,modelId:Z.modelId,configValues:Z.configValues}}}catch(Z){if(Z instanceof g0)return{resolved:null};throw Z}}async function PQ(X){return z0((Z)=>{let W=Z.runtimes.find((V)=>V.kind==="registered"&&V.adapterId===X.adapterId);if(W)return W;let J=T0().find((V)=>V.id===X.adapterId);if(!J)throw Error(`Unknown adapterId: ${X.adapterId}`);let K={id:B8(),kind:"registered",adapterId:X.adapterId,displayName:J.displayName,runFolder:null,defaultModelId:null,defaultConfigValues:{},discoveredModels:[],discoveredConfigOptions:[],discoveredAt:null};return Z.runtimes.push(K),K})}async function xQ(X){return z0((Z)=>{let W={id:B8(),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 Z.runtimes.push(W),W})}async function bQ(X){await z0((Z)=>{if(Z.runtimes=Z.runtimes.filter((W)=>W.id!==X.runtimeConfigId),Z.globalDefaultConfigId===X.runtimeConfigId)Z.globalDefaultConfigId=null;for(let W of Object.keys(Z.boardOverrides))if(Z.boardOverrides[W].runtimeConfigId===X.runtimeConfigId)delete Z.boardOverrides[W];for(let W of Object.keys(Z.cardOverrides))if(Z.cardOverrides[W].runtimeConfigId===X.runtimeConfigId)delete Z.cardOverrides[W]})}async function vQ(X){await z0((Z)=>{let W=Z.runtimes.find((J)=>J.id===X.runtimeConfigId);if(!W)throw Error(`Runtime config not found: ${X.runtimeConfigId}`);if(Z.globalDefaultConfigId=X.runtimeConfigId,X.runFolder!==void 0)W.runFolder=X.runFolder;if(X.modelId!==void 0)W.defaultModelId=X.modelId;if(X.configValues!==void 0)W.defaultConfigValues=X.configValues})}async function yQ(X){X.boardId,await z0((Z)=>{if(X.runtimeConfigId===null){delete Z.cardOverrides[X.cardId];return}if(!Z.runtimes.some((K)=>K.id===X.runtimeConfigId))throw Error(`Runtime config not found: ${X.runtimeConfigId}`);let J=Z.cardOverrides[X.cardId];Z.cardOverrides[X.cardId]={runtimeConfigId:X.runtimeConfigId,runFolder:X.runFolder!==void 0?X.runFolder:J?.runFolder??null,modelId:X.modelId!==void 0?X.modelId:J?.modelId??null,configValues:X.configValues!==void 0?X.configValues:J?.configValues??{}}})}async function RQ(X){let W=(await J0()).runtimes.find((H)=>H.id===X.runtimeConfigId);if(!W)throw Error(`Runtime config not found: ${X.runtimeConfigId}`);let J=U0(W),K=await J.resolveSpawnConfig(W),V=W.runFolder??pX.homedir();try{let H=await B4({spawn:{...K,cwd:V},modelId:X.modelId??W.defaultModelId??null,configValues:X.configValues??W.defaultConfigValues??{}}),U=V2({adapterId:J.id,models:H.models,currentModelId:H.currentModelId}),F=new Date().toISOString();return await z0((w)=>{let q=w.runtimes.find((y)=>y.id===X.runtimeConfigId);if(q)q.discoveredModels=U,q.discoveredConfigOptions=H.configOptions,q.discoveredAt=F}),{ok:!0,models:U,configOptions:H.configOptions,currentModelId:H.currentModelId}}catch(H){if(H instanceof l0)throw Error(`${H.message}${J.authHint?` ${J.authHint}`:""}`);if(H instanceof S||H instanceof w0)throw Error(H.message);throw H}}async function OQ(X){let Z=pX.homedir(),W=X.path?.trim()?X.path.trim():Z,J=C2.resolve(W),K=!0;try{if(!(await f2.stat(J)).isDirectory())J=C2.dirname(J)}catch{K=!1,J=Z}let V=[];try{V=(await f2.readdir(J,{withFileTypes:!0})).filter((F)=>F.isDirectory()&&!F.name.startsWith(".")).map((F)=>({name:F.name,path:C2.join(J,F.name)})).sort((F,w)=>F.name.localeCompare(w.name))}catch{V=[]}let H=C2.dirname(J);return{path:J,parent:H===J?null:H,home:Z,exists:K,entries:V}}var q8={list:qQ,getEffectiveForCard:LQ,registerRegistered:PQ,registerCustom:xQ,unregister:bQ,setUserDefault:vQ,setCardOverride:yQ,refreshModels:RQ,browseFolder:OQ};var fQ=[{id:"claude-code",displayName:"Claude Code"},{id:"codex",displayName:"Codex"},{id:"copilot",displayName:"Copilot"},{id:"opencode",displayName:"OpenCode"}];function CQ(){return`cfg_${crypto.randomUUID().replace(/-/g,"").slice(0,16)}`}async function L8(){try{let X=await J0();if(X.globalDefaultConfigId){if(X.runtimes.some((W)=>W.id===X.globalDefaultConfigId))return X.globalDefaultConfigId}for(let Z of fQ){if((await l3(Z.id))?.status!=="ready")continue;let J=null;if(await z0((K)=>{if(K.globalDefaultConfigId){if(K.runtimes.some((U)=>U.id===K.globalDefaultConfigId)){J=K.globalDefaultConfigId;return}}let V=K.runtimes.find((H)=>H.kind==="registered"&&H.adapterId===Z.id);if(!V){let H={id:CQ(),kind:"registered",adapterId:Z.id,displayName:Z.displayName,runFolder:null,defaultModelId:null,defaultConfigValues:{},discoveredModels:[],discoveredConfigOptions:[],discoveredAt:null};K.runtimes.push(H),V=H}K.globalDefaultConfigId=V.id,J=V.id}),J)return console.log(`[ideawave-cli] using agent runtime: ${Z.displayName}`),J}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 hQ=240000;function NQ(){if(typeof crypto<"u"&&"randomUUID"in crypto)return`call_${crypto.randomUUID()}`;return`call_${Date.now()}_${Math.random().toString(16).slice(2)}`}class sX{sessions=new Map;createCallId;toolCallTimeoutMs;constructor(X={}){this.createCallId=X.createCallId??NQ,this.toolCallTimeoutMs=X.toolCallTimeoutMs??hQ}register(X){let Z=this.sessions.get(X.frontendSessionId);if(Z){if(Z.userId!==X.userId)this.rejectPending(Z,"frontend session user changed"),Z.activeRunIds.clear();this.sessions.set(X.frontendSessionId,{frontendSessionId:X.frontendSessionId,userId:X.userId,tools:X.tools,send:X.send,pendingToolCalls:Z.pendingToolCalls,activeRunIds:Z.activeRunIds,activeRunCardIds:Z.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,Z="frontend session disconnected"){let W=this.sessions.get(X);if(!W)return{activeRunIds:[]};return this.sessions.delete(X),this.rejectPending(W,Z),{activeRunIds:Array.from(W.activeRunIds)}}sessionCount(){return this.sessions.size}has(X){return this.sessions.has(X)}getUserId(X){return this.sessions.get(X)?.userId??null}setMetadata(X,Z){let W=this.sessions.get(X);if(W)W.tools=Z}getMetadata(X){if(!X)return[];return this.sessions.get(X)?.tools??[]}sendToSession(X,Z){let W=this.sessions.get(X);if(!W)return!1;return W.send(Z),!0}callTool(X,Z,W,J,K,V,H,U){if(!X)return Promise.reject(Error("MCP tool call is missing a frontend session id"));let F=this.sessions.get(X);if(!F)return Promise.reject(Error(`Frontend session ${X} is not connected`));let w=this.createCallId();return new Promise((q,y)=>{let O=J??(K?this.getActiveRunIdForCard(F,K):this.getSoleActiveRunId(F)),b=K??(O?F.activeRunCardIds.get(O):void 0),v=Date.now(),f=setTimeout(()=>{F.pendingToolCalls.delete(w),E("tool_queue.timeout",{frontendSessionId:X,runId:O,cardId:b,callId:w,toolName:Z,elapsedMs:Date.now()-v,queueDepth:F.pendingToolCalls.size}),y(Error(`Tool "${Z}" timed out waiting for the frontend`))},this.toolCallTimeoutMs);F.pendingToolCalls.set(w,{resolve:q,reject:y,timer:f,name:Z,runId:O??null,cardId:b??null,startedAt:v}),E("tool_queue.forwarded_to_browser",{frontendSessionId:X,runId:O,cardId:b,callId:w,toolName:Z,queueDepth:F.pendingToolCalls.size}),F.send({type:"tool_call",callId:w,name:Z,args:W,...O?{runId:O}:{},...b?{cardId:b}:{},...V?{executionTarget:V}:{},...H?{ideateClaims:H}:{},...U?{toolSurface:U}:{}})})}handleToolResult(X,Z){let W=this.sessions.get(X);if(!W)return;let J=W.pendingToolCalls.get(Z.callId);if(!J)return;W.pendingToolCalls.delete(Z.callId),clearTimeout(J.timer);let K=Z.ok?"":Z.error??Z.result?.content?.find(({text:U})=>typeof U==="string")?.text??"Tool execution failed",V=/network|fetch|connection|offline/i.test(K)?"network":/timeout|timed out/i.test(K)?"timeout":/unauthor|forbidden|permission/i.test(K)?"authorization":/conflict|revision|lease|fence/i.test(K)?"conflict":/invalid|missing|required|schema/i.test(K)?"validation":"unknown";if(E("tool_queue.result_received",{frontendSessionId:X,runId:J.runId,cardId:J.cardId,callId:Z.callId,toolName:J.name,elapsedMs:Date.now()-J.startedAt,queueDepth:W.pendingToolCalls.size,ok:Z.ok,...Z.ok?{}:{errorCategory:V}}),Z.ok){J.resolve(Z.result);return}let H=Z.result;if(H&&typeof H==="object"&&Array.isArray(H.content)){J.resolve({...H,isError:!0});return}J.reject(Error(Z.error??"Tool execution failed"))}markRunActive(X,Z,W){let J=this.sessions.get(X);if(!J)return;if(J.activeRunIds.add(Z),W)J.activeRunCardIds.set(Z,W)}markRunSettled(X,Z){let W=this.sessions.get(X);if(!W)return;W.activeRunIds.delete(Z),W.activeRunCardIds.delete(Z)}ownsRun(X,Z){return this.sessions.get(X)?.activeRunIds.has(Z)??!1}rejectPending(X,Z){for(let W of X.pendingToolCalls.values())clearTimeout(W.timer),E("tool_queue.rejected",{frontendSessionId:X.frontendSessionId,runId:W.runId,cardId:W.cardId,toolName:W.name,elapsedMs:Date.now()-W.startedAt}),W.reject(Error(Z));X.pendingToolCalls.clear()}getSoleActiveRunId(X){return X.activeRunIds.size===1?X.activeRunIds.values().next().value:void 0}getActiveRunIdForCard(X,Z){let W=[...X.activeRunCardIds.entries()].filter(([J,K])=>X.activeRunIds.has(J)&&K===Z).map(([J])=>J);return W.length===1?W[0]:void 0}}function x8(){return"0.0.92".trim()?"0.0.92":"dev"}var MQ=process.argv.slice(2),oX=a4(MQ,process.env);if(oX.allowRailwayPrPreviews)process.env[v1]="1";var N0=oX.cliArgs[0],{browserKitEnabled:O1,captureEngineEnabled:gQ}=oX;if(N0==="--help"||N0==="-h"||N0==="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(N0==="--version"||N0==="-v"||N0==="version")console.log(x8()),process.exit(0);if(N0)console.error(`Unknown command: ${N0}`),console.error("Run `ideawave --help` for usage."),process.exit(1);var f1=new sX,I0=null,DQ=O1?{phase:"ready",message:"Local browser-kit proxy is ready"}:{phase:"idle"},n0=new K2;function h0(X,Z){f1.sendToSession(X,Z)}async function $Q(X,Z){try{let W=q8[Z.method],J=await W(Z.params);h0(X,{type:"runtime_rpc_result",requestId:Z.requestId,ok:!0,result:J})}catch(W){h0(X,{type:"runtime_rpc_result",requestId:Z.requestId,ok:!1,error:W instanceof Error?W.message:String(W)})}}var C1=!1,R1=null;async function rX(){if(C1)return;if(R1)return R1;return R1=(async()=>{try{let X=await F8(f1);J3({...X,requestedPort:X.port}),console.log(`[ideawave-cli] MCP endpoint for the agent: ${X.url}`);try{await v3({onStatusChange:(Z)=>{if(A3(),I0?.sendStatus(),Z.status==="failed")console.warn(`[ideawave-cli] ACP bridge setup failed for ${Z.packageName}: ${Z.error??"unknown error"}`)}})}catch(Z){console.warn("[ideawave-cli] ACP bridge setup skipped:",Z instanceof Error?Z.message:String(Z))}await L8(),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{R1=null}})(),R1}if(process.env.APP_ENV!=="development"){let X=await r4();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(gQ)E4().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 o4({registry:f1,runtime:null,mcpReady:()=>C1,capabilities:g4(O1),cliVersion:x8(),browserRuntimeStatus:()=>DQ,onToolMetadata:(X)=>{console.log(`[ideawave-cli] session ${X} advertised ${f1.getMetadata(X).length} tools`),rX()},onRunTurn:(X,Z)=>{console.log(`[ideawave-cli] running agent turn for card ${Z.cardId} (session ${X})`),(async()=>{if(await rX(),!C1){h0(X,{type:"run_settled",runId:Z.runId,cardId:Z.cardId,result:{assistantContent:"",model:null,latencyMs:0,errorText:"IdeaWave CLI agent host is not ready",partialText:null}});return}await O4(Z,(W)=>h0(X,W))})().catch(()=>{return}).finally(()=>f1.markRunSettled(X,Z.runId))},onCancelRun:(X,Z)=>{GX(Z)},onRuntimeRpc:(X,Z)=>{$Q(X,Z)},onBrowserRpc:(X,Z,W)=>{if(!O1){h0(X,{type:"browser_rpc_result",requestId:W.requestId,ok:!1,error:"The development browser-kit proxy is not enabled"});return}n0.handleRpc(X,Z,W).then((J)=>{h0(X,{type:"browser_rpc_result",requestId:W.requestId,ok:!0,result:J})},(J)=>{h0(X,{type:"browser_rpc_result",requestId:W.requestId,ok:!1,error:J instanceof Error?J.message:String(J)})})},onHttpRequest:(X,Z)=>O1?n0.handleHttpRequest(X,Z):!1,onHttpUpgrade:(X,Z,W)=>O1?n0.handleUpgrade(X,Z,W):!1,onWarmupRun:(X,Z,W)=>{(async()=>{if(await rX(),!C1)return{status:"retryable",error:"agent host is not ready"};return f4({cardId:Z.cardId,boardId:Z.boardId,userId:W,frontendSessionId:X})})().then((J)=>{if(!Z.warmupId)return;h0(X,{type:"warmup_result",warmupId:Z.warmupId,cardId:Z.cardId,...J})})},onDisconnect:(X,Z)=>{n0.closeFrontendSession(X),b4(X);for(let W of Z)GX(W);E("bridge.frontend_disconnected",{frontendSessionId:X,activeRuns:Z.length}),eX(X).catch((W)=>{console.warn(`[ideawave-cli] failed to evict sessions for ${X}:`,W instanceof Error?W.message:String(W))}),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 P8=!1;for(let X of["SIGINT","SIGTERM"])process.once(X,()=>{if(P8)return;P8=!0,v4(),(async()=>{await n0.close(),await I4(),await I0?.close().catch(()=>{return}),process.exit(0)})()});
|
|
1073
|
+
${W}`),X.destroy()}function IW(X,Z){return new Promise((W,J)=>{let K=(H)=>{X.off("listening",V),J(H)},V=()=>{X.off("error",K);let H=X.address();if(!H||typeof H==="string"){J(Error("Failed to read CLI bridge server address"));return}W(H.port)};X.once("error",K),X.once("listening",V),X.listen(Z,"127.0.0.1")})}function i4(X){return new Promise((Z,W)=>{X.close((J)=>{if(J)W(J);else Z()})})}async function o4(X,Z=AX()){let W=new Map,J=new Map,K=X.maxMessageSize??CW,V=!1,H=(b)=>{let v=J.get(b);if(v)clearTimeout(v);J.delete(b)},U=(b)=>{J.delete(b);let{activeRunIds:v}=X.registry.disconnect(b);X.onDisconnect(b,v)},F=(b,v)=>{let f={type:"cli_status",connected:!0,runtime:X.runtime,mcpReady:X.mcpReady(),error:v,capabilities:X.capabilities??[],cliVersion:X.cliVersion,browserRuntime:X.browserRuntimeStatus?.()};if(b){let C=W.get(b);if(C)o0(C,f);return}for(let C of W.values())o0(C,f)},w=(b,v)=>{let f=v.sessionId.trim(),C=v.userId.trim();if(!f||!C){o0(b,{type:"cli_status",connected:!1,runtime:X.runtime,mcpReady:X.mcpReady(),error:"Missing frontend session or user id"}),b.close();return}H(f);let N=W.get(f);if(N&&N!==b)N.close();b.data.frontendSessionId=f,W.set(f,b),X.registry.register({frontendSessionId:f,userId:C,tools:v.tools,send:(g)=>o0(b,g)}),F(f),X.onToolMetadata?.(f)},q=(b,v)=>{let f=X.registry.getUserId(b);if(!f)return;switch(v.type){case"bridge_ping":{let C=W.get(b);if(C)o0(C,{type:"bridge_pong"});break}case"tool_metadata":X.registry.setMetadata(b,v.tools),X.onToolMetadata?.(b);break;case"tool_result":X.registry.handleToolResult(b,v);break;case"run_turn":E("bridge.run_received",{runId:v.run.runId,cardId:v.run.cardId,frontendSessionId:b}),X.registry.markRunActive(b,v.run.runId,v.run.cardId),X.onRunTurn(b,{...v.run,frontendSessionId:b,userId:f});break;case"cancel_run":if(X.registry.ownsRun(b,v.runId))X.onCancelRun(b,v.runId);break;case"runtime_rpc":X.onRuntimeRpc(b,v);break;case"browser_rpc":X.onBrowserRpc?.(b,W.get(b)?.data.frontendOrigin??"",v);break;case"warmup_run":X.onWarmupRun(b,{...v,frontendSessionId:b},f);break;default:break}},y=(b,v)=>{let f=y2(b.headers.origin),C=TX(f),N={Vary:"Origin"};if(C&&f)N["Access-Control-Allow-Origin"]=f,N["Access-Control-Allow-Private-Network"]="true";if(b.method==="OPTIONS"){v.writeHead(204,{...N,"Access-Control-Allow-Methods":"GET, OPTIONS","Access-Control-Allow-Headers":"*","Access-Control-Max-Age":"600"}),v.end();return}if(b.method!=="GET"){v.writeHead(405,N),v.end();return}v.writeHead(200,{...N,"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?.()}))},O=(b,v)=>{let f=y2(b.headers.origin),C=TX(f),N={Vary:"Origin"};if(C&&f)N["Access-Control-Allow-Origin"]=f,N["Access-Control-Allow-Private-Network"]="true";if(b.method==="OPTIONS"){v.writeHead(204,{...N,"Access-Control-Allow-Methods":"POST, OPTIONS","Access-Control-Allow-Headers":"content-type","Access-Control-Max-Age":"600"}),v.end();return}if(!C){v.writeHead(403,N),v.end();return}if(b.method!=="POST"){v.writeHead(405,N),v.end();return}let g={...N,"content-type":"application/json"},M=(m,h)=>{v.writeHead(m,g),v.end(JSON.stringify(h))},G="",I=!1;b.on("data",(m)=>{if(G+=m.toString("utf8"),G.length>gW)I=!0,b.destroy()}),b.on("end",()=>{if(I){M(400,{ok:!1,error:"Request body too large"});return}let m;try{m=JSON.parse(G)}catch{M(400,{ok:!1,error:"Invalid JSON body"});return}let h=typeof m.url==="string"?m.url:"";if(!T4(h)){M(400,{ok:!1,error:"url must be an http(s) loopback or /static_boards/ page URL"});return}let x=($,T)=>{let i=typeof $==="number"?$:Number.NaN;if(!Number.isFinite(i))return T;return Math.min(4000,Math.max(200,Math.round(i)))};c4({url:h,width:x(m.width,1440),height:x(m.height,900)}).then(($)=>M(200,{ok:!0,path:$.path,engine:$.engine})).catch(($)=>{let T=$ instanceof b1?503:$ instanceof v2?429:500;M(T,{ok:!1,...$ instanceof b1?{installing:!0}:{},error:$ instanceof Error?$.message:String($)})})})};for(let b of Z){let v=OW((N,g)=>{(async()=>{let M=new URL(N.url??"/","http://127.0.0.1").pathname;if(M===S4){y(N,g);return}if(M===MW){O(N,g);return}if(await X.onHttpRequest?.(N,g))return;g.writeHead(404,{"content-type":"text/plain"}),g.end("IdeaWave CLI bridge")})().catch((M)=>{if(g.headersSent){g.destroy(M instanceof Error?M:void 0);return}g.writeHead(500,{"content-type":"text/plain"}),g.end("IdeaWave CLI bridge request failed")})}),f=new fW({noServer:!0,maxPayload:K}),C=(N)=>{if(N.idleTimer)clearTimeout(N.idleTimer);N.idleTimer=setTimeout(()=>{N.close()},hW),N.idleTimer.unref?.()};f.on("connection",(N,g)=>{let M=N;M.data={id:RW(),frontendSessionId:null,frontendOrigin:new URL(y2(g.headers.origin)??s4).origin},M.idleTimer=null,C(M),M.on("ping",()=>C(M)),M.on("pong",()=>C(M)),M.on("error",()=>{if(M.idleTimer)clearTimeout(M.idleTimer);M.close()}),M.on("message",(G)=>{C(M);let I=_W(G);if(K>0&&I.length>K)return;let m=q2(I);if(!m)return;let h=M.data.frontendSessionId;if(!h){if(m.type==="bridge_probe")o0(M,{type:"bridge_probe_ack",protocolVersion:m.protocolVersion});else if(m.type==="frontend_hello")w(M,m);return}q(h,m)}),M.on("close",()=>{if(M.idleTimer)clearTimeout(M.idleTimer);let G=M.data.frontendSessionId;if(!G)return;if(W.get(G)!==M)return;if(W.delete(G),H(G),V)return;J.set(G,setTimeout(()=>U(G),NW))})}),v.on("upgrade",(N,g,M)=>{let G=new URL(N.url??"/","http://127.0.0.1").pathname;if(X.onHttpUpgrade?.(N,g,M))return;if(G!==lX){d4(g,404,"Not Found");return}if(!TX(y2(N.headers.origin))){d4(g,403,"Forbidden");return}f.handleUpgrade(N,g,M,(I)=>{f.emit("connection",I,N)})});try{let N=await IW(v,b);return{url:`ws://127.0.0.1:${N}${lX}`,port:N,sendStatus:F,close:async()=>{V=!0;for(let g of J.values())clearTimeout(g);J.clear();for(let g of f.clients){let M=g;if(M.idleTimer)clearTimeout(M.idleTimer);M.close()}f.close(),await i4(v).catch(()=>{return})}}}catch(N){if(f.close(),await i4(v).catch(()=>{return}),N?.code==="EADDRINUSE")continue;throw N}}throw Error(`No free IdeaWave CLI bridge port found in ${Z[0]}-${Z.at(-1)}`)}import{lstat as XQ,readFile as ZQ}from"node:fs/promises";import WQ from"node:os";import y1 from"node:path";import{Server as QQ}from"@modelcontextprotocol/sdk/server/index.js";import{CallToolRequestSchema as JQ,ListToolsRequestSchema as KQ}from"@modelcontextprotocol/sdk/types.js";var n4=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"]),SW=["screenshot_board","inspect_diagram","ask_user_question","create_agent_card","append_user_message","spawn_child_agents"],uW=new Set(SW),NY=new Set([...n4].filter((X)=>!uW.has(X)));var t4=new Set(["inspect_ideate_context","get_ideate_run_status","screenshot_ideate_context","submit_ideate_plan","revise_ideate_plan","set_ideate_placement","ask_ideate_question"]),e4=new Set(["inspect_ideate_context","get_ideate_run_status","get_ideate_worker_context","screenshot_ideate_context","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","inspect_neighbors","read_diagram_guide","inspect_browser","locate_browser_element","ideate_create_note","ideate_create_code","ideate_create_shape","ideate_create_browser","ideate_add_browser_note","ideate_add_board_callout","ideate_create_diagram","ideate_create_edge","ideate_update_note","ideate_update_code","ideate_update_shape","ideate_update_diagram","ideate_update_edge","ideate_delete_node","ideate_delete_edge"]),lW=new Set([...t4,...e4].filter((X)=>X.startsWith("ideate_")||X.includes("ideate_")));function X8(X,Z){if(Z==="full")return!lW.has(X);if(Z==="read")return n4.has(X);if(Z==="ideate-coordinator")return t4.has(X);return e4.has(X)}import{randomUUID as TW}from"node:crypto";import{createServer as cW}from"node:http";import{StreamableHTTPServerTransport as aW}from"@modelcontextprotocol/sdk/server/streamableHttp.js";import{isInitializeRequest as J8}from"@modelcontextprotocol/sdk/types.js";var Z8=new Set(["127.0.0.1","localhost","[::1]","::1"]);function AW(X){let Z=X.trim();if(Z.length===0)return null;if(Z.startsWith("[")){let V=Z.indexOf("]");if(V===-1)return null;let H=Z.slice(0,V+1),U=Z.slice(V+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 W=Z.lastIndexOf(":");if(W===-1)return{host:Z,port:null};let J=Z.slice(W+1),K=Number(J);if(!Number.isInteger(K)||K<=0||K>65535)return{host:Z,port:null};return{host:Z.slice(0,W),port:K}}function W8(X){return Z8.has(X)||Z8.has(X.toLowerCase())}function Q8(X,Z){let W=X.headers.host;if(typeof W!=="string")return{ok:!1,status:403,reason:"missing-host"};let J=AW(W);if(!J)return{ok:!1,status:403,reason:"bad-host"};if(!W8(J.host))return{ok:!1,status:403,reason:"non-loopback-host"};if(J.port!==null&&J.port!==Z)return{ok:!1,status:403,reason:"host-port-mismatch"};let K=X.headers.origin;if(typeof K==="string"&&K.length>0){if(K!=="null"){let V;try{V=new URL(K)}catch{return{ok:!1,status:403,reason:"bad-origin"}}if(!W8(V.hostname))return{ok:!1,status:403,reason:"non-loopback-origin"}}}return{ok:!0}}var K8="/mcp",dW=43274,Y8=16777216,iW=1800000,pW=300000,V8=200,sW=-32700,C0=-32600,cX=-32603;function Y0(X,Z,W,J,K){X.statusCode=Z,X.setHeader("content-type","application/json"),X.end(JSON.stringify({jsonrpc:"2.0",error:{code:W,message:J,...K?{data:K}:{}},id:null}))}class aX extends Error{constructor(){super("expected application/json");this.name="BadContentTypeError"}}class dX extends Error{constructor(){super(`body exceeds ${Y8} bytes`);this.name="BodyTooLargeError"}}async function rW(X){if(X.method&&X.method!=="POST")return;let Z=X.headers["content-type"];if(typeof Z==="string"&&Z.trim().length>0){if(!Z.toLowerCase().includes("application/json"))throw new aX}let W=0,J=[];for await(let V of X){let H=typeof V==="string"?Buffer.from(V):V;if(W+=H.byteLength,W>Y8)throw new dX;J.push(H)}if(J.length===0)return;let K=Buffer.concat(J).toString("utf8");if(K.length===0)return;return JSON.parse(K)}function oW(X){if(Array.isArray(X))return X.some(J8);return J8(X)}function nW(X){if(typeof X==="number")return X;let Z=process.env.IDEAWAVE_MCP_PORT;if(Z&&Z.trim().length>0){let W=Number(Z);if(Number.isInteger(W)&&W>=0&&W<65536)return W}return dW}async function tW(X,Z){let W=(K)=>new Promise((V,H)=>{let U=(w)=>{X.off("listening",F),H(w)},F=()=>{X.off("error",U),V()};X.once("error",U),X.once("listening",F),X.listen(K,"127.0.0.1")});try{await W(Z)}catch(K){if(K.code!=="EADDRINUSE"||Z===0)throw K;console.warn(`[mcp] port ${Z} in use, falling back to an OS-assigned port; external CLIs will need to re-paste the install command from Settings → External agents`),await W(0)}let J=X.address();if(J==null||typeof J==="string")throw Error("[mcp] failed to read bound address");return J.port}function eW(X,Z){if(Z&&typeof Z==="object"&&!Array.isArray(Z)){let J=Z.params;if(J&&typeof J==="object"&&!Array.isArray(J)){let K=J.clientInfo;if(K&&typeof K==="object"&&!Array.isArray(K)){let V=K.name;if(typeof V==="string"&&V.trim().length>0)return V.trim()}}}let W=X.headers["user-agent"];if(typeof W==="string"&&W.trim().length>0)return W.trim();return null}async function z8(X){let Z=new Map,W=0;function J(w){let q=Z.get(w);if(q)q.lastActivity=Date.now()}async function K(w,q){Z.delete(w),await q.transport.close().catch(()=>{return})}async function V(){let w=null,q=1/0;for(let[y,O]of Z)if(O.lastActivity<q)q=O.lastActivity,w=y;if(w!==null){let y=Z.get(w);if(y)console.warn(`[mcp] session cap of ${V8} reached; evicting ${w}`),await K(w,y)}}let H=setInterval(()=>{let w=Date.now()-iW;for(let[q,y]of Z)if(y.lastActivity<w)console.log(`[mcp] sweeping idle session ${q}`),K(q,y)},pW);H.unref?.();let U=cW((w,q)=>{(async()=>{let y;try{y=new URL(w.url??"/","http://127.0.0.1").pathname}catch{Y0(q,400,C0,"bad-url");return}if(y!==K8){Y0(q,404,C0,"not-found");return}let O=w.method??"POST";if(O!=="POST"&&O!=="GET"&&O!=="DELETE"){q.setHeader("Allow","GET, POST, DELETE"),Y0(q,405,C0,"method-not-allowed");return}let b=Q8(w,W);if(!b.ok){Y0(q,b.status,C0,"forbidden",{reason:b.reason});return}let v=w.headers["mcp-session-id"],f=typeof v==="string"?v:void 0;if(O==="GET"||O==="DELETE"){if(!f||!Z.has(f)){Y0(q,400,C0,"no-session",{hint:"Open a POST initialize first to receive an Mcp-Session-Id."});return}let g=Z.get(f).transport;J(f);try{await g.handleRequest(w,q)}catch(M){if(console.error("[mcp] transport.handleRequest (GET/DELETE) threw",M),!q.headersSent)Y0(q,500,cX,"internal")}return}let C;try{C=await rW(w)}catch(g){if(g instanceof aX){Y0(q,415,C0,"expected-application-json");return}if(g instanceof dX){Y0(q,413,C0,"body-too-large");return}Y0(q,400,sW,"invalid-json");return}let N;if(f&&Z.has(f))N=Z.get(f).transport,J(f);else if(!f&&C!==void 0&&oW(C)){let g=w.headers["x-ideawave-user-id"],M=typeof g==="string"&&g.trim().length>0?g.trim():null,G=w.headers["x-ideawave-frontend-session-id"],I=typeof G==="string"&&G.trim().length>0?G.trim():null,m=w.headers["x-ideawave-tool-surface"],h=typeof m==="string"?m.trim():"full",x=h==="read"||h==="ideate-coordinator"||h==="ideate-worker"?h:"full",$=w.headers["x-ideawave-images-supported"],T=typeof $==="string"&&$.trim()==="1",i=w.headers["x-ideawave-card-id"],S0=typeof i==="string"&&i.trim().length>0?i.trim():null,_=w.headers["x-ideawave-execution-kind"],s=w.headers["x-ideawave-execution-id"],A=typeof _==="string"?_.trim():"",Z0=typeof s==="string"?s.trim():"",h1=Z0&&new Set(["agent-card","ideate-coordinator","ideate-step","ideate-participant","board-insight","board-auto-title"]).has(A)?{kind:A,id:Z0}:null,h2=w.headers["x-ideawave-ideate-claims"],N2=null;if(typeof h2==="string"&&h2.length>0)try{N2=JSON.parse(h2)}catch{N2=null}let M2=w.headers["x-ideawave-board-id"],b8=typeof M2==="string"&&M2.trim().length>0?M2.trim():null,g2=w.headers["x-ideawave-run-folder"],v8=typeof g2==="string"&&g2.trim().length>0?g2.trim():null,y8=eW(w,C);if(Z.size>=V8)await V();let D2=null,M0=new aW({sessionIdGenerator:()=>TW(),onsessioninitialized:(u0)=>{D2=u0,Z.set(u0,{transport:M0,lastActivity:Date.now()})},onsessionclosed:(u0)=>{Z.delete(u0)}});M0.onclose=()=>{if(M0.sessionId)Z.delete(M0.sessionId)};try{await X.buildServer({userId:M,frontendSessionId:I,boardId:b8,toolSurface:x,imagesSupported:T,cardId:S0,executionTarget:h1,ideateClaims:N2,runFolder:v8,clientHint:y8}).connect(M0)}catch(u0){if(console.error("[mcp] buildServer/connect failed",u0),D2)Z.delete(D2);await M0.close().catch(()=>{return}),Y0(q,500,cX,"server-init-failed");return}N=M0}else{Y0(q,400,C0,"no-session",{hint:"Non-initialize requests must include a valid Mcp-Session-Id header obtained from a prior initialize."});return}try{await N.handleRequest(w,q,C)}catch(g){if(console.error("[mcp] transport.handleRequest threw",g),!q.headersSent)Y0(q,500,cX,"internal")}})().catch((y)=>{console.error("[mcp] unhandled request handler error:",y)})});return W=await tW(U,nW(X.port)),{url:`http://127.0.0.1:${W}${K8}`,port:W,close:async()=>{clearInterval(H);for(let w of Z.values())await w.transport.close().catch(()=>{return});Z.clear(),await new Promise((w)=>U.close(()=>w()))}}}var VQ={name:"ideawave-board",version:"1.0.0"},R2="list_run_folder",O2="read_run_folder_file",w8=new Set(["inspect_diagram"]);function U8(X,Z){if(X===R2||X===O2)return Z!=="ideate-coordinator";return X8(X,Z)}var YQ=[{name:R2,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:O2,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 iX(X){return{content:[{type:"text",text:X}]}}function zQ(X){return iX(JSON.stringify(X,null,2))}function j8(X){return{...iX(X),isError:!0}}async function jQ(X,Z){if(!Z||X.isError)return X;let W=X.content.find((V)=>V.type==="text");if(!W)return X;let J;try{let V=JSON.parse(W.text);if(typeof V.path!=="string")return X;J=y1.resolve(V.path)}catch{return X}let K=y1.resolve(y1.join(WQ.tmpdir(),"ideawave-screenshots"));if(y1.dirname(J)!==K||!/^board-[a-z0-9-]+\.png$/i.test(y1.basename(J)))return X;try{if(!(await XQ(J)).isFile())return X;let H=await ZQ(J);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 HQ(X,Z,W="full",J=!1){return X.getMetadata(Z).filter((K)=>{let V=j2(K.name);if(!U8(V,W))return!1;if(!J&&w8.has(V))return!1;return!0}).map((K)=>({name:K.name,description:K.description,inputSchema:K.inputSchema}))}function wQ(X,Z,W={}){let J=HQ(X,Z,W.toolSurface??"full",W.imagesSupported??!1);return W.includeRunFolderTools?[...J,...YQ]:J}function H8(X,Z){if(!X||typeof X!=="object"||Array.isArray(X))return null;let W=X[Z];return typeof W==="string"?W:null}async function UQ(X,Z,W){if(W&&W.trim().length>0)return W.trim();if(!X||!Z)throw Error("Run-folder tools require an active IdeaWave board and card.");return(await O0({boardId:X,cardId:Z})).runFolder}async function FQ(X){let Z=await UQ(X.boardId,X.cardId,X.runFolder);if(X.name===R2){let W=H8(X.args,"path")??"",J=await n6(Z,W);return zQ(J)}if(X.name===O2){let W=H8(X.args,"path");if(!W)return j8("read_run_folder_file requires a path.");return iX(await z2(Z,W))}return j8(`Unknown local tool "${X.name}"`)}function BQ(X,Z,W,J,K,V="full",H=!1,U=null,F=null){let w=new QQ(VQ,{capabilities:{tools:{}}}),q=async()=>{if(H)return!0;if(x4(J))return!0;if(W&&J)try{return(await O0({boardId:W,cardId:J})).adapter.supportsImages===!0}catch{return!1}return!1};return w.setRequestHandler(KQ,async()=>({tools:wQ(X,Z,{includeRunFolderTools:V!=="ideate-coordinator"&&Boolean(K||W&&J),toolSurface:V,imagesSupported:await q()})})),w.setRequestHandler(JQ,async(y)=>{let{name:O,arguments:b}=y.params,v=j2(O),f=Date.now();E("mcp.tool_call_received",{frontendSessionId:Z,cardId:J,toolName:v});try{if(!U8(v,V))throw Error(`Tool "${O}" is not available on the ${V} surface`);if(v===R2||v===O2)return await FQ({name:v,args:b,boardId:W,cardId:J,runFolder:K});if(w8.has(v)&&!await q())throw Error(`Tool "${O}" requires a runtime that supports image input`);let C=await X.callTool(Z,v,b??{},F?.runId,J??void 0,U??void 0,F??void 0,V);if(E("mcp.tool_result_returned",{frontendSessionId:Z,cardId:J,toolName:v,elapsedMs:Date.now()-f}),C&&typeof C==="object"&&Array.isArray(C.content)){let N=C;return v==="screenshot_board"||v==="screenshot_ideate_context"?await jQ(N,await q()):N}return{content:[{type:"text",text:typeof C==="string"?C:JSON.stringify(C)}]}}catch(C){return E("mcp.tool_result_returned",{frontendSessionId:Z,cardId:J,toolName:v,elapsedMs:Date.now()-f,hasError:!0}),{content:[{type:"text",text:C instanceof Error?C.message:"Tool call failed"}],isError:!0}}}),w}function F8(X,Z){return z8({buildServer:(W)=>BQ(X,W.frontendSessionId,W.boardId,W.cardId,W.runFolder,W.toolSurface,W.imagesSupported,W.executionTarget,W.ideateClaims),port:Z})}import f2 from"node:fs/promises";import pX from"node:os";import C2 from"node:path";function B8(){return`cfg_${crypto.randomUUID().replace(/-/g,"").slice(0,16)}`}async function qQ(){let[X,Z]=await Promise.all([J0(),u3()]),W=X.globalDefaultConfigId?X.runtimes.find((J)=>J.id===X.globalDefaultConfigId)??null:null;return{runtimes:X.runtimes,globalDefaultConfigId:X.globalDefaultConfigId,globalDefaultEffective:W?{runFolder:W.runFolder??pX.homedir(),modelId:W.defaultModelId??null,configValues:W.defaultConfigValues??{}}:null,knownAdapters:T0().map((J)=>({id:J.id,displayName:J.displayName})),readiness:Z}}async function LQ(X){try{let Z=await O0({boardId:X.boardId,cardId:X.cardId});return{resolved:{configId:Z.entry.id,adapterId:Z.entry.kind==="registered"?Z.entry.adapterId:null,displayName:Z.entry.displayName,runFolder:Z.runFolder,modelId:Z.modelId,configValues:Z.configValues}}}catch(Z){if(Z instanceof g0)return{resolved:null};throw Z}}async function PQ(X){return z0((Z)=>{let W=Z.runtimes.find((V)=>V.kind==="registered"&&V.adapterId===X.adapterId);if(W)return W;let J=T0().find((V)=>V.id===X.adapterId);if(!J)throw Error(`Unknown adapterId: ${X.adapterId}`);let K={id:B8(),kind:"registered",adapterId:X.adapterId,displayName:J.displayName,runFolder:null,defaultModelId:null,defaultConfigValues:{},discoveredModels:[],discoveredConfigOptions:[],discoveredAt:null};return Z.runtimes.push(K),K})}async function xQ(X){return z0((Z)=>{let W={id:B8(),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 Z.runtimes.push(W),W})}async function bQ(X){await z0((Z)=>{if(Z.runtimes=Z.runtimes.filter((W)=>W.id!==X.runtimeConfigId),Z.globalDefaultConfigId===X.runtimeConfigId)Z.globalDefaultConfigId=null;for(let W of Object.keys(Z.boardOverrides))if(Z.boardOverrides[W].runtimeConfigId===X.runtimeConfigId)delete Z.boardOverrides[W];for(let W of Object.keys(Z.cardOverrides))if(Z.cardOverrides[W].runtimeConfigId===X.runtimeConfigId)delete Z.cardOverrides[W]})}async function vQ(X){await z0((Z)=>{let W=Z.runtimes.find((J)=>J.id===X.runtimeConfigId);if(!W)throw Error(`Runtime config not found: ${X.runtimeConfigId}`);if(Z.globalDefaultConfigId=X.runtimeConfigId,X.runFolder!==void 0)W.runFolder=X.runFolder;if(X.modelId!==void 0)W.defaultModelId=X.modelId;if(X.configValues!==void 0)W.defaultConfigValues=X.configValues})}async function yQ(X){X.boardId,await z0((Z)=>{if(X.runtimeConfigId===null){delete Z.cardOverrides[X.cardId];return}if(!Z.runtimes.some((K)=>K.id===X.runtimeConfigId))throw Error(`Runtime config not found: ${X.runtimeConfigId}`);let J=Z.cardOverrides[X.cardId];Z.cardOverrides[X.cardId]={runtimeConfigId:X.runtimeConfigId,runFolder:X.runFolder!==void 0?X.runFolder:J?.runFolder??null,modelId:X.modelId!==void 0?X.modelId:J?.modelId??null,configValues:X.configValues!==void 0?X.configValues:J?.configValues??{}}})}async function RQ(X){let W=(await J0()).runtimes.find((H)=>H.id===X.runtimeConfigId);if(!W)throw Error(`Runtime config not found: ${X.runtimeConfigId}`);let J=U0(W),K=await J.resolveSpawnConfig(W),V=W.runFolder??pX.homedir();try{let H=await B4({spawn:{...K,cwd:V},modelId:X.modelId??W.defaultModelId??null,configValues:X.configValues??W.defaultConfigValues??{}}),U=V2({adapterId:J.id,models:H.models,currentModelId:H.currentModelId}),F=new Date().toISOString();return await z0((w)=>{let q=w.runtimes.find((y)=>y.id===X.runtimeConfigId);if(q)q.discoveredModels=U,q.discoveredConfigOptions=H.configOptions,q.discoveredAt=F}),{ok:!0,models:U,configOptions:H.configOptions,currentModelId:H.currentModelId}}catch(H){if(H instanceof l0)throw Error(`${H.message}${J.authHint?` ${J.authHint}`:""}`);if(H instanceof S||H instanceof w0)throw Error(H.message);throw H}}async function OQ(X){let Z=pX.homedir(),W=X.path?.trim()?X.path.trim():Z,J=C2.resolve(W),K=!0;try{if(!(await f2.stat(J)).isDirectory())J=C2.dirname(J)}catch{K=!1,J=Z}let V=[];try{V=(await f2.readdir(J,{withFileTypes:!0})).filter((F)=>F.isDirectory()&&!F.name.startsWith(".")).map((F)=>({name:F.name,path:C2.join(J,F.name)})).sort((F,w)=>F.name.localeCompare(w.name))}catch{V=[]}let H=C2.dirname(J);return{path:J,parent:H===J?null:H,home:Z,exists:K,entries:V}}var q8={list:qQ,getEffectiveForCard:LQ,registerRegistered:PQ,registerCustom:xQ,unregister:bQ,setUserDefault:vQ,setCardOverride:yQ,refreshModels:RQ,browseFolder:OQ};var fQ=[{id:"claude-code",displayName:"Claude Code"},{id:"codex",displayName:"Codex"},{id:"copilot",displayName:"Copilot"},{id:"opencode",displayName:"OpenCode"}];function CQ(){return`cfg_${crypto.randomUUID().replace(/-/g,"").slice(0,16)}`}async function L8(){try{let X=await J0();if(X.globalDefaultConfigId){if(X.runtimes.some((W)=>W.id===X.globalDefaultConfigId))return X.globalDefaultConfigId}for(let Z of fQ){if((await l3(Z.id))?.status!=="ready")continue;let J=null;if(await z0((K)=>{if(K.globalDefaultConfigId){if(K.runtimes.some((U)=>U.id===K.globalDefaultConfigId)){J=K.globalDefaultConfigId;return}}let V=K.runtimes.find((H)=>H.kind==="registered"&&H.adapterId===Z.id);if(!V){let H={id:CQ(),kind:"registered",adapterId:Z.id,displayName:Z.displayName,runFolder:null,defaultModelId:null,defaultConfigValues:{},discoveredModels:[],discoveredConfigOptions:[],discoveredAt:null};K.runtimes.push(H),V=H}K.globalDefaultConfigId=V.id,J=V.id}),J)return console.log(`[ideawave-cli] using agent runtime: ${Z.displayName}`),J}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 hQ=240000;function NQ(){if(typeof crypto<"u"&&"randomUUID"in crypto)return`call_${crypto.randomUUID()}`;return`call_${Date.now()}_${Math.random().toString(16).slice(2)}`}class sX{sessions=new Map;createCallId;toolCallTimeoutMs;constructor(X={}){this.createCallId=X.createCallId??NQ,this.toolCallTimeoutMs=X.toolCallTimeoutMs??hQ}register(X){let Z=this.sessions.get(X.frontendSessionId);if(Z){if(Z.userId!==X.userId)this.rejectPending(Z,"frontend session user changed"),Z.activeRunIds.clear();this.sessions.set(X.frontendSessionId,{frontendSessionId:X.frontendSessionId,userId:X.userId,tools:X.tools,send:X.send,pendingToolCalls:Z.pendingToolCalls,activeRunIds:Z.activeRunIds,activeRunCardIds:Z.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,Z="frontend session disconnected"){let W=this.sessions.get(X);if(!W)return{activeRunIds:[]};return this.sessions.delete(X),this.rejectPending(W,Z),{activeRunIds:Array.from(W.activeRunIds)}}sessionCount(){return this.sessions.size}has(X){return this.sessions.has(X)}getUserId(X){return this.sessions.get(X)?.userId??null}setMetadata(X,Z){let W=this.sessions.get(X);if(W)W.tools=Z}getMetadata(X){if(!X)return[];return this.sessions.get(X)?.tools??[]}sendToSession(X,Z){let W=this.sessions.get(X);if(!W)return!1;return W.send(Z),!0}callTool(X,Z,W,J,K,V,H,U){if(!X)return Promise.reject(Error("MCP tool call is missing a frontend session id"));let F=this.sessions.get(X);if(!F)return Promise.reject(Error(`Frontend session ${X} is not connected`));let w=this.createCallId();return new Promise((q,y)=>{let O=J??(K?this.getActiveRunIdForCard(F,K):this.getSoleActiveRunId(F)),b=K??(O?F.activeRunCardIds.get(O):void 0),v=Date.now(),f=setTimeout(()=>{F.pendingToolCalls.delete(w),E("tool_queue.timeout",{frontendSessionId:X,runId:O,cardId:b,callId:w,toolName:Z,elapsedMs:Date.now()-v,queueDepth:F.pendingToolCalls.size}),y(Error(`Tool "${Z}" timed out waiting for the frontend`))},this.toolCallTimeoutMs);F.pendingToolCalls.set(w,{resolve:q,reject:y,timer:f,name:Z,runId:O??null,cardId:b??null,startedAt:v}),E("tool_queue.forwarded_to_browser",{frontendSessionId:X,runId:O,cardId:b,callId:w,toolName:Z,queueDepth:F.pendingToolCalls.size}),F.send({type:"tool_call",callId:w,name:Z,args:W,...O?{runId:O}:{},...b?{cardId:b}:{},...V?{executionTarget:V}:{},...H?{ideateClaims:H}:{},...U?{toolSurface:U}:{}})})}handleToolResult(X,Z){let W=this.sessions.get(X);if(!W)return;let J=W.pendingToolCalls.get(Z.callId);if(!J)return;W.pendingToolCalls.delete(Z.callId),clearTimeout(J.timer);let K=Z.ok?"":Z.error??Z.result?.content?.find(({text:U})=>typeof U==="string")?.text??"Tool execution failed",V=/network|fetch|connection|offline/i.test(K)?"network":/timeout|timed out/i.test(K)?"timeout":/unauthor|forbidden|permission/i.test(K)?"authorization":/conflict|revision|lease|fence/i.test(K)?"conflict":/invalid|missing|required|schema/i.test(K)?"validation":"unknown";if(E("tool_queue.result_received",{frontendSessionId:X,runId:J.runId,cardId:J.cardId,callId:Z.callId,toolName:J.name,elapsedMs:Date.now()-J.startedAt,queueDepth:W.pendingToolCalls.size,ok:Z.ok,...Z.ok?{}:{errorCategory:V}}),Z.ok){J.resolve(Z.result);return}let H=Z.result;if(H&&typeof H==="object"&&Array.isArray(H.content)){J.resolve({...H,isError:!0});return}J.reject(Error(Z.error??"Tool execution failed"))}markRunActive(X,Z,W){let J=this.sessions.get(X);if(!J)return;if(J.activeRunIds.add(Z),W)J.activeRunCardIds.set(Z,W)}markRunSettled(X,Z){let W=this.sessions.get(X);if(!W)return;W.activeRunIds.delete(Z),W.activeRunCardIds.delete(Z)}ownsRun(X,Z){return this.sessions.get(X)?.activeRunIds.has(Z)??!1}rejectPending(X,Z){for(let W of X.pendingToolCalls.values())clearTimeout(W.timer),E("tool_queue.rejected",{frontendSessionId:X.frontendSessionId,runId:W.runId,cardId:W.cardId,toolName:W.name,elapsedMs:Date.now()-W.startedAt}),W.reject(Error(Z));X.pendingToolCalls.clear()}getSoleActiveRunId(X){return X.activeRunIds.size===1?X.activeRunIds.values().next().value:void 0}getActiveRunIdForCard(X,Z){let W=[...X.activeRunCardIds.entries()].filter(([J,K])=>X.activeRunIds.has(J)&&K===Z).map(([J])=>J);return W.length===1?W[0]:void 0}}function x8(){return"0.0.93".trim()?"0.0.93":"dev"}var MQ=process.argv.slice(2),oX=a4(MQ,process.env);if(oX.allowRailwayPrPreviews)process.env[v1]="1";var N0=oX.cliArgs[0],{browserKitEnabled:O1,captureEngineEnabled:gQ}=oX;if(N0==="--help"||N0==="-h"||N0==="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(N0==="--version"||N0==="-v"||N0==="version")console.log(x8()),process.exit(0);if(N0)console.error(`Unknown command: ${N0}`),console.error("Run `ideawave --help` for usage."),process.exit(1);var f1=new sX,I0=null,DQ=O1?{phase:"ready",message:"Local browser-kit proxy is ready"}:{phase:"idle"},n0=new K2;function h0(X,Z){f1.sendToSession(X,Z)}async function $Q(X,Z){try{let W=q8[Z.method],J=await W(Z.params);h0(X,{type:"runtime_rpc_result",requestId:Z.requestId,ok:!0,result:J})}catch(W){h0(X,{type:"runtime_rpc_result",requestId:Z.requestId,ok:!1,error:W instanceof Error?W.message:String(W)})}}var C1=!1,R1=null;async function rX(){if(C1)return;if(R1)return R1;return R1=(async()=>{try{let X=await F8(f1);J3({...X,requestedPort:X.port}),console.log(`[ideawave-cli] MCP endpoint for the agent: ${X.url}`);try{await v3({onStatusChange:(Z)=>{if(A3(),I0?.sendStatus(),Z.status==="failed")console.warn(`[ideawave-cli] ACP bridge setup failed for ${Z.packageName}: ${Z.error??"unknown error"}`)}})}catch(Z){console.warn("[ideawave-cli] ACP bridge setup skipped:",Z instanceof Error?Z.message:String(Z))}await L8(),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{R1=null}})(),R1}if(process.env.APP_ENV!=="development"){let X=await r4();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(gQ)E4().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 o4({registry:f1,runtime:null,mcpReady:()=>C1,capabilities:g4(O1),cliVersion:x8(),browserRuntimeStatus:()=>DQ,onToolMetadata:(X)=>{console.log(`[ideawave-cli] session ${X} advertised ${f1.getMetadata(X).length} tools`),rX()},onRunTurn:(X,Z)=>{console.log(`[ideawave-cli] running agent turn for card ${Z.cardId} (session ${X})`),(async()=>{if(await rX(),!C1){h0(X,{type:"run_settled",runId:Z.runId,cardId:Z.cardId,result:{assistantContent:"",model:null,latencyMs:0,errorText:"IdeaWave CLI agent host is not ready",partialText:null}});return}await O4(Z,(W)=>h0(X,W))})().catch(()=>{return}).finally(()=>f1.markRunSettled(X,Z.runId))},onCancelRun:(X,Z)=>{GX(Z)},onRuntimeRpc:(X,Z)=>{$Q(X,Z)},onBrowserRpc:(X,Z,W)=>{if(!O1){h0(X,{type:"browser_rpc_result",requestId:W.requestId,ok:!1,error:"The development browser-kit proxy is not enabled"});return}n0.handleRpc(X,Z,W).then((J)=>{h0(X,{type:"browser_rpc_result",requestId:W.requestId,ok:!0,result:J})},(J)=>{h0(X,{type:"browser_rpc_result",requestId:W.requestId,ok:!1,error:J instanceof Error?J.message:String(J)})})},onHttpRequest:(X,Z)=>O1?n0.handleHttpRequest(X,Z):!1,onHttpUpgrade:(X,Z,W)=>O1?n0.handleUpgrade(X,Z,W):!1,onWarmupRun:(X,Z,W)=>{(async()=>{if(await rX(),!C1)return{status:"retryable",error:"agent host is not ready"};return f4({cardId:Z.cardId,boardId:Z.boardId,userId:W,frontendSessionId:X})})().then((J)=>{if(!Z.warmupId)return;h0(X,{type:"warmup_result",warmupId:Z.warmupId,cardId:Z.cardId,...J})})},onDisconnect:(X,Z)=>{n0.closeFrontendSession(X),b4(X);for(let W of Z)GX(W);E("bridge.frontend_disconnected",{frontendSessionId:X,activeRuns:Z.length}),eX(X).catch((W)=>{console.warn(`[ideawave-cli] failed to evict sessions for ${X}:`,W instanceof Error?W.message:String(W))}),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 P8=!1;for(let X of["SIGINT","SIGTERM"])process.once(X,()=>{if(P8)return;P8=!0,v4(),(async()=>{await n0.close(),await I4(),await I0?.close().catch(()=>{return}),process.exit(0)})()});
|