dskcode 0.1.48 → 0.1.50

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.
@@ -0,0 +1,2 @@
1
+ import{a}from"./chunk-XADXUHKL.js";import"./chunk-MDFCAIOB.js";import"./chunk-LPD7BHH5.js";export{a as InteractiveGate};
2
+ //# sourceMappingURL=interactive-gate-WMAYTMZ6.js.map
package/package.json CHANGED
@@ -1,6 +1,6 @@
1
1
  {
2
2
  "name": "dskcode",
3
- "version": "0.1.48",
3
+ "version": "0.1.50",
4
4
  "keywords": [
5
5
  "cli",
6
6
  "ink",
@@ -1,5 +0,0 @@
1
- import{a as d}from"./chunk-MDFCAIOB.js";import{d as o}from"./chunk-LPD7BHH5.js";o();o();import{createHash as w}from"crypto";function p(t){let n=u(t),e=w("sha256");return e.update(n),e.digest("hex").slice(0,16)}function u(t){if(t===null)return"null";if(t===void 0)return"";if(typeof t=="boolean")return t?"true":"false";if(typeof t=="number")return Number.isFinite(t)?String(t):"null";if(typeof t=="string")return JSON.stringify(t);if(typeof t=="bigint")return t.toString();if(typeof t=="function")return'"[function]"';if(Array.isArray(t))return"["+t.map(n=>u(n)).join(",")+"]";if(typeof t=="object"){let n=t,e=Object.keys(n).sort(),i=[];for(let s of e){let r=n[s];r!==void 0&&i.push(JSON.stringify(s)+":"+u(r))}return"{"+i.join(",")+"}"}return JSON.stringify(t)}var a=class{#n=new Map;add(n,e){this.#n.set(this.#t(n,e),!0)}has(n,e){return this.#n.has(this.#t(n,e))}revoke(n,e){return this.#n.delete(this.#t(n,e))}clear(){this.#n.clear()}get size(){return this.#n.size}#t(n,e){return`${n}:${e}`}};var g=class{#n;#t;#i;#s;#o;#e=void 0;constructor(n={}){this.#n=n.engine??new d([]),this.#t=n.grants??new a,this.#i=n.prompt??P,this.#s=n.defaultDecision??"confirm",this.#o=n.onDecision}get grants(){return this.#t}get engine(){return this.#n}async check(n,e){let i=p(e),s={args:e,targetPath:x(e)},r=this.#n.evaluate(n,s);if(r==="allow")return this.#e=void 0,this.#r(n,i,"allow","allow","rule"),!0;if(r==="deny")return this.#e={source:"permission_rule",reason:h(n,"deny",this.#n,s),hint:"\u53EF\u5728 ~/.dskcode/permissions.json \u6216 .dskcode/permissions.json \u4E2D\u8C03\u6574\u6216\u5220\u9664\u8BE5 deny \u89C4\u5219\u3002"},this.#r(n,i,"deny","deny","rule"),!1;if(r==="confirm"&&this.#t.has(n,i))return this.#e=void 0,this.#r(n,i,"confirm","allow","grant"),!0;let l=r??this.#s;if(l==="allow"&&r===null)return this.#e=void 0,this.#r(n,i,null,"allow","default"),!0;if(l==="deny"&&r===null)return this.#e={source:"permission_rule",reason:`\u9ED8\u8BA4\u51B3\u7B56\u662F deny\uFF08\u672A\u5339\u914D\u4EFB\u4F55\u89C4\u5219\u7684 ${n} \u8C03\u7528\uFF09`,hint:"\u53EF\u5728 ~/.dskcode/permissions.json \u52A0\u4E00\u6761 allow \u89C4\u5219\u53D6\u6D88\u62D2\u7EDD\u3002"},this.#r(n,i,null,"deny","default"),!1;let f=h(n,r,this.#n,s),c=await this.#i({toolName:n,args:e,reason:f,ruleAction:r??void 0});return c==="no"?(this.#e={source:"user_prompt",reason:`\u7528\u6237\u624B\u52A8\u62D2\u7EDD\uFF1A${f}`},this.#r(n,i,r,"deny","prompt"),!1):(c==="always"&&this.#t.add(n,i),this.#e=void 0,this.#r(n,i,r,"allow","prompt"),!0)}get lastDenial(){return this.#e}#r(n,e,i,s,r){this.#o?.({toolName:n,argsHash:e,ruleAction:i,finalAction:s,via:r})}},P=t=>(console.warn(`[InteractiveGate] \u672A\u4F20\u8BE2\u95EE\u56DE\u8C03\uFF0C\u9ED8\u8BA4\u62D2\u7EDD\u786E\u8BA4\u8BF7\u6C42\u3002
2
- \u5DE5\u5177: ${t.toolName}
3
- \u539F\u56E0: ${t.reason}
4
- \u5982\u9700\u4EA4\u4E92\u5F0F\u5BA1\u6279\uFF0C\u8BF7\u5728\u521B\u5EFA InteractiveGate \u65F6\u4F20 prompt \u9009\u9879\u3002`),"no");function x(t){if(typeof t!="object"||t===null)return;let n=t,e=["path","file_path","filePath","filepath","target"];for(let i of e){let s=n[i];if(typeof s=="string"&&s.length>0)return s}}function h(t,n,e,i){if(n==="confirm"){let s=e.rules.find(r=>r.tool===t&&r.action==="confirm");if(s){if(s.reason)return s.reason;let r=b(s.match);return`\u89C4\u5219\u547D\u4E2D\uFF1A${t}${r?`\uFF08${r}\uFF09`:""}\u3002\u672C\u6B21\u8C03\u7528\u9700\u8981\u786E\u8BA4\u662F\u5426\u653E\u884C\u3002`}return`\u5DE5\u5177 \`${t}\` \u88AB\u89C4\u5219\u6807\u8BB0\u4E3A\u9700\u8981\u786E\u8BA4\uFF0C\u662F\u5426\u653E\u884C\uFF1F`}return`\u5DE5\u5177 \`${t}\` \u6CA1\u6709\u5339\u914D\u7684\u89C4\u5219\uFF0C\u9ED8\u8BA4\u9700\u8981\u4F60\u786E\u8BA4\u662F\u5426\u653E\u884C\u3002`}function b(t){if(!t)return"";let n=[];if(t.commandRegex&&n.push(`\u547D\u4EE4\u6B63\u5219=${t.commandRegex}`),t.pathGlob&&n.push(`\u8DEF\u5F84 glob=${t.pathGlob}`),t.argValueRegex){let e=Object.entries(t.argValueRegex).map(([i,s])=>`${i}=${s}`).join(", ");n.push(`\u53C2\u6570\u89C4\u5219=${e}`)}return n.join("; ")}export{g as a};
5
- //# sourceMappingURL=chunk-KMMG6QC6.js.map
@@ -1,12 +0,0 @@
1
- import{d as p}from"./chunk-LPD7BHH5.js";p();var Et="ws://127.0.0.1:54006";p();import{mkdir as Te,appendFile as Ie}from"fs/promises";import{fileURLToPath as Oe}from"url";import{join as K,basename as V,sep as C}from"path";var ie="logger",ae=2e3,je=500;function E(){let t=process.env.HOME??process.env.USERPROFILE??"~";return K(t,".dskcode","logs")}function Ae(t){return V(t)||"_root"}var z=class t{static#n=new Set;static async flushAll(){let e=[];for(let n of t.#n)e.push(n.flush());await Promise.allSettled(e)}static async endAllAndFlush(){let e=[];for(let n of t.#n)e.push(n.#c());await Promise.allSettled(e)}#e;#t;#i;#o=Promise.resolve();#s=0;#r=!1;#a=!1;constructor(e,n,o){if(this.#t=o?.enabled??!0,this.#i=Date.now(),!this.#t){this.#e="";return}let r=o?.logsDir??E(),s=Ae(n);this.#e=K(r,s,`${e}.jsonl`),t.#n.add(this)}get logPath(){return this.#e}get enabled(){return this.#t}log(e){if(!this.#t||this.#r||this.#s>=je)return;let n={...e,time:e.time??_e(e.ts),loc:e.loc??ce()};this.#s++,this.#o=this.#o.then(()=>this.#d(n)).catch(()=>{}).finally(()=>this.#s--)}async flush(){this.#r=!0,await this.#o.catch(()=>{}),t.#n.delete(this)}async#c(){this.#t&&(this.#r||(this.#a||(this.logSessionEnd(Date.now()-this.#i),this.#a=!0),await this.flush()))}async#d(e){let n=K(this.#e,"..");await Te(n,{recursive:!0});let o=Ue(e);await Ie(this.#e,o,"utf-8")}logSessionStart(e,n,o,r){this.log({ts:Date.now(),type:"session_start",sessionId:e,cwd:n,model:o,mode:r})}logUserMessage(e){this.log({ts:Date.now(),type:"user_message",content:e})}logAssistantText(e,n){this.log({ts:Date.now(),type:"assistant_text",content:e,round:n})}logReasoning(e,n){this.log({ts:Date.now(),type:"reasoning",content:e,round:n})}logToolCall(e,n,o,r,s){this.log({ts:Date.now(),type:"tool_call",name:e,callId:n,arguments:o,...s!==void 0?{parsedArgs:s}:{},round:r})}logToolResult(e,n,o,r,s,i,d,u){this.log({ts:Date.now(),type:"tool_result",name:e,callId:n,success:o,data:De(r),...s?{error:s}:{},...i!==void 0?{elapsed:i}:{},...u?{schemaIssues:u}:{},round:d})}logUsage(e,n,o,r,s,i){this.log({ts:Date.now(),type:"usage",model:e,promptTokens:n,completionTokens:o,...r!==void 0?{cachedPromptTokens:r}:{},cost:s,round:i})}logError(e,n){this.log({ts:Date.now(),type:"error",message:e,...n?{stack:n}:{}})}logTurnDone(e,n){this.log({ts:Date.now(),type:"turn_done",elapsed:e,toolRounds:n})}logSessionEnd(e){this.log({ts:Date.now(),type:"session_end",elapsed:e})}logReflections(e){this.log({ts:Date.now(),type:"reflection",items:e})}};function De(t){return t.length<=ae?t:t.slice(0,ae)+`...[\u5DF2\u622A\u65AD\uFF0C\u539F\u59CB\u957F\u5EA6 ${t.length}]`}function _e(t){let e=new Date(t),n=(o,r=2)=>String(o).padStart(r,"0");return`${e.getFullYear()}-${n(e.getMonth()+1)}-${n(e.getDate())} ${n(e.getHours())}:${n(e.getMinutes())}:${n(e.getSeconds())}.${n(e.getMilliseconds(),3)}`}var D=null;function Ne(){if(D!==null)return D;try{let t=Oe(import.meta.url),e=t.split(C),n=e.lastIndexOf("src");D=n>0?e.slice(0,n).join(C):t}catch{D=""}return D}var Me=/\s+at\s+.+?\((.+):(\d+):\d+\)|\s+at\s+(.+):(\d+):\d+/;function ce(){let t;try{let o=new Error;Error.captureStackTrace?.(o,ce),t=o.stack}catch{return{file:"<unknown>",line:0}}if(!t)return{file:"<unknown>",line:0};let e=Ne(),n=t.split(`
2
- `);for(let o of n){let r=Me.exec(o);if(!r)continue;let s=r[1]??r[3]??"",i=Number(r[2]??r[4]??"0");if(!s)continue;let d=s.replace(/^file:\/\/\//,"").replace(/^file:\/\//,"");if(d.includes(`${C}${ie}${C}`)||d.endsWith(`${C}${ie}`)||d.includes(`${C}node_modules${C}`))continue;let u=d;return e&&d.startsWith(e)&&(u=d.slice(e.length).replace(/^[/\\]/,"")||V(d)),{file:u||V(d),line:i}}return{file:"<unknown>",line:0}}var $e=80,Fe="\u2500".repeat($e);function Ue(t){let e=`[${t.time}] [${t.type}] @ ${t.loc.file}:${t.loc.line}`,n=JSON.stringify(t,null,2);return`${Fe}
3
- ${e}
4
- ${n}
5
-
6
- `}p();p();var We="\u2500".repeat(80);function de(t){return t.split(We).map(e=>e.trim()).filter(e=>e.length>0)}function Be(t){let e=t.split(`
7
- `),n=e.findIndex(o=>o.trimStart().startsWith("{"));if(n<0)throw new Error("log block: \u627E\u4E0D\u5230 JSON \u8D77\u59CB\u884C");return e.slice(n).join(`
8
- `)}function le(t){let e;try{e=Be(t)}catch(n){let o=t.slice(0,200);throw new Error(`parseBlock \u5931\u8D25: ${n.message}; block \u9884\u89C8: ${o}`)}return JSON.parse(e)}function q(t){let e=de(t),n=[];for(let o of e)try{n.push(le(o))}catch{}return n}p();import{readdir as ue,readFile as Je,stat as He}from"fs/promises";import{join as G,basename as Mt,sep as $t}from"path";function Ke(t){for(let e of t)if(e.type==="session_start")return{startedAt:e.ts,cwd:e.cwd??"",model:e.model??""};return{startedAt:0,cwd:"",model:""}}async function $(t,e,n){let o=G(t,e,`${n}.jsonl`);try{let[r,s]=await Promise.all([He(o),Je(o,"utf-8")]);return{events:q(s),size:r.size,mtime:r.mtimeMs}}catch(r){if(r.code==="ENOENT")return{events:[],size:0,mtime:0};throw r}}function O(t,e){if(!/^[A-Za-z0-9._-]+$/.test(t))throw new Error(`${e} \u5305\u542B\u975E\u6CD5\u5B57\u7B26: ${t}`)}async function X(t,e=E()){let n;try{n=await ue(e)}catch(s){if(s.code==="ENOENT")return{projects:[],sessions:[]};throw s}let o=[],r=[];for(let s of n){if(!/^[A-Za-z0-9._-]+$/.test(s)||t.projectName&&s!==t.projectName)continue;let i=G(e,s),d;try{d=await ue(i)}catch{continue}let u=!1;for(let v of d){if(!v.endsWith(".jsonl"))continue;let w=v.slice(0,-6);if(/^[A-Za-z0-9._-]+$/.test(w))try{let{events:m,size:x,mtime:B}=await $(e,s,w);if(t.activeOnly){if(m.some(S=>S.type==="session_end"))continue;let I=t.activeStaleMs??10*6e4;if(I>0&&m.length>0){let S=m[m.length-1];if(S&&Date.now()-S.ts>I)continue}}let y=Ke(m);r.push({project:s,sessionId:w,size:x,mtime:B,startedAt:y.startedAt,cwd:y.cwd,model:y.model}),u=!0}catch{}}u&&o.push(s)}return o.sort((s,i)=>s.localeCompare(i)),r.sort((s,i)=>i.startedAt-s.startedAt),{projects:o,sessions:r}}async function F(t,e=E()){O(t.project,"project"),O(t.sessionId,"sessionId");let{events:n,size:o,mtime:r}=await $(e,t.project,t.sessionId),s=n.length,i=Math.max(0,t.fromIndex??0),d=Math.max(1,Math.min(t.limit??200,2e3)),u=n.slice(i,i+d);return{project:t.project,sessionId:t.sessionId,total:s,events:u,hasMore:i+u.length<s,size:o,mtime:r}}async function Y(t,e=E(),n){O(t.project,"project"),O(t.sessionId,"sessionId");let o=G(e,t.project,`${t.sessionId}.jsonl`),r=Math.max(100,Math.min(t.timeoutMs??3e4,12e4)),s=Math.max(50,Math.min(t.pollIntervalMs??300,2e3)),i=Math.max(0,t.fromIndex??0),u=Date.now()+r,v=await $(e,t.project,t.sessionId);if(v.events.length>i)return{project:t.project,sessionId:t.sessionId,events:v.events.slice(i),total:v.events.length,timedOut:!1};for(;;){if(n?.aborted)return{project:t.project,sessionId:t.sessionId,events:[],total:v.events.length,timedOut:!0};if(Date.now()>=u)return{project:t.project,sessionId:t.sessionId,events:[],total:v.events.length,timedOut:!0};if(await new Promise(m=>setTimeout(m,s)),n?.aborted)return{project:t.project,sessionId:t.sessionId,events:[],total:v.events.length,timedOut:!0};let w;try{w=await $(e,t.project,t.sessionId)}catch{continue}if(w.events.length>i)return{project:t.project,sessionId:t.sessionId,events:w.events.slice(i),total:w.events.length,timedOut:!1}}}async function Z(t,e=E()){if(!t.content||!t.content.trim())throw new Error("EMPTY_CONTENT: content \u4E0D\u80FD\u4E3A\u7A7A");O(t.project,"project"),O(t.sessionId,"sessionId");let{SessionRegistry:n}=await import("./session-registry-HSCHBXFO.js"),o=n.get(t.project,t.sessionId);if(!o)throw new Error(`SESSION_NOT_FOUND: \u8FDB\u7A0B\u5185\u6CA1\u6709\u627E\u5230 sessionId=${t.sessionId} (project=${t.project})\u3002\u53EF\u80FD\u8BE5 dskcode \u8FDB\u7A0B\u5DF2\u9000\u51FA\uFF0C\u6216 model \u5207\u6362\u5BFC\u81F4 session \u88AB\u91CD\u5EFA\u3002`);if(o.remoteInput)try{await o.remoteInput.onRemoteUserInput(t.content,"chrome")}catch(s){let i=s instanceof Error?s:new Error(String(s));throw new Error(`REMOTE_REJECTED: ${i.message}`,{cause:i})}else try{for await(let s of o.session.chat(t.content));}catch(s){let i=s instanceof Error?s:new Error(String(s));throw new Error(`CHAT_FAILED: ${i.message}`,{cause:i})}if(o.flushLogger)try{await o.flushLogger()}catch{}else await new Promise(s=>setTimeout(s,50));return{ok:!0,accepted:!0,totalEvents:(await F({project:t.project,sessionId:t.sessionId,fromIndex:0,limit:1},e)).total}}p();import{WebSocketServer as ft}from"ws";import{EventEmitter as pt}from"events";import{copyFile as mt,mkdir as ht,readFile as vt,writeFile as yt}from"fs/promises";import{existsSync as ne}from"fs";import{join as oe}from"path";import{randomUUID as wt}from"crypto";import{readFileSync as Rt}from"fs";import{fileURLToPath as bt}from"url";p();import{existsSync as Ve,watch as ze}from"fs";import{mkdir as U,readFile as _,writeFile as W}from"fs/promises";import{join as R}from"path";var j={defaultProvider:"deepseek",maxTokens:8192,temperature:.7,maxToolRounds:20,providers:[{name:"deepseek",baseUrl:"https://api.deepseek.com",model:"deepseek-v4-flash"}],tools:[{name:"read_file",enabled:!0},{name:"write_file",enabled:!0},{name:"edit_file",enabled:!0},{name:"bash",enabled:!0},{name:"glob",enabled:!0},{name:"grep",enabled:!0},{name:"ls",enabled:!0},{name:"fetch",enabled:!0}],plugins:[],stock:{symbols:[{code:"sh000001"},{code:"sz399300"},{code:"sh601899"}]},thinking:{enabled:!1,effort:"high"}};function ge(t){if(t)return[t];let e=process.env.HOME??process.env.USERPROFILE??"~";return[R(e,".dskcode","settings.json"),R(process.cwd(),".dskcode","settings.json")]}function qe(t,e){let n={...t};return e.defaultProvider!==void 0&&(n.defaultProvider=e.defaultProvider),e.verbose!==void 0&&(n.verbose=e.verbose),e.maxTokens!==void 0&&(n.maxTokens=e.maxTokens),e.temperature!==void 0&&(n.temperature=e.temperature),e.maxToolRounds!==void 0&&(n.maxToolRounds=e.maxToolRounds),e.budgetLimit!==void 0&&(n.budgetLimit=e.budgetLimit),e.tokenBudgetLimit!==void 0&&(n.tokenBudgetLimit=e.tokenBudgetLimit),e.providers!==void 0&&(n.providers=e.providers),e.tools!==void 0&&(n.tools=e.tools),e.plugins!==void 0&&(n.plugins=e.plugins),e.stock!==void 0&&(n.stock=e.stock),e.voice!==void 0&&(n.voice=e.voice),e.permissions!==void 0&&(n.permissions=e.permissions),e.thinking!==void 0&&(n.thinking=e.thinking),n}var P="DSKCODE_",Ge={[`${P}DEFAULT_PROVIDER`]:"defaultProvider",[`${P}VERBOSE`]:"verbose",[`${P}MAX_TOKENS`]:"maxTokens",[`${P}TEMPERATURE`]:"temperature",[`${P}MAX_TOOL_ROUNDS`]:"maxToolRounds",[`${P}BUDGET_LIMIT`]:"budgetLimit",[`${P}TOKEN_BUDGET_LIMIT`]:"tokenBudgetLimit",[`${P}THINKING`]:"thinking.enabled",[`${P}THINKING_EFFORT`]:"thinking.effort"};function Xe(t){let e={...t,providers:[...t.providers]};for(let[o,r]of Object.entries(Ge)){let s=process.env[o];if(s!==void 0){if(r.startsWith("thinking.")){let i=r.slice(9),d=e.thinking??{enabled:!1,effort:"high"};i==="enabled"?e.thinking={...d,enabled:s==="1"||s.toLowerCase()==="true"}:i==="effort"&&(s==="high"||s==="max")&&(e.thinking={...d,effort:s});continue}switch(r){case"verbose":case"defaultProvider":{e[r]=s;break}case"maxTokens":case"maxToolRounds":case"budgetLimit":case"tokenBudgetLimit":{let i=Number(s);Number.isFinite(i)&&i>=0&&(e[r]=i);break}case"temperature":{let i=Number(s);Number.isFinite(i)&&i>=0&&i<=2&&(e[r]=i);break}}}}let n=process.env.DEEPSEEK_API_KEY;if(n){let o=e.providers.findIndex(r=>r.name==="deepseek");if(o!==-1){let r=e.providers[o];r.apiKey||(e.providers[o]={...r,apiKey:n})}else e.providers.unshift({name:"deepseek",baseUrl:"https://api.deepseek.com",model:"deepseek-v4-flash",apiKey:n})}return e}function Qt(t,e){let n={...t,providers:[...t.providers]};if(e.verbose!==void 0&&(n.verbose=e.verbose),e.model!==void 0){let o=n.providers.findIndex(r=>r.name===n.defaultProvider);o!==-1&&(n.providers[o]={...n.providers[o],model:e.model})}return e.maxTokens!==void 0&&e.maxTokens>0&&(n.maxTokens=e.maxTokens),e.temperature!==void 0&&e.temperature>=0&&e.temperature<=2&&(n.temperature=e.temperature),e.budgetLimit!==void 0&&e.budgetLimit>=0&&(n.budgetLimit=e.budgetLimit),e.tokenBudgetLimit!==void 0&&e.tokenBudgetLimit>=0&&(n.tokenBudgetLimit=e.tokenBudgetLimit),n}function Ye(t){let e=[];(!t.providers||t.providers.length===0)&&e.push({field:"providers",message:"\u81F3\u5C11\u9700\u8981\u914D\u7F6E\u4E00\u4E2A Provider\u3002\u8BF7\u901A\u8FC7\u914D\u7F6E\u6587\u4EF6\u6216 DEEPSEEK_API_KEY \u73AF\u5883\u53D8\u91CF\u8BBE\u7F6E\u3002"});let n=["deepseek-v4-flash","deepseek-v4-pro"];for(let o=0;o<t.providers.length;o++){let r=t.providers[o];r.name||e.push({field:`providers[${o}].name`,message:`\u7B2C ${o+1} \u4E2A Provider \u7F3A\u5C11 name \u5B57\u6BB5\u3002`}),r.model?n.includes(r.model)||e.push({field:`providers[${o}].model`,message:`Provider "${r.name||o}" \u7684 model "${r.model}" \u4E0D\u53D7\u652F\u6301\u3002dskcode \u4EC5\u652F\u6301: ${n.join(", ")}`}):e.push({field:`providers[${o}].model`,message:`Provider "${r.name||o}" \u7F3A\u5C11 model \u5B57\u6BB5\u3002`})}return t.defaultProvider&&(t.providers.some(r=>r.name===t.defaultProvider)||e.push({field:"defaultProvider",message:`\u9ED8\u8BA4 Provider "${t.defaultProvider}" \u672A\u5728 providers \u4E2D\u5B9A\u4E49\u3002`})),t.temperature!==void 0&&(t.temperature<0||t.temperature>2)&&e.push({field:"temperature",message:"temperature \u5FC5\u987B\u5728 0.0 ~ 2.0 \u4E4B\u95F4\u3002"}),t.maxTokens!==void 0&&t.maxTokens<1&&e.push({field:"maxTokens",message:"maxTokens \u5FC5\u987B\u5927\u4E8E\u7B49\u4E8E 1\u3002"}),t.maxToolRounds!==void 0&&t.maxToolRounds<1&&e.push({field:"maxToolRounds",message:"maxToolRounds \u5FC5\u987B\u5927\u4E8E\u7B49\u4E8E 1\u3002"}),t.budgetLimit!==void 0&&t.budgetLimit<0&&e.push({field:"budgetLimit",message:"budgetLimit \u5FC5\u987B\u5927\u4E8E\u7B49\u4E8E 0\uFF080 \u8868\u793A\u4E0D\u9650\u5236\uFF09\u3002"}),t.tokenBudgetLimit!==void 0&&t.tokenBudgetLimit<0&&e.push({field:"tokenBudgetLimit",message:"tokenBudgetLimit \u5FC5\u987B\u5927\u4E8E\u7B49\u4E8E 0\uFF080 \u8868\u793A\u4E0D\u9650\u5236\uFF09\u3002"}),e}async function fe(t){let e=ge(t),n=structuredClone(j);for(let o of e)try{let r=await _(o,"utf-8"),s=JSON.parse(r);n=qe(n,s)}catch{}return n=Xe(n),n}async function Q(t){let e=await fe(t),n=Ye(e);return{config:e,errors:n}}function pe(t,e){let n=ge(e).filter(s=>Ve(s));n.length===0&&n.push(R(process.cwd(),".dskcode","settings.json"));let o=[],r;for(let s of n)try{let i=ze(s,d=>{d==="change"&&(r&&clearTimeout(r),r=setTimeout(()=>{(async()=>{try{let u=await fe(e);t(u)}catch{}})()},300))});o.push(i)}catch{}return()=>{r&&clearTimeout(r);for(let s of o)s.close()}}async function en(t){let e=process.env.HOME??process.env.USERPROFILE??"~",n=R(e,".dskcode"),o=R(n,"settings.json");await U(n,{recursive:!0});let r;try{let d=await _(o,"utf-8");r=JSON.parse(d)}catch{r=structuredClone(j)}let s=r.providers??[],i=s.find(d=>d.name==="deepseek");return i?i.apiKey=t:s.push({name:"deepseek",apiKey:t,baseUrl:"https://api.deepseek.com",model:"deepseek-v4-flash"}),r.providers=s,await W(o,JSON.stringify(r,null,2),"utf-8"),o}async function tn(t){let e=process.env.HOME??process.env.USERPROFILE??"~",n=R(e,".dskcode"),o=R(n,"settings.json");await U(n,{recursive:!0});let r;try{let u=await _(o,"utf-8");r=JSON.parse(u)}catch{r=structuredClone(j)}let s=r.providers??[],i=r.defaultProvider??"deepseek",d=s.find(u=>u.name===i);return d?d.model=t:s.push({name:i,baseUrl:"https://api.deepseek.com",model:t}),r.providers=s,await W(o,JSON.stringify(r,null,2),"utf-8"),o}async function nn(t){let e=process.env.HOME??process.env.USERPROFILE??"~",n=R(e,".dskcode"),o=R(n,"settings.json");await U(n,{recursive:!0});let r;try{let s=await _(o,"utf-8");r=JSON.parse(s)}catch{r=structuredClone(j)}return r.stock={symbols:t},await W(o,JSON.stringify(r,null,2),"utf-8"),o}async function on(){let t=process.env.HOME??process.env.USERPROFILE??"~",e=R(t,".dskcode"),n=R(e,"settings.json");await U(e,{recursive:!0});let o;try{let r=await _(n,"utf-8");o=JSON.parse(r)}catch{return null}return o.permissions!==void 0?null:(o.permissions={tools:{}},await W(n,JSON.stringify(o,null,2),"utf-8"),n)}p();p();import{mkdir as Ze,readFile as ln,writeFile as Qe,unlink as et}from"fs/promises";import{randomUUID as tt}from"crypto";import{existsSync as nt}from"fs";import{join as ot,dirname as st}from"path";import{rename as rt}from"fs";function me(t){let e=t??process.env.HOME??process.env.USERPROFILE??"";return ot(e,".dskcode","config-ui.json")}async function he(t,e){let n=me(e);await Ze(st(n),{recursive:!0});let o={version:1,token:tt(),endpoints:{ws:t},pid:process.pid,startedAt:new Date().toISOString()},r=n+".tmp";return await Qe(r,JSON.stringify(o,null,2)+`
9
- `,"utf8"),await it(r,n),n}async function ve(t){let e=me(t);if(nt(e))try{await et(e)}catch{}}async function it(t,e){await new Promise((n,o)=>{rt(t,e,r=>r?o(r):n())})}p();import{appendFile as at,mkdir as ct,truncate as dt}from"fs/promises";import{existsSync as lt}from"fs";import{join as ye}from"path";function we(t){let e=t??process.env.HOME??process.env.USERPROFILE??"";return ye(e,".dskcode","wslog.jsonl")}async function Re(t={}){if(t.disabled)return{path:"",log:()=>{},close:async()=>{}};let e=we(t.home);try{await ct(ye(e,".."),{recursive:!0})}catch{return{path:"",log:()=>{},close:async()=>{}}}let n=()=>new Date().toISOString();return{path:e,log(o){let r={ts:n(),pid:process.pid,...o},s;try{s=JSON.stringify(r)+`
10
- `}catch{return}at(e,s,"utf8").catch(()=>{})},async close(){}}}function be(t){return!t||typeof t!="object"?[]:Object.keys(t)}async function ke(t){let e=we(t);if(e&&lt(e))try{await dt(e,0)}catch{}}function N(t,e=1024){return t?t.length<=e?t:t.slice(0,e)+"\u2026(truncated)":""}var T=null;function ee(){if(T!==null)return T;try{let t=[new URL("../../package.json",import.meta.url),new URL("../../../package.json",import.meta.url)];for(let e of t)try{let n=bt(e),o=Rt(n,"utf8");return T=JSON.parse(o).version??"0.0.0",T}catch{}T="unknown"}catch{T="unknown"}return T}var se=class extends Error{constructor(n,o){super(`\u7AEF\u53E3 ${o} \u5DF2\u88AB\u5176\u4ED6\u8FDB\u7A0B\u5360\u7528\uFF08\u591A\u534A\u662F\u53E6\u4E00\u4E2A dskcode\uFF09\u3002\u5982\u679C\u662F\u53E6\u4E00\u4EFD dskcode \u5148\u542F\u7684 ws\uFF0C\u8981\u4E48\u5148\u5173\u6389\u5B83\uFF0C\u8981\u4E48\u6539\u672C\u4FA7 host:port\u3002`);this.host=n;this.port=o;this.name="PortInUseError"}host;port};function A(t){if(t)return t;let e=process.env.HOME??process.env.USERPROFILE??"",n=oe(e,".dskcode","settings.json");if(ne(n))return n;let o=oe(process.cwd(),".dskcode","settings.json");return ne(o)?o:n}async function kt(t,e){let n=A(e);await ht(oe(n,".."),{recursive:!0});let o={};try{let s=await vt(n,"utf8"),i=JSON.parse(s);i&&typeof i=="object"&&(o=i)}catch{o=structuredClone(j)}for(let[s,i]of Object.entries(t))i!==void 0&&(o[s]=i);let r=JSON.stringify(o,null,2)+`
11
- `;if(ne(n))try{await mt(n,n+".bak")}catch{}return await Lt(n,r),n}async function Lt(t,e){let n=[0,200,500,1500,3e3],o;for(let r of n){r>0&&await new Promise(s=>setTimeout(s,r));try{await yt(t,e,"utf8");return}catch(s){if(o=s,process.platform!=="win32")throw s;let i=s.code;if(i!=="EPERM"&&i!=="EACCES"&&i!=="EBUSY")throw s}}throw o}async function Nn(t={}){let e=t.host??"127.0.0.1",n=t.port??54006,o=wt(),r=t.logsDir??E();t.disableWsLog!==!0&&t.truncateWsLogOnStart!==!1&&await ke(t.home);let s=await Re({home:t.home,disabled:t.disableWsLog===!0}),i=new ft({host:e,port:n}),d=new pt,u="config.reloaded",v=0,w=a=>{let g=A(t.configPath),l={configPath:g,source:a},c=Le(y,{kind:"event",method:"event.runtime.reload",payload:l});return d.emit(u,l),s.log({kind:"reload.emit",source:a,configPath:g,subscribers:y.size}),c};function m(a,g,l){te(a,{id:g,ok:!0,result:l});let h=a._socket;s.log({kind:"rpc.out",clientIp:h?.remoteAddress,id:g,ok:!0,resultKeys:l&&typeof l=="object"?Object.keys(l):[]})}function x(a,g,l){te(a,{id:g,ok:!1,error:l});let h=a._socket;s.log({kind:"rpc.err",clientIp:h?.remoteAddress,id:g,code:l?.code,message:N(l?.message,200)})}let B=new Promise((a,g)=>{i.once("listening",()=>{let l=i.address();a({port:l.port})}),i.once("error",l=>{l&&l.code==="EADDRINUSE"?g(new se(e,n)):g(l instanceof Error?l:new Error(String(l)))})});t.autoStart;let y=new Set;i.on("connection",a=>{let g=a._socket,l=g?.remoteAddress??"unknown",c=g?.remotePort??0,h=Date.now();s.log({kind:"client.connect",clientIp:l,clientPort:c});let f={kind:"hello",version:1,configPath:A(t.configPath),authToken:o,dskcodeVersion:ee()};te(a,f),s.log({kind:"client.hello",clientIp:l,clientPort:c}),a.on("message",b=>{Ee(a,b.toString())}),a.on("close",(b,M)=>{y.delete(a);let Ce=M?M.toString():"";s.log({kind:"client.disconnect",clientIp:l,clientPort:c,code:b,reason:N(Ce,200),durationMs:Date.now()-h})}),a.on("error",b=>{y.delete(a),s.log({kind:"client.error",clientIp:l,clientPort:c,message:N(b?.message,200)})}),y.add(a)});let re=pe(async a=>{if(Date.now()<v){s.log({kind:"config.changed",suppressed:!0});return}await Le(y,{kind:"event",method:"event.config.changed",payload:{config:a,configPath:A(t.configPath),source:"file"}});let g=A(t.configPath);d.emit(u,{configPath:g,source:"file"}),s.log({kind:"config.changed",source:"file",configPath:g,keyCount:a&&typeof a=="object"?Object.keys(a).length:0,subscribers:y.size})},t.configPath),{port:I}=await B,S=`ws://${e}:${I}`,J="";t.persistConnectionInfo!==!1&&(t.home&&(process.env.HOME=t.home,process.env.USERPROFILE=t.home),J=await he(S,t.home)),s.log({kind:"server.start",host:e,port:I,url:S,pid:process.pid,dskcodeVersion:ee(),connectionInfoPath:J||null,logPath:s.path||null,truncated:t.disableWsLog!==!0&&t.truncateWsLogOnStart!==!1});let H={ws:i,host:e,port:I,url:S,connectionInfoPath:J,authToken:o,dskcodeVersion:ee(),onConfigChanged:a=>(d.on(u,a),()=>d.off(u,a)),notifyReload:a=>w(a),close:async()=>{s.log({kind:"server.close",reason:"explicit"}),re(),d.removeAllListeners(u);for(let a of y)try{a.close()}catch{}await new Promise(a=>i.close(()=>a())),t.persistConnectionInfo!==!1&&await ve(t.home),await s.close()}};return H.__suppressEchoUntil=a=>{v=a},H;async function Ee(a,g){let l=a._socket,c;try{c=JSON.parse(g)}catch{return s.log({kind:"rpc.in",clientIp:l?.remoteAddress,parseError:!0,preview:N(g,200)}),x(a,0,{code:"BAD_JSON",message:"invalid JSON"})}if(typeof c.id!="number"||typeof c.method!="string")return s.log({kind:"rpc.in",clientIp:l?.remoteAddress,method:c?.method,badShape:!0}),x(a,0,{code:"BAD_REQUEST",message:"id/method missing"});s.log({kind:"rpc.in",clientIp:l?.remoteAddress,id:c.id,method:c.method});let h=c.params??{};if(h.token!==o){let f=h.token;return s.log({kind:"rpc.auth_fail",clientIp:l?.remoteAddress,id:c.id,method:c.method,tokenProvided:typeof f=="string"&&f.length>0,tokenLen:typeof f=="string"?f.length:0}),x(a,c.id,{code:"UNAUTHORIZED",message:"bad token"})}try{switch(c.method){case"config.get":return await m(a,c.id,await Pe(t.configPath));case"config.set":{let f=await Se(h.patch??{},t.configPath,H.__suppressEchoUntil);m(a,c.id,f),await w("api");return}case"config.schema":return m(a,c.id,xe());case"config.watch.subscribe":return m(a,c.id,{subscribed:!0});case"logs.list":{let f=await X(h??{},r);return m(a,c.id,f)}case"logs.read":{let f=await F(h,r);return m(a,c.id,f)}case"logs.tail":{let f=new AbortController,b=()=>f.abort();a.once("close",b);try{let M=await Y(h,r,f.signal);return m(a,c.id,M)}finally{a.off("close",b)}}case"chat.send":{let f=await Z(h,r);return m(a,c.id,f)}case"ping":return m(a,c.id,{pong:Date.now()});default:return x(a,c.id,{code:"UNKNOWN_METHOD",message:`unknown method: ${c.method}`})}}catch(f){let b=f;return x(a,c.id,{code:"INTERNAL",message:b.message??String(f)})}}async function Pe(a){let{config:g,errors:l}=await Q(a);return{config:g,errors:l,configPath:A(a)}}async function Se(a,g,l){l(Date.now()+3e3);let c=await kt(a,g),{config:h,errors:f}=await Q(g);return s.log({kind:"config.set",configPath:c,keys:be(a),keyCount:Object.keys(h).length,errorCount:f.length}),{config:h,errors:f,configPath:c}}function xe(){return{fields:{defaultProvider:{label:"\u9ED8\u8BA4 Provider",type:"string",help:"providers \u5217\u8868\u4E2D\u67D0\u4E2A name"},verbose:{label:"\u8BE6\u7EC6\u65E5\u5FD7",type:"boolean"},maxTokens:{label:"\u6700\u5927 Token \u6570",type:"number",min:1,max:32768},temperature:{label:"\u6E29\u5EA6 (0~2)",type:"number",min:0,max:2,help:"\u8D8A\u9AD8\u8D8A\u53D1\u6563"},maxToolRounds:{label:"\u5355\u4F1A\u8BDD\u6700\u5927\u5DE5\u5177\u8F6E\u6B21",type:"number",min:1,max:100},budgetLimit:{label:"\u6BCF\u65E5\u9884\u7B97 (\u5143, 0=\u4E0D\u9650)",type:"number",min:0},tokenBudgetLimit:{label:"\u6BCF\u65E5 Token \u9884\u7B97 (0=\u4E0D\u9650)",type:"number",min:0},providers:{label:"Provider \u5217\u8868 (\u9AD8\u7EA7)",type:"list-string",help:"\u5EFA\u8BAE\u6539\u7528\u7EC8\u7AEF chat"},tools:{label:"\u5185\u7F6E\u5DE5\u5177 (\u9AD8\u7EA7)",type:"list-string"},plugins:{label:"\u5916\u90E8 MCP \u63D2\u4EF6 (\u9AD8\u7EA7)",type:"list-string"},"stock.symbols":{label:"\u81EA\u9009\u80A1\u4EE3\u7801\u5217\u8868",type:"list-string",help:"\u5982 sh513090 / sz000001"},"voice.appId":{label:"\u8BED\u97F3 App ID",type:"string"},"voice.accessKey":{label:"\u8BED\u97F3 Access Key",type:"string"},"thinking.enabled":{label:"\u6DF1\u5EA6\u601D\u8003",type:"boolean",help:"\u542F\u7528\u540E\u6A21\u578B\u56DE\u7B54\u524D\u4F1A\u8FDB\u884C\u66F4\u957F\u7684\u63A8\u7406\uFF08\u4EC5\u90E8\u5206\u6A21\u578B\u652F\u6301\uFF09"},"thinking.effort":{label:"\u601D\u8003\u5F3A\u5EA6",type:"select",enum:["high","max"],help:"high = \u6807\u51C6\u6DF1\u5EA6, max = \u6700\u5927\u52AA\u529B"},"permissions.default":{label:"\u6743\u9650\u5BA1\u6279\u9ED8\u8BA4\u7B56\u7565",type:"select",enum:["confirm","allow","deny"],help:"\u672A\u547D\u4E2D\u6B63\u5219\u89C4\u5219\u65F6\u7684\u9ED8\u8BA4\u884C\u4E3A"}}}}}async function Le(t,e){let n=JSON.stringify(e);for(let o of t)if(o.readyState===o.OPEN)try{o.send(n)}catch{}}function te(t,e){t.readyState===t.OPEN&&t.send(JSON.stringify(e))}export{j as a,Qt as b,Q as c,en as d,tn as e,nn as f,on as g,Et as h,z as i,Nn as j};
12
- //# sourceMappingURL=chunk-LG2AWYGC.js.map
@@ -1,2 +0,0 @@
1
- import{a}from"./chunk-KMMG6QC6.js";import"./chunk-MDFCAIOB.js";import"./chunk-LPD7BHH5.js";export{a as InteractiveGate};
2
- //# sourceMappingURL=interactive-gate-XKNHF4ZY.js.map