@reddb-io/red-skills 3.22.0 → 4.0.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.
@@ -50,7 +50,7 @@ Set the \`cycles\` parameter to \`"ref"\` to resolve cyclical schemas with defs.
50
50
  `:`[${n[c]}\r
51
51
  ]`;continue}o+=n[c],n[c]==="\\"?i=!0:s&&n[c]==="]"?s=!1:!s&&n[c]==="["&&(s=!0)}try{new RegExp(o)}catch{return console.warn(`Could not convert regex pattern at ${t.currentPath.join("/")} to a flag-independent form! Falling back to the flag-ignorant source`),e.source}return o}function Qa(e,t){if(t.target==="openAi"&&console.warn("Warning: OpenAI may not support records in schemas! Try an array of key-value pairs instead."),t.target==="openApi3"&&e.keyType?._def.typeName===E.ZodEnum)return{type:"object",required:e.keyType._def.values,properties:e.keyType._def.values.reduce((n,o)=>({...n,[o]:W(e.valueType._def,{...t,currentPath:[...t.currentPath,"properties",o]})??je(t)}),{}),additionalProperties:t.rejectedAdditionalProperties};let r={type:"object",additionalProperties:W(e.valueType._def,{...t,currentPath:[...t.currentPath,"additionalProperties"]})??t.allowedAdditionalProperties};if(t.target==="openApi3")return r;if(e.keyType?._def.typeName===E.ZodString&&e.keyType._def.checks?.length){let{type:n,...o}=Ya(e.keyType._def,t);return{...r,propertyNames:o}}else{if(e.keyType?._def.typeName===E.ZodEnum)return{...r,propertyNames:{enum:e.keyType._def.values}};if(e.keyType?._def.typeName===E.ZodBranded&&e.keyType._def.type._def.typeName===E.ZodString&&e.keyType._def.type._def.checks?.length){let{type:n,...o}=Xa(e.keyType._def,t);return{...r,propertyNames:o}}}return r}function Qv(e,t){if(t.mapStrategy==="record")return Qa(e,t);let r=W(e.keyType._def,{...t,currentPath:[...t.currentPath,"items","items","0"]})||je(t),n=W(e.valueType._def,{...t,currentPath:[...t.currentPath,"items","items","1"]})||je(t);return{type:"array",maxItems:125,items:{type:"array",items:[r,n],minItems:2,maxItems:2}}}function eb(e){let t=e.values,n=Object.keys(e.values).filter(i=>typeof t[t[i]]!="number").map(i=>t[i]),o=Array.from(new Set(n.map(i=>typeof i)));return{type:o.length===1?o[0]==="string"?"string":"number":["string","number"],enum:n}}function tb(e){return e.target==="openAi"?void 0:{not:je({...e,currentPath:[...e.currentPath,"not"]})}}function rb(e){return e.target==="openApi3"?{enum:["null"],nullable:!0}:{type:"null"}}var Qi={ZodString:"string",ZodNumber:"number",ZodBigInt:"integer",ZodBoolean:"boolean",ZodNull:"null"};function ob(e,t){if(t.target==="openApi3")return nb(e,t);let r=e.options instanceof Map?Array.from(e.options.values()):e.options;if(r.every(n=>n._def.typeName in Qi&&(!n._def.checks||!n._def.checks.length))){let n=r.reduce((o,i)=>{let s=Qi[i._def.typeName];return s&&!o.includes(s)?[...o,s]:o},[]);return{type:n.length>1?n:n[0]}}else if(r.every(n=>n._def.typeName==="ZodLiteral"&&!n.description)){let n=r.reduce((o,i)=>{let s=typeof i._def.value;switch(s){case"string":case"number":case"boolean":return[...o,s];case"bigint":return[...o,"integer"];case"object":if(i._def.value===null)return[...o,"null"];default:return o}},[]);if(n.length===r.length){let o=n.filter((i,s,a)=>a.indexOf(i)===s);return{type:o.length>1?o:o[0],enum:r.reduce((i,s)=>i.includes(s._def.value)?i:[...i,s._def.value],[])}}}else if(r.every(n=>n._def.typeName==="ZodEnum"))return{type:"string",enum:r.reduce((n,o)=>[...n,...o._def.values.filter(i=>!n.includes(i))],[])};return nb(e,t)}var nb=(e,t)=>{let r=(e.options instanceof Map?Array.from(e.options.values()):e.options).map((n,o)=>W(n._def,{...t,currentPath:[...t.currentPath,"anyOf",`${o}`]})).filter(n=>!!n&&(!t.strictUnions||typeof n=="object"&&Object.keys(n).length>0));return r.length?{anyOf:r}:void 0};function ib(e,t){if(["ZodString","ZodNumber","ZodBigInt","ZodBoolean","ZodNull"].includes(e.innerType._def.typeName)&&(!e.innerType._def.checks||!e.innerType._def.checks.length))return t.target==="openApi3"?{type:Qi[e.innerType._def.typeName],nullable:!0}:{type:[Qi[e.innerType._def.typeName],"null"]};if(t.target==="openApi3"){let n=W(e.innerType._def,{...t,currentPath:[...t.currentPath]});return n&&"$ref"in n?{allOf:[n],nullable:!0}:n&&{...n,nullable:!0}}let r=W(e.innerType._def,{...t,currentPath:[...t.currentPath,"anyOf","0"]});return r&&{anyOf:[r,{type:"null"}]}}function sb(e,t){let r={type:"number"};if(!e.checks)return r;for(let n of e.checks)switch(n.kind){case"int":r.type="integer",lf(r,"type",n.message,t);break;case"min":t.target==="jsonSchema7"?n.inclusive?ie(r,"minimum",n.value,n.message,t):ie(r,"exclusiveMinimum",n.value,n.message,t):(n.inclusive||(r.exclusiveMinimum=!0),ie(r,"minimum",n.value,n.message,t));break;case"max":t.target==="jsonSchema7"?n.inclusive?ie(r,"maximum",n.value,n.message,t):ie(r,"exclusiveMaximum",n.value,n.message,t):(n.inclusive||(r.exclusiveMaximum=!0),ie(r,"maximum",n.value,n.message,t));break;case"multipleOf":ie(r,"multipleOf",n.value,n.message,t);break}return r}function ab(e,t){let r=t.target==="openAi",n={type:"object",properties:{}},o=[],i=e.shape();for(let a in i){let c=i[a];if(c===void 0||c._def===void 0)continue;let u=vO(c);u&&r&&(c._def.typeName==="ZodOptional"&&(c=c._def.innerType),c.isNullable()||(c=c.nullable()),u=!1);let l=W(c._def,{...t,currentPath:[...t.currentPath,"properties",a],propertyPath:[...t.currentPath,"properties",a]});l!==void 0&&(n.properties[a]=l,u||o.push(a))}o.length&&(n.required=o);let s=_O(e,t);return s!==void 0&&(n.additionalProperties=s),n}function _O(e,t){if(e.catchall._def.typeName!=="ZodNever")return W(e.catchall._def,{...t,currentPath:[...t.currentPath,"additionalProperties"]});switch(e.unknownKeys){case"passthrough":return t.allowedAdditionalProperties;case"strict":return t.rejectedAdditionalProperties;case"strip":return t.removeAdditionalStrategy==="strict"?t.allowedAdditionalProperties:t.rejectedAdditionalProperties}}function vO(e){try{return e.isOptional()}catch{return!0}}var cb=(e,t)=>{if(t.currentPath.toString()===t.propertyPath?.toString())return W(e.innerType._def,t);let r=W(e.innerType._def,{...t,currentPath:[...t.currentPath,"anyOf","1"]});return r?{anyOf:[{not:je(t)},r]}:je(t)};var ub=(e,t)=>{if(t.pipeStrategy==="input")return W(e.in._def,t);if(t.pipeStrategy==="output")return W(e.out._def,t);let r=W(e.in._def,{...t,currentPath:[...t.currentPath,"allOf","0"]}),n=W(e.out._def,{...t,currentPath:[...t.currentPath,"allOf",r?"1":"0"]});return{allOf:[r,n].filter(o=>o!==void 0)}};function lb(e,t){return W(e.type._def,t)}function db(e,t){let n={type:"array",uniqueItems:!0,items:W(e.valueType._def,{...t,currentPath:[...t.currentPath,"items"]})};return e.minSize&&ie(n,"minItems",e.minSize.value,e.minSize.message,t),e.maxSize&&ie(n,"maxItems",e.maxSize.value,e.maxSize.message,t),n}function fb(e,t){return e.rest?{type:"array",minItems:e.items.length,items:e.items.map((r,n)=>W(r._def,{...t,currentPath:[...t.currentPath,"items",`${n}`]})).reduce((r,n)=>n===void 0?r:[...r,n],[]),additionalItems:W(e.rest._def,{...t,currentPath:[...t.currentPath,"additionalItems"]})}:{type:"array",minItems:e.items.length,maxItems:e.items.length,items:e.items.map((r,n)=>W(r._def,{...t,currentPath:[...t.currentPath,"items",`${n}`]})).reduce((r,n)=>n===void 0?r:[...r,n],[])}}function pb(e){return{not:je(e)}}function mb(e){return je(e)}var hb=(e,t)=>W(e.innerType._def,t);var gb=(e,t,r)=>{switch(t){case E.ZodString:return Ya(e,r);case E.ZodNumber:return sb(e,r);case E.ZodObject:return ab(e,r);case E.ZodBigInt:return Vv(e,r);case E.ZodBoolean:return Hv();case E.ZodDate:return df(e,r);case E.ZodUndefined:return pb(r);case E.ZodNull:return rb(r);case E.ZodArray:return Uv(e,r);case E.ZodUnion:case E.ZodDiscriminatedUnion:return ob(e,r);case E.ZodIntersection:return Kv(e,r);case E.ZodTuple:return fb(e,r);case E.ZodRecord:return Qa(e,r);case E.ZodLiteral:return Xv(e,r);case E.ZodEnum:return Gv(e);case E.ZodNativeEnum:return eb(e);case E.ZodNullable:return ib(e,r);case E.ZodOptional:return cb(e,r);case E.ZodMap:return Qv(e,r);case E.ZodSet:return db(e,r);case E.ZodLazy:return()=>e.getter()._def;case E.ZodPromise:return lb(e,r);case E.ZodNaN:case E.ZodNever:return tb(r);case E.ZodEffects:return Jv(e,r);case E.ZodAny:return je(r);case E.ZodUnknown:return mb(r);case E.ZodDefault:return Wv(e,r);case E.ZodBranded:return Xa(e,r);case E.ZodReadonly:return hb(e,r);case E.ZodCatch:return Bv(e,r);case E.ZodPipeline:return ub(e,r);case E.ZodFunction:case E.ZodVoid:case E.ZodSymbol:return;default:return(n=>{})(t)}};function W(e,t,r=!1){let n=t.seen.get(e);if(t.override){let a=t.override?.(e,t,n,r);if(a!==Zv)return a}if(n&&!r){let a=bO(n,t);if(a!==void 0)return a}let o={def:e,path:t.currentPath,jsonSchema:void 0};t.seen.set(e,o);let i=gb(e,e.typeName,t),s=typeof i=="function"?W(i(),t):i;if(s&&wO(e,t,s),t.postProcess){let a=t.postProcess(s,e,t);return o.jsonSchema=s,a}return o.jsonSchema=s,s}var bO=(e,t)=>{switch(t.$refStrategy){case"root":return{$ref:e.path.join("/")};case"relative":return{$ref:Ka(t.currentPath,e.path)};case"none":case"seen":return e.path.length<t.currentPath.length&&e.path.every((r,n)=>t.currentPath[n]===r)?(console.warn(`Recursive reference detected at ${t.currentPath.join("/")}! Defaulting to any`),je(t)):t.$refStrategy==="seen"?je(t):void 0}},wO=(e,t,r)=>(e.description&&(r.description=e.description,t.markdownDescription&&(r.markdownDescription=e.description)),r);var mf=(e,t)=>{let r=Fv(t),n=typeof t=="object"&&t.definitions?Object.entries(t.definitions).reduce((c,[u,l])=>({...c,[u]:W(l._def,{...r,currentPath:[...r.basePath,r.definitionPath,u]},!0)??je(r)}),{}):void 0,o=typeof t=="string"?t:t?.nameStrategy==="title"?void 0:t?.name,i=W(e._def,o===void 0?r:{...r,currentPath:[...r.basePath,r.definitionPath,o]},!1)??je(r),s=typeof t=="object"&&t.name!==void 0&&t.nameStrategy==="title"?t.name:void 0;s!==void 0&&(i.title=s),r.flags.hasReferencedOpenAiAnyType&&(n||(n={}),n[r.openAiAnyTypeName]||(n[r.openAiAnyTypeName]={type:["string","number","integer","boolean","array","null"],items:{$ref:r.$refStrategy==="relative"?"1":[...r.basePath,r.definitionPath,r.openAiAnyTypeName].join("/")}}));let a=o===void 0?n?{...i,[r.definitionPath]:n}:i:{$ref:[...r.$refStrategy==="relative"?[]:r.basePath,r.definitionPath,o].join("/"),[r.definitionPath]:{...n,[o]:i}};return r.target==="jsonSchema7"?a.$schema="http://json-schema.org/draft-07/schema#":(r.target==="jsonSchema2019-09"||r.target==="openAi")&&(a.$schema="https://json-schema.org/draft/2019-09/schema#"),r.target==="openAi"&&("anyOf"in a||"oneOf"in a||"allOf"in a||"type"in a&&Array.isArray(a.type))&&console.warn("Warning: OpenAI may not support schemas with unions as roots! Try wrapping it in an object property."),a};function xO(e){return!e||e==="jsonSchema7"||e==="draft-7"?"draft-7":e==="jsonSchema2019-09"||e==="draft-2020-12"?"draft-2020-12":"draft-7"}function hf(e,t){return At(e)?Md(e,{target:xO(t?.target),io:t?.pipeStrategy??"input"}):mf(e,{strictUnions:t?.strictUnions??!0,pipeStrategy:t?.pipeStrategy??"input"})}function gf(e){let r=Jr(e)?.method;if(!r)throw new Error("Schema is missing a method literal");let n=Pa(r);if(typeof n!="string")throw new Error("Schema method literal must be a string");return n}function yf(e,t){let r=Wr(e,t);if(!r.success)throw r.error;return r.data}var $O=6e4,ec=class{constructor(t){this._options=t,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(ja,r=>{this._oncancel(r)}),this.setNotificationHandler(Ia,r=>{this._onprogress(r)}),this.setRequestHandler(Na,r=>({})),this._taskStore=t?.taskStore,this._taskMessageQueue=t?.taskMessageQueue,this._taskStore&&(this.setRequestHandler(Ma,async(r,n)=>{let o=await this._taskStore.getTask(r.params.taskId,n.sessionId);if(!o)throw new Z(U.InvalidParams,"Failed to retrieve task: Task not found");return{...o}}),this.setRequestHandler(Aa,async(r,n)=>{let o=async()=>{let i=r.params.taskId;if(this._taskMessageQueue){let a;for(;a=await this._taskMessageQueue.dequeue(i,n.sessionId);){if(a.type==="response"||a.type==="error"){let c=a.message,u=c.id,l=this._requestResolvers.get(u);if(l)if(this._requestResolvers.delete(u),a.type==="response")l(c);else{let d=c,h=new Z(d.error.code,d.error.message,d.error.data);l(h)}else{let d=a.type==="response"?"Response":"Error";this._onerror(new Error(`${d} handler missing for request ${u}`))}continue}await this._transport?.send(a.message,{relatedRequestId:n.requestId})}}let s=await this._taskStore.getTask(i,n.sessionId);if(!s)throw new Z(U.InvalidParams,`Task not found: ${i}`);if(!Kr(s.status))return await this._waitForTaskUpdate(i,n.signal),await o();if(Kr(s.status)){let a=await this._taskStore.getTaskResult(i,n.sessionId);return this._clearTaskQueue(i),{...a,_meta:{...a._meta,[Gr]:{taskId:i}}}}return await o()};return await o()}),this.setRequestHandler(qa,async(r,n)=>{try{let{tasks:o,nextCursor:i}=await this._taskStore.listTasks(r.params?.cursor,n.sessionId);return{tasks:o,nextCursor:i,_meta:{}}}catch(o){throw new Z(U.InvalidParams,`Failed to list tasks: ${o instanceof Error?o.message:String(o)}`)}}),this.setRequestHandler(La,async(r,n)=>{try{let o=await this._taskStore.getTask(r.params.taskId,n.sessionId);if(!o)throw new Z(U.InvalidParams,`Task not found: ${r.params.taskId}`);if(Kr(o.status))throw new Z(U.InvalidParams,`Cannot cancel task in terminal status: ${o.status}`);await this._taskStore.updateTaskStatus(r.params.taskId,"cancelled","Client cancelled task execution.",n.sessionId),this._clearTaskQueue(r.params.taskId);let i=await this._taskStore.getTask(r.params.taskId,n.sessionId);if(!i)throw new Z(U.InvalidParams,`Task not found after cancellation: ${r.params.taskId}`);return{_meta:{},...i}}catch(o){throw o instanceof Z?o:new Z(U.InvalidRequest,`Failed to cancel task: ${o instanceof Error?o.message:String(o)}`)}}))}async _oncancel(t){if(!t.params.requestId)return;this._requestHandlerAbortControllers.get(t.params.requestId)?.abort(t.params.reason)}_setupTimeout(t,r,n,o,i=!1){this._timeoutInfo.set(t,{timeoutId:setTimeout(o,r),startTime:Date.now(),timeout:r,maxTotalTimeout:n,resetTimeoutOnProgress:i,onTimeout:o})}_resetTimeout(t){let r=this._timeoutInfo.get(t);if(!r)return!1;let n=Date.now()-r.startTime;if(r.maxTotalTimeout&&n>=r.maxTotalTimeout)throw this._timeoutInfo.delete(t),Z.fromError(U.RequestTimeout,"Maximum total timeout exceeded",{maxTotalTimeout:r.maxTotalTimeout,totalElapsed:n});return clearTimeout(r.timeoutId),r.timeoutId=setTimeout(r.onTimeout,r.timeout),!0}_cleanupTimeout(t){let r=this._timeoutInfo.get(t);r&&(clearTimeout(r.timeoutId),this._timeoutInfo.delete(t))}async connect(t){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=t;let r=this.transport?.onclose;this._transport.onclose=()=>{r?.(),this._onclose()};let n=this.transport?.onerror;this._transport.onerror=i=>{n?.(i),this._onerror(i)};let o=this._transport?.onmessage;this._transport.onmessage=(i,s)=>{o?.(i,s),Vi(i)||Rv(i)?this._onresponse(i):Gd(i)?this._onrequest(i,s):Tv(i)?this._onnotification(i):this._onerror(new Error(`Unknown message type: ${JSON.stringify(i)}`))},await this._transport.start()}_onclose(){let t=this._responseHandlers;this._responseHandlers=new Map,this._progressHandlers.clear(),this._taskProgressTokens.clear(),this._pendingDebouncedNotifications.clear();for(let n of this._timeoutInfo.values())clearTimeout(n.timeoutId);this._timeoutInfo.clear();for(let n of this._requestHandlerAbortControllers.values())n.abort();this._requestHandlerAbortControllers.clear();let r=Z.fromError(U.ConnectionClosed,"Connection closed");this._transport=void 0,this.onclose?.();for(let n of t.values())n(r)}_onerror(t){this.onerror?.(t)}_onnotification(t){let r=this._notificationHandlers.get(t.method)??this.fallbackNotificationHandler;r!==void 0&&Promise.resolve().then(()=>r(t)).catch(n=>this._onerror(new Error(`Uncaught error in notification handler: ${n}`)))}_onrequest(t,r){let n=this._requestHandlers.get(t.method)??this.fallbackRequestHandler,o=this._transport,i=t.params?._meta?.[Gr]?.taskId;if(n===void 0){let l={jsonrpc:"2.0",id:t.id,error:{code:U.MethodNotFound,message:"Method not found"}};i&&this._taskMessageQueue?this._enqueueTaskMessage(i,{type:"error",message:l,timestamp:Date.now()},o?.sessionId).catch(d=>this._onerror(new Error(`Failed to enqueue error response: ${d}`))):o?.send(l).catch(d=>this._onerror(new Error(`Failed to send an error response: ${d}`)));return}let s=new AbortController;this._requestHandlerAbortControllers.set(t.id,s);let a=Sv(t.params)?t.params.task:void 0,c=this._taskStore?this.requestTaskStore(t,o?.sessionId):void 0,u={signal:s.signal,sessionId:o?.sessionId,_meta:t.params?._meta,sendNotification:async l=>{if(s.signal.aborted)return;let d={relatedRequestId:t.id};i&&(d.relatedTask={taskId:i}),await this.notification(l,d)},sendRequest:async(l,d,h)=>{if(s.signal.aborted)throw new Z(U.ConnectionClosed,"Request was cancelled");let m={...h,relatedRequestId:t.id};i&&!m.relatedTask&&(m.relatedTask={taskId:i});let p=m.relatedTask?.taskId??i;return p&&c&&await c.updateTaskStatus(p,"input_required"),await this.request(l,d,m)},authInfo:r?.authInfo,requestId:t.id,requestInfo:r?.requestInfo,taskId:i,taskStore:c,taskRequestedTtl:a?.ttl,closeSSEStream:r?.closeSSEStream,closeStandaloneSSEStream:r?.closeStandaloneSSEStream};Promise.resolve().then(()=>{a&&this.assertTaskHandlerCapability(t.method)}).then(()=>n(t,u)).then(async l=>{if(s.signal.aborted)return;let d={result:l,jsonrpc:"2.0",id:t.id};i&&this._taskMessageQueue?await this._enqueueTaskMessage(i,{type:"response",message:d,timestamp:Date.now()},o?.sessionId):await o?.send(d)},async l=>{if(s.signal.aborted)return;let d={jsonrpc:"2.0",id:t.id,error:{code:Number.isSafeInteger(l.code)?l.code:U.InternalError,message:l.message??"Internal error",...l.data!==void 0&&{data:l.data}}};i&&this._taskMessageQueue?await this._enqueueTaskMessage(i,{type:"error",message:d,timestamp:Date.now()},o?.sessionId):await o?.send(d)}).catch(l=>this._onerror(new Error(`Failed to send response: ${l}`))).finally(()=>{this._requestHandlerAbortControllers.get(t.id)===s&&this._requestHandlerAbortControllers.delete(t.id)})}_onprogress(t){let{progressToken:r,...n}=t.params,o=Number(r),i=this._progressHandlers.get(o);if(!i){this._onerror(new Error(`Received a progress notification for an unknown token: ${JSON.stringify(t)}`));return}let s=this._responseHandlers.get(o),a=this._timeoutInfo.get(o);if(a&&s&&a.resetTimeoutOnProgress)try{this._resetTimeout(o)}catch(c){this._responseHandlers.delete(o),this._progressHandlers.delete(o),this._cleanupTimeout(o),s(c);return}i(n)}_onresponse(t){let r=Number(t.id),n=this._requestResolvers.get(r);if(n){if(this._requestResolvers.delete(r),Vi(t))n(t);else{let s=new Z(t.error.code,t.error.message,t.error.data);n(s)}return}let o=this._responseHandlers.get(r);if(o===void 0){this._onerror(new Error(`Received a response for an unknown message ID: ${JSON.stringify(t)}`));return}this._responseHandlers.delete(r),this._cleanupTimeout(r);let i=!1;if(Vi(t)&&t.result&&typeof t.result=="object"){let s=t.result;if(s.task&&typeof s.task=="object"){let a=s.task;typeof a.taskId=="string"&&(i=!0,this._taskProgressTokens.set(a.taskId,r))}}if(i||this._progressHandlers.delete(r),Vi(t))o(t);else{let s=Z.fromError(t.error.code,t.error.message,t.error.data);o(s)}}get transport(){return this._transport}async close(){await this._transport?.close()}async*requestStream(t,r,n){let{task:o}=n??{};if(!o){try{yield{type:"result",result:await this.request(t,r,n)}}catch(s){yield{type:"error",error:s instanceof Z?s:new Z(U.InternalError,String(s))}}return}let i;try{let s=await this.request(t,zo,n);if(s.task)i=s.task.taskId,yield{type:"taskCreated",task:s.task};else throw new Z(U.InternalError,"Task creation did not return a task");for(;;){let a=await this.getTask({taskId:i},n);if(yield{type:"taskStatus",task:a},Kr(a.status)){a.status==="completed"?yield{type:"result",result:await this.getTaskResult({taskId:i},r,n)}:a.status==="failed"?yield{type:"error",error:new Z(U.InternalError,`Task ${i} failed`)}:a.status==="cancelled"&&(yield{type:"error",error:new Z(U.InternalError,`Task ${i} was cancelled`)});return}if(a.status==="input_required"){yield{type:"result",result:await this.getTaskResult({taskId:i},r,n)};return}let c=a.pollInterval??this._options?.defaultTaskPollInterval??1e3;await new Promise(u=>setTimeout(u,c)),n?.signal?.throwIfAborted()}}catch(s){yield{type:"error",error:s instanceof Z?s:new Z(U.InternalError,String(s))}}}request(t,r,n){let{relatedRequestId:o,resumptionToken:i,onresumptiontoken:s,task:a,relatedTask:c}=n??{};return new Promise((u,l)=>{let d=T=>{l(T)};if(!this._transport){d(new Error("Not connected"));return}if(this._options?.enforceStrictCapabilities===!0)try{this.assertCapabilityForMethod(t.method),a&&this.assertTaskCapability(t.method)}catch(T){d(T);return}n?.signal?.throwIfAborted();let h=this._requestMessageId++,m={...t,jsonrpc:"2.0",id:h};n?.onprogress&&(this._progressHandlers.set(h,n.onprogress),m.params={...t.params,_meta:{...t.params?._meta||{},progressToken:h}}),a&&(m.params={...m.params,task:a}),c&&(m.params={...m.params,_meta:{...m.params?._meta||{},[Gr]:c}});let p=T=>{this._responseHandlers.delete(h),this._progressHandlers.delete(h),this._cleanupTimeout(h),this._transport?.send({jsonrpc:"2.0",method:"notifications/cancelled",params:{requestId:h,reason:String(T)}},{relatedRequestId:o,resumptionToken:i,onresumptiontoken:s}).catch(M=>this._onerror(new Error(`Failed to send cancellation: ${M}`)));let z=T instanceof Z?T:new Z(U.RequestTimeout,String(T));l(z)};this._responseHandlers.set(h,T=>{if(!n?.signal?.aborted){if(T instanceof Error)return l(T);try{let z=Wr(r,T.result);z.success?u(z.data):l(z.error)}catch(z){l(z)}}}),n?.signal?.addEventListener("abort",()=>{p(n?.signal?.reason)});let y=n?.timeout??$O,v=()=>p(Z.fromError(U.RequestTimeout,"Request timed out",{timeout:y}));this._setupTimeout(h,y,n?.maxTotalTimeout,v,n?.resetTimeoutOnProgress??!1);let P=c?.taskId;if(P){let T=z=>{let M=this._responseHandlers.get(h);M?M(z):this._onerror(new Error(`Response handler missing for side-channeled request ${h}`))};this._requestResolvers.set(h,T),this._enqueueTaskMessage(P,{type:"request",message:m,timestamp:Date.now()}).catch(z=>{this._cleanupTimeout(h),l(z)})}else this._transport.send(m,{relatedRequestId:o,resumptionToken:i,onresumptiontoken:s}).catch(T=>{this._cleanupTimeout(h),l(T)})})}async getTask(t,r){return this.request({method:"tasks/get",params:t},Da,r)}async getTaskResult(t,r,n){return this.request({method:"tasks/result",params:t},r,n)}async listTasks(t,r){return this.request({method:"tasks/list",params:t},Za,r)}async cancelTask(t,r){return this.request({method:"tasks/cancel",params:t},Ov,r)}async notification(t,r){if(!this._transport)throw new Error("Not connected");this.assertNotificationCapability(t.method);let n=r?.relatedTask?.taskId;if(n){let a={...t,jsonrpc:"2.0",params:{...t.params,_meta:{...t.params?._meta||{},[Gr]:r.relatedTask}}};await this._enqueueTaskMessage(n,{type:"notification",message:a,timestamp:Date.now()});return}if((this._options?.debouncedNotificationMethods??[]).includes(t.method)&&!t.params&&!r?.relatedRequestId&&!r?.relatedTask){if(this._pendingDebouncedNotifications.has(t.method))return;this._pendingDebouncedNotifications.add(t.method),Promise.resolve().then(()=>{if(this._pendingDebouncedNotifications.delete(t.method),!this._transport)return;let a={...t,jsonrpc:"2.0"};r?.relatedTask&&(a={...a,params:{...a.params,_meta:{...a.params?._meta||{},[Gr]:r.relatedTask}}}),this._transport?.send(a,r).catch(c=>this._onerror(c))});return}let s={...t,jsonrpc:"2.0"};r?.relatedTask&&(s={...s,params:{...s.params,_meta:{...s.params?._meta||{},[Gr]:r.relatedTask}}}),await this._transport.send(s,r)}setRequestHandler(t,r){let n=gf(t);this.assertRequestHandlerCapability(n),this._requestHandlers.set(n,(o,i)=>{let s=yf(t,o);return Promise.resolve(r(s,i))})}removeRequestHandler(t){this._requestHandlers.delete(t)}assertCanSetRequestHandler(t){if(this._requestHandlers.has(t))throw new Error(`A request handler for ${t} already exists, which would be overridden`)}setNotificationHandler(t,r){let n=gf(t);this._notificationHandlers.set(n,o=>{let i=yf(t,o);return Promise.resolve(r(i))})}removeNotificationHandler(t){this._notificationHandlers.delete(t)}_cleanupTaskProgressHandler(t){let r=this._taskProgressTokens.get(t);r!==void 0&&(this._progressHandlers.delete(r),this._taskProgressTokens.delete(t))}async _enqueueTaskMessage(t,r,n){if(!this._taskStore||!this._taskMessageQueue)throw new Error("Cannot enqueue task message: taskStore and taskMessageQueue are not configured");let o=this._options?.maxTaskQueueSize;await this._taskMessageQueue.enqueue(t,r,n,o)}async _clearTaskQueue(t,r){if(this._taskMessageQueue){let n=await this._taskMessageQueue.dequeueAll(t,r);for(let o of n)if(o.type==="request"&&Gd(o.message)){let i=o.message.id,s=this._requestResolvers.get(i);s?(s(new Z(U.InternalError,"Task cancelled or completed")),this._requestResolvers.delete(i)):this._onerror(new Error(`Resolver missing for request ${i} during task ${t} cleanup`))}}}async _waitForTaskUpdate(t,r){let n=this._options?.defaultTaskPollInterval??1e3;try{let o=await this._taskStore?.getTask(t);o?.pollInterval&&(n=o.pollInterval)}catch{}return new Promise((o,i)=>{if(r.aborted){i(new Z(U.InvalidRequest,"Request cancelled"));return}let s=setTimeout(o,n);r.addEventListener("abort",()=>{clearTimeout(s),i(new Z(U.InvalidRequest,"Request cancelled"))},{once:!0})})}requestTaskStore(t,r){let n=this._taskStore;if(!n)throw new Error("No task store configured");return{createTask:async o=>{if(!t)throw new Error("No request provided");return await n.createTask(o,t.id,{method:t.method,params:t.params},r)},getTask:async o=>{let i=await n.getTask(o,r);if(!i)throw new Z(U.InvalidParams,"Failed to retrieve task: Task not found");return i},storeTaskResult:async(o,i,s)=>{await n.storeTaskResult(o,i,s,r);let a=await n.getTask(o,r);if(a){let c=Gi.parse({method:"notifications/tasks/status",params:a});await this.notification(c),Kr(a.status)&&this._cleanupTaskProgressHandler(o)}},getTaskResult:o=>n.getTaskResult(o,r),updateTaskStatus:async(o,i,s)=>{let a=await n.getTask(o,r);if(!a)throw new Z(U.InvalidParams,`Task "${o}" not found - it may have been cleaned up`);if(Kr(a.status))throw new Z(U.InvalidParams,`Cannot update task "${o}" from terminal status "${a.status}" to "${i}". Terminal states (completed, failed, cancelled) cannot transition to other states.`);await n.updateTaskStatus(o,i,s,r);let c=await n.getTask(o,r);if(c){let u=Gi.parse({method:"notifications/tasks/status",params:c});await this.notification(u),Kr(c.status)&&this._cleanupTaskProgressHandler(o)}},listTasks:o=>n.listTasks(o,r)}}};function yb(e){return e!==null&&typeof e=="object"&&!Array.isArray(e)}function _b(e,t){let r={...e};for(let n in t){let o=n,i=t[o];if(i===void 0)continue;let s=r[o];yb(s)&&yb(i)?r[o]={...s,...i}:r[o]=i}return r}var u$=ea(nm(),1),l$=ea(c$(),1);function P1(){let e=new u$.default({strict:!1,validateFormats:!0,validateSchema:!1,allErrors:!0});return(0,l$.default)(e),e}var Ic=class{constructor(t){this._ajv=t??P1()}getValidator(t){let r="$id"in t&&typeof t.$id=="string"?this._ajv.getSchema(t.$id)??this._ajv.compile(t):this._ajv.compile(t);return n=>r(n)?{valid:!0,data:n,errorMessage:void 0}:{valid:!1,data:void 0,errorMessage:this._ajv.errorsText(r.errors)}}};var Mc=class{constructor(t){this._server=t}requestStream(t,r,n){return this._server.requestStream(t,r,n)}createMessageStream(t,r){let n=this._server.getClientCapabilities();if((t.tools||t.toolChoice)&&!n?.sampling?.tools)throw new Error("Client does not support sampling tools capability.");if(t.messages.length>0){let o=t.messages[t.messages.length-1],i=Array.isArray(o.content)?o.content:[o.content],s=i.some(l=>l.type==="tool_result"),a=t.messages.length>1?t.messages[t.messages.length-2]:void 0,c=a?Array.isArray(a.content)?a.content:[a.content]:[],u=c.some(l=>l.type==="tool_use");if(s){if(i.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(h=>h.type==="tool_use").map(h=>h.id)),d=new Set(i.filter(h=>h.type==="tool_result").map(h=>h.toolUseId));if(l.size!==d.size||![...l].every(h=>d.has(h)))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:t},Yi,r)}elicitInputStream(t,r){let n=this._server.getClientCapabilities(),o=t.mode??"form";switch(o){case"url":{if(!n?.elicitation?.url)throw new Error("Client does not support url elicitation.");break}case"form":{if(!n?.elicitation?.form)throw new Error("Client does not support form elicitation.");break}}let i=o==="form"&&t.mode===void 0?{...t,mode:"form"}:t;return this.requestStream({method:"elicitation/create",params:i},Co,r)}async getTask(t,r){return this._server.getTask({taskId:t},r)}async getTaskResult(t,r,n){return this._server.getTaskResult({taskId:t},r,n)}async listTasks(t,r){return this._server.listTasks(t?{cursor:t}:void 0,r)}async cancelTask(t,r){return this._server.cancelTask({taskId:t},r)}};function d$(e,t,r){if(!e)throw new Error(`${r} does not support task creation (required for ${t})`);switch(t){case"tools/call":if(!e.tools?.call)throw new Error(`${r} does not support task creation for tools/call (required for ${t})`);break;default:break}}function f$(e,t,r){if(!e)throw new Error(`${r} does not support task creation (required for ${t})`);switch(t){case"sampling/createMessage":if(!e.sampling?.createMessage)throw new Error(`${r} does not support task creation for sampling/createMessage (required for ${t})`);break;case"elicitation/create":if(!e.elicitation?.create)throw new Error(`${r} does not support task creation for elicitation/create (required for ${t})`);break;default:break}}var Dc=class extends ec{constructor(t,r){super(r),this._serverInfo=t,this._loggingLevels=new Map,this.LOG_LEVEL_SEVERITY=new Map(Xi.options.map((n,o)=>[n,o])),this.isMessageIgnored=(n,o)=>{let i=this._loggingLevels.get(o);return i?this.LOG_LEVEL_SEVERITY.get(n)<this.LOG_LEVEL_SEVERITY.get(i):!1},this._capabilities=r?.capabilities??{},this._instructions=r?.instructions,this._jsonSchemaValidator=r?.jsonSchemaValidator??new Ic,this.setRequestHandler(Yd,n=>this._oninitialize(n)),this.setNotificationHandler(Qd,()=>this.oninitialized?.()),this._capabilities.logging&&this.setRequestHandler(af,async(n,o)=>{let i=o.sessionId||o.requestInfo?.headers["mcp-session-id"]||void 0,{level:s}=n.params,a=Xi.safeParse(s);return a.success&&this._loggingLevels.set(i,a.data),{}})}get experimental(){return this._experimental||(this._experimental={tasks:new Mc(this)}),this._experimental}registerCapabilities(t){if(this.transport)throw new Error("Cannot register capabilities after connecting to transport");this._capabilities=_b(this._capabilities,t)}setRequestHandler(t,r){let o=Jr(t)?.method;if(!o)throw new Error("Schema is missing a method literal");let i;if(At(o)){let a=o;i=a._zod?.def?.value??a.value}else{let a=o;i=a._def?.value??a.value}if(typeof i!="string")throw new Error("Schema method literal must be a string");if(i==="tools/call"){let a=async(c,u)=>{let l=Wr(Oo,c);if(!l.success){let p=l.error instanceof Error?l.error.message:String(l.error);throw new Z(U.InvalidParams,`Invalid tools/call request: ${p}`)}let{params:d}=l.data,h=await Promise.resolve(r(c,u));if(d.task){let p=Wr(zo,h);if(!p.success){let y=p.error instanceof Error?p.error.message:String(p.error);throw new Z(U.InvalidParams,`Invalid task creation result: ${y}`)}return p.data}let m=Wr(Ja,h);if(!m.success){let p=m.error instanceof Error?m.error.message:String(m.error);throw new Z(U.InvalidParams,`Invalid tools/call result: ${p}`)}return m.data};return super.setRequestHandler(t,a)}return super.setRequestHandler(t,r)}assertCapabilityForMethod(t){switch(t){case"sampling/createMessage":if(!this._clientCapabilities?.sampling)throw new Error(`Client does not support sampling (required for ${t})`);break;case"elicitation/create":if(!this._clientCapabilities?.elicitation)throw new Error(`Client does not support elicitation (required for ${t})`);break;case"roots/list":if(!this._clientCapabilities?.roots)throw new Error(`Client does not support listing roots (required for ${t})`);break;case"ping":break}}assertNotificationCapability(t){switch(t){case"notifications/message":if(!this._capabilities.logging)throw new Error(`Server does not support logging (required for ${t})`);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 ${t})`);break;case"notifications/tools/list_changed":if(!this._capabilities.tools)throw new Error(`Server does not support notifying of tool list changes (required for ${t})`);break;case"notifications/prompts/list_changed":if(!this._capabilities.prompts)throw new Error(`Server does not support notifying of prompt list changes (required for ${t})`);break;case"notifications/elicitation/complete":if(!this._clientCapabilities?.elicitation?.url)throw new Error(`Client does not support URL elicitation (required for ${t})`);break;case"notifications/cancelled":break;case"notifications/progress":break}}assertRequestHandlerCapability(t){if(this._capabilities)switch(t){case"completion/complete":if(!this._capabilities.completions)throw new Error(`Server does not support completions (required for ${t})`);break;case"logging/setLevel":if(!this._capabilities.logging)throw new Error(`Server does not support logging (required for ${t})`);break;case"prompts/get":case"prompts/list":if(!this._capabilities.prompts)throw new Error(`Server does not support prompts (required for ${t})`);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 ${t})`);break;case"tools/call":case"tools/list":if(!this._capabilities.tools)throw new Error(`Server does not support tools (required for ${t})`);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 ${t})`);break;case"ping":case"initialize":break}}assertTaskCapability(t){f$(this._clientCapabilities?.tasks?.requests,t,"Client")}assertTaskHandlerCapability(t){this._capabilities&&d$(this._capabilities.tasks?.requests,t,"Server")}async _oninitialize(t){let r=t.params.protocolVersion;return this._clientCapabilities=t.params.capabilities,this._clientVersion=t.params.clientInfo,{protocolVersion:wv.includes(r)?r:Wd,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"},Ca)}async createMessage(t,r){if((t.tools||t.toolChoice)&&!this._clientCapabilities?.sampling?.tools)throw new Error("Client does not support sampling tools capability.");if(t.messages.length>0){let n=t.messages[t.messages.length-1],o=Array.isArray(n.content)?n.content:[n.content],i=o.some(u=>u.type==="tool_result"),s=t.messages.length>1?t.messages[t.messages.length-2]:void 0,a=s?Array.isArray(s.content)?s.content:[s.content]:[],c=a.some(u=>u.type==="tool_use");if(i){if(o.some(u=>u.type!=="tool_result"))throw new Error("The last message must contain only tool_result content if any is present");if(!c)throw new Error("tool_result blocks are not matching any tool_use from the previous message")}if(c){let u=new Set(a.filter(d=>d.type==="tool_use").map(d=>d.id)),l=new Set(o.filter(d=>d.type==="tool_result").map(d=>d.toolUseId));if(u.size!==l.size||![...u].every(d=>l.has(d)))throw new Error("ids of tool_result blocks and tool_use blocks from previous message do not match")}}return t.tools?this.request({method:"sampling/createMessage",params:t},cf,r):this.request({method:"sampling/createMessage",params:t},Yi,r)}async elicitInput(t,r){switch(t.mode??"form"){case"url":{if(!this._clientCapabilities?.elicitation?.url)throw new Error("Client does not support url elicitation.");let o=t;return this.request({method:"elicitation/create",params:o},Co,r)}case"form":{if(!this._clientCapabilities?.elicitation?.form)throw new Error("Client does not support form elicitation.");let o=t.mode==="form"?t:{...t,mode:"form"},i=await this.request({method:"elicitation/create",params:o},Co,r);if(i.action==="accept"&&i.content&&o.requestedSchema)try{let a=this._jsonSchemaValidator.getValidator(o.requestedSchema)(i.content);if(!a.valid)throw new Z(U.InvalidParams,`Elicitation response content does not match requested schema: ${a.errorMessage}`)}catch(s){throw s instanceof Z?s:new Z(U.InternalError,`Error validating elicitation response: ${s instanceof Error?s.message:String(s)}`)}return i}}}createElicitationCompletionNotifier(t,r){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:t}},r)}async listRoots(t,r){return this.request({method:"roots/list",params:t},uf,r)}async sendLoggingMessage(t,r){if(this._capabilities.logging&&!this.isMessageIgnored(t.level,r))return this.notification({method:"notifications/message",params:t})}async sendResourceUpdated(t){return this.notification({method:"notifications/resources/updated",params:t})}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 m$=Symbol.for("mcp.completable");function dm(e){return!!e&&typeof e=="object"&&m$ in e}function h$(e){return e[m$]?.complete}var p$;(function(e){e.Completable="McpCompletable"})(p$||(p$={}));var T1=/^[A-Za-z0-9._-]{1,128}$/;function R1(e){let t=[];if(e.length===0)return{isValid:!1,warnings:["Tool name cannot be empty"]};if(e.length>128)return{isValid:!1,warnings:[`Tool name exceeds maximum length of 128 characters (current: ${e.length})`]};if(e.includes(" ")&&t.push("Tool name contains spaces, which may cause parsing issues"),e.includes(",")&&t.push("Tool name contains commas, which may cause parsing issues"),(e.startsWith("-")||e.endsWith("-"))&&t.push("Tool name starts or ends with a dash, which may cause parsing issues in some contexts"),(e.startsWith(".")||e.endsWith("."))&&t.push("Tool name starts or ends with a dot, which may cause parsing issues in some contexts"),!T1.test(e)){let r=e.split("").filter(n=>!/[A-Za-z0-9._-]/.test(n)).filter((n,o,i)=>i.indexOf(n)===o);return t.push(`Tool name contains invalid characters: ${r.map(n=>`"${n}"`).join(", ")}`,"Allowed characters are: A-Z, a-z, 0-9, underscore (_), dash (-), and dot (.)"),{isValid:!1,warnings:t}}return{isValid:!0,warnings:t}}function z1(e,t){if(t.length>0){console.warn(`Tool name validation warning for "${e}":`);for(let r of t)console.warn(` - ${r}`);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 fm(e){let t=R1(e);return z1(e,t.warnings),t.isValid}var Ac=class{constructor(t){this._mcpServer=t}registerToolTask(t,r,n){let o={taskSupport:"required",...r.execution};if(o.taskSupport==="forbidden")throw new Error(`Cannot register task-based tool '${t}' with taskSupport 'forbidden'. Use registerTool() instead.`);return this._mcpServer._createRegisteredTool(t,r.title,r.description,r.inputSchema,r.outputSchema,r.annotations,o,r._meta,n)}};var qc=class{constructor(t,r){this._registeredResources={},this._registeredResourceTemplates={},this._registeredTools={},this._registeredPrompts={},this._toolHandlersInitialized=!1,this._completionHandlerInitialized=!1,this._resourceHandlersInitialized=!1,this._promptHandlersInitialized=!1,this.server=new Dc(t,r)}get experimental(){return this._experimental||(this._experimental={tasks:new Ac(this)}),this._experimental}async connect(t){return await this.server.connect(t)}async close(){await this.server.close()}setToolRequestHandlers(){this._toolHandlersInitialized||(this.server.assertCanSetRequestHandler(sn(Wa)),this.server.assertCanSetRequestHandler(sn(Oo)),this.server.registerCapabilities({tools:{listChanged:!0}}),this.server.setRequestHandler(Wa,()=>({tools:Object.entries(this._registeredTools).filter(([,t])=>t.enabled).map(([t,r])=>{let n={name:t,title:r.title,description:r.description,inputSchema:(()=>{let o=To(r.inputSchema);return o?hf(o,{strictUnions:!0,pipeStrategy:"input"}):E1})(),annotations:r.annotations,execution:r.execution,_meta:r._meta};if(r.outputSchema){let o=To(r.outputSchema);o&&(n.outputSchema=hf(o,{strictUnions:!0,pipeStrategy:"output"}))}return n})})),this.server.setRequestHandler(Oo,async(t,r)=>{try{let n=this._registeredTools[t.params.name];if(!n)throw new Z(U.InvalidParams,`Tool ${t.params.name} not found`);if(!n.enabled)throw new Z(U.InvalidParams,`Tool ${t.params.name} disabled`);let o=!!t.params.task,i=n.execution?.taskSupport,s="createTask"in n.handler;if((i==="required"||i==="optional")&&!s)throw new Z(U.InternalError,`Tool ${t.params.name} has taskSupport '${i}' but was not registered with registerToolTask`);if(i==="required"&&!o)throw new Z(U.MethodNotFound,`Tool ${t.params.name} requires task augmentation (taskSupport: 'required')`);if(i==="optional"&&!o&&s)return await this.handleAutomaticTaskPolling(n,t,r);let a=await this.validateToolInput(n,t.params.arguments,t.params.name),c=await this.executeToolHandler(n,a,r);return o||await this.validateToolOutput(n,c,t.params.name),c}catch(n){if(n instanceof Z&&n.code===U.UrlElicitationRequired)throw n;return this.createToolError(n instanceof Error?n.message:String(n))}}),this._toolHandlersInitialized=!0)}createToolError(t){return{content:[{type:"text",text:t}],isError:!0}}async validateToolInput(t,r,n){if(!t.inputSchema)return;let i=To(t.inputSchema)??t.inputSchema,s=await Sa(i,r);if(!s.success){let a="error"in s?s.error:"Unknown error",c=ka(a);throw new Z(U.InvalidParams,`Input validation error: Invalid arguments for tool ${n}: ${c}`)}return s.data}async validateToolOutput(t,r,n){if(!t.outputSchema||!("content"in r)||r.isError)return;if(!r.structuredContent)throw new Z(U.InvalidParams,`Output validation error: Tool ${n} has an output schema but no structured content was provided`);let o=To(t.outputSchema),i=await Sa(o,r.structuredContent);if(!i.success){let s="error"in i?i.error:"Unknown error",a=ka(s);throw new Z(U.InvalidParams,`Output validation error: Invalid structured content for tool ${n}: ${a}`)}}async executeToolHandler(t,r,n){let o=t.handler;if("createTask"in o){if(!n.taskStore)throw new Error("No task store provided.");let s={...n,taskStore:n.taskStore};if(t.inputSchema){let a=o;return await Promise.resolve(a.createTask(r,s))}else{let a=o;return await Promise.resolve(a.createTask(s))}}if(t.inputSchema){let s=o;return await Promise.resolve(s(r,n))}else{let s=o;return await Promise.resolve(s(n))}}async handleAutomaticTaskPolling(t,r,n){if(!n.taskStore)throw new Error("No task store provided for task-capable tool.");let o=await this.validateToolInput(t,r.params.arguments,r.params.name),i=t.handler,s={...n,taskStore:n.taskStore},a=o?await Promise.resolve(i.createTask(o,s)):await Promise.resolve(i.createTask(s)),c=a.task.taskId,u=a.task,l=u.pollInterval??5e3;for(;u.status!=="completed"&&u.status!=="failed"&&u.status!=="cancelled";){await new Promise(h=>setTimeout(h,l));let d=await n.taskStore.getTask(c);if(!d)throw new Z(U.InternalError,`Task ${c} not found during polling`);u=d}return await n.taskStore.getTaskResult(c)}setCompletionRequestHandler(){this._completionHandlerInitialized||(this.server.assertCanSetRequestHandler(sn(Ga)),this.server.registerCapabilities({completions:{}}),this.server.setRequestHandler(Ga,async t=>{switch(t.params.ref.type){case"ref/prompt":return Dv(t),this.handlePromptCompletion(t,t.params.ref);case"ref/resource":return Av(t),this.handleResourceCompletion(t,t.params.ref);default:throw new Z(U.InvalidParams,`Invalid completion reference: ${t.params.ref}`)}}),this._completionHandlerInitialized=!0)}async handlePromptCompletion(t,r){let n=this._registeredPrompts[r.name];if(!n)throw new Z(U.InvalidParams,`Prompt ${r.name} not found`);if(!n.enabled)throw new Z(U.InvalidParams,`Prompt ${r.name} disabled`);if(!n.argsSchema)return zs;let i=Jr(n.argsSchema)?.[t.params.argument.name];if(!dm(i))return zs;let s=h$(i);if(!s)return zs;let a=await s(t.params.argument.value,t.params.context);return y$(a)}async handleResourceCompletion(t,r){let n=Object.values(this._registeredResourceTemplates).find(s=>s.resourceTemplate.uriTemplate.toString()===r.uri);if(!n){if(this._registeredResources[r.uri])return zs;throw new Z(U.InvalidParams,`Resource template ${t.params.ref.uri} not found`)}let o=n.resourceTemplate.completeCallback(t.params.argument.name);if(!o)return zs;let i=await o(t.params.argument.value,t.params.context);return y$(i)}setResourceRequestHandlers(){this._resourceHandlersInitialized||(this.server.assertCanSetRequestHandler(sn(Fa)),this.server.assertCanSetRequestHandler(sn(Ua)),this.server.assertCanSetRequestHandler(sn(Va)),this.server.registerCapabilities({resources:{listChanged:!0}}),this.server.setRequestHandler(Fa,async(t,r)=>{let n=Object.entries(this._registeredResources).filter(([i,s])=>s.enabled).map(([i,s])=>({uri:i,name:s.name,...s.metadata})),o=[];for(let i of Object.values(this._registeredResourceTemplates)){if(!i.resourceTemplate.listCallback)continue;let s=await i.resourceTemplate.listCallback(r);for(let a of s.resources)o.push({...i.metadata,...a})}return{resources:[...n,...o]}}),this.server.setRequestHandler(Ua,async()=>({resourceTemplates:Object.entries(this._registeredResourceTemplates).map(([r,n])=>({name:r,uriTemplate:n.resourceTemplate.uriTemplate.toString(),...n.metadata}))})),this.server.setRequestHandler(Va,async(t,r)=>{let n=new URL(t.params.uri),o=this._registeredResources[n.toString()];if(o){if(!o.enabled)throw new Z(U.InvalidParams,`Resource ${n} disabled`);return o.readCallback(n,r)}for(let i of Object.values(this._registeredResourceTemplates)){let s=i.resourceTemplate.uriTemplate.match(n.toString());if(s)return i.readCallback(n,s,r)}throw new Z(U.InvalidParams,`Resource ${n} not found`)}),this._resourceHandlersInitialized=!0)}setPromptRequestHandlers(){this._promptHandlersInitialized||(this.server.assertCanSetRequestHandler(sn(Ha)),this.server.assertCanSetRequestHandler(sn(Ba)),this.server.registerCapabilities({prompts:{listChanged:!0}}),this.server.setRequestHandler(Ha,()=>({prompts:Object.entries(this._registeredPrompts).filter(([,t])=>t.enabled).map(([t,r])=>({name:t,title:r.title,description:r.description,arguments:r.argsSchema?O1(r.argsSchema):void 0}))})),this.server.setRequestHandler(Ba,async(t,r)=>{let n=this._registeredPrompts[t.params.name];if(!n)throw new Z(U.InvalidParams,`Prompt ${t.params.name} not found`);if(!n.enabled)throw new Z(U.InvalidParams,`Prompt ${t.params.name} disabled`);if(n.argsSchema){let o=To(n.argsSchema),i=await Sa(o,t.params.arguments);if(!i.success){let c="error"in i?i.error:"Unknown error",u=ka(c);throw new Z(U.InvalidParams,`Invalid arguments for prompt ${t.params.name}: ${u}`)}let s=i.data,a=n.callback;return await Promise.resolve(a(s,r))}else{let o=n.callback;return await Promise.resolve(o(r))}}),this._promptHandlersInitialized=!0)}resource(t,r,...n){let o;typeof n[0]=="object"&&(o=n.shift());let i=n[0];if(typeof r=="string"){if(this._registeredResources[r])throw new Error(`Resource ${r} is already registered`);let s=this._createRegisteredResource(t,void 0,r,o,i);return this.setResourceRequestHandlers(),this.sendResourceListChanged(),s}else{if(this._registeredResourceTemplates[t])throw new Error(`Resource template ${t} is already registered`);let s=this._createRegisteredResourceTemplate(t,void 0,r,o,i);return this.setResourceRequestHandlers(),this.sendResourceListChanged(),s}}registerResource(t,r,n,o){if(typeof r=="string"){if(this._registeredResources[r])throw new Error(`Resource ${r} is already registered`);let i=this._createRegisteredResource(t,n.title,r,n,o);return this.setResourceRequestHandlers(),this.sendResourceListChanged(),i}else{if(this._registeredResourceTemplates[t])throw new Error(`Resource template ${t} is already registered`);let i=this._createRegisteredResourceTemplate(t,n.title,r,n,o);return this.setResourceRequestHandlers(),this.sendResourceListChanged(),i}}_createRegisteredResource(t,r,n,o,i){let s={name:t,title:r,metadata:o,readCallback:i,enabled:!0,disable:()=>s.update({enabled:!1}),enable:()=>s.update({enabled:!0}),remove:()=>s.update({uri:null}),update:a=>{typeof a.uri<"u"&&a.uri!==n&&(delete this._registeredResources[n],a.uri&&(this._registeredResources[a.uri]=s)),typeof a.name<"u"&&(s.name=a.name),typeof a.title<"u"&&(s.title=a.title),typeof a.metadata<"u"&&(s.metadata=a.metadata),typeof a.callback<"u"&&(s.readCallback=a.callback),typeof a.enabled<"u"&&(s.enabled=a.enabled),this.sendResourceListChanged()}};return this._registeredResources[n]=s,s}_createRegisteredResourceTemplate(t,r,n,o,i){let s={resourceTemplate:n,title:r,metadata:o,readCallback:i,enabled:!0,disable:()=>s.update({enabled:!1}),enable:()=>s.update({enabled:!0}),remove:()=>s.update({name:null}),update:u=>{typeof u.name<"u"&&u.name!==t&&(delete this._registeredResourceTemplates[t],u.name&&(this._registeredResourceTemplates[u.name]=s)),typeof u.title<"u"&&(s.title=u.title),typeof u.template<"u"&&(s.resourceTemplate=u.template),typeof u.metadata<"u"&&(s.metadata=u.metadata),typeof u.callback<"u"&&(s.readCallback=u.callback),typeof u.enabled<"u"&&(s.enabled=u.enabled),this.sendResourceListChanged()}};this._registeredResourceTemplates[t]=s;let a=n.uriTemplate.variableNames;return Array.isArray(a)&&a.some(u=>!!n.completeCallback(u))&&this.setCompletionRequestHandler(),s}_createRegisteredPrompt(t,r,n,o,i){let s={title:r,description:n,argsSchema:o===void 0?void 0:Hn(o),callback:i,enabled:!0,disable:()=>s.update({enabled:!1}),enable:()=>s.update({enabled:!0}),remove:()=>s.update({name:null}),update:a=>{typeof a.name<"u"&&a.name!==t&&(delete this._registeredPrompts[t],a.name&&(this._registeredPrompts[a.name]=s)),typeof a.title<"u"&&(s.title=a.title),typeof a.description<"u"&&(s.description=a.description),typeof a.argsSchema<"u"&&(s.argsSchema=Hn(a.argsSchema)),typeof a.callback<"u"&&(s.callback=a.callback),typeof a.enabled<"u"&&(s.enabled=a.enabled),this.sendPromptListChanged()}};return this._registeredPrompts[t]=s,o&&Object.values(o).some(c=>{let u=c instanceof bt?c._def?.innerType:c;return dm(u)})&&this.setCompletionRequestHandler(),s}_createRegisteredTool(t,r,n,o,i,s,a,c,u){fm(t);let l={title:r,description:n,inputSchema:g$(o),outputSchema:g$(i),annotations:s,execution:a,_meta:c,handler:u,enabled:!0,disable:()=>l.update({enabled:!1}),enable:()=>l.update({enabled:!0}),remove:()=>l.update({name:null}),update:d=>{typeof d.name<"u"&&d.name!==t&&(typeof d.name=="string"&&fm(d.name),delete this._registeredTools[t],d.name&&(this._registeredTools[d.name]=l)),typeof d.title<"u"&&(l.title=d.title),typeof d.description<"u"&&(l.description=d.description),typeof d.paramsSchema<"u"&&(l.inputSchema=Hn(d.paramsSchema)),typeof d.outputSchema<"u"&&(l.outputSchema=Hn(d.outputSchema)),typeof d.callback<"u"&&(l.handler=d.callback),typeof d.annotations<"u"&&(l.annotations=d.annotations),typeof d._meta<"u"&&(l._meta=d._meta),typeof d.enabled<"u"&&(l.enabled=d.enabled),this.sendToolListChanged()}};return this._registeredTools[t]=l,this.setToolRequestHandlers(),this.sendToolListChanged(),l}tool(t,...r){if(this._registeredTools[t])throw new Error(`Tool ${t} is already registered`);let n,o,i,s;if(typeof r[0]=="string"&&(n=r.shift()),r.length>1){let c=r[0];if(pm(c))o=r.shift(),r.length>1&&typeof r[0]=="object"&&r[0]!==null&&!pm(r[0])&&(s=r.shift());else if(typeof c=="object"&&c!==null){if(Object.values(c).some(u=>typeof u=="object"&&u!==null))throw new Error(`Tool ${t} expected a Zod schema or ToolAnnotations, but received an unrecognized object`);s=r.shift()}}let a=r[0];return this._createRegisteredTool(t,void 0,n,o,i,s,{taskSupport:"forbidden"},void 0,a)}registerTool(t,r,n){if(this._registeredTools[t])throw new Error(`Tool ${t} is already registered`);let{title:o,description:i,inputSchema:s,outputSchema:a,annotations:c,_meta:u}=r;return this._createRegisteredTool(t,o,i,s,a,c,{taskSupport:"forbidden"},u,n)}prompt(t,...r){if(this._registeredPrompts[t])throw new Error(`Prompt ${t} is already registered`);let n;typeof r[0]=="string"&&(n=r.shift());let o;r.length>1&&(o=r.shift());let i=r[0],s=this._createRegisteredPrompt(t,void 0,n,o,i);return this.setPromptRequestHandlers(),this.sendPromptListChanged(),s}registerPrompt(t,r,n){if(this._registeredPrompts[t])throw new Error(`Prompt ${t} is already registered`);let{title:o,description:i,argsSchema:s}=r,a=this._createRegisteredPrompt(t,o,i,s,n);return this.setPromptRequestHandlers(),this.sendPromptListChanged(),a}isConnected(){return this.server.transport!==void 0}async sendLoggingMessage(t,r){return this.server.sendLoggingMessage(t,r)}sendResourceListChanged(){this.isConnected()&&this.server.sendResourceListChanged()}sendToolListChanged(){this.isConnected()&&this.server.sendToolListChanged()}sendPromptListChanged(){this.isConnected()&&this.server.sendPromptListChanged()}};var E1={type:"object",properties:{}};function _$(e){return e!==null&&typeof e=="object"&&"parse"in e&&typeof e.parse=="function"&&"safeParse"in e&&typeof e.safeParse=="function"}function v$(e){return"_def"in e||"_zod"in e||_$(e)}function pm(e){return typeof e!="object"||e===null||v$(e)?!1:Object.keys(e).length===0?!0:Object.values(e).some(_$)}function g$(e){if(e){if(pm(e))return Hn(e);if(!v$(e))throw new Error("inputSchema must be a Zod schema or raw shape, received an unrecognized object");return e}}function O1(e){let t=Jr(e);return t?Object.entries(t).map(([r,n])=>{let o=X_(n),i=Y_(n);return{name:r,description:o,required:!i}}):[]}function sn(e){let r=Jr(e)?.method;if(!r)throw new Error("Schema is missing a method literal");let n=Pa(r);if(typeof n=="string")return n;throw new Error("Schema method literal must be a string")}function y$(e){return{completion:{values:e.slice(0,100),total:e.length,hasMore:e.length>100}}}var zs={completion:{values:[],hasMore:!1}};import w$ from"node:process";var Zc=class{append(t){this._buffer=this._buffer?Buffer.concat([this._buffer,t]):t}readMessage(){if(!this._buffer)return null;let t=this._buffer.indexOf(`
52
52
  `);if(t===-1)return null;let r=this._buffer.toString("utf8",0,t).replace(/\r$/,"");return this._buffer=this._buffer.subarray(t+1),C1(r)}clear(){this._buffer=void 0}};function C1(e){return zv.parse(JSON.parse(e))}function b$(e){return JSON.stringify(e)+`
53
- `}var Lc=class{constructor(t=w$.stdin,r=w$.stdout){this._stdin=t,this._stdout=r,this._readBuffer=new Zc,this._started=!1,this._ondata=n=>{this._readBuffer.append(n),this.processReadBuffer()},this._onerror=n=>{this.onerror?.(n)}}async start(){if(this._started)throw new Error("StdioServerTransport already started! If using Server class, note that connect() calls start() automatically.");this._started=!0,this._stdin.on("data",this._ondata),this._stdin.on("error",this._onerror)}processReadBuffer(){for(;;)try{let t=this._readBuffer.readMessage();if(t===null)break;this.onmessage?.(t)}catch(t){this.onerror?.(t)}}async close(){this._stdin.off("data",this._ondata),this._stdin.off("error",this._onerror),this._stdin.listenerCount("data")===0&&this._stdin.pause(),this._readBuffer.clear(),this.onclose?.()}send(t){return new Promise(r=>{let n=b$(t);this._stdout.write(n)?r():this._stdout.once("drain",r)})}};function mm(e){let t={app:e,version:j1(Xo("__RED_BUILD_VERSION__",()=>"3.22.0")??"0.0.0-dev"),gitSha:Xo("__RED_BUILD_GIT_SHA__",()=>"53eec7c8eb923fc07e8fbd874db331874f68a106")??"unknown",buildTime:Xo("__RED_BUILD_TIME__",()=>"2026-08-19T11:39:10-03:00")??"unknown",bundleAsset:Xo("__RED_BUNDLE_ASSET__",()=>"code-nav.bundle.min.mjs")??"unknown"},r=Xo("__REDDB_SDK_VERSION__",()=>""),n=Xo("__REDDB_BINARY_TAG__",()=>"");return r&&(t.reddbSdkVersion=r),n&&(t.reddbBinaryTag=n),t}function j1(e){return e.startsWith("v")?e.slice(1):e}function x$(e){return`${e.app} ${e.version} ${e.gitSha}`}function Xo(e,t){try{let r=t();return typeof r=="string"&&r.length>0?r:void 0}catch{return process.env[e.replace(/^__|__$/g,"")]}}var $$={"=":"data",":=":{to:"data",typed:!0},":":"meta"},N1=/^[a-z][a-z0-9+.-]*:\/\//i;function I1(e,t){return typeof t=="string"?{separator:e,to:t,typed:!1,prefix:!1}:{separator:e,to:t.to,typed:t.typed??!1,prefix:t.prefix??!1}}function M1(e=$$){return Object.entries(e).map(([t,r])=>I1(t,r)).sort((t,r)=>r.separator.length-t.separator.length)}function D1(e){return/^-\d+(\.\d+)?$/.test(e)}function Es(e){return!(!e||e.startsWith("-")&&!D1(e))}function Fc(e){if(e==="true")return!0;if(e==="false")return!1;if(e==="null")return null;let t=Number(e);return!Number.isNaN(t)&&Number.isFinite(t)&&e.trim()!==""?t:e}function S$(e){if(e==="true")return!0;if(e==="false")return!1;if(e==="null")return null;if(e.startsWith("[")&&e.endsWith("]")||e.startsWith("{")&&e.endsWith("}"))try{return JSON.parse(e)}catch{}let t=Number(e);return!Number.isNaN(t)&&Number.isFinite(t)&&e.trim()!==""?t:e.includes(",")?e.split(",").map(r=>S$(r.trim())):e}function no(e,t){switch(t){case"boolean":return A1(e);case"number":return q1(e);case"array":return e.split(",").map(r=>Fc(r.trim()));default:return e}}function A1(e){let t=e.toLowerCase().trim();return t==="true"||t==="yes"||t==="1"||t==="on"}function q1(e){if(e.trim()==="")throw new TypeError(`Cannot convert "${e}" to number`);let t=Number(e);if(Number.isNaN(t))throw new TypeError(`Cannot convert "${e}" to number`);return t}function an(e){return e.startsWith('"')&&e.endsWith('"')||e.startsWith("'")&&e.endsWith("'")?e.slice(1,-1):e}function Z1(e,t={}){return e.map(r=>{let n=t[r.type];return n?n(r.value):r.value}).join("")}function $e(e,t){return{type:e,value:t}}function L1(e){let t=[],r=U1(e);if(t.push($e("section-header","Usage:"),$e("text"," "),$e("usage-text",r),$e("newline",`
53
+ `}var Lc=class{constructor(t=w$.stdin,r=w$.stdout){this._stdin=t,this._stdout=r,this._readBuffer=new Zc,this._started=!1,this._ondata=n=>{this._readBuffer.append(n),this.processReadBuffer()},this._onerror=n=>{this.onerror?.(n)}}async start(){if(this._started)throw new Error("StdioServerTransport already started! If using Server class, note that connect() calls start() automatically.");this._started=!0,this._stdin.on("data",this._ondata),this._stdin.on("error",this._onerror)}processReadBuffer(){for(;;)try{let t=this._readBuffer.readMessage();if(t===null)break;this.onmessage?.(t)}catch(t){this.onerror?.(t)}}async close(){this._stdin.off("data",this._ondata),this._stdin.off("error",this._onerror),this._stdin.listenerCount("data")===0&&this._stdin.pause(),this._readBuffer.clear(),this.onclose?.()}send(t){return new Promise(r=>{let n=b$(t);this._stdout.write(n)?r():this._stdout.once("drain",r)})}};function mm(e){let t={app:e,version:j1(Xo("__RED_BUILD_VERSION__",()=>"4.0.0")??"0.0.0-dev"),gitSha:Xo("__RED_BUILD_GIT_SHA__",()=>"6c163bc47f1b153cc1504df500caf8005238c0fe")??"unknown",buildTime:Xo("__RED_BUILD_TIME__",()=>"2026-08-19T21:24:35Z")??"unknown",bundleAsset:Xo("__RED_BUNDLE_ASSET__",()=>"code-nav.bundle.min.mjs")??"unknown"},r=Xo("__REDDB_SDK_VERSION__",()=>""),n=Xo("__REDDB_BINARY_TAG__",()=>"");return r&&(t.reddbSdkVersion=r),n&&(t.reddbBinaryTag=n),t}function j1(e){return e.startsWith("v")?e.slice(1):e}function x$(e){return`${e.app} ${e.version} ${e.gitSha}`}function Xo(e,t){try{let r=t();return typeof r=="string"&&r.length>0?r:void 0}catch{return process.env[e.replace(/^__|__$/g,"")]}}var $$={"=":"data",":=":{to:"data",typed:!0},":":"meta"},N1=/^[a-z][a-z0-9+.-]*:\/\//i;function I1(e,t){return typeof t=="string"?{separator:e,to:t,typed:!1,prefix:!1}:{separator:e,to:t.to,typed:t.typed??!1,prefix:t.prefix??!1}}function M1(e=$$){return Object.entries(e).map(([t,r])=>I1(t,r)).sort((t,r)=>r.separator.length-t.separator.length)}function D1(e){return/^-\d+(\.\d+)?$/.test(e)}function Es(e){return!(!e||e.startsWith("-")&&!D1(e))}function Fc(e){if(e==="true")return!0;if(e==="false")return!1;if(e==="null")return null;let t=Number(e);return!Number.isNaN(t)&&Number.isFinite(t)&&e.trim()!==""?t:e}function S$(e){if(e==="true")return!0;if(e==="false")return!1;if(e==="null")return null;if(e.startsWith("[")&&e.endsWith("]")||e.startsWith("{")&&e.endsWith("}"))try{return JSON.parse(e)}catch{}let t=Number(e);return!Number.isNaN(t)&&Number.isFinite(t)&&e.trim()!==""?t:e.includes(",")?e.split(",").map(r=>S$(r.trim())):e}function no(e,t){switch(t){case"boolean":return A1(e);case"number":return q1(e);case"array":return e.split(",").map(r=>Fc(r.trim()));default:return e}}function A1(e){let t=e.toLowerCase().trim();return t==="true"||t==="yes"||t==="1"||t==="on"}function q1(e){if(e.trim()==="")throw new TypeError(`Cannot convert "${e}" to number`);let t=Number(e);if(Number.isNaN(t))throw new TypeError(`Cannot convert "${e}" to number`);return t}function an(e){return e.startsWith('"')&&e.endsWith('"')||e.startsWith("'")&&e.endsWith("'")?e.slice(1,-1):e}function Z1(e,t={}){return e.map(r=>{let n=t[r.type];return n?n(r.value):r.value}).join("")}function $e(e,t){return{type:e,value:t}}function L1(e){let t=[],r=U1(e);if(t.push($e("section-header","Usage:"),$e("text"," "),$e("usage-text",r),$e("newline",`
54
54
  `),$e("newline",`
55
55
  `)),e.positional&&e.positional.length>0){t.push($e("section-header","Arguments:"),$e("newline",`
56
56
  `));for(let n of e.positional)if(n.description){let o=n.variadic?`${n.name}...`:n.name;t.push($e("indent"," "),$e("positional-name",`<${o}>`)),n.required||t.push($e("positional-optional"," (optional)")),t.push($e("newline",`
@@ -1,13 +1,13 @@
1
1
  import { createRequire as __cr } from 'node:module'; const require = __cr(import.meta.url);
2
- import{mkdirSync as Ee,readFileSync as tn,writeFileSync as nn}from"node:fs";import{dirname as on,resolve as V}from"node:path";function W(e){let t={app:e,version:Ce($("__RED_BUILD_VERSION__",()=>"3.22.0")??"0.0.0-dev"),gitSha:$("__RED_BUILD_GIT_SHA__",()=>"53eec7c8eb923fc07e8fbd874db331874f68a106")??"unknown",buildTime:$("__RED_BUILD_TIME__",()=>"2026-08-19T11:39:10-03:00")??"unknown",bundleAsset:$("__RED_BUNDLE_ASSET__",()=>"opencode-host.bundle.min.mjs")??"unknown"},n=$("__REDDB_SDK_VERSION__",()=>""),o=$("__REDDB_BINARY_TAG__",()=>"");return n&&(t.reddbSdkVersion=n),o&&(t.reddbBinaryTag=o),t}function Ce(e){return e.startsWith("v")?e.slice(1):e}function G(e){return`${e.app} ${e.version} ${e.gitSha}`}function $(e,t){try{let n=t();return typeof n=="string"&&n.length>0?n:void 0}catch{return process.env[e.replace(/^__|__$/g,"")]}}var ne={"=":"data",":=":{to:"data",typed:!0},":":"meta"},Te=/^[a-z][a-z0-9+.-]*:\/\//i;function Ie(e,t){return typeof t=="string"?{separator:e,to:t,typed:!1,prefix:!1}:{separator:e,to:t.to,typed:t.typed??!1,prefix:t.prefix??!1}}function je(e=ne){return Object.entries(e).map(([t,n])=>Ie(t,n)).sort((t,n)=>n.separator.length-t.separator.length)}function Fe(e){return/^-\d+(\.\d+)?$/.test(e)}function S(e){return!(!e||e.startsWith("-")&&!Fe(e))}function A(e){if(e==="true")return!0;if(e==="false")return!1;if(e==="null")return null;let t=Number(e);return!Number.isNaN(t)&&Number.isFinite(t)&&e.trim()!==""?t:e}function oe(e){if(e==="true")return!0;if(e==="false")return!1;if(e==="null")return null;if(e.startsWith("[")&&e.endsWith("]")||e.startsWith("{")&&e.endsWith("}"))try{return JSON.parse(e)}catch{}let t=Number(e);return!Number.isNaN(t)&&Number.isFinite(t)&&e.trim()!==""?t:e.includes(",")?e.split(",").map(n=>oe(n.trim())):e}function v(e,t){switch(t){case"boolean":return Ne(e);case"number":return De(e);case"array":return e.split(",").map(n=>A(n.trim()));case"string":default:return e}}function Ne(e){let t=e.toLowerCase().trim();return t==="true"||t==="yes"||t==="1"||t==="on"}function De(e){if(e.trim()==="")throw new TypeError(`Cannot convert "${e}" to number`);let t=Number(e);if(Number.isNaN(t))throw new TypeError(`Cannot convert "${e}" to number`);return t}function _(e){return e.startsWith('"')&&e.endsWith('"')||e.startsWith("'")&&e.endsWith("'")?e.slice(1,-1):e}function Me(e,t={}){return e.map(n=>{let o=t[n.type];return o?o(n.value):n.value}).join("")}function g(e,t){return{type:e,value:t}}function Le(e){let t=[],n=Ve(e);if(t.push(g("section-header","Usage:"),g("text"," "),g("usage-text",n),g("newline",`
2
+ import{mkdirSync as Pe,readFileSync as nn,writeFileSync as on}from"node:fs";import{dirname as sn,resolve as V}from"node:path";function W(e){let t={app:e,version:Ce(b("__RED_BUILD_VERSION__",()=>"4.0.0")??"0.0.0-dev"),gitSha:b("__RED_BUILD_GIT_SHA__",()=>"6c163bc47f1b153cc1504df500caf8005238c0fe")??"unknown",buildTime:b("__RED_BUILD_TIME__",()=>"2026-08-19T21:24:35Z")??"unknown",bundleAsset:b("__RED_BUNDLE_ASSET__",()=>"opencode-host.bundle.min.mjs")??"unknown"},n=b("__REDDB_SDK_VERSION__",()=>""),s=b("__REDDB_BINARY_TAG__",()=>"");return n&&(t.reddbSdkVersion=n),s&&(t.reddbBinaryTag=s),t}function Ce(e){return e.startsWith("v")?e.slice(1):e}function G(e){return`${e.app} ${e.version} ${e.gitSha}`}function b(e,t){try{let n=t();return typeof n=="string"&&n.length>0?n:void 0}catch{return process.env[e.replace(/^__|__$/g,"")]}}var ne={"=":"data",":=":{to:"data",typed:!0},":":"meta"},Te=/^[a-z][a-z0-9+.-]*:\/\//i;function Ie(e,t){return typeof t=="string"?{separator:e,to:t,typed:!1,prefix:!1}:{separator:e,to:t.to,typed:t.typed??!1,prefix:t.prefix??!1}}function je(e=ne){return Object.entries(e).map(([t,n])=>Ie(t,n)).sort((t,n)=>n.separator.length-t.separator.length)}function Fe(e){return/^-\d+(\.\d+)?$/.test(e)}function $(e){return!(!e||e.startsWith("-")&&!Fe(e))}function A(e){if(e==="true")return!0;if(e==="false")return!1;if(e==="null")return null;let t=Number(e);return!Number.isNaN(t)&&Number.isFinite(t)&&e.trim()!==""?t:e}function oe(e){if(e==="true")return!0;if(e==="false")return!1;if(e==="null")return null;if(e.startsWith("[")&&e.endsWith("]")||e.startsWith("{")&&e.endsWith("}"))try{return JSON.parse(e)}catch{}let t=Number(e);return!Number.isNaN(t)&&Number.isFinite(t)&&e.trim()!==""?t:e.includes(",")?e.split(",").map(n=>oe(n.trim())):e}function k(e,t){switch(t){case"boolean":return Ne(e);case"number":return De(e);case"array":return e.split(",").map(n=>A(n.trim()));case"string":default:return e}}function Ne(e){let t=e.toLowerCase().trim();return t==="true"||t==="yes"||t==="1"||t==="on"}function De(e){if(e.trim()==="")throw new TypeError(`Cannot convert "${e}" to number`);let t=Number(e);if(Number.isNaN(t))throw new TypeError(`Cannot convert "${e}" to number`);return t}function _(e){return e.startsWith('"')&&e.endsWith('"')||e.startsWith("'")&&e.endsWith("'")?e.slice(1,-1):e}function Me(e,t={}){return e.map(n=>{let s=t[n.type];return s?s(n.value):n.value}).join("")}function g(e,t){return{type:e,value:t}}function Le(e){let t=[],n=Ve(e);if(t.push(g("section-header","Usage:"),g("text"," "),g("usage-text",n),g("newline",`
3
3
  `),g("newline",`
4
4
  `)),e.positional&&e.positional.length>0){t.push(g("section-header","Arguments:"),g("newline",`
5
- `));for(let o of e.positional)if(o.description){let s=o.variadic?`${o.name}...`:o.name;t.push(g("indent"," "),g("positional-name",`<${s}>`)),o.required||t.push(g("positional-optional"," (optional)")),t.push(g("newline",`
6
- `),g("indent"," "),g("option-description",o.description),g("newline",`
5
+ `));for(let s of e.positional)if(s.description){let o=s.variadic?`${s.name}...`:s.name;t.push(g("indent"," "),g("positional-name",`<${o}>`)),s.required||t.push(g("positional-optional"," (optional)")),t.push(g("newline",`
6
+ `),g("indent"," "),g("option-description",s.description),g("newline",`
7
7
  `))}t.push(g("newline",`
8
8
  `))}if(e.options&&Object.keys(e.options).length>0){t.push(g("section-header","Options:"),g("newline",`
9
- `));let o=He(e.options);t.push(...o)}return t}function Ue(e,t){let n=Le(e);return Me(n,t)}function Ve(e){let t=["[options]"];if(e.positional)for(let n of e.positional)n.variadic?t.push(n.required?`<${n.name}...>`:`[${n.name}...]`):t.push(n.required?`<${n.name}>`:`[${n.name}]`);return t.join(" ")}function He(e,t=!1){let n=[],o=[],s=t?"global-option-flag":"option-flag",i=t?"global-option-type":"option-type",r=t?"global-option-default":"option-default",a=t?"global-option-description":"option-description";for(let[u,l]of Object.entries(e)){if(l.hidden)continue;let f=[],p=y=>{f.includes(y)||f.push(y)};l.short&&p(`-${l.short}`),p(`--${u}`);for(let y of l.aliases??[])y.length===1?p(`-${y}`):p(`--${y}`);let d=f.join(", "),h=l.type&&l.type!=="boolean"?`<${l.type}>`:void 0;o.push({flags:d,type:h,desc:l.description??"",default:l.default!==void 0?String(l.default):void 0})}let c=Math.max(...o.map(u=>u.flags.length+(u.type?u.type.length+1:0)),20);for(let u of o){let l=u.flags.length+(u.type?u.type.length+1:0),f=" ".repeat(c-l+2);n.push(g("indent"," ")),n.push(g(s,u.flags)),u.type&&(n.push(g("text"," ")),n.push(g(i,u.type))),n.push(g("text",f)),n.push(g(a,u.desc)),u.default!==void 0&&(n.push(g("text"," ")),n.push(g(r,`(default: ${u.default})`))),n.push(g("newline",`
10
- `))}return n}function se(e){let t=Je(e.options??{},e.autoShort??!1),n=je(e.separators??ne);return{schema:e,parse(o){return We(o,e,t,n)},help(){return Ue(e,e.formatter)}}}function We(e,t,n,o){let s={positional:{},options:{},errors:[],rest:[]},i=new Set(o.map(l=>l.to));for(let l of i)s[l]={};let r=0,a=t.positional??[],c=0,u=!1;for(;c<e.length;){let l=e[c];if(t.stopEarly&&r>0){s.rest=e.slice(c);break}if(l==="--"&&!u){u=!0,c++;continue}if(u){if(r<a.length){let p=a[r];if(p.variadic){let d=[];for(;c<e.length;){let h=e[c];d.push(p.type?v(h,p.type):h),c++}s.positional[p.name]=d,r++}else{let d=p.type?v(l,p.type):l;s.positional[p.name]=d,r++,c++}}else t.allowUnknown!==!1&&(s.rest=s.rest??[],s.rest.push(l)),c++;continue}if(l.startsWith("--")){c=Ke(l,c,e,s,n,t);continue}if(l.startsWith("-")&&l.length>1&&!et(l)){c=ze(l,c,e,s,n,t);continue}let f=Ge(l,o);if(f){let{key:p,value:d,config:h}=f,y=s,b=y[h.to]??(y[h.to]={});b[p]=h.typed?oe(d):_(d),c++;continue}if(r<a.length){let p=a[r];if(p.variadic){let h=[];for(;c<e.length&&!e[c].startsWith("-");){let y=e[c];h.push(p.type?v(y,p.type):y),c++}s.positional[p.name]=h,r++;continue}let d=p.type?v(l,p.type):l;s.positional[p.name]=d,r++}else t.allowUnknown!==!1?s.rest.push(l):s.errors.push(`Unexpected positional argument: ${l}`);c++}return Ye(s,t,n),Xe(s,t,a),Qe(s,t,n),s}function Ge(e,t){if(Te.test(e))return null;for(let n of t){if(n.prefix&&e.startsWith(n.separator)){let s=e.slice(n.separator.length),i=s.indexOf(":");if(i>0){let r=s.slice(0,i),a=s.slice(i+1);if(qe(r))return{key:r,value:a,config:n}}continue}let o=e.indexOf(n.separator);if(o>0){let s=e.slice(0,o),i=e.slice(o+n.separator.length);if(Be(s,i,n))return{key:s,value:i,config:n}}}return null}function qe(e){return e?/^[a-zA-Z_][a-zA-Z0-9_-]*$/.test(e):!1}function Be(e,t,n){return e?n.separator===":"?e.includes("/")||e.includes(".")||/^\d+$/.test(t)?!1:/^[A-Z][a-zA-Z0-9-]*$/.test(e):!((n.separator==="="||n.separator===":=")&&e.includes("/")):!1}function Ke(e,t,n,o,s,i){let r=e.slice(2);if(r.startsWith("no-")){let c=r.slice(3),u=s.get(c);if(u?.negatable!==!1&&u?.type==="boolean")return o.options[u.name]=!1,t+1}if(r.includes("=")){let c=r.indexOf("="),u=r.slice(0,c),l=r.slice(c+1);return C(u,l,t+1,o,s,i)}let a=s.get(r);if(a){if(a.type!=="boolean"){let c=n[t+1];return S(c)?C(a.name,c,t+2,o,s,i):(o.errors.push(`Option --${r} requires a value`),t+1)}return o.options[a.name]=!0,t+1}return i.strict?o.errors.push(`Unknown option: --${r}`):i.allowUnknown!==!1&&(o.options[r]=!0),t+1}function ze(e,t,n,o,s,i){let r=e.slice(1);if(r.includes("=")){let a=r.indexOf("="),c=r.slice(0,a),u=r.slice(a+1),l=q(c,s);return l?C(l.name,u,t+1,o,s,i):(i.strict?o.errors.push(`Unknown option: -${c}`):i.allowUnknown!==!1&&(o.options[c]=A(_(u))),t+1)}if(r.length===1){let a=q(r,s);if(a){if(a.type!=="boolean"){let c=n[t+1];return S(c)?C(a.name,c,t+2,o,s,i):(o.errors.push(`Option -${r} requires a value`),t+1)}return o.options[a.name]=!0,t+1}if(i.strict)o.errors.push(`Unknown option: -${r}`);else if(i.allowUnknown!==!1){let c=n[t+1];if(S(c))return o.options[r]=A(_(c)),t+2;o.options[r]=!0}return t+1}for(let a of r){let c=q(a,s);c?c.type==="boolean"?o.options[c.name]=!0:o.errors.push(`Option -${a} requires a value`):i.strict?o.errors.push(`Unknown option: -${a}`):i.allowUnknown!==!1&&(o.options[a]=!0)}return t+1}function C(e,t,n,o,s,i){let r=s.get(e);if(r){if(r.choices){let c=r.type?v(_(t),r.type):_(t);if(!r.choices.includes(c))return o.errors.push(`Invalid value for '${e}': '${t}'. Allowed: ${r.choices.join(", ")}`),n}let a=r.type?v(_(t),r.type):_(t);if(r.type==="array"){let c=o.options[e];Array.isArray(c)?c.push(...a):o.options[e]=a}else o.options[e]=a}else i.strict?o.errors.push(`Unknown option: --${e}`):i.allowUnknown!==!1&&(o.options[e]=A(_(t)));return n}function Je(e,t=!1){let n=new Map,o=Object.entries(e).sort(([i],[r])=>i.localeCompare(r)),s=new Set;for(let[,i]of o)i.short&&s.add(i.short);for(let[i,r]of o){let a=r.short??"";t&&!a&&(a=Ze(i,s),a&&s.add(a));let c={name:i,short:a,aliases:r.aliases??[],type:r.type??"string",description:r.description??"",required:r.required??!1,hidden:r.hidden??!1,negatable:r.negatable??!0,default:r.default,choices:r.choices,env:r.env,validate:r.validate};n.set(i,c);for(let u of c.aliases)n.set(u,c)}return n}function Ze(e,t){for(let n of e){if(!/[a-zA-Z]/.test(n))continue;let o=n.toLowerCase();if(!t.has(o))return o;let s=n.toUpperCase();if(!t.has(s))return s}return""}function q(e,t){for(let n of t.values())if(n.short===e||n.aliases.includes(e))return n}function Ye(e,t,n){for(let o of n.values())if(e.options[o.name]===void 0)if(o.env&&process.env[o.env]!==void 0){let s=process.env[o.env];e.options[o.name]=o.type?v(s,o.type):s}else o.default!==void 0&&(e.options[o.name]=o.default);for(let o of t.positional??[])e.positional[o.name]===void 0&&o.default!==void 0&&(e.positional[o.name]=o.default)}function Xe(e,t,n){if(t.options)for(let[o,s]of Object.entries(t.options))s.required&&e.options[o]===void 0&&e.errors.push(`Missing required option: --${o}`);for(let o of n)o.required&&e.positional[o.name]===void 0&&e.errors.push(`Missing required argument: <${o.name}>`)}function Qe(e,t,n){for(let o of n.values()){let s=e.options[o.name];if(o.validate&&s!==void 0){let i=o.validate(s);i!==!0&&e.errors.push(i)}}for(let o of t.positional??[]){let s=e.positional[o.name];if(o.validate&&s!==void 0){let i=o.validate(s);i!==!0&&e.errors.push(i)}}}function et(e){return/^-\d+(\.\d+)?$/.test(e)}var B=class extends Error{flag;known;constructor(t,n){super(`unknown flag '${t}'; expected one of: ${n.join(", ")}`),this.name="UnknownFlagError",this.flag=t,this.known=n}};function tt(e){let t={};for(let[n,o]of Object.entries(e))t[n]={type:o.kind==="boolean"?"boolean":"string",...n.length===1?{short:n}:{},...o.aliases===void 0?{}:{aliases:o.aliases}};return t}function nt(e,t){let n=new Map;for(let[s,i]of Object.entries(t))if(!(i.kind!=="value"||i.type!=="array")){n.set(s,s);for(let r of i.aliases??[])n.set(r,s)}let o=new Map;for(let s=0;s<e.length;s+=1){let i=e[s];if(i==="--")break;let r=i.match(/^--([^=]+)(?:=(.*))?$/)??i.match(/^-([^=])(?:=(.*))?$/);if(r===null)continue;let a=n.get(r[1]);if(a===void 0)continue;let c=r[2];if(c===void 0&&S(e[s+1])&&(c=e[s+1],s+=1),c===void 0)continue;let u=o.get(a)??[];u.push(c),o.set(a,u)}return o}function re(e,t,n={}){let s=se({options:tt(t),separators:{},allowUnknown:!0}).parse([...e]),i={},r=nt(e,t),a=s.errors.find(c=>/^Option --?\S+ requires a value$/.test(c));if(a!==void 0)throw new Error(a.replace(/^Option /,""));if(s.errors.length>0)throw new Error(s.errors[0]);if(n.unknownFlags==="error"){let c=new Set(Object.keys(t));for(let u of Object.keys(s.options))if(!c.has(u))throw new B(u.length===1?`-${u}`:`--${u}`,Object.keys(t).map(l=>l.length===1?`-${l}`:`--${l}`))}for(let[c,u]of Object.entries(t)){let l=s.options[c];l!==void 0&&(u.kind==="boolean"?i[c]=l:u.type==="array"?i[c]=(r.get(c)??[]).map(f=>u.coerce(f)):i[c]=u.coerce(String(l)))}return{values:i,positionals:s.rest}}var O=class extends Error{token;known;constructor(t,n){super(`unknown command '${t}'; expected one of: ${n.join(", ")}`),this.name="UnknownCommandError",this.token=t,this.known=n}};function ie(e,t){let[n,...o]=e;if(n!==void 0){for(let[i,r]of Object.entries(t.commands))if(n===i||(r.aliases??[]).includes(n))return{command:i,args:o};if(t.errorOnUnknownCommand&&!n.startsWith("-"))throw new O(n,Object.keys(t.commands))}let s=t.keepArgvOnDefault??!0;return{command:t.default,args:s?[...e]:o}}var K=["opencode","redcode"],ot={opencode:!1,redcode:!0},st=["navigator"];function rt(e){return st.includes(e)}function ce(e){return K.includes(e)}function T(e,t){return{host:e,nativeLsp:t??ot[e]}}function it(e){return e.nativeLsp}function I(e,t){if(!it(t))return{plans:[...e],deferred:[]};let n=[],o=[];for(let s of e)rt(s.name)?o.push(s.name):n.push(s);return{plans:n,deferred:o}}var ct={config:{kind:"value",aliases:["c"],coerce:e=>e},out:{kind:"value",aliases:["o"],coerce:e=>e},"out-dir":{kind:"value",aliases:["d"],coerce:e=>e},"plugins-root":{kind:"value",aliases:["p"],coerce:e=>e},host:{kind:"value",coerce:e=>e},"native-lsp":{kind:"boolean"},plugin:{kind:"value",type:"array",coerce:e=>e},"slice-2":{kind:"boolean",aliases:["with-slice-2"]},copy:{kind:"boolean"},print:{kind:"boolean"},help:{kind:"boolean",aliases:["h"]},version:{kind:"boolean",aliases:["v"]},json:{kind:"boolean"}},w=class extends Error{constructor(t){super(t),this.name="OpencodeHostUsageError"}};function ae(e){return e[0]==="--version"||e[0]==="-v"}function le(e){let t;try{t=ie(e,{commands:{generate:{}},default:"generate",errorOnUnknownCommand:!0})}catch(r){throw r instanceof O?new w(r.message):r}let n;try{n=re(t.args,ct,{unknownFlags:"error"})}catch(r){throw new w(r.message)}let o=n.positionals[0];if(o!==void 0)throw new w(`unexpected argument '${o}'`);let{values:s}=n,i=s.host??"opencode";if(!ce(i))throw new w(`unsupported --host '${i}'; expected one of: ${K.join(", ")}`);return{command:t.command,configPath:s.config??"./.red/config.yaml",outPath:s.out??"./opencode.json",outDir:s["out-dir"]??"./dist/opencode",pluginsRoot:s["plugins-root"]??"./plugins",host:i,nativeLsp:s["native-lsp"],showHelp:s.help??!1,showVersion:s.version??!1,versionJson:s.json??!1,printJson:s.print??!1,copySkills:s.copy??!1,pluginFilter:s.plugin??null,slice2:s["slice-2"]??!0}}function ue(){return`opencode-host generate \u2014 emit the opencode-host runtime tree
9
+ `));let s=He(e.options);t.push(...s)}return t}function Ue(e,t){let n=Le(e);return Me(n,t)}function Ve(e){let t=["[options]"];if(e.positional)for(let n of e.positional)n.variadic?t.push(n.required?`<${n.name}...>`:`[${n.name}...]`):t.push(n.required?`<${n.name}>`:`[${n.name}]`);return t.join(" ")}function He(e,t=!1){let n=[],s=[],o=t?"global-option-flag":"option-flag",i=t?"global-option-type":"option-type",r=t?"global-option-default":"option-default",a=t?"global-option-description":"option-description";for(let[u,l]of Object.entries(e)){if(l.hidden)continue;let f=[],p=y=>{f.includes(y)||f.push(y)};l.short&&p(`-${l.short}`),p(`--${u}`);for(let y of l.aliases??[])y.length===1?p(`-${y}`):p(`--${y}`);let d=f.join(", "),h=l.type&&l.type!=="boolean"?`<${l.type}>`:void 0;s.push({flags:d,type:h,desc:l.description??"",default:l.default!==void 0?String(l.default):void 0})}let c=Math.max(...s.map(u=>u.flags.length+(u.type?u.type.length+1:0)),20);for(let u of s){let l=u.flags.length+(u.type?u.type.length+1:0),f=" ".repeat(c-l+2);n.push(g("indent"," ")),n.push(g(o,u.flags)),u.type&&(n.push(g("text"," ")),n.push(g(i,u.type))),n.push(g("text",f)),n.push(g(a,u.desc)),u.default!==void 0&&(n.push(g("text"," ")),n.push(g(r,`(default: ${u.default})`))),n.push(g("newline",`
10
+ `))}return n}function se(e){let t=Je(e.options??{},e.autoShort??!1),n=je(e.separators??ne);return{schema:e,parse(s){return We(s,e,t,n)},help(){return Ue(e,e.formatter)}}}function We(e,t,n,s){let o={positional:{},options:{},errors:[],rest:[]},i=new Set(s.map(l=>l.to));for(let l of i)o[l]={};let r=0,a=t.positional??[],c=0,u=!1;for(;c<e.length;){let l=e[c];if(t.stopEarly&&r>0){o.rest=e.slice(c);break}if(l==="--"&&!u){u=!0,c++;continue}if(u){if(r<a.length){let p=a[r];if(p.variadic){let d=[];for(;c<e.length;){let h=e[c];d.push(p.type?k(h,p.type):h),c++}o.positional[p.name]=d,r++}else{let d=p.type?k(l,p.type):l;o.positional[p.name]=d,r++,c++}}else t.allowUnknown!==!1&&(o.rest=o.rest??[],o.rest.push(l)),c++;continue}if(l.startsWith("--")){c=Ke(l,c,e,o,n,t);continue}if(l.startsWith("-")&&l.length>1&&!et(l)){c=ze(l,c,e,o,n,t);continue}let f=Ge(l,s);if(f){let{key:p,value:d,config:h}=f,y=o,S=y[h.to]??(y[h.to]={});S[p]=h.typed?oe(d):_(d),c++;continue}if(r<a.length){let p=a[r];if(p.variadic){let h=[];for(;c<e.length&&!e[c].startsWith("-");){let y=e[c];h.push(p.type?k(y,p.type):y),c++}o.positional[p.name]=h,r++;continue}let d=p.type?k(l,p.type):l;o.positional[p.name]=d,r++}else t.allowUnknown!==!1?o.rest.push(l):o.errors.push(`Unexpected positional argument: ${l}`);c++}return Ye(o,t,n),Xe(o,t,a),Qe(o,t,n),o}function Ge(e,t){if(Te.test(e))return null;for(let n of t){if(n.prefix&&e.startsWith(n.separator)){let o=e.slice(n.separator.length),i=o.indexOf(":");if(i>0){let r=o.slice(0,i),a=o.slice(i+1);if(qe(r))return{key:r,value:a,config:n}}continue}let s=e.indexOf(n.separator);if(s>0){let o=e.slice(0,s),i=e.slice(s+n.separator.length);if(Be(o,i,n))return{key:o,value:i,config:n}}}return null}function qe(e){return e?/^[a-zA-Z_][a-zA-Z0-9_-]*$/.test(e):!1}function Be(e,t,n){return e?n.separator===":"?e.includes("/")||e.includes(".")||/^\d+$/.test(t)?!1:/^[A-Z][a-zA-Z0-9-]*$/.test(e):!((n.separator==="="||n.separator===":=")&&e.includes("/")):!1}function Ke(e,t,n,s,o,i){let r=e.slice(2);if(r.startsWith("no-")){let c=r.slice(3),u=o.get(c);if(u?.negatable!==!1&&u?.type==="boolean")return s.options[u.name]=!1,t+1}if(r.includes("=")){let c=r.indexOf("="),u=r.slice(0,c),l=r.slice(c+1);return C(u,l,t+1,s,o,i)}let a=o.get(r);if(a){if(a.type!=="boolean"){let c=n[t+1];return $(c)?C(a.name,c,t+2,s,o,i):(s.errors.push(`Option --${r} requires a value`),t+1)}return s.options[a.name]=!0,t+1}return i.strict?s.errors.push(`Unknown option: --${r}`):i.allowUnknown!==!1&&(s.options[r]=!0),t+1}function ze(e,t,n,s,o,i){let r=e.slice(1);if(r.includes("=")){let a=r.indexOf("="),c=r.slice(0,a),u=r.slice(a+1),l=q(c,o);return l?C(l.name,u,t+1,s,o,i):(i.strict?s.errors.push(`Unknown option: -${c}`):i.allowUnknown!==!1&&(s.options[c]=A(_(u))),t+1)}if(r.length===1){let a=q(r,o);if(a){if(a.type!=="boolean"){let c=n[t+1];return $(c)?C(a.name,c,t+2,s,o,i):(s.errors.push(`Option -${r} requires a value`),t+1)}return s.options[a.name]=!0,t+1}if(i.strict)s.errors.push(`Unknown option: -${r}`);else if(i.allowUnknown!==!1){let c=n[t+1];if($(c))return s.options[r]=A(_(c)),t+2;s.options[r]=!0}return t+1}for(let a of r){let c=q(a,o);c?c.type==="boolean"?s.options[c.name]=!0:s.errors.push(`Option -${a} requires a value`):i.strict?s.errors.push(`Unknown option: -${a}`):i.allowUnknown!==!1&&(s.options[a]=!0)}return t+1}function C(e,t,n,s,o,i){let r=o.get(e);if(r){if(r.choices){let c=r.type?k(_(t),r.type):_(t);if(!r.choices.includes(c))return s.errors.push(`Invalid value for '${e}': '${t}'. Allowed: ${r.choices.join(", ")}`),n}let a=r.type?k(_(t),r.type):_(t);if(r.type==="array"){let c=s.options[e];Array.isArray(c)?c.push(...a):s.options[e]=a}else s.options[e]=a}else i.strict?s.errors.push(`Unknown option: --${e}`):i.allowUnknown!==!1&&(s.options[e]=A(_(t)));return n}function Je(e,t=!1){let n=new Map,s=Object.entries(e).sort(([i],[r])=>i.localeCompare(r)),o=new Set;for(let[,i]of s)i.short&&o.add(i.short);for(let[i,r]of s){let a=r.short??"";t&&!a&&(a=Ze(i,o),a&&o.add(a));let c={name:i,short:a,aliases:r.aliases??[],type:r.type??"string",description:r.description??"",required:r.required??!1,hidden:r.hidden??!1,negatable:r.negatable??!0,default:r.default,choices:r.choices,env:r.env,validate:r.validate};n.set(i,c);for(let u of c.aliases)n.set(u,c)}return n}function Ze(e,t){for(let n of e){if(!/[a-zA-Z]/.test(n))continue;let s=n.toLowerCase();if(!t.has(s))return s;let o=n.toUpperCase();if(!t.has(o))return o}return""}function q(e,t){for(let n of t.values())if(n.short===e||n.aliases.includes(e))return n}function Ye(e,t,n){for(let s of n.values())if(e.options[s.name]===void 0)if(s.env&&process.env[s.env]!==void 0){let o=process.env[s.env];e.options[s.name]=s.type?k(o,s.type):o}else s.default!==void 0&&(e.options[s.name]=s.default);for(let s of t.positional??[])e.positional[s.name]===void 0&&s.default!==void 0&&(e.positional[s.name]=s.default)}function Xe(e,t,n){if(t.options)for(let[s,o]of Object.entries(t.options))o.required&&e.options[s]===void 0&&e.errors.push(`Missing required option: --${s}`);for(let s of n)s.required&&e.positional[s.name]===void 0&&e.errors.push(`Missing required argument: <${s.name}>`)}function Qe(e,t,n){for(let s of n.values()){let o=e.options[s.name];if(s.validate&&o!==void 0){let i=s.validate(o);i!==!0&&e.errors.push(i)}}for(let s of t.positional??[]){let o=e.positional[s.name];if(s.validate&&o!==void 0){let i=s.validate(o);i!==!0&&e.errors.push(i)}}}function et(e){return/^-\d+(\.\d+)?$/.test(e)}var B=class extends Error{flag;known;constructor(t,n){super(`unknown flag '${t}'; expected one of: ${n.join(", ")}`),this.name="UnknownFlagError",this.flag=t,this.known=n}};function tt(e){let t={};for(let[n,s]of Object.entries(e))t[n]={type:s.kind==="boolean"?"boolean":"string",...n.length===1?{short:n}:{},...s.aliases===void 0?{}:{aliases:s.aliases}};return t}function nt(e,t){let n=new Map;for(let[o,i]of Object.entries(t))if(!(i.kind!=="value"||i.type!=="array")){n.set(o,o);for(let r of i.aliases??[])n.set(r,o)}let s=new Map;for(let o=0;o<e.length;o+=1){let i=e[o];if(i==="--")break;let r=i.match(/^--([^=]+)(?:=(.*))?$/)??i.match(/^-([^=])(?:=(.*))?$/);if(r===null)continue;let a=n.get(r[1]);if(a===void 0)continue;let c=r[2];if(c===void 0&&$(e[o+1])&&(c=e[o+1],o+=1),c===void 0)continue;let u=s.get(a)??[];u.push(c),s.set(a,u)}return s}function re(e,t,n={}){let o=se({options:tt(t),separators:{},allowUnknown:!0}).parse([...e]),i={},r=nt(e,t),a=o.errors.find(c=>/^Option --?\S+ requires a value$/.test(c));if(a!==void 0)throw new Error(a.replace(/^Option /,""));if(o.errors.length>0)throw new Error(o.errors[0]);if(n.unknownFlags==="error"){let c=new Set(Object.keys(t));for(let u of Object.keys(o.options))if(!c.has(u))throw new B(u.length===1?`-${u}`:`--${u}`,Object.keys(t).map(l=>l.length===1?`-${l}`:`--${l}`))}for(let[c,u]of Object.entries(t)){let l=o.options[c];l!==void 0&&(u.kind==="boolean"?i[c]=l:u.type==="array"?i[c]=(r.get(c)??[]).map(f=>u.coerce(f)):i[c]=u.coerce(String(l)))}return{values:i,positionals:o.rest}}var O=class extends Error{token;known;constructor(t,n){super(`unknown command '${t}'; expected one of: ${n.join(", ")}`),this.name="UnknownCommandError",this.token=t,this.known=n}};function ie(e,t){let[n,...s]=e;if(n!==void 0){for(let[i,r]of Object.entries(t.commands))if(n===i||(r.aliases??[]).includes(n))return{command:i,args:s};if(t.errorOnUnknownCommand&&!n.startsWith("-"))throw new O(n,Object.keys(t.commands))}let o=t.keepArgvOnDefault??!0;return{command:t.default,args:o?[...e]:s}}var K=["opencode","redcode"],ot={opencode:!1,redcode:!0},st=["navigator"];function rt(e){return st.includes(e)}function ce(e){return K.includes(e)}function T(e,t){return{host:e,nativeLsp:t??ot[e]}}function it(e){return e.nativeLsp}function I(e,t){if(!it(t))return{plans:[...e],deferred:[]};let n=[],s=[];for(let o of e)rt(o.name)?s.push(o.name):n.push(o);return{plans:n,deferred:s}}var ct={config:{kind:"value",aliases:["c"],coerce:e=>e},out:{kind:"value",aliases:["o"],coerce:e=>e},"out-dir":{kind:"value",aliases:["d"],coerce:e=>e},"plugins-root":{kind:"value",aliases:["p"],coerce:e=>e},host:{kind:"value",coerce:e=>e},"native-lsp":{kind:"boolean"},plugin:{kind:"value",type:"array",coerce:e=>e},"slice-2":{kind:"boolean",aliases:["with-slice-2"]},copy:{kind:"boolean"},print:{kind:"boolean"},help:{kind:"boolean",aliases:["h"]},version:{kind:"boolean",aliases:["v"]},json:{kind:"boolean"}},w=class extends Error{constructor(t){super(t),this.name="OpencodeHostUsageError"}};function ae(e){return e[0]==="--version"||e[0]==="-v"}function le(e){let t;try{t=ie(e,{commands:{generate:{}},default:"generate",errorOnUnknownCommand:!0})}catch(r){throw r instanceof O?new w(r.message):r}let n;try{n=re(t.args,ct,{unknownFlags:"error"})}catch(r){throw new w(r.message)}let s=n.positionals[0];if(s!==void 0)throw new w(`unexpected argument '${s}'`);let{values:o}=n,i=o.host??"opencode";if(!ce(i))throw new w(`unsupported --host '${i}'; expected one of: ${K.join(", ")}`);return{command:t.command,configPath:o.config??"./.red/config.yaml",outPath:o.out??"./opencode.json",outDir:o["out-dir"]??"./dist/opencode",pluginsRoot:o["plugins-root"]??"./plugins",host:i,nativeLsp:o["native-lsp"],showHelp:o.help??!1,showVersion:o.version??!1,versionJson:o.json??!1,printJson:o.print??!1,copySkills:o.copy??!1,pluginFilter:o.plugin??null,slice2:o["slice-2"]??!0}}function ue(){return`opencode-host generate \u2014 emit the opencode-host runtime tree
11
11
 
12
12
  Slice 1: opencode.json (provider block) at <out>
13
13
  Slice 2: dist tree at <out-dir>/<plugin>/{opencode.json, .opencode/...}
@@ -48,10 +48,10 @@ Notes:
48
48
  puts it back.
49
49
  - Planner errors (bad name, missing frontmatter) are reported on stderr but
50
50
  do NOT fail the build. The events the generator can map are emitted.
51
- `}function at(e){let t=e.indexOf(" #");return(t>=0?e.slice(0,t):e).trim()}function z(e,t){let n=[];for(let o of e.split(`
52
- `)){let s=o.replace(/\r$/,""),i=s.trim();if(!i||i.startsWith("#"))continue;let r=s.indexOf(":");if(r<0)continue;let a=s.length-s.trimStart().length,c=s.slice(0,r).trim();if(!c)continue;let u=s.slice(r+1).trim();for(;n.length&&n[n.length-1].indent>=a;)n.pop();if(n.push({indent:a,key:c}),u&&n.map(f=>f.key).join(".")===t)return at(u)}}function pe(e,t){return z(e,`plugins.${t}.enabled`)==="true"}var lt=Object.freeze({openrouter:{npm:"@openrouter/ai-sdk-provider",name:"OpenRouter"},minimax:{npm:"@ai-sdk/openai-compatible",name:"MiniMax",options:{baseURL:"https://api.minimax.chat/v1"}},openai:{npm:"@ai-sdk/openai",name:"OpenAI"}}),ut=Object.freeze([{env:"OPENAI_API_KEY",provider:"openai"},{env:"MINIMAX_API_KEY",provider:"minimax"},{env:"OPENROUTER_API_KEY",provider:"openrouter"}]);function J(e){for(let t of ut){let n=e[t.env];if(typeof n=="string"&&n.length>0)return t.provider}}function pt(e,t="think"){let n=z(e,`plugins.dev.afk.models.opencode.${t}.model`);return typeof n=="string"&&n.length>0?n:void 0}function fe(e){return pe(e,"dev")}var ft="openrouter/anthropic/claude-3.5-sonnet";function j(e){let t=J(e.env)??"openrouter",o=e.modelOverride??pt(e.configText)??ft,s={};for(let[r,a]of Object.entries(lt))s[r]=a;let i={};i[t]=s[t];for(let[r,a]of Object.entries(s))r!==t&&(i[r]=a);return{$schema:"https://opencode.ai/config.json",provider:i,model:o}}import{mkdirSync as M,symlinkSync as Jt,writeFileSync as L,copyFileSync as $e,readFileSync as Zt}from"node:fs";import{dirname as U,join as P,relative as Yt}from"node:path";import{existsSync as dt,readdirSync as mt,readFileSync as gt,statSync as ht}from"node:fs";import{basename as Y,dirname as Z,join as X,relative as yt}from"node:path";var _t=/^[a-z0-9]+(-[a-z0-9]+)*$/,de=1024,wt=new Set(["in-progress"]);function kt(e){return e.split(/[\\/]/)}function vt(e){if(!e.startsWith("---"))return{};let t=e.indexOf(`
53
- ---`,3);if(t<0)return{};let n=e.slice(3,t),o,s;for(let i of n.split(`
54
- `)){let r=i.trim();if(!r||r.startsWith("#"))continue;let a=r.indexOf(":");if(a<0)continue;let c=r.slice(0,a).trim(),u=r.slice(a+1).trim();(u.startsWith('"')&&u.endsWith('"')||u.startsWith("'")&&u.endsWith("'"))&&(u=u.slice(1,-1)),c==="name"?o=u:c==="description"&&(s=u)}return{name:o,description:s}}function xt(e,t){let n=X(e,t,"skills");if(!dt(n))return[];let o=[],s=[n];for(;s.length>0;){let i=s.pop(),r;try{r=mt(i)}catch{continue}for(let a of r){let c=X(i,a),u;try{u=ht(c)}catch{continue}if(u.isDirectory()){if(wt.has(Y(c)))continue;s.push(c)}else u.isFile()&&a==="SKILL.md"&&o.push(c)}}return o}function bt(e,t,n){let o=[],s=Y(Z(e)),i=Y(Z(Z(e))),r=yt(X(t,n,"skills"),e),a=kt(r);if(a.length!==3||a[2]!=="SKILL.md")return o.push({path:e,name:s,code:"name-not-valid",message:`${r} is not in the expected <bucket>/<name>/SKILL.md layout`}),{errors:o};if(!_t.test(s)||s.length>64)return o.push({path:e,name:s,code:"name-not-valid",message:`name "${s}" violates opencode's name rule: 1-64 chars, lowercase alphanumeric with single-hyphen separators (regex ^[a-z0-9]+(-[a-z0-9]+)*$)`}),{errors:o};let c;try{c=gt(e,"utf8")}catch(f){return o.push({path:e,name:s,code:"frontmatter-missing",message:`could not read ${e}: ${f.message}`}),{errors:o}}let{name:u,description:l}=vt(c);return u?u!==s&&o.push({path:e,name:s,code:"name-not-equal-to-dir",message:`frontmatter name "${u}" does not match directory name "${s}" \u2014 opencode will refuse to load this skill`}):o.push({path:e,name:s,code:"name-missing",message:"frontmatter is missing the required `name:` field"}),l?l.length>de&&o.push({path:e,name:s,code:"description-missing-or-too-long",message:`frontmatter description is ${l.length} chars, opencode's budget is ${de}`}):o.push({path:e,name:s,code:"description-missing-or-too-long",message:"frontmatter is missing the required `description:` field"}),o.length>0?{errors:o}:{plan:{source:e,target:`skills/${s}/SKILL.md`,name:s,bucket:i},errors:[]}}function $t(e,t){let n=[],o=[];for(let s of xt(e,t)){let{plan:i,errors:r}=bt(s,e,t);i&&n.push(i),o.push(...r)}return n.sort((s,i)=>s.target.localeCompare(i.target)),{plans:n,errors:o}}function me(e,t){let n=t.map(o=>({plugin:o,result:$t(e,o)}));return St(n),n}function St(e){let t=new Map;for(let{plugin:n,result:o}of e)for(let s of o.plans)t.has(s.name)||t.set(s.name,new Set),t.get(s.name).add(n);for(let{plugin:n,result:o}of e){for(let s of o.plans){if((t.get(s.name)?.size??0)<2)continue;let i=`${n}-${s.name}`;s.renamedFrom=s.name,s.name=i,s.target=`skills/${i}/SKILL.md`}o.plans.sort((s,i)=>s.target.localeCompare(i.target))}}function ge(e,t){let n=e.match(/^---\r?\n([\s\S]*?)\r?\n---/);if(!n)return e;let o=n[1],s=o.replace(/^name:.*$/m,`name: ${t}`);return e.replace(o,s)}import{existsSync as Ot,readFileSync as Pt}from"node:fs";import{join as he}from"node:path";var ye=Object.freeze({SessionStart:"config",PreToolUse:"tool.execute.before",PostToolUse:"tool.execute.after",Stop:"session.idle",PreCompact:"experimental.session.compacting",UserPromptSubmit:"chat.message"}),Et=Object.freeze({SessionStart:"plugin/session-start.ts",PreToolUse:"plugin/pre-tool-use.ts",PostToolUse:"plugin/post-tool-use.ts",Stop:"plugin/stop.ts",PreCompact:"plugin/pre-compact.ts",UserPromptSubmit:"plugin/user-prompt-submit.ts"}),Rt=["codex.hooks.json","claude.hooks.json"];function At(e,t){let n=he(e,t,"hooks");return Rt.map(o=>he(n,o)).filter(o=>Ot(o))}function Ct(e,t){return e.replace(/\$\{CLAUDE_PLUGIN_ROOT\}/g,"${__pluginRoot}").replace(/\$\{CODEX_PLUGIN_ROOT\}/g,"${__pluginRoot}").replace(/\brsp-instructions --runner (claude|codex) --hook\b/g,"rsp-instructions --runner opencode --hook")}function Tt(e){let t=e.hookGroups.some(s=>_e(s.command.replace(/^sh -c\s*'/,"").replace(/'$/,""))),n=e.hookGroups.map(s=>{let i=ke(s.matcher),r=s.command.replace(/^sh -c\s*'/,"").replace(/'$/,"");return _e(r)?` if (${i}.test(input.tool)) {
51
+ `}function at(e){let t=e.indexOf(" #");return(t>=0?e.slice(0,t):e).trim()}function z(e,t){let n=[];for(let s of e.split(`
52
+ `)){let o=s.replace(/\r$/,""),i=o.trim();if(!i||i.startsWith("#"))continue;let r=o.indexOf(":");if(r<0)continue;let a=o.length-o.trimStart().length,c=o.slice(0,r).trim();if(!c)continue;let u=o.slice(r+1).trim();for(;n.length&&n[n.length-1].indent>=a;)n.pop();if(n.push({indent:a,key:c}),u&&n.map(f=>f.key).join(".")===t)return at(u)}}function pe(e,t){return z(e,`plugins.${t}.enabled`)==="true"}var lt=Object.freeze({openrouter:{npm:"@openrouter/ai-sdk-provider",name:"OpenRouter"},minimax:{npm:"@ai-sdk/openai-compatible",name:"MiniMax",options:{baseURL:"https://api.minimax.chat/v1"}},openai:{npm:"@ai-sdk/openai",name:"OpenAI"}}),ut=Object.freeze([{env:"OPENAI_API_KEY",provider:"openai"},{env:"MINIMAX_API_KEY",provider:"minimax"},{env:"OPENROUTER_API_KEY",provider:"openrouter"}]);function J(e){for(let t of ut){let n=e[t.env];if(typeof n=="string"&&n.length>0)return t.provider}}function pt(e,t="think"){let n=z(e,`plugins.dev.afk.models.opencode.${t}.model`);return typeof n=="string"&&n.length>0?n:void 0}function fe(e){return pe(e,"dev")}var ft="openrouter/anthropic/claude-3.5-sonnet";function j(e){let t=J(e.env)??"openrouter",s=e.modelOverride??pt(e.configText)??ft,o={};for(let[r,a]of Object.entries(lt))o[r]=a;let i={};i[t]=o[t];for(let[r,a]of Object.entries(o))r!==t&&(i[r]=a);return{$schema:"https://opencode.ai/config.json",provider:i,model:s}}import{mkdirSync as M,symlinkSync as Zt,writeFileSync as L,copyFileSync as be,readFileSync as Yt}from"node:fs";import{dirname as U,join as E,relative as Xt}from"node:path";import{existsSync as dt,readdirSync as mt,readFileSync as gt,statSync as ht}from"node:fs";import{basename as Y,dirname as Z,join as X,relative as yt}from"node:path";var _t=/^[a-z0-9]+(-[a-z0-9]+)*$/,de=1024,wt=new Set(["in-progress"]);function vt(e){return e.split(/[\\/]/)}function kt(e){if(!e.startsWith("---"))return{};let t=e.indexOf(`
53
+ ---`,3);if(t<0)return{};let n=e.slice(3,t),s,o;for(let i of n.split(`
54
+ `)){let r=i.trim();if(!r||r.startsWith("#"))continue;let a=r.indexOf(":");if(a<0)continue;let c=r.slice(0,a).trim(),u=r.slice(a+1).trim();(u.startsWith('"')&&u.endsWith('"')||u.startsWith("'")&&u.endsWith("'"))&&(u=u.slice(1,-1)),c==="name"?s=u:c==="description"&&(o=u)}return{name:s,description:o}}function xt(e,t){let n=X(e,t,"skills");if(!dt(n))return[];let s=[],o=[n];for(;o.length>0;){let i=o.pop(),r;try{r=mt(i)}catch{continue}for(let a of r){let c=X(i,a),u;try{u=ht(c)}catch{continue}if(u.isDirectory()){if(wt.has(Y(c)))continue;o.push(c)}else u.isFile()&&a==="SKILL.md"&&s.push(c)}}return s}function St(e,t,n){let s=[],o=Y(Z(e)),i=Y(Z(Z(e))),r=yt(X(t,n,"skills"),e),a=vt(r);if(a.length!==3||a[2]!=="SKILL.md")return s.push({path:e,name:o,code:"name-not-valid",message:`${r} is not in the expected <bucket>/<name>/SKILL.md layout`}),{errors:s};if(!_t.test(o)||o.length>64)return s.push({path:e,name:o,code:"name-not-valid",message:`name "${o}" violates opencode's name rule: 1-64 chars, lowercase alphanumeric with single-hyphen separators (regex ^[a-z0-9]+(-[a-z0-9]+)*$)`}),{errors:s};let c;try{c=gt(e,"utf8")}catch(f){return s.push({path:e,name:o,code:"frontmatter-missing",message:`could not read ${e}: ${f.message}`}),{errors:s}}let{name:u,description:l}=kt(c);return u?u!==o&&s.push({path:e,name:o,code:"name-not-equal-to-dir",message:`frontmatter name "${u}" does not match directory name "${o}" \u2014 opencode will refuse to load this skill`}):s.push({path:e,name:o,code:"name-missing",message:"frontmatter is missing the required `name:` field"}),l?l.length>de&&s.push({path:e,name:o,code:"description-missing-or-too-long",message:`frontmatter description is ${l.length} chars, opencode's budget is ${de}`}):s.push({path:e,name:o,code:"description-missing-or-too-long",message:"frontmatter is missing the required `description:` field"}),s.length>0?{errors:s}:{plan:{source:e,target:`skills/${o}/SKILL.md`,name:o,bucket:i},errors:[]}}function bt(e,t){let n=[],s=[];for(let o of xt(e,t)){let{plan:i,errors:r}=St(o,e,t);i&&n.push(i),s.push(...r)}return n.sort((o,i)=>o.target.localeCompare(i.target)),{plans:n,errors:s}}function me(e,t){let n=t.map(s=>({plugin:s,result:bt(e,s)}));return $t(n),n}function $t(e){let t=new Map;for(let{plugin:n,result:s}of e)for(let o of s.plans)t.has(o.name)||t.set(o.name,new Set),t.get(o.name).add(n);for(let{plugin:n,result:s}of e){for(let o of s.plans){if((t.get(o.name)?.size??0)<2)continue;let i=`${n}-${o.name}`;o.renamedFrom=o.name,o.name=i,o.target=`skills/${i}/SKILL.md`}s.plans.sort((o,i)=>o.target.localeCompare(i.target))}}function ge(e,t){let n=e.match(/^---\r?\n([\s\S]*?)\r?\n---/);if(!n)return e;let s=n[1],o=s.replace(/^name:.*$/m,`name: ${t}`);return e.replace(s,o)}import{existsSync as Ot,readFileSync as Et}from"node:fs";import{join as he}from"node:path";var ye=Object.freeze({SessionStart:"config",PreToolUse:"tool.execute.before",PostToolUse:"tool.execute.after",Stop:"session.idle",PreCompact:"experimental.session.compacting",UserPromptSubmit:"chat.message"}),Pt=Object.freeze({SessionStart:"plugin/session-start.ts",PreToolUse:"plugin/pre-tool-use.ts",PostToolUse:"plugin/post-tool-use.ts",Stop:"plugin/stop.ts",PreCompact:"plugin/pre-compact.ts",UserPromptSubmit:"plugin/user-prompt-submit.ts"}),Rt=["codex.hooks.json","claude.hooks.json"];function At(e,t){let n=he(e,t,"hooks");return Rt.map(s=>he(n,s)).filter(s=>Ot(s))}function Ct(e,t){return e.replace(/\$\{CLAUDE_PLUGIN_ROOT\}/g,"${__pluginRoot}").replace(/\$\{CODEX_PLUGIN_ROOT\}/g,"${__pluginRoot}").replace(/\brsp-instructions --runner (claude|codex) --hook\b/g,"rsp-instructions --runner opencode --hook")}function Tt(e){let t=e.hookGroups.some(o=>_e(o.command.replace(/^sh -c\s*'/,"").replace(/'$/,""))),n=e.hookGroups.map(o=>{let i=ve(o.matcher),r=o.command.replace(/^sh -c\s*'/,"").replace(/'$/,"");return _e(r)?` if (${i}.test(input.tool)) {
55
55
  const __rewritten = await __runRspRewrite(${JSON.stringify(r)});
56
56
  if (__rewritten !== null && output.args && typeof output.args === "object" && "command" in output.args) {
57
57
  output.args = { ...output.args, command: __rewritten };
@@ -61,18 +61,18 @@ Notes:
61
61
  if (__blocked) return;
62
62
  }`}).join(`
63
63
  `);return["// generated by @reddb-io/red-skills \u2014 slice 2 (hooks \u2192 events)","// ADR 0077: PreToolUse \u2192 tool.execute.before","// do not edit by hand \u2014 re-run the generator to refresh.","",'import type { Plugin } from "@opencode-ai/plugin";',"","export const PreToolUse: Plugin = async (context) => {"," return {",' "tool.execute.before": async (input: { tool: string; sessionID?: string; callID?: string }, output: { args: Record<string, unknown> }) => {'," const __encoder = new TextEncoder();"," const __decoder = new TextDecoder();"," const __pluginRoot = context.directory;"," const __cwd = context.worktree;"," const __payload = JSON.stringify({",' hook_event_name: "PreToolUse",'," tool_name: input.tool,"," tool_input: output.args ?? {},"," cwd: __cwd,"," workspace: { current_dir: __cwd },"," });",` const __shellQuote = (value: string): string => \`'\${value.replaceAll("'", "'\\\\''")}'\`;`," const __denyCommand = (reason: string, code: number): string => `printf '%s\\\\n' ${__shellQuote(reason)} >&2; exit ${code}`;"," const __runHook = async (inner: string): Promise<boolean> => {"," const proc = Bun.$`sh -c ${inner}`.env({ __pluginRoot, CLAUDE_PLUGIN_ROOT: __pluginRoot, CODEX_PLUGIN_ROOT: __pluginRoot, OPENCODE_PLUGIN_ROOT: __pluginRoot }).quiet().nothrow();"," try {"," const writer = proc.stdin.getWriter();"," await writer.write(__encoder.encode(__payload));"," await writer.close();"," } catch { /* hook exited before draining stdin (EPIPE) */ }"," const result = await proc;"," const stdout = __decoder.decode(result.stdout).trim();",' let structuredReason = "";'," if (stdout.length > 0) {"," try {"," const parsed = JSON.parse(stdout) as { decision?: string; reason?: string; hookSpecificOutput?: { permissionDecision?: string; permissionDecisionReason?: string } };",' if (parsed.decision === "block" || parsed.hookSpecificOutput?.permissionDecision === "deny") {'," structuredReason = parsed.hookSpecificOutput?.permissionDecisionReason || parsed.reason || `RedSkills PreToolUse hook denied ${input.tool}.`;"," }"," } catch { /* non-JSON stdout is ignored */ }"," }"," if (result.exitCode === 0 && structuredReason.length === 0) return false;"," const stderr = __decoder.decode(result.stderr).trim();"," const reason = structuredReason || (stderr.length > 0 ? stderr : `RedSkills PreToolUse hook denied ${input.tool}.`);",' if (output.args && typeof output.args === "object" && "command" in output.args) {'," output.args = { ...output.args, command: __denyCommand(reason, result.exitCode) };"," return true;"," }"," throw new Error(reason);"," };",...t?[" const __runRspRewrite = async (inner: string): Promise<string | null> => {"," const proc = Bun.$`sh -c ${inner}`.env({ __pluginRoot, CLAUDE_PLUGIN_ROOT: __pluginRoot, CODEX_PLUGIN_ROOT: __pluginRoot, OPENCODE_PLUGIN_ROOT: __pluginRoot }).quiet().nothrow();"," try {"," const writer = proc.stdin.getWriter();"," await writer.write(__encoder.encode(__payload));"," await writer.close();"," } catch { /* hook exited before draining stdin (EPIPE) */ }"," const result = await proc;"," if (result.exitCode !== 0) return null;"," const rewritten = __decoder.decode(result.stdout).trim();"," return rewritten.length > 0 ? rewritten : null;"," };"]:[],n," },"," };","};",""].join(`
64
- `)}function It(e){return["// generated by @reddb-io/red-skills \u2014 slice 2 (hooks \u2192 events)","// ADR 0077: SessionStart \u2192 config + chat system context","// do not edit by hand \u2014 re-run the generator to refresh.","",'import type { Plugin } from "@opencode-ai/plugin";',"","export const SessionStart: Plugin = async (context) => {"," let __ran = false;"," const __sessionContext: string[] = [];"," const __encoder = new TextEncoder();"," const __decoder = new TextDecoder();"," const __pluginRoot = context.directory;"," const __cwd = context.worktree;"," const __payload = JSON.stringify({",' hook_event_name: "SessionStart",'," cwd: __cwd,"," workspace: { current_dir: __cwd },"," });"," const __extractContext = (stdout: string): string | null => {"," const text = stdout.trim();",' if (!text || text === "{}") return null;'," try {"," const parsed = JSON.parse(text) as { systemMessage?: unknown; hookSpecificOutput?: { additionalContext?: unknown } };",' const direct = typeof parsed.systemMessage === "string" ? parsed.systemMessage : null;',' const claude = typeof parsed.hookSpecificOutput?.additionalContext === "string" ? parsed.hookSpecificOutput.additionalContext : null;'," return direct ?? claude;"," } catch {"," return text;"," }"," };"," const __runSessionStart = async (inner: string): Promise<void> => {"," try {"," const proc = Bun.$`sh -c ${inner}`.env({ __pluginRoot, CLAUDE_PLUGIN_ROOT: __pluginRoot, CODEX_PLUGIN_ROOT: __pluginRoot, OPENCODE_PLUGIN_ROOT: __pluginRoot }).quiet().nothrow();"," try {"," const writer = proc.stdin.getWriter();"," await writer.write(__encoder.encode(__payload));"," await writer.close();"," } catch { /* hook exited before draining stdin (EPIPE) */ }"," const result = await proc;"," const ctx = __extractContext(__decoder.decode(result.stdout));"," if (ctx && !__sessionContext.includes(ctx)) __sessionContext.push(ctx);"," } catch { /* best-effort */ }"," };"," const __runOnce = async (): Promise<void> => {"," if (__ran) return;"," __ran = true;",e.commands.map(n=>{let o=n.replace(/^sh -c\s*'/,"").replace(/'$/,"");return[` await __runSessionStart(${JSON.stringify(o)});`].join(`
64
+ `)}function It(e){return["// generated by @reddb-io/red-skills \u2014 slice 2 (hooks \u2192 events)","// ADR 0077: SessionStart \u2192 config + chat system context","// do not edit by hand \u2014 re-run the generator to refresh.","",'import type { Plugin } from "@opencode-ai/plugin";',"","export const SessionStart: Plugin = async (context) => {"," let __ran = false;"," const __sessionContext: string[] = [];"," const __encoder = new TextEncoder();"," const __decoder = new TextDecoder();"," const __pluginRoot = context.directory;"," const __cwd = context.worktree;"," const __payload = JSON.stringify({",' hook_event_name: "SessionStart",'," cwd: __cwd,"," workspace: { current_dir: __cwd },"," });"," const __extractContext = (stdout: string): string | null => {"," const text = stdout.trim();",' if (!text || text === "{}") return null;'," try {"," const parsed = JSON.parse(text) as { systemMessage?: unknown; hookSpecificOutput?: { additionalContext?: unknown } };",' const direct = typeof parsed.systemMessage === "string" ? parsed.systemMessage : null;',' const claude = typeof parsed.hookSpecificOutput?.additionalContext === "string" ? parsed.hookSpecificOutput.additionalContext : null;'," return direct ?? claude;"," } catch {"," return text;"," }"," };"," const __runSessionStart = async (inner: string): Promise<void> => {"," try {"," const proc = Bun.$`sh -c ${inner}`.env({ __pluginRoot, CLAUDE_PLUGIN_ROOT: __pluginRoot, CODEX_PLUGIN_ROOT: __pluginRoot, OPENCODE_PLUGIN_ROOT: __pluginRoot }).quiet().nothrow();"," try {"," const writer = proc.stdin.getWriter();"," await writer.write(__encoder.encode(__payload));"," await writer.close();"," } catch { /* hook exited before draining stdin (EPIPE) */ }"," const result = await proc;"," const ctx = __extractContext(__decoder.decode(result.stdout));"," if (ctx && !__sessionContext.includes(ctx)) __sessionContext.push(ctx);"," } catch { /* best-effort */ }"," };"," const __runOnce = async (): Promise<void> => {"," if (__ran) return;"," __ran = true;",e.commands.map(n=>{let s=n.replace(/^sh -c\s*'/,"").replace(/'$/,"");return[` await __runSessionStart(${JSON.stringify(s)});`].join(`
65
65
  `)}).join(`
66
66
  `)," };"," return {"," config: async () => {"," await __runOnce();"," },",' "experimental.chat.system.transform": async (_input: { sessionID?: string }, output: { system: string[] }) => {'," await __runOnce();"," for (const ctx of __sessionContext) output.system.push(ctx);"," },"," };","};",""].join(`
67
- `)}function F(e){return[" const __encoder = new TextEncoder();"," const __decoder = new TextDecoder();"," const __pluginRoot = context.directory;"," const __cwd = context.worktree;"," const __runHook = async (inner: string, payload: Record<string, unknown>): Promise<string | null> => {"," try {"," const proc = Bun.$`sh -c ${inner}`.env({ __pluginRoot, CLAUDE_PLUGIN_ROOT: __pluginRoot, CODEX_PLUGIN_ROOT: __pluginRoot, OPENCODE_PLUGIN_ROOT: __pluginRoot }).quiet().nothrow();"," try {"," const writer = proc.stdin.getWriter();"," await writer.write(__encoder.encode(JSON.stringify(payload)));"," await writer.close();"," } catch { /* hook exited before draining stdin (EPIPE) */ }"," const result = await proc;"," return __decoder.decode(result.stdout).trim();"," } catch {"," return null;"," }"," };"," const __extractContext = (stdout: string | null): string | null => {",' const text = (stdout ?? "").trim();',' if (!text || text === "{}") return null;'," try {"," const parsed = JSON.parse(text) as { systemMessage?: unknown; hookSpecificOutput?: { additionalContext?: unknown } };",' const direct = typeof parsed.systemMessage === "string" ? parsed.systemMessage : null;',' const claude = typeof parsed.hookSpecificOutput?.additionalContext === "string" ? parsed.hookSpecificOutput.additionalContext : null;'," return direct ?? claude;"," } catch {"," return text;"," }"," };",` const __sourceEvent = ${JSON.stringify(e)};`]}function N(e){return e.hookGroups.map(t=>{let n=t.command.replace(/^sh -c\s*'/,"").replace(/'$/,""),o=[` const __stdout = await __runHook(${JSON.stringify(n)}, ${e.payloadExpression});`,e.contextSink?` const __ctx = __extractContext(__stdout); if (__ctx) ${e.contextSink};`:""].filter(Boolean).join(`
68
- `);return e.toolExpression?[` if (${ke(t.matcher)}.test(${e.toolExpression})) {`,o," }"].join(`
69
- `):[" {",o," }"].join(`
67
+ `)}function F(e){return[" const __encoder = new TextEncoder();"," const __decoder = new TextDecoder();"," const __pluginRoot = context.directory;"," const __cwd = context.worktree;"," const __runHook = async (inner: string, payload: Record<string, unknown>): Promise<string | null> => {"," try {"," const proc = Bun.$`sh -c ${inner}`.env({ __pluginRoot, CLAUDE_PLUGIN_ROOT: __pluginRoot, CODEX_PLUGIN_ROOT: __pluginRoot, OPENCODE_PLUGIN_ROOT: __pluginRoot }).quiet().nothrow();"," try {"," const writer = proc.stdin.getWriter();"," await writer.write(__encoder.encode(JSON.stringify(payload)));"," await writer.close();"," } catch { /* hook exited before draining stdin (EPIPE) */ }"," const result = await proc;"," return __decoder.decode(result.stdout).trim();"," } catch {"," return null;"," }"," };"," const __extractContext = (stdout: string | null): string | null => {",' const text = (stdout ?? "").trim();',' if (!text || text === "{}") return null;'," try {"," const parsed = JSON.parse(text) as { systemMessage?: unknown; hookSpecificOutput?: { additionalContext?: unknown } };",' const direct = typeof parsed.systemMessage === "string" ? parsed.systemMessage : null;',' const claude = typeof parsed.hookSpecificOutput?.additionalContext === "string" ? parsed.hookSpecificOutput.additionalContext : null;'," return direct ?? claude;"," } catch {"," return text;"," }"," };",` const __sourceEvent = ${JSON.stringify(e)};`]}function N(e){return e.hookGroups.map(t=>{let n=t.command.replace(/^sh -c\s*'/,"").replace(/'$/,""),s=[` const __stdout = await __runHook(${JSON.stringify(n)}, ${e.payloadExpression});`,e.contextSink?` const __ctx = __extractContext(__stdout); if (__ctx) ${e.contextSink};`:""].filter(Boolean).join(`
68
+ `);return e.toolExpression?[` if (${ve(t.matcher)}.test(${e.toolExpression})) {`,s," }"].join(`
69
+ `):[" {",s," }"].join(`
70
70
  `)}).join(`
71
71
  `)}function jt(e){return["// generated by @reddb-io/red-skills \u2014 slice 2 (hooks \u2192 events)","// ADR 0077: PostToolUse \u2192 tool.execute.after","// do not edit by hand \u2014 re-run the generator to refresh.","",'import type { Plugin } from "@opencode-ai/plugin";',"","export const PostToolUse: Plugin = async (context) => {"," return {",' "tool.execute.after": async (input: { tool: string; sessionID?: string; callID?: string; args?: Record<string, unknown> }, output: { title?: string; output?: string; metadata?: unknown }) => {',...F("PostToolUse")," const __payload = {"," hook_event_name: __sourceEvent,"," session_id: input.sessionID,"," tool_name: input.tool,"," tool_input: input.args ?? {},"," tool_response: { title: output.title, output: output.output, metadata: output.metadata },"," cwd: __cwd,"," workspace: { current_dir: __cwd },"," };",N({hookGroups:e.hookGroups,toolExpression:"input.tool",payloadExpression:"__payload",contextSink:'output.output = [__ctx, output.output].filter(Boolean).join("\\n\\n")'})," },"," };","};",""].join(`
72
72
  `)}function we(){return[" const __textParts = (value: unknown, out: string[] = []): string[] => {",' if (typeof value === "string") return out;',' if (!value || typeof value !== "object") return out;'," if (Array.isArray(value)) { for (const item of value) __textParts(item, out); return out; }"," const record = value as Record<string, unknown>;",' for (const key of ["text", "content", "message", "output"] as const) {',' if (typeof record[key] === "string") out.push(record[key] as string);'," }"," for (const child of Object.values(record)) __textParts(child, out);"," return out;"," };"," const __readSessionTranscript = async (sessionID?: string): Promise<string | undefined> => {"," if (!sessionID) return undefined;"," const sessionApi = (context.client as unknown as { session?: { messages?: (input: unknown) => Promise<unknown> } }).session;"," if (!sessionApi?.messages) return undefined;"," const attempts = [{ path: { id: sessionID } }, { path: { sessionID } }, { id: sessionID }, { sessionID }];"," for (const attempt of attempts) {"," try {"," const response = await sessionApi.messages(attempt);"," const data = (response as { data?: unknown })?.data ?? response;",' const text = __textParts(data).join("\\n").trim();'," if (text.length > 0) return text;"," return JSON.stringify(data);"," } catch { /* try the next SDK shape */ }"," }"," return undefined;"," };"]}function Ft(e){return["// generated by @reddb-io/red-skills \u2014 slice 2 (hooks \u2192 events)","// ADR 0077: Stop \u2192 session.idle","// do not edit by hand \u2014 re-run the generator to refresh.","",'import type { Plugin } from "@opencode-ai/plugin";',"","export const Stop: Plugin = async (context) => {"," return {",' "session.idle": async (input: { sessionID?: string }) => {',...F("Stop"),...we()," const __transcript = await __readSessionTranscript(input.sessionID);"," const __payload = {"," hook_event_name: __sourceEvent,"," session_id: input.sessionID,"," transcript_text: __transcript,"," transcriptText: __transcript,"," cwd: __cwd,"," workspace: { current_dir: __cwd },"," };",N({hookGroups:e.hookGroups,payloadExpression:"__payload"})," },"," };","};",""].join(`
73
73
  `)}function Nt(e){return["// generated by @reddb-io/red-skills \u2014 slice 2 (hooks \u2192 events)","// ADR 0077: PreCompact \u2192 experimental.session.compacting","// do not edit by hand \u2014 re-run the generator to refresh.","",'import type { Plugin } from "@opencode-ai/plugin";',"","export const PreCompact: Plugin = async (context) => {"," return {",' "experimental.session.compacting": async (input: { sessionID?: string }, output: { context: string[]; prompt?: string }) => {',...F("PreCompact"),...we()," const __transcript = await __readSessionTranscript(input.sessionID);"," const __payload = {"," hook_event_name: __sourceEvent,"," session_id: input.sessionID,"," transcript_text: __transcript,"," transcriptText: __transcript,"," cwd: __cwd,"," workspace: { current_dir: __cwd },"," };",N({hookGroups:e.hookGroups,payloadExpression:"__payload",contextSink:"output.context.push(__ctx)"})," },"," };","};",""].join(`
74
74
  `)}function Dt(e){return["// generated by @reddb-io/red-skills \u2014 slice 2 (hooks \u2192 events)","// ADR 0077: UserPromptSubmit \u2192 chat.message","// do not edit by hand \u2014 re-run the generator to refresh.","",'import type { Plugin } from "@opencode-ai/plugin";',"","export const UserPromptSubmit: Plugin = async (context) => {"," return {",' "chat.message": async (input: { sessionID?: string; messageID?: string }, output: { message?: unknown; parts: unknown[] }) => {',...F("UserPromptSubmit")," const __payload = {"," hook_event_name: __sourceEvent,"," session_id: input.sessionID,"," message_id: input.messageID,"," prompt: output.message,"," cwd: __cwd,"," workspace: { current_dir: __cwd },"," };",N({hookGroups:e.hookGroups,payloadExpression:"__payload",contextSink:'output.parts.unshift({ type: "text", text: __ctx } as never)'})," },"," };","};",""].join(`
75
- `)}function _e(e){return e.includes("hook claude-pre-exec")||e.includes("rsp-hook.sh")&&e.includes("claude-pre-exec")}function ke(e){if(e==="*"||e==="")return"/.*/";let t=e.split("|").map(o=>o.trim()).filter(Boolean);return t.length===0?"/.*/":`/^(${t.map(o=>o.replace(/[.*+?^${}()|[\]\\]/g,"\\$&")).join("|")})$/i`}function ve(e,t){let n=At(e,t);if(n.length===0)return[];let o=new Map,s=[];for(let r of n){let a;try{a=JSON.parse(Pt(r,"utf8"))}catch(c){s.push(`could not parse ${r}: ${c.message}`);continue}for(let[c,u]of Object.entries(a.hooks??{})){if(!ye[c]){s.push(`event "${c}" from ${r} has no known OpenCode plugin event equivalent (warn-and-continue)`);continue}let f=o.get(c)??[];for(let p of u){let d=p.matcher??"*";for(let h of p.hooks){if(h.type!=="command")continue;let y=Ct(h.command,t);f.push({matcher:d,command:y,sourceFile:r})}}o.set(c,f)}}let i=[];for(let[r,a]of o){let c=ye[r],u=Et[r];!c||!u||(r==="SessionStart"?i.push({sourceEvent:r,opencodeEvent:c,target:u,source:It({sourceFiles:a.map(l=>l.sourceFile),commands:a.map(l=>l.command)}),sourceFiles:a.map(l=>l.sourceFile),warnings:s}):r==="PreToolUse"?i.push({sourceEvent:r,opencodeEvent:c,target:u,source:Tt({sourceFiles:a.map(l=>l.sourceFile),hookGroups:a}),sourceFiles:a.map(l=>l.sourceFile),warnings:s}):r==="PostToolUse"?i.push({sourceEvent:r,opencodeEvent:c,target:u,source:jt({sourceFiles:a.map(l=>l.sourceFile),hookGroups:a}),sourceFiles:a.map(l=>l.sourceFile),warnings:s}):r==="Stop"?i.push({sourceEvent:r,opencodeEvent:c,target:u,source:Ft({sourceFiles:a.map(l=>l.sourceFile),hookGroups:a}),sourceFiles:a.map(l=>l.sourceFile),warnings:s}):r==="PreCompact"?i.push({sourceEvent:r,opencodeEvent:c,target:u,source:Nt({sourceFiles:a.map(l=>l.sourceFile),hookGroups:a}),sourceFiles:a.map(l=>l.sourceFile),warnings:s}):r==="UserPromptSubmit"&&i.push({sourceEvent:r,opencodeEvent:c,target:u,source:Dt({sourceFiles:a.map(l=>l.sourceFile),hookGroups:a}),sourceFiles:a.map(l=>l.sourceFile),warnings:s}))}return i}import{existsSync as Q,readFileSync as Mt,statSync as Lt}from"node:fs";import{homedir as xe}from"node:os";import{join as x}from"node:path";function Ut(e,t){let n=x(e,t,".mcp.json");if(!Q(n))return null;try{return JSON.parse(Mt(n,"utf8"))}catch{return null}}function Vt(e,t,n){let o=[x(e,t,n),x(e,t,"hooks",n.split("/").pop()??""),x(e,"..",n),x(e,"..","..",".codex",".tmp","marketplaces","red-skills","plugins",t,n),x(xe(),".codex","plugins","cache","red-skills",t,n)];for(let s of o.slice(0,3))if(Q(s))return{path:s,candidate:s};for(let s of o.slice(3))if(Q(s))return{path:s,candidate:s};return{path:null,candidate:o[0]??null}}function Ht(e,t=xe()){for(let n of e.matchAll(/\$HOME\/([\w./-]+)/g)){let o=x(t,n[1]);try{if(Lt(o).isFile())return o}catch{}}return null}function Wt(e,t,n,o){let s=[],i=o.command??"sh",r=o.args??[],a=o.env;if(i==="sh"&&r[0]==="-c"&&typeof r[1]=="string")return Gt(e,t,n,r[1],a);let c={type:"local",command:[i,...r],enabled:!0};return a&&(c.environment=a),{entry:c,warnings:s}}function Gt(e,t,n,o,s){let i=[],r=[/\$\{?CODEX_PLUGIN_ROOT\}?\/(?:\$\{?CLAUDE_PLUGIN_ROOT\}?\/)?([\w./-]+)/,/\$\{?CLAUDE_PLUGIN_ROOT\}?\/(?:\$\{?CODEX_PLUGIN_ROOT\}?\/)?([\w./-]+)/,/\$root\/([\w./-]+)/g],a=[];for(let p of r)if(p.flags&&p.flags.includes("g")){let d=o.matchAll(p);for(let h of d)a.push(h[1])}else{let d=o.match(p);d&&d[1]&&a.push(d[1])}let c=null;for(let p of a){let{path:d}=Vt(e,t,p);if(d){c=d;break}}if(c||(c=Ht(o)),!c){i.push(`${n}: could not resolve any of the script paths referenced by the source hooks (${a.slice(0,3).join(", ")}) \u2014 the plugin checkout or a Codex cache must exist for this MCP to start`);let p={type:"local",command:["sh","-c",o],enabled:!0};return s&&(p.environment=s),{entry:p,warnings:i}}let u=c.endsWith(".mjs")?"node":c.endsWith(".sh")?"bash":"sh",l=o.match(/mcp(?=['"\s;|&]|$)/)?["mcp"]:[],f={type:"local",command:[u,c,...l],cwd:e,enabled:!0};return s&&(f.environment=s),{entry:f,warnings:i}}function D(e,t){let n=Ut(e,t);if(!n?.mcpServers)return[];let o=[];for(let[s,i]of Object.entries(n.mcpServers)){let{entry:r,warnings:a}=Wt(e,t,s,i);o.push({name:s,entry:r,warnings:a})}return o.sort((s,i)=>s.name.localeCompare(i.name)),o}import{existsSync as qt}from"node:fs";import{join as Bt}from"node:path";function Kt(e){let t=[Bt(e,"dev","skills","engineering","afk","bin","afk.mjs")];for(let n of t)if(qt(n))return{path:n};return{path:null}}function be(e,t){if(t!=="dev")return[];let{path:n}=Kt(e),o=[];return n||o.push("dev: AFK launcher not found at plugins/dev/skills/engineering/afk/bin/afk.mjs \u2014 the session-status module will be a silent no-op until the launcher is built"),[{plugin:t,target:"plugin/session-status.ts",source:zt,warnings:o}]}var zt=`// generated by @reddb-io/red-skills \u2014 slice 4 (statusline + toasts)
75
+ `)}function _e(e){return e.includes("hook claude-pre-exec")||e.includes("rsp-hook.sh")&&e.includes("claude-pre-exec")}function ve(e){if(e==="*"||e==="")return"/.*/";let t=e.split("|").map(s=>s.trim()).filter(Boolean);return t.length===0?"/.*/":`/^(${t.map(s=>s.replace(/[.*+?^${}()|[\]\\]/g,"\\$&")).join("|")})$/i`}function ke(e,t){let n=At(e,t);if(n.length===0)return[];let s=new Map,o=[];for(let r of n){let a;try{a=JSON.parse(Et(r,"utf8"))}catch(c){o.push(`could not parse ${r}: ${c.message}`);continue}for(let[c,u]of Object.entries(a.hooks??{})){if(!ye[c]){o.push(`event "${c}" from ${r} has no known OpenCode plugin event equivalent (warn-and-continue)`);continue}let f=s.get(c)??[];for(let p of u){let d=p.matcher??"*";for(let h of p.hooks){if(h.type!=="command")continue;let y=Ct(h.command,t);f.push({matcher:d,command:y,sourceFile:r})}}s.set(c,f)}}let i=[];for(let[r,a]of s){let c=ye[r],u=Pt[r];!c||!u||(r==="SessionStart"?i.push({sourceEvent:r,opencodeEvent:c,target:u,source:It({sourceFiles:a.map(l=>l.sourceFile),commands:a.map(l=>l.command)}),sourceFiles:a.map(l=>l.sourceFile),warnings:o}):r==="PreToolUse"?i.push({sourceEvent:r,opencodeEvent:c,target:u,source:Tt({sourceFiles:a.map(l=>l.sourceFile),hookGroups:a}),sourceFiles:a.map(l=>l.sourceFile),warnings:o}):r==="PostToolUse"?i.push({sourceEvent:r,opencodeEvent:c,target:u,source:jt({sourceFiles:a.map(l=>l.sourceFile),hookGroups:a}),sourceFiles:a.map(l=>l.sourceFile),warnings:o}):r==="Stop"?i.push({sourceEvent:r,opencodeEvent:c,target:u,source:Ft({sourceFiles:a.map(l=>l.sourceFile),hookGroups:a}),sourceFiles:a.map(l=>l.sourceFile),warnings:o}):r==="PreCompact"?i.push({sourceEvent:r,opencodeEvent:c,target:u,source:Nt({sourceFiles:a.map(l=>l.sourceFile),hookGroups:a}),sourceFiles:a.map(l=>l.sourceFile),warnings:o}):r==="UserPromptSubmit"&&i.push({sourceEvent:r,opencodeEvent:c,target:u,source:Dt({sourceFiles:a.map(l=>l.sourceFile),hookGroups:a}),sourceFiles:a.map(l=>l.sourceFile),warnings:o}))}return i}import{existsSync as Q,readFileSync as Mt,statSync as Lt}from"node:fs";import{homedir as xe}from"node:os";import{join as x}from"node:path";function Ut(e,t){let n=x(e,t,".mcp.json");if(!Q(n))return null;try{return JSON.parse(Mt(n,"utf8"))}catch{return null}}function Vt(e,t,n){let s=[x(e,t,n),x(e,t,"hooks",n.split("/").pop()??""),x(e,"..",n),x(e,"..","..",".codex",".tmp","marketplaces","red-skills","plugins",t,n),x(xe(),".codex","plugins","cache","red-skills",t,n)];for(let o of s.slice(0,3))if(Q(o))return{path:o,candidate:o};for(let o of s.slice(3))if(Q(o))return{path:o,candidate:o};return{path:null,candidate:s[0]??null}}function Ht(e,t=xe()){for(let n of e.matchAll(/\$HOME\/([\w./-]+)/g)){let s=x(t,n[1]);try{if(Lt(s).isFile())return s}catch{}}return null}function Wt(e,t,n,s){let o=[],i=s.command??"sh",r=s.args??[],a=s.env;if(i==="sh"&&r[0]==="-c"&&typeof r[1]=="string")return Gt(e,t,n,r[1],a);let c={type:"local",command:[i,...r],enabled:!0};return a&&(c.environment=a),{entry:c,warnings:o}}function Gt(e,t,n,s,o){let i=[],r=[/\$\{?CODEX_PLUGIN_ROOT\}?\/(?:\$\{?CLAUDE_PLUGIN_ROOT\}?\/)?([\w./-]+)/,/\$\{?CLAUDE_PLUGIN_ROOT\}?\/(?:\$\{?CODEX_PLUGIN_ROOT\}?\/)?([\w./-]+)/,/\$root\/([\w./-]+)/g],a=[];for(let p of r)if(p.flags&&p.flags.includes("g")){let d=s.matchAll(p);for(let h of d)a.push(h[1])}else{let d=s.match(p);d&&d[1]&&a.push(d[1])}let c=null;for(let p of a){let{path:d}=Vt(e,t,p);if(d){c=d;break}}if(c||(c=Ht(s)),!c){i.push(`${n}: could not resolve any of the script paths referenced by the source hooks (${a.slice(0,3).join(", ")}) \u2014 the plugin checkout or a Codex cache must exist for this MCP to start`);let p={type:"local",command:["sh","-c",s],enabled:!0};return o&&(p.environment=o),{entry:p,warnings:i}}let u=c.endsWith(".mjs")?"node":c.endsWith(".sh")?"bash":"sh",l=s.match(/mcp(?=['"\s;|&]|$)/)?["mcp"]:[],f={type:"local",command:[u,c,...l],cwd:e,enabled:!0};return o&&(f.environment=o),{entry:f,warnings:i}}function D(e,t){let n=Ut(e,t);if(!n?.mcpServers)return[];let s=[];for(let[o,i]of Object.entries(n.mcpServers)){let{entry:r,warnings:a}=Wt(e,t,o,i);s.push({name:o,entry:r,warnings:a})}return s.sort((o,i)=>o.name.localeCompare(i.name)),s}import{existsSync as qt,readFileSync as Bt}from"node:fs";import{join as Kt}from"node:path";function zt(e){let t=Kt(e,"dev",".claude-plugin","plugin.json");if(!qt(t))return{version:null};try{let n=JSON.parse(Bt(t,"utf8"));return{version:typeof n.version=="string"?n.version:null}}catch{return{version:null}}}function Se(e,t){if(t!=="dev")return[];let{version:n}=zt(e),s=[];n==null&&s.push("dev: no version in plugins/dev/.claude-plugin/plugin.json \u2014 the session-status module will be a silent no-op until the manifest carries one");let o=Jt.replace("__RED_SKILLS_VERSION__",n??"latest");return[{plugin:t,target:"plugin/session-status.ts",source:o,warnings:s}]}var Jt=`// generated by @reddb-io/red-skills \u2014 slice 4 (statusline + toasts)
76
76
  // ADR 0080: session.idle / session.error / session.created /
77
77
  // experimental.session.compacting \u2192 AFK statusline
78
78
  // do not edit by hand \u2014 re-run the generator to refresh.
@@ -80,7 +80,7 @@ Notes:
80
80
  import type { Plugin } from "@opencode-ai/plugin";
81
81
  import { join } from "node:path";
82
82
 
83
- const AFK_BIN = "skills/engineering/afk/bin/afk.mjs";
83
+ const REDSKILLED_VERSION = "__RED_SKILLS_VERSION__";
84
84
 
85
85
  /** Strip ANSI escape codes from a string. The AFK statusline
86
86
  * output is themed; the toast body should be plain text. */
@@ -93,9 +93,8 @@ function stripAnsi(text: string): string {
93
93
  * Returns null on any failure \u2014 the plugin module is
94
94
  * best-effort, not fail-closed. */
95
95
  async function readAfkStatusline(directory: string): Promise<string | null> {
96
- const launcher = join(directory, AFK_BIN);
97
96
  try {
98
- const out = await Bun.$\`node \${launcher} statusline \${directory}\`.text();
97
+ const out = await Bun.$\`npx -y -p @reddb-io/red-skills@\${REDSKILLED_VERSION} red-skills-redskilled statusline \${directory}\`.text();
99
98
  const cleaned = stripAnsi(out);
100
99
  return cleaned.length > 0 ? cleaned : null;
101
100
  } catch {
@@ -152,21 +151,21 @@ export const AFKStatusline: Plugin = async (ctx) => {
152
151
  },
153
152
  };
154
153
  };
155
- `;function Se(e){let t=e.semanticAuthority??T("opencode"),n=me(e.pluginsRoot,e.plugins);return{byPlugin:e.plugins.map(s=>{let i=n.find(f=>f.plugin===s)?.result??{plans:[],errors:[]},r=ve(e.pluginsRoot,s),{plans:a,deferred:c}=I(D(e.pluginsRoot,s),t),u=be(e.pluginsRoot,s),l=j({configText:e.configText,env:e.env});return{plugin:s,provider:l,skills:i,hooks:r,mcp:a,deferredMcp:c,statusline:u}}),semanticAuthority:t}}function Oe(e,t){for(let n of e.byPlugin){let{plugin:o,provider:s,skills:i,hooks:r,mcp:a,statusline:c}=n,u=P(t.outRoot,o);M(u,{recursive:!0});let l={...s};a.length>0&&(l.mcp=Xt(a)),L(P(u,"opencode.json"),JSON.stringify(l,null,2)+`
156
- `,"utf8");for(let f of i.plans){let p=P(u,".opencode",f.target);if(M(U(p),{recursive:!0}),f.renamedFrom)L(p,ge(Zt(f.source,"utf8"),f.name),"utf8");else if(t.copySkills)$e(f.source,p);else{let d=Yt(U(p),f.source),y=!d.startsWith("..")||d.split("/").filter(b=>b==="..").length<=4?d:f.source;try{Jt(y,p)}catch{$e(f.source,p)}}}for(let f of r){let p=P(u,".opencode",f.target);M(U(p),{recursive:!0}),L(p,f.source,"utf8")}for(let f of c){let p=P(u,".opencode",f.target);M(U(p),{recursive:!0}),L(p,f.source,"utf8")}}}function Xt(e){let t={};for(let n of e)t[n.name]=n.entry;return t}import{existsSync as ee,readdirSync as Qt,statSync as en}from"node:fs";import{join as te}from"node:path";function Pe(e){if(!ee(e))return[];let t;try{t=Qt(e)}catch{return[]}let n=[];for(let o of t){let s=te(e,o),i;try{i=en(s)}catch{continue}if(!i.isDirectory())continue;let r=ee(te(s,".claude-plugin","plugin.json")),a=ee(te(s,".codex-plugin","plugin.json"));(r||a)&&n.push({name:o,source:s})}return n.sort((o,s)=>o.name.localeCompare(s.name)),n}function sn(e,t,n){let o=[],s=[],i=[];for(let c of t){let u=I(D(e,c),n);for(let l of u.deferred)i.push(l);for(let l of u.plans){o.push(l);for(let f of l.warnings)s.push(`[${c}] ${f}`)}}let r=new Set;return{mcps:o.filter(c=>r.has(c.name)?!1:(r.add(c.name),!0)),warnings:s,deferred:[...new Set(i)]}}function rn(e){let t={};for(let n of e)t[n.name]=n.entry;return t}function Re(e){let t=W("opencode-host");process.stdout.write(e?`${JSON.stringify(t)}
154
+ `;function $e(e){let t=e.semanticAuthority??T("opencode"),n=me(e.pluginsRoot,e.plugins);return{byPlugin:e.plugins.map(o=>{let i=n.find(f=>f.plugin===o)?.result??{plans:[],errors:[]},r=ke(e.pluginsRoot,o),{plans:a,deferred:c}=I(D(e.pluginsRoot,o),t),u=Se(e.pluginsRoot,o),l=j({configText:e.configText,env:e.env});return{plugin:o,provider:l,skills:i,hooks:r,mcp:a,deferredMcp:c,statusline:u}}),semanticAuthority:t}}function Oe(e,t){for(let n of e.byPlugin){let{plugin:s,provider:o,skills:i,hooks:r,mcp:a,statusline:c}=n,u=E(t.outRoot,s);M(u,{recursive:!0});let l={...o};a.length>0&&(l.mcp=Qt(a)),L(E(u,"opencode.json"),JSON.stringify(l,null,2)+`
155
+ `,"utf8");for(let f of i.plans){let p=E(u,".opencode",f.target);if(M(U(p),{recursive:!0}),f.renamedFrom)L(p,ge(Yt(f.source,"utf8"),f.name),"utf8");else if(t.copySkills)be(f.source,p);else{let d=Xt(U(p),f.source),y=!d.startsWith("..")||d.split("/").filter(S=>S==="..").length<=4?d:f.source;try{Zt(y,p)}catch{be(f.source,p)}}}for(let f of r){let p=E(u,".opencode",f.target);M(U(p),{recursive:!0}),L(p,f.source,"utf8")}for(let f of c){let p=E(u,".opencode",f.target);M(U(p),{recursive:!0}),L(p,f.source,"utf8")}}}function Qt(e){let t={};for(let n of e)t[n.name]=n.entry;return t}import{existsSync as ee,readdirSync as en,statSync as tn}from"node:fs";import{join as te}from"node:path";function Ee(e){if(!ee(e))return[];let t;try{t=en(e)}catch{return[]}let n=[];for(let s of t){let o=te(e,s),i;try{i=tn(o)}catch{continue}if(!i.isDirectory())continue;let r=ee(te(o,".claude-plugin","plugin.json")),a=ee(te(o,".codex-plugin","plugin.json"));(r||a)&&n.push({name:s,source:o})}return n.sort((s,o)=>s.name.localeCompare(o.name)),n}function rn(e,t,n){let s=[],o=[],i=[];for(let c of t){let u=I(D(e,c),n);for(let l of u.deferred)i.push(l);for(let l of u.plans){s.push(l);for(let f of l.warnings)o.push(`[${c}] ${f}`)}}let r=new Set;return{mcps:s.filter(c=>r.has(c.name)?!1:(r.add(c.name),!0)),warnings:o,deferred:[...new Set(i)]}}function cn(e){let t={};for(let n of e)t[n.name]=n.entry;return t}function Re(e){let t=W("opencode-host");process.stdout.write(e?`${JSON.stringify(t)}
157
156
  `:`${G(t)}
158
- `)}function cn(e){if(ae(e)){Re(e.includes("--json"));return}let t;try{t=le(e)}catch(m){throw m instanceof w&&(process.stderr.write(`opencode-host: ${m.message}
159
- `),process.exit(2)),m}if(t.showVersion){Re(t.versionJson);return}if(t.showHelp){process.stdout.write(ue());return}let n=W("opencode-host"),o=G(n),s=V(t.configPath),i=V(t.pluginsRoot),r=V(t.outPath),a=V(t.outDir),c;try{c=tn(s,"utf8")}catch(m){process.stderr.write(`opencode-host: could not read config at ${s}: ${m.message}
157
+ `)}function an(e){if(ae(e)){Re(e.includes("--json"));return}let t;try{t=le(e)}catch(m){throw m instanceof w&&(process.stderr.write(`opencode-host: ${m.message}
158
+ `),process.exit(2)),m}if(t.showVersion){Re(t.versionJson);return}if(t.showHelp){process.stdout.write(ue());return}let n=W("opencode-host"),s=G(n),o=V(t.configPath),i=V(t.pluginsRoot),r=V(t.outPath),a=V(t.outDir),c;try{c=nn(o,"utf8")}catch(m){process.stderr.write(`opencode-host: could not read config at ${o}: ${m.message}
160
159
  `),process.exit(1)}fe(c)||(process.stderr.write(`opencode-host: refusing to emit \u2014 plugins.dev.enabled is not true in .red/config.yaml (ADR 0067 strict opt-in). Run /red-setup to enable the dev plugin.
161
- `),process.exit(1));let u=J(process.env);u===void 0&&process.stderr.write("opencode-host: no auth env-var set (OPENAI_API_KEY / MINIMAX_API_KEY / OPENROUTER_API_KEY). Run `/connect` inside opencode to pick a provider, or export one of the env vars.\n");let l=j({configText:c,env:process.env}),f=T(t.host,t.nativeLsp),p=Pe(i),d=sn(i,p.map(m=>m.name),f),h={...l};d.mcps.length>0&&(h.mcp=rn(d.mcps));let b=["// generated by @reddb-io/red-skills",`// version: ${o}`,d.mcps.length>0?`// slice: 1+3 (provider block + ${d.mcps.length} MCP server(s))`:"// slice: 1 (provider block only)","// do not edit by hand \u2014 re-run the generator to refresh.",""].join(`
160
+ `),process.exit(1));let u=J(process.env);u===void 0&&process.stderr.write("opencode-host: no auth env-var set (OPENAI_API_KEY / MINIMAX_API_KEY / OPENROUTER_API_KEY). Run `/connect` inside opencode to pick a provider, or export one of the env vars.\n");let l=j({configText:c,env:process.env}),f=T(t.host,t.nativeLsp),p=Ee(i),d=rn(i,p.map(m=>m.name),f),h={...l};d.mcps.length>0&&(h.mcp=cn(d.mcps));let S=["// generated by @reddb-io/red-skills",`// version: ${s}`,d.mcps.length>0?`// slice: 1+3 (provider block + ${d.mcps.length} MCP server(s))`:"// slice: 1 (provider block only)","// do not edit by hand \u2014 re-run the generator to refresh.",""].join(`
162
161
  `)+JSON.stringify(h,null,2)+`
163
- `;if(t.printJson){process.stdout.write(b);return}try{Ee(on(r),{recursive:!0}),nn(r,b,"utf8")}catch(m){process.stderr.write(`opencode-host: could not write ${t.outPath}: ${m.message}
162
+ `;if(t.printJson){process.stdout.write(S);return}try{Pe(sn(r),{recursive:!0}),on(r,S,"utf8")}catch(m){process.stderr.write(`opencode-host: could not write ${t.outPath}: ${m.message}
164
163
  `),process.exit(1)}for(let m of d.warnings)process.stderr.write(`opencode-host: mcp warning \u2014 ${m}
165
164
  `);if(d.deferred.length>0&&process.stdout.write(`opencode-host: ${d.deferred.join(", ")} deferred to ${f.host} native LSP (--no-native-lsp to publish it anyway)
166
165
  `),!t.slice2){process.stdout.write(`opencode-host: wrote ${t.outPath} (slice 1+3; provider=${u??"openrouter"} via precedence, model=${l.model}, mcps=${d.mcps.length})
167
- `);return}let E=t.pluginFilter&&t.pluginFilter.length>0?p.filter(m=>t.pluginFilter.includes(m.name)).map(m=>m.name):p.map(m=>m.name);E.length===0&&(process.stderr.write(`opencode-host: no plugins discovered under ${i} (expected directories like dev/, memory/, brain/)
168
- `),process.exit(1));let R=Se({pluginsRoot:i,plugins:E,configText:c,env:process.env,semanticAuthority:f});try{Ee(a,{recursive:!0}),Oe(R,{outRoot:a,pluginsRoot:i,plugins:E,configText:c,env:process.env,copySkills:t.copySkills,version:o,semanticAuthority:f})}catch(m){process.stderr.write(`opencode-host: could not write ${r}: ${m.message}
169
- `),process.exit(1)}let H=0;for(let m of R.byPlugin){for(let k of m.skills.errors)process.stderr.write(`opencode-host: skill error in ${m.plugin}: ${k.message}
170
- `),H++;for(let k of m.hooks)for(let Ae of k.warnings)process.stderr.write(`opencode-host: hook warning in ${m.plugin}: ${Ae}
171
- `),H++}process.stdout.write(`opencode-host: wrote ${t.outPath} (slice 1 provider block) + ${a} (slice 2 dist tree; plugins=${E.length}, skills=${R.byPlugin.reduce((m,k)=>m+k.skills.plans.length,0)}, hooks=${R.byPlugin.reduce((m,k)=>m+k.hooks.length,0)}, warnings=${H}, provider=${u??"openrouter"} via precedence)
172
- `)}cn(process.argv.slice(2));
166
+ `);return}let P=t.pluginFilter&&t.pluginFilter.length>0?p.filter(m=>t.pluginFilter.includes(m.name)).map(m=>m.name):p.map(m=>m.name);P.length===0&&(process.stderr.write(`opencode-host: no plugins discovered under ${i} (expected directories like dev/, memory/, brain/)
167
+ `),process.exit(1));let R=$e({pluginsRoot:i,plugins:P,configText:c,env:process.env,semanticAuthority:f});try{Pe(a,{recursive:!0}),Oe(R,{outRoot:a,pluginsRoot:i,plugins:P,configText:c,env:process.env,copySkills:t.copySkills,version:s,semanticAuthority:f})}catch(m){process.stderr.write(`opencode-host: could not write ${r}: ${m.message}
168
+ `),process.exit(1)}let H=0;for(let m of R.byPlugin){for(let v of m.skills.errors)process.stderr.write(`opencode-host: skill error in ${m.plugin}: ${v.message}
169
+ `),H++;for(let v of m.hooks)for(let Ae of v.warnings)process.stderr.write(`opencode-host: hook warning in ${m.plugin}: ${Ae}
170
+ `),H++}process.stdout.write(`opencode-host: wrote ${t.outPath} (slice 1 provider block) + ${a} (slice 2 dist tree; plugins=${P.length}, skills=${R.byPlugin.reduce((m,v)=>m+v.skills.plans.length,0)}, hooks=${R.byPlugin.reduce((m,v)=>m+v.hooks.length,0)}, warnings=${H}, provider=${u??"openrouter"} via precedence)
171
+ `)}an(process.argv.slice(2));