@hainiva/agent-sdk 0.0.0-stage → 0.3.0

This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
Files changed (119) hide show
  1. package/CHANGELOG.md +73 -0
  2. package/LICENSE +21 -0
  3. package/README.md +278 -2
  4. package/SECURITY.md +33 -0
  5. package/dist/cjs/agent.cjs +320 -0
  6. package/dist/cjs/agent.d.cts +239 -0
  7. package/dist/cjs/calls.cjs +277 -0
  8. package/dist/cjs/calls.d.cts +232 -0
  9. package/dist/cjs/contract.cjs +14 -0
  10. package/dist/cjs/contract.d.cts +225 -0
  11. package/dist/cjs/embed.cjs +253 -0
  12. package/dist/cjs/embed.d.cts +187 -0
  13. package/dist/cjs/emitter.cjs +50 -0
  14. package/dist/cjs/emitter.d.cts +22 -0
  15. package/dist/cjs/errors.cjs +28 -0
  16. package/dist/cjs/errors.d.cts +15 -0
  17. package/dist/cjs/events.cjs +97 -0
  18. package/dist/cjs/events.d.cts +97 -0
  19. package/dist/cjs/index.cjs +72 -0
  20. package/dist/cjs/index.d.cts +28 -0
  21. package/dist/cjs/livekit.cjs +56 -0
  22. package/dist/cjs/livekit.d.cts +35 -0
  23. package/dist/cjs/log.cjs +15 -0
  24. package/dist/cjs/log.d.cts +5 -0
  25. package/dist/cjs/react-native.cjs +32 -0
  26. package/dist/cjs/react-native.d.cts +39 -0
  27. package/dist/cjs/reactNativeDesk.cjs +107 -0
  28. package/dist/cjs/reactNativeDesk.d.cts +53 -0
  29. package/dist/cjs/redact.cjs +71 -0
  30. package/dist/cjs/redact.d.cts +21 -0
  31. package/dist/cjs/rest.cjs +286 -0
  32. package/dist/cjs/rest.d.cts +172 -0
  33. package/dist/cjs/session.cjs +159 -0
  34. package/dist/cjs/session.d.cts +101 -0
  35. package/dist/cjs/singleFlight.cjs +49 -0
  36. package/dist/cjs/singleFlight.d.cts +32 -0
  37. package/dist/cjs/url.cjs +39 -0
  38. package/dist/cjs/url.d.cts +13 -0
  39. package/dist/cjs/web.cjs +28 -0
  40. package/dist/cjs/web.d.cts +23 -0
  41. package/dist/cjs/ws.cjs +246 -0
  42. package/dist/cjs/ws.d.cts +134 -0
  43. package/dist/esm/agent.d.ts +240 -0
  44. package/dist/esm/agent.d.ts.map +1 -0
  45. package/dist/esm/agent.js +317 -0
  46. package/dist/esm/agent.js.map +1 -0
  47. package/dist/esm/calls.d.ts +233 -0
  48. package/dist/esm/calls.d.ts.map +1 -0
  49. package/dist/esm/calls.js +271 -0
  50. package/dist/esm/calls.js.map +1 -0
  51. package/dist/esm/contract.d.ts +226 -0
  52. package/dist/esm/contract.d.ts.map +1 -0
  53. package/dist/esm/contract.js +12 -0
  54. package/dist/esm/contract.js.map +1 -0
  55. package/dist/esm/embed.d.ts +188 -0
  56. package/dist/esm/embed.d.ts.map +1 -0
  57. package/dist/esm/embed.js +247 -0
  58. package/dist/esm/embed.js.map +1 -0
  59. package/dist/esm/emitter.d.ts +23 -0
  60. package/dist/esm/emitter.d.ts.map +1 -0
  61. package/dist/esm/emitter.js +47 -0
  62. package/dist/esm/emitter.js.map +1 -0
  63. package/dist/esm/errors.d.ts +16 -0
  64. package/dist/esm/errors.d.ts.map +1 -0
  65. package/dist/esm/errors.js +25 -0
  66. package/dist/esm/errors.js.map +1 -0
  67. package/dist/esm/events.d.ts +98 -0
  68. package/dist/esm/events.d.ts.map +1 -0
  69. package/dist/esm/events.js +90 -0
  70. package/dist/esm/events.js.map +1 -0
  71. package/dist/esm/index.d.ts +29 -0
  72. package/dist/esm/index.d.ts.map +1 -0
  73. package/dist/esm/index.js +29 -0
  74. package/dist/esm/index.js.map +1 -0
  75. package/dist/esm/livekit.d.ts +36 -0
  76. package/dist/esm/livekit.d.ts.map +1 -0
  77. package/dist/esm/livekit.js +54 -0
  78. package/dist/esm/livekit.js.map +1 -0
  79. package/dist/esm/log.d.ts +6 -0
  80. package/dist/esm/log.d.ts.map +1 -0
  81. package/dist/esm/log.js +13 -0
  82. package/dist/esm/log.js.map +1 -0
  83. package/dist/esm/react-native.d.ts +40 -0
  84. package/dist/esm/react-native.d.ts.map +1 -0
  85. package/dist/esm/react-native.js +26 -0
  86. package/dist/esm/react-native.js.map +1 -0
  87. package/dist/esm/reactNativeDesk.d.ts +54 -0
  88. package/dist/esm/reactNativeDesk.d.ts.map +1 -0
  89. package/dist/esm/reactNativeDesk.js +103 -0
  90. package/dist/esm/reactNativeDesk.js.map +1 -0
  91. package/dist/esm/redact.d.ts +22 -0
  92. package/dist/esm/redact.d.ts.map +1 -0
  93. package/dist/esm/redact.js +66 -0
  94. package/dist/esm/redact.js.map +1 -0
  95. package/dist/esm/rest.d.ts +173 -0
  96. package/dist/esm/rest.d.ts.map +1 -0
  97. package/dist/esm/rest.js +281 -0
  98. package/dist/esm/rest.js.map +1 -0
  99. package/dist/esm/session.d.ts +102 -0
  100. package/dist/esm/session.d.ts.map +1 -0
  101. package/dist/esm/session.js +155 -0
  102. package/dist/esm/session.js.map +1 -0
  103. package/dist/esm/singleFlight.d.ts +33 -0
  104. package/dist/esm/singleFlight.d.ts.map +1 -0
  105. package/dist/esm/singleFlight.js +46 -0
  106. package/dist/esm/singleFlight.js.map +1 -0
  107. package/dist/esm/url.d.ts +14 -0
  108. package/dist/esm/url.d.ts.map +1 -0
  109. package/dist/esm/url.js +37 -0
  110. package/dist/esm/url.js.map +1 -0
  111. package/dist/esm/web.d.ts +24 -0
  112. package/dist/esm/web.d.ts.map +1 -0
  113. package/dist/esm/web.js +23 -0
  114. package/dist/esm/web.js.map +1 -0
  115. package/dist/esm/ws.d.ts +135 -0
  116. package/dist/esm/ws.d.ts.map +1 -0
  117. package/dist/esm/ws.js +242 -0
  118. package/dist/esm/ws.js.map +1 -0
  119. package/package.json +117 -4
@@ -0,0 +1,188 @@
1
+ /**
2
+ * @hainiva/agent-sdk/embed — the HAINIVA desk inside your web product.
3
+ *
4
+ * import { HainivaAgent } from "@hainiva/agent-sdk";
5
+ * import { mountDesk } from "@hainiva/agent-sdk/embed";
6
+ *
7
+ * const agent = new HainivaAgent({ baseUrl: "https://api.hainiva.com", tenantId, getAssertion });
8
+ * await agent.connect();
9
+ * const desk = mountDesk(document.getElementById("desk")!, {
10
+ * agent, appId: "<your agent app id>", baseUrl: "https://app.hainiva.com",
11
+ * onEnded: (reason) => showSignedOut(reason),
12
+ * });
13
+ * // later: desk.setTheme("dark"); desk.destroy();
14
+ *
15
+ * Your staff member is signed in with YOUR agent session: the SDK exchanges it
16
+ * for a 15-minute desk token (POST /agent/v1/desk-session) and hands that to
17
+ * the desk over postMessage — never in the URL, never stored. The desk asks
18
+ * for a fresh one before it expires; when the session ends (signed out,
19
+ * suspended, app paused) the desk shows "ended" and `onEnded` fires.
20
+ *
21
+ * Your page's origin must be in the agent app's `allowedOrigins`: that list is
22
+ * also the desk's CSP frame-ancestors, so any other site gets a blank frame.
23
+ *
24
+ * Security, both directions:
25
+ * - only messages whose `event.source` is THIS iframe's window and whose
26
+ * `event.origin` is the HAINIVA desk origin are read, and only in the exact
27
+ * message shapes below;
28
+ * - everything we send goes to the desk origin only (never "*").
29
+ */
30
+ import type { AgentDeskSessionDto } from "./contract.js";
31
+ export type DeskEndReason = "not_embedded" | "no_host" | "expired" | "revoked" | "host_ended" | "misconfigured"
32
+ /** The desk never answered (wrong origin: the CSP blocked the frame; network). */
33
+ | "load_failed"
34
+ /** Your agent session could not provide a desk token. */
35
+ | "session_ended";
36
+ /** From the desk. */
37
+ export type DeskToHost = {
38
+ v: 1;
39
+ type: "hainiva:ready";
40
+ appId: string;
41
+ } | {
42
+ v: 1;
43
+ type: "hainiva:token-request";
44
+ reason: "expiring" | "unauthorized";
45
+ } | {
46
+ v: 1;
47
+ type: "hainiva:ended";
48
+ reason: Exclude<DeskEndReason, "load_failed" | "session_ended">;
49
+ } | {
50
+ v: 1;
51
+ type: "hainiva:dial";
52
+ number: string;
53
+ contactId?: string;
54
+ } | {
55
+ v: 1;
56
+ type: "hainiva:dialer";
57
+ number?: string;
58
+ contactId?: string;
59
+ } | {
60
+ v: 1;
61
+ type: "hainiva:open-url";
62
+ url: string;
63
+ } | {
64
+ v: 1;
65
+ type: "hainiva:media-error";
66
+ name: string;
67
+ };
68
+ /** To the desk. */
69
+ export type HostToDesk = {
70
+ v: 1;
71
+ type: "hainiva:token";
72
+ token: string;
73
+ expiresAt: string;
74
+ } | {
75
+ v: 1;
76
+ type: "hainiva:theme";
77
+ mode: "light" | "dark";
78
+ } | {
79
+ v: 1;
80
+ type: "hainiva:locale";
81
+ locale: "vi" | "en";
82
+ } | {
83
+ v: 1;
84
+ type: "hainiva:end";
85
+ };
86
+ /** Exactly one of the desk's messages, or null. */
87
+ export declare function parseDeskMessage(data: unknown): DeskToHost | null;
88
+ /** Where the desk token comes from: `HainivaAgent` (its `desk.session()`), or anything shaped like it. */
89
+ export interface DeskTokenSource {
90
+ desk: {
91
+ session(): Promise<AgentDeskSessionDto>;
92
+ };
93
+ }
94
+ export interface DeskCallbacks {
95
+ /** The desk wants to place a call (React Native: your native call; web: the desk calls itself and never sends this). */
96
+ onDial?: (number: string, contactId?: string) => void;
97
+ /** Open your dialer, optionally pre-filled. */
98
+ onDialer?: (prefill: {
99
+ number?: string;
100
+ contactId?: string;
101
+ }) => void;
102
+ /** The desk's session is over. Show your own signed-out state; mount again after a new sign-in. */
103
+ onEnded?: (reason: DeskEndReason) => void;
104
+ /** A link the desk cannot open itself (React Native). Default: ignored. */
105
+ onOpenUrl?: (url: string) => void;
106
+ /** The microphone/camera was refused (web): check your iframe's `allow` and the browser's permission. */
107
+ onMediaError?: (name: string) => void;
108
+ }
109
+ /**
110
+ * The host side of the desk protocol, transport-agnostic: `mountDesk` (iframe)
111
+ * and `<HainivaDesk/>` (React Native WebView) both drive one.
112
+ * @internal exported for the React Native entry and tests.
113
+ */
114
+ export declare class DeskHost {
115
+ private readonly appId;
116
+ private readonly source;
117
+ private readonly send;
118
+ private readonly cb;
119
+ private ended;
120
+ private ready;
121
+ private inflight;
122
+ constructor(appId: string, source: DeskTokenSource, send: (m: HostToDesk) => void, cb: DeskCallbacks);
123
+ get isReady(): boolean;
124
+ get isEnded(): boolean;
125
+ /** A raw message from the desk (already origin/source-checked by the transport). */
126
+ receive(raw: unknown): void;
127
+ /** One desk-session request at a time; the token goes to the desk only. */
128
+ supplyToken(): Promise<void>;
129
+ setTheme(mode: "light" | "dark"): void;
130
+ setLocale(locale: "vi" | "en"): void;
131
+ finish(reason: DeskEndReason, tellDesk: boolean): void;
132
+ }
133
+ /** The desk page for an app. The URL carries the app id ONLY. */
134
+ export declare function deskUrl(baseUrl: string, appId: string, opts?: {
135
+ allowInsecureLocalhost?: boolean;
136
+ }): URL;
137
+ /**
138
+ * The iframe's sandbox — every flag the desk needs and nothing more:
139
+ * allow-scripts the desk is an application;
140
+ * allow-same-origin the desk keeps ITS OWN origin (app.hainiva.com):
141
+ * its same-origin API calls, its session storage
142
+ * and the gateway's Origin check depend on it. It
143
+ * gives the desk no access to your page — that is
144
+ * a different origin;
145
+ * allow-forms the composer and every dialog submit forms;
146
+ * allow-popups links, recordings and help open in a new tab…
147
+ * allow-popups-to-escape-sandbox …as normal pages, not sandboxed copies;
148
+ * allow-downloads call recordings, attachments, exports;
149
+ * allow-modals the desk confirms destructive actions (confirm()).
150
+ * Deliberately NOT: allow-top-navigation(-by-user-activation) — the desk can
151
+ * never navigate your page; allow-pointer-lock, allow-presentation,
152
+ * allow-orientation-lock, allow-storage-access-by-user-activation.
153
+ */
154
+ export declare const DESK_SANDBOX = "allow-scripts allow-same-origin allow-forms allow-popups allow-popups-to-escape-sandbox allow-downloads allow-modals";
155
+ /** Calls in the iframe are WebRTC: the microphone (and camera for video) must be delegated. */
156
+ export declare const DESK_ALLOW = "microphone; camera; autoplay; clipboard-write";
157
+ export interface MountDeskOptions extends DeskCallbacks {
158
+ /** A connected HainivaAgent (or anything with `desk.session()`). */
159
+ agent: DeskTokenSource;
160
+ /** Your agent app id (its allowedOrigins must list this page's origin). */
161
+ appId: string;
162
+ /** The HAINIVA desk, e.g. https://app.hainiva.com. */
163
+ baseUrl: string;
164
+ theme?: "light" | "dark";
165
+ locale?: "vi" | "en";
166
+ /** The iframe's accessible title. Default "HAINIVA". */
167
+ title?: string;
168
+ /** No `hainiva:ready` within this long = onEnded("load_failed"). Default 20 s. */
169
+ loadTimeoutMs?: number;
170
+ /** Local development only (http://localhost desk). */
171
+ allowInsecureLocalhost?: boolean;
172
+ }
173
+ export interface MountedDesk {
174
+ /** Remove the desk (it is told to drop its token first). */
175
+ destroy(): void;
176
+ setTheme(mode: "light" | "dark"): void;
177
+ setLocale(locale: "vi" | "en"): void;
178
+ /** The iframe, for sizing. */
179
+ readonly iframe: HTMLIFrameElement;
180
+ }
181
+ interface ContainerLike {
182
+ appendChild(n: unknown): unknown;
183
+ ownerDocument?: Document | null;
184
+ }
185
+ /** Show the HAINIVA desk in `container`, signed in as your agent session's staff member. */
186
+ export declare function mountDesk(container: ContainerLike, o: MountDeskOptions): MountedDesk;
187
+ export {};
188
+ //# sourceMappingURL=embed.d.ts.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"embed.d.ts","sourceRoot":"","sources":["../../src/embed.ts"],"names":[],"mappings":"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"}
@@ -0,0 +1,247 @@
1
+ import { HainivaAgentError } from "./errors.js";
2
+ import { assertSafeUrl } from "./url.js";
3
+ const UUID = /^[0-9a-f]{8}-[0-9a-f]{4}-[0-9a-f]{4}-[0-9a-f]{4}-[0-9a-f]{12}$/i;
4
+ const END_REASONS = new Set(["not_embedded", "no_host", "expired", "revoked", "host_ended", "misconfigured"]);
5
+ const PHONE = /^[0-9+*#() .-]{1,40}$/;
6
+ function keysAre(o, required, optional = []) {
7
+ const k = Object.keys(o);
8
+ return required.every((r) => k.includes(r)) && k.every((x) => required.includes(x) || optional.includes(x));
9
+ }
10
+ const optId = (v) => v === undefined || (typeof v === "string" && UUID.test(v));
11
+ /** Exactly one of the desk's messages, or null. */
12
+ export function parseDeskMessage(data) {
13
+ let d = data;
14
+ if (typeof d === "string") {
15
+ if (d.length > 8192)
16
+ return null;
17
+ try {
18
+ d = JSON.parse(d);
19
+ }
20
+ catch {
21
+ return null;
22
+ }
23
+ }
24
+ if (!d || typeof d !== "object" || Array.isArray(d))
25
+ return null;
26
+ const o = d;
27
+ if (o["v"] !== 1)
28
+ return null;
29
+ switch (o["type"]) {
30
+ case "hainiva:ready":
31
+ return keysAre(o, ["v", "type", "appId"]) && typeof o["appId"] === "string" && UUID.test(o["appId"]) ? { v: 1, type: "hainiva:ready", appId: o["appId"] } : null;
32
+ case "hainiva:token-request":
33
+ return keysAre(o, ["v", "type", "reason"]) && (o["reason"] === "expiring" || o["reason"] === "unauthorized") ? { v: 1, type: "hainiva:token-request", reason: o["reason"] } : null;
34
+ case "hainiva:ended":
35
+ return keysAre(o, ["v", "type", "reason"]) && typeof o["reason"] === "string" && END_REASONS.has(o["reason"])
36
+ ? { v: 1, type: "hainiva:ended", reason: o["reason"] } : null;
37
+ case "hainiva:dial":
38
+ if (!keysAre(o, ["v", "type", "number"], ["contactId"]) || typeof o["number"] !== "string" || !PHONE.test(o["number"]) || !optId(o["contactId"]))
39
+ return null;
40
+ return { v: 1, type: "hainiva:dial", number: o["number"], ...(o["contactId"] ? { contactId: o["contactId"] } : {}) };
41
+ case "hainiva:dialer":
42
+ if (!keysAre(o, ["v", "type"], ["number", "contactId"]) || !optId(o["contactId"]))
43
+ return null;
44
+ if (o["number"] !== undefined && (typeof o["number"] !== "string" || !PHONE.test(o["number"])))
45
+ return null;
46
+ return { v: 1, type: "hainiva:dialer", ...(o["number"] ? { number: o["number"] } : {}), ...(o["contactId"] ? { contactId: o["contactId"] } : {}) };
47
+ case "hainiva:open-url": {
48
+ if (!keysAre(o, ["v", "type", "url"]) || typeof o["url"] !== "string" || o["url"].length > 2048)
49
+ return null;
50
+ let u;
51
+ try {
52
+ u = new URL(o["url"]);
53
+ }
54
+ catch {
55
+ return null;
56
+ }
57
+ return ["https:", "http:", "mailto:", "tel:"].includes(u.protocol) ? { v: 1, type: "hainiva:open-url", url: u.href } : null;
58
+ }
59
+ case "hainiva:media-error":
60
+ return keysAre(o, ["v", "type", "name"]) && typeof o["name"] === "string" && o["name"].length <= 60 ? { v: 1, type: "hainiva:media-error", name: o["name"] } : null;
61
+ default:
62
+ return null;
63
+ }
64
+ }
65
+ /**
66
+ * The host side of the desk protocol, transport-agnostic: `mountDesk` (iframe)
67
+ * and `<HainivaDesk/>` (React Native WebView) both drive one.
68
+ * @internal exported for the React Native entry and tests.
69
+ */
70
+ export class DeskHost {
71
+ constructor(appId, source, send, cb) {
72
+ this.appId = appId;
73
+ this.source = source;
74
+ this.send = send;
75
+ this.cb = cb;
76
+ this.ended = false;
77
+ this.ready = false;
78
+ this.inflight = null;
79
+ }
80
+ get isReady() { return this.ready; }
81
+ get isEnded() { return this.ended; }
82
+ /** A raw message from the desk (already origin/source-checked by the transport). */
83
+ receive(raw) {
84
+ if (this.ended)
85
+ return;
86
+ const m = parseDeskMessage(raw);
87
+ if (!m)
88
+ return;
89
+ switch (m.type) {
90
+ case "hainiva:ready":
91
+ if (m.appId.toLowerCase() !== this.appId.toLowerCase())
92
+ return;
93
+ this.ready = true;
94
+ void this.supplyToken();
95
+ return;
96
+ case "hainiva:token-request":
97
+ void this.supplyToken();
98
+ return;
99
+ case "hainiva:ended":
100
+ this.finish(m.reason, false);
101
+ return;
102
+ case "hainiva:dial":
103
+ this.cb.onDial?.(m.number, m.contactId);
104
+ return;
105
+ case "hainiva:dialer":
106
+ this.cb.onDialer?.({ ...(m.number ? { number: m.number } : {}), ...(m.contactId ? { contactId: m.contactId } : {}) });
107
+ return;
108
+ case "hainiva:open-url":
109
+ this.cb.onOpenUrl?.(m.url);
110
+ return;
111
+ case "hainiva:media-error":
112
+ this.cb.onMediaError?.(m.name);
113
+ return;
114
+ }
115
+ }
116
+ /** One desk-session request at a time; the token goes to the desk only. */
117
+ supplyToken() {
118
+ if (this.ended)
119
+ return Promise.resolve();
120
+ this.inflight ?? (this.inflight = (async () => {
121
+ try {
122
+ const d = await this.source.desk.session();
123
+ if (!this.ended)
124
+ this.send({ v: 1, type: "hainiva:token", token: d.token, expiresAt: d.expiresAt });
125
+ }
126
+ catch (e) {
127
+ // A final refusal of the agent session: the desk ends with it. A
128
+ // transient failure: the desk asks again (or ends on its own timeout).
129
+ const final = e instanceof HainivaAgentError && (e.status === 401 || e.status === 403);
130
+ if (final)
131
+ this.finish("session_ended", true);
132
+ }
133
+ finally {
134
+ this.inflight = null;
135
+ }
136
+ })());
137
+ return this.inflight;
138
+ }
139
+ setTheme(mode) { if (mode === "light" || mode === "dark")
140
+ this.send({ v: 1, type: "hainiva:theme", mode }); }
141
+ setLocale(locale) { if (locale === "vi" || locale === "en")
142
+ this.send({ v: 1, type: "hainiva:locale", locale }); }
143
+ finish(reason, tellDesk) {
144
+ if (this.ended)
145
+ return;
146
+ if (tellDesk) {
147
+ try {
148
+ this.send({ v: 1, type: "hainiva:end" });
149
+ }
150
+ catch { /* gone */ }
151
+ }
152
+ this.ended = true;
153
+ this.cb.onEnded?.(reason);
154
+ }
155
+ }
156
+ /** The desk page for an app. The URL carries the app id ONLY. */
157
+ export function deskUrl(baseUrl, appId, opts = {}) {
158
+ if (!UUID.test(appId))
159
+ throw new HainivaAgentError(0, "invalid_id", { field: "appId" });
160
+ const base = assertSafeUrl(baseUrl, { kind: "http", ...(opts.allowInsecureLocalhost ? { allowInsecureLocalhost: true } : {}) });
161
+ const u = new URL("/embed", base.origin);
162
+ u.searchParams.set("app", appId.toLowerCase());
163
+ return u;
164
+ }
165
+ // ── Web: the iframe ──────────────────────────────────────────────────────────
166
+ /**
167
+ * The iframe's sandbox — every flag the desk needs and nothing more:
168
+ * allow-scripts the desk is an application;
169
+ * allow-same-origin the desk keeps ITS OWN origin (app.hainiva.com):
170
+ * its same-origin API calls, its session storage
171
+ * and the gateway's Origin check depend on it. It
172
+ * gives the desk no access to your page — that is
173
+ * a different origin;
174
+ * allow-forms the composer and every dialog submit forms;
175
+ * allow-popups links, recordings and help open in a new tab…
176
+ * allow-popups-to-escape-sandbox …as normal pages, not sandboxed copies;
177
+ * allow-downloads call recordings, attachments, exports;
178
+ * allow-modals the desk confirms destructive actions (confirm()).
179
+ * Deliberately NOT: allow-top-navigation(-by-user-activation) — the desk can
180
+ * never navigate your page; allow-pointer-lock, allow-presentation,
181
+ * allow-orientation-lock, allow-storage-access-by-user-activation.
182
+ */
183
+ export const DESK_SANDBOX = "allow-scripts allow-same-origin allow-forms allow-popups allow-popups-to-escape-sandbox allow-downloads allow-modals";
184
+ /** Calls in the iframe are WebRTC: the microphone (and camera for video) must be delegated. */
185
+ export const DESK_ALLOW = "microphone; camera; autoplay; clipboard-write";
186
+ /** Show the HAINIVA desk in `container`, signed in as your agent session's staff member. */
187
+ export function mountDesk(container, o) {
188
+ if (!container || typeof container.appendChild !== "function")
189
+ throw new HainivaAgentError(0, "invalid_container", {});
190
+ if (!o?.agent?.desk || typeof o.agent.desk.session !== "function")
191
+ throw new HainivaAgentError(0, "invalid_agent", {});
192
+ const url = deskUrl(o.baseUrl, o.appId, o.allowInsecureLocalhost ? { allowInsecureLocalhost: true } : {});
193
+ const deskOrigin = url.origin;
194
+ const doc = container.ownerDocument ?? globalThis.document;
195
+ const win = (doc?.defaultView ?? globalThis);
196
+ if (!doc)
197
+ throw new HainivaAgentError(0, "no_document", {});
198
+ if (win.location?.origin === deskOrigin)
199
+ throw new HainivaAgentError(0, "same_origin_host", { origin: deskOrigin });
200
+ const iframe = doc.createElement("iframe");
201
+ iframe.setAttribute("sandbox", DESK_SANDBOX);
202
+ iframe.setAttribute("allow", DESK_ALLOW);
203
+ iframe.setAttribute("title", o.title ?? "HAINIVA");
204
+ iframe.setAttribute("referrerpolicy", "origin");
205
+ iframe.style.border = "0";
206
+ iframe.style.width = "100%";
207
+ iframe.style.height = "100%";
208
+ const host = new DeskHost(o.appId, o.agent, (m) => { iframe.contentWindow?.postMessage(m, deskOrigin); }, {
209
+ ...o,
210
+ onEnded: (r) => { clearTimeout(loadTimer); o.onEnded?.(r); },
211
+ });
212
+ const onMessage = (e) => {
213
+ if (e.source !== iframe.contentWindow || e.origin !== deskOrigin)
214
+ return;
215
+ const wasReady = host.isReady;
216
+ host.receive(e.data);
217
+ if (!wasReady && host.isReady) {
218
+ clearTimeout(loadTimer);
219
+ if (o.theme)
220
+ host.setTheme(o.theme);
221
+ if (o.locale)
222
+ host.setLocale(o.locale);
223
+ }
224
+ };
225
+ win.addEventListener("message", onMessage);
226
+ const loadTimer = setTimeout(() => { if (!host.isReady)
227
+ host.finish("load_failed", false); }, o.loadTimeoutMs ?? 20000);
228
+ iframe.setAttribute("src", url.href);
229
+ container.appendChild(iframe);
230
+ return {
231
+ iframe,
232
+ setTheme: (m) => host.setTheme(m),
233
+ setLocale: (l) => host.setLocale(l),
234
+ destroy: () => {
235
+ clearTimeout(loadTimer);
236
+ if (!host.isEnded) {
237
+ try {
238
+ iframe.contentWindow?.postMessage({ v: 1, type: "hainiva:end" }, deskOrigin);
239
+ }
240
+ catch { /* gone */ }
241
+ }
242
+ win.removeEventListener("message", onMessage);
243
+ iframe.remove();
244
+ },
245
+ };
246
+ }
247
+ //# sourceMappingURL=embed.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"embed.js","sourceRoot":"","sources":["../../src/embed.ts"],"names":[],"mappings":"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"}
@@ -0,0 +1,23 @@
1
+ /**
2
+ * A small typed event emitter. `Events` maps each event name to its payload:
3
+ *
4
+ * const e = new TypedEmitter<{ state: ConnectionState; ready: undefined }>();
5
+ * const off = e.on("state", (s) => …); e.emit("state", "open"); e.emit("ready", undefined);
6
+ *
7
+ * A listener that throws does not stop the others; the error goes to `onError`.
8
+ */
9
+ export declare class TypedEmitter<Events extends {
10
+ [K in keyof Events]: unknown;
11
+ }> {
12
+ private readonly onError?;
13
+ private readonly listeners;
14
+ constructor(onError?: ((error: unknown, event: keyof Events) => void) | undefined);
15
+ on<K extends keyof Events>(event: K, fn: (payload: Events[K]) => void): () => void;
16
+ once<K extends keyof Events>(event: K, fn: (payload: Events[K]) => void): () => void;
17
+ /** Remove a listener added with on(). (A once() listener is removed by the function once() returned.) */
18
+ off<K extends keyof Events>(event: K, fn: (payload: Events[K]) => void): void;
19
+ emit<K extends keyof Events>(event: K, payload: Events[K]): void;
20
+ listenerCount(event: keyof Events): number;
21
+ removeAll(): void;
22
+ }
23
+ //# sourceMappingURL=emitter.d.ts.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"emitter.d.ts","sourceRoot":"","sources":["../../src/emitter.ts"],"names":[],"mappings":"AAEA;;;;;;;GAOG;AACH,qBAAa,YAAY,CAAC,MAAM,SAAS;KAAG,CAAC,IAAI,MAAM,MAAM,GAAG,OAAO;CAAE;IAG3D,OAAO,CAAC,QAAQ,CAAC,OAAO,CAAC;IAFrC,OAAO,CAAC,QAAQ,CAAC,SAAS,CAA0C;gBAEvC,OAAO,CAAC,GAAE,CAAC,KAAK,EAAE,OAAO,EAAE,KAAK,EAAE,MAAM,MAAM,KAAK,IAAI,aAAA;IAEpF,EAAE,CAAC,CAAC,SAAS,MAAM,MAAM,EAAE,KAAK,EAAE,CAAC,EAAE,EAAE,EAAE,CAAC,OAAO,EAAE,MAAM,CAAC,CAAC,CAAC,KAAK,IAAI,GAAG,MAAM,IAAI;IAOlF,IAAI,CAAC,CAAC,SAAS,MAAM,MAAM,EAAE,KAAK,EAAE,CAAC,EAAE,EAAE,EAAE,CAAC,OAAO,EAAE,MAAM,CAAC,CAAC,CAAC,KAAK,IAAI,GAAG,MAAM,IAAI;IAKpF,yGAAyG;IACzG,GAAG,CAAC,CAAC,SAAS,MAAM,MAAM,EAAE,KAAK,EAAE,CAAC,EAAE,EAAE,EAAE,CAAC,OAAO,EAAE,MAAM,CAAC,CAAC,CAAC,KAAK,IAAI,GAAG,IAAI;IAI7E,IAAI,CAAC,CAAC,SAAS,MAAM,MAAM,EAAE,KAAK,EAAE,CAAC,EAAE,OAAO,EAAE,MAAM,CAAC,CAAC,CAAC,GAAG,IAAI;IAShE,aAAa,CAAC,KAAK,EAAE,MAAM,MAAM,GAAG,MAAM;IAE1C,SAAS,IAAI,IAAI;CAClB"}
@@ -0,0 +1,47 @@
1
+ /**
2
+ * A small typed event emitter. `Events` maps each event name to its payload:
3
+ *
4
+ * const e = new TypedEmitter<{ state: ConnectionState; ready: undefined }>();
5
+ * const off = e.on("state", (s) => …); e.emit("state", "open"); e.emit("ready", undefined);
6
+ *
7
+ * A listener that throws does not stop the others; the error goes to `onError`.
8
+ */
9
+ export class TypedEmitter {
10
+ constructor(onError) {
11
+ this.onError = onError;
12
+ this.listeners = new Map();
13
+ }
14
+ on(event, fn) {
15
+ let set = this.listeners.get(event);
16
+ if (!set) {
17
+ set = new Set();
18
+ this.listeners.set(event, set);
19
+ }
20
+ set.add(fn);
21
+ return () => this.off(event, fn);
22
+ }
23
+ once(event, fn) {
24
+ const off = this.on(event, (p) => { off(); fn(p); });
25
+ return off;
26
+ }
27
+ /** Remove a listener added with on(). (A once() listener is removed by the function once() returned.) */
28
+ off(event, fn) {
29
+ this.listeners.get(event)?.delete(fn);
30
+ }
31
+ emit(event, payload) {
32
+ const set = this.listeners.get(event);
33
+ if (!set)
34
+ return;
35
+ for (const fn of [...set]) {
36
+ try {
37
+ fn(payload);
38
+ }
39
+ catch (e) {
40
+ this.onError?.(e, event);
41
+ }
42
+ }
43
+ }
44
+ listenerCount(event) { return this.listeners.get(event)?.size ?? 0; }
45
+ removeAll() { this.listeners.clear(); }
46
+ }
47
+ //# sourceMappingURL=emitter.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"emitter.js","sourceRoot":"","sources":["../../src/emitter.ts"],"names":[],"mappings":"AAEA;;;;;;;GAOG;AACH,MAAM,OAAO,YAAY;IAGvB,YAA6B,OAAuD;QAAvD,YAAO,GAAP,OAAO,CAAgD;QAFnE,cAAS,GAAG,IAAI,GAAG,EAA+B,CAAC;IAEmB,CAAC;IAExF,EAAE,CAAyB,KAAQ,EAAE,EAAgC;QACnE,IAAI,GAAG,GAAG,IAAI,CAAC,SAAS,CAAC,GAAG,CAAC,KAAK,CAAC,CAAC;QACpC,IAAI,CAAC,GAAG,EAAE,CAAC;YAAC,GAAG,GAAG,IAAI,GAAG,EAAE,CAAC;YAAC,IAAI,CAAC,SAAS,CAAC,GAAG,CAAC,KAAK,EAAE,GAAG,CAAC,CAAC;QAAC,CAAC;QAC9D,GAAG,CAAC,GAAG,CAAC,EAAc,CAAC,CAAC;QACxB,OAAO,GAAG,EAAE,CAAC,IAAI,CAAC,GAAG,CAAC,KAAK,EAAE,EAAE,CAAC,CAAC;IACnC,CAAC;IAED,IAAI,CAAyB,KAAQ,EAAE,EAAgC;QACrE,MAAM,GAAG,GAAG,IAAI,CAAC,EAAE,CAAC,KAAK,EAAE,CAAC,CAAC,EAAE,EAAE,GAAG,GAAG,EAAE,CAAC,CAAC,EAAE,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC;QACrD,OAAO,GAAG,CAAC;IACb,CAAC;IAED,yGAAyG;IACzG,GAAG,CAAyB,KAAQ,EAAE,EAAgC;QACpE,IAAI,CAAC,SAAS,CAAC,GAAG,CAAC,KAAK,CAAC,EAAE,MAAM,CAAC,EAAc,CAAC,CAAC;IACpD,CAAC;IAED,IAAI,CAAyB,KAAQ,EAAE,OAAkB;QACvD,MAAM,GAAG,GAAG,IAAI,CAAC,SAAS,CAAC,GAAG,CAAC,KAAK,CAAC,CAAC;QACtC,IAAI,CAAC,GAAG;YAAE,OAAO;QACjB,KAAK,MAAM,EAAE,IAAI,CAAC,GAAG,GAAG,CAAC,EAAE,CAAC;YAC1B,IAAI,CAAC;gBAAC,EAAE,CAAC,OAAO,CAAC,CAAC;YAAC,CAAC;YACpB,OAAO,CAAC,EAAE,CAAC;gBAAC,IAAI,CAAC,OAAO,EAAE,CAAC,CAAC,EAAE,KAAK,CAAC,CAAC;YAAC,CAAC;QACzC,CAAC;IACH,CAAC;IAED,aAAa,CAAC,KAAmB,IAAY,OAAO,IAAI,CAAC,SAAS,CAAC,GAAG,CAAC,KAAK,CAAC,EAAE,IAAI,IAAI,CAAC,CAAC,CAAC,CAAC;IAE3F,SAAS,KAAW,IAAI,CAAC,SAAS,CAAC,KAAK,EAAE,CAAC,CAAC,CAAC;CAC9C"}
@@ -0,0 +1,16 @@
1
+ import { Redactor } from "./redact.js";
2
+ /**
3
+ * Every error the SDK raises. The message is only `status code`, and the body is
4
+ * redacted when the error is made: a partner who logs errors (or sends them to a
5
+ * crash reporter) never ships a token with them.
6
+ */
7
+ export declare class HainivaAgentError extends Error {
8
+ readonly status: number;
9
+ readonly code: string;
10
+ readonly body: Record<string, unknown>;
11
+ /** status 0 = raised by the SDK itself (configuration, network), not by HAINIVA. */
12
+ constructor(status: number, code: string, body?: Record<string, unknown>, redactor?: Redactor);
13
+ /** Wrap anything thrown below the SDK (fetch, WebSocket, LiveKit) without carrying its secrets along. */
14
+ static from(e: unknown, code?: string, redactor?: Redactor): HainivaAgentError;
15
+ }
16
+ //# sourceMappingURL=errors.d.ts.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"errors.d.ts","sourceRoot":"","sources":["../../src/errors.ts"],"names":[],"mappings":"AAAA,OAAO,EAAE,QAAQ,EAA6B,MAAM,aAAa,CAAC;AAElE;;;;GAIG;AACH,qBAAa,iBAAkB,SAAQ,KAAK;IAC1C,QAAQ,CAAC,MAAM,EAAE,MAAM,CAAC;IACxB,QAAQ,CAAC,IAAI,EAAE,MAAM,CAAC;IACtB,QAAQ,CAAC,IAAI,EAAE,MAAM,CAAC,MAAM,EAAE,OAAO,CAAC,CAAC;IAEvC,oFAAoF;gBACxE,MAAM,EAAE,MAAM,EAAE,IAAI,EAAE,MAAM,EAAE,IAAI,GAAE,MAAM,CAAC,MAAM,EAAE,OAAO,CAAM,EAAE,QAAQ,CAAC,EAAE,QAAQ;IASjG,yGAAyG;IACzG,MAAM,CAAC,IAAI,CAAC,CAAC,EAAE,OAAO,EAAE,IAAI,SAAW,EAAE,QAAQ,CAAC,EAAE,QAAQ,GAAG,iBAAiB;CAKjF"}
@@ -0,0 +1,25 @@
1
+ import { redactString, redactValue } from "./redact.js";
2
+ /**
3
+ * Every error the SDK raises. The message is only `status code`, and the body is
4
+ * redacted when the error is made: a partner who logs errors (or sends them to a
5
+ * crash reporter) never ships a token with them.
6
+ */
7
+ export class HainivaAgentError extends Error {
8
+ /** status 0 = raised by the SDK itself (configuration, network), not by HAINIVA. */
9
+ constructor(status, code, body = {}, redactor) {
10
+ const c = redactor ? redactor.string(code) : redactString(code);
11
+ super(`${status} ${c}`);
12
+ this.name = "HainivaAgentError";
13
+ this.status = status;
14
+ this.code = c;
15
+ this.body = (redactor ? redactor.value(body) : redactValue(body));
16
+ }
17
+ /** Wrap anything thrown below the SDK (fetch, WebSocket, LiveKit) without carrying its secrets along. */
18
+ static from(e, code = "failed", redactor) {
19
+ if (e instanceof HainivaAgentError)
20
+ return e;
21
+ const message = e instanceof Error ? e.message : String(e);
22
+ return new HainivaAgentError(0, code, { cause: message }, redactor);
23
+ }
24
+ }
25
+ //# sourceMappingURL=errors.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"errors.js","sourceRoot":"","sources":["../../src/errors.ts"],"names":[],"mappings":"AAAA,OAAO,EAAY,YAAY,EAAE,WAAW,EAAE,MAAM,aAAa,CAAC;AAElE;;;;GAIG;AACH,MAAM,OAAO,iBAAkB,SAAQ,KAAK;IAK1C,oFAAoF;IACpF,YAAY,MAAc,EAAE,IAAY,EAAE,OAAgC,EAAE,EAAE,QAAmB;QAC/F,MAAM,CAAC,GAAG,QAAQ,CAAC,CAAC,CAAC,QAAQ,CAAC,MAAM,CAAC,IAAI,CAAC,CAAC,CAAC,CAAC,YAAY,CAAC,IAAI,CAAC,CAAC;QAChE,KAAK,CAAC,GAAG,MAAM,IAAI,CAAC,EAAE,CAAC,CAAC;QACxB,IAAI,CAAC,IAAI,GAAG,mBAAmB,CAAC;QAChC,IAAI,CAAC,MAAM,GAAG,MAAM,CAAC;QACrB,IAAI,CAAC,IAAI,GAAG,CAAC,CAAC;QACd,IAAI,CAAC,IAAI,GAAG,CAAC,QAAQ,CAAC,CAAC,CAAC,QAAQ,CAAC,KAAK,CAAC,IAAI,CAAC,CAAC,CAAC,CAAC,WAAW,CAAC,IAAI,CAAC,CAA4B,CAAC;IAC/F,CAAC;IAED,yGAAyG;IACzG,MAAM,CAAC,IAAI,CAAC,CAAU,EAAE,IAAI,GAAG,QAAQ,EAAE,QAAmB;QAC1D,IAAI,CAAC,YAAY,iBAAiB;YAAE,OAAO,CAAC,CAAC;QAC7C,MAAM,OAAO,GAAG,CAAC,YAAY,KAAK,CAAC,CAAC,CAAC,CAAC,CAAC,OAAO,CAAC,CAAC,CAAC,MAAM,CAAC,CAAC,CAAC,CAAC;QAC3D,OAAO,IAAI,iBAAiB,CAAC,CAAC,EAAE,IAAI,EAAE,EAAE,KAAK,EAAE,OAAO,EAAE,EAAE,QAAQ,CAAC,CAAC;IACtE,CAAC;CACF"}