@directive-run/mcp 0.2.2 → 0.2.3
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 +147 -24
- package/dist/cli.js +25 -25
- package/dist/cli.js.map +1 -1
- package/dist/index.cjs +11 -11
- package/dist/index.cjs.map +1 -1
- package/dist/index.js +11 -11
- package/dist/index.js.map +1 -1
- package/package.json +5 -5
package/dist/index.cjs
CHANGED
|
@@ -1,19 +1,19 @@
|
|
|
1
|
-
'use strict';var crypto=require('crypto'),claudePlugin=require('@directive-run/claude-plugin'),knowledge=require('@directive-run/knowledge'),scaffold=require('@directive-run/scaffold'),mcp_js=require('@modelcontextprotocol/sdk/server/mcp.js'),zod=require('zod'),url=require('url'),worker_threads=require('worker_threads'),lint=require('@directive-run/lint'),http=require('http'),sse_js=require('@modelcontextprotocol/sdk/server/sse.js');var f=[{name:"@directive-run/ai",version:"1.17.0",description:"AI guardrails and orchestration for Directive. Prompt injection, PII detection, cost tracking, multi-agent patterns.",homepage:"https://directive.run",keywords:["directive","ai","agents","guardrails","orchestration","llm","constraint-driven","ai-safety","prompt-injection","pii-detection","cost-tracking","multi-agent","openai","anthropic","ollama","gemini"],dependencies:[],peerDependencies:["@directive-run/core"],optionalDependencies:[],exports:[".","./anthropic","./devtools","./evals","./gemini","./guardrails","./mcp","./multi-agent","./ollama","./openai","./predicate","./testing"],directory:"ai",published:true},{name:"@directive-run/claude-plugin",version:"1.17.0",description:"Claude Code plugin for Directive \u2014 12 skills covering modules, constraints, resolvers, derivations, AI orchestration, and adapters. Installable via Claude Code's plugin marketplace or consumable programmatically as an npm package.",homepage:"https://directive.run/docs/ide-integration",keywords:["directive","claude","claude-code","skills","ai-rules","plugin","agents","knowledge"],dependencies:[],peerDependencies:[],optionalDependencies:[],exports:["."],directory:"claude-plugin",published:true},{name:"@directive-run/cli",version:"1.17.0",description:"CLI tools for Directive \u2014 AI coding rules, scaffolding, and more.",homepage:"https://directive.run",keywords:["directive","cli","ai-rules","cursor","copilot","claude","windsurf","cline","llms-txt"],dependencies:["@clack/prompts","@directive-run/knowledge","@directive-run/scaffold","picocolors"],peerDependencies:["@directive-run/timeline"],optionalDependencies:[],exports:[".","./llms.txt"],directory:"cli",published:true},{name:"@directive-run/core",version:"1.17.0",description:"The constraint-driven runtime for TypeScript. Declare what must be true \u2014 the runtime makes it happen.",homepage:"https://directive.run",keywords:["directive","constraint-driven","state-management","constraints","reactive","runtime","typescript","ai-guardrails","zero-dependencies","auto-tracking","framework-agnostic","declarative"],dependencies:[],peerDependencies:[],optionalDependencies:[],exports:[".","./adapter-utils","./internals","./migration","./plugins","./testing","./worker"],directory:"core",published:true},{name:"@directive-run/el",version:"1.1.0",description:"Vanilla DOM adapter for Directive. Typed element creation + reactive bindings + JSX runtime.",homepage:"https://directive.run",keywords:["directive","vanilla","dom","elements","jsx","htm","state-management","reactive","constraint-driven"],dependencies:[],peerDependencies:["@directive-run/core","htm"],optionalDependencies:[],exports:[".","./htm","./jsx-dev-runtime","./jsx-runtime"],directory:"el",published:true},{name:"@directive-run/knowledge",version:"1.17.0",description:"Knowledge files, examples, and validation for Directive \u2014 the constraint-driven TypeScript runtime.",homepage:"https://directive.run",keywords:["directive","knowledge","ai-rules","examples"],dependencies:[],peerDependencies:[],optionalDependencies:[],exports:["."],directory:"knowledge",published:true},{name:"@directive-run/lint",version:"0.1.1",description:"ts-morph-based static analysis for Directive code. Rule registry + executable checks + autofixes. Consumed by @directive-run/mcp (review_source, fix_code tools) and the future `directive doctor lint` CLI command. Anti-pattern data sourced from @directive-run/knowledge so rule IDs stay in lock-step.",homepage:"https://directive.run/docs/ide-integration",keywords:["directive","lint","ast","ts-morph","review","anti-patterns"],dependencies:[],peerDependencies:[],optionalDependencies:["ts-morph"],exports:[".","./worker"],directory:"lint",published:true},{name:"@directive-run/lit",version:"1.17.0",description:"Lit web components adapter for Directive.",homepage:"https://directive.run",keywords:["directive","lit","web-components","state-management","reactive","constraint-driven"],dependencies:[],peerDependencies:["@directive-run/core","lit"],optionalDependencies:[],exports:["."],directory:"lit",published:true},{name:"@directive-run/mcp",version:"0.2.2",description:"Model Context Protocol server that exposes Directive to AI clients \u2014 knowledge files, code examples, and Claude Code skill bundles today, with room to grow into runtime introspection and tooling. stdio for local clients (Claude Desktop, Cursor, MCP Inspector), SSE for hosted deployments at mcp.directive.run.",homepage:"https://directive.run/docs/ide-integration",keywords:["directive","mcp","model-context-protocol","knowledge","ai-rules","sse","stdio"],dependencies:["@directive-run/claude-plugin","@directive-run/knowledge","@directive-run/lint","@directive-run/scaffold","@modelcontextprotocol/sdk","zod"],peerDependencies:[],optionalDependencies:["ts-morph"],exports:["."],directory:"mcp",published:true},{name:"@directive-run/mutator",version:"0.3.1",description:"Discriminated mutation helper for Directive \u2014 collapse the pendingAction ceremony to a typed handler map.",homepage:"https://directive.run",keywords:["directive","mutator","state-management","discriminated-union","optimistic-update"],dependencies:[],peerDependencies:["@directive-run/core"],optionalDependencies:[],exports:["."],directory:"mutator",published:true},{name:"@directive-run/optimistic",version:"0.2.0",description:"Resolver-scope optimistic update + automatic rollback for Directive.",homepage:"https://directive.run",keywords:["directive","optimistic","rollback","snapshot","state-management"],dependencies:[],peerDependencies:["@directive-run/core"],optionalDependencies:[],exports:["."],directory:"optimistic",published:true},{name:"@directive-run/query",version:"1.2.0",description:"Declarative data fetching for Directive. Constraint-driven queries with causal cache invalidation.",homepage:"https://directive.run",keywords:["directive","data-fetching","query","cache","stale-while-revalidate","constraint-driven","reactive","typescript"],dependencies:[],peerDependencies:["@directive-run/core"],optionalDependencies:[],exports:["."],directory:"query",published:true},{name:"@directive-run/react",version:"1.17.0",description:"React hooks and components for Directive.",homepage:"https://directive.run",keywords:["directive","react","hooks","state-management","reactive","constraint-driven"],dependencies:[],peerDependencies:["@directive-run/core","@directive-run/query","react"],optionalDependencies:[],exports:["."],directory:"react",published:true},{name:"@directive-run/scaffold",version:"0.1.0",description:"Pure source-string generators for Directive modules and orchestrators. Shared substrate consumed by @directive-run/cli (its `directive new` command) and @directive-run/mcp (its `generate_module` tool). Zero runtime dependencies.",homepage:"https://directive.run/docs/ide-integration",keywords:["directive","scaffold","codegen","module-generator"],dependencies:[],peerDependencies:[],optionalDependencies:[],exports:["."],directory:"scaffold",published:true},{name:"@directive-run/solid",version:"1.17.0",description:"Solid.js signals adapter for Directive.",homepage:"https://directive.run",keywords:["directive","solid","solidjs","signals","state-management","reactive","constraint-driven"],dependencies:[],peerDependencies:["@directive-run/core","@directive-run/query","solid-js"],optionalDependencies:[],exports:["."],directory:"solid",published:true},{name:"@directive-run/svelte",version:"1.17.0",description:"Svelte stores adapter for Directive.",homepage:"https://directive.run",keywords:["directive","svelte","stores","state-management","reactive","constraint-driven"],dependencies:[],peerDependencies:["@directive-run/core","@directive-run/query","svelte"],optionalDependencies:[],exports:["."],directory:"svelte",published:true},{name:"@directive-run/timeline",version:"0.3.1",description:"Time-travel test REPL for Directive. Auto-renders the causal-graph timeline of any failing test.",homepage:"https://directive.run",keywords:["directive","time-travel","test-debugging","vitest","causal-graph","state-management"],dependencies:[],peerDependencies:["@directive-run/core","vitest"],optionalDependencies:[],exports:[".","./matchers","./reporter"],directory:"timeline",published:true},{name:"@directive-run/vite-plugin-api-proxy",version:"0.1.1",description:"",keywords:[],dependencies:[],peerDependencies:["vite"],optionalDependencies:[],exports:["."],directory:"vite-plugin-api-proxy",published:false},{name:"@directive-run/vue",version:"1.17.0",description:"Vue composition API adapter for Directive.",homepage:"https://directive.run",keywords:["directive","vue","composition-api","state-management","reactive","constraint-driven"],dependencies:[],peerDependencies:["@directive-run/core","@directive-run/query","vue"],optionalDependencies:[],exports:["."],directory:"vue",published:true}],S="2026-06-04T01:56:10.722Z";var _=2e5,D=5e3,Z=/^[\w./-]{1,128}$/,l=class extends Error{constructor(r,i){super(r);this.code=i;}};function T(e){let t=Buffer.byteLength(e.source,"utf8");if(t>_)throw new l(`source is ${t} bytes (max ${_})`,"source-too-large");let r="fileName"in e?e.fileName:void 0;if(r!==void 0&&!Z.test(r))throw new l("invalid fileName","bad-filename")}async function q(){let e=await undefined("@directive-run/lint/worker");return url.fileURLToPath(e)}async function E(e){let t=await q(),r=new worker_threads.Worker(t,{stderr:false}),i=null;try{return await new Promise((n,s)=>{let c=!1;r.once("message",a=>{c=!0,a.ok&&a.result!==void 0?n(a.result):s(new l(a.error??"worker returned without result","worker-error"));}),r.once("error",a=>{c=!0,s(new l(a.message,"worker-error"));}),r.once("exit",a=>{!c&&a!==0&&a!==null&&s(new l(`worker exited with code ${a} before responding`,"worker-error"));}),i=setTimeout(()=>{r.terminate(),s(new l(`parse exceeded ${D}ms budget`,"timeout"));},D),r.postMessage(e);})}finally{i&&clearTimeout(i),await r.terminate().catch(()=>{});}}function $(){return process.env.DIRECTIVE_MCP_USE_LINT_WORKER==="1"}async function R(e){return T(e),$()?E({kind:"run",source:e.source,options:{fileName:e.fileName,ruleFilter:e.ruleFilter}}):lint.runRules(e.source,{fileName:e.fileName,ruleFilter:e.ruleFilter})}async function I(e){return T(e),$()?E({kind:"fix",source:e.source,finding:e.finding}):lint.applyFix(e.source,e.finding)}var Q=3600*1e3,ee=3e3,C=new Map;function P(){return f.map(e=>({name:e.name,summary:e.description,published:e.published}))}async function A(e){let t=f.find(n=>n.name===e);if(!t)return;let{liveVersion:r,stale:i}=await re(t);return te(t,r,i)}function te(e,t,r){return {name:e.name,description:e.description,homepage:e.homepage,keywords:e.keywords,dependencies:e.dependencies,peerDependencies:e.peerDependencies,optionalDependencies:e.optionalDependencies,exports:e.exports,published:e.published,npmUrl:e.published?`https://www.npmjs.com/package/${e.name}`:void 0,bakedVersion:e.version,liveVersion:t,stale:r}}async function re(e){if(!e.published)return {stale:true};let t=C.get(e.name);if(t&&Date.now()-t.fetchedAt<Q)return {liveVersion:t.liveVersion,stale:t.liveVersion===void 0};let r=await ie(e.name);return C.set(e.name,{fetchedAt:Date.now(),liveVersion:r.liveVersion,latest:r.liveVersion,error:r.error}),{liveVersion:r.liveVersion,stale:r.liveVersion===void 0}}async function ie(e){let t=`https://registry.npmjs.org/${encodeURIComponent(e).replace(/%2F/g,"/")}/latest`,r=new AbortController,i=setTimeout(()=>r.abort(),ee);try{let n=await fetch(t,{signal:r.signal});if(!n.ok)return {error:`HTTP ${n.status}`};let s=await n.json();return typeof s.version=="string"?{liveVersion:s.version}:{error:"no version field"}}catch(n){return {error:n.message}}finally{clearTimeout(i);}}var M="0.2.2",U=50,O=200,N=512;function ke(e){return e.length>O?`${e.slice(0,O)}\u2026`:e}function F(e,t,r){let i=e.toLowerCase(),n=[];for(let[s,c]of t){let a=c.split(`
|
|
2
|
-
`);for(let d=0;d<a.length;d++){let p=a[d];if(p.toLowerCase().includes(i)&&(n.push(`${s}${r}:${d+1}: ${
|
|
1
|
+
'use strict';var crypto=require('crypto'),claudePlugin=require('@directive-run/claude-plugin'),knowledge=require('@directive-run/knowledge'),scaffold=require('@directive-run/scaffold'),mcp_js=require('@modelcontextprotocol/sdk/server/mcp.js'),zod=require('zod'),url=require('url'),worker_threads=require('worker_threads'),lint=require('@directive-run/lint'),http=require('http'),sse_js=require('@modelcontextprotocol/sdk/server/sse.js');var f=[{name:"@directive-run/ai",version:"1.17.1",description:"AI guardrails and orchestration for Directive. Prompt injection, PII detection, cost tracking, multi-agent patterns.",homepage:"https://directive.run",keywords:["directive","ai","agents","guardrails","orchestration","llm","constraint-driven","ai-safety","prompt-injection","pii-detection","cost-tracking","multi-agent","openai","anthropic","ollama","gemini"],dependencies:[],peerDependencies:["@directive-run/core"],optionalDependencies:[],exports:[".","./anthropic","./devtools","./evals","./gemini","./guardrails","./mcp","./multi-agent","./ollama","./openai","./predicate","./testing"],directory:"ai",published:true},{name:"@directive-run/claude-plugin",version:"1.17.1",description:"Claude Code plugin for Directive \u2014 12 skills covering modules, constraints, resolvers, derivations, AI orchestration, and adapters. Installable via Claude Code's plugin marketplace or consumable programmatically as an npm package.",homepage:"https://directive.run/docs/ide-integration",keywords:["directive","claude","claude-code","skills","ai-rules","plugin","agents","knowledge"],dependencies:[],peerDependencies:[],optionalDependencies:[],exports:["."],directory:"claude-plugin",published:true},{name:"@directive-run/cli",version:"1.17.1",description:"CLI tools for Directive \u2014 AI coding rules, scaffolding, and more.",homepage:"https://directive.run",keywords:["directive","cli","ai-rules","cursor","copilot","claude","windsurf","cline","llms-txt"],dependencies:["@clack/prompts","@directive-run/knowledge","@directive-run/scaffold","picocolors"],peerDependencies:["@directive-run/timeline"],optionalDependencies:[],exports:[".","./llms.txt"],directory:"cli",published:true},{name:"@directive-run/core",version:"1.17.1",description:"The constraint-driven runtime for TypeScript. Declare what must be true \u2014 the runtime makes it happen.",homepage:"https://directive.run",keywords:["directive","constraint-driven","state-management","constraints","reactive","runtime","typescript","ai-guardrails","zero-dependencies","auto-tracking","framework-agnostic","declarative"],dependencies:[],peerDependencies:[],optionalDependencies:[],exports:[".","./adapter-utils","./internals","./migration","./plugins","./testing","./worker"],directory:"core",published:true},{name:"@directive-run/el",version:"1.1.0",description:"Vanilla DOM adapter for Directive. Typed element creation + reactive bindings + JSX runtime.",homepage:"https://directive.run",keywords:["directive","vanilla","dom","elements","jsx","htm","state-management","reactive","constraint-driven"],dependencies:[],peerDependencies:["@directive-run/core","htm"],optionalDependencies:[],exports:[".","./htm","./jsx-dev-runtime","./jsx-runtime"],directory:"el",published:true},{name:"@directive-run/knowledge",version:"1.17.1",description:"Knowledge files, examples, and validation for Directive \u2014 the constraint-driven TypeScript runtime.",homepage:"https://directive.run",keywords:["directive","knowledge","ai-rules","examples"],dependencies:[],peerDependencies:[],optionalDependencies:[],exports:["."],directory:"knowledge",published:true},{name:"@directive-run/lint",version:"0.1.2",description:"ts-morph-based static analysis for Directive code. Rule registry + executable checks + autofixes. Consumed by @directive-run/mcp (review_source, fix_code tools) and the future `directive doctor lint` CLI command. Anti-pattern data sourced from @directive-run/knowledge so rule IDs stay in lock-step.",homepage:"https://directive.run/docs/ide-integration",keywords:["directive","lint","ast","ts-morph","review","anti-patterns"],dependencies:[],peerDependencies:[],optionalDependencies:["ts-morph"],exports:[".","./executable","./worker"],directory:"lint",published:true},{name:"@directive-run/lit",version:"1.17.1",description:"Lit web components adapter for Directive.",homepage:"https://directive.run",keywords:["directive","lit","web-components","state-management","reactive","constraint-driven"],dependencies:[],peerDependencies:["@directive-run/core","lit"],optionalDependencies:[],exports:["."],directory:"lit",published:true},{name:"@directive-run/mcp",version:"0.2.3",description:"Model Context Protocol server that exposes Directive to AI clients \u2014 knowledge files, code examples, and Claude Code skill bundles today, with room to grow into runtime introspection and tooling. stdio for local clients (Claude Desktop, Cursor, MCP Inspector), SSE for hosted deployments at mcp.directive.run.",homepage:"https://directive.run/docs/ide-integration",keywords:["directive","mcp","model-context-protocol","knowledge","ai-rules","sse","stdio"],dependencies:["@directive-run/claude-plugin","@directive-run/knowledge","@directive-run/lint","@directive-run/scaffold","@modelcontextprotocol/sdk","zod"],peerDependencies:[],optionalDependencies:["ts-morph"],exports:["."],directory:"mcp",published:true},{name:"@directive-run/mutator",version:"0.3.1",description:"Discriminated mutation helper for Directive \u2014 collapse the pendingAction ceremony to a typed handler map.",homepage:"https://directive.run",keywords:["directive","mutator","state-management","discriminated-union","optimistic-update"],dependencies:[],peerDependencies:["@directive-run/core"],optionalDependencies:[],exports:["."],directory:"mutator",published:true},{name:"@directive-run/optimistic",version:"0.2.0",description:"Resolver-scope optimistic update + automatic rollback for Directive.",homepage:"https://directive.run",keywords:["directive","optimistic","rollback","snapshot","state-management"],dependencies:[],peerDependencies:["@directive-run/core"],optionalDependencies:[],exports:["."],directory:"optimistic",published:true},{name:"@directive-run/query",version:"1.2.0",description:"Declarative data fetching for Directive. Constraint-driven queries with causal cache invalidation.",homepage:"https://directive.run",keywords:["directive","data-fetching","query","cache","stale-while-revalidate","constraint-driven","reactive","typescript"],dependencies:[],peerDependencies:["@directive-run/core"],optionalDependencies:[],exports:["."],directory:"query",published:true},{name:"@directive-run/react",version:"1.17.1",description:"React hooks and components for Directive.",homepage:"https://directive.run",keywords:["directive","react","hooks","state-management","reactive","constraint-driven"],dependencies:[],peerDependencies:["@directive-run/core","@directive-run/query","react"],optionalDependencies:[],exports:["."],directory:"react",published:true},{name:"@directive-run/scaffold",version:"0.1.0",description:"Pure source-string generators for Directive modules and orchestrators. Shared substrate consumed by @directive-run/cli (its `directive new` command) and @directive-run/mcp (its `generate_module` tool). Zero runtime dependencies.",homepage:"https://directive.run/docs/ide-integration",keywords:["directive","scaffold","codegen","module-generator"],dependencies:[],peerDependencies:[],optionalDependencies:[],exports:["."],directory:"scaffold",published:true},{name:"@directive-run/solid",version:"1.17.1",description:"Solid.js signals adapter for Directive.",homepage:"https://directive.run",keywords:["directive","solid","solidjs","signals","state-management","reactive","constraint-driven"],dependencies:[],peerDependencies:["@directive-run/core","@directive-run/query","solid-js"],optionalDependencies:[],exports:["."],directory:"solid",published:true},{name:"@directive-run/svelte",version:"1.17.1",description:"Svelte stores adapter for Directive.",homepage:"https://directive.run",keywords:["directive","svelte","stores","state-management","reactive","constraint-driven"],dependencies:[],peerDependencies:["@directive-run/core","@directive-run/query","svelte"],optionalDependencies:[],exports:["."],directory:"svelte",published:true},{name:"@directive-run/timeline",version:"0.3.1",description:"Time-travel test REPL for Directive. Auto-renders the causal-graph timeline of any failing test.",homepage:"https://directive.run",keywords:["directive","time-travel","test-debugging","vitest","causal-graph","state-management"],dependencies:[],peerDependencies:["@directive-run/core","vitest"],optionalDependencies:[],exports:[".","./matchers","./reporter"],directory:"timeline",published:true},{name:"@directive-run/vite-plugin-api-proxy",version:"0.1.1",description:"",keywords:[],dependencies:[],peerDependencies:["vite"],optionalDependencies:[],exports:["."],directory:"vite-plugin-api-proxy",published:false},{name:"@directive-run/vue",version:"1.17.1",description:"Vue composition API adapter for Directive.",homepage:"https://directive.run",keywords:["directive","vue","composition-api","state-management","reactive","constraint-driven"],dependencies:[],peerDependencies:["@directive-run/core","@directive-run/query","vue"],optionalDependencies:[],exports:["."],directory:"vue",published:true}],T="2026-06-04T03:51:34.233Z";var D=2e5,E=5e3,q=/^[\w./-]{1,128}$/,l=class extends Error{constructor(r,i){super(r);this.code=i;}};function $(e){let t=Buffer.byteLength(e.source,"utf8");if(t>D)throw new l(`source is ${t} bytes (max ${D})`,"source-too-large");let r="fileName"in e?e.fileName:void 0;if(r!==void 0&&!q.test(r))throw new l("invalid fileName","bad-filename")}async function Q(){let e=await undefined("@directive-run/lint/worker");return url.fileURLToPath(e)}async function I(e){let t=await Q(),r=new worker_threads.Worker(t,{stderr:false}),i=null;try{return await new Promise((n,s)=>{let c=!1;r.once("message",a=>{c=!0,a.ok&&a.result!==void 0?n(a.result):s(new l(a.error??"worker returned without result","worker-error"));}),r.once("error",a=>{c=!0,s(new l(a.message,"worker-error"));}),r.once("exit",a=>{!c&&a!==0&&a!==null&&s(new l(`worker exited with code ${a} before responding`,"worker-error"));}),i=setTimeout(()=>{r.terminate(),s(new l(`parse exceeded ${E}ms budget`,"timeout"));},E),r.postMessage(e);})}finally{i&&clearTimeout(i),await r.terminate().catch(()=>{});}}function R(){return !(process.env.DIRECTIVE_MCP_USE_LINT_WORKER==="0"||process.env.VITEST==="true")}async function C(e){return $(e),R()?I({kind:"run",source:e.source,options:{fileName:e.fileName,ruleFilter:e.ruleFilter}}):lint.runRules(e.source,{fileName:e.fileName,ruleFilter:e.ruleFilter})}async function P(e){return $(e),R()?I({kind:"fix",source:e.source,finding:e.finding}):lint.applyFix(e.source,e.finding)}var ee=3600*1e3,te=3e3,A=new Map;function y(){return f.map(e=>({name:e.name,summary:e.description,published:e.published}))}async function L(e){let t=f.find(n=>n.name===e);if(!t)return;let{liveVersion:r,stale:i}=await ie(t);return re(t,r,i)}function re(e,t,r){return {name:e.name,description:e.description,homepage:e.homepage,keywords:e.keywords,dependencies:e.dependencies,peerDependencies:e.peerDependencies,optionalDependencies:e.optionalDependencies,exports:e.exports,published:e.published,npmUrl:e.published?`https://www.npmjs.com/package/${e.name}`:void 0,bakedVersion:e.version,liveVersion:t,stale:r}}async function ie(e){if(!e.published)return {stale:true};let t=A.get(e.name);if(t&&Date.now()-t.fetchedAt<ee)return {liveVersion:t.liveVersion,stale:t.liveVersion===void 0};let r=await ne(e.name);return A.set(e.name,{fetchedAt:Date.now(),liveVersion:r.liveVersion,latest:r.liveVersion,error:r.error}),{liveVersion:r.liveVersion,stale:r.liveVersion===void 0}}async function ne(e){let t=`https://registry.npmjs.org/${encodeURIComponent(e).replace(/%2F/g,"/")}/latest`,r=new AbortController,i=setTimeout(()=>r.abort(),te);try{let n=await fetch(t,{signal:r.signal});if(!n.ok)return {error:`HTTP ${n.status}`};let s=await n.json();return typeof s.version=="string"?{liveVersion:s.version}:{error:"no version field"}}catch(n){return {error:n.message}}finally{clearTimeout(i);}}var M="0.2.3",j=50,N=200,F=512;function we(e){return e.length>N?`${e.slice(0,N)}\u2026`:e}function V(e,t,r){let i=e.toLowerCase(),n=[];for(let[s,c]of t){let a=c.split(`
|
|
2
|
+
`);for(let d=0;d<a.length;d++){let p=a[d];if(p.toLowerCase().includes(i)&&(n.push(`${s}${r}:${d+1}: ${we(p)}`),n.length>=j))return n}}return n}function U(e,t){return t.length===0?`No matches for '${e}'.`:`${t.length===j?`${t.length}+ matches (truncated):`:`${t.length} matches:`}
|
|
3
3
|
${t.join(`
|
|
4
|
-
`)}`}var v=null;function
|
|
5
|
-
`)}function
|
|
4
|
+
`)}`}var v=null;function be(){if(v)return v;let e=crypto.createHash("sha256");for(let[t,r]of Array.from(knowledge.getAllKnowledge()).sort(([i],[n])=>i.localeCompare(n)))e.update(t),e.update("\0"),e.update(r),e.update("\0");return v=e.digest("hex").slice(0,16),v}var g={transport:"stdio",authEnabled:false};function G(e){g=e;}function h(e,t,r){r.length!==0&&e.push("",`**${t}:**`,...r.map(i=>`- ${i}`));}function Se(e){let t=[`# ${e.name}`,e.description,"",`**Version (live):** ${e.liveVersion??"unknown"}`,`**Version (baked):** ${e.bakedVersion}${e.stale?" (live fetch failed; using baked)":""}`,`**Published to npm:** ${e.published?"yes":"no (private workspace package)"}`];return e.homepage&&t.push(`**Homepage:** ${e.homepage}`),e.npmUrl&&t.push(`**npm:** ${e.npmUrl}`),h(t,"Dependencies",e.dependencies),h(t,"Peer dependencies",e.peerDependencies),h(t,"Optional dependencies",e.optionalDependencies),h(t,"Exports",e.exports),t.join(`
|
|
5
|
+
`)}function w(){let e=new mcp_js.McpServer({name:"directive",version:M});return e.registerTool("list_knowledge",{title:"List Directive knowledge files",description:"List every knowledge file shipped in @directive-run/knowledge. Returns the file names (without .md) that can be passed to get_knowledge. Covers core docs (engine, facts, constraints, resolvers, derivations, effects, plugins, modules, systems, testing) and AI docs (orchestrator, agents, adapters, guardrails, memory, MCP, RAG, security, evals, budget, multi-agent).",inputSchema:{}},async()=>{let t=knowledge.getAllKnowledge(),r=Array.from(t.keys()).sort();return {content:[{type:"text",text:`${r.length} knowledge files:
|
|
6
6
|
${r.join(`
|
|
7
7
|
`)}`}]}}),e.registerTool("get_knowledge",{title:"Get a Directive knowledge file",description:"Fetch the full Markdown contents of one Directive knowledge file by name. Use list_knowledge first to discover available names. Names match the file stem (e.g. 'constraints', 'ai-orchestrator', 'api-skeleton').",inputSchema:{name:zod.z.string().min(1).describe("The knowledge file name (no .md suffix). Example: 'constraints', 'ai-orchestrator', 'api-skeleton'.")}},async({name:t})=>{let r=knowledge.getKnowledge(t);return r?{content:[{type:"text",text:r}]}:{isError:true,content:[{type:"text",text:`Knowledge file not found: '${t}'. Call list_knowledge to see available names.`}]}}),e.registerTool("list_examples",{title:"List Directive code examples",description:"List every code example shipped in @directive-run/knowledge. Examples are minimal, working TypeScript files demonstrating one concept each. Pass the returned names to get_example.",inputSchema:{}},async()=>{let t=knowledge.getAllExamples(),r=Array.from(t.keys()).sort();return {content:[{type:"text",text:`${r.length} examples:
|
|
8
8
|
${r.join(`
|
|
9
9
|
`)}`}]}}),e.registerTool("get_example",{title:"Get a Directive code example",description:"Fetch the source of one Directive code example by name. Use list_examples first to discover available names. Returns raw TypeScript.",inputSchema:{name:zod.z.string().min(1).describe("The example file name (no .ts suffix). Example: 'basic-module', 'ai-orchestrator'.")}},async({name:t})=>{let r=knowledge.getExample(t);return r?{content:[{type:"text",text:`\`\`\`typescript
|
|
10
10
|
${r}
|
|
11
|
-
\`\`\``}]}:{isError:true,content:[{type:"text",text:`Example not found: '${t}'. Call list_examples to see available names.`}]}}),e.registerTool("search_knowledge",{title:"Search Directive knowledge files",description:"Case-insensitive substring search across every knowledge file. Returns existing reference material; does NOT generate code. Use this to find which knowledge file covers a topic before calling get_knowledge for the full document.",inputSchema:{query:zod.z.string().min(1).max(
|
|
11
|
+
\`\`\``}]}:{isError:true,content:[{type:"text",text:`Example not found: '${t}'. Call list_examples to see available names.`}]}}),e.registerTool("search_knowledge",{title:"Search Directive knowledge files",description:"Case-insensitive substring search across every knowledge file. Returns existing reference material; does NOT generate code. Use this to find which knowledge file covers a topic before calling get_knowledge for the full document.",inputSchema:{query:zod.z.string().min(1).max(F).describe("The search string. Matched case-insensitively against every line of every knowledge file.")}},async({query:t})=>{let r=V(t,knowledge.getAllKnowledge(),".md");return {content:[{type:"text",text:U(t,r)}]}}),e.registerTool("search_examples",{title:"Search Directive code examples",description:"Case-insensitive substring search across every bundled code example (.ts files in @directive-run/knowledge). Returns existing reference material; does NOT generate code. Use this to find which example demonstrates a concept before calling get_example for the full source.",inputSchema:{query:zod.z.string().min(1).max(F).describe("The search string. Matched case-insensitively against every line of every example file.")}},async({query:t})=>{let r=V(t,knowledge.getAllExamples(),".ts");return {content:[{type:"text",text:U(t,r)}]}}),e.registerTool("list_packages",{title:"List @directive-run/* packages",description:"Enumerate every @directive-run/* package known to this MCP server. Returns name + one-line description. Use this to answer 'what should I install for X?' and to discover names to pass to get_package_info or get_composable_packages. Returns existing reference material; does NOT generate code.",inputSchema:{}},async()=>{let t=y(),r=t.map(i=>`${i.name}${i.published?"":" (private)"} \u2014 ${i.summary}`);return {content:[{type:"text",text:`${t.length} packages:
|
|
12
12
|
${r.join(`
|
|
13
|
-
`)}`}]}}),e.registerTool("get_package_info",{title:"Get @directive-run/* package detail",description:"Fetch detailed info for one @directive-run/* package: description, dependencies, peerDependencies, exports, npm URL. Returns the version baked into this MCP build AND the live-from-npm version when available (1-hour cache, 3-second timeout, falls back to baked version on network failure). Returns existing reference material; does NOT generate code.",inputSchema:{name:zod.z.string().min(1).max(128).describe("Package name (e.g. '@directive-run/core'). Call list_packages first to discover valid names.")}},async({name:t})=>{let r=await
|
|
13
|
+
`)}`}]}}),e.registerTool("get_package_info",{title:"Get @directive-run/* package detail",description:"Fetch detailed info for one @directive-run/* package: description, dependencies, peerDependencies, exports, npm URL. Returns the version baked into this MCP build AND the live-from-npm version when available (1-hour cache, 3-second timeout, falls back to baked version on network failure). Returns existing reference material; does NOT generate code.",inputSchema:{name:zod.z.string().min(1).max(128).describe("Package name (e.g. '@directive-run/core'). Call list_packages first to discover valid names.")}},async({name:t})=>{let r=await L(t);return r?{content:[{type:"text",text:Se(r)}]}:{isError:true,content:[{type:"text",text:`Package not found: '${t}'. Call list_packages to see available names.`}]}}),e.registerTool("get_composable_packages",{title:"Get composition siblings for a package",description:"Given a @directive-run/* package name, return the sibling packages it composes with (outgoing edges) AND the packages that compose with IT (incoming edges). Each edge carries a one-line reason. Returns existing reference material; does NOT generate code. Use this to answer 'what should I pair @directive-run/X with?' or 'who else uses @directive-run/Y?'.",inputSchema:{name:zod.z.string().min(1).max(128).describe("Package name (e.g. '@directive-run/query'). Call list_packages first to discover valid names.")}},async({name:t})=>{let r=knowledge.getCompositionsFor(t),i=knowledge.getReverseCompositionsFor(t);if(r.length===0&&i.length===0)return {isError:true,content:[{type:"text",text:y().some(c=>c.name===t)?`NO_COMPOSITIONS: '${t}' is a known package but has no composition edges yet. This is a coverage gap in compositions.json.`:`NOT_FOUND: '${t}' is not a known @directive-run/* package. Call list_packages to see available names.`}]};let n=[`# ${t}`,""];if(r.length>0){n.push("## Composes with:");for(let s of r)n.push(`- ${s.to} \u2014 ${s.reason}`);n.push("");}if(i.length>0){n.push("## Composed by:");for(let s of i)n.push(`- ${s.from} \u2014 ${s.reason}`);}return {content:[{type:"text",text:`<directive-data>
|
|
14
14
|
${n.join(`
|
|
15
15
|
`)}
|
|
16
|
-
</directive-data>`}]}}),e.registerTool("get_server_info",{title:"Get directive MCP server info",description:"Return version manifest for this MCP server build \u2014 package version, transport (stdio or SSE), whether auth is enabled, bundled-knowledge hash, package-registry build timestamp, and (for SSE) the current session count. Returns existing reference material; does NOT generate code. Use this to verify the client is talking to the expected build.",inputSchema:{}},async()=>{let t=[`# @directive-run/mcp@${M}`,`**Transport:** ${g.transport}`,`**Auth enabled:** ${g.authEnabled?"yes":"no"}`,`**Bundled knowledge hash:** ${
|
|
16
|
+
</directive-data>`}]}}),e.registerTool("get_server_info",{title:"Get directive MCP server info",description:"Return version manifest for this MCP server build \u2014 package version, transport (stdio or SSE), whether auth is enabled, bundled-knowledge hash, package-registry build timestamp, and (for SSE) the current session count. Returns existing reference material; does NOT generate code. Use this to verify the client is talking to the expected build.",inputSchema:{}},async()=>{let t=[`# @directive-run/mcp@${M}`,`**Transport:** ${g.transport}`,`**Auth enabled:** ${g.authEnabled?"yes":"no"}`,`**Bundled knowledge hash:** ${be()}`,`**Package registry built at:** ${T}`];return g.sessionCount!==void 0&&t.push(`**Active SSE sessions:** ${g.sessionCount}`),{content:[{type:"text",text:t.join(`
|
|
17
17
|
`)}]}}),e.registerTool("list_module_sections",{title:"List valid module sections for generate_module",description:"Enumerate the valid `sections` values that `generate_module` accepts: derive, events, constraints, resolvers, effects. Call this before generate_module so the section list comes from the server (no hallucination risk). Returns existing reference material; does NOT generate code.",inputSchema:{}},async()=>({content:[{type:"text",text:`${scaffold.MODULE_SECTIONS.length} module sections:
|
|
18
18
|
${scaffold.MODULE_SECTIONS.join(`
|
|
19
19
|
`)}`}]})),e.registerTool("generate_module",{title:"Generate NEW Directive module source code",description:'Generate the source string for a new Directive module or AI orchestrator. Use this when the user wants to CREATE a module, not learn about one. Returns the source as text; never writes to disk \u2014 the caller decides where to put it. Strict regex on `name` (kebab-case, \u226464 chars). For `kind: "module"`, optionally pass `sections` to pick which blocks to include (default: every section). Discover valid section values via list_module_sections.',inputSchema:{name:zod.z.string().min(1).max(64).describe("Kebab-case identifier (e.g. 'traffic-light'). Must start with a lowercase letter and contain only lowercase letters, digits, and hyphens."),kind:zod.z.enum(["module","orchestrator"]).default("module").describe("What to generate. 'module' for a plain Directive module; 'orchestrator' for an AI agent orchestrator module with memory + guardrails scaffolding."),sections:zod.z.array(zod.z.enum(scaffold.MODULE_SECTIONS)).optional().describe("Which module sections to include. Defaults to every section. Only honored when kind === 'module'. Discover valid values via list_module_sections.")}},async({name:t,kind:r,sections:i})=>{let n=scaffold.validateModuleName(t);if(n!==true)return {isError:true,content:[{type:"text",text:`Invalid name '${t}': ${n}`}]};try{let s=r==="orchestrator"?scaffold.generateOrchestrator(t):scaffold.generateModule(t,i??scaffold.MODULE_SECTIONS),{sourceFileName:c,testFileName:a}=scaffold.suggestFileNames(t,r),d=scaffold.requiredPackages(r);return {content:[{type:"text",text:[`// Suggested file: src/${c}`,`// Suggested test: src/${a}`,`// Required packages: ${d.join(", ")}`,`// Run: pnpm add ${d.join(" ")}`,"",s].join(`
|
|
@@ -28,9 +28,9 @@ ${knowledge.MIGRATION_SOURCES.join(`
|
|
|
28
28
|
`)}`}]})),e.registerTool("get_migration_pattern",{title:"Get migration pattern from a state-management library",description:"Fetch the concept-mapping table + step list + before/after exemplars for migrating from a popular state-management library to Directive. Use this when a user asks 'how do I migrate from Redux / Zustand / XState / MobX / Jotai / Recoil'. Returns existing reference material; does NOT generate code.",inputSchema:{source:zod.z.enum(knowledge.MIGRATION_SOURCES).describe("Source library. Discover valid values via list_migration_sources.")}},async({source:t})=>{let r=knowledge.getMigrationPattern(t);return r?{content:[{type:"text",text:`<directive-data>
|
|
29
29
|
${[`# Migrating from ${r.name} to Directive`,"","## Concept map","","| From | To | Note |","|---|---|---|",...r.conceptMap.map(n=>`| ${n.from} | ${n.to} | ${n.note} |`),"","## Steps",...r.steps.map((n,s)=>`${s+1}. ${n}`),"","## Before","```typescript",r.before,"```","","## After","```typescript",r.after,"```"].join(`
|
|
30
30
|
`)}
|
|
31
|
-
</directive-data>`}]}:{isError:true,content:[{type:"text",text:`Migration pattern not found: '${t}'. Call list_migration_sources to see valid values.`}]}}),e.registerTool("review_source",{title:"Review Directive code with ts-morph rules",description:"Run the @directive-run/lint rule registry against a TypeScript source string. Returns structured findings (line, column, severity, message, fixable) for every match. Use this when the user asks 'review this Directive code' or 'lint this'. Source is parsed in a worker thread with a 5-second budget and 200 KB cap.",inputSchema:{source:zod.z.string().min(1).max(2e5).describe("TypeScript source to review. Max 200,000 bytes; longer inputs are rejected pre-parse."),fileName:zod.z.string().regex(/^[\w./-]{1,128}$/).optional().describe("Optional file name shown in findings. Must match /^[\\w./-]{1,128}$/."),ruleFilter:zod.z.array(zod.z.string().max(64)).max(32).optional().describe("Optional whitelist of rule ids to run. Discover valid ids via list_review_rules.")}},async({source:t,fileName:r,ruleFilter:i})=>{try{let n=await
|
|
31
|
+
</directive-data>`}]}:{isError:true,content:[{type:"text",text:`Migration pattern not found: '${t}'. Call list_migration_sources to see valid values.`}]}}),e.registerTool("review_source",{title:"Review Directive code with ts-morph rules",description:"Run the @directive-run/lint rule registry against a TypeScript source string. Returns structured findings (line, column, severity, message, fixable) for every match. Use this when the user asks 'review this Directive code' or 'lint this'. Source is parsed in a worker thread with a 5-second budget and 200 KB cap.",inputSchema:{source:zod.z.string().min(1).max(2e5).describe("TypeScript source to review. Max 200,000 bytes; longer inputs are rejected pre-parse."),fileName:zod.z.string().regex(/^[\w./-]{1,128}$/).optional().describe("Optional file name shown in findings. Must match /^[\\w./-]{1,128}$/."),ruleFilter:zod.z.array(zod.z.string().max(64)).max(32).optional().describe("Optional whitelist of rule ids to run. Discover valid ids via list_review_rules.")}},async({source:t,fileName:r,ruleFilter:i})=>{try{let n=await C({source:t,fileName:r,ruleFilter:i});return {content:[{type:"text",text:`<directive-data>
|
|
32
32
|
${JSON.stringify(n,null,2)}
|
|
33
|
-
</directive-data>`}]}}catch(n){return {isError:true,content:[{type:"text",text:`review_source failed \u2014 ${n instanceof l?`${n.code}: ${n.message}`:n.message}`}]}}}),e.registerTool("fix_code",{title:"Apply a mechanical fix for a Directive review finding",description:"Given a source string and a Finding returned by review_source, run the rule's mechanical fix and return { ok, diff, fixedSource, explanation } \u2014 or { ok: false, reason } when the rule has no fix. Useful for closing the loop: review_source \u2192 user picks \u2192 fix_code. The fixed source is NOT written to disk \u2014 the caller decides.",inputSchema:{source:zod.z.string().min(1).max(2e5).describe("The same source you passed to review_source."),finding:zod.z.object({ruleId:zod.z.string().min(1).max(64),severity:zod.z.enum(["error","warning","info"]),line:zod.z.number().int().nonnegative(),column:zod.z.number().int().nonnegative(),message:zod.z.string(),findingId:zod.z.string(),suggestion:zod.z.string().optional()}).describe("The Finding returned by review_source. Pass the WHOLE object \u2014 the worker uses ruleId + line + column to locate the AST node.")}},async({source:t,finding:r})=>{try{let i=await
|
|
33
|
+
</directive-data>`}]}}catch(n){return {isError:true,content:[{type:"text",text:`review_source failed \u2014 ${n instanceof l?`${n.code}: ${n.message}`:n.message}`}]}}}),e.registerTool("fix_code",{title:"Apply a mechanical fix for a Directive review finding",description:"Given a source string and a Finding returned by review_source, run the rule's mechanical fix and return { ok, diff, fixedSource, explanation } \u2014 or { ok: false, reason } when the rule has no fix. Useful for closing the loop: review_source \u2192 user picks \u2192 fix_code. The fixed source is NOT written to disk \u2014 the caller decides.",inputSchema:{source:zod.z.string().min(1).max(2e5).describe("The same source you passed to review_source."),finding:zod.z.object({ruleId:zod.z.string().min(1).max(64),severity:zod.z.enum(["error","warning","info"]),line:zod.z.number().int().nonnegative(),column:zod.z.number().int().nonnegative(),message:zod.z.string(),findingId:zod.z.string(),suggestion:zod.z.string().optional()}).describe("The Finding returned by review_source. Pass the WHOLE object \u2014 the worker uses ruleId + line + column to locate the AST node.")}},async({source:t,finding:r})=>{try{let i=await P({source:t,finding:r});return {content:[{type:"text",text:`<directive-data>
|
|
34
34
|
${JSON.stringify(i,null,2)}
|
|
35
35
|
</directive-data>`}]}}catch(i){return {isError:true,content:[{type:"text",text:`fix_code failed \u2014 ${i instanceof l?`${i.code}: ${i.message}`:i.message}`}]}}}),e.registerTool("list_skills",{title:"List Directive Claude Code skills",description:"List every skill bundled in @directive-run/claude-plugin. Each skill is a gerund-named bundle of one SKILL.md plus supporting knowledge files. Pass a returned name to get_skill.",inputSchema:{}},async()=>{let t=claudePlugin.getAllSkills(),r=Array.from(t.keys()).sort();return {content:[{type:"text",text:`${r.length} skills:
|
|
36
36
|
${r.join(`
|
|
@@ -42,6 +42,6 @@ ${r.manifest}`];for(let[n,s]of r.files)i.push(`---
|
|
|
42
42
|
|
|
43
43
|
${s}`);return {content:[{type:"text",text:i.join(`
|
|
44
44
|
|
|
45
|
-
`)}]}}),e}var
|
|
46
|
-
exports.createDirectiveServer=
|
|
45
|
+
`)}]}}),e}var B="/messages",H="/sse",De="/healthz",Ee=1e6,$e=64,Ie=300*1e3,Re=3e4,Ce=new Set(["127.0.0.1","localhost","::1","0:0:0:0:0:0:0:1"]),S=class extends Error{};function Pe(e){return Ce.has(e.toLowerCase())}function Ae(e){let t=e.port??3e3,r=e.host??"127.0.0.1",i=e.logger??console,n=e.token??process.env.DIRECTIVE_MCP_TOKEN??void 0;if(!Pe(r)&&!n)throw new S("Public hosts require a token. Pass --token <value> or set DIRECTIVE_MCP_TOKEN, or bind to 127.0.0.1 for local dev.");return {port:t,host:r,logger:i,token:n,allowOrigins:e.allowOrigins??[],bodyLimitBytes:e.bodyLimitBytes??Ee,maxSessions:e.maxSessions??$e,idleTimeoutMs:e.idleTimeoutMs??Ie}}function K(e,t){if(!t)return true;let r=e.headers.authorization;return typeof r!="string"?false:/^Bearer\s+(.+)$/i.exec(r)?.[1]?.trim()===t}function W(e,t){if(t.length===0)return true;let r=e.headers.origin;return typeof r!="string"?false:t.includes(r)}function u(e,t,r,i={}){e.writeHead(t,{"Content-Type":"text/plain",...i}),e.end(r);}function _(e,t){G({transport:"sse",authEnabled:t,sessionCount:e.size});}var b=0;async function Le(e,t,r,i){if(!K(e,i.token)){u(t,401,"unauthorized");return}if(!W(e,i.allowOrigins)){u(t,403,"origin not allowed");return}if(r.size+b>=i.maxSessions){u(t,429,"session cap reached",{"Retry-After":"60"});return}b+=1;let n=false;try{let s=new sse_js.SSEServerTransport(B,t),c=w();r.set(s.sessionId,{transport:s,lastActivity:Date.now()}),n=!0,_(r,!!i.token);let a=()=>{r.delete(s.sessionId),_(r,!!i.token);};t.on("close",a),s.onclose=a,await c.connect(s),i.logger.log(`[directive-mcp] sse session opened: ${s.sessionId}`);}finally{b-=1;}}async function Oe(e,t,r,i,n){if(!K(e,n.token)){u(t,401,"unauthorized");return}if(!W(e,n.allowOrigins)){u(t,403,"origin not allowed");return}let s=Number(e.headers["content-length"]??"0");if(Number.isFinite(s)&&s>n.bodyLimitBytes){u(t,413,`body exceeds ${n.bodyLimitBytes} bytes`);return}let c=r.searchParams.get("sessionId");if(!c){u(t,400,"missing sessionId query parameter");return}let a=i.get(c);if(!a){u(t,404,`unknown session: ${c}`);return}a.lastActivity=Date.now();let d=0,p=false;e.on("data",z=>{d+=Buffer.byteLength(z),d>n.bodyLimitBytes&&!p&&(p=true,u(t,413,`body exceeds ${n.bodyLimitBytes} bytes`),e.destroy());}),!p&&await a.transport.handlePostMessage(e,t);}async function Me(e,t,r,i){let n=new URL(e.url??"/",`http://${e.headers.host??i.host}`);if(e.method==="GET"&&n.pathname===De){t.writeHead(200,{"Content-Type":"text/plain"}),t.end("ok");return}if(e.method==="GET"&&n.pathname===H){await Le(e,t,r,i);return}if(e.method==="POST"&&n.pathname===B){await Oe(e,t,n,r,i);return}u(t,404,"not found");}function Ne(e,t){return setInterval(()=>{let r=Date.now();for(let[i,n]of e)r-n.lastActivity>t.idleTimeoutMs&&(e.delete(i),n.transport.close().catch(()=>{}),_(e,!!t.token),t.logger.log(`[directive-mcp] pruned idle session: ${i}`));},Re).unref()}async function Fe(e={}){let t=Ae(e),r=new Map,i=http.createServer(async(s,c)=>{try{await Me(s,c,r,t);}catch(a){t.logger.error("[directive-mcp] request error:",a),c.headersSent||c.writeHead(500,{"Content-Type":"text/plain"}),c.end("internal server error");}}),n=Ne(r,t);return i.on("close",()=>{clearInterval(n);}),await new Promise(s=>{i.listen(t.port,t.host,()=>{t.logger.log(`[directive-mcp] sse server listening at http://${t.host}:${t.port}${H}${t.token?" (auth: bearer-token)":" (auth: none, loopback only)"}`),s();});}),i}
|
|
46
|
+
exports.createDirectiveServer=w;exports.startSseServer=Fe;//# sourceMappingURL=index.cjs.map
|
|
47
47
|
//# sourceMappingURL=index.cjs.map
|