@hermenics/deepseek-code 0.4.5 → 0.4.6
This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
- package/dist/cli.mjs +1 -1
- package/package.json +1 -1
package/dist/cli.mjs
CHANGED
|
@@ -1119,7 +1119,7 @@ ${b}`,Z++}else h91(f,C,x)?O=f.slice(f.charCodeAt(C+6)===yw?C+7:C+6,B)||void 0:N(
|
|
|
1119
1119
|
`,C),U=-1;if(B!==-1&&x!==-1?U=B<x?B:x:B!==-1?B===f.length-1?U=-1:U=B:x!==-1&&(U=x),U===-1)break;N(f,C,U),C=U+1,f.charCodeAt(C-1)===Ej0&&f.charCodeAt(C)===U91&&C++}return f.slice(C)}function N(f,C,B){if(C===B){L();return}let x=f.charCodeAt(C);if(I91(f,C,x)){let e=f.charCodeAt(C+5)===yw?C+6:C+5,p=f.slice(e,B);W=Z===0?p:`${W}
|
|
1120
1120
|
${p}`,Z++;return}if(h91(f,C,x)){O=f.slice(f.charCodeAt(C+6)===yw?C+7:C+6,B)||void 0;return}if(x===105&&f.charCodeAt(C+1)===100&&f.charCodeAt(C+2)===58){let e=f.slice(f.charCodeAt(C+3)===yw?C+4:C+3,B);w=e.includes("\x00")?void 0:e;return}if(x===58){if(D){let e=f.slice(C,B);D(e.slice(f.charCodeAt(C+1)===yw?2:1))}return}let U=f.slice(C,B),b=U.indexOf(":");if(b===-1){T(U,"",U);return}let u=U.slice(0,b),Q=U.charCodeAt(b+1)===yw?2:1,g=U.slice(b+Q);T(u,g,U)}function T(f,C,B){switch(f){case"event":O=C||void 0;break;case"data":W=Z===0?C:`${W}
|
|
1121
1121
|
${C}`,Z++;break;case"id":w=C.includes("\x00")?void 0:C;break;case"retry":/^\d+$/.test(C)?z(parseInt(C,10)):q(new f78(`Invalid \`retry\` value: "${C}"`,{type:"invalid-retry",value:C,line:B}));break;default:q(new f78(`Unknown field "${f.length>20?`${f.slice(0,20)}\u2026`:f}"`,{type:"unknown-field",field:f,value:C,line:B}));break}}function L(){Z>0&&K({id:w,event:O,data:W}),w=void 0,W="",Z=0,O=void 0}function E(f={}){if(f.consume&&J.length>0){let C=J.join("");N(C,0,C.length)}Y=!0,w=void 0,W="",Z=0,O=void 0,J.length=0}return{feed:M,reset:E}}function I91($,K,q){return q===100&&$.charCodeAt(K+1)===97&&$.charCodeAt(K+2)===116&&$.charCodeAt(K+3)===97&&$.charCodeAt(K+4)===58}function h91($,K,q){return q===101&&$.charCodeAt(K+1)===118&&$.charCodeAt(K+2)===101&&$.charCodeAt(K+3)===110&&$.charCodeAt(K+4)===116&&$.charCodeAt(K+5)===58}var f78,U91=10,Ej0=13,yw=32;var v91=F(()=>{f78=class f78 extends Error{constructor($,K){super($),this.name="ParseError",this.type=K.type,this.field=K.field,this.value=K.value,this.line=K.line}}});var F78;var y91=F(()=>{v91();F78=class F78 extends TransformStream{constructor({onError:$,onRetry:K,onComment:q}={}){let z;super({start(D){z=b91({onEvent:(J)=>{D.enqueue(J)},onError(J){$==="terminate"?D.error(J):typeof $=="function"&&$(J)},onRetry:K,onComment:q})},transform(D){z.feed(D)}})}}});class C78{constructor($,K){this._hasCompletedAuthFlow=!1,this._url=$,this._resourceMetadataUrl=void 0,this._scope=void 0,this._requestInit=K?.requestInit,this._authProvider=K?.authProvider,this._fetch=K?.fetch,this._fetchWithInit=M91(K?.fetch,K?.requestInit),this._sessionId=K?.sessionId,this._reconnectionOptions=K?.reconnectionOptions??Rj0}async _authThenStart(){if(!this._authProvider)throw new SJ("No auth provider");let $;try{$=await oV(this._authProvider,{serverUrl:this._url,resourceMetadataUrl:this._resourceMetadataUrl,scope:this._scope,fetchFn:this._fetchWithInit})}catch(K){throw this.onerror?.(K),K}if($!=="AUTHORIZED")throw new SJ;return await this._startOrAuthSse({resumptionToken:void 0})}async _commonHeaders(){let $={};if(this._authProvider){let q=await this._authProvider.tokens();if(q)$.Authorization=`Bearer ${q.access_token}`}if(this._sessionId)$["mcp-session-id"]=this._sessionId;if(this._protocolVersion)$["mcp-protocol-version"]=this._protocolVersion;let K=bI(this._requestInit?.headers);return new Headers({...$,...K})}async _startOrAuthSse($){let{resumptionToken:K}=$;try{let q=await this._commonHeaders();if(q.set("Accept","text/event-stream"),K)q.set("last-event-id",K);let z=await(this._fetch??fetch)(this._url,{method:"GET",headers:q,signal:this._abortController?.signal});if(!z.ok){if(await z.body?.cancel(),z.status===401&&this._authProvider)return await this._authThenStart();if(z.status===405)return;throw new xw(z.status,`Failed to open SSE stream: ${z.statusText}`)}this._handleSseStream(z.body,$,!0)}catch(q){throw this.onerror?.(q),q}}_getNextReconnectionDelay($){if(this._serverRetryMs!==void 0)return this._serverRetryMs;let K=this._reconnectionOptions.initialReconnectionDelay,q=this._reconnectionOptions.reconnectionDelayGrowFactor,z=this._reconnectionOptions.maxReconnectionDelay;return Math.min(K*Math.pow(q,$),z)}_scheduleReconnection($,K=0){let q=this._reconnectionOptions.maxRetries;if(K>=q){this.onerror?.(Error(`Maximum reconnection attempts (${q}) exceeded.`));return}let z=this._getNextReconnectionDelay(K);this._reconnectionTimeout=setTimeout(()=>{this._startOrAuthSse($).catch((D)=>{this.onerror?.(Error(`Failed to reconnect SSE stream: ${D instanceof Error?D.message:String(D)}`)),this._scheduleReconnection($,K+1)})},z)}_handleSseStream($,K,q){if(!$)return;let{onresumptiontoken:z,replayMessageId:D}=K,J,Y=!1,w=!1;(async()=>{try{let Z=$.pipeThrough(new TextDecoderStream).pipeThrough(new F78({onRetry:(P)=>{this._serverRetryMs=P}})).getReader();while(!0){let{value:P,done:N}=await Z.read();if(N)break;if(P.id)J=P.id,Y=!0,z?.(P.id);if(!P.data)continue;if(!P.event||P.event==="message")try{let T=AG.parse(JSON.parse(P.data));if(Iw(T)){if(w=!0,D!==void 0)T.id=D}this.onmessage?.(T)}catch(T){this.onerror?.(T)}}if((q||Y)&&!w&&this._abortController&&!this._abortController.signal.aborted)this._scheduleReconnection({resumptionToken:J,onresumptiontoken:z,replayMessageId:D},0)}catch(Z){if(this.onerror?.(Error(`SSE stream disconnected: ${Z}`)),(q||Y)&&!w&&this._abortController&&!this._abortController.signal.aborted)try{this._scheduleReconnection({resumptionToken:J,onresumptiontoken:z,replayMessageId:D},0)}catch(P){this.onerror?.(Error(`Failed to reconnect: ${P instanceof Error?P.message:String(P)}`))}}})()}async start(){if(this._abortController)throw Error("StreamableHTTPClientTransport already started! If using Client class, note that connect() calls start() automatically.");this._abortController=new AbortController}async finishAuth($){if(!this._authProvider)throw new SJ("No auth provider");if(await oV(this._authProvider,{serverUrl:this._url,authorizationCode:$,resourceMetadataUrl:this._resourceMetadataUrl,scope:this._scope,fetchFn:this._fetchWithInit})!=="AUTHORIZED")throw new SJ("Failed to authorize")}async close(){if(this._reconnectionTimeout)clearTimeout(this._reconnectionTimeout),this._reconnectionTimeout=void 0;this._abortController?.abort(),this.onclose?.()}async send($,K){try{let{resumptionToken:q,onresumptiontoken:z}=K||{};if(q){this._startOrAuthSse({resumptionToken:q,replayMessageId:gV($)?$.id:void 0}).catch((M)=>this.onerror?.(M));return}let D=await this._commonHeaders();D.set("content-type","application/json"),D.set("accept","application/json, text/event-stream");let J={...this._requestInit,method:"POST",headers:D,body:JSON.stringify($),signal:this._abortController?.signal},Y=await(this._fetch??fetch)(this._url,J),w=Y.headers.get("mcp-session-id");if(w)this._sessionId=w;if(!Y.ok){let M=await Y.text().catch(()=>null);if(Y.status===401&&this._authProvider){if(this._hasCompletedAuthFlow)throw new xw(401,"Server returned 401 after successful authentication");let{resourceMetadataUrl:P,scope:N}=j78(Y);if(this._resourceMetadataUrl=P,this._scope=N,await oV(this._authProvider,{serverUrl:this._url,resourceMetadataUrl:this._resourceMetadataUrl,scope:this._scope,fetchFn:this._fetchWithInit})!=="AUTHORIZED")throw new SJ;return this._hasCompletedAuthFlow=!0,this.send($)}if(Y.status===403&&this._authProvider){let{resourceMetadataUrl:P,scope:N,error:T}=j78(Y);if(T==="insufficient_scope"){let L=Y.headers.get("WWW-Authenticate");if(this._lastUpscopingHeader===L)throw new xw(403,"Server returned 403 after trying upscoping");if(N)this._scope=N;if(P)this._resourceMetadataUrl=P;if(this._lastUpscopingHeader=L??void 0,await oV(this._authProvider,{serverUrl:this._url,resourceMetadataUrl:this._resourceMetadataUrl,scope:this._scope,fetchFn:this._fetch})!=="AUTHORIZED")throw new SJ;return this.send($)}}throw new xw(Y.status,`Error POSTing to endpoint: ${M}`)}if(this._hasCompletedAuthFlow=!1,this._lastUpscopingHeader=void 0,Y.status===202){if(await Y.body?.cancel(),f$1($))this._startOrAuthSse({resumptionToken:void 0}).catch((M)=>this.onerror?.(M));return}let Z=(Array.isArray($)?$:[$]).filter((M)=>("method"in M)&&("id"in M)&&M.id!==void 0).length>0,O=Y.headers.get("content-type");if(Z)if(O?.includes("text/event-stream"))this._handleSseStream(Y.body,{onresumptiontoken:z},!1);else if(O?.includes("application/json")){let M=await Y.json(),P=Array.isArray(M)?M.map((N)=>AG.parse(N)):[AG.parse(M)];for(let N of P)this.onmessage?.(N)}else throw await Y.body?.cancel(),new xw(-1,`Unexpected content type: ${O}`);else await Y.body?.cancel()}catch(q){throw this.onerror?.(q),q}}get sessionId(){return this._sessionId}async terminateSession(){if(!this._sessionId)return;try{let $=await this._commonHeaders(),K={...this._requestInit,method:"DELETE",headers:$,signal:this._abortController?.signal},q=await(this._fetch??fetch)(this._url,K);if(await q.body?.cancel(),!q.ok&&q.status!==405)throw new xw(q.status,`Failed to terminate session: ${q.statusText}`);this._sessionId=void 0}catch($){throw this.onerror?.($),$}}setProtocolVersion($){this._protocolVersion=$}get protocolVersion(){return this._protocolVersion}async resumeStream($,K){await this._startOrAuthSse({resumptionToken:$,onresumptiontoken:K?.onresumptiontoken})}}var Rj0,xw;var x91=F(()=>{vw();S91();y91();Rj0={initialReconnectionDelay:1000,maxReconnectionDelay:30000,reconnectionDelayGrowFactor:1.5,maxRetries:2};xw=class xw extends Error{constructor($,K){super(`Streamable HTTP error: ${K}`);this.code=$}}});import{join as m91}from"path";import{homedir as fj0}from"os";import{mkdir as Fj0,appendFile as Cj0,chmod as kj0}from"fs/promises";import{randomBytes as Bj0}from"crypto";async function Sj0(){if(g91)return;await Fj0(c91,{recursive:!0}),g91=!0}async function H$($){try{await Sj0();let K=JSON.stringify(Xq({ts:new Date().toISOString(),...$}))+`
|
|
1122
|
-
`;await Cj0(u91,K,{encoding:"utf8",mode:384}),await kj0(u91,384)}catch{}}var c91,Qj0,u91,g91=!1;var k78=F(()=>{rW();c91=m91(fj0(),".deepseek","logs"),Qj0=`${Date.now()}-${Bj0(3).toString("hex")}`,u91=m91(c91,`session-${Qj0}.jsonl`)});var W$;var RG=F(()=>{W$={name:"@hermenics/deepseek-code",version:"0.4.
|
|
1122
|
+
`;await Cj0(u91,K,{encoding:"utf8",mode:384}),await kj0(u91,384)}catch{}}var c91,Qj0,u91,g91=!1;var k78=F(()=>{rW();c91=m91(fj0(),".deepseek","logs"),Qj0=`${Date.now()}-${Bj0(3).toString("hex")}`,u91=m91(c91,`session-${Qj0}.jsonl`)});var W$;var RG=F(()=>{W$={name:"@hermenics/deepseek-code",version:"0.4.6",description:"An AI-powered coding assistant that lives in your terminal",keywords:["ai","cli","deepseek","coding-assistant","terminal","tui"],license:"Apache-2.0",type:"module",bin:{deepseek:"dist/deepseek"},files:["dist/","README.md","LICENSE"],repository:{type:"git",url:"git+https://github.com/Hermenics/deepseek-code.git"},bugs:{url:"https://github.com/Hermenics/deepseek-code/issues"},homepage:"https://github.com/Hermenics/deepseek-code#readme",publishConfig:{access:"public"},engines:{node:">=18",bun:">=1.0"},scripts:{start:"NODE_ENV=development bun src/index.tsx",dev:"NODE_ENV=development bun --watch src/index.tsx",build:"bun run build.ts",typecheck:"bunx tsc --noEmit",test:"bun test"},dependencies:{"@alcalzone/ansi-tokenize":"^0.3.0","@aws-crypto/sha256-js":"^5.2.0","@aws-sdk/client-bedrock":"^3.1048.0","@aws-sdk/credential-providers":"^3.1048.0","@modelcontextprotocol/sdk":"^1.29.0","@smithy/protocol-http":"^5.3.14","@smithy/signature-v4":"^5.3.14","@types/semver":"^7.7.1",ajv:"^8.20.0","auto-bind":"^5.0.1","bidi-js":"^1.0.3",chalk:"^5.6.2","cli-boxes":"^4.0.1","code-excerpt":"^4.0.0","emoji-regex":"^10.6.0",execa:"^9.6.1","fast-glob":"^3.3.3","fuse.js":"^7.0.0","get-east-asian-width":"^1.6.0","google-auth-library":"^10.6.2","indent-string":"^5.0.0","lodash-es":"^4.18.1",openai:"^6.34.0",qrcode:"^1.5.4",react:"^19.2.0","react-reconciler":"^0.33.0",semver:"^7.8.1","signal-exit":"^4.1.0","stack-utils":"^2.0.6","strip-ansi":"^7.2.0","supports-hyperlinks":"^4.4.0","type-fest":"^5.6.0","usehooks-ts":"^3.1.1","wrap-ansi":"^10.0.0"},overrides:{"node-fetch":"npm:undici@^7.0.0"},devDependencies:{"@types/bun":"^1.3.12","@types/qrcode":"^1.5.6","@types/react":"^19.2.0","@types/stack-utils":"^2.0.3","react-devtools-core":"^7.0.1",typescript:"^5.9.3",vitest:"^4.1.6"}}});import{join as Ij0}from"path";function yj0($,K){let q={...$};for(let[z,D]of Object.entries(K)){if(hj0.has(z))continue;q[z]=D}return q}function xj0($){if($.trim()==="")throw Error("MCP command cannot be empty");if(vj0.test($))throw Error(`MCP command contains path traversal: ${$}`);if(bj0.test($))throw Error(`MCP command contains shell injection characters: ${$}`)}function uj0($,K){return{type:"mcp_server_load",serverName:$,transport:K}}async function gj0($){let K=Ij0($,".deepseek","mcp.json");try{return await J9(K)}catch{return null}}async function p91($=process.cwd()){let K=await gj0($);if(!K?.servers)return{tools:[],errors:[]};let q=[],z=[];for(let[D,J]of Object.entries(K.servers))try{if(J.transport==="stdio")xj0(J.command);let Y=new W78({name:"deepseek-code",version:W$.version}),w=J.transport==="stdio"?new G78({command:J.command,args:J.args??[],env:yj0(Object.fromEntries(Object.entries(process.env).filter((Z)=>Z[1]!==void 0)),J.env??{})}):new C78(new URL(J.url));await Y.connect(w),await H$(uj0(D,J.transport));let{tools:W}=await Y.listTools();for(let Z of W)q.push({name:`${D}__${Z.name}`,description:`[MCP:${D}] ${Z.description??""}`,parameters:Z.inputSchema,async execute(O){return(await Promise.race([Y.callTool({name:Z.name,arguments:O}),new Promise((T,L)=>setTimeout(()=>L(Error(`MCP tool '${Z.name}' timed out after 30s`)),30000))])).content.filter((T)=>T.type==="text"&&T.text).map((T)=>T.text).join(`
|
|
1123
1123
|
`)}})}catch(Y){let w=`MCP server '${D}': ${Y.message}`;z.push(w)}return{tools:q,errors:z}}var hj0,bj0,vj0;var d91=F(()=>{H91();G91();x91();Sq();k78();RG();hj0=new Set(["PATH","LD_PRELOAD","LD_LIBRARY_PATH","DYLD_INSERT_LIBRARIES","DYLD_LIBRARY_PATH","HOME","USER","SHELL","PYTHONPATH","NODE_OPTIONS","NODE_PATH","BUN_INSTALL"]),bj0=/[;|`<>]|&&|\|\||\$\(|>>|<</,vj0=/\.\.[/\\]/});import{readFile as mj0,realpath as l91}from"fs/promises";import{isAbsolute as n91,relative as cj0,resolve as pj0,sep as dj0}from"path";async function o91($,K=process.cwd()){if(!$.length)return"";let q=pj0(K);for(let w of $)if(!w||n91(w)||w.split(/[\\/]+/).includes(".."))throw Error(`Agent file pattern '${w}' must stay inside the project workspace`);let z=await r91.default($,{cwd:q,ignore:["**/node_modules/**","**/.git/**","**/.deepseek/**"],dot:!0,absolute:!0,onlyFiles:!0,followSymbolicLinks:!1}),D=[],J=i91,Y=await l91(q);for(let w of z){let W=await n3(w,{sessionId:"agent-config",workspacePath:q,projectRoot:q,permissionProfile:"researcher-readonly"}),Z=await l91(W),O=cj0(Y,Z);if(O.startsWith(`..${dj0}`)||n91(O))throw Error(`Agent file '${w}' escapes the project workspace`);if(J<=0)break;let M=await mj0(Z,"utf-8"),P=M.slice(0,J);J-=P.length,D.push(`// File: ${O}
|
|
1124
1124
|
${P}${P.length<M.length?`
|
|
1125
1125
|
|