@minionry/sdk 0.4.23 → 0.5.2

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/cdn/v1.js CHANGED
@@ -1,16 +1,16 @@
1
1
  /*! @minionry/sdk | Copyright Minionry, Inc. All rights reserved. | Minionry Commercial License */
2
- "use strict";var Minionry=(()=>{var pt=Object.defineProperty;var ur=Object.getOwnPropertyDescriptor;var dr=Object.getOwnPropertyNames;var gr=Object.prototype.hasOwnProperty;var pr=(d,f,w)=>f in d?pt(d,f,{enumerable:!0,configurable:!0,writable:!0,value:w}):d[f]=w;var mr=(d,f)=>{for(var w in f)pt(d,w,{get:f[w],enumerable:!0})},fr=(d,f,w,E)=>{if(f&&typeof f=="object"||typeof f=="function")for(let M of dr(f))!gr.call(d,M)&&M!==w&&pt(d,M,{get:()=>f[M],enumerable:!(E=ur(f,M))||E.enumerable});return d};var hr=d=>fr(pt({},"__esModule",{value:!0}),d);var mt=(d,f,w)=>pr(d,typeof f!="symbol"?f+"":f,w);var Ii={};mr(Ii,{AGENT_RUN_LIMITS:()=>De,AGENT_RUN_MODEL_SELECTIONS:()=>ft,BROWSER_INPUT_MODIFIERS:()=>br,CDP_BINDING_NAME:()=>kr,CDP_MESSAGE_EVENT:()=>Er,HOST_CONNECT_TYPE:()=>Ft,MINIONRY_ANNOUNCE_EVENT:()=>Ze,MINIONRY_ERROR_CODES:()=>wr,MINIONRY_FRAME_PREFIX:()=>Sr,MINIONRY_REQUEST_EVENT:()=>Xe,MinionryError:()=>l,PROVIDER_API_VERSION:()=>vi,SCOPES:()=>Ot,SCOPE_RISK_TIERS:()=>yr,SDK_CONNECT_ACK_TYPE:()=>$t,SDK_EVENT_TYPE:()=>Kt,SDK_HELLO_TYPE:()=>Nt,SDK_KEYDOWN_TYPE:()=>Vt,SDK_NOTIFICATION_TYPE:()=>Ht,SDK_PROTOCOL_VERSION:()=>qt,SDK_REQUEST_TYPE:()=>Lt,SDK_RESPONSE_TYPE:()=>Wt,SDK_TOOL_CALL_TYPE:()=>jt,SDK_VERSION:()=>Ri,announceProvider:()=>Cs,connectPostMessage:()=>Ts,createMockTransport:()=>ln,createOfflineCache:()=>xs,createPostMessageTransport:()=>tt,createProvider:()=>ve,detect:()=>Ms,installKeyboardForwarding:()=>As,mock:()=>Is});var Ot=["identity","storage","files:app","pm:read","agents:run","pm:write","files:workspace:read","files:workspace:write","notifications","pm:execute","pm:schedule","agents:sessions","browser:read","browser:control","settings:read","git:read","git:write","git:remote","terminal:read","terminal:exec","tools:serve","quality:read","quality:run","inference:run","endpoints:register"],yr={identity:"low",storage:"low","files:app":"low","pm:read":"medium","agents:run":"high","pm:write":"high","files:workspace:read":"high","files:workspace:write":"critical",notifications:"medium","pm:execute":"critical","pm:schedule":"critical","agents:sessions":"high","browser:read":"high","browser:control":"critical","settings:read":"low","git:read":"medium","git:write":"high","git:remote":"critical","terminal:read":"high","terminal:exec":"critical","tools:serve":"medium","quality:read":"low","quality:run":"high","inference:run":"high","endpoints:register":"high"},wr=["USER_REJECTED","SCOPE_DENIED","RATE_LIMITED","SPACE_DISCONNECTED","QUOTA_EXCEEDED","UNSUPPORTED","CANCELLED"],l=class extends Error{constructor(w,E){super(E??w);mt(this,"code");this.name="MinionryError",this.code=w}},De={maxSystemPromptChars:32e3,maxTurns:50,maxSeconds:1800,endpointsPerApp:8,maxTtlMs:864e5},ft=["quality"],br={alt:1,ctrl:2,meta:4,shift:8};var qt=1,Sr="minionry:",Nt="minionry:hello",Ft="minionry:connect",$t="minionry:connect-ack",Lt="minionry:request",Wt="minionry:response",Kt="minionry:event",Ht="minionry:notification",jt="minionry:tool-call",Vt="minionry:keydown",kr="__minionryBinding",Er="minionry#message",Ze="minionry#announce",Xe="minionry#request";function Je(d){let w="";for(let E=0;E<d.length;E+=32768)w+=String.fromCharCode(...d.subarray(E,E+32768));return btoa(w)}function et(d){let f=atob(d),w=new Uint8Array(f.length);for(let E=0;E<f.length;E++)w[E]=f.charCodeAt(E);return w}var oe=class{constructor(){mt(this,"listeners",new Map)}on(f,w){let E=this.listeners.get(f);E||(E=[],this.listeners.set(f,E));let M={cb:w};E.push(M);let A=!1;return()=>{if(A)return;A=!0;let L=this.listeners.get(f);if(!L)return;let C=L.indexOf(M);C!==-1&&L.splice(C,1)}}emit(f,w){let E=this.listeners.get(f);if(!(!E||E.length===0))for(let M of[...E])try{M.cb(w)}catch(A){console.error("[@minionry/sdk] listener error",A)}}},ts="the transport is closed \u2014 the host frame was torn down or the Space disconnected",Yt=256*1024,Rr=50*1024*1024,zt=6,ns=500,ss=d=>new Promise(f=>setTimeout(f,d));function vr(d){let f=d.lastIndexOf("/");return f===-1?d:d.slice(f+1)}var Ir="streamResume",Zt="appEndpoints",Tr="agentsAppEndpoint",Ar=["model","systemPrompt","budget","sessionId"],Cr="agentsModelSelection";function Xt(d,f){for(let w of[...f].sort((E,M)=>E.seq-M.seq))w.seq<=d.lastSeq||(d.deliver(w.event,w.payload),d.lastSeq=w.seq)}function Mr(d){return d instanceof l?d.message:String(d)}function ve(d){let f=new Map,w=new Map,E=new oe,M=0,A=!1,L,C=0,R=()=>`r${++M}`,a=(r,c,g=R())=>A?Promise.reject(new l("SPACE_DISCONNECTED",`${r} failed: ${ts}`)):new Promise((h,S)=>{f.set(g,{resolve:h,reject:S});let k={requestId:g,method:r};c!==void 0&&(k.params=c);try{d.send(k)}catch(x){f.delete(g),S(new l("SPACE_DISCONNECTED",`${r} failed: transport send threw (${String(x)})`))}}),_,O=()=>{if(!_){let r=a("features").then(c=>Array.isArray(c)?c:[],c=>{throw _===r&&(_=void 0),c});_=r}return _},Z=async(r,c)=>{if(!(await O()).includes(r))throw new l("UNSUPPORTED",`${c} needs a host that advertises the '${r}' feature \u2014 this host does not, so nothing was sent`)},ie=()=>O().then(r=>r.includes(Ir),()=>!1),q=(r,c,g)=>{w.set(r,{lastSeq:0,resuming:!1,pending:[],deliver:c,onGap:g})},P=r=>{w.delete(r)},Ie=(r,c)=>{c.resuming=!0,ie().then(g=>{if(!A){if(!g)throw new l("SCOPE_DENIED","this host does not advertise the streamResume feature");return a("stream.resume",{requestId:r,afterSeq:c.lastSeq})}}).then(g=>{if(A||!w.has(r))return;Xt(c,g&&Array.isArray(g.events)?g.events:[]);let h=c.pending;c.pending=[],c.resuming=!1,Xt(c,h)}).catch(g=>{if(A||!w.has(r))return;c.resuming=!1;let h=c.pending;c.pending=[],c.onGap(Mr(g)),Xt(c,h)})},Te=(r,c,g,h)=>{let S=w.get(r);if(S){if(c===void 0){S.deliver(g,h);return}if(S.resuming){S.pending.push({seq:c,event:g,payload:h});return}if(!(c<=S.lastSeq)){if(c===S.lastSeq+1){S.deliver(g,h),S.lastSeq=c;return}S.pending.push({seq:c,event:g,payload:h}),Ie(r,S)}}},ge=new Map,H=r=>{A||a("tools.result",r).catch(()=>{})},re=r=>{let c=ge.get(r);if(c){ge.delete(r);for(let g of c.calls.values())g.abort();c.calls.clear()}},ae=r=>{let c=ge.get(r.requestId);if(r.op==="cancel"){let k=c?.calls.get(r.callId);c?.calls.delete(r.callId),k?.abort();return}let g=c?.tools.get(r.tool);if(!c||!g){H({callId:r.callId,ok:!1,error:{code:"APP_UNAVAILABLE",message:`this app is not serving a tool named '${r.tool}'`}});return}let h=new AbortController;c.calls.set(r.callId,h);let S={callId:r.callId,tool:r.tool,signal:h.signal};Promise.resolve().then(()=>g.handler(r.input,S)).then(k=>{c.calls.delete(r.callId)&&H({callId:r.callId,ok:!0,result:k})},k=>{c.calls.delete(r.callId)&&H({callId:r.callId,ok:!1,error:{code:"APP_ERROR",message:k instanceof Error?k.message:String(k)}})})};return d.start({onResponse(r){let c=f.get(r.requestId);c&&(f.delete(r.requestId),r.ok?c.resolve(r.result):c.reject(new l(r.error.code,r.error.message)))},onEvent(r){Te(r.requestId,r.seq,r.event,r.payload)},onNotification(r){if(r.event==="intent"){C>0?E.emit("intent",r.payload):L=r.payload;return}(r.event==="disconnect"||r.event==="spaceChanged")&&(_=void 0),(r.event==="disconnect"||r.event==="grantsChanged"||r.event==="spaceChanged"||r.event==="themeChanged"||r.event==="localeChanged")&&E.emit(r.event,r.payload)},onToolCall(r){A||ae(r)},onClose(){if(A)return;A=!0;let r=new l("SPACE_DISCONNECTED",ts),c=[...f.values()];f.clear(),w.clear();for(let g of[...ge.keys()])re(g);for(let g of c)g.reject(r);E.emit("disconnect",void 0)}}),{version:"1",async features(){return await a("features")},async connect(r){return await a("connect",{scopes:r.scopes})},async disconnect(){await a("disconnect")},auth:{async getToken(){return await a("auth.getToken")}},agents:{async run(r){let c=Ar.filter(U=>r[U]!==void 0);c.length>0&&await Z(Tr,`agents.run with ${c.join(", ")}`),r.modelSelection!==void 0&&await Z(Cr,"agents.run with modelSelection");let g={prompt:r.prompt,title:r.title};for(let U of c)g[U]=r[U];r.modelSelection!==void 0&&(g.modelSelection=r.modelSelection);let h=R(),S=new oe;q(h,(U,j)=>S.emit(U,j),U=>S.emit("gap",{message:U}));let k,x;try{let U=await a("agents.run",g,h);k=U.runId,x=typeof U.sessionId=="string"?U.sessionId:""}catch(U){throw P(h),U}let v;return{id:k,sessionId:x,on(U,j){return S.on(U,j)},result(){return v??(v=a("agents.result",{runId:k}).catch(U=>{throw v=void 0,U})),v},async cancel(){await a("cancel",{requestId:h})}}},sessions:{async list(){return await a("agents.sessions.list")},async create(r){return await a("agents.sessions.create",{name:r?.name})},async attach(r){return await a("agents.sessions.attach",{sessionId:r})},async close(r){await a("agents.sessions.close",{sessionId:r})},async rename(r,c){return await a("agents.sessions.rename",{sessionId:r,name:c.name})},async history(r){return await a("agents.sessions.history",{sessionId:r})},async replay(r,c){return await a("agents.sessions.replay",{sessionId:r,afterSeq:c})},async approve(r,c){await a("agents.sessions.approve",{sessionId:r,approved:c})},async answerQuestion(r,c,g){await a("agents.sessions.answerQuestion",{sessionId:r,toolUseId:c,answers:g})},async prompt(r,c,g){return await a("agents.sessions.prompt",{sessionId:r,prompt:c,attachments:g})},async stop(r){await a("agents.sessions.stop",{sessionId:r})}}},apps:{async open(r){await a("apps.open",{app:r.app,params:r.params})}},pm:{async createBoard(r){return await a("pm.createBoard",{prompt:r.prompt,autoImplement:r.autoImplement,input:r.input})},async getBoard(r){return await a("pm.getBoard",{boardId:r})},async listBoards(){return await a("pm.listBoards",{})},async createIssue(r){return await a("pm.createIssue",r)},async updateIssue(r,c,g){return await a("pm.updateIssue",{boardId:r,issueId:c,fields:g})},async deleteIssue(r,c){await a("pm.deleteIssue",{boardId:r,issueId:c})},async updateBoard(r,c){return await a("pm.updateBoard",{boardId:r,fields:c})},onBoardUpdate(r,c){let g=R(),h=!0;return q(g,(S,k)=>{h&&S==="boardUpdate"&&c(k)},S=>{h&&E.emit("boardGap",{boardId:r,message:S})}),a("pm.subscribeBoard",{boardId:r},g).catch(S=>{h&&(h=!1,P(g),console.error(`[@minionry/sdk] pm.onBoardUpdate(${r}) subscription failed`,S))}),()=>{h&&(h=!1,P(g),A||a("cancel",{requestId:g}).catch(()=>{}))}},async execute(r){let c=R(),g=new oe;q(c,(k,x)=>g.emit(k,x),k=>g.emit("gap",{message:k}));let h;try{h=(await a("pm.execute",{boardId:r},c)).runId}catch(k){throw P(c),k}return{id:h,boardId:r,on(k,x){return g.on(k,x)},async pause(){await a("pm.pause",{boardId:r,runId:h})},async resume(){await a("pm.resume",{boardId:r,runId:h})},async stop(){await a("pm.stop",{boardId:r,runId:h})}}},schedules:{async list(){return(await a("pm.schedules.list",{})).schedules},async create(r){return await a("pm.schedules.create",r)},async update(r,c){return await a("pm.schedules.update",{scheduleId:r,patch:c})},async delete(r){await a("pm.schedules.delete",{scheduleId:r})}}},files:{async read(r){return await a("files.read",{path:r})},async readEntry(r){return await a("files.readEntry",{path:r})},async write(r,c){await a("files.write",{path:r,content:c})},async list(r){return await a("files.list",{path:r})},async delete(r){await a("files.delete",{path:r})},async mkdir(r){await a("files.mkdir",{path:r})},async rename(r,c){await a("files.rename",{path:r,newPath:c})},async search(r,c,g){let h=R(),S=new oe;q(h,(v,G)=>S.emit(v,G),v=>S.emit("gap",{message:v}));try{await a("files.search",{path:r,query:c,options:g},h)}catch(v){throw P(h),v}let k=!1;return{id:h,on(v,G){return S.on(v,G)},async cancel(){k||(k=!0,P(h),await a("cancel",{requestId:h}))}}},async definition(r,c,g){return await a("files.definition",{path:r,symbolName:c,language:g?.language,currentFile:g?.currentFile})},onChanged(r,c){let g=R(),h=!0;return q(g,(S,k)=>{h&&S==="changed"&&c(k)},S=>{h&&E.emit("fileChangeGap",{path:r,message:S})}),a("files.subscribeChanges",{path:r},g).catch(S=>{h&&(h=!1,P(g),console.error(`[@minionry/sdk] files.onChanged(${r}) subscription failed`,S))}),()=>{h&&(h=!1,P(g),A||a("cancel",{requestId:g}).catch(()=>{}))}},async upload(r,c,g){if(c.byteLength>Rr)throw new l("BAD_REQUEST",`files.upload: ${c.byteLength} bytes exceeds the 50 MiB cap`);let h=R(),S=new oe;q(h,(N,I)=>S.emit(N,I),()=>{});let k=c.byteLength,x=Math.max(1,Math.ceil(k/Yt)),v;try{v=(await a("files.uploadStart",{path:r,fileName:vr(r),fileSize:k,totalChunks:x,mimeType:g?.mimeType,overwrite:g?.overwrite},h)).uploadId}catch(N){throw P(h),N}let G=!1,U,j,le=new Promise((N,I)=>{U=N,j=I});return(async()=>{let N=0,I=0;for(;N<x;){if(G)return;let ee=N*Yt,z=Math.min(ee+Yt,k),ce=Je(c.subarray(ee,z));I+=1;try{let ue=await a("files.uploadChunk",{uploadId:v,chunkIndex:N,content:ce});S.emit("progress",{chunkIndex:N,totalChunks:x,bytesTransferred:ue.bytesWritten,totalBytes:k}),N+=1,I=0}catch(ue){if(G)return;if(I>=zt){P(h),j(ue);return}await ss(ns);try{let ne=await a("files.uploadStatus",{uploadId:v});ne.nextExpectedChunk!==N&&(I=0),N=ne.nextExpectedChunk}catch{}}}P(h),U({path:r,bytesWritten:k})})(),{id:v,on(N,I){return S.on(N,I)},result(){return le},async cancel(){G=!0,P(h),j(new l("CANCELLED","files.upload cancelled")),await a("files.uploadCancel",{uploadId:v}).catch(()=>{})}}},async download(r,c){let g=R(),h=new oe;q(g,(I,ee)=>h.emit(I,ee),()=>{});let S,k,x,v,G;try{let I=await a("files.downloadStart",{path:r,asZip:c?.asZip},g);S=I.downloadId,k=I.fileSize,x=I.totalChunks,v=I.mimeType,G=I.isZip}catch(I){throw P(g),I}let U=!1,j,le,Y=new Promise((I,ee)=>{j=I,le=ee});return(async()=>{let I=new Array(x),ee=0,z=0;for(;z<x;){if(U)return;let ne=0,$e=!1;for(;!$e&&ne<zt;){ne+=1;try{let pe=await a("files.downloadChunk",{downloadId:S,chunkIndex:z}),ke=et(pe.content);I[z]=ke,ee+=ke.byteLength,h.emit("progress",{chunkIndex:z,totalChunks:x,bytesTransferred:ee,totalBytes:k}),$e=!0}catch(pe){if(U)return;if(ne>=zt){P(g),le(pe);return}await ss(ns)}}z+=1}let ce=new Uint8Array(k),ue=0;for(let ne of I)ce.set(ne,ue),ue+=ne.byteLength;P(g),j({path:r,bytes:ce,mimeType:v,isZip:G,fileSize:k})})(),{id:S,on(I,ee){return h.on(I,ee)},result(){return Y},async cancel(){U=!0,P(g),le(new l("CANCELLED","files.download cancelled")),await a("files.downloadCancel",{downloadId:S}).catch(()=>{})}}}},storage:{async get(r){return await a("storage.get",{key:r})},async set(r,c){await a("storage.set",{key:r,value:c})},async delete(r){await a("storage.delete",{key:r})},async keys(){return await a("storage.keys")}},notifications:{async request(){await a("notifications.request")},async status(){return await a("notifications.status")},async revoke(){await a("notifications.revoke")}},theme:{async get(){return await a("theme.get")}},locale:{async get(){return await a("locale.get")}},browser:{tabs:{async list(){return await a("browser.tabs.list")},onChanged(r){let c=R(),g=!0;return q(c,(h,S)=>{g&&h==="tabsChanged"&&r(S)},()=>{}),a("browser.tabs.subscribe",void 0,c).catch(h=>{g&&(g=!1,P(c),console.error("[@minionry/sdk] browser.tabs.onChanged subscription failed",h))}),()=>{g&&(g=!1,P(c),A||a("cancel",{requestId:c}).catch(()=>{}))}}},view:{async attach(r){let c=R(),g=new oe;q(c,(v,G)=>g.emit(v,G),v=>g.emit("gap",{message:v}));let h;try{h=await a("browser.view.attach",{tabId:r?.tabId,bounds:r?.bounds},c)}catch(v){throw P(c),v}let S=h.sessionId,k=!1;return{id:S,tabId:h.tabId,on(v,G){return g.on(v,G)},async answer(v){await a("browser.view.answer",{sessionId:S,sdp:v})},async addIceCandidate(v){await a("browser.view.ice",{sessionId:S,candidate:v})},async setConnectionState(v,G){await a("browser.view.state",{sessionId:S,state:v,reason:G})},async sendInput(v){return await a("browser.view.input",{sessionId:S,input:v})},async setBounds(v){await a("browser.view.bounds",{sessionId:S,bounds:v})},async detach(){k||(k=!0,P(c),await a("cancel",{requestId:c}))}}}},async navigate(r,c){await a("browser.navigate",{url:r,tabId:c})},async back(r){await a("browser.back",{tabId:r})},async forward(r){await a("browser.forward",{tabId:r})},async reload(r){await a("browser.reload",{tabId:r})},async stop(r){await a("browser.stop",{tabId:r})},async open(r,c){return await a("browser.open",{url:r,pinnedApp:c?.pinnedApp})},async close(r){await a("browser.close",{tabId:r})},async select(r){await a("browser.select",{tabId:r})},async snapshot(r){return await a("browser.snapshot",{tabId:r})},async screenshot(r,c){return await a("browser.screenshot",{tabId:r,fullPage:c?.fullPage,format:c?.format,quality:c?.quality})},async evaluate(r,c,g){return await a("browser.evaluate",{tabId:r,expr:c,world:g?.world,timeoutMs:g?.timeoutMs})},async preflight(){return await a("browser.preflight")},async resumeDriver(r){await a("browser.resumeDriver",{tabId:r})},async setDeviceProfile(r,c){await a("browser.setDeviceProfile",{tabId:r,formFactor:c})},async automate(r,c){let g=R(),h=new oe;q(g,(v,G)=>h.emit(v,G),v=>h.emit("gap",{message:v}));let S;try{S=(await a("browser.automate",{prompt:r,engine:c?.engine,model:c?.model,tabId:c?.tabId},g)).taskId}catch(v){throw P(g),v}let k=!1;return{id:S,on(v,G){return h.on(v,G)},async approve(v,G,U){await a("browser.automate.approve",{proposalId:v,verdict:G,editedText:U})},async cancel(){k||(k=!0,P(g),await a("cancel",{requestId:g}))}}}},composer:{async autocomplete(r){return await a("composer.autocomplete",{query:r})},async skills(){return await a("composer.skills")},async snippets(r){return await a("composer.snippets",{query:r})},async settings(){return await a("composer.settings")}},terminal:{sessions:{async list(){return await a("terminal.sessions.list")},onChanged(r){let c=R(),g=!0;return q(c,(h,S)=>{g&&h==="sessionChanged"&&r(S)},()=>{}),a("terminal.sessions.subscribe",void 0,c).catch(h=>{g&&(g=!1,P(c),console.error("[@minionry/sdk] terminal.sessions.onChanged subscription failed",h))}),()=>{g&&(g=!1,P(c),A||a("cancel",{requestId:c}).catch(()=>{}))}}},async open(r){return await a("terminal.open",{cwd:r.cwd,cols:r.cols,rows:r.rows})},async attach(r){let c=R(),g=new oe;q(c,(k,x)=>g.emit(k,x),k=>g.emit("gap",{message:k}));try{await a("terminal.attach",{id:r},c)}catch(k){throw P(c),k}let h=!1;return{id:r,on(k,x){return g.on(k,x)},async detach(){h||(h=!0,P(c),await a("cancel",{requestId:c}))}}},async write(r,c){await a("terminal.write",{id:r,data:Array.isArray(c)?c.join(""):c})},async resize(r,c){await a("terminal.resize",{id:r,cols:c.cols,rows:c.rows})},async close(r){await a("terminal.close",{id:r})}},git:{async status(r){return await a("git.status",{worktree:r?.worktree})},async log(r){return await a("git.log",{worktree:r?.worktree,limit:r?.limit,skip:r?.skip,search:r?.search})},async diff(r){return await a("git.diff",{worktree:r.worktree,path:r.path,staged:r.staged})},async show(r,c){return await a("git.show",{worktree:c?.worktree,hash:r})},async commitDiff(r){return await a("git.commitDiff",{worktree:r.worktree,hash:r.hash,path:r.path})},branches:{async list(r){return await a("git.branches.list",{worktree:r?.worktree})},async create(r){return await a("git.branches.create",{worktree:r.worktree,name:r.name,startPoint:r.startPoint,checkout:r.checkout})},async delete(r){await a("git.branches.delete",{worktree:r.worktree,name:r.name,force:r.force})}},tags:{async list(r){return await a("git.tags.list",{worktree:r?.worktree})},async create(r){return await a("git.tags.create",{worktree:r.worktree,name:r.name,message:r.message,commit:r.commit})},async push(r){return await a("git.tags.push",{worktree:r?.worktree,name:r?.name,all:r?.all})}},remote:{async info(r){return await a("git.remote.info",{worktree:r?.worktree})}},repos:{async discover(){return await a("git.repos.discover")}},worktrees:{async list(){return await a("git.worktrees.list")},async create(r){return await a("git.worktrees.create",{branchName:r.branchName,baseBranch:r.baseBranch,path:r.path,assign:r.assign})},async remove(r){await a("git.worktrees.remove",{path:r.path,force:r.force,deleteBranch:r.deleteBranch})},async switchActive(r){return await a("git.worktrees.switchActive",{path:r?.path})},onChanged(r){let c=R(),g=!0;return q(c,(h,S)=>{g&&h==="worktreesChanged"&&r(S)},()=>{}),a("git.worktrees.subscribe",void 0,c).catch(h=>{g&&(g=!1,P(c),console.error("[@minionry/sdk] git.worktrees.onChanged subscription failed",h))}),()=>{g&&(g=!1,P(c),A||a("cancel",{requestId:c}).catch(()=>{}))}}},merge:{async preview(r){return await a("git.merge.preview",{worktree:r.worktree,sourceBranch:r.sourceBranch,targetBranch:r.targetBranch})},async run(r){return await a("git.merge.run",{worktree:r.worktree,sourceBranch:r.sourceBranch,targetBranch:r.targetBranch,strategy:r.strategy,commitMessage:r.commitMessage,deleteWorktree:r.deleteWorktree,deleteBranch:r.deleteBranch,stashFirst:r.stashFirst})},async abort(r){return await a("git.merge.abort",{worktree:r?.worktree})},async complete(r){return await a("git.merge.complete",{worktree:r?.worktree})},async stashPop(r){return await a("git.merge.stashPop",{worktree:r.worktree,stashSha:r.stashSha})},async discardBlockers(r){return await a("git.merge.discardBlockers",{worktree:r.worktree,paths:r.paths})}},pr:{async generateDescription(r){return await a("git.pr.generateDescription",{worktree:r?.worktree,baseBranch:r?.baseBranch})},async create(r){return await a("git.pr.create",{worktree:r.worktree,title:r.title,body:r.body,baseBranch:r.baseBranch,draft:r.draft})}},async stage(r){return await a("git.stage",{worktree:r.worktree,paths:r.paths,stageAll:r.stageAll})},async unstage(r){return await a("git.unstage",{worktree:r.worktree,paths:r.paths})},async commit(r){return await a("git.commit",{worktree:r.worktree,message:r.message})},async generateCommitMessage(r){return await a("git.generateCommitMessage",{worktree:r?.worktree})},async checkout(r){return await a("git.checkout",{worktree:r.worktree,branch:r.branch,create:r.create,startPoint:r.startPoint})},async push(r){return await a("git.push",{worktree:r?.worktree,remote:r?.remote,branch:r?.branch,setUpstream:r?.setUpstream})},async pull(r){return await a("git.pull",{worktree:r?.worktree})},onBranchChanged(r){let c=R(),g=!0;return q(c,(h,S)=>{g&&h==="branchChanged"&&r(S)},()=>{}),a("git.subscribeBranchChanged",void 0,c).catch(h=>{g&&(g=!1,P(c),console.error("[@minionry/sdk] git.onBranchChanged subscription failed",h))}),()=>{g&&(g=!1,P(c),A||a("cancel",{requestId:c}).catch(()=>{}))}},onCommitSuggestion(r){let c=R(),g=!0;return q(c,(h,S)=>{g&&h==="commitSuggestion"&&r(S)},()=>{}),a("git.subscribeCommitSuggestion",void 0,c).catch(h=>{g&&(g=!1,P(c),console.error("[@minionry/sdk] git.onCommitSuggestion subscription failed",h))}),()=>{g&&(g=!1,P(c),A||a("cancel",{requestId:c}).catch(()=>{}))}}},tools:{async register(r){let c=R(),g=new Map;for(let k of r.tools){if(g.has(k.name))throw new l("BAD_REQUEST",`tools.register: duplicate tool name '${k.name}'`);g.set(k.name,k)}ge.set(c,{tools:g,calls:new Map});try{await a("tools.register",{tools:r.tools.map(({name:k,description:x,inputSchema:v,timeoutMs:G})=>({name:k,description:x,inputSchema:v,timeoutMs:G})),profile:r.profile},c)}catch(k){throw re(c),k}let h=!1;return{id:c,tools:[...g.keys()],async unregister(){h||(h=!0,re(c),await a("cancel",{requestId:c}))}}}},quality:{async state(){return await a("quality.state")},async detectTools(r){return await a("quality.detectTools",{path:r})},async run(r){let c=R(),g=new oe;q(c,(v,G)=>g.emit(v,G),()=>{});let h;try{h=await a("quality.run",{path:r},c)}catch(v){throw P(c),v}let S=h.path,k;return{path:S,attached:h.attached===!0,on(v,G){return g.on(v,G)},result(){return k??(k=a("quality.result",{path:S}).catch(v=>{throw k=void 0,v})),k}}},async cancel(r){await a("quality.cancel",{path:r})},async installTools(r,c){return await a("quality.installTools",{path:r,tools:c})},async saveDirectories(r){await a("quality.saveDirectories",{directories:r})},async settings(){return await a("quality.settings")},async setSettings(r){return await a("quality.setSettings",r)},onChanged(r){let c=R(),g=!0;return q(c,(h,S)=>{g&&h==="changed"&&r(S)},()=>{}),a("quality.subscribeChanges",void 0,c).catch(h=>{g&&(g=!1,P(c),console.error("[@minionry/sdk] quality.onChanged subscription failed",h))}),()=>{g&&(g=!1,P(c),A||a("cancel",{requestId:c}).catch(()=>{}))}},async setFindingState(r){return await a("quality.setFindingState",r)},schedules:{async list(){return(await a("quality.schedules.list",{})).schedules},async create(r){return await a("quality.schedules.create",r)},async update(r,c){return await a("quality.schedules.update",{scheduleId:r,patch:c})},async delete(r){await a("quality.schedules.delete",{scheduleId:r})}}},inference:{async chat(r){let c=R(),g=new oe;q(c,(x,v)=>g.emit(x,v),x=>g.emit("gap",{message:x}));let h;try{let x={messages:r.messages,system:r.system,engine:r.engine,model:r.model,effortLevel:r.effortLevel};h=(await a("inference.chat",x,c)).runId}catch(x){throw P(c),x}let S;return{id:h,on(x,v){return g.on(x,v)},result(){return S??(S=a("inference.result",{runId:h}).catch(x=>{throw S=void 0,x})),S},async cancel(){await a("cancel",{requestId:c})}}}},endpoints:{async register(r){return await Z(Zt,"endpoints.register"),await a("endpoints.register",r)},async unregister(r){await Z(Zt,"endpoints.unregister"),await a("endpoints.unregister",{id:r})},async list(){return await Z(Zt,"endpoints.list"),await a("endpoints.list")}},on(r,c){let g=E.on(r,c);if(r==="intent"){if(C++,L!==void 0){let S=L;L=void 0,c(S)}let h=!1;return()=>{h||(h=!0,C--,g())}}return g}}}var xr={id:"space-mock",name:"Mock Space"},Br={id:"user-mock",name:"Mock User",role:"owner"},rs={mode:"light",tokens:{background:"#faf9f5",surface:"#f0efe8",foreground:"#141413",foregroundMuted:"#6b6a68",accent:"#ae5630",border:"rgba(20, 20, 19, 0.1)"}},Pr={locale:"en",dir:"ltr"},Dr=["agents","apps","pm","files","storage","notifications","mock","role","streamResume","theme","browser","agentsRichStream","composer","browserAutomate","browserView","git","terminal","appTools","quality","locale","browserOps","inference","appEndpoints","agentsAppEndpoint","qualityFindingState","agentsModelSelection","qualitySchedules"],_r=[{id:"tab-mock-1",url:"https://minionry.com/",title:"Minionry",isLoading:!1,canGoBack:!1,canGoForward:!1}],Qr="iVBORw0KGgoAAAANSUhEUgAAAAEAAAABCAYAAAAfFcSJAAAADUlEQVR42mNk+M9QDwADhgGAWjR9awAAAABJRU5ErkJggg==",Gr=[{name:"code-review",displayName:"/code-review",description:"Comprehensive code review of the current changes.",source:"platform"},{name:"board",displayName:"/board",description:"Convert the current chat conversation into a PM board with issues.",source:"platform"}],Ur=[{name:"standup",aliases:["su"],description:"Daily standup update template",origin:"personal",preview:"Yesterday: \u2026 Today: \u2026 Blockers: \u2026",bodyLength:42}],is=64,os=["todo","in_progress","done"],as="2026-01-01",ls={issue:"IS",epic:"EP",bug:"BG",task:"TASK"},Rs="workspace:",cs=d=>d.startsWith(Rs)?"files:workspace:read":"files:app",us=d=>d.startsWith(Rs)?"files:workspace:write":"files:app",Or=new Set(["files.read","files.readEntry","files.list","files.search","files.definition","files.subscribeChanges","files.downloadStart"]),qr=new Set(["files.write","files.delete","files.mkdir","files.rename","files.uploadStart"]),ds={features:null,connect:null,disconnect:null,"auth.getToken":"identity","agents.run":"agents:run","agents.result":"agents:run","agents.sessions.list":"agents:sessions","agents.sessions.create":"agents:sessions","agents.sessions.attach":"agents:sessions","agents.sessions.close":"agents:sessions","agents.sessions.rename":"agents:sessions","agents.sessions.history":"agents:sessions","agents.sessions.replay":"agents:sessions","agents.sessions.approve":"agents:sessions","agents.sessions.answerQuestion":"agents:sessions","agents.sessions.prompt":"agents:sessions","agents.sessions.stop":"agents:sessions","apps.open":null,cancel:null,"pm.createBoard":"pm:write","pm.getBoard":"pm:read","pm.listBoards":"pm:read","pm.createIssue":"pm:write","pm.updateIssue":"pm:write","pm.deleteIssue":"pm:write","pm.updateBoard":"pm:write","pm.subscribeBoard":"pm:read","stream.resume":null,"pm.execute":"pm:execute","pm.pause":null,"pm.resume":null,"pm.stop":null,"pm.schedules.list":"pm:schedule","pm.schedules.create":"pm:schedule","pm.schedules.update":"pm:schedule","pm.schedules.delete":"pm:schedule","files.read":"files:app","files.readEntry":"files:app","files.write":"files:app","files.list":"files:app","files.delete":"files:app","files.mkdir":"files:app","files.rename":"files:app","files.search":"files:app","files.definition":"files:app","files.subscribeChanges":"files:app","files.uploadStart":"files:app","files.uploadChunk":"files:app","files.uploadStatus":"files:app","files.uploadCancel":"files:app","files.downloadStart":"files:app","files.downloadChunk":"files:app","files.downloadCancel":"files:app","storage.get":"storage","storage.set":"storage","storage.delete":"storage","storage.keys":"storage","notifications.request":"notifications","notifications.status":"notifications","notifications.revoke":"notifications","theme.get":null,"locale.get":null,"browser.tabs.list":"browser:read","browser.tabs.subscribe":"browser:read","browser.navigate":"browser:control","browser.open":"browser:control","browser.close":"browser:control","browser.select":"browser:control","browser.snapshot":"browser:control","browser.screenshot":"browser:control","browser.evaluate":"browser:control","browser.automate":"browser:control","browser.automate.approve":"browser:control","browser.back":"browser:control","browser.forward":"browser:control","browser.reload":"browser:control","browser.stop":"browser:control","browser.view.attach":"browser:control","browser.view.answer":"browser:control","browser.view.ice":"browser:control","browser.view.state":"browser:control","browser.view.input":"browser:control","browser.view.bounds":"browser:control","browser.preflight":"browser:read","browser.resumeDriver":"browser:control","browser.setDeviceProfile":"browser:control","composer.autocomplete":"files:workspace:read","composer.skills":"settings:read","composer.snippets":"settings:read","composer.settings":"settings:read","terminal.sessions.list":"terminal:read","terminal.sessions.subscribe":"terminal:read","terminal.attach":"terminal:read","terminal.open":"terminal:exec","terminal.write":"terminal:exec","terminal.resize":"terminal:exec","terminal.close":"terminal:exec","git.status":"git:read","git.log":"git:read","git.diff":"git:read","git.show":"git:read","git.commitDiff":"git:read","git.branches.list":"git:read","git.tags.list":"git:read","git.remote.info":"git:read","git.repos.discover":"git:read","git.worktrees.list":"git:read","git.merge.preview":"git:read","git.pr.generateDescription":"git:read","git.branches.create":"git:write","git.branches.delete":"git:write","git.tags.create":"git:write","git.worktrees.create":"git:write","git.worktrees.remove":"git:write","git.worktrees.switchActive":"git:write","git.worktrees.subscribe":"git:read","git.merge.run":"git:write","git.merge.abort":"git:write","git.merge.complete":"git:write","git.merge.stashPop":"git:write","git.merge.discardBlockers":"git:write","git.stage":"git:write","git.unstage":"git:write","git.commit":"git:write","git.generateCommitMessage":"git:write","git.checkout":"git:write","git.tags.push":"git:remote","git.pr.create":"git:remote","git.push":"git:remote","git.pull":"git:remote","git.subscribeBranchChanged":"git:read","git.subscribeCommitSuggestion":"git:read","tools.register":"tools:serve","tools.result":"tools:serve","quality.state":"quality:read","quality.detectTools":"quality:read","quality.result":"quality:read","quality.settings":"quality:read","quality.subscribeChanges":"quality:read","quality.run":"quality:run","quality.cancel":"quality:run","quality.installTools":"quality:run","quality.saveDirectories":"quality:run","quality.setSettings":"quality:run","inference.chat":"inference:run","inference.result":"inference:run","endpoints.register":"endpoints:register","endpoints.unregister":"endpoints:register","endpoints.list":"endpoints:register","quality.setFindingState":"quality:run","quality.schedules.list":"quality:read","quality.schedules.create":"quality:run","quality.schedules.update":"quality:run","quality.schedules.delete":"quality:run"},Nr="mock-app",gs=/^[a-z0-9][a-z0-9-]{0,31}$/,Fr=80,$r=200,ps=4096,ht=2048,Lr=36e5,ms=["hermes"],Wr="{ id, label, engine, baseUrl, apiKey, model, contextLength?, ttlMs? }",Kr=new Set(["id","label","engine","baseUrl","apiKey","model","contextLength","ttlMs"]),Hr=/[\u0000-\u001f\u007f]/,jr=/[\s\u0000-\u001f\u007f]/,Vr=["localhost","local","internal","home.arpa"],Yr="{ prompt, title?, model?, modelSelection?, systemPrompt?, budget?: { maxTurns?, maxSeconds? }, sessionId? }",zr=new Set(["prompt","title","model","modelSelection","systemPrompt","budget","sessionId"]),Zr=new Set(["maxTurns","maxSeconds"]),nn=d=>new TextEncoder().encode(d).length;function Xr(d){let f;try{f=new URL(d)}catch{return{ok:!1,reason:"is not a valid absolute URL"}}if(f.protocol!=="https:")return{ok:!1,reason:"must use https"};if(f.username!==""||f.password!=="")return{ok:!1,reason:"must not carry credentials"};if(f.search!==""||f.href.includes("?"))return{ok:!1,reason:"must not carry a query"};if(f.hash!==""||f.href.includes("#"))return{ok:!1,reason:"must not carry a fragment"};let w=f.hostname.replace(/\.+$/,"").toLowerCase();if(w==="")return{ok:!1,reason:"must name a host"};if(w.startsWith("[")||/^\d{1,3}(\.\d{1,3}){3}$/.test(w))return{ok:!1,reason:"must name a hostname, not an IP address"};if(Vr.some(M=>w===M||w.endsWith(`.${M}`)))return{ok:!1,reason:"must not name a local-network host"};let E=`${f.origin}${f.pathname==="/"?"":f.pathname}`;return nn(E)>ht?{ok:!1,reason:`must be at most ${ht} bytes`}:{ok:!0}}var Jr=3e4,ei=12e4,Ne="/workspace",_e="main",fs="https://github.com/mock-org/mock-repo.git",hs=256*1024,ti=200,se=".",ys="2026-04-13T18:29:50.235Z",ni="2026-04-12T11:02:17.410Z",Jt="docs",en="packages/legacy",si="quality: agent turn",ri="quality: worktree turn",on="src/services/report-builder.ts",ws=[{name:"eslint",installed:!0,installCommand:"npm install -D eslint",category:"linter"},{name:"prettier",installed:!0,installCommand:"npm install -D prettier",category:"formatter"},{name:"typescript",installed:!0,installCommand:"npm install -D typescript",category:"general"},{name:"biome",installed:!1,installCommand:"npm install -D @biomejs/biome",category:"linter"},{name:"jscpd",installed:!1,installCommand:"npm install -D jscpd",category:"general"},{name:"pip-audit",installed:!1,installCommand:"pip install pip-audit",category:"security"}],an=["node","python"],sn=[{severity:"high",category:"secrets",file:"src/config/analytics.ts",line:7,title:"generic-api-key",description:"Detected a Generic API Key, potentially exposing access to various services and sensitive operations.",suggestion:"Move the value to the environment and rotate it \u2014 it is already in git history.",fingerprint:"eaaf9634c34ff05fcb3378ffb5e68fa1947ef88ac35cdc75d011850cba70375b",introduced:!0},{severity:"high",category:"dependencies",file:"package-lock.json",line:null,title:"serialize-anything <2.1.4 \u2014 prototype pollution (GHSA-8q2v-w5xj-3rpc)",description:"npm audit reports advisory GHSA-8q2v-w5xj-3rpc (high) against serialize-anything 2.0.3; fixed in 2.1.4.",suggestion:"npm update serialize-anything",fingerprint:"48acfa3b78b839a91211c2b529dee95a9347e064043e93a3cbbf6c9dd14c3d64",introduced:!0},{severity:"high",category:"complexity",file:"src/services/report-builder.ts",line:214,title:"buildReport() has cyclomatic complexity 21",description:"Complexity 21 exceeds the threshold of 10. Rank: D.",status:"confirmed",confidence:.92,triageRationale:"21 real branches, no dead paths.",fingerprint:"f3b867d61d68176490529d8d31ddd5c1cea0edd896272d5195e228758a0aabab",introduced:!1},{severity:"medium",category:"file-length",file:"src/services/report-builder.ts",line:null,title:"report-builder.ts is 812 lines",description:"Exceeds the 600-line module threshold.",status:"confirmed",fingerprint:"692f9acde06f364ab152df3ef1a534129b96ae01e5f6abdf9e536fd5a7692b8b",introduced:!1},{severity:"medium",category:"security",file:"src/routes/export.ts",line:58,title:"User-supplied filename reaches the filesystem unvalidated",description:"The `name` query param is joined onto a directory without normalization.",suggestion:"Reject any name containing a path separator before joining.",status:"uncertain",confidence:.41,triageRationale:"The caller may normalize upstream \u2014 not verified.",fingerprint:"5b3892962cb1f2731d3dfcb4ada8c39d3424182dde4d173ccfdee4f99609745c",introduced:!1},{severity:"medium",category:"duplication",file:"src/services/summary-builder.ts",line:118,title:"Duplicated block (18 lines, 96 tokens)",description:"src/services/summary-builder.ts:118\u2013135 duplicates src/services/report-builder.ts:340\u2013357.",suggestion:"Extract the shared row-mapping into one helper both builders call.",status:"confirmed",confidence:.88,triageRationale:"A verbatim clone, not a coincidental resemblance.",fingerprint:"7648ed24afef95de19a59a26fb47bbb5feaa9b8a929bd96dbb8acbcd392f59eb",introduced:!1},{severity:"low",category:"tech-debt",file:"src/hooks/useTrend.ts",line:12,title:"TODO: replace the placeholder trend window",description:"Marker left since the initial implementation.",status:"likely-fp",confidence:.78,triageRationale:"An honest note about a deliberate default, not debt.",fingerprint:"43905119f9df837bb902c93a225f8d645f309fb0731ea29be2aa89c171764517",introduced:!1}],vs=[{severity:"high",category:"architecture",file:"src/services/report-builder.ts",line:null,title:"Report assembly and persistence are the same unit",description:"Assembly and persistence cannot be exercised separately.",suggestion:"Extract a ReportWriter so assembly can be tested without I/O.",evidence:"buildReport() calls writeFile() directly at three points.",verified:!0,verificationNote:"Confirmed against the current file.",fingerprint:"6aaa6a35b6b751d2cb4a036fef9c851025790c33e7f0d871620ac7c39bafcb3e",introduced:!1}],ii={severity:"low",category:"lint",file:on,line:231,title:"no-unused-vars",description:"'legacyTotals' is assigned a value but never used.",fingerprint:"82e9506cdeed63aac266450c76fa3e6d13b762386383140584cce360f5108fe2",introduced:!0},rn=(d,f)=>d.map(({introduced:w,...E})=>f?{...E,introduced:w}:E),oi=d=>({available:!0,sampledAt:d,sampledTurns:61,truncated:!1,attributedTurns:19,unattributed:{missingOutputTokens:2,outsideSpaceRoot:4,unknownWriteTools:1},unreadableFiles:0,files:[{file:"src/services/report-builder.ts",turns:9,medianOutputTokens:6420,medianDurationMs:212e3},{file:"src/services/summary-builder.ts",turns:3,reason:"3 turns; 5 needed"}],comparison:{withStructuralFindings:{turns:12,medianOutputTokens:5880},withoutStructuralFindings:{turns:7,reason:"7 turns; 10 needed"}}}),ai={sha:"3f9c2a7e1b5d4c6f8a0e9b2d7c1f4a6e8b3d5c7f",branch:"main",dirty:!0},li=()=>({files:96,extensions:[".py",".ts",".tsx"]}),ci=d=>({available:!0,windowDays:90,commitsScanned:d?143:37,truncated:!1,files:{"src/services/report-builder.ts":{commits:17,linesChanged:1204,lastChangedAt:"2026-04-12T16:41:03.000Z"},"src/index.ts":{commits:11,linesChanged:402,lastChangedAt:"2026-04-13T09:20:31.000Z"},...d?{"package-lock.json":{commits:9,linesChanged:2876,lastChangedAt:"2026-04-10T14:55:00.000Z"}}:{},"src/routes/index.ts":{commits:8,linesChanged:265,lastChangedAt:"2026-04-08T17:30:12.000Z"},"src/services/summary-builder.ts":{commits:6,linesChanged:318,lastChangedAt:"2026-04-09T10:12:47.000Z"},"src/config/analytics.ts":{commits:2,linesChanged:41,lastChangedAt:"2026-04-11T08:03:19.000Z"}}}),ui=d=>d>=90?"A":d>=80?"B":d>=70?"C":"F",tn=(d,f,w,E)=>{let M=d===se,A=rn(M?sn:sn.filter(L=>L.category!=="dependencies"),E!==void 0);return{path:d,overall:87,grade:"B+",dimensions:[{name:"security",score:94,grade:"A",rationale:M?"One leaked key, one vulnerable dependency, one unverified input-handling finding.":"One leaked key, one unverified input-handling finding.",available:!0,findingCount:M?3:2,worstSeverity:"high"},{name:"reliability",score:88,grade:"B+",rationale:"Lint and build clean; one complexity hot spot.",available:!0,findingCount:1,worstSeverity:"high"},{name:"maintainability",score:81,grade:"B-",rationale:"One oversized module carries the debt, and a block of it is duplicated.",available:!0,findingCount:3,worstSeverity:"medium"}],categories:[{name:"Linting",score:100,available:!0,issueCount:0},{name:"Build",score:100,available:!0,issueCount:0},{name:"complexity",score:88,available:!0,issueCount:1},{name:"file-length",score:82,available:!0,issueCount:1},{name:"security",score:94,available:!0,issueCount:1},{name:"Duplication",score:90,available:!0,issueCount:1},{name:"Secrets",score:80,available:!0,issueCount:1},M?{name:"Dependencies",score:85,available:!0,issueCount:1}:{name:"Dependencies",score:0,available:!1,issueCount:0,reason:`npm audit needs a lockfile and ${d} has no package-lock.json \u2014 the audit did not run.`}],findings:A,codeReview:w?rn(vs,E!==void 0):[],analyzedFiles:128,totalLines:24680,timestamp:f,ecosystem:[...an],scoreBreakdown:{penaltyDensity:1.3,totalPenalty:M?52.7:47.3,issueDensity:M?.24:.2,kloc:24.7,categoryPenalties:[{category:"complexity",score:88,grade:"B+",penalty:14.4,findingCount:1},{category:"file-length",score:82,grade:"B-",penalty:11.2,findingCount:1},{category:"security",score:94,grade:"A",penalty:6.5,findingCount:1},{category:"duplication",score:90,grade:"A",penalty:4.1,findingCount:1},{category:"secrets",score:80,grade:"B",penalty:11.1,findingCount:1},...M?[{category:"dependencies",score:85,grade:"B",penalty:5.4,findingCount:1}]:[]]},gate:{passed:!0,failingConditions:[]},gradeRationale:"No critical findings; the high-severity hot spot and the leaked key hold the grade at B+.",readiness:{level:"develop",headline:"Ready for development",rationale:"Nothing blocking, but the leaked key and the hot spot should land before a release cut.",blockers:["src/config/analytics.ts:7 \u2014 generic-api-key","src/services/report-builder.ts:214 \u2014 buildReport() has cyclomatic complexity 21"]},triage:{total:5,confirmed:3,likelyFalsePositive:1,uncertain:1},scanDurationMs:42e3,...w?{reviewDurationMs:96e3}:{},...E===void 0?{}:{baselineAt:E},agentCost:M?oi(f):{available:!1,reason:"mock: .minionry/history/ could not be read \u2014 the Space history is missing or unreadable."},structuralScope:li(),changeActivity:ci(M),commit:{...ai}}},di=(d,f)=>{let w=`No ecosystem was detected in ${d}, so no analyzer ran.`,E=(M,A)=>({name:M,score:0,available:!1,issueCount:0,reason:A});return{path:d,overall:null,grade:"N/A",dimensions:["security","reliability","maintainability"].map(M=>({name:M,score:null,grade:"N/A",rationale:"No tooling was available to evaluate this directory.",available:!1,findingCount:0,worstSeverity:null})),categories:[E("Linting",w),E("Build",w),E("complexity",w),E("file-length",w),E("Duplication","jscpd is not installed (npm install -D jscpd)."),E("Secrets","gitleaks is not on PATH \u2014 https://github.com/gitleaks/gitleaks#installing"),E("Dependencies","No lockfile was found \u2014 npm audit, pip-audit and cargo audit each need one.")],findings:[],codeReview:[],analyzedFiles:0,totalLines:0,timestamp:f,ecosystem:[],gradeRationale:"No tooling was available, so no grade could be computed.",readiness:{level:"insufficient-data",headline:"Not enough data",rationale:"No dimension was available and no files were analyzed \u2014 nothing was evaluated.",blockers:[]},scanDurationMs:1200,agentCost:{available:!0,sampledAt:f,sampledTurns:61,truncated:!1,attributedTurns:0,unattributed:{missingOutputTokens:0,outsideSpaceRoot:0,unknownWriteTools:0},unreadableFiles:0,files:[],comparison:{withStructuralFindings:{turns:0,reason:"0 turns; 10 needed"},withoutStructuralFindings:{turns:0,reason:"0 turns; 10 needed"}}},changeActivity:{available:!1,reason:`mock: ${d} is not inside a git work tree \u2014 the change-activity sample did not run.`,windowDays:90,commitsScanned:0,truncated:!1,files:{}}}},bs=(d,f,w)=>({path:d,overall:79,grade:"C+",dimensions:[{name:"security",score:100,grade:"A+",rationale:"No security findings in the files this turn wrote.",available:!0,findingCount:0,worstSeverity:null},{name:"reliability",score:84,grade:"B",rationale:"One new lint hit; the complexity hot spot is unchanged.",available:!0,findingCount:2,worstSeverity:"high"},{name:"maintainability",score:78,grade:"C+",rationale:"The oversized module is still oversized.",available:!0,findingCount:1,worstSeverity:"medium"}],categories:[{name:"Linting",score:92,available:!0,issueCount:1},{name:"Build",score:100,available:!0,issueCount:0},{name:"complexity",score:88,available:!0,issueCount:1},{name:"file-length",score:82,available:!0,issueCount:1}],findings:rn([ii,...sn.filter(E=>E.file===on)],w!==void 0),codeReview:[],analyzedFiles:1,totalLines:812,timestamp:f,ecosystem:[...an],gradeRationale:"Scoped to the files this turn wrote \u2014 not a grade for the directory.",scanDurationMs:3400,...w===void 0?{}:{baselineAt:w},structuralScope:{files:1,extensions:[".ts"]}}),Ss=d=>({timestamp:d.timestamp,overall:d.overall,grade:d.grade,issueDensity:d.scoreBreakdown?.issueDensity,categoryScores:d.categories.filter(f=>f.available).map(f=>({category:f.name,score:f.score,grade:ui(f.score)})),dimensionScores:Object.fromEntries(d.dimensions.map(f=>[f.name,{score:f.score,grade:f.grade}])),directories:[{path:d.path,score:d.overall,grade:d.grade}],scanDurationMs:d.scanDurationMs,reviewDurationMs:d.reviewDurationMs,...d.commit===void 0?{}:{commit:{...d.commit}}}),ks=1e3,Es=500;function ln(d={}){let f={...xr,...d.space},w=d.user===null?null:{...Br,...d.user},E=new Set(d.deniedScopes??[]),M=d.errors??{},A={...rs,...d.theme,tokens:{...rs.tokens,...d.theme?.tokens}},L={...Pr,...d.locale},C=new Set,R=!1,a=new Map(Object.entries(d.files??{})),_=new Set,O=new Map,Z=new Map,ie=new Map,q=new Map;for(let[e,t]of Object.entries(d.storage??{}))q.set(e,structuredClone(t));let P=new Map,Ie=new Map,Te=new Map,ge=new Map,H=new Map,re=new Map,ae=new Map,r=new Map,c=new Map,g=new Map,h=new Map,S=new Map,k=new Map,x=_r.map(e=>({...e})),v=x[0]?.id??null,G=new Set,U=1,j=new Map,le=new Map,Y=new Map,N=[],I=new Map,ee=new Map,z=new Map,ce=null,ue=new Set,ne=new Set,$e=new Set,pe=new Map,ke=new Map,Le=new Set,Ee=new Map,nt=new Map,Bs=0,un=[{path:se,label:"Workspace"},{path:Jt,label:"Docs"},{path:en,label:"Legacy"}],we=new Map,yt=[],wt=[],be=new Map,Qe=new Map,st=new Map,Ge=new Set,Ae=[],dn=0,gn=new Map,me={engine:"claude-code",model:"default",effortLevel:"auto",fastMode:!1,agentNotes:!0},pn=!1,bt=new Map;{let e=tn(se,ys,!0,ni);we.set(se,e),yt.push(Ss(e)),wt=[{kind:"codeReview",path:se,completedAt:ys,findings:vs.map(t=>({...t}))}]}let de,Ue=!1,X=0,F=new Map,K=new Map,Oe=new Set,Ce=e=>{queueMicrotask(()=>{Ue||e()})},V=e=>{let t=setTimeout(()=>{Oe.delete(t),Ue||e()},0);Oe.add(t)},rt=(e,t)=>{Ce(()=>de?.onResponse({requestId:e,ok:!0,result:t}))},We=(e,t)=>{Ce(()=>de?.onResponse({requestId:e,ok:!1,error:t}))},$=(e,t,n)=>{let s=(F.get(e)??0)+1;F.set(e,s);let i=n!==void 0?{seq:s,event:t,payload:n}:{seq:s,event:t},o=K.get(e);o?o.push(i):K.set(e,[i]),Ce(()=>de?.onEvent({requestId:e,event:t,payload:n,seq:s}))},Ps=(e,t)=>{Ce(()=>de?.onNotification({event:e,payload:t}))},mn=(e,t,n)=>{let s=(F.get(e)??0)+1;F.set(e,s),Ce(()=>de?.onEvent({requestId:e,event:t,payload:n,seq:s}))},y=(e,t)=>{if(typeof e!="object"||e===null)throw new l("BAD_REQUEST",`${t}: params must be an object`);return e},p=(e,t,n)=>{if(typeof e!="string")throw new l("BAD_REQUEST",`${n}: '${t}' must be a string`);return e},fn=(e,t)=>{if(typeof e!="object"||e===null)throw new l("BAD_REQUEST",`${t}: timing must be an object`);let n=e;if(n.kind==="once"&&typeof n.at=="string"&&!Number.isNaN(Date.parse(n.at)))return{kind:"once",at:n.at};if(n.kind==="interval"&&typeof n.everyMs=="number"&&Number.isFinite(n.everyMs))return{kind:"interval",everyMs:n.everyMs};if(n.kind==="continuous")return{kind:"continuous"};throw new l("BAD_REQUEST",`${t}: invalid timing`)},hn=(e,t)=>{if(e.kind==="once"){let n=new Date(e.at);return n.getTime()>=t.getTime()?n.toISOString():null}return e.kind==="interval"?new Date(t.getTime()+e.everyMs).toISOString():null},yn=e=>{if(e.status==="running")return;let t={status:e.status,text:e.text};for(let n of e.waiters)rt(n,t);e.waiters=[]},wn=e=>{let t=Y.get(e.sessionId);t&&(t.isExecuting=!1,t.lastActivityAt=new Date().toISOString())},bn=e=>{if(e.status!=="running")return;let t=e.steps.shift();if(!t){if(e.status="done",$(e.requestId,"status",{status:"done"}),yn(e),wn(e),e.agentTurn!==void 0){Js(e.agentTurn);return}if(!pn&&Ge.size>0){pn=!0;let n=we.get(se)??tn(se,new Date().toISOString(),!0,void 0);Se({kind:"postSession",path:se,report:n})}return}t.event==="output"&&(e.text+=t.payload.text),$(e.requestId,t.event,t.payload),V(()=>bn(e))},Sn=e=>{e.status==="running"&&(e.status="cancelled",e.steps=[],$(e.requestId,"status",{status:"cancelled"}),yn(e),wn(e))},St=(e,t)=>Date.parse(e.expiresAt)>t,kn=(e,t,n,s)=>{let i=Object.keys(e).filter(o=>!t.has(o));if(i.length>0)throw new l("BAD_REQUEST",`${n}: unknown param${i.length>1?"s":""} ${i.map(o=>`'${o}'`).join(", ")} \u2014 expected ${s}`)},kt=(e,t,n,s)=>{if(typeof e!="object"||e===null||Array.isArray(e))throw new l("BAD_REQUEST",`${t} requires params ${n}`);let i=e;return kn(i,s,t,n),i},En=(e,t)=>{if(typeof e!="string"||!gs.test(e))throw new l("BAD_REQUEST",`${t}: id must match ${gs.source}`);return e},Rn=(e,t,n)=>{if(typeof e!="string"||e.trim()===""||e.length>n||Hr.test(e))throw new l("BAD_REQUEST",`endpoints.register: ${t} must be a non-empty string of at most ${n} characters, without control characters`);return e.trim()},vn=(e,t)=>{if(e!=null){if(typeof e!="number"||!Number.isSafeInteger(e)||e<=0)throw new l("BAD_REQUEST",`endpoints.register: ${t} must be a positive integer when present`);return e}},In=e=>{let t=Date.now(),n=[...H.values()].find(s=>s.modelValue===e&&St(s,t));if(!n)throw new l("MODEL_NOT_ALLOWED",`agents.run: model '${e}' is not a live endpoint this app registered in this Space \u2014 register one with endpoints.register and pass its modelValue`);return n},Ds=e=>{if(e===void 0)return;let t=ft.find(n=>n===e);if(!t){let n=ft.map(s=>`'${s}'`).join(", ");throw new l("BAD_REQUEST",`agents.run modelSelection must be one of ${n} when present`)}if(!C.has("quality:read"))throw new l("SCOPE_DENIED",`agents.run: modelSelection '${t}' needs the quality:read scope`);if(me.engine!=="claude-code")throw new l("ENGINE_UNAVAILABLE",`agents.run: the Quality model runs on ${me.engine}, and only Claude Code can run an app session with tools \u2014 choose a Claude Code model for Quality`);if(me.model.startsWith("custom:claude-code:"))throw new l("MODEL_NOT_ALLOWED",`agents.run: the Quality model '${me.model}' is not a Claude Code model added on this machine \u2014 choose another model for Quality`);return t},_s=e=>{let t=kt(e,"agents.run",Yr,zr),n=p(t.prompt,"prompt","agents.run"),s=typeof t.title=="string"?t.title:void 0,i=Q=>{let B=t[Q];if(B!==void 0){if(typeof B!="string"||B==="")throw new l("BAD_REQUEST",`agents.run ${Q} must be a non-empty string when present`);return B}},o=i("model"),u=i("sessionId"),{systemPrompt:m,budget:b,modelSelection:T}=t;if(m!==void 0&&(typeof m!="string"||m.length>De.maxSystemPromptChars))throw new l("BAD_REQUEST",`agents.run systemPrompt must be a string of at most ${De.maxSystemPromptChars} characters`);if(b!==void 0){if(typeof b!="object"||b===null||Array.isArray(b))throw new l("BAD_REQUEST","agents.run budget must be an object { maxTurns?, maxSeconds? }");let Q=b;kn(Q,Zr,"agents.run budget","{ maxTurns?, maxSeconds? }");for(let B of["maxTurns","maxSeconds"]){let W=Q[B];if(W!==void 0&&(typeof W!="number"||!Number.isSafeInteger(W)||W<=0))throw new l("BAD_REQUEST",`agents.run budget.${B} must be a positive integer when present`)}}if(u!==void 0&&(o!==void 0||T!==void 0||m!==void 0||b!==void 0))throw new l("BAD_REQUEST","agents.run with sessionId continues that session on its own model, systemPrompt and budget \u2014 omit model, modelSelection, systemPrompt and budget");if(o!==void 0&&T!==void 0)throw new l("BAD_REQUEST","agents.run takes model or modelSelection, not both");if(o===void 0&&(m!==void 0||b!==void 0))throw new l("BAD_REQUEST","agents.run systemPrompt and budget apply only to a run on an app-registered model \u2014 pass model");return Ds(T),{prompt:n,title:s,model:o,sessionId:u}},Qs=(e,t,n)=>{let s=Date.now(),i=t.length>120?`${t.slice(0,119)}\u2026`:t,o=[`(mock ${e.engine} \xB7 ${e.model}) `,`Turn ${n}: ${i}
3
- `,"Done (mock)."];return[{event:"status",payload:{status:"running"}},{event:"timelineEvent",payload:{kind:"status",at:s,executing:!0,turn:n}},...o.flatMap(u=>[{event:"output",payload:{text:u}},{event:"timelineEvent",payload:{kind:"text",at:s,entryId:`mock-text-${n}`,delta:u}}]),{event:"timelineEvent",payload:{kind:"status",at:s,executing:!1,turn:n}}]},Tn={inputTokens:64,outputTokens:16},An=e=>({status:e.status==="running"?"done":e.status,text:e.text,engine:e.engine,...e.model?{model:e.model}:{},...e.status==="done"?{usage:{...Tn}}:{}}),Cn=e=>{$(e.requestId,"status",{status:e.status});for(let t of e.waiters)rt(t,An(e));e.waiters=[]},Mn=e=>{if(e.status!=="running")return;let t=e.deltas.shift();if(t===void 0){$(e.requestId,"usage",{...Tn}),e.status="done",Cn(e);return}e.text+=t,$(e.requestId,"delta",{text:t}),V(()=>Mn(e))},Gs=e=>{e.status==="running"&&(e.status="cancelled",e.deltas=[],Cn(e))},it=e=>({id:e.id,name:e.name,createdAt:e.createdAt,lastActivityAt:e.lastActivityAt,isExecuting:e.isExecuting}),Us=e=>({id:e.id,title:e.title,status:e.status,type:e.type,priority:e.priority,labels:[...e.labels]}),Et=e=>({boardId:e.boardId,title:e.title,statuses:[...e.statuses],issues:e.issues.map(Us)}),xn=e=>({id:e.boardId,title:e.title,status:e.completedAt?"completed":e.status,goal:e.goal,created:e.createdAt,completedAt:e.completedAt}),ot=(e,t,n)=>({id:e,title:t,type:"issue",status:os[0],priority:n,estimate:null,labels:[],epicId:null,blockedBy:[],blocks:[],description:"",acceptanceCriteria:[],created:as,updated:null}),at=(e,t)=>{let n=y(e,t),s=p(n.boardId,"boardId",t),i=ae.get(s);if(!i)throw new l("BAD_REQUEST",`${t}: unknown boardId '${s}'`);return{board:i,raw:n}},lt=(e,t,n)=>{let s=e.issues.find(i=>i.id===t);if(!s)throw new l("BAD_REQUEST",`${n}: unknown issueId '${t}' on board '${e.boardId}'`);return s},Os=(e,t)=>{let n=0;for(let s of e.issues){let i=s.id.match(new RegExp(`^${t}-(\\d+)$`));i&&(n=Math.max(n,Number.parseInt(i[1],10)))}return`${t}-${n+1}`},Me=(e,t,n)=>{if(!Array.isArray(e)||e.some(s=>typeof s!="string"))throw new l("BAD_REQUEST",`${n}: '${t}' must be an array of strings`);return[...e]},Bn=(e,t,n,s)=>{let i=y(n,s),o=(u,m)=>{let b=Me(u,m,s);for(let T of b)lt(e,T,s);return b};if(i.title!==void 0&&(t.title=p(i.title,"title",s)),i.status!==void 0&&(t.status=p(i.status,"status",s)),i.priority!==void 0&&(t.priority=p(i.priority,"priority",s)),i.estimate!==void 0){let u=i.estimate;if(u!==null&&typeof u!="number"&&typeof u!="string")throw new l("BAD_REQUEST",`${s}: 'estimate' must be a number, string, or null`);t.estimate=u}if(i.labels!==void 0&&(t.labels=Me(i.labels,"labels",s)),i.epicId!==void 0){let u=i.epicId;if(u!==null&&typeof u!="string")throw new l("BAD_REQUEST",`${s}: 'epicId' must be an issue id or null`);u!==null&&lt(e,u,s),t.epicId=u}i.blockedBy!==void 0&&(t.blockedBy=o(i.blockedBy,"blockedBy")),i.blocks!==void 0&&(t.blocks=o(i.blocks,"blocks"))},qe=e=>{for(let t of e.subscribers)$(t,"boardUpdate",Et(e))},Pn=e=>{let t=e.issues.find(s=>s.status!=="done");if(!t)return;let n=e.statuses.indexOf(t.status);t.status=e.statuses[Math.min(n+1,e.statuses.length-1)],e.issues.every(s=>s.status==="done")&&(e.completedAt??(e.completedAt=new Date().toISOString())),qe(e),V(()=>Pn(e))},xe=(e,t,n)=>{for(let s of e.requestIds)$(s,t,n)},Rt=e=>{if(e.status!=="running")return;let t=ae.get(e.boardId);if(!t||e.issueIndex>=t.issues.length){e.status="done",xe(e,"complete",{reason:"All issues complete (mock)"});return}let n=t.issues[e.issueIndex];xe(e,"issueStarted",{issueId:n.id,title:n.title}),xe(e,"output",{issueId:n.id,text:`Working on ${n.title} (mock)...
4
- `}),xe(e,"toolUse",{issueId:n.id,tool:"write_file",input:{path:`${n.id}.md`}}),xe(e,"tokens",{issueId:n.id,inputTokens:100,outputTokens:40,cacheCreationTokens:0,cacheReadTokens:0,currentTurnInputTokens:100,isFinal:!0}),n.status="done",xe(e,"issueComplete",{issueId:n.id}),qe(t),e.issueIndex+=1,V(()=>Rt(e))},qs=(e,t)=>{for(let[n,s]of k){let i=s===""||s==="."?"":`${s.replace(/\/+$/,"")}/`;i&&!e.startsWith(i)||$(n,"changed",{path:i?e.slice(i.length):e,kind:t})}},Dn=()=>({tabs:x.map(e=>({...e})),currentTabId:v}),fe=()=>{for(let e of G)$(e,"tabsChanged",Dn());for(let e of le.values())_n(e)},_n=e=>{if(e.detached)return;let t=x.find(n=>n.id===e.tabId);t&&$(e.requestId,"navigationState",{tabId:t.id,url:t.url,title:t.title,isLoading:t.isLoading,canGoBack:t.canGoBack,canGoForward:t.canGoForward})},Ke=(e,t)=>{let n=p(y(e,t).sessionId,"sessionId",t);for(let s of le.values())if(s.sessionId===n&&!s.detached)return s;throw new l("BAD_REQUEST",`${t}: no live view session '${n}'`)},vt=e=>{e.detached=!0,le.delete(e.requestId),F.delete(e.requestId),K.delete(e.requestId)},It=(e,t)=>{let n=e==null?{}:y(e,t),s=n.tabId===void 0||n.tabId===null?v:p(n.tabId,"tabId",t);if(s===null)throw new l("BAD_REQUEST",`${t}: no tab is open`);return he(s,t)},Qn=(e,t)=>{let n=It(e,t);if(t==="browser.back"){if(!n.canGoBack)return null;n.canGoBack=!1,n.canGoForward=!0}else{if(!n.canGoForward)return null;n.canGoForward=!1,n.canGoBack=!0}return U+=1,fe(),null},he=(e,t)=>{let n=x.find(s=>s.id===e);if(!n)throw new l("BAD_REQUEST",`${t}: unknown tabId '${e}'`);return n},Tt=e=>{try{return new URL(e).origin}catch{return}},He=["claude-code","codex","hermes"],Ns=["gpt-5.1-codex-max","gpt-5-codex"],Re=e=>Ns.includes(e)?"codex":e.includes("/")?"hermes":"claude-code",At="claude-code",je="opus",Gn={"claude-code":["auto","low","medium","high","xhigh","max"],codex:["auto","minimal","low","medium","high","xhigh"],hermes:[]},Un=["claude-code"],Fs=e=>{if(!(Array.isArray(e)&&e.length>0&&e.length<=64&&e.every(n=>typeof n=="object"&&n!==null&&(n.role==="user"||n.role==="assistant")&&typeof n.content=="string")&&e[e.length-1].role==="user"))throw new l("BAD_REQUEST","inference.chat: messages must be 1\u201364 { role: 'user' | 'assistant', content } turns ending on a 'user' turn");return e},$s=[{value:"default",engine:"claude-code",label:"Default",description:"The engine's own default model",isDefault:!0},{value:"fable",engine:"claude-code",label:"Fable",description:"Most capable, for the hardest work"},{value:"opus",engine:"claude-code",label:"Opus",description:"Frontier reasoning for complex tasks"},{value:"sonnet",engine:"claude-code",label:"Sonnet",description:"Balanced speed and capability"},{value:"haiku",engine:"claude-code",label:"Haiku",description:"Fastest, for simple tasks"},{value:"gpt-5.1-codex-max",engine:"codex",label:"GPT-5.1 Codex Max",description:"Codex's most capable model",isDefault:!0},{value:"gpt-5-codex",engine:"codex",label:"GPT-5 Codex",description:"Faster Codex model"},{value:"z-ai/glm-5.2",engine:"hermes",label:"GLM 5.2",isDefault:!0},{value:"moonshotai/kimi-k3",engine:"hermes",label:"Kimi K3"}],On=(e,t)=>t.event==="step"?{...t.payload,...e.target}:t.payload,qn=e=>{if(e.status!=="running")return;let t=e.steps.shift();if(!t){e.status="done",j.delete(e.requestId);return}if($(e.requestId,t.event,On(e,t)),t.event==="done"){e.status="done",j.delete(e.requestId);return}V(()=>qn(e))},Ls=e=>{if(e.status!=="running")return;let t=`proposal-mock-${++X}`;e.pendingProposalId=t,e.status="awaiting-approval",$(e.requestId,"proposed",{proposalId:t,summary:'Click "Continue" on the page (mock)'})},Ws=e=>({ref:`${e.id}-e1`,role:"RootWebArea",name:e.title,children:[{ref:`${e.id}-e2`,role:"heading",name:e.title,level:1,children:[]},{ref:`${e.id}-e3`,role:"link",name:"Mock link",value:e.url,children:[]}]}),Be=()=>`mock${(++X).toString(16).padStart(36,"0")}`,Ve=e=>e.slice(0,7),Ye=e=>N.find(t=>t.hash===e||t.shortHash===e),Ks=(e,t)=>{let n=e??ce??Ne,s=z.get(n);if(!s)throw new l("BAD_REQUEST",`${t}: unknown worktree '${n}'`);return s},Hs=(e,t)=>e==null?void 0:p(e,"worktree",t),te=(e,t)=>{let n=y(e,t);return{worktree:Ks(Hs(n.worktree,t),t),record:n}},js=e=>({staged:e.staged.length,unstaged:e.unstaged.length,untracked:e.untracked.length,ahead:0,behind:0,hasUpstream:I.get(e.branch)?.upstream!==void 0}),Vs=e=>({path:e.path,branch:e.branch,head:I.get(e.branch)?.head??"",isMain:e.isMain,isBare:!1,status:js(e)}),Nn=()=>({worktrees:[...z.values()].map(Vs),activeWorktreePath:ce}),Ct=()=>{for(let e of ue)$(e,"worktreesChanged",Nn())},Mt=e=>{for(let t of ne)$(t,"branchChanged",{worktreePath:e.path,branch:e.branch})},Ys=(e,t,n)=>{let s=e.untracked.findIndex(o=>o.path===t);if(s!==-1){let[o]=e.untracked.splice(s,1);e.staged.push({...o,status:"A",staged:!0});return}let i=e.unstaged.findIndex(o=>o.path===t);if(i!==-1){let[o]=e.unstaged.splice(i,1);e.staged.push({...o,staged:!0});return}throw new l("BAD_REQUEST",`${n}: '${t}' has no pending changes in this worktree`)},zs=(e,t,n)=>{let s=e.staged.findIndex(o=>o.path===t);if(s===-1)throw new l("BAD_REQUEST",`${n}: '${t}' is not staged`);let[i]=e.staged.splice(s,1);i.status==="A"?e.untracked.push({...i,status:"?",staged:!1}):e.unstaged.push({...i,staged:!1})},xt=Be();N.push({hash:xt,shortHash:Ve(xt),subject:"Initial commit (mock)",body:"",author:w?.name??"Mock User",date:new Date().toISOString(),files:[]}),I.set(_e,{name:_e,head:xt,isRemote:!1,upstream:`origin/${_e}`}),z.set(Ne,{path:Ne,branch:_e,isMain:!0,staged:[],unstaged:[],untracked:[{path:"NOTES.md",status:"?",staged:!1}]});let Fn=e=>({id:e.id,shell:e.shell,cwd:e.cwd,cols:e.cols,rows:e.rows,createdAt:e.createdAt,lastActivityAt:e.lastActivityAt}),Bt=(e,t,n)=>{for(let s of e.attachedRequestIds)mn(s,t,n)},$n=e=>{for(let t of Le)$(t,"sessionChanged",e)},Ln=(e,t)=>{let n=e.scrollback+t;e.scrollback=n.length>hs?n.slice(n.length-hs):n},Wn=(e,t)=>{e.closed||(e.closed=!0,Bt(e,"exit",{exitCode:t}),e.attachedRequestIds.clear(),pe.delete(e.id),$n({kind:"closed",id:e.id}))},Zs=e=>{for(let t=0;t<ti;t++){let n=`burst line ${t} (mock)
5
- `;Ln(e,n),Bt(e,"output",{data:n})}},ct=e=>{let t=nt.get(e);if(t)return nt.delete(e),clearTimeout(t.timer),Oe.delete(t.timer),t},Pt=e=>{if(Ee.delete(e))for(let t of[...nt.values()]){if(t.registrationId!==e)continue;ct(t.callId)?.fail(new l("APP_UNAVAILABLE",`mock: the app stopped serving '${t.tool}' before it answered`))}},Kn=(e,t)=>{Ce(()=>de?.onToolCall?.({op:"cancel",callId:e,requestId:t}))},Xs={list:()=>[...Ee.values()].flatMap(e=>[...e.tools.values()].map(t=>({...t,registrationId:e.requestId,profile:e.profile}))),call:(e,t,n)=>new Promise((s,i)=>{let o=[...Ee.values()].find(D=>D.tools.has(e)),u=o?.tools.get(e);if(!o||!u||!de?.onToolCall){i(new l("APP_UNAVAILABLE",`mock: no app is serving a tool named '${e}'`));return}let m=`tc-${++Bs}`,b=Math.min(n?.timeoutMs??u.timeoutMs??Jr,ei),T=setTimeout(()=>{let D=ct(m);D&&(Kn(m,o.requestId),D.fail(new l("APP_TIMEOUT",`mock: '${e}' did not answer within ${b}ms`)))},b);Oe.add(T),nt.set(m,{callId:m,registrationId:o.requestId,tool:e,settle:s,fail:i,timer:T}),Ce(()=>de?.onToolCall?.({op:"call",callId:m,requestId:o.requestId,tool:e,input:t}))}),cancel:e=>{let t=ct(e);t&&(Kn(e,t.registrationId),t.fail(new l("CANCELLED",`mock: call '${e}' to '${t.tool}' was cancelled by the host`)))}},Dt=(e,t)=>`${e}|${t}`,_t=(e,t)=>t.map(n=>{let s=n.fingerprint===void 0?void 0:bt.get(Dt(e,n.fingerprint));return s?{...n,dismissal:{reason:s.reason,dismissedAt:s.dismissedAt}}:{...n}}),ut=e=>({...e,findings:_t(e.path,e.findings),codeReview:_t(e.path,e.codeReview)}),Hn=e=>e.report===null?e:{...e,report:ut(e.report)},Se=e=>{let t=e.kind==="results"||e.kind==="postSession"||e.kind==="agentTurn"?{...e,report:ut(e.report)}:e;for(let n of Ge)$(n,"changed",t)},Js=e=>{let t=new Date().toISOString(),n=[on];if(e==="worktree"){let o=bs(se,t,void 0);Se({kind:"agentTurn",path:se,worktree:!0,changedFiles:n,report:o});return}let s=we.get(se)?.timestamp,i=bs(se,t,s);Se({kind:"agentTurn",path:se,changedFiles:n,report:i})},Pe=(e,t)=>{if(e==null)return se;let n=p(e,"path",t).trim();if(n==="")return se;if(n.startsWith("/")||n.split("/").includes(".."))throw new l("BAD_REQUEST",`${t}: '${n}' resolves outside the working directory`);return n},ze=e=>({...e,timing:e.timing.kind==="daily"&&e.timing.days?{...e.timing,days:[...e.timing.days]}:{...e.timing},...e.lastFire?{lastFire:{...e.lastFire}}:{},history:e.history.map(t=>({...t}))}),er=e=>{if(typeof e!="string"||e==="")return!1;try{return new Intl.DateTimeFormat("en-US",{timeZone:e}),!0}catch{return!1}},jn=(e,t)=>{let n=y(e,t);if(n.kind==="interval"){if(typeof n.everyMs!="number"||!Number.isFinite(n.everyMs)||n.everyMs<=0)throw new l("BAD_REQUEST",`${t}: timing.everyMs must be a positive number`);return{kind:"interval",everyMs:Math.max(n.everyMs,6e4)}}if(n.kind!=="daily")throw new l("BAD_REQUEST",`${t}: timing.kind must be 'daily' or 'interval'`);if(typeof n.time!="string"||!/^([01]\d|2[0-3]):[0-5]\d$/.test(n.time))throw new l("BAD_REQUEST",`${t}: timing.time must be 24-hour HH:MM`);if(!er(n.timeZone))throw new l("BAD_REQUEST",`${t}: timing.timeZone must be an IANA zone name`);let s={kind:"daily",time:n.time,timeZone:n.timeZone};if(n.days!==void 0){if(!Array.isArray(n.days)||n.days.length===0||n.days.some(i=>!Number.isInteger(i)||i<0||i>6))throw new l("BAD_REQUEST",`${t}: timing.days must be a non-empty array of weekdays 0 (Sunday) \u2026 6 (Saturday)`);s.days=[...new Set(n.days)].sort((i,o)=>i-o)}return s},Qt=(e,t)=>{let n=new Intl.DateTimeFormat("en-US",{timeZone:t,hourCycle:"h23",year:"numeric",month:"2-digit",day:"2-digit",hour:"2-digit",minute:"2-digit",second:"2-digit",weekday:"short"}).formatToParts(new Date(e)),s=o=>n.find(u=>u.type===o)?.value??"0",i=["Sun","Mon","Tue","Wed","Thu","Fri","Sat"];return{y:Number(s("year")),m:Number(s("month")),d:Number(s("day")),hh:Number(s("hour"))%24,mm:Number(s("minute")),ss:Number(s("second")),weekday:Math.max(0,i.indexOf(s("weekday")))}},Vn=(e,t)=>{let n=Qt(e,t);return Date.UTC(n.y,n.m-1,n.d,n.hh,n.mm,n.ss)-e},tr=(e,t,n,s,i,o)=>{let u=Date.UTC(e,t-1,n,s,i),m=u-Vn(u,o),b=Vn(m,o);return u-b},Yn=(e,t)=>{if(e.kind==="interval")return new Date(t+e.everyMs).toISOString();let[n,s]=e.time.split(":").map(Number),i=Qt(t,e.timeZone);for(let o=0;o<=8;o++){let u=new Date(Date.UTC(i.y,i.m-1,i.d+o,12)),m=tr(u.getUTCFullYear(),u.getUTCMonth()+1,u.getUTCDate(),n,s,e.timeZone);if(!(m<=t)&&!(e.days&&!e.days.includes(Qt(m,e.timeZone).weekday)))return new Date(m).toISOString()}return new Date(t+10080*60*1e3).toISOString()},Gt=()=>{Se({kind:"schedules",schedules:Ae.map(ze)})},zn=(e,t)=>{let n=p(e,"scheduleId",t),s=Ae.find(i=>i.id===n);if(!s)throw new l("BAD_REQUEST",`${t}: schedule '${n}' not found in this Space`);return s},Zn=e=>{let t=gn.get(e);return t||(t=new Set(ws.filter(n=>n.installed).map(n=>n.name)),gn.set(e,t)),t},Ut=e=>{if(e===Jt)return{path:e,tools:[],ecosystem:[]};let t=Zn(e);return{path:e,tools:ws.map(n=>({...n,installed:t.has(n.name)})),ecosystem:[...an]}},nr=(e,t,n)=>{for(let s of e.requestIds)$(s,t,n)},Xn=(e,t)=>{let n=Hn(t);for(let s of e.waiters)rt(s,n);e.waiters=[]},sr=(e,t)=>{let n=[["detecting","Detecting tools",void 0],["scanning","Running quality checks","tsc --noEmit, 18s elapsed"],["reviewing","AI deep review","reviewing 3 of 5 files"],["complete","Complete",void 0]];return n.flatMap(([s,i,o],u)=>{let m=s==="reviewing"&&t!==void 0?{sessionId:t}:{};return[{event:"phase",phase:s,payload:{phase:s,...m}},...s==="reviewing"&&t!==void 0?[{event:"session",phase:s,payload:{sessionId:t}}]:[],{event:"progress",phase:s,payload:{phase:s,step:i,current:u+1,total:n.length,...o===void 0?{}:{detail:o},etaMs:138e3,startedAt:e,...m}}]})},rr=e=>{let t=e.path===en,n=new Date().toISOString(),s=we.get(e.path),i=s?.findings.some(b=>b.fingerprint!==void 0)?s.timestamp:void 0,o=e.path===Jt?di(e.path,n):tn(e.path,n,!t,i),u=!t&&e.sessionId!==void 0?{...o,reviewSessionId:e.sessionId}:o;we.set(e.path,u),yt.push(Ss(u)),e.status=t?"partial":"ok";let m={path:e.path,status:e.status,report:u,...e.sessionId!==void 0?{sessionId:e.sessionId}:{},legs:t?{scan:{status:"ok"},review:{status:"failed",code:"CLAUDE_NOT_INSTALLED",message:`mock: no coding-agent binary for '${e.path}' \u2014 the scan leg still produced a report`,sessionId:e.sessionId}}:{scan:{status:"ok"},review:{status:"ok",sessionId:e.sessionId}}};st.set(e.path,m),be.delete(e.path),Xn(e,m),Se({kind:"results",path:e.path,report:u})},Jn=e=>{if(e.status!=="running")return;let t=e.steps.shift();if(!t){rr(e);return}t.event==="phase"&&(e.kind=t.phase==="reviewing"?"reviewing":"scanning"),nr(e,t.event,t.payload),V(()=>Jn(e))},ir=e=>{if(e.status!=="running")return;e.status="cancelled",e.steps=[];let t={path:e.path,status:"cancelled",report:we.get(e.path)??null,legs:{scan:{status:"skipped"},review:{status:"skipped"}}};st.set(e.path,t),be.delete(e.path),Xn(e,t)},dt=Symbol("mock-defer"),or={features:()=>[...Dr],connect:e=>{let t=y(e,"connect").scopes;if(!Array.isArray(t)||t.some(s=>typeof s!="string"))throw new l("BAD_REQUEST","connect: scopes must be an array of scope strings");let n=[...new Set(t)];for(let s of n)Ot.includes(s)&&!E.has(s)&&C.add(s);return{space:{...f},user:w===null?null:{...w},grants:n.filter(s=>C.has(s)),viewOnly:w===null}},disconnect:()=>{C.clear();for(let e of ae.values())e.subscribers.clear();for(let e of r.keys())F.delete(e),K.delete(e);r.clear();for(let e of k.keys())F.delete(e),K.delete(e);k.clear();for(let e of G)F.delete(e),K.delete(e);G.clear();for(let e of j.values())e.status="cancelled",e.pendingProposalId=null,e.steps=[],F.delete(e.requestId),K.delete(e.requestId);j.clear();for(let e of[...le.values()])vt(e);for(let e of ue)F.delete(e),K.delete(e);ue.clear();for(let e of ne)F.delete(e),K.delete(e);ne.clear();for(let e of Le)F.delete(e),K.delete(e);Le.clear();for(let[e,t]of ke)t.attachedRequestIds.delete(e),F.delete(e);ke.clear();for(let e of Ge)F.delete(e),K.delete(e);Ge.clear();for(let[e,t]of Qe)t.requestIds.delete(e),F.delete(e),K.delete(e);Qe.clear();for(let e of[...Ee.keys()])Pt(e);return Ps("disconnect"),null},"auth.getToken":()=>`mock-token-${f.id}`,"agents.run":(e,t)=>{let{prompt:n,title:s,model:i,sessionId:o}=_s(e),u,m;if(o!==void 0){if(u=re.get(o),!u)throw new l("BAD_REQUEST",`unknown sessionId '${o}' \u2014 agents.run continues only an open session this app started with agents.run in this Space`);if(u.run.status==="running")throw new l("BAD_REQUEST",`session_busy: session '${u.id}' is still running a turn \u2014 wait for its result() before continuing it`);u.modelValue!==void 0&&(m=In(u.modelValue))}else i!==void 0&&(m=In(i));let b=(u?.turns??0)+1,T=++X,D=`run-mock-${T}`,Q=u?.id??`session-mock-${++X}`,B=new Date().toISOString(),W=Y.get(Q);W?(W.isExecuting=!0,W.lastActivityAt=B):Y.set(Q,{id:Q,name:s?.trim()||`Run ${T}`,createdAt:B,lastActivityAt:B,isExecuting:!0,entries:[],seq:0});let J=Date.now(),ye={runId:D,requestId:t,sessionId:Q,status:"running",text:"",steps:m?Qs(m,n,b):[{event:"status",payload:{status:"running"}},{event:"timelineEvent",payload:{kind:"status",at:J,executing:!0,turn:b}},{event:"timelineEvent",payload:{kind:"thinking",at:J,entryId:"mock-thinking-1",delta:"Reviewing the request (mock)..."}},{event:"toolUse",payload:{tool:"plan",input:{prompt:n}}},{event:"timelineEvent",payload:{kind:"tool_use",at:J,entryId:"mock-tool-1",toolName:"plan",input:{prompt:n}}},{event:"timelineEvent",payload:{kind:"tool_result",at:J,entryId:"mock-tool-1",ok:!0,result:"Planned (mock)."}},{event:"output",payload:{text:`Working on: ${n}
6
- `}},{event:"timelineEvent",payload:{kind:"text",at:J,entryId:"mock-text-1",delta:`Working on: ${n}
7
- `}},{event:"output",payload:{text:"Done (mock)."}},{event:"timelineEvent",payload:{kind:"text",at:J,entryId:"mock-text-1",delta:"Done (mock)."}},{event:"timelineEvent",payload:{kind:"tokens",at:J,usage:{inputTokens:120,outputTokens:48,cacheCreationTokens:0,cacheReadTokens:0,currentTurnInputTokens:120,isFinal:!0}}},{event:"timelineEvent",payload:{kind:"status",at:J,executing:!1,turn:b}}],waiters:[],...n.trim()===si?{agentTurn:"directory"}:n.trim()===ri?{agentTurn:"worktree"}:{}};return P.set(t,ye),Ie.set(D,ye),u?(u.turns=b,u.run=ye):(u={id:Q,turns:b,run:ye,...m?{modelValue:m.modelValue}:{}},re.set(u.id,u)),V(()=>bn(ye)),{runId:D,sessionId:Q}},"agents.result":(e,t)=>{let n=p(y(e,"agents.result").runId,"runId","agents.result"),s=Ie.get(n);if(!s)throw new l("BAD_REQUEST",`agents.result: unknown runId '${n}'`);return s.status==="running"?(s.waiters.push(t),dt):{status:s.status,text:s.text}},"inference.chat":(e,t)=>{let n=y(e,"inference.chat"),s=Fs(n.messages);if(n.system!==void 0&&(typeof n.system!="string"||n.system.length>32e3))throw new l("BAD_REQUEST","inference.chat: system must be a string of at most 32000 characters");let i=n.engine===void 0||n.engine===null?void 0:p(n.engine,"engine","inference.chat");if(i!==void 0&&!He.includes(i))throw new l("BAD_REQUEST",`inference.chat: unknown engine '${i}' \u2014 expected one of ${He.join(", ")}`);let o=n.model===void 0||n.model===null?void 0:p(n.model,"model","inference.chat");if(o==="")throw new l("BAD_REQUEST","inference.chat: model must be a non-empty string when present");let u=i??(o?Re(o):At);if(o&&Re(o)!==u)throw new l("BAD_REQUEST",`inference.chat: model '${o}' is not a ${u} model \u2014 it belongs to ${Re(o)}`);if(!Un.includes(u))throw new l("UNSUPPORTED",`inference.chat: ${u} cannot run a tool-less completion on this host`);let m=n.effortLevel===void 0||n.effortLevel===null?void 0:p(n.effortLevel,"effortLevel","inference.chat");if(m!==void 0&&m!=="auto"&&!Gn[u]?.includes(m))throw new l("BAD_REQUEST",`inference.chat: '${m}' is not a ${u} effort level`);let b=o??(Re(je)===u?je:void 0),T=s[s.length-1]?.content.trim()??"",D=`inference-mock-${++X}`,Q={runId:D,requestId:t,status:"running",engine:u,...b?{model:b}:{},text:"",deltas:[`(mock ${u}${b?` \xB7 ${b}`:""}) `,T.length>120?`${T.slice(0,119)}\u2026`:T],waiters:[]};return Te.set(t,Q),ge.set(D,Q),V(()=>{Q.status==="running"&&($(t,"status",{status:"running"}),Mn(Q))}),{runId:D}},"inference.result":(e,t)=>{let n=p(y(e,"inference.result").runId,"runId","inference.result"),s=ge.get(n);if(!s)throw new l("BAD_REQUEST",`inference.result: unknown runId '${n}'`);return s.status==="running"?(s.waiters.push(t),dt):An(s)},"endpoints.register":e=>{let t=kt(e,"endpoints.register",Wr,Kr),n=En(t.id,"endpoints.register"),s=Rn(t.label,"label",Fr);if(typeof t.engine!="string"||!ms.includes(t.engine))throw new l("BAD_REQUEST",`endpoints.register: engine must be one of ${ms.join(", ")}`);let{baseUrl:i,apiKey:o}=t;if(typeof i!="string"||nn(i)>ht)throw new l("BAD_REQUEST",`endpoints.register: baseUrl must be a string of at most ${ht} bytes`);if(typeof o!="string"||o===""||nn(o)>ps||jr.test(o))throw new l("BAD_REQUEST",`endpoints.register: apiKey is required \u2014 a string of at most ${ps} bytes, without whitespace or control characters`);let u=Rn(t.model,"model",$r),m=vn(t.contextLength,"contextLength"),b=Math.min(vn(t.ttlMs,"ttlMs")??Lr,De.maxTtlMs),T=Xr(i);if(!T.ok)throw new l("ENDPOINT_INVALID",`endpoints.register: baseUrl ${T.reason}`);let D=Date.now();if([...H.values()].filter(W=>W.id!==n&&St(W,D)).length>=De.endpointsPerApp)throw new l("QUOTA_EXCEEDED",`endpoints.register: this app already holds ${De.endpointsPerApp} endpoints in this Space \u2014 unregister one first`);let B={id:n,label:s,engine:"hermes",modelValue:`custom:${t.engine}:app-${Nr}-${n}`,model:u,...m!==void 0?{contextLength:m}:{},expiresAt:new Date(D+b).toISOString()};return H.set(n,B),{...B}},"endpoints.unregister":e=>{let t=kt(e,"endpoints.unregister","{ id }",new Set(["id"])),n=En(t.id,"endpoints.unregister"),s=H.get(n);if(!s)throw new l("BAD_REQUEST",`unknown endpoint id '${n}' \u2014 endpoints.unregister removes only this app's endpoints in this Space`);H.delete(n);for(let i of re.values())i.modelValue===s.modelValue&&Sn(i.run);return null},"endpoints.list":()=>{let e=Date.now();return[...H.values()].filter(t=>St(t,e)).map(t=>({...t}))},"agents.sessions.list":()=>[...Y.values()].map(it),"agents.sessions.create":e=>{let t=y(e,"agents.sessions.create"),n=typeof t.name=="string"?t.name:void 0,s=`session-mock-${++X}`,i=new Date().toISOString(),o={id:s,name:n??`Session ${Y.size+1}`,createdAt:i,lastActivityAt:i,isExecuting:!1,entries:[],seq:0};return Y.set(s,o),it(o)},"agents.sessions.attach":e=>{let t=p(y(e,"agents.sessions.attach").sessionId,"sessionId","agents.sessions.attach"),n=Y.get(t);if(!n)throw new l("BAD_REQUEST",`agents.sessions.attach: unknown sessionId '${t}'`);return it(n)},"agents.sessions.close":e=>{let t=p(y(e,"agents.sessions.close").sessionId,"sessionId","agents.sessions.close");if(!Y.delete(t))throw new l("BAD_REQUEST",`agents.sessions.close: unknown sessionId '${t}'`);return null},"agents.sessions.rename":e=>{let t=y(e,"agents.sessions.rename"),n=p(t.sessionId,"sessionId","agents.sessions.rename"),s=Y.get(n);if(!s)throw new l("BAD_REQUEST",`agents.sessions.rename: unknown sessionId '${n}'`);return s.name=p(t.name,"name","agents.sessions.rename"),it(s)},"agents.sessions.history":e=>{let t=p(y(e,"agents.sessions.history").sessionId,"sessionId","agents.sessions.history"),n=Y.get(t);if(!n)throw new l("BAD_REQUEST",`agents.sessions.history: unknown sessionId '${t}'`);return{sessionId:t,entries:[...n.entries],seq:n.seq}},"agents.sessions.replay":e=>{let t=y(e,"agents.sessions.replay"),n=p(t.sessionId,"sessionId","agents.sessions.replay"),s=Y.get(n);if(!s)throw new l("BAD_REQUEST",`agents.sessions.replay: unknown sessionId '${n}'`);let i=t.afterSeq;if(typeof i!="number"||!Number.isInteger(i)||i<0)throw new l("BAD_REQUEST","agents.sessions.replay: afterSeq must be a non-negative integer");return{sessionId:n,fromSeq:i,events:[],currentSeq:s.seq}},"agents.sessions.approve":e=>{let t=y(e,"agents.sessions.approve"),n=p(t.sessionId,"sessionId","agents.sessions.approve");if(typeof t.approved!="boolean")throw new l("BAD_REQUEST","agents.sessions.approve: approved must be a boolean");if(!Y.has(n))throw new l("BAD_REQUEST",`agents.sessions.approve: unknown sessionId '${n}'`);return null},"agents.sessions.answerQuestion":e=>{let t=y(e,"agents.sessions.answerQuestion"),n=p(t.sessionId,"sessionId","agents.sessions.answerQuestion");if(p(t.toolUseId,"toolUseId","agents.sessions.answerQuestion"),typeof t.answers!="object"||t.answers===null||Array.isArray(t.answers))throw new l("BAD_REQUEST","agents.sessions.answerQuestion: answers must be an object");if(!Y.has(n))throw new l("BAD_REQUEST",`agents.sessions.answerQuestion: unknown sessionId '${n}'`);return null},"agents.sessions.prompt":e=>{let t=y(e,"agents.sessions.prompt"),n=p(t.sessionId,"sessionId","agents.sessions.prompt"),s=p(t.prompt,"prompt","agents.sessions.prompt"),i=Array.isArray(t.attachments)?t.attachments.map((m,b)=>{let T=p(m?.path,"path",`agents.sessions.prompt attachments[${b}]`);return{fileName:T.split("/").pop()??T,isImage:!1}}):void 0,o=Y.get(n);if(!o)throw new l("BAD_REQUEST",`agents.sessions.prompt: unknown sessionId '${n}'`);let u=new Date().toISOString();return o.lastActivityAt=u,o.entries.push({id:`entry-${n}-${++o.seq}`,kind:"user",at:Date.now(),text:s,...i?{attachments:i}:{}}),o.entries.push({id:`entry-${n}-${++o.seq}`,kind:"text",at:Date.now(),text:`Working on: ${s} (mock)`,open:!1}),{queued:!1}},"agents.sessions.stop":e=>{let t=p(y(e,"agents.sessions.stop").sessionId,"sessionId","agents.sessions.stop"),n=Y.get(t);if(!n)throw new l("BAD_REQUEST",`agents.sessions.stop: unknown sessionId '${t}'`);return n.isExecuting=!1,null},"apps.open":e=>{let t=y(e,"apps.open"),n=p(t.app,"app","apps.open");if(C.size===0)throw new l("SCOPE_DENIED","apps.open: no connected app session \u2014 call connect() first");if(n==="agents"){let u=t.params;if(typeof u!="object"||u===null||Array.isArray(u))throw new l("BAD_REQUEST","apps.open: 'params' must be an object for the 'agents' target");let m=p(u.sessionId,"params.sessionId","apps.open");if(!(Y.has(m)||re.has(m)||[...j.values()].some(T=>T.target.sessionId===m)||[...be.values()].some(T=>T.sessionId===m)||[...st.values()].some(T=>T.sessionId===m)||[...we.values()].some(T=>T.reviewSessionId===m)))throw new l("BAD_REQUEST",`apps.open: unknown sessionId '${m}'`);return null}if(n==="browser"){if(!C.has("browser:read"))throw new l("SCOPE_DENIED","apps.open: the 'browser' target requires scope 'browser:read'");let u=t.params;if(typeof u!="object"||u===null||Array.isArray(u))throw new l("BAD_REQUEST","apps.open: 'params' must be an object for the 'browser' target");let m=p(u.tabId,"params.tabId","apps.open");if(m==="")throw new l("BAD_REQUEST","apps.open: 'params.tabId' must be a non-empty string");return v=he(m,"apps.open").id,fe(),null}if(n!=="files")throw new l("SCOPE_DENIED",`apps.open: unknown app '${n}' (fail closed)`);if(!C.has("files:workspace:read"))throw new l("SCOPE_DENIED","apps.open: the 'files' target requires scope 'files:workspace:read'");let s=t.params;if(typeof s!="object"||s===null||Array.isArray(s))throw new l("BAD_REQUEST","apps.open: 'params' must be an object for the 'files' target");if(!p(s.path,"params.path","apps.open").startsWith("workspace:/"))throw new l("BAD_REQUEST","apps.open: 'params.path' must use canonical workspace addressing ('workspace:/\u2026')");let o=s.line;if(o!==void 0&&(typeof o!="number"||!Number.isInteger(o)||o<1))throw new l("BAD_REQUEST","apps.open: 'params.line' must be a positive integer");return null},cancel:e=>{let t=p(y(e,"cancel").requestId,"requestId","cancel"),n=P.get(t);if(n)return Sn(n),null;let s=Te.get(t);if(s)return Gs(s),null;let i=r.get(t);if(i)return r.delete(t),i.subscribers.delete(t),F.delete(t),K.delete(t),null;let o=h.get(t);o&&(o.requestIds.delete(t),h.delete(t),F.delete(t),K.delete(t)),k.delete(t)&&(F.delete(t),K.delete(t)),G.delete(t)&&(F.delete(t),K.delete(t));let u=j.get(t);u&&(u.status="cancelled",u.pendingProposalId=null,u.steps=[],j.delete(t),F.delete(t),K.delete(t));let m=le.get(t);m&&vt(m),ue.delete(t)&&(F.delete(t),K.delete(t)),ne.delete(t)&&(F.delete(t),K.delete(t)),$e.delete(t)&&(F.delete(t),K.delete(t)),Le.delete(t)&&(F.delete(t),K.delete(t));let b=ke.get(t);b&&(b.attachedRequestIds.delete(t),ke.delete(t),F.delete(t)),Ge.delete(t)&&(F.delete(t),K.delete(t));let T=Qe.get(t);return T&&(T.requestIds.delete(t),Qe.delete(t),F.delete(t),K.delete(t)),Pt(t),null},"pm.createBoard":e=>{let t=p(y(e,"pm.createBoard").prompt,"prompt","pm.createBoard"),n=`board-mock-${++X}`,s={boardId:n,title:t.trim().slice(0,60)||"Mock board",goal:t.trim()||"Mock board",status:"active",statuses:[...os],issues:[ot("IS-1","Plan","P1"),ot("IS-2","Implement","P1"),ot("IS-3","Verify","P2")],subscribers:new Set,createdAt:new Date().toISOString(),completedAt:null};return ae.set(n,s),V(()=>Pn(s)),{boardId:n}},"pm.listBoards":()=>Array.from(ae.values()).map(xn),"pm.getBoard":e=>{let t=p(y(e,"pm.getBoard").boardId,"boardId","pm.getBoard"),n=ae.get(t);if(!n)throw new l("BAD_REQUEST",`pm.getBoard: unknown boardId '${t}'`);return Et(n)},"pm.createIssue":e=>{let t="pm.createIssue",{board:n,raw:s}=at(e,t),i=p(s.title,"title",t),o=s.type===void 0?"issue":p(s.type,"type",t),u=ls[o];if(!u)throw new l("BAD_REQUEST",`${t}: 'type' must be one of ${Object.keys(ls).join(", ")}`);let m=ot(Os(n,u),i,"P2");return m.type=o,s.description!==void 0&&(m.description=p(s.description,"description",t)),s.acceptanceCriteria!==void 0&&(m.acceptanceCriteria=Me(s.acceptanceCriteria,"acceptanceCriteria",t).map(b=>({text:b,checked:!1}))),Bn(n,m,s,t),n.issues.push(m),qe(n),{...m}},"pm.updateIssue":e=>{let t="pm.updateIssue",{board:n,raw:s}=at(e,t),i=lt(n,p(s.issueId,"issueId",t),t);return Bn(n,i,s.fields,t),i.updated=as,qe(n),{...i}},"pm.deleteIssue":e=>{let t="pm.deleteIssue",{board:n,raw:s}=at(e,t),i=p(s.issueId,"issueId",t);return lt(n,i,t),n.issues=n.issues.filter(o=>o.id!==i),qe(n),{deleted:!0,issueId:i}},"pm.updateBoard":e=>{let t="pm.updateBoard",{board:n,raw:s}=at(e,t),i=y(s.fields,t);if(i.title!==void 0&&(n.title=p(i.title,"title",t)),i.goal!==void 0&&(n.goal=p(i.goal,"goal",t)),i.status!==void 0){let o=p(i.status,"status",t);if(o!=="draft"&&o!=="active"&&o!=="completed")throw new l("BAD_REQUEST",`${t}: 'status' must be draft, active, or completed`);n.status=o}return qe(n),xn(n)},"pm.execute":(e,t)=>{let n=p(y(e,"pm.execute").boardId,"boardId","pm.execute");if(!ae.get(n))throw new l("BAD_REQUEST",`pm.execute: unknown boardId '${n}'`);let i=c.get(n);return(!i||i.status==="done"||i.status==="stopped")&&(i={runId:`boardrun-mock-${++X}`,boardId:n,status:"running",requestIds:new Set,issueIndex:0},c.set(n,i),g.set(i.runId,i),V(()=>Rt(i))),i.requestIds.add(t),h.set(t,i),{runId:i.runId}},"pm.pause":e=>{let t=p(y(e,"pm.pause").runId,"runId","pm.pause"),n=g.get(t);if(!n)throw new l("BAD_REQUEST",`pm.pause: unknown runId '${t}'`);return n.status==="running"&&(n.status="paused"),null},"pm.resume":e=>{let t=p(y(e,"pm.resume").runId,"runId","pm.resume"),n=g.get(t);if(!n)throw new l("BAD_REQUEST",`pm.resume: unknown runId '${t}'`);return n.status==="paused"&&(n.status="running",V(()=>Rt(n))),null},"pm.stop":e=>{let t=p(y(e,"pm.stop").runId,"runId","pm.stop"),n=g.get(t);if(!n)throw new l("BAD_REQUEST",`pm.stop: unknown runId '${t}'`);return(n.status==="running"||n.status==="paused")&&(n.status="stopped",xe(n,"complete",{reason:"Stopped by app"})),null},"pm.schedules.list":()=>({schedules:[...S.values()].map(e=>({...e}))}),"pm.schedules.create":e=>{let t=y(e,"pm.schedules.create"),n=y(t.source,"pm.schedules.create");if(n.kind!=="template-json"||typeof n.content!="string"||n.content==="")throw new l("BAD_REQUEST","pm.schedules.create: source must be { kind: 'template-json', content }");let s=fn(t.timing,"pm.schedules.create"),i=`sched-mock-${++X}`,o=new Date,u={id:i,createdAt:o.toISOString(),source:{kind:"template-json"},timing:s,enabled:t.enabled===void 0?!0:t.enabled===!0,nextFireAt:hn(s,o),history:[]};return typeof t.name=="string"&&(u.name=t.name),t.input!==void 0&&(u.input=t.input),S.set(i,u),{...u}},"pm.schedules.update":e=>{let t=y(e,"pm.schedules.update"),n=p(t.scheduleId,"scheduleId","pm.schedules.update"),s=S.get(n);if(!s)throw new l("BAD_REQUEST",`pm.schedules.update: unknown scheduleId '${n}'`);let i=t.patch===void 0?{}:y(t.patch,"pm.schedules.update"),o={...s};return"name"in i&&(o.name=typeof i.name=="string"?i.name:void 0),"enabled"in i&&(o.enabled=i.enabled===!0),"input"in i&&(o.input=i.input===null?void 0:i.input),"timing"in i&&(o.timing=fn(i.timing,"pm.schedules.update"),o.nextFireAt=hn(o.timing,new Date)),S.set(n,o),{...o}},"pm.schedules.delete":e=>{let t=p(y(e,"pm.schedules.delete").scheduleId,"scheduleId","pm.schedules.delete");return S.delete(t),null},"stream.resume":e=>{let t=y(e,"stream.resume"),n=p(t.requestId,"requestId","stream.resume"),s=t.afterSeq;if(s!==void 0&&(typeof s!="number"||!Number.isInteger(s)||s<0))throw new l("BAD_REQUEST","stream.resume: afterSeq must be a non-negative integer when present");let i=s??0,o=F.get(n)??0,u=K.get(n);if(!u){if(P.has(n)||Te.has(n)||r.has(n)||h.has(n)||Ee.has(n))return{requestId:n,fromSeq:i,events:[],currentSeq:0};throw new l("STREAM_GAP",`stream.resume: '${n}' is not a stream this mock host is holding \u2014 reconcile with a snapshot read`)}return{requestId:n,fromSeq:i,events:u.filter(m=>m.seq>i),currentSeq:o}},"pm.subscribeBoard":(e,t)=>{let n=p(y(e,"pm.subscribeBoard").boardId,"boardId","pm.subscribeBoard"),s=ae.get(n);if(!s)throw new l("BAD_REQUEST",`pm.subscribeBoard: unknown boardId '${n}'`);return s.subscribers.add(t),r.set(t,s),$(t,"boardUpdate",Et(s)),null},"files.read":e=>{let t=p(y(e,"files.read").path,"path","files.read"),n=a.get(t);if(n===void 0)throw new l("BAD_REQUEST",`files.read: no such file '${t}'`);return n},"files.readEntry":e=>{let t=p(y(e,"files.readEntry").path,"path","files.readEntry"),n=a.get(t);if(n===void 0)throw new l("BAD_REQUEST",`files.readEntry: no such file '${t}'`);return{kind:"text",content:n}},"files.write":e=>{let t=y(e,"files.write"),n=p(t.path,"path","files.write");return a.set(n,p(t.content,"content","files.write")),O.set(n,new Date().toISOString()),qs(n,"changed"),null},"files.list":e=>{let t=p(y(e,"files.list").path,"path","files.list"),n=t===""||t==="."?"":`${t.replace(/\/+$/,"")}/`,s=new Map;for(let i of a.keys()){if(!i.startsWith(n))continue;let o=i.slice(n.length);if(!o)continue;let u=o.indexOf("/");u===-1?s.set(o,s.get(o)??!1):s.set(o.slice(0,u),!0)}for(let i of _){if(!i.startsWith(n))continue;let o=i.slice(n.length);if(!o)continue;let u=o.indexOf("/");s.set(u===-1?o:o.slice(0,u),!0)}return[...s].map(([i,o])=>{let u=`${n}${i}`,m=o?void 0:a.get(u);return{name:i,dir:o,kind:o?"directory":"file",size:m===void 0?void 0:new TextEncoder().encode(m).length,modifiedAt:O.get(u)}}).sort((i,o)=>i.name<o.name?-1:1)},"files.delete":e=>{let t=p(y(e,"files.delete").path,"path","files.delete");a.delete(t),_.delete(t),O.delete(t);let n=`${t}/`;for(let s of[...a.keys()])s.startsWith(n)&&(a.delete(s),O.delete(s));for(let s of[..._])s.startsWith(n)&&_.delete(s);return null},"files.mkdir":e=>{let t=p(y(e,"files.mkdir").path,"path","files.mkdir");return _.add(t),O.set(t,new Date().toISOString()),null},"files.rename":e=>{let t=y(e,"files.rename"),n=p(t.path,"path","files.rename"),s=p(t.newPath,"newPath","files.rename"),i=`${n}/`;if(!(a.has(n)||_.has(n)||[...a.keys(),..._].some(b=>b.startsWith(i))))throw new l("BAD_REQUEST",`files.rename: no such file or directory '${n}'`);let u=b=>b===n?s:`${s}${b.slice(n.length)}`,m=(b,T)=>{let D=O.get(b);O.delete(b),D!==void 0&&O.set(T,D)};for(let b of[...a.keys()]){if(b!==n&&!b.startsWith(i))continue;let T=a.get(b);a.delete(b);let D=u(b);a.set(D,T),m(b,D)}for(let b of[..._]){if(b!==n&&!b.startsWith(i))continue;_.delete(b);let T=u(b);_.add(T),m(b,T)}return null},"files.uploadStart":e=>{let t=y(e,"files.uploadStart"),n=p(t.path,"path","files.uploadStart"),s=t.totalChunks;if(typeof s!="number"||!Number.isInteger(s)||s<1)throw new l("BAD_REQUEST","files.uploadStart: totalChunks must be a positive integer");let i=t.overwrite===!0;if(_.has(n))throw new l("BAD_REQUEST",`files.uploadStart: '${n}' is a directory \u2014 cannot upload over it`);if(a.has(n)&&!i)throw new l("BAD_REQUEST",`files.uploadStart: '${n}' already exists \u2014 pass overwrite to replace it`);let o=`upload-mock-${++X}`;return Z.set(o,{path:n,overwrite:i,totalChunks:s,chunks:new Array(s),nextExpectedChunk:0,bytesWritten:0,scope:us(n)}),{uploadId:o,chunkSize:256*1024,nextExpectedChunk:0}},"files.uploadChunk":e=>{let t=y(e,"files.uploadChunk"),n=p(t.uploadId,"uploadId","files.uploadChunk"),s=t.chunkIndex;if(typeof s!="number"||!Number.isInteger(s)||s<0)throw new l("BAD_REQUEST","files.uploadChunk: chunkIndex must be a non-negative integer");let i=p(t.content,"content","files.uploadChunk"),o=Z.get(n);if(!o)throw new l("BAD_REQUEST",`files.uploadChunk: unknown uploadId '${n}'`);if(s<o.nextExpectedChunk)return{chunkIndex:s,bytesWritten:o.bytesWritten};if(s!==o.nextExpectedChunk)throw new l("BAD_REQUEST",`files.uploadChunk: expected chunk ${o.nextExpectedChunk}, got ${s} \u2014 chunks must arrive in order`);if(s>=o.totalChunks)throw new l("BAD_REQUEST",`files.uploadChunk: upload '${n}' already has all ${o.totalChunks} chunks`);if(o.chunks[s]=et(i),o.nextExpectedChunk+=1,o.bytesWritten+=o.chunks[s].byteLength,o.nextExpectedChunk===o.totalChunks){let u=new Uint8Array(o.bytesWritten),m=0;for(let b of o.chunks)u.set(b,m),m+=b.byteLength;a.set(o.path,new TextDecoder().decode(u)),O.set(o.path,new Date().toISOString()),Z.delete(n)}return{chunkIndex:s,bytesWritten:o.bytesWritten}},"files.uploadStatus":e=>{let t=p(y(e,"files.uploadStatus").uploadId,"uploadId","files.uploadStatus"),n=Z.get(t);if(!n)throw new l("BAD_REQUEST",`files.uploadStatus: unknown uploadId '${t}'`);return{nextExpectedChunk:n.nextExpectedChunk}},"files.uploadCancel":e=>{let t=p(y(e,"files.uploadCancel").uploadId,"uploadId","files.uploadCancel");return Z.delete(t),null},"files.downloadStart":e=>{let t=y(e,"files.downloadStart"),n=p(t.path,"path","files.downloadStart");if(_.has(n)||[...a.keys()].some(b=>b.startsWith(`${n}/`)))throw new l("BAD_REQUEST","files.downloadStart: directory (zip) download isn't modeled in mock mode \u2014 test this path against a real host");let s=a.get(n);if(s===void 0)throw new l("BAD_REQUEST",`files.downloadStart: no such file '${n}'`);let i=new TextEncoder().encode(s),o=256*1024,u=Math.max(1,Math.ceil(i.byteLength/o)),m=`download-mock-${++X}`;return ie.set(m,{content:Je(i),fileSize:i.byteLength,totalChunks:u,mimeType:"text/plain",isZip:!1,scope:cs(n)}),{downloadId:m,fileSize:i.byteLength,totalChunks:u,chunkSize:o,mimeType:"text/plain",isZip:!1}},"files.downloadChunk":e=>{let t=y(e,"files.downloadChunk"),n=p(t.downloadId,"downloadId","files.downloadChunk"),s=t.chunkIndex;if(typeof s!="number"||!Number.isInteger(s)||s<0)throw new l("BAD_REQUEST","files.downloadChunk: chunkIndex must be a non-negative integer");let i=ie.get(n);if(!i)throw new l("BAD_REQUEST",`files.downloadChunk: unknown downloadId '${n}'`);if(s>=i.totalChunks)throw new l("BAD_REQUEST",`files.downloadChunk: download '${n}' has only ${i.totalChunks} chunks`);let o=et(i.content),u=256*1024,m=s*u,b=Math.min(m+u,o.byteLength);return{content:Je(o.subarray(m,b))}},"files.downloadCancel":e=>{let t=p(y(e,"files.downloadCancel").downloadId,"downloadId","files.downloadCancel");return ie.delete(t),null},"files.search":(e,t)=>{let n=y(e,"files.search"),s=p(n.path,"path","files.search"),i=p(n.query,"query","files.search"),o=typeof n.options=="object"&&n.options!==null?n.options:{},u=o.caseSensitive===!0,m=o.regex===!0,b=s===""||s==="."?"":`${s.replace(/\/+$/,"")}/`,T=m?new RegExp(i,u?"":"i"):void 0,D=u?i:i.toLowerCase(),Q=[];for(let[B,W]of a){if(b&&!B.startsWith(b))continue;let J=b?B.slice(b.length):B;W.split(`
8
- `).forEach((ye,cr)=>{let es=T?ye.search(T):(u?ye:ye.toLowerCase()).indexOf(D);es!==-1&&Q.push({path:J,line:cr+1,column:es+1,lineContent:ye,contextBefore:[],contextAfter:[]})})}return V(()=>{Q.length>0&&$(t,"results",{matches:Q}),$(t,"complete",{totalMatches:Q.length,fileCount:new Set(Q.map(B=>B.path)).size,truncated:!1})}),null},"files.definition":e=>{let t=y(e,"files.definition"),n=p(t.path,"path","files.definition"),i=p(t.symbolName,"symbolName","files.definition").replace(/[.*+?^${}()|[\]\\]/g,"\\$&"),o=new RegExp(`\\b(function|const|let|var|class|interface|type|enum)\\s+${i}\\b`),u=n===""||n==="."?"":`${n.replace(/\/+$/,"")}/`,m=[];for(let[b,T]of a){if(u&&!b.startsWith(u))continue;let D=u?b.slice(u.length):b;T.split(`
9
- `).forEach((Q,B)=>{let W=o.exec(Q);W&&m.push({path:D,line:B+1,column:W.index+1,lineContent:Q,kind:"function"})})}return m},"files.subscribeChanges":(e,t)=>{let n=p(y(e,"files.subscribeChanges").path,"path","files.subscribeChanges");return k.set(t,n),{subscribed:!0}},"storage.get":e=>{let t=q.get(p(y(e,"storage.get").key,"key","storage.get"));return t===void 0?void 0:structuredClone(t)},"storage.set":e=>{let t=y(e,"storage.set"),n=p(t.key,"key","storage.set"),s;try{s=structuredClone(t.value)}catch{throw new l("BAD_REQUEST","storage.set: value must be structured-cloneable")}return q.set(n,s),null},"storage.delete":e=>(q.delete(p(y(e,"storage.delete").key,"key","storage.delete")),null),"storage.keys":()=>[...q.keys()],"notifications.request":()=>(R=!0,null),"notifications.status":()=>({granted:R}),"notifications.revoke":()=>(R=!1,null),"theme.get":()=>({...A,tokens:{...A.tokens}}),"locale.get":()=>({...L}),"browser.tabs.list":()=>Dn(),"browser.tabs.subscribe":(e,t)=>(G.add(t),{subscribed:!0}),"browser.navigate":e=>{let t=y(e,"browser.navigate"),n=p(t.url,"url","browser.navigate"),s=typeof t.tabId=="string"?t.tabId:v;if(s===null)throw new l("BAD_REQUEST","browser.navigate: no tab is open to navigate");let i=he(s,"browser.navigate");return i.canGoBack=!0,i.url=n,i.title=Tt(n)??n,U+=1,fe(),null},"browser.open":e=>{let t=y(e,"browser.open"),n=p(t.url,"url","browser.open"),s=Tt(n);if(t.pinnedApp===!0&&s!==void 0){let o=x.find(u=>Tt(u.url)===s);if(o)return v=o.id,fe(),{tabId:o.id}}let i=`tab-mock-${++X}`;return x.push({id:i,url:n,title:s??n,isLoading:!1,canGoBack:!1,canGoForward:!1}),v=i,U+=1,fe(),{tabId:i}},"browser.close":e=>{let t=p(y(e,"browser.close").tabId,"tabId","browser.close"),n=x.findIndex(s=>s.id===t);if(n===-1)throw new l("BAD_REQUEST",`browser.close: unknown tabId '${t}'`);return x.splice(n,1),v===t&&(v=x[Math.min(n,x.length-1)]?.id??null),fe(),null},"browser.select":e=>{let t=p(y(e,"browser.select").tabId,"tabId","browser.select");return v=he(t,"browser.select").id,fe(),null},"browser.back":e=>Qn(e,"browser.back"),"browser.forward":e=>Qn(e,"browser.forward"),"browser.reload":e=>{let t=It(e,"browser.reload");return t.isLoading=!0,U+=1,fe(),V(()=>{t.isLoading=!1,fe()}),null},"browser.stop":e=>{let t=It(e,"browser.stop");return t.isLoading=!1,fe(),null},"browser.preflight":()=>({ok:!0}),"browser.resumeDriver":e=>{let t=p(y(e,"browser.resumeDriver").tabId,"tabId","browser.resumeDriver");return he(t,"browser.resumeDriver"),null},"browser.setDeviceProfile":e=>{let t=y(e,"browser.setDeviceProfile"),n=p(t.tabId,"tabId","browser.setDeviceProfile");if(t.formFactor!=="desktop"&&t.formFactor!=="mobile")throw new l("BAD_REQUEST","browser.setDeviceProfile: formFactor must be 'desktop' or 'mobile'");let s=he(n,"browser.setDeviceProfile");return s.deviceProfile=t.formFactor==="mobile"?{formFactor:"mobile",width:390,height:844,label:"Mobile"}:{formFactor:"desktop",width:1280,height:720,label:"Desktop"},fe(),null},"browser.view.attach":(e,t)=>{let n=e==null?{}:y(e,"browser.view.attach"),s=n.tabId===void 0||n.tabId===null?v:p(n.tabId,"tabId","browser.view.attach");if(s===null)throw new l("BAD_REQUEST","browser.view.attach: no tab is open to stream");let i=he(s,"browser.view.attach"),o={sessionId:`view-mock-${++X}`,requestId:t,tabId:i.id,detached:!1};return le.set(t,o),V(()=>{o.detached||($(t,"connectionState",{state:"negotiating"}),_n(o),$(t,"driverState",{tabId:o.tabId,state:"idle",since:0}))}),{sessionId:o.sessionId,tabId:o.tabId}},"browser.view.answer":e=>(Ke(e,"browser.view.answer"),p(y(e,"browser.view.answer").sdp,"sdp","browser.view.answer"),null),"browser.view.ice":e=>{Ke(e,"browser.view.ice");let t=y(e,"browser.view.ice").candidate;if(t!==null&&(typeof t!="object"||t===void 0))throw new l("BAD_REQUEST","browser.view.ice: candidate must be an object or null");return null},"browser.view.state":e=>{let t=Ke(e,"browser.view.state"),n=p(y(e,"browser.view.state").state,"state","browser.view.state");if(!["negotiating","connected","failed","closed"].includes(n))throw new l("BAD_REQUEST",`browser.view.state: unknown state '${n}'`);return $(t.requestId,"connectionState",{state:n}),n==="closed"&&vt(t),null},"browser.view.input":e=>{let t=Ke(e,"browser.view.input"),n=y(e,"browser.view.input").input,s=Array.isArray(n)?n:[n];if(s.length===0||s.length>is)throw new l("BAD_REQUEST",`browser.view.input: input must be 1\u2013${is} envelopes`);return s.find(o=>typeof o!="object"||o===null||typeof o.kind!="string")!==void 0?($(t.requestId,"inputRejected",{kind:"unknown",reason:"malformed",message:"invalid input envelope"}),{delivered:!1,reason:"malformed"}):{delivered:!0}},"browser.view.bounds":e=>{Ke(e,"browser.view.bounds");let t=y(e,"browser.view.bounds").bounds,n=t==null?null:y(t,"browser.view.bounds");if(!n||typeof n.width!="number"||typeof n.height!="number")throw new l("BAD_REQUEST","browser.view.bounds: bounds requires numeric { width, height }");return null},"browser.snapshot":e=>{let t=p(y(e,"browser.snapshot").tabId,"tabId","browser.snapshot"),n=he(t,"browser.snapshot");return{url:n.url,title:n.title,epoch:U,root:Ws(n)}},"browser.screenshot":e=>{let t=y(e,"browser.screenshot"),n=p(t.tabId,"tabId","browser.screenshot");return he(n,"browser.screenshot"),{format:t.format==="jpeg"?"jpeg":"png",data:Qr}},"browser.evaluate":e=>{let t=y(e,"browser.evaluate"),n=p(t.tabId,"tabId","browser.evaluate");return p(t.expr,"expr","browser.evaluate"),he(n,"browser.evaluate"),{value:null,type:"object"}},"browser.automate":(e,t)=>{let n=y(e,"browser.automate"),s=p(n.prompt,"prompt","browser.automate");if(s.trim()==="")throw new l("BAD_REQUEST","browser.automate: prompt must be a non-empty string");let i;if(n.engine!==void 0&&n.engine!==null&&(i=p(n.engine,"engine","browser.automate"),!He.includes(i)))throw new l("BAD_REQUEST",`browser.automate: unknown engine '${i}' \u2014 expected one of ${He.join(", ")}`);let o;if(n.model!==void 0&&n.model!==null&&(o=p(n.model,"model","browser.automate"),o===""))throw new l("BAD_REQUEST","browser.automate: model must be a non-empty string when present");let u=i??(o?Re(o):At);if(o&&Re(o)!==u)throw new l("BAD_REQUEST",`browser.automate: model '${o}' is not a ${u} model \u2014 it belongs to ${Re(o)}`);let m=o??(Re(je)===u?je:void 0);n.tabId!==void 0&&n.tabId!==null&&he(p(n.tabId,"tabId","browser.automate"),"browser.automate");let b=`automation-mock-${++X}`,T=`agent-mock-${++X}`,D=s.split(`
10
- `).find(J=>J.trim()!=="")?.trim()??s,Q={engine:u,...m?{model:m}:{},sessionId:T},B={taskId:b,requestId:t,status:"running",pendingProposalId:null,steps:[{event:"step",payload:{phase:"plan",detail:`1. Read the page
11
- 2. ${s}`}},{event:"step",payload:{phase:"observe",detail:"Read the page (mock)"}}],target:Q};j.set(t,B),V(()=>$(B.requestId,"session",{sessionId:T,name:D}));let W=()=>{if(B.status!=="running")return;if(B.steps.length===0){Ls(B);return}let J=B.steps.shift();$(B.requestId,J.event,On(B,J)),V(W)};return V(W),{taskId:b}},"browser.automate.approve":e=>{let t=y(e,"browser.automate.approve"),n=p(t.proposalId,"proposalId","browser.automate.approve"),s=t.verdict===void 0?"approve":t.verdict;if(s!=="approve"&&s!=="edit"&&s!=="deny")throw new l("BAD_REQUEST","browser.automate.approve: verdict must be 'approve', 'edit' or 'deny' when present");let i=[...j.values()].find(o=>o.pendingProposalId===n);if(!i)throw new l("BAD_REQUEST",`browser.automate.approve: no proposal '${n}' is awaiting a verdict`);if(i.pendingProposalId=null,i.status="running",s==="deny")i.steps=[{event:"done",payload:{status:"cancelled"}}];else{let o=s==="edit"&&typeof t.editedText=="string"?t.editedText:null;i.steps=[{event:"step",payload:{phase:"act",detail:o===null?'Clicked "Continue" (mock)':`Typed "${o}" (mock)`,proposalId:n}},{event:"step",payload:{phase:"extract",detail:"Read the resulting page (mock)"}},{event:"done",payload:{status:"success",result:`Completed: ${i.taskId} (mock)`}}]}return V(()=>qn(i)),null},"composer.autocomplete":e=>{let t=p(y(e,"composer.autocomplete").query,"query","composer.autocomplete").toLowerCase();return[...a.keys()].filter(n=>t===""||n.toLowerCase().includes(t)).slice(0,15).map(n=>({value:n,label:n,isDirectory:!1,isRecent:!1,fileType:n.split(".").pop()??"",matchedIndices:[]}))},"composer.skills":()=>Gr.map(e=>({...e})),"composer.snippets":e=>{let t=y(e,"composer.snippets"),n=typeof t.query=="string"?t.query.trim().toLowerCase():"",s=Ur.map(i=>({...i,aliases:[...i.aliases]}));return n===""?s:s.filter(i=>i.name.includes(n)||i.description.toLowerCase().includes(n))},"composer.settings":()=>({engines:[...He],defaults:{engine:At,model:je,effortLevel:"auto",fastMode:!1},models:$s.map(e=>({...e})),modelsStatus:{fetchedAt:new Date().toISOString(),stale:!1,refreshing:!1},effortLevels:Object.fromEntries(Object.entries(Gn).map(([e,t])=>[e,[...t]])),inferenceEngines:[...Un]}),"terminal.sessions.list":()=>[...pe.values()].map(Fn),"terminal.sessions.subscribe":(e,t)=>(Le.add(t),{subscribed:!0}),"terminal.open":e=>{let t=y(e,"terminal.open"),n=t.cols,s=t.rows;if(typeof n!="number"||!Number.isInteger(n)||n<1)throw new l("BAD_REQUEST","terminal.open: cols must be a positive integer");if(typeof s!="number"||!Number.isInteger(s)||s<1)throw new l("BAD_REQUEST","terminal.open: rows must be a positive integer");let i=t.cwd===void 0?"/workspace":p(t.cwd,"cwd","terminal.open"),o=`pty-mock-${++X}`,u=new Date().toISOString(),m={id:o,shell:"mock-shell",cwd:i,cols:n,rows:s,platform:"linux",createdAt:u,lastActivityAt:u,scrollback:`Mock shell ready (${o})
12
- $ `,closed:!1,attachedRequestIds:new Set};return pe.set(o,m),$n({kind:"opened",session:Fn(m)}),{id:o,shell:m.shell,cwd:i,cols:n,rows:s,platform:m.platform}},"terminal.attach":(e,t)=>{let n=p(y(e,"terminal.attach").id,"id","terminal.attach"),s=pe.get(n);if(!s||s.closed)throw new l("BAD_REQUEST",`terminal.attach: unknown session '${n}'`);return s.attachedRequestIds.add(t),ke.set(t,s),V(()=>{s.attachedRequestIds.has(t)&&mn(t,"scrollback",{data:s.scrollback})}),{id:n}},"terminal.write":e=>{let t=y(e,"terminal.write"),n=p(t.id,"id","terminal.write"),s=p(t.data,"data","terminal.write"),i=pe.get(n);if(!i||i.closed)throw new l("BAD_REQUEST",`terminal.write: unknown session '${n}'`);i.lastActivityAt=new Date().toISOString(),Ln(i,s),Bt(i,"output",{data:s});let o=s.replace(/[\r\n]+$/,"");return o==="burst"?Zs(i):o==="exit"&&Wn(i,0),null},"terminal.resize":e=>{let t=y(e,"terminal.resize"),n=p(t.id,"id","terminal.resize"),s=pe.get(n);if(!s||s.closed)throw new l("BAD_REQUEST",`terminal.resize: unknown session '${n}'`);let i=t.cols,o=t.rows;if(typeof i!="number"||!Number.isInteger(i)||i<1)throw new l("BAD_REQUEST","terminal.resize: cols must be a positive integer");if(typeof o!="number"||!Number.isInteger(o)||o<1)throw new l("BAD_REQUEST","terminal.resize: rows must be a positive integer");return s.cols=i,s.rows=o,null},"terminal.close":e=>{let t=p(y(e,"terminal.close").id,"id","terminal.close"),n=pe.get(t);return n&&Wn(n,0),null},"git.status":e=>{let{worktree:t}=te(e,"git.status"),n=I.get(t.branch);return{branch:t.branch,isDirty:t.staged.length+t.unstaged.length+t.untracked.length>0,staged:t.staged.map(s=>({...s})),unstaged:t.unstaged.map(s=>({...s})),untracked:t.untracked.map(s=>({...s})),ahead:0,behind:0,hasUpstream:n?.upstream!==void 0}},"git.log":e=>{let{record:t}=te(e,"git.log"),n=t.limit;if(n!==void 0&&(typeof n!="number"||!Number.isInteger(n)||n<1))throw new l("BAD_REQUEST","git.log: limit must be a positive integer when present");let s=t.skip;if(s!==void 0&&(typeof s!="number"||!Number.isInteger(s)||s<0))throw new l("BAD_REQUEST","git.log: skip must be a non-negative integer when present");let i=n??20,o=s??0,u=t.search===void 0||t.search===null?void 0:p(t.search,"search","git.log"),m=u?N.filter(D=>D.subject.toLowerCase().includes(u.toLowerCase())):N,T={entries:m.slice(o,o+i).map(({hash:D,shortHash:Q,subject:B,author:W,date:J})=>({hash:D,shortHash:Q,subject:B,author:W,date:J})),hasMore:o+i<m.length,skip:o};return u!==void 0&&(T.search=u),T},"git.diff":e=>{let{worktree:t,record:n}=te(e,"git.diff"),s=p(n.path,"path","git.diff"),i=n.staged===!0;if(![...t.staged,...t.unstaged,...t.untracked].some(u=>u.path===s))throw new l("BAD_REQUEST",`git.diff: '${s}' has no pending changes in this worktree`);return{path:s,original:`// ${s} (mock) \u2014 before
2
+ "use strict";var Minionry=(()=>{var Ct=Object.defineProperty;var jr=Object.getOwnPropertyDescriptor;var Vr=Object.getOwnPropertyNames;var Yr=Object.prototype.hasOwnProperty;var zr=(p,y,b)=>y in p?Ct(p,y,{enumerable:!0,configurable:!0,writable:!0,value:b}):p[y]=b;var Zr=(p,y)=>{for(var b in y)Ct(p,b,{get:y[b],enumerable:!0})},Xr=(p,y,b,R)=>{if(y&&typeof y=="object"||typeof y=="function")for(let M of Vr(y))!Yr.call(p,M)&&M!==b&&Ct(p,M,{get:()=>y[M],enumerable:!(R=jr(y,M))||R.enumerable});return p};var Jr=p=>Xr(Ct({},"__esModule",{value:!0}),p);var Mt=(p,y,b)=>zr(p,typeof y!="symbol"?y+"":y,b);var wo={};Zr(wo,{AGENT_RUN_LIMITS:()=>$e,AGENT_RUN_MODEL_SELECTIONS:()=>xt,BROWSER_INPUT_MODIFIERS:()=>ni,CDP_BINDING_NAME:()=>ri,CDP_MESSAGE_EVENT:()=>ii,HOST_CONNECT_TYPE:()=>pn,MINIONRY_ANNOUNCE_EVENT:()=>at,MINIONRY_ERROR_CODES:()=>ti,MINIONRY_FRAME_PREFIX:()=>si,MINIONRY_REQUEST_EVENT:()=>lt,MinionryError:()=>l,PROVIDER_API_VERSION:()=>ho,SCOPES:()=>cn,SCOPE_RISK_TIERS:()=>ei,SDK_CONNECT_ACK_TYPE:()=>gn,SDK_EVENT_TYPE:()=>hn,SDK_HELLO_TYPE:()=>dn,SDK_KEYDOWN_TYPE:()=>bn,SDK_NOTIFICATION_TYPE:()=>wn,SDK_PROTOCOL_VERSION:()=>un,SDK_REQUEST_TYPE:()=>mn,SDK_RESPONSE_TYPE:()=>fn,SDK_TOOL_CALL_TYPE:()=>yn,SDK_VERSION:()=>fo,announceProvider:()=>cr,connectPostMessage:()=>ar,createMockTransport:()=>Dn,createOfflineCache:()=>dr,createPostMessageTransport:()=>gt,createProvider:()=>Ae,detect:()=>ur,installKeyboardForwarding:()=>lr,mock:()=>or});var cn=["identity","storage","files:app","pm:read","agents:run","pm:write","files:workspace:read","files:workspace:write","notifications","pm:execute","pm:schedule","agents:sessions","browser:read","browser:control","settings:read","git:read","git:write","git:remote","terminal:read","terminal:exec","tools:serve","quality:read","quality:run","inference:run","endpoints:register","pm:chain","agents:schedule"],ei={identity:"low",storage:"low","files:app":"low","pm:read":"medium","agents:run":"high","pm:write":"high","files:workspace:read":"high","files:workspace:write":"critical",notifications:"medium","pm:execute":"critical","pm:schedule":"critical","agents:sessions":"high","browser:read":"high","browser:control":"critical","settings:read":"low","git:read":"medium","git:write":"high","git:remote":"critical","terminal:read":"high","terminal:exec":"critical","tools:serve":"medium","quality:read":"low","quality:run":"high","inference:run":"high","endpoints:register":"high","pm:chain":"critical","agents:schedule":"critical"},ti=["USER_REJECTED","SCOPE_DENIED","RATE_LIMITED","SPACE_DISCONNECTED","QUOTA_EXCEEDED","UNSUPPORTED","CANCELLED","CONFLICT"],l=class extends Error{constructor(b,R){super(R??b);Mt(this,"code");this.name="MinionryError",this.code=b}},$e={maxSystemPromptChars:32e3,maxTurns:50,maxSeconds:1800,endpointsPerApp:8,maxTtlMs:864e5},xt=["quality"],ni={alt:1,ctrl:2,meta:4,shift:8};var un=1,si="minionry:",dn="minionry:hello",pn="minionry:connect",gn="minionry:connect-ack",mn="minionry:request",fn="minionry:response",hn="minionry:event",wn="minionry:notification",yn="minionry:tool-call",bn="minionry:keydown",ri="__minionryBinding",ii="minionry#message",at="minionry#announce",lt="minionry#request";function ct(p){let b="";for(let R=0;R<p.length;R+=32768)b+=String.fromCharCode(...p.subarray(R,R+32768));return btoa(b)}function ut(p){let y=atob(p),b=new Uint8Array(y.length);for(let R=0;R<y.length;R++)b[R]=y.charCodeAt(R);return b}var oe=class{constructor(){Mt(this,"listeners",new Map)}on(y,b){let R=this.listeners.get(y);R||(R=[],this.listeners.set(y,R));let M={cb:b};R.push(M);let C=!1;return()=>{if(C)return;C=!0;let K=this.listeners.get(y);if(!K)return;let A=K.indexOf(M);A!==-1&&K.splice(A,1)}}emit(y,b){let R=this.listeners.get(y);if(!(!R||R.length===0))for(let M of[...R])try{M.cb(b)}catch(C){console.error("[@minionry/sdk] listener error",C)}}},Ps="the transport is closed \u2014 the host frame was torn down or the Space disconnected",Sn=256*1024,oi=50*1024*1024,kn=6,Ds=500,Qs=p=>new Promise(y=>setTimeout(y,p));function ai(p){let y=p.lastIndexOf("/");return y===-1?p:p.slice(y+1)}var li="streamResume",En="appEndpoints",ci="agentsAppEndpoint",ui=["model","systemPrompt","budget","sessionId"],di="agentsModelSelection",pi="agentsEngineSelection",gi="filesConditionalWrite",mi="inferenceFastMode",Bt="pmChains",dt="agentSchedules",Us="scheduleWallClock",fi="pmScheduleZip",hi="pmScheduleRunNow",wi=new Set(["daily","monthly"]);function Rn(p,y){for(let b of[...y].sort((R,M)=>R.seq-M.seq))b.seq<=p.lastSeq||(p.deliver(b.event,b.payload),p.lastSeq=b.seq)}function yi(p){return p instanceof l?p.message:String(p)}function Ae(p){let y=new Map,b=new Map,R=new oe,M=0,C=!1,K,A=0,I=()=>`r${++M}`,a=(i,u,m=I())=>C?Promise.reject(new l("SPACE_DISCONNECTED",`${i} failed: ${Ps}`)):new Promise((w,S)=>{y.set(m,{resolve:w,reject:S});let E={requestId:m,method:i};u!==void 0&&(E.params=u);try{p.send(E)}catch(_){y.delete(m),S(new l("SPACE_DISCONNECTED",`${i} failed: transport send threw (${String(_)})`))}}),Q,N=()=>{if(!Q){let i=a("features").then(u=>Array.isArray(u)?u:[],u=>{throw Q===i&&(Q=void 0),u});Q=i}return Q},$=async(i,u)=>{if(!(await N()).includes(i))throw new l("UNSUPPORTED",`${u} needs a host that advertises the '${i}' feature \u2014 this host does not, so nothing was sent`)},re=async(i,u,m)=>{m!==void 0?await $(Us,`${i} with maxLatenessMs`):u!==void 0&&wi.has(u.kind)&&await $(Us,`${i} with ${u.kind} timing`)},ae=()=>N().then(i=>i.includes(li),()=>!1),j=(i,u,m)=>{b.set(i,{lastSeq:0,resuming:!1,pending:[],deliver:u,onGap:m})},B=i=>{b.delete(i)},Ce=(i,u)=>{u.resuming=!0,ae().then(m=>{if(!C){if(!m)throw new l("SCOPE_DENIED","this host does not advertise the streamResume feature");return a("stream.resume",{requestId:i,afterSeq:u.lastSeq})}}).then(m=>{if(C||!b.has(i))return;Rn(u,m&&Array.isArray(m.events)?m.events:[]);let w=u.pending;u.pending=[],u.resuming=!1,Rn(u,w)}).catch(m=>{if(C||!b.has(i))return;u.resuming=!1;let w=u.pending;u.pending=[],u.onGap(yi(m)),Rn(u,w)})},Me=(i,u,m,w)=>{let S=b.get(i);if(S){if(u===void 0){S.deliver(m,w);return}if(S.resuming){S.pending.push({seq:u,event:m,payload:w});return}if(!(u<=S.lastSeq)){if(u===S.lastSeq+1){S.deliver(m,w),S.lastSeq=u;return}S.pending.push({seq:u,event:m,payload:w}),Ce(i,S)}}},ee=new Map,le=i=>{C||a("tools.result",i).catch(()=>{})},ce=i=>{let u=ee.get(i);if(u){ee.delete(i);for(let m of u.calls.values())m.abort();u.calls.clear()}},Re=i=>{let u=ee.get(i.requestId);if(i.op==="cancel"){let E=u?.calls.get(i.callId);u?.calls.delete(i.callId),E?.abort();return}let m=u?.tools.get(i.tool);if(!u||!m){le({callId:i.callId,ok:!1,error:{code:"APP_UNAVAILABLE",message:`this app is not serving a tool named '${i.tool}'`}});return}let w=new AbortController;u.calls.set(i.callId,w);let S={callId:i.callId,tool:i.tool,signal:w.signal};Promise.resolve().then(()=>m.handler(i.input,S)).then(E=>{u.calls.delete(i.callId)&&le({callId:i.callId,ok:!0,result:E})},E=>{u.calls.delete(i.callId)&&le({callId:i.callId,ok:!1,error:{code:"APP_ERROR",message:E instanceof Error?E.message:String(E)}})})};return p.start({onResponse(i){let u=y.get(i.requestId);u&&(y.delete(i.requestId),i.ok?u.resolve(i.result):u.reject(new l(i.error.code,i.error.message)))},onEvent(i){Me(i.requestId,i.seq,i.event,i.payload)},onNotification(i){if(i.event==="intent"){A>0?R.emit("intent",i.payload):K=i.payload;return}(i.event==="disconnect"||i.event==="spaceChanged")&&(Q=void 0),(i.event==="disconnect"||i.event==="grantsChanged"||i.event==="spaceChanged"||i.event==="themeChanged"||i.event==="localeChanged")&&R.emit(i.event,i.payload)},onToolCall(i){C||Re(i)},onClose(){if(C)return;C=!0;let i=new l("SPACE_DISCONNECTED",Ps),u=[...y.values()];y.clear(),b.clear();for(let m of[...ee.keys()])ce(m);for(let m of u)m.reject(i);R.emit("disconnect",void 0)}}),{version:"1",async features(){return await a("features")},async connect(i){return await a("connect",{scopes:i.scopes})},async disconnect(){await a("disconnect")},auth:{async getToken(){return await a("auth.getToken")}},agents:{async run(i){let u=ui.filter(D=>i[D]!==void 0);u.length>0&&await $(ci,`agents.run with ${u.join(", ")}`),i.modelSelection!==void 0&&await $(di,"agents.run with modelSelection"),i.engineSelection!==void 0&&await $(pi,"agents.run with engineSelection");let m={prompt:i.prompt,title:i.title};for(let D of u)m[D]=i[D];i.modelSelection!==void 0&&(m.modelSelection=i.modelSelection),i.engineSelection!==void 0&&(m.engineSelection=i.engineSelection);let w=I(),S=new oe;j(w,(D,Z)=>S.emit(D,Z),D=>S.emit("gap",{message:D}));let E,_;try{let D=await a("agents.run",m,w);E=D.runId,_=typeof D.sessionId=="string"?D.sessionId:""}catch(D){throw B(w),D}let v;return{id:E,sessionId:_,on(D,Z){return S.on(D,Z)},result(){return v??(v=a("agents.result",{runId:E}).catch(D=>{throw v=void 0,D})),v},async cancel(){await a("cancel",{requestId:w})}}},sessions:{async list(){return await a("agents.sessions.list")},async create(i){return await a("agents.sessions.create",{name:i?.name})},async attach(i){return await a("agents.sessions.attach",{sessionId:i})},async close(i){await a("agents.sessions.close",{sessionId:i})},async rename(i,u){return await a("agents.sessions.rename",{sessionId:i,name:u.name})},async history(i){return await a("agents.sessions.history",{sessionId:i})},async replay(i,u){return await a("agents.sessions.replay",{sessionId:i,afterSeq:u})},async approve(i,u){await a("agents.sessions.approve",{sessionId:i,approved:u})},async answerQuestion(i,u,m){await a("agents.sessions.answerQuestion",{sessionId:i,toolUseId:u,answers:m})},async prompt(i,u,m){return await a("agents.sessions.prompt",{sessionId:i,prompt:u,attachments:m})},async stop(i){await a("agents.sessions.stop",{sessionId:i})}},schedules:{async list(){await $(dt,"agents.schedules.list");let i=await a("agents.schedules.list",{});return Array.isArray(i)?i:i.schedules},async create(i){return await $(dt,"agents.schedules.create"),await a("agents.schedules.create",i)},async update(i,u){return await $(dt,"agents.schedules.update"),await a("agents.schedules.update",{scheduleId:i,patch:u})},async delete(i){await $(dt,"agents.schedules.delete"),await a("agents.schedules.delete",{scheduleId:i})},async runNow(i){return await $(dt,"agents.schedules.runNow"),await a("agents.schedules.runNow",{scheduleId:i})}}},apps:{async open(i){await a("apps.open",{app:i.app,params:i.params})}},pm:{async createBoard(i){return await a("pm.createBoard",{prompt:i.prompt,autoImplement:i.autoImplement,input:i.input})},async getBoard(i){return await a("pm.getBoard",{boardId:i})},async listBoards(){return await a("pm.listBoards",{})},async createIssue(i){return await a("pm.createIssue",i)},async updateIssue(i,u,m){return await a("pm.updateIssue",{boardId:i,issueId:u,fields:m})},async deleteIssue(i,u){await a("pm.deleteIssue",{boardId:i,issueId:u})},async updateBoard(i,u){return await a("pm.updateBoard",{boardId:i,fields:u})},onBoardUpdate(i,u){let m=I(),w=!0;return j(m,(S,E)=>{w&&S==="boardUpdate"&&u(E)},S=>{w&&R.emit("boardGap",{boardId:i,message:S})}),a("pm.subscribeBoard",{boardId:i},m).catch(S=>{w&&(w=!1,B(m),console.error(`[@minionry/sdk] pm.onBoardUpdate(${i}) subscription failed`,S))}),()=>{w&&(w=!1,B(m),C||a("cancel",{requestId:m}).catch(()=>{}))}},async execute(i){let u=I(),m=new oe;j(u,(E,_)=>m.emit(E,_),E=>m.emit("gap",{message:E}));let w;try{w=(await a("pm.execute",{boardId:i},u)).runId}catch(E){throw B(u),E}return{id:w,boardId:i,on(E,_){return m.on(E,_)},async pause(){await a("pm.pause",{boardId:i,runId:w})},async resume(){await a("pm.resume",{boardId:i,runId:w})},async stop(){await a("pm.stop",{boardId:i,runId:w})}}},schedules:{async list(){return(await a("pm.schedules.list",{})).schedules},async create(i){return i.source?.kind==="board-zip"&&await $(fi,"pm.schedules.create with a board-zip source"),await re("pm.schedules.create",i.timing,i.maxLatenessMs),await a("pm.schedules.create",i)},async update(i,u){return await re("pm.schedules.update",u.timing,u.maxLatenessMs),await a("pm.schedules.update",{scheduleId:i,patch:u})},async delete(i){await a("pm.schedules.delete",{scheduleId:i})},async runNow(i){return await $(hi,"pm.schedules.runNow"),await a("pm.schedules.runNow",{scheduleId:i})}},chains:{async list(){return await $(Bt,"pm.chains.list"),(await a("pm.chains.list",{})).links},async create(i){return await $(Bt,"pm.chains.create"),await a("pm.chains.create",i)},async update(i,u){return await $(Bt,"pm.chains.update"),await a("pm.chains.update",{linkId:i,patch:u})},async delete(i){await $(Bt,"pm.chains.delete"),await a("pm.chains.delete",{linkId:i})}}},files:{async read(i){return await a("files.read",{path:i})},async readEntry(i){return await a("files.readEntry",{path:i})},async write(i,u,m){let w=m?.expectedModifiedAt;if(w===void 0){await a("files.write",{path:i,content:u});return}await $(gi,"files.write with expectedModifiedAt"),await a("files.write",{path:i,content:u,expectedModifiedAt:w})},async list(i){return await a("files.list",{path:i})},async delete(i){await a("files.delete",{path:i})},async mkdir(i){await a("files.mkdir",{path:i})},async rename(i,u){await a("files.rename",{path:i,newPath:u})},async search(i,u,m){let w=I(),S=new oe;j(w,(v,U)=>S.emit(v,U),v=>S.emit("gap",{message:v}));try{await a("files.search",{path:i,query:u,options:m},w)}catch(v){throw B(w),v}let E=!1;return{id:w,on(v,U){return S.on(v,U)},async cancel(){E||(E=!0,B(w),await a("cancel",{requestId:w}))}}},async definition(i,u,m){return await a("files.definition",{path:i,symbolName:u,language:m?.language,currentFile:m?.currentFile})},onChanged(i,u){let m=I(),w=!0;return j(m,(S,E)=>{w&&S==="changed"&&u(E),w&&S==="gap"&&R.emit("fileChangeGap",{path:i,...E})},S=>{w&&R.emit("fileChangeGap",{path:i,message:S})}),a("files.subscribeChanges",{path:i},m).catch(S=>{w&&(w=!1,B(m),console.error(`[@minionry/sdk] files.onChanged(${i}) subscription failed`,S))}),()=>{w&&(w=!1,B(m),C||a("cancel",{requestId:m}).catch(()=>{}))}},async upload(i,u,m){if(u.byteLength>oi)throw new l("BAD_REQUEST",`files.upload: ${u.byteLength} bytes exceeds the 50 MiB cap`);let w=I(),S=new oe;j(w,(H,G)=>S.emit(H,G),()=>{});let E=u.byteLength,_=Math.max(1,Math.ceil(E/Sn)),v;try{v=(await a("files.uploadStart",{path:i,fileName:ai(i),fileSize:E,totalChunks:_,mimeType:m?.mimeType,overwrite:m?.overwrite},w)).uploadId}catch(H){throw B(w),H}let U=!1,D,Z,pe=new Promise((H,G)=>{D=H,Z=G});return(async()=>{let H=0,G=0;for(;H<_;){if(U)return;let F=H*Sn,te=Math.min(F+Sn,E),q=ct(u.subarray(F,te));G+=1;try{let ge=await a("files.uploadChunk",{uploadId:v,chunkIndex:H,content:q});S.emit("progress",{chunkIndex:H,totalChunks:_,bytesTransferred:ge.bytesWritten,totalBytes:E}),H+=1,G=0}catch(ge){if(U)return;if(G>=kn){B(w),Z(ge);return}await Qs(Ds);try{let X=await a("files.uploadStatus",{uploadId:v});X.nextExpectedChunk!==H&&(G=0),H=X.nextExpectedChunk}catch{}}}B(w),D({path:i,bytesWritten:E})})(),{id:v,on(H,G){return S.on(H,G)},result(){return pe},async cancel(){U=!0,B(w),Z(new l("CANCELLED","files.upload cancelled")),await a("files.uploadCancel",{uploadId:v}).catch(()=>{})}}},async download(i,u){let m=I(),w=new oe;j(m,(G,F)=>w.emit(G,F),()=>{});let S,E,_,v,U;try{let G=await a("files.downloadStart",{path:i,asZip:u?.asZip},m);S=G.downloadId,E=G.fileSize,_=G.totalChunks,v=G.mimeType,U=G.isZip}catch(G){throw B(m),G}let D=!1,Z,pe,ve=new Promise((G,F)=>{Z=G,pe=F});return(async()=>{let G=new Array(_),F=0,te=0;for(;te<_;){if(D)return;let X=0,ye=!1;for(;!ye&&X<kn;){X+=1;try{let be=await a("files.downloadChunk",{downloadId:S,chunkIndex:te}),Ie=ut(be.content);G[te]=Ie,F+=Ie.byteLength,w.emit("progress",{chunkIndex:te,totalChunks:_,bytesTransferred:F,totalBytes:E}),ye=!0}catch(be){if(D)return;if(X>=kn){B(m),pe(be);return}await Qs(Ds)}}te+=1}let q=new Uint8Array(E),ge=0;for(let X of G)q.set(X,ge),ge+=X.byteLength;B(m),Z({path:i,bytes:q,mimeType:v,isZip:U,fileSize:E})})(),{id:S,on(G,F){return w.on(G,F)},result(){return ve},async cancel(){D=!0,B(m),pe(new l("CANCELLED","files.download cancelled")),await a("files.downloadCancel",{downloadId:S}).catch(()=>{})}}}},storage:{async get(i){return await a("storage.get",{key:i})},async set(i,u){await a("storage.set",{key:i,value:u})},async delete(i){await a("storage.delete",{key:i})},async keys(){return await a("storage.keys")}},notifications:{async request(){await a("notifications.request")},async status(){return await a("notifications.status")},async revoke(){await a("notifications.revoke")}},theme:{async get(){return await a("theme.get")}},locale:{async get(){return await a("locale.get")}},browser:{tabs:{async list(){return await a("browser.tabs.list")},onChanged(i){let u=I(),m=!0;return j(u,(w,S)=>{m&&w==="tabsChanged"&&i(S)},()=>{}),a("browser.tabs.subscribe",void 0,u).catch(w=>{m&&(m=!1,B(u),console.error("[@minionry/sdk] browser.tabs.onChanged subscription failed",w))}),()=>{m&&(m=!1,B(u),C||a("cancel",{requestId:u}).catch(()=>{}))}}},view:{async attach(i){let u=I(),m=new oe;j(u,(v,U)=>m.emit(v,U),v=>m.emit("gap",{message:v}));let w;try{w=await a("browser.view.attach",{tabId:i?.tabId,bounds:i?.bounds},u)}catch(v){throw B(u),v}let S=w.sessionId,E=!1;return{id:S,tabId:w.tabId,on(v,U){return m.on(v,U)},async answer(v){await a("browser.view.answer",{sessionId:S,sdp:v})},async addIceCandidate(v){await a("browser.view.ice",{sessionId:S,candidate:v})},async setConnectionState(v,U){await a("browser.view.state",{sessionId:S,state:v,reason:U})},async sendInput(v){return await a("browser.view.input",{sessionId:S,input:v})},async setBounds(v){await a("browser.view.bounds",{sessionId:S,bounds:v})},async detach(){E||(E=!0,B(u),await a("cancel",{requestId:u}))}}}},async navigate(i,u){await a("browser.navigate",{url:i,tabId:u})},async back(i){await a("browser.back",{tabId:i})},async forward(i){await a("browser.forward",{tabId:i})},async reload(i){await a("browser.reload",{tabId:i})},async stop(i){await a("browser.stop",{tabId:i})},async open(i,u){return await a("browser.open",{url:i,pinnedApp:u?.pinnedApp})},async close(i){await a("browser.close",{tabId:i})},async select(i){await a("browser.select",{tabId:i})},async snapshot(i){return await a("browser.snapshot",{tabId:i})},async screenshot(i,u){return await a("browser.screenshot",{tabId:i,fullPage:u?.fullPage,format:u?.format,quality:u?.quality})},async evaluate(i,u,m){return await a("browser.evaluate",{tabId:i,expr:u,world:m?.world,timeoutMs:m?.timeoutMs})},async preflight(){return await a("browser.preflight")},async resumeDriver(i){await a("browser.resumeDriver",{tabId:i})},async setDeviceProfile(i,u){await a("browser.setDeviceProfile",{tabId:i,formFactor:u})},async automate(i,u){let m=I(),w=new oe;j(m,(v,U)=>w.emit(v,U),v=>w.emit("gap",{message:v}));let S;try{S=(await a("browser.automate",{prompt:i,engine:u?.engine,model:u?.model,tabId:u?.tabId},m)).taskId}catch(v){throw B(m),v}let E=!1;return{id:S,on(v,U){return w.on(v,U)},async approve(v,U,D){await a("browser.automate.approve",{proposalId:v,verdict:U,editedText:D})},async cancel(){E||(E=!0,B(m),await a("cancel",{requestId:m}))}}}},composer:{async autocomplete(i){return await a("composer.autocomplete",{query:i})},async skills(){return await a("composer.skills")},async snippets(i){return await a("composer.snippets",{query:i})},async settings(){return await a("composer.settings")}},terminal:{sessions:{async list(){return await a("terminal.sessions.list")},onChanged(i){let u=I(),m=!0;return j(u,(w,S)=>{m&&w==="sessionChanged"&&i(S)},()=>{}),a("terminal.sessions.subscribe",void 0,u).catch(w=>{m&&(m=!1,B(u),console.error("[@minionry/sdk] terminal.sessions.onChanged subscription failed",w))}),()=>{m&&(m=!1,B(u),C||a("cancel",{requestId:u}).catch(()=>{}))}}},async open(i){return await a("terminal.open",{cwd:i.cwd,cols:i.cols,rows:i.rows})},async attach(i){let u=I(),m=new oe;j(u,(E,_)=>m.emit(E,_),E=>m.emit("gap",{message:E}));try{await a("terminal.attach",{id:i},u)}catch(E){throw B(u),E}let w=!1;return{id:i,on(E,_){return m.on(E,_)},async detach(){w||(w=!0,B(u),await a("cancel",{requestId:u}))}}},async write(i,u){await a("terminal.write",{id:i,data:Array.isArray(u)?u.join(""):u})},async resize(i,u){await a("terminal.resize",{id:i,cols:u.cols,rows:u.rows})},async close(i){await a("terminal.close",{id:i})}},git:{async status(i){return await a("git.status",{worktree:i?.worktree})},async log(i){return await a("git.log",{worktree:i?.worktree,limit:i?.limit,skip:i?.skip,search:i?.search})},async diff(i){return await a("git.diff",{worktree:i.worktree,path:i.path,staged:i.staged})},async show(i,u){return await a("git.show",{worktree:u?.worktree,hash:i})},async commitDiff(i){return await a("git.commitDiff",{worktree:i.worktree,hash:i.hash,path:i.path})},branches:{async list(i){return await a("git.branches.list",{worktree:i?.worktree})},async create(i){return await a("git.branches.create",{worktree:i.worktree,name:i.name,startPoint:i.startPoint,checkout:i.checkout})},async delete(i){await a("git.branches.delete",{worktree:i.worktree,name:i.name,force:i.force})}},tags:{async list(i){return await a("git.tags.list",{worktree:i?.worktree})},async create(i){return await a("git.tags.create",{worktree:i.worktree,name:i.name,message:i.message,commit:i.commit})},async push(i){return await a("git.tags.push",{worktree:i?.worktree,name:i?.name,all:i?.all})}},remote:{async info(i){return await a("git.remote.info",{worktree:i?.worktree})}},repos:{async discover(){return await a("git.repos.discover")}},worktrees:{async list(){return await a("git.worktrees.list")},async create(i){return await a("git.worktrees.create",{branchName:i.branchName,baseBranch:i.baseBranch,path:i.path,assign:i.assign})},async remove(i){await a("git.worktrees.remove",{path:i.path,force:i.force,deleteBranch:i.deleteBranch})},async switchActive(i){return await a("git.worktrees.switchActive",{path:i?.path})},onChanged(i){let u=I(),m=!0;return j(u,(w,S)=>{m&&w==="worktreesChanged"&&i(S)},()=>{}),a("git.worktrees.subscribe",void 0,u).catch(w=>{m&&(m=!1,B(u),console.error("[@minionry/sdk] git.worktrees.onChanged subscription failed",w))}),()=>{m&&(m=!1,B(u),C||a("cancel",{requestId:u}).catch(()=>{}))}}},merge:{async preview(i){return await a("git.merge.preview",{worktree:i.worktree,sourceBranch:i.sourceBranch,targetBranch:i.targetBranch})},async run(i){return await a("git.merge.run",{worktree:i.worktree,sourceBranch:i.sourceBranch,targetBranch:i.targetBranch,strategy:i.strategy,commitMessage:i.commitMessage,deleteWorktree:i.deleteWorktree,deleteBranch:i.deleteBranch,stashFirst:i.stashFirst})},async abort(i){return await a("git.merge.abort",{worktree:i?.worktree})},async complete(i){return await a("git.merge.complete",{worktree:i?.worktree})},async stashPop(i){return await a("git.merge.stashPop",{worktree:i.worktree,stashSha:i.stashSha})},async discardBlockers(i){return await a("git.merge.discardBlockers",{worktree:i.worktree,paths:i.paths})}},pr:{async generateDescription(i){return await a("git.pr.generateDescription",{worktree:i?.worktree,baseBranch:i?.baseBranch})},async create(i){return await a("git.pr.create",{worktree:i.worktree,title:i.title,body:i.body,baseBranch:i.baseBranch,draft:i.draft})}},async stage(i){return await a("git.stage",{worktree:i.worktree,paths:i.paths,stageAll:i.stageAll})},async unstage(i){return await a("git.unstage",{worktree:i.worktree,paths:i.paths})},async commit(i){return await a("git.commit",{worktree:i.worktree,message:i.message})},async generateCommitMessage(i){return await a("git.generateCommitMessage",{worktree:i?.worktree})},async checkout(i){return await a("git.checkout",{worktree:i.worktree,branch:i.branch,create:i.create,startPoint:i.startPoint})},async push(i){return await a("git.push",{worktree:i?.worktree,remote:i?.remote,branch:i?.branch,setUpstream:i?.setUpstream})},async pull(i){return await a("git.pull",{worktree:i?.worktree})},onBranchChanged(i){let u=I(),m=!0;return j(u,(w,S)=>{m&&w==="branchChanged"&&i(S)},()=>{}),a("git.subscribeBranchChanged",void 0,u).catch(w=>{m&&(m=!1,B(u),console.error("[@minionry/sdk] git.onBranchChanged subscription failed",w))}),()=>{m&&(m=!1,B(u),C||a("cancel",{requestId:u}).catch(()=>{}))}},onCommitSuggestion(i){let u=I(),m=!0;return j(u,(w,S)=>{m&&w==="commitSuggestion"&&i(S)},()=>{}),a("git.subscribeCommitSuggestion",void 0,u).catch(w=>{m&&(m=!1,B(u),console.error("[@minionry/sdk] git.onCommitSuggestion subscription failed",w))}),()=>{m&&(m=!1,B(u),C||a("cancel",{requestId:u}).catch(()=>{}))}}},tools:{async register(i){let u=I(),m=new Map;for(let E of i.tools){if(m.has(E.name))throw new l("BAD_REQUEST",`tools.register: duplicate tool name '${E.name}'`);m.set(E.name,E)}ee.set(u,{tools:m,calls:new Map});try{await a("tools.register",{tools:i.tools.map(({name:E,description:_,inputSchema:v,timeoutMs:U})=>({name:E,description:_,inputSchema:v,timeoutMs:U})),profile:i.profile},u)}catch(E){throw ce(u),E}let w=!1;return{id:u,tools:[...m.keys()],async unregister(){w||(w=!0,ce(u),await a("cancel",{requestId:u}))}}}},quality:{async state(){return await a("quality.state")},async detectTools(i){return await a("quality.detectTools",{path:i})},async run(i){let u=I(),m=new oe;j(u,(v,U)=>m.emit(v,U),()=>{});let w;try{w=await a("quality.run",{path:i},u)}catch(v){throw B(u),v}let S=w.path,E;return{path:S,attached:w.attached===!0,on(v,U){return m.on(v,U)},result(){return E??(E=a("quality.result",{path:S}).catch(v=>{throw E=void 0,v})),E}}},async cancel(i){await a("quality.cancel",{path:i})},async installTools(i,u){return await a("quality.installTools",{path:i,tools:u})},async saveDirectories(i){await a("quality.saveDirectories",{directories:i})},async settings(){return await a("quality.settings")},async setSettings(i){return await a("quality.setSettings",i)},onChanged(i){let u=I(),m=!0;return j(u,(w,S)=>{m&&w==="changed"&&i(S)},()=>{}),a("quality.subscribeChanges",void 0,u).catch(w=>{m&&(m=!1,B(u),console.error("[@minionry/sdk] quality.onChanged subscription failed",w))}),()=>{m&&(m=!1,B(u),C||a("cancel",{requestId:u}).catch(()=>{}))}},async setFindingState(i){return await a("quality.setFindingState",i)},schedules:{async list(){return(await a("quality.schedules.list",{})).schedules},async create(i){return await a("quality.schedules.create",i)},async update(i,u){return await a("quality.schedules.update",{scheduleId:i,patch:u})},async delete(i){await a("quality.schedules.delete",{scheduleId:i})}}},inference:{async chat(i){let u=I(),m=new oe;j(u,(_,v)=>m.emit(_,v),_=>m.emit("gap",{message:_}));let w;try{let _=i.fastMode===!0&&await N().then(U=>U.includes(mi),()=>!1),v={messages:i.messages,system:i.system,engine:i.engine,model:i.model,effortLevel:i.effortLevel,..._?{fastMode:!0}:{}};w=(await a("inference.chat",v,u)).runId}catch(_){throw B(u),_}let S;return{id:w,on(_,v){return m.on(_,v)},result(){return S??(S=a("inference.result",{runId:w}).catch(_=>{throw S=void 0,_})),S},async cancel(){await a("cancel",{requestId:u})}}}},endpoints:{async register(i){return await $(En,"endpoints.register"),await a("endpoints.register",i)},async unregister(i){await $(En,"endpoints.unregister"),await a("endpoints.unregister",{id:i})},async list(){return await $(En,"endpoints.list"),await a("endpoints.list")}},on(i,u){let m=R.on(i,u);if(i==="intent"){if(A++,K!==void 0){let S=K;K=void 0,u(S)}let w=!1;return()=>{w||(w=!0,A--,m())}}return m}}}var bi={id:"space-mock",name:"Mock Space"},Si={id:"user-mock",name:"Mock User",role:"owner"},Os={mode:"light",tokens:{background:"#faf9f5",surface:"#f0efe8",foreground:"#141413",foregroundMuted:"#6b6a68",accent:"#ae5630",border:"rgba(20, 20, 19, 0.1)"}},ki={locale:"en",dir:"ltr"},Ei=["agents","apps","pm","files","storage","notifications","mock","role","streamResume","theme","browser","agentsRichStream","composer","browserAutomate","browserView","git","terminal","appTools","quality","locale","browserOps","inference","appEndpoints","agentsAppEndpoint","qualityFindingState","agentsModelSelection","filesChangeKinds","filesConditionalWrite","inferenceFastMode","qualitySchedules","pmChains","agentsEngineSelection","agentSchedules","scheduleWallClock","pmScheduleZip","pmScheduleRunNow"],Ri=[{id:"tab-mock-1",url:"https://minionry.com/",title:"Minionry",isLoading:!1,canGoBack:!1,canGoForward:!1}],vi="iVBORw0KGgoAAAANSUhEUgAAAAEAAAABCAYAAAAfFcSJAAAADUlEQVR42mNk+M9QDwADhgGAWjR9awAAAABJRU5ErkJggg==",Ii=[{name:"code-review",displayName:"/code-review",description:"Comprehensive code review of the current changes.",source:"platform"},{name:"board",displayName:"/board",description:"Convert the current chat conversation into a PM board with issues.",source:"platform"}],Ti=[{name:"standup",aliases:["su"],description:"Daily standup update template",origin:"personal",preview:"Yesterday: \u2026 Today: \u2026 Blockers: \u2026",bodyLength:42}],Gs=64,vn=["todo","in_progress","done"],qs="2026-01-01",Ns={issue:"IS",epic:"EP",bug:"BG",task:"TASK"},pt="workspace:",$s=p=>p.startsWith(pt)?"files:workspace:read":"files:app",Fs=p=>p.startsWith(pt)?"files:workspace:write":"files:app",Ai=new Set(["files.read","files.readEntry","files.list","files.search","files.definition","files.subscribeChanges","files.downloadStart"]),Ci=new Set(["files.write","files.delete","files.mkdir","files.rename","files.uploadStart"]),Ls={features:null,connect:null,disconnect:null,"auth.getToken":"identity","agents.run":"agents:run","agents.result":"agents:run","agents.sessions.list":"agents:sessions","agents.sessions.create":"agents:sessions","agents.sessions.attach":"agents:sessions","agents.sessions.close":"agents:sessions","agents.sessions.rename":"agents:sessions","agents.sessions.history":"agents:sessions","agents.sessions.replay":"agents:sessions","agents.sessions.approve":"agents:sessions","agents.sessions.answerQuestion":"agents:sessions","agents.sessions.prompt":"agents:sessions","agents.sessions.stop":"agents:sessions","agents.schedules.list":"agents:schedule","agents.schedules.create":"agents:schedule","agents.schedules.update":"agents:schedule","agents.schedules.delete":"agents:schedule","agents.schedules.runNow":"agents:schedule","apps.open":null,cancel:null,"pm.createBoard":"pm:write","pm.getBoard":"pm:read","pm.listBoards":"pm:read","pm.createIssue":"pm:write","pm.updateIssue":"pm:write","pm.deleteIssue":"pm:write","pm.updateBoard":"pm:write","pm.subscribeBoard":"pm:read","stream.resume":null,"pm.execute":"pm:execute","pm.pause":null,"pm.resume":null,"pm.stop":null,"pm.schedules.list":"pm:schedule","pm.schedules.create":"pm:schedule","pm.schedules.update":"pm:schedule","pm.schedules.delete":"pm:schedule","pm.schedules.runNow":"pm:schedule","pm.chains.list":"pm:chain","pm.chains.create":"pm:chain","pm.chains.update":"pm:chain","pm.chains.delete":"pm:chain","files.read":"files:app","files.readEntry":"files:app","files.write":"files:app","files.list":"files:app","files.delete":"files:app","files.mkdir":"files:app","files.rename":"files:app","files.search":"files:app","files.definition":"files:app","files.subscribeChanges":"files:app","files.uploadStart":"files:app","files.uploadChunk":"files:app","files.uploadStatus":"files:app","files.uploadCancel":"files:app","files.downloadStart":"files:app","files.downloadChunk":"files:app","files.downloadCancel":"files:app","storage.get":"storage","storage.set":"storage","storage.delete":"storage","storage.keys":"storage","notifications.request":"notifications","notifications.status":"notifications","notifications.revoke":"notifications","theme.get":null,"locale.get":null,"browser.tabs.list":"browser:read","browser.tabs.subscribe":"browser:read","browser.navigate":"browser:control","browser.open":"browser:control","browser.close":"browser:control","browser.select":"browser:control","browser.snapshot":"browser:control","browser.screenshot":"browser:control","browser.evaluate":"browser:control","browser.automate":"browser:control","browser.automate.approve":"browser:control","browser.back":"browser:control","browser.forward":"browser:control","browser.reload":"browser:control","browser.stop":"browser:control","browser.view.attach":"browser:control","browser.view.answer":"browser:control","browser.view.ice":"browser:control","browser.view.state":"browser:control","browser.view.input":"browser:control","browser.view.bounds":"browser:control","browser.preflight":"browser:read","browser.resumeDriver":"browser:control","browser.setDeviceProfile":"browser:control","composer.autocomplete":"files:workspace:read","composer.skills":"settings:read","composer.snippets":"settings:read","composer.settings":"settings:read","terminal.sessions.list":"terminal:read","terminal.sessions.subscribe":"terminal:read","terminal.attach":"terminal:read","terminal.open":"terminal:exec","terminal.write":"terminal:exec","terminal.resize":"terminal:exec","terminal.close":"terminal:exec","git.status":"git:read","git.log":"git:read","git.diff":"git:read","git.show":"git:read","git.commitDiff":"git:read","git.branches.list":"git:read","git.tags.list":"git:read","git.remote.info":"git:read","git.repos.discover":"git:read","git.worktrees.list":"git:read","git.merge.preview":"git:read","git.pr.generateDescription":"git:read","git.branches.create":"git:write","git.branches.delete":"git:write","git.tags.create":"git:write","git.worktrees.create":"git:write","git.worktrees.remove":"git:write","git.worktrees.switchActive":"git:write","git.worktrees.subscribe":"git:read","git.merge.run":"git:write","git.merge.abort":"git:write","git.merge.complete":"git:write","git.merge.stashPop":"git:write","git.merge.discardBlockers":"git:write","git.stage":"git:write","git.unstage":"git:write","git.commit":"git:write","git.generateCommitMessage":"git:write","git.checkout":"git:write","git.tags.push":"git:remote","git.pr.create":"git:remote","git.push":"git:remote","git.pull":"git:remote","git.subscribeBranchChanged":"git:read","git.subscribeCommitSuggestion":"git:read","tools.register":"tools:serve","tools.result":"tools:serve","quality.state":"quality:read","quality.detectTools":"quality:read","quality.result":"quality:read","quality.settings":"quality:read","quality.subscribeChanges":"quality:read","quality.run":"quality:run","quality.cancel":"quality:run","quality.installTools":"quality:run","quality.saveDirectories":"quality:run","quality.setSettings":"quality:run","inference.chat":"inference:run","inference.result":"inference:run","endpoints.register":"endpoints:register","endpoints.unregister":"endpoints:register","endpoints.list":"endpoints:register","quality.setFindingState":"quality:run","quality.schedules.list":"quality:read","quality.schedules.create":"quality:run","quality.schedules.update":"quality:run","quality.schedules.delete":"quality:run"},_t="mock-app",Ws=/^[a-z0-9][a-z0-9-]{0,31}$/,Mi=80,xi=200,Ks=4096,Pt=2048,Bi=36e5,Hs=["hermes"],_i="{ id, label, engine, baseUrl, apiKey, model, contextLength?, ttlMs? }",Pi=new Set(["id","label","engine","baseUrl","apiKey","model","contextLength","ttlMs"]),Di=/[\u0000-\u001f\u007f]/,Qi=/[\s\u0000-\u001f\u007f]/,Ui=["localhost","local","internal","home.arpa"],Oi="{ prompt, title?, model?, modelSelection?, engineSelection?, systemPrompt?, budget?: { maxTurns?, maxSeconds? }, sessionId? }",Gi=new Set(["prompt","title","model","modelSelection","engineSelection","systemPrompt","budget","sessionId"]),js="{ engine?, model?, effortLevel?, fastMode? }",qi=new Set(["engine","model","effortLevel","fastMode"]),Ni=new Set(["maxTurns","maxSeconds"]),Mn=p=>new TextEncoder().encode(p).length;function $i(p){let y;try{y=new URL(p)}catch{return{ok:!1,reason:"is not a valid absolute URL"}}if(y.protocol!=="https:")return{ok:!1,reason:"must use https"};if(y.username!==""||y.password!=="")return{ok:!1,reason:"must not carry credentials"};if(y.search!==""||y.href.includes("?"))return{ok:!1,reason:"must not carry a query"};if(y.hash!==""||y.href.includes("#"))return{ok:!1,reason:"must not carry a fragment"};let b=y.hostname.replace(/\.+$/,"").toLowerCase();if(b==="")return{ok:!1,reason:"must name a host"};if(b.startsWith("[")||/^\d{1,3}(\.\d{1,3}){3}$/.test(b))return{ok:!1,reason:"must name a hostname, not an IP address"};if(Ui.some(M=>b===M||b.endsWith(`.${M}`)))return{ok:!1,reason:"must not name a local-network host"};let R=`${y.origin}${y.pathname==="/"?"":y.pathname}`;return Mn(R)>Pt?{ok:!1,reason:`must be at most ${Pt} bytes`}:{ok:!0}}var Fi=6e4,Li=3e4,Wi=12e4,Ye="/workspace",Fe="main",Vs="https://github.com/mock-org/mock-repo.git",Ys=256*1024,Ki=200,se=".",zs="2026-04-13T18:29:50.235Z",Hi="2026-04-12T11:02:17.410Z",In="docs",Tn="packages/legacy",ji="quality: agent turn",Vi="quality: worktree turn",_n="src/services/report-builder.ts",Zs=[{name:"eslint",installed:!0,installCommand:"npm install -D eslint",category:"linter"},{name:"prettier",installed:!0,installCommand:"npm install -D prettier",category:"formatter"},{name:"typescript",installed:!0,installCommand:"npm install -D typescript",category:"general"},{name:"biome",installed:!1,installCommand:"npm install -D @biomejs/biome",category:"linter"},{name:"jscpd",installed:!1,installCommand:"npm install -D jscpd",category:"general"},{name:"pip-audit",installed:!1,installCommand:"pip install pip-audit",category:"security"}],Pn=["node","python"],xn=[{severity:"high",category:"secrets",file:"src/config/analytics.ts",line:7,title:"generic-api-key",description:"Detected a Generic API Key, potentially exposing access to various services and sensitive operations.",suggestion:"Move the value to the environment and rotate it \u2014 it is already in git history.",fingerprint:"eaaf9634c34ff05fcb3378ffb5e68fa1947ef88ac35cdc75d011850cba70375b",introduced:!0},{severity:"high",category:"dependencies",file:"package-lock.json",line:null,title:"serialize-anything <2.1.4 \u2014 prototype pollution (GHSA-8q2v-w5xj-3rpc)",description:"npm audit reports advisory GHSA-8q2v-w5xj-3rpc (high) against serialize-anything 2.0.3; fixed in 2.1.4.",suggestion:"npm update serialize-anything",fingerprint:"48acfa3b78b839a91211c2b529dee95a9347e064043e93a3cbbf6c9dd14c3d64",introduced:!0},{severity:"high",category:"complexity",file:"src/services/report-builder.ts",line:214,title:"buildReport() has cyclomatic complexity 21",description:"Complexity 21 exceeds the threshold of 10. Rank: D.",status:"confirmed",confidence:.92,triageRationale:"21 real branches, no dead paths.",fingerprint:"f3b867d61d68176490529d8d31ddd5c1cea0edd896272d5195e228758a0aabab",introduced:!1},{severity:"medium",category:"file-length",file:"src/services/report-builder.ts",line:null,title:"report-builder.ts is 812 lines",description:"Exceeds the 600-line module threshold.",status:"confirmed",fingerprint:"692f9acde06f364ab152df3ef1a534129b96ae01e5f6abdf9e536fd5a7692b8b",introduced:!1},{severity:"medium",category:"security",file:"src/routes/export.ts",line:58,title:"User-supplied filename reaches the filesystem unvalidated",description:"The `name` query param is joined onto a directory without normalization.",suggestion:"Reject any name containing a path separator before joining.",status:"uncertain",confidence:.41,triageRationale:"The caller may normalize upstream \u2014 not verified.",fingerprint:"5b3892962cb1f2731d3dfcb4ada8c39d3424182dde4d173ccfdee4f99609745c",introduced:!1},{severity:"medium",category:"duplication",file:"src/services/summary-builder.ts",line:118,title:"Duplicated block (18 lines, 96 tokens)",description:"src/services/summary-builder.ts:118\u2013135 duplicates src/services/report-builder.ts:340\u2013357.",suggestion:"Extract the shared row-mapping into one helper both builders call.",status:"confirmed",confidence:.88,triageRationale:"A verbatim clone, not a coincidental resemblance.",fingerprint:"7648ed24afef95de19a59a26fb47bbb5feaa9b8a929bd96dbb8acbcd392f59eb",introduced:!1},{severity:"low",category:"tech-debt",file:"src/hooks/useTrend.ts",line:12,title:"TODO: replace the placeholder trend window",description:"Marker left since the initial implementation.",status:"likely-fp",confidence:.78,triageRationale:"An honest note about a deliberate default, not debt.",fingerprint:"43905119f9df837bb902c93a225f8d645f309fb0731ea29be2aa89c171764517",introduced:!1}],ir=[{severity:"high",category:"architecture",file:"src/services/report-builder.ts",line:null,title:"Report assembly and persistence are the same unit",description:"Assembly and persistence cannot be exercised separately.",suggestion:"Extract a ReportWriter so assembly can be tested without I/O.",evidence:"buildReport() calls writeFile() directly at three points.",verified:!0,verificationNote:"Confirmed against the current file.",fingerprint:"6aaa6a35b6b751d2cb4a036fef9c851025790c33e7f0d871620ac7c39bafcb3e",introduced:!1}],Yi={severity:"low",category:"lint",file:_n,line:231,title:"no-unused-vars",description:"'legacyTotals' is assigned a value but never used.",fingerprint:"82e9506cdeed63aac266450c76fa3e6d13b762386383140584cce360f5108fe2",introduced:!0},Bn=(p,y)=>p.map(({introduced:b,...R})=>y?{...R,introduced:b}:R),zi=p=>({available:!0,sampledAt:p,sampledTurns:61,truncated:!1,attributedTurns:19,unattributed:{missingOutputTokens:2,outsideSpaceRoot:4,unknownWriteTools:1},unreadableFiles:0,files:[{file:"src/services/report-builder.ts",turns:9,medianOutputTokens:6420,medianDurationMs:212e3},{file:"src/services/summary-builder.ts",turns:3,reason:"3 turns; 5 needed"}],comparison:{withStructuralFindings:{turns:12,medianOutputTokens:5880},withoutStructuralFindings:{turns:7,reason:"7 turns; 10 needed"}}}),Zi={sha:"3f9c2a7e1b5d4c6f8a0e9b2d7c1f4a6e8b3d5c7f",branch:"main",dirty:!0},Xi=()=>({files:96,extensions:[".py",".ts",".tsx"]}),Ji=p=>({available:!0,windowDays:90,commitsScanned:p?143:37,truncated:!1,files:{"src/services/report-builder.ts":{commits:17,linesChanged:1204,lastChangedAt:"2026-04-12T16:41:03.000Z"},"src/index.ts":{commits:11,linesChanged:402,lastChangedAt:"2026-04-13T09:20:31.000Z"},...p?{"package-lock.json":{commits:9,linesChanged:2876,lastChangedAt:"2026-04-10T14:55:00.000Z"}}:{},"src/routes/index.ts":{commits:8,linesChanged:265,lastChangedAt:"2026-04-08T17:30:12.000Z"},"src/services/summary-builder.ts":{commits:6,linesChanged:318,lastChangedAt:"2026-04-09T10:12:47.000Z"},"src/config/analytics.ts":{commits:2,linesChanged:41,lastChangedAt:"2026-04-11T08:03:19.000Z"}}}),eo=p=>p>=90?"A":p>=80?"B":p>=70?"C":"F",An=(p,y,b,R)=>{let M=p===se,C=Bn(M?xn:xn.filter(K=>K.category!=="dependencies"),R!==void 0);return{path:p,overall:87,grade:"B+",dimensions:[{name:"security",score:94,grade:"A",rationale:M?"One leaked key, one vulnerable dependency, one unverified input-handling finding.":"One leaked key, one unverified input-handling finding.",available:!0,findingCount:M?3:2,worstSeverity:"high"},{name:"reliability",score:88,grade:"B+",rationale:"Lint and build clean; one complexity hot spot.",available:!0,findingCount:1,worstSeverity:"high"},{name:"maintainability",score:81,grade:"B-",rationale:"One oversized module carries the debt, and a block of it is duplicated.",available:!0,findingCount:3,worstSeverity:"medium"}],categories:[{name:"Linting",score:100,available:!0,issueCount:0},{name:"Build",score:100,available:!0,issueCount:0},{name:"complexity",score:88,available:!0,issueCount:1},{name:"file-length",score:82,available:!0,issueCount:1},{name:"security",score:94,available:!0,issueCount:1},{name:"Duplication",score:90,available:!0,issueCount:1},{name:"Secrets",score:80,available:!0,issueCount:1},M?{name:"Dependencies",score:85,available:!0,issueCount:1}:{name:"Dependencies",score:0,available:!1,issueCount:0,reason:`npm audit needs a lockfile and ${p} has no package-lock.json \u2014 the audit did not run.`}],findings:C,codeReview:b?Bn(ir,R!==void 0):[],analyzedFiles:128,totalLines:24680,timestamp:y,ecosystem:[...Pn],scoreBreakdown:{penaltyDensity:1.3,totalPenalty:M?52.7:47.3,issueDensity:M?.24:.2,kloc:24.7,categoryPenalties:[{category:"complexity",score:88,grade:"B+",penalty:14.4,findingCount:1},{category:"file-length",score:82,grade:"B-",penalty:11.2,findingCount:1},{category:"security",score:94,grade:"A",penalty:6.5,findingCount:1},{category:"duplication",score:90,grade:"A",penalty:4.1,findingCount:1},{category:"secrets",score:80,grade:"B",penalty:11.1,findingCount:1},...M?[{category:"dependencies",score:85,grade:"B",penalty:5.4,findingCount:1}]:[]]},gate:{passed:!0,failingConditions:[]},gradeRationale:"No critical findings; the high-severity hot spot and the leaked key hold the grade at B+.",readiness:{level:"develop",headline:"Ready for development",rationale:"Nothing blocking, but the leaked key and the hot spot should land before a release cut.",blockers:["src/config/analytics.ts:7 \u2014 generic-api-key","src/services/report-builder.ts:214 \u2014 buildReport() has cyclomatic complexity 21"]},triage:{total:5,confirmed:3,likelyFalsePositive:1,uncertain:1},scanDurationMs:42e3,...b?{reviewDurationMs:96e3}:{},...R===void 0?{}:{baselineAt:R},agentCost:M?zi(y):{available:!1,reason:"mock: .minionry/history/ could not be read \u2014 the Space history is missing or unreadable."},structuralScope:Xi(),changeActivity:Ji(M),commit:{...Zi}}},to=(p,y)=>{let b=`No ecosystem was detected in ${p}, so no analyzer ran.`,R=(M,C)=>({name:M,score:0,available:!1,issueCount:0,reason:C});return{path:p,overall:null,grade:"N/A",dimensions:["security","reliability","maintainability"].map(M=>({name:M,score:null,grade:"N/A",rationale:"No tooling was available to evaluate this directory.",available:!1,findingCount:0,worstSeverity:null})),categories:[R("Linting",b),R("Build",b),R("complexity",b),R("file-length",b),R("Duplication","jscpd is not installed (npm install -D jscpd)."),R("Secrets","gitleaks is not on PATH \u2014 https://github.com/gitleaks/gitleaks#installing"),R("Dependencies","No lockfile was found \u2014 npm audit, pip-audit and cargo audit each need one.")],findings:[],codeReview:[],analyzedFiles:0,totalLines:0,timestamp:y,ecosystem:[],gradeRationale:"No tooling was available, so no grade could be computed.",readiness:{level:"insufficient-data",headline:"Not enough data",rationale:"No dimension was available and no files were analyzed \u2014 nothing was evaluated.",blockers:[]},scanDurationMs:1200,agentCost:{available:!0,sampledAt:y,sampledTurns:61,truncated:!1,attributedTurns:0,unattributed:{missingOutputTokens:0,outsideSpaceRoot:0,unknownWriteTools:0},unreadableFiles:0,files:[],comparison:{withStructuralFindings:{turns:0,reason:"0 turns; 10 needed"},withoutStructuralFindings:{turns:0,reason:"0 turns; 10 needed"}}},changeActivity:{available:!1,reason:`mock: ${p} is not inside a git work tree \u2014 the change-activity sample did not run.`,windowDays:90,commitsScanned:0,truncated:!1,files:{}}}},Xs=(p,y,b)=>({path:p,overall:79,grade:"C+",dimensions:[{name:"security",score:100,grade:"A+",rationale:"No security findings in the files this turn wrote.",available:!0,findingCount:0,worstSeverity:null},{name:"reliability",score:84,grade:"B",rationale:"One new lint hit; the complexity hot spot is unchanged.",available:!0,findingCount:2,worstSeverity:"high"},{name:"maintainability",score:78,grade:"C+",rationale:"The oversized module is still oversized.",available:!0,findingCount:1,worstSeverity:"medium"}],categories:[{name:"Linting",score:92,available:!0,issueCount:1},{name:"Build",score:100,available:!0,issueCount:0},{name:"complexity",score:88,available:!0,issueCount:1},{name:"file-length",score:82,available:!0,issueCount:1}],findings:Bn([Yi,...xn.filter(R=>R.file===_n)],b!==void 0),codeReview:[],analyzedFiles:1,totalLines:812,timestamp:y,ecosystem:[...Pn],gradeRationale:"Scoped to the files this turn wrote \u2014 not a grade for the directory.",scanDurationMs:3400,...b===void 0?{}:{baselineAt:b},structuralScope:{files:1,extensions:[".ts"]}}),Js=p=>({timestamp:p.timestamp,overall:p.overall,grade:p.grade,issueDensity:p.scoreBreakdown?.issueDensity,categoryScores:p.categories.filter(y=>y.available).map(y=>({category:y.name,score:y.score,grade:eo(y.score)})),dimensionScores:Object.fromEntries(p.dimensions.map(y=>[y.name,{score:y.score,grade:y.grade}])),directories:[{path:p.path,score:p.overall,grade:p.grade}],scanDurationMs:p.scanDurationMs,reviewDurationMs:p.reviewDurationMs,...p.commit===void 0?{}:{commit:{...p.commit}}}),er=1e3,tr=500,Cn=5,nr=3,sr=20,no=100,rr=20;function Dn(p={}){let y={...bi,...p.space},b=p.user===null?null:{...Si,...p.user},R=new Set(p.deniedScopes??[]),M=p.errors??{},C={...Os,...p.theme,tokens:{...Os.tokens,...p.theme?.tokens}},K={...ki,...p.locale},A=new Set,I=!1,a=new Map(Object.entries(p.files??{})),Q=new Set,N=new Map,$=0,re=e=>{$=Math.max(Date.now(),$+1),N.set(e,new Date($).toISOString())};for(let e of a.keys())re(e);let ae=new Map,j=new Map,B=new Map;for(let[e,t]of Object.entries(p.storage??{}))B.set(e,structuredClone(t));let Ce=new Map,Me=new Map,ee=new Map,le=new Map,ce=new Map,Re=new Map,i=new Map,u=new Map,m=new Map,w=new Map,S=new Map,E=new Map,_=new Map,v=new Map,U=new Map,D=Ri.map(e=>({...e})),Z=D[0]?.id??null,pe=new Set,ve=1,H=new Map,G=new Map,F=new Map,te=[],q=new Map,ge=new Map,X=new Map,ye=null,be=new Set,Ie=new Set,Un=new Set,xe=new Map,Ze=new Map,Xe=new Set,Te=new Map,mt=new Map,pr=0,On=[{path:se,label:"Workspace"},{path:In,label:"Docs"},{path:Tn,label:"Legacy"}],Se=new Map,Dt=[],Qt=[],ke=new Map,Le=new Map,ft=new Map,We=new Set,Be=[],Gn=0,qn=new Map,me={engine:"claude-code",model:"default",effortLevel:"auto",fastMode:!1,agentNotes:!0},Nn=!1,Ut=new Map;{let e=An(se,zs,!0,Hi);Se.set(se,e),Dt.push(Js(e)),Qt=[{kind:"codeReview",path:se,completedAt:zs,findings:ir.map(t=>({...t}))}]}let ue,Ke=!1,z=0,L=new Map,Y=new Map,He=new Set,_e=e=>{queueMicrotask(()=>{Ke||e()})},J=e=>{let t=setTimeout(()=>{He.delete(t),Ke||e()},0);He.add(t)},ht=(e,t)=>{_e(()=>ue?.onResponse({requestId:e,ok:!0,result:t}))},Je=(e,t)=>{_e(()=>ue?.onResponse({requestId:e,ok:!1,error:t}))},W=(e,t,n)=>{let s=(L.get(e)??0)+1;L.set(e,s);let r=n!==void 0?{seq:s,event:t,payload:n}:{seq:s,event:t},o=Y.get(e);o?o.push(r):Y.set(e,[r]),_e(()=>ue?.onEvent({requestId:e,event:t,payload:n,seq:s}))},gr=(e,t)=>{_e(()=>ue?.onNotification({event:e,payload:t}))},$n=(e,t,n)=>{let s=(L.get(e)??0)+1;L.set(e,s),_e(()=>ue?.onEvent({requestId:e,event:t,payload:n,seq:s}))},h=(e,t)=>{if(typeof e!="object"||e===null)throw new l("BAD_REQUEST",`${t}: params must be an object`);return e},g=(e,t,n)=>{if(typeof e!="string")throw new l("BAD_REQUEST",`${n}: '${t}' must be a string`);return e},Fn=e=>{if(typeof e!="string"||e==="")return!1;try{return new Intl.DateTimeFormat("en-US",{timeZone:e}),!0}catch{return!1}},et=(e,t)=>{let n=new Intl.DateTimeFormat("en-US",{timeZone:t,hourCycle:"h23",year:"numeric",month:"2-digit",day:"2-digit",hour:"2-digit",minute:"2-digit",second:"2-digit",weekday:"short"}).formatToParts(new Date(e)),s=o=>n.find(c=>c.type===o)?.value??"0",r=["Sun","Mon","Tue","Wed","Thu","Fri","Sat"];return{y:Number(s("year")),m:Number(s("month")),d:Number(s("day")),hh:Number(s("hour"))%24,mm:Number(s("minute")),ss:Number(s("second")),weekday:Math.max(0,r.indexOf(s("weekday")))}},Ln=(e,t)=>{let n=et(e,t);return Date.UTC(n.y,n.m-1,n.d,n.hh,n.mm,n.ss)-e},Wn=(e,t,n,s,r,o)=>{let c=Date.UTC(e,t-1,n,s,r),d=c-Ln(c,o),f=c-Ln(d,o),k=et(f,o);return k.hh===s&&k.mm===r?f:Math.max(d,f)},Kn=(e,t)=>{let[n,s]=e.time.split(":").map(Number),r=et(t,e.timeZone);for(let o=0;o<=8;o++){let c=new Date(Date.UTC(r.y,r.m-1,r.d+o,12)),d=Wn(c.getUTCFullYear(),c.getUTCMonth()+1,c.getUTCDate(),n,s,e.timeZone);if(!(d<=t)&&!(e.days&&!e.days.includes(et(d,e.timeZone).weekday)))return new Date(d).toISOString()}return new Date(t+10080*60*1e3).toISOString()},mr=(e,t)=>{let[n,s]=e.time.split(":").map(Number),r=et(t,e.timeZone);for(let o=0;o<13;o++){let c=r.m-1+o,d=r.y+Math.floor(c/12),f=c%12+1,k=new Date(Date.UTC(d,f,0)).getUTCDate(),x=e.dayOfMonth==="last"?k:e.dayOfMonth;if(x>k)continue;let P=Wn(d,f,x,n,s,e.timeZone);if(!(P<=t))return new Date(P).toISOString()}return new Date(t+744*60*60*1e3).toISOString()},fr=(e,t)=>{if(typeof e.time!="string"||!/^([01]\d|2[0-3]):[0-5]\d$/.test(e.time))throw new l("BAD_REQUEST",`${t}: timing.time must be 24-hour HH:MM`);if(!Fn(e.timeZone))throw new l("BAD_REQUEST",`${t}: timing.timeZone must be an IANA zone name`);if(e.kind==="monthly"){let s=e.dayOfMonth;if(s!=="last"&&!(Number.isInteger(s)&&s>=1&&s<=31))throw new l("BAD_REQUEST",`${t}: timing.dayOfMonth must be 1\u201331 or 'last'`);return{kind:"monthly",time:e.time,timeZone:e.timeZone,dayOfMonth:s}}let n={kind:"daily",time:e.time,timeZone:e.timeZone};if(e.days!==void 0){if(!Array.isArray(e.days)||e.days.length===0||e.days.some(s=>!Number.isInteger(s)||s<0||s>6))throw new l("BAD_REQUEST",`${t}: timing.days must be a non-empty array of weekdays 0 (Sunday) \u2026 6 (Saturday)`);n.days=[...new Set(e.days)].sort((s,r)=>s-r)}return n},Ot=(e,t)=>{if(typeof e!="object"||e===null)throw new l("BAD_REQUEST",`${t}: timing must be an object`);let n=e;if(n.kind==="once"&&typeof n.at=="string"&&!Number.isNaN(Date.parse(n.at)))return{kind:"once",at:n.at};if(n.kind==="interval"&&typeof n.everyMs=="number"&&Number.isFinite(n.everyMs))return{kind:"interval",everyMs:n.everyMs};if(n.kind==="continuous")return{kind:"continuous"};if(n.kind==="daily"||n.kind==="monthly")return fr(n,t);throw new l("BAD_REQUEST",`${t}: invalid timing`)},Hn=(e,t)=>{let n=Ot(e,t);if(n.kind==="continuous")throw new l("BAD_REQUEST",`${t}: timing must be {kind:'once',at}, {kind:'interval',everyMs}, {kind:'daily',time,timeZone,days?} or {kind:'monthly',time,timeZone,dayOfMonth} \u2014 'continuous' is not supported for agent-prompt schedules`);return n},Gt=(e,t)=>{if(typeof e!="number"||!Number.isInteger(e)||e<Fi)throw new l("BAD_REQUEST",`${t}: maxLatenessMs must be an integer >= the schedule minimum, or null to clear it`);return e},jn=(e,t,n)=>{t!==void 0&&(t===null?delete e.maxLatenessMs:e.maxLatenessMs=Gt(t,n))},wt=(e,t)=>{if(e.kind==="once"){let n=new Date(e.at);return n.getTime()>=t.getTime()?n.toISOString():null}return e.kind==="interval"?new Date(t.getTime()+e.everyMs).toISOString():e.kind==="daily"?Kn(e,t.getTime()):e.kind==="monthly"?mr(e,t.getTime()):null},qt=(e,t,n)=>{if(typeof e!="string"||!e.startsWith(pt))throw new l("BAD_REQUEST",`${n}: ${t} must be a workspace-rooted path ('${pt}/<path>')`);let s=e.slice(pt.length).replace(/^\/+/,"");if(s===""||s.split("/").some(r=>r===".."))throw new l("BAD_REQUEST",`${n}: ${t} '${e}' must not be empty or contain a '..' segment`);if(!a.has(e))throw new l("BAD_REQUEST",`${n}: ${t} '${e}' does not exist`);return e},Vn=(e,t)=>{let n=(a.get(e)??"").trim();if(n==="")throw new l("BAD_REQUEST",`${t}: promptFile '${e}' is empty after trimming`);return n},yt=e=>({...e,timing:e.timing.kind==="daily"&&e.timing.days?{...e.timing,days:[...e.timing.days]}:{...e.timing},...e.lastFire?{lastFire:{...e.lastFire}}:{},history:e.history.map(t=>({...t}))}),Nt=(e,t)=>{let n=g(e,"scheduleId",t),s=_.get(n);if(!s||s.initiator.appId!==_t)throw new l("BAD_REQUEST",`schedule '${n}' not found in this Space`);return s},je=e=>e.completedAt?"completed":e.status,bt=e=>({id:e.id,from:e.from,to:e.to,on:e.on,passOutputs:e.passOutputs,name:e.name,enabled:e.enabled,state:e.state,createdAt:e.createdAt,ownedByCaller:!0,history:e.history}),Yn=e=>{let t=[...v.values()].filter(n=>n.state==="armed").map(n=>({from:n.from,to:n.to}));return e&&t.push(e),t},zn=e=>{let t=new Map;for(let r of e){let o=t.get(r.from);o?o.push(r.to):t.set(r.from,[r.to])}let n=new Map,s=r=>{n.set(r,"gray");for(let o of t.get(r)??[]){let c=n.get(o);if(c==="gray"||c!=="black"&&s(o))return!0}return n.set(r,"black"),!1};for(let r of t.keys())if(!n.has(r)&&s(r))return!0;return!1},Zn=(e,t)=>{let n=new Map;for(let o of e){let c=n.get(o.to);c?c.push(o.from):n.set(o.to,[o.from])}let s=new Map,r=(o,c)=>{let d=s.get(o);if(d!==void 0)return d;if(c.has(o))return 1;c.add(o);let f=0;for(let x of n.get(o)??[])f=Math.max(f,r(x,c));c.delete(o);let k=f+1;return s.set(o,k),k};return r(t,new Set)},Pe=(e,t)=>{e.history.push(t),e.history.length>rr&&e.history.splice(0,e.history.length-rr)},$t={boardGone:"target board no longer exists",notRunnable:"target board is not runnable",noIssues:"target board has no issues"},hr={settleBoard:(e,t)=>{let n=new Date().toISOString();for(let s of v.values()){if(s.from!==e||!s.enabled||s.state!=="armed")continue;if(!(s.on==="settled"||s.on===t)){Pe(s,{at:n,completedAt:n,status:"skipped",upstreamOutcome:t,downstreamBoardId:null,skipReason:"condition_not_met"});continue}let o=Yn();if(zn(o)){Pe(s,{at:n,completedAt:n,status:"skipped",upstreamOutcome:t,downstreamBoardId:null,skipReason:"cycle"}),s.state="disabled";continue}if(Zn(o,s.to)>Cn){Pe(s,{at:n,completedAt:n,status:"skipped",upstreamOutcome:t,downstreamBoardId:null,skipReason:"max_depth"}),s.state="disabled";continue}let c=i.get(s.to),d=c?.issues.filter(f=>f.type!=="epic")??[];c?je(c)==="completed"||je(c)==="archived"?Pe(s,{at:n,completedAt:n,status:"failed",upstreamOutcome:t,downstreamBoardId:null,error:$t.notRunnable}):d.length===0?Pe(s,{at:n,completedAt:n,status:"failed",upstreamOutcome:t,downstreamBoardId:null,error:$t.noIssues}):Pe(s,{at:n,completedAt:n,status:"started",upstreamOutcome:t,downstreamBoardId:s.to,downstreamRunId:`chain-run-mock-${++z}`}):Pe(s,{at:n,completedAt:n,status:"failed",upstreamOutcome:t,downstreamBoardId:null,error:$t.boardGone}),s.state="fired"}}};p.chains?.onReady?.(hr);let Xn=e=>{if(e.status==="running")return;let t={status:e.status,text:e.text};for(let n of e.waiters)ht(n,t);e.waiters=[]},Jn=e=>{let t=F.get(e.sessionId);t&&(t.isExecuting=!1,t.lastActivityAt=new Date().toISOString())},es=e=>{if(e.status!=="running")return;let t=e.steps.shift();if(!t){if(e.status="done",W(e.requestId,"status",{status:"done"}),Xn(e),Jn(e),e.agentTurn!==void 0){Gr(e.agentTurn);return}if(!Nn&&We.size>0){Nn=!0;let n=Se.get(se)??An(se,new Date().toISOString(),!0,void 0);Ee({kind:"postSession",path:se,report:n})}return}t.event==="output"&&(e.text+=t.payload.text),W(e.requestId,t.event,t.payload),J(()=>es(e))},ts=e=>{e.status==="running"&&(e.status="cancelled",e.steps=[],W(e.requestId,"status",{status:"cancelled"}),Xn(e),Jn(e))},Ft=(e,t)=>Date.parse(e.expiresAt)>t,Lt=(e,t,n,s)=>{let r=Object.keys(e).filter(o=>!t.has(o));if(r.length>0)throw new l("BAD_REQUEST",`${n}: unknown param${r.length>1?"s":""} ${r.map(o=>`'${o}'`).join(", ")} \u2014 expected ${s}`)},Wt=(e,t,n,s)=>{if(typeof e!="object"||e===null||Array.isArray(e))throw new l("BAD_REQUEST",`${t} requires params ${n}`);let r=e;return Lt(r,s,t,n),r},ns=(e,t)=>{if(typeof e!="string"||!Ws.test(e))throw new l("BAD_REQUEST",`${t}: id must match ${Ws.source}`);return e},ss=(e,t,n)=>{if(typeof e!="string"||e.trim()===""||e.length>n||Di.test(e))throw new l("BAD_REQUEST",`endpoints.register: ${t} must be a non-empty string of at most ${n} characters, without control characters`);return e.trim()},rs=(e,t)=>{if(e!=null){if(typeof e!="number"||!Number.isSafeInteger(e)||e<=0)throw new l("BAD_REQUEST",`endpoints.register: ${t} must be a positive integer when present`);return e}},is=e=>{let t=Date.now(),n=[...ce.values()].find(s=>s.modelValue===e&&Ft(s,t));if(!n)throw new l("MODEL_NOT_ALLOWED",`agents.run: model '${e}' is not a live endpoint this app registered in this Space \u2014 register one with endpoints.register and pass its modelValue`);return n},wr=e=>{if(e===void 0)return;let t=xt.find(n=>n===e);if(!t){let n=xt.map(s=>`'${s}'`).join(", ");throw new l("BAD_REQUEST",`agents.run modelSelection must be one of ${n} when present`)}if(!A.has("quality:read"))throw new l("SCOPE_DENIED",`agents.run: modelSelection '${t}' needs the quality:read scope`);if(me.engine!=="claude-code")throw new l("ENGINE_UNAVAILABLE",`agents.run: the Quality model runs on ${me.engine}, and only Claude Code can run an app session with tools \u2014 choose a Claude Code model for Quality`);if(me.model.startsWith("custom:claude-code:"))throw new l("MODEL_NOT_ALLOWED",`agents.run: the Quality model '${me.model}' is not a Claude Code model added on this machine \u2014 choose another model for Quality`);return t},yr=e=>{if(e===void 0)return;if(typeof e!="object"||e===null||Array.isArray(e))throw new l("BAD_REQUEST",`agents.run engineSelection must be an object ${js}`);let t=e;Lt(t,qi,"agents.run engineSelection",js);let n=(f,k)=>{if(f!==void 0){if(typeof f!="string"||f==="")throw new l("BAD_REQUEST",`agents.run engineSelection.${k} must be a non-empty string when present`);return f}},s=n(t.engine,"engine"),r=n(t.model,"model"),o=n(t.effortLevel,"effortLevel");if(t.fastMode!==void 0&&typeof t.fastMode!="boolean")throw new l("BAD_REQUEST","agents.run engineSelection.fastMode must be a boolean when present");let c=t.fastMode===!0;if(!A.has("settings:read"))throw new l("SCOPE_DENIED","agents.run: engineSelection needs the settings:read scope");if(s!==void 0&&!Oe.includes(s))throw new l("BAD_REQUEST",`agents.run engineSelection: unknown engine '${s}' \u2014 expected one of ${Oe.join(", ")}`);let d=s??(r?we(r):Rt);if(!ws.includes(d))throw new l("ENGINE_UNAVAILABLE",`agents.run: ${d} cannot run a confined app session with tools on this host`);if(r&&we(r)!==d)throw new l("BAD_REQUEST",`agents.run: engineSelection model '${r}' is not a ${d} model \u2014 it belongs to ${we(r)}`);if(o!==void 0&&o!=="auto"&&!Xt[d]?.includes(o))throw new l("BAD_REQUEST",`agents.run: engineSelection effortLevel '${o}' is not a ${d} effort level`);if(c&&d!=="claude-code")throw new l("BAD_REQUEST",`agents.run: engineSelection.fastMode is a claude-code setting \u2014 ${d} has no fast mode`);return{...s!==void 0?{engine:s}:{},...r!==void 0?{model:r}:{},...o!==void 0?{effortLevel:o}:{},...c?{fastMode:c}:{}}},br=e=>{let t=Wt(e,"agents.run",Oi,Gi),n=g(t.prompt,"prompt","agents.run"),s=typeof t.title=="string"?t.title:void 0,r=T=>{let O=t[T];if(O!==void 0){if(typeof O!="string"||O==="")throw new l("BAD_REQUEST",`agents.run ${T} must be a non-empty string when present`);return O}},o=r("model"),c=r("sessionId"),{systemPrompt:d,budget:f,modelSelection:k,engineSelection:x}=t;if(d!==void 0&&(typeof d!="string"||d.length>$e.maxSystemPromptChars))throw new l("BAD_REQUEST",`agents.run systemPrompt must be a string of at most ${$e.maxSystemPromptChars} characters`);if(f!==void 0){if(typeof f!="object"||f===null||Array.isArray(f))throw new l("BAD_REQUEST","agents.run budget must be an object { maxTurns?, maxSeconds? }");let T=f;Lt(T,Ni,"agents.run budget","{ maxTurns?, maxSeconds? }");for(let O of["maxTurns","maxSeconds"]){let V=T[O];if(V!==void 0&&(typeof V!="number"||!Number.isSafeInteger(V)||V<=0))throw new l("BAD_REQUEST",`agents.run budget.${O} must be a positive integer when present`)}}if(c!==void 0&&(o!==void 0||k!==void 0||d!==void 0||f!==void 0))throw new l("BAD_REQUEST","agents.run with sessionId continues that session on its own model, systemPrompt and budget \u2014 omit model, modelSelection, systemPrompt and budget");if(o!==void 0&&k!==void 0)throw new l("BAD_REQUEST","agents.run takes model or modelSelection, not both");if(o===void 0&&(d!==void 0||f!==void 0))throw new l("BAD_REQUEST","agents.run systemPrompt and budget apply only to a run on an app-registered model \u2014 pass model");if(wr(k),x!==void 0){let T=[["model",o!==void 0],["modelSelection",k!==void 0],["systemPrompt",d!==void 0],["budget",f!==void 0],["sessionId",c!==void 0]].filter(([,O])=>O).map(([O])=>O);if(T.length>0)throw new l("BAD_REQUEST",`agents.run engineSelection is not allowed alongside ${T.join(", ")} \u2014 pass only one way of choosing the run's engine or model`)}return yr(x),{prompt:n,title:s,model:o,sessionId:c}},Sr=(e,t,n)=>{let s=Date.now(),r=t.length>120?`${t.slice(0,119)}\u2026`:t,o=[`(mock ${e.engine} \xB7 ${e.model}) `,`Turn ${n}: ${r}
3
+ `,"Done (mock)."];return[{event:"status",payload:{status:"running"}},{event:"timelineEvent",payload:{kind:"status",at:s,executing:!0,turn:n}},...o.flatMap(c=>[{event:"output",payload:{text:c}},{event:"timelineEvent",payload:{kind:"text",at:s,entryId:`mock-text-${n}`,delta:c}}]),{event:"timelineEvent",payload:{kind:"status",at:s,executing:!1,turn:n}}]},os={inputTokens:64,outputTokens:16},as=e=>({status:e.status==="running"?"done":e.status,text:e.text,engine:e.engine,...e.model?{model:e.model}:{},...e.status==="done"?{usage:{...os}}:{}}),ls=e=>{W(e.requestId,"status",{status:e.status});for(let t of e.waiters)ht(t,as(e));e.waiters=[]},cs=e=>{if(e.status!=="running")return;let t=e.deltas.shift();if(t===void 0){W(e.requestId,"usage",{...os}),e.status="done",ls(e);return}e.text+=t,W(e.requestId,"delta",{text:t}),J(()=>cs(e))},kr=e=>{e.status==="running"&&(e.status="cancelled",e.deltas=[],ls(e))},St=e=>({id:e.id,name:e.name,createdAt:e.createdAt,lastActivityAt:e.lastActivityAt,isExecuting:e.isExecuting}),Er=e=>({id:e.id,title:e.title,status:e.status,type:e.type,priority:e.priority,labels:[...e.labels]}),Kt=e=>({boardId:e.boardId,title:e.title,statuses:[...e.statuses],issues:e.issues.map(Er)}),us=e=>({id:e.boardId,title:e.title,status:e.completedAt?"completed":e.status,goal:e.goal,created:e.createdAt,completedAt:e.completedAt}),De=(e,t,n)=>({id:e,title:t,type:"issue",status:vn[0],priority:n,estimate:null,labels:[],epicId:null,blockedBy:[],blocks:[],description:"",acceptanceCriteria:[],created:qs,updated:null}),kt=(e,t)=>{let n=h(e,t),s=g(n.boardId,"boardId",t),r=i.get(s);if(!r)throw new l("BAD_REQUEST",`${t}: unknown boardId '${s}'`);return{board:r,raw:n}},Et=(e,t,n)=>{let s=e.issues.find(r=>r.id===t);if(!s)throw new l("BAD_REQUEST",`${n}: unknown issueId '${t}' on board '${e.boardId}'`);return s},Rr=(e,t)=>{let n=0;for(let s of e.issues){let r=s.id.match(new RegExp(`^${t}-(\\d+)$`));r&&(n=Math.max(n,Number.parseInt(r[1],10)))}return`${t}-${n+1}`},Qe=(e,t,n)=>{if(!Array.isArray(e)||e.some(s=>typeof s!="string"))throw new l("BAD_REQUEST",`${n}: '${t}' must be an array of strings`);return[...e]},ds=(e,t,n,s)=>{let r=h(n,s),o=(c,d)=>{let f=Qe(c,d,s);for(let k of f)Et(e,k,s);return f};if(r.title!==void 0&&(t.title=g(r.title,"title",s)),r.status!==void 0&&(t.status=g(r.status,"status",s)),r.priority!==void 0&&(t.priority=g(r.priority,"priority",s)),r.estimate!==void 0){let c=r.estimate;if(c!==null&&typeof c!="number"&&typeof c!="string")throw new l("BAD_REQUEST",`${s}: 'estimate' must be a number, string, or null`);t.estimate=c}if(r.labels!==void 0&&(t.labels=Qe(r.labels,"labels",s)),r.epicId!==void 0){let c=r.epicId;if(c!==null&&typeof c!="string")throw new l("BAD_REQUEST",`${s}: 'epicId' must be an issue id or null`);c!==null&&Et(e,c,s),t.epicId=c}r.blockedBy!==void 0&&(t.blockedBy=o(r.blockedBy,"blockedBy")),r.blocks!==void 0&&(t.blocks=o(r.blocks,"blocks"))},Ve=e=>{for(let t of e.subscribers)W(t,"boardUpdate",Kt(e))},Ht=e=>{let t=e.issues.find(s=>s.status!=="done");if(!t)return;let n=e.statuses.indexOf(t.status);t.status=e.statuses[Math.min(n+1,e.statuses.length-1)],e.issues.every(s=>s.status==="done")&&(e.completedAt??(e.completedAt=new Date().toISOString())),Ve(e),J(()=>Ht(e))},Ue=(e,t,n)=>{for(let s of e.requestIds)W(s,t,n)},jt=e=>{if(e.status!=="running")return;let t=i.get(e.boardId);if(!t||e.issueIndex>=t.issues.length){e.status="done",Ue(e,"complete",{reason:"All issues complete (mock)"});return}let n=t.issues[e.issueIndex];Ue(e,"issueStarted",{issueId:n.id,title:n.title}),Ue(e,"output",{issueId:n.id,text:`Working on ${n.title} (mock)...
4
+ `}),Ue(e,"toolUse",{issueId:n.id,tool:"write_file",input:{path:`${n.id}.md`}}),Ue(e,"tokens",{issueId:n.id,inputTokens:100,outputTokens:40,cacheCreationTokens:0,cacheReadTokens:0,currentTurnInputTokens:100,isFinal:!0}),n.status="done",Ue(e,"issueComplete",{issueId:n.id}),Ve(t),e.issueIndex+=1,J(()=>jt(e))},ps=(e,t)=>{let n=e==="."?"":e.replace(/\/+$/,"");return n===""||t===n?t.slice(n.length):t.startsWith(`${n}/`)?t.slice(n.length+1):void 0},tt=(e,t,n=!1,s)=>{for(let[r,o]of U){let c=ps(o,e),d=s===void 0?void 0:ps(o,s),f;c!==void 0?f=d!==void 0?{path:c,kind:t,newPath:d}:{path:c,kind:s===void 0?t:"deleted"}:d!==void 0&&(f={path:d,kind:"created"}),f&&W(r,"changed",n?{...f,dir:n}:f)}},Vt=e=>Q.has(e)||[...a.keys(),...Q].some(t=>t.startsWith(`${e}/`)),gs=()=>({tabs:D.map(e=>({...e})),currentTabId:Z}),fe=()=>{for(let e of pe)W(e,"tabsChanged",gs());for(let e of G.values())ms(e)},ms=e=>{if(e.detached)return;let t=D.find(n=>n.id===e.tabId);t&&W(e.requestId,"navigationState",{tabId:t.id,url:t.url,title:t.title,isLoading:t.isLoading,canGoBack:t.canGoBack,canGoForward:t.canGoForward})},nt=(e,t)=>{let n=g(h(e,t).sessionId,"sessionId",t);for(let s of G.values())if(s.sessionId===n&&!s.detached)return s;throw new l("BAD_REQUEST",`${t}: no live view session '${n}'`)},Yt=e=>{e.detached=!0,G.delete(e.requestId),L.delete(e.requestId),Y.delete(e.requestId)},zt=(e,t)=>{let n=e==null?{}:h(e,t),s=n.tabId===void 0||n.tabId===null?Z:g(n.tabId,"tabId",t);if(s===null)throw new l("BAD_REQUEST",`${t}: no tab is open`);return he(s,t)},fs=(e,t)=>{let n=zt(e,t);if(t==="browser.back"){if(!n.canGoBack)return null;n.canGoBack=!1,n.canGoForward=!0}else{if(!n.canGoForward)return null;n.canGoForward=!1,n.canGoBack=!0}return ve+=1,fe(),null},he=(e,t)=>{let n=D.find(s=>s.id===e);if(!n)throw new l("BAD_REQUEST",`${t}: unknown tabId '${e}'`);return n},Zt=e=>{try{return new URL(e).origin}catch{return}},Oe=["claude-code","codex","hermes"],vr=["gpt-5.1-codex-max","gpt-5-codex"],we=e=>vr.includes(e)?"codex":e.includes("/")?"hermes":"claude-code",Rt="claude-code",st="opus",Xt={"claude-code":["auto","low","medium","high","xhigh","max"],codex:["auto","minimal","low","medium","high","xhigh"],hermes:[]},hs=["claude-code"],Ir=["claude-code"],ws=p.agentRunEngines===null||p.agentRunEngines===void 0?Ir:p.agentRunEngines,Tr=e=>{if(!(Array.isArray(e)&&e.length>0&&e.length<=64&&e.every(n=>typeof n=="object"&&n!==null&&(n.role==="user"||n.role==="assistant")&&typeof n.content=="string")&&e[e.length-1].role==="user"))throw new l("BAD_REQUEST","inference.chat: messages must be 1\u201364 { role: 'user' | 'assistant', content } turns ending on a 'user' turn");return e},Ar=[{value:"default",engine:"claude-code",label:"Default",description:"The engine's own default model",isDefault:!0},{value:"fable",engine:"claude-code",label:"Fable",description:"Most capable, for the hardest work"},{value:"opus",engine:"claude-code",label:"Opus",description:"Frontier reasoning for complex tasks"},{value:"sonnet",engine:"claude-code",label:"Sonnet",description:"Balanced speed and capability"},{value:"haiku",engine:"claude-code",label:"Haiku",description:"Fastest, for simple tasks"},{value:"gpt-5.1-codex-max",engine:"codex",label:"GPT-5.1 Codex Max",description:"Codex's most capable model",isDefault:!0},{value:"gpt-5-codex",engine:"codex",label:"GPT-5 Codex",description:"Faster Codex model"},{value:"z-ai/glm-5.2",engine:"hermes",label:"GLM 5.2",isDefault:!0},{value:"moonshotai/kimi-k3",engine:"hermes",label:"Kimi K3"}],ys=(e,t)=>t.event==="step"?{...t.payload,...e.target}:t.payload,bs=e=>{if(e.status!=="running")return;let t=e.steps.shift();if(!t){e.status="done",H.delete(e.requestId);return}if(W(e.requestId,t.event,ys(e,t)),t.event==="done"){e.status="done",H.delete(e.requestId);return}J(()=>bs(e))},Cr=e=>{if(e.status!=="running")return;let t=`proposal-mock-${++z}`;e.pendingProposalId=t,e.status="awaiting-approval",W(e.requestId,"proposed",{proposalId:t,summary:'Click "Continue" on the page (mock)'})},Mr=e=>({ref:`${e.id}-e1`,role:"RootWebArea",name:e.title,children:[{ref:`${e.id}-e2`,role:"heading",name:e.title,level:1,children:[]},{ref:`${e.id}-e3`,role:"link",name:"Mock link",value:e.url,children:[]}]}),Ge=()=>`mock${(++z).toString(16).padStart(36,"0")}`,rt=e=>e.slice(0,7),it=e=>te.find(t=>t.hash===e||t.shortHash===e),xr=(e,t)=>{let n=e??ye??Ye,s=X.get(n);if(!s)throw new l("BAD_REQUEST",`${t}: unknown worktree '${n}'`);return s},Br=(e,t)=>e==null?void 0:g(e,"worktree",t),ne=(e,t)=>{let n=h(e,t);return{worktree:xr(Br(n.worktree,t),t),record:n}},_r=e=>({staged:e.staged.length,unstaged:e.unstaged.length,untracked:e.untracked.length,ahead:0,behind:0,hasUpstream:q.get(e.branch)?.upstream!==void 0}),Pr=e=>({path:e.path,branch:e.branch,head:q.get(e.branch)?.head??"",isMain:e.isMain,isBare:!1,status:_r(e)}),Ss=()=>({worktrees:[...X.values()].map(Pr),activeWorktreePath:ye}),Jt=()=>{for(let e of be)W(e,"worktreesChanged",Ss())},en=e=>{for(let t of Ie)W(t,"branchChanged",{worktreePath:e.path,branch:e.branch})},Dr=(e,t,n)=>{let s=e.untracked.findIndex(o=>o.path===t);if(s!==-1){let[o]=e.untracked.splice(s,1);e.staged.push({...o,status:"A",staged:!0});return}let r=e.unstaged.findIndex(o=>o.path===t);if(r!==-1){let[o]=e.unstaged.splice(r,1);e.staged.push({...o,staged:!0});return}throw new l("BAD_REQUEST",`${n}: '${t}' has no pending changes in this worktree`)},Qr=(e,t,n)=>{let s=e.staged.findIndex(o=>o.path===t);if(s===-1)throw new l("BAD_REQUEST",`${n}: '${t}' is not staged`);let[r]=e.staged.splice(s,1);r.status==="A"?e.untracked.push({...r,status:"?",staged:!1}):e.unstaged.push({...r,staged:!1})},tn=Ge();te.push({hash:tn,shortHash:rt(tn),subject:"Initial commit (mock)",body:"",author:b?.name??"Mock User",date:new Date().toISOString(),files:[]}),q.set(Fe,{name:Fe,head:tn,isRemote:!1,upstream:`origin/${Fe}`}),X.set(Ye,{path:Ye,branch:Fe,isMain:!0,staged:[],unstaged:[],untracked:[{path:"NOTES.md",status:"?",staged:!1}]});let ks=e=>({id:e.id,shell:e.shell,cwd:e.cwd,cols:e.cols,rows:e.rows,createdAt:e.createdAt,lastActivityAt:e.lastActivityAt}),nn=(e,t,n)=>{for(let s of e.attachedRequestIds)$n(s,t,n)},Es=e=>{for(let t of Xe)W(t,"sessionChanged",e)},Rs=(e,t)=>{let n=e.scrollback+t;e.scrollback=n.length>Ys?n.slice(n.length-Ys):n},vs=(e,t)=>{e.closed||(e.closed=!0,nn(e,"exit",{exitCode:t}),e.attachedRequestIds.clear(),xe.delete(e.id),Es({kind:"closed",id:e.id}))},Ur=e=>{for(let t=0;t<Ki;t++){let n=`burst line ${t} (mock)
5
+ `;Rs(e,n),nn(e,"output",{data:n})}},vt=e=>{let t=mt.get(e);if(t)return mt.delete(e),clearTimeout(t.timer),He.delete(t.timer),t},sn=e=>{if(Te.delete(e))for(let t of[...mt.values()]){if(t.registrationId!==e)continue;vt(t.callId)?.fail(new l("APP_UNAVAILABLE",`mock: the app stopped serving '${t.tool}' before it answered`))}},Is=(e,t)=>{_e(()=>ue?.onToolCall?.({op:"cancel",callId:e,requestId:t}))},Or={list:()=>[...Te.values()].flatMap(e=>[...e.tools.values()].map(t=>({...t,registrationId:e.requestId,profile:e.profile}))),call:(e,t,n)=>new Promise((s,r)=>{let o=[...Te.values()].find(x=>x.tools.has(e)),c=o?.tools.get(e);if(!o||!c||!ue?.onToolCall){r(new l("APP_UNAVAILABLE",`mock: no app is serving a tool named '${e}'`));return}let d=`tc-${++pr}`,f=Math.min(n?.timeoutMs??c.timeoutMs??Li,Wi),k=setTimeout(()=>{let x=vt(d);x&&(Is(d,o.requestId),x.fail(new l("APP_TIMEOUT",`mock: '${e}' did not answer within ${f}ms`)))},f);He.add(k),mt.set(d,{callId:d,registrationId:o.requestId,tool:e,settle:s,fail:r,timer:k}),_e(()=>ue?.onToolCall?.({op:"call",callId:d,requestId:o.requestId,tool:e,input:t}))}),cancel:e=>{let t=vt(e);t&&(Is(e,t.registrationId),t.fail(new l("CANCELLED",`mock: call '${e}' to '${t.tool}' was cancelled by the host`)))}},rn=(e,t)=>`${e}|${t}`,on=(e,t)=>t.map(n=>{let s=n.fingerprint===void 0?void 0:Ut.get(rn(e,n.fingerprint));return s?{...n,dismissal:{reason:s.reason,dismissedAt:s.dismissedAt}}:{...n}}),It=e=>({...e,findings:on(e.path,e.findings),codeReview:on(e.path,e.codeReview)}),Ts=e=>e.report===null?e:{...e,report:It(e.report)},Ee=e=>{let t=e.kind==="results"||e.kind==="postSession"||e.kind==="agentTurn"?{...e,report:It(e.report)}:e;for(let n of We)W(n,"changed",t)},Gr=e=>{let t=new Date().toISOString(),n=[_n];if(e==="worktree"){let o=Xs(se,t,void 0);Ee({kind:"agentTurn",path:se,worktree:!0,changedFiles:n,report:o});return}let s=Se.get(se)?.timestamp,r=Xs(se,t,s);Ee({kind:"agentTurn",path:se,changedFiles:n,report:r})},qe=(e,t)=>{if(e==null)return se;let n=g(e,"path",t).trim();if(n==="")return se;if(n.startsWith("/")||n.split("/").includes(".."))throw new l("BAD_REQUEST",`${t}: '${n}' resolves outside the working directory`);return n},ot=e=>({...e,timing:e.timing.kind==="daily"&&e.timing.days?{...e.timing,days:[...e.timing.days]}:{...e.timing},...e.lastFire?{lastFire:{...e.lastFire}}:{},history:e.history.map(t=>({...t}))}),As=(e,t)=>{let n=h(e,t);if(n.kind==="interval"){if(typeof n.everyMs!="number"||!Number.isFinite(n.everyMs)||n.everyMs<=0)throw new l("BAD_REQUEST",`${t}: timing.everyMs must be a positive number`);return{kind:"interval",everyMs:Math.max(n.everyMs,6e4)}}if(n.kind!=="daily")throw new l("BAD_REQUEST",`${t}: timing.kind must be 'daily' or 'interval'`);if(typeof n.time!="string"||!/^([01]\d|2[0-3]):[0-5]\d$/.test(n.time))throw new l("BAD_REQUEST",`${t}: timing.time must be 24-hour HH:MM`);if(!Fn(n.timeZone))throw new l("BAD_REQUEST",`${t}: timing.timeZone must be an IANA zone name`);let s={kind:"daily",time:n.time,timeZone:n.timeZone};if(n.days!==void 0){if(!Array.isArray(n.days)||n.days.length===0||n.days.some(r=>!Number.isInteger(r)||r<0||r>6))throw new l("BAD_REQUEST",`${t}: timing.days must be a non-empty array of weekdays 0 (Sunday) \u2026 6 (Saturday)`);s.days=[...new Set(n.days)].sort((r,o)=>r-o)}return s},Cs=(e,t)=>e.kind==="interval"?new Date(t+e.everyMs).toISOString():Kn(e,t),an=()=>{Ee({kind:"schedules",schedules:Be.map(ot)})},Ms=(e,t)=>{let n=g(e,"scheduleId",t),s=Be.find(r=>r.id===n);if(!s)throw new l("BAD_REQUEST",`${t}: schedule '${n}' not found in this Space`);return s},xs=e=>{let t=qn.get(e);return t||(t=new Set(Zs.filter(n=>n.installed).map(n=>n.name)),qn.set(e,t)),t},ln=e=>{if(e===In)return{path:e,tools:[],ecosystem:[]};let t=xs(e);return{path:e,tools:Zs.map(n=>({...n,installed:t.has(n.name)})),ecosystem:[...Pn]}},qr=(e,t,n)=>{for(let s of e.requestIds)W(s,t,n)},Bs=(e,t)=>{let n=Ts(t);for(let s of e.waiters)ht(s,n);e.waiters=[]},Nr=(e,t)=>{let n=[["detecting","Detecting tools",void 0],["scanning","Running quality checks","tsc --noEmit, 18s elapsed"],["reviewing","AI deep review","reviewing 3 of 5 files"],["complete","Complete",void 0]];return n.flatMap(([s,r,o],c)=>{let d=s==="reviewing"&&t!==void 0?{sessionId:t}:{};return[{event:"phase",phase:s,payload:{phase:s,...d}},...s==="reviewing"&&t!==void 0?[{event:"session",phase:s,payload:{sessionId:t}}]:[],{event:"progress",phase:s,payload:{phase:s,step:r,current:c+1,total:n.length,...o===void 0?{}:{detail:o},etaMs:138e3,startedAt:e,...d}}]})},$r=e=>{let t=e.path===Tn,n=new Date().toISOString(),s=Se.get(e.path),r=s?.findings.some(f=>f.fingerprint!==void 0)?s.timestamp:void 0,o=e.path===In?to(e.path,n):An(e.path,n,!t,r),c=!t&&e.sessionId!==void 0?{...o,reviewSessionId:e.sessionId}:o;Se.set(e.path,c),Dt.push(Js(c)),e.status=t?"partial":"ok";let d={path:e.path,status:e.status,report:c,...e.sessionId!==void 0?{sessionId:e.sessionId}:{},legs:t?{scan:{status:"ok"},review:{status:"failed",code:"CLAUDE_NOT_INSTALLED",message:`mock: no coding-agent binary for '${e.path}' \u2014 the scan leg still produced a report`,sessionId:e.sessionId}}:{scan:{status:"ok"},review:{status:"ok",sessionId:e.sessionId}}};ft.set(e.path,d),ke.delete(e.path),Bs(e,d),Ee({kind:"results",path:e.path,report:c})},_s=e=>{if(e.status!=="running")return;let t=e.steps.shift();if(!t){$r(e);return}t.event==="phase"&&(e.kind=t.phase==="reviewing"?"reviewing":"scanning"),qr(e,t.event,t.payload),J(()=>_s(e))},Fr=e=>{if(e.status!=="running")return;e.status="cancelled",e.steps=[];let t={path:e.path,status:"cancelled",report:Se.get(e.path)??null,legs:{scan:{status:"skipped"},review:{status:"skipped"}}};ft.set(e.path,t),ke.delete(e.path),Bs(e,t)},Tt=Symbol("mock-defer"),Lr={features:()=>[...Ei],connect:e=>{let t=h(e,"connect").scopes;if(!Array.isArray(t)||t.some(s=>typeof s!="string"))throw new l("BAD_REQUEST","connect: scopes must be an array of scope strings");let n=[...new Set(t)];for(let s of n)cn.includes(s)&&!R.has(s)&&A.add(s);return{space:{...y},user:b===null?null:{...b},grants:n.filter(s=>A.has(s)),viewOnly:b===null}},disconnect:()=>{A.clear();for(let e of i.values())e.subscribers.clear();for(let e of u.keys())L.delete(e),Y.delete(e);u.clear();for(let e of U.keys())L.delete(e),Y.delete(e);U.clear();for(let e of pe)L.delete(e),Y.delete(e);pe.clear();for(let e of H.values())e.status="cancelled",e.pendingProposalId=null,e.steps=[],L.delete(e.requestId),Y.delete(e.requestId);H.clear();for(let e of[...G.values()])Yt(e);for(let e of be)L.delete(e),Y.delete(e);be.clear();for(let e of Ie)L.delete(e),Y.delete(e);Ie.clear();for(let e of Xe)L.delete(e),Y.delete(e);Xe.clear();for(let[e,t]of Ze)t.attachedRequestIds.delete(e),L.delete(e);Ze.clear();for(let e of We)L.delete(e),Y.delete(e);We.clear();for(let[e,t]of Le)t.requestIds.delete(e),L.delete(e),Y.delete(e);Le.clear();for(let e of[...Te.keys()])sn(e);return gr("disconnect"),null},"auth.getToken":()=>`mock-token-${y.id}`,"agents.run":(e,t)=>{let{prompt:n,title:s,model:r,sessionId:o}=br(e),c,d;if(o!==void 0){if(c=Re.get(o),!c)throw new l("BAD_REQUEST",`unknown sessionId '${o}' \u2014 agents.run continues only an open session this app started with agents.run in this Space`);if(c.run.status==="running")throw new l("BAD_REQUEST",`session_busy: session '${c.id}' is still running a turn \u2014 wait for its result() before continuing it`);c.modelValue!==void 0&&(d=is(c.modelValue))}else r!==void 0&&(d=is(r));let f=(c?.turns??0)+1,k=++z,x=`run-mock-${k}`,P=c?.id??`session-mock-${++z}`,T=new Date().toISOString(),O=F.get(P);O?(O.isExecuting=!0,O.lastActivityAt=T):F.set(P,{id:P,name:s?.trim()||`Run ${k}`,createdAt:T,lastActivityAt:T,isExecuting:!0,entries:[],seq:0});let V=Date.now(),ie={runId:x,requestId:t,sessionId:P,status:"running",text:"",steps:d?Sr(d,n,f):[{event:"status",payload:{status:"running"}},{event:"timelineEvent",payload:{kind:"status",at:V,executing:!0,turn:f}},{event:"timelineEvent",payload:{kind:"thinking",at:V,entryId:"mock-thinking-1",delta:"Reviewing the request (mock)..."}},{event:"toolUse",payload:{tool:"plan",input:{prompt:n}}},{event:"timelineEvent",payload:{kind:"tool_use",at:V,entryId:"mock-tool-1",toolName:"plan",input:{prompt:n}}},{event:"timelineEvent",payload:{kind:"tool_result",at:V,entryId:"mock-tool-1",ok:!0,result:"Planned (mock)."}},{event:"output",payload:{text:`Working on: ${n}
6
+ `}},{event:"timelineEvent",payload:{kind:"text",at:V,entryId:"mock-text-1",delta:`Working on: ${n}
7
+ `}},{event:"output",payload:{text:"Done (mock)."}},{event:"timelineEvent",payload:{kind:"text",at:V,entryId:"mock-text-1",delta:"Done (mock)."}},{event:"timelineEvent",payload:{kind:"tokens",at:V,usage:{inputTokens:120,outputTokens:48,cacheCreationTokens:0,cacheReadTokens:0,currentTurnInputTokens:120,isFinal:!0}}},{event:"timelineEvent",payload:{kind:"status",at:V,executing:!1,turn:f}}],waiters:[],...n.trim()===ji?{agentTurn:"directory"}:n.trim()===Vi?{agentTurn:"worktree"}:{}};return Ce.set(t,ie),Me.set(x,ie),c?(c.turns=f,c.run=ie):(c={id:P,turns:f,run:ie,...d?{modelValue:d.modelValue}:{}},Re.set(c.id,c)),J(()=>es(ie)),{runId:x,sessionId:P}},"agents.result":(e,t)=>{let n=g(h(e,"agents.result").runId,"runId","agents.result"),s=Me.get(n);if(!s)throw new l("BAD_REQUEST",`agents.result: unknown runId '${n}'`);return s.status==="running"?(s.waiters.push(t),Tt):{status:s.status,text:s.text}},"inference.chat":(e,t)=>{let n=h(e,"inference.chat"),s=Tr(n.messages);if(n.system!==void 0&&(typeof n.system!="string"||n.system.length>32e3))throw new l("BAD_REQUEST","inference.chat: system must be a string of at most 32000 characters");let r=n.engine===void 0||n.engine===null?void 0:g(n.engine,"engine","inference.chat");if(r!==void 0&&!Oe.includes(r))throw new l("BAD_REQUEST",`inference.chat: unknown engine '${r}' \u2014 expected one of ${Oe.join(", ")}`);let o=n.model===void 0||n.model===null?void 0:g(n.model,"model","inference.chat");if(o==="")throw new l("BAD_REQUEST","inference.chat: model must be a non-empty string when present");let c=r??(o?we(o):Rt);if(o&&we(o)!==c)throw new l("BAD_REQUEST",`inference.chat: model '${o}' is not a ${c} model \u2014 it belongs to ${we(o)}`);if(n.fastMode!==void 0&&typeof n.fastMode!="boolean")throw new l("BAD_REQUEST","inference.chat: fastMode must be a boolean");let d=n.fastMode===!0;if(d&&c!=="claude-code")throw new l("BAD_REQUEST",`inference.chat: fastMode is a claude-code setting \u2014 ${c} has no fast mode`);if(!hs.includes(c))throw new l("UNSUPPORTED",`inference.chat: ${c} cannot run a tool-less completion on this host`);let f=n.effortLevel===void 0||n.effortLevel===null?void 0:g(n.effortLevel,"effortLevel","inference.chat");if(f!==void 0&&f!=="auto"&&!Xt[c]?.includes(f))throw new l("BAD_REQUEST",`inference.chat: '${f}' is not a ${c} effort level`);let k=o??(we(st)===c?st:void 0),x=s[s.length-1]?.content.trim()??"",P=`inference-mock-${++z}`,T={runId:P,requestId:t,status:"running",engine:c,...k?{model:k}:{},...d?{fastMode:d}:{},text:"",deltas:[`(mock ${c}${k?` \xB7 ${k}`:""}${d?" \xB7 fast":""}) `,x.length>120?`${x.slice(0,119)}\u2026`:x],waiters:[]};return ee.set(t,T),le.set(P,T),J(()=>{T.status==="running"&&(W(t,"status",{status:"running"}),cs(T))}),{runId:P}},"inference.result":(e,t)=>{let n=g(h(e,"inference.result").runId,"runId","inference.result"),s=le.get(n);if(!s)throw new l("BAD_REQUEST",`inference.result: unknown runId '${n}'`);return s.status==="running"?(s.waiters.push(t),Tt):as(s)},"endpoints.register":e=>{let t=Wt(e,"endpoints.register",_i,Pi),n=ns(t.id,"endpoints.register"),s=ss(t.label,"label",Mi);if(typeof t.engine!="string"||!Hs.includes(t.engine))throw new l("BAD_REQUEST",`endpoints.register: engine must be one of ${Hs.join(", ")}`);let{baseUrl:r,apiKey:o}=t;if(typeof r!="string"||Mn(r)>Pt)throw new l("BAD_REQUEST",`endpoints.register: baseUrl must be a string of at most ${Pt} bytes`);if(typeof o!="string"||o===""||Mn(o)>Ks||Qi.test(o))throw new l("BAD_REQUEST",`endpoints.register: apiKey is required \u2014 a string of at most ${Ks} bytes, without whitespace or control characters`);let c=ss(t.model,"model",xi),d=rs(t.contextLength,"contextLength"),f=Math.min(rs(t.ttlMs,"ttlMs")??Bi,$e.maxTtlMs),k=$i(r);if(!k.ok)throw new l("ENDPOINT_INVALID",`endpoints.register: baseUrl ${k.reason}`);let x=Date.now();if([...ce.values()].filter(O=>O.id!==n&&Ft(O,x)).length>=$e.endpointsPerApp)throw new l("QUOTA_EXCEEDED",`endpoints.register: this app already holds ${$e.endpointsPerApp} endpoints in this Space \u2014 unregister one first`);let T={id:n,label:s,engine:"hermes",modelValue:`custom:${t.engine}:app-${_t}-${n}`,model:c,...d!==void 0?{contextLength:d}:{},expiresAt:new Date(x+f).toISOString()};return ce.set(n,T),{...T}},"endpoints.unregister":e=>{let t=Wt(e,"endpoints.unregister","{ id }",new Set(["id"])),n=ns(t.id,"endpoints.unregister"),s=ce.get(n);if(!s)throw new l("BAD_REQUEST",`unknown endpoint id '${n}' \u2014 endpoints.unregister removes only this app's endpoints in this Space`);ce.delete(n);for(let r of Re.values())r.modelValue===s.modelValue&&ts(r.run);return null},"endpoints.list":()=>{let e=Date.now();return[...ce.values()].filter(t=>Ft(t,e)).map(t=>({...t}))},"agents.sessions.list":()=>[...F.values()].map(St),"agents.sessions.create":e=>{let t=h(e,"agents.sessions.create"),n=typeof t.name=="string"?t.name:void 0,s=`session-mock-${++z}`,r=new Date().toISOString(),o={id:s,name:n??`Session ${F.size+1}`,createdAt:r,lastActivityAt:r,isExecuting:!1,entries:[],seq:0};return F.set(s,o),St(o)},"agents.sessions.attach":e=>{let t=g(h(e,"agents.sessions.attach").sessionId,"sessionId","agents.sessions.attach"),n=F.get(t);if(!n)throw new l("BAD_REQUEST",`agents.sessions.attach: unknown sessionId '${t}'`);return St(n)},"agents.sessions.close":e=>{let t=g(h(e,"agents.sessions.close").sessionId,"sessionId","agents.sessions.close");if(!F.delete(t))throw new l("BAD_REQUEST",`agents.sessions.close: unknown sessionId '${t}'`);return null},"agents.sessions.rename":e=>{let t=h(e,"agents.sessions.rename"),n=g(t.sessionId,"sessionId","agents.sessions.rename"),s=F.get(n);if(!s)throw new l("BAD_REQUEST",`agents.sessions.rename: unknown sessionId '${n}'`);return s.name=g(t.name,"name","agents.sessions.rename"),St(s)},"agents.sessions.history":e=>{let t=g(h(e,"agents.sessions.history").sessionId,"sessionId","agents.sessions.history"),n=F.get(t);if(!n)throw new l("BAD_REQUEST",`agents.sessions.history: unknown sessionId '${t}'`);return{sessionId:t,entries:[...n.entries],seq:n.seq}},"agents.sessions.replay":e=>{let t=h(e,"agents.sessions.replay"),n=g(t.sessionId,"sessionId","agents.sessions.replay"),s=F.get(n);if(!s)throw new l("BAD_REQUEST",`agents.sessions.replay: unknown sessionId '${n}'`);let r=t.afterSeq;if(typeof r!="number"||!Number.isInteger(r)||r<0)throw new l("BAD_REQUEST","agents.sessions.replay: afterSeq must be a non-negative integer");return{sessionId:n,fromSeq:r,events:[],currentSeq:s.seq}},"agents.sessions.approve":e=>{let t=h(e,"agents.sessions.approve"),n=g(t.sessionId,"sessionId","agents.sessions.approve");if(typeof t.approved!="boolean")throw new l("BAD_REQUEST","agents.sessions.approve: approved must be a boolean");if(!F.has(n))throw new l("BAD_REQUEST",`agents.sessions.approve: unknown sessionId '${n}'`);return null},"agents.sessions.answerQuestion":e=>{let t=h(e,"agents.sessions.answerQuestion"),n=g(t.sessionId,"sessionId","agents.sessions.answerQuestion");if(g(t.toolUseId,"toolUseId","agents.sessions.answerQuestion"),typeof t.answers!="object"||t.answers===null||Array.isArray(t.answers))throw new l("BAD_REQUEST","agents.sessions.answerQuestion: answers must be an object");if(!F.has(n))throw new l("BAD_REQUEST",`agents.sessions.answerQuestion: unknown sessionId '${n}'`);return null},"agents.sessions.prompt":e=>{let t=h(e,"agents.sessions.prompt"),n=g(t.sessionId,"sessionId","agents.sessions.prompt"),s=g(t.prompt,"prompt","agents.sessions.prompt"),r=Array.isArray(t.attachments)?t.attachments.map((d,f)=>{let k=g(d?.path,"path",`agents.sessions.prompt attachments[${f}]`);return{fileName:k.split("/").pop()??k,isImage:!1}}):void 0,o=F.get(n);if(!o)throw new l("BAD_REQUEST",`agents.sessions.prompt: unknown sessionId '${n}'`);let c=new Date().toISOString();return o.lastActivityAt=c,o.entries.push({id:`entry-${n}-${++o.seq}`,kind:"user",at:Date.now(),text:s,...r?{attachments:r}:{}}),o.entries.push({id:`entry-${n}-${++o.seq}`,kind:"text",at:Date.now(),text:`Working on: ${s} (mock)`,open:!1}),{queued:!1}},"agents.sessions.stop":e=>{let t=g(h(e,"agents.sessions.stop").sessionId,"sessionId","agents.sessions.stop"),n=F.get(t);if(!n)throw new l("BAD_REQUEST",`agents.sessions.stop: unknown sessionId '${t}'`);return n.isExecuting=!1,null},"agents.schedules.list":()=>({schedules:[..._.values()].filter(e=>e.initiator.appId===_t).map(e=>yt(e.snapshot))}),"agents.schedules.create":e=>{let t="agents.schedules.create",n=h(e,t),s=n.prompt!==void 0,r=n.promptFile!==void 0;if(s===r)throw new l("BAD_REQUEST",`${t} requires exactly one of params.prompt or params.promptFile`);let o,c;if(r)c=qt(n.promptFile,"promptFile",t),o=Vn(c,t);else{if(typeof n.prompt!="string"||n.prompt.trim()==="")throw new l("BAD_REQUEST",`${t}: params.prompt must be a non-empty string`);o=n.prompt.trim()}let d=Hn(n.timing,t);if(n.enabled!==void 0&&typeof n.enabled!="boolean")throw new l("BAD_REQUEST",`${t}: enabled must be a boolean when present`);let f=new Date,k={id:`agsched-mock-${++z}`,createdAt:f.toISOString(),prompt:o,timing:d,enabled:n.enabled!==!1,nextFireAt:wt(d,f),history:[]};return typeof n.name=="string"&&(k.name=n.name),c!==void 0&&(k.promptFile=c),n.maxLatenessMs!==void 0&&(k.maxLatenessMs=Gt(n.maxLatenessMs,t)),_.set(k.id,{snapshot:k,initiator:{appId:_t}}),yt(k)},"agents.schedules.update":e=>{let t="agents.schedules.update",n=h(e,t),{snapshot:s}=Nt(n.scheduleId,t);if(typeof n.patch!="object"||n.patch===null||Array.isArray(n.patch))throw new l("BAD_REQUEST",`${t} requires params.patch to be an object`);let r=n.patch;if(r.prompt!==void 0&&r.promptFile!==void 0)throw new l("BAD_REQUEST",`${t}: provide at most one of patch.prompt or patch.promptFile`);if(r.name!==void 0&&(s.name=g(r.name,"patch.name",t)),r.prompt!==void 0){if(typeof r.prompt!="string"||r.prompt.trim()==="")throw new l("BAD_REQUEST",`${t}: patch.prompt must be a non-empty string`);s.prompt=r.prompt.trim(),delete s.promptFile}if(r.promptFile!==void 0){let o=qt(r.promptFile,"promptFile",t);s.prompt=Vn(o,t),s.promptFile=o}if(r.enabled!==void 0){if(typeof r.enabled!="boolean")throw new l("BAD_REQUEST",`${t}: patch.enabled must be a boolean when present`);s.enabled=r.enabled}return r.timing!==void 0&&(s.timing=Hn(r.timing,t),s.nextFireAt=wt(s.timing,new Date)),jn(s,r.maxLatenessMs,t),yt(s)},"agents.schedules.delete":e=>{let t="agents.schedules.delete",{snapshot:n}=Nt(h(e,t).scheduleId,t);return _.delete(n.id),null},"agents.schedules.runNow":e=>{let t="agents.schedules.runNow",{snapshot:n}=Nt(h(e,t).scheduleId,t);if(!n.enabled)throw new l("BAD_REQUEST",`schedule '${n.id}' is disabled \u2014 enable it before running it now`);let s=new Date().toISOString(),r,o=n.promptFile===void 0?n.prompt:(a.get(n.promptFile)??"").trim();if(o==="")r={at:s,status:"failed",tabId:null,error:`promptFile '${n.promptFile}' is missing or empty`};else{n.prompt=o;let c=`session-mock-${++z}`;F.set(c,{id:c,name:n.name??`Session ${F.size+1}`,createdAt:s,lastActivityAt:s,isExecuting:!1,entries:[],seq:0}),r={at:s,status:"started",tabId:c}}return n.lastFire={at:r.at,tabId:r.tabId,status:r.status},n.history.push(r),yt(n)},"apps.open":e=>{let t=h(e,"apps.open"),n=g(t.app,"app","apps.open");if(A.size===0)throw new l("SCOPE_DENIED","apps.open: no connected app session \u2014 call connect() first");if(n==="agents"){let c=t.params;if(typeof c!="object"||c===null||Array.isArray(c))throw new l("BAD_REQUEST","apps.open: 'params' must be an object for the 'agents' target");let d=g(c.sessionId,"params.sessionId","apps.open");if(!(F.has(d)||Re.has(d)||[...H.values()].some(k=>k.target.sessionId===d)||[...ke.values()].some(k=>k.sessionId===d)||[...ft.values()].some(k=>k.sessionId===d)||[...Se.values()].some(k=>k.reviewSessionId===d)))throw new l("BAD_REQUEST",`apps.open: unknown sessionId '${d}'`);return null}if(n==="browser"){if(!A.has("browser:read"))throw new l("SCOPE_DENIED","apps.open: the 'browser' target requires scope 'browser:read'");let c=t.params;if(typeof c!="object"||c===null||Array.isArray(c))throw new l("BAD_REQUEST","apps.open: 'params' must be an object for the 'browser' target");let d=g(c.tabId,"params.tabId","apps.open");if(d==="")throw new l("BAD_REQUEST","apps.open: 'params.tabId' must be a non-empty string");return Z=he(d,"apps.open").id,fe(),null}if(n!=="files")throw new l("SCOPE_DENIED",`apps.open: unknown app '${n}' (fail closed)`);if(!A.has("files:workspace:read"))throw new l("SCOPE_DENIED","apps.open: the 'files' target requires scope 'files:workspace:read'");let s=t.params;if(typeof s!="object"||s===null||Array.isArray(s))throw new l("BAD_REQUEST","apps.open: 'params' must be an object for the 'files' target");if(!g(s.path,"params.path","apps.open").startsWith("workspace:/"))throw new l("BAD_REQUEST","apps.open: 'params.path' must use canonical workspace addressing ('workspace:/\u2026')");let o=s.line;if(o!==void 0&&(typeof o!="number"||!Number.isInteger(o)||o<1))throw new l("BAD_REQUEST","apps.open: 'params.line' must be a positive integer");return null},cancel:e=>{let t=g(h(e,"cancel").requestId,"requestId","cancel"),n=Ce.get(t);if(n)return ts(n),null;let s=ee.get(t);if(s)return kr(s),null;let r=u.get(t);if(r)return u.delete(t),r.subscribers.delete(t),L.delete(t),Y.delete(t),null;let o=S.get(t);o&&(o.requestIds.delete(t),S.delete(t),L.delete(t),Y.delete(t)),U.delete(t)&&(L.delete(t),Y.delete(t)),pe.delete(t)&&(L.delete(t),Y.delete(t));let c=H.get(t);c&&(c.status="cancelled",c.pendingProposalId=null,c.steps=[],H.delete(t),L.delete(t),Y.delete(t));let d=G.get(t);d&&Yt(d),be.delete(t)&&(L.delete(t),Y.delete(t)),Ie.delete(t)&&(L.delete(t),Y.delete(t)),Un.delete(t)&&(L.delete(t),Y.delete(t)),Xe.delete(t)&&(L.delete(t),Y.delete(t));let f=Ze.get(t);f&&(f.attachedRequestIds.delete(t),Ze.delete(t),L.delete(t)),We.delete(t)&&(L.delete(t),Y.delete(t));let k=Le.get(t);return k&&(k.requestIds.delete(t),Le.delete(t),L.delete(t),Y.delete(t)),sn(t),null},"pm.createBoard":e=>{let t=g(h(e,"pm.createBoard").prompt,"prompt","pm.createBoard"),n=`board-mock-${++z}`,s={boardId:n,title:t.trim().slice(0,60)||"Mock board",goal:t.trim()||"Mock board",status:"active",statuses:[...vn],issues:[De("IS-1","Plan","P1"),De("IS-2","Implement","P1"),De("IS-3","Verify","P2")],subscribers:new Set,createdAt:new Date().toISOString(),completedAt:null};return i.set(n,s),J(()=>Ht(s)),{boardId:n}},"pm.listBoards":()=>Array.from(i.values()).map(us),"pm.getBoard":e=>{let t=g(h(e,"pm.getBoard").boardId,"boardId","pm.getBoard"),n=i.get(t);if(!n)throw new l("BAD_REQUEST",`pm.getBoard: unknown boardId '${t}'`);return Kt(n)},"pm.createIssue":e=>{let t="pm.createIssue",{board:n,raw:s}=kt(e,t),r=g(s.title,"title",t),o=s.type===void 0?"issue":g(s.type,"type",t),c=Ns[o];if(!c)throw new l("BAD_REQUEST",`${t}: 'type' must be one of ${Object.keys(Ns).join(", ")}`);let d=De(Rr(n,c),r,"P2");return d.type=o,s.description!==void 0&&(d.description=g(s.description,"description",t)),s.acceptanceCriteria!==void 0&&(d.acceptanceCriteria=Qe(s.acceptanceCriteria,"acceptanceCriteria",t).map(f=>({text:f,checked:!1}))),ds(n,d,s,t),n.issues.push(d),Ve(n),{...d}},"pm.updateIssue":e=>{let t="pm.updateIssue",{board:n,raw:s}=kt(e,t),r=Et(n,g(s.issueId,"issueId",t),t);return ds(n,r,s.fields,t),r.updated=qs,Ve(n),{...r}},"pm.deleteIssue":e=>{let t="pm.deleteIssue",{board:n,raw:s}=kt(e,t),r=g(s.issueId,"issueId",t);return Et(n,r,t),n.issues=n.issues.filter(o=>o.id!==r),Ve(n),{deleted:!0,issueId:r}},"pm.updateBoard":e=>{let t="pm.updateBoard",{board:n,raw:s}=kt(e,t),r=h(s.fields,t);if(r.title!==void 0&&(n.title=g(r.title,"title",t)),r.goal!==void 0&&(n.goal=g(r.goal,"goal",t)),r.status!==void 0){let o=g(r.status,"status",t);if(o!=="draft"&&o!=="active"&&o!=="completed")throw new l("BAD_REQUEST",`${t}: 'status' must be draft, active, or completed`);n.status=o}return Ve(n),us(n)},"pm.execute":(e,t)=>{let n=g(h(e,"pm.execute").boardId,"boardId","pm.execute");if(!i.get(n))throw new l("BAD_REQUEST",`pm.execute: unknown boardId '${n}'`);let r=m.get(n);return(!r||r.status==="done"||r.status==="stopped")&&(r={runId:`boardrun-mock-${++z}`,boardId:n,status:"running",requestIds:new Set,issueIndex:0},m.set(n,r),w.set(r.runId,r),J(()=>jt(r))),r.requestIds.add(t),S.set(t,r),{runId:r.runId}},"pm.pause":e=>{let t=g(h(e,"pm.pause").runId,"runId","pm.pause"),n=w.get(t);if(!n)throw new l("BAD_REQUEST",`pm.pause: unknown runId '${t}'`);return n.status==="running"&&(n.status="paused"),null},"pm.resume":e=>{let t=g(h(e,"pm.resume").runId,"runId","pm.resume"),n=w.get(t);if(!n)throw new l("BAD_REQUEST",`pm.resume: unknown runId '${t}'`);return n.status==="paused"&&(n.status="running",J(()=>jt(n))),null},"pm.stop":e=>{let t=g(h(e,"pm.stop").runId,"runId","pm.stop"),n=w.get(t);if(!n)throw new l("BAD_REQUEST",`pm.stop: unknown runId '${t}'`);return(n.status==="running"||n.status==="paused")&&(n.status="stopped",Ue(n,"complete",{reason:"Stopped by app"})),null},"pm.schedules.list":()=>({schedules:[...E.values()].map(e=>({...e}))}),"pm.schedules.create":e=>{let t="pm.schedules.create",n=h(e,t),s=h(n.source,t),r;if(s.kind==="template-json"&&typeof s.content=="string"&&s.content!=="")r={kind:"template-json"};else if(s.kind==="board-zip"){let k=qt(s.path,"a board-zip source.path",t);r={kind:"board-zip",originalName:k.slice(k.lastIndexOf("/")+1)}}else throw new l("BAD_REQUEST",`${t}: source must be { kind: 'template-json', content } or { kind: 'board-zip', path: 'workspace:/\u2026' }`);let o=Ot(n.timing,t),c=`sched-mock-${++z}`,d=new Date,f={id:c,createdAt:d.toISOString(),source:r,timing:o,enabled:n.enabled===void 0?!0:n.enabled===!0,nextFireAt:wt(o,d),history:[]};return typeof n.name=="string"&&(f.name=n.name),n.input!==void 0&&(f.input=n.input),n.maxLatenessMs!==void 0&&(f.maxLatenessMs=Gt(n.maxLatenessMs,t)),E.set(c,f),{...f}},"pm.schedules.update":e=>{let t=h(e,"pm.schedules.update"),n=g(t.scheduleId,"scheduleId","pm.schedules.update"),s=E.get(n);if(!s)throw new l("BAD_REQUEST",`pm.schedules.update: unknown scheduleId '${n}'`);let r=t.patch===void 0?{}:h(t.patch,"pm.schedules.update"),o={...s};return"name"in r&&(o.name=typeof r.name=="string"?r.name:void 0),"enabled"in r&&(o.enabled=r.enabled===!0),"input"in r&&(o.input=r.input===null?void 0:r.input),"timing"in r&&(o.timing=Ot(r.timing,"pm.schedules.update"),o.nextFireAt=wt(o.timing,new Date)),jn(o,r.maxLatenessMs,"pm.schedules.update"),E.set(n,o),{...o}},"pm.schedules.delete":e=>{let t=g(h(e,"pm.schedules.delete").scheduleId,"scheduleId","pm.schedules.delete");return E.delete(t),null},"pm.schedules.runNow":e=>{let t="pm.schedules.runNow",n=g(h(e,t).scheduleId,"scheduleId",t),s=E.get(n);if(!s)throw new l("BAD_REQUEST",`schedule '${n}' not found in this Space`);if(!s.enabled)throw new l("BAD_REQUEST",`schedule '${n}' is disabled \u2014 enable it before running it now`);let r=`board-mock-${++z}`,o={boardId:r,title:s.name??"Scheduled board",goal:s.name??"Scheduled board",status:"active",statuses:[...vn],issues:[De("IS-1","Plan","P1"),De("IS-2","Implement","P1"),De("IS-3","Verify","P2")],subscribers:new Set,createdAt:new Date().toISOString(),completedAt:null};i.set(r,o),J(()=>Ht(o));let c={at:o.createdAt,status:"started",boardId:r},d={...s,lastFire:{at:c.at,boardId:r,status:c.status},history:[...s.history,c]};return E.set(n,d),{...d}},"pm.chains.list":()=>({links:[...v.values()].map(bt)}),"pm.chains.create":e=>{let t="pm.chains.create",n=h(e,t),s=g(n.from,"from",t),r=g(n.to,"to",t),o=n.on;if(o!=="success"&&o!=="failure"&&o!=="settled")throw new l("BAD_REQUEST",`${t}: 'on' must be one of 'success', 'failure', 'settled'`);if(s===r)throw new l("BAD_REQUEST",`${t}: 'from' and 'to' must name different boards`);let c=i.get(s),d=i.get(r);if(!c)throw new l("BAD_REQUEST",`${t}: unknown board '${s}'`);if(!d)throw new l("BAD_REQUEST",`${t}: unknown board '${r}'`);if(je(c)==="completed"||je(c)==="archived")throw new l("BAD_REQUEST",`${t}: 'from' board '${s}' is not runnable`);if(je(d)==="completed"||je(d)==="archived")throw new l("BAD_REQUEST",`${t}: 'to' board '${r}' is not runnable`);let f=n.passOutputs===void 0?!1:n.passOutputs===!0,k=typeof n.name=="string"?n.name:void 0,x=n.enabled===void 0?!0:n.enabled===!0,P=[...v.values()].find(de=>de.state==="armed"&&de.from===s&&de.to===r&&de.on===o);if(P){if(P.passOutputs===f&&P.name===k)return bt(P);throw new l("BAD_REQUEST",`${t}: a link (${s} -> ${r}, on=${o}) already exists with a different passOutputs/name`)}let T=Yn({from:s,to:r});if(zn(T))throw new l("BAD_REQUEST",`${t}: would close a cycle`);if(Zn(T,r)>Cn)throw new l("BAD_REQUEST",`${t}: would exceed the max chain depth of ${Cn}`);if([...v.values()].filter(de=>de.state==="armed"&&de.from===s).length>=nr)throw new l("QUOTA_EXCEEDED",`${t}: board '${s}' already has ${nr} outgoing links`);let V=[...v.values()].filter(de=>de.state==="armed").length;if(V>=sr||V>=no)throw new l("QUOTA_EXCEEDED",`${t}: at most ${sr} links per app`);let ie=`chain-mock-${++z}`,At={id:ie,from:s,to:r,on:o,passOutputs:f,name:k,enabled:x,state:"armed",createdAt:new Date().toISOString(),history:[]};return v.set(ie,At),bt(At)},"pm.chains.update":e=>{let t="pm.chains.update",n=h(e,t),s=g(n.linkId,"linkId",t),r=v.get(s);if(!r)throw new l("BAD_REQUEST",`${t}: unknown linkId '${s}'`);if(r.state!=="armed")throw new l("BAD_REQUEST",`${t}: link '${s}' is ${r.state} and can no longer be updated`);let o=n.patch===void 0?{}:h(n.patch,t);for(let c of["from","to","on","passOutputs"])if(c in o)throw new l("BAD_REQUEST",`${t}: '${c}' is immutable \u2014 create a new link instead`);return"enabled"in o&&(r.enabled=o.enabled===!0),"name"in o&&(r.name=o.name===null?void 0:typeof o.name=="string"?o.name:r.name),bt(r)},"pm.chains.delete":e=>{let t="pm.chains.delete",n=g(h(e,t).linkId,"linkId",t);if(!v.delete(n))throw new l("BAD_REQUEST",`${t}: unknown linkId '${n}'`);return null},"stream.resume":e=>{let t=h(e,"stream.resume"),n=g(t.requestId,"requestId","stream.resume"),s=t.afterSeq;if(s!==void 0&&(typeof s!="number"||!Number.isInteger(s)||s<0))throw new l("BAD_REQUEST","stream.resume: afterSeq must be a non-negative integer when present");let r=s??0,o=L.get(n)??0,c=Y.get(n);if(!c){if(Ce.has(n)||ee.has(n)||u.has(n)||S.has(n)||Te.has(n))return{requestId:n,fromSeq:r,events:[],currentSeq:0};throw new l("STREAM_GAP",`stream.resume: '${n}' is not a stream this mock host is holding \u2014 reconcile with a snapshot read`)}return{requestId:n,fromSeq:r,events:c.filter(d=>d.seq>r),currentSeq:o}},"pm.subscribeBoard":(e,t)=>{let n=g(h(e,"pm.subscribeBoard").boardId,"boardId","pm.subscribeBoard"),s=i.get(n);if(!s)throw new l("BAD_REQUEST",`pm.subscribeBoard: unknown boardId '${n}'`);return s.subscribers.add(t),u.set(t,s),W(t,"boardUpdate",Kt(s)),null},"files.read":e=>{let t=g(h(e,"files.read").path,"path","files.read"),n=a.get(t);if(n===void 0)throw new l("BAD_REQUEST",`files.read: no such file '${t}'`);return n},"files.readEntry":e=>{let t=g(h(e,"files.readEntry").path,"path","files.readEntry"),n=a.get(t);if(n===void 0)throw new l("BAD_REQUEST",`files.readEntry: no such file '${t}'`);let s=new TextEncoder().encode(n).length;return{kind:"text",content:n,modifiedAt:N.get(t),size:s}},"files.write":e=>{let t=h(e,"files.write"),n=g(t.path,"path","files.write"),s=g(t.content,"content","files.write"),r=t.expectedModifiedAt;if(r!==void 0){if(typeof r!="string"||Number.isNaN(Date.parse(r)))throw new l("BAD_REQUEST","files.write: expectedModifiedAt must be an ISO-8601 timestamp");let o=a.has(n)?N.get(n):void 0;if(o===void 0||Date.parse(o)!==Date.parse(r))throw new l("CONFLICT",`files.write: '${n}' ${o===void 0?"no longer exists":`was modified at ${o}`}, not ${r} \u2014 nothing was written`)}return a.set(n,s),re(n),tt(n,"changed"),null},"files.list":e=>{let t=g(h(e,"files.list").path,"path","files.list"),n=t===""||t==="."?"":`${t.replace(/\/+$/,"")}/`,s=new Map;for(let r of a.keys()){if(!r.startsWith(n))continue;let o=r.slice(n.length);if(!o)continue;let c=o.indexOf("/");c===-1?s.set(o,s.get(o)??!1):s.set(o.slice(0,c),!0)}for(let r of Q){if(!r.startsWith(n))continue;let o=r.slice(n.length);if(!o)continue;let c=o.indexOf("/");s.set(c===-1?o:o.slice(0,c),!0)}return[...s].map(([r,o])=>{let c=`${n}${r}`,d=o?void 0:a.get(c);return{name:r,dir:o,kind:o?"directory":"file",size:d===void 0?void 0:new TextEncoder().encode(d).length,modifiedAt:N.get(c)}}).sort((r,o)=>r.name<o.name?-1:1)},"files.delete":e=>{let t=g(h(e,"files.delete").path,"path","files.delete"),n=Vt(t),s=n||a.has(t);a.delete(t),Q.delete(t),N.delete(t);let r=`${t}/`;for(let o of[...a.keys()])o.startsWith(r)&&(a.delete(o),N.delete(o));for(let o of[...Q])o.startsWith(r)&&Q.delete(o);return s&&tt(t,"deleted",n),null},"files.mkdir":e=>{let t=g(h(e,"files.mkdir").path,"path","files.mkdir"),n=Vt(t);return Q.add(t),re(t),n||tt(t,"created",!0),null},"files.rename":e=>{let t=h(e,"files.rename"),n=g(t.path,"path","files.rename"),s=g(t.newPath,"newPath","files.rename"),r=`${n}/`,o=Vt(n);if(!o&&!a.has(n))throw new l("BAD_REQUEST",`files.rename: no such file or directory '${n}'`);let c=f=>f===n?s:`${s}${f.slice(n.length)}`,d=(f,k)=>{let x=N.get(f);N.delete(f),x!==void 0&&N.set(k,x)};for(let f of[...a.keys()]){if(f!==n&&!f.startsWith(r))continue;let k=a.get(f);a.delete(f);let x=c(f);a.set(x,k),d(f,x)}for(let f of[...Q]){if(f!==n&&!f.startsWith(r))continue;Q.delete(f);let k=c(f);Q.add(k),d(f,k)}return tt(n,"renamed",o,s),null},"files.uploadStart":e=>{let t=h(e,"files.uploadStart"),n=g(t.path,"path","files.uploadStart"),s=t.totalChunks;if(typeof s!="number"||!Number.isInteger(s)||s<1)throw new l("BAD_REQUEST","files.uploadStart: totalChunks must be a positive integer");let r=t.overwrite===!0;if(Q.has(n))throw new l("BAD_REQUEST",`files.uploadStart: '${n}' is a directory \u2014 cannot upload over it`);if(a.has(n)&&!r)throw new l("BAD_REQUEST",`files.uploadStart: '${n}' already exists \u2014 pass overwrite to replace it`);let o=`upload-mock-${++z}`;return ae.set(o,{path:n,overwrite:r,totalChunks:s,chunks:new Array(s),nextExpectedChunk:0,bytesWritten:0,scope:Fs(n)}),{uploadId:o,chunkSize:256*1024,nextExpectedChunk:0}},"files.uploadChunk":e=>{let t=h(e,"files.uploadChunk"),n=g(t.uploadId,"uploadId","files.uploadChunk"),s=t.chunkIndex;if(typeof s!="number"||!Number.isInteger(s)||s<0)throw new l("BAD_REQUEST","files.uploadChunk: chunkIndex must be a non-negative integer");let r=g(t.content,"content","files.uploadChunk"),o=ae.get(n);if(!o)throw new l("BAD_REQUEST",`files.uploadChunk: unknown uploadId '${n}'`);if(s<o.nextExpectedChunk)return{chunkIndex:s,bytesWritten:o.bytesWritten};if(s!==o.nextExpectedChunk)throw new l("BAD_REQUEST",`files.uploadChunk: expected chunk ${o.nextExpectedChunk}, got ${s} \u2014 chunks must arrive in order`);if(s>=o.totalChunks)throw new l("BAD_REQUEST",`files.uploadChunk: upload '${n}' already has all ${o.totalChunks} chunks`);if(o.chunks[s]=ut(r),o.nextExpectedChunk+=1,o.bytesWritten+=o.chunks[s].byteLength,o.nextExpectedChunk===o.totalChunks){let c=new Uint8Array(o.bytesWritten),d=0;for(let k of o.chunks)c.set(k,d),d+=k.byteLength;let f=a.has(o.path);a.set(o.path,new TextDecoder().decode(c)),re(o.path),ae.delete(n),tt(o.path,f?"changed":"created")}return{chunkIndex:s,bytesWritten:o.bytesWritten}},"files.uploadStatus":e=>{let t=g(h(e,"files.uploadStatus").uploadId,"uploadId","files.uploadStatus"),n=ae.get(t);if(!n)throw new l("BAD_REQUEST",`files.uploadStatus: unknown uploadId '${t}'`);return{nextExpectedChunk:n.nextExpectedChunk}},"files.uploadCancel":e=>{let t=g(h(e,"files.uploadCancel").uploadId,"uploadId","files.uploadCancel");return ae.delete(t),null},"files.downloadStart":e=>{let t=h(e,"files.downloadStart"),n=g(t.path,"path","files.downloadStart");if(Q.has(n)||[...a.keys()].some(f=>f.startsWith(`${n}/`)))throw new l("BAD_REQUEST","files.downloadStart: directory (zip) download isn't modeled in mock mode \u2014 test this path against a real host");let s=a.get(n);if(s===void 0)throw new l("BAD_REQUEST",`files.downloadStart: no such file '${n}'`);let r=new TextEncoder().encode(s),o=256*1024,c=Math.max(1,Math.ceil(r.byteLength/o)),d=`download-mock-${++z}`;return j.set(d,{content:ct(r),fileSize:r.byteLength,totalChunks:c,mimeType:"text/plain",isZip:!1,scope:$s(n)}),{downloadId:d,fileSize:r.byteLength,totalChunks:c,chunkSize:o,mimeType:"text/plain",isZip:!1}},"files.downloadChunk":e=>{let t=h(e,"files.downloadChunk"),n=g(t.downloadId,"downloadId","files.downloadChunk"),s=t.chunkIndex;if(typeof s!="number"||!Number.isInteger(s)||s<0)throw new l("BAD_REQUEST","files.downloadChunk: chunkIndex must be a non-negative integer");let r=j.get(n);if(!r)throw new l("BAD_REQUEST",`files.downloadChunk: unknown downloadId '${n}'`);if(s>=r.totalChunks)throw new l("BAD_REQUEST",`files.downloadChunk: download '${n}' has only ${r.totalChunks} chunks`);let o=ut(r.content),c=256*1024,d=s*c,f=Math.min(d+c,o.byteLength);return{content:ct(o.subarray(d,f))}},"files.downloadCancel":e=>{let t=g(h(e,"files.downloadCancel").downloadId,"downloadId","files.downloadCancel");return j.delete(t),null},"files.search":(e,t)=>{let n=h(e,"files.search"),s=g(n.path,"path","files.search"),r=g(n.query,"query","files.search"),o=typeof n.options=="object"&&n.options!==null?n.options:{},c=o.caseSensitive===!0,d=o.regex===!0,f=s===""||s==="."?"":`${s.replace(/\/+$/,"")}/`,k=d?new RegExp(r,c?"":"i"):void 0,x=c?r:r.toLowerCase(),P=[];for(let[T,O]of a){if(f&&!T.startsWith(f))continue;let V=f?T.slice(f.length):T;O.split(`
8
+ `).forEach((ie,At)=>{let de=k?ie.search(k):(c?ie:ie.toLowerCase()).indexOf(x);de!==-1&&P.push({path:V,line:At+1,column:de+1,lineContent:ie,contextBefore:[],contextAfter:[]})})}return J(()=>{P.length>0&&W(t,"results",{matches:P}),W(t,"complete",{totalMatches:P.length,fileCount:new Set(P.map(T=>T.path)).size,truncated:!1})}),null},"files.definition":e=>{let t=h(e,"files.definition"),n=g(t.path,"path","files.definition"),r=g(t.symbolName,"symbolName","files.definition").replace(/[.*+?^${}()|[\]\\]/g,"\\$&"),o=new RegExp(`\\b(function|const|let|var|class|interface|type|enum)\\s+${r}\\b`),c=n===""||n==="."?"":`${n.replace(/\/+$/,"")}/`,d=[];for(let[f,k]of a){if(c&&!f.startsWith(c))continue;let x=c?f.slice(c.length):f;k.split(`
9
+ `).forEach((P,T)=>{let O=o.exec(P);O&&d.push({path:x,line:T+1,column:O.index+1,lineContent:P,kind:"function"})})}return d},"files.subscribeChanges":(e,t)=>{let n=g(h(e,"files.subscribeChanges").path,"path","files.subscribeChanges");return U.set(t,n),{subscribed:!0}},"storage.get":e=>{let t=B.get(g(h(e,"storage.get").key,"key","storage.get"));return t===void 0?void 0:structuredClone(t)},"storage.set":e=>{let t=h(e,"storage.set"),n=g(t.key,"key","storage.set"),s;try{s=structuredClone(t.value)}catch{throw new l("BAD_REQUEST","storage.set: value must be structured-cloneable")}return B.set(n,s),null},"storage.delete":e=>(B.delete(g(h(e,"storage.delete").key,"key","storage.delete")),null),"storage.keys":()=>[...B.keys()],"notifications.request":()=>(I=!0,null),"notifications.status":()=>({granted:I}),"notifications.revoke":()=>(I=!1,null),"theme.get":()=>({...C,tokens:{...C.tokens}}),"locale.get":()=>({...K}),"browser.tabs.list":()=>gs(),"browser.tabs.subscribe":(e,t)=>(pe.add(t),{subscribed:!0}),"browser.navigate":e=>{let t=h(e,"browser.navigate"),n=g(t.url,"url","browser.navigate"),s=typeof t.tabId=="string"?t.tabId:Z;if(s===null)throw new l("BAD_REQUEST","browser.navigate: no tab is open to navigate");let r=he(s,"browser.navigate");return r.canGoBack=!0,r.url=n,r.title=Zt(n)??n,ve+=1,fe(),null},"browser.open":e=>{let t=h(e,"browser.open"),n=g(t.url,"url","browser.open"),s=Zt(n);if(t.pinnedApp===!0&&s!==void 0){let o=D.find(c=>Zt(c.url)===s);if(o)return Z=o.id,fe(),{tabId:o.id}}let r=`tab-mock-${++z}`;return D.push({id:r,url:n,title:s??n,isLoading:!1,canGoBack:!1,canGoForward:!1}),Z=r,ve+=1,fe(),{tabId:r}},"browser.close":e=>{let t=g(h(e,"browser.close").tabId,"tabId","browser.close"),n=D.findIndex(s=>s.id===t);if(n===-1)throw new l("BAD_REQUEST",`browser.close: unknown tabId '${t}'`);return D.splice(n,1),Z===t&&(Z=D[Math.min(n,D.length-1)]?.id??null),fe(),null},"browser.select":e=>{let t=g(h(e,"browser.select").tabId,"tabId","browser.select");return Z=he(t,"browser.select").id,fe(),null},"browser.back":e=>fs(e,"browser.back"),"browser.forward":e=>fs(e,"browser.forward"),"browser.reload":e=>{let t=zt(e,"browser.reload");return t.isLoading=!0,ve+=1,fe(),J(()=>{t.isLoading=!1,fe()}),null},"browser.stop":e=>{let t=zt(e,"browser.stop");return t.isLoading=!1,fe(),null},"browser.preflight":()=>({ok:!0}),"browser.resumeDriver":e=>{let t=g(h(e,"browser.resumeDriver").tabId,"tabId","browser.resumeDriver");return he(t,"browser.resumeDriver"),null},"browser.setDeviceProfile":e=>{let t=h(e,"browser.setDeviceProfile"),n=g(t.tabId,"tabId","browser.setDeviceProfile");if(t.formFactor!=="desktop"&&t.formFactor!=="mobile")throw new l("BAD_REQUEST","browser.setDeviceProfile: formFactor must be 'desktop' or 'mobile'");let s=he(n,"browser.setDeviceProfile");return s.deviceProfile=t.formFactor==="mobile"?{formFactor:"mobile",width:390,height:844,label:"Mobile"}:{formFactor:"desktop",width:1280,height:720,label:"Desktop"},fe(),null},"browser.view.attach":(e,t)=>{let n=e==null?{}:h(e,"browser.view.attach"),s=n.tabId===void 0||n.tabId===null?Z:g(n.tabId,"tabId","browser.view.attach");if(s===null)throw new l("BAD_REQUEST","browser.view.attach: no tab is open to stream");let r=he(s,"browser.view.attach"),o={sessionId:`view-mock-${++z}`,requestId:t,tabId:r.id,detached:!1};return G.set(t,o),J(()=>{o.detached||(W(t,"connectionState",{state:"negotiating"}),ms(o),W(t,"driverState",{tabId:o.tabId,state:"idle",since:0}))}),{sessionId:o.sessionId,tabId:o.tabId}},"browser.view.answer":e=>(nt(e,"browser.view.answer"),g(h(e,"browser.view.answer").sdp,"sdp","browser.view.answer"),null),"browser.view.ice":e=>{nt(e,"browser.view.ice");let t=h(e,"browser.view.ice").candidate;if(t!==null&&(typeof t!="object"||t===void 0))throw new l("BAD_REQUEST","browser.view.ice: candidate must be an object or null");return null},"browser.view.state":e=>{let t=nt(e,"browser.view.state"),n=g(h(e,"browser.view.state").state,"state","browser.view.state");if(!["negotiating","connected","failed","closed"].includes(n))throw new l("BAD_REQUEST",`browser.view.state: unknown state '${n}'`);return W(t.requestId,"connectionState",{state:n}),n==="closed"&&Yt(t),null},"browser.view.input":e=>{let t=nt(e,"browser.view.input"),n=h(e,"browser.view.input").input,s=Array.isArray(n)?n:[n];if(s.length===0||s.length>Gs)throw new l("BAD_REQUEST",`browser.view.input: input must be 1\u2013${Gs} envelopes`);return s.find(o=>typeof o!="object"||o===null||typeof o.kind!="string")!==void 0?(W(t.requestId,"inputRejected",{kind:"unknown",reason:"malformed",message:"invalid input envelope"}),{delivered:!1,reason:"malformed"}):{delivered:!0}},"browser.view.bounds":e=>{nt(e,"browser.view.bounds");let t=h(e,"browser.view.bounds").bounds,n=t==null?null:h(t,"browser.view.bounds");if(!n||typeof n.width!="number"||typeof n.height!="number")throw new l("BAD_REQUEST","browser.view.bounds: bounds requires numeric { width, height }");return null},"browser.snapshot":e=>{let t=g(h(e,"browser.snapshot").tabId,"tabId","browser.snapshot"),n=he(t,"browser.snapshot");return{url:n.url,title:n.title,epoch:ve,root:Mr(n)}},"browser.screenshot":e=>{let t=h(e,"browser.screenshot"),n=g(t.tabId,"tabId","browser.screenshot");return he(n,"browser.screenshot"),{format:t.format==="jpeg"?"jpeg":"png",data:vi}},"browser.evaluate":e=>{let t=h(e,"browser.evaluate"),n=g(t.tabId,"tabId","browser.evaluate");return g(t.expr,"expr","browser.evaluate"),he(n,"browser.evaluate"),{value:null,type:"object"}},"browser.automate":(e,t)=>{let n=h(e,"browser.automate"),s=g(n.prompt,"prompt","browser.automate");if(s.trim()==="")throw new l("BAD_REQUEST","browser.automate: prompt must be a non-empty string");let r;if(n.engine!==void 0&&n.engine!==null&&(r=g(n.engine,"engine","browser.automate"),!Oe.includes(r)))throw new l("BAD_REQUEST",`browser.automate: unknown engine '${r}' \u2014 expected one of ${Oe.join(", ")}`);let o;if(n.model!==void 0&&n.model!==null&&(o=g(n.model,"model","browser.automate"),o===""))throw new l("BAD_REQUEST","browser.automate: model must be a non-empty string when present");let c=r??(o?we(o):Rt);if(o&&we(o)!==c)throw new l("BAD_REQUEST",`browser.automate: model '${o}' is not a ${c} model \u2014 it belongs to ${we(o)}`);let d=o??(we(st)===c?st:void 0);n.tabId!==void 0&&n.tabId!==null&&he(g(n.tabId,"tabId","browser.automate"),"browser.automate");let f=`automation-mock-${++z}`,k=`agent-mock-${++z}`,x=s.split(`
10
+ `).find(V=>V.trim()!=="")?.trim()??s,P={engine:c,...d?{model:d}:{},sessionId:k},T={taskId:f,requestId:t,status:"running",pendingProposalId:null,steps:[{event:"step",payload:{phase:"plan",detail:`1. Read the page
11
+ 2. ${s}`}},{event:"step",payload:{phase:"observe",detail:"Read the page (mock)"}}],target:P};H.set(t,T),J(()=>W(T.requestId,"session",{sessionId:k,name:x}));let O=()=>{if(T.status!=="running")return;if(T.steps.length===0){Cr(T);return}let V=T.steps.shift();W(T.requestId,V.event,ys(T,V)),J(O)};return J(O),{taskId:f}},"browser.automate.approve":e=>{let t=h(e,"browser.automate.approve"),n=g(t.proposalId,"proposalId","browser.automate.approve"),s=t.verdict===void 0?"approve":t.verdict;if(s!=="approve"&&s!=="edit"&&s!=="deny")throw new l("BAD_REQUEST","browser.automate.approve: verdict must be 'approve', 'edit' or 'deny' when present");let r=[...H.values()].find(o=>o.pendingProposalId===n);if(!r)throw new l("BAD_REQUEST",`browser.automate.approve: no proposal '${n}' is awaiting a verdict`);if(r.pendingProposalId=null,r.status="running",s==="deny")r.steps=[{event:"done",payload:{status:"cancelled"}}];else{let o=s==="edit"&&typeof t.editedText=="string"?t.editedText:null;r.steps=[{event:"step",payload:{phase:"act",detail:o===null?'Clicked "Continue" (mock)':`Typed "${o}" (mock)`,proposalId:n}},{event:"step",payload:{phase:"extract",detail:"Read the resulting page (mock)"}},{event:"done",payload:{status:"success",result:`Completed: ${r.taskId} (mock)`}}]}return J(()=>bs(r)),null},"composer.autocomplete":e=>{let t=g(h(e,"composer.autocomplete").query,"query","composer.autocomplete").toLowerCase();return[...a.keys()].filter(n=>t===""||n.toLowerCase().includes(t)).slice(0,15).map(n=>({value:n,label:n,isDirectory:!1,isRecent:!1,fileType:n.split(".").pop()??"",matchedIndices:[]}))},"composer.skills":()=>Ii.map(e=>({...e})),"composer.snippets":e=>{let t=h(e,"composer.snippets"),n=typeof t.query=="string"?t.query.trim().toLowerCase():"",s=Ti.map(r=>({...r,aliases:[...r.aliases]}));return n===""?s:s.filter(r=>r.name.includes(n)||r.description.toLowerCase().includes(n))},"composer.settings":()=>({engines:[...Oe],defaults:{engine:Rt,model:st,effortLevel:"auto",fastMode:!1},models:Ar.map(e=>({...e})),modelsStatus:{fetchedAt:new Date().toISOString(),stale:!1,refreshing:!1},effortLevels:Object.fromEntries(Object.entries(Xt).map(([e,t])=>[e,[...t]])),inferenceEngines:[...hs],...p.agentRunEngines===null?{}:{agentRunEngines:[...ws]}}),"terminal.sessions.list":()=>[...xe.values()].map(ks),"terminal.sessions.subscribe":(e,t)=>(Xe.add(t),{subscribed:!0}),"terminal.open":e=>{let t=h(e,"terminal.open"),n=t.cols,s=t.rows;if(typeof n!="number"||!Number.isInteger(n)||n<1)throw new l("BAD_REQUEST","terminal.open: cols must be a positive integer");if(typeof s!="number"||!Number.isInteger(s)||s<1)throw new l("BAD_REQUEST","terminal.open: rows must be a positive integer");let r=t.cwd===void 0?"/workspace":g(t.cwd,"cwd","terminal.open"),o=`pty-mock-${++z}`,c=new Date().toISOString(),d={id:o,shell:"mock-shell",cwd:r,cols:n,rows:s,platform:"linux",createdAt:c,lastActivityAt:c,scrollback:`Mock shell ready (${o})
12
+ $ `,closed:!1,attachedRequestIds:new Set};return xe.set(o,d),Es({kind:"opened",session:ks(d)}),{id:o,shell:d.shell,cwd:r,cols:n,rows:s,platform:d.platform}},"terminal.attach":(e,t)=>{let n=g(h(e,"terminal.attach").id,"id","terminal.attach"),s=xe.get(n);if(!s||s.closed)throw new l("BAD_REQUEST",`terminal.attach: unknown session '${n}'`);return s.attachedRequestIds.add(t),Ze.set(t,s),J(()=>{s.attachedRequestIds.has(t)&&$n(t,"scrollback",{data:s.scrollback})}),{id:n}},"terminal.write":e=>{let t=h(e,"terminal.write"),n=g(t.id,"id","terminal.write"),s=g(t.data,"data","terminal.write"),r=xe.get(n);if(!r||r.closed)throw new l("BAD_REQUEST",`terminal.write: unknown session '${n}'`);r.lastActivityAt=new Date().toISOString(),Rs(r,s),nn(r,"output",{data:s});let o=s.replace(/[\r\n]+$/,"");return o==="burst"?Ur(r):o==="exit"&&vs(r,0),null},"terminal.resize":e=>{let t=h(e,"terminal.resize"),n=g(t.id,"id","terminal.resize"),s=xe.get(n);if(!s||s.closed)throw new l("BAD_REQUEST",`terminal.resize: unknown session '${n}'`);let r=t.cols,o=t.rows;if(typeof r!="number"||!Number.isInteger(r)||r<1)throw new l("BAD_REQUEST","terminal.resize: cols must be a positive integer");if(typeof o!="number"||!Number.isInteger(o)||o<1)throw new l("BAD_REQUEST","terminal.resize: rows must be a positive integer");return s.cols=r,s.rows=o,null},"terminal.close":e=>{let t=g(h(e,"terminal.close").id,"id","terminal.close"),n=xe.get(t);return n&&vs(n,0),null},"git.status":e=>{let{worktree:t}=ne(e,"git.status"),n=q.get(t.branch);return{branch:t.branch,isDirty:t.staged.length+t.unstaged.length+t.untracked.length>0,staged:t.staged.map(s=>({...s})),unstaged:t.unstaged.map(s=>({...s})),untracked:t.untracked.map(s=>({...s})),ahead:0,behind:0,hasUpstream:n?.upstream!==void 0}},"git.log":e=>{let{record:t}=ne(e,"git.log"),n=t.limit;if(n!==void 0&&(typeof n!="number"||!Number.isInteger(n)||n<1))throw new l("BAD_REQUEST","git.log: limit must be a positive integer when present");let s=t.skip;if(s!==void 0&&(typeof s!="number"||!Number.isInteger(s)||s<0))throw new l("BAD_REQUEST","git.log: skip must be a non-negative integer when present");let r=n??20,o=s??0,c=t.search===void 0||t.search===null?void 0:g(t.search,"search","git.log"),d=c?te.filter(x=>x.subject.toLowerCase().includes(c.toLowerCase())):te,k={entries:d.slice(o,o+r).map(({hash:x,shortHash:P,subject:T,author:O,date:V})=>({hash:x,shortHash:P,subject:T,author:O,date:V})),hasMore:o+r<d.length,skip:o};return c!==void 0&&(k.search=c),k},"git.diff":e=>{let{worktree:t,record:n}=ne(e,"git.diff"),s=g(n.path,"path","git.diff"),r=n.staged===!0;if(![...t.staged,...t.unstaged,...t.untracked].some(c=>c.path===s))throw new l("BAD_REQUEST",`git.diff: '${s}' has no pending changes in this worktree`);return{path:s,original:`// ${s} (mock) \u2014 before
13
13
  `,modified:`// ${s} (mock) \u2014 after
14
- `,staged:i}},"git.show":e=>{let t=p(y(e,"git.show").hash,"hash","git.show"),n=Ye(t);if(!n)throw new l("BAD_REQUEST",`git.show: unknown commit '${t}'`);return{hash:n.hash,shortHash:n.shortHash,subject:n.subject,body:n.body,author:n.author,date:n.date,files:n.files.map(s=>({...s}))}},"git.commitDiff":e=>{let t=y(e,"git.commitDiff"),n=p(t.hash,"hash","git.commitDiff"),s=p(t.path,"path","git.commitDiff"),i=Ye(n);if(!i)throw new l("BAD_REQUEST",`git.commitDiff: unknown commit '${n}'`);if(!i.files.some(o=>o.path===s))throw new l("BAD_REQUEST",`git.commitDiff: '${s}' was not changed in commit '${n}'`);return{hash:i.hash,path:s,original:`// ${s} (mock) \u2014 before ${i.shortHash}
15
- `,modified:`// ${s} (mock) \u2014 at ${i.shortHash}
16
- `}},"git.branches.list":e=>{let{worktree:t}=te(e,"git.branches.list");return{branches:[...I.values()].map(s=>{let i=Ye(s.head);return{name:s.name,shortHash:i?.shortHash??Ve(s.head),isRemote:s.isRemote,isCurrent:s.name===t.branch,upstream:s.upstream,lastCommitDate:i?.date,ahead:0,behind:0}}),current:t.branch}},"git.branches.create":e=>{let{worktree:t,record:n}=te(e,"git.branches.create"),s=p(n.name,"name","git.branches.create");if(I.has(s))throw new l("BAD_REQUEST",`git.branches.create: branch '${s}' already exists`);let i=n.startPoint===void 0?void 0:p(n.startPoint,"startPoint","git.branches.create"),o;if(i===void 0)o=I.get(t.branch)?.head??N[0]?.hash??Be();else if(o=I.get(i)?.head??Ye(i)?.hash??"",!o)throw new l("BAD_REQUEST",`git.branches.create: unknown startPoint '${i}'`);return I.set(s,{name:s,head:o,isRemote:!1}),n.checkout===!0&&(t.branch=s,Mt(t)),{name:s,hash:o}},"git.branches.delete":e=>{let{record:t}=te(e,"git.branches.delete"),n=p(t.name,"name","git.branches.delete");if(!I.has(n))throw new l("BAD_REQUEST",`git.branches.delete: unknown branch '${n}'`);let s=t.force===!0;if([...z.values()].some(o=>o.branch===n)&&!s)throw new l("BAD_REQUEST",`git.branches.delete: '${n}' is checked out in a worktree \u2014 pass force to delete anyway`);return I.delete(n),null},"git.tags.list":()=>({tags:[...ee.values()].map(e=>({name:e.name,shortHash:Ve(e.hash),date:e.date,message:e.message}))}),"git.tags.create":e=>{let{worktree:t,record:n}=te(e,"git.tags.create"),s=p(n.name,"name","git.tags.create");if(ee.has(s))throw new l("BAD_REQUEST",`git.tags.create: tag '${s}' already exists`);let i=n.commit===void 0?void 0:p(n.commit,"commit","git.tags.create"),o=i===void 0?I.get(t.branch)?.head:Ye(i)?.hash??I.get(i)?.head;if(!o)throw new l("BAD_REQUEST",`git.tags.create: unknown commit '${i}'`);let u=n.message===void 0?"":p(n.message,"message","git.tags.create");return ee.set(s,{name:s,hash:o,message:u,date:new Date().toISOString()}),{name:s,hash:o}},"git.tags.push":e=>{let t=y(e,"git.tags.push"),n=t.name===void 0||t.name===null?void 0:p(t.name,"name","git.tags.push"),s=t.all===!0;if(!s&&n===void 0)throw new l("BAD_REQUEST","git.tags.push: pass a name or all: true");if(n!==void 0&&!ee.has(n))throw new l("BAD_REQUEST",`git.tags.push: unknown tag '${n}'`);return{name:n??"*",output:`Pushed ${s?"all tags":`tag '${n}'`} to origin (mock)`}},"git.remote.info":e=>{let{worktree:t}=te(e,"git.remote.info");return{hasRemote:!0,remoteUrl:fs,provider:"github",defaultBranch:_e,currentBranch:t.branch,hasGhCli:!0,ghCliAuthenticated:!0,ghCliBinary:"gh",remoteBranches:[...I.keys()],preferredBaseBranch:_e}},"git.repos.discover":()=>({repos:[{path:Ne,name:"mock-repo",branch:z.get(Ne)?.branch}],rootIsGitRepo:!0}),"git.worktrees.list":()=>Nn(),"git.worktrees.create":e=>{let t=y(e,"git.worktrees.create"),n=p(t.branchName,"branchName","git.worktrees.create"),s=t.baseBranch===void 0?void 0:p(t.baseBranch,"baseBranch","git.worktrees.create"),i=t.path===void 0?`/workspace-worktrees/${n}`:p(t.path,"path","git.worktrees.create");if(z.has(i))throw new l("BAD_REQUEST",`git.worktrees.create: '${i}' already has a worktree`);let o=I.get(n);if(!o){if(s!==void 0&&!I.has(s))throw new l("BAD_REQUEST",`git.worktrees.create: unknown baseBranch '${s}'`);let m=I.get(s??_e);o={name:n,head:m?.head??N[0]?.hash??Be(),isRemote:!1},I.set(n,o)}let u={path:i,branch:n,isMain:!1,staged:[],unstaged:[],untracked:[]};return z.set(i,u),t.assign===!0&&(ce=i),Ct(),{path:i,branch:n,head:o.head}},"git.worktrees.remove":e=>{let t=y(e,"git.worktrees.remove"),n=p(t.path,"path","git.worktrees.remove"),s=z.get(n);if(!s)throw new l("BAD_REQUEST",`git.worktrees.remove: unknown worktree '${n}'`);if(s.isMain)throw new l("BAD_REQUEST","git.worktrees.remove: the main worktree cannot be removed");return z.delete(n),ce===n&&(ce=null),t.deleteBranch===!0&&I.delete(s.branch),Ct(),null},"git.worktrees.switchActive":e=>{let t=y(e,"git.worktrees.switchActive"),n=t.path===void 0||t.path===null?null:p(t.path,"path","git.worktrees.switchActive");if(n!==null&&!z.has(n))throw new l("BAD_REQUEST",`git.worktrees.switchActive: unknown worktree '${n}'`);ce=n;let s=z.get(n??Ne);return Ct(),s&&Mt(s),{path:ce,branch:s?.branch??null}},"git.worktrees.subscribe":(e,t)=>(ue.add(t),{subscribed:!0}),"git.merge.preview":e=>{let t=y(e,"git.merge.preview"),n=p(t.sourceBranch,"sourceBranch","git.merge.preview"),s=p(t.targetBranch,"targetBranch","git.merge.preview");if(!I.has(n))throw new l("BAD_REQUEST",`git.merge.preview: unknown sourceBranch '${n}'`);if(!I.has(s))throw new l("BAD_REQUEST",`git.merge.preview: unknown targetBranch '${s}'`);return{clean:!0,conflicts:[],stat:"0 files changed (mock)",commits:[],ahead:0}},"git.merge.run":e=>{let t=y(e,"git.merge.run"),n=p(t.sourceBranch,"sourceBranch","git.merge.run"),s=p(t.targetBranch,"targetBranch","git.merge.run"),i=t.strategy;if(i!=="merge"&&i!=="squash"&&i!=="rebase")throw new l("BAD_REQUEST","git.merge.run: strategy must be 'merge', 'squash', or 'rebase'");if(!I.has(n))throw new l("BAD_REQUEST",`git.merge.run: unknown sourceBranch '${n}'`);let o=I.get(s);if(!o)throw new l("BAD_REQUEST",`git.merge.run: unknown targetBranch '${s}'`);let u=t.commitMessage===void 0?`Merge '${n}' into '${s}' (mock)`:p(t.commitMessage,"commitMessage","git.merge.run"),m=Be();return N.unshift({hash:m,shortHash:Ve(m),subject:u,body:"",author:w?.name??"Mock User",date:new Date().toISOString(),files:[]}),o.head=m,{success:!0,mergeCommit:m}},"git.merge.abort":()=>({aborted:!0}),"git.merge.complete":()=>({success:!0,mergeCommit:N[0]?.hash??Be()}),"git.merge.stashPop":e=>{let t=y(e,"git.merge.stashPop");return p(t.stashSha,"stashSha","git.merge.stashPop"),{success:!0}},"git.merge.discardBlockers":e=>{let t=y(e,"git.merge.discardBlockers");return{success:!0,paths:Me(t.paths,"paths","git.merge.discardBlockers")}},"git.pr.generateDescription":e=>{let{worktree:t}=te(e,"git.pr.generateDescription");return{title:`${t.branch} (mock)`,body:`Generated description for '${t.branch}' (mock).`}},"git.pr.create":e=>{let t=y(e,"git.pr.create");p(t.title,"title","git.pr.create");let n=++X;return{url:`${fs.replace(/\.git$/,"")}/pull/${n}`,method:"gh",prNumber:n}},"git.stage":e=>{let{worktree:t,record:n}=te(e,"git.stage"),i=n.stageAll===!0?[...t.unstaged,...t.untracked].map(o=>o.path):Me(n.paths,"paths","git.stage");for(let o of i)Ys(t,o,"git.stage");return{paths:i}},"git.unstage":e=>{let{worktree:t,record:n}=te(e,"git.unstage"),s=Me(n.paths,"paths","git.unstage");for(let i of s)zs(t,i,"git.unstage");return{paths:s}},"git.commit":e=>{let{worktree:t,record:n}=te(e,"git.commit"),s=p(n.message,"message","git.commit");if(t.staged.length===0)throw new l("BAD_REQUEST","git.commit: nothing staged to commit");let i=Be(),o=t.staged.map(m=>({path:m.path,status:m.status,additions:m.status==="D"?0:1,deletions:m.status==="D"?1:0}));N.unshift({hash:i,shortHash:Ve(i),subject:s,body:"",author:w?.name??"Mock User",date:new Date().toISOString(),files:o});let u=I.get(t.branch);return u&&(u.head=i),t.staged=[],{hash:i,message:s}},"git.generateCommitMessage":e=>{let{worktree:t}=te(e,"git.generateCommitMessage"),n=t.staged.length;if(n===0)throw new l("BAD_REQUEST","git.generateCommitMessage: nothing staged to summarize");return{message:`Update ${n} file${n===1?"":"s"} (mock)`}},"git.checkout":e=>{let{worktree:t,record:n}=te(e,"git.checkout"),s=p(n.branch,"branch","git.checkout"),i=t.branch;if(n.create===!0){if(I.has(s))throw new l("BAD_REQUEST",`git.checkout: branch '${s}' already exists`);let o=n.startPoint===void 0?void 0:p(n.startPoint,"startPoint","git.checkout"),u=I.get(o??i);if(o!==void 0&&!u)throw new l("BAD_REQUEST",`git.checkout: unknown startPoint '${o}'`);I.set(s,{name:s,head:u?.head??N[0]?.hash??Be(),isRemote:!1})}else if(!I.has(s))throw new l("BAD_REQUEST",`git.checkout: unknown branch '${s}'`);return t.branch=s,Mt(t),{branch:s,previous:i}},"git.push":e=>{let{worktree:t,record:n}=te(e,"git.push"),s=n.setUpstream===!0,i=I.get(t.branch);return i&&s&&(i.upstream=`origin/${t.branch}`),{output:`Pushed '${t.branch}' to origin (mock)`,upstream:i?.upstream}},"git.pull":e=>(te(e,"git.pull"),{output:"Already up to date (mock)"}),"git.subscribeBranchChanged":(e,t)=>(ne.add(t),{subscribed:!0}),"git.subscribeCommitSuggestion":(e,t)=>($e.add(t),{subscribed:!0}),"tools.register":(e,t)=>{let n=y(e,"tools.register"),s=n.tools;if(!Array.isArray(s)||s.length===0)throw new l("BAD_REQUEST","tools.register: tools must be a non-empty array");let i=n.profile;if(i!==void 0&&i!=="browser")throw new l("BAD_REQUEST",`tools.register: unknown profile '${String(i)}' (fail closed)`);let o=new Map;for(let u of s){let m=y(u,"tools.register"),b=p(m.name,"tools[].name","tools.register");if(b.length===0||b.includes("__"))throw new l("BAD_REQUEST",`tools.register: invalid tool name '${b}' \u2014 must be non-empty and contain no '__'`);if(o.has(b))throw new l("BAD_REQUEST",`tools.register: duplicate tool name '${b}'`);for(let Q of Ee.values())if(Q.tools.has(b))throw new l("BAD_REQUEST",`tools.register: '${b}' is already served by registration '${Q.requestId}'`);let T=p(m.description,"tools[].description","tools.register");if(typeof m.inputSchema!="object"||m.inputSchema===null||Array.isArray(m.inputSchema))throw new l("BAD_REQUEST",`tools.register: '${b}' needs an inputSchema object`);let D=m.timeoutMs;if(D!==void 0&&(typeof D!="number"||!Number.isInteger(D)||D<=0))throw new l("BAD_REQUEST",`tools.register: '${b}' timeoutMs must be a positive integer`);o.set(b,{name:b,description:T,inputSchema:m.inputSchema,timeoutMs:D})}return Ee.set(t,{requestId:t,tools:o,profile:i}),d.tools?.onRegister?.(Xs),{registered:!0}},"tools.result":e=>{let t=y(e,"tools.result"),n=p(t.callId,"callId","tools.result"),s;if(t.ok===!1){let o=y(t.error,"tools.result");s=new l(p(o.code,"error.code","tools.result"),p(o.message,"error.message","tools.result"))}else if(t.ok!==!0)throw new l("BAD_REQUEST","tools.result: 'ok' must be a boolean");let i=ct(n);return i&&(s?i.fail(s):i.settle(t.result)),null},"quality.state":()=>{let e=wt;return wt=[],{directories:un.map(t=>({...t})),reports:Object.fromEntries([...we].map(([t,n])=>[t,ut(n)])),history:yt.map(t=>({...t})),activeOperations:[...be.values()].map(t=>({kind:t.kind,path:t.path,startedAt:t.startedAt,...t.kind==="reviewing"&&t.sessionId!==void 0?{sessionId:t.sessionId}:{}})),pendingResults:e.map(t=>t.kind==="scanResults"?{...t,report:ut(t.report)}:{...t,findings:_t(t.path,t.findings)}),schedules:Ae.map(ze)}},"quality.detectTools":e=>Ut(Pe(y(e,"quality.detectTools").path,"quality.detectTools")),"quality.result":(e,t)=>{let n=Pe(y(e,"quality.result").path,"quality.result"),s=be.get(n);if(s&&s.status==="running")return s.waiters.push(t),dt;let i=st.get(n);if(!i)throw new l("BAD_REQUEST",`quality.result: no run for path '${n}'`);return Hn(i)},"quality.settings":()=>({...me}),"quality.subscribeChanges":(e,t)=>(Ge.add(t),{subscribed:!0}),"quality.run":(e,t)=>{let n=Pe(y(e,"quality.run").path,"quality.run"),s=be.get(n);if(s)return s.requestIds.add(t),Qe.set(t,s),{path:n,attached:!0};let i=n===en?void 0:`quality-review-mock-${n}`,o={path:n,status:"running",kind:"scanning",startedAt:new Date().toISOString(),requestIds:new Set([t]),steps:sr(Date.now(),i),waiters:[],...i===void 0?{}:{sessionId:i}};return be.set(n,o),Qe.set(t,o),V(()=>Jn(o)),{path:n,attached:!1}},"quality.cancel":e=>{let t=Pe(y(e,"quality.cancel").path,"quality.cancel"),n=be.get(t);return n&&ir(n),null},"quality.installTools":e=>{let t=y(e,"quality.installTools"),n=Pe(t.path,"quality.installTools");if(be.has(n))throw new l("OPERATION_IN_PROGRESS",`quality.installTools: an operation already holds '${n}'`);let s=Ut(n),i=t.tools===void 0?s.tools.filter(m=>!m.installed).map(m=>m.name):Me(t.tools,"tools","quality.installTools"),o=Zn(n);for(let m of i){if(!s.tools.some(b=>b.name===m))throw new l("BAD_REQUEST",`quality.installTools: unknown tool '${m}' for '${n}'`);o.add(m)}let u=Ut(n);return Se({kind:"tools",path:n,tools:u.tools,ecosystem:u.ecosystem}),u},"quality.saveDirectories":e=>{let t=y(e,"quality.saveDirectories").directories;if(!Array.isArray(t))throw new l("BAD_REQUEST","quality.saveDirectories: directories must be an array");let n=t.map(s=>{let i=y(s,"quality.saveDirectories");return{path:Pe(i.path,"quality.saveDirectories"),label:p(i.label,"directories[].label","quality.saveDirectories")}});return un=n,Se({kind:"directories",directories:n.map(s=>({...s}))}),null},"quality.setSettings":e=>{let t=y(e,"quality.setSettings");if(t.engine!==void 0&&(me.engine=p(t.engine,"engine","quality.setSettings")),t.model!==void 0&&(me.model=p(t.model,"model","quality.setSettings")),t.effortLevel!==void 0&&(me.effortLevel=p(t.effortLevel,"effortLevel","quality.setSettings")),t.fastMode!==void 0){if(typeof t.fastMode!="boolean")throw new l("BAD_REQUEST","quality.setSettings: 'fastMode' must be a boolean");me.fastMode=t.fastMode}if(t.agentNotes!==void 0){if(typeof t.agentNotes!="boolean")throw new l("BAD_REQUEST","quality.setSettings: agentNotes must be a boolean");me.agentNotes=t.agentNotes}return{...me}},"quality.schedules.list":()=>({schedules:Ae.map(ze)}),"quality.schedules.create":e=>{let t="quality.schedules.create",n=y(e,t),s=Pe(n.path,t),i=jn(n.timing,t);if(n.enabled!==void 0&&typeof n.enabled!="boolean")throw new l("BAD_REQUEST",`${t}: enabled must be a boolean when present`);let o=n.enabled!==!1,u=Date.now();dn+=1;let m={id:`qsched-mock${dn}`,createdAt:new Date(u).toISOString(),...typeof n.name=="string"?{name:n.name}:{},path:s,timing:i,enabled:o,nextFireAt:o?Yn(i,u):null,history:[]};return Ae.push(m),Gt(),ze(m)},"quality.schedules.update":e=>{let t="quality.schedules.update",n=y(e,t),s=zn(n.scheduleId,t),i=n.patch===void 0?{}:y(n.patch,t);if("path"in i)throw new l("BAD_REQUEST",`${t}: path is immutable \u2014 delete and re-create to move a schedule`);if(i.name!==void 0&&(s.name=p(i.name,"patch.name",t)),i.enabled!==void 0){if(typeof i.enabled!="boolean")throw new l("BAD_REQUEST",`${t}: patch.enabled must be a boolean`);s.enabled=i.enabled}return i.timing!==void 0&&(s.timing=jn(i.timing,t)),s.nextFireAt=s.enabled?Yn(s.timing,Date.now()):null,Gt(),ze(s)},"quality.schedules.delete":e=>{let t="quality.schedules.delete",n=zn(y(e,t).scheduleId,t);return Ae.splice(Ae.indexOf(n),1),Gt(),null},"quality.setFindingState":e=>{let t="quality.setFindingState",n=y(e,t);if(typeof n.path!="string"||n.path.trim()==="")throw new l("BAD_REQUEST",`${t}: path is required (a directory relative to the working directory)`);let s=n.path.trim();if(s.startsWith("/")||s.split("/").includes(".."))throw new l("BAD_REQUEST",`${t}: path '${s}' resolves outside the working directory`);let i=n.fingerprints;if(!Array.isArray(i)||i.length===0||i.some(B=>typeof B!="string"||B===""))throw new l("BAD_REQUEST",`${t}: fingerprints must be a non-empty array of non-empty strings`);if(i.length>ks)throw new l("BAD_REQUEST",`${t}: fingerprints holds ${i.length} entries; at most ${ks} per call`);let o=[...new Set(i)];if(n.state!=="dismissed"&&n.state!=="active")throw new l("BAD_REQUEST",`${t}: state must be 'dismissed' or 'active'`);let u=we.get(s);if(n.state==="active"){let B=0;for(let W of o)bt.delete(Dt(s,W))&&B++;return u&&Se({kind:"results",path:s,report:u}),{applied:B,dropped:0}}let m=typeof n.reason=="string"?n.reason.trim():"";if(m===""||m.length>Es)throw new l("BAD_REQUEST",`${t}: reason is required to dismiss (1\u2013${Es} characters after trimming)`);let b=new Map;for(let B of[...u?.findings??[],...u?.codeReview??[]])B.fingerprint!==void 0&&!b.has(B.fingerprint)&&b.set(B.fingerprint,B);let T=o.filter(B=>!b.has(B));if(!u||T.length>0)throw new l("BAD_REQUEST",`${t}: unknown fingerprint(s) for '${s}': ${T.join(", ")}`);let D=new Date().toISOString(),Q=0;for(let B of o){let W=b.get(B);W&&(bt.set(Dt(s,B),{fingerprint:B,path:s,reason:m,dismissedAt:D,title:W.title,file:W.file}),Q++)}return Se({kind:"results",path:s,report:u}),{applied:Q,dropped:0}}},gt=e=>typeof e=="object"&&e!==null&&!Array.isArray(e)?e:{},ar=(e,t)=>{if(Or.has(e)){let n=gt(t).path;return typeof n=="string"?cs(n):"files:app"}if(qr.has(e)){let n=gt(t).path;return typeof n=="string"?us(n):"files:app"}if(e==="files.uploadChunk"||e==="files.uploadStatus"||e==="files.uploadCancel"){let n=gt(t).uploadId;return typeof n=="string"?Z.get(n)?.scope??null:null}if(e==="files.downloadChunk"||e==="files.downloadCancel"){let n=gt(t).downloadId;return typeof n=="string"?ie.get(n)?.scope??null:null}return ds[e]},lr=e=>{let{requestId:t,method:n}=e,s=M[n];if(s!==void 0){We(t,{code:s,message:`mock: forced '${s}' for ${n} (MockConfig.errors)`});return}if(!Object.prototype.hasOwnProperty.call(ds,n)){We(t,{code:"SCOPE_DENIED",message:`mock: unknown method '${String(n)}' (fail closed)`});return}let i=ar(n,e.params);if(i!==null&&!C.has(i)){let o=C.size===0?"call connect() first":"not granted on connect";We(t,{code:"SCOPE_DENIED",message:`mock: ${n} requires scope '${i}' \u2014 ${o}`});return}try{let o=or[n](e.params,t);o!==dt&&rt(t,o)}catch(o){o instanceof l?We(t,{code:o.code,message:o.message}):We(t,{code:"INTERNAL",message:`mock: ${n} handler threw (${String(o)})`})}};return{start(e){if(Ue)throw new Error("mock transport is closed");if(de)throw new Error("mock transport already started \u2014 create one transport per provider");de=e},send(e){if(!de)throw new Error("mock transport not started");if(Ue)throw new Error("mock transport is closed");lr(e)},close(){if(!Ue){Ue=!0;for(let e of Oe)clearTimeout(e);Oe.clear();for(let e of[...Ee.keys()])Pt(e);de?.onClose()}}}}function Is(d={}){return ve(ln(d))}var gi=5e3,pi=250,mi=6e4,fi=new Set(["connect","agents.result","notifications.request","quality.result","quality.installTools","inference.result"]),cn=d=>typeof d=="object"&&d!==null,hi=d=>cn(d)?d.type===Ft&&d.sdkVersion===1&&typeof d.nonce=="string"&&d.nonce.length>0:!1,yi=d=>cn(d)&&typeof d.code=="string"&&typeof d.message=="string",Fe=d=>{console.warn(`[@minionry/sdk] postMessage transport dropped a frame: ${d}`)},wi=(d,f)=>{let w,E=!1,M=new Map,A=R=>{let a=M.get(R);a!==void 0&&(clearTimeout(a),M.delete(R))},L=()=>{if(!E){E=!0;for(let R of M.values())clearTimeout(R);M.clear(),d.removeEventListener("close",L),d.onmessage=null,d.close(),w?.onClose()}};d.addEventListener("close",L);let C=R=>{if(E||!w)return;let a=R.data;if(cn(a))switch(a.type){case Wt:{if(typeof a.requestId!="string"){Fe("response frame without a string requestId");return}a.ok===!0?(A(a.requestId),w.onResponse({requestId:a.requestId,ok:!0,result:a.result})):a.ok===!1&&yi(a.error)?(A(a.requestId),w.onResponse({requestId:a.requestId,ok:!1,error:{code:a.error.code,message:a.error.message}})):Fe(`malformed response frame for requestId '${a.requestId}'`);return}case Kt:{if(typeof a.requestId!="string"||typeof a.event!="string"){Fe("malformed event frame");return}w.onEvent({requestId:a.requestId,event:a.event,payload:a.payload,...typeof a.seq=="number"?{seq:a.seq}:{}});return}case Ht:{if(typeof a.event!="string"){Fe("malformed notification frame");return}w.onNotification({event:a.event,payload:a.payload});return}case jt:{if(typeof a.callId!="string"||typeof a.requestId!="string"){Fe("tool-call frame without string callId/requestId");return}if(a.op==="cancel"){w.onToolCall?.({op:"cancel",callId:a.callId,requestId:a.requestId});return}if(a.op!=="call"||typeof a.tool!="string"){Fe(`malformed tool-call frame for callId '${a.callId}'`);return}w.onToolCall?.({op:"call",callId:a.callId,requestId:a.requestId,tool:a.tool,input:a.input});return}default:return}};return{start(R){if(E)throw new Error("postMessage transport is closed");if(w)throw new Error("postMessage transport already started \u2014 create one transport per provider");w=R,d.onmessage=C},send(R){if(E)throw new Error("postMessage transport is closed");if(!w)throw new Error("postMessage transport not started");let a={type:Lt,requestId:R.requestId,method:R.method};if(R.params!==void 0&&(a.params=R.params),d.postMessage(a),f>0&&!fi.has(R.method)){let{requestId:_,method:O}=R;M.set(_,setTimeout(()=>{M.delete(_),w?.onResponse({requestId:_,ok:!1,error:{code:"TIMEOUT",message:`${O} timed out after ${f}ms \u2014 no response from the Minionry host`}})},f))}},sendKeydown(R){if(E||!w)return;let a={type:Vt,code:R.code,key:R.key,altKey:R.altKey,ctrlKey:R.ctrlKey,metaKey:R.metaKey,shiftKey:R.shiftKey};R.isComposing&&(a.isComposing=!0),d.postMessage(a)},close(){L()}}};function tt(d={}){let f=d.hostOrigins?.length?[...d.hostOrigins]:null,w=d.timeoutMs??gi,E=d.announceIntervalMs??pi,M=d.requestTimeoutMs??mi,A=d.signal;return new Promise((L,C)=>{if(typeof window>"u"){C(new l("TIMEOUT","postMessage handshake requires a browser window (no window in this environment)"));return}if(A?.aborted){C(new l("TIMEOUT","postMessage handshake aborted before it started"));return}let R=window.parent,a=!1,_=null,O,Z,ie,q=()=>{window.removeEventListener("message",ge),A?.removeEventListener("abort",P),O!==void 0&&clearInterval(O),Z!==void 0&&clearTimeout(Z)},P=()=>{a||(a=!0,q(),ie!==void 0&&clearTimeout(ie),_!==null&&(_.port.close(),_=null),C(new l("TIMEOUT","postMessage handshake aborted by the caller before a host session was established")))},Ie=()=>{let H={type:Nt,sdkVersion:1};for(let re of f??["*"])try{R.postMessage(H,re)}catch{}},Te=()=>{if(ie=void 0,a||_===null)return;a=!0,q();let{nonce:H,port:re}=_;_=null;let ae={type:$t,nonce:H};try{re.postMessage(ae)}catch(r){re.close(),C(new l("SPACE_DISCONNECTED",`postMessage handshake failed: could not ack the host offer (${String(r)})`));return}L(wi(re,M))},ge=H=>{a||hi(H.data)&&H.source===R&&(f&&!f.includes(H.origin)||H.ports.length===1&&(_!==null&&_.port.close(),_={nonce:H.data.nonce,port:H.ports[0]},O!==void 0&&(clearInterval(O),O=void 0),ie??(ie=setTimeout(Te,0))))};window.addEventListener("message",ge),A?.addEventListener("abort",P),w>0&&(Z=setTimeout(()=>{a||_!==null||(a=!0,q(),ie!==void 0&&clearTimeout(ie),C(new l("TIMEOUT",`postMessage handshake timed out after ${w}ms \u2014 no Minionry host answered; is this page running inside a Minionry app frame?`)))},w)),Ie(),O=setInterval(Ie,E)})}async function Ts(d={}){let f=ve(await tt(d));return window.minionry=f,f}var bi=new Set(["text","search","url","tel","email","password","number","date","datetime-local","month","time","week"]);function Si(d){if(!d||typeof d.tagName!="string")return!1;let f=d;if(f.isContentEditable)return!0;let w=f.tagName;return w==="TEXTAREA"||w==="SELECT"?!0:w==="INPUT"?bi.has(f.type.toLowerCase()):!1}function As(d,f={}){if(typeof d.sendKeydown!="function")return()=>{};if(typeof document>"u")return()=>{};let w=f.target??document,E=M=>{let A=M;A.defaultPrevented||A.isComposing||A.keyCode===229||!(A.metaKey||A.ctrlKey||A.altKey)&&Si(A.target)||f.shouldKeep?.(A)||d.sendKeydown?.(A)};return w.addEventListener("keydown",E),()=>w.removeEventListener("keydown",E)}var ki=3e3;function Cs(d){let f=()=>{let w=Object.freeze({provider:d});window.dispatchEvent(new CustomEvent(Ze,{detail:w}))};return window.addEventListener(Xe,f),f(),()=>window.removeEventListener(Xe,f)}var Ei=d=>{let f=d.detail;if(typeof f!="object"||f===null)return null;let w=f.provider;return typeof w!="object"||w===null||typeof w.connect!="function"?null:w};function Ms(d={}){let f=d.timeout??ki;return new Promise(w=>{if(typeof window>"u"){w(null);return}let E=!1,M,A=new AbortController,L=R=>{E||(E=!0,window.removeEventListener(Ze,C),M!==void 0&&clearTimeout(M),A.abort(),w(R))},C=R=>{let a=Ei(R);a&&L(a)};window.addEventListener(Ze,C),window.dispatchEvent(new CustomEvent(Xe)),!E&&(tt({timeoutMs:f,hostOrigins:d.hostOrigins,requestTimeoutMs:d.requestTimeoutMs,signal:A.signal}).then(R=>{if(E){R.close();return}L(ve(R))}).catch(()=>{}),f>0&&(M=setTimeout(()=>L(null),f)))})}function xs(d,f={}){let w=f.prefix??"cache:",E=f.ttlMs,M=C=>typeof C=="object"&&C!==null&&"value"in C&&typeof C.updatedAt=="number",A=async C=>{let R;try{R=await d.get(w+C)}catch{return}if(M(R)){if(E!==void 0&&Date.now()-R.updatedAt>E){d.delete(w+C).catch(()=>{});return}return R}},L=async(C,R)=>{let a={value:R,updatedAt:Date.now()};try{return await d.set(w+C,a),a}catch{return}};return{get:A,set:async(C,R)=>{await L(C,R)},delete:async C=>{try{await d.delete(w+C)}catch{}},keys:async()=>{try{return(await d.keys()).filter(C=>C.startsWith(w)).map(C=>C.slice(w.length))}catch{return[]}},clear:async()=>{try{let C=(await d.keys()).filter(R=>R.startsWith(w));await Promise.all(C.map(R=>d.delete(R).catch(()=>{})))}catch{}},swr:async(C,R,a={})=>{let _=await A(C);if(_===void 0){let O=await R();return await L(C,O),O}return(async()=>{try{let O=await R(),Z=await L(C,O)??{value:O,updatedAt:Date.now()};a.onUpdate?.(O,Z)}catch(O){a.onError?.(O)}})(),_.value}}}var Ri="0.4.23",vi="1";return hr(Ii);})();
14
+ `,staged:r}},"git.show":e=>{let t=g(h(e,"git.show").hash,"hash","git.show"),n=it(t);if(!n)throw new l("BAD_REQUEST",`git.show: unknown commit '${t}'`);return{hash:n.hash,shortHash:n.shortHash,subject:n.subject,body:n.body,author:n.author,date:n.date,files:n.files.map(s=>({...s}))}},"git.commitDiff":e=>{let t=h(e,"git.commitDiff"),n=g(t.hash,"hash","git.commitDiff"),s=g(t.path,"path","git.commitDiff"),r=it(n);if(!r)throw new l("BAD_REQUEST",`git.commitDiff: unknown commit '${n}'`);if(!r.files.some(o=>o.path===s))throw new l("BAD_REQUEST",`git.commitDiff: '${s}' was not changed in commit '${n}'`);return{hash:r.hash,path:s,original:`// ${s} (mock) \u2014 before ${r.shortHash}
15
+ `,modified:`// ${s} (mock) \u2014 at ${r.shortHash}
16
+ `}},"git.branches.list":e=>{let{worktree:t}=ne(e,"git.branches.list");return{branches:[...q.values()].map(s=>{let r=it(s.head);return{name:s.name,shortHash:r?.shortHash??rt(s.head),isRemote:s.isRemote,isCurrent:s.name===t.branch,upstream:s.upstream,lastCommitDate:r?.date,ahead:0,behind:0}}),current:t.branch}},"git.branches.create":e=>{let{worktree:t,record:n}=ne(e,"git.branches.create"),s=g(n.name,"name","git.branches.create");if(q.has(s))throw new l("BAD_REQUEST",`git.branches.create: branch '${s}' already exists`);let r=n.startPoint===void 0?void 0:g(n.startPoint,"startPoint","git.branches.create"),o;if(r===void 0)o=q.get(t.branch)?.head??te[0]?.hash??Ge();else if(o=q.get(r)?.head??it(r)?.hash??"",!o)throw new l("BAD_REQUEST",`git.branches.create: unknown startPoint '${r}'`);return q.set(s,{name:s,head:o,isRemote:!1}),n.checkout===!0&&(t.branch=s,en(t)),{name:s,hash:o}},"git.branches.delete":e=>{let{record:t}=ne(e,"git.branches.delete"),n=g(t.name,"name","git.branches.delete");if(!q.has(n))throw new l("BAD_REQUEST",`git.branches.delete: unknown branch '${n}'`);let s=t.force===!0;if([...X.values()].some(o=>o.branch===n)&&!s)throw new l("BAD_REQUEST",`git.branches.delete: '${n}' is checked out in a worktree \u2014 pass force to delete anyway`);return q.delete(n),null},"git.tags.list":()=>({tags:[...ge.values()].map(e=>({name:e.name,shortHash:rt(e.hash),date:e.date,message:e.message}))}),"git.tags.create":e=>{let{worktree:t,record:n}=ne(e,"git.tags.create"),s=g(n.name,"name","git.tags.create");if(ge.has(s))throw new l("BAD_REQUEST",`git.tags.create: tag '${s}' already exists`);let r=n.commit===void 0?void 0:g(n.commit,"commit","git.tags.create"),o=r===void 0?q.get(t.branch)?.head:it(r)?.hash??q.get(r)?.head;if(!o)throw new l("BAD_REQUEST",`git.tags.create: unknown commit '${r}'`);let c=n.message===void 0?"":g(n.message,"message","git.tags.create");return ge.set(s,{name:s,hash:o,message:c,date:new Date().toISOString()}),{name:s,hash:o}},"git.tags.push":e=>{let t=h(e,"git.tags.push"),n=t.name===void 0||t.name===null?void 0:g(t.name,"name","git.tags.push"),s=t.all===!0;if(!s&&n===void 0)throw new l("BAD_REQUEST","git.tags.push: pass a name or all: true");if(n!==void 0&&!ge.has(n))throw new l("BAD_REQUEST",`git.tags.push: unknown tag '${n}'`);return{name:n??"*",output:`Pushed ${s?"all tags":`tag '${n}'`} to origin (mock)`}},"git.remote.info":e=>{let{worktree:t}=ne(e,"git.remote.info");return{hasRemote:!0,remoteUrl:Vs,provider:"github",defaultBranch:Fe,currentBranch:t.branch,hasGhCli:!0,ghCliAuthenticated:!0,ghCliBinary:"gh",remoteBranches:[...q.keys()],preferredBaseBranch:Fe}},"git.repos.discover":()=>({repos:[{path:Ye,name:"mock-repo",branch:X.get(Ye)?.branch}],rootIsGitRepo:!0}),"git.worktrees.list":()=>Ss(),"git.worktrees.create":e=>{let t=h(e,"git.worktrees.create"),n=g(t.branchName,"branchName","git.worktrees.create"),s=t.baseBranch===void 0?void 0:g(t.baseBranch,"baseBranch","git.worktrees.create"),r=t.path===void 0?`/workspace-worktrees/${n}`:g(t.path,"path","git.worktrees.create");if(X.has(r))throw new l("BAD_REQUEST",`git.worktrees.create: '${r}' already has a worktree`);let o=q.get(n);if(!o){if(s!==void 0&&!q.has(s))throw new l("BAD_REQUEST",`git.worktrees.create: unknown baseBranch '${s}'`);let d=q.get(s??Fe);o={name:n,head:d?.head??te[0]?.hash??Ge(),isRemote:!1},q.set(n,o)}let c={path:r,branch:n,isMain:!1,staged:[],unstaged:[],untracked:[]};return X.set(r,c),t.assign===!0&&(ye=r),Jt(),{path:r,branch:n,head:o.head}},"git.worktrees.remove":e=>{let t=h(e,"git.worktrees.remove"),n=g(t.path,"path","git.worktrees.remove"),s=X.get(n);if(!s)throw new l("BAD_REQUEST",`git.worktrees.remove: unknown worktree '${n}'`);if(s.isMain)throw new l("BAD_REQUEST","git.worktrees.remove: the main worktree cannot be removed");return X.delete(n),ye===n&&(ye=null),t.deleteBranch===!0&&q.delete(s.branch),Jt(),null},"git.worktrees.switchActive":e=>{let t=h(e,"git.worktrees.switchActive"),n=t.path===void 0||t.path===null?null:g(t.path,"path","git.worktrees.switchActive");if(n!==null&&!X.has(n))throw new l("BAD_REQUEST",`git.worktrees.switchActive: unknown worktree '${n}'`);ye=n;let s=X.get(n??Ye);return Jt(),s&&en(s),{path:ye,branch:s?.branch??null}},"git.worktrees.subscribe":(e,t)=>(be.add(t),{subscribed:!0}),"git.merge.preview":e=>{let t=h(e,"git.merge.preview"),n=g(t.sourceBranch,"sourceBranch","git.merge.preview"),s=g(t.targetBranch,"targetBranch","git.merge.preview");if(!q.has(n))throw new l("BAD_REQUEST",`git.merge.preview: unknown sourceBranch '${n}'`);if(!q.has(s))throw new l("BAD_REQUEST",`git.merge.preview: unknown targetBranch '${s}'`);return{clean:!0,conflicts:[],stat:"0 files changed (mock)",commits:[],ahead:0}},"git.merge.run":e=>{let t=h(e,"git.merge.run"),n=g(t.sourceBranch,"sourceBranch","git.merge.run"),s=g(t.targetBranch,"targetBranch","git.merge.run"),r=t.strategy;if(r!=="merge"&&r!=="squash"&&r!=="rebase")throw new l("BAD_REQUEST","git.merge.run: strategy must be 'merge', 'squash', or 'rebase'");if(!q.has(n))throw new l("BAD_REQUEST",`git.merge.run: unknown sourceBranch '${n}'`);let o=q.get(s);if(!o)throw new l("BAD_REQUEST",`git.merge.run: unknown targetBranch '${s}'`);let c=t.commitMessage===void 0?`Merge '${n}' into '${s}' (mock)`:g(t.commitMessage,"commitMessage","git.merge.run"),d=Ge();return te.unshift({hash:d,shortHash:rt(d),subject:c,body:"",author:b?.name??"Mock User",date:new Date().toISOString(),files:[]}),o.head=d,{success:!0,mergeCommit:d}},"git.merge.abort":()=>({aborted:!0}),"git.merge.complete":()=>({success:!0,mergeCommit:te[0]?.hash??Ge()}),"git.merge.stashPop":e=>{let t=h(e,"git.merge.stashPop");return g(t.stashSha,"stashSha","git.merge.stashPop"),{success:!0}},"git.merge.discardBlockers":e=>{let t=h(e,"git.merge.discardBlockers");return{success:!0,paths:Qe(t.paths,"paths","git.merge.discardBlockers")}},"git.pr.generateDescription":e=>{let{worktree:t}=ne(e,"git.pr.generateDescription");return{title:`${t.branch} (mock)`,body:`Generated description for '${t.branch}' (mock).`}},"git.pr.create":e=>{let t=h(e,"git.pr.create");g(t.title,"title","git.pr.create");let n=++z;return{url:`${Vs.replace(/\.git$/,"")}/pull/${n}`,method:"gh",prNumber:n}},"git.stage":e=>{let{worktree:t,record:n}=ne(e,"git.stage"),r=n.stageAll===!0?[...t.unstaged,...t.untracked].map(o=>o.path):Qe(n.paths,"paths","git.stage");for(let o of r)Dr(t,o,"git.stage");return{paths:r}},"git.unstage":e=>{let{worktree:t,record:n}=ne(e,"git.unstage"),s=Qe(n.paths,"paths","git.unstage");for(let r of s)Qr(t,r,"git.unstage");return{paths:s}},"git.commit":e=>{let{worktree:t,record:n}=ne(e,"git.commit"),s=g(n.message,"message","git.commit");if(t.staged.length===0)throw new l("BAD_REQUEST","git.commit: nothing staged to commit");let r=Ge(),o=t.staged.map(d=>({path:d.path,status:d.status,additions:d.status==="D"?0:1,deletions:d.status==="D"?1:0}));te.unshift({hash:r,shortHash:rt(r),subject:s,body:"",author:b?.name??"Mock User",date:new Date().toISOString(),files:o});let c=q.get(t.branch);return c&&(c.head=r),t.staged=[],{hash:r,message:s}},"git.generateCommitMessage":e=>{let{worktree:t}=ne(e,"git.generateCommitMessage"),n=t.staged.length;if(n===0)throw new l("BAD_REQUEST","git.generateCommitMessage: nothing staged to summarize");return{message:`Update ${n} file${n===1?"":"s"} (mock)`}},"git.checkout":e=>{let{worktree:t,record:n}=ne(e,"git.checkout"),s=g(n.branch,"branch","git.checkout"),r=t.branch;if(n.create===!0){if(q.has(s))throw new l("BAD_REQUEST",`git.checkout: branch '${s}' already exists`);let o=n.startPoint===void 0?void 0:g(n.startPoint,"startPoint","git.checkout"),c=q.get(o??r);if(o!==void 0&&!c)throw new l("BAD_REQUEST",`git.checkout: unknown startPoint '${o}'`);q.set(s,{name:s,head:c?.head??te[0]?.hash??Ge(),isRemote:!1})}else if(!q.has(s))throw new l("BAD_REQUEST",`git.checkout: unknown branch '${s}'`);return t.branch=s,en(t),{branch:s,previous:r}},"git.push":e=>{let{worktree:t,record:n}=ne(e,"git.push"),s=n.setUpstream===!0,r=q.get(t.branch);return r&&s&&(r.upstream=`origin/${t.branch}`),{output:`Pushed '${t.branch}' to origin (mock)`,upstream:r?.upstream}},"git.pull":e=>(ne(e,"git.pull"),{output:"Already up to date (mock)"}),"git.subscribeBranchChanged":(e,t)=>(Ie.add(t),{subscribed:!0}),"git.subscribeCommitSuggestion":(e,t)=>(Un.add(t),{subscribed:!0}),"tools.register":(e,t)=>{let n=h(e,"tools.register"),s=n.tools;if(!Array.isArray(s)||s.length===0)throw new l("BAD_REQUEST","tools.register: tools must be a non-empty array");let r=n.profile;if(r!==void 0&&r!=="browser")throw new l("BAD_REQUEST",`tools.register: unknown profile '${String(r)}' (fail closed)`);let o=new Map;for(let c of s){let d=h(c,"tools.register"),f=g(d.name,"tools[].name","tools.register");if(f.length===0||f.includes("__"))throw new l("BAD_REQUEST",`tools.register: invalid tool name '${f}' \u2014 must be non-empty and contain no '__'`);if(o.has(f))throw new l("BAD_REQUEST",`tools.register: duplicate tool name '${f}'`);for(let P of Te.values())if(P.tools.has(f))throw new l("BAD_REQUEST",`tools.register: '${f}' is already served by registration '${P.requestId}'`);let k=g(d.description,"tools[].description","tools.register");if(typeof d.inputSchema!="object"||d.inputSchema===null||Array.isArray(d.inputSchema))throw new l("BAD_REQUEST",`tools.register: '${f}' needs an inputSchema object`);let x=d.timeoutMs;if(x!==void 0&&(typeof x!="number"||!Number.isInteger(x)||x<=0))throw new l("BAD_REQUEST",`tools.register: '${f}' timeoutMs must be a positive integer`);o.set(f,{name:f,description:k,inputSchema:d.inputSchema,timeoutMs:x})}return Te.set(t,{requestId:t,tools:o,profile:r}),p.tools?.onRegister?.(Or),{registered:!0}},"tools.result":e=>{let t=h(e,"tools.result"),n=g(t.callId,"callId","tools.result"),s;if(t.ok===!1){let o=h(t.error,"tools.result");s=new l(g(o.code,"error.code","tools.result"),g(o.message,"error.message","tools.result"))}else if(t.ok!==!0)throw new l("BAD_REQUEST","tools.result: 'ok' must be a boolean");let r=vt(n);return r&&(s?r.fail(s):r.settle(t.result)),null},"quality.state":()=>{let e=Qt;return Qt=[],{directories:On.map(t=>({...t})),reports:Object.fromEntries([...Se].map(([t,n])=>[t,It(n)])),history:Dt.map(t=>({...t})),activeOperations:[...ke.values()].map(t=>({kind:t.kind,path:t.path,startedAt:t.startedAt,...t.kind==="reviewing"&&t.sessionId!==void 0?{sessionId:t.sessionId}:{}})),pendingResults:e.map(t=>t.kind==="scanResults"?{...t,report:It(t.report)}:{...t,findings:on(t.path,t.findings)}),schedules:Be.map(ot)}},"quality.detectTools":e=>ln(qe(h(e,"quality.detectTools").path,"quality.detectTools")),"quality.result":(e,t)=>{let n=qe(h(e,"quality.result").path,"quality.result"),s=ke.get(n);if(s&&s.status==="running")return s.waiters.push(t),Tt;let r=ft.get(n);if(!r)throw new l("BAD_REQUEST",`quality.result: no run for path '${n}'`);return Ts(r)},"quality.settings":()=>({...me}),"quality.subscribeChanges":(e,t)=>(We.add(t),{subscribed:!0}),"quality.run":(e,t)=>{let n=qe(h(e,"quality.run").path,"quality.run"),s=ke.get(n);if(s)return s.requestIds.add(t),Le.set(t,s),{path:n,attached:!0};let r=n===Tn?void 0:`quality-review-mock-${n}`,o={path:n,status:"running",kind:"scanning",startedAt:new Date().toISOString(),requestIds:new Set([t]),steps:Nr(Date.now(),r),waiters:[],...r===void 0?{}:{sessionId:r}};return ke.set(n,o),Le.set(t,o),J(()=>_s(o)),{path:n,attached:!1}},"quality.cancel":e=>{let t=qe(h(e,"quality.cancel").path,"quality.cancel"),n=ke.get(t);return n&&Fr(n),null},"quality.installTools":e=>{let t=h(e,"quality.installTools"),n=qe(t.path,"quality.installTools");if(ke.has(n))throw new l("OPERATION_IN_PROGRESS",`quality.installTools: an operation already holds '${n}'`);let s=ln(n),r=t.tools===void 0?s.tools.filter(d=>!d.installed).map(d=>d.name):Qe(t.tools,"tools","quality.installTools"),o=xs(n);for(let d of r){if(!s.tools.some(f=>f.name===d))throw new l("BAD_REQUEST",`quality.installTools: unknown tool '${d}' for '${n}'`);o.add(d)}let c=ln(n);return Ee({kind:"tools",path:n,tools:c.tools,ecosystem:c.ecosystem}),c},"quality.saveDirectories":e=>{let t=h(e,"quality.saveDirectories").directories;if(!Array.isArray(t))throw new l("BAD_REQUEST","quality.saveDirectories: directories must be an array");let n=t.map(s=>{let r=h(s,"quality.saveDirectories");return{path:qe(r.path,"quality.saveDirectories"),label:g(r.label,"directories[].label","quality.saveDirectories")}});return On=n,Ee({kind:"directories",directories:n.map(s=>({...s}))}),null},"quality.setSettings":e=>{let t=h(e,"quality.setSettings");if(t.engine!==void 0&&(me.engine=g(t.engine,"engine","quality.setSettings")),t.model!==void 0&&(me.model=g(t.model,"model","quality.setSettings")),t.effortLevel!==void 0&&(me.effortLevel=g(t.effortLevel,"effortLevel","quality.setSettings")),t.fastMode!==void 0){if(typeof t.fastMode!="boolean")throw new l("BAD_REQUEST","quality.setSettings: 'fastMode' must be a boolean");me.fastMode=t.fastMode}if(t.agentNotes!==void 0){if(typeof t.agentNotes!="boolean")throw new l("BAD_REQUEST","quality.setSettings: agentNotes must be a boolean");me.agentNotes=t.agentNotes}return{...me}},"quality.schedules.list":()=>({schedules:Be.map(ot)}),"quality.schedules.create":e=>{let t="quality.schedules.create",n=h(e,t),s=qe(n.path,t),r=As(n.timing,t);if(n.enabled!==void 0&&typeof n.enabled!="boolean")throw new l("BAD_REQUEST",`${t}: enabled must be a boolean when present`);let o=n.enabled!==!1,c=Date.now();Gn+=1;let d={id:`qsched-mock${Gn}`,createdAt:new Date(c).toISOString(),...typeof n.name=="string"?{name:n.name}:{},path:s,timing:r,enabled:o,nextFireAt:o?Cs(r,c):null,history:[]};return Be.push(d),an(),ot(d)},"quality.schedules.update":e=>{let t="quality.schedules.update",n=h(e,t),s=Ms(n.scheduleId,t),r=n.patch===void 0?{}:h(n.patch,t);if("path"in r)throw new l("BAD_REQUEST",`${t}: path is immutable \u2014 delete and re-create to move a schedule`);if(r.name!==void 0&&(s.name=g(r.name,"patch.name",t)),r.enabled!==void 0){if(typeof r.enabled!="boolean")throw new l("BAD_REQUEST",`${t}: patch.enabled must be a boolean`);s.enabled=r.enabled}return r.timing!==void 0&&(s.timing=As(r.timing,t)),s.nextFireAt=s.enabled?Cs(s.timing,Date.now()):null,an(),ot(s)},"quality.schedules.delete":e=>{let t="quality.schedules.delete",n=Ms(h(e,t).scheduleId,t);return Be.splice(Be.indexOf(n),1),an(),null},"quality.setFindingState":e=>{let t="quality.setFindingState",n=h(e,t);if(typeof n.path!="string"||n.path.trim()==="")throw new l("BAD_REQUEST",`${t}: path is required (a directory relative to the working directory)`);let s=n.path.trim();if(s.startsWith("/")||s.split("/").includes(".."))throw new l("BAD_REQUEST",`${t}: path '${s}' resolves outside the working directory`);let r=n.fingerprints;if(!Array.isArray(r)||r.length===0||r.some(T=>typeof T!="string"||T===""))throw new l("BAD_REQUEST",`${t}: fingerprints must be a non-empty array of non-empty strings`);if(r.length>er)throw new l("BAD_REQUEST",`${t}: fingerprints holds ${r.length} entries; at most ${er} per call`);let o=[...new Set(r)];if(n.state!=="dismissed"&&n.state!=="active")throw new l("BAD_REQUEST",`${t}: state must be 'dismissed' or 'active'`);let c=Se.get(s);if(n.state==="active"){let T=0;for(let O of o)Ut.delete(rn(s,O))&&T++;return c&&Ee({kind:"results",path:s,report:c}),{applied:T,dropped:0}}let d=typeof n.reason=="string"?n.reason.trim():"";if(d===""||d.length>tr)throw new l("BAD_REQUEST",`${t}: reason is required to dismiss (1\u2013${tr} characters after trimming)`);let f=new Map;for(let T of[...c?.findings??[],...c?.codeReview??[]])T.fingerprint!==void 0&&!f.has(T.fingerprint)&&f.set(T.fingerprint,T);let k=o.filter(T=>!f.has(T));if(!c||k.length>0)throw new l("BAD_REQUEST",`${t}: unknown fingerprint(s) for '${s}': ${k.join(", ")}`);let x=new Date().toISOString(),P=0;for(let T of o){let O=f.get(T);O&&(Ut.set(rn(s,T),{fingerprint:T,path:s,reason:d,dismissedAt:x,title:O.title,file:O.file}),P++)}return Ee({kind:"results",path:s,report:c}),{applied:P,dropped:0}}},Ne=e=>typeof e=="object"&&e!==null&&!Array.isArray(e)?e:{},Wr=(e,t)=>{if(Ai.has(e)){let n=Ne(t).path;return typeof n=="string"?$s(n):"files:app"}if(Ci.has(e)){let n=Ne(t).path;return typeof n=="string"?Fs(n):"files:app"}if(e==="files.uploadChunk"||e==="files.uploadStatus"||e==="files.uploadCancel"){let n=Ne(t).uploadId;return typeof n=="string"?ae.get(n)?.scope??null:null}if(e==="files.downloadChunk"||e==="files.downloadCancel"){let n=Ne(t).downloadId;return typeof n=="string"?j.get(n)?.scope??null:null}return Ls[e]},Kr=(e,t)=>{let n=Wr(e,t),s=n===null?[]:[n],r=Ne(t);return e==="agents.schedules.create"||e==="agents.schedules.update"?(r.promptFile!==void 0||Ne(r.patch).promptFile!==void 0)&&s.push("files:workspace:read"):e==="pm.schedules.create"&&Ne(r.source).kind==="board-zip"&&s.push("files:workspace:read"),s},Hr=e=>{let{requestId:t,method:n}=e,s=M[n];if(s!==void 0){Je(t,{code:s,message:`mock: forced '${s}' for ${n} (MockConfig.errors)`});return}if(!Object.prototype.hasOwnProperty.call(Ls,n)){Je(t,{code:"SCOPE_DENIED",message:`mock: unknown method '${String(n)}' (fail closed)`});return}let r=Kr(n,e.params).find(o=>!A.has(o));if(r!==void 0){let o=A.size===0?"call connect() first":"not granted on connect";Je(t,{code:"SCOPE_DENIED",message:`mock: ${n} requires scope '${r}' \u2014 ${o}`});return}try{let o=Lr[n](e.params,t);o!==Tt&&ht(t,o)}catch(o){o instanceof l?Je(t,{code:o.code,message:o.message}):Je(t,{code:"INTERNAL",message:`mock: ${n} handler threw (${String(o)})`})}};return{start(e){if(Ke)throw new Error("mock transport is closed");if(ue)throw new Error("mock transport already started \u2014 create one transport per provider");ue=e},send(e){if(!ue)throw new Error("mock transport not started");if(Ke)throw new Error("mock transport is closed");Hr(e)},close(){if(!Ke){Ke=!0;for(let e of He)clearTimeout(e);He.clear();for(let e of[...Te.keys()])sn(e);ue?.onClose()}}}}function or(p={}){return Ae(Dn(p))}var so=5e3,ro=250,io=6e4,oo=new Set(["connect","agents.result","notifications.request","quality.result","quality.installTools","inference.result"]),Qn=p=>typeof p=="object"&&p!==null,ao=p=>Qn(p)?p.type===pn&&p.sdkVersion===1&&typeof p.nonce=="string"&&p.nonce.length>0:!1,lo=p=>Qn(p)&&typeof p.code=="string"&&typeof p.message=="string",ze=p=>{console.warn(`[@minionry/sdk] postMessage transport dropped a frame: ${p}`)},co=(p,y)=>{let b,R=!1,M=new Map,C=I=>{let a=M.get(I);a!==void 0&&(clearTimeout(a),M.delete(I))},K=()=>{if(!R){R=!0;for(let I of M.values())clearTimeout(I);M.clear(),p.removeEventListener("close",K),p.onmessage=null,p.close(),b?.onClose()}};p.addEventListener("close",K);let A=I=>{if(R||!b)return;let a=I.data;if(Qn(a))switch(a.type){case fn:{if(typeof a.requestId!="string"){ze("response frame without a string requestId");return}a.ok===!0?(C(a.requestId),b.onResponse({requestId:a.requestId,ok:!0,result:a.result})):a.ok===!1&&lo(a.error)?(C(a.requestId),b.onResponse({requestId:a.requestId,ok:!1,error:{code:a.error.code,message:a.error.message}})):ze(`malformed response frame for requestId '${a.requestId}'`);return}case hn:{if(typeof a.requestId!="string"||typeof a.event!="string"){ze("malformed event frame");return}b.onEvent({requestId:a.requestId,event:a.event,payload:a.payload,...typeof a.seq=="number"?{seq:a.seq}:{}});return}case wn:{if(typeof a.event!="string"){ze("malformed notification frame");return}b.onNotification({event:a.event,payload:a.payload});return}case yn:{if(typeof a.callId!="string"||typeof a.requestId!="string"){ze("tool-call frame without string callId/requestId");return}if(a.op==="cancel"){b.onToolCall?.({op:"cancel",callId:a.callId,requestId:a.requestId});return}if(a.op!=="call"||typeof a.tool!="string"){ze(`malformed tool-call frame for callId '${a.callId}'`);return}b.onToolCall?.({op:"call",callId:a.callId,requestId:a.requestId,tool:a.tool,input:a.input});return}default:return}};return{start(I){if(R)throw new Error("postMessage transport is closed");if(b)throw new Error("postMessage transport already started \u2014 create one transport per provider");b=I,p.onmessage=A},send(I){if(R)throw new Error("postMessage transport is closed");if(!b)throw new Error("postMessage transport not started");let a={type:mn,requestId:I.requestId,method:I.method};if(I.params!==void 0&&(a.params=I.params),p.postMessage(a),y>0&&!oo.has(I.method)){let{requestId:Q,method:N}=I;M.set(Q,setTimeout(()=>{M.delete(Q),b?.onResponse({requestId:Q,ok:!1,error:{code:"TIMEOUT",message:`${N} timed out after ${y}ms \u2014 no response from the Minionry host`}})},y))}},sendKeydown(I){if(R||!b)return;let a={type:bn,code:I.code,key:I.key,altKey:I.altKey,ctrlKey:I.ctrlKey,metaKey:I.metaKey,shiftKey:I.shiftKey};I.isComposing&&(a.isComposing=!0),p.postMessage(a)},close(){K()}}};function gt(p={}){let y=p.hostOrigins?.length?[...p.hostOrigins]:null,b=p.timeoutMs??so,R=p.announceIntervalMs??ro,M=p.requestTimeoutMs??io,C=p.signal;return new Promise((K,A)=>{if(typeof window>"u"){A(new l("TIMEOUT","postMessage handshake requires a browser window (no window in this environment)"));return}if(C?.aborted){A(new l("TIMEOUT","postMessage handshake aborted before it started"));return}let I=window.parent,a=!1,Q=null,N,$,re,ae=()=>{window.removeEventListener("message",Me),C?.removeEventListener("abort",j),N!==void 0&&clearInterval(N),$!==void 0&&clearTimeout($)},j=()=>{a||(a=!0,ae(),re!==void 0&&clearTimeout(re),Q!==null&&(Q.port.close(),Q=null),A(new l("TIMEOUT","postMessage handshake aborted by the caller before a host session was established")))},B=()=>{let ee={type:dn,sdkVersion:1};for(let le of y??["*"])try{I.postMessage(ee,le)}catch{}},Ce=()=>{if(re=void 0,a||Q===null)return;a=!0,ae();let{nonce:ee,port:le}=Q;Q=null;let ce={type:gn,nonce:ee};try{le.postMessage(ce)}catch(Re){le.close(),A(new l("SPACE_DISCONNECTED",`postMessage handshake failed: could not ack the host offer (${String(Re)})`));return}K(co(le,M))},Me=ee=>{a||ao(ee.data)&&ee.source===I&&(y&&!y.includes(ee.origin)||ee.ports.length===1&&(Q!==null&&Q.port.close(),Q={nonce:ee.data.nonce,port:ee.ports[0]},N!==void 0&&(clearInterval(N),N=void 0),re??(re=setTimeout(Ce,0))))};window.addEventListener("message",Me),C?.addEventListener("abort",j),b>0&&($=setTimeout(()=>{a||Q!==null||(a=!0,ae(),re!==void 0&&clearTimeout(re),A(new l("TIMEOUT",`postMessage handshake timed out after ${b}ms \u2014 no Minionry host answered; is this page running inside a Minionry app frame?`)))},b)),B(),N=setInterval(B,R)})}async function ar(p={}){let y=Ae(await gt(p));return window.minionry=y,y}var uo=new Set(["text","search","url","tel","email","password","number","date","datetime-local","month","time","week"]);function po(p){if(!p||typeof p.tagName!="string")return!1;let y=p;if(y.isContentEditable)return!0;let b=y.tagName;return b==="TEXTAREA"||b==="SELECT"?!0:b==="INPUT"?uo.has(y.type.toLowerCase()):!1}function lr(p,y={}){if(typeof p.sendKeydown!="function")return()=>{};if(typeof document>"u")return()=>{};let b=y.target??document,R=M=>{let C=M;C.defaultPrevented||C.isComposing||C.keyCode===229||!(C.metaKey||C.ctrlKey||C.altKey)&&po(C.target)||y.shouldKeep?.(C)||p.sendKeydown?.(C)};return b.addEventListener("keydown",R),()=>b.removeEventListener("keydown",R)}var go=3e3;function cr(p){let y=()=>{let b=Object.freeze({provider:p});window.dispatchEvent(new CustomEvent(at,{detail:b}))};return window.addEventListener(lt,y),y(),()=>window.removeEventListener(lt,y)}var mo=p=>{let y=p.detail;if(typeof y!="object"||y===null)return null;let b=y.provider;return typeof b!="object"||b===null||typeof b.connect!="function"?null:b};function ur(p={}){let y=p.timeout??go;return new Promise(b=>{if(typeof window>"u"){b(null);return}let R=!1,M,C=new AbortController,K=I=>{R||(R=!0,window.removeEventListener(at,A),M!==void 0&&clearTimeout(M),C.abort(),b(I))},A=I=>{let a=mo(I);a&&K(a)};window.addEventListener(at,A),window.dispatchEvent(new CustomEvent(lt)),!R&&(gt({timeoutMs:y,hostOrigins:p.hostOrigins,requestTimeoutMs:p.requestTimeoutMs,signal:C.signal}).then(I=>{if(R){I.close();return}K(Ae(I))}).catch(()=>{}),y>0&&(M=setTimeout(()=>K(null),y)))})}function dr(p,y={}){let b=y.prefix??"cache:",R=y.ttlMs,M=A=>typeof A=="object"&&A!==null&&"value"in A&&typeof A.updatedAt=="number",C=async A=>{let I;try{I=await p.get(b+A)}catch{return}if(M(I)){if(R!==void 0&&Date.now()-I.updatedAt>R){p.delete(b+A).catch(()=>{});return}return I}},K=async(A,I)=>{let a={value:I,updatedAt:Date.now()};try{return await p.set(b+A,a),a}catch{return}};return{get:C,set:async(A,I)=>{await K(A,I)},delete:async A=>{try{await p.delete(b+A)}catch{}},keys:async()=>{try{return(await p.keys()).filter(A=>A.startsWith(b)).map(A=>A.slice(b.length))}catch{return[]}},clear:async()=>{try{let A=(await p.keys()).filter(I=>I.startsWith(b));await Promise.all(A.map(I=>p.delete(I).catch(()=>{})))}catch{}},swr:async(A,I,a={})=>{let Q=await C(A);if(Q===void 0){let N=await I();return await K(A,N),N}return(async()=>{try{let N=await I(),$=await K(A,N)??{value:N,updatedAt:Date.now()};a.onUpdate?.(N,$)}catch(N){a.onError?.(N)}})(),Q.value}}}var fo="0.5.2",ho="1";return Jr(wo);})();