@xpert-ai/plugin-live-dashboard 0.0.0-stage → 0.1.1

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.
Files changed (95) hide show
  1. package/.xpertai-plugin/plugin.json +8 -0
  2. package/README.md +108 -2
  3. package/dist/index.d.ts +3 -0
  4. package/dist/index.js +11 -0
  5. package/dist/lib/agent.schema.d.ts +568 -0
  6. package/dist/lib/agent.schema.js +52 -0
  7. package/dist/lib/dashboard-icon.d.ts +5 -0
  8. package/dist/lib/dashboard-icon.js +8 -0
  9. package/dist/lib/dashboard-navigation.d.ts +38 -0
  10. package/dist/lib/dashboard-navigation.js +18 -0
  11. package/dist/lib/dashboard-queries.d.ts +8 -0
  12. package/dist/lib/dashboard-queries.js +39 -0
  13. package/dist/lib/dashboard-receipt.d.ts +11 -0
  14. package/dist/lib/dashboard-receipt.js +35 -0
  15. package/dist/lib/dashboard.schema.d.ts +816 -0
  16. package/dist/lib/dashboard.schema.js +74 -0
  17. package/dist/lib/dashboard.service.d.ts +243 -0
  18. package/dist/lib/dashboard.service.js +185 -0
  19. package/dist/lib/document-libraries.d.ts +8 -0
  20. package/dist/lib/document-libraries.js +41 -0
  21. package/dist/lib/document-package.d.ts +41 -0
  22. package/dist/lib/document-package.js +25 -0
  23. package/dist/lib/editing.d.ts +403 -0
  24. package/dist/lib/editing.js +114 -0
  25. package/dist/lib/filter-evidence.d.ts +71 -0
  26. package/dist/lib/filter-evidence.js +60 -0
  27. package/dist/lib/html-guidance.d.ts +1 -0
  28. package/dist/lib/html-guidance.js +4 -0
  29. package/dist/lib/html-validation.d.ts +19 -0
  30. package/dist/lib/html-validation.js +136 -0
  31. package/dist/lib/middleware.d.ts +10 -0
  32. package/dist/lib/middleware.js +225 -0
  33. package/dist/lib/plugin.d.ts +2 -0
  34. package/dist/lib/plugin.js +22 -0
  35. package/dist/lib/presentation.provider.d.ts +122 -0
  36. package/dist/lib/presentation.provider.js +72 -0
  37. package/dist/lib/remote-entry.d.ts +4 -0
  38. package/dist/lib/remote-entry.js +12 -0
  39. package/dist/lib/renderer.d.ts +58 -0
  40. package/dist/lib/renderer.js +32 -0
  41. package/dist/lib/resource-card.d.ts +21 -0
  42. package/dist/lib/resource-card.js +33 -0
  43. package/dist/lib/save-evidence.d.ts +24 -0
  44. package/dist/lib/save-evidence.js +99 -0
  45. package/dist/lib/sharing.service.d.ts +93 -0
  46. package/dist/lib/sharing.service.js +71 -0
  47. package/dist/lib/view.provider.d.ts +235 -0
  48. package/dist/lib/view.provider.js +103 -0
  49. package/dist/libraries/ECHARTS-LICENSE.txt +222 -0
  50. package/dist/libraries/ECHARTS-NOTICE.txt +5 -0
  51. package/dist/libraries/THREE-LICENSE.txt +21 -0
  52. package/dist/libraries/catalog.json +1 -0
  53. package/dist/remote/app.css +1 -0
  54. package/dist/remote/app.js +253 -0
  55. package/dist/remote/build-manifest.json +63 -0
  56. package/dist/remote/renderer-source.json +5 -0
  57. package/dist/remote/renderer.html +4653 -0
  58. package/dist/sandbox-actions/action.json +10 -0
  59. package/dist/sandbox-actions/bundle/host.js +149 -0
  60. package/dist/sandbox-actions/bundle/runner.mjs +15 -0
  61. package/dist/sandbox-actions/bundle/validate.mjs +140 -0
  62. package/dist/validation/host-entry.d.ts +1 -0
  63. package/dist/validation/host-entry.js +6 -0
  64. package/docs/AGENTS.md +9 -0
  65. package/docs/acceptance.md +89 -0
  66. package/docs/agent-acceptance.md +96 -0
  67. package/docs/chat-resource-cards.mdx +60 -0
  68. package/docs/docs.json +49 -0
  69. package/docs/drafts-acceptance.mdx +42 -0
  70. package/docs/drafts.mdx +35 -0
  71. package/docs/editing.mdx +63 -0
  72. package/docs/evolution-acceptance.mdx +98 -0
  73. package/docs/file-authoring-acceptance.mdx +62 -0
  74. package/docs/file-authoring.mdx +49 -0
  75. package/docs/file-datasets-acceptance.mdx +65 -0
  76. package/docs/fixed-build-multimodel-acceptance.mdx +129 -0
  77. package/docs/frontend-libraries-acceptance.mdx +86 -0
  78. package/docs/frontend-libraries.mdx +57 -0
  79. package/docs/html-acceptance.md +86 -0
  80. package/docs/html-mode.md +76 -0
  81. package/docs/index.mdx +47 -0
  82. package/docs/retry-regression-acceptance.mdx +112 -0
  83. package/docs/team-sharing-acceptance.mdx +66 -0
  84. package/docs/team-sharing.mdx +44 -0
  85. package/docs/verification.mdx +91 -0
  86. package/examples/assistant-middleware.yaml +28 -0
  87. package/examples/data-xpert-sales.json +118 -0
  88. package/examples/postgres-sales.json +93 -0
  89. package/index.cjs +1 -0
  90. package/package.json +73 -3
  91. package/skills/live-dashboard/SKILL.md +71 -0
  92. package/skills/live-dashboard/agents/xpertai.yaml +21 -0
  93. package/skills/live-dashboard/references/data-validation.md +15 -0
  94. package/skills/live-dashboard/references/html-lifecycle.md +129 -0
  95. package/skills/live-dashboard/references/html-runtime.md +53 -0
@@ -0,0 +1,10 @@
1
+ {
2
+ "name": "live_dashboard.validate-html",
3
+ "version": "1.0.0",
4
+ "runtimeProfile": "browser/playwright-1.61/v1",
5
+ "runtimeContractVersion": "1",
6
+ "playwrightVersion": "1.61.0",
7
+ "bundle": "./bundle",
8
+ "entrypoint": "runner.mjs",
9
+ "bundleSha256": "c342fcfb178977dfcd7b6255c7f9a0618b697a1fcca298eb3dfcef16578efda1"
10
+ }
@@ -0,0 +1,149 @@
1
+ var DocumentHost=(function(se){"use strict";var v;(function(s){s.assertEqual=n=>{};function e(n){}s.assertIs=e;function t(n){throw new Error}s.assertNever=t,s.arrayToEnum=n=>{const a={};for(const i of n)a[i]=i;return a},s.getValidEnumValues=n=>{const a=s.objectKeys(n).filter(o=>typeof n[n[o]]!="number"),i={};for(const o of a)i[o]=n[o];return s.objectValues(i)},s.objectValues=n=>s.objectKeys(n).map(function(a){return n[a]}),s.objectKeys=typeof Object.keys=="function"?n=>Object.keys(n):n=>{const a=[];for(const i in n)Object.prototype.hasOwnProperty.call(n,i)&&a.push(i);return a},s.find=(n,a)=>{for(const i of n)if(a(i))return i},s.isInteger=typeof Number.isInteger=="function"?n=>Number.isInteger(n):n=>typeof n=="number"&&Number.isFinite(n)&&Math.floor(n)===n;function r(n,a=" | "){return n.map(i=>typeof i=="string"?`'${i}'`:i).join(a)}s.joinValues=r,s.jsonStringifyReplacer=(n,a)=>typeof a=="bigint"?a.toString():a})(v||(v={}));var ke;(function(s){s.mergeShapes=(e,t)=>({...e,...t})})(ke||(ke={}));const l=v.arrayToEnum(["string","nan","number","integer","float","boolean","date","bigint","symbol","function","undefined","null","array","object","unknown","promise","void","never","map","set"]),L=s=>{switch(typeof s){case"undefined":return l.undefined;case"string":return l.string;case"number":return Number.isNaN(s)?l.nan:l.number;case"boolean":return l.boolean;case"function":return l.function;case"bigint":return l.bigint;case"symbol":return l.symbol;case"object":return Array.isArray(s)?l.array:s===null?l.null:s.then&&typeof s.then=="function"&&s.catch&&typeof s.catch=="function"?l.promise:typeof Map<"u"&&s instanceof Map?l.map:typeof Set<"u"&&s instanceof Set?l.set:typeof Date<"u"&&s instanceof Date?l.date:l.object;default:return l.unknown}},c=v.arrayToEnum(["invalid_type","invalid_literal","custom","invalid_union","invalid_union_discriminator","invalid_enum_value","unrecognized_keys","invalid_arguments","invalid_return_type","invalid_date","invalid_string","too_small","too_big","invalid_intersection_types","not_multiple_of","not_finite"]);class j extends Error{get errors(){return this.issues}constructor(e){super(),this.issues=[],this.addIssue=r=>{this.issues=[...this.issues,r]},this.addIssues=(r=[])=>{this.issues=[...this.issues,...r]};const t=new.target.prototype;Object.setPrototypeOf?Object.setPrototypeOf(this,t):this.__proto__=t,this.name="ZodError",this.issues=e}format(e){const t=e||function(a){return a.message},r={_errors:[]},n=a=>{for(const i of a.issues)if(i.code==="invalid_union")i.unionErrors.map(n);else if(i.code==="invalid_return_type")n(i.returnTypeError);else if(i.code==="invalid_arguments")n(i.argumentsError);else if(i.path.length===0)r._errors.push(t(i));else{let o=r,u=0;for(;u<i.path.length;){const f=i.path[u];u===i.path.length-1?(o[f]=o[f]||{_errors:[]},o[f]._errors.push(t(i))):o[f]=o[f]||{_errors:[]},o=o[f],u++}}};return n(this),r}static assert(e){if(!(e instanceof j))throw new Error(`Not a ZodError: ${e}`)}toString(){return this.message}get message(){return JSON.stringify(this.issues,v.jsonStringifyReplacer,2)}get isEmpty(){return this.issues.length===0}flatten(e=t=>t.message){const t={},r=[];for(const n of this.issues)n.path.length>0?(t[n.path[0]]=t[n.path[0]]||[],t[n.path[0]].push(e(n))):r.push(e(n));return{formErrors:r,fieldErrors:t}}get formErrors(){return this.flatten()}}j.create=s=>new j(s);const ue=(s,e)=>{let t;switch(s.code){case c.invalid_type:s.received===l.undefined?t="Required":t=`Expected ${s.expected}, received ${s.received}`;break;case c.invalid_literal:t=`Invalid literal value, expected ${JSON.stringify(s.expected,v.jsonStringifyReplacer)}`;break;case c.unrecognized_keys:t=`Unrecognized key(s) in object: ${v.joinValues(s.keys,", ")}`;break;case c.invalid_union:t="Invalid input";break;case c.invalid_union_discriminator:t=`Invalid discriminator value. Expected ${v.joinValues(s.options)}`;break;case c.invalid_enum_value:t=`Invalid enum value. Expected ${v.joinValues(s.options)}, received '${s.received}'`;break;case c.invalid_arguments:t="Invalid function arguments";break;case c.invalid_return_type:t="Invalid function return type";break;case c.invalid_date:t="Invalid date";break;case c.invalid_string:typeof s.validation=="object"?"includes"in s.validation?(t=`Invalid input: must include "${s.validation.includes}"`,typeof s.validation.position=="number"&&(t=`${t} at one or more positions greater than or equal to ${s.validation.position}`)):"startsWith"in s.validation?t=`Invalid input: must start with "${s.validation.startsWith}"`:"endsWith"in s.validation?t=`Invalid input: must end with "${s.validation.endsWith}"`:v.assertNever(s.validation):s.validation!=="regex"?t=`Invalid ${s.validation}`:t="Invalid";break;case c.too_small:s.type==="array"?t=`Array must contain ${s.exact?"exactly":s.inclusive?"at least":"more than"} ${s.minimum} element(s)`:s.type==="string"?t=`String must contain ${s.exact?"exactly":s.inclusive?"at least":"over"} ${s.minimum} character(s)`:s.type==="number"?t=`Number must be ${s.exact?"exactly equal to ":s.inclusive?"greater than or equal to ":"greater than "}${s.minimum}`:s.type==="date"?t=`Date must be ${s.exact?"exactly equal to ":s.inclusive?"greater than or equal to ":"greater than "}${new Date(Number(s.minimum))}`:t="Invalid input";break;case c.too_big:s.type==="array"?t=`Array must contain ${s.exact?"exactly":s.inclusive?"at most":"less than"} ${s.maximum} element(s)`:s.type==="string"?t=`String must contain ${s.exact?"exactly":s.inclusive?"at most":"under"} ${s.maximum} character(s)`:s.type==="number"?t=`Number must be ${s.exact?"exactly":s.inclusive?"less than or equal to":"less than"} ${s.maximum}`:s.type==="bigint"?t=`BigInt must be ${s.exact?"exactly":s.inclusive?"less than or equal to":"less than"} ${s.maximum}`:s.type==="date"?t=`Date must be ${s.exact?"exactly":s.inclusive?"smaller than or equal to":"smaller than"} ${new Date(Number(s.maximum))}`:t="Invalid input";break;case c.custom:t="Invalid input";break;case c.invalid_intersection_types:t="Intersection results could not be merged";break;case c.not_multiple_of:t=`Number must be a multiple of ${s.multipleOf}`;break;case c.not_finite:t="Number must be finite";break;default:t=e.defaultError,v.assertNever(s)}return{message:t}};let ze=ue;function qe(){return ze}const Be=s=>{const{data:e,path:t,errorMaps:r,issueData:n}=s,a=[...t,...n.path||[]],i={...n,path:a};if(n.message!==void 0)return{...n,path:a,message:n.message};let o="";const u=r.filter(f=>!!f).slice().reverse();for(const f of u)o=f(i,{data:e,defaultError:o}).message;return{...n,path:a,message:o}};function d(s,e){const t=qe(),r=Be({issueData:e,data:s.data,path:s.path,errorMaps:[s.common.contextualErrorMap,s.schemaErrorMap,t,t===ue?void 0:ue].filter(n=>!!n)});s.common.issues.push(r)}class I{constructor(){this.value="valid"}dirty(){this.value==="valid"&&(this.value="dirty")}abort(){this.value!=="aborted"&&(this.value="aborted")}static mergeArray(e,t){const r=[];for(const n of t){if(n.status==="aborted")return p;n.status==="dirty"&&e.dirty(),r.push(n.value)}return{status:e.value,value:r}}static async mergeObjectAsync(e,t){const r=[];for(const n of t){const a=await n.key,i=await n.value;r.push({key:a,value:i})}return I.mergeObjectSync(e,r)}static mergeObjectSync(e,t){const r={};for(const n of t){const{key:a,value:i}=n;if(a.status==="aborted"||i.status==="aborted")return p;a.status==="dirty"&&e.dirty(),i.status==="dirty"&&e.dirty(),a.value!=="__proto__"&&(typeof i.value<"u"||n.alwaysSet)&&(r[a.value]=i.value)}return{status:e.value,value:r}}}const p=Object.freeze({status:"aborted"}),X=s=>({status:"dirty",value:s}),C=s=>({status:"valid",value:s}),we=s=>s.status==="aborted",Ie=s=>s.status==="dirty",B=s=>s.status==="valid",re=s=>typeof Promise<"u"&&s instanceof Promise;var h;(function(s){s.errToObj=e=>typeof e=="string"?{message:e}:e||{},s.toString=e=>typeof e=="string"?e:e?.message})(h||(h={}));class O{constructor(e,t,r,n){this._cachedPath=[],this.parent=e,this.data=t,this._path=r,this._key=n}get path(){return this._cachedPath.length||(Array.isArray(this._key)?this._cachedPath.push(...this._path,...this._key):this._cachedPath.push(...this._path,this._key)),this._cachedPath}}const Te=(s,e)=>{if(B(e))return{success:!0,data:e.value};if(!s.common.issues.length)throw new Error("Validation failed but no issues detected.");return{success:!1,get error(){if(this._error)return this._error;const t=new j(s.common.issues);return this._error=t,this._error}}};function g(s){if(!s)return{};const{errorMap:e,invalid_type_error:t,required_error:r,description:n}=s;if(e&&(t||r))throw new Error(`Can't use "invalid_type_error" or "required_error" in conjunction with custom error map.`);return e?{errorMap:e,description:n}:{errorMap:(i,o)=>{const{message:u}=s;return i.code==="invalid_enum_value"?{message:u??o.defaultError}:typeof o.data>"u"?{message:u??r??o.defaultError}:i.code!=="invalid_type"?{message:o.defaultError}:{message:u??t??o.defaultError}},description:n}}class _{get description(){return this._def.description}_getType(e){return L(e.data)}_getOrReturnCtx(e,t){return t||{common:e.parent.common,data:e.data,parsedType:L(e.data),schemaErrorMap:this._def.errorMap,path:e.path,parent:e.parent}}_processInputParams(e){return{status:new I,ctx:{common:e.parent.common,data:e.data,parsedType:L(e.data),schemaErrorMap:this._def.errorMap,path:e.path,parent:e.parent}}}_parseSync(e){const t=this._parse(e);if(re(t))throw new Error("Synchronous parse encountered promise.");return t}_parseAsync(e){const t=this._parse(e);return Promise.resolve(t)}parse(e,t){const r=this.safeParse(e,t);if(r.success)return r.data;throw r.error}safeParse(e,t){const r={common:{issues:[],async:t?.async??!1,contextualErrorMap:t?.errorMap},path:t?.path||[],schemaErrorMap:this._def.errorMap,parent:null,data:e,parsedType:L(e)},n=this._parseSync({data:e,path:r.path,parent:r});return Te(r,n)}"~validate"(e){const t={common:{issues:[],async:!!this["~standard"].async},path:[],schemaErrorMap:this._def.errorMap,parent:null,data:e,parsedType:L(e)};if(!this["~standard"].async)try{const r=this._parseSync({data:e,path:[],parent:t});return B(r)?{value:r.value}:{issues:t.common.issues}}catch(r){r?.message?.toLowerCase()?.includes("encountered")&&(this["~standard"].async=!0),t.common={issues:[],async:!0}}return this._parseAsync({data:e,path:[],parent:t}).then(r=>B(r)?{value:r.value}:{issues:t.common.issues})}async parseAsync(e,t){const r=await this.safeParseAsync(e,t);if(r.success)return r.data;throw r.error}async safeParseAsync(e,t){const r={common:{issues:[],contextualErrorMap:t?.errorMap,async:!0},path:t?.path||[],schemaErrorMap:this._def.errorMap,parent:null,data:e,parsedType:L(e)},n=this._parse({data:e,path:r.path,parent:r}),a=await(re(n)?n:Promise.resolve(n));return Te(r,a)}refine(e,t){const r=n=>typeof t=="string"||typeof t>"u"?{message:t}:typeof t=="function"?t(n):t;return this._refinement((n,a)=>{const i=e(n),o=()=>a.addIssue({code:c.custom,...r(n)});return typeof Promise<"u"&&i instanceof Promise?i.then(u=>u?!0:(o(),!1)):i?!0:(o(),!1)})}refinement(e,t){return this._refinement((r,n)=>e(r)?!0:(n.addIssue(typeof t=="function"?t(r,n):t),!1))}_refinement(e){return new H({schema:this,typeName:m.ZodEffects,effect:{type:"refinement",refinement:e}})}superRefine(e){return this._refinement(e)}constructor(e){this.spa=this.safeParseAsync,this._def=e,this.parse=this.parse.bind(this),this.safeParse=this.safeParse.bind(this),this.parseAsync=this.parseAsync.bind(this),this.safeParseAsync=this.safeParseAsync.bind(this),this.spa=this.spa.bind(this),this.refine=this.refine.bind(this),this.refinement=this.refinement.bind(this),this.superRefine=this.superRefine.bind(this),this.optional=this.optional.bind(this),this.nullable=this.nullable.bind(this),this.nullish=this.nullish.bind(this),this.array=this.array.bind(this),this.promise=this.promise.bind(this),this.or=this.or.bind(this),this.and=this.and.bind(this),this.transform=this.transform.bind(this),this.brand=this.brand.bind(this),this.default=this.default.bind(this),this.catch=this.catch.bind(this),this.describe=this.describe.bind(this),this.pipe=this.pipe.bind(this),this.readonly=this.readonly.bind(this),this.isNullable=this.isNullable.bind(this),this.isOptional=this.isOptional.bind(this),this["~standard"]={version:1,vendor:"zod",validate:t=>this["~validate"](t)}}optional(){return V.create(this,this._def)}nullable(){return G.create(this,this._def)}nullish(){return this.nullable().optional()}array(){return A.create(this)}promise(){return ce.create(this,this._def)}or(e){return ae.create([this,e],this._def)}and(e){return ie.create(this,e,this._def)}transform(e){return new H({...g(this._def),schema:this,typeName:m.ZodEffects,effect:{type:"transform",transform:e}})}default(e){const t=typeof e=="function"?e:()=>e;return new ye({...g(this._def),innerType:this,defaultValue:t,typeName:m.ZodDefault})}brand(){return new ht({typeName:m.ZodBranded,type:this,...g(this._def)})}catch(e){const t=typeof e=="function"?e:()=>e;return new ge({...g(this._def),innerType:this,catchValue:t,typeName:m.ZodCatch})}describe(e){const t=this.constructor;return new t({...this._def,description:e})}pipe(e){return _e.create(this,e)}readonly(){return ve.create(this)}isOptional(){return this.safeParse(void 0).success}isNullable(){return this.safeParse(null).success}}const Fe=/^c[^\s-]{8,}$/i,We=/^[0-9a-z]+$/,Ye=/^[0-9A-HJKMNP-TV-Z]{26}$/i,He=/^[0-9a-fA-F]{8}\b-[0-9a-fA-F]{4}\b-[0-9a-fA-F]{4}\b-[0-9a-fA-F]{4}\b-[0-9a-fA-F]{12}$/i,Ge=/^[a-z0-9_-]{21}$/i,Je=/^[A-Za-z0-9-_]+\.[A-Za-z0-9-_]+\.[A-Za-z0-9-_]*$/,Qe=/^[-+]?P(?!$)(?:(?:[-+]?\d+Y)|(?:[-+]?\d+[.,]\d+Y$))?(?:(?:[-+]?\d+M)|(?:[-+]?\d+[.,]\d+M$))?(?:(?:[-+]?\d+W)|(?:[-+]?\d+[.,]\d+W$))?(?:(?:[-+]?\d+D)|(?:[-+]?\d+[.,]\d+D$))?(?:T(?=[\d+-])(?:(?:[-+]?\d+H)|(?:[-+]?\d+[.,]\d+H$))?(?:(?:[-+]?\d+M)|(?:[-+]?\d+[.,]\d+M$))?(?:[-+]?\d+(?:[.,]\d+)?S)?)??$/,Xe=/^(?!\.)(?!.*\.\.)([A-Z0-9_'+\-\.]*)[A-Z0-9_+-]@([A-Z0-9][A-Z0-9\-]*\.)+[A-Z]{2,}$/i,Ke="^(\\p{Extended_Pictographic}|\\p{Emoji_Component})+$";let le;const et=/^(?:(?:25[0-5]|2[0-4][0-9]|1[0-9][0-9]|[1-9][0-9]|[0-9])\.){3}(?:25[0-5]|2[0-4][0-9]|1[0-9][0-9]|[1-9][0-9]|[0-9])$/,tt=/^(?:(?:25[0-5]|2[0-4][0-9]|1[0-9][0-9]|[1-9][0-9]|[0-9])\.){3}(?:25[0-5]|2[0-4][0-9]|1[0-9][0-9]|[1-9][0-9]|[0-9])\/(3[0-2]|[12]?[0-9])$/,st=/^(([0-9a-fA-F]{1,4}:){7,7}[0-9a-fA-F]{1,4}|([0-9a-fA-F]{1,4}:){1,7}:|([0-9a-fA-F]{1,4}:){1,6}:[0-9a-fA-F]{1,4}|([0-9a-fA-F]{1,4}:){1,5}(:[0-9a-fA-F]{1,4}){1,2}|([0-9a-fA-F]{1,4}:){1,4}(:[0-9a-fA-F]{1,4}){1,3}|([0-9a-fA-F]{1,4}:){1,3}(:[0-9a-fA-F]{1,4}){1,4}|([0-9a-fA-F]{1,4}:){1,2}(:[0-9a-fA-F]{1,4}){1,5}|[0-9a-fA-F]{1,4}:((:[0-9a-fA-F]{1,4}){1,6})|:((:[0-9a-fA-F]{1,4}){1,7}|:)|fe80:(:[0-9a-fA-F]{0,4}){0,4}%[0-9a-zA-Z]{1,}|::(ffff(:0{1,4}){0,1}:){0,1}((25[0-5]|(2[0-4]|1{0,1}[0-9]){0,1}[0-9])\.){3,3}(25[0-5]|(2[0-4]|1{0,1}[0-9]){0,1}[0-9])|([0-9a-fA-F]{1,4}:){1,4}:((25[0-5]|(2[0-4]|1{0,1}[0-9]){0,1}[0-9])\.){3,3}(25[0-5]|(2[0-4]|1{0,1}[0-9]){0,1}[0-9]))$/,rt=/^(([0-9a-fA-F]{1,4}:){7,7}[0-9a-fA-F]{1,4}|([0-9a-fA-F]{1,4}:){1,7}:|([0-9a-fA-F]{1,4}:){1,6}:[0-9a-fA-F]{1,4}|([0-9a-fA-F]{1,4}:){1,5}(:[0-9a-fA-F]{1,4}){1,2}|([0-9a-fA-F]{1,4}:){1,4}(:[0-9a-fA-F]{1,4}){1,3}|([0-9a-fA-F]{1,4}:){1,3}(:[0-9a-fA-F]{1,4}){1,4}|([0-9a-fA-F]{1,4}:){1,2}(:[0-9a-fA-F]{1,4}){1,5}|[0-9a-fA-F]{1,4}:((:[0-9a-fA-F]{1,4}){1,6})|:((:[0-9a-fA-F]{1,4}){1,7}|:)|fe80:(:[0-9a-fA-F]{0,4}){0,4}%[0-9a-zA-Z]{1,}|::(ffff(:0{1,4}){0,1}:){0,1}((25[0-5]|(2[0-4]|1{0,1}[0-9]){0,1}[0-9])\.){3,3}(25[0-5]|(2[0-4]|1{0,1}[0-9]){0,1}[0-9])|([0-9a-fA-F]{1,4}:){1,4}:((25[0-5]|(2[0-4]|1{0,1}[0-9]){0,1}[0-9])\.){3,3}(25[0-5]|(2[0-4]|1{0,1}[0-9]){0,1}[0-9]))\/(12[0-8]|1[01][0-9]|[1-9]?[0-9])$/,nt=/^([0-9a-zA-Z+/]{4})*(([0-9a-zA-Z+/]{2}==)|([0-9a-zA-Z+/]{3}=))?$/,at=/^([0-9a-zA-Z-_]{4})*(([0-9a-zA-Z-_]{2}(==)?)|([0-9a-zA-Z-_]{3}(=)?))?$/,Ee="((\\d\\d[2468][048]|\\d\\d[13579][26]|\\d\\d0[48]|[02468][048]00|[13579][26]00)-02-29|\\d{4}-((0[13578]|1[02])-(0[1-9]|[12]\\d|3[01])|(0[469]|11)-(0[1-9]|[12]\\d|30)|(02)-(0[1-9]|1\\d|2[0-8])))",it=new RegExp(`^${Ee}$`);function Ne(s){let e="[0-5]\\d";s.precision?e=`${e}\\.\\d{${s.precision}}`:s.precision==null&&(e=`${e}(\\.\\d+)?`);const t=s.precision?"+":"?";return`([01]\\d|2[0-3]):[0-5]\\d(:${e})${t}`}function ot(s){return new RegExp(`^${Ne(s)}$`)}function ct(s){let e=`${Ee}T${Ne(s)}`;const t=[];return t.push(s.local?"Z?":"Z"),s.offset&&t.push("([+-]\\d{2}:?\\d{2})"),e=`${e}(${t.join("|")})`,new RegExp(`^${e}$`)}function dt(s,e){return!!((e==="v4"||!e)&&et.test(s)||(e==="v6"||!e)&&st.test(s))}function ut(s,e){if(!Je.test(s))return!1;try{const[t]=s.split("."),r=t.replace(/-/g,"+").replace(/_/g,"/").padEnd(t.length+(4-t.length%4)%4,"="),n=JSON.parse(atob(r));return!(typeof n!="object"||n===null||"typ"in n&&n?.typ!=="JWT"||!n.alg||e&&n.alg!==e)}catch{return!1}}function lt(s,e){return!!((e==="v4"||!e)&&tt.test(s)||(e==="v6"||!e)&&rt.test(s))}class M extends _{_parse(e){if(this._def.coerce&&(e.data=String(e.data)),this._getType(e)!==l.string){const a=this._getOrReturnCtx(e);return d(a,{code:c.invalid_type,expected:l.string,received:a.parsedType}),p}const r=new I;let n;for(const a of this._def.checks)if(a.kind==="min")e.data.length<a.value&&(n=this._getOrReturnCtx(e,n),d(n,{code:c.too_small,minimum:a.value,type:"string",inclusive:!0,exact:!1,message:a.message}),r.dirty());else if(a.kind==="max")e.data.length>a.value&&(n=this._getOrReturnCtx(e,n),d(n,{code:c.too_big,maximum:a.value,type:"string",inclusive:!0,exact:!1,message:a.message}),r.dirty());else if(a.kind==="length"){const i=e.data.length>a.value,o=e.data.length<a.value;(i||o)&&(n=this._getOrReturnCtx(e,n),i?d(n,{code:c.too_big,maximum:a.value,type:"string",inclusive:!0,exact:!0,message:a.message}):o&&d(n,{code:c.too_small,minimum:a.value,type:"string",inclusive:!0,exact:!0,message:a.message}),r.dirty())}else if(a.kind==="email")Xe.test(e.data)||(n=this._getOrReturnCtx(e,n),d(n,{validation:"email",code:c.invalid_string,message:a.message}),r.dirty());else if(a.kind==="emoji")le||(le=new RegExp(Ke,"u")),le.test(e.data)||(n=this._getOrReturnCtx(e,n),d(n,{validation:"emoji",code:c.invalid_string,message:a.message}),r.dirty());else if(a.kind==="uuid")He.test(e.data)||(n=this._getOrReturnCtx(e,n),d(n,{validation:"uuid",code:c.invalid_string,message:a.message}),r.dirty());else if(a.kind==="nanoid")Ge.test(e.data)||(n=this._getOrReturnCtx(e,n),d(n,{validation:"nanoid",code:c.invalid_string,message:a.message}),r.dirty());else if(a.kind==="cuid")Fe.test(e.data)||(n=this._getOrReturnCtx(e,n),d(n,{validation:"cuid",code:c.invalid_string,message:a.message}),r.dirty());else if(a.kind==="cuid2")We.test(e.data)||(n=this._getOrReturnCtx(e,n),d(n,{validation:"cuid2",code:c.invalid_string,message:a.message}),r.dirty());else if(a.kind==="ulid")Ye.test(e.data)||(n=this._getOrReturnCtx(e,n),d(n,{validation:"ulid",code:c.invalid_string,message:a.message}),r.dirty());else if(a.kind==="url")try{new URL(e.data)}catch{n=this._getOrReturnCtx(e,n),d(n,{validation:"url",code:c.invalid_string,message:a.message}),r.dirty()}else a.kind==="regex"?(a.regex.lastIndex=0,a.regex.test(e.data)||(n=this._getOrReturnCtx(e,n),d(n,{validation:"regex",code:c.invalid_string,message:a.message}),r.dirty())):a.kind==="trim"?e.data=e.data.trim():a.kind==="includes"?e.data.includes(a.value,a.position)||(n=this._getOrReturnCtx(e,n),d(n,{code:c.invalid_string,validation:{includes:a.value,position:a.position},message:a.message}),r.dirty()):a.kind==="toLowerCase"?e.data=e.data.toLowerCase():a.kind==="toUpperCase"?e.data=e.data.toUpperCase():a.kind==="startsWith"?e.data.startsWith(a.value)||(n=this._getOrReturnCtx(e,n),d(n,{code:c.invalid_string,validation:{startsWith:a.value},message:a.message}),r.dirty()):a.kind==="endsWith"?e.data.endsWith(a.value)||(n=this._getOrReturnCtx(e,n),d(n,{code:c.invalid_string,validation:{endsWith:a.value},message:a.message}),r.dirty()):a.kind==="datetime"?ct(a).test(e.data)||(n=this._getOrReturnCtx(e,n),d(n,{code:c.invalid_string,validation:"datetime",message:a.message}),r.dirty()):a.kind==="date"?it.test(e.data)||(n=this._getOrReturnCtx(e,n),d(n,{code:c.invalid_string,validation:"date",message:a.message}),r.dirty()):a.kind==="time"?ot(a).test(e.data)||(n=this._getOrReturnCtx(e,n),d(n,{code:c.invalid_string,validation:"time",message:a.message}),r.dirty()):a.kind==="duration"?Qe.test(e.data)||(n=this._getOrReturnCtx(e,n),d(n,{validation:"duration",code:c.invalid_string,message:a.message}),r.dirty()):a.kind==="ip"?dt(e.data,a.version)||(n=this._getOrReturnCtx(e,n),d(n,{validation:"ip",code:c.invalid_string,message:a.message}),r.dirty()):a.kind==="jwt"?ut(e.data,a.alg)||(n=this._getOrReturnCtx(e,n),d(n,{validation:"jwt",code:c.invalid_string,message:a.message}),r.dirty()):a.kind==="cidr"?lt(e.data,a.version)||(n=this._getOrReturnCtx(e,n),d(n,{validation:"cidr",code:c.invalid_string,message:a.message}),r.dirty()):a.kind==="base64"?nt.test(e.data)||(n=this._getOrReturnCtx(e,n),d(n,{validation:"base64",code:c.invalid_string,message:a.message}),r.dirty()):a.kind==="base64url"?at.test(e.data)||(n=this._getOrReturnCtx(e,n),d(n,{validation:"base64url",code:c.invalid_string,message:a.message}),r.dirty()):v.assertNever(a);return{status:r.value,value:e.data}}_regex(e,t,r){return this.refinement(n=>e.test(n),{validation:t,code:c.invalid_string,...h.errToObj(r)})}_addCheck(e){return new M({...this._def,checks:[...this._def.checks,e]})}email(e){return this._addCheck({kind:"email",...h.errToObj(e)})}url(e){return this._addCheck({kind:"url",...h.errToObj(e)})}emoji(e){return this._addCheck({kind:"emoji",...h.errToObj(e)})}uuid(e){return this._addCheck({kind:"uuid",...h.errToObj(e)})}nanoid(e){return this._addCheck({kind:"nanoid",...h.errToObj(e)})}cuid(e){return this._addCheck({kind:"cuid",...h.errToObj(e)})}cuid2(e){return this._addCheck({kind:"cuid2",...h.errToObj(e)})}ulid(e){return this._addCheck({kind:"ulid",...h.errToObj(e)})}base64(e){return this._addCheck({kind:"base64",...h.errToObj(e)})}base64url(e){return this._addCheck({kind:"base64url",...h.errToObj(e)})}jwt(e){return this._addCheck({kind:"jwt",...h.errToObj(e)})}ip(e){return this._addCheck({kind:"ip",...h.errToObj(e)})}cidr(e){return this._addCheck({kind:"cidr",...h.errToObj(e)})}datetime(e){return typeof e=="string"?this._addCheck({kind:"datetime",precision:null,offset:!1,local:!1,message:e}):this._addCheck({kind:"datetime",precision:typeof e?.precision>"u"?null:e?.precision,offset:e?.offset??!1,local:e?.local??!1,...h.errToObj(e?.message)})}date(e){return this._addCheck({kind:"date",message:e})}time(e){return typeof e=="string"?this._addCheck({kind:"time",precision:null,message:e}):this._addCheck({kind:"time",precision:typeof e?.precision>"u"?null:e?.precision,...h.errToObj(e?.message)})}duration(e){return this._addCheck({kind:"duration",...h.errToObj(e)})}regex(e,t){return this._addCheck({kind:"regex",regex:e,...h.errToObj(t)})}includes(e,t){return this._addCheck({kind:"includes",value:e,position:t?.position,...h.errToObj(t?.message)})}startsWith(e,t){return this._addCheck({kind:"startsWith",value:e,...h.errToObj(t)})}endsWith(e,t){return this._addCheck({kind:"endsWith",value:e,...h.errToObj(t)})}min(e,t){return this._addCheck({kind:"min",value:e,...h.errToObj(t)})}max(e,t){return this._addCheck({kind:"max",value:e,...h.errToObj(t)})}length(e,t){return this._addCheck({kind:"length",value:e,...h.errToObj(t)})}nonempty(e){return this.min(1,h.errToObj(e))}trim(){return new M({...this._def,checks:[...this._def.checks,{kind:"trim"}]})}toLowerCase(){return new M({...this._def,checks:[...this._def.checks,{kind:"toLowerCase"}]})}toUpperCase(){return new M({...this._def,checks:[...this._def.checks,{kind:"toUpperCase"}]})}get isDatetime(){return!!this._def.checks.find(e=>e.kind==="datetime")}get isDate(){return!!this._def.checks.find(e=>e.kind==="date")}get isTime(){return!!this._def.checks.find(e=>e.kind==="time")}get isDuration(){return!!this._def.checks.find(e=>e.kind==="duration")}get isEmail(){return!!this._def.checks.find(e=>e.kind==="email")}get isURL(){return!!this._def.checks.find(e=>e.kind==="url")}get isEmoji(){return!!this._def.checks.find(e=>e.kind==="emoji")}get isUUID(){return!!this._def.checks.find(e=>e.kind==="uuid")}get isNANOID(){return!!this._def.checks.find(e=>e.kind==="nanoid")}get isCUID(){return!!this._def.checks.find(e=>e.kind==="cuid")}get isCUID2(){return!!this._def.checks.find(e=>e.kind==="cuid2")}get isULID(){return!!this._def.checks.find(e=>e.kind==="ulid")}get isIP(){return!!this._def.checks.find(e=>e.kind==="ip")}get isCIDR(){return!!this._def.checks.find(e=>e.kind==="cidr")}get isBase64(){return!!this._def.checks.find(e=>e.kind==="base64")}get isBase64url(){return!!this._def.checks.find(e=>e.kind==="base64url")}get minLength(){let e=null;for(const t of this._def.checks)t.kind==="min"&&(e===null||t.value>e)&&(e=t.value);return e}get maxLength(){let e=null;for(const t of this._def.checks)t.kind==="max"&&(e===null||t.value<e)&&(e=t.value);return e}}M.create=s=>new M({checks:[],typeName:m.ZodString,coerce:s?.coerce??!1,...g(s)});function ft(s,e){const t=(s.toString().split(".")[1]||"").length,r=(e.toString().split(".")[1]||"").length,n=t>r?t:r,a=Number.parseInt(s.toFixed(n).replace(".","")),i=Number.parseInt(e.toFixed(n).replace(".",""));return a%i/10**n}class F extends _{constructor(){super(...arguments),this.min=this.gte,this.max=this.lte,this.step=this.multipleOf}_parse(e){if(this._def.coerce&&(e.data=Number(e.data)),this._getType(e)!==l.number){const a=this._getOrReturnCtx(e);return d(a,{code:c.invalid_type,expected:l.number,received:a.parsedType}),p}let r;const n=new I;for(const a of this._def.checks)a.kind==="int"?v.isInteger(e.data)||(r=this._getOrReturnCtx(e,r),d(r,{code:c.invalid_type,expected:"integer",received:"float",message:a.message}),n.dirty()):a.kind==="min"?(a.inclusive?e.data<a.value:e.data<=a.value)&&(r=this._getOrReturnCtx(e,r),d(r,{code:c.too_small,minimum:a.value,type:"number",inclusive:a.inclusive,exact:!1,message:a.message}),n.dirty()):a.kind==="max"?(a.inclusive?e.data>a.value:e.data>=a.value)&&(r=this._getOrReturnCtx(e,r),d(r,{code:c.too_big,maximum:a.value,type:"number",inclusive:a.inclusive,exact:!1,message:a.message}),n.dirty()):a.kind==="multipleOf"?ft(e.data,a.value)!==0&&(r=this._getOrReturnCtx(e,r),d(r,{code:c.not_multiple_of,multipleOf:a.value,message:a.message}),n.dirty()):a.kind==="finite"?Number.isFinite(e.data)||(r=this._getOrReturnCtx(e,r),d(r,{code:c.not_finite,message:a.message}),n.dirty()):v.assertNever(a);return{status:n.value,value:e.data}}gte(e,t){return this.setLimit("min",e,!0,h.toString(t))}gt(e,t){return this.setLimit("min",e,!1,h.toString(t))}lte(e,t){return this.setLimit("max",e,!0,h.toString(t))}lt(e,t){return this.setLimit("max",e,!1,h.toString(t))}setLimit(e,t,r,n){return new F({...this._def,checks:[...this._def.checks,{kind:e,value:t,inclusive:r,message:h.toString(n)}]})}_addCheck(e){return new F({...this._def,checks:[...this._def.checks,e]})}int(e){return this._addCheck({kind:"int",message:h.toString(e)})}positive(e){return this._addCheck({kind:"min",value:0,inclusive:!1,message:h.toString(e)})}negative(e){return this._addCheck({kind:"max",value:0,inclusive:!1,message:h.toString(e)})}nonpositive(e){return this._addCheck({kind:"max",value:0,inclusive:!0,message:h.toString(e)})}nonnegative(e){return this._addCheck({kind:"min",value:0,inclusive:!0,message:h.toString(e)})}multipleOf(e,t){return this._addCheck({kind:"multipleOf",value:e,message:h.toString(t)})}finite(e){return this._addCheck({kind:"finite",message:h.toString(e)})}safe(e){return this._addCheck({kind:"min",inclusive:!0,value:Number.MIN_SAFE_INTEGER,message:h.toString(e)})._addCheck({kind:"max",inclusive:!0,value:Number.MAX_SAFE_INTEGER,message:h.toString(e)})}get minValue(){let e=null;for(const t of this._def.checks)t.kind==="min"&&(e===null||t.value>e)&&(e=t.value);return e}get maxValue(){let e=null;for(const t of this._def.checks)t.kind==="max"&&(e===null||t.value<e)&&(e=t.value);return e}get isInt(){return!!this._def.checks.find(e=>e.kind==="int"||e.kind==="multipleOf"&&v.isInteger(e.value))}get isFinite(){let e=null,t=null;for(const r of this._def.checks){if(r.kind==="finite"||r.kind==="int"||r.kind==="multipleOf")return!0;r.kind==="min"?(t===null||r.value>t)&&(t=r.value):r.kind==="max"&&(e===null||r.value<e)&&(e=r.value)}return Number.isFinite(t)&&Number.isFinite(e)}}F.create=s=>new F({checks:[],typeName:m.ZodNumber,coerce:s?.coerce||!1,...g(s)});class K extends _{constructor(){super(...arguments),this.min=this.gte,this.max=this.lte}_parse(e){if(this._def.coerce)try{e.data=BigInt(e.data)}catch{return this._getInvalidInput(e)}if(this._getType(e)!==l.bigint)return this._getInvalidInput(e);let r;const n=new I;for(const a of this._def.checks)a.kind==="min"?(a.inclusive?e.data<a.value:e.data<=a.value)&&(r=this._getOrReturnCtx(e,r),d(r,{code:c.too_small,type:"bigint",minimum:a.value,inclusive:a.inclusive,message:a.message}),n.dirty()):a.kind==="max"?(a.inclusive?e.data>a.value:e.data>=a.value)&&(r=this._getOrReturnCtx(e,r),d(r,{code:c.too_big,type:"bigint",maximum:a.value,inclusive:a.inclusive,message:a.message}),n.dirty()):a.kind==="multipleOf"?e.data%a.value!==BigInt(0)&&(r=this._getOrReturnCtx(e,r),d(r,{code:c.not_multiple_of,multipleOf:a.value,message:a.message}),n.dirty()):v.assertNever(a);return{status:n.value,value:e.data}}_getInvalidInput(e){const t=this._getOrReturnCtx(e);return d(t,{code:c.invalid_type,expected:l.bigint,received:t.parsedType}),p}gte(e,t){return this.setLimit("min",e,!0,h.toString(t))}gt(e,t){return this.setLimit("min",e,!1,h.toString(t))}lte(e,t){return this.setLimit("max",e,!0,h.toString(t))}lt(e,t){return this.setLimit("max",e,!1,h.toString(t))}setLimit(e,t,r,n){return new K({...this._def,checks:[...this._def.checks,{kind:e,value:t,inclusive:r,message:h.toString(n)}]})}_addCheck(e){return new K({...this._def,checks:[...this._def.checks,e]})}positive(e){return this._addCheck({kind:"min",value:BigInt(0),inclusive:!1,message:h.toString(e)})}negative(e){return this._addCheck({kind:"max",value:BigInt(0),inclusive:!1,message:h.toString(e)})}nonpositive(e){return this._addCheck({kind:"max",value:BigInt(0),inclusive:!0,message:h.toString(e)})}nonnegative(e){return this._addCheck({kind:"min",value:BigInt(0),inclusive:!0,message:h.toString(e)})}multipleOf(e,t){return this._addCheck({kind:"multipleOf",value:e,message:h.toString(t)})}get minValue(){let e=null;for(const t of this._def.checks)t.kind==="min"&&(e===null||t.value>e)&&(e=t.value);return e}get maxValue(){let e=null;for(const t of this._def.checks)t.kind==="max"&&(e===null||t.value<e)&&(e=t.value);return e}}K.create=s=>new K({checks:[],typeName:m.ZodBigInt,coerce:s?.coerce??!1,...g(s)});class fe extends _{_parse(e){if(this._def.coerce&&(e.data=!!e.data),this._getType(e)!==l.boolean){const r=this._getOrReturnCtx(e);return d(r,{code:c.invalid_type,expected:l.boolean,received:r.parsedType}),p}return C(e.data)}}fe.create=s=>new fe({typeName:m.ZodBoolean,coerce:s?.coerce||!1,...g(s)});class ne extends _{_parse(e){if(this._def.coerce&&(e.data=new Date(e.data)),this._getType(e)!==l.date){const a=this._getOrReturnCtx(e);return d(a,{code:c.invalid_type,expected:l.date,received:a.parsedType}),p}if(Number.isNaN(e.data.getTime())){const a=this._getOrReturnCtx(e);return d(a,{code:c.invalid_date}),p}const r=new I;let n;for(const a of this._def.checks)a.kind==="min"?e.data.getTime()<a.value&&(n=this._getOrReturnCtx(e,n),d(n,{code:c.too_small,message:a.message,inclusive:!0,exact:!1,minimum:a.value,type:"date"}),r.dirty()):a.kind==="max"?e.data.getTime()>a.value&&(n=this._getOrReturnCtx(e,n),d(n,{code:c.too_big,message:a.message,inclusive:!0,exact:!1,maximum:a.value,type:"date"}),r.dirty()):v.assertNever(a);return{status:r.value,value:new Date(e.data.getTime())}}_addCheck(e){return new ne({...this._def,checks:[...this._def.checks,e]})}min(e,t){return this._addCheck({kind:"min",value:e.getTime(),message:h.toString(t)})}max(e,t){return this._addCheck({kind:"max",value:e.getTime(),message:h.toString(t)})}get minDate(){let e=null;for(const t of this._def.checks)t.kind==="min"&&(e===null||t.value>e)&&(e=t.value);return e!=null?new Date(e):null}get maxDate(){let e=null;for(const t of this._def.checks)t.kind==="max"&&(e===null||t.value<e)&&(e=t.value);return e!=null?new Date(e):null}}ne.create=s=>new ne({checks:[],coerce:s?.coerce||!1,typeName:m.ZodDate,...g(s)});class Ce extends _{_parse(e){if(this._getType(e)!==l.symbol){const r=this._getOrReturnCtx(e);return d(r,{code:c.invalid_type,expected:l.symbol,received:r.parsedType}),p}return C(e.data)}}Ce.create=s=>new Ce({typeName:m.ZodSymbol,...g(s)});class Se extends _{_parse(e){if(this._getType(e)!==l.undefined){const r=this._getOrReturnCtx(e);return d(r,{code:c.invalid_type,expected:l.undefined,received:r.parsedType}),p}return C(e.data)}}Se.create=s=>new Se({typeName:m.ZodUndefined,...g(s)});class he extends _{_parse(e){if(this._getType(e)!==l.null){const r=this._getOrReturnCtx(e);return d(r,{code:c.invalid_type,expected:l.null,received:r.parsedType}),p}return C(e.data)}}he.create=s=>new he({typeName:m.ZodNull,...g(s)});class Oe extends _{constructor(){super(...arguments),this._any=!0}_parse(e){return C(e.data)}}Oe.create=s=>new Oe({typeName:m.ZodAny,...g(s)});class Ae extends _{constructor(){super(...arguments),this._unknown=!0}_parse(e){return C(e.data)}}Ae.create=s=>new Ae({typeName:m.ZodUnknown,...g(s)});class U extends _{_parse(e){const t=this._getOrReturnCtx(e);return d(t,{code:c.invalid_type,expected:l.never,received:t.parsedType}),p}}U.create=s=>new U({typeName:m.ZodNever,...g(s)});class Re extends _{_parse(e){if(this._getType(e)!==l.undefined){const r=this._getOrReturnCtx(e);return d(r,{code:c.invalid_type,expected:l.void,received:r.parsedType}),p}return C(e.data)}}Re.create=s=>new Re({typeName:m.ZodVoid,...g(s)});class A extends _{_parse(e){const{ctx:t,status:r}=this._processInputParams(e),n=this._def;if(t.parsedType!==l.array)return d(t,{code:c.invalid_type,expected:l.array,received:t.parsedType}),p;if(n.exactLength!==null){const i=t.data.length>n.exactLength.value,o=t.data.length<n.exactLength.value;(i||o)&&(d(t,{code:i?c.too_big:c.too_small,minimum:o?n.exactLength.value:void 0,maximum:i?n.exactLength.value:void 0,type:"array",inclusive:!0,exact:!0,message:n.exactLength.message}),r.dirty())}if(n.minLength!==null&&t.data.length<n.minLength.value&&(d(t,{code:c.too_small,minimum:n.minLength.value,type:"array",inclusive:!0,exact:!1,message:n.minLength.message}),r.dirty()),n.maxLength!==null&&t.data.length>n.maxLength.value&&(d(t,{code:c.too_big,maximum:n.maxLength.value,type:"array",inclusive:!0,exact:!1,message:n.maxLength.message}),r.dirty()),t.common.async)return Promise.all([...t.data].map((i,o)=>n.type._parseAsync(new O(t,i,t.path,o)))).then(i=>I.mergeArray(r,i));const a=[...t.data].map((i,o)=>n.type._parseSync(new O(t,i,t.path,o)));return I.mergeArray(r,a)}get element(){return this._def.type}min(e,t){return new A({...this._def,minLength:{value:e,message:h.toString(t)}})}max(e,t){return new A({...this._def,maxLength:{value:e,message:h.toString(t)}})}length(e,t){return new A({...this._def,exactLength:{value:e,message:h.toString(t)}})}nonempty(e){return this.min(1,e)}}A.create=(s,e)=>new A({type:s,minLength:null,maxLength:null,exactLength:null,typeName:m.ZodArray,...g(e)});function W(s){if(s instanceof x){const e={};for(const t in s.shape){const r=s.shape[t];e[t]=V.create(W(r))}return new x({...s._def,shape:()=>e})}else return s instanceof A?new A({...s._def,type:W(s.element)}):s instanceof V?V.create(W(s.unwrap())):s instanceof G?G.create(W(s.unwrap())):s instanceof z?z.create(s.items.map(e=>W(e))):s}class x extends _{constructor(){super(...arguments),this._cached=null,this.nonstrict=this.passthrough,this.augment=this.extend}_getCached(){if(this._cached!==null)return this._cached;const e=this._def.shape(),t=v.objectKeys(e);return this._cached={shape:e,keys:t},this._cached}_parse(e){if(this._getType(e)!==l.object){const f=this._getOrReturnCtx(e);return d(f,{code:c.invalid_type,expected:l.object,received:f.parsedType}),p}const{status:r,ctx:n}=this._processInputParams(e),{shape:a,keys:i}=this._getCached(),o=[];if(!(this._def.catchall instanceof U&&this._def.unknownKeys==="strip"))for(const f in n.data)i.includes(f)||o.push(f);const u=[];for(const f of i){const y=a[f],N=n.data[f];u.push({key:{status:"valid",value:f},value:y._parse(new O(n,N,n.path,f)),alwaysSet:f in n.data})}if(this._def.catchall instanceof U){const f=this._def.unknownKeys;if(f==="passthrough")for(const y of o)u.push({key:{status:"valid",value:y},value:{status:"valid",value:n.data[y]}});else if(f==="strict")o.length>0&&(d(n,{code:c.unrecognized_keys,keys:o}),r.dirty());else if(f!=="strip")throw new Error("Internal ZodObject error: invalid unknownKeys value.")}else{const f=this._def.catchall;for(const y of o){const N=n.data[y];u.push({key:{status:"valid",value:y},value:f._parse(new O(n,N,n.path,y)),alwaysSet:y in n.data})}}return n.common.async?Promise.resolve().then(async()=>{const f=[];for(const y of u){const N=await y.key,T=await y.value;f.push({key:N,value:T,alwaysSet:y.alwaysSet})}return f}).then(f=>I.mergeObjectSync(r,f)):I.mergeObjectSync(r,u)}get shape(){return this._def.shape()}strict(e){return h.errToObj,new x({...this._def,unknownKeys:"strict",...e!==void 0?{errorMap:(t,r)=>{const n=this._def.errorMap?.(t,r).message??r.defaultError;return t.code==="unrecognized_keys"?{message:h.errToObj(e).message??n}:{message:n}}}:{}})}strip(){return new x({...this._def,unknownKeys:"strip"})}passthrough(){return new x({...this._def,unknownKeys:"passthrough"})}extend(e){return new x({...this._def,shape:()=>({...this._def.shape(),...e})})}merge(e){return new x({unknownKeys:e._def.unknownKeys,catchall:e._def.catchall,shape:()=>({...this._def.shape(),...e._def.shape()}),typeName:m.ZodObject})}setKey(e,t){return this.augment({[e]:t})}catchall(e){return new x({...this._def,catchall:e})}pick(e){const t={};for(const r of v.objectKeys(e))e[r]&&this.shape[r]&&(t[r]=this.shape[r]);return new x({...this._def,shape:()=>t})}omit(e){const t={};for(const r of v.objectKeys(this.shape))e[r]||(t[r]=this.shape[r]);return new x({...this._def,shape:()=>t})}deepPartial(){return W(this)}partial(e){const t={};for(const r of v.objectKeys(this.shape)){const n=this.shape[r];e&&!e[r]?t[r]=n:t[r]=n.optional()}return new x({...this._def,shape:()=>t})}required(e){const t={};for(const r of v.objectKeys(this.shape))if(e&&!e[r])t[r]=this.shape[r];else{let a=this.shape[r];for(;a instanceof V;)a=a._def.innerType;t[r]=a}return new x({...this._def,shape:()=>t})}keyof(){return je(v.objectKeys(this.shape))}}x.create=(s,e)=>new x({shape:()=>s,unknownKeys:"strip",catchall:U.create(),typeName:m.ZodObject,...g(e)}),x.strictCreate=(s,e)=>new x({shape:()=>s,unknownKeys:"strict",catchall:U.create(),typeName:m.ZodObject,...g(e)}),x.lazycreate=(s,e)=>new x({shape:s,unknownKeys:"strip",catchall:U.create(),typeName:m.ZodObject,...g(e)});class ae extends _{_parse(e){const{ctx:t}=this._processInputParams(e),r=this._def.options;function n(a){for(const o of a)if(o.result.status==="valid")return o.result;for(const o of a)if(o.result.status==="dirty")return t.common.issues.push(...o.ctx.common.issues),o.result;const i=a.map(o=>new j(o.ctx.common.issues));return d(t,{code:c.invalid_union,unionErrors:i}),p}if(t.common.async)return Promise.all(r.map(async a=>{const i={...t,common:{...t.common,issues:[]},parent:null};return{result:await a._parseAsync({data:t.data,path:t.path,parent:i}),ctx:i}})).then(n);{let a;const i=[];for(const u of r){const f={...t,common:{...t.common,issues:[]},parent:null},y=u._parseSync({data:t.data,path:t.path,parent:f});if(y.status==="valid")return y;y.status==="dirty"&&!a&&(a={result:y,ctx:f}),f.common.issues.length&&i.push(f.common.issues)}if(a)return t.common.issues.push(...a.ctx.common.issues),a.result;const o=i.map(u=>new j(u));return d(t,{code:c.invalid_union,unionErrors:o}),p}}get options(){return this._def.options}}ae.create=(s,e)=>new ae({options:s,typeName:m.ZodUnion,...g(e)});function me(s,e){const t=L(s),r=L(e);if(s===e)return{valid:!0,data:s};if(t===l.object&&r===l.object){const n=v.objectKeys(e),a=v.objectKeys(s).filter(o=>n.indexOf(o)!==-1),i={...s,...e};for(const o of a){const u=me(s[o],e[o]);if(!u.valid)return{valid:!1};i[o]=u.data}return{valid:!0,data:i}}else if(t===l.array&&r===l.array){if(s.length!==e.length)return{valid:!1};const n=[];for(let a=0;a<s.length;a++){const i=s[a],o=e[a],u=me(i,o);if(!u.valid)return{valid:!1};n.push(u.data)}return{valid:!0,data:n}}else return t===l.date&&r===l.date&&+s==+e?{valid:!0,data:s}:{valid:!1}}class ie extends _{_parse(e){const{status:t,ctx:r}=this._processInputParams(e),n=(a,i)=>{if(we(a)||we(i))return p;const o=me(a.value,i.value);return o.valid?((Ie(a)||Ie(i))&&t.dirty(),{status:t.value,value:o.data}):(d(r,{code:c.invalid_intersection_types}),p)};return r.common.async?Promise.all([this._def.left._parseAsync({data:r.data,path:r.path,parent:r}),this._def.right._parseAsync({data:r.data,path:r.path,parent:r})]).then(([a,i])=>n(a,i)):n(this._def.left._parseSync({data:r.data,path:r.path,parent:r}),this._def.right._parseSync({data:r.data,path:r.path,parent:r}))}}ie.create=(s,e,t)=>new ie({left:s,right:e,typeName:m.ZodIntersection,...g(t)});class z extends _{_parse(e){const{status:t,ctx:r}=this._processInputParams(e);if(r.parsedType!==l.array)return d(r,{code:c.invalid_type,expected:l.array,received:r.parsedType}),p;if(r.data.length<this._def.items.length)return d(r,{code:c.too_small,minimum:this._def.items.length,inclusive:!0,exact:!1,type:"array"}),p;!this._def.rest&&r.data.length>this._def.items.length&&(d(r,{code:c.too_big,maximum:this._def.items.length,inclusive:!0,exact:!1,type:"array"}),t.dirty());const a=[...r.data].map((i,o)=>{const u=this._def.items[o]||this._def.rest;return u?u._parse(new O(r,i,r.path,o)):null}).filter(i=>!!i);return r.common.async?Promise.all(a).then(i=>I.mergeArray(t,i)):I.mergeArray(t,a)}get items(){return this._def.items}rest(e){return new z({...this._def,rest:e})}}z.create=(s,e)=>{if(!Array.isArray(s))throw new Error("You must pass an array of schemas to z.tuple([ ... ])");return new z({items:s,typeName:m.ZodTuple,rest:null,...g(e)})};class oe extends _{get keySchema(){return this._def.keyType}get valueSchema(){return this._def.valueType}_parse(e){const{status:t,ctx:r}=this._processInputParams(e);if(r.parsedType!==l.object)return d(r,{code:c.invalid_type,expected:l.object,received:r.parsedType}),p;const n=[],a=this._def.keyType,i=this._def.valueType;for(const o in r.data)n.push({key:a._parse(new O(r,o,r.path,o)),value:i._parse(new O(r,r.data[o],r.path,o)),alwaysSet:o in r.data});return r.common.async?I.mergeObjectAsync(t,n):I.mergeObjectSync(t,n)}get element(){return this._def.valueType}static create(e,t,r){return t instanceof _?new oe({keyType:e,valueType:t,typeName:m.ZodRecord,...g(r)}):new oe({keyType:M.create(),valueType:e,typeName:m.ZodRecord,...g(t)})}}class De extends _{get keySchema(){return this._def.keyType}get valueSchema(){return this._def.valueType}_parse(e){const{status:t,ctx:r}=this._processInputParams(e);if(r.parsedType!==l.map)return d(r,{code:c.invalid_type,expected:l.map,received:r.parsedType}),p;const n=this._def.keyType,a=this._def.valueType,i=[...r.data.entries()].map(([o,u],f)=>({key:n._parse(new O(r,o,r.path,[f,"key"])),value:a._parse(new O(r,u,r.path,[f,"value"]))}));if(r.common.async){const o=new Map;return Promise.resolve().then(async()=>{for(const u of i){const f=await u.key,y=await u.value;if(f.status==="aborted"||y.status==="aborted")return p;(f.status==="dirty"||y.status==="dirty")&&t.dirty(),o.set(f.value,y.value)}return{status:t.value,value:o}})}else{const o=new Map;for(const u of i){const f=u.key,y=u.value;if(f.status==="aborted"||y.status==="aborted")return p;(f.status==="dirty"||y.status==="dirty")&&t.dirty(),o.set(f.value,y.value)}return{status:t.value,value:o}}}}De.create=(s,e,t)=>new De({valueType:e,keyType:s,typeName:m.ZodMap,...g(t)});class ee extends _{_parse(e){const{status:t,ctx:r}=this._processInputParams(e);if(r.parsedType!==l.set)return d(r,{code:c.invalid_type,expected:l.set,received:r.parsedType}),p;const n=this._def;n.minSize!==null&&r.data.size<n.minSize.value&&(d(r,{code:c.too_small,minimum:n.minSize.value,type:"set",inclusive:!0,exact:!1,message:n.minSize.message}),t.dirty()),n.maxSize!==null&&r.data.size>n.maxSize.value&&(d(r,{code:c.too_big,maximum:n.maxSize.value,type:"set",inclusive:!0,exact:!1,message:n.maxSize.message}),t.dirty());const a=this._def.valueType;function i(u){const f=new Set;for(const y of u){if(y.status==="aborted")return p;y.status==="dirty"&&t.dirty(),f.add(y.value)}return{status:t.value,value:f}}const o=[...r.data.values()].map((u,f)=>a._parse(new O(r,u,r.path,f)));return r.common.async?Promise.all(o).then(u=>i(u)):i(o)}min(e,t){return new ee({...this._def,minSize:{value:e,message:h.toString(t)}})}max(e,t){return new ee({...this._def,maxSize:{value:e,message:h.toString(t)}})}size(e,t){return this.min(e,t).max(e,t)}nonempty(e){return this.min(1,e)}}ee.create=(s,e)=>new ee({valueType:s,minSize:null,maxSize:null,typeName:m.ZodSet,...g(e)});class Ze extends _{get schema(){return this._def.getter()}_parse(e){const{ctx:t}=this._processInputParams(e);return this._def.getter()._parse({data:t.data,path:t.path,parent:t})}}Ze.create=(s,e)=>new Ze({getter:s,typeName:m.ZodLazy,...g(e)});class pe extends _{_parse(e){if(e.data!==this._def.value){const t=this._getOrReturnCtx(e);return d(t,{received:t.data,code:c.invalid_literal,expected:this._def.value}),p}return{status:"valid",value:e.data}}get value(){return this._def.value}}pe.create=(s,e)=>new pe({value:s,typeName:m.ZodLiteral,...g(e)});function je(s,e){return new Y({values:s,typeName:m.ZodEnum,...g(e)})}class Y extends _{_parse(e){if(typeof e.data!="string"){const t=this._getOrReturnCtx(e),r=this._def.values;return d(t,{expected:v.joinValues(r),received:t.parsedType,code:c.invalid_type}),p}if(this._cache||(this._cache=new Set(this._def.values)),!this._cache.has(e.data)){const t=this._getOrReturnCtx(e),r=this._def.values;return d(t,{received:t.data,code:c.invalid_enum_value,options:r}),p}return C(e.data)}get options(){return this._def.values}get enum(){const e={};for(const t of this._def.values)e[t]=t;return e}get Values(){const e={};for(const t of this._def.values)e[t]=t;return e}get Enum(){const e={};for(const t of this._def.values)e[t]=t;return e}extract(e,t=this._def){return Y.create(e,{...this._def,...t})}exclude(e,t=this._def){return Y.create(this.options.filter(r=>!e.includes(r)),{...this._def,...t})}}Y.create=je;class Me extends _{_parse(e){const t=v.getValidEnumValues(this._def.values),r=this._getOrReturnCtx(e);if(r.parsedType!==l.string&&r.parsedType!==l.number){const n=v.objectValues(t);return d(r,{expected:v.joinValues(n),received:r.parsedType,code:c.invalid_type}),p}if(this._cache||(this._cache=new Set(v.getValidEnumValues(this._def.values))),!this._cache.has(e.data)){const n=v.objectValues(t);return d(r,{received:r.data,code:c.invalid_enum_value,options:n}),p}return C(e.data)}get enum(){return this._def.values}}Me.create=(s,e)=>new Me({values:s,typeName:m.ZodNativeEnum,...g(e)});class ce extends _{unwrap(){return this._def.type}_parse(e){const{ctx:t}=this._processInputParams(e);if(t.parsedType!==l.promise&&t.common.async===!1)return d(t,{code:c.invalid_type,expected:l.promise,received:t.parsedType}),p;const r=t.parsedType===l.promise?t.data:Promise.resolve(t.data);return C(r.then(n=>this._def.type.parseAsync(n,{path:t.path,errorMap:t.common.contextualErrorMap})))}}ce.create=(s,e)=>new ce({type:s,typeName:m.ZodPromise,...g(e)});class H extends _{innerType(){return this._def.schema}sourceType(){return this._def.schema._def.typeName===m.ZodEffects?this._def.schema.sourceType():this._def.schema}_parse(e){const{status:t,ctx:r}=this._processInputParams(e),n=this._def.effect||null,a={addIssue:i=>{d(r,i),i.fatal?t.abort():t.dirty()},get path(){return r.path}};if(a.addIssue=a.addIssue.bind(a),n.type==="preprocess"){const i=n.transform(r.data,a);if(r.common.async)return Promise.resolve(i).then(async o=>{if(t.value==="aborted")return p;const u=await this._def.schema._parseAsync({data:o,path:r.path,parent:r});return u.status==="aborted"?p:u.status==="dirty"||t.value==="dirty"?X(u.value):u});{if(t.value==="aborted")return p;const o=this._def.schema._parseSync({data:i,path:r.path,parent:r});return o.status==="aborted"?p:o.status==="dirty"||t.value==="dirty"?X(o.value):o}}if(n.type==="refinement"){const i=o=>{const u=n.refinement(o,a);if(r.common.async)return Promise.resolve(u);if(u instanceof Promise)throw new Error("Async refinement encountered during synchronous parse operation. Use .parseAsync instead.");return o};if(r.common.async===!1){const o=this._def.schema._parseSync({data:r.data,path:r.path,parent:r});return o.status==="aborted"?p:(o.status==="dirty"&&t.dirty(),i(o.value),{status:t.value,value:o.value})}else return this._def.schema._parseAsync({data:r.data,path:r.path,parent:r}).then(o=>o.status==="aborted"?p:(o.status==="dirty"&&t.dirty(),i(o.value).then(()=>({status:t.value,value:o.value}))))}if(n.type==="transform")if(r.common.async===!1){const i=this._def.schema._parseSync({data:r.data,path:r.path,parent:r});if(!B(i))return p;const o=n.transform(i.value,a);if(o instanceof Promise)throw new Error("Asynchronous transform encountered during synchronous parse operation. Use .parseAsync instead.");return{status:t.value,value:o}}else return this._def.schema._parseAsync({data:r.data,path:r.path,parent:r}).then(i=>B(i)?Promise.resolve(n.transform(i.value,a)).then(o=>({status:t.value,value:o})):p);v.assertNever(n)}}H.create=(s,e,t)=>new H({schema:s,typeName:m.ZodEffects,effect:e,...g(t)}),H.createWithPreprocess=(s,e,t)=>new H({schema:e,effect:{type:"preprocess",transform:s},typeName:m.ZodEffects,...g(t)});class V extends _{_parse(e){return this._getType(e)===l.undefined?C(void 0):this._def.innerType._parse(e)}unwrap(){return this._def.innerType}}V.create=(s,e)=>new V({innerType:s,typeName:m.ZodOptional,...g(e)});class G extends _{_parse(e){return this._getType(e)===l.null?C(null):this._def.innerType._parse(e)}unwrap(){return this._def.innerType}}G.create=(s,e)=>new G({innerType:s,typeName:m.ZodNullable,...g(e)});class ye extends _{_parse(e){const{ctx:t}=this._processInputParams(e);let r=t.data;return t.parsedType===l.undefined&&(r=this._def.defaultValue()),this._def.innerType._parse({data:r,path:t.path,parent:t})}removeDefault(){return this._def.innerType}}ye.create=(s,e)=>new ye({innerType:s,typeName:m.ZodDefault,defaultValue:typeof e.default=="function"?e.default:()=>e.default,...g(e)});class ge extends _{_parse(e){const{ctx:t}=this._processInputParams(e),r={...t,common:{...t.common,issues:[]}},n=this._def.innerType._parse({data:r.data,path:r.path,parent:{...r}});return re(n)?n.then(a=>({status:"valid",value:a.status==="valid"?a.value:this._def.catchValue({get error(){return new j(r.common.issues)},input:r.data})})):{status:"valid",value:n.status==="valid"?n.value:this._def.catchValue({get error(){return new j(r.common.issues)},input:r.data})}}removeCatch(){return this._def.innerType}}ge.create=(s,e)=>new ge({innerType:s,typeName:m.ZodCatch,catchValue:typeof e.catch=="function"?e.catch:()=>e.catch,...g(e)});class $e extends _{_parse(e){if(this._getType(e)!==l.nan){const r=this._getOrReturnCtx(e);return d(r,{code:c.invalid_type,expected:l.nan,received:r.parsedType}),p}return{status:"valid",value:e.data}}}$e.create=s=>new $e({typeName:m.ZodNaN,...g(s)});class ht extends _{_parse(e){const{ctx:t}=this._processInputParams(e),r=t.data;return this._def.type._parse({data:r,path:t.path,parent:t})}unwrap(){return this._def.type}}class _e extends _{_parse(e){const{status:t,ctx:r}=this._processInputParams(e);if(r.common.async)return(async()=>{const a=await this._def.in._parseAsync({data:r.data,path:r.path,parent:r});return a.status==="aborted"?p:a.status==="dirty"?(t.dirty(),X(a.value)):this._def.out._parseAsync({data:a.value,path:r.path,parent:r})})();{const n=this._def.in._parseSync({data:r.data,path:r.path,parent:r});return n.status==="aborted"?p:n.status==="dirty"?(t.dirty(),{status:"dirty",value:n.value}):this._def.out._parseSync({data:n.value,path:r.path,parent:r})}}static create(e,t){return new _e({in:e,out:t,typeName:m.ZodPipeline})}}class ve extends _{_parse(e){const t=this._def.innerType._parse(e),r=n=>(B(n)&&(n.value=Object.freeze(n.value)),n);return re(t)?t.then(n=>r(n)):r(t)}unwrap(){return this._def.innerType}}ve.create=(s,e)=>new ve({innerType:s,typeName:m.ZodReadonly,...g(e)});var m;(function(s){s.ZodString="ZodString",s.ZodNumber="ZodNumber",s.ZodNaN="ZodNaN",s.ZodBigInt="ZodBigInt",s.ZodBoolean="ZodBoolean",s.ZodDate="ZodDate",s.ZodSymbol="ZodSymbol",s.ZodUndefined="ZodUndefined",s.ZodNull="ZodNull",s.ZodAny="ZodAny",s.ZodUnknown="ZodUnknown",s.ZodNever="ZodNever",s.ZodVoid="ZodVoid",s.ZodArray="ZodArray",s.ZodObject="ZodObject",s.ZodUnion="ZodUnion",s.ZodDiscriminatedUnion="ZodDiscriminatedUnion",s.ZodIntersection="ZodIntersection",s.ZodTuple="ZodTuple",s.ZodRecord="ZodRecord",s.ZodMap="ZodMap",s.ZodSet="ZodSet",s.ZodFunction="ZodFunction",s.ZodLazy="ZodLazy",s.ZodLiteral="ZodLiteral",s.ZodEnum="ZodEnum",s.ZodEffects="ZodEffects",s.ZodNativeEnum="ZodNativeEnum",s.ZodOptional="ZodOptional",s.ZodNullable="ZodNullable",s.ZodDefault="ZodDefault",s.ZodCatch="ZodCatch",s.ZodPromise="ZodPromise",s.ZodBranded="ZodBranded",s.ZodPipeline="ZodPipeline",s.ZodReadonly="ZodReadonly"})(m||(m={}));const R=M.create,mt=F.create,pt=fe.create,yt=he.create;U.create;const xe=A.create,te=x.create,gt=ae.create;ie.create,z.create;const _t=oe.create,q=pe.create,vt=Y.create;ce.create,V.create,G.create;function xt(s,e){if(s==null)return{};var t={},r=Object.keys(s),n,a;for(a=0;a<r.length;a++)n=r[a],!(e.indexOf(n)>=0)&&(t[n]=s[n]);return t}const Le="xpert.artifact-document",Ue=1,de=R().regex(/^[A-Za-z][A-Za-z0-9_.-]{0,79}$/),bt=gt([R().max(4e3),mt().finite(),pt(),yt()]),Ve=_t(de,bt).refine(s=>Object.keys(s).length<=24,"Too many controls"),kt=te({type:q("query"),requestId:R().min(1).max(80),bindingId:de,controls:Ve}).strict(),wt=te({bindingIds:xe(de).max(64).refine(s=>new Set(s).size===s.length,"Duplicate binding IDs"),defaults:Ve,theme:vt(["light","dark"]),locale:R().min(1).max(80)}).strict(),It=R().min(1).max(3e5).superRefine((s,e)=>{(new TextEncoder().encode(s).byteLength>3e5||!/<html[\s>]/i.test(s)||!/<body[\s>]/i.test(s))&&e.addIssue({code:"custom",message:"Supply a complete UTF-8 HTML document, at most 300 KB"})}),Tt=new Uint32Array([1116352408,1899447441,3049323471,3921009573,961987163,1508970993,2453635748,2870763221,3624381080,310598401,607225278,1426881987,1925078388,2162078206,2614888103,3248222580,3835390401,4022224774,264347078,604807628,770255983,1249150122,1555081692,1996064986,2554220882,2821834349,2952996808,3210313671,3336571891,3584528711,113926993,338241895,666307205,773529912,1294757372,1396182291,1695183700,1986661051,2177026350,2456956037,2730485921,2820302411,3259730800,3345764771,3516065817,3600352804,4094571909,275423344,430227734,506948616,659060556,883997877,958139571,1322822218,1537002063,1747873779,1955562222,2024104815,2227730452,2361852424,2428436474,2756734187,3204031479,3329325298]),D=(s,e)=>s>>>e|s<<32-e;function Et(s){const e=new Uint8Array(Math.ceil((s.length+9)/64)*64);e.set(s),e[s.length]=128;const t=new DataView(e.buffer);t.setUint32(e.length-8,Math.floor(s.length/536870912)),t.setUint32(e.length-4,s.length*8>>>0);const r=new Uint32Array([1779033703,3144134277,1013904242,2773480762,1359893119,2600822924,528734635,1541459225]),n=new Uint32Array(64);for(let a=0;a<e.length;a+=64){for(let b=0;b<16;b++)n[b]=t.getUint32(a+b*4);for(let b=16;b<64;b++){const E=n[b-15],Z=n[b-2],P=D(E,7)^D(E,18)^E>>>3,Q=D(Z,17)^D(Z,19)^Z>>>10;n[b]=n[b-16]+P+n[b-7]+Q>>>0}let[i,o,u,f,y,N,T,J]=r;for(let b=0;b<64;b++){const E=D(y,6)^D(y,11)^D(y,25),Z=y&N^~y&T,P=J+E+Z+Tt[b]+n[b]>>>0,Q=D(i,2)^D(i,13)^D(i,22),w=i&o^i&u^o&u,S=Q+w>>>0;J=T,T=N,N=y,y=f+P>>>0,f=u,u=o,o=i,i=P+S>>>0}r[0]=r[0]+i>>>0,r[1]=r[1]+o>>>0,r[2]=r[2]+u>>>0,r[3]=r[3]+f>>>0,r[4]=r[4]+y>>>0,r[5]=r[5]+N>>>0,r[6]=r[6]+T>>>0,r[7]=r[7]+J>>>0}return Array.from(r,a=>a.toString(16).padStart(8,"0")).join("")}const Pe=te({id:de,version:R().regex(/^\d+\.\d+\.\d+(?:-[A-Za-z0-9.-]+)?$/),format:q("classic-script"),global:R().regex(/^[A-Za-z_$][A-Za-z0-9_$]{0,79}$/).refine(s=>!["window","self","globalThis","document","parent","top","location","xpertLiveArtifact","__proto__","constructor","prototype"].includes(s)),sha256:R().regex(/^[a-f0-9]{64}$/)}).strict(),Nt=Pe.transform(s=>({id:s.id,version:s.version,format:"classic-script",global:s.global,sha256:s.sha256})),Ct=xe(Nt).max(8).superRefine((s,e)=>{(new Set(s.map(t=>t.id)).size!==s.length||new Set(s.map(t=>t.global)).size!==s.length)&&e.addIssue({code:"custom",message:"Duplicate dependency ID or global"})}),St=xe(Pe.extend({source:R().min(1).max(4e6)}).strict().transform(s=>({id:s.id,version:s.version,format:"classic-script",global:s.global,sha256:s.sha256,source:s.source}))).max(8);function Ot(s,e){const t=St.parse(s);Ct.parse(t.map(n=>{var{source:a}=n,i=xt(n,["source"]);return i}));let r=0;for(const n of t){const a=new TextEncoder().encode(n.source);if(r+=a.length,a.length>4e6||r>8e6)throw new Error("DOCUMENT_DEPENDENCY_TOO_LARGE");if(Et(a)!==n.sha256)throw new Error("DOCUMENT_DEPENDENCY_INTEGRITY_FAILED")}return t.map(n=>({id:n.id,version:n.version,global:n.global,sha256:n.sha256,source:n.source,format:"classic-script"}))}function At(s){const e=t=>JSON.stringify(t).replace(/</g,"\\u003c").replace(/>/g,"\\u003e");return Ot(s).map(t=>`<script>(()=>{const s=document.createElement('script');s.textContent=${e(t.source)};document.head.appendChild(s);s.remove();if(typeof window[${e(t.global)}]==='undefined')throw new Error('DOCUMENT_DEPENDENCY_GLOBAL_MISSING');})();<\/script>`).join("")}const Rt=["default-src 'none'","script-src 'unsafe-inline'","style-src 'unsafe-inline'","img-src data: blob:","font-src data:","connect-src 'none'","frame-src 'none'","worker-src 'none'","object-src 'none'","base-uri 'none'","form-action 'none'"].join("; ");function Dt(s,e,t=[]){if(It.parse(s),!/^[a-f0-9]{32}$/.test(e))throw new Error("Invalid Artifact document session ID");return`<!doctype html><meta charset="utf-8"><meta http-equiv="Content-Security-Policy" content="${Rt}"><script>${Zt.replace("__XPERT_DOCUMENT_SESSION__",e)}<\/script>${At(t)}${s}`}const Zt=String.raw`
2
+ ;(() => {
3
+ 'use strict'
4
+ const SESSION_ID = '__XPERT_DOCUMENT_SESSION__'
5
+ const CHANNEL = 'xpert.artifact-document',
6
+ VERSION = 1,
7
+ pending = new Map(),
8
+ listeners = new Map(),
9
+ lastControls = new Map(),
10
+ latest = new Map()
11
+ let port,
12
+ context,
13
+ sequence = 0,
14
+ resolveReady
15
+ const ready = new Promise((resolve) => (resolveReady = resolve))
16
+ const emit = (id, dataset) => {
17
+ for (const fn of listeners.get(id) || [])
18
+ try {
19
+ fn(dataset)
20
+ } catch (e) {
21
+ console.error(e)
22
+ }
23
+ }
24
+ const fail = (code) => Object.assign(new Error(code), { code })
25
+ const query = async (bindingId, controls = {}) => {
26
+ await ready
27
+ if (!context.bindingIds.includes(bindingId)) {
28
+ port.postMessage({ type: 'diagnostic', code: 'DOCUMENT_BINDING_DENIED' })
29
+ throw fail('DOCUMENT_BINDING_DENIED')
30
+ }
31
+ const requestId = 'q' + ++sequence,
32
+ values = { ...context.defaults, ...controls }
33
+ lastControls.set(bindingId, values)
34
+ latest.set(bindingId, requestId)
35
+ return new Promise((resolve, reject) => {
36
+ const timer = setTimeout(() => {
37
+ pending.delete(requestId)
38
+ reject(fail('DOCUMENT_QUERY_TIMEOUT'))
39
+ }, 45000)
40
+ pending.set(requestId, { resolve, reject, timer, bindingId })
41
+ port.postMessage({ type: 'query', requestId, bindingId, controls: values })
42
+ })
43
+ }
44
+ const subscribe = (id, fn) => {
45
+ if (typeof fn !== 'function') throw fail('DOCUMENT_INVALID_LISTENER')
46
+ const set = listeners.get(id) || new Set()
47
+ set.add(fn)
48
+ listeners.set(id, set)
49
+ return () => set.delete(fn)
50
+ }
51
+ const refresh = async (id) => query(id, lastControls.get(id) || {})
52
+ const bindSelect = (element, config) => {
53
+ if (
54
+ !element ||
55
+ element.tagName !== 'SELECT' ||
56
+ !config ||
57
+ typeof config.bindingId !== 'string' ||
58
+ typeof config.controlId !== 'string' ||
59
+ typeof config.fieldId !== 'string'
60
+ )
61
+ throw fail('DOCUMENT_INVALID_SELECT')
62
+ const allValue = config.allValue === undefined ? null : config.allValue,
63
+ known = new Set(),
64
+ append = (value, label) => {
65
+ const key = JSON.stringify(value)
66
+ if (known.has(key)) return
67
+ known.add(key)
68
+ const option = document.createElement('option')
69
+ option.value = key
70
+ option.textContent = label
71
+ element.append(option)
72
+ }
73
+ element.replaceChildren()
74
+ append(allValue, config.allLabel || 'All')
75
+ const update = (dataset) => {
76
+ const selected = (lastControls.get(config.bindingId) || context.defaults)[config.controlId]
77
+ for (const row of dataset.rows || []) {
78
+ const value = row[config.fieldId]
79
+ if (value !== null && ['string', 'number', 'boolean'].includes(typeof value)) append(value, String(value))
80
+ }
81
+ const key = JSON.stringify(selected === undefined ? allValue : selected)
82
+ if (known.has(key)) element.value = key
83
+ }
84
+ const unsubscribe = subscribe(config.bindingId, update),
85
+ change = () =>
86
+ ready
87
+ .then(() =>
88
+ query(config.bindingId, {
89
+ ...(lastControls.get(config.bindingId) || context.defaults),
90
+ [config.controlId]: JSON.parse(element.value)
91
+ })
92
+ )
93
+ .catch((error) =>
94
+ element.dispatchEvent(new CustomEvent('xpert-query-error', { detail: { code: error.code }, bubbles: true }))
95
+ )
96
+ element.addEventListener('change', change)
97
+ return () => {
98
+ unsubscribe()
99
+ element.removeEventListener('change', change)
100
+ }
101
+ }
102
+ Object.defineProperty(window, 'xpertLiveArtifact', {
103
+ value: Object.freeze({ ready: () => ready, query, subscribe, refresh, bindSelect }),
104
+ writable: false,
105
+ configurable: false
106
+ })
107
+ window.addEventListener('message', (event) => {
108
+ const data = event.data
109
+ if (
110
+ port ||
111
+ event.source !== parent ||
112
+ !data ||
113
+ data.channel !== CHANNEL ||
114
+ data.version !== VERSION ||
115
+ data.type !== 'init' ||
116
+ data.sessionId !== SESSION_ID ||
117
+ !event.ports[0]
118
+ )
119
+ return
120
+ port = event.ports[0]
121
+ context = data.context
122
+ document.documentElement.dataset.theme = context.theme
123
+ document.documentElement.style.colorScheme = context.theme
124
+ port.onmessage = (event) => {
125
+ const data = event.data
126
+ if (data.type === 'refresh') {
127
+ for (const id of new Set([...listeners.keys(), ...lastControls.keys()])) refresh(id).catch(console.error)
128
+ return
129
+ }
130
+ if (data.type !== 'result') return
131
+ const entry = pending.get(data.requestId)
132
+ if (!entry) return
133
+ pending.delete(data.requestId)
134
+ clearTimeout(entry.timer)
135
+ if (latest.get(entry.bindingId) !== data.requestId) {
136
+ entry.reject(fail('DOCUMENT_QUERY_SUPERSEDED'))
137
+ return
138
+ }
139
+ if (data.ok) {
140
+ emit(entry.bindingId, data.dataset)
141
+ entry.resolve(data.dataset)
142
+ } else entry.reject(fail(data.code || 'DOCUMENT_QUERY_FAILED'))
143
+ }
144
+ port.start()
145
+ resolveReady(context)
146
+ })
147
+ parent.postMessage({ channel: CHANNEL, version: VERSION, type: 'ready', sessionId: SESSION_ID }, '*')
148
+ })()
149
+ `,jt=te({channel:q(Le),version:q(Ue),type:q("ready"),sessionId:R().regex(/^[a-f0-9]{32}$/)}).strict(),Mt=te({type:q("diagnostic"),code:q("DOCUMENT_BINDING_DENIED")}).strict();function $t(s,e){if(!s.ownerDocument.querySelector("meta[data-xpert-document-policy]"))throw new Error("Install the Artifact document frame policy before mounting a document");const t=wt.parse(e.context),r=Array.from(crypto.getRandomValues(new Uint8Array(16)),w=>w.toString(16).padStart(2,"0")).join(""),n=Dt(e.html,r,e.dependencies),a=new MessageChannel,i=new Set(t.bindingIds),o=new Set,u=new Set,f=new Map,y=s.ownerDocument.defaultView;let N=!1,T=!1,J=0,b=Date.now();s.setAttribute("sandbox","allow-scripts"),s.referrerPolicy="no-referrer";const E=(w,S)=>{try{w?.(S)}catch{}},Z=w=>{T||a.port1.postMessage(w)},P=(w,S)=>{Z({type:"result",requestId:w,ok:!1,code:S}),E(e.onError,S)};a.port1.onmessage=async w=>{if(T)return;const S=Mt.safeParse(w.data);if(S.success){E(e.onError,S.data.code);return}const $=kt.safeParse(w.data);if(!$.success){E(e.onError,"DOCUMENT_INVALID_REQUEST");return}const k={type:$.data.type,requestId:$.data.requestId,bindingId:$.data.bindingId,controls:$.data.controls};if(!i.has(k.bindingId)){P(k.requestId,"DOCUMENT_BINDING_DENIED");return}if(Date.now()-b>=6e4&&(J=0,b=Date.now(),o.clear()),u.has(k.requestId)||o.has(k.requestId)){P(k.requestId,"DOCUMENT_REQUEST_REPLAY");return}if(u.size>=8||++J>60){P(k.requestId,"DOCUMENT_QUERY_LIMIT");return}o.add(k.requestId),u.add(k.requestId),f.set(k.bindingId,k.requestId),E(e.onBusy,!0);try{const be=await e.query(k);T||(Z({type:"result",requestId:k.requestId,ok:!0,dataset:be}),f.get(k.bindingId)===k.requestId&&E(e.onResult,be))}catch{T||(Z({type:"result",requestId:k.requestId,ok:!1,code:"DOCUMENT_QUERY_FAILED"}),f.get(k.bindingId)===k.requestId&&E(e.onError,"DOCUMENT_QUERY_FAILED"))}finally{u.delete(k.requestId),T||E(e.onBusy,u.size>0)}};const Q=w=>{var S;if(T||N||w.source!==s.contentWindow)return;const $=jt.safeParse(w.data);!$.success||$.data.sessionId!==r||(N=!0,(S=s.contentWindow)==null||S.postMessage({channel:Le,version:Ue,type:"init",sessionId:r,context:t},"*",[a.port2]))};return y.addEventListener("message",Q),a.port1.start(),s.srcdoc=n,{refresh(){Z({type:"refresh"})},dispose(){T||(T=!0,y.removeEventListener("message",Q),a.port1.close(),a.port2.close(),E(e.onBusy,!1))}}}function Lt(s){if(s.querySelector("meta[data-xpert-document-policy]"))return;const e=s.createElement("meta");e.httpEquiv="Content-Security-Policy",e.content="frame-src 'none'",e.dataset.xpertDocumentPolicy="1",s.head.prepend(e)}return se.installArtifactDocumentFramePolicy=Lt,se.mountArtifactDocument=$t,Object.defineProperty(se,Symbol.toStringTag,{value:"Module"}),se})({});
@@ -0,0 +1,15 @@
1
+ import { readFile, writeFile, mkdir } from 'node:fs/promises'
2
+ import { dirname, join } from 'node:path'
3
+ import { fileURLToPath } from 'node:url'
4
+ import { chromium } from 'playwright-core'
5
+ import { validateDocument } from './validate.mjs'
6
+
7
+ const argument = key => { const i = process.argv.indexOf(key); if (i < 0 || !process.argv[i + 1]) throw new Error('Missing runtime argument'); return process.argv[i + 1] }
8
+ const requestPath = argument('--request'), output = argument('--output')
9
+ const input = JSON.parse(await readFile(join(dirname(requestPath), 'document.json'), 'utf8'))
10
+ const browser = await chromium.launch({ headless: true, args: ['--disable-dev-shm-usage'] })
11
+ try {
12
+ const report = await validateDocument(input, browser, join(dirname(fileURLToPath(import.meta.url)), 'host.js'))
13
+ await mkdir(output, { recursive: true })
14
+ await writeFile(join(output, 'report.json'), JSON.stringify(report))
15
+ } finally { await browser.close() }
@@ -0,0 +1,140 @@
1
+ export async function validateDocument(input, browser, hostPath) {
2
+ const errors = [], addError = value => { const message = String(value).slice(0, 300); if (errors.length < 16 && !errors.includes(message)) errors.push(message) }
3
+ const context = await browser.newContext({ viewport: { width: 1280, height: 900 } })
4
+ try {
5
+ const page = await context.newPage()
6
+ await page.route('**/*', route => route.abort('blockedbyclient'))
7
+ page.on('pageerror', error => addError(error.message))
8
+ page.on('console', message => { if (message.type() === 'error') addError(message.text()) })
9
+ await page.setContent('<!doctype html><html><head></head><body><iframe style="width:100%;height:850px"></iframe></body></html>')
10
+ await page.addScriptTag({ path: hostPath })
11
+ await page.evaluate(input => {
12
+ window.validation = { errors: [], requestedBindings: [], controlsByBinding: {} }
13
+ const initialized = new Set()
14
+ DocumentHost.installArtifactDocumentFramePolicy(document)
15
+ window.documentHost = DocumentHost.mountArtifactDocument(document.querySelector('iframe'), {
16
+ html: input.html, context: input.context, dependencies: input.dependencies ?? [],
17
+ query: async request => {
18
+ window.validation.requestedBindings.push(request.bindingId)
19
+ if (!input.datasets[request.bindingId]) {
20
+ window.validation.errors.push('DOCUMENT_BINDING_DENIED')
21
+ throw Error('DOCUMENT_BINDING_DENIED')
22
+ }
23
+ // The document SDK sends page-wide controls; the backend selects parameters per Binding.
24
+ const allParameters = input.parameters ? Object.values(input.parameters).flat() : undefined
25
+ const parameters = input.parameters?.[request.bindingId]
26
+ const defaults = input.context.defaults
27
+ if (!initialized.has(request.bindingId) && (Object.keys(request.controls).length !== Object.keys(defaults).length || Object.entries(defaults).some(([key, value]) => request.controls[key] !== value))) {
28
+ window.validation.errors.push('DOCUMENT_INITIAL_CONTROLS_MISMATCH: initial query controls must match saved controls.defaultValue, including null')
29
+ throw Error('DOCUMENT_INITIAL_CONTROLS_MISMATCH')
30
+ }
31
+ if (allParameters && (!parameters || Object.keys(request.controls).some(key => !allParameters.some(parameter => parameter.controlId === key)) || parameters.some(parameter => {
32
+ // Match platform resolveAnalyticsParameters: missing values use the Binding default,
33
+ // optional null bypasses the scalar allowlist, and only this Binding is evaluated.
34
+ const value = Object.hasOwn(request.controls, parameter.controlId) ? request.controls[parameter.controlId] : parameter.defaultValue
35
+ if (value == null) return parameter.required
36
+ const valid = parameter.type === 'date'
37
+ ? typeof value === 'string' && /^\d{4}-\d{2}-\d{2}$/.test(value) && Number.isFinite(Date.parse(value)) && new Date(value).toISOString().slice(0, 10) === value
38
+ : typeof value === parameter.type && (typeof value !== 'number' || Number.isFinite(value))
39
+ return !valid || parameter.allowedValues && !parameter.allowedValues.includes(value)
40
+ }))) {
41
+ window.validation.errors.push('DOCUMENT_CONTROL_VALUE_INVALID: select values must match Binding parameter types and allowedValues; fixed enums must not use Dataset fields as options')
42
+ throw Error('DOCUMENT_CONTROL_VALUE_INVALID')
43
+ }
44
+ initialized.add(request.bindingId)
45
+ window.validation.controlsByBinding[request.bindingId] = { ...request.controls }
46
+ return input.datasets[request.bindingId]
47
+ }, onError: code => window.validation.errors.push(code)
48
+ })
49
+ }, input)
50
+ await page.waitForFunction(() => window.validation.requestedBindings.length || window.validation.errors.length, null, { timeout: 8000 }).catch(() => addError('DOCUMENT_INITIAL_QUERY_MISSING'))
51
+ await page.waitForTimeout(500)
52
+ await page.waitForFunction(ids => ids.every(id => window.validation.requestedBindings.includes(id)),
53
+ input.context.bindingIds, { timeout: 2000 }).catch(() => {})
54
+ const initiallyRequested = await page.evaluate(() => window.validation.requestedBindings)
55
+ for (const id of input.context.bindingIds) {
56
+ if (!initiallyRequested.includes(id)) addError(`DOCUMENT_INITIAL_BINDING_MISSING: ${id}. Subscribe and query every saved Binding on initial load.`)
57
+ }
58
+ const frame = page.frames().find(frame => frame !== page.mainFrame())
59
+ // Exercise bounded native selects against the saved parameter contract; data remains the real default preview.
60
+ // This detects invalid filter wiring, not the upstream effect of a filter or arbitrary custom controls.
61
+ if (frame && input.parameters) {
62
+ const selects = frame.locator('select')
63
+ for (let index = 0; index < Math.min(await selects.count(), 24); index++) {
64
+ const select = selects.nth(index)
65
+ if (!(await select.isVisible()) || !(await select.isEnabled())) continue
66
+ const original = await select.inputValue()
67
+ const values = await select.locator('option').evaluateAll(options => options.filter(option => !option.matches(':disabled')).map(option => option.value))
68
+ const alternatives = [...new Set(values)].filter(value => value !== original).slice(0, 3)
69
+ const controlId = await select.getAttribute('data-dashboard-control')
70
+ const presentationOnly = await select.getAttribute('data-dashboard-presentation') !== null
71
+ const declared = Object.values(input.parameters).flat()
72
+ if (controlId && (presentationOnly || !declared.some(parameter => parameter.controlId === controlId))) {
73
+ addError('DOCUMENT_SELECT_BINDING_INVALID: data-dashboard-control must name a declared control and cannot also be presentation-only')
74
+ continue
75
+ }
76
+ if (!controlId && !presentationOnly && declared.length) {
77
+ addError('DOCUMENT_SELECT_BINDING_REQUIRED: mark a data select with data-dashboard-control="<controlId>"; mark a purely visual selector with data-dashboard-presentation. Do not guess from labels.')
78
+ continue
79
+ }
80
+ if (controlId && !values.length) {
81
+ addError(`DOCUMENT_SELECT_OPTIONS_MISSING: ${controlId} has no enabled options. Populate the data select from verified values before interaction, or disable it when no choices are available.`)
82
+ continue
83
+ }
84
+ if (!alternatives.length) continue
85
+ for (const value of [...alternatives, original]) {
86
+ const before = await page.evaluate(() => window.validation.controlsByBinding)
87
+ await select.selectOption(value, { timeout: 1000 }).catch(() => addError(value === original ? 'DOCUMENT_SELECT_RESTORE_FAILED' : 'DOCUMENT_SELECT_INTERACTION_FAILED'))
88
+ await page.waitForTimeout(150)
89
+ if (controlId) await page.waitForFunction(({ before, controlId, parameters }) =>
90
+ Object.entries(window.validation.controlsByBinding).some(([id, controls]) =>
91
+ parameters[id]?.some(parameter => parameter.controlId === controlId) && controls[controlId] !== before[id]?.[controlId]),
92
+ { before, controlId, parameters: input.parameters }, { timeout: 1000 }).catch(() => addError(`DOCUMENT_CONTROL_QUERY_MISSING: ${controlId} changed in the page without querying its Binding. Call live.query for every affected Binding; local row filtering is not a data refresh.`))
93
+ // Allow asynchronous panel handlers to propagate a shared value before reporting a stale panel.
94
+ await page.waitForFunction(({ before, parameters }) => {
95
+ const after = window.validation.controlsByBinding
96
+ return Object.entries(after).every(([bindingId, controls]) => (parameters[bindingId] ?? []).every(parameter => {
97
+ const key = parameter.controlId, selected = controls[key]
98
+ return selected === before[bindingId]?.[key] || Object.entries(parameters).every(([id, entries]) =>
99
+ !entries.some(entry => entry.controlId === key) || after[id]?.[key] === selected)
100
+ }))
101
+ }, { before, parameters: input.parameters }, { timeout: 1000 }).catch(() => {})
102
+ const after = await page.evaluate(() => window.validation.controlsByBinding)
103
+ // A shared control ID denotes one page-wide value. Independent filters need distinct IDs.
104
+ for (const [bindingId, controls] of Object.entries(after)) {
105
+ for (const parameter of input.parameters[bindingId] ?? []) {
106
+ const key = parameter.controlId, selected = controls[key]
107
+ if (selected === before[bindingId]?.[key]) continue
108
+ const missing = Object.entries(input.parameters).filter(([id, parameters]) =>
109
+ parameters.some(parameter => parameter.controlId === key) && after[id]?.[key] !== selected
110
+ ).map(([id]) => id)
111
+ if (missing.length) addError(`DOCUMENT_SHARED_CONTROL_NOT_PROPAGATED: ${key} must query affected Bindings: ${missing.join(', ')}. bindSelect updates one Binding; use a custom select to query every affected Binding.`)
112
+ }
113
+ }
114
+ }
115
+ }
116
+ await page.waitForTimeout(150)
117
+ }
118
+ // Page buttons are untrusted executable UI too. Exercise a bounded set inside
119
+ // the isolated preview; do not guess which button is refresh from its label.
120
+ if (frame) {
121
+ const buttons = frame.locator('button')
122
+ for (let index = 0; index < Math.min(await buttons.count(), 12); index++) {
123
+ const button = buttons.nth(index)
124
+ if (!(await button.isVisible()) || !(await button.isEnabled())) continue
125
+ await button.click({ timeout: 1000 }).catch(() => addError('DOCUMENT_BUTTON_INTERACTION_FAILED'))
126
+ await page.waitForTimeout(200)
127
+ }
128
+ }
129
+ // Exercise the same refresh event as the Workbench. A renderer that fails on its
130
+ // second Dataset must not pass merely because the first query painted a page.
131
+ await page.evaluate(() => window.documentHost.refresh())
132
+ await page.waitForTimeout(300)
133
+ const state = await page.evaluate(() => window.validation)
134
+ state.errors.forEach(addError)
135
+ const renderedTextLength = frame ? (await frame.locator('body').innerText()).trim().length : 0
136
+ if (!renderedTextLength) addError('DOCUMENT_EMPTY_PAGE')
137
+ if (!state.requestedBindings.length) addError('DOCUMENT_INITIAL_QUERY_MISSING')
138
+ return { ok: !errors.length, errors, requestedBindings: [...new Set(state.requestedBindings)], renderedTextLength }
139
+ } finally { await context.close() }
140
+ }
@@ -0,0 +1 @@
1
+ export { mountArtifactDocument, installArtifactDocumentFramePolicy } from '@xpert-ai/plugin-sdk/artifact-document';
@@ -0,0 +1,6 @@
1
+ "use strict";
2
+ Object.defineProperty(exports, "__esModule", { value: true });
3
+ exports.installArtifactDocumentFramePolicy = exports.mountArtifactDocument = void 0;
4
+ var artifact_document_1 = require("@xpert-ai/plugin-sdk/artifact-document");
5
+ Object.defineProperty(exports, "mountArtifactDocument", { enumerable: true, get: function () { return artifact_document_1.mountArtifactDocument; } });
6
+ Object.defineProperty(exports, "installArtifactDocumentFramePolicy", { enumerable: true, get: function () { return artifact_document_1.installArtifactDocumentFramePolicy; } });
package/docs/AGENTS.md ADDED
@@ -0,0 +1,9 @@
1
+ # Live Dashboard documentation
2
+
3
+ Preserve historical acceptance records and their dates. New local tests do not establish fresh SSO, Agent or deployed Sandbox acceptance.
4
+
5
+ - Keep platform Dataset/Binding, Artifacts and document isolation separate from plugin dashboard semantics.
6
+ - Explain standard renderer and HTML modes without implying arbitrary network access or automatic push refresh.
7
+ - Maintain docs.json navigation and Markdown/MDX frontmatter.
8
+ - Do not publish credentials, private test contexts, generated receipts or machine-specific paths.
9
+ - Package referenced examples and verify the actual Action tarball.
@@ -0,0 +1,89 @@
1
+ ---
2
+ title: "MVP 历史验收"
3
+ ---
4
+
5
+ > 历史验收记录:本次分批提交审核未重新执行其中的模型、SSO、部署或源数据变更场景;当前本地检查见 [构建与验证](verification)。
6
+
7
+ # Live Dashboard MVP 实现与验收
8
+
9
+ 验收日期:2026-10-15。以下记录当时的实现与测试状态。
10
+
11
+ 后续的真实模型“一句话生成”专项、业务正确性检查和本轮修复见 [Agent 专项验收](agent-acceptance.md);下文是此前 MVP 范围的记录。
12
+
13
+ ## 已实现的分层
14
+
15
+ | 所属仓库 / 模块 | 交付内容 |
16
+ | --- | --- |
17
+ | xpert / contracts | `AnalyticsBinding`、`AnalyticalDataset`、字段、参数、完整性、时间及执行来源 |
18
+ | xpert / plugin-sdk | `AnalyticsQueryProvider`、注册器、`platform.datasource.analytics`、标准化与浏览器安全入口 |
19
+ | xpert / server/data-source | 当前 actor 授权、组织内数据源解析、provider 分发、超时、限额、执行后来源复核 |
20
+ | xpert / server/data-source-type | 支持插件贡献非 SQL 数据源配置,不要求数据库 runner |
21
+ | xpert / Artifacts | 复用原实体、Workspace Files、版本;新增通用 CAS 和资源前缀过滤能力 |
22
+ | plugins / analytics-postgres | 使用平台已有 PostgreSQL Workbench adapter,参数化只读查询及 OID 类型映射 |
23
+ | plugins / analytics-data-xpert | 当前用户 Actor Token、版本化本体 Action 参数、结果及审计映射 |
24
+ | plugins / live-dashboard | 定义、保存、筛选、刷新、并发控制、Workbench 视图、Agent middleware 工具 |
25
+ | plugins / data-analytics | 提取原有 renderer 加载函数供复用,原渲染资产不变,MCP 保持兼容 |
26
+ | data-xpert / agent-workbench | 新增只读 analytics 入口,复用资源绑定、显式 viewer policy、Action allowlist 和审计 |
27
+
28
+ 平台没有引入 Dashboard 专用表、data-xpert 客户端或 Python/JS 运行逻辑。可替换的三个实现均为独立插件。
29
+
30
+ ## 接口与存储
31
+
32
+ - 平台发现:`GET /api/data-source/analytics/sources`。
33
+ - 平台查询:`POST /api/data-source/analytics/query`,请求为 `{ binding, controls }`;身份与凭据来自服务端。
34
+ - data-xpert:`POST /api/agent-workbench/analytics/query`,要求 OIDC、Assistant/resource 绑定及当前 viewer 的显式读取许可。
35
+ - Dashboard 沿用 `/api/view-hosts/:hostType/:hostId/...`,视图 key 为 `live-dashboard__live-dashboard`,Action 为 `save` / `query`;不建立第二套认证 API。
36
+ - 保存 `xpert.live-dashboard/v1` JSON 定义,不保存查询结果。Artifact 的 resourceType 为 `live-dashboard`,namespace 为 `live_dashboard`,MIME 为平台支持的 `application/json`。
37
+ - 每次刷新重新授权并执行。Artifact 版本使用 SHA-256 和 CAS;读取再次校验文件内容 SHA,防止可编辑 Workspace 文件冒充原版本。
38
+
39
+ ## 真实安装验收
40
+
41
+ 测试平台为独立 xpert-pro,API 3001、前端 4201;data-xpert API 3002、前端 5174。平台代码以增量补丁复制,保留 pro 原有扩展。SDK/contracts 已构建,插件通过官方本地安装流程登记并在 API 重启后验证。
42
+
43
+ 本地管理员密码按用户授权重置,保存到专用 Keychain 条目,未写入代码或验收文件。修复了本地前端 `/oidc` 代理;本地 HTTP OIDC 使用 `SameSite=Lax`。正常授权码 SSO 成功,两个应用识别同一用户与组织。data-xpert ChatKit 指向该 xpert-pro 的 `/chatkit/`。
44
+
45
+ RDF 验收使用 data-xpert 自带的 `LocalRdfOntologyPublisher` / `LocalSparqlOntologyQueryBackend`。外部 Fuseki 镜像下载未作为本次验收前提;没有伪造发布状态、绕过资源策略或 mock 查询服务。
46
+
47
+ | 场景 | 实际结果 |
48
+ | --- | --- |
49
+ | 插件注册和来源发现 | 两种 provider 均由已安装插件提供;data-xpert 无数据库 runner |
50
+ | PostgreSQL → Dataset | east=120、west=80;筛选 west 后只有 80 |
51
+ | data-xpert → Dataset | 已发布 SQL 语义模型 → 本体资源 → `sql.query_cube_slice`;返回相同结果 |
52
+ | 图表解耦 | 两份定义的 `charts` 完全一致,仅 Binding 的原生 payload / 字段映射不同 |
53
+ | Artifact 保存 / 重载 | 两种来源各保存一个看板;真实 UI 编辑生成版本 2,跨应用重载保留默认筛选 |
54
+ | 筛选 / 刷新 | 真实 UI 筛选 west=80;刷新保留筛选,平台 executionId 与 data-xpert upstreamExecutionId 均变化 |
55
+ | 并发保存 | 使用旧版本保存返回 HTTP 409;版本 2 未被覆盖 |
56
+ | 权限撤销 | 临时将专用测试 policy 改为 deny;已保存看板查询被拒绝且没有返回缓存行;随后恢复原 allow |
57
+ | 渲染 | xpert-pro 与 data-xpert SSO Workbench 均显示同一个真实 Artifact,使用原 Data Analytics 柱图和表格 |
58
+
59
+ 可在本地打开:
60
+
61
+ - xpert-pro:`http://localhost:4201/chat/x/live-dashboard-acceptance/c?view=live-dashboard__live-dashboard`;若工作区折叠,点击“显示工作区面板”。
62
+ - data-xpert:`http://localhost:5174/?assistantCode=live-dashboard-acceptance&view=live-dashboard__live-dashboard`。
63
+ - 选择“区域销售”或“本体区域销售”。本体看板当前为版本 2,默认 west。
64
+
65
+ 截图和不含凭据的查询回执位于本插件被 Git 忽略的 `output/playwright/`。测试数据源、已发布语义模型、Assistant、限定当前用户的 policy 和两个 Artifacts 为本次明确命名的本地联调数据;未修改其他环境账号、数据源或服务。
66
+
67
+ ## 自动验证
68
+
69
+ - SDK:9 项 Dataset / Binding 边界测试,涵盖空结果、语义字段、精度、类型、grain、完整性及参数。
70
+ - 平台:4 项真实 Nest HTTP 管道与执行边界测试,4 项 Artifact CAS / 前缀转义测试。
71
+ - 插件:PostgreSQL 2 项、data-xpert 3 项、Dashboard 5 项;另有真实 PostgreSQL 集成测试,覆盖参数化、注入值作为数据、截断及只读拒绝。
72
+ - data-xpert:3 项 analytics HTTP 测试、2 项 cache policy 测试、3 项已有 AgentTools cache 回归测试。
73
+ - 三个插件通过 dist-first Nest 生命周期 harness;Dashboard `verify:dist` 核对源文件、远程 bundle 与原 Data Analytics 资产哈希。
74
+ - Data Analytics stdio MCP 回归:initialize、tools/list(5 个工具)、resources/read 均成功,widget HTML 正常返回。
75
+ - contracts/SDK、平台服务及插件 TypeScript 检查、data-xpert API 构建通过;改动仓库 `git diff --check` 通过。
76
+
77
+ ## 复现所需前置条件
78
+
79
+ 1. 使用包含本次新增协议和能力的 xpert contracts/SDK 构建产物。仅满足现有 peer semver 的旧发行包可能没有新接口,需要协调平台发布。
80
+ 2. 安装 PostgreSQL 底层驱动及两个 analytics provider、Live Dashboard 系统插件,重启 API,然后同步数据源类型。
81
+ 3. 在 Assistant 图中通过 `workflow` 连接绑定 `LiveDashboard` middleware。`options.middlewares.order` 只描述顺序,不能将插件配置数组塞入该字段。发布后检查实际视图清单。
82
+ 4. 使用 examples 中的 JSON,替换真实 dataSourceId。data-xpert 示例的资源和 target 必须取自已发布资源发现,配置 Assistant/workspace 及 viewer policy。
83
+ 5. 导入、保存,确认全量/筛选结果,然后刷新并核对新的执行记录。
84
+
85
+ ## 明确未包含
86
+
87
+ 本轮未实现调度刷新、跨源 Join、公开分享、可视化查询编辑器、团队共享缓存、Artifacts 画廊自定义实时 viewer,以及 LLM 自动生成看板的实际模型调用验收。Middleware 工具已实现并绑定,但本地验收聚焦用户要求的保存、筛选、刷新闭环。
88
+
89
+ Python / JavaScript Workspace 实时查询是后续可替换的 Script Provider:每次加载、筛选或刷新均执行脚本,脚本在本次运行中通过受控通道查询来源或读取文件,计算后直接返回标准 Dataset。Agent 创建/修改脚本,常规刷新不需要调用 LLM;相同脚本和参数也不能复用上次任务结果。执行中数据访问通道、查询期限与取消传播、脚本版本及 lineage 设计已记录于平台 `packages/plugin-sdk/docs/workspace-dataset-pipelines.md`。这些扩展尚未实现,现有 Sandbox Jobs 不包含完整的脚本数据访问通道。