@deepseekcode/cli 1.0.16 → 1.0.17
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.js +3 -3
- package/package.json +2 -2
package/dist/cli.js
CHANGED
|
@@ -1729,7 +1729,7 @@ The reviewer should pay special attention to: **${Q}**
|
|
|
1729
1729
|
`)){if(!K.trim())continue;const[X,q,Y]=K.split("\t");const Z=Number(X)||0;const G=Number(q)||0;if(!Y)continue;const H=J.get(Y)||"M";D.push({path:Y,status:H,added:Z,removed:G,staged:H===H.toUpperCase()})}return D}async function p$6(z,J=90000){const D=u$6(sO8(m$6(),"dsc-git-list-"));const K=sO8(D,"repo");try{let X=await p0(D,["clone","--depth","1","--filter=blob:none","--no-checkout","--",z,"repo"],J);if(X.code!==0){try{rO8(K,{recursive:true,force:true})}catch{}X=await p0(D,["clone","--depth","1","--no-checkout","--",z,"repo"],J)}if(X.code!==0){const H=(X.stderr||X.stdout).trim()||`git clone failed (code ${X.code})`;return{code:X.code,files:[],error:H}}const q=await p0(K,["rev-parse","--abbrev-ref","HEAD"],J);const Y=q.code===0?q.stdout.trim():undefined;const Z=await p0(K,["ls-tree","-r","--name-only","HEAD"],J);if(Z.code!==0){return{code:Z.code,files:[],branch:Y,error:Z.stderr.trim()||"git ls-tree failed"}}const G=Z.stdout.split(`
|
|
1730
1730
|
`).map((H)=>H.trim()).filter(Boolean);return{code:0,files:G,branch:Y}}catch(X){return{code:-1,files:[],error:X instanceof Error?X.message:String(X)}}finally{try{rO8(D,{recursive:true,force:true})}catch{}}}async function c$6(z){const J=await p0(z,["rev-parse","--abbrev-ref","HEAD"]);if(J.code!==0){return{available:false,projectName:tO8(z),error:"Not a git repository"}}const D=await p0(z,["status","--porcelain=v1"]);const K=new Map;for(const C of D.stdout.split(`
|
|
1731
1731
|
`)){if(!C.trim())continue;const U=C.slice(0,2).trim();const L=C.slice(3).replace(/^"|"$/g,"");K.set(L,U||"M")}const X=await p0(z,["diff","--numstat"]);const q=await p0(z,["diff","--cached","--numstat"]);const Y=[...eO8(q.stdout,K),...eO8(X.stdout,K)];const Z=new Map;for(const C of Y)Z.set(C.path,C);for(const[C,U]of K){if(U.includes("?")&&!Z.has(C)){Z.set(C,{path:C,status:U,added:0,removed:0})}}const G=Array.from(Z.values());const H=G.reduce((C,U)=>C+U.added,0);const V=G.reduce((C,U)=>C+U.removed,0);let O=0,Q=0;const j=await p0(z,["rev-list","--count","@{upstream}..HEAD"]);if(j.code===0)O=Number(j.stdout.trim())||0;const _=await p0(z,["rev-list","--count","HEAD..@{upstream}"]);if(_.code===0)Q=Number(_.stdout.trim())||0;let A=null;const N=await p0(z,["log","-1","--format=%H%x09%an%x09%at%x09%s"]);if(N.code===0&&N.stdout.trim()){const[C,U,L,...P]=N.stdout.trim().split("\t");A={hash:C,author:U,timestamp:Number(L)*1000,subject:P.join("\t")}}return{available:true,projectName:tO8(z),branch:J.stdout.trim()||undefined,ahead:O,behind:Q,changes:G,totalAdded:H,totalRemoved:V,dirty:G.length>0,lastCommit:A}}async function l$6(z){const J=await p0(z,["rev-parse","--abbrev-ref","HEAD"]);if(J.code!==0)return{available:false,error:"Not a git repository",branches:[]};const D=await p0(z,["branch","--format=%(refname:short)"]);const K=D.stdout.split(`
|
|
1732
|
-
`).map((X)=>X.trim()).filter(Boolean);return{available:true,current:J.stdout.trim()||undefined,branches:K}}async function d$6(z,J,D=true){const K=D?["add","-A"]:["add","-u"];const X=await p0(z,K,30000);if(X.code!==0)return{ok:false,error:X.stderr.trim()||`git add failed (code ${X.code})`};const q=await p0(z,["commit","-m",J],30000);if(q.code!==0){const Z=q.stderr.trim();if(/nothing to commit|no changes added/.test(Z)){return{ok:false,error:"Nothing to commit — working tree is clean",message:J}}return{ok:false,error:Z||`git commit failed (code ${q.code})`,message:J}}const Y=/\[[^\]]+ ([0-9a-f]+)\]/.exec(q.stdout);return{ok:true,hash:Y?Y[1]:undefined,message:q.stdout.trim()}}async function i$6(z){const J=await p0(z,["push"],60000);if(J.code!==0)return{ok:false,error:J.stderr.trim()||`git push failed (code ${J.code})`};return{ok:true,message:J.stdout.trim()}}async function n$6(z,J){const D=await p0(z,["checkout",J],30000);if(D.code!==0)return{ok:false,error:D.stderr.trim()||`git checkout failed (code ${D.code})`};return{ok:true,message:D.stdout.trim()}}async function a$6(z,J=30000){const D=await p0(z,["status"],5000);if(D.code!==0)return{available:false,error:"Not a git repository"};const K=await new Promise((q)=>{const Y=Mm("gh",["--version"],{cwd:z});let Z="";let G="";const H=setTimeout(()=>{Y.kill();q({code:-1,stdout:Z,stderr:"gh CLI timed out"})},5000);Y.stdout.on("data",(V)=>{Z+=String(V)});Y.stderr.on("data",(V)=>{G+=String(V)});Y.on("close",(V)=>{clearTimeout(H);q({code:V??-1,stdout:Z,stderr:G})});Y.on("error",()=>{clearTimeout(H);q({code:-1,stdout:Z,stderr:"gh CLI not found"})})});if(K.code!==0){return{available:false,error:"GitHub CLI (gh) is not installed or not on PATH. Install gh to see PR status."}}const X=await new Promise((q)=>{const Y=Mm("gh",["pr","list","--json","number,title,state,headRefName,baseRefName,author,createdAt,updatedAt,url","--limit","50"],{cwd:z});let Z="";let G="";const H=setTimeout(()=>{Y.kill();q({code:-1,stdout:Z,stderr:`gh pr list timed out after ${J}ms`})},J);Y.stdout.on("data",(V)=>{Z+=String(V)});Y.stderr.on("data",(V)=>{G+=String(V)});Y.on("close",(V)=>{clearTimeout(H);q({code:V??-1,stdout:Z,stderr:G})});Y.on("error",(V)=>{clearTimeout(H);q({code:-1,stdout:Z,stderr:V.message})})});if(X.code!==0){return{available:false,error:X.stderr.trim()||`gh pr list failed (code ${X.code})`}}try{const q=JSON.parse(X.stdout);const Y=q.map((Z)=>({number:Z.number,title:Z.title,state:Z.state.toLowerCase(),branch:Z.headRefName,base:Z.baseRefName,author:Z.author?.login??"unknown",createdAt:new Date(Z.createdAt).getTime(),updatedAt:new Date(Z.updatedAt).getTime(),url:Z.url||undefined}));return{available:true,prs:Y}}catch(q){return{available:false,error:`Failed to parse gh output: ${q.message}`}}}vK();var t$6=Number(process.env.DSC_HEAP_LIMIT_MB||4096);var KL8=Number(process.env.DEEPSEEKCODE_HTTP_PORT||8080);var XX1=Number(process.env.DEEPSEEKCODE_WS_PORT||KL8+1);var GC=Number(process.env.DSC_FETCH_TIMEOUT_MS||5000);var e$6=Number(process.env.DSC_FETCH_LONG_TIMEOUT_MS||1e4);var zj6=Number(process.env.DSC_MARKET_INSTALL_TIMEOUT_MS||60000);var qX1=Number(process.env.DSC_MAX_LOG_LINE_LENGTH||1e4);var YX1=Number(process.env.DSC_MAX_LOG_FILE_SIZE||10485760);var ZX1=Number(process.env.DSC_MAX_TERMINAL_LINES||1000);var GX1=Number(process.env.DSC_MAX_HISTORY_MESSAGES||200);var HX1=Number(process.env.DSC_TOKEN_WARNING_THRESHOLD||0.8);var VX1=Number(process.env.DSC_TOKEN_ERROR_THRESHOLD||0.95);var WX1=Number(process.env.DSC_AUTO_COMPACT_THRESHOLD||0.7);var OX1=Number(process.env.DSC_STREAM_FLUSH_MS||500);var $X1=Number(process.env.DSC_STREAM_BUFFER_MAX_BYTES||10485760);var jX1=Number(process.env.DSC_MAX_BLOCK_CONTENT_CHARS||51200);var QX1=Number(process.env.DSC_MAX_MESSAGES||2000);var AX1=Number(process.env.DSC_MAX_FILE_READ_SIZE||10485760);var BX1=Number(process.env.DSC_MAX_SEARCH_RESULTS||1000);var _X1=Number(process.env.DSC_MAX_SESSION_FILE_SIZE||52428800);var MX1=Number(process.env.DSC_SESSION_AUTO_SAVE_MS||5000);var J$8="jwcode-ai/jwcode";var D$8="@deepseekcode/cli";var Jj6=3600000;var XL8=Math.min(GC,8000);var LQ=null;function Um(){if("1.0.
|
|
1732
|
+
`).map((X)=>X.trim()).filter(Boolean);return{available:true,current:J.stdout.trim()||undefined,branches:K}}async function d$6(z,J,D=true){const K=D?["add","-A"]:["add","-u"];const X=await p0(z,K,30000);if(X.code!==0)return{ok:false,error:X.stderr.trim()||`git add failed (code ${X.code})`};const q=await p0(z,["commit","-m",J],30000);if(q.code!==0){const Z=q.stderr.trim();if(/nothing to commit|no changes added/.test(Z)){return{ok:false,error:"Nothing to commit — working tree is clean",message:J}}return{ok:false,error:Z||`git commit failed (code ${q.code})`,message:J}}const Y=/\[[^\]]+ ([0-9a-f]+)\]/.exec(q.stdout);return{ok:true,hash:Y?Y[1]:undefined,message:q.stdout.trim()}}async function i$6(z){const J=await p0(z,["push"],60000);if(J.code!==0)return{ok:false,error:J.stderr.trim()||`git push failed (code ${J.code})`};return{ok:true,message:J.stdout.trim()}}async function n$6(z,J){const D=await p0(z,["checkout",J],30000);if(D.code!==0)return{ok:false,error:D.stderr.trim()||`git checkout failed (code ${D.code})`};return{ok:true,message:D.stdout.trim()}}async function a$6(z,J=30000){const D=await p0(z,["status"],5000);if(D.code!==0)return{available:false,error:"Not a git repository"};const K=await new Promise((q)=>{const Y=Mm("gh",["--version"],{cwd:z});let Z="";let G="";const H=setTimeout(()=>{Y.kill();q({code:-1,stdout:Z,stderr:"gh CLI timed out"})},5000);Y.stdout.on("data",(V)=>{Z+=String(V)});Y.stderr.on("data",(V)=>{G+=String(V)});Y.on("close",(V)=>{clearTimeout(H);q({code:V??-1,stdout:Z,stderr:G})});Y.on("error",()=>{clearTimeout(H);q({code:-1,stdout:Z,stderr:"gh CLI not found"})})});if(K.code!==0){return{available:false,error:"GitHub CLI (gh) is not installed or not on PATH. Install gh to see PR status."}}const X=await new Promise((q)=>{const Y=Mm("gh",["pr","list","--json","number,title,state,headRefName,baseRefName,author,createdAt,updatedAt,url","--limit","50"],{cwd:z});let Z="";let G="";const H=setTimeout(()=>{Y.kill();q({code:-1,stdout:Z,stderr:`gh pr list timed out after ${J}ms`})},J);Y.stdout.on("data",(V)=>{Z+=String(V)});Y.stderr.on("data",(V)=>{G+=String(V)});Y.on("close",(V)=>{clearTimeout(H);q({code:V??-1,stdout:Z,stderr:G})});Y.on("error",(V)=>{clearTimeout(H);q({code:-1,stdout:Z,stderr:V.message})})});if(X.code!==0){return{available:false,error:X.stderr.trim()||`gh pr list failed (code ${X.code})`}}try{const q=JSON.parse(X.stdout);const Y=q.map((Z)=>({number:Z.number,title:Z.title,state:Z.state.toLowerCase(),branch:Z.headRefName,base:Z.baseRefName,author:Z.author?.login??"unknown",createdAt:new Date(Z.createdAt).getTime(),updatedAt:new Date(Z.updatedAt).getTime(),url:Z.url||undefined}));return{available:true,prs:Y}}catch(q){return{available:false,error:`Failed to parse gh output: ${q.message}`}}}vK();var t$6=Number(process.env.DSC_HEAP_LIMIT_MB||4096);var KL8=Number(process.env.DEEPSEEKCODE_HTTP_PORT||8080);var XX1=Number(process.env.DEEPSEEKCODE_WS_PORT||KL8+1);var GC=Number(process.env.DSC_FETCH_TIMEOUT_MS||5000);var e$6=Number(process.env.DSC_FETCH_LONG_TIMEOUT_MS||1e4);var zj6=Number(process.env.DSC_MARKET_INSTALL_TIMEOUT_MS||60000);var qX1=Number(process.env.DSC_MAX_LOG_LINE_LENGTH||1e4);var YX1=Number(process.env.DSC_MAX_LOG_FILE_SIZE||10485760);var ZX1=Number(process.env.DSC_MAX_TERMINAL_LINES||1000);var GX1=Number(process.env.DSC_MAX_HISTORY_MESSAGES||200);var HX1=Number(process.env.DSC_TOKEN_WARNING_THRESHOLD||0.8);var VX1=Number(process.env.DSC_TOKEN_ERROR_THRESHOLD||0.95);var WX1=Number(process.env.DSC_AUTO_COMPACT_THRESHOLD||0.7);var OX1=Number(process.env.DSC_STREAM_FLUSH_MS||500);var $X1=Number(process.env.DSC_STREAM_BUFFER_MAX_BYTES||10485760);var jX1=Number(process.env.DSC_MAX_BLOCK_CONTENT_CHARS||51200);var QX1=Number(process.env.DSC_MAX_MESSAGES||2000);var AX1=Number(process.env.DSC_MAX_FILE_READ_SIZE||10485760);var BX1=Number(process.env.DSC_MAX_SEARCH_RESULTS||1000);var _X1=Number(process.env.DSC_MAX_SESSION_FILE_SIZE||52428800);var MX1=Number(process.env.DSC_SESSION_AUTO_SAVE_MS||5000);var J$8="jwcode-ai/jwcode";var D$8="@deepseekcode/cli";var Jj6=3600000;var XL8=Math.min(GC,8000);var LQ=null;function Um(){if("1.0.17")return"1.0.17";try{const z=r$6(s$6(import.meta.url));const J=[z$8(z,"..","package.json"),z$8(z,"..","..","package.json")];for(const D of J){const K=JSON.parse(o$6(D,"utf8"));if(typeof K?.version==="string"&&K.version)return K.version}}catch{}return"1.0.0"}async function Dj6(z){const J=await fetch(`https://api.github.com/repos/${J$8}/releases/latest`,{headers:{Accept:"application/vnd.github+json","User-Agent":"deepseekcode-update-check"},signal:AbortSignal.timeout(XL8)});if(!J.ok)return null;const D=await J.json();const K=String(D.tag_name??"").replace(/^v/i,"");if(!K)return null;return{version:K,current:z,available:j$8(K,z)>0,channel:"stable",publishedAt:typeof D.published_at==="string"?D.published_at:undefined,notes:typeof D.body==="string"?D.body.slice(0,4000):undefined,url:typeof D.html_url==="string"?D.html_url:`https://github.com/${J$8}/releases`,source:"github"}}async function Kj6(z){const J=await fetch(`https://registry.npmjs.org/${D$8}/latest`,{signal:AbortSignal.timeout(XL8)});if(!J.ok)return null;const D=await J.json();const K=String(D.version??"");if(!K)return null;return{version:K,current:z,available:j$8(K,z)>0,channel:"stable",url:`https://www.npmjs.com/package/${D$8}`,source:"npm"}}async function K$8(z,J=false){const D=z??Um();if(!J&&LQ&&Date.now()-LQ.at<Jj6)return LQ.info;let K=null;try{K=await Dj6(D)}catch{K=null}if(!K){try{K=await Kj6(D)}catch{K=null}}LQ={at:Date.now(),info:K};return K}function Xj6(){LQ=null}function Yj6(){if(qL8()==="win32")return"powershell.exe";return process.env.SHELL||"sh"}class YL8{defaultWorkspaceDir;wsPort;sessions=new Map;constructor(z,J){this.defaultWorkspaceDir=z;this.wsPort=J}start(z){const J=`terminal_${Date.now()}_${Math.random().toString(36).slice(2,8)}`;const D=qj6(z.workspaceDir||this.defaultWorkspaceDir);const K=Yj6();this.sessions.set(J,{id:J,workspaceDir:D,shell:K,startedAt:Date.now()});return{terminalId:J,port:this.wsPort,ttydPort:this.wsPort,wsUrl:`ws://127.0.0.1:${this.wsPort}/terminal?terminalId=${encodeURIComponent(J)}`,workspaceDir:D,shell:K}}status(z){const J=z?this.sessions.get(z):undefined;const D=[...this.sessions.values()];return{running:z?Boolean(J?.child):D.some((K)=>Boolean(K.child)),terminalAvailable:true,ttydAvailable:true,port:this.wsPort,ttydPort:this.wsPort,uptime:J?Math.floor((Date.now()-J.startedAt)/1000):undefined,workspaceDir:J?.workspaceDir||this.defaultWorkspaceDir,wsUrl:z?`ws://127.0.0.1:${this.wsPort}/terminal?terminalId=${encodeURIComponent(z)}`:`ws://127.0.0.1:${this.wsPort}/terminal`,sessions:D.map((K)=>({id:K.id,workspaceDir:K.workspaceDir,shell:K.shell,uptime:Math.floor((Date.now()-K.startedAt)/1000),cols:K.cols,rows:K.rows,exitCode:K.exitCode,error:K.error}))}}stop(z){const J=z?[this.sessions.get(z)].filter(Boolean):[...this.sessions.values()];for(const D of J){try{D.child?.kill();D.socket?.close?.()}catch{}this.sessions.delete(D.id)}return J.length}openSocket(z,J){let D=J?this.sessions.get(J):undefined;if(!D){const Y=this.start({});D=this.sessions.get(Y.terminalId)}D.socket=z;let K;try{K=this.spawnShell(D)}catch(Y){D.error=Y instanceof Error?Y.message:String(Y);z.send(`Terminal failed to start: ${Y instanceof Error?Y.message:String(Y)}\r
|
|
1733
1733
|
`);z.close?.();this.sessions.delete(D.id);return}D.child=K;const X=new q$8("utf-8");const q=new q$8("utf-8");K.stdout.on("data",(Y)=>z.send(X.write(Y)));K.stderr.on("data",(Y)=>z.send(q.write(Y)));K.on("error",(Y)=>{D.error=Y.message;try{z.send(`Terminal process error: ${Y.message}\r
|
|
1734
1734
|
`);z.close?.()}catch{}this.sessions.delete(D.id)});K.on("exit",(Y)=>{D.exitCode=Y;try{z.send(`\r
|
|
1735
1735
|
[terminal exited ${Y??""}]\r
|
|
@@ -4370,7 +4370,7 @@ Error: API Key is required for deployment. Process exited with code 1.\r
|
|
|
4370
4370
|
`)){const s=a.trim();if(!s||s.startsWith("#"))continue;const U8=s.indexOf(":");if(U8===-1)continue;const u8=s.slice(0,U8).trim();let j6=s.slice(U8+1).trim();if(typeof j6==="string"&&j6.startsWith("[")&&j6.endsWith("]")){j6=j6.slice(1,-1).split(",").map((h)=>h.trim()).filter(Boolean)}else if(j6==="true")j6=true;else if(j6==="false")j6=false;$8[u8]=j6}return $8}function r(p){const $8=p.match(/^---\s*\n([\s\S]*?)\n---\s*\n([\s\S]*)$/);if(!$8)return null;return{frontmatter:n($8[1]),body:$8[2].trim()}}function J8(p){const $8=(s)=>String(s??"");const a=(s)=>Array.isArray(s)?s.join(", "):s?String(s):"";return["---",`id: ${$8(p.id)}`,`name: ${$8(p.name||p.id)}`,`description: ${$8(p.description).replace(/\n/g," ")}`,`enabled: ${p.enabled!==false}`,`category: ${$8(p.category||"General")}`,`icon: ${$8(p.icon||"馃幆")}`,`trigger: ${$8(p.trigger||"")}`,`injection: ${$8(p.injection||"lazy")}`,`tags: [${a(p.tags)}]`,`tools: [${a(p.requiredTools)}]`,`source: ${$8(p.source||"user")}`,`editable: ${p.editable!==false}`,"---","",$8(p.systemPrompt)].join(`
|
|
4371
4371
|
`)}function H8(){i();const p=new Map;for(const $8 of aH(w)){if(!$8.endsWith(".skill.md"))continue;try{const a=N0(A1(w,$8),"utf-8");const s=r(a);if(!s)continue;const U8=s.frontmatter;const u8=String(U8.id??$8.replace(/\.skill\.md$/,""));p.set(u8,{id:u8,name:String(U8.name??u8),description:String(U8.description??""),enabled:U8.enabled!==false,category:String(U8.category??"General"),icon:String(U8.icon??"star"),tags:Array.isArray(U8.tags)?U8.tags:[],trigger:String(U8.trigger??""),injection:String(U8.injection??"lazy"),systemPrompt:s.body,requiredTools:Array.isArray(U8.tools)?U8.tools:[],source:String(U8.source??"file"),editable:U8.editable!==false,version:String(U8.version??"1.0"),author:String(U8.author??"user")})}catch(a){z0.warn("skills.load_failed",`Failed to load skill ${$8}`,String(a))}}return p}function K8(p){i();e5(A1(w,String(p.id)+".skill.md"),J8(p),"utf-8")}function _8(p){const $8=A1(w,p+".skill.md");if(u7($8))iO8($8)}function C8(){i();if(aH(w).some(($8)=>$8.endsWith(".skill.md")))return;const p=[{id:"code-review",name:"Code Review",description:"Review code changes for correctness, security, and best practices",enabled:true,category:"Development",icon:"馃帗",tags:["review","code-quality"],trigger:"review",injection:"lazy",systemPrompt:"You are a thorough code reviewer. Analyze code for bugs, security issues, performance problems, and adherence to best practices. Provide constructive feedback.",requiredTools:["read","grep"],source:"built-in",editable:false,version:"1.0",author:"system"},{id:"debug",name:"Debug",description:"Analyze and fix bugs in code",enabled:true,category:"Development",icon:"馃攳",tags:["debug","bug-fix"],trigger:"debug",injection:"lazy",systemPrompt:"You are a debugging expert. Systematically analyze code, identify root causes, and propose fixes. Use tools to inspect code and runtime state.",requiredTools:["read","grep","bash"],source:"built-in",editable:false,version:"1.0",author:"system"},{id:"explain",name:"Explain Code",description:"Explain what code does in detail",enabled:true,category:"Learning",icon:"馃摉",tags:["explain","understand"],trigger:"explain",injection:"lazy",systemPrompt:"You are a coding teacher. When asked to explain code, provide a clear, detailed explanation of what it does, how it works, key patterns used, and potential pitfalls.",requiredTools:["read"],source:"built-in",editable:false,version:"1.0",author:"system"},{id:"refactor",name:"Refactor",description:"Refactor code to improve quality and maintainability",enabled:true,category:"Development",icon:"馃敡",tags:["refactor","clean-code"],trigger:"refactor",injection:"lazy",systemPrompt:"You are a refactoring specialist. Improve code structure, readability, and maintainability while preserving functionality. Suggest modern patterns and best practices.",requiredTools:["read","write","grep"],source:"built-in",editable:false,version:"1.0",author:"system"},{id:"test",name:"Write Tests",description:"Generate unit tests for code",enabled:true,category:"Testing",icon:"馃И",tags:["test","unit-test"],trigger:"test",injection:"lazy",systemPrompt:"You are a testing expert. Write comprehensive unit tests covering normal cases, edge cases, and error conditions. Use the appropriate testing framework for the project.",requiredTools:["read","write"],source:"built-in",editable:false,version:"1.0",author:"system"},{id:"document",name:"Document",description:"Generate documentation for code",enabled:true,category:"Documentation",icon:"馃摑",tags:["doc","documentation"],trigger:"doc",injection:"lazy",systemPrompt:"You are a technical writer. Generate clear, comprehensive documentation including API docs, inline comments, and usage examples.",requiredTools:["read","write"],source:"built-in",editable:false,version:"1.0",author:"system"}];for(const $8 of p)K8($8)}C8();const A8=H8();const M8=A1(Z,"skill-marketplaces.json");const l8=A1(Z,"skill-market-cache.json");const I8=[{id:"superpowers",name:"Superpowers",url:"https://github.com/obra/superpowers",builtin:true,description:"Claude Code skill collection: brainstorming, systematic debugging, TDD, plan writing, code review and more"},{id:"anthropics-skills",name:"Anthropic Skills",url:"https://github.com/anthropics/skills",builtin:true,description:"Official Anthropic skill library: docx/pdf/pptx/xlsx generation, frontend design, mcp-builder, skill-creator and more"},{id:"agentic-curated",name:"Agentic 精选技能",url:"builtin://agentic-curated",builtin:true,description:"从 agentic-awesome-skills(2000+ 社区技能库)精选的零配置安全技能,随应用离线内置,无需联网"}];const l6=new Map;function $6(){return(process.env.DEEPSEEKCODE_GITHUB_MIRROR||process.env.DSC_GITHUB_MIRROR||"").trim()}function X6(p){const $8=$6();if(!$8)return p;return $8.replace(/\/+$/,"")+"/"+p}function p6(p){try{const $8=new URL(p);return $8.hostname==="github.com"||$8.hostname==="www.github.com"}catch{return/^https?:\/\/github\.com\//i.test(p)}}function v6(p){if(!p)return false;if(/^[a-zA-Z]:[\\/]/.test(p))return true;if(/^\/[^/]/.test(p)||/^\.\.?[\\/]/.test(p))return true;return false}function x1(p){return p.split("/").includes("skills")&&/(^|\/)(SKILL\.md|.+\.skill\.md)$/i.test(p)}function M1(){try{if(u7(l8)){const p=JSON.parse(N0(l8,"utf8"));if(p&&typeof p==="object")return p}}catch(p){z0.warn("market.cache_load_failed","Failed to load marketplace cache",String(p))}return{}}function _1(p,$8){try{const a=M1();a[p]=$8;b9(Z,{recursive:true});e5(l8,JSON.stringify(a,null,2),"utf8")}catch(a){z0.warn("market.cache_save_failed","Failed to save marketplace cache",String(a))}}function A7(p){try{const $8=M1();if(p in $8){delete $8[p];b9(Z,{recursive:true});e5(l8,JSON.stringify($8,null,2),"utf8")}}catch($8){z0.warn("market.cache_clear_failed","Failed to clear marketplace cache",String($8))}}function W7(){try{if(!u7(M8))return[];const p=JSON.parse(N0(M8,"utf8"));return Array.isArray(p)?p.filter(($8)=>$8&&typeof $8.url==="string"):[]}catch(p){z0.warn("marketplaces.load_failed","Failed to load skill marketplaces",String(p));return[]}}function T0(p){b9(Z,{recursive:true});e5(M8,JSON.stringify(p,null,2),"utf8")}function W0(){const p=[process.env.DEEPSEEKCODE_SKILLS_LIBRARY||process.env.DSC_SKILLS_LIBRARY||"",A1(aO8(),".agent","skills-library"),"D:/agent/agentic-awesome-skills"];for(const $8 of p){if(!$8)continue;try{if(u7($8)&&t5($8).isDirectory())return $8}catch{}}return null}function B7(){const p=W7();const $8=[...I8];const a=W0();if(a){$8.push({id:"agentic-awesome-local",name:"本地技能库",url:a,builtin:true,description:"本机 agentic-awesome-skills 技能库(自动发现,完全离线)"})}const s=new Set($8.map((u8)=>u8.id));const U8=new Set($8.map((u8)=>u8.url.replace(/[\\/]+$/,"")));return[...$8,...p.filter((u8)=>!s.has(u8.id)&&!U8.has(u8.url.replace(/[\\/]+$/,"")))]}function z1(p){if(v6(p)){const u8=p.replace(/[\\/]+$/,"").split(/[\\/]/).pop()||"local";const j6=u8.replace(/[^a-zA-Z0-9_-]+/g,"-").toLowerCase();return j6||"local"}const $8=p.replace(/^https?:\/\//i,"").replace(/[?#].*$/,"").replace(/\/+$/,"");const a=$8.split("/");const s=a[a.length-1]||a[a.length-2]||"market";const U8=s.replace(/\.(json|md)$/i,"").replace(/[^a-zA-Z0-9_-]+/g,"-").toLowerCase();return U8||"market"}function K7(p,$8){try{return new URL($8,p).href}catch{return $8}}async function j7(p,$8=GC){const a=await fetch(p,{headers:{"User-Agent":"deepseekcode-server"},signal:AbortSignal.timeout($8)});if(!a.ok)throw new Error(`HTTP ${a.status} for ${p}`);return a.text()}async function c7(p,$8){return JSON.parse(await j7(p,$8))}const Y9=["https://ghfast.top/","https://gh-proxy.com/","https://mirror.ghproxy.com/"];async function Q4(p,$8){const a=[];const s=[p];if(!$6()&&/^https:\/\/raw\.githubusercontent\.com\//i.test(p)){for(const u8 of Y9)s.push(u8+p)}let U8;for(let u8=0;u8<s.length;u8++){const j6=u8===0?Math.min($8,GC):$8;try{return await j7(s[u8],j6)}catch(h){U8=h;a.push(`${s[u8]}: ${h instanceof Error?h.message:String(h)}`)}}throw new Error(a.join(" | ")||(U8 instanceof Error?U8.message:String(U8)))}function s4(p,$8,a,s){const U8=(u8)=>u8.split("/").map(encodeURIComponent).join("/");return X6(`https://raw.githubusercontent.com/${U8(p)}/${U8($8)}/${U8(a)}/${U8(s)}`)}async function Tz(p){const $8=p.url.match(/github\.com\/([^/]+)\/([^/?#]+)/i);if(!$8)throw new Error("Not a GitHub repository URL: "+p.url);const a=$8[1];const s=$8[2].replace(/\.git$/i,"");let U8="main";let u8=[];let j6="";try{const Z8=await c7(X6(`https://api.github.com/repos/${a}/${s}`));U8=Z8.default_branch||"main";const j8=await c7(X6(`https://api.github.com/repos/${a}/${s}/git/trees/${encodeURIComponent(U8)}?recursive=1`));u8=(j8.tree||[]).filter((S8)=>S8.type==="blob"&&S8.path&&x1(S8.path)).map((S8)=>S8.path)}catch(Z8){j6=Z8 instanceof Error?Z8.message:String(Z8)}if(u8.length===0){const Z8=await p$6(p.url);if(Z8.code===0&&Z8.files.length>0){u8=Z8.files.filter(x1);if(Z8.branch)U8=Z8.branch}else{const j8=[j6&&`GitHub API: ${j6}`,Z8.error&&`git: ${Z8.error}`].filter(Boolean).join("; ");throw new Error(`Unable to list repository files (${j8||"empty tree"})`)}}const h=new Map;for(const Z8 of u8){const j8=/(^|\/)SKILL\.md$/i.test(Z8);const S8=Z8.replace(/\/[^/]+$/,"");if(!h.has(S8)||j8)h.set(S8,Z8)}const c=[];for(const Z8 of h.values()){const j8=Z8.split("/").pop()||Z8;const S8=Z8.replace(/\/[^/]+$/,"");const E8=/^SKILL\.md$/i.test(j8)?S8.split("/").pop()||S8:j8.replace(/\.skill\.md$/i,"");const x8=E8.replace(/[^a-zA-Z0-9_-]+/g,"-");c.push({id:x8,name:x8,description:"",category:"GitHub",icon:"⭐",tags:["github"],author:`${a}/${s}`,version:U8,path:Z8,rawUrl:s4(a,s,U8,Z8)})}return{name:p.name,skills:c,fetchedAt:new Date().toISOString()}}async function S2(p){const $8=await c7(p.url);const a=p.url.split("/").slice(0,-1).join("/")+"/";const s=($8.skills||[]).map((U8)=>{const u8=String(U8.id||U8.name||"skill").replace(/[^a-zA-Z0-9_-]+/g,"-");return{id:u8,name:String(U8.name||u8),description:String(U8.description||""),category:String(U8.category||"Marketplace"),icon:String(U8.icon||"⭐"),tags:Array.isArray(U8.tags)?U8.tags.map(String):[],author:String(U8.author||"unknown"),version:String(U8.version||"1.0"),path:String(U8.file||U8.url||""),rawUrl:U8.content?"":K7(a,String(U8.file||U8.url||"")),content:U8.content}});return{name:String($8.name||p.name),skills:s,fetchedAt:new Date().toISOString()}}async function Z9(p){const $8=L2(String(p.url));if(!u7($8))throw new Error(`Directory not found: ${$8}`);if(!t5($8).isDirectory())throw new Error(`Not a directory: ${$8}`);const a=A1($8,"skills_index.json");const s=A1($8,"skills");const U8=[];if(u7(a)){const u8=JSON.parse(N0(a,"utf8"));if(Array.isArray(u8)){for(const j6 of u8){const h=String(j6.path||"");const c=String(j6.id||h.split("/").pop()||"").replace(/[^a-zA-Z0-9_-]+/g,"-");if(!c||!h)continue;U8.push({id:c,name:String(j6.name||c),description:String(j6.description||""),category:String(j6.category||"Uncategorized"),icon:"⭐",tags:Array.isArray(j6.tags)?j6.tags.map(String):[],author:String(j6.source||"community"),version:String(j6.version||"1.0"),path:h.replace(/[\\/]+$/,""),rawUrl:"",risk:j6.risk?String(j6.risk):undefined})}if(U8.length>0){return{name:p.name,skills:U8,fetchedAt:new Date().toISOString()}}}}if(!u7(s)){if(U8.length===0)throw new Error(`No skills/ directory or skills_index.json under ${$8}`)}else{for(const u8 of aH(s,{withFileTypes:true})){if(!u8.isDirectory())continue;const j6=w2(A1(s,u8.name));if(!j6)continue;const h=r(N0(j6,"utf8"));const c=h?.frontmatter||{};const Z8=u8.name.replace(/[^a-zA-Z0-9_-]+/g,"-");U8.push({id:Z8,name:String(c.name||Z8),description:String(c.description||""),category:String(c.category||"Local"),icon:"⭐",tags:Array.isArray(c.tags)?c.tags.map(String):[],author:String(c.author||"local"),version:String(c.version||"1.0"),path:A1("skills",u8.name).split("\\").join("/"),rawUrl:"",risk:c.risk?String(c.risk):undefined})}}if(U8.length===0)throw new Error(`No skills found under ${$8}`);return{name:p.name,skills:U8,fetchedAt:new Date().toISOString()}}function w2(p){const $8=A1(p,"SKILL.md");if(u7($8)&&t5($8).isFile())return $8;try{for(const a of aH(p)){if(/\.skill\.md$/i.test(a)&&t5(A1(p,a)).isFile())return A1(p,a)}}catch{}return null}function Sz(){const p=Gj6;const $8=(p.skills||[]).map((a)=>({id:String(a.id||a.name||"skill").replace(/[^a-zA-Z0-9_-]+/g,"-"),name:String(a.name||a.id||"skill"),description:String(a.description||""),category:String(a.category||"Curated"),icon:"⭐",tags:[],author:"community",version:String(p.version||"1.0"),path:String(a.id||""),rawUrl:"",content:String(a.content||""),risk:a.risk?String(a.risk):undefined}));return{name:String(p.name||"Agentic 精选技能"),skills:$8,fetchedAt:new Date().toISOString()}}async function f6(p){let $8;if(p.url==="builtin://agentic-curated")$8=Sz();else if(v6(p.url))$8=await Z9(p);else if(p6(p.url))$8=await Tz(p);else $8=await S2(p);l6.set(p.id,$8);_1(p.id,$8);return $8}async function M5(p){const $8=l6.get(p.id);if($8)return $8;const a=M1()[p.id];if(a&&Array.isArray(a.skills)&&a.skills.length>0){l6.set(p.id,a);return a}return f6(p)}async function OY(p,$8){const a=await M5(p);const s=a.skills.find((Z8)=>Z8.id===$8);if(!s)throw new Error(`Skill "${$8}" not found in marketplace "${p.name}"`);let U8=s.content;if(!U8&&v6(p.url)&&s.path){const Z8=A1(L2(String(p.url)),s.path);const j8=w2(Z8);if(!j8)throw new Error(`Skill "${$8}" not found on disk at ${Z8}`);U8=N0(j8,"utf8")}if(!U8){if(!s.rawUrl)throw new Error(`Skill "${$8}" has no downloadable content`);U8=await Q4(s.rawUrl,zj6)}const u8=r(U8);const j6=u8?.frontmatter||{};const h=String(j6.id||s.id).replace(/[^a-zA-Z0-9_-]+/g,"-");const c={id:h,name:String(j6.name||s.name||h),description:String(j6.description||s.description||""),enabled:j6.enabled!==false,category:String(j6.category||s.category||"Marketplace"),icon:String(j6.icon||s.icon||"⭐"),tags:Array.isArray(j6.tags)?j6.tags.map(String):s.tags,trigger:String(j6.trigger||""),injection:j6.injection==="eager"||j6.injection==="on_demand"?j6.injection:"lazy",systemPrompt:u8?.body||U8,requiredTools:Array.isArray(j6.tools)?j6.tools.map(String):[],source:"marketplace",editable:j6.editable!==false,version:String(j6.version||s.version||"1.0"),author:String(j6.author||s.author||p.name),provenance:"marketplace",marketplace:p.id,marketUrl:s.rawUrl||s.path};K8(c);A8.set(h,c);try{A.skills.loadAll()}catch{}return c}async function c0(p,$8){const a=$8.pathname;const s=p.method.toUpperCase();if(s==="OPTIONS")return d(F8({}));const U8={runtime:A,getApiKey:()=>U.load()?.apiKey||null};if(a==="/v1/chat/completions"&&s==="POST"){const{handleChatCompletions:u8}=await Promise.resolve().then(()=>Bm);return u8(p,U8)}if(a==="/v1/models"&&s==="GET"){const{handleModels:u8}=await Promise.resolve().then(()=>Bm);return u8(p,U8)}return null}function O0(){return[{category:"TOOL",events:[{name:"PRE_TOOL_USE",summary:"Intercept before tool execution",hasMatcher:true,matcherField:"toolNamePattern"},{name:"POST_TOOL_USE",summary:"Post tool execution",hasMatcher:true,matcherField:"toolNamePattern"},{name:"POST_TOOL_USE_FAILURE",summary:"Tool execution failed",hasMatcher:true,matcherField:"toolNamePattern"},{name:"PERMISSION_DENIED",summary:"Permission denied",hasMatcher:false},{name:"PERMISSION_REQUEST",summary:"Permission request",hasMatcher:false}]},{category:"SESSION",events:[{name:"SESSION_START",summary:"Session started",hasMatcher:false},{name:"SESSION_END",summary:"Session ended",hasMatcher:false},{name:"STOP",summary:"Generation stopped",hasMatcher:false},{name:"STOP_FAILURE",summary:"Stop failed",hasMatcher:false},{name:"NOTIFICATION",summary:"System notification",hasMatcher:false}]},{category:"CONTEXT",events:[{name:"PRE_COMPACT",summary:"Before context compaction",hasMatcher:false},{name:"POST_COMPACT",summary:"After context compaction",hasMatcher:false},{name:"PRE_CONTEXT_RESET",summary:"Before context reset",hasMatcher:false},{name:"POST_CONTEXT_RESET",summary:"After context reset",hasMatcher:false}]},{category:"STATE_MACHINE",events:[{name:"STATE_TRANSITION",summary:"",hasMatcher:true,matcherField:"fromState"},{name:"STATE_ENTERED",summary:"",hasMatcher:true,matcherField:"fromState"}]},{category:"TASK",events:[{name:"USER_PROMPT_SUBMIT",summary:"User submitted prompt",hasMatcher:false},{name:"SUBAGENT_START",summary:"Subagent started",hasMatcher:false},{name:"SUBAGENT_STOP",summary:"Subagent stopped",hasMatcher:false},{name:"TASK_CREATED",summary:"Task created",hasMatcher:false},{name:"TASK_COMPLETED",summary:"Task completed",hasMatcher:false},{name:"TEAMMATE_IDLE",summary:"Teammate idle",hasMatcher:false}]},{category:"A2A",events:[{name:"TASK_DISPATCH",summary:"Task dispatched",hasMatcher:false},{name:"A2A_REMOTE_INTERCEPT",summary:"Remote intercept",hasMatcher:false}]},{category:"CONFIG",events:[{name:"CONFIG_CHANGE",summary:"Configuration changed",hasMatcher:false},{name:"INSTRUCTIONS_LOADED",summary:"Instructions loaded",hasMatcher:false},{name:"CWD_CHANGED",summary:"Working directory changed",hasMatcher:false},{name:"FILE_CHANGED",summary:"File changed",hasMatcher:false}]}]}function wz(){return[{id:"main",name:"Main",description:"Primary orchestration agent - general task processing"},{id:"code-reviewer",name:"Code Reviewer",description:"Code review specialist agent"},{id:"debugger",name:"Debugger",description:"Debug analysis specialist agent"}]}function M7(p){if(!G)return true;const $8=p.headers.get("authorization")||"";if($8.startsWith("Bearer ")){if($8.slice(7).trim()===G)return true}return p.headers.get("x-api-token")===G}async function h9(p,$8){const a=$8.pathname;const s=p.method.toUpperCase();if(s==="OPTIONS")return d(F8({}));if(a==="/api/health")return d(F8({status:"ok"}));if(G&&!M7(p)){return d({ok:false,error:"Unauthorized: missing or invalid API token (Authorization: Bearer <token>). Set DEEPSEEKCODE_API_TOKEN on the server."},401)}if(a==="/api/weixin/bind"&&s==="GET"){try{const{fetchWebQrCode:h}=await Promise.resolve().then(()=>(m0(),$4));const c=await h();return d(F8(c))}catch(h){return d(t8(`Failed to fetch WeChat QR code: ${h instanceof Error?h.message:String(h)}`),500)}}if(a==="/api/weixin/bind/status"&&s==="GET"){const h=$8.searchParams.get("qrcode")||"";if(!h)return d(t8("缺少 qrcode 参数"),400);try{const{checkWebQrStatus:c}=await Promise.resolve().then(()=>(m0(),$4));const Z8=await c({qrcode:h});if(Z8.status==="confirmed"&&Z8.ilink_bot_id){try{const{saveWeixinAccount:j8,registerWeixinAccountId:S8,clearStaleAccountsForUserId:E8}=await Promise.resolve().then(()=>(m0(),$4));const x8=String(Z8.ilink_bot_id).replace(/@im\.bot$/,"").replace(/@/g,"-");const K6=Z8.baseurl||"https://ilinkai.weixin.qq.com";j8(x8,{token:Z8.bot_token||"",baseUrl:K6,userId:Z8.ilink_user_id});S8(x8);if(Z8.ilink_user_id){E8(x8,Z8.ilink_user_id)}await y6(x8,K6,Z8.ilink_user_id)}catch(j8){z0.error("weixin.bind_persist_failed","Failed to persist WeChat bind result",String(j8))}}return d(F8(Z8))}catch(c){return d(t8(`Failed to check binding status: ${c instanceof Error?c.message:String(c)}`),500)}}if(a==="/api/system/status"){const h=q8();return d(F8({status:"running",runtime:"typescript",product:"deepseekcode",uptime:Math.floor((Date.now()-O)/1000),memory:{used:process.memoryUsage().heapUsed,total:process.memoryUsage().heapTotal,max:process.memoryUsage().rss},models:{total:h.length,online:h.filter((c)=>c.status==="online").length,offline:h.filter((c)=>c.status!=="online").length},timestamp:Date.now()}))}if(a==="/api/system/shutdown"){if(z.onShutdown){setImmediate(z.onShutdown);return d(F8({message:"Shutting down..."}))}setImmediate(()=>{try{vz.close()}catch{}try{U5.close()}catch{}A.dispose();process.exit(0)});return d(F8({message:"Shutting down..."}))}if(a==="/api/system/restart"){try{A.dispose()}catch{}return d(F8({message:"DeepSeekCode TS server restart initiated — please restart the process manually for full lifecycle reset"}))}if(a==="/api/system/version"){const h=Um();let c=null;try{c=await K$8(h)}catch{c=null}return d(F8({product:"deepseekcode",channel:"stable",current:h,update:c,checkedAt:Date.now(),status:c?c.available?"update-available":"up-to-date":"unknown"}))}if(a==="/api/system/update/check"&&s==="GET"){const h=Um();Xj6();let c=null;try{c=await K$8(h,true)}catch{c=null}return d(F8({product:"deepseekcode",channel:"stable",current:h,update:c,checkedAt:Date.now(),status:c?c.available?"update-available":"up-to-date":"unknown"}))}if(a==="/api/config/provider"){if(s==="GET"){const r6=U.response();const G1=b8();return d(F8({...r6,providers:G1}))}const h=await c8(p);const c=String(h.provider||h.defaultProvider||"");if(!c)return d(t8("provider is required"),400);const Z8="apiKey"in h?h.apiKey:("api_key"in h)?h.api_key:undefined;const j8=Z8!==undefined?String(Z8):undefined;U.save({provider:c,baseUrl:String(h.baseUrl||h.base_url||""),apiKey:j8,model:String(h.model||Array.isArray(h.models)&&h.models[0]?.id||""),maxTokens:h.maxTokens||h.max_tokens,contextWindow:h.contextWindow||h.context_window,temperature:h.temperature});if(Array.isArray(h.models)){const r6=v8();const G1=r6.filter((U7)=>U7.provider!==c);for(let U7=0;U7<h.models.length;U7++){const e1=h.models[U7];const J0=String(e1.id||e1.name||"").trim();if(!J0)continue;const l7=U7===0||e1.isDefault===true;G1.push({id:J0,provider:c,enabled:e1.enabled!==false,isDefault:Boolean(l7),defaultFor:String(e1.defaultFor||""),apiType:String(e1.apiType||h.apiType||"openai-completions"),name:String(e1.name||e1.id||J0),baseUrl:String(e1.baseUrl||h.baseUrl||"")})}T8(G1);e()}const S8=String(h.baseUrl||h.base_url||"");const E8=String(h.apiType||"openai-completions");const x8=Array.isArray(h.models)?h.models.length:0;B(c,{baseUrl:S8,hasApiKey:Boolean(j8),apiType:E8,modelCount:x8});const K6=U.response();const m6=b8();Z6();return d(F8({...K6,providers:m6}))}if(a==="/api/config/provider/remove"&&s==="POST"){const h=await c8(p);const c=String(h.provider||"");if(!c)return d(t8("provider is required"),400);let Z8=v8();Z8=Z8.filter((S8)=>S8.provider!==c);T8(Z8);u(c);const j8=U.load();if(j8.provider===c){const S8=Z8.length>0?Z8[0].provider:"deepseek";const E8=Z8.length>0?Z8[0].id:"";U.save({provider:S8,model:E8})}Z6();return d(F8({removed:true}))}if(a==="/api/providers/presets"&&s==="GET"){const h=!u7(T);if(h){try{const Z8=new Promise((j8)=>setTimeout(j8,3500));await Promise.race([l(1e4).then(()=>{}),Z8])}catch{}}const c=f();l(1e4);return d(F8(c))}if(a==="/api/providers/refresh"&&s==="POST"){let h=null;try{if(u7(T)){h=JSON.parse(N0(T,"utf-8"))}}catch{}l(1e4);if(h){return d(F8({refreshed:true,source:"cache"}))}return d(F8({refreshed:true,message:"Refresh triggered in background"}))}const U8=Z;const u8=["config.yaml","channels.json","hooks.json","system-prompt.md","history.json","daemon.json","settings.json","provider.json","theme.json","mode.json"];const j6=["history.json"];if(a==="/api/config/files"&&s==="GET"){const h=u8.filter((c)=>u7(A1(U8,c))).map((c)=>{try{const Z8=t5(A1(U8,c));return{name:c,size:Z8.size,modified:Z8.mtimeMs,editable:!j6.includes(c)}}catch{return null}}).filter(Boolean);return d(F8(h))}if(a==="/api/config/files/read"&&s==="GET"){const h=String($8.searchParams.get("file")||"");if(!h||!u8.includes(h))return d(t8("Invalid config file name"),400);const c=A1(U8,h);if(!u7(c))return d(t8("File not found"),404);try{const Z8=N0(c,"utf8");return d(F8({name:h,content:Z8,editable:!j6.includes(h)}))}catch(Z8){return d(t8(Z8.message),500)}}if(a==="/api/config/files/write"&&s==="PUT"){const h=await c8(p);const c=String(h.file||"");if(!c||!u8.includes(c))return d(t8("Invalid config file name"),400);if(j6.includes(c))return d(t8("File is read-only"),403);try{b9(U8,{recursive:true});e5(A1(U8,c),String(h.content||""),"utf8");return d(F8({message:`${c} saved`}))}catch(Z8){return d(t8(Z8.message),500)}}if(a==="/api/commands"){const h=$8.searchParams.get("lang")||undefined;return d(F8(h?A.listCommandsLocalized(h):A.listCommands()))}if(a==="/api/models"&&s==="GET")return d(F8({models:q8(),defaultProvider:U.load().provider}));if(a==="/api/models"&&s==="POST"){const h=await c8(p);const c=h.model&&typeof h.model==="object"?h.model:{};const Z8=c.apiKeys;const j8=Array.isArray(Z8)?String(Z8[0]||""):String(Z8||c.apiKey||"");const S8=String(h.provider||c.provider||U.load().provider);const E8=String(c.id||c.name||c.model||U.load().model);const x8=String(c.apiType||"openai-chat-completions");const K6=U.save({provider:S8,model:E8,baseUrl:c.baseUrl||c.base_url,apiKey:j8||undefined,maxTokens:c.maxTokens||c.max_tokens,contextWindow:c.contextWindow||c.context_window,temperature:c.temperature});const m6=v8();J6(m6,E8,S8,c.enabled!==false,false,undefined);const r6=m6.findIndex((G1)=>G1.id.toLowerCase()===E8.toLowerCase());if(r6>=0){m6[r6].apiType=x8;if(c.name)m6[r6].name=String(c.name);if(c.baseUrl)m6[r6].baseUrl=String(c.baseUrl)}T8(m6);e();B(S8,{baseUrl:String(c.baseUrl||K6.baseUrl||""),hasApiKey:Boolean(j8||K6.apiKey),apiType:x8,modelCount:m6.filter((G1)=>G1.provider===S8).length});Z6();return d(F8({model:K6,provider:K6.provider,savedTo:"config.yaml+models.json"}))}if(a==="/api/models/update"&&s==="POST"){const h=await c8(p);const c=U.load();const Z8=h.model&&typeof h.model==="object"?h.model:{};const j8=U.save({provider:String(h.provider||c.provider),model:String(Z8.id||Z8.name||Z8.model||h.modelId||c.model),baseUrl:Z8.baseUrl||Z8.base_url||c.baseUrl,maxTokens:Z8.maxTokens||Z8.max_tokens||c.maxTokens,contextWindow:Z8.contextWindow||Z8.context_window||c.contextWindow,temperature:Z8.temperature!==undefined?Z8.temperature:c.temperature});Z6();return d(F8({provider:h.provider||c.provider,modelId:h.modelId||j8.model,model:j8}))}if(a==="/api/models/delete"&&s==="POST"){const h=await c8(p);const c=String(h.modelId||"");const Z8=String(h.provider||"");const j8=U.load();let S8=v8();S8=S8.filter((E8)=>E8.id!==c);T8(S8);e();if(c&&c===j8.model){const E8=S8.find((K6)=>K6.enabled);const x8=E8?.id??"";U.save({model:x8})}Z6();return d(F8({provider:Z8,modelId:c,removed:true}))}if(a==="/api/models/toggle"&&s==="POST"){const h=await c8(p);const c=String(h.modelId||"");let Z8=v8();const j8=Z8.findIndex((x8)=>x8.id===c);const S8=j8>=0?Z8[j8].enabled:true;const E8=h.enabled!==undefined?Boolean(h.enabled):!S8;J6(Z8,c,String(h.provider||""),E8);T8(Z8);e();Z6();return d(F8({provider:String(h.provider||""),modelId:c,enabled:E8}))}if(a==="/api/models/defaults"&&s==="POST"){const h=await c8(p);const c=U.load();let Z8=v8();const j8=(x8)=>{if(Z8.some((m6)=>m6.id===x8))return x8;const K6=x8.indexOf(":");if(K6>0){const m6=x8.slice(K6+1);if(Z8.some((r6)=>r6.id===m6)){for(const r6 of Z8){if(r6.id===x8)delete r6.defaultFor}return m6}}return x8};if(h.global){const x8=j8(String(h.global));U.save({model:x8});J6(Z8,x8,c.provider,true,true)}for(const x8 of["plan","act","goal"]){const K6=h[x8];if(K6===null){for(const m6 of Z8){if(m6.defaultFor===x8)delete m6.defaultFor}}else if(K6){J6(Z8,j8(String(K6)),c.provider,true,false,x8)}}T8(Z8);e8();Z6();const S8=j8(String(h.global||c.model));const E8=(x8)=>Z8.find((K6)=>K6.defaultFor===x8)?.id;return d(F8({defaults:{global:S8,plan:String(h.plan?j8(String(h.plan)):E8("plan")||S8),act:String(h.act?j8(String(h.act)):E8("act")||S8),goal:String(h.goal?j8(String(h.goal)):E8("goal")||S8)}}))}if(a==="/api/models/fetch"&&s==="POST"){const h=await c8(p);const c=String(h.baseUrl||"").trim().replace(/\/+$/,"");const Z8=String(h.apiKey||"").trim();const j8=Z8.replace(/[^\x00-\xFF]/g,"");if(Z8&&Z8!==j8){console.warn(`[API] API Key contains non-Latin-1 characters (e.g. •). Stripped for fetch request.`)}const S8=j8||(U.load().apiKey||"");if(!c)return d(t8("Base URL is required"),400);const E8=c.endsWith("/v1")||c.endsWith("/v1beta")?c:`${c}/v1`;const x8=[...c.endsWith("/models")?[c]:[`${c}/models`,`${E8}/models`],...c.includes("/anthropic")||c.includes("/coding")||c.includes("/step_plan")||c.includes("/compatible")||c.includes("/claude")?(()=>{const G1=c.replace(/\/+(api\/|apps\/)?(anthropic|coding|step_plan|compatible|claudecode|claude)\/?.*$/,"");return G1&&G1.includes("://")?[`${G1}/v1/models`,`${G1}/models`]:[]})():[]];const K6=new Set;const m6=x8.filter((G1)=>{const U7=G1.toLowerCase();return K6.has(U7)?false:(K6.add(U7),true)});let r6="";for(const G1 of m6){try{const U7={"content-type":"application/json"};if(S8)U7.authorization=`Bearer ${S8}`;const e1=await fetch(G1,{headers:U7,signal:AbortSignal.timeout(GC)});if(!e1.ok){if(e1.status===404||e1.status===405)continue;r6=`HTTP ${e1.status}`;break}const J0=await e1.json();let l7=(Array.isArray(J0.data)?J0.data:[]).filter((q7)=>q7&&typeof q7==="object"&&q7.id).map((q7)=>({id:String(q7.id),name:String(q7.id)}));if(l7.length===0&&Array.isArray(J0.models)){l7=J0.models.filter((q7)=>q7&&typeof q7==="object"&&q7.name).map((q7)=>{const t4=String(q7.name||"").replace(/^models\//,"");return{id:t4,name:t4}})}if(l7.length===0&&Array.isArray(J0)){l7=J0.filter((q7)=>q7&&typeof q7==="object"&&q7.id).map((q7)=>({id:String(q7.id),name:String(q7.id)}))}if(l7.length>0){const q7=new Set;l7=l7.filter((t4)=>{const A4=t4.id;return q7.has(A4)?false:(q7.add(A4),true)});return d(F8({models:l7,url:G1}))}r6=`No models found in response from ${G1}`}catch(U7){r6=U7.message}}return d(t8(r6||"Failed to fetch models"),400)}if(a.startsWith("/api/models/")){const h=a.split("/");const c=decodeURIComponent(h[3]||"");if(h.length>4){if(h[4]==="test"&&s==="POST"){const Z8=await c8(p);const j8=String(Z8.baseUrl||"");const S8=String(Z8.apiKey||"");const E8=j8||U.load().baseUrl||"";const x8=S8||U.load().apiKey||"";const K6=x8.replace(/[^\x00-\xFF]/g,"");if(!E8)return d(t8("No base URL configured"),400);const m6={"content-type":"application/json"};if(K6)m6.authorization=`Bearer ${K6}`;const r6=X8(E8);let G1="";for(const U7 of r6){try{const e1=await fetch(U7,{headers:m6,signal:AbortSignal.timeout(e$6)});const J0=e1.ok||e1.status===401||e1.status===403;return d(F8({connected:J0,status:e1.status,message:J0?"Connected":`HTTP ${e1.status}`}))}catch(e1){G1=e1.message}}return d(F8({connected:false,message:G1||"All endpoints failed"}))}return d(t8(`Unhandled endpoint: ${s} ${a}`),404)}if(s==="GET"){const Z8=q8().find((j8)=>j8.id===c);return Z8?d(F8(Z8)):d(t8("Model not found"),404)}return d(t8(`Unhandled endpoint: ${s} ${a}`),404)}if(a==="/api/tools")return d(F8(y.listApiTools()));if(a.startsWith("/api/tools/")){const h=a.split("/");const c=decodeURIComponent(h[3]||"");if(h.length>4){if(h[4]==="toggle"&&s==="POST"){const Z8=await c8(p);const j8=Z8.enabled!==undefined?Boolean(Z8.enabled):true;const S8=y.setToolEnabled(c,j8);if(!S8)return d(t8("Tool not found"),404);return d(F8({id:c,enabled:j8}))}return d(t8(`Unhandled endpoint: ${s} ${a}`),404)}if(s==="GET"){const Z8=y.listApiTools();const j8=Z8.find((S8)=>S8.id===c);return j8?d(F8(j8)):d(t8("Tool not found"),404)}if(s==="PUT"){const Z8=await c8(p);const j8=y.listApiTools();const S8=j8.find((E8)=>E8.id===c);if(!S8)return d(t8("Tool not found"),404);if(Z8.enabled!==undefined)y.setToolEnabled(c,Boolean(Z8.enabled));return d(F8(y.listApiTools().find((E8)=>E8.id===c)))}return d(t8(`Unhandled endpoint: ${s} ${a}`),404)}if(a==="/api/skills"&&s==="GET")return d(F8(Array.from(A8.values())));if(a==="/api/skills"&&s==="POST"){const h=await c8(p);if(!h.id)return d(t8("Skill ID is required"),400);const c={id:h.id,name:h.name||h.id,description:h.description||"",enabled:h.enabled!==false,category:h.category||"General",icon:h.icon||"star",tags:h.tags||[],trigger:h.trigger||"",injection:h.injection||"lazy",systemPrompt:h.systemPrompt||"",requiredTools:h.requiredTools||[],source:"user",editable:true,version:h.version||"1.0",author:"user",provenance:"manual"};A8.set(c.id,c);K8(c);return d(F8(c))}if(a.startsWith("/api/skills/import")&&s==="POST"){const h=await c8(p);const c=h.id||h.fileName?.replace(/\.(skill\.md|md|txt)$/i,"")||"imported-"+Date.now();const Z8={id:c,name:h.name||c,description:h.description||"Imported skill",enabled:true,category:"Imported",icon:"馃摝",tags:h.tags||[],trigger:h.trigger||"",injection:h.injection||"lazy",systemPrompt:h.content||h.systemPrompt||"",requiredTools:h.requiredTools||[],source:"imported",editable:true,version:h.version||"1.0",author:"user",provenance:"import"};A8.set(Z8.id,Z8);K8(Z8);return d(F8(Z8))}if(a==="/api/skills/marketplaces"&&s==="GET"){const h=B7();const c=Array.from(A8.values()).filter((S8)=>S8.source==="marketplace"||S8.provenance==="marketplace").map((S8)=>S8.id);const Z8=await Promise.all(h.map(async(S8)=>{try{const E8=await M5(S8);return{id:S8.id,entry:{name:E8.name,skills:E8.skills,fetchedAt:E8.fetchedAt}}}catch(E8){return{id:S8.id,entry:{name:S8.name,skills:[],fetchedAt:"",error:E8 instanceof Error?E8.message:String(E8)}}}}));const j8={};for(const{id:S8,entry:E8}of Z8)j8[S8]=E8;return d(F8({marketplaces:h,installed:c,indexes:j8}))}if(a==="/api/skills/marketplaces"&&s==="POST"){const h=await c8(p);const c=String(h.url||"").trim();if(!/^https?:\/\//i.test(c)&&!v6(c)){return d(t8("A valid URL is required (GitHub repo, index.json, or a local skills folder)"),400)}const Z8=String(h.id||z1(c));const j8={id:Z8,name:String(h.name||Z8),url:c,builtin:false,description:String(h.description||""),addedAt:new Date().toISOString()};const S8=W7();const E8=S8.find((x8)=>x8.id===Z8);if(E8)E8.url=c;else{S8.push(j8);T0(S8)}try{const x8=await f6(j8);return d(F8({marketplace:j8,index:{name:x8.name,skills:x8.skills,fetchedAt:x8.fetchedAt}}))}catch(x8){return d(t8("Marketplace unreachable: "+(x8 instanceof Error?x8.message:String(x8))),502)}}if(a.startsWith("/api/skills/marketplaces/")){const h=a.split("/");const c=decodeURIComponent(h[4]||"");const Z8=B7().find((S8)=>S8.id===c);if(!Z8)return d(t8("Marketplace not found"),404);if(s==="GET"){try{const S8=await M5(Z8);return d(F8({marketplace:Z8,index:{name:S8.name,skills:S8.skills,fetchedAt:S8.fetchedAt}}))}catch(S8){return d(t8("Failed to load index: "+(S8 instanceof Error?S8.message:String(S8))),502)}}const j8=h[5];if(j8==="refresh"&&s==="POST"){l6.delete(c);A7(c);try{const S8=await f6(Z8);return d(F8({marketplace:Z8,index:{name:S8.name,skills:S8.skills,fetchedAt:S8.fetchedAt}}))}catch(S8){return d(t8("Refresh failed: "+(S8 instanceof Error?S8.message:String(S8))),502)}}if(j8==="install"&&s==="POST"){const S8=await c8(p);try{const E8=await OY(Z8,String(S8.skillId||""));return d(F8(E8))}catch(E8){return d(t8("Install failed: "+(E8 instanceof Error?E8.message:String(E8))),502)}}if(s==="DELETE"){if(Z8.builtin)return d(t8("Built-in marketplaces cannot be removed"),400);const S8=W7();T0(S8.filter((E8)=>E8.id!==c));l6.delete(c);A7(c);return d(F8({deleted:true}))}return d(t8(`Unhandled endpoint: ${s} ${a}`),404)}if(a.startsWith("/api/skills/")){const h=a.split("/");const c=decodeURIComponent(h[3]);if(!c)return d(t8("Skill ID is required"),400);if(h[4]==="toggle"&&s==="POST"){const Z8=await c8(p);const j8=A8.get(c);if(!j8)return d(t8("Skill not found"),404);j8.enabled=Z8.enabled!==undefined?Z8.enabled:!j8.enabled;A8.set(c,j8);K8(j8);return d(F8(j8))}if(s==="GET"){const Z8=A8.get(c);return Z8?d(F8(Z8)):d(t8("Skill not found"),404)}if(s==="PUT"){const Z8=A8.get(c);if(!Z8)return d(t8("Skill not found"),404);const j8=await c8(p);Object.assign(Z8,j8,{id:c});A8.set(c,Z8);K8(Z8);return d(F8(Z8))}if(s==="DELETE"){if(!A8.has(c))return d(t8("Skill not found"),404);A8.delete(c);_8(c);return d(F8({deleted:true}))}return d(F8({message:"Skill endpoint"}))}if(a==="/api/agents"&&s==="GET")return d(F8(Array.from(O8.values())));if(a==="/api/agents"&&s==="POST"){const h=await c8(p);const c=String(h.id||h.name||`agent-${Date.now()}`).replace(/[^a-zA-Z0-9_-]/g,"-").toLowerCase();const Z8={id:c,name:String(h.name||c),description:String(h.description||""),color:String(h.color||"#58a6ff"),active:Boolean(h.active),enabled:h.enabled!==false,instanceCount:Number(h.instanceCount||1),state:h.state==="busy"||h.state==="error"?h.state:"idle",modelBinding:h.modelBinding||{mode:"mode-default"}};O8.set(c,Z8);return d(F8(Z8),201)}if(a.startsWith("/api/agents/")){const h=a.split("/");const c=decodeURIComponent(h[3]||"");const Z8=O8.get(c);if(!Z8)return d(t8("Agent not found"),404);if(h.length===4&&s==="GET")return d(F8(Z8));if(h.length===4&&s==="PUT"){const j8=await c8(p);const S8={...Z8,...j8,id:c};O8.set(c,S8);return d(F8(S8))}if(h.length===4&&s==="DELETE"){if(c==="main")return d(t8("Cannot delete the main agent"),400);O8.delete(c);return d(F8({deleted:true}))}if(h[4]==="activate"&&s==="POST"){for(const[j8,S8]of O8)O8.set(j8,{...S8,active:j8===c});return d(F8({agentId:c,active:true}))}if(h[4]==="toggle"&&s==="POST"){const j8=await c8(p);const S8=j8.enabled!==undefined?Boolean(j8.enabled):!Z8.enabled;const E8={...Z8,enabled:S8,state:S8?"idle":"idle"};O8.set(c,E8);return d(F8({agentId:c,enabled:S8,instanceCount:E8.instanceCount,state:E8.state}))}if(h[4]==="model"&&s==="POST"){const j8=await c8(p);const S8={mode:j8.mode==="specified"?"specified":"mode-default",...j8.modelRef?{modelRef:String(j8.modelRef)}:{}};const E8={...Z8,modelBinding:S8};O8.set(c,E8);return d(F8({agentId:c,...S8}))}return d(t8(`Unhandled endpoint: ${s} ${a}`),404)}if(a==="/api/sessions"&&s==="GET")return d(F8(C.list()));if(a==="/api/sessions"&&s==="POST"){const h=await c8(p);const c=h.sessionId?C.ensure(String(h.sessionId),h.title||"New Session"):C.create(h.title||"New Session");const{messages:Z8,...j8}=c;return d(F8(j8))}if(a.startsWith("/api/sessions/")){const h=a.split("/");const c=h[3];if(h[4]==="messages")return d(F8(C.getMessages(c)));if(h[4]==="resume"){return d(F8(C.resumeSnapshot(c,{tasks:A.listTasks(),pendingApprovals:L.list()})))}if(s==="DELETE"){C.delete(c);return d(F8({deleted:true}))}const Z8=C.get(c);return Z8?d(F8(Z8)):d(t8("Session not found"),404)}if(a==="/api/tasks"&&s==="GET")return d(F8(A.listTasks()));if(a==="/api/tasks"&&s==="POST")return d(F8(A.createTask(await c8(p))));if(a==="/api/tasks"&&s==="DELETE"){let h=0;for(const c of A.listTasks()){if(["COMPLETED","FAILED","CANCELLED"].includes(c.status)){A.deleteTask(c.id);h+=1}}return d(F8({deleted:h}))}if(a.startsWith("/api/tasks/")){const h=a.split("/");const c=h[3];const Z8=A.getTask(c);if(!Z8)return d(t8("Task not found"),404);if(s==="DELETE"){A.deleteTask(Z8.id);return d(F8({deleted:true}))}if(s==="PUT"||s==="PATCH"){const j8=await c8(p);A.updateTask(c,{...h[4]==="status"?{status:j8.status}:j8,updatedAt:P6()});return d(F8(A.getTask(c)))}if(h[4]==="stop")return d(F8(A.stopTask(c)));if(h[4]==="output"){if(s==="POST"){const j8=await c8(p);return d(F8(A.addTaskOutput(c,j8.line||j8.output||"")))}return d(F8(A.getTaskOutput(c)))}return d(F8(Z8))}if(a==="/api/plans"&&s==="GET"){try{const h=A.plans.list();return d(F8(h))}catch(h){return d(t8(h.message),500)}}if(a.startsWith("/api/plans/")&&s==="GET"){const h=a.split("/");const c=decodeURIComponent(h[3]);const Z8=A.plans.read(c);if(!Z8)return d(t8("Plan not found"),404);return d(F8({...Z8,slug:c}))}if(a.startsWith("/api/plans/")&&s==="DELETE"){const h=a.split("/");const c=decodeURIComponent(h[3]);const Z8=A.plans.delete(c);if(!Z8)return d(t8("Plan not found"),404);return d(F8({deleted:true}))}if(a==="/api/files"&&s==="GET"){try{const h=z6($8.searchParams.get("path")||".");return d(F8([L6(h)]))}catch(h){return d(t8(h.message),400)}}if(a==="/api/files/read"&&s==="GET"){try{return d(F8(N0(z6($8.searchParams.get("path")||""),"utf8")))}catch(h){return d(t8(h.message),400)}}if(a==="/api/files/write"&&s==="PUT"||a==="/api/files"&&s==="POST"||a==="/api/files/upload"&&s==="POST"){const h=await c8(p);try{const c=z6(h.path);b9(L2(c,".."),{recursive:true});e5(c,String(h.content||""),h.base64?"base64":"utf8");return d(F8({path:h.path,size:t5(c).size}))}catch(c){return d(t8(c.message),400)}}if(a==="/api/files"&&s==="DELETE"){try{const h=z6($8.searchParams.get("path")||"");iO8(h);return d(F8({deleted:true}))}catch(h){return d(t8(h.message),400)}}if(a==="/api/files/download"&&s==="GET"){try{return new Response(N0(z6($8.searchParams.get("path")||"")))}catch(h){return d(t8(h.message),400)}}if(a.startsWith("/api/files"))return d(t8(`Unhandled endpoint: ${s} ${a}`),404);if(a==="/api/filejob/parse"&&s==="POST"){const h=await c8(p);try{const c=[];const Z8=Array.isArray(h.files)?h.files:[];const j8=Array.isArray(h.paths)?h.paths:[];if(j8.length===0&&Z8.length===0){return d(t8("Provide either `files` (base64) or `paths` (workspace file paths)."),400)}for(const S8 of Z8){const E8=String(S8?.name||"unnamed");const x8=String(S8?.base64||"");if(!x8)continue;if(x8.length>73400320)throw new Error(`${E8} exceeds the 50MB upload limit`);const K6=zY(E8,Buffer.from(x8,"base64"));c.push(K6.info)}for(const S8 of j8){const E8=NK(String(S8));const x8=N0(z6(String(S8)));const K6=zY(E8,x8);c.push(K6.info)}return d(F8(c))}catch(c){return d(t8(c.message),400)}}if(a==="/api/filejob/render"&&s==="POST"){const h=await c8(p);try{const c=h.data||{};const Z8=h.template||{};const j8=String(h.outputFormat||"xlsx");let S8,E8;if(c.path){S8=NK(String(c.path));E8=N0(z6(String(c.path)))}else if(c.base64){S8=String(c.name||"data");E8=Buffer.from(String(c.base64),"base64")}else{return d(t8("`data` must include `path` or `base64`."),400)}let x8,K6;if(Z8.path){x8=NK(String(Z8.path));K6=N0(z6(String(Z8.path)))}else if(Z8.base64){x8=String(Z8.name||"template.txt");K6=Buffer.from(String(Z8.base64),"base64")}else{return d(t8("`template` must include `path` or `base64`."),400)}const m6=zY(S8,E8);const r6=TK(x8);let G1="";if(r6==="docx"){const{parseDocx:P7}=await Promise.resolve().then(()=>(m0(),$4));G1=P7(K6)}else if(r6==="xlsx"||r6==="xls"){const{parseXlsx:P7}=await Promise.resolve().then(()=>(m0(),$4));G1=P7(K6).map((pJ)=>pJ.headers.join(",")).join(`
|
|
4372
4372
|
`)}else{G1=K6.toString("utf8")}const{detectPlaceholders:U7,autoMapPlaceholders:e1,renderDataToBuffer:J0}=await Promise.resolve().then(()=>(m0(),$4));const l7=U7(G1);const q7=Object.keys(m6.rows[0]||{});const t4=Array.isArray(h.mapping)&&h.mapping.length>0?h.mapping.map((P7)=>({placeholder:String(P7.placeholder),field:String(P7.field),fallback:P7.fallback,hitRate:1})):e1(l7.length?l7:q7,q7,m6.rows.length);const A4=J0({data:m6.rows,templateText:l7.length?G1:undefined,outputFormat:j8,outputName:String(h.outputName||"output"),mapping:t4});const I2=A1(".deepseekcode","output",A4.fileName).split("\\").join("/");const Iz=z6(I2);b9(hq(Iz),{recursive:true});e5(Iz,A4.buffer);const yK={fileName:A4.fileName,format:A4.format,size:t5(Iz).size,path:I2,rowCount:A4.rowCount,successCount:A4.successCount,failedRows:A4.failedRows};return d(F8({result:yK,mapping:t4,parsed:m6.info}))}catch(c){return d(t8(c.message),400)}}if(a==="/api/filejob/import"&&s==="POST"){const h=await c8(p);try{const c=Array.isArray(h.paths)?h.paths.map((j8)=>String(j8)).filter(Boolean):[];if(c.length===0)return d(F8([]));const Z8=[];for(const j8 of c){const S8=t5(j8);if(!S8.isFile())continue;if(S8.size>52428800)continue;const E8=NK(j8);let x8=E8;let K6=1;while(u7(z6(A1(Q,x8)))){const G1=E8.lastIndexOf(".");x8=G1>0?`${E8.slice(0,G1)} (${K6})${E8.slice(G1)}`:`${E8} (${K6})`;K6++}const m6=A1(Q,x8).split("\\").join("/");const r6=z6(m6);b9(hq(r6),{recursive:true});e5(r6,N0(j8));Z8.push({name:x8,path:m6,size:S8.size})}return d(F8(Z8))}catch(c){return d(t8(c.message),400)}}if(a==="/api/git/status"&&s==="GET"){try{const h=await c$6(Y);return d(F8(h))}catch(h){return d(F8({available:false,error:h.message}))}}if(a==="/api/git/branches"&&s==="GET"){try{return d(F8(await l$6(Y)))}catch(h){return d(F8({available:false,error:h.message}))}}if(a==="/api/git/commit"&&s==="POST"){const h=await c8(p);try{const c=String(h.message||"").trim();if(!c)return d(t8("commit message is required"),400);return d(F8(await d$6(Y,c,h.all!==false)))}catch(c){return d(t8(c.message),400)}}if(a==="/api/git/push"&&s==="POST"){try{return d(F8(await i$6(Y)))}catch(h){return d(t8(h.message),400)}}if(a==="/api/git/checkout"&&s==="POST"){const h=await c8(p);try{const c=String(h.branch||"").trim();if(!c)return d(t8("branch name is required"),400);return d(F8(await n$6(Y,c)))}catch(c){return d(t8(c.message),400)}}if(a==="/api/repos/pr"&&s==="GET"){try{const h=await a$6(Y);return d(F8(h))}catch(h){return d(F8({available:false,error:h.message}))}}if(a==="/api/terminal/status")return d(F8(R.status($8.searchParams.get("terminalId")||undefined)));if(a==="/api/terminal/start"){const h=await c8(p);return d(F8(R.start({workspaceDir:h.workspaceDir})))}if(a==="/api/terminal/stop"){const h=await c8(p);return d(F8({stopped:R.stop(h.terminalId)}))}if(a==="/api/mcp/servers"){if(s==="POST"){v.reload();await _6()}return d(F8(v.listServers()))}if(a==="/api/mcp/health")return d(F8(v.health()));if(a==="/api/mcp/tools"){try{const h=await A.refreshMcpTools((c)=>M6(c));return d(F8(h))}catch(h){return d(t8(h.message),400)}}if(a==="/api/mcp/call"&&s==="POST"){const h=await c8(p);try{return d(F8(await v.callTool(String(h.server||""),String(h.tool||h.name||""),h.arguments||h.args||{})))}catch(c){return d(t8(c.message),400)}}if(a==="/api/connectors"){if(s==="GET")return d(F8({connectors:A.connectors.list()}));return d(t8(`Unhandled endpoint: ${s} ${a}`),404)}if(a==="/api/connectors/custom"){if(s==="POST"){const h=await c8(p);try{const c=A.connectors.addCustom({name:String(h.name||""),command:String(h.command||""),args:Array.isArray(h.args)?h.args.map(String):[],env:h.env&&typeof h.env==="object"?h.env:undefined,cwd:h.cwd?String(h.cwd):undefined,url:h.url?String(h.url):undefined,transport:h.transport?String(h.transport):undefined,headers:h.headers&&typeof h.headers==="object"?h.headers:undefined,description:h.description?String(h.description):undefined});v.reload();await _6();return d(F8(c))}catch(c){return d(t8(c instanceof Error?c.message:String(c)),400)}}return d(t8(`Unhandled endpoint: ${s} ${a}`),404)}if(a.startsWith("/api/connectors/custom/")){const h=decodeURIComponent(a.split("/").pop()||"");if(s==="DELETE"){const c=A.connectors.removeCustom(h);v.reload();await _6();return d(F8({removed:c,id:h}))}return d(t8(`Unhandled endpoint: ${s} ${a}`),404)}if(a.startsWith("/api/connectors/")){const h=a.split("/");const c=decodeURIComponent(h[3]||"");if(h.length>4&&h[4]==="toggle"&&s==="POST"){const Z8=await c8(p);const j8=Z8.enabled!==undefined?Boolean(Z8.enabled):true;const S8=Z8.env&&typeof Z8.env==="object"?Z8.env:undefined;try{const E8=await A.connectors.toggle(c,j8,S8);if(E8.kind==="mcp"){v.reload();await _6()}return d(F8(E8))}catch(E8){return d(t8(E8 instanceof Error?E8.message:String(E8)),400)}}if(s==="GET"){const Z8=A.connectors.get(c);return Z8?d(F8(Z8)):d(t8("Connector not found"),404)}return d(t8(`Unhandled endpoint: ${s} ${a}`),404)}if(a.startsWith("/api/hooks")){const h=a.split("/").filter(Boolean);const c=h.slice(2).join("/");const Z8=s==="POST"||s==="PUT"||s==="PATCH"?await c8(p):{};if(!c&&s==="GET"){return d(F8({endpoints:["stats","events","agents","export","import","reload","rules","rules/batch-delete","rules/batch-toggle"],stats:P.stats()}))}if(c==="reload"){L.reload();return d(F8({reloaded:true,stats:P.stats()}))}if(c==="stats")return d(F8(P.stats()));if(c==="events")return d(F8(O0()));if(c==="agents")return d(F8(wz()));if(c==="dry-run"){return d(F8(L.dryRun({toolName:String(Z8.toolName||Z8.tool||""),action:String(Z8.action||""),risk:Z8.risk==="low"||Z8.risk==="medium"||Z8.risk==="high"?Z8.risk:"medium",payload:Z8.payload&&typeof Z8.payload==="object"?Z8.payload:Z8},String(Z8.sessionId||""))))}if(c==="export")return d(F8(P.export()));if(c==="import"&&s==="POST"){const E8=P.import({hooks:Array.isArray(Z8.hooks)?Z8.hooks:[],mergeMode:String(Z8.mergeMode||"replace"),scope:String(Z8.scope||"project")});return d(F8(E8))}if(c==="rules/batch-delete"&&s==="POST"){const E8=Array.isArray(Z8.names)?Z8.names:[];const x8=P.batchDelete(E8,String(Z8.scope||"project"));return d(F8({deleted:x8}))}if(c==="rules/batch-toggle"&&s==="POST"){const E8=Array.isArray(Z8.names)?Z8.names:[];const x8=Z8.enabled!==false;const K6=P.batchToggle(E8,x8,String(Z8.scope||"project"));return d(F8({count:K6,enabled:x8}))}const j8=c.match(/^rules\/(.+)\/toggle$/);if(j8&&s==="PATCH"){const E8=decodeURIComponent(j8[1]);const x8=P.toggle(E8,Z8.enabled!==false);if(!x8)return d(t8("Rule not found"),404);return d(F8({name:E8,enabled:Z8.enabled!==false}))}const S8=c.match(/^rules(?:\/(.+))?$/);if(S8){const E8=S8[1]||null;const x8=E8?decodeURIComponent(E8):null;if(!x8&&s==="GET"){return d(F8(P.listAll()))}if(x8&&s==="GET"){const K6=P.get(x8);if(!K6)return d(t8("Rule not found"),404);return d(F8(K6))}if(!x8&&s==="POST"){const K6=P.create(Z8);if(!K6.success)return d(t8(K6.error),400);return d(F8(K6),201)}if(x8&&s==="PUT"){const K6=P.update(x8,Z8);if(!K6.success)return d(t8(K6.error),400);return d(F8(K6))}if(x8&&s==="DELETE"){const K6=P.delete(x8);if(!K6)return d(t8("Rule not found"),404);return d(F8({deleted:true}))}return d(t8(`Unsupported request: ${s} /${c}`),400)}return d(t8(`Unsupported endpoint: /${c}`),404)}if(a==="/api/inbox"&&s==="GET"){const h=new URL(p.url||"","http://localhost").searchParams;const c=h.get("state")||"pending";const Z8=h.get("sessionId")||undefined;const j8=h.get("kind")||undefined;const S8=x.list({state:c==="all"?undefined:c,sessionId:Z8,kind:j8});return d(F8({items:S8,stats:x.stats()}))}if(a==="/api/inbox/stats"&&s==="GET"){return d(F8(x.stats()))}if(a.startsWith("/api/inbox/")){const h=a.split("/").filter(Boolean);const c=h[2];if(h[3]==="resolve"&&s==="POST"&&c){const Z8=await c8(p);const j8=String(Z8.resolution||"allow");const S8=x.resolve(c,j8);if(!S8)return d(t8("Inbox item not found or already resolved"),404);const E8=x.get(c);if(j8==="always"&&E8?.kind==="approval"){const x8=Y8.automationForRunSession(E8.sessionId);const K6=String(E8.data?.toolName||"");const m6=E8.data?.payload&&typeof E8.data.payload==="object"?E8.data.payload:{};const r6=K6?Mc(K6,m6):null;if(x8&&K6&&r6){Y8.addRule(x8.id,K6,r6);M6({type:"automation.update",data:JSON.stringify({action:"permission_added",automation:x8.toJSON()})})}}if(E8)M6({type:"inbox.resolved",sessionId:E8.sessionId,data:JSON.stringify(E8)});return d(F8({resolved:true,item:E8}))}if(s==="GET"&&c){const Z8=x.get(c);if(!Z8)return d(t8("Inbox item not found"),404);return d(F8(Z8))}return d(t8(`Unsupported request: ${s} ${a}`),400)}if(a==="/api/audit"&&s==="GET"){const h=new URL(p.url||"","http://localhost").searchParams;const c=j.query({sessionId:h.get("sessionId")||undefined,tool:h.get("tool")||undefined,decision:h.get("decision"),approvedBy:h.get("approvedBy"),page:Number(h.get("page")||0),pageSize:Number(h.get("pageSize")||50)});return d(F8(c))}if(a==="/api/audit/stats"&&s==="GET"){return d(F8(j.stats()))}if(a==="/api/automations"&&s==="GET"){return d(F8(Y8.list().map((h)=>h.toJSON())))}if(a==="/api/automations"&&s==="POST"){const h=await c8(p);const c=h.schedule&&typeof h.schedule==="object"?{kind:h.schedule.kind==="once"?"once":"cron",cron:h.schedule.cron?String(h.schedule.cron):null,fireAt:h.schedule.fireAt?String(h.schedule.fireAt):null,timezone:h.schedule.timezone?String(h.schedule.timezone):"local"}:{kind:"cron",cron:String(h.cron||"0 9 * * *")};if(c.kind==="cron"){const{validateCron:j8}=await Promise.resolve().then(()=>(m0(),$4));const S8=j8(c.cron||"");if(S8)return d(t8(`Invalid cron: ${S8}`),400)}const Z8=Y8.create({name:String(h.name||"Untitled automation"),instructions:String(h.instructions||""),schedule:c,workspaceDir:String(h.workspaceDir||Y),permissions:Array.isArray(h.permissions)?h.permissions.map(String):[],readAutoAllow:h.readAutoAllow!==false});M6({type:"automation.update",data:JSON.stringify({action:"created",automation:Z8.toJSON()})});return d(F8(Z8.toJSON()),201)}if(a.startsWith("/api/automations/")){const h=a.split("/").filter(Boolean);const c=h[2];if(!c)return d(t8("Missing automation id"),400);const Z8=Y8.get(c);if(h[3]==="toggle"&&s==="POST"){if(!Z8)return d(t8("Automation not found"),404);const j8=await c8(p);const S8=j8.enabled!==false;const E8=Y8.toggle(c,S8);M6({type:"automation.update",data:JSON.stringify({action:S8?"enabled":"disabled",automation:E8?.toJSON()})});return d(F8(E8?.toJSON()))}if(h[3]==="run"&&s==="POST"){if(!Z8)return d(t8("Automation not found"),404);const j8=V8.startRun(c);M6({type:"automation.run",data:JSON.stringify({action:"started",automationId:c,run:j8?.toJSON()})});return d(F8(j8?.toJSON()),202)}if(h[3]==="runs"&&s==="GET"){if(!Z8)return d(t8("Automation not found"),404);return d(F8(Y8.runsFor(c).map((j8)=>j8.toJSON())))}if(h[3]==="permissions"&&s==="POST"){if(!Z8)return d(t8("Automation not found"),404);const j8=await c8(p);const S8=String(j8.tool||"");const E8=String(j8.target||"");const x8=Y8.addRule(c,S8,E8);if(!x8)return d(t8("Invalid rule entry or already present"),400);M6({type:"automation.update",data:JSON.stringify({action:"permission_added",automation:x8.toJSON()})});return d(F8(x8.toJSON()))}if(h[3]==="permissions"&&s==="DELETE"){if(!Z8)return d(t8("Automation not found"),404);const j8=await c8(p);const S8=String(j8.entry||"");const E8=Y8.revokeRule(c,S8);if(!E8)return d(t8("Rule entry not found"),404);M6({type:"automation.update",data:JSON.stringify({action:"permission_revoked",automation:E8.toJSON()})});return d(F8(E8.toJSON()))}if(s==="GET"){if(!Z8)return d(t8("Automation not found"),404);return d(F8(Z8.toJSON()))}if(s==="PUT"){if(!Z8)return d(t8("Automation not found"),404);const j8=await c8(p);const S8=Y8.update(c,{name:j8.name!==undefined?String(j8.name):undefined,instructions:j8.instructions!==undefined?String(j8.instructions):undefined,schedule:j8.schedule&&typeof j8.schedule==="object"?{kind:j8.schedule.kind==="once"?"once":"cron",cron:j8.schedule.cron?String(j8.schedule.cron):null,fireAt:j8.schedule.fireAt?String(j8.schedule.fireAt):null,timezone:j8.schedule.timezone?String(j8.schedule.timezone):"local"}:undefined,workspaceDir:j8.workspaceDir!==undefined?String(j8.workspaceDir):undefined,permissions:Array.isArray(j8.permissions)?j8.permissions.map(String):undefined,readAutoAllow:j8.readAutoAllow!==undefined?Boolean(j8.readAutoAllow):undefined});M6({type:"automation.update",data:JSON.stringify({action:"updated",automation:S8?.toJSON()})});return d(F8(S8?.toJSON()))}if(s==="DELETE"){const j8=Y8.delete(c);if(!j8)return d(t8("Automation not found"),404);M6({type:"automation.update",data:JSON.stringify({action:"deleted",automationId:c})});return d(F8({deleted:true}))}return d(t8(`Unsupported request: ${s} ${a}`),400)}if(a==="/api/channels"&&s==="GET"){const h=A1(U8,"channels.json");const c=Y6(h,[]);const Z8=Array.isArray(c)?c:c.channels||[];const{decryptConfig:j8}=await Promise.resolve().then(()=>(m0(),$4));const S8=Z8.map((E8)=>j8(E8));return d(F8(S8))}if(a==="/api/channels"&&s==="POST"){const h=await c8(p);const c=A1(U8,"channels.json");const Z8=W6(c);const{encryptConfig:j8,decryptConfig:S8}=await Promise.resolve().then(()=>(m0(),$4));const E8=String(h.id||h.name||`channel-${Date.now()}`).replace(/[^a-zA-Z0-9_-]/g,"-").toLowerCase();const x8={id:E8,name:String(h.name||"Channel"),type:h.type==="feishu"||h.type==="dingtalk"?h.type:"wechat",appId:String(h.appId||""),appSecret:String(h.appSecret||""),token:String(h.token||""),encodingAESKey:String(h.encodingAESKey||""),enabled:h.enabled!==false,extra:h.extra&&typeof h.extra==="object"?h.extra:{},connected:false};const K6=j8(x8);T6(c,[...Z8.filter((m6)=>m6.id!==x8.id),K6]);if(x8.enabled){try{await A.initializeChannels([x8])}catch(m6){z0.error("channels.error","Channel initialization failed",String(m6))}}return d(F8(S8(x8)),201)}if(a.startsWith("/api/channels/")){const h=a.split("/");const c=decodeURIComponent(h[3]||"");const Z8=A1(U8,"channels.json");const j8=W6(Z8);const S8=j8.find((E8)=>E8.id===c);if(!S8)return d(t8("Channel not found"),404);if(h.length===4&&s==="PUT"){const{encryptConfig:E8,decryptConfig:x8}=await Promise.resolve().then(()=>(m0(),$4));const K6=await c8(p);const m6={...S8,...K6,id:c};const r6=E8(m6);T6(Z8,j8.map((G1)=>G1.id===c?r6:G1));try{await A.channels.removeAdapter(c);if(m6.enabled!==false){await A.channels.createAdapter(m6)}}catch(G1){z0.error("channels.error","Channel operation failed",String(G1))}return d(F8(x8(m6)))}if(h.length===4&&s==="DELETE"){T6(Z8,j8.filter((E8)=>E8.id!==c));return d(F8({deleted:true}))}if(h[4]==="toggle"&&s==="PATCH"){const E8=await c8(p);const x8=Boolean(E8.enabled);const K6={...S8,enabled:x8};T6(Z8,j8.map((m6)=>m6.id===c?K6:m6));try{if(x8){await A.channels.createAdapter(K6)}else{await A.channels.removeAdapter(c)}}catch(m6){z0.error("channels.error","Channel operation failed",String(m6))}return d(F8({id:c,enabled:x8}))}if(h[4]==="webhook"&&s==="POST"){const E8=A.channels.getAdapter(c);if(!E8){return d(F8({message:`Channel ${c} not started, cannot process webhook`}),404)}try{const x8=await c8(p);if(E8.type==="dingtalk"){const{DingTalkApiClient:K6}=await Promise.resolve().then(()=>(m0(),$4));const m6=K6.parseCallbackBody(x8);if(m6){E8.ingestCallbackMessage(m6)}return d({errcode:0,errmsg:"ok"})}if(E8.type==="feishu"){const K6=x8?.event||x8;if(K6?.message){E8.ingestWebhookMessage(K6.message)}return d({code:0})}return d(F8({message:`Webhook received by channel ${c} (${E8.type})`}))}catch(x8){z0.error("channels.webhook_failed","Channel operation failed",String(x8));return d(t8("Webhook processing failed"),500)}}if(h[4]==="test"&&s==="POST"){const E8=A.channels.getAdapter(c);if(!E8){return d(F8({connected:false,message:`Channel ${c} not started, save config first`}))}const x8=E8.isConnected();return d(F8({connected:x8,message:x8?"Connected":"Disconnected"}))}if(h[4]==="wechat"){const E8=A.channels.getAdapter(c);if(!E8||E8.type!=="wechat"){return d(F8({message:"WeChat adapter not installed or not started"}))}if(h[5]==="qrcode"&&s==="GET"&&h[6]!=="status"){try{const{fetchWebQrCode:x8}=await Promise.resolve().then(()=>(m0(),$4));const K6=await x8();return d(F8(K6))}catch(x8){return d(t8(`Failed to fetch WeChat QR code: ${x8 instanceof Error?x8.message:String(x8)}`),500)}}if(h[5]==="qrcode"&&h[6]==="status"&&s==="GET"){const x8=new URL(p.url||"","http://localhost").searchParams;const K6=x8.get("qrcode")||"";const m6=x8.get("token")||"";if(!K6||!m6){return d(t8("Missing required parameters"),400)}try{const{checkWebQrStatus:r6}=await Promise.resolve().then(()=>(m0(),$4));const G1=await r6({qrcode:K6});return d(F8(G1))}catch(r6){return d(t8(`Failed to check QR code status: ${r6 instanceof Error?r6.message:String(r6)}`),500)}}return d(t8(`Unhandled WeChat endpoint: ${s} ${a}`),404)}return d(t8(`Unhandled endpoint: ${s} ${a}`),404)}if(a.startsWith("/api/channels"))return d(t8(`Unhandled endpoint: ${s} ${a}`),404);if(a==="/api/logs"&&s==="GET"){const h=A1(U8,"logs");if(!u7(h))return d(F8([]));const c=aH(h).filter((Z8)=>t5(A1(h,Z8)).isFile()).map((Z8)=>{const j8=t5(A1(h,Z8));return{name:Z8,size:j8.size,modified:j8.mtimeMs,previewable:/\.(log|txt|json|ndjson|jsonl|md)$/i.test(Z8)}});return d(F8(c))}if(a==="/api/logs/read"&&s==="GET"){const h=A1(U8,"logs");const c=NK(String($8.searchParams.get("file")||""));if(!c)return d(t8("Log file is required"),400);const Z8=A1(h,c);if(!u7(Z8))return d(t8("Log file not found"),404);const j8=N0(Z8,"utf8").split(/\r?\n/);if(j8.length>0&&j8[j8.length-1]==="")j8.pop();const S8=Math.max(1,Number($8.searchParams.get("maxLines")||500));const E8=Math.max(0,j8.length-S8);const x8=t5(Z8);return d(F8({name:c,size:x8.size,modified:x8.mtimeMs,totalLines:j8.length,startLine:E8,content:j8.slice(E8).join(`
|
|
4373
|
-
`)}))}if(a==="/api/logs/download"&&s==="GET"){const h=A1(U8,"logs");const c=NK(String($8.searchParams.get("file")||""));const Z8=A1(h,c);if(!c||!u7(Z8))return d(t8("Log file not found"),404);return new Response(N0(Z8),{headers:{"content-type":"application/octet-stream","access-control-allow-origin":"*"}})}if(a.startsWith("/api/logs"))return d(t8(`Unhandled endpoint: ${s} ${a}`),404);if(a.startsWith("/api/observability")){const h=typeof A.telemetry?.snapshot==="function"?A.telemetry.snapshot():null;const c=typeof A.telemetry?.getMetricSummary==="function"?A.telemetry.getMetricSummary():{};if(a==="/api/observability/summary"&&s==="GET"){return d(F8({totalRuns:c["trace.run[count]"]||0,totalCost:0,avgCost:0,totalTokens:c["token.usage[count]"]||0,activeSpans:h?.activeSpans?.length||0,recentEvents:h?.events?.length||0}))}if(a==="/api/observability/costs"&&s==="GET"){return d(F8({daily:[],total:0,metrics:c}))}if(a==="/api/observability/runs"&&s==="GET"){const Z8=typeof A.workflows?.listRuns==="function"?A.workflows.listRuns():[];return d(F8(Z8))}if(a.startsWith("/api/observability/runs/")&&s==="GET"){const Z8=a.split("/");const j8=Z8[4];if(Z8[5]==="events"){const E8=typeof A.workflows?.listEvents==="function"?A.workflows.listEvents(j8):[];return d(F8({events:E8,total:Array.isArray(E8)?E8.length:0,page:Number($8.searchParams.get("page")||0),size:Number($8.searchParams.get("size")||50)}))}const S8=typeof A.workflows?.getRun==="function"?A.workflows.getRun(j8):null;return d(F8(S8))}return d(F8({metrics:c,telemetry:true}))}if(a==="/api/workflows"&&s==="GET")return d(F8(A.workflows.listRuns()));if(a==="/api/workflows"&&s==="POST"){const h=await c8(p);const c=await A.workflows.start({sessionId:String(h.sessionId||""),runId:String(h.runId||""),goalId:typeof h.goalId==="string"?h.goalId:undefined,checkpointPolicy:String(h.checkpointPolicy||"phase-and-token"),message:String(h.message||h.content||""),script:typeof h.script==="string"?h.script:undefined,workflow:typeof h.workflow==="object"&&h.workflow?h.workflow:undefined});return d(F8(c))}if(a.startsWith("/api/workflows/")){const h=a.split("/");const c=h[3];if(h[4]==="events")return d(F8(A.workflows.listEvents(c)));if(h[4]==="checkpoints")return d(F8(A.workflows.listCheckpoints(c)));if(h[4]==="pause"&&s==="POST")return d(F8(A.workflows.pause(c)));if(h[4]==="resume"&&s==="POST")return d(F8(await A.workflows.resume(c)));if(h[4]==="cancel"&&s==="POST")return d(F8(A.workflows.cancel(c)));const Z8=A.workflows.getRun(c);return Z8?d(F8(Z8)):d(t8("Workflow not found"),404)}if(a==="/workflow/runs"&&s==="GET")return d(F8(A.workflows.listRuns()));if(a==="/workflow/runs"&&s==="POST"){const h=await c8(p);const c=await A.workflows.start({sessionId:String(h.sessionId||""),runId:String(h.runId||""),goalId:typeof h.goalId==="string"?h.goalId:undefined,checkpointPolicy:String(h.checkpointPolicy||"phase-and-token"),message:String(h.message||h.content||""),script:typeof h.script==="string"?h.script:undefined,workflow:typeof h.workflow==="object"&&h.workflow?h.workflow:undefined});return d(F8(c))}if(a.startsWith("/workflow/runs/")){const h=a.split("/");const c=h[3];if(h[4]==="trace"&&s==="GET"){const j8=A.workflows.getTrace(c);return j8?d(F8(j8)):d(t8("Workflow trace not found"),404)}if(h[4]==="events"&&s==="GET")return d(F8(A.workflows.listEvents(c)));if(h[4]==="events"&&s==="POST"){const j8=await c8(p);const S8=A.workflows.injectEvent(c,String(j8.type||"user_event"),j8.data??j8);return S8?d(F8(S8)):d(t8("Workflow not found"),404)}if(h[4]==="pause"&&s==="POST")return d(F8(A.workflows.pause(c)));if(h[4]==="resume"&&s==="POST")return d(F8(await A.workflows.resume(c)));if(h[4]==="cancel"&&s==="POST")return d(F8(A.workflows.cancel(c)));const Z8=A.workflows.getRun(c);return Z8?d(F8(Z8)):d(t8("Workflow not found"),404)}if(a.startsWith("/api/checkpoints"))return d(F8(A.workflows.listCheckpoints()));if(a==="/api/templates"&&s==="GET"){return d(F8(A.templates.list()))}if(a==="/api/templates"&&s==="POST"){const h=await c8(p);let c;let Z8={type:"handwritten"};let j8;if(typeof h.sourceRunId==="string"&&h.sourceRunId){const K6=A.workflows.getRun(h.sourceRunId);if(!K6)return d(t8("Run not found"),404);const m6=A.workflows.getRunDefinition(h.sourceRunId);if(!m6){if(K6.status==="FAILED"){return d(t8(`Run ${h.sourceRunId} failed before producing a workflow definition${K6.error?`: ${K6.error}`:""}`),400)}return d(t8("Run workflow definition not found"),404)}c=m6;Z8={type:"saved",runId:h.sourceRunId};j8=m6.title}else if(typeof h.definition==="object"&&h.definition){c=h.definition;j8=c.title;Z8=typeof h.source==="object"&&h.source?h.source:{type:"handwritten"}}let S8=false;let E8;if(h.generalize===true&&c&&Z8.type==="saved"){try{const K6=U.load();const m6=new Nl({provider:new k9(K6),model:String(K6.model||""),timeoutMs:120000,maxTokensOverride:8000});const r6=await m6.generalize(c,typeof h.message==="string"&&h.message?h.message:c.title);if(!r6.degraded){c=r6.definition;j8=r6.name;h.description=r6.description;h.category=r6.category;h.inputs=r6.inputs}else{S8=true;E8=r6.reason||"LLM generalize failed";z0.info("templates.generalize_degraded","LLM generalize failed, saved as-is",E8)}}catch(K6){S8=true;E8=K6 instanceof Error?K6.message:String(K6);z0.error("templates.generalize_failed","TemplateGeneralizer threw",E8)}}const x8=typeof h.name==="string"&&h.name?h.name:j8;if(!x8||!c){return d(t8("Template requires a name and either a definition or sourceRunId"),400)}try{const K6=A.templates.create({name:x8,description:h.description!=null?String(h.description):undefined,category:typeof h.category==="string"&&h.category?h.category:"general",inputs:Array.isArray(h.inputs)?h.inputs:undefined,definition:c,source:Z8});return S8?d(F8({...K6,degraded:S8,degradeReason:E8})):d(F8(K6))}catch(K6){return d(t8(K6 instanceof Error?K6.message:String(K6)),400)}}if(a.startsWith("/api/templates/")){const h=a.split("/");const c=decodeURIComponent(h[3]);if(!zc(c))return d(t8("Invalid template id"),400);const Z8=h[4];if(Z8==="versions"){if(s==="GET"&&h[5]){const j8=A.templates.getVersion(c,Number(h[5]));return j8?d(F8(j8)):d(t8("Template version not found"),404)}if(s==="GET")return d(F8(A.templates.listVersions(c)));return d(t8(`Unhandled template endpoint: ${s} ${a}`),404)}if(Z8==="render"&&s==="POST"){const j8=await c8(p);const S8=j8&&typeof j8==="object"&&j8.inputs&&typeof j8.inputs==="object"&&!Array.isArray(j8.inputs)?j8.inputs:j8;const E8=A.templates.render(c,S8);if(!E8.ok)return d(t8((E8.errors||[]).join("; ")),400);return d(F8(E8.definition))}if(s==="GET"&&!Z8){const j8=A.templates.get(c);return j8?d(F8(j8)):d(t8("Template not found"),404)}if(s==="PUT"&&!Z8){const j8=await c8(p);const S8=A.templates.update(c,{name:typeof j8?.name==="string"?j8.name:undefined,description:typeof j8?.description==="string"?j8.description:undefined,category:typeof j8?.category==="string"?j8.category:undefined,inputs:Array.isArray(j8?.inputs)?j8.inputs:undefined,definition:typeof j8?.definition==="object"&&j8?.definition?j8.definition:undefined,source:typeof j8?.source==="object"&&j8?.source?j8.source:undefined});return S8?d(F8(S8)):d(t8("Template not found"),404)}if(s==="DELETE"&&!Z8){return d(F8({removed:A.templates.remove(c)}))}return d(t8(`Unhandled template endpoint: ${s} ${a}`),404)}if(a.startsWith("/api/speech")){return d(F8({available:false,text:"",supported:false,engines:[]}))}if(a.startsWith("/api/metrics")){const h=process.memoryUsage();const c=Math.floor((Date.now()-O)/1000);const Z8=typeof A.sessions?.list==="function"?A.sessions.list().length:0;const j8=typeof A.telemetry?.getMetricSummary==="function"?A.telemetry.getMetricSummary():{};return d(F8({uptime:c,memory:{heapUsed:h.heapUsed,heapTotal:h.heapTotal,rss:h.rss},sessions:Z8,clients:N.size,workspace:Y,version:"1.0.16",metrics:j8}))}return d(t8(`Unhandled endpoint: ${s} ${a}`),404)}function b2(p){const $8=p.pathname==="/"?"/index.html":p.pathname;const a=b$6(A1(V,$8));if(!a.startsWith(V)||!u7(a)||t5(a).isDirectory()){const j6=A1(V,"index.html");return u7(j6)?new Response(N0(j6),{headers:{"content-type":"text/html; charset=utf-8"}}):C6("DeepSeekCode server is running")}const s=w$6(a);const U8={".html":"text/html; charset=utf-8",".js":"text/javascript; charset=utf-8",".mjs":"text/javascript; charset=utf-8",".css":"text/css; charset=utf-8",".svg":"image/svg+xml",".png":"image/png",".jpg":"image/jpeg",".jpeg":"image/jpeg",".gif":"image/gif",".webp":"image/webp",".ico":"image/x-icon",".woff":"font/woff",".woff2":"font/woff2",".ttf":"font/ttf",".json":"application/json; charset=utf-8",".map":"application/json; charset=utf-8"};const u8=U8[s]||"application/octet-stream";return new Response(N0(a),{headers:{"content-type":u8}})}function IK(p){const $8=new URL(p.url||"/",`http://${p.headers.host||`localhost:${K}`}`);const a={method:p.method,headers:p.headers};if(p.method!=="GET"&&p.method!=="HEAD"){a.body=p;a.duplex="half"}return{request:new Request($8,a),url:$8}}async function g9(p,$8){p.statusCode=$8.status;$8.headers.forEach((s,U8)=>p.setHeader(U8,s));const a=Buffer.from(await $8.arrayBuffer());p.end(a)}function bz(p){if(Array.isArray(p))return Buffer.concat(p);if(p instanceof ArrayBuffer)return Buffer.from(p);return p}async function v2(p,$8){if(p.data?.path==="/terminal"){R.handleSocketMessage(String(p.data?.terminalId??""),bz($8));return}if(G&&p.data?.authenticated!==true){let s;try{s=JSON.parse(String(bz($8)))}catch{s={}}if(s.type==="auth"){if(s.token===G){p.data=p.data||{};p.data.authenticated=true;p.send(JSON.stringify({type:"auth_success",message:"Authenticated"}));p.send(JSON.stringify({type:"workspace_changed",data:JSON.stringify({newDir:Y})}));z0.info("ws.authenticated","WebSocket client authenticated");return}p.send(JSON.stringify({type:"auth_failed",message:"Invalid API token"}));p.close(4401,"Invalid API token");return}p.send(JSON.stringify({type:"auth_required",message:"Authentication required: send {type:'auth', token}"}));return}let a;try{a=JSON.parse(String(bz($8)))}catch{p.send(JSON.stringify({type:"error",data:JSON.stringify({error:"Invalid JSON"})}));return}if(a.type==="auth"){p.data=p.data||{};p.data.authenticated=true;p.send(JSON.stringify({type:"auth_success",message:"Authenticated"}));p.send(JSON.stringify({type:"workspace_changed",data:JSON.stringify({newDir:Y})}));return}if(a.type==="workspace"){p.send(JSON.stringify({type:"workspace_changed",data:JSON.stringify({newDir:Y})}));return}if(a.type==="ping"){p.send(JSON.stringify({type:"pong",sessionId:a.sessionId||null}));return}if(a.type==="message_ack")return;if(a.type==="hook_allow"||a.type==="hook_deny"){const s=Uz(a.data);const U8=String(a.approvalId||s.approvalId||"");const u8=a.type==="hook_allow";const j6=typeof s.sessionId==="string"?s.sessionId:undefined;const h=U8?L.decide(U8,u8,{sessionId:a.sessionId||j6,remember:Boolean(s.remember||s.sessionAllow)}):false;p.send(JSON.stringify({type:"hook_response_ack",sessionId:a.sessionId||null,data:JSON.stringify({approvalId:U8,allowed:u8,resolved:h})}));return}if(a.type==="create_session"){const s=Uz(a.data);const U8=s.sessionId?C.ensure(String(s.sessionId)):e6();const u8="messages"in U8?(({messages:j6,...h})=>h)(U8):U8;p.send(JSON.stringify({type:"session_created",sessionId:u8.id,data:JSON.stringify(u8)}));return}if(a.type==="chat"||a.type==="plan"){if(!a.traceId)a.traceId=nL();const s=a.traceId;await A.run(a,(U8)=>{U8.traceId=s;p.send(JSON.stringify(U8))});return}if(a.type==="workflow_start"||a.type==="workflow_pause"||a.type==="workflow_resume"||a.type==="workflow_cancel"){if(!a.traceId)a.traceId=nL();const s=a.traceId;await A.handleControlMessage(a,(U8)=>{U8.traceId=s;p.send(JSON.stringify(U8))});return}if(a.type==="plan_confirm"){p.send(JSON.stringify({type:"plan_complete",sessionId:a.sessionId,data:JSON.stringify({status:"confirmed"})}));return}if(a.type==="user_exit_plan_mode"){const s=Uz(a.data)||{};const U8=String(s.planContent||"");const u8=String(s.planSlug||"");if(U8){try{A.plans.write(u8||"user-exit-plan",U8)}catch(j6){z0.warn("plan.save_failed","Failed to save plan on user exit",String(j6))}}try{A.modeManager.exitPlanMode("User exited plan mode");M6({type:"plan_mode_change",sessionId:a.sessionId,data:JSON.stringify({previousMode:"plan",newMode:"act",reason:"User exited plan mode",timestamp:Date.now()})});p.send(JSON.stringify({type:"plan_complete",sessionId:a.sessionId,data:JSON.stringify({status:"user_exited",planSaved:!!U8})}))}catch(j6){z0.warn("plan.exit_failed","Failed to exit plan mode",String(j6))}return}if(["stop","pause","resume","get_commands"].includes(a.type)){await A.handleControlMessage(a,(s)=>p.send(JSON.stringify(s)));return}if(a.type==="reset"){const s=a.sessionId||"";if(s){const U8=C.reset(s);p.send(JSON.stringify({type:"log",sessionId:s,data:JSON.stringify({level:"info",message:U8?"Context cleared":"Session not found"})}))}else{p.send(JSON.stringify({type:"log",sessionId:s,data:JSON.stringify({level:"warn",message:"Reset skipped: no sessionId"})}))}return}if(a.type==="resume_session"){const s=Uz(a.data);const U8=String(a.sessionId||s.sessionId||"");const u8=U8?C.ensure(U8):C.create();p.send(JSON.stringify({type:"session_resumed",sessionId:u8.id,data:JSON.stringify(C.resumeSnapshot(u8.id,{tasks:A.listTasks(),pendingApprovals:L.list()}))}));return}if(a.type==="mcp"){const s=Uz(a.data);const U8=String(s.action||"list");try{const u8=U8==="reload"?(v.reload(),await _6(),v.listServers()):U8==="tools"?(await _6(),await v.listTools(String(s.server||"")||undefined)):v.listServers();p.send(JSON.stringify({type:"notification",sessionId:a.sessionId,data:JSON.stringify({kind:"mcp",action:U8,result:u8})}))}catch(u8){p.send(JSON.stringify({type:"error",sessionId:a.sessionId,data:u8.message}))}return}if(a.type==="question_answer"){const s=Uz(a.data);const U8=String(s.questionId||"");const u8=String(s.answer||"");const j6=Array.isArray(s.selectedOptions)?s.selectedOptions.map(String):undefined;if(U8){const h={answer:u8,selectedOptions:j6};const c=Pp(U8,h);p.send(JSON.stringify({type:"question_answer_ack",sessionId:a.sessionId||null,data:JSON.stringify({questionId:U8,resolved:c,ok:c})}))}else{p.send(JSON.stringify({type:"error",sessionId:a.sessionId||null,data:JSON.stringify({error:"Missing questionId"})}))}return}if(a.type==="plan_mode_change"){const s=Uz(a.data);const U8=String(a.mode||s.frontendMode||s.newMode||s.mode||"");const u8=A.modeManager.getMode();let j6;let h;if(U8==="auto"){j6=u8==="normal"?"act":u8;h=!L.isAutoMode()}else if(O46(U8)){j6=W46(U8);h=true}else if(U8==="plan"||U8==="act"||U8==="goal"||U8==="normal"){j6=U8;h=false}else{p.send(JSON.stringify({type:"log",sessionId:a.sessionId,data:JSON.stringify({level:"warn",message:`plan_mode_change ignored: unknown mode "${U8}"`})}));return}const c=A.modeManager.setMode(j6,`Client mode change: ${U8}`);await A.handleControlMessage({type:"hook_auto",sessionId:a.sessionId,data:JSON.stringify({enabled:h})},(Z8)=>M6(Z8));if(!c)e8();p.send(JSON.stringify({type:"plan_mode_change_ack",sessionId:a.sessionId,data:JSON.stringify({mode:WQ(A.modeManager.getMode()),auto:h})}));return}if(a.type==="select_model"||a.type==="model_change"){const s=Uz(a.data);const U8=String(s.model||"");if(U8){U.save({model:U8});p.send(JSON.stringify({type:"token_update",sessionId:a.sessionId,data:JSON.stringify({model:U8})}));e8()}return}if(await A.handleControlMessage(a,(s)=>p.send(JSON.stringify(s))))return;p.send(JSON.stringify({type:"log",sessionId:a.sessionId,data:JSON.stringify({level:"info",message:`Unhandled WS message: ${a.type}`})}))}const vz=nO8(async(p,$8)=>{try{const{request:a,url:s}=IK(p);const U8=s.pathname.startsWith("/v1/")?await c0(a,s):null;const u8=U8||(s.pathname.startsWith("/api/")?await h9(a,s):b2(s));await g9($8,u8)}catch(a){await g9($8,d(t8(a.message||String(a)),500))}});const U5=nO8((p,$8)=>{g9($8,C6("DeepSeekCode WebSocket endpoint"))});const h7=new y$6.default({noServer:true});U5.on("upgrade",(p,$8,a)=>{const s=new URL(p.url||"/",`http://${p.headers.host||`localhost:${X}`}`);h7.handleUpgrade(p,$8,a,(U8)=>{U8.data={path:s.pathname,sessionId:s.searchParams.get("sessionId"),terminalId:s.searchParams.get("terminalId")};h7.emit("connection",U8,p)})});let O7=false;h7.on("connection",(p)=>{if(p.data?.path==="/terminal"){R.openSocket(p,String(p.data?.terminalId??""))}else{N.add(p);z0.debug("ws.connected","New WebSocket connection");p.send(JSON.stringify({type:"auth_required",message:"Authentication required"}));p.send(JSON.stringify({type:"connected",message:"Connected to DeepSeekCode TypeScript runtime"}));p.send(JSON.stringify({type:"workspace_changed",data:JSON.stringify({newDir:Y})}));e8(p);const $8=U.load();if(!$8.apiKey||!$8.baseUrl){p.send(JSON.stringify({type:"notification",data:JSON.stringify({severity:"warn",message:"Provider not configured - run /config to set up your API provider."})}));p.send(JSON.stringify({type:"status",data:JSON.stringify({configured:false})}));if(!O7){O7=true;z0.warn("provider.not_configured","Provider not configured on client connect")}}}p.on("message",($8)=>{v2(p,$8).catch((a)=>{let s;try{const U8=JSON.parse(String(bz($8)));if(U8.traceId)s=U8.traceId}catch{}z0.error("ws.message_error","Error handling WS message",String(a),undefined,s);p.send(JSON.stringify({type:"error",data:JSON.stringify({error:a.message||String(a)})}))})});p.on("close",()=>{if(p.data?.path==="/terminal"){R.closeSocket(String(p.data?.terminalId??""));return}N.delete(p)})});l(15000);return{runtime:A,httpServer:vz,wsHttpServer:U5,webSocketServer:h7,handleApi:h9,handleSocketMessage:v2,httpPort:K,wsPort:X,host:q||undefined,workspaceDir:Y,configDir:Z,inboxStore:x,auditStore:j,automationStore:Y8,automationScheduler:V8,cronScheduler:Q8}}var Hj6=process.argv[1]&&(process.argv[1].endsWith("index.js")||process.argv[1].endsWith("index.ts"));if(Hj6){const z=process.execArgv.find((K)=>K.startsWith("--max-old-space-size="))?.split("=")[1]||"0";const J=Number(z)||0;if(J>0&&J<2048){console.warn(`[deepseekcode] WARNING: --max-old-space-size=${J}MB may be too low for large sessions. Set DSC_HEAP_LIMIT_MB=4096 or higher.`)}else if(J===0){console.warn(`[deepseekcode] WARNING: No --max-old-space-size set. Default Node.js heap limit (~2GB) may cause OOM with large sessions. Set DSC_HEAP_LIMIT_MB=4096 or use --max-old-space-size=4096.`)}console.log(`[deepseekcode] Heap limit: ${J||"default (~2GB)"} (DSC_HEAP_LIMIT_MB env default: ${t$6}MB — set --max-old-space-size to apply a different value at startup)`);const D=pl();D.httpServer.listen(D.httpPort,D.host);D.wsHttpServer.listen(D.wsPort,D.host);console.log(`[deepseekcode] HTTP API: http://localhost:${D.httpPort}`);console.log(`[deepseekcode] WebSocket: ws://localhost:${D.wsPort}/ws`);console.log(`[deepseekcode] Workspace: ${D.workspaceDir}`)}import{join as T2}from"node:path";import{homedir as bA}from"node:os";import{createServer as nj6}from"node:net";g4();import{execFile as gE}from"node:child_process";import{homedir as Vj6}from"node:os";import{join as Wj6}from"node:path";import{existsSync as ZL8,readFileSync as Oj6,unlinkSync as $j6,writeFileSync as jj6}from"node:fs";var PA=Wj6(Vj6(),".agent","logs","dscode-cli.pid");function TA(){return process.env.DEEPSEEKCODE_QUIET==="1"}function GL8(z){return new Promise((J)=>{if(process.platform==="win32"){gE("netstat",["-ano"],{timeout:5000,windowsHide:true,maxBuffer:16*1024*1024},(D,K)=>{if(D){J([]);return}const X=new Set;for(const q of K.split(/\r?\n/)){const Y=q.trim().split(/\s+/);if(Y.length<5)continue;const Z=Y[1];const G=Y[3].toUpperCase();const H=Y[4];const V=Z.includes("]")?Z.split("]:").pop():Z.split(":").pop();if(V===String(z)&&(G==="LISTENING"||G==="ESTABLISHED")){const O=parseInt(H,10);if(Number.isFinite(O)&&O>0)X.add(O)}}J([...X])});return}gE("lsof",["-ti",`:${z}`],{timeout:5000},(D,K)=>{if(D){J([]);return}J(K.trim().split(/\r?\n/).map((X)=>parseInt(X.trim(),10)).filter((X)=>Number.isFinite(X)&&X>0))})})}function Qj6(z){return new Promise((J)=>{if(process.platform==="win32"){gE("taskkill",["/F","/T","/PID",String(z)],{timeout:5000,windowsHide:true},(D)=>J(!D));return}gE("kill",["-KILL",String(z)],{timeout:5000},(D)=>J(!D))})}function Aj6(z){try{process.kill(z,0);return true}catch(J){return J.code==="EPERM"}}function HL8(){try{if(!ZL8(PA))return null;const z=Oj6(PA,"utf8").trim();if(!z)return null;return JSON.parse(z)}catch{return null}}function VL8(z){try{jj6(PA,JSON.stringify(z),"utf8")}catch{}}function uE(){try{const z=HL8();if(z&&z.pid===process.pid&&ZL8(PA)){$j6(PA)}}catch{}}async function WL8(){const z=new Set;const J=HL8();if(J&&J.pid!==process.pid){if(Aj6(J.pid)){z.add(J.pid);try{const X=`pid=${J.pid} started=${J.startedAt}`+(J.port?` port=${J.port}`:"")+(J.workspace?` workspace=${J.workspace}`:"");J1.warn(`Previous instance still running (${X}) — use --force to take over its port`)}catch{}}}const D=Number(process.env.DEEPSEEKCODE_HTTP_PORT||8080);let K=[];try{K=await GL8(D);for(const X of K){if(X!==process.pid)z.add(X)}}catch{}return{stalePids:[...z],holdersOnDefaultPort:K}}async function OL8(z,J){const D=new Set([...J]);try{for(const X of await GL8(z)){if(X!==process.pid)D.add(X)}}catch{}let K=true;for(const X of D){try{const q=await Qj6(X);if(!q){process.stderr.write(`[dscode] ⚠ Failed to kill PID ${X}.
|
|
4373
|
+
`)}))}if(a==="/api/logs/download"&&s==="GET"){const h=A1(U8,"logs");const c=NK(String($8.searchParams.get("file")||""));const Z8=A1(h,c);if(!c||!u7(Z8))return d(t8("Log file not found"),404);return new Response(N0(Z8),{headers:{"content-type":"application/octet-stream","access-control-allow-origin":"*"}})}if(a.startsWith("/api/logs"))return d(t8(`Unhandled endpoint: ${s} ${a}`),404);if(a.startsWith("/api/observability")){const h=typeof A.telemetry?.snapshot==="function"?A.telemetry.snapshot():null;const c=typeof A.telemetry?.getMetricSummary==="function"?A.telemetry.getMetricSummary():{};if(a==="/api/observability/summary"&&s==="GET"){return d(F8({totalRuns:c["trace.run[count]"]||0,totalCost:0,avgCost:0,totalTokens:c["token.usage[count]"]||0,activeSpans:h?.activeSpans?.length||0,recentEvents:h?.events?.length||0}))}if(a==="/api/observability/costs"&&s==="GET"){return d(F8({daily:[],total:0,metrics:c}))}if(a==="/api/observability/runs"&&s==="GET"){const Z8=typeof A.workflows?.listRuns==="function"?A.workflows.listRuns():[];return d(F8(Z8))}if(a.startsWith("/api/observability/runs/")&&s==="GET"){const Z8=a.split("/");const j8=Z8[4];if(Z8[5]==="events"){const E8=typeof A.workflows?.listEvents==="function"?A.workflows.listEvents(j8):[];return d(F8({events:E8,total:Array.isArray(E8)?E8.length:0,page:Number($8.searchParams.get("page")||0),size:Number($8.searchParams.get("size")||50)}))}const S8=typeof A.workflows?.getRun==="function"?A.workflows.getRun(j8):null;return d(F8(S8))}return d(F8({metrics:c,telemetry:true}))}if(a==="/api/workflows"&&s==="GET")return d(F8(A.workflows.listRuns()));if(a==="/api/workflows"&&s==="POST"){const h=await c8(p);const c=await A.workflows.start({sessionId:String(h.sessionId||""),runId:String(h.runId||""),goalId:typeof h.goalId==="string"?h.goalId:undefined,checkpointPolicy:String(h.checkpointPolicy||"phase-and-token"),message:String(h.message||h.content||""),script:typeof h.script==="string"?h.script:undefined,workflow:typeof h.workflow==="object"&&h.workflow?h.workflow:undefined});return d(F8(c))}if(a.startsWith("/api/workflows/")){const h=a.split("/");const c=h[3];if(h[4]==="events")return d(F8(A.workflows.listEvents(c)));if(h[4]==="checkpoints")return d(F8(A.workflows.listCheckpoints(c)));if(h[4]==="pause"&&s==="POST")return d(F8(A.workflows.pause(c)));if(h[4]==="resume"&&s==="POST")return d(F8(await A.workflows.resume(c)));if(h[4]==="cancel"&&s==="POST")return d(F8(A.workflows.cancel(c)));const Z8=A.workflows.getRun(c);return Z8?d(F8(Z8)):d(t8("Workflow not found"),404)}if(a==="/workflow/runs"&&s==="GET")return d(F8(A.workflows.listRuns()));if(a==="/workflow/runs"&&s==="POST"){const h=await c8(p);const c=await A.workflows.start({sessionId:String(h.sessionId||""),runId:String(h.runId||""),goalId:typeof h.goalId==="string"?h.goalId:undefined,checkpointPolicy:String(h.checkpointPolicy||"phase-and-token"),message:String(h.message||h.content||""),script:typeof h.script==="string"?h.script:undefined,workflow:typeof h.workflow==="object"&&h.workflow?h.workflow:undefined});return d(F8(c))}if(a.startsWith("/workflow/runs/")){const h=a.split("/");const c=h[3];if(h[4]==="trace"&&s==="GET"){const j8=A.workflows.getTrace(c);return j8?d(F8(j8)):d(t8("Workflow trace not found"),404)}if(h[4]==="events"&&s==="GET")return d(F8(A.workflows.listEvents(c)));if(h[4]==="events"&&s==="POST"){const j8=await c8(p);const S8=A.workflows.injectEvent(c,String(j8.type||"user_event"),j8.data??j8);return S8?d(F8(S8)):d(t8("Workflow not found"),404)}if(h[4]==="pause"&&s==="POST")return d(F8(A.workflows.pause(c)));if(h[4]==="resume"&&s==="POST")return d(F8(await A.workflows.resume(c)));if(h[4]==="cancel"&&s==="POST")return d(F8(A.workflows.cancel(c)));const Z8=A.workflows.getRun(c);return Z8?d(F8(Z8)):d(t8("Workflow not found"),404)}if(a.startsWith("/api/checkpoints"))return d(F8(A.workflows.listCheckpoints()));if(a==="/api/templates"&&s==="GET"){return d(F8(A.templates.list()))}if(a==="/api/templates"&&s==="POST"){const h=await c8(p);let c;let Z8={type:"handwritten"};let j8;if(typeof h.sourceRunId==="string"&&h.sourceRunId){const K6=A.workflows.getRun(h.sourceRunId);if(!K6)return d(t8("Run not found"),404);const m6=A.workflows.getRunDefinition(h.sourceRunId);if(!m6){if(K6.status==="FAILED"){return d(t8(`Run ${h.sourceRunId} failed before producing a workflow definition${K6.error?`: ${K6.error}`:""}`),400)}return d(t8("Run workflow definition not found"),404)}c=m6;Z8={type:"saved",runId:h.sourceRunId};j8=m6.title}else if(typeof h.definition==="object"&&h.definition){c=h.definition;j8=c.title;Z8=typeof h.source==="object"&&h.source?h.source:{type:"handwritten"}}let S8=false;let E8;if(h.generalize===true&&c&&Z8.type==="saved"){try{const K6=U.load();const m6=new Nl({provider:new k9(K6),model:String(K6.model||""),timeoutMs:120000,maxTokensOverride:8000});const r6=await m6.generalize(c,typeof h.message==="string"&&h.message?h.message:c.title);if(!r6.degraded){c=r6.definition;j8=r6.name;h.description=r6.description;h.category=r6.category;h.inputs=r6.inputs}else{S8=true;E8=r6.reason||"LLM generalize failed";z0.info("templates.generalize_degraded","LLM generalize failed, saved as-is",E8)}}catch(K6){S8=true;E8=K6 instanceof Error?K6.message:String(K6);z0.error("templates.generalize_failed","TemplateGeneralizer threw",E8)}}const x8=typeof h.name==="string"&&h.name?h.name:j8;if(!x8||!c){return d(t8("Template requires a name and either a definition or sourceRunId"),400)}try{const K6=A.templates.create({name:x8,description:h.description!=null?String(h.description):undefined,category:typeof h.category==="string"&&h.category?h.category:"general",inputs:Array.isArray(h.inputs)?h.inputs:undefined,definition:c,source:Z8});return S8?d(F8({...K6,degraded:S8,degradeReason:E8})):d(F8(K6))}catch(K6){return d(t8(K6 instanceof Error?K6.message:String(K6)),400)}}if(a.startsWith("/api/templates/")){const h=a.split("/");const c=decodeURIComponent(h[3]);if(!zc(c))return d(t8("Invalid template id"),400);const Z8=h[4];if(Z8==="versions"){if(s==="GET"&&h[5]){const j8=A.templates.getVersion(c,Number(h[5]));return j8?d(F8(j8)):d(t8("Template version not found"),404)}if(s==="GET")return d(F8(A.templates.listVersions(c)));return d(t8(`Unhandled template endpoint: ${s} ${a}`),404)}if(Z8==="render"&&s==="POST"){const j8=await c8(p);const S8=j8&&typeof j8==="object"&&j8.inputs&&typeof j8.inputs==="object"&&!Array.isArray(j8.inputs)?j8.inputs:j8;const E8=A.templates.render(c,S8);if(!E8.ok)return d(t8((E8.errors||[]).join("; ")),400);return d(F8(E8.definition))}if(s==="GET"&&!Z8){const j8=A.templates.get(c);return j8?d(F8(j8)):d(t8("Template not found"),404)}if(s==="PUT"&&!Z8){const j8=await c8(p);const S8=A.templates.update(c,{name:typeof j8?.name==="string"?j8.name:undefined,description:typeof j8?.description==="string"?j8.description:undefined,category:typeof j8?.category==="string"?j8.category:undefined,inputs:Array.isArray(j8?.inputs)?j8.inputs:undefined,definition:typeof j8?.definition==="object"&&j8?.definition?j8.definition:undefined,source:typeof j8?.source==="object"&&j8?.source?j8.source:undefined});return S8?d(F8(S8)):d(t8("Template not found"),404)}if(s==="DELETE"&&!Z8){return d(F8({removed:A.templates.remove(c)}))}return d(t8(`Unhandled template endpoint: ${s} ${a}`),404)}if(a.startsWith("/api/speech")){return d(F8({available:false,text:"",supported:false,engines:[]}))}if(a.startsWith("/api/metrics")){const h=process.memoryUsage();const c=Math.floor((Date.now()-O)/1000);const Z8=typeof A.sessions?.list==="function"?A.sessions.list().length:0;const j8=typeof A.telemetry?.getMetricSummary==="function"?A.telemetry.getMetricSummary():{};return d(F8({uptime:c,memory:{heapUsed:h.heapUsed,heapTotal:h.heapTotal,rss:h.rss},sessions:Z8,clients:N.size,workspace:Y,version:"1.0.17",metrics:j8}))}return d(t8(`Unhandled endpoint: ${s} ${a}`),404)}function b2(p){const $8=p.pathname==="/"?"/index.html":p.pathname;const a=b$6(A1(V,$8));if(!a.startsWith(V)||!u7(a)||t5(a).isDirectory()){const j6=A1(V,"index.html");return u7(j6)?new Response(N0(j6),{headers:{"content-type":"text/html; charset=utf-8"}}):C6("DeepSeekCode server is running")}const s=w$6(a);const U8={".html":"text/html; charset=utf-8",".js":"text/javascript; charset=utf-8",".mjs":"text/javascript; charset=utf-8",".css":"text/css; charset=utf-8",".svg":"image/svg+xml",".png":"image/png",".jpg":"image/jpeg",".jpeg":"image/jpeg",".gif":"image/gif",".webp":"image/webp",".ico":"image/x-icon",".woff":"font/woff",".woff2":"font/woff2",".ttf":"font/ttf",".json":"application/json; charset=utf-8",".map":"application/json; charset=utf-8"};const u8=U8[s]||"application/octet-stream";return new Response(N0(a),{headers:{"content-type":u8}})}function IK(p){const $8=new URL(p.url||"/",`http://${p.headers.host||`localhost:${K}`}`);const a={method:p.method,headers:p.headers};if(p.method!=="GET"&&p.method!=="HEAD"){a.body=p;a.duplex="half"}return{request:new Request($8,a),url:$8}}async function g9(p,$8){p.statusCode=$8.status;$8.headers.forEach((s,U8)=>p.setHeader(U8,s));const a=Buffer.from(await $8.arrayBuffer());p.end(a)}function bz(p){if(Array.isArray(p))return Buffer.concat(p);if(p instanceof ArrayBuffer)return Buffer.from(p);return p}async function v2(p,$8){if(p.data?.path==="/terminal"){R.handleSocketMessage(String(p.data?.terminalId??""),bz($8));return}if(G&&p.data?.authenticated!==true){let s;try{s=JSON.parse(String(bz($8)))}catch{s={}}if(s.type==="auth"){if(s.token===G){p.data=p.data||{};p.data.authenticated=true;p.send(JSON.stringify({type:"auth_success",message:"Authenticated"}));p.send(JSON.stringify({type:"workspace_changed",data:JSON.stringify({newDir:Y})}));z0.info("ws.authenticated","WebSocket client authenticated");return}p.send(JSON.stringify({type:"auth_failed",message:"Invalid API token"}));p.close(4401,"Invalid API token");return}p.send(JSON.stringify({type:"auth_required",message:"Authentication required: send {type:'auth', token}"}));return}let a;try{a=JSON.parse(String(bz($8)))}catch{p.send(JSON.stringify({type:"error",data:JSON.stringify({error:"Invalid JSON"})}));return}if(a.type==="auth"){p.data=p.data||{};p.data.authenticated=true;p.send(JSON.stringify({type:"auth_success",message:"Authenticated"}));p.send(JSON.stringify({type:"workspace_changed",data:JSON.stringify({newDir:Y})}));return}if(a.type==="workspace"){p.send(JSON.stringify({type:"workspace_changed",data:JSON.stringify({newDir:Y})}));return}if(a.type==="ping"){p.send(JSON.stringify({type:"pong",sessionId:a.sessionId||null}));return}if(a.type==="message_ack")return;if(a.type==="hook_allow"||a.type==="hook_deny"){const s=Uz(a.data);const U8=String(a.approvalId||s.approvalId||"");const u8=a.type==="hook_allow";const j6=typeof s.sessionId==="string"?s.sessionId:undefined;const h=U8?L.decide(U8,u8,{sessionId:a.sessionId||j6,remember:Boolean(s.remember||s.sessionAllow)}):false;p.send(JSON.stringify({type:"hook_response_ack",sessionId:a.sessionId||null,data:JSON.stringify({approvalId:U8,allowed:u8,resolved:h})}));return}if(a.type==="create_session"){const s=Uz(a.data);const U8=s.sessionId?C.ensure(String(s.sessionId)):e6();const u8="messages"in U8?(({messages:j6,...h})=>h)(U8):U8;p.send(JSON.stringify({type:"session_created",sessionId:u8.id,data:JSON.stringify(u8)}));return}if(a.type==="chat"||a.type==="plan"){if(!a.traceId)a.traceId=nL();const s=a.traceId;await A.run(a,(U8)=>{U8.traceId=s;p.send(JSON.stringify(U8))});return}if(a.type==="workflow_start"||a.type==="workflow_pause"||a.type==="workflow_resume"||a.type==="workflow_cancel"){if(!a.traceId)a.traceId=nL();const s=a.traceId;await A.handleControlMessage(a,(U8)=>{U8.traceId=s;p.send(JSON.stringify(U8))});return}if(a.type==="plan_confirm"){p.send(JSON.stringify({type:"plan_complete",sessionId:a.sessionId,data:JSON.stringify({status:"confirmed"})}));return}if(a.type==="user_exit_plan_mode"){const s=Uz(a.data)||{};const U8=String(s.planContent||"");const u8=String(s.planSlug||"");if(U8){try{A.plans.write(u8||"user-exit-plan",U8)}catch(j6){z0.warn("plan.save_failed","Failed to save plan on user exit",String(j6))}}try{A.modeManager.exitPlanMode("User exited plan mode");M6({type:"plan_mode_change",sessionId:a.sessionId,data:JSON.stringify({previousMode:"plan",newMode:"act",reason:"User exited plan mode",timestamp:Date.now()})});p.send(JSON.stringify({type:"plan_complete",sessionId:a.sessionId,data:JSON.stringify({status:"user_exited",planSaved:!!U8})}))}catch(j6){z0.warn("plan.exit_failed","Failed to exit plan mode",String(j6))}return}if(["stop","pause","resume","get_commands"].includes(a.type)){await A.handleControlMessage(a,(s)=>p.send(JSON.stringify(s)));return}if(a.type==="reset"){const s=a.sessionId||"";if(s){const U8=C.reset(s);p.send(JSON.stringify({type:"log",sessionId:s,data:JSON.stringify({level:"info",message:U8?"Context cleared":"Session not found"})}))}else{p.send(JSON.stringify({type:"log",sessionId:s,data:JSON.stringify({level:"warn",message:"Reset skipped: no sessionId"})}))}return}if(a.type==="resume_session"){const s=Uz(a.data);const U8=String(a.sessionId||s.sessionId||"");const u8=U8?C.ensure(U8):C.create();p.send(JSON.stringify({type:"session_resumed",sessionId:u8.id,data:JSON.stringify(C.resumeSnapshot(u8.id,{tasks:A.listTasks(),pendingApprovals:L.list()}))}));return}if(a.type==="mcp"){const s=Uz(a.data);const U8=String(s.action||"list");try{const u8=U8==="reload"?(v.reload(),await _6(),v.listServers()):U8==="tools"?(await _6(),await v.listTools(String(s.server||"")||undefined)):v.listServers();p.send(JSON.stringify({type:"notification",sessionId:a.sessionId,data:JSON.stringify({kind:"mcp",action:U8,result:u8})}))}catch(u8){p.send(JSON.stringify({type:"error",sessionId:a.sessionId,data:u8.message}))}return}if(a.type==="question_answer"){const s=Uz(a.data);const U8=String(s.questionId||"");const u8=String(s.answer||"");const j6=Array.isArray(s.selectedOptions)?s.selectedOptions.map(String):undefined;if(U8){const h={answer:u8,selectedOptions:j6};const c=Pp(U8,h);p.send(JSON.stringify({type:"question_answer_ack",sessionId:a.sessionId||null,data:JSON.stringify({questionId:U8,resolved:c,ok:c})}))}else{p.send(JSON.stringify({type:"error",sessionId:a.sessionId||null,data:JSON.stringify({error:"Missing questionId"})}))}return}if(a.type==="plan_mode_change"){const s=Uz(a.data);const U8=String(a.mode||s.frontendMode||s.newMode||s.mode||"");const u8=A.modeManager.getMode();let j6;let h;if(U8==="auto"){j6=u8==="normal"?"act":u8;h=!L.isAutoMode()}else if(O46(U8)){j6=W46(U8);h=true}else if(U8==="plan"||U8==="act"||U8==="goal"||U8==="normal"){j6=U8;h=false}else{p.send(JSON.stringify({type:"log",sessionId:a.sessionId,data:JSON.stringify({level:"warn",message:`plan_mode_change ignored: unknown mode "${U8}"`})}));return}const c=A.modeManager.setMode(j6,`Client mode change: ${U8}`);await A.handleControlMessage({type:"hook_auto",sessionId:a.sessionId,data:JSON.stringify({enabled:h})},(Z8)=>M6(Z8));if(!c)e8();p.send(JSON.stringify({type:"plan_mode_change_ack",sessionId:a.sessionId,data:JSON.stringify({mode:WQ(A.modeManager.getMode()),auto:h})}));return}if(a.type==="select_model"||a.type==="model_change"){const s=Uz(a.data);const U8=String(s.model||"");if(U8){U.save({model:U8});p.send(JSON.stringify({type:"token_update",sessionId:a.sessionId,data:JSON.stringify({model:U8})}));e8()}return}if(await A.handleControlMessage(a,(s)=>p.send(JSON.stringify(s))))return;p.send(JSON.stringify({type:"log",sessionId:a.sessionId,data:JSON.stringify({level:"info",message:`Unhandled WS message: ${a.type}`})}))}const vz=nO8(async(p,$8)=>{try{const{request:a,url:s}=IK(p);const U8=s.pathname.startsWith("/v1/")?await c0(a,s):null;const u8=U8||(s.pathname.startsWith("/api/")?await h9(a,s):b2(s));await g9($8,u8)}catch(a){await g9($8,d(t8(a.message||String(a)),500))}});const U5=nO8((p,$8)=>{g9($8,C6("DeepSeekCode WebSocket endpoint"))});const h7=new y$6.default({noServer:true});U5.on("upgrade",(p,$8,a)=>{const s=new URL(p.url||"/",`http://${p.headers.host||`localhost:${X}`}`);h7.handleUpgrade(p,$8,a,(U8)=>{U8.data={path:s.pathname,sessionId:s.searchParams.get("sessionId"),terminalId:s.searchParams.get("terminalId")};h7.emit("connection",U8,p)})});let O7=false;h7.on("connection",(p)=>{if(p.data?.path==="/terminal"){R.openSocket(p,String(p.data?.terminalId??""))}else{N.add(p);z0.debug("ws.connected","New WebSocket connection");p.send(JSON.stringify({type:"auth_required",message:"Authentication required"}));p.send(JSON.stringify({type:"connected",message:"Connected to DeepSeekCode TypeScript runtime"}));p.send(JSON.stringify({type:"workspace_changed",data:JSON.stringify({newDir:Y})}));e8(p);const $8=U.load();if(!$8.apiKey||!$8.baseUrl){p.send(JSON.stringify({type:"notification",data:JSON.stringify({severity:"warn",message:"Provider not configured - run /config to set up your API provider."})}));p.send(JSON.stringify({type:"status",data:JSON.stringify({configured:false})}));if(!O7){O7=true;z0.warn("provider.not_configured","Provider not configured on client connect")}}}p.on("message",($8)=>{v2(p,$8).catch((a)=>{let s;try{const U8=JSON.parse(String(bz($8)));if(U8.traceId)s=U8.traceId}catch{}z0.error("ws.message_error","Error handling WS message",String(a),undefined,s);p.send(JSON.stringify({type:"error",data:JSON.stringify({error:a.message||String(a)})}))})});p.on("close",()=>{if(p.data?.path==="/terminal"){R.closeSocket(String(p.data?.terminalId??""));return}N.delete(p)})});l(15000);return{runtime:A,httpServer:vz,wsHttpServer:U5,webSocketServer:h7,handleApi:h9,handleSocketMessage:v2,httpPort:K,wsPort:X,host:q||undefined,workspaceDir:Y,configDir:Z,inboxStore:x,auditStore:j,automationStore:Y8,automationScheduler:V8,cronScheduler:Q8}}var Hj6=process.argv[1]&&(process.argv[1].endsWith("index.js")||process.argv[1].endsWith("index.ts"));if(Hj6){const z=process.execArgv.find((K)=>K.startsWith("--max-old-space-size="))?.split("=")[1]||"0";const J=Number(z)||0;if(J>0&&J<2048){console.warn(`[deepseekcode] WARNING: --max-old-space-size=${J}MB may be too low for large sessions. Set DSC_HEAP_LIMIT_MB=4096 or higher.`)}else if(J===0){console.warn(`[deepseekcode] WARNING: No --max-old-space-size set. Default Node.js heap limit (~2GB) may cause OOM with large sessions. Set DSC_HEAP_LIMIT_MB=4096 or use --max-old-space-size=4096.`)}console.log(`[deepseekcode] Heap limit: ${J||"default (~2GB)"} (DSC_HEAP_LIMIT_MB env default: ${t$6}MB — set --max-old-space-size to apply a different value at startup)`);const D=pl();D.httpServer.listen(D.httpPort,D.host);D.wsHttpServer.listen(D.wsPort,D.host);console.log(`[deepseekcode] HTTP API: http://localhost:${D.httpPort}`);console.log(`[deepseekcode] WebSocket: ws://localhost:${D.wsPort}/ws`);console.log(`[deepseekcode] Workspace: ${D.workspaceDir}`)}import{join as T2}from"node:path";import{homedir as bA}from"node:os";import{createServer as nj6}from"node:net";g4();import{execFile as gE}from"node:child_process";import{homedir as Vj6}from"node:os";import{join as Wj6}from"node:path";import{existsSync as ZL8,readFileSync as Oj6,unlinkSync as $j6,writeFileSync as jj6}from"node:fs";var PA=Wj6(Vj6(),".agent","logs","dscode-cli.pid");function TA(){return process.env.DEEPSEEKCODE_QUIET==="1"}function GL8(z){return new Promise((J)=>{if(process.platform==="win32"){gE("netstat",["-ano"],{timeout:5000,windowsHide:true,maxBuffer:16*1024*1024},(D,K)=>{if(D){J([]);return}const X=new Set;for(const q of K.split(/\r?\n/)){const Y=q.trim().split(/\s+/);if(Y.length<5)continue;const Z=Y[1];const G=Y[3].toUpperCase();const H=Y[4];const V=Z.includes("]")?Z.split("]:").pop():Z.split(":").pop();if(V===String(z)&&(G==="LISTENING"||G==="ESTABLISHED")){const O=parseInt(H,10);if(Number.isFinite(O)&&O>0)X.add(O)}}J([...X])});return}gE("lsof",["-ti",`:${z}`],{timeout:5000},(D,K)=>{if(D){J([]);return}J(K.trim().split(/\r?\n/).map((X)=>parseInt(X.trim(),10)).filter((X)=>Number.isFinite(X)&&X>0))})})}function Qj6(z){return new Promise((J)=>{if(process.platform==="win32"){gE("taskkill",["/F","/T","/PID",String(z)],{timeout:5000,windowsHide:true},(D)=>J(!D));return}gE("kill",["-KILL",String(z)],{timeout:5000},(D)=>J(!D))})}function Aj6(z){try{process.kill(z,0);return true}catch(J){return J.code==="EPERM"}}function HL8(){try{if(!ZL8(PA))return null;const z=Oj6(PA,"utf8").trim();if(!z)return null;return JSON.parse(z)}catch{return null}}function VL8(z){try{jj6(PA,JSON.stringify(z),"utf8")}catch{}}function uE(){try{const z=HL8();if(z&&z.pid===process.pid&&ZL8(PA)){$j6(PA)}}catch{}}async function WL8(){const z=new Set;const J=HL8();if(J&&J.pid!==process.pid){if(Aj6(J.pid)){z.add(J.pid);try{const X=`pid=${J.pid} started=${J.startedAt}`+(J.port?` port=${J.port}`:"")+(J.workspace?` workspace=${J.workspace}`:"");J1.warn(`Previous instance still running (${X}) — use --force to take over its port`)}catch{}}}const D=Number(process.env.DEEPSEEKCODE_HTTP_PORT||8080);let K=[];try{K=await GL8(D);for(const X of K){if(X!==process.pid)z.add(X)}}catch{}return{stalePids:[...z],holdersOnDefaultPort:K}}async function OL8(z,J){const D=new Set([...J]);try{for(const X of await GL8(z)){if(X!==process.pid)D.add(X)}}catch{}let K=true;for(const X of D){try{const q=await Qj6(X);if(!q){process.stderr.write(`[dscode] ⚠ Failed to kill PID ${X}.
|
|
4374
4374
|
`);K=false}else{process.stderr.write(`[dscode] ✅ Killed stale instance PID ${X} (--force)
|
|
4375
4375
|
`)}}catch{K=false}}if(!K)return false;await new Promise((X)=>setTimeout(X,400));return true}var cj6=process.execArgv.some(function(z){return z.includes("max-old-space-size")});var lj6=process.env.NODE_OPTIONS?.includes("max-old-space-size");var dj6=process.env.DSC_HEAP_LIMIT_MB||"8192";if(!cj6&&!lj6&&process.env.DEEPSEEKCODE_QUIET!=="1"&&process.argv[1]&&!process.argv[1].includes("--version")&&!process.argv[1].includes("-v")){try{process.stderr.write("[DSC] Tip: Run with --max-old-space-size="+dj6+` to prevent OOM.
|
|
4376
4376
|
`);process.stderr.write(`[DSC] Set env DSC_HEAP_LIMIT_MB to change limit.
|
|
@@ -4380,7 +4380,7 @@ Error: API Key is required for deployment. Process exited with code 1.\r
|
|
|
4380
4380
|
${z.stack||z.message}`)}catch(J){}SL8("Fatal error:",z);process.exit(1)});process.on("unhandledRejection",(z)=>{const J=z instanceof Error?z:new Error(String(z));if(J.code==="EPIPE"||J.code==="ECONNRESET")return;try{J1.error(`FATAL UNHANDLED REJECTION: ${J.stack||J.message}`);J1.error(`Node.js ${process.version}, heapUsed: ${(process.memoryUsage().heapUsed/1024/1024).toFixed(1)}MB`);const D=T2(bA(),".agent","logs");const K=T2(D,".last-crash");rl(K,`${new Date().toISOString()}
|
|
4381
4381
|
UNHANDLED REJECTION
|
|
4382
4382
|
${J.stack||J.message}`)}catch(D){}SL8("Fatal unhandled rejection:",J);process.exit(1)});process.on("exit",(z)=>{try{const J=T2(bA(),".agent","logs");rl(T2(J,".last-exit"),`${new Date().toISOString()} code=${z}
|
|
4383
|
-
`)}catch{}try{uE()}catch{}try{kS()}catch{}});function wL8(){const z=process.stdin;if(z.isTTY===undefined&&typeof z.setRawMode==="function"){z.isTTY=true}return z}var nV="1.0.
|
|
4383
|
+
`)}catch{}try{uE()}catch{}try{kS()}catch{}});function wL8(){const z=process.stdin;if(z.isTTY===undefined&&typeof z.setRawMode==="function"){z.isTTY=true}return z}var nV="1.0.17";var al=null;function bL8(z){if(al)return;al=Bh(z)?Promise.resolve(null):iG8(nV)}async function vL8(z,J=1200){const D=zH8();if(D&&!TA()){try{process.stderr.write(JH8(D))}catch{}}if(Bh(z)||TA())return;bL8(z);const K=await Promise.race([al,new Promise((X)=>setTimeout(()=>X(null),J))]);if(!K)return;try{if(sG8(z)||!tG8(nV)){process.stderr.write(nG8(K))}else{process.stderr.write(DH8(K));eG8(K.latest)}}catch{}}function PL8(){console.log(`DeepSeekCode CLI v${nV}`);console.log("");console.log("Usage:");console.log(" dscode [options] Start local core + interactive terminal");console.log(" dscode start [options] Start local core + interactive terminal");console.log(" dscode start --auto Start with auto mode enabled");console.log(" dscode run --backend URL Connect to existing backend");console.log(" dscode exec <command> Execute command non-interactively (JSONL output)");console.log(" dscode exec --file <path> Execute command from file");console.log(" dscode exec --text Output plain text instead of JSONL");console.log(" dscode --no-update-check Disable the startup new-version notice");console.log(" dscode --no-auto-update Disable background auto-update (notice still shown)");console.log(" dscode --resume Resume last session");console.log(" dscode --resume <id> Resume an existing session");console.log(" dscode codeview [options] AI code review: bugs + unwired features (JSON output)");console.log(" dscode review Review current code changes (legacy)");console.log(" dscode test-fix Run auto-fix test loop");console.log(" dscode auto Enable auto mode (auto-approve all hooks)");console.log(" dscode version Print version");console.log("");console.log("Interactive commands (inside TUI):");console.log(" /auto Toggle auto mode on/off");console.log(" /plan Toggle plan mode");console.log(" /clear Clear conversation");console.log(" /help Show help");console.log(" /context Show current context info");console.log("");console.log("Options:");console.log(" -p, --port <port> HTTP port (default: first available from 8080)");console.log(" --ws-port <port> WebSocket port (default: HTTP port + 1)");console.log(" -w, --workspace <dir> Workspace directory (default: current directory)");console.log(" -F, --force Kill existing process on target port before starting");console.log(" -b, --backend <url> Backend URL for run mode");console.log(" --ws <url> Override WebSocket URL");console.log(" --file <path> Read command from file (for exec)");console.log(" --text Output plain text (for exec/review)");console.log(" --brief Output brief results (for exec/review)");console.log(" --provider <name> Provider to use (for exec/review)");console.log(" --model <name> Model to use (for exec/review)");console.log(" --packages <list> Comma-separated packages (for test-fix)");console.log(" --retries <n> Max retry count (for test-fix, default 5)");console.log(" --skip <list> Comma-separated validations to skip (for test-fix)");console.log(" --dry-run Analyze only, no fixes applied (for test-fix)");console.log(" --focus <text> Focus area for codeview (e.g. security, performance)");console.log(" --no-fix Skip interactive fix prompt in codeview");console.log(" --output <file> Write codeview JSON report to file");console.log(" --resume [session-id] Resume a session (omit ID to resume last session)");console.log(" --theme <name|path> Theme name or JSON file path (e.g. nord, /path/to/t.json)");console.log(" --prompt-version <ver> Prompt template version (e.g. v1.0)");console.log(" --timeout <ms> Per-attempt LLM timeout (default: 300000 = 5min)");console.log(" --stall-threshold <ms> Stream stall detection threshold (default: 240000 = 4min)");console.log("");console.log("Environment:");console.log(" DEEPSEEKCODE_QUIET=1 Suppress non-fatal startup warnings (stale instance, port conflict, tips)");console.log(" DEEPSEEKCODE_NO_AUTO_UPDATE=1 Disable background auto-update (version notice still shown)");console.log(" DEEPSEEKCODE_HTTP_PORT=<n> HTTP port (default: 8080)");console.log(" DEEPSEEKCODE_WS_PORT=<n> WebSocket port (default: HTTP port + 1)");console.log(" DEEPSEEKCODE_TUI=1 Log to file instead of terminal (auto-set in start mode)")}function oj6(){const z={};const J=process.argv.slice(2);for(let D=0;D<J.length;D+=1){const K=J[D];if(K==="--force"||K==="-F")z.force=true;else if(K==="--port"||K==="-p")z.port=J[++D];else if(K==="--ws-port")z.wsPort=J[++D];else if(K==="--workspace"||K==="-w")z.workspace=J[++D];else if(K==="--backend"||K==="-b")z.backend=J[++D];else if(K==="--ws")z.ws=J[++D];else if(K==="--file")z.file=J[++D];else if(K==="--json")z.json=true;else if(K==="--text")z.text=true;else if(K==="--brief")z.brief=true;else if(K==="--provider")z.provider=J[++D];else if(K==="--model")z.model=J[++D];else if(K==="--timeout")z.timeout=J[++D];else if(K==="--stall-threshold")z.stallThreshold=J[++D];else if(K==="--packages")z.packages=J[++D];else if(K==="--retries")z.retries=J[++D];else if(K==="--skip")z.skip=J[++D];else if(K==="--dry-run")z.dryRun=true;else if(K==="--focus")z.focus=J[++D];else if(K==="--no-fix")z.noFix=true;else if(K==="--no-update-check")z.noUpdateCheck=true;else if(K==="--output")z.output=J[++D];else if(K==="--theme")z.theme=J[++D];else if(K==="--prompt-version")z.promptVersion=J[++D];else if(K==="--auto")z.auto=true;else if(K==="--resume"){const X=D+1<J.length&&!J[D+1].startsWith("-")?J[++D]:undefined;z.resume=X||true}else if(!K.startsWith("-")){if(!z._cmd)z._cmd=K;else(z._args??=[]).push(K)}}return z}async function rj6(z){return new Promise((J)=>{const D=nj6();let K=false;const X=(q)=>{if(K)return;K=true;J(q)};D.once("error",()=>X(false));D.once("listening",()=>{D.close(()=>X(true))});D.listen(z,"::")})}async function nl(z,J=20){const D=Number.isFinite(z)&&z>0?Math.floor(z):8080;for(let K=D;K<D+J;K+=1){if(await rj6(K))return K}throw new Error(`No available port found in range ${D}-${D+J-1}`)}async function TL8(z,J,D){return new Promise((K,X)=>{const q=(Z)=>{z.off("listening",Y);X(new Error(`${D} failed to listen on port ${J}: ${Z.code||Z.message}`))};const Y=()=>{z.off("error",q);K()};z.once("error",q);z.once("listening",Y);z.listen(J)})}function IL8(){if(process.env.DEEPSEEKCODE_FRAME_TIMING!=="1")return;let z=0;let J=0,D=0,K=0,X=0,q=0,Y=0;let Z=Date.now();return(G)=>{z++;const H=G.phases;if(H){if(H.renderer>J)J=H.renderer;if(H.diff>D)D=H.diff;if(H.write>K)K=H.write;if(H.optimize>X)X=H.optimize;if(H.patches>Y)Y=H.patches}if(G.durationMs>q)q=G.durationMs;if(G.durationMs>50){J1.info(`[frame-timing] SPIKE ${G.durationMs.toFixed(1)}ms renderer=${H?.renderer?.toFixed(1)} diff=${H?.diff?.toFixed(1)} write=${H?.write?.toFixed(1)} patches=${H?.patches} yogaVisited=${H?.yogaVisited} yogaMeasured=${H?.yogaMeasured} yogaLive=${H?.yogaLive}`)}if(Date.now()-Z>=1000){J1.info(`[frame-timing] ${z}fps maxTot=${q.toFixed(1)}ms renderer=${J.toFixed(1)} diff=${D.toFixed(1)} write=${K.toFixed(1)} optimize=${X.toFixed(1)} maxPatches=${Y}`);z=0;J=0;D=0;K=0;X=0;q=0;Y=0;Z=Date.now()}}}async function sj6(z,J,D,K,X,q){J1.debug("Rendering App UI");const Y=wL8();let Z=null;const{waitUntilExit:G,unmount:H}=await uS(ol.createElement(Ah,{backendUrl:z,wsUrl:J,onExit:()=>{try{Z?.()}catch{}},clientFactory:K,version:nV,workspaceDir:X,resumeSessionId:q}),{stdin:Y,exitOnCtrlC:false,onFrame:IL8()});Z=H;sl=H;await G();J1.warn("[exit] App UI exited");D()}async function tj6(z){process.env.DEEPSEEKCODE_TUI="1";const J=String(z.workspace||process.cwd());const D=Number(z.port||process.env.DEEPSEEKCODE_HTTP_PORT||8080);bL8(z);const K=Boolean(z.force);let X=[];try{const L=await WL8();X=L.stalePids}catch{}let q=await nl(D);if(K){const L=await OL8(D,X);if(L)q=await nl(D)}const Y=Number(z.wsPort||process.env.DEEPSEEKCODE_WS_PORT||q+1);const Z=Y===q?q+1:Y;const G=await nl(Z);const H=T2(bA(),".agent","logs");J1.debug(`Starting local core runtime, workspace: ${J}`);J1.debug(`AI trace file: ${T2(H,"ai-trace-*.ndjson")} (DEEPSEEKCODE_TRACE_AI=1 enables full request/response tracing)`);if(q!==D){J1.warn(`HTTP port ${D} is already in use; using ${q}`)}if(G!==Z){J1.warn(`WebSocket port ${Z} is already in use; using ${G}`)}VL8({pid:process.pid,startedAt:new Date().toISOString(),port:q,workspace:J});const V=new Uh(J);let O=false;let Q=null;function j(L="unknown"){if(O)return;O=true;J1.warn(`[exit] Shutting down... (trigger: ${L})`);const P=setTimeout(()=>{try{process.exit(0)}catch{}},3000);try{P.unref?.()}catch{}try{_.httpServer.close()}catch{}try{_.wsHttpServer.close()}catch{}try{V.close()}catch{}try{Q?.()}catch{}uE();process.exit(0)}const _=pl({runtime:V.runtime,workspaceDir:J,httpPort:q,wsPort:G,onShutdown:()=>j("web-ui")});await TL8(_.httpServer,_.httpPort,"HTTP API");await TL8(_.wsHttpServer,_.wsPort,"WebSocket");await vL8(z);process.on("SIGINT",()=>j("SIGINT"));process.on("SIGTERM",()=>j("SIGTERM"));process.on("SIGBREAK",()=>j("SIGBREAK"));if(!await V.providerConfigured()){J1.info("Provider not configured; directing user to the web config UI");if(!TA()){try{const L=`http://localhost:${_.httpPort}/#models`;const P=wj()?`\x1B]8;;${L}\x07${L}\x1B]8;;\x07`:L;process.stderr.write(`[dscode] ⚠ 尚未配置模型/Provider,请在网页端完成配置:
|
|
4384
4384
|
`+` ${P}
|
|
4385
4385
|
`+` (配置完成后回到这里即可继续,提示会自动消失)
|
|
4386
4386
|
`)}catch{}}}if(!process.stdin.isTTY){J1.warn("Non-TTY stdin detected; TUI skipped, running headless (Web UI only)");if(!TA()){try{const L=`http://localhost:${_.httpPort}`;const P=wj()?`\x1B]8;;${L}\x07${L}\x1B]8;;\x07`:L;process.stderr.write(`[dscode] Non-interactive stdin detected — TUI skipped, running headless.
|
package/package.json
CHANGED
|
@@ -1,6 +1,6 @@
|
|
|
1
1
|
{
|
|
2
2
|
"name": "@deepseekcode/cli",
|
|
3
|
-
"version": "1.0.
|
|
3
|
+
"version": "1.0.17",
|
|
4
4
|
"description": "DeepSeekCode TypeScript CLI",
|
|
5
5
|
"type": "module",
|
|
6
6
|
"license": "Apache-2.0",
|
|
@@ -63,4 +63,4 @@
|
|
|
63
63
|
"typescript": "^5.6.3",
|
|
64
64
|
"vitest": "^4.1.7"
|
|
65
65
|
}
|
|
66
|
-
}
|
|
66
|
+
}
|