@useago/sdk 1.0.2 → 1.0.3
This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
- package/dist/{AgoClient-bQozE6-A.js → AgoClient-CBLJfu90.js} +1 -1
- package/dist/{AgoClient-_fig8FoN.cjs → AgoClient-nYVPdI5x.cjs} +1 -1
- package/dist/angular.cjs +1 -1
- package/dist/angular.d.cts +8 -6
- package/dist/angular.d.ts +8 -6
- package/dist/angular.js +1 -1
- package/dist/{createConversationSession-DJUFgOXy.cjs → createConversationSession-CnIchjFa.cjs} +1 -1
- package/dist/{createConversationSession-BbK3ou1k.js → createConversationSession-D3aHSSir.js} +1 -1
- package/dist/createFormCollector-CQKfRjfj.cjs +1 -0
- package/dist/{createFormCollector-D-TpSd9x.js → createFormCollector-CyD7KnjG.js} +2 -2
- package/dist/devtools.d.cts +8 -6
- package/dist/devtools.d.ts +8 -6
- package/dist/index.cjs +1 -1
- package/dist/index.d.cts +8 -6
- package/dist/index.d.ts +8 -6
- package/dist/index.js +3 -3
- package/dist/react.cjs +2 -2
- package/dist/react.d.cts +8 -6
- package/dist/react.d.ts +8 -6
- package/dist/react.js +3 -3
- package/dist/testing.d.cts +8 -6
- package/dist/testing.d.ts +8 -6
- package/dist/vue.cjs +1 -1
- package/dist/vue.d.cts +8 -6
- package/dist/vue.d.ts +8 -6
- package/dist/vue.js +1 -1
- package/dist/widget.cjs +1 -1
- package/dist/widget.d.cts +9 -7
- package/dist/widget.d.ts +9 -7
- package/dist/widget.js +3 -3
- package/package.json +1 -1
- package/dist/createFormCollector-CdQjGAl_.cjs +0 -1
package/dist/vue.d.ts
CHANGED
|
@@ -86,10 +86,11 @@ declare class AgoClient {
|
|
|
86
86
|
* Relay a completed form collector's values to a server-configured destination.
|
|
87
87
|
*
|
|
88
88
|
* Used by `createFormCollector` / `useFormCollector` in `{ via: "backend" }` mode:
|
|
89
|
-
* the browser never holds the destination URL or its secret — the backend
|
|
90
|
-
*
|
|
89
|
+
* the browser never holds the destination name, URL, or its secret — the backend
|
|
90
|
+
* resolves the destination from the named form's stored definition and forwards
|
|
91
|
+
* the values from the server.
|
|
91
92
|
*/
|
|
92
|
-
submitFormCollector(
|
|
93
|
+
submitFormCollector(name: string, values: Record<string, unknown>): Promise<unknown>;
|
|
93
94
|
/**
|
|
94
95
|
* Submit feedback for a message
|
|
95
96
|
*/
|
|
@@ -594,8 +595,9 @@ declare interface Store<T> {
|
|
|
594
595
|
* POSTs the values to that URL.
|
|
595
596
|
* - `{ via: "client", url }` — same, written out.
|
|
596
597
|
* - `{ via: "client", handler }` — the browser runs your own submit logic.
|
|
597
|
-
* - `{ via: "backend"
|
|
598
|
-
*
|
|
598
|
+
* - `{ via: "backend" }` — the browser relays the values to the backend, which resolves
|
|
599
|
+
* the destination from the form's backend-stored definition (name, URL and secret all
|
|
600
|
+
* stay server-side). `destination` is deprecated and ignored.
|
|
599
601
|
* - `false` — collect only, no submit function.
|
|
600
602
|
*/
|
|
601
603
|
declare type SubmitConfig<V = Record<string, unknown>> = string | {
|
|
@@ -606,7 +608,7 @@ declare type SubmitConfig<V = Record<string, unknown>> = string | {
|
|
|
606
608
|
handler: (values: V) => Promise<unknown> | unknown;
|
|
607
609
|
} | {
|
|
608
610
|
via: "backend";
|
|
609
|
-
destination
|
|
611
|
+
destination?: string;
|
|
610
612
|
} | false;
|
|
611
613
|
|
|
612
614
|
/**
|
package/dist/vue.js
CHANGED
|
@@ -1,4 +1,4 @@
|
|
|
1
|
-
import { t as A } from "./AgoClient-
|
|
1
|
+
import { t as A } from "./AgoClient-CBLJfu90.js";
|
|
2
2
|
import { computed as y, inject as F, onMounted as g, onScopeDispose as N, onUnmounted as I, ref as c, shallowRef as D } from "vue";
|
|
3
3
|
var L = /* @__PURE__ */ Symbol("ago-client"), b = { install(t, n) {
|
|
4
4
|
const e = new A(n);
|
package/dist/widget.cjs
CHANGED
|
@@ -1,4 +1,4 @@
|
|
|
1
|
-
Object.defineProperty(exports,Symbol.toStringTag,{value:"Module"});const ke=require("./AgoClient-
|
|
1
|
+
Object.defineProperty(exports,Symbol.toStringTag,{value:"Module"});const ke=require("./AgoClient-nYVPdI5x.cjs"),$e=require("./createFormCollector-CQKfRjfj.cjs"),Ke=require("./createConversationSession-CnIchjFa.cjs");var Ve={"&":"&","<":"<",">":">",'"':""","'":"'"};function U(o){return o.replace(/[&<>"']/g,n=>Ve[n])}function Ae(o){const n=o.trim();return/^(https?:|mailto:|tel:|#|\/|\.\/|\.\.\/)/i.test(n)||!/^[a-z][a-z0-9+.-]*:/i.test(n)?n:null}var Te='"IBM Plex Mono", ui-monospace, SFMono-Regular, Menlo, monospace',Q="";function M(o){const n=[],r=u=>(n.push(u),`${Q}${n.length-1}${Q}`);let t=o;return t=t.replace(/`([^`]+)`/g,(u,i)=>r(`<code style="background:#f0f2f5;padding:2px 5px;border-radius:4px;font-size:13px;font-family:${Te}">${U(i)}</code>`)),t=t.replace(/!\[([^\]]*)\]\(([^)\s]+)\)/g,(u,i,f)=>{const s=Ae(f);return s?r(`<img alt="${U(i)}" src="${U(s)}" style="max-width:100%;border-radius:8px;margin:4px 0" />`):u}),t=t.replace(/\[([^\]]+)\]\(([^)\s]+)\)/g,(u,i,f)=>{const s=Ae(f);return s?r(`<a href="${U(s)}" target="_blank" rel="noopener noreferrer" style="color:#1b5fc4;text-decoration:underline">${M(i)}</a>`):u}),t=U(t),t=t.replace(/\*\*([^*]+?)\*\*/g,"<strong>$1</strong>").replace(/__([^_]+?)__/g,"<strong>$1</strong>").replace(/~~([^~]+?)~~/g,"<del>$1</del>").replace(/(^|[^*])\*(?!\s)([^*]+?)\*/g,"$1<em>$2</em>").replace(/(^|[^\w_])_(?!\s)([^_]+?)_/g,"$1<em>$2</em>"),t=t.replace(new RegExp(`${Q}(\\d+)${Q}`,"g"),(u,i)=>n[Number(i)]),t}function _(o,n,r){const t=document.createElement(o);return Object.assign(t.style,n),r!==void 0&&(t.innerHTML=r),t}var De=/^ {0,3}([-*_])( *\1){2,} *$/,Me=/^ {0,3}(#{1,6})\s+(.*?)\s*#*\s*$/,Be=/^ {0,3}(```+|~~~+)/,Z=/^ {0,3}>\s?/,P=/^(\s*)([-*+]|\d+[.)])\s+(.*)$/,Qe=["20px","18px","16px","15px","14px","13px"],fe=o=>o.match(/^\s*/)?.[0].length??0;function Ye(o){return o.trim()===""||De.test(o)||Me.test(o)||Be.test(o)||Z.test(o)||P.test(o)}function ze(o){const n=o[0].match(P),r=n[1].length,t=/\d/.test(n[2]),u=_(t?"ol":"ul",{margin:"0 0 8px 0",paddingLeft:"20px",listStyleType:t?"decimal":"disc",listStylePosition:"outside"});let i=0;for(;i<o.length;){const f=o[i].match(P),s=[];for(i++;i<o.length&&fe(o[i])>r;)s.push(o[i]),i++;const p=_("li",{display:"list-item",margin:"2px 0",lineHeight:"1.6"}),c=f[3].match(/^\[([ xX])\]\s+(.*)$/);c?(p.style.listStyleType="none",p.style.marginLeft="-20px",p.innerHTML=`<span style="margin-right:6px">${c[1].toLowerCase()==="x"?"☑":"☐"}</span>${M(c[2])}`):p.innerHTML=M(f[3]),s.filter(h=>P.test(h)).length>0&&p.appendChild(ze(s.filter(h=>h.trim()!==""))),u.appendChild(p)}return u}function Ze(o){const n=s=>s.replace(/^\s*\|?/,"").replace(/\|?\s*$/,"").split("|").map(p=>p.trim()),r=_("div",{overflowX:"auto",margin:"0 0 8px 0"}),t=_("table",{borderCollapse:"collapse",width:"100%",fontSize:"13px"}),u=document.createElement("thead"),i=document.createElement("tr");for(const s of n(o[0]))i.appendChild(_("th",{border:"1px solid #dee3e8",padding:"6px 10px",textAlign:"left",backgroundColor:"#f5f7fa",fontWeight:"600"},M(s)));u.appendChild(i),t.appendChild(u);const f=document.createElement("tbody");for(const s of o.slice(2)){const p=document.createElement("tr");for(const c of n(s))p.appendChild(_("td",{border:"1px solid #dee3e8",padding:"6px 10px"},M(c)));f.appendChild(p)}return t.appendChild(f),r.appendChild(t),r}var Je=o=>!!o&&/^\s*\|?\s*:?-{1,}:?\s*(\|\s*:?-{1,}:?\s*)*\|?\s*$/.test(o);function J(o){const n=document.createDocumentFragment(),r=o.replace(/\r\n?/g,`
|
|
2
2
|
`).split(`
|
|
3
3
|
`);let t=0;for(;t<r.length;){const i=r[t];if(i.trim()===""){t++;continue}const f=i.match(Be);if(f){const c=f[1][0],h=[];for(t++;t<r.length&&!new RegExp(`^ {0,3}${c==="`"?"`{3,}":"~{3,}"}\\s*$`).test(r[t]);)h.push(r[t]),t++;t++;const L=_("pre",{margin:"0 0 8px 0"});L.appendChild(_("code",{display:"block",background:"#f5f5f5",padding:"8px 12px",borderRadius:"6px",fontSize:"13px",overflowX:"auto",fontFamily:Te,whiteSpace:"pre"},U(h.join(`
|
|
4
4
|
`)))),n.appendChild(L);continue}if(De.test(i)){n.appendChild(_("hr",{border:"none",borderTop:"1px solid #dee3e8",margin:"12px 0"})),t++;continue}const s=i.match(Me);if(s){const c=s[1].length;n.appendChild(_(`h${c}`,{margin:"16px 0 8px 0",fontSize:Qe[c-1],fontWeight:"600",lineHeight:"1.3"},M(s[2]))),t++;continue}if(Z.test(i)){const c=[];for(;t<r.length&&Z.test(r[t]);)c.push(r[t].replace(Z,"")),t++;const h=_("blockquote",{borderLeft:"4px solid #dee3e8",paddingLeft:"12px",margin:"0 0 8px 0",fontStyle:"italic",color:"#6b6d6f"});h.appendChild(J(c.join(`
|
package/dist/widget.d.cts
CHANGED
|
@@ -78,10 +78,11 @@ declare class AgoClient {
|
|
|
78
78
|
* Relay a completed form collector's values to a server-configured destination.
|
|
79
79
|
*
|
|
80
80
|
* Used by `createFormCollector` / `useFormCollector` in `{ via: "backend" }` mode:
|
|
81
|
-
* the browser never holds the destination URL or its secret — the backend
|
|
82
|
-
*
|
|
81
|
+
* the browser never holds the destination name, URL, or its secret — the backend
|
|
82
|
+
* resolves the destination from the named form's stored definition and forwards
|
|
83
|
+
* the values from the server.
|
|
83
84
|
*/
|
|
84
|
-
submitFormCollector(
|
|
85
|
+
submitFormCollector(name: string, values: Record<string, unknown>): Promise<unknown>;
|
|
85
86
|
/**
|
|
86
87
|
* Submit feedback for a message
|
|
87
88
|
*/
|
|
@@ -688,7 +689,7 @@ declare type MessageStatus = "IN_PROGRESS" | "DONE" | "ERROR" | "TODO" | "CANCEL
|
|
|
688
689
|
* properties: { name: { type: "string" }, email: { type: "string" } },
|
|
689
690
|
* required: ["name", "email"],
|
|
690
691
|
* },
|
|
691
|
-
* submit: { via: "backend"
|
|
692
|
+
* submit: { via: "backend" },
|
|
692
693
|
* }],
|
|
693
694
|
* });
|
|
694
695
|
* // later: widget.destroy();
|
|
@@ -843,8 +844,9 @@ declare type StorageLike = Pick<Storage, "getItem" | "setItem">;
|
|
|
843
844
|
* POSTs the values to that URL.
|
|
844
845
|
* - `{ via: "client", url }` — same, written out.
|
|
845
846
|
* - `{ via: "client", handler }` — the browser runs your own submit logic.
|
|
846
|
-
* - `{ via: "backend"
|
|
847
|
-
*
|
|
847
|
+
* - `{ via: "backend" }` — the browser relays the values to the backend, which resolves
|
|
848
|
+
* the destination from the form's backend-stored definition (name, URL and secret all
|
|
849
|
+
* stay server-side). `destination` is deprecated and ignored.
|
|
848
850
|
* - `false` — collect only, no submit function.
|
|
849
851
|
*/
|
|
850
852
|
declare type SubmitConfig<V = Record<string, unknown>> = string | {
|
|
@@ -855,7 +857,7 @@ declare type SubmitConfig<V = Record<string, unknown>> = string | {
|
|
|
855
857
|
handler: (values: V) => Promise<unknown> | unknown;
|
|
856
858
|
} | {
|
|
857
859
|
via: "backend";
|
|
858
|
-
destination
|
|
860
|
+
destination?: string;
|
|
859
861
|
} | false;
|
|
860
862
|
|
|
861
863
|
/**
|
package/dist/widget.d.ts
CHANGED
|
@@ -78,10 +78,11 @@ declare class AgoClient {
|
|
|
78
78
|
* Relay a completed form collector's values to a server-configured destination.
|
|
79
79
|
*
|
|
80
80
|
* Used by `createFormCollector` / `useFormCollector` in `{ via: "backend" }` mode:
|
|
81
|
-
* the browser never holds the destination URL or its secret — the backend
|
|
82
|
-
*
|
|
81
|
+
* the browser never holds the destination name, URL, or its secret — the backend
|
|
82
|
+
* resolves the destination from the named form's stored definition and forwards
|
|
83
|
+
* the values from the server.
|
|
83
84
|
*/
|
|
84
|
-
submitFormCollector(
|
|
85
|
+
submitFormCollector(name: string, values: Record<string, unknown>): Promise<unknown>;
|
|
85
86
|
/**
|
|
86
87
|
* Submit feedback for a message
|
|
87
88
|
*/
|
|
@@ -688,7 +689,7 @@ declare type MessageStatus = "IN_PROGRESS" | "DONE" | "ERROR" | "TODO" | "CANCEL
|
|
|
688
689
|
* properties: { name: { type: "string" }, email: { type: "string" } },
|
|
689
690
|
* required: ["name", "email"],
|
|
690
691
|
* },
|
|
691
|
-
* submit: { via: "backend"
|
|
692
|
+
* submit: { via: "backend" },
|
|
692
693
|
* }],
|
|
693
694
|
* });
|
|
694
695
|
* // later: widget.destroy();
|
|
@@ -843,8 +844,9 @@ declare type StorageLike = Pick<Storage, "getItem" | "setItem">;
|
|
|
843
844
|
* POSTs the values to that URL.
|
|
844
845
|
* - `{ via: "client", url }` — same, written out.
|
|
845
846
|
* - `{ via: "client", handler }` — the browser runs your own submit logic.
|
|
846
|
-
* - `{ via: "backend"
|
|
847
|
-
*
|
|
847
|
+
* - `{ via: "backend" }` — the browser relays the values to the backend, which resolves
|
|
848
|
+
* the destination from the form's backend-stored definition (name, URL and secret all
|
|
849
|
+
* stay server-side). `destination` is deprecated and ignored.
|
|
848
850
|
* - `false` — collect only, no submit function.
|
|
849
851
|
*/
|
|
850
852
|
declare type SubmitConfig<V = Record<string, unknown>> = string | {
|
|
@@ -855,7 +857,7 @@ declare type SubmitConfig<V = Record<string, unknown>> = string | {
|
|
|
855
857
|
handler: (values: V) => Promise<unknown> | unknown;
|
|
856
858
|
} | {
|
|
857
859
|
via: "backend";
|
|
858
|
-
destination
|
|
860
|
+
destination?: string;
|
|
859
861
|
} | false;
|
|
860
862
|
|
|
861
863
|
/**
|
package/dist/widget.js
CHANGED
|
@@ -1,6 +1,6 @@
|
|
|
1
|
-
import { t as Xe, u as Ke } from "./AgoClient-
|
|
2
|
-
import { r as qe, t as Ve } from "./createFormCollector-
|
|
3
|
-
import { t as Qe } from "./createConversationSession-
|
|
1
|
+
import { t as Xe, u as Ke } from "./AgoClient-CBLJfu90.js";
|
|
2
|
+
import { r as qe, t as Ve } from "./createFormCollector-CyD7KnjG.js";
|
|
3
|
+
import { t as Qe } from "./createConversationSession-D3aHSSir.js";
|
|
4
4
|
var Ye = {
|
|
5
5
|
"&": "&",
|
|
6
6
|
"<": "<",
|
package/package.json
CHANGED
|
@@ -1 +0,0 @@
|
|
|
1
|
-
const O=require("./AgoClient-_fig8FoN.cjs");function _(o,e){const i=e?e.storage??(typeof localStorage<"u"?localStorage:void 0):void 0;let t=o;if(e&&i)try{const c=i.getItem(e.key);c!=null&&(t=JSON.parse(c))}catch{}const a=new Set,f=()=>a.forEach(c=>c(t));function d(){if(e&&i)try{i.setItem(e.key,JSON.stringify(t))}catch{}}return{get:()=>t,set:c=>{t=c,d(),f()},subscribe:c=>(a.add(c),()=>{a.delete(c)})}}var k=/^[a-zA-Z0-9_-]{1,40}$/,P=o=>o==null||o==="";function q(o,e){const i=e[o.property];if(P(i))return!1;if(Array.isArray(o.value))return o.value.some(f=>String(i)===String(f));if(!o.op)return String(i)===String(o.value);const t=Number(i),a=Number(o.value);if(Number.isNaN(t)||Number.isNaN(a))return!1;switch(o.op){case">=":return t>=a;case"<=":return t<=a;case">":return t>a;case"<":return t<a;default:return O.logger.warn(`Unknown requiredWhen op "${o.op}"; treating as not required.`),!1}}function p(o,e){const i=o.properties??{},t=new Set;for(const f of o.required??[]){const d=i[f]?.requiredWhen;(!d||q(d,e))&&t.add(f)}for(const[f,d]of Object.entries(i))d.requiredWhen&&q(d.requiredWhen,e)&&t.add(f);const a=[...t].filter(f=>P(e[f]));return{missing:a,complete:a.length===0}}function W(o){const e={};for(const[i,t]of Object.entries(o.properties??{}))e[i]={type:t.type,...t.description!=null&&{description:t.description},...t.enum&&{enum:t.enum},...t.default!==void 0&&{default:t.default}};return{type:"object",properties:e,required:[]}}function j(o){const{name:e,description:i,schema:t}=o;if(!k.test(e))throw new Error(`Invalid form collector name "${e}": must match ${k} (it becomes the update_/submit_ function names).`);const a=typeof o.submit=="string"?o.submit?{via:"client",url:o.submit}:!1:o.submit??!1,f=t.properties??{},d=r=>{const n={};for(const[u,s]of Object.entries(r)){const l=f[u];if(l)if(s==null)n[u]=s;else if(l.type==="number"||l.type==="integer"){const b=typeof s=="number"?s:Number(s);n[u]=Number.isNaN(b)?s:b}else l.type==="boolean"?n[u]=typeof s=="boolean"?s:s==="true"?!0:s==="false"?!1:!!s:n[u]=s}return n},c=o.initialValues??{},m=_({values:c,submitted:!1}),v=r=>{const n=m.get(),u={...n,values:{...n.values,...r}};return m.set(u),u};let h=null;const N=async()=>{const{values:r}=m.get(),{complete:n,missing:u}=p(t,r);if(!n)return{ok:!1,missing:u};if(!a)return{ok:!1,error:"No submit target configured for this form collector."};const s=r;try{let l;if(a.via==="client")if("handler"in a)l=await a.handler(s);else{const b=await fetch(a.url,{method:"POST",headers:{"Content-Type":"application/json"},credentials:"include",body:JSON.stringify(s)});if(!b.ok)return{ok:!1,error:`Submit failed: HTTP ${b.status}`};l=await b.json().catch(()=>{})}else{if(!h)return{ok:!1,error:"Backend submit requires install(client) (or useFormCollector) first."};l=await h.submitFormCollector(a.destination,s)}return m.set({...m.get(),submitted:!0}),{ok:!0,result:l}}catch(l){const b=l instanceof Error?l.message:"Submit failed";return O.logger.error(`FormCollector "${e}" submit failed:`,l),{ok:!1,error:b}}},S={name:`update_${e}`,description:`Fill or update fields of the "${e}" form. ${i} Pass any subset of fields; call it repeatedly to fill the form as the user provides information. Returns the current values and which required fields are still missing.`,parameters:W(t),handler:r=>{const n=v(d(r)),{missing:u}=p(t,n.values);return{ok:!0,values:n.values,missing:u}}},g=[S];a&&g.push({name:`submit_${e}`,description:`Submit the completed "${e}" form. Only call this once every required field is collected and the user has confirmed. If fields are missing it returns them instead of submitting.`,parameters:{type:"object",properties:{}},handler:()=>N()});const T="client__",C=a?`submit_${e}`:null,E=r=>{const n=r.functionName??r.toolName;if(n)return n.startsWith(T)?n.slice(8):n},$=r=>{let n={...c},u=!1;for(const s of r){const l=E(s);l===S.name?s.arguments&&(n={...n,...d(s.arguments)}):C&&l===C&&s.status?.toLowerCase()==="done"&&(u=!0)}m.set({values:n,submitted:u})},y=`form:${e}`,w=()=>{const{values:r,submitted:n}=m.get(),{missing:u,complete:s}=p(t,r),l=a?` When nothing is missing and the user confirms, call submit_${e}.`:"",b=n?`The "${e}" form has been submitted.`:`You are currently collecting information from the user to fill the "${e}" form.`;return{name:`Form: ${e}`,description:`${b} ${i} There are conditionnals questions/values to collected, you can find this information with the requiredWhen field in the form. The form schema is the following: ${JSON.stringify(t)}. Data collected so far: ${JSON.stringify(r)}. Call update_${e} with any fields the user provides; ask only for what is still missing.${l}`,data:{values:r,missing:u,complete:s,submitted:n}}},F=r=>{$((r.messages??[]).flatMap(n=>n.toolCalls??[]))};return{name:e,store:m,functions:g,contextKey:y,contextProvider:w,install:r=>{h=r;for(const u of g)r.register(u);r.addDynamicContext(y,w);const n=m.subscribe(()=>r.notifyContextChanged());return r.on("conversation:loaded",F),()=>{n();for(const u of g)r.unregisterFunction(u.name);r.removeDynamicContext(y),r.off("conversation:loaded",F),h===r&&(h=null)}},hydrate:$,submit:N,getValues:()=>m.get().values,setValues:r=>{v(d(r))},reset:()=>{m.set({values:c,submitted:!1})},getStatus:()=>p(t,m.get().values)}}async function x(o,e){const i=await o.getFormCollector(e.name);return j({name:i.name,description:e.description??i.description,schema:e.schema??i.schema,submit:e.submit??i.submit,initialValues:e.initialValues})}Object.defineProperty(exports,"createFormCollector",{enumerable:!0,get:function(){return j}});Object.defineProperty(exports,"createStore",{enumerable:!0,get:function(){return _}});Object.defineProperty(exports,"deriveFormStatus",{enumerable:!0,get:function(){return p}});Object.defineProperty(exports,"loadFormCollector",{enumerable:!0,get:function(){return x}});
|