@useago/sdk 0.3.0 → 0.3.2

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 (80) hide show
  1. package/README.md +2 -0
  2. package/dist/AgoClient-DPZdN5n2.js +905 -0
  3. package/dist/AgoClient-DPZdN5n2.js.map +1 -0
  4. package/dist/AgoClient-wMVUQqCD.cjs +976 -0
  5. package/dist/AgoClient-wMVUQqCD.cjs.map +1 -0
  6. package/dist/angular.cjs +138 -100
  7. package/dist/angular.cjs.map +1 -1
  8. package/dist/angular.d.ts +1 -0
  9. package/dist/angular.js +139 -103
  10. package/dist/angular.js.map +1 -1
  11. package/dist/client/AgoClient.d.ts +56 -0
  12. package/dist/client/types.d.ts +5 -1
  13. package/dist/createMockClient-Ci_N2tH8.cjs +104 -0
  14. package/dist/createMockClient-Ci_N2tH8.cjs.map +1 -0
  15. package/dist/createMockClient-U0ae_AYy.js +99 -0
  16. package/dist/createMockClient-U0ae_AYy.js.map +1 -0
  17. package/dist/devtools/index.d.ts +2 -0
  18. package/dist/devtools/initDevPanel.d.ts +15 -0
  19. package/dist/devtools.cjs +182 -0
  20. package/dist/devtools.cjs.map +1 -0
  21. package/dist/devtools.d.ts +2 -0
  22. package/dist/devtools.js +181 -0
  23. package/dist/devtools.js.map +1 -0
  24. package/dist/functions--c6lx3ic.cjs +480 -0
  25. package/dist/functions--c6lx3ic.cjs.map +1 -0
  26. package/dist/functions-C9F1dnmh.js +398 -0
  27. package/dist/functions-C9F1dnmh.js.map +1 -0
  28. package/dist/helpers/factory.d.ts +20 -0
  29. package/dist/helpers.cjs +14 -305
  30. package/dist/helpers.d.ts +1 -0
  31. package/dist/helpers.js +2 -306
  32. package/dist/index.cjs +316 -151
  33. package/dist/index.cjs.map +1 -1
  34. package/dist/index.d.ts +14 -9
  35. package/dist/index.js +289 -163
  36. package/dist/index.js.map +1 -1
  37. package/dist/react/components/ChatWidget.d.ts +2 -0
  38. package/dist/react/components/Markdown.d.ts +12 -0
  39. package/dist/react/components/Message.d.ts +2 -0
  40. package/dist/react/components/index.d.ts +2 -0
  41. package/dist/react/context/AgoContext.d.ts +29 -3
  42. package/dist/react/context/index.d.ts +1 -1
  43. package/dist/react/hooks/index.d.ts +1 -0
  44. package/dist/react/hooks/useAgoContext.d.ts +40 -0
  45. package/dist/react/hooks/useAgoFunction.d.ts +14 -2
  46. package/dist/react/hooks/useAgoStore.d.ts +17 -0
  47. package/dist/react/index.d.ts +5 -1
  48. package/dist/react.cjs +22130 -10274
  49. package/dist/react.cjs.map +1 -1
  50. package/dist/react.d.ts +1 -0
  51. package/dist/react.js +22128 -10289
  52. package/dist/react.js.map +1 -1
  53. package/dist/rolldown-runtime-BqCkTl7Q.cjs +50 -0
  54. package/dist/rolldown-runtime-CNZpIYwj.js +33 -0
  55. package/dist/state/ClientContextRegistry.d.ts +64 -0
  56. package/dist/state/createStore.d.ts +30 -0
  57. package/dist/vue/composables/useAgoStore.d.ts +18 -0
  58. package/dist/vue/index.d.ts +1 -0
  59. package/dist/vue.cjs +312 -208
  60. package/dist/vue.cjs.map +1 -1
  61. package/dist/vue.d.ts +1 -0
  62. package/dist/vue.js +311 -218
  63. package/dist/vue.js.map +1 -1
  64. package/dist/widget/types.d.ts +1 -0
  65. package/dist/widget.cjs +0 -2
  66. package/dist/widget.d.ts +1 -0
  67. package/dist/widget.js +0 -2
  68. package/package.json +6 -1
  69. package/dist/AgoClient-B-SONi_K.js +0 -861
  70. package/dist/AgoClient-B-SONi_K.js.map +0 -1
  71. package/dist/AgoClient-xTWfMWKh.cjs +0 -860
  72. package/dist/AgoClient-xTWfMWKh.cjs.map +0 -1
  73. package/dist/createMockClient-B1DcBiIK.js +0 -94
  74. package/dist/createMockClient-B1DcBiIK.js.map +0 -1
  75. package/dist/createMockClient-BqNSJUu4.cjs +0 -93
  76. package/dist/createMockClient-BqNSJUu4.cjs.map +0 -1
  77. package/dist/helpers.cjs.map +0 -1
  78. package/dist/helpers.js.map +0 -1
  79. package/dist/widget.cjs.map +0 -1
  80. package/dist/widget.js.map +0 -1
package/dist/index.cjs CHANGED
@@ -1,182 +1,347 @@
1
- "use strict";
2
1
  Object.defineProperty(exports, Symbol.toStringTag, { value: "Module" });
3
- const AgoClient = require("./AgoClient-xTWfMWKh.cjs");
4
- const createMockClient = require("./createMockClient-BqNSJUu4.cjs");
5
- const helpers = require("./helpers.cjs");
2
+ const require_AgoClient = require("./AgoClient-wMVUQqCD.cjs");
3
+ const require_createMockClient = require("./createMockClient-Ci_N2tH8.cjs");
4
+ const require_functions = require("./functions--c6lx3ic.cjs");
5
+ //#region src/state/createStore.ts
6
+ function createStore(initial, persist) {
7
+ const storage = persist ? persist.storage ?? (typeof localStorage !== "undefined" ? localStorage : void 0) : void 0;
8
+ let state = initial;
9
+ if (persist && storage) try {
10
+ const raw = storage.getItem(persist.key);
11
+ if (raw != null) state = JSON.parse(raw);
12
+ } catch {}
13
+ const subscribers = /* @__PURE__ */ new Set();
14
+ const notify = () => subscribers.forEach((fn) => fn(state));
15
+ function persistState() {
16
+ if (persist && storage) try {
17
+ storage.setItem(persist.key, JSON.stringify(state));
18
+ } catch {}
19
+ }
20
+ return {
21
+ get: () => state,
22
+ set: (next) => {
23
+ state = next;
24
+ persistState();
25
+ notify();
26
+ },
27
+ subscribe: (fn) => {
28
+ subscribers.add(fn);
29
+ return () => {
30
+ subscribers.delete(fn);
31
+ };
32
+ }
33
+ };
34
+ }
35
+ //#endregion
36
+ //#region src/functions/defineFunction.ts
37
+ /**
38
+ * Create a reusable function definition.
39
+ * Returns the same object — this is an identity function for discoverability and type-checking.
40
+ *
41
+ * ```ts
42
+ * // Define once, reuse anywhere
43
+ * export const lookupOrder = defineFunction({
44
+ * name: "lookupOrder",
45
+ * description: "Look up an order by ID",
46
+ * parameters: { type: "object", properties: { id: { type: "string" } }, required: ["id"] },
47
+ * handler: async (args) => fetchOrder(args.id as string),
48
+ * });
49
+ *
50
+ * // Register with client
51
+ * client.registerFunction(lookupOrder);
52
+ *
53
+ * // Or use in React
54
+ * useAgoFunction(lookupOrder.name, lookupOrder);
55
+ * ```
56
+ */
6
57
  function defineFunction(definition) {
7
- return definition;
58
+ return definition;
8
59
  }
60
+ //#endregion
61
+ //#region src/streaming/helpers.ts
62
+ /**
63
+ * Subscribe to complete messages with a simple callback. Returns an unsubscribe function.
64
+ *
65
+ * ```ts
66
+ * const unsub = onMessage(client, (msg) => console.log(msg.content));
67
+ * // later: unsub();
68
+ * ```
69
+ */
9
70
  function onMessage(client, callback) {
10
- client.on("message:complete", callback);
11
- return () => client.off("message:complete", callback);
71
+ client.on("message:complete", callback);
72
+ return () => client.off("message:complete", callback);
12
73
  }
74
+ /**
75
+ * Subscribe to streaming text chunks.
76
+ *
77
+ * ```ts
78
+ * onMessageChunk(client, ({ content }) => {
79
+ * outputEl.textContent += content;
80
+ * });
81
+ * ```
82
+ */
13
83
  function onMessageChunk(client, callback) {
14
- client.on("message:chunk", callback);
15
- return () => client.off("message:chunk", callback);
84
+ client.on("message:chunk", callback);
85
+ return () => client.off("message:chunk", callback);
16
86
  }
87
+ /**
88
+ * Subscribe to message start events.
89
+ */
17
90
  function onMessageStart(client, callback) {
18
- client.on("message:start", callback);
19
- return () => client.off("message:start", callback);
91
+ client.on("message:start", callback);
92
+ return () => client.off("message:start", callback);
20
93
  }
94
+ /**
95
+ * Subscribe to message errors.
96
+ */
21
97
  function onMessageError(client, callback) {
22
- client.on("message:error", callback);
23
- return () => client.off("message:error", callback);
98
+ client.on("message:error", callback);
99
+ return () => client.off("message:error", callback);
24
100
  }
101
+ /**
102
+ * Subscribe to tool call events.
103
+ */
25
104
  function onToolCall(client, callback) {
26
- client.on("toolCall:received", callback);
27
- return () => client.off("toolCall:received", callback);
105
+ client.on("toolCall:received", callback);
106
+ return () => client.off("toolCall:received", callback);
28
107
  }
108
+ /**
109
+ * Subscribe to client function invocations.
110
+ */
29
111
  function onFunctionInvoke(client, callback) {
30
- client.on("function:invoke", callback);
31
- return () => client.off("function:invoke", callback);
112
+ client.on("function:invoke", callback);
113
+ return () => client.off("function:invoke", callback);
32
114
  }
115
+ /**
116
+ * Send a message and iterate over chunks as an async generator.
117
+ * Gives you full control over how you process the stream.
118
+ *
119
+ * ```ts
120
+ * for await (const chunk of createMessageStream(client, "Hello!")) {
121
+ * console.log(chunk.type, chunk.data);
122
+ * }
123
+ * ```
124
+ */
33
125
  async function* createMessageStream(client, content, options) {
34
- const queue = [];
35
- let resolve = null;
36
- let done = false;
37
- const push = (event) => {
38
- queue.push(event);
39
- resolve == null ? void 0 : resolve();
40
- };
41
- const onStart = (data) => push({ type: "start", data });
42
- const onChunk = (data) => push({ type: "chunk", data });
43
- const onComplete = (data) => {
44
- push({ type: "complete", data });
45
- done = true;
46
- resolve == null ? void 0 : resolve();
47
- };
48
- const onError = (data) => {
49
- push({ type: "error", data });
50
- done = true;
51
- resolve == null ? void 0 : resolve();
52
- };
53
- const onTool = (data) => push({ type: "toolCall", data });
54
- client.on("message:start", onStart);
55
- client.on("message:chunk", onChunk);
56
- client.on("message:complete", onComplete);
57
- client.on("message:error", onError);
58
- client.on("toolCall:received", onTool);
59
- client.sendMessage(content, options).catch(() => {
60
- done = true;
61
- resolve == null ? void 0 : resolve();
62
- });
63
- try {
64
- while (!done || queue.length > 0) {
65
- if (queue.length > 0) {
66
- yield queue.shift();
67
- } else {
68
- await new Promise((r) => {
69
- resolve = r;
70
- });
71
- resolve = null;
72
- }
73
- }
74
- } finally {
75
- client.off("message:start", onStart);
76
- client.off("message:chunk", onChunk);
77
- client.off("message:complete", onComplete);
78
- client.off("message:error", onError);
79
- client.off("toolCall:received", onTool);
80
- }
126
+ const queue = [];
127
+ let resolve = null;
128
+ let done = false;
129
+ const push = (event) => {
130
+ queue.push(event);
131
+ resolve?.();
132
+ };
133
+ const onStart = (data) => push({
134
+ type: "start",
135
+ data
136
+ });
137
+ const onChunk = (data) => push({
138
+ type: "chunk",
139
+ data
140
+ });
141
+ const onComplete = (data) => {
142
+ push({
143
+ type: "complete",
144
+ data
145
+ });
146
+ done = true;
147
+ resolve?.();
148
+ };
149
+ const onError = (data) => {
150
+ push({
151
+ type: "error",
152
+ data
153
+ });
154
+ done = true;
155
+ resolve?.();
156
+ };
157
+ const onTool = (data) => push({
158
+ type: "toolCall",
159
+ data
160
+ });
161
+ client.on("message:start", onStart);
162
+ client.on("message:chunk", onChunk);
163
+ client.on("message:complete", onComplete);
164
+ client.on("message:error", onError);
165
+ client.on("toolCall:received", onTool);
166
+ client.sendMessage(content, options).catch(() => {
167
+ done = true;
168
+ resolve?.();
169
+ });
170
+ try {
171
+ while (!done || queue.length > 0) if (queue.length > 0) yield queue.shift();
172
+ else {
173
+ await new Promise((r) => {
174
+ resolve = r;
175
+ });
176
+ resolve = null;
177
+ }
178
+ } finally {
179
+ client.off("message:start", onStart);
180
+ client.off("message:chunk", onChunk);
181
+ client.off("message:complete", onComplete);
182
+ client.off("message:error", onError);
183
+ client.off("toolCall:received", onTool);
184
+ }
81
185
  }
186
+ //#endregion
187
+ //#region src/auto/createAgo.ts
188
+ /**
189
+ * Auto-detect AGO configuration from the DOM environment.
190
+ *
191
+ * Checks (in order of priority):
192
+ * 1. `window.AGO` global object (widget config)
193
+ * 2. `<meta>` tags: `<meta name="ago-api-key" content="...">`
194
+ * 3. `data-ago-*` attributes on `<body>` or `<script data-ago-api-key="...">`
195
+ * 4. Explicit overrides passed as argument
196
+ *
197
+ * Returns null if no API key can be found.
198
+ */
82
199
  function autoDetectConfig(overrides) {
83
- let baseUrl;
84
- let widgetId;
85
- let defaultAgentId;
86
- let userEmail;
87
- let userJwt;
88
- let debug;
89
- if (typeof window !== "undefined" && window.AGO) {
90
- const ago = window.AGO;
91
- baseUrl = ago.basepath;
92
- widgetId = ago.widgetId;
93
- defaultAgentId = ago.defaultAgent;
94
- userEmail = ago.email;
95
- userJwt = ago.jwt;
96
- }
97
- if (typeof document !== "undefined") {
98
- const getMeta = (name) => {
99
- var _a;
100
- return ((_a = document.querySelector(`meta[name="${name}"]`)) == null ? void 0 : _a.getAttribute("content")) || void 0;
101
- };
102
- baseUrl = baseUrl || getMeta("ago-base-url");
103
- widgetId = widgetId || getMeta("ago-widget-id");
104
- defaultAgentId = defaultAgentId || getMeta("ago-agent-id");
105
- userEmail = userEmail || getMeta("ago-user-email");
106
- }
107
- if (typeof document !== "undefined") {
108
- const sources = [
109
- document.body,
110
- ...Array.from(document.querySelectorAll("script[data-ago-base-url]"))
111
- ].filter(Boolean);
112
- for (const el of sources) {
113
- if (!el) continue;
114
- baseUrl = baseUrl || el.getAttribute("data-ago-base-url") || void 0;
115
- widgetId = widgetId || el.getAttribute("data-ago-widget-id") || void 0;
116
- defaultAgentId = defaultAgentId || el.getAttribute("data-ago-agent-id") || void 0;
117
- userEmail = userEmail || el.getAttribute("data-ago-user-email") || void 0;
118
- }
119
- }
120
- baseUrl = (overrides == null ? void 0 : overrides.baseUrl) || baseUrl;
121
- widgetId = (overrides == null ? void 0 : overrides.widgetId) || widgetId;
122
- defaultAgentId = (overrides == null ? void 0 : overrides.defaultAgentId) || defaultAgentId;
123
- userEmail = (overrides == null ? void 0 : overrides.userEmail) || userEmail;
124
- userJwt = (overrides == null ? void 0 : overrides.userJwt) || userJwt;
125
- debug = (overrides == null ? void 0 : overrides.debug) ?? debug;
126
- if (!baseUrl) {
127
- return null;
128
- }
129
- return {
130
- baseUrl,
131
- widgetId,
132
- defaultAgentId,
133
- userEmail,
134
- userJwt,
135
- debug
136
- };
200
+ let baseUrl;
201
+ let widgetId;
202
+ let agent;
203
+ let permission;
204
+ let userEmail;
205
+ let userJwt;
206
+ if (typeof window !== "undefined" && window.AGO) {
207
+ const ago = window.AGO;
208
+ baseUrl = ago.basepath;
209
+ widgetId = ago.widgetId;
210
+ agent = ago.agent || ago.defaultAgent;
211
+ permission = ago.permission;
212
+ userEmail = ago.email;
213
+ userJwt = ago.jwt;
214
+ }
215
+ if (typeof document !== "undefined") {
216
+ const getMeta = (name) => document.querySelector(`meta[name="${name}"]`)?.getAttribute("content") || void 0;
217
+ baseUrl = baseUrl || getMeta("ago-base-url");
218
+ widgetId = widgetId || getMeta("ago-widget-id");
219
+ agent = agent || getMeta("ago-agent") || getMeta("ago-agent-id");
220
+ permission = permission || getMeta("ago-permission");
221
+ userEmail = userEmail || getMeta("ago-user-email");
222
+ }
223
+ if (typeof document !== "undefined") {
224
+ const sources = [document.body, ...Array.from(document.querySelectorAll("script[data-ago-base-url]"))].filter(Boolean);
225
+ for (const el of sources) {
226
+ if (!el) continue;
227
+ baseUrl = baseUrl || el.getAttribute("data-ago-base-url") || void 0;
228
+ widgetId = widgetId || el.getAttribute("data-ago-widget-id") || void 0;
229
+ agent = agent || el.getAttribute("data-ago-agent") || el.getAttribute("data-ago-agent-id") || void 0;
230
+ permission = permission || el.getAttribute("data-ago-permission") || void 0;
231
+ userEmail = userEmail || el.getAttribute("data-ago-user-email") || void 0;
232
+ }
233
+ }
234
+ baseUrl = overrides?.baseUrl || baseUrl;
235
+ widgetId = overrides?.widgetId || widgetId;
236
+ agent = overrides?.agent || overrides?.defaultAgentId || agent;
237
+ permission = overrides?.permission || permission;
238
+ userEmail = overrides?.userEmail || userEmail;
239
+ userJwt = overrides?.userJwt || userJwt;
240
+ const debug = overrides?.debug;
241
+ if (!baseUrl) return null;
242
+ return {
243
+ baseUrl,
244
+ widgetId,
245
+ agent,
246
+ permission,
247
+ userEmail,
248
+ userJwt,
249
+ debug
250
+ };
137
251
  }
252
+ /**
253
+ * Create an AgoClient with zero configuration.
254
+ * Auto-detects config from window.AGO, meta tags, and data-ago-* attributes.
255
+ *
256
+ * ```html
257
+ * <!-- In your HTML -->
258
+ * <meta name="ago-base-url" content="https://YOUR-DOMAIN.useago.com">
259
+ *
260
+ * <!-- Or on a script tag -->
261
+ * <script src="app.js" data-ago-base-url="https://YOUR-DOMAIN.useago.com"><\/script>
262
+ * ```
263
+ *
264
+ * ```ts
265
+ * import { createAgo } from "@useago/sdk";
266
+ *
267
+ * // Zero config — picks up from DOM
268
+ * const client = createAgo();
269
+ *
270
+ * // Or with partial overrides
271
+ * const client = createAgo({ debug: true });
272
+ * ```
273
+ *
274
+ * Throws if no base URL can be detected.
275
+ */
138
276
  function createAgo(overrides) {
139
- const config = autoDetectConfig(overrides);
140
- if (!config) {
141
- throw new Error(
142
- 'createAgo(): could not detect AGO configuration. Set window.AGO, add <meta name="ago-base-url">, or pass { baseUrl } explicitly.'
143
- );
144
- }
145
- return new AgoClient.AgoClient(config);
277
+ const config = autoDetectConfig(overrides);
278
+ if (!config) throw new Error("createAgo(): could not detect AGO configuration. Set window.AGO, add <meta name=\"ago-base-url\">, or pass { baseUrl } explicitly.");
279
+ return new require_AgoClient.AgoClient(config);
280
+ }
281
+ //#endregion
282
+ //#region src/helpers/factory.ts
283
+ /**
284
+ * Attach a handler to a pre-built function definition.
285
+ *
286
+ * Pre-built helpers (`showToast`, `trackEvent`, ...) ship with a no-op or
287
+ * console-logging default handler. Use `withHandler` to wire them up to
288
+ * your actual implementation without mutating the original definition.
289
+ *
290
+ * ```ts
291
+ * import { showToast, withHandler } from "@useago/sdk";
292
+ *
293
+ * client.register(
294
+ * withHandler(showToast, (args) => {
295
+ * myToast(args.message as string);
296
+ * return { shown: true };
297
+ * })
298
+ * );
299
+ * ```
300
+ */
301
+ function withHandler(definition, handler) {
302
+ return {
303
+ ...definition,
304
+ handler
305
+ };
146
306
  }
147
- exports.AgoApiError = AgoClient.AgoApiError;
148
- exports.AgoClient = AgoClient.AgoClient;
149
- exports.AgoError = AgoClient.AgoError;
150
- exports.AgoFunctionError = AgoClient.AgoFunctionError;
151
- exports.AgoNetworkError = AgoClient.AgoNetworkError;
152
- exports.AgoStreamError = AgoClient.AgoStreamError;
153
- exports.EventEmitter = AgoClient.EventEmitter;
154
- exports.FunctionRegistry = AgoClient.FunctionRegistry;
155
- exports.SSEHandler = AgoClient.SSEHandler;
156
- exports.isStreamNetworkError = AgoClient.isStreamNetworkError;
157
- exports.logger = AgoClient.logger;
158
- exports.createMockClient = createMockClient.createMockClient;
159
- exports.copyToClipboard = helpers.copyToClipboard;
160
- exports.getLocalStorage = helpers.getLocalStorage;
161
- exports.getUserLocation = helpers.getUserLocation;
162
- exports.highlightElement = helpers.highlightElement;
163
- exports.openUrl = helpers.openUrl;
164
- exports.scrollToElement = helpers.scrollToElement;
165
- exports.setLocalStorage = helpers.setLocalStorage;
166
- exports.setTheme = helpers.setTheme;
167
- exports.showConfirmDialog = helpers.showConfirmDialog;
168
- exports.showNotification = helpers.showNotification;
169
- exports.showToast = helpers.showToast;
170
- exports.submitForm = helpers.submitForm;
171
- exports.trackEvent = helpers.trackEvent;
307
+ //#endregion
308
+ exports.AgoApiError = require_AgoClient.AgoApiError;
309
+ exports.AgoClient = require_AgoClient.AgoClient;
310
+ exports.AgoError = require_AgoClient.AgoError;
311
+ exports.AgoFunctionError = require_AgoClient.AgoFunctionError;
312
+ exports.AgoNetworkError = require_AgoClient.AgoNetworkError;
313
+ exports.AgoStreamError = require_AgoClient.AgoStreamError;
314
+ exports.ClientContextRegistry = require_AgoClient.ClientContextRegistry;
315
+ exports.EventEmitter = require_AgoClient.EventEmitter;
316
+ exports.FunctionRegistry = require_AgoClient.FunctionRegistry;
317
+ exports.SSEHandler = require_AgoClient.SSEHandler;
172
318
  exports.autoDetectConfig = autoDetectConfig;
319
+ exports.copyToClipboard = require_functions.copyToClipboard;
173
320
  exports.createAgo = createAgo;
174
321
  exports.createMessageStream = createMessageStream;
322
+ exports.createMockClient = require_createMockClient.createMockClient;
323
+ exports.createStore = createStore;
175
324
  exports.defineFunction = defineFunction;
325
+ exports.getLocalStorage = require_functions.getLocalStorage;
326
+ exports.getUserLocation = require_functions.getUserLocation;
327
+ exports.highlightElement = require_functions.highlightElement;
328
+ exports.isStreamNetworkError = require_AgoClient.isStreamNetworkError;
329
+ exports.logger = require_AgoClient.logger;
176
330
  exports.onFunctionInvoke = onFunctionInvoke;
177
331
  exports.onMessage = onMessage;
178
332
  exports.onMessageChunk = onMessageChunk;
179
333
  exports.onMessageError = onMessageError;
180
334
  exports.onMessageStart = onMessageStart;
181
335
  exports.onToolCall = onToolCall;
182
- //# sourceMappingURL=index.cjs.map
336
+ exports.openUrl = require_functions.openUrl;
337
+ exports.scrollToElement = require_functions.scrollToElement;
338
+ exports.setLocalStorage = require_functions.setLocalStorage;
339
+ exports.setTheme = require_functions.setTheme;
340
+ exports.showConfirmDialog = require_functions.showConfirmDialog;
341
+ exports.showNotification = require_functions.showNotification;
342
+ exports.showToast = require_functions.showToast;
343
+ exports.submitForm = require_functions.submitForm;
344
+ exports.trackEvent = require_functions.trackEvent;
345
+ exports.withHandler = withHandler;
346
+
347
+ //# sourceMappingURL=index.cjs.map
@@ -1 +1 @@
1
- {"version":3,"file":"index.cjs","sources":["../src/functions/defineFunction.ts","../src/streaming/helpers.ts","../src/auto/createAgo.ts"],"sourcesContent":["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 defaultAgentId: string | undefined;\n let userEmail: string | undefined;\n let userJwt: string | undefined;\n let debug: boolean | 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 defaultAgentId = ago.defaultAgent 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 defaultAgentId = defaultAgentId || getMeta(\"ago-agent-id\");\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 defaultAgentId = defaultAgentId || el.getAttribute(\"data-ago-agent-id\") || 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 defaultAgentId = overrides?.defaultAgentId || defaultAgentId;\n userEmail = overrides?.userEmail || userEmail;\n userJwt = overrides?.userJwt || userJwt;\n debug = overrides?.debug ?? debug;\n\n if (!baseUrl) {\n return null;\n }\n\n return {\n baseUrl,\n widgetId,\n defaultAgentId,\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"],"names":["AgoClient"],"mappings":"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"}
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":"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"}
package/dist/index.d.ts CHANGED
@@ -1,15 +1,20 @@
1
1
  export { AgoClient } from "./client/AgoClient";
2
- export type { AgoConfig, SendMessageOptions, AgoMessage, Conversation, AgoAgent, AgoSource, ToolCallData, ToolCallType, FormSchema, FormField, FunctionSchema, ClientFunction, FunctionDefinition, ClientFunctionInvocation, AgoClientEvents, AgoEventName, AgoEventHandler, MessageStatus, SSEChunkData, } from "./client/types";
3
- export { AgoError, AgoApiError, AgoNetworkError, AgoStreamError, AgoFunctionError, } from "./client/errors";
4
- export { FunctionRegistry } from "./functions/FunctionRegistry";
2
+ export type { AgoAgent, AgoClientEvents, AgoConfig, AgoEventHandler, AgoEventName, AgoMessage, AgoSource, ClientFunction, ClientFunctionInvocation, Conversation, FormField, FormSchema, FunctionDefinition, FunctionSchema, MessageStatus, SendMessageOptions, SSEChunkData, ToolCallData, ToolCallType, } from "./client/types";
3
+ export { AgoApiError, AgoError, AgoFunctionError, AgoNetworkError, AgoStreamError, } from "./client/errors";
4
+ export { createStore } from "./state/createStore";
5
+ export type { Store, PersistOptions } from "./state/createStore";
6
+ export { ClientContextRegistry } from "./state/ClientContextRegistry";
7
+ export type { ContextEntry, ContextSnapshot, DynamicContextProvider, } from "./state/ClientContextRegistry";
5
8
  export { defineFunction } from "./functions/defineFunction";
6
- export type { ClientFunctionSchema, ClientFunctionHandler, ClientFunctionDefinition, RegisteredFunction, } from "./functions/types";
9
+ export { FunctionRegistry } from "./functions/FunctionRegistry";
10
+ export type { ClientFunctionDefinition, ClientFunctionHandler, ClientFunctionSchema, RegisteredFunction, } from "./functions/types";
7
11
  export { createMockClient } from "./testing";
8
12
  export type { MockAgoClient, MockAgoClientOptions } from "./testing";
9
- export { SSEHandler, isStreamNetworkError } from "./streaming/SSEHandler";
10
- export type { AgoWidgetConfig, AgoWidgetColors } from "./widget/types";
11
- export { onMessage, onMessageChunk, onMessageStart, onMessageError, onToolCall, onFunctionInvoke, createMessageStream, } from "./streaming/helpers";
12
- export { createAgo, autoDetectConfig } from "./auto/createAgo";
13
- export { showToast, showNotification, openUrl, copyToClipboard, setTheme, showConfirmDialog, getUserLocation, scrollToElement, setLocalStorage, getLocalStorage, highlightElement, submitForm, trackEvent, } from "./helpers/functions";
13
+ export { isStreamNetworkError, SSEHandler } from "./streaming/SSEHandler";
14
+ export type { AgoWidgetColors, AgoWidgetConfig } from "./widget/types";
15
+ export { createMessageStream, onFunctionInvoke, onMessage, onMessageChunk, onMessageError, onMessageStart, onToolCall, } from "./streaming/helpers";
16
+ export { autoDetectConfig, createAgo } from "./auto/createAgo";
17
+ export { copyToClipboard, getLocalStorage, getUserLocation, highlightElement, openUrl, scrollToElement, setLocalStorage, setTheme, showConfirmDialog, showNotification, showToast, submitForm, trackEvent, } from "./helpers/functions";
18
+ export { withHandler } from "./helpers/factory";
14
19
  export { EventEmitter } from "./utils/eventEmitter";
15
20
  export { logger } from "./utils/logger";