@lynq/lynq 0.8.0 → 0.8.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.
@@ -0,0 +1 @@
1
+ function d(){let r=new Map;return {async get(e){let n=r.get(e);if(n){if(n.expiresAt!==void 0&&Date.now()>n.expiresAt){r.delete(e);return}return n.value}},async set(e,n,t){if(r.size>=1e3){let s=Date.now();for(let[i,o]of r)o.expiresAt!==void 0&&s>o.expiresAt&&r.delete(i);}r.set(e,{value:n,expiresAt:t!==void 0?Date.now()+t*1e3:void 0});},async delete(e){r.delete(e);}}}function u(r){let e=r.get("user");if(e){if(typeof e=="string")return e;if(typeof e=="object"&&e!==null){let n=e;if(typeof n.id=="string")return n.id;if(typeof n.id=="number")return String(n.id);if(typeof n.sub=="string")return n.sub}}}function f(r,e){let n=()=>{let t=u(r);if(!t){let s=r.get("user");if(s){let i=typeof s=="object"?JSON.stringify(s):typeof s;throw new Error(`userStore: session has a "user" but could not resolve an ID. Expected: string | { id: string | number } | { sub: string }. Got: ${i}`)}throw new Error("userStore requires a user in session. Call session.set('user', ...) first.")}return t};return {async get(t){return e.get(`user:${n()}:${t}`)},async set(t,s,i){await e.set(`user:${n()}:${t}`,s,i);},async delete(t){await e.delete(`user:${n()}:${t}`);}}}export{d as a,u as b,f as c};
package/dist/index.d.ts CHANGED
@@ -1,5 +1,5 @@
1
- import { S as ServerOptions, M as MCPServer } from './types-DyAOlot0.js';
2
- export { E as Elicit, a as ElicitFormResult, b as ElicitUrlOptions, c as ElicitUrlResult, H as HttpAdapterOptions, R as ResourceConfig, d as ResourceContent, e as ResourceContext, f as ResourceHandler, g as RootInfo, h as Sample, i as SampleOptions, j as SampleRawParams, k as SampleRawResult, l as ServerInfo, m as Session, n as Store, T as TaskConfig, o as TaskContext, p as TaskControl, q as TaskHandler, r as ToolConfig, s as ToolContext, t as ToolHandler, u as ToolInfo, v as ToolMiddleware, w as ToolResponse, U as User, x as UserStore, y as error, z as image, A as json, B as text } from './types-DyAOlot0.js';
1
+ import { S as ServerOptions, M as MCPServer } from './types-P-hHI9qc.js';
2
+ export { E as Elicit, a as ElicitFormResult, b as ElicitUrlOptions, c as ElicitUrlResult, H as HttpAdapterOptions, R as ResourceConfig, d as ResourceContent, e as ResourceContext, f as ResourceHandler, g as RootInfo, h as Sample, i as SampleOptions, j as SampleRawParams, k as SampleRawResult, l as ServerInfo, m as Session, n as Store, T as TaskConfig, o as TaskContext, p as TaskControl, q as TaskHandler, r as ToolConfig, s as ToolContext, t as ToolHandler, u as ToolInfo, v as ToolMiddleware, w as ToolResponse, U as User, x as UserStore, y as error, z as image, A as json, B as text } from './types-P-hHI9qc.js';
3
3
  export { memoryStore } from './store.js';
4
4
  import '@modelcontextprotocol/sdk/types.js';
5
5
  import 'zod';
package/dist/index.mjs CHANGED
@@ -1 +1 @@
1
- import {b as b$1,c,d,a as a$1,k,f,e}from'./chunk-3BJEUP3F.mjs';import {a,c as c$2}from'./chunk-ICQVA5UM.mjs';export{a as memoryStore}from'./chunk-ICQVA5UM.mjs';import {c as c$1,d as d$1,b as b$2,a as a$2}from'./chunk-VAAZWX4U.mjs';export{c as error,d as image,b as json,a as text}from'./chunk-VAAZWX4U.mjs';import {Server}from'@modelcontextprotocol/sdk/server/index.js';import {InMemoryTaskStore}from'@modelcontextprotocol/sdk/experimental/tasks';import {ListToolsRequestSchema,CallToolRequestSchema,ListResourcesRequestSchema,ListResourceTemplatesRequestSchema,ReadResourceRequestSchema}from'@modelcontextprotocol/sdk/types.js';function z(){let t=new Map;function e(){let r=Date.now();for(let[a,l]of t)r-l.createdAt>36e5&&t.delete(a);}function o(r,a,l){return e(),new Promise(p=>{let n;try{n=l.createElicitationCompletionNotifier(r);}catch{}t.set(r,{resolver:p,completionNotifier:n,createdAt:Date.now()});})}function s(r){e();let a=t.get(r);a&&(t.delete(r),a.completionNotifier&&a.completionNotifier().catch(()=>{}),a.resolver());}function i(r){let a=t.get(r);a&&(t.delete(r),a.resolver());}return {register:o,complete:s,cancel:i}}function K(t,e,o){return {async form(s,i){let r=a$1(i),a=await t.elicitInput({message:s,requestedSchema:r});return {action:a.action,content:a.content??{}}},async url(s,i,r){let a=r?.elicitationId??crypto.randomUUID(),l;r?.waitForCompletion&&e&&(l=e(a,t));let p=await t.elicitInput({mode:"url",message:s,url:i,elicitationId:a});if(p.action==="accept"&&l){let n=r?.timeout??3e5,g,v=new Promise((T,d)=>{g=setTimeout(()=>d(new Error("Elicitation timed out")),n);});try{await Promise.race([l,v]);}catch(T){throw o&&o(a),T}finally{clearTimeout(g);}}else l&&o&&o(a);return {action:p.action}}}}function L(t){return async()=>{try{return (await t.listRoots()).roots.map(o=>{let s={uri:o.uri};return o.name!==void 0&&(s.name=o.name),s})}catch{return []}}}function Q(t){async function e(s,i){let r={messages:[{role:"user",content:{type:"text",text:s}}],maxTokens:i?.maxTokens??1024};i?.model!==void 0&&(r.modelPreferences={hints:[{name:i.model}]}),i?.system!==void 0&&(r.systemPrompt=i.system),i?.temperature!==void 0&&(r.temperature=i.temperature),i?.stopSequences!==void 0&&(r.stopSequences=i.stopSequences);let l=(await t.createMessage(r)).content;return l.type==="text"?l.text:""}async function o(s){return t.createMessage(s)}return Object.assign(e,{raw:o})}function O(t,e,o,s,i,r,a,l,p){return {toolName:s,args:i,session:o,signal:r,sessionId:e,elicit:K(t,l,p),roots:L(t),sample:Q(t),text:a$2,json:b$2,error:c$1,image:d$1,store:a,userStore:c$2(o,a)}}function b(t,e){let o=t.sessions.get(e);if(!o&&(o={data:new Map,grants:new Set,toolOverrides:new Map,resourceOverrides:new Map},t.sessions.set(e,o),t.onSessionCreate))try{Promise.resolve(t.onSessionCreate(e)).catch(()=>{});}catch{}return o}function P(t,e$1,o){let s=b(t,o);return e(e$1.hiddenByMiddlewares,e$1.name,s.toolOverrides,s.grants)}function C(t,e$1,o){let s=b(t,o);return e(e$1.hiddenByMiddlewares,e$1.uri,s.resourceOverrides,s.grants)}function x(t,e$1,o){let s=b(t,o);return e(e$1.hiddenByMiddlewares,e$1.name,s.toolOverrides,s.grants)}function _(t,e,o){(o&&t.serverBySession.get(o)||e).sendToolListChanged().catch(()=>{});}function A(t,e,o){(o&&t.serverBySession.get(o)||e).sendResourceListChanged().catch(()=>{});}function w(t,e,o){let s=b(t,o);return {get(i){return s.data.get(i)},set(i,r){s.data.set(i,r);},authorize(i){s.grants.add(i),_(t,e,o),A(t,e,o);},revoke(i){s.grants.delete(i),_(t,e,o),A(t,e,o);},enableTools(...i){for(let r of i)s.toolOverrides.set(r,"enabled");_(t,e,o);},disableTools(...i){for(let r of i)s.toolOverrides.set(r,"disabled");_(t,e,o);},enableResources(...i){for(let r of i)s.resourceOverrides.set(r,"enabled");A(t,e,o);},disableResources(...i){for(let r of i)s.resourceOverrides.set(r,"disabled");A(t,e,o);}}}function F(){let t=new Set,e=new InMemoryTaskStore;return {taskStore:new Proxy(e,{get(s,i,r){return i==="updateTaskStatus"?async(a,l,...p)=>(l==="cancelled"&&t.add(a),s.updateTaskStatus.call(s,a,l,...p)):Reflect.get(s,i,r)}}),cancelledTaskIds:t}}function N(t,e,o,s,i){t.setRequestHandler(ListToolsRequestSchema,(r,a)=>{let l=a.sessionId??"default",p=[];for(let n of e.tools.values())P(e,n,l)&&p.push({name:n.name,description:n.description,inputSchema:a$1(n.input)});for(let n of e.tasks.values())x(e,n,l)&&p.push({name:n.name,description:n.description,inputSchema:a$1(n.input),execution:{taskSupport:"required"}});return {tools:p}}),t.setRequestHandler(CallToolRequestSchema,async(r,a)=>{let{name:l,arguments:p}=r.params,n=a.sessionId??"default",g=e.tools.get(l);if(g){if(!P(e,g,n))return c$1(`Tool not available: ${l}`);let T=p??{},d=O(t,n,w(e,o,n),l,T,a.signal,e.store,(m,f)=>s.register(m,n,f),s.cancel),u=()=>Promise.resolve(g.handler(T,d));return k(g.middlewares,d,u)()}let v=e.tasks.get(l);if(v){if(!x(e,v,n))return c$1(`Tool not available: ${l}`);let T=a.taskStore;if(!T)return c$1("Task store not available");let d=await T.createTask({pollInterval:1e3}),u=d.taskId,c={progress(S,k){if(i.has(u))return;let W=k?`${S}% ${k}`:`${S}%`;T.updateTaskStatus(u,"working",W).catch(()=>{});},get cancelled(){return i.has(u)}},m=p??{},f={...O(t,n,w(e,o,n),l,m,a.signal,e.store,(S,k)=>s.register(S,n,k),s.cancel),task:c},y=async()=>((async()=>{try{let S=await v.handler(m,f);i.has(u)||await T.storeTaskResult(u,"completed",S);}catch(S){if(!i.has(u)){let k=S instanceof Error?S.message:String(S);await T.storeTaskResult(u,"failed",c$1(k)).catch(()=>{});}}})(),{task:d});return k(v.middlewares,f,y)()}return c$1(`Unknown tool: ${l}`)}),t.setRequestHandler(ListResourcesRequestSchema,(r,a)=>{let l=a.sessionId??"default",p=[];for(let n of e.resources.values())!n.isTemplate&&C(e,n,l)&&p.push({uri:n.uri,name:n.name,description:n.description,mimeType:n.mimeType});return {resources:p}}),t.setRequestHandler(ListResourceTemplatesRequestSchema,(r,a)=>{let l=a.sessionId??"default",p=[];for(let n of e.resources.values())n.isTemplate&&C(e,n,l)&&p.push({uriTemplate:n.uri,name:n.name,description:n.description,mimeType:n.mimeType});return {resourceTemplates:p}}),t.setRequestHandler(ReadResourceRequestSchema,async(r,a)=>{let{uri:l}=r.params,p=f(e.resources,l);if(!p)throw new Error(`Unknown resource: ${l}`);let n=a.sessionId??"default";if(!C(e,p,n))throw new Error(`Resource not available: ${l}`);let g=w(e,o,n),v={uri:l,session:g,sessionId:n,roots:L(t),store:e.store,userStore:c$2(g,e.store)},T=O(t,n,g,p.uri,{},a.signal,e.store,(c,m)=>s.register(c,n,m),s.cancel),d=async()=>{let c=await p.handler(l,v);return {contents:[{uri:l,mimeType:c.mimeType??p.mimeType,...c.text!=null?{text:c.text}:{},...c.blob!=null?{blob:c.blob}:{}}]}};return k(p.middlewares,T,d)()});}function G(t,e,o,s,i,r,a){let l={tools:{listChanged:true},resources:{listChanged:true},tasks:{list:{},cancel:{},requests:{tools:{call:{}}}}};function p(){let n=new Server(t,{capabilities:l,taskStore:o});return a(n,e,s,i,r),n}return function(g){let v=null;async function T(){return v||(v=(await import('@modelcontextprotocol/sdk/server/webStandardStreamableHttp.js')).WebStandardStreamableHTTPServerTransport),v}if(g?.sessionless)return async c=>{let m=await T(),f=p(),y=new m({sessionIdGenerator:void 0,enableJsonResponse:g?.enableJsonResponse});return await f.connect(y),y.handleRequest(c)};let d=new Map,u=false;return async c=>{!u&&e.onServerStart&&(u=true,Promise.resolve(e.onServerStart()).catch(()=>{}));let m=await T(),f=c.headers.get("mcp-session-id");if(f){let S=d.get(f);return S?(g?.onRequest&&await g.onRequest(c,f,w(e,s,f)),S.transport.handleRequest(c)):new Response(JSON.stringify({jsonrpc:"2.0",error:{code:-32e3,message:"Session not found"}}),{status:404,headers:{"Content-Type":"application/json"}})}let y=p(),h=new m({sessionIdGenerator:g?.sessionIdGenerator??(()=>crypto.randomUUID()),enableJsonResponse:g?.enableJsonResponse,onsessioninitialized:S=>{d.set(S,{server:y,transport:h}),e.serverBySession.set(S,y),g?.onRequest&&g.onRequest(c,S,w(e,s,S));},onsessionclosed:S=>{d.delete(S),e.serverBySession.delete(S),e.sessions.delete(S),e.onSessionDestroy&&Promise.resolve(e.onSessionDestroy(S)).catch(()=>{});}});return await y.connect(h),h.handleRequest(c)}}}function ne(t){let e={store:t.store??a(),globalMiddlewares:[],tools:new Map,resources:new Map,tasks:new Map,sessions:new Map,serverBySession:new Map,onServerStart:t.onServerStart,onSessionCreate:t.onSessionCreate,onSessionDestroy:t.onSessionDestroy},o=z(),{taskStore:s,cancelledTaskIds:i}=F(),r=new Server(t,{capabilities:{tools:{listChanged:true},resources:{listChanged:true},tasks:{list:{},cancel:{},requests:{tools:{call:{}}}}},taskStore:s});N(r,e,r,o,i);function a$1(d){e.globalMiddlewares.push(d);}function l(...d){let u=d[0],c$1=b$1(`tool("${u}")`,d.slice(1));if(typeof c$1.config.name=="string")throw new TypeError(`tool("${u}"): second-to-last argument must be a config object`);let m=c$1.config,f=[...e.globalMiddlewares,...c$1.middlewares],y={name:u,description:m.description,middlewares:f};e.tools.set(u,{name:u,description:m.description,input:m.input,handler:c$1.handler,middlewares:f,hiddenByMiddlewares:c(y,f)});}function p(...d$1){let u=d$1[0],c$1=b$1(`resource("${u}")`,d$1.slice(1));if(typeof c$1.config.name!="string")throw new TypeError(`resource("${u}"): second-to-last argument must be a config object with a "name" property`);let m=c$1.config,f=[...e.globalMiddlewares,...c$1.middlewares],y={name:m.name,description:m.description,middlewares:f},h=u.includes("{");e.resources.set(u,{uri:u,isTemplate:h,uriPattern:h?d(u):null,name:m.name,description:m.description,mimeType:m.mimeType,handler:c$1.handler,middlewares:f,hiddenByMiddlewares:c(y,f)});}function n(...d){let u=d[0],c$1=b$1(`task("${u}")`,d.slice(1));if(typeof c$1.config.name=="string")throw new TypeError(`task("${u}"): second-to-last argument must be a config object`);let m=c$1.config,f=[...e.globalMiddlewares,...c$1.middlewares],y={name:u,description:m.description,middlewares:f};e.tasks.set(u,{name:u,description:m.description,input:m.input,handler:c$1.handler,middlewares:f,hiddenByMiddlewares:c(y,f)});}async function g(){let{StdioServerTransport:d}=await import('@modelcontextprotocol/sdk/server/stdio.js'),u=new d;await r.connect(u),e.onServerStart&&await Promise.resolve(e.onServerStart()).catch(()=>{});}async function v(d){await r.connect(d);}let T=G(t,e,s,r,o,i,N);return {use:a$1,tool:l,resource:p,task:n,stdio:g,http:T,session:d=>w(e,r,d),completeElicitation:o.complete,store:e.store,connect:v,_server:r,_getSession:d=>b(e,d),_isToolVisible(d,u){let c=e.tools.get(d);return c?P(e,c,u):false},_isResourceVisible(d,u){let c=e.resources.get(d);return c?C(e,c,u):false},_isTaskVisible(d,u){let c=e.tasks.get(d);return c?x(e,c,u):false},_createSessionAPI:d=>w(e,r,d)}}export{ne as createMCPServer};
1
+ import {b as b$1,c,d,a as a$1,k,f,e}from'./chunk-3BJEUP3F.mjs';import {a,c as c$2}from'./chunk-63JN2KYH.mjs';export{a as memoryStore}from'./chunk-63JN2KYH.mjs';import {c as c$1,d as d$1,b as b$2,a as a$2}from'./chunk-VAAZWX4U.mjs';export{c as error,d as image,b as json,a as text}from'./chunk-VAAZWX4U.mjs';import {Server}from'@modelcontextprotocol/sdk/server/index.js';import {InMemoryTaskStore}from'@modelcontextprotocol/sdk/experimental/tasks';import {ListToolsRequestSchema,CallToolRequestSchema,ListResourcesRequestSchema,ListResourceTemplatesRequestSchema,ReadResourceRequestSchema}from'@modelcontextprotocol/sdk/types.js';function z(){let t=new Map;function e(){let r=Date.now();for(let[c,d]of t)r-d.createdAt>36e5&&t.delete(c);}function o(r,c,d){return e(),new Promise(m=>{let n;try{n=d.createElicitationCompletionNotifier(r);}catch{}t.set(r,{resolver:m,completionNotifier:n,createdAt:Date.now()});})}function s(r){e();let c=t.get(r);c&&(t.delete(r),c.completionNotifier&&c.completionNotifier().catch(()=>{}),c.resolver());}function i(r){let c=t.get(r);c&&(t.delete(r),c.resolver());}return {register:o,complete:s,cancel:i}}function K(t,e,o){return {async form(s,i){let r=a$1(i),c=await t.elicitInput({message:s,requestedSchema:r});return {action:c.action,content:c.content??{}}},async url(s,i,r){let c=r?.elicitationId??crypto.randomUUID(),d;r?.waitForCompletion&&e&&(d=e(c,t));let m=await t.elicitInput({mode:"url",message:s,url:i,elicitationId:c});if(m.action==="accept"&&d){let n=r?.timeout??3e5,g,y=new Promise((T,a)=>{g=setTimeout(()=>a(new Error("Elicitation timed out")),n);});try{await Promise.race([d,y]);}catch(T){throw o&&o(c),T}finally{clearTimeout(g);}}else d&&o&&o(c);return {action:m.action}}}}function D(t){return async()=>{try{return (await t.listRoots()).roots.map(o=>{let s={uri:o.uri};return o.name!==void 0&&(s.name=o.name),s})}catch{return []}}}function Q(t){async function e(s,i){let r={messages:[{role:"user",content:{type:"text",text:s}}],maxTokens:i?.maxTokens??1024};i?.model!==void 0&&(r.modelPreferences={hints:[{name:i.model}]}),i?.system!==void 0&&(r.systemPrompt=i.system),i?.temperature!==void 0&&(r.temperature=i.temperature),i?.stopSequences!==void 0&&(r.stopSequences=i.stopSequences);let d=(await t.createMessage(r)).content;return d.type==="text"?d.text:""}async function o(s){return t.createMessage(s)}return Object.assign(e,{raw:o})}function O(t,e,o,s,i,r,c,d,m){return {toolName:s,args:i,session:o,signal:r,sessionId:e,elicit:K(t,d,m),roots:D(t),sample:Q(t),text:a$2,json:b$2,error:c$1,image:d$1,store:c,userStore:c$2(o,c)}}function b(t,e){let o=t.sessions.get(e);if(!o&&(o={data:new Map,grants:new Set,toolOverrides:new Map,resourceOverrides:new Map},t.sessions.set(e,o),t.onSessionCreate))try{Promise.resolve(t.onSessionCreate(e)).catch(()=>{});}catch{}return o}function P(t,e$1,o){let s=b(t,o);return e(e$1.hiddenByMiddlewares,e$1.name,s.toolOverrides,s.grants)}function C(t,e$1,o){let s=b(t,o);return e(e$1.hiddenByMiddlewares,e$1.uri,s.resourceOverrides,s.grants)}function x(t,e$1,o){let s=b(t,o);return e(e$1.hiddenByMiddlewares,e$1.name,s.toolOverrides,s.grants)}function _(t,e,o){(o&&t.serverBySession.get(o)||e).sendToolListChanged().catch(()=>{});}function A(t,e,o){(o&&t.serverBySession.get(o)||e).sendResourceListChanged().catch(()=>{});}function w(t,e,o){let s=b(t,o);return {get(i){return s.data.get(i)},set(i,r){s.data.set(i,r);},authorize(i){s.grants.add(i),_(t,e,o),A(t,e,o);},revoke(i){s.grants.delete(i),_(t,e,o),A(t,e,o);},enableTools(...i){for(let r of i)s.toolOverrides.set(r,"enabled");_(t,e,o);},disableTools(...i){for(let r of i)s.toolOverrides.set(r,"disabled");_(t,e,o);},enableResources(...i){for(let r of i)s.resourceOverrides.set(r,"enabled");A(t,e,o);},disableResources(...i){for(let r of i)s.resourceOverrides.set(r,"disabled");A(t,e,o);}}}function F(){let t=new Set,e=new InMemoryTaskStore;return {taskStore:new Proxy(e,{get(s,i,r){return i==="updateTaskStatus"?async(c,d,...m)=>(d==="cancelled"&&t.add(c),s.updateTaskStatus.call(s,c,d,...m)):Reflect.get(s,i,r)}}),cancelledTaskIds:t}}function L(t,e,o,s,i){t.setRequestHandler(ListToolsRequestSchema,(r,c)=>{let d=c.sessionId??"default",m=[];for(let n of e.tools.values())P(e,n,d)&&m.push({name:n.name,description:n.description,inputSchema:a$1(n.input)});for(let n of e.tasks.values())x(e,n,d)&&m.push({name:n.name,description:n.description,inputSchema:a$1(n.input),execution:{taskSupport:"required"}});return {tools:m}}),t.setRequestHandler(CallToolRequestSchema,async(r,c)=>{let{name:d,arguments:m}=r.params,n=c.sessionId??"default",g=e.tools.get(d);if(g){if(!P(e,g,n))return c$1(`Tool not available: ${d}`);let T=m??{},a=O(t,n,w(e,o,n),d,T,c.signal,e.store,(f,S)=>s.register(f,n,S),s.cancel),u=()=>Promise.resolve(g.handler(T,a));return k(g.middlewares,a,u)()}let y=e.tasks.get(d);if(y){if(!x(e,y,n))return c$1(`Tool not available: ${d}`);let T=c.taskStore;if(!T)return c$1("Task store not available");let a=await T.createTask({pollInterval:1e3}),u=a.taskId,l={progress(p,h){if(i.has(u))return;let W=h?`${p}% ${h}`:`${p}%`;T.updateTaskStatus(u,"working",W).catch(()=>{});},get cancelled(){return i.has(u)}},f=m??{},S={...O(t,n,w(e,o,n),d,f,c.signal,e.store,(p,h)=>s.register(p,n,h),s.cancel),task:l},v=async()=>((async()=>{try{let p=await y.handler(f,S);i.has(u)||await T.storeTaskResult(u,"completed",p);}catch(p){if(!i.has(u)){let h=p instanceof Error?p.message:String(p);await T.storeTaskResult(u,"failed",c$1(h)).catch(()=>{});}}})(),{task:a});return k(y.middlewares,S,v)()}return c$1(`Unknown tool: ${d}`)}),t.setRequestHandler(ListResourcesRequestSchema,(r,c)=>{let d=c.sessionId??"default",m=[];for(let n of e.resources.values())!n.isTemplate&&C(e,n,d)&&m.push({uri:n.uri,name:n.name,description:n.description,mimeType:n.mimeType});return {resources:m}}),t.setRequestHandler(ListResourceTemplatesRequestSchema,(r,c)=>{let d=c.sessionId??"default",m=[];for(let n of e.resources.values())n.isTemplate&&C(e,n,d)&&m.push({uriTemplate:n.uri,name:n.name,description:n.description,mimeType:n.mimeType});return {resourceTemplates:m}}),t.setRequestHandler(ReadResourceRequestSchema,async(r,c)=>{let{uri:d}=r.params,m=f(e.resources,d);if(!m)throw new Error(`Unknown resource: ${d}`);let n=c.sessionId??"default";if(!C(e,m,n))throw new Error(`Resource not available: ${d}`);let g=w(e,o,n),y={uri:d,session:g,sessionId:n,roots:D(t),store:e.store,userStore:c$2(g,e.store)},T=O(t,n,g,m.uri,{},c.signal,e.store,(l,f)=>s.register(l,n,f),s.cancel),a=async()=>{let l=await m.handler(d,y);return {contents:[{uri:d,mimeType:l.mimeType??m.mimeType,...l.text!=null?{text:l.text}:{},...l.blob!=null?{blob:l.blob}:{}}]}};return k(m.middlewares,T,a)()});}function G(t,e,o,s,i,r,c){let d={tools:{listChanged:true},resources:{listChanged:true},tasks:{list:{},cancel:{},requests:{tools:{call:{}}}}};function m(){let n=new Server(t,{capabilities:d,taskStore:o});return c(n,e,s,i,r),n}return function(g){let y=null;async function T(){return y||(y=(await import('@modelcontextprotocol/sdk/server/webStandardStreamableHttp.js')).WebStandardStreamableHTTPServerTransport),y}if(g?.sessionless)return async l=>{let f=await T(),S=m(),v=new f({sessionIdGenerator:void 0,enableJsonResponse:g?.enableJsonResponse});return await S.connect(v),v.handleRequest(l)};let a=new Map,u=false;return async l=>{!u&&e.onServerStart&&(u=true,Promise.resolve(e.onServerStart()).catch(()=>{}));let f=await T(),S=l.headers.get("mcp-session-id");if(S){let p=a.get(S);return p?(g?.onRequest&&await g.onRequest(l,S,w(e,s,S)),p.transport.handleRequest(l)):new Response(JSON.stringify({jsonrpc:"2.0",error:{code:-32e3,message:"Session not found"}}),{status:404,headers:{"Content-Type":"application/json"}})}let v=m(),k=new f({sessionIdGenerator:g?.sessionIdGenerator??(()=>crypto.randomUUID()),enableJsonResponse:g?.enableJsonResponse,onsessioninitialized:p=>{a.set(p,{server:v,transport:k}),e.serverBySession.set(p,v),g?.onRequest&&g.onRequest(l,p,w(e,s,p));},onsessionclosed:p=>{a.delete(p),e.serverBySession.delete(p),e.sessions.delete(p),e.onSessionDestroy&&Promise.resolve(e.onSessionDestroy(p)).catch(()=>{});}});return await v.connect(k),v.onclose=()=>{for(let[p,h]of a)if(h.server===v){a.delete(p),e.serverBySession.delete(p),e.sessions.delete(p),e.onSessionDestroy&&Promise.resolve(e.onSessionDestroy(p)).catch(()=>{});break}},k.handleRequest(l)}}}function ne(t){let e={store:t.store??a(),globalMiddlewares:[],tools:new Map,resources:new Map,tasks:new Map,sessions:new Map,serverBySession:new Map,onServerStart:t.onServerStart,onSessionCreate:t.onSessionCreate,onSessionDestroy:t.onSessionDestroy},o=z(),{taskStore:s,cancelledTaskIds:i}=F(),r=new Server(t,{capabilities:{tools:{listChanged:true},resources:{listChanged:true},tasks:{list:{},cancel:{},requests:{tools:{call:{}}}}},taskStore:s});L(r,e,r,o,i),r.onclose=()=>{let a="default";if(e.sessions.delete(a),e.onSessionDestroy)try{Promise.resolve(e.onSessionDestroy(a)).catch(()=>{});}catch{}};function c$1(a){e.globalMiddlewares.push(a);}function d$1(...a){let u=a[0],l=b$1(`tool("${u}")`,a.slice(1));if(typeof l.config.name=="string")throw new TypeError(`tool("${u}"): second-to-last argument must be a config object`);let f=l.config,S=[...e.globalMiddlewares,...l.middlewares],v={name:u,description:f.description,middlewares:S};e.tools.set(u,{name:u,description:f.description,input:f.input,handler:l.handler,middlewares:S,hiddenByMiddlewares:c(v,S)});}function m(...a){let u=a[0],l=b$1(`resource("${u}")`,a.slice(1));if(typeof l.config.name!="string")throw new TypeError(`resource("${u}"): second-to-last argument must be a config object with a "name" property`);let f=l.config,S=[...e.globalMiddlewares,...l.middlewares],v={name:f.name,description:f.description,middlewares:S},k=u.includes("{");e.resources.set(u,{uri:u,isTemplate:k,uriPattern:k?d(u):null,name:f.name,description:f.description,mimeType:f.mimeType,handler:l.handler,middlewares:S,hiddenByMiddlewares:c(v,S)});}function n(...a){let u=a[0],l=b$1(`task("${u}")`,a.slice(1));if(typeof l.config.name=="string")throw new TypeError(`task("${u}"): second-to-last argument must be a config object`);let f=l.config,S=[...e.globalMiddlewares,...l.middlewares],v={name:u,description:f.description,middlewares:S};e.tasks.set(u,{name:u,description:f.description,input:f.input,handler:l.handler,middlewares:S,hiddenByMiddlewares:c(v,S)});}async function g(){let{StdioServerTransport:a}=await import('@modelcontextprotocol/sdk/server/stdio.js'),u=new a;await r.connect(u),e.onServerStart&&await Promise.resolve(e.onServerStart()).catch(()=>{});}async function y(a){await r.connect(a);}let T=G(t,e,s,r,o,i,L);return {use:c$1,tool:d$1,resource:m,task:n,stdio:g,http:T,session:a=>w(e,r,a),completeElicitation:o.complete,store:e.store,connect:y,_server:r,_getSession:a=>b(e,a),_isToolVisible(a,u){let l=e.tools.get(a);return l?P(e,l,u):false},_isResourceVisible(a,u){let l=e.resources.get(a);return l?C(e,l,u):false},_isTaskVisible(a,u){let l=e.tasks.get(a);return l?x(e,l,u):false},_createSessionAPI:a=>w(e,r,a)}}export{ne as createMCPServer};
@@ -1,4 +1,4 @@
1
- import { v as ToolMiddleware } from '../types-DyAOlot0.js';
1
+ import { v as ToolMiddleware } from '../types-P-hHI9qc.js';
2
2
  import { GuardOptions } from './guard.js';
3
3
  import '@modelcontextprotocol/sdk/types.js';
4
4
  import 'zod';
@@ -1,4 +1,4 @@
1
- import { v as ToolMiddleware } from '../types-DyAOlot0.js';
1
+ import { v as ToolMiddleware } from '../types-P-hHI9qc.js';
2
2
  import '@modelcontextprotocol/sdk/types.js';
3
3
  import 'zod';
4
4
 
@@ -1,4 +1,4 @@
1
- import { v as ToolMiddleware } from '../types-DyAOlot0.js';
1
+ import { v as ToolMiddleware } from '../types-P-hHI9qc.js';
2
2
  import '@modelcontextprotocol/sdk/types.js';
3
3
  import 'zod';
4
4
 
@@ -1,4 +1,4 @@
1
- import { v as ToolMiddleware, s as ToolContext } from '../types-DyAOlot0.js';
1
+ import { v as ToolMiddleware, s as ToolContext } from '../types-P-hHI9qc.js';
2
2
  import '@modelcontextprotocol/sdk/types.js';
3
3
  import 'zod';
4
4
 
@@ -1,5 +1,5 @@
1
1
  import { z } from 'zod';
2
- import { v as ToolMiddleware } from '../types-DyAOlot0.js';
2
+ import { v as ToolMiddleware } from '../types-P-hHI9qc.js';
3
3
  import '@modelcontextprotocol/sdk/types.js';
4
4
 
5
5
  interface CredentialsOptions<T extends z.ZodObject<z.ZodRawShape>> {
@@ -1,4 +1,4 @@
1
- import { v as ToolMiddleware } from '../types-DyAOlot0.js';
1
+ import { v as ToolMiddleware } from '../types-P-hHI9qc.js';
2
2
  import '@modelcontextprotocol/sdk/types.js';
3
3
  import 'zod';
4
4
 
@@ -1,4 +1,4 @@
1
- import { v as ToolMiddleware } from '../types-DyAOlot0.js';
1
+ import { v as ToolMiddleware } from '../types-P-hHI9qc.js';
2
2
  import '@modelcontextprotocol/sdk/types.js';
3
3
  import 'zod';
4
4
 
@@ -1,4 +1,4 @@
1
- import { v as ToolMiddleware } from '../types-DyAOlot0.js';
1
+ import { v as ToolMiddleware } from '../types-P-hHI9qc.js';
2
2
  import '@modelcontextprotocol/sdk/types.js';
3
3
  import 'zod';
4
4
 
@@ -1,4 +1,4 @@
1
- import { s as ToolContext, v as ToolMiddleware } from '../types-DyAOlot0.js';
1
+ import { s as ToolContext, v as ToolMiddleware } from '../types-P-hHI9qc.js';
2
2
  import '@modelcontextprotocol/sdk/types.js';
3
3
  import 'zod';
4
4
 
@@ -1,4 +1,4 @@
1
- import { s as ToolContext, v as ToolMiddleware } from '../types-DyAOlot0.js';
1
+ import { s as ToolContext, v as ToolMiddleware } from '../types-P-hHI9qc.js';
2
2
  import '@modelcontextprotocol/sdk/types.js';
3
3
  import 'zod';
4
4
 
@@ -1,4 +1,4 @@
1
- import { v as ToolMiddleware } from '../types-DyAOlot0.js';
1
+ import { v as ToolMiddleware } from '../types-P-hHI9qc.js';
2
2
  import '@modelcontextprotocol/sdk/types.js';
3
3
  import 'zod';
4
4
 
@@ -1 +1 @@
1
- import {b}from'../chunk-ICQVA5UM.mjs';import {c}from'../chunk-VAAZWX4U.mjs';function g(t){let{max:a,windowMs:o=6e4}=t,w=t.store===true||t.perUser===true,d=t.perUser===true,l=t.message??`Rate limit exceeded. Max ${a} calls per ${o/1e3}s.`,f=Math.ceil(o/1e3);return {name:"rateLimit",async onCall(e,n){let i=Date.now();if(w){let u=d?`rateLimit:${b(e.session)??"anon"}:${e.toolName}`:`rateLimit:${e.toolName}`,s=await e.store.get(u);return !s||i>=s.resetAt?(await e.store.set(u,{count:1,resetAt:i+o},f),n()):s.count>=a?c(l):(await e.store.set(u,{...s,count:s.count+1},f),n())}let m=`rateLimit:${e.toolName}`,r=e.session.get(m);return !r||i>=r.resetAt?(e.session.set(m,{count:1,resetAt:i+o}),n()):r.count>=a?c(l):(e.session.set(m,{...r,count:r.count+1}),n())}}}export{g as rateLimit};
1
+ import {b}from'../chunk-63JN2KYH.mjs';import {c}from'../chunk-VAAZWX4U.mjs';function g(t){let{max:a,windowMs:o=6e4}=t,w=t.store===true||t.perUser===true,d=t.perUser===true,l=t.message??`Rate limit exceeded. Max ${a} calls per ${o/1e3}s.`,f=Math.ceil(o/1e3);return {name:"rateLimit",async onCall(e,n){let i=Date.now();if(w){let u=d?`rateLimit:${b(e.session)??"anon"}:${e.toolName}`:`rateLimit:${e.toolName}`,s=await e.store.get(u);return !s||i>=s.resetAt?(await e.store.set(u,{count:1,resetAt:i+o},f),n()):s.count>=a?c(l):(await e.store.set(u,{...s,count:s.count+1},f),n())}let m=`rateLimit:${e.toolName}`,r=e.session.get(m);return !r||i>=r.resetAt?(e.session.set(m,{count:1,resetAt:i+o}),n()):r.count>=a?c(l):(e.session.set(m,{...r,count:r.count+1}),n())}}}export{g as rateLimit};
@@ -1,5 +1,5 @@
1
1
  import { CallToolResult } from '@modelcontextprotocol/sdk/types.js';
2
- import { v as ToolMiddleware } from '../types-DyAOlot0.js';
2
+ import { v as ToolMiddleware } from '../types-P-hHI9qc.js';
3
3
  import 'zod';
4
4
 
5
5
  interface RetryOptions {
@@ -1,4 +1,4 @@
1
- import { v as ToolMiddleware } from '../types-DyAOlot0.js';
1
+ import { v as ToolMiddleware } from '../types-P-hHI9qc.js';
2
2
  import '@modelcontextprotocol/sdk/types.js';
3
3
  import 'zod';
4
4
 
@@ -1,4 +1,4 @@
1
- import { v as ToolMiddleware } from '../types-DyAOlot0.js';
1
+ import { v as ToolMiddleware } from '../types-P-hHI9qc.js';
2
2
  import '@modelcontextprotocol/sdk/types.js';
3
3
  import 'zod';
4
4
 
@@ -1,4 +1,4 @@
1
- import { s as ToolContext, v as ToolMiddleware } from '../types-DyAOlot0.js';
1
+ import { s as ToolContext, v as ToolMiddleware } from '../types-P-hHI9qc.js';
2
2
  import '@modelcontextprotocol/sdk/types.js';
3
3
  import 'zod';
4
4
 
package/dist/store.d.ts CHANGED
@@ -1,4 +1,4 @@
1
- import { n as Store, m as Session, x as UserStore } from './types-DyAOlot0.js';
1
+ import { n as Store, m as Session, x as UserStore } from './types-P-hHI9qc.js';
2
2
  import '@modelcontextprotocol/sdk/types.js';
3
3
  import 'zod';
4
4
 
package/dist/store.mjs CHANGED
@@ -1 +1 @@
1
- export{c as createUserStore,a as memoryStore,b as resolveUserId}from'./chunk-ICQVA5UM.mjs';
1
+ export{c as createUserStore,a as memoryStore,b as resolveUserId}from'./chunk-63JN2KYH.mjs';
package/dist/test.d.ts CHANGED
@@ -1,5 +1,5 @@
1
1
  import { CallToolResult } from '@modelcontextprotocol/sdk/types.js';
2
- import { m as Session, M as MCPServer } from './types-DyAOlot0.js';
2
+ import { m as Session, M as MCPServer } from './types-P-hHI9qc.js';
3
3
  import 'zod';
4
4
 
5
5
  interface TestClient {
@@ -142,7 +142,8 @@ interface ToolMiddleware {
142
142
  name: string;
143
143
  /** Called when a tool is registered. Return false to hide the tool initially. */
144
144
  onRegister?(tool: ToolInfo): boolean | undefined;
145
- /** Called when a tool is invoked. Must call next() to continue the chain. */
145
+ /** Called when a tool is invoked. Must call and return `await next()` to continue the chain.
146
+ * Calling next() without returning its result is undefined behavior. */
146
147
  onCall?(c: ToolContext, next: () => Promise<CallToolResult>): Promise<CallToolResult>;
147
148
  /** Called after the handler returns. Runs in reverse middleware order. */
148
149
  onResult?(result: CallToolResult, c: ToolContext): CallToolResult | Promise<CallToolResult>;
@@ -153,7 +154,7 @@ interface ToolConfig<TInput = unknown> {
153
154
  input?: TInput;
154
155
  }
155
156
  type ToolHandler<TInput = unknown> = (args: InferInput<TInput>, c: ToolContext) => CallToolResult | Promise<CallToolResult>;
156
- /** @experimental */
157
+ /** @experimental Running tasks are fire-and-forget — no graceful shutdown guarantee. */
157
158
  interface TaskConfig<TInput = unknown> {
158
159
  description?: string;
159
160
  input?: TInput;
package/package.json CHANGED
@@ -1,6 +1,6 @@
1
1
  {
2
2
  "name": "@lynq/lynq",
3
- "version": "0.8.0",
3
+ "version": "0.8.2",
4
4
  "description": "Lightweight MCP server framework. Tool visibility control through middleware.",
5
5
  "type": "module",
6
6
  "exports": {
@@ -1 +0,0 @@
1
- function u(){let t=new Map;return {async get(e){let n=t.get(e);if(n){if(n.expiresAt!==void 0&&Date.now()>n.expiresAt){t.delete(e);return}return n.value}},async set(e,n,r){t.set(e,{value:n,expiresAt:r!==void 0?Date.now()+r*1e3:void 0});},async delete(e){t.delete(e);}}}function o(t){let e=t.get("user");if(e){if(typeof e=="string")return e;if(typeof e=="object"&&e!==null){let n=e;if(typeof n.id=="string")return n.id;if(typeof n.id=="number")return String(n.id);if(typeof n.sub=="string")return n.sub}}}function d(t,e){let n=()=>{let r=o(t);if(!r){let s=t.get("user");if(s){let i=typeof s=="object"?JSON.stringify(s):typeof s;throw new Error(`userStore: session has a "user" but could not resolve an ID. Expected: string | { id: string | number } | { sub: string }. Got: ${i}`)}throw new Error("userStore requires a user in session. Call session.set('user', ...) first.")}return r};return {async get(r){return e.get(`user:${n()}:${r}`)},async set(r,s,i){await e.set(`user:${n()}:${r}`,s,i);},async delete(r){await e.delete(`user:${n()}:${r}`);}}}export{u as a,o as b,d as c};