@farthershore/cli 0.14.2 → 0.14.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 +20 -1
- package/dist/index.js +75 -75
- package/dist/mcp.js +2 -2
- package/package.json +3 -3
package/dist/mcp.js
CHANGED
|
@@ -77,7 +77,7 @@ Set the \`cycles\` parameter to \`"ref"\` to resolve cyclical schemas with defs.
|
|
|
77
77
|
]))`;continue}else if(o[u]==="$"){r+=`($|(?=[\r
|
|
78
78
|
]))`;continue}}if(n.s&&o[u]==="."){r+=a?`${o[u]}\r
|
|
79
79
|
`:`[${o[u]}\r
|
|
80
|
-
]`;continue}r+=o[u],o[u]==="\\"?i=!0:a&&o[u]==="]"?a=!1:!a&&o[u]==="["&&(a=!0)}try{new RegExp(r)}catch{return console.warn(`Could not convert regex pattern at ${e.currentPath.join("/")} to a flag-independent form! Falling back to the flag-ignorant source`),t.source}return r}function xl(t,e){if(e.target==="openAi"&&console.warn("Warning: OpenAI may not support records in schemas! Try an array of key-value pairs instead."),e.target==="openApi3"&&t.keyType?._def.typeName===I.ZodEnum)return{type:"object",required:t.keyType._def.values,properties:t.keyType._def.values.reduce((o,r)=>({...o,[r]:q(t.valueType._def,{...e,currentPath:[...e.currentPath,"properties",r]})??$e(e)}),{}),additionalProperties:e.rejectedAdditionalProperties};let n={type:"object",additionalProperties:q(t.valueType._def,{...e,currentPath:[...e.currentPath,"additionalProperties"]})??e.allowedAdditionalProperties};if(e.target==="openApi3")return n;if(t.keyType?._def.typeName===I.ZodString&&t.keyType._def.checks?.length){let{type:o,...r}=bl(t.keyType._def,e);return{...n,propertyNames:r}}else{if(t.keyType?._def.typeName===I.ZodEnum)return{...n,propertyNames:{enum:t.keyType._def.values}};if(t.keyType?._def.typeName===I.ZodBranded&&t.keyType._def.type._def.typeName===I.ZodString&&t.keyType._def.type._def.checks?.length){let{type:o,...r}=vl(t.keyType._def,e);return{...n,propertyNames:r}}}return n}function ik(t,e){if(e.mapStrategy==="record")return xl(t,e);let n=q(t.keyType._def,{...e,currentPath:[...e.currentPath,"items","items","0"]})||$e(e),o=q(t.valueType._def,{...e,currentPath:[...e.currentPath,"items","items","1"]})||$e(e);return{type:"array",maxItems:125,items:{type:"array",items:[n,o],minItems:2,maxItems:2}}}function ak(t){let e=t.values,o=Object.keys(t.values).filter(i=>typeof e[e[i]]!="number").map(i=>e[i]),r=Array.from(new Set(o.map(i=>typeof i)));return{type:r.length===1?r[0]==="string"?"string":"number":["string","number"],enum:o}}function sk(t){return t.target==="openAi"?void 0:{not:$e({...t,currentPath:[...t.currentPath,"not"]})}}function ck(t){return t.target==="openApi3"?{enum:["null"],nullable:!0}:{type:"null"}}var _a={ZodString:"string",ZodNumber:"number",ZodBigInt:"integer",ZodBoolean:"boolean",ZodNull:"null"};function lk(t,e){if(e.target==="openApi3")return uk(t,e);let n=t.options instanceof Map?Array.from(t.options.values()):t.options;if(n.every(o=>o._def.typeName in _a&&(!o._def.checks||!o._def.checks.length))){let o=n.reduce((r,i)=>{let a=_a[i._def.typeName];return a&&!r.includes(a)?[...r,a]:r},[]);return{type:o.length>1?o:o[0]}}else if(n.every(o=>o._def.typeName==="ZodLiteral"&&!o.description)){let o=n.reduce((r,i)=>{let a=typeof i._def.value;switch(a){case"string":case"number":case"boolean":return[...r,a];case"bigint":return[...r,"integer"];case"object":if(i._def.value===null)return[...r,"null"];default:return r}},[]);if(o.length===n.length){let r=o.filter((i,a,c)=>c.indexOf(i)===a);return{type:r.length>1?r:r[0],enum:n.reduce((i,a)=>i.includes(a._def.value)?i:[...i,a._def.value],[])}}}else if(n.every(o=>o._def.typeName==="ZodEnum"))return{type:"string",enum:n.reduce((o,r)=>[...o,...r._def.values.filter(i=>!o.includes(i))],[])};return uk(t,e)}var uk=(t,e)=>{let n=(t.options instanceof Map?Array.from(t.options.values()):t.options).map((o,r)=>q(o._def,{...e,currentPath:[...e.currentPath,"anyOf",`${r}`]})).filter(o=>!!o&&(!e.strictUnions||typeof o=="object"&&Object.keys(o).length>0));return n.length?{anyOf:n}:void 0};function dk(t,e){if(["ZodString","ZodNumber","ZodBigInt","ZodBoolean","ZodNull"].includes(t.innerType._def.typeName)&&(!t.innerType._def.checks||!t.innerType._def.checks.length))return e.target==="openApi3"?{type:_a[t.innerType._def.typeName],nullable:!0}:{type:[_a[t.innerType._def.typeName],"null"]};if(e.target==="openApi3"){let o=q(t.innerType._def,{...e,currentPath:[...e.currentPath]});return o&&"$ref"in o?{allOf:[o],nullable:!0}:o&&{...o,nullable:!0}}let n=q(t.innerType._def,{...e,currentPath:[...e.currentPath,"anyOf","0"]});return n&&{anyOf:[n,{type:"null"}]}}function pk(t,e){let n={type:"number"};if(!t.checks)return n;for(let o of t.checks)switch(o.kind){case"int":n.type="integer",_h(n,"type",o.message,e);break;case"min":e.target==="jsonSchema7"?o.inclusive?ne(n,"minimum",o.value,o.message,e):ne(n,"exclusiveMinimum",o.value,o.message,e):(o.inclusive||(n.exclusiveMinimum=!0),ne(n,"minimum",o.value,o.message,e));break;case"max":e.target==="jsonSchema7"?o.inclusive?ne(n,"maximum",o.value,o.message,e):ne(n,"exclusiveMaximum",o.value,o.message,e):(o.inclusive||(n.exclusiveMaximum=!0),ne(n,"maximum",o.value,o.message,e));break;case"multipleOf":ne(n,"multipleOf",o.value,o.message,e);break}return n}function mk(t,e){let n=e.target==="openAi",o={type:"object",properties:{}},r=[],i=t.shape();for(let c in i){let u=i[c];if(u===void 0||u._def===void 0)continue;let l=JR(u);l&&n&&(u._def.typeName==="ZodOptional"&&(u=u._def.innerType),u.isNullable()||(u=u.nullable()),l=!1);let d=q(u._def,{...e,currentPath:[...e.currentPath,"properties",c],propertyPath:[...e.currentPath,"properties",c]});d!==void 0&&(o.properties[c]=d,l||r.push(c))}r.length&&(o.required=r);let a=GR(t,e);return a!==void 0&&(o.additionalProperties=a),o}function GR(t,e){if(t.catchall._def.typeName!=="ZodNever")return q(t.catchall._def,{...e,currentPath:[...e.currentPath,"additionalProperties"]});switch(t.unknownKeys){case"passthrough":return e.allowedAdditionalProperties;case"strict":return e.rejectedAdditionalProperties;case"strip":return e.removeAdditionalStrategy==="strict"?e.allowedAdditionalProperties:e.rejectedAdditionalProperties}}function JR(t){try{return t.isOptional()}catch{return!0}}var fk=(t,e)=>{if(e.currentPath.toString()===e.propertyPath?.toString())return q(t.innerType._def,e);let n=q(t.innerType._def,{...e,currentPath:[...e.currentPath,"anyOf","1"]});return n?{anyOf:[{not:$e(e)},n]}:$e(e)};var hk=(t,e)=>{if(e.pipeStrategy==="input")return q(t.in._def,e);if(e.pipeStrategy==="output")return q(t.out._def,e);let n=q(t.in._def,{...e,currentPath:[...e.currentPath,"allOf","0"]}),o=q(t.out._def,{...e,currentPath:[...e.currentPath,"allOf",n?"1":"0"]});return{allOf:[n,o].filter(r=>r!==void 0)}};function gk(t,e){return q(t.type._def,e)}function _k(t,e){let o={type:"array",uniqueItems:!0,items:q(t.valueType._def,{...e,currentPath:[...e.currentPath,"items"]})};return t.minSize&&ne(o,"minItems",t.minSize.value,t.minSize.message,e),t.maxSize&&ne(o,"maxItems",t.maxSize.value,t.maxSize.message,e),o}function yk(t,e){return t.rest?{type:"array",minItems:t.items.length,items:t.items.map((n,o)=>q(n._def,{...e,currentPath:[...e.currentPath,"items",`${o}`]})).reduce((n,o)=>o===void 0?n:[...n,o],[]),additionalItems:q(t.rest._def,{...e,currentPath:[...e.currentPath,"additionalItems"]})}:{type:"array",minItems:t.items.length,maxItems:t.items.length,items:t.items.map((n,o)=>q(n._def,{...e,currentPath:[...e.currentPath,"items",`${o}`]})).reduce((n,o)=>o===void 0?n:[...n,o],[])}}function vk(t){return{not:$e(t)}}function bk(t){return $e(t)}var xk=(t,e)=>q(t.innerType._def,e);var kk=(t,e,n)=>{switch(e){case I.ZodString:return bl(t,n);case I.ZodNumber:return pk(t,n);case I.ZodObject:return mk(t,n);case I.ZodBigInt:return Wx(t,n);case I.ZodBoolean:return Yx();case I.ZodDate:return yh(t,n);case I.ZodUndefined:return vk(n);case I.ZodNull:return ck(n);case I.ZodArray:return Jx(t,n);case I.ZodUnion:case I.ZodDiscriminatedUnion:return lk(t,n);case I.ZodIntersection:return rk(t,n);case I.ZodTuple:return yk(t,n);case I.ZodRecord:return xl(t,n);case I.ZodLiteral:return nk(t,n);case I.ZodEnum:return tk(t);case I.ZodNativeEnum:return ak(t);case I.ZodNullable:return dk(t,n);case I.ZodOptional:return fk(t,n);case I.ZodMap:return ik(t,n);case I.ZodSet:return _k(t,n);case I.ZodLazy:return()=>t.getter()._def;case I.ZodPromise:return gk(t,n);case I.ZodNaN:case I.ZodNever:return sk(n);case I.ZodEffects:return ek(t,n);case I.ZodAny:return $e(n);case I.ZodUnknown:return bk(n);case I.ZodDefault:return Qx(t,n);case I.ZodBranded:return vl(t,n);case I.ZodReadonly:return xk(t,n);case I.ZodCatch:return Xx(t,n);case I.ZodPipeline:return hk(t,n);case I.ZodFunction:case I.ZodVoid:case I.ZodSymbol:return;default:return(o=>{})(e)}};function q(t,e,n=!1){let o=e.seen.get(t);if(e.override){let c=e.override?.(t,e,o,n);if(c!==Hx)return c}if(o&&!n){let c=WR(o,e);if(c!==void 0)return c}let r={def:t,path:e.currentPath,jsonSchema:void 0};e.seen.set(t,r);let i=kk(t,t.typeName,e),a=typeof i=="function"?q(i(),e):i;if(a&&YR(t,e,a),e.postProcess){let c=e.postProcess(a,t,e);return r.jsonSchema=a,c}return r.jsonSchema=a,a}var WR=(t,e)=>{switch(e.$refStrategy){case"root":return{$ref:t.path.join("/")};case"relative":return{$ref:yl(e.currentPath,t.path)};case"none":case"seen":return t.path.length<e.currentPath.length&&t.path.every((n,o)=>e.currentPath[o]===n)?(console.warn(`Recursive reference detected at ${e.currentPath.join("/")}! Defaulting to any`),$e(e)):e.$refStrategy==="seen"?$e(e):void 0}},YR=(t,e,n)=>(t.description&&(n.description=t.description,e.markdownDescription&&(n.markdownDescription=t.description)),n);var xh=(t,e)=>{let n=Gx(e),o=typeof e=="object"&&e.definitions?Object.entries(e.definitions).reduce((u,[l,d])=>({...u,[l]:q(d._def,{...n,currentPath:[...n.basePath,n.definitionPath,l]},!0)??$e(n)}),{}):void 0,r=typeof e=="string"?e:e?.nameStrategy==="title"?void 0:e?.name,i=q(t._def,r===void 0?n:{...n,currentPath:[...n.basePath,n.definitionPath,r]},!1)??$e(n),a=typeof e=="object"&&e.name!==void 0&&e.nameStrategy==="title"?e.name:void 0;a!==void 0&&(i.title=a),n.flags.hasReferencedOpenAiAnyType&&(o||(o={}),o[n.openAiAnyTypeName]||(o[n.openAiAnyTypeName]={type:["string","number","integer","boolean","array","null"],items:{$ref:n.$refStrategy==="relative"?"1":[...n.basePath,n.definitionPath,n.openAiAnyTypeName].join("/")}}));let c=r===void 0?o?{...i,[n.definitionPath]:o}:i:{$ref:[...n.$refStrategy==="relative"?[]:n.basePath,n.definitionPath,r].join("/"),[n.definitionPath]:{...o,[r]:i}};return n.target==="jsonSchema7"?c.$schema="http://json-schema.org/draft-07/schema#":(n.target==="jsonSchema2019-09"||n.target==="openAi")&&(c.$schema="https://json-schema.org/draft/2019-09/schema#"),n.target==="openAi"&&("anyOf"in c||"oneOf"in c||"allOf"in c||"type"in c&&Array.isArray(c.type))&&console.warn("Warning: OpenAI may not support schemas with unions as roots! Try wrapping it in an object property."),c};function XR(t){return!t||t==="jsonSchema7"||t==="draft-7"?"draft-7":t==="jsonSchema2019-09"||t==="draft-2020-12"?"draft-2020-12":"draft-7"}function kh(t,e){return gt(t)?Gr(t,{target:XR(e?.target),io:e?.pipeStrategy??"input"}):xh(t,{strictUnions:e?.strictUnions??!0,pipeStrategy:e?.pipeStrategy??"input"})}function $h(t){let n=Ir(t)?.method;if(!n)throw new Error("Schema is missing a method literal");let o=_l(n);if(typeof o!="string")throw new Error("Schema method literal must be a string");return o}function Sh(t,e){let n=wr(t,e);if(!n.success)throw n.error;return n.data}var QR=6e4,kl=class{constructor(e){this._options=e,this._requestMessageId=0,this._requestHandlers=new Map,this._requestHandlerAbortControllers=new Map,this._notificationHandlers=new Map,this._responseHandlers=new Map,this._progressHandlers=new Map,this._timeoutInfo=new Map,this._pendingDebouncedNotifications=new Set,this._taskProgressTokens=new Map,this._requestResolvers=new Map,this.setNotificationHandler(Ku,n=>{this._oncancel(n)}),this.setNotificationHandler(Ju,n=>{this._onprogress(n)}),this.setRequestHandler(Gu,n=>({})),this._taskStore=e?.taskStore,this._taskMessageQueue=e?.taskMessageQueue,this._taskStore&&(this.setRequestHandler(Wu,async(n,o)=>{let r=await this._taskStore.getTask(n.params.taskId,o.sessionId);if(!r)throw new j(M.InvalidParams,"Failed to retrieve task: Task not found");return{...r}}),this.setRequestHandler(Xu,async(n,o)=>{let r=async()=>{let i=n.params.taskId;if(this._taskMessageQueue){let c;for(;c=await this._taskMessageQueue.dequeue(i,o.sessionId);){if(c.type==="response"||c.type==="error"){let u=c.message,l=u.id,d=this._requestResolvers.get(l);if(d)if(this._requestResolvers.delete(l),c.type==="response")d(u);else{let p=u,m=new j(p.error.code,p.error.message,p.error.data);d(m)}else{let p=c.type==="response"?"Response":"Error";this._onerror(new Error(`${p} handler missing for request ${l}`))}continue}await this._transport?.send(c.message,{relatedRequestId:o.requestId})}}let a=await this._taskStore.getTask(i,o.sessionId);if(!a)throw new j(M.InvalidParams,`Task not found: ${i}`);if(!Er(a.status))return await this._waitForTaskUpdate(i,o.signal),await r();if(Er(a.status)){let c=await this._taskStore.getTaskResult(i,o.sessionId);return this._clearTaskQueue(i),{...c,_meta:{...c._meta,[xr]:{taskId:i}}}}return await r()};return await r()}),this.setRequestHandler(Qu,async(n,o)=>{try{let{tasks:r,nextCursor:i}=await this._taskStore.listTasks(n.params?.cursor,o.sessionId);return{tasks:r,nextCursor:i,_meta:{}}}catch(r){throw new j(M.InvalidParams,`Failed to list tasks: ${r instanceof Error?r.message:String(r)}`)}}),this.setRequestHandler(tl,async(n,o)=>{try{let r=await this._taskStore.getTask(n.params.taskId,o.sessionId);if(!r)throw new j(M.InvalidParams,`Task not found: ${n.params.taskId}`);if(Er(r.status))throw new j(M.InvalidParams,`Cannot cancel task in terminal status: ${r.status}`);await this._taskStore.updateTaskStatus(n.params.taskId,"cancelled","Client cancelled task execution.",o.sessionId),this._clearTaskQueue(n.params.taskId);let i=await this._taskStore.getTask(n.params.taskId,o.sessionId);if(!i)throw new j(M.InvalidParams,`Task not found after cancellation: ${n.params.taskId}`);return{_meta:{},...i}}catch(r){throw r instanceof j?r:new j(M.InvalidRequest,`Failed to cancel task: ${r instanceof Error?r.message:String(r)}`)}}))}async _oncancel(e){if(!e.params.requestId)return;this._requestHandlerAbortControllers.get(e.params.requestId)?.abort(e.params.reason)}_setupTimeout(e,n,o,r,i=!1){this._timeoutInfo.set(e,{timeoutId:setTimeout(r,n),startTime:Date.now(),timeout:n,maxTotalTimeout:o,resetTimeoutOnProgress:i,onTimeout:r})}_resetTimeout(e){let n=this._timeoutInfo.get(e);if(!n)return!1;let o=Date.now()-n.startTime;if(n.maxTotalTimeout&&o>=n.maxTotalTimeout)throw this._timeoutInfo.delete(e),j.fromError(M.RequestTimeout,"Maximum total timeout exceeded",{maxTotalTimeout:n.maxTotalTimeout,totalElapsed:o});return clearTimeout(n.timeoutId),n.timeoutId=setTimeout(n.onTimeout,n.timeout),!0}_cleanupTimeout(e){let n=this._timeoutInfo.get(e);n&&(clearTimeout(n.timeoutId),this._timeoutInfo.delete(e))}async connect(e){if(this._transport)throw new Error("Already connected to a transport. Call close() before connecting to a new transport, or use a separate Protocol instance per connection.");this._transport=e;let n=this.transport?.onclose;this._transport.onclose=()=>{n?.(),this._onclose()};let o=this.transport?.onerror;this._transport.onerror=i=>{o?.(i),this._onerror(i)};let r=this._transport?.onmessage;this._transport.onmessage=(i,a)=>{r?.(i,a),Wi(i)||Sx(i)?this._onresponse(i):Jf(i)?this._onrequest(i,a):$x(i)?this._onnotification(i):this._onerror(new Error(`Unknown message type: ${JSON.stringify(i)}`))},await this._transport.start()}_onclose(){let e=this._responseHandlers;this._responseHandlers=new Map,this._progressHandlers.clear(),this._taskProgressTokens.clear(),this._pendingDebouncedNotifications.clear();for(let o of this._timeoutInfo.values())clearTimeout(o.timeoutId);this._timeoutInfo.clear();for(let o of this._requestHandlerAbortControllers.values())o.abort();this._requestHandlerAbortControllers.clear();let n=j.fromError(M.ConnectionClosed,"Connection closed");this._transport=void 0,this.onclose?.();for(let o of e.values())o(n)}_onerror(e){this.onerror?.(e)}_onnotification(e){let n=this._notificationHandlers.get(e.method)??this.fallbackNotificationHandler;n!==void 0&&Promise.resolve().then(()=>n(e)).catch(o=>this._onerror(new Error(`Uncaught error in notification handler: ${o}`)))}_onrequest(e,n){let o=this._requestHandlers.get(e.method)??this.fallbackRequestHandler,r=this._transport,i=e.params?._meta?.[xr]?.taskId;if(o===void 0){let d={jsonrpc:"2.0",id:e.id,error:{code:M.MethodNotFound,message:"Method not found"}};i&&this._taskMessageQueue?this._enqueueTaskMessage(i,{type:"error",message:d,timestamp:Date.now()},r?.sessionId).catch(p=>this._onerror(new Error(`Failed to enqueue error response: ${p}`))):r?.send(d).catch(p=>this._onerror(new Error(`Failed to send an error response: ${p}`)));return}let a=new AbortController;this._requestHandlerAbortControllers.set(e.id,a);let c=bx(e.params)?e.params.task:void 0,u=this._taskStore?this.requestTaskStore(e,r?.sessionId):void 0,l={signal:a.signal,sessionId:r?.sessionId,_meta:e.params?._meta,sendNotification:async d=>{if(a.signal.aborted)return;let p={relatedRequestId:e.id};i&&(p.relatedTask={taskId:i}),await this.notification(d,p)},sendRequest:async(d,p,m)=>{if(a.signal.aborted)throw new j(M.ConnectionClosed,"Request was cancelled");let f={...m,relatedRequestId:e.id};i&&!f.relatedTask&&(f.relatedTask={taskId:i});let g=f.relatedTask?.taskId??i;return g&&u&&await u.updateTaskStatus(g,"input_required"),await this.request(d,p,f)},authInfo:n?.authInfo,requestId:e.id,requestInfo:n?.requestInfo,taskId:i,taskStore:u,taskRequestedTtl:c?.ttl,closeSSEStream:n?.closeSSEStream,closeStandaloneSSEStream:n?.closeStandaloneSSEStream};Promise.resolve().then(()=>{c&&this.assertTaskHandlerCapability(e.method)}).then(()=>o(e,l)).then(async d=>{if(a.signal.aborted)return;let p={result:d,jsonrpc:"2.0",id:e.id};i&&this._taskMessageQueue?await this._enqueueTaskMessage(i,{type:"response",message:p,timestamp:Date.now()},r?.sessionId):await r?.send(p)},async d=>{if(a.signal.aborted)return;let p={jsonrpc:"2.0",id:e.id,error:{code:Number.isSafeInteger(d.code)?d.code:M.InternalError,message:d.message??"Internal error",...d.data!==void 0&&{data:d.data}}};i&&this._taskMessageQueue?await this._enqueueTaskMessage(i,{type:"error",message:p,timestamp:Date.now()},r?.sessionId):await r?.send(p)}).catch(d=>this._onerror(new Error(`Failed to send response: ${d}`))).finally(()=>{this._requestHandlerAbortControllers.get(e.id)===a&&this._requestHandlerAbortControllers.delete(e.id)})}_onprogress(e){let{progressToken:n,...o}=e.params,r=Number(n),i=this._progressHandlers.get(r);if(!i){this._onerror(new Error(`Received a progress notification for an unknown token: ${JSON.stringify(e)}`));return}let a=this._responseHandlers.get(r),c=this._timeoutInfo.get(r);if(c&&a&&c.resetTimeoutOnProgress)try{this._resetTimeout(r)}catch(u){this._responseHandlers.delete(r),this._progressHandlers.delete(r),this._cleanupTimeout(r),a(u);return}i(o)}_onresponse(e){let n=Number(e.id),o=this._requestResolvers.get(n);if(o){if(this._requestResolvers.delete(n),Wi(e))o(e);else{let a=new j(e.error.code,e.error.message,e.error.data);o(a)}return}let r=this._responseHandlers.get(n);if(r===void 0){this._onerror(new Error(`Received a response for an unknown message ID: ${JSON.stringify(e)}`));return}this._responseHandlers.delete(n),this._cleanupTimeout(n);let i=!1;if(Wi(e)&&e.result&&typeof e.result=="object"){let a=e.result;if(a.task&&typeof a.task=="object"){let c=a.task;typeof c.taskId=="string"&&(i=!0,this._taskProgressTokens.set(c.taskId,n))}}if(i||this._progressHandlers.delete(n),Wi(e))r(e);else{let a=j.fromError(e.error.code,e.error.message,e.error.data);r(a)}}get transport(){return this._transport}async close(){await this._transport?.close()}async*requestStream(e,n,o){let{task:r}=o??{};if(!r){try{yield{type:"result",result:await this.request(e,n,o)}}catch(a){yield{type:"error",error:a instanceof j?a:new j(M.InternalError,String(a))}}return}let i;try{let a=await this.request(e,Xn,o);if(a.task)i=a.task.taskId,yield{type:"taskCreated",task:a.task};else throw new j(M.InternalError,"Task creation did not return a task");for(;;){let c=await this.getTask({taskId:i},o);if(yield{type:"taskStatus",task:c},Er(c.status)){c.status==="completed"?yield{type:"result",result:await this.getTaskResult({taskId:i},n,o)}:c.status==="failed"?yield{type:"error",error:new j(M.InternalError,`Task ${i} failed`)}:c.status==="cancelled"&&(yield{type:"error",error:new j(M.InternalError,`Task ${i} was cancelled`)});return}if(c.status==="input_required"){yield{type:"result",result:await this.getTaskResult({taskId:i},n,o)};return}let u=c.pollInterval??this._options?.defaultTaskPollInterval??1e3;await new Promise(l=>setTimeout(l,u)),o?.signal?.throwIfAborted()}}catch(a){yield{type:"error",error:a instanceof j?a:new j(M.InternalError,String(a))}}}request(e,n,o){let{relatedRequestId:r,resumptionToken:i,onresumptiontoken:a,task:c,relatedTask:u}=o??{};return new Promise((l,d)=>{let p=L=>{d(L)};if(!this._transport){p(new Error("Not connected"));return}if(this._options?.enforceStrictCapabilities===!0)try{this.assertCapabilityForMethod(e.method),c&&this.assertTaskCapability(e.method)}catch(L){p(L);return}o?.signal?.throwIfAborted();let m=this._requestMessageId++,f={...e,jsonrpc:"2.0",id:m};o?.onprogress&&(this._progressHandlers.set(m,o.onprogress),f.params={...e.params,_meta:{...e.params?._meta||{},progressToken:m}}),c&&(f.params={...f.params,task:c}),u&&(f.params={...f.params,_meta:{...f.params?._meta||{},[xr]:u}});let g=L=>{this._responseHandlers.delete(m),this._progressHandlers.delete(m),this._cleanupTimeout(m),this._transport?.send({jsonrpc:"2.0",method:"notifications/cancelled",params:{requestId:m,reason:String(L)}},{relatedRequestId:r,resumptionToken:i,onresumptiontoken:a}).catch(Z=>this._onerror(new Error(`Failed to send cancellation: ${Z}`)));let D=L instanceof j?L:new j(M.RequestTimeout,String(L));d(D)};this._responseHandlers.set(m,L=>{if(!o?.signal?.aborted){if(L instanceof Error)return d(L);try{let D=wr(n,L.result);D.success?l(D.data):d(D.error)}catch(D){d(D)}}}),o?.signal?.addEventListener("abort",()=>{g(o?.signal?.reason)});let v=o?.timeout??QR,b=()=>g(j.fromError(M.RequestTimeout,"Request timed out",{timeout:v}));this._setupTimeout(m,v,o?.maxTotalTimeout,b,o?.resetTimeoutOnProgress??!1);let E=u?.taskId;if(E){let L=D=>{let Z=this._responseHandlers.get(m);Z?Z(D):this._onerror(new Error(`Response handler missing for side-channeled request ${m}`))};this._requestResolvers.set(m,L),this._enqueueTaskMessage(E,{type:"request",message:f,timestamp:Date.now()}).catch(D=>{this._cleanupTimeout(m),d(D)})}else this._transport.send(f,{relatedRequestId:r,resumptionToken:i,onresumptiontoken:a}).catch(L=>{this._cleanupTimeout(m),d(L)})})}async getTask(e,n){return this.request({method:"tasks/get",params:e},Yu,n)}async getTaskResult(e,n,o){return this.request({method:"tasks/result",params:e},n,o)}async listTasks(e,n){return this.request({method:"tasks/list",params:e},el,n)}async cancelTask(e,n){return this.request({method:"tasks/cancel",params:e},Ex,n)}async notification(e,n){if(!this._transport)throw new Error("Not connected");this.assertNotificationCapability(e.method);let o=n?.relatedTask?.taskId;if(o){let c={...e,jsonrpc:"2.0",params:{...e.params,_meta:{...e.params?._meta||{},[xr]:n.relatedTask}}};await this._enqueueTaskMessage(o,{type:"notification",message:c,timestamp:Date.now()});return}if((this._options?.debouncedNotificationMethods??[]).includes(e.method)&&!e.params&&!n?.relatedRequestId&&!n?.relatedTask){if(this._pendingDebouncedNotifications.has(e.method))return;this._pendingDebouncedNotifications.add(e.method),Promise.resolve().then(()=>{if(this._pendingDebouncedNotifications.delete(e.method),!this._transport)return;let c={...e,jsonrpc:"2.0"};n?.relatedTask&&(c={...c,params:{...c.params,_meta:{...c.params?._meta||{},[xr]:n.relatedTask}}}),this._transport?.send(c,n).catch(u=>this._onerror(u))});return}let a={...e,jsonrpc:"2.0"};n?.relatedTask&&(a={...a,params:{...a.params,_meta:{...a.params?._meta||{},[xr]:n.relatedTask}}}),await this._transport.send(a,n)}setRequestHandler(e,n){let o=$h(e);this.assertRequestHandlerCapability(o),this._requestHandlers.set(o,(r,i)=>{let a=Sh(e,r);return Promise.resolve(n(a,i))})}removeRequestHandler(e){this._requestHandlers.delete(e)}assertCanSetRequestHandler(e){if(this._requestHandlers.has(e))throw new Error(`A request handler for ${e} already exists, which would be overridden`)}setNotificationHandler(e,n){let o=$h(e);this._notificationHandlers.set(o,r=>{let i=Sh(e,r);return Promise.resolve(n(i))})}removeNotificationHandler(e){this._notificationHandlers.delete(e)}_cleanupTaskProgressHandler(e){let n=this._taskProgressTokens.get(e);n!==void 0&&(this._progressHandlers.delete(n),this._taskProgressTokens.delete(e))}async _enqueueTaskMessage(e,n,o){if(!this._taskStore||!this._taskMessageQueue)throw new Error("Cannot enqueue task message: taskStore and taskMessageQueue are not configured");let r=this._options?.maxTaskQueueSize;await this._taskMessageQueue.enqueue(e,n,o,r)}async _clearTaskQueue(e,n){if(this._taskMessageQueue){let o=await this._taskMessageQueue.dequeueAll(e,n);for(let r of o)if(r.type==="request"&&Jf(r.message)){let i=r.message.id,a=this._requestResolvers.get(i);a?(a(new j(M.InternalError,"Task cancelled or completed")),this._requestResolvers.delete(i)):this._onerror(new Error(`Resolver missing for request ${i} during task ${e} cleanup`))}}}async _waitForTaskUpdate(e,n){let o=this._options?.defaultTaskPollInterval??1e3;try{let r=await this._taskStore?.getTask(e);r?.pollInterval&&(o=r.pollInterval)}catch{}return new Promise((r,i)=>{if(n.aborted){i(new j(M.InvalidRequest,"Request cancelled"));return}let a=setTimeout(r,o);n.addEventListener("abort",()=>{clearTimeout(a),i(new j(M.InvalidRequest,"Request cancelled"))},{once:!0})})}requestTaskStore(e,n){let o=this._taskStore;if(!o)throw new Error("No task store configured");return{createTask:async r=>{if(!e)throw new Error("No request provided");return await o.createTask(r,e.id,{method:e.method,params:e.params},n)},getTask:async r=>{let i=await o.getTask(r,n);if(!i)throw new j(M.InvalidParams,"Failed to retrieve task: Task not found");return i},storeTaskResult:async(r,i,a)=>{await o.storeTaskResult(r,i,a,n);let c=await o.getTask(r,n);if(c){let u=ta.parse({method:"notifications/tasks/status",params:c});await this.notification(u),Er(c.status)&&this._cleanupTaskProgressHandler(r)}},getTaskResult:r=>o.getTaskResult(r,n),updateTaskStatus:async(r,i,a)=>{let c=await o.getTask(r,n);if(!c)throw new j(M.InvalidParams,`Task "${r}" not found - it may have been cleaned up`);if(Er(c.status))throw new j(M.InvalidParams,`Cannot update task "${r}" from terminal status "${c.status}" to "${i}". Terminal states (completed, failed, cancelled) cannot transition to other states.`);await o.updateTaskStatus(r,i,a,n);let u=await o.getTask(r,n);if(u){let l=ta.parse({method:"notifications/tasks/status",params:u});await this.notification(l),Er(u.status)&&this._cleanupTaskProgressHandler(r)}},listTasks:r=>o.listTasks(r,n)}}};function $k(t){return t!==null&&typeof t=="object"&&!Array.isArray(t)}function Sk(t,e){let n={...t};for(let o in e){let r=o,i=e[r];if(i===void 0)continue;let a=n[r];$k(a)&&$k(i)?n[r]={...a,...i}:n[r]=i}return n}var hw=dy(l_(),1),gw=dy(fw(),1);function r1(){let t=new hw.default({strict:!1,validateFormats:!0,validateSchema:!1,allErrors:!0});return(0,gw.default)(t),t}var nd=class{constructor(e){this._ajv=e??r1()}getValidator(e){let n="$id"in e&&typeof e.$id=="string"?this._ajv.getSchema(e.$id)??this._ajv.compile(e):this._ajv.compile(e);return o=>n(o)?{valid:!0,data:o,errorMessage:void 0}:{valid:!1,data:void 0,errorMessage:this._ajv.errorsText(n.errors)}}};var od=class{constructor(e){this._server=e}requestStream(e,n,o){return this._server.requestStream(e,n,o)}createMessageStream(e,n){let o=this._server.getClientCapabilities();if((e.tools||e.toolChoice)&&!o?.sampling?.tools)throw new Error("Client does not support sampling tools capability.");if(e.messages.length>0){let r=e.messages[e.messages.length-1],i=Array.isArray(r.content)?r.content:[r.content],a=i.some(d=>d.type==="tool_result"),c=e.messages.length>1?e.messages[e.messages.length-2]:void 0,u=c?Array.isArray(c.content)?c.content:[c.content]:[],l=u.some(d=>d.type==="tool_use");if(a){if(i.some(d=>d.type!=="tool_result"))throw new Error("The last message must contain only tool_result content if any is present");if(!l)throw new Error("tool_result blocks are not matching any tool_use from the previous message")}if(l){let d=new Set(u.filter(m=>m.type==="tool_use").map(m=>m.id)),p=new Set(i.filter(m=>m.type==="tool_result").map(m=>m.toolUseId));if(d.size!==p.size||![...d].every(m=>p.has(m)))throw new Error("ids of tool_result blocks and tool_use blocks from previous message do not match")}}return this.requestStream({method:"sampling/createMessage",params:e},oa,n)}elicitInputStream(e,n){let o=this._server.getClientCapabilities(),r=e.mode??"form";switch(r){case"url":{if(!o?.elicitation?.url)throw new Error("Client does not support url elicitation.");break}case"form":{if(!o?.elicitation?.form)throw new Error("Client does not support form elicitation.");break}}let i=r==="form"&&e.mode===void 0?{...e,mode:"form"}:e;return this.requestStream({method:"elicitation/create",params:i},to,n)}async getTask(e,n){return this._server.getTask({taskId:e},n)}async getTaskResult(e,n,o){return this._server.getTaskResult({taskId:e},n,o)}async listTasks(e,n){return this._server.listTasks(e?{cursor:e}:void 0,n)}async cancelTask(e,n){return this._server.cancelTask({taskId:e},n)}};function _w(t,e,n){if(!t)throw new Error(`${n} does not support task creation (required for ${e})`);switch(e){case"tools/call":if(!t.tools?.call)throw new Error(`${n} does not support task creation for tools/call (required for ${e})`);break;default:break}}function yw(t,e,n){if(!t)throw new Error(`${n} does not support task creation (required for ${e})`);switch(e){case"sampling/createMessage":if(!t.sampling?.createMessage)throw new Error(`${n} does not support task creation for sampling/createMessage (required for ${e})`);break;case"elicitation/create":if(!t.elicitation?.create)throw new Error(`${n} does not support task creation for elicitation/create (required for ${e})`);break;default:break}}var id=class extends kl{constructor(e,n){super(n),this._serverInfo=e,this._loggingLevels=new Map,this.LOG_LEVEL_SEVERITY=new Map(na.options.map((o,r)=>[o,r])),this.isMessageIgnored=(o,r)=>{let i=this._loggingLevels.get(r);return i?this.LOG_LEVEL_SEVERITY.get(o)<this.LOG_LEVEL_SEVERITY.get(i):!1},this._capabilities=n?.capabilities??{},this._instructions=n?.instructions,this._jsonSchemaValidator=n?.jsonSchemaValidator??new nd,this.setRequestHandler(Xf,o=>this._oninitialize(o)),this.setNotificationHandler(Qf,()=>this.oninitialized?.()),this._capabilities.logging&&this.setRequestHandler(ah,async(o,r)=>{let i=r.sessionId||r.requestInfo?.headers["mcp-session-id"]||void 0,{level:a}=o.params,c=na.safeParse(a);return c.success&&this._loggingLevels.set(i,c.data),{}})}get experimental(){return this._experimental||(this._experimental={tasks:new od(this)}),this._experimental}registerCapabilities(e){if(this.transport)throw new Error("Cannot register capabilities after connecting to transport");this._capabilities=Sk(this._capabilities,e)}setRequestHandler(e,n){let r=Ir(e)?.method;if(!r)throw new Error("Schema is missing a method literal");let i;if(gt(r)){let c=r;i=c._zod?.def?.value??c.value}else{let c=r;i=c._def?.value??c.value}if(typeof i!="string")throw new Error("Schema method literal must be a string");if(i==="tools/call"){let c=async(u,l)=>{let d=wr(eo,u);if(!d.success){let g=d.error instanceof Error?d.error.message:String(d.error);throw new j(M.InvalidParams,`Invalid tools/call request: ${g}`)}let{params:p}=d.data,m=await Promise.resolve(n(u,l));if(p.task){let g=wr(Xn,m);if(!g.success){let v=g.error instanceof Error?g.error.message:String(g.error);throw new j(M.InvalidParams,`Invalid task creation result: ${v}`)}return g.data}let f=wr(cl,m);if(!f.success){let g=f.error instanceof Error?f.error.message:String(f.error);throw new j(M.InvalidParams,`Invalid tools/call result: ${g}`)}return f.data};return super.setRequestHandler(e,c)}return super.setRequestHandler(e,n)}assertCapabilityForMethod(e){switch(e){case"sampling/createMessage":if(!this._clientCapabilities?.sampling)throw new Error(`Client does not support sampling (required for ${e})`);break;case"elicitation/create":if(!this._clientCapabilities?.elicitation)throw new Error(`Client does not support elicitation (required for ${e})`);break;case"roots/list":if(!this._clientCapabilities?.roots)throw new Error(`Client does not support listing roots (required for ${e})`);break;case"ping":break}}assertNotificationCapability(e){switch(e){case"notifications/message":if(!this._capabilities.logging)throw new Error(`Server does not support logging (required for ${e})`);break;case"notifications/resources/updated":case"notifications/resources/list_changed":if(!this._capabilities.resources)throw new Error(`Server does not support notifying about resources (required for ${e})`);break;case"notifications/tools/list_changed":if(!this._capabilities.tools)throw new Error(`Server does not support notifying of tool list changes (required for ${e})`);break;case"notifications/prompts/list_changed":if(!this._capabilities.prompts)throw new Error(`Server does not support notifying of prompt list changes (required for ${e})`);break;case"notifications/elicitation/complete":if(!this._clientCapabilities?.elicitation?.url)throw new Error(`Client does not support URL elicitation (required for ${e})`);break;case"notifications/cancelled":break;case"notifications/progress":break}}assertRequestHandlerCapability(e){if(this._capabilities)switch(e){case"completion/complete":if(!this._capabilities.completions)throw new Error(`Server does not support completions (required for ${e})`);break;case"logging/setLevel":if(!this._capabilities.logging)throw new Error(`Server does not support logging (required for ${e})`);break;case"prompts/get":case"prompts/list":if(!this._capabilities.prompts)throw new Error(`Server does not support prompts (required for ${e})`);break;case"resources/list":case"resources/templates/list":case"resources/read":if(!this._capabilities.resources)throw new Error(`Server does not support resources (required for ${e})`);break;case"tools/call":case"tools/list":if(!this._capabilities.tools)throw new Error(`Server does not support tools (required for ${e})`);break;case"tasks/get":case"tasks/list":case"tasks/result":case"tasks/cancel":if(!this._capabilities.tasks)throw new Error(`Server does not support tasks capability (required for ${e})`);break;case"ping":case"initialize":break}}assertTaskCapability(e){yw(this._clientCapabilities?.tasks?.requests,e,"Client")}assertTaskHandlerCapability(e){this._capabilities&&_w(this._capabilities.tasks?.requests,e,"Server")}async _oninitialize(e){let n=e.params.protocolVersion;return this._clientCapabilities=e.params.capabilities,this._clientVersion=e.params.clientInfo,{protocolVersion:_x.includes(n)?n:Kf,capabilities:this.getCapabilities(),serverInfo:this._serverInfo,...this._instructions&&{instructions:this._instructions}}}getClientCapabilities(){return this._clientCapabilities}getClientVersion(){return this._clientVersion}getCapabilities(){return this._capabilities}async ping(){return this.request({method:"ping"},Hu)}async createMessage(e,n){if((e.tools||e.toolChoice)&&!this._clientCapabilities?.sampling?.tools)throw new Error("Client does not support sampling tools capability.");if(e.messages.length>0){let o=e.messages[e.messages.length-1],r=Array.isArray(o.content)?o.content:[o.content],i=r.some(l=>l.type==="tool_result"),a=e.messages.length>1?e.messages[e.messages.length-2]:void 0,c=a?Array.isArray(a.content)?a.content:[a.content]:[],u=c.some(l=>l.type==="tool_use");if(i){if(r.some(l=>l.type!=="tool_result"))throw new Error("The last message must contain only tool_result content if any is present");if(!u)throw new Error("tool_result blocks are not matching any tool_use from the previous message")}if(u){let l=new Set(c.filter(p=>p.type==="tool_use").map(p=>p.id)),d=new Set(r.filter(p=>p.type==="tool_result").map(p=>p.toolUseId));if(l.size!==d.size||![...l].every(p=>d.has(p)))throw new Error("ids of tool_result blocks and tool_use blocks from previous message do not match")}}return e.tools?this.request({method:"sampling/createMessage",params:e},sh,n):this.request({method:"sampling/createMessage",params:e},oa,n)}async elicitInput(e,n){switch(e.mode??"form"){case"url":{if(!this._clientCapabilities?.elicitation?.url)throw new Error("Client does not support url elicitation.");let r=e;return this.request({method:"elicitation/create",params:r},to,n)}case"form":{if(!this._clientCapabilities?.elicitation?.form)throw new Error("Client does not support form elicitation.");let r=e.mode==="form"?e:{...e,mode:"form"},i=await this.request({method:"elicitation/create",params:r},to,n);if(i.action==="accept"&&i.content&&r.requestedSchema)try{let c=this._jsonSchemaValidator.getValidator(r.requestedSchema)(i.content);if(!c.valid)throw new j(M.InvalidParams,`Elicitation response content does not match requested schema: ${c.errorMessage}`)}catch(a){throw a instanceof j?a:new j(M.InternalError,`Error validating elicitation response: ${a instanceof Error?a.message:String(a)}`)}return i}}}createElicitationCompletionNotifier(e,n){if(!this._clientCapabilities?.elicitation?.url)throw new Error("Client does not support URL elicitation (required for notifications/elicitation/complete)");return()=>this.notification({method:"notifications/elicitation/complete",params:{elicitationId:e}},n)}async listRoots(e,n){return this.request({method:"roots/list",params:e},ch,n)}async sendLoggingMessage(e,n){if(this._capabilities.logging&&!this.isMessageIgnored(e.level,n))return this.notification({method:"notifications/message",params:e})}async sendResourceUpdated(e){return this.notification({method:"notifications/resources/updated",params:e})}async sendResourceListChanged(){return this.notification({method:"notifications/resources/list_changed"})}async sendToolListChanged(){return this.notification({method:"notifications/tools/list_changed"})}async sendPromptListChanged(){return this.notification({method:"notifications/prompts/list_changed"})}};var bw=Symbol.for("mcp.completable");function y_(t){return!!t&&typeof t=="object"&&bw in t}function xw(t){return t[bw]?.complete}var vw;(function(t){t.Completable="McpCompletable"})(vw||(vw={}));var n1=/^[A-Za-z0-9._-]{1,128}$/;function o1(t){let e=[];if(t.length===0)return{isValid:!1,warnings:["Tool name cannot be empty"]};if(t.length>128)return{isValid:!1,warnings:[`Tool name exceeds maximum length of 128 characters (current: ${t.length})`]};if(t.includes(" ")&&e.push("Tool name contains spaces, which may cause parsing issues"),t.includes(",")&&e.push("Tool name contains commas, which may cause parsing issues"),(t.startsWith("-")||t.endsWith("-"))&&e.push("Tool name starts or ends with a dash, which may cause parsing issues in some contexts"),(t.startsWith(".")||t.endsWith("."))&&e.push("Tool name starts or ends with a dot, which may cause parsing issues in some contexts"),!n1.test(t)){let n=t.split("").filter(o=>!/[A-Za-z0-9._-]/.test(o)).filter((o,r,i)=>i.indexOf(o)===r);return e.push(`Tool name contains invalid characters: ${n.map(o=>`"${o}"`).join(", ")}`,"Allowed characters are: A-Z, a-z, 0-9, underscore (_), dash (-), and dot (.)"),{isValid:!1,warnings:e}}return{isValid:!0,warnings:e}}function i1(t,e){if(e.length>0){console.warn(`Tool name validation warning for "${t}":`);for(let n of e)console.warn(` - ${n}`);console.warn("Tool registration will proceed, but this may cause compatibility issues."),console.warn("Consider updating the tool name to conform to the MCP tool naming standard."),console.warn("See SEP: Specify Format for Tool Names (https://github.com/modelcontextprotocol/modelcontextprotocol/issues/986) for more details.")}}function v_(t){let e=o1(t);return i1(t,e.warnings),e.isValid}var ad=class{constructor(e){this._mcpServer=e}registerToolTask(e,n,o){let r={taskSupport:"required",...n.execution};if(r.taskSupport==="forbidden")throw new Error(`Cannot register task-based tool '${e}' with taskSupport 'forbidden'. Use registerTool() instead.`);return this._mcpServer._createRegisteredTool(e,n.title,n.description,n.inputSchema,n.outputSchema,n.annotations,r,n._meta,o)}};var sd=class{constructor(e,n){this._registeredResources={},this._registeredResourceTemplates={},this._registeredTools={},this._registeredPrompts={},this._toolHandlersInitialized=!1,this._completionHandlerInitialized=!1,this._resourceHandlersInitialized=!1,this._promptHandlersInitialized=!1,this.server=new id(e,n)}get experimental(){return this._experimental||(this._experimental={tasks:new ad(this)}),this._experimental}async connect(e){return await this.server.connect(e)}async close(){await this.server.close()}setToolRequestHandlers(){this._toolHandlersInitialized||(this.server.assertCanSetRequestHandler(jr(sl)),this.server.assertCanSetRequestHandler(jr(eo)),this.server.registerCapabilities({tools:{listChanged:!0}}),this.server.setRequestHandler(sl,()=>({tools:Object.entries(this._registeredTools).filter(([,e])=>e.enabled).map(([e,n])=>{let o={name:e,title:n.title,description:n.description,inputSchema:(()=>{let r=_o(n.inputSchema);return r?kh(r,{strictUnions:!0,pipeStrategy:"input"}):a1})(),annotations:n.annotations,execution:n.execution,_meta:n._meta};if(n.outputSchema){let r=_o(n.outputSchema);r&&(o.outputSchema=kh(r,{strictUnions:!0,pipeStrategy:"output"}))}return o})})),this.server.setRequestHandler(eo,async(e,n)=>{try{let o=this._registeredTools[e.params.name];if(!o)throw new j(M.InvalidParams,`Tool ${e.params.name} not found`);if(!o.enabled)throw new j(M.InvalidParams,`Tool ${e.params.name} disabled`);let r=!!e.params.task,i=o.execution?.taskSupport,a="createTask"in o.handler;if((i==="required"||i==="optional")&&!a)throw new j(M.InternalError,`Tool ${e.params.name} has taskSupport '${i}' but was not registered with registerToolTask`);if(i==="required"&&!r)throw new j(M.MethodNotFound,`Tool ${e.params.name} requires task augmentation (taskSupport: 'required')`);if(i==="optional"&&!r&&a)return await this.handleAutomaticTaskPolling(o,e,n);let c=await this.validateToolInput(o,e.params.arguments,e.params.name),u=await this.executeToolHandler(o,c,n);return r||await this.validateToolOutput(o,u,e.params.name),u}catch(o){if(o instanceof j&&o.code===M.UrlElicitationRequired)throw o;return this.createToolError(o instanceof Error?o.message:String(o))}}),this._toolHandlersInitialized=!0)}createToolError(e){return{content:[{type:"text",text:e}],isError:!0}}async validateToolInput(e,n,o){if(!e.inputSchema)return;let i=_o(e.inputSchema)??e.inputSchema,a=await hl(i,n);if(!a.success){let c="error"in a?a.error:"Unknown error",u=gl(c);throw new j(M.InvalidParams,`Input validation error: Invalid arguments for tool ${o}: ${u}`)}return a.data}async validateToolOutput(e,n,o){if(!e.outputSchema||!("content"in n)||n.isError)return;if(!n.structuredContent)throw new j(M.InvalidParams,`Output validation error: Tool ${o} has an output schema but no structured content was provided`);let r=_o(e.outputSchema),i=await hl(r,n.structuredContent);if(!i.success){let a="error"in i?i.error:"Unknown error",c=gl(a);throw new j(M.InvalidParams,`Output validation error: Invalid structured content for tool ${o}: ${c}`)}}async executeToolHandler(e,n,o){let r=e.handler;if("createTask"in r){if(!o.taskStore)throw new Error("No task store provided.");let a={...o,taskStore:o.taskStore};if(e.inputSchema){let c=r;return await Promise.resolve(c.createTask(n,a))}else{let c=r;return await Promise.resolve(c.createTask(a))}}if(e.inputSchema){let a=r;return await Promise.resolve(a(n,o))}else{let a=r;return await Promise.resolve(a(o))}}async handleAutomaticTaskPolling(e,n,o){if(!o.taskStore)throw new Error("No task store provided for task-capable tool.");let r=await this.validateToolInput(e,n.params.arguments,n.params.name),i=e.handler,a={...o,taskStore:o.taskStore},c=r?await Promise.resolve(i.createTask(r,a)):await Promise.resolve(i.createTask(a)),u=c.task.taskId,l=c.task,d=l.pollInterval??5e3;for(;l.status!=="completed"&&l.status!=="failed"&&l.status!=="cancelled";){await new Promise(m=>setTimeout(m,d));let p=await o.taskStore.getTask(u);if(!p)throw new j(M.InternalError,`Task ${u} not found during polling`);l=p}return await o.taskStore.getTaskResult(u)}setCompletionRequestHandler(){this._completionHandlerInitialized||(this.server.assertCanSetRequestHandler(jr(ul)),this.server.registerCapabilities({completions:{}}),this.server.setRequestHandler(ul,async e=>{switch(e.params.ref.type){case"ref/prompt":return Nx(e),this.handlePromptCompletion(e,e.params.ref);case"ref/resource":return Ax(e),this.handleResourceCompletion(e,e.params.ref);default:throw new j(M.InvalidParams,`Invalid completion reference: ${e.params.ref}`)}}),this._completionHandlerInitialized=!0)}async handlePromptCompletion(e,n){let o=this._registeredPrompts[n.name];if(!o)throw new j(M.InvalidParams,`Prompt ${n.name} not found`);if(!o.enabled)throw new j(M.InvalidParams,`Prompt ${n.name} disabled`);if(!o.argsSchema)return Ka;let i=Ir(o.argsSchema)?.[e.params.argument.name];if(!y_(i))return Ka;let a=xw(i);if(!a)return Ka;let c=await a(e.params.argument.value,e.params.context);return $w(c)}async handleResourceCompletion(e,n){let o=Object.values(this._registeredResourceTemplates).find(a=>a.resourceTemplate.uriTemplate.toString()===n.uri);if(!o){if(this._registeredResources[n.uri])return Ka;throw new j(M.InvalidParams,`Resource template ${e.params.ref.uri} not found`)}let r=o.resourceTemplate.completeCallback(e.params.argument.name);if(!r)return Ka;let i=await r(e.params.argument.value,e.params.context);return $w(i)}setResourceRequestHandlers(){this._resourceHandlersInitialized||(this.server.assertCanSetRequestHandler(jr(rl)),this.server.assertCanSetRequestHandler(jr(nl)),this.server.assertCanSetRequestHandler(jr(ol)),this.server.registerCapabilities({resources:{listChanged:!0}}),this.server.setRequestHandler(rl,async(e,n)=>{let o=Object.entries(this._registeredResources).filter(([i,a])=>a.enabled).map(([i,a])=>({uri:i,name:a.name,...a.metadata})),r=[];for(let i of Object.values(this._registeredResourceTemplates)){if(!i.resourceTemplate.listCallback)continue;let a=await i.resourceTemplate.listCallback(n);for(let c of a.resources)r.push({...i.metadata,...c})}return{resources:[...o,...r]}}),this.server.setRequestHandler(nl,async()=>({resourceTemplates:Object.entries(this._registeredResourceTemplates).map(([n,o])=>({name:n,uriTemplate:o.resourceTemplate.uriTemplate.toString(),...o.metadata}))})),this.server.setRequestHandler(ol,async(e,n)=>{let o=new URL(e.params.uri),r=this._registeredResources[o.toString()];if(r){if(!r.enabled)throw new j(M.InvalidParams,`Resource ${o} disabled`);return r.readCallback(o,n)}for(let i of Object.values(this._registeredResourceTemplates)){let a=i.resourceTemplate.uriTemplate.match(o.toString());if(a)return i.readCallback(o,a,n)}throw new j(M.InvalidParams,`Resource ${o} not found`)}),this._resourceHandlersInitialized=!0)}setPromptRequestHandlers(){this._promptHandlersInitialized||(this.server.assertCanSetRequestHandler(jr(il)),this.server.assertCanSetRequestHandler(jr(al)),this.server.registerCapabilities({prompts:{listChanged:!0}}),this.server.setRequestHandler(il,()=>({prompts:Object.entries(this._registeredPrompts).filter(([,e])=>e.enabled).map(([e,n])=>({name:e,title:n.title,description:n.description,arguments:n.argsSchema?s1(n.argsSchema):void 0}))})),this.server.setRequestHandler(al,async(e,n)=>{let o=this._registeredPrompts[e.params.name];if(!o)throw new j(M.InvalidParams,`Prompt ${e.params.name} not found`);if(!o.enabled)throw new j(M.InvalidParams,`Prompt ${e.params.name} disabled`);if(o.argsSchema){let r=_o(o.argsSchema),i=await hl(r,e.params.arguments);if(!i.success){let u="error"in i?i.error:"Unknown error",l=gl(u);throw new j(M.InvalidParams,`Invalid arguments for prompt ${e.params.name}: ${l}`)}let a=i.data,c=o.callback;return await Promise.resolve(c(a,n))}else{let r=o.callback;return await Promise.resolve(r(n))}}),this._promptHandlersInitialized=!0)}resource(e,n,...o){let r;typeof o[0]=="object"&&(r=o.shift());let i=o[0];if(typeof n=="string"){if(this._registeredResources[n])throw new Error(`Resource ${n} is already registered`);let a=this._createRegisteredResource(e,void 0,n,r,i);return this.setResourceRequestHandlers(),this.sendResourceListChanged(),a}else{if(this._registeredResourceTemplates[e])throw new Error(`Resource template ${e} is already registered`);let a=this._createRegisteredResourceTemplate(e,void 0,n,r,i);return this.setResourceRequestHandlers(),this.sendResourceListChanged(),a}}registerResource(e,n,o,r){if(typeof n=="string"){if(this._registeredResources[n])throw new Error(`Resource ${n} is already registered`);let i=this._createRegisteredResource(e,o.title,n,o,r);return this.setResourceRequestHandlers(),this.sendResourceListChanged(),i}else{if(this._registeredResourceTemplates[e])throw new Error(`Resource template ${e} is already registered`);let i=this._createRegisteredResourceTemplate(e,o.title,n,o,r);return this.setResourceRequestHandlers(),this.sendResourceListChanged(),i}}_createRegisteredResource(e,n,o,r,i){let a={name:e,title:n,metadata:r,readCallback:i,enabled:!0,disable:()=>a.update({enabled:!1}),enable:()=>a.update({enabled:!0}),remove:()=>a.update({uri:null}),update:c=>{typeof c.uri<"u"&&c.uri!==o&&(delete this._registeredResources[o],c.uri&&(this._registeredResources[c.uri]=a)),typeof c.name<"u"&&(a.name=c.name),typeof c.title<"u"&&(a.title=c.title),typeof c.metadata<"u"&&(a.metadata=c.metadata),typeof c.callback<"u"&&(a.readCallback=c.callback),typeof c.enabled<"u"&&(a.enabled=c.enabled),this.sendResourceListChanged()}};return this._registeredResources[o]=a,a}_createRegisteredResourceTemplate(e,n,o,r,i){let a={resourceTemplate:o,title:n,metadata:r,readCallback:i,enabled:!0,disable:()=>a.update({enabled:!1}),enable:()=>a.update({enabled:!0}),remove:()=>a.update({name:null}),update:l=>{typeof l.name<"u"&&l.name!==e&&(delete this._registeredResourceTemplates[e],l.name&&(this._registeredResourceTemplates[l.name]=a)),typeof l.title<"u"&&(a.title=l.title),typeof l.template<"u"&&(a.resourceTemplate=l.template),typeof l.metadata<"u"&&(a.metadata=l.metadata),typeof l.callback<"u"&&(a.readCallback=l.callback),typeof l.enabled<"u"&&(a.enabled=l.enabled),this.sendResourceListChanged()}};this._registeredResourceTemplates[e]=a;let c=o.uriTemplate.variableNames;return Array.isArray(c)&&c.some(l=>!!o.completeCallback(l))&&this.setCompletionRequestHandler(),a}_createRegisteredPrompt(e,n,o,r,i){let a={title:n,description:o,argsSchema:r===void 0?void 0:Xr(r),callback:i,enabled:!0,disable:()=>a.update({enabled:!1}),enable:()=>a.update({enabled:!0}),remove:()=>a.update({name:null}),update:c=>{typeof c.name<"u"&&c.name!==e&&(delete this._registeredPrompts[e],c.name&&(this._registeredPrompts[c.name]=a)),typeof c.title<"u"&&(a.title=c.title),typeof c.description<"u"&&(a.description=c.description),typeof c.argsSchema<"u"&&(a.argsSchema=Xr(c.argsSchema)),typeof c.callback<"u"&&(a.callback=c.callback),typeof c.enabled<"u"&&(a.enabled=c.enabled),this.sendPromptListChanged()}};return this._registeredPrompts[e]=a,r&&Object.values(r).some(u=>{let l=u instanceof Wn?u._def?.innerType:u;return y_(l)})&&this.setCompletionRequestHandler(),a}_createRegisteredTool(e,n,o,r,i,a,c,u,l){v_(e);let d={title:n,description:o,inputSchema:kw(r),outputSchema:kw(i),annotations:a,execution:c,_meta:u,handler:l,enabled:!0,disable:()=>d.update({enabled:!1}),enable:()=>d.update({enabled:!0}),remove:()=>d.update({name:null}),update:p=>{typeof p.name<"u"&&p.name!==e&&(typeof p.name=="string"&&v_(p.name),delete this._registeredTools[e],p.name&&(this._registeredTools[p.name]=d)),typeof p.title<"u"&&(d.title=p.title),typeof p.description<"u"&&(d.description=p.description),typeof p.paramsSchema<"u"&&(d.inputSchema=Xr(p.paramsSchema)),typeof p.outputSchema<"u"&&(d.outputSchema=Xr(p.outputSchema)),typeof p.callback<"u"&&(d.handler=p.callback),typeof p.annotations<"u"&&(d.annotations=p.annotations),typeof p._meta<"u"&&(d._meta=p._meta),typeof p.enabled<"u"&&(d.enabled=p.enabled),this.sendToolListChanged()}};return this._registeredTools[e]=d,this.setToolRequestHandlers(),this.sendToolListChanged(),d}tool(e,...n){if(this._registeredTools[e])throw new Error(`Tool ${e} is already registered`);let o,r,i,a;if(typeof n[0]=="string"&&(o=n.shift()),n.length>1){let u=n[0];if(b_(u))r=n.shift(),n.length>1&&typeof n[0]=="object"&&n[0]!==null&&!b_(n[0])&&(a=n.shift());else if(typeof u=="object"&&u!==null){if(Object.values(u).some(l=>typeof l=="object"&&l!==null))throw new Error(`Tool ${e} expected a Zod schema or ToolAnnotations, but received an unrecognized object`);a=n.shift()}}let c=n[0];return this._createRegisteredTool(e,void 0,o,r,i,a,{taskSupport:"forbidden"},void 0,c)}registerTool(e,n,o){if(this._registeredTools[e])throw new Error(`Tool ${e} is already registered`);let{title:r,description:i,inputSchema:a,outputSchema:c,annotations:u,_meta:l}=n;return this._createRegisteredTool(e,r,i,a,c,u,{taskSupport:"forbidden"},l,o)}prompt(e,...n){if(this._registeredPrompts[e])throw new Error(`Prompt ${e} is already registered`);let o;typeof n[0]=="string"&&(o=n.shift());let r;n.length>1&&(r=n.shift());let i=n[0],a=this._createRegisteredPrompt(e,void 0,o,r,i);return this.setPromptRequestHandlers(),this.sendPromptListChanged(),a}registerPrompt(e,n,o){if(this._registeredPrompts[e])throw new Error(`Prompt ${e} is already registered`);let{title:r,description:i,argsSchema:a}=n,c=this._createRegisteredPrompt(e,r,i,a,o);return this.setPromptRequestHandlers(),this.sendPromptListChanged(),c}isConnected(){return this.server.transport!==void 0}async sendLoggingMessage(e,n){return this.server.sendLoggingMessage(e,n)}sendResourceListChanged(){this.isConnected()&&this.server.sendResourceListChanged()}sendToolListChanged(){this.isConnected()&&this.server.sendToolListChanged()}sendPromptListChanged(){this.isConnected()&&this.server.sendPromptListChanged()}};var a1={type:"object",properties:{}};function Sw(t){return t!==null&&typeof t=="object"&&"parse"in t&&typeof t.parse=="function"&&"safeParse"in t&&typeof t.safeParse=="function"}function ww(t){return"_def"in t||"_zod"in t||Sw(t)}function b_(t){return typeof t!="object"||t===null||ww(t)?!1:Object.keys(t).length===0?!0:Object.values(t).some(Sw)}function kw(t){if(t){if(b_(t))return Xr(t);if(!ww(t))throw new Error("inputSchema must be a Zod schema or raw shape, received an unrecognized object");return t}}function s1(t){let e=Ir(t);return e?Object.entries(e).map(([n,o])=>{let r=qx(o),i=Vx(o);return{name:n,description:r,required:!i}}):[]}function jr(t){let n=Ir(t)?.method;if(!n)throw new Error("Schema is missing a method literal");let o=_l(n);if(typeof o=="string")return o;throw new Error("Schema method literal must be a string")}function $w(t){return{completion:{values:t.slice(0,100),total:t.length,hasMore:t.length>100}}}var Ka={completion:{values:[],hasMore:!1}};var Ga=s.object({endpoint:s.string().min(1).max(256).optional(),apiKey:s.string().min(1).max(256).optional(),workspace:s.string().min(1).max(256).optional(),region:s.string().min(1).max(256).optional(),feature:s.string().min(1).max(256).optional()}).strict(),Iw=s.enum(["SUM","COUNT","MAX","UNIQUE_COUNT","LATEST"]),x_=s.object({d:s.number().int().nonnegative(),w:s.number().int().positive(),c:s.number().nonnegative(),agg:Iw.default("COUNT").optional(),valueProperty:s.string().optional(),uniqueProperty:s.string().optional(),provenance:s.enum(["plan","manual","provider"]).optional(),warnAt:s.number().min(0).max(1).optional(),scope:Ga.optional()}),c1=s.object({kind:s.literal("credential_validity")}),u1=s.object({kind:s.literal("track_only_bypass")}),l1=s.object({kind:s.literal("lifecycle_block"),blockOn:s.array(s.string()).default(["SUSPENDED","CANCELLED","INACTIVE"]),code:s.string().default("subscription_inactive")}),d1=s.object({kind:s.literal("identity_requirement"),require:s.enum(["org_only","org_and_user"]).default("org_only")}),p1=s.object({kind:s.literal("scope"),requireExplicit:s.boolean().default(!0)}),m1=s.object({kind:s.literal("feature_gate"),feature:s.string().min(1).max(120)}),f1=s.object({kind:s.literal("geo_restriction"),allow:s.array(s.string().length(2).regex(/^[A-Z]{2}$/)).optional(),block:s.array(s.string().length(2).regex(/^[A-Z]{2}$/)).optional()}).refine(t=>t.allow!==void 0||t.block!==void 0,{message:"geo_restriction requires either `allow` or `block`"}),h1=s.enum(["fixed_window","sliding_window","token_bucket"]),g1=x_.extend({kind:s.literal("rate_limit"),m:s.enum(["e","t"]).default("e"),strategy:h1.default("fixed_window"),bucket_capacity:s.number().positive().optional(),refill_rate_per_second:s.number().positive().optional()}).superRefine((t,e)=>{t.strategy==="token_bucket"?(t.bucket_capacity===void 0&&e.addIssue({code:"custom",message:"token_bucket strategy requires `bucket_capacity` (positive number)",path:["bucket_capacity"]}),t.refill_rate_per_second===void 0&&e.addIssue({code:"custom",message:"token_bucket strategy requires `refill_rate_per_second` (positive number)",path:["refill_rate_per_second"]})):(t.bucket_capacity!==void 0&&e.addIssue({code:"custom",message:`bucket_capacity is only valid when strategy === 'token_bucket' (got '${t.strategy}')`,path:["bucket_capacity"]}),t.refill_rate_per_second!==void 0&&e.addIssue({code:"custom",message:`refill_rate_per_second is only valid when strategy === 'token_bucket' (got '${t.strategy}')`,path:["refill_rate_per_second"]}))}),_1=s.enum(["fixed_window","sliding_window"]),y1=x_.extend({kind:s.literal("quota"),ovr:s.enum(["BLOCK","ALLOW_AND_BILL"]),strategy:_1.default("fixed_window")}),v1=x_.extend({kind:s.literal("credit_balance"),ovr:s.enum(["BLOCK","ALLOW_AND_BILL"])}),b1=s.object({kind:s.literal("concurrency"),capability:s.string().min(1).max(120),limit:s.number().int().positive(),lease_ttl_seconds:s.number().int().positive().max(3600).default(60)}),x1=s.object({kind:s.literal("capability_limit"),capability:s.string().min(1).max(120),limit:s.union([s.number().int().nonnegative(),s.boolean()])}),k1=s.object({kind:s.literal("resource_count"),resource:s.string().min(1).max(120),limit:s.number().int().nonnegative(),actionId:s.string().min(1).max(160).optional()}),$1=s.object({kind:s.literal("reservation"),dimension:s.string().min(1).max(120),max_outstanding:s.number().int().positive(),hold_seconds:s.number().int().positive().max(86400)}),S1=s.enum(["plan","manual","provider"]),cd=s.object({maxInputTokens:s.number().int().positive().optional(),maxOutputTokens:s.number().int().positive().optional(),maxContextTokens:s.number().int().positive().optional(),maxPayloadBytes:s.number().int().positive().optional(),enforcement:s.enum(["enforce","track"]).default("enforce"),failMode:s.enum(["open","closed"]).default("open"),tokenCountSource:s.enum(["declared","estimated"]).optional(),scope:Ga.optional()}).refine(Ew,{message:"capacity requires at least one ceiling (maxInputTokens / maxOutputTokens / maxContextTokens / maxPayloadBytes)"});function Ew(t){return t.maxInputTokens!==void 0||t.maxOutputTokens!==void 0||t.maxContextTokens!==void 0||t.maxPayloadBytes!==void 0}var w1=s.object({kind:s.literal("capacity"),maxInputTokens:s.number().int().positive().optional(),maxOutputTokens:s.number().int().positive().optional(),maxContextTokens:s.number().int().positive().optional(),maxPayloadBytes:s.number().int().positive().optional(),enforcement:s.enum(["enforce","track"]).default("enforce"),failMode:s.enum(["open","closed"]).default("open"),tokenCountSource:s.enum(["declared","estimated"]).optional(),scope:Ga.optional(),provenance:S1.optional()}).refine(Ew,{message:"capacity requires at least one ceiling (maxInputTokens / maxOutputTokens / maxContextTokens / maxPayloadBytes)"}),k_=s.discriminatedUnion("kind",[c1,u1,l1,d1,p1,m1,f1,g1,y1,v1,x1,k1,b1,$1,w1]);var Ja=["customer_feature","control_plane","admin_internal","background_job","webhook","healthcheck","unclassified"],UB=new Set(Ja);var ud=s.object({trafficClass:s.enum(Ja),policySource:s.enum(["declared","inherited","defaulted","legacy_inferred"]),limitParticipation:s.object({profile:s.enum(["customer_usage","business_capacity","control_plane","admin_internal","platform_abuse_only","healthcheck","none"]),pools:s.array(s.string().min(1)).optional(),scopes:s.array(s.object({endpoint:s.string().optional(),apiKey:s.string().optional(),workspace:s.string().optional(),region:s.string().optional(),feature:s.string().optional()}).passthrough()).optional(),metrics:s.array(s.string().min(1)).optional()}).passthrough(),customerBillingPolicy:s.object({customerBillable:s.boolean(),meterKey:s.string().min(1).optional(),chargeableOutcomes:s.enum(["success_only","success_and_partial","attempted","trusted_actual_usage_only"]),invoiceBehavior:s.string().optional()}).passthrough(),providerCostPolicy:s.object({providerCostTracked:s.boolean(),declaredProviderHint:s.string().optional(),declaredModelHint:s.string().optional()}).passthrough()}).passthrough();var JB=s.object({keyId:s.string().min(1),orgId:s.string().min(1),actorType:s.enum(["org","user"]).optional(),actorId:s.string().nullable().optional(),productId:s.string().min(1),compiledPlanId:s.string().min(1),entitlementHash:s.string().optional(),subjectKey:s.string().min(1),subscriptionId:s.string().min(1),currentPeriodId:s.string().optional(),currentPeriodStartMs:s.number().optional(),subscriberId:s.string().min(1),apiKeyId:s.string().nullable(),entitlementVersion:s.number(),identityRequirement:s.enum(["org_only","org_and_user"]),status:s.enum(["active","revoked"]),expiresAt:s.number().nullable().optional(),subscriberStatus:s.enum(["ONBOARDING","ACTIVE","SUSPENDED"]),subscriptionStatus:s.string().min(1),environment:s.enum(["production","sandbox"]).optional(),environmentId:s.string().optional(),scopes:s.array(s.string()).readonly().optional(),entitlement:s.record(s.string(),s.unknown()).nullable().optional()});var Tw=s.object({unit:s.enum(["requests","tokens","computeMs","dollars"]),window:s.enum(["second","minute","hour","day","week","month"]),capacity:s.number()}),I1=s.object({id:s.string().min(1),slug:s.string().optional(),transportMode:s.enum(["direct","tunnel"]),verificationRequired:s.boolean().optional(),originUrl:s.string().optional(),originHostname:s.string().optional(),accessCredentialRef:s.string().optional(),policyVersion:s.string().optional()}),WB=s.object({id:s.string().min(1),origin:s.string().min(1),sandboxOrigin:s.string().nullable().optional(),authHeader:s.string().optional(),pricing:s.object({requests:s.number().optional(),tokens:s.number().optional(),computeMs:s.number().optional(),per_request:s.number().optional()}).catchall(s.number().optional()).optional(),metering:s.object({tokens:s.object({estimatePerRequest:s.number().optional()}).optional(),computeMs:s.object({estimatePerRequest:s.number().optional()}).optional(),billOn4xx:s.boolean().optional()}).optional(),tenantLimits:s.array(Tw).readonly().optional(),userLimits:s.array(Tw).readonly().optional(),environmentId:s.string().optional(),contextTokenSecret:s.string().nullable().optional(),timeoutMs:s.number().positive().optional(),idleTimeoutMs:s.number().positive().optional(),backends:s.array(I1).optional(),defaultBackendId:s.string().optional(),verificationRequired:s.boolean().optional()});var E1=s.object({perRequestMinUnitsByDim:s.record(s.string(),s.number()).optional(),creditPoolMicros:s.number().optional(),perDimUnitCostMicros:s.record(s.string(),s.number()).optional()}),T1=s.object({source:s.enum(["fixed","provider_catalog"]),meterKey:s.string(),selector:s.string().optional(),measures:s.array(s.string()),catalog:s.string().optional(),pricePolicy:s.string().optional(),markupPercent:s.number().optional(),fixedRatesMicros:s.record(s.string(),s.record(s.string(),s.number())).optional()}),O1=s.object({key:s.string(),display:s.string(),unit:s.string().optional(),aggregation:s.enum(["SUM","COUNT","MAX","UNIQUE_COUNT","LATEST"]),window:s.enum(["minute","hour","day","month","billing_period"]),enforcementType:s.string()}),P1=s.object({feature:s.string(),method:s.string(),path:s.string(),meters:s.array(s.string()).optional(),usagePolicy:ud.optional(),policyResolutionMode:s.enum(["legacy","policy"]).optional()}),YB=s.object({v:s.number(),sub:s.string(),compiledPlanId:s.string().min(1),planType:s.string(),ts:s.number(),constraints:s.array(k_),cv:s.number(),policyResolutionMode:s.enum(["legacy","policy"]).optional(),dm:s.record(s.string(),s.number()),dmv:s.number().optional(),floor:E1.nullable().optional(),displayDims:s.array(s.number()).optional(),meterSemantics:s.record(s.string(),O1).optional(),rp:s.record(s.string(),T1).optional(),fr:s.array(P1).optional(),sig:s.string().min(1),sigKid:s.string().optional(),environmentId:s.string().optional()}).passthrough();var XB=s.object({subscriptionId:s.string().min(1),activePeriodId:s.string().optional(),activeCompiledPlanId:s.string().min(1),activeEntitlementHash:s.string().optional(),enforcementMode:s.enum(["STRICT","GRACE","TRACK_ONLY"]),gracePeriodEndsAt:s.string().optional(),trialEndsAt:s.string().optional(),overrides:s.object({featureGateOverrides:s.record(s.string(),s.boolean()).optional()}).optional(),scheduledTransition:s.object({kind:s.string(),timing:s.string(),scheduledFor:s.string(),toCompiledPlanId:s.string().nullable()}).optional(),creditPool:s.object({periodStartMs:s.number(),periodEndMs:s.number(),grantedCents:s.number(),policy:s.enum(["block","allow"]),epoch:s.number()}).optional(),resourceCounts:s.record(s.string(),s.number()).optional(),dedicatedShard:s.enum(["ACTIVE","DRAINING"]).optional(),generation:s.number(),updatedAt:s.string()});var R1=["DRAFT","ACTIVE"],tH=s.enum(R1),z1=["ONBOARDING","ACTIVE","SUSPENDED"],Ow=s.enum(z1),N1=["ACTIVE","REVOKED"],rH=s.enum(N1),A1=["BLOCK","ALLOW_AND_BILL"],Pw=s.enum(A1),C1=["ACTIVE","ARCHIVED"],nH=s.enum(C1),j1=["ACTIVE","EXPERIMENTAL","LEGACY_STABLE","PHASING_OUT","SUPERSEDED","ARCHIVED"],oH=s.enum(j1);var Rw=["input","output","total","cached_read_input","cache_creation_input","context","max_output","estimated_output","actual_output","streaming_output"],ld=[{id:"requests",label:"API requests",description:"Count every call \u2014 the right default for most APIs.",meters:[{key:"requests",display:"Requests",unit:"request"}]},{id:"ai-tokens",label:"AI tokens",description:"LLM-style token metering alongside calls. The gateway can estimate tokens per request and settle actuals from @farthershore/backend reports.",meters:[{key:"requests",display:"Requests",unit:"request"},{key:"tokens_used",display:"Tokens Used",unit:"token"}]},{id:"credits",label:"Credits",description:"Price work in abstract credits (e.g. one image = 5 credits). Report each call's dynamic credit cost through @farthershore/backend.",meters:[{key:"requests",display:"Requests",unit:"request"},{key:"credits",display:"Credits",unit:"credit"}]},{id:"spend",label:"Metered spend",description:"Pass-through spend in cents (OpenRouter-style) reported through @farthershore/backend. Pairs with prepaid credit wallets.",meters:[{key:"requests",display:"Requests",unit:"request"},{key:"dollars",display:"Spend",unit:"cent"}]},{id:"compute",label:"Compute time",description:"Bill milliseconds of compute, settled from @farthershore/backend reports.",meters:[{key:"requests",display:"Requests",unit:"request"},{key:"compute_ms",display:"Compute Time",unit:"ms"}]}];function zw(t){let e=t.trim().toLowerCase();return ld.find(n=>n.id===e)}function Nw(){return ld.map(t=>t.id)}var D1="FS_RUNTIME_TOKEN";var U1={payload:"x-fs-metering",signature:"x-fs-metering-sig",token:"x-fs-metering-token"};var uH={environmentVariable:D1,presentation:U1.token,storage:"sha256-hash-only"};var Aw={missingSignature:"missing_signature",malformedSignature:"malformed_signature",unknownKeyId:"unknown_key_id",jwksUnavailable:"jwks_unavailable",badSignature:"bad_signature",bodyHashMismatch:"body_hash_mismatch",routeMismatch:"route_mismatch",clockSkew:"clock_skew",expiredSignature:"expired_signature",replayedNonce:"replayed_nonce",bodyTooLarge:"body_too_large",environmentMismatch:"environment_mismatch",missingToken:"missing_token",invalidToken:"invalid_token"};var lH=10*1024*1024;var L1=["CHECKOUT_COMPLETED","PLAN_CHANGED","CANCELLED","RESTORED","UNSCHEDULED_CANCELLATION","PRICE_ROLLOVER","PAUSED","RESUMED","PLAN_CHANGE_SCHEDULED","PLAN_CHANGE_ABORTED","SCHEDULE_CREATED","SCHEDULE_UPDATED","SCHEDULE_RELEASED","SCHEDULE_COMPLETED","SCHEDULE_ABORTED","CANCEL_SCHEDULED","PAYMENT_FAILED","PAYMENT_RECOVERED","PAYMENT_RECOVERED_FROM_SUSPENDED","PAYMENT_ACTION_REQUIRED","RECURRING_PAYMENT","REFUND_PROCESSED","DISPUTE_OPENED","DISPUTE_FUNDS_WITHDRAWN","DISPUTE_CLOSED","MIN_SPEND_TRUE_UP"],mH=s.enum(L1);var _H=s.object({fontFamily:s.enum(["sans","serif","mono","system"]).optional(),radius:s.enum(["none","sm","md","lg","full"]).optional(),density:s.enum(["compact","default","comfortable"]).optional(),colorScheme:s.enum(["system","light","dark"]).optional()}).strict().optional();var M1=s.object({d:s.number(),w:s.number(),capacity:s.number(),remaining:s.number(),windowStart:s.number(),windowEnd:s.number()}),Z1=s.record(s.string(),M1),F1=s.object({allocations:s.array(s.number()),expiresAt:s.number()}),q1=s.record(s.string(),F1),V1=s.record(s.string(),s.bigint()),kH=s.object({subscriptionId:s.string(),handoffToken:s.string(),targetShardId:s.string(),policyVersion:s.number(),entitlementVersion:s.number().nullable(),windowStates:Z1,activeLeases:q1,totalsByDimension:V1.optional(),billingCycleId:s.string().nullable().optional(),billingCycleStartMs:s.number().optional()});var B1={gatewayProjectRead:"gateway:project:read",gatewayResourceWrite:"gateway:resource:write",usageWrite:"usage:write",authzDeniedWrite:"authz-denied:write",reservationAuthorize:"reservation:authorize",reservationFinalize:"reservation:finalize",internalCronRun:"internal:cron:run",personaManage:"persona:manage"},EH=Object.values(B1);var H1=["managed_frontend","custom_frontend","embedded_sdk","public_api","cli","agent","webhook","admin","internal"],jw=s.enum(H1),Cw=s.string().min(1).max(128),K1=s.object({d:s.number().int().nonnegative(),w:s.number().int().positive(),rem:s.number(),cap:s.number()}).strict(),Dw=s.object({v:s.literal(1),entV:s.number().int().nonnegative().optional(),entHash:Cw.optional(),featureGrant:s.boolean().optional(),gates:s.array(Cw).max(16).optional(),limits:s.array(K1).max(16).optional()}).strict();var G1=s.object({requestId:s.string(),eventId:s.string(),tenantId:s.string(),slug:s.string(),subscriptionId:s.string(),subscriberId:s.string(),apiKeyId:s.string().nullable(),compiledPlanId:s.string(),subscriberStatus:Ow,subscriptionStatus:s.string(),productId:s.string(),statusCode:s.number(),path:s.string(),latencyMs:s.number(),rawDimsUnits:s.record(s.string(),s.number()),meterSettlements:s.array(s.object({meterId:s.string(),meterType:s.enum(["exact_pre_request","estimated_then_settled","postpaid","strict_concurrency"]),reserved:s.number(),actual:s.number(),delta:s.number(),dimension:s.number().int().nonnegative(),leaseId:s.string()})).optional(),reportingAttested:s.boolean(),customerBillable:s.boolean(),measureContext:s.record(s.string(),s.unknown()).optional(),creditUnitsConsumed:s.record(s.string(),s.number()).optional(),timestamp:s.number(),environmentId:s.string().nullable().optional(),orgId:s.string().optional(),actorType:s.enum(["org","user"]).optional(),actorId:s.string().nullable().optional(),subjectKey:s.string().optional(),overageBehavior:Pw.optional(),environment:s.enum(["production","sandbox"]).optional(),surface:jw.optional(),actionId:s.string().min(1).max(128).optional(),subjectType:s.string().min(1).max(128).optional(),subjectId:s.string().min(1).max(256).optional(),decision:Dw.optional(),decisionId:s.string().min(1).max(256).optional(),denyClass:s.enum(["quota","rate","concurrency","capacity","spend","adaptive"]).optional(),blockingConstraintId:s.string().min(1).max(256).optional(),providerSettlements:s.array(s.object({meterId:s.string(),providerReported:s.number(),reconciled:s.number()})).optional(),usagePolicyId:s.string().min(1).max(256).optional(),policySource:s.enum(["declared","inherited","defaulted","legacy_inferred"]).optional(),trafficClass:s.enum(Ja).optional(),limitProfile:s.enum(["customer_usage","business_capacity","control_plane","admin_internal","platform_abuse_only","healthcheck","none"]).optional(),leaseId:s.string(),transactionId:s.string(),gatewayMetadata:s.object({shardId:s.string(),policyVersion:s.number().int().nonnegative().optional(),artifactVersion:s.number().int().nonnegative().default(0),artifactHash:s.string().regex(/^sha256_[a-f0-9]{64}$/).optional(),leaseTelemetry:s.object({consumeRequests:s.number().int().nonnegative(),localLeaseHits:s.number().int().nonnegative(),doAllocationAttempts:s.number().int().nonnegative(),doAllocationGrants:s.number().int().nonnegative(),doAllocationDenials:s.number().int().nonnegative(),doUnavailable:s.number().int().nonnegative(),doCircuitOpen:s.number().int().nonnegative(),leaseRefreshSingleflightJoins:s.number().int().nonnegative(),leaseRefreshSingleflightJoinRate:s.number().min(0).max(1),expiredLeasesReaped:s.number().int().nonnegative(),expiredLeaseReclaimedGrant:s.array(s.number().nonnegative()),reconcileRequests:s.number().int().nonnegative(),reconcilePositiveDeltas:s.number().int().nonnegative(),reconcileNoLocalLease:s.number().int().nonnegative(),doReconcileAttempts:s.number().int().nonnegative(),doReconcileFailures:s.number().int().nonnegative(),unspentLeaseRemainderReturns:s.number().int().nonnegative(),unspentLeaseRemainderReturnFailures:s.number().int().nonnegative(),unspentLeaseRemainderReturnedGrant:s.array(s.number().nonnegative()),maxObservedPositiveReconcileDelta:s.array(s.number().nonnegative()),requestToDoRatio:s.number().nonnegative(),localLeaseHitRate:s.number().min(0).max(1),localSpendRate:s.number().min(0).max(1),maxObservedActiveLeases:s.number().int().nonnegative(),maxObservedOutstandingGrant:s.array(s.number().nonnegative()),maxObservedOutstandingGrantRatio:s.number().nonnegative(),maxObservedEmergencyReserveGrant:s.array(s.number().nonnegative()),maxObservedEmergencyReserveGrantRatio:s.number().nonnegative(),maxObservedLeaseGrant:s.array(s.number().nonnegative()),maxObservedLeaseGrantRatio:s.number().nonnegative(),maxObservedLeaseTtlMs:s.number().int().nonnegative()}).optional(),artifactCacheTelemetry:s.object({reads:s.number().int().nonnegative(),l0FreshHits:s.number().int().nonnegative(),l0Misses:s.number().int().nonnegative(),l0StaleServes:s.number().int().nonnegative(),l0StaleIfErrorServes:s.number().int().nonnegative(),l0BlockingRefreshes:s.number().int().nonnegative(),l0SingleflightJoins:s.number().int().nonnegative(),l0EarlyRefreshes:s.number().int().nonnegative(),l1Hits:s.number().int().nonnegative(),l1Misses:s.number().int().nonnegative(),l1Rejected:s.number().int().nonnegative(),l1WriteFailures:s.number().int().nonnegative(),kvHits:s.number().int().nonnegative(),kvMisses:s.number().int().nonnegative(),kvTimeouts:s.number().int().nonnegative(),kvCircuitOpenReads:s.number().int().nonnegative(),resultHits:s.number().int().nonnegative(),resultMisses:s.number().int().nonnegative(),resultDenied:s.number().int().nonnegative(),resultUnavailable:s.number().int().nonnegative(),backgroundRefreshErrors:s.number().int().nonnegative(),l0HitRate:s.number().min(0).max(1),l0SingleflightJoinRate:s.number().min(0).max(1),l0EarlyRefreshRate:s.number().min(0).max(1),l1HitRate:s.number().min(0).max(1),kvHitRate:s.number().min(0).max(1),resultHitRate:s.number().min(0).max(1),staleServeRate:s.number().min(0).max(1)}).optional(),gatewayVersion:s.string()}).passthrough()}).passthrough();var J1=s.object({path:s.string(),code:s.string(),message:s.string()}),DH=s.object({reason:s.literal("schema_validation_failed"),receivedAt:s.string(),rawPayload:s.unknown(),issues:s.array(J1),consumerVersion:s.string().optional(),originalMessageId:s.string().optional()});var $_=["subscription.created","subscription.updated","subscription.canceled","payment.succeeded","payment.failed","rate_limit.exceeded","entitlement.changed","usage.threshold_reached"],jo=s.enum($_);var At=s.enum(["immediate","period_end"]),Wa=s.object({default:At.default("period_end"),when:s.object({price_increase:At.optional(),price_decrease:At.optional(),feature_added:At.optional(),feature_removed:At.optional(),limit_increased:At.optional(),limit_reduced:At.optional(),credit_increased:At.optional(),credit_reduced:At.optional(),rating_changed:At.optional()}).strict().default({price_increase:"period_end",price_decrease:"immediate",feature_added:"immediate",feature_removed:"period_end",limit_increased:"immediate",limit_reduced:"period_end",credit_increased:"immediate",credit_reduced:"period_end",rating_changed:"period_end"}),allowImmediatePriceIncrease:s.boolean().default(!1),allowImmediateEntitlementReduction:s.boolean().default(!1)}).strict().superRefine((t,e)=>{(t.when.price_increase??t.default)==="immediate"&&!t.allowImmediatePriceIncrease&&e.addIssue({code:"custom",path:["when","price_increase"],message:"price_increase cannot switch immediately without allowImmediatePriceIncrease: true"});for(let n of["feature_removed","limit_reduced","credit_reduced"])(t.when[n]??t.default)==="immediate"&&!t.allowImmediateEntitlementReduction&&e.addIssue({code:"custom",path:["when",n],message:`${n} cannot switch immediately without allowImmediateEntitlementReduction: true`})});var W1=s.object({kind:s.literal("credit"),amount_cents:s.number().int().nonnegative(),recurs:s.boolean().optional(),expires_after_days:s.number().int().positive().optional(),label:s.string().min(1).max(120).optional()}),Y1=s.object({kind:s.literal("top_up"),sku:s.string().min(1).max(120),label:s.string().min(1).max(200),price_cents:s.number().int().positive(),credit_cents:s.number().int().positive()}),Ct=s.discriminatedUnion("kind",[W1,Y1]);function Uw(t){return t.kind==="credit"&&t.recurs===!0&&t.label===void 0}function Lw(t){return t.kind==="credit"&&t.recurs!==!0&&t.label===void 0}function S_(t,e,n=["grants"]){if(!t)return;let o=0,r=0;for(let i of t)Uw(i)?o+=1:Lw(i)&&(r+=1);o>1&&e.addIssue({code:"custom",message:"At most one recurring `credit` grant (recurs:true, no label) is allowed \u2014 recurring credit is a single canonical entry.",path:n}),r>1&&e.addIssue({code:"custom",message:"At most one one-time `credit` grant (recurs:false, no label) is allowed \u2014 one-time credit is a single canonical entry.",path:n})}function Mw(t){return t.grants&&t.grants.length>0?[...t.grants]:[]}function w_(t){return Mw(t).find(Uw)?.amount_cents??0}function dd(t){return Mw(t).find(Lw)?.amount_cents??0}var X1=s.object({percent:s.number().int().min(0).max(100)}),Q1=s.object({threshold_cents:s.number().int().nonnegative(),refill_cents:s.number().int().positive()}),ir=s.object({rollover:X1.optional(),auto_recharge:Q1.optional()});var Zw=s.enum(["linear","active_count"]);var eU=s.object({up_to:s.number().int().positive().nullable(),price_per_unit_micros:s.number().int().nonnegative()}),tU=s.object({strategy:s.enum(["graduated","volume"]),tiers:s.array(eU).min(1).max(20)}),jt=s.object({dimension:s.string().min(1).max(64).regex(/^[a-z0-9_]+$/,"Meter dimension must be lowercase alphanumeric with underscores"),kind:Zw.default("linear"),price_per_unit_micros:s.number().int().nonnegative().default(0),tiered:tU.optional(),included_units:s.number().int().positive().optional()}).superRefine((t,e)=>{if(t.tiered&&t.price_per_unit_micros>0&&e.addIssue({code:"custom",message:"`tiered` is mutually exclusive with a non-zero `price_per_unit_micros` \u2014 drop one",path:["tiered"]}),t.included_units!==void 0&&t.tiered&&e.addIssue({code:"custom",message:"`included_units` is mutually exclusive with `tiered` \u2014 a tiered schedule already expresses the included allotment as a zero-priced first tier",path:["included_units"]}),t.tiered){let n=0,o=!1;for(let r=0;r<t.tiered.tiers.length;r++){let i=t.tiered.tiers[r];if(o){e.addIssue({code:"custom",message:"Open-ended tier (`up_to: null`) must be the final tier",path:["tiered","tiers",r,"up_to"]});break}if(i.up_to===null){o=!0;continue}i.up_to<=n&&e.addIssue({code:"custom",message:`Tier upper bounds must be strictly ascending (tier ${r} = ${i.up_to} <= previous ${n})`,path:["tiered","tiers",r,"up_to"]}),n=i.up_to}o||e.addIssue({code:"custom",message:"The final tier of a `tiered` schedule must be open-ended (`up_to: null`)",path:["tiered","tiers",t.tiered.tiers.length-1,"up_to"]})}}),ar=s.enum(["month","year"]),rU=s.object({meters:s.array(jt).default([]),recurring_fee_cents:s.number().int().nonnegative().default(0),billing_interval:ar.default("month"),grants:s.array(Ct).max(40).default([]),creditPolicy:ir.optional(),trial_days:s.number().int().nonnegative().default(0),max_monthly_spend_cents:s.number().int().nonnegative().optional()});var nU=s.string().min(1),oU=s.object({type:s.literal("named"),name:s.enum(["second","minute","hour","day","week","month"])}),iU=s.object({type:s.literal("custom"),seconds:s.number().int().positive(),label:s.string().optional()}),aU=s.discriminatedUnion("type",[oU,iU]),Dr=s.object({dimension:nU,window:aU,capacity:s.number().nonnegative(),enforcement:s.enum(["enforce","track"]).optional(),warnAt:s.number().min(0).max(1).optional(),scope:Ga.optional(),acknowledgeUnreachable:s.boolean().optional()}),QH=s.array(Dr).max(20);var sU=s.enum(["NONE","PRORATE","CREDIT"]).default("NONE"),cU={meters:s.array(jt).default([]),recurring_fee_cents:s.number().int().nonnegative().default(0),billing_interval:ar.default("month"),trial_days:s.number().int().nonnegative().default(0),max_monthly_spend_cents:s.number().int().nonnegative().optional(),min_monthly_spend_cents:s.number().int().nonnegative().optional(),grants:s.array(Ct).max(40).default([]),creditPolicy:ir.optional()},uU={meters:s.array(jt).optional(),recurring_fee_cents:s.number().int().nonnegative().optional(),billing_interval:ar.optional(),trial_days:s.number().int().nonnegative().optional(),max_monthly_spend_cents:s.number().int().nonnegative().optional(),min_monthly_spend_cents:s.number().int().nonnegative().optional(),grants:s.array(Ct).max(40).optional(),creditPolicy:ir.optional()},lU=s.object({id:s.string().min(1).max(64).regex(/^[a-z0-9_-]+$/,"Variant id must be lowercase alphanumeric with hyphens/underscores"),label:s.string().max(200).optional(),rolloutPercent:s.number().int().min(0).max(100),assignmentSeed:s.string().min(1).max(100).default("default"),prorationOnRollback:sU,...uU,limits:s.array(Dr).max(20).optional(),featureGates:s.record(s.string(),s.boolean()).optional(),capability_limits:s.record(s.string().min(1).max(120),s.union([s.number().int().nonnegative(),s.boolean()])).optional(),overageBehavior:s.enum(["block","allow_and_bill"]).optional(),capacity:cd.optional()}),Fw=lU.superRefine((t,e)=>{S_(t.grants,e)}),qw=s.object({key:s.string().min(1).max(64).regex(/^[a-z0-9_-]+$/,"Plan key must be lowercase alphanumeric with hyphens/underscores"),name:s.string().min(1).max(100),description:s.string().max(500).optional(),details:s.array(s.string().max(200)).max(10).optional(),...cU,free:s.boolean().default(!1),limits:s.array(Dr).max(20).default([]),featureGates:s.record(s.string(),s.boolean()).optional(),capability_limits:s.record(s.string().min(1).max(120),s.union([s.number().int().nonnegative(),s.boolean()])).default({}),overageBehavior:s.enum(["block","allow_and_bill"]).default("block"),selfServeEnabled:s.boolean().default(!0),capacity:cd.optional(),legacy:s.boolean().optional().default(!1),variants:s.array(Fw).max(4).optional(),archive:s.object({at:s.string().datetime().optional(),transitionTo:s.string().optional(),strategy:s.enum(["auto","explicit","block"]).default("auto")}).optional()}),pd=qw.superRefine((t,e)=>{S_(t.grants,e)});var dU=/^\$\{[A-Z][A-Z0-9_]{0,127}\}$/,I_=s.string().min(3).max(200).refine(t=>dU.test(t),{message:"secret must use ${VAR} interpolation syntax (e.g. ${WEBHOOK_SECRET}); raw secrets in YAML are rejected. Define the env var in the per-product secret store and reference it here."}),E_=s.object({maxAttempts:s.number().int().min(1).max(20).default(5),backoff:s.enum(["exponential","fixed"]).default("exponential")}),T_=s.object({id:s.string().min(1).max(64).regex(/^[a-z0-9_-]+$/,"Webhook endpoint id must be lowercase alphanumeric with hyphens/underscores"),url:s.string().url("webhooks.endpoints[].url must be a valid URL"),secret:I_,events:s.array(jo).min(1,"webhooks.endpoints[].events must subscribe to \u2265 1 event"),enabled:s.boolean().default(!0),retryPolicy:E_.default({maxAttempts:5,backoff:"exponential"})}),O_=s.object({endpoints:s.array(T_).max(50).default([])});var pU=s.object({meters:s.array(jt).optional(),recurring_fee_cents:s.number().int().nonnegative().optional(),billing_interval:ar.optional(),grants:s.array(Ct).max(40).optional(),creditPolicy:ir.optional(),trial_days:s.number().int().nonnegative().optional(),max_monthly_spend_cents:s.number().int().nonnegative().optional(),limits:s.array(Dr).max(20).optional(),featureGates:s.record(s.string(),s.boolean()).optional(),overageBehavior:s.enum(["block","allow_and_bill"]).optional(),selfServeEnabled:s.boolean().optional(),legacy:s.boolean().optional()}).strict(),mU=s.object({url:s.string().url().optional(),secret:I_.optional(),events:s.array(jo).optional(),enabled:s.boolean().optional(),retryPolicy:E_.partial().optional()}).strict(),fU=s.object({plans:s.record(s.string(),pU).optional(),webhooks:s.object({endpoints:s.record(s.string(),mU).optional()}).strict().optional()}).strict(),P_=s.record(s.string().min(1).max(64),fU);var Vw=1,Bw=["plans_table","usage_card","api_keys_panel","billing_summary","credit_balance","feature_panel","business_docs","audit_log","team_panel","markdown"],Hw=["/","/pricing","/dashboard","/dashboard/*","/settings","/settings/*","/team","/audit-log","/docs","/docs/*","/terms","/privacy","/persona","/persona-sign-in"],Kw=s.string().min(1).max(200).regex(/^\/[a-zA-Z0-9_./-]*$/,"path must start with / and contain only [a-zA-Z0-9_./-]"),R_=s.string().min(1).max(120).regex(/^[a-z0-9_-]+$/),Gw=s.object({label:s.string().min(1).max(80),path:Kw,capability:R_.optional()}),Jw=s.enum(Bw),Ww=s.object({component:Jw,props:s.record(s.string().min(1).max(80),s.unknown()).optional(),capability:R_.optional(),gateMode:s.enum(["hide","disable","upsell"]).default("hide")}),Yw=s.object({path:Kw,title:s.string().min(1).max(120),requiresAuth:s.boolean(),capability:R_.optional(),components:s.array(Ww).max(12).default([])}),z_=s.object({version:s.literal(Vw),nav:s.array(Gw).max(12).default([]),pages:s.array(Yw).max(24).default([])}).superRefine((t,e)=>{let n=new Set;t.pages.forEach((o,r)=>{n.has(o.path)&&e.addIssue({code:"custom",message:`duplicate frontend page path "${o.path}"`,path:["pages",r,"path"]}),n.add(o.path),Xw(o.path)&&e.addIssue({code:"custom",message:`frontend page path "${o.path}" is reserved by the template`,path:["pages",r,"path"]})})});function Xw(t){return Hw.some(e=>{if(e.endsWith("/*")){let n=e.slice(0,-2);return t===n||t.startsWith(`${n}/`)}return t===e})}var Qw=s.enum(["subscription","subject"]),eI=s.enum(["reported","action_inferred"]),tI=s.string().min(1).max(100).regex(/^[a-z0-9_.:-]+$/),rI=s.object({name:tI,display:s.string().min(1).max(120).optional(),scope:Qw.default("subscription"),subjectType:s.string().min(1).max(64).regex(/^[a-zA-Z0-9_.:-]+$/).optional(),countSource:eI.default("reported")}).superRefine((t,e)=>{t.scope==="subject"&&!t.subjectType&&e.addIssue({code:"custom",path:["subjectType"],message:"subjectType is required when resource scope is subject"}),t.scope==="subscription"&&t.subjectType&&e.addIssue({code:"custom",path:["subjectType"],message:"subjectType is only valid for subject-scoped counted resources"})}),N_=s.array(rI).max(100).default([]);var hU=s.object({key:s.string().min(1).max(64).regex(/^[a-z0-9_-]+$/,"AddOn key must be lowercase alphanumeric with hyphens/underscores"),name:s.string().min(1).max(100),description:s.string().max(500).optional(),recurring_fee_cents:s.number().int().nonnegative().default(0),billing_interval:ar.default("month"),meters:s.array(jt).default([]),grants:s.array(Ct).max(40).default([]),capability_limits:s.record(s.string().min(1).max(120),s.union([s.number().int().nonnegative(),s.boolean()])).default({}),featureGates:s.record(s.string(),s.boolean()).optional(),selfServeEnabled:s.boolean().default(!0)}),nI=s.record(s.string().min(1).max(64),hU).default({}),gU=s.enum(["active","canceled","paused","pending_activation"]),IK=s.object({addOnKey:s.string().min(1).max(64),status:gU.default("active"),activatedAt:s.string().datetime().optional(),canceledAt:s.string().datetime().nullable().optional(),stripeSubscriptionItemId:s.string().optional()});var oI=/^[a-z0-9][a-z0-9_-]*$/,A_=s.string().min(1).max(64).regex(oI,"backend id must be a lowercase slug ([a-z0-9][a-z0-9_-]*)"),iI=s.enum(["direct","tunnel"]),aI=s.enum(["embedded","sidecar"]);var sI=s.object({mode:iI.default("direct"),runner:aI.optional()}).strict(),cI=s.object({required:s.boolean().default(!1)}).strict(),uI=s.object({name:s.string().min(1).max(120).optional(),slug:A_.optional(),transport:sI.default({mode:"direct"}),verification:cI.default({required:!1}),meters:s.array(s.string().min(1).max(64)).max(100).optional(),default:s.boolean().optional(),originUrl:s.string().url().optional(),originHostname:s.string().min(1).max(255).optional()}).strict(),C_=s.record(A_,uI),Do=A_,Uo={unknownBackendInRoute:"UNKNOWN_BACKEND_IN_ROUTE",ambiguousDefaultBackend:"AMBIGUOUS_DEFAULT_BACKEND",routeMeterNotAllowedByBackend:"ROUTE_METER_NOT_ALLOWED_BY_BACKEND",unknownMeterInBackend:"UNKNOWN_METER_IN_BACKEND"};function j_(t){let e=Object.keys(t??{});if(e.length===0)return{defaultId:null,ambiguous:!1};if(e.length===1)return{defaultId:e[0],ambiguous:!1};let n=e.filter(o=>t[o]?.default===!0);return n.length===1?{defaultId:n[0],ambiguous:!1}:{defaultId:null,ambiguous:!0}}var _U=s.string().min(2).max(20).regex(/^\d+(ms|s|m|h)$/,"rate_limit window must look like `60s`, `5m`, `1h`"),lI=s.object({strategy:s.enum(["token_bucket","sliding_window","fixed_window"]).default("token_bucket"),dimensions:s.array(s.enum(["subscription","credential","ip","route"])).min(1).max(4).default(["subscription"]),limits:s.array(s.object({window:_U,max:s.number().int().positive().max(1e7)})).min(1).max(10),fail_open:s.object({max_consecutive_failures:s.number().int().positive().default(100),max_window_seconds:s.number().int().positive().default(60),recovery_threshold:s.number().int().positive().default(50),degraded_mode:s.enum(["safe_mode_block","safe_mode_throttle","runtime_killswitch_trigger"]).default("safe_mode_throttle")}).default({max_consecutive_failures:100,max_window_seconds:60,recovery_threshold:50,degraded_mode:"safe_mode_throttle"})}),dI=s.object({header_name:s.string().min(1).max(100).default("x-api-key"),upstream_token_source:s.discriminatedUnion("type",[s.object({type:s.literal("none")}),s.object({type:s.literal("static_bearer"),token_secret_ref:s.string().min(1).max(200).describe("Reference into the secret store (e.g. CF Secret name); not the raw token")})]).default({type:"none"}),scope_mode:s.enum(["strict","advisory","off"]).default("strict")}),pI=s.object({max_in_flight:s.number().int().positive().max(1e4),dimensions:s.array(s.enum(["subscription","credential","capability"])).min(1).max(3).default(["subscription"]),capability:s.string().min(1).max(120).optional(),lease_ttl_seconds:s.number().int().positive().max(600).default(30),fail_open:s.object({max_consecutive_failures:s.number().int().positive().default(50),max_window_seconds:s.number().int().positive().default(60),recovery_threshold:s.number().int().positive().default(20),degraded_mode:s.enum(["safe_mode_block","safe_mode_throttle","runtime_killswitch_trigger"]).default("safe_mode_throttle")}).default({max_consecutive_failures:50,max_window_seconds:60,recovery_threshold:20,degraded_mode:"safe_mode_throttle"})}),mI=s.object({max_attempts:s.number().int().min(1).max(5).default(2),retry_on_status:s.array(s.number().int().min(400).max(599)).min(1).max(20).default([502,503,504]),backoff:s.object({initial_ms:s.number().int().positive().max(5e3).default(100),multiplier:s.number().positive().max(10).default(2),jitter:s.enum(["none","full","equal"]).default("equal"),total_budget_ms:s.number().int().positive().max(3e4).default(5e3)}).default({initial_ms:100,multiplier:2,jitter:"equal",total_budget_ms:5e3})}),fI=s.object({applies_to:s.enum(["request","response","both"]).default("request"),rewrites:s.array(s.object({source:s.string().min(1).max(200),target:s.string().min(1).max(200).nullable()})).min(1).max(20)});var D_=s.discriminatedUnion("type",[s.object({type:s.literal("rate_limit"),config:lI}),s.object({type:s.literal("auth"),config:dI}),s.object({type:s.literal("concurrency"),config:pI}),s.object({type:s.literal("retry"),config:mI}),s.object({type:s.literal("transform"),config:fI})]);var md=s.enum(["long","short","blocking"]).default("long"),hI=s.object({route_types:s.array(s.enum(["http"])).max(5).optional(),meters:s.array(s.string().min(1).max(64)).max(20).optional(),auth_modes:s.array(s.enum(["api_key","oauth2","anonymous"])).max(5).optional()});var U_=s.intersection(s.object({name:s.string().min(1).max(64).regex(/^[a-z0-9_-]+$/,"Policy name must be lowercase alphanumeric with hyphens/underscores"),description:s.string().max(500).optional(),compatible_with:hI.default({}),mutation_class:s.enum(["runtime","contractual"]).default("runtime"),cacheProfile:md}),D_);var yU=s.enum(["query","mutation"]),vU=s.enum(["none","metadata","full"]),bU=s.object({type:s.string().min(1).max(64).regex(/^[a-zA-Z0-9_.:-]+$/),from:s.enum(["header","path_param"]),name:s.string().min(1).max(120)}),xU=s.object({resource:s.string().min(1).max(100).regex(/^[a-z0-9_.:-]+$/),effect:s.enum(["create","delete"])}),gI=s.object({id:s.string().min(1).max(160).regex(/^[a-z0-9_.:-]+$/),title:s.string().min(1).max(160).optional(),kind:yU,actorType:s.string().min(1).max(64).regex(/^[a-zA-Z0-9_.:-]+$/).optional(),subject:bU.optional(),inputSchemaRef:s.string().min(1).max(240).optional(),audit:vU.default("metadata"),resource:xU.optional()});var _I=s.object({method:s.enum(["GET","POST","PUT","PATCH","DELETE","HEAD","OPTIONS","*"]).default("*"),path:s.string().min(1).max(500).regex(/^\/[a-zA-Z0-9_/:.{}*-]*$/,"path must start with / and contain only [a-zA-Z0-9_/:.{}*-]")});function kU(t){let e=t.trim();if(!e)return!1;let[n,o,r]=e.split("-");if(r!==void 0||!/^\d{3}$/.test(n??""))return!1;let i=Number(n),a=o===void 0?i:Number(o);return o!==void 0&&!/^\d{3}$/.test(o)?!1:i>=100&&i<=599&&a>=100&&a<=599&&i<=a}function yI(t){return t.split(",").every(kU)}var fd=s.union([s.string().min(1).max(100).refine(yI,{message:"onStatusCodes must be comma-separated HTTP status codes or numeric ranges, e.g. 200-299,304"}),s.array(s.number().int().min(100).max(599)).min(1).max(100)]),vI=s.object({match:_I,metering:s.object({defaults:s.record(s.string().min(1).max(64),s.number().finite().nonnegative()).optional(),reports:s.array(s.string().min(1).max(64)).max(20).optional(),estimates:s.record(s.string().min(1).max(64),s.number().finite().nonnegative()).optional(),onStatusCodes:fd.optional()}).optional(),unmetered:s.boolean().optional(),inheritDefaultMeters:s.boolean().optional(),action:s.string().min(1).max(160).regex(/^[a-z0-9_.:-]+$/).optional(),backend:Do.optional(),usagePolicy:ud.optional()}).strict(),bI=s.object({override_origin:s.string().url("override_origin must be a valid URL").nullable().default(null)}),xI=s.object({rollout_key:s.string().min(1).max(120).regex(/^[a-z0-9_-]+$/,"rollout_key must be lowercase alphanumeric with hyphens/underscores").optional(),required_flags:s.array(s.string().min(1).max(120).regex(/^[a-z0-9_-]+$/)).max(10).optional()}),L_=s.object({feature:s.string().min(1).max(100).regex(/^[a-z0-9_.:-]+$/,"feature key must be lowercase alphanumeric with [_.:-]"),description:s.string().max(500).optional(),mutation_class:s.enum(["runtime","contractual"]).default("contractual"),cacheProfile:md,routes:s.array(vI).min(1).max(50),upstream:bI.default({override_origin:null}),policies:s.array(s.string().min(1).max(64).regex(/^[a-z0-9_-]+$/)).max(20).default([]),runtime:xI.default({}),plans:s.array(s.string().min(1).max(64)).max(20).default([]),actions:s.array(gI).max(100).optional(),backend:Do.optional()}).strict();function kI(t,e){t.usagePricing!==void 0&&e.addIssue({code:"custom",path:["usagePricing"],message:"usagePricing is not supported. Define usage.meters.<key>.rating instead."})}function $I(t,e){t.filter(o=>o.free).length>1&&e.addIssue({code:"custom",path:["plans"],message:"Only one free plan is allowed per product"}),t.forEach((o,r)=>{o.free&&($U(o,r,e),SU(o,r,e))})}function $U(t,e,n){(PI(t)??0)!==0&&n.addIssue({code:"custom",path:["plans",e,"recurring_fee_cents"],message:"Free plans must have zero price"})}function SU(t,e,n){t.limits.some(r=>!r.enforcement||r.enforcement==="enforce")||n.addIssue({code:"custom",path:["plans",e,"limits"],message:"Free plans must include at least one hard enforced limit"})}function SI(t,e){let n=new Map;t.forEach((o,r)=>{if(o.free)return;let i=PI(o);if(i===void 0||i<=0)return;let a=OU(o,i),c=n.get(a);if(c){e.addIssue({code:"custom",path:["plans",r,"recurring_fee_cents"],message:`Paid plan price duplicates plan "${c}" (${a})`});return}n.set(a,o.key)})}function wI(t,e){let n=new Set((t.metering?.meters??[]).map(r=>r.key).filter(r=>typeof r=="string"&&r.length>0)),o=new Set(Object.keys(t.usage?.meters??{}));t.plans.forEach((r,i)=>{let a=r.meters;a&&a.forEach((c,u)=>{let l=c.dimension;typeof l!="string"||l.length===0||n.has(l)||o.has(l)||e.addIssue({code:"custom",path:["plans",i,"meters",u,"dimension"],message:`Plan "${r.key}" prices meter "${l}" but no metering.meters[] entry and no usage.meters[] entry declares it.`})})})}function II(t,e){if(!t.features)return;let n=new Set(t.plans.map(o=>o.key));for(let[o,r]of Object.entries(t.features)){if(!r.plans)continue;r.plans.forEach((a,c)=>{n.has(a)||e.addIssue({code:"custom",path:["features",o,"plans",c],message:`Feature "${o}" references unknown plan "${a}"`})});let i=new Set;r.plans.forEach((a,c)=>{i.has(a)&&e.addIssue({code:"custom",path:["features",o,"plans",c],message:`Feature "${o}" lists plan "${a}" more than once`}),i.add(a)})}}function EI(t,e){if(!t.features)return;let n=new Set((t.metering?.meters??[]).map(r=>r.key).filter(r=>typeof r=="string"&&r.length>0)),o=!1;for(let[r,i]of Object.entries(t.features))(i.routes??[]).forEach((c,u)=>{let l=M_(c);l.length!==0&&(o=!0,l.forEach((d,p)=>{n.has(d)||e.addIssue({code:"custom",path:["features",r,"routes",u,"metering",p],message:`Route references unknown meter "${d}". Declare it in metering.meters[].`})}))});o&&n.size===0&&e.addIssue({code:"custom",path:["metering","meters"],message:"One or more routes declare metering keys but `metering.meters[]` is empty. Declare meters at the product level first."})}function wU(t,e){let n=new Map;for(let o of t.plans)n.set(o.key,new Set);if(!t.features){for(let o of n.values())for(let r of e)o.add(r);return n}for(let o of Object.values(t.features))IU(o,n);return n}function IU(t,e){let n=t.plans??[],o=t.routes??[];for(let r of n){let i=e.get(r);if(i)for(let a of o){if(a.unmetered===!0)continue;let c=M_(a);if(c.length>0){for(let u of c)i.add(u);continue}}}}function M_(t){let e=new Set;for(let n of Object.keys(t.metering?.defaults??{}))e.add(n);for(let n of t.metering?.reports??[])e.add(n);for(let n of Object.keys(t.metering?.estimates??{}))e.add(n);return[...e]}function EU(t){if(!t||typeof t!="object")return null;let e=t;return typeof e.dimension=="string"?e.dimension:null}var TU=new Set(["credits"]);function TI(t,e){if(!t.plans||t.plans.length===0)return;let n=new Set((t.metering?.meters??[]).map(i=>i.key).filter(i=>typeof i=="string"&&i.length>0)),o=new Set(Object.keys(t.usage?.meters??{})),r=wU(t,n);t.plans.forEach((i,a)=>{let c=i.limits??[],u=r.get(i.key)??new Set;c.forEach((l,d)=>{if(l&&typeof l=="object"?l.acknowledgeUnreachable===!0:!1)return;let m=EU(l);m&&(u.has(m)||o.has(m)||TU.has(m)||e.addIssue({code:"custom",path:["plans",a,"limits",d,"meter"],message:`Plan "${i.key}" limits meter "${m}" but no route in any granted feature emits this meter, and the meter is not declared under usage.meters either. Either grant a feature whose routes meter "${m}" to this plan, declare the meter under metering.meters[] or usage.meters, or set acknowledgeUnreachable: true if the limit is intentional (e.g. soft budget).`}))})})}function OI(t,e){let n=t.backend;if(!n||Object.keys(n).length===0)return;let o=new Set(Object.keys(n)),r=new Set((t.metering?.meters??[]).map(u=>u.key).filter(u=>typeof u=="string"&&u.length>0));for(let[u,l]of Object.entries(n))(l.meters??[]).forEach((d,p)=>{r.has(d)||e.addIssue({code:"custom",path:["backend",u,"meters",p],message:`${Uo.unknownMeterInBackend}: backend "${u}" allows meter "${d}" but no metering.meters[] entry declares it.`})});let{defaultId:i,ambiguous:a}=j_(n),c=!1;for(let u of Object.values(t.features??{}))for(let l of u.routes??[])l.backend===void 0&&(c=!0);a&&c&&e.addIssue({code:"custom",path:["backend"],message:`${Uo.ambiguousDefaultBackend}: product declares ${o.size} backends but no single default \u2014 mark exactly one backend \`default: true\` or bind every route explicitly.`});for(let[u,l]of Object.entries(t.features??{}))(l.routes??[]).forEach((d,p)=>{let m=d.backend??i;if(d.backend!==void 0&&!o.has(d.backend)){e.addIssue({code:"custom",path:["features",u,"routes",p,"backend"],message:`${Uo.unknownBackendInRoute}: route binds backend "${d.backend}" which is not declared in the product \`backend\` block.`});return}if(!m)return;let g=n[m]?.meters;if(!g)return;let v=new Set(g);for(let b of M_(d))v.has(b)||e.addIssue({code:"custom",path:["features",u,"routes",p,"metering"],message:`${Uo.routeMeterNotAllowedByBackend}: route meters "${b}" but backend "${m}" does not allow it (backend.meters[] = [${g.join(", ")}]).`})})}function PI(t){return t.recurring_fee_cents}function OU(t,e){return`USD:month:${e}`}var PU=s.object({subdomain:s.string().min(1).max(63).regex(/^[a-z0-9]([a-z0-9-]*[a-z0-9])?$/,"Subdomain must be lowercase alphanumeric with optional hyphens")}),RI=s.enum(["exact_pre_request","estimated_then_settled","postpaid","strict_concurrency"]),RU=s.enum(Rw),Z_=s.object({key:s.string().min(1).max(64).regex(/^[a-z0-9_]+$/,"Meter key must be lowercase alphanumeric with underscores"),display:s.string().min(1).max(100),unit:s.string().max(20).optional(),estimate:s.number().finite().nonnegative().optional(),routeDefault:s.number().finite().nonnegative().optional(),enforcementType:RI.default("estimated_then_settled"),aggregation:s.enum(["SUM","COUNT","MAX","UNIQUE_COUNT","LATEST"]).default("COUNT"),window:s.enum(["minute","hour","day","month","billing_period"]).default("billing_period"),valueProperty:s.string().optional(),uniqueProperty:s.string().optional(),groupBy:s.array(s.string()).optional(),eventCode:s.string().optional(),tokenCategory:RU.optional(),reserveStrategy:s.enum(["reserve_max","estimate","count_actual"]).optional(),reserveCeiling:s.number().int().positive().optional(),pairsWith:s.string().min(1).max(64).optional()}),zI=s.string().min(1).max(64).regex(/^[a-z0-9_]+$/,"Usage measure must be lowercase alphanumeric with underscores"),zU=s.enum(["pass_through","markup"]),NU=s.object({source:s.literal("fixed"),rates:s.record(s.string().min(1),s.record(zI,s.number().int().nonnegative()))}),AU=s.object({source:s.literal("provider_catalog"),catalog:s.string().min(1).max(100),pricePolicy:zU.default("pass_through"),markupPercent:s.number().nonnegative().max(1e4).optional(),marginMicros:s.number().int().nonnegative().optional()}),NI=s.discriminatedUnion("source",[NU,AU]),AI=s.object({selector:s.string().min(1).max(100).optional(),measures:s.array(zI).min(1).max(20),rating:NI.optional()}),CI=s.object({meters:s.record(s.string().min(1).max(64).regex(/^[a-z0-9_]+$/),AI)}),CU=s.object({defaults:s.record(s.string().min(1).max(64),s.number().finite().nonnegative()).optional(),reports:s.array(s.string().min(1).max(64)).max(20).optional(),estimates:s.record(s.string().min(1).max(64),s.number().finite().nonnegative()).optional(),onStatusCodes:fd.optional()}),jI=s.object({method:s.enum(["GET","POST","PUT","PATCH","DELETE","HEAD","OPTIONS","*"]).default("*"),path:s.string().min(1).max(500).regex(/^\/[a-zA-Z0-9_/:.{}*-]*$/,"path must start with / and contain only [a-zA-Z0-9_/:.{}*-]"),unmetered:s.boolean().optional(),metering:CU.optional(),inheritDefaultMeters:s.boolean().optional(),backend:Do.optional()}).strict(),F_=s.object({description:s.string().max(500).optional(),routes:s.array(jI).min(1).max(50),plans:s.array(s.string().min(1)).min(1).max(20)}),DI=s.record(s.string().min(1).max(100).regex(/^[a-z0-9_.:-]+$/),F_),UI=s.enum(["report","pull_request"]),LI=s.enum(["safe","non_blocking","economic_risk","blocking"]),MI=s.object({cleanup:s.object({enabled:s.boolean().default(!1),mode:UI.default("report")}).default({enabled:!1,mode:"report"}),change_approval:s.object({auto_merge_max_risk:s.enum(["none","safe","non_blocking"]).default("none"),require_human_for:s.array(LI).default(["economic_risk","blocking"])}).default({auto_merge_max_risk:"none",require_human_for:["economic_risk","blocking"]})}).default({cleanup:{enabled:!1,mode:"report"},change_approval:{auto_merge_max_risk:"none",require_human_for:["economic_risk","blocking"]}}),ZI=s.enum(["org_only","org_and_user"]),FI=s.enum(["clerk","test-personas"]),qI=s.object({identity_requirement:ZI.optional(),context_tokens:s.object({enabled:s.boolean().default(!0)}).optional(),portal_auth:s.object({strategy:FI}).optional()}),VI=s.enum(["frontend","api","docs","widget","dashboard","webhook","worker","agent"]),BI=s.object({key:s.string().min(1).max(64).regex(/^[a-z0-9_-]+$/,"Surface key must be lowercase alphanumeric with hyphens/underscores"),type:VI,display:s.string().min(1).max(100).optional(),description:s.string().max(500).optional()}),HI=s.object({key:s.string().min(1).max(64).regex(/^[a-z0-9_-]+$/,"Entitlement key must be lowercase alphanumeric with hyphens/underscores"),description:s.string().max(500).optional(),capabilities:s.array(s.string().min(1).max(100)).max(100).optional(),featureGates:s.record(s.string().min(1),s.boolean()).optional(),limits:s.array(Dr).max(100).optional(),meters:s.array(s.string().min(1).max(64)).max(100).optional()}),KI=s.array(BI).max(20).default([]),GI=s.array(HI).max(100).default([]),JI=s.enum(["async_job","agent_task","scheduled","lifecycle","background"]),WI=s.discriminatedUnion("type",[s.object({type:s.literal("manual")}),s.object({type:s.literal("schedule"),cron:s.string().min(1).max(120)}),s.object({type:s.literal("event"),event:s.string().min(1).max(120)}),s.object({type:s.literal("api"),path:s.string().min(1).max(240).regex(/^\//,"path must start with /")}),s.object({type:s.literal("lifecycle"),event:s.string().min(1).max(120)})]),YI=s.object({key:s.string().min(1).max(64).regex(/^[a-z0-9_-]+$/,"Workflow key must be lowercase alphanumeric with hyphens/underscores"),title:s.string().min(1).max(120).optional(),description:s.string().max(1e3).optional(),kind:JI,trigger:WI,capabilities:s.array(s.string().min(1).max(100)).max(100).optional(),meters:s.array(s.string().min(1).max(64)).max(100).optional(),estimates:s.record(s.string().min(1).max(64),s.number().finite()).optional(),metadata:s.record(s.string().min(1),s.unknown()).optional()}),XI=s.array(YI).max(100).default([]),dn=s.object({product:s.object({name:s.string().min(1).max(100),displayName:s.string().max(200).optional(),description:s.string().max(2e3).optional(),baseUrl:s.string().url("baseUrl must be a valid URL"),sandboxBaseUrl:s.string().url("sandboxBaseUrl must be a valid URL").optional(),visibility:s.enum(["public","private"]).default("public"),logoUrl:s.string().url().optional(),primaryColor:s.string().regex(/^#[0-9a-fA-F]{6}$/).optional(),envBranchPrefix:s.string().max(50).nullable().optional()}),gateway:s.object({authHeader:s.string().min(1).max(100).default("x-api-key"),upstreamAuth:s.object({type:s.enum(["none","static_bearer"]),token:s.string().optional()}).default({type:"none"})}),metering:s.object({meters:s.array(Z_).max(10).default([]),billOn4xx:s.boolean().default(!1)}).default({meters:[],billOn4xx:!1}),backend:C_.optional(),usage:CI.optional(),usagePricing:s.never({error:"usagePricing is not supported. Define usage.meters.<key>.rating instead."}).optional(),features:DI.optional(),resources:N_,policies:MI,customer_context:qI.optional(),surfaces:KI,entitlements:GI,workflows:XI,frontend:z_.optional(),billing:s.object({applyLimitUpgradesInstantly:s.boolean().optional(),subscriberChangePolicy:Wa.default({default:"period_end",when:{price_increase:"period_end",price_decrease:"immediate",feature_added:"immediate",feature_removed:"period_end",limit_increased:"immediate",limit_reduced:"period_end",credit_increased:"immediate",credit_reduced:"period_end",rating_changed:"period_end"},allowImmediatePriceIncrease:!1,allowImmediateEntitlementReduction:!1})}).default({subscriberChangePolicy:{default:"period_end",when:{price_increase:"period_end",price_decrease:"immediate",feature_added:"immediate",feature_removed:"period_end",limit_increased:"immediate",limit_reduced:"period_end",credit_increased:"immediate",credit_reduced:"period_end",rating_changed:"period_end"},allowImmediatePriceIncrease:!1,allowImmediateEntitlementReduction:!1}}),plans:s.array(pd).max(4).default([]),add_ons:nI,lifecycle:s.object({breaking_changes:s.object({require_deprecation_window_days:s.number().int().nonnegative().default(0),require_successor_route:s.boolean().default(!1)}).default({require_deprecation_window_days:0,require_successor_route:!1})}).default({breaking_changes:{require_deprecation_window_days:0,require_successor_route:!1}}),webhooks:O_.optional(),environments:P_.optional(),ephemeral:s.object({defaultPlan:s.string().min(1).optional()}).optional()}).superRefine((t,e)=>{kI(t,e),$I(t.plans,e),SI(t.plans,e),wI(t,e),II(t,e),EI(t,e),TI(t,e),OI(t,e)}),jU=s.object({product:dn.shape.product}),DU=s.object({gateway:dn.shape.gateway}),UU=s.object({metering:dn.shape.metering}),LU=s.object({plans:dn.shape.plans});var q_=s.object({capability:s.string().min(1).max(120).regex(/^[a-z0-9_-]+$/,"capability name must be lowercase alphanumeric with hyphens/underscores"),description:s.string().max(500).optional(),mutation_class:s.enum(["runtime","contractual"]).default("contractual"),includes_features:s.array(s.string().min(1).max(100).regex(/^[a-z0-9_.:-]+$/)).max(20).default([]),includes_policies:s.array(s.string().min(1).max(64).regex(/^[a-z0-9_-]+$/)).max(20).default([]),includes_capabilities:s.array(s.string().min(1).max(120).regex(/^[a-z0-9_-]+$/)).max(20).default([])});var QI=1;var MU=s.object({irVersion:s.literal(QI),sdkVersion:s.string().min(1).max(64),product:dn,routes:s.array(L_).max(200).default([]),policies:s.array(U_).max(200).default([]),capabilities:s.array(q_).max(200).default([])}).strict();var ZG=s.object({subscriberChangePolicy:Wa.optional()}),FG=s.object({code:s.string(),kind:s.enum(["percent_off","amount_off","free_months"]),amount:s.number().optional(),durationMonths:s.number(),applicablePlanIds:s.array(s.string()).optional(),maxRedemptions:s.number().optional(),activeFrom:s.string().optional(),activeUntil:s.string().optional(),status:s.enum(["ACTIVE","ARCHIVED"]).optional()}),qG=s.object({id:s.string(),actorUserId:s.string().optional(),action:s.string(),decision:s.string().optional(),timestamp:s.string(),details:s.unknown().optional()}),VG=s.object({name:s.string(),branch:s.string().optional(),isProduction:s.boolean().optional()}),BG=s.object({id:s.string(),name:s.string(),apiKeyId:s.string().optional()});var ZU=["IMMEDIATE_NO_PRORATE","IMMEDIATE_PRORATE_CHARGE_NEW","IMMEDIATE_PRORATE_REFUND_OLD","IMMEDIATE_PRORATE_BOTH","DEFER_TO_PERIOD_END"],XG=s.enum(ZU);var eE=s.object({id:s.string(),billingCycleId:s.string(),effectiveStart:s.string(),effectiveEnd:s.string(),compiledPlanId:s.string()}),tE=s.object({currentPeriod:eE,priorPeriod:eE.optional()});var FU=s.object({subjectKey:s.string(),subscriptionId:s.string(),subscriberId:s.string(),productId:s.string(),organizationId:s.string(),compiledPlanId:s.string(),activeEntitlementHash:s.string().optional(),generation:s.number(),enforcementMode:s.enum(["STRICT","GRACE","TRACK_ONLY"]),dedicatedShard:s.enum(["ACTIVE","DRAINING"]).optional(),resourceCounts:s.record(s.string(),s.number()).optional(),overrides:s.object({featureGateOverrides:s.record(s.string(),s.boolean()).optional()}).optional(),subscriptionStatus:s.string(),subscriberStatus:s.string(),scopes:s.array(s.string()),periods:tE,expiresAt:s.number().optional(),trialEndsAt:s.string().optional()}),qU=s.discriminatedUnion("kind",[s.object({kind:s.literal("found"),state:FU,expiresAt:s.number(),ttlSeconds:s.number()}),s.object({kind:s.literal("not_found"),negativeCacheTtlSeconds:s.number().default(60)}),s.object({kind:s.literal("revoked"),negativeCacheTtlSeconds:s.number().default(300),reason:s.string().optional()}),s.object({kind:s.literal("rate_limited"),retryAfterSeconds:s.number().default(10)})]),oJ=s.object({environmentId:s.string().nullable(),subjectKeys:s.array(s.string()).min(1).max(500)}),iJ=s.object({results:s.array(s.object({subjectKey:s.string(),result:qU}))}),VU=s.object({keyId:s.string(),orgId:s.string(),productId:s.string(),compiledPlanId:s.string(),entitlementHash:s.string().optional(),subscriptionId:s.string(),subscriberId:s.string(),apiKeyId:s.string().nullable(),subjectKey:s.string(),entitlementVersion:s.number().int(),identityRequirement:s.enum(["org_only","org_and_user"]),status:s.enum(["active","revoked"]),subscriberStatus:s.enum(["ONBOARDING","ACTIVE","SUSPENDED"]),subscriptionStatus:s.string(),environment:s.enum(["production","sandbox"]).optional(),environmentId:s.string().optional(),scopes:s.array(s.string()).default([]),entitlement:s.unknown().optional(),actorType:s.enum(["org","user"]).optional(),actorId:s.string().nullable().optional(),currentPeriodId:s.string().optional(),currentPeriodStartMs:s.number().int().nonnegative().optional(),expiresAt:s.number().nullable().optional()}),aJ=s.discriminatedUnion("kind",[s.object({kind:s.literal("found"),record:VU,expiresAt:s.number(),ttlSeconds:s.number()}),s.object({kind:s.literal("not_found"),negativeCacheTtlSeconds:s.number().default(60)}),s.object({kind:s.literal("revoked"),negativeCacheTtlSeconds:s.number().default(300),reason:s.string().optional()}),s.object({kind:s.literal("rate_limited"),retryAfterSeconds:s.number().default(10)})]),sJ=s.discriminatedUnion("kind",[s.object({kind:s.literal("found"),entitlement:s.unknown(),expiresAt:s.number(),ttlSeconds:s.number()}),s.object({kind:s.literal("not_found"),negativeCacheTtlSeconds:s.number().default(60)}),s.object({kind:s.literal("rate_limited"),retryAfterSeconds:s.number().default(10)})]),BU=s.object({id:s.string(),origin:s.string(),sandboxOrigin:s.string().nullable().optional(),authHeader:s.string().optional(),pricing:s.record(s.string(),s.number()).optional(),metering:s.object({tokens:s.object({estimatePerRequest:s.number().optional()}).optional(),computeMs:s.object({estimatePerRequest:s.number().optional()}).optional(),billOn4xx:s.boolean().optional()}).optional(),tenantLimits:s.array(s.object({unit:s.enum(["requests","tokens","computeMs","dollars"]),window:s.enum(["second","minute","hour","day","week","month"]),capacity:s.number()})).optional(),userLimits:s.array(s.object({unit:s.enum(["requests","tokens","computeMs","dollars"]),window:s.enum(["second","minute","hour","day","week","month"]),capacity:s.number()})).optional(),environmentId:s.string().optional(),contextTokenSecret:s.string().nullable().optional(),timeoutMs:s.number().positive().optional(),idleTimeoutMs:s.number().positive().optional()}),cJ=s.discriminatedUnion("kind",[s.object({kind:s.literal("found"),tenant:BU,expiresAt:s.number(),ttlSeconds:s.number()}),s.object({kind:s.literal("not_found"),negativeCacheTtlSeconds:s.number().default(60)}),s.object({kind:s.literal("rate_limited"),retryAfterSeconds:s.number().default(10)})]);var hd=["consumer_api_key","consumer_session_token","test_persona_session_token","builder_master_key","builder_session_token","maker_jwt","service_jwt","internal_service","context_token"],rE=s.enum(hd);var HU=s.object({fromIssuer:s.string().min(1),fromTokenId:s.string().min(1),intent:s.string().min(1)}),nE=s.object({issuer:s.string().min(1),issuedAt:s.number().int().nonnegative(),expiresAt:s.number().int().nonnegative().optional(),tokenId:s.string().min(1).optional(),delegationChain:s.array(HU)});var V_=["template","embedded","provisioned","agent"],KU=s.enum(V_),GU=["builder_user","builder_org","maker","consumer_subject","internal_service","service_jwt","agent_runtime"],JU=s.enum(GU),oE=s.object({kind:JU,id:s.string().min(1),label:s.string().optional()}),WU=["subscription","organization","platform"],YU=s.enum(WU),XU=s.object({kind:YU,id:s.string().min(1)}),QU=s.object({type:rE,id:s.string().min(1),hint:s.string().max(8).optional()}),e4=s.object({compiledPlanId:s.string().min(1),fromCache:s.boolean().optional()}),iE=s.object({requestId:s.string().min(1),surface:KU,builderOrgId:s.string().min(1),productId:s.string().min(1).optional(),runtimeId:s.string().min(1).optional(),template:s.string().optional(),caller:oE,actor:oE,billingSubject:XU,credential:QU,capability:s.string().min(1),scopes:s.array(s.string()),entitlement:e4.optional(),trust:nE});var Ya;(function(t){t.AUTHZ_DECISION="authz_decision",t.ENTITLEMENT_DECISION="entitlement_decision",t.RUNTIME_LIMIT_DECISION="runtime_limit_decision",t.RESOURCE_GOVERNANCE_DECISION="resource_governance_decision",t.RESOURCE_MUTATION="resource_mutation",t.LIFECYCLE_EVENT="lifecycle_event",t.RUNTIME_CONTEXT_CREATED="runtime_context_created",t.SYSTEM_ACTION="system_action"})(Ya||(Ya={}));var aE=Object.values(Ya),EJ=s.enum(aE),sE=s.object({decisionId:s.string().optional(),ctx:iE,details:s.record(s.string(),s.unknown()).optional(),createdAt:s.string().min(1)}),t4=aE.filter(t=>t!==Ya.SYSTEM_ACTION),r4=sE.extend({kind:s.enum(t4)}),n4=sE.extend({kind:s.literal(Ya.SYSTEM_ACTION),actorType:s.string().min(1),action:s.string().min(1)}),TJ=s.discriminatedUnion("kind",[r4,n4]);var ue=["template","agent"],o4=["provisioned"],cE=[...V_],le=["builder_master_key","builder_session_token","maker_jwt"],Lo=["service_jwt","internal_service"],B_=["consumer_api_key","consumer_session_token","test_persona_session_token","context_token"],uE=[...hd],Xa="subscriptions:write",i4=[{id:"products.create",operation:"Create a product",requiredScopes:["products:write"],allowedSurfaces:ue,allowedCredentialTypes:le,description:"Create a new product in the builder org"},{id:"products.update",operation:"Update a product",requiredScopes:["products:write"],allowedSurfaces:ue,allowedCredentialTypes:le,description:"Update product metadata or compiled config"},{id:"products.delete",operation:"Delete a product",requiredScopes:["products:write"],allowedSurfaces:ue,allowedCredentialTypes:le,description:"Delete a product (soft-archive if subscriptions exist)"},{id:"products.read",operation:"Read a product",requiredScopes:["products:read"],allowedSurfaces:ue,allowedCredentialTypes:le,description:"Read product metadata + compiled config"},{id:"products.publish",operation:"Publish a product",requiredScopes:["products:write"],allowedSurfaces:ue,allowedCredentialTypes:le,description:"Compile + publish the product to the gateway"},{id:"plans.create",operation:"Create a plan",requiredScopes:["plans:write"],allowedSurfaces:ue,allowedCredentialTypes:le,description:"Add a new plan to a product"},{id:"plans.update",operation:"Update a plan",requiredScopes:["plans:write"],allowedSurfaces:ue,allowedCredentialTypes:le,description:"Update plan pricing, limits, or features"},{id:"plans.delete",operation:"Delete a plan",requiredScopes:["plans:write"],allowedSurfaces:ue,allowedCredentialTypes:le,description:"Delete a plan (denied if subscriptions are attached)"},{id:"plans.publish",operation:"Publish a plan",requiredScopes:["plans:write"],allowedSurfaces:ue,allowedCredentialTypes:le,description:"Mark a plan as available for new subscriptions"},{id:"subscriptions.create",operation:"Create a subscription",requiredScopes:[Xa],allowedSurfaces:ue,allowedCredentialTypes:[...le,...Lo],description:"Provision a new subscription for a subscriber"},{id:"subscriptions.update",operation:"Update a subscription",requiredScopes:[Xa],allowedSurfaces:ue,allowedCredentialTypes:[...le,...Lo],description:"Change plan, enforcement mode, or schedule"},{id:"subscriptions.cancel",operation:"Cancel a subscription",requiredScopes:[Xa],allowedSurfaces:ue,allowedCredentialTypes:[...le,...Lo],description:"Cancel a subscription (immediate or end-of-period)"},{id:"subscriptions.pause",operation:"Pause a subscription",requiredScopes:[Xa],allowedSurfaces:ue,allowedCredentialTypes:[...le,...Lo],description:"Pause a subscription (no usage, no billing)"},{id:"subscriptions.resume",operation:"Resume a subscription",requiredScopes:[Xa],allowedSurfaces:ue,allowedCredentialTypes:[...le,...Lo],description:"Resume a paused subscription"},{id:"subscriptions.read",operation:"Read a subscription",requiredScopes:["subscriptions:read"],allowedSurfaces:ue,allowedCredentialTypes:[...le,...Lo],description:"Read subscription state and usage"},{id:"webhooks.create",operation:"Create a webhook endpoint",requiredScopes:["webhooks:write"],allowedSurfaces:ue,allowedCredentialTypes:le,description:"Register a new webhook endpoint URL"},{id:"webhooks.update",operation:"Update a webhook endpoint",requiredScopes:["webhooks:write"],allowedSurfaces:ue,allowedCredentialTypes:le,description:"Update endpoint URL, secret, or subscribed events"},{id:"webhooks.delete",operation:"Delete a webhook endpoint",requiredScopes:["webhooks:write"],allowedSurfaces:ue,allowedCredentialTypes:le,description:"Remove a webhook endpoint"},{id:"webhooks.test",operation:"Send a test webhook payload",requiredScopes:["webhooks:write"],allowedSurfaces:ue,allowedCredentialTypes:le,description:"Trigger a synthetic payload to verify an endpoint"},{id:"api-keys.create",operation:"Create an API key",requiredScopes:["api-keys:write"],allowedSurfaces:ue,allowedCredentialTypes:le,description:"Mint a new consumer or master API key"},{id:"api-keys.revoke",operation:"Revoke an API key",requiredScopes:["api-keys:write"],allowedSurfaces:ue,allowedCredentialTypes:le,description:"Revoke an API key (immediate invalidation)"},{id:"api-keys.read",operation:"Read API key metadata",requiredScopes:["api-keys:read"],allowedSurfaces:ue,allowedCredentialTypes:le,description:"Read key id + hint + scopes (never the secret)"},{id:"organizations.create",operation:"Create an organization",requiredScopes:["orgs:write"],allowedSurfaces:["template"],allowedCredentialTypes:["builder_session_token"],description:"Create a builder org (top-level signup)"},{id:"organizations.update",operation:"Update an organization",requiredScopes:["orgs:write"],allowedSurfaces:ue,allowedCredentialTypes:le,description:"Update org metadata or billing email"},{id:"members.invite",operation:"Invite a member to an organization",requiredScopes:["members:write"],allowedSurfaces:ue,allowedCredentialTypes:le,description:"Send an invitation to join the org"},{id:"members.remove",operation:"Remove a member from an organization",requiredScopes:["members:write"],allowedSurfaces:ue,allowedCredentialTypes:le,description:"Revoke a member's access to the org"},{id:"projects.create",operation:"Create a project",requiredScopes:["projects:write"],allowedSurfaces:ue,allowedCredentialTypes:le,description:"Create a project (groups products + environments)"},{id:"environments.create",operation:"Create an environment",requiredScopes:["environments:write"],allowedSurfaces:ue,allowedCredentialTypes:le,description:"Add a deployment environment (stage / branch)"},{id:"environments.delete",operation:"Delete an environment",requiredScopes:["environments:write"],allowedSurfaces:ue,allowedCredentialTypes:le,description:"Remove a deployment environment"},{id:"billing.portal-redirect",operation:"Generate Stripe customer-portal redirect",requiredScopes:["billing:portal"],allowedSurfaces:ue,allowedCredentialTypes:[...le,...B_],description:"Mint a one-time Stripe portal-session redirect URL"},{id:"billing.read",operation:"Read billing state",requiredScopes:["billing:read"],allowedSurfaces:ue,allowedCredentialTypes:[...le,...B_],description:"Read invoices, balances, scheduled changes"},{id:"runtime-context.read",operation:"Read the caller's runtime context",requiredScopes:[],allowedSurfaces:cE,allowedCredentialTypes:uE,description:"Introspect the resolved RuntimeContext (minus secrets)"},{id:"capabilities.list",operation:"List registered capabilities",requiredScopes:[],allowedSurfaces:cE,allowedCredentialTypes:uE,description:"List all capabilities the registry knows about"},{id:"explain-denial.read",operation:"Explain a denial decision",requiredScopes:["audit:read"],allowedSurfaces:ue,allowedCredentialTypes:le,description:"Look up a decision id + return the full ctx + reason"},{id:"replay.execute",operation:"Replay a historical billing period",requiredScopes:["replay:execute"],allowedSurfaces:ue,allowedCredentialTypes:le,description:"Re-run billing for a past period; verify deltas"},{id:"rollback.execute",operation:"Execute a GitHub-driven product rollback",requiredScopes:["rollback:execute"],allowedSurfaces:ue,allowedCredentialTypes:le,description:"Revert business.config.ts to a previous commit (dry-run capable)"},{id:"api.invoke",operation:"Invoke a consumer-facing gateway route",requiredScopes:[],allowedSurfaces:o4,allowedCredentialTypes:B_,description:"Consumer-side traffic into a deployed product (catch-all). The EntitlementEngine + RuntimeLimitEngine handle the fine-grained gating; this capability is the umbrella entry-point."}],zJ=Object.freeze(i4);var a4=["BusinessApplyWorkflow","RollbackWorkflow","StripeSyncWorkflow","WebhookDispatchWorkflow","SubscriptionTransitionWorkflow","CompiledPlanLifecycleWorkflow","ShardReshardWorkflow","MaintenanceJobWorkflow"],jJ=s.enum(a4),s4=["transient","permanent","rollback-required","human-intervention"],DJ=s.enum(s4);var c4=["SAFE_AUTOMATIC","REQUIRES_APPROVAL","IRREVERSIBLE","BILLING_IMPACTING","EDGE_BREAKING"],UJ=s.enum(c4);var VJ=s.object({workflowExecutionId:s.string().min(1),eventType:s.string().min(1),phase:s.string().min(1).optional(),stepId:s.string().min(1).optional(),cohortKey:s.string().min(1).optional(),payload:s.record(s.string(),s.unknown()),occurredAt:s.string().min(1),correlationId:s.string().min(1).optional()}).transform(t=>({...t,workflowExecutionId:t.workflowExecutionId,stepId:t.stepId===void 0?void 0:t.stepId}));var u4=["GATEWAY","HOSTED_UI_PAGE","HOSTED_UI_PROXY"],l4=["platform_requests"],d4=s.object({requestId:s.string().optional(),productId:s.string().optional(),route:s.string().optional(),usageEventId:s.string().optional()}).strict(),p4=s.object({organizationId:s.string().min(1),source:s.enum(u4),dimension:s.enum(l4),quantity:s.number().int().positive(),idempotencyKey:s.string().min(1).max(512),occurredAt:s.string().datetime(),metadata:d4.optional()}).strict(),p5=s.object({entries:s.array(p4).min(1).max(500)});var lE={contract:{label:"Managed as code",summary:"Declarative product state, canonical in the GitHub repo; the API returns 409 MANAGED_BY_CODE once published. Author via the manifest + push.",canonicalHome:"repo",mcpMayWrite:!1},operate:{label:"Runtime operation",summary:"Imperative action on the running platform; never in the repo. Tokens, usage, readiness, builds, publish triggers, runtime knobs, brand edits.",canonicalHome:"api",mcpMayWrite:!0},dual:{label:"Repo or API",summary:"Reconciles via either the repo or the API/MCP; both converge to the same state. Preview environments are the canonical example.",canonicalHome:"both",mcpMayWrite:!0}};function m4(t){return lE[t].mcpMayWrite}function f4(t){return lE[t].canonicalHome}function dE(t,e){return e==="write"&&!m4(t)?`An MCP tool that writes cannot have operationClass "${t}": ${t}-class state is managed as code in the business repo (canonical home: ${f4(t)}). Make the tool read-only, or author the change in the manifest and push instead.`:null}var it={VALIDATION_ERROR:"VALIDATION_ERROR",CONFLICT:"CONFLICT",NOT_FOUND:"NOT_FOUND",NOT_IMPLEMENTED:"NOT_IMPLEMENTED",NOT_CONFIGURED:"NOT_CONFIGURED",INTERNAL_ERROR:"INTERNAL_ERROR",SERVICE_UNAVAILABLE:"SERVICE_UNAVAILABLE",RATE_LIMIT_EXCEEDED:"RATE_LIMIT_EXCEEDED",DELETE_CONFIRMATION_REQUIRED:"DELETE_CONFIRMATION_REQUIRED",MISSING_HOST:"MISSING_HOST",MISSING_CONNECTIONS:"MISSING_CONNECTIONS",SECRET_NOT_CONFIGURED:"SECRET_NOT_CONFIGURED",UNAUTHORIZED:"UNAUTHORIZED",FORBIDDEN:"FORBIDDEN",INVALID_ACCESS_KEY:"INVALID_ACCESS_KEY",AUTO_KEY_CREATION_FAILED:"AUTO_KEY_CREATION_FAILED",PERSONA_NOT_FOUND:"PERSONA_NOT_FOUND",PERSONA_REVOKED:"PERSONA_REVOKED",PERSONA_SESSIONS_NOT_SUPPORTED:"PERSONA_SESSIONS_NOT_SUPPORTED",NOT_TEST_PERSONA_ENV:"NOT_TEST_PERSONA_ENV",PERSONA_AUTH_DISABLED_IN_PROD:"PERSONA_AUTH_DISABLED_IN_PROD",MAKER_TOKEN_NOT_FOUND:"MAKER_TOKEN_NOT_FOUND",MAKER_TOKEN_NOT_REVOKED:"MAKER_TOKEN_NOT_REVOKED",MAKER_TOKEN_NO_PRODUCT:"MAKER_TOKEN_NO_PRODUCT",MAKER_TOKEN_REVOKED:"MAKER_TOKEN_REVOKED",ORGANIZATION_NOT_FOUND:"ORGANIZATION_NOT_FOUND",ORG_HAS_ACTIVE_SUBSCRIPTIONS:"ORG_HAS_ACTIVE_SUBSCRIPTIONS",ORG_HAS_OUTSTANDING_BALANCE:"ORG_HAS_OUTSTANDING_BALANCE",PERSONAL_ORG_NOT_DELETABLE:"PERSONAL_ORG_NOT_DELETABLE",MEMBER_NOT_FOUND:"MEMBER_NOT_FOUND",INVITATION_NOT_FOUND:"INVITATION_NOT_FOUND",CUSTOMER_NOT_FOUND:"CUSTOMER_NOT_FOUND",PRODUCT_NOT_FOUND:"PRODUCT_NOT_FOUND",PRODUCT_DELETE_BLOCKED:"PRODUCT_DELETE_BLOCKED",PRODUCT_REPO_NOT_LINKED:"PRODUCT_REPO_NOT_LINKED",PRODUCT_SCOPE_MISMATCH:"PRODUCT_SCOPE_MISMATCH",YAML_PARSE_ERROR:"YAML_PARSE_ERROR",COMPILATION_NOT_FOUND:"COMPILATION_NOT_FOUND",PLAN_NOT_FOUND:"PLAN_NOT_FOUND",PLAN_HAS_ACTIVE_SUBSCRIPTIONS:"PLAN_HAS_ACTIVE_SUBSCRIPTIONS",PLAN_SLUG_CONFLICT:"PLAN_SLUG_CONFLICT",PLAN_UPGRADE_REQUIRED:"PLAN_UPGRADE_REQUIRED",SLUG_CONFLICT:"SLUG_CONFLICT",SLUG_BLOCKED:"SLUG_BLOCKED",SLUG_OFFENSIVE:"SLUG_OFFENSIVE",SLUG_RESERVED:"SLUG_RESERVED",SLUG_IMPERSONATION:"SLUG_IMPERSONATION",SLUG_INVALID_FORMAT:"SLUG_INVALID_FORMAT",SLUG_VALIDATOR_NOT_READY:"SLUG_VALIDATOR_NOT_READY",PRICING_PREVIEW_FAILED:"PRICING_PREVIEW_FAILED",PRICING_REPLAY_FAILED:"PRICING_REPLAY_FAILED",RESERVATION_NOT_FOUND:"RESERVATION_NOT_FOUND",PROMO_CODE_NOT_FOUND:"PROMO_CODE_NOT_FOUND",PROMO_CODE_INVALID:"PROMO_CODE_INVALID",BILLING_EVENT_NOT_FOUND:"BILLING_EVENT_NOT_FOUND",BILLING_NOT_CONFIGURED:"BILLING_NOT_CONFIGURED",SUBSCRIPTION_NOT_READY:"SUBSCRIPTION_NOT_READY",SUBSCRIPTION_FETCH_FAILED:"SUBSCRIPTION_FETCH_FAILED",INVALID_STATE:"INVALID_STATE",DUPLICATE_TRANSITION:"DUPLICATE_TRANSITION",LEGACY_STABLE_NOT_SELF_SERVICE:"LEGACY_STABLE_NOT_SELF_SERVICE",ARCHIVED_TARGET:"ARCHIVED_TARGET",FREE_TO_PAID_VIA_CHECKOUT_ONLY:"FREE_TO_PAID_VIA_CHECKOUT_ONLY",CAPABILITY_LIMIT_EXCEEDED:"CAPABILITY_LIMIT_EXCEEDED",CAPABILITY_CHECK_UNAVAILABLE:"CAPABILITY_CHECK_UNAVAILABLE",STRIPE_NOT_CONFIGURED:"STRIPE_NOT_CONFIGURED",STRIPE_BALANCE_OUTSTANDING:"STRIPE_BALANCE_OUTSTANDING",STRIPE_OPERATION_FAILED:"STRIPE_OPERATION_FAILED",STRIPE_RESYNC_FAILED:"STRIPE_RESYNC_FAILED",CHECKOUT_SESSION_FAILED:"CHECKOUT_SESSION_FAILED",POLAR_PRODUCT_NOT_CONFIGURED:"POLAR_PRODUCT_NOT_CONFIGURED",BILLING_TAX_NOT_ENROLLED:"BILLING_TAX_NOT_ENROLLED",WEBHOOK_NOT_FOUND:"WEBHOOK_NOT_FOUND",WEBHOOK_DISPATCH_FAILED:"WEBHOOK_DISPATCH_FAILED",WEBHOOK_SECRET_NOT_CONFIGURED:"WEBHOOK_SECRET_NOT_CONFIGURED",INVALID_WEBHOOK_SIGNATURE:"INVALID_WEBHOOK_SIGNATURE",MISSING_RAW_BODY:"MISSING_RAW_BODY",WEBHOOK_REDIRECTED:"WEBHOOK_REDIRECTED",MANAGED_BY_CODE:"MANAGED_BY_CODE",GITHUB_CONNECTION_NOT_FOUND:"GITHUB_CONNECTION_NOT_FOUND",GITHUB_NOT_CONNECTED:"GITHUB_NOT_CONNECTED",GITHUB_SYNC_FAILED:"GITHUB_SYNC_FAILED",GITHUB_SYNC_UNAVAILABLE:"GITHUB_SYNC_UNAVAILABLE",GITHUB_TOKEN_FAILED:"GITHUB_TOKEN_FAILED",GIT_PROVIDER_NOT_CONFIGURED:"GIT_PROVIDER_NOT_CONFIGURED",ENVIRONMENT_NOT_FOUND:"ENVIRONMENT_NOT_FOUND",ENVIRONMENT_CLEANUP_FAILED:"ENVIRONMENT_CLEANUP_FAILED",DEPLOYMENT_RUN_NOT_FOUND:"DEPLOYMENT_RUN_NOT_FOUND",BRANCH_NO_MATCHING_ENV:"BRANCH_NO_MATCHING_ENV",APPLY_SPEC_FAILED:"APPLY_SPEC_FAILED",BOOTSTRAP_FAILED:"BOOTSTRAP_FAILED",JOB_ALREADY_RUNNING:"JOB_ALREADY_RUNNING",LOGO_DELETE_FAILED:"LOGO_DELETE_FAILED",LOGO_UPLOAD_FAILED:"LOGO_UPLOAD_FAILED",INVALID_LOGO_FORMAT:"INVALID_LOGO_FORMAT"};var _5={missing_token:it.UNAUTHORIZED,invalid_token:it.UNAUTHORIZED,missing_signature:it.UNAUTHORIZED,malformed_signature:it.UNAUTHORIZED,unknown_key_id:it.UNAUTHORIZED,bad_signature:it.UNAUTHORIZED,expired_signature:it.UNAUTHORIZED,clock_skew:it.UNAUTHORIZED,replayed_nonce:it.UNAUTHORIZED,body_hash_mismatch:it.UNAUTHORIZED,route_mismatch:it.UNAUTHORIZED,environment_mismatch:it.UNAUTHORIZED,jwks_unavailable:it.SERVICE_UNAVAILABLE,body_too_large:it.VALIDATION_ERROR};var y5=Object.values(Aw);var pE={limit_allocator_unavailable:{statuses:[503],source:"batcher-enum",retryAfter:!0,verifiedAt:["engine/enforcement/runtime.ts:471"]},limit_exceeded:{statuses:[402],source:"batcher-enum",retryAfter:!0,verifiedAt:["engine/enforcement/batcher.ts:326","engine/enforcement/constraints/quota.ts:69"]},rate_limited:{statuses:[429],source:"batcher-enum",retryAfter:!0,verifiedAt:["engine/enforcement/batcher.ts:328","engine/enforcement/constraints/rate-limit.ts:74","engine/pipeline/rate-limit.ts:83"]},credit_exhausted:{statuses:[402],source:"batcher-enum",retryAfter:!0,verifiedAt:["engine/enforcement/batcher.ts:333"]},enforcement_denied:{statuses:[402],source:"batcher-enum",retryAfter:!0,verifiedAt:["engine/enforcement/batcher.ts:335"]},feature_not_enabled:{statuses:[403],source:"runtime-inline",retryAfter:!1,verifiedAt:["engine/enforcement/runtime.ts:188"]},invalid_entitlement_shape:{statuses:[503],source:"runtime-inline",retryAfter:!0,verifiedAt:["engine/enforcement/runtime.ts:144"]},unsupported_constraint_schema:{statuses:[503],source:"runtime-inline",retryAfter:!1,verifiedAt:["engine/enforcement/runtime.ts:154"]},enforcement_error:{statuses:[500],source:"runtime-inline",retryAfter:!1,verifiedAt:["engine/enforcement/runtime.ts:342"]},enforcement_dependency_unavailable:{statuses:[503],source:"runtime-inline",retryAfter:!1,verifiedAt:["engine/enforcement/runtime.ts:427"]},concurrency_limit_exceeded:{statuses:[429],source:"constraint",retryAfter:!0,verifiedAt:["engine/enforcement/constraints/concurrency.ts"]},concurrency_context_unavailable:{statuses:[503],source:"constraint",retryAfter:!0,verifiedAt:["engine/enforcement/constraints/concurrency.ts:291"]},concurrency_coordinator_unavailable:{statuses:[503],source:"constraint",retryAfter:!0,verifiedAt:["engine/enforcement/constraints/concurrency.ts:305"]},key_expired:{statuses:[401],source:"constraint",retryAfter:!1,verifiedAt:["engine/enforcement/constraints/credential-validity.ts:33"]},geo_context_unavailable:{statuses:[503],source:"constraint",retryAfter:!0,verifiedAt:["engine/enforcement/constraints/geo-restriction.ts:44"]},geo_blocked:{statuses:[403],source:"constraint",retryAfter:!1,verifiedAt:["engine/enforcement/constraints/geo-restriction.ts:51"]},geo_not_allowed:{statuses:[403],source:"constraint",retryAfter:!1,verifiedAt:["engine/enforcement/constraints/geo-restriction.ts:58"]},resource_count_limit_exceeded:{statuses:[403,402],source:"constraint",retryAfter:!1,verifiedAt:["engine/enforcement/constraints/resource-count.ts:95","apps/core:routes/internal/gateway-resources.ts:144"]},request_too_large:{statuses:[413],source:"constraint",retryAfter:!1,verifiedAt:["engine/enforcement/constraints/capacity.ts"]},resolver_rate_limited:{statuses:[503],source:"gateway-error",retryAfter:!0,verifiedAt:["engine/errors.ts:55"]},resolver_unavailable:{statuses:[503],source:"gateway-error",retryAfter:!0,verifiedAt:["engine/errors.ts:73"]},credential_resolver_miss_rate_limited:{statuses:[429],source:"gateway-error",retryAfter:!0,verifiedAt:["engine/errors.ts:89"]},provider_throttled:{statuses:[503],source:"gateway-error",retryAfter:!0,verifiedAt:["engine/pipeline/provider-adapter.ts"]}},h4=Object.keys(pE);var g4=new Set([429,503]),b5=new Set(h4.filter(t=>pE[t].statuses.every(e=>g4.has(e))));var _4=["quota","rate","concurrency","capacity","spend","adaptive"],k5=new Set(_4);var y4=[402,403,413,429],S5=new Set(y4);import{existsSync as K_,mkdirSync as v4,readFileSync as gE,writeFileSync as T3}from"node:fs";import{homedir as b4}from"node:os";import{join as G_}from"node:path";var mE="https://core.farthershore.com";var J_=G_(b4(),".farthershore"),fE=G_(J_,"config.json"),hE=G_(J_,"credentials.json");function x4(t){K_(t)||v4(t,{recursive:!0,mode:448})}var H_={apiUrl:mE};function _E(){if(x4(J_),!K_(fE))return H_;try{let t=JSON.parse(gE(fE,"utf-8"));return{...H_,...t}}catch{return H_}}function yE(){if(!K_(hE))return null;try{return JSON.parse(gE(hE,"utf-8"))}catch{return null}}var te=class extends Error{constructor(n,o,r){super(n);this.status=o;this.name="CliError",this.code=r?.code,this.details=r?.details,this.param=r?.param}status;code;details;param};function vE(t){if(t)return t;let e=process.env.FARTHERSHORE_TOKEN;if(e)return e;let n=yE();if(n?.token)return n.token;throw new te("Not authenticated. Run `farthershore auth login` or set FARTHERSHORE_TOKEN environment variable.")}var Mo="x-fs-surface",Zo="cli",k4="management";function gd(t,e){let n=new URLSearchParams;for(let[r,i]of Object.entries(e))i&&n.set(r,i);let o=n.toString();return o?`${t}?${o}`:t}function bE(t){let e=t.includes("?")?"&":"?";return`${t}${e}dry_run=true`}function xE(t){let e=null;async function n(){let c=await fetch(`${t.apiUrl}/auth/cli/exchange`,{method:"POST",headers:{Authorization:`Bearer ${t.token}`,"Content-Type":"application/json",[Mo]:Zo}});if(!c.ok){let l=(await c.json().catch(()=>null))?.error,d=typeof l=="string"?{message:l}:l;throw new te(d?.message??c.statusText,c.status,{code:d?.code,details:d?.details})}return e=await c.json(),e}function o(c){return c.split("/",3)[1]===k4}async function r(c){if(!t.token.startsWith("mk_")||o(c))return t.token;let u=e?Date.parse(e.expiresAt):0;return(!e||u-Date.now()<6e4)&&await n(),e.accessToken}async function i(c,u,l,d){let p=await r(u),m=d?.dryRun?bE(u):u,f={Authorization:`Bearer ${p}`,"Content-Type":"application/json",[Mo]:Zo};d?.idempotencyKey&&(f["Idempotency-Key"]=d.idempotencyKey);let g=await fetch(`${t.apiUrl}${m}`,{method:c,headers:f,body:l?JSON.stringify(l):void 0});if(!g.ok){let b=(await g.json().catch(()=>null))?.error,E=typeof b=="string"?{message:b}:b;throw new te(E?.message??g.statusText,g.status,{code:E?.code,details:E?.details})}if(g.status!==204)return g.json()}async function a(c,u,l,d,p){let m=await r(u),f=p?.dryRun?bE(u):u,g={Authorization:`Bearer ${m}`,"Content-Type":d,[Mo]:Zo};p?.idempotencyKey&&(g["Idempotency-Key"]=p.idempotencyKey);let v=await fetch(`${t.apiUrl}${f}`,{method:c,headers:g,body:l});if(!v.ok){let E=(await v.json().catch(()=>null))?.error,L=typeof E=="string"?{message:E}:E;throw new te(L?.message??v.statusText,v.status,{code:L?.code,details:L?.details})}if(v.status!==204)return v.json()}return{exchangeCliToken:n,bootstrap:()=>i("POST","/builder/context/bootstrap"),listProducts:()=>i("GET","/businesses"),initProduct:(c,u)=>i("POST","/businesses/init",c,u),updateProduct:(c,u,l,d)=>i("PATCH",gd(`/businesses/${c}`,{env:l?.env}),u,d),uploadBrandAsset:(c,u,l,d,p)=>a("PUT",`/businesses/${c}/${u}`,l,d,p),deleteBrandAsset:(c,u,l)=>i("DELETE",`/businesses/${c}/${u}`,void 0,l),publishProduct:(c,u,l)=>i("POST",`/businesses/${c}/publish`,u&&Object.keys(u).length>0?u:void 0,l),migratePlan:(c,u,l,d)=>i("POST",`/businesses/${c}/plans/${encodeURIComponent(u)}/migration-batches`,l,d),getProduct:(c,u)=>i("GET",gd(`/businesses/${c}`,{env:u?.env})),getDeployments:c=>i("GET",`/businesses/${c}/deployments`),listChangeSets:(c,u)=>i("GET",gd(`/businesses/${c}/change-sets`,{env:u?.env})),listEnvironments:c=>i("GET",`/businesses/${c}/environments`),createEnvironment:(c,u,l)=>i("POST",`/businesses/${c}/environments`,u,l),deleteEnvironment:(c,u)=>i("DELETE",`/businesses/${c}/environments/${encodeURIComponent(u)}`),deleteProduct:c=>i("DELETE",`/businesses/${c}`),managementListPlans:c=>i("GET",`/management/businesses/${c}/plans`),managementGetUsage:c=>i("GET",`/management/businesses/${c}/usage`),managementListMakerTokens:()=>i("GET","/maker-tokens"),managementCreateMakerToken:(c,u)=>i("POST","/maker-tokens",c,u),managementRevokeMakerToken:c=>i("DELETE",`/maker-tokens/${c}`),builderListBackends:c=>i("GET",`/businesses/${c}/backends`),builderCreateBackend:(c,u,l)=>i("POST",`/businesses/${c}/backends`,u,l),builderDeleteBackend:(c,u)=>i("DELETE",`/businesses/${c}/backends/${u}`),builderListRuntimeTokens:c=>i("GET",`/businesses/${c}/runtime-tokens`),builderCreateRuntimeToken:(c,u,l)=>i("POST",`/businesses/${c}/runtime-tokens`,u,l),builderRotateRuntimeToken:(c,u,l)=>i("POST",`/businesses/${c}/runtime-tokens/${u}/rotate`,void 0,l),builderRevokeRuntimeToken:(c,u)=>i("DELETE",`/businesses/${c}/runtime-tokens/${u}`),builderFrontendDeploy:(c,u,l)=>i("POST",`/businesses/${c}/frontend/deploy`,u,l),builderFrontendStatus:(c,u)=>i("GET",`/businesses/${c}/frontend/status${u?`?environmentId=${encodeURIComponent(u)}`:""}`),builderFrontendReleases:(c,u)=>i("GET",`/businesses/${c}/frontend/releases${u?`?environmentId=${encodeURIComponent(u)}`:""}`),builderFrontendRollback:(c,u,l)=>i("POST",`/businesses/${c}/frontend/rollback`,u,l),builderFrontendVariables:(c,u)=>i("GET",`/businesses/${c}/frontend/variables${u?`?environmentId=${encodeURIComponent(u)}`:""}`),builderSetFrontendVariable:(c,u,l)=>i("POST",`/businesses/${c}/frontend/variables`,u,l),builderDeleteFrontendVariable:(c,u,l,d)=>i("DELETE",`/businesses/${c}/frontend/variables/${encodeURIComponent(u)}${l?`?environmentId=${encodeURIComponent(l)}`:""}`,void 0,d),builderGitHubStatus:()=>i("GET","/builder/git/github/status"),productStripeStatus:c=>i("GET",`/businesses/${c}/stripe/status`),issuePersonaBootstrapKey:async(c,u,l)=>{let d=await fetch(`${t.apiUrl}/portal/businesses/${c}/environments/${u}/test/bootstrap-key`,{method:"POST",headers:{Authorization:`Bearer ${t.token}`,"Content-Type":"application/json",[Mo]:Zo},body:JSON.stringify(l??{})});if(!d.ok){let m=(await d.json().catch(()=>null))?.error,f=typeof m=="string"?{message:m}:m;throw new te(f?.message??d.statusText,d.status,{code:f?.code,details:f?.details})}return d.json()},listPersonas:async(c,u)=>{let l=await fetch(`${t.apiUrl}/portal/businesses/${c}/environments/${u}/test/personas`,{method:"GET",headers:{Authorization:`Bearer ${t.token}`,[Mo]:Zo}});if(!l.ok){let p=(await l.json().catch(()=>null))?.error,m=typeof p=="string"?{message:p}:p;throw new te(m?.message??l.statusText,l.status,{code:m?.code,details:m?.details})}return l.json()},revokePersona:async(c,u,l)=>{let d=await fetch(`${t.apiUrl}/portal/businesses/${c}/environments/${u}/test/personas/${l}`,{method:"DELETE",headers:{Authorization:`Bearer ${t.token}`,[Mo]:Zo}});if(!d.ok){let m=(await d.json().catch(()=>null))?.error,f=typeof m=="string"?{message:m}:m;throw new te(f?.message??d.statusText,d.status,{code:f?.code,details:f?.details})}return d.json()},getProductConfig:(c,u)=>i("GET",gd(`/businesses/${c}/config`,{format:"json",env:u?.env,state:u?.state})),updateProductConfigDraft:(c,u,l)=>i("PATCH",`/businesses/${c}/config/draft`,{spec:u,env:l?.env,branch:l?.branch,source:l?.source,baseDraftHash:l?.baseDraftHash})}}var kE=(t=0)=>e=>`\x1B[${e+t}m`,$E=(t=0)=>e=>`\x1B[${38+t};5;${e}m`,SE=(t=0)=>(e,n,o)=>`\x1B[${38+t};2;${e};${n};${o}m`,Se={modifier:{reset:[0,0],bold:[1,22],dim:[2,22],italic:[3,23],underline:[4,24],overline:[53,55],inverse:[7,27],hidden:[8,28],strikethrough:[9,29]},color:{black:[30,39],red:[31,39],green:[32,39],yellow:[33,39],blue:[34,39],magenta:[35,39],cyan:[36,39],white:[37,39],blackBright:[90,39],gray:[90,39],grey:[90,39],redBright:[91,39],greenBright:[92,39],yellowBright:[93,39],blueBright:[94,39],magentaBright:[95,39],cyanBright:[96,39],whiteBright:[97,39]},bgColor:{bgBlack:[40,49],bgRed:[41,49],bgGreen:[42,49],bgYellow:[43,49],bgBlue:[44,49],bgMagenta:[45,49],bgCyan:[46,49],bgWhite:[47,49],bgBlackBright:[100,49],bgGray:[100,49],bgGrey:[100,49],bgRedBright:[101,49],bgGreenBright:[102,49],bgYellowBright:[103,49],bgBlueBright:[104,49],bgMagentaBright:[105,49],bgCyanBright:[106,49],bgWhiteBright:[107,49]}},L3=Object.keys(Se.modifier),$4=Object.keys(Se.color),S4=Object.keys(Se.bgColor),M3=[...$4,...S4];function w4(){let t=new Map;for(let[e,n]of Object.entries(Se)){for(let[o,r]of Object.entries(n))Se[o]={open:`\x1B[${r[0]}m`,close:`\x1B[${r[1]}m`},n[o]=Se[o],t.set(r[0],r[1]);Object.defineProperty(Se,e,{value:n,enumerable:!1})}return Object.defineProperty(Se,"codes",{value:t,enumerable:!1}),Se.color.close="\x1B[39m",Se.bgColor.close="\x1B[49m",Se.color.ansi=kE(),Se.color.ansi256=$E(),Se.color.ansi16m=SE(),Se.bgColor.ansi=kE(10),Se.bgColor.ansi256=$E(10),Se.bgColor.ansi16m=SE(10),Object.defineProperties(Se,{rgbToAnsi256:{value(e,n,o){return e===n&&n===o?e<8?16:e>248?231:Math.round((e-8)/247*24)+232:16+36*Math.round(e/255*5)+6*Math.round(n/255*5)+Math.round(o/255*5)},enumerable:!1},hexToRgb:{value(e){let n=/[a-f\d]{6}|[a-f\d]{3}/i.exec(e.toString(16));if(!n)return[0,0,0];let[o]=n;o.length===3&&(o=[...o].map(i=>i+i).join(""));let r=Number.parseInt(o,16);return[r>>16&255,r>>8&255,r&255]},enumerable:!1},hexToAnsi256:{value:e=>Se.rgbToAnsi256(...Se.hexToRgb(e)),enumerable:!1},ansi256ToAnsi:{value(e){if(e<8)return 30+e;if(e<16)return 90+(e-8);let n,o,r;if(e>=232)n=((e-232)*10+8)/255,o=n,r=n;else{e-=16;let c=e%36;n=Math.floor(e/36)/5,o=Math.floor(c/6)/5,r=c%6/5}let i=Math.max(n,o,r)*2;if(i===0)return 30;let a=30+(Math.round(r)<<2|Math.round(o)<<1|Math.round(n));return i===2&&(a+=60),a},enumerable:!1},rgbToAnsi:{value:(e,n,o)=>Se.ansi256ToAnsi(Se.rgbToAnsi256(e,n,o)),enumerable:!1},hexToAnsi:{value:e=>Se.ansi256ToAnsi(Se.hexToAnsi256(e)),enumerable:!1}}),Se}var I4=w4(),Dt=I4;import W_ from"node:process";import E4 from"node:os";import wE from"node:tty";function xt(t,e=globalThis.Deno?globalThis.Deno.args:W_.argv){let n=t.startsWith("-")?"":t.length===1?"-":"--",o=e.indexOf(n+t),r=e.indexOf("--");return o!==-1&&(r===-1||o<r)}var{env:we}=W_,_d;xt("no-color")||xt("no-colors")||xt("color=false")||xt("color=never")?_d=0:(xt("color")||xt("colors")||xt("color=true")||xt("color=always"))&&(_d=1);function T4(){if("FORCE_COLOR"in we)return we.FORCE_COLOR==="true"?1:we.FORCE_COLOR==="false"?0:we.FORCE_COLOR.length===0?1:Math.min(Number.parseInt(we.FORCE_COLOR,10),3)}function O4(t){return t===0?!1:{level:t,hasBasic:!0,has256:t>=2,has16m:t>=3}}function P4(t,{streamIsTTY:e,sniffFlags:n=!0}={}){let o=T4();o!==void 0&&(_d=o);let r=n?_d:o;if(r===0)return 0;if(n){if(xt("color=16m")||xt("color=full")||xt("color=truecolor"))return 3;if(xt("color=256"))return 2}if("TF_BUILD"in we&&"AGENT_NAME"in we)return 1;if(t&&!e&&r===void 0)return 0;let i=r||0;if(we.TERM==="dumb")return i;if(W_.platform==="win32"){let a=E4.release().split(".");return Number(a[0])>=10&&Number(a[2])>=10586?Number(a[2])>=14931?3:2:1}if("CI"in we)return["GITHUB_ACTIONS","GITEA_ACTIONS","CIRCLECI"].some(a=>a in we)?3:["TRAVIS","APPVEYOR","GITLAB_CI","BUILDKITE","DRONE"].some(a=>a in we)||we.CI_NAME==="codeship"?1:i;if("TEAMCITY_VERSION"in we)return/^(9\.(0*[1-9]\d*)\.|\d{2,}\.)/.test(we.TEAMCITY_VERSION)?1:0;if(we.COLORTERM==="truecolor"||we.TERM==="xterm-kitty"||we.TERM==="xterm-ghostty"||we.TERM==="wezterm")return 3;if("TERM_PROGRAM"in we){let a=Number.parseInt((we.TERM_PROGRAM_VERSION||"").split(".")[0],10);switch(we.TERM_PROGRAM){case"iTerm.app":return a>=3?3:2;case"Apple_Terminal":return 2}}return/-256(color)?$/i.test(we.TERM)?2:/^screen|^xterm|^vt100|^vt220|^rxvt|color|ansi|cygwin|linux/i.test(we.TERM)||"COLORTERM"in we?1:i}function IE(t,e={}){let n=P4(t,{streamIsTTY:t&&t.isTTY,...e});return O4(n)}var R4={stdout:IE({isTTY:wE.isatty(1)}),stderr:IE({isTTY:wE.isatty(2)})},EE=R4;function TE(t,e,n){let o=t.indexOf(e);if(o===-1)return t;let r=e.length,i=0,a="";do a+=t.slice(i,o)+e+n,i=o+r,o=t.indexOf(e,i);while(o!==-1);return a+=t.slice(i),a}function OE(t,e,n,o){let r=0,i="";do{let a=t[o-1]==="\r";i+=t.slice(r,a?o-1:o)+e+(a?`\r
|
|
80
|
+
]`;continue}r+=o[u],o[u]==="\\"?i=!0:a&&o[u]==="]"?a=!1:!a&&o[u]==="["&&(a=!0)}try{new RegExp(r)}catch{return console.warn(`Could not convert regex pattern at ${e.currentPath.join("/")} to a flag-independent form! Falling back to the flag-ignorant source`),t.source}return r}function xl(t,e){if(e.target==="openAi"&&console.warn("Warning: OpenAI may not support records in schemas! Try an array of key-value pairs instead."),e.target==="openApi3"&&t.keyType?._def.typeName===I.ZodEnum)return{type:"object",required:t.keyType._def.values,properties:t.keyType._def.values.reduce((o,r)=>({...o,[r]:q(t.valueType._def,{...e,currentPath:[...e.currentPath,"properties",r]})??$e(e)}),{}),additionalProperties:e.rejectedAdditionalProperties};let n={type:"object",additionalProperties:q(t.valueType._def,{...e,currentPath:[...e.currentPath,"additionalProperties"]})??e.allowedAdditionalProperties};if(e.target==="openApi3")return n;if(t.keyType?._def.typeName===I.ZodString&&t.keyType._def.checks?.length){let{type:o,...r}=bl(t.keyType._def,e);return{...n,propertyNames:r}}else{if(t.keyType?._def.typeName===I.ZodEnum)return{...n,propertyNames:{enum:t.keyType._def.values}};if(t.keyType?._def.typeName===I.ZodBranded&&t.keyType._def.type._def.typeName===I.ZodString&&t.keyType._def.type._def.checks?.length){let{type:o,...r}=vl(t.keyType._def,e);return{...n,propertyNames:r}}}return n}function ik(t,e){if(e.mapStrategy==="record")return xl(t,e);let n=q(t.keyType._def,{...e,currentPath:[...e.currentPath,"items","items","0"]})||$e(e),o=q(t.valueType._def,{...e,currentPath:[...e.currentPath,"items","items","1"]})||$e(e);return{type:"array",maxItems:125,items:{type:"array",items:[n,o],minItems:2,maxItems:2}}}function ak(t){let e=t.values,o=Object.keys(t.values).filter(i=>typeof e[e[i]]!="number").map(i=>e[i]),r=Array.from(new Set(o.map(i=>typeof i)));return{type:r.length===1?r[0]==="string"?"string":"number":["string","number"],enum:o}}function sk(t){return t.target==="openAi"?void 0:{not:$e({...t,currentPath:[...t.currentPath,"not"]})}}function ck(t){return t.target==="openApi3"?{enum:["null"],nullable:!0}:{type:"null"}}var _a={ZodString:"string",ZodNumber:"number",ZodBigInt:"integer",ZodBoolean:"boolean",ZodNull:"null"};function lk(t,e){if(e.target==="openApi3")return uk(t,e);let n=t.options instanceof Map?Array.from(t.options.values()):t.options;if(n.every(o=>o._def.typeName in _a&&(!o._def.checks||!o._def.checks.length))){let o=n.reduce((r,i)=>{let a=_a[i._def.typeName];return a&&!r.includes(a)?[...r,a]:r},[]);return{type:o.length>1?o:o[0]}}else if(n.every(o=>o._def.typeName==="ZodLiteral"&&!o.description)){let o=n.reduce((r,i)=>{let a=typeof i._def.value;switch(a){case"string":case"number":case"boolean":return[...r,a];case"bigint":return[...r,"integer"];case"object":if(i._def.value===null)return[...r,"null"];default:return r}},[]);if(o.length===n.length){let r=o.filter((i,a,c)=>c.indexOf(i)===a);return{type:r.length>1?r:r[0],enum:n.reduce((i,a)=>i.includes(a._def.value)?i:[...i,a._def.value],[])}}}else if(n.every(o=>o._def.typeName==="ZodEnum"))return{type:"string",enum:n.reduce((o,r)=>[...o,...r._def.values.filter(i=>!o.includes(i))],[])};return uk(t,e)}var uk=(t,e)=>{let n=(t.options instanceof Map?Array.from(t.options.values()):t.options).map((o,r)=>q(o._def,{...e,currentPath:[...e.currentPath,"anyOf",`${r}`]})).filter(o=>!!o&&(!e.strictUnions||typeof o=="object"&&Object.keys(o).length>0));return n.length?{anyOf:n}:void 0};function dk(t,e){if(["ZodString","ZodNumber","ZodBigInt","ZodBoolean","ZodNull"].includes(t.innerType._def.typeName)&&(!t.innerType._def.checks||!t.innerType._def.checks.length))return e.target==="openApi3"?{type:_a[t.innerType._def.typeName],nullable:!0}:{type:[_a[t.innerType._def.typeName],"null"]};if(e.target==="openApi3"){let o=q(t.innerType._def,{...e,currentPath:[...e.currentPath]});return o&&"$ref"in o?{allOf:[o],nullable:!0}:o&&{...o,nullable:!0}}let n=q(t.innerType._def,{...e,currentPath:[...e.currentPath,"anyOf","0"]});return n&&{anyOf:[n,{type:"null"}]}}function pk(t,e){let n={type:"number"};if(!t.checks)return n;for(let o of t.checks)switch(o.kind){case"int":n.type="integer",_h(n,"type",o.message,e);break;case"min":e.target==="jsonSchema7"?o.inclusive?ne(n,"minimum",o.value,o.message,e):ne(n,"exclusiveMinimum",o.value,o.message,e):(o.inclusive||(n.exclusiveMinimum=!0),ne(n,"minimum",o.value,o.message,e));break;case"max":e.target==="jsonSchema7"?o.inclusive?ne(n,"maximum",o.value,o.message,e):ne(n,"exclusiveMaximum",o.value,o.message,e):(o.inclusive||(n.exclusiveMaximum=!0),ne(n,"maximum",o.value,o.message,e));break;case"multipleOf":ne(n,"multipleOf",o.value,o.message,e);break}return n}function mk(t,e){let n=e.target==="openAi",o={type:"object",properties:{}},r=[],i=t.shape();for(let c in i){let u=i[c];if(u===void 0||u._def===void 0)continue;let l=JR(u);l&&n&&(u._def.typeName==="ZodOptional"&&(u=u._def.innerType),u.isNullable()||(u=u.nullable()),l=!1);let d=q(u._def,{...e,currentPath:[...e.currentPath,"properties",c],propertyPath:[...e.currentPath,"properties",c]});d!==void 0&&(o.properties[c]=d,l||r.push(c))}r.length&&(o.required=r);let a=GR(t,e);return a!==void 0&&(o.additionalProperties=a),o}function GR(t,e){if(t.catchall._def.typeName!=="ZodNever")return q(t.catchall._def,{...e,currentPath:[...e.currentPath,"additionalProperties"]});switch(t.unknownKeys){case"passthrough":return e.allowedAdditionalProperties;case"strict":return e.rejectedAdditionalProperties;case"strip":return e.removeAdditionalStrategy==="strict"?e.allowedAdditionalProperties:e.rejectedAdditionalProperties}}function JR(t){try{return t.isOptional()}catch{return!0}}var fk=(t,e)=>{if(e.currentPath.toString()===e.propertyPath?.toString())return q(t.innerType._def,e);let n=q(t.innerType._def,{...e,currentPath:[...e.currentPath,"anyOf","1"]});return n?{anyOf:[{not:$e(e)},n]}:$e(e)};var hk=(t,e)=>{if(e.pipeStrategy==="input")return q(t.in._def,e);if(e.pipeStrategy==="output")return q(t.out._def,e);let n=q(t.in._def,{...e,currentPath:[...e.currentPath,"allOf","0"]}),o=q(t.out._def,{...e,currentPath:[...e.currentPath,"allOf",n?"1":"0"]});return{allOf:[n,o].filter(r=>r!==void 0)}};function gk(t,e){return q(t.type._def,e)}function _k(t,e){let o={type:"array",uniqueItems:!0,items:q(t.valueType._def,{...e,currentPath:[...e.currentPath,"items"]})};return t.minSize&&ne(o,"minItems",t.minSize.value,t.minSize.message,e),t.maxSize&&ne(o,"maxItems",t.maxSize.value,t.maxSize.message,e),o}function yk(t,e){return t.rest?{type:"array",minItems:t.items.length,items:t.items.map((n,o)=>q(n._def,{...e,currentPath:[...e.currentPath,"items",`${o}`]})).reduce((n,o)=>o===void 0?n:[...n,o],[]),additionalItems:q(t.rest._def,{...e,currentPath:[...e.currentPath,"additionalItems"]})}:{type:"array",minItems:t.items.length,maxItems:t.items.length,items:t.items.map((n,o)=>q(n._def,{...e,currentPath:[...e.currentPath,"items",`${o}`]})).reduce((n,o)=>o===void 0?n:[...n,o],[])}}function vk(t){return{not:$e(t)}}function bk(t){return $e(t)}var xk=(t,e)=>q(t.innerType._def,e);var kk=(t,e,n)=>{switch(e){case I.ZodString:return bl(t,n);case I.ZodNumber:return pk(t,n);case I.ZodObject:return mk(t,n);case I.ZodBigInt:return Wx(t,n);case I.ZodBoolean:return Yx();case I.ZodDate:return yh(t,n);case I.ZodUndefined:return vk(n);case I.ZodNull:return ck(n);case I.ZodArray:return Jx(t,n);case I.ZodUnion:case I.ZodDiscriminatedUnion:return lk(t,n);case I.ZodIntersection:return rk(t,n);case I.ZodTuple:return yk(t,n);case I.ZodRecord:return xl(t,n);case I.ZodLiteral:return nk(t,n);case I.ZodEnum:return tk(t);case I.ZodNativeEnum:return ak(t);case I.ZodNullable:return dk(t,n);case I.ZodOptional:return fk(t,n);case I.ZodMap:return ik(t,n);case I.ZodSet:return _k(t,n);case I.ZodLazy:return()=>t.getter()._def;case I.ZodPromise:return gk(t,n);case I.ZodNaN:case I.ZodNever:return sk(n);case I.ZodEffects:return ek(t,n);case I.ZodAny:return $e(n);case I.ZodUnknown:return bk(n);case I.ZodDefault:return Qx(t,n);case I.ZodBranded:return vl(t,n);case I.ZodReadonly:return xk(t,n);case I.ZodCatch:return Xx(t,n);case I.ZodPipeline:return hk(t,n);case I.ZodFunction:case I.ZodVoid:case I.ZodSymbol:return;default:return(o=>{})(e)}};function q(t,e,n=!1){let o=e.seen.get(t);if(e.override){let c=e.override?.(t,e,o,n);if(c!==Hx)return c}if(o&&!n){let c=WR(o,e);if(c!==void 0)return c}let r={def:t,path:e.currentPath,jsonSchema:void 0};e.seen.set(t,r);let i=kk(t,t.typeName,e),a=typeof i=="function"?q(i(),e):i;if(a&&YR(t,e,a),e.postProcess){let c=e.postProcess(a,t,e);return r.jsonSchema=a,c}return r.jsonSchema=a,a}var WR=(t,e)=>{switch(e.$refStrategy){case"root":return{$ref:t.path.join("/")};case"relative":return{$ref:yl(e.currentPath,t.path)};case"none":case"seen":return t.path.length<e.currentPath.length&&t.path.every((n,o)=>e.currentPath[o]===n)?(console.warn(`Recursive reference detected at ${e.currentPath.join("/")}! Defaulting to any`),$e(e)):e.$refStrategy==="seen"?$e(e):void 0}},YR=(t,e,n)=>(t.description&&(n.description=t.description,e.markdownDescription&&(n.markdownDescription=t.description)),n);var xh=(t,e)=>{let n=Gx(e),o=typeof e=="object"&&e.definitions?Object.entries(e.definitions).reduce((u,[l,d])=>({...u,[l]:q(d._def,{...n,currentPath:[...n.basePath,n.definitionPath,l]},!0)??$e(n)}),{}):void 0,r=typeof e=="string"?e:e?.nameStrategy==="title"?void 0:e?.name,i=q(t._def,r===void 0?n:{...n,currentPath:[...n.basePath,n.definitionPath,r]},!1)??$e(n),a=typeof e=="object"&&e.name!==void 0&&e.nameStrategy==="title"?e.name:void 0;a!==void 0&&(i.title=a),n.flags.hasReferencedOpenAiAnyType&&(o||(o={}),o[n.openAiAnyTypeName]||(o[n.openAiAnyTypeName]={type:["string","number","integer","boolean","array","null"],items:{$ref:n.$refStrategy==="relative"?"1":[...n.basePath,n.definitionPath,n.openAiAnyTypeName].join("/")}}));let c=r===void 0?o?{...i,[n.definitionPath]:o}:i:{$ref:[...n.$refStrategy==="relative"?[]:n.basePath,n.definitionPath,r].join("/"),[n.definitionPath]:{...o,[r]:i}};return n.target==="jsonSchema7"?c.$schema="http://json-schema.org/draft-07/schema#":(n.target==="jsonSchema2019-09"||n.target==="openAi")&&(c.$schema="https://json-schema.org/draft/2019-09/schema#"),n.target==="openAi"&&("anyOf"in c||"oneOf"in c||"allOf"in c||"type"in c&&Array.isArray(c.type))&&console.warn("Warning: OpenAI may not support schemas with unions as roots! Try wrapping it in an object property."),c};function XR(t){return!t||t==="jsonSchema7"||t==="draft-7"?"draft-7":t==="jsonSchema2019-09"||t==="draft-2020-12"?"draft-2020-12":"draft-7"}function kh(t,e){return gt(t)?Gr(t,{target:XR(e?.target),io:e?.pipeStrategy??"input"}):xh(t,{strictUnions:e?.strictUnions??!0,pipeStrategy:e?.pipeStrategy??"input"})}function $h(t){let n=Ir(t)?.method;if(!n)throw new Error("Schema is missing a method literal");let o=_l(n);if(typeof o!="string")throw new Error("Schema method literal must be a string");return o}function Sh(t,e){let n=wr(t,e);if(!n.success)throw n.error;return n.data}var QR=6e4,kl=class{constructor(e){this._options=e,this._requestMessageId=0,this._requestHandlers=new Map,this._requestHandlerAbortControllers=new Map,this._notificationHandlers=new Map,this._responseHandlers=new Map,this._progressHandlers=new Map,this._timeoutInfo=new Map,this._pendingDebouncedNotifications=new Set,this._taskProgressTokens=new Map,this._requestResolvers=new Map,this.setNotificationHandler(Ku,n=>{this._oncancel(n)}),this.setNotificationHandler(Ju,n=>{this._onprogress(n)}),this.setRequestHandler(Gu,n=>({})),this._taskStore=e?.taskStore,this._taskMessageQueue=e?.taskMessageQueue,this._taskStore&&(this.setRequestHandler(Wu,async(n,o)=>{let r=await this._taskStore.getTask(n.params.taskId,o.sessionId);if(!r)throw new j(M.InvalidParams,"Failed to retrieve task: Task not found");return{...r}}),this.setRequestHandler(Xu,async(n,o)=>{let r=async()=>{let i=n.params.taskId;if(this._taskMessageQueue){let c;for(;c=await this._taskMessageQueue.dequeue(i,o.sessionId);){if(c.type==="response"||c.type==="error"){let u=c.message,l=u.id,d=this._requestResolvers.get(l);if(d)if(this._requestResolvers.delete(l),c.type==="response")d(u);else{let p=u,m=new j(p.error.code,p.error.message,p.error.data);d(m)}else{let p=c.type==="response"?"Response":"Error";this._onerror(new Error(`${p} handler missing for request ${l}`))}continue}await this._transport?.send(c.message,{relatedRequestId:o.requestId})}}let a=await this._taskStore.getTask(i,o.sessionId);if(!a)throw new j(M.InvalidParams,`Task not found: ${i}`);if(!Er(a.status))return await this._waitForTaskUpdate(i,o.signal),await r();if(Er(a.status)){let c=await this._taskStore.getTaskResult(i,o.sessionId);return this._clearTaskQueue(i),{...c,_meta:{...c._meta,[xr]:{taskId:i}}}}return await r()};return await r()}),this.setRequestHandler(Qu,async(n,o)=>{try{let{tasks:r,nextCursor:i}=await this._taskStore.listTasks(n.params?.cursor,o.sessionId);return{tasks:r,nextCursor:i,_meta:{}}}catch(r){throw new j(M.InvalidParams,`Failed to list tasks: ${r instanceof Error?r.message:String(r)}`)}}),this.setRequestHandler(tl,async(n,o)=>{try{let r=await this._taskStore.getTask(n.params.taskId,o.sessionId);if(!r)throw new j(M.InvalidParams,`Task not found: ${n.params.taskId}`);if(Er(r.status))throw new j(M.InvalidParams,`Cannot cancel task in terminal status: ${r.status}`);await this._taskStore.updateTaskStatus(n.params.taskId,"cancelled","Client cancelled task execution.",o.sessionId),this._clearTaskQueue(n.params.taskId);let i=await this._taskStore.getTask(n.params.taskId,o.sessionId);if(!i)throw new j(M.InvalidParams,`Task not found after cancellation: ${n.params.taskId}`);return{_meta:{},...i}}catch(r){throw r instanceof j?r:new j(M.InvalidRequest,`Failed to cancel task: ${r instanceof Error?r.message:String(r)}`)}}))}async _oncancel(e){if(!e.params.requestId)return;this._requestHandlerAbortControllers.get(e.params.requestId)?.abort(e.params.reason)}_setupTimeout(e,n,o,r,i=!1){this._timeoutInfo.set(e,{timeoutId:setTimeout(r,n),startTime:Date.now(),timeout:n,maxTotalTimeout:o,resetTimeoutOnProgress:i,onTimeout:r})}_resetTimeout(e){let n=this._timeoutInfo.get(e);if(!n)return!1;let o=Date.now()-n.startTime;if(n.maxTotalTimeout&&o>=n.maxTotalTimeout)throw this._timeoutInfo.delete(e),j.fromError(M.RequestTimeout,"Maximum total timeout exceeded",{maxTotalTimeout:n.maxTotalTimeout,totalElapsed:o});return clearTimeout(n.timeoutId),n.timeoutId=setTimeout(n.onTimeout,n.timeout),!0}_cleanupTimeout(e){let n=this._timeoutInfo.get(e);n&&(clearTimeout(n.timeoutId),this._timeoutInfo.delete(e))}async connect(e){if(this._transport)throw new Error("Already connected to a transport. Call close() before connecting to a new transport, or use a separate Protocol instance per connection.");this._transport=e;let n=this.transport?.onclose;this._transport.onclose=()=>{n?.(),this._onclose()};let o=this.transport?.onerror;this._transport.onerror=i=>{o?.(i),this._onerror(i)};let r=this._transport?.onmessage;this._transport.onmessage=(i,a)=>{r?.(i,a),Wi(i)||Sx(i)?this._onresponse(i):Jf(i)?this._onrequest(i,a):$x(i)?this._onnotification(i):this._onerror(new Error(`Unknown message type: ${JSON.stringify(i)}`))},await this._transport.start()}_onclose(){let e=this._responseHandlers;this._responseHandlers=new Map,this._progressHandlers.clear(),this._taskProgressTokens.clear(),this._pendingDebouncedNotifications.clear();for(let o of this._timeoutInfo.values())clearTimeout(o.timeoutId);this._timeoutInfo.clear();for(let o of this._requestHandlerAbortControllers.values())o.abort();this._requestHandlerAbortControllers.clear();let n=j.fromError(M.ConnectionClosed,"Connection closed");this._transport=void 0,this.onclose?.();for(let o of e.values())o(n)}_onerror(e){this.onerror?.(e)}_onnotification(e){let n=this._notificationHandlers.get(e.method)??this.fallbackNotificationHandler;n!==void 0&&Promise.resolve().then(()=>n(e)).catch(o=>this._onerror(new Error(`Uncaught error in notification handler: ${o}`)))}_onrequest(e,n){let o=this._requestHandlers.get(e.method)??this.fallbackRequestHandler,r=this._transport,i=e.params?._meta?.[xr]?.taskId;if(o===void 0){let d={jsonrpc:"2.0",id:e.id,error:{code:M.MethodNotFound,message:"Method not found"}};i&&this._taskMessageQueue?this._enqueueTaskMessage(i,{type:"error",message:d,timestamp:Date.now()},r?.sessionId).catch(p=>this._onerror(new Error(`Failed to enqueue error response: ${p}`))):r?.send(d).catch(p=>this._onerror(new Error(`Failed to send an error response: ${p}`)));return}let a=new AbortController;this._requestHandlerAbortControllers.set(e.id,a);let c=bx(e.params)?e.params.task:void 0,u=this._taskStore?this.requestTaskStore(e,r?.sessionId):void 0,l={signal:a.signal,sessionId:r?.sessionId,_meta:e.params?._meta,sendNotification:async d=>{if(a.signal.aborted)return;let p={relatedRequestId:e.id};i&&(p.relatedTask={taskId:i}),await this.notification(d,p)},sendRequest:async(d,p,m)=>{if(a.signal.aborted)throw new j(M.ConnectionClosed,"Request was cancelled");let f={...m,relatedRequestId:e.id};i&&!f.relatedTask&&(f.relatedTask={taskId:i});let g=f.relatedTask?.taskId??i;return g&&u&&await u.updateTaskStatus(g,"input_required"),await this.request(d,p,f)},authInfo:n?.authInfo,requestId:e.id,requestInfo:n?.requestInfo,taskId:i,taskStore:u,taskRequestedTtl:c?.ttl,closeSSEStream:n?.closeSSEStream,closeStandaloneSSEStream:n?.closeStandaloneSSEStream};Promise.resolve().then(()=>{c&&this.assertTaskHandlerCapability(e.method)}).then(()=>o(e,l)).then(async d=>{if(a.signal.aborted)return;let p={result:d,jsonrpc:"2.0",id:e.id};i&&this._taskMessageQueue?await this._enqueueTaskMessage(i,{type:"response",message:p,timestamp:Date.now()},r?.sessionId):await r?.send(p)},async d=>{if(a.signal.aborted)return;let p={jsonrpc:"2.0",id:e.id,error:{code:Number.isSafeInteger(d.code)?d.code:M.InternalError,message:d.message??"Internal error",...d.data!==void 0&&{data:d.data}}};i&&this._taskMessageQueue?await this._enqueueTaskMessage(i,{type:"error",message:p,timestamp:Date.now()},r?.sessionId):await r?.send(p)}).catch(d=>this._onerror(new Error(`Failed to send response: ${d}`))).finally(()=>{this._requestHandlerAbortControllers.get(e.id)===a&&this._requestHandlerAbortControllers.delete(e.id)})}_onprogress(e){let{progressToken:n,...o}=e.params,r=Number(n),i=this._progressHandlers.get(r);if(!i){this._onerror(new Error(`Received a progress notification for an unknown token: ${JSON.stringify(e)}`));return}let a=this._responseHandlers.get(r),c=this._timeoutInfo.get(r);if(c&&a&&c.resetTimeoutOnProgress)try{this._resetTimeout(r)}catch(u){this._responseHandlers.delete(r),this._progressHandlers.delete(r),this._cleanupTimeout(r),a(u);return}i(o)}_onresponse(e){let n=Number(e.id),o=this._requestResolvers.get(n);if(o){if(this._requestResolvers.delete(n),Wi(e))o(e);else{let a=new j(e.error.code,e.error.message,e.error.data);o(a)}return}let r=this._responseHandlers.get(n);if(r===void 0){this._onerror(new Error(`Received a response for an unknown message ID: ${JSON.stringify(e)}`));return}this._responseHandlers.delete(n),this._cleanupTimeout(n);let i=!1;if(Wi(e)&&e.result&&typeof e.result=="object"){let a=e.result;if(a.task&&typeof a.task=="object"){let c=a.task;typeof c.taskId=="string"&&(i=!0,this._taskProgressTokens.set(c.taskId,n))}}if(i||this._progressHandlers.delete(n),Wi(e))r(e);else{let a=j.fromError(e.error.code,e.error.message,e.error.data);r(a)}}get transport(){return this._transport}async close(){await this._transport?.close()}async*requestStream(e,n,o){let{task:r}=o??{};if(!r){try{yield{type:"result",result:await this.request(e,n,o)}}catch(a){yield{type:"error",error:a instanceof j?a:new j(M.InternalError,String(a))}}return}let i;try{let a=await this.request(e,Xn,o);if(a.task)i=a.task.taskId,yield{type:"taskCreated",task:a.task};else throw new j(M.InternalError,"Task creation did not return a task");for(;;){let c=await this.getTask({taskId:i},o);if(yield{type:"taskStatus",task:c},Er(c.status)){c.status==="completed"?yield{type:"result",result:await this.getTaskResult({taskId:i},n,o)}:c.status==="failed"?yield{type:"error",error:new j(M.InternalError,`Task ${i} failed`)}:c.status==="cancelled"&&(yield{type:"error",error:new j(M.InternalError,`Task ${i} was cancelled`)});return}if(c.status==="input_required"){yield{type:"result",result:await this.getTaskResult({taskId:i},n,o)};return}let u=c.pollInterval??this._options?.defaultTaskPollInterval??1e3;await new Promise(l=>setTimeout(l,u)),o?.signal?.throwIfAborted()}}catch(a){yield{type:"error",error:a instanceof j?a:new j(M.InternalError,String(a))}}}request(e,n,o){let{relatedRequestId:r,resumptionToken:i,onresumptiontoken:a,task:c,relatedTask:u}=o??{};return new Promise((l,d)=>{let p=L=>{d(L)};if(!this._transport){p(new Error("Not connected"));return}if(this._options?.enforceStrictCapabilities===!0)try{this.assertCapabilityForMethod(e.method),c&&this.assertTaskCapability(e.method)}catch(L){p(L);return}o?.signal?.throwIfAborted();let m=this._requestMessageId++,f={...e,jsonrpc:"2.0",id:m};o?.onprogress&&(this._progressHandlers.set(m,o.onprogress),f.params={...e.params,_meta:{...e.params?._meta||{},progressToken:m}}),c&&(f.params={...f.params,task:c}),u&&(f.params={...f.params,_meta:{...f.params?._meta||{},[xr]:u}});let g=L=>{this._responseHandlers.delete(m),this._progressHandlers.delete(m),this._cleanupTimeout(m),this._transport?.send({jsonrpc:"2.0",method:"notifications/cancelled",params:{requestId:m,reason:String(L)}},{relatedRequestId:r,resumptionToken:i,onresumptiontoken:a}).catch(Z=>this._onerror(new Error(`Failed to send cancellation: ${Z}`)));let D=L instanceof j?L:new j(M.RequestTimeout,String(L));d(D)};this._responseHandlers.set(m,L=>{if(!o?.signal?.aborted){if(L instanceof Error)return d(L);try{let D=wr(n,L.result);D.success?l(D.data):d(D.error)}catch(D){d(D)}}}),o?.signal?.addEventListener("abort",()=>{g(o?.signal?.reason)});let v=o?.timeout??QR,b=()=>g(j.fromError(M.RequestTimeout,"Request timed out",{timeout:v}));this._setupTimeout(m,v,o?.maxTotalTimeout,b,o?.resetTimeoutOnProgress??!1);let E=u?.taskId;if(E){let L=D=>{let Z=this._responseHandlers.get(m);Z?Z(D):this._onerror(new Error(`Response handler missing for side-channeled request ${m}`))};this._requestResolvers.set(m,L),this._enqueueTaskMessage(E,{type:"request",message:f,timestamp:Date.now()}).catch(D=>{this._cleanupTimeout(m),d(D)})}else this._transport.send(f,{relatedRequestId:r,resumptionToken:i,onresumptiontoken:a}).catch(L=>{this._cleanupTimeout(m),d(L)})})}async getTask(e,n){return this.request({method:"tasks/get",params:e},Yu,n)}async getTaskResult(e,n,o){return this.request({method:"tasks/result",params:e},n,o)}async listTasks(e,n){return this.request({method:"tasks/list",params:e},el,n)}async cancelTask(e,n){return this.request({method:"tasks/cancel",params:e},Ex,n)}async notification(e,n){if(!this._transport)throw new Error("Not connected");this.assertNotificationCapability(e.method);let o=n?.relatedTask?.taskId;if(o){let c={...e,jsonrpc:"2.0",params:{...e.params,_meta:{...e.params?._meta||{},[xr]:n.relatedTask}}};await this._enqueueTaskMessage(o,{type:"notification",message:c,timestamp:Date.now()});return}if((this._options?.debouncedNotificationMethods??[]).includes(e.method)&&!e.params&&!n?.relatedRequestId&&!n?.relatedTask){if(this._pendingDebouncedNotifications.has(e.method))return;this._pendingDebouncedNotifications.add(e.method),Promise.resolve().then(()=>{if(this._pendingDebouncedNotifications.delete(e.method),!this._transport)return;let c={...e,jsonrpc:"2.0"};n?.relatedTask&&(c={...c,params:{...c.params,_meta:{...c.params?._meta||{},[xr]:n.relatedTask}}}),this._transport?.send(c,n).catch(u=>this._onerror(u))});return}let a={...e,jsonrpc:"2.0"};n?.relatedTask&&(a={...a,params:{...a.params,_meta:{...a.params?._meta||{},[xr]:n.relatedTask}}}),await this._transport.send(a,n)}setRequestHandler(e,n){let o=$h(e);this.assertRequestHandlerCapability(o),this._requestHandlers.set(o,(r,i)=>{let a=Sh(e,r);return Promise.resolve(n(a,i))})}removeRequestHandler(e){this._requestHandlers.delete(e)}assertCanSetRequestHandler(e){if(this._requestHandlers.has(e))throw new Error(`A request handler for ${e} already exists, which would be overridden`)}setNotificationHandler(e,n){let o=$h(e);this._notificationHandlers.set(o,r=>{let i=Sh(e,r);return Promise.resolve(n(i))})}removeNotificationHandler(e){this._notificationHandlers.delete(e)}_cleanupTaskProgressHandler(e){let n=this._taskProgressTokens.get(e);n!==void 0&&(this._progressHandlers.delete(n),this._taskProgressTokens.delete(e))}async _enqueueTaskMessage(e,n,o){if(!this._taskStore||!this._taskMessageQueue)throw new Error("Cannot enqueue task message: taskStore and taskMessageQueue are not configured");let r=this._options?.maxTaskQueueSize;await this._taskMessageQueue.enqueue(e,n,o,r)}async _clearTaskQueue(e,n){if(this._taskMessageQueue){let o=await this._taskMessageQueue.dequeueAll(e,n);for(let r of o)if(r.type==="request"&&Jf(r.message)){let i=r.message.id,a=this._requestResolvers.get(i);a?(a(new j(M.InternalError,"Task cancelled or completed")),this._requestResolvers.delete(i)):this._onerror(new Error(`Resolver missing for request ${i} during task ${e} cleanup`))}}}async _waitForTaskUpdate(e,n){let o=this._options?.defaultTaskPollInterval??1e3;try{let r=await this._taskStore?.getTask(e);r?.pollInterval&&(o=r.pollInterval)}catch{}return new Promise((r,i)=>{if(n.aborted){i(new j(M.InvalidRequest,"Request cancelled"));return}let a=setTimeout(r,o);n.addEventListener("abort",()=>{clearTimeout(a),i(new j(M.InvalidRequest,"Request cancelled"))},{once:!0})})}requestTaskStore(e,n){let o=this._taskStore;if(!o)throw new Error("No task store configured");return{createTask:async r=>{if(!e)throw new Error("No request provided");return await o.createTask(r,e.id,{method:e.method,params:e.params},n)},getTask:async r=>{let i=await o.getTask(r,n);if(!i)throw new j(M.InvalidParams,"Failed to retrieve task: Task not found");return i},storeTaskResult:async(r,i,a)=>{await o.storeTaskResult(r,i,a,n);let c=await o.getTask(r,n);if(c){let u=ta.parse({method:"notifications/tasks/status",params:c});await this.notification(u),Er(c.status)&&this._cleanupTaskProgressHandler(r)}},getTaskResult:r=>o.getTaskResult(r,n),updateTaskStatus:async(r,i,a)=>{let c=await o.getTask(r,n);if(!c)throw new j(M.InvalidParams,`Task "${r}" not found - it may have been cleaned up`);if(Er(c.status))throw new j(M.InvalidParams,`Cannot update task "${r}" from terminal status "${c.status}" to "${i}". Terminal states (completed, failed, cancelled) cannot transition to other states.`);await o.updateTaskStatus(r,i,a,n);let u=await o.getTask(r,n);if(u){let l=ta.parse({method:"notifications/tasks/status",params:u});await this.notification(l),Er(u.status)&&this._cleanupTaskProgressHandler(r)}},listTasks:r=>o.listTasks(r,n)}}};function $k(t){return t!==null&&typeof t=="object"&&!Array.isArray(t)}function Sk(t,e){let n={...t};for(let o in e){let r=o,i=e[r];if(i===void 0)continue;let a=n[r];$k(a)&&$k(i)?n[r]={...a,...i}:n[r]=i}return n}var hw=dy(l_(),1),gw=dy(fw(),1);function r1(){let t=new hw.default({strict:!1,validateFormats:!0,validateSchema:!1,allErrors:!0});return(0,gw.default)(t),t}var nd=class{constructor(e){this._ajv=e??r1()}getValidator(e){let n="$id"in e&&typeof e.$id=="string"?this._ajv.getSchema(e.$id)??this._ajv.compile(e):this._ajv.compile(e);return o=>n(o)?{valid:!0,data:o,errorMessage:void 0}:{valid:!1,data:void 0,errorMessage:this._ajv.errorsText(n.errors)}}};var od=class{constructor(e){this._server=e}requestStream(e,n,o){return this._server.requestStream(e,n,o)}createMessageStream(e,n){let o=this._server.getClientCapabilities();if((e.tools||e.toolChoice)&&!o?.sampling?.tools)throw new Error("Client does not support sampling tools capability.");if(e.messages.length>0){let r=e.messages[e.messages.length-1],i=Array.isArray(r.content)?r.content:[r.content],a=i.some(d=>d.type==="tool_result"),c=e.messages.length>1?e.messages[e.messages.length-2]:void 0,u=c?Array.isArray(c.content)?c.content:[c.content]:[],l=u.some(d=>d.type==="tool_use");if(a){if(i.some(d=>d.type!=="tool_result"))throw new Error("The last message must contain only tool_result content if any is present");if(!l)throw new Error("tool_result blocks are not matching any tool_use from the previous message")}if(l){let d=new Set(u.filter(m=>m.type==="tool_use").map(m=>m.id)),p=new Set(i.filter(m=>m.type==="tool_result").map(m=>m.toolUseId));if(d.size!==p.size||![...d].every(m=>p.has(m)))throw new Error("ids of tool_result blocks and tool_use blocks from previous message do not match")}}return this.requestStream({method:"sampling/createMessage",params:e},oa,n)}elicitInputStream(e,n){let o=this._server.getClientCapabilities(),r=e.mode??"form";switch(r){case"url":{if(!o?.elicitation?.url)throw new Error("Client does not support url elicitation.");break}case"form":{if(!o?.elicitation?.form)throw new Error("Client does not support form elicitation.");break}}let i=r==="form"&&e.mode===void 0?{...e,mode:"form"}:e;return this.requestStream({method:"elicitation/create",params:i},to,n)}async getTask(e,n){return this._server.getTask({taskId:e},n)}async getTaskResult(e,n,o){return this._server.getTaskResult({taskId:e},n,o)}async listTasks(e,n){return this._server.listTasks(e?{cursor:e}:void 0,n)}async cancelTask(e,n){return this._server.cancelTask({taskId:e},n)}};function _w(t,e,n){if(!t)throw new Error(`${n} does not support task creation (required for ${e})`);switch(e){case"tools/call":if(!t.tools?.call)throw new Error(`${n} does not support task creation for tools/call (required for ${e})`);break;default:break}}function yw(t,e,n){if(!t)throw new Error(`${n} does not support task creation (required for ${e})`);switch(e){case"sampling/createMessage":if(!t.sampling?.createMessage)throw new Error(`${n} does not support task creation for sampling/createMessage (required for ${e})`);break;case"elicitation/create":if(!t.elicitation?.create)throw new Error(`${n} does not support task creation for elicitation/create (required for ${e})`);break;default:break}}var id=class extends kl{constructor(e,n){super(n),this._serverInfo=e,this._loggingLevels=new Map,this.LOG_LEVEL_SEVERITY=new Map(na.options.map((o,r)=>[o,r])),this.isMessageIgnored=(o,r)=>{let i=this._loggingLevels.get(r);return i?this.LOG_LEVEL_SEVERITY.get(o)<this.LOG_LEVEL_SEVERITY.get(i):!1},this._capabilities=n?.capabilities??{},this._instructions=n?.instructions,this._jsonSchemaValidator=n?.jsonSchemaValidator??new nd,this.setRequestHandler(Xf,o=>this._oninitialize(o)),this.setNotificationHandler(Qf,()=>this.oninitialized?.()),this._capabilities.logging&&this.setRequestHandler(ah,async(o,r)=>{let i=r.sessionId||r.requestInfo?.headers["mcp-session-id"]||void 0,{level:a}=o.params,c=na.safeParse(a);return c.success&&this._loggingLevels.set(i,c.data),{}})}get experimental(){return this._experimental||(this._experimental={tasks:new od(this)}),this._experimental}registerCapabilities(e){if(this.transport)throw new Error("Cannot register capabilities after connecting to transport");this._capabilities=Sk(this._capabilities,e)}setRequestHandler(e,n){let r=Ir(e)?.method;if(!r)throw new Error("Schema is missing a method literal");let i;if(gt(r)){let c=r;i=c._zod?.def?.value??c.value}else{let c=r;i=c._def?.value??c.value}if(typeof i!="string")throw new Error("Schema method literal must be a string");if(i==="tools/call"){let c=async(u,l)=>{let d=wr(eo,u);if(!d.success){let g=d.error instanceof Error?d.error.message:String(d.error);throw new j(M.InvalidParams,`Invalid tools/call request: ${g}`)}let{params:p}=d.data,m=await Promise.resolve(n(u,l));if(p.task){let g=wr(Xn,m);if(!g.success){let v=g.error instanceof Error?g.error.message:String(g.error);throw new j(M.InvalidParams,`Invalid task creation result: ${v}`)}return g.data}let f=wr(cl,m);if(!f.success){let g=f.error instanceof Error?f.error.message:String(f.error);throw new j(M.InvalidParams,`Invalid tools/call result: ${g}`)}return f.data};return super.setRequestHandler(e,c)}return super.setRequestHandler(e,n)}assertCapabilityForMethod(e){switch(e){case"sampling/createMessage":if(!this._clientCapabilities?.sampling)throw new Error(`Client does not support sampling (required for ${e})`);break;case"elicitation/create":if(!this._clientCapabilities?.elicitation)throw new Error(`Client does not support elicitation (required for ${e})`);break;case"roots/list":if(!this._clientCapabilities?.roots)throw new Error(`Client does not support listing roots (required for ${e})`);break;case"ping":break}}assertNotificationCapability(e){switch(e){case"notifications/message":if(!this._capabilities.logging)throw new Error(`Server does not support logging (required for ${e})`);break;case"notifications/resources/updated":case"notifications/resources/list_changed":if(!this._capabilities.resources)throw new Error(`Server does not support notifying about resources (required for ${e})`);break;case"notifications/tools/list_changed":if(!this._capabilities.tools)throw new Error(`Server does not support notifying of tool list changes (required for ${e})`);break;case"notifications/prompts/list_changed":if(!this._capabilities.prompts)throw new Error(`Server does not support notifying of prompt list changes (required for ${e})`);break;case"notifications/elicitation/complete":if(!this._clientCapabilities?.elicitation?.url)throw new Error(`Client does not support URL elicitation (required for ${e})`);break;case"notifications/cancelled":break;case"notifications/progress":break}}assertRequestHandlerCapability(e){if(this._capabilities)switch(e){case"completion/complete":if(!this._capabilities.completions)throw new Error(`Server does not support completions (required for ${e})`);break;case"logging/setLevel":if(!this._capabilities.logging)throw new Error(`Server does not support logging (required for ${e})`);break;case"prompts/get":case"prompts/list":if(!this._capabilities.prompts)throw new Error(`Server does not support prompts (required for ${e})`);break;case"resources/list":case"resources/templates/list":case"resources/read":if(!this._capabilities.resources)throw new Error(`Server does not support resources (required for ${e})`);break;case"tools/call":case"tools/list":if(!this._capabilities.tools)throw new Error(`Server does not support tools (required for ${e})`);break;case"tasks/get":case"tasks/list":case"tasks/result":case"tasks/cancel":if(!this._capabilities.tasks)throw new Error(`Server does not support tasks capability (required for ${e})`);break;case"ping":case"initialize":break}}assertTaskCapability(e){yw(this._clientCapabilities?.tasks?.requests,e,"Client")}assertTaskHandlerCapability(e){this._capabilities&&_w(this._capabilities.tasks?.requests,e,"Server")}async _oninitialize(e){let n=e.params.protocolVersion;return this._clientCapabilities=e.params.capabilities,this._clientVersion=e.params.clientInfo,{protocolVersion:_x.includes(n)?n:Kf,capabilities:this.getCapabilities(),serverInfo:this._serverInfo,...this._instructions&&{instructions:this._instructions}}}getClientCapabilities(){return this._clientCapabilities}getClientVersion(){return this._clientVersion}getCapabilities(){return this._capabilities}async ping(){return this.request({method:"ping"},Hu)}async createMessage(e,n){if((e.tools||e.toolChoice)&&!this._clientCapabilities?.sampling?.tools)throw new Error("Client does not support sampling tools capability.");if(e.messages.length>0){let o=e.messages[e.messages.length-1],r=Array.isArray(o.content)?o.content:[o.content],i=r.some(l=>l.type==="tool_result"),a=e.messages.length>1?e.messages[e.messages.length-2]:void 0,c=a?Array.isArray(a.content)?a.content:[a.content]:[],u=c.some(l=>l.type==="tool_use");if(i){if(r.some(l=>l.type!=="tool_result"))throw new Error("The last message must contain only tool_result content if any is present");if(!u)throw new Error("tool_result blocks are not matching any tool_use from the previous message")}if(u){let l=new Set(c.filter(p=>p.type==="tool_use").map(p=>p.id)),d=new Set(r.filter(p=>p.type==="tool_result").map(p=>p.toolUseId));if(l.size!==d.size||![...l].every(p=>d.has(p)))throw new Error("ids of tool_result blocks and tool_use blocks from previous message do not match")}}return e.tools?this.request({method:"sampling/createMessage",params:e},sh,n):this.request({method:"sampling/createMessage",params:e},oa,n)}async elicitInput(e,n){switch(e.mode??"form"){case"url":{if(!this._clientCapabilities?.elicitation?.url)throw new Error("Client does not support url elicitation.");let r=e;return this.request({method:"elicitation/create",params:r},to,n)}case"form":{if(!this._clientCapabilities?.elicitation?.form)throw new Error("Client does not support form elicitation.");let r=e.mode==="form"?e:{...e,mode:"form"},i=await this.request({method:"elicitation/create",params:r},to,n);if(i.action==="accept"&&i.content&&r.requestedSchema)try{let c=this._jsonSchemaValidator.getValidator(r.requestedSchema)(i.content);if(!c.valid)throw new j(M.InvalidParams,`Elicitation response content does not match requested schema: ${c.errorMessage}`)}catch(a){throw a instanceof j?a:new j(M.InternalError,`Error validating elicitation response: ${a instanceof Error?a.message:String(a)}`)}return i}}}createElicitationCompletionNotifier(e,n){if(!this._clientCapabilities?.elicitation?.url)throw new Error("Client does not support URL elicitation (required for notifications/elicitation/complete)");return()=>this.notification({method:"notifications/elicitation/complete",params:{elicitationId:e}},n)}async listRoots(e,n){return this.request({method:"roots/list",params:e},ch,n)}async sendLoggingMessage(e,n){if(this._capabilities.logging&&!this.isMessageIgnored(e.level,n))return this.notification({method:"notifications/message",params:e})}async sendResourceUpdated(e){return this.notification({method:"notifications/resources/updated",params:e})}async sendResourceListChanged(){return this.notification({method:"notifications/resources/list_changed"})}async sendToolListChanged(){return this.notification({method:"notifications/tools/list_changed"})}async sendPromptListChanged(){return this.notification({method:"notifications/prompts/list_changed"})}};var bw=Symbol.for("mcp.completable");function y_(t){return!!t&&typeof t=="object"&&bw in t}function xw(t){return t[bw]?.complete}var vw;(function(t){t.Completable="McpCompletable"})(vw||(vw={}));var n1=/^[A-Za-z0-9._-]{1,128}$/;function o1(t){let e=[];if(t.length===0)return{isValid:!1,warnings:["Tool name cannot be empty"]};if(t.length>128)return{isValid:!1,warnings:[`Tool name exceeds maximum length of 128 characters (current: ${t.length})`]};if(t.includes(" ")&&e.push("Tool name contains spaces, which may cause parsing issues"),t.includes(",")&&e.push("Tool name contains commas, which may cause parsing issues"),(t.startsWith("-")||t.endsWith("-"))&&e.push("Tool name starts or ends with a dash, which may cause parsing issues in some contexts"),(t.startsWith(".")||t.endsWith("."))&&e.push("Tool name starts or ends with a dot, which may cause parsing issues in some contexts"),!n1.test(t)){let n=t.split("").filter(o=>!/[A-Za-z0-9._-]/.test(o)).filter((o,r,i)=>i.indexOf(o)===r);return e.push(`Tool name contains invalid characters: ${n.map(o=>`"${o}"`).join(", ")}`,"Allowed characters are: A-Z, a-z, 0-9, underscore (_), dash (-), and dot (.)"),{isValid:!1,warnings:e}}return{isValid:!0,warnings:e}}function i1(t,e){if(e.length>0){console.warn(`Tool name validation warning for "${t}":`);for(let n of e)console.warn(` - ${n}`);console.warn("Tool registration will proceed, but this may cause compatibility issues."),console.warn("Consider updating the tool name to conform to the MCP tool naming standard."),console.warn("See SEP: Specify Format for Tool Names (https://github.com/modelcontextprotocol/modelcontextprotocol/issues/986) for more details.")}}function v_(t){let e=o1(t);return i1(t,e.warnings),e.isValid}var ad=class{constructor(e){this._mcpServer=e}registerToolTask(e,n,o){let r={taskSupport:"required",...n.execution};if(r.taskSupport==="forbidden")throw new Error(`Cannot register task-based tool '${e}' with taskSupport 'forbidden'. Use registerTool() instead.`);return this._mcpServer._createRegisteredTool(e,n.title,n.description,n.inputSchema,n.outputSchema,n.annotations,r,n._meta,o)}};var sd=class{constructor(e,n){this._registeredResources={},this._registeredResourceTemplates={},this._registeredTools={},this._registeredPrompts={},this._toolHandlersInitialized=!1,this._completionHandlerInitialized=!1,this._resourceHandlersInitialized=!1,this._promptHandlersInitialized=!1,this.server=new id(e,n)}get experimental(){return this._experimental||(this._experimental={tasks:new ad(this)}),this._experimental}async connect(e){return await this.server.connect(e)}async close(){await this.server.close()}setToolRequestHandlers(){this._toolHandlersInitialized||(this.server.assertCanSetRequestHandler(jr(sl)),this.server.assertCanSetRequestHandler(jr(eo)),this.server.registerCapabilities({tools:{listChanged:!0}}),this.server.setRequestHandler(sl,()=>({tools:Object.entries(this._registeredTools).filter(([,e])=>e.enabled).map(([e,n])=>{let o={name:e,title:n.title,description:n.description,inputSchema:(()=>{let r=_o(n.inputSchema);return r?kh(r,{strictUnions:!0,pipeStrategy:"input"}):a1})(),annotations:n.annotations,execution:n.execution,_meta:n._meta};if(n.outputSchema){let r=_o(n.outputSchema);r&&(o.outputSchema=kh(r,{strictUnions:!0,pipeStrategy:"output"}))}return o})})),this.server.setRequestHandler(eo,async(e,n)=>{try{let o=this._registeredTools[e.params.name];if(!o)throw new j(M.InvalidParams,`Tool ${e.params.name} not found`);if(!o.enabled)throw new j(M.InvalidParams,`Tool ${e.params.name} disabled`);let r=!!e.params.task,i=o.execution?.taskSupport,a="createTask"in o.handler;if((i==="required"||i==="optional")&&!a)throw new j(M.InternalError,`Tool ${e.params.name} has taskSupport '${i}' but was not registered with registerToolTask`);if(i==="required"&&!r)throw new j(M.MethodNotFound,`Tool ${e.params.name} requires task augmentation (taskSupport: 'required')`);if(i==="optional"&&!r&&a)return await this.handleAutomaticTaskPolling(o,e,n);let c=await this.validateToolInput(o,e.params.arguments,e.params.name),u=await this.executeToolHandler(o,c,n);return r||await this.validateToolOutput(o,u,e.params.name),u}catch(o){if(o instanceof j&&o.code===M.UrlElicitationRequired)throw o;return this.createToolError(o instanceof Error?o.message:String(o))}}),this._toolHandlersInitialized=!0)}createToolError(e){return{content:[{type:"text",text:e}],isError:!0}}async validateToolInput(e,n,o){if(!e.inputSchema)return;let i=_o(e.inputSchema)??e.inputSchema,a=await hl(i,n);if(!a.success){let c="error"in a?a.error:"Unknown error",u=gl(c);throw new j(M.InvalidParams,`Input validation error: Invalid arguments for tool ${o}: ${u}`)}return a.data}async validateToolOutput(e,n,o){if(!e.outputSchema||!("content"in n)||n.isError)return;if(!n.structuredContent)throw new j(M.InvalidParams,`Output validation error: Tool ${o} has an output schema but no structured content was provided`);let r=_o(e.outputSchema),i=await hl(r,n.structuredContent);if(!i.success){let a="error"in i?i.error:"Unknown error",c=gl(a);throw new j(M.InvalidParams,`Output validation error: Invalid structured content for tool ${o}: ${c}`)}}async executeToolHandler(e,n,o){let r=e.handler;if("createTask"in r){if(!o.taskStore)throw new Error("No task store provided.");let a={...o,taskStore:o.taskStore};if(e.inputSchema){let c=r;return await Promise.resolve(c.createTask(n,a))}else{let c=r;return await Promise.resolve(c.createTask(a))}}if(e.inputSchema){let a=r;return await Promise.resolve(a(n,o))}else{let a=r;return await Promise.resolve(a(o))}}async handleAutomaticTaskPolling(e,n,o){if(!o.taskStore)throw new Error("No task store provided for task-capable tool.");let r=await this.validateToolInput(e,n.params.arguments,n.params.name),i=e.handler,a={...o,taskStore:o.taskStore},c=r?await Promise.resolve(i.createTask(r,a)):await Promise.resolve(i.createTask(a)),u=c.task.taskId,l=c.task,d=l.pollInterval??5e3;for(;l.status!=="completed"&&l.status!=="failed"&&l.status!=="cancelled";){await new Promise(m=>setTimeout(m,d));let p=await o.taskStore.getTask(u);if(!p)throw new j(M.InternalError,`Task ${u} not found during polling`);l=p}return await o.taskStore.getTaskResult(u)}setCompletionRequestHandler(){this._completionHandlerInitialized||(this.server.assertCanSetRequestHandler(jr(ul)),this.server.registerCapabilities({completions:{}}),this.server.setRequestHandler(ul,async e=>{switch(e.params.ref.type){case"ref/prompt":return Nx(e),this.handlePromptCompletion(e,e.params.ref);case"ref/resource":return Ax(e),this.handleResourceCompletion(e,e.params.ref);default:throw new j(M.InvalidParams,`Invalid completion reference: ${e.params.ref}`)}}),this._completionHandlerInitialized=!0)}async handlePromptCompletion(e,n){let o=this._registeredPrompts[n.name];if(!o)throw new j(M.InvalidParams,`Prompt ${n.name} not found`);if(!o.enabled)throw new j(M.InvalidParams,`Prompt ${n.name} disabled`);if(!o.argsSchema)return Ka;let i=Ir(o.argsSchema)?.[e.params.argument.name];if(!y_(i))return Ka;let a=xw(i);if(!a)return Ka;let c=await a(e.params.argument.value,e.params.context);return $w(c)}async handleResourceCompletion(e,n){let o=Object.values(this._registeredResourceTemplates).find(a=>a.resourceTemplate.uriTemplate.toString()===n.uri);if(!o){if(this._registeredResources[n.uri])return Ka;throw new j(M.InvalidParams,`Resource template ${e.params.ref.uri} not found`)}let r=o.resourceTemplate.completeCallback(e.params.argument.name);if(!r)return Ka;let i=await r(e.params.argument.value,e.params.context);return $w(i)}setResourceRequestHandlers(){this._resourceHandlersInitialized||(this.server.assertCanSetRequestHandler(jr(rl)),this.server.assertCanSetRequestHandler(jr(nl)),this.server.assertCanSetRequestHandler(jr(ol)),this.server.registerCapabilities({resources:{listChanged:!0}}),this.server.setRequestHandler(rl,async(e,n)=>{let o=Object.entries(this._registeredResources).filter(([i,a])=>a.enabled).map(([i,a])=>({uri:i,name:a.name,...a.metadata})),r=[];for(let i of Object.values(this._registeredResourceTemplates)){if(!i.resourceTemplate.listCallback)continue;let a=await i.resourceTemplate.listCallback(n);for(let c of a.resources)r.push({...i.metadata,...c})}return{resources:[...o,...r]}}),this.server.setRequestHandler(nl,async()=>({resourceTemplates:Object.entries(this._registeredResourceTemplates).map(([n,o])=>({name:n,uriTemplate:o.resourceTemplate.uriTemplate.toString(),...o.metadata}))})),this.server.setRequestHandler(ol,async(e,n)=>{let o=new URL(e.params.uri),r=this._registeredResources[o.toString()];if(r){if(!r.enabled)throw new j(M.InvalidParams,`Resource ${o} disabled`);return r.readCallback(o,n)}for(let i of Object.values(this._registeredResourceTemplates)){let a=i.resourceTemplate.uriTemplate.match(o.toString());if(a)return i.readCallback(o,a,n)}throw new j(M.InvalidParams,`Resource ${o} not found`)}),this._resourceHandlersInitialized=!0)}setPromptRequestHandlers(){this._promptHandlersInitialized||(this.server.assertCanSetRequestHandler(jr(il)),this.server.assertCanSetRequestHandler(jr(al)),this.server.registerCapabilities({prompts:{listChanged:!0}}),this.server.setRequestHandler(il,()=>({prompts:Object.entries(this._registeredPrompts).filter(([,e])=>e.enabled).map(([e,n])=>({name:e,title:n.title,description:n.description,arguments:n.argsSchema?s1(n.argsSchema):void 0}))})),this.server.setRequestHandler(al,async(e,n)=>{let o=this._registeredPrompts[e.params.name];if(!o)throw new j(M.InvalidParams,`Prompt ${e.params.name} not found`);if(!o.enabled)throw new j(M.InvalidParams,`Prompt ${e.params.name} disabled`);if(o.argsSchema){let r=_o(o.argsSchema),i=await hl(r,e.params.arguments);if(!i.success){let u="error"in i?i.error:"Unknown error",l=gl(u);throw new j(M.InvalidParams,`Invalid arguments for prompt ${e.params.name}: ${l}`)}let a=i.data,c=o.callback;return await Promise.resolve(c(a,n))}else{let r=o.callback;return await Promise.resolve(r(n))}}),this._promptHandlersInitialized=!0)}resource(e,n,...o){let r;typeof o[0]=="object"&&(r=o.shift());let i=o[0];if(typeof n=="string"){if(this._registeredResources[n])throw new Error(`Resource ${n} is already registered`);let a=this._createRegisteredResource(e,void 0,n,r,i);return this.setResourceRequestHandlers(),this.sendResourceListChanged(),a}else{if(this._registeredResourceTemplates[e])throw new Error(`Resource template ${e} is already registered`);let a=this._createRegisteredResourceTemplate(e,void 0,n,r,i);return this.setResourceRequestHandlers(),this.sendResourceListChanged(),a}}registerResource(e,n,o,r){if(typeof n=="string"){if(this._registeredResources[n])throw new Error(`Resource ${n} is already registered`);let i=this._createRegisteredResource(e,o.title,n,o,r);return this.setResourceRequestHandlers(),this.sendResourceListChanged(),i}else{if(this._registeredResourceTemplates[e])throw new Error(`Resource template ${e} is already registered`);let i=this._createRegisteredResourceTemplate(e,o.title,n,o,r);return this.setResourceRequestHandlers(),this.sendResourceListChanged(),i}}_createRegisteredResource(e,n,o,r,i){let a={name:e,title:n,metadata:r,readCallback:i,enabled:!0,disable:()=>a.update({enabled:!1}),enable:()=>a.update({enabled:!0}),remove:()=>a.update({uri:null}),update:c=>{typeof c.uri<"u"&&c.uri!==o&&(delete this._registeredResources[o],c.uri&&(this._registeredResources[c.uri]=a)),typeof c.name<"u"&&(a.name=c.name),typeof c.title<"u"&&(a.title=c.title),typeof c.metadata<"u"&&(a.metadata=c.metadata),typeof c.callback<"u"&&(a.readCallback=c.callback),typeof c.enabled<"u"&&(a.enabled=c.enabled),this.sendResourceListChanged()}};return this._registeredResources[o]=a,a}_createRegisteredResourceTemplate(e,n,o,r,i){let a={resourceTemplate:o,title:n,metadata:r,readCallback:i,enabled:!0,disable:()=>a.update({enabled:!1}),enable:()=>a.update({enabled:!0}),remove:()=>a.update({name:null}),update:l=>{typeof l.name<"u"&&l.name!==e&&(delete this._registeredResourceTemplates[e],l.name&&(this._registeredResourceTemplates[l.name]=a)),typeof l.title<"u"&&(a.title=l.title),typeof l.template<"u"&&(a.resourceTemplate=l.template),typeof l.metadata<"u"&&(a.metadata=l.metadata),typeof l.callback<"u"&&(a.readCallback=l.callback),typeof l.enabled<"u"&&(a.enabled=l.enabled),this.sendResourceListChanged()}};this._registeredResourceTemplates[e]=a;let c=o.uriTemplate.variableNames;return Array.isArray(c)&&c.some(l=>!!o.completeCallback(l))&&this.setCompletionRequestHandler(),a}_createRegisteredPrompt(e,n,o,r,i){let a={title:n,description:o,argsSchema:r===void 0?void 0:Xr(r),callback:i,enabled:!0,disable:()=>a.update({enabled:!1}),enable:()=>a.update({enabled:!0}),remove:()=>a.update({name:null}),update:c=>{typeof c.name<"u"&&c.name!==e&&(delete this._registeredPrompts[e],c.name&&(this._registeredPrompts[c.name]=a)),typeof c.title<"u"&&(a.title=c.title),typeof c.description<"u"&&(a.description=c.description),typeof c.argsSchema<"u"&&(a.argsSchema=Xr(c.argsSchema)),typeof c.callback<"u"&&(a.callback=c.callback),typeof c.enabled<"u"&&(a.enabled=c.enabled),this.sendPromptListChanged()}};return this._registeredPrompts[e]=a,r&&Object.values(r).some(u=>{let l=u instanceof Wn?u._def?.innerType:u;return y_(l)})&&this.setCompletionRequestHandler(),a}_createRegisteredTool(e,n,o,r,i,a,c,u,l){v_(e);let d={title:n,description:o,inputSchema:kw(r),outputSchema:kw(i),annotations:a,execution:c,_meta:u,handler:l,enabled:!0,disable:()=>d.update({enabled:!1}),enable:()=>d.update({enabled:!0}),remove:()=>d.update({name:null}),update:p=>{typeof p.name<"u"&&p.name!==e&&(typeof p.name=="string"&&v_(p.name),delete this._registeredTools[e],p.name&&(this._registeredTools[p.name]=d)),typeof p.title<"u"&&(d.title=p.title),typeof p.description<"u"&&(d.description=p.description),typeof p.paramsSchema<"u"&&(d.inputSchema=Xr(p.paramsSchema)),typeof p.outputSchema<"u"&&(d.outputSchema=Xr(p.outputSchema)),typeof p.callback<"u"&&(d.handler=p.callback),typeof p.annotations<"u"&&(d.annotations=p.annotations),typeof p._meta<"u"&&(d._meta=p._meta),typeof p.enabled<"u"&&(d.enabled=p.enabled),this.sendToolListChanged()}};return this._registeredTools[e]=d,this.setToolRequestHandlers(),this.sendToolListChanged(),d}tool(e,...n){if(this._registeredTools[e])throw new Error(`Tool ${e} is already registered`);let o,r,i,a;if(typeof n[0]=="string"&&(o=n.shift()),n.length>1){let u=n[0];if(b_(u))r=n.shift(),n.length>1&&typeof n[0]=="object"&&n[0]!==null&&!b_(n[0])&&(a=n.shift());else if(typeof u=="object"&&u!==null){if(Object.values(u).some(l=>typeof l=="object"&&l!==null))throw new Error(`Tool ${e} expected a Zod schema or ToolAnnotations, but received an unrecognized object`);a=n.shift()}}let c=n[0];return this._createRegisteredTool(e,void 0,o,r,i,a,{taskSupport:"forbidden"},void 0,c)}registerTool(e,n,o){if(this._registeredTools[e])throw new Error(`Tool ${e} is already registered`);let{title:r,description:i,inputSchema:a,outputSchema:c,annotations:u,_meta:l}=n;return this._createRegisteredTool(e,r,i,a,c,u,{taskSupport:"forbidden"},l,o)}prompt(e,...n){if(this._registeredPrompts[e])throw new Error(`Prompt ${e} is already registered`);let o;typeof n[0]=="string"&&(o=n.shift());let r;n.length>1&&(r=n.shift());let i=n[0],a=this._createRegisteredPrompt(e,void 0,o,r,i);return this.setPromptRequestHandlers(),this.sendPromptListChanged(),a}registerPrompt(e,n,o){if(this._registeredPrompts[e])throw new Error(`Prompt ${e} is already registered`);let{title:r,description:i,argsSchema:a}=n,c=this._createRegisteredPrompt(e,r,i,a,o);return this.setPromptRequestHandlers(),this.sendPromptListChanged(),c}isConnected(){return this.server.transport!==void 0}async sendLoggingMessage(e,n){return this.server.sendLoggingMessage(e,n)}sendResourceListChanged(){this.isConnected()&&this.server.sendResourceListChanged()}sendToolListChanged(){this.isConnected()&&this.server.sendToolListChanged()}sendPromptListChanged(){this.isConnected()&&this.server.sendPromptListChanged()}};var a1={type:"object",properties:{}};function Sw(t){return t!==null&&typeof t=="object"&&"parse"in t&&typeof t.parse=="function"&&"safeParse"in t&&typeof t.safeParse=="function"}function ww(t){return"_def"in t||"_zod"in t||Sw(t)}function b_(t){return typeof t!="object"||t===null||ww(t)?!1:Object.keys(t).length===0?!0:Object.values(t).some(Sw)}function kw(t){if(t){if(b_(t))return Xr(t);if(!ww(t))throw new Error("inputSchema must be a Zod schema or raw shape, received an unrecognized object");return t}}function s1(t){let e=Ir(t);return e?Object.entries(e).map(([n,o])=>{let r=qx(o),i=Vx(o);return{name:n,description:r,required:!i}}):[]}function jr(t){let n=Ir(t)?.method;if(!n)throw new Error("Schema is missing a method literal");let o=_l(n);if(typeof o=="string")return o;throw new Error("Schema method literal must be a string")}function $w(t){return{completion:{values:t.slice(0,100),total:t.length,hasMore:t.length>100}}}var Ka={completion:{values:[],hasMore:!1}};var Ga=s.object({endpoint:s.string().min(1).max(256).optional(),apiKey:s.string().min(1).max(256).optional(),workspace:s.string().min(1).max(256).optional(),region:s.string().min(1).max(256).optional(),feature:s.string().min(1).max(256).optional()}).strict(),Iw=s.enum(["SUM","COUNT","MAX","UNIQUE_COUNT","LATEST"]),x_=s.object({d:s.number().int().nonnegative(),w:s.number().int().positive(),c:s.number().nonnegative(),agg:Iw.default("COUNT").optional(),valueProperty:s.string().optional(),uniqueProperty:s.string().optional(),provenance:s.enum(["plan","manual","provider"]).optional(),warnAt:s.number().min(0).max(1).optional(),scope:Ga.optional()}),c1=s.object({kind:s.literal("credential_validity")}),u1=s.object({kind:s.literal("track_only_bypass")}),l1=s.object({kind:s.literal("lifecycle_block"),blockOn:s.array(s.string()).default(["SUSPENDED","CANCELLED","INACTIVE"]),code:s.string().default("subscription_inactive")}),d1=s.object({kind:s.literal("identity_requirement"),require:s.enum(["org_only","org_and_user"]).default("org_only")}),p1=s.object({kind:s.literal("scope"),requireExplicit:s.boolean().default(!0)}),m1=s.object({kind:s.literal("feature_gate"),feature:s.string().min(1).max(120)}),f1=s.object({kind:s.literal("geo_restriction"),allow:s.array(s.string().length(2).regex(/^[A-Z]{2}$/)).optional(),block:s.array(s.string().length(2).regex(/^[A-Z]{2}$/)).optional()}).refine(t=>t.allow!==void 0||t.block!==void 0,{message:"geo_restriction requires either `allow` or `block`"}),h1=s.enum(["fixed_window","sliding_window","token_bucket"]),g1=x_.extend({kind:s.literal("rate_limit"),m:s.enum(["e","t"]).default("e"),strategy:h1.default("fixed_window"),bucket_capacity:s.number().positive().optional(),refill_rate_per_second:s.number().positive().optional()}).superRefine((t,e)=>{t.strategy==="token_bucket"?(t.bucket_capacity===void 0&&e.addIssue({code:"custom",message:"token_bucket strategy requires `bucket_capacity` (positive number)",path:["bucket_capacity"]}),t.refill_rate_per_second===void 0&&e.addIssue({code:"custom",message:"token_bucket strategy requires `refill_rate_per_second` (positive number)",path:["refill_rate_per_second"]})):(t.bucket_capacity!==void 0&&e.addIssue({code:"custom",message:`bucket_capacity is only valid when strategy === 'token_bucket' (got '${t.strategy}')`,path:["bucket_capacity"]}),t.refill_rate_per_second!==void 0&&e.addIssue({code:"custom",message:`refill_rate_per_second is only valid when strategy === 'token_bucket' (got '${t.strategy}')`,path:["refill_rate_per_second"]}))}),_1=s.enum(["fixed_window","sliding_window"]),y1=x_.extend({kind:s.literal("quota"),ovr:s.enum(["BLOCK","ALLOW_AND_BILL"]),strategy:_1.default("fixed_window")}),v1=x_.extend({kind:s.literal("credit_balance"),ovr:s.enum(["BLOCK","ALLOW_AND_BILL"])}),b1=s.object({kind:s.literal("concurrency"),capability:s.string().min(1).max(120),limit:s.number().int().positive(),lease_ttl_seconds:s.number().int().positive().max(3600).default(60)}),x1=s.object({kind:s.literal("capability_limit"),capability:s.string().min(1).max(120),limit:s.union([s.number().int().nonnegative(),s.boolean()])}),k1=s.object({kind:s.literal("resource_count"),resource:s.string().min(1).max(120),limit:s.number().int().nonnegative(),actionId:s.string().min(1).max(160).optional()}),$1=s.object({kind:s.literal("reservation"),dimension:s.string().min(1).max(120),max_outstanding:s.number().int().positive(),hold_seconds:s.number().int().positive().max(86400)}),S1=s.enum(["plan","manual","provider"]),cd=s.object({maxInputTokens:s.number().int().positive().optional(),maxOutputTokens:s.number().int().positive().optional(),maxContextTokens:s.number().int().positive().optional(),maxPayloadBytes:s.number().int().positive().optional(),enforcement:s.enum(["enforce","track"]).default("enforce"),failMode:s.enum(["open","closed"]).default("open"),tokenCountSource:s.enum(["declared","estimated"]).optional(),scope:Ga.optional()}).refine(Ew,{message:"capacity requires at least one ceiling (maxInputTokens / maxOutputTokens / maxContextTokens / maxPayloadBytes)"});function Ew(t){return t.maxInputTokens!==void 0||t.maxOutputTokens!==void 0||t.maxContextTokens!==void 0||t.maxPayloadBytes!==void 0}var w1=s.object({kind:s.literal("capacity"),maxInputTokens:s.number().int().positive().optional(),maxOutputTokens:s.number().int().positive().optional(),maxContextTokens:s.number().int().positive().optional(),maxPayloadBytes:s.number().int().positive().optional(),enforcement:s.enum(["enforce","track"]).default("enforce"),failMode:s.enum(["open","closed"]).default("open"),tokenCountSource:s.enum(["declared","estimated"]).optional(),scope:Ga.optional(),provenance:S1.optional()}).refine(Ew,{message:"capacity requires at least one ceiling (maxInputTokens / maxOutputTokens / maxContextTokens / maxPayloadBytes)"}),k_=s.discriminatedUnion("kind",[c1,u1,l1,d1,p1,m1,f1,g1,y1,v1,x1,k1,b1,$1,w1]);var Ja=["customer_feature","control_plane","admin_internal","background_job","webhook","healthcheck","unclassified"],UB=new Set(Ja);var ud=s.object({trafficClass:s.enum(Ja),policySource:s.enum(["declared","inherited","defaulted","legacy_inferred"]),limitParticipation:s.object({profile:s.enum(["customer_usage","business_capacity","control_plane","admin_internal","platform_abuse_only","healthcheck","none"]),pools:s.array(s.string().min(1)).optional(),scopes:s.array(s.object({endpoint:s.string().optional(),apiKey:s.string().optional(),workspace:s.string().optional(),region:s.string().optional(),feature:s.string().optional()}).passthrough()).optional(),metrics:s.array(s.string().min(1)).optional()}).passthrough(),customerBillingPolicy:s.object({customerBillable:s.boolean(),meterKey:s.string().min(1).optional(),chargeableOutcomes:s.enum(["success_only","success_and_partial","attempted","trusted_actual_usage_only"]),invoiceBehavior:s.string().optional()}).passthrough(),providerCostPolicy:s.object({providerCostTracked:s.boolean(),declaredProviderHint:s.string().optional(),declaredModelHint:s.string().optional()}).passthrough()}).passthrough();var JB=s.object({keyId:s.string().min(1),orgId:s.string().min(1),actorType:s.enum(["org","user"]).optional(),actorId:s.string().nullable().optional(),productId:s.string().min(1),compiledPlanId:s.string().min(1),entitlementHash:s.string().optional(),subjectKey:s.string().min(1),subscriptionId:s.string().min(1),currentPeriodId:s.string().optional(),currentPeriodStartMs:s.number().optional(),subscriberId:s.string().min(1),apiKeyId:s.string().nullable(),entitlementVersion:s.number(),identityRequirement:s.enum(["org_only","org_and_user"]),status:s.enum(["active","revoked"]),expiresAt:s.number().nullable().optional(),subscriberStatus:s.enum(["ONBOARDING","ACTIVE","SUSPENDED"]),subscriptionStatus:s.string().min(1),environment:s.enum(["production","sandbox"]).optional(),environmentId:s.string().optional(),scopes:s.array(s.string()).readonly().optional(),entitlement:s.record(s.string(),s.unknown()).nullable().optional()});var Tw=s.object({unit:s.enum(["requests","tokens","computeMs","dollars"]),window:s.enum(["second","minute","hour","day","week","month"]),capacity:s.number()}),I1=s.object({id:s.string().min(1),slug:s.string().optional(),transportMode:s.enum(["direct","tunnel"]),verificationRequired:s.boolean().optional(),originUrl:s.string().optional(),originHostname:s.string().optional(),accessCredentialRef:s.string().optional(),policyVersion:s.string().optional()}),WB=s.object({id:s.string().min(1),origin:s.string().min(1),sandboxOrigin:s.string().nullable().optional(),authHeader:s.string().optional(),pricing:s.object({requests:s.number().optional(),tokens:s.number().optional(),computeMs:s.number().optional(),per_request:s.number().optional()}).catchall(s.number().optional()).optional(),metering:s.object({tokens:s.object({estimatePerRequest:s.number().optional()}).optional(),computeMs:s.object({estimatePerRequest:s.number().optional()}).optional(),billOn4xx:s.boolean().optional()}).optional(),tenantLimits:s.array(Tw).readonly().optional(),userLimits:s.array(Tw).readonly().optional(),environmentId:s.string().optional(),contextTokenSecret:s.string().nullable().optional(),timeoutMs:s.number().positive().optional(),idleTimeoutMs:s.number().positive().optional(),backends:s.array(I1).optional(),defaultBackendId:s.string().optional(),verificationRequired:s.boolean().optional()});var E1=s.object({perRequestMinUnitsByDim:s.record(s.string(),s.number()).optional(),creditPoolMicros:s.number().optional(),perDimUnitCostMicros:s.record(s.string(),s.number()).optional()}),T1=s.object({source:s.enum(["fixed","provider_catalog"]),meterKey:s.string(),selector:s.string().optional(),measures:s.array(s.string()),catalog:s.string().optional(),pricePolicy:s.string().optional(),markupPercent:s.number().optional(),fixedRatesMicros:s.record(s.string(),s.record(s.string(),s.number())).optional()}),O1=s.object({key:s.string(),display:s.string(),unit:s.string().optional(),aggregation:s.enum(["SUM","COUNT","MAX","UNIQUE_COUNT","LATEST"]),window:s.enum(["minute","hour","day","month","billing_period"]),enforcementType:s.string()}),P1=s.object({feature:s.string(),method:s.string(),path:s.string(),meters:s.array(s.string()).optional(),usagePolicy:ud.optional(),policyResolutionMode:s.enum(["legacy","policy"]).optional()}),YB=s.object({v:s.number(),sub:s.string(),compiledPlanId:s.string().min(1),planType:s.string(),ts:s.number(),constraints:s.array(k_),cv:s.number(),policyResolutionMode:s.enum(["legacy","policy"]).optional(),dm:s.record(s.string(),s.number()),dmv:s.number().optional(),floor:E1.nullable().optional(),displayDims:s.array(s.number()).optional(),meterSemantics:s.record(s.string(),O1).optional(),rp:s.record(s.string(),T1).optional(),fr:s.array(P1).optional(),sig:s.string().min(1),sigKid:s.string().optional(),environmentId:s.string().optional()}).passthrough();var XB=s.object({subscriptionId:s.string().min(1),activePeriodId:s.string().optional(),activeCompiledPlanId:s.string().min(1),activeEntitlementHash:s.string().optional(),enforcementMode:s.enum(["STRICT","GRACE","TRACK_ONLY"]),gracePeriodEndsAt:s.string().optional(),trialEndsAt:s.string().optional(),overrides:s.object({featureGateOverrides:s.record(s.string(),s.boolean()).optional()}).optional(),scheduledTransition:s.object({kind:s.string(),timing:s.string(),scheduledFor:s.string(),toCompiledPlanId:s.string().nullable()}).optional(),creditPool:s.object({periodStartMs:s.number(),periodEndMs:s.number(),grantedCents:s.number(),policy:s.enum(["block","allow"]),epoch:s.number()}).optional(),resourceCounts:s.record(s.string(),s.number()).optional(),dedicatedShard:s.enum(["ACTIVE","DRAINING"]).optional(),generation:s.number(),updatedAt:s.string()});var R1=["DRAFT","ACTIVE"],tH=s.enum(R1),z1=["ONBOARDING","ACTIVE","SUSPENDED"],Ow=s.enum(z1),N1=["ACTIVE","REVOKED"],rH=s.enum(N1),A1=["BLOCK","ALLOW_AND_BILL"],Pw=s.enum(A1),C1=["ACTIVE","ARCHIVED"],nH=s.enum(C1),j1=["ACTIVE","EXPERIMENTAL","LEGACY_STABLE","PHASING_OUT","SUPERSEDED","ARCHIVED"],oH=s.enum(j1);var Rw=["input","output","total","cached_read_input","cache_creation_input","context","max_output","estimated_output","actual_output","streaming_output"],ld=[{id:"requests",label:"API requests",description:"Count every call \u2014 the right default for most APIs.",meters:[{key:"requests",display:"Requests",unit:"request"}]},{id:"ai-tokens",label:"AI tokens",description:"LLM-style token metering alongside calls. The gateway can estimate tokens per request and settle actuals from @farthershore/backend reports.",meters:[{key:"requests",display:"Requests",unit:"request"},{key:"tokens_used",display:"Tokens Used",unit:"token"}]},{id:"credits",label:"Credits",description:"Price work in abstract credits (e.g. one image = 5 credits). Report each call's dynamic credit cost through @farthershore/backend.",meters:[{key:"requests",display:"Requests",unit:"request"},{key:"credits",display:"Credits",unit:"credit"}]},{id:"spend",label:"Metered spend",description:"Pass-through spend in cents (OpenRouter-style) reported through @farthershore/backend. Pairs with prepaid credit wallets.",meters:[{key:"requests",display:"Requests",unit:"request"},{key:"dollars",display:"Spend",unit:"cent"}]},{id:"compute",label:"Compute time",description:"Bill milliseconds of compute, settled from @farthershore/backend reports.",meters:[{key:"requests",display:"Requests",unit:"request"},{key:"compute_ms",display:"Compute Time",unit:"ms"}]}];function zw(t){let e=t.trim().toLowerCase();return ld.find(n=>n.id===e)}function Nw(){return ld.map(t=>t.id)}var D1="FS_RUNTIME_TOKEN";var U1={payload:"x-fs-metering",signature:"x-fs-metering-sig",token:"x-fs-metering-token"};var uH={environmentVariable:D1,presentation:U1.token,storage:"sha256-hash-only"};var Aw={missingSignature:"missing_signature",malformedSignature:"malformed_signature",unknownKeyId:"unknown_key_id",jwksUnavailable:"jwks_unavailable",badSignature:"bad_signature",bodyHashMismatch:"body_hash_mismatch",routeMismatch:"route_mismatch",clockSkew:"clock_skew",expiredSignature:"expired_signature",replayedNonce:"replayed_nonce",bodyTooLarge:"body_too_large",environmentMismatch:"environment_mismatch",missingToken:"missing_token",invalidToken:"invalid_token"};var lH=10*1024*1024;var L1=["CHECKOUT_COMPLETED","PLAN_CHANGED","CANCELLED","RESTORED","UNSCHEDULED_CANCELLATION","PRICE_ROLLOVER","PAUSED","RESUMED","PLAN_CHANGE_SCHEDULED","PLAN_CHANGE_ABORTED","SCHEDULE_CREATED","SCHEDULE_UPDATED","SCHEDULE_RELEASED","SCHEDULE_COMPLETED","SCHEDULE_ABORTED","CANCEL_SCHEDULED","PAYMENT_FAILED","PAYMENT_RECOVERED","PAYMENT_RECOVERED_FROM_SUSPENDED","PAYMENT_ACTION_REQUIRED","RECURRING_PAYMENT","REFUND_PROCESSED","DISPUTE_OPENED","DISPUTE_FUNDS_WITHDRAWN","DISPUTE_CLOSED","MIN_SPEND_TRUE_UP"],mH=s.enum(L1);var _H=s.object({fontFamily:s.enum(["sans","serif","mono","system"]).optional(),radius:s.enum(["none","sm","md","lg","full"]).optional(),density:s.enum(["compact","default","comfortable"]).optional(),colorScheme:s.enum(["system","light","dark"]).optional()}).strict().optional();var M1=s.object({d:s.number(),w:s.number(),capacity:s.number(),remaining:s.number(),windowStart:s.number(),windowEnd:s.number()}),Z1=s.record(s.string(),M1),F1=s.object({allocations:s.array(s.number()),expiresAt:s.number()}),q1=s.record(s.string(),F1),V1=s.record(s.string(),s.bigint()),kH=s.object({subscriptionId:s.string(),handoffToken:s.string(),targetShardId:s.string(),policyVersion:s.number(),entitlementVersion:s.number().nullable(),windowStates:Z1,activeLeases:q1,totalsByDimension:V1.optional(),billingCycleId:s.string().nullable().optional(),billingCycleStartMs:s.number().optional()});var B1={gatewayProjectRead:"gateway:project:read",gatewayResourceWrite:"gateway:resource:write",usageWrite:"usage:write",authzDeniedWrite:"authz-denied:write",reservationAuthorize:"reservation:authorize",reservationFinalize:"reservation:finalize",internalCronRun:"internal:cron:run",personaManage:"persona:manage"},EH=Object.values(B1);var H1=["managed_frontend","custom_frontend","embedded_sdk","public_api","cli","agent","webhook","admin","internal"],jw=s.enum(H1),Cw=s.string().min(1).max(128),K1=s.object({d:s.number().int().nonnegative(),w:s.number().int().positive(),rem:s.number(),cap:s.number()}).strict(),Dw=s.object({v:s.literal(1),entV:s.number().int().nonnegative().optional(),entHash:Cw.optional(),featureGrant:s.boolean().optional(),gates:s.array(Cw).max(16).optional(),limits:s.array(K1).max(16).optional()}).strict();var G1=s.object({requestId:s.string(),eventId:s.string(),tenantId:s.string(),slug:s.string(),subscriptionId:s.string(),subscriberId:s.string(),apiKeyId:s.string().nullable(),compiledPlanId:s.string(),subscriberStatus:Ow,subscriptionStatus:s.string(),productId:s.string(),statusCode:s.number(),path:s.string(),latencyMs:s.number(),rawDimsUnits:s.record(s.string(),s.number()),meterSettlements:s.array(s.object({meterId:s.string(),meterType:s.enum(["exact_pre_request","estimated_then_settled","postpaid","strict_concurrency"]),reserved:s.number(),actual:s.number(),delta:s.number(),dimension:s.number().int().nonnegative(),leaseId:s.string()})).optional(),reportingAttested:s.boolean(),customerBillable:s.boolean(),measureContext:s.record(s.string(),s.unknown()).optional(),creditUnitsConsumed:s.record(s.string(),s.number()).optional(),timestamp:s.number(),environmentId:s.string().nullable().optional(),orgId:s.string().optional(),actorType:s.enum(["org","user"]).optional(),actorId:s.string().nullable().optional(),subjectKey:s.string().optional(),overageBehavior:Pw.optional(),environment:s.enum(["production","sandbox"]).optional(),surface:jw.optional(),actionId:s.string().min(1).max(128).optional(),subjectType:s.string().min(1).max(128).optional(),subjectId:s.string().min(1).max(256).optional(),decision:Dw.optional(),decisionId:s.string().min(1).max(256).optional(),denyClass:s.enum(["quota","rate","concurrency","capacity","spend","adaptive"]).optional(),blockingConstraintId:s.string().min(1).max(256).optional(),providerSettlements:s.array(s.object({meterId:s.string(),providerReported:s.number(),reconciled:s.number()})).optional(),usagePolicyId:s.string().min(1).max(256).optional(),policySource:s.enum(["declared","inherited","defaulted","legacy_inferred"]).optional(),trafficClass:s.enum(Ja).optional(),limitProfile:s.enum(["customer_usage","business_capacity","control_plane","admin_internal","platform_abuse_only","healthcheck","none"]).optional(),leaseId:s.string(),transactionId:s.string(),gatewayMetadata:s.object({shardId:s.string(),policyVersion:s.number().int().nonnegative().optional(),artifactVersion:s.number().int().nonnegative().default(0),artifactHash:s.string().regex(/^sha256_[a-f0-9]{64}$/).optional(),leaseTelemetry:s.object({consumeRequests:s.number().int().nonnegative(),localLeaseHits:s.number().int().nonnegative(),doAllocationAttempts:s.number().int().nonnegative(),doAllocationGrants:s.number().int().nonnegative(),doAllocationDenials:s.number().int().nonnegative(),doUnavailable:s.number().int().nonnegative(),doCircuitOpen:s.number().int().nonnegative(),leaseRefreshSingleflightJoins:s.number().int().nonnegative(),leaseRefreshSingleflightJoinRate:s.number().min(0).max(1),expiredLeasesReaped:s.number().int().nonnegative(),expiredLeaseReclaimedGrant:s.array(s.number().nonnegative()),reconcileRequests:s.number().int().nonnegative(),reconcilePositiveDeltas:s.number().int().nonnegative(),reconcileNoLocalLease:s.number().int().nonnegative(),doReconcileAttempts:s.number().int().nonnegative(),doReconcileFailures:s.number().int().nonnegative(),unspentLeaseRemainderReturns:s.number().int().nonnegative(),unspentLeaseRemainderReturnFailures:s.number().int().nonnegative(),unspentLeaseRemainderReturnedGrant:s.array(s.number().nonnegative()),maxObservedPositiveReconcileDelta:s.array(s.number().nonnegative()),requestToDoRatio:s.number().nonnegative(),localLeaseHitRate:s.number().min(0).max(1),localSpendRate:s.number().min(0).max(1),maxObservedActiveLeases:s.number().int().nonnegative(),maxObservedOutstandingGrant:s.array(s.number().nonnegative()),maxObservedOutstandingGrantRatio:s.number().nonnegative(),maxObservedEmergencyReserveGrant:s.array(s.number().nonnegative()),maxObservedEmergencyReserveGrantRatio:s.number().nonnegative(),maxObservedLeaseGrant:s.array(s.number().nonnegative()),maxObservedLeaseGrantRatio:s.number().nonnegative(),maxObservedLeaseTtlMs:s.number().int().nonnegative()}).optional(),artifactCacheTelemetry:s.object({reads:s.number().int().nonnegative(),l0FreshHits:s.number().int().nonnegative(),l0Misses:s.number().int().nonnegative(),l0StaleServes:s.number().int().nonnegative(),l0StaleIfErrorServes:s.number().int().nonnegative(),l0BlockingRefreshes:s.number().int().nonnegative(),l0SingleflightJoins:s.number().int().nonnegative(),l0EarlyRefreshes:s.number().int().nonnegative(),l1Hits:s.number().int().nonnegative(),l1Misses:s.number().int().nonnegative(),l1Rejected:s.number().int().nonnegative(),l1WriteFailures:s.number().int().nonnegative(),kvHits:s.number().int().nonnegative(),kvMisses:s.number().int().nonnegative(),kvTimeouts:s.number().int().nonnegative(),kvCircuitOpenReads:s.number().int().nonnegative(),resultHits:s.number().int().nonnegative(),resultMisses:s.number().int().nonnegative(),resultDenied:s.number().int().nonnegative(),resultUnavailable:s.number().int().nonnegative(),backgroundRefreshErrors:s.number().int().nonnegative(),l0HitRate:s.number().min(0).max(1),l0SingleflightJoinRate:s.number().min(0).max(1),l0EarlyRefreshRate:s.number().min(0).max(1),l1HitRate:s.number().min(0).max(1),kvHitRate:s.number().min(0).max(1),resultHitRate:s.number().min(0).max(1),staleServeRate:s.number().min(0).max(1)}).optional(),gatewayVersion:s.string()}).passthrough()}).passthrough();var J1=s.object({path:s.string(),code:s.string(),message:s.string()}),DH=s.object({reason:s.literal("schema_validation_failed"),receivedAt:s.string(),rawPayload:s.unknown(),issues:s.array(J1),consumerVersion:s.string().optional(),originalMessageId:s.string().optional()});var $_=["subscription.created","subscription.updated","subscription.canceled","payment.succeeded","payment.failed","rate_limit.exceeded","entitlement.changed","usage.threshold_reached"],jo=s.enum($_);var At=s.enum(["immediate","period_end"]),Wa=s.object({default:At.default("period_end"),when:s.object({price_increase:At.optional(),price_decrease:At.optional(),feature_added:At.optional(),feature_removed:At.optional(),limit_increased:At.optional(),limit_reduced:At.optional(),credit_increased:At.optional(),credit_reduced:At.optional(),rating_changed:At.optional()}).strict().default({price_increase:"period_end",price_decrease:"immediate",feature_added:"immediate",feature_removed:"period_end",limit_increased:"immediate",limit_reduced:"period_end",credit_increased:"immediate",credit_reduced:"period_end",rating_changed:"period_end"}),allowImmediatePriceIncrease:s.boolean().default(!1),allowImmediateEntitlementReduction:s.boolean().default(!1)}).strict().superRefine((t,e)=>{(t.when.price_increase??t.default)==="immediate"&&!t.allowImmediatePriceIncrease&&e.addIssue({code:"custom",path:["when","price_increase"],message:"price_increase cannot switch immediately without allowImmediatePriceIncrease: true"});for(let n of["feature_removed","limit_reduced","credit_reduced"])(t.when[n]??t.default)==="immediate"&&!t.allowImmediateEntitlementReduction&&e.addIssue({code:"custom",path:["when",n],message:`${n} cannot switch immediately without allowImmediateEntitlementReduction: true`})});var W1=s.object({kind:s.literal("credit"),amount_cents:s.number().int().nonnegative(),recurs:s.boolean().optional(),expires_after_days:s.number().int().positive().optional(),label:s.string().min(1).max(120).optional()}),Y1=s.object({kind:s.literal("top_up"),sku:s.string().min(1).max(120),label:s.string().min(1).max(200),price_cents:s.number().int().positive(),credit_cents:s.number().int().positive()}),Ct=s.discriminatedUnion("kind",[W1,Y1]);function Uw(t){return t.kind==="credit"&&t.recurs===!0&&t.label===void 0}function Lw(t){return t.kind==="credit"&&t.recurs!==!0&&t.label===void 0}function S_(t,e,n=["grants"]){if(!t)return;let o=0,r=0;for(let i of t)Uw(i)?o+=1:Lw(i)&&(r+=1);o>1&&e.addIssue({code:"custom",message:"At most one recurring `credit` grant (recurs:true, no label) is allowed \u2014 recurring credit is a single canonical entry.",path:n}),r>1&&e.addIssue({code:"custom",message:"At most one one-time `credit` grant (recurs:false, no label) is allowed \u2014 one-time credit is a single canonical entry.",path:n})}function Mw(t){return t.grants&&t.grants.length>0?[...t.grants]:[]}function w_(t){return Mw(t).find(Uw)?.amount_cents??0}function dd(t){return Mw(t).find(Lw)?.amount_cents??0}var X1=s.object({percent:s.number().int().min(0).max(100)}),Q1=s.object({threshold_cents:s.number().int().nonnegative(),refill_cents:s.number().int().positive()}),ir=s.object({rollover:X1.optional(),auto_recharge:Q1.optional()});var Zw=s.enum(["linear","active_count"]);var eU=s.object({up_to:s.number().int().positive().nullable(),price_per_unit_micros:s.number().int().nonnegative()}),tU=s.object({strategy:s.enum(["graduated","volume"]),tiers:s.array(eU).min(1).max(20)}),jt=s.object({dimension:s.string().min(1).max(64).regex(/^[a-z0-9_]+$/,"Meter dimension must be lowercase alphanumeric with underscores"),kind:Zw.default("linear"),price_per_unit_micros:s.number().int().nonnegative().default(0),tiered:tU.optional(),included_units:s.number().int().positive().optional()}).superRefine((t,e)=>{if(t.tiered&&t.price_per_unit_micros>0&&e.addIssue({code:"custom",message:"`tiered` is mutually exclusive with a non-zero `price_per_unit_micros` \u2014 drop one",path:["tiered"]}),t.included_units!==void 0&&t.tiered&&e.addIssue({code:"custom",message:"`included_units` is mutually exclusive with `tiered` \u2014 a tiered schedule already expresses the included allotment as a zero-priced first tier",path:["included_units"]}),t.tiered){let n=0,o=!1;for(let r=0;r<t.tiered.tiers.length;r++){let i=t.tiered.tiers[r];if(o){e.addIssue({code:"custom",message:"Open-ended tier (`up_to: null`) must be the final tier",path:["tiered","tiers",r,"up_to"]});break}if(i.up_to===null){o=!0;continue}i.up_to<=n&&e.addIssue({code:"custom",message:`Tier upper bounds must be strictly ascending (tier ${r} = ${i.up_to} <= previous ${n})`,path:["tiered","tiers",r,"up_to"]}),n=i.up_to}o||e.addIssue({code:"custom",message:"The final tier of a `tiered` schedule must be open-ended (`up_to: null`)",path:["tiered","tiers",t.tiered.tiers.length-1,"up_to"]})}}),ar=s.enum(["month","year"]),rU=s.object({meters:s.array(jt).default([]),recurring_fee_cents:s.number().int().nonnegative().default(0),billing_interval:ar.default("month"),grants:s.array(Ct).max(40).default([]),creditPolicy:ir.optional(),trial_days:s.number().int().nonnegative().default(0),max_monthly_spend_cents:s.number().int().nonnegative().optional()});var nU=s.string().min(1),oU=s.object({type:s.literal("named"),name:s.enum(["second","minute","hour","day","week","month"])}),iU=s.object({type:s.literal("custom"),seconds:s.number().int().positive(),label:s.string().optional()}),aU=s.discriminatedUnion("type",[oU,iU]),Dr=s.object({dimension:nU,window:aU,capacity:s.number().nonnegative(),enforcement:s.enum(["enforce","track"]).optional(),warnAt:s.number().min(0).max(1).optional(),scope:Ga.optional(),acknowledgeUnreachable:s.boolean().optional()}),QH=s.array(Dr).max(20);var sU=s.enum(["NONE","PRORATE","CREDIT"]).default("NONE"),cU={meters:s.array(jt).default([]),recurring_fee_cents:s.number().int().nonnegative().default(0),billing_interval:ar.default("month"),trial_days:s.number().int().nonnegative().default(0),max_monthly_spend_cents:s.number().int().nonnegative().optional(),min_monthly_spend_cents:s.number().int().nonnegative().optional(),grants:s.array(Ct).max(40).default([]),creditPolicy:ir.optional()},uU={meters:s.array(jt).optional(),recurring_fee_cents:s.number().int().nonnegative().optional(),billing_interval:ar.optional(),trial_days:s.number().int().nonnegative().optional(),max_monthly_spend_cents:s.number().int().nonnegative().optional(),min_monthly_spend_cents:s.number().int().nonnegative().optional(),grants:s.array(Ct).max(40).optional(),creditPolicy:ir.optional()},lU=s.object({id:s.string().min(1).max(64).regex(/^[a-z0-9_-]+$/,"Variant id must be lowercase alphanumeric with hyphens/underscores"),label:s.string().max(200).optional(),rolloutPercent:s.number().int().min(0).max(100),assignmentSeed:s.string().min(1).max(100).default("default"),prorationOnRollback:sU,...uU,limits:s.array(Dr).max(20).optional(),featureGates:s.record(s.string(),s.boolean()).optional(),capability_limits:s.record(s.string().min(1).max(120),s.union([s.number().int().nonnegative(),s.boolean()])).optional(),overageBehavior:s.enum(["block","allow_and_bill"]).optional(),capacity:cd.optional()}),Fw=lU.superRefine((t,e)=>{S_(t.grants,e)}),qw=s.object({key:s.string().min(1).max(64).regex(/^[a-z0-9_-]+$/,"Plan key must be lowercase alphanumeric with hyphens/underscores"),name:s.string().min(1).max(100),description:s.string().max(500).optional(),details:s.array(s.string().max(200)).max(10).optional(),...cU,free:s.boolean().default(!1),limits:s.array(Dr).max(20).default([]),featureGates:s.record(s.string(),s.boolean()).optional(),capability_limits:s.record(s.string().min(1).max(120),s.union([s.number().int().nonnegative(),s.boolean()])).default({}),overageBehavior:s.enum(["block","allow_and_bill"]).default("block"),selfServeEnabled:s.boolean().default(!0),capacity:cd.optional(),legacy:s.boolean().optional().default(!1),variants:s.array(Fw).max(4).optional(),archive:s.object({at:s.string().datetime().optional(),transitionTo:s.string().optional(),strategy:s.enum(["auto","explicit","block"]).default("auto")}).optional()}),pd=qw.superRefine((t,e)=>{S_(t.grants,e)});var dU=/^\$\{[A-Z][A-Z0-9_]{0,127}\}$/,I_=s.string().min(3).max(200).refine(t=>dU.test(t),{message:"secret must use ${VAR} interpolation syntax (e.g. ${WEBHOOK_SECRET}); raw secrets in YAML are rejected. Define the env var in the per-product secret store and reference it here."}),E_=s.object({maxAttempts:s.number().int().min(1).max(20).default(5),backoff:s.enum(["exponential","fixed"]).default("exponential")}),T_=s.object({id:s.string().min(1).max(64).regex(/^[a-z0-9_-]+$/,"Webhook endpoint id must be lowercase alphanumeric with hyphens/underscores"),url:s.string().url("webhooks.endpoints[].url must be a valid URL"),secret:I_,events:s.array(jo).min(1,"webhooks.endpoints[].events must subscribe to \u2265 1 event"),enabled:s.boolean().default(!0),retryPolicy:E_.default({maxAttempts:5,backoff:"exponential"})}),O_=s.object({endpoints:s.array(T_).max(50).default([])});var pU=s.object({meters:s.array(jt).optional(),recurring_fee_cents:s.number().int().nonnegative().optional(),billing_interval:ar.optional(),grants:s.array(Ct).max(40).optional(),creditPolicy:ir.optional(),trial_days:s.number().int().nonnegative().optional(),max_monthly_spend_cents:s.number().int().nonnegative().optional(),limits:s.array(Dr).max(20).optional(),featureGates:s.record(s.string(),s.boolean()).optional(),overageBehavior:s.enum(["block","allow_and_bill"]).optional(),selfServeEnabled:s.boolean().optional(),legacy:s.boolean().optional()}).strict(),mU=s.object({url:s.string().url().optional(),secret:I_.optional(),events:s.array(jo).optional(),enabled:s.boolean().optional(),retryPolicy:E_.partial().optional()}).strict(),fU=s.object({plans:s.record(s.string(),pU).optional(),webhooks:s.object({endpoints:s.record(s.string(),mU).optional()}).strict().optional()}).strict(),P_=s.record(s.string().min(1).max(64),fU);var Vw=1,Bw=["plans_table","usage_card","api_keys_panel","billing_summary","credit_balance","feature_panel","business_docs","audit_log","team_panel","markdown"],Hw=["/","/pricing","/dashboard","/dashboard/*","/settings","/settings/*","/team","/audit-log","/docs","/docs/*","/terms","/privacy","/persona","/persona-sign-in"],Kw=s.string().min(1).max(200).regex(/^\/[a-zA-Z0-9_./-]*$/,"path must start with / and contain only [a-zA-Z0-9_./-]"),R_=s.string().min(1).max(120).regex(/^[a-z0-9_-]+$/),Gw=s.object({label:s.string().min(1).max(80),path:Kw,capability:R_.optional()}),Jw=s.enum(Bw),Ww=s.object({component:Jw,props:s.record(s.string().min(1).max(80),s.unknown()).optional(),capability:R_.optional(),gateMode:s.enum(["hide","disable","upsell"]).default("hide")}),Yw=s.object({path:Kw,title:s.string().min(1).max(120),requiresAuth:s.boolean(),capability:R_.optional(),components:s.array(Ww).max(12).default([])}),z_=s.object({version:s.literal(Vw),nav:s.array(Gw).max(12).default([]),pages:s.array(Yw).max(24).default([])}).superRefine((t,e)=>{let n=new Set;t.pages.forEach((o,r)=>{n.has(o.path)&&e.addIssue({code:"custom",message:`duplicate frontend page path "${o.path}"`,path:["pages",r,"path"]}),n.add(o.path),Xw(o.path)&&e.addIssue({code:"custom",message:`frontend page path "${o.path}" is reserved by the template`,path:["pages",r,"path"]})})});function Xw(t){return Hw.some(e=>{if(e.endsWith("/*")){let n=e.slice(0,-2);return t===n||t.startsWith(`${n}/`)}return t===e})}var Qw=s.enum(["subscription","subject"]),eI=s.enum(["reported","action_inferred"]),tI=s.string().min(1).max(100).regex(/^[a-z0-9_.:-]+$/),rI=s.object({name:tI,display:s.string().min(1).max(120).optional(),scope:Qw.default("subscription"),subjectType:s.string().min(1).max(64).regex(/^[a-zA-Z0-9_.:-]+$/).optional(),countSource:eI.default("reported")}).superRefine((t,e)=>{t.scope==="subject"&&!t.subjectType&&e.addIssue({code:"custom",path:["subjectType"],message:"subjectType is required when resource scope is subject"}),t.scope==="subscription"&&t.subjectType&&e.addIssue({code:"custom",path:["subjectType"],message:"subjectType is only valid for subject-scoped counted resources"})}),N_=s.array(rI).max(100).default([]);var hU=s.object({key:s.string().min(1).max(64).regex(/^[a-z0-9_-]+$/,"AddOn key must be lowercase alphanumeric with hyphens/underscores"),name:s.string().min(1).max(100),description:s.string().max(500).optional(),recurring_fee_cents:s.number().int().nonnegative().default(0),billing_interval:ar.default("month"),meters:s.array(jt).default([]),grants:s.array(Ct).max(40).default([]),capability_limits:s.record(s.string().min(1).max(120),s.union([s.number().int().nonnegative(),s.boolean()])).default({}),featureGates:s.record(s.string(),s.boolean()).optional(),selfServeEnabled:s.boolean().default(!0)}),nI=s.record(s.string().min(1).max(64),hU).default({}),gU=s.enum(["active","canceled","paused","pending_activation"]),IK=s.object({addOnKey:s.string().min(1).max(64),status:gU.default("active"),activatedAt:s.string().datetime().optional(),canceledAt:s.string().datetime().nullable().optional(),stripeSubscriptionItemId:s.string().optional()});var oI=/^[a-z0-9][a-z0-9_-]*$/,A_=s.string().min(1).max(64).regex(oI,"backend id must be a lowercase slug ([a-z0-9][a-z0-9_-]*)"),iI=s.enum(["direct","tunnel"]),aI=s.enum(["embedded","sidecar"]);var sI=s.object({mode:iI.default("direct"),runner:aI.optional()}).strict(),cI=s.object({required:s.boolean().default(!1)}).strict(),uI=s.object({name:s.string().min(1).max(120).optional(),slug:A_.optional(),transport:sI.default({mode:"direct"}),verification:cI.default({required:!1}),meters:s.array(s.string().min(1).max(64)).max(100).optional(),default:s.boolean().optional(),originUrl:s.string().url().optional(),originHostname:s.string().min(1).max(255).optional()}).strict(),C_=s.record(A_,uI),Do=A_,Uo={unknownBackendInRoute:"UNKNOWN_BACKEND_IN_ROUTE",ambiguousDefaultBackend:"AMBIGUOUS_DEFAULT_BACKEND",routeMeterNotAllowedByBackend:"ROUTE_METER_NOT_ALLOWED_BY_BACKEND",unknownMeterInBackend:"UNKNOWN_METER_IN_BACKEND"};function j_(t){let e=Object.keys(t??{});if(e.length===0)return{defaultId:null,ambiguous:!1};if(e.length===1)return{defaultId:e[0],ambiguous:!1};let n=e.filter(o=>t[o]?.default===!0);return n.length===1?{defaultId:n[0],ambiguous:!1}:{defaultId:null,ambiguous:!0}}var _U=s.string().min(2).max(20).regex(/^\d+(ms|s|m|h)$/,"rate_limit window must look like `60s`, `5m`, `1h`"),lI=s.object({strategy:s.enum(["token_bucket","sliding_window","fixed_window"]).default("token_bucket"),dimensions:s.array(s.enum(["subscription","credential","ip","route"])).min(1).max(4).default(["subscription"]),limits:s.array(s.object({window:_U,max:s.number().int().positive().max(1e7)})).min(1).max(10),fail_open:s.object({max_consecutive_failures:s.number().int().positive().default(100),max_window_seconds:s.number().int().positive().default(60),recovery_threshold:s.number().int().positive().default(50),degraded_mode:s.enum(["safe_mode_block","safe_mode_throttle","runtime_killswitch_trigger"]).default("safe_mode_throttle")}).default({max_consecutive_failures:100,max_window_seconds:60,recovery_threshold:50,degraded_mode:"safe_mode_throttle"})}),dI=s.object({header_name:s.string().min(1).max(100).default("x-api-key"),upstream_token_source:s.discriminatedUnion("type",[s.object({type:s.literal("none")}),s.object({type:s.literal("static_bearer"),token_secret_ref:s.string().min(1).max(200).describe("Reference into the secret store (e.g. CF Secret name); not the raw token")})]).default({type:"none"}),scope_mode:s.enum(["strict","advisory","off"]).default("strict")}),pI=s.object({max_in_flight:s.number().int().positive().max(1e4),dimensions:s.array(s.enum(["subscription","credential","capability"])).min(1).max(3).default(["subscription"]),capability:s.string().min(1).max(120).optional(),lease_ttl_seconds:s.number().int().positive().max(600).default(30),fail_open:s.object({max_consecutive_failures:s.number().int().positive().default(50),max_window_seconds:s.number().int().positive().default(60),recovery_threshold:s.number().int().positive().default(20),degraded_mode:s.enum(["safe_mode_block","safe_mode_throttle","runtime_killswitch_trigger"]).default("safe_mode_throttle")}).default({max_consecutive_failures:50,max_window_seconds:60,recovery_threshold:20,degraded_mode:"safe_mode_throttle"})}),mI=s.object({max_attempts:s.number().int().min(1).max(5).default(2),retry_on_status:s.array(s.number().int().min(400).max(599)).min(1).max(20).default([502,503,504]),backoff:s.object({initial_ms:s.number().int().positive().max(5e3).default(100),multiplier:s.number().positive().max(10).default(2),jitter:s.enum(["none","full","equal"]).default("equal"),total_budget_ms:s.number().int().positive().max(3e4).default(5e3)}).default({initial_ms:100,multiplier:2,jitter:"equal",total_budget_ms:5e3})}),fI=s.object({applies_to:s.enum(["request","response","both"]).default("request"),rewrites:s.array(s.object({source:s.string().min(1).max(200),target:s.string().min(1).max(200).nullable()})).min(1).max(20)});var D_=s.discriminatedUnion("type",[s.object({type:s.literal("rate_limit"),config:lI}),s.object({type:s.literal("auth"),config:dI}),s.object({type:s.literal("concurrency"),config:pI}),s.object({type:s.literal("retry"),config:mI}),s.object({type:s.literal("transform"),config:fI})]);var md=s.enum(["long","short","blocking"]).default("long"),hI=s.object({route_types:s.array(s.enum(["http"])).max(5).optional(),meters:s.array(s.string().min(1).max(64)).max(20).optional(),auth_modes:s.array(s.enum(["api_key","oauth2","anonymous"])).max(5).optional()});var U_=s.intersection(s.object({name:s.string().min(1).max(64).regex(/^[a-z0-9_-]+$/,"Policy name must be lowercase alphanumeric with hyphens/underscores"),description:s.string().max(500).optional(),compatible_with:hI.default({}),mutation_class:s.enum(["runtime","contractual"]).default("runtime"),cacheProfile:md}),D_);var yU=s.enum(["query","mutation"]),vU=s.enum(["none","metadata","full"]),bU=s.object({type:s.string().min(1).max(64).regex(/^[a-zA-Z0-9_.:-]+$/),from:s.enum(["header","path_param"]),name:s.string().min(1).max(120)}),xU=s.object({resource:s.string().min(1).max(100).regex(/^[a-z0-9_.:-]+$/),effect:s.enum(["create","delete"])}),gI=s.object({id:s.string().min(1).max(160).regex(/^[a-z0-9_.:-]+$/),title:s.string().min(1).max(160).optional(),kind:yU,actorType:s.string().min(1).max(64).regex(/^[a-zA-Z0-9_.:-]+$/).optional(),subject:bU.optional(),inputSchemaRef:s.string().min(1).max(240).optional(),audit:vU.default("metadata"),resource:xU.optional()});var _I=s.object({method:s.enum(["GET","POST","PUT","PATCH","DELETE","HEAD","OPTIONS","*"]).default("*"),path:s.string().min(1).max(500).regex(/^\/[a-zA-Z0-9_/:.{}*-]*$/,"path must start with / and contain only [a-zA-Z0-9_/:.{}*-]")});function kU(t){let e=t.trim();if(!e)return!1;let[n,o,r]=e.split("-");if(r!==void 0||!/^\d{3}$/.test(n??""))return!1;let i=Number(n),a=o===void 0?i:Number(o);return o!==void 0&&!/^\d{3}$/.test(o)?!1:i>=100&&i<=599&&a>=100&&a<=599&&i<=a}function yI(t){return t.split(",").every(kU)}var fd=s.union([s.string().min(1).max(100).refine(yI,{message:"onStatusCodes must be comma-separated HTTP status codes or numeric ranges, e.g. 200-299,304"}),s.array(s.number().int().min(100).max(599)).min(1).max(100)]),vI=s.object({match:_I,metering:s.object({defaults:s.record(s.string().min(1).max(64),s.number().finite().nonnegative()).optional(),reports:s.array(s.string().min(1).max(64)).max(20).optional(),estimates:s.record(s.string().min(1).max(64),s.number().finite().nonnegative()).optional(),onStatusCodes:fd.optional()}).optional(),unmetered:s.boolean().optional(),inheritDefaultMeters:s.boolean().optional(),action:s.string().min(1).max(160).regex(/^[a-z0-9_.:-]+$/).optional(),backend:Do.optional(),usagePolicy:ud.optional()}).strict(),bI=s.object({override_origin:s.string().url("override_origin must be a valid URL").nullable().default(null)}),xI=s.object({rollout_key:s.string().min(1).max(120).regex(/^[a-z0-9_-]+$/,"rollout_key must be lowercase alphanumeric with hyphens/underscores").optional(),required_flags:s.array(s.string().min(1).max(120).regex(/^[a-z0-9_-]+$/)).max(10).optional()}),L_=s.object({feature:s.string().min(1).max(100).regex(/^[a-z0-9_.:-]+$/,"feature key must be lowercase alphanumeric with [_.:-]"),description:s.string().max(500).optional(),mutation_class:s.enum(["runtime","contractual"]).default("contractual"),cacheProfile:md,routes:s.array(vI).min(1).max(50),upstream:bI.default({override_origin:null}),policies:s.array(s.string().min(1).max(64).regex(/^[a-z0-9_-]+$/)).max(20).default([]),runtime:xI.default({}),plans:s.array(s.string().min(1).max(64)).max(20).default([]),actions:s.array(gI).max(100).optional(),backend:Do.optional()}).strict();function kI(t,e){t.usagePricing!==void 0&&e.addIssue({code:"custom",path:["usagePricing"],message:"usagePricing is not supported. Define usage.meters.<key>.rating instead."})}function $I(t,e){t.filter(o=>o.free).length>1&&e.addIssue({code:"custom",path:["plans"],message:"Only one free plan is allowed per product"}),t.forEach((o,r)=>{o.free&&($U(o,r,e),SU(o,r,e))})}function $U(t,e,n){(PI(t)??0)!==0&&n.addIssue({code:"custom",path:["plans",e,"recurring_fee_cents"],message:"Free plans must have zero price"})}function SU(t,e,n){t.limits.some(r=>!r.enforcement||r.enforcement==="enforce")||n.addIssue({code:"custom",path:["plans",e,"limits"],message:"Free plans must include at least one hard enforced limit"})}function SI(t,e){let n=new Map;t.forEach((o,r)=>{if(o.free)return;let i=PI(o);if(i===void 0||i<=0)return;let a=OU(o,i),c=n.get(a);if(c){e.addIssue({code:"custom",path:["plans",r,"recurring_fee_cents"],message:`Paid plan price duplicates plan "${c}" (${a})`});return}n.set(a,o.key)})}function wI(t,e){let n=new Set((t.metering?.meters??[]).map(r=>r.key).filter(r=>typeof r=="string"&&r.length>0)),o=new Set(Object.keys(t.usage?.meters??{}));t.plans.forEach((r,i)=>{let a=r.meters;a&&a.forEach((c,u)=>{let l=c.dimension;typeof l!="string"||l.length===0||n.has(l)||o.has(l)||e.addIssue({code:"custom",path:["plans",i,"meters",u,"dimension"],message:`Plan "${r.key}" prices meter "${l}" but no metering.meters[] entry and no usage.meters[] entry declares it.`})})})}function II(t,e){if(!t.features)return;let n=new Set(t.plans.map(o=>o.key));for(let[o,r]of Object.entries(t.features)){if(!r.plans)continue;r.plans.forEach((a,c)=>{n.has(a)||e.addIssue({code:"custom",path:["features",o,"plans",c],message:`Feature "${o}" references unknown plan "${a}"`})});let i=new Set;r.plans.forEach((a,c)=>{i.has(a)&&e.addIssue({code:"custom",path:["features",o,"plans",c],message:`Feature "${o}" lists plan "${a}" more than once`}),i.add(a)})}}function EI(t,e){if(!t.features)return;let n=new Set((t.metering?.meters??[]).map(r=>r.key).filter(r=>typeof r=="string"&&r.length>0)),o=!1;for(let[r,i]of Object.entries(t.features))(i.routes??[]).forEach((c,u)=>{let l=M_(c);l.length!==0&&(o=!0,l.forEach((d,p)=>{n.has(d)||e.addIssue({code:"custom",path:["features",r,"routes",u,"metering",p],message:`Route references unknown meter "${d}". Declare it in metering.meters[].`})}))});o&&n.size===0&&e.addIssue({code:"custom",path:["metering","meters"],message:"One or more routes declare metering keys but `metering.meters[]` is empty. Declare meters at the product level first."})}function wU(t,e){let n=new Map;for(let o of t.plans)n.set(o.key,new Set);if(!t.features){for(let o of n.values())for(let r of e)o.add(r);return n}for(let o of Object.values(t.features))IU(o,n);return n}function IU(t,e){let n=t.plans??[],o=t.routes??[];for(let r of n){let i=e.get(r);if(i)for(let a of o){if(a.unmetered===!0)continue;let c=M_(a);if(c.length>0){for(let u of c)i.add(u);continue}}}}function M_(t){let e=new Set;for(let n of Object.keys(t.metering?.defaults??{}))e.add(n);for(let n of t.metering?.reports??[])e.add(n);for(let n of Object.keys(t.metering?.estimates??{}))e.add(n);return[...e]}function EU(t){if(!t||typeof t!="object")return null;let e=t;return typeof e.dimension=="string"?e.dimension:null}var TU=new Set(["credits"]);function TI(t,e){if(!t.plans||t.plans.length===0)return;let n=new Set((t.metering?.meters??[]).map(i=>i.key).filter(i=>typeof i=="string"&&i.length>0)),o=new Set(Object.keys(t.usage?.meters??{})),r=wU(t,n);t.plans.forEach((i,a)=>{let c=i.limits??[],u=r.get(i.key)??new Set;c.forEach((l,d)=>{if(l&&typeof l=="object"?l.acknowledgeUnreachable===!0:!1)return;let m=EU(l);m&&(u.has(m)||o.has(m)||TU.has(m)||e.addIssue({code:"custom",path:["plans",a,"limits",d,"meter"],message:`Plan "${i.key}" limits meter "${m}" but no route in any granted feature emits this meter, and the meter is not declared under usage.meters either. Either grant a feature whose routes meter "${m}" to this plan, declare the meter under metering.meters[] or usage.meters, or set acknowledgeUnreachable: true if the limit is intentional (e.g. soft budget).`}))})})}function OI(t,e){let n=t.backend;if(!n||Object.keys(n).length===0)return;let o=new Set(Object.keys(n)),r=new Set((t.metering?.meters??[]).map(u=>u.key).filter(u=>typeof u=="string"&&u.length>0));for(let[u,l]of Object.entries(n))(l.meters??[]).forEach((d,p)=>{r.has(d)||e.addIssue({code:"custom",path:["backend",u,"meters",p],message:`${Uo.unknownMeterInBackend}: backend "${u}" allows meter "${d}" but no metering.meters[] entry declares it.`})});let{defaultId:i,ambiguous:a}=j_(n),c=!1;for(let u of Object.values(t.features??{}))for(let l of u.routes??[])l.backend===void 0&&(c=!0);a&&c&&e.addIssue({code:"custom",path:["backend"],message:`${Uo.ambiguousDefaultBackend}: product declares ${o.size} backends but no single default \u2014 mark exactly one backend \`default: true\` or bind every route explicitly.`});for(let[u,l]of Object.entries(t.features??{}))(l.routes??[]).forEach((d,p)=>{let m=d.backend??i;if(d.backend!==void 0&&!o.has(d.backend)){e.addIssue({code:"custom",path:["features",u,"routes",p,"backend"],message:`${Uo.unknownBackendInRoute}: route binds backend "${d.backend}" which is not declared in the product \`backend\` block.`});return}if(!m)return;let g=n[m]?.meters;if(!g)return;let v=new Set(g);for(let b of M_(d))v.has(b)||e.addIssue({code:"custom",path:["features",u,"routes",p,"metering"],message:`${Uo.routeMeterNotAllowedByBackend}: route meters "${b}" but backend "${m}" does not allow it (backend.meters[] = [${g.join(", ")}]).`})})}function PI(t){return t.recurring_fee_cents}function OU(t,e){return`USD:month:${e}`}var PU=s.object({subdomain:s.string().min(1).max(63).regex(/^[a-z0-9]([a-z0-9-]*[a-z0-9])?$/,"Subdomain must be lowercase alphanumeric with optional hyphens")}),RI=s.enum(["exact_pre_request","estimated_then_settled","postpaid","strict_concurrency"]),RU=s.enum(Rw),Z_=s.object({key:s.string().min(1).max(64).regex(/^[a-z0-9_]+$/,"Meter key must be lowercase alphanumeric with underscores"),display:s.string().min(1).max(100),unit:s.string().max(20).optional(),estimate:s.number().finite().nonnegative().optional(),routeDefault:s.number().finite().nonnegative().optional(),enforcementType:RI.default("estimated_then_settled"),aggregation:s.enum(["SUM","COUNT","MAX","UNIQUE_COUNT","LATEST"]).default("COUNT"),window:s.enum(["minute","hour","day","month","billing_period"]).default("billing_period"),valueProperty:s.string().optional(),uniqueProperty:s.string().optional(),groupBy:s.array(s.string()).optional(),eventCode:s.string().optional(),tokenCategory:RU.optional(),reserveStrategy:s.enum(["reserve_max","estimate","count_actual"]).optional(),reserveCeiling:s.number().int().positive().optional(),pairsWith:s.string().min(1).max(64).optional()}),zI=s.string().min(1).max(64).regex(/^[a-z0-9_]+$/,"Usage measure must be lowercase alphanumeric with underscores"),zU=s.enum(["pass_through","markup"]),NU=s.object({source:s.literal("fixed"),rates:s.record(s.string().min(1),s.record(zI,s.number().int().nonnegative()))}),AU=s.object({source:s.literal("provider_catalog"),catalog:s.string().min(1).max(100),pricePolicy:zU.default("pass_through"),markupPercent:s.number().nonnegative().max(1e4).optional(),marginMicros:s.number().int().nonnegative().optional()}),NI=s.discriminatedUnion("source",[NU,AU]),AI=s.object({selector:s.string().min(1).max(100).optional(),measures:s.array(zI).min(1).max(20),rating:NI.optional()}),CI=s.object({meters:s.record(s.string().min(1).max(64).regex(/^[a-z0-9_]+$/),AI)}),CU=s.object({defaults:s.record(s.string().min(1).max(64),s.number().finite().nonnegative()).optional(),reports:s.array(s.string().min(1).max(64)).max(20).optional(),estimates:s.record(s.string().min(1).max(64),s.number().finite().nonnegative()).optional(),onStatusCodes:fd.optional()}),jI=s.object({method:s.enum(["GET","POST","PUT","PATCH","DELETE","HEAD","OPTIONS","*"]).default("*"),path:s.string().min(1).max(500).regex(/^\/[a-zA-Z0-9_/:.{}*-]*$/,"path must start with / and contain only [a-zA-Z0-9_/:.{}*-]"),unmetered:s.boolean().optional(),metering:CU.optional(),inheritDefaultMeters:s.boolean().optional(),backend:Do.optional()}).strict(),F_=s.object({description:s.string().max(500).optional(),routes:s.array(jI).min(1).max(50),plans:s.array(s.string().min(1)).min(1).max(20)}),DI=s.record(s.string().min(1).max(100).regex(/^[a-z0-9_.:-]+$/),F_),UI=s.enum(["report","pull_request"]),LI=s.enum(["safe","non_blocking","economic_risk","blocking"]),MI=s.object({cleanup:s.object({enabled:s.boolean().default(!1),mode:UI.default("report")}).default({enabled:!1,mode:"report"}),change_approval:s.object({auto_merge_max_risk:s.enum(["none","safe","non_blocking"]).default("none"),require_human_for:s.array(LI).default(["economic_risk","blocking"])}).default({auto_merge_max_risk:"none",require_human_for:["economic_risk","blocking"]})}).default({cleanup:{enabled:!1,mode:"report"},change_approval:{auto_merge_max_risk:"none",require_human_for:["economic_risk","blocking"]}}),ZI=s.enum(["org_only","org_and_user"]),FI=s.enum(["clerk","test-personas"]),qI=s.object({identity_requirement:ZI.optional(),context_tokens:s.object({enabled:s.boolean().default(!0)}).optional(),portal_auth:s.object({strategy:FI}).optional()}),VI=s.enum(["frontend","api","docs","widget","dashboard","webhook","worker","agent"]),BI=s.object({key:s.string().min(1).max(64).regex(/^[a-z0-9_-]+$/,"Surface key must be lowercase alphanumeric with hyphens/underscores"),type:VI,display:s.string().min(1).max(100).optional(),description:s.string().max(500).optional()}),HI=s.object({key:s.string().min(1).max(64).regex(/^[a-z0-9_-]+$/,"Entitlement key must be lowercase alphanumeric with hyphens/underscores"),description:s.string().max(500).optional(),capabilities:s.array(s.string().min(1).max(100)).max(100).optional(),featureGates:s.record(s.string().min(1),s.boolean()).optional(),limits:s.array(Dr).max(100).optional(),meters:s.array(s.string().min(1).max(64)).max(100).optional()}),KI=s.array(BI).max(20).default([]),GI=s.array(HI).max(100).default([]),JI=s.enum(["async_job","agent_task","scheduled","lifecycle","background"]),WI=s.discriminatedUnion("type",[s.object({type:s.literal("manual")}),s.object({type:s.literal("schedule"),cron:s.string().min(1).max(120)}),s.object({type:s.literal("event"),event:s.string().min(1).max(120)}),s.object({type:s.literal("api"),path:s.string().min(1).max(240).regex(/^\//,"path must start with /")}),s.object({type:s.literal("lifecycle"),event:s.string().min(1).max(120)})]),YI=s.object({key:s.string().min(1).max(64).regex(/^[a-z0-9_-]+$/,"Workflow key must be lowercase alphanumeric with hyphens/underscores"),title:s.string().min(1).max(120).optional(),description:s.string().max(1e3).optional(),kind:JI,trigger:WI,capabilities:s.array(s.string().min(1).max(100)).max(100).optional(),meters:s.array(s.string().min(1).max(64)).max(100).optional(),estimates:s.record(s.string().min(1).max(64),s.number().finite()).optional(),metadata:s.record(s.string().min(1),s.unknown()).optional()}),XI=s.array(YI).max(100).default([]),dn=s.object({product:s.object({name:s.string().min(1).max(100),displayName:s.string().max(200).optional(),description:s.string().max(2e3).optional(),baseUrl:s.string().url("baseUrl must be a valid URL"),sandboxBaseUrl:s.string().url("sandboxBaseUrl must be a valid URL").optional(),visibility:s.enum(["public","private"]).default("public"),logoUrl:s.string().url().optional(),primaryColor:s.string().regex(/^#[0-9a-fA-F]{6}$/).optional(),envBranchPrefix:s.string().max(50).nullable().optional()}),gateway:s.object({authHeader:s.string().min(1).max(100).default("x-api-key"),upstreamAuth:s.object({type:s.enum(["none","static_bearer"]),token:s.string().optional()}).default({type:"none"})}),metering:s.object({meters:s.array(Z_).max(10).default([]),billOn4xx:s.boolean().default(!1)}).default({meters:[],billOn4xx:!1}),backend:C_.optional(),usage:CI.optional(),usagePricing:s.never({error:"usagePricing is not supported. Define usage.meters.<key>.rating instead."}).optional(),features:DI.optional(),resources:N_,policies:MI,customer_context:qI.optional(),surfaces:KI,entitlements:GI,workflows:XI,frontend:z_.optional(),billing:s.object({applyLimitUpgradesInstantly:s.boolean().optional(),subscriberChangePolicy:Wa.default({default:"period_end",when:{price_increase:"period_end",price_decrease:"immediate",feature_added:"immediate",feature_removed:"period_end",limit_increased:"immediate",limit_reduced:"period_end",credit_increased:"immediate",credit_reduced:"period_end",rating_changed:"period_end"},allowImmediatePriceIncrease:!1,allowImmediateEntitlementReduction:!1})}).default({subscriberChangePolicy:{default:"period_end",when:{price_increase:"period_end",price_decrease:"immediate",feature_added:"immediate",feature_removed:"period_end",limit_increased:"immediate",limit_reduced:"period_end",credit_increased:"immediate",credit_reduced:"period_end",rating_changed:"period_end"},allowImmediatePriceIncrease:!1,allowImmediateEntitlementReduction:!1}}),plans:s.array(pd).max(4).default([]),add_ons:nI,lifecycle:s.object({breaking_changes:s.object({require_deprecation_window_days:s.number().int().nonnegative().default(0),require_successor_route:s.boolean().default(!1)}).default({require_deprecation_window_days:0,require_successor_route:!1})}).default({breaking_changes:{require_deprecation_window_days:0,require_successor_route:!1}}),webhooks:O_.optional(),environments:P_.optional(),ephemeral:s.object({defaultPlan:s.string().min(1).optional()}).optional()}).superRefine((t,e)=>{kI(t,e),$I(t.plans,e),SI(t.plans,e),wI(t,e),II(t,e),EI(t,e),TI(t,e),OI(t,e)}),jU=s.object({product:dn.shape.product}),DU=s.object({gateway:dn.shape.gateway}),UU=s.object({metering:dn.shape.metering}),LU=s.object({plans:dn.shape.plans});var q_=s.object({capability:s.string().min(1).max(120).regex(/^[a-z0-9_-]+$/,"capability name must be lowercase alphanumeric with hyphens/underscores"),description:s.string().max(500).optional(),mutation_class:s.enum(["runtime","contractual"]).default("contractual"),includes_features:s.array(s.string().min(1).max(100).regex(/^[a-z0-9_.:-]+$/)).max(20).default([]),includes_policies:s.array(s.string().min(1).max(64).regex(/^[a-z0-9_-]+$/)).max(20).default([]),includes_capabilities:s.array(s.string().min(1).max(120).regex(/^[a-z0-9_-]+$/)).max(20).default([])});var QI=1;var MU=s.object({irVersion:s.literal(QI),sdkVersion:s.string().min(1).max(64),product:dn,routes:s.array(L_).max(200).default([]),policies:s.array(U_).max(200).default([]),capabilities:s.array(q_).max(200).default([])}).strict();var ZG=s.object({subscriberChangePolicy:Wa.optional()}),FG=s.object({code:s.string(),kind:s.enum(["percent_off","amount_off","free_months"]),amount:s.number().optional(),durationMonths:s.number(),applicablePlanIds:s.array(s.string()).optional(),maxRedemptions:s.number().optional(),activeFrom:s.string().optional(),activeUntil:s.string().optional(),status:s.enum(["ACTIVE","ARCHIVED"]).optional()}),qG=s.object({id:s.string(),actorUserId:s.string().optional(),action:s.string(),decision:s.string().optional(),timestamp:s.string(),details:s.unknown().optional()}),VG=s.object({name:s.string(),branch:s.string().optional(),isProduction:s.boolean().optional()}),BG=s.object({id:s.string(),name:s.string(),apiKeyId:s.string().optional()});var ZU=["IMMEDIATE_NO_PRORATE","IMMEDIATE_PRORATE_CHARGE_NEW","IMMEDIATE_PRORATE_REFUND_OLD","IMMEDIATE_PRORATE_BOTH","DEFER_TO_PERIOD_END"],XG=s.enum(ZU);var eE=s.object({id:s.string(),billingCycleId:s.string(),effectiveStart:s.string(),effectiveEnd:s.string(),compiledPlanId:s.string()}),tE=s.object({currentPeriod:eE,priorPeriod:eE.optional()});var FU=s.object({subjectKey:s.string(),subscriptionId:s.string(),subscriberId:s.string(),productId:s.string(),organizationId:s.string(),compiledPlanId:s.string(),activeEntitlementHash:s.string().optional(),generation:s.number(),enforcementMode:s.enum(["STRICT","GRACE","TRACK_ONLY"]),dedicatedShard:s.enum(["ACTIVE","DRAINING"]).optional(),resourceCounts:s.record(s.string(),s.number()).optional(),overrides:s.object({featureGateOverrides:s.record(s.string(),s.boolean()).optional()}).optional(),subscriptionStatus:s.string(),subscriberStatus:s.string(),scopes:s.array(s.string()),periods:tE,expiresAt:s.number().optional(),trialEndsAt:s.string().optional()}),qU=s.discriminatedUnion("kind",[s.object({kind:s.literal("found"),state:FU,expiresAt:s.number(),ttlSeconds:s.number()}),s.object({kind:s.literal("not_found"),negativeCacheTtlSeconds:s.number().default(60)}),s.object({kind:s.literal("revoked"),negativeCacheTtlSeconds:s.number().default(300),reason:s.string().optional()}),s.object({kind:s.literal("rate_limited"),retryAfterSeconds:s.number().default(10)})]),oJ=s.object({environmentId:s.string().nullable(),subjectKeys:s.array(s.string()).min(1).max(500)}),iJ=s.object({results:s.array(s.object({subjectKey:s.string(),result:qU}))}),VU=s.object({keyId:s.string(),orgId:s.string(),productId:s.string(),compiledPlanId:s.string(),entitlementHash:s.string().optional(),subscriptionId:s.string(),subscriberId:s.string(),apiKeyId:s.string().nullable(),subjectKey:s.string(),entitlementVersion:s.number().int(),identityRequirement:s.enum(["org_only","org_and_user"]),status:s.enum(["active","revoked"]),subscriberStatus:s.enum(["ONBOARDING","ACTIVE","SUSPENDED"]),subscriptionStatus:s.string(),environment:s.enum(["production","sandbox"]).optional(),environmentId:s.string().optional(),scopes:s.array(s.string()).default([]),entitlement:s.unknown().optional(),actorType:s.enum(["org","user"]).optional(),actorId:s.string().nullable().optional(),currentPeriodId:s.string().optional(),currentPeriodStartMs:s.number().int().nonnegative().optional(),expiresAt:s.number().nullable().optional()}),aJ=s.discriminatedUnion("kind",[s.object({kind:s.literal("found"),record:VU,expiresAt:s.number(),ttlSeconds:s.number()}),s.object({kind:s.literal("not_found"),negativeCacheTtlSeconds:s.number().default(60)}),s.object({kind:s.literal("revoked"),negativeCacheTtlSeconds:s.number().default(300),reason:s.string().optional()}),s.object({kind:s.literal("rate_limited"),retryAfterSeconds:s.number().default(10)})]),sJ=s.discriminatedUnion("kind",[s.object({kind:s.literal("found"),entitlement:s.unknown(),expiresAt:s.number(),ttlSeconds:s.number()}),s.object({kind:s.literal("not_found"),negativeCacheTtlSeconds:s.number().default(60)}),s.object({kind:s.literal("rate_limited"),retryAfterSeconds:s.number().default(10)})]),BU=s.object({id:s.string(),origin:s.string(),sandboxOrigin:s.string().nullable().optional(),authHeader:s.string().optional(),pricing:s.record(s.string(),s.number()).optional(),metering:s.object({tokens:s.object({estimatePerRequest:s.number().optional()}).optional(),computeMs:s.object({estimatePerRequest:s.number().optional()}).optional(),billOn4xx:s.boolean().optional()}).optional(),tenantLimits:s.array(s.object({unit:s.enum(["requests","tokens","computeMs","dollars"]),window:s.enum(["second","minute","hour","day","week","month"]),capacity:s.number()})).optional(),userLimits:s.array(s.object({unit:s.enum(["requests","tokens","computeMs","dollars"]),window:s.enum(["second","minute","hour","day","week","month"]),capacity:s.number()})).optional(),environmentId:s.string().optional(),contextTokenSecret:s.string().nullable().optional(),timeoutMs:s.number().positive().optional(),idleTimeoutMs:s.number().positive().optional()}),cJ=s.discriminatedUnion("kind",[s.object({kind:s.literal("found"),tenant:BU,expiresAt:s.number(),ttlSeconds:s.number()}),s.object({kind:s.literal("not_found"),negativeCacheTtlSeconds:s.number().default(60)}),s.object({kind:s.literal("rate_limited"),retryAfterSeconds:s.number().default(10)})]);var hd=["consumer_api_key","consumer_session_token","test_persona_session_token","builder_master_key","builder_session_token","maker_jwt","service_jwt","internal_service","context_token"],rE=s.enum(hd);var HU=s.object({fromIssuer:s.string().min(1),fromTokenId:s.string().min(1),intent:s.string().min(1)}),nE=s.object({issuer:s.string().min(1),issuedAt:s.number().int().nonnegative(),expiresAt:s.number().int().nonnegative().optional(),tokenId:s.string().min(1).optional(),delegationChain:s.array(HU)});var V_=["template","embedded","provisioned","agent"],KU=s.enum(V_),GU=["builder_user","builder_org","maker","consumer_subject","internal_service","service_jwt","agent_runtime"],JU=s.enum(GU),oE=s.object({kind:JU,id:s.string().min(1),label:s.string().optional()}),WU=["subscription","organization","platform"],YU=s.enum(WU),XU=s.object({kind:YU,id:s.string().min(1)}),QU=s.object({type:rE,id:s.string().min(1),hint:s.string().max(8).optional()}),e4=s.object({compiledPlanId:s.string().min(1),fromCache:s.boolean().optional()}),iE=s.object({requestId:s.string().min(1),surface:KU,builderOrgId:s.string().min(1),productId:s.string().min(1).optional(),runtimeId:s.string().min(1).optional(),template:s.string().optional(),caller:oE,actor:oE,billingSubject:XU,credential:QU,capability:s.string().min(1),scopes:s.array(s.string()),entitlement:e4.optional(),trust:nE});var Ya;(function(t){t.AUTHZ_DECISION="authz_decision",t.ENTITLEMENT_DECISION="entitlement_decision",t.RUNTIME_LIMIT_DECISION="runtime_limit_decision",t.RESOURCE_GOVERNANCE_DECISION="resource_governance_decision",t.RESOURCE_MUTATION="resource_mutation",t.LIFECYCLE_EVENT="lifecycle_event",t.RUNTIME_CONTEXT_CREATED="runtime_context_created",t.SYSTEM_ACTION="system_action"})(Ya||(Ya={}));var aE=Object.values(Ya),EJ=s.enum(aE),sE=s.object({decisionId:s.string().optional(),ctx:iE,details:s.record(s.string(),s.unknown()).optional(),createdAt:s.string().min(1)}),t4=aE.filter(t=>t!==Ya.SYSTEM_ACTION),r4=sE.extend({kind:s.enum(t4)}),n4=sE.extend({kind:s.literal(Ya.SYSTEM_ACTION),actorType:s.string().min(1),action:s.string().min(1)}),TJ=s.discriminatedUnion("kind",[r4,n4]);var ue=["template","agent"],o4=["provisioned"],cE=[...V_],le=["builder_master_key","builder_session_token","maker_jwt"],Lo=["service_jwt","internal_service"],B_=["consumer_api_key","consumer_session_token","test_persona_session_token","context_token"],uE=[...hd],Xa="subscriptions:write",i4=[{id:"products.create",operation:"Create a product",requiredScopes:["products:write"],allowedSurfaces:ue,allowedCredentialTypes:le,description:"Create a new product in the builder org"},{id:"products.update",operation:"Update a product",requiredScopes:["products:write"],allowedSurfaces:ue,allowedCredentialTypes:le,description:"Update product metadata or compiled config"},{id:"products.delete",operation:"Delete a product",requiredScopes:["products:write"],allowedSurfaces:ue,allowedCredentialTypes:le,description:"Delete a product (soft-archive if subscriptions exist)"},{id:"products.read",operation:"Read a product",requiredScopes:["products:read"],allowedSurfaces:ue,allowedCredentialTypes:le,description:"Read product metadata + compiled config"},{id:"products.publish",operation:"Publish a product",requiredScopes:["products:write"],allowedSurfaces:ue,allowedCredentialTypes:le,description:"Compile + publish the product to the gateway"},{id:"plans.create",operation:"Create a plan",requiredScopes:["plans:write"],allowedSurfaces:ue,allowedCredentialTypes:le,description:"Add a new plan to a product"},{id:"plans.update",operation:"Update a plan",requiredScopes:["plans:write"],allowedSurfaces:ue,allowedCredentialTypes:le,description:"Update plan pricing, limits, or features"},{id:"plans.delete",operation:"Delete a plan",requiredScopes:["plans:write"],allowedSurfaces:ue,allowedCredentialTypes:le,description:"Delete a plan (denied if subscriptions are attached)"},{id:"plans.publish",operation:"Publish a plan",requiredScopes:["plans:write"],allowedSurfaces:ue,allowedCredentialTypes:le,description:"Mark a plan as available for new subscriptions"},{id:"subscriptions.create",operation:"Create a subscription",requiredScopes:[Xa],allowedSurfaces:ue,allowedCredentialTypes:[...le,...Lo],description:"Provision a new subscription for a subscriber"},{id:"subscriptions.update",operation:"Update a subscription",requiredScopes:[Xa],allowedSurfaces:ue,allowedCredentialTypes:[...le,...Lo],description:"Change plan, enforcement mode, or schedule"},{id:"subscriptions.cancel",operation:"Cancel a subscription",requiredScopes:[Xa],allowedSurfaces:ue,allowedCredentialTypes:[...le,...Lo],description:"Cancel a subscription (immediate or end-of-period)"},{id:"subscriptions.pause",operation:"Pause a subscription",requiredScopes:[Xa],allowedSurfaces:ue,allowedCredentialTypes:[...le,...Lo],description:"Pause a subscription (no usage, no billing)"},{id:"subscriptions.resume",operation:"Resume a subscription",requiredScopes:[Xa],allowedSurfaces:ue,allowedCredentialTypes:[...le,...Lo],description:"Resume a paused subscription"},{id:"subscriptions.read",operation:"Read a subscription",requiredScopes:["subscriptions:read"],allowedSurfaces:ue,allowedCredentialTypes:[...le,...Lo],description:"Read subscription state and usage"},{id:"webhooks.create",operation:"Create a webhook endpoint",requiredScopes:["webhooks:write"],allowedSurfaces:ue,allowedCredentialTypes:le,description:"Register a new webhook endpoint URL"},{id:"webhooks.update",operation:"Update a webhook endpoint",requiredScopes:["webhooks:write"],allowedSurfaces:ue,allowedCredentialTypes:le,description:"Update endpoint URL, secret, or subscribed events"},{id:"webhooks.delete",operation:"Delete a webhook endpoint",requiredScopes:["webhooks:write"],allowedSurfaces:ue,allowedCredentialTypes:le,description:"Remove a webhook endpoint"},{id:"webhooks.test",operation:"Send a test webhook payload",requiredScopes:["webhooks:write"],allowedSurfaces:ue,allowedCredentialTypes:le,description:"Trigger a synthetic payload to verify an endpoint"},{id:"api-keys.create",operation:"Create an API key",requiredScopes:["api-keys:write"],allowedSurfaces:ue,allowedCredentialTypes:le,description:"Mint a new consumer or master API key"},{id:"api-keys.revoke",operation:"Revoke an API key",requiredScopes:["api-keys:write"],allowedSurfaces:ue,allowedCredentialTypes:le,description:"Revoke an API key (immediate invalidation)"},{id:"api-keys.read",operation:"Read API key metadata",requiredScopes:["api-keys:read"],allowedSurfaces:ue,allowedCredentialTypes:le,description:"Read key id + hint + scopes (never the secret)"},{id:"organizations.create",operation:"Create an organization",requiredScopes:["orgs:write"],allowedSurfaces:["template"],allowedCredentialTypes:["builder_session_token"],description:"Create a builder org (top-level signup)"},{id:"organizations.update",operation:"Update an organization",requiredScopes:["orgs:write"],allowedSurfaces:ue,allowedCredentialTypes:le,description:"Update org metadata or billing email"},{id:"members.invite",operation:"Invite a member to an organization",requiredScopes:["members:write"],allowedSurfaces:ue,allowedCredentialTypes:le,description:"Send an invitation to join the org"},{id:"members.remove",operation:"Remove a member from an organization",requiredScopes:["members:write"],allowedSurfaces:ue,allowedCredentialTypes:le,description:"Revoke a member's access to the org"},{id:"projects.create",operation:"Create a project",requiredScopes:["projects:write"],allowedSurfaces:ue,allowedCredentialTypes:le,description:"Create a project (groups products + environments)"},{id:"environments.create",operation:"Create an environment",requiredScopes:["environments:write"],allowedSurfaces:ue,allowedCredentialTypes:le,description:"Add a deployment environment (stage / branch)"},{id:"environments.delete",operation:"Delete an environment",requiredScopes:["environments:write"],allowedSurfaces:ue,allowedCredentialTypes:le,description:"Remove a deployment environment"},{id:"billing.portal-redirect",operation:"Generate Stripe customer-portal redirect",requiredScopes:["billing:portal"],allowedSurfaces:ue,allowedCredentialTypes:[...le,...B_],description:"Mint a one-time Stripe portal-session redirect URL"},{id:"billing.read",operation:"Read billing state",requiredScopes:["billing:read"],allowedSurfaces:ue,allowedCredentialTypes:[...le,...B_],description:"Read invoices, balances, scheduled changes"},{id:"runtime-context.read",operation:"Read the caller's runtime context",requiredScopes:[],allowedSurfaces:cE,allowedCredentialTypes:uE,description:"Introspect the resolved RuntimeContext (minus secrets)"},{id:"capabilities.list",operation:"List registered capabilities",requiredScopes:[],allowedSurfaces:cE,allowedCredentialTypes:uE,description:"List all capabilities the registry knows about"},{id:"explain-denial.read",operation:"Explain a denial decision",requiredScopes:["audit:read"],allowedSurfaces:ue,allowedCredentialTypes:le,description:"Look up a decision id + return the full ctx + reason"},{id:"replay.execute",operation:"Replay a historical billing period",requiredScopes:["replay:execute"],allowedSurfaces:ue,allowedCredentialTypes:le,description:"Re-run billing for a past period; verify deltas"},{id:"rollback.execute",operation:"Execute a GitHub-driven product rollback",requiredScopes:["rollback:execute"],allowedSurfaces:ue,allowedCredentialTypes:le,description:"Revert business.config.ts to a previous commit (dry-run capable)"},{id:"api.invoke",operation:"Invoke a consumer-facing gateway route",requiredScopes:[],allowedSurfaces:o4,allowedCredentialTypes:B_,description:"Consumer-side traffic into a deployed product (catch-all). The EntitlementEngine + RuntimeLimitEngine handle the fine-grained gating; this capability is the umbrella entry-point."}],zJ=Object.freeze(i4);var a4=["BusinessApplyWorkflow","RollbackWorkflow","StripeSyncWorkflow","WebhookDispatchWorkflow","SubscriptionTransitionWorkflow","CompiledPlanLifecycleWorkflow","ShardReshardWorkflow","MaintenanceJobWorkflow"],jJ=s.enum(a4),s4=["transient","permanent","rollback-required","human-intervention"],DJ=s.enum(s4);var c4=["SAFE_AUTOMATIC","REQUIRES_APPROVAL","IRREVERSIBLE","BILLING_IMPACTING","EDGE_BREAKING"],UJ=s.enum(c4);var VJ=s.object({workflowExecutionId:s.string().min(1),eventType:s.string().min(1),phase:s.string().min(1).optional(),stepId:s.string().min(1).optional(),cohortKey:s.string().min(1).optional(),payload:s.record(s.string(),s.unknown()),occurredAt:s.string().min(1),correlationId:s.string().min(1).optional()}).transform(t=>({...t,workflowExecutionId:t.workflowExecutionId,stepId:t.stepId===void 0?void 0:t.stepId}));var u4=["GATEWAY","HOSTED_UI_PAGE","HOSTED_UI_PROXY"],l4=["platform_requests"],d4=s.object({requestId:s.string().optional(),productId:s.string().optional(),route:s.string().optional(),usageEventId:s.string().optional()}).strict(),p4=s.object({organizationId:s.string().min(1),source:s.enum(u4),dimension:s.enum(l4),quantity:s.number().int().positive(),idempotencyKey:s.string().min(1).max(512),occurredAt:s.string().datetime(),metadata:d4.optional()}).strict(),p5=s.object({entries:s.array(p4).min(1).max(500)});var lE={contract:{label:"Managed as code",summary:"Declarative product state, canonical in the GitHub repo; the API returns 409 MANAGED_BY_CODE once published. Author via the manifest + push.",canonicalHome:"repo",mcpMayWrite:!1},operate:{label:"Runtime operation",summary:"Imperative action on the running platform; never in the repo. Tokens, usage, readiness, builds, publish triggers, runtime knobs, brand edits.",canonicalHome:"api",mcpMayWrite:!0},dual:{label:"Repo or API",summary:"Reconciles via either the repo or the API/MCP; both converge to the same state. Preview environments are the canonical example.",canonicalHome:"both",mcpMayWrite:!0}};function m4(t){return lE[t].mcpMayWrite}function f4(t){return lE[t].canonicalHome}function dE(t,e){return e==="write"&&!m4(t)?`An MCP tool that writes cannot have operationClass "${t}": ${t}-class state is managed as code in the business repo (canonical home: ${f4(t)}). Make the tool read-only, or author the change in the manifest and push instead.`:null}var it={VALIDATION_ERROR:"VALIDATION_ERROR",CONFLICT:"CONFLICT",NOT_FOUND:"NOT_FOUND",NOT_IMPLEMENTED:"NOT_IMPLEMENTED",NOT_CONFIGURED:"NOT_CONFIGURED",INTERNAL_ERROR:"INTERNAL_ERROR",SERVICE_UNAVAILABLE:"SERVICE_UNAVAILABLE",RATE_LIMIT_EXCEEDED:"RATE_LIMIT_EXCEEDED",DELETE_CONFIRMATION_REQUIRED:"DELETE_CONFIRMATION_REQUIRED",MISSING_HOST:"MISSING_HOST",MISSING_CONNECTIONS:"MISSING_CONNECTIONS",SECRET_NOT_CONFIGURED:"SECRET_NOT_CONFIGURED",UNAUTHORIZED:"UNAUTHORIZED",FORBIDDEN:"FORBIDDEN",INVALID_ACCESS_KEY:"INVALID_ACCESS_KEY",AUTO_KEY_CREATION_FAILED:"AUTO_KEY_CREATION_FAILED",PERSONA_NOT_FOUND:"PERSONA_NOT_FOUND",PERSONA_REVOKED:"PERSONA_REVOKED",PERSONA_SESSIONS_NOT_SUPPORTED:"PERSONA_SESSIONS_NOT_SUPPORTED",NOT_TEST_PERSONA_ENV:"NOT_TEST_PERSONA_ENV",PERSONA_AUTH_DISABLED_IN_PROD:"PERSONA_AUTH_DISABLED_IN_PROD",MAKER_TOKEN_NOT_FOUND:"MAKER_TOKEN_NOT_FOUND",MAKER_TOKEN_NOT_REVOKED:"MAKER_TOKEN_NOT_REVOKED",MAKER_TOKEN_NO_PRODUCT:"MAKER_TOKEN_NO_PRODUCT",MAKER_TOKEN_REVOKED:"MAKER_TOKEN_REVOKED",ORGANIZATION_NOT_FOUND:"ORGANIZATION_NOT_FOUND",ORG_HAS_ACTIVE_SUBSCRIPTIONS:"ORG_HAS_ACTIVE_SUBSCRIPTIONS",ORG_HAS_OUTSTANDING_BALANCE:"ORG_HAS_OUTSTANDING_BALANCE",PERSONAL_ORG_NOT_DELETABLE:"PERSONAL_ORG_NOT_DELETABLE",MEMBER_NOT_FOUND:"MEMBER_NOT_FOUND",INVITATION_NOT_FOUND:"INVITATION_NOT_FOUND",CUSTOMER_NOT_FOUND:"CUSTOMER_NOT_FOUND",PRODUCT_NOT_FOUND:"PRODUCT_NOT_FOUND",PRODUCT_DELETE_BLOCKED:"PRODUCT_DELETE_BLOCKED",PRODUCT_REPO_NOT_LINKED:"PRODUCT_REPO_NOT_LINKED",PRODUCT_SCOPE_MISMATCH:"PRODUCT_SCOPE_MISMATCH",YAML_PARSE_ERROR:"YAML_PARSE_ERROR",COMPILATION_NOT_FOUND:"COMPILATION_NOT_FOUND",PLAN_NOT_FOUND:"PLAN_NOT_FOUND",PLAN_HAS_ACTIVE_SUBSCRIPTIONS:"PLAN_HAS_ACTIVE_SUBSCRIPTIONS",PLAN_SLUG_CONFLICT:"PLAN_SLUG_CONFLICT",PLAN_UPGRADE_REQUIRED:"PLAN_UPGRADE_REQUIRED",SLUG_CONFLICT:"SLUG_CONFLICT",SLUG_BLOCKED:"SLUG_BLOCKED",SLUG_OFFENSIVE:"SLUG_OFFENSIVE",SLUG_RESERVED:"SLUG_RESERVED",SLUG_IMPERSONATION:"SLUG_IMPERSONATION",SLUG_INVALID_FORMAT:"SLUG_INVALID_FORMAT",SLUG_VALIDATOR_NOT_READY:"SLUG_VALIDATOR_NOT_READY",PRICING_PREVIEW_FAILED:"PRICING_PREVIEW_FAILED",PRICING_REPLAY_FAILED:"PRICING_REPLAY_FAILED",RESERVATION_NOT_FOUND:"RESERVATION_NOT_FOUND",PROMO_CODE_NOT_FOUND:"PROMO_CODE_NOT_FOUND",PROMO_CODE_INVALID:"PROMO_CODE_INVALID",BILLING_EVENT_NOT_FOUND:"BILLING_EVENT_NOT_FOUND",BILLING_NOT_CONFIGURED:"BILLING_NOT_CONFIGURED",SUBSCRIPTION_NOT_READY:"SUBSCRIPTION_NOT_READY",SUBSCRIPTION_FETCH_FAILED:"SUBSCRIPTION_FETCH_FAILED",INVALID_STATE:"INVALID_STATE",DUPLICATE_TRANSITION:"DUPLICATE_TRANSITION",LEGACY_STABLE_NOT_SELF_SERVICE:"LEGACY_STABLE_NOT_SELF_SERVICE",ARCHIVED_TARGET:"ARCHIVED_TARGET",FREE_TO_PAID_VIA_CHECKOUT_ONLY:"FREE_TO_PAID_VIA_CHECKOUT_ONLY",CAPABILITY_LIMIT_EXCEEDED:"CAPABILITY_LIMIT_EXCEEDED",CAPABILITY_CHECK_UNAVAILABLE:"CAPABILITY_CHECK_UNAVAILABLE",STRIPE_NOT_CONFIGURED:"STRIPE_NOT_CONFIGURED",STRIPE_BALANCE_OUTSTANDING:"STRIPE_BALANCE_OUTSTANDING",STRIPE_OPERATION_FAILED:"STRIPE_OPERATION_FAILED",STRIPE_RESYNC_FAILED:"STRIPE_RESYNC_FAILED",CHECKOUT_SESSION_FAILED:"CHECKOUT_SESSION_FAILED",POLAR_PRODUCT_NOT_CONFIGURED:"POLAR_PRODUCT_NOT_CONFIGURED",BILLING_TAX_NOT_ENROLLED:"BILLING_TAX_NOT_ENROLLED",WEBHOOK_NOT_FOUND:"WEBHOOK_NOT_FOUND",WEBHOOK_DISPATCH_FAILED:"WEBHOOK_DISPATCH_FAILED",WEBHOOK_SECRET_NOT_CONFIGURED:"WEBHOOK_SECRET_NOT_CONFIGURED",INVALID_WEBHOOK_SIGNATURE:"INVALID_WEBHOOK_SIGNATURE",MISSING_RAW_BODY:"MISSING_RAW_BODY",WEBHOOK_REDIRECTED:"WEBHOOK_REDIRECTED",MANAGED_BY_CODE:"MANAGED_BY_CODE",GITHUB_CONNECTION_NOT_FOUND:"GITHUB_CONNECTION_NOT_FOUND",GITHUB_NOT_CONNECTED:"GITHUB_NOT_CONNECTED",GITHUB_SYNC_FAILED:"GITHUB_SYNC_FAILED",GITHUB_SYNC_UNAVAILABLE:"GITHUB_SYNC_UNAVAILABLE",GITHUB_TOKEN_FAILED:"GITHUB_TOKEN_FAILED",GIT_PROVIDER_NOT_CONFIGURED:"GIT_PROVIDER_NOT_CONFIGURED",ENVIRONMENT_NOT_FOUND:"ENVIRONMENT_NOT_FOUND",ENVIRONMENT_CLEANUP_FAILED:"ENVIRONMENT_CLEANUP_FAILED",DEPLOYMENT_RUN_NOT_FOUND:"DEPLOYMENT_RUN_NOT_FOUND",BRANCH_NO_MATCHING_ENV:"BRANCH_NO_MATCHING_ENV",APPLY_SPEC_FAILED:"APPLY_SPEC_FAILED",BOOTSTRAP_FAILED:"BOOTSTRAP_FAILED",JOB_ALREADY_RUNNING:"JOB_ALREADY_RUNNING",LOGO_DELETE_FAILED:"LOGO_DELETE_FAILED",LOGO_UPLOAD_FAILED:"LOGO_UPLOAD_FAILED",INVALID_LOGO_FORMAT:"INVALID_LOGO_FORMAT"};var _5={missing_token:it.UNAUTHORIZED,invalid_token:it.UNAUTHORIZED,missing_signature:it.UNAUTHORIZED,malformed_signature:it.UNAUTHORIZED,unknown_key_id:it.UNAUTHORIZED,bad_signature:it.UNAUTHORIZED,expired_signature:it.UNAUTHORIZED,clock_skew:it.UNAUTHORIZED,replayed_nonce:it.UNAUTHORIZED,body_hash_mismatch:it.UNAUTHORIZED,route_mismatch:it.UNAUTHORIZED,environment_mismatch:it.UNAUTHORIZED,jwks_unavailable:it.SERVICE_UNAVAILABLE,body_too_large:it.VALIDATION_ERROR};var y5=Object.values(Aw);var pE={limit_allocator_unavailable:{statuses:[503],source:"batcher-enum",retryAfter:!0,verifiedAt:["engine/enforcement/runtime.ts:471"]},limit_exceeded:{statuses:[402],source:"batcher-enum",retryAfter:!0,verifiedAt:["engine/enforcement/batcher.ts:326","engine/enforcement/constraints/quota.ts:69"]},rate_limited:{statuses:[429],source:"batcher-enum",retryAfter:!0,verifiedAt:["engine/enforcement/batcher.ts:328","engine/enforcement/constraints/rate-limit.ts:74","engine/pipeline/rate-limit.ts:83"]},credit_exhausted:{statuses:[402],source:"batcher-enum",retryAfter:!0,verifiedAt:["engine/enforcement/batcher.ts:333"]},enforcement_denied:{statuses:[402],source:"batcher-enum",retryAfter:!0,verifiedAt:["engine/enforcement/batcher.ts:335"]},feature_not_enabled:{statuses:[403],source:"runtime-inline",retryAfter:!1,verifiedAt:["engine/enforcement/runtime.ts:188"]},invalid_entitlement_shape:{statuses:[503],source:"runtime-inline",retryAfter:!0,verifiedAt:["engine/enforcement/runtime.ts:144"]},unsupported_constraint_schema:{statuses:[503],source:"runtime-inline",retryAfter:!1,verifiedAt:["engine/enforcement/runtime.ts:154"]},enforcement_error:{statuses:[500],source:"runtime-inline",retryAfter:!1,verifiedAt:["engine/enforcement/runtime.ts:342"]},enforcement_dependency_unavailable:{statuses:[503],source:"runtime-inline",retryAfter:!1,verifiedAt:["engine/enforcement/runtime.ts:427"]},concurrency_limit_exceeded:{statuses:[429],source:"constraint",retryAfter:!0,verifiedAt:["engine/enforcement/constraints/concurrency.ts"]},concurrency_context_unavailable:{statuses:[503],source:"constraint",retryAfter:!0,verifiedAt:["engine/enforcement/constraints/concurrency.ts:291"]},concurrency_coordinator_unavailable:{statuses:[503],source:"constraint",retryAfter:!0,verifiedAt:["engine/enforcement/constraints/concurrency.ts:305"]},key_expired:{statuses:[401],source:"constraint",retryAfter:!1,verifiedAt:["engine/enforcement/constraints/credential-validity.ts:33"]},geo_context_unavailable:{statuses:[503],source:"constraint",retryAfter:!0,verifiedAt:["engine/enforcement/constraints/geo-restriction.ts:44"]},geo_blocked:{statuses:[403],source:"constraint",retryAfter:!1,verifiedAt:["engine/enforcement/constraints/geo-restriction.ts:51"]},geo_not_allowed:{statuses:[403],source:"constraint",retryAfter:!1,verifiedAt:["engine/enforcement/constraints/geo-restriction.ts:58"]},resource_count_limit_exceeded:{statuses:[403,402],source:"constraint",retryAfter:!1,verifiedAt:["engine/enforcement/constraints/resource-count.ts:95","apps/core:routes/internal/gateway-resources.ts:144"]},request_too_large:{statuses:[413],source:"constraint",retryAfter:!1,verifiedAt:["engine/enforcement/constraints/capacity.ts"]},resolver_rate_limited:{statuses:[503],source:"gateway-error",retryAfter:!0,verifiedAt:["engine/errors.ts:55"]},resolver_unavailable:{statuses:[503],source:"gateway-error",retryAfter:!0,verifiedAt:["engine/errors.ts:73"]},credential_resolver_miss_rate_limited:{statuses:[429],source:"gateway-error",retryAfter:!0,verifiedAt:["engine/errors.ts:89"]},provider_throttled:{statuses:[503],source:"gateway-error",retryAfter:!0,verifiedAt:["engine/pipeline/provider-adapter.ts"]}},h4=Object.keys(pE);var g4=new Set([429,503]),b5=new Set(h4.filter(t=>pE[t].statuses.every(e=>g4.has(e))));var _4=["quota","rate","concurrency","capacity","spend","adaptive"],k5=new Set(_4);var y4=[402,403,413,429],S5=new Set(y4);import{existsSync as K_,mkdirSync as v4,readFileSync as gE,writeFileSync as T3}from"node:fs";import{homedir as b4}from"node:os";import{join as G_}from"node:path";var mE="https://core.farthershore.com";var J_=G_(b4(),".farthershore"),fE=G_(J_,"config.json"),hE=G_(J_,"credentials.json");function x4(t){K_(t)||v4(t,{recursive:!0,mode:448})}var H_={apiUrl:mE};function _E(){if(x4(J_),!K_(fE))return H_;try{let t=JSON.parse(gE(fE,"utf-8"));return{...H_,...t}}catch{return H_}}function yE(){if(!K_(hE))return null;try{return JSON.parse(gE(hE,"utf-8"))}catch{return null}}var te=class extends Error{constructor(n,o,r){super(n);this.status=o;this.name="CliError",this.code=r?.code,this.details=r?.details,this.param=r?.param}status;code;details;param};function vE(t){if(t)return t;let e=process.env.FARTHERSHORE_TOKEN;if(e)return e;let n=yE();if(n?.token)return n.token;throw new te("Not authenticated. Run `farthershore auth login` or set FARTHERSHORE_TOKEN environment variable.")}var Mo="x-fs-surface",Zo="cli",k4="management";function gd(t,e){let n=new URLSearchParams;for(let[r,i]of Object.entries(e))i&&n.set(r,i);let o=n.toString();return o?`${t}?${o}`:t}function bE(t){let e=t.includes("?")?"&":"?";return`${t}${e}dry_run=true`}function xE(t){let e=null;async function n(){let c=await fetch(`${t.apiUrl}/auth/cli/exchange`,{method:"POST",headers:{Authorization:`Bearer ${t.token}`,"Content-Type":"application/json",[Mo]:Zo}});if(!c.ok){let l=(await c.json().catch(()=>null))?.error,d=typeof l=="string"?{message:l}:l;throw new te(d?.message??c.statusText,c.status,{code:d?.code,details:d?.details})}return e=await c.json(),e}function o(c){return c.split("/",3)[1]===k4}async function r(c){if(!t.token.startsWith("mk_")||o(c))return t.token;let u=e?Date.parse(e.expiresAt):0;return(!e||u-Date.now()<6e4)&&await n(),e.accessToken}async function i(c,u,l,d){let p=await r(u),m=d?.dryRun?bE(u):u,f={Authorization:`Bearer ${p}`,"Content-Type":"application/json",[Mo]:Zo};d?.idempotencyKey&&(f["Idempotency-Key"]=d.idempotencyKey);let g=await fetch(`${t.apiUrl}${m}`,{method:c,headers:f,body:l?JSON.stringify(l):void 0});if(!g.ok){let b=(await g.json().catch(()=>null))?.error,E=typeof b=="string"?{message:b}:b;throw new te(E?.message??g.statusText,g.status,{code:E?.code,details:E?.details})}if(g.status!==204)return g.json()}async function a(c,u,l,d,p){let m=await r(u),f=p?.dryRun?bE(u):u,g={Authorization:`Bearer ${m}`,"Content-Type":d,[Mo]:Zo};p?.idempotencyKey&&(g["Idempotency-Key"]=p.idempotencyKey);let v=await fetch(`${t.apiUrl}${f}`,{method:c,headers:g,body:l});if(!v.ok){let E=(await v.json().catch(()=>null))?.error,L=typeof E=="string"?{message:E}:E;throw new te(L?.message??v.statusText,v.status,{code:L?.code,details:L?.details})}if(v.status!==204)return v.json()}return{exchangeCliToken:n,bootstrap:()=>i("POST","/builder/context/bootstrap"),listProducts:()=>i("GET","/businesses"),initProduct:(c,u)=>i("POST","/businesses/init",c,u),updateProduct:(c,u,l,d)=>i("PATCH",gd(`/businesses/${c}`,{env:l?.env}),u,d),uploadBrandAsset:(c,u,l,d,p)=>a("PUT",`/businesses/${c}/${u}`,l,d,p),deleteBrandAsset:(c,u,l)=>i("DELETE",`/businesses/${c}/${u}`,void 0,l),publishProduct:(c,u,l)=>i("POST",`/businesses/${c}/publish`,u&&Object.keys(u).length>0?u:void 0,l),migratePlan:(c,u,l,d)=>i("POST",`/businesses/${c}/plans/${encodeURIComponent(u)}/migration-batches`,l,d),getProduct:(c,u)=>i("GET",gd(`/businesses/${c}`,{env:u?.env})),getDeployments:c=>i("GET",`/businesses/${c}/deployments`),listChangeSets:(c,u)=>i("GET",gd(`/businesses/${c}/change-sets`,{env:u?.env})),listEnvironments:c=>i("GET",`/businesses/${c}/environments`),createEnvironment:(c,u,l)=>i("POST",`/businesses/${c}/environments`,u,l),deleteEnvironment:(c,u)=>i("DELETE",`/businesses/${c}/environments/${encodeURIComponent(u)}`),deleteProduct:c=>i("DELETE",`/businesses/${c}`),managementListPlans:c=>i("GET",`/management/businesses/${c}/plans`),managementGetUsage:c=>i("GET",`/management/businesses/${c}/usage`),managementListMakerTokens:()=>i("GET","/maker-tokens"),managementCreateMakerToken:(c,u)=>i("POST","/maker-tokens",c,u),managementRevokeMakerToken:c=>i("DELETE",`/maker-tokens/${c}`),managementRotateMakerToken:(c,u,l)=>i("POST",`/maker-tokens/${c}/rotate`,u,l),managementHardDeleteMakerToken:c=>i("DELETE",`/maker-tokens/${c}/hard`),builderListBackends:c=>i("GET",`/businesses/${c}/backends`),builderCreateBackend:(c,u,l)=>i("POST",`/businesses/${c}/backends`,u,l),builderDeleteBackend:(c,u)=>i("DELETE",`/businesses/${c}/backends/${u}`),builderListRuntimeTokens:c=>i("GET",`/businesses/${c}/runtime-tokens`),builderCreateRuntimeToken:(c,u,l)=>i("POST",`/businesses/${c}/runtime-tokens`,u,l),builderRotateRuntimeToken:(c,u,l)=>i("POST",`/businesses/${c}/runtime-tokens/${u}/rotate`,void 0,l),builderRevokeRuntimeToken:(c,u)=>i("DELETE",`/businesses/${c}/runtime-tokens/${u}`),builderFrontendDeploy:(c,u,l)=>i("POST",`/businesses/${c}/frontend/deploy`,u,l),builderFrontendStatus:(c,u)=>i("GET",`/businesses/${c}/frontend/status${u?`?environmentId=${encodeURIComponent(u)}`:""}`),builderFrontendReleases:(c,u)=>i("GET",`/businesses/${c}/frontend/releases${u?`?environmentId=${encodeURIComponent(u)}`:""}`),builderFrontendRollback:(c,u,l)=>i("POST",`/businesses/${c}/frontend/rollback`,u,l),builderFrontendVariables:(c,u)=>i("GET",`/businesses/${c}/frontend/variables${u?`?environmentId=${encodeURIComponent(u)}`:""}`),builderSetFrontendVariable:(c,u,l)=>i("POST",`/businesses/${c}/frontend/variables`,u,l),builderDeleteFrontendVariable:(c,u,l,d)=>i("DELETE",`/businesses/${c}/frontend/variables/${encodeURIComponent(u)}${l?`?environmentId=${encodeURIComponent(l)}`:""}`,void 0,d),builderGitHubStatus:()=>i("GET","/builder/git/github/status"),productStripeStatus:c=>i("GET",`/businesses/${c}/stripe/status`),issuePersonaBootstrapKey:async(c,u,l)=>{let d=await fetch(`${t.apiUrl}/portal/businesses/${c}/environments/${u}/test/bootstrap-key`,{method:"POST",headers:{Authorization:`Bearer ${t.token}`,"Content-Type":"application/json",[Mo]:Zo},body:JSON.stringify(l??{})});if(!d.ok){let m=(await d.json().catch(()=>null))?.error,f=typeof m=="string"?{message:m}:m;throw new te(f?.message??d.statusText,d.status,{code:f?.code,details:f?.details})}return d.json()},listPersonas:async(c,u)=>{let l=await fetch(`${t.apiUrl}/portal/businesses/${c}/environments/${u}/test/personas`,{method:"GET",headers:{Authorization:`Bearer ${t.token}`,[Mo]:Zo}});if(!l.ok){let p=(await l.json().catch(()=>null))?.error,m=typeof p=="string"?{message:p}:p;throw new te(m?.message??l.statusText,l.status,{code:m?.code,details:m?.details})}return l.json()},revokePersona:async(c,u,l)=>{let d=await fetch(`${t.apiUrl}/portal/businesses/${c}/environments/${u}/test/personas/${l}`,{method:"DELETE",headers:{Authorization:`Bearer ${t.token}`,[Mo]:Zo}});if(!d.ok){let m=(await d.json().catch(()=>null))?.error,f=typeof m=="string"?{message:m}:m;throw new te(f?.message??d.statusText,d.status,{code:f?.code,details:f?.details})}return d.json()},getProductConfig:(c,u)=>i("GET",gd(`/businesses/${c}/config`,{format:"json",env:u?.env,state:u?.state})),updateProductConfigDraft:(c,u,l)=>i("PATCH",`/businesses/${c}/config/draft`,{spec:u,env:l?.env,branch:l?.branch,source:l?.source,baseDraftHash:l?.baseDraftHash})}}var kE=(t=0)=>e=>`\x1B[${e+t}m`,$E=(t=0)=>e=>`\x1B[${38+t};5;${e}m`,SE=(t=0)=>(e,n,o)=>`\x1B[${38+t};2;${e};${n};${o}m`,Se={modifier:{reset:[0,0],bold:[1,22],dim:[2,22],italic:[3,23],underline:[4,24],overline:[53,55],inverse:[7,27],hidden:[8,28],strikethrough:[9,29]},color:{black:[30,39],red:[31,39],green:[32,39],yellow:[33,39],blue:[34,39],magenta:[35,39],cyan:[36,39],white:[37,39],blackBright:[90,39],gray:[90,39],grey:[90,39],redBright:[91,39],greenBright:[92,39],yellowBright:[93,39],blueBright:[94,39],magentaBright:[95,39],cyanBright:[96,39],whiteBright:[97,39]},bgColor:{bgBlack:[40,49],bgRed:[41,49],bgGreen:[42,49],bgYellow:[43,49],bgBlue:[44,49],bgMagenta:[45,49],bgCyan:[46,49],bgWhite:[47,49],bgBlackBright:[100,49],bgGray:[100,49],bgGrey:[100,49],bgRedBright:[101,49],bgGreenBright:[102,49],bgYellowBright:[103,49],bgBlueBright:[104,49],bgMagentaBright:[105,49],bgCyanBright:[106,49],bgWhiteBright:[107,49]}},L3=Object.keys(Se.modifier),$4=Object.keys(Se.color),S4=Object.keys(Se.bgColor),M3=[...$4,...S4];function w4(){let t=new Map;for(let[e,n]of Object.entries(Se)){for(let[o,r]of Object.entries(n))Se[o]={open:`\x1B[${r[0]}m`,close:`\x1B[${r[1]}m`},n[o]=Se[o],t.set(r[0],r[1]);Object.defineProperty(Se,e,{value:n,enumerable:!1})}return Object.defineProperty(Se,"codes",{value:t,enumerable:!1}),Se.color.close="\x1B[39m",Se.bgColor.close="\x1B[49m",Se.color.ansi=kE(),Se.color.ansi256=$E(),Se.color.ansi16m=SE(),Se.bgColor.ansi=kE(10),Se.bgColor.ansi256=$E(10),Se.bgColor.ansi16m=SE(10),Object.defineProperties(Se,{rgbToAnsi256:{value(e,n,o){return e===n&&n===o?e<8?16:e>248?231:Math.round((e-8)/247*24)+232:16+36*Math.round(e/255*5)+6*Math.round(n/255*5)+Math.round(o/255*5)},enumerable:!1},hexToRgb:{value(e){let n=/[a-f\d]{6}|[a-f\d]{3}/i.exec(e.toString(16));if(!n)return[0,0,0];let[o]=n;o.length===3&&(o=[...o].map(i=>i+i).join(""));let r=Number.parseInt(o,16);return[r>>16&255,r>>8&255,r&255]},enumerable:!1},hexToAnsi256:{value:e=>Se.rgbToAnsi256(...Se.hexToRgb(e)),enumerable:!1},ansi256ToAnsi:{value(e){if(e<8)return 30+e;if(e<16)return 90+(e-8);let n,o,r;if(e>=232)n=((e-232)*10+8)/255,o=n,r=n;else{e-=16;let c=e%36;n=Math.floor(e/36)/5,o=Math.floor(c/6)/5,r=c%6/5}let i=Math.max(n,o,r)*2;if(i===0)return 30;let a=30+(Math.round(r)<<2|Math.round(o)<<1|Math.round(n));return i===2&&(a+=60),a},enumerable:!1},rgbToAnsi:{value:(e,n,o)=>Se.ansi256ToAnsi(Se.rgbToAnsi256(e,n,o)),enumerable:!1},hexToAnsi:{value:e=>Se.ansi256ToAnsi(Se.hexToAnsi256(e)),enumerable:!1}}),Se}var I4=w4(),Dt=I4;import W_ from"node:process";import E4 from"node:os";import wE from"node:tty";function xt(t,e=globalThis.Deno?globalThis.Deno.args:W_.argv){let n=t.startsWith("-")?"":t.length===1?"-":"--",o=e.indexOf(n+t),r=e.indexOf("--");return o!==-1&&(r===-1||o<r)}var{env:we}=W_,_d;xt("no-color")||xt("no-colors")||xt("color=false")||xt("color=never")?_d=0:(xt("color")||xt("colors")||xt("color=true")||xt("color=always"))&&(_d=1);function T4(){if("FORCE_COLOR"in we)return we.FORCE_COLOR==="true"?1:we.FORCE_COLOR==="false"?0:we.FORCE_COLOR.length===0?1:Math.min(Number.parseInt(we.FORCE_COLOR,10),3)}function O4(t){return t===0?!1:{level:t,hasBasic:!0,has256:t>=2,has16m:t>=3}}function P4(t,{streamIsTTY:e,sniffFlags:n=!0}={}){let o=T4();o!==void 0&&(_d=o);let r=n?_d:o;if(r===0)return 0;if(n){if(xt("color=16m")||xt("color=full")||xt("color=truecolor"))return 3;if(xt("color=256"))return 2}if("TF_BUILD"in we&&"AGENT_NAME"in we)return 1;if(t&&!e&&r===void 0)return 0;let i=r||0;if(we.TERM==="dumb")return i;if(W_.platform==="win32"){let a=E4.release().split(".");return Number(a[0])>=10&&Number(a[2])>=10586?Number(a[2])>=14931?3:2:1}if("CI"in we)return["GITHUB_ACTIONS","GITEA_ACTIONS","CIRCLECI"].some(a=>a in we)?3:["TRAVIS","APPVEYOR","GITLAB_CI","BUILDKITE","DRONE"].some(a=>a in we)||we.CI_NAME==="codeship"?1:i;if("TEAMCITY_VERSION"in we)return/^(9\.(0*[1-9]\d*)\.|\d{2,}\.)/.test(we.TEAMCITY_VERSION)?1:0;if(we.COLORTERM==="truecolor"||we.TERM==="xterm-kitty"||we.TERM==="xterm-ghostty"||we.TERM==="wezterm")return 3;if("TERM_PROGRAM"in we){let a=Number.parseInt((we.TERM_PROGRAM_VERSION||"").split(".")[0],10);switch(we.TERM_PROGRAM){case"iTerm.app":return a>=3?3:2;case"Apple_Terminal":return 2}}return/-256(color)?$/i.test(we.TERM)?2:/^screen|^xterm|^vt100|^vt220|^rxvt|color|ansi|cygwin|linux/i.test(we.TERM)||"COLORTERM"in we?1:i}function IE(t,e={}){let n=P4(t,{streamIsTTY:t&&t.isTTY,...e});return O4(n)}var R4={stdout:IE({isTTY:wE.isatty(1)}),stderr:IE({isTTY:wE.isatty(2)})},EE=R4;function TE(t,e,n){let o=t.indexOf(e);if(o===-1)return t;let r=e.length,i=0,a="";do a+=t.slice(i,o)+e+n,i=o+r,o=t.indexOf(e,i);while(o!==-1);return a+=t.slice(i),a}function OE(t,e,n,o){let r=0,i="";do{let a=t[o-1]==="\r";i+=t.slice(r,a?o-1:o)+e+(a?`\r
|
|
81
81
|
`:`
|
|
82
82
|
`)+n,r=o+1,o=t.indexOf(`
|
|
83
83
|
`,r)}while(o!==-1);return i+=t.slice(r),i}var{stdout:PE,stderr:RE}=EE,Y_=Symbol("GENERATOR"),Fo=Symbol("STYLER"),Qa=Symbol("IS_EMPTY"),zE=["ansi","ansi","ansi256","ansi16m"],qo=Object.create(null),z4=(t,e={})=>{if(e.level&&!(Number.isInteger(e.level)&&e.level>=0&&e.level<=3))throw new Error("The `level` option should be an integer from 0 to 3");let n=PE?PE.level:0;t.level=e.level===void 0?n:e.level};var N4=t=>{let e=(...n)=>n.join(" ");return z4(e,t),Object.setPrototypeOf(e,es.prototype),e};function es(t){return N4(t)}Object.setPrototypeOf(es.prototype,Function.prototype);for(let[t,e]of Object.entries(Dt))qo[t]={get(){let n=yd(this,Q_(e.open,e.close,this[Fo]),this[Qa]);return Object.defineProperty(this,t,{value:n}),n}};qo.visible={get(){let t=yd(this,this[Fo],!0);return Object.defineProperty(this,"visible",{value:t}),t}};var X_=(t,e,n,...o)=>t==="rgb"?e==="ansi16m"?Dt[n].ansi16m(...o):e==="ansi256"?Dt[n].ansi256(Dt.rgbToAnsi256(...o)):Dt[n].ansi(Dt.rgbToAnsi(...o)):t==="hex"?X_("rgb",e,n,...Dt.hexToRgb(...o)):Dt[n][t](...o),A4=["rgb","hex","ansi256"];for(let t of A4){qo[t]={get(){let{level:n}=this;return function(...o){let r=Q_(X_(t,zE[n],"color",...o),Dt.color.close,this[Fo]);return yd(this,r,this[Qa])}}};let e="bg"+t[0].toUpperCase()+t.slice(1);qo[e]={get(){let{level:n}=this;return function(...o){let r=Q_(X_(t,zE[n],"bgColor",...o),Dt.bgColor.close,this[Fo]);return yd(this,r,this[Qa])}}}}var C4=Object.defineProperties(()=>{},{...qo,level:{enumerable:!0,get(){return this[Y_].level},set(t){this[Y_].level=t}}}),Q_=(t,e,n)=>{let o,r;return n===void 0?(o=t,r=e):(o=n.openAll+t,r=e+n.closeAll),{open:t,close:e,openAll:o,closeAll:r,parent:n}},yd=(t,e,n)=>{let o=(...r)=>j4(o,r.length===1?""+r[0]:r.join(" "));return Object.setPrototypeOf(o,C4),o[Y_]=t,o[Fo]=e,o[Qa]=n,o},j4=(t,e)=>{if(t.level<=0||!e)return t[Qa]?"":e;let n=t[Fo];if(n===void 0)return e;let{openAll:o,closeAll:r}=n;if(e.includes("\x1B"))for(;n!==void 0;)e=TE(e,n.close,n.open),n=n.parent;let i=e.indexOf(`
|
|
@@ -93,4 +93,4 @@ Output:
|
|
|
93
93
|
Examples:
|
|
94
94
|
farthershore plan migrate my-product pro --from 1 --to head --policy next_renewal
|
|
95
95
|
farthershore plan migrate my-product pro --from 1 --to 2 --policy immediate --proration prorate
|
|
96
|
-
`,handler:async({client:t,args:e,reqOpts:n,emit:o,emitDryRunPreview:r})=>{let i=e.productId,a=e.planKey,c=e.policy;if(!$d.includes(c))throw new te(`Invalid --policy "${c}". Supported: ${$d.join(", ")}.`,void 0,{code:"INVALID_MIGRATION_POLICY"});let u=await t.migratePlan(i,a,{fromVersion:e.from,toVersion:e.to,policy:c,proration:e.proration,completeBy:e.completeBy},n);r(u)||o({productId:i,planKey:a,migration:u},`Migration scheduled for plan ${a}`)}},mcp:{tool:"fs_plan_migrate",title:"Migrate subscribers between plan versions",description:"Schedule a subscriber migration for a plan: move subscribers from one plan version to another under a policy. Pass the plan KEY plus fromVersion/toVersion (each an integer or 'head'/'latest') \u2014 the server resolves them to the right plan versions. Policies: grandfather (keep existing subs as-is), next_renewal (migrate at each sub's renewal), immediate (migrate now), by_date (migrate everyone by a deadline), opt_in (subs choose). This is an OPERATE action (it changes live subscriber state, not the product's code-managed definition).",annotations:{readOnlyHint:!1,destructiveHint:!1,idempotentHint:!0,openWorldHint:!1},inputSchema:{productId:s.string().describe("The product id whose subscribers to migrate."),planKey:s.string().describe("The stable plan key (e.g. 'pro') to migrate within."),fromVersion:s.union([s.string(),s.number().int().positive()]).describe("Source plan version: an integer or 'head'/'latest'."),toVersion:s.union([s.string(),s.number().int().positive()]).describe("Target plan version: an integer or 'head'/'latest'."),policy:s.enum($d).describe("Migration policy: grandfather | next_renewal | immediate | by_date | opt_in."),proration:s.enum(["none","prorate","credit"]).optional().describe("Optional proration behaviour."),completeBy:s.string().optional().describe("ISO 8601 deadline \u2014 required by the by_date policy."),...We},handler:async(t,e)=>t.migratePlan(e.productId,e.planKey,{fromVersion:e.fromVersion,toVersion:e.toVersion,policy:e.policy,proration:e.proration,completeBy:e.completeBy},{idempotencyKey:e.idempotencyKey})}}],KE=uL;function lL(t){if(!t||typeof t!="object")return[];let e=t;return Array.isArray(e.data)?e.data:Array.isArray(e.environments)?e.environments:[]}var GE=[{opKey:"environment.read",operationClass:"dual",scope:["products:read"],sideEffect:"read",cli:{group:"env",command:"list",summary:"List environments for a product",args:[{field:"productId",kind:"positional",token:"<productIdOrName>",resolveProduct:!0}],handler:async({client:t,args:e,emit:n})=>{let o=e.productId,r=lL(await t.listEnvironments(o));n({productId:o,count:r.length,environments:r.map(i=>({id:i.id,name:i.name,branch:i.branch??null,portalHostname:i.portalHostname??null,runtimeHostname:i.runtimeHostname??null,status:i.status??null}))},`${r.length} environment(s)`)}},mcp:{tool:"fs_env_list",title:"List environments",description:"List a product's preview environments (name, branch, hostnames). Read-only.",annotations:{readOnlyHint:!0,openWorldHint:!1},inputSchema:{productId:s.string().describe("The product id whose environments to list.")},handler:async(t,{productId:e})=>t.listEnvironments(e)}},{opKey:"environment.create",operationClass:"dual",scope:["products:update"],sideEffect:"write",cli:{group:"env",command:"create",summary:"Create a preview environment bound to a git branch",idempotent:!0,args:[{field:"productId",kind:"positional",token:"<productIdOrName>",resolveProduct:!0},{field:"name",kind:"flag",token:"--name <name>",describe:"Environment name (e.g. preview, staging)",required:!0},{field:"branch",kind:"flag",token:"--branch <branch>",describe:"Git branch to track (e.g. env/preview)",required:!0}],handler:async({client:t,args:e,reqOpts:n,emit:o,emitDryRunPreview:r})=>{let i=e.productId,a=await t.createEnvironment(i,{name:e.name,branch:e.branch},n);r(a)||o({productId:i,environment:a},`Environment ${e.name} created`)}},mcp:{tool:"fs_env_create",title:"Create preview environment",description:"Create a preview environment bound to a git branch. Equivalent to pushing the branch \u2014 both reconcile to the same environment (operationClass=dual). Provide a name and the git branch it tracks.",annotations:{readOnlyHint:!1,destructiveHint:!1,idempotentHint:!1,openWorldHint:!1},inputSchema:{productId:s.string().describe("The product id to create the environment in."),name:s.string().describe("Environment name (e.g. 'staging', 'preview-pr-42')."),branch:s.string().describe("The git branch this environment tracks."),...We},handler:async(t,e)=>{let n=await t.createEnvironment(e.productId,{name:e.name,branch:e.branch},{idempotencyKey:e.idempotencyKey});return{ok:!0,productId:e.productId,environment:n}}}},{opKey:"environment.delete",operationClass:"dual",scope:["products:update"],sideEffect:"write",cli:{group:"env",command:"delete",summary:"Delete an environment by name. Requires --yes.",destructive:!0,yesMessage:"Pass --yes to confirm environment deletion.",args:[{field:"productId",kind:"positional",token:"<productIdOrName>",resolveProduct:!0},{field:"envName",kind:"positional",token:"<envName>"}],handler:async({client:t,args:e,emit:n})=>{let o=e.productId,r=e.envName;await t.deleteEnvironment(o,r),n({productId:o,deleted:r},`Environment ${r} deleted`)}},mcp:null}];var oy=["gateway_verification","metering","health","tunnel"],dL="<productId>",rs="products:update",ns="The product id.",pn={field:"productId",kind:"positional",token:dL};function JE(t){if(!t||typeof t!="object")return[];let e=t;return Array.isArray(e.data)?e.data:Array.isArray(e.backends)?e.backends:Array.isArray(e.tokens)?e.tokens:Array.isArray(t)?t:[]}function pL(t){let e=t.status;if(typeof e=="string"&&e.length>0)return e;let n=typeof t.readinessState=="string"?t.readinessState:null,o=typeof t.provisionStatus=="string"?t.provisionStatus:null;return n??o??"unknown"}function mL(t){return{id:t.id,name:t.name,slug:t.slug,transport:t.transportMode,default:t.isDefault??!1,status:pL(t),originUrl:t.originUrl??null,lastSeenAt:t.lastSeenAt??null}}async function WE(t,e,n){if(!n)return null;try{return await xd(t,e,n)}catch(o){throw new te(o instanceof Error?o.message:`Environment "${n}" not found on product ${e}.`,void 0,{code:"ENV_NOT_FOUND"})}}var iy=t=>typeof t=="string"&&t.length>0?t.split(",").map(e=>e.trim()).filter(e=>e.length>0):void 0,YE=[{opKey:"backend.read",operationClass:"operate",scope:["products:read"],sideEffect:"read",cli:{group:"backend",command:"list",summary:"List backends for a product (id, name, transport, status)",args:[pn],handler:async({client:t,args:e,emit:n})=>{let r=JE(await t.builderListBackends(e.productId)).map(mL);n({count:r.length,backends:r},`${r.length} backend(s)`)}},mcp:{tool:"fs_backend_list",title:"List backends",description:"List a product's backends (origins) \u2014 id, name, slug, transport (direct|tunnel), default flag, and derived status. Read-only.",annotations:{readOnlyHint:!0,openWorldHint:!1},inputSchema:{productId:s.string().describe("The product id whose backends to list.")},handler:async(t,{productId:e})=>t.builderListBackends(e)}},{opKey:"backend.create",operationClass:"operate",scope:[rs],sideEffect:"write",cli:{group:"backend",command:"create",summary:"Create a backend (default transport: direct)",idempotent:!0,args:[pn,{field:"name",kind:"flag",token:"--name <name>",describe:"Human-friendly backend name",required:!0},{field:"slug",kind:"flag",token:"--slug <slug>",describe:"Stable slug (defaults to a slugified name)"},{field:"env",kind:"flag",token:"--env <environment>",describe:"Scope backend to an environment name or id"},{field:"transport",kind:"flag",token:"--transport <mode>",describe:"Transport mode: direct | tunnel",defaultValue:"direct"},{field:"runner",kind:"flag",token:"--runner <runner>",describe:"embedded | sidecar"},{field:"runtime",kind:"flag",token:"--runtime <runtime>",describe:"Container/runtime descriptor"},{field:"originUrl",kind:"flag",token:"--origin-url <url>",describe:"Builder origin URL (direct)"},{field:"default",kind:"flag",token:"--default",describe:"Mark this backend the product default"}],handler:async({client:t,args:e,reqOpts:n,emit:o,emitDryRunPreview:r})=>{let i=e.productId,a=await WE(t,i,e.env),c=e.transport==="tunnel"?"tunnel":"direct",u=await t.builderCreateBackend(i,{name:e.name,slug:e.slug,environmentId:a,transportMode:c,runner:e.runner==="embedded"||e.runner==="sidecar"?e.runner:null,runtime:e.runtime??null,originUrl:e.originUrl??null,isDefault:e.default},n);r(u)||o({result:u},"Backend created")}},mcp:{tool:"fs_backend_create",title:"Create a backend",description:"Create a backend (origin) for a product. Pick a transport mode: direct (public HTTPS URL, secured by Ed25519 request signing) or tunnel (private outbound-only cloudflared, secure bring-your-own-backend). Mark it default to route traffic to it.",annotations:{readOnlyHint:!1,destructiveHint:!1,idempotentHint:!1,openWorldHint:!1},inputSchema:{productId:s.string().describe("The product id to create the backend in."),name:s.string().describe("Backend name (e.g. 'prod-origin')."),slug:s.string().optional().describe("URL-safe slug; derived from name if omitted."),transportMode:s.enum(["direct","tunnel"]).optional().describe("How the gateway reaches the origin; defaults to direct."),originUrl:s.string().optional().describe("The origin URL (for direct mode)."),isDefault:s.boolean().optional().describe("Route traffic to this backend by default."),...We},handler:async(t,e)=>t.builderCreateBackend(e.productId,{name:e.name,slug:e.slug,transportMode:e.transportMode,originUrl:e.originUrl,isDefault:e.isDefault},{idempotencyKey:e.idempotencyKey})}},{opKey:"backend.delete",operationClass:"operate",scope:[rs],sideEffect:"write",cli:{group:"backend",command:"delete",summary:"Delete a backend (revokes its runtime tokens). Requires --yes.",destructive:!0,yesMessage:"Pass --yes to confirm backend deletion.",args:[pn,{field:"backendId",kind:"positional",token:"<backendId>"}],handler:async({client:t,args:e,emit:n})=>{let o=e.productId,r=e.backendId;await t.builderDeleteBackend(o,r),n({productId:o,deleted:r},`Backend ${r} deleted`)}},mcp:{tool:"fs_backend_delete",title:"Delete a backend",description:"Delete a backend (origin). Traffic routed to it stops; re-create to restore.",annotations:{readOnlyHint:!1,destructiveHint:!0,idempotentHint:!0,openWorldHint:!1},inputSchema:{productId:s.string().describe(ns),backendId:s.string().describe("The backend id to delete.")},handler:async(t,{productId:e,backendId:n})=>t.builderDeleteBackend(e,n)}},{opKey:"runtime_token.read",operationClass:"operate",scope:["products:read"],sideEffect:"read",cli:{group:"backend tokens",command:"list",summary:"List runtime tokens for a product",args:[pn],handler:async({client:t,args:e,emit:n})=>{let o=JE(await t.builderListRuntimeTokens(e.productId));n({count:o.length,tokens:o},`${o.length} runtime token(s)`)}},mcp:{tool:"fs_runtime_token_list",title:"List runtime tokens",description:"List a product's runtime tokens (fsrt_) \u2014 id, last-four, capabilities, status. Read-only; secrets are never shown.",annotations:{readOnlyHint:!0,openWorldHint:!1},inputSchema:{productId:s.string().describe(ns)},handler:async(t,{productId:e})=>t.builderListRuntimeTokens(e)}},{opKey:"runtime_token.mint",operationClass:"operate",scope:[rs],sideEffect:"write",cli:{group:"backend tokens",command:"create",summary:"Create a runtime token (returns FS_RUNTIME_TOKEN once)",idempotent:!0,args:[pn,{field:"env",kind:"flag",token:"--env <environment>",describe:"Scope token to an environment name or id"},{field:"backend",kind:"flag",token:"--backend <backendId>",describe:"Bind token to a specific backend"},{field:"kind",kind:"flag",token:"--kind <kind>",describe:"live | test (defaults from env scope)"},{field:"capabilities",kind:"flag",token:"--capabilities <list>",describe:`Comma-separated capabilities: ${oy.join(" | ")}. Default: core's DEFAULT_CAPABILITIES. Use tunnel for tunnel backends.`},{field:"meters",kind:"flag",token:"--meters <list>",describe:"Comma-separated allowed meters (default: all product meters)"},{field:"routes",kind:"flag",token:"--routes <list>",describe:"Comma-separated allowed routes"}],handler:async({client:t,args:e,reqOpts:n,emit:o,emitDryRunPreview:r})=>{let i=e.productId,a=await WE(t,i,e.env),c=e.kind==="test"||e.kind==="live"?e.kind:void 0,u=iy(e.capabilities);if(u){for(let d of u)if(!oy.includes(d))throw new te(`Unknown capability "${d}". Available: ${oy.join(", ")}.`,void 0,{code:"UNKNOWN_RUNTIME_TOKEN_CAPABILITY"})}let l=await t.builderCreateRuntimeToken(i,{environmentId:a,backendId:e.backend??null,kind:c,capabilities:u,allowedMeters:iy(e.meters),allowedRoutes:iy(e.routes)},n);r(l)||o({envVar:"FS_RUNTIME_TOKEN",result:l},"Runtime token created")}},mcp:{tool:"fs_runtime_token_mint",title:"Mint a runtime token",description:"Mint a new runtime token (fsrt_) for a backend. Returns the plaintext token ONCE \u2014 store it now (e.g. as FS_RUNTIME_TOKEN). Capabilities default to the backend's needs (gateway_verification, metering, health).",returnsOneTimeSecret:!0,annotations:{readOnlyHint:!1,destructiveHint:!1,idempotentHint:!1,openWorldHint:!1},inputSchema:{productId:s.string().describe(ns),backendId:s.string().optional().describe("Bind the token to this backend."),environmentId:s.string().optional().describe("Scope to a preview environment (omit for production)."),kind:s.enum(["live","test"]).optional().describe("Token kind; defaults from the env scope."),capabilities:s.array(s.string()).optional().describe("Capabilities (gateway_verification, metering, health, tunnel)."),...We},handler:async(t,e)=>t.builderCreateRuntimeToken(e.productId,{backendId:e.backendId??null,environmentId:e.environmentId??null,kind:e.kind,capabilities:e.capabilities},{idempotencyKey:e.idempotencyKey})}},{opKey:"runtime_token.rotate",operationClass:"operate",scope:[rs],sideEffect:"write",cli:{group:"backend tokens",command:"rotate",summary:"Rotate a runtime token (returns a fresh FS_RUNTIME_TOKEN once)",args:[pn,{field:"tokenId",kind:"positional",token:"<tokenId>"}],handler:async({client:t,args:e,emit:n})=>{let o=e.productId,r=e.tokenId,i=await t.builderRotateRuntimeToken(o,r);n({envVar:"FS_RUNTIME_TOKEN",result:i},`Runtime token ${r} rotated`)}},mcp:{tool:"fs_runtime_token_rotate",title:"Rotate a runtime token",description:"Rotate a runtime token: mint a fresh secret carrying the same scope and revoke the old one. Returns the new plaintext token ONCE.",returnsOneTimeSecret:!0,annotations:{readOnlyHint:!1,destructiveHint:!1,idempotentHint:!1,openWorldHint:!1},inputSchema:{productId:s.string().describe(ns),tokenId:s.string().describe("The runtime token id to rotate."),...We},handler:async(t,e)=>t.builderRotateRuntimeToken(e.productId,e.tokenId,{idempotencyKey:e.idempotencyKey})}},{opKey:"runtime_token.revoke",operationClass:"operate",scope:[rs],sideEffect:"write",cli:{group:"backend tokens",command:"revoke",summary:"Revoke a runtime token. Requires --yes.",destructive:!0,yesMessage:"Pass --yes to confirm runtime token revocation.",args:[pn,{field:"tokenId",kind:"positional",token:"<tokenId>"}],handler:async({client:t,args:e,emit:n})=>{let o=e.productId,r=e.tokenId;await t.builderRevokeRuntimeToken(o,r),n({productId:o,revoked:r},`Runtime token ${r} revoked`)}},mcp:{tool:"fs_runtime_token_revoke",title:"Revoke a runtime token",description:"Revoke a runtime token. The backend using it stops verifying.",annotations:{readOnlyHint:!1,destructiveHint:!0,idempotentHint:!0,openWorldHint:!1},inputSchema:{productId:s.string().describe(ns),tokenId:s.string().describe("The runtime token id to revoke.")},handler:async(t,{productId:e,tokenId:n})=>t.builderRevokeRuntimeToken(e,n)}}];var mn="The business id or slug.",Bo="Scope to a preview environment (omit for production).",Ho={field:"productId",kind:"positional",token:"<businessIdOrSlug>",describe:mn,resolveProduct:!0},Ko={field:"env",kind:"flag",token:"--env <environmentId>",describe:"Scope to a preview environment id (omit for production)."},fL={field:"target",kind:"flag",token:"--target <target>",describe:"BUILD, RUNTIME, or BOTH (default)."};async function Go(t,e){return Vo(t,e)}var XE=[{opKey:"frontend.deploy",operationClass:"operate",scope:["products:update"],sideEffect:"write",cli:{group:"frontend",command:"deploy",summary:"Trigger a frontend build (deploy) for a product's connected repo",idempotent:!0,args:[Ho,Ko,{field:"ref",kind:"flag",token:"--ref <ref>",describe:"Git ref to build (defaults to the env branch / repo default)."},{field:"buildCmd",kind:"flag",token:"--build-cmd <cmd>",describe:"Override the build command."}],handler:async({client:t,args:e,reqOpts:n,emit:o,emitDryRunPreview:r})=>{let i=await t.builderFrontendDeploy(e.productId,{ref:e.ref,buildCmd:e.buildCmd,environmentId:e.env},n);r(i)||o({result:i},"Frontend build triggered")}},mcp:{tool:"fs_frontend_deploy",title:"Deploy a product frontend",description:"Trigger a Managed Frontend Hosting build for the product's connected repo (production by default; pass environmentId for a preview env). Returns the enqueued build.",annotations:{readOnlyHint:!1,destructiveHint:!1,idempotentHint:!0,openWorldHint:!1},inputSchema:{productId:s.string().describe(mn),ref:s.string().optional().describe("Git ref to build (defaults to the env branch / repo default)."),buildCmd:s.string().optional().describe("Override the build command."),environmentId:s.string().optional().describe(Bo),...We},handler:async(t,e)=>{let n=await Go(t,e.productId);return t.builderFrontendDeploy(n,{ref:e.ref,buildCmd:e.buildCmd,environmentId:e.environmentId},{idempotencyKey:e.idempotencyKey})}}},{opKey:"frontend.status",operationClass:"operate",scope:["products:read"],sideEffect:"read",cli:{group:"frontend",command:"status",summary:"Show the product's current frontend release + recent release history",args:[Ho,Ko],handler:async({client:t,args:e,emit:n})=>{let o=await t.builderFrontendStatus(e.productId,e.env);n(o,"Frontend status")}},mcp:{tool:"fs_frontend_status",title:"Get frontend status",description:"Read a product's current frontend serve state (uiMode, active release hash + producing build, pin flag) plus the recent SUCCEEDED releases (rollback targets). Read-only.",annotations:{readOnlyHint:!0,openWorldHint:!1},inputSchema:{productId:s.string().describe(mn),environmentId:s.string().optional().describe(Bo)},handler:async(t,e)=>{let n=await Go(t,e.productId);return t.builderFrontendStatus(n,e.environmentId)}}},{opKey:"frontend.rollback",operationClass:"operate",scope:["products:update"],sideEffect:"write",cli:{group:"frontend",command:"rollback",summary:"Roll the product frontend back to a prior release (re-activate its releaseId)",idempotent:!0,args:[Ho,{field:"releaseId",kind:"flag",token:"--release-id <releaseId>",describe:"The prior release id (manifest hash) to re-activate \u2014 see `frontend status`.",required:!0},Ko],handler:async({client:t,args:e,reqOpts:n,emit:o,emitDryRunPreview:r})=>{let i=await t.builderFrontendRollback(e.productId,{releaseId:e.releaseId,environmentId:e.env},n);r(i)||o({result:i},"Frontend rolled back")}},mcp:{tool:"fs_frontend_rollback",title:"Roll back a product frontend",description:"Roll a product's frontend back to a prior release by its releaseId (manifest hash, from fs_frontend_status). Flips the live pointer back and pins it. The releaseId must belong to this target's build history.",annotations:{readOnlyHint:!1,destructiveHint:!1,idempotentHint:!0,openWorldHint:!1},inputSchema:{productId:s.string().describe(mn),releaseId:s.string().describe("The prior release id (manifest hash) to re-activate."),environmentId:s.string().optional().describe(Bo),...We},handler:async(t,e)=>{let n=await Go(t,e.productId);return t.builderFrontendRollback(n,{releaseId:e.releaseId,environmentId:e.environmentId},{idempotencyKey:e.idempotencyKey})}}},{opKey:"frontend.env.read",operationClass:"operate",scope:["products:read"],sideEffect:"read",cli:{group:"frontend env",command:"list",summary:"List public frontend build/runtime variables",args:[Ho,Ko],handler:async({client:t,args:e,emit:n})=>{let o=await t.builderFrontendVariables(e.productId,e.env);n(o,"Frontend variables")}},mcp:{tool:"fs_frontend_env_list",title:"List frontend variables",description:"List public browser-visible frontend build/runtime variables for a product. Includes effective build/runtime maps after production inheritance and environment overrides.",annotations:{readOnlyHint:!0,openWorldHint:!1},inputSchema:{productId:s.string().describe(mn),environmentId:s.string().optional().describe(Bo)},handler:async(t,e)=>{let n=await Go(t,e.productId);return t.builderFrontendVariables(n,e.environmentId)}}},{opKey:"frontend.env.set",operationClass:"operate",scope:["products:update"],sideEffect:"write",cli:{group:"frontend env",command:"set",summary:"Set a public frontend build/runtime variable",idempotent:!0,args:[Ho,{field:"name",kind:"positional",token:"<name>"},{field:"value",kind:"positional",token:"<value>"},Ko,fL],handler:async({client:t,args:e,reqOpts:n,emit:o,emitDryRunPreview:r})=>{let i=await t.builderSetFrontendVariable(e.productId,{name:e.name,value:e.value,target:e.target??"BOTH",environmentId:e.env},n);r(i)||o({result:i},"Frontend variable saved")}},mcp:{tool:"fs_frontend_env_set",title:"Set a frontend variable",description:"Create or update a public browser-visible frontend variable. target is BUILD, RUNTIME, or BOTH.",annotations:{readOnlyHint:!1,destructiveHint:!1,idempotentHint:!0,openWorldHint:!1},inputSchema:{productId:s.string().describe(mn),name:s.string().describe("Frontend variable name."),value:s.string().describe("Frontend variable value."),target:s.enum(["BUILD","RUNTIME","BOTH"]).optional().describe("Where the variable is exposed. Default: BOTH."),environmentId:s.string().optional().describe(Bo),...We},handler:async(t,e)=>{let n=await Go(t,e.productId);return t.builderSetFrontendVariable(n,{name:e.name,value:e.value,target:e.target??"BOTH",environmentId:e.environmentId},{idempotencyKey:e.idempotencyKey})}}},{opKey:"frontend.env.delete",operationClass:"operate",scope:["products:update"],sideEffect:"write",cli:{group:"frontend env",command:"delete",summary:"Delete a public frontend variable",idempotent:!0,args:[Ho,{field:"name",kind:"positional",token:"<name>"},Ko],handler:async({client:t,args:e,reqOpts:n,emit:o,emitDryRunPreview:r})=>{let i=await t.builderDeleteFrontendVariable(e.productId,e.name,e.env,n);r(i)||o({result:i},"Frontend variable deleted")}},mcp:{tool:"fs_frontend_env_delete",title:"Delete a frontend variable",description:"Delete a public browser-visible frontend variable.",annotations:{readOnlyHint:!1,destructiveHint:!0,idempotentHint:!0,openWorldHint:!1},inputSchema:{productId:s.string().describe(mn),name:s.string().describe("Frontend variable name."),environmentId:s.string().optional().describe(Bo),...We},handler:async(t,e)=>{let n=await Go(t,e.productId);return t.builderDeleteFrontendVariable(n,e.name,e.environmentId,{idempotencyKey:e.idempotencyKey})}}}];var QE=[{opKey:"usage.read",operationClass:"operate",scope:["products:read"],sideEffect:"read",cli:{group:"usage",command:"summary",summary:"Show usage summary for the last 30 days",args:[{field:"productId",kind:"positional",token:"<productIdOrName>",resolveProduct:!0}],handler:async({client:t,args:e,emit:n})=>{let o=e.productId,r=await t.managementGetUsage(o);n({productId:o,summary:r},"Usage summary")}},mcp:{tool:"fs_usage_read",title:"Read usage summary",description:"Read a product's usage summary \u2014 metered request counts and tier utilization. Read-only.",annotations:{readOnlyHint:!0,openWorldHint:!1},inputSchema:{productId:s.string().describe("The product id whose usage to read.")},handler:async(t,{productId:e})=>t.managementGetUsage(e)}}];var eT=[{opKey:"persona.bootstrap",operationClass:"operate",scope:["products:read"],sideEffect:"write",cli:{group:"persona",command:"bootstrap",summary:"Issue a fresh fsk_test_ API key in a test environment",args:[{field:"productId",kind:"positional",token:"<productIdOrName>",resolveProduct:!0},{field:"env",kind:"flag",token:"--env <env>",describe:"Environment name (must be test-strategy)",required:!0},{field:"plan",kind:"flag",token:"--plan <planKey>",describe:"Plan key to assign (e.g. starter)"},{field:"displayName",kind:"flag",token:"--display-name <name>",describe:"Persona display name"}],handler:async({client:t,args:e,emit:n})=>{let o=e.productId,r=await ay(t,o,e.env),i=await t.issuePersonaBootstrapKey(o,r,{planKey:e.plan,displayName:e.displayName});n({productId:o,environmentId:r,result:i},"Persona bootstrapped")}},mcp:{tool:"fs_persona_bootstrap",title:"Bootstrap a test persona",description:"Issue a one-time test bootstrap key for a product environment \u2014 use it to provision a test persona. Returns the key ONCE; store it now.",returnsOneTimeSecret:!0,annotations:{readOnlyHint:!1,destructiveHint:!1,idempotentHint:!1,openWorldHint:!1},inputSchema:{productId:s.string().describe("The product id."),environmentId:s.string().describe("The environment id to scope the persona to.")},handler:async(t,{productId:e,environmentId:n})=>t.issuePersonaBootstrapKey(e,n)}},{opKey:"persona.read",operationClass:"operate",scope:["products:read"],sideEffect:"read",cli:{group:"persona",command:"list",summary:"List personas for a test environment",args:[{field:"productId",kind:"positional",token:"<productIdOrName>",resolveProduct:!0},{field:"env",kind:"flag",token:"--env <env>",describe:"Environment name",required:!0}],handler:async({client:t,args:e,emit:n})=>{let o=e.productId,r=await ay(t,o,e.env),i=await t.listPersonas(o,r);n({productId:o,environmentId:r,result:i},"Personas")}},mcp:{tool:"fs_persona_list",title:"List personas",description:"List a product environment's test personas (id, label, status). Read-only.",annotations:{readOnlyHint:!0,openWorldHint:!1},inputSchema:{productId:s.string().describe("The product id."),environmentId:s.string().describe("The environment id whose personas to list.")},handler:async(t,{productId:e,environmentId:n})=>t.listPersonas(e,n)}},{opKey:"persona.revoke",operationClass:"operate",scope:["products:update"],sideEffect:"write",cli:{group:"persona",command:"revoke",summary:"Revoke a persona's API key",args:[{field:"productId",kind:"positional",token:"<productIdOrName>",resolveProduct:!0},{field:"personaId",kind:"positional",token:"<personaId>"},{field:"env",kind:"flag",token:"--env <env>",describe:"Environment name",required:!0}],handler:async({client:t,args:e,emit:n})=>{let o=e.productId,r=e.personaId,i=await ay(t,o,e.env),a=await t.revokePersona(o,i,r);n({productId:o,environmentId:i,result:a},`Persona ${r} revoked`)}},mcp:{tool:"fs_persona_revoke",title:"Revoke a persona",description:"Revoke a test persona. Its credentials stop working.",annotations:{readOnlyHint:!1,destructiveHint:!0,idempotentHint:!0,openWorldHint:!1},inputSchema:{productId:s.string().describe("The product id."),environmentId:s.string().describe("The environment id."),personaId:s.string().describe("The persona id to revoke.")},handler:async(t,{productId:e,environmentId:n,personaId:o})=>t.revokePersona(e,n,o)}}];async function ay(t,e,n){try{return await xd(t,e,n)}catch(o){throw new te(o instanceof Error?o.message:`Environment "${n}" not found on product ${e}.`,void 0,{code:"ENV_NOT_FOUND"})}}function hL(t){if(!t||typeof t!="object")return[];let e=t;return Array.isArray(e.data)?e.data:Array.isArray(e.tokens)?e.tokens:Array.isArray(t)?t:[]}var tT=[{opKey:"maker_token.read",operationClass:"operate",scope:[],sideEffect:"read",cli:{group:"token",command:"list",summary:"List maker tokens in the current org",args:[],handler:async({client:t,emit:e})=>{let n=hL(await t.managementListMakerTokens());e({count:n.length,tokens:n.map(o=>({id:o.id,name:o.name??null,scopes:o.scopes??[],productId:o.productId??null,lastFour:o.lastFour??null,createdAt:o.createdAt??null,revokedAt:o.revokedAt??null}))},`${n.length} token(s)`)}},mcp:{tool:"fs_maker_token_list",title:"List maker tokens",description:"List the workspace's maker tokens (mk_) \u2014 id, label, scopes, last-four, status. Read-only; secrets are never shown. Creating/revoking maker tokens is intentionally not exposed via MCP.",annotations:{readOnlyHint:!0,openWorldHint:!1},inputSchema:{},handler:async t=>t.managementListMakerTokens()}},{opKey:"maker_token.create",operationClass:"operate",scope:["products:update"],sideEffect:"write",cli:{group:"token",command:"create",summary:"Create a new maker token (returns the secret once)",args:[{field:"name",kind:"flag",token:"--name <name>",describe:"Human-friendly token name",required:!0},{field:"scope",kind:"flag",token:"--scope <scope...>",describe:"Scope(s) to attach (e.g. products:update products:publish)"},{field:"product",kind:"flag",token:"--product <productId>",describe:"Scope to a specific product"}],handler:async({client:t,args:e,emit:n})=>{let o=await t.managementCreateMakerToken({name:e.name,scopes:e.scope,productId:e.product});n({result:o},"Token created")}},mcp:null},{opKey:"maker_token.revoke",operationClass:"operate",scope:["products:update"],sideEffect:"write",cli:{group:"token",command:"revoke",summary:"Revoke a maker token. Requires --yes.",destructive:!0,yesMessage:"Pass --yes to confirm token revocation.",args:[{field:"tokenId",kind:"positional",token:"<tokenId>"}],handler:async({client:t,args:e,emit:n})=>{let o=e.tokenId;await t.managementRevokeMakerToken(o),n({revoked:o},`Token ${o} revoked`)}},mcp:null}];var rT=[{opKey:"change_set.list",operationClass:"operate",scope:["products:read"],sideEffect:"read",cli:{group:"change-set",command:"list",summary:"List repo-backed change sets for a business: PRs, pushes, releases, checks, semantic diffs, and apply state.",args:[{field:"productId",kind:"positional",token:"<businessIdOrName>",resolveProduct:!0},{field:"env",kind:"flag",token:"--env <env>",describe:"Environment scope: production, all, or a preview environment name."}],handler:async({client:t,args:e,emit:n})=>{let o=e.productId,r=await t.listChangeSets(o,{env:e.env});n({productId:o,count:r.data.length,changeSets:r.data},`${r.data.length} change set(s)`)}},mcp:null},{opKey:"change_set.read",operationClass:"operate",scope:["products:read"],sideEffect:"read",cli:{group:"change-set",command:"inspect",summary:"Inspect one repo-backed change set by id, PR number, branch, or commit SHA.",args:[{field:"productId",kind:"positional",token:"<businessIdOrName>",resolveProduct:!0},{field:"selector",kind:"positional",token:"<id|pr|branch|sha>"},{field:"env",kind:"flag",token:"--env <env>",describe:"Environment scope: production, all, or a preview environment name."}],handler:async({client:t,args:e,emit:n})=>{let o=e.productId,r=String(e.selector),i=await t.listChangeSets(o,{env:e.env}),a=i.data.find(c=>c.id===r)??i.data.find(c=>c.prNumber!==null&&String(c.prNumber)===r)??i.data.find(c=>c.branch===r)??i.data.find(c=>c.commitSha.startsWith(r));if(!a)throw new te(`Change set ${r} was not found.`,404,{code:"CHANGE_SET_NOT_FOUND"});n({productId:o,changeSet:a},`Change set ${a.id}: ${a.status}`)}},mcp:null}];var nT=[...HE,...rT,...KE,...GE,...YE,...XE,...QE,...eT,...tT];function oT(t){if(!t.mcp)throw new Error(`toMcpTool called on CLI-only operation "${t.opKey}" (mcp === null).`);let e={name:t.mcp.tool,title:t.mcp.title,description:t.mcp.description,operationClass:t.operationClass,scope:t.scope,sideEffect:t.sideEffect,annotations:t.mcp.annotations,inputSchema:t.mcp.inputSchema,handler:t.mcp.handler};return t.mcp.returnsOneTimeSecret&&(e.returnsOneTimeSecret=!0),e}var sy=nT.filter(t=>t.mcp).map(oT);function iT(){let t=_E(),e=vE(void 0),n=process.env.FARTHERSHORE_API_URL??t.apiUrl;return xE({apiUrl:n,token:e})}function gL(t){if(t&&typeof t=="object"){let e=t,n=typeof e.code=="string"?` [${e.code}]`:"",o=typeof e.status=="number"?` (HTTP ${e.status})`:"";if(typeof e.message=="string")return`${e.message}${n}${o}`}return String(t)}function _L(t,e,n){let o=async c=>{try{let u=await e.handler(n,c??{}),l=e.returnsOneTimeSecret?u:bd(u),d=UE(e.name,l);return{content:[{type:"text",text:JSON.stringify(d,null,2)}]}}catch(u){let l=u instanceof te?u:new te(gL(u),0),d=LE(e.name,l);return{content:[{type:"text",text:JSON.stringify(d,null,2)}],isError:!0}}},r=Object.keys(e.inputSchema).length>0,i={title:e.title,description:e.description,annotations:{title:e.title,...e.annotations},...r?{inputSchema:e.inputSchema}:{}},a=r?c=>o(c):()=>o({});t.registerTool(e.name,i,a)}function yL(t){for(let e of t){let n=dE(e.operationClass,e.sideEffect);if(n)throw new Error(`[mcp] tool "${e.name}" is misclassified: ${n}`)}}function aT(t){yL(sy);let e=new sd({name:"farthershore-agent-business-builder",version:"0.2.0"});for(let n of sy)_L(e,n,t);return e}function cy(){return aT(iT())}async function vL(){let t=cy(),e=new dl;await t.connect(e)}import.meta.url===`file://${process.argv[1]}`&&vL();export{sy as ALL_TOOLS,aT as buildServer,cy as createMcpServer,iT as mcpClient};
|
|
96
|
+
`,handler:async({client:t,args:e,reqOpts:n,emit:o,emitDryRunPreview:r})=>{let i=e.productId,a=e.planKey,c=e.policy;if(!$d.includes(c))throw new te(`Invalid --policy "${c}". Supported: ${$d.join(", ")}.`,void 0,{code:"INVALID_MIGRATION_POLICY"});let u=await t.migratePlan(i,a,{fromVersion:e.from,toVersion:e.to,policy:c,proration:e.proration,completeBy:e.completeBy},n);r(u)||o({productId:i,planKey:a,migration:u},`Migration scheduled for plan ${a}`)}},mcp:{tool:"fs_plan_migrate",title:"Migrate subscribers between plan versions",description:"Schedule a subscriber migration for a plan: move subscribers from one plan version to another under a policy. Pass the plan KEY plus fromVersion/toVersion (each an integer or 'head'/'latest') \u2014 the server resolves them to the right plan versions. Policies: grandfather (keep existing subs as-is), next_renewal (migrate at each sub's renewal), immediate (migrate now), by_date (migrate everyone by a deadline), opt_in (subs choose). This is an OPERATE action (it changes live subscriber state, not the product's code-managed definition).",annotations:{readOnlyHint:!1,destructiveHint:!1,idempotentHint:!0,openWorldHint:!1},inputSchema:{productId:s.string().describe("The product id whose subscribers to migrate."),planKey:s.string().describe("The stable plan key (e.g. 'pro') to migrate within."),fromVersion:s.union([s.string(),s.number().int().positive()]).describe("Source plan version: an integer or 'head'/'latest'."),toVersion:s.union([s.string(),s.number().int().positive()]).describe("Target plan version: an integer or 'head'/'latest'."),policy:s.enum($d).describe("Migration policy: grandfather | next_renewal | immediate | by_date | opt_in."),proration:s.enum(["none","prorate","credit"]).optional().describe("Optional proration behaviour."),completeBy:s.string().optional().describe("ISO 8601 deadline \u2014 required by the by_date policy."),...We},handler:async(t,e)=>t.migratePlan(e.productId,e.planKey,{fromVersion:e.fromVersion,toVersion:e.toVersion,policy:e.policy,proration:e.proration,completeBy:e.completeBy},{idempotencyKey:e.idempotencyKey})}}],KE=uL;function lL(t){if(!t||typeof t!="object")return[];let e=t;return Array.isArray(e.data)?e.data:Array.isArray(e.environments)?e.environments:[]}var GE=[{opKey:"environment.read",operationClass:"dual",scope:["products:read"],sideEffect:"read",cli:{group:"env",command:"list",summary:"List environments for a product",args:[{field:"productId",kind:"positional",token:"<productIdOrName>",resolveProduct:!0}],handler:async({client:t,args:e,emit:n})=>{let o=e.productId,r=lL(await t.listEnvironments(o));n({productId:o,count:r.length,environments:r.map(i=>({id:i.id,name:i.name,branch:i.branch??null,portalHostname:i.portalHostname??null,runtimeHostname:i.runtimeHostname??null,status:i.status??null}))},`${r.length} environment(s)`)}},mcp:{tool:"fs_env_list",title:"List environments",description:"List a product's preview environments (name, branch, hostnames). Read-only.",annotations:{readOnlyHint:!0,openWorldHint:!1},inputSchema:{productId:s.string().describe("The product id whose environments to list.")},handler:async(t,{productId:e})=>t.listEnvironments(e)}},{opKey:"environment.create",operationClass:"dual",scope:["products:update"],sideEffect:"write",cli:{group:"env",command:"create",summary:"Create a preview environment bound to a git branch",idempotent:!0,args:[{field:"productId",kind:"positional",token:"<productIdOrName>",resolveProduct:!0},{field:"name",kind:"flag",token:"--name <name>",describe:"Environment name (e.g. preview, staging)",required:!0},{field:"branch",kind:"flag",token:"--branch <branch>",describe:"Git branch to track (e.g. env/preview)",required:!0}],handler:async({client:t,args:e,reqOpts:n,emit:o,emitDryRunPreview:r})=>{let i=e.productId,a=await t.createEnvironment(i,{name:e.name,branch:e.branch},n);r(a)||o({productId:i,environment:a},`Environment ${e.name} created`)}},mcp:{tool:"fs_env_create",title:"Create preview environment",description:"Create a preview environment bound to a git branch. Equivalent to pushing the branch \u2014 both reconcile to the same environment (operationClass=dual). Provide a name and the git branch it tracks.",annotations:{readOnlyHint:!1,destructiveHint:!1,idempotentHint:!1,openWorldHint:!1},inputSchema:{productId:s.string().describe("The product id to create the environment in."),name:s.string().describe("Environment name (e.g. 'staging', 'preview-pr-42')."),branch:s.string().describe("The git branch this environment tracks."),...We},handler:async(t,e)=>{let n=await t.createEnvironment(e.productId,{name:e.name,branch:e.branch},{idempotencyKey:e.idempotencyKey});return{ok:!0,productId:e.productId,environment:n}}}},{opKey:"environment.delete",operationClass:"dual",scope:["products:update"],sideEffect:"write",cli:{group:"env",command:"delete",summary:"Delete an environment by name. Requires --yes.",destructive:!0,yesMessage:"Pass --yes to confirm environment deletion.",args:[{field:"productId",kind:"positional",token:"<productIdOrName>",resolveProduct:!0},{field:"envName",kind:"positional",token:"<envName>"}],handler:async({client:t,args:e,emit:n})=>{let o=e.productId,r=e.envName;await t.deleteEnvironment(o,r),n({productId:o,deleted:r},`Environment ${r} deleted`)}},mcp:null}];var oy=["gateway_verification","metering","health","tunnel"],dL="<productId>",rs="products:update",ns="The product id.",pn={field:"productId",kind:"positional",token:dL};function JE(t){if(!t||typeof t!="object")return[];let e=t;return Array.isArray(e.data)?e.data:Array.isArray(e.backends)?e.backends:Array.isArray(e.tokens)?e.tokens:Array.isArray(t)?t:[]}function pL(t){let e=t.status;if(typeof e=="string"&&e.length>0)return e;let n=typeof t.readinessState=="string"?t.readinessState:null,o=typeof t.provisionStatus=="string"?t.provisionStatus:null;return n??o??"unknown"}function mL(t){return{id:t.id,name:t.name,slug:t.slug,transport:t.transportMode,default:t.isDefault??!1,status:pL(t),originUrl:t.originUrl??null,lastSeenAt:t.lastSeenAt??null}}async function WE(t,e,n){if(!n)return null;try{return await xd(t,e,n)}catch(o){throw new te(o instanceof Error?o.message:`Environment "${n}" not found on product ${e}.`,void 0,{code:"ENV_NOT_FOUND"})}}var iy=t=>typeof t=="string"&&t.length>0?t.split(",").map(e=>e.trim()).filter(e=>e.length>0):void 0,YE=[{opKey:"backend.read",operationClass:"operate",scope:["products:read"],sideEffect:"read",cli:{group:"backend",command:"list",summary:"List backends for a product (id, name, transport, status)",args:[pn],handler:async({client:t,args:e,emit:n})=>{let r=JE(await t.builderListBackends(e.productId)).map(mL);n({count:r.length,backends:r},`${r.length} backend(s)`)}},mcp:{tool:"fs_backend_list",title:"List backends",description:"List a product's backends (origins) \u2014 id, name, slug, transport (direct|tunnel), default flag, and derived status. Read-only.",annotations:{readOnlyHint:!0,openWorldHint:!1},inputSchema:{productId:s.string().describe("The product id whose backends to list.")},handler:async(t,{productId:e})=>t.builderListBackends(e)}},{opKey:"backend.create",operationClass:"operate",scope:[rs],sideEffect:"write",cli:{group:"backend",command:"create",summary:"Create a backend (default transport: direct)",idempotent:!0,args:[pn,{field:"name",kind:"flag",token:"--name <name>",describe:"Human-friendly backend name",required:!0},{field:"slug",kind:"flag",token:"--slug <slug>",describe:"Stable slug (defaults to a slugified name)"},{field:"env",kind:"flag",token:"--env <environment>",describe:"Scope backend to an environment name or id"},{field:"transport",kind:"flag",token:"--transport <mode>",describe:"Transport mode: direct | tunnel",defaultValue:"direct"},{field:"runner",kind:"flag",token:"--runner <runner>",describe:"embedded | sidecar"},{field:"runtime",kind:"flag",token:"--runtime <runtime>",describe:"Container/runtime descriptor"},{field:"originUrl",kind:"flag",token:"--origin-url <url>",describe:"Builder origin URL (direct)"},{field:"default",kind:"flag",token:"--default",describe:"Mark this backend the product default"}],handler:async({client:t,args:e,reqOpts:n,emit:o,emitDryRunPreview:r})=>{let i=e.productId,a=await WE(t,i,e.env),c=e.transport==="tunnel"?"tunnel":"direct",u=await t.builderCreateBackend(i,{name:e.name,slug:e.slug,environmentId:a,transportMode:c,runner:e.runner==="embedded"||e.runner==="sidecar"?e.runner:null,runtime:e.runtime??null,originUrl:e.originUrl??null,isDefault:e.default},n);r(u)||o({result:u},"Backend created")}},mcp:{tool:"fs_backend_create",title:"Create a backend",description:"Create a backend (origin) for a product. Pick a transport mode: direct (public HTTPS URL, secured by Ed25519 request signing) or tunnel (private outbound-only cloudflared, secure bring-your-own-backend). Mark it default to route traffic to it.",annotations:{readOnlyHint:!1,destructiveHint:!1,idempotentHint:!1,openWorldHint:!1},inputSchema:{productId:s.string().describe("The product id to create the backend in."),name:s.string().describe("Backend name (e.g. 'prod-origin')."),slug:s.string().optional().describe("URL-safe slug; derived from name if omitted."),transportMode:s.enum(["direct","tunnel"]).optional().describe("How the gateway reaches the origin; defaults to direct."),originUrl:s.string().optional().describe("The origin URL (for direct mode)."),isDefault:s.boolean().optional().describe("Route traffic to this backend by default."),...We},handler:async(t,e)=>t.builderCreateBackend(e.productId,{name:e.name,slug:e.slug,transportMode:e.transportMode,originUrl:e.originUrl,isDefault:e.isDefault},{idempotencyKey:e.idempotencyKey})}},{opKey:"backend.delete",operationClass:"operate",scope:[rs],sideEffect:"write",cli:{group:"backend",command:"delete",summary:"Delete a backend (revokes its runtime tokens). Requires --yes.",destructive:!0,yesMessage:"Pass --yes to confirm backend deletion.",args:[pn,{field:"backendId",kind:"positional",token:"<backendId>"}],handler:async({client:t,args:e,emit:n})=>{let o=e.productId,r=e.backendId;await t.builderDeleteBackend(o,r),n({productId:o,deleted:r},`Backend ${r} deleted`)}},mcp:{tool:"fs_backend_delete",title:"Delete a backend",description:"Delete a backend (origin). Traffic routed to it stops; re-create to restore.",annotations:{readOnlyHint:!1,destructiveHint:!0,idempotentHint:!0,openWorldHint:!1},inputSchema:{productId:s.string().describe(ns),backendId:s.string().describe("The backend id to delete.")},handler:async(t,{productId:e,backendId:n})=>t.builderDeleteBackend(e,n)}},{opKey:"runtime_token.read",operationClass:"operate",scope:["products:read"],sideEffect:"read",cli:{group:"backend tokens",command:"list",summary:"List runtime tokens for a product",args:[pn],handler:async({client:t,args:e,emit:n})=>{let o=JE(await t.builderListRuntimeTokens(e.productId));n({count:o.length,tokens:o},`${o.length} runtime token(s)`)}},mcp:{tool:"fs_runtime_token_list",title:"List runtime tokens",description:"List a product's runtime tokens (fsrt_) \u2014 id, last-four, capabilities, status. Read-only; secrets are never shown.",annotations:{readOnlyHint:!0,openWorldHint:!1},inputSchema:{productId:s.string().describe(ns)},handler:async(t,{productId:e})=>t.builderListRuntimeTokens(e)}},{opKey:"runtime_token.mint",operationClass:"operate",scope:[rs],sideEffect:"write",cli:{group:"backend tokens",command:"create",summary:"Create a runtime token (returns FS_RUNTIME_TOKEN once)",idempotent:!0,args:[pn,{field:"env",kind:"flag",token:"--env <environment>",describe:"Scope token to an environment name or id"},{field:"backend",kind:"flag",token:"--backend <backendId>",describe:"Bind token to a specific backend"},{field:"kind",kind:"flag",token:"--kind <kind>",describe:"live | test (defaults from env scope)"},{field:"capabilities",kind:"flag",token:"--capabilities <list>",describe:`Comma-separated capabilities: ${oy.join(" | ")}. Default: core's DEFAULT_CAPABILITIES. Use tunnel for tunnel backends.`},{field:"meters",kind:"flag",token:"--meters <list>",describe:"Comma-separated allowed meters (default: all product meters)"},{field:"routes",kind:"flag",token:"--routes <list>",describe:"Comma-separated allowed routes"}],handler:async({client:t,args:e,reqOpts:n,emit:o,emitDryRunPreview:r})=>{let i=e.productId,a=await WE(t,i,e.env),c=e.kind==="test"||e.kind==="live"?e.kind:void 0,u=iy(e.capabilities);if(u){for(let d of u)if(!oy.includes(d))throw new te(`Unknown capability "${d}". Available: ${oy.join(", ")}.`,void 0,{code:"UNKNOWN_RUNTIME_TOKEN_CAPABILITY"})}let l=await t.builderCreateRuntimeToken(i,{environmentId:a,backendId:e.backend??null,kind:c,capabilities:u,allowedMeters:iy(e.meters),allowedRoutes:iy(e.routes)},n);r(l)||o({envVar:"FS_RUNTIME_TOKEN",result:l},"Runtime token created")}},mcp:{tool:"fs_runtime_token_mint",title:"Mint a runtime token",description:"Mint a new runtime token (fsrt_) for a backend. Returns the plaintext token ONCE \u2014 store it now (e.g. as FS_RUNTIME_TOKEN). Capabilities default to the backend's needs (gateway_verification, metering, health).",returnsOneTimeSecret:!0,annotations:{readOnlyHint:!1,destructiveHint:!1,idempotentHint:!1,openWorldHint:!1},inputSchema:{productId:s.string().describe(ns),backendId:s.string().optional().describe("Bind the token to this backend."),environmentId:s.string().optional().describe("Scope to a preview environment (omit for production)."),kind:s.enum(["live","test"]).optional().describe("Token kind; defaults from the env scope."),capabilities:s.array(s.string()).optional().describe("Capabilities (gateway_verification, metering, health, tunnel)."),...We},handler:async(t,e)=>t.builderCreateRuntimeToken(e.productId,{backendId:e.backendId??null,environmentId:e.environmentId??null,kind:e.kind,capabilities:e.capabilities},{idempotencyKey:e.idempotencyKey})}},{opKey:"runtime_token.rotate",operationClass:"operate",scope:[rs],sideEffect:"write",cli:{group:"backend tokens",command:"rotate",summary:"Rotate a runtime token (returns a fresh FS_RUNTIME_TOKEN once)",args:[pn,{field:"tokenId",kind:"positional",token:"<tokenId>"}],handler:async({client:t,args:e,emit:n})=>{let o=e.productId,r=e.tokenId,i=await t.builderRotateRuntimeToken(o,r);n({envVar:"FS_RUNTIME_TOKEN",result:i},`Runtime token ${r} rotated`)}},mcp:{tool:"fs_runtime_token_rotate",title:"Rotate a runtime token",description:"Rotate a runtime token: mint a fresh secret carrying the same scope and revoke the old one. Returns the new plaintext token ONCE.",returnsOneTimeSecret:!0,annotations:{readOnlyHint:!1,destructiveHint:!1,idempotentHint:!1,openWorldHint:!1},inputSchema:{productId:s.string().describe(ns),tokenId:s.string().describe("The runtime token id to rotate."),...We},handler:async(t,e)=>t.builderRotateRuntimeToken(e.productId,e.tokenId,{idempotencyKey:e.idempotencyKey})}},{opKey:"runtime_token.revoke",operationClass:"operate",scope:[rs],sideEffect:"write",cli:{group:"backend tokens",command:"revoke",summary:"Revoke a runtime token. Requires --yes.",destructive:!0,yesMessage:"Pass --yes to confirm runtime token revocation.",args:[pn,{field:"tokenId",kind:"positional",token:"<tokenId>"}],handler:async({client:t,args:e,emit:n})=>{let o=e.productId,r=e.tokenId;await t.builderRevokeRuntimeToken(o,r),n({productId:o,revoked:r},`Runtime token ${r} revoked`)}},mcp:{tool:"fs_runtime_token_revoke",title:"Revoke a runtime token",description:"Revoke a runtime token. The backend using it stops verifying.",annotations:{readOnlyHint:!1,destructiveHint:!0,idempotentHint:!0,openWorldHint:!1},inputSchema:{productId:s.string().describe(ns),tokenId:s.string().describe("The runtime token id to revoke.")},handler:async(t,{productId:e,tokenId:n})=>t.builderRevokeRuntimeToken(e,n)}}];var mn="The business id or slug.",Bo="Scope to a preview environment (omit for production).",Ho={field:"productId",kind:"positional",token:"<businessIdOrSlug>",describe:mn,resolveProduct:!0},Ko={field:"env",kind:"flag",token:"--env <environmentId>",describe:"Scope to a preview environment id (omit for production)."},fL={field:"target",kind:"flag",token:"--target <target>",describe:"BUILD, RUNTIME, or BOTH (default)."};async function Go(t,e){return Vo(t,e)}var XE=[{opKey:"frontend.deploy",operationClass:"operate",scope:["products:update"],sideEffect:"write",cli:{group:"frontend",command:"deploy",summary:"Trigger a frontend build (deploy) for a product's connected repo",idempotent:!0,args:[Ho,Ko,{field:"ref",kind:"flag",token:"--ref <ref>",describe:"Git ref to build (defaults to the env branch / repo default)."},{field:"buildCmd",kind:"flag",token:"--build-cmd <cmd>",describe:"Override the build command."}],handler:async({client:t,args:e,reqOpts:n,emit:o,emitDryRunPreview:r})=>{let i=await t.builderFrontendDeploy(e.productId,{ref:e.ref,buildCmd:e.buildCmd,environmentId:e.env},n);r(i)||o({result:i},"Frontend build triggered")}},mcp:{tool:"fs_frontend_deploy",title:"Deploy a product frontend",description:"Trigger a Managed Frontend Hosting build for the product's connected repo (production by default; pass environmentId for a preview env). Returns the enqueued build.",annotations:{readOnlyHint:!1,destructiveHint:!1,idempotentHint:!0,openWorldHint:!1},inputSchema:{productId:s.string().describe(mn),ref:s.string().optional().describe("Git ref to build (defaults to the env branch / repo default)."),buildCmd:s.string().optional().describe("Override the build command."),environmentId:s.string().optional().describe(Bo),...We},handler:async(t,e)=>{let n=await Go(t,e.productId);return t.builderFrontendDeploy(n,{ref:e.ref,buildCmd:e.buildCmd,environmentId:e.environmentId},{idempotencyKey:e.idempotencyKey})}}},{opKey:"frontend.status",operationClass:"operate",scope:["products:read"],sideEffect:"read",cli:{group:"frontend",command:"status",summary:"Show the product's current frontend release + recent release history",args:[Ho,Ko],handler:async({client:t,args:e,emit:n})=>{let o=await t.builderFrontendStatus(e.productId,e.env);n(o,"Frontend status")}},mcp:{tool:"fs_frontend_status",title:"Get frontend status",description:"Read a product's current frontend serve state (uiMode, active release hash + producing build, pin flag) plus the recent SUCCEEDED releases (rollback targets). Read-only.",annotations:{readOnlyHint:!0,openWorldHint:!1},inputSchema:{productId:s.string().describe(mn),environmentId:s.string().optional().describe(Bo)},handler:async(t,e)=>{let n=await Go(t,e.productId);return t.builderFrontendStatus(n,e.environmentId)}}},{opKey:"frontend.rollback",operationClass:"operate",scope:["products:update"],sideEffect:"write",cli:{group:"frontend",command:"rollback",summary:"Roll the product frontend back to a prior release (re-activate its releaseId)",idempotent:!0,args:[Ho,{field:"releaseId",kind:"flag",token:"--release-id <releaseId>",describe:"The prior release id (manifest hash) to re-activate \u2014 see `frontend status`.",required:!0},Ko],handler:async({client:t,args:e,reqOpts:n,emit:o,emitDryRunPreview:r})=>{let i=await t.builderFrontendRollback(e.productId,{releaseId:e.releaseId,environmentId:e.env},n);r(i)||o({result:i},"Frontend rolled back")}},mcp:{tool:"fs_frontend_rollback",title:"Roll back a product frontend",description:"Roll a product's frontend back to a prior release by its releaseId (manifest hash, from fs_frontend_status). Flips the live pointer back and pins it. The releaseId must belong to this target's build history.",annotations:{readOnlyHint:!1,destructiveHint:!1,idempotentHint:!0,openWorldHint:!1},inputSchema:{productId:s.string().describe(mn),releaseId:s.string().describe("The prior release id (manifest hash) to re-activate."),environmentId:s.string().optional().describe(Bo),...We},handler:async(t,e)=>{let n=await Go(t,e.productId);return t.builderFrontendRollback(n,{releaseId:e.releaseId,environmentId:e.environmentId},{idempotencyKey:e.idempotencyKey})}}},{opKey:"frontend.env.read",operationClass:"operate",scope:["products:read"],sideEffect:"read",cli:{group:"frontend env",command:"list",summary:"List public frontend build/runtime variables",args:[Ho,Ko],handler:async({client:t,args:e,emit:n})=>{let o=await t.builderFrontendVariables(e.productId,e.env);n(o,"Frontend variables")}},mcp:{tool:"fs_frontend_env_list",title:"List frontend variables",description:"List public browser-visible frontend build/runtime variables for a product. Includes effective build/runtime maps after production inheritance and environment overrides.",annotations:{readOnlyHint:!0,openWorldHint:!1},inputSchema:{productId:s.string().describe(mn),environmentId:s.string().optional().describe(Bo)},handler:async(t,e)=>{let n=await Go(t,e.productId);return t.builderFrontendVariables(n,e.environmentId)}}},{opKey:"frontend.env.set",operationClass:"operate",scope:["products:update"],sideEffect:"write",cli:{group:"frontend env",command:"set",summary:"Set a public frontend build/runtime variable",idempotent:!0,args:[Ho,{field:"name",kind:"positional",token:"<name>"},{field:"value",kind:"positional",token:"<value>"},Ko,fL],handler:async({client:t,args:e,reqOpts:n,emit:o,emitDryRunPreview:r})=>{let i=await t.builderSetFrontendVariable(e.productId,{name:e.name,value:e.value,target:e.target??"BOTH",environmentId:e.env},n);r(i)||o({result:i},"Frontend variable saved")}},mcp:{tool:"fs_frontend_env_set",title:"Set a frontend variable",description:"Create or update a public browser-visible frontend variable. target is BUILD, RUNTIME, or BOTH.",annotations:{readOnlyHint:!1,destructiveHint:!1,idempotentHint:!0,openWorldHint:!1},inputSchema:{productId:s.string().describe(mn),name:s.string().describe("Frontend variable name."),value:s.string().describe("Frontend variable value."),target:s.enum(["BUILD","RUNTIME","BOTH"]).optional().describe("Where the variable is exposed. Default: BOTH."),environmentId:s.string().optional().describe(Bo),...We},handler:async(t,e)=>{let n=await Go(t,e.productId);return t.builderSetFrontendVariable(n,{name:e.name,value:e.value,target:e.target??"BOTH",environmentId:e.environmentId},{idempotencyKey:e.idempotencyKey})}}},{opKey:"frontend.env.delete",operationClass:"operate",scope:["products:update"],sideEffect:"write",cli:{group:"frontend env",command:"delete",summary:"Delete a public frontend variable",idempotent:!0,args:[Ho,{field:"name",kind:"positional",token:"<name>"},Ko],handler:async({client:t,args:e,reqOpts:n,emit:o,emitDryRunPreview:r})=>{let i=await t.builderDeleteFrontendVariable(e.productId,e.name,e.env,n);r(i)||o({result:i},"Frontend variable deleted")}},mcp:{tool:"fs_frontend_env_delete",title:"Delete a frontend variable",description:"Delete a public browser-visible frontend variable.",annotations:{readOnlyHint:!1,destructiveHint:!0,idempotentHint:!0,openWorldHint:!1},inputSchema:{productId:s.string().describe(mn),name:s.string().describe("Frontend variable name."),environmentId:s.string().optional().describe(Bo),...We},handler:async(t,e)=>{let n=await Go(t,e.productId);return t.builderDeleteFrontendVariable(n,e.name,e.environmentId,{idempotencyKey:e.idempotencyKey})}}}];var QE=[{opKey:"usage.read",operationClass:"operate",scope:["products:read"],sideEffect:"read",cli:{group:"usage",command:"summary",summary:"Show usage summary for the last 30 days",args:[{field:"productId",kind:"positional",token:"<productIdOrName>",resolveProduct:!0}],handler:async({client:t,args:e,emit:n})=>{let o=e.productId,r=await t.managementGetUsage(o);n({productId:o,summary:r},"Usage summary")}},mcp:{tool:"fs_usage_read",title:"Read usage summary",description:"Read a product's usage summary \u2014 metered request counts and tier utilization. Read-only.",annotations:{readOnlyHint:!0,openWorldHint:!1},inputSchema:{productId:s.string().describe("The product id whose usage to read.")},handler:async(t,{productId:e})=>t.managementGetUsage(e)}}];var eT=[{opKey:"persona.bootstrap",operationClass:"operate",scope:["products:read"],sideEffect:"write",cli:{group:"persona",command:"bootstrap",summary:"Issue a fresh fsk_test_ API key in a test environment",args:[{field:"productId",kind:"positional",token:"<productIdOrName>",resolveProduct:!0},{field:"env",kind:"flag",token:"--env <env>",describe:"Environment name (must be test-strategy)",required:!0},{field:"plan",kind:"flag",token:"--plan <planKey>",describe:"Plan key to assign (e.g. starter)"},{field:"displayName",kind:"flag",token:"--display-name <name>",describe:"Persona display name"}],handler:async({client:t,args:e,emit:n})=>{let o=e.productId,r=await ay(t,o,e.env),i=await t.issuePersonaBootstrapKey(o,r,{planKey:e.plan,displayName:e.displayName});n({productId:o,environmentId:r,result:i},"Persona bootstrapped")}},mcp:{tool:"fs_persona_bootstrap",title:"Bootstrap a test persona",description:"Issue a one-time test bootstrap key for a product environment \u2014 use it to provision a test persona. Returns the key ONCE; store it now.",returnsOneTimeSecret:!0,annotations:{readOnlyHint:!1,destructiveHint:!1,idempotentHint:!1,openWorldHint:!1},inputSchema:{productId:s.string().describe("The product id."),environmentId:s.string().describe("The environment id to scope the persona to.")},handler:async(t,{productId:e,environmentId:n})=>t.issuePersonaBootstrapKey(e,n)}},{opKey:"persona.read",operationClass:"operate",scope:["products:read"],sideEffect:"read",cli:{group:"persona",command:"list",summary:"List personas for a test environment",args:[{field:"productId",kind:"positional",token:"<productIdOrName>",resolveProduct:!0},{field:"env",kind:"flag",token:"--env <env>",describe:"Environment name",required:!0}],handler:async({client:t,args:e,emit:n})=>{let o=e.productId,r=await ay(t,o,e.env),i=await t.listPersonas(o,r);n({productId:o,environmentId:r,result:i},"Personas")}},mcp:{tool:"fs_persona_list",title:"List personas",description:"List a product environment's test personas (id, label, status). Read-only.",annotations:{readOnlyHint:!0,openWorldHint:!1},inputSchema:{productId:s.string().describe("The product id."),environmentId:s.string().describe("The environment id whose personas to list.")},handler:async(t,{productId:e,environmentId:n})=>t.listPersonas(e,n)}},{opKey:"persona.revoke",operationClass:"operate",scope:["products:update"],sideEffect:"write",cli:{group:"persona",command:"revoke",summary:"Revoke a persona's API key",args:[{field:"productId",kind:"positional",token:"<productIdOrName>",resolveProduct:!0},{field:"personaId",kind:"positional",token:"<personaId>"},{field:"env",kind:"flag",token:"--env <env>",describe:"Environment name",required:!0}],handler:async({client:t,args:e,emit:n})=>{let o=e.productId,r=e.personaId,i=await ay(t,o,e.env),a=await t.revokePersona(o,i,r);n({productId:o,environmentId:i,result:a},`Persona ${r} revoked`)}},mcp:{tool:"fs_persona_revoke",title:"Revoke a persona",description:"Revoke a test persona. Its credentials stop working.",annotations:{readOnlyHint:!1,destructiveHint:!0,idempotentHint:!0,openWorldHint:!1},inputSchema:{productId:s.string().describe("The product id."),environmentId:s.string().describe("The environment id."),personaId:s.string().describe("The persona id to revoke.")},handler:async(t,{productId:e,environmentId:n,personaId:o})=>t.revokePersona(e,n,o)}}];async function ay(t,e,n){try{return await xd(t,e,n)}catch(o){throw new te(o instanceof Error?o.message:`Environment "${n}" not found on product ${e}.`,void 0,{code:"ENV_NOT_FOUND"})}}function hL(t){if(!t||typeof t!="object")return[];let e=t;return Array.isArray(e.data)?e.data:Array.isArray(e.tokens)?e.tokens:Array.isArray(t)?t:[]}var tT=[{opKey:"maker_token.read",operationClass:"operate",scope:[],sideEffect:"read",cli:{group:"token",command:"list",summary:"List maker tokens in the current org",args:[],handler:async({client:t,emit:e})=>{let n=hL(await t.managementListMakerTokens());e({count:n.length,tokens:n.map(o=>({id:o.id,name:o.name??null,scopes:o.scopes??[],productId:o.productId??null,lastFour:o.lastFour??null,createdAt:o.createdAt??null,revokedAt:o.revokedAt??null}))},`${n.length} token(s)`)}},mcp:{tool:"fs_maker_token_list",title:"List maker tokens",description:"List the workspace's maker tokens (mk_) \u2014 id, label, scopes, last-four, status. Read-only; secrets are never shown. Creating/revoking maker tokens is intentionally not exposed via MCP.",annotations:{readOnlyHint:!0,openWorldHint:!1},inputSchema:{},handler:async t=>t.managementListMakerTokens()}},{opKey:"maker_token.create",operationClass:"operate",scope:["products:update"],sideEffect:"write",cli:{group:"token",command:"create",summary:"Create a new maker token (returns the secret once)",args:[{field:"name",kind:"flag",token:"--name <name>",describe:"Human-friendly token name",required:!0},{field:"scope",kind:"flag",token:"--scope <scope...>",describe:"Scope(s) to attach (e.g. products:update products:publish)"},{field:"product",kind:"flag",token:"--product <productId>",describe:"Scope to a specific product"}],handler:async({client:t,args:e,emit:n})=>{let o=await t.managementCreateMakerToken({name:e.name,scopes:e.scope,productId:e.product});n({result:o},"Token created")}},mcp:null},{opKey:"maker_token.revoke",operationClass:"operate",scope:["products:update"],sideEffect:"write",cli:{group:"token",command:"revoke",summary:"Revoke a maker token. Requires --yes.",destructive:!0,yesMessage:"Pass --yes to confirm token revocation.",args:[{field:"tokenId",kind:"positional",token:"<tokenId>"}],handler:async({client:t,args:e,emit:n})=>{let o=e.tokenId;await t.managementRevokeMakerToken(o),n({revoked:o},`Token ${o} revoked`)}},mcp:null},{opKey:"maker_token.rotate",operationClass:"operate",scope:["products:update"],sideEffect:"write",cli:{group:"token",command:"rotate",summary:"Rotate a maker token secret (returns the new secret once)",idempotent:!0,args:[{field:"tokenId",kind:"positional",token:"<tokenId>"},{field:"syncToGithub",kind:"flag",token:"--sync-to-github",describe:"Also update the connected GitHub repo FARTHERSHORE_TOKEN secret when this is a platform token"}],handler:async({client:t,args:e,reqOpts:n,emit:o})=>{let r=e.tokenId,i=await t.managementRotateMakerToken(r,{syncToGithub:e.syncToGithub===!0},n);o({result:i},`Token ${r} rotated`)}},mcp:null},{opKey:"maker_token.hard_delete",operationClass:"operate",scope:["products:update"],sideEffect:"write",cli:{group:"token",command:"delete",summary:"Permanently delete an already-revoked maker token. Requires --yes.",destructive:!0,yesMessage:"Pass --yes to permanently delete the revoked token row.",args:[{field:"tokenId",kind:"positional",token:"<tokenId>"}],handler:async({client:t,args:e,emit:n})=>{let o=e.tokenId;await t.managementHardDeleteMakerToken(o),n({deleted:o},`Token ${o} permanently deleted`)}},mcp:null}];var rT=[{opKey:"change_set.list",operationClass:"operate",scope:["products:read"],sideEffect:"read",cli:{group:"change-set",command:"list",summary:"List repo-backed change sets for a business: PRs, pushes, releases, checks, semantic diffs, and apply state.",args:[{field:"productId",kind:"positional",token:"<businessIdOrName>",resolveProduct:!0},{field:"env",kind:"flag",token:"--env <env>",describe:"Environment scope: production, all, or a preview environment name."}],handler:async({client:t,args:e,emit:n})=>{let o=e.productId,r=await t.listChangeSets(o,{env:e.env});n({productId:o,count:r.data.length,changeSets:r.data},`${r.data.length} change set(s)`)}},mcp:null},{opKey:"change_set.read",operationClass:"operate",scope:["products:read"],sideEffect:"read",cli:{group:"change-set",command:"inspect",summary:"Inspect one repo-backed change set by id, PR number, branch, or commit SHA.",args:[{field:"productId",kind:"positional",token:"<businessIdOrName>",resolveProduct:!0},{field:"selector",kind:"positional",token:"<id|pr|branch|sha>"},{field:"env",kind:"flag",token:"--env <env>",describe:"Environment scope: production, all, or a preview environment name."}],handler:async({client:t,args:e,emit:n})=>{let o=e.productId,r=String(e.selector),i=await t.listChangeSets(o,{env:e.env}),a=i.data.find(c=>c.id===r)??i.data.find(c=>c.prNumber!==null&&String(c.prNumber)===r)??i.data.find(c=>c.branch===r)??i.data.find(c=>c.commitSha.startsWith(r));if(!a)throw new te(`Change set ${r} was not found.`,404,{code:"CHANGE_SET_NOT_FOUND"});n({productId:o,changeSet:a},`Change set ${a.id}: ${a.status}`)}},mcp:null}];var nT=[...HE,...rT,...KE,...GE,...YE,...XE,...QE,...eT,...tT];function oT(t){if(!t.mcp)throw new Error(`toMcpTool called on CLI-only operation "${t.opKey}" (mcp === null).`);let e={name:t.mcp.tool,title:t.mcp.title,description:t.mcp.description,operationClass:t.operationClass,scope:t.scope,sideEffect:t.sideEffect,annotations:t.mcp.annotations,inputSchema:t.mcp.inputSchema,handler:t.mcp.handler};return t.mcp.returnsOneTimeSecret&&(e.returnsOneTimeSecret=!0),e}var sy=nT.filter(t=>t.mcp).map(oT);function iT(){let t=_E(),e=vE(void 0),n=process.env.FARTHERSHORE_API_URL??t.apiUrl;return xE({apiUrl:n,token:e})}function gL(t){if(t&&typeof t=="object"){let e=t,n=typeof e.code=="string"?` [${e.code}]`:"",o=typeof e.status=="number"?` (HTTP ${e.status})`:"";if(typeof e.message=="string")return`${e.message}${n}${o}`}return String(t)}function _L(t,e,n){let o=async c=>{try{let u=await e.handler(n,c??{}),l=e.returnsOneTimeSecret?u:bd(u),d=UE(e.name,l);return{content:[{type:"text",text:JSON.stringify(d,null,2)}]}}catch(u){let l=u instanceof te?u:new te(gL(u),0),d=LE(e.name,l);return{content:[{type:"text",text:JSON.stringify(d,null,2)}],isError:!0}}},r=Object.keys(e.inputSchema).length>0,i={title:e.title,description:e.description,annotations:{title:e.title,...e.annotations},...r?{inputSchema:e.inputSchema}:{}},a=r?c=>o(c):()=>o({});t.registerTool(e.name,i,a)}function yL(t){for(let e of t){let n=dE(e.operationClass,e.sideEffect);if(n)throw new Error(`[mcp] tool "${e.name}" is misclassified: ${n}`)}}function aT(t){yL(sy);let e=new sd({name:"farthershore-agent-business-builder",version:"0.2.0"});for(let n of sy)_L(e,n,t);return e}function cy(){return aT(iT())}async function vL(){let t=cy(),e=new dl;await t.connect(e)}import.meta.url===`file://${process.argv[1]}`&&vL();export{sy as ALL_TOOLS,aT as buildServer,cy as createMcpServer,iT as mcpClient};
|