diffact 0.1.0 → 0.2.0
This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
- package/dist/cli.mjs +2 -0
- package/dist/index-node-bKTmbwGt.mjs +1 -0
- package/dist/src-CPKE75x0.mjs +11 -0
- package/dist/src-Ceryd8j5.mjs +1 -0
- package/package.json +4 -5
- package/web/dist/assets/{code-block-37QAKDTI-C97XC0lL.js → code-block-37QAKDTI-yDNOZoY4.js} +1 -1
- package/web/dist/assets/{index-DWCfDth4.js → index-BlaXWu6U.js} +30 -30
- package/web/dist/assets/index-DMEToi1s.css +1 -0
- package/web/dist/index.html +2 -2
- package/dist/agent-manager.d.ts +0 -32
- package/dist/agent-manager.js +0 -502
- package/dist/app-server-client.d.ts +0 -38
- package/dist/app-server-client.js +0 -249
- package/dist/capabilities.d.ts +0 -2
- package/dist/capabilities.js +0 -27
- package/dist/cli.d.ts +0 -6
- package/dist/cli.js +0 -13
- package/dist/command-runner.d.ts +0 -83
- package/dist/command-runner.js +0 -427
- package/dist/editors.d.ts +0 -26
- package/dist/editors.js +0 -144
- package/dist/gh.d.ts +0 -61
- package/dist/gh.js +0 -185
- package/dist/git.d.ts +0 -57
- package/dist/git.js +0 -482
- package/dist/http.d.ts +0 -7
- package/dist/http.js +0 -98
- package/dist/index-node.d.ts +0 -5
- package/dist/index-node.js +0 -51
- package/dist/index.d.ts +0 -6
- package/dist/index.js +0 -1011
- package/dist/list-directories.d.ts +0 -8
- package/dist/list-directories.js +0 -32
- package/dist/log.d.ts +0 -2
- package/dist/log.js +0 -2
- package/dist/open-browser.d.ts +0 -5
- package/dist/open-browser.js +0 -23
- package/dist/project-commands.d.ts +0 -17
- package/dist/project-commands.js +0 -152
- package/dist/project-path.d.ts +0 -5
- package/dist/project-path.js +0 -33
- package/dist/runtime.d.ts +0 -65
- package/dist/runtime.js +0 -235
- package/dist/static.d.ts +0 -10
- package/dist/static.js +0 -127
- package/dist/types.d.ts +0 -17
- package/dist/types.js +0 -1
- package/dist/utils.d.ts +0 -3
- package/dist/utils.js +0 -26
- package/dist/ws-hub.d.ts +0 -20
- package/dist/ws-hub.js +0 -123
- package/web/dist/assets/index-CRDz04kv.css +0 -1
package/dist/cli.mjs
ADDED
|
@@ -0,0 +1 @@
|
|
|
1
|
+
import{a as e,i as t,n,o as r,r as i,s as a,t as o}from"./src-CPKE75x0.mjs";import{serve as s}from"@hono/node-server";import{WebSocketServer as c}from"ws";const l=process.argv.includes(`--no-open`);new c({server:s({fetch:n.fetch,port:o})}).on(`connection`,e=>{a.info(`ws open (node)`);let t=i.open(),n={send:t=>e.send(t),close:()=>e.close(),binaryType:`arraybuffer`,readyState:1,url:``,protocol:``};e.on(`message`,e=>{let r=typeof e==`string`?e:e.toString(`utf8`);t.onMessage?.({data:r},n)}),e.on(`close`,(e,r)=>{t.onClose?.({code:e,reason:r.toString(`utf8`)},n)}),e.on(`error`,e=>{a.error({err:e},`ws error (node)`)}),t.onOpen?.({},n)});const u=`http://localhost:${o}`;a.info(`diffact server (node) listening on ${u}`),e()&&a.info(`serving static files from ${t()}`),!l&&e()&&r(u);export{};
|
|
@@ -0,0 +1,11 @@
|
|
|
1
|
+
import{createRequire as e}from"node:module";import t,{access as n,constants as r}from"node:fs/promises";import i from"node:os";import a from"node:path";import{Hono as o}from"hono";import{logger as s}from"hono/logger";import{execFile as c,execSync as l,spawn as u}from"node:child_process";import d from"pino";import f,{randomUUID as p}from"node:crypto";import m from"node:fs";import{promisify as h}from"node:util";import{fileURLToPath as ee}from"node:url";var g=e(import.meta.url);const _=d({level:process.env.LOG_LEVEL||`info`}),v=`[app-server]`,y=(e,t)=>{if(t){_.info({detail:t},`${v} ${e}`);return}_.info(`${v} ${e}`)};var b=class{#e;#t;#n=null;#r=new Map;#i=1;#a=null;#o=null;#s;#c;#l;#u=!1;#d=``;constructor(e){this.#e=e.command??`codex`,this.#t=e.args??[`app-server`],this.#s=e.onNotification,this.#c=e.onRequest,this.#l=e.onClose}async connect(){return this.#a||=new Promise((e,t)=>{y(`connect:start`,{command:this.#e});let n=u(this.#e,this.#t,{stdio:[`pipe`,`pipe`,`pipe`]});this.#n=n;let r=!1,i=()=>{n.removeListener(`spawn`,a),n.removeListener(`error`,o)},a=()=>{r||(r=!0,i(),y(`connect:ready`),e())},o=()=>{if(r)return;r=!0,i();let e=Error(`app_server_spawn_failed`);this.#a=null,this.#n=null,y(`connect:error`,{error:e.message}),t(e),this.#l&&this.#l(e)};n.on(`spawn`,a),n.on(`error`,o),n.stdout.on(`data`,e=>{this.#m(e)}),n.stderr.on(`data`,()=>{}),n.on(`exit`,(e,t)=>{let n=Error(`app_server_closed`);for(let e of this.#r.values())e.reject(n);this.#r.clear(),this.#a=null,this.#o=null,this.#u=!1,this.#d=``,this.#n=null,y(`connect:closed`,{code:e,signal:t}),this.#l&&this.#l(n)})}),this.#a}async initialize(e){if(!this.#u){if(this.#o)return this.#o;this.#o=(async()=>{await this.connect(),y(`initialize:start`),await this.request(`initialize`,{clientInfo:{name:e.name,title:e.title??null,version:e.version}}),this.notify(`initialized`),this.#u=!0,y(`initialize:done`)})();try{await this.#o}finally{this.#o=null}}}async request(e,t){await this.connect();let n=this.#i++,r={id:n,method:e,params:t},i=this.#n?.stdin;if(!i||!i.writable)throw Error(`app_server_not_connected`);return new Promise((t,a)=>{this.#r.set(n,{method:e,resolve:t,reject:a}),y(`request:out`,{id:n,method:e}),i.write(`${JSON.stringify(r)}\n`)})}notify(e,t){let n=this.#n?.stdin;if(!n||!n.writable)return;let r={method:e,params:t};y(`notify:out`,{method:e}),n.write(`${JSON.stringify(r)}\n`)}close(){this.#n&&this.#n.kill()}async#f(e){if(e.method){if(e.id!==void 0){y(`request:in`,{id:e.id,method:e.method});let t={id:e.id,method:e.method,params:e.params},n=null;this.#c&&(n=await this.#c(t)),y(`response:out`,{id:t.id,method:t.method}),this.#p(t.id,n);return}this.#s&&(y(`notification:in`,{message:e}),this.#s({method:e.method,params:e.params}));return}if(e.id===void 0)return;let t=this.#r.get(e.id);if(t){if(this.#r.delete(e.id),e.error){y(`response:error`,{id:e.id,method:t.method});let n=e.error&&typeof e.error==`object`&&`message`in e.error?e.error.message:null;t.reject(Error(typeof n==`string`?n:`app_server_error`));return}if(e.result!==void 0){y(`response:in`,{id:e.id,method:t.method}),t.resolve(e.result);return}y(`response:in`,{id:e.id,method:t.method}),t.resolve(e)}}#p(e,t){let n=this.#n?.stdin;!n||!n.writable||n.write(`${JSON.stringify({id:e,result:t})}\n`)}#m(e){this.#d+=e.toString(`utf8`);let t=this.#d.indexOf(`
|
|
2
|
+
`);for(;t!==-1;){let e=this.#d.slice(0,t).trim();if(this.#d=this.#d.slice(t+1),!e){t=this.#d.indexOf(`
|
|
3
|
+
`);continue}let n=null;try{n=JSON.parse(e)}catch{t=this.#d.indexOf(`
|
|
4
|
+
`);continue}if(!n||typeof n!=`object`){t=this.#d.indexOf(`
|
|
5
|
+
`);continue}this.#f(n),t=this.#d.indexOf(`
|
|
6
|
+
`)}}};async function x(e){let n=a.resolve(e),r;try{r=await t.stat(n)}catch(e){throw e&&typeof e==`object`&&`code`in e&&e.code===`ENOENT`?Error(`invalid_path`):e}if(!r.isDirectory())throw Error(`not_a_directory`);let i=a.join(n,`.git`);return{rootPath:n,isGit:await t.stat(i).then(()=>!0).catch(e=>{if(e&&typeof e==`object`&&`code`in e&&e.code===`ENOENT`)return!1;throw e})}}function S(){return typeof f.randomUUID==`function`?f.randomUUID():`${Date.now().toString(36)}-${Math.random().toString(36).slice(2,10)}`}const C=()=>process.env.CODEX_APPROVAL_POLICY?.trim()||`on-request`,w=()=>process.env.CODEX_SANDBOX_MODE?.trim()||`workspace-write`,T=e=>{if(!e||typeof e!=`object`)return null;let t=e,n=t.turn;if(n&&typeof n==`object`&&`id`in n){let e=n.id;return typeof e==`string`?e:null}if(`turnId`in t){let e=t.turnId;return typeof e==`string`?e:null}return null},E=e=>{if(!e||typeof e!=`object`)return null;let t=e;if(`threadId`in t){let e=t.threadId;return typeof e==`string`?e:null}let n=t.thread;if(n&&typeof n==`object`&&`id`in n){let e=n.id;return typeof e==`string`?e:null}return null},te=e=>{if(!e||typeof e!=`object`)return null;let t=e.error;if(t&&typeof t==`object`&&`message`in t){let e=t.message;return typeof e==`string`?e:null}return null},ne=`project:`,re=e=>{if(!e||typeof e!=`object`)return{data:[],nextCursor:null};let t=e;return{data:Array.isArray(t.data)?t.data.filter(e=>!!e&&typeof e==`object`):[],nextCursor:typeof t.nextCursor==`string`?t.nextCursor:null}},ie=e=>{if(!e||!e.startsWith(ne))return null;let t=e.slice(8);try{let e=Buffer.from(t,`base64`).toString(`utf8`),n=JSON.parse(e);if(!n||typeof n!=`object`)return null;let r=n;return{upstreamCursor:typeof r.upstreamCursor==`string`?r.upstreamCursor:null,buffered:Array.isArray(r.buffered)?r.buffered.filter(e=>!!e&&typeof e==`object`):[]}}catch{return null}},ae=e=>`${ne}${Buffer.from(JSON.stringify(e)).toString(`base64`)}`;var oe=class{#e;#t=new Map;#n=new Map;#r;constructor(e){this.#e=e.hub,this.#r=new b({onNotification:e=>{this.#i(e)},onRequest:async e=>this.#s(e),onClose:e=>{this.#o(e)}})}listAgents(){return Array.from(this.#t.values()).map(e=>this.#c(e))}async listThreads(e){if(await this.#r.initialize({name:`diffact`,title:`diffact`,version:`0.1.0`}),!e.projectPath)return this.#r.request(`thread/list`,{cursor:e.cursor??null,limit:e.limit??null,modelProviders:null});let t=e.limit??null,n=ie(e.cursor??null),r=n?.upstreamCursor??e.cursor??null,i=(n?.buffered??[]).filter(t=>t.cwd===e.projectPath);if(t!==null&&t<=0)return{data:[],nextCursor:null};if(t===null){let t=re(await this.#r.request(`thread/list`,{cursor:r,limit:null,modelProviders:null}));return{data:t.data.filter(t=>t.cwd===e.projectPath),nextCursor:t.nextCursor}}if(i.length>=t){let e=i.slice(t);return{data:i.slice(0,t),nextCursor:e.length?ae({upstreamCursor:r,buffered:e}):r}}let a=i.slice(),o=new Set;for(;;){let n=re(await this.#r.request(`thread/list`,{cursor:r,limit:t,modelProviders:null}));if(a.push(...n.data.filter(t=>t.cwd===e.projectPath)),a.length>=t){let e=a.slice(t);return{data:a.slice(0,t),nextCursor:e.length?ae({upstreamCursor:n.nextCursor??null,buffered:e}):n.nextCursor??null}}if(!n.nextCursor)return{data:a,nextCursor:null};if(o.has(n.nextCursor))return{data:a,nextCursor:n.nextCursor};o.add(n.nextCursor),r=n.nextCursor}}getAgent(e){let t=this.#t.get(e);return t?this.#c(t):null}async resumeThread(e){let t=this.#n.get(e.threadId);if(t)return this.#c(t);let n=S(),r=new Date().toISOString(),i={id:n,label:e.label||`thread-${e.threadId.slice(0,6)}`,status:`completed`,createdAt:r,projectPath:e.projectPath,threadId:e.threadId,lastError:void 0,exitCode:null,signal:null,stoppedByUser:!1,activeTurnId:null};this.#t.set(n,i),this.#n.set(e.threadId,i),this.#e.send(`agent_status`,this.#c(i));try{await this.#r.initialize({name:`diffact`,title:`diffact`,version:`0.1.0`});let t=E(await this.#r.request(`thread/resume`,{threadId:e.threadId}));t&&t!==e.threadId&&(i.threadId=t,this.#n.set(t,i))}catch(e){i.status=`error`,i.lastError=e instanceof Error?e.message:`app_server_error`,this.#e.send(`agent_status`,this.#c(i))}return this.#c(i)}async startAgent(e){let t=await x(e.projectPath),n=S(),r=new Date().toISOString(),i={id:n,label:e.label||`agent-${n.slice(0,6)}`,status:`starting`,createdAt:r,projectPath:t.rootPath,threadId:null,lastError:void 0,exitCode:null,signal:null,stoppedByUser:!1,activeTurnId:null};this.#t.set(n,i),this.#e.send(`agent_status`,this.#c(i));try{await this.#r.initialize({name:`diffact`,title:`diffact`,version:`0.1.0`});let n=E(await this.#r.request(`thread/start`,{model:null,modelProvider:null,cwd:t.rootPath,approvalPolicy:C(),sandbox:w(),config:null,baseInstructions:null,developerInstructions:null,experimentalRawEvents:!1}));if(!n)throw Error(`app_server_thread_start_failed`);i.threadId=n,this.#n.set(n,i),this.#e.send(`agent_status`,this.#c(i)),await this.#r.request(`turn/start`,{threadId:i.threadId,input:[{type:`text`,text:e.prompt}],cwd:null,approvalPolicy:null,sandboxPolicy:null,model:null,effort:null,summary:null,outputSchema:null})}catch(e){i.status=`error`,i.lastError=e instanceof Error?e.message:`app_server_error`,this.#e.send(`agent_status`,this.#c(i))}return this.#c(i)}async startThread(e){let t=await x(e.projectPath),n=S(),r=new Date().toISOString(),i={id:n,label:e.label||`thread-${n.slice(0,6)}`,status:`starting`,createdAt:r,projectPath:t.rootPath,threadId:null,lastError:void 0,exitCode:null,signal:null,stoppedByUser:!1,activeTurnId:null};this.#t.set(n,i),this.#e.send(`agent_status`,this.#c(i));try{await this.#r.initialize({name:`diffact`,title:`diffact`,version:`0.1.0`});let e=E(await this.#r.request(`thread/start`,{model:null,modelProvider:null,cwd:t.rootPath,approvalPolicy:C(),sandbox:w(),config:null,baseInstructions:null,developerInstructions:null,experimentalRawEvents:!1}));if(!e)throw Error(`app_server_thread_start_failed`);i.threadId=e,i.status=`completed`,this.#n.set(e,i),this.#e.send(`agent_status`,this.#c(i))}catch(e){i.status=`error`,i.lastError=e instanceof Error?e.message:`app_server_error`,this.#e.send(`agent_status`,this.#c(i))}return this.#c(i)}stopAgent(e){let t=this.#t.get(e);return t?(t.stoppedByUser=!0,t.status=`stopped`,t.threadId&&t.activeTurnId&&this.#r.request(`turn/interrupt`,{threadId:t.threadId,turnId:t.activeTurnId}).catch(()=>{}),t.threadId&&this.#n.delete(t.threadId),this.#e.send(`agent_status`,this.#c(t)),!0):!1}stopThread(e){let t=this.#n.get(e);return t?this.stopAgent(t.id):!1}async sendMessage(e,t){let n=this.#t.get(e);if(!n||!n.threadId)return!1;n.status=`running`,n.lastError=void 0,this.#e.send(`agent_status`,this.#c(n));try{await this.#r.initialize({name:`diffact`,title:`diffact`,version:`0.1.0`}),await this.#r.request(`turn/start`,{threadId:n.threadId,input:[{type:`text`,text:t}],cwd:null,approvalPolicy:null,sandboxPolicy:null,model:null,effort:null,summary:null,outputSchema:null})}catch(e){n.status=`error`,n.lastError=e instanceof Error?e.message:`app_server_error`,this.#e.send(`agent_status`,this.#c(n))}return!0}#i(e){let t=E(e.params);if(t){let n=this.#n.get(t);n&&!n.stoppedByUser&&this.#a(n,e);return}for(let t of this.#t.values())t.stoppedByUser||this.#a(t,e)}#a(e,t){let n=!1;if(t.method===`thread/started`){let r=E(t.params);r&&(e.threadId=r,this.#n.set(r,e),n=!0)}t.method===`turn/started`&&(e.status=`running`,e.activeTurnId=T(t.params),n=!0),t.method===`turn/completed`&&(e.status=`completed`,e.activeTurnId=null,n=!0),t.method===`error`&&(e.status=`error`,e.lastError=te(t.params)||`turn_error`,n=!0),n&&this.#e.send(`agent_status`,this.#c(e)),this.#e.send(`agent_event`,{projectPath:e.projectPath,threadId:e.threadId,event:t})}#o(e){this.#n.clear();for(let t of this.#t.values())t.stoppedByUser||(t.status=`error`,t.lastError=e?.message||`app_server_closed`,t.activeTurnId=null,this.#e.send(`agent_status`,this.#c(t)))}async#s(e){return e.method===`item/commandExecution/requestApproval`||e.method===`item/fileChange/requestApproval`?{decision:`accept`}:e.method===`applyPatchApproval`||e.method===`execCommandApproval`?{decision:`approved`}:null}#c(e){return{id:e.id,label:e.label,status:e.status,createdAt:e.createdAt,projectPath:e.projectPath,threadId:e.threadId??null,lastError:e.lastError,exitCode:e.exitCode??null,signal:e.signal??null}}};const D=globalThis.Bun!==void 0,se=!D;let ce=null;function le(){if(!ce)try{ce=g(`node-pty`)}catch{throw Error(`node-pty is required for terminal support in Node.js. Install it with: npm install node-pty`)}return ce}var ue=class{pty=null;cols;rows;dataCallback;encoder=new TextEncoder;constructor(e){this.cols=e.cols,this.rows=e.rows,this.dataCallback=e.data}ensurePty(){if(this.pty)return this.pty;let e=le(),t=process.env.SHELL||`/bin/sh`;return this.pty=e.spawn(t,[],{name:`xterm-256color`,cols:this.cols,rows:this.rows,cwd:process.cwd(),env:process.env}),this.pty.onData(e=>{this.dataCallback(this,this.encoder.encode(e))}),this.pty}resize(e,t){this.cols=e,this.rows=t,this.pty?.resize(e,t)}write(e){let t=this.ensurePty();typeof e==`string`?t.write(e):t.write(new TextDecoder().decode(e))}};const O={name:D?`bun`:`node`,version:D?Bun.version:process.version,isBun:D,isNode:se,which(e){if(D)return Bun.which(e);try{return l(`which ${e}`,{encoding:`utf8`,stdio:[`pipe`,`pipe`,`ignore`]}).trim()||null}catch{return null}},file(e){if(D)return Bun.file(e);let t=m.statSync(e),n=a.extname(e).toLowerCase();return{stream(){let t=m.createReadStream(e);return new ReadableStream({start(e){t.on(`data`,t=>{e.enqueue(new Uint8Array(t))}),t.on(`end`,()=>{e.close()}),t.on(`error`,t=>{e.error(t)})},cancel(){t.destroy()}})},size:t.size,type:{".html":`text/html`,".css":`text/css`,".js":`application/javascript`,".json":`application/json`,".png":`image/png`,".jpg":`image/jpeg`,".jpeg":`image/jpeg`,".gif":`image/gif`,".svg":`image/svg+xml`,".txt":`text/plain`}[n]||`application/octet-stream`}},createTerminal(e){return D?new Bun.Terminal({cols:e.cols,rows:e.rows,data:e.data}):new ue(e)},spawn(e,t={}){if(D){let n=t.onExit?(e,n,r,i)=>{t.onExit?.(e,n,r===null?null:String(r),i)}:void 0,r={cwd:t.cwd,env:t.env,onExit:n};return t.terminal&&(r.terminal=t.terminal),Bun.spawn(e,r)}let n=e[0];if(!n)throw Error(`Command array must not be empty`);let r=u(n,e.slice(1),{cwd:t.cwd,env:t.env,stdio:[`pipe`,`pipe`,`pipe`]}),i=null,a=null,o=new Promise(e=>{r.on(`exit`,(n,o)=>{i=n,a=o,t.onExit?.(r,n,o,void 0),e(n??1)}),r.on(`error`,n=>{t.onExit?.(r,null,null,n),e(1)})}),s=e=>e?new ReadableStream({start(t){e.on(`data`,e=>{t.enqueue(new Uint8Array(e))}),e.on(`end`,()=>t.close()),e.on(`error`,e=>t.error(e))}}):null;return{exited:o,get exitCode(){return i},get signalCode(){return a},stdout:s(r.stdout),stderr:s(r.stderr),kill:e=>r.kill(e)}}};async function de(){let e=O.which(`gh`);if(!e)return!1;try{return await O.spawn([e,`auth`,`status`,`--hostname`,`github.com`],{}).exited===0}catch{return!1}}async function fe(e){let t=e?await x(e).catch(()=>null):null,n=await de();return{diffReview:!0,git:t?t.isGit:!1,github:n}}const k=new Map,A=a.join(i.tmpdir(),`diffact-command-output`),j=new Map;let pe=null;const me=(e,t)=>t?`stopped`:e===0?`completed`:`failed`,he=e=>{let t=e.trim();return t?t.includes(`/`)?t:O.which(t)??t:``},ge=()=>{if(process.env.SHELL)return he(process.env.SHELL);try{let e=i.userInfo();if(e.shell)return he(e.shell)}catch{return``}return``},_e=e=>{let t=a.basename(e);return t===`bash`||t===`zsh`},M=(e,t)=>{let n=a.basename(e);return n===`bash`||n===`zsh`||n===`fish`||n===`sh`?[`-ilc`,t]:[`-ic`,t]},ve=e=>{let t={};for(let[n,r]of Object.entries(e))typeof r==`string`&&(t[n]=r);return t},ye=async()=>{pe||=t.mkdir(A,{recursive:!0}).then(()=>void 0),await pe},N=e=>`'${e.replace(/'/g,`'\\''`)}'`,be=e=>e.commandLine??[e.command,...e.args].map(N).join(` `),xe=(e,t,n,r)=>{let i=j.get(e)??[],a=i.find(e=>!e.busy);if(a)return a.busy=!0,a.onData=r,(a.cols!==t||a.rows!==n)&&(a.cols=t,a.rows=n,a.terminal.resize(t,n)),a;let o={id:p(),terminal:null,busy:!0,cols:t,rows:n,onData:r};return o.terminal=O.createTerminal({cols:t,rows:n,data:(e,t)=>{o.onData?.(t)}}),i.push(o),j.set(e,i),o},P=(e,t)=>{j.get(e)&&(t.busy=!1,t.onData=void 0)},Se=async e=>{if(!e)return null;try{return await t.readFile(e,`utf8`)}catch{return null}},Ce=()=>{let e=!1,t=null,n=new Promise(e=>{t=e}),r=n=>{e||(e=!0,t?.(n))};return{exitPromise:n,onExit:(e,t,n,i)=>{i&&_.error({err:i},`command run exit error`),r({exitCode:t??null,signal:n??null})},resolveOnce:r}},we=e=>{setTimeout(()=>{let n=k.get(e);n?.stdoutPath&&t.unlink(n.stdoutPath).catch(()=>void 0),n?.stderrPath&&t.unlink(n.stderrPath).catch(()=>void 0),k.delete(e)},3e5)},F=async e=>{let n=p(),r,i=``,o=``,s=null,c=``;try{let l=Date.now(),u={stdout:``,stderr:``,combined:``},d=new TextDecoder,f=(t,r)=>{r&&(t===`stdout`?u.stdout+=r:u.stderr+=r,u.combined+=r,e.listener?.onOutput?.({runId:n,stream:t,data:r}))},p=ge(),m=p||`/bin/sh`,h=be(e.plan),ee=ve({...process.env,...e.plan.env||{},SHELL:m,TERM:`xterm-256color`,FORCE_COLOR:`1`,CLICOLOR_FORCE:`1`}),g=e.plan.cwd||e.projectRoot;o=g;try{if(!(await t.stat(g)).isDirectory())throw Error(`invalid_cwd:${g}`)}catch(e){let t=e instanceof Error?e.message:`invalid_cwd:${g}`;throw Error(t)}let v=m,y=M(m,h),b,x,S=_e(m)?m:``;if(S){await ye(),b=a.join(A,`${n}.out`),x=a.join(A,`${n}.err`);let e=`set -o pipefail; ${h} > >(tee -a ${N(b)}) 2> >(tee -a ${N(x)} >&2)`;v=S,y=M(S,e)}let C=async()=>{let{exitPromise:r,onExit:a,resolveOnce:o}=Ce();i=v,_.info({runId:n,commandId:e.command.id,commandName:e.command.name,commandSource:e.command.source,projectRoot:e.projectRoot,cwd:g,file:v,args:y,defaultShell:p,shellPath:m,wrapperShell:S},`command run spawn`),v.includes(`/`)&&await t.access(v);let l=[v,...y],u=Math.max(2,Math.floor(e.terminal?.cols??120)),h=Math.max(1,Math.floor(e.terminal?.rows??30));s=xe(e.projectRoot,u,h,e=>{let t=d.decode(e,{stream:!0});t&&f(`stdout`,t)}),c=s.id;let b=O.spawn(l,{cwd:g,env:ee,terminal:s.terminal,onExit:a});return b.exited.then(e=>{o({exitCode:e??null,signal:b.signalCode?String(b.signalCode):null})}).catch(e=>{_.error({err:e,runId:n,file:i},`command run exit failed`),o({exitCode:null,signal:null})}),{process:b,exitPromise:r}},w;try{let e=await C();r=e.process,w=e.exitPromise}catch(t){if(s&&(P(e.projectRoot,s),s=null,c=``),!S)throw t;_.warn({err:t,runId:n,wrapperShell:S},`command run wrapper failed, retrying without wrapper`),S=``,v=m,y=M(m,h),b=void 0,x=void 0;let i=await C();r=i.process,w=i.exitPromise}let T={id:n,command:e.command,projectRoot:e.projectRoot,terminalId:c,status:`running`,exitCode:null,signal:null,startedAt:new Date(l).toISOString(),output:u,process:r,stdoutPath:b,stderrPath:x};k.set(n,T),e.listener?.onStatus?.(T);let E=async(t,r)=>{let i=d.decode();i&&f(`stdout`,i),T.exitCode=t,T.signal=r?String(r):null,T.status=me(t,T.signal),T.completedAt=new Date().toISOString();let[a,o]=await Promise.all([Se(b),Se(x)]);a!==null&&(T.output.stdout=a),o!==null&&(T.output.stderr=o),!b&&!x?!T.output.stdout&&!T.output.stderr&&(T.output.stdout=T.output.combined,T.output.stderr=``):!b&&!T.output.stdout&&(T.output.stdout=T.output.combined),we(n),e.listener?.onStatus?.(T),s&&=(P(e.projectRoot,s),null),_.info({runId:n,status:T.status,exitCode:T.exitCode,signal:T.signal},`command run exit`)};return w.then(({exitCode:e,signal:t})=>{E(e,t)}),{status:`running`,runId:n,exitCode:null,signal:null}}catch(t){s&&=(P(e.projectRoot,s),null);let r=t instanceof Error?t.message:`spawn_failed`,a=t,c=typeof a?.code==`string`||typeof a?.errno==`number`?`:code=${String(a.code??``)}:errno=${String(a.errno??``)}`:``;return _.error({err:t,runId:n,file:i,cwd:o},`command run failed`),{status:`failed`,runId:null,exitCode:null,signal:null,error:`command_spawn_failed:${r}${c}:file=${i}:cwd=${o}`}}},I=e=>k.get(e)??null,Te=e=>[...k.values()].filter(t=>t.projectRoot===e),Ee=e=>{let t=k.get(e);return t?{stdout:t.output.stdout,stderr:t.output.stderr,combined:t.output.combined}:null},De=e=>{let t=k.get(e);return t?t.status===`running`?(t.process.kill(`SIGTERM`),setTimeout(()=>{t.status===`running`&&t.process.kill(`SIGKILL`)},2e3),t):t:null},Oe=[{id:`vscode`,name:`VS Code`,commands:{darwin:[`/Applications/Visual Studio Code.app/Contents/Resources/app/bin/code`,`/usr/local/bin/code`,`/opt/homebrew/bin/code`],linux:[`/usr/bin/code`,`/usr/local/bin/code`,`/snap/bin/code`],win32:[`C:\\Program Files\\Microsoft VS Code\\bin\\code.cmd`,`C:\\Users\\%USERNAME%\\AppData\\Local\\Programs\\Microsoft VS Code\\bin\\code.cmd`]}},{id:`cursor`,name:`Cursor`,commands:{darwin:[`/Applications/Cursor.app/Contents/Resources/app/bin/cursor`,`/usr/local/bin/cursor`],linux:[`/usr/bin/cursor`,`/usr/local/bin/cursor`,`/opt/cursor/cursor`],win32:[`C:\\Program Files\\Cursor\\cursor.exe`,`C:\\Users\\%USERNAME%\\AppData\\Local\\Programs\\Cursor\\cursor.exe`]}},{id:`zed`,name:`Zed`,commands:{darwin:[`/Applications/Zed.app/Contents/MacOS/cli`,`/usr/local/bin/zed`],linux:[`/usr/bin/zed`,`/usr/local/bin/zed`,`~/.local/bin/zed`],win32:[]}}],ke=e=>e.startsWith(`~`)?a.join(i.homedir(),e.slice(1)):process.platform===`win32`&&e.includes(`%USERNAME%`)?e.replace(`%USERNAME%`,i.userInfo().username):e,Ae=async e=>{try{return await n(e,r.X_OK),!0}catch{return!1}},je=async e=>{for(let t of e){let e=ke(t);if(await Ae(e))return e}return null},Me=async()=>{let e=i.platform(),t=[];for(let n of Oe){let r=await je(n.commands[e]??[]);t.push({id:n.id,name:n.name,command:r??``,available:!!r})}return t},Ne=async e=>(await Me()).find(t=>t.id===e)??null,Pe=(e,t,n)=>{if(n.type===`project`)return[t];if(n.type===`file`){let r=a.join(t,n.filePath);return n.line&&n.line>0?e===`vscode`||e===`cursor`?[t,`--goto`,`${r}:${n.line}`]:[t,`${r}:${n.line}`]:[t,r]}return n.type===`diff`?[t,a.join(t,n.filePath)]:(n.type,[t])},Fe=async(e,t,n={type:`project`})=>{let r=await Ne(e);if(!r)return{success:!1,error:`editor_not_found`};if(!r.available)return{success:!1,error:`editor_not_installed`};let i=Pe(e,t,n);try{return O.spawn([r.command,...i]),{success:!0}}catch(e){return{success:!1,error:e instanceof Error?e.message:`spawn_failed`}}},L=h(c),R=1024*1024*20;async function Ie(e,t={}){let n=O.which(`gh`);if(!n)return _.warn({cwd:e},`gh CLI not found`),{available:!1,items:[],hasMore:!1,nextCursor:null,error:`GitHub CLI (gh) not found. Please install it.`};let r=t.limit??30,i=r+1;try{let a=[`pr`,`list`,`--state`,`open`,`--limit`,String(i),`--json`,`number,title,headRefName,updatedAt,author,url`];t.search&&a.push(`--search`,t.search);let{stdout:o}=await L(n,a,{cwd:e,maxBuffer:R}),s=JSON.parse(o),c=Array.isArray(s)?s.map(e=>({number:Number(e.number),title:String(e.title||``),headRefName:String(e.headRefName||``),updatedAt:String(e.updatedAt||``),author:e.author&&typeof e.author==`object`&&`login`in e.author?String(e.author.login||``):void 0,url:e.url?String(e.url):void 0})):[],l=c.length>r,u=l?c.slice(0,r):c;return{available:!0,items:u,hasMore:l,nextCursor:l?String(u[u.length-1]?.number):null}}catch(t){return _.error({err:t,cwd:e},`ghListPullRequests failed`),{available:!1,items:[],hasMore:!1,nextCursor:null,error:(t&&typeof t==`object`&&`stderr`in t?String(t.stderr).trim():``)||`Failed to list pull requests`}}}async function Le(e,t={}){let n=O.which(`gh`);if(!n)return{available:!1,items:[],hasMore:!1,nextCursor:null,error:`GitHub CLI (gh) not found. Please install it.`};let r=t.limit??30,i=r+1,a=t.state??`open`;try{let o=[`issue`,`list`,`--state`,a,`--limit`,String(i),`--json`,`number,title,state,updatedAt,author,url,labels`];t.search&&o.push(`--search`,t.search);let{stdout:s}=await L(n,o,{cwd:e,maxBuffer:R}),c=JSON.parse(s),l=Array.isArray(c)?c.map(e=>({number:Number(e.number),title:String(e.title||``),state:e.state===`CLOSED`?`closed`:`open`,updatedAt:String(e.updatedAt||``),author:e.author&&typeof e.author==`object`&&`login`in e.author?String(e.author.login||``):void 0,url:e.url?String(e.url):void 0,labels:Array.isArray(e.labels)?e.labels.map(e=>({name:String(e.name||``),color:String(e.color||``)})):[]})):[],u=l.length>r,d=u?l.slice(0,r):l;return{available:!0,items:d,hasMore:u,nextCursor:u?String(d[d.length-1]?.number):null}}catch(t){return _.error({err:t,cwd:e},`ghListIssues failed`),{available:!1,items:[],hasMore:!1,nextCursor:null,error:(t&&typeof t==`object`&&`stderr`in t?String(t.stderr).trim():``)||`Failed to list issues`}}}async function Re(e,t){let n=O.which(`gh`);if(!n)return null;try{let{stdout:r}=await L(n,[`issue`,`view`,String(t),`--json`,`number,title,body,state,author,url,labels,createdAt,updatedAt,comments`],{cwd:e,maxBuffer:R}),i=JSON.parse(r);return{number:Number(i.number),title:String(i.title||``),body:String(i.body||``),state:i.state===`CLOSED`?`closed`:`open`,author:i.author&&typeof i.author==`object`&&`login`in i.author?String(i.author.login||``):void 0,url:i.url?String(i.url):void 0,labels:Array.isArray(i.labels)?i.labels.map(e=>({name:String(e.name||``),color:String(e.color||``)})):[],createdAt:String(i.createdAt||``),updatedAt:String(i.updatedAt||``),commentsCount:Array.isArray(i.comments)?i.comments.length:0}}catch(n){return _.error({err:n,cwd:e,issueNumber:t},`ghGetIssueDetail failed`),null}}const ze=h(c),z=(e,t)=>ze(`git`,t,{cwd:e,maxBuffer:20971520}),Be=async(e,t)=>{try{return await z(e,t)}catch(e){if(e&&typeof e==`object`&&`stdout`in e){let t=e,n=e=>typeof e==`string`?e:e instanceof Buffer?e.toString(`utf8`):``;return{stdout:n(t.stdout),stderr:n(t.stderr)}}throw e}};async function Ve(e,t=[],n=[]){let r=[`diff`,`--no-color`,...t];n.length&&r.push(`--`,...n);let{stdout:i}=await z(e,r);if(t.some(e=>[`--cached`,`--staged`,`--index`].includes(e)))return i;let{stdout:a}=await z(e,[`ls-files`,`--others`,`--exclude-standard`,`-z`]),o=a.split(`\0`).map(e=>e.trim()).filter(Boolean),s=n.length?o.filter(e=>n.some(t=>e===t||e.startsWith(`${t}/`))):o;if(!s.length)return i;let c=[];for(let t of s){let{stdout:n}=await Be(e,[`diff`,`--no-color`,`--no-index`,`--`,`/dev/null`,t]);n&&c.push(n.trimEnd())}if(!c.length)return i;let l=[i.trimEnd(),...c].filter(Boolean).join(`
|
|
7
|
+
|
|
8
|
+
`);return l&&`${l}\n`}async function He(e){let{stdout:t}=await z(e,[`diff`,`--name-only`,`--cached`,`-z`]);return t.split(`\0`).map(e=>e.trim()).filter(Boolean)}async function Ue(e,t){t.length&&await z(e,[`add`,`-A`,`--`,...t])}const We=e=>{if(!e||typeof e!=`object`||!(`stderr`in e))return!1;let t=e,n=typeof t.stderr==`string`?t.stderr:t.stderr instanceof Buffer?t.stderr.toString(`utf8`):``;return n.includes(`ambiguous argument 'HEAD'`)||n.includes(`bad revision 'HEAD'`)||n.includes(`unknown revision or path`)};async function Ge(e,t){if(t.length)try{await z(e,[`reset`,`-q`,`HEAD`,`--`,...t])}catch(n){if(!We(n))throw n;await z(e,[`rm`,`-r`,`--cached`,`--`,...t])}}async function Ke(e,t,n){if(!t)throw Error(`invalid_ref`);if(!n)throw Error(`invalid_path`);let{stdout:r}=await z(e,[`show`,`${t}:${n}`]);return r}async function qe(e,t=0,n=50){let r=Number.isFinite(t)&&t>0?Math.floor(t):0,i=Number.isFinite(n)&&n>0?Math.floor(n):50,{stdout:a}=await z(e,[`log`,`--skip=${r}`,`-n`,`${i+1}`,`--format=%H%x1f%h%x1f%an%x1f%aI%x1f%s%x1f%b%x1e`]),o=a.split(``).map(e=>e.trim()).filter(Boolean).map(e=>{let[t,n,r,i,a,o]=e.split(``);return t?{sha:t,shortSha:n||t.slice(0,7),authorName:r||``,authoredAt:i||``,subject:a||``,description:o||``}:null}).filter(e=>!!e),s=o.length>i,c=o.slice(0,i);return{items:c,hasMore:s,nextSkip:r+c.length}}async function Je(e,t){if(!t)throw Error(`invalid_commit`);let{stdout:n}=await z(e,[`show`,`--no-color`,`--no-ext-diff`,`--format=`,t]);return n}function Ye(e,t){if(!t)throw Error(`invalid_commit`);let n=u(`git`,[`show`,`--no-color`,`--no-ext-diff`,`--format=`,t],{cwd:e});return new ReadableStream({start(e){let t=t=>{e.enqueue(t)},r=t=>{e.error(t)};n.stdout.on(`data`,t),n.stdout.on(`error`,r),n.on(`error`,r),n.on(`close`,t=>{if(t&&t!==0){e.error(Error(`git_failed`));return}e.close()})},cancel(){n.kill()}})}async function Xe(e,t){if(!t)throw Error(`invalid_commit`);let{stdout:n}=await z(e,[`show`,`--name-status`,`--no-ext-diff`,`--format=`,t]);return n.split(`
|
|
9
|
+
`).map(e=>e.trim()).filter(Boolean).map(e=>{let[t=``,...n]=e.split(` `),r=t[0]||``,i=r===`R`||r===`C`?n[1]||n[0]||``:n[0]||``,a=r===`R`&&n[0]||``,o={path:i,status:r===`A`?`added`:r===`D`?`deleted`:r===`R`?`renamed`:r===`C`?`added`:`modified`};return a&&a!==i&&(o.previousPath=a),o}).filter(e=>e.path)}async function Ze(e,t){if(!t)throw Error(`invalid_commit`);let{stdout:n}=await z(e,[`show`,`--numstat`,`--no-ext-diff`,`--format=`,t]),r=0;for(let e of n.split(`
|
|
10
|
+
`)){let t=e.trim();if(!t)continue;let[n,i]=t.split(` `);if(n===`-`||i===`-`)return null;let a=Number.parseInt(n||`0`,10),o=Number.parseInt(i||`0`,10);r+=(Number.isFinite(a)?a:0)+(Number.isFinite(o)?o:0)}return r}const Qe=e=>e.split(`\0`).filter(e=>e),$e=e=>{let t={name:``,path:``,type:`folder`,children:new Map};for(let n of e){let e=n.replace(/\\/g,`/`).replace(/^\/+/,``);if(!e)continue;let r=e.split(`/`).filter(e=>e),i=t,a=``;for(let[e,t]of r.entries()){let n=a?`${a}/${t}`:t,o=e===r.length-1?`file`:`folder`,s=i.children.get(t);s||(s={name:t,path:n,type:o,children:new Map},i.children.set(t,s)),i=s,a=n}}let n=e=>{if(e.type===`file`)return{name:e.name,path:e.path,type:e.type};let t=Array.from(e.children.values()).map(n);return t.sort((e,t)=>e.type===t.type?e.name.localeCompare(t.name):e.type===`folder`?-1:1),{name:e.name,path:e.path,type:e.type,children:t}};return Array.from(t.children.values()).map(n).sort((e,t)=>e.type===t.type?e.name.localeCompare(t.name):e.type===`folder`?-1:1)};async function et(e){let[t,n]=await Promise.all([z(e,[`ls-files`,`-z`]),z(e,[`ls-files`,`-z`,`--others`,`--exclude-standard`])]),r=new Set([...Qe(t.stdout),...Qe(n.stdout)]);return $e(Array.from(r))}async function tt(e,t={}){let{stdout:n}=await z(e,[`for-each-ref`,`--sort=-committerdate`,`--format=%(refname:short) %(committerdate:iso8601)`,`refs/heads`]),r=n.split(`
|
|
11
|
+
`).map(e=>e.trim()).filter(Boolean).map(e=>{let[t=``,n]=e.split(` `);return{name:t,updatedAt:n||null}});if(t.filter){let e=t.filter.toLowerCase();r=r.filter(t=>t.name.toLowerCase().includes(e))}if(t.cursor){let e=r.findIndex(e=>e.name===t.cursor);e>=0&&(r=r.slice(e+1))}let i=t.limit??30;return r.slice(0,i+1)}async function nt(e,t={}){let n=t.limit??30,r=await tt(e,t),i=r.length>n,a=i?r.slice(0,n):r,o=i?a[a.length-1]?.name??null:null,s=await rt(e);return{current:s,defaultBranch:await it(e,await tt(e,{}),s),branches:a,hasMore:i,nextCursor:o}}async function rt(e){let{stdout:t}=await z(e,[`rev-parse`,`--abbrev-ref`,`HEAD`]);return t.trim()}async function it(e,t,n){try{let{stdout:t}=await z(e,[`symbolic-ref`,`--short`,`refs/remotes/origin/HEAD`]),n=t.trim().split(`/`).pop();if(n)return n}catch{}let r=new Set(t.map(e=>e.name));return r.has(`main`)?`main`:r.has(`master`)?`master`:n&&n!==`HEAD`?n:t[0]?.name||``}const at=async(e,t)=>{if(!t)throw Error(`invalid_branch`);try{await z(e,[`check-ref-format`,`--branch`,t])}catch{throw Error(`invalid_branch`)}},ot=async(e,t)=>{try{return await z(e,[`show-ref`,`--verify`,`--quiet`,`refs/heads/${t}`]),!0}catch{return!1}};async function st(e,t){if(await at(e,t),!await ot(e,t))throw Error(`branch_not_found`);await z(e,[`checkout`,t])}async function ct(e,t){if(await at(e,t),await ot(e,t))throw Error(`branch_exists`);await z(e,[`checkout`,`-b`,t])}const lt={"Access-Control-Allow-Origin":`*`,"Access-Control-Allow-Methods":`GET,POST,PATCH,OPTIONS`,"Access-Control-Allow-Headers":`Content-Type`};function B(e){let t=new Headers(e.headers);for(let[e,n]of Object.entries(lt))t.set(e,n);return new Response(e.body,{status:e.status,statusText:e.statusText,headers:t})}function V(e,t){return B(new Response(JSON.stringify(t),{status:e,headers:{"Content-Type":`application/json; charset=utf-8`}}))}function H(e,t){return B(new Response(t,{status:e,headers:{"Content-Type":`text/plain; charset=utf-8`}}))}function ut(e,t){return B(new Response(t,{status:e,headers:{"Content-Type":`text/plain; charset=utf-8`}}))}function dt(){return B(new Response(null,{status:204}))}async function U(e){let t=await e.text();if(!t)return null;try{return JSON.parse(t)}catch{throw Error(`invalid_json`)}}function ft(e){return e instanceof Error&&e.message===`invalid_json`?V(400,{error:`invalid_json`}):e instanceof Error&&e.message===`not_a_directory`?V(400,{error:`not_a_directory`}):e instanceof Error&&e.message===`project_not_found`?V(404,{error:`project_not_found`}):e instanceof Error&&e.message===`project_required`?V(400,{error:`project_required`}):e instanceof Error&&e.message===`project_not_git`?V(400,{error:`project_not_git`}):e instanceof Error&&e.message===`invalid_branch`?V(400,{error:`invalid_branch`}):e instanceof Error&&e.message===`branch_exists`?V(409,{error:`branch_exists`}):e instanceof Error&&e.message===`branch_not_found`?V(404,{error:`branch_not_found`}):e instanceof Error&&e.message===`invalid_path`?V(400,{error:`invalid_path`}):e instanceof Error&&e.message===`app_server_spawn_failed`?V(500,{error:`app_server_spawn_failed`}):e&&typeof e==`object`&&`code`in e&&e.code===`ENOENT`?V(400,{error:`invalid_path`}):(_.error(e,`Unhandled server error`),V(500,{error:`server_error`}))}async function pt(e){let n=e?a.resolve(e):i.homedir(),r;try{r=await t.stat(n)}catch(e){throw e&&typeof e==`object`&&`code`in e&&e.code===`ENOENT`?Error(`invalid_path`):e}if(!r.isDirectory())throw Error(`invalid_path`);let o=(await t.readdir(n,{withFileTypes:!0})).filter(e=>e.isDirectory()).map(e=>({name:e.name,path:a.join(n,e.name)})).sort((e,t)=>e.name.localeCompare(t.name));return{path:n,parent:n===a.parse(n).root?null:a.dirname(n),entries:o}}function mt(e){let t=process.platform,n;switch(t){case`darwin`:n=[`open`,e];break;case`win32`:n=[`cmd`,`/c`,`start`,``,e];break;default:n=[`xdg-open`,e];break}O.spawn(n)}const ht=(e,t)=>`${e}:${t}`,gt=async e=>{try{return await t.readFile(e,`utf8`)}catch(e){if(e&&typeof e==`object`&&`code`in e&&e.code===`ENOENT`)return null;throw e}},_t=e=>{let t=[],n=new Set,r=e.split(/\r?\n/);for(let e of r){if(!e||e.startsWith(` `))continue;let r=e.trim();if(!r||r.startsWith(`#`))continue;let i=/^([^:=]+)\s*:(?!\s*=)/.exec(r);if(!i)continue;let a=i[1]?.trim().split(/\s+/)??[];for(let e of a)!e||e.startsWith(`.`)||e.includes(`%`)||n.has(e)||(n.add(e),t.push(e))}return t},vt=[{type:`package.json`,listCommands:async e=>{let t=await gt(a.join(e,`package.json`));if(!t)return[];let n;try{n=JSON.parse(t)}catch{return[]}if(!n||typeof n!=`object`)return[];let r=n.scripts;if(!r||typeof r!=`object`)return[];let i=[];for(let[e,t]of Object.entries(r)){let n=e.trim();!n||typeof t!=`string`||i.push({id:ht(`package.json`,n),name:n,label:n,source:`package.json`,detail:t.trim()})}return i},buildExecution:(e,t)=>{let n=O.which(`bun`);return n?{command:n,args:[`run`,t],cwd:e}:null}},{type:`makefile`,listCommands:async e=>{let t=[`Makefile`,`makefile`,`GNUmakefile`],n=[],r=new Set;for(let i of t){let t=await gt(a.join(e,i));if(!t)continue;let o=_t(t);for(let e of o)r.has(e)||(r.add(e),n.push({id:ht(`makefile`,e),name:e,label:e,source:`makefile`}))}return n},buildExecution:(e,t)=>{let n=O.which(`make`);return n?{command:n,args:[t],cwd:e}:null}}],W=async e=>(await Promise.all(vt.map(t=>t.listCommands(e)))).flat(),yt=(e,t,n)=>{let r=vt.find(e=>e.type===t);return r?r.buildExecution(e,n):null};function bt(){if(process.env.DIFFACT_STATIC_DIR){let e=a.resolve(process.env.DIFFACT_STATIC_DIR);if(m.existsSync(e))return e}let e=ee(import.meta.url),t=a.dirname(e),n=a.resolve(t,`../../web/dist`);if(m.existsSync(n))return n;let r=a.resolve(t,`../web/dist`);if(m.existsSync(r))return r;let i=a.resolve(process.cwd(),`web/dist`);return m.existsSync(i)?i:null}const G=bt(),xt={".html":`text/html; charset=utf-8`,".css":`text/css; charset=utf-8`,".js":`application/javascript; charset=utf-8`,".mjs":`application/javascript; charset=utf-8`,".json":`application/json; charset=utf-8`,".png":`image/png`,".jpg":`image/jpeg`,".jpeg":`image/jpeg`,".gif":`image/gif`,".svg":`image/svg+xml`,".ico":`image/x-icon`,".woff":`font/woff`,".woff2":`font/woff2`,".ttf":`font/ttf`,".eot":`application/vnd.ms-fontobject`,".webp":`image/webp`,".avif":`image/avif`,".mp4":`video/mp4`,".webm":`video/webm`,".txt":`text/plain; charset=utf-8`,".map":`application/json`};function St(e){return xt[a.extname(e).toLowerCase()]||`application/octet-stream`}function Ct(){return G!==null}function wt(){return G}async function Tt(e){if(!G)return null;let t=e.replace(/^\/+/,``)||`index.html`,n=a.resolve(G,t);if(!n.startsWith(G))return null;try{if(!m.statSync(n).isFile()){if(!a.extname(t)){let e=a.join(G,`index.html`);if(m.existsSync(e))return Et(e)}return null}return Et(n)}catch{if(!a.extname(t)||t===`index.html`){let e=a.join(G,`index.html`);if(m.existsSync(e))return Et(e)}return null}}function Et(e){let t=O.file(e);return new Response(t.stream(),{status:200,headers:{"Content-Type":St(e),"Content-Length":String(t.size),"Cache-Control":e.includes(`/assets/`)?`public, max-age=31536000, immutable`:`no-cache`}})}var Dt=class{#e=new Map;#t=null;#n;constructor(){this.#n=setInterval(()=>{this.#i()},3e4)}setCommandHandler(e){this.#t=e}open(){let e=S();return{onOpen:(t,n)=>{this.#e.set(e,{id:e,socket:n,lastSeen:Date.now()})},onMessage:t=>{this.#r(e,t.data)},onClose:()=>{this.#e.delete(e)},onError:()=>{this.#e.delete(e)}}}send(e,t){let n=JSON.stringify({event:e,payload:t}),r=0;for(let e of this.#e.values())try{e.socket.send(n),r+=1}catch{this.#e.delete(e.id)}_.info({event:e,clients:this.#e.size,delivered:r},`ws send`)}sendToClient(e,t,n){let r=this.#e.get(e);if(r)try{r.socket.send(JSON.stringify({event:t,payload:n}))}catch{this.#e.delete(e)}}#r(e,t){let n=this.#e.get(e);if(!n||(n.lastSeen=Date.now(),typeof t!=`string`))return;let r;try{r=JSON.parse(t)}catch{return}r?.type!==`pong`&&(!r||typeof r.type!=`string`||this.#t&&Promise.resolve(this.#t({clientId:e,message:r})).catch(t=>{_.error({err:t,clientId:e,type:r.type},`ws command handler error`)}))}#i(){let e=Date.now();for(let t of this.#e.values()){if(e-t.lastSeen>45e3){try{t.socket.close()}catch{}this.#e.delete(t.id);continue}try{t.socket.send(JSON.stringify({event:`ping`}))}catch{this.#e.delete(t.id)}}}closeAll(){clearInterval(this.#n);for(let e of this.#e.values())try{e.socket.close()}catch{}this.#e.clear()}};const Ot=process.env.DIFFACT_PROJECT_ROOT?a.resolve(process.env.DIFFACT_PROJECT_ROOT):a.join(i.homedir(),`workspace`),kt=Number.parseInt(process.env.PORT||``,10)||4312,At=Number.parseInt(process.env.DIFFACT_INLINE_DIFF_LINES||``,10)||4e3,jt=e=>e.replace(/\u001b\[[0-9;]*m/g,``),Mt=e=>e.replace(/(?:%[0-9A-Fa-f]{2})+/g,e=>{try{return decodeURIComponent(e)}catch{return e}}),K=(e,t)=>{let n=e[t];return typeof n==`string`?n.trim():``},q=(e,t)=>{let n=e[t];return typeof n!=`number`||!Number.isFinite(n)?null:n},J=(e,t)=>{let n=e[t];return typeof n==`string`&&n.trim()||void 0},Nt=(e,t)=>{let n=e[t];return Array.isArray(n)?n.filter(e=>typeof e==`string`).map(e=>e.trim()).filter(Boolean):[]},Pt=(e,t)=>{let n=new Set;for(let r of t){let t=r.trim();if(!t)continue;let i=a.resolve(e,t),o=a.relative(e,i);if(!o||o.startsWith(`..`)||a.isAbsolute(o))return null;n.add(o.replace(/\\/g,`/`))}return Array.from(n.values())},Ft=e=>e===`package.json`||e===`makefile`||e===`custom`,It=e=>({id:e.id,name:e.name,label:e.label,source:e.source}),Y=(e,t)=>({runId:e.id,projectPath:e.projectRoot,terminalId:e.terminalId,commandId:e.command.id,commandName:e.command.name,commandLabel:e.command.label,commandSource:e.command.source,status:e.status,exitCode:e.exitCode,signal:e.signal,startedAt:e.startedAt,completedAt:e.completedAt??null,stdout:t?e.output.stdout:void 0,stderr:t?e.output.stderr:void 0}),X=e=>e.status!==`running`,Lt=(e,t)=>({command:t,args:[],cwd:e,commandLine:t}),Rt={avif:`image/avif`,bmp:`image/bmp`,gif:`image/gif`,ico:`image/x-icon`,jpeg:`image/jpeg`,jpg:`image/jpeg`,png:`image/png`,svg:`image/svg+xml`,webp:`image/webp`,mp4:`video/mp4`,mov:`video/quicktime`,ogv:`video/ogg`,webm:`video/webm`,mp3:`audio/mpeg`,m4a:`audio/mp4`,ogg:`audio/ogg`,wav:`audio/wav`,flac:`audio/flac`,pdf:`application/pdf`},zt=e=>Rt[a.extname(e).slice(1).toLowerCase()]||`application/octet-stream`,Z=new Dt,Q=new oe({hub:Z});Z.setCommandHandler(async({clientId:e,message:t})=>{let{type:n,payload:r,requestId:i}=t;if(!n)return;let a=t=>{i&&Z.sendToClient(e,`command_ack`,{requestId:i,result:t})},o=t=>{i&&Z.sendToClient(e,`command_error`,{requestId:i,error:t})};try{if(n===`agent_start`){if(!r||typeof r!=`object`)throw Error(`invalid_payload`);let e=r,t=K(e,`projectPath`),n=K(e,`prompt`),i=J(e,`label`);if(!t||!n)throw Error(`invalid_payload`);a({agent:await Q.startAgent({projectPath:t,prompt:n,label:i})});return}if(n===`thread_message`){if(!r||typeof r!=`object`)throw Error(`invalid_payload`);let e=r,t=K(e,`threadId`),n=K(e,`projectPath`),i=K(e,`text`),o=J(e,`label`);if(!t||!n||!i)throw Error(`invalid_payload`);let s=await Q.resumeThread({threadId:t,projectPath:n,label:o});if(!await Q.sendMessage(s.id,i))throw Error(`agent_not_found`);a({agentId:s.id,threadId:s.threadId??t});return}if(n===`agent_stop`){if(!r||typeof r!=`object`)throw Error(`invalid_payload`);let e=r,t=J(e,`agentId`),n=J(e,`threadId`),i=!1;if(t?i=Q.stopAgent(t):n&&(i=Q.stopThread(n)),!i)throw Error(`agent_not_found`);a({agentId:t??null,threadId:n??null});return}if(n===`terminal_start`){if(!r||typeof r!=`object`)throw Error(`invalid_payload`);let e=r,t=K(e,`projectPath`),n=K(e,`source`),i=K(e,`name`),o=q(e,`cols`),s=q(e,`rows`);if(!t||!n||!i||!Ft(n))throw Error(`invalid_payload`);let c=await x(t),l=(await W(c.rootPath)).find(e=>e.source===n&&e.name===i);if(!l)throw Error(`command_not_found`);let u=yt(c.rootPath,n,i);if(!u)throw Error(`command_unsupported`);let d=await F({command:It(l),projectRoot:c.rootPath,plan:u,terminal:o&&s?{cols:o,rows:s}:void 0,listener:{onOutput:e=>{let t=I(e.runId);Z.send(`terminal_output`,{projectPath:c.rootPath,runId:e.runId,terminalId:t?.terminalId,stream:e.stream,data:e.data})},onStatus:e=>{Z.send(`terminal_status`,{projectPath:c.rootPath,run:Y(e,X(e))})}}});if(!d.runId)throw Error(d.error||`command_failed`);let f=I(d.runId);if(!f)throw Error(`command_not_found`);a({run:Y(f,X(f))});return}if(n===`terminal_exec`){if(!r||typeof r!=`object`)throw Error(`invalid_payload`);let e=r,t=K(e,`projectPath`),n=K(e,`command`),i=J(e,`label`),o=J(e,`name`),s=q(e,`cols`),c=q(e,`rows`);if(!t||!n)throw Error(`invalid_payload`);let l=await x(t),u=Lt(l.rootPath,n),d=i||o||`Custom Command`,f=o||i||`custom`,p=await F({command:{id:`custom:${f}`,name:f,label:d,source:`custom`},projectRoot:l.rootPath,plan:u,terminal:s&&c?{cols:s,rows:c}:void 0,listener:{onOutput:e=>{let t=I(e.runId);Z.send(`terminal_output`,{projectPath:l.rootPath,runId:e.runId,terminalId:t?.terminalId,stream:e.stream,data:e.data})},onStatus:e=>{Z.send(`terminal_status`,{projectPath:l.rootPath,run:Y(e,X(e))})}}});if(!p.runId)throw Error(p.error||`command_failed`);let m=I(p.runId);if(!m)throw Error(`command_not_found`);a({run:Y(m,X(m))});return}if(n===`terminal_stop`){if(!r||typeof r!=`object`)throw Error(`invalid_payload`);let e=r,t=K(e,`projectPath`),n=K(e,`runId`);if(!t||!n)throw Error(`invalid_payload`);let i=await x(t),o=I(n);if(!o||o.projectRoot!==i.rootPath)throw Error(`command_not_found`);let s=De(n);if(!s)throw Error(`command_not_found`);a({run:Y(s,X(s))});return}if(n===`terminal_list`){if(!r||typeof r!=`object`)throw Error(`invalid_payload`);let e=K(r,`projectPath`);if(!e)throw Error(`invalid_payload`);a({runs:Te((await x(e)).rootPath).sort((e,t)=>t.startedAt.localeCompare(e.startedAt)).map(e=>Y(e,!0))});return}if(n===`terminal_output`){if(!r||typeof r!=`object`)throw Error(`invalid_payload`);let e=r,t=K(e,`projectPath`),n=K(e,`runId`);if(!t||!n)throw Error(`invalid_payload`);let i=await x(t),o=I(n);if(!o||o.projectRoot!==i.rootPath)throw Error(`command_not_found`);let s=Ee(n);if(!s)throw Error(`command_not_found`);a({stdout:s.stdout,stderr:s.stderr});return}_.warn({type:n},`ws unknown command`),o(`unknown_command`)}catch(e){o(e instanceof Error?e.message:`command_failed`)}});const $=new o;$.use(`*`,s((e,...t)=>{_.info({rest:t},Mt(jt(e)))})),$.onError((e,t)=>(_.error({err:e,path:t.req.path,method:t.req.method},`error`),ft(e))),$.options(`*`,()=>dt()),$.get(`/health`,()=>V(200,{status:`ok`,time:new Date().toISOString()})),$.get(`/api/capabilities`,async e=>V(200,await fe(new URL(e.req.url).searchParams.get(`project`)))),$.get(`/api/editors`,async()=>V(200,{editors:await Me()})),$.post(`/api/editors/open`,async e=>{let t=await U(e.req.raw);if(!t||!t.editor||!t.project)return V(400,{error:`invalid_payload`});let n=t.editor;if(![`vscode`,`cursor`,`zed`].includes(n))return V(400,{error:`invalid_editor`});let r=t.target??{type:`project`},i=await Fe(n,t.project,r);return i.success?V(200,{success:!0}):V(400,{error:i.error??`open_failed`})}),$.get(`/api/projects/browse`,async e=>{let t=new URL(e.req.url).searchParams.get(`path`)?.trim();return V(200,await pt(t||Ot))}),$.post(`/api/projects/open`,async e=>{let t=await U(e.req.raw);return!t||typeof t.path!=`string`?V(400,{error:`invalid_path`}):V(200,await x(t.path))}),$.get(`/api/projects/commands`,async e=>{let t=new URL(e.req.url).searchParams.get(`project`)?.trim();return t?V(200,{commands:await W((await x(t)).rootPath)}):V(400,{error:`invalid_path`})}),$.post(`/api/projects/commands/run`,async e=>{let t=new URL(e.req.url).searchParams.get(`project`)?.trim();if(!t)return V(400,{error:`invalid_path`});let n=await U(e.req.raw);if(!n)return V(400,{error:`invalid_command`});let r=K(n,`source`),i=K(n,`name`);if(!r||!i||!Ft(r))return V(400,{error:`invalid_command`});let a=await x(t),o=(await W(a.rootPath)).find(e=>e.source===r&&e.name===i);if(!o)return V(404,{error:`command_not_found`});let s=yt(a.rootPath,r,i);return s?V(200,await F({command:It(o),projectRoot:a.rootPath,plan:s})):V(400,{error:`command_unsupported`})}),$.get(`/api/projects/commands/runs/:id`,async e=>{let t=new URL(e.req.url).searchParams.get(`project`)?.trim(),n=e.req.param(`id`)?.trim();if(!t||!n)return V(400,{error:`invalid_command`});let r=await x(t),i=I(n);return!i||i.projectRoot!==r.rootPath?V(404,{error:`command_not_found`}):V(200,{status:i.status,exitCode:i.exitCode,signal:i.signal})}),$.post(`/api/projects/commands/runs/:id/stop`,async e=>{let t=new URL(e.req.url).searchParams.get(`project`)?.trim(),n=e.req.param(`id`)?.trim();if(!t||!n)return V(400,{error:`invalid_command`});let r=await x(t),i=I(n);if(!i||i.projectRoot!==r.rootPath)return V(404,{error:`command_not_found`});let a=De(n);return a?V(200,{status:a.status,exitCode:a.exitCode,signal:a.signal}):V(404,{error:`command_not_found`})}),$.get(`/api/projects/diff`,async e=>{let t=new URL(e.req.url),n=t.searchParams.get(`project`)?.trim();if(!n)return V(400,{error:`invalid_path`});let r=await x(n);if(!r.isGit)return H(200,``);let i=t.searchParams.getAll(`arg`).filter(Boolean),a=t.searchParams.getAll(`path`).filter(Boolean);return H(200,await Ve(r.rootPath,i,a))}),$.get(`/api/projects/staged`,async e=>{let t=new URL(e.req.url).searchParams.get(`project`)?.trim();if(!t)return V(400,{error:`invalid_path`});let n=await x(t);return n.isGit?V(200,{paths:await He(n.rootPath)}):V(200,{paths:[]})}),$.post(`/api/projects/stage`,async e=>{let t=new URL(e.req.url).searchParams.get(`project`)?.trim();if(!t)return V(400,{error:`invalid_path`});let n=await U(e.req.raw);if(!n)return V(400,{error:`invalid_payload`});let r=await x(t);if(!r.isGit)return V(400,{error:`project_not_git`});let i=n.staged;if(typeof i!=`boolean`)return V(400,{error:`invalid_payload`});let a=K(n,`path`),o=Nt(n,`paths`),s=o.length?o:a?[a]:[];if(!s.length)return V(400,{error:`invalid_path`});let c=Pt(r.rootPath,s);return!c||!c.length?V(400,{error:`invalid_path`}):(i?await Ue(r.rootPath,c):await Ge(r.rootPath,c),V(200,{paths:c,staged:i}))}),$.get(`/api/projects/tree`,async e=>{let t=new URL(e.req.url).searchParams.get(`project`)?.trim();if(!t)return V(400,{error:`invalid_path`});let n=await x(t);if(!n.isGit)return V(200,{available:!1,rootPath:n.rootPath,entries:[]});let r=await et(n.rootPath);return V(200,{available:!0,rootPath:n.rootPath,entries:r})}),$.get(`/api/projects/file`,async e=>{let n=new URL(e.req.url),r=n.searchParams.get(`project`)?.trim(),i=n.searchParams.get(`path`)?.trim(),o=n.searchParams.get(`ref`)?.trim();if(!r||!i)return V(400,{error:`invalid_path`});let s=await x(r);if(!s.isGit)return V(400,{error:`project_not_git`});let c=a.resolve(s.rootPath,i),l=a.relative(s.rootPath,c);if(!l||l.startsWith(`..`)||a.isAbsolute(l))return V(400,{error:`invalid_path`});let u=l.replace(/\\/g,`/`);if(o)try{return V(200,{path:i,contents:await Ke(s.rootPath,o,u)})}catch(e){if(e&&typeof e==`object`&&`code`in e){let{code:t}=e;if(t===128)return V(404,{error:`invalid_path`})}throw e}let d;try{d=await t.stat(c)}catch(e){if(e&&typeof e==`object`&&`code`in e&&e.code===`ENOENT`)return V(404,{error:`invalid_path`});throw e}return d.isFile()?V(200,{path:i,contents:await t.readFile(c,`utf8`)}):V(400,{error:`invalid_path`})}),$.get(`/api/projects/file/raw`,async e=>{let n=new URL(e.req.url),r=n.searchParams.get(`project`)?.trim(),i=n.searchParams.get(`path`)?.trim();if(!r||!i)return V(400,{error:`invalid_path`});let o=await x(r);if(!o.isGit)return V(400,{error:`project_not_git`});let s=a.resolve(o.rootPath,i),c=a.relative(o.rootPath,s);if(!c||c.startsWith(`..`)||a.isAbsolute(c))return V(400,{error:`invalid_path`});let l;try{l=await t.stat(s)}catch(e){if(e&&typeof e==`object`&&`code`in e&&e.code===`ENOENT`)return V(404,{error:`invalid_path`});throw e}if(!l.isFile())return V(400,{error:`invalid_path`});let u=O.file(s);return B(new Response(u.stream(),{status:200,headers:{"Content-Type":zt(s),"Content-Disposition":`inline`}}))}),$.get(`/api/projects/history`,async e=>{let t=new URL(e.req.url),n=t.searchParams.get(`project`)?.trim();if(!n)return V(400,{error:`invalid_path`});let r=await x(n);if(!r.isGit)return V(400,{error:`project_not_git`});let i=t.searchParams.get(`limit`),a=t.searchParams.get(`skip`),o=i?Number.parseInt(i,10):30,s=a?Number.parseInt(a,10):0,c=Number.isFinite(o)&&o>0?Math.min(200,o):30,l=Number.isFinite(s)&&s>0?s:0;return V(200,await qe(r.rootPath,l,c))}),$.get(`/api/projects/commits/:sha/diff`,async e=>{let t=new URL(e.req.url).searchParams.get(`project`)?.trim(),n=e.req.param(`sha`)?.trim();if(!t)return V(400,{error:`invalid_path`});if(!n)return V(400,{error:`invalid_commit`});let r=await x(t);if(!r.isGit)return V(400,{error:`project_not_git`});let i=null;try{i=await Ze(r.rootPath,n)}catch(e){if(e&&typeof e==`object`&&`code`in e){let{code:t}=e;if(t===`ERR_CHILD_PROCESS_STDIO_MAXBUFFER`)i=null;else throw e}else throw e}return i===null||i>At?ut(200,Ye(r.rootPath,n)):H(200,await Je(r.rootPath,n))}),$.get(`/api/projects/commits/:sha/files`,async e=>{let t=new URL(e.req.url).searchParams.get(`project`)?.trim(),n=e.req.param(`sha`)?.trim();if(!t)return V(400,{error:`invalid_path`});if(!n)return V(400,{error:`invalid_commit`});let r=await x(t);return r.isGit?V(200,await Xe(r.rootPath,n)):V(400,{error:`project_not_git`})}),$.get(`/api/projects/branches`,async e=>{let t=new URL(e.req.url),n=t.searchParams.get(`project`)?.trim(),r=t.searchParams.get(`cursor`)?.trim()||null,i=t.searchParams.get(`filter`)?.trim()||null,a=t.searchParams.get(`limit`),o=a?Number.parseInt(a,10):void 0;if(!n)return V(400,{error:`invalid_path`});let s=await x(n);return s.isGit?V(200,await nt(s.rootPath,{limit:o,cursor:r,filter:i})):V(400,{error:`project_not_git`})}),$.post(`/api/projects/branches`,async e=>{let t=new URL(e.req.url).searchParams.get(`project`)?.trim(),n=(await U(e.req.raw))?.name?.trim()??``;if(!n)return V(400,{error:`invalid_branch`});if(!t)return V(400,{error:`invalid_path`});let r=await x(t);return r.isGit?(await ct(r.rootPath,n),V(201,{name:n})):V(400,{error:`project_not_git`})}),$.post(`/api/projects/branches/checkout`,async e=>{let t=new URL(e.req.url).searchParams.get(`project`)?.trim(),n=(await U(e.req.raw))?.name?.trim()??``;if(!n)return V(400,{error:`invalid_branch`});if(!t)return V(400,{error:`invalid_path`});let r=await x(t);return r.isGit?(await st(r.rootPath,n),V(200,{name:n})):V(400,{error:`project_not_git`})}),$.get(`/api/projects/pull-requests`,async e=>{let t=new URL(e.req.url),n=t.searchParams.get(`project`)?.trim(),r=t.searchParams.get(`cursor`)?.trim()||null,i=t.searchParams.get(`search`)?.trim()||null,a=t.searchParams.get(`limit`),o=a?Number.parseInt(a,10):void 0;if(!n)return V(400,{error:`invalid_path`});let s=await x(n);return s.isGit?V(200,await Ie(s.rootPath,{limit:o,cursor:r,search:i})):V(400,{error:`project_not_git`})}),$.get(`/api/projects/issues`,async e=>{let t=new URL(e.req.url),n=t.searchParams.get(`project`)?.trim(),r=t.searchParams.get(`cursor`)?.trim()||null,i=t.searchParams.get(`search`)?.trim()||null,a=t.searchParams.get(`state`)?.trim(),o=t.searchParams.get(`limit`),s=o?Number.parseInt(o,10):void 0;if(!n)return V(400,{error:`invalid_path`});let c=await x(n);return c.isGit?V(200,await Le(c.rootPath,{limit:s,cursor:r,search:i,state:a||`open`})):V(400,{error:`project_not_git`})}),$.get(`/api/projects/issues/:number`,async e=>{let t=new URL(e.req.url).searchParams.get(`project`)?.trim(),n=Number.parseInt(e.req.param(`number`)||``,10);if(!t)return V(400,{error:`invalid_path`});if(Number.isNaN(n))return V(400,{error:`invalid_issue_number`});let r=await x(t);if(!r.isGit)return V(400,{error:`project_not_git`});let i=await Re(r.rootPath,n);return i?V(200,i):V(404,{error:`issue_not_found`})}),$.get(`/api/agents`,()=>V(200,Q.listAgents())),$.get(`/api/agents/:id`,e=>{let t=e.req.param(`id`),n=Q.getAgent(t);return n?V(200,n):V(404,{error:`agent_not_found`})}),$.get(`/api/threads`,async e=>{let t=new URL(e.req.url),n=t.searchParams.get(`cursor`),r=t.searchParams.get(`limit`),i=t.searchParams.get(`project`)?.trim(),a=r?Number.parseInt(r,10):null,o=i?(await x(i)).rootPath:null;return V(200,await Q.listThreads({cursor:n||null,limit:Number.isNaN(a)?null:a,projectPath:o}))}),$.get(`/api/threads/history`,async e=>{let n=new URL(e.req.url).searchParams.get(`path`)?.trim();if(!n)return V(400,{error:`invalid_path`});let r=a.resolve(n);if(a.extname(r).toLowerCase()!==`.jsonl`)return V(400,{error:`invalid_path`});let i;try{i=await t.stat(r)}catch(e){if(e&&typeof e==`object`&&`code`in e&&e.code===`ENOENT`)return V(404,{error:`invalid_path`});throw e}return i.isFile()?H(200,await t.readFile(r,`utf8`)):V(400,{error:`invalid_path`})}),$.get(`*`,async e=>{let t=new URL(e.req.url).pathname;return await Tt(t)||H(404,`Not found`)});const Bt=process.argv.includes(`--no-open`);if(O.isBun){let{upgradeWebSocket:e,websocket:t}=await import(`hono/bun`);$.get(`/api/events`,e(()=>(_.info(`ws open`),Z.open()))),Bun.serve({port:kt,fetch:$.fetch,websocket:t});let n=`http://localhost:${kt}`;_.info(`diffact server listening on ${n}`),Ct()&&_.info(`serving static files from ${wt()}`),!Bt&&Ct()&&mt(n)}export{Ct as a,wt as i,$ as n,mt as o,Z as r,_ as s,kt as t};
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
import{n as e,r as t,t as n}from"./src-CPKE75x0.mjs";export{};
|
package/package.json
CHANGED
|
@@ -1,10 +1,10 @@
|
|
|
1
1
|
{
|
|
2
2
|
"name": "diffact",
|
|
3
|
-
"version": "0.
|
|
3
|
+
"version": "0.2.0",
|
|
4
4
|
"description": "A browser-based review deck for your AI agents",
|
|
5
5
|
"type": "module",
|
|
6
6
|
"bin": {
|
|
7
|
-
"diffact": "dist/cli.
|
|
7
|
+
"diffact": "dist/cli.mjs"
|
|
8
8
|
},
|
|
9
9
|
"files": [
|
|
10
10
|
"dist",
|
|
@@ -14,15 +14,13 @@
|
|
|
14
14
|
"lint": "biome check --write server web",
|
|
15
15
|
"typecheck:server": "tsc -p server/tsconfig.json --noEmit",
|
|
16
16
|
"typecheck:web": "tsc -p web/tsconfig.json --noEmit",
|
|
17
|
-
"start": "bun server/src/index.ts",
|
|
18
17
|
"start:server": "bun server/src/index.ts",
|
|
19
18
|
"start:node": "node --experimental-strip-types server/src/index-node.ts",
|
|
20
|
-
"dev": "bun --hot server/src/index.ts --no-open",
|
|
21
19
|
"dev:server": "bun --hot server/src/index.ts --no-open",
|
|
22
20
|
"dev:web": "vite --config web/vite.config.ts",
|
|
23
21
|
"build": "bun run build:web && bun run build:server",
|
|
24
22
|
"build:web": "vite build --config web/vite.config.ts",
|
|
25
|
-
"build:server": "
|
|
23
|
+
"build:server": "tsdown",
|
|
26
24
|
"prepublishOnly": "bun run build",
|
|
27
25
|
"preview:web": "vite preview --config web/vite.config.ts"
|
|
28
26
|
},
|
|
@@ -55,6 +53,7 @@
|
|
|
55
53
|
"@types/ws": "8.18.1",
|
|
56
54
|
"@vitejs/plugin-react": "5.1.2",
|
|
57
55
|
"daisyui": "5.5.14",
|
|
56
|
+
"tsdown": "0.20.1",
|
|
58
57
|
"typescript": "5.9.3",
|
|
59
58
|
"vite": "7.3.1"
|
|
60
59
|
}
|
|
@@ -1,2 +1,2 @@
|
|
|
1
|
-
import{r as n,N as h,c as x,j as r,a as f,b as u}from"./index-
|
|
1
|
+
import{r as n,N as h,c as x,j as r,a as f,b as u}from"./index-BlaXWu6U.js";var k=u("block","before:content-[counter(line)]","before:inline-block","before:[counter-increment:line]","before:w-6","before:mr-4","before:text-[13px]","before:text-right","before:text-muted-foreground/50","before:font-mono","before:select-none"),p=n.memo(({children:a,result:e,language:o,className:c,...m})=>{let i=n.useMemo(()=>({backgroundColor:e.bg,color:e.fg}),[e.bg,e.fg]);return r.jsx("pre",{className:u(c,"p-4 text-sm dark:bg-(--shiki-dark-bg)!"),"data-language":o,"data-streamdown":"code-block-body",style:i,...m,children:r.jsx("code",{className:"[counter-increment:line_0] [counter-reset:line]",children:e.tokens.map((d,s)=>r.jsx("span",{className:k,children:d.map((t,l)=>r.jsx("span",{className:"dark:bg-(--shiki-dark-bg)! dark:text-(--shiki-dark)!",style:{color:t.color,backgroundColor:t.bgColor,...t.htmlStyle},...t.htmlAttrs,children:t.content},l))},s))})})},(a,e)=>a.result===e.result&&a.language===e.language&&a.className===e.className),j=({className:a,language:e,style:o,...c})=>r.jsx("div",{className:u("my-4 w-full overflow-hidden rounded-xl border border-border",a),"data-language":e,"data-streamdown":"code-block",style:{contentVisibility:"auto",containIntrinsicSize:"auto 200px",...o},...c}),N=({language:a,children:e})=>r.jsxs("div",{className:"flex items-center justify-between bg-muted/80 p-3 text-muted-foreground text-xs","data-language":a,"data-streamdown":"code-block-header",children:[r.jsx("span",{className:"ml-1 font-mono lowercase",children:a}),r.jsx("div",{className:"flex items-center gap-2",children:e})]}),y=({code:a,language:e,className:o,children:c,...m})=>{let{shikiTheme:i}=n.useContext(h),d=x(),s=n.useMemo(()=>({bg:"transparent",fg:"inherit",tokens:a.split(`
|
|
2
2
|
`).map(g=>[{content:g,color:"inherit",bgColor:"transparent",htmlStyle:{},offset:0}])}),[a]),[t,l]=n.useState(s);return n.useEffect(()=>{if(!d){l(s);return}let g=d.highlight({code:a,language:e,themes:i},b=>{l(b)});if(g){l(g);return}l(s)},[a,e,i,d,s]),r.jsx(f.Provider,{value:{code:a},children:r.jsxs(j,{language:e,children:[r.jsx(N,{language:e,children:c}),r.jsx(p,{className:o,language:e,result:t,...m})]})})};export{y as CodeBlock};
|