@hermenics/deepseek-code 0.1.0 → 0.1.1

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/README.md CHANGED
@@ -10,7 +10,7 @@
10
10
  <img src="https://img.shields.io/badge/license-Apache--2.0-22c55e?style=for-the-badge&labelColor=0d1117" alt="Apache 2.0" />
11
11
  </p>
12
12
 
13
- <p><strong>An AI-powered coding assistant that lives in your terminal.</strong></p>
13
+ <p><strong>A DeepSeek-powered coding assistant that lives in your terminal.</strong></p>
14
14
 
15
15
  </div>
16
16
 
@@ -18,6 +18,8 @@
18
18
 
19
19
  <div align="center">
20
20
  <img src="https://raw.githubusercontent.com/Hermenics/deepseek-code/main/src/public/demo.gif" alt="DeepSeek Code demo" width="80%" />
21
+ <br \>
22
+ <font color="gray"><sub><i>*Simulated output for demonstration purposes.</i></sub></font>
21
23
  </div>
22
24
 
23
25
  ## Get started
@@ -30,13 +32,12 @@ Then run `deepseek` inside any project. On first run you'll pick a **provider**
30
32
 
31
33
  ## Providers & authentication
32
34
 
33
- | Provider | How to authenticate | Env / config keys |
34
- |---|---|---|
35
- | **DeepSeek API** (default) | API key from [platform.deepseek.com](https://platform.deepseek.com/api_keys) | `DEEPSEEK_API_KEY`, `DEEPSEEK_BASE_URL` |
36
- | **Amazon Bedrock** | AWS IAM credentials via `~/.aws/credentials` | `AWS_REGION`, `AWS_PROFILE` |
37
- | **Google Vertex AI** | GCP service account JSON key | `GCP_PROJECT`, `GCP_LOCATION`, `GCP_CREDENTIALS` |
38
- | **Local (Ollama / LM Studio)** | No auth — just point to your local endpoint | `LOCAL_BASE_URL`, `LOCAL_MODEL` |
39
- | **OAuth (beta)** | Login via browser on chat.deepseek.com | Auto-configured |
35
+ | Provider | How to authenticate | Env / config keys | |
36
+ | --------------------------------| ------------------------------------------------------------------------------| --------------------------------------------------| -----|
37
+ | **DeepSeek API** (default) | API key from [platform.deepseek.com](https://platform.deepseek.com/api_keys) | `DEEPSEEK_API_KEY`, `DEEPSEEK_BASE_URL` | |
38
+ | **Amazon Bedrock** | AWS IAM credentials via `~/.aws/credentials` | `AWS_REGION`, `AWS_PROFILE` | |
39
+ | **Google Vertex AI** | GCP service account JSON key | `GCP_PROJECT`, `GCP_LOCATION`, `GCP_CREDENTIALS` | |
40
+ | **Local (Ollama / LM Studio)** | No auth — just point to your local endpoint | `LOCAL_BASE_URL`, `LOCAL_MODEL` |
40
41
 
41
42
  All config is saved to `~/.deepseek/config.json`. You can also set any config key as an environment variable.
42
43
 
package/dist/cli.mjs CHANGED
@@ -969,7 +969,7 @@ ${f}`,w++}else gs0(j,C,m)?O=j.slice(j.charCodeAt(C+6)===wY?C+7:C+6,k)||void 0:A(
969
969
  `,C),y=-1;if(k!==-1&&m!==-1?y=k<m?k:m:k!==-1?k===j.length-1?y=-1:y=k:m!==-1&&(y=m),y===-1)break;A(j,C,y),C=y+1,j.charCodeAt(C-1)===QZ1&&j.charCodeAt(C)===ys0&&C++}return j.slice(C)}function A(j,C,k){if(C===k){_();return}let m=j.charCodeAt(C);if(us0(j,C,m)){let z0=j.charCodeAt(C+5)===wY?C+6:C+5,c=j.slice(z0,k);W=w===0?c:`${W}
970
970
  ${c}`,w++;return}if(gs0(j,C,m)){O=j.slice(j.charCodeAt(C+6)===wY?C+7:C+6,k)||void 0;return}if(m===105&&j.charCodeAt(C+1)===100&&j.charCodeAt(C+2)===58){let z0=j.slice(j.charCodeAt(C+3)===wY?C+4:C+3,k);H=z0.includes("\x00")?void 0:z0;return}if(m===58){if(J){let z0=j.slice(C,k);J(z0.slice(j.charCodeAt(C+1)===wY?2:1))}return}let y=j.slice(C,k),f=y.indexOf(":");if(f===-1){T(y,"",y);return}let g=y.slice(0,f),u=y.charCodeAt(f+1)===wY?2:1,v=y.slice(f+u);T(g,v,y)}function T(j,C,k){switch(j){case"event":O=C||void 0;break;case"data":W=w===0?C:`${W}
971
971
  ${C}`,w++;break;case"id":H=C.includes("\x00")?void 0:C;break;case"retry":/^\d+$/.test(C)?z(parseInt(C,10)):K(new t00(`Invalid \`retry\` value: "${C}"`,{type:"invalid-retry",value:C,line:k}));break;default:K(new t00(`Unknown field "${j.length>20?`${j.slice(0,20)}\u2026`:j}"`,{type:"unknown-field",field:j,value:C,line:k}));break}}function _(){w>0&&$({id:H,event:O,data:W}),H=void 0,W="",w=0,O=void 0}function F(j={}){if(j.consume&&q.length>0){let C=q.join("");A(C,0,C.length)}Y=!0,H=void 0,W="",w=0,O=void 0,q.length=0}return{feed:N,reset:F}}function us0(D,$,K){return K===100&&D.charCodeAt($+1)===97&&D.charCodeAt($+2)===116&&D.charCodeAt($+3)===97&&D.charCodeAt($+4)===58}function gs0(D,$,K){return K===101&&D.charCodeAt($+1)===118&&D.charCodeAt($+2)===101&&D.charCodeAt($+3)===110&&D.charCodeAt($+4)===116&&D.charCodeAt($+5)===58}var t00,ys0=10,QZ1=13,wY=32;var cs0=R(()=>{t00=class t00 extends Error{constructor(D,$){super(D),this.name="ParseError",this.type=$.type,this.field=$.field,this.value=$.value,this.line=$.line}}});var a00;var ps0=R(()=>{cs0();a00=class a00 extends TransformStream{constructor({onError:D,onRetry:$,onComment:K}={}){let z;super({start(J){z=ms0({onEvent:(q)=>{J.enqueue(q)},onError(q){D==="terminate"?J.error(q):typeof D=="function"&&D(q)},onRetry:$,onComment:K})},transform(J){z.feed(J)}})}}});class s00{constructor(D,$){this._hasCompletedAuthFlow=!1,this._url=D,this._resourceMetadataUrl=void 0,this._scope=void 0,this._requestInit=$?.requestInit,this._authProvider=$?.authProvider,this._fetch=$?.fetch,this._fetchWithInit=Ts0($?.fetch,$?.requestInit),this._sessionId=$?.sessionId,this._reconnectionOptions=$?.reconnectionOptions??CZ1}async _authThenStart(){if(!this._authProvider)throw new Rq("No auth provider");let D;try{D=await RP(this._authProvider,{serverUrl:this._url,resourceMetadataUrl:this._resourceMetadataUrl,scope:this._scope,fetchFn:this._fetchWithInit})}catch($){throw this.onerror?.($),$}if(D!=="AUTHORIZED")throw new Rq;return await this._startOrAuthSse({resumptionToken:void 0})}async _commonHeaders(){let D={};if(this._authProvider){let K=await this._authProvider.tokens();if(K)D.Authorization=`Bearer ${K.access_token}`}if(this._sessionId)D["mcp-session-id"]=this._sessionId;if(this._protocolVersion)D["mcp-protocol-version"]=this._protocolVersion;let $=LI(this._requestInit?.headers);return new Headers({...D,...$})}async _startOrAuthSse(D){let{resumptionToken:$}=D;try{let K=await this._commonHeaders();if(K.set("Accept","text/event-stream"),$)K.set("last-event-id",$);let z=await(this._fetch??fetch)(this._url,{method:"GET",headers:K,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 OY(z.status,`Failed to open SSE stream: ${z.statusText}`)}this._handleSseStream(z.body,D,!0)}catch(K){throw this.onerror?.(K),K}}_getNextReconnectionDelay(D){if(this._serverRetryMs!==void 0)return this._serverRetryMs;let $=this._reconnectionOptions.initialReconnectionDelay,K=this._reconnectionOptions.reconnectionDelayGrowFactor,z=this._reconnectionOptions.maxReconnectionDelay;return Math.min($*Math.pow(K,D),z)}_scheduleReconnection(D,$=0){let K=this._reconnectionOptions.maxRetries;if($>=K){this.onerror?.(Error(`Maximum reconnection attempts (${K}) exceeded.`));return}let z=this._getNextReconnectionDelay($);this._reconnectionTimeout=setTimeout(()=>{this._startOrAuthSse(D).catch((J)=>{this.onerror?.(Error(`Failed to reconnect SSE stream: ${J instanceof Error?J.message:String(J)}`)),this._scheduleReconnection(D,$+1)})},z)}_handleSseStream(D,$,K){if(!D)return;let{onresumptiontoken:z,replayMessageId:J}=$,q,Y=!1,H=!1;(async()=>{try{let w=D.pipeThrough(new TextDecoderStream).pipeThrough(new a00({onRetry:(V)=>{this._serverRetryMs=V}})).getReader();while(!0){let{value:V,done:A}=await w.read();if(A)break;if(V.id)q=V.id,Y=!0,z?.(V.id);if(!V.data)continue;if(!V.event||V.event==="message")try{let T=WG.parse(JSON.parse(V.data));if($Y(T)){if(H=!0,J!==void 0)T.id=J}this.onmessage?.(T)}catch(T){this.onerror?.(T)}}if((K||Y)&&!H&&this._abortController&&!this._abortController.signal.aborted)this._scheduleReconnection({resumptionToken:q,onresumptiontoken:z,replayMessageId:J},0)}catch(w){if(this.onerror?.(Error(`SSE stream disconnected: ${w}`)),(K||Y)&&!H&&this._abortController&&!this._abortController.signal.aborted)try{this._scheduleReconnection({resumptionToken:q,onresumptiontoken:z,replayMessageId:J},0)}catch(V){this.onerror?.(Error(`Failed to reconnect: ${V instanceof Error?V.message:String(V)}`))}}})()}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(D){if(!this._authProvider)throw new Rq("No auth provider");if(await RP(this._authProvider,{serverUrl:this._url,authorizationCode:D,resourceMetadataUrl:this._resourceMetadataUrl,scope:this._scope,fetchFn:this._fetchWithInit})!=="AUTHORIZED")throw new Rq("Failed to authorize")}async close(){if(this._reconnectionTimeout)clearTimeout(this._reconnectionTimeout),this._reconnectionTimeout=void 0;this._abortController?.abort(),this.onclose?.()}async send(D,$){try{let{resumptionToken:K,onresumptiontoken:z}=$||{};if(K){this._startOrAuthSse({resumptionToken:K,replayMessageId:oA(D)?D.id:void 0}).catch((N)=>this.onerror?.(N));return}let J=await this._commonHeaders();J.set("content-type","application/json"),J.set("accept","application/json, text/event-stream");let q={...this._requestInit,method:"POST",headers:J,body:JSON.stringify(D),signal:this._abortController?.signal},Y=await(this._fetch??fetch)(this._url,q),H=Y.headers.get("mcp-session-id");if(H)this._sessionId=H;if(!Y.ok){let N=await Y.text().catch(()=>null);if(Y.status===401&&this._authProvider){if(this._hasCompletedAuthFlow)throw new OY(401,"Server returned 401 after successful authentication");let{resourceMetadataUrl:V,scope:A}=i00(Y);if(this._resourceMetadataUrl=V,this._scope=A,await RP(this._authProvider,{serverUrl:this._url,resourceMetadataUrl:this._resourceMetadataUrl,scope:this._scope,fetchFn:this._fetchWithInit})!=="AUTHORIZED")throw new Rq;return this._hasCompletedAuthFlow=!0,this.send(D)}if(Y.status===403&&this._authProvider){let{resourceMetadataUrl:V,scope:A,error:T}=i00(Y);if(T==="insufficient_scope"){let _=Y.headers.get("WWW-Authenticate");if(this._lastUpscopingHeader===_)throw new OY(403,"Server returned 403 after trying upscoping");if(A)this._scope=A;if(V)this._resourceMetadataUrl=V;if(this._lastUpscopingHeader=_??void 0,await RP(this._authProvider,{serverUrl:this._url,resourceMetadataUrl:this._resourceMetadataUrl,scope:this._scope,fetchFn:this._fetch})!=="AUTHORIZED")throw new Rq;return this.send(D)}}throw new OY(Y.status,`Error POSTing to endpoint: ${N}`)}if(this._hasCompletedAuthFlow=!1,this._lastUpscopingHeader=void 0,Y.status===202){if(await Y.body?.cancel(),wi0(D))this._startOrAuthSse({resumptionToken:void 0}).catch((N)=>this.onerror?.(N));return}let w=(Array.isArray(D)?D:[D]).filter((N)=>("method"in N)&&("id"in N)&&N.id!==void 0).length>0,O=Y.headers.get("content-type");if(w)if(O?.includes("text/event-stream"))this._handleSseStream(Y.body,{onresumptiontoken:z},!1);else if(O?.includes("application/json")){let N=await Y.json(),V=Array.isArray(N)?N.map((A)=>WG.parse(A)):[WG.parse(N)];for(let A of V)this.onmessage?.(A)}else throw await Y.body?.cancel(),new OY(-1,`Unexpected content type: ${O}`);else await Y.body?.cancel()}catch(K){throw this.onerror?.(K),K}}get sessionId(){return this._sessionId}async terminateSession(){if(!this._sessionId)return;try{let D=await this._commonHeaders(),$={...this._requestInit,method:"DELETE",headers:D,signal:this._abortController?.signal},K=await(this._fetch??fetch)(this._url,$);if(await K.body?.cancel(),!K.ok&&K.status!==405)throw new OY(K.status,`Failed to terminate session: ${K.statusText}`);this._sessionId=void 0}catch(D){throw this.onerror?.(D),D}}setProtocolVersion(D){this._protocolVersion=D}get protocolVersion(){return this._protocolVersion}async resumeStream(D,$){await this._startOrAuthSse({resumptionToken:D,onresumptiontoken:$?.onresumptiontoken})}}var CZ1,OY;var ls0=R(()=>{JY();vs0();ps0();CZ1={initialReconnectionDelay:1000,maxReconnectionDelay:30000,reconnectionDelayGrowFactor:1.5,maxRetries:2};OY=class OY extends Error{constructor(D,$){super(`Streamable HTTP error: ${$}`);this.code=D}}});import{readFile as UZ1,writeFile as ds0,readdir as IZ1}from"fs/promises";async function t4(D){return JSON.parse(await UZ1(D,"utf-8"))}async function IG(D,$){await ds0(D,JSON.stringify($,null,2),"utf-8")}async function Qq(D,$){await ds0(D,$,"utf-8")}async function SI(D,$){try{return(await IZ1($)).filter((z)=>D.test(z))}catch{return[]}}var o5=()=>{};import{join as is0}from"path";import{homedir as kZ1}from"os";import{mkdir as SZ1,appendFile as fZ1}from"fs/promises";import{randomBytes as xZ1}from"crypto";async function vZ1(){if(ns0)return;await SZ1(rs0,{recursive:!0}),ns0=!0}async function G9(D){try{await vZ1();let $=JSON.stringify({ts:new Date().toISOString(),...D})+`
972
- `;await fZ1(hZ1,$,"utf-8")}catch{}}var rs0,bZ1,hZ1,ns0=!1;var e00=R(()=>{rs0=is0(kZ1(),".deepseek","logs"),bZ1=`${Date.now()}-${xZ1(3).toString("hex")}`,hZ1=is0(rs0,`session-${bZ1}.jsonl`)});var u7;var kG=R(()=>{u7={name:"@hermenics/deepseek-code",version:"0.1.0",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","@hono/node-server":"^1.14.0","@modelcontextprotocol/sdk":"^1.29.0","@smithy/protocol-http":"^5.3.14","@smithy/signature-v4":"^5.3.14","@types/semver":"^7.7.1","auto-bind":"^5.0.1","bidi-js":"^1.0.3","bignumber.js":"^11.1.0",chalk:"^5.6.2","cli-boxes":"^4.0.1","code-excerpt":"^4.0.0","ecdsa-sig-formatter":"^1.0.11","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",hono:"^4.12.21","indent-string":"^5.0.0","lodash-es":"^4.18.1",openai:"^6.34.0",playwright:"^1.50.0",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"},devDependencies:{"@types/bun":"^1.3.12","@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 uZ1}from"path";function pZ1(D,$){let K={...D};for(let[z,J]of Object.entries($)){if(gZ1.has(z))continue;K[z]=J}return K}function lZ1(D){if(D.trim()==="")throw Error("MCP command cannot be empty");if(cZ1.test(D))throw Error(`MCP command contains path traversal: ${D}`);if(mZ1.test(D))throw Error(`MCP command contains shell injection characters: ${D}`)}function dZ1(D,$){return{type:"mcp_server_load",serverName:D,transport:$}}async function nZ1(){let D=uZ1(process.cwd(),".deepseek","mcp.json");try{return await t4(D)}catch{return null}}async function os0(){let D=await nZ1();if(!D?.servers)return{tools:[],errors:[]};let $=[],K=[];for(let[z,J]of Object.entries(D.servers))try{if(J.transport==="stdio")lZ1(J.command);let q=new b00({name:"deepseek-code",version:u7.version}),Y=J.transport==="stdio"?new y00({command:J.command,args:J.args??[],env:pZ1(Object.fromEntries(Object.entries(process.env).filter((W)=>W[1]!==void 0)),J.env??{})}):new s00(new URL(J.url));await q.connect(Y),await G9(dZ1(z,J.transport));let{tools:H}=await q.listTools();for(let W of H)$.push({name:`${z}__${W.name}`,description:`[MCP:${z}] ${W.description??""}`,parameters:W.inputSchema,async execute(w){return(await Promise.race([q.callTool({name:W.name,arguments:w}),new Promise((A,T)=>setTimeout(()=>T(Error(`MCP tool '${W.name}' timed out after 30s`)),30000))])).content.filter((A)=>A.type==="text"&&A.text).map((A)=>A.text).join(`
972
+ `;await fZ1(hZ1,$,"utf-8")}catch{}}var rs0,bZ1,hZ1,ns0=!1;var e00=R(()=>{rs0=is0(kZ1(),".deepseek","logs"),bZ1=`${Date.now()}-${xZ1(3).toString("hex")}`,hZ1=is0(rs0,`session-${bZ1}.jsonl`)});var u7;var kG=R(()=>{u7={name:"@hermenics/deepseek-code",version:"0.1.1",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","@hono/node-server":"^1.14.0","@modelcontextprotocol/sdk":"^1.29.0","@smithy/protocol-http":"^5.3.14","@smithy/signature-v4":"^5.3.14","@types/semver":"^7.7.1","auto-bind":"^5.0.1","bidi-js":"^1.0.3","bignumber.js":"^11.1.0",chalk:"^5.6.2","cli-boxes":"^4.0.1","code-excerpt":"^4.0.0","ecdsa-sig-formatter":"^1.0.11","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",hono:"^4.12.21","indent-string":"^5.0.0","lodash-es":"^4.18.1",openai:"^6.34.0",playwright:"^1.50.0",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"},devDependencies:{"@types/bun":"^1.3.12","@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 uZ1}from"path";function pZ1(D,$){let K={...D};for(let[z,J]of Object.entries($)){if(gZ1.has(z))continue;K[z]=J}return K}function lZ1(D){if(D.trim()==="")throw Error("MCP command cannot be empty");if(cZ1.test(D))throw Error(`MCP command contains path traversal: ${D}`);if(mZ1.test(D))throw Error(`MCP command contains shell injection characters: ${D}`)}function dZ1(D,$){return{type:"mcp_server_load",serverName:D,transport:$}}async function nZ1(){let D=uZ1(process.cwd(),".deepseek","mcp.json");try{return await t4(D)}catch{return null}}async function os0(){let D=await nZ1();if(!D?.servers)return{tools:[],errors:[]};let $=[],K=[];for(let[z,J]of Object.entries(D.servers))try{if(J.transport==="stdio")lZ1(J.command);let q=new b00({name:"deepseek-code",version:u7.version}),Y=J.transport==="stdio"?new y00({command:J.command,args:J.args??[],env:pZ1(Object.fromEntries(Object.entries(process.env).filter((W)=>W[1]!==void 0)),J.env??{})}):new s00(new URL(J.url));await q.connect(Y),await G9(dZ1(z,J.transport));let{tools:H}=await q.listTools();for(let W of H)$.push({name:`${z}__${W.name}`,description:`[MCP:${z}] ${W.description??""}`,parameters:W.inputSchema,async execute(w){return(await Promise.race([q.callTool({name:W.name,arguments:w}),new Promise((A,T)=>setTimeout(()=>T(Error(`MCP tool '${W.name}' timed out after 30s`)),30000))])).content.filter((A)=>A.type==="text"&&A.text).map((A)=>A.text).join(`
973
973
  `)}})}catch(q){let Y=`MCP server '${z}': ${q.message}`;K.push(Y)}return{tools:$,errors:K}}var gZ1,mZ1,cZ1;var ts0=R(()=>{Ms0();Ls0();ls0();o5();e00();kG();gZ1=new Set(["PATH","LD_PRELOAD","LD_LIBRARY_PATH","DYLD_INSERT_LIBRARIES","DYLD_LIBRARY_PATH","HOME","USER","SHELL","PYTHONPATH","NODE_OPTIONS","NODE_PATH","BUN_INSTALL"]),mZ1=/[;|`<>]|&&|\|\||\$\(|>>|<</,cZ1=/\.\.[/\\]/});import{readFile as iZ1}from"fs/promises";async function ss0(D){if(!D.length)return"";let $=await as0.default(D,{cwd:process.cwd(),ignore:["**/node_modules/**","**/.git/**"],dot:!0,absolute:!0}),K=[];for(let z of $)try{let J=await iZ1(z,"utf-8"),Y=J.length>D80?J.slice(0,D80)+`
974
974
 
975
975
  ...(truncated \u2014 file exceeds ${D80} chars)`:J;K.push(`// File: ${z}
package/package.json CHANGED
@@ -1,8 +1,15 @@
1
1
  {
2
2
  "name": "@hermenics/deepseek-code",
3
- "version": "0.1.0",
3
+ "version": "0.1.1",
4
4
  "description": "An AI-powered coding assistant that lives in your terminal",
5
- "keywords": ["ai", "cli", "deepseek", "coding-assistant", "terminal", "tui"],
5
+ "keywords": [
6
+ "ai",
7
+ "cli",
8
+ "deepseek",
9
+ "coding-assistant",
10
+ "terminal",
11
+ "tui"
12
+ ],
6
13
  "license": "Apache-2.0",
7
14
  "type": "module",
8
15
  "bin": {