@useago/sdk 0.1.6 → 0.1.7

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 (67) hide show
  1. package/dist/{createMockClient-BZKh_1em.cjs → AgoClient-BDO4avLq.cjs} +219 -124
  2. package/dist/AgoClient-BDO4avLq.cjs.map +1 -0
  3. package/dist/{createMockClient-uGlVyjbL.js → AgoClient-D-c91tx5.js} +221 -126
  4. package/dist/AgoClient-D-c91tx5.js.map +1 -0
  5. package/dist/angular/ago.service.d.ts +98 -0
  6. package/dist/angular/index.d.ts +4 -0
  7. package/dist/angular/provide.d.ts +27 -0
  8. package/dist/angular.cjs +105 -0
  9. package/dist/angular.cjs.map +1 -0
  10. package/dist/angular.d.ts +1 -0
  11. package/dist/angular.js +105 -0
  12. package/dist/angular.js.map +1 -0
  13. package/dist/auto/createAgo.d.ts +39 -0
  14. package/dist/auto/index.d.ts +1 -0
  15. package/dist/client/AgoClient.d.ts +56 -0
  16. package/dist/client/types.d.ts +4 -6
  17. package/dist/createMockClient-B1DcBiIK.js +94 -0
  18. package/dist/createMockClient-B1DcBiIK.js.map +1 -0
  19. package/dist/createMockClient-BqNSJUu4.cjs +93 -0
  20. package/dist/createMockClient-BqNSJUu4.cjs.map +1 -0
  21. package/dist/functions-B0Z0rNQW.cjs +306 -0
  22. package/dist/functions-B0Z0rNQW.cjs.map +1 -0
  23. package/dist/functions-C-wLEc8b.js +306 -0
  24. package/dist/functions-C-wLEc8b.js.map +1 -0
  25. package/dist/helpers/factory.d.ts +20 -0
  26. package/dist/helpers/functions.d.ts +62 -0
  27. package/dist/helpers/index.d.ts +1 -0
  28. package/dist/helpers.cjs +17 -0
  29. package/dist/helpers.cjs.map +1 -0
  30. package/dist/helpers.d.ts +1 -0
  31. package/dist/helpers.js +17 -0
  32. package/dist/helpers.js.map +1 -0
  33. package/dist/index.cjs +179 -12
  34. package/dist/index.cjs.map +1 -1
  35. package/dist/index.d.ts +6 -0
  36. package/dist/index.js +173 -5
  37. package/dist/index.js.map +1 -1
  38. package/dist/react/context/AgoContext.d.ts +30 -4
  39. package/dist/react/context/index.d.ts +1 -1
  40. package/dist/react/hooks/index.d.ts +1 -0
  41. package/dist/react/hooks/useAgoContext.d.ts +40 -0
  42. package/dist/react/hooks/useAgoFunction.d.ts +14 -2
  43. package/dist/react/index.d.ts +2 -1
  44. package/dist/react.cjs +76 -11
  45. package/dist/react.cjs.map +1 -1
  46. package/dist/react.js +81 -17
  47. package/dist/react.js.map +1 -1
  48. package/dist/state/ClientContextRegistry.d.ts +64 -0
  49. package/dist/streaming/helpers.d.ts +67 -0
  50. package/dist/vue/composables/useAgo.d.ts +17 -0
  51. package/dist/vue/composables/useAgoEvents.d.ts +11 -0
  52. package/dist/vue/composables/useAgoFunction.d.ts +34 -0
  53. package/dist/vue/composables/useChat.d.ts +251 -0
  54. package/dist/vue/composables/useConversation.d.ts +178 -0
  55. package/dist/vue/composables/useMessages.d.ts +89 -0
  56. package/dist/vue/index.d.ts +10 -0
  57. package/dist/vue/plugin.d.ts +16 -0
  58. package/dist/vue/symbols.d.ts +3 -0
  59. package/dist/vue.cjs +232 -0
  60. package/dist/vue.cjs.map +1 -0
  61. package/dist/vue.d.ts +1 -0
  62. package/dist/vue.js +232 -0
  63. package/dist/vue.js.map +1 -0
  64. package/dist/widget/types.d.ts +1 -0
  65. package/package.json +23 -3
  66. package/dist/createMockClient-BZKh_1em.cjs.map +0 -1
  67. package/dist/createMockClient-uGlVyjbL.js.map +0 -1
@@ -78,14 +78,26 @@ class Logger {
78
78
  }
79
79
  }
80
80
  const logger = new Logger();
81
- const DEFAULT_BASE_URL = "https://api.useago.com";
81
+ const WIDGET_ID_KEY = "ago_widget_id";
82
+ function generateWidgetId() {
83
+ if (typeof localStorage !== "undefined") {
84
+ const stored = localStorage.getItem(WIDGET_ID_KEY);
85
+ if (stored) return stored;
86
+ }
87
+ const id = crypto.randomUUID();
88
+ if (typeof localStorage !== "undefined") {
89
+ try {
90
+ localStorage.setItem(WIDGET_ID_KEY, id);
91
+ } catch {
92
+ }
93
+ }
94
+ return id;
95
+ }
82
96
  class HttpClient {
83
97
  constructor(config) {
84
- var _a;
85
- this.baseUrl = ((_a = config.baseUrl) == null ? void 0 : _a.replace(/\/$/, "")) || DEFAULT_BASE_URL;
98
+ this.baseUrl = config.baseUrl.replace(/\/$/, "");
86
99
  this.headers = {
87
- "X-Widget-Key": config.apiKey,
88
- "X-Widget-Id": config.widgetId
100
+ "X-Widget-Id": config.widgetId || generateWidgetId()
89
101
  };
90
102
  if (config.userEmail) {
91
103
  this.headers["X-User-Email"] = config.userEmail;
@@ -101,9 +113,6 @@ class HttpClient {
101
113
  if (config.baseUrl) {
102
114
  this.baseUrl = config.baseUrl.replace(/\/$/, "");
103
115
  }
104
- if (config.apiKey) {
105
- this.headers["X-Widget-Key"] = config.apiKey;
106
- }
107
116
  if (config.widgetId) {
108
117
  this.headers["X-Widget-Id"] = config.widgetId;
109
118
  }
@@ -317,6 +326,86 @@ class FunctionRegistry {
317
326
  return this.functions.size;
318
327
  }
319
328
  }
329
+ class ClientContextRegistry {
330
+ constructor() {
331
+ this.entries = /* @__PURE__ */ new Map();
332
+ this.dynamicProviders = /* @__PURE__ */ new Map();
333
+ }
334
+ /**
335
+ * Register or update a static context entry.
336
+ */
337
+ set(key, entry) {
338
+ this.entries.set(key, entry);
339
+ logger.log(`ClientContext set: ${key}`);
340
+ }
341
+ /**
342
+ * Remove a static context entry (typically on component unmount).
343
+ */
344
+ remove(key) {
345
+ const deleted = this.entries.delete(key);
346
+ if (deleted) {
347
+ logger.log(`ClientContext removed: ${key}`);
348
+ }
349
+ return deleted;
350
+ }
351
+ /**
352
+ * Register a dynamic context provider. The function is called every time
353
+ * a message is sent, so it always returns the freshest data.
354
+ *
355
+ * Use this for context that lives outside React state — global stores,
356
+ * refs, or computed values that shouldn't trigger re-renders.
357
+ */
358
+ addDynamicProvider(key, provider) {
359
+ this.dynamicProviders.set(key, provider);
360
+ logger.log(`DynamicContext provider added: ${key}`);
361
+ }
362
+ /**
363
+ * Remove a dynamic context provider.
364
+ */
365
+ removeDynamicProvider(key) {
366
+ const deleted = this.dynamicProviders.delete(key);
367
+ if (deleted) {
368
+ logger.log(`DynamicContext provider removed: ${key}`);
369
+ }
370
+ return deleted;
371
+ }
372
+ /**
373
+ * Build a snapshot of the current client context.
374
+ * Evaluates every registered dynamic provider. Returns `null` when there is
375
+ * nothing to report.
376
+ */
377
+ getSnapshot() {
378
+ if (this.entries.size === 0 && this.dynamicProviders.size === 0) {
379
+ return null;
380
+ }
381
+ const entries = {};
382
+ for (const [key, entry] of this.entries) {
383
+ entries[key] = entry;
384
+ }
385
+ for (const [key, provider] of this.dynamicProviders) {
386
+ try {
387
+ const entry = provider();
388
+ if (entry) {
389
+ entries[key] = entry;
390
+ }
391
+ } catch (err) {
392
+ logger.error(`DynamicContext provider "${key}" threw:`, err);
393
+ }
394
+ }
395
+ if (Object.keys(entries).length === 0) {
396
+ return null;
397
+ }
398
+ return { entries };
399
+ }
400
+ /**
401
+ * Remove all entries and dynamic providers.
402
+ */
403
+ clear() {
404
+ this.entries.clear();
405
+ this.dynamicProviders.clear();
406
+ logger.log("ClientContext cleared");
407
+ }
408
+ }
320
409
  class SSEHandler {
321
410
  constructor(callbacks) {
322
411
  this.callbacks = callbacks;
@@ -429,18 +518,17 @@ class SSEHandler {
429
518
  };
430
519
  });
431
520
  }
432
- if (data.tool_call_data && data.type) {
521
+ if (data.type === "client_function" && data.function_name) {
522
+ (_g = (_f = this.callbacks).onClientFunction) == null ? void 0 : _g.call(_f, {
523
+ invocationId: data.id || "",
524
+ functionName: data.function_name,
525
+ arguments: data.arguments || {},
526
+ conversationId: this.message.conversationId || ""
527
+ });
528
+ }
529
+ if (data.tool_call_data && data.type && data.type !== "client_function") {
433
530
  const toolCall = this.parseToolCall(data);
434
- if (data.type === "client_function" && data.function_name) {
435
- (_g = (_f = this.callbacks).onClientFunction) == null ? void 0 : _g.call(_f, {
436
- invocationId: data.id,
437
- functionName: data.function_name,
438
- arguments: data.arguments || {},
439
- conversationId: this.message.conversationId || ""
440
- });
441
- } else {
442
- (_i = (_h = this.callbacks).onToolCall) == null ? void 0 : _i.call(_h, toolCall);
443
- }
531
+ (_i = (_h = this.callbacks).onToolCall) == null ? void 0 : _i.call(_h, toolCall);
444
532
  const existingIndex = this.toolCalls.findIndex((t) => t.id === toolCall.id);
445
533
  if (existingIndex >= 0) {
446
534
  this.toolCalls[existingIndex] = toolCall;
@@ -559,6 +647,7 @@ class AgoClient {
559
647
  this.config = config;
560
648
  this.httpClient = new HttpClient(config);
561
649
  this.functionRegistry = new FunctionRegistry();
650
+ this.contextRegistry = new ClientContextRegistry();
562
651
  this.eventEmitter = new EventEmitter();
563
652
  if (config.debug) {
564
653
  logger.enable();
@@ -573,6 +662,7 @@ class AgoClient {
573
662
  */
574
663
  async sendMessage(content, options) {
575
664
  const clientFunctions = this.functionRegistry.getSchemas();
665
+ const clientContext = this.contextRegistry.getSnapshot();
576
666
  const body = {
577
667
  content,
578
668
  conversation_id: options == null ? void 0 : options.conversationId,
@@ -581,6 +671,9 @@ class AgoClient {
581
671
  if (clientFunctions.length > 0) {
582
672
  body.client_functions = clientFunctions;
583
673
  }
674
+ if (clientContext) {
675
+ body.client_context = clientContext;
676
+ }
584
677
  let response;
585
678
  if ((options == null ? void 0 : options.files) && options.files.length > 0) {
586
679
  const formData = new FormData();
@@ -594,6 +687,9 @@ class AgoClient {
594
687
  if (clientFunctions.length > 0) {
595
688
  formData.append("client_functions", JSON.stringify(clientFunctions));
596
689
  }
690
+ if (clientContext) {
691
+ formData.append("client_context", JSON.stringify(clientContext));
692
+ }
597
693
  for (const file of options.files) {
598
694
  formData.append("files", file);
599
695
  }
@@ -639,20 +735,22 @@ class AgoClient {
639
735
  error = err instanceof Error ? err.message : "Unknown error";
640
736
  logger.error("Client function execution failed:", err);
641
737
  }
642
- try {
643
- await this.submitToolCallForm(data.invocationId, {
644
- result,
645
- error,
646
- _type: "client_function_result"
647
- });
648
- this.eventEmitter.emit("function:result", {
649
- invocationId: data.invocationId,
650
- result,
651
- error
652
- });
653
- } catch (submitError) {
654
- logger.error("Failed to submit function result:", submitError);
738
+ if (data.invocationId) {
739
+ try {
740
+ await this.submitToolCallForm(data.invocationId, {
741
+ result,
742
+ error,
743
+ _type: "client_function_result"
744
+ });
745
+ } catch (submitError) {
746
+ logger.error("Failed to submit function result:", submitError);
747
+ }
655
748
  }
749
+ this.eventEmitter.emit("function:result", {
750
+ invocationId: data.invocationId,
751
+ result,
752
+ error
753
+ });
656
754
  }
657
755
  // ─────────────────────────────────────────────────────────────────
658
756
  // Conversations
@@ -735,6 +833,23 @@ class AgoClient {
735
833
  this.functionRegistry.register(nameOrDef, handler, schema);
736
834
  }
737
835
  }
836
+ /**
837
+ * Short alias for `registerFunction`. Also accepts an array of definitions.
838
+ *
839
+ * ```ts
840
+ * client.register(lookupOrder);
841
+ * client.register([lookupOrder, cancelOrder]);
842
+ * ```
843
+ */
844
+ register(definition) {
845
+ if (Array.isArray(definition)) {
846
+ for (const def of definition) {
847
+ this.functionRegistry.register(def);
848
+ }
849
+ } else {
850
+ this.functionRegistry.register(definition);
851
+ }
852
+ }
738
853
  /**
739
854
  * Unregister a client-side function
740
855
  */
@@ -784,6 +899,75 @@ ${routeDescriptions}`,
784
899
  );
785
900
  }
786
901
  // ─────────────────────────────────────────────────────────────────
902
+ // Client Context
903
+ // ─────────────────────────────────────────────────────────────────
904
+ /**
905
+ * Register or update a piece of client-side context.
906
+ * This context is sent with every message so the AI understands the user's situation.
907
+ *
908
+ * ```ts
909
+ * client.setContext("order-page", {
910
+ * name: "Order detail",
911
+ * description: "User is viewing order #123",
912
+ * data: { orderId: "123", status: "shipped" },
913
+ * });
914
+ * ```
915
+ */
916
+ setContext(key, entry) {
917
+ this.contextRegistry.set(key, entry);
918
+ }
919
+ /**
920
+ * Remove a previously registered context entry.
921
+ */
922
+ removeContext(key) {
923
+ return this.contextRegistry.remove(key);
924
+ }
925
+ /**
926
+ * Register a dynamic context provider. The callback is invoked every time
927
+ * a message is sent, so the AI always gets the freshest data.
928
+ *
929
+ * Use this for context that lives outside React state — global stores,
930
+ * refs, or computed values.
931
+ *
932
+ * ```ts
933
+ * client.addDynamicContext("cart", () => ({
934
+ * name: "Checkout",
935
+ * data: { itemCount: cart.items.length, total: cart.total },
936
+ * }));
937
+ * ```
938
+ */
939
+ addDynamicContext(key, provider) {
940
+ this.contextRegistry.addDynamicProvider(key, provider);
941
+ }
942
+ /**
943
+ * Remove a dynamic context provider.
944
+ */
945
+ removeDynamicContext(key) {
946
+ return this.contextRegistry.removeDynamicProvider(key);
947
+ }
948
+ /**
949
+ * Enable automatic capture of the current browser page (URL + title).
950
+ * Injected as a dynamic context entry named `browser-page`.
951
+ */
952
+ enableAutoPageContext() {
953
+ this.contextRegistry.addDynamicProvider("browser-page", () => {
954
+ const url = typeof window !== "undefined" ? window.location.href : void 0;
955
+ const title = typeof document !== "undefined" ? document.title : void 0;
956
+ if (!url && !title) return null;
957
+ return {
958
+ name: "Browser page",
959
+ description: "Current page the user is viewing",
960
+ data: { url, title }
961
+ };
962
+ });
963
+ }
964
+ /**
965
+ * Get the current context snapshot.
966
+ */
967
+ getContextSnapshot() {
968
+ return this.contextRegistry.getSnapshot();
969
+ }
970
+ // ─────────────────────────────────────────────────────────────────
787
971
  // Events
788
972
  // ─────────────────────────────────────────────────────────────────
789
973
  /**
@@ -833,109 +1017,20 @@ ${routeDescriptions}`,
833
1017
  destroy() {
834
1018
  this.eventEmitter.removeAllListeners();
835
1019
  this.functionRegistry.clear();
1020
+ this.contextRegistry.clear();
836
1021
  logger.log("AgoClient destroyed");
837
1022
  }
838
1023
  }
839
- function createMockClient(options = {}) {
840
- const { overrides = {} } = options;
841
- const noopMessage = {
842
- id: "mock-msg-1",
843
- conversationId: "mock-conv-1",
844
- content: "Mock response",
845
- role: "assistant",
846
- status: "DONE",
847
- createdAt: /* @__PURE__ */ new Date()
848
- };
849
- const noopConversation = {
850
- id: "mock-conv-1",
851
- title: "Mock Conversation",
852
- lastMessageDate: /* @__PURE__ */ new Date()
853
- };
854
- const listeners = /* @__PURE__ */ new Map();
855
- const calls = [];
856
- const defaults = {
857
- sendMessage: async () => noopMessage,
858
- getConversations: async () => [noopConversation],
859
- getConversation: async () => noopConversation,
860
- getMessages: async () => [noopMessage],
861
- submitToolCallForm: async () => void 0,
862
- confirmToolCall: async () => void 0,
863
- rejectToolCall: async () => void 0,
864
- submitFeedback: async () => void 0,
865
- registerFunction: () => void 0,
866
- unregisterFunction: () => true,
867
- getRegisteredFunctions: () => [],
868
- registerNavigationFunction: () => void 0,
869
- on: (event, handler) => {
870
- if (!listeners.has(event)) listeners.set(event, /* @__PURE__ */ new Set());
871
- listeners.get(event).add(handler);
872
- },
873
- off: (event, handler) => {
874
- var _a;
875
- (_a = listeners.get(event)) == null ? void 0 : _a.delete(handler);
876
- },
877
- once: (event, handler) => {
878
- const wrapper = (...args) => {
879
- var _a;
880
- (_a = listeners.get(event)) == null ? void 0 : _a.delete(wrapper);
881
- handler(...args);
882
- };
883
- if (!listeners.has(event)) listeners.set(event, /* @__PURE__ */ new Set());
884
- listeners.get(event).add(wrapper);
885
- },
886
- waitFor: (event, options2) => {
887
- return new Promise((resolve, reject) => {
888
- let timer;
889
- const handler = (data) => {
890
- var _a;
891
- if (timer) clearTimeout(timer);
892
- (_a = listeners.get(event)) == null ? void 0 : _a.delete(handler);
893
- resolve(data);
894
- };
895
- if (!listeners.has(event)) listeners.set(event, /* @__PURE__ */ new Set());
896
- listeners.get(event).add(handler);
897
- if (options2 == null ? void 0 : options2.timeout) {
898
- timer = setTimeout(() => {
899
- var _a;
900
- (_a = listeners.get(event)) == null ? void 0 : _a.delete(handler);
901
- reject(new Error(`waitFor("${event}") timed out after ${options2.timeout}ms`));
902
- }, options2.timeout);
903
- }
904
- });
905
- },
906
- updateConfig: () => void 0,
907
- destroy: () => {
908
- listeners.clear();
909
- }
910
- };
911
- const merged = { ...defaults, ...overrides };
912
- const mock = {};
913
- for (const [key, fn] of Object.entries(merged)) {
914
- mock[key] = (...args) => {
915
- calls.push({ method: key, args });
916
- return fn(...args);
917
- };
918
- }
919
- mock.__calls = calls;
920
- mock.__callsFor = (method) => calls.filter((c) => c.method === method);
921
- mock.__emitEvent = (event, data) => {
922
- const handlers = listeners.get(event);
923
- if (handlers) {
924
- [...handlers].forEach((h) => h(data));
925
- }
926
- };
927
- return mock;
928
- }
929
1024
  exports.AgoApiError = AgoApiError;
930
1025
  exports.AgoClient = AgoClient;
931
1026
  exports.AgoError = AgoError;
932
1027
  exports.AgoFunctionError = AgoFunctionError;
933
1028
  exports.AgoNetworkError = AgoNetworkError;
934
1029
  exports.AgoStreamError = AgoStreamError;
1030
+ exports.ClientContextRegistry = ClientContextRegistry;
935
1031
  exports.EventEmitter = EventEmitter;
936
1032
  exports.FunctionRegistry = FunctionRegistry;
937
1033
  exports.SSEHandler = SSEHandler;
938
- exports.createMockClient = createMockClient;
939
1034
  exports.isStreamNetworkError = isStreamNetworkError;
940
1035
  exports.logger = logger;
941
- //# sourceMappingURL=createMockClient-BZKh_1em.cjs.map
1036
+ //# sourceMappingURL=AgoClient-BDO4avLq.cjs.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"AgoClient-BDO4avLq.cjs","sources":["../src/client/errors.ts","../src/utils/logger.ts","../src/api/HttpClient.ts","../src/functions/FunctionRegistry.ts","../src/state/ClientContextRegistry.ts","../src/streaming/SSEHandler.ts","../src/utils/eventEmitter.ts","../src/client/AgoClient.ts"],"sourcesContent":["/**\n * Base error class for AGO SDK\n */\nexport class AgoError extends Error {\n constructor(\n message: string,\n public code: string,\n public statusCode?: number\n ) {\n super(message);\n this.name = \"AgoError\";\n }\n}\n\n/**\n * Error from API response\n */\nexport class AgoApiError extends AgoError {\n constructor(\n message: string,\n code: string,\n statusCode: number,\n public type: string,\n public param?: string,\n public docUrl?: string\n ) {\n super(message, code, statusCode);\n this.name = \"AgoApiError\";\n }\n\n static fromResponse(data: ApiErrorResponse, statusCode: number): AgoApiError {\n const error = data.error;\n return new AgoApiError(\n error.message,\n error.code,\n statusCode,\n error.type,\n error.param,\n error.doc_url\n );\n }\n}\n\nexport interface ApiErrorResponse {\n error: {\n type: string;\n code: string;\n message: string;\n param?: string;\n doc_url?: string;\n };\n}\n\n/**\n * Network/connection error\n */\nexport class AgoNetworkError extends AgoError {\n constructor(message: string, public originalError?: Error) {\n super(message, \"network_error\");\n this.name = \"AgoNetworkError\";\n }\n}\n\n/**\n * SSE stream error\n */\nexport class AgoStreamError extends AgoError {\n constructor(message: string) {\n super(message, \"stream_error\");\n this.name = \"AgoStreamError\";\n }\n}\n\n/**\n * Function execution error\n */\nexport class AgoFunctionError extends AgoError {\n constructor(\n message: string,\n public functionName: string,\n public originalError?: Error\n ) {\n super(message, \"function_error\");\n this.name = \"AgoFunctionError\";\n }\n}\n","/**\n * Debug logger for SDK\n */\nexport class Logger {\n constructor(private enabled: boolean = false) {}\n\n enable(): void {\n this.enabled = true;\n }\n\n disable(): void {\n this.enabled = false;\n }\n\n log(...args: unknown[]): void {\n if (this.enabled) {\n console.log(\"[AGO SDK]\", ...args);\n }\n }\n\n warn(...args: unknown[]): void {\n if (this.enabled) {\n console.warn(\"[AGO SDK]\", ...args);\n }\n }\n\n error(...args: unknown[]): void {\n // Always log errors\n console.error(\"[AGO SDK]\", ...args);\n }\n\n debug(...args: unknown[]): void {\n if (this.enabled) {\n console.debug(\"[AGO SDK]\", ...args);\n }\n }\n}\n\nexport const logger = new Logger();\n","import { AgoApiError, AgoNetworkError, ApiErrorResponse } from \"../client/errors\";\nimport type { AgoConfig } from \"../client/types\";\nimport { logger } from \"../utils/logger\";\n\nconst WIDGET_ID_KEY = \"ago_widget_id\";\n\nfunction generateWidgetId(): string {\n // Try to reuse a previously generated ID from localStorage\n if (typeof localStorage !== \"undefined\") {\n const stored = localStorage.getItem(WIDGET_ID_KEY);\n if (stored) return stored;\n }\n\n const id = crypto.randomUUID();\n\n if (typeof localStorage !== \"undefined\") {\n try {\n localStorage.setItem(WIDGET_ID_KEY, id);\n } catch {\n // localStorage may be unavailable (e.g., private browsing)\n }\n }\n\n return id;\n}\n\n/**\n * HTTP client with authentication headers\n */\nexport class HttpClient {\n private baseUrl: string;\n private headers: Record<string, string>;\n\n constructor(config: AgoConfig) {\n this.baseUrl = config.baseUrl.replace(/\\/$/, \"\");\n this.headers = {\n \"X-Widget-Id\": config.widgetId || generateWidgetId(),\n };\n\n if (config.userEmail) {\n this.headers[\"X-User-Email\"] = config.userEmail;\n }\n\n if (config.userJwt) {\n this.headers[\"Authorization\"] = `Bearer ${config.userJwt}`;\n }\n }\n\n /**\n * Update configuration (e.g., JWT token)\n */\n updateConfig(config: Partial<AgoConfig>): void {\n if (config.baseUrl) {\n this.baseUrl = config.baseUrl.replace(/\\/$/, \"\");\n }\n if (config.widgetId) {\n this.headers[\"X-Widget-Id\"] = config.widgetId;\n }\n if (config.userEmail) {\n this.headers[\"X-User-Email\"] = config.userEmail;\n }\n if (config.userJwt) {\n this.headers[\"Authorization\"] = `Bearer ${config.userJwt}`;\n }\n }\n\n /**\n * Make a GET request\n */\n async get<T>(path: string): Promise<T> {\n return this.request<T>(\"GET\", path);\n }\n\n /**\n * Make a POST request with JSON body\n */\n async post<T>(path: string, body?: unknown): Promise<T> {\n return this.request<T>(\"POST\", path, body);\n }\n\n /**\n * Make a POST request and return the raw Response (for streaming)\n */\n async postStream(path: string, body?: unknown): Promise<Response> {\n const url = `${this.baseUrl}${path}`;\n logger.debug(\"POST (stream)\", url, body);\n\n try {\n const response = await fetch(url, {\n method: \"POST\",\n headers: {\n ...this.headers,\n \"Content-Type\": \"application/json\",\n },\n body: body ? JSON.stringify(body) : undefined,\n });\n\n if (!response.ok) {\n await this.handleErrorResponse(response);\n }\n\n return response;\n } catch (error) {\n if (error instanceof AgoApiError) {\n throw error;\n }\n throw new AgoNetworkError(\n `Network error: ${error instanceof Error ? error.message : \"Unknown error\"}`,\n error instanceof Error ? error : undefined\n );\n }\n }\n\n /**\n * Make a POST request with FormData (for file uploads)\n */\n async postFormData(path: string, formData: FormData): Promise<Response> {\n const url = `${this.baseUrl}${path}`;\n logger.debug(\"POST (formData)\", url);\n\n // Don't set Content-Type for FormData - browser sets it with boundary\n const headers = { ...this.headers };\n\n try {\n const response = await fetch(url, {\n method: \"POST\",\n headers,\n body: formData,\n });\n\n if (!response.ok) {\n await this.handleErrorResponse(response);\n }\n\n return response;\n } catch (error) {\n if (error instanceof AgoApiError) {\n throw error;\n }\n throw new AgoNetworkError(\n `Network error: ${error instanceof Error ? error.message : \"Unknown error\"}`,\n error instanceof Error ? error : undefined\n );\n }\n }\n\n private async request<T>(\n method: string,\n path: string,\n body?: unknown\n ): Promise<T> {\n const url = `${this.baseUrl}${path}`;\n logger.debug(method, url, body);\n\n try {\n const response = await fetch(url, {\n method,\n headers: {\n ...this.headers,\n \"Content-Type\": \"application/json\",\n },\n body: body ? JSON.stringify(body) : undefined,\n });\n\n if (!response.ok) {\n await this.handleErrorResponse(response);\n }\n\n // Handle 204 No Content\n if (response.status === 204) {\n return undefined as T;\n }\n\n return response.json();\n } catch (error) {\n if (error instanceof AgoApiError) {\n throw error;\n }\n throw new AgoNetworkError(\n `Network error: ${error instanceof Error ? error.message : \"Unknown error\"}`,\n error instanceof Error ? error : undefined\n );\n }\n }\n\n private async handleErrorResponse(response: Response): Promise<never> {\n let errorData: ApiErrorResponse | undefined;\n\n try {\n errorData = await response.json();\n } catch {\n // Response is not JSON\n }\n\n if (errorData?.error) {\n throw AgoApiError.fromResponse(errorData, response.status);\n }\n\n throw new AgoApiError(\n `HTTP ${response.status}: ${response.statusText}`,\n \"http_error\",\n response.status,\n \"api_error\"\n );\n }\n}\n","import { AgoFunctionError } from \"../client/errors\";\nimport { logger } from \"../utils/logger\";\nimport type {\n ClientFunctionDefinition,\n ClientFunctionHandler,\n ClientFunctionSchema,\n RegisteredFunction,\n} from \"./types\";\n\n/**\n * Registry for client-side functions that AGO can call\n */\nexport class FunctionRegistry {\n private functions: Map<string, RegisteredFunction> = new Map();\n\n /**\n * Register a function that AGO can call.\n * Accepts either a single definition object or (name, handler, schema) args.\n */\n register(definition: ClientFunctionDefinition): void;\n register(\n name: string,\n handler: ClientFunctionHandler,\n schema: Omit<ClientFunctionSchema, \"name\">\n ): void;\n register(\n nameOrDef: string | ClientFunctionDefinition,\n handler?: ClientFunctionHandler,\n schema?: Omit<ClientFunctionSchema, \"name\">\n ): void {\n if (typeof nameOrDef === \"object\") {\n const { name, handler: h, description, parameters } = nameOrDef;\n return this.register(name, h, { description, parameters });\n }\n\n const name = nameOrDef;\n if (!handler || !schema) {\n throw new Error(\"handler and schema are required\");\n }\n if (this.functions.has(name)) {\n logger.warn(`Function \"${name}\" is being overwritten`);\n }\n\n this.functions.set(name, {\n schema: { ...schema, name },\n handler,\n });\n\n logger.log(`Registered function: ${name}`);\n }\n\n /**\n * Unregister a function\n */\n unregister(name: string): boolean {\n const deleted = this.functions.delete(name);\n if (deleted) {\n logger.log(`Unregistered function: ${name}`);\n }\n return deleted;\n }\n\n /**\n * Get a registered function\n */\n get(name: string): RegisteredFunction | undefined {\n return this.functions.get(name);\n }\n\n /**\n * Check if a function is registered\n */\n has(name: string): boolean {\n return this.functions.has(name);\n }\n\n /**\n * Get all registered function schemas (for sending to backend)\n */\n getSchemas(): ClientFunctionSchema[] {\n return Array.from(this.functions.values()).map((f) => f.schema);\n }\n\n /**\n * Execute a registered function\n */\n async execute(\n name: string,\n args: Record<string, unknown>\n ): Promise<unknown> {\n const registration = this.functions.get(name);\n\n if (!registration) {\n throw new AgoFunctionError(\n `Function \"${name}\" is not registered`,\n name\n );\n }\n\n logger.log(`Executing function: ${name}`, args);\n\n try {\n const result = await registration.handler(args);\n logger.log(`Function ${name} completed:`, result);\n return result;\n } catch (error) {\n logger.error(`Function ${name} failed:`, error);\n throw new AgoFunctionError(\n `Function \"${name}\" execution failed: ${error instanceof Error ? error.message : \"Unknown error\"}`,\n name,\n error instanceof Error ? error : undefined\n );\n }\n }\n\n /**\n * Clear all registered functions\n */\n clear(): void {\n this.functions.clear();\n logger.log(\"Cleared all registered functions\");\n }\n\n /**\n * Get the number of registered functions\n */\n get size(): number {\n return this.functions.size;\n }\n}\n","import { logger } from \"../utils/logger\";\n\n/**\n * A single piece of context the client wants the LLM to know about.\n */\nexport interface ContextEntry {\n /** Human-readable label (e.g. \"Order detail\", \"Current user\") */\n name?: string;\n /** Short description of what this context represents */\n description?: string;\n /** Arbitrary structured data the AI should know about */\n data?: Record<string, unknown>;\n}\n\n/**\n * Serialised client context sent with each message.\n */\nexport interface ContextSnapshot {\n /** All active context entries keyed by their registration key */\n entries: Record<string, ContextEntry>;\n}\n\n/**\n * A function that returns a fresh context entry on demand.\n * Evaluated every time a message is sent — use it to pull data from stores,\n * refs, or any source that isn't captured by React state.\n */\nexport type DynamicContextProvider = () => ContextEntry | null | undefined;\n\n/**\n * Registry that collects client-side context from across the component tree.\n *\n * Components register/unregister context slices via unique keys.\n * When a message is sent the registry produces a single snapshot.\n */\nexport class ClientContextRegistry {\n private entries: Map<string, ContextEntry> = new Map();\n private dynamicProviders: Map<string, DynamicContextProvider> = new Map();\n\n /**\n * Register or update a static context entry.\n */\n set(key: string, entry: ContextEntry): void {\n this.entries.set(key, entry);\n logger.log(`ClientContext set: ${key}`);\n }\n\n /**\n * Remove a static context entry (typically on component unmount).\n */\n remove(key: string): boolean {\n const deleted = this.entries.delete(key);\n if (deleted) {\n logger.log(`ClientContext removed: ${key}`);\n }\n return deleted;\n }\n\n /**\n * Register a dynamic context provider. The function is called every time\n * a message is sent, so it always returns the freshest data.\n *\n * Use this for context that lives outside React state — global stores,\n * refs, or computed values that shouldn't trigger re-renders.\n */\n addDynamicProvider(key: string, provider: DynamicContextProvider): void {\n this.dynamicProviders.set(key, provider);\n logger.log(`DynamicContext provider added: ${key}`);\n }\n\n /**\n * Remove a dynamic context provider.\n */\n removeDynamicProvider(key: string): boolean {\n const deleted = this.dynamicProviders.delete(key);\n if (deleted) {\n logger.log(`DynamicContext provider removed: ${key}`);\n }\n return deleted;\n }\n\n /**\n * Build a snapshot of the current client context.\n * Evaluates every registered dynamic provider. Returns `null` when there is\n * nothing to report.\n */\n getSnapshot(): ContextSnapshot | null {\n if (this.entries.size === 0 && this.dynamicProviders.size === 0) {\n return null;\n }\n\n const entries: Record<string, ContextEntry> = {};\n for (const [key, entry] of this.entries) {\n entries[key] = entry;\n }\n\n for (const [key, provider] of this.dynamicProviders) {\n try {\n const entry = provider();\n if (entry) {\n entries[key] = entry;\n }\n } catch (err) {\n logger.error(`DynamicContext provider \"${key}\" threw:`, err);\n }\n }\n\n if (Object.keys(entries).length === 0) {\n return null;\n }\n\n return { entries };\n }\n\n /**\n * Remove all entries and dynamic providers.\n */\n clear(): void {\n this.entries.clear();\n this.dynamicProviders.clear();\n logger.log(\"ClientContext cleared\");\n }\n}\n","import type {\n AgoMessage,\n AgoSource,\n ToolCallData,\n SSEChunkData,\n} from \"../client/types\";\nimport { AgoStreamError } from \"../client/errors\";\nimport { logger } from \"../utils/logger\";\n\nexport interface SSEHandlerCallbacks {\n onStart?: (data: { conversationId: string; messageId: string }) => void;\n onChunk?: (data: { content: string; conversationId: string; messageId: string }) => void;\n onToolCall?: (toolCall: ToolCallData) => void;\n onClientFunction?: (data: {\n invocationId: string;\n functionName: string;\n arguments: Record<string, unknown>;\n conversationId: string;\n }) => void;\n onComplete?: (message: AgoMessage) => void;\n onError?: (error: Error) => void;\n}\n\n/**\n * Handles SSE streaming responses from AGO backend\n */\nexport class SSEHandler {\n private buffer = \"\";\n private message: Partial<AgoMessage> = {};\n private toolCalls: ToolCallData[] = [];\n private sources: AgoSource[] = [];\n private followUpReplies: string[] = [];\n private isFirstChunk = true;\n\n constructor(private callbacks: SSEHandlerCallbacks) {}\n\n /**\n * Process a streaming response\n */\n async processStream(response: Response): Promise<AgoMessage> {\n if (!response.body) {\n throw new AgoStreamError(\"Response has no body\");\n }\n\n const reader = response.body.getReader();\n const decoder = new TextDecoder();\n\n try {\n while (true) {\n const { done, value } = await reader.read();\n\n if (done) {\n break;\n }\n\n const text = decoder.decode(value, { stream: true });\n this.buffer += text;\n this.processBuffer();\n }\n\n // Process any remaining data\n if (this.buffer.trim()) {\n this.processBuffer();\n }\n\n return this.buildFinalMessage();\n } catch (error) {\n const streamError =\n error instanceof Error ? error : new AgoStreamError(\"Stream processing failed\");\n this.callbacks.onError?.(streamError);\n throw streamError;\n } finally {\n reader.releaseLock();\n }\n }\n\n private processBuffer(): void {\n // SSE messages are separated by double newlines\n const parts = this.buffer.split(\"\\n\\n\");\n\n // Keep the last part (might be incomplete)\n this.buffer = parts.pop() || \"\";\n\n for (const part of parts) {\n if (!part.trim()) continue;\n\n // Handle SSE format: \"data: {...}\" or \": heartbeat\"\n const lines = part.split(\"\\n\");\n\n for (const line of lines) {\n if (line.startsWith(\": \")) {\n // Comment/heartbeat, ignore\n continue;\n }\n\n if (line.startsWith(\"data: \")) {\n const jsonStr = line.slice(6);\n try {\n const data = JSON.parse(jsonStr) as SSEChunkData;\n this.handleChunk(data);\n } catch (error) {\n logger.warn(\"Failed to parse SSE data:\", jsonStr, error);\n }\n }\n }\n }\n }\n\n private handleChunk(data: SSEChunkData): void {\n // Handle message ID and conversation ID\n if (data.message_id && !this.message.id) {\n this.message.id = data.message_id;\n }\n\n if (data.thread?.id) {\n this.message.conversationId = data.thread.id;\n\n // Emit start event on first chunk with IDs\n if (this.isFirstChunk && this.message.id) {\n this.isFirstChunk = false;\n this.callbacks.onStart?.({\n conversationId: this.message.conversationId,\n messageId: this.message.id,\n });\n }\n }\n\n // Handle content\n if (data.content !== undefined) {\n this.message.content = (this.message.content || \"\") + data.content;\n if (this.message.conversationId && this.message.id) {\n this.callbacks.onChunk?.({\n content: data.content,\n conversationId: this.message.conversationId,\n messageId: this.message.id,\n });\n }\n }\n\n // Handle full content replacement\n if (data.full_content !== undefined) {\n this.message.content = data.full_content;\n }\n\n // Handle status\n if (data.status) {\n this.message.status = data.status;\n }\n\n // Handle agent\n if (data.agent) {\n this.message.agent = {\n id: data.agent.id,\n name: data.agent.name,\n displayName: data.agent.display_name,\n };\n }\n\n // Handle knowledge sources\n if (data.knowledge_sources) {\n this.sources = data.knowledge_sources.map((s) => {\n const doc = s.knowledge_document;\n return {\n id: doc.id,\n title: doc.title,\n url: doc.use_external_link ? doc.external_link_url : doc.internal_link_url,\n };\n });\n }\n\n // Client-side function invocation — fires from either the tool_call_data UI\n // event or the raw state dict streamed by the backend (which has no\n // tool_call_data flag). Either form is enough to run the registered handler.\n if (data.type === \"client_function\" && data.function_name) {\n this.callbacks.onClientFunction?.({\n invocationId: data.id || \"\",\n functionName: data.function_name,\n arguments: data.arguments || {},\n conversationId: this.message.conversationId || \"\",\n });\n }\n\n // Handle standard tool call UI events\n if (data.tool_call_data && data.type && data.type !== \"client_function\") {\n const toolCall = this.parseToolCall(data);\n this.callbacks.onToolCall?.(toolCall);\n\n const existingIndex = this.toolCalls.findIndex((t) => t.id === toolCall.id);\n if (existingIndex >= 0) {\n this.toolCalls[existingIndex] = toolCall;\n } else {\n this.toolCalls.push(toolCall);\n }\n }\n\n // Handle follow-up replies\n if (data.follow_up_replies) {\n this.followUpReplies = data.follow_up_replies;\n }\n }\n\n private parseToolCall(data: SSEChunkData): ToolCallData {\n return {\n id: data.id || \"\",\n type: (data.type as ToolCallData[\"type\"]) || \"status_message\",\n status: data.status || \"unknown\",\n toolName: data.tool_name || \"\",\n toolDisplayName: data.tool_display_name,\n message: data.message,\n formSchema: data.form_schema,\n data: data.data,\n functionName: data.function_name,\n arguments: data.arguments,\n };\n }\n\n private buildFinalMessage(): AgoMessage {\n const message: AgoMessage = {\n id: this.message.id || \"\",\n conversationId: this.message.conversationId || \"\",\n content: this.message.content || \"\",\n role: \"assistant\",\n status: this.message.status || \"DONE\",\n agent: this.message.agent,\n sources: this.sources.length > 0 ? this.sources : undefined,\n toolCalls: this.toolCalls.length > 0 ? this.toolCalls : undefined,\n followUpReplies:\n this.followUpReplies.length > 0 ? this.followUpReplies : undefined,\n createdAt: new Date(),\n };\n\n this.callbacks.onComplete?.(message);\n return message;\n }\n}\n\n/**\n * Check if an error is a network error that should trigger polling fallback\n */\nexport function isStreamNetworkError(error: Error): boolean {\n const message = error.message.toLowerCase();\n return (\n message.includes(\"load failed\") ||\n message.includes(\"failed to fetch\") ||\n message.includes(\"network\") ||\n message.includes(\"abort\")\n );\n}\n","type EventHandler<T = unknown> = (data: T) => void;\n\n/**\n * Simple typed event emitter\n */\n// eslint-disable-next-line @typescript-eslint/no-explicit-any\nexport class EventEmitter<Events extends Record<string, any> = Record<string, unknown>> {\n private handlers: Map<keyof Events, Set<EventHandler<unknown>>> = new Map();\n\n on<K extends keyof Events>(event: K, handler: EventHandler<Events[K]>): void {\n if (!this.handlers.has(event)) {\n this.handlers.set(event, new Set());\n }\n this.handlers.get(event)!.add(handler as EventHandler<unknown>);\n }\n\n off<K extends keyof Events>(\n event: K,\n handler: EventHandler<Events[K]>\n ): void {\n const eventHandlers = this.handlers.get(event);\n if (eventHandlers) {\n eventHandlers.delete(handler as EventHandler<unknown>);\n }\n }\n\n emit<K extends keyof Events>(event: K, data: Events[K]): void {\n const eventHandlers = this.handlers.get(event);\n if (eventHandlers) {\n eventHandlers.forEach((handler) => {\n try {\n handler(data);\n } catch (error) {\n console.error(`Error in event handler for ${String(event)}:`, error);\n }\n });\n }\n }\n\n /**\n * Subscribe to an event and auto-unsubscribe after the first call.\n */\n once<K extends keyof Events>(event: K, handler: EventHandler<Events[K]>): void {\n const wrapper = ((data: Events[K]) => {\n this.off(event, wrapper as EventHandler<Events[K]>);\n handler(data);\n }) as EventHandler<Events[K]>;\n this.on(event, wrapper);\n }\n\n /**\n * Returns a Promise that resolves the next time `event` fires.\n * Rejects if `timeout` (ms) is reached first.\n */\n waitFor<K extends keyof Events>(\n event: K,\n options?: { timeout?: number }\n ): Promise<Events[K]> {\n return new Promise((resolve, reject) => {\n let timer: ReturnType<typeof setTimeout> | undefined;\n\n const handler = ((data: Events[K]) => {\n if (timer) clearTimeout(timer);\n resolve(data);\n }) as EventHandler<Events[K]>;\n\n this.once(event, handler);\n\n if (options?.timeout) {\n timer = setTimeout(() => {\n this.off(event, handler);\n reject(new Error(`waitFor(\"${String(event)}\") timed out after ${options.timeout}ms`));\n }, options.timeout);\n }\n });\n }\n\n removeAllListeners(event?: keyof Events): void {\n if (event) {\n this.handlers.delete(event);\n } else {\n this.handlers.clear();\n }\n }\n}\n","import { HttpClient } from \"../api/HttpClient\";\nimport { FunctionRegistry } from \"../functions/FunctionRegistry\";\nimport type { ClientFunctionDefinition, ClientFunctionHandler, ClientFunctionSchema } from \"../functions/types\";\nimport { ClientContextRegistry } from \"../state/ClientContextRegistry\";\nimport type {\n ContextEntry,\n ContextSnapshot,\n DynamicContextProvider,\n} from \"../state/ClientContextRegistry\";\nimport { SSEHandler } from \"../streaming/SSEHandler\";\nimport { EventEmitter } from \"../utils/eventEmitter\";\nimport { logger } from \"../utils/logger\";\nimport type {\n AgoConfig,\n AgoClientEvents,\n AgoEventName,\n AgoEventHandler,\n AgoMessage,\n Conversation,\n SendMessageOptions,\n} from \"./types\";\n\n/**\n * Main SDK client for AGO Chat integration\n */\nexport class AgoClient {\n private httpClient: HttpClient;\n private functionRegistry: FunctionRegistry;\n private contextRegistry: ClientContextRegistry;\n private eventEmitter: EventEmitter<AgoClientEvents>;\n private config: AgoConfig;\n\n constructor(config: AgoConfig) {\n this.config = config;\n this.httpClient = new HttpClient(config);\n this.functionRegistry = new FunctionRegistry();\n this.contextRegistry = new ClientContextRegistry();\n this.eventEmitter = new EventEmitter();\n\n if (config.debug) {\n logger.enable();\n }\n\n logger.log(\"AgoClient initialized\");\n }\n\n // ─────────────────────────────────────────────────────────────────\n // Messaging\n // ─────────────────────────────────────────────────────────────────\n\n /**\n * Send a message and receive a streaming response\n */\n async sendMessage(\n content: string,\n options?: SendMessageOptions\n ): Promise<AgoMessage> {\n const clientFunctions = this.functionRegistry.getSchemas();\n\n const clientContext = this.contextRegistry.getSnapshot();\n\n const body: Record<string, unknown> = {\n content,\n conversation_id: options?.conversationId,\n agent_id: options?.agentId || this.config.defaultAgentId,\n };\n\n // Include client functions if any are registered\n if (clientFunctions.length > 0) {\n body.client_functions = clientFunctions;\n }\n\n // Include client-supplied context if any is registered\n if (clientContext) {\n body.client_context = clientContext;\n }\n\n let response: Response;\n\n if (options?.files && options.files.length > 0) {\n // Use FormData for file uploads\n const formData = new FormData();\n formData.append(\"content\", content);\n\n if (options.conversationId) {\n formData.append(\"conversation_id\", options.conversationId);\n }\n\n if (options.agentId || this.config.defaultAgentId) {\n formData.append(\"agent_id\", options.agentId || this.config.defaultAgentId || \"\");\n }\n\n if (clientFunctions.length > 0) {\n formData.append(\"client_functions\", JSON.stringify(clientFunctions));\n }\n\n if (clientContext) {\n formData.append(\"client_context\", JSON.stringify(clientContext));\n }\n\n for (const file of options.files) {\n formData.append(\"files\", file);\n }\n\n response = await this.httpClient.postFormData(\"/api/sdk/v1/messages\", formData);\n } else {\n response = await this.httpClient.postStream(\"/api/sdk/v1/messages\", body);\n }\n\n return this.processSSEResponse(response);\n }\n\n private async processSSEResponse(response: Response): Promise<AgoMessage> {\n const handler = new SSEHandler({\n onStart: (data) => {\n this.eventEmitter.emit(\"message:start\", data);\n },\n onChunk: (data) => {\n this.eventEmitter.emit(\"message:chunk\", data);\n },\n onToolCall: (toolCall) => {\n this.eventEmitter.emit(\"toolCall:received\", toolCall);\n\n if (toolCall.type === \"form\") {\n this.eventEmitter.emit(\"toolCall:form\", toolCall);\n }\n },\n onClientFunction: async (data) => {\n this.eventEmitter.emit(\"function:invoke\", data);\n await this.handleClientFunctionInvocation(data);\n },\n onComplete: (message) => {\n this.eventEmitter.emit(\"message:complete\", message);\n },\n onError: (error) => {\n this.eventEmitter.emit(\"message:error\", { error: error.message });\n },\n });\n\n return handler.processStream(response);\n }\n\n private async handleClientFunctionInvocation(data: {\n invocationId: string;\n functionName: string;\n arguments: Record<string, unknown>;\n conversationId: string;\n }): Promise<void> {\n let result: unknown;\n let error: string | undefined;\n\n try {\n result = await this.functionRegistry.execute(data.functionName, data.arguments);\n } catch (err) {\n error = err instanceof Error ? err.message : \"Unknown error\";\n logger.error(\"Client function execution failed:\", err);\n }\n\n // Submit result back to backend using existing tool-call submit endpoint.\n // The raw state SSE event carries no invocationId — in that flow the backend\n // already continued with a placeholder, so we just emit the local event.\n if (data.invocationId) {\n try {\n await this.submitToolCallForm(data.invocationId, {\n result,\n error,\n _type: \"client_function_result\",\n });\n } catch (submitError) {\n logger.error(\"Failed to submit function result:\", submitError);\n }\n }\n\n this.eventEmitter.emit(\"function:result\", {\n invocationId: data.invocationId,\n result,\n error,\n });\n }\n\n // ─────────────────────────────────────────────────────────────────\n // Conversations\n // ─────────────────────────────────────────────────────────────────\n\n /**\n * Get list of conversations\n */\n async getConversations(): Promise<Conversation[]> {\n const response = await this.httpClient.get<{\n count: number;\n items: Array<{\n id: string;\n title: string;\n last_message_date: string;\n }>;\n }>(\"/api/sdk/v1/conversations\");\n\n return response.items.map((item) => ({\n id: item.id,\n title: item.title,\n lastMessageDate: new Date(item.last_message_date),\n }));\n }\n\n /**\n * Get a specific conversation with messages\n */\n async getConversation(conversationId: string): Promise<Conversation> {\n const response = await this.httpClient.get<{\n id: string;\n title: string;\n last_message_date: string;\n messages: Array<{\n id: string;\n content: string;\n role: \"user\" | \"assistant\";\n status: string;\n created_at: string;\n }>;\n }>(`/api/sdk/v1/conversations/${conversationId}`);\n\n return {\n id: response.id,\n title: response.title,\n lastMessageDate: new Date(response.last_message_date),\n messages: response.messages.map((m) => ({\n id: m.id,\n conversationId: response.id,\n content: m.content,\n role: m.role,\n status: m.status as AgoMessage[\"status\"],\n createdAt: new Date(m.created_at),\n })),\n };\n }\n\n /**\n * Get messages for a conversation\n */\n async getMessages(conversationId: string): Promise<AgoMessage[]> {\n const conversation = await this.getConversation(conversationId);\n return conversation.messages || [];\n }\n\n // ─────────────────────────────────────────────────────────────────\n // Tool Calls\n // ─────────────────────────────────────────────────────────────────\n\n /**\n * Submit form data for a tool call\n */\n async submitToolCallForm(\n toolCallId: string,\n formData: Record<string, unknown>\n ): Promise<void> {\n await this.httpClient.post(`/api/tool-calls/${toolCallId}/submit/`, {\n formData,\n });\n }\n\n /**\n * Confirm a tool call\n */\n async confirmToolCall(toolCallId: string): Promise<void> {\n await this.httpClient.post(`/api/tool-calls/${toolCallId}/confirm/`);\n }\n\n /**\n * Reject a tool call\n */\n async rejectToolCall(toolCallId: string): Promise<void> {\n await this.httpClient.post(`/api/tool-calls/${toolCallId}/reject/`);\n }\n\n // ─────────────────────────────────────────────────────────────────\n // Feedback\n // ─────────────────────────────────────────────────────────────────\n\n /**\n * Submit feedback for a message\n */\n async submitFeedback(\n messageId: string,\n rating: \"positive\" | \"negative\"\n ): Promise<void> {\n await this.httpClient.post(`/api/sdk/v1/messages/${messageId}/feedback`, {\n rating,\n });\n }\n\n // ─────────────────────────────────────────────────────────────────\n // Client-side Functions\n // ─────────────────────────────────────────────────────────────────\n\n /**\n * Register a client-side function that AGO can call.\n * Accepts either a definition object or (name, handler, schema) args.\n *\n * ```ts\n * // Single-object (preferred)\n * client.registerFunction({\n * name: \"lookupOrder\",\n * description: \"Look up an order\",\n * parameters: { type: \"object\", properties: { id: { type: \"string\" } } },\n * handler: async (args) => fetchOrder(args.id),\n * });\n *\n * // Classic 3-arg form\n * client.registerFunction(\"lookupOrder\", handler, schema);\n * ```\n */\n registerFunction(definition: ClientFunctionDefinition): void;\n registerFunction(\n name: string,\n handler: ClientFunctionHandler,\n schema: Omit<ClientFunctionSchema, \"name\">\n ): void;\n registerFunction(\n nameOrDef: string | ClientFunctionDefinition,\n handler?: ClientFunctionHandler,\n schema?: Omit<ClientFunctionSchema, \"name\">\n ): void {\n if (typeof nameOrDef === \"object\") {\n this.functionRegistry.register(nameOrDef);\n } else {\n this.functionRegistry.register(nameOrDef, handler!, schema!);\n }\n }\n\n /**\n * Short alias for `registerFunction`. Also accepts an array of definitions.\n *\n * ```ts\n * client.register(lookupOrder);\n * client.register([lookupOrder, cancelOrder]);\n * ```\n */\n register(\n definition: ClientFunctionDefinition | ClientFunctionDefinition[]\n ): void {\n if (Array.isArray(definition)) {\n for (const def of definition) {\n this.functionRegistry.register(def);\n }\n } else {\n this.functionRegistry.register(definition);\n }\n }\n\n /**\n * Unregister a client-side function\n */\n unregisterFunction(name: string): boolean {\n return this.functionRegistry.unregister(name);\n }\n\n /**\n * Get all registered function schemas\n */\n getRegisteredFunctions(): ClientFunctionSchema[] {\n return this.functionRegistry.getSchemas();\n }\n\n /**\n * Register a navigation function that lets AGO navigate users to different pages.\n * @param navigate - A callback that performs the navigation (e.g. react-router's navigate)\n * @param routes - Map of route names to paths, with descriptions for the LLM\n */\n registerNavigationFunction(\n navigate: (path: string) => void,\n routes: Array<{ name: string; path: string; description: string }>\n ): void {\n const routeNames = routes.map((r) => r.name);\n const routeDescriptions = routes\n .map((r) => `- \"${r.name}\": ${r.description}`)\n .join(\"\\n\");\n\n this.registerFunction(\n \"navigateToPage\",\n async (args) => {\n const pageName = args.page as string;\n const route = routes.find((r) => r.name === pageName);\n if (!route) {\n return { success: false, error: `Unknown page: ${pageName}` };\n }\n navigate(route.path);\n return { success: true, navigatedTo: route.path };\n },\n {\n description: `Navigate the user to a page in the application. Available pages:\\n${routeDescriptions}`,\n parameters: {\n type: \"object\",\n properties: {\n page: {\n type: \"string\",\n description: \"The page to navigate to\",\n enum: routeNames,\n },\n },\n required: [\"page\"],\n },\n }\n );\n }\n\n // ─────────────────────────────────────────────────────────────────\n // Client Context\n // ─────────────────────────────────────────────────────────────────\n\n /**\n * Register or update a piece of client-side context.\n * This context is sent with every message so the AI understands the user's situation.\n *\n * ```ts\n * client.setContext(\"order-page\", {\n * name: \"Order detail\",\n * description: \"User is viewing order #123\",\n * data: { orderId: \"123\", status: \"shipped\" },\n * });\n * ```\n */\n setContext(key: string, entry: ContextEntry): void {\n this.contextRegistry.set(key, entry);\n }\n\n /**\n * Remove a previously registered context entry.\n */\n removeContext(key: string): boolean {\n return this.contextRegistry.remove(key);\n }\n\n /**\n * Register a dynamic context provider. The callback is invoked every time\n * a message is sent, so the AI always gets the freshest data.\n *\n * Use this for context that lives outside React state — global stores,\n * refs, or computed values.\n *\n * ```ts\n * client.addDynamicContext(\"cart\", () => ({\n * name: \"Checkout\",\n * data: { itemCount: cart.items.length, total: cart.total },\n * }));\n * ```\n */\n addDynamicContext(key: string, provider: DynamicContextProvider): void {\n this.contextRegistry.addDynamicProvider(key, provider);\n }\n\n /**\n * Remove a dynamic context provider.\n */\n removeDynamicContext(key: string): boolean {\n return this.contextRegistry.removeDynamicProvider(key);\n }\n\n /**\n * Enable automatic capture of the current browser page (URL + title).\n * Injected as a dynamic context entry named `browser-page`.\n */\n enableAutoPageContext(): void {\n this.contextRegistry.addDynamicProvider(\"browser-page\", () => {\n const url = typeof window !== \"undefined\" ? window.location.href : undefined;\n const title = typeof document !== \"undefined\" ? document.title : undefined;\n if (!url && !title) return null;\n return {\n name: \"Browser page\",\n description: \"Current page the user is viewing\",\n data: { url, title },\n };\n });\n }\n\n /**\n * Get the current context snapshot.\n */\n getContextSnapshot(): ContextSnapshot | null {\n return this.contextRegistry.getSnapshot();\n }\n\n // ─────────────────────────────────────────────────────────────────\n // Events\n // ─────────────────────────────────────────────────────────────────\n\n /**\n * Subscribe to an event\n */\n on<K extends AgoEventName>(event: K, handler: AgoEventHandler<K>): void {\n this.eventEmitter.on(event, handler);\n }\n\n /**\n * Unsubscribe from an event\n */\n off<K extends AgoEventName>(event: K, handler: AgoEventHandler<K>): void {\n this.eventEmitter.off(event, handler);\n }\n\n /**\n * Subscribe to an event once — auto-unsubscribes after the first call.\n */\n once<K extends AgoEventName>(event: K, handler: AgoEventHandler<K>): void {\n this.eventEmitter.once(event, handler);\n }\n\n /**\n * Returns a Promise that resolves the next time `event` fires.\n *\n * ```ts\n * const msg = await client.waitFor(\"message:complete\", { timeout: 10000 });\n * ```\n */\n waitFor<K extends AgoEventName>(\n event: K,\n options?: { timeout?: number }\n ): Promise<AgoClientEvents[K]> {\n return this.eventEmitter.waitFor(event, options);\n }\n\n // ─────────────────────────────────────────────────────────────────\n // Configuration\n // ─────────────────────────────────────────────────────────────────\n\n /**\n * Update client configuration\n */\n updateConfig(config: Partial<AgoConfig>): void {\n this.config = { ...this.config, ...config };\n this.httpClient.updateConfig(config);\n\n if (config.debug !== undefined) {\n config.debug ? logger.enable() : logger.disable();\n }\n }\n\n /**\n * Clean up resources\n */\n destroy(): void {\n this.eventEmitter.removeAllListeners();\n this.functionRegistry.clear();\n this.contextRegistry.clear();\n logger.log(\"AgoClient destroyed\");\n }\n}\n"],"names":["name"],"mappings":"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"}