@farthershore/cli 0.16.0 → 0.17.0
This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
- package/dist/index.js +27 -27
- package/dist/mcp.js +2 -2
- package/package.json +2 -2
package/dist/mcp.js
CHANGED
|
@@ -77,11 +77,11 @@ 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 zl(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===w.ZodEnum)return{type:"object",required:t.keyType._def.values,properties:t.keyType._def.values.reduce((o,r)=>({...o,[r]:V(t.valueType._def,{...e,currentPath:[...e.currentPath,"properties",r]})??Se(e)}),{}),additionalProperties:e.rejectedAdditionalProperties};let n={type:"object",additionalProperties:V(t.valueType._def,{...e,currentPath:[...e.currentPath,"additionalProperties"]})??e.allowedAdditionalProperties};if(e.target==="openApi3")return n;if(t.keyType?._def.typeName===w.ZodString&&t.keyType._def.checks?.length){let{type:o,...r}=Cl(t.keyType._def,e);return{...n,propertyNames:r}}else{if(t.keyType?._def.typeName===w.ZodEnum)return{...n,propertyNames:{enum:t.keyType._def.values}};if(t.keyType?._def.typeName===w.ZodBranded&&t.keyType._def.type._def.typeName===w.ZodString&&t.keyType._def.type._def.checks?.length){let{type:o,...r}=Nl(t.keyType._def,e);return{...n,propertyNames:r}}}return n}function Rx(t,e){if(e.mapStrategy==="record")return zl(t,e);let n=V(t.keyType._def,{...e,currentPath:[...e.currentPath,"items","items","0"]})||Se(e),o=V(t.valueType._def,{...e,currentPath:[...e.currentPath,"items","items","1"]})||Se(e);return{type:"array",maxItems:125,items:{type:"array",items:[n,o],minItems:2,maxItems:2}}}function Nx(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 Cx(t){return t.target==="openAi"?void 0:{not:Se({...t,currentPath:[...t.currentPath,"not"]})}}function zx(t){return t.target==="openApi3"?{enum:["null"],nullable:!0}:{type:"null"}}var wa={ZodString:"string",ZodNumber:"number",ZodBigInt:"integer",ZodBoolean:"boolean",ZodNull:"null"};function Dx(t,e){if(e.target==="openApi3")return Ax(t,e);let n=t.options instanceof Map?Array.from(t.options.values()):t.options;if(n.every(o=>o._def.typeName in wa&&(!o._def.checks||!o._def.checks.length))){let o=n.reduce((r,i)=>{let a=wa[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 Ax(t,e)}var Ax=(t,e)=>{let n=(t.options instanceof Map?Array.from(t.options.values()):t.options).map((o,r)=>V(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 jx(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:wa[t.innerType._def.typeName],nullable:!0}:{type:[wa[t.innerType._def.typeName],"null"]};if(e.target==="openApi3"){let o=V(t.innerType._def,{...e,currentPath:[...e.currentPath]});return o&&"$ref"in o?{allOf:[o],nullable:!0}:o&&{...o,nullable:!0}}let n=V(t.innerType._def,{...e,currentPath:[...e.currentPath,"anyOf","0"]});return n&&{anyOf:[n,{type:"null"}]}}function Ux(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",zh(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 Lx(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=AN(u);l&&n&&(u._def.typeName==="ZodOptional"&&(u=u._def.innerType),u.isNullable()||(u=u.nullable()),l=!1);let d=V(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=zN(t,e);return a!==void 0&&(o.additionalProperties=a),o}function zN(t,e){if(t.catchall._def.typeName!=="ZodNever")return V(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 AN(t){try{return t.isOptional()}catch{return!0}}var Mx=(t,e)=>{if(e.currentPath.toString()===e.propertyPath?.toString())return V(t.innerType._def,e);let n=V(t.innerType._def,{...e,currentPath:[...e.currentPath,"anyOf","1"]});return n?{anyOf:[{not:Se(e)},n]}:Se(e)};var Zx=(t,e)=>{if(e.pipeStrategy==="input")return V(t.in._def,e);if(e.pipeStrategy==="output")return V(t.out._def,e);let n=V(t.in._def,{...e,currentPath:[...e.currentPath,"allOf","0"]}),o=V(t.out._def,{...e,currentPath:[...e.currentPath,"allOf",n?"1":"0"]});return{allOf:[n,o].filter(r=>r!==void 0)}};function Fx(t,e){return V(t.type._def,e)}function qx(t,e){let o={type:"array",uniqueItems:!0,items:V(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 Vx(t,e){return t.rest?{type:"array",minItems:t.items.length,items:t.items.map((n,o)=>V(n._def,{...e,currentPath:[...e.currentPath,"items",`${o}`]})).reduce((n,o)=>o===void 0?n:[...n,o],[]),additionalItems:V(t.rest._def,{...e,currentPath:[...e.currentPath,"additionalItems"]})}:{type:"array",minItems:t.items.length,maxItems:t.items.length,items:t.items.map((n,o)=>V(n._def,{...e,currentPath:[...e.currentPath,"items",`${o}`]})).reduce((n,o)=>o===void 0?n:[...n,o],[])}}function Bx(t){return{not:Se(t)}}function Hx(t){return Se(t)}var Kx=(t,e)=>V(t.innerType._def,e);var Gx=(t,e,n)=>{switch(e){case w.ZodString:return Cl(t,n);case w.ZodNumber:return Ux(t,n);case w.ZodObject:return Lx(t,n);case w.ZodBigInt:return xx(t,n);case w.ZodBoolean:return Sx();case w.ZodDate:return Ah(t,n);case w.ZodUndefined:return Bx(n);case w.ZodNull:return zx(n);case w.ZodArray:return kx(t,n);case w.ZodUnion:case w.ZodDiscriminatedUnion:return Dx(t,n);case w.ZodIntersection:return Tx(t,n);case w.ZodTuple:return Vx(t,n);case w.ZodRecord:return zl(t,n);case w.ZodLiteral:return Ox(t,n);case w.ZodEnum:return Ex(t);case w.ZodNativeEnum:return Nx(t);case w.ZodNullable:return jx(t,n);case w.ZodOptional:return Mx(t,n);case w.ZodMap:return Rx(t,n);case w.ZodSet:return qx(t,n);case w.ZodLazy:return()=>t.getter()._def;case w.ZodPromise:return Fx(t,n);case w.ZodNaN:case w.ZodNever:return Cx(n);case w.ZodEffects:return wx(t,n);case w.ZodAny:return Se(n);case w.ZodUnknown:return Hx(n);case w.ZodDefault:return Ix(t,n);case w.ZodBranded:return Nl(t,n);case w.ZodReadonly:return Kx(t,n);case w.ZodCatch:return $x(t,n);case w.ZodPipeline:return Zx(t,n);case w.ZodFunction:case w.ZodVoid:case w.ZodSymbol:return;default:return(o=>{})(e)}};function V(t,e,n=!1){let o=e.seen.get(t);if(e.override){let c=e.override?.(t,e,o,n);if(c!==yx)return c}if(o&&!n){let c=DN(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=Gx(t,t.typeName,e),a=typeof i=="function"?V(i(),e):i;if(a&&jN(t,e,a),e.postProcess){let c=e.postProcess(a,t,e);return r.jsonSchema=a,c}return r.jsonSchema=a,a}var DN=(t,e)=>{switch(e.$refStrategy){case"root":return{$ref:t.path.join("/")};case"relative":return{$ref:Rl(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`),Se(e)):e.$refStrategy==="seen"?Se(e):void 0}},jN=(t,e,n)=>(t.description&&(n.description=t.description,e.markdownDescription&&(n.markdownDescription=t.description)),n);var Uh=(t,e)=>{let n=bx(e),o=typeof e=="object"&&e.definitions?Object.entries(e.definitions).reduce((u,[l,d])=>({...u,[l]:V(d._def,{...n,currentPath:[...n.basePath,n.definitionPath,l]},!0)??Se(n)}),{}):void 0,r=typeof e=="string"?e:e?.nameStrategy==="title"?void 0:e?.name,i=V(t._def,r===void 0?n:{...n,currentPath:[...n.basePath,n.definitionPath,r]},!1)??Se(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 UN(t){return!t||t==="jsonSchema7"||t==="draft-7"?"draft-7":t==="jsonSchema2019-09"||t==="draft-2020-12"?"draft-2020-12":"draft-7"}function Lh(t,e){return yt(t)?Wr(t,{target:UN(e?.target),io:e?.pipeStrategy??"input"}):Uh(t,{strictUnions:e?.strictUnions??!0,pipeStrategy:e?.pipeStrategy??"input"})}function Mh(t){let n=Tr(t)?.method;if(!n)throw new Error("Schema is missing a method literal");let o=Pl(n);if(typeof o!="string")throw new Error("Schema method literal must be a string");return o}function Zh(t,e){let n=Er(t,e);if(!n.success)throw n.error;return n.data}var LN=6e4,Al=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(al,n=>{this._oncancel(n)}),this.setNotificationHandler(cl,n=>{this._onprogress(n)}),this.setRequestHandler(sl,n=>({})),this._taskStore=e?.taskStore,this._taskMessageQueue=e?.taskMessageQueue,this._taskStore&&(this.setRequestHandler(ul,async(n,o)=>{let r=await this._taskStore.getTask(n.params.taskId,o.sessionId);if(!r)throw new j(Z.InvalidParams,"Failed to retrieve task: Task not found");return{...r}}),this.setRequestHandler(dl,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(Z.InvalidParams,`Task not found: ${i}`);if(!Or(a.status))return await this._waitForTaskUpdate(i,o.signal),await r();if(Or(a.status)){let c=await this._taskStore.getTaskResult(i,o.sessionId);return this._clearTaskQueue(i),{...c,_meta:{...c._meta,[Sr]:{taskId:i}}}}return await r()};return await r()}),this.setRequestHandler(pl,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(Z.InvalidParams,`Failed to list tasks: ${r instanceof Error?r.message:String(r)}`)}}),this.setRequestHandler(fl,async(n,o)=>{try{let r=await this._taskStore.getTask(n.params.taskId,o.sessionId);if(!r)throw new j(Z.InvalidParams,`Task not found: ${n.params.taskId}`);if(Or(r.status))throw new j(Z.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(Z.InvalidParams,`Task not found after cancellation: ${n.params.taskId}`);return{_meta:{},...i}}catch(r){throw r instanceof j?r:new j(Z.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(Z.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),ia(i)||Jk(i)?this._onresponse(i):ph(i)?this._onrequest(i,a):Wk(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(Z.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?.[Sr]?.taskId;if(o===void 0){let d={jsonrpc:"2.0",id:e.id,error:{code:Z.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=Hk(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(Z.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:Z.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),ia(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(ia(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),ia(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(Z.InternalError,String(a))}}return}let i;try{let a=await this.request(e,no,o);if(a.task)i=a.task.taskId,yield{type:"taskCreated",task:a.task};else throw new j(Z.InternalError,"Task creation did not return a task");for(;;){let c=await this.getTask({taskId:i},o);if(yield{type:"taskStatus",task:c},Or(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(Z.InternalError,`Task ${i} failed`)}:c.status==="cancelled"&&(yield{type:"error",error:new j(Z.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(Z.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=M=>{d(M)};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(M){p(M);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||{},[Sr]:u}});let g=M=>{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(M)}},{relatedRequestId:r,resumptionToken:i,onresumptiontoken:a}).catch(F=>this._onerror(new Error(`Failed to send cancellation: ${F}`)));let U=M instanceof j?M:new j(Z.RequestTimeout,String(M));d(U)};this._responseHandlers.set(m,M=>{if(!o?.signal?.aborted){if(M instanceof Error)return d(M);try{let U=Er(n,M.result);U.success?l(U.data):d(U.error)}catch(U){d(U)}}}),o?.signal?.addEventListener("abort",()=>{g(o?.signal?.reason)});let v=o?.timeout??LN,b=()=>g(j.fromError(Z.RequestTimeout,"Request timed out",{timeout:v}));this._setupTimeout(m,v,o?.maxTotalTimeout,b,o?.resetTimeoutOnProgress??!1);let E=u?.taskId;if(E){let M=U=>{let F=this._responseHandlers.get(m);F?F(U):this._onerror(new Error(`Response handler missing for side-channeled request ${m}`))};this._requestResolvers.set(m,M),this._enqueueTaskMessage(E,{type:"request",message:f,timestamp:Date.now()}).catch(U=>{this._cleanupTimeout(m),d(U)})}else this._transport.send(f,{relatedRequestId:r,resumptionToken:i,onresumptiontoken:a}).catch(M=>{this._cleanupTimeout(m),d(M)})})}async getTask(e,n){return this.request({method:"tasks/get",params:e},ll,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},ml,n)}async cancelTask(e,n){return this.request({method:"tasks/cancel",params:e},Qk,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||{},[Sr]: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||{},[Sr]: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||{},[Sr]:n.relatedTask}}}),await this._transport.send(a,n)}setRequestHandler(e,n){let o=Mh(e);this.assertRequestHandlerCapability(o),this._requestHandlers.set(o,(r,i)=>{let a=Zh(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=Mh(e);this._notificationHandlers.set(o,r=>{let i=Zh(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"&&ph(r.message)){let i=r.message.id,a=this._requestResolvers.get(i);a?(a(new j(Z.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(Z.InvalidRequest,"Request cancelled"));return}let a=setTimeout(r,o);n.addEventListener("abort",()=>{clearTimeout(a),i(new j(Z.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(Z.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=la.parse({method:"notifications/tasks/status",params:c});await this.notification(u),Or(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(Z.InvalidParams,`Task "${r}" not found - it may have been cleaned up`);if(Or(c.status))throw new j(Z.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=la.parse({method:"notifications/tasks/status",params:u});await this.notification(l),Or(u.status)&&this._cleanupTaskProgressHandler(r)}},listTasks:r=>o.listTasks(r,n)}}};function Wx(t){return t!==null&&typeof t=="object"&&!Array.isArray(t)}function Jx(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];Wx(a)&&Wx(i)?n[r]={...a,...i}:n[r]=i}return n}var ZI=jy(E_(),1),FI=jy(MI(),1);function F1(){let t=new ZI.default({strict:!1,validateFormats:!0,validateSchema:!1,allErrors:!0});return(0,FI.default)(t),t}var gd=class{constructor(e){this._ajv=e??F1()}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 _d=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},ma,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},ao,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 qI(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 VI(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 yd=class extends Al{constructor(e,n){super(n),this._serverInfo=e,this._loggingLevels=new Map,this.LOG_LEVEL_SEVERITY=new Map(pa.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 gd,this.setRequestHandler(hh,o=>this._oninitialize(o)),this.setNotificationHandler(gh,()=>this.oninitialized?.()),this._capabilities.logging&&this.setRequestHandler(Sh,async(o,r)=>{let i=r.sessionId||r.requestInfo?.headers["mcp-session-id"]||void 0,{level:a}=o.params,c=pa.safeParse(a);return c.success&&this._loggingLevels.set(i,c.data),{}})}get experimental(){return this._experimental||(this._experimental={tasks:new _d(this)}),this._experimental}registerCapabilities(e){if(this.transport)throw new Error("Cannot register capabilities after connecting to transport");this._capabilities=Jx(this._capabilities,e)}setRequestHandler(e,n){let r=Tr(e)?.method;if(!r)throw new Error("Schema is missing a method literal");let i;if(yt(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=Er(io,u);if(!d.success){let g=d.error instanceof Error?d.error.message:String(d.error);throw new j(Z.InvalidParams,`Invalid tools/call request: ${g}`)}let{params:p}=d.data,m=await Promise.resolve(n(u,l));if(p.task){let g=Er(no,m);if(!g.success){let v=g.error instanceof Error?g.error.message:String(g.error);throw new j(Z.InvalidParams,`Invalid task creation result: ${v}`)}return g.data}let f=Er(kl,m);if(!f.success){let g=f.error instanceof Error?f.error.message:String(f.error);throw new j(Z.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){VI(this._clientCapabilities?.tasks?.requests,e,"Client")}assertTaskHandlerCapability(e){this._capabilities&&qI(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:qk.includes(n)?n:lh,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"},il)}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},$h,n):this.request({method:"sampling/createMessage",params:e},ma,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},ao,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},ao,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(Z.InvalidParams,`Elicitation response content does not match requested schema: ${c.errorMessage}`)}catch(a){throw a instanceof j?a:new j(Z.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},Ih,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 HI=Symbol.for("mcp.completable");function A_(t){return!!t&&typeof t=="object"&&HI in t}function KI(t){return t[HI]?.complete}var BI;(function(t){t.Completable="McpCompletable"})(BI||(BI={}));var q1=/^[A-Za-z0-9._-]{1,128}$/;function V1(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"),!q1.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 B1(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 D_(t){let e=V1(t);return B1(t,e.warnings),e.isValid}var vd=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 bd=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 yd(e,n)}get experimental(){return this._experimental||(this._experimental={tasks:new vd(this)}),this._experimental}async connect(e){return await this.server.connect(e)}async close(){await this.server.close()}setToolRequestHandlers(){this._toolHandlersInitialized||(this.server.assertCanSetRequestHandler(Ur(bl)),this.server.assertCanSetRequestHandler(Ur(io)),this.server.registerCapabilities({tools:{listChanged:!0}}),this.server.setRequestHandler(bl,()=>({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=xo(n.inputSchema);return r?Lh(r,{strictUnions:!0,pipeStrategy:"input"}):H1})(),annotations:n.annotations,execution:n.execution,_meta:n._meta};if(n.outputSchema){let r=xo(n.outputSchema);r&&(o.outputSchema=Lh(r,{strictUnions:!0,pipeStrategy:"output"}))}return o})})),this.server.setRequestHandler(io,async(e,n)=>{try{let o=this._registeredTools[e.params.name];if(!o)throw new j(Z.InvalidParams,`Tool ${e.params.name} not found`);if(!o.enabled)throw new j(Z.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(Z.InternalError,`Tool ${e.params.name} has taskSupport '${i}' but was not registered with registerToolTask`);if(i==="required"&&!r)throw new j(Z.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===Z.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=xo(e.inputSchema)??e.inputSchema,a=await Tl(i,n);if(!a.success){let c="error"in a?a.error:"Unknown error",u=Ol(c);throw new j(Z.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(Z.InvalidParams,`Output validation error: Tool ${o} has an output schema but no structured content was provided`);let r=xo(e.outputSchema),i=await Tl(r,n.structuredContent);if(!i.success){let a="error"in i?i.error:"Unknown error",c=Ol(a);throw new j(Z.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(Z.InternalError,`Task ${u} not found during polling`);l=p}return await o.taskStore.getTaskResult(u)}setCompletionRequestHandler(){this._completionHandlerInitialized||(this.server.assertCanSetRequestHandler(Ur(xl)),this.server.registerCapabilities({completions:{}}),this.server.setRequestHandler(xl,async e=>{switch(e.params.ref.type){case"ref/prompt":return ix(e),this.handlePromptCompletion(e,e.params.ref);case"ref/resource":return ax(e),this.handleResourceCompletion(e,e.params.ref);default:throw new j(Z.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(Z.InvalidParams,`Prompt ${n.name} not found`);if(!o.enabled)throw new j(Z.InvalidParams,`Prompt ${n.name} disabled`);if(!o.argsSchema)return rs;let i=Tr(o.argsSchema)?.[e.params.argument.name];if(!A_(i))return rs;let a=KI(i);if(!a)return rs;let c=await a(e.params.argument.value,e.params.context);return WI(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 rs;throw new j(Z.InvalidParams,`Resource template ${e.params.ref.uri} not found`)}let r=o.resourceTemplate.completeCallback(e.params.argument.name);if(!r)return rs;let i=await r(e.params.argument.value,e.params.context);return WI(i)}setResourceRequestHandlers(){this._resourceHandlersInitialized||(this.server.assertCanSetRequestHandler(Ur(hl)),this.server.assertCanSetRequestHandler(Ur(gl)),this.server.assertCanSetRequestHandler(Ur(_l)),this.server.registerCapabilities({resources:{listChanged:!0}}),this.server.setRequestHandler(hl,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(gl,async()=>({resourceTemplates:Object.entries(this._registeredResourceTemplates).map(([n,o])=>({name:n,uriTemplate:o.resourceTemplate.uriTemplate.toString(),...o.metadata}))})),this.server.setRequestHandler(_l,async(e,n)=>{let o=new URL(e.params.uri),r=this._registeredResources[o.toString()];if(r){if(!r.enabled)throw new j(Z.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(Z.InvalidParams,`Resource ${o} not found`)}),this._resourceHandlersInitialized=!0)}setPromptRequestHandlers(){this._promptHandlersInitialized||(this.server.assertCanSetRequestHandler(Ur(yl)),this.server.assertCanSetRequestHandler(Ur(vl)),this.server.registerCapabilities({prompts:{listChanged:!0}}),this.server.setRequestHandler(yl,()=>({prompts:Object.entries(this._registeredPrompts).filter(([,e])=>e.enabled).map(([e,n])=>({name:e,title:n.title,description:n.description,arguments:n.argsSchema?K1(n.argsSchema):void 0}))})),this.server.setRequestHandler(vl,async(e,n)=>{let o=this._registeredPrompts[e.params.name];if(!o)throw new j(Z.InvalidParams,`Prompt ${e.params.name} not found`);if(!o.enabled)throw new j(Z.InvalidParams,`Prompt ${e.params.name} disabled`);if(o.argsSchema){let r=xo(o.argsSchema),i=await Tl(r,e.params.arguments);if(!i.success){let u="error"in i?i.error:"Unknown error",l=Ol(u);throw new j(Z.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:Qr(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=Qr(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 to?u._def?.innerType:u;return A_(l)})&&this.setCompletionRequestHandler(),a}_createRegisteredTool(e,n,o,r,i,a,c,u,l){D_(e);let d={title:n,description:o,inputSchema:GI(r),outputSchema:GI(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"&&D_(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=Qr(p.paramsSchema)),typeof p.outputSchema<"u"&&(d.outputSchema=Qr(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(j_(u))r=n.shift(),n.length>1&&typeof n[0]=="object"&&n[0]!==null&&!j_(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 H1={type:"object",properties:{}};function JI(t){return t!==null&&typeof t=="object"&&"parse"in t&&typeof t.parse=="function"&&"safeParse"in t&&typeof t.safeParse=="function"}function YI(t){return"_def"in t||"_zod"in t||JI(t)}function j_(t){return typeof t!="object"||t===null||YI(t)?!1:Object.keys(t).length===0?!0:Object.values(t).some(JI)}function GI(t){if(t){if(j_(t))return Qr(t);if(!YI(t))throw new Error("inputSchema must be a Zod schema or raw shape, received an unrecognized object");return t}}function K1(t){let e=Tr(t);return e?Object.entries(e).map(([n,o])=>{let r=hx(o),i=gx(o);return{name:n,description:r,required:!i}}):[]}function Ur(t){let n=Tr(t)?.method;if(!n)throw new Error("Schema is missing a method literal");let o=Pl(n);if(typeof o=="string")return o;throw new Error("Schema method literal must be a string")}function WI(t){return{completion:{values:t.slice(0,100),total:t.length,hasMore:t.length>100}}}var rs={completion:{values:[],hasMore:!1}};var ns=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(),XI=s.enum(["SUM","COUNT","MAX","UNIQUE_COUNT","LATEST"]),U_=s.object({d:s.number().int().nonnegative(),w:s.number().int().positive(),c:s.number().nonnegative(),agg:XI.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:ns.optional()}),G1=s.object({kind:s.literal("credential_validity")}),W1=s.object({kind:s.literal("track_only_bypass")}),J1=s.object({kind:s.literal("lifecycle_block"),blockOn:s.array(s.string()).default(["SUSPENDED","CANCELLED","INACTIVE"]),code:s.string().default("subscription_inactive")}),Y1=s.object({kind:s.literal("identity_requirement"),require:s.enum(["org_only","org_and_user"]).default("org_only")}),X1=s.object({kind:s.literal("scope"),requireExplicit:s.boolean().default(!0)}),Q1=s.object({kind:s.literal("feature_gate"),feature:s.string().min(1).max(120)}),eU=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`"}),tU=s.enum(["fixed_window","sliding_window","token_bucket"]),rU=U_.extend({kind:s.literal("rate_limit"),m:s.enum(["e","t"]).default("e"),strategy:tU.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"]}))}),nU=s.enum(["fixed_window","sliding_window"]),oU=U_.extend({kind:s.literal("quota"),ovr:s.enum(["BLOCK","ALLOW_AND_BILL"]),strategy:nU.default("fixed_window")}),iU=U_.extend({kind:s.literal("credit_balance"),ovr:s.enum(["BLOCK","ALLOW_AND_BILL"])}),aU=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)}),sU=s.object({kind:s.literal("capability_limit"),capability:s.string().min(1).max(120),limit:s.union([s.number().int().nonnegative(),s.boolean()])}),cU=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()}),uU=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)}),lU=s.enum(["plan","manual","provider"]),kd=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:ns.optional()}).refine(QI,{message:"capacity requires at least one ceiling (maxInputTokens / maxOutputTokens / maxContextTokens / maxPayloadBytes)"});function QI(t){return t.maxInputTokens!==void 0||t.maxOutputTokens!==void 0||t.maxContextTokens!==void 0||t.maxPayloadBytes!==void 0}var dU=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:ns.optional(),provenance:lU.optional()}).refine(QI,{message:"capacity requires at least one ceiling (maxInputTokens / maxOutputTokens / maxContextTokens / maxPayloadBytes)"}),L_=s.discriminatedUnion("kind",[G1,W1,J1,Y1,X1,Q1,eU,rU,oU,iU,sU,cU,aU,uU,dU]);var os=["customer_feature","control_plane","admin_internal","background_job","webhook","healthcheck","unclassified"],RH=new Set(os);var xd=s.object({trafficClass:s.enum(os),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 FH=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 ew=s.object({unit:s.enum(["requests","tokens","computeMs","dollars"]),window:s.enum(["second","minute","hour","day","week","month"]),capacity:s.number()}),pU=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()}),qH=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(ew).readonly().optional(),userLimits:s.array(ew).readonly().optional(),environmentId:s.string().optional(),contextTokenSecret:s.string().nullable().optional(),timeoutMs:s.number().positive().optional(),idleTimeoutMs:s.number().positive().optional(),backends:s.array(pU).optional(),defaultBackendId:s.string().optional(),verificationRequired:s.boolean().optional()});var mU=s.object({perRequestMinUnitsByDim:s.record(s.string(),s.number()).optional(),creditPoolMicros:s.number().optional(),perDimUnitCostMicros:s.record(s.string(),s.number()).optional()}),fU=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()}),hU=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()}),gU=s.object({feature:s.string(),method:s.string(),path:s.string(),meters:s.array(s.string()).optional(),usagePolicy:xd.optional(),policyResolutionMode:s.enum(["legacy","policy"]).optional()}),VH=s.object({v:s.number(),sub:s.string(),compiledPlanId:s.string().min(1),planType:s.string(),ts:s.number(),constraints:s.array(L_),cv:s.number(),policyResolutionMode:s.enum(["legacy","policy"]).optional(),dm:s.record(s.string(),s.number()),dmv:s.number().optional(),floor:mU.nullable().optional(),displayDims:s.array(s.number()).optional(),meterSemantics:s.record(s.string(),hU).optional(),rp:s.record(s.string(),fU).optional(),fr:s.array(gU).optional(),sig:s.string().min(1),sigKid:s.string().optional(),environmentId:s.string().optional()}).passthrough();var BH=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(),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 _U=["DRAFT","ACTIVE"],GH=s.enum(_U),yU=["ONBOARDING","ACTIVE","SUSPENDED"],tw=s.enum(yU),vU=["ACTIVE","REVOKED"],WH=s.enum(vU),bU=["BLOCK","ALLOW_AND_BILL"],rw=s.enum(bU),kU=["ACTIVE","ARCHIVED"],JH=s.enum(kU),xU=["ACTIVE","EXPERIMENTAL","LEGACY_STABLE","PHASING_OUT","SUPERSEDED","ARCHIVED"],YH=s.enum(xU);var nw=["input","output","total","cached_read_input","cache_creation_input","context","max_output","estimated_output","actual_output","streaming_output"],Sd=[{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 ow(t){let e=t.trim().toLowerCase();return Sd.find(n=>n.id===e)}function iw(){return Sd.map(t=>t.id)}var SU="FS_RUNTIME_TOKEN";var $U={payload:"x-fs-metering",signature:"x-fs-metering-sig",token:"x-fs-metering-token"};var rK={environmentVariable:SU,presentation:$U.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 nK=10*1024*1024;var IU=["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"],aK=s.enum(IU);var wU=s.object({d:s.number(),w:s.number(),capacity:s.number(),remaining:s.number(),windowStart:s.number(),windowEnd:s.number()}),EU=s.record(s.string(),wU),TU=s.object({allocations:s.array(s.number()),expiresAt:s.number()}),OU=s.record(s.string(),TU),PU=s.record(s.string(),s.bigint()),mK=s.object({subscriptionId:s.string(),handoffToken:s.string(),targetShardId:s.string(),policyVersion:s.number(),entitlementVersion:s.number().nullable(),windowStates:EU,activeLeases:OU,totalsByDimension:PU.optional(),billingCycleId:s.string().nullable().optional(),billingCycleStartMs:s.number().optional()});var RU={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"},yK=Object.values(RU);var NU=["managed_frontend","custom_frontend","embedded_sdk","public_api","cli","agent","webhook","admin","internal"],cw=s.enum(NU),sw=s.string().min(1).max(128),CU=s.object({d:s.number().int().nonnegative(),w:s.number().int().positive(),rem:s.number(),cap:s.number()}).strict(),uw=s.object({v:s.literal(1),entV:s.number().int().nonnegative().optional(),entHash:sw.optional(),featureGrant:s.boolean().optional(),gates:s.array(sw).max(16).optional(),limits:s.array(CU).max(16).optional()}).strict();var zU=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:tw,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:rw.optional(),environment:s.enum(["production","sandbox"]).optional(),surface:cw.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:uw.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(os).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 AU=s.object({path:s.string(),code:s.string(),message:s.string()}),TK=s.object({reason:s.literal("schema_validation_failed"),receivedAt:s.string(),rawPayload:s.unknown(),issues:s.array(AU),consumerVersion:s.string().optional(),originalMessageId:s.string().optional()});var M_=["subscription.created","subscription.updated","subscription.canceled","payment.succeeded","payment.failed","rate_limit.exceeded","entitlement.changed","usage.threshold_reached"],Zo=s.enum(M_);var jt=s.enum(["immediate","period_end"]),is=s.object({default:jt.default("period_end"),when:s.object({price_increase:jt.optional(),price_decrease:jt.optional(),feature_added:jt.optional(),feature_removed:jt.optional(),limit_increased:jt.optional(),limit_reduced:jt.optional(),credit_increased:jt.optional(),credit_reduced:jt.optional(),rating_changed:jt.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 DU=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()}),jU=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()}),ar=s.discriminatedUnion("kind",[DU,jU]);function lw(t){return t.kind==="credit"&&t.recurs===!0&&t.label===void 0}function dw(t){return t.kind==="credit"&&t.recurs!==!0&&t.label===void 0}function Z_(t,e,n=["grants"]){if(!t)return;let o=0,r=0;for(let i of t)lw(i)?o+=1:dw(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 pw(t){return t.grants&&t.grants.length>0?[...t.grants]:[]}function F_(t){return pw(t).find(lw)?.amount_cents??0}function $d(t){return pw(t).find(dw)?.amount_cents??0}var UU=s.object({percent:s.number().int().min(0).max(100)}),LU=s.object({threshold_cents:s.number().int().nonnegative(),refill_cents:s.number().int().positive()}),sr=s.object({rollover:UU.optional(),auto_recharge:LU.optional()});var mw=s.enum(["linear","active_count"]);var MU=s.object({up_to:s.number().int().positive().nullable(),price_per_unit_micros:s.number().int().nonnegative()}),ZU=s.object({strategy:s.enum(["graduated","volume"]),tiers:s.array(MU).min(1).max(20)}),cr=s.object({dimension:s.string().min(1).max(64).regex(/^[a-z0-9_]+$/,"Meter dimension must be lowercase alphanumeric with underscores"),kind:mw.default("linear"),price_per_unit_micros:s.number().int().nonnegative().default(0),tiered:ZU.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"]})}}),pn=s.enum(["month","year"]),FU=s.object({meters:s.array(cr).default([]),recurring_fee_cents:s.number().int().nonnegative().default(0),billing_interval:pn.default("month"),grants:s.array(ar).max(40).default([]),creditPolicy:sr.optional(),trial_days:s.number().int().nonnegative().default(0),max_monthly_spend_cents:s.number().int().nonnegative().optional()});var qU=s.string().min(1),VU=s.object({type:s.literal("named"),name:s.enum(["second","minute","hour","day","week","month"])}),BU=s.object({type:s.literal("custom"),seconds:s.number().int().positive(),label:s.string().optional()}),HU=s.discriminatedUnion("type",[VU,BU]),Lr=s.object({dimension:qU,window:HU,capacity:s.number().nonnegative(),enforcement:s.enum(["enforce","track"]).optional(),warnAt:s.number().min(0).max(1).optional(),scope:ns.optional(),acknowledgeUnreachable:s.boolean().optional()}),VK=s.array(Lr).max(20);var KU=s.enum(["NONE","PRORATE","CREDIT"]).default("NONE"),GU={meters:s.array(cr).default([]),recurring_fee_cents:s.number().int().nonnegative().default(0),billing_interval:pn.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(ar).max(40).default([]),creditPolicy:sr.optional()},WU={meters:s.array(cr).optional(),recurring_fee_cents:s.number().int().nonnegative().optional(),billing_interval:pn.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(ar).max(40).optional(),creditPolicy:sr.optional()},JU=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:KU,...WU,limits:s.array(Lr).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:kd.optional()}),fw=JU.superRefine((t,e)=>{Z_(t.grants,e)}),hw=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(),...GU,free:s.boolean().default(!1),limits:s.array(Lr).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:kd.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()}),Id=hw.superRefine((t,e)=>{Z_(t.grants,e)});var YU=/^\$\{[A-Z][A-Z0-9_]{0,127}\}$/,q_=s.string().min(3).max(200).refine(t=>YU.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."}),V_=s.object({maxAttempts:s.number().int().min(1).max(20).default(5),backoff:s.enum(["exponential","fixed"]).default("exponential")}),B_=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:q_,events:s.array(Zo).min(1,"webhooks.endpoints[].events must subscribe to \u2265 1 event"),enabled:s.boolean().default(!0),retryPolicy:V_.default({maxAttempts:5,backoff:"exponential"})}),H_=s.object({endpoints:s.array(B_).max(50).default([])});var XU=s.object({meters:s.array(cr).optional(),recurring_fee_cents:s.number().int().nonnegative().optional(),billing_interval:pn.optional(),grants:s.array(ar).max(40).optional(),creditPolicy:sr.optional(),trial_days:s.number().int().nonnegative().optional(),max_monthly_spend_cents:s.number().int().nonnegative().optional(),limits:s.array(Lr).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(),QU=s.object({url:s.string().url().optional(),secret:q_.optional(),events:s.array(Zo).optional(),enabled:s.boolean().optional(),retryPolicy:V_.partial().optional()}).strict(),e4=s.object({plans:s.record(s.string(),XU).optional(),webhooks:s.object({endpoints:s.record(s.string(),QU).optional()}).strict().optional()}).strict(),K_=s.record(s.string().min(1).max(64),e4);var gw=1,_w=["plans_table","usage_card","api_keys_panel","billing_summary","credit_balance","feature_panel","business_docs","audit_log","team_panel","markdown"],yw=["/","/pricing","/dashboard","/dashboard/*","/settings","/settings/*","/team","/audit-log","/docs","/docs/*","/terms","/privacy","/persona","/persona-sign-in"],vw=s.string().min(1).max(200).regex(/^\/[a-zA-Z0-9_./-]*$/,"path must start with / and contain only [a-zA-Z0-9_./-]"),G_=s.string().min(1).max(120).regex(/^[a-z0-9_-]+$/),bw=s.object({label:s.string().min(1).max(80),path:vw,capability:G_.optional()}),kw=s.enum(_w),xw=s.object({component:kw,props:s.record(s.string().min(1).max(80),s.unknown()).optional(),capability:G_.optional(),gateMode:s.enum(["hide","disable","upsell"]).default("hide")}),Sw=s.object({path:vw,title:s.string().min(1).max(120),requiresAuth:s.boolean(),capability:G_.optional(),components:s.array(xw).max(12).default([])}),W_=s.object({version:s.literal(gw),nav:s.array(bw).max(12).default([]),pages:s.array(Sw).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),$w(o.path)&&e.addIssue({code:"custom",message:`frontend page path "${o.path}" is reserved by the template`,path:["pages",r,"path"]})})});function $w(t){return yw.some(e=>{if(e.endsWith("/*")){let n=e.slice(0,-2);return t===n||t.startsWith(`${n}/`)}return t===e})}var Iw=s.enum(["subscription","subject"]),ww=s.enum(["reported","action_inferred"]),Ew=s.string().min(1).max(100).regex(/^[a-z0-9_.:-]+$/),Tw=s.object({name:Ew,display:s.string().min(1).max(120).optional(),scope:Iw.default("subscription"),subjectType:s.string().min(1).max(64).regex(/^[a-zA-Z0-9_.:-]+$/).optional(),countSource:ww.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"})}),J_=s.array(Tw).max(100).default([]);var Ow=/^[a-z0-9][a-z0-9_-]*$/,Y_=s.string().min(1).max(64).regex(Ow,"backend id must be a lowercase slug ([a-z0-9][a-z0-9_-]*)"),Pw=s.enum(["direct","tunnel"]),Rw=s.enum(["embedded","sidecar"]);var Nw=s.object({mode:Pw.default("direct"),runner:Rw.optional()}).strict(),Cw=s.object({required:s.boolean().default(!1)}).strict(),zw=s.object({name:s.string().min(1).max(120).optional(),slug:Y_.optional(),transport:Nw.default({mode:"direct"}),verification:Cw.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(),X_=s.record(Y_,zw),Fo=Y_,qo={unknownBackendInRoute:"UNKNOWN_BACKEND_IN_ROUTE",ambiguousDefaultBackend:"AMBIGUOUS_DEFAULT_BACKEND",routeMeterNotAllowedByBackend:"ROUTE_METER_NOT_ALLOWED_BY_BACKEND",unknownMeterInBackend:"UNKNOWN_METER_IN_BACKEND"};function Q_(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 t4=s.string().min(2).max(20).regex(/^\d+(ms|s|m|h)$/,"rate_limit window must look like `60s`, `5m`, `1h`"),Aw=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:t4,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"})}),Dw=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")}),jw=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"})}),Uw=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})}),Lw=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 ey=s.discriminatedUnion("type",[s.object({type:s.literal("rate_limit"),config:Aw}),s.object({type:s.literal("auth"),config:Dw}),s.object({type:s.literal("concurrency"),config:jw}),s.object({type:s.literal("retry"),config:Uw}),s.object({type:s.literal("transform"),config:Lw})]);var wd=s.enum(["long","short","blocking"]).default("long"),Mw=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 ty=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:Mw.default({}),mutation_class:s.enum(["runtime","contractual"]).default("runtime"),cacheProfile:wd}),ey);var r4=s.enum(["query","mutation"]),n4=s.enum(["none","metadata","full"]),o4=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)}),i4=s.object({resource:s.string().min(1).max(100).regex(/^[a-z0-9_.:-]+$/),effect:s.enum(["create","delete"])}),Zw=s.object({id:s.string().min(1).max(160).regex(/^[a-z0-9_.:-]+$/),title:s.string().min(1).max(160).optional(),kind:r4,actorType:s.string().min(1).max(64).regex(/^[a-zA-Z0-9_.:-]+$/).optional(),subject:o4.optional(),inputSchemaRef:s.string().min(1).max(240).optional(),audit:n4.default("metadata"),resource:i4.optional()});var Fw=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 a4(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 qw(t){return t.split(",").every(a4)}var Ed=s.union([s.string().min(1).max(100).refine(qw,{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)]),Vw=s.object({match:Fw,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:Ed.optional()}).optional(),unmetered:s.boolean().optional(),inheritDefaultMeters:s.boolean().optional(),action:s.string().min(1).max(160).regex(/^[a-z0-9_.:-]+$/).optional(),backend:Fo.optional(),usagePolicy:xd.optional()}).strict(),Bw=s.object({override_origin:s.string().url("override_origin must be a valid URL").nullable().default(null)}),Hw=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()}),ry=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:wd,routes:s.array(Vw).min(1).max(50),upstream:Bw.default({override_origin:null}),policies:s.array(s.string().min(1).max(64).regex(/^[a-z0-9_-]+$/)).max(20).default([]),runtime:Hw.default({}),plans:s.array(s.string().min(1).max(64)).max(20).default([]),actions:s.array(Zw).max(100).optional(),backend:Fo.optional()}).strict();function Kw(t,e){t.usagePricing!==void 0&&e.addIssue({code:"custom",path:["usagePricing"],message:"usagePricing is not supported. Define usage.meters.<key>.rating instead."})}function Gw(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&&(s4(o,r,e),c4(o,r,e))})}function s4(t,e,n){(tE(t)??0)!==0&&n.addIssue({code:"custom",path:["plans",e,"recurring_fee_cents"],message:"Free plans must have zero price"})}function c4(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 Ww(t,e){let n=new Map;t.forEach((o,r)=>{if(o.free)return;let i=tE(o);if(i===void 0||i<=0)return;let a=m4(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 Jw(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 Yw(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 Xw(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=ny(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 u4(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))l4(o,n);return n}function l4(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=ny(a);if(c.length>0){for(let u of c)i.add(u);continue}}}}function ny(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 d4(t){if(!t||typeof t!="object")return null;let e=t;return typeof e.dimension=="string"?e.dimension:null}var p4=new Set(["credits"]);function Qw(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=u4(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=d4(l);m&&(u.has(m)||o.has(m)||p4.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 eE(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:`${qo.unknownMeterInBackend}: backend "${u}" allows meter "${d}" but no metering.meters[] entry declares it.`})});let{defaultId:i,ambiguous:a}=Q_(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:`${qo.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:`${qo.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 ny(d))v.has(b)||e.addIssue({code:"custom",path:["features",u,"routes",p,"metering"],message:`${qo.routeMeterNotAllowedByBackend}: route meters "${b}" but backend "${m}" does not allow it (backend.meters[] = [${g.join(", ")}]).`})})}function tE(t){return t.recurring_fee_cents}function m4(t,e){return`USD:month:${e}`}var f4=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")}),rE=s.enum(["exact_pre_request","estimated_then_settled","postpaid","strict_concurrency"]),h4=s.enum(nw),oy=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:rE.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:h4.optional(),reserveStrategy:s.enum(["reserve_max","estimate","count_actual"]).optional(),reserveCeiling:s.number().int().positive().optional(),pairsWith:s.string().min(1).max(64).optional()}),nE=s.string().min(1).max(64).regex(/^[a-z0-9_]+$/,"Usage measure must be lowercase alphanumeric with underscores"),g4=s.enum(["pass_through","markup"]),_4=s.object({source:s.literal("fixed"),rates:s.record(s.string().min(1),s.record(nE,s.number().int().nonnegative()))}),y4=s.object({source:s.literal("provider_catalog"),catalog:s.string().min(1).max(100),pricePolicy:g4.default("pass_through"),markupPercent:s.number().nonnegative().max(1e4).optional(),marginMicros:s.number().int().nonnegative().optional()}),oE=s.discriminatedUnion("source",[_4,y4]),iE=s.object({selector:s.string().min(1).max(100).optional(),measures:s.array(nE).min(1).max(20),rating:oE.optional()}),aE=s.object({meters:s.record(s.string().min(1).max(64).regex(/^[a-z0-9_]+$/),iE)}),v4=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:Ed.optional()}),sE=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:v4.optional(),inheritDefaultMeters:s.boolean().optional(),backend:Fo.optional()}).strict(),iy=s.object({description:s.string().max(500).optional(),routes:s.array(sE).min(1).max(50),plans:s.array(s.string().min(1)).min(1).max(20)}),cE=s.record(s.string().min(1).max(100).regex(/^[a-z0-9_.:-]+$/),iy),uE=s.enum(["report","pull_request"]),lE=s.enum(["safe","non_blocking","economic_risk","blocking"]),dE=s.object({cleanup:s.object({enabled:s.boolean().default(!1),mode:uE.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(lE).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"]}}),pE=s.enum(["org_only","org_and_user"]),mE=s.enum(["clerk","test-personas"]),fE=s.object({identity_requirement:pE.optional(),context_tokens:s.object({enabled:s.boolean().default(!0)}).optional(),portal_auth:s.object({strategy:mE}).optional()}),hE=s.enum(["frontend","api","docs","widget","dashboard","webhook","worker","agent"]),gE=s.object({key:s.string().min(1).max(64).regex(/^[a-z0-9_-]+$/,"Surface key must be lowercase alphanumeric with hyphens/underscores"),type:hE,display:s.string().min(1).max(100).optional(),description:s.string().max(500).optional()}),_E=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(Lr).max(100).optional(),meters:s.array(s.string().min(1).max(64)).max(100).optional()}),yE=s.array(gE).max(20).default([]),vE=s.array(_E).max(100).default([]),bE=s.enum(["async_job","agent_task","scheduled","lifecycle","background"]),kE=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)})]),xE=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:bE,trigger:kE,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()}),SE=s.array(xE).max(100).default([]),mn=s.object({product:s.object({name:s.string().min(1).max(100),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"),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(oy).max(10).default([]),billOn4xx:s.boolean().default(!1)}).default({meters:[],billOn4xx:!1}),backend:X_.optional(),usage:aE.optional(),usagePricing:s.never({error:"usagePricing is not supported. Define usage.meters.<key>.rating instead."}).optional(),features:cE.optional(),resources:J_,policies:dE,customer_context:fE.optional(),surfaces:yE,entitlements:vE,workflows:SE,frontend:W_.optional(),billing:s.object({applyLimitUpgradesInstantly:s.boolean().optional(),subscriberChangePolicy:is.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(Id).max(4).default([]),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:H_.optional(),environments:K_.optional(),ephemeral:s.object({defaultPlan:s.string().min(1).optional()}).optional()}).superRefine((t,e)=>{Kw(t,e),Gw(t.plans,e),Ww(t.plans,e),Jw(t,e),Yw(t,e),Xw(t,e),Qw(t,e),eE(t,e)}),b4=s.object({product:mn.shape.product}),k4=s.object({gateway:mn.shape.gateway}),x4=s.object({metering:mn.shape.metering}),S4=s.object({plans:mn.shape.plans});var ay=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 $E=1;var $4=s.object({irVersion:s.literal($E),sdkVersion:s.string().min(1).max(64),product:mn,routes:s.array(ry).max(200).default([]),policies:s.array(ty).max(200).default([]),capabilities:s.array(ay).max(200).default([])}).strict();var wW=s.object({subscriberChangePolicy:is.optional()}),EW=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()}),TW=s.object({id:s.string(),actorUserId:s.string().optional(),action:s.string(),decision:s.string().optional(),timestamp:s.string(),details:s.unknown().optional()}),OW=s.object({name:s.string(),branch:s.string().optional(),isProduction:s.boolean().optional()}),PW=s.object({id:s.string(),name:s.string(),apiKeyId:s.string().optional()});var I4=["IMMEDIATE_NO_PRORATE","IMMEDIATE_PRORATE_CHARGE_NEW","IMMEDIATE_PRORATE_REFUND_OLD","IMMEDIATE_PRORATE_BOTH","DEFER_TO_PERIOD_END"],jW=s.enum(I4);var IE=s.object({id:s.string(),billingCycleId:s.string(),effectiveStart:s.string(),effectiveEnd:s.string(),compiledPlanId:s.string()}),wE=s.object({currentPeriod:IE,priorPeriod:IE.optional()});var w4=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(),subscriptionStatus:s.string(),subscriberStatus:s.string(),scopes:s.array(s.string()),periods:wE,expiresAt:s.number().optional(),trialEndsAt:s.string().optional()}),E4=s.discriminatedUnion("kind",[s.object({kind:s.literal("found"),state:w4,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)})]),qW=s.object({environmentId:s.string().nullable(),subjectKeys:s.array(s.string()).min(1).max(500)}),VW=s.object({results:s.array(s.object({subjectKey:s.string(),result:E4}))}),T4=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()}),BW=s.discriminatedUnion("kind",[s.object({kind:s.literal("found"),record:T4,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)})]),HW=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)})]),O4=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()}),KW=s.discriminatedUnion("kind",[s.object({kind:s.literal("found"),tenant:O4,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 Td=["consumer_api_key","consumer_session_token","test_persona_session_token","builder_master_key","builder_session_token","maker_jwt","service_jwt","internal_service","context_token"],EE=s.enum(Td);var P4=s.object({fromIssuer:s.string().min(1),fromTokenId:s.string().min(1),intent:s.string().min(1)}),TE=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(P4)});var sy=["template","embedded","provisioned","agent"],R4=s.enum(sy),N4=["builder_user","builder_org","maker","consumer_subject","internal_service","service_jwt","agent_runtime"],C4=s.enum(N4),OE=s.object({kind:C4,id:s.string().min(1),label:s.string().optional()}),z4=["subscription","organization","platform"],A4=s.enum(z4),D4=s.object({kind:A4,id:s.string().min(1)}),j4=s.object({type:EE,id:s.string().min(1),hint:s.string().max(8).optional()}),U4=s.object({compiledPlanId:s.string().min(1),fromCache:s.boolean().optional()}),PE=s.object({requestId:s.string().min(1),surface:R4,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:D4,credential:j4,capability:s.string().min(1),scopes:s.array(s.string()),entitlement:U4.optional(),trust:TE});var as;(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"})(as||(as={}));var RE=Object.values(as),pJ=s.enum(RE),NE=s.object({decisionId:s.string().optional(),ctx:PE,details:s.record(s.string(),s.unknown()).optional(),createdAt:s.string().min(1)}),L4=RE.filter(t=>t!==as.SYSTEM_ACTION),M4=NE.extend({kind:s.enum(L4)}),Z4=NE.extend({kind:s.literal(as.SYSTEM_ACTION),actorType:s.string().min(1),action:s.string().min(1)}),mJ=s.discriminatedUnion("kind",[M4,Z4]);var ue=["template","agent"],F4=["provisioned"],CE=[...sy],le=["builder_master_key","builder_session_token","maker_jwt"],Vo=["service_jwt","internal_service"],cy=["consumer_api_key","consumer_session_token","test_persona_session_token","context_token"],zE=[...Td],ss="subscriptions:write",q4=[{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:[ss],allowedSurfaces:ue,allowedCredentialTypes:[...le,...Vo],description:"Provision a new subscription for a subscriber"},{id:"subscriptions.update",operation:"Update a subscription",requiredScopes:[ss],allowedSurfaces:ue,allowedCredentialTypes:[...le,...Vo],description:"Change plan, enforcement mode, or schedule"},{id:"subscriptions.cancel",operation:"Cancel a subscription",requiredScopes:[ss],allowedSurfaces:ue,allowedCredentialTypes:[...le,...Vo],description:"Cancel a subscription (immediate or end-of-period)"},{id:"subscriptions.pause",operation:"Pause a subscription",requiredScopes:[ss],allowedSurfaces:ue,allowedCredentialTypes:[...le,...Vo],description:"Pause a subscription (no usage, no billing)"},{id:"subscriptions.resume",operation:"Resume a subscription",requiredScopes:[ss],allowedSurfaces:ue,allowedCredentialTypes:[...le,...Vo],description:"Resume a paused subscription"},{id:"subscriptions.read",operation:"Read a subscription",requiredScopes:["subscriptions:read"],allowedSurfaces:ue,allowedCredentialTypes:[...le,...Vo],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,...cy],description:"Mint a one-time Stripe portal-session redirect URL"},{id:"billing.read",operation:"Read billing state",requiredScopes:["billing:read"],allowedSurfaces:ue,allowedCredentialTypes:[...le,...cy],description:"Read invoices, balances, scheduled changes"},{id:"runtime-context.read",operation:"Read the caller's runtime context",requiredScopes:[],allowedSurfaces:CE,allowedCredentialTypes:zE,description:"Introspect the resolved RuntimeContext (minus secrets)"},{id:"capabilities.list",operation:"List registered capabilities",requiredScopes:[],allowedSurfaces:CE,allowedCredentialTypes:zE,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:F4,allowedCredentialTypes:cy,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."}],_J=Object.freeze(q4);var V4=["BusinessApplyWorkflow","RollbackWorkflow","StripeSyncWorkflow","WebhookDispatchWorkflow","SubscriptionTransitionWorkflow","CompiledPlanLifecycleWorkflow","ShardReshardWorkflow","MaintenanceJobWorkflow"],kJ=s.enum(V4),B4=["transient","permanent","rollback-required","human-intervention"],xJ=s.enum(B4);var H4=["SAFE_AUTOMATIC","REQUIRES_APPROVAL","IRREVERSIBLE","BILLING_IMPACTING","EDGE_BREAKING"],SJ=s.enum(H4);var OJ=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 K4=["GATEWAY","HOSTED_UI_PAGE","HOSTED_UI_PROXY"],G4=["platform_requests"],W4=s.object({requestId:s.string().optional(),productId:s.string().optional(),route:s.string().optional(),usageEventId:s.string().optional()}).strict(),J4=s.object({organizationId:s.string().min(1),source:s.enum(K4),dimension:s.enum(G4),quantity:s.number().int().positive(),idempotencyKey:s.string().min(1).max(512),occurredAt:s.string().datetime(),metadata:W4.optional()}).strict(),YJ=s.object({entries:s.array(J4).min(1).max(500)});var AE={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 Y4(t){return AE[t].mcpMayWrite}function X4(t){return AE[t].canonicalHome}function DE(t,e){return e==="write"&&!Y4(t)?`An MCP tool that writes cannot have operationClass "${t}": ${t}-class state is managed as code in the business repo (canonical home: ${X4(t)}). Make the tool read-only, or author the change in the manifest and push instead.`:null}var st={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 r3={missing_token:st.UNAUTHORIZED,invalid_token:st.UNAUTHORIZED,missing_signature:st.UNAUTHORIZED,malformed_signature:st.UNAUTHORIZED,unknown_key_id:st.UNAUTHORIZED,bad_signature:st.UNAUTHORIZED,expired_signature:st.UNAUTHORIZED,clock_skew:st.UNAUTHORIZED,replayed_nonce:st.UNAUTHORIZED,body_hash_mismatch:st.UNAUTHORIZED,route_mismatch:st.UNAUTHORIZED,environment_mismatch:st.UNAUTHORIZED,jwks_unavailable:st.SERVICE_UNAVAILABLE,body_too_large:st.VALIDATION_ERROR};var n3=Object.values(aw);var we={BATCHER_ENUM:"batcher-enum",RUNTIME_INLINE:"runtime-inline",CONSTRAINT:"constraint",GATEWAY_ERROR:"gateway-error"};var jE={limit_allocator_unavailable:{statuses:[503],source:we.BATCHER_ENUM,retryAfter:!0,verifiedAt:["engine/enforcement/runtime.ts:471"]},limit_exceeded:{statuses:[402],source:we.BATCHER_ENUM,retryAfter:!0,verifiedAt:["engine/enforcement/batcher.ts:326","engine/enforcement/constraints/quota.ts:69"]},rate_limited:{statuses:[429],source:we.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:we.BATCHER_ENUM,retryAfter:!0,verifiedAt:["engine/enforcement/batcher.ts:333"]},enforcement_denied:{statuses:[402],source:we.BATCHER_ENUM,retryAfter:!0,verifiedAt:["engine/enforcement/batcher.ts:335"]},feature_not_enabled:{statuses:[403],source:we.RUNTIME_INLINE,retryAfter:!1,verifiedAt:["engine/enforcement/runtime.ts:188"]},invalid_entitlement_shape:{statuses:[503],source:we.RUNTIME_INLINE,retryAfter:!0,verifiedAt:["engine/enforcement/runtime.ts:144"]},unsupported_constraint_schema:{statuses:[503],source:we.RUNTIME_INLINE,retryAfter:!1,verifiedAt:["engine/enforcement/runtime.ts:154"]},enforcement_error:{statuses:[500],source:we.RUNTIME_INLINE,retryAfter:!1,verifiedAt:["engine/enforcement/runtime.ts:342"]},enforcement_dependency_unavailable:{statuses:[503],source:we.RUNTIME_INLINE,retryAfter:!1,verifiedAt:["engine/enforcement/runtime.ts:427"]},concurrency_limit_exceeded:{statuses:[429],source:we.CONSTRAINT,retryAfter:!0,verifiedAt:["engine/enforcement/constraints/concurrency.ts"]},concurrency_context_unavailable:{statuses:[503],source:we.CONSTRAINT,retryAfter:!0,verifiedAt:["engine/enforcement/constraints/concurrency.ts:291"]},concurrency_coordinator_unavailable:{statuses:[503],source:we.CONSTRAINT,retryAfter:!0,verifiedAt:["engine/enforcement/constraints/concurrency.ts:305"]},key_expired:{statuses:[401],source:we.CONSTRAINT,retryAfter:!1,verifiedAt:["engine/enforcement/constraints/credential-validity.ts:33"]},geo_context_unavailable:{statuses:[503],source:we.CONSTRAINT,retryAfter:!0,verifiedAt:["engine/enforcement/constraints/geo-restriction.ts:44"]},geo_blocked:{statuses:[403],source:we.CONSTRAINT,retryAfter:!1,verifiedAt:["engine/enforcement/constraints/geo-restriction.ts:51"]},geo_not_allowed:{statuses:[403],source:we.CONSTRAINT,retryAfter:!1,verifiedAt:["engine/enforcement/constraints/geo-restriction.ts:58"]},resource_count_limit_exceeded:{statuses:[403,402],source:we.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:we.CONSTRAINT,retryAfter:!1,verifiedAt:["engine/enforcement/constraints/capacity.ts"]},resolver_rate_limited:{statuses:[503],source:we.GATEWAY_ERROR,retryAfter:!0,verifiedAt:["engine/errors.ts:55"]},resolver_unavailable:{statuses:[503],source:we.GATEWAY_ERROR,retryAfter:!0,verifiedAt:["engine/errors.ts:73"]},credential_resolver_miss_rate_limited:{statuses:[429],source:we.GATEWAY_ERROR,retryAfter:!0,verifiedAt:["engine/errors.ts:89"]},provider_throttled:{statuses:[503],source:we.GATEWAY_ERROR,retryAfter:!0,verifiedAt:["engine/pipeline/provider-adapter.ts"]}},Q4=Object.keys(jE);var eL=new Set([429,503]),i3=new Set(Q4.filter(t=>jE[t].statuses.every(e=>eL.has(e))));var tL=["quota","rate","concurrency","capacity","spend","adaptive"],s3=new Set(tL);var rL=[402,403,413,429],u3=new Set(rL);import{existsSync as ly,mkdirSync as nL,readFileSync as ZE,writeFileSync as m5}from"node:fs";import{homedir as oL}from"node:os";import{join as dy}from"node:path";var UE="https://core.farthershore.com";var py=dy(oL(),".farthershore"),LE=dy(py,"config.json"),ME=dy(py,"credentials.json");function iL(t){ly(t)||nL(t,{recursive:!0,mode:448})}var uy={apiUrl:UE};function FE(){if(iL(py),!ly(LE))return uy;try{let t=JSON.parse(ZE(LE,"utf-8"));return{...uy,...t}}catch{return uy}}function qE(){if(!ly(ME))return null;try{return JSON.parse(ZE(ME,"utf-8"))}catch{return null}}var C=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=qE();if(n?.token)return n.token;throw new C("Not authenticated. Run `farthershore auth login` or set FARTHERSHORE_TOKEN environment variable.")}var Bo="x-fs-surface",Ho="cli",aL="management";function fn(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 HE(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",[Bo]:Ho}});if(!c.ok){let l=(await c.json().catch(()=>null))?.error,d=typeof l=="string"?{message:l}:l;throw new C(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]===aL}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",[Bo]:Ho};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 C(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,[Bo]:Ho};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,M=typeof E=="string"?{message:E}:E;throw new C(M?.message??v.statusText,v.status,{code:M?.code,details:M?.details})}if(v.status!==204)return v.json()}return{exchangeCliToken:n,authWhoami:async()=>{if(t.token.startsWith("mk_")){let u=await i("GET","/management/whoami");return{kind:"maker",tokenId:u.tokenId,organizationId:u.organizationId,productId:u.productId,scopes:u.scopes}}return{kind:"builder",...await i("POST","/builder/context/bootstrap")}},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",fn(`/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",fn(`/businesses/${c}`,{env:u?.env})),getDeployments:c=>i("GET",`/businesses/${c}/deployments`),listChangeSets:(c,u)=>i("GET",fn(`/businesses/${c}/change-sets`,{env:u?.env})),compileManifest:(c,u,l)=>i("POST",`/businesses/${c}/manifest/compile`,{ir:u,...l?.env?{env:l.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,u)=>i("DELETE",`/businesses/${c}`,u?.deleteGitHubRepo?{deleteGitHubRepo:!0}:void 0),builderListConsumers:(c,u)=>i("GET",fn(`/businesses/${c}/consumers`,{env:u?.env})),builderBlockConsumer:(c,u)=>i("POST",`/businesses/${c}/consumers/${encodeURIComponent(u)}/block`),builderRemoveConsumer:(c,u)=>i("POST",`/businesses/${c}/consumers/${encodeURIComponent(u)}/remove`),listPromoCodes:c=>i("GET",`/businesses/${c}/promo-codes`),createPromoCode:(c,u)=>i("POST",`/businesses/${c}/promo-codes`,u),updatePromoCode:(c,u,l)=>i("PATCH",`/businesses/${c}/promo-codes/${u}`,l),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`),managementListWebhooks:(c,u)=>i("GET",fn(`/management/businesses/${c}/webhooks`,{limit:u?.limit})),managementCreateWebhook:(c,u,l)=>i("POST",`/management/businesses/${c}/webhooks`,u,l),managementUpdateWebhook:(c,u,l,d)=>i("PATCH",`/management/businesses/${c}/webhooks/${u}`,l,d),managementDeleteWebhook:(c,u)=>i("DELETE",`/management/businesses/${c}/webhooks/${u}`),managementTestWebhook:(c,u)=>i("POST",`/management/businesses/${c}/webhooks/${u}/test`),managementListWebhookDeliveries:(c,u,l)=>i("GET",fn(`/management/businesses/${c}/webhooks/${u}/deliveries`,{limit:l?.limit})),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),builderBusinessSecrets:(c,u)=>i("GET",`/businesses/${c}/secrets${u?`?environmentId=${encodeURIComponent(u)}`:""}`),builderSetBusinessSecret:(c,u)=>i("POST",`/businesses/${c}/secrets`,u),builderDeleteBusinessSecret:(c,u,l)=>i("DELETE",`/businesses/${c}/secrets/${encodeURIComponent(u)}${l?`?environmentId=${encodeURIComponent(l)}`:""}`),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",[Bo]:Ho},body:JSON.stringify(l??{})});if(!d.ok){let m=(await d.json().catch(()=>null))?.error,f=typeof m=="string"?{message:m}:m;throw new C(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}`,[Bo]:Ho}});if(!l.ok){let p=(await l.json().catch(()=>null))?.error,m=typeof p=="string"?{message:p}:p;throw new C(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}`,[Bo]:Ho}});if(!d.ok){let m=(await d.json().catch(()=>null))?.error,f=typeof m=="string"?{message:m}:m;throw new C(f?.message??d.statusText,d.status,{code:f?.code,details:f?.details})}return d.json()},getProductConfig:(c,u)=>i("GET",fn(`/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`,GE=(t=0)=>e=>`\x1B[${38+t};5;${e}m`,WE=(t=0)=>(e,n,o)=>`\x1B[${38+t};2;${e};${n};${o}m`,$e={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]}},$5=Object.keys($e.modifier),sL=Object.keys($e.color),cL=Object.keys($e.bgColor),I5=[...sL,...cL];function uL(){let t=new Map;for(let[e,n]of Object.entries($e)){for(let[o,r]of Object.entries(n))$e[o]={open:`\x1B[${r[0]}m`,close:`\x1B[${r[1]}m`},n[o]=$e[o],t.set(r[0],r[1]);Object.defineProperty($e,e,{value:n,enumerable:!1})}return Object.defineProperty($e,"codes",{value:t,enumerable:!1}),$e.color.close="\x1B[39m",$e.bgColor.close="\x1B[49m",$e.color.ansi=KE(),$e.color.ansi256=GE(),$e.color.ansi16m=WE(),$e.bgColor.ansi=KE(10),$e.bgColor.ansi256=GE(10),$e.bgColor.ansi16m=WE(10),Object.defineProperties($e,{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=>$e.rgbToAnsi256(...$e.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)=>$e.ansi256ToAnsi($e.rgbToAnsi256(e,n,o)),enumerable:!1},hexToAnsi:{value:e=>$e.ansi256ToAnsi($e.hexToAnsi256(e)),enumerable:!1}}),$e}var lL=uL(),Ut=lL;import my from"node:process";import dL from"node:os";import JE from"node:tty";function St(t,e=globalThis.Deno?globalThis.Deno.args:my.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:Ie}=my,Od;St("no-color")||St("no-colors")||St("color=false")||St("color=never")?Od=0:(St("color")||St("colors")||St("color=true")||St("color=always"))&&(Od=1);function pL(){if("FORCE_COLOR"in Ie)return Ie.FORCE_COLOR==="true"?1:Ie.FORCE_COLOR==="false"?0:Ie.FORCE_COLOR.length===0?1:Math.min(Number.parseInt(Ie.FORCE_COLOR,10),3)}function mL(t){return t===0?!1:{level:t,hasBasic:!0,has256:t>=2,has16m:t>=3}}function fL(t,{streamIsTTY:e,sniffFlags:n=!0}={}){let o=pL();o!==void 0&&(Od=o);let r=n?Od:o;if(r===0)return 0;if(n){if(St("color=16m")||St("color=full")||St("color=truecolor"))return 3;if(St("color=256"))return 2}if("TF_BUILD"in Ie&&"AGENT_NAME"in Ie)return 1;if(t&&!e&&r===void 0)return 0;let i=r||0;if(Ie.TERM==="dumb")return i;if(my.platform==="win32"){let a=dL.release().split(".");return Number(a[0])>=10&&Number(a[2])>=10586?Number(a[2])>=14931?3:2:1}if("CI"in Ie)return["GITHUB_ACTIONS","GITEA_ACTIONS","CIRCLECI"].some(a=>a in Ie)?3:["TRAVIS","APPVEYOR","GITLAB_CI","BUILDKITE","DRONE"].some(a=>a in Ie)||Ie.CI_NAME==="codeship"?1:i;if("TEAMCITY_VERSION"in Ie)return/^(9\.(0*[1-9]\d*)\.|\d{2,}\.)/.test(Ie.TEAMCITY_VERSION)?1:0;if(Ie.COLORTERM==="truecolor"||Ie.TERM==="xterm-kitty"||Ie.TERM==="xterm-ghostty"||Ie.TERM==="wezterm")return 3;if("TERM_PROGRAM"in Ie){let a=Number.parseInt((Ie.TERM_PROGRAM_VERSION||"").split(".")[0],10);switch(Ie.TERM_PROGRAM){case"iTerm.app":return a>=3?3:2;case"Apple_Terminal":return 2}}return/-256(color)?$/i.test(Ie.TERM)?2:/^screen|^xterm|^vt100|^vt220|^rxvt|color|ansi|cygwin|linux/i.test(Ie.TERM)||"COLORTERM"in Ie?1:i}function YE(t,e={}){let n=fL(t,{streamIsTTY:t&&t.isTTY,...e});return mL(n)}var hL={stdout:YE({isTTY:JE.isatty(1)}),stderr:YE({isTTY:JE.isatty(2)})},XE=hL;function QE(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 eT(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 zl(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===w.ZodEnum)return{type:"object",required:t.keyType._def.values,properties:t.keyType._def.values.reduce((o,r)=>({...o,[r]:V(t.valueType._def,{...e,currentPath:[...e.currentPath,"properties",r]})??Se(e)}),{}),additionalProperties:e.rejectedAdditionalProperties};let n={type:"object",additionalProperties:V(t.valueType._def,{...e,currentPath:[...e.currentPath,"additionalProperties"]})??e.allowedAdditionalProperties};if(e.target==="openApi3")return n;if(t.keyType?._def.typeName===w.ZodString&&t.keyType._def.checks?.length){let{type:o,...r}=Cl(t.keyType._def,e);return{...n,propertyNames:r}}else{if(t.keyType?._def.typeName===w.ZodEnum)return{...n,propertyNames:{enum:t.keyType._def.values}};if(t.keyType?._def.typeName===w.ZodBranded&&t.keyType._def.type._def.typeName===w.ZodString&&t.keyType._def.type._def.checks?.length){let{type:o,...r}=Nl(t.keyType._def,e);return{...n,propertyNames:r}}}return n}function Rx(t,e){if(e.mapStrategy==="record")return zl(t,e);let n=V(t.keyType._def,{...e,currentPath:[...e.currentPath,"items","items","0"]})||Se(e),o=V(t.valueType._def,{...e,currentPath:[...e.currentPath,"items","items","1"]})||Se(e);return{type:"array",maxItems:125,items:{type:"array",items:[n,o],minItems:2,maxItems:2}}}function Nx(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 Cx(t){return t.target==="openAi"?void 0:{not:Se({...t,currentPath:[...t.currentPath,"not"]})}}function zx(t){return t.target==="openApi3"?{enum:["null"],nullable:!0}:{type:"null"}}var wa={ZodString:"string",ZodNumber:"number",ZodBigInt:"integer",ZodBoolean:"boolean",ZodNull:"null"};function Dx(t,e){if(e.target==="openApi3")return Ax(t,e);let n=t.options instanceof Map?Array.from(t.options.values()):t.options;if(n.every(o=>o._def.typeName in wa&&(!o._def.checks||!o._def.checks.length))){let o=n.reduce((r,i)=>{let a=wa[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 Ax(t,e)}var Ax=(t,e)=>{let n=(t.options instanceof Map?Array.from(t.options.values()):t.options).map((o,r)=>V(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 jx(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:wa[t.innerType._def.typeName],nullable:!0}:{type:[wa[t.innerType._def.typeName],"null"]};if(e.target==="openApi3"){let o=V(t.innerType._def,{...e,currentPath:[...e.currentPath]});return o&&"$ref"in o?{allOf:[o],nullable:!0}:o&&{...o,nullable:!0}}let n=V(t.innerType._def,{...e,currentPath:[...e.currentPath,"anyOf","0"]});return n&&{anyOf:[n,{type:"null"}]}}function Ux(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",zh(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 Lx(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=AN(u);l&&n&&(u._def.typeName==="ZodOptional"&&(u=u._def.innerType),u.isNullable()||(u=u.nullable()),l=!1);let d=V(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=zN(t,e);return a!==void 0&&(o.additionalProperties=a),o}function zN(t,e){if(t.catchall._def.typeName!=="ZodNever")return V(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 AN(t){try{return t.isOptional()}catch{return!0}}var Mx=(t,e)=>{if(e.currentPath.toString()===e.propertyPath?.toString())return V(t.innerType._def,e);let n=V(t.innerType._def,{...e,currentPath:[...e.currentPath,"anyOf","1"]});return n?{anyOf:[{not:Se(e)},n]}:Se(e)};var Zx=(t,e)=>{if(e.pipeStrategy==="input")return V(t.in._def,e);if(e.pipeStrategy==="output")return V(t.out._def,e);let n=V(t.in._def,{...e,currentPath:[...e.currentPath,"allOf","0"]}),o=V(t.out._def,{...e,currentPath:[...e.currentPath,"allOf",n?"1":"0"]});return{allOf:[n,o].filter(r=>r!==void 0)}};function Fx(t,e){return V(t.type._def,e)}function qx(t,e){let o={type:"array",uniqueItems:!0,items:V(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 Vx(t,e){return t.rest?{type:"array",minItems:t.items.length,items:t.items.map((n,o)=>V(n._def,{...e,currentPath:[...e.currentPath,"items",`${o}`]})).reduce((n,o)=>o===void 0?n:[...n,o],[]),additionalItems:V(t.rest._def,{...e,currentPath:[...e.currentPath,"additionalItems"]})}:{type:"array",minItems:t.items.length,maxItems:t.items.length,items:t.items.map((n,o)=>V(n._def,{...e,currentPath:[...e.currentPath,"items",`${o}`]})).reduce((n,o)=>o===void 0?n:[...n,o],[])}}function Bx(t){return{not:Se(t)}}function Hx(t){return Se(t)}var Kx=(t,e)=>V(t.innerType._def,e);var Gx=(t,e,n)=>{switch(e){case w.ZodString:return Cl(t,n);case w.ZodNumber:return Ux(t,n);case w.ZodObject:return Lx(t,n);case w.ZodBigInt:return xx(t,n);case w.ZodBoolean:return Sx();case w.ZodDate:return Ah(t,n);case w.ZodUndefined:return Bx(n);case w.ZodNull:return zx(n);case w.ZodArray:return kx(t,n);case w.ZodUnion:case w.ZodDiscriminatedUnion:return Dx(t,n);case w.ZodIntersection:return Tx(t,n);case w.ZodTuple:return Vx(t,n);case w.ZodRecord:return zl(t,n);case w.ZodLiteral:return Ox(t,n);case w.ZodEnum:return Ex(t);case w.ZodNativeEnum:return Nx(t);case w.ZodNullable:return jx(t,n);case w.ZodOptional:return Mx(t,n);case w.ZodMap:return Rx(t,n);case w.ZodSet:return qx(t,n);case w.ZodLazy:return()=>t.getter()._def;case w.ZodPromise:return Fx(t,n);case w.ZodNaN:case w.ZodNever:return Cx(n);case w.ZodEffects:return wx(t,n);case w.ZodAny:return Se(n);case w.ZodUnknown:return Hx(n);case w.ZodDefault:return Ix(t,n);case w.ZodBranded:return Nl(t,n);case w.ZodReadonly:return Kx(t,n);case w.ZodCatch:return $x(t,n);case w.ZodPipeline:return Zx(t,n);case w.ZodFunction:case w.ZodVoid:case w.ZodSymbol:return;default:return(o=>{})(e)}};function V(t,e,n=!1){let o=e.seen.get(t);if(e.override){let c=e.override?.(t,e,o,n);if(c!==yx)return c}if(o&&!n){let c=DN(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=Gx(t,t.typeName,e),a=typeof i=="function"?V(i(),e):i;if(a&&jN(t,e,a),e.postProcess){let c=e.postProcess(a,t,e);return r.jsonSchema=a,c}return r.jsonSchema=a,a}var DN=(t,e)=>{switch(e.$refStrategy){case"root":return{$ref:t.path.join("/")};case"relative":return{$ref:Rl(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`),Se(e)):e.$refStrategy==="seen"?Se(e):void 0}},jN=(t,e,n)=>(t.description&&(n.description=t.description,e.markdownDescription&&(n.markdownDescription=t.description)),n);var Uh=(t,e)=>{let n=bx(e),o=typeof e=="object"&&e.definitions?Object.entries(e.definitions).reduce((u,[l,d])=>({...u,[l]:V(d._def,{...n,currentPath:[...n.basePath,n.definitionPath,l]},!0)??Se(n)}),{}):void 0,r=typeof e=="string"?e:e?.nameStrategy==="title"?void 0:e?.name,i=V(t._def,r===void 0?n:{...n,currentPath:[...n.basePath,n.definitionPath,r]},!1)??Se(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 UN(t){return!t||t==="jsonSchema7"||t==="draft-7"?"draft-7":t==="jsonSchema2019-09"||t==="draft-2020-12"?"draft-2020-12":"draft-7"}function Lh(t,e){return yt(t)?Wr(t,{target:UN(e?.target),io:e?.pipeStrategy??"input"}):Uh(t,{strictUnions:e?.strictUnions??!0,pipeStrategy:e?.pipeStrategy??"input"})}function Mh(t){let n=Tr(t)?.method;if(!n)throw new Error("Schema is missing a method literal");let o=Pl(n);if(typeof o!="string")throw new Error("Schema method literal must be a string");return o}function Zh(t,e){let n=Er(t,e);if(!n.success)throw n.error;return n.data}var LN=6e4,Al=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(al,n=>{this._oncancel(n)}),this.setNotificationHandler(cl,n=>{this._onprogress(n)}),this.setRequestHandler(sl,n=>({})),this._taskStore=e?.taskStore,this._taskMessageQueue=e?.taskMessageQueue,this._taskStore&&(this.setRequestHandler(ul,async(n,o)=>{let r=await this._taskStore.getTask(n.params.taskId,o.sessionId);if(!r)throw new j(Z.InvalidParams,"Failed to retrieve task: Task not found");return{...r}}),this.setRequestHandler(dl,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(Z.InvalidParams,`Task not found: ${i}`);if(!Or(a.status))return await this._waitForTaskUpdate(i,o.signal),await r();if(Or(a.status)){let c=await this._taskStore.getTaskResult(i,o.sessionId);return this._clearTaskQueue(i),{...c,_meta:{...c._meta,[Sr]:{taskId:i}}}}return await r()};return await r()}),this.setRequestHandler(pl,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(Z.InvalidParams,`Failed to list tasks: ${r instanceof Error?r.message:String(r)}`)}}),this.setRequestHandler(fl,async(n,o)=>{try{let r=await this._taskStore.getTask(n.params.taskId,o.sessionId);if(!r)throw new j(Z.InvalidParams,`Task not found: ${n.params.taskId}`);if(Or(r.status))throw new j(Z.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(Z.InvalidParams,`Task not found after cancellation: ${n.params.taskId}`);return{_meta:{},...i}}catch(r){throw r instanceof j?r:new j(Z.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(Z.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),ia(i)||Jk(i)?this._onresponse(i):ph(i)?this._onrequest(i,a):Wk(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(Z.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?.[Sr]?.taskId;if(o===void 0){let d={jsonrpc:"2.0",id:e.id,error:{code:Z.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=Hk(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(Z.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:Z.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),ia(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(ia(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),ia(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(Z.InternalError,String(a))}}return}let i;try{let a=await this.request(e,no,o);if(a.task)i=a.task.taskId,yield{type:"taskCreated",task:a.task};else throw new j(Z.InternalError,"Task creation did not return a task");for(;;){let c=await this.getTask({taskId:i},o);if(yield{type:"taskStatus",task:c},Or(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(Z.InternalError,`Task ${i} failed`)}:c.status==="cancelled"&&(yield{type:"error",error:new j(Z.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(Z.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=M=>{d(M)};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(M){p(M);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||{},[Sr]:u}});let g=M=>{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(M)}},{relatedRequestId:r,resumptionToken:i,onresumptiontoken:a}).catch(F=>this._onerror(new Error(`Failed to send cancellation: ${F}`)));let U=M instanceof j?M:new j(Z.RequestTimeout,String(M));d(U)};this._responseHandlers.set(m,M=>{if(!o?.signal?.aborted){if(M instanceof Error)return d(M);try{let U=Er(n,M.result);U.success?l(U.data):d(U.error)}catch(U){d(U)}}}),o?.signal?.addEventListener("abort",()=>{g(o?.signal?.reason)});let v=o?.timeout??LN,b=()=>g(j.fromError(Z.RequestTimeout,"Request timed out",{timeout:v}));this._setupTimeout(m,v,o?.maxTotalTimeout,b,o?.resetTimeoutOnProgress??!1);let E=u?.taskId;if(E){let M=U=>{let F=this._responseHandlers.get(m);F?F(U):this._onerror(new Error(`Response handler missing for side-channeled request ${m}`))};this._requestResolvers.set(m,M),this._enqueueTaskMessage(E,{type:"request",message:f,timestamp:Date.now()}).catch(U=>{this._cleanupTimeout(m),d(U)})}else this._transport.send(f,{relatedRequestId:r,resumptionToken:i,onresumptiontoken:a}).catch(M=>{this._cleanupTimeout(m),d(M)})})}async getTask(e,n){return this.request({method:"tasks/get",params:e},ll,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},ml,n)}async cancelTask(e,n){return this.request({method:"tasks/cancel",params:e},Qk,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||{},[Sr]: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||{},[Sr]: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||{},[Sr]:n.relatedTask}}}),await this._transport.send(a,n)}setRequestHandler(e,n){let o=Mh(e);this.assertRequestHandlerCapability(o),this._requestHandlers.set(o,(r,i)=>{let a=Zh(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=Mh(e);this._notificationHandlers.set(o,r=>{let i=Zh(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"&&ph(r.message)){let i=r.message.id,a=this._requestResolvers.get(i);a?(a(new j(Z.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(Z.InvalidRequest,"Request cancelled"));return}let a=setTimeout(r,o);n.addEventListener("abort",()=>{clearTimeout(a),i(new j(Z.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(Z.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=la.parse({method:"notifications/tasks/status",params:c});await this.notification(u),Or(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(Z.InvalidParams,`Task "${r}" not found - it may have been cleaned up`);if(Or(c.status))throw new j(Z.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=la.parse({method:"notifications/tasks/status",params:u});await this.notification(l),Or(u.status)&&this._cleanupTaskProgressHandler(r)}},listTasks:r=>o.listTasks(r,n)}}};function Wx(t){return t!==null&&typeof t=="object"&&!Array.isArray(t)}function Jx(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];Wx(a)&&Wx(i)?n[r]={...a,...i}:n[r]=i}return n}var ZI=jy(E_(),1),FI=jy(MI(),1);function F1(){let t=new ZI.default({strict:!1,validateFormats:!0,validateSchema:!1,allErrors:!0});return(0,FI.default)(t),t}var gd=class{constructor(e){this._ajv=e??F1()}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 _d=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},ma,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},ao,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 qI(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 VI(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 yd=class extends Al{constructor(e,n){super(n),this._serverInfo=e,this._loggingLevels=new Map,this.LOG_LEVEL_SEVERITY=new Map(pa.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 gd,this.setRequestHandler(hh,o=>this._oninitialize(o)),this.setNotificationHandler(gh,()=>this.oninitialized?.()),this._capabilities.logging&&this.setRequestHandler(Sh,async(o,r)=>{let i=r.sessionId||r.requestInfo?.headers["mcp-session-id"]||void 0,{level:a}=o.params,c=pa.safeParse(a);return c.success&&this._loggingLevels.set(i,c.data),{}})}get experimental(){return this._experimental||(this._experimental={tasks:new _d(this)}),this._experimental}registerCapabilities(e){if(this.transport)throw new Error("Cannot register capabilities after connecting to transport");this._capabilities=Jx(this._capabilities,e)}setRequestHandler(e,n){let r=Tr(e)?.method;if(!r)throw new Error("Schema is missing a method literal");let i;if(yt(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=Er(io,u);if(!d.success){let g=d.error instanceof Error?d.error.message:String(d.error);throw new j(Z.InvalidParams,`Invalid tools/call request: ${g}`)}let{params:p}=d.data,m=await Promise.resolve(n(u,l));if(p.task){let g=Er(no,m);if(!g.success){let v=g.error instanceof Error?g.error.message:String(g.error);throw new j(Z.InvalidParams,`Invalid task creation result: ${v}`)}return g.data}let f=Er(kl,m);if(!f.success){let g=f.error instanceof Error?f.error.message:String(f.error);throw new j(Z.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){VI(this._clientCapabilities?.tasks?.requests,e,"Client")}assertTaskHandlerCapability(e){this._capabilities&&qI(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:qk.includes(n)?n:lh,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"},il)}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},$h,n):this.request({method:"sampling/createMessage",params:e},ma,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},ao,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},ao,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(Z.InvalidParams,`Elicitation response content does not match requested schema: ${c.errorMessage}`)}catch(a){throw a instanceof j?a:new j(Z.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},Ih,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 HI=Symbol.for("mcp.completable");function A_(t){return!!t&&typeof t=="object"&&HI in t}function KI(t){return t[HI]?.complete}var BI;(function(t){t.Completable="McpCompletable"})(BI||(BI={}));var q1=/^[A-Za-z0-9._-]{1,128}$/;function V1(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"),!q1.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 B1(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 D_(t){let e=V1(t);return B1(t,e.warnings),e.isValid}var vd=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 bd=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 yd(e,n)}get experimental(){return this._experimental||(this._experimental={tasks:new vd(this)}),this._experimental}async connect(e){return await this.server.connect(e)}async close(){await this.server.close()}setToolRequestHandlers(){this._toolHandlersInitialized||(this.server.assertCanSetRequestHandler(Ur(bl)),this.server.assertCanSetRequestHandler(Ur(io)),this.server.registerCapabilities({tools:{listChanged:!0}}),this.server.setRequestHandler(bl,()=>({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=xo(n.inputSchema);return r?Lh(r,{strictUnions:!0,pipeStrategy:"input"}):H1})(),annotations:n.annotations,execution:n.execution,_meta:n._meta};if(n.outputSchema){let r=xo(n.outputSchema);r&&(o.outputSchema=Lh(r,{strictUnions:!0,pipeStrategy:"output"}))}return o})})),this.server.setRequestHandler(io,async(e,n)=>{try{let o=this._registeredTools[e.params.name];if(!o)throw new j(Z.InvalidParams,`Tool ${e.params.name} not found`);if(!o.enabled)throw new j(Z.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(Z.InternalError,`Tool ${e.params.name} has taskSupport '${i}' but was not registered with registerToolTask`);if(i==="required"&&!r)throw new j(Z.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===Z.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=xo(e.inputSchema)??e.inputSchema,a=await Tl(i,n);if(!a.success){let c="error"in a?a.error:"Unknown error",u=Ol(c);throw new j(Z.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(Z.InvalidParams,`Output validation error: Tool ${o} has an output schema but no structured content was provided`);let r=xo(e.outputSchema),i=await Tl(r,n.structuredContent);if(!i.success){let a="error"in i?i.error:"Unknown error",c=Ol(a);throw new j(Z.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(Z.InternalError,`Task ${u} not found during polling`);l=p}return await o.taskStore.getTaskResult(u)}setCompletionRequestHandler(){this._completionHandlerInitialized||(this.server.assertCanSetRequestHandler(Ur(xl)),this.server.registerCapabilities({completions:{}}),this.server.setRequestHandler(xl,async e=>{switch(e.params.ref.type){case"ref/prompt":return ix(e),this.handlePromptCompletion(e,e.params.ref);case"ref/resource":return ax(e),this.handleResourceCompletion(e,e.params.ref);default:throw new j(Z.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(Z.InvalidParams,`Prompt ${n.name} not found`);if(!o.enabled)throw new j(Z.InvalidParams,`Prompt ${n.name} disabled`);if(!o.argsSchema)return rs;let i=Tr(o.argsSchema)?.[e.params.argument.name];if(!A_(i))return rs;let a=KI(i);if(!a)return rs;let c=await a(e.params.argument.value,e.params.context);return WI(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 rs;throw new j(Z.InvalidParams,`Resource template ${e.params.ref.uri} not found`)}let r=o.resourceTemplate.completeCallback(e.params.argument.name);if(!r)return rs;let i=await r(e.params.argument.value,e.params.context);return WI(i)}setResourceRequestHandlers(){this._resourceHandlersInitialized||(this.server.assertCanSetRequestHandler(Ur(hl)),this.server.assertCanSetRequestHandler(Ur(gl)),this.server.assertCanSetRequestHandler(Ur(_l)),this.server.registerCapabilities({resources:{listChanged:!0}}),this.server.setRequestHandler(hl,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(gl,async()=>({resourceTemplates:Object.entries(this._registeredResourceTemplates).map(([n,o])=>({name:n,uriTemplate:o.resourceTemplate.uriTemplate.toString(),...o.metadata}))})),this.server.setRequestHandler(_l,async(e,n)=>{let o=new URL(e.params.uri),r=this._registeredResources[o.toString()];if(r){if(!r.enabled)throw new j(Z.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(Z.InvalidParams,`Resource ${o} not found`)}),this._resourceHandlersInitialized=!0)}setPromptRequestHandlers(){this._promptHandlersInitialized||(this.server.assertCanSetRequestHandler(Ur(yl)),this.server.assertCanSetRequestHandler(Ur(vl)),this.server.registerCapabilities({prompts:{listChanged:!0}}),this.server.setRequestHandler(yl,()=>({prompts:Object.entries(this._registeredPrompts).filter(([,e])=>e.enabled).map(([e,n])=>({name:e,title:n.title,description:n.description,arguments:n.argsSchema?K1(n.argsSchema):void 0}))})),this.server.setRequestHandler(vl,async(e,n)=>{let o=this._registeredPrompts[e.params.name];if(!o)throw new j(Z.InvalidParams,`Prompt ${e.params.name} not found`);if(!o.enabled)throw new j(Z.InvalidParams,`Prompt ${e.params.name} disabled`);if(o.argsSchema){let r=xo(o.argsSchema),i=await Tl(r,e.params.arguments);if(!i.success){let u="error"in i?i.error:"Unknown error",l=Ol(u);throw new j(Z.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:Qr(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=Qr(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 to?u._def?.innerType:u;return A_(l)})&&this.setCompletionRequestHandler(),a}_createRegisteredTool(e,n,o,r,i,a,c,u,l){D_(e);let d={title:n,description:o,inputSchema:GI(r),outputSchema:GI(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"&&D_(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=Qr(p.paramsSchema)),typeof p.outputSchema<"u"&&(d.outputSchema=Qr(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(j_(u))r=n.shift(),n.length>1&&typeof n[0]=="object"&&n[0]!==null&&!j_(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 H1={type:"object",properties:{}};function JI(t){return t!==null&&typeof t=="object"&&"parse"in t&&typeof t.parse=="function"&&"safeParse"in t&&typeof t.safeParse=="function"}function YI(t){return"_def"in t||"_zod"in t||JI(t)}function j_(t){return typeof t!="object"||t===null||YI(t)?!1:Object.keys(t).length===0?!0:Object.values(t).some(JI)}function GI(t){if(t){if(j_(t))return Qr(t);if(!YI(t))throw new Error("inputSchema must be a Zod schema or raw shape, received an unrecognized object");return t}}function K1(t){let e=Tr(t);return e?Object.entries(e).map(([n,o])=>{let r=hx(o),i=gx(o);return{name:n,description:r,required:!i}}):[]}function Ur(t){let n=Tr(t)?.method;if(!n)throw new Error("Schema is missing a method literal");let o=Pl(n);if(typeof o=="string")return o;throw new Error("Schema method literal must be a string")}function WI(t){return{completion:{values:t.slice(0,100),total:t.length,hasMore:t.length>100}}}var rs={completion:{values:[],hasMore:!1}};var ns=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(),XI=s.enum(["SUM","COUNT","MAX","UNIQUE_COUNT","LATEST"]),U_=s.object({d:s.number().int().nonnegative(),w:s.number().int().positive(),c:s.number().nonnegative(),agg:XI.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:ns.optional()}),G1=s.object({kind:s.literal("credential_validity")}),W1=s.object({kind:s.literal("track_only_bypass")}),J1=s.object({kind:s.literal("lifecycle_block"),blockOn:s.array(s.string()).default(["SUSPENDED","CANCELLED","INACTIVE"]),code:s.string().default("subscription_inactive")}),Y1=s.object({kind:s.literal("identity_requirement"),require:s.enum(["org_only","org_and_user"]).default("org_only")}),X1=s.object({kind:s.literal("scope"),requireExplicit:s.boolean().default(!0)}),Q1=s.object({kind:s.literal("feature_gate"),feature:s.string().min(1).max(120)}),eU=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`"}),tU=s.enum(["fixed_window","sliding_window","token_bucket"]),rU=U_.extend({kind:s.literal("rate_limit"),m:s.enum(["e","t"]).default("e"),strategy:tU.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"]}))}),nU=s.enum(["fixed_window","sliding_window"]),oU=U_.extend({kind:s.literal("quota"),ovr:s.enum(["BLOCK","ALLOW_AND_BILL"]),strategy:nU.default("fixed_window")}),iU=U_.extend({kind:s.literal("credit_balance"),ovr:s.enum(["BLOCK","ALLOW_AND_BILL"])}),aU=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)}),sU=s.object({kind:s.literal("capability_limit"),capability:s.string().min(1).max(120),limit:s.union([s.number().int().nonnegative(),s.boolean()])}),cU=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()}),uU=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)}),lU=s.enum(["plan","manual","provider"]),kd=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:ns.optional()}).refine(QI,{message:"capacity requires at least one ceiling (maxInputTokens / maxOutputTokens / maxContextTokens / maxPayloadBytes)"});function QI(t){return t.maxInputTokens!==void 0||t.maxOutputTokens!==void 0||t.maxContextTokens!==void 0||t.maxPayloadBytes!==void 0}var dU=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:ns.optional(),provenance:lU.optional()}).refine(QI,{message:"capacity requires at least one ceiling (maxInputTokens / maxOutputTokens / maxContextTokens / maxPayloadBytes)"}),L_=s.discriminatedUnion("kind",[G1,W1,J1,Y1,X1,Q1,eU,rU,oU,iU,sU,cU,aU,uU,dU]);var os=["customer_feature","control_plane","admin_internal","background_job","webhook","healthcheck","unclassified"],RH=new Set(os);var xd=s.object({trafficClass:s.enum(os),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 FH=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 ew=s.object({unit:s.enum(["requests","tokens","computeMs","dollars"]),window:s.enum(["second","minute","hour","day","week","month"]),capacity:s.number()}),pU=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()}),qH=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(ew).readonly().optional(),userLimits:s.array(ew).readonly().optional(),environmentId:s.string().optional(),contextTokenSecret:s.string().nullable().optional(),timeoutMs:s.number().positive().optional(),idleTimeoutMs:s.number().positive().optional(),backends:s.array(pU).optional(),defaultBackendId:s.string().optional(),verificationRequired:s.boolean().optional()});var mU=s.object({perRequestMinUnitsByDim:s.record(s.string(),s.number()).optional(),creditPoolMicros:s.number().optional(),perDimUnitCostMicros:s.record(s.string(),s.number()).optional()}),fU=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()}),hU=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()}),gU=s.object({feature:s.string(),method:s.string(),path:s.string(),meters:s.array(s.string()).optional(),usagePolicy:xd.optional(),policyResolutionMode:s.enum(["legacy","policy"]).optional()}),VH=s.object({v:s.number(),sub:s.string(),compiledPlanId:s.string().min(1),planType:s.string(),ts:s.number(),constraints:s.array(L_),cv:s.number(),policyResolutionMode:s.enum(["legacy","policy"]).optional(),dm:s.record(s.string(),s.number()),dmv:s.number().optional(),floor:mU.nullable().optional(),displayDims:s.array(s.number()).optional(),meterSemantics:s.record(s.string(),hU).optional(),rp:s.record(s.string(),fU).optional(),fr:s.array(gU).optional(),sig:s.string().min(1),sigKid:s.string().optional(),environmentId:s.string().optional()}).passthrough();var BH=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(),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 _U=["DRAFT","ACTIVE"],GH=s.enum(_U),yU=["ONBOARDING","ACTIVE","SUSPENDED"],tw=s.enum(yU),vU=["ACTIVE","REVOKED"],WH=s.enum(vU),bU=["BLOCK","ALLOW_AND_BILL"],rw=s.enum(bU),kU=["ACTIVE","ARCHIVED"],JH=s.enum(kU),xU=["ACTIVE","EXPERIMENTAL","LEGACY_STABLE","PHASING_OUT","SUPERSEDED","ARCHIVED"],YH=s.enum(xU);var nw=["input","output","total","cached_read_input","cache_creation_input","context","max_output","estimated_output","actual_output","streaming_output"],Sd=[{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 ow(t){let e=t.trim().toLowerCase();return Sd.find(n=>n.id===e)}function iw(){return Sd.map(t=>t.id)}var SU="FS_RUNTIME_TOKEN";var $U={payload:"x-fs-metering",signature:"x-fs-metering-sig",token:"x-fs-metering-token"};var rK={environmentVariable:SU,presentation:$U.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 nK=10*1024*1024;var IU=["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"],aK=s.enum(IU);var wU=s.object({d:s.number(),w:s.number(),capacity:s.number(),remaining:s.number(),windowStart:s.number(),windowEnd:s.number()}),EU=s.record(s.string(),wU),TU=s.object({allocations:s.array(s.number()),expiresAt:s.number()}),OU=s.record(s.string(),TU),PU=s.record(s.string(),s.bigint()),mK=s.object({subscriptionId:s.string(),handoffToken:s.string(),targetShardId:s.string(),policyVersion:s.number(),entitlementVersion:s.number().nullable(),windowStates:EU,activeLeases:OU,totalsByDimension:PU.optional(),billingCycleId:s.string().nullable().optional(),billingCycleStartMs:s.number().optional()});var RU={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"},yK=Object.values(RU);var NU=["managed_frontend","custom_frontend","embedded_sdk","public_api","cli","agent","webhook","admin","internal"],cw=s.enum(NU),sw=s.string().min(1).max(128),CU=s.object({d:s.number().int().nonnegative(),w:s.number().int().positive(),rem:s.number(),cap:s.number()}).strict(),uw=s.object({v:s.literal(1),entV:s.number().int().nonnegative().optional(),entHash:sw.optional(),featureGrant:s.boolean().optional(),gates:s.array(sw).max(16).optional(),limits:s.array(CU).max(16).optional()}).strict();var zU=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:tw,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:rw.optional(),environment:s.enum(["production","sandbox"]).optional(),surface:cw.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:uw.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(os).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 AU=s.object({path:s.string(),code:s.string(),message:s.string()}),TK=s.object({reason:s.literal("schema_validation_failed"),receivedAt:s.string(),rawPayload:s.unknown(),issues:s.array(AU),consumerVersion:s.string().optional(),originalMessageId:s.string().optional()});var M_=["subscription.created","subscription.updated","subscription.canceled","payment.succeeded","payment.failed","rate_limit.exceeded","entitlement.changed","usage.threshold_reached"],Zo=s.enum(M_);var jt=s.enum(["immediate","period_end"]),is=s.object({default:jt.default("period_end"),when:s.object({price_increase:jt.optional(),price_decrease:jt.optional(),feature_added:jt.optional(),feature_removed:jt.optional(),limit_increased:jt.optional(),limit_reduced:jt.optional(),credit_increased:jt.optional(),credit_reduced:jt.optional(),rating_changed:jt.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 DU=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()}),jU=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()}),ar=s.discriminatedUnion("kind",[DU,jU]);function lw(t){return t.kind==="credit"&&t.recurs===!0&&t.label===void 0}function dw(t){return t.kind==="credit"&&t.recurs!==!0&&t.label===void 0}function Z_(t,e,n=["grants"]){if(!t)return;let o=0,r=0;for(let i of t)lw(i)?o+=1:dw(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 pw(t){return t.grants&&t.grants.length>0?[...t.grants]:[]}function F_(t){return pw(t).find(lw)?.amount_cents??0}function $d(t){return pw(t).find(dw)?.amount_cents??0}var UU=s.object({percent:s.number().int().min(0).max(100)}),LU=s.object({threshold_cents:s.number().int().nonnegative(),refill_cents:s.number().int().positive()}),sr=s.object({rollover:UU.optional(),auto_recharge:LU.optional()});var mw=s.enum(["linear","active_count"]);var MU=s.object({up_to:s.number().int().positive().nullable(),price_per_unit_micros:s.number().int().nonnegative()}),ZU=s.object({strategy:s.enum(["graduated","volume"]),tiers:s.array(MU).min(1).max(20)}),cr=s.object({dimension:s.string().min(1).max(64).regex(/^[a-z0-9_]+$/,"Meter dimension must be lowercase alphanumeric with underscores"),kind:mw.default("linear"),price_per_unit_micros:s.number().int().nonnegative().default(0),tiered:ZU.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"]})}}),pn=s.enum(["month","year"]),FU=s.object({meters:s.array(cr).default([]),recurring_fee_cents:s.number().int().nonnegative().default(0),billing_interval:pn.default("month"),grants:s.array(ar).max(40).default([]),creditPolicy:sr.optional(),trial_days:s.number().int().nonnegative().default(0),max_monthly_spend_cents:s.number().int().nonnegative().optional()});var qU=s.string().min(1),VU=s.object({type:s.literal("named"),name:s.enum(["second","minute","hour","day","week","month"])}),BU=s.object({type:s.literal("custom"),seconds:s.number().int().positive(),label:s.string().optional()}),HU=s.discriminatedUnion("type",[VU,BU]),Lr=s.object({dimension:qU,window:HU,capacity:s.number().nonnegative(),enforcement:s.enum(["enforce","track"]).optional(),warnAt:s.number().min(0).max(1).optional(),scope:ns.optional(),acknowledgeUnreachable:s.boolean().optional()}),VK=s.array(Lr).max(20);var KU=s.enum(["NONE","PRORATE","CREDIT"]).default("NONE"),GU={meters:s.array(cr).default([]),recurring_fee_cents:s.number().int().nonnegative().default(0),billing_interval:pn.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(ar).max(40).default([]),creditPolicy:sr.optional()},WU={meters:s.array(cr).optional(),recurring_fee_cents:s.number().int().nonnegative().optional(),billing_interval:pn.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(ar).max(40).optional(),creditPolicy:sr.optional()},JU=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:KU,...WU,limits:s.array(Lr).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:kd.optional()}),fw=JU.superRefine((t,e)=>{Z_(t.grants,e)}),hw=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(),...GU,free:s.boolean().default(!1),limits:s.array(Lr).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:kd.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()}),Id=hw.superRefine((t,e)=>{Z_(t.grants,e)});var YU=/^\$\{[A-Z][A-Z0-9_]{0,127}\}$/,q_=s.string().min(3).max(200).refine(t=>YU.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."}),V_=s.object({maxAttempts:s.number().int().min(1).max(20).default(5),backoff:s.enum(["exponential","fixed"]).default("exponential")}),B_=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:q_,events:s.array(Zo).min(1,"webhooks.endpoints[].events must subscribe to \u2265 1 event"),enabled:s.boolean().default(!0),retryPolicy:V_.default({maxAttempts:5,backoff:"exponential"})}),H_=s.object({endpoints:s.array(B_).max(50).default([])});var XU=s.object({meters:s.array(cr).optional(),recurring_fee_cents:s.number().int().nonnegative().optional(),billing_interval:pn.optional(),grants:s.array(ar).max(40).optional(),creditPolicy:sr.optional(),trial_days:s.number().int().nonnegative().optional(),max_monthly_spend_cents:s.number().int().nonnegative().optional(),limits:s.array(Lr).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(),QU=s.object({url:s.string().url().optional(),secret:q_.optional(),events:s.array(Zo).optional(),enabled:s.boolean().optional(),retryPolicy:V_.partial().optional()}).strict(),e4=s.object({plans:s.record(s.string(),XU).optional(),webhooks:s.object({endpoints:s.record(s.string(),QU).optional()}).strict().optional()}).strict(),K_=s.record(s.string().min(1).max(64),e4);var gw=1,_w=["plans_table","usage_card","api_keys_panel","billing_summary","credit_balance","feature_panel","business_docs","audit_log","team_panel","markdown"],yw=["/","/pricing","/dashboard","/dashboard/*","/settings","/settings/*","/team","/audit-log","/docs","/docs/*","/terms","/privacy","/persona","/persona-sign-in"],vw=s.string().min(1).max(200).regex(/^\/[a-zA-Z0-9_./-]*$/,"path must start with / and contain only [a-zA-Z0-9_./-]"),G_=s.string().min(1).max(120).regex(/^[a-z0-9_-]+$/),bw=s.object({label:s.string().min(1).max(80),path:vw,capability:G_.optional()}),kw=s.enum(_w),xw=s.object({component:kw,props:s.record(s.string().min(1).max(80),s.unknown()).optional(),capability:G_.optional(),gateMode:s.enum(["hide","disable","upsell"]).default("hide")}),Sw=s.object({path:vw,title:s.string().min(1).max(120),requiresAuth:s.boolean(),capability:G_.optional(),components:s.array(xw).max(12).default([])}),W_=s.object({version:s.literal(gw),nav:s.array(bw).max(12).default([]),pages:s.array(Sw).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),$w(o.path)&&e.addIssue({code:"custom",message:`frontend page path "${o.path}" is reserved by the template`,path:["pages",r,"path"]})})});function $w(t){return yw.some(e=>{if(e.endsWith("/*")){let n=e.slice(0,-2);return t===n||t.startsWith(`${n}/`)}return t===e})}var Iw=s.enum(["subscription","subject"]),ww=s.enum(["reported","action_inferred"]),Ew=s.string().min(1).max(100).regex(/^[a-z0-9_.:-]+$/),Tw=s.object({name:Ew,display:s.string().min(1).max(120).optional(),scope:Iw.default("subscription"),subjectType:s.string().min(1).max(64).regex(/^[a-zA-Z0-9_.:-]+$/).optional(),countSource:ww.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"})}),J_=s.array(Tw).max(100).default([]);var Ow=/^[a-z0-9][a-z0-9_-]*$/,Y_=s.string().min(1).max(64).regex(Ow,"backend id must be a lowercase slug ([a-z0-9][a-z0-9_-]*)"),Pw=s.enum(["direct","tunnel"]),Rw=s.enum(["embedded","sidecar"]);var Nw=s.object({mode:Pw.default("direct"),runner:Rw.optional()}).strict(),Cw=s.object({required:s.boolean().default(!1)}).strict(),zw=s.object({name:s.string().min(1).max(120).optional(),slug:Y_.optional(),transport:Nw.default({mode:"direct"}),verification:Cw.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(),X_=s.record(Y_,zw),Fo=Y_,qo={unknownBackendInRoute:"UNKNOWN_BACKEND_IN_ROUTE",ambiguousDefaultBackend:"AMBIGUOUS_DEFAULT_BACKEND",routeMeterNotAllowedByBackend:"ROUTE_METER_NOT_ALLOWED_BY_BACKEND",unknownMeterInBackend:"UNKNOWN_METER_IN_BACKEND"};function Q_(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 t4=s.string().min(2).max(20).regex(/^\d+(ms|s|m|h)$/,"rate_limit window must look like `60s`, `5m`, `1h`"),Aw=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:t4,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"})}),Dw=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")}),jw=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"})}),Uw=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})}),Lw=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 ey=s.discriminatedUnion("type",[s.object({type:s.literal("rate_limit"),config:Aw}),s.object({type:s.literal("auth"),config:Dw}),s.object({type:s.literal("concurrency"),config:jw}),s.object({type:s.literal("retry"),config:Uw}),s.object({type:s.literal("transform"),config:Lw})]);var wd=s.enum(["long","short","blocking"]).default("long"),Mw=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 ty=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:Mw.default({}),mutation_class:s.enum(["runtime","contractual"]).default("runtime"),cacheProfile:wd}),ey);var r4=s.enum(["query","mutation"]),n4=s.enum(["none","metadata","full"]),o4=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)}),i4=s.object({resource:s.string().min(1).max(100).regex(/^[a-z0-9_.:-]+$/),effect:s.enum(["create","delete"])}),Zw=s.object({id:s.string().min(1).max(160).regex(/^[a-z0-9_.:-]+$/),title:s.string().min(1).max(160).optional(),kind:r4,actorType:s.string().min(1).max(64).regex(/^[a-zA-Z0-9_.:-]+$/).optional(),subject:o4.optional(),inputSchemaRef:s.string().min(1).max(240).optional(),audit:n4.default("metadata"),resource:i4.optional()});var Fw=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 a4(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 qw(t){return t.split(",").every(a4)}var Ed=s.union([s.string().min(1).max(100).refine(qw,{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)]),Vw=s.object({match:Fw,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:Ed.optional()}).optional(),unmetered:s.boolean().optional(),inheritDefaultMeters:s.boolean().optional(),action:s.string().min(1).max(160).regex(/^[a-z0-9_.:-]+$/).optional(),backend:Fo.optional(),usagePolicy:xd.optional()}).strict(),Bw=s.object({override_origin:s.string().url("override_origin must be a valid URL").nullable().default(null)}),Hw=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()}),ry=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:wd,routes:s.array(Vw).min(1).max(50),upstream:Bw.default({override_origin:null}),policies:s.array(s.string().min(1).max(64).regex(/^[a-z0-9_-]+$/)).max(20).default([]),runtime:Hw.default({}),plans:s.array(s.string().min(1).max(64)).max(20).default([]),actions:s.array(Zw).max(100).optional(),backend:Fo.optional()}).strict();function Kw(t,e){t.usagePricing!==void 0&&e.addIssue({code:"custom",path:["usagePricing"],message:"usagePricing is not supported. Define usage.meters.<key>.rating instead."})}function Gw(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&&(s4(o,r,e),c4(o,r,e))})}function s4(t,e,n){(tE(t)??0)!==0&&n.addIssue({code:"custom",path:["plans",e,"recurring_fee_cents"],message:"Free plans must have zero price"})}function c4(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 Ww(t,e){let n=new Map;t.forEach((o,r)=>{if(o.free)return;let i=tE(o);if(i===void 0||i<=0)return;let a=m4(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 Jw(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 Yw(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 Xw(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=ny(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 u4(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))l4(o,n);return n}function l4(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=ny(a);if(c.length>0){for(let u of c)i.add(u);continue}}}}function ny(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 d4(t){if(!t||typeof t!="object")return null;let e=t;return typeof e.dimension=="string"?e.dimension:null}var p4=new Set(["credits"]);function Qw(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=u4(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=d4(l);m&&(u.has(m)||o.has(m)||p4.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 eE(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:`${qo.unknownMeterInBackend}: backend "${u}" allows meter "${d}" but no metering.meters[] entry declares it.`})});let{defaultId:i,ambiguous:a}=Q_(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:`${qo.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:`${qo.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 ny(d))v.has(b)||e.addIssue({code:"custom",path:["features",u,"routes",p,"metering"],message:`${qo.routeMeterNotAllowedByBackend}: route meters "${b}" but backend "${m}" does not allow it (backend.meters[] = [${g.join(", ")}]).`})})}function tE(t){return t.recurring_fee_cents}function m4(t,e){return`USD:month:${e}`}var f4=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")}),rE=s.enum(["exact_pre_request","estimated_then_settled","postpaid","strict_concurrency"]),h4=s.enum(nw),oy=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:rE.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:h4.optional(),reserveStrategy:s.enum(["reserve_max","estimate","count_actual"]).optional(),reserveCeiling:s.number().int().positive().optional(),pairsWith:s.string().min(1).max(64).optional()}),nE=s.string().min(1).max(64).regex(/^[a-z0-9_]+$/,"Usage measure must be lowercase alphanumeric with underscores"),g4=s.enum(["pass_through","markup"]),_4=s.object({source:s.literal("fixed"),rates:s.record(s.string().min(1),s.record(nE,s.number().int().nonnegative()))}),y4=s.object({source:s.literal("provider_catalog"),catalog:s.string().min(1).max(100),pricePolicy:g4.default("pass_through"),markupPercent:s.number().nonnegative().max(1e4).optional(),marginMicros:s.number().int().nonnegative().optional()}),oE=s.discriminatedUnion("source",[_4,y4]),iE=s.object({selector:s.string().min(1).max(100).optional(),measures:s.array(nE).min(1).max(20),rating:oE.optional()}),aE=s.object({meters:s.record(s.string().min(1).max(64).regex(/^[a-z0-9_]+$/),iE)}),v4=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:Ed.optional()}),sE=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:v4.optional(),inheritDefaultMeters:s.boolean().optional(),backend:Fo.optional()}).strict(),iy=s.object({description:s.string().max(500).optional(),routes:s.array(sE).min(1).max(50),plans:s.array(s.string().min(1)).min(1).max(20)}),cE=s.record(s.string().min(1).max(100).regex(/^[a-z0-9_.:-]+$/),iy),uE=s.enum(["report","pull_request"]),lE=s.enum(["safe","non_blocking","economic_risk","blocking"]),dE=s.object({cleanup:s.object({enabled:s.boolean().default(!1),mode:uE.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(lE).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"]}}),pE=s.enum(["org_only","org_and_user"]),mE=s.enum(["clerk","test-personas"]),fE=s.object({identity_requirement:pE.optional(),context_tokens:s.object({enabled:s.boolean().default(!0)}).optional(),portal_auth:s.object({strategy:mE}).optional()}),hE=s.enum(["frontend","api","docs","widget","dashboard","webhook","worker","agent"]),gE=s.object({key:s.string().min(1).max(64).regex(/^[a-z0-9_-]+$/,"Surface key must be lowercase alphanumeric with hyphens/underscores"),type:hE,display:s.string().min(1).max(100).optional(),description:s.string().max(500).optional()}),_E=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(Lr).max(100).optional(),meters:s.array(s.string().min(1).max(64)).max(100).optional()}),yE=s.array(gE).max(20).default([]),vE=s.array(_E).max(100).default([]),bE=s.enum(["async_job","agent_task","scheduled","lifecycle","background"]),kE=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)})]),xE=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:bE,trigger:kE,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()}),SE=s.array(xE).max(100).default([]),mn=s.object({product:s.object({name:s.string().min(1).max(100),visibility:s.enum(["public","private"]).default("public"),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(oy).max(10).default([]),billOn4xx:s.boolean().default(!1)}).default({meters:[],billOn4xx:!1}),backend:X_.optional(),usage:aE.optional(),usagePricing:s.never({error:"usagePricing is not supported. Define usage.meters.<key>.rating instead."}).optional(),features:cE.optional(),resources:J_,policies:dE,customer_context:fE.optional(),surfaces:yE,entitlements:vE,workflows:SE,frontend:W_.optional(),billing:s.object({applyLimitUpgradesInstantly:s.boolean().optional(),subscriberChangePolicy:is.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(Id).max(4).default([]),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:H_.optional(),environments:K_.optional(),ephemeral:s.object({defaultPlan:s.string().min(1).optional()}).optional()}).superRefine((t,e)=>{Kw(t,e),Gw(t.plans,e),Ww(t.plans,e),Jw(t,e),Yw(t,e),Xw(t,e),Qw(t,e),eE(t,e)}),b4=s.object({product:mn.shape.product}),k4=s.object({gateway:mn.shape.gateway}),x4=s.object({metering:mn.shape.metering}),S4=s.object({plans:mn.shape.plans});var ay=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 $E=1;var $4=s.object({irVersion:s.literal($E),sdkVersion:s.string().min(1).max(64),product:mn,routes:s.array(ry).max(200).default([]),policies:s.array(ty).max(200).default([]),capabilities:s.array(ay).max(200).default([])}).strict();var wW=s.object({subscriberChangePolicy:is.optional()}),EW=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()}),TW=s.object({id:s.string(),actorUserId:s.string().optional(),action:s.string(),decision:s.string().optional(),timestamp:s.string(),details:s.unknown().optional()}),OW=s.object({name:s.string(),branch:s.string().optional(),isProduction:s.boolean().optional()}),PW=s.object({id:s.string(),name:s.string(),apiKeyId:s.string().optional()});var I4=["IMMEDIATE_NO_PRORATE","IMMEDIATE_PRORATE_CHARGE_NEW","IMMEDIATE_PRORATE_REFUND_OLD","IMMEDIATE_PRORATE_BOTH","DEFER_TO_PERIOD_END"],jW=s.enum(I4);var IE=s.object({id:s.string(),billingCycleId:s.string(),effectiveStart:s.string(),effectiveEnd:s.string(),compiledPlanId:s.string()}),wE=s.object({currentPeriod:IE,priorPeriod:IE.optional()});var w4=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(),subscriptionStatus:s.string(),subscriberStatus:s.string(),scopes:s.array(s.string()),periods:wE,expiresAt:s.number().optional(),trialEndsAt:s.string().optional()}),E4=s.discriminatedUnion("kind",[s.object({kind:s.literal("found"),state:w4,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)})]),qW=s.object({environmentId:s.string().nullable(),subjectKeys:s.array(s.string()).min(1).max(500)}),VW=s.object({results:s.array(s.object({subjectKey:s.string(),result:E4}))}),T4=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()}),BW=s.discriminatedUnion("kind",[s.object({kind:s.literal("found"),record:T4,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)})]),HW=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)})]),O4=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()}),KW=s.discriminatedUnion("kind",[s.object({kind:s.literal("found"),tenant:O4,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 Td=["consumer_api_key","consumer_session_token","test_persona_session_token","builder_master_key","builder_session_token","maker_jwt","service_jwt","internal_service","context_token"],EE=s.enum(Td);var P4=s.object({fromIssuer:s.string().min(1),fromTokenId:s.string().min(1),intent:s.string().min(1)}),TE=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(P4)});var sy=["template","embedded","provisioned","agent"],R4=s.enum(sy),N4=["builder_user","builder_org","maker","consumer_subject","internal_service","service_jwt","agent_runtime"],C4=s.enum(N4),OE=s.object({kind:C4,id:s.string().min(1),label:s.string().optional()}),z4=["subscription","organization","platform"],A4=s.enum(z4),D4=s.object({kind:A4,id:s.string().min(1)}),j4=s.object({type:EE,id:s.string().min(1),hint:s.string().max(8).optional()}),U4=s.object({compiledPlanId:s.string().min(1),fromCache:s.boolean().optional()}),PE=s.object({requestId:s.string().min(1),surface:R4,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:D4,credential:j4,capability:s.string().min(1),scopes:s.array(s.string()),entitlement:U4.optional(),trust:TE});var as;(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"})(as||(as={}));var RE=Object.values(as),pJ=s.enum(RE),NE=s.object({decisionId:s.string().optional(),ctx:PE,details:s.record(s.string(),s.unknown()).optional(),createdAt:s.string().min(1)}),L4=RE.filter(t=>t!==as.SYSTEM_ACTION),M4=NE.extend({kind:s.enum(L4)}),Z4=NE.extend({kind:s.literal(as.SYSTEM_ACTION),actorType:s.string().min(1),action:s.string().min(1)}),mJ=s.discriminatedUnion("kind",[M4,Z4]);var ue=["template","agent"],F4=["provisioned"],CE=[...sy],le=["builder_master_key","builder_session_token","maker_jwt"],Vo=["service_jwt","internal_service"],cy=["consumer_api_key","consumer_session_token","test_persona_session_token","context_token"],zE=[...Td],ss="subscriptions:write",q4=[{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:[ss],allowedSurfaces:ue,allowedCredentialTypes:[...le,...Vo],description:"Provision a new subscription for a subscriber"},{id:"subscriptions.update",operation:"Update a subscription",requiredScopes:[ss],allowedSurfaces:ue,allowedCredentialTypes:[...le,...Vo],description:"Change plan, enforcement mode, or schedule"},{id:"subscriptions.cancel",operation:"Cancel a subscription",requiredScopes:[ss],allowedSurfaces:ue,allowedCredentialTypes:[...le,...Vo],description:"Cancel a subscription (immediate or end-of-period)"},{id:"subscriptions.pause",operation:"Pause a subscription",requiredScopes:[ss],allowedSurfaces:ue,allowedCredentialTypes:[...le,...Vo],description:"Pause a subscription (no usage, no billing)"},{id:"subscriptions.resume",operation:"Resume a subscription",requiredScopes:[ss],allowedSurfaces:ue,allowedCredentialTypes:[...le,...Vo],description:"Resume a paused subscription"},{id:"subscriptions.read",operation:"Read a subscription",requiredScopes:["subscriptions:read"],allowedSurfaces:ue,allowedCredentialTypes:[...le,...Vo],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,...cy],description:"Mint a one-time Stripe portal-session redirect URL"},{id:"billing.read",operation:"Read billing state",requiredScopes:["billing:read"],allowedSurfaces:ue,allowedCredentialTypes:[...le,...cy],description:"Read invoices, balances, scheduled changes"},{id:"runtime-context.read",operation:"Read the caller's runtime context",requiredScopes:[],allowedSurfaces:CE,allowedCredentialTypes:zE,description:"Introspect the resolved RuntimeContext (minus secrets)"},{id:"capabilities.list",operation:"List registered capabilities",requiredScopes:[],allowedSurfaces:CE,allowedCredentialTypes:zE,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:F4,allowedCredentialTypes:cy,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."}],_J=Object.freeze(q4);var V4=["BusinessApplyWorkflow","RollbackWorkflow","StripeSyncWorkflow","WebhookDispatchWorkflow","SubscriptionTransitionWorkflow","CompiledPlanLifecycleWorkflow","ShardReshardWorkflow","MaintenanceJobWorkflow"],kJ=s.enum(V4),B4=["transient","permanent","rollback-required","human-intervention"],xJ=s.enum(B4);var H4=["SAFE_AUTOMATIC","REQUIRES_APPROVAL","IRREVERSIBLE","BILLING_IMPACTING","EDGE_BREAKING"],SJ=s.enum(H4);var OJ=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 K4=["GATEWAY","HOSTED_UI_PAGE","HOSTED_UI_PROXY"],G4=["platform_requests"],W4=s.object({requestId:s.string().optional(),productId:s.string().optional(),route:s.string().optional(),usageEventId:s.string().optional()}).strict(),J4=s.object({organizationId:s.string().min(1),source:s.enum(K4),dimension:s.enum(G4),quantity:s.number().int().positive(),idempotencyKey:s.string().min(1).max(512),occurredAt:s.string().datetime(),metadata:W4.optional()}).strict(),YJ=s.object({entries:s.array(J4).min(1).max(500)});var AE={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 Y4(t){return AE[t].mcpMayWrite}function X4(t){return AE[t].canonicalHome}function DE(t,e){return e==="write"&&!Y4(t)?`An MCP tool that writes cannot have operationClass "${t}": ${t}-class state is managed as code in the business repo (canonical home: ${X4(t)}). Make the tool read-only, or author the change in the manifest and push instead.`:null}var st={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 r3={missing_token:st.UNAUTHORIZED,invalid_token:st.UNAUTHORIZED,missing_signature:st.UNAUTHORIZED,malformed_signature:st.UNAUTHORIZED,unknown_key_id:st.UNAUTHORIZED,bad_signature:st.UNAUTHORIZED,expired_signature:st.UNAUTHORIZED,clock_skew:st.UNAUTHORIZED,replayed_nonce:st.UNAUTHORIZED,body_hash_mismatch:st.UNAUTHORIZED,route_mismatch:st.UNAUTHORIZED,environment_mismatch:st.UNAUTHORIZED,jwks_unavailable:st.SERVICE_UNAVAILABLE,body_too_large:st.VALIDATION_ERROR};var n3=Object.values(aw);var we={BATCHER_ENUM:"batcher-enum",RUNTIME_INLINE:"runtime-inline",CONSTRAINT:"constraint",GATEWAY_ERROR:"gateway-error"};var jE={limit_allocator_unavailable:{statuses:[503],source:we.BATCHER_ENUM,retryAfter:!0,verifiedAt:["engine/enforcement/runtime.ts:471"]},limit_exceeded:{statuses:[402],source:we.BATCHER_ENUM,retryAfter:!0,verifiedAt:["engine/enforcement/batcher.ts:326","engine/enforcement/constraints/quota.ts:69"]},rate_limited:{statuses:[429],source:we.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:we.BATCHER_ENUM,retryAfter:!0,verifiedAt:["engine/enforcement/batcher.ts:333"]},enforcement_denied:{statuses:[402],source:we.BATCHER_ENUM,retryAfter:!0,verifiedAt:["engine/enforcement/batcher.ts:335"]},feature_not_enabled:{statuses:[403],source:we.RUNTIME_INLINE,retryAfter:!1,verifiedAt:["engine/enforcement/runtime.ts:188"]},invalid_entitlement_shape:{statuses:[503],source:we.RUNTIME_INLINE,retryAfter:!0,verifiedAt:["engine/enforcement/runtime.ts:144"]},unsupported_constraint_schema:{statuses:[503],source:we.RUNTIME_INLINE,retryAfter:!1,verifiedAt:["engine/enforcement/runtime.ts:154"]},enforcement_error:{statuses:[500],source:we.RUNTIME_INLINE,retryAfter:!1,verifiedAt:["engine/enforcement/runtime.ts:342"]},enforcement_dependency_unavailable:{statuses:[503],source:we.RUNTIME_INLINE,retryAfter:!1,verifiedAt:["engine/enforcement/runtime.ts:427"]},concurrency_limit_exceeded:{statuses:[429],source:we.CONSTRAINT,retryAfter:!0,verifiedAt:["engine/enforcement/constraints/concurrency.ts"]},concurrency_context_unavailable:{statuses:[503],source:we.CONSTRAINT,retryAfter:!0,verifiedAt:["engine/enforcement/constraints/concurrency.ts:291"]},concurrency_coordinator_unavailable:{statuses:[503],source:we.CONSTRAINT,retryAfter:!0,verifiedAt:["engine/enforcement/constraints/concurrency.ts:305"]},key_expired:{statuses:[401],source:we.CONSTRAINT,retryAfter:!1,verifiedAt:["engine/enforcement/constraints/credential-validity.ts:33"]},geo_context_unavailable:{statuses:[503],source:we.CONSTRAINT,retryAfter:!0,verifiedAt:["engine/enforcement/constraints/geo-restriction.ts:44"]},geo_blocked:{statuses:[403],source:we.CONSTRAINT,retryAfter:!1,verifiedAt:["engine/enforcement/constraints/geo-restriction.ts:51"]},geo_not_allowed:{statuses:[403],source:we.CONSTRAINT,retryAfter:!1,verifiedAt:["engine/enforcement/constraints/geo-restriction.ts:58"]},resource_count_limit_exceeded:{statuses:[403,402],source:we.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:we.CONSTRAINT,retryAfter:!1,verifiedAt:["engine/enforcement/constraints/capacity.ts"]},resolver_rate_limited:{statuses:[503],source:we.GATEWAY_ERROR,retryAfter:!0,verifiedAt:["engine/errors.ts:55"]},resolver_unavailable:{statuses:[503],source:we.GATEWAY_ERROR,retryAfter:!0,verifiedAt:["engine/errors.ts:73"]},credential_resolver_miss_rate_limited:{statuses:[429],source:we.GATEWAY_ERROR,retryAfter:!0,verifiedAt:["engine/errors.ts:89"]},provider_throttled:{statuses:[503],source:we.GATEWAY_ERROR,retryAfter:!0,verifiedAt:["engine/pipeline/provider-adapter.ts"]}},Q4=Object.keys(jE);var eL=new Set([429,503]),i3=new Set(Q4.filter(t=>jE[t].statuses.every(e=>eL.has(e))));var tL=["quota","rate","concurrency","capacity","spend","adaptive"],s3=new Set(tL);var rL=[402,403,413,429],u3=new Set(rL);import{existsSync as ly,mkdirSync as nL,readFileSync as ZE,writeFileSync as m5}from"node:fs";import{homedir as oL}from"node:os";import{join as dy}from"node:path";var UE="https://core.farthershore.com";var py=dy(oL(),".farthershore"),LE=dy(py,"config.json"),ME=dy(py,"credentials.json");function iL(t){ly(t)||nL(t,{recursive:!0,mode:448})}var uy={apiUrl:UE};function FE(){if(iL(py),!ly(LE))return uy;try{let t=JSON.parse(ZE(LE,"utf-8"));return{...uy,...t}}catch{return uy}}function qE(){if(!ly(ME))return null;try{return JSON.parse(ZE(ME,"utf-8"))}catch{return null}}var C=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=qE();if(n?.token)return n.token;throw new C("Not authenticated. Run `farthershore auth login` or set FARTHERSHORE_TOKEN environment variable.")}var Bo="x-fs-surface",Ho="cli",aL="management";function fn(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 HE(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",[Bo]:Ho}});if(!c.ok){let l=(await c.json().catch(()=>null))?.error,d=typeof l=="string"?{message:l}:l;throw new C(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]===aL}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",[Bo]:Ho};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 C(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,[Bo]:Ho};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,M=typeof E=="string"?{message:E}:E;throw new C(M?.message??v.statusText,v.status,{code:M?.code,details:M?.details})}if(v.status!==204)return v.json()}return{exchangeCliToken:n,authWhoami:async()=>{if(t.token.startsWith("mk_")){let u=await i("GET","/management/whoami");return{kind:"maker",tokenId:u.tokenId,organizationId:u.organizationId,productId:u.productId,scopes:u.scopes}}return{kind:"builder",...await i("POST","/builder/context/bootstrap")}},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",fn(`/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",fn(`/businesses/${c}`,{env:u?.env})),getDeployments:c=>i("GET",`/businesses/${c}/deployments`),listChangeSets:(c,u)=>i("GET",fn(`/businesses/${c}/change-sets`,{env:u?.env})),compileManifest:(c,u,l)=>i("POST",`/businesses/${c}/manifest/compile`,{ir:u,...l?.env?{env:l.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,u)=>i("DELETE",`/businesses/${c}`,u?.deleteGitHubRepo?{deleteGitHubRepo:!0}:void 0),builderListConsumers:(c,u)=>i("GET",fn(`/businesses/${c}/consumers`,{env:u?.env})),builderBlockConsumer:(c,u)=>i("POST",`/businesses/${c}/consumers/${encodeURIComponent(u)}/block`),builderRemoveConsumer:(c,u)=>i("POST",`/businesses/${c}/consumers/${encodeURIComponent(u)}/remove`),listPromoCodes:c=>i("GET",`/businesses/${c}/promo-codes`),createPromoCode:(c,u)=>i("POST",`/businesses/${c}/promo-codes`,u),updatePromoCode:(c,u,l)=>i("PATCH",`/businesses/${c}/promo-codes/${u}`,l),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`),managementListWebhooks:(c,u)=>i("GET",fn(`/management/businesses/${c}/webhooks`,{limit:u?.limit})),managementCreateWebhook:(c,u,l)=>i("POST",`/management/businesses/${c}/webhooks`,u,l),managementUpdateWebhook:(c,u,l,d)=>i("PATCH",`/management/businesses/${c}/webhooks/${u}`,l,d),managementDeleteWebhook:(c,u)=>i("DELETE",`/management/businesses/${c}/webhooks/${u}`),managementTestWebhook:(c,u)=>i("POST",`/management/businesses/${c}/webhooks/${u}/test`),managementListWebhookDeliveries:(c,u,l)=>i("GET",fn(`/management/businesses/${c}/webhooks/${u}/deliveries`,{limit:l?.limit})),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),builderBusinessSecrets:(c,u)=>i("GET",`/businesses/${c}/secrets${u?`?environmentId=${encodeURIComponent(u)}`:""}`),builderSetBusinessSecret:(c,u)=>i("POST",`/businesses/${c}/secrets`,u),builderDeleteBusinessSecret:(c,u,l)=>i("DELETE",`/businesses/${c}/secrets/${encodeURIComponent(u)}${l?`?environmentId=${encodeURIComponent(l)}`:""}`),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",[Bo]:Ho},body:JSON.stringify(l??{})});if(!d.ok){let m=(await d.json().catch(()=>null))?.error,f=typeof m=="string"?{message:m}:m;throw new C(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}`,[Bo]:Ho}});if(!l.ok){let p=(await l.json().catch(()=>null))?.error,m=typeof p=="string"?{message:p}:p;throw new C(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}`,[Bo]:Ho}});if(!d.ok){let m=(await d.json().catch(()=>null))?.error,f=typeof m=="string"?{message:m}:m;throw new C(f?.message??d.statusText,d.status,{code:f?.code,details:f?.details})}return d.json()},getProductConfig:(c,u)=>i("GET",fn(`/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`,GE=(t=0)=>e=>`\x1B[${38+t};5;${e}m`,WE=(t=0)=>(e,n,o)=>`\x1B[${38+t};2;${e};${n};${o}m`,$e={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]}},$5=Object.keys($e.modifier),sL=Object.keys($e.color),cL=Object.keys($e.bgColor),I5=[...sL,...cL];function uL(){let t=new Map;for(let[e,n]of Object.entries($e)){for(let[o,r]of Object.entries(n))$e[o]={open:`\x1B[${r[0]}m`,close:`\x1B[${r[1]}m`},n[o]=$e[o],t.set(r[0],r[1]);Object.defineProperty($e,e,{value:n,enumerable:!1})}return Object.defineProperty($e,"codes",{value:t,enumerable:!1}),$e.color.close="\x1B[39m",$e.bgColor.close="\x1B[49m",$e.color.ansi=KE(),$e.color.ansi256=GE(),$e.color.ansi16m=WE(),$e.bgColor.ansi=KE(10),$e.bgColor.ansi256=GE(10),$e.bgColor.ansi16m=WE(10),Object.defineProperties($e,{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=>$e.rgbToAnsi256(...$e.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)=>$e.ansi256ToAnsi($e.rgbToAnsi256(e,n,o)),enumerable:!1},hexToAnsi:{value:e=>$e.ansi256ToAnsi($e.hexToAnsi256(e)),enumerable:!1}}),$e}var lL=uL(),Ut=lL;import my from"node:process";import dL from"node:os";import JE from"node:tty";function St(t,e=globalThis.Deno?globalThis.Deno.args:my.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:Ie}=my,Od;St("no-color")||St("no-colors")||St("color=false")||St("color=never")?Od=0:(St("color")||St("colors")||St("color=true")||St("color=always"))&&(Od=1);function pL(){if("FORCE_COLOR"in Ie)return Ie.FORCE_COLOR==="true"?1:Ie.FORCE_COLOR==="false"?0:Ie.FORCE_COLOR.length===0?1:Math.min(Number.parseInt(Ie.FORCE_COLOR,10),3)}function mL(t){return t===0?!1:{level:t,hasBasic:!0,has256:t>=2,has16m:t>=3}}function fL(t,{streamIsTTY:e,sniffFlags:n=!0}={}){let o=pL();o!==void 0&&(Od=o);let r=n?Od:o;if(r===0)return 0;if(n){if(St("color=16m")||St("color=full")||St("color=truecolor"))return 3;if(St("color=256"))return 2}if("TF_BUILD"in Ie&&"AGENT_NAME"in Ie)return 1;if(t&&!e&&r===void 0)return 0;let i=r||0;if(Ie.TERM==="dumb")return i;if(my.platform==="win32"){let a=dL.release().split(".");return Number(a[0])>=10&&Number(a[2])>=10586?Number(a[2])>=14931?3:2:1}if("CI"in Ie)return["GITHUB_ACTIONS","GITEA_ACTIONS","CIRCLECI"].some(a=>a in Ie)?3:["TRAVIS","APPVEYOR","GITLAB_CI","BUILDKITE","DRONE"].some(a=>a in Ie)||Ie.CI_NAME==="codeship"?1:i;if("TEAMCITY_VERSION"in Ie)return/^(9\.(0*[1-9]\d*)\.|\d{2,}\.)/.test(Ie.TEAMCITY_VERSION)?1:0;if(Ie.COLORTERM==="truecolor"||Ie.TERM==="xterm-kitty"||Ie.TERM==="xterm-ghostty"||Ie.TERM==="wezterm")return 3;if("TERM_PROGRAM"in Ie){let a=Number.parseInt((Ie.TERM_PROGRAM_VERSION||"").split(".")[0],10);switch(Ie.TERM_PROGRAM){case"iTerm.app":return a>=3?3:2;case"Apple_Terminal":return 2}}return/-256(color)?$/i.test(Ie.TERM)?2:/^screen|^xterm|^vt100|^vt220|^rxvt|color|ansi|cygwin|linux/i.test(Ie.TERM)||"COLORTERM"in Ie?1:i}function YE(t,e={}){let n=fL(t,{streamIsTTY:t&&t.isTTY,...e});return mL(n)}var hL={stdout:YE({isTTY:JE.isatty(1)}),stderr:YE({isTTY:JE.isatty(2)})},XE=hL;function QE(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 eT(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:tT,stderr:rT}=XE,fy=Symbol("GENERATOR"),Ko=Symbol("STYLER"),cs=Symbol("IS_EMPTY"),nT=["ansi","ansi","ansi256","ansi16m"],Go=Object.create(null),gL=(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=tT?tT.level:0;t.level=e.level===void 0?n:e.level};var _L=t=>{let e=(...n)=>n.join(" ");return gL(e,t),Object.setPrototypeOf(e,us.prototype),e};function us(t){return _L(t)}Object.setPrototypeOf(us.prototype,Function.prototype);for(let[t,e]of Object.entries(Ut))Go[t]={get(){let n=Pd(this,gy(e.open,e.close,this[Ko]),this[cs]);return Object.defineProperty(this,t,{value:n}),n}};Go.visible={get(){let t=Pd(this,this[Ko],!0);return Object.defineProperty(this,"visible",{value:t}),t}};var hy=(t,e,n,...o)=>t==="rgb"?e==="ansi16m"?Ut[n].ansi16m(...o):e==="ansi256"?Ut[n].ansi256(Ut.rgbToAnsi256(...o)):Ut[n].ansi(Ut.rgbToAnsi(...o)):t==="hex"?hy("rgb",e,n,...Ut.hexToRgb(...o)):Ut[n][t](...o),yL=["rgb","hex","ansi256"];for(let t of yL){Go[t]={get(){let{level:n}=this;return function(...o){let r=gy(hy(t,nT[n],"color",...o),Ut.color.close,this[Ko]);return Pd(this,r,this[cs])}}};let e="bg"+t[0].toUpperCase()+t.slice(1);Go[e]={get(){let{level:n}=this;return function(...o){let r=gy(hy(t,nT[n],"bgColor",...o),Ut.bgColor.close,this[Ko]);return Pd(this,r,this[cs])}}}}var vL=Object.defineProperties(()=>{},{...Go,level:{enumerable:!0,get(){return this[fy].level},set(t){this[fy].level=t}}}),gy=(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}},Pd=(t,e,n)=>{let o=(...r)=>bL(o,r.length===1?""+r[0]:r.join(" "));return Object.setPrototypeOf(o,vL),o[fy]=t,o[Ko]=e,o[cs]=n,o},bL=(t,e)=>{if(t.level<=0||!e)return t[cs]?"":e;let n=t[Ko];if(n===void 0)return e;let{openAll:o,closeAll:r}=n;if(e.includes("\x1B"))for(;n!==void 0;)e=QE(e,n.close,n.open),n=n.parent;let i=e.indexOf(`
|
|
84
|
-
`);return i!==-1&&(e=eT(e,r,o,i)),o+e+r};Object.defineProperties(us.prototype,Go);var kL=us(),A5=us({level:rT?rT.level:0});var _y=kL;var xL;function Rd(){return xL??SL(void 0)}function oT(){return Rd()==="json"}function iT(t){oT()||console.log(_y.dim(t))}function aT(t){oT()||console.log(_y.bold(t))}function yy(){return process.stdout.isTTY===!0}function SL(t){if(t==="json"||t==="table")return t;if(t!==void 0)throw new C(`Unsupported --format "${t}". Use "json" or "table".`,400,{code:"INVALID_OUTPUT_FORMAT",param:"format"});return yy()?"table":"json"}var $L={MANAGED_BY_CODE:"This business's contract is managed as code. Edit the Business SDK program in its GitHub repo (business/) and push \u2014 do NOT retry the API. (Branding stays editable via `farthershore business update`.)",UNAUTHORIZED:"Token is invalid or revoked. Run `farthershore auth login` to update it.",FORBIDDEN:"Your token doesn't have access to this resource. Check the org / product scope.",INVALID_ACCESS_KEY:"Token format is wrong. Generate a new one at https://farthershore.com/settings/tokens.",MAKER_TOKEN_REVOKED:"This maker token was revoked. Mint a new one in the product settings.",MAKER_TOKEN_NO_PRODUCT:"Maker token is not bound to a product. Re-create it from the product page.",AUTH_NO_TOKEN:"Pass --token <mk_...> or set FARTHERSHORE_TOKEN, or run interactively in a TTY.",AUTH_INVALID_TOKEN:"Token format is malformed. Maker tokens start with `mk_` and are 30+ characters.",DESTRUCTIVE_OP_REQUIRES_YES:"Destructive ops (delete) require an explicit `--yes` to proceed. This is intentional safety.",PRODUCT_UPDATE_NO_FIELDS:"Pass at least one field flag (--display-name, --origin, --description).",PLAN_UPDATE_NO_FIELDS:"Pass at least one of --name, --recurring-fee-cents, --grant, --trial-days, --max-monthly-spend-cents, or --meter.",ENV_NOT_FOUND:"Environment doesn't exist. Use `farthershore env list <product>` to see available envs, or create one with `farthershore env create`.",STRIPE_NOT_CONFIGURED:"Stripe isn't connected on this product. Connect it in the dashboard before running billing operations.",STRIPE_NOT_CONNECTED:"Publishing requires a connected Stripe account. Connect one on the dashboard Connections page, then re-run `farthershore business publish`.",STRIPE_NOT_VERIFIED:"Your Stripe account isn't fully verified yet. Finish Stripe onboarding, then re-run `farthershore business publish`.",BILLING_TAX_NOT_ENROLLED:"Stripe Tax isn't enrolled for this account. Enable it from the dashboard Connections page, then re-run `farthershore business publish`.",STRIPE_BALANCE_OUTSTANDING:"Customer has an outstanding balance. Resolve the invoice in Stripe before retrying.",CHECKOUT_SESSION_FAILED:"Stripe rejected the checkout request. Check that the plan exists and Stripe credentials are valid.",PRODUCT_NOT_FOUND:"Check the business slug. Run `farthershore` (no args) for a list of businesses you can see.",PRODUCT_REPO_NOT_LINKED:"Link a GitHub repo to this business before publishing or validating business manifests.",YAML_PARSE_ERROR:"Business manifest is not valid. Run `farthershore build` locally, fix business/ source, then push again for bot validation.",GITHUB_NOT_CONNECTED:"Connect GitHub on the org page before running `init` (it provisions the repo).",BRANCH_NO_MATCHING_ENV:"The current branch isn't mapped to an environment. Add a branch rule in business settings or pass --branch explicitly.",PLAN_NOT_FOUND:"Plan key doesn't exist on this business. Check the `plans` block in your local business manifest.",PLAN_HAS_ACTIVE_SUBSCRIPTIONS:"Plan has active subscribers and can't be deleted. Migrate them to another plan first.",PLAN_SLUG_CONFLICT:"Another plan already uses this key. Pick a unique plan key in your manifest.",SLUG_CONFLICT:"This business slug is taken. Pick a different name.",SLUG_BLOCKED:"This slug is reserved or blocked. Pick a different name.",SLUG_RESERVED:"This slug is reserved by Farther Shore. Pick a different name.",SLUG_INVALID_FORMAT:"Slug must be lowercase letters, digits, and hyphens (no leading/trailing hyphen).",DECISION_NOT_FOUND:"No DenialEvent recorded for that decisionId. Verify the id from the original deny response or audit log.",AUTH_UNAUTHORIZED:"Token is missing, expired, or lacks the audit:read scope required to read denial events.",RATE_LIMIT_EXCEEDED:"You've hit the rate limit. Wait a moment and retry.",VALIDATION_ERROR:"Request is malformed. The `details` field has the field-level errors.",CONFLICT:"The resource is in a state that conflicts with the request. Inspect `details` to learn more."};function sT(t){if(t)return $L[t]}function uT(t,e){return{schema_version:1,ok:!0,op:t,data:e}}function lT(t,e){let n=e.status??0;return{schema_version:1,ok:!1,op:t,error:{code:e.code??"INTERNAL_ERROR",message:e.message,status:n,param:e.param,retryable:wL(n,e.code),details:e.details,hint:sT(e.code)}}}var IL=new Set(["RATE_LIMIT_EXCEEDED","SERVICE_UNAVAILABLE"]);function wL(t,e){return t>=500||t===429||t===503?!0:e?IL.has(e):!1}var EL=/^(mk_[^.\s]+\.[^\s]+|fsrt_(test|live)_[^\s]+|fsk_[A-Za-z0-9_-]{8,}|sk_(test|live)_[A-Za-z0-9_-]{8,}|eyJ[A-Za-z0-9_-]+\.[A-Za-z0-9_-]+\.[A-Za-z0-9_-]+)$/,TL=/^(secret|clientSecret|privateKey|password|plaintext|connectorToken|tunnelToken|accessToken|refreshToken|tokenHash)$/i;function dT(t){return t.length<=8?"***redacted***":`${t.slice(0,4)}\u2026${t.slice(-4)}`}function Nd(t){if(typeof t=="string")return EL.test(t)?dT(t):t;if(Array.isArray(t))return t.map(e=>Nd(e));if(t&&typeof t=="object"){let e={};for(let[n,o]of Object.entries(t))TL.test(n)&&typeof o=="string"?e[n]=dT(o):e[n]=Nd(o);return e}return t}import{createInterface as OL}from"node:readline";import{readFile as PL}from"node:fs/promises";import{extname as RL}from"node:path";var Re={idempotencyKey:s.string().optional().describe("A UUID you generate; REUSE the same value when retrying so the retry replays the first result instead of double-provisioning.")};function pT(t){let e=t?.trim().toLowerCase();return e?e.split(".")[0]??null:null}async function Be(t,e){if(e){if(e.length===36)return e;let n=e.trim().toLowerCase(),r=(await t.listProducts()).find(i=>i.id===e||i.name.toLowerCase()===n||i.runtimeHostname?.toLowerCase()===n||i.portalHostname?.toLowerCase()===n||pT(i.runtimeHostname)===n||pT(i.portalHostname)===n);if(r)return r.id}throw new Error("No business selected. Pass a business id or slug, or run `farthershore business create` first.")}async function Cd(t,e,n){let r=await t.listEnvironments(e),a=(Array.isArray(r.data)?r.data:Array.isArray(r.environments)?r.environments:[]).find(c=>c.name.toLowerCase()===n.toLowerCase()||c.id===n);if(!a)throw new Error(`Environment "${n}" not found on product ${e}.`);return a.id}var zd=["frontend","api","docs","widget","dashboard","webhook","worker","agent"];function mT(t){let e=t.trim().toLowerCase();if(!zd.includes(e))throw new C(`Unknown business surface "${t}". Available: ${zd.join(", ")}.`,void 0,{code:"UNKNOWN_BUSINESS_SURFACE"});return e}function by(t){let e=(t.surface??[]).map(mT);if(e.length===0)return;if(new Set(e).size!==e.length)throw new C("Duplicate business surfaces in --surface flags.",void 0,{code:"INVALID_BUSINESS_SURFACES"});return e}function fT(t){let e={};return typeof t.bump=="string"&&(e.bump=t.bump),typeof t.version=="string"&&(e.version=t.version),t.acceptBreaking===!0&&(e.acceptBreaking=!0),e}async function NL(t){let e=OL({input:process.stdin,output:process.stderr,terminal:!0});return new Promise(n=>{e.question(`Cut release ${t}? [y/N] `,o=>{e.close(),n(/^y(es)?$/i.test(o.trim()))})})}function CL(t){return t.split("_").map(e=>e.charAt(0).toUpperCase()+e.slice(1)).join(" ")}function zL(t){let[e="",n,o]=t.split(":");if(!/^[a-z0-9_]+$/.test(e))throw new C(`Invalid meter key in "--meter ${t}" \u2014 keys are lowercase letters, digits, and underscores (e.g. input_tokens).`,void 0,{code:"INVALID_METER_SPEC"});return{key:e,display:n?.trim()||CL(e),unit:o?.trim()||void 0}}function AL(t){let e=t.meter??[];if(e.length>0&&t.meters)throw new C("Pass either --meters <template> or repeated --meter entries, not both.",void 0,{code:"CONFLICTING_METER_FLAGS"});if(e.length>0){let n=e.map(zL);if(new Set(n.map(r=>r.key)).size!==n.length)throw new C("Duplicate meter keys in --meter flags.",void 0,{code:"INVALID_METER_SPEC"});return n}if(t.meters){let n=ow(t.meters);if(!n)throw new C(`Unknown meter template "${t.meters}". Available: ${iw().join(", ")}.`,void 0,{code:"UNKNOWN_METER_TEMPLATE"});return n.meters.map(o=>({...o}))}}var hn="<businessIdOrName>",DL={".png":"image/png",".jpg":"image/jpeg",".jpeg":"image/jpeg",".webp":"image/webp"};function jL(t){let{product:e,...n}=t;return{...n,business:e}}function UL(t){let e=DL[RL(t).toLowerCase()];if(!e)throw new C(`Cannot infer image Content-Type for "${t}". Use a .png, .jpg, .jpeg, or .webp file.`,void 0,{code:"UNSUPPORTED_BRAND_ASSET_TYPE"});return e}function LL(t){return t.filter(e=>e!==void 0&&e!==!1).length}function hT(t,e){let n=e==="icon"?"icon":"logo",o=e==="icon"?"icon":"logo",r=e==="icon"?"clearIcon":"clearLogo";if(LL([t[`${o}Url`],t[`${o}File`],t[r]])>1)throw new C(`Choose only one ${n} operation: --${o}-url, --${o}-file, or --clear-${o}.`,void 0,{code:"CONFLICTING_BRAND_ASSET_FLAGS"})}async function gT(t,e,n,o){let r=await PL(o);return t.uploadBrandAsset(e,n,r,UL(o))}var _T=[{opKey:"business.list",operationClass:"operate",scope:["products:read"],sideEffect:"read",cli:{group:"business",command:"list",summary:"List businesses in the current org",args:[],handler:async({client:t,emit:e})=>{let n=await t.listProducts();e({count:n.length,businesses:n.map(o=>({...o,displayName:o.displayName??null,status:o.status??null}))},`${n.length} business(es)`)}},mcp:{tool:"fs_business_list",title:"List businesses",description:"List every business in the authenticated FartherShore workspace (id, name, status). Read-only; use this to discover business ids for the other tools.",annotations:{readOnlyHint:!0,openWorldHint:!1},inputSchema:{},handler:async t=>{let e=await t.listProducts();return{count:e.length,businesses:e.map(n=>({id:n.id,name:n.name,status:n.status??null}))}}}},{opKey:"business.read",operationClass:"dual",scope:["products:read"],sideEffect:"read",cli:{group:"business",command:"show",summary:"Show a business",args:[{field:"productId",kind:"positional",token:hn,resolveProduct:!0},{field:"env",kind:"flag",token:"--env <env>",describe:"Environment scope (preview branch name)"}],handler:async({client:t,args:e,emit:n})=>{let o=e.productId,r=await t.getProduct(o,{env:e.env});n({business:r},`Business ${o}`)}},mcp:null},{opKey:"business.status",operationClass:"operate",scope:["products:read"],sideEffect:"read",cli:{group:"business",command:"status",summary:"Show a business's lifecycle/release/live state (status, latest release version, latest deployment, and a derived `live` boolean) \u2014 verify a business is serving after publish.",args:[{field:"productId",kind:"positional",token:hn,resolveProduct:!0}],handler:async({client:t,args:e,emit:n})=>{let o=e.productId,r=await t.getDeployments(o),i=r.data[0]??null,a={id:r.product.id,status:r.product.status,latestReleaseVersion:r.product.latestReleaseVersion,live:r.live,latestDeployment:i?{id:i.id,status:i.status,edgePublishStatus:i.edgePublishStatus,createdAt:i.createdAt}:null};n(a,`Business ${o}: ${r.product.status}${r.product.latestReleaseVersion?` @ ${r.product.latestReleaseVersion}`:""} (${r.live?"live":"not live"})`)}},mcp:{tool:"fs_business_status",title:"Business status",description:"Verify a business's lifecycle/release state by id or slug: its status (DRAFT|ACTIVE), latest release version, latest deployment run, and a derived `live` boolean (ACTIVE + a real non-bootstrap release applied + the edge serving the snapshot). Read-only; use this to confirm a business is live after publishing.",annotations:{readOnlyHint:!0,openWorldHint:!1},inputSchema:{productId:s.string().describe("The business id or slug to check.")},handler:async(t,e)=>{let n=await Be(t,e.productId),o=await t.getDeployments(n),r=o.data[0]??null;return{id:o.product.id,status:o.product.status,latestReleaseVersion:o.product.latestReleaseVersion,live:o.live,latestDeployment:r?{id:r.id,status:r.status,edgePublishStatus:r.edgePublishStatus,createdAt:r.createdAt}:null}}}},{opKey:"business.create",operationClass:"dual",scope:["products:create"],sideEffect:"write",cli:{group:"business",command:"create",summary:"Create a new business and provision the frontend starter repo",idempotent:!0,args:[{field:"name",kind:"flag",token:"--name <name>",describe:"Business slug (becomes the subdomain)",required:!0},{field:"displayName",kind:"flag",token:"--display-name <displayName>",describe:"Human-friendly business name"},{field:"description",kind:"flag",token:"--description <description>"},{field:"origin",kind:"flag",token:"--origin <url>",describe:"Optional business origin Farther Shore calls for customer-facing actions"},{field:"meters",kind:"flag",token:"--meters <template>",describe:`Meter template: ${Sd.map(t=>`${t.id} (${t.label})`).join(", ")}. Default: requests.`},{field:"meter",kind:"flag",token:"--meter <key[:display[:unit]]>",describe:"Custom meter, repeatable (e.g. --meter input_tokens:'Input Tokens':token). Overrides --meters.",parser:(t,e)=>[...e,t],defaultValue:[]},{field:"surface",kind:"flag",token:"--surface <surface>",describe:`Initial Business SDK surface, repeatable. Available: ${zd.join(", ")}.`,parser:(t,e)=>[...e,t],defaultValue:[]},{field:"docs",kind:"flag",token:"--docs",describe:"Enable docs for this business (default when omitted)."},{field:"docs",kind:"flag",token:"--no-docs",describe:"Opt out of docs for this business."}],handler:async({client:t,args:e,reqOpts:n,emit:o,emitDryRunPreview:r})=>{let i=AL({meters:e.meters,meter:e.meter}),a=by({surface:e.surface}),c=e.docs===!0?!0:e.docs===!1?!1:void 0,u=await t.initProduct({name:e.name,...typeof e.origin=="string"?{origin:e.origin}:{},description:e.description,displayName:e.displayName,meters:i,surfaces:a,...c!==void 0?{docsEnabled:c}:{}},n);r(u)||o({result:jL(u)},`Business created: ${e.name}`)}},mcp:null},{opKey:"brand.update",operationClass:"operate",scope:["products:update"],sideEffect:"write",cli:{group:"business",command:"update",summary:"Update business presentation metadata",args:[{field:"productId",kind:"positional",token:hn,resolveProduct:!0},{field:"displayName",kind:"flag",token:"--display-name <displayName>"},{field:"description",kind:"flag",token:"--description <description>"},{field:"iconUrl",kind:"flag",token:"--icon-url <url>",describe:"Set the square icon/favicon URL"},{field:"iconFile",kind:"flag",token:"--icon-file <path>",describe:"Upload a local PNG, JPEG, or WEBP square icon"},{field:"clearIcon",kind:"flag",token:"--clear-icon",describe:"Remove the current icon asset"},{field:"logoUrl",kind:"flag",token:"--logo-url <url>",describe:"Set the wordmark/logo URL"},{field:"logoFile",kind:"flag",token:"--logo-file <path>",describe:"Upload a local PNG, JPEG, or WEBP wordmark/logo"},{field:"clearLogo",kind:"flag",token:"--clear-logo",describe:"Remove the current logo asset"},{field:"env",kind:"flag",token:"--env <env>",describe:"Environment scope"}],handler:async({client:t,args:e,emit:n})=>{let o=e.productId;hT(e,"icon"),hT(e,"logo");let r={};e.displayName!==void 0&&(r.displayName=e.displayName),e.description!==void 0&&(r.description=e.description),e.iconUrl!==void 0&&(r.iconUrl=e.iconUrl),e.logoUrl!==void 0&&(r.logoUrl=e.logoUrl);let i=[];if(typeof e.iconFile=="string"&&i.push(()=>gT(t,o,"icon",e.iconFile)),typeof e.logoFile=="string"&&i.push(()=>gT(t,o,"logo",e.logoFile)),e.clearIcon===!0&&i.push(()=>t.deleteBrandAsset(o,"icon")),e.clearLogo===!0&&i.push(()=>t.deleteBrandAsset(o,"logo")),Object.keys(r).length===0&&i.length===0)throw new C("No fields to update. Pass presentation metadata flags such as --display-name, --description, --icon-file, --logo-file, or a clear flag.",void 0,{code:"BUSINESS_UPDATE_NO_FIELDS"});let a=Object.keys(r).length>0?await t.updateProduct(o,r,{env:e.env}):await t.getProduct(o,{env:e.env}),c=await Promise.all(i.map(u=>u()));n({business:a,assets:c},`Business ${o} updated`)}},mcp:{tool:"fs_brand_update",title:"Update business brand",description:"Update a business's brand/presentation only \u2014 display name, description, icon, logo (wordmark). Plans, pricing, and routes are managed as code in the business repo and are NOT editable here. Only the fields you pass are changed.",annotations:{readOnlyHint:!1,destructiveHint:!1,idempotentHint:!1,openWorldHint:!1},inputSchema:{productId:s.string().describe("The business id or slug to update."),displayName:s.string().optional().describe("Display name."),description:s.string().optional().describe("Short business description."),iconUrl:s.string().nullable().optional().describe("Square icon/favicon URL, or null to clear it."),logoUrl:s.string().nullable().optional().describe("Wordmark/logo URL, or null to clear it.")},handler:async(t,e)=>{let n=await Be(t,e.productId),o={};return e.displayName!==void 0&&(o.displayName=e.displayName),e.description!==void 0&&(o.description=e.description),e.iconUrl!==void 0&&(o.iconUrl=e.iconUrl),e.logoUrl!==void 0&&(o.logoUrl=e.logoUrl),t.updateProduct(n,o)}}},{opKey:"business.publish",operationClass:"dual",scope:["products:publish"],sideEffect:"write",cli:{group:"business",command:"publish",summary:"Publish a draft business (make it live) and cut a versioned release with an auto-computed semver. Requires at least one plan, an origin, and a verified Stripe connection.",idempotent:!0,args:[{field:"productId",kind:"positional",token:hn,resolveProduct:!0},{field:"bump",kind:"flag",token:"--bump <bump>",describe:"Force the semver bump (major|minor|patch). Omit to auto-derive from the change."},{field:"version",kind:"flag",token:"--version <version>",describe:"Pin the exact next release tag (vX.Y.Z), skipping derivation."},{field:"acceptBreaking",kind:"flag",token:"--accept-breaking",describe:"Consent to publish a breaking (blocking-risk) change as a major release."}],helpTextAfter:`
|
|
84
|
+
`);return i!==-1&&(e=eT(e,r,o,i)),o+e+r};Object.defineProperties(us.prototype,Go);var kL=us(),A5=us({level:rT?rT.level:0});var _y=kL;var xL;function Rd(){return xL??SL(void 0)}function oT(){return Rd()==="json"}function iT(t){oT()||console.log(_y.dim(t))}function aT(t){oT()||console.log(_y.bold(t))}function yy(){return process.stdout.isTTY===!0}function SL(t){if(t==="json"||t==="table")return t;if(t!==void 0)throw new C(`Unsupported --format "${t}". Use "json" or "table".`,400,{code:"INVALID_OUTPUT_FORMAT",param:"format"});return yy()?"table":"json"}var $L={MANAGED_BY_CODE:"This business's contract is managed as code. Edit the Business SDK program in its GitHub repo (business/) and push \u2014 do NOT retry the API. (Branding stays editable via `farthershore business update`.)",UNAUTHORIZED:"Token is invalid or revoked. Run `farthershore auth login` to update it.",FORBIDDEN:"Your token doesn't have access to this resource. Check the org / product scope.",INVALID_ACCESS_KEY:"Token format is wrong. Generate a new one at https://farthershore.com/settings/tokens.",MAKER_TOKEN_REVOKED:"This maker token was revoked. Mint a new one in the product settings.",MAKER_TOKEN_NO_PRODUCT:"Maker token is not bound to a product. Re-create it from the product page.",AUTH_NO_TOKEN:"Pass --token <mk_...> or set FARTHERSHORE_TOKEN, or run interactively in a TTY.",AUTH_INVALID_TOKEN:"Token format is malformed. Maker tokens start with `mk_` and are 30+ characters.",DESTRUCTIVE_OP_REQUIRES_YES:"Destructive ops (delete) require an explicit `--yes` to proceed. This is intentional safety.",PRODUCT_UPDATE_NO_FIELDS:"Pass at least one field flag (--display-name, --origin, --description).",PLAN_UPDATE_NO_FIELDS:"Pass at least one of --name, --recurring-fee-cents, --grant, --trial-days, --max-monthly-spend-cents, or --meter.",ENV_NOT_FOUND:"Environment doesn't exist. Use `farthershore env list <product>` to see available envs, or create one with `farthershore env create`.",STRIPE_NOT_CONFIGURED:"Stripe isn't connected on this product. Connect it in the dashboard before running billing operations.",STRIPE_NOT_CONNECTED:"Publishing requires a connected Stripe account. Connect one on the dashboard Connections page, then re-run `farthershore business publish`.",STRIPE_NOT_VERIFIED:"Your Stripe account isn't fully verified yet. Finish Stripe onboarding, then re-run `farthershore business publish`.",BILLING_TAX_NOT_ENROLLED:"Stripe Tax isn't enrolled for this account. Enable it from the dashboard Connections page, then re-run `farthershore business publish`.",STRIPE_BALANCE_OUTSTANDING:"Customer has an outstanding balance. Resolve the invoice in Stripe before retrying.",CHECKOUT_SESSION_FAILED:"Stripe rejected the checkout request. Check that the plan exists and Stripe credentials are valid.",PRODUCT_NOT_FOUND:"Check the business slug. Run `farthershore` (no args) for a list of businesses you can see.",PRODUCT_REPO_NOT_LINKED:"Link a GitHub repo to this business before publishing or validating business manifests.",YAML_PARSE_ERROR:"Business manifest is not valid. Run `farthershore build` locally, fix business/ source, then push again for bot validation.",GITHUB_NOT_CONNECTED:"Connect GitHub on the org page before running `init` (it provisions the repo).",BRANCH_NO_MATCHING_ENV:"The current branch isn't mapped to an environment. Add a branch rule in business settings or pass --branch explicitly.",PLAN_NOT_FOUND:"Plan key doesn't exist on this business. Check the `plans` block in your local business manifest.",PLAN_HAS_ACTIVE_SUBSCRIPTIONS:"Plan has active subscribers and can't be deleted. Migrate them to another plan first.",PLAN_SLUG_CONFLICT:"Another plan already uses this key. Pick a unique plan key in your manifest.",SLUG_CONFLICT:"This business slug is taken. Pick a different name.",SLUG_BLOCKED:"This slug is reserved or blocked. Pick a different name.",SLUG_RESERVED:"This slug is reserved by Farther Shore. Pick a different name.",SLUG_INVALID_FORMAT:"Slug must be lowercase letters, digits, and hyphens (no leading/trailing hyphen).",DECISION_NOT_FOUND:"No DenialEvent recorded for that decisionId. Verify the id from the original deny response or audit log.",AUTH_UNAUTHORIZED:"Token is missing, expired, or lacks the audit:read scope required to read denial events.",RATE_LIMIT_EXCEEDED:"You've hit the rate limit. Wait a moment and retry.",VALIDATION_ERROR:"Request is malformed. The `details` field has the field-level errors.",CONFLICT:"The resource is in a state that conflicts with the request. Inspect `details` to learn more."};function sT(t){if(t)return $L[t]}function uT(t,e){return{schema_version:1,ok:!0,op:t,data:e}}function lT(t,e){let n=e.status??0;return{schema_version:1,ok:!1,op:t,error:{code:e.code??"INTERNAL_ERROR",message:e.message,status:n,param:e.param,retryable:wL(n,e.code),details:e.details,hint:sT(e.code)}}}var IL=new Set(["RATE_LIMIT_EXCEEDED","SERVICE_UNAVAILABLE"]);function wL(t,e){return t>=500||t===429||t===503?!0:e?IL.has(e):!1}var EL=/^(mk_[^.\s]+\.[^\s]+|fsrt_(test|live)_[^\s]+|fsk_[A-Za-z0-9_-]{8,}|sk_(test|live)_[A-Za-z0-9_-]{8,}|eyJ[A-Za-z0-9_-]+\.[A-Za-z0-9_-]+\.[A-Za-z0-9_-]+)$/,TL=/^(secret|clientSecret|privateKey|password|plaintext|connectorToken|tunnelToken|accessToken|refreshToken|tokenHash)$/i;function dT(t){return t.length<=8?"***redacted***":`${t.slice(0,4)}\u2026${t.slice(-4)}`}function Nd(t){if(typeof t=="string")return EL.test(t)?dT(t):t;if(Array.isArray(t))return t.map(e=>Nd(e));if(t&&typeof t=="object"){let e={};for(let[n,o]of Object.entries(t))TL.test(n)&&typeof o=="string"?e[n]=dT(o):e[n]=Nd(o);return e}return t}import{createInterface as OL}from"node:readline";import{readFile as PL}from"node:fs/promises";import{extname as RL}from"node:path";var Re={idempotencyKey:s.string().optional().describe("A UUID you generate; REUSE the same value when retrying so the retry replays the first result instead of double-provisioning.")};function pT(t){let e=t?.trim().toLowerCase();return e?e.split(".")[0]??null:null}async function Be(t,e){if(e){if(e.length===36)return e;let n=e.trim().toLowerCase(),r=(await t.listProducts()).find(i=>i.id===e||i.name.toLowerCase()===n||i.runtimeHostname?.toLowerCase()===n||i.portalHostname?.toLowerCase()===n||pT(i.runtimeHostname)===n||pT(i.portalHostname)===n);if(r)return r.id}throw new Error("No business selected. Pass a business id or slug, or run `farthershore business create` first.")}async function Cd(t,e,n){let r=await t.listEnvironments(e),a=(Array.isArray(r.data)?r.data:Array.isArray(r.environments)?r.environments:[]).find(c=>c.name.toLowerCase()===n.toLowerCase()||c.id===n);if(!a)throw new Error(`Environment "${n}" not found on product ${e}.`);return a.id}var zd=["frontend","api","docs","widget","dashboard","webhook","worker","agent"];function mT(t){let e=t.trim().toLowerCase();if(!zd.includes(e))throw new C(`Unknown business surface "${t}". Available: ${zd.join(", ")}.`,void 0,{code:"UNKNOWN_BUSINESS_SURFACE"});return e}function by(t){let e=(t.surface??[]).map(mT);if(e.length===0)return;if(new Set(e).size!==e.length)throw new C("Duplicate business surfaces in --surface flags.",void 0,{code:"INVALID_BUSINESS_SURFACES"});return e}function fT(t){let e={};return typeof t.bump=="string"&&(e.bump=t.bump),typeof t.version=="string"&&(e.version=t.version),t.acceptBreaking===!0&&(e.acceptBreaking=!0),e}async function NL(t){let e=OL({input:process.stdin,output:process.stderr,terminal:!0});return new Promise(n=>{e.question(`Cut release ${t}? [y/N] `,o=>{e.close(),n(/^y(es)?$/i.test(o.trim()))})})}function CL(t){return t.split("_").map(e=>e.charAt(0).toUpperCase()+e.slice(1)).join(" ")}function zL(t){let[e="",n,o]=t.split(":");if(!/^[a-z0-9_]+$/.test(e))throw new C(`Invalid meter key in "--meter ${t}" \u2014 keys are lowercase letters, digits, and underscores (e.g. input_tokens).`,void 0,{code:"INVALID_METER_SPEC"});return{key:e,display:n?.trim()||CL(e),unit:o?.trim()||void 0}}function AL(t){let e=t.meter??[];if(e.length>0&&t.meters)throw new C("Pass either --meters <template> or repeated --meter entries, not both.",void 0,{code:"CONFLICTING_METER_FLAGS"});if(e.length>0){let n=e.map(zL);if(new Set(n.map(r=>r.key)).size!==n.length)throw new C("Duplicate meter keys in --meter flags.",void 0,{code:"INVALID_METER_SPEC"});return n}if(t.meters){let n=ow(t.meters);if(!n)throw new C(`Unknown meter template "${t.meters}". Available: ${iw().join(", ")}.`,void 0,{code:"UNKNOWN_METER_TEMPLATE"});return n.meters.map(o=>({...o}))}}var hn="<businessIdOrName>",DL={".png":"image/png",".jpg":"image/jpeg",".jpeg":"image/jpeg",".webp":"image/webp"};function jL(t){let{product:e,...n}=t;return{...n,business:e}}function UL(t){let e=DL[RL(t).toLowerCase()];if(!e)throw new C(`Cannot infer image Content-Type for "${t}". Use a .png, .jpg, .jpeg, or .webp file.`,void 0,{code:"UNSUPPORTED_BRAND_ASSET_TYPE"});return e}function LL(t){return t.filter(e=>e!==void 0&&e!==!1).length}function hT(t,e){let n=e==="icon"?"icon":"logo",o=e==="icon"?"icon":"logo",r=e==="icon"?"clearIcon":"clearLogo";if(LL([t[`${o}Url`],t[`${o}File`],t[r]])>1)throw new C(`Choose only one ${n} operation: --${o}-url, --${o}-file, or --clear-${o}.`,void 0,{code:"CONFLICTING_BRAND_ASSET_FLAGS"})}async function gT(t,e,n,o){let r=await PL(o);return t.uploadBrandAsset(e,n,r,UL(o))}var _T=[{opKey:"business.list",operationClass:"operate",scope:["products:read"],sideEffect:"read",cli:{group:"business",command:"list",summary:"List businesses in the current org",args:[],handler:async({client:t,emit:e})=>{let n=await t.listProducts();e({count:n.length,businesses:n.map(o=>({...o,displayName:o.displayName??null,status:o.status??null}))},`${n.length} business(es)`)}},mcp:{tool:"fs_business_list",title:"List businesses",description:"List every business in the authenticated FartherShore workspace (id, name, status). Read-only; use this to discover business ids for the other tools.",annotations:{readOnlyHint:!0,openWorldHint:!1},inputSchema:{},handler:async t=>{let e=await t.listProducts();return{count:e.length,businesses:e.map(n=>({id:n.id,name:n.name,status:n.status??null}))}}}},{opKey:"business.read",operationClass:"dual",scope:["products:read"],sideEffect:"read",cli:{group:"business",command:"show",summary:"Show a business",args:[{field:"productId",kind:"positional",token:hn,resolveProduct:!0},{field:"env",kind:"flag",token:"--env <env>",describe:"Environment scope (preview branch name)"}],handler:async({client:t,args:e,emit:n})=>{let o=e.productId,r=await t.getProduct(o,{env:e.env});n({business:r},`Business ${o}`)}},mcp:null},{opKey:"business.status",operationClass:"operate",scope:["products:read"],sideEffect:"read",cli:{group:"business",command:"status",summary:"Show a business's lifecycle/release/live state (status, latest release version, latest deployment, and a derived `live` boolean) \u2014 verify a business is serving after publish.",args:[{field:"productId",kind:"positional",token:hn,resolveProduct:!0}],handler:async({client:t,args:e,emit:n})=>{let o=e.productId,r=await t.getDeployments(o),i=r.data[0]??null,a={id:r.product.id,status:r.product.status,latestReleaseVersion:r.product.latestReleaseVersion,live:r.live,latestDeployment:i?{id:i.id,status:i.status,edgePublishStatus:i.edgePublishStatus,createdAt:i.createdAt}:null};n(a,`Business ${o}: ${r.product.status}${r.product.latestReleaseVersion?` @ ${r.product.latestReleaseVersion}`:""} (${r.live?"live":"not live"})`)}},mcp:{tool:"fs_business_status",title:"Business status",description:"Verify a business's lifecycle/release state by id or slug: its status (DRAFT|ACTIVE), latest release version, latest deployment run, and a derived `live` boolean (ACTIVE + a real non-bootstrap release applied + the edge serving the snapshot). Read-only; use this to confirm a business is live after publishing.",annotations:{readOnlyHint:!0,openWorldHint:!1},inputSchema:{productId:s.string().describe("The business id or slug to check.")},handler:async(t,e)=>{let n=await Be(t,e.productId),o=await t.getDeployments(n),r=o.data[0]??null;return{id:o.product.id,status:o.product.status,latestReleaseVersion:o.product.latestReleaseVersion,live:o.live,latestDeployment:r?{id:r.id,status:r.status,edgePublishStatus:r.edgePublishStatus,createdAt:r.createdAt}:null}}}},{opKey:"business.create",operationClass:"dual",scope:["products:create"],sideEffect:"write",cli:{group:"business",command:"create",summary:"Create a new business and provision the frontend starter repo",idempotent:!0,args:[{field:"name",kind:"flag",token:"--name <name>",describe:"Business slug (becomes the subdomain)",required:!0},{field:"displayName",kind:"flag",token:"--display-name <displayName>",describe:"Human-friendly business name"},{field:"description",kind:"flag",token:"--description <description>"},{field:"origin",kind:"flag",token:"--origin <url>",describe:"Optional business origin Farther Shore calls for customer-facing actions"},{field:"meters",kind:"flag",token:"--meters <template>",describe:`Meter template: ${Sd.map(t=>`${t.id} (${t.label})`).join(", ")}. Default: requests.`},{field:"meter",kind:"flag",token:"--meter <key[:display[:unit]]>",describe:"Custom meter, repeatable (e.g. --meter input_tokens:'Input Tokens':token). Overrides --meters.",parser:(t,e)=>[...e,t],defaultValue:[]},{field:"surface",kind:"flag",token:"--surface <surface>",describe:`Initial Business SDK surface, repeatable. Available: ${zd.join(", ")}.`,parser:(t,e)=>[...e,t],defaultValue:[]},{field:"docs",kind:"flag",token:"--docs",describe:"Enable docs for this business (default when omitted)."},{field:"docs",kind:"flag",token:"--no-docs",describe:"Opt out of docs for this business."}],handler:async({client:t,args:e,reqOpts:n,emit:o,emitDryRunPreview:r})=>{let i=AL({meters:e.meters,meter:e.meter}),a=by({surface:e.surface}),c=e.docs===!0?!0:e.docs===!1?!1:void 0,u=await t.initProduct({name:e.name,...typeof e.origin=="string"?{origin:e.origin}:{},description:e.description,displayName:e.displayName,meters:i,surfaces:a,...c!==void 0?{docsEnabled:c}:{}},n);r(u)||o({result:jL(u)},`Business created: ${e.name}`)}},mcp:null},{opKey:"business.origin.update",operationClass:"operate",scope:["products:update"],sideEffect:"write",cli:{group:"business",command:"update",summary:"Update business presentation metadata and per-env origin",args:[{field:"productId",kind:"positional",token:hn,resolveProduct:!0},{field:"displayName",kind:"flag",token:"--display-name <displayName>"},{field:"description",kind:"flag",token:"--description <description>"},{field:"iconUrl",kind:"flag",token:"--icon-url <url>",describe:"Set the square icon/favicon URL"},{field:"iconFile",kind:"flag",token:"--icon-file <path>",describe:"Upload a local PNG, JPEG, or WEBP square icon"},{field:"clearIcon",kind:"flag",token:"--clear-icon",describe:"Remove the current icon asset"},{field:"logoUrl",kind:"flag",token:"--logo-url <url>",describe:"Set the wordmark/logo URL"},{field:"logoFile",kind:"flag",token:"--logo-file <path>",describe:"Upload a local PNG, JPEG, or WEBP wordmark/logo"},{field:"clearLogo",kind:"flag",token:"--clear-logo",describe:"Remove the current logo asset"},{field:"origin",kind:"flag",token:"--origin <url>",describe:"Set the business upstream origin (the URL the gateway proxies to). With --env, sets that environment's override."},{field:"sandboxOrigin",kind:"flag",token:"--sandbox-origin <url>",describe:"Set the sandbox upstream origin. With --env, env-scoped."},{field:"env",kind:"flag",token:"--env <env>",describe:"Environment scope"}],handler:async({client:t,args:e,emit:n})=>{let o=e.productId;hT(e,"icon"),hT(e,"logo");let r={};e.displayName!==void 0&&(r.displayName=e.displayName),e.description!==void 0&&(r.description=e.description),e.iconUrl!==void 0&&(r.iconUrl=e.iconUrl),e.logoUrl!==void 0&&(r.logoUrl=e.logoUrl),e.origin!==void 0&&(r.origin=e.origin),e.sandboxOrigin!==void 0&&(r.sandboxOrigin=e.sandboxOrigin);let i=[];if(typeof e.iconFile=="string"&&i.push(()=>gT(t,o,"icon",e.iconFile)),typeof e.logoFile=="string"&&i.push(()=>gT(t,o,"logo",e.logoFile)),e.clearIcon===!0&&i.push(()=>t.deleteBrandAsset(o,"icon")),e.clearLogo===!0&&i.push(()=>t.deleteBrandAsset(o,"logo")),Object.keys(r).length===0&&i.length===0)throw new C("No fields to update. Pass presentation metadata flags such as --display-name, --description, --origin, --icon-file, --logo-file, or a clear flag.",void 0,{code:"BUSINESS_UPDATE_NO_FIELDS"});let a=Object.keys(r).length>0?await t.updateProduct(o,r,{env:e.env}):await t.getProduct(o,{env:e.env}),c=await Promise.all(i.map(u=>u()));n({business:a,assets:c},`Business ${o} updated`)}},mcp:{tool:"fs_brand_update",title:"Update business brand",description:"Update a business's brand/presentation and upstream origin \u2014 display name, description, icon, logo (wordmark), origin (the URL the gateway proxies to), sandboxOrigin. Pass env to write an environment-scoped origin override instead of the business default. Plans, pricing, and routes are managed as code in the business repo and are NOT editable here. Only the fields you pass are changed.",annotations:{readOnlyHint:!1,destructiveHint:!1,idempotentHint:!1,openWorldHint:!1},inputSchema:{productId:s.string().describe("The business id or slug to update."),displayName:s.string().optional().describe("Display name."),description:s.string().optional().describe("Short business description."),iconUrl:s.string().nullable().optional().describe("Square icon/favicon URL, or null to clear it."),logoUrl:s.string().nullable().optional().describe("Wordmark/logo URL, or null to clear it."),origin:s.string().optional().describe("Business upstream origin (the URL the gateway proxies to)."),sandboxOrigin:s.string().optional().describe("Sandbox upstream origin."),env:s.string().optional().describe("Environment scope \u2014 when set, the origin override is written to that environment instead of the business default.")},handler:async(t,e)=>{let n=await Be(t,e.productId),o={};return e.displayName!==void 0&&(o.displayName=e.displayName),e.description!==void 0&&(o.description=e.description),e.iconUrl!==void 0&&(o.iconUrl=e.iconUrl),e.logoUrl!==void 0&&(o.logoUrl=e.logoUrl),e.origin!==void 0&&(o.origin=e.origin),e.sandboxOrigin!==void 0&&(o.sandboxOrigin=e.sandboxOrigin),t.updateProduct(n,o,{env:e.env})}}},{opKey:"business.publish",operationClass:"dual",scope:["products:publish"],sideEffect:"write",cli:{group:"business",command:"publish",summary:"Publish a draft business (make it live) and cut a versioned release with an auto-computed semver. Requires at least one plan, an origin, and a verified Stripe connection.",idempotent:!0,args:[{field:"productId",kind:"positional",token:hn,resolveProduct:!0},{field:"bump",kind:"flag",token:"--bump <bump>",describe:"Force the semver bump (major|minor|patch). Omit to auto-derive from the change."},{field:"version",kind:"flag",token:"--version <version>",describe:"Pin the exact next release tag (vX.Y.Z), skipping derivation."},{field:"acceptBreaking",kind:"flag",token:"--accept-breaking",describe:"Consent to publish a breaking (blocking-risk) change as a major release."}],helpTextAfter:`
|
|
85
85
|
Publish auto-derives the semver bump from the change and cuts a vX.Y.Z release.
|
|
86
86
|
Use --dry-run to preview the computed bump + reasons without cutting a tag.
|
|
87
87
|
A blocking-risk (breaking) change is refused unless --accept-breaking is passed.`,handler:async({client:t,args:e,opts:n,reqOpts:o,emit:r,emitDryRunPreview:i})=>{let a=e.productId,c=fT(n);if(o.dryRun){let l=await t.publishProduct(a,c,o);if(i(l))return}if(yy()&&n.input!==!1){let d=(await t.publishProduct(a,c,{...o,dryRun:!0,idempotencyKey:void 0})).wouldHave?._release;if(d){aT(`Publishing ${a}: ${d.computedBump} \u2192 ${d.version}`+(d.previousVersion?` (from ${d.previousVersion})`:" (first release)"));for(let m of d.reasons)iT(` \u2022 ${m}`);if(!await NL(d.version)){r({cancelled:!0},"Publish cancelled.");return}}}let u=await t.publishProduct(a,c,o);r({business:u,_release:u._release??null},`Business ${a} published`)}},mcp:{tool:"fs_business_publish",title:"Publish a business",description:"Publish a business \u2014 deploy its current spec live and cut a versioned release with an auto-computed semver. Equivalent to a repo-driven deploy (operationClass=dual); both reconcile to the same published state.",annotations:{readOnlyHint:!1,destructiveHint:!1,idempotentHint:!0,openWorldHint:!1},inputSchema:{productId:s.string().describe("The business id to publish."),bump:s.enum(["major","minor","patch"]).optional().describe("Force the semver bump. Omit to auto-derive from the change."),version:s.string().optional().describe("Pin the exact next release tag (vX.Y.Z)."),acceptBreaking:s.boolean().optional().describe("Consent to publish a breaking (blocking-risk) change as major."),dryRun:s.boolean().optional().describe("Preview the change (computed semver + reasons) without cutting a release."),...Re},handler:async(t,e)=>{let n=fT({bump:e.bump,version:e.version,acceptBreaking:e.acceptBreaking});return t.publishProduct(e.productId,n,{idempotencyKey:e.idempotencyKey,dryRun:e.dryRun})}}},{opKey:"business.delete",operationClass:"operate",scope:["products:update"],sideEffect:"write",cli:{group:"business",command:"delete",summary:"Permanently delete a business. Requires --yes.",destructive:!0,yesMessage:"Pass --yes to confirm business deletion.",args:[{field:"productId",kind:"positional",token:hn,resolveProduct:!0},{field:"deleteGithubRepo",kind:"flag",token:"--delete-github-repo",describe:"Also delete the connected GitHub repository. Requires the same builder-session authorization as dashboard deletion."}],handler:async({client:t,args:e,emit:n})=>{let o=e.productId;try{await t.deleteProduct(o,{deleteGitHubRepo:e.deleteGithubRepo===!0})}catch(r){throw r instanceof C&&(r.status===403||r.code==="FORBIDDEN")?new C("Deleting a whole business requires a builder/browser session \u2014 open the business in the dashboard to delete it. (Preview environments CAN be deleted via the CLI: `farthershore env delete`.)",r.status,{code:r.code??"FORBIDDEN"}):r}n({deleted:o},`Business ${o} deleted`)}},mcp:null},{opKey:"business.docs.enable",operationClass:"operate",scope:["products:update"],sideEffect:"write",cli:{group:"business docs",command:"enable",summary:"Enable docs for a business (publish/serve docs scaffold).",args:[{field:"productId",kind:"positional",token:hn,resolveProduct:!0}],handler:async({client:t,args:e,emit:n})=>{let o=e.productId,r=await t.updateProduct(o,{docsEnabled:!0},{});n({business:r},`Docs enabled for ${o}`)}},mcp:{tool:"fs_business_docs_enable",title:"Enable business docs",description:"Enable docs for a business \u2014 opens the publish/sync gate so docs are served from R2 and `boot.docsEnabled=true` is emitted to the portal. Idempotent if docs are already enabled.",annotations:{readOnlyHint:!1,destructiveHint:!1,idempotentHint:!0,openWorldHint:!1},inputSchema:{productId:s.string().describe("The business id or slug to enable docs on.")},handler:async(t,e)=>{let n=await Be(t,e.productId);return t.updateProduct(n,{docsEnabled:!0},{})}}},{opKey:"business.docs.disable",operationClass:"operate",scope:["products:update"],sideEffect:"write",cli:{group:"business docs",command:"disable",summary:"Disable docs for a business (stop publishing/serving docs; scaffold kept in the repo).",args:[{field:"productId",kind:"positional",token:hn,resolveProduct:!0}],handler:async({client:t,args:e,emit:n})=>{let o=e.productId,r=await t.updateProduct(o,{docsEnabled:!1},{});n({business:r},`Docs disabled for ${o}`)}},mcp:{tool:"fs_business_docs_disable",title:"Disable business docs",description:"Disable docs for a business \u2014 closes the publish/sync gate so docs are no longer served and `boot.docsEnabled=false` is emitted to the portal. The docs scaffold stays in the repo; re-enabling is a pure flag flip. Idempotent if docs are already disabled.",annotations:{readOnlyHint:!1,destructiveHint:!1,idempotentHint:!0,openWorldHint:!1},inputSchema:{productId:s.string().describe("The business id or slug to disable docs on.")},handler:async(t,e)=>{let n=await Be(t,e.productId);return t.updateProduct(n,{docsEnabled:!1},{})}}}];var ML={kind:"free",label:"Free",description:"No recurring fee and no metered usage. Pure freemium tier.",pricing:{meters:[],recurring_fee_cents:0,billing_interval:"month",grants:[],trial_days:0}},ZL={kind:"starter",label:"Starter \u2014 $20/mo + $20 included",description:"$20/month subscription with $20 of usage credit each period. Stripe-style minimum-spend; overage billed at $0.001/request by default.",pricing:{meters:[{dimension:"requests",kind:"linear",price_per_unit_micros:1e3}],recurring_fee_cents:2e3,billing_interval:"month",grants:[{kind:"credit",amount_cents:2e3,recurs:!0}],trial_days:0}},FL={kind:"pro",label:"Pro \u2014 $100/mo + $200 included",description:"$100/month subscription with $200 of usage credit each period and a 14-day trial. Overage billed at $0.0005/request by default.",pricing:{meters:[{dimension:"requests",kind:"linear",price_per_unit_micros:500}],recurring_fee_cents:1e4,billing_interval:"month",grants:[{kind:"credit",amount_cents:2e4,recurs:!0}],trial_days:14}},qL={kind:"prepaid",label:"Prepaid \u2014 $50 sign-up credit, then PAYG",description:"$50 one-time credit at signup. Once depleted the subscriber pays-as-they-go at $0.001/request by default.",pricing:{meters:[{dimension:"requests",kind:"linear",price_per_unit_micros:1e3}],recurring_fee_cents:0,billing_interval:"month",grants:[{kind:"credit",amount_cents:5e3,recurs:!1}],trial_days:0}},VL={kind:"metered",label:"Metered (pay-as-you-go)",description:"No subscription fee. Pure usage billing at $0.001/request by default.",pricing:{meters:[{dimension:"requests",kind:"linear",price_per_unit_micros:1e3}],recurring_fee_cents:0,billing_interval:"month",grants:[],trial_days:0}},vY=Object.freeze({free:ML,starter:ZL,pro:FL,prepaid:qL,metered:VL});var EY=s.object({recurring_fee_cents:s.number().int().nonnegative().optional(),grants:s.array(ar).max(40).optional(),creditPolicy:sr.optional(),min_monthly_spend_cents:s.number().int().nonnegative().optional(),max_monthly_spend_cents:s.number().int().nonnegative().optional(),meters:s.array(cr).optional(),notes:s.string().max(2e3).optional()});var Ad=["grandfather","next_renewal","immediate","by_date","opt_in"];function BL(t){if(!t||typeof t!="object")return[];let e=t;return Array.isArray(e.data)?e.data:Array.isArray(e.plans)?e.plans:Array.isArray(t)?t:[]}function HL(t){if(t.length===0)return"(no plans)";let e=["KEY","NAME","FREE","FEE\xA2","RECURRING\xA2","ONE_TIME\xA2","TRIAL_D","MAX_SPEND\xA2","STATUS"],n=c=>c===null?"\u2014":c.toLocaleString("en-US"),o=t.map(c=>[c.key,c.name,c.free?"Y":"N",n(c.recurring_fee_cents),n(c.recurring_grant_cents),n(c.one_time_grant_cents),n(c.trial_days),n(c.max_monthly_spend_cents),c.status]),r=e.map((c,u)=>Math.max(c.length,...o.map(l=>l[u]?.length??0))),i=c=>c.map((u,l)=>u.padEnd(r[l]??u.length)).join(" "),a=r.map(c=>"-".repeat(c)).join(" ");return[i(e),a,...o.map(i)].join(`
|