@microi.net/cli 4.7.7 → 4.7.9

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.
@@ -128,7 +128,7 @@ Content-Type: application/octet-stream\r
128
128
  ]`;continue}i+=n[c],n[c]==="\\"?a=!0:o&&n[c]==="]"?o=!1:!o&&n[c]==="["&&(o=!0)}try{new RegExp(i)}catch{return console.warn(`Could not convert regex pattern at ${e.currentPath.join("/")} to a flag-independent form! Falling back to the flag-ignorant source`),t.source}return i}function np(t,e){if(e.target==="openAi"&&console.warn("Warning: OpenAI may not support records in schemas! Try an array of key-value pairs instead."),e.target==="openApi3"&&t.keyType?._def.typeName===O.ZodEnum)return{type:"object",required:t.keyType._def.values,properties:t.keyType._def.values.reduce((n,i)=>({...n,[i]:H(t.valueType._def,{...e,currentPath:[...e.currentPath,"properties",i]})??Le(e)}),{}),additionalProperties:e.rejectedAdditionalProperties};let r={type:"object",additionalProperties:H(t.valueType._def,{...e,currentPath:[...e.currentPath,"additionalProperties"]})??e.allowedAdditionalProperties};if(e.target==="openApi3")return r;if(t.keyType?._def.typeName===O.ZodString&&t.keyType._def.checks?.length){let{type:n,...i}=rp(t.keyType._def,e);return{...r,propertyNames:i}}else{if(t.keyType?._def.typeName===O.ZodEnum)return{...r,propertyNames:{enum:t.keyType._def.values}};if(t.keyType?._def.typeName===O.ZodBranded&&t.keyType._def.type._def.typeName===O.ZodString&&t.keyType._def.type._def.checks?.length){let{type:n,...i}=tp(t.keyType._def,e);return{...r,propertyNames:i}}}return r}function BC(t,e){if(e.mapStrategy==="record")return np(t,e);let r=H(t.keyType._def,{...e,currentPath:[...e.currentPath,"items","items","0"]})||Le(e),n=H(t.valueType._def,{...e,currentPath:[...e.currentPath,"items","items","1"]})||Le(e);return{type:"array",maxItems:125,items:{type:"array",items:[r,n],minItems:2,maxItems:2}}}function UC(t){let e=t.values,n=Object.keys(t.values).filter(a=>typeof e[e[a]]!="number").map(a=>e[a]),i=Array.from(new Set(n.map(a=>typeof a)));return{type:i.length===1?i[0]==="string"?"string":"number":["string","number"],enum:n}}function ZC(t){return t.target==="openAi"?void 0:{not:Le({...t,currentPath:[...t.currentPath,"not"]})}}function JC(t){return t.target==="openApi3"?{enum:["null"],nullable:!0}:{type:"null"}}var Js={ZodString:"string",ZodNumber:"number",ZodBigInt:"integer",ZodBoolean:"boolean",ZodNull:"null"};function KC(t,e){if(e.target==="openApi3")return HC(t,e);let r=t.options instanceof Map?Array.from(t.options.values()):t.options;if(r.every(n=>n._def.typeName in Js&&(!n._def.checks||!n._def.checks.length))){let n=r.reduce((i,a)=>{let o=Js[a._def.typeName];return o&&!i.includes(o)?[...i,o]:i},[]);return{type:n.length>1?n:n[0]}}else if(r.every(n=>n._def.typeName==="ZodLiteral"&&!n.description)){let n=r.reduce((i,a)=>{let o=typeof a._def.value;switch(o){case"string":case"number":case"boolean":return[...i,o];case"bigint":return[...i,"integer"];case"object":if(a._def.value===null)return[...i,"null"];case"symbol":case"undefined":case"function":default:return i}},[]);if(n.length===r.length){let i=n.filter((a,o,s)=>s.indexOf(a)===o);return{type:i.length>1?i:i[0],enum:r.reduce((a,o)=>a.includes(o._def.value)?a:[...a,o._def.value],[])}}}else if(r.every(n=>n._def.typeName==="ZodEnum"))return{type:"string",enum:r.reduce((n,i)=>[...n,...i._def.values.filter(a=>!n.includes(a))],[])};return HC(t,e)}var HC=(t,e)=>{let r=(t.options instanceof Map?Array.from(t.options.values()):t.options).map((n,i)=>H(n._def,{...e,currentPath:[...e.currentPath,"anyOf",`${i}`]})).filter(n=>!!n&&(!e.strictUnions||typeof n=="object"&&Object.keys(n).length>0));return r.length?{anyOf:r}:void 0};function WC(t,e){if(["ZodString","ZodNumber","ZodBigInt","ZodBoolean","ZodNull"].includes(t.innerType._def.typeName)&&(!t.innerType._def.checks||!t.innerType._def.checks.length))return e.target==="openApi3"?{type:Js[t.innerType._def.typeName],nullable:!0}:{type:[Js[t.innerType._def.typeName],"null"]};if(e.target==="openApi3"){let n=H(t.innerType._def,{...e,currentPath:[...e.currentPath]});return n&&"$ref"in n?{allOf:[n],nullable:!0}:n&&{...n,nullable:!0}}let r=H(t.innerType._def,{...e,currentPath:[...e.currentPath,"anyOf","0"]});return r&&{anyOf:[r,{type:"null"}]}}function GC(t,e){let r={type:"number"};if(!t.checks)return r;for(let n of t.checks)switch(n.kind){case"int":r.type="integer",Iy(r,"type",n.message,e);break;case"min":e.target==="jsonSchema7"?n.inclusive?le(r,"minimum",n.value,n.message,e):le(r,"exclusiveMinimum",n.value,n.message,e):(n.inclusive||(r.exclusiveMinimum=!0),le(r,"minimum",n.value,n.message,e));break;case"max":e.target==="jsonSchema7"?n.inclusive?le(r,"maximum",n.value,n.message,e):le(r,"exclusiveMaximum",n.value,n.message,e):(n.inclusive||(r.exclusiveMaximum=!0),le(r,"maximum",n.value,n.message,e));break;case"multipleOf":le(r,"multipleOf",n.value,n.message,e);break}return r}function XC(t,e){let r=e.target==="openAi",n={type:"object",properties:{}},i=[],a=t.shape();for(let s in a){let c=a[s];if(c===void 0||c._def===void 0)continue;let l=dV(c);l&&r&&(c._def.typeName==="ZodOptional"&&(c=c._def.innerType),c.isNullable()||(c=c.nullable()),l=!1);let u=H(c._def,{...e,currentPath:[...e.currentPath,"properties",s],propertyPath:[...e.currentPath,"properties",s]});u!==void 0&&(n.properties[s]=u,l||i.push(s))}i.length&&(n.required=i);let o=pV(t,e);return o!==void 0&&(n.additionalProperties=o),n}function pV(t,e){if(t.catchall._def.typeName!=="ZodNever")return H(t.catchall._def,{...e,currentPath:[...e.currentPath,"additionalProperties"]});switch(t.unknownKeys){case"passthrough":return e.allowedAdditionalProperties;case"strict":return e.rejectedAdditionalProperties;case"strip":return e.removeAdditionalStrategy==="strict"?e.allowedAdditionalProperties:e.rejectedAdditionalProperties}}function dV(t){try{return t.isOptional()}catch{return!0}}var QC=(t,e)=>{if(e.currentPath.toString()===e.propertyPath?.toString())return H(t.innerType._def,e);let r=H(t.innerType._def,{...e,currentPath:[...e.currentPath,"anyOf","1"]});return r?{anyOf:[{not:Le(e)},r]}:Le(e)};var YC=(t,e)=>{if(e.pipeStrategy==="input")return H(t.in._def,e);if(e.pipeStrategy==="output")return H(t.out._def,e);let r=H(t.in._def,{...e,currentPath:[...e.currentPath,"allOf","0"]}),n=H(t.out._def,{...e,currentPath:[...e.currentPath,"allOf",r?"1":"0"]});return{allOf:[r,n].filter(i=>i!==void 0)}};function e4(t,e){return H(t.type._def,e)}function t4(t,e){let n={type:"array",uniqueItems:!0,items:H(t.valueType._def,{...e,currentPath:[...e.currentPath,"items"]})};return t.minSize&&le(n,"minItems",t.minSize.value,t.minSize.message,e),t.maxSize&&le(n,"maxItems",t.maxSize.value,t.maxSize.message,e),n}function r4(t,e){return t.rest?{type:"array",minItems:t.items.length,items:t.items.map((r,n)=>H(r._def,{...e,currentPath:[...e.currentPath,"items",`${n}`]})).reduce((r,n)=>n===void 0?r:[...r,n],[]),additionalItems:H(t.rest._def,{...e,currentPath:[...e.currentPath,"additionalItems"]})}:{type:"array",minItems:t.items.length,maxItems:t.items.length,items:t.items.map((r,n)=>H(r._def,{...e,currentPath:[...e.currentPath,"items",`${n}`]})).reduce((r,n)=>n===void 0?r:[...r,n],[])}}function n4(t){return{not:Le(t)}}function i4(t){return Le(t)}var a4=(t,e)=>H(t.innerType._def,e);var o4=(t,e,r)=>{switch(e){case O.ZodString:return rp(t,r);case O.ZodNumber:return GC(t,r);case O.ZodObject:return XC(t,r);case O.ZodBigInt:return NC(t,r);case O.ZodBoolean:return MC();case O.ZodDate:return Ry(t,r);case O.ZodUndefined:return n4(r);case O.ZodNull:return JC(r);case O.ZodArray:return OC(t,r);case O.ZodUnion:case O.ZodDiscriminatedUnion:return KC(t,r);case O.ZodIntersection:return LC(t,r);case O.ZodTuple:return r4(t,r);case O.ZodRecord:return np(t,r);case O.ZodLiteral:return qC(t,r);case O.ZodEnum:return jC(t);case O.ZodNativeEnum:return UC(t);case O.ZodNullable:return WC(t,r);case O.ZodOptional:return QC(t,r);case O.ZodMap:return BC(t,r);case O.ZodSet:return t4(t,r);case O.ZodLazy:return()=>t.getter()._def;case O.ZodPromise:return e4(t,r);case O.ZodNaN:case O.ZodNever:return ZC(r);case O.ZodEffects:return FC(t,r);case O.ZodAny:return Le(r);case O.ZodUnknown:return i4(r);case O.ZodDefault:return zC(t,r);case O.ZodBranded:return tp(t,r);case O.ZodReadonly:return a4(t,r);case O.ZodCatch:return DC(t,r);case O.ZodPipeline:return YC(t,r);case O.ZodFunction:case O.ZodVoid:case O.ZodSymbol:return;default:return(n=>{})(e)}};function H(t,e,r=!1){let n=e.seen.get(t);if(e.override){let s=e.override?.(t,e,n,r);if(s!==$C)return s}if(n&&!r){let s=fV(n,e);if(s!==void 0)return s}let i={def:t,path:e.currentPath,jsonSchema:void 0};e.seen.set(t,i);let a=o4(t,t.typeName,e),o=typeof a=="function"?H(a(),e):a;if(o&&mV(t,e,o),e.postProcess){let s=e.postProcess(o,t,e);return i.jsonSchema=o,s}return i.jsonSchema=o,o}var fV=(t,e)=>{switch(e.$refStrategy){case"root":return{$ref:t.path.join("/")};case"relative":return{$ref:ep(e.currentPath,t.path)};case"none":case"seen":return t.path.length<e.currentPath.length&&t.path.every((r,n)=>e.currentPath[n]===r)?(console.warn(`Recursive reference detected at ${e.currentPath.join("/")}! Defaulting to any`),Le(e)):e.$refStrategy==="seen"?Le(e):void 0}},mV=(t,e,r)=>(t.description&&(r.description=t.description,e.markdownDescription&&(r.markdownDescription=t.description)),r);var My=(t,e)=>{let r=RC(e),n=typeof e=="object"&&e.definitions?Object.entries(e.definitions).reduce((c,[l,u])=>({...c,[l]:H(u._def,{...r,currentPath:[...r.basePath,r.definitionPath,l]},!0)??Le(r)}),{}):void 0,i=typeof e=="string"?e:e?.nameStrategy==="title"?void 0:e?.name,a=H(t._def,i===void 0?r:{...r,currentPath:[...r.basePath,r.definitionPath,i]},!1)??Le(r),o=typeof e=="object"&&e.name!==void 0&&e.nameStrategy==="title"?e.name:void 0;o!==void 0&&(a.title=o),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 s=i===void 0?n?{...a,[r.definitionPath]:n}:a:{$ref:[...r.$refStrategy==="relative"?[]:r.basePath,r.definitionPath,i].join("/"),[r.definitionPath]:{...n,[i]:a}};return r.target==="jsonSchema7"?s.$schema="http://json-schema.org/draft-07/schema#":(r.target==="jsonSchema2019-09"||r.target==="openAi")&&(s.$schema="https://json-schema.org/draft/2019-09/schema#"),r.target==="openAi"&&("anyOf"in s||"oneOf"in s||"allOf"in s||"type"in s&&Array.isArray(s.type))&&console.warn("Warning: OpenAI may not support schemas with unions as roots! Try wrapping it in an object property."),s};function hV(t){return!t||t==="jsonSchema7"||t==="draft-7"?"draft-7":t==="jsonSchema2019-09"||t==="draft-2020-12"?"draft-2020-12":"draft-7"}function Dy(t,e){return or(t)?pm(t,{target:hV(e?.target),io:e?.pipeStrategy??"input"}):My(t,{strictUnions:e?.strictUnions??!0,pipeStrategy:e?.pipeStrategy??"input"})}function zy(t){let r=Dn(t)?.method;if(!r)throw new Error("Schema is missing a method literal");let n=Yu(r);if(typeof n!="string")throw new Error("Schema method literal must be a string");return n}function Fy(t,e){let r=Mn(t,e);if(!r.success)throw r.error;return r.data}var gV=6e4,ip=class{constructor(e){this._options=e,this._requestMessageId=0,this._requestHandlers=new Map,this._requestHandlerAbortControllers=new Map,this._notificationHandlers=new Map,this._responseHandlers=new Map,this._progressHandlers=new Map,this._timeoutInfo=new Map,this._pendingDebouncedNotifications=new Set,this._taskProgressTokens=new Map,this._requestResolvers=new Map,this.setNotificationHandler(al,r=>{this._oncancel(r)}),this.setNotificationHandler(sl,r=>{this._onprogress(r)}),this.setRequestHandler(ol,r=>({})),this._taskStore=e?.taskStore,this._taskMessageQueue=e?.taskMessageQueue,this._taskStore&&(this.setRequestHandler(cl,async(r,n)=>{let i=await this._taskStore.getTask(r.params.taskId,n.sessionId);if(!i)throw new q(U.InvalidParams,"Failed to retrieve task: Task not found");return{...i}}),this.setRequestHandler(ul,async(r,n)=>{let i=async()=>{let a=r.params.taskId;if(this._taskMessageQueue){let s;for(;s=await this._taskMessageQueue.dequeue(a,n.sessionId);){if(s.type==="response"||s.type==="error"){let c=s.message,l=c.id,u=this._requestResolvers.get(l);if(u)if(this._requestResolvers.delete(l),s.type==="response")u(c);else{let p=c,d=new q(p.error.code,p.error.message,p.error.data);u(d)}else{let p=s.type==="response"?"Response":"Error";this._onerror(new Error(`${p} handler missing for request ${l}`))}continue}await this._transport?.send(s.message,{relatedRequestId:n.requestId})}}let o=await this._taskStore.getTask(a,n.sessionId);if(!o)throw new q(U.InvalidParams,`Task not found: ${a}`);if(!zn(o.status))return await this._waitForTaskUpdate(a,n.signal),await i();if(zn(o.status)){let s=await this._taskStore.getTaskResult(a,n.sessionId);return this._clearTaskQueue(a),{...s,_meta:{...s._meta,[yn]:{taskId:a}}}}return await i()};return await i()}),this.setRequestHandler(pl,async(r,n)=>{try{let{tasks:i,nextCursor:a}=await this._taskStore.listTasks(r.params?.cursor,n.sessionId);return{tasks:i,nextCursor:a,_meta:{}}}catch(i){throw new q(U.InvalidParams,`Failed to list tasks: ${i instanceof Error?i.message:String(i)}`)}}),this.setRequestHandler(fl,async(r,n)=>{try{let i=await this._taskStore.getTask(r.params.taskId,n.sessionId);if(!i)throw new q(U.InvalidParams,`Task not found: ${r.params.taskId}`);if(zn(i.status))throw new q(U.InvalidParams,`Cannot cancel task in terminal status: ${i.status}`);await this._taskStore.updateTaskStatus(r.params.taskId,"cancelled","Client cancelled task execution.",n.sessionId),this._clearTaskQueue(r.params.taskId);let a=await this._taskStore.getTask(r.params.taskId,n.sessionId);if(!a)throw new q(U.InvalidParams,`Task not found after cancellation: ${r.params.taskId}`);return{_meta:{},...a}}catch(i){throw i instanceof q?i:new q(U.InvalidRequest,`Failed to cancel task: ${i instanceof Error?i.message:String(i)}`)}}))}async _oncancel(e){if(!e.params.requestId)return;this._requestHandlerAbortControllers.get(e.params.requestId)?.abort(e.params.reason)}_setupTimeout(e,r,n,i,a=!1){this._timeoutInfo.set(e,{timeoutId:setTimeout(i,r),startTime:Date.now(),timeout:r,maxTotalTimeout:n,resetTimeoutOnProgress:a,onTimeout:i})}_resetTimeout(e){let r=this._timeoutInfo.get(e);if(!r)return!1;let n=Date.now()-r.startTime;if(r.maxTotalTimeout&&n>=r.maxTotalTimeout)throw this._timeoutInfo.delete(e),q.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(e){let r=this._timeoutInfo.get(e);r&&(clearTimeout(r.timeoutId),this._timeoutInfo.delete(e))}async connect(e){if(this._transport)throw new Error("Already connected to a transport. Call close() before connecting to a new transport, or use a separate Protocol instance per connection.");this._transport=e;let r=this.transport?.onclose;this._transport.onclose=()=>{r?.(),this._onclose()};let n=this.transport?.onerror;this._transport.onerror=a=>{n?.(a),this._onerror(a)};let i=this._transport?.onmessage;this._transport.onmessage=(a,o)=>{i?.(a,o),Uo(a)||r1(a)?this._onresponse(a):Sm(a)?this._onrequest(a,o):t1(a)?this._onnotification(a):this._onerror(new Error(`Unknown message type: ${JSON.stringify(a)}`))},await this._transport.start()}_onclose(){let e=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=q.fromError(U.ConnectionClosed,"Connection closed");this._transport=void 0,this.onclose?.();for(let n of e.values())n(r)}_onerror(e){this.onerror?.(e)}_onnotification(e){let r=this._notificationHandlers.get(e.method)??this.fallbackNotificationHandler;r!==void 0&&Promise.resolve().then(()=>r(e)).catch(n=>this._onerror(new Error(`Uncaught error in notification handler: ${n}`)))}_onrequest(e,r){let n=this._requestHandlers.get(e.method)??this.fallbackRequestHandler,i=this._transport,a=e.params?._meta?.[yn]?.taskId;if(n===void 0){let u={jsonrpc:"2.0",id:e.id,error:{code:U.MethodNotFound,message:"Method not found"}};a&&this._taskMessageQueue?this._enqueueTaskMessage(a,{type:"error",message:u,timestamp:Date.now()},i?.sessionId).catch(p=>this._onerror(new Error(`Failed to enqueue error response: ${p}`))):i?.send(u).catch(p=>this._onerror(new Error(`Failed to send an error response: ${p}`)));return}let o=new AbortController;this._requestHandlerAbortControllers.set(e.id,o);let s=Q0(e.params)?e.params.task:void 0,c=this._taskStore?this.requestTaskStore(e,i?.sessionId):void 0,l={signal:o.signal,sessionId:i?.sessionId,_meta:e.params?._meta,sendNotification:async u=>{if(o.signal.aborted)return;let p={relatedRequestId:e.id};a&&(p.relatedTask={taskId:a}),await this.notification(u,p)},sendRequest:async(u,p,d)=>{if(o.signal.aborted)throw new q(U.ConnectionClosed,"Request was cancelled");let h={...d,relatedRequestId:e.id};a&&!h.relatedTask&&(h.relatedTask={taskId:a});let m=h.relatedTask?.taskId??a;return m&&c&&await c.updateTaskStatus(m,"input_required"),await this.request(u,p,h)},authInfo:r?.authInfo,requestId:e.id,requestInfo:r?.requestInfo,taskId:a,taskStore:c,taskRequestedTtl:s?.ttl,closeSSEStream:r?.closeSSEStream,closeStandaloneSSEStream:r?.closeStandaloneSSEStream};Promise.resolve().then(()=>{s&&this.assertTaskHandlerCapability(e.method)}).then(()=>n(e,l)).then(async u=>{if(o.signal.aborted)return;let p={result:u,jsonrpc:"2.0",id:e.id};a&&this._taskMessageQueue?await this._enqueueTaskMessage(a,{type:"response",message:p,timestamp:Date.now()},i?.sessionId):await i?.send(p)},async u=>{if(o.signal.aborted)return;let p={jsonrpc:"2.0",id:e.id,error:{code:Number.isSafeInteger(u.code)?u.code:U.InternalError,message:u.message??"Internal error",...u.data!==void 0&&{data:u.data}}};a&&this._taskMessageQueue?await this._enqueueTaskMessage(a,{type:"error",message:p,timestamp:Date.now()},i?.sessionId):await i?.send(p)}).catch(u=>this._onerror(new Error(`Failed to send response: ${u}`))).finally(()=>{this._requestHandlerAbortControllers.get(e.id)===o&&this._requestHandlerAbortControllers.delete(e.id)})}_onprogress(e){let{progressToken:r,...n}=e.params,i=Number(r),a=this._progressHandlers.get(i);if(!a){this._onerror(new Error(`Received a progress notification for an unknown token: ${JSON.stringify(e)}`));return}let o=this._responseHandlers.get(i),s=this._timeoutInfo.get(i);if(s&&o&&s.resetTimeoutOnProgress)try{this._resetTimeout(i)}catch(c){this._responseHandlers.delete(i),this._progressHandlers.delete(i),this._cleanupTimeout(i),o(c);return}a(n)}_onresponse(e){let r=Number(e.id),n=this._requestResolvers.get(r);if(n){if(this._requestResolvers.delete(r),Uo(e))n(e);else{let o=new q(e.error.code,e.error.message,e.error.data);n(o)}return}let i=this._responseHandlers.get(r);if(i===void 0){this._onerror(new Error(`Received a response for an unknown message ID: ${JSON.stringify(e)}`));return}this._responseHandlers.delete(r),this._cleanupTimeout(r);let a=!1;if(Uo(e)&&e.result&&typeof e.result=="object"){let o=e.result;if(o.task&&typeof o.task=="object"){let s=o.task;typeof s.taskId=="string"&&(a=!0,this._taskProgressTokens.set(s.taskId,r))}}if(a||this._progressHandlers.delete(r),Uo(e))i(e);else{let o=q.fromError(e.error.code,e.error.message,e.error.data);i(o)}}get transport(){return this._transport}async close(){await this._transport?.close()}async*requestStream(e,r,n){let{task:i}=n??{};if(!i){try{yield{type:"result",result:await this.request(e,r,n)}}catch(o){yield{type:"error",error:o instanceof q?o:new q(U.InternalError,String(o))}}return}let a;try{let o=await this.request(e,ua,n);if(o.task)a=o.task.taskId,yield{type:"taskCreated",task:o.task};else throw new q(U.InternalError,"Task creation did not return a task");for(;;){let s=await this.getTask({taskId:a},n);if(yield{type:"taskStatus",task:s},zn(s.status)){s.status==="completed"?yield{type:"result",result:await this.getTaskResult({taskId:a},r,n)}:s.status==="failed"?yield{type:"error",error:new q(U.InternalError,`Task ${a} failed`)}:s.status==="cancelled"&&(yield{type:"error",error:new q(U.InternalError,`Task ${a} was cancelled`)});return}if(s.status==="input_required"){yield{type:"result",result:await this.getTaskResult({taskId:a},r,n)};return}let c=s.pollInterval??this._options?.defaultTaskPollInterval??1e3;await new Promise(l=>setTimeout(l,c)),n?.signal?.throwIfAborted()}}catch(o){yield{type:"error",error:o instanceof q?o:new q(U.InternalError,String(o))}}}request(e,r,n){let{relatedRequestId:i,resumptionToken:a,onresumptiontoken:o,task:s,relatedTask:c}=n??{};return new Promise((l,u)=>{let p=v=>{u(v)};if(!this._transport){p(new Error("Not connected"));return}if(this._options?.enforceStrictCapabilities===!0)try{this.assertCapabilityForMethod(e.method),s&&this.assertTaskCapability(e.method)}catch(v){p(v);return}n?.signal?.throwIfAborted();let d=this._requestMessageId++,h={...e,jsonrpc:"2.0",id:d};n?.onprogress&&(this._progressHandlers.set(d,n.onprogress),h.params={...e.params,_meta:{...e.params?._meta||{},progressToken:d}}),s&&(h.params={...h.params,task:s}),c&&(h.params={...h.params,_meta:{...h.params?._meta||{},[yn]:c}});let m=v=>{this._responseHandlers.delete(d),this._progressHandlers.delete(d),this._cleanupTimeout(d),this._transport?.send({jsonrpc:"2.0",method:"notifications/cancelled",params:{requestId:d,reason:String(v)}},{relatedRequestId:i,resumptionToken:a,onresumptiontoken:o}).catch(w=>this._onerror(new Error(`Failed to send cancellation: ${w}`)));let b=v instanceof q?v:new q(U.RequestTimeout,String(v));u(b)};this._responseHandlers.set(d,v=>{if(!n?.signal?.aborted){if(v instanceof Error)return u(v);try{let b=Mn(r,v.result);b.success?l(b.data):u(b.error)}catch(b){u(b)}}}),n?.signal?.addEventListener("abort",()=>{m(n?.signal?.reason)});let y=n?.timeout??gV,g=()=>m(q.fromError(U.RequestTimeout,"Request timed out",{timeout:y}));this._setupTimeout(d,y,n?.maxTotalTimeout,g,n?.resetTimeoutOnProgress??!1);let x=c?.taskId;if(x){let v=b=>{let w=this._responseHandlers.get(d);w?w(b):this._onerror(new Error(`Response handler missing for side-channeled request ${d}`))};this._requestResolvers.set(d,v),this._enqueueTaskMessage(x,{type:"request",message:h,timestamp:Date.now()}).catch(b=>{this._cleanupTimeout(d),u(b)})}else this._transport.send(h,{relatedRequestId:i,resumptionToken:a,onresumptiontoken:o}).catch(v=>{this._cleanupTimeout(d),u(v)})})}async getTask(e,r){return this.request({method:"tasks/get",params:e},ll,r)}async getTaskResult(e,r,n){return this.request({method:"tasks/result",params:e},r,n)}async listTasks(e,r){return this.request({method:"tasks/list",params:e},dl,r)}async cancelTask(e,r){return this.request({method:"tasks/cancel",params:e},i1,r)}async notification(e,r){if(!this._transport)throw new Error("Not connected");this.assertNotificationCapability(e.method);let n=r?.relatedTask?.taskId;if(n){let s={...e,jsonrpc:"2.0",params:{...e.params,_meta:{...e.params?._meta||{},[yn]:r.relatedTask}}};await this._enqueueTaskMessage(n,{type:"notification",message:s,timestamp:Date.now()});return}if((this._options?.debouncedNotificationMethods??[]).includes(e.method)&&!e.params&&!r?.relatedRequestId&&!r?.relatedTask){if(this._pendingDebouncedNotifications.has(e.method))return;this._pendingDebouncedNotifications.add(e.method),Promise.resolve().then(()=>{if(this._pendingDebouncedNotifications.delete(e.method),!this._transport)return;let s={...e,jsonrpc:"2.0"};r?.relatedTask&&(s={...s,params:{...s.params,_meta:{...s.params?._meta||{},[yn]:r.relatedTask}}}),this._transport?.send(s,r).catch(c=>this._onerror(c))});return}let o={...e,jsonrpc:"2.0"};r?.relatedTask&&(o={...o,params:{...o.params,_meta:{...o.params?._meta||{},[yn]:r.relatedTask}}}),await this._transport.send(o,r)}setRequestHandler(e,r){let n=zy(e);this.assertRequestHandlerCapability(n),this._requestHandlers.set(n,(i,a)=>{let o=Fy(e,i);return Promise.resolve(r(o,a))})}removeRequestHandler(e){this._requestHandlers.delete(e)}assertCanSetRequestHandler(e){if(this._requestHandlers.has(e))throw new Error(`A request handler for ${e} already exists, which would be overridden`)}setNotificationHandler(e,r){let n=zy(e);this._notificationHandlers.set(n,i=>{let a=Fy(e,i);return Promise.resolve(r(a))})}removeNotificationHandler(e){this._notificationHandlers.delete(e)}_cleanupTaskProgressHandler(e){let r=this._taskProgressTokens.get(e);r!==void 0&&(this._progressHandlers.delete(r),this._taskProgressTokens.delete(e))}async _enqueueTaskMessage(e,r,n){if(!this._taskStore||!this._taskMessageQueue)throw new Error("Cannot enqueue task message: taskStore and taskMessageQueue are not configured");let i=this._options?.maxTaskQueueSize;await this._taskMessageQueue.enqueue(e,r,n,i)}async _clearTaskQueue(e,r){if(this._taskMessageQueue){let n=await this._taskMessageQueue.dequeueAll(e,r);for(let i of n)if(i.type==="request"&&Sm(i.message)){let a=i.message.id,o=this._requestResolvers.get(a);o?(o(new q(U.InternalError,"Task cancelled or completed")),this._requestResolvers.delete(a)):this._onerror(new Error(`Resolver missing for request ${a} during task ${e} cleanup`))}}}async _waitForTaskUpdate(e,r){let n=this._options?.defaultTaskPollInterval??1e3;try{let i=await this._taskStore?.getTask(e);i?.pollInterval&&(n=i.pollInterval)}catch{}return new Promise((i,a)=>{if(r.aborted){a(new q(U.InvalidRequest,"Request cancelled"));return}let o=setTimeout(i,n);r.addEventListener("abort",()=>{clearTimeout(o),a(new q(U.InvalidRequest,"Request cancelled"))},{once:!0})})}requestTaskStore(e,r){let n=this._taskStore;if(!n)throw new Error("No task store configured");return{createTask:async i=>{if(!e)throw new Error("No request provided");return await n.createTask(i,e.id,{method:e.method,params:e.params},r)},getTask:async i=>{let a=await n.getTask(i,r);if(!a)throw new q(U.InvalidParams,"Failed to retrieve task: Task not found");return a},storeTaskResult:async(i,a,o)=>{await n.storeTaskResult(i,a,o,r);let s=await n.getTask(i,r);if(s){let c=Wo.parse({method:"notifications/tasks/status",params:s});await this.notification(c),zn(s.status)&&this._cleanupTaskProgressHandler(i)}},getTaskResult:i=>n.getTaskResult(i,r),updateTaskStatus:async(i,a,o)=>{let s=await n.getTask(i,r);if(!s)throw new q(U.InvalidParams,`Task "${i}" not found - it may have been cleaned up`);if(zn(s.status))throw new q(U.InvalidParams,`Cannot update task "${i}" from terminal status "${s.status}" to "${a}". Terminal states (completed, failed, cancelled) cannot transition to other states.`);await n.updateTaskStatus(i,a,o,r);let c=await n.getTask(i,r);if(c){let l=Wo.parse({method:"notifications/tasks/status",params:c});await this.notification(l),zn(c.status)&&this._cleanupTaskProgressHandler(i)}},listTasks:i=>n.listTasks(i,r)}}};function s4(t){return t!==null&&typeof t=="object"&&!Array.isArray(t)}function c4(t,e){let r={...t};for(let n in e){let i=n,a=e[i];if(a===void 0)continue;let o=r[i];s4(o)&&s4(a)?r[i]={...o,...a}:r[i]=a}return r}var KA=We(Sv(),1),WA=We(HA(),1);function sH(){let t=new KA.default({strict:!1,validateFormats:!0,validateSchema:!1,allErrors:!0});return(0,WA.default)(t),t}var Lp=class{constructor(e){this._ajv=e??sH()}getValidator(e){let r="$id"in e&&typeof e.$id=="string"?this._ajv.getSchema(e.$id)??this._ajv.compile(e):this._ajv.compile(e);return n=>r(n)?{valid:!0,data:n,errorMessage:void 0}:{valid:!1,data:void 0,errorMessage:this._ajv.errorsText(r.errors)}}};var qp=class{constructor(e){this._server=e}requestStream(e,r,n){return this._server.requestStream(e,r,n)}createMessageStream(e,r){let n=this._server.getClientCapabilities();if((e.tools||e.toolChoice)&&!n?.sampling?.tools)throw new Error("Client does not support sampling tools capability.");if(e.messages.length>0){let i=e.messages[e.messages.length-1],a=Array.isArray(i.content)?i.content:[i.content],o=a.some(u=>u.type==="tool_result"),s=e.messages.length>1?e.messages[e.messages.length-2]:void 0,c=s?Array.isArray(s.content)?s.content:[s.content]:[],l=c.some(u=>u.type==="tool_use");if(o){if(a.some(u=>u.type!=="tool_result"))throw new Error("The last message must contain only tool_result content if any is present");if(!l)throw new Error("tool_result blocks are not matching any tool_use from the previous message")}if(l){let u=new Set(c.filter(d=>d.type==="tool_use").map(d=>d.id)),p=new Set(a.filter(d=>d.type==="tool_result").map(d=>d.toolUseId));if(u.size!==p.size||![...u].every(d=>p.has(d)))throw new Error("ids of tool_result blocks and tool_use blocks from previous message do not match")}}return this.requestStream({method:"sampling/createMessage",params:e},Qo,r)}elicitInputStream(e,r){let n=this._server.getClientCapabilities(),i=e.mode??"form";switch(i){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 a=i==="form"&&e.mode===void 0?{...e,mode:"form"}:e;return this.requestStream({method:"elicitation/create",params:a},fa,r)}async getTask(e,r){return this._server.getTask({taskId:e},r)}async getTaskResult(e,r,n){return this._server.getTaskResult({taskId:e},r,n)}async listTasks(e,r){return this._server.listTasks(e?{cursor:e}:void 0,r)}async cancelTask(e,r){return this._server.cancelTask({taskId:e},r)}};function GA(t,e,r){if(!t)throw new Error(`${r} does not support task creation (required for ${e})`);switch(e){case"tools/call":if(!t.tools?.call)throw new Error(`${r} does not support task creation for tools/call (required for ${e})`);break;default:break}}function XA(t,e,r){if(!t)throw new Error(`${r} does not support task creation (required for ${e})`);switch(e){case"sampling/createMessage":if(!t.sampling?.createMessage)throw new Error(`${r} does not support task creation for sampling/createMessage (required for ${e})`);break;case"elicitation/create":if(!t.elicitation?.create)throw new Error(`${r} does not support task creation for elicitation/create (required for ${e})`);break;default:break}}var Vp=class extends ip{constructor(e,r){super(r),this._serverInfo=e,this._loggingLevels=new Map,this.LOG_LEVEL_SEVERITY=new Map(Xo.options.map((n,i)=>[n,i])),this.isMessageIgnored=(n,i)=>{let a=this._loggingLevels.get(i);return a?this.LOG_LEVEL_SEVERITY.get(n)<this.LOG_LEVEL_SEVERITY.get(a):!1},this._capabilities=r?.capabilities??{},this._instructions=r?.instructions,this._jsonSchemaValidator=r?.jsonSchemaValidator??new Lp,this.setRequestHandler(Tm,n=>this._oninitialize(n)),this.setNotificationHandler(Cm,()=>this.oninitialized?.()),this._capabilities.logging&&this.setRequestHandler(Nm,async(n,i)=>{let a=i.sessionId||i.requestInfo?.headers["mcp-session-id"]||void 0,{level:o}=n.params,s=Xo.safeParse(o);return s.success&&this._loggingLevels.set(a,s.data),{}})}get experimental(){return this._experimental||(this._experimental={tasks:new qp(this)}),this._experimental}registerCapabilities(e){if(this.transport)throw new Error("Cannot register capabilities after connecting to transport");this._capabilities=c4(this._capabilities,e)}setRequestHandler(e,r){let i=Dn(e)?.method;if(!i)throw new Error("Schema is missing a method literal");let a;if(or(i)){let s=i;a=s._zod?.def?.value??s.value}else{let s=i;a=s._def?.value??s.value}if(typeof a!="string")throw new Error("Schema method literal must be a string");if(a==="tools/call"){let s=async(c,l)=>{let u=Mn(da,c);if(!u.success){let m=u.error instanceof Error?u.error.message:String(u.error);throw new q(U.InvalidParams,`Invalid tools/call request: ${m}`)}let{params:p}=u.data,d=await Promise.resolve(r(c,l));if(p.task){let m=Mn(ua,d);if(!m.success){let y=m.error instanceof Error?m.error.message:String(m.error);throw new q(U.InvalidParams,`Invalid task creation result: ${y}`)}return m.data}let h=Mn(xl,d);if(!h.success){let m=h.error instanceof Error?h.error.message:String(h.error);throw new q(U.InvalidParams,`Invalid tools/call result: ${m}`)}return h.data};return super.setRequestHandler(e,s)}return super.setRequestHandler(e,r)}assertCapabilityForMethod(e){switch(e){case"sampling/createMessage":if(!this._clientCapabilities?.sampling)throw new Error(`Client does not support sampling (required for ${e})`);break;case"elicitation/create":if(!this._clientCapabilities?.elicitation)throw new Error(`Client does not support elicitation (required for ${e})`);break;case"roots/list":if(!this._clientCapabilities?.roots)throw new Error(`Client does not support listing roots (required for ${e})`);break;case"ping":break}}assertNotificationCapability(e){switch(e){case"notifications/message":if(!this._capabilities.logging)throw new Error(`Server does not support logging (required for ${e})`);break;case"notifications/resources/updated":case"notifications/resources/list_changed":if(!this._capabilities.resources)throw new Error(`Server does not support notifying about resources (required for ${e})`);break;case"notifications/tools/list_changed":if(!this._capabilities.tools)throw new Error(`Server does not support notifying of tool list changes (required for ${e})`);break;case"notifications/prompts/list_changed":if(!this._capabilities.prompts)throw new Error(`Server does not support notifying of prompt list changes (required for ${e})`);break;case"notifications/elicitation/complete":if(!this._clientCapabilities?.elicitation?.url)throw new Error(`Client does not support URL elicitation (required for ${e})`);break;case"notifications/cancelled":break;case"notifications/progress":break}}assertRequestHandlerCapability(e){if(this._capabilities)switch(e){case"completion/complete":if(!this._capabilities.completions)throw new Error(`Server does not support completions (required for ${e})`);break;case"logging/setLevel":if(!this._capabilities.logging)throw new Error(`Server does not support logging (required for ${e})`);break;case"prompts/get":case"prompts/list":if(!this._capabilities.prompts)throw new Error(`Server does not support prompts (required for ${e})`);break;case"resources/list":case"resources/templates/list":case"resources/read":if(!this._capabilities.resources)throw new Error(`Server does not support resources (required for ${e})`);break;case"tools/call":case"tools/list":if(!this._capabilities.tools)throw new Error(`Server does not support tools (required for ${e})`);break;case"tasks/get":case"tasks/list":case"tasks/result":case"tasks/cancel":if(!this._capabilities.tasks)throw new Error(`Server does not support tasks capability (required for ${e})`);break;case"ping":case"initialize":break}}assertTaskCapability(e){XA(this._clientCapabilities?.tasks?.requests,e,"Client")}assertTaskHandlerCapability(e){this._capabilities&&GA(this._capabilities.tasks?.requests,e,"Server")}async _oninitialize(e){let r=e.params.protocolVersion;return this._clientCapabilities=e.params.capabilities,this._clientVersion=e.params.clientInfo,{protocolVersion:W0.includes(r)?r:wm,capabilities:this.getCapabilities(),serverInfo:this._serverInfo,...this._instructions&&{instructions:this._instructions}}}getClientCapabilities(){return this._clientCapabilities}getClientVersion(){return this._clientVersion}getCapabilities(){return this._capabilities}async ping(){return this.request({method:"ping"},il)}async createMessage(e,r){if((e.tools||e.toolChoice)&&!this._clientCapabilities?.sampling?.tools)throw new Error("Client does not support sampling tools capability.");if(e.messages.length>0){let n=e.messages[e.messages.length-1],i=Array.isArray(n.content)?n.content:[n.content],a=i.some(l=>l.type==="tool_result"),o=e.messages.length>1?e.messages[e.messages.length-2]:void 0,s=o?Array.isArray(o.content)?o.content:[o.content]:[],c=s.some(l=>l.type==="tool_use");if(a){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(!c)throw new Error("tool_result blocks are not matching any tool_use from the previous message")}if(c){let l=new Set(s.filter(p=>p.type==="tool_use").map(p=>p.id)),u=new Set(i.filter(p=>p.type==="tool_result").map(p=>p.toolUseId));if(l.size!==u.size||![...l].every(p=>u.has(p)))throw new Error("ids of tool_result blocks and tool_use blocks from previous message do not match")}}return e.tools?this.request({method:"sampling/createMessage",params:e},Mm,r):this.request({method:"sampling/createMessage",params:e},Qo,r)}async elicitInput(e,r){switch(e.mode??"form"){case"url":{if(!this._clientCapabilities?.elicitation?.url)throw new Error("Client does not support url elicitation.");let i=e;return this.request({method:"elicitation/create",params:i},fa,r)}case"form":{if(!this._clientCapabilities?.elicitation?.form)throw new Error("Client does not support form elicitation.");let i=e.mode==="form"?e:{...e,mode:"form"},a=await this.request({method:"elicitation/create",params:i},fa,r);if(a.action==="accept"&&a.content&&i.requestedSchema)try{let s=this._jsonSchemaValidator.getValidator(i.requestedSchema)(a.content);if(!s.valid)throw new q(U.InvalidParams,`Elicitation response content does not match requested schema: ${s.errorMessage}`)}catch(o){throw o instanceof q?o:new q(U.InternalError,`Error validating elicitation response: ${o instanceof Error?o.message:String(o)}`)}return a}}}createElicitationCompletionNotifier(e,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:e}},r)}async listRoots(e,r){return this.request({method:"roots/list",params:e},Dm,r)}async sendLoggingMessage(e,r){if(this._capabilities.logging&&!this.isMessageIgnored(e.level,r))return this.notification({method:"notifications/message",params:e})}async sendResourceUpdated(e){return this.notification({method:"notifications/resources/updated",params:e})}async sendResourceListChanged(){return this.notification({method:"notifications/resources/list_changed"})}async sendToolListChanged(){return this.notification({method:"notifications/tools/list_changed"})}async sendPromptListChanged(){return this.notification({method:"notifications/prompts/list_changed"})}};var YA=Symbol.for("mcp.completable");function Iv(t){return!!t&&typeof t=="object"&&YA in t}function eP(t){return t[YA]?.complete}var QA;(function(t){t.Completable="McpCompletable"})(QA||(QA={}));var Bp=class t{static isTemplate(e){return/\{[^}\s]+\}/.test(e)}static validateLength(e,r,n){if(e.length>r)throw new Error(`${n} exceeds maximum length of ${r} characters (got ${e.length})`)}get variableNames(){return this.parts.flatMap(e=>typeof e=="string"?[]:e.names)}constructor(e){t.validateLength(e,1e6,"Template"),this.template=e,this.parts=this.parse(e)}toString(){return this.template}parse(e){let r=[],n="",i=0,a=0;for(;i<e.length;)if(e[i]==="{"){n&&(r.push(n),n="");let o=e.indexOf("}",i);if(o===-1)throw new Error("Unclosed template expression");if(a++,a>1e4)throw new Error("Template contains too many expressions (max 10000)");let s=e.slice(i+1,o),c=this.getOperator(s),l=s.includes("*"),u=this.getNames(s),p=u[0];for(let d of u)t.validateLength(d,1e6,"Variable name");r.push({name:p,operator:c,names:u,exploded:l}),i=o+1}else n+=e[i],i++;return n&&r.push(n),r}getOperator(e){return["+","#",".","/","?","&"].find(n=>e.startsWith(n))||""}getNames(e){let r=this.getOperator(e);return e.slice(r.length).split(",").map(n=>n.replace("*","").trim()).filter(n=>n.length>0)}encodeValue(e,r){return t.validateLength(e,1e6,"Variable value"),r==="+"||r==="#"?encodeURI(e):encodeURIComponent(e)}expandPart(e,r){if(e.operator==="?"||e.operator==="&"){let o=e.names.map(c=>{let l=r[c];if(l===void 0)return"";let u=Array.isArray(l)?l.map(p=>this.encodeValue(p,e.operator)).join(","):this.encodeValue(l.toString(),e.operator);return`${c}=${u}`}).filter(c=>c.length>0);return o.length===0?"":(e.operator==="?"?"?":"&")+o.join("&")}if(e.names.length>1){let o=e.names.map(s=>r[s]).filter(s=>s!==void 0);return o.length===0?"":o.map(s=>Array.isArray(s)?s[0]:s).join(",")}let n=r[e.name];if(n===void 0)return"";let a=(Array.isArray(n)?n:[n]).map(o=>this.encodeValue(o,e.operator));switch(e.operator){case"":return a.join(",");case"+":return a.join(",");case"#":return"#"+a.join(",");case".":return"."+a.join(".");case"/":return"/"+a.join("/");default:return a.join(",")}}expand(e){let r="",n=!1;for(let i of this.parts){if(typeof i=="string"){r+=i;continue}let a=this.expandPart(i,e);a&&((i.operator==="?"||i.operator==="&")&&n?r+=a.replace("?","&"):r+=a,(i.operator==="?"||i.operator==="&")&&(n=!0))}return r}escapeRegExp(e){return e.replace(/[.*+?^${}()|[\]\\]/g,"\\$&")}partToRegExp(e){let r=[];for(let a of e.names)t.validateLength(a,1e6,"Variable name");if(e.operator==="?"||e.operator==="&"){for(let a=0;a<e.names.length;a++){let o=e.names[a],s=a===0?"\\"+e.operator:"&";r.push({pattern:s+this.escapeRegExp(o)+"=([^&]+)",name:o})}return r}let n,i=e.name;switch(e.operator){case"":n=e.exploded?"([^/,]+(?:,[^/,]+)*)":"([^/,]+)";break;case"+":case"#":n="(.+)";break;case".":n="\\.([^/,]+)";break;case"/":n="/"+(e.exploded?"([^/,]+(?:,[^/,]+)*)":"([^/,]+)");break;default:n="([^/]+)"}return r.push({pattern:n,name:i}),r}match(e){t.validateLength(e,1e6,"URI");let r="^",n=[];for(let s of this.parts)if(typeof s=="string")r+=this.escapeRegExp(s);else{let c=this.partToRegExp(s);for(let{pattern:l,name:u}of c)r+=l,n.push({name:u,exploded:s.exploded})}r+="$",t.validateLength(r,1e6,"Generated regex pattern");let i=new RegExp(r),a=e.match(i);if(!a)return null;let o={};for(let s=0;s<n.length;s++){let{name:c,exploded:l}=n[s],u=a[s+1],p=c.replace("*","");l&&u.includes(",")?o[p]=u.split(","):o[p]=u}return o}};var cH=/^[A-Za-z0-9._-]{1,128}$/;function lH(t){let e=[];if(t.length===0)return{isValid:!1,warnings:["Tool name cannot be empty"]};if(t.length>128)return{isValid:!1,warnings:[`Tool name exceeds maximum length of 128 characters (current: ${t.length})`]};if(t.includes(" ")&&e.push("Tool name contains spaces, which may cause parsing issues"),t.includes(",")&&e.push("Tool name contains commas, which may cause parsing issues"),(t.startsWith("-")||t.endsWith("-"))&&e.push("Tool name starts or ends with a dash, which may cause parsing issues in some contexts"),(t.startsWith(".")||t.endsWith("."))&&e.push("Tool name starts or ends with a dot, which may cause parsing issues in some contexts"),!cH.test(t)){let r=t.split("").filter(n=>!/[A-Za-z0-9._-]/.test(n)).filter((n,i,a)=>a.indexOf(n)===i);return e.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:e}}return{isValid:!0,warnings:e}}function uH(t,e){if(e.length>0){console.warn(`Tool name validation warning for "${t}":`);for(let r of e)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 Rv(t){let e=lH(t);return uH(t,e.warnings),e.isValid}var Up=class{constructor(e){this._mcpServer=e}registerToolTask(e,r,n){let i={taskSupport:"required",...r.execution};if(i.taskSupport==="forbidden")throw new Error(`Cannot register task-based tool '${e}' with taskSupport 'forbidden'. Use registerTool() instead.`);return this._mcpServer._createRegisteredTool(e,r.title,r.description,r.inputSchema,r.outputSchema,r.annotations,i,r._meta,n)}};var Zp=class{constructor(e,r){this._registeredResources={},this._registeredResourceTemplates={},this._registeredTools={},this._registeredPrompts={},this._toolHandlersInitialized=!1,this._completionHandlerInitialized=!1,this._resourceHandlersInitialized=!1,this._promptHandlersInitialized=!1,this.server=new Vp(e,r)}get experimental(){return this._experimental||(this._experimental={tasks:new Up(this)}),this._experimental}async connect(e){return await this.server.connect(e)}async close(){await this.server.close()}setToolRequestHandlers(){this._toolHandlersInitialized||(this.server.assertCanSetRequestHandler(Jn(vl)),this.server.assertCanSetRequestHandler(Jn(da)),this.server.registerCapabilities({tools:{listChanged:!0}}),this.server.setRequestHandler(vl,()=>({tools:Object.entries(this._registeredTools).filter(([,e])=>e.enabled).map(([e,r])=>{let n={name:e,title:r.title,description:r.description,inputSchema:(()=>{let i=Xa(r.inputSchema);return i?Dy(i,{strictUnions:!0,pipeStrategy:"input"}):pH})(),annotations:r.annotations,execution:r.execution,_meta:r._meta};if(r.outputSchema){let i=Xa(r.outputSchema);i&&(n.outputSchema=Dy(i,{strictUnions:!0,pipeStrategy:"output"}))}return n})})),this.server.setRequestHandler(da,async(e,r)=>{try{let n=this._registeredTools[e.params.name];if(!n)throw new q(U.InvalidParams,`Tool ${e.params.name} not found`);if(!n.enabled)throw new q(U.InvalidParams,`Tool ${e.params.name} disabled`);let i=!!e.params.task,a=n.execution?.taskSupport,o="createTask"in n.handler;if((a==="required"||a==="optional")&&!o)throw new q(U.InternalError,`Tool ${e.params.name} has taskSupport '${a}' but was not registered with registerToolTask`);if(a==="required"&&!i)throw new q(U.MethodNotFound,`Tool ${e.params.name} requires task augmentation (taskSupport: 'required')`);if(a==="optional"&&!i&&o)return await this.handleAutomaticTaskPolling(n,e,r);let s=await this.validateToolInput(n,e.params.arguments,e.params.name),c=await this.executeToolHandler(n,s,r);return i||await this.validateToolOutput(n,c,e.params.name),c}catch(n){if(n instanceof q&&n.code===U.UrlElicitationRequired)throw n;return this.createToolError(n instanceof Error?n.message:String(n))}}),this._toolHandlersInitialized=!0)}createToolError(e){return{content:[{type:"text",text:e}],isError:!0}}async validateToolInput(e,r,n){if(!e.inputSchema)return;let a=Xa(e.inputSchema)??e.inputSchema,o=await Xu(a,r);if(!o.success){let s="error"in o?o.error:"Unknown error",c=Qu(s);throw new q(U.InvalidParams,`Input validation error: Invalid arguments for tool ${n}: ${c}`)}return o.data}async validateToolOutput(e,r,n){if(!e.outputSchema||!("content"in r)||r.isError)return;if(!r.structuredContent)throw new q(U.InvalidParams,`Output validation error: Tool ${n} has an output schema but no structured content was provided`);let i=Xa(e.outputSchema),a=await Xu(i,r.structuredContent);if(!a.success){let o="error"in a?a.error:"Unknown error",s=Qu(o);throw new q(U.InvalidParams,`Output validation error: Invalid structured content for tool ${n}: ${s}`)}}async executeToolHandler(e,r,n){let i=e.handler;if("createTask"in i){if(!n.taskStore)throw new Error("No task store provided.");let o={...n,taskStore:n.taskStore};if(e.inputSchema){let s=i;return await Promise.resolve(s.createTask(r,o))}else{let s=i;return await Promise.resolve(s.createTask(o))}}if(e.inputSchema){let o=i;return await Promise.resolve(o(r,n))}else{let o=i;return await Promise.resolve(o(n))}}async handleAutomaticTaskPolling(e,r,n){if(!n.taskStore)throw new Error("No task store provided for task-capable tool.");let i=await this.validateToolInput(e,r.params.arguments,r.params.name),a=e.handler,o={...n,taskStore:n.taskStore},s=i?await Promise.resolve(a.createTask(i,o)):await Promise.resolve(a.createTask(o)),c=s.task.taskId,l=s.task,u=l.pollInterval??5e3;for(;l.status!=="completed"&&l.status!=="failed"&&l.status!=="cancelled";){await new Promise(d=>setTimeout(d,u));let p=await n.taskStore.getTask(c);if(!p)throw new q(U.InternalError,`Task ${c} not found during polling`);l=p}return await n.taskStore.getTaskResult(c)}setCompletionRequestHandler(){this._completionHandlerInitialized||(this.server.assertCanSetRequestHandler(Jn(wl)),this.server.registerCapabilities({completions:{}}),this.server.setRequestHandler(wl,async e=>{switch(e.params.ref.type){case"ref/prompt":return u1(e),this.handlePromptCompletion(e,e.params.ref);case"ref/resource":return p1(e),this.handleResourceCompletion(e,e.params.ref);default:throw new q(U.InvalidParams,`Invalid completion reference: ${e.params.ref}`)}}),this._completionHandlerInitialized=!0)}async handlePromptCompletion(e,r){let n=this._registeredPrompts[r.name];if(!n)throw new q(U.InvalidParams,`Prompt ${r.name} not found`);if(!n.enabled)throw new q(U.InvalidParams,`Prompt ${r.name} disabled`);if(!n.argsSchema)return _c;let a=Dn(n.argsSchema)?.[e.params.argument.name];if(!Iv(a))return _c;let o=eP(a);if(!o)return _c;let s=await o(e.params.argument.value,e.params.context);return rP(s)}async handleResourceCompletion(e,r){let n=Object.values(this._registeredResourceTemplates).find(o=>o.resourceTemplate.uriTemplate.toString()===r.uri);if(!n){if(this._registeredResources[r.uri])return _c;throw new q(U.InvalidParams,`Resource template ${e.params.ref.uri} not found`)}let i=n.resourceTemplate.completeCallback(e.params.argument.name);if(!i)return _c;let a=await i(e.params.argument.value,e.params.context);return rP(a)}setResourceRequestHandlers(){this._resourceHandlersInitialized||(this.server.assertCanSetRequestHandler(Jn(ml)),this.server.assertCanSetRequestHandler(Jn(hl)),this.server.assertCanSetRequestHandler(Jn(gl)),this.server.registerCapabilities({resources:{listChanged:!0}}),this.server.setRequestHandler(ml,async(e,r)=>{let n=Object.entries(this._registeredResources).filter(([a,o])=>o.enabled).map(([a,o])=>({uri:a,name:o.name,...o.metadata})),i=[];for(let a of Object.values(this._registeredResourceTemplates)){if(!a.resourceTemplate.listCallback)continue;let o=await a.resourceTemplate.listCallback(r);for(let s of o.resources)i.push({...a.metadata,...s})}return{resources:[...n,...i]}}),this.server.setRequestHandler(hl,async()=>({resourceTemplates:Object.entries(this._registeredResourceTemplates).map(([r,n])=>({name:r,uriTemplate:n.resourceTemplate.uriTemplate.toString(),...n.metadata}))})),this.server.setRequestHandler(gl,async(e,r)=>{let n=new URL(e.params.uri),i=this._registeredResources[n.toString()];if(i){if(!i.enabled)throw new q(U.InvalidParams,`Resource ${n} disabled`);return i.readCallback(n,r)}for(let a of Object.values(this._registeredResourceTemplates)){let o=a.resourceTemplate.uriTemplate.match(n.toString());if(o)return a.readCallback(n,o,r)}throw new q(U.InvalidParams,`Resource ${n} not found`)}),this._resourceHandlersInitialized=!0)}setPromptRequestHandlers(){this._promptHandlersInitialized||(this.server.assertCanSetRequestHandler(Jn(yl)),this.server.assertCanSetRequestHandler(Jn(bl)),this.server.registerCapabilities({prompts:{listChanged:!0}}),this.server.setRequestHandler(yl,()=>({prompts:Object.entries(this._registeredPrompts).filter(([,e])=>e.enabled).map(([e,r])=>({name:e,title:r.title,description:r.description,arguments:r.argsSchema?dH(r.argsSchema):void 0}))})),this.server.setRequestHandler(bl,async(e,r)=>{let n=this._registeredPrompts[e.params.name];if(!n)throw new q(U.InvalidParams,`Prompt ${e.params.name} not found`);if(!n.enabled)throw new q(U.InvalidParams,`Prompt ${e.params.name} disabled`);if(n.argsSchema){let i=Xa(n.argsSchema),a=await Xu(i,e.params.arguments);if(!a.success){let c="error"in a?a.error:"Unknown error",l=Qu(c);throw new q(U.InvalidParams,`Invalid arguments for prompt ${e.params.name}: ${l}`)}let o=a.data,s=n.callback;return await Promise.resolve(s(o,r))}else{let i=n.callback;return await Promise.resolve(i(r))}}),this._promptHandlersInitialized=!0)}resource(e,r,...n){let i;typeof n[0]=="object"&&(i=n.shift());let a=n[0];if(typeof r=="string"){if(this._registeredResources[r])throw new Error(`Resource ${r} is already registered`);let o=this._createRegisteredResource(e,void 0,r,i,a);return this.setResourceRequestHandlers(),this.sendResourceListChanged(),o}else{if(this._registeredResourceTemplates[e])throw new Error(`Resource template ${e} is already registered`);let o=this._createRegisteredResourceTemplate(e,void 0,r,i,a);return this.setResourceRequestHandlers(),this.sendResourceListChanged(),o}}registerResource(e,r,n,i){if(typeof r=="string"){if(this._registeredResources[r])throw new Error(`Resource ${r} is already registered`);let a=this._createRegisteredResource(e,n.title,r,n,i);return this.setResourceRequestHandlers(),this.sendResourceListChanged(),a}else{if(this._registeredResourceTemplates[e])throw new Error(`Resource template ${e} is already registered`);let a=this._createRegisteredResourceTemplate(e,n.title,r,n,i);return this.setResourceRequestHandlers(),this.sendResourceListChanged(),a}}_createRegisteredResource(e,r,n,i,a){let o={name:e,title:r,metadata:i,readCallback:a,enabled:!0,disable:()=>o.update({enabled:!1}),enable:()=>o.update({enabled:!0}),remove:()=>o.update({uri:null}),update:s=>{typeof s.uri<"u"&&s.uri!==n&&(delete this._registeredResources[n],s.uri&&(this._registeredResources[s.uri]=o)),typeof s.name<"u"&&(o.name=s.name),typeof s.title<"u"&&(o.title=s.title),typeof s.metadata<"u"&&(o.metadata=s.metadata),typeof s.callback<"u"&&(o.readCallback=s.callback),typeof s.enabled<"u"&&(o.enabled=s.enabled),this.sendResourceListChanged()}};return this._registeredResources[n]=o,o}_createRegisteredResourceTemplate(e,r,n,i,a){let o={resourceTemplate:n,title:r,metadata:i,readCallback:a,enabled:!0,disable:()=>o.update({enabled:!1}),enable:()=>o.update({enabled:!0}),remove:()=>o.update({name:null}),update:l=>{typeof l.name<"u"&&l.name!==e&&(delete this._registeredResourceTemplates[e],l.name&&(this._registeredResourceTemplates[l.name]=o)),typeof l.title<"u"&&(o.title=l.title),typeof l.template<"u"&&(o.resourceTemplate=l.template),typeof l.metadata<"u"&&(o.metadata=l.metadata),typeof l.callback<"u"&&(o.readCallback=l.callback),typeof l.enabled<"u"&&(o.enabled=l.enabled),this.sendResourceListChanged()}};this._registeredResourceTemplates[e]=o;let s=n.uriTemplate.variableNames;return Array.isArray(s)&&s.some(l=>!!n.completeCallback(l))&&this.setCompletionRequestHandler(),o}_createRegisteredPrompt(e,r,n,i,a){let o={title:r,description:n,argsSchema:i===void 0?void 0:ji(i),callback:a,enabled:!0,disable:()=>o.update({enabled:!1}),enable:()=>o.update({enabled:!0}),remove:()=>o.update({name:null}),update:s=>{typeof s.name<"u"&&s.name!==e&&(delete this._registeredPrompts[e],s.name&&(this._registeredPrompts[s.name]=o)),typeof s.title<"u"&&(o.title=s.title),typeof s.description<"u"&&(o.description=s.description),typeof s.argsSchema<"u"&&(o.argsSchema=ji(s.argsSchema)),typeof s.callback<"u"&&(o.callback=s.callback),typeof s.enabled<"u"&&(o.enabled=s.enabled),this.sendPromptListChanged()}};return this._registeredPrompts[e]=o,i&&Object.values(i).some(c=>{let l=c instanceof jt?c._def?.innerType:c;return Iv(l)})&&this.setCompletionRequestHandler(),o}_createRegisteredTool(e,r,n,i,a,o,s,c,l){Rv(e);let u={title:r,description:n,inputSchema:tP(i),outputSchema:tP(a),annotations:o,execution:s,_meta:c,handler:l,enabled:!0,disable:()=>u.update({enabled:!1}),enable:()=>u.update({enabled:!0}),remove:()=>u.update({name:null}),update:p=>{typeof p.name<"u"&&p.name!==e&&(typeof p.name=="string"&&Rv(p.name),delete this._registeredTools[e],p.name&&(this._registeredTools[p.name]=u)),typeof p.title<"u"&&(u.title=p.title),typeof p.description<"u"&&(u.description=p.description),typeof p.paramsSchema<"u"&&(u.inputSchema=ji(p.paramsSchema)),typeof p.outputSchema<"u"&&(u.outputSchema=ji(p.outputSchema)),typeof p.callback<"u"&&(u.handler=p.callback),typeof p.annotations<"u"&&(u.annotations=p.annotations),typeof p._meta<"u"&&(u._meta=p._meta),typeof p.enabled<"u"&&(u.enabled=p.enabled),this.sendToolListChanged()}};return this._registeredTools[e]=u,this.setToolRequestHandlers(),this.sendToolListChanged(),u}tool(e,...r){if(this._registeredTools[e])throw new Error(`Tool ${e} is already registered`);let n,i,a,o;if(typeof r[0]=="string"&&(n=r.shift()),r.length>1){let c=r[0];if(Ov(c))i=r.shift(),r.length>1&&typeof r[0]=="object"&&r[0]!==null&&!Ov(r[0])&&(o=r.shift());else if(typeof c=="object"&&c!==null){if(Object.values(c).some(l=>typeof l=="object"&&l!==null))throw new Error(`Tool ${e} expected a Zod schema or ToolAnnotations, but received an unrecognized object`);o=r.shift()}}let s=r[0];return this._createRegisteredTool(e,void 0,n,i,a,o,{taskSupport:"forbidden"},void 0,s)}registerTool(e,r,n){if(this._registeredTools[e])throw new Error(`Tool ${e} is already registered`);let{title:i,description:a,inputSchema:o,outputSchema:s,annotations:c,_meta:l}=r;return this._createRegisteredTool(e,i,a,o,s,c,{taskSupport:"forbidden"},l,n)}prompt(e,...r){if(this._registeredPrompts[e])throw new Error(`Prompt ${e} is already registered`);let n;typeof r[0]=="string"&&(n=r.shift());let i;r.length>1&&(i=r.shift());let a=r[0],o=this._createRegisteredPrompt(e,void 0,n,i,a);return this.setPromptRequestHandlers(),this.sendPromptListChanged(),o}registerPrompt(e,r,n){if(this._registeredPrompts[e])throw new Error(`Prompt ${e} is already registered`);let{title:i,description:a,argsSchema:o}=r,s=this._createRegisteredPrompt(e,i,a,o,n);return this.setPromptRequestHandlers(),this.sendPromptListChanged(),s}isConnected(){return this.server.transport!==void 0}async sendLoggingMessage(e,r){return this.server.sendLoggingMessage(e,r)}sendResourceListChanged(){this.isConnected()&&this.server.sendResourceListChanged()}sendToolListChanged(){this.isConnected()&&this.server.sendToolListChanged()}sendPromptListChanged(){this.isConnected()&&this.server.sendPromptListChanged()}},Jp=class{constructor(e,r){this._callbacks=r,this._uriTemplate=typeof e=="string"?new Bp(e):e}get uriTemplate(){return this._uriTemplate}get listCallback(){return this._callbacks.list}completeCallback(e){return this._callbacks.complete?.[e]}},pH={type:"object",properties:{}};function nP(t){return t!==null&&typeof t=="object"&&"parse"in t&&typeof t.parse=="function"&&"safeParse"in t&&typeof t.safeParse=="function"}function iP(t){return"_def"in t||"_zod"in t||nP(t)}function Ov(t){return typeof t!="object"||t===null||iP(t)?!1:Object.keys(t).length===0?!0:Object.values(t).some(nP)}function tP(t){if(t){if(Ov(t))return ji(t);if(!iP(t))throw new Error("inputSchema must be a Zod schema or raw shape, received an unrecognized object");return t}}function dH(t){let e=Dn(t);return e?Object.entries(e).map(([r,n])=>{let i=CC(n),a=AC(n);return{name:r,description:i,required:!a}}):[]}function Jn(t){let r=Dn(t)?.method;if(!r)throw new Error("Schema is missing a method literal");let n=Yu(r);if(typeof n=="string")return n;throw new Error("Schema method literal must be a string")}function rP(t){return{completion:{values:t.slice(0,100),total:t.length,hasMore:t.length>100}}}var _c={completion:{values:[],hasMore:!1}};var Qe=We(require("node:crypto"),1),xt=We(require("node:fs"),1),Ye=We(require("node:path"),1);var Kp={gutter:0,mask:!1,drag:!1,left:!1,hover:!1,shadow:!0,link:!0,watermark:!1,mobile:!1,dark:!1,autoRefresh:0,lastRefreshTime:"",watermarkStyle:{content:"Microi",font:{fontSize:16,color:"rgba(255, 0, 0, 0.15)"},rotate:-22},dynamicStyle:{padding:"10px",backgroundColor:"",opacity:1}};function ne(t){return t&&typeof t=="object"&&!Array.isArray(t)?t:{}}var fH=new Set(["true","false","axis","item","none","vertical","horizontal"]);function mH(t){if(typeof t!="string")return"";let e=t.trim();return e?fH.has(e.toLowerCase())?"":e:""}function bo(t){if(t==null||t==="")return{ok:!1,error:"JSON value is empty."};if(typeof t!="string")return{ok:!0,value:t};try{return{ok:!0,value:JSON.parse(t)}}catch(e){return{ok:!1,error:e instanceof Error?e.message:String(e)}}}function aP(t,e){return{...t,...ne(e)}}function Wp(){return Math.floor(Math.random()*8e4+1e4)}function hH(t){let e=Math.random().toString(36).slice(2,8);return`page_${t.replace(/[^\w\u4e00-\u9fa5]+/g,"_").replace(/^_+|_+$/g,"").slice(0,24)||"ai"}_${e}`}function M(t,e,r,n,i){let a={sort:t,label:e,type:r,value:n};return i&&(a.typeOptions=i),a}var gH=[{label:"\u672C\u65E5",value:"today"},{label:"\u672C\u5468",value:"week"},{label:"\u672C\u6708",value:"month"},{label:"\u672C\u5B63",value:"quarter"},{label:"\u672C\u5E74",value:"year"},{label:"\u53BB\u5E74",value:"lastYear"}];function yH(){return{prop:"period",label:"\u7EDF\u8BA1\u5468\u671F",type:"select",value:"month",defaultValue:"month",remote:!1,options:gH.map(t=>({...t}))}}function Xi(t){let e=Array.isArray(t)?t.map(n=>ne(n)).filter(n=>Object.keys(n).length):[];return e.some(n=>n.prop==="period"||n.prop==="_period")?e:[yH(),...e]}function cP(t){return{...t,searchData:Xi(t.searchData)}}function bH(t,e){let r={statistic:[18,19],progress:[26,27],bar:[1,16],line:[1,16],linebar:[1,18],pie:[1,19],funnel:[1,13],tabel:[1,13]};for(let n of r[t]??[]){let i=ne(e[n]);Object.keys(i).length&&(i.value=!0,e[n]=i)}}function Mv(t,e){if(typeof t=="number"&&Number.isFinite(t))return t;if(typeof t=="string"){let r=Number.parseFloat(t);if(Number.isFinite(r))return r}return e}function oP(t,e,r){return Mv(ne(t[e]).value,r)}function Hp(t,e){return ne(t[e]).value===!0}function vH(t){let e=Array.isArray(t.widgetParams)?t.widgetParams:[],r=ne(e[0]),n=ne(r.typeOptions).dataJson;if(Array.isArray(n))return n.length;let i=ne(n);return Array.isArray(i.data)?i.data.length:Array.isArray(i.bodyData)?i.bodyData.length:0}function xH(t){let e=Hn(t,"type"),r=Array.isArray(t.widgetParams)?t.widgetParams:[],n=vH(t);if(e==="statistic"){let i=Math.min(24,Math.max(1,oP(r,1,6))),a=Math.max(1,Math.floor(24/i)),o=Math.max(1,Math.ceil(Math.max(n,1)/a)),s=Hp(r,18)||Hp(r,19)?44:0;return Math.max(190,s+o*88+18)}if(e==="progress"){let i=Math.min(24,Math.max(1,oP(r,1,12))),a=Math.max(1,Math.floor(24/i)),o=Math.max(1,Math.ceil(Math.max(n,1)/a)),s=Hp(r,26)||Hp(r,27)?44:0;return Math.max(180,s+o*108+24)}return 0}function wH(t,e,r){let n=xH(t);if(!n)return 0;let i=ne(t.widgetOption);return Mv(i.height,0)<n&&(i.height=n,t.widgetOption=i,r.push(`${e}.widgetOption.height was raised to ${n} so content widgets do not clip when rendered.`)),n}function _H(t,e,r){return{number:Wp(),wrapperNumber:t,span:e,offset:0,push:0,pull:0,height:r,marginTop:0,dynamicStyle:{padding:"8px",backgroundColor:""}}}function SH(t,e){return[M(0,"Data source","textarea","",{rows:3,dataJson:{data:t,searchData:Xi([])}}),M(1,"Grid width","slider",6,{min:1,max:24,step:1}),M(2,"Background","color",""),M(3,"Gap","input","5px"),M(4,"Block colors","input","#2563eb,#16a34a,#f59e0b,#dc2626,#7c3aed,#0891b2"),M(5,"Padding","input","18px"),M(6,"Radius","input","8px"),M(7,"Title size","input","13px"),M(8,"Title weight","input","500"),M(9,"Title color","color",e?"#dbeafe":"#ffffff"),M(10,"Title margin","input","0 0 10px 0"),M(11,"Value size","input","22px"),M(12,"Value weight","input","700"),M(13,"Value color","color","#ffffff"),M(14,"Icon position","radio","suffix"),M(15,"Icon color","color","#ffffff"),M(16,"Icon size","input","18px"),M(17,"Background image","input",""),M(18,"Show search","switch",!0),M(19,"Date filter","switch",!0),M(20,"Precision","number",0),M(21,"Value padding","input","0"),M(22,"Value margin","input","0"),M(23,"Icon margin","input","0")]}function Nv(t,e,r,n=""){let i=cP(e);return t==="pie"?[M(0,"Data source","textarea","",{rows:3,dataJson:i}),M(1,"Show search","switch",!0),M(2,"Inner radius","number",36),M(3,"Outer radius","number",92),M(4,"Unit","input",n),M(5,"Title","input",r),M(6,"Subtitle","input",""),M(7,"Show legend","switch",!0),M(8,"Legend orient","select","vertical"),M(9,"Legend position","select","left"),M(10,"Tooltip","switch",!0),M(11,"Trigger","select","item"),M(12,"Toolbox","switch",!1),M(13,"Show label","switch",!0),M(14,"Label position","select","outside"),M(15,"Border radius","number",8),M(16,"Border width","number",2),M(17,"Pad angle","number",2),M(18,"Nightingale","switch",!1),M(19,"Date filter","switch",!0),M(20,"Label format","input","{d}%")]:[M(0,"Data source","textarea","",{rows:3,dataJson:i}),M(1,"Show search","switch",!0),M(2,"Boundary gap","switch",t==="bar"),M(3,"Bar effect","select","shadow"),M(4,"Unit","input",n),M(5,"Title","input",r),M(6,"Subtitle","input",""),M(7,"Show legend","switch",!0),M(8,"Legend orient","select","horizontal"),M(9,"Legend position","select","center"),M(10,"Tooltip","switch",!0),M(11,"Trigger","select","axis"),M(12,"Toolbox","switch",!1),M(13,"Show label","switch",t==="bar"),M(14,"Label position","select","outside"),M(15,"Split line","switch",!0),M(16,"Date filter","switch",!0),M(17,"Rotate","switch",!1)]}function EH(t){return[M(0,"Data source","textarea","",{rows:3,dataJson:cP(t)}),M(1,"Show search","switch",!0),M(2,"Stripe","switch",!0),M(3,"Border","switch",!0),M(4,"Size","select","small"),M(5,"Progress width","number",16),M(6,"Merge column","input",""),M(7,"Page size","number",-1),M(8,"Summary","switch",!1),M(9,"Border color","color","var(--el-border-color-lighter)"),M(10,"Header background","color","var(--el-fill-color-light)"),M(11,"Header color","color","var(--el-table-header-text-color)"),M(12,"Text color","color","var(--el-table-text-color)"),M(13,"Date filter","switch",!0),M(14,"Pie width","number",30),M(15,"Pie background","color","#409eff50"),M(16,"Pie border","color","#409eff")]}function go(t,e,r,n,i,a){return{type:t,label:e,category:0,show:1,icon:"",img:"",widgetOption:_H(r,n,i),widgetParams:a}}function yo(t,e,r,n,i){let a=Wp();return{type:"pannel",label:"Card",hidden:!1,icon:"",img:"",wrapperOption:{number:a,gutter:0,span:e,offset:0,push:0,pull:0,height:r,marginTop:0,margin:"0px 10px 10px 0px",pannelColor:i?"#111827":"#ffffff",dynamicStyle:{padding:"12px",backgroundColor:i?"#111827":"#ffffff"},titleOption:{hidden:!0,title:t,dynamicStyle:{textAlign:"left",padding:"0px",height:"22px",lineHeight:"22px",fontSize:"14px",color:i?"#e5e7eb":"#111827"},moreOption:{hidden:!1,icon:"More",iconShow:!1,text:"More",linkurl:"/",linktype:"router",refresh:"0",datetime:"0",autotime:!1,autotimeval:1,dynamicStyle:{color:i?"#93c5fd":"#2563eb",fontSize:"12px"}}}},widgetList:n(a)}}function Dv(t,e){let r=`${t} ${e||""}`.toLowerCase();return/维保|维修|设备|工单|巡检|maintenance|service|ticket|asset/.test(r)?"maintenance":/商城|商品|库存|订单|门店|mall|shop|ecommerce|retail|sku/.test(r)?"mall":/财务|发票|收款|付款|finance|invoice|payment/.test(r)?"finance":/销售|客户|商机|营收|sales|customer|crm|revenue/.test(r)?"sales":"operations"}function lP(t){return t==="maintenance"?{title:"\u7EF4\u4FDD\u8FD0\u8425\u9A7E\u9A76\u8231",subtitle:"\u5DE5\u5355\u3001\u8BBE\u5907\u3001\u5DE1\u68C0\u4E0E\u5BA2\u6237\u670D\u52A1\u72B6\u6001\u603B\u89C8",stats:[{name:"\u4ECA\u65E5\u5DE5\u5355",value:86,icon:"Tickets",bgColor:"#2563eb",bgImage:"",linkUrl:"/"},{name:"\u5F85\u6D3E\u5355",value:14,icon:"Clock",bgColor:"#f59e0b",bgImage:"",linkUrl:"/"},{name:"\u6309\u65F6\u5B8C\u6210\u7387",value:96,icon:"Top",bgColor:"#16a34a",bgImage:"",linkUrl:"/"},{name:"\u9AD8\u98CE\u9669\u8BBE\u5907",value:7,icon:"Warning",bgColor:"#dc2626",bgImage:"",linkUrl:"/"}],xAxis:["\u5468\u4E00","\u5468\u4E8C","\u5468\u4E09","\u5468\u56DB","\u5468\u4E94","\u5468\u516D","\u5468\u65E5"],barSeries:[{name:"\u65B0\u589E\u5DE5\u5355",data:[18,22,16,28,31,20,14]},{name:"\u5B8C\u6210\u5DE5\u5355",data:[15,20,18,24,29,21,16]}],lineSeries:[{name:"\u54CD\u5E94\u65F6\u957F(\u5206\u949F)",data:[42,38,35,33,31,29,28]},{name:"\u6EE1\u610F\u5EA6",data:[92,93,94,94,95,96,96]}],pieData:[{name:"\u5F85\u63A5\u5355",value:14},{name:"\u5904\u7406\u4E2D",value:28},{name:"\u5F85\u9A8C\u6536",value:17},{name:"\u5DF2\u5B8C\u6210",value:63}],tableHeaders:[{prop:"WorkOrderNo",label:"\u5DE5\u5355\u53F7",align:"center"},{prop:"CustomerName",label:"\u5BA2\u6237",align:"center"},{prop:"DeviceName",label:"\u8BBE\u5907",align:"center"},{prop:"Status",label:"\u72B6\u6001",align:"center",status_ui:!0},{prop:"Owner",label:"\u8D1F\u8D23\u4EBA",align:"center"}],tableRows:[{WorkOrderNo:"WO-20260611-001",CustomerName:"\u5229\u8F69\u79D1\u6280\u56ED",DeviceName:"\u7A7A\u538B\u673A A01",Status:"\u5904\u7406\u4E2D",Owner:"\u5F20\u5DE5",status_ui:"warning"},{WorkOrderNo:"WO-20260611-002",CustomerName:"\u661F\u6CB3\u5DE5\u5382",DeviceName:"\u51B7\u5374\u5854 C03",Status:"\u5F85\u9A8C\u6536",Owner:"\u674E\u5DE5",status_ui:"primary"},{WorkOrderNo:"WO-20260611-003",CustomerName:"\u5317\u57CE\u4ED3\u50A8",DeviceName:"\u914D\u7535\u67DC P12",Status:"\u5DF2\u5B8C\u6210",Owner:"\u738B\u5DE5",status_ui:"success"}]}:t==="mall"?{title:"\u5546\u57CE\u7ECF\u8425\u770B\u677F",subtitle:"\u8BA2\u5355\u3001\u5546\u54C1\u3001\u5E93\u5B58\u4E0E\u4F1A\u5458\u589E\u957F\u6982\u89C8",stats:[{name:"\u4ECA\u65E5\u8BA2\u5355",value:328,icon:"ShoppingCart",bgColor:"#2563eb",bgImage:"",linkUrl:"/"},{name:"\u9500\u552E\u989D",value:128900,icon:"Money",bgColor:"#16a34a",bgImage:"",linkUrl:"/"},{name:"\u4F4E\u5E93\u5B58 SKU",value:23,icon:"Warning",bgColor:"#f59e0b",bgImage:"",linkUrl:"/"},{name:"\u65B0\u589E\u4F1A\u5458",value:78,icon:"User",bgColor:"#7c3aed",bgImage:"",linkUrl:"/"}],xAxis:["1\u6708","2\u6708","3\u6708","4\u6708","5\u6708","6\u6708"],barSeries:[{name:"\u8BA2\u5355\u6570",data:[1200,1420,1380,1680,1910,2250]},{name:"\u53D1\u8D27\u6570",data:[1160,1390,1350,1610,1880,2190]}],lineSeries:[{name:"\u9500\u552E\u989D",data:[82,96,91,116,132,158]},{name:"\u590D\u8D2D\u7387",data:[28,31,30,34,36,39]}],pieData:[{name:"\u98DF\u54C1\u996E\u6599",value:35},{name:"\u5BB6\u6E05\u65E5\u5316",value:24},{name:"\u6570\u7801\u5BB6\u7535",value:18},{name:"\u670D\u9970\u978B\u5305",value:23}],tableHeaders:[{prop:"SkuName",label:"\u5546\u54C1",align:"center"},{prop:"Stock",label:"\u5E93\u5B58",align:"center"},{prop:"Sales",label:"\u9500\u91CF",align:"center"},{prop:"Status",label:"\u72B6\u6001",align:"center",status_ui:!0}],tableRows:[{SkuName:"\u8F7B\u98DF\u71D5\u9EA6\u7EC4\u5408",Stock:128,Sales:486,Status:"\u70ED\u9500",status_ui:"success"},{SkuName:"\u65E0\u7EBF\u8033\u673A Pro",Stock:18,Sales:221,Status:"\u4F4E\u5E93\u5B58",status_ui:"warning"},{SkuName:"\u667A\u80FD\u6C34\u676F",Stock:76,Sales:164,Status:"\u6B63\u5E38",status_ui:"primary"}]}:{title:t==="sales"?"\u9500\u552E\u8FD0\u8425\u4EEA\u8868\u76D8":t==="finance"?"\u8D22\u52A1\u6536\u4ED8\u6B3E\u770B\u677F":"\u7EFC\u5408\u8FD0\u8425\u9A7E\u9A76\u8231",subtitle:"\u6838\u5FC3\u6307\u6807\u3001\u8D8B\u52BF\u5206\u6790\u3001\u7ED3\u6784\u5206\u5E03\u4E0E\u660E\u7EC6\u5217\u8868",stats:[{name:"\u672C\u6708\u76EE\u6807",value:128,icon:"Aim",bgColor:"#2563eb",bgImage:"",linkUrl:"/"},{name:"\u5DF2\u5B8C\u6210",value:96,icon:"Top",bgColor:"#16a34a",bgImage:"",linkUrl:"/"},{name:"\u5F85\u5904\u7406",value:18,icon:"Clock",bgColor:"#f59e0b",bgImage:"",linkUrl:"/"},{name:"\u98CE\u9669\u9879",value:6,icon:"Warning",bgColor:"#dc2626",bgImage:"",linkUrl:"/"}],xAxis:["1\u6708","2\u6708","3\u6708","4\u6708","5\u6708","6\u6708"],barSeries:[{name:"\u8BA1\u5212",data:[80,92,100,116,124,138]},{name:"\u5B9E\u9645",data:[76,88,96,110,129,146]}],lineSeries:[{name:"\u589E\u957F\u7387",data:[8,12,10,16,18,21]},{name:"\u8FBE\u6210\u7387",data:[88,91,93,94,96,98]}],pieData:[{name:"A \u7C7B",value:42},{name:"B \u7C7B",value:28},{name:"C \u7C7B",value:18},{name:"\u5176\u4ED6",value:12}],tableHeaders:[{prop:"Name",label:"\u540D\u79F0",align:"center"},{prop:"Owner",label:"\u8D1F\u8D23\u4EBA",align:"center"},{prop:"Progress",label:"\u8FDB\u5EA6",align:"center",progress_ui:!0},{prop:"Status",label:"\u72B6\u6001",align:"center",status_ui:!0}],tableRows:[{Name:"\u91CD\u70B9\u9879\u76EE A",Owner:"\u9648\u6668",Progress:92,Status:"\u8FDB\u884C\u4E2D",progress_ui:"success",status_ui:"success"},{Name:"\u5BA2\u6237\u8DDF\u8FDB B",Owner:"\u6797\u66E6",Progress:68,Status:"\u5F85\u63A8\u8FDB",progress_ui:"warning",status_ui:"warning"},{Name:"\u98CE\u9669\u6574\u6539 C",Owner:"\u8D75\u5B81",Progress:35,Status:"\u9884\u8B66",progress_ui:"exception",status_ui:"danger"}]}}function kH(t){let e=t.prompt||"",r=Dv(e,t.theme),n=/dark|深色|黑色|大屏|驾驶舱/.test(`${e} ${t.style||""}`.toLowerCase()),i=lP(r),a=t.title||i.title,o=t.desc||i.subtitle;return{formConfig:{...Kp,dark:n,title:a,dynamicStyle:{padding:"12px 0 0 0",backgroundColor:n?"#0f172a":"#f3f4f6",opacity:1}},wrapperList:[yo(a,24,120,c=>[go("workbench","Workbench",c,24,90,[M(0,"Data source","textarea","",{rows:3,dataJson:{icon:"",title:a,subTitle:o}})])],n),yo("\u6838\u5FC3\u6307\u6807",24,220,c=>[go("statistic","Statistic",c,24,190,SH(i.stats,n))],n),yo("\u8D8B\u52BF\u5206\u6790",12,340,c=>[go("bar","Bar Chart",c,24,300,Nv("bar",{xAxis:i.xAxis,series:i.barSeries,searchData:[]},"\u4E1A\u52A1\u8D8B\u52BF",""))],n),yo("\u7ED3\u6784\u5360\u6BD4",12,340,c=>[go("pie","Pie Chart",c,24,300,Nv("pie",{data:i.pieData,searchData:[]},"\u5206\u7C7B\u5360\u6BD4",""))],n),yo("\u6548\u7387\u8D70\u52BF",12,340,c=>[go("line","Line Chart",c,24,300,Nv("line",{xAxis:i.xAxis,series:i.lineSeries,searchData:[]},"\u6548\u7387\u8D70\u52BF",""))],n),yo("\u91CD\u70B9\u660E\u7EC6",12,340,c=>[go("tabel","Table",c,24,300,EH({headerData:i.tableHeaders,bodyData:i.tableRows,total:i.tableRows.length,searchData:[]}))],n)]}}function Xe(t,e,r,n,i,a={}){return{options:{left:t,top:e,width:r,height:n,title:i,fontSize:9,lineHeight:n,...a},printElementType:{title:"Text",type:"text"}}}function sP(t,e,r){return{options:{left:t,top:e,width:r,height:1,borderStyle:"solid"},printElementType:{title:"Line",type:"hline"}}}function TH(t,e,r,n){return{options:{left:t,top:e,width:r,height:n,borderWidth:1},printElementType:{title:"Rect",type:"rect"}}}function CH(t){return Dv(t)}function AH(t){let e=CH(t.prompt||""),r=t.title||(e==="maintenance"?"\u7EF4\u4FDD\u5DE5\u5355\u6253\u5370\u6A21\u677F":e==="mall"?"\u5546\u57CE\u8BA2\u5355\u6253\u5370\u6A21\u677F":"\u4E1A\u52A1\u5355\u636E\u6253\u5370\u6A21\u677F"),n=e==="maintenance"?"Items":"Details",i=e==="maintenance"?[[{title:"\u9879\u76EE",field:"ItemName",width:120,checked:!0},{title:"\u5904\u7406\u7ED3\u679C",field:"Result",width:180,checked:!0},{title:"\u5DE5\u65F6",field:"Hours",width:80,checked:!0},{title:"\u5907\u6CE8",field:"Remark",width:150,checked:!0}]]:[[{title:"\u540D\u79F0",field:"Name",width:150,checked:!0},{title:"\u89C4\u683C",field:"Spec",width:120,checked:!0},{title:"\u6570\u91CF",field:"Qty",width:80,checked:!0},{title:"\u91D1\u989D",field:"Amount",width:100,checked:!0},{title:"\u5907\u6CE8",field:"Remark",width:120,checked:!0}]],a=e==="maintenance"?{WorkOrderNo:"WO-20260611-001",CustomerName:"\u5229\u8F69\u79D1\u6280\u56ED",ContactName:"\u738B\u7ECF\u7406",DeviceName:"\u7A7A\u538B\u673A A01",ServiceDate:"2026-06-11",EngineerName:"\u5F20\u5DE5",FaultDesc:"\u8BBE\u5907\u8FD0\u884C\u5F02\u54CD\uFF0C\u538B\u529B\u6CE2\u52A8\u5F02\u5E38\u3002",Solution:"\u5B8C\u6210\u8F74\u627F\u68C0\u67E5\u3001\u7BA1\u8DEF\u7D27\u56FA\u4E0E\u8FD0\u884C\u6D4B\u8BD5\u3002",Items:[{ItemName:"\u73B0\u573A\u68C0\u67E5",Result:"\u5DF2\u5B8C\u6210",Hours:1.5,Remark:"\u8FD0\u884C\u8BB0\u5F55\u6B63\u5E38"},{ItemName:"\u90E8\u4EF6\u7EF4\u62A4",Result:"\u5DF2\u5B8C\u6210",Hours:2,Remark:"\u66F4\u6362\u6613\u635F\u4EF6"}]}:{BillNo:"BILL-20260611-001",CustomerName:"\u793A\u4F8B\u5BA2\u6237",ContactName:"\u674E\u7ECF\u7406",BillDate:"2026-06-11",OwnerName:"\u9648\u6668",Summary:"\u4E1A\u52A1\u5355\u636E\u6458\u8981\u8BF4\u660E\u3002",Details:[{Name:"\u670D\u52A1\u9879\u76EE A",Spec:"\u6807\u51C6",Qty:2,Amount:1200,Remark:"\u542B\u7A0E"},{Name:"\u670D\u52A1\u9879\u76EE B",Spec:"\u9AD8\u7EA7",Qty:1,Amount:2800,Remark:"\u542B\u5B89\u88C5"}]},o=[Xe(40,18,520,24,r,{fontSize:18,fontWeight:"700",textAlign:"center",lineHeight:24}),sP(36,50,535),Xe(42,66,76,16,e==="maintenance"?"\u5DE5\u5355\u53F7":"\u5355\u636E\u53F7",{fontWeight:"600"}),Xe(118,66,160,16,"",{field:e==="maintenance"?"WorkOrderNo":"BillNo",testData:e==="maintenance"?a.WorkOrderNo:a.BillNo}),Xe(320,66,76,16,"\u65E5\u671F",{fontWeight:"600"}),Xe(396,66,160,16,"",{field:e==="maintenance"?"ServiceDate":"BillDate",testData:e==="maintenance"?a.ServiceDate:a.BillDate}),Xe(42,92,76,16,"\u5BA2\u6237",{fontWeight:"600"}),Xe(118,92,160,16,"",{field:"CustomerName",testData:a.CustomerName}),Xe(320,92,76,16,"\u8054\u7CFB\u4EBA",{fontWeight:"600"}),Xe(396,92,160,16,"",{field:"ContactName",testData:a.ContactName}),Xe(42,118,76,16,e==="maintenance"?"\u8BBE\u5907":"\u8D1F\u8D23\u4EBA",{fontWeight:"600"}),Xe(118,118,160,16,"",{field:e==="maintenance"?"DeviceName":"OwnerName",testData:e==="maintenance"?a.DeviceName:a.OwnerName}),Xe(320,118,76,16,e==="maintenance"?"\u5DE5\u7A0B\u5E08":"\u5236\u5355\u4EBA",{fontWeight:"600"}),Xe(396,118,160,16,"",{field:e==="maintenance"?"EngineerName":"OwnerName",testData:e==="maintenance"?a.EngineerName:a.OwnerName}),TH(38,150,535,70),Xe(48,160,70,16,e==="maintenance"?"\u6545\u969C\u63CF\u8FF0":"\u6458\u8981",{fontWeight:"600"}),Xe(118,160,430,46,"",{field:e==="maintenance"?"FaultDesc":"Summary",testData:e==="maintenance"?a.FaultDesc:a.Summary,lineHeight:18}),Xe(42,242,160,16,"\u660E\u7EC6",{fontSize:12,fontWeight:"700"}),{options:{left:40,top:266,width:530,height:92,field:n,columns:i,fields:i[0].map(c=>({text:c.title,field:c.field}))},printElementType:{title:"Table",type:"table"}},Xe(42,392,76,16,e==="maintenance"?"\u5904\u7406\u65B9\u6848":"\u5907\u6CE8",{fontWeight:"600"}),Xe(118,392,430,38,"",{field:e==="maintenance"?"Solution":"Summary",testData:e==="maintenance"?a.Solution:a.Summary,lineHeight:18}),sP(36,468,535),Xe(60,492,120,16,"\u5BA2\u6237\u7B7E\u5B57\uFF1A"),Xe(330,492,120,16,"\u7ECF\u529E\u4EBA\u7B7E\u5B57\uFF1A")];return{pageObj:{panels:[{index:0,name:r,paperType:t.paperType||"A4",height:297,width:210,paperHeader:0,paperFooter:841.8897637795277,paperNumberContinue:!0,watermarkOptions:{},panelLayoutOptions:{},printElements:o}]},printObj:a}}function Gi(t){let e=bo(t);if(!e.ok)return t;let r=e.value;if(typeof r=="string"){let a=bo(r);a.ok&&(r=a.value)}let n=ne(r);if(n.JsonObj!==void 0)return Gi(n.JsonObj);if(n.jsonObj!==void 0)return Gi(n.jsonObj);if(n.JsonStr!==void 0)return Gi(n.JsonStr);if(n.jsonStr!==void 0)return Gi(n.jsonStr);let i=ne(n.formData??n.FormData);if(Object.keys(i).length){if(i.JsonObj!==void 0)return Gi(i.JsonObj);if(i.jsonObj!==void 0)return Gi(i.jsonObj);if(i.formConfig!==void 0||i.wrapperList!==void 0)return i}return r}function PH(t,e,r){let n=Hn(t,"type");if(!Array.isArray(t.widgetParams)||t.widgetParams.length===0)return;let i=t.widgetParams,a={bar:[5,6],line:[5,6],linebar:[5,6],pie:[5,6],funnel:[3,4]};for(let l of a[n]??[]){let u=ne(i[l]);if(!Object.keys(u).length||u.value===void 0||u.value==="")continue;let p=mH(u.value);u.value!==p&&(u.value=p,i[l]=u,r.push(`${e}.widgetParams[${l}].value was cleared because it looked like a chart option, not display text.`))}let o=ne(i[0]),s={rows:3,...ne(o.typeOptions)},c=s.dataJson;if(["statistic","pie","funnel","progress"].includes(n))if(Array.isArray(c))s.dataJson={data:c,searchData:Xi([])},r.push(`${e}.widgetParams[0].typeOptions.dataJson array was wrapped as {data, searchData}.`);else{let l=ne(c);s.dataJson={...l,data:Array.isArray(l.data)?l.data:[],searchData:Xi(l.searchData)}}if(["bar","line","linebar"].includes(n)){let l=ne(s.dataJson);s.dataJson={...l,xAxis:Array.isArray(l.xAxis)?l.xAxis:[],series:Array.isArray(l.series)?l.series:[],searchData:Xi(l.searchData)}}if(n==="tabel")if(Array.isArray(c))s.dataJson={headerData:[],bodyData:c,total:c.length,searchData:Xi([])},r.push(`${e}.widgetParams[0].typeOptions.dataJson array was wrapped as table bodyData.`);else{let l=ne(s.dataJson);s.dataJson={...l,headerData:Array.isArray(l.headerData)?l.headerData:[],bodyData:Array.isArray(l.bodyData)?l.bodyData:[],total:typeof l.total=="number"?l.total:Array.isArray(l.bodyData)?l.bodyData.length:0,searchData:Xi(l.searchData)}}bH(n,i),o.typeOptions=s,i[0]=o,t.widgetParams=i}function dn(t){let e=Gi(t),r=bo(e);if(!r.ok)return{ok:!1,errors:[`JsonObj is not valid JSON: ${r.error}`],warnings:[]};let n=ne(r.value),i=[],a=[];Object.keys(n).length||i.push("JsonObj must be an object."),n.formConfig!==void 0&&Object.keys(ne(n.formConfig)).length===0&&a.push("formConfig is empty; defaults were applied."),n.wrapperList!==void 0&&!Array.isArray(n.wrapperList)&&i.push("JsonObj.wrapperList must be an array.");let o=Array.isArray(n.wrapperList)?n.wrapperList.map((c,l)=>{let u=ne(c);Hn(u,"type")||(u.type="pannel"),Hn(u,"label")||(u.label="Card"),u.hidden===void 0&&(u.hidden=!1),u.icon=u.icon??"",u.img=u.img??"",u.wrapperOption=aP({number:Wp(),gutter:0,span:24,offset:0,push:0,pull:0,height:300,marginTop:0,margin:"0px 10px 10px 0px",pannelColor:"",dynamicStyle:{padding:"10px",backgroundColor:""},titleOption:{hidden:!0,title:`Section ${l+1}`,dynamicStyle:{textAlign:"left",padding:"0px",height:"20px",lineHeight:"20px",fontSize:"14px",color:""},moreOption:{hidden:!1,icon:"More",iconShow:!1,text:"More",linkurl:"/",linktype:"router",refresh:"0",datetime:"0",autotime:!1,autotimeval:1,dynamicStyle:{color:"",fontSize:"12px"}}}},u.wrapperOption);let p=0;if(Array.isArray(u.widgetList)?u.widgetList=u.widgetList.map((d,h)=>{let m=ne(d);Hn(m,"type")||i.push(`wrapperList[${l}].widgetList[${h}].type is required.`),m.label=m.label??m.type??"Widget",m.category=m.category??0,m.show=m.show??1,m.icon=m.icon??"",m.img=m.img??"",m.widgetOption=aP({number:Wp(),wrapperNumber:ne(u.wrapperOption).number,span:24,offset:0,push:0,pull:0,height:260,marginTop:0,dynamicStyle:{padding:"8px",backgroundColor:""}},m.widgetOption),Array.isArray(m.widgetParams)||(m.widgetParams=[M(0,"Data source","textarea","",{rows:3,dataJson:{}})],a.push(`wrapperList[${l}].widgetList[${h}].widgetParams was missing and a safe data param was added.`));let y=`wrapperList[${l}].widgetList[${h}]`;return PH(m,y,a),p=Math.max(p,wH(m,y,a)),m}):(u.widgetList=[],a.push(`wrapperList[${l}].widgetList was missing and was set to an empty array.`)),p>0){let d=ne(u.wrapperOption),h=p+16;Mv(d.height,0)<h&&(d.height=h,u.wrapperOption=d,a.push(`wrapperList[${l}].wrapperOption.height was raised to ${h} to fit content widgets.`))}return u}):[];Array.isArray(n.wrapperList)||a.push("wrapperList was missing and was set to an empty array.");let s={formConfig:{...Kp,...ne(n.formConfig),dynamicStyle:{...ne(Kp.dynamicStyle),...ne(ne(n.formConfig).dynamicStyle)},watermarkStyle:{...ne(Kp.watermarkStyle),...ne(ne(n.formConfig).watermarkStyle)}},wrapperList:o};return{ok:i.length===0,value:s,json:JSON.stringify(s),errors:i,warnings:a}}function $H(t){let e=bo(t);if(!e.ok)return t;let r=e.value,n=ne(r);return n.PageObj!==void 0?r=n.PageObj:n.pageObj!==void 0&&(r=n.pageObj),r}function Qi(t){let e=$H(t),r=bo(e);if(!r.ok)return{ok:!1,errors:[`PageObj is not valid JSON: ${r.error}`],warnings:[]};let n=ne(r.value),i=[],a=[];Array.isArray(n.panels)||i.push("PageObj.panels must be an array.");let o=Array.isArray(n.panels)?n.panels.map((s,c)=>{let l=ne(s);return l.index=l.index??c,l.name=l.name??`Panel ${c+1}`,l.paperType=l.paperType??"A4",l.height=l.height??297,l.width=l.width??210,l.paperHeader=l.paperHeader??0,l.paperFooter=l.paperFooter??841.8897637795277,l.paperNumberContinue=l.paperNumberContinue??!0,l.watermarkOptions=l.watermarkOptions??{},l.panelLayoutOptions=l.panelLayoutOptions??{},Array.isArray(l.printElements)||(l.printElements=[],a.push(`panels[${c}].printElements was missing and was set to an empty array.`)),l.printElements=l.printElements.map((u,p)=>{let d=ne(u);return Hn(ne(d.printElementType),"type")||i.push(`panels[${c}].printElements[${p}].printElementType.type is required.`),d.options=ne(d.options),d}),l}):[];return o.length===0&&i.push("PageObj.panels must contain at least one panel."),{ok:i.length===0,value:{...n,panels:o},json:JSON.stringify({...n,panels:o}),errors:i,warnings:a}}function Yi(t){if(t==null||t==="")return{ok:!0,value:{},json:"{}",errors:[],warnings:[]};let e=bo(t);return e.ok?{ok:!0,value:e.value,json:JSON.stringify(e.value),errors:[],warnings:[]}:{ok:!1,errors:[`PrintObj is not valid JSON: ${e.error}`],warnings:[]}}function Hn(t,...e){for(let r of e){let n=t[r];if(typeof n=="string"&&n.trim())return n.trim();if(typeof n=="number"||typeof n=="boolean")return String(n)}return""}function uP(t){let e=lP(Dv(t.prompt||"",t.theme)),r=t.title||e.title,n=kH({...t,title:r});return{title:r,number:t.number||hH(r),desc:t.desc||e.subtitle||Hn(ne(n.formConfig),"title")||"",jsonObj:n,jsonStr:JSON.stringify(n)}}function pP(t){let e=AH(t),r=Array.isArray(e.pageObj.panels)?e.pageObj.panels:[],n=t.title||Hn(ne(r[0]),"name")||"AI print template",i=t.number||`print_${Math.random().toString(36).slice(2,8)}`;return{title:n,number:i,desc:t.desc||"",pageObj:e.pageObj,pageObjStr:JSON.stringify(e.pageObj),printObj:e.printObj,printObjStr:JSON.stringify(e.printObj),dataApi:t.dataApi||""}}var dP="/* MICROI_WF_LINE_CONDITION_JSON",IH="MICROI_WF_LINE_CONDITION_JSON */",Pt=f.record(f.unknown());function Q(t,e=!1){return{content:[{type:"text",text:t}],isError:e}}function _e(t){return t&&typeof t=="object"&&!Array.isArray(t)?t:{}}function Xp(t){return Array.isArray(t)?t.map(_e).filter(e=>Object.keys(e).length>0):[]}function he(t,...e){for(let r of e){let n=t[r];if(Array.isArray(n))return Xp(n)}return[]}function S(t,...e){for(let r of e){let n=t[r];if(typeof n=="string"&&n.trim())return n.trim();if(typeof n=="number"||typeof n=="boolean")return String(n)}return""}function ge(t,...e){for(let r of e){let n=t[r];if(typeof n=="number")return n;if(typeof n=="string"&&n.trim()&&!Number.isNaN(Number(n)))return Number(n)}}function Sc(t,...e){for(let r of e){let n=t[r];if(Array.isArray(n))return n.map(i=>typeof i=="string"?i:S(_e(i),"name","Name","id","Id")).filter(Boolean);if(typeof n=="string"&&n.trim())return n.split(/[,,;;]/).map(i=>i.trim()).filter(Boolean)}return[]}function Hr(t,...e){for(let r of e)if(Object.prototype.hasOwnProperty.call(t,r))return t[r]}function wo(t){return t.trim().toLowerCase()}function CP(t,e){return`${wo(t)}::${wo(e)}`}function Hv(t){return["Id","CreateTime","UpdateTime","CreateUserId","CreateUserName","UpdateUserId","UpdateUserName","OsClient","IsDeleted"].some(e=>e.toLowerCase()===t.toLowerCase())}function RH(t){let e=t.trim();if(!e)return[];if(e.startsWith("["))try{let r=JSON.parse(e);if(Array.isArray(r))return r}catch{}return e.split(/[,;\n\uFF0C\uFF1B\u3001]+/).map(r=>r.trim()).filter(Boolean)}function dr(t,...e){for(let r of e){let n=Hr(t,r);if(n==null||n==="")continue;return(Array.isArray(n)?n:typeof n=="string"?RH(n):[n]).map(a=>{if(typeof a=="string"||typeof a=="number"||typeof a=="boolean")return{ref:String(a).trim()};let o=_e(a);return{ref:S(o,"field","Field","fieldName","FieldName","name","Name","id","Id","fieldId","FieldId"),asName:S(o,"asName","AsName","alias","Alias")||void 0,type:S(o,"type","Type")||void 0,displayType:S(o,"displayType","DisplayType")||void 0,displaySelect:typeof o.displaySelect=="boolean"?o.displaySelect:typeof o.DisplaySelect=="boolean"?o.DisplaySelect:void 0,equal:typeof o.equal=="boolean"?o.equal:typeof o.Equal=="boolean"?o.Equal:void 0}}).filter(a=>a.ref)}return[]}function OH(){return{byTableAndRef:new Map,fieldsByTable:new Map}}function AP(t,e){let r=[e.tableId,e.tableName].filter(Boolean),n=[e.id,e.name,e.label].filter(Boolean);for(let i of r){for(let s of n)t.byTableAndRef.set(CP(i,s),e);let a=wo(i),o=t.fieldsByTable.get(a)||[];o.some(s=>s.id===e.id||wo(s.name)===wo(e.name))||(o.push(e),t.fieldsByTable.set(a,o))}}function fP(t,e,r){if(!(!e||!r))return t.byTableAndRef.get(CP(e,r))}function zv(t,e){return t.fieldsByTable.get(wo(e))||[]}function PP(t,e,r){return{id:r,name:r,label:r,tableId:t,tableName:e,tableDescription:e,component:"Text",type:"varchar(255)"}}function mn(t){return Object.fromEntries(Object.entries(t).filter(([,e])=>e!=null&&e!==""))}function Lv(){let t=Date.now().toString(36).toUpperCase().padStart(10,"0"),e=Math.random().toString(36).slice(2,18).toUpperCase().padEnd(16,"0");return`${t}${e}`.slice(0,26)}function ht(t,e){let r=[`## ${t}`,`- Code: ${e.Code}`,e.Msg?`- Message: ${e.Msg}`:"","","```json",JSON.stringify(e.Data??{},null,2),"```"].filter(Boolean);return Q(r.join(`
129
129
  `),e.Code!==1)}function Ec(t){if(!(t==null||t===""))return typeof t=="string"?t:JSON.stringify(t)}function NH(t){let e=_e(t),r=_e(e.Workload??e.workload??e.BackgroundWorkload??e.backgroundWorkload),n=[],i=ge(r,"ExpectedSeconds","expectedSeconds")??0,a=ge(r,"ExpectedItems","expectedItems","EstimatedRows","estimatedRows")??0,o=ge(r,"FanOutOperations","fanOutOperations","FanOut","fanOut")??0,s=ge(r,"ExternalCalls","externalCalls")??0;i>=120&&n.push(`\u9884\u8BA1\u8017\u65F6 ${i}s >= 120s`),a>=500&&n.push(`\u9884\u8BA1\u5904\u7406 ${a} \u6761 >= 500 \u6761`),o>=1e3&&n.push(`\u9884\u8BA1\u6247\u51FA ${o} \u4E2A\u5B50\u64CD\u4F5C >= 1000`),s>=100&&n.push(`\u9884\u8BA1\u5916\u90E8\u8C03\u7528 ${s} \u6B21 >= 100 \u6B21`),Kn(r,"UnknownTotal","unknownTotal")===!0&&n.push("\u603B\u5DE5\u4F5C\u91CF\u672A\u77E5\u4E14\u53EF\u80FD\u957F\u65F6\u95F4\u8FD0\u884C");let c=[S(e,"Name","name"),S(e,"ApiEngineKey","apiEngineKey"),S(e,"V8Code","v8Code")].join(" ");return/(批量.{0,4}(导入|生成|修复|处理)|安装|初始化|全量同步|数据迁移|数据库备份|批量任务)/i.test(c)&&n.push("\u52A8\u4F5C\u8BED\u4E49\u5C5E\u4E8E\u5178\u578B\u957F\u4EFB\u52A1"),{required:n.length>0,reasons:n}}function MH(t){let e=_e(t),r=_e(e.Workload??e.workload??e.BackgroundWorkload??e.backgroundWorkload),n=S(r,"ExecutionMode","executionMode").trim().toLowerCase(),i=Kn(r,"ClientChunked","clientChunked")===!0||n==="clientchunked"||n==="clientsequential",a=ge(r,"MaxItemsPerChunk","maxItemsPerChunk")??0,o=Kn(r,"Resumable","resumable")===!0;return{declared:i,valid:i&&a>0&&o,maxItemsPerChunk:a,resumable:o}}var Gp="https://api.itdos.com",Fv="iTdos";function DH(t){let e=String(t.storeId||"").trim(),r=String(t.requestId||"").trim();if(!/^[A-Za-z0-9:._-]{1,100}$/u.test(e))throw new Error("storeId \u53EA\u80FD\u5305\u542B\u5B57\u6BCD\u3001\u6570\u5B57\u3001\u5192\u53F7\u3001\u70B9\u3001\u4E0B\u5212\u7EBF\u548C\u8FDE\u5B57\u7B26\uFF0C\u957F\u5EA6 1-100\u3002");if(!/^[A-Za-z0-9:._-]{8,100}$/u.test(r))throw new Error("requestId \u5FC5\u987B\u662F\u8C03\u7528\u65B9\u4FDD\u5B58\u5E76\u5728\u91CD\u8BD5\u65F6\u590D\u7528\u7684\u7A33\u5B9A\u5E42\u7B49 Id\uFF0C\u957F\u5EA6 8-100\u3002");let n=String(t.storeApiBase||Gp).trim(),i;try{i=new URL(n)}catch{throw new Error("storeApiBase \u5FC5\u987B\u662F\u6709\u6548\u7684 HTTP/HTTPS \u670D\u52A1\u6839\u5730\u5740\u3002")}if(i.protocol!=="https:"||i.username||i.password||i.pathname&&i.pathname!=="/"||i.search||i.hash||i.origin!==Gp)throw new Error(`storeApiBase \u4EC5\u5141\u8BB8\u543E\u7801\u5B98\u65B9\u5546\u57CE ${Gp}\uFF0C\u4E14\u4E0D\u80FD\u5305\u542B\u51ED\u636E\u3001\u8DEF\u5F84\u3001\u67E5\u8BE2\u3001\u7247\u6BB5\u6216\u81EA\u5B9A\u4E49\u7AEF\u53E3\u3002`);let a=Gp,o=String(t.storeOsClient||Fv).trim();if(o.toLowerCase()!==Fv.toLowerCase())throw new Error(`storeOsClient \u4EC5\u5141\u8BB8\u543E\u7801\u5B98\u65B9\u5546\u57CE\u79DF\u6237 ${Fv}\u3002`);return{ApiEngineKey:"import-microi-store-package",Title:`${t.operation==="update"?"\u66F4\u65B0":"\u5B89\u88C5"}\u5E94\u7528\uFF1A${String(t.appName||t.appId||e).trim()}`,Param:mn({StoreId:e,AppId:t.appId,AppName:t.appName,AppVersion:t.appVersion,StoreApiBase:a,StoreOsClient:o,InstallParentSysMenuId:t.installParentSysMenuId,ResumeInstall:t.resumeInstall!==!1,InstallAction:t.operation==="update"?"Update":"Install",InstallOperationId:r}),Options:{IdempotencyKey:`mcp:store:${t.operation}:${e}:${r}`,ConcurrencyKey:"import-microi-store-package",MaxAttempts:3,RetryOnFailure:!0}}}function zH(t,e){let r=[],n=[];if(e==null||e==="")return{ok:!0,value:void 0,errors:r,warnings:n};let i;try{i=typeof e=="string"?JSON.parse(e):e}catch(s){return{ok:!1,errors:[`${t} \u4E0D\u662F\u5408\u6CD5 JSON \u6570\u7EC4\uFF1A${s instanceof Error?s.message:String(s)}`],warnings:n}}if(!Array.isArray(i))return{ok:!1,errors:[`${t} \u5FC5\u987B\u662F JSON \u6570\u7EC4`],warnings:n};let a=new Set,o=i.map((s,c)=>{let l=_e(s),u=S(l,"Name","name");u||r.push(`${t}[${c}].Name \u4E0D\u80FD\u4E3A\u7A7A`);let p=NH(l),d=MH(l),h=l.RunBackground??l.runBackground??l.BackgroundTask??l.backgroundTask??l.IsBackgroundTask??l.isBackgroundTask,m=S(l,"ApiEngineKey","apiEngineKey");p.required&&h!==!0&&(d.declared&&!d.valid?r.push(`${t}[${c}] \u58F0\u660E\u5BA2\u6237\u7AEF\u5206\u7247\u65F6\u5FC5\u987B\u8BBE\u7F6E Workload.MaxItemsPerChunk > 0 \u4E14 Workload.Resumable=true`):d.valid?n.push(`${t}[${c}] \u5DF2\u58F0\u660E\u5BA2\u6237\u7AEF\u53EF\u6062\u590D\u5206\u7247\uFF0C\u5355\u7247\u6700\u591A ${d.maxItemsPerChunk} \u6761\uFF1B\u4FDD\u7559\u524D\u7AEF\u5206\u7247\u6267\u884C\uFF1A${p.reasons.join("\uFF1B")}`):m?(h=!0,n.push(`${t}[${c}] \u5DF2\u8BC6\u522B\u4E3A\u957F\u4EFB\u52A1\u5E76\u81EA\u52A8\u542F\u7528 RunBackground\uFF1A${p.reasons.join("\uFF1B")}`)):r.push(`${t}[${c}] \u5DF2\u8BC6\u522B\u4E3A\u957F\u4EFB\u52A1\uFF0C\u4F46\u7F3A\u5C11 ApiEngineKey\uFF1A${p.reasons.join("\uFF1B")}`));let y=_e(l.BackgroundTaskOptions??l.backgroundTaskOptions);h===!0&&(!S(y,"IdempotencyKey","idempotencyKey")&&!Sc(y,"IdempotencyKeyFields","idempotencyKeyFields").length&&n.push(`${t}[${c}] \u540E\u53F0\u4EFB\u52A1\u672A\u914D\u7F6E IdempotencyKey \u6216 IdempotencyKeyFields\uFF1B\u6D89\u53CA\u5199\u64CD\u4F5C\u65F6\u5FC5\u987B\u8865\u7A33\u5B9A\u4E1A\u52A1\u5E42\u7B49\u952E`),S(y,"BusinessTable","businessTable")&&(!S(y,"BusinessStatusField","businessStatusField")||!S(y,"BusinessTaskIdField","businessTaskIdField"))&&n.push(`${t}[${c}] \u5DF2\u5173\u8054\u4E1A\u52A1\u8868\uFF0C\u4F46\u7F3A\u5C11 BusinessStatusField/BusinessTaskIdField`));let g=S(l,"TargetSysMenuId","targetSysMenuId"),x=t==="PageTabs"&&!!g;!S(l,"V8Code","v8Code")&&!S(l,"Url","url")&&!(h&&m)&&!x&&r.push(`${t}[${c}] \u5FC5\u987B\u914D\u7F6E V8Code\u3001Url\u3001\u5173\u8054\u6A21\u5757 TargetSysMenuId\uFF0C\u6216\u540E\u53F0\u4EFB\u52A1 ApiEngineKey`);let v=S(l,"Id","id")||Lv();S(l,"Id","id")||n.push(`${t}[${c}] \u672A\u4F20 Id\uFF0C\u5DF2\u81EA\u52A8\u751F\u6210 ${v}`),a.has(v)&&r.push(`${t} \u4E2D\u5B58\u5728\u91CD\u590D Id\uFF1A${v}`),a.add(v);let b=S(l,"V8CodeShow","v8CodeShow");return b&&!b.includes("V8.Result")&&n.push(`${t}[${c}].V8CodeShow \u5EFA\u8BAE\u663E\u5F0F\u8D4B\u503C V8.Result=true/false`),mn({...l,Id:v,Sort:ge(l,"Sort","sort")??c*10,Name:u,Icon:S(l,"Icon","icon")||void 0,BtnStyle:S(l,"BtnStyle","btnStyle")||void 0,IsVisible:l.IsVisible??l.isVisible??!0,ShowRow:t==="MoreBtns"?l.ShowRow??l.showRow??!0:l.ShowRow??l.showRow,V8CodeShow:b||void 0,V8Code:S(l,"V8Code","v8Code")||void 0,Url:S(l,"Url","url")||void 0,RunBackground:h===void 0?void 0:!!h,BackgroundTask:l.BackgroundTask??l.backgroundTask??void 0,IsBackgroundTask:l.IsBackgroundTask??l.isBackgroundTask??void 0,ApiEngineKey:m||void 0,Workload:Object.keys(_e(l.Workload??l.workload)).length?_e(l.Workload??l.workload):void 0,BackgroundTaskOptions:Object.keys(y).length?y:void 0,TargetSysMenuId:g||void 0})});return{ok:r.length===0,value:JSON.stringify(o),errors:r,warnings:n}}function _o(t){let e={...t},r=[],n=[];(t.DiyConfig!==void 0||t.diyConfig!==void 0)&&(r.push("DiyConfig \u5DF2\u5E9F\u5F03\uFF1B\u8BF7\u65B0\u589E\u4E13\u7528\u7269\u7406\u5B57\u6BB5\uFF0C\u5E76\u901A\u8FC7 diy_field \u5143\u6570\u636E\u66B4\u9732\u914D\u7F6E\u63A7\u4EF6\u3002\u8DE8\u7AEF\u89C6\u56FE\u8BF7\u4F7F\u7528 sys_menu.ViewSchema\u3002"),delete e.DiyConfig,delete e.diyConfig);let i={MoreBtns:["MoreBtns","moreBtns"],FormBtns:["FormBtns","formBtns"],BatchSelectMoreBtns:["BatchSelectMoreBtns","batchSelectMoreBtns"],PageTabs:["PageTabs","pageTabs"],ExportMoreBtns:["ExportMoreBtns","exportMoreBtns"],PageBtns:["PageBtns","pageBtns"]};for(let[c,l]of Object.entries(i)){let u=l.find(d=>t[d]!==void 0);if(!u)continue;let p=zH(c,t[u]);r.push(...p.errors),n.push(...p.warnings),p.ok&&p.value!==void 0&&(e[c]=p.value)}let a=[["MenuBadgeEnabled","menuBadgeEnabled"],["EnableViewSchema","enableViewSchema"],["ViewConfigVersion","viewConfigVersion"]];for(let[c,l]of a){if(t[c]===void 0&&t[l]===void 0)continue;let u=ge(t,c,l);u!==void 0&&(e[c]=c.endsWith("Enabled")?u===1?1:0:u),delete e[l]}let o=[["MenuBadgeApiEngineKey","menuBadgeApiEngineKey"],["ViewSchemaVersion","viewSchemaVersion"]];for(let[c,l]of o)t[c]===void 0&&t[l]===void 0||(e[c]=S(t,c,l),delete e[l]);let s=["ViewSchema","viewSchema"].find(c=>t[c]!==void 0);if(s){let c=Kv(t[s]);r.push(...c.errors),n.push(...c.warnings),delete e.viewSchema,c.value!==void 0&&(e.ViewSchema=c.value)}return{data:e,errors:r,warnings:n}}function Kn(t,...e){for(let r of e){let n=t[r];if(typeof n=="boolean")return n;if(typeof n=="number")return n!==0;if(typeof n=="string"&&n.trim()){let i=n.trim().toLowerCase();if(["true","1","yes"].includes(i))return!0;if(["false","0","no"].includes(i))return!1}}}function mP(t,e,r,n){let i=Hr(t,"v8Unlimited","V8Unlimited");if(i==null||i==="")return;let a=Kn(t,"v8Unlimited","V8Unlimited");if(a===void 0){r.push(`${e}.v8Unlimited \u5FC5\u987B\u662F boolean \u6216 0/1`);return}return a&&n.push(`${e}.v8Unlimited=true \u4F1A\u53D6\u6D88\u8BE5\u63A5\u53E3\u6216\u8BE5\u8868\u540E\u7AEF V8 \u4E8B\u4EF6\u7684\u5355\u6B21 Jint \u8D85\u65F6\u3001\u8BED\u53E5\u3001\u9012\u5F52\u548C\u7D2F\u8BA1\u5206\u914D\u9884\u7B97\uFF1B\u4EC5\u5728\u4E1A\u52A1\u660E\u786E\u8981\u6C42\u5355\u4E8B\u52A1\u4E14\u5DF2\u8BC4\u4F30\u6570\u636E\u5E93\u9501\u3001\u56DE\u6EDA\u3001\u8FDE\u63A5\u8D85\u65F6\u4E0E\u8FDB\u7A0B\u5185\u5B58\u98CE\u9669\u65F6\u5F00\u542F\u3002\u8FDB\u7A0B\u5E38\u9A7B\u5185\u5B58\u4FDD\u62A4\u4ECD\u751F\u6548\uFF0C\u4E14\u4E0D\u4F1A\u5411\u5D4C\u5957\u63A5\u53E3\u7EE7\u627F\u3002`),a}var FH=["Detail","Edit","List","Card"],jH=["PC","Mobile","All"],LH=["ApiEngine","OpenDetail","OpenList","OpenForm","Navigate","Dial","Scan","Map","Refresh","Back","Copy"],qH=new Set(["v8code","v8codeshow","script","javascript","eval","onclick","function"]);function qv(t,e){let r=String(t??"").trim().toLowerCase();return e.find(n=>n.toLowerCase()===r)||""}function fn(t,...e){let r=new Set(e.map(i=>i.toLowerCase()));return Object.entries(t).find(([i])=>r.has(i.toLowerCase()))?.[1]}function Vv(t,e="ViewSchema"){if(Array.isArray(t)){for(let r=0;r<t.length;r+=1){let n=Vv(t[r],`${e}[${r}]`);if(n)return n}return""}if(!t||typeof t!="object")return"";for(let[r,n]of Object.entries(t)){if(qH.has(r.toLowerCase()))return`${e}.${r}`;let i=Vv(n,`${e}.${r}`);if(i)return i}return""}function Bv(t,e,r=0){if(t==null)return[];if(r>4)return[`${e} \u7684 SuccessActions \u5D4C\u5957\u4E0D\u80FD\u8D85\u8FC7 4 \u5C42`];if(!Array.isArray(t))return[`${e} \u5FC5\u987B\u662F JSON \u6570\u7EC4`];if(t.length>50)return[`${e} \u6700\u591A\u5141\u8BB8 50 \u4E2A\u52A8\u4F5C`];let n=[];return t.forEach((i,a)=>{let o=_e(i);if(!Object.keys(o).length){n.push(`${e}[${a}] \u5FC5\u987B\u662F JSON \u5BF9\u8C61`);return}let s=qv(fn(o,"ActionType","Type"),LH);if(!s){n.push(`${e}[${a}].ActionType \u4E0D\u53D7\u652F\u6301`);return}s==="ApiEngine"&&!S(o,"ApiEngineKey","apiEngineKey")&&n.push(`${e}[${a}] \u4F7F\u7528 ApiEngine \u65F6\u5FC5\u987B\u914D\u7F6E ApiEngineKey`);let c=fn(o,"SuccessActions");n.push(...Bv(c,`${e}[${a}].SuccessActions`,r+1))}),n}function Kv(t){let e=[],r=[];if(t==null||t==="")return{ok:!0,value:void 0,errors:e,warnings:r};let n=t;try{typeof n=="string"&&(n=JSON.parse(n)),typeof n=="string"&&(n=JSON.parse(n))}catch(c){return{ok:!1,errors:[`ViewSchema \u4E0D\u662F\u5408\u6CD5 JSON\uFF1A${c instanceof Error?c.message:String(c)}`],warnings:r}}if(!n||typeof n!="object"||Array.isArray(n))return{ok:!1,errors:["ViewSchema \u5FC5\u987B\u662F JSON \u5BF9\u8C61"],warnings:r};let i=Vv(n);i&&e.push(`ViewSchema \u4E0D\u5141\u8BB8\u5305\u542B\u53EF\u6267\u884C\u524D\u7AEF\u811A\u672C\u5B57\u6BB5\uFF1A${i}`);let o=fn(n,"Views");o!==void 0&&!Array.isArray(o)?e.push("ViewSchema.Views \u5FC5\u987B\u662F JSON \u6570\u7EC4"):Array.isArray(o)?(o.length>100&&e.push("ViewSchema.Views \u6700\u591A\u5141\u8BB8 100 \u4E2A\u89C6\u56FE"),o.forEach((c,l)=>{let u=_e(c);if(!Object.keys(u).length){e.push(`ViewSchema.Views[${l}] \u5FC5\u987B\u662F JSON \u5BF9\u8C61`);return}qv(fn(u,"Scene"),FH)||e.push(`ViewSchema.Views[${l}].Scene \u4E0D\u53D7\u652F\u6301`);let p=fn(u,"Device");p!==void 0&&!qv(p,jH)&&e.push(`ViewSchema.Views[${l}].Device \u4E0D\u53D7\u652F\u6301`);let d=fn(u,"Layout","LayoutJson");if(typeof d=="string")try{d=JSON.parse(d)}catch{e.push(`ViewSchema.Views[${l}].Layout \u4E0D\u662F\u5408\u6CD5 JSON`);return}if(d==null)return;let h=_e(d);if(!Object.keys(h).length&&(typeof d!="object"||Array.isArray(d))){e.push(`ViewSchema.Views[${l}].Layout \u5FC5\u987B\u662F JSON \u5BF9\u8C61`);return}e.push(...Bv(fn(h,"Actions","ActionSchema"),`ViewSchema.Views[${l}].Layout.Actions`));let m=fn(h,"Blocks","Sections");m!==void 0&&!Array.isArray(m)?e.push(`ViewSchema.Views[${l}].Layout.Blocks \u5FC5\u987B\u662F JSON \u6570\u7EC4`):Array.isArray(m)&&(m.length>100&&e.push(`ViewSchema.Views[${l}].Layout.Blocks \u6700\u591A\u5141\u8BB8 100 \u4E2A\u533A\u5757`),m.forEach((y,g)=>{let x=_e(y);e.push(...Bv(fn(x,"Actions"),`ViewSchema.Views[${l}].Layout.Blocks[${g}].Actions`))}))})):r.push("ViewSchema.Views \u4E3A\u7A7A\uFF0C\u5BA2\u6237\u7AEF\u5C06\u4F7F\u7528\u73B0\u6709\u6A21\u5757\u548C\u8868\u5355\u914D\u7F6E\u3002");let s=JSON.stringify(n);return Buffer.byteLength(s,"utf8")>512*1024&&e.push("ViewSchema \u4E0D\u80FD\u8D85\u8FC7 512KB"),{ok:e.length===0,value:s,errors:e,warnings:r}}function hP(t,e){let r=[],n=t.toLowerCase();if(n==="keyvalue"){let i=S(e,"data","options"),a=i?i.split(/[,,;;\n]/).map(o=>o.trim()).filter(Boolean).map(o=>{let[s,c]=o.split("|");return{Key:(s||"").trim(),Value:(c||s||"").trim()}}):Xp(e.items).map(o=>({Key:S(o,"Key","key"),Value:S(o,"Value","label","name")}));return{data:JSON.stringify(a),config:{DataSource:"KeyValue",SelectLabel:"Value",SelectSaveField:"Key",SelectSaveFormat:"Text",EnableSearch:!1,DataSourceSqlRemote:!1},warnings:r}}if(n==="data"){let i=S(e,"data","options"),a=i?i.split(/[,,;;\n]/).map(o=>o.trim()).filter(Boolean):Array.isArray(e.items)?e.items:[];return{data:JSON.stringify(a),config:{DataSource:"Data",SelectSaveFormat:"Text",EnableSearch:!1,DataSourceSqlRemote:!1},warnings:r}}if(n==="sql"){let i=S(e,"sql","Sql");return i||r.push("SQL \u6570\u636E\u6E90\u7F3A\u5C11 sql"),{config:{DataSource:"Sql",Sql:i,SelectLabel:S(e,"selectLabel","SelectLabel")||"Name",SelectSaveField:S(e,"selectSaveField","SelectSaveField")||"Id",DataSourceSqlRemote:e.dataSourceSqlRemote??e.DataSourceSqlRemote??!0,EnableSearch:e.enableSearch??e.EnableSearch??!0},warnings:r}}if(n==="apiengine"){let i=S(e,"apiEngineKey","DataSourceApiEngineKey");return i||r.push("\u63A5\u53E3\u5F15\u64CE\u6570\u636E\u6E90\u7F3A\u5C11 apiEngineKey"),{config:{DataSource:"ApiEngine",DataSourceApiEngineKey:i,SelectLabel:S(e,"selectLabel")||"name",SelectSaveField:S(e,"selectSaveField")||"id"},warnings:r}}if(n==="datasource"){let i=S(e,"dataSourceId","DataSourceId");return i||r.push("\u6570\u636E\u6E90\u5F15\u64CE\u914D\u7F6E\u7F3A\u5C11 dataSourceId"),{config:{DataSource:"DataSource",DataSourceId:i,SelectLabel:S(e,"selectLabel")||"Name",SelectSaveField:S(e,"selectSaveField")||"Id"},warnings:r}}return n==="autonumber"?{config:{AutoNumberFixed:S(e,"prefix","AutoNumberFixed"),AutoNumberLength:ge(e,"length","AutoNumberLength")??4},warnings:r}:n==="datetime"?{config:{DateTimeType:S(e,"dateTimeType","DateTimeType")||"datetime"},warnings:r}:n==="joinform"?{config:{JoinForm:{TableId:S(e,"tableId"),TableName:S(e,"tableName"),JoinFieldName:S(e,"joinFieldName")||"Name"}},warnings:r}:(r.push(`\u672A\u77E5 sourceType: ${t}\uFF0C\u5DF2\u8FD4\u56DE\u7A7A\u914D\u7F6E`),{config:{},warnings:r})}function jv(t,e){let r=Kr(t);return mn({Id:t.id,AsName:e?.asName||"",Name:t.name,Label:t.label||t.name,TableId:t.tableId,TableName:t.tableName,TableDescription:t.tableDescription||t.tableName,DisplayType:e?.displayType||(Uv.has(r)||ta(t)||r==="numbertext"?"In":"Out"),DisplaySelect:e?.displaySelect??["opentable","joinform","department","selecttree"].includes(r),Equal:e?.equal??(Uv.has(r)||r==="numbertext"?!0:void 0),IsVisible:!0})}function vo(t,e,r,n,i){return n.map(a=>{let o=fP(t,e,a.ref)||fP(t,r,a.ref)||(Hv(a.ref)?PP(e,r,a.ref):void 0);if(!o)throw new Error(`${i}: unknown field "${a.ref}" on table "${r||e}"`);return{meta:o,ref:a}})}function nt(t,...e){for(let r of e){let n=Hr(t,r);if(!(n==null||n===""))return typeof n=="string"?n:JSON.stringify(n)}return""}var VH=new Set(["id","osclient","isdeleted","createuserid","updateuserid","deleteuserid","tenantid","storeid","userid","userids","roleid","roleids","parentid","parentids","class","code","enname","endescription"]),$P=new Set(["button","divider","collapsegroup","tabs","alert","statictext","html","devcomponent"]),BH=new Set(["textarea","richtext","codeeditor","jsontable","imgupload","fileupload","tablechild","map","maparea","jointable","opentable","treecheckbox","transfer"]),UH=new Set(["text","textarea","select","multipleselect","radio","checkbox","datetime","date","numbertext","autonumber","switch","department","address","cascader","selecttree","opentable","joinform","autocomplete","taginput"]),Uv=new Set(["select","multipleselect","radio","checkbox","switch","department","selecttree","opentable","joinform","cascader"]);function Jr(t){return(t||"").trim().toLowerCase()}function fr(t){return`${t.name||""} ${t.label||""} ${t.component||""} ${t.type||""}`.toLowerCase()}function qe(t,e){return e.some(r=>t.includes(r.toLowerCase()))}function Kr(t){return Jr(t.component||"Text")}function ZH(t){return $P.has(Kr(t))}function JH(t){return BH.has(Kr(t))}function HH(t){let e=t.name||"",r=Jr(e).replace(/[_\-\s]+/g,"");return!!(VH.has(r)||/^(.*id|.*ids|.*idlist|.*guid)$/.test(r)&&!/idcard|identity|cardid/.test(r)||/Id$|ID$|Ids$|IDs$|Guid$/u.test(e)&&!/IdCard|IDCard|Identity|CardId/u.test(e))}function kc(t){return Hv(t.name)&&!["CreateTime","UpdateTime","UserName"].some(e=>e.toLowerCase()===t.name.toLowerCase())||HH(t)||ZH(t)||JH(t)?!0:Kr(t).includes("hidden")}function So(t){let e=new Set;return t.filter(r=>{let n=r.id||r.name;return!n||e.has(n)?!1:(e.add(n),!0)})}function Wn(t,e){return t.map((r,n)=>({field:r,index:n,score:e(r)})).sort((r,n)=>n.score-r.score||r.index-n.index).map(r=>r.field)}function Wv(t){let e=Jr(t.type);return Kr(t)==="numbertext"||e.startsWith("decimal")||e==="int"||e==="bigint"}function ta(t){let e=fr(t);return Kr(t)==="datetime"||qe(e,["time","date","\u65E5\u671F","\u65F6\u95F4"])}function KH(t){let e=Kr(t),r=Uv.has(e)||e==="numbertext"||e==="rate"||e==="progress";return{ref:t.name,displayType:r||ta(t)?"In":"Out",displaySelect:["opentable","joinform","department","selecttree"].includes(e),equal:r?!0:void 0}}function gP(t){let e=fr(t),r=0;return qe(e,["name","title","no","code","account","phone","mobile","email","\u540D\u79F0","\u6807\u9898","\u7F16\u53F7","\u8D26\u53F7","\u7535\u8BDD","\u624B\u673A","\u90AE\u7BB1"])&&(r+=50),qe(e,["status","state","type","category","level","class","\u72B6\u6001","\u7C7B\u578B","\u5206\u7C7B","\u7B49\u7EA7"])&&(r+=45),qe(e,["customer","member","user","owner","\u8D1F\u8D23\u4EBA","\u5BA2\u6237","\u4F1A\u5458","\u7528\u6237","\u8054\u7CFB\u4EBA"])&&(r+=35),ta(t)&&(r+=25),Wv(t)&&!qe(e,["phone","mobile","tel","\u7535\u8BDD","\u624B\u673A"])&&(r+=15),Kr(t)==="textarea"&&(r-=25),r}function WH(t){let e=fr(t),r=0;return qe(e,["name","title","no","code","\u540D\u79F0","\u6807\u9898","\u7F16\u53F7"])&&(r+=70),qe(e,["status","state","type","category","\u72B6\u6001","\u7C7B\u578B","\u5206\u7C7B"])&&(r+=45),qe(e,["customer","member","user","owner","phone","mobile","\u5BA2\u6237","\u4F1A\u5458","\u7528\u6237","\u8D1F\u8D23\u4EBA","\u7535\u8BDD","\u624B\u673A"])&&(r+=35),qe(e,["amount","money","price","total","count","qty","\u91D1\u989D","\u4EF7\u683C","\u603B\u989D","\u6570\u91CF","\u79EF\u5206","\u4F59\u989D"])&&(r+=30),ta(t)&&(r+=15),Kr(t)==="autonumber"&&(r+=55),r}function GH(t){return So(t.filter(kc))}function Qp(t){let e=t.filter(n=>!kc(n)),r=e.length?e:t;return So(Wn(r,WH)).slice(0,Math.min(12,r.length))}function XH(t){let e=t.filter(n=>!kc(n)&&UH.has(Kr(n))),r=Wn(e,gP).filter(n=>gP(n)>0);return So(r.length?r:e).slice(0,Math.min(8,e.length))}function QH(t){let e=t.filter(r=>!kc(r)&&(ta(r)||Wv(r)||Jr(r.name)==="sort"));return So(Wn(e,r=>{let n=fr(r);return qe(n,["update","\u4FEE\u6539"])?80:qe(n,["create","\u521B\u5EFA"])?75:Jr(r.name)==="sort"?70:qe(n,["amount","money","price","total","count","\u91D1\u989D","\u4EF7\u683C","\u6570\u91CF"])?60:20})).slice(0,Math.min(8,e.length))}function YH(t){let e=["phone","mobile","tel","status","state","sort","rate","level","\u7535\u8BDD","\u624B\u673A","\u72B6\u6001","\u6392\u5E8F","\u7B49\u7EA7"],r=t.filter(n=>{let i=fr(n);return!kc(n)&&Wv(n)&&!qe(i,e)&&qe(i,["amount","money","price","total","count","qty","score","point","balance","\u91D1\u989D","\u4EF7\u683C","\u603B\u989D","\u6570\u91CF","\u79EF\u5206","\u4F59\u989D","\u9762\u79EF","\u91CD\u91CF"])});return So(Wn(r,n=>qe(fr(n),["amount","money","price","total","\u91D1\u989D","\u4EF7\u683C","\u603B\u989D"])?80:40)).slice(0,6)}function eK(t){let e=Qp(t),r=Wn(e,a=>qe(fr(a),["name","title","no","code","\u540D\u79F0","\u6807\u9898","\u7F16\u53F7"])?100:0)[0],n=Wn(e.filter(a=>a!==r),a=>qe(fr(a),["status","state","type","category","\u72B6\u6001","\u7C7B\u578B","\u5206\u7C7B"])?80:0),i=e.filter(a=>a!==r&&!n.slice(0,1).includes(a));return So([r,...n.slice(0,1),...i].filter(Boolean)).slice(0,4)}function tK(t){return Wn(Qp(t),e=>qe(fr(e),["status","state","type","category","level","\u72B6\u6001","\u7C7B\u578B","\u5206\u7C7B","\u7B49\u7EA7"])?100:0).filter(e=>qe(fr(e),["status","state","type","category","level","\u72B6\u6001","\u7C7B\u578B","\u5206\u7C7B","\u7B49\u7EA7"])).slice(0,2)}function rK(t){return Wn(Qp(t),e=>{let r=fr(e);return qe(r,["amount","money","price","total","count","qty","\u79EF\u5206","\u4F59\u989D","\u91D1\u989D","\u4EF7\u683C","\u6570\u91CF"])?90:ta(e)?60:0}).filter(e=>{let r=fr(e);return ta(e)||qe(r,["amount","money","price","total","count","qty","\u79EF\u5206","\u4F59\u989D","\u91D1\u989D","\u4EF7\u683C","\u6570\u91CF"])}).slice(0,3)}function nK(t,e,r){let n=t.length?t:[PP(e,r,"CreateTime")],i=n.find(a=>Jr(a.name)==="createtime")||n.find(a=>Jr(a.name)==="updatetime")||n.find(a=>Jr(a.name)==="sort");if(i)return JSON.stringify([{Id:i.id,Name:i.name,Type:Jr(i.name)==="sort"?"ASC":"DESC",Sort:0}])}function iK(t,e,r,n){let i=Hr(t,"DefaultOrderBy");if(i!=null&&i!=="")return typeof i=="string"?i:JSON.stringify(i);let a=Hr(t,"defaultOrderBy");if(a!=null&&a!==""){let s=Array.isArray(a)||typeof a=="string"&&a.trim().startsWith("[")?dr({value:a},"value"):[{ref:String(a).trim(),type:"DESC"}];return JSON.stringify(vo(e,r,n,s,"module.defaultOrderBy").map(({meta:c,ref:l},u)=>({Id:c.id,Name:c.name,Type:l.type||"DESC",Sort:u})))}let o=dr(t,"orderBy","OrderBy","defaultSort","DefaultSort","sortBy","SortBy");if(o.length)return JSON.stringify(vo(e,r,n,o,"module.defaultOrderBy").map(({meta:s,ref:c},l)=>({Id:s.id,Name:s.name,Type:c.type||"DESC",Sort:l})))}function aK(t,e,r,n){if(!r&&!n)return{};let i=zv(e,r).length?zv(e,r):zv(e,n),a={},o=dr(t,"searchFields","SearchFields","searchFieldNames","SearchFieldNames"),s=o.length?vo(e,r,n,o,"module.searchFields"):XH(i).map(h=>({meta:h,ref:KH(h)}));!nt(t,"searchFieldIds","SearchFieldIds")&&s.length&&(a.SearchFieldIds=JSON.stringify(s.map(({meta:h,ref:m})=>jv(h,m))));let c=dr(t,"listFields","ListFields","tableFields","TableFields","columns","Columns"),l=c.length?vo(e,r,n,c,"module.listFields"):Qp(i).map(h=>({meta:h,ref:{ref:h.name}}));!nt(t,"tableDiyFieldIds","TableDiyFieldIds")&&l.length&&(a.TableDiyFieldIds=JSON.stringify(l.map(({meta:h})=>h.id))),!nt(t,"selectFields","SelectFields")&&l.length&&(a.SelectFields=JSON.stringify(l.map(({meta:h,ref:m})=>jv(h,m))));let u=[{canonical:"SortFieldIds",explicitKeys:["sortFieldIds","SortFieldIds"],refKeys:["sortFields","SortFields"]},{canonical:"NotShowFields",explicitKeys:["notShowFields","NotShowFields"],refKeys:["hiddenFields","HiddenFields","notShowFieldsByName","NotShowFieldsByName"]},{canonical:"InTableEditFields",explicitKeys:["inTableEditFields","InTableEditFields"],refKeys:["editableFields","EditableFields","inTableEditFieldsByName","InTableEditFieldsByName"]},{canonical:"MobileListFields",explicitKeys:["mobileListFields","MobileListFields"],refKeys:["mobileFields","MobileFields"],objectArray:!0},{canonical:"CardTitleTagFields",explicitKeys:["cardTitleTagFields","CardTitleTagFields"],refKeys:["cardTitleFields","CardTitleFields"],objectArray:!0},{canonical:"CardBottomTagFields",explicitKeys:["cardBottomTagFields","CardBottomTagFields"],refKeys:["cardBottomFields","CardBottomFields"],objectArray:!0}];for(let h of u){if(nt(t,...h.explicitKeys))continue;let m=dr(t,...h.refKeys),y={SortFieldIds:QH(i),NotShowFields:GH(i),MobileListFields:eK(i),CardTitleTagFields:tK(i),CardBottomTagFields:rK(i),InTableEditFields:[]};if(!m.length&&!y[h.canonical]?.length)continue;let g=m.length?vo(e,r,n,m,`module.${h.canonical}`):y[h.canonical].map(x=>({meta:x,ref:{ref:x.name}}));a[h.canonical]=JSON.stringify(h.objectArray?g.map(({meta:x,ref:v})=>jv(x,v)):g.map(({meta:x})=>x.id))}let p=dr(t,"statisticsFieldNames","StatisticsFieldNames","statFields","StatFields");if(!nt(t,"statisticsFields","StatisticsFields")){let h=p.length?vo(e,r,n,p,"module.statisticsFields"):YH(i).map(m=>({meta:m,ref:{ref:m.name,type:"Sum"}}));h.length&&(a.StatisticsFields=JSON.stringify(h.map(({meta:m,ref:y})=>({Id:m.id,Type:y.type||"Sum"}))))}let d=iK(t,e,r,n)||(nt(t,"DefaultOrderBy","defaultOrderBy")?void 0:nK(i,r,n));return d&&(a.DefaultOrderBy=d),a}function oK(t,e,r){let n=Xp(_e(e).Tables);for(let i of n){let a=S(i,"Id","id"),o=S(i,"Name","name");if(!a||!o)continue;r?.set(o.toLowerCase(),a);let s=Hr(i,"_Fields","Fields","fields"),c=Array.isArray(s)?Xp(s):[];for(let l of c){let u=S(l,"Id","id"),p=S(l,"Name","name");!u||!p||AP(t,{id:u,name:p,label:S(l,"Label","label")||p,tableId:a,tableName:o,tableDescription:S(i,"Description","description")||o,component:S(l,"Component","component")||"Text",type:S(l,"Type","type")||"varchar(255)"})}}}function IP(t){return Jr(S(t,"component","Component")||"Text")}function sK(t){return`${S(t,"name","Name")} ${S(t,"label","Label")} ${S(t,"component","Component")}`.toLowerCase()}function cK(t,e){let r=sK(t),n=IP(t);return["imgupload","fileupload","richtext","codeeditor","jsontable","tablechild","map","maparea","textarea"].includes(n)||qe(r,["remark","note","content","file","image","attach","map","\u5907\u6CE8","\u8BF4\u660E","\u5185\u5BB9","\u9644\u4EF6","\u56FE\u7247","\u5730\u56FE"])?"attachment":qe(r,["phone","mobile","email","address","city","contact","\u8054\u7CFB\u4EBA","\u7535\u8BDD","\u624B\u673A","\u90AE\u7BB1","\u5730\u5740","\u57CE\u5E02"])?"contact":qe(r,["status","state","type","category","amount","money","price","count","date","time","\u72B6\u6001","\u7C7B\u578B","\u5206\u7C7B","\u91D1\u989D","\u4EF7\u683C","\u6570\u91CF","\u65F6\u95F4","\u65E5\u671F"])?"business":e<8?"basic":"extra"}function RP(t){let e=he(t,"fields","Fields"),r=Hr(t,"tabs","Tabs"),n=new Map,i=ge(t,"column","Column")??(e.length>6?2:void 0);if(r!=null&&r!=="")return{fieldTabs:n,column:i};let a=e.filter(l=>!$P.has(IP(l)));if(a.length<=12)return{fieldTabs:n,column:i};let o={basic:{Name:"\u57FA\u7840\u4FE1\u606F",Icon:"fas fa-id-card",Sort:10},contact:{Name:"\u8054\u7CFB\u4FE1\u606F",Icon:"fas fa-address-book",Sort:20},business:{Name:"\u4E1A\u52A1\u4FE1\u606F",Icon:"fas fa-briefcase",Sort:30},attachment:{Name:"\u9644\u4EF6\u5907\u6CE8",Icon:"fas fa-paperclip",Sort:40},extra:{Name:"\u6269\u5C55\u4FE1\u606F",Icon:"fas fa-layer-group",Sort:50}},s=new Set;return a.forEach((l,u)=>{let p=S(l,"name","Name");if(!p||S(l,"tab","Tab"))return;let d=cK(l,u);n.set(p,d),s.add(d)}),{tabs:["basic","contact","business","attachment","extra"].filter(l=>s.has(l)).map(l=>({Id:l,Name:o[l].Name,Icon:o[l].Icon,Sort:o[l].Sort})),fieldTabs:n,column:i}}function yP(t){let e=[],r=[],n=[],i=he(t,"roles","Roles"),a=he(t,"tables","Tables"),o=he(t,"engines","Engines"),s=he(t,"modules","Modules"),c=he(t,"events","Events"),l=he(t,"dataSources","DataSources"),u=he(t,"pages","Pages"),p=he(t,"printTemplates","PrintTemplates"),d=he(t,"workflows","Workflows"),h=he(t,"jobs","Jobs"),m=he(t,"permissions","Permissions"),y=new Map;return!a.length&&!o.length&&!s.length&&!u.length&&r.push("Manifest \u672A\u58F0\u660E tables/engines/modules/pages\uFF0C\u53EF\u80FD\u4E0D\u662F\u5B8C\u6574\u7CFB\u7EDF\u8BA1\u5212"),i.forEach(g=>n.push(`save_role ${S(g,"name","Name")}`)),a.forEach((g,x)=>{let v=S(g,"name","Name");v||e.push(`tables[${x}].name \u4E0D\u80FD\u4E3A\u7A7A`),mP(g,`tables[${x}]`,e,r),n.push(`create_table ${v||`(index ${x})`}`),RP(g).tabs?.length&&r.push(`table ${v||`(index ${x})`} has many fields; generator will create diy_table.Tabs and assign empty field Tab values automatically`),v&&y.set(v.toLowerCase(),new Set),he(g,"fields","Fields").forEach((E,T)=>{let k=S(E,"name","Name"),$=S(E,"label","Label");k||e.push(`tables[${x}].fields[${T}].name \u4E0D\u80FD\u4E3A\u7A7A`),$||e.push(`tables[${x}].fields[${T}].label \u4E0D\u80FD\u4E3A\u7A7A`),v&&k&&y.get(v.toLowerCase())?.add(k.toLowerCase()),v&&$&&y.get(v.toLowerCase())?.add($.toLowerCase()),n.push(`add_field ${v}.${k}`)});let w=new Set(he(g,"fields","Fields").map(E=>S(E,"name","Name").toLowerCase()).filter(Boolean));["id","createtime","updatetime","createuser","osclient"].forEach(E=>w.add(E)),he(g,"indexes","Indexes").forEach((E,T)=>{let k=Sc(E,"columns","Columns");k.length||e.push(`tables[${x}].indexes[${T}].columns \u81F3\u5C11\u9700\u8981\u4E00\u4E2A\u5B57\u6BB5`);for(let $ of k)w.has($.toLowerCase())||e.push(`tables[${x}].indexes[${T}] references unknown physical field "${$}" on table "${v}"`);k.some(($,N)=>k.findIndex(P=>P.toLowerCase()===$.toLowerCase())!==N)&&e.push(`tables[${x}].indexes[${T}] \u5305\u542B\u91CD\u590D\u5B57\u6BB5`),n.push(`create_index ${v}.${S(E,"name","Name")||k.join("_")}`)})}),l.forEach(g=>n.push(`save_data_source ${S(g,"dataSourceKey","DataSourceKey")}`)),o.forEach((g,x)=>{let v=S(g,"apiEngineKey","ApiEngineKey");v||e.push(`engines[${x}].apiEngineKey \u4E0D\u80FD\u4E3A\u7A7A`),mP(g,`engines[${x}]`,e,r),n.push(`upsert_engine ${v}`)}),c.forEach(g=>n.push(`save_event ${S(g,"formEngineKey","FormEngineKey")}/${S(g,"eventType","EventType")}`)),s.forEach(g=>{let x=_o(g);e.push(...x.errors),r.push(...x.warnings);let v=S(g,"table","tableName","diyTableName","DiyTableName"),b=S(g,"name","Name");if(v&&y.has(v.toLowerCase())){let w=y.get(v.toLowerCase())||new Set,E=[["listFields",dr(g,"listFields","ListFields","tableFields","TableFields","columns","Columns")],["searchFields",dr(g,"searchFields","SearchFields","searchFieldNames","SearchFieldNames")],["sortFields",dr(g,"sortFields","SortFields")],["hiddenFields",dr(g,"hiddenFields","HiddenFields","notShowFieldsByName","NotShowFieldsByName")],["mobileFields",dr(g,"mobileFields","MobileFields")]];for(let[T,k]of E)for(let $ of k)!w.has($.ref.toLowerCase())&&!Hv($.ref)&&e.push(`modules.${b||v}.${T} references unknown field "${$.ref}" on table "${v}"`)}v&&!dr(g,"listFields","ListFields","tableFields","TableFields","columns","Columns").length&&!nt(g,"TableDiyFieldIds","SelectFields")&&r.push(`module ${b||v} has no listFields; generator will use the first business fields from ${v}`),n.push(`create_or_update_module ${S(g,"name","Name")}`)}),m.forEach(g=>n.push(`set_permission ${S(g,"roleId","RoleId")||"admin"}`)),u.forEach((g,x)=>{let v=dn(g.json??g.JsonObj??g.JsonStr??g);e.push(...v.errors.map(b=>`pages[${x}]: ${b}`)),r.push(...v.warnings.map(b=>`pages[${x}]: ${b}`)),n.push(`save_page ${S(g,"title","Title")}`)}),p.forEach((g,x)=>{let v=Qi(g.PageObj??g.pageObj),b=Yi(g.PrintObj??g.printObj);e.push(...v.errors.map(w=>`printTemplates[${x}].PageObj: ${w}`)),r.push(...v.warnings.map(w=>`printTemplates[${x}].PageObj: ${w}`)),e.push(...b.errors.map(w=>`printTemplates[${x}].PrintObj: ${w}`)),r.push(...b.warnings.map(w=>`printTemplates[${x}].PrintObj: ${w}`)),n.push(`save_print_template ${S(g,"title","Title")}`)}),d.forEach((g,x)=>{let v=Jv(g);e.push(...v.errors.map(b=>`workflows[${x}]: ${b}`)),r.push(...v.warnings.map(b=>`workflows[${x}]: ${b}`)),n.push(`save_workflow ${S(_e(g.FlowDesign??g.flowDesign??g),"FlowName","flowName","name")}`)}),h.forEach(g=>n.push(`save_job ${S(g,"jobName","JobName")}`)),{plan:n,errors:e,warnings:r}}function Gv(t){return{flow:_e(t.FlowDesign??t.flowDesign??t),nodes:he(t,"Nodes","nodes"),lines:he(t,"Lines","lines")}}function xo(t){return S(t,"Id","id","NodeId","nodeId")}function ea(t){return S(t,"NodeName","nodeName","Name","name")}function OP(t){return S(t,"NodeType","nodeType","Type","type")}function Zv(t){let e=`${OP(t)} ${ea(t)}`.toLowerCase();return e.includes("start")||e.includes("begin")||e.includes("\u5F00\u59CB")||e.includes("\u53D1\u8D77")}function bP(t){let e=`${OP(t)} ${ea(t)}`.toLowerCase();return e.includes("end")||e.includes("finish")||e.includes("\u7ED3\u675F")||e.includes("\u5B8C\u6210")}function Jv(t){let e=[],r=[],{flow:n,nodes:i,lines:a}=Gv(t),o=S(n,"FlowName","flowName","Name","name"),s=S(n,"TableId","tableId"),c=S(n,"table","tableName","TableName","diyTableName","DiyTableName"),l=new Map,u=new Map,p=new Map;o||e.push("FlowDesign.FlowName \u4E0D\u80FD\u4E3A\u7A7A"),i.length||e.push("Nodes \u81F3\u5C11\u9700\u8981\u5305\u542B\u5F00\u59CB\u3001\u5BA1\u6279/\u4E1A\u52A1\u3001\u7ED3\u675F\u8282\u70B9"),a.length||e.push("Lines \u81F3\u5C11\u9700\u8981\u8FDE\u63A5\u5F00\u59CB\u5230\u4E0B\u4E00\u8282\u70B9"),!s&&!c&&r.push("FlowDesign.TableId \u4E3A\u7A7A\uFF1B\u666E\u901A\u5BA1\u6279\u6D41\u5EFA\u8BAE\u7ED1\u5B9A\u4E1A\u52A1 diy_table"),i.forEach((m,y)=>{let g=xo(m),x=ea(m);g||e.push(`Nodes[${y}].Id/NodeId \u4E0D\u80FD\u4E3A\u7A7A`),x||e.push(`Nodes[${y}].NodeName \u4E0D\u80FD\u4E3A\u7A7A`),g&&(l.has(g)&&e.push(`\u8282\u70B9 Id \u91CD\u590D\uFF1A${g}`),l.set(g,m))}),a.forEach((m,y)=>{let g=S(m,"Id","id","LineId","lineId")||`(index ${y})`,x=S(m,"FromNodeId","fromNodeId"),v=S(m,"ToNodeId","toNodeId");x||e.push(`Lines[${y}].FromNodeId \u4E0D\u80FD\u4E3A\u7A7A`),v||e.push(`Lines[${y}].ToNodeId \u4E0D\u80FD\u4E3A\u7A7A`),x&&!l.has(x)&&e.push(`\u8FDE\u7EBF ${g} \u7684 FromNodeId \u4E0D\u5B58\u5728\uFF1A${x}`),v&&!l.has(v)&&e.push(`\u8FDE\u7EBF ${g} \u7684 ToNodeId \u4E0D\u5B58\u5728\uFF1A${v}`),x===v&&x&&r.push(`\u8FDE\u7EBF ${g} \u6307\u5411\u81EA\u8EAB\uFF0C\u8BF7\u786E\u8BA4\u662F\u5426\u4E3A\u6709\u610F\u5FAA\u73AF`),x&&u.set(x,[...u.get(x)||[],m]),v&&p.set(v,[...p.get(v)||[],m])});let d=i.filter(Zv),h=i.filter(bP);return d.length!==1&&e.push(`\u9700\u8981\u4E14\u4EC5\u9700\u8981 1 \u4E2A\u5F00\u59CB\u8282\u70B9\uFF0C\u5F53\u524D ${d.length} \u4E2A`),h.length<1&&e.push("\u81F3\u5C11\u9700\u8981 1 \u4E2A\u7ED3\u675F\u8282\u70B9"),i.forEach(m=>{let y=xo(m),g=ea(m)||y;if(!y)return;let x=u.get(y)||[],v=p.get(y)||[];!Zv(m)&&v.length===0&&r.push(`\u8282\u70B9 ${g} \u6CA1\u6709\u5165\u7EBF`),!bP(m)&&x.length===0&&r.push(`\u8282\u70B9 ${g} \u6CA1\u6709\u51FA\u7EBF`),x.length>1&&(S(m,"LineValueV8","lineValueV8","V8Code","v8Code")||r.push(`\u8282\u70B9 ${g} \u6709 ${x.length} \u6761\u51FA\u7EBF\uFF0C\u5EFA\u8BAE\u914D\u7F6E LineValueV8\uFF0C\u5E76\u4F18\u5148\u7528 V8.NextNodeId \u6307\u5B9A\u4E0B\u4E00\u8282\u70B9`))}),{ok:e.length===0,errors:e,warnings:r,summary:{flowName:o,tableId:s,table:c,nodeCount:i.length,lineCount:a.length,startNodes:d.map(m=>({id:xo(m),name:ea(m)})),endNodes:h.map(m=>({id:xo(m),name:ea(m)}))}}}function lK(t){let e=t.indexOf(dP);if(e<0)return null;let r=e+dP.length,n=t.indexOf(IH,r);if(n<0)return null;try{return _e(JSON.parse(t.slice(r,n).trim()))}catch{return null}}function vP(t){return t==null||String(t).trim()===""}function xP(t,e){let r=S(t,"field","Field"),n=S(t,"operator","Operator")||"eq",i=Hr(t,"value","Value"),a=r?e[r]:void 0,o=a==null?"":String(a),s=i==null?"":String(i);if(n==="empty")return vP(a);if(n==="notEmpty")return!vP(a);if(n==="contains")return o.includes(s);if(n==="notContains")return!o.includes(s);if(n==="startsWith")return o.startsWith(s);if(n==="endsWith")return s===""||o.endsWith(s);if(["gt","gte","lt","lte"].includes(n)){let c=Number(a),l=Number(i);return Number.isNaN(c)||Number.isNaN(l)?!1:n==="gt"?c>l:n==="gte"?c>=l:n==="lt"?c<l:c<=l}return n==="ne"?o!==s:o===s}function uK(t){let e=_e(t.workflow),r=_e(t.formData),n=S(t,"lineValueV8Code","LineValueV8","code");if(!n&&Object.keys(e).length>0){let{nodes:s}=Gv(e),c=S(t,"nodeId","NodeId"),l=(c?s.find(u=>xo(u)===c):s.find(Zv)||s[0])||{};n=S(l,"LineValueV8","lineValueV8","V8Code","v8Code")}let i=lK(n),a=he(i||{},"routes","Routes");if(!i||a.length===0)return{ok:!1,selectedRoute:null,warnings:["\u672A\u627E\u5230\u56FE\u5F62\u6761\u4EF6\u6807\u8BB0\uFF0CMCP \u4E0D\u6267\u884C\u4EFB\u610F\u624B\u5199 V8\uFF1B\u8BF7\u7528\u56FE\u5F62\u6761\u4EF6\u751F\u6210 LineValueV8 \u540E\u518D\u6D4B\u8BD5\u3002"]};let o=a.find(s=>!!Hr(s,"isDefault","IsDefault"))||null;for(let s of a){if(s===o)continue;let c=he(s,"rules","Rules").filter(u=>S(u,"field","Field"));if(c.length===0)continue;if(S(s,"match","Match")==="any"?c.some(u=>xP(u,r)):c.every(u=>xP(u,r)))return{ok:!0,selectedRoute:s,assignment:wP(s),source:"matched"}}return{ok:!!o,selectedRoute:o,assignment:o?wP(o):null,source:o?"default":"none"}}function wP(t){let e=S(t,"lineValue","LineValue"),r=S(t,"toNodeId","ToNodeId");return e?{LineValue:e}:{NextNodeId:r}}function pK(t,e){let{flow:r,nodes:n,lines:i}=Gv(t),a={...r},o=S(r,"table","tableName","TableName","diyTableName","DiyTableName");if(!S(a,"TableId","tableId")&&o){let u=e.get(o.toLowerCase());u&&(a.TableId=u)}let s=new Map,c=n.map((u,p)=>{let d=xo(u)||`wf_node_${p+1}_${Lv().slice(0,8)}`,h={...u,Id:d},m=ea(h);return m&&s.set(d,m),h}),l=i.map((u,p)=>{let d=S(u,"FromNodeId","fromNodeId"),h=S(u,"ToNodeId","toNodeId"),m=S(u,"LineName","lineName")||`${s.get(d)||d||"\u5F53\u524D\u8282\u70B9"} \u5230 ${s.get(h)||h||"\u4E0B\u4E00\u8282\u70B9"}`;return{...u,Id:S(u,"Id","id","LineId","lineId")||`wf_line_${p+1}_${Lv().slice(0,8)}`,LineName:m}});return{FlowDesign:a,Nodes:c,Lines:l}}async function pr(t,e,r,n){try{await t.writeAuditLog(e,r,JSON.stringify(n).slice(0,6e3))}catch(i){console.error("[microi-mcp] audit log failed:",i instanceof Error?i.message:String(i))}}async function _P(t,e){let r=S(e,"apiEngineKey","ApiEngineKey"),n=S(e,"apiName","ApiName","name","Name")||r,i=S(e,"category","Category")||"AI\u751F\u6210",a=Hr(e,"code","Code","ApiV8Code"),o=typeof a=="string",s=o?String(a):"",c=Kn(e,"v8Unlimited","V8Unlimited"),l=await t.getEngineCode(r);return l.Code===1?!o&&c!==void 0?t.updateEngineRuntimeConfig(r,c):o?t.saveEngineCode(r,s,{functionDescription:S(e,"functionDescription","FunctionDescription")||void 0,changeSummary:S(e,"changeSummary","ChangeSummary")||void 0,v8Unlimited:c}):{Code:1,Data:{ApiEngineKey:r,V8Unlimited:Number(l.Data?.V8Unlimited||0),Skipped:!0},Msg:"\u63A5\u53E3\u5F15\u64CE\u5DF2\u5B58\u5728\uFF0CManifest \u672A\u63D0\u4F9B code \u6216 V8Unlimited\uFF0C\u4FDD\u6301\u539F\u914D\u7F6E"}:t.createEngine({ApiEngineKey:r,ApiName:n,Category:i,Code:s,V8Unlimited:c===void 0?void 0:c?1:0,functionDescription:S(e,"functionDescription","FunctionDescription")||void 0,changeSummary:S(e,"changeSummary","ChangeSummary")||void 0})}function dK(t,e,r,n){let i=S(t,"table","tableName","diyTableName","DiyTableName"),a=_o(t);if(a.errors.length)throw new Error(a.errors.join(`
130
130
  `));let o=S(t,"diyTableId","DiyTableId")||(i?e.get(i.toLowerCase()):""),s=i||S(t,"DiyTableName","diyTableName"),c=n?aK(t,n,o||"",s):{};return mn({...a.data,...c,Name:S(t,"name","Name"),DiyTableId:o,ParentId:S(t,"parentId","ParentId")||(r?r.get(S(t,"parentName","ParentName").toLowerCase()):void 0),ComponentName:S(t,"componentName","ComponentName"),ComponentPath:S(t,"componentPath","ComponentPath"),Display:ge(t,"display","Display")??1,AppDisplay:ge(t,"appDisplay","AppDisplay")??1,OpenType:S(t,"openType","OpenType"),Url:S(t,"url","Url"),Sort:ge(t,"sort","Sort"),Icon:S(t,"icon","Icon"),SearchFieldIds:nt(t,"searchFieldIds","SearchFieldIds")||c.SearchFieldIds,TableDiyFieldIds:nt(t,"tableDiyFieldIds","TableDiyFieldIds")||c.TableDiyFieldIds,SelectFields:nt(t,"selectFields","SelectFields")||c.SelectFields,DefaultOrderBy:nt(t,"DefaultOrderBy")||c.DefaultOrderBy,SqlWhere:S(t,"sqlWhere","SqlWhere"),SqlJoin:S(t,"sqlJoin","SqlJoin"),JoinTables:nt(t,"joinTables","JoinTables"),SortFieldIds:nt(t,"sortFieldIds","SortFieldIds")||c.SortFieldIds,NotShowFields:nt(t,"notShowFields","NotShowFields")||c.NotShowFields,StatisticsFields:nt(t,"statisticsFields","StatisticsFields")||c.StatisticsFields,InTableEdit:ge(t,"inTableEdit","InTableEdit"),InTableEditFields:nt(t,"inTableEditFields","InTableEditFields")||c.InTableEditFields,MobileListFields:nt(t,"mobileListFields","MobileListFields")||c.MobileListFields,CardTitleTagFields:nt(t,"cardTitleTagFields","CardTitleTagFields")||c.CardTitleTagFields,CardBottomTagFields:nt(t,"cardBottomTagFields","CardBottomTagFields")||c.CardBottomTagFields,MenuBadgeEnabled:ge(t,"menuBadgeEnabled","MenuBadgeEnabled"),MenuBadgeApiEngineKey:S(t,"menuBadgeApiEngineKey","MenuBadgeApiEngineKey"),EnableViewSchema:ge(t,"enableViewSchema","EnableViewSchema"),ViewSchemaVersion:S(t,"viewSchemaVersion","ViewSchemaVersion"),ViewConfigVersion:ge(t,"viewConfigVersion","ViewConfigVersion"),ViewSchema:a.data.ViewSchema})}function SP(t){return mn({...t,Id:S(t,"Id","roleId","RoleId")||void 0,Name:S(t,"Name","name"),Level:ge(t,"Level","level"),Sort:ge(t,"Sort","sort"),Remark:S(t,"Remark","remark","description"),DeptIds:S(t,"DeptIds","deptIds"),BaseLimit:S(t,"BaseLimit","baseLimit")})}function EP(t){return mn({...t,Id:S(t,"Id","dataSourceId","DataSourceId")||void 0,DataSourceName:S(t,"DataSourceName","dataSourceName","name","Name"),DataSourceKey:S(t,"DataSourceKey","dataSourceKey"),DataSourceType:S(t,"DataSourceType","dataSourceType")||"V8",SqlDataSource:S(t,"SqlDataSource","sqlDataSource","sql"),V8DataSource:S(t,"V8DataSource","v8DataSource","code"),JsonDataSource:Ec(t.JsonDataSource??t.jsonDataSource??t.json),TestParam:Ec(t.TestParam??t.testParam),DataSourceRole:S(t,"DataSourceRole","dataSourceRole"),AllowAnonymous:ge(t,"AllowAnonymous","allowAnonymous"),IsEnable:ge(t,"IsEnable","isEnable")??1})}function kP(t){let e=Qi(t.PageObj??t.pageObj);if(!e.ok||!e.json)throw new Error(`printTemplates.${S(t,"Title","title")||"(untitled)"} PageObj invalid: ${e.errors.join("; ")}`);let r=Yi(t.PrintObj??t.printObj);if(!r.ok||!r.json)throw new Error(`printTemplates.${S(t,"Title","title")||"(untitled)"} PrintObj invalid: ${r.errors.join("; ")}`);return mn({...t,Id:S(t,"Id","printId","PrintId")||void 0,Title:S(t,"Title","title"),Number:S(t,"Number","number"),Desc:S(t,"Desc","desc","description"),DataApi:S(t,"DataApi","dataApi"),PageObj:e.json,PrintObj:r.json})}function TP(t){return mn({...t,Id:S(t,"Id","jobId","JobId")||void 0,JobName:S(t,"JobName","jobName","name","Name"),CronExpression:S(t,"CronExpression","cronExpression","cron"),JobType:S(t,"JobType","jobType")||"1",ApiEngineKey:S(t,"ApiEngineKey","apiEngineKey"),JobParam:Ec(t.JobParam??t.jobParam??t.params),JobDesc:S(t,"JobDesc","jobDesc","description"),CronDesc:S(t,"CronDesc","cronDesc"),DllName:S(t,"DllName","dllName"),JobPath:S(t,"JobPath","jobPath")})}function fK(t){return{osClient:t,workflow:["Call microi_get_db_schema first to inspect existing tables.","Call microi_get_manifest_schema to draft a manifest from the user requirement.","Call microi_plan_system with the manifest and fix all errors.","Call microi_generate_system with dryRun=true.",`Call microi_generate_system with dryRun=false and confirmExecution="${t||"EXECUTE"}" only after the user confirms writes.`,"Call microi_validate_system after generation if you need an independent validation pass."],manifestShape:{name:"System name",roles:[{name:"Admin",level:999}],tables:[{name:"Biz_Order",description:"Order main table",v8Unlimited:!1,tabs:[{Id:"basic",Name:"Basic Info",Sort:10},{Id:"business",Name:"Business Info",Sort:20}],fields:[{name:"OrderNo",label:"Order No",type:"varchar(50)",component:"AutoNumber",tab:"basic",configSource:{sourceType:"AutoNumber",prefix:"ORD",length:6},notEmpty:1,unique:1,tableWidth:160,sort:10},{name:"CustomerName",label:"Customer",type:"varchar(100)",component:"Text",tab:"basic",notEmpty:1,tableWidth:160,sort:20},{name:"Status",label:"Status",type:"varchar(50)",component:"Select",tab:"business",configSource:{sourceType:"KeyValue",items:[{Key:"Draft",Value:"Draft"},{Key:"Submitted",Value:"Submitted"}]},sort:30}],indexes:[{name:"uk_biz_order_osclient_orderno",columns:["OsClient","OrderNo"],unique:!0,purpose:"Tenant-scoped order number invariant"},{name:"idx_biz_order_osclient_status_createtime",columns:["OsClient","Status","CreateTime"],unique:!1,purpose:"Status list ordered by creation time"}]}],engines:[{apiEngineKey:"biz_order_submit",apiName:"Submit order",category:"Biz_Order",v8Unlimited:!1,code:"return { Code: 1, Data: V8.Param };"},{apiEngineKey:"biz_order_metrics",apiName:"Order metrics",category:"Biz_Order",code:["var result = V8.FormEngine.GetTableData('Biz_Order', {"," _Where: [['Status', '=', 'Submitted']],"," _SelectFields: ['Id'],"," _PageIndex: 1,"," _PageSize: 1","});","if (result.Code !== 1) return result;","var count = result.DataCount || 0;","return { Code: 1, Data: { Value: count, Pending: count } };"].join(`
131
- `)}],events:[{formEngineKey:"Biz_Order",eventType:"SubmitBeforeServerV8",code:"if (!V8.Form.OrderNo) return { Code: 0, Msg: 'OrderNo required' };"}],modules:[{name:"Orders",table:"Biz_Order",icon:"Document",listFields:["OrderNo","CustomerName","Status","CreateTime"],searchFields:["OrderNo","CustomerName","Status"],sortFields:["CreateTime"],defaultOrderBy:[{field:"CreateTime",type:"DESC"}],menuBadgeEnabled:1,menuBadgeApiEngineKey:"biz_order_metrics",enableViewSchema:1,viewSchemaVersion:"1.0",viewConfigVersion:1,viewSchema:{Views:[{Scene:"List",Device:"PC",Priority:100,Layout:{Hero:{Title:"Orders",Metrics:[{Key:"pending",Label:"Pending",ApiEngineKey:"biz_order_metrics",ValuePath:"Data.Pending",Tone:"warning"}]},List:{Density:"Comfortable",Columns:[{Field:"OrderNo",Lines:[{Name:"CustomerName",Label:"Customer",ShowLabel:!0,Tone:"info"}],TrailingFields:[{Name:"Status",DisplayStyle:"Tag"}],RequiredFields:["CustomerName","Status"]}]}}},{Scene:"Detail",Device:"All",Priority:100,Layout:{Hero:{Title:"Order Detail",TitleField:"OrderNo",StatusField:"Status"},Blocks:[{Type:"ResponsiveSection",Title:"Order Info",Fields:["OrderNo","CustomerName","Status"]}]}},{Scene:"Card",Device:"Mobile",Priority:100,Layout:{Card:{AvatarTextField:"CustomerName",TitleField:"OrderNo",SubtitleFields:["CustomerName"],StatusField:"Status",TopFields:[{Name:"Status",DisplayStyle:"Tag"}],RightFields:[{Name:"Amount",Format:"currency",Tone:"danger"}],Fields:[{Name:"CustomerName",Label:"Customer"},{Name:"CreateTime",Label:"Created At",Format:"datetime"}],MetaFields:[{Name:"CreateTime",Label:"Created At",Format:"datetime"}],BottomFields:[{Name:"Status",DisplayStyle:"Tag"}]}}}]},moreBtns:[{Name:"Submit",BtnStyle:"primary",V8CodeShow:"V8.Result=V8.Form.Status=='Draft';",V8Code:"var r=await V8.ApiEngine.Run({ApiEngineKey:'biz_order_submit',Id:V8.Form.Id});V8.Result=r;"}]}],permissions:[{roleId:"admin",moduleNames:["Orders"]}],dataSources:[],pages:[{title:"Operations Dashboard",number:"page_operations_dashboard",routePath:"/page/operations-dashboard",JsonObj:{formConfig:{gutter:0,mask:!1,drag:!1,hover:!1,shadow:!0,link:!0,dark:!1,dynamicStyle:{padding:"12px 0 0 0",backgroundColor:"#f3f4f6",opacity:1}},wrapperList:[{type:"pannel",label:"Card",wrapperOption:{span:24,height:180,titleOption:{hidden:!0,title:"Core Metrics"}},widgetList:[]}]}}],printTemplates:[{title:"Business Print Template",number:"print_business_template",PageObj:{panels:[{index:0,name:"A4 Template",paperType:"A4",height:297,width:210,paperHeader:0,paperFooter:841.8897637795277,printElements:[]}]},PrintObj:{}}],workflows:[{FlowDesign:{FlowName:"Order approval",TableId:"<Biz_Order table id or tableName-resolved id>",IsEnable:1},Nodes:[{Id:"start",NodeName:"\u53D1\u8D77\u4EBA",NodeType:"Start",AllowSelectUsers:0,PositionLeft:80,PositionTop:160,LineValueV8:""},{Id:"manager",NodeName:"\u90E8\u95E8\u7ECF\u7406\u5BA1\u6279",NodeType:"Approve",Roles:"Manager",AllowSelectUsers:1,PositionLeft:320,PositionTop:160},{Id:"end",NodeName:"\u7ED3\u675F",NodeType:"End",PositionLeft:560,PositionTop:160}],Lines:[{Id:"line_start_manager",FromNodeId:"start",ToNodeId:"manager",LineName:"\u53D1\u8D77\u4EBA \u5230 \u90E8\u95E8\u7ECF\u7406\u5BA1\u6279",LineValue:""},{Id:"line_manager_end",FromNodeId:"manager",ToNodeId:"end",LineName:"\u90E8\u95E8\u7ECF\u7406\u5BA1\u6279 \u5230 \u7ED3\u675F",LineValue:""}]}],jobs:[]},naturalFieldKeys:{tables:{tabs:"diy_table.Tabs form groups. When omitted and the table has more than 12 business fields, generator creates Basic/Contact/Business/Attachment/Extra tabs and assigns empty field tab values.",column:"Form column count. Omit to use 2 columns for generated systems unless the user asks for a single-column form.",indexes:"Physical database indexes. Declare ordered columns and unique. Required indexes must be created by microi_create_table_index or manifest generation, never by ad-hoc SQL. Tenant tables should usually lead with OsClient.",v8Unlimited:"Default false. Set true only when this table's backend V8 events must keep one database transaction and the user explicitly accepts unbounded Jint per-execution budgets. Process resident-memory protection remains active."},engines:{v8Unlimited:"Default false. Explicit high-risk opt-in for one API engine. It does not inherit to nested API engines; each child must opt in separately. Omit to preserve an existing engine setting during upsert."},fields:{component:"Use the real Microi component name. Available controls include Text, Textarea, NumberText, DateTime, Select, MultipleSelect, Radio, Checkbox, Switch, Rate, Progress, Slider, ColorPicker, AutoNumber, Divider, CollapseGroup, Tabs, Alert, StaticText, Html, RichText, CodeEditor, JsonTable, ImgUpload, FileUpload, Autocomplete, TagInput, Transfer, Cascader, Address, Department, SelectTree, TreeCheckbox, OpenTable, JoinTable, JoinForm, TableChild, Map, MapArea, Qrcode, FontAwesome, DevComponent.",tab:"Assign a field to a diy_table.Tabs Id/Name. For many fields, prefer table-level Tabs; use CollapseGroup or field component Tabs only when an in-page section needs collapsible or nested grouping."},modules:{table:"Bind by table name. The generator resolves the table Id after create/refresh schema.",listFields:"Field names/labels/ids for grid columns. Produces TableDiyFieldIds and SelectFields. When omitted, generator chooses title/no/status/person/amount/time fields.",searchFields:"Field names/labels/ids for search controls. Produces SearchFieldIds object array. When omitted, generator chooses title/no/status/type/category/person/time fields.",sortFields:"Field names/labels/ids for sortable fields. Produces SortFieldIds. When omitted, generator chooses date/time, Sort and numeric business fields.",hiddenFields:"Field names/labels/ids to hide. Produces NotShowFields. When omitted, generator hides Id-like fields, foreign keys, system fields and layout/large controls.",editableFields:"Field names/labels/ids for in-table editing. Produces InTableEditFields.",mobileFields:"Field names/labels/ids for mobile card list. Produces MobileListFields. When omitted, generator picks 3-4 compact title/status/summary fields.",cardTitleFields:"Field names/labels/ids for card title tags. Produces CardTitleTagFields. When omitted, generator picks status/type/category fields.",cardBottomFields:"Field names/labels/ids for card bottom tags. Produces CardBottomTagFields. When omitted, generator picks amount/count/date fields.",statisticsFields:"Field names/labels/ids for table footer statistics. When omitted, generator sums amount/price/count/point/balance numeric fields.",menuBadgeEnabled:"Set to 1 for important menus that need a sidebar statistic badge.",menuBadgeApiEngineKey:"API engine used by the sidebar statistic badge. Return {Code:1,Data:{Value:number}}; keep the query tenant-scoped and inexpensive.",enableViewSchema:"Set to 1 to enable the versioned cross-client view protocol stored in physical sys_menu columns.",viewSchema:"Versioned Detail/Edit/List/Card layouts for PC/Mobile/All. Layout.List supports multi-line columns and trailing fields; Layout.Card supports top/right/body/meta/bottom field groups. The full declarative object is preserved. Use ActionSchema only; never place arbitrary client V8Code in mobile actions."}},rules:["Use table and field names in manifests; do not ask the user for diy_field ids.","Put business logic in API engines and call them from menu button V8Code.",'For workflow manifests, include exactly one start node, at least one end node, valid FromNodeId/ToNodeId lines, and stable LineName values in the form "{from node} \u5230 {to node}".',"For multi-route workflow nodes, generate LineValueV8 with the visual condition marker and prefer assigning V8.NextNodeId; then call microi_check_workflow_package and microi_test_workflow_condition before microi_save_workflow_package.","Use parameterized V8.Db SQL or V8.FormEngine CRUD in engine/event code.","Never infer v8Unlimited=true from data volume alone. Enable it only for an explicit single-transaction requirement after warning about database locks, rollback cost, connection timeout and process memory; the resident-memory guard remains active.","Leave diy_field.FormWidth null/omitted for normal fields; use formWidth: 24 only for full-row controls such as CodeEditor, Textarea, RichText, upload, TableChild, map/layout/custom components.","Do not leave sys_menu list configuration empty. If the user does not specify it, rely on the generator defaults for NotShowFields, SearchFieldIds, SortFieldIds, StatisticsFields, MobileListFields, CardTitleTagFields and CardBottomTagFields.","Do not use diy_table.DiyConfig, diy_field.DiyConfig or sys_menu.DiyConfig for new configuration. Add dedicated physical columns and expose them through DIY metadata.","For forms with many fields, use diy_table.Tabs first. Use CollapseGroup for optional/secondary sections and field component Tabs for nested in-page grouping.","Use dryRun=true until the user explicitly asks to write.","For Page Engine pages, save only the JsonObj layer to mic_page.JsonObj: {formConfig, wrapperList}. Do not wrap it in formData.","For Print Engine templates, PageObj must be a hiprint object with panels[].printElements; PrintObj is sample/runtime data.","For natural-language UI or print design, prefer microi_build_page_design or microi_build_print_template_design, then save after confirmation."]}}function NP(t,e,r){let n=r.osClient,i=n||"EXECUTE";t.tool("microi_get_manifest_schema","Return the recommended full-system manifest schema for natural-language Microi generation, including field-name based module configuration.",{},async()=>Q(JSON.stringify(fK(n),null,2))),t.tool("microi_validate_menu_buttons","Validate and normalize sys_menu button/tab JSON arrays (MoreBtns/FormBtns/BatchSelectMoreBtns/PageTabs/ExportMoreBtns/PageBtns). Returns canonical JSON strings with generated Id/Sort/default visibility.",{moreBtns:f.unknown().optional(),formBtns:f.unknown().optional(),batchSelectMoreBtns:f.unknown().optional(),pageTabs:f.unknown().optional(),exportMoreBtns:f.unknown().optional(),pageBtns:f.unknown().optional()},async s=>{let c=_o(s);return Q(JSON.stringify({ok:c.errors.length===0,...c},null,2),c.errors.length>0)}),t.tool("microi_build_field_config",`Build and validate Microi diy_field Data/Config JSON for option controls, SQL/APIEngine/DataSource sources, JoinForm, AutoNumber and DateTime. OsClient: ${n}`,{sourceType:f.enum(["Data","KeyValue","Sql","ApiEngine","DataSource","AutoNumber","JoinForm","DateTime"]).describe("Config source type"),options:Pt.optional().describe("Source options, such as data/options, sql, apiEngineKey, dataSourceId, tableId, prefix, length")},async({sourceType:s,options:c})=>{let l=hP(s,c||{});return Q(JSON.stringify({ok:l.warnings.length===0,...l,configJson:JSON.stringify(l.config)},null,2))}),t.tool("microi_plan_system","Create a dry-run execution plan for a full low-code system manifest. This performs local structural validation only and does not write to Microi.",{manifest:Pt.describe("System manifest with tables, engines, modules, permissions, pages, dataSources, printTemplates, workflows, jobs")},async({manifest:s})=>{let c=yP(s);return Q(JSON.stringify({ok:c.errors.length===0,dryRun:!0,...c},null,2),c.errors.length>0)}),t.tool("microi_check_workflow_package","Validate a wf_flowdesign + wf_node + wf_line workflow package locally before saving. Checks topology, node ids, line endpoints, start/end nodes and multi-route condition setup.",{workflow:Pt.describe("Workflow package with FlowDesign, Nodes and Lines")},async({workflow:s})=>{let c=Jv(s);return Q(JSON.stringify(c,null,2),!c.ok)}),t.tool("microi_test_workflow_condition","Test a workflow LineValueV8 generated by the visual condition designer against sample formData. For safety this only evaluates Microi visual-condition marker JSON, not arbitrary hand-written V8.",{workflow:Pt.optional().describe("Optional workflow package; when provided the tool reads the selected node LineValueV8"),nodeId:f.string().optional().describe("Node Id whose LineValueV8 should be tested. If omitted, uses the start node or first node."),lineValueV8Code:f.string().optional().describe("Direct LineValueV8 JavaScript code containing MICROI_WF_LINE_CONDITION_JSON marker"),formData:Pt.optional().describe("Sample business form data used for rule evaluation")},async s=>Q(JSON.stringify(uK(s),null,2))),t.tool("microi_validate_system",`Validate that a generated low-code system exists on Microi server after generation. OsClient: ${n}`,{manifest:Pt.describe("The same manifest used by microi_generate_system")},async({manifest:s})=>{try{let c=await e.validateLowCodeSystem(s);return ht("Low-Code System Validation",c)}catch(c){return Q(`Error: ${c instanceof Error?c.message:String(c)}`,!0)}}),t.tool("microi_generate_system",`Generate a complete Microi low-code system from a manifest. Supports dryRun execution plans and post-generation validation. Writes require confirmExecution="${i}". OsClient: ${n}`,{manifest:Pt.describe("System manifest with tables, fields, dataSources, engines, events, modules, permissions, pages, printTemplates, workflows and jobs"),dryRun:f.boolean().optional().describe("Default true. When true, only returns an execution plan."),confirmExecution:f.string().optional().describe(`Required when dryRun=false. Must equal "${i}".`)},async({manifest:s,dryRun:c=!0,confirmExecution:l})=>{let u=yP(s);if(u.errors.length>0)return Q(JSON.stringify({ok:!1,...u},null,2),!0);if(c)return Q(JSON.stringify({ok:!0,dryRun:!0,...u},null,2));if(l!==i)return Q(`\u5199\u5165\u5DF2\u62E6\u622A\uFF1A\u8BF7\u91CD\u65B0\u8C03\u7528\u5E76\u4F20 confirmExecution="${i}"\u3002
131
+ `)}],events:[{formEngineKey:"Biz_Order",eventType:"SubmitBeforeServerV8",code:"if (!V8.Form.OrderNo) return { Code: 0, Msg: 'OrderNo required' };"}],modules:[{name:"Orders",table:"Biz_Order",icon:"Document",listFields:["OrderNo","CustomerName","Status","CreateTime"],searchFields:["OrderNo","CustomerName","Status"],sortFields:["CreateTime"],defaultOrderBy:[{field:"CreateTime",type:"DESC"}],menuBadgeEnabled:1,menuBadgeApiEngineKey:"biz_order_metrics",enableViewSchema:1,viewSchemaVersion:"1.0",viewConfigVersion:1,viewSchema:{Views:[{Scene:"List",Device:"PC",Priority:100,Layout:{Hero:{Title:"Orders",Metrics:[{Key:"pending",Label:"Pending",ApiEngineKey:"biz_order_metrics",ValuePath:"Data.Pending",Tone:"warning"}]},List:{Density:"Comfortable",Columns:[{Field:"OrderNo",Lines:[{Name:"CustomerName",Label:"Customer",ShowLabel:!0,Tone:"info"}],TrailingFields:[{Name:"Status",DisplayStyle:"Tag"}],RequiredFields:["CustomerName","Status"]}]}}},{Scene:"Detail",Device:"All",Priority:100,Layout:{Hero:{Title:"Order Detail",TitleField:"OrderNo",StatusField:"Status"},Blocks:[{Type:"ResponsiveSection",Title:"Order Info",Fields:["OrderNo","CustomerName","Status"]}]}},{Scene:"Card",Device:"Mobile",Priority:100,Layout:{Card:{AvatarTextField:"CustomerName",TitleField:"OrderNo",SubtitleFields:["CustomerName"],StatusField:"Status",TopFields:[{Name:"Status",DisplayStyle:"Tag"}],RightFields:[{Name:"Amount",Format:"currency",Tone:"danger"}],Fields:[{Name:"CustomerName",Label:"Customer"},{Name:"CreateTime",Label:"Created At",Format:"datetime"}],MetaFields:[{Name:"CreateTime",Label:"Created At",Format:"datetime"}],BottomFields:[{Name:"Status",DisplayStyle:"Tag"}]}}}]},moreBtns:[{Name:"Submit",BtnStyle:"primary",V8CodeShow:"V8.Result=V8.Form.Status=='Draft';",V8Code:"var r=await V8.ApiEngine.Run({ApiEngineKey:'biz_order_submit',Id:V8.Form.Id});V8.Result=r;"}]}],permissions:[{roleId:"admin",moduleNames:["Orders"]}],dataSources:[],pages:[{title:"Operations Dashboard",number:"page_operations_dashboard",routePath:"/page/operations-dashboard",JsonObj:{formConfig:{gutter:0,mask:!1,drag:!1,hover:!1,shadow:!0,link:!0,dark:!1,dynamicStyle:{padding:"12px 0 0 0",backgroundColor:"#f3f4f6",opacity:1}},wrapperList:[{type:"pannel",label:"Card",wrapperOption:{span:24,height:180,titleOption:{hidden:!0,title:"Core Metrics"}},widgetList:[]}]}}],printTemplates:[{title:"Business Print Template",number:"print_business_template",PageObj:{panels:[{index:0,name:"A4 Template",paperType:"A4",height:297,width:210,paperHeader:0,paperFooter:841.8897637795277,printElements:[]}]},PrintObj:{}}],workflows:[{FlowDesign:{FlowName:"Order approval",TableId:"<Biz_Order table id or tableName-resolved id>",IsEnable:1},Nodes:[{Id:"start",NodeName:"\u53D1\u8D77\u4EBA",NodeType:"Start",AllowSelectUsers:0,PositionLeft:80,PositionTop:160,LineValueV8:""},{Id:"manager",NodeName:"\u90E8\u95E8\u7ECF\u7406\u5BA1\u6279",NodeType:"Approve",Roles:"Manager",AllowSelectUsers:1,PositionLeft:320,PositionTop:160},{Id:"end",NodeName:"\u7ED3\u675F",NodeType:"End",PositionLeft:560,PositionTop:160}],Lines:[{Id:"line_start_manager",FromNodeId:"start",ToNodeId:"manager",LineName:"\u53D1\u8D77\u4EBA \u5230 \u90E8\u95E8\u7ECF\u7406\u5BA1\u6279",LineValue:""},{Id:"line_manager_end",FromNodeId:"manager",ToNodeId:"end",LineName:"\u90E8\u95E8\u7ECF\u7406\u5BA1\u6279 \u5230 \u7ED3\u675F",LineValue:""}]}],jobs:[]},naturalFieldKeys:{tables:{tabs:"diy_table.Tabs form groups. When omitted and the table has more than 12 business fields, generator creates Basic/Contact/Business/Attachment/Extra tabs and assigns empty field tab values.",column:"Form column count. Omit to use 2 columns for generated systems unless the user asks for a single-column form.",indexes:"Physical database indexes. Declare ordered columns and unique. Required indexes must be created by microi_create_table_index or manifest generation, never by ad-hoc SQL. Tenant tables should usually lead with OsClient.",v8Unlimited:"Default false. Set true only when this table's backend V8 events must keep one database transaction and the user explicitly accepts unbounded Jint per-execution budgets. Process resident-memory protection remains active."},engines:{v8Unlimited:"Default false. Explicit high-risk opt-in for one API engine. It does not inherit to nested API engines; each child must opt in separately. Omit to preserve an existing engine setting during upsert."},fields:{component:"Use the real Microi component name. Available controls include Text, Textarea, NumberText, DateTime, Select, MultipleSelect, Radio, Checkbox, Switch, Rate, Progress, Slider, ColorPicker, AutoNumber, Divider, CollapseGroup, Tabs, Alert, StaticText, Html, RichText, CodeEditor, JsonTable, ImgUpload, FileUpload, Autocomplete, TagInput, Transfer, Cascader, Address, Department, SelectTree, TreeCheckbox, OpenTable, JoinTable, JoinForm, TableChild, Map, MapArea, Qrcode, FontAwesome, DevComponent.",tab:"Assign a field to a diy_table.Tabs Id/Name. For many fields, prefer table-level Tabs; use CollapseGroup or field component Tabs only when an in-page section needs collapsible or nested grouping."},modules:{table:"Bind by table name. The generator resolves the table Id after create/refresh schema.",listFields:"Field names/labels/ids for grid columns. Produces TableDiyFieldIds and SelectFields. When omitted, generator chooses title/no/status/person/amount/time fields.",searchFields:"Field names/labels/ids for search controls. Produces SearchFieldIds object array. When omitted, generator chooses title/no/status/type/category/person/time fields.",sortFields:"Field names/labels/ids for sortable fields. Produces SortFieldIds. When omitted, generator chooses date/time, Sort and numeric business fields.",hiddenFields:"Field names/labels/ids to hide. Produces NotShowFields. When omitted, generator hides Id-like fields, foreign keys, system fields and layout/large controls.",editableFields:"Field names/labels/ids for in-table editing. Produces InTableEditFields.",mobileFields:"Field names/labels/ids for mobile card list. Produces MobileListFields. When omitted, generator picks 3-4 compact title/status/summary fields.",cardTitleFields:"Field names/labels/ids for card title tags. Produces CardTitleTagFields. When omitted, generator picks status/type/category fields.",cardBottomFields:"Field names/labels/ids for card bottom tags. Produces CardBottomTagFields. When omitted, generator picks amount/count/date fields.",statisticsFields:"Field names/labels/ids for table footer statistics. When omitted, generator sums amount/price/count/point/balance numeric fields.",menuBadgeEnabled:"Set to 1 for important menus that need a sidebar statistic badge.",menuBadgeApiEngineKey:"API engine used by the sidebar statistic badge. Return {Code:1,Data:{Value:number}}; keep the query tenant-scoped and inexpensive.",enableViewSchema:"Set to 1 only when Detail/Edit should use custom form views. Configured List/Card presentation is always applied and does not depend on this switch.",viewSchemaVersion:"Optional protocol version. Blank or omitted values resolve to 1.0.",viewConfigVersion:"Optional monotonic configuration version. Omitted values resolve to 1 and later changes increment it.",viewSchema:"Versioned Detail/Edit/List/Card layouts for PC/Mobile/All. Layout.List supports multi-line columns and trailing fields; Layout.Card supports top/right/body/meta/bottom field groups. The full declarative object is preserved. Use ActionSchema only; never place arbitrary client V8Code in mobile actions."}},rules:["Use table and field names in manifests; do not ask the user for diy_field ids.","Put business logic in API engines and call them from menu button V8Code.",'For workflow manifests, include exactly one start node, at least one end node, valid FromNodeId/ToNodeId lines, and stable LineName values in the form "{from node} \u5230 {to node}".',"For multi-route workflow nodes, generate LineValueV8 with the visual condition marker and prefer assigning V8.NextNodeId; then call microi_check_workflow_package and microi_test_workflow_condition before microi_save_workflow_package.","Use parameterized V8.Db SQL or V8.FormEngine CRUD in engine/event code.","Never infer v8Unlimited=true from data volume alone. Enable it only for an explicit single-transaction requirement after warning about database locks, rollback cost, connection timeout and process memory; the resident-memory guard remains active.","Leave diy_field.FormWidth null/omitted for normal fields; use formWidth: 24 only for full-row controls such as CodeEditor, Textarea, RichText, upload, TableChild, map/layout/custom components.","Do not leave sys_menu list configuration empty. If the user does not specify it, rely on the generator defaults for NotShowFields, SearchFieldIds, SortFieldIds, StatisticsFields, MobileListFields, CardTitleTagFields and CardBottomTagFields.","Do not use diy_table.DiyConfig, diy_field.DiyConfig or sys_menu.DiyConfig for new configuration. Add dedicated physical columns and expose them through DIY metadata.","For forms with many fields, use diy_table.Tabs first. Use CollapseGroup for optional/secondary sections and field component Tabs for nested in-page grouping.","Use dryRun=true until the user explicitly asks to write.","For Page Engine pages, save only the JsonObj layer to mic_page.JsonObj: {formConfig, wrapperList}. Do not wrap it in formData.","For Print Engine templates, PageObj must be a hiprint object with panels[].printElements; PrintObj is sample/runtime data.","For natural-language UI or print design, prefer microi_build_page_design or microi_build_print_template_design, then save after confirmation."]}}function NP(t,e,r){let n=r.osClient,i=n||"EXECUTE";t.tool("microi_get_manifest_schema","Return the recommended full-system manifest schema for natural-language Microi generation, including field-name based module configuration.",{},async()=>Q(JSON.stringify(fK(n),null,2))),t.tool("microi_validate_menu_buttons","Validate and normalize sys_menu button/tab JSON arrays (MoreBtns/FormBtns/BatchSelectMoreBtns/PageTabs/ExportMoreBtns/PageBtns). Returns canonical JSON strings with generated Id/Sort/default visibility.",{moreBtns:f.unknown().optional(),formBtns:f.unknown().optional(),batchSelectMoreBtns:f.unknown().optional(),pageTabs:f.unknown().optional(),exportMoreBtns:f.unknown().optional(),pageBtns:f.unknown().optional()},async s=>{let c=_o(s);return Q(JSON.stringify({ok:c.errors.length===0,...c},null,2),c.errors.length>0)}),t.tool("microi_build_field_config",`Build and validate Microi diy_field Data/Config JSON for option controls, SQL/APIEngine/DataSource sources, JoinForm, AutoNumber and DateTime. OsClient: ${n}`,{sourceType:f.enum(["Data","KeyValue","Sql","ApiEngine","DataSource","AutoNumber","JoinForm","DateTime"]).describe("Config source type"),options:Pt.optional().describe("Source options, such as data/options, sql, apiEngineKey, dataSourceId, tableId, prefix, length")},async({sourceType:s,options:c})=>{let l=hP(s,c||{});return Q(JSON.stringify({ok:l.warnings.length===0,...l,configJson:JSON.stringify(l.config)},null,2))}),t.tool("microi_plan_system","Create a dry-run execution plan for a full low-code system manifest. This performs local structural validation only and does not write to Microi.",{manifest:Pt.describe("System manifest with tables, engines, modules, permissions, pages, dataSources, printTemplates, workflows, jobs")},async({manifest:s})=>{let c=yP(s);return Q(JSON.stringify({ok:c.errors.length===0,dryRun:!0,...c},null,2),c.errors.length>0)}),t.tool("microi_check_workflow_package","Validate a wf_flowdesign + wf_node + wf_line workflow package locally before saving. Checks topology, node ids, line endpoints, start/end nodes and multi-route condition setup.",{workflow:Pt.describe("Workflow package with FlowDesign, Nodes and Lines")},async({workflow:s})=>{let c=Jv(s);return Q(JSON.stringify(c,null,2),!c.ok)}),t.tool("microi_test_workflow_condition","Test a workflow LineValueV8 generated by the visual condition designer against sample formData. For safety this only evaluates Microi visual-condition marker JSON, not arbitrary hand-written V8.",{workflow:Pt.optional().describe("Optional workflow package; when provided the tool reads the selected node LineValueV8"),nodeId:f.string().optional().describe("Node Id whose LineValueV8 should be tested. If omitted, uses the start node or first node."),lineValueV8Code:f.string().optional().describe("Direct LineValueV8 JavaScript code containing MICROI_WF_LINE_CONDITION_JSON marker"),formData:Pt.optional().describe("Sample business form data used for rule evaluation")},async s=>Q(JSON.stringify(uK(s),null,2))),t.tool("microi_validate_system",`Validate that a generated low-code system exists on Microi server after generation. OsClient: ${n}`,{manifest:Pt.describe("The same manifest used by microi_generate_system")},async({manifest:s})=>{try{let c=await e.validateLowCodeSystem(s);return ht("Low-Code System Validation",c)}catch(c){return Q(`Error: ${c instanceof Error?c.message:String(c)}`,!0)}}),t.tool("microi_generate_system",`Generate a complete Microi low-code system from a manifest. Supports dryRun execution plans and post-generation validation. Writes require confirmExecution="${i}". OsClient: ${n}`,{manifest:Pt.describe("System manifest with tables, fields, dataSources, engines, events, modules, permissions, pages, printTemplates, workflows and jobs"),dryRun:f.boolean().optional().describe("Default true. When true, only returns an execution plan."),confirmExecution:f.string().optional().describe(`Required when dryRun=false. Must equal "${i}".`)},async({manifest:s,dryRun:c=!0,confirmExecution:l})=>{let u=yP(s);if(u.errors.length>0)return Q(JSON.stringify({ok:!1,...u},null,2),!0);if(c)return Q(JSON.stringify({ok:!0,dryRun:!0,...u},null,2));if(l!==i)return Q(`\u5199\u5165\u5DF2\u62E6\u622A\uFF1A\u8BF7\u91CD\u65B0\u8C03\u7528\u5E76\u4F20 confirmExecution="${i}"\u3002
132
132
 
133
133
  ${JSON.stringify({plan:u.plan,warnings:u.warnings},null,2)}`,!0);let p=[],d=new Map,h=new Map,m=new Map,y=OH();try{await pr(e,"microi_generate_system:start",S(s,"name","Name")||"manifest",s);for(let v of he(s,"roles","Roles")){let b=SP(v),w=await e.saveRole(b),E=S(b,"Name");if(p.push({step:"saveRole",roleName:E,response:w}),w.Code!==1)return Q(JSON.stringify({ok:!1,failedAt:"saveRole",role:b,response:w,results:p},null,2),!0);let T=S(_e(w.Data),"Id","RoleId");E&&T&&m.set(E.toLowerCase(),T)}for(let v of he(s,"tables","Tables")){let b=S(v,"name","Name"),w=RP(v),E=await e.createTable(b,S(v,"description","Description"),{Tabs:Ec(v.tabs??v.Tabs??w.tabs),IsTree:ge(v,"isTree","IsTree"),Column:ge(v,"column","Column")??w.column??2,FormOpenType:S(v,"formOpenType","FormOpenType"),FormOpenWidth:S(v,"formOpenWidth","FormOpenWidth"),V8Unlimited:Kn(v,"v8Unlimited","V8Unlimited")===void 0?void 0:Kn(v,"v8Unlimited","V8Unlimited")?1:0});if(p.push({step:"createTable",tableName:b,response:E}),E.Code!==1)return Q(JSON.stringify({ok:!1,failedAt:"createTable",tableName:b,response:E,results:p},null,2),!0);let T=S(_e(E.Data),"TableId","Id");T&&d.set(b.toLowerCase(),T);for(let k of he(v,"fields","Fields")){let $=_e(k.configSource??k.ConfigSource),N=S($,"sourceType")?hP(S($,"sourceType"),$):void 0,P=mn({TableId:T,Name:S(k,"name","Name"),Label:S(k,"label","Label"),Type:S(k,"type","Type"),Component:S(k,"component","Component"),Visible:ge(k,"visible","Visible")??1,AppVisible:ge(k,"appVisible","AppVisible")??1,Tab:S(k,"tab","Tab")||w.fieldTabs.get(S(k,"name","Name")),TableWidth:ge(k,"tableWidth","TableWidth"),Sort:ge(k,"sort","Sort"),Readonly:ge(k,"readonly","Readonly"),NotEmpty:ge(k,"notEmpty","NotEmpty"),Unique:ge(k,"unique","Unique"),DefaultValue:S(k,"defaultValue","DefaultValue"),Placeholder:S(k,"placeholder","Placeholder"),FormWidth:ge(k,"formWidth","FormWidth"),Data:N?.data??S(k,"data","Data"),Config:N?JSON.stringify(N.config):Ec(k.config??k.Config),Description:S(k,"description","Description"),Encrypt:ge(k,"encrypt","Encrypt"),InTableEdit:ge(k,"inTableEdit","InTableEdit")}),F=await e.addField(P);if(p.push({step:"addField",tableName:b,fieldName:S(k,"name","Name"),response:F}),F.Code!==1)return Q(JSON.stringify({ok:!1,failedAt:"addField",tableName:b,field:k,response:F,results:p},null,2),!0);let oe=S(_e(F.Data),"FieldId","Id"),ye=S(P,"Name");oe&&ye&&AP(y,{id:oe,name:ye,label:S(P,"Label")||ye,tableId:T,tableName:b,tableDescription:S(v,"description","Description")||b,component:S(P,"Component")||"Text",type:S(P,"Type")||"varchar(255)"})}for(let k of he(v,"indexes","Indexes")){let $=Sc(k,"columns","Columns"),N=S(k,"name","Name"),P=await e.createTableIndex({TableName:b,IndexName:N||void 0,Columns:$,Unique:Kn(k,"unique","Unique")??!1});if(p.push({step:"createTableIndex",tableName:b,indexName:N||$.join("_"),response:P}),P.Code!==1)return Q(JSON.stringify({ok:!1,failedAt:"createTableIndex",tableName:b,index:k,response:P,results:p},null,2),!0)}}let g=await e.getDbSchema();p.push({step:"refreshDbSchema",response:{Code:g.Code,Msg:g.Msg,Summary:_e(_e(g.Data).Summary)}}),g.Code===1?oK(y,g.Data,d):u.warnings.push(`Could not refresh schema before module field resolution: ${g.Msg||g.Code}`);for(let v of he(s,"dataSources","DataSources")){let b=EP(v),w=await e.saveDataSource(b);if(p.push({step:"saveDataSource",key:S(b,"DataSourceKey"),response:w}),w.Code!==1)return Q(JSON.stringify({ok:!1,failedAt:"saveDataSource",dataSource:b,response:w,results:p},null,2),!0)}for(let v of he(s,"engines","Engines")){let b=await _P(e,v);if(p.push({step:"upsertEngine",apiEngineKey:S(v,"apiEngineKey","ApiEngineKey"),response:b}),b.Code!==1)return Q(JSON.stringify({ok:!1,failedAt:"upsertEngine",engine:v,response:b,results:p},null,2),!0)}for(let v of he(s,"events","Events")){let b=await e.saveEventCode(S(v,"formEngineKey","FormEngineKey"),S(v,"eventType","EventType"),S(v,"code","Code","V8Code"));if(p.push({step:"saveEvent",event:v,response:b}),b.Code!==1)return Q(JSON.stringify({ok:!1,failedAt:"saveEvent",event:v,response:b,results:p},null,2),!0)}for(let v of he(s,"modules","Modules")){let b=dK(v,d,h,y),w=await e.createModule(b);if(p.push({step:"createModule",moduleName:b.Name,response:w}),w.Code!==1)return Q(JSON.stringify({ok:!1,failedAt:"createModule",module:b,response:w,results:p},null,2),!0);let E=S(_e(w.Data),"ModuleId","Id");E&&typeof b.Name=="string"&&h.set(b.Name.toLowerCase(),E)}for(let v of he(s,"permissions","Permissions")){let b=S(v,"roleName","RoleName","name","Name"),w=S(v,"roleId","RoleId")||(b?m.get(b.toLowerCase()):"")||"admin",E=Sc(v,"menuIds","MenuIds"),T=Sc(v,"moduleNames","ModuleNames"),k=E.length?E:T.map(N=>h.get(N.toLowerCase())||"").filter(Boolean),$=await e.setRolePermission(w,k);if(p.push({step:"setRolePermission",roleId:w,menuIds:k,response:$}),$.Code!==1)return Q(JSON.stringify({ok:!1,failedAt:"setRolePermission",permission:v,response:$,results:p},null,2),!0)}for(let v of he(s,"pages","Pages")){let b=dn(v.json??v.JsonObj??v.JsonStr??v);if(!b.ok||!b.json)return Q(JSON.stringify({ok:!1,failedAt:"savePage:normalize",page:v,errors:b.errors,warnings:b.warnings,results:p},null,2),!0);let w=await e.savePageEngine({PageId:S(v,"pageId","PageId","Id")||void 0,Title:S(v,"title","Title"),Number:S(v,"number","Number")||void 0,Desc:S(v,"desc","Desc")||void 0,JsonStr:b.json,RoutePath:S(v,"routePath","RoutePath")||void 0,ComponentPath:S(v,"componentPath","ComponentPath")||void 0});if(p.push({step:"savePage",title:S(v,"title","Title"),response:w}),w.Code!==1)return Q(JSON.stringify({ok:!1,failedAt:"savePage",page:v,response:w,results:p},null,2),!0)}for(let v of he(s,"printTemplates","PrintTemplates")){let b=kP(v),w=await e.savePrintTemplate(b);if(p.push({step:"savePrintTemplate",title:S(b,"Title"),response:w}),w.Code!==1)return Q(JSON.stringify({ok:!1,failedAt:"savePrintTemplate",template:b,response:w,results:p},null,2),!0)}for(let v of he(s,"workflows","Workflows")){let b=pK(v,d),w=await e.saveWorkflowPackage(b);if(p.push({step:"saveWorkflowPackage",workflow:S(_e(b.FlowDesign??b.flowDesign??b),"FlowName","flowName"),response:w}),w.Code!==1)return Q(JSON.stringify({ok:!1,failedAt:"saveWorkflowPackage",workflow:b,response:w,results:p},null,2),!0)}for(let v of he(s,"jobs","Jobs")){let b=TP(v),w=await e.saveJob(b);if(p.push({step:"saveJob",jobName:S(b,"JobName"),response:w}),w.Code!==1)return Q(JSON.stringify({ok:!1,failedAt:"saveJob",job:b,response:w,results:p},null,2),!0)}let x=await e.validateLowCodeSystem(s);return await pr(e,"microi_generate_system:finish",S(s,"name","Name")||"manifest",{results:p,validation:x}),Q(JSON.stringify({ok:x.Code===1,results:p,validation:x.Data},null,2),x.Code!==1)}catch(g){return Q(`Error: ${g instanceof Error?g.message:String(g)}
134
134
 
@@ -552,8 +552,8 @@ if (V8.ThisValue && typeof V8.ThisValue === 'object') {
552
552
  V8.Form.${v} = '';
553
553
  }`,F={DataSource:"Sql",Sql:N,SelectLabel:E,SelectSaveField:E,DataSourceSqlRemote:!0,EnableSearch:!0,V8Code:P},oe=await t.addField({TableId:o,Name:b,Label:c,Type:"varchar(200)",Component:"Select",Visible:1,AppVisible:1,Tab:h,Sort:T,TableWidth:g??120,NotEmpty:y??0,Placeholder:x||`\u8BF7\u9009\u62E9${c}`,Config:JSON.stringify(F)});return oe.Code!==1?{content:[{type:"text",text:`Created ${v} but failed ${b}: ${oe.Msg}`}],isError:!0}:{content:[{type:"text",text:`\u2705 Join field pair created: ${v} (hidden) + ${b} (Select from ${l}.${E}, V8Code copies ${w} to ${v}).`}]}}catch(v){return{content:[{type:"text",text:`Error: ${v instanceof Error?v.message:String(v)}`}],isError:!0}}}),i.tool("microi_fix_join_field",`Retrofit an existing FK-only field to the proper Id+Name pair design for OsClient "${r}". For a table that has only "{baseName}Id" but no "{baseName}Name", this tool delegates to the helper API engine "_mcp_fix_join_field" to: (1) flip {baseName}Id field to hidden; (2) create {baseName}Name varchar(200) Select with SQL DataSource and FieldValueChange V8Code (does ALTER TABLE + diy_field insert); (3) backfill {baseName}Name from join table for existing rows. Use this to fix tables produced before microi_add_join_field was available. \u26A0\uFE0F Requires the helper engine "_mcp_fix_join_field" to exist on the server (auto-installed by the MCP team).`,{tableName:f.string().describe('Physical table name to fix, e.g. "mall_product"'),baseName:f.string().describe('Base name of the FK, e.g. "Category" \u2014 looks for {baseName}Id and creates {baseName}Name'),label:f.string().describe('Chinese label for the visible Name field, e.g. "\u5206\u7C7B"'),joinTableName:f.string().describe('Related table to query, e.g. "mall_category"'),joinIdField:f.string().optional().describe('Default: "Id"'),joinNameField:f.string().optional().describe('Default: "Name"'),joinWhere:f.string().optional().describe("Extra WHERE clause for the lookup"),tab:f.string().optional(),sort:f.number().optional(),backfill:f.boolean().optional().describe("Backfill existing rows. Default: true."),confirmExecution:f.string().optional().describe('Pass "EXECUTE" to apply changes; otherwise dry-run.')},async({tableName:o,baseName:s,label:c,joinTableName:l,joinIdField:u,joinNameField:p,joinWhere:d,tab:h,sort:m,backfill:y,confirmExecution:g})=>{try{let x=g!=="EXECUTE",v=await t.executeEngine("_mcp_fix_join_field",{tableName:o,baseName:s,label:c,joinTableName:l,joinIdField:u||"Id",joinNameField:p||"Name",joinWhere:d||"",tab:h||"",sort:m??100,backfill:y!==!1,dryRun:x});if(!v||v.Code!==1)return{content:[{type:"text",text:`Error: ${v?.Msg||"helper engine _mcp_fix_join_field call failed"}`}],isError:!0};let b=v.Data||v,w=typeof b=="string"?b:JSON.stringify(b,null,2);return{content:[{type:"text",text:(x?`[DRY-RUN]
554
554
  `:"\u2705 ")+w}]}}catch(x){return{content:[{type:"text",text:`Error: ${x instanceof Error?x.message:String(x)}`}],isError:!0}}}),i.tool("microi_get_field_list",`List diy_field rows for a table on OsClient "${r}". Use before changing existing field Data/Config so the update targets the real FieldId and can be verified after writing.`,{tableName:f.string().optional().describe("TableName, e.g. mall_product"),tableId:f.string().optional().describe("TableId alternative locator")},async({tableName:o,tableId:s})=>{try{if(!o&&!s)return{content:[{type:"text",text:"Error: tableName or tableId is required."}],isError:!0};let c=await t.getFieldList(o,s);return c.Code!==1?{content:[{type:"text",text:`Error: ${c.Msg}`}],isError:!0}:{content:[{type:"text",text:JSON.stringify(c.Data,null,2)}]}}catch(c){return{content:[{type:"text",text:`Error: ${c instanceof Error?c.message:String(c)}`}],isError:!0}}}),i.tool("microi_update_field",`Update a single diy_field for OsClient "${r}". Calls FormEngine.UptDiyField on the backend, which automatically clears the diy_table_field_list Redis cache so the frontend immediately sees the change. Locate the field by either Id or (TableId/TableName + Name). Only fields included in the patch are updated.`,{id:f.string().optional().describe("FieldId (preferred). If absent, must provide TableId/TableName + Name."),tableId:f.string().optional().describe("TableId (alternative locator). Use with name."),tableName:f.string().optional().describe("TableName (alternative locator). Use with name."),name:f.string().optional().describe("Field Name (FK locator with TableId/TableName)."),label:f.string().optional(),type:f.string().optional(),component:f.string().optional(),visible:f.number().optional(),appVisible:f.number().optional(),readonly:f.number().optional(),notEmpty:f.number().optional(),unique:f.number().optional(),sort:f.number().optional(),formWidth:f.number().nullable().optional(),tableWidth:f.number().optional(),placeholder:f.string().optional(),defaultValue:f.string().optional(),tab:f.string().optional(),data:f.string().optional(),config:f.string().optional(),description:f.string().optional(),inTableEdit:f.number().optional(),v8Code:f.string().optional().describe("Field value-change V8 JavaScript code."),keyupV8Code:f.string().optional().describe("Field keyup V8 JavaScript code."),v8TmpEngineTable:f.string().optional().describe("Table-cell template V8 JavaScript code."),v8TmpEngineForm:f.string().optional().describe("Form template V8 JavaScript code.")},async o=>{try{let s={},c={id:"Id",tableId:"TableId",tableName:"TableName",name:"Name",label:"Label",type:"Type",component:"Component",visible:"Visible",appVisible:"AppVisible",readonly:"Readonly",notEmpty:"NotEmpty",unique:"Unique",sort:"Sort",formWidth:"FormWidth",tableWidth:"TableWidth",placeholder:"Placeholder",defaultValue:"DefaultValue",tab:"Tab",data:"Data",config:"Config",description:"Description",inTableEdit:"InTableEdit",v8Code:"V8Code",keyupV8Code:"KeyupV8Code",v8TmpEngineTable:"V8TmpEngineTable",v8TmpEngineForm:"V8TmpEngineForm"};for(let[u,p]of Object.entries(o))p!==void 0&&c[u]&&(s[c[u]]=p);let l=await t.updateField(s);return l.Code!==1?{content:[{type:"text",text:`Error: ${l.Msg}`}],isError:!0}:{content:[{type:"text",text:`\u2705 Field updated. ${JSON.stringify(l.Data)}`}]}}catch(s){return{content:[{type:"text",text:`Error: ${s instanceof Error?s.message:String(s)}`}],isError:!0}}}),i.tool("microi_update_field_list",`Batch update multiple diy_field records for OsClient "${r}" in a single transaction. Calls FormEngine.UptDiyFieldList on the backend, which automatically clears the diy_table_field_list Redis cache. Use this for bulk operations like assigning Tab values to many fields at once, batch updating Sort/Visible/Component, or any operation that would otherwise require many microi_update_field calls.`,{tableId:f.string().describe("TableId (required). The fields must belong to this table."),fieldList:f.array(f.object({id:f.string().describe("FieldId (required)."),tab:f.string().optional().describe("Form tab group name."),sort:f.number().optional().describe("Field display order."),visible:f.number().optional().describe("Visible in PC form (1=yes, 0=no)."),appVisible:f.number().optional().describe("Visible in mobile app."),component:f.string().optional(),label:f.string().optional(),formWidth:f.number().nullable().optional(),tableWidth:f.number().optional(),notEmpty:f.number().optional(),readonly:f.number().optional(),placeholder:f.string().optional(),defaultValue:f.string().optional(),data:f.string().optional(),config:f.string().optional(),description:f.string().optional(),inTableEdit:f.number().optional(),unique:f.number().optional()})).describe("Array of field patches. Each item must include id; other fields are optional and only applied when present.")},async o=>{try{let s=(o.fieldList||[]).map(l=>{let u={};return l.id!==void 0&&(u.Id=l.id),l.tab!==void 0&&(u.Tab=l.tab),l.sort!==void 0&&(u.Sort=l.sort),l.visible!==void 0&&(u.Visible=l.visible),l.appVisible!==void 0&&(u.AppVisible=l.appVisible),l.component!==void 0&&(u.Component=l.component),l.label!==void 0&&(u.Label=l.label),l.formWidth!==void 0&&(u.FormWidth=l.formWidth),l.tableWidth!==void 0&&(u.TableWidth=l.tableWidth),l.notEmpty!==void 0&&(u.NotEmpty=l.notEmpty),l.readonly!==void 0&&(u.Readonly=l.readonly),l.placeholder!==void 0&&(u.Placeholder=l.placeholder),l.defaultValue!==void 0&&(u.DefaultValue=l.defaultValue),l.data!==void 0&&(u.Data=l.data),l.config!==void 0&&(u.Config=l.config),l.description!==void 0&&(u.Description=l.description),l.inTableEdit!==void 0&&(u.InTableEdit=l.inTableEdit),l.unique!==void 0&&(u.Unique=l.unique),u}),c=await t.updateFieldList({TableId:o.tableId,FieldList:s});return c.Code!==1?{content:[{type:"text",text:`Error: ${c.Msg}`}],isError:!0}:{content:[{type:"text",text:`\u2705 ${s.length} fields updated. ${JSON.stringify(c.Data)}`}]}}catch(s){return{content:[{type:"text",text:`Error: ${s instanceof Error?s.message:String(s)}`}],isError:!0}}}),i.tool("microi_update_table",`Update a diy_table record for OsClient "${r}" (for example form layout, V8Unlimited, data log/comment/version switches, Description or IsTree). Only provided fields are patched. Automatically clears diy_table + diy_table_field_list Redis caches.`,{id:f.string().optional().describe("TableId (preferred locator)"),name:f.string().optional().describe("Table Name (alternative locator)"),column:f.number().optional().describe("Form columns: 1, 2 or 3"),description:f.string().optional(),isTree:f.number().optional(),tabs:f.string().optional(),formOpenType:f.string().optional(),formOpenWidth:f.string().optional(),enableDataLog:f.number().optional().describe("1 enables per-row data change logs; 0 disables."),enableDataComment:f.number().optional().describe("1 enables per-row comments; 0 disables."),enableDataVersion:f.number().optional().describe("1 enables data versions; 0 disables."),v8Unlimited:f.boolean().optional().describe("Explicit high-risk switch for this table's backend V8 events. Omit to preserve; false writes 0 and true writes 1.")},async o=>{try{let s={};o.id&&(s.Id=o.id),o.name&&(s.Name=o.name),o.column!==void 0&&(s.Column=o.column),o.description!==void 0&&(s.Description=o.description),o.isTree!==void 0&&(s.IsTree=o.isTree),o.tabs!==void 0&&(s.Tabs=o.tabs),o.formOpenType!==void 0&&(s.FormOpenType=o.formOpenType),o.formOpenWidth!==void 0&&(s.FormOpenWidth=o.formOpenWidth),o.enableDataLog!==void 0&&(s.EnableDataLog=o.enableDataLog===1?1:0),o.enableDataComment!==void 0&&(s.EnableDataComment=o.enableDataComment===1?1:0),o.enableDataVersion!==void 0&&(s.EnableDataVersion=o.enableDataVersion===1?1:0),o.v8Unlimited!==void 0&&(s.V8Unlimited=o.v8Unlimited?1:0);let c=await t.updateTable(s);return c.Code!==1?{content:[{type:"text",text:`Error: ${c.Msg}`}],isError:!0}:{content:[{type:"text",text:`\u2705 Table updated. ${JSON.stringify(c.Data)}`}]}}catch(s){return{content:[{type:"text",text:`Error: ${s instanceof Error?s.message:String(s)}`}],isError:!0}}}),i.tool("microi_bulk_update_table_features",`Plan or apply data-log, data-comment and data-version switches to many diy_table records for OsClient "${r}". Each table is read immediately before writing, patched independently through UpdateTable, and verified by readback. Existing V8 events, Tabs and unrelated table metadata are never sent or overwritten. Re-running the same batch is safe and resumes by skipping already-matched rows.`,{tables:f.array(f.object({id:f.string().optional(),name:f.string().optional()}).refine(o=>!!(o.id||o.name),"Each table needs id or name")).min(1).max(1e3),enableDataLog:f.number().optional().describe("Desired value, default 1."),enableDataComment:f.number().optional().describe("Desired value, default 1."),enableDataVersion:f.number().optional().describe("Desired value, default 1."),dryRun:f.boolean().optional().describe("Default true. Set false for real writes."),confirmExecution:f.string().optional().describe("Required when dryRun=false; must be EXECUTE.")},async({tables:o,enableDataLog:s,enableDataComment:c,enableDataVersion:l,dryRun:u,confirmExecution:p})=>{let d={EnableDataLog:s===void 0||s===1?1:0,EnableDataComment:c===void 0||c===1?1:0,EnableDataVersion:l===void 0||l===1?1:0},h=u!==!1;if(!h&&p!=="EXECUTE")return{content:[{type:"text",text:'Error: real bulk writes require dryRun=false and confirmExecution="EXECUTE".'}],isError:!0};let m={ok:!0,dryRun:h,requested:o.length,matched:0,alreadyCorrect:0,planned:0,updated:0,verified:0,failures:[]},y=async g=>{let x=g.id?[["Id","=",g.id]]:[["Name","=",g.name]],v=await t.getTableData("diy_table",{_Where:x,_SelectFields:["Id","Name","EnableDataLog","EnableDataComment","EnableDataVersion","UpdateTime"],_PageIndex:1,_PageSize:2});if(v.Code!==1)throw new Error(v.Msg||"\u8BFB\u53D6 diy_table \u5931\u8D25");let b=Gn(v.Data);if(b.length!==1)throw new Error(b.length?"\u5B9A\u4F4D\u5230\u591A\u5F20\u540C\u540D\u8868\uFF0C\u8BF7\u6539\u7528 TableId":"\u672A\u627E\u5230\u8868");return b[0]};for(let g of o)try{let x=await y(g);if(m.matched++,!Object.entries(d).some(([k,$])=>Number(x[k]??0)!==$)){m.alreadyCorrect++;continue}if(m.planned++,h)continue;let b=String(x.Id||""),w=await t.updateTable({Id:b,...d});if(w.Code!==1)throw new Error(w.Msg||"UpdateTable \u8FD4\u56DE\u5931\u8D25");m.updated++;let E=await y({id:b}),T=Object.entries(d).filter(([k,$])=>Number(E[k]??0)!==$).map(([k])=>k);if(T.length)throw new Error(`\u56DE\u8BFB\u4E0D\u4E00\u81F4\uFF1A${T.join(", ")}`);m.verified++}catch(x){m.ok=!1,m.failures.push({id:g.id,name:g.name,error:x instanceof Error?x.message:String(x)})}return{content:[{type:"text",text:JSON.stringify(m,null,2)}],isError:!m.ok}}),i.tool("microi_bulk_apply_module_presentation",`Read, plan or apply presentation-only sys_menu changes for OsClient "${r}". The tool supports ViewSchema Hero/List/Card, statistics/mobile/card fields, menu badges and badge-only changes to existing buttons/PageTabs. It fingerprints the complete current module before writing, rejects stale snapshots, and proves routes, table binding, SQL/data permissions, API replacements and button V8/business actions remain unchanged. New PageTabs require an explicit per-plan opt-in.`,{plans:f.array(f.object({moduleId:f.string().min(1),expectedFingerprint:f.string().regex(/^[a-fA-F0-9]{64}$/u).optional(),allowCreatePageTabs:f.boolean().optional(),patch:f.object({EnableViewSchema:f.number().optional(),ViewSchemaVersion:f.string().optional(),ViewConfigVersion:f.number().int().min(0).optional(),ViewSchema:f.union([f.string(),mr]).optional(),StatisticsFields:f.string().optional(),MobileListFields:f.string().optional(),CardTitleTagFields:f.string().optional(),CardBottomTagFields:f.string().optional(),MenuBadgeEnabled:f.number().optional(),MenuBadgeApiEngineKey:f.string().optional(),MoreBtns:f.string().optional(),FormBtns:f.string().optional(),BatchSelectMoreBtns:f.string().optional(),PageTabs:f.string().optional(),ExportMoreBtns:f.string().optional(),PageBtns:f.string().optional()}).strict()})).min(1).max(50),dryRun:f.boolean().optional().describe("Default true. Dry-run returns the current full-module fingerprint and presentation projection."),confirmExecution:f.string().optional().describe("Required when dryRun=false; must be EXECUTE.")},async({plans:o,dryRun:s,confirmExecution:c})=>{let l=s!==!1;if(!l&&c!=="EXECUTE")return{content:[{type:"text",text:'Error: real module presentation writes require dryRun=false and confirmExecution="EXECUTE".'}],isError:!0};let u=new Set(["EnableViewSchema","ViewSchemaVersion","ViewConfigVersion","ViewSchema","StatisticsFields","MobileListFields","CardTitleTagFields","CardBottomTagFields","MenuBadgeEnabled","MenuBadgeApiEngineKey","MoreBtns","FormBtns","BatchSelectMoreBtns","PageTabs","ExportMoreBtns","PageBtns"]),p=["MoreBtns","FormBtns","BatchSelectMoreBtns","PageTabs","ExportMoreBtns","PageBtns"],d=k=>{let $=k;for(let N=0;N<2&&typeof $=="string";N++){let P=$.trim();if(!P||!P.startsWith("[")&&!P.startsWith("{")&&!P.startsWith('"'))break;try{$=JSON.parse(P)}catch{break}}return $},h=k=>{let $=d(k);return Array.isArray($)?$.map(h):!$||typeof $!="object"?$??null:Object.fromEntries(Object.entries($).filter(([N])=>!N.startsWith("_")).sort(([N],[P])=>N.localeCompare(P)).map(([N,P])=>[N,h(P)]))},m=k=>JSON.stringify(h(k)),y=(k,$=!1)=>Object.fromEntries(Object.entries(k).filter(([N])=>!N.startsWith("_")).filter(([N])=>!$||!u.has(N)&&N!=="UpdateTime").sort(([N],[P])=>N.localeCompare(P)).map(([N,P])=>[N,h(P)])),g=k=>Qe.default.createHash("sha256").update(JSON.stringify(y(k)),"utf8").digest("hex"),x=k=>Object.fromEntries([...u].filter($=>k[$]!==void 0).map($=>[$,k[$]])),v=k=>{let $=d(k);return typeof $=="string"?$.replace(/\r\n/gu,`
555
- `).trim():Array.isArray($)?$.map(v):!$||typeof $!="object"?$??null:Object.fromEntries(Object.entries($).filter(([N])=>!N.startsWith("_")).sort(([N],[P])=>N.localeCompare(P)).map(([N,P])=>[N,v(P)]))},b=(k,$)=>{let N=d(k);if(!Array.isArray(N))return m([]);let P=N.map((F,oe)=>{if(!F||typeof F!="object"||Array.isArray(F))return F;let Oe=Object.fromEntries(Object.entries(F).filter(([Ve,Ze])=>!Ve.startsWith("_")&&!/^Badge/iu.test(Ve)&&Ze!==""&&Ze!==null&&Ze!==void 0).sort(([Ve],[Ze])=>Ve.localeCompare(Ze)).map(([Ve,Ze])=>[Ve,Ve==="Sort"&&Number.isFinite(Number(Ze))?Number(Ze):v(Ze)]));return Oe.Sort===void 0&&(Oe.Sort=oe*10),Oe.IsVisible===void 0&&(Oe.IsVisible=!0),$==="MoreBtns"&&Oe.ShowRow===void 0&&(Oe.ShowRow=!0),Oe});return JSON.stringify(P.map(v))},w=k=>{let $=d(k);return!Array.isArray($)||$.length===0},E=async k=>{let $=await t.getModule(k);if($.Code!==1||!$.Data||typeof $.Data!="object")throw new Error($.Msg||"\u8BFB\u53D6 sys_menu \u5931\u8D25");return $.Data},T={ok:!0,dryRun:l,requested:o.length,matched:0,planned:0,updated:0,verified:0,stale:0,states:[],failures:[]};for(let k of o){let $="";try{let N=await E(k.moduleId);$=String(N.Name||"");let P=g(N),F=T.states.length;if(T.states.push({moduleId:k.moduleId,name:$,diyTableId:N.DiyTableId,updateTime:N.UpdateTime,fingerprint:P,presentation:x(N)}),k.expectedFingerprint&&P.toLowerCase()!==k.expectedFingerprint.toLowerCase())throw T.stale++,new Error(`STALE_MODULE_FINGERPRINT\uFF1A\u5F53\u524D ${P}\uFF0C\u8BA1\u5212 ${k.expectedFingerprint}`);if(!l&&!k.expectedFingerprint)throw new Error("\u771F\u5B9E\u5199\u5165\u5FC5\u987B\u63D0\u4F9B dry-run \u8FD4\u56DE\u7684 expectedFingerprint");T.matched++;let oe=_o({ModuleId:k.moduleId,...k.patch});if(oe.errors.length)throw new Error(oe.errors.join("\uFF1B"));let ye=oe.data,Oe=Object.fromEntries(p.map(Ae=>[Ae,b(N[Ae],Ae)]));for(let Ae of p){if(ye[Ae]===void 0)continue;let aa=w(N[Ae]),Qn=w(ye[Ae]);if(Ae==="PageTabs"&&aa&&!Qn){if(!k.allowCreatePageTabs)throw new Error("\u65B0\u589E PageTabs \u5FC5\u987B\u663E\u5F0F\u8BBE\u7F6E allowCreatePageTabs=true");continue}if(b(ye[Ae],Ae)!==Oe[Ae])throw new Error(`${Ae} \u4EC5\u5141\u8BB8\u589E\u52A0/\u8C03\u6574 Badge* \u5C55\u793A\u5B57\u6BB5\uFF0C\u4E1A\u52A1\u52A8\u4F5C\u3001V8\u3001\u987A\u5E8F\u4E0E\u663E\u9690\u5FC5\u987B\u4FDD\u6301\u4E0D\u53D8`)}if(T.planned++,l)continue;let Ve=m(y(N,!0)),Ze=await t.updateModule({ModuleId:k.moduleId,...ye});if(Ze.Code!==1)throw new Error(Ze.Msg||"UpdateModule \u8FD4\u56DE\u5931\u8D25");T.updated++;let Rt=await E(k.moduleId);if(m(y(Rt,!0))!==Ve)throw new Error("IMMUTABLE_GUARD\uFF1A\u83DC\u5355\u8DEF\u7531\u3001\u8868\u7ED1\u5B9A\u3001\u6743\u9650/SQL \u6761\u4EF6\u3001\u63A5\u53E3\u66FF\u6362\u6216\u5176\u5B83\u4E1A\u52A1\u914D\u7F6E\u53D1\u751F\u53D8\u5316");for(let Ae of p)if(ye[Ae]!==void 0&&!(Ae==="PageTabs"&&w(N[Ae])&&k.allowCreatePageTabs)&&b(Rt[Ae],Ae)!==Oe[Ae])throw new Error(`IMMUTABLE_GUARD\uFF1A${Ae} \u7684\u4E1A\u52A1\u52A8\u4F5C\u6216 V8 \u53D1\u751F\u53D8\u5316`);T.states[F]={moduleId:k.moduleId,name:$,diyTableId:Rt.DiyTableId,updateTime:Rt.UpdateTime,fingerprint:g(Rt),previousFingerprint:P,presentation:x(Rt)},T.verified++}catch(N){T.ok=!1,T.failures.push({moduleId:k.moduleId,name:$||void 0,error:N instanceof Error?N.message:String(N)})}}return{content:[{type:"text",text:JSON.stringify(T,null,2)}],isError:!T.ok&&T.matched===0}}),i.tool("microi_refresh_schema_cache",`Manually invalidate Redis caches for diy_table / diy_field / diy_table_field_list for the given tables (OsClient "${r}"). Useful after bulk DB changes or when caches go stale.`,{tables:f.array(f.string()).describe("Array of table names or TableIds. All cache key variants for each will be cleared.")},async({tables:o})=>{try{let s=await t.refreshSchemaCache(o);return s.Code!==1?{content:[{type:"text",text:`Error: ${s.Msg}`}],isError:!0}:{content:[{type:"text",text:`\u2705 Cache refreshed. ${JSON.stringify(s.Data)}`}]}}catch(s){return{content:[{type:"text",text:`Error: ${s instanceof Error?s.message:String(s)}`}],isError:!0}}}),i.tool("microi_set_engine_anonymous",`Batch set sys_apiengine.AllowAnonymous for one or more API engines (OsClient "${r}"). Use 1 for login/register/public endpoints that need to be callable without a token; use 0 to require login. The backend also keeps the engine HTTP-callable (IsEnable=1, StopHttp=0) and refreshes the corresponding sys_apiengine dynamic route cache entries from the latest DB row.`,{apiEngineKeys:f.array(f.string()).describe("Array of ApiEngineKey strings"),allowAnonymous:f.number().optional().describe("1 = allow anonymous (default), 0 = require login")},async({apiEngineKeys:o,allowAnonymous:s})=>{try{let c=await t.setEngineAnonymous(o,s??1);return c.Code!==1?{content:[{type:"text",text:`Error: ${c.Msg}`}],isError:!0}:{content:[{type:"text",text:`\u2705 ${JSON.stringify(c.Data,null,2)}`}]}}catch(c){return{content:[{type:"text",text:`Error: ${c instanceof Error?c.message:String(c)}`}],isError:!0}}}),i.tool("microi_create_module",`Create a menu module for OsClient "${r}". Inserts a record into sys_menu table (NOT sys_module, NOT Sys_Module). Links a diy_table to the navigation sidebar. IDEMPOTENT \u2014 calling again with the same Name+ParentId returns Skipped:true with the existing ModuleId. URL collisions are auto-resolved with random suffixes (concurrency-safe). Step 4 of system design. \u26A0\uFE0F For business systems, also pass moreBtns/formBtns/pageTabs/batchSelectMoreBtns JSON to wire up business buttons in one call \u2014 see skill doc microi.skills/v8-menu-buttons.`,{name:f.string().describe('Module display name (Chinese, e.g. "\u5BA2\u6237\u7BA1\u7406", "\u8BA2\u5355\u5217\u8868")'),diyTableId:f.string().optional().describe("The TableId to bind this module to (from microi_create_table)"),parentId:f.string().optional().describe("Parent menu Id for nesting (omit for top-level)"),componentName:f.string().optional().describe('Component type. Default: "\u641C\u7D22+\u8868\u683C". Options: "\u641C\u7D22+\u8868\u683C", "\u6811+\u641C\u7D22+\u8868\u683C", "\u8BE6\u60C5", "\u62A5\u8868"'),componentPath:f.string().optional().describe('Component path. Default: "/diy/diy-table-rowlist"'),display:f.number().optional().describe("Show in PC menu (1=yes, 0=no). Default: 1"),appDisplay:f.number().optional().describe("Show in mobile menu (1=yes, 0=no). Default: 1"),openType:f.string().optional().describe('Open type. Default: "Diy" (low-code page). Options: "Diy", "Url", "Page", "MicroService"'),url:f.string().optional().describe("Menu route. MicroService menus normally use /micro-app/{MicroServiceKey}/{routePath}."),sort:f.number().optional().describe("Sort order for menu display. Default: 100. Lower numbers appear first"),icon:f.string().optional().describe('Menu icon class name (e.g. "el-icon-user", "el-icon-s-order", "fa fa-home")'),menuBadgeEnabled:f.number().optional().describe("Show a dynamic statistic badge beside this sidebar menu (1=yes, 0=no). Important menus with actionable counts should normally enable it."),menuBadgeApiEngineKey:f.string().optional().describe("ApiEngineKey for the sidebar badge. Recommended response: {Code:1,Data:{Value:number}}. Keep it tenant-scoped, inexpensive, and side-effect free."),searchFieldIds:f.string().optional().describe("SearchFieldIds JSON/object-array string. If omitted and diyTableId is bound, backend infers common searchable fields such as title/name/no/status/type/category/person/time."),tableDiyFieldIds:f.string().optional().describe('Comma-separated field Ids to show as table columns (e.g. "fieldId1,fieldId2,fieldId3"). Controls which fields appear in the list view.'),defaultOrderBy:f.string().optional().describe('Default sort expression (e.g. "CreateTime DESC", "Sort ASC")'),sqlWhere:f.string().optional().describe('Fixed SQL WHERE clause for data filtering (e.g. "Status=1", "IsDeleted=0")'),enableViewSchema:f.number().optional().describe("Enable the versioned cross-client ViewSchema (1=yes, 0=no). Default: 0."),viewSchemaVersion:f.string().optional().describe('ViewSchema protocol version stored in sys_menu.ViewSchemaVersion. Default: "1.0".'),viewConfigVersion:f.number().optional().describe("Monotonic configuration version stored in sys_menu.ViewConfigVersion. Default: 1."),viewSchema:f.union([f.string(),mr]).optional().describe("Versioned cross-client view JSON object/string stored in sys_menu.ViewSchema. Supports Detail/Edit/List/Card and PC/Mobile/All. Layout.List keeps multi-line Columns[].Lines, TrailingFields and RequiredFields; Layout.Card keeps AvatarTextField, TitleField, SubtitleFields, StatusFields, TopFields, RightFields, Fields, MetaFields and BottomFields."),moreBtns:f.string().optional().describe(`Row action buttons JSON ARRAY (string). Each item: {Id,Sort,Name,Icon,BtnStyle,IsVisible,ShowRow:true,V8CodeShow,V8Code,RunBackground,BackgroundTask,IsBackgroundTask,ApiEngineKey}. V8Code typically calls V8.ApiEngine.Run(...). Long tasks such as install/import/init should set RunBackground=true and ApiEngineKey so the frontend starts a background task. Example: '[{"Id":"01K...","Name":"\u6307\u6D3E","BtnStyle":"primary","IsVisible":true,"ShowRow":true,"V8CodeShow":"V8.Result=V8.Form.Status==\\"\u5F85\u6307\u6D3E\\";","V8Code":"V8.OpenAnyForm({TableName:\\"Diy_X\\",Id:V8.Form.Id,FormMode:\\"Edit\\",SelectFields:[\\"AssigneeId\\"],EventReplace:{Submit:async function(v8,p,cb){var r=await V8.ApiEngine.Run({ApiEngineKey:\\"x_assign\\",Id:v8.Form.Id,AssigneeId:v8.Form.AssigneeId});cb(r);V8.RefreshTable({_PageIndex:1});}}});"}]'`),formBtns:f.string().optional().describe("Form bottom buttons JSON ARRAY (string). Same item shape as moreBtns but ShowRow not required. Buttons may configure BadgeEnabled, BadgeApiEngineKey, BadgeValuePath, BadgeTone, BadgeMax, BadgeShowZero and BadgeRefreshSeconds."),batchSelectMoreBtns:f.string().optional().describe("Batch action buttons JSON ARRAY (string). Same item and optional Badge* fields as moreBtns. Use V8.TableRowSelected to access selected rows; badge APIs must batch current-page Ids instead of calling once per row."),pageTabs:f.string().optional().describe("Page top tabs JSON ARRAY (string). Each item: {Id,Sort,Name,Icon,V8Code,V8CodeShow,TargetSysMenuId}. TargetSysMenuId associates another module; clicking it replaces the current route and reloads that module. V8Code typically calls V8.SearchSet({field:value}) for tabs within the current module."),exportMoreBtns:f.string().optional().describe("Export menu extra buttons JSON ARRAY (string). Supports the same optional Badge* fields as formBtns."),pageBtns:f.string().optional().describe("Page-level top buttons JSON ARRAY (string). Supports the same optional Badge* fields; page counts normally come from Data.Buttons."),sortFieldIds:f.string().optional().describe("Comma-separated field Ids that user can sort by. JSON array string also accepted."),notShowFields:f.string().optional().describe("JSON array string of field Ids hidden from the list. If omitted and diyTableId is bound, backend hides Id-like fields, foreign keys, system fields, layout controls and heavy fields such as upload/rich text/map/child table."),sqlJoin:f.string().optional().describe('Custom SQL JOIN clause for the list query (e.g. "LEFT JOIN Diy_Customer C ON A.CustomerId=C.Id"). Use aliases A=main table, B/C/D=joined tables.'),joinTables:f.string().optional().describe('JSON array of joined tables for select fields cross-table: [{Id,AsName:"B",Name:"Diy_Xxx",Description:"xxx",IsVisible:true}]'),selectFields:f.string().optional().describe("JSON array of selectable fields (cross-table) for the list view."),statisticsFields:f.string().optional().describe('JSON array of fields to show as table footer statistics (e.g. [{Id,Type:"Sum"}], Type=Sum|Avg|Max|Min|Count). If omitted and diyTableId is bound, backend infers amount/price/count/point/balance numeric fields.'),inTableEdit:f.number().optional().describe("Enable inline edit in list view (1=yes,0=no). Default: 0"),inTableEditFields:f.string().optional().describe("JSON array string of field Ids that allow inline edit (when inTableEdit=1)."),mobileListFields:f.string().optional().describe("JSON array of fields shown in mobile/card list. If omitted and diyTableId is bound, backend picks compact title/status/summary fields."),cardTitleTagFields:f.string().optional().describe("JSON array of fields shown as title tags on mobile/card view."),cardBottomTagFields:f.string().optional().describe("JSON array of fields shown as bottom tags on mobile/card view."),microServiceId:f.string().optional().describe("sys_microiservice.Id. Required when openType=MicroService."),microServicePageId:f.string().optional().describe("sys_microiservice_page.Id for this menu route. Required when openType=MicroService."),microServiceRoutePath:f.string().optional().describe("Internal Vue route such as /context-test. Required when openType=MicroService."),microServiceKey:f.string().optional().describe("sys_microiservice.MsKey/AppKey. Used to generate the friendly menu URL."),confirmExecution:f.string().optional().describe("Required for real writes. Must exactly equal name, or EXECUTE. Omit for a dry-run payload.")},async({name:o,diyTableId:s,parentId:c,componentName:l,componentPath:u,display:p,appDisplay:d,openType:h,url:m,sort:y,icon:g,menuBadgeEnabled:x,menuBadgeApiEngineKey:v,searchFieldIds:b,tableDiyFieldIds:w,defaultOrderBy:E,sqlWhere:T,enableViewSchema:k,viewSchemaVersion:$,viewConfigVersion:N,viewSchema:P,moreBtns:F,formBtns:oe,batchSelectMoreBtns:ye,pageTabs:Oe,exportMoreBtns:Ve,pageBtns:Ze,sortFieldIds:Rt,notShowFields:Ae,sqlJoin:aa,joinTables:Qn,selectFields:l$,statisticsFields:u$,inTableEdit:p$,inTableEditFields:d$,mobileListFields:f$,cardTitleTagFields:m$,cardBottomTagFields:h$,microServiceId:Rc,microServicePageId:Oc,microServiceRoutePath:To,microServiceKey:Co,confirmExecution:cx})=>{try{let Yn=String(h||"").toLowerCase()==="microservice"||!!(Rc||Oc||To||Co),od=h,sd=l,cd=u,ld=m,ud=To;if(Yn){let ux=[Rc?"":"microServiceId",Oc?"":"microServicePageId",To?"":"microServiceRoutePath",Co?"":"microServiceKey"].filter(Boolean);if(ux.length)return{content:[{type:"text",text:`Error: MicroService \u83DC\u5355\u7F3A\u5C11\u5B57\u6BB5\uFF1A${ux.join(", ")}`}],isError:!0};let Ao=String(To||"").trim().replace(/\\/gu,"/");if(!/^\/(?:[A-Za-z0-9][A-Za-z0-9_-]*(?:\/[A-Za-z0-9][A-Za-z0-9_-]*)*)?$/u.test(Ao)||Ao.includes(".."))return{content:[{type:"text",text:`Error: microServiceRoutePath \u4E0D\u5408\u6CD5\uFF1A${To}`}],isError:!0};ud=Ao,od="MicroService",sd=l||"MicroService",cd=u||"/micro-app/host";let g$=Ao==="/"?"":"/"+Ao.slice(1).split("/").map(y$=>encodeURIComponent(y$)).join("/");ld=m||`/micro-app/${encodeURIComponent(String(Co))}${g$}`}if(cx!==o&&cx!=="EXECUTE")return{content:[{type:"text",text:JSON.stringify({dryRun:!0,confirmationRequired:o,module:{Name:o,ParentId:c,OpenType:od||"Diy",ComponentName:sd,ComponentPath:cd,Url:ld,MenuBadgeEnabled:x??0,MenuBadgeApiEngineKey:v,EnableViewSchema:k??0,ViewSchema:P,IsMicroiService:Yn?1:0,MicroServiceId:Rc,MicroServicePageId:Oc,MicroServiceRoutePath:ud,MicroServiceKey:Co}},null,2)}]};let pd=Kv(P);if(!pd.ok)return{content:[{type:"text",text:`Error: ${pd.errors.join(`
556
- `)}`}],isError:!0};let dd=await t.createModule({Name:o,DiyTableId:s,ParentId:c,ComponentName:sd,ComponentPath:cd,Display:p??1,AppDisplay:d??1,OpenType:od,Url:ld,Sort:y,Icon:g,MenuBadgeEnabled:x??0,MenuBadgeApiEngineKey:v,SearchFieldIds:b,TableDiyFieldIds:w,DefaultOrderBy:E,SqlWhere:T,EnableViewSchema:k??0,ViewSchemaVersion:$??"1.0",ViewConfigVersion:N??1,ViewSchema:pd.value,MoreBtns:F,FormBtns:oe,BatchSelectMoreBtns:ye,PageTabs:Oe,ExportMoreBtns:Ve,PageBtns:Ze,SortFieldIds:Rt,NotShowFields:Ae,SqlJoin:aa,JoinTables:Qn,SelectFields:l$,StatisticsFields:u$,InTableEdit:p$,InTableEditFields:d$,MobileListFields:f$,CardTitleTagFields:m$,CardBottomTagFields:h$,IsMicroiService:Yn?1:void 0,MicroServiceId:Rc,MicroServicePageId:Oc,MicroServiceRoutePath:ud,MicroServiceKey:Co});if(dd.Code!==1)return{content:[{type:"text",text:`Error: ${dd.Msg}`}],isError:!0};let lx=dd.Data;return{content:[{type:"text",text:`\u2705 Module "${o}" created.
555
+ `).trim():Array.isArray($)?$.map(v):!$||typeof $!="object"?$??null:Object.fromEntries(Object.entries($).filter(([N])=>!N.startsWith("_")).sort(([N],[P])=>N.localeCompare(P)).map(([N,P])=>[N,v(P)]))},b=(k,$)=>{let N=d(k);if(!Array.isArray(N))return m([]);let P=N.map((F,oe)=>{if(!F||typeof F!="object"||Array.isArray(F))return F;let Oe=Object.fromEntries(Object.entries(F).filter(([Ve,Ze])=>!Ve.startsWith("_")&&!/^Badge/iu.test(Ve)&&Ze!==""&&Ze!==null&&Ze!==void 0).sort(([Ve],[Ze])=>Ve.localeCompare(Ze)).map(([Ve,Ze])=>[Ve,Ve==="Sort"&&Number.isFinite(Number(Ze))?Number(Ze):v(Ze)]));return Oe.Sort===void 0&&(Oe.Sort=oe*10),Oe.IsVisible===void 0&&(Oe.IsVisible=!0),$==="MoreBtns"&&Oe.ShowRow===void 0&&(Oe.ShowRow=!0),Oe});return JSON.stringify(P.map(v))},w=k=>{let $=d(k);return!Array.isArray($)||$.length===0},E=async k=>{let $=await t.getModule(k);if($.Code!==1||!$.Data||typeof $.Data!="object")throw new Error($.Msg||"\u8BFB\u53D6 sys_menu \u5931\u8D25");return $.Data},T={ok:!0,dryRun:l,requested:o.length,matched:0,planned:0,updated:0,verified:0,stale:0,states:[],failures:[]};for(let k of o){let $="";try{let N=await E(k.moduleId);$=String(N.Name||"");let P=g(N),F=T.states.length;if(T.states.push({moduleId:k.moduleId,name:$,diyTableId:N.DiyTableId,updateTime:N.UpdateTime,fingerprint:P,presentation:x(N)}),k.expectedFingerprint&&P.toLowerCase()!==k.expectedFingerprint.toLowerCase())throw T.stale++,new Error(`STALE_MODULE_FINGERPRINT\uFF1A\u5F53\u524D ${P}\uFF0C\u8BA1\u5212 ${k.expectedFingerprint}`);if(!l&&!k.expectedFingerprint)throw new Error("\u771F\u5B9E\u5199\u5165\u5FC5\u987B\u63D0\u4F9B dry-run \u8FD4\u56DE\u7684 expectedFingerprint");T.matched++;let oe=_o({ModuleId:k.moduleId,...k.patch});if(oe.errors.length)throw new Error(oe.errors.join("\uFF1B"));let ye=oe.data,Oe=Object.fromEntries(p.map(Ae=>[Ae,b(N[Ae],Ae)]));for(let Ae of p){if(ye[Ae]===void 0)continue;let aa=w(N[Ae]),Qn=w(ye[Ae]);if(Ae==="PageTabs"&&aa&&!Qn){if(!k.allowCreatePageTabs)throw new Error("\u65B0\u589E PageTabs \u5FC5\u987B\u663E\u5F0F\u8BBE\u7F6E allowCreatePageTabs=true");continue}if(b(ye[Ae],Ae)!==Oe[Ae])throw new Error(`${Ae} \u4EC5\u5141\u8BB8\u589E\u52A0/\u8C03\u6574 Badge* \u5C55\u793A\u5B57\u6BB5\uFF0C\u4E1A\u52A1\u52A8\u4F5C\u3001V8\u3001\u987A\u5E8F\u4E0E\u663E\u9690\u5FC5\u987B\u4FDD\u6301\u4E0D\u53D8`)}if(T.planned++,l)continue;let Ve=m(y(N,!0)),Ze=await t.updateModule({ModuleId:k.moduleId,...ye});if(Ze.Code!==1)throw new Error(Ze.Msg||"UpdateModule \u8FD4\u56DE\u5931\u8D25");T.updated++;let Rt=await E(k.moduleId);if(m(y(Rt,!0))!==Ve)throw new Error("IMMUTABLE_GUARD\uFF1A\u83DC\u5355\u8DEF\u7531\u3001\u8868\u7ED1\u5B9A\u3001\u6743\u9650/SQL \u6761\u4EF6\u3001\u63A5\u53E3\u66FF\u6362\u6216\u5176\u5B83\u4E1A\u52A1\u914D\u7F6E\u53D1\u751F\u53D8\u5316");for(let Ae of p)if(ye[Ae]!==void 0&&!(Ae==="PageTabs"&&w(N[Ae])&&k.allowCreatePageTabs)&&b(Rt[Ae],Ae)!==Oe[Ae])throw new Error(`IMMUTABLE_GUARD\uFF1A${Ae} \u7684\u4E1A\u52A1\u52A8\u4F5C\u6216 V8 \u53D1\u751F\u53D8\u5316`);T.states[F]={moduleId:k.moduleId,name:$,diyTableId:Rt.DiyTableId,updateTime:Rt.UpdateTime,fingerprint:g(Rt),previousFingerprint:P,presentation:x(Rt)},T.verified++}catch(N){T.ok=!1,T.failures.push({moduleId:k.moduleId,name:$||void 0,error:N instanceof Error?N.message:String(N)})}}return{content:[{type:"text",text:JSON.stringify(T,null,2)}],isError:!T.ok&&T.matched===0}}),i.tool("microi_refresh_schema_cache",`Manually invalidate Redis caches for diy_table / diy_field / diy_table_field_list for the given tables (OsClient "${r}"). Useful after bulk DB changes or when caches go stale.`,{tables:f.array(f.string()).describe("Array of table names or TableIds. All cache key variants for each will be cleared.")},async({tables:o})=>{try{let s=await t.refreshSchemaCache(o);return s.Code!==1?{content:[{type:"text",text:`Error: ${s.Msg}`}],isError:!0}:{content:[{type:"text",text:`\u2705 Cache refreshed. ${JSON.stringify(s.Data)}`}]}}catch(s){return{content:[{type:"text",text:`Error: ${s instanceof Error?s.message:String(s)}`}],isError:!0}}}),i.tool("microi_set_engine_anonymous",`Batch set sys_apiengine.AllowAnonymous for one or more API engines (OsClient "${r}"). Use 1 for login/register/public endpoints that need to be callable without a token; use 0 to require login. The backend also keeps the engine HTTP-callable (IsEnable=1, StopHttp=0) and refreshes the corresponding sys_apiengine dynamic route cache entries from the latest DB row.`,{apiEngineKeys:f.array(f.string()).describe("Array of ApiEngineKey strings"),allowAnonymous:f.number().optional().describe("1 = allow anonymous (default), 0 = require login")},async({apiEngineKeys:o,allowAnonymous:s})=>{try{let c=await t.setEngineAnonymous(o,s??1);return c.Code!==1?{content:[{type:"text",text:`Error: ${c.Msg}`}],isError:!0}:{content:[{type:"text",text:`\u2705 ${JSON.stringify(c.Data,null,2)}`}]}}catch(c){return{content:[{type:"text",text:`Error: ${c instanceof Error?c.message:String(c)}`}],isError:!0}}}),i.tool("microi_create_module",`Create a menu module for OsClient "${r}". Inserts a record into sys_menu table (NOT sys_module, NOT Sys_Module). Links a diy_table to the navigation sidebar. IDEMPOTENT \u2014 calling again with the same Name+ParentId returns Skipped:true with the existing ModuleId. URL collisions are auto-resolved with random suffixes (concurrency-safe). Step 4 of system design. \u26A0\uFE0F For business systems, also pass moreBtns/formBtns/pageTabs/batchSelectMoreBtns JSON to wire up business buttons in one call \u2014 see skill doc microi.skills/v8-menu-buttons.`,{name:f.string().describe('Module display name (Chinese, e.g. "\u5BA2\u6237\u7BA1\u7406", "\u8BA2\u5355\u5217\u8868")'),diyTableId:f.string().optional().describe("The TableId to bind this module to (from microi_create_table)"),parentId:f.string().optional().describe("Parent menu Id for nesting (omit for top-level)"),componentName:f.string().optional().describe('Component type. Default: "\u641C\u7D22+\u8868\u683C". Options: "\u641C\u7D22+\u8868\u683C", "\u6811+\u641C\u7D22+\u8868\u683C", "\u8BE6\u60C5", "\u62A5\u8868"'),componentPath:f.string().optional().describe('Component path. Default: "/diy/diy-table-rowlist"'),display:f.number().optional().describe("Show in PC menu (1=yes, 0=no). Default: 1"),appDisplay:f.number().optional().describe("Show in mobile menu (1=yes, 0=no). Default: 1"),openType:f.string().optional().describe('Open type. Default: "Diy" (low-code page). Options: "Diy", "Url", "Page", "MicroService"'),url:f.string().optional().describe("Menu route. MicroService menus normally use /micro-app/{MicroServiceKey}/{routePath}."),sort:f.number().optional().describe("Sort order for menu display. Default: 100. Lower numbers appear first"),icon:f.string().optional().describe('Menu icon class name (e.g. "el-icon-user", "el-icon-s-order", "fa fa-home")'),menuBadgeEnabled:f.number().optional().describe("Show a dynamic statistic badge beside this sidebar menu (1=yes, 0=no). Important menus with actionable counts should normally enable it."),menuBadgeApiEngineKey:f.string().optional().describe("ApiEngineKey for the sidebar badge. Recommended response: {Code:1,Data:{Value:number}}. Keep it tenant-scoped, inexpensive, and side-effect free."),searchFieldIds:f.string().optional().describe("SearchFieldIds JSON/object-array string. If omitted and diyTableId is bound, backend infers common searchable fields such as title/name/no/status/type/category/person/time."),tableDiyFieldIds:f.string().optional().describe('Comma-separated field Ids to show as table columns (e.g. "fieldId1,fieldId2,fieldId3"). Controls which fields appear in the list view.'),defaultOrderBy:f.string().optional().describe('Default sort expression (e.g. "CreateTime DESC", "Sort ASC")'),sqlWhere:f.string().optional().describe('Fixed SQL WHERE clause for data filtering (e.g. "Status=1", "IsDeleted=0")'),enableViewSchema:f.number().optional().describe("Enable custom Detail/Edit form views (1=yes, 0=no). List/Card presentation in ViewSchema is applied whenever configured and is not gated by this switch. Default: 0."),viewSchemaVersion:f.string().optional().describe('Optional ViewSchema protocol version stored in sys_menu.ViewSchemaVersion. Blank or omitted defaults to "1.0".'),viewConfigVersion:f.number().optional().describe("Optional monotonic configuration version stored in sys_menu.ViewConfigVersion. Omitted defaults to 1."),viewSchema:f.union([f.string(),mr]).optional().describe("Versioned cross-client view JSON object/string stored in sys_menu.ViewSchema. Supports Detail/Edit/List/Card and PC/Mobile/All. Layout.List keeps multi-line Columns[].Lines, TrailingFields and RequiredFields; Layout.Card keeps AvatarTextField, TitleField, SubtitleFields, StatusFields, TopFields, RightFields, Fields, MetaFields and BottomFields."),moreBtns:f.string().optional().describe(`Row action buttons JSON ARRAY (string). Each item: {Id,Sort,Name,Icon,BtnStyle,IsVisible,ShowRow:true,V8CodeShow,V8Code,RunBackground,BackgroundTask,IsBackgroundTask,ApiEngineKey}. V8Code typically calls V8.ApiEngine.Run(...). Long tasks such as install/import/init should set RunBackground=true and ApiEngineKey so the frontend starts a background task. Example: '[{"Id":"01K...","Name":"\u6307\u6D3E","BtnStyle":"primary","IsVisible":true,"ShowRow":true,"V8CodeShow":"V8.Result=V8.Form.Status==\\"\u5F85\u6307\u6D3E\\";","V8Code":"V8.OpenAnyForm({TableName:\\"Diy_X\\",Id:V8.Form.Id,FormMode:\\"Edit\\",SelectFields:[\\"AssigneeId\\"],EventReplace:{Submit:async function(v8,p,cb){var r=await V8.ApiEngine.Run({ApiEngineKey:\\"x_assign\\",Id:v8.Form.Id,AssigneeId:v8.Form.AssigneeId});cb(r);V8.RefreshTable({_PageIndex:1});}}});"}]'`),formBtns:f.string().optional().describe("Form bottom buttons JSON ARRAY (string). Same item shape as moreBtns but ShowRow not required. Buttons may configure BadgeEnabled, BadgeApiEngineKey, BadgeValuePath, BadgeTone, BadgeMax, BadgeShowZero and BadgeRefreshSeconds."),batchSelectMoreBtns:f.string().optional().describe("Batch action buttons JSON ARRAY (string). Same item and optional Badge* fields as moreBtns. Use V8.TableRowSelected to access selected rows; badge APIs must batch current-page Ids instead of calling once per row."),pageTabs:f.string().optional().describe("Page top tabs JSON ARRAY (string). Each item: {Id,Sort,Name,Icon,V8Code,V8CodeShow,TargetSysMenuId}. TargetSysMenuId associates another module; clicking it replaces the current route and reloads that module. V8Code typically calls V8.SearchSet({field:value}) for tabs within the current module."),exportMoreBtns:f.string().optional().describe("Export menu extra buttons JSON ARRAY (string). Supports the same optional Badge* fields as formBtns."),pageBtns:f.string().optional().describe("Page-level top buttons JSON ARRAY (string). Supports the same optional Badge* fields; page counts normally come from Data.Buttons."),sortFieldIds:f.string().optional().describe("Comma-separated field Ids that user can sort by. JSON array string also accepted."),notShowFields:f.string().optional().describe("JSON array string of field Ids hidden from the list. If omitted and diyTableId is bound, backend hides Id-like fields, foreign keys, system fields, layout controls and heavy fields such as upload/rich text/map/child table."),sqlJoin:f.string().optional().describe('Custom SQL JOIN clause for the list query (e.g. "LEFT JOIN Diy_Customer C ON A.CustomerId=C.Id"). Use aliases A=main table, B/C/D=joined tables.'),joinTables:f.string().optional().describe('JSON array of joined tables for select fields cross-table: [{Id,AsName:"B",Name:"Diy_Xxx",Description:"xxx",IsVisible:true}]'),selectFields:f.string().optional().describe("JSON array of selectable fields (cross-table) for the list view."),statisticsFields:f.string().optional().describe('JSON array of fields to show as table footer statistics (e.g. [{Id,Type:"Sum"}], Type=Sum|Avg|Max|Min|Count). If omitted and diyTableId is bound, backend infers amount/price/count/point/balance numeric fields.'),inTableEdit:f.number().optional().describe("Enable inline edit in list view (1=yes,0=no). Default: 0"),inTableEditFields:f.string().optional().describe("JSON array string of field Ids that allow inline edit (when inTableEdit=1)."),mobileListFields:f.string().optional().describe("JSON array of fields shown in mobile/card list. If omitted and diyTableId is bound, backend picks compact title/status/summary fields."),cardTitleTagFields:f.string().optional().describe("JSON array of fields shown as title tags on mobile/card view."),cardBottomTagFields:f.string().optional().describe("JSON array of fields shown as bottom tags on mobile/card view."),microServiceId:f.string().optional().describe("sys_microiservice.Id. Required when openType=MicroService."),microServicePageId:f.string().optional().describe("sys_microiservice_page.Id for this menu route. Required when openType=MicroService."),microServiceRoutePath:f.string().optional().describe("Internal Vue route such as /context-test. Required when openType=MicroService."),microServiceKey:f.string().optional().describe("sys_microiservice.MsKey/AppKey. Used to generate the friendly menu URL."),confirmExecution:f.string().optional().describe("Required for real writes. Must exactly equal name, or EXECUTE. Omit for a dry-run payload.")},async({name:o,diyTableId:s,parentId:c,componentName:l,componentPath:u,display:p,appDisplay:d,openType:h,url:m,sort:y,icon:g,menuBadgeEnabled:x,menuBadgeApiEngineKey:v,searchFieldIds:b,tableDiyFieldIds:w,defaultOrderBy:E,sqlWhere:T,enableViewSchema:k,viewSchemaVersion:$,viewConfigVersion:N,viewSchema:P,moreBtns:F,formBtns:oe,batchSelectMoreBtns:ye,pageTabs:Oe,exportMoreBtns:Ve,pageBtns:Ze,sortFieldIds:Rt,notShowFields:Ae,sqlJoin:aa,joinTables:Qn,selectFields:l$,statisticsFields:u$,inTableEdit:p$,inTableEditFields:d$,mobileListFields:f$,cardTitleTagFields:m$,cardBottomTagFields:h$,microServiceId:Rc,microServicePageId:Oc,microServiceRoutePath:To,microServiceKey:Co,confirmExecution:cx})=>{try{let Yn=String(h||"").toLowerCase()==="microservice"||!!(Rc||Oc||To||Co),od=h,sd=l,cd=u,ld=m,ud=To;if(Yn){let ux=[Rc?"":"microServiceId",Oc?"":"microServicePageId",To?"":"microServiceRoutePath",Co?"":"microServiceKey"].filter(Boolean);if(ux.length)return{content:[{type:"text",text:`Error: MicroService \u83DC\u5355\u7F3A\u5C11\u5B57\u6BB5\uFF1A${ux.join(", ")}`}],isError:!0};let Ao=String(To||"").trim().replace(/\\/gu,"/");if(!/^\/(?:[A-Za-z0-9][A-Za-z0-9_-]*(?:\/[A-Za-z0-9][A-Za-z0-9_-]*)*)?$/u.test(Ao)||Ao.includes(".."))return{content:[{type:"text",text:`Error: microServiceRoutePath \u4E0D\u5408\u6CD5\uFF1A${To}`}],isError:!0};ud=Ao,od="MicroService",sd=l||"MicroService",cd=u||"/micro-app/host";let g$=Ao==="/"?"":"/"+Ao.slice(1).split("/").map(y$=>encodeURIComponent(y$)).join("/");ld=m||`/micro-app/${encodeURIComponent(String(Co))}${g$}`}if(cx!==o&&cx!=="EXECUTE")return{content:[{type:"text",text:JSON.stringify({dryRun:!0,confirmationRequired:o,module:{Name:o,ParentId:c,OpenType:od||"Diy",ComponentName:sd,ComponentPath:cd,Url:ld,MenuBadgeEnabled:x??0,MenuBadgeApiEngineKey:v,EnableViewSchema:k??0,ViewSchema:P,IsMicroiService:Yn?1:0,MicroServiceId:Rc,MicroServicePageId:Oc,MicroServiceRoutePath:ud,MicroServiceKey:Co}},null,2)}]};let pd=Kv(P);if(!pd.ok)return{content:[{type:"text",text:`Error: ${pd.errors.join(`
556
+ `)}`}],isError:!0};let dd=await t.createModule({Name:o,DiyTableId:s,ParentId:c,ComponentName:sd,ComponentPath:cd,Display:p??1,AppDisplay:d??1,OpenType:od,Url:ld,Sort:y,Icon:g,MenuBadgeEnabled:x??0,MenuBadgeApiEngineKey:v,SearchFieldIds:b,TableDiyFieldIds:w,DefaultOrderBy:E,SqlWhere:T,EnableViewSchema:k??0,ViewSchemaVersion:String($||"").trim()||"1.0",ViewConfigVersion:N??1,ViewSchema:pd.value,MoreBtns:F,FormBtns:oe,BatchSelectMoreBtns:ye,PageTabs:Oe,ExportMoreBtns:Ve,PageBtns:Ze,SortFieldIds:Rt,NotShowFields:Ae,SqlJoin:aa,JoinTables:Qn,SelectFields:l$,StatisticsFields:u$,InTableEdit:p$,InTableEditFields:d$,MobileListFields:f$,CardTitleTagFields:m$,CardBottomTagFields:h$,IsMicroiService:Yn?1:void 0,MicroServiceId:Rc,MicroServicePageId:Oc,MicroServiceRoutePath:ud,MicroServiceKey:Co});if(dd.Code!==1)return{content:[{type:"text",text:`Error: ${dd.Msg}`}],isError:!0};let lx=dd.Data;return{content:[{type:"text",text:`\u2705 Module "${o}" created.
557
557
  - ModuleId: ${lx?.ModuleId}
558
558
  - Url: ${lx?.Url||"(auto-generated)"}
559
559
  - Use this ModuleId when setting permissions via microi_set_role_permission`}]}}catch(Yn){return{content:[{type:"text",text:`Error: ${Yn instanceof Error?Yn.message:String(Yn)}`}],isError:!0}}}),i.tool("microi_set_role_permission",`Grant a role access to menu modules for OsClient "${r}". Inserts records into sys_rolelimit table. Pass roleId="admin" to auto-detect the admin role (highest Level in sys_role). Step 5 of system design.`,{roleId:f.string().describe('Role Id, or pass "admin" to auto-detect the admin role (queries sys_role for highest Level)'),menuIds:f.array(f.string()).describe("Array of menu/module Ids (ModuleId from microi_create_module) to grant access to")},async({roleId:o,menuIds:s})=>{try{let c=await t.setRolePermission(o,s);return c.Code!==1?{content:[{type:"text",text:`Error: ${c.Msg}`}],isError:!0}:{content:[{type:"text",text:`\u2705 ${c.Data?.Message||"Permissions set successfully."}`}]}}catch(c){return{content:[{type:"text",text:`Error: ${c instanceof Error?c.message:String(c)}`}],isError:!0}}}),i.tool("microi_list_pages",`List page engine (\u754C\u9762\u5F15\u64CE) pages for OsClient "${r}". Pages are stored in mic_page table and define custom UI layouts with charts, tables, maps, and other dashboard components.`,{keyword:f.string().optional().describe("Search keyword to filter pages by title, number, or description")},async({keyword:o})=>{try{let s=await t.getPageEngineList(o);if(s.Code!==1)return{content:[{type:"text",text:`Error: ${s.Msg}`}],isError:!0};let c=Array.isArray(s.Data)?s.Data:[];if(!c.length)return{content:[{type:"text",text:"No pages found."}]};let l=[`# Page Engine Pages (${c.length})