callspec 0.1.0
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/LICENSE +21 -0
- package/README.md +170 -0
- package/assets/callsheet-chirp-demo.png +0 -0
- package/assets/callspec-lockup-dark.svg +11 -0
- package/assets/callspec-lockup-light.svg +11 -0
- package/assets/callspec-mark-dark.svg +10 -0
- package/assets/callspec-mark-light.svg +10 -0
- package/assets/chirp/mark-dark.svg +7 -0
- package/assets/chirp/mark.png +0 -0
- package/assets/chirp/mark.svg +7 -0
- package/assets/chirp/mark@2x.png +0 -0
- package/dist/callsheet/branding.d.ts +33 -0
- package/dist/callsheet/branding.js +2 -0
- package/dist/callsheet/index.d.ts +4 -0
- package/dist/callsheet/index.js +8 -0
- package/dist/callsheet/mountCallsheet.d.ts +22 -0
- package/dist/callsheet/mountCallsheet.js +62 -0
- package/dist/callsheet/parseOpenApi.d.ts +17 -0
- package/dist/callsheet/parseOpenApi.js +58 -0
- package/dist/callsheet/ui/assets/app.js +226 -0
- package/dist/callsheet/ui/assets/callspec-mark-dark.svg +10 -0
- package/dist/callsheet/ui/assets/callspec-mark-light.svg +10 -0
- package/dist/callsheet/ui/assets/style.css +2 -0
- package/dist/callsheet/ui/index.html +25 -0
- package/dist/client.d.ts +15 -0
- package/dist/client.js +49 -0
- package/dist/defineRegistry.d.ts +3 -0
- package/dist/defineRegistry.js +11 -0
- package/dist/defineRoute.d.ts +9 -0
- package/dist/defineRoute.js +16 -0
- package/dist/errors.d.ts +10 -0
- package/dist/errors.js +25 -0
- package/dist/executeRoute.d.ts +2 -0
- package/dist/executeRoute.js +16 -0
- package/dist/index.d.ts +17 -0
- package/dist/index.js +29 -0
- package/dist/mcpTools.d.ts +14 -0
- package/dist/mcpTools.js +41 -0
- package/dist/mountMcp.d.ts +13 -0
- package/dist/mountMcp.js +100 -0
- package/dist/mountRegistry.d.ts +32 -0
- package/dist/mountRegistry.js +88 -0
- package/dist/openapi.d.ts +8 -0
- package/dist/openapi.js +56 -0
- package/dist/serializer.d.ts +2 -0
- package/dist/serializer.js +45 -0
- package/dist/types.d.ts +35 -0
- package/dist/types.js +2 -0
- package/package.json +77 -0
|
@@ -0,0 +1,226 @@
|
|
|
1
|
+
(function(){var e=Object.create,t=Object.defineProperty,n=Object.getOwnPropertyDescriptor,r=Object.getOwnPropertyNames,i=Object.getPrototypeOf,a=Object.prototype.hasOwnProperty,o=(e,t)=>()=>(t||(e((t={exports:{}}).exports,t),e=null),t.exports),s=(e,i,o,s)=>{if(i&&typeof i==`object`||typeof i==`function`)for(var c=r(i),l=0,u=c.length,d;l<u;l++)d=c[l],!a.call(e,d)&&d!==o&&t(e,d,{get:(e=>i[e]).bind(null,d),enumerable:!(s=n(i,d))||s.enumerable});return e},c=((n,r,a)=>(a=n==null?{}:e(i(n)),s(r||!n||!n.__esModule?t(a,`default`,{value:n,enumerable:!0}):a,n)))(o(((e,t)=>{function n(e){return e instanceof Map?e.clear=e.delete=e.set=function(){throw Error(`map is read-only`)}:e instanceof Set&&(e.add=e.clear=e.delete=function(){throw Error(`set is read-only`)}),Object.freeze(e),Object.getOwnPropertyNames(e).forEach(t=>{let r=e[t],i=typeof r;(i===`object`||i===`function`)&&!Object.isFrozen(r)&&n(r)}),e}var r=class{constructor(e){e.data===void 0&&(e.data={}),this.data=e.data,this.isMatchIgnored=!1}ignoreMatch(){this.isMatchIgnored=!0}};function i(e){return e.replace(/&/g,`&`).replace(/</g,`<`).replace(/>/g,`>`).replace(/"/g,`"`).replace(/'/g,`'`)}function a(e,...t){let n=Object.create(null);for(let t in e)n[t]=e[t];return t.forEach(function(e){for(let t in e)n[t]=e[t]}),n}var o=`</span>`,s=e=>!!e.scope,c=(e,{prefix:t})=>{if(e.startsWith(`language:`))return e.replace(`language:`,`language-`);if(e.includes(`.`)){let n=e.split(`.`);return[`${t}${n.shift()}`,...n.map((e,t)=>`${e}${`_`.repeat(t+1)}`)].join(` `)}return`${t}${e}`},l=class{constructor(e,t){this.buffer=``,this.classPrefix=t.classPrefix,e.walk(this)}addText(e){this.buffer+=i(e)}openNode(e){if(!s(e))return;let t=c(e.scope,{prefix:this.classPrefix});this.span(t)}closeNode(e){s(e)&&(this.buffer+=o)}value(){return this.buffer}span(e){this.buffer+=`<span class="${e}">`}},u=(e={})=>{let t={children:[]};return Object.assign(t,e),t},d=class e{constructor(){this.rootNode=u(),this.stack=[this.rootNode]}get top(){return this.stack[this.stack.length-1]}get root(){return this.rootNode}add(e){this.top.children.push(e)}openNode(e){let t=u({scope:e});this.add(t),this.stack.push(t)}closeNode(){if(this.stack.length>1)return this.stack.pop()}closeAllNodes(){for(;this.closeNode(););}toJSON(){return JSON.stringify(this.rootNode,null,4)}walk(e){return this.constructor._walk(e,this.rootNode)}static _walk(e,t){return typeof t==`string`?e.addText(t):t.children&&(e.openNode(t),t.children.forEach(t=>this._walk(e,t)),e.closeNode(t)),e}static _collapse(t){typeof t!=`string`&&t.children&&(t.children.every(e=>typeof e==`string`)?t.children=[t.children.join(``)]:t.children.forEach(t=>{e._collapse(t)}))}},f=class extends d{constructor(e){super(),this.options=e}addText(e){e!==``&&this.add(e)}startScope(e){this.openNode(e)}endScope(){this.closeNode()}__addSublanguage(e,t){let n=e.root;t&&(n.scope=`language:${t}`),this.add(n)}toHTML(){return new l(this,this.options).value()}finalize(){return this.closeAllNodes(),!0}};function p(e){return e?typeof e==`string`?e:e.source:null}function m(e){return _(`(?=`,e,`)`)}function h(e){return _(`(?:`,e,`)*`)}function g(e){return _(`(?:`,e,`)?`)}function _(...e){return e.map(e=>p(e)).join(``)}function v(e){let t=e[e.length-1];return typeof t==`object`&&t.constructor===Object?(e.splice(e.length-1,1),t):{}}function y(...e){return`(`+(v(e).capture?``:`?:`)+e.map(e=>p(e)).join(`|`)+`)`}function b(e){return RegExp(e.toString()+`|`).exec(``).length-1}function ee(e,t){let n=e&&e.exec(t);return n&&n.index===0}var x=/\[(?:[^\\\]]|\\.)*\]|\(\??|\\([1-9][0-9]*)|\\./;function S(e,{joinWith:t}){let n=0;return e.map(e=>{n+=1;let t=n,r=p(e),i=``;for(;r.length>0;){let e=x.exec(r);if(!e){i+=r;break}i+=r.substring(0,e.index),r=r.substring(e.index+e[0].length),e[0][0]===`\\`&&e[1]?i+=`\\`+String(Number(e[1])+t):(i+=e[0],e[0]===`(`&&n++)}return i}).map(e=>`(${e})`).join(t)}var C=/\b\B/,w=`[a-zA-Z]\\w*`,T=`[a-zA-Z_]\\w*`,E=`\\b\\d+(\\.\\d+)?`,D=`(-?)(\\b0[xX][a-fA-F0-9]+|(\\b\\d+(\\.\\d*)?|\\.\\d+)([eE][-+]?\\d+)?)`,O=`\\b(0b[01]+)`,k=`!|!=|!==|%|%=|&|&&|&=|\\*|\\*=|\\+|\\+=|,|-|-=|/=|/|:|;|<<|<<=|<=|<|===|==|=|>>>=|>>=|>=|>>>|>>|>|\\?|\\[|\\{|\\(|\\^|\\^=|\\||\\|=|\\|\\||~`,A=(e={})=>{let t=/^#![ ]*\//;return e.binary&&(e.begin=_(t,/.*\b/,e.binary,/\b.*/)),a({scope:`meta`,begin:t,end:/$/,relevance:0,"on:begin":(e,t)=>{e.index!==0&&t.ignoreMatch()}},e)},j={begin:`\\\\[\\s\\S]`,relevance:0},M={scope:`string`,begin:`'`,end:`'`,illegal:`\\n`,contains:[j]},N={scope:`string`,begin:`"`,end:`"`,illegal:`\\n`,contains:[j]},P={begin:/\b(a|an|the|are|I'm|isn't|don't|doesn't|won't|but|just|should|pretty|simply|enough|gonna|going|wtf|so|such|will|you|your|they|like|more)\b/},F=function(e,t,n={}){let r=a({scope:`comment`,begin:e,end:t,contains:[]},n);r.contains.push({scope:`doctag`,begin:`[ ]*(?=(TODO|FIXME|NOTE|BUG|OPTIMIZE|HACK|XXX):)`,end:/(TODO|FIXME|NOTE|BUG|OPTIMIZE|HACK|XXX):/,excludeBegin:!0,relevance:0});let i=y(`I`,`a`,`is`,`so`,`us`,`to`,`at`,`if`,`in`,`it`,`on`,/[A-Za-z]+['](d|ve|re|ll|t|s|n)/,/[A-Za-z]+[-][a-z]+/,/[A-Za-z][a-z]{2,}/);return r.contains.push({begin:_(/[ ]+/,`(`,i,/[.]?[:]?([.][ ]|[ ])/,`){3}`)}),r},I=F(`//`,`$`),L=F(`/\\*`,`\\*/`),R=F(`#`,`$`),z=Object.freeze({__proto__:null,APOS_STRING_MODE:M,BACKSLASH_ESCAPE:j,BINARY_NUMBER_MODE:{scope:`number`,begin:O,relevance:0},BINARY_NUMBER_RE:O,COMMENT:F,C_BLOCK_COMMENT_MODE:L,C_LINE_COMMENT_MODE:I,C_NUMBER_MODE:{scope:`number`,begin:D,relevance:0},C_NUMBER_RE:D,END_SAME_AS_BEGIN:function(e){return Object.assign(e,{"on:begin":(e,t)=>{t.data._beginMatch=e[1]},"on:end":(e,t)=>{t.data._beginMatch!==e[1]&&t.ignoreMatch()}})},HASH_COMMENT_MODE:R,IDENT_RE:w,MATCH_NOTHING_RE:C,METHOD_GUARD:{begin:`\\.\\s*[a-zA-Z_]\\w*`,relevance:0},NUMBER_MODE:{scope:`number`,begin:E,relevance:0},NUMBER_RE:E,PHRASAL_WORDS_MODE:P,QUOTE_STRING_MODE:N,REGEXP_MODE:{scope:`regexp`,begin:/\/(?=[^/\n]*\/)/,end:/\/[gimuy]*/,contains:[j,{begin:/\[/,end:/\]/,relevance:0,contains:[j]}]},RE_STARTERS_RE:k,SHEBANG:A,TITLE_MODE:{scope:`title`,begin:w,relevance:0},UNDERSCORE_IDENT_RE:T,UNDERSCORE_TITLE_MODE:{scope:`title`,begin:T,relevance:0}});function B(e,t){e.input[e.index-1]===`.`&&t.ignoreMatch()}function te(e,t){e.className!==void 0&&(e.scope=e.className,delete e.className)}function ne(e,t){t&&e.beginKeywords&&(e.begin=`\\b(`+e.beginKeywords.split(` `).join(`|`)+`)(?!\\.)(?=\\b|\\s)`,e.__beforeBegin=B,e.keywords=e.keywords||e.beginKeywords,delete e.beginKeywords,e.relevance===void 0&&(e.relevance=0))}function V(e,t){Array.isArray(e.illegal)&&(e.illegal=y(...e.illegal))}function H(e,t){if(e.match){if(e.begin||e.end)throw Error(`begin & end are not supported with match`);e.begin=e.match,delete e.match}}function U(e,t){e.relevance===void 0&&(e.relevance=1)}var re=(e,t)=>{if(!e.beforeMatch)return;if(e.starts)throw Error(`beforeMatch cannot be used with starts`);let n=Object.assign({},e);Object.keys(e).forEach(t=>{delete e[t]}),e.keywords=n.keywords,e.begin=_(n.beforeMatch,m(n.begin)),e.starts={relevance:0,contains:[Object.assign(n,{endsParent:!0})]},e.relevance=0,delete n.beforeMatch},W=[`of`,`and`,`for`,`in`,`not`,`or`,`if`,`then`,`parent`,`list`,`value`],ie=`keyword`;function G(e,t,n=ie){let r=Object.create(null);return typeof e==`string`?i(n,e.split(` `)):Array.isArray(e)?i(n,e):Object.keys(e).forEach(function(n){Object.assign(r,G(e[n],t,n))}),r;function i(e,n){t&&(n=n.map(e=>e.toLowerCase())),n.forEach(function(t){let n=t.split(`|`);r[n[0]]=[e,ae(n[0],n[1])]})}}function ae(e,t){return t?Number(t):+!K(e)}function K(e){return W.includes(e.toLowerCase())}var q={},J=e=>{console.error(e)},Y=(e,...t)=>{console.log(`WARN: ${e}`,...t)},X=(e,t)=>{q[`${e}/${t}`]||(console.log(`Deprecated as of ${e}. ${t}`),q[`${e}/${t}`]=!0)},Z=Error();function Q(e,t,{key:n}){let r=0,i=e[n],a={},o={};for(let e=1;e<=t.length;e++)o[e+r]=i[e],a[e+r]=!0,r+=b(t[e-1]);e[n]=o,e[n]._emit=a,e[n]._multi=!0}function oe(e){if(Array.isArray(e.begin)){if(e.skip||e.excludeBegin||e.returnBegin)throw J(`skip, excludeBegin, returnBegin not compatible with beginScope: {}`),Z;if(typeof e.beginScope!=`object`||e.beginScope===null)throw J(`beginScope must be object`),Z;Q(e,e.begin,{key:`beginScope`}),e.begin=S(e.begin,{joinWith:``})}}function se(e){if(Array.isArray(e.end)){if(e.skip||e.excludeEnd||e.returnEnd)throw J(`skip, excludeEnd, returnEnd not compatible with endScope: {}`),Z;if(typeof e.endScope!=`object`||e.endScope===null)throw J(`endScope must be object`),Z;Q(e,e.end,{key:`endScope`}),e.end=S(e.end,{joinWith:``})}}function ce(e){e.scope&&typeof e.scope==`object`&&e.scope!==null&&(e.beginScope=e.scope,delete e.scope)}function le(e){ce(e),typeof e.beginScope==`string`&&(e.beginScope={_wrap:e.beginScope}),typeof e.endScope==`string`&&(e.endScope={_wrap:e.endScope}),oe(e),se(e)}function ue(e){function t(t,n){return new RegExp(p(t),`m`+(e.case_insensitive?`i`:``)+(e.unicodeRegex?`u`:``)+(n?`g`:``))}class n{constructor(){this.matchIndexes={},this.regexes=[],this.matchAt=1,this.position=0}addRule(e,t){t.position=this.position++,this.matchIndexes[this.matchAt]=t,this.regexes.push([t,e]),this.matchAt+=b(e)+1}compile(){this.regexes.length===0&&(this.exec=()=>null);let e=this.regexes.map(e=>e[1]);this.matcherRe=t(S(e,{joinWith:`|`}),!0),this.lastIndex=0}exec(e){this.matcherRe.lastIndex=this.lastIndex;let t=this.matcherRe.exec(e);if(!t)return null;let n=t.findIndex((e,t)=>t>0&&e!==void 0),r=this.matchIndexes[n];return t.splice(0,n),Object.assign(t,r)}}class r{constructor(){this.rules=[],this.multiRegexes=[],this.count=0,this.lastIndex=0,this.regexIndex=0}getMatcher(e){if(this.multiRegexes[e])return this.multiRegexes[e];let t=new n;return this.rules.slice(e).forEach(([e,n])=>t.addRule(e,n)),t.compile(),this.multiRegexes[e]=t,t}resumingScanAtSamePosition(){return this.regexIndex!==0}considerAll(){this.regexIndex=0}addRule(e,t){this.rules.push([e,t]),t.type===`begin`&&this.count++}exec(e){let t=this.getMatcher(this.regexIndex);t.lastIndex=this.lastIndex;let n=t.exec(e);if(this.resumingScanAtSamePosition()&&!(n&&n.index===this.lastIndex)){let t=this.getMatcher(0);t.lastIndex=this.lastIndex+1,n=t.exec(e)}return n&&(this.regexIndex+=n.position+1,this.regexIndex===this.count&&this.considerAll()),n}}function i(e){let t=new r;return e.contains.forEach(e=>t.addRule(e.begin,{rule:e,type:`begin`})),e.terminatorEnd&&t.addRule(e.terminatorEnd,{type:`end`}),e.illegal&&t.addRule(e.illegal,{type:`illegal`}),t}function o(n,r){let a=n;if(n.isCompiled)return a;[te,H,le,re].forEach(e=>e(n,r)),e.compilerExtensions.forEach(e=>e(n,r)),n.__beforeBegin=null,[ne,V,U].forEach(e=>e(n,r)),n.isCompiled=!0;let s=null;return typeof n.keywords==`object`&&n.keywords.$pattern&&(n.keywords=Object.assign({},n.keywords),s=n.keywords.$pattern,delete n.keywords.$pattern),s||=/\w+/,n.keywords&&=G(n.keywords,e.case_insensitive),a.keywordPatternRe=t(s,!0),r&&(n.begin||=/\B|\b/,a.beginRe=t(a.begin),!n.end&&!n.endsWithParent&&(n.end=/\B|\b/),n.end&&(a.endRe=t(a.end)),a.terminatorEnd=p(a.end)||``,n.endsWithParent&&r.terminatorEnd&&(a.terminatorEnd+=(n.end?`|`:``)+r.terminatorEnd)),n.illegal&&(a.illegalRe=t(n.illegal)),n.contains||=[],n.contains=[].concat(...n.contains.map(function(e){return fe(e===`self`?n:e)})),n.contains.forEach(function(e){o(e,a)}),n.starts&&o(n.starts,r),a.matcher=i(a),a}if(e.compilerExtensions||=[],e.contains&&e.contains.includes(`self`))throw Error("ERR: contains `self` is not supported at the top-level of a language. See documentation.");return e.classNameAliases=a(e.classNameAliases||{}),o(e)}function de(e){return e?e.endsWithParent||de(e.starts):!1}function fe(e){return e.variants&&!e.cachedVariants&&(e.cachedVariants=e.variants.map(function(t){return a(e,{variants:null},t)})),e.cachedVariants?e.cachedVariants:de(e)?a(e,{starts:e.starts?a(e.starts):null}):Object.isFrozen(e)?a(e):e}var pe=`11.11.1`,me=class extends Error{constructor(e,t){super(e),this.name=`HTMLInjectionError`,this.html=t}},he=i,ge=a,_e=Symbol(`nomatch`),ve=7,ye=function(e){let t=Object.create(null),i=Object.create(null),a=[],o=!0,s=`Could not find the language '{}', did you forget to load/include a language module?`,c={disableAutodetect:!0,name:`Plain text`,contains:[]},l={ignoreUnescapedHTML:!1,throwUnescapedHTML:!1,noHighlightRe:/^(no-?highlight)$/i,languageDetectRe:/\blang(?:uage)?-([\w-]+)\b/i,classPrefix:`hljs-`,cssSelector:`pre code`,languages:null,__emitter:f};function u(e){return l.noHighlightRe.test(e)}function d(e){let t=e.className+` `;t+=e.parentNode?e.parentNode.className:``;let n=l.languageDetectRe.exec(t);if(n){let t=M(n[1]);return t||(Y(s.replace(`{}`,n[1])),Y(`Falling back to no-highlight mode for this block.`,e)),t?n[1]:`no-highlight`}return t.split(/\s+/).find(e=>u(e)||M(e))}function p(e,t,n){let r=``,i=``;typeof t==`object`?(r=e,n=t.ignoreIllegals,i=t.language):(X(`10.7.0`,`highlight(lang, code, ...args) has been deprecated.`),X(`10.7.0`,`Please use highlight(code, options) instead.
|
|
2
|
+
https://github.com/highlightjs/highlight.js/issues/2277`),i=e,r=t),n===void 0&&(n=!0);let a={code:r,language:i};R(`before:highlight`,a);let o=a.result?a.result:v(a.language,a.code,n);return o.code=a.code,R(`after:highlight`,o),o}function v(e,n,i,a){let c=Object.create(null);function u(e,t){return e.keywords[t]}function d(){if(!k.keywords){j.addText(N);return}let e=0;k.keywordPatternRe.lastIndex=0;let t=k.keywordPatternRe.exec(N),n=``;for(;t;){n+=N.substring(e,t.index);let r=E.case_insensitive?t[0].toLowerCase():t[0],i=u(k,r);if(i){let[e,a]=i;if(j.addText(n),n=``,c[r]=(c[r]||0)+1,c[r]<=ve&&(P+=a),e.startsWith(`_`))n+=t[0];else{let n=E.classNameAliases[e]||e;m(t[0],n)}}else n+=t[0];e=k.keywordPatternRe.lastIndex,t=k.keywordPatternRe.exec(N)}n+=N.substring(e),j.addText(n)}function f(){if(N===``)return;let e=null;if(typeof k.subLanguage==`string`){if(!t[k.subLanguage]){j.addText(N);return}e=v(k.subLanguage,N,!0,A[k.subLanguage]),A[k.subLanguage]=e._top}else e=x(N,k.subLanguage.length?k.subLanguage:null);k.relevance>0&&(P+=e.relevance),j.__addSublanguage(e._emitter,e.language)}function p(){k.subLanguage==null?d():f(),N=``}function m(e,t){e!==``&&(j.startScope(t),j.addText(e),j.endScope())}function h(e,t){let n=1,r=t.length-1;for(;n<=r;){if(!e._emit[n]){n++;continue}let r=E.classNameAliases[e[n]]||e[n],i=t[n];r?m(i,r):(N=i,d(),N=``),n++}}function g(e,t){return e.scope&&typeof e.scope==`string`&&j.openNode(E.classNameAliases[e.scope]||e.scope),e.beginScope&&(e.beginScope._wrap?(m(N,E.classNameAliases[e.beginScope._wrap]||e.beginScope._wrap),N=``):e.beginScope._multi&&(h(e.beginScope,t),N=``)),k=Object.create(e,{parent:{value:k}}),k}function _(e,t,n){let i=ee(e.endRe,n);if(i){if(e[`on:end`]){let n=new r(e);e[`on:end`](t,n),n.isMatchIgnored&&(i=!1)}if(i){for(;e.endsParent&&e.parent;)e=e.parent;return e}}if(e.endsWithParent)return _(e.parent,t,n)}function y(e){return k.matcher.regexIndex===0?(N+=e[0],1):(L=!0,0)}function b(e){let t=e[0],n=e.rule,i=new r(n),a=[n.__beforeBegin,n[`on:begin`]];for(let n of a)if(n&&(n(e,i),i.isMatchIgnored))return y(t);return n.skip?N+=t:(n.excludeBegin&&(N+=t),p(),!n.returnBegin&&!n.excludeBegin&&(N=t)),g(n,e),n.returnBegin?0:t.length}function S(e){let t=e[0],r=n.substring(e.index),i=_(k,e,r);if(!i)return _e;let a=k;k.endScope&&k.endScope._wrap?(p(),m(t,k.endScope._wrap)):k.endScope&&k.endScope._multi?(p(),h(k.endScope,e)):a.skip?N+=t:(a.returnEnd||a.excludeEnd||(N+=t),p(),a.excludeEnd&&(N=t));do k.scope&&j.closeNode(),!k.skip&&!k.subLanguage&&(P+=k.relevance),k=k.parent;while(k!==i.parent);return i.starts&&g(i.starts,e),a.returnEnd?0:t.length}function C(){let e=[];for(let t=k;t!==E;t=t.parent)t.scope&&e.unshift(t.scope);e.forEach(e=>j.openNode(e))}let w={};function T(t,r){let a=r&&r[0];if(N+=t,a==null)return p(),0;if(w.type===`begin`&&r.type===`end`&&w.index===r.index&&a===``){if(N+=n.slice(r.index,r.index+1),!o){let t=Error(`0 width match regex (${e})`);throw t.languageName=e,t.badRule=w.rule,t}return 1}if(w=r,r.type===`begin`)return b(r);if(r.type===`illegal`&&!i){let e=Error(`Illegal lexeme "`+a+`" for mode "`+(k.scope||`<unnamed>`)+`"`);throw e.mode=k,e}else if(r.type===`end`){let e=S(r);if(e!==_e)return e}if(r.type===`illegal`&&a===``)return N+=`
|
|
3
|
+
`,1;if(I>1e5&&I>r.index*3)throw Error(`potential infinite loop, way more iterations than matches`);return N+=a,a.length}let E=M(e);if(!E)throw J(s.replace(`{}`,e)),Error(`Unknown language: "`+e+`"`);let D=ue(E),O=``,k=a||D,A={},j=new l.__emitter(l);C();let N=``,P=0,F=0,I=0,L=!1;try{if(E.__emitTokens)E.__emitTokens(n,j);else{for(k.matcher.considerAll();;){I++,L?L=!1:k.matcher.considerAll(),k.matcher.lastIndex=F;let e=k.matcher.exec(n);if(!e)break;let t=T(n.substring(F,e.index),e);F=e.index+t}T(n.substring(F))}return j.finalize(),O=j.toHTML(),{language:e,value:O,relevance:P,illegal:!1,_emitter:j,_top:k}}catch(t){if(t.message&&t.message.includes(`Illegal`))return{language:e,value:he(n),illegal:!0,relevance:0,_illegalBy:{message:t.message,index:F,context:n.slice(F-100,F+100),mode:t.mode,resultSoFar:O},_emitter:j};if(o)return{language:e,value:he(n),illegal:!1,relevance:0,errorRaised:t,_emitter:j,_top:k};throw t}}function b(e){let t={value:he(e),illegal:!1,relevance:0,_top:c,_emitter:new l.__emitter(l)};return t._emitter.addText(e),t}function x(e,n){n=n||l.languages||Object.keys(t);let r=b(e),i=n.filter(M).filter(P).map(t=>v(t,e,!1));i.unshift(r);let[a,o]=i.sort((e,t)=>{if(e.relevance!==t.relevance)return t.relevance-e.relevance;if(e.language&&t.language){if(M(e.language).supersetOf===t.language)return 1;if(M(t.language).supersetOf===e.language)return-1}return 0}),s=a;return s.secondBest=o,s}function S(e,t,n){let r=t&&i[t]||n;e.classList.add(`hljs`),e.classList.add(`language-${r}`)}function C(e){let t=null,n=d(e);if(u(n))return;if(R(`before:highlightElement`,{el:e,language:n}),e.dataset.highlighted){console.log("Element previously highlighted. To highlight again, first unset `dataset.highlighted`.",e);return}if(e.children.length>0&&(l.ignoreUnescapedHTML||(console.warn(`One of your code blocks includes unescaped HTML. This is a potentially serious security risk.`),console.warn(`https://github.com/highlightjs/highlight.js/wiki/security`),console.warn(`The element with unescaped HTML:`),console.warn(e)),l.throwUnescapedHTML))throw new me(`One of your code blocks includes unescaped HTML.`,e.innerHTML);t=e;let r=t.textContent,i=n?p(r,{language:n,ignoreIllegals:!0}):x(r);e.innerHTML=i.value,e.dataset.highlighted=`yes`,S(e,n,i.language),e.result={language:i.language,re:i.relevance,relevance:i.relevance},i.secondBest&&(e.secondBest={language:i.secondBest.language,relevance:i.secondBest.relevance}),R(`after:highlightElement`,{el:e,result:i,text:r})}function w(e){l=ge(l,e)}let T=()=>{O(),X(`10.6.0`,`initHighlighting() deprecated. Use highlightAll() now.`)};function E(){O(),X(`10.6.0`,`initHighlightingOnLoad() deprecated. Use highlightAll() now.`)}let D=!1;function O(){function e(){O()}if(document.readyState===`loading`){D||window.addEventListener(`DOMContentLoaded`,e,!1),D=!0;return}document.querySelectorAll(l.cssSelector).forEach(C)}function k(n,r){let i=null;try{i=r(e)}catch(e){if(J(`Language definition for '{}' could not be registered.`.replace(`{}`,n)),o)J(e);else throw e;i=c}i.name||=n,t[n]=i,i.rawDefinition=r.bind(null,e),i.aliases&&N(i.aliases,{languageName:n})}function A(e){delete t[e];for(let t of Object.keys(i))i[t]===e&&delete i[t]}function j(){return Object.keys(t)}function M(e){return e=(e||``).toLowerCase(),t[e]||t[i[e]]}function N(e,{languageName:t}){typeof e==`string`&&(e=[e]),e.forEach(e=>{i[e.toLowerCase()]=t})}function P(e){let t=M(e);return t&&!t.disableAutodetect}function F(e){e[`before:highlightBlock`]&&!e[`before:highlightElement`]&&(e[`before:highlightElement`]=t=>{e[`before:highlightBlock`](Object.assign({block:t.el},t))}),e[`after:highlightBlock`]&&!e[`after:highlightElement`]&&(e[`after:highlightElement`]=t=>{e[`after:highlightBlock`](Object.assign({block:t.el},t))})}function I(e){F(e),a.push(e)}function L(e){let t=a.indexOf(e);t!==-1&&a.splice(t,1)}function R(e,t){let n=e;a.forEach(function(e){e[n]&&e[n](t)})}function B(e){return X(`10.7.0`,`highlightBlock will be removed entirely in v12.0`),X(`10.7.0`,`Please use highlightElement now.`),C(e)}Object.assign(e,{highlight:p,highlightAuto:x,highlightAll:O,highlightElement:C,highlightBlock:B,configure:w,initHighlighting:T,initHighlightingOnLoad:E,registerLanguage:k,unregisterLanguage:A,listLanguages:j,getLanguage:M,registerAliases:N,autoDetection:P,inherit:ge,addPlugin:I,removePlugin:L}),e.debugMode=function(){o=!1},e.safeMode=function(){o=!0},e.versionString=pe,e.regex={concat:_,lookahead:m,either:y,optional:g,anyNumberOfTimes:h};for(let e in z)typeof z[e]==`object`&&n(z[e]);return Object.assign(e,z),e},$=ye({});$.newInstance=()=>ye({}),t.exports=$,$.HighlightJS=$,$.default=$}))()).default;function l(e){let t={className:`attr`,begin:/"(\\.|[^\\"\r\n])*"(?=\s*:)/,relevance:1.01},n={match:/[{}[\],:]/,className:`punctuation`,relevance:0},r=[`true`,`false`,`null`],i={scope:`literal`,beginKeywords:r.join(` `)};return{name:`JSON`,aliases:[`jsonc`],keywords:{literal:r},contains:[t,n,e.QUOTE_STRING_MODE,i,e.C_NUMBER_MODE,e.C_LINE_COMMENT_MODE,e.C_BLOCK_COMMENT_MODE],illegal:`\\S`}}c.registerLanguage(`json`,l);function u(e){try{return c.highlight(e,{language:`json`}).value}catch{return e.replace(/&/g,`&`).replace(/</g,`<`).replace(/>/g,`>`)}}function d(e,t){return`<pre class="code-block"${t?` id="${t}"`:``}><code class="hljs language-json">${u(e)}</code></pre>`}function f(e){return e.replace(/&/g,`&`).replace(/</g,`<`).replace(/>/g,`>`).replace(/"/g,`"`)}function p(e){return e?e.split(`
|
|
4
|
+
`).length:1}function m(e){return Array.from({length:e},(e,t)=>String(t+1)).join(`
|
|
5
|
+
`)}function h(e){let t=e.closest(`[data-json-editor]`);if(!t)return;let n=t.querySelector(`[data-json-highlight]`),r=t.querySelector(`[data-json-gutter]`),i=t.querySelector(`[data-json-status]`),a=e.value;n&&(n.innerHTML=u(a)),r&&(r.textContent=m(p(a)));let o=!0;try{a.trim()&&JSON.parse(a)}catch{o=!1}t.classList.toggle(`invalid`,!o),i&&(i.textContent=o?`Valid JSON`:`Invalid JSON`,i.classList.toggle(`ok`,o),i.classList.toggle(`err`,!o))}function g(e){try{let t=JSON.parse(e.value);e.value=JSON.stringify(t,null,2),h(e)}catch{h(e)}}function _(e,t){let n=p(t);return`
|
|
6
|
+
<div class="json-editor" data-json-editor="${f(e)}">
|
|
7
|
+
<div class="json-editor-head">
|
|
8
|
+
<span class="json-editor-status ok" data-json-status>Valid JSON</span>
|
|
9
|
+
<button type="button" class="json-editor-format" data-json-format>Format</button>
|
|
10
|
+
</div>
|
|
11
|
+
<div class="json-editor-frame">
|
|
12
|
+
<div class="json-editor-gutter" data-json-gutter aria-hidden="true">${m(n)}</div>
|
|
13
|
+
<div class="json-editor-main">
|
|
14
|
+
<pre class="json-editor-highlight" aria-hidden="true"><code class="hljs language-json" data-json-highlight>${u(t)}</code></pre>
|
|
15
|
+
<textarea class="json-editor-input" id="${f(e)}" spellcheck="false">${f(t)}</textarea>
|
|
16
|
+
</div>
|
|
17
|
+
</div>
|
|
18
|
+
</div>
|
|
19
|
+
`}function v(e){let t=document.getElementById(e);if(!t)return;let n=t.closest(`[data-json-editor]`);if(!n)return;let r=n.querySelector(`.json-editor-highlight`),i=n.querySelector(`.json-editor-gutter`),a=()=>{r&&(r.scrollTop=t.scrollTop),r&&(r.scrollLeft=t.scrollLeft),i&&(i.scrollTop=t.scrollTop)};t.addEventListener(`input`,()=>{h(t),a()}),t.addEventListener(`scroll`,a),t.addEventListener(`keydown`,e=>{if(e.key!==`Tab`)return;e.preventDefault();let n=t.selectionStart,r=t.selectionEnd,i=t.value;t.value=`${i.slice(0,n)} ${i.slice(r)}`,t.selectionStart=n+2,t.selectionEnd=n+2,h(t)}),n.querySelector(`[data-json-format]`)?.addEventListener(`click`,()=>{g(t)}),h(t)}function y(e){return e.replace(/&/g,`&`).replace(/</g,`<`).replace(/>/g,`>`).replace(/"/g,`"`)}function b(e){if(e.mcp?.url)return new URL(e.mcp.url,window.location.href).href;let t=(e.mcpPath??`../mcp`).replace(/\/$/,``);return new URL(`${t}`,window.location.href).href}function ee(e){return e.toLowerCase().replace(/[^a-z0-9]+/g,`-`).replace(/^-|-$/g,``)||`api`}function x(e){return`${e.toUpperCase().replace(/-/g,`_`)}_TOKEN`}function S(e,t,n,r=`url`){let i={[r]:e};return n&&(i.headers={Authorization:n}),JSON.stringify({mcpServers:{[t]:i}},null,2)}function C(e,t,n){let r={type:`http`,url:e};return n&&(r.headers={Authorization:n}),JSON.stringify({servers:{[t]:r}},null,2)}function w(e,t,n){let r={serverUrl:e};return r.headers={Authorization:`Bearer \${env:${n}}`},JSON.stringify({mcpServers:{[t]:r}},null,2)}function T(e,t,n){let r={url:e};return n&&(r.auth=`bearer`,r.bearerTokenEnv=n),JSON.stringify({mcpServers:{[t]:r}},null,2)}function E(e,t,n){let r=`claude mcp add --transport http ${t} ${e}`;return n&&(r+=` --header "Authorization: ${n}"`),r}function D(e,t=`Copy`){return`<button type="button" class="mcp-code-copy" data-copy-target="${e}">${t}</button>`}function O(e,t,n=`Copy`,r=`JSON`){return`
|
|
20
|
+
<div class="mcp-code-panel">
|
|
21
|
+
<div class="mcp-code-toolbar">
|
|
22
|
+
<span class="mcp-code-lang">${r}</span>
|
|
23
|
+
${D(t,n)}
|
|
24
|
+
</div>
|
|
25
|
+
${d(e,t)}
|
|
26
|
+
</div>
|
|
27
|
+
`}function k(e,t,n){let r=n?`Bearer YOUR_TOKEN`:void 0,i=x(t),a=S(e,t,r),o=C(e,t,r),s=n?w(e,t,i):S(e,t,void 0,`serverUrl`),c=T(e,t,n?i:void 0),l=E(e,t,r),u=n?` Replace <code>YOUR_TOKEN</code> or set the env var before connecting.`:``;return[{id:`cursor`,title:`Cursor`,meta:`.cursor/mcp.json`,hint:`Project file or Settings → MCP.`,body:`
|
|
28
|
+
${O(a,`cursor-mcp-config`,`Copy config`)}
|
|
29
|
+
`},{id:`claude-desktop`,title:`Claude`,meta:`Desktop · Connectors`,hint:`Remote HTTP MCP via custom connectors (not the local stdio config file).`,body:`
|
|
30
|
+
<ol class="mcp-steps">
|
|
31
|
+
<li>Open <strong>Settings → Connectors → Add custom connector</strong>.</li>
|
|
32
|
+
<li>Paste the endpoint URL.${n?` Add your Bearer token when prompted.`:``}</li>
|
|
33
|
+
<li>Save — Claude connects from Anthropic's cloud, so the URL must be publicly reachable.</li>
|
|
34
|
+
</ol>
|
|
35
|
+
`},{id:`claude-code`,title:`Claude Code`,meta:`CLI`,hint:`Run in your terminal.${u}`,body:`
|
|
36
|
+
${O(l,`claude-code-mcp`,`Copy command`,`Shell`)}
|
|
37
|
+
`},{id:`vscode`,title:`VS Code`,meta:`.vscode/mcp.json`,hint:`Workspace or user profile — Command Palette → <code>MCP: Open User Configuration</code>.`,body:`
|
|
38
|
+
${O(o,`vscode-mcp-config`,`Copy config`)}
|
|
39
|
+
`},{id:`windsurf`,title:`Windsurf`,meta:`mcp_config.json`,hint:n?`Uses <code>serverUrl</code> and <code>\${env:${i}}</code> for auth.`:`Uses <code>serverUrl</code> (not <code>url</code>) for remote servers.`,body:`
|
|
40
|
+
${O(s,`windsurf-mcp-config`,`Copy config`)}
|
|
41
|
+
`},{id:`pi`,title:`Pi`,meta:`.pi/mcp.json`,hint:n?`Set <code>${i}</code> in your environment; Pi reads it via <code>bearerTokenEnv</code>.`:`Project-local <code>.pi/mcp.json</code> or global Pi MCP config.`,body:`
|
|
42
|
+
${O(c,`pi-mcp-config`,`Copy config`)}
|
|
43
|
+
`}]}function A(e){return e.map((e,t)=>`
|
|
44
|
+
<button
|
|
45
|
+
type="button"
|
|
46
|
+
class="mcp-client-tab"
|
|
47
|
+
role="tab"
|
|
48
|
+
id="mcp-tab-${e.id}"
|
|
49
|
+
data-mcp-client="${e.id}"
|
|
50
|
+
aria-selected="${t===0?`true`:`false`}"
|
|
51
|
+
aria-controls="mcp-panel-${e.id}"
|
|
52
|
+
>${y(e.title)}</button>
|
|
53
|
+
`).join(``)}function j(e){return e.map((e,t)=>`
|
|
54
|
+
<div
|
|
55
|
+
class="mcp-client-panel${t===0?` is-active`:``}"
|
|
56
|
+
role="tabpanel"
|
|
57
|
+
id="mcp-panel-${e.id}"
|
|
58
|
+
data-mcp-panel="${e.id}"
|
|
59
|
+
aria-labelledby="mcp-tab-${e.id}"
|
|
60
|
+
${t===0?``:`hidden`}
|
|
61
|
+
>
|
|
62
|
+
<div class="mcp-client-meta">
|
|
63
|
+
<span class="mcp-client-path">${y(e.meta)}</span>
|
|
64
|
+
</div>
|
|
65
|
+
<p class="mcp-client-hint">${e.hint}</p>
|
|
66
|
+
${e.body}
|
|
67
|
+
</div>
|
|
68
|
+
`).join(``)}function M(e,t,n){let r=t.filter(e=>e.mcp);if(r.length===0)return``;let i=b(e),a=r.some(e=>e.access===`private`),o=e.mcp?.authHint??(a?`Private tools require a Bearer token in the MCP client headers.`:``),s=k(i,ee(n),a),c=`${r.length} MCP tool${r.length===1?``:`s`}`;return`
|
|
69
|
+
<section class="mcp-connect">
|
|
70
|
+
<div class="mcp-connect-head">
|
|
71
|
+
<div>
|
|
72
|
+
<h3 class="mcp-connect-title">Connect MCP</h3>
|
|
73
|
+
<p class="mcp-connect-lead">
|
|
74
|
+
${r.length} tool${r.length===1?``:`s`} over HTTP — paste into your agent.
|
|
75
|
+
</p>
|
|
76
|
+
</div>
|
|
77
|
+
<span class="badge mcp mcp-connect-badge">MCP</span>
|
|
78
|
+
</div>
|
|
79
|
+
|
|
80
|
+
<div class="mcp-endpoint">
|
|
81
|
+
<label class="mcp-endpoint-label">Endpoint</label>
|
|
82
|
+
<div class="mcp-endpoint-field">
|
|
83
|
+
<code class="mcp-endpoint-url">${y(i)}</code>
|
|
84
|
+
<button type="button" class="mcp-endpoint-copy" data-copy="${y(i)}" aria-label="Copy endpoint URL">
|
|
85
|
+
Copy
|
|
86
|
+
</button>
|
|
87
|
+
</div>
|
|
88
|
+
${o?`<p class="mcp-endpoint-note">${y(o)}</p>`:``}
|
|
89
|
+
</div>
|
|
90
|
+
|
|
91
|
+
<div class="mcp-tools">
|
|
92
|
+
<button type="button" class="mcp-tools-link" data-mcp-routes>
|
|
93
|
+
View ${y(c)} →
|
|
94
|
+
</button>
|
|
95
|
+
</div>
|
|
96
|
+
|
|
97
|
+
<div class="mcp-clients">
|
|
98
|
+
<div class="mcp-client-tabs" role="tablist" aria-label="MCP clients">
|
|
99
|
+
${A(s)}
|
|
100
|
+
</div>
|
|
101
|
+
<div class="mcp-client-panels">
|
|
102
|
+
${j(s)}
|
|
103
|
+
</div>
|
|
104
|
+
</div>
|
|
105
|
+
</section>
|
|
106
|
+
`}function N(e){let t=e.textContent??`Copy`;e.textContent=`Copied`,e.classList.add(`is-copied`),window.setTimeout(()=>{e.textContent=t,e.classList.remove(`is-copied`)},1400)}function P(e){e.querySelectorAll(`[data-copy]`).forEach(e=>{e.addEventListener(`click`,()=>{let t=e.dataset.copy??``;navigator.clipboard.writeText(t).then(()=>{N(e)})})}),e.querySelectorAll(`[data-copy-target]`).forEach(e=>{e.addEventListener(`click`,()=>{let t=e.dataset.copyTarget??``,n=document.getElementById(t);n&&navigator.clipboard.writeText(n.textContent??``).then(()=>{N(e)})})});let t=e.querySelectorAll(`[data-mcp-client]`);if(t.length===0)return;let n=e.querySelectorAll(`[data-mcp-panel]`);t.forEach(e=>{e.addEventListener(`click`,()=>{let r=e.dataset.mcpClient??``;t.forEach(t=>{t.setAttribute(`aria-selected`,t===e?`true`:`false`)}),n.forEach(e=>{let t=e.dataset.mcpPanel===r;e.hidden=!t,e.classList.toggle(`is-active`,t)})})})}var F=`callsheet-theme`;function I(){let e=localStorage.getItem(F);return e===`light`||e===`dark`?e:window.matchMedia(`(prefers-color-scheme: dark)`).matches?`dark`:`light`}function L(e){document.documentElement.dataset.theme=e,localStorage.setItem(F,e)}function R(){let e=I();return L(e),e}function z(e){let t=e===`light`?`dark`:`light`;return L(t),t}var B=`xmlns="http://www.w3.org/2000/svg" viewBox="0 0 24 24" fill="none" stroke="currentColor" stroke-width="1.5" stroke-linecap="round" stroke-linejoin="round"`;function te(){return`<svg ${B} aria-hidden="true"><circle cx="12" cy="12" r="4"/><path d="M12 2v2M12 20v2M4.93 4.93l1.41 1.41M17.66 17.66l1.41 1.41M2 12h2M20 12h2M4.93 19.07l1.41-1.41M17.66 6.34l1.41-1.41"/></svg>`}function ne(){return`<svg ${B} aria-hidden="true"><path d="M20 14.5A7.5 7.5 0 0 1 9.5 4 6 6 0 1 0 20 14.5Z"/></svg>`}var V=window.__CALLSHEET__??{specUrl:`../openapi.json`,rpcBase:`..`,mcpPath:`../mcp`},H=R();function U(e){return e.replace(/&/g,`&`).replace(/</g,`<`).replace(/>/g,`>`).replace(/"/g,`"`)}function re(e){return!!e?.intro}function W(e,t){return t?.name??e}function ie(e){if(e.websiteLabel)return e.websiteLabel;if(e.websiteUrl)try{return new URL(e.websiteUrl).hostname.replace(/^www\./,``)}catch{return`Learn more`}return`Learn more`}function G(e,t){if(!e?.logoUrl)return``;let n=e.logoUrlDark??e.logoUrl,{size:r,wrapClass:i}=t,a=e.logoSrcSet??`./brand/mark.png 256w, ./brand/mark@2x.png 512w`,o=e.logoUrl.includes(`mark.png`)||e.logoSrcSet?` srcset="${U(a)}" sizes="${r}px"`:``;return`
|
|
107
|
+
<span class="brand-mark ${i}" style="--logo-size: ${r}px">
|
|
108
|
+
<img class="brand-mark-img brand-mark-light" src="${U(e.logoUrl)}"${o} width="${r}" height="${r}" alt="">
|
|
109
|
+
<img class="brand-mark-img brand-mark-dark" src="${U(n)}"${o} width="${r}" height="${r}" alt="">
|
|
110
|
+
</span>
|
|
111
|
+
`}function ae(e){return G(e,{size:e?.logoSize??80,wrapClass:`intro-logo`})||``}function K(e,t){if(!e||typeof e!=`object`)return{};let n=e;if(Array.isArray(n.enum)&&n.enum.length)return n.enum[0];if(n.const!==void 0)return n.const;let r=n.type;if(r===`string`)return t?.toLowerCase().includes(`id`)?`00000000-0000-0000-0000-000000000000`:t?.toLowerCase().includes(`email`)?`user@example.com`:``;if(r===`number`||r===`integer`)return 0;if(r===`boolean`)return!1;if(r===`array`){let e=n.items;return e?[K(e)]:[]}if(r===`object`||n.properties){let e=n.properties,t=Array.isArray(n.required)?n.required:[],r={};if(e)for(let[n,i]of Object.entries(e))(t.includes(n)||Object.keys(r).length<4)&&(r[n]=K(i,n));return r}return null}function q(e){let t=new Map;for(let n of e){let e=n.tags.length?n.tags:[`routes`];for(let r of e){let e=t.get(r)??[];e.push(n),t.set(r,e)}}for(let e of t.values())e.sort((e,t)=>e.name.localeCompare(t.name));return new Map([...t.entries()].sort(([e],[t])=>e.localeCompare(t)))}function J(e){let t=new Set;for(let n of e)for(let e of n.tags.length?n.tags:[`routes`])t.add(e);return[...t].sort((e,t)=>e.localeCompare(t))}function Y(e,t){let n=t.text.trim().toLowerCase();return e.filter(e=>!(t.access!==`all`&&e.access!==t.access||t.mcpOnly&&!e.mcp||t.tag&&!e.tags.includes(t.tag)||n&&!(e.name.toLowerCase().includes(n)||e.summary.toLowerCase().includes(n)||e.description.toLowerCase().includes(n)||e.tags.some(e=>e.toLowerCase().includes(n)))))}function X(e){return[`<span class="badge ${e.access}">${e.access}</span>`,e.mcp?`<span class="badge mcp">MCP</span>`:``].filter(Boolean).join(``)}function Z(e,t){let n=location.hash.replace(/^#\/?/,``);if(!n||n===``)return t?{kind:`home`}:{kind:`routes`};if(n===`routes`)return{kind:`routes`};let r=decodeURIComponent(n.split(`/`)[0]??``);return e.some(e=>e.name===r)?{kind:`route`,name:r}:t?{kind:`home`}:{kind:`routes`}}function Q(e){let t=`#/`;e.kind===`routes`?t=`#/routes`:e.kind===`route`&&(t=`#/${encodeURIComponent(e.name)}`),location.hash!==t&&(location.hash=t)}function oe(e,t,n){let r=q(e),i=``;n&&(i+=`<button type="button" class="route-btn nav-btn${t.kind===`home`?` active`:``}" data-view="home">Home</button>`),i+=`<button type="button" class="route-btn nav-btn${t.kind===`routes`?` active`:``}" data-view="routes">Routes</button>`;for(let[e,n]of r){i+=`<div class="tag-group"><div class="tag-label">${U(e)}</div>`;for(let e of n){let n=t.kind===`route`&&e.name===t.name?` active`:``;i+=`<button type="button" class="route-btn${n}" data-route="${U(e.name)}">${U(e.name)}</button>`}i+=`</div>`}return i||`<div class="empty-state"><p>No routes</p></div>`}function se(e,t,n,r){let i=W(e,r),a=n.filter(e=>e.mcp).length,o=r.websiteUrl?`<a class="intro-link" href="${U(r.websiteUrl)}" target="_blank" rel="noopener">${U(ie(r))} ↗</a>`:``;return`
|
|
112
|
+
<div class="intro">
|
|
113
|
+
${ae(r)}
|
|
114
|
+
<h1 class="intro-title">${U(i)}</h1>
|
|
115
|
+
<p class="intro-version">v${U(t)} · ${n.length} routes${a?` · ${a} MCP tools`:``}</p>
|
|
116
|
+
<p class="intro-text">${U(r.intro??``)}</p>
|
|
117
|
+
<div class="intro-actions">
|
|
118
|
+
<button type="button" class="btn btn-primary" data-view="routes">Browse API →</button>
|
|
119
|
+
${o}
|
|
120
|
+
</div>
|
|
121
|
+
${M(V,n,i)}
|
|
122
|
+
</div>
|
|
123
|
+
`}function ce(e,t,n,r){let i=J(t),a=q(e),o=``;for(let[e,t]of a){let n=``;for(let e of t)n+=`
|
|
124
|
+
<button type="button" class="route-card" data-route="${U(e.name)}">
|
|
125
|
+
<div class="route-card-head">
|
|
126
|
+
<span class="method">POST</span>
|
|
127
|
+
<span class="route-card-name">${U(e.name)}</span>
|
|
128
|
+
<span class="route-card-badges">${X(e)}</span>
|
|
129
|
+
</div>
|
|
130
|
+
<p class="route-card-summary">${U(e.summary)}</p>
|
|
131
|
+
</button>
|
|
132
|
+
`;o+=`
|
|
133
|
+
<section class="overview-group">
|
|
134
|
+
<h3 class="overview-group-title">${U(e)}</h3>
|
|
135
|
+
<div class="route-cards">${n}</div>
|
|
136
|
+
</section>
|
|
137
|
+
`}let s=i.map(e=>`<button type="button" class="filter-pill${n.tag===e?` active`:``}" data-tag="${U(e)}">${U(e)}</button>`).join(``);return`
|
|
138
|
+
${r?`<nav class="breadcrumb"><button type="button" class="breadcrumb-link" data-view="home">← Home</button></nav>`:``}
|
|
139
|
+
<div class="overview">
|
|
140
|
+
<div class="overview-head">
|
|
141
|
+
<h2 class="overview-title">Routes</h2>
|
|
142
|
+
<p class="overview-count">${e.length} of ${t.length}</p>
|
|
143
|
+
</div>
|
|
144
|
+
<div class="filters">
|
|
145
|
+
<input class="search overview-search" type="search" placeholder="Search routes" value="${U(n.text)}" aria-label="Search routes">
|
|
146
|
+
<div class="filter-row">
|
|
147
|
+
<span class="filter-label">Access</span>
|
|
148
|
+
<div class="filter-pills">
|
|
149
|
+
<button type="button" class="filter-pill${n.access===`all`?` active`:``}" data-access="all">All</button>
|
|
150
|
+
<button type="button" class="filter-pill${n.access===`public`?` active`:``}" data-access="public">Public</button>
|
|
151
|
+
<button type="button" class="filter-pill${n.access===`private`?` active`:``}" data-access="private">Private</button>
|
|
152
|
+
</div>
|
|
153
|
+
</div>
|
|
154
|
+
<div class="filter-row">
|
|
155
|
+
<span class="filter-label">Tag</span>
|
|
156
|
+
<div class="filter-pills">
|
|
157
|
+
<button type="button" class="filter-pill${n.tag===null?` active`:``}" data-tag="">All</button>
|
|
158
|
+
${s}
|
|
159
|
+
</div>
|
|
160
|
+
</div>
|
|
161
|
+
<label class="filter-check">
|
|
162
|
+
<input type="checkbox" id="mcp-only"${n.mcpOnly?` checked`:``}>
|
|
163
|
+
MCP only
|
|
164
|
+
</label>
|
|
165
|
+
</div>
|
|
166
|
+
${o||`<div class="empty-state"><p>No routes match these filters</p></div>`}
|
|
167
|
+
</div>
|
|
168
|
+
`}function le(e,t,n){return`
|
|
169
|
+
<nav class="breadcrumb"><button type="button" class="breadcrumb-link" data-view="routes">← All routes</button></nav>
|
|
170
|
+
<div class="route-endpoint">
|
|
171
|
+
<span class="method">POST</span>
|
|
172
|
+
<h2 class="route-name">${U(e.name)}</h2>
|
|
173
|
+
</div>
|
|
174
|
+
<div class="badges">${X(e)}</div>
|
|
175
|
+
<p class="route-summary">${U(e.summary)}</p>
|
|
176
|
+
${e.description?`<p class="route-desc">${U(e.description)}</p>`:`<div class="route-desc"></div>`}
|
|
177
|
+
<div class="section">
|
|
178
|
+
<h3 class="section-title">Request</h3>
|
|
179
|
+
${d(JSON.stringify(e.inputSchema,null,2))}
|
|
180
|
+
</div>
|
|
181
|
+
<div class="section">
|
|
182
|
+
<h3 class="section-title">Response</h3>
|
|
183
|
+
${d(JSON.stringify(e.outputSchema,null,2))}
|
|
184
|
+
</div>
|
|
185
|
+
<div class="section">
|
|
186
|
+
<h3 class="section-title">Try it</h3>
|
|
187
|
+
<div class="try-block">
|
|
188
|
+
<div class="field">
|
|
189
|
+
<label for="auth">Authorization</label>
|
|
190
|
+
<input id="auth" type="text" placeholder="Bearer token" autocomplete="off" spellcheck="false">
|
|
191
|
+
</div>
|
|
192
|
+
<div class="field">
|
|
193
|
+
<label for="body">Body</label>
|
|
194
|
+
${_(`body`,t)}
|
|
195
|
+
</div>
|
|
196
|
+
<div class="actions">
|
|
197
|
+
<button type="button" class="btn btn-primary" id="send">Send</button>
|
|
198
|
+
<button type="button" class="btn btn-ghost" id="copy-curl">Copy curl</button>
|
|
199
|
+
</div>
|
|
200
|
+
<div class="response" id="response"></div>
|
|
201
|
+
</div>
|
|
202
|
+
</div>
|
|
203
|
+
`}async function ue(e){let t=document.getElementById(`body`),n=document.getElementById(`auth`),r=document.getElementById(`response`);if(!t||!r)return;let i=`${V.rpcBase.replace(/\/$/,``)}/${e.name}`.replace(/\/{2,}/g,`/`),a={"Content-Type":`application/json`};n?.value.trim()&&(a.Authorization=n.value.trim());let o;try{o=JSON.stringify(JSON.parse(t.value))}catch{r.innerHTML=`<div class="error-banner">Invalid JSON</div>`;return}r.innerHTML=`<p class="response-meta">Sending…</p>`;try{let e=performance.now(),t=await fetch(i,{method:`POST`,headers:a,body:o}),n=Math.round(performance.now()-e),s=await t.text(),c=s;try{c=JSON.stringify(JSON.parse(s),null,2)}catch{}r.innerHTML=`
|
|
204
|
+
<div class="response-meta ${t.ok?`ok`:`err`}">${t.status} · ${n}ms</div>
|
|
205
|
+
${d(c||`(empty)`)}
|
|
206
|
+
`}catch(e){r.innerHTML=`<div class="error-banner">${U(String(e))}</div>`}}function de(e){let t=document.getElementById(`body`),n=document.getElementById(`auth`),r=V.rpcBase.replace(/\/$/,``),i=new URL(`${r}/${e.name}`.replace(/\/{2,}/g,`/`),window.location.href).href,a=t?.value??`{}`,o=`curl -X POST '${i}' \\\n -H 'Content-Type: application/json'`;n?.value.trim()&&(o+=` \\\n -H 'Authorization: ${n.value.trim()}'`),o+=` \\\n -d '${a.replace(/'/g,`'\\''`)}'`,navigator.clipboard.writeText(o)}function fe(e){let t=e.paths,n=[];if(!t)return n;for(let[e,r]of Object.entries(t)){let t=r.post;if(!t)continue;let i=t.operationId??e.replace(/^\//,``),a=t.requestBody?.content?.[`application/json`],o=t.responses?.[`200`]?.content?.[`application/json`];n.push({name:i,summary:t.summary??i,description:t.description??``,tags:Array.isArray(t.tags)?t.tags.map(String):[],access:t[`x-callspec-access`]===`public`?`public`:`private`,mcp:t[`x-callspec-mcp`]===!0,inputSchema:a?.schema??{type:`object`},outputSchema:o?.schema??{type:`object`}})}return n.sort((e,t)=>e.name.localeCompare(t.name))}async function pe(){let e=document.getElementById(`app`);if(e)try{let t=await fetch(V.specUrl);if(!t.ok)throw Error(`Could not load spec (${t.status})`);let n=await t.json(),r=n.info,i=V.title??r?.title??`API`,a=r?.version??``,o=V.branding,s=re(o),c=fe(n),l=Z(c,s),u={text:``,access:`all`,tag:null,mcpOnly:!1},d=new Map;for(let e of c)d.set(e.name,JSON.stringify(K(e.inputSchema),null,2));let f=e=>{let t=document.getElementById(`body`);l.kind===`route`&&t&&d.set(l.name,t.value),l=e,Q(e),p()},p=()=>{let t=Y(c,u),n=W(i,o);e.className=``,e.innerHTML=`
|
|
207
|
+
<aside class="sidebar">
|
|
208
|
+
<div class="sidebar-head">
|
|
209
|
+
<div class="sidebar-head-row">
|
|
210
|
+
<button type="button" class="sidebar-title" data-view="${s?`home`:`routes`}">
|
|
211
|
+
${G(o,{size:24,wrapClass:`sidebar-mark`})}
|
|
212
|
+
<span class="sidebar-title-text">${U(n)}</span>
|
|
213
|
+
</button>
|
|
214
|
+
<button type="button" class="theme-toggle" id="theme-toggle" aria-label="Toggle color theme" title="Toggle color theme">
|
|
215
|
+
<span class="theme-icon theme-icon-light" aria-hidden="true">${te()}</span>
|
|
216
|
+
<span class="theme-icon theme-icon-dark" aria-hidden="true">${ne()}</span>
|
|
217
|
+
</button>
|
|
218
|
+
</div>
|
|
219
|
+
<p>v${U(a)} · ${c.length} routes</p>
|
|
220
|
+
</div>
|
|
221
|
+
<div class="route-list">${oe(c,l,s)}</div>
|
|
222
|
+
</aside>
|
|
223
|
+
<div class="content">
|
|
224
|
+
<main class="main" id="main"></main>
|
|
225
|
+
</div>
|
|
226
|
+
`;let r=document.getElementById(`main`);if(r&&l.kind===`home`&&o)r.innerHTML=se(i,a,c,o),P(r),r.querySelector(`[data-mcp-routes]`)?.addEventListener(`click`,()=>{u={...u,mcpOnly:!0},f({kind:`routes`})});else if(r&&l.kind===`routes`)r.innerHTML=ce(t,c,u,s),m(r);else if(r&&l.kind===`route`){let e=c.find(e=>e.name===l.name);e?(r.innerHTML=le(e,d.get(e.name)??`{}`,s),document.getElementById(`send`)?.addEventListener(`click`,()=>{ue(e)}),document.getElementById(`copy-curl`)?.addEventListener(`click`,()=>{de(e)}),v(`body`)):f(s?{kind:`home`}:{kind:`routes`})}document.getElementById(`theme-toggle`)?.addEventListener(`click`,()=>{H=z(H)}),e.querySelectorAll(`[data-view]`).forEach(e=>{e.addEventListener(`click`,()=>{let t=e.dataset.view;t===`home`?f({kind:`home`}):t===`routes`&&f({kind:`routes`})})}),e.querySelectorAll(`[data-route]`).forEach(e=>{e.addEventListener(`click`,()=>{f({kind:`route`,name:e.dataset.route??``})})})},m=e=>{e.querySelector(`.overview-search`)?.addEventListener(`input`,e=>{u={...u,text:e.target.value},p()}),e.querySelectorAll(`[data-access]`).forEach(e=>{e.addEventListener(`click`,()=>{u={...u,access:e.dataset.access},p()})}),e.querySelectorAll(`[data-tag]`).forEach(e=>{e.addEventListener(`click`,()=>{let t=e.dataset.tag??``;u={...u,tag:t||null},p()})}),e.querySelector(`#mcp-only`)?.addEventListener(`change`,e=>{u={...u,mcpOnly:e.target.checked},p()})};window.addEventListener(`hashchange`,()=>{l=Z(c,s),p()}),p()}catch(t){e.className=`loading`,e.innerHTML=`<div class="error-banner">${U(String(t))}</div>`}}pe()})();
|
|
@@ -0,0 +1,10 @@
|
|
|
1
|
+
<svg xmlns="http://www.w3.org/2000/svg" width="48" height="48" viewBox="0 0 48 48" role="img" aria-label="callspec">
|
|
2
|
+
<rect x="2" y="2" width="44" height="44" rx="9" fill="#1a1a1a" stroke="#333" stroke-width="1"/>
|
|
3
|
+
<circle cx="24" cy="27" r="4" fill="#fafafa"/>
|
|
4
|
+
<path d="M24 23V15" stroke="#fafafa" stroke-width="2" stroke-linecap="round"/>
|
|
5
|
+
<circle cx="24" cy="13.5" r="2.25" fill="#fafafa"/>
|
|
6
|
+
<path d="M20.5 29L14.1 32.2" stroke="#fafafa" stroke-width="2" stroke-linecap="round"/>
|
|
7
|
+
<circle cx="13.2" cy="32.8" r="2.25" fill="#fafafa"/>
|
|
8
|
+
<path d="M27.5 29L33.9 32.2" stroke="#fafafa" stroke-width="2" stroke-linecap="round"/>
|
|
9
|
+
<circle cx="34.8" cy="32.8" r="2.25" fill="#fafafa"/>
|
|
10
|
+
</svg>
|
|
@@ -0,0 +1,10 @@
|
|
|
1
|
+
<svg xmlns="http://www.w3.org/2000/svg" width="48" height="48" viewBox="0 0 48 48" role="img" aria-label="callspec">
|
|
2
|
+
<rect x="2" y="2" width="44" height="44" rx="9" fill="none" stroke="#171717" stroke-width="2"/>
|
|
3
|
+
<circle cx="24" cy="27" r="4" fill="#171717"/>
|
|
4
|
+
<path d="M24 23V15" stroke="#171717" stroke-width="2" stroke-linecap="round"/>
|
|
5
|
+
<circle cx="24" cy="13.5" r="2.25" fill="#171717"/>
|
|
6
|
+
<path d="M20.5 29L14.1 32.2" stroke="#171717" stroke-width="2" stroke-linecap="round"/>
|
|
7
|
+
<circle cx="13.2" cy="32.8" r="2.25" fill="#171717"/>
|
|
8
|
+
<path d="M27.5 29L33.9 32.2" stroke="#171717" stroke-width="2" stroke-linecap="round"/>
|
|
9
|
+
<circle cx="34.8" cy="32.8" r="2.25" fill="#171717"/>
|
|
10
|
+
</svg>
|
|
@@ -0,0 +1,2 @@
|
|
|
1
|
+
:root,[data-theme=light]{--lightningcss-light:initial;--lightningcss-dark: ;color-scheme:light;--bg:#f3ede4;--surface:#faf6ef;--border:#e3d9cc;--border-strong:#cfc4b5;--text:#1c1917;--text-secondary:#6b6560;--text-tertiary:#9c958c;--accent:#1c1917;--accent-soft:#ebe4d9;--green:#15803d;--amber:#b45309;--purple:#6d28d9;--red:#b91c1c;--error-bg:#fdf5f3;--error-border:#f5c6c0;--badge-public-bg:#eef6ef;--badge-public-border:#b8dfc0;--badge-private-bg:#faf5eb;--badge-private-border:#ecd9a8;--badge-mcp-bg:#f5f2fa;--badge-mcp-border:#d4c8ef;--hljs-bg:#ede7dc;--hljs-attr:#953800;--hljs-string:#0a3069;--hljs-number:#0550ae;--hljs-literal:#cf222e;--hljs-punctuation:#57606a}[data-theme=dark]{--lightningcss-light: ;--lightningcss-dark:initial;color-scheme:dark;--bg:#0a0a0a;--surface:#141414;--border:#262626;--border-strong:#404040;--text:#fafafa;--text-secondary:#a3a3a3;--text-tertiary:#737373;--accent:#fafafa;--accent-soft:#1f1f1f;--green:#4ade80;--amber:#fbbf24;--purple:#a78bfa;--red:#f87171;--error-bg:#2a1212;--error-border:#7f1d1d;--badge-public-bg:#052e16;--badge-public-border:#166534;--badge-private-bg:#422006;--badge-private-border:#92400e;--badge-mcp-bg:#2e1065;--badge-mcp-border:#5b21b6;--hljs-bg:#0d1117;--hljs-attr:#ffa657;--hljs-string:#a5d6ff;--hljs-number:#79c0ff;--hljs-literal:#ff7b72;--hljs-punctuation:#8b949e}:root{--mono:ui-monospace, "SF Mono", "JetBrains Mono", monospace;--sans:-apple-system, BlinkMacSystemFont, "Segoe UI", system-ui, sans-serif;--sidebar:260px;--radius:8px;--footer-height:40px}*,:before,:after{box-sizing:border-box}html,body{background:var(--bg);height:100%;color:var(--text);font-family:var(--sans);-webkit-font-smoothing:antialiased;margin:0;font-size:14px;line-height:1.5;transition:background-color .15s,color .15s}#app{grid-template-columns:var(--sidebar) 1fr;min-height:calc(100vh - var(--footer-height));display:grid}#app.loading{grid-template-columns:1fr;justify-content:center;align-items:center;display:flex}.loading-text{color:var(--text-secondary);font-size:13px}.sidebar{border-right:1px solid var(--border);background:var(--surface);height:calc(100vh - var(--footer-height));flex-direction:column;display:flex;position:sticky;top:0;overflow:hidden}.sidebar-head{border-bottom:1px solid var(--border);padding:20px 16px 12px}.sidebar-head-row{justify-content:space-between;align-items:center;gap:8px;display:flex}.sidebar-head h1,.sidebar-title{letter-spacing:-.01em;min-width:0;margin:0 0 2px;font-size:15px;font-weight:600}.sidebar-title{min-width:0;color:var(--text);cursor:pointer;text-align:left;background:0 0;border:none;flex:1;align-items:center;gap:8px;min-width:0;padding:0;font-family:inherit;display:inline-flex}.sidebar-title-text{text-overflow:ellipsis;white-space:nowrap;min-width:0;overflow:hidden}.sidebar-title:hover{color:var(--text-secondary)}.sidebar-head p{color:var(--text-secondary);margin:0;font-size:12px}.theme-toggle{border:1px solid var(--border);background:var(--bg);width:34px;height:34px;color:var(--text-secondary);cursor:pointer;border-radius:6px;flex-shrink:0;justify-content:center;align-items:center;padding:0;display:flex}.theme-toggle:hover{border-color:var(--border-strong);color:var(--text);background:var(--accent-soft)}.theme-icon{justify-content:center;align-items:center;width:18px;height:18px;display:flex}.theme-icon svg{width:18px;height:18px;display:block}.theme-icon-dark,[data-theme=dark] .theme-icon-light{display:none}[data-theme=dark] .theme-icon-dark{display:inline}.search{border:1px solid var(--border);border-radius:var(--radius);background:var(--bg);width:calc(100% - 24px);color:var(--text);outline:none;margin:12px;padding:8px 10px;font-size:13px}.search:focus{border-color:var(--border-strong);background:var(--surface)}.search::placeholder{color:var(--text-tertiary)}.route-list{flex:1;padding:4px 8px 16px;overflow-y:auto}.tag-group{margin-bottom:16px}.tag-label{color:var(--text-tertiary);letter-spacing:.04em;text-transform:uppercase;padding:4px 8px 6px;font-size:11px;font-weight:600}.route-btn{width:100%;color:var(--text-secondary);font-family:var(--mono);text-align:left;cursor:pointer;background:0 0;border:none;border-radius:6px;padding:7px 8px;font-size:12px;display:block}.route-btn:hover{background:var(--accent-soft);color:var(--text)}.route-btn.active{background:var(--accent-soft);color:var(--text);font-weight:500}.overview-btn{width:calc(100% - 16px);font-family:var(--sans);margin:4px 8px 12px;font-weight:500}.breadcrumb{margin:0 0 20px}.breadcrumb-link{color:var(--text-secondary);cursor:pointer;background:0 0;border:none;padding:0;font-size:13px}.breadcrumb-link:hover{color:var(--text)}.overview-head{justify-content:space-between;align-items:baseline;gap:12px;margin-bottom:20px;display:flex}.overview-title{letter-spacing:-.02em;margin:0;font-size:22px;font-weight:600}.overview-count{color:var(--text-secondary);margin:0;font-size:13px}.filters{border:1px solid var(--border);border-radius:var(--radius);background:var(--surface);flex-direction:column;gap:14px;margin-bottom:28px;padding:16px;display:flex}.overview-search{width:100%;margin:0}.filter-row{flex-wrap:wrap;align-items:center;gap:8px;display:flex}.filter-label{width:52px;color:var(--text-tertiary);text-transform:uppercase;letter-spacing:.04em;flex-shrink:0;font-size:12px;font-weight:600}.filter-pills{flex-wrap:wrap;gap:6px;display:flex}.filter-pill{border:1px solid var(--border);background:var(--bg);color:var(--text-secondary);cursor:pointer;border-radius:999px;padding:4px 10px;font-size:12px}.filter-pill:hover{border-color:var(--border-strong);color:var(--text)}.filter-pill.active{border-color:var(--text);background:var(--accent-soft);color:var(--text);font-weight:500}.filter-check{color:var(--text-secondary);cursor:pointer;align-items:center;gap:8px;font-size:13px;display:flex}.overview-group{margin-bottom:28px}.overview-group-title{text-transform:uppercase;letter-spacing:.05em;color:var(--text-tertiary);margin:0 0 10px;font-size:12px;font-weight:600}.route-cards{flex-direction:column;gap:8px;display:flex}.route-card{border:1px solid var(--border);border-radius:var(--radius);background:var(--surface);text-align:left;cursor:pointer;width:100%;padding:14px 16px;display:block}.route-card:hover{border-color:var(--border-strong);background:var(--accent-soft)}.route-card-head{flex-wrap:wrap;align-items:center;gap:8px;margin-bottom:4px;display:flex}.route-card-name{font-family:var(--mono);color:var(--text);font-size:14px;font-weight:500}.route-card-badges{gap:6px;margin-left:auto;display:flex}.route-card-badges .badge{margin:0}.route-card-summary{color:var(--text-secondary);margin:0;font-size:13px}.content{flex-direction:column;min-width:0;display:flex}.main{flex:1;max-width:920px;padding:32px 40px 48px}.footer{z-index:20;height:var(--footer-height);border-top:1px solid var(--border);background:var(--surface);color:var(--text-tertiary);justify-content:center;align-items:center;padding:0 20px;font-size:12px;display:flex;position:fixed;bottom:0;left:0;right:0}.footer-link{color:inherit;align-items:center;gap:6px;text-decoration:none;display:inline-flex}.footer-link:hover{color:var(--text-secondary)}.footer-link:hover .footer-name{color:var(--text)}.footer-label{color:var(--text-tertiary)}.footer-name{color:var(--text-secondary);letter-spacing:-.01em;font-weight:600}.footer-logo{flex-shrink:0;display:block}.footer-logo-dark,[data-theme=dark] .footer-logo-light{display:none}[data-theme=dark] .footer-logo-dark{display:block}.empty-state{color:var(--text-secondary);text-align:center;padding:48px 0}.route-endpoint{align-items:center;gap:10px;margin-bottom:8px;display:flex}.method{font-family:var(--mono);background:var(--accent);color:var(--surface);letter-spacing:.03em;border-radius:4px;padding:3px 7px;font-size:11px;font-weight:600}.route-name{font-family:var(--mono);letter-spacing:-.02em;margin:0;font-size:18px;font-weight:500}.badges{flex-wrap:wrap;gap:6px;margin-bottom:16px;display:flex}.badge{border:1px solid var(--border);color:var(--text-secondary);border-radius:999px;padding:2px 8px;font-size:11px}.badge.public{border-color:var(--badge-public-border);color:var(--green);background:var(--badge-public-bg)}.badge.private{border-color:var(--badge-private-border);color:var(--amber);background:var(--badge-private-bg)}.badge.mcp{border-color:var(--badge-mcp-border);color:var(--purple);background:var(--badge-mcp-bg)}.route-summary{margin:0 0 6px;font-size:15px;font-weight:500}.route-desc{color:var(--text-secondary);max-width:640px;margin:0 0 28px}.section{margin-bottom:28px}.section-title{text-transform:uppercase;letter-spacing:.05em;color:var(--text-tertiary);margin:0 0 10px;font-size:12px;font-weight:600}.code-block{background:var(--hljs-bg);border:1px solid var(--border);border-radius:var(--radius);margin:0;padding:14px 16px;overflow-x:auto}.code-block code{font-family:var(--mono);white-space:pre;font-size:12px;line-height:1.6;display:block}.hljs-attr{color:var(--hljs-attr)}.hljs-string{color:var(--hljs-string)}.hljs-number{color:var(--hljs-number)}.hljs-literal,.hljs-keyword{color:var(--hljs-literal)}.hljs-punctuation{color:var(--hljs-punctuation)}.try-block{background:var(--surface);border:1px solid var(--border);border-radius:var(--radius);padding:16px}.field{margin-bottom:12px}.field label{color:var(--text-secondary);margin-bottom:4px;font-size:12px;display:block}.field input{border:1px solid var(--border);background:var(--bg);width:100%;color:var(--text);font-family:var(--mono);border-radius:6px;outline:none;padding:8px 10px;font-size:12px}.field input:focus{border-color:var(--border-strong);background:var(--surface)}.json-editor{flex-direction:column;gap:6px;display:flex}.json-editor-head{justify-content:space-between;align-items:center;gap:8px;display:flex}.json-editor-status{font-family:var(--mono);font-size:11px}.json-editor-status.ok{color:var(--green)}.json-editor-status.err{color:var(--red)}.json-editor-format{border:1px solid var(--border);color:var(--text-secondary);font-family:var(--sans);cursor:pointer;background:0 0;border-radius:4px;padding:2px 8px;font-size:11px}.json-editor-format:hover{border-color:var(--border-strong);color:var(--text)}.json-editor-frame{border:1px solid var(--border);background:var(--hljs-bg);border-radius:6px;min-height:160px;max-height:320px;display:flex;overflow:hidden}.json-editor-frame:focus-within{border-color:var(--border-strong)}.json-editor.invalid .json-editor-frame{border-color:var(--red)}.json-editor-gutter{border-right:1px solid var(--border);min-width:2.75rem;color:var(--text-tertiary);font-family:var(--mono);white-space:pre;text-align:right;-webkit-user-select:none;user-select:none;flex-shrink:0;padding:12px 10px 12px 12px;font-size:12px;line-height:1.6;overflow:hidden}.json-editor-main{flex:1;min-width:0;position:relative}.json-editor-highlight,.json-editor-input{box-sizing:border-box;width:100%;height:100%;font-family:var(--mono);tab-size:2;white-space:pre-wrap;word-break:break-word;border:none;margin:0;padding:12px;font-size:12px;line-height:1.6;position:absolute;inset:0;overflow:auto}.json-editor-highlight{pointer-events:none}.json-editor-highlight code{font-family:inherit;font-size:inherit;line-height:inherit;white-space:pre-wrap;word-break:break-word;display:block}.json-editor-input{resize:none;color:#0000;caret-color:var(--text);background:0 0;outline:none}.json-editor-input::selection{background:color-mix(in srgb, var(--accent) 18%, transparent)}.actions{gap:8px;margin-top:4px;display:flex}.btn{cursor:pointer;font-size:13px;font-weight:500;font-family:var(--sans);border-radius:6px;padding:8px 14px}.btn-primary{background:var(--accent);color:var(--surface);border:none}.btn-primary:hover{opacity:.88}.btn-ghost{color:var(--text-secondary);border:1px solid var(--border);background:0 0}.btn-ghost:hover{border-color:var(--border-strong);color:var(--text)}.response{margin-top:14px}.response-meta{font-family:var(--mono);margin-bottom:6px;font-size:11px}.response-meta.ok{color:var(--green)}.response-meta.err{color:var(--red)}.error-banner{border:1px solid var(--error-border);border-radius:var(--radius);background:var(--error-bg);color:var(--red);padding:12px 14px;font-size:13px}@media (width<=800px){#app{grid-template-rows:auto 1fr auto;grid-template-columns:1fr}.sidebar{height:auto;max-height:220px;position:static}.main{padding:24px 20px}}.route-btn.nav-btn{margin-bottom:2px;font-weight:600}.intro{max-width:640px}.brand-mark{width:var(--logo-size,80px);height:var(--logo-size,80px);border-radius:calc(var(--logo-size,80px) * .22);flex-shrink:0;display:inline-block;overflow:hidden}.brand-mark-img{object-fit:contain;width:100%;height:100%;display:block}.brand-mark-dark,[data-theme=dark] .brand-mark-light{display:none}[data-theme=dark] .brand-mark-dark{display:block}.intro-logo{margin-bottom:16px}.sidebar-mark{flex-shrink:0}.intro-title{letter-spacing:-.02em;margin:0 0 4px;font-size:28px;font-weight:600}.intro-version{color:var(--text-secondary);margin:0 0 16px;font-size:13px}.intro-text{color:var(--text-secondary);margin:0 0 20px;font-size:15px;line-height:1.6}.intro-actions{flex-wrap:wrap;align-items:center;gap:12px;margin-bottom:32px;display:flex}.intro-link{color:var(--text-secondary);font-size:14px;text-decoration:none}.intro-link:hover{color:var(--text);text-decoration:underline}.section-lead{color:var(--text-secondary);margin:0 0 16px;font-size:14px;line-height:1.55}.mcp-connect{border:1px solid var(--border);border-radius:calc(var(--radius) + 4px);background:linear-gradient(180deg, color-mix(in srgb, var(--badge-mcp-bg) 42%, var(--surface)) 0%, var(--surface) 120px);margin-top:36px;padding:22px 22px 0;overflow:hidden;box-shadow:0 1px 2px #0000000a}[data-theme=dark] .mcp-connect{box-shadow:0 1px 3px #00000047}.mcp-connect-head{justify-content:space-between;align-items:flex-start;gap:16px;margin-bottom:20px;display:flex}.mcp-connect-title{letter-spacing:-.02em;color:var(--text);margin:0 0 4px;font-size:18px;font-weight:600}.mcp-connect-lead{color:var(--text-secondary);margin:0;font-size:14px;line-height:1.5}.mcp-connect-badge{flex-shrink:0;margin-top:2px}.mcp-endpoint{margin-bottom:16px}.mcp-endpoint-label{letter-spacing:.06em;text-transform:uppercase;color:var(--text-tertiary);margin-bottom:8px;font-size:11px;font-weight:600;display:block}.mcp-endpoint-field{border:1px solid var(--border);border-radius:var(--radius);background:var(--hljs-bg);align-items:stretch;display:flex;overflow:hidden;box-shadow:inset 0 1px #ffffff08}.mcp-endpoint-url{min-width:0;font-family:var(--mono);word-break:break-all;color:var(--text);flex:1;padding:11px 14px;font-size:12px;line-height:1.5}.mcp-endpoint-copy{border:0;border-left:1px solid var(--border);background:var(--surface);color:var(--text-secondary);font:inherit;cursor:pointer;flex-shrink:0;padding:0 16px;font-size:12px;font-weight:500;transition:background-color .15s,color .15s}.mcp-endpoint-copy:hover{background:var(--accent-soft);color:var(--text)}.mcp-endpoint-note{color:var(--text-secondary);margin:10px 0 0;font-size:13px;line-height:1.5}.mcp-tools{margin-bottom:0;padding-bottom:18px}.mcp-tools-link{color:var(--accent);font:inherit;cursor:pointer;text-align:left;background:0 0;border:0;padding:0;font-size:14px;font-weight:500;line-height:1.4}.mcp-tools-link:hover{text-decoration:underline}.mcp-clients{border-top:1px solid var(--border);margin:0 -22px}.mcp-client-tabs{border-bottom:1px solid var(--border);scrollbar-width:none;background:0 0;gap:0;padding:0 22px;display:flex;overflow-x:auto}.mcp-client-tabs::-webkit-scrollbar{display:none}.mcp-client-tab{color:var(--text-secondary);font:inherit;white-space:nowrap;cursor:pointer;background:0 0;border:0;border-bottom:2px solid #0000;border-radius:0;flex:none;margin-bottom:-1px;padding:12px 14px;font-size:13px;font-weight:500;transition:color .15s,border-color .15s}.mcp-client-tab:hover{color:var(--text)}.mcp-client-tab[aria-selected=true]{color:var(--text);border-bottom-color:var(--accent);box-shadow:none}[data-theme=dark] .mcp-client-tab[aria-selected=true]{box-shadow:none}.mcp-client-panels{padding:18px 22px 22px}.mcp-client-panel[hidden]{display:none}.mcp-client-meta{margin-bottom:8px}.mcp-client-path{background:var(--accent-soft);color:var(--text-secondary);font-family:var(--mono);border-radius:6px;align-items:center;padding:3px 8px;font-size:11px;line-height:1.4;display:inline-flex}.mcp-client-hint{color:var(--text-secondary);margin:0 0 14px;font-size:13px;line-height:1.55}.mcp-client-hint code{font-family:var(--mono);font-size:12px}.mcp-code-panel{border:0;border-top:1px solid var(--border);background:var(--hljs-bg);border-radius:0;margin:12px -22px -22px;overflow:hidden}.mcp-code-toolbar{border-bottom:1px solid var(--border);background:color-mix(in srgb, var(--surface) 72%, var(--hljs-bg));justify-content:space-between;align-items:center;gap:12px;padding:8px 22px;display:flex}.mcp-code-lang{letter-spacing:.06em;text-transform:uppercase;color:var(--text-tertiary);font-size:11px;font-weight:600}.mcp-code-copy{border:1px solid var(--border);background:var(--surface);color:var(--text-secondary);font:inherit;cursor:pointer;border-radius:6px;padding:4px 10px;font-size:12px;font-weight:500;transition:background-color .15s,color .15s,border-color .15s}.mcp-code-copy:hover{color:var(--text);border-color:var(--border-strong)}.mcp-code-copy.is-copied,.mcp-endpoint-copy.is-copied{color:var(--green);border-color:var(--badge-public-border)}.mcp-steps{color:var(--text-secondary);margin:0;padding-left:1.2rem;font-size:13px;line-height:1.65}.mcp-steps li+li{margin-top:8px}.mcp-client-panel .code-block{border:0;border-radius:0;margin:0}.btn-sm{padding:4px 10px;font-size:12px}
|
|
2
|
+
/*$vite$:1*/
|
|
@@ -0,0 +1,25 @@
|
|
|
1
|
+
<!DOCTYPE html>
|
|
2
|
+
<html lang="en">
|
|
3
|
+
<head>
|
|
4
|
+
<meta charset="UTF-8">
|
|
5
|
+
<meta name="viewport" content="width=device-width, initial-scale=1.0">
|
|
6
|
+
<title>API Docs</title>
|
|
7
|
+
<script>(function(){var t=localStorage.getItem('callsheet-theme');if(t!=='light'&&t!=='dark'){t=matchMedia('(prefers-color-scheme: dark)').matches?'dark':'light';}document.documentElement.dataset.theme=t;})();</script>
|
|
8
|
+
<link rel="stylesheet" href="./assets/style.css">
|
|
9
|
+
<!--CALLSHEET_CONFIG-->
|
|
10
|
+
</head>
|
|
11
|
+
<body>
|
|
12
|
+
<div id="app" class="loading">
|
|
13
|
+
<p class="loading-text">Loading…</p>
|
|
14
|
+
</div>
|
|
15
|
+
<footer class="footer">
|
|
16
|
+
<a class="footer-link" href="https://github.com/logfoxai/callspec" target="_blank" rel="noopener">
|
|
17
|
+
<span class="footer-label">Powered by</span>
|
|
18
|
+
<img class="footer-logo footer-logo-light" src="./assets/callspec-mark-light.svg" width="18" height="18" alt="">
|
|
19
|
+
<img class="footer-logo footer-logo-dark" src="./assets/callspec-mark-dark.svg" width="18" height="18" alt="">
|
|
20
|
+
<span class="footer-name">callspec</span>
|
|
21
|
+
</a>
|
|
22
|
+
</footer>
|
|
23
|
+
<script src="./assets/app.js"></script>
|
|
24
|
+
</body>
|
|
25
|
+
</html>
|
package/dist/client.d.ts
ADDED
|
@@ -0,0 +1,15 @@
|
|
|
1
|
+
export type ClientOptions = {
|
|
2
|
+
endpoint: string;
|
|
3
|
+
fetchOptions?: Omit<RequestInit, 'method' | 'body'>;
|
|
4
|
+
onError?: (error: unknown) => void;
|
|
5
|
+
};
|
|
6
|
+
export declare class Non200Response<T = unknown> extends Error {
|
|
7
|
+
status: number;
|
|
8
|
+
response: T;
|
|
9
|
+
constructor(status: number, response: T);
|
|
10
|
+
}
|
|
11
|
+
export declare function client<A extends {
|
|
12
|
+
name: string;
|
|
13
|
+
input: unknown;
|
|
14
|
+
output: unknown;
|
|
15
|
+
}>(name: A['name'], input: A['input'], options?: ClientOptions): Promise<A['output']>;
|
package/dist/client.js
ADDED
|
@@ -0,0 +1,49 @@
|
|
|
1
|
+
"use strict";
|
|
2
|
+
Object.defineProperty(exports, "__esModule", { value: true });
|
|
3
|
+
exports.Non200Response = void 0;
|
|
4
|
+
exports.client = client;
|
|
5
|
+
const serializer_1 = require("./serializer");
|
|
6
|
+
class Non200Response extends Error {
|
|
7
|
+
constructor(status, response) {
|
|
8
|
+
super('Non200Response');
|
|
9
|
+
this.name = 'Non200Response';
|
|
10
|
+
this.status = status;
|
|
11
|
+
this.response = response;
|
|
12
|
+
}
|
|
13
|
+
}
|
|
14
|
+
exports.Non200Response = Non200Response;
|
|
15
|
+
async function client(name, input, options) {
|
|
16
|
+
const endpoint = options?.endpoint ?? '';
|
|
17
|
+
let resp;
|
|
18
|
+
try {
|
|
19
|
+
const { headers: fetchHeaders, ...restFetchOptions } = options?.fetchOptions ?? {};
|
|
20
|
+
const headers = new Headers({ 'Content-Type': 'application/json' });
|
|
21
|
+
if (fetchHeaders) {
|
|
22
|
+
new Headers(fetchHeaders).forEach((value, key) => headers.set(key, value));
|
|
23
|
+
}
|
|
24
|
+
resp = await fetch(`${endpoint}/${name}`, {
|
|
25
|
+
...restFetchOptions,
|
|
26
|
+
method: 'POST',
|
|
27
|
+
headers,
|
|
28
|
+
body: JSON.stringify(input ?? {}),
|
|
29
|
+
});
|
|
30
|
+
}
|
|
31
|
+
catch (err) {
|
|
32
|
+
options?.onError?.(err);
|
|
33
|
+
throw err;
|
|
34
|
+
}
|
|
35
|
+
const data = await resp.text();
|
|
36
|
+
let responseData;
|
|
37
|
+
if (data.trim().length) {
|
|
38
|
+
try {
|
|
39
|
+
responseData = (0, serializer_1.deserializeResponse)(JSON.parse(data));
|
|
40
|
+
}
|
|
41
|
+
catch {
|
|
42
|
+
responseData = data;
|
|
43
|
+
}
|
|
44
|
+
}
|
|
45
|
+
if (!resp.ok) {
|
|
46
|
+
throw new Non200Response(resp.status, responseData);
|
|
47
|
+
}
|
|
48
|
+
return responseData;
|
|
49
|
+
}
|
|
@@ -0,0 +1,11 @@
|
|
|
1
|
+
"use strict";
|
|
2
|
+
Object.defineProperty(exports, "__esModule", { value: true });
|
|
3
|
+
exports.defineRegistry = defineRegistry;
|
|
4
|
+
function defineRegistry(routes) {
|
|
5
|
+
for (const [name, route] of Object.entries(routes)) {
|
|
6
|
+
if (route.handler.length !== 2) {
|
|
7
|
+
throw new Error(`Registry route "${name}" handler must accept (input, ctx) — arity 2, got ${route.handler.length}`);
|
|
8
|
+
}
|
|
9
|
+
}
|
|
10
|
+
return routes;
|
|
11
|
+
}
|
|
@@ -0,0 +1,9 @@
|
|
|
1
|
+
import type { RouteDef, RouteHandler } from './types';
|
|
2
|
+
export declare function defineRoute<TInput, TOutput, Ctx>(def: {
|
|
3
|
+
input: RouteDef<TInput, TOutput, Ctx>['input'];
|
|
4
|
+
output?: RouteDef<TInput, TOutput, Ctx>['output'];
|
|
5
|
+
meta: RouteDef<TInput, TOutput, Ctx>['meta'];
|
|
6
|
+
access?: RouteDef<TInput, TOutput, Ctx>['access'];
|
|
7
|
+
mcp?: RouteDef<TInput, TOutput, Ctx>['mcp'];
|
|
8
|
+
handler: RouteHandler<TInput, TOutput, Ctx>;
|
|
9
|
+
}): RouteDef<TInput, TOutput, Ctx>;
|
|
@@ -0,0 +1,16 @@
|
|
|
1
|
+
"use strict";
|
|
2
|
+
Object.defineProperty(exports, "__esModule", { value: true });
|
|
3
|
+
exports.defineRoute = defineRoute;
|
|
4
|
+
function defineRoute(def) {
|
|
5
|
+
if (def.handler.length !== 2) {
|
|
6
|
+
throw new Error(`Route handler must accept (input, ctx) — arity 2, got ${def.handler.length}`);
|
|
7
|
+
}
|
|
8
|
+
return {
|
|
9
|
+
input: def.input,
|
|
10
|
+
output: def.output,
|
|
11
|
+
meta: def.meta,
|
|
12
|
+
access: def.access ?? 'private',
|
|
13
|
+
mcp: def.mcp,
|
|
14
|
+
handler: def.handler,
|
|
15
|
+
};
|
|
16
|
+
}
|
package/dist/errors.d.ts
ADDED
|
@@ -0,0 +1,10 @@
|
|
|
1
|
+
export declare class CallspecValidationError extends Error {
|
|
2
|
+
errors: Record<string, string>;
|
|
3
|
+
constructor(errors: Record<string, string>);
|
|
4
|
+
}
|
|
5
|
+
export declare class CallspecUnauthorizedError extends Error {
|
|
6
|
+
constructor();
|
|
7
|
+
}
|
|
8
|
+
export declare class CallspecNotFoundError extends Error {
|
|
9
|
+
constructor(name: string);
|
|
10
|
+
}
|
package/dist/errors.js
ADDED
|
@@ -0,0 +1,25 @@
|
|
|
1
|
+
"use strict";
|
|
2
|
+
Object.defineProperty(exports, "__esModule", { value: true });
|
|
3
|
+
exports.CallspecNotFoundError = exports.CallspecUnauthorizedError = exports.CallspecValidationError = void 0;
|
|
4
|
+
class CallspecValidationError extends Error {
|
|
5
|
+
constructor(errors) {
|
|
6
|
+
super('VALIDATION_ERROR');
|
|
7
|
+
this.name = 'CallspecValidationError';
|
|
8
|
+
this.errors = errors;
|
|
9
|
+
}
|
|
10
|
+
}
|
|
11
|
+
exports.CallspecValidationError = CallspecValidationError;
|
|
12
|
+
class CallspecUnauthorizedError extends Error {
|
|
13
|
+
constructor() {
|
|
14
|
+
super('UNAUTHORIZED');
|
|
15
|
+
this.name = 'CallspecUnauthorizedError';
|
|
16
|
+
}
|
|
17
|
+
}
|
|
18
|
+
exports.CallspecUnauthorizedError = CallspecUnauthorizedError;
|
|
19
|
+
class CallspecNotFoundError extends Error {
|
|
20
|
+
constructor(name) {
|
|
21
|
+
super(`Route not found: ${name}`);
|
|
22
|
+
this.name = 'CallspecNotFoundError';
|
|
23
|
+
}
|
|
24
|
+
}
|
|
25
|
+
exports.CallspecNotFoundError = CallspecNotFoundError;
|
|
@@ -0,0 +1,16 @@
|
|
|
1
|
+
"use strict";
|
|
2
|
+
Object.defineProperty(exports, "__esModule", { value: true });
|
|
3
|
+
exports.executeRoute = executeRoute;
|
|
4
|
+
const errors_1 = require("./errors");
|
|
5
|
+
const serializer_1 = require("./serializer");
|
|
6
|
+
async function executeRoute(route, rawInput, ctx) {
|
|
7
|
+
if (route.access === 'private' && (ctx === undefined || ctx === null)) {
|
|
8
|
+
throw new errors_1.CallspecUnauthorizedError();
|
|
9
|
+
}
|
|
10
|
+
const inputResult = route.input(rawInput);
|
|
11
|
+
if (!inputResult.isValid) {
|
|
12
|
+
throw new errors_1.CallspecValidationError(inputResult.errors);
|
|
13
|
+
}
|
|
14
|
+
const result = await route.handler(inputResult.value, ctx);
|
|
15
|
+
return (0, serializer_1.serializeResponse)(result);
|
|
16
|
+
}
|
package/dist/index.d.ts
ADDED
|
@@ -0,0 +1,17 @@
|
|
|
1
|
+
export { defineRoute } from './defineRoute';
|
|
2
|
+
export { defineRegistry } from './defineRegistry';
|
|
3
|
+
export type { Registry } from './defineRegistry';
|
|
4
|
+
export { executeRoute } from './executeRoute';
|
|
5
|
+
export { mountRegistry } from './mountRegistry';
|
|
6
|
+
export type { MountRegistryOptions, MountRegistryDocsOptions } from './mountRegistry';
|
|
7
|
+
export { mountCallsheet, renderCallsheetPage, parseCallspecOpenApi } from './callsheet';
|
|
8
|
+
export type { MountCallsheetOptions, CallsheetConfig, CallsheetRoute, CallsheetSpec } from './callsheet';
|
|
9
|
+
export { mountMcp } from './mountMcp';
|
|
10
|
+
export type { MountMcpOptions } from './mountMcp';
|
|
11
|
+
export { emitOpenApi } from './openapi';
|
|
12
|
+
export type { OpenApiOptions } from './openapi';
|
|
13
|
+
export { client, Non200Response } from './client';
|
|
14
|
+
export type { ClientOptions } from './client';
|
|
15
|
+
export { serializeResponse, deserializeResponse } from './serializer';
|
|
16
|
+
export { CallspecValidationError, CallspecUnauthorizedError, CallspecNotFoundError, } from './errors';
|
|
17
|
+
export type { RouteMeta, McpRouteConfig, RouteAccess, RouteDef, RouteHandler, ContextResolver, InferRegistry, InferRouteInput, InferRouteOutput, } from './types';
|
package/dist/index.js
ADDED
|
@@ -0,0 +1,29 @@
|
|
|
1
|
+
"use strict";
|
|
2
|
+
Object.defineProperty(exports, "__esModule", { value: true });
|
|
3
|
+
exports.CallspecNotFoundError = exports.CallspecUnauthorizedError = exports.CallspecValidationError = exports.deserializeResponse = exports.serializeResponse = exports.Non200Response = exports.client = exports.emitOpenApi = exports.mountMcp = exports.parseCallspecOpenApi = exports.renderCallsheetPage = exports.mountCallsheet = exports.mountRegistry = exports.executeRoute = exports.defineRegistry = exports.defineRoute = void 0;
|
|
4
|
+
var defineRoute_1 = require("./defineRoute");
|
|
5
|
+
Object.defineProperty(exports, "defineRoute", { enumerable: true, get: function () { return defineRoute_1.defineRoute; } });
|
|
6
|
+
var defineRegistry_1 = require("./defineRegistry");
|
|
7
|
+
Object.defineProperty(exports, "defineRegistry", { enumerable: true, get: function () { return defineRegistry_1.defineRegistry; } });
|
|
8
|
+
var executeRoute_1 = require("./executeRoute");
|
|
9
|
+
Object.defineProperty(exports, "executeRoute", { enumerable: true, get: function () { return executeRoute_1.executeRoute; } });
|
|
10
|
+
var mountRegistry_1 = require("./mountRegistry");
|
|
11
|
+
Object.defineProperty(exports, "mountRegistry", { enumerable: true, get: function () { return mountRegistry_1.mountRegistry; } });
|
|
12
|
+
var callsheet_1 = require("./callsheet");
|
|
13
|
+
Object.defineProperty(exports, "mountCallsheet", { enumerable: true, get: function () { return callsheet_1.mountCallsheet; } });
|
|
14
|
+
Object.defineProperty(exports, "renderCallsheetPage", { enumerable: true, get: function () { return callsheet_1.renderCallsheetPage; } });
|
|
15
|
+
Object.defineProperty(exports, "parseCallspecOpenApi", { enumerable: true, get: function () { return callsheet_1.parseCallspecOpenApi; } });
|
|
16
|
+
var mountMcp_1 = require("./mountMcp");
|
|
17
|
+
Object.defineProperty(exports, "mountMcp", { enumerable: true, get: function () { return mountMcp_1.mountMcp; } });
|
|
18
|
+
var openapi_1 = require("./openapi");
|
|
19
|
+
Object.defineProperty(exports, "emitOpenApi", { enumerable: true, get: function () { return openapi_1.emitOpenApi; } });
|
|
20
|
+
var client_1 = require("./client");
|
|
21
|
+
Object.defineProperty(exports, "client", { enumerable: true, get: function () { return client_1.client; } });
|
|
22
|
+
Object.defineProperty(exports, "Non200Response", { enumerable: true, get: function () { return client_1.Non200Response; } });
|
|
23
|
+
var serializer_1 = require("./serializer");
|
|
24
|
+
Object.defineProperty(exports, "serializeResponse", { enumerable: true, get: function () { return serializer_1.serializeResponse; } });
|
|
25
|
+
Object.defineProperty(exports, "deserializeResponse", { enumerable: true, get: function () { return serializer_1.deserializeResponse; } });
|
|
26
|
+
var errors_1 = require("./errors");
|
|
27
|
+
Object.defineProperty(exports, "CallspecValidationError", { enumerable: true, get: function () { return errors_1.CallspecValidationError; } });
|
|
28
|
+
Object.defineProperty(exports, "CallspecUnauthorizedError", { enumerable: true, get: function () { return errors_1.CallspecUnauthorizedError; } });
|
|
29
|
+
Object.defineProperty(exports, "CallspecNotFoundError", { enumerable: true, get: function () { return errors_1.CallspecNotFoundError; } });
|