@mindstudio-ai/interface 0.1.14 → 0.1.16
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/README.md +14 -3
- package/dist/chunk-FFFGB4U3.js +3 -0
- package/dist/chunk-FFFGB4U3.js.map +1 -0
- package/dist/index.d.ts +56 -2
- package/dist/index.js +3 -3
- package/dist/index.js.map +1 -1
- package/dist/voice.d.ts +63 -5
- package/dist/voice.js +1 -1
- package/dist/voice.js.map +1 -1
- package/package.json +1 -1
- package/dist/chunk-5L3RRB4F.js +0 -3
- package/dist/chunk-5L3RRB4F.js.map +0 -1
package/README.md
CHANGED
|
@@ -211,6 +211,7 @@ const { threads, nextCursor } = await chat.listThreads();
|
|
|
211
211
|
const full = await chat.getThread(thread.id);
|
|
212
212
|
await chat.updateThread(thread.id, 'New title');
|
|
213
213
|
await chat.deleteThread(thread.id);
|
|
214
|
+
await chat.claimThread(thread.id); // after in-app login: keep anonymous threads
|
|
214
215
|
|
|
215
216
|
// Paginate
|
|
216
217
|
const page2 = await chat.listThreads(nextCursor);
|
|
@@ -337,15 +338,25 @@ session.on('transcript', ({ role, segmentId, text, final }) =>
|
|
|
337
338
|
|
|
338
339
|
session.on('toolCall', ({ method, status, result }) => {
|
|
339
340
|
showToolStatus(method, status);
|
|
340
|
-
//
|
|
341
|
-
//
|
|
342
|
-
//
|
|
341
|
+
// Every successful tool delivers its raw return value here on 'done' —
|
|
342
|
+
// render what the agent just did in lockstep with speech. Over ~32KB
|
|
343
|
+
// serialized arrives as `resultTruncated: true` instead.
|
|
343
344
|
if (status === 'done' && result !== undefined) renderToolResult(method, result);
|
|
344
345
|
});
|
|
345
346
|
|
|
346
347
|
session.mute();
|
|
347
348
|
session.unmute();
|
|
348
349
|
await session.sendText('123 Main Street'); // exact strings beat spelling aloud
|
|
350
|
+
// Client tools (voice.md `target: "client"`): the agent invokes, your handler
|
|
351
|
+
// runs in this browser, and its return value goes back as the tool result.
|
|
352
|
+
session.registerClientTool('showVerification', async (args) => {
|
|
353
|
+
openVerifySheet(args);
|
|
354
|
+
return { opened: true };
|
|
355
|
+
});
|
|
356
|
+
|
|
357
|
+
// Progressive auth: after your in-app verification succeeds, upgrade the live
|
|
358
|
+
// session anonymous → signed-in in place (no teardown, conversation continues).
|
|
359
|
+
await session.refreshIdentity();
|
|
349
360
|
await session.end();
|
|
350
361
|
```
|
|
351
362
|
|
|
@@ -0,0 +1,3 @@
|
|
|
1
|
+
var g=class extends Error{code;status;constructor(e,n,r){super(e),this.name="MindStudioInterfaceError",this.code=n,this.status=r}};var tt="/_/telemetry/";var b=[];function f(t){b.push(t),b.length>20&&b.shift()}function k(){return b.slice()}function D(t){return t.includes(tt)}function et(t){return typeof t=="string"?t:t instanceof URL?t.href:t.url||String(t)}var E="",S=new Set;function N(t){return S.add(t),()=>{S.delete(t)}}function w(t){t!==E&&(f({type:"navigation",from:E,to:t,timestamp:Date.now()}),E=t,S.forEach(e=>{try{e(t)}catch{}}))}function nt(){let t=window;if(t.__ms_history_patched)return;t.__ms_history_patched=!0,E=location.href;let e=history.pushState.bind(history);history.pushState=function(r,o,i){e(r,o,i);try{w(location.href)}catch{}};let n=history.replaceState.bind(history);history.replaceState=function(r,o,i){n(r,o,i);try{w(location.href)}catch{}},window.addEventListener("popstate",()=>{try{w(location.href)}catch{}}),window.addEventListener("hashchange",()=>{try{w(location.href)}catch{}})}function rt(t){if(!window.fetch||window.fetch.__ms_patched)return;let n=window.fetch.bind(window),r=function(o,i){let u=et(o);if(D(u))return n(o,i);let _=(i?.method||(typeof o!="string"&&!(o instanceof URL)?o.method:"")||"GET").toUpperCase(),v=Date.now();return n(o,i).then(l=>{let h={type:"fetch",method:_,url:u,status:l.status,ok:l.ok,duration:Date.now()-v,timestamp:v};if(!l.ok&&t)try{l.clone().text().then(Q=>{h.body=Q.slice(0,1024),f(h)}).catch(()=>f(h))}catch{f(h)}else f(h);return l},l=>{throw f({type:"fetch",method:_,url:u,ok:!1,duration:Date.now()-v,timestamp:v,error:l instanceof Error?l.message:String(l??"fetch failed")}),l})};r.__ms_patched=!0,window.fetch=r}function ot(){if(XMLHttpRequest.prototype.open.__ms_patched)return;let e=XMLHttpRequest.prototype.open,n=XMLHttpRequest.prototype.send;XMLHttpRequest.prototype.open=function(r,o,...i){return this.__ms_method=(r||"GET").toUpperCase(),this.__ms_url=String(o),e.apply(this,[r,o,...i])},XMLHttpRequest.prototype.send=function(r){let o=this.__ms_method||"GET",i=this.__ms_url||"";if(D(i))return n.apply(this,[r]);let u=Date.now();return this.addEventListener("loadend",function(){f({type:"xhr",method:o,url:i,status:this.status,ok:this.status>=200&&this.status<300,duration:Date.now()-u,timestamp:u})},{once:!0}),n.apply(this,[r])},XMLHttpRequest.prototype.open.__ms_patched=!0}var P=!1;function U(t){if(!P){P=!0;try{nt()}catch{}try{rt(t.captureResponseBodies)}catch{}try{ot()}catch{}}}var H="/_/telemetry/errors",it=1e3,st=50,at=6e4,x=!1,a=[],B=null,M=0,X=!1;function ct(t,e){let n=e.split(`
|
|
2
|
+
`)[1]??"";return`${t}|${n.trim()}`}function q(t){if(X)return;let e=ct(t.message,t.stack);for(let n of a)if(n._fp===e){n.count=(n.count??1)+1;return}a.length>=st||(t._fp=e,a.push(t),ut())}function ut(){B||a.length===0||(B=setTimeout(()=>{B=null,lt()},it))}function F(){let t=a;return a=[],t.map(({_fp:e,...n})=>n)}async function lt(){if(a.length===0)return;if(Date.now()<M){a=[];return}let t=(()=>{try{return s()}catch{return null}})();if(!t){a=[];return}let e=F();try{let n=await fetch(p(H),{method:"POST",headers:{"Content-Type":"application/json",Authorization:`Bearer ${t.token}`},body:JSON.stringify({events:e})});if(n.status===429){let r=n.headers.get("Retry-After"),o=r?parseInt(r,10):NaN,i=Number.isFinite(o)&&o>0?o*1e3:at;M=Date.now()+i}}catch{}}function O(){if(a.length===0)return;if(Date.now()<M){a=[];return}let t=null;try{t=s()}catch{a=[];return}let e=F();try{fetch(p(H),{method:"POST",headers:{"Content-Type":"application/json",Authorization:`Bearer ${t.token}`},body:JSON.stringify({events:e}),keepalive:!0})}catch{}}function dt(t){try{let e=s();q({releaseId:e.releaseId,url:location.href,userAgent:navigator.userAgent,timestamp:Date.now(),type:"error",message:t.message||"Unknown error",stack:t.error?.stack??"",source:t.filename||void 0,line:typeof t.lineno=="number"?t.lineno:void 0,column:typeof t.colno=="number"?t.colno:void 0,breadcrumbs:k()})}catch{}}function ft(t){try{let e=s(),n=t.reason,r,o="";n&&typeof n=="object"?(r=n.message||String(n),o=n.stack??""):r=String(n??"Unhandled rejection"),q({releaseId:e.releaseId,url:location.href,userAgent:navigator.userAgent,timestamp:Date.now(),type:"unhandledrejection",message:r,stack:o,breadcrumbs:k()})}catch{}}function pt(){if(x||typeof window>"u")return;let t;try{t=s()}catch{return}if(t.telemetry?.errors===!1)return;x=!0,U({captureResponseBodies:!!t.telemetryCaptureResponseBodies}),window.addEventListener("error",dt),window.addEventListener("unhandledrejection",ft);let e=()=>{X=!0,O()};window.addEventListener("pagehide",e),document.addEventListener("visibilitychange",()=>{document.visibilityState==="hidden"&&O()})}function j(){try{pt()}catch{}}var R;function s(){if(R)return R;let t=globalThis.__MINDSTUDIO__;if(!t)throw new g("@mindstudio-ai/interface requires the MindStudio platform context. This page must be loaded inside MindStudio (window.__MINDSTUDIO__ is missing).","not_initialized");if(!t.token||!t.releaseId||!t.methods){let e=["token","releaseId","methods"].filter(n=>!t[n]).join(", ");throw new g(`MindStudio platform context is incomplete. Missing: ${e}`,"invalid_config")}return R=t,j(),$(),R}function mt(){let t=globalThis.__MINDSTUDIO__?.basePath;if(typeof t!="string")return"";let e=t.replace(/\/+$/,"");return e?e.startsWith("/")?e:`/${e}`:""}function p(t){return`${mt()}${t}`}function Ut(t){let e=s();t.token!==void 0&&(e.token=t.token),t.user!==void 0&&(e.user=t.user),t.methods!==void 0&&(e.methods=t.methods),t.visitorId!==void 0&&(e.visitorId=t.visitorId)}var J="/_/telemetry/events",ht=1e3,gt=100,yt=6e4,c=[],I=null,L=0,V=!1;function W(t){V||c.length>=gt||(c.push(t),_t())}function _t(){I||c.length===0||(I=setTimeout(()=>{I=null,vt()},ht))}function Z(){let t=c;return c=[],t}async function vt(){if(c.length===0)return;if(Date.now()<L){c=[];return}let t;try{t=s()}catch{c=[];return}let e=Z();try{let n=await fetch(p(J),{method:"POST",headers:{"Content-Type":"application/json",Authorization:`Bearer ${t.token}`},body:JSON.stringify({events:e})});if(n.status===429){let r=n.headers.get("Retry-After"),o=r?parseInt(r,10):NaN,i=Number.isFinite(o)&&o>0?o*1e3:yt;L=Date.now()+i}}catch{}}function z(){if(c.length===0)return;if(Date.now()<L){c=[];return}let t;try{t=s()}catch{c=[];return}let e=Z();try{fetch(p(J),{method:"POST",headers:{"Content-Type":"application/json",Authorization:`Bearer ${t.token}`},body:JSON.stringify({events:e}),keepalive:!0})}catch{}}function wt(t){if(!t)return;let e={};for(let[n,r]of Object.entries(t))(typeof r=="string"||typeof r=="number"||typeof r=="boolean")&&(e[n]=r);return Object.keys(e).length>0?e:void 0}function Y(t){try{let e=s();W({type:"pageview",releaseId:e.releaseId,url:t,referrer:document.referrer,userAgent:navigator.userAgent,language:navigator.language,screen:{w:window.innerWidth,h:window.innerHeight},timestamp:Date.now()})}catch{}}function bt(t,e){try{let n=s();W({type:"event",releaseId:n.releaseId,name:t,url:location.href,timestamp:Date.now(),props:wt(e)})}catch{}}var Et="/_/telemetry/presence",Rt=1e4,At=3e4,Tt=3e4,y=null,m=null,T=1e3,d=!1;function C(){let t=T;T=Math.min(T*2,Rt);let e=Math.random()*250;return t+e}function A(t){m&&clearTimeout(m),m=setTimeout(()=>{m=null,d&&K()},t)}function St(){if(d=!1,m&&(clearTimeout(m),m=null),y){try{y.abort()}catch{}y=null}}async function K(){if(!d)return;let t;try{t=s()}catch{d=!1;return}y=new AbortController;let e=y.signal;try{let n=await fetch(p(Et),{method:"GET",headers:{Authorization:`Bearer ${t.token}`,Accept:"text/event-stream"},signal:e});if(n.status===503){let i=n.headers.get("Retry-After"),u=i?parseInt(i,10):NaN,_=Number.isFinite(u)&&u>0?u*1e3:At;A(_);return}if(n.status===401){d=!1;return}if(n.status===204){d=!1;return}if(!n.ok||!n.body){A(C());return}let r=Date.now(),o=n.body.getReader();for(;d;){let{done:i}=await o.read();if(i)break}d&&(Date.now()-r>=Tt&&(T=1e3),A(C()))}catch(n){let r=n?.name;d&&r!=="AbortError"&&A(C())}}var Xt={track:bt},G=!1;function kt(){if(G||typeof window>"u")return;let t;try{t=s()}catch{return}if(t.telemetry?.analytics===!1)return;G=!0;let e=()=>{V=!0,z(),St()};window.addEventListener("pagehide",e),document.addEventListener("visibilitychange",()=>{document.visibilityState==="hidden"&&z()}),N(n=>{Y(n)}),Y(location.href),d=!0,K()}function $(){try{kt()}catch{}}export{g as a,Xt as b,s as c,mt as d,p as e,Ut as f};
|
|
3
|
+
//# sourceMappingURL=chunk-FFFGB4U3.js.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"sources":["../src/errors.ts","../src/telemetry-breadcrumbs.ts","../src/telemetry-errors.ts","../src/config.ts","../src/telemetry-analytics.ts"],"sourcesContent":["/**\n * Error class for the @mindstudio-ai/interface SDK.\n *\n * Thrown by `createClient()` method calls on HTTP errors, by `platform`\n * actions on failures, and by the config reader when bootstrap globals\n * are missing.\n */\nexport class MindStudioInterfaceError extends Error {\n /** Machine-readable error code (e.g. 'method_not_found', 'not_initialized'). */\n readonly code: string;\n\n /** HTTP status code, when the error originated from an API response. */\n readonly status?: number;\n\n constructor(message: string, code: string, status?: number) {\n super(message);\n this.name = 'MindStudioInterfaceError';\n this.code = code;\n this.status = status;\n }\n}\n","/**\n * Breadcrumbs — a ring buffer of recent navigations + network calls\n * attached to outgoing error reports for debugging context.\n *\n * Installed by `installErrorMonitoring()` in `telemetry-errors.ts`.\n * Three monkeypatches feed the buffer:\n *\n * - `history.pushState`/`replaceState`/`popstate` → `navigation`\n * - `window.fetch` → `fetch`\n * - `XMLHttpRequest.prototype.open`/`send` → `xhr`\n *\n * Each patch is idempotent — guarded by a `__ms_*_patched` flag so\n * re-imports (HMR, double bundle inclusion, etc.) are no-ops.\n *\n * The SDK's own telemetry endpoint is excluded from capture so error\n * reports don't feed themselves through the breadcrumb pipeline.\n */\n\nconst TELEMETRY_ENDPOINT_FRAGMENT = '/_/telemetry/';\nconst MAX_BREADCRUMBS = 20;\nconst MAX_BODY_BYTES = 1024;\n\n/**\n * A single breadcrumb entry. Discriminated union — server validates the\n * `type` field; unknown types are dropped at ingest.\n */\nexport type Breadcrumb =\n | {\n type: 'navigation';\n from: string;\n to: string;\n timestamp: number;\n }\n | {\n type: 'fetch';\n method: string;\n url: string;\n status?: number;\n ok: boolean;\n duration: number;\n timestamp: number;\n error?: string;\n /** Truncated response body for failed requests, when capture is enabled. */\n body?: string;\n }\n | {\n type: 'xhr';\n method: string;\n url: string;\n status?: number;\n ok: boolean;\n duration: number;\n timestamp: number;\n };\n\nconst buffer: Breadcrumb[] = [];\n\nfunction push(entry: Breadcrumb): void {\n buffer.push(entry);\n if (buffer.length > MAX_BREADCRUMBS) {\n buffer.shift();\n }\n}\n\n/**\n * Return a shallow copy of the current breadcrumb buffer.\n * Called when an error is captured to snapshot context at that moment.\n */\nexport function getBreadcrumbs(): Breadcrumb[] {\n return buffer.slice();\n}\n\nfunction shouldSkipUrl(url: string): boolean {\n return url.includes(TELEMETRY_ENDPOINT_FRAGMENT);\n}\n\nfunction resolveUrl(input: RequestInfo | URL): string {\n if (typeof input === 'string') {\n return input;\n }\n if (input instanceof URL) {\n return input.href;\n }\n return input.url || String(input);\n}\n\nlet lastHref = '';\n\nconst navListeners = new Set<(url: string) => void>();\n\n/**\n * Subscribe to navigation events. Fires on every history change\n * (`pushState`, `replaceState`, `popstate`, `hashchange`) with the new URL.\n *\n * Used by the analytics module to emit pageview events without\n * installing a second set of history patches.\n *\n * @returns Unsubscribe function.\n */\nexport function onNavigation(cb: (url: string) => void): () => void {\n navListeners.add(cb);\n return () => {\n navListeners.delete(cb);\n };\n}\n\nfunction emitNavigation(to: string): void {\n if (to === lastHref) {\n return;\n }\n push({\n type: 'navigation',\n from: lastHref,\n to,\n timestamp: Date.now(),\n });\n lastHref = to;\n navListeners.forEach((cb) => {\n try {\n cb(to);\n } catch {\n // listener errors must not break navigation\n }\n });\n}\n\nfunction installHistory(): void {\n const w = window as unknown as Record<string, unknown>;\n if (w.__ms_history_patched) {\n return;\n }\n w.__ms_history_patched = true;\n\n lastHref = location.href;\n\n const originalPushState = history.pushState.bind(history);\n history.pushState = function (\n data: unknown,\n unused: string,\n url?: string | URL | null,\n ): void {\n originalPushState(data, unused, url);\n try {\n emitNavigation(location.href);\n } catch {\n // never crash navigation\n }\n };\n\n const originalReplaceState = history.replaceState.bind(history);\n history.replaceState = function (\n data: unknown,\n unused: string,\n url?: string | URL | null,\n ): void {\n originalReplaceState(data, unused, url);\n try {\n emitNavigation(location.href);\n } catch {\n // never crash navigation\n }\n };\n\n window.addEventListener('popstate', () => {\n try {\n emitNavigation(location.href);\n } catch {\n // swallow\n }\n });\n\n window.addEventListener('hashchange', () => {\n try {\n emitNavigation(location.href);\n } catch {\n // swallow\n }\n });\n}\n\nfunction installFetch(captureResponseBodies: boolean): void {\n if (!window.fetch) {\n return;\n }\n const fetchFn = window.fetch as typeof fetch & { __ms_patched?: boolean };\n if (fetchFn.__ms_patched) {\n return;\n }\n\n const originalFetch = window.fetch.bind(window);\n\n const patched: typeof fetch = function (\n input: RequestInfo | URL,\n init?: RequestInit,\n ): Promise<Response> {\n const url = resolveUrl(input);\n\n if (shouldSkipUrl(url)) {\n return originalFetch(input, init);\n }\n\n const method = (\n init?.method ||\n (typeof input !== 'string' && !(input instanceof URL)\n ? input.method\n : '') ||\n 'GET'\n ).toUpperCase();\n const startTime = Date.now();\n\n return originalFetch(input, init).then(\n (response) => {\n const entry: Breadcrumb = {\n type: 'fetch',\n method,\n url,\n status: response.status,\n ok: response.ok,\n duration: Date.now() - startTime,\n timestamp: startTime,\n };\n\n if (!response.ok && captureResponseBodies) {\n try {\n response\n .clone()\n .text()\n .then((body) => {\n entry.body = body.slice(0, MAX_BODY_BYTES);\n push(entry);\n })\n .catch(() => push(entry));\n } catch {\n push(entry);\n }\n } else {\n push(entry);\n }\n\n return response;\n },\n (err: unknown) => {\n push({\n type: 'fetch',\n method,\n url,\n ok: false,\n duration: Date.now() - startTime,\n timestamp: startTime,\n error:\n err instanceof Error ? err.message : String(err ?? 'fetch failed'),\n });\n throw err;\n },\n );\n };\n\n (patched as typeof fetch & { __ms_patched: boolean }).__ms_patched = true;\n window.fetch = patched;\n}\n\nfunction installXhr(): void {\n const openProto = XMLHttpRequest.prototype.open as ((\n ...args: unknown[]\n ) => void) & { __ms_patched?: boolean };\n if (openProto.__ms_patched) {\n return;\n }\n\n const originalOpen = XMLHttpRequest.prototype.open;\n const originalSend = XMLHttpRequest.prototype.send;\n\n XMLHttpRequest.prototype.open = function (\n this: XMLHttpRequest & {\n __ms_method?: string;\n __ms_url?: string;\n },\n method: string,\n url: string | URL,\n ...rest: unknown[]\n ): void {\n this.__ms_method = (method || 'GET').toUpperCase();\n this.__ms_url = String(url);\n return originalOpen.apply(this, [method, url, ...rest] as Parameters<\n typeof originalOpen\n >);\n } as typeof XMLHttpRequest.prototype.open;\n\n XMLHttpRequest.prototype.send = function (\n this: XMLHttpRequest & {\n __ms_method?: string;\n __ms_url?: string;\n },\n body?: Document | XMLHttpRequestBodyInit | null,\n ): void {\n const method = this.__ms_method || 'GET';\n const url = this.__ms_url || '';\n\n if (shouldSkipUrl(url)) {\n return originalSend.apply(this, [body] as Parameters<\n typeof originalSend\n >);\n }\n\n const startTime = Date.now();\n\n this.addEventListener(\n 'loadend',\n function (this: XMLHttpRequest) {\n push({\n type: 'xhr',\n method,\n url,\n status: this.status,\n ok: this.status >= 200 && this.status < 300,\n duration: Date.now() - startTime,\n timestamp: startTime,\n });\n },\n { once: true },\n );\n\n return originalSend.apply(this, [body] as Parameters<typeof originalSend>);\n } as typeof XMLHttpRequest.prototype.send;\n\n (\n XMLHttpRequest.prototype.open as typeof XMLHttpRequest.prototype.open & {\n __ms_patched: boolean;\n }\n ).__ms_patched = true;\n}\n\nlet _breadcrumbsInstalled = false;\n\n/**\n * Install all three breadcrumb sources. Idempotent.\n *\n * @param opts.captureResponseBodies — when `true`, failed `fetch`\n * responses have their bodies read and attached (truncated to ~1KB).\n * Backend strips this field unless the per-app setting is enabled.\n */\nexport function installBreadcrumbs(opts: {\n captureResponseBodies: boolean;\n}): void {\n if (_breadcrumbsInstalled) {\n return;\n }\n _breadcrumbsInstalled = true;\n\n try {\n installHistory();\n } catch {\n // history patches are best-effort\n }\n try {\n installFetch(opts.captureResponseBodies);\n } catch {\n // fetch patches are best-effort\n }\n try {\n installXhr();\n } catch {\n // xhr patches are best-effort\n }\n}\n","/**\n * Error reporting — auto-capture of uncaught errors and unhandled\n * promise rejections, batched and shipped to `/_/telemetry/errors`.\n *\n * ## How it works\n *\n * Installed by `maybeInstallTelemetry()`, which is called by `getConfig()`\n * in `config.ts`. `getConfig()` runs automatically on the next tick after\n * SDK import when the platform bootstrap is present (see eager-init block\n * in `src/index.ts`), so installation happens at page load without app\n * code needing to invoke anything. Falls back to lazy install on first\n * SDK use if eager init was skipped (SSR / tests / no bootstrap).\n *\n * Once installed:\n *\n * 1. `window.error` and `unhandledrejection` listeners enqueue events\n * into a pending batch (max 50 per batch — the server cap).\n * 2. Events with the same fingerprint within a batch collapse into a\n * single entry with `count: N` (bandwidth optimization).\n * 3. The batch flushes ~1s after the first push via `POST` to\n * `/_/telemetry/errors`.\n * 4. On `pagehide` / `visibilitychange='hidden'`, the buffer drains\n * via `fetch` with `keepalive: true` so the Bearer header survives.\n * 5. On `429`, the SDK pauses sends for the `Retry-After` window.\n * 6. Any other transport failure is swallowed — telemetry must never\n * crash the host app.\n *\n * No public API — the only knob is opt-out via\n * `window.__MINDSTUDIO__.telemetry = { errors: false }`.\n */\n\nimport { getConfig, withBase } from './config.js';\nimport {\n installBreadcrumbs,\n getBreadcrumbs,\n type Breadcrumb,\n} from './telemetry-breadcrumbs.js';\n\nconst ENDPOINT = '/_/telemetry/errors';\nconst FLUSH_INTERVAL_MS = 1000;\nconst MAX_BATCH_SIZE = 50;\nconst DEFAULT_RETRY_AFTER_MS = 60_000;\n\ninterface ErrorEvent {\n releaseId: string;\n url: string;\n userAgent: string;\n timestamp: number;\n type: 'error' | 'unhandledrejection';\n message: string;\n stack: string;\n source?: string;\n line?: number;\n column?: number;\n breadcrumbs: Breadcrumb[];\n count?: number;\n /** Internal: fingerprint for within-batch dedupe. Stripped before send. */\n _fp?: string;\n}\n\nlet _installed = false;\nlet pending: ErrorEvent[] = [];\nlet flushTimer: ReturnType<typeof setTimeout> | null = null;\nlet suppressUntil = 0;\nlet unloaded = false;\n\nfunction fingerprint(message: string, stack: string): string {\n const firstStackLine = stack.split('\\n')[1] ?? '';\n return `${message}|${firstStackLine.trim()}`;\n}\n\nfunction enqueue(event: ErrorEvent): void {\n if (unloaded) {\n return;\n }\n\n const fp = fingerprint(event.message, event.stack);\n\n for (const existing of pending) {\n if (existing._fp === fp) {\n existing.count = (existing.count ?? 1) + 1;\n return;\n }\n }\n\n if (pending.length >= MAX_BATCH_SIZE) {\n return;\n }\n\n event._fp = fp;\n pending.push(event);\n scheduleFlush();\n}\n\nfunction scheduleFlush(): void {\n if (flushTimer || pending.length === 0) {\n return;\n }\n flushTimer = setTimeout(() => {\n flushTimer = null;\n void flush();\n }, FLUSH_INTERVAL_MS);\n}\n\nfunction takeBatch(): ErrorEvent[] {\n const batch = pending;\n pending = [];\n return batch.map(({ _fp, ...rest }) => {\n void _fp;\n return rest;\n });\n}\n\nasync function flush(): Promise<void> {\n if (pending.length === 0) {\n return;\n }\n\n if (Date.now() < suppressUntil) {\n pending = [];\n return;\n }\n\n const config = (() => {\n try {\n return getConfig();\n } catch {\n return null;\n }\n })();\n if (!config) {\n pending = [];\n return;\n }\n\n const events = takeBatch();\n\n try {\n const res = await fetch(withBase(ENDPOINT), {\n method: 'POST',\n headers: {\n 'Content-Type': 'application/json',\n Authorization: `Bearer ${config.token}`,\n },\n body: JSON.stringify({ events }),\n });\n\n if (res.status === 429) {\n const retryAfterHeader = res.headers.get('Retry-After');\n const retryAfterSec = retryAfterHeader\n ? parseInt(retryAfterHeader, 10)\n : NaN;\n const waitMs =\n Number.isFinite(retryAfterSec) && retryAfterSec > 0\n ? retryAfterSec * 1000\n : DEFAULT_RETRY_AFTER_MS;\n suppressUntil = Date.now() + waitMs;\n }\n } catch {\n // network / serialization failure — drop silently\n }\n}\n\nfunction drainOnUnload(): void {\n if (pending.length === 0) {\n return;\n }\n if (Date.now() < suppressUntil) {\n pending = [];\n return;\n }\n\n let config: ReturnType<typeof getConfig> | null = null;\n try {\n config = getConfig();\n } catch {\n pending = [];\n return;\n }\n\n const events = takeBatch();\n\n try {\n void fetch(withBase(ENDPOINT), {\n method: 'POST',\n headers: {\n 'Content-Type': 'application/json',\n Authorization: `Bearer ${config.token}`,\n },\n body: JSON.stringify({ events }),\n keepalive: true,\n });\n } catch {\n // best effort\n }\n}\n\nfunction captureError(e: globalThis.ErrorEvent): void {\n try {\n const config = getConfig();\n enqueue({\n releaseId: config.releaseId,\n url: location.href,\n userAgent: navigator.userAgent,\n timestamp: Date.now(),\n type: 'error',\n message: e.message || 'Unknown error',\n stack: e.error?.stack ?? '',\n source: e.filename || undefined,\n line: typeof e.lineno === 'number' ? e.lineno : undefined,\n column: typeof e.colno === 'number' ? e.colno : undefined,\n breadcrumbs: getBreadcrumbs(),\n });\n } catch {\n // never crash on capture\n }\n}\n\nfunction captureRejection(e: PromiseRejectionEvent): void {\n try {\n const config = getConfig();\n const reason = e.reason as\n | { message?: string; stack?: string }\n | string\n | undefined;\n\n let message: string;\n let stack = '';\n\n if (reason && typeof reason === 'object') {\n message = reason.message || String(reason);\n stack = reason.stack ?? '';\n } else {\n message = String(reason ?? 'Unhandled rejection');\n }\n\n enqueue({\n releaseId: config.releaseId,\n url: location.href,\n userAgent: navigator.userAgent,\n timestamp: Date.now(),\n type: 'unhandledrejection',\n message,\n stack,\n breadcrumbs: getBreadcrumbs(),\n });\n } catch {\n // never crash on capture\n }\n}\n\n/**\n * Install error capture + breadcrumb collection. Idempotent.\n *\n * Reads `window.__MINDSTUDIO__.telemetry?.errors` — if explicitly\n * `false`, no listeners are attached and the function is a no-op.\n *\n * Otherwise attaches:\n * - `window.error` + `unhandledrejection`\n * - `pagehide` + `visibilitychange === 'hidden'` (for buffer drain)\n * - Breadcrumb sources via {@link installBreadcrumbs}\n */\nexport function installErrorMonitoring(): void {\n if (_installed) {\n return;\n }\n if (typeof window === 'undefined') {\n return;\n }\n\n let config: ReturnType<typeof getConfig>;\n try {\n config = getConfig();\n } catch {\n return;\n }\n\n if (config.telemetry?.errors === false) {\n return;\n }\n\n _installed = true;\n\n installBreadcrumbs({\n captureResponseBodies: !!config.telemetryCaptureResponseBodies,\n });\n\n window.addEventListener('error', captureError);\n window.addEventListener('unhandledrejection', captureRejection);\n\n const handleUnload = (): void => {\n unloaded = true;\n drainOnUnload();\n };\n window.addEventListener('pagehide', handleUnload);\n document.addEventListener('visibilitychange', () => {\n if (document.visibilityState === 'hidden') {\n drainOnUnload();\n }\n });\n}\n\n/**\n * Wrapper that swallows any error from {@link installErrorMonitoring}\n * so a misbehaving telemetry layer can never break `getConfig()`.\n *\n * @internal Called from config.ts on every `getConfig()` — idempotency\n * is enforced inside `installErrorMonitoring`.\n */\nexport function maybeInstallTelemetry(): void {\n try {\n installErrorMonitoring();\n } catch {\n // telemetry must never crash the host app\n }\n}\n","/**\n * Bootstrap configuration reader.\n *\n * Reads and validates `window.__MINDSTUDIO__` — the globals injected by\n * the platform before the app's JavaScript runs. The result is cached\n * after first read.\n *\n * All other modules in the SDK call `getConfig()` internally. App code\n * should never need to call this directly — use `createClient()`, `auth`,\n * and `platform` instead.\n */\n\nimport { MindStudioInterfaceError } from './errors.js';\nimport { maybeInstallAnalytics } from './telemetry-analytics.js';\nimport { maybeInstallTelemetry } from './telemetry-errors.js';\nimport type { AppUser, BootstrapConfig } from './types.js';\n\nlet _config: BootstrapConfig | undefined;\n\n/**\n * Read and validate the bootstrap configuration from `window.__MINDSTUDIO__`.\n *\n * Caches the result after first successful read. Throws if the globals\n * are missing or incomplete — this means the page isn't running inside\n * the MindStudio platform.\n *\n * @returns The validated bootstrap config\n * @throws {MindStudioInterfaceError} if `window.__MINDSTUDIO__` is missing or invalid\n */\nexport function getConfig(): BootstrapConfig {\n if (_config) {\n return _config;\n }\n\n const raw = (globalThis as Record<string, unknown>).__MINDSTUDIO__ as\n | Partial<BootstrapConfig>\n | undefined;\n\n if (!raw) {\n throw new MindStudioInterfaceError(\n '@mindstudio-ai/interface requires the MindStudio platform context. ' +\n 'This page must be loaded inside MindStudio (window.__MINDSTUDIO__ is missing).',\n 'not_initialized',\n );\n }\n\n // Validate required fields (user can be null for unauthenticated sessions)\n if (!raw.token || !raw.releaseId || !raw.methods) {\n const missing = ['token', 'releaseId', 'methods']\n .filter((k) => !raw[k as keyof BootstrapConfig])\n .join(', ');\n\n throw new MindStudioInterfaceError(\n `MindStudio platform context is incomplete. Missing: ${missing}`,\n 'invalid_config',\n );\n }\n\n _config = raw as BootstrapConfig;\n\n // Auto-install telemetry surfaces on first successful config read.\n // Both are idempotent + try/caught — telemetry must never break getConfig().\n maybeInstallTelemetry();\n maybeInstallAnalytics();\n\n return _config;\n}\n\n/**\n * The mount prefix this app is served under on the current host, normalized\n * to '' (served at the root — its own subdomain/custom host) or a\n * leading-slash, no-trailing-slash path like '/demos/vector-databases'\n * (served under a parent app's mount).\n *\n * Reads the raw bootstrap directly and never throws, so telemetry and\n * unload-time beacons can call it unconditionally. Use it as the router\n * basename: `createBrowserRouter(routes, { basename: platform.basePath || '/' })`.\n */\nexport function getBasePath(): string {\n const raw = (\n (globalThis as Record<string, unknown>).__MINDSTUDIO__ as\n | Partial<BootstrapConfig>\n | undefined\n )?.basePath;\n if (typeof raw !== 'string') {\n return '';\n }\n const trimmed = raw.replace(/\\/+$/, '');\n if (!trimmed) {\n return '';\n }\n return trimmed.startsWith('/') ? trimmed : `/${trimmed}`;\n}\n\n/**\n * Prefix a root-relative `/_/...` path with the mount basePath. Identity when\n * the app serves at the root — every platform call in the SDK goes through\n * this so mounted apps talk to their own `/_/` namespace on the parent host.\n */\nexport function withBase(path: string): string {\n return `${getBasePath()}${path}`;\n}\n\n/**\n * Update the cached config in-place after an auth state transition.\n *\n * The cached config is a mutable reference — all SDK modules read it\n * on-demand via `getConfig()`, so mutations propagate immediately to\n * method invocation, agent chat, uploads, etc.\n *\n * @internal Not exported from the package — used by the auth module only.\n */\nexport function updateConfig(updates: {\n token?: string;\n user?: AppUser | null;\n methods?: Record<string, string>;\n visitorId?: string;\n}): void {\n const config = getConfig();\n if (updates.token !== undefined) {\n config.token = updates.token;\n }\n if (updates.user !== undefined) {\n config.user = updates.user;\n }\n if (updates.methods !== undefined) {\n config.methods = updates.methods;\n }\n if (updates.visitorId !== undefined) {\n config.visitorId = updates.visitorId;\n }\n}\n","/**\n * Analytics — Plausible/Fathom-style visitor analytics.\n *\n * Auto-tracks pageviews via the existing history patches in\n * `telemetry-breadcrumbs.ts` and exposes a small public API:\n *\n * ```ts\n * import { analytics } from '@mindstudio-ai/interface';\n *\n * // Custom events (optional — pageviews track automatically)\n * analytics.track('vendor_submitted', { vendorType: 'restaurant' });\n * ```\n *\n * Server-side derivation handles geo (IP → country), device class\n * (UA → mobile/tablet/desktop), referrers, UTM parsing, and\n * sessionization. The SDK ships nothing for those — just raw\n * pageview events with enough context for backend enrichment.\n *\n * ## How it works\n *\n * Installed by `maybeInstallAnalytics()`, which is called by `getConfig()`\n * in `config.ts`. `getConfig()` runs automatically on the next tick after\n * SDK import when the platform bootstrap is present (see eager-init block\n * in `src/index.ts`), so pageview tracking + presence are live at page\n * load without app code needing to invoke anything. Falls back to lazy\n * install on first SDK use if eager init was skipped.\n *\n * Once installed:\n *\n * 1. Subscribes to navigation events from `telemetry-breadcrumbs.ts`\n * and emits a pageview on each change.\n * 2. Fires an initial pageview for the first-load URL.\n * 3. Batches events (~1s debounce, 100/batch cap) and POSTs to\n * `/_/telemetry/events`.\n * 4. On `pagehide` / `visibilitychange='hidden'`, drains via\n * `fetch` with `keepalive: true`.\n * 5. On `429`, pauses sends for the `Retry-After` window.\n *\n * ## Privacy posture\n *\n * Live visitor counts are intentionally **not** exposed to app code.\n * Aggregate visitor metrics (live count included) are surfaced only\n * through the platform dashboard to the app owner — visitors should\n * not be able to learn about other visitors' presence through the\n * SDK. If an app explicitly wants user-facing presence as a designed\n * feature (e.g. a multiplayer experience), it must build that on its\n * own application-level abstraction with its own consent semantics,\n * not on platform telemetry.\n *\n * Opt-out via `window.__MINDSTUDIO__.telemetry = { analytics: false }`.\n */\n\nimport { getConfig, withBase } from './config.js';\nimport { onNavigation } from './telemetry-breadcrumbs.js';\n\n// ---------------------------------------------------------------------------\n// Public types\n// ---------------------------------------------------------------------------\n\n/**\n * Flat-primitive prop values for custom events.\n *\n * Backend caps: max 10 keys, key length ~50 chars, value length ~500 chars.\n * Non-primitive values (objects, arrays, null) are stripped client-side\n * before send to save bandwidth — backend would silently drop them anyway.\n */\nexport type CustomEventProps = Record<string, string | number | boolean>;\n\n/**\n * The analytics namespace — pageview auto-tracking + custom events.\n *\n * Pageviews are auto-tracked from history changes; no public API for\n * them. Opt out entirely via `window.__MINDSTUDIO__.telemetry.analytics = false`.\n */\nexport interface AnalyticsClient {\n /**\n * Record a custom event with optional flat-primitive props.\n *\n * Non-primitive prop values (objects, arrays, null, undefined) are\n * stripped client-side before send. Server further caps name length\n * to 200 chars, props to 10 keys, key length to 50, value length to 500.\n *\n * Best-effort — never throws, never blocks. If the SDK isn't\n * initialized yet, the call is silently dropped.\n */\n track(event: string, props?: CustomEventProps): void;\n}\n\n// ---------------------------------------------------------------------------\n// Internal event types\n// ---------------------------------------------------------------------------\n\ntype PageviewEvent = {\n type: 'pageview';\n releaseId: string;\n url: string;\n referrer: string;\n userAgent: string;\n language: string;\n screen: { w: number; h: number };\n timestamp: number;\n};\n\ntype CustomEvent = {\n type: 'event';\n releaseId: string;\n name: string;\n url: string;\n timestamp: number;\n props?: CustomEventProps;\n};\n\ntype AnalyticsEvent = PageviewEvent | CustomEvent;\n\n// ---------------------------------------------------------------------------\n// Batched event transport\n// ---------------------------------------------------------------------------\n\nconst EVENTS_ENDPOINT = '/_/telemetry/events';\nconst FLUSH_INTERVAL_MS = 1000;\nconst MAX_BATCH_SIZE = 100;\nconst DEFAULT_RETRY_AFTER_MS = 60_000;\n\nlet pending: AnalyticsEvent[] = [];\nlet flushTimer: ReturnType<typeof setTimeout> | null = null;\nlet suppressUntil = 0;\nlet unloaded = false;\n\nfunction enqueue(event: AnalyticsEvent): void {\n if (unloaded) {\n return;\n }\n if (pending.length >= MAX_BATCH_SIZE) {\n return;\n }\n pending.push(event);\n scheduleFlush();\n}\n\nfunction scheduleFlush(): void {\n if (flushTimer || pending.length === 0) {\n return;\n }\n flushTimer = setTimeout(() => {\n flushTimer = null;\n void flush();\n }, FLUSH_INTERVAL_MS);\n}\n\nfunction takeBatch(): AnalyticsEvent[] {\n const batch = pending;\n pending = [];\n return batch;\n}\n\nasync function flush(): Promise<void> {\n if (pending.length === 0) {\n return;\n }\n\n if (Date.now() < suppressUntil) {\n pending = [];\n return;\n }\n\n let config;\n try {\n config = getConfig();\n } catch {\n pending = [];\n return;\n }\n\n const events = takeBatch();\n\n try {\n const res = await fetch(withBase(EVENTS_ENDPOINT), {\n method: 'POST',\n headers: {\n 'Content-Type': 'application/json',\n Authorization: `Bearer ${config.token}`,\n },\n body: JSON.stringify({ events }),\n });\n\n if (res.status === 429) {\n const retryAfterHeader = res.headers.get('Retry-After');\n const retryAfterSec = retryAfterHeader\n ? parseInt(retryAfterHeader, 10)\n : NaN;\n const waitMs =\n Number.isFinite(retryAfterSec) && retryAfterSec > 0\n ? retryAfterSec * 1000\n : DEFAULT_RETRY_AFTER_MS;\n suppressUntil = Date.now() + waitMs;\n }\n } catch {\n // network / serialization failure — drop silently\n }\n}\n\nfunction drainOnUnload(): void {\n if (pending.length === 0) {\n return;\n }\n if (Date.now() < suppressUntil) {\n pending = [];\n return;\n }\n\n let config;\n try {\n config = getConfig();\n } catch {\n pending = [];\n return;\n }\n\n const events = takeBatch();\n\n try {\n void fetch(withBase(EVENTS_ENDPOINT), {\n method: 'POST',\n headers: {\n 'Content-Type': 'application/json',\n Authorization: `Bearer ${config.token}`,\n },\n body: JSON.stringify({ events }),\n keepalive: true,\n });\n } catch {\n // best effort\n }\n}\n\n// ---------------------------------------------------------------------------\n// Custom event prop sanitization\n// ---------------------------------------------------------------------------\n\nfunction sanitizeProps(\n input?: Record<string, unknown>,\n): CustomEventProps | undefined {\n if (!input) {\n return undefined;\n }\n const out: CustomEventProps = {};\n for (const [k, v] of Object.entries(input)) {\n if (\n typeof v === 'string' ||\n typeof v === 'number' ||\n typeof v === 'boolean'\n ) {\n out[k] = v;\n }\n }\n return Object.keys(out).length > 0 ? out : undefined;\n}\n\n// ---------------------------------------------------------------------------\n// Pageview emit\n// ---------------------------------------------------------------------------\n\nfunction emitPageview(url: string): void {\n try {\n const config = getConfig();\n enqueue({\n type: 'pageview',\n releaseId: config.releaseId,\n url,\n referrer: document.referrer,\n userAgent: navigator.userAgent,\n language: navigator.language,\n screen: { w: window.innerWidth, h: window.innerHeight },\n timestamp: Date.now(),\n });\n } catch {\n // capture must never crash\n }\n}\n\n// ---------------------------------------------------------------------------\n// Public `track`\n// ---------------------------------------------------------------------------\n\nfunction track(event: string, props?: CustomEventProps): void {\n try {\n const config = getConfig();\n enqueue({\n type: 'event',\n releaseId: config.releaseId,\n name: event,\n url: location.href,\n timestamp: Date.now(),\n props: sanitizeProps(props as Record<string, unknown> | undefined),\n });\n } catch {\n // never crash\n }\n}\n\n// ---------------------------------------------------------------------------\n// Silent presence connection\n//\n// The SDK opens a long-lived SSE connection to `/_/telemetry/presence`\n// while the tab is alive. The connection itself is the presence signal:\n// while it's open, the visitor is tracked as \"online\" in the server-side\n// Redis set; when the tab closes (or network drops), the connection\n// closes and the server immediately knows the visitor is gone.\n//\n// Any data the server pushes over this connection is silently discarded.\n// The visitor-facing live count is intentionally NOT exposed by the SDK.\n// The owner-facing dashboard reads counts via a separate authenticated\n// internal endpoint, never through the SDK.\n//\n// Reading-and-discarding the stream is required to keep the underlying\n// TCP buffer flowing — the open connection itself is what matters, not\n// the data flowing over it.\n// ---------------------------------------------------------------------------\n\nconst PRESENCE_ENDPOINT = '/_/telemetry/presence';\nconst PRESENCE_MAX_BACKOFF_MS = 10_000;\nconst PRESENCE_503_DEFAULT_MS = 30_000;\n// A stream must stay open at least this long to count as a *stable* connect\n// and earn a backoff reset. Shorter-lived streams are treated as flaps so\n// the backoff keeps escalating instead of hammering a ~1s reconnect loop.\nconst PRESENCE_STABLE_MS = 30_000;\n\nlet presenceAbort: AbortController | null = null;\nlet presenceReconnectTimer: ReturnType<typeof setTimeout> | null = null;\nlet presenceBackoffMs = 1000;\nlet presenceActive = false;\n\nfunction presenceNextBackoff(): number {\n const base = presenceBackoffMs;\n presenceBackoffMs = Math.min(presenceBackoffMs * 2, PRESENCE_MAX_BACKOFF_MS);\n const jitter = Math.random() * 250;\n return base + jitter;\n}\n\nfunction schedulePresenceReconnect(ms: number): void {\n if (presenceReconnectTimer) {\n clearTimeout(presenceReconnectTimer);\n }\n presenceReconnectTimer = setTimeout(() => {\n presenceReconnectTimer = null;\n if (presenceActive) {\n void openPresenceConnection();\n }\n }, ms);\n}\n\nfunction closePresenceConnection(): void {\n presenceActive = false;\n if (presenceReconnectTimer) {\n clearTimeout(presenceReconnectTimer);\n presenceReconnectTimer = null;\n }\n if (presenceAbort) {\n try {\n presenceAbort.abort();\n } catch {\n // swallow\n }\n presenceAbort = null;\n }\n}\n\nasync function openPresenceConnection(): Promise<void> {\n if (!presenceActive) {\n return;\n }\n\n let config;\n try {\n config = getConfig();\n } catch {\n presenceActive = false;\n return;\n }\n\n presenceAbort = new AbortController();\n const signal = presenceAbort.signal;\n\n try {\n const res = await fetch(withBase(PRESENCE_ENDPOINT), {\n method: 'GET',\n headers: {\n Authorization: `Bearer ${config.token}`,\n Accept: 'text/event-stream',\n },\n signal,\n });\n\n if (res.status === 503) {\n const retryAfterHeader = res.headers.get('Retry-After');\n const retryAfterSec = retryAfterHeader\n ? parseInt(retryAfterHeader, 10)\n : NaN;\n const waitMs =\n Number.isFinite(retryAfterSec) && retryAfterSec > 0\n ? retryAfterSec * 1000\n : PRESENCE_503_DEFAULT_MS;\n schedulePresenceReconnect(waitMs);\n return;\n }\n\n if (res.status === 401) {\n // Session bad — stop trying until something refreshes config\n presenceActive = false;\n return;\n }\n\n if (res.status === 204) {\n // Presence is stubbed/disabled for this session — e.g. the dev tunnel\n // mock, or a backend with presence turned off. Per EventSource\n // semantics (which the dev mock explicitly relies on) a 204 means\n // \"abandon the connection and do NOT reconnect.\" Stop cleanly instead\n // of hammering a reconnect loop against an endpoint that will keep\n // returning 204. A 204 has res.ok === true but a null body, so this\n // must be handled before the generic !res.body branch below.\n presenceActive = false;\n return;\n }\n\n if (!res.ok || !res.body) {\n schedulePresenceReconnect(presenceNextBackoff());\n return;\n }\n\n // Note the connect time — but don't reset the backoff yet. Resetting on\n // the bare 200 lets a stream that closes immediately reconnect every ~1s\n // forever (the backoff never engages). We only reset once the stream has\n // stayed open long enough to count as stable (see below).\n const connectedAt = Date.now();\n\n const reader = res.body.getReader();\n\n // Drain and discard. The open connection is the presence signal;\n // any count data the server pushes is intentionally ignored.\n while (presenceActive) {\n const { done } = await reader.read();\n if (done) {\n break;\n }\n }\n\n // Stream ended (server closed, deploy, etc.) — reconnect. If it stayed\n // open long enough to be healthy, reset the backoff so the reconnect is\n // prompt; otherwise let the backoff keep escalating (up to\n // PRESENCE_MAX_BACKOFF_MS) so a flapping stream can't become a per-second\n // reconnect storm.\n if (presenceActive) {\n if (Date.now() - connectedAt >= PRESENCE_STABLE_MS) {\n presenceBackoffMs = 1000;\n }\n schedulePresenceReconnect(presenceNextBackoff());\n }\n } catch (err) {\n const name = (err as { name?: string } | null)?.name;\n if (presenceActive && name !== 'AbortError') {\n schedulePresenceReconnect(presenceNextBackoff());\n }\n }\n}\n\n// ---------------------------------------------------------------------------\n// Public client\n// ---------------------------------------------------------------------------\n\nexport const analytics: AnalyticsClient = { track };\n\n// ---------------------------------------------------------------------------\n// Install + opt-out\n// ---------------------------------------------------------------------------\n\nlet _installed = false;\n\n/**\n * Install pageview auto-tracking + transport. Idempotent.\n *\n * Reads `window.__MINDSTUDIO__.telemetry?.analytics` — if explicitly\n * `false`, the SDK installs nothing and the function is a no-op.\n * `track()` calls also no-op in that case since enqueued events\n * have no flush path established.\n */\nexport function installAnalytics(): void {\n if (_installed) {\n return;\n }\n if (typeof window === 'undefined') {\n return;\n }\n\n let config;\n try {\n config = getConfig();\n } catch {\n return;\n }\n\n if (config.telemetry?.analytics === false) {\n return;\n }\n\n _installed = true;\n\n // Unload listeners (attached once)\n const handleUnload = (): void => {\n unloaded = true;\n drainOnUnload();\n closePresenceConnection();\n };\n window.addEventListener('pagehide', handleUnload);\n document.addEventListener('visibilitychange', () => {\n if (document.visibilityState === 'hidden') {\n drainOnUnload();\n }\n });\n\n // Auto-pageviews on every history change\n onNavigation((url) => {\n emitPageview(url);\n });\n\n // Initial pageview\n emitPageview(location.href);\n\n // Silent presence heartbeat — the open connection itself signals\n // \"this visitor is online\" to the server. No data is consumed.\n presenceActive = true;\n void openPresenceConnection();\n}\n\n/**\n * Wrapper that swallows any error from {@link installAnalytics} so a\n * misbehaving telemetry layer can never break `getConfig()`.\n *\n * @internal Called from config.ts on every `getConfig()` — idempotency\n * is enforced inside `installAnalytics`.\n */\nexport function maybeInstallAnalytics(): void {\n try {\n installAnalytics();\n } catch {\n // telemetry must never crash the host app\n }\n}\n"],"mappings":"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","names":["MindStudioInterfaceError","message","code","status","TELEMETRY_ENDPOINT_FRAGMENT","buffer","push","entry","getBreadcrumbs","shouldSkipUrl","url","TELEMETRY_ENDPOINT_FRAGMENT","resolveUrl","input","lastHref","navListeners","onNavigation","cb","emitNavigation","to","installHistory","w","originalPushState","data","unused","originalReplaceState","installFetch","captureResponseBodies","originalFetch","patched","init","method","startTime","response","body","err","installXhr","originalOpen","originalSend","rest","_breadcrumbsInstalled","installBreadcrumbs","opts","ENDPOINT","FLUSH_INTERVAL_MS","MAX_BATCH_SIZE","DEFAULT_RETRY_AFTER_MS","_installed","pending","flushTimer","suppressUntil","unloaded","fingerprint","message","stack","firstStackLine","enqueue","event","fp","existing","scheduleFlush","flush","takeBatch","batch","_fp","rest","config","getConfig","events","res","withBase","retryAfterHeader","retryAfterSec","waitMs","drainOnUnload","captureError","e","getBreadcrumbs","captureRejection","reason","installErrorMonitoring","installBreadcrumbs","handleUnload","maybeInstallTelemetry","_config","getConfig","raw","MindStudioInterfaceError","missing","k","maybeInstallTelemetry","maybeInstallAnalytics","getBasePath","trimmed","withBase","path","updateConfig","updates","config","EVENTS_ENDPOINT","FLUSH_INTERVAL_MS","MAX_BATCH_SIZE","DEFAULT_RETRY_AFTER_MS","pending","flushTimer","suppressUntil","unloaded","enqueue","event","scheduleFlush","flush","takeBatch","batch","config","getConfig","events","res","withBase","retryAfterHeader","retryAfterSec","waitMs","drainOnUnload","sanitizeProps","input","out","k","v","emitPageview","url","track","props","PRESENCE_ENDPOINT","PRESENCE_MAX_BACKOFF_MS","PRESENCE_503_DEFAULT_MS","PRESENCE_STABLE_MS","presenceAbort","presenceReconnectTimer","presenceBackoffMs","presenceActive","presenceNextBackoff","base","jitter","schedulePresenceReconnect","ms","openPresenceConnection","closePresenceConnection","signal","connectedAt","reader","done","err","name","analytics","_installed","installAnalytics","handleUnload","onNavigation","maybeInstallAnalytics"]}
|
package/dist/index.d.ts
CHANGED
|
@@ -374,6 +374,19 @@ interface AgentToolCallResultEvent {
|
|
|
374
374
|
output: unknown;
|
|
375
375
|
ts: number;
|
|
376
376
|
}
|
|
377
|
+
/**
|
|
378
|
+
* The agent invoked a client tool (agent.md `target: "client"`) — an action
|
|
379
|
+
* that happens in this browser (open a sheet, navigate, highlight). Handle it
|
|
380
|
+
* via `onClientToolCall`. Fire-and-forget: the agent continues immediately
|
|
381
|
+
* with an acknowledgment; your next message closes the loop.
|
|
382
|
+
*/
|
|
383
|
+
interface AgentClientToolCallEvent {
|
|
384
|
+
type: 'client_tool_call';
|
|
385
|
+
id: string;
|
|
386
|
+
name: string;
|
|
387
|
+
input: unknown;
|
|
388
|
+
ts: number;
|
|
389
|
+
}
|
|
377
390
|
/** Stream complete. */
|
|
378
391
|
interface AgentDoneEvent {
|
|
379
392
|
type: 'done';
|
|
@@ -391,7 +404,7 @@ interface AgentErrorEvent {
|
|
|
391
404
|
ts: number;
|
|
392
405
|
}
|
|
393
406
|
/** Discriminated union of all SSE events from the agent chat stream. */
|
|
394
|
-
type AgentChatEvent = AgentTextEvent | AgentThinkingEvent | AgentThinkingCompleteEvent | AgentToolUseEvent | AgentToolInputDeltaEvent | AgentToolCallStartEvent | AgentToolCallResultEvent | AgentDoneEvent | AgentErrorEvent;
|
|
407
|
+
type AgentChatEvent = AgentTextEvent | AgentThinkingEvent | AgentThinkingCompleteEvent | AgentToolUseEvent | AgentToolInputDeltaEvent | AgentToolCallStartEvent | AgentToolCallResultEvent | AgentClientToolCallEvent | AgentDoneEvent | AgentErrorEvent;
|
|
395
408
|
/**
|
|
396
409
|
* Callbacks for `sendMessage` streaming.
|
|
397
410
|
*
|
|
@@ -421,6 +434,12 @@ interface SendMessageCallbacks {
|
|
|
421
434
|
onToolCallStart?: (id: string, name: string) => void;
|
|
422
435
|
/** Called when a tool call produces a result. */
|
|
423
436
|
onToolCallResult?: (id: string, output: unknown) => void;
|
|
437
|
+
/**
|
|
438
|
+
* Called when the agent invokes a client tool (agent.md `target:
|
|
439
|
+
* "client"`) — run the on-screen action here. Fire-and-forget: the agent
|
|
440
|
+
* has already been told the action was displayed.
|
|
441
|
+
*/
|
|
442
|
+
onClientToolCall?: (name: string, input: unknown, id: string) => void;
|
|
424
443
|
/** Called on a stream-level error event. */
|
|
425
444
|
onError?: (error: string) => void;
|
|
426
445
|
/** Called for every SSE event (including ones with named callbacks). */
|
|
@@ -477,6 +496,22 @@ interface AgentChatClient {
|
|
|
477
496
|
updateThread(threadId: string, title: string): Promise<void>;
|
|
478
497
|
/** Delete a thread (soft delete). */
|
|
479
498
|
deleteThread(threadId: string): Promise<void>;
|
|
499
|
+
/**
|
|
500
|
+
* Claim an anonymous thread after in-app verification (progressive auth).
|
|
501
|
+
* Login replaces the app's session token, which makes threads started
|
|
502
|
+
* anonymously unreachable — claiming re-binds the thread to the signed-in
|
|
503
|
+
* user so the conversation survives the login. Call it right after your
|
|
504
|
+
* verification succeeds, for each anonymous thread you want to keep.
|
|
505
|
+
*
|
|
506
|
+
* Ownership is proven with the token the thread was created/used under:
|
|
507
|
+
* the client remembers it automatically for threads touched in this page
|
|
508
|
+
* session; pass `previousToken` explicitly for threads from an earlier
|
|
509
|
+
* page load (e.g. a token you persisted before login).
|
|
510
|
+
* Rejects with `already_identified` if the thread already has an owner.
|
|
511
|
+
*/
|
|
512
|
+
claimThread(threadId: string, options?: {
|
|
513
|
+
previousToken?: string;
|
|
514
|
+
}): Promise<void>;
|
|
480
515
|
/**
|
|
481
516
|
* Send a message and stream the agent's response.
|
|
482
517
|
*
|
|
@@ -565,9 +600,21 @@ interface UploadToken {
|
|
|
565
600
|
};
|
|
566
601
|
}
|
|
567
602
|
/**
|
|
568
|
-
* The platform namespace — file upload actions.
|
|
603
|
+
* The platform namespace — file upload actions + serving context.
|
|
569
604
|
*/
|
|
570
605
|
declare const platform: {
|
|
606
|
+
/**
|
|
607
|
+
* The mount prefix this app is served under on the current host, or ''
|
|
608
|
+
* when serving at the root of its own subdomain/custom host. Use it as the
|
|
609
|
+
* router basename so routes resolve wherever the app is mounted:
|
|
610
|
+
*
|
|
611
|
+
* ```ts
|
|
612
|
+
* createBrowserRouter(routes, { basename: platform.basePath || '/' });
|
|
613
|
+
* ```
|
|
614
|
+
*
|
|
615
|
+
* The SDK already prefixes all its own platform calls with it.
|
|
616
|
+
*/
|
|
617
|
+
readonly basePath: string;
|
|
571
618
|
/**
|
|
572
619
|
* Upload a file to the MindStudio CDN.
|
|
573
620
|
*
|
|
@@ -661,6 +708,13 @@ interface BootstrapConfig {
|
|
|
661
708
|
releaseId: string;
|
|
662
709
|
/** API base URL (optional — SDK uses same-origin `/_/` paths). */
|
|
663
710
|
apiBaseUrl?: string;
|
|
711
|
+
/**
|
|
712
|
+
* Mount prefix this app is served under on the current host (multi-zone
|
|
713
|
+
* mounts), e.g. "/demos/vector-databases". Empty/absent when the app serves
|
|
714
|
+
* at the root of its own subdomain or custom host. The SDK prefixes all its
|
|
715
|
+
* `/_/` calls with it; apps use it as their router basename.
|
|
716
|
+
*/
|
|
717
|
+
basePath?: string;
|
|
664
718
|
/**
|
|
665
719
|
* Authenticated user, or `null` if unauthenticated.
|
|
666
720
|
*
|
package/dist/index.js
CHANGED
|
@@ -1,4 +1,4 @@
|
|
|
1
|
-
import{a as l,b as
|
|
2
|
-
`);
|
|
3
|
-
`);y=w.pop()??"";for(let v of w){if(!v.startsWith("data: "))continue;let C=v.slice(6);try{let U=JSON.parse(C);U.type==="done"&&(m={stopReason:U.stopReason,usage:U.usage}),z(U,o)}catch{}}}if(!m)throw new l("Stream ended without a done event","stream_incomplete");return m})();return s.abort=()=>n.abort(),s}}}var Q={async uploadFile(e,a){let t=u(),{onProgress:i,signal:n}=a??{};n?.throwIfAborted();let r=await fetch("/_/generate-upload-request",{method:"POST",headers:{Authorization:`Bearer ${t.token}`,"Content-Type":"application/json"},body:JSON.stringify({filename:e.name,contentType:e.type||"application/octet-stream"}),signal:n});if(!r.ok)throw new l(`Upload presign failed: ${r.status} ${r.statusText}`,"upload_error",r.status);let{uploadUrl:s,uploadFields:d,publicUrl:A}=await r.json(),c=new FormData;for(let[S,y]of Object.entries(d))c.append(S,y);if(c.append("file",e),i)return await D(s,c,i,n),A;let p=await fetch(s,{method:"POST",body:c,signal:n});if(!p.ok)throw new l(`File upload failed: ${p.status} ${p.statusText}`,"upload_error",p.status);return A},async upload(e,a,t){let{onProgress:i,signal:n}=t??{};n?.throwIfAborted();let o=new FormData;for(let[r,s]of Object.entries(e.upload.fields))o.append(r,s);if(o.append("file",a),i)await D(e.upload.url,o,i,n);else{let r=await fetch(e.upload.url,{method:"POST",body:o,signal:n});if(!r.ok)throw new l(`File upload failed: ${r.status} ${r.statusText}`,"upload_error",r.status)}return{key:e.key,url:e.url}}};function D(e,a,t,i){return new Promise((n,o)=>{let r=new XMLHttpRequest;if(r.upload.addEventListener("progress",s=>{s.lengthComputable&&t(s.loaded/s.total)}),r.addEventListener("load",()=>{r.status>=200&&r.status<300?(t(1),n()):o(new l(`File upload failed: ${r.status} ${r.statusText}`,"upload_error",r.status))}),r.addEventListener("error",()=>{o(new l("File upload failed: network error","upload_error"))}),r.addEventListener("abort",()=>{o(new DOMException("Upload aborted","AbortError"))}),i){if(i.aborted){o(new DOMException("Upload aborted","AbortError"));return}i.addEventListener("abort",()=>r.abort(),{once:!0})}r.open("POST",e),r.send(a)})}var k=[{code:"AF",dialCode:"+93",name:"Afghanistan",flag:"\u{1F1E6}\u{1F1EB}"},{code:"AL",dialCode:"+355",name:"Albania",flag:"\u{1F1E6}\u{1F1F1}"},{code:"DZ",dialCode:"+213",name:"Algeria",flag:"\u{1F1E9}\u{1F1FF}"},{code:"AD",dialCode:"+376",name:"Andorra",flag:"\u{1F1E6}\u{1F1E9}"},{code:"AO",dialCode:"+244",name:"Angola",flag:"\u{1F1E6}\u{1F1F4}"},{code:"AG",dialCode:"+1",name:"Antigua and Barbuda",flag:"\u{1F1E6}\u{1F1EC}"},{code:"AR",dialCode:"+54",name:"Argentina",flag:"\u{1F1E6}\u{1F1F7}"},{code:"AM",dialCode:"+374",name:"Armenia",flag:"\u{1F1E6}\u{1F1F2}"},{code:"AU",dialCode:"+61",name:"Australia",flag:"\u{1F1E6}\u{1F1FA}"},{code:"AT",dialCode:"+43",name:"Austria",flag:"\u{1F1E6}\u{1F1F9}"},{code:"AZ",dialCode:"+994",name:"Azerbaijan",flag:"\u{1F1E6}\u{1F1FF}"},{code:"BS",dialCode:"+1",name:"Bahamas",flag:"\u{1F1E7}\u{1F1F8}"},{code:"BH",dialCode:"+973",name:"Bahrain",flag:"\u{1F1E7}\u{1F1ED}"},{code:"BD",dialCode:"+880",name:"Bangladesh",flag:"\u{1F1E7}\u{1F1E9}"},{code:"BB",dialCode:"+1",name:"Barbados",flag:"\u{1F1E7}\u{1F1E7}"},{code:"BY",dialCode:"+375",name:"Belarus",flag:"\u{1F1E7}\u{1F1FE}"},{code:"BE",dialCode:"+32",name:"Belgium",flag:"\u{1F1E7}\u{1F1EA}"},{code:"BZ",dialCode:"+501",name:"Belize",flag:"\u{1F1E7}\u{1F1FF}"},{code:"BJ",dialCode:"+229",name:"Benin",flag:"\u{1F1E7}\u{1F1EF}"},{code:"BT",dialCode:"+975",name:"Bhutan",flag:"\u{1F1E7}\u{1F1F9}"},{code:"BO",dialCode:"+591",name:"Bolivia",flag:"\u{1F1E7}\u{1F1F4}"},{code:"BA",dialCode:"+387",name:"Bosnia and Herzegovina",flag:"\u{1F1E7}\u{1F1E6}"},{code:"BW",dialCode:"+267",name:"Botswana",flag:"\u{1F1E7}\u{1F1FC}"},{code:"BR",dialCode:"+55",name:"Brazil",flag:"\u{1F1E7}\u{1F1F7}"},{code:"BN",dialCode:"+673",name:"Brunei",flag:"\u{1F1E7}\u{1F1F3}"},{code:"BG",dialCode:"+359",name:"Bulgaria",flag:"\u{1F1E7}\u{1F1EC}"},{code:"BF",dialCode:"+226",name:"Burkina Faso",flag:"\u{1F1E7}\u{1F1EB}"},{code:"BI",dialCode:"+257",name:"Burundi",flag:"\u{1F1E7}\u{1F1EE}"},{code:"CV",dialCode:"+238",name:"Cabo Verde",flag:"\u{1F1E8}\u{1F1FB}"},{code:"KH",dialCode:"+855",name:"Cambodia",flag:"\u{1F1F0}\u{1F1ED}"},{code:"CM",dialCode:"+237",name:"Cameroon",flag:"\u{1F1E8}\u{1F1F2}"},{code:"CA",dialCode:"+1",name:"Canada",flag:"\u{1F1E8}\u{1F1E6}"},{code:"CF",dialCode:"+236",name:"Central African Republic",flag:"\u{1F1E8}\u{1F1EB}"},{code:"TD",dialCode:"+235",name:"Chad",flag:"\u{1F1F9}\u{1F1E9}"},{code:"CL",dialCode:"+56",name:"Chile",flag:"\u{1F1E8}\u{1F1F1}"},{code:"CN",dialCode:"+86",name:"China",flag:"\u{1F1E8}\u{1F1F3}"},{code:"CO",dialCode:"+57",name:"Colombia",flag:"\u{1F1E8}\u{1F1F4}"},{code:"KM",dialCode:"+269",name:"Comoros",flag:"\u{1F1F0}\u{1F1F2}"},{code:"CG",dialCode:"+242",name:"Congo",flag:"\u{1F1E8}\u{1F1EC}"},{code:"CD",dialCode:"+243",name:"Congo (DRC)",flag:"\u{1F1E8}\u{1F1E9}"},{code:"CR",dialCode:"+506",name:"Costa Rica",flag:"\u{1F1E8}\u{1F1F7}"},{code:"HR",dialCode:"+385",name:"Croatia",flag:"\u{1F1ED}\u{1F1F7}"},{code:"CU",dialCode:"+53",name:"Cuba",flag:"\u{1F1E8}\u{1F1FA}"},{code:"CY",dialCode:"+357",name:"Cyprus",flag:"\u{1F1E8}\u{1F1FE}"},{code:"CZ",dialCode:"+420",name:"Czechia",flag:"\u{1F1E8}\u{1F1FF}"},{code:"CI",dialCode:"+225",name:"Cote d'Ivoire",flag:"\u{1F1E8}\u{1F1EE}"},{code:"DK",dialCode:"+45",name:"Denmark",flag:"\u{1F1E9}\u{1F1F0}"},{code:"DJ",dialCode:"+253",name:"Djibouti",flag:"\u{1F1E9}\u{1F1EF}"},{code:"DM",dialCode:"+1",name:"Dominica",flag:"\u{1F1E9}\u{1F1F2}"},{code:"DO",dialCode:"+1",name:"Dominican Republic",flag:"\u{1F1E9}\u{1F1F4}"},{code:"EC",dialCode:"+593",name:"Ecuador",flag:"\u{1F1EA}\u{1F1E8}"},{code:"EG",dialCode:"+20",name:"Egypt",flag:"\u{1F1EA}\u{1F1EC}"},{code:"SV",dialCode:"+503",name:"El Salvador",flag:"\u{1F1F8}\u{1F1FB}"},{code:"GQ",dialCode:"+240",name:"Equatorial Guinea",flag:"\u{1F1EC}\u{1F1F6}"},{code:"ER",dialCode:"+291",name:"Eritrea",flag:"\u{1F1EA}\u{1F1F7}"},{code:"EE",dialCode:"+372",name:"Estonia",flag:"\u{1F1EA}\u{1F1EA}"},{code:"SZ",dialCode:"+268",name:"Eswatini",flag:"\u{1F1F8}\u{1F1FF}"},{code:"ET",dialCode:"+251",name:"Ethiopia",flag:"\u{1F1EA}\u{1F1F9}"},{code:"FJ",dialCode:"+679",name:"Fiji",flag:"\u{1F1EB}\u{1F1EF}"},{code:"FI",dialCode:"+358",name:"Finland",flag:"\u{1F1EB}\u{1F1EE}"},{code:"FR",dialCode:"+33",name:"France",flag:"\u{1F1EB}\u{1F1F7}"},{code:"GA",dialCode:"+241",name:"Gabon",flag:"\u{1F1EC}\u{1F1E6}"},{code:"GM",dialCode:"+220",name:"Gambia",flag:"\u{1F1EC}\u{1F1F2}"},{code:"GE",dialCode:"+995",name:"Georgia",flag:"\u{1F1EC}\u{1F1EA}"},{code:"DE",dialCode:"+49",name:"Germany",flag:"\u{1F1E9}\u{1F1EA}"},{code:"GH",dialCode:"+233",name:"Ghana",flag:"\u{1F1EC}\u{1F1ED}"},{code:"GR",dialCode:"+30",name:"Greece",flag:"\u{1F1EC}\u{1F1F7}"},{code:"GD",dialCode:"+1",name:"Grenada",flag:"\u{1F1EC}\u{1F1E9}"},{code:"GT",dialCode:"+502",name:"Guatemala",flag:"\u{1F1EC}\u{1F1F9}"},{code:"GN",dialCode:"+224",name:"Guinea",flag:"\u{1F1EC}\u{1F1F3}"},{code:"GW",dialCode:"+245",name:"Guinea-Bissau",flag:"\u{1F1EC}\u{1F1FC}"},{code:"GY",dialCode:"+592",name:"Guyana",flag:"\u{1F1EC}\u{1F1FE}"},{code:"HT",dialCode:"+509",name:"Haiti",flag:"\u{1F1ED}\u{1F1F9}"},{code:"HN",dialCode:"+504",name:"Honduras",flag:"\u{1F1ED}\u{1F1F3}"},{code:"HK",dialCode:"+852",name:"Hong Kong",flag:"\u{1F1ED}\u{1F1F0}"},{code:"HU",dialCode:"+36",name:"Hungary",flag:"\u{1F1ED}\u{1F1FA}"},{code:"IS",dialCode:"+354",name:"Iceland",flag:"\u{1F1EE}\u{1F1F8}"},{code:"IN",dialCode:"+91",name:"India",flag:"\u{1F1EE}\u{1F1F3}"},{code:"ID",dialCode:"+62",name:"Indonesia",flag:"\u{1F1EE}\u{1F1E9}"},{code:"IR",dialCode:"+98",name:"Iran",flag:"\u{1F1EE}\u{1F1F7}"},{code:"IQ",dialCode:"+964",name:"Iraq",flag:"\u{1F1EE}\u{1F1F6}"},{code:"IE",dialCode:"+353",name:"Ireland",flag:"\u{1F1EE}\u{1F1EA}"},{code:"IL",dialCode:"+972",name:"Israel",flag:"\u{1F1EE}\u{1F1F1}"},{code:"IT",dialCode:"+39",name:"Italy",flag:"\u{1F1EE}\u{1F1F9}"},{code:"JM",dialCode:"+1",name:"Jamaica",flag:"\u{1F1EF}\u{1F1F2}"},{code:"JP",dialCode:"+81",name:"Japan",flag:"\u{1F1EF}\u{1F1F5}"},{code:"JO",dialCode:"+962",name:"Jordan",flag:"\u{1F1EF}\u{1F1F4}"},{code:"KZ",dialCode:"+7",name:"Kazakhstan",flag:"\u{1F1F0}\u{1F1FF}"},{code:"KE",dialCode:"+254",name:"Kenya",flag:"\u{1F1F0}\u{1F1EA}"},{code:"KI",dialCode:"+686",name:"Kiribati",flag:"\u{1F1F0}\u{1F1EE}"},{code:"KW",dialCode:"+965",name:"Kuwait",flag:"\u{1F1F0}\u{1F1FC}"},{code:"KG",dialCode:"+996",name:"Kyrgyzstan",flag:"\u{1F1F0}\u{1F1EC}"},{code:"LA",dialCode:"+856",name:"Laos",flag:"\u{1F1F1}\u{1F1E6}"},{code:"LV",dialCode:"+371",name:"Latvia",flag:"\u{1F1F1}\u{1F1FB}"},{code:"LB",dialCode:"+961",name:"Lebanon",flag:"\u{1F1F1}\u{1F1E7}"},{code:"LS",dialCode:"+266",name:"Lesotho",flag:"\u{1F1F1}\u{1F1F8}"},{code:"LR",dialCode:"+231",name:"Liberia",flag:"\u{1F1F1}\u{1F1F7}"},{code:"LY",dialCode:"+218",name:"Libya",flag:"\u{1F1F1}\u{1F1FE}"},{code:"LI",dialCode:"+423",name:"Liechtenstein",flag:"\u{1F1F1}\u{1F1EE}"},{code:"LT",dialCode:"+370",name:"Lithuania",flag:"\u{1F1F1}\u{1F1F9}"},{code:"LU",dialCode:"+352",name:"Luxembourg",flag:"\u{1F1F1}\u{1F1FA}"},{code:"MO",dialCode:"+853",name:"Macao",flag:"\u{1F1F2}\u{1F1F4}"},{code:"MG",dialCode:"+261",name:"Madagascar",flag:"\u{1F1F2}\u{1F1EC}"},{code:"MW",dialCode:"+265",name:"Malawi",flag:"\u{1F1F2}\u{1F1FC}"},{code:"MY",dialCode:"+60",name:"Malaysia",flag:"\u{1F1F2}\u{1F1FE}"},{code:"MV",dialCode:"+960",name:"Maldives",flag:"\u{1F1F2}\u{1F1FB}"},{code:"ML",dialCode:"+223",name:"Mali",flag:"\u{1F1F2}\u{1F1F1}"},{code:"MT",dialCode:"+356",name:"Malta",flag:"\u{1F1F2}\u{1F1F9}"},{code:"MH",dialCode:"+692",name:"Marshall Islands",flag:"\u{1F1F2}\u{1F1ED}"},{code:"MR",dialCode:"+222",name:"Mauritania",flag:"\u{1F1F2}\u{1F1F7}"},{code:"MU",dialCode:"+230",name:"Mauritius",flag:"\u{1F1F2}\u{1F1FA}"},{code:"MX",dialCode:"+52",name:"Mexico",flag:"\u{1F1F2}\u{1F1FD}"},{code:"FM",dialCode:"+691",name:"Micronesia",flag:"\u{1F1EB}\u{1F1F2}"},{code:"MD",dialCode:"+373",name:"Moldova",flag:"\u{1F1F2}\u{1F1E9}"},{code:"MC",dialCode:"+377",name:"Monaco",flag:"\u{1F1F2}\u{1F1E8}"},{code:"MN",dialCode:"+976",name:"Mongolia",flag:"\u{1F1F2}\u{1F1F3}"},{code:"ME",dialCode:"+382",name:"Montenegro",flag:"\u{1F1F2}\u{1F1EA}"},{code:"MA",dialCode:"+212",name:"Morocco",flag:"\u{1F1F2}\u{1F1E6}"},{code:"MZ",dialCode:"+258",name:"Mozambique",flag:"\u{1F1F2}\u{1F1FF}"},{code:"MM",dialCode:"+95",name:"Myanmar",flag:"\u{1F1F2}\u{1F1F2}"},{code:"NA",dialCode:"+264",name:"Namibia",flag:"\u{1F1F3}\u{1F1E6}"},{code:"NR",dialCode:"+674",name:"Nauru",flag:"\u{1F1F3}\u{1F1F7}"},{code:"NP",dialCode:"+977",name:"Nepal",flag:"\u{1F1F3}\u{1F1F5}"},{code:"NL",dialCode:"+31",name:"Netherlands",flag:"\u{1F1F3}\u{1F1F1}"},{code:"NZ",dialCode:"+64",name:"New Zealand",flag:"\u{1F1F3}\u{1F1FF}"},{code:"NI",dialCode:"+505",name:"Nicaragua",flag:"\u{1F1F3}\u{1F1EE}"},{code:"NE",dialCode:"+227",name:"Niger",flag:"\u{1F1F3}\u{1F1EA}"},{code:"NG",dialCode:"+234",name:"Nigeria",flag:"\u{1F1F3}\u{1F1EC}"},{code:"KP",dialCode:"+850",name:"North Korea",flag:"\u{1F1F0}\u{1F1F5}"},{code:"MK",dialCode:"+389",name:"North Macedonia",flag:"\u{1F1F2}\u{1F1F0}"},{code:"NO",dialCode:"+47",name:"Norway",flag:"\u{1F1F3}\u{1F1F4}"},{code:"OM",dialCode:"+968",name:"Oman",flag:"\u{1F1F4}\u{1F1F2}"},{code:"PK",dialCode:"+92",name:"Pakistan",flag:"\u{1F1F5}\u{1F1F0}"},{code:"PW",dialCode:"+680",name:"Palau",flag:"\u{1F1F5}\u{1F1FC}"},{code:"PS",dialCode:"+970",name:"Palestine",flag:"\u{1F1F5}\u{1F1F8}"},{code:"PA",dialCode:"+507",name:"Panama",flag:"\u{1F1F5}\u{1F1E6}"},{code:"PG",dialCode:"+675",name:"Papua New Guinea",flag:"\u{1F1F5}\u{1F1EC}"},{code:"PY",dialCode:"+595",name:"Paraguay",flag:"\u{1F1F5}\u{1F1FE}"},{code:"PE",dialCode:"+51",name:"Peru",flag:"\u{1F1F5}\u{1F1EA}"},{code:"PH",dialCode:"+63",name:"Philippines",flag:"\u{1F1F5}\u{1F1ED}"},{code:"PL",dialCode:"+48",name:"Poland",flag:"\u{1F1F5}\u{1F1F1}"},{code:"PT",dialCode:"+351",name:"Portugal",flag:"\u{1F1F5}\u{1F1F9}"},{code:"PR",dialCode:"+1",name:"Puerto Rico",flag:"\u{1F1F5}\u{1F1F7}"},{code:"QA",dialCode:"+974",name:"Qatar",flag:"\u{1F1F6}\u{1F1E6}"},{code:"RO",dialCode:"+40",name:"Romania",flag:"\u{1F1F7}\u{1F1F4}"},{code:"RU",dialCode:"+7",name:"Russia",flag:"\u{1F1F7}\u{1F1FA}"},{code:"RW",dialCode:"+250",name:"Rwanda",flag:"\u{1F1F7}\u{1F1FC}"},{code:"KN",dialCode:"+1",name:"Saint Kitts and Nevis",flag:"\u{1F1F0}\u{1F1F3}"},{code:"LC",dialCode:"+1",name:"Saint Lucia",flag:"\u{1F1F1}\u{1F1E8}"},{code:"VC",dialCode:"+1",name:"Saint Vincent and the Grenadines",flag:"\u{1F1FB}\u{1F1E8}"},{code:"WS",dialCode:"+685",name:"Samoa",flag:"\u{1F1FC}\u{1F1F8}"},{code:"SM",dialCode:"+378",name:"San Marino",flag:"\u{1F1F8}\u{1F1F2}"},{code:"ST",dialCode:"+239",name:"Sao Tome and Principe",flag:"\u{1F1F8}\u{1F1F9}"},{code:"SA",dialCode:"+966",name:"Saudi Arabia",flag:"\u{1F1F8}\u{1F1E6}"},{code:"SN",dialCode:"+221",name:"Senegal",flag:"\u{1F1F8}\u{1F1F3}"},{code:"RS",dialCode:"+381",name:"Serbia",flag:"\u{1F1F7}\u{1F1F8}"},{code:"SC",dialCode:"+248",name:"Seychelles",flag:"\u{1F1F8}\u{1F1E8}"},{code:"SL",dialCode:"+232",name:"Sierra Leone",flag:"\u{1F1F8}\u{1F1F1}"},{code:"SG",dialCode:"+65",name:"Singapore",flag:"\u{1F1F8}\u{1F1EC}"},{code:"SK",dialCode:"+421",name:"Slovakia",flag:"\u{1F1F8}\u{1F1F0}"},{code:"SI",dialCode:"+386",name:"Slovenia",flag:"\u{1F1F8}\u{1F1EE}"},{code:"SB",dialCode:"+677",name:"Solomon Islands",flag:"\u{1F1F8}\u{1F1E7}"},{code:"SO",dialCode:"+252",name:"Somalia",flag:"\u{1F1F8}\u{1F1F4}"},{code:"ZA",dialCode:"+27",name:"South Africa",flag:"\u{1F1FF}\u{1F1E6}"},{code:"KR",dialCode:"+82",name:"South Korea",flag:"\u{1F1F0}\u{1F1F7}"},{code:"SS",dialCode:"+211",name:"South Sudan",flag:"\u{1F1F8}\u{1F1F8}"},{code:"ES",dialCode:"+34",name:"Spain",flag:"\u{1F1EA}\u{1F1F8}"},{code:"LK",dialCode:"+94",name:"Sri Lanka",flag:"\u{1F1F1}\u{1F1F0}"},{code:"SD",dialCode:"+249",name:"Sudan",flag:"\u{1F1F8}\u{1F1E9}"},{code:"SR",dialCode:"+597",name:"Suriname",flag:"\u{1F1F8}\u{1F1F7}"},{code:"SE",dialCode:"+46",name:"Sweden",flag:"\u{1F1F8}\u{1F1EA}"},{code:"CH",dialCode:"+41",name:"Switzerland",flag:"\u{1F1E8}\u{1F1ED}"},{code:"SY",dialCode:"+963",name:"Syria",flag:"\u{1F1F8}\u{1F1FE}"},{code:"TW",dialCode:"+886",name:"Taiwan",flag:"\u{1F1F9}\u{1F1FC}"},{code:"TJ",dialCode:"+992",name:"Tajikistan",flag:"\u{1F1F9}\u{1F1EF}"},{code:"TZ",dialCode:"+255",name:"Tanzania",flag:"\u{1F1F9}\u{1F1FF}"},{code:"TH",dialCode:"+66",name:"Thailand",flag:"\u{1F1F9}\u{1F1ED}"},{code:"TL",dialCode:"+670",name:"Timor-Leste",flag:"\u{1F1F9}\u{1F1F1}"},{code:"TG",dialCode:"+228",name:"Togo",flag:"\u{1F1F9}\u{1F1EC}"},{code:"TO",dialCode:"+676",name:"Tonga",flag:"\u{1F1F9}\u{1F1F4}"},{code:"TT",dialCode:"+1",name:"Trinidad and Tobago",flag:"\u{1F1F9}\u{1F1F9}"},{code:"TN",dialCode:"+216",name:"Tunisia",flag:"\u{1F1F9}\u{1F1F3}"},{code:"TR",dialCode:"+90",name:"Turkey",flag:"\u{1F1F9}\u{1F1F7}"},{code:"TM",dialCode:"+993",name:"Turkmenistan",flag:"\u{1F1F9}\u{1F1F2}"},{code:"TV",dialCode:"+688",name:"Tuvalu",flag:"\u{1F1F9}\u{1F1FB}"},{code:"UG",dialCode:"+256",name:"Uganda",flag:"\u{1F1FA}\u{1F1EC}"},{code:"UA",dialCode:"+380",name:"Ukraine",flag:"\u{1F1FA}\u{1F1E6}"},{code:"AE",dialCode:"+971",name:"United Arab Emirates",flag:"\u{1F1E6}\u{1F1EA}"},{code:"GB",dialCode:"+44",name:"United Kingdom",flag:"\u{1F1EC}\u{1F1E7}"},{code:"US",dialCode:"+1",name:"United States",flag:"\u{1F1FA}\u{1F1F8}"},{code:"UY",dialCode:"+598",name:"Uruguay",flag:"\u{1F1FA}\u{1F1FE}"},{code:"UZ",dialCode:"+998",name:"Uzbekistan",flag:"\u{1F1FA}\u{1F1FF}"},{code:"VU",dialCode:"+678",name:"Vanuatu",flag:"\u{1F1FB}\u{1F1FA}"},{code:"VA",dialCode:"+39",name:"Vatican City",flag:"\u{1F1FB}\u{1F1E6}"},{code:"VE",dialCode:"+58",name:"Venezuela",flag:"\u{1F1FB}\u{1F1EA}"},{code:"VN",dialCode:"+84",name:"Vietnam",flag:"\u{1F1FB}\u{1F1F3}"},{code:"YE",dialCode:"+967",name:"Yemen",flag:"\u{1F1FE}\u{1F1EA}"},{code:"ZM",dialCode:"+260",name:"Zambia",flag:"\u{1F1FF}\u{1F1F2}"},{code:"ZW",dialCode:"+263",name:"Zimbabwe",flag:"\u{1F1FF}\u{1F1FC}"}],X=new Map(k.map(e=>[e.code,e])),ee={"America/New_York":"US","America/Chicago":"US","America/Denver":"US","America/Los_Angeles":"US","America/Anchorage":"US","Pacific/Honolulu":"US","America/Phoenix":"US","America/Indiana/Indianapolis":"US","America/Toronto":"CA","America/Vancouver":"CA","America/Edmonton":"CA","America/Winnipeg":"CA","America/Halifax":"CA","America/St_Johns":"CA","Europe/London":"GB","Europe/Dublin":"IE","Europe/Paris":"FR","Europe/Berlin":"DE","Europe/Madrid":"ES","Europe/Rome":"IT","Europe/Amsterdam":"NL","Europe/Brussels":"BE","Europe/Zurich":"CH","Europe/Vienna":"AT","Europe/Stockholm":"SE","Europe/Oslo":"NO","Europe/Copenhagen":"DK","Europe/Helsinki":"FI","Europe/Warsaw":"PL","Europe/Prague":"CZ","Europe/Bucharest":"RO","Europe/Budapest":"HU","Europe/Athens":"GR","Europe/Istanbul":"TR","Europe/Moscow":"RU","Europe/Kiev":"UA","Europe/Lisbon":"PT","Europe/Belgrade":"RS","Europe/Zagreb":"HR","Europe/Bratislava":"SK","Europe/Ljubljana":"SI","Europe/Tallinn":"EE","Europe/Riga":"LV","Europe/Vilnius":"LT","Asia/Tokyo":"JP","Asia/Seoul":"KR","Asia/Shanghai":"CN","Asia/Hong_Kong":"HK","Asia/Taipei":"TW","Asia/Singapore":"SG","Asia/Kolkata":"IN","Asia/Karachi":"PK","Asia/Dhaka":"BD","Asia/Bangkok":"TH","Asia/Jakarta":"ID","Asia/Manila":"PH","Asia/Kuala_Lumpur":"MY","Asia/Ho_Chi_Minh":"VN","Asia/Riyadh":"SA","Asia/Dubai":"AE","Asia/Tehran":"IR","Asia/Baghdad":"IQ","Asia/Beirut":"LB","Asia/Jerusalem":"IL","Asia/Amman":"JO","Asia/Almaty":"KZ","Asia/Tashkent":"UZ","Asia/Colombo":"LK","Asia/Kathmandu":"NP","Asia/Yangon":"MM","Australia/Sydney":"AU","Australia/Melbourne":"AU","Australia/Brisbane":"AU","Australia/Perth":"AU","Australia/Adelaide":"AU","Pacific/Auckland":"NZ","Pacific/Fiji":"FJ","Africa/Cairo":"EG","Africa/Lagos":"NG","Africa/Nairobi":"KE","Africa/Johannesburg":"ZA","Africa/Casablanca":"MA","Africa/Accra":"GH","Africa/Addis_Ababa":"ET","Africa/Dar_es_Salaam":"TZ","Africa/Kampala":"UG","America/Mexico_City":"MX","America/Bogota":"CO","America/Lima":"PE","America/Santiago":"CL","America/Buenos_Aires":"AR","America/Sao_Paulo":"BR","America/Caracas":"VE","America/Guatemala":"GT","America/Havana":"CU","America/Panama":"PA","America/Jamaica":"JM"};function G(){try{let e=Intl.DateTimeFormat().resolvedOptions().timeZone;return ee[e]??"US"}catch{return"US"}}function K(e){if(!e.startsWith("+"))return e;let a=e.slice(1);if(a.startsWith("1")&&a.length===11){let t=a.slice(1,4),i=a.slice(4,7),n=a.slice(7);return`+1 (${t}) ${i}-${n}`}for(let t=4;t>=1;t--){let i="+"+a.slice(0,t),n=k.find(o=>o.dialCode===i);if(n){let o=a.slice(t);return`${n.dialCode} ${o}`}}return e}function N(e,a){let t=e.replace(/\D/g,""),i=X.get(a);if(!i)return"+"+t;let n=i.dialCode.slice(1);return t.startsWith(n)?"+"+t:i.dialCode+t}function H(e){return/^\+[1-9]\d{6,14}$/.test(e)}function $(e){return/^[^\s@]+@[^\s@]+\.[^\s@]+$/.test(e)}async function h(e,a,t){let n={Authorization:`Bearer ${u().token}`};t!==void 0&&(n["Content-Type"]="application/json");let o=await fetch(e,{method:a,headers:n,...t!==void 0&&{body:JSON.stringify(t)}});if(!o.ok){let r=`Auth request failed: ${o.status} ${o.statusText}`,s="auth_error";try{let d=await o.json();d.error&&(r=d.error),d.code&&(s=d.code)}catch{}throw new l(r,s,o.status)}return await o.json()}var I="__ms_remy_state",R="ms_popup",j="ms:remy:callback",F=!1,E=ne();function ne(){if(typeof window>"u")return!1;try{let e=new URL(window.location.href).searchParams;return e.has("code")&&e.get(R)!=="1"}catch{return!1}}function oe(){let e=globalThis.crypto;if(e&&typeof e.randomUUID=="function")return e.randomUUID();let a=new Uint8Array(16);return e?.getRandomValues?.(a),Array.from(a,t=>t.toString(16).padStart(2,"0")).join("")}function re(e){e.searchParams.delete("code"),e.searchParams.delete("state");try{window.history.replaceState(window.history.state,"",e.toString())}catch{}}var M=new Set;function T(e){O({token:e.token,user:e.user,methods:e.methods,visitorId:e.visitorId}),M.forEach(a=>a(e.user))}function b(e){if(!e.user)throw new l("Verification succeeded but no user was returned","auth_error");return e.user}function V(e){let a=u();a.user&&(Object.assign(a.user,e),M.forEach(t=>t(a.user)))}function x(){try{return u().user}catch{return null}}function W(){let e=x();M.forEach(a=>a(e))}function J(){E||(E=!0,W())}function _(){E&&(E=!1,W())}function ie(){try{return window.top!==window.self}catch{return!0}}var de=520,se=600;function le(e,a){let t=window.screenX,i=window.screenY,n=window.outerWidth||window.innerWidth||window.screen.width,o=window.outerHeight||window.innerHeight||window.screen.height,r=Math.min(e,n),s=Math.min(a,o),d=Math.max(0,Math.round(t+(n-r)/2)),A=Math.max(0,Math.round(i+(o-s)/2));return`popup=yes,width=${Math.round(r)},height=${Math.round(s)},left=${d},top=${A}`}function ce(e,a){let t=new URL(e,window.location.href);t.searchParams.set(R,"1");let i=`/_/auth/remy/start?${new URLSearchParams({redirect_uri:t.toString(),state:a}).toString()}`,n=window.open(i,"ms-remy-signin",le(de,se));return n?(J(),new Promise((o,r)=>{let s=window.location.origin,d=!1,A=!1,c=m=>{if(!d){d=!0,window.removeEventListener("message",p),clearInterval(S),clearTimeout(y),_();try{n.closed||n.close()}catch{}m()}},p=m=>{if(d||A||m.origin!==s||m.source!==n)return;let f=m.data;if(!(!f||f.type!==j||f.state!==a)){if(A=!0,!f.code){c(()=>r(new l("Sign-in returned no code.","auth_error")));return}h("/_/auth/remy/exchange","POST",{code:f.code}).then(g=>{E=!1,T(g),c(()=>o(b(g)))}).catch(g=>c(()=>r(g)))}};window.addEventListener("message",p);let S=setInterval(()=>{n.closed&&!A&&c(()=>o(null))},400),y=setTimeout(()=>c(()=>r(new l("Sign-in timed out.","signin_timeout"))),300*1e3)})):Promise.reject(new l("The sign-in popup was blocked. Allow popups for this site and try again.","popup_blocked"))}function B(){if(typeof window>"u")return!1;let e;try{e=new URL(window.location.href).searchParams}catch{return!1}if(e.get(R)!=="1")return!1;let a=e.get("code");if(!a)return!1;if(F)return!0;let t=window.opener;if(!t||t===window)return!1;try{t.postMessage({type:j,code:a,state:e.get("state")??void 0},window.location.origin)}catch{return!1}F=!0;try{setTimeout(()=>window.close(),0)}catch{}return!0}var ue={get currentUser(){return u().user},getCurrentUser(){return u().user},isAuthenticated(){return u().user!==null},get authStatus(){return E?"authenticating":x()?"authenticated":"unauthenticated"},get currentVisitorId(){return u().visitorId??null},getCurrentVisitorId(){return u().visitorId??null},sendEmailCode(e){return h("/_/auth/email/send","POST",{email:e})},async verifyEmailCode(e,a){let t=await h("/_/auth/email/verify","POST",{verificationId:e,code:a});return T(t),b(t)},sendSmsCode(e){return h("/_/auth/sms/send","POST",{phone:e})},async verifySmsCode(e,a){let t=await h("/_/auth/sms/verify","POST",{verificationId:e,code:a});return T(t),b(t)},signInWithRemy(e){let a=e?.mode??"auto",t=a==="popup"||a==="auto"&&ie(),i=e?.redirectUri??window.location.href,n=e?.state??oe();if(t)return ce(i,n);try{sessionStorage.setItem(I,n)}catch{}let o=new URLSearchParams({redirect_uri:i,state:n});return window.location.assign(`/_/auth/remy/start?${o.toString()}`),new Promise(()=>{})},async handleRemyRedirect(){if(typeof window>"u")return null;let e=new URL(window.location.href),a=e.searchParams.get("code");if(!a)return null;if(e.searchParams.get(R)==="1")return B(),null;let t=e.searchParams.get("state");re(e);let i=null;try{i=sessionStorage.getItem(I),sessionStorage.removeItem(I)}catch{}if(J(),t!==null&&t!==i)throw _(),new l("Sign-in state mismatch \u2014 possible CSRF or a stale redirect. Please try again.","invalid_state");try{let n=await h("/_/auth/remy/exchange","POST",{code:a});return E=!1,T(n),b(n)}catch(n){throw _(),n}},async requestEmailChange(e){await h("/_/auth/email/change","POST",{newEmail:e})},async confirmEmailChange(e,a){let t=await h("/_/auth/email/change/confirm","POST",{newEmail:e,code:a});return T(t),b(t)},async requestPhoneChange(e){await h("/_/auth/phone/change","POST",{newPhone:e})},async confirmPhoneChange(e,a){let t=await h("/_/auth/phone/change/confirm","POST",{newPhone:e,code:a});return T(t),b(t)},async logout(){let e=await h("/_/auth/logout","POST",{});T(e)},async createApiKey(){let e=await h("/_/auth/api-key/create","POST",{});return V({apiKey:e.apiKey}),{key:e.key}},async revokeApiKey(){await h("/_/auth/api-key/revoke","POST",{}),V({apiKey:null})},onAuthStateChanged(e){return M.add(e),e(x()),()=>{M.delete(e)}},phone:{countries:k,detectCountry:G,format:K,toE164:N,isValid:H},email:{isValid:$}};typeof window<"u"&&!B()&&globalThis.__MINDSTUDIO__&&setTimeout(()=>{try{u()}catch{}},0);export{l as MindStudioInterfaceError,Z as analytics,ue as auth,q as createAgentChatClient,Y as createClient,Q as platform};
|
|
1
|
+
import{a as l,b as Q,c,d as D,e as w,f as G}from"./chunk-FFFGB4U3.js";function X(){return new Proxy({},{get(e,t){return async(a,n)=>{let o=c(),i=o.methods[t];if(!i)throw new l(`Method "${t}" not found. Available methods: ${Object.keys(o.methods).join(", ")||"(none)"}`,"method_not_found");let r=w(`/_/methods/${i}/invoke`),d=n?.stream===!0,s=await fetch(r,{method:"POST",headers:{"Content-Type":"application/json",Authorization:`Bearer ${o.token}`},body:JSON.stringify({input:a??{},...d&&{stream:!0}})});if(!s.ok){let A=`Method "${t}" failed: ${s.status} ${s.statusText}`,p="method_error";try{let u=await s.json();u.error&&(A=u.error),u.code&&(p=u.code)}catch{}throw new l(A,p,s.status)}if(!d)return(await s.json()).output;let C=s.body.getReader(),f=new TextDecoder,h="",m,S;for(;;){let{done:A,value:p}=await C.read();if(A)break;h+=f.decode(p,{stream:!0});let u=h.split(`
|
|
2
|
+
`);h=u.pop()??"";for(let T of u){if(!T.startsWith("data: "))continue;let P=T.slice(6);try{let g=JSON.parse(P);g.type==="token"&&n?.onToken&&g.text?n.onToken(g.text):g.type==="data"&&n?.onStreamData?n.onStreamData(g.data):g.type==="error"&&g.error?(S=g.error,n?.onStreamError&&n.onStreamError(g.error)):g.type==="done"&&(m=g.output)}catch{}}}if(m===void 0&&S!==void 0)throw new l(S,"method_error");if(m===void 0)throw new l("Stream ended without a done event","stream_incomplete");return m}}})}var K="/_/agent";async function k(e,t,a){let o={Authorization:`Bearer ${c().token}`};a!==void 0&&(o["Content-Type"]="application/json");let i=await fetch(w(`${K}${e}`),{method:t,headers:o,...a!==void 0&&{body:JSON.stringify(a)}});if(!i.ok){let r=`Agent chat request failed: ${i.status} ${i.statusText}`,d="agent_chat_error";try{let s=await i.json();s.error&&(r=s.error),s.code&&(d=s.code)}catch{}throw new l(r,d,i.status)}return await i.json()}function ee(e,t){switch(t.onEvent?.(e),e.type){case"text":t.onText?.(e.text);break;case"thinking":t.onThinking?.(e.text);break;case"thinking_complete":t.onThinkingComplete?.(e.thinking,e.signature);break;case"tool_call_start":t.onToolCallStart?.(e.id,e.name);break;case"tool_call_result":t.onToolCallResult?.(e.id,e.output);break;case"client_tool_call":t.onClientToolCall?.(e.name,e.input,e.id);break;case"error":t.onError?.(e.error);break}}function ae(){let e=new Map,t=a=>{let n=c().token;n&&!e.has(a)&&e.set(a,n)};return{async createThread(){let a=c().token,n=await k("/threads","POST");return a&&e.set(n.id,a),n},listThreads(a){let n=a?`?cursor=${encodeURIComponent(a)}`:"";return k(`/threads${n}`,"GET")},getThread(a){return k(`/threads/${a}`,"GET")},async updateThread(a,n){await k(`/threads/${a}`,"PATCH",{title:n})},async deleteThread(a){await k(`/threads/${a}`,"DELETE")},async claimThread(a,n){let o=n?.previousToken??e.get(a);if(!o)throw new l("No pre-login token known for this thread \u2014 pass options.previousToken.","missing_previous_token",400);await k(`/threads/${a}/claim`,"POST",{previousToken:o}),e.delete(a)},sendMessage(a,n,o,i){t(a);let r=new AbortController,d=o??{};d.signal&&(d.signal.aborted?r.abort():d.signal.addEventListener("abort",()=>r.abort(),{once:!0}));let C=(async()=>{let f=c(),h=w(`${K}/threads/${a}/messages`),m=await fetch(h,{method:"POST",headers:{"Content-Type":"application/json",Authorization:`Bearer ${f.token}`},body:JSON.stringify({content:n,...i?.attachments?.length&&{attachments:i.attachments}}),signal:r.signal});if(!m.ok){let T=`Send message failed: ${m.status} ${m.statusText}`,P="agent_chat_error";try{let g=await m.json();g.error&&(T=g.error),g.code&&(P=g.code)}catch{}throw new l(T,P,m.status)}let S=m.body.getReader(),A=new TextDecoder,p="",u;for(;;){let{done:T,value:P}=await S.read();if(T)break;p+=A.decode(P,{stream:!0});let g=p.split(`
|
|
3
|
+
`);p=g.pop()??"";for(let L of g){if(!L.startsWith("data: "))continue;let q=L.slice(6);try{let U=JSON.parse(q);U.type==="done"&&(u={stopReason:U.stopReason,usage:U.usage}),ee(U,d)}catch{}}}if(!u)throw new l("Stream ended without a done event","stream_incomplete");return u})();return C.abort=()=>r.abort(),C}}}var te={get basePath(){return D()},async uploadFile(e,t){let a=c(),{onProgress:n,signal:o}=t??{};o?.throwIfAborted();let i=w("/_/generate-upload-request"),r=await fetch(i,{method:"POST",headers:{Authorization:`Bearer ${a.token}`,"Content-Type":"application/json"},body:JSON.stringify({filename:e.name,contentType:e.type||"application/octet-stream"}),signal:o});if(!r.ok)throw new l(`Upload presign failed: ${r.status} ${r.statusText}`,"upload_error",r.status);let{uploadUrl:d,uploadFields:s,publicUrl:C}=await r.json(),f=new FormData;for(let[m,S]of Object.entries(s))f.append(m,S);if(f.append("file",e),n)return await N(d,f,n,o),C;let h=await fetch(d,{method:"POST",body:f,signal:o});if(!h.ok)throw new l(`File upload failed: ${h.status} ${h.statusText}`,"upload_error",h.status);return C},async upload(e,t,a){let{onProgress:n,signal:o}=a??{};o?.throwIfAborted();let i=new FormData;for(let[r,d]of Object.entries(e.upload.fields))i.append(r,d);if(i.append("file",t),n)await N(e.upload.url,i,n,o);else{let r=await fetch(e.upload.url,{method:"POST",body:i,signal:o});if(!r.ok)throw new l(`File upload failed: ${r.status} ${r.statusText}`,"upload_error",r.status)}return{key:e.key,url:e.url}}};function N(e,t,a,n){return new Promise((o,i)=>{let r=new XMLHttpRequest;if(r.upload.addEventListener("progress",d=>{d.lengthComputable&&a(d.loaded/d.total)}),r.addEventListener("load",()=>{r.status>=200&&r.status<300?(a(1),o()):i(new l(`File upload failed: ${r.status} ${r.statusText}`,"upload_error",r.status))}),r.addEventListener("error",()=>{i(new l("File upload failed: network error","upload_error"))}),r.addEventListener("abort",()=>{i(new DOMException("Upload aborted","AbortError"))}),n){if(n.aborted){i(new DOMException("Upload aborted","AbortError"));return}n.addEventListener("abort",()=>r.abort(),{once:!0})}r.open("POST",e),r.send(t)})}var R=[{code:"AF",dialCode:"+93",name:"Afghanistan",flag:"\u{1F1E6}\u{1F1EB}"},{code:"AL",dialCode:"+355",name:"Albania",flag:"\u{1F1E6}\u{1F1F1}"},{code:"DZ",dialCode:"+213",name:"Algeria",flag:"\u{1F1E9}\u{1F1FF}"},{code:"AD",dialCode:"+376",name:"Andorra",flag:"\u{1F1E6}\u{1F1E9}"},{code:"AO",dialCode:"+244",name:"Angola",flag:"\u{1F1E6}\u{1F1F4}"},{code:"AG",dialCode:"+1",name:"Antigua and Barbuda",flag:"\u{1F1E6}\u{1F1EC}"},{code:"AR",dialCode:"+54",name:"Argentina",flag:"\u{1F1E6}\u{1F1F7}"},{code:"AM",dialCode:"+374",name:"Armenia",flag:"\u{1F1E6}\u{1F1F2}"},{code:"AU",dialCode:"+61",name:"Australia",flag:"\u{1F1E6}\u{1F1FA}"},{code:"AT",dialCode:"+43",name:"Austria",flag:"\u{1F1E6}\u{1F1F9}"},{code:"AZ",dialCode:"+994",name:"Azerbaijan",flag:"\u{1F1E6}\u{1F1FF}"},{code:"BS",dialCode:"+1",name:"Bahamas",flag:"\u{1F1E7}\u{1F1F8}"},{code:"BH",dialCode:"+973",name:"Bahrain",flag:"\u{1F1E7}\u{1F1ED}"},{code:"BD",dialCode:"+880",name:"Bangladesh",flag:"\u{1F1E7}\u{1F1E9}"},{code:"BB",dialCode:"+1",name:"Barbados",flag:"\u{1F1E7}\u{1F1E7}"},{code:"BY",dialCode:"+375",name:"Belarus",flag:"\u{1F1E7}\u{1F1FE}"},{code:"BE",dialCode:"+32",name:"Belgium",flag:"\u{1F1E7}\u{1F1EA}"},{code:"BZ",dialCode:"+501",name:"Belize",flag:"\u{1F1E7}\u{1F1FF}"},{code:"BJ",dialCode:"+229",name:"Benin",flag:"\u{1F1E7}\u{1F1EF}"},{code:"BT",dialCode:"+975",name:"Bhutan",flag:"\u{1F1E7}\u{1F1F9}"},{code:"BO",dialCode:"+591",name:"Bolivia",flag:"\u{1F1E7}\u{1F1F4}"},{code:"BA",dialCode:"+387",name:"Bosnia and Herzegovina",flag:"\u{1F1E7}\u{1F1E6}"},{code:"BW",dialCode:"+267",name:"Botswana",flag:"\u{1F1E7}\u{1F1FC}"},{code:"BR",dialCode:"+55",name:"Brazil",flag:"\u{1F1E7}\u{1F1F7}"},{code:"BN",dialCode:"+673",name:"Brunei",flag:"\u{1F1E7}\u{1F1F3}"},{code:"BG",dialCode:"+359",name:"Bulgaria",flag:"\u{1F1E7}\u{1F1EC}"},{code:"BF",dialCode:"+226",name:"Burkina Faso",flag:"\u{1F1E7}\u{1F1EB}"},{code:"BI",dialCode:"+257",name:"Burundi",flag:"\u{1F1E7}\u{1F1EE}"},{code:"CV",dialCode:"+238",name:"Cabo Verde",flag:"\u{1F1E8}\u{1F1FB}"},{code:"KH",dialCode:"+855",name:"Cambodia",flag:"\u{1F1F0}\u{1F1ED}"},{code:"CM",dialCode:"+237",name:"Cameroon",flag:"\u{1F1E8}\u{1F1F2}"},{code:"CA",dialCode:"+1",name:"Canada",flag:"\u{1F1E8}\u{1F1E6}"},{code:"CF",dialCode:"+236",name:"Central African Republic",flag:"\u{1F1E8}\u{1F1EB}"},{code:"TD",dialCode:"+235",name:"Chad",flag:"\u{1F1F9}\u{1F1E9}"},{code:"CL",dialCode:"+56",name:"Chile",flag:"\u{1F1E8}\u{1F1F1}"},{code:"CN",dialCode:"+86",name:"China",flag:"\u{1F1E8}\u{1F1F3}"},{code:"CO",dialCode:"+57",name:"Colombia",flag:"\u{1F1E8}\u{1F1F4}"},{code:"KM",dialCode:"+269",name:"Comoros",flag:"\u{1F1F0}\u{1F1F2}"},{code:"CG",dialCode:"+242",name:"Congo",flag:"\u{1F1E8}\u{1F1EC}"},{code:"CD",dialCode:"+243",name:"Congo (DRC)",flag:"\u{1F1E8}\u{1F1E9}"},{code:"CR",dialCode:"+506",name:"Costa Rica",flag:"\u{1F1E8}\u{1F1F7}"},{code:"HR",dialCode:"+385",name:"Croatia",flag:"\u{1F1ED}\u{1F1F7}"},{code:"CU",dialCode:"+53",name:"Cuba",flag:"\u{1F1E8}\u{1F1FA}"},{code:"CY",dialCode:"+357",name:"Cyprus",flag:"\u{1F1E8}\u{1F1FE}"},{code:"CZ",dialCode:"+420",name:"Czechia",flag:"\u{1F1E8}\u{1F1FF}"},{code:"CI",dialCode:"+225",name:"Cote d'Ivoire",flag:"\u{1F1E8}\u{1F1EE}"},{code:"DK",dialCode:"+45",name:"Denmark",flag:"\u{1F1E9}\u{1F1F0}"},{code:"DJ",dialCode:"+253",name:"Djibouti",flag:"\u{1F1E9}\u{1F1EF}"},{code:"DM",dialCode:"+1",name:"Dominica",flag:"\u{1F1E9}\u{1F1F2}"},{code:"DO",dialCode:"+1",name:"Dominican Republic",flag:"\u{1F1E9}\u{1F1F4}"},{code:"EC",dialCode:"+593",name:"Ecuador",flag:"\u{1F1EA}\u{1F1E8}"},{code:"EG",dialCode:"+20",name:"Egypt",flag:"\u{1F1EA}\u{1F1EC}"},{code:"SV",dialCode:"+503",name:"El Salvador",flag:"\u{1F1F8}\u{1F1FB}"},{code:"GQ",dialCode:"+240",name:"Equatorial Guinea",flag:"\u{1F1EC}\u{1F1F6}"},{code:"ER",dialCode:"+291",name:"Eritrea",flag:"\u{1F1EA}\u{1F1F7}"},{code:"EE",dialCode:"+372",name:"Estonia",flag:"\u{1F1EA}\u{1F1EA}"},{code:"SZ",dialCode:"+268",name:"Eswatini",flag:"\u{1F1F8}\u{1F1FF}"},{code:"ET",dialCode:"+251",name:"Ethiopia",flag:"\u{1F1EA}\u{1F1F9}"},{code:"FJ",dialCode:"+679",name:"Fiji",flag:"\u{1F1EB}\u{1F1EF}"},{code:"FI",dialCode:"+358",name:"Finland",flag:"\u{1F1EB}\u{1F1EE}"},{code:"FR",dialCode:"+33",name:"France",flag:"\u{1F1EB}\u{1F1F7}"},{code:"GA",dialCode:"+241",name:"Gabon",flag:"\u{1F1EC}\u{1F1E6}"},{code:"GM",dialCode:"+220",name:"Gambia",flag:"\u{1F1EC}\u{1F1F2}"},{code:"GE",dialCode:"+995",name:"Georgia",flag:"\u{1F1EC}\u{1F1EA}"},{code:"DE",dialCode:"+49",name:"Germany",flag:"\u{1F1E9}\u{1F1EA}"},{code:"GH",dialCode:"+233",name:"Ghana",flag:"\u{1F1EC}\u{1F1ED}"},{code:"GR",dialCode:"+30",name:"Greece",flag:"\u{1F1EC}\u{1F1F7}"},{code:"GD",dialCode:"+1",name:"Grenada",flag:"\u{1F1EC}\u{1F1E9}"},{code:"GT",dialCode:"+502",name:"Guatemala",flag:"\u{1F1EC}\u{1F1F9}"},{code:"GN",dialCode:"+224",name:"Guinea",flag:"\u{1F1EC}\u{1F1F3}"},{code:"GW",dialCode:"+245",name:"Guinea-Bissau",flag:"\u{1F1EC}\u{1F1FC}"},{code:"GY",dialCode:"+592",name:"Guyana",flag:"\u{1F1EC}\u{1F1FE}"},{code:"HT",dialCode:"+509",name:"Haiti",flag:"\u{1F1ED}\u{1F1F9}"},{code:"HN",dialCode:"+504",name:"Honduras",flag:"\u{1F1ED}\u{1F1F3}"},{code:"HK",dialCode:"+852",name:"Hong Kong",flag:"\u{1F1ED}\u{1F1F0}"},{code:"HU",dialCode:"+36",name:"Hungary",flag:"\u{1F1ED}\u{1F1FA}"},{code:"IS",dialCode:"+354",name:"Iceland",flag:"\u{1F1EE}\u{1F1F8}"},{code:"IN",dialCode:"+91",name:"India",flag:"\u{1F1EE}\u{1F1F3}"},{code:"ID",dialCode:"+62",name:"Indonesia",flag:"\u{1F1EE}\u{1F1E9}"},{code:"IR",dialCode:"+98",name:"Iran",flag:"\u{1F1EE}\u{1F1F7}"},{code:"IQ",dialCode:"+964",name:"Iraq",flag:"\u{1F1EE}\u{1F1F6}"},{code:"IE",dialCode:"+353",name:"Ireland",flag:"\u{1F1EE}\u{1F1EA}"},{code:"IL",dialCode:"+972",name:"Israel",flag:"\u{1F1EE}\u{1F1F1}"},{code:"IT",dialCode:"+39",name:"Italy",flag:"\u{1F1EE}\u{1F1F9}"},{code:"JM",dialCode:"+1",name:"Jamaica",flag:"\u{1F1EF}\u{1F1F2}"},{code:"JP",dialCode:"+81",name:"Japan",flag:"\u{1F1EF}\u{1F1F5}"},{code:"JO",dialCode:"+962",name:"Jordan",flag:"\u{1F1EF}\u{1F1F4}"},{code:"KZ",dialCode:"+7",name:"Kazakhstan",flag:"\u{1F1F0}\u{1F1FF}"},{code:"KE",dialCode:"+254",name:"Kenya",flag:"\u{1F1F0}\u{1F1EA}"},{code:"KI",dialCode:"+686",name:"Kiribati",flag:"\u{1F1F0}\u{1F1EE}"},{code:"KW",dialCode:"+965",name:"Kuwait",flag:"\u{1F1F0}\u{1F1FC}"},{code:"KG",dialCode:"+996",name:"Kyrgyzstan",flag:"\u{1F1F0}\u{1F1EC}"},{code:"LA",dialCode:"+856",name:"Laos",flag:"\u{1F1F1}\u{1F1E6}"},{code:"LV",dialCode:"+371",name:"Latvia",flag:"\u{1F1F1}\u{1F1FB}"},{code:"LB",dialCode:"+961",name:"Lebanon",flag:"\u{1F1F1}\u{1F1E7}"},{code:"LS",dialCode:"+266",name:"Lesotho",flag:"\u{1F1F1}\u{1F1F8}"},{code:"LR",dialCode:"+231",name:"Liberia",flag:"\u{1F1F1}\u{1F1F7}"},{code:"LY",dialCode:"+218",name:"Libya",flag:"\u{1F1F1}\u{1F1FE}"},{code:"LI",dialCode:"+423",name:"Liechtenstein",flag:"\u{1F1F1}\u{1F1EE}"},{code:"LT",dialCode:"+370",name:"Lithuania",flag:"\u{1F1F1}\u{1F1F9}"},{code:"LU",dialCode:"+352",name:"Luxembourg",flag:"\u{1F1F1}\u{1F1FA}"},{code:"MO",dialCode:"+853",name:"Macao",flag:"\u{1F1F2}\u{1F1F4}"},{code:"MG",dialCode:"+261",name:"Madagascar",flag:"\u{1F1F2}\u{1F1EC}"},{code:"MW",dialCode:"+265",name:"Malawi",flag:"\u{1F1F2}\u{1F1FC}"},{code:"MY",dialCode:"+60",name:"Malaysia",flag:"\u{1F1F2}\u{1F1FE}"},{code:"MV",dialCode:"+960",name:"Maldives",flag:"\u{1F1F2}\u{1F1FB}"},{code:"ML",dialCode:"+223",name:"Mali",flag:"\u{1F1F2}\u{1F1F1}"},{code:"MT",dialCode:"+356",name:"Malta",flag:"\u{1F1F2}\u{1F1F9}"},{code:"MH",dialCode:"+692",name:"Marshall Islands",flag:"\u{1F1F2}\u{1F1ED}"},{code:"MR",dialCode:"+222",name:"Mauritania",flag:"\u{1F1F2}\u{1F1F7}"},{code:"MU",dialCode:"+230",name:"Mauritius",flag:"\u{1F1F2}\u{1F1FA}"},{code:"MX",dialCode:"+52",name:"Mexico",flag:"\u{1F1F2}\u{1F1FD}"},{code:"FM",dialCode:"+691",name:"Micronesia",flag:"\u{1F1EB}\u{1F1F2}"},{code:"MD",dialCode:"+373",name:"Moldova",flag:"\u{1F1F2}\u{1F1E9}"},{code:"MC",dialCode:"+377",name:"Monaco",flag:"\u{1F1F2}\u{1F1E8}"},{code:"MN",dialCode:"+976",name:"Mongolia",flag:"\u{1F1F2}\u{1F1F3}"},{code:"ME",dialCode:"+382",name:"Montenegro",flag:"\u{1F1F2}\u{1F1EA}"},{code:"MA",dialCode:"+212",name:"Morocco",flag:"\u{1F1F2}\u{1F1E6}"},{code:"MZ",dialCode:"+258",name:"Mozambique",flag:"\u{1F1F2}\u{1F1FF}"},{code:"MM",dialCode:"+95",name:"Myanmar",flag:"\u{1F1F2}\u{1F1F2}"},{code:"NA",dialCode:"+264",name:"Namibia",flag:"\u{1F1F3}\u{1F1E6}"},{code:"NR",dialCode:"+674",name:"Nauru",flag:"\u{1F1F3}\u{1F1F7}"},{code:"NP",dialCode:"+977",name:"Nepal",flag:"\u{1F1F3}\u{1F1F5}"},{code:"NL",dialCode:"+31",name:"Netherlands",flag:"\u{1F1F3}\u{1F1F1}"},{code:"NZ",dialCode:"+64",name:"New Zealand",flag:"\u{1F1F3}\u{1F1FF}"},{code:"NI",dialCode:"+505",name:"Nicaragua",flag:"\u{1F1F3}\u{1F1EE}"},{code:"NE",dialCode:"+227",name:"Niger",flag:"\u{1F1F3}\u{1F1EA}"},{code:"NG",dialCode:"+234",name:"Nigeria",flag:"\u{1F1F3}\u{1F1EC}"},{code:"KP",dialCode:"+850",name:"North Korea",flag:"\u{1F1F0}\u{1F1F5}"},{code:"MK",dialCode:"+389",name:"North Macedonia",flag:"\u{1F1F2}\u{1F1F0}"},{code:"NO",dialCode:"+47",name:"Norway",flag:"\u{1F1F3}\u{1F1F4}"},{code:"OM",dialCode:"+968",name:"Oman",flag:"\u{1F1F4}\u{1F1F2}"},{code:"PK",dialCode:"+92",name:"Pakistan",flag:"\u{1F1F5}\u{1F1F0}"},{code:"PW",dialCode:"+680",name:"Palau",flag:"\u{1F1F5}\u{1F1FC}"},{code:"PS",dialCode:"+970",name:"Palestine",flag:"\u{1F1F5}\u{1F1F8}"},{code:"PA",dialCode:"+507",name:"Panama",flag:"\u{1F1F5}\u{1F1E6}"},{code:"PG",dialCode:"+675",name:"Papua New Guinea",flag:"\u{1F1F5}\u{1F1EC}"},{code:"PY",dialCode:"+595",name:"Paraguay",flag:"\u{1F1F5}\u{1F1FE}"},{code:"PE",dialCode:"+51",name:"Peru",flag:"\u{1F1F5}\u{1F1EA}"},{code:"PH",dialCode:"+63",name:"Philippines",flag:"\u{1F1F5}\u{1F1ED}"},{code:"PL",dialCode:"+48",name:"Poland",flag:"\u{1F1F5}\u{1F1F1}"},{code:"PT",dialCode:"+351",name:"Portugal",flag:"\u{1F1F5}\u{1F1F9}"},{code:"PR",dialCode:"+1",name:"Puerto Rico",flag:"\u{1F1F5}\u{1F1F7}"},{code:"QA",dialCode:"+974",name:"Qatar",flag:"\u{1F1F6}\u{1F1E6}"},{code:"RO",dialCode:"+40",name:"Romania",flag:"\u{1F1F7}\u{1F1F4}"},{code:"RU",dialCode:"+7",name:"Russia",flag:"\u{1F1F7}\u{1F1FA}"},{code:"RW",dialCode:"+250",name:"Rwanda",flag:"\u{1F1F7}\u{1F1FC}"},{code:"KN",dialCode:"+1",name:"Saint Kitts and Nevis",flag:"\u{1F1F0}\u{1F1F3}"},{code:"LC",dialCode:"+1",name:"Saint Lucia",flag:"\u{1F1F1}\u{1F1E8}"},{code:"VC",dialCode:"+1",name:"Saint Vincent and the Grenadines",flag:"\u{1F1FB}\u{1F1E8}"},{code:"WS",dialCode:"+685",name:"Samoa",flag:"\u{1F1FC}\u{1F1F8}"},{code:"SM",dialCode:"+378",name:"San Marino",flag:"\u{1F1F8}\u{1F1F2}"},{code:"ST",dialCode:"+239",name:"Sao Tome and Principe",flag:"\u{1F1F8}\u{1F1F9}"},{code:"SA",dialCode:"+966",name:"Saudi Arabia",flag:"\u{1F1F8}\u{1F1E6}"},{code:"SN",dialCode:"+221",name:"Senegal",flag:"\u{1F1F8}\u{1F1F3}"},{code:"RS",dialCode:"+381",name:"Serbia",flag:"\u{1F1F7}\u{1F1F8}"},{code:"SC",dialCode:"+248",name:"Seychelles",flag:"\u{1F1F8}\u{1F1E8}"},{code:"SL",dialCode:"+232",name:"Sierra Leone",flag:"\u{1F1F8}\u{1F1F1}"},{code:"SG",dialCode:"+65",name:"Singapore",flag:"\u{1F1F8}\u{1F1EC}"},{code:"SK",dialCode:"+421",name:"Slovakia",flag:"\u{1F1F8}\u{1F1F0}"},{code:"SI",dialCode:"+386",name:"Slovenia",flag:"\u{1F1F8}\u{1F1EE}"},{code:"SB",dialCode:"+677",name:"Solomon Islands",flag:"\u{1F1F8}\u{1F1E7}"},{code:"SO",dialCode:"+252",name:"Somalia",flag:"\u{1F1F8}\u{1F1F4}"},{code:"ZA",dialCode:"+27",name:"South Africa",flag:"\u{1F1FF}\u{1F1E6}"},{code:"KR",dialCode:"+82",name:"South Korea",flag:"\u{1F1F0}\u{1F1F7}"},{code:"SS",dialCode:"+211",name:"South Sudan",flag:"\u{1F1F8}\u{1F1F8}"},{code:"ES",dialCode:"+34",name:"Spain",flag:"\u{1F1EA}\u{1F1F8}"},{code:"LK",dialCode:"+94",name:"Sri Lanka",flag:"\u{1F1F1}\u{1F1F0}"},{code:"SD",dialCode:"+249",name:"Sudan",flag:"\u{1F1F8}\u{1F1E9}"},{code:"SR",dialCode:"+597",name:"Suriname",flag:"\u{1F1F8}\u{1F1F7}"},{code:"SE",dialCode:"+46",name:"Sweden",flag:"\u{1F1F8}\u{1F1EA}"},{code:"CH",dialCode:"+41",name:"Switzerland",flag:"\u{1F1E8}\u{1F1ED}"},{code:"SY",dialCode:"+963",name:"Syria",flag:"\u{1F1F8}\u{1F1FE}"},{code:"TW",dialCode:"+886",name:"Taiwan",flag:"\u{1F1F9}\u{1F1FC}"},{code:"TJ",dialCode:"+992",name:"Tajikistan",flag:"\u{1F1F9}\u{1F1EF}"},{code:"TZ",dialCode:"+255",name:"Tanzania",flag:"\u{1F1F9}\u{1F1FF}"},{code:"TH",dialCode:"+66",name:"Thailand",flag:"\u{1F1F9}\u{1F1ED}"},{code:"TL",dialCode:"+670",name:"Timor-Leste",flag:"\u{1F1F9}\u{1F1F1}"},{code:"TG",dialCode:"+228",name:"Togo",flag:"\u{1F1F9}\u{1F1EC}"},{code:"TO",dialCode:"+676",name:"Tonga",flag:"\u{1F1F9}\u{1F1F4}"},{code:"TT",dialCode:"+1",name:"Trinidad and Tobago",flag:"\u{1F1F9}\u{1F1F9}"},{code:"TN",dialCode:"+216",name:"Tunisia",flag:"\u{1F1F9}\u{1F1F3}"},{code:"TR",dialCode:"+90",name:"Turkey",flag:"\u{1F1F9}\u{1F1F7}"},{code:"TM",dialCode:"+993",name:"Turkmenistan",flag:"\u{1F1F9}\u{1F1F2}"},{code:"TV",dialCode:"+688",name:"Tuvalu",flag:"\u{1F1F9}\u{1F1FB}"},{code:"UG",dialCode:"+256",name:"Uganda",flag:"\u{1F1FA}\u{1F1EC}"},{code:"UA",dialCode:"+380",name:"Ukraine",flag:"\u{1F1FA}\u{1F1E6}"},{code:"AE",dialCode:"+971",name:"United Arab Emirates",flag:"\u{1F1E6}\u{1F1EA}"},{code:"GB",dialCode:"+44",name:"United Kingdom",flag:"\u{1F1EC}\u{1F1E7}"},{code:"US",dialCode:"+1",name:"United States",flag:"\u{1F1FA}\u{1F1F8}"},{code:"UY",dialCode:"+598",name:"Uruguay",flag:"\u{1F1FA}\u{1F1FE}"},{code:"UZ",dialCode:"+998",name:"Uzbekistan",flag:"\u{1F1FA}\u{1F1FF}"},{code:"VU",dialCode:"+678",name:"Vanuatu",flag:"\u{1F1FB}\u{1F1FA}"},{code:"VA",dialCode:"+39",name:"Vatican City",flag:"\u{1F1FB}\u{1F1E6}"},{code:"VE",dialCode:"+58",name:"Venezuela",flag:"\u{1F1FB}\u{1F1EA}"},{code:"VN",dialCode:"+84",name:"Vietnam",flag:"\u{1F1FB}\u{1F1F3}"},{code:"YE",dialCode:"+967",name:"Yemen",flag:"\u{1F1FE}\u{1F1EA}"},{code:"ZM",dialCode:"+260",name:"Zambia",flag:"\u{1F1FF}\u{1F1F2}"},{code:"ZW",dialCode:"+263",name:"Zimbabwe",flag:"\u{1F1FF}\u{1F1FC}"}],ne=new Map(R.map(e=>[e.code,e])),oe={"America/New_York":"US","America/Chicago":"US","America/Denver":"US","America/Los_Angeles":"US","America/Anchorage":"US","Pacific/Honolulu":"US","America/Phoenix":"US","America/Indiana/Indianapolis":"US","America/Toronto":"CA","America/Vancouver":"CA","America/Edmonton":"CA","America/Winnipeg":"CA","America/Halifax":"CA","America/St_Johns":"CA","Europe/London":"GB","Europe/Dublin":"IE","Europe/Paris":"FR","Europe/Berlin":"DE","Europe/Madrid":"ES","Europe/Rome":"IT","Europe/Amsterdam":"NL","Europe/Brussels":"BE","Europe/Zurich":"CH","Europe/Vienna":"AT","Europe/Stockholm":"SE","Europe/Oslo":"NO","Europe/Copenhagen":"DK","Europe/Helsinki":"FI","Europe/Warsaw":"PL","Europe/Prague":"CZ","Europe/Bucharest":"RO","Europe/Budapest":"HU","Europe/Athens":"GR","Europe/Istanbul":"TR","Europe/Moscow":"RU","Europe/Kiev":"UA","Europe/Lisbon":"PT","Europe/Belgrade":"RS","Europe/Zagreb":"HR","Europe/Bratislava":"SK","Europe/Ljubljana":"SI","Europe/Tallinn":"EE","Europe/Riga":"LV","Europe/Vilnius":"LT","Asia/Tokyo":"JP","Asia/Seoul":"KR","Asia/Shanghai":"CN","Asia/Hong_Kong":"HK","Asia/Taipei":"TW","Asia/Singapore":"SG","Asia/Kolkata":"IN","Asia/Karachi":"PK","Asia/Dhaka":"BD","Asia/Bangkok":"TH","Asia/Jakarta":"ID","Asia/Manila":"PH","Asia/Kuala_Lumpur":"MY","Asia/Ho_Chi_Minh":"VN","Asia/Riyadh":"SA","Asia/Dubai":"AE","Asia/Tehran":"IR","Asia/Baghdad":"IQ","Asia/Beirut":"LB","Asia/Jerusalem":"IL","Asia/Amman":"JO","Asia/Almaty":"KZ","Asia/Tashkent":"UZ","Asia/Colombo":"LK","Asia/Kathmandu":"NP","Asia/Yangon":"MM","Australia/Sydney":"AU","Australia/Melbourne":"AU","Australia/Brisbane":"AU","Australia/Perth":"AU","Australia/Adelaide":"AU","Pacific/Auckland":"NZ","Pacific/Fiji":"FJ","Africa/Cairo":"EG","Africa/Lagos":"NG","Africa/Nairobi":"KE","Africa/Johannesburg":"ZA","Africa/Casablanca":"MA","Africa/Accra":"GH","Africa/Addis_Ababa":"ET","Africa/Dar_es_Salaam":"TZ","Africa/Kampala":"UG","America/Mexico_City":"MX","America/Bogota":"CO","America/Lima":"PE","America/Santiago":"CL","America/Buenos_Aires":"AR","America/Sao_Paulo":"BR","America/Caracas":"VE","America/Guatemala":"GT","America/Havana":"CU","America/Panama":"PA","America/Jamaica":"JM"};function $(){try{let e=Intl.DateTimeFormat().resolvedOptions().timeZone;return oe[e]??"US"}catch{return"US"}}function H(e){if(!e.startsWith("+"))return e;let t=e.slice(1);if(t.startsWith("1")&&t.length===11){let a=t.slice(1,4),n=t.slice(4,7),o=t.slice(7);return`+1 (${a}) ${n}-${o}`}for(let a=4;a>=1;a--){let n="+"+t.slice(0,a),o=R.find(i=>i.dialCode===n);if(o){let i=t.slice(a);return`${o.dialCode} ${i}`}}return e}function F(e,t){let a=e.replace(/\D/g,""),n=ne.get(t);if(!n)return"+"+a;let o=n.dialCode.slice(1);return a.startsWith(o)?"+"+a:n.dialCode+a}function V(e){return/^\+[1-9]\d{6,14}$/.test(e)}function j(e){return/^[^\s@]+@[^\s@]+\.[^\s@]+$/.test(e)}async function y(e,t,a){let o={Authorization:`Bearer ${c().token}`};a!==void 0&&(o["Content-Type"]="application/json");let i=await fetch(w(e),{method:t,headers:o,...a!==void 0&&{body:JSON.stringify(a)}});if(!i.ok){let r=`Auth request failed: ${i.status} ${i.statusText}`,d="auth_error";try{let s=await i.json();s.error&&(r=s.error),s.code&&(d=s.code)}catch{}throw new l(r,d,i.status)}return await i.json()}var x="__ms_remy_state",_="ms_popup",Z="ms:remy:callback",W=!1,b=de();function de(){if(typeof window>"u")return!1;try{let e=new URL(window.location.href).searchParams;return e.has("code")&&e.get(_)!=="1"}catch{return!1}}function se(){let e=globalThis.crypto;if(e&&typeof e.randomUUID=="function")return e.randomUUID();let t=new Uint8Array(16);return e?.getRandomValues?.(t),Array.from(t,a=>a.toString(16).padStart(2,"0")).join("")}function le(e){e.searchParams.delete("code"),e.searchParams.delete("state");try{window.history.replaceState(window.history.state,"",e.toString())}catch{}}var M=new Set;function E(e){G({token:e.token,user:e.user,methods:e.methods,visitorId:e.visitorId}),M.forEach(t=>t(e.user))}function v(e){if(!e.user)throw new l("Verification succeeded but no user was returned","auth_error");return e.user}function J(e){let t=c();t.user&&(Object.assign(t.user,e),M.forEach(a=>a(t.user)))}function I(){try{return c().user}catch{return null}}function Y(){let e=I();M.forEach(t=>t(e))}function z(){b||(b=!0,Y())}function B(){b&&(b=!1,Y())}function ce(){try{return window.top!==window.self}catch{return!0}}var ge=520,ue=600;function me(e,t){let a=window.screenX,n=window.screenY,o=window.outerWidth||window.innerWidth||window.screen.width,i=window.outerHeight||window.innerHeight||window.screen.height,r=Math.min(e,o),d=Math.min(t,i),s=Math.max(0,Math.round(a+(o-r)/2)),C=Math.max(0,Math.round(n+(i-d)/2));return`popup=yes,width=${Math.round(r)},height=${Math.round(d)},left=${s},top=${C}`}function fe(e,t){let a=new URL(e,window.location.href);a.searchParams.set(_,"1");let n=`${w("/_/auth/remy/start")}?${new URLSearchParams({redirect_uri:a.toString(),state:t}).toString()}`,o=window.open(n,"ms-remy-signin",me(ge,ue));return o?(z(),new Promise((i,r)=>{let d=window.location.origin,s=!1,C=!1,f=A=>{if(!s){s=!0,window.removeEventListener("message",h),clearInterval(m),clearTimeout(S),B();try{o.closed||o.close()}catch{}A()}},h=A=>{if(s||C||A.origin!==d||A.source!==o)return;let p=A.data;if(!(!p||p.type!==Z||p.state!==t)){if(C=!0,!p.code){f(()=>r(new l("Sign-in returned no code.","auth_error")));return}y("/_/auth/remy/exchange","POST",{code:p.code}).then(u=>{b=!1,E(u),f(()=>i(v(u)))}).catch(u=>f(()=>r(u)))}};window.addEventListener("message",h);let m=setInterval(()=>{o.closed&&!C&&f(()=>i(null))},400),S=setTimeout(()=>f(()=>r(new l("Sign-in timed out.","signin_timeout"))),300*1e3)})):Promise.reject(new l("The sign-in popup was blocked. Allow popups for this site and try again.","popup_blocked"))}function O(){if(typeof window>"u")return!1;let e;try{e=new URL(window.location.href).searchParams}catch{return!1}if(e.get(_)!=="1")return!1;let t=e.get("code");if(!t)return!1;if(W)return!0;let a=window.opener;if(!a||a===window)return!1;try{a.postMessage({type:Z,code:t,state:e.get("state")??void 0},window.location.origin)}catch{return!1}W=!0;try{setTimeout(()=>window.close(),0)}catch{}return!0}var pe={get currentUser(){return c().user},getCurrentUser(){return c().user},isAuthenticated(){return c().user!==null},get authStatus(){return b?"authenticating":I()?"authenticated":"unauthenticated"},get currentVisitorId(){return c().visitorId??null},getCurrentVisitorId(){return c().visitorId??null},sendEmailCode(e){return y("/_/auth/email/send","POST",{email:e})},async verifyEmailCode(e,t){let a=await y("/_/auth/email/verify","POST",{verificationId:e,code:t});return E(a),v(a)},sendSmsCode(e){return y("/_/auth/sms/send","POST",{phone:e})},async verifySmsCode(e,t){let a=await y("/_/auth/sms/verify","POST",{verificationId:e,code:t});return E(a),v(a)},signInWithRemy(e){let t=e?.mode??"auto",a=t==="popup"||t==="auto"&&ce(),n=e?.redirectUri??window.location.href,o=e?.state??se();if(a)return fe(n,o);try{sessionStorage.setItem(x,o)}catch{}let i=new URLSearchParams({redirect_uri:n,state:o});return window.location.assign(`${w("/_/auth/remy/start")}?${i.toString()}`),new Promise(()=>{})},async handleRemyRedirect(){if(typeof window>"u")return null;let e=new URL(window.location.href),t=e.searchParams.get("code");if(!t)return null;if(e.searchParams.get(_)==="1")return O(),null;let a=e.searchParams.get("state");le(e);let n=null;try{n=sessionStorage.getItem(x),sessionStorage.removeItem(x)}catch{}if(z(),a!==null&&a!==n)throw B(),new l("Sign-in state mismatch \u2014 possible CSRF or a stale redirect. Please try again.","invalid_state");try{let o=await y("/_/auth/remy/exchange","POST",{code:t});return b=!1,E(o),v(o)}catch(o){throw B(),o}},async requestEmailChange(e){await y("/_/auth/email/change","POST",{newEmail:e})},async confirmEmailChange(e,t){let a=await y("/_/auth/email/change/confirm","POST",{newEmail:e,code:t});return E(a),v(a)},async requestPhoneChange(e){await y("/_/auth/phone/change","POST",{newPhone:e})},async confirmPhoneChange(e,t){let a=await y("/_/auth/phone/change/confirm","POST",{newPhone:e,code:t});return E(a),v(a)},async logout(){let e=await y("/_/auth/logout","POST",{});E(e)},async createApiKey(){let e=await y("/_/auth/api-key/create","POST",{});return J({apiKey:e.apiKey}),{key:e.key}},async revokeApiKey(){await y("/_/auth/api-key/revoke","POST",{}),J({apiKey:null})},onAuthStateChanged(e){return M.add(e),e(I()),()=>{M.delete(e)}},phone:{countries:R,detectCountry:$,format:H,toE164:F,isValid:V},email:{isValid:j}};typeof window<"u"&&!O()&&globalThis.__MINDSTUDIO__&&setTimeout(()=>{try{c()}catch{}},0);export{l as MindStudioInterfaceError,Q as analytics,pe as auth,ae as createAgentChatClient,X as createClient,te as platform};
|
|
4
4
|
//# sourceMappingURL=index.js.map
|