@useago/sdk 0.3.2 → 0.3.4

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 (121) hide show
  1. package/dist/AgoClient-DF7M2WAz.js +575 -0
  2. package/dist/AgoClient-bjN-z2ZQ.cjs +6 -0
  3. package/dist/angular.cjs +1 -143
  4. package/dist/angular.d.cts +530 -0
  5. package/dist/angular.d.ts +530 -2
  6. package/dist/angular.js +71 -139
  7. package/dist/createFormCollector-ClzHfaBd.js +185 -0
  8. package/dist/createFormCollector-H4Me_2uj.cjs +1 -0
  9. package/dist/createMockClient-C50gjV0b.js +71 -0
  10. package/dist/createMockClient-DQvFFWnc.cjs +1 -0
  11. package/dist/devtools.cjs +26 -100
  12. package/dist/devtools.d.cts +443 -0
  13. package/dist/devtools.d.ts +443 -2
  14. package/dist/devtools.js +68 -93
  15. package/dist/functions-BH1X5kas.cjs +1 -0
  16. package/dist/functions-CWSRi3xv.js +312 -0
  17. package/dist/helpers.cjs +1 -15
  18. package/dist/{helpers/functions.d.ts → helpers.d.cts} +121 -62
  19. package/dist/helpers.d.ts +121 -2
  20. package/dist/helpers.js +16 -2
  21. package/dist/index.cjs +1 -347
  22. package/dist/index.d.cts +1150 -0
  23. package/dist/index.d.ts +1150 -20
  24. package/dist/index.js +129 -298
  25. package/dist/react.cjs +31 -22438
  26. package/dist/react.d.cts +999 -0
  27. package/dist/react.d.ts +999 -2
  28. package/dist/react.js +8416 -22376
  29. package/dist/rolldown-runtime-CaekUdDJ.cjs +1 -0
  30. package/dist/rolldown-runtime-DxmricAu.js +25 -0
  31. package/dist/vue.cjs +1 -336
  32. package/dist/vue.d.cts +1063 -0
  33. package/dist/vue.d.ts +1063 -2
  34. package/dist/vue.js +174 -316
  35. package/dist/widget.cjs +1 -0
  36. package/dist/widget.d.cts +577 -0
  37. package/dist/widget.d.ts +577 -2
  38. package/dist/widget.js +398 -0
  39. package/package.json +35 -24
  40. package/dist/AgoClient-DPZdN5n2.js +0 -905
  41. package/dist/AgoClient-DPZdN5n2.js.map +0 -1
  42. package/dist/AgoClient-wMVUQqCD.cjs +0 -976
  43. package/dist/AgoClient-wMVUQqCD.cjs.map +0 -1
  44. package/dist/angular/ago.service.d.ts +0 -98
  45. package/dist/angular/index.d.ts +0 -4
  46. package/dist/angular/provide.d.ts +0 -27
  47. package/dist/angular.cjs.map +0 -1
  48. package/dist/angular.js.map +0 -1
  49. package/dist/api/HttpClient.d.ts +0 -31
  50. package/dist/api/index.d.ts +0 -1
  51. package/dist/auto/createAgo.d.ts +0 -39
  52. package/dist/auto/index.d.ts +0 -1
  53. package/dist/client/AgoClient.d.ts +0 -169
  54. package/dist/client/errors.d.ts +0 -48
  55. package/dist/client/index.d.ts +0 -3
  56. package/dist/client/types.d.ts +0 -205
  57. package/dist/createMockClient-Ci_N2tH8.cjs +0 -104
  58. package/dist/createMockClient-Ci_N2tH8.cjs.map +0 -1
  59. package/dist/createMockClient-U0ae_AYy.js +0 -99
  60. package/dist/createMockClient-U0ae_AYy.js.map +0 -1
  61. package/dist/devtools/index.d.ts +0 -2
  62. package/dist/devtools/initDevPanel.d.ts +0 -15
  63. package/dist/devtools.cjs.map +0 -1
  64. package/dist/devtools.js.map +0 -1
  65. package/dist/functions/FunctionRegistry.d.ts +0 -41
  66. package/dist/functions/defineFunction.d.ts +0 -22
  67. package/dist/functions/index.d.ts +0 -2
  68. package/dist/functions/types.d.ts +0 -50
  69. package/dist/functions--c6lx3ic.cjs +0 -480
  70. package/dist/functions--c6lx3ic.cjs.map +0 -1
  71. package/dist/functions-C9F1dnmh.js +0 -398
  72. package/dist/functions-C9F1dnmh.js.map +0 -1
  73. package/dist/helpers/factory.d.ts +0 -20
  74. package/dist/helpers/index.d.ts +0 -1
  75. package/dist/index.cjs.map +0 -1
  76. package/dist/index.js.map +0 -1
  77. package/dist/react/components/ChatInput.d.ts +0 -12
  78. package/dist/react/components/ChatWidget.d.ts +0 -35
  79. package/dist/react/components/Markdown.d.ts +0 -12
  80. package/dist/react/components/Message.d.ts +0 -9
  81. package/dist/react/components/index.d.ts +0 -8
  82. package/dist/react/context/AgoContext.d.ts +0 -62
  83. package/dist/react/context/index.d.ts +0 -2
  84. package/dist/react/hooks/index.d.ts +0 -7
  85. package/dist/react/hooks/useAgo.d.ts +0 -14
  86. package/dist/react/hooks/useAgoContext.d.ts +0 -40
  87. package/dist/react/hooks/useAgoFunction.d.ts +0 -58
  88. package/dist/react/hooks/useAgoStore.d.ts +0 -17
  89. package/dist/react/hooks/useChat.d.ts +0 -45
  90. package/dist/react/hooks/useConversation.d.ts +0 -28
  91. package/dist/react/hooks/useMessages.d.ts +0 -26
  92. package/dist/react/index.d.ts +0 -24
  93. package/dist/react/testing.d.ts +0 -2
  94. package/dist/react.cjs.map +0 -1
  95. package/dist/react.js.map +0 -1
  96. package/dist/rolldown-runtime-BqCkTl7Q.cjs +0 -50
  97. package/dist/rolldown-runtime-CNZpIYwj.js +0 -33
  98. package/dist/state/ClientContextRegistry.d.ts +0 -64
  99. package/dist/state/createStore.d.ts +0 -30
  100. package/dist/streaming/SSEHandler.d.ts +0 -46
  101. package/dist/streaming/helpers.d.ts +0 -67
  102. package/dist/streaming/index.d.ts +0 -2
  103. package/dist/testing/createMockClient.d.ts +0 -42
  104. package/dist/testing/index.d.ts +0 -2
  105. package/dist/utils/eventEmitter.d.ts +0 -23
  106. package/dist/utils/index.d.ts +0 -2
  107. package/dist/utils/logger.d.ts +0 -14
  108. package/dist/vue/composables/useAgo.d.ts +0 -17
  109. package/dist/vue/composables/useAgoEvents.d.ts +0 -11
  110. package/dist/vue/composables/useAgoFunction.d.ts +0 -34
  111. package/dist/vue/composables/useAgoStore.d.ts +0 -18
  112. package/dist/vue/composables/useChat.d.ts +0 -251
  113. package/dist/vue/composables/useConversation.d.ts +0 -178
  114. package/dist/vue/composables/useMessages.d.ts +0 -89
  115. package/dist/vue/index.d.ts +0 -11
  116. package/dist/vue/plugin.d.ts +0 -16
  117. package/dist/vue/symbols.d.ts +0 -3
  118. package/dist/vue.cjs.map +0 -1
  119. package/dist/vue.js.map +0 -1
  120. package/dist/widget/index.d.ts +0 -1
  121. package/dist/widget/types.d.ts +0 -43
@@ -1,398 +0,0 @@
1
- import { n as __exportAll } from "./rolldown-runtime-CNZpIYwj.js";
2
- //#region src/helpers/functions.ts
3
- var functions_exports = /* @__PURE__ */ __exportAll({
4
- copyToClipboard: () => copyToClipboard,
5
- getLocalStorage: () => getLocalStorage,
6
- getUserLocation: () => getUserLocation,
7
- highlightElement: () => highlightElement,
8
- openUrl: () => openUrl,
9
- scrollToElement: () => scrollToElement,
10
- setLocalStorage: () => setLocalStorage,
11
- setTheme: () => setTheme,
12
- showConfirmDialog: () => showConfirmDialog,
13
- showNotification: () => showNotification,
14
- showToast: () => showToast,
15
- submitForm: () => submitForm,
16
- trackEvent: () => trackEvent
17
- });
18
- /**
19
- * Show a toast/notification to the user.
20
- * The handler is a no-op by default — wire it up to your toast library.
21
- *
22
- * ```ts
23
- * import { showToast } from "@useago/sdk/helpers";
24
- * showToast.handler = async (args) => { myToast(args.message); return { shown: true }; };
25
- * client.registerFunction(showToast);
26
- * ```
27
- */
28
- var showToast = {
29
- name: "showToast",
30
- description: "Show a toast notification to the user. Use this to confirm actions or display brief messages.",
31
- parameters: {
32
- type: "object",
33
- properties: {
34
- message: {
35
- type: "string",
36
- description: "The message to display"
37
- },
38
- type: {
39
- type: "string",
40
- description: "Toast type",
41
- enum: [
42
- "success",
43
- "error",
44
- "warning",
45
- "info"
46
- ]
47
- },
48
- duration: {
49
- type: "number",
50
- description: "Duration in milliseconds (default 3000)"
51
- }
52
- },
53
- required: ["message"]
54
- },
55
- handler: async () => ({
56
- shown: false,
57
- error: "No toast handler configured"
58
- })
59
- };
60
- /**
61
- * Show a browser notification (requires permission).
62
- */
63
- var showNotification = {
64
- name: "showNotification",
65
- description: "Show a browser notification to the user. Useful for important alerts even when the tab is not focused.",
66
- parameters: {
67
- type: "object",
68
- properties: {
69
- title: {
70
- type: "string",
71
- description: "Notification title"
72
- },
73
- body: {
74
- type: "string",
75
- description: "Notification body text"
76
- }
77
- },
78
- required: ["title"]
79
- },
80
- handler: async (args) => {
81
- if (typeof Notification === "undefined") return {
82
- shown: false,
83
- error: "Notifications not supported"
84
- };
85
- if (Notification.permission === "denied") return {
86
- shown: false,
87
- error: "Notification permission denied"
88
- };
89
- if (Notification.permission !== "granted") await Notification.requestPermission();
90
- if (Notification.permission === "granted") {
91
- new Notification(args.title, { body: args.body });
92
- return { shown: true };
93
- }
94
- return {
95
- shown: false,
96
- error: "Permission not granted"
97
- };
98
- }
99
- };
100
- /**
101
- * Open a URL in a new tab.
102
- */
103
- var openUrl = {
104
- name: "openUrl",
105
- description: "Open a URL in a new browser tab.",
106
- parameters: {
107
- type: "object",
108
- properties: { url: {
109
- type: "string",
110
- description: "The URL to open"
111
- } },
112
- required: ["url"]
113
- },
114
- handler: async (args) => {
115
- window.open(args.url, "_blank", "noopener,noreferrer");
116
- return { opened: true };
117
- }
118
- };
119
- /**
120
- * Copy text to clipboard.
121
- */
122
- var copyToClipboard = {
123
- name: "copyToClipboard",
124
- description: "Copy text to the user's clipboard.",
125
- parameters: {
126
- type: "object",
127
- properties: { text: {
128
- type: "string",
129
- description: "The text to copy"
130
- } },
131
- required: ["text"]
132
- },
133
- handler: async (args) => {
134
- await navigator.clipboard.writeText(args.text);
135
- return { copied: true };
136
- }
137
- };
138
- /**
139
- * Set the application theme (light/dark/system).
140
- * Default handler toggles a `data-theme` attribute on `<html>`.
141
- */
142
- var setTheme = {
143
- name: "setTheme",
144
- description: "Change the application's color theme. Sets a data-theme attribute on the document element.",
145
- parameters: {
146
- type: "object",
147
- properties: { theme: {
148
- type: "string",
149
- description: "Theme to apply",
150
- enum: [
151
- "light",
152
- "dark",
153
- "system"
154
- ]
155
- } },
156
- required: ["theme"]
157
- },
158
- handler: async (args) => {
159
- const theme = args.theme;
160
- document.documentElement.setAttribute("data-theme", theme);
161
- if (theme === "dark") document.documentElement.classList.add("dark");
162
- else document.documentElement.classList.remove("dark");
163
- return {
164
- theme,
165
- applied: true
166
- };
167
- }
168
- };
169
- /**
170
- * Show a confirm dialog and return the user's choice.
171
- */
172
- var showConfirmDialog = {
173
- name: "showConfirmDialog",
174
- description: "Show a confirmation dialog to the user and return their choice (true/false).",
175
- parameters: {
176
- type: "object",
177
- properties: { message: {
178
- type: "string",
179
- description: "The confirmation message to display"
180
- } },
181
- required: ["message"]
182
- },
183
- handler: async (args) => {
184
- return { confirmed: window.confirm(args.message) };
185
- }
186
- };
187
- /**
188
- * Get the user's geolocation.
189
- */
190
- var getUserLocation = {
191
- name: "getUserLocation",
192
- description: "Get the user's current geographic location (requires permission).",
193
- parameters: {
194
- type: "object",
195
- properties: {}
196
- },
197
- handler: async () => {
198
- if (!navigator.geolocation) return { error: "Geolocation not supported" };
199
- return new Promise((resolve) => {
200
- navigator.geolocation.getCurrentPosition((pos) => resolve({
201
- latitude: pos.coords.latitude,
202
- longitude: pos.coords.longitude,
203
- accuracy: pos.coords.accuracy
204
- }), (err) => resolve({ error: err.message }));
205
- });
206
- }
207
- };
208
- /**
209
- * Scroll to an element on the page.
210
- */
211
- var scrollToElement = {
212
- name: "scrollToElement",
213
- description: "Scroll the page to a specific element identified by CSS selector.",
214
- parameters: {
215
- type: "object",
216
- properties: {
217
- selector: {
218
- type: "string",
219
- description: "CSS selector of the element to scroll to (e.g. '#section-pricing')"
220
- },
221
- behavior: {
222
- type: "string",
223
- description: "Scroll behavior",
224
- enum: ["smooth", "instant"]
225
- }
226
- },
227
- required: ["selector"]
228
- },
229
- handler: async (args) => {
230
- const el = document.querySelector(args.selector);
231
- if (!el) return {
232
- scrolled: false,
233
- error: `Element not found: ${args.selector}`
234
- };
235
- el.scrollIntoView({ behavior: args.behavior || "smooth" });
236
- return { scrolled: true };
237
- }
238
- };
239
- /**
240
- * Set a value in localStorage.
241
- */
242
- var setLocalStorage = {
243
- name: "setLocalStorage",
244
- description: "Store a value in the browser's localStorage.",
245
- parameters: {
246
- type: "object",
247
- properties: {
248
- key: {
249
- type: "string",
250
- description: "Storage key"
251
- },
252
- value: {
253
- type: "string",
254
- description: "Value to store"
255
- }
256
- },
257
- required: ["key", "value"]
258
- },
259
- handler: async (args) => {
260
- localStorage.setItem(args.key, args.value);
261
- return { stored: true };
262
- }
263
- };
264
- /**
265
- * Get a value from localStorage.
266
- */
267
- var getLocalStorage = {
268
- name: "getLocalStorage",
269
- description: "Retrieve a value from the browser's localStorage.",
270
- parameters: {
271
- type: "object",
272
- properties: { key: {
273
- type: "string",
274
- description: "Storage key"
275
- } },
276
- required: ["key"]
277
- },
278
- handler: async (args) => {
279
- const value = localStorage.getItem(args.key);
280
- return {
281
- key: args.key,
282
- value,
283
- found: value !== null
284
- };
285
- }
286
- };
287
- /**
288
- * Highlight an element on the page (useful for guided tours).
289
- */
290
- var highlightElement = {
291
- name: "highlightElement",
292
- description: "Highlight a DOM element to draw the user's attention (e.g. for onboarding).",
293
- parameters: {
294
- type: "object",
295
- properties: {
296
- selector: {
297
- type: "string",
298
- description: "CSS selector of the element to highlight"
299
- },
300
- color: {
301
- type: "string",
302
- description: "Highlight border color (default: #3b82f6)"
303
- }
304
- },
305
- required: ["selector"]
306
- },
307
- handler: async (args) => {
308
- const el = document.querySelector(args.selector);
309
- if (!el) return {
310
- highlighted: false,
311
- error: `Element not found: ${args.selector}`
312
- };
313
- const prev = el.style.outline;
314
- const color = args.color || "#3b82f6";
315
- el.style.outline = `3px solid ${color}`;
316
- el.style.outlineOffset = "2px";
317
- el.scrollIntoView({
318
- behavior: "smooth",
319
- block: "center"
320
- });
321
- setTimeout(() => {
322
- el.style.outline = prev;
323
- el.style.outlineOffset = "";
324
- }, 3e3);
325
- return { highlighted: true };
326
- }
327
- };
328
- /**
329
- * Submit a form on the page programmatically.
330
- */
331
- var submitForm = {
332
- name: "submitForm",
333
- description: "Fill and submit an HTML form on the page. Pass field values as key-value pairs.",
334
- parameters: {
335
- type: "object",
336
- properties: {
337
- selector: {
338
- type: "string",
339
- description: "CSS selector of the form element"
340
- },
341
- values: {
342
- type: "string",
343
- description: "JSON string of field name → value pairs"
344
- }
345
- },
346
- required: ["selector"]
347
- },
348
- handler: async (args) => {
349
- const form = document.querySelector(args.selector);
350
- if (!form) return {
351
- submitted: false,
352
- error: `Form not found: ${args.selector}`
353
- };
354
- if (args.values) {
355
- const values = JSON.parse(args.values);
356
- for (const [name, value] of Object.entries(values)) {
357
- const input = form.elements.namedItem(name);
358
- if (input) input.value = value;
359
- }
360
- }
361
- form.requestSubmit();
362
- return { submitted: true };
363
- }
364
- };
365
- /**
366
- * Track a custom analytics event.
367
- * Default handler logs to console — replace with your analytics provider.
368
- */
369
- var trackEvent = {
370
- name: "trackEvent",
371
- description: "Track a custom analytics event. Override the handler to wire up your analytics provider.",
372
- parameters: {
373
- type: "object",
374
- properties: {
375
- event: {
376
- type: "string",
377
- description: "Event name"
378
- },
379
- properties: {
380
- type: "string",
381
- description: "JSON string of event properties"
382
- }
383
- },
384
- required: ["event"]
385
- },
386
- handler: async (args) => {
387
- const props = args.properties ? JSON.parse(args.properties) : {};
388
- console.log(`[AGO Analytics] ${args.event}`, props);
389
- return {
390
- tracked: true,
391
- event: args.event
392
- };
393
- }
394
- };
395
- //#endregion
396
- export { highlightElement as a, setLocalStorage as c, showNotification as d, showToast as f, getUserLocation as i, setTheme as l, trackEvent as m, functions_exports as n, openUrl as o, submitForm as p, getLocalStorage as r, scrollToElement as s, copyToClipboard as t, showConfirmDialog as u };
397
-
398
- //# sourceMappingURL=functions-C9F1dnmh.js.map
@@ -1 +0,0 @@
1
- {"version":3,"file":"functions-C9F1dnmh.js","names":[],"sources":["../src/helpers/functions.ts"],"sourcesContent":["import type { ClientFunctionDefinition } from \"../functions/types\";\n\n/**\n * Show a toast/notification to the user.\n * The handler is a no-op by default — wire it up to your toast library.\n *\n * ```ts\n * import { showToast } from \"@useago/sdk/helpers\";\n * showToast.handler = async (args) => { myToast(args.message); return { shown: true }; };\n * client.registerFunction(showToast);\n * ```\n */\nexport const showToast: ClientFunctionDefinition = {\n name: \"showToast\",\n description:\n \"Show a toast notification to the user. Use this to confirm actions or display brief messages.\",\n parameters: {\n type: \"object\",\n properties: {\n message: { type: \"string\", description: \"The message to display\" },\n type: {\n type: \"string\",\n description: \"Toast type\",\n enum: [\"success\", \"error\", \"warning\", \"info\"],\n },\n duration: {\n type: \"number\",\n description: \"Duration in milliseconds (default 3000)\",\n },\n },\n required: [\"message\"],\n },\n handler: async () => ({ shown: false, error: \"No toast handler configured\" }),\n};\n\n/**\n * Show a browser notification (requires permission).\n */\nexport const showNotification: ClientFunctionDefinition = {\n name: \"showNotification\",\n description:\n \"Show a browser notification to the user. Useful for important alerts even when the tab is not focused.\",\n parameters: {\n type: \"object\",\n properties: {\n title: { type: \"string\", description: \"Notification title\" },\n body: { type: \"string\", description: \"Notification body text\" },\n },\n required: [\"title\"],\n },\n handler: async (args) => {\n if (typeof Notification === \"undefined\") {\n return { shown: false, error: \"Notifications not supported\" };\n }\n if (Notification.permission === \"denied\") {\n return { shown: false, error: \"Notification permission denied\" };\n }\n if (Notification.permission !== \"granted\") {\n await Notification.requestPermission();\n }\n if (Notification.permission === \"granted\") {\n new Notification(args.title as string, { body: args.body as string });\n return { shown: true };\n }\n return { shown: false, error: \"Permission not granted\" };\n },\n};\n\n/**\n * Open a URL in a new tab.\n */\nexport const openUrl: ClientFunctionDefinition = {\n name: \"openUrl\",\n description: \"Open a URL in a new browser tab.\",\n parameters: {\n type: \"object\",\n properties: {\n url: { type: \"string\", description: \"The URL to open\" },\n },\n required: [\"url\"],\n },\n handler: async (args) => {\n window.open(args.url as string, \"_blank\", \"noopener,noreferrer\");\n return { opened: true };\n },\n};\n\n/**\n * Copy text to clipboard.\n */\nexport const copyToClipboard: ClientFunctionDefinition = {\n name: \"copyToClipboard\",\n description: \"Copy text to the user's clipboard.\",\n parameters: {\n type: \"object\",\n properties: {\n text: { type: \"string\", description: \"The text to copy\" },\n },\n required: [\"text\"],\n },\n handler: async (args) => {\n await navigator.clipboard.writeText(args.text as string);\n return { copied: true };\n },\n};\n\n/**\n * Set the application theme (light/dark/system).\n * Default handler toggles a `data-theme` attribute on `<html>`.\n */\nexport const setTheme: ClientFunctionDefinition = {\n name: \"setTheme\",\n description:\n \"Change the application's color theme. Sets a data-theme attribute on the document element.\",\n parameters: {\n type: \"object\",\n properties: {\n theme: {\n type: \"string\",\n description: \"Theme to apply\",\n enum: [\"light\", \"dark\", \"system\"],\n },\n },\n required: [\"theme\"],\n },\n handler: async (args) => {\n const theme = args.theme as string;\n document.documentElement.setAttribute(\"data-theme\", theme);\n if (theme === \"dark\") {\n document.documentElement.classList.add(\"dark\");\n } else {\n document.documentElement.classList.remove(\"dark\");\n }\n return { theme, applied: true };\n },\n};\n\n/**\n * Show a confirm dialog and return the user's choice.\n */\nexport const showConfirmDialog: ClientFunctionDefinition = {\n name: \"showConfirmDialog\",\n description:\n \"Show a confirmation dialog to the user and return their choice (true/false).\",\n parameters: {\n type: \"object\",\n properties: {\n message: {\n type: \"string\",\n description: \"The confirmation message to display\",\n },\n },\n required: [\"message\"],\n },\n handler: async (args) => {\n const confirmed = window.confirm(args.message as string);\n return { confirmed };\n },\n};\n\n/**\n * Get the user's geolocation.\n */\nexport const getUserLocation: ClientFunctionDefinition = {\n name: \"getUserLocation\",\n description:\n \"Get the user's current geographic location (requires permission).\",\n parameters: {\n type: \"object\",\n properties: {},\n },\n handler: async () => {\n if (!navigator.geolocation) {\n return { error: \"Geolocation not supported\" };\n }\n return new Promise((resolve) => {\n navigator.geolocation.getCurrentPosition(\n (pos) =>\n resolve({\n latitude: pos.coords.latitude,\n longitude: pos.coords.longitude,\n accuracy: pos.coords.accuracy,\n }),\n (err) => resolve({ error: err.message })\n );\n });\n },\n};\n\n/**\n * Scroll to an element on the page.\n */\nexport const scrollToElement: ClientFunctionDefinition = {\n name: \"scrollToElement\",\n description: \"Scroll the page to a specific element identified by CSS selector.\",\n parameters: {\n type: \"object\",\n properties: {\n selector: {\n type: \"string\",\n description: \"CSS selector of the element to scroll to (e.g. '#section-pricing')\",\n },\n behavior: {\n type: \"string\",\n description: \"Scroll behavior\",\n enum: [\"smooth\", \"instant\"],\n },\n },\n required: [\"selector\"],\n },\n handler: async (args) => {\n const el = document.querySelector(args.selector as string);\n if (!el) {\n return { scrolled: false, error: `Element not found: ${args.selector}` };\n }\n el.scrollIntoView({ behavior: (args.behavior as ScrollBehavior) || \"smooth\" });\n return { scrolled: true };\n },\n};\n\n/**\n * Set a value in localStorage.\n */\nexport const setLocalStorage: ClientFunctionDefinition = {\n name: \"setLocalStorage\",\n description: \"Store a value in the browser's localStorage.\",\n parameters: {\n type: \"object\",\n properties: {\n key: { type: \"string\", description: \"Storage key\" },\n value: { type: \"string\", description: \"Value to store\" },\n },\n required: [\"key\", \"value\"],\n },\n handler: async (args) => {\n localStorage.setItem(args.key as string, args.value as string);\n return { stored: true };\n },\n};\n\n/**\n * Get a value from localStorage.\n */\nexport const getLocalStorage: ClientFunctionDefinition = {\n name: \"getLocalStorage\",\n description: \"Retrieve a value from the browser's localStorage.\",\n parameters: {\n type: \"object\",\n properties: {\n key: { type: \"string\", description: \"Storage key\" },\n },\n required: [\"key\"],\n },\n handler: async (args) => {\n const value = localStorage.getItem(args.key as string);\n return { key: args.key, value, found: value !== null };\n },\n};\n\n/**\n * Highlight an element on the page (useful for guided tours).\n */\nexport const highlightElement: ClientFunctionDefinition = {\n name: \"highlightElement\",\n description:\n \"Highlight a DOM element to draw the user's attention (e.g. for onboarding).\",\n parameters: {\n type: \"object\",\n properties: {\n selector: {\n type: \"string\",\n description: \"CSS selector of the element to highlight\",\n },\n color: {\n type: \"string\",\n description: \"Highlight border color (default: #3b82f6)\",\n },\n },\n required: [\"selector\"],\n },\n handler: async (args) => {\n const el = document.querySelector(args.selector as string) as HTMLElement | null;\n if (!el) {\n return { highlighted: false, error: `Element not found: ${args.selector}` };\n }\n const prev = el.style.outline;\n const color = (args.color as string) || \"#3b82f6\";\n el.style.outline = `3px solid ${color}`;\n el.style.outlineOffset = \"2px\";\n el.scrollIntoView({ behavior: \"smooth\", block: \"center\" });\n setTimeout(() => {\n el.style.outline = prev;\n el.style.outlineOffset = \"\";\n }, 3000);\n return { highlighted: true };\n },\n};\n\n/**\n * Submit a form on the page programmatically.\n */\nexport const submitForm: ClientFunctionDefinition = {\n name: \"submitForm\",\n description:\n \"Fill and submit an HTML form on the page. Pass field values as key-value pairs.\",\n parameters: {\n type: \"object\",\n properties: {\n selector: {\n type: \"string\",\n description: \"CSS selector of the form element\",\n },\n values: {\n type: \"string\",\n description: \"JSON string of field name → value pairs\",\n },\n },\n required: [\"selector\"],\n },\n handler: async (args) => {\n const form = document.querySelector(args.selector as string) as HTMLFormElement | null;\n if (!form) {\n return { submitted: false, error: `Form not found: ${args.selector}` };\n }\n if (args.values) {\n const values = JSON.parse(args.values as string) as Record<string, string>;\n for (const [name, value] of Object.entries(values)) {\n const input = form.elements.namedItem(name) as HTMLInputElement | null;\n if (input) input.value = value;\n }\n }\n form.requestSubmit();\n return { submitted: true };\n },\n};\n\n/**\n * Track a custom analytics event.\n * Default handler logs to console — replace with your analytics provider.\n */\nexport const trackEvent: ClientFunctionDefinition = {\n name: \"trackEvent\",\n description:\n \"Track a custom analytics event. Override the handler to wire up your analytics provider.\",\n parameters: {\n type: \"object\",\n properties: {\n event: { type: \"string\", description: \"Event name\" },\n properties: {\n type: \"string\",\n description: \"JSON string of event properties\",\n },\n },\n required: [\"event\"],\n },\n handler: async (args) => {\n const props = args.properties ? JSON.parse(args.properties as string) : {};\n console.log(`[AGO Analytics] ${args.event}`, props);\n return { tracked: true, event: args.event };\n },\n};\n"],"mappings":";;;;;;;;;;;;;;;;;;;;;;;;;;;AAYA,IAAa,YAAsC;CACjD,MAAM;CACN,aACE;CACF,YAAY;EACV,MAAM;EACN,YAAY;GACV,SAAS;IAAE,MAAM;IAAU,aAAa;IAA0B;GAClE,MAAM;IACJ,MAAM;IACN,aAAa;IACb,MAAM;KAAC;KAAW;KAAS;KAAW;KAAO;IAC9C;GACD,UAAU;IACR,MAAM;IACN,aAAa;IACd;GACF;EACD,UAAU,CAAC,UAAU;EACtB;CACD,SAAS,aAAa;EAAE,OAAO;EAAO,OAAO;EAA+B;CAC7E;;;;AAKD,IAAa,mBAA6C;CACxD,MAAM;CACN,aACE;CACF,YAAY;EACV,MAAM;EACN,YAAY;GACV,OAAO;IAAE,MAAM;IAAU,aAAa;IAAsB;GAC5D,MAAM;IAAE,MAAM;IAAU,aAAa;IAA0B;GAChE;EACD,UAAU,CAAC,QAAQ;EACpB;CACD,SAAS,OAAO,SAAS;AACvB,MAAI,OAAO,iBAAiB,YAC1B,QAAO;GAAE,OAAO;GAAO,OAAO;GAA+B;AAE/D,MAAI,aAAa,eAAe,SAC9B,QAAO;GAAE,OAAO;GAAO,OAAO;GAAkC;AAElE,MAAI,aAAa,eAAe,UAC9B,OAAM,aAAa,mBAAmB;AAExC,MAAI,aAAa,eAAe,WAAW;AACzC,OAAI,aAAa,KAAK,OAAiB,EAAE,MAAM,KAAK,MAAgB,CAAC;AACrE,UAAO,EAAE,OAAO,MAAM;;AAExB,SAAO;GAAE,OAAO;GAAO,OAAO;GAA0B;;CAE3D;;;;AAKD,IAAa,UAAoC;CAC/C,MAAM;CACN,aAAa;CACb,YAAY;EACV,MAAM;EACN,YAAY,EACV,KAAK;GAAE,MAAM;GAAU,aAAa;GAAmB,EACxD;EACD,UAAU,CAAC,MAAM;EAClB;CACD,SAAS,OAAO,SAAS;AACvB,SAAO,KAAK,KAAK,KAAe,UAAU,sBAAsB;AAChE,SAAO,EAAE,QAAQ,MAAM;;CAE1B;;;;AAKD,IAAa,kBAA4C;CACvD,MAAM;CACN,aAAa;CACb,YAAY;EACV,MAAM;EACN,YAAY,EACV,MAAM;GAAE,MAAM;GAAU,aAAa;GAAoB,EAC1D;EACD,UAAU,CAAC,OAAO;EACnB;CACD,SAAS,OAAO,SAAS;AACvB,QAAM,UAAU,UAAU,UAAU,KAAK,KAAe;AACxD,SAAO,EAAE,QAAQ,MAAM;;CAE1B;;;;;AAMD,IAAa,WAAqC;CAChD,MAAM;CACN,aACE;CACF,YAAY;EACV,MAAM;EACN,YAAY,EACV,OAAO;GACL,MAAM;GACN,aAAa;GACb,MAAM;IAAC;IAAS;IAAQ;IAAS;GAClC,EACF;EACD,UAAU,CAAC,QAAQ;EACpB;CACD,SAAS,OAAO,SAAS;EACvB,MAAM,QAAQ,KAAK;AACnB,WAAS,gBAAgB,aAAa,cAAc,MAAM;AAC1D,MAAI,UAAU,OACZ,UAAS,gBAAgB,UAAU,IAAI,OAAO;MAE9C,UAAS,gBAAgB,UAAU,OAAO,OAAO;AAEnD,SAAO;GAAE;GAAO,SAAS;GAAM;;CAElC;;;;AAKD,IAAa,oBAA8C;CACzD,MAAM;CACN,aACE;CACF,YAAY;EACV,MAAM;EACN,YAAY,EACV,SAAS;GACP,MAAM;GACN,aAAa;GACd,EACF;EACD,UAAU,CAAC,UAAU;EACtB;CACD,SAAS,OAAO,SAAS;AAEvB,SAAO,EAAE,WADS,OAAO,QAAQ,KAAK,QAC7B,EAAW;;CAEvB;;;;AAKD,IAAa,kBAA4C;CACvD,MAAM;CACN,aACE;CACF,YAAY;EACV,MAAM;EACN,YAAY,EAAE;EACf;CACD,SAAS,YAAY;AACnB,MAAI,CAAC,UAAU,YACb,QAAO,EAAE,OAAO,6BAA6B;AAE/C,SAAO,IAAI,SAAS,YAAY;AAC9B,aAAU,YAAY,oBACnB,QACC,QAAQ;IACN,UAAU,IAAI,OAAO;IACrB,WAAW,IAAI,OAAO;IACtB,UAAU,IAAI,OAAO;IACtB,CAAC,GACH,QAAQ,QAAQ,EAAE,OAAO,IAAI,SAAS,CAAC,CACzC;IACD;;CAEL;;;;AAKD,IAAa,kBAA4C;CACvD,MAAM;CACN,aAAa;CACb,YAAY;EACV,MAAM;EACN,YAAY;GACV,UAAU;IACR,MAAM;IACN,aAAa;IACd;GACD,UAAU;IACR,MAAM;IACN,aAAa;IACb,MAAM,CAAC,UAAU,UAAU;IAC5B;GACF;EACD,UAAU,CAAC,WAAW;EACvB;CACD,SAAS,OAAO,SAAS;EACvB,MAAM,KAAK,SAAS,cAAc,KAAK,SAAmB;AAC1D,MAAI,CAAC,GACH,QAAO;GAAE,UAAU;GAAO,OAAO,sBAAsB,KAAK;GAAY;AAE1E,KAAG,eAAe,EAAE,UAAW,KAAK,YAA+B,UAAU,CAAC;AAC9E,SAAO,EAAE,UAAU,MAAM;;CAE5B;;;;AAKD,IAAa,kBAA4C;CACvD,MAAM;CACN,aAAa;CACb,YAAY;EACV,MAAM;EACN,YAAY;GACV,KAAK;IAAE,MAAM;IAAU,aAAa;IAAe;GACnD,OAAO;IAAE,MAAM;IAAU,aAAa;IAAkB;GACzD;EACD,UAAU,CAAC,OAAO,QAAQ;EAC3B;CACD,SAAS,OAAO,SAAS;AACvB,eAAa,QAAQ,KAAK,KAAe,KAAK,MAAgB;AAC9D,SAAO,EAAE,QAAQ,MAAM;;CAE1B;;;;AAKD,IAAa,kBAA4C;CACvD,MAAM;CACN,aAAa;CACb,YAAY;EACV,MAAM;EACN,YAAY,EACV,KAAK;GAAE,MAAM;GAAU,aAAa;GAAe,EACpD;EACD,UAAU,CAAC,MAAM;EAClB;CACD,SAAS,OAAO,SAAS;EACvB,MAAM,QAAQ,aAAa,QAAQ,KAAK,IAAc;AACtD,SAAO;GAAE,KAAK,KAAK;GAAK;GAAO,OAAO,UAAU;GAAM;;CAEzD;;;;AAKD,IAAa,mBAA6C;CACxD,MAAM;CACN,aACE;CACF,YAAY;EACV,MAAM;EACN,YAAY;GACV,UAAU;IACR,MAAM;IACN,aAAa;IACd;GACD,OAAO;IACL,MAAM;IACN,aAAa;IACd;GACF;EACD,UAAU,CAAC,WAAW;EACvB;CACD,SAAS,OAAO,SAAS;EACvB,MAAM,KAAK,SAAS,cAAc,KAAK,SAAmB;AAC1D,MAAI,CAAC,GACH,QAAO;GAAE,aAAa;GAAO,OAAO,sBAAsB,KAAK;GAAY;EAE7E,MAAM,OAAO,GAAG,MAAM;EACtB,MAAM,QAAS,KAAK,SAAoB;AACxC,KAAG,MAAM,UAAU,aAAa;AAChC,KAAG,MAAM,gBAAgB;AACzB,KAAG,eAAe;GAAE,UAAU;GAAU,OAAO;GAAU,CAAC;AAC1D,mBAAiB;AACf,MAAG,MAAM,UAAU;AACnB,MAAG,MAAM,gBAAgB;KACxB,IAAK;AACR,SAAO,EAAE,aAAa,MAAM;;CAE/B;;;;AAKD,IAAa,aAAuC;CAClD,MAAM;CACN,aACE;CACF,YAAY;EACV,MAAM;EACN,YAAY;GACV,UAAU;IACR,MAAM;IACN,aAAa;IACd;GACD,QAAQ;IACN,MAAM;IACN,aAAa;IACd;GACF;EACD,UAAU,CAAC,WAAW;EACvB;CACD,SAAS,OAAO,SAAS;EACvB,MAAM,OAAO,SAAS,cAAc,KAAK,SAAmB;AAC5D,MAAI,CAAC,KACH,QAAO;GAAE,WAAW;GAAO,OAAO,mBAAmB,KAAK;GAAY;AAExE,MAAI,KAAK,QAAQ;GACf,MAAM,SAAS,KAAK,MAAM,KAAK,OAAiB;AAChD,QAAK,MAAM,CAAC,MAAM,UAAU,OAAO,QAAQ,OAAO,EAAE;IAClD,MAAM,QAAQ,KAAK,SAAS,UAAU,KAAK;AAC3C,QAAI,MAAO,OAAM,QAAQ;;;AAG7B,OAAK,eAAe;AACpB,SAAO,EAAE,WAAW,MAAM;;CAE7B;;;;;AAMD,IAAa,aAAuC;CAClD,MAAM;CACN,aACE;CACF,YAAY;EACV,MAAM;EACN,YAAY;GACV,OAAO;IAAE,MAAM;IAAU,aAAa;IAAc;GACpD,YAAY;IACV,MAAM;IACN,aAAa;IACd;GACF;EACD,UAAU,CAAC,QAAQ;EACpB;CACD,SAAS,OAAO,SAAS;EACvB,MAAM,QAAQ,KAAK,aAAa,KAAK,MAAM,KAAK,WAAqB,GAAG,EAAE;AAC1E,UAAQ,IAAI,mBAAmB,KAAK,SAAS,MAAM;AACnD,SAAO;GAAE,SAAS;GAAM,OAAO,KAAK;GAAO;;CAE9C"}
@@ -1,20 +0,0 @@
1
- import type { ClientFunctionDefinition, ClientFunctionHandler } from "../functions/types";
2
- /**
3
- * Attach a handler to a pre-built function definition.
4
- *
5
- * Pre-built helpers (`showToast`, `trackEvent`, ...) ship with a no-op or
6
- * console-logging default handler. Use `withHandler` to wire them up to
7
- * your actual implementation without mutating the original definition.
8
- *
9
- * ```ts
10
- * import { showToast, withHandler } from "@useago/sdk";
11
- *
12
- * client.register(
13
- * withHandler(showToast, (args) => {
14
- * myToast(args.message as string);
15
- * return { shown: true };
16
- * })
17
- * );
18
- * ```
19
- */
20
- export declare function withHandler<T extends ClientFunctionDefinition>(definition: T, handler: ClientFunctionHandler): T;
@@ -1 +0,0 @@
1
- export { showToast, showNotification, openUrl, copyToClipboard, setTheme, showConfirmDialog, getUserLocation, scrollToElement, setLocalStorage, getLocalStorage, highlightElement, submitForm, trackEvent, } from "./functions";
@@ -1 +0,0 @@
1
- {"version":3,"file":"index.cjs","names":[],"sources":["../src/state/createStore.ts","../src/functions/defineFunction.ts","../src/streaming/helpers.ts","../src/auto/createAgo.ts","../src/helpers/factory.ts"],"sourcesContent":["/**\n * A minimal observable store: one value, synchronous subscriptions, and\n * optional persistence via {@link PersistOptions} (localStorage by default).\n *\n * ```ts\n * const store = createStore({ count: 0 });\n * store.subscribe((state) => save(state));\n * store.set({ count: 1 }); // listeners fire synchronously\n *\n * const cart = createStore({ items: [] }, { key: \"cart\" }); // persisted\n * ```\n */\nexport interface Store<T> {\n /** Current state. */\n get(): T;\n /** Replace the state and notify subscribers synchronously. */\n set(next: T): void;\n /** Register a listener; returns a function that removes it. */\n subscribe(listener: (state: T) => void): () => void;\n}\n\n/** The slice of the Web Storage API that {@link createStore} relies on. */\ntype StorageLike = Pick<Storage, \"getItem\" | \"setItem\">;\n\nexport interface PersistOptions {\n /** Key under which the state is JSON-serialized. */\n key: string;\n /** Storage backend; defaults to `globalThis.localStorage`. */\n storage?: StorageLike;\n}\n\nexport function createStore<T>(initial: T, persist?: PersistOptions): Store<T> {\n // Resolve a storage backend lazily; absence (SSR, disabled storage) degrades\n // to a pure in-memory store rather than throwing.\n const storage: StorageLike | undefined = persist\n ? (persist.storage ??\n (typeof localStorage !== \"undefined\" ? localStorage : undefined))\n : undefined;\n\n let state = initial;\n\n // Restore a previous snapshot; disabled storage or malformed JSON keeps the\n // initial value.\n if (persist && storage) {\n try {\n const raw = storage.getItem(persist.key);\n if (raw != null) {\n state = JSON.parse(raw) as T;\n }\n } catch {\n /* ignore */\n }\n }\n\n const subscribers = new Set<(state: T) => void>();\n const notify = () => subscribers.forEach((fn) => fn(state));\n\n function persistState() {\n if (persist && storage) {\n try {\n storage.setItem(persist.key, JSON.stringify(state));\n } catch {\n /* ignore */\n }\n }\n }\n\n return {\n get: () => state,\n set: (next: T) => {\n state = next;\n persistState();\n notify();\n },\n subscribe: (fn: (state: T) => void) => {\n subscribers.add(fn);\n return () => {\n subscribers.delete(fn);\n };\n },\n };\n}\n","import type { ClientFunctionDefinition } from \"./types\";\n\n/**\n * Create a reusable function definition.\n * Returns the same object — this is an identity function for discoverability and type-checking.\n *\n * ```ts\n * // Define once, reuse anywhere\n * export const lookupOrder = defineFunction({\n * name: \"lookupOrder\",\n * description: \"Look up an order by ID\",\n * parameters: { type: \"object\", properties: { id: { type: \"string\" } }, required: [\"id\"] },\n * handler: async (args) => fetchOrder(args.id as string),\n * });\n *\n * // Register with client\n * client.registerFunction(lookupOrder);\n *\n * // Or use in React\n * useAgoFunction(lookupOrder.name, lookupOrder);\n * ```\n */\nexport function defineFunction(\n definition: ClientFunctionDefinition\n): ClientFunctionDefinition {\n return definition;\n}\n","import type { AgoClient } from \"../client/AgoClient\";\nimport type {\n AgoMessage,\n AgoClientEvents,\n ToolCallData,\n ClientFunctionInvocation,\n} from \"../client/types\";\n\n/**\n * Subscribe to complete messages with a simple callback. Returns an unsubscribe function.\n *\n * ```ts\n * const unsub = onMessage(client, (msg) => console.log(msg.content));\n * // later: unsub();\n * ```\n */\nexport function onMessage(\n client: AgoClient,\n callback: (message: AgoMessage) => void\n): () => void {\n client.on(\"message:complete\", callback);\n return () => client.off(\"message:complete\", callback);\n}\n\n/**\n * Subscribe to streaming text chunks.\n *\n * ```ts\n * onMessageChunk(client, ({ content }) => {\n * outputEl.textContent += content;\n * });\n * ```\n */\nexport function onMessageChunk(\n client: AgoClient,\n callback: (data: AgoClientEvents[\"message:chunk\"]) => void\n): () => void {\n client.on(\"message:chunk\", callback);\n return () => client.off(\"message:chunk\", callback);\n}\n\n/**\n * Subscribe to message start events.\n */\nexport function onMessageStart(\n client: AgoClient,\n callback: (data: AgoClientEvents[\"message:start\"]) => void\n): () => void {\n client.on(\"message:start\", callback);\n return () => client.off(\"message:start\", callback);\n}\n\n/**\n * Subscribe to message errors.\n */\nexport function onMessageError(\n client: AgoClient,\n callback: (data: AgoClientEvents[\"message:error\"]) => void\n): () => void {\n client.on(\"message:error\", callback);\n return () => client.off(\"message:error\", callback);\n}\n\n/**\n * Subscribe to tool call events.\n */\nexport function onToolCall(\n client: AgoClient,\n callback: (toolCall: ToolCallData) => void\n): () => void {\n client.on(\"toolCall:received\", callback);\n return () => client.off(\"toolCall:received\", callback);\n}\n\n/**\n * Subscribe to client function invocations.\n */\nexport function onFunctionInvoke(\n client: AgoClient,\n callback: (data: ClientFunctionInvocation) => void\n): () => void {\n client.on(\"function:invoke\", callback);\n return () => client.off(\"function:invoke\", callback);\n}\n\n/**\n * Send a message and iterate over chunks as an async generator.\n * Gives you full control over how you process the stream.\n *\n * ```ts\n * for await (const chunk of createMessageStream(client, \"Hello!\")) {\n * console.log(chunk.type, chunk.data);\n * }\n * ```\n */\nexport async function* createMessageStream(\n client: AgoClient,\n content: string,\n options?: { conversationId?: string; agentId?: string; files?: File[] }\n): AsyncGenerator<\n | { type: \"start\"; data: AgoClientEvents[\"message:start\"] }\n | { type: \"chunk\"; data: AgoClientEvents[\"message:chunk\"] }\n | { type: \"complete\"; data: AgoMessage }\n | { type: \"error\"; data: AgoClientEvents[\"message:error\"] }\n | { type: \"toolCall\"; data: ToolCallData }\n> {\n type StreamEvent =\n | { type: \"start\"; data: AgoClientEvents[\"message:start\"] }\n | { type: \"chunk\"; data: AgoClientEvents[\"message:chunk\"] }\n | { type: \"complete\"; data: AgoMessage }\n | { type: \"error\"; data: AgoClientEvents[\"message:error\"] }\n | { type: \"toolCall\"; data: ToolCallData };\n\n const queue: StreamEvent[] = [];\n let resolve: (() => void) | null = null;\n let done = false;\n\n const push = (event: StreamEvent) => {\n queue.push(event);\n resolve?.();\n };\n\n const onStart = (data: AgoClientEvents[\"message:start\"]) => push({ type: \"start\", data });\n const onChunk = (data: AgoClientEvents[\"message:chunk\"]) => push({ type: \"chunk\", data });\n const onComplete = (data: AgoMessage) => {\n push({ type: \"complete\", data });\n done = true;\n resolve?.();\n };\n const onError = (data: AgoClientEvents[\"message:error\"]) => {\n push({ type: \"error\", data });\n done = true;\n resolve?.();\n };\n const onTool = (data: ToolCallData) => push({ type: \"toolCall\", data });\n\n client.on(\"message:start\", onStart);\n client.on(\"message:chunk\", onChunk);\n client.on(\"message:complete\", onComplete);\n client.on(\"message:error\", onError);\n client.on(\"toolCall:received\", onTool);\n\n // Fire the request (don't await — we'll consume events via the generator)\n client.sendMessage(content, options).catch(() => {\n done = true;\n resolve?.();\n });\n\n try {\n while (!done || queue.length > 0) {\n if (queue.length > 0) {\n yield queue.shift()!;\n } else {\n await new Promise<void>((r) => { resolve = r; });\n resolve = null;\n }\n }\n } finally {\n client.off(\"message:start\", onStart);\n client.off(\"message:chunk\", onChunk);\n client.off(\"message:complete\", onComplete);\n client.off(\"message:error\", onError);\n client.off(\"toolCall:received\", onTool);\n }\n}\n","import { AgoClient } from \"../client/AgoClient\";\nimport type { AgoConfig } from \"../client/types\";\n\n/**\n * Auto-detect AGO configuration from the DOM environment.\n *\n * Checks (in order of priority):\n * 1. `window.AGO` global object (widget config)\n * 2. `<meta>` tags: `<meta name=\"ago-api-key\" content=\"...\">`\n * 3. `data-ago-*` attributes on `<body>` or `<script data-ago-api-key=\"...\">`\n * 4. Explicit overrides passed as argument\n *\n * Returns null if no API key can be found.\n */\nexport function autoDetectConfig(\n overrides?: Partial<AgoConfig>\n): AgoConfig | null {\n let baseUrl: string | undefined;\n let widgetId: string | undefined;\n let agent: string | undefined;\n let permission: string | undefined;\n let userEmail: string | undefined;\n let userJwt: string | undefined;\n\n // 1. window.AGO (widget config format)\n if (typeof window !== \"undefined\" && (window as unknown as Record<string, unknown>).AGO) {\n const ago = (window as unknown as Record<string, unknown>).AGO as Record<string, unknown>;\n baseUrl = ago.basepath as string | undefined;\n widgetId = ago.widgetId as string | undefined;\n agent = (ago.agent as string | undefined) || (ago.defaultAgent as string | undefined);\n permission = ago.permission as string | undefined;\n userEmail = ago.email as string | undefined;\n userJwt = ago.jwt as string | undefined;\n }\n\n // 2. Meta tags\n if (typeof document !== \"undefined\") {\n const getMeta = (name: string) =>\n document.querySelector(`meta[name=\"${name}\"]`)?.getAttribute(\"content\") || undefined;\n\n baseUrl = baseUrl || getMeta(\"ago-base-url\");\n widgetId = widgetId || getMeta(\"ago-widget-id\");\n agent = agent || getMeta(\"ago-agent\") || getMeta(\"ago-agent-id\");\n permission = permission || getMeta(\"ago-permission\");\n userEmail = userEmail || getMeta(\"ago-user-email\");\n }\n\n // 3. data-ago-* attributes on body or script tags\n if (typeof document !== \"undefined\") {\n const sources = [\n document.body,\n ...Array.from(document.querySelectorAll(\"script[data-ago-base-url]\")),\n ].filter(Boolean);\n\n for (const el of sources) {\n if (!el) continue;\n baseUrl = baseUrl || el.getAttribute(\"data-ago-base-url\") || undefined;\n widgetId = widgetId || el.getAttribute(\"data-ago-widget-id\") || undefined;\n agent = agent || el.getAttribute(\"data-ago-agent\") || el.getAttribute(\"data-ago-agent-id\") || undefined;\n permission = permission || el.getAttribute(\"data-ago-permission\") || undefined;\n userEmail = userEmail || el.getAttribute(\"data-ago-user-email\") || undefined;\n }\n }\n\n // 4. Apply overrides\n baseUrl = overrides?.baseUrl || baseUrl;\n widgetId = overrides?.widgetId || widgetId;\n agent = overrides?.agent || overrides?.defaultAgentId || agent;\n permission = overrides?.permission || permission;\n userEmail = overrides?.userEmail || userEmail;\n userJwt = overrides?.userJwt || userJwt;\n const debug = overrides?.debug;\n\n if (!baseUrl) {\n return null;\n }\n\n return {\n baseUrl,\n widgetId,\n agent,\n permission,\n userEmail,\n userJwt,\n debug,\n };\n}\n\n/**\n * Create an AgoClient with zero configuration.\n * Auto-detects config from window.AGO, meta tags, and data-ago-* attributes.\n *\n * ```html\n * <!-- In your HTML -->\n * <meta name=\"ago-base-url\" content=\"https://YOUR-DOMAIN.useago.com\">\n *\n * <!-- Or on a script tag -->\n * <script src=\"app.js\" data-ago-base-url=\"https://YOUR-DOMAIN.useago.com\"></script>\n * ```\n *\n * ```ts\n * import { createAgo } from \"@useago/sdk\";\n *\n * // Zero config — picks up from DOM\n * const client = createAgo();\n *\n * // Or with partial overrides\n * const client = createAgo({ debug: true });\n * ```\n *\n * Throws if no base URL can be detected.\n */\nexport function createAgo(overrides?: Partial<AgoConfig>): AgoClient {\n const config = autoDetectConfig(overrides);\n\n if (!config) {\n throw new Error(\n \"createAgo(): could not detect AGO configuration. \" +\n \"Set window.AGO, add <meta name=\\\"ago-base-url\\\">, or pass { baseUrl } explicitly.\"\n );\n }\n\n return new AgoClient(config);\n}\n","import type {\n ClientFunctionDefinition,\n ClientFunctionHandler,\n} from \"../functions/types\";\n\n/**\n * Attach a handler to a pre-built function definition.\n *\n * Pre-built helpers (`showToast`, `trackEvent`, ...) ship with a no-op or\n * console-logging default handler. Use `withHandler` to wire them up to\n * your actual implementation without mutating the original definition.\n *\n * ```ts\n * import { showToast, withHandler } from \"@useago/sdk\";\n *\n * client.register(\n * withHandler(showToast, (args) => {\n * myToast(args.message as string);\n * return { shown: true };\n * })\n * );\n * ```\n */\nexport function withHandler<T extends ClientFunctionDefinition>(\n definition: T,\n handler: ClientFunctionHandler\n): T {\n return { ...definition, handler };\n}\n"],"mappings":";;;;;AA+BA,SAAgB,YAAe,SAAY,SAAoC;CAG7E,MAAM,UAAmC,UACpC,QAAQ,YACR,OAAO,iBAAiB,cAAc,eAAe,KAAA,KACtD,KAAA;CAEJ,IAAI,QAAQ;AAIZ,KAAI,WAAW,QACb,KAAI;EACF,MAAM,MAAM,QAAQ,QAAQ,QAAQ,IAAI;AACxC,MAAI,OAAO,KACT,SAAQ,KAAK,MAAM,IAAI;SAEnB;CAKV,MAAM,8BAAc,IAAI,KAAyB;CACjD,MAAM,eAAe,YAAY,SAAS,OAAO,GAAG,MAAM,CAAC;CAE3D,SAAS,eAAe;AACtB,MAAI,WAAW,QACb,KAAI;AACF,WAAQ,QAAQ,QAAQ,KAAK,KAAK,UAAU,MAAM,CAAC;UAC7C;;AAMZ,QAAO;EACL,WAAW;EACX,MAAM,SAAY;AAChB,WAAQ;AACR,iBAAc;AACd,WAAQ;;EAEV,YAAY,OAA2B;AACrC,eAAY,IAAI,GAAG;AACnB,gBAAa;AACX,gBAAY,OAAO,GAAG;;;EAG3B;;;;;;;;;;;;;;;;;;;;;;;;AC1DH,SAAgB,eACd,YAC0B;AAC1B,QAAO;;;;;;;;;;;;ACTT,SAAgB,UACd,QACA,UACY;AACZ,QAAO,GAAG,oBAAoB,SAAS;AACvC,cAAa,OAAO,IAAI,oBAAoB,SAAS;;;;;;;;;;;AAYvD,SAAgB,eACd,QACA,UACY;AACZ,QAAO,GAAG,iBAAiB,SAAS;AACpC,cAAa,OAAO,IAAI,iBAAiB,SAAS;;;;;AAMpD,SAAgB,eACd,QACA,UACY;AACZ,QAAO,GAAG,iBAAiB,SAAS;AACpC,cAAa,OAAO,IAAI,iBAAiB,SAAS;;;;;AAMpD,SAAgB,eACd,QACA,UACY;AACZ,QAAO,GAAG,iBAAiB,SAAS;AACpC,cAAa,OAAO,IAAI,iBAAiB,SAAS;;;;;AAMpD,SAAgB,WACd,QACA,UACY;AACZ,QAAO,GAAG,qBAAqB,SAAS;AACxC,cAAa,OAAO,IAAI,qBAAqB,SAAS;;;;;AAMxD,SAAgB,iBACd,QACA,UACY;AACZ,QAAO,GAAG,mBAAmB,SAAS;AACtC,cAAa,OAAO,IAAI,mBAAmB,SAAS;;;;;;;;;;;;AAatD,gBAAuB,oBACrB,QACA,SACA,SAOA;CAQA,MAAM,QAAuB,EAAE;CAC/B,IAAI,UAA+B;CACnC,IAAI,OAAO;CAEX,MAAM,QAAQ,UAAuB;AACnC,QAAM,KAAK,MAAM;AACjB,aAAW;;CAGb,MAAM,WAAW,SAA2C,KAAK;EAAE,MAAM;EAAS;EAAM,CAAC;CACzF,MAAM,WAAW,SAA2C,KAAK;EAAE,MAAM;EAAS;EAAM,CAAC;CACzF,MAAM,cAAc,SAAqB;AACvC,OAAK;GAAE,MAAM;GAAY;GAAM,CAAC;AAChC,SAAO;AACP,aAAW;;CAEb,MAAM,WAAW,SAA2C;AAC1D,OAAK;GAAE,MAAM;GAAS;GAAM,CAAC;AAC7B,SAAO;AACP,aAAW;;CAEb,MAAM,UAAU,SAAuB,KAAK;EAAE,MAAM;EAAY;EAAM,CAAC;AAEvE,QAAO,GAAG,iBAAiB,QAAQ;AACnC,QAAO,GAAG,iBAAiB,QAAQ;AACnC,QAAO,GAAG,oBAAoB,WAAW;AACzC,QAAO,GAAG,iBAAiB,QAAQ;AACnC,QAAO,GAAG,qBAAqB,OAAO;AAGtC,QAAO,YAAY,SAAS,QAAQ,CAAC,YAAY;AAC/C,SAAO;AACP,aAAW;GACX;AAEF,KAAI;AACF,SAAO,CAAC,QAAQ,MAAM,SAAS,EAC7B,KAAI,MAAM,SAAS,EACjB,OAAM,MAAM,OAAO;OACd;AACL,SAAM,IAAI,SAAe,MAAM;AAAE,cAAU;KAAK;AAChD,aAAU;;WAGN;AACR,SAAO,IAAI,iBAAiB,QAAQ;AACpC,SAAO,IAAI,iBAAiB,QAAQ;AACpC,SAAO,IAAI,oBAAoB,WAAW;AAC1C,SAAO,IAAI,iBAAiB,QAAQ;AACpC,SAAO,IAAI,qBAAqB,OAAO;;;;;;;;;;;;;;;;ACpJ3C,SAAgB,iBACd,WACkB;CAClB,IAAI;CACJ,IAAI;CACJ,IAAI;CACJ,IAAI;CACJ,IAAI;CACJ,IAAI;AAGJ,KAAI,OAAO,WAAW,eAAgB,OAA8C,KAAK;EACvF,MAAM,MAAO,OAA8C;AAC3D,YAAU,IAAI;AACd,aAAW,IAAI;AACf,UAAS,IAAI,SAAiC,IAAI;AAClD,eAAa,IAAI;AACjB,cAAY,IAAI;AAChB,YAAU,IAAI;;AAIhB,KAAI,OAAO,aAAa,aAAa;EACnC,MAAM,WAAW,SACf,SAAS,cAAc,cAAc,KAAK,IAAI,EAAE,aAAa,UAAU,IAAI,KAAA;AAE7E,YAAU,WAAW,QAAQ,eAAe;AAC5C,aAAW,YAAY,QAAQ,gBAAgB;AAC/C,UAAQ,SAAS,QAAQ,YAAY,IAAI,QAAQ,eAAe;AAChE,eAAa,cAAc,QAAQ,iBAAiB;AACpD,cAAY,aAAa,QAAQ,iBAAiB;;AAIpD,KAAI,OAAO,aAAa,aAAa;EACnC,MAAM,UAAU,CACd,SAAS,MACT,GAAG,MAAM,KAAK,SAAS,iBAAiB,4BAA4B,CAAC,CACtE,CAAC,OAAO,QAAQ;AAEjB,OAAK,MAAM,MAAM,SAAS;AACxB,OAAI,CAAC,GAAI;AACT,aAAU,WAAW,GAAG,aAAa,oBAAoB,IAAI,KAAA;AAC7D,cAAW,YAAY,GAAG,aAAa,qBAAqB,IAAI,KAAA;AAChE,WAAQ,SAAS,GAAG,aAAa,iBAAiB,IAAI,GAAG,aAAa,oBAAoB,IAAI,KAAA;AAC9F,gBAAa,cAAc,GAAG,aAAa,sBAAsB,IAAI,KAAA;AACrE,eAAY,aAAa,GAAG,aAAa,sBAAsB,IAAI,KAAA;;;AAKvE,WAAU,WAAW,WAAW;AAChC,YAAW,WAAW,YAAY;AAClC,SAAQ,WAAW,SAAS,WAAW,kBAAkB;AACzD,cAAa,WAAW,cAAc;AACtC,aAAY,WAAW,aAAa;AACpC,WAAU,WAAW,WAAW;CAChC,MAAM,QAAQ,WAAW;AAEzB,KAAI,CAAC,QACH,QAAO;AAGT,QAAO;EACL;EACA;EACA;EACA;EACA;EACA;EACA;EACD;;;;;;;;;;;;;;;;;;;;;;;;;;AA2BH,SAAgB,UAAU,WAA2C;CACnE,MAAM,SAAS,iBAAiB,UAAU;AAE1C,KAAI,CAAC,OACH,OAAM,IAAI,MACR,qIAED;AAGH,QAAO,IAAI,kBAAA,UAAU,OAAO;;;;;;;;;;;;;;;;;;;;;;ACnG9B,SAAgB,YACd,YACA,SACG;AACH,QAAO;EAAE,GAAG;EAAY;EAAS"}
package/dist/index.js.map DELETED
@@ -1 +0,0 @@
1
- {"version":3,"file":"index.js","names":[],"sources":["../src/state/createStore.ts","../src/functions/defineFunction.ts","../src/streaming/helpers.ts","../src/auto/createAgo.ts","../src/helpers/factory.ts"],"sourcesContent":["/**\n * A minimal observable store: one value, synchronous subscriptions, and\n * optional persistence via {@link PersistOptions} (localStorage by default).\n *\n * ```ts\n * const store = createStore({ count: 0 });\n * store.subscribe((state) => save(state));\n * store.set({ count: 1 }); // listeners fire synchronously\n *\n * const cart = createStore({ items: [] }, { key: \"cart\" }); // persisted\n * ```\n */\nexport interface Store<T> {\n /** Current state. */\n get(): T;\n /** Replace the state and notify subscribers synchronously. */\n set(next: T): void;\n /** Register a listener; returns a function that removes it. */\n subscribe(listener: (state: T) => void): () => void;\n}\n\n/** The slice of the Web Storage API that {@link createStore} relies on. */\ntype StorageLike = Pick<Storage, \"getItem\" | \"setItem\">;\n\nexport interface PersistOptions {\n /** Key under which the state is JSON-serialized. */\n key: string;\n /** Storage backend; defaults to `globalThis.localStorage`. */\n storage?: StorageLike;\n}\n\nexport function createStore<T>(initial: T, persist?: PersistOptions): Store<T> {\n // Resolve a storage backend lazily; absence (SSR, disabled storage) degrades\n // to a pure in-memory store rather than throwing.\n const storage: StorageLike | undefined = persist\n ? (persist.storage ??\n (typeof localStorage !== \"undefined\" ? localStorage : undefined))\n : undefined;\n\n let state = initial;\n\n // Restore a previous snapshot; disabled storage or malformed JSON keeps the\n // initial value.\n if (persist && storage) {\n try {\n const raw = storage.getItem(persist.key);\n if (raw != null) {\n state = JSON.parse(raw) as T;\n }\n } catch {\n /* ignore */\n }\n }\n\n const subscribers = new Set<(state: T) => void>();\n const notify = () => subscribers.forEach((fn) => fn(state));\n\n function persistState() {\n if (persist && storage) {\n try {\n storage.setItem(persist.key, JSON.stringify(state));\n } catch {\n /* ignore */\n }\n }\n }\n\n return {\n get: () => state,\n set: (next: T) => {\n state = next;\n persistState();\n notify();\n },\n subscribe: (fn: (state: T) => void) => {\n subscribers.add(fn);\n return () => {\n subscribers.delete(fn);\n };\n },\n };\n}\n","import type { ClientFunctionDefinition } from \"./types\";\n\n/**\n * Create a reusable function definition.\n * Returns the same object — this is an identity function for discoverability and type-checking.\n *\n * ```ts\n * // Define once, reuse anywhere\n * export const lookupOrder = defineFunction({\n * name: \"lookupOrder\",\n * description: \"Look up an order by ID\",\n * parameters: { type: \"object\", properties: { id: { type: \"string\" } }, required: [\"id\"] },\n * handler: async (args) => fetchOrder(args.id as string),\n * });\n *\n * // Register with client\n * client.registerFunction(lookupOrder);\n *\n * // Or use in React\n * useAgoFunction(lookupOrder.name, lookupOrder);\n * ```\n */\nexport function defineFunction(\n definition: ClientFunctionDefinition\n): ClientFunctionDefinition {\n return definition;\n}\n","import type { AgoClient } from \"../client/AgoClient\";\nimport type {\n AgoMessage,\n AgoClientEvents,\n ToolCallData,\n ClientFunctionInvocation,\n} from \"../client/types\";\n\n/**\n * Subscribe to complete messages with a simple callback. Returns an unsubscribe function.\n *\n * ```ts\n * const unsub = onMessage(client, (msg) => console.log(msg.content));\n * // later: unsub();\n * ```\n */\nexport function onMessage(\n client: AgoClient,\n callback: (message: AgoMessage) => void\n): () => void {\n client.on(\"message:complete\", callback);\n return () => client.off(\"message:complete\", callback);\n}\n\n/**\n * Subscribe to streaming text chunks.\n *\n * ```ts\n * onMessageChunk(client, ({ content }) => {\n * outputEl.textContent += content;\n * });\n * ```\n */\nexport function onMessageChunk(\n client: AgoClient,\n callback: (data: AgoClientEvents[\"message:chunk\"]) => void\n): () => void {\n client.on(\"message:chunk\", callback);\n return () => client.off(\"message:chunk\", callback);\n}\n\n/**\n * Subscribe to message start events.\n */\nexport function onMessageStart(\n client: AgoClient,\n callback: (data: AgoClientEvents[\"message:start\"]) => void\n): () => void {\n client.on(\"message:start\", callback);\n return () => client.off(\"message:start\", callback);\n}\n\n/**\n * Subscribe to message errors.\n */\nexport function onMessageError(\n client: AgoClient,\n callback: (data: AgoClientEvents[\"message:error\"]) => void\n): () => void {\n client.on(\"message:error\", callback);\n return () => client.off(\"message:error\", callback);\n}\n\n/**\n * Subscribe to tool call events.\n */\nexport function onToolCall(\n client: AgoClient,\n callback: (toolCall: ToolCallData) => void\n): () => void {\n client.on(\"toolCall:received\", callback);\n return () => client.off(\"toolCall:received\", callback);\n}\n\n/**\n * Subscribe to client function invocations.\n */\nexport function onFunctionInvoke(\n client: AgoClient,\n callback: (data: ClientFunctionInvocation) => void\n): () => void {\n client.on(\"function:invoke\", callback);\n return () => client.off(\"function:invoke\", callback);\n}\n\n/**\n * Send a message and iterate over chunks as an async generator.\n * Gives you full control over how you process the stream.\n *\n * ```ts\n * for await (const chunk of createMessageStream(client, \"Hello!\")) {\n * console.log(chunk.type, chunk.data);\n * }\n * ```\n */\nexport async function* createMessageStream(\n client: AgoClient,\n content: string,\n options?: { conversationId?: string; agentId?: string; files?: File[] }\n): AsyncGenerator<\n | { type: \"start\"; data: AgoClientEvents[\"message:start\"] }\n | { type: \"chunk\"; data: AgoClientEvents[\"message:chunk\"] }\n | { type: \"complete\"; data: AgoMessage }\n | { type: \"error\"; data: AgoClientEvents[\"message:error\"] }\n | { type: \"toolCall\"; data: ToolCallData }\n> {\n type StreamEvent =\n | { type: \"start\"; data: AgoClientEvents[\"message:start\"] }\n | { type: \"chunk\"; data: AgoClientEvents[\"message:chunk\"] }\n | { type: \"complete\"; data: AgoMessage }\n | { type: \"error\"; data: AgoClientEvents[\"message:error\"] }\n | { type: \"toolCall\"; data: ToolCallData };\n\n const queue: StreamEvent[] = [];\n let resolve: (() => void) | null = null;\n let done = false;\n\n const push = (event: StreamEvent) => {\n queue.push(event);\n resolve?.();\n };\n\n const onStart = (data: AgoClientEvents[\"message:start\"]) => push({ type: \"start\", data });\n const onChunk = (data: AgoClientEvents[\"message:chunk\"]) => push({ type: \"chunk\", data });\n const onComplete = (data: AgoMessage) => {\n push({ type: \"complete\", data });\n done = true;\n resolve?.();\n };\n const onError = (data: AgoClientEvents[\"message:error\"]) => {\n push({ type: \"error\", data });\n done = true;\n resolve?.();\n };\n const onTool = (data: ToolCallData) => push({ type: \"toolCall\", data });\n\n client.on(\"message:start\", onStart);\n client.on(\"message:chunk\", onChunk);\n client.on(\"message:complete\", onComplete);\n client.on(\"message:error\", onError);\n client.on(\"toolCall:received\", onTool);\n\n // Fire the request (don't await — we'll consume events via the generator)\n client.sendMessage(content, options).catch(() => {\n done = true;\n resolve?.();\n });\n\n try {\n while (!done || queue.length > 0) {\n if (queue.length > 0) {\n yield queue.shift()!;\n } else {\n await new Promise<void>((r) => { resolve = r; });\n resolve = null;\n }\n }\n } finally {\n client.off(\"message:start\", onStart);\n client.off(\"message:chunk\", onChunk);\n client.off(\"message:complete\", onComplete);\n client.off(\"message:error\", onError);\n client.off(\"toolCall:received\", onTool);\n }\n}\n","import { AgoClient } from \"../client/AgoClient\";\nimport type { AgoConfig } from \"../client/types\";\n\n/**\n * Auto-detect AGO configuration from the DOM environment.\n *\n * Checks (in order of priority):\n * 1. `window.AGO` global object (widget config)\n * 2. `<meta>` tags: `<meta name=\"ago-api-key\" content=\"...\">`\n * 3. `data-ago-*` attributes on `<body>` or `<script data-ago-api-key=\"...\">`\n * 4. Explicit overrides passed as argument\n *\n * Returns null if no API key can be found.\n */\nexport function autoDetectConfig(\n overrides?: Partial<AgoConfig>\n): AgoConfig | null {\n let baseUrl: string | undefined;\n let widgetId: string | undefined;\n let agent: string | undefined;\n let permission: string | undefined;\n let userEmail: string | undefined;\n let userJwt: string | undefined;\n\n // 1. window.AGO (widget config format)\n if (typeof window !== \"undefined\" && (window as unknown as Record<string, unknown>).AGO) {\n const ago = (window as unknown as Record<string, unknown>).AGO as Record<string, unknown>;\n baseUrl = ago.basepath as string | undefined;\n widgetId = ago.widgetId as string | undefined;\n agent = (ago.agent as string | undefined) || (ago.defaultAgent as string | undefined);\n permission = ago.permission as string | undefined;\n userEmail = ago.email as string | undefined;\n userJwt = ago.jwt as string | undefined;\n }\n\n // 2. Meta tags\n if (typeof document !== \"undefined\") {\n const getMeta = (name: string) =>\n document.querySelector(`meta[name=\"${name}\"]`)?.getAttribute(\"content\") || undefined;\n\n baseUrl = baseUrl || getMeta(\"ago-base-url\");\n widgetId = widgetId || getMeta(\"ago-widget-id\");\n agent = agent || getMeta(\"ago-agent\") || getMeta(\"ago-agent-id\");\n permission = permission || getMeta(\"ago-permission\");\n userEmail = userEmail || getMeta(\"ago-user-email\");\n }\n\n // 3. data-ago-* attributes on body or script tags\n if (typeof document !== \"undefined\") {\n const sources = [\n document.body,\n ...Array.from(document.querySelectorAll(\"script[data-ago-base-url]\")),\n ].filter(Boolean);\n\n for (const el of sources) {\n if (!el) continue;\n baseUrl = baseUrl || el.getAttribute(\"data-ago-base-url\") || undefined;\n widgetId = widgetId || el.getAttribute(\"data-ago-widget-id\") || undefined;\n agent = agent || el.getAttribute(\"data-ago-agent\") || el.getAttribute(\"data-ago-agent-id\") || undefined;\n permission = permission || el.getAttribute(\"data-ago-permission\") || undefined;\n userEmail = userEmail || el.getAttribute(\"data-ago-user-email\") || undefined;\n }\n }\n\n // 4. Apply overrides\n baseUrl = overrides?.baseUrl || baseUrl;\n widgetId = overrides?.widgetId || widgetId;\n agent = overrides?.agent || overrides?.defaultAgentId || agent;\n permission = overrides?.permission || permission;\n userEmail = overrides?.userEmail || userEmail;\n userJwt = overrides?.userJwt || userJwt;\n const debug = overrides?.debug;\n\n if (!baseUrl) {\n return null;\n }\n\n return {\n baseUrl,\n widgetId,\n agent,\n permission,\n userEmail,\n userJwt,\n debug,\n };\n}\n\n/**\n * Create an AgoClient with zero configuration.\n * Auto-detects config from window.AGO, meta tags, and data-ago-* attributes.\n *\n * ```html\n * <!-- In your HTML -->\n * <meta name=\"ago-base-url\" content=\"https://YOUR-DOMAIN.useago.com\">\n *\n * <!-- Or on a script tag -->\n * <script src=\"app.js\" data-ago-base-url=\"https://YOUR-DOMAIN.useago.com\"></script>\n * ```\n *\n * ```ts\n * import { createAgo } from \"@useago/sdk\";\n *\n * // Zero config — picks up from DOM\n * const client = createAgo();\n *\n * // Or with partial overrides\n * const client = createAgo({ debug: true });\n * ```\n *\n * Throws if no base URL can be detected.\n */\nexport function createAgo(overrides?: Partial<AgoConfig>): AgoClient {\n const config = autoDetectConfig(overrides);\n\n if (!config) {\n throw new Error(\n \"createAgo(): could not detect AGO configuration. \" +\n \"Set window.AGO, add <meta name=\\\"ago-base-url\\\">, or pass { baseUrl } explicitly.\"\n );\n }\n\n return new AgoClient(config);\n}\n","import type {\n ClientFunctionDefinition,\n ClientFunctionHandler,\n} from \"../functions/types\";\n\n/**\n * Attach a handler to a pre-built function definition.\n *\n * Pre-built helpers (`showToast`, `trackEvent`, ...) ship with a no-op or\n * console-logging default handler. Use `withHandler` to wire them up to\n * your actual implementation without mutating the original definition.\n *\n * ```ts\n * import { showToast, withHandler } from \"@useago/sdk\";\n *\n * client.register(\n * withHandler(showToast, (args) => {\n * myToast(args.message as string);\n * return { shown: true };\n * })\n * );\n * ```\n */\nexport function withHandler<T extends ClientFunctionDefinition>(\n definition: T,\n handler: ClientFunctionHandler\n): T {\n return { ...definition, handler };\n}\n"],"mappings":"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"}
@@ -1,12 +0,0 @@
1
- import React from "react";
2
- export interface ChatInputProps {
3
- onSend: (message: string, files?: File[]) => void;
4
- disabled?: boolean;
5
- placeholder?: string;
6
- allowFiles?: boolean;
7
- className?: string;
8
- }
9
- /**
10
- * Chat input component with send button
11
- */
12
- export declare const ChatInput: React.FC<ChatInputProps>;
@@ -1,35 +0,0 @@
1
- import React from "react";
2
- import type { AgoClient } from "../../client/AgoClient";
3
- export interface ChatWidgetProps {
4
- /** The AGO client instance. If omitted, reads from AgoProvider context. */
5
- client?: AgoClient;
6
- /** Initial conversation ID */
7
- conversationId?: string;
8
- /** Widget title */
9
- title?: string;
10
- /** Welcome message shown when no messages */
11
- welcomeMessage?: string;
12
- /** Input placeholder */
13
- placeholder?: string;
14
- /** Enable file attachments */
15
- allowFiles?: boolean;
16
- /** Widget height */
17
- height?: string | number;
18
- /** URL of a logo to display in the header */
19
- logoUrl?: string;
20
- /** Show the agent name above assistant messages. Defaults to `true`. */
21
- showAgentName?: boolean;
22
- /** Additional CSS class */
23
- className?: string;
24
- /** Callback when a message is sent */
25
- onMessageSent?: (content: string) => void;
26
- /** Callback when a message is received */
27
- onMessageReceived?: (message: {
28
- id: string;
29
- content: string;
30
- }) => void;
31
- }
32
- /**
33
- * Pre-built chat widget component
34
- */
35
- export declare const ChatWidget: React.FC<ChatWidgetProps>;
@@ -1,12 +0,0 @@
1
- import React from "react";
2
- export interface MarkdownProps {
3
- /** Raw markdown string to render. */
4
- content: string;
5
- }
6
- /**
7
- * Renders markdown content with GitHub-flavored markdown support
8
- * (tables, task lists, strikethrough, autolinks) and inline-styled
9
- * element renderers. Used by {@link Message} but exported so consumers
10
- * building a custom chat UI can render assistant content the same way.
11
- */
12
- export declare const Markdown: React.FC<MarkdownProps>;
@@ -1,9 +0,0 @@
1
- import React from "react";
2
- import type { AgoMessage } from "../../client/types";
3
- export interface MessageProps {
4
- message: AgoMessage;
5
- className?: string;
6
- /** Show the agent name above assistant messages. Defaults to `true`. */
7
- showAgentName?: boolean;
8
- }
9
- export declare const Message: React.FC<MessageProps>;
@@ -1,8 +0,0 @@
1
- export { ChatWidget } from "./ChatWidget";
2
- export type { ChatWidgetProps } from "./ChatWidget";
3
- export { Message } from "./Message";
4
- export type { MessageProps } from "./Message";
5
- export { Markdown } from "./Markdown";
6
- export type { MarkdownProps } from "./Markdown";
7
- export { ChatInput } from "./ChatInput";
8
- export type { ChatInputProps } from "./ChatInput";