@docsagent/docsagent 1.0.0 → 1.0.2

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.
Binary file
Binary file
@@ -0,0 +1,4 @@
1
+ import{spawn as w}from"child_process";import a from"path";import{fileURLToPath as d}from"url";import y from"fs";var f=d(import.meta.url),g=a.dirname(f),c=()=>{let n=process.platform,r=process.arch,t="";n==="darwin"?r==="arm64"?t="docsagent-aarch64-apple-darwin":r==="x64"?t="docsagent-x86_64-apple-darwin":t="docsagent-universal-apple-darwin":n==="win32"?t="docsagent-x86_64-pc-windows-msvc.exe":n==="linux"&&(r==="arm64"?t="docsagent-aarch64-unknown-linux-gnu":t="docsagent-x86_64-unknown-linux-gnu");let e=a.join(g,"../bin",t);if(!y.existsSync(e))throw new Error(`Binary not found for platform "${n}" and architecture "${r}". Expected at: ${e}`);return e};import{McpServer as P}from"@modelcontextprotocol/sdk/server/mcp.js";import{StdioServerTransport as T}from"@modelcontextprotocol/sdk/server/stdio.js";import{z as l}from"zod";import b from"net";var h=18688,u=class{process=null;binaryPath;port=h;baseUrl=`http://localhost:${h}`;initialPath;readyPromise;constructor(r){this.binaryPath=c(),this.initialPath=r,this.readyPromise=this.startEngine()}isPortAvailable(r){return new Promise(t=>{let e=b.createServer();e.once("error",()=>t(!1)),e.once("listening",()=>{e.close(),t(!0)}),e.listen(r)})}async findPort(){for(let e=18688;e<18708;e++)try{let s=new AbortController,o=setTimeout(()=>s.abort(),100),i=await fetch(`http://localhost:${e}/status`,{signal:s.signal});if(clearTimeout(o),i.ok)return e}catch{}let t=18688;for(;t<65535;){if(await this.isPortAvailable(t))return t;t++}throw new Error("No available ports found")}async startEngine(){this.port=await this.findPort(),this.baseUrl=`http://localhost:${this.port}`;try{let t=new AbortController,e=setTimeout(()=>t.abort(),200),s=await fetch(`${this.baseUrl}/status`,{signal:t.signal});if(clearTimeout(e),s.ok)return}catch{}if(!this.binaryPath)throw new Error("Engine binary path is not defined. Please ensure your platform is supported and binaries are correctly bundled.");let r=["--port",this.port.toString()];if(this.initialPath){let t=Array.isArray(this.initialPath)?this.initialPath.join(" "):this.initialPath;r.push("--source",t)}return new Promise((t,e)=>{this.process=w(this.binaryPath,r,{stdio:"ignore",detached:!0}),this.process.unref(),this.process.on("error",i=>{this.process=null,e(i)}),this.process.on("exit",i=>{i!==0&&this.process&&console.error(`DocsAgent engine exited with code ${i}`),this.process=null});let s=0,o=async()=>{try{let i=new AbortController,p=setTimeout(()=>i.abort(),100),m=await fetch(`${this.baseUrl}/status`,{signal:i.signal});if(clearTimeout(p),m.ok)t();else throw new Error}catch{s++,s>50?e(new Error(`Timeout waiting for DocsAgent service to start on port ${this.port}`)):setTimeout(o,100)}};setTimeout(o,50)})}async request(r,t,e){await this.readyPromise;let s=`${this.baseUrl}${r}`;try{let o=await fetch(s,{method:t,headers:e?{"Content-Type":"application/json"}:void 0,body:e?JSON.stringify(e):void 0});if(!o.ok)throw new Error(`HTTP error! status: ${o.status}`);return await o.json()}catch(o){throw new Error(`Failed to communicate with DocsAgent service: ${o.message}`)}}async add(r){let t=Array.isArray(r)?r:[r];await this.request("/add","POST",{source:t})}async search(r){let t=await this.request("/search","POST",{query:r});return t&&t.code===200&&Array.isArray(t.result_items)?t.result_items:[]}async status(){return await this.request("/status","GET")}async list(){let r=await this.request("/list","GET");return Array.isArray(r)?r:[]}async remove(r){await this.request("/remove","POST",{path:r})}async close(){try{await this.request("/close","POST")}catch{this.process&&(this.process.kill(),this.process=null)}}async startMcpServer(){await this.readyPromise;let r=new P({name:"DocsAgent",version:"1.0.0"});r.tool("search",{query:l.string().describe("The search query for local documents")},async({query:e})=>{try{let s=await this.search(e);return s.length===0?{content:[{type:"text",text:"No results found."}]}:{content:[{type:"text",text:s.map(i=>`[Score: ${i.score.toFixed(2)}]${i.path?` ${i.path}`:""}${i.page?` (P${i.page})`:""}
2
+ Context: ${i.context}`).join(`
3
+
4
+ `)}]}}catch(s){return{content:[{type:"text",text:s.message}],isError:!0}}}),r.tool("add_docs",{dir:l.string().describe("The directory or file path to add")},async({dir:e})=>{try{return await this.add(e),{content:[{type:"text",text:`Added ${e}`}]}}catch(s){return{content:[{type:"text",text:s.message}],isError:!0}}});let t=new T;await r.connect(t)}};export{u as a};
package/dist/cli.mjs CHANGED
@@ -1,21 +1,17 @@
1
1
  #!/usr/bin/env node
2
- import{a as f}from"./chunk-D7PCT4W2.mjs";import l from"path";var a=process.argv.slice(2),n=18688,r=a.findIndex(o=>o==="--port"||o==="-p");r!==-1&&a[r+1]&&(n=parseInt(a[r+1]),a.splice(r,2));var m=a[0],t=a.slice(1),x=async()=>{let o;m==="server"&&(o=(t.length>0?t:["."]).map(c=>l.resolve(c)));let s=new f(o,n);switch(m){case"server":let i=o?o.join(", "):".";console.log(`Starting DocsAgent MCP Server on port ${n} (indexing: ${i})...`),await s.startMcpServer();break;case"add":t.length===0&&(console.error("Please specify at least one directory or file to add."),process.exit(1));let c=t.map(e=>l.resolve(e));await s.add(c),console.log(`Added ${c.join(", ")} to DocsAgent.`);break;case"search":let d=t.join(" ");d||(console.error("Please specify a search query."),process.exit(1));let p=await s.search(d);p.length===0?console.log("No results found."):p.forEach((e,v)=>{console.log(`${v+1}. [Score: ${e.score.toFixed(2)}]${e.path?` ${e.path}`:""}${e.page?` (Page ${e.page})`:""}`),console.log(` Context: ${e.context}`),console.log("---")});break;case"status":let u=await s.status();console.log(JSON.stringify(u,null,2));break;case"list":let g=await s.list();g.length===0?console.log("No documents indexed."):g.forEach(e=>console.log(`- ${e}`));break;case"remove":t[0]||(console.error("Please specify a path to remove."),process.exit(1));let h=l.resolve(t[0]);await s.remove(h),console.log(`Removed ${h} from DocsAgent.`);break;case"stop":case"close":console.log(`Stopping DocsAgent service on port ${n}...`),await s.close(),console.log("Service stopped.");break;default:console.log(`
2
+ import{a as i}from"./chunk-52AKOQ4J.mjs";import g from"path";var p=process.argv.slice(2),d=p[0],t=p.slice(1),f=async()=>{let o;d==="server"&&(o=(t.length>0?t:["."]).map(a=>g.resolve(a)));let s=new i(o);switch(d){case"server":let c=o?o.join(", "):".";console.log(`Starting DocsAgent MCP Server (indexing: ${c})...`),await s.startMcpServer();break;case"add":t.length===0&&(console.error("Please specify at least one directory or file to add."),process.exit(1));let a=t.map(e=>g.resolve(e));await s.add(a),console.log(`Added ${a.join(", ")} to DocsAgent.`);break;case"search":let n=t.join(" ");n||(console.error("Please specify a search query."),process.exit(1));let r=await s.search(n);r.length===0?console.log("No results found."):r.forEach((e,u)=>{console.log(`${u+1}. [Score: ${e.score.toFixed(2)}]${e.path?` ${e.path}`:""}${e.page?` (Page ${e.page})`:""}`),console.log(` Context: ${e.context}`),console.log("---")});break;case"status":let h=await s.status();console.log(JSON.stringify(h,null,2));break;case"list":let l=await s.list();l.length===0?console.log("No documents indexed."):l.forEach(e=>console.log(`- ${e}`));break;case"stop":console.log("Stopping DocsAgent service..."),await s.close(),console.log("Service stopped.");break;case"close":console.log("Stopping DocsAgent service..."),await s.close(),console.log("Service stopped.");break;default:console.log(`
3
3
  DocsAgent CLI (Aliases: dag, da)
4
4
 
5
5
  Usage:
6
- docsagent server [paths...] [--port <n>] Start persistent service (MCP)
7
- docsagent search <q> [paths...] [--port <n>] Search for documents
8
- docsagent add <paths...> [--port <n>] Add directories or files to DocsAgent
9
- docsagent status [--port <n>] Check engine status
10
- docsagent list [--port <n>] List all indexed documents
11
- docsagent remove <path> [--port <n>] Remove a document/folder from index
12
- docsagent stop [--port <n>] Stop the background service
6
+ docsagent server [paths...] Start persistent service (MCP)
7
+ docsagent search <q> [paths...] Search for documents
8
+ docsagent add <paths...> Add directories or files to DocsAgent
9
+ docsagent status Check engine status
10
+ docsagent list List all indexed documents
11
+ docsagent stop Stop the background service
13
12
 
14
13
  Examples:
15
14
  docsagent search "Barclays case" (Formal)
16
15
  dag search "Barclays case" (Geeky)
17
16
  da status (Short)
18
-
19
- Options:
20
- -p, --port <n> Port for the local service (default: 18688)
21
- `);break}};x().catch(o=>{console.error("Error:",o.message),process.exit(1)});process.on("SIGINT",()=>{process.exit(0)});
17
+ `);break}};f().catch(o=>{console.error("Error:",o.message),process.exit(1)});process.on("SIGINT",()=>{process.exit(0)});
package/dist/index.mjs CHANGED
@@ -1 +1 @@
1
- import{a}from"./chunk-D7PCT4W2.mjs";export{a as DocsAgent};
1
+ import{a}from"./chunk-52AKOQ4J.mjs";export{a as DocsAgent};
package/package.json CHANGED
@@ -1,6 +1,6 @@
1
1
  {
2
2
  "name": "@docsagent/docsagent",
3
- "version": "1.0.0",
3
+ "version": "1.0.2",
4
4
  "description": "Private Local Documents Search Assistant",
5
5
  "main": "dist/index.mjs",
6
6
  "bin": {
@@ -15,7 +15,8 @@
15
15
  "scripts": {
16
16
  "build": "tsup src/index.ts src/cli.ts --format esm --tsconfig tsconfig.json --clean --minify",
17
17
  "dev": "tsup src/index.ts --format esm --watch",
18
- "prepublishOnly": "npm run build"
18
+ "prepublishOnly": "npm run build",
19
+ "postinstall": "node scripts/install.mjs"
19
20
  },
20
21
  "dependencies": {
21
22
  "@modelcontextprotocol/sdk": "^1.0.1",
@@ -1,4 +0,0 @@
1
- import{spawn as g}from"child_process";import n from"path";import{fileURLToPath as m}from"url";var d=m(import.meta.url),y=n.dirname(d),c=()=>{let a=process.platform,e=process.arch,t="";return a==="darwin"?e==="arm64"?t="docsagent-aarch64-apple-darwin":e==="x64"?t="docsagent-x86_64-apple-darwin":t="docsagent-universal-apple-darwin":a==="win32"?t="docsagent-x86_64-pc-windows-msvc.exe":a==="linux"&&(t="docsagent-universal-apple-darwin"),n.join(y,"../bin",t)};import{McpServer as f}from"@modelcontextprotocol/sdk/server/mcp.js";import{StdioServerTransport as w}from"@modelcontextprotocol/sdk/server/stdio.js";import{z as l}from"zod";var P=18688,h=class{process=null;binaryPath;port;baseUrl;initialPath;readyPromise;constructor(e,t=P){this.binaryPath=c(),this.initialPath=e,this.port=t,this.baseUrl=`http://localhost:${this.port}`,this.readyPromise=this.startEngine()}async startEngine(){try{let t=new AbortController,s=setTimeout(()=>t.abort(),200),i=await fetch(`${this.baseUrl}/status`,{signal:t.signal});if(clearTimeout(s),i.ok)return}catch{}let e=["--port",this.port.toString()];if(this.initialPath){let t=Array.isArray(this.initialPath)?this.initialPath.join(" "):this.initialPath;e.push("--source",t)}return new Promise((t,s)=>{this.process=g(this.binaryPath,e,{stdio:"ignore",detached:!0}),this.process.unref(),this.process.on("error",r=>{this.process=null,s(r)}),this.process.on("exit",r=>{r!==0&&this.process&&console.error(`DocsAgent engine exited with code ${r}`),this.process=null});let i=0,o=async()=>{try{let r=new AbortController,p=setTimeout(()=>r.abort(),100),u=await fetch(`${this.baseUrl}/status`,{signal:r.signal});if(clearTimeout(p),u.ok)t();else throw new Error}catch{i++,i>50?s(new Error(`Timeout waiting for DocsAgent service to start on port ${this.port}`)):setTimeout(o,100)}};setTimeout(o,50)})}async request(e,t,s){await this.readyPromise;let i=`${this.baseUrl}${e}`;try{let o=await fetch(i,{method:t,headers:s?{"Content-Type":"application/json"}:void 0,body:s?JSON.stringify(s):void 0});if(!o.ok)throw new Error(`HTTP error! status: ${o.status}`);return await o.json()}catch(o){throw new Error(`Failed to communicate with DocsAgent service: ${o.message}`)}}async add(e){let t=Array.isArray(e)?e:[e];await this.request("/add","POST",{source:t})}async search(e){let t=await this.request("/search","POST",{query:e});return t&&t.code===200&&Array.isArray(t.result_items)?t.result_items:[]}async status(){return await this.request("/status","GET")}async list(){let e=await this.request("/list","GET");return Array.isArray(e)?e:[]}async remove(e){await this.request("/remove","POST",{path:e})}async close(){try{await this.request("/close","POST")}catch{this.process&&(this.process.kill(),this.process=null)}}async startMcpServer(){await this.readyPromise;let e=new f({name:"DocsAgent",version:"1.0.0"});e.tool("search",{query:l.string().describe("The search query for local documents")},async({query:s})=>{try{let i=await this.search(s);return i.length===0?{content:[{type:"text",text:"No results found."}]}:{content:[{type:"text",text:i.map(r=>`[Score: ${r.score.toFixed(2)}]${r.path?` ${r.path}`:""}${r.page?` (P${r.page})`:""}
2
- Context: ${r.context}`).join(`
3
-
4
- `)}]}}catch(i){return{content:[{type:"text",text:i.message}],isError:!0}}}),e.tool("add_docs",{dir:l.string().describe("The directory or file path to add")},async({dir:s})=>{try{return await this.add(s),{content:[{type:"text",text:`Added ${s}`}]}}catch(i){return{content:[{type:"text",text:i.message}],isError:!0}}});let t=new w;await e.connect(t)}};export{h as a};