@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
@@ -0,0 +1,98 @@
1
+ import { AgoClient } from "../client/AgoClient";
2
+ import type { AgoConfig, AgoMessage, Conversation, AgoClientEvents, AgoEventName, SendMessageOptions } from "../client/types";
3
+ import type { ClientFunctionDefinition, ClientFunctionHandler, ClientFunctionSchema } from "../functions/types";
4
+ interface Observable<T> {
5
+ subscribe(observer: {
6
+ next?: (value: T) => void;
7
+ error?: (err: unknown) => void;
8
+ }): {
9
+ unsubscribe: () => void;
10
+ };
11
+ }
12
+ /**
13
+ * Angular-style service wrapping AgoClient.
14
+ * Provides RxJS-like Observables for streaming events and standard Promise-based methods.
15
+ *
16
+ * Usage with Angular DI:
17
+ * ```ts
18
+ * import { provideAgo, AgoService } from "@useago/sdk/angular";
19
+ *
20
+ * // In providers array:
21
+ * provideAgo({ baseUrl: "https://YOUR-DOMAIN.useago.com" })
22
+ *
23
+ * // In component:
24
+ * @Component({...})
25
+ * export class ChatComponent {
26
+ * private ago = inject(AgoService);
27
+ * messages$ = this.ago.messages$;
28
+ * }
29
+ * ```
30
+ *
31
+ * Works without Angular DI too — just instantiate directly:
32
+ * ```ts
33
+ * const ago = new AgoService({ baseUrl: "https://YOUR-DOMAIN.useago.com" });
34
+ * ```
35
+ */
36
+ export declare class AgoService {
37
+ private client;
38
+ /** Observable of complete messages */
39
+ readonly messages$: Observable<AgoMessage>;
40
+ /** Observable of streaming chunks */
41
+ readonly chunks$: Observable<{
42
+ content: string;
43
+ conversationId: string;
44
+ messageId: string;
45
+ }>;
46
+ /** Observable of errors */
47
+ readonly errors$: Observable<{
48
+ error: string;
49
+ conversationId?: string;
50
+ messageId?: string;
51
+ }>;
52
+ /** Observable of message start events */
53
+ readonly messageStart$: Observable<{
54
+ conversationId: string;
55
+ messageId: string;
56
+ }>;
57
+ constructor(config: AgoConfig);
58
+ /** Create a minimal Observable from an AgoClient event */
59
+ private fromEvent;
60
+ /** Send a message and get a streaming response */
61
+ sendMessage(content: string, options?: SendMessageOptions): Promise<AgoMessage>;
62
+ /** Get all conversations */
63
+ getConversations(): Promise<Conversation[]>;
64
+ /** Get a specific conversation with messages */
65
+ getConversation(id: string): Promise<Conversation>;
66
+ /** Get messages for a conversation */
67
+ getMessages(conversationId: string): Promise<AgoMessage[]>;
68
+ /** Submit form data for a tool call */
69
+ submitToolCallForm(toolCallId: string, formData: Record<string, unknown>): Promise<void>;
70
+ /** Confirm a tool call */
71
+ confirmToolCall(toolCallId: string): Promise<void>;
72
+ /** Reject a tool call */
73
+ rejectToolCall(toolCallId: string): Promise<void>;
74
+ /** Submit feedback for a message */
75
+ submitFeedback(messageId: string, rating: "positive" | "negative"): Promise<void>;
76
+ /** Register a client-side function */
77
+ registerFunction(definition: ClientFunctionDefinition): void;
78
+ registerFunction(name: string, handler: ClientFunctionHandler, schema: Omit<ClientFunctionSchema, "name">): void;
79
+ /** Unregister a client-side function */
80
+ unregisterFunction(name: string): boolean;
81
+ /** Register navigation routes */
82
+ registerNavigationFunction(navigate: (path: string) => void, routes: Array<{
83
+ name: string;
84
+ path: string;
85
+ description: string;
86
+ }>): void;
87
+ /** Subscribe to a client event */
88
+ on<K extends AgoEventName>(event: K, handler: (data: AgoClientEvents[K]) => void): void;
89
+ /** Unsubscribe from a client event */
90
+ off<K extends AgoEventName>(event: K, handler: (data: AgoClientEvents[K]) => void): void;
91
+ /** Update client config */
92
+ updateConfig(config: Partial<AgoConfig>): void;
93
+ /** Get the underlying AgoClient instance */
94
+ getClient(): AgoClient;
95
+ /** Destroy the service and clean up resources */
96
+ destroy(): void;
97
+ }
98
+ export {};
@@ -0,0 +1,4 @@
1
+ export { AgoService } from "./ago.service";
2
+ export { provideAgo } from "./provide";
3
+ export type { AgoProvideOptions } from "./provide";
4
+ export type { AgoConfig, AgoMessage, Conversation, AgoAgent, AgoSource, ToolCallData, AgoClientEvents, AgoEventName, } from "../client/types";
@@ -0,0 +1,27 @@
1
+ import type { AgoConfig } from "../client/types";
2
+ import { AgoService } from "./ago.service";
3
+ export interface AgoProvideOptions extends AgoConfig {
4
+ }
5
+ /**
6
+ * Factory function that returns an Angular-compatible provider.
7
+ * Use in your app's `providers` array or `bootstrapApplication`:
8
+ *
9
+ * ```ts
10
+ * import { provideAgo, AgoService } from "@useago/sdk/angular";
11
+ *
12
+ * bootstrapApplication(AppComponent, {
13
+ * providers: [provideAgo({ baseUrl: "https://YOUR-DOMAIN.useago.com" })],
14
+ * });
15
+ *
16
+ * // Then inject in any component:
17
+ * const ago = inject(AgoService);
18
+ * ```
19
+ *
20
+ * Returns a provider tuple compatible with Angular's DI.
21
+ * Since this package avoids a hard Angular dependency, the provider
22
+ * is returned as a plain object — Angular's injector accepts this format.
23
+ */
24
+ export declare function provideAgo(options: AgoProvideOptions): {
25
+ provide: typeof AgoService;
26
+ useValue: AgoService;
27
+ };
@@ -0,0 +1,105 @@
1
+ "use strict";
2
+ Object.defineProperty(exports, Symbol.toStringTag, { value: "Module" });
3
+ const AgoClient = require("./AgoClient-BDO4avLq.cjs");
4
+ class AgoService {
5
+ constructor(config) {
6
+ this.client = new AgoClient.AgoClient(config);
7
+ this.messages$ = this.fromEvent("message:complete");
8
+ this.chunks$ = this.fromEvent("message:chunk");
9
+ this.errors$ = this.fromEvent("message:error");
10
+ this.messageStart$ = this.fromEvent("message:start");
11
+ }
12
+ /** Create a minimal Observable from an AgoClient event */
13
+ fromEvent(event) {
14
+ const client = this.client;
15
+ return {
16
+ subscribe(observer) {
17
+ const handler = (data) => {
18
+ var _a;
19
+ (_a = observer.next) == null ? void 0 : _a.call(observer, data);
20
+ };
21
+ client.on(event, handler);
22
+ return {
23
+ unsubscribe: () => client.off(event, handler)
24
+ };
25
+ }
26
+ };
27
+ }
28
+ /** Send a message and get a streaming response */
29
+ sendMessage(content, options) {
30
+ return this.client.sendMessage(content, options);
31
+ }
32
+ /** Get all conversations */
33
+ getConversations() {
34
+ return this.client.getConversations();
35
+ }
36
+ /** Get a specific conversation with messages */
37
+ getConversation(id) {
38
+ return this.client.getConversation(id);
39
+ }
40
+ /** Get messages for a conversation */
41
+ getMessages(conversationId) {
42
+ return this.client.getMessages(conversationId);
43
+ }
44
+ /** Submit form data for a tool call */
45
+ submitToolCallForm(toolCallId, formData) {
46
+ return this.client.submitToolCallForm(toolCallId, formData);
47
+ }
48
+ /** Confirm a tool call */
49
+ confirmToolCall(toolCallId) {
50
+ return this.client.confirmToolCall(toolCallId);
51
+ }
52
+ /** Reject a tool call */
53
+ rejectToolCall(toolCallId) {
54
+ return this.client.rejectToolCall(toolCallId);
55
+ }
56
+ /** Submit feedback for a message */
57
+ submitFeedback(messageId, rating) {
58
+ return this.client.submitFeedback(messageId, rating);
59
+ }
60
+ registerFunction(nameOrDef, handler, schema) {
61
+ if (typeof nameOrDef === "object") {
62
+ this.client.registerFunction(nameOrDef);
63
+ } else {
64
+ this.client.registerFunction(nameOrDef, handler, schema);
65
+ }
66
+ }
67
+ /** Unregister a client-side function */
68
+ unregisterFunction(name) {
69
+ return this.client.unregisterFunction(name);
70
+ }
71
+ /** Register navigation routes */
72
+ registerNavigationFunction(navigate, routes) {
73
+ this.client.registerNavigationFunction(navigate, routes);
74
+ }
75
+ /** Subscribe to a client event */
76
+ on(event, handler) {
77
+ this.client.on(event, handler);
78
+ }
79
+ /** Unsubscribe from a client event */
80
+ off(event, handler) {
81
+ this.client.off(event, handler);
82
+ }
83
+ /** Update client config */
84
+ updateConfig(config) {
85
+ this.client.updateConfig(config);
86
+ }
87
+ /** Get the underlying AgoClient instance */
88
+ getClient() {
89
+ return this.client;
90
+ }
91
+ /** Destroy the service and clean up resources */
92
+ destroy() {
93
+ this.client.destroy();
94
+ }
95
+ }
96
+ function provideAgo(options) {
97
+ const service = new AgoService(options);
98
+ return {
99
+ provide: AgoService,
100
+ useValue: service
101
+ };
102
+ }
103
+ exports.AgoService = AgoService;
104
+ exports.provideAgo = provideAgo;
105
+ //# sourceMappingURL=angular.cjs.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"angular.cjs","sources":["../src/angular/ago.service.ts","../src/angular/provide.ts"],"sourcesContent":["import { AgoClient } from \"../client/AgoClient\";\nimport type {\n AgoConfig,\n AgoMessage,\n Conversation,\n AgoClientEvents,\n AgoEventName,\n SendMessageOptions,\n} from \"../client/types\";\nimport type { ClientFunctionDefinition, ClientFunctionHandler, ClientFunctionSchema } from \"../functions/types\";\n\ninterface Observable<T> {\n subscribe(observer: { next?: (value: T) => void; error?: (err: unknown) => void }): { unsubscribe: () => void };\n}\n\n/**\n * Angular-style service wrapping AgoClient.\n * Provides RxJS-like Observables for streaming events and standard Promise-based methods.\n *\n * Usage with Angular DI:\n * ```ts\n * import { provideAgo, AgoService } from \"@useago/sdk/angular\";\n *\n * // In providers array:\n * provideAgo({ baseUrl: \"https://YOUR-DOMAIN.useago.com\" })\n *\n * // In component:\n * @Component({...})\n * export class ChatComponent {\n * private ago = inject(AgoService);\n * messages$ = this.ago.messages$;\n * }\n * ```\n *\n * Works without Angular DI too — just instantiate directly:\n * ```ts\n * const ago = new AgoService({ baseUrl: \"https://YOUR-DOMAIN.useago.com\" });\n * ```\n */\nexport class AgoService {\n private client: AgoClient;\n\n /** Observable of complete messages */\n readonly messages$: Observable<AgoMessage>;\n\n /** Observable of streaming chunks */\n readonly chunks$: Observable<{ content: string; conversationId: string; messageId: string }>;\n\n /** Observable of errors */\n readonly errors$: Observable<{ error: string; conversationId?: string; messageId?: string }>;\n\n /** Observable of message start events */\n readonly messageStart$: Observable<{ conversationId: string; messageId: string }>;\n\n constructor(config: AgoConfig) {\n this.client = new AgoClient(config);\n\n this.messages$ = this.fromEvent(\"message:complete\");\n this.chunks$ = this.fromEvent(\"message:chunk\");\n this.errors$ = this.fromEvent(\"message:error\");\n this.messageStart$ = this.fromEvent(\"message:start\");\n }\n\n /** Create a minimal Observable from an AgoClient event */\n private fromEvent<K extends AgoEventName>(event: K): Observable<AgoClientEvents[K]> {\n const client = this.client;\n return {\n subscribe(observer: { next?: (value: AgoClientEvents[K]) => void; error?: (err: unknown) => void }) {\n const handler = (data: AgoClientEvents[K]) => {\n observer.next?.(data);\n };\n client.on(event, handler);\n return {\n unsubscribe: () => client.off(event, handler),\n };\n },\n };\n }\n\n /** Send a message and get a streaming response */\n sendMessage(content: string, options?: SendMessageOptions): Promise<AgoMessage> {\n return this.client.sendMessage(content, options);\n }\n\n /** Get all conversations */\n getConversations(): Promise<Conversation[]> {\n return this.client.getConversations();\n }\n\n /** Get a specific conversation with messages */\n getConversation(id: string): Promise<Conversation> {\n return this.client.getConversation(id);\n }\n\n /** Get messages for a conversation */\n getMessages(conversationId: string): Promise<AgoMessage[]> {\n return this.client.getMessages(conversationId);\n }\n\n /** Submit form data for a tool call */\n submitToolCallForm(toolCallId: string, formData: Record<string, unknown>): Promise<void> {\n return this.client.submitToolCallForm(toolCallId, formData);\n }\n\n /** Confirm a tool call */\n confirmToolCall(toolCallId: string): Promise<void> {\n return this.client.confirmToolCall(toolCallId);\n }\n\n /** Reject a tool call */\n rejectToolCall(toolCallId: string): Promise<void> {\n return this.client.rejectToolCall(toolCallId);\n }\n\n /** Submit feedback for a message */\n submitFeedback(messageId: string, rating: \"positive\" | \"negative\"): Promise<void> {\n return this.client.submitFeedback(messageId, rating);\n }\n\n /** Register a client-side function */\n registerFunction(definition: ClientFunctionDefinition): void;\n registerFunction(name: string, handler: ClientFunctionHandler, schema: Omit<ClientFunctionSchema, \"name\">): void;\n registerFunction(\n nameOrDef: string | ClientFunctionDefinition,\n handler?: ClientFunctionHandler,\n schema?: Omit<ClientFunctionSchema, \"name\">\n ): void {\n if (typeof nameOrDef === \"object\") {\n this.client.registerFunction(nameOrDef);\n } else {\n this.client.registerFunction(nameOrDef, handler!, schema!);\n }\n }\n\n /** Unregister a client-side function */\n unregisterFunction(name: string): boolean {\n return this.client.unregisterFunction(name);\n }\n\n /** Register navigation routes */\n registerNavigationFunction(\n navigate: (path: string) => void,\n routes: Array<{ name: string; path: string; description: string }>\n ): void {\n this.client.registerNavigationFunction(navigate, routes);\n }\n\n /** Subscribe to a client event */\n on<K extends AgoEventName>(\n event: K,\n handler: (data: AgoClientEvents[K]) => void\n ): void {\n this.client.on(event, handler);\n }\n\n /** Unsubscribe from a client event */\n off<K extends AgoEventName>(\n event: K,\n handler: (data: AgoClientEvents[K]) => void\n ): void {\n this.client.off(event, handler);\n }\n\n /** Update client config */\n updateConfig(config: Partial<AgoConfig>): void {\n this.client.updateConfig(config);\n }\n\n /** Get the underlying AgoClient instance */\n getClient(): AgoClient {\n return this.client;\n }\n\n /** Destroy the service and clean up resources */\n destroy(): void {\n this.client.destroy();\n }\n}\n","import type { AgoConfig } from \"../client/types\";\nimport { AgoService } from \"./ago.service\";\n\nexport interface AgoProvideOptions extends AgoConfig {}\n\n/**\n * Factory function that returns an Angular-compatible provider.\n * Use in your app's `providers` array or `bootstrapApplication`:\n *\n * ```ts\n * import { provideAgo, AgoService } from \"@useago/sdk/angular\";\n *\n * bootstrapApplication(AppComponent, {\n * providers: [provideAgo({ baseUrl: \"https://YOUR-DOMAIN.useago.com\" })],\n * });\n *\n * // Then inject in any component:\n * const ago = inject(AgoService);\n * ```\n *\n * Returns a provider tuple compatible with Angular's DI.\n * Since this package avoids a hard Angular dependency, the provider\n * is returned as a plain object — Angular's injector accepts this format.\n */\nexport function provideAgo(options: AgoProvideOptions) {\n const service = new AgoService(options);\n return {\n provide: AgoService,\n useValue: service,\n };\n}\n"],"names":["AgoClient"],"mappings":";;;AAuCO,MAAM,WAAW;AAAA,EAetB,YAAY,QAAmB;AAC7B,SAAK,SAAS,IAAIA,UAAAA,UAAU,MAAM;AAElC,SAAK,YAAY,KAAK,UAAU,kBAAkB;AAClD,SAAK,UAAU,KAAK,UAAU,eAAe;AAC7C,SAAK,UAAU,KAAK,UAAU,eAAe;AAC7C,SAAK,gBAAgB,KAAK,UAAU,eAAe;AAAA,EACrD;AAAA;AAAA,EAGQ,UAAkC,OAA0C;AAClF,UAAM,SAAS,KAAK;AACpB,WAAO;AAAA,MACL,UAAU,UAA0F;AAClG,cAAM,UAAU,CAAC,SAA6B;;AAC5C,yBAAS,SAAT,kCAAgB;AAAA,QAClB;AACA,eAAO,GAAG,OAAO,OAAO;AACxB,eAAO;AAAA,UACL,aAAa,MAAM,OAAO,IAAI,OAAO,OAAO;AAAA,QAAA;AAAA,MAEhD;AAAA,IAAA;AAAA,EAEJ;AAAA;AAAA,EAGA,YAAY,SAAiB,SAAmD;AAC9E,WAAO,KAAK,OAAO,YAAY,SAAS,OAAO;AAAA,EACjD;AAAA;AAAA,EAGA,mBAA4C;AAC1C,WAAO,KAAK,OAAO,iBAAA;AAAA,EACrB;AAAA;AAAA,EAGA,gBAAgB,IAAmC;AACjD,WAAO,KAAK,OAAO,gBAAgB,EAAE;AAAA,EACvC;AAAA;AAAA,EAGA,YAAY,gBAA+C;AACzD,WAAO,KAAK,OAAO,YAAY,cAAc;AAAA,EAC/C;AAAA;AAAA,EAGA,mBAAmB,YAAoB,UAAkD;AACvF,WAAO,KAAK,OAAO,mBAAmB,YAAY,QAAQ;AAAA,EAC5D;AAAA;AAAA,EAGA,gBAAgB,YAAmC;AACjD,WAAO,KAAK,OAAO,gBAAgB,UAAU;AAAA,EAC/C;AAAA;AAAA,EAGA,eAAe,YAAmC;AAChD,WAAO,KAAK,OAAO,eAAe,UAAU;AAAA,EAC9C;AAAA;AAAA,EAGA,eAAe,WAAmB,QAAgD;AAChF,WAAO,KAAK,OAAO,eAAe,WAAW,MAAM;AAAA,EACrD;AAAA,EAKA,iBACE,WACA,SACA,QACM;AACN,QAAI,OAAO,cAAc,UAAU;AACjC,WAAK,OAAO,iBAAiB,SAAS;AAAA,IACxC,OAAO;AACL,WAAK,OAAO,iBAAiB,WAAW,SAAU,MAAO;AAAA,IAC3D;AAAA,EACF;AAAA;AAAA,EAGA,mBAAmB,MAAuB;AACxC,WAAO,KAAK,OAAO,mBAAmB,IAAI;AAAA,EAC5C;AAAA;AAAA,EAGA,2BACE,UACA,QACM;AACN,SAAK,OAAO,2BAA2B,UAAU,MAAM;AAAA,EACzD;AAAA;AAAA,EAGA,GACE,OACA,SACM;AACN,SAAK,OAAO,GAAG,OAAO,OAAO;AAAA,EAC/B;AAAA;AAAA,EAGA,IACE,OACA,SACM;AACN,SAAK,OAAO,IAAI,OAAO,OAAO;AAAA,EAChC;AAAA;AAAA,EAGA,aAAa,QAAkC;AAC7C,SAAK,OAAO,aAAa,MAAM;AAAA,EACjC;AAAA;AAAA,EAGA,YAAuB;AACrB,WAAO,KAAK;AAAA,EACd;AAAA;AAAA,EAGA,UAAgB;AACd,SAAK,OAAO,QAAA;AAAA,EACd;AACF;ACzJO,SAAS,WAAW,SAA4B;AACrD,QAAM,UAAU,IAAI,WAAW,OAAO;AACtC,SAAO;AAAA,IACL,SAAS;AAAA,IACT,UAAU;AAAA,EAAA;AAEd;;;"}
@@ -0,0 +1 @@
1
+ export * from './angular/index'
@@ -0,0 +1,105 @@
1
+ import { A as AgoClient } from "./AgoClient-D-c91tx5.js";
2
+ class AgoService {
3
+ constructor(config) {
4
+ this.client = new AgoClient(config);
5
+ this.messages$ = this.fromEvent("message:complete");
6
+ this.chunks$ = this.fromEvent("message:chunk");
7
+ this.errors$ = this.fromEvent("message:error");
8
+ this.messageStart$ = this.fromEvent("message:start");
9
+ }
10
+ /** Create a minimal Observable from an AgoClient event */
11
+ fromEvent(event) {
12
+ const client = this.client;
13
+ return {
14
+ subscribe(observer) {
15
+ const handler = (data) => {
16
+ var _a;
17
+ (_a = observer.next) == null ? void 0 : _a.call(observer, data);
18
+ };
19
+ client.on(event, handler);
20
+ return {
21
+ unsubscribe: () => client.off(event, handler)
22
+ };
23
+ }
24
+ };
25
+ }
26
+ /** Send a message and get a streaming response */
27
+ sendMessage(content, options) {
28
+ return this.client.sendMessage(content, options);
29
+ }
30
+ /** Get all conversations */
31
+ getConversations() {
32
+ return this.client.getConversations();
33
+ }
34
+ /** Get a specific conversation with messages */
35
+ getConversation(id) {
36
+ return this.client.getConversation(id);
37
+ }
38
+ /** Get messages for a conversation */
39
+ getMessages(conversationId) {
40
+ return this.client.getMessages(conversationId);
41
+ }
42
+ /** Submit form data for a tool call */
43
+ submitToolCallForm(toolCallId, formData) {
44
+ return this.client.submitToolCallForm(toolCallId, formData);
45
+ }
46
+ /** Confirm a tool call */
47
+ confirmToolCall(toolCallId) {
48
+ return this.client.confirmToolCall(toolCallId);
49
+ }
50
+ /** Reject a tool call */
51
+ rejectToolCall(toolCallId) {
52
+ return this.client.rejectToolCall(toolCallId);
53
+ }
54
+ /** Submit feedback for a message */
55
+ submitFeedback(messageId, rating) {
56
+ return this.client.submitFeedback(messageId, rating);
57
+ }
58
+ registerFunction(nameOrDef, handler, schema) {
59
+ if (typeof nameOrDef === "object") {
60
+ this.client.registerFunction(nameOrDef);
61
+ } else {
62
+ this.client.registerFunction(nameOrDef, handler, schema);
63
+ }
64
+ }
65
+ /** Unregister a client-side function */
66
+ unregisterFunction(name) {
67
+ return this.client.unregisterFunction(name);
68
+ }
69
+ /** Register navigation routes */
70
+ registerNavigationFunction(navigate, routes) {
71
+ this.client.registerNavigationFunction(navigate, routes);
72
+ }
73
+ /** Subscribe to a client event */
74
+ on(event, handler) {
75
+ this.client.on(event, handler);
76
+ }
77
+ /** Unsubscribe from a client event */
78
+ off(event, handler) {
79
+ this.client.off(event, handler);
80
+ }
81
+ /** Update client config */
82
+ updateConfig(config) {
83
+ this.client.updateConfig(config);
84
+ }
85
+ /** Get the underlying AgoClient instance */
86
+ getClient() {
87
+ return this.client;
88
+ }
89
+ /** Destroy the service and clean up resources */
90
+ destroy() {
91
+ this.client.destroy();
92
+ }
93
+ }
94
+ function provideAgo(options) {
95
+ const service = new AgoService(options);
96
+ return {
97
+ provide: AgoService,
98
+ useValue: service
99
+ };
100
+ }
101
+ export {
102
+ AgoService,
103
+ provideAgo
104
+ };
105
+ //# sourceMappingURL=angular.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"angular.js","sources":["../src/angular/ago.service.ts","../src/angular/provide.ts"],"sourcesContent":["import { AgoClient } from \"../client/AgoClient\";\nimport type {\n AgoConfig,\n AgoMessage,\n Conversation,\n AgoClientEvents,\n AgoEventName,\n SendMessageOptions,\n} from \"../client/types\";\nimport type { ClientFunctionDefinition, ClientFunctionHandler, ClientFunctionSchema } from \"../functions/types\";\n\ninterface Observable<T> {\n subscribe(observer: { next?: (value: T) => void; error?: (err: unknown) => void }): { unsubscribe: () => void };\n}\n\n/**\n * Angular-style service wrapping AgoClient.\n * Provides RxJS-like Observables for streaming events and standard Promise-based methods.\n *\n * Usage with Angular DI:\n * ```ts\n * import { provideAgo, AgoService } from \"@useago/sdk/angular\";\n *\n * // In providers array:\n * provideAgo({ baseUrl: \"https://YOUR-DOMAIN.useago.com\" })\n *\n * // In component:\n * @Component({...})\n * export class ChatComponent {\n * private ago = inject(AgoService);\n * messages$ = this.ago.messages$;\n * }\n * ```\n *\n * Works without Angular DI too — just instantiate directly:\n * ```ts\n * const ago = new AgoService({ baseUrl: \"https://YOUR-DOMAIN.useago.com\" });\n * ```\n */\nexport class AgoService {\n private client: AgoClient;\n\n /** Observable of complete messages */\n readonly messages$: Observable<AgoMessage>;\n\n /** Observable of streaming chunks */\n readonly chunks$: Observable<{ content: string; conversationId: string; messageId: string }>;\n\n /** Observable of errors */\n readonly errors$: Observable<{ error: string; conversationId?: string; messageId?: string }>;\n\n /** Observable of message start events */\n readonly messageStart$: Observable<{ conversationId: string; messageId: string }>;\n\n constructor(config: AgoConfig) {\n this.client = new AgoClient(config);\n\n this.messages$ = this.fromEvent(\"message:complete\");\n this.chunks$ = this.fromEvent(\"message:chunk\");\n this.errors$ = this.fromEvent(\"message:error\");\n this.messageStart$ = this.fromEvent(\"message:start\");\n }\n\n /** Create a minimal Observable from an AgoClient event */\n private fromEvent<K extends AgoEventName>(event: K): Observable<AgoClientEvents[K]> {\n const client = this.client;\n return {\n subscribe(observer: { next?: (value: AgoClientEvents[K]) => void; error?: (err: unknown) => void }) {\n const handler = (data: AgoClientEvents[K]) => {\n observer.next?.(data);\n };\n client.on(event, handler);\n return {\n unsubscribe: () => client.off(event, handler),\n };\n },\n };\n }\n\n /** Send a message and get a streaming response */\n sendMessage(content: string, options?: SendMessageOptions): Promise<AgoMessage> {\n return this.client.sendMessage(content, options);\n }\n\n /** Get all conversations */\n getConversations(): Promise<Conversation[]> {\n return this.client.getConversations();\n }\n\n /** Get a specific conversation with messages */\n getConversation(id: string): Promise<Conversation> {\n return this.client.getConversation(id);\n }\n\n /** Get messages for a conversation */\n getMessages(conversationId: string): Promise<AgoMessage[]> {\n return this.client.getMessages(conversationId);\n }\n\n /** Submit form data for a tool call */\n submitToolCallForm(toolCallId: string, formData: Record<string, unknown>): Promise<void> {\n return this.client.submitToolCallForm(toolCallId, formData);\n }\n\n /** Confirm a tool call */\n confirmToolCall(toolCallId: string): Promise<void> {\n return this.client.confirmToolCall(toolCallId);\n }\n\n /** Reject a tool call */\n rejectToolCall(toolCallId: string): Promise<void> {\n return this.client.rejectToolCall(toolCallId);\n }\n\n /** Submit feedback for a message */\n submitFeedback(messageId: string, rating: \"positive\" | \"negative\"): Promise<void> {\n return this.client.submitFeedback(messageId, rating);\n }\n\n /** Register a client-side function */\n registerFunction(definition: ClientFunctionDefinition): void;\n registerFunction(name: string, handler: ClientFunctionHandler, schema: Omit<ClientFunctionSchema, \"name\">): void;\n registerFunction(\n nameOrDef: string | ClientFunctionDefinition,\n handler?: ClientFunctionHandler,\n schema?: Omit<ClientFunctionSchema, \"name\">\n ): void {\n if (typeof nameOrDef === \"object\") {\n this.client.registerFunction(nameOrDef);\n } else {\n this.client.registerFunction(nameOrDef, handler!, schema!);\n }\n }\n\n /** Unregister a client-side function */\n unregisterFunction(name: string): boolean {\n return this.client.unregisterFunction(name);\n }\n\n /** Register navigation routes */\n registerNavigationFunction(\n navigate: (path: string) => void,\n routes: Array<{ name: string; path: string; description: string }>\n ): void {\n this.client.registerNavigationFunction(navigate, routes);\n }\n\n /** Subscribe to a client event */\n on<K extends AgoEventName>(\n event: K,\n handler: (data: AgoClientEvents[K]) => void\n ): void {\n this.client.on(event, handler);\n }\n\n /** Unsubscribe from a client event */\n off<K extends AgoEventName>(\n event: K,\n handler: (data: AgoClientEvents[K]) => void\n ): void {\n this.client.off(event, handler);\n }\n\n /** Update client config */\n updateConfig(config: Partial<AgoConfig>): void {\n this.client.updateConfig(config);\n }\n\n /** Get the underlying AgoClient instance */\n getClient(): AgoClient {\n return this.client;\n }\n\n /** Destroy the service and clean up resources */\n destroy(): void {\n this.client.destroy();\n }\n}\n","import type { AgoConfig } from \"../client/types\";\nimport { AgoService } from \"./ago.service\";\n\nexport interface AgoProvideOptions extends AgoConfig {}\n\n/**\n * Factory function that returns an Angular-compatible provider.\n * Use in your app's `providers` array or `bootstrapApplication`:\n *\n * ```ts\n * import { provideAgo, AgoService } from \"@useago/sdk/angular\";\n *\n * bootstrapApplication(AppComponent, {\n * providers: [provideAgo({ baseUrl: \"https://YOUR-DOMAIN.useago.com\" })],\n * });\n *\n * // Then inject in any component:\n * const ago = inject(AgoService);\n * ```\n *\n * Returns a provider tuple compatible with Angular's DI.\n * Since this package avoids a hard Angular dependency, the provider\n * is returned as a plain object — Angular's injector accepts this format.\n */\nexport function provideAgo(options: AgoProvideOptions) {\n const service = new AgoService(options);\n return {\n provide: AgoService,\n useValue: service,\n };\n}\n"],"names":[],"mappings":";AAuCO,MAAM,WAAW;AAAA,EAetB,YAAY,QAAmB;AAC7B,SAAK,SAAS,IAAI,UAAU,MAAM;AAElC,SAAK,YAAY,KAAK,UAAU,kBAAkB;AAClD,SAAK,UAAU,KAAK,UAAU,eAAe;AAC7C,SAAK,UAAU,KAAK,UAAU,eAAe;AAC7C,SAAK,gBAAgB,KAAK,UAAU,eAAe;AAAA,EACrD;AAAA;AAAA,EAGQ,UAAkC,OAA0C;AAClF,UAAM,SAAS,KAAK;AACpB,WAAO;AAAA,MACL,UAAU,UAA0F;AAClG,cAAM,UAAU,CAAC,SAA6B;;AAC5C,yBAAS,SAAT,kCAAgB;AAAA,QAClB;AACA,eAAO,GAAG,OAAO,OAAO;AACxB,eAAO;AAAA,UACL,aAAa,MAAM,OAAO,IAAI,OAAO,OAAO;AAAA,QAAA;AAAA,MAEhD;AAAA,IAAA;AAAA,EAEJ;AAAA;AAAA,EAGA,YAAY,SAAiB,SAAmD;AAC9E,WAAO,KAAK,OAAO,YAAY,SAAS,OAAO;AAAA,EACjD;AAAA;AAAA,EAGA,mBAA4C;AAC1C,WAAO,KAAK,OAAO,iBAAA;AAAA,EACrB;AAAA;AAAA,EAGA,gBAAgB,IAAmC;AACjD,WAAO,KAAK,OAAO,gBAAgB,EAAE;AAAA,EACvC;AAAA;AAAA,EAGA,YAAY,gBAA+C;AACzD,WAAO,KAAK,OAAO,YAAY,cAAc;AAAA,EAC/C;AAAA;AAAA,EAGA,mBAAmB,YAAoB,UAAkD;AACvF,WAAO,KAAK,OAAO,mBAAmB,YAAY,QAAQ;AAAA,EAC5D;AAAA;AAAA,EAGA,gBAAgB,YAAmC;AACjD,WAAO,KAAK,OAAO,gBAAgB,UAAU;AAAA,EAC/C;AAAA;AAAA,EAGA,eAAe,YAAmC;AAChD,WAAO,KAAK,OAAO,eAAe,UAAU;AAAA,EAC9C;AAAA;AAAA,EAGA,eAAe,WAAmB,QAAgD;AAChF,WAAO,KAAK,OAAO,eAAe,WAAW,MAAM;AAAA,EACrD;AAAA,EAKA,iBACE,WACA,SACA,QACM;AACN,QAAI,OAAO,cAAc,UAAU;AACjC,WAAK,OAAO,iBAAiB,SAAS;AAAA,IACxC,OAAO;AACL,WAAK,OAAO,iBAAiB,WAAW,SAAU,MAAO;AAAA,IAC3D;AAAA,EACF;AAAA;AAAA,EAGA,mBAAmB,MAAuB;AACxC,WAAO,KAAK,OAAO,mBAAmB,IAAI;AAAA,EAC5C;AAAA;AAAA,EAGA,2BACE,UACA,QACM;AACN,SAAK,OAAO,2BAA2B,UAAU,MAAM;AAAA,EACzD;AAAA;AAAA,EAGA,GACE,OACA,SACM;AACN,SAAK,OAAO,GAAG,OAAO,OAAO;AAAA,EAC/B;AAAA;AAAA,EAGA,IACE,OACA,SACM;AACN,SAAK,OAAO,IAAI,OAAO,OAAO;AAAA,EAChC;AAAA;AAAA,EAGA,aAAa,QAAkC;AAC7C,SAAK,OAAO,aAAa,MAAM;AAAA,EACjC;AAAA;AAAA,EAGA,YAAuB;AACrB,WAAO,KAAK;AAAA,EACd;AAAA;AAAA,EAGA,UAAgB;AACd,SAAK,OAAO,QAAA;AAAA,EACd;AACF;ACzJO,SAAS,WAAW,SAA4B;AACrD,QAAM,UAAU,IAAI,WAAW,OAAO;AACtC,SAAO;AAAA,IACL,SAAS;AAAA,IACT,UAAU;AAAA,EAAA;AAEd;"}
@@ -0,0 +1,39 @@
1
+ import { AgoClient } from "../client/AgoClient";
2
+ import type { AgoConfig } from "../client/types";
3
+ /**
4
+ * Auto-detect AGO configuration from the DOM environment.
5
+ *
6
+ * Checks (in order of priority):
7
+ * 1. `window.AGO` global object (widget config)
8
+ * 2. `<meta>` tags: `<meta name="ago-api-key" content="...">`
9
+ * 3. `data-ago-*` attributes on `<body>` or `<script data-ago-api-key="...">`
10
+ * 4. Explicit overrides passed as argument
11
+ *
12
+ * Returns null if no API key can be found.
13
+ */
14
+ export declare function autoDetectConfig(overrides?: Partial<AgoConfig>): AgoConfig | null;
15
+ /**
16
+ * Create an AgoClient with zero configuration.
17
+ * Auto-detects config from window.AGO, meta tags, and data-ago-* attributes.
18
+ *
19
+ * ```html
20
+ * <!-- In your HTML -->
21
+ * <meta name="ago-base-url" content="https://YOUR-DOMAIN.useago.com">
22
+ *
23
+ * <!-- Or on a script tag -->
24
+ * <script src="app.js" data-ago-base-url="https://YOUR-DOMAIN.useago.com"></script>
25
+ * ```
26
+ *
27
+ * ```ts
28
+ * import { createAgo } from "@useago/sdk";
29
+ *
30
+ * // Zero config — picks up from DOM
31
+ * const client = createAgo();
32
+ *
33
+ * // Or with partial overrides
34
+ * const client = createAgo({ debug: true });
35
+ * ```
36
+ *
37
+ * Throws if no base URL can be detected.
38
+ */
39
+ export declare function createAgo(overrides?: Partial<AgoConfig>): AgoClient;
@@ -0,0 +1 @@
1
+ export { createAgo, autoDetectConfig } from "./createAgo";
@@ -1,4 +1,5 @@
1
1
  import type { ClientFunctionDefinition, ClientFunctionHandler, ClientFunctionSchema } from "../functions/types";
2
+ import type { ContextEntry, ContextSnapshot, DynamicContextProvider } from "../state/ClientContextRegistry";
2
3
  import type { AgoConfig, AgoClientEvents, AgoEventName, AgoEventHandler, AgoMessage, Conversation, SendMessageOptions } from "./types";
3
4
  /**
4
5
  * Main SDK client for AGO Chat integration
@@ -6,6 +7,7 @@ import type { AgoConfig, AgoClientEvents, AgoEventName, AgoEventHandler, AgoMess
6
7
  export declare class AgoClient {
7
8
  private httpClient;
8
9
  private functionRegistry;
10
+ private contextRegistry;
9
11
  private eventEmitter;
10
12
  private config;
11
13
  constructor(config: AgoConfig);
@@ -62,6 +64,15 @@ export declare class AgoClient {
62
64
  */
63
65
  registerFunction(definition: ClientFunctionDefinition): void;
64
66
  registerFunction(name: string, handler: ClientFunctionHandler, schema: Omit<ClientFunctionSchema, "name">): void;
67
+ /**
68
+ * Short alias for `registerFunction`. Also accepts an array of definitions.
69
+ *
70
+ * ```ts
71
+ * client.register(lookupOrder);
72
+ * client.register([lookupOrder, cancelOrder]);
73
+ * ```
74
+ */
75
+ register(definition: ClientFunctionDefinition | ClientFunctionDefinition[]): void;
65
76
  /**
66
77
  * Unregister a client-side function
67
78
  */
@@ -80,6 +91,51 @@ export declare class AgoClient {
80
91
  path: string;
81
92
  description: string;
82
93
  }>): void;
94
+ /**
95
+ * Register or update a piece of client-side context.
96
+ * This context is sent with every message so the AI understands the user's situation.
97
+ *
98
+ * ```ts
99
+ * client.setContext("order-page", {
100
+ * name: "Order detail",
101
+ * description: "User is viewing order #123",
102
+ * data: { orderId: "123", status: "shipped" },
103
+ * });
104
+ * ```
105
+ */
106
+ setContext(key: string, entry: ContextEntry): void;
107
+ /**
108
+ * Remove a previously registered context entry.
109
+ */
110
+ removeContext(key: string): boolean;
111
+ /**
112
+ * Register a dynamic context provider. The callback is invoked every time
113
+ * a message is sent, so the AI always gets the freshest data.
114
+ *
115
+ * Use this for context that lives outside React state — global stores,
116
+ * refs, or computed values.
117
+ *
118
+ * ```ts
119
+ * client.addDynamicContext("cart", () => ({
120
+ * name: "Checkout",
121
+ * data: { itemCount: cart.items.length, total: cart.total },
122
+ * }));
123
+ * ```
124
+ */
125
+ addDynamicContext(key: string, provider: DynamicContextProvider): void;
126
+ /**
127
+ * Remove a dynamic context provider.
128
+ */
129
+ removeDynamicContext(key: string): boolean;
130
+ /**
131
+ * Enable automatic capture of the current browser page (URL + title).
132
+ * Injected as a dynamic context entry named `browser-page`.
133
+ */
134
+ enableAutoPageContext(): void;
135
+ /**
136
+ * Get the current context snapshot.
137
+ */
138
+ getContextSnapshot(): ContextSnapshot | null;
83
139
  /**
84
140
  * Subscribe to an event
85
141
  */
@@ -2,12 +2,10 @@
2
2
  * SDK Configuration
3
3
  */
4
4
  export interface AgoConfig {
5
- /** Widget API key (X-Widget-Key header) */
6
- apiKey: string;
7
- /** Widget ID (X-Widget-Id header) */
8
- widgetId: string;
9
- /** API base URL (default: https://api.useago.com) */
10
- baseUrl?: string;
5
+ /** API base URL (e.g., https://YOUR-DOMAIN.useago.com) */
6
+ baseUrl: string;
7
+ /** Widget ID (X-Widget-Id header). Auto-generated if not provided. */
8
+ widgetId?: string;
11
9
  /** Default agent ID for new conversations */
12
10
  defaultAgentId?: string;
13
11
  /** User email for identification */
@@ -0,0 +1,94 @@
1
+ function createMockClient(options = {}) {
2
+ const { overrides = {} } = options;
3
+ const noopMessage = {
4
+ id: "mock-msg-1",
5
+ conversationId: "mock-conv-1",
6
+ content: "Mock response",
7
+ role: "assistant",
8
+ status: "DONE",
9
+ createdAt: /* @__PURE__ */ new Date()
10
+ };
11
+ const noopConversation = {
12
+ id: "mock-conv-1",
13
+ title: "Mock Conversation",
14
+ lastMessageDate: /* @__PURE__ */ new Date()
15
+ };
16
+ const listeners = /* @__PURE__ */ new Map();
17
+ const calls = [];
18
+ const defaults = {
19
+ sendMessage: async () => noopMessage,
20
+ getConversations: async () => [noopConversation],
21
+ getConversation: async () => noopConversation,
22
+ getMessages: async () => [noopMessage],
23
+ submitToolCallForm: async () => void 0,
24
+ confirmToolCall: async () => void 0,
25
+ rejectToolCall: async () => void 0,
26
+ submitFeedback: async () => void 0,
27
+ registerFunction: () => void 0,
28
+ unregisterFunction: () => true,
29
+ getRegisteredFunctions: () => [],
30
+ registerNavigationFunction: () => void 0,
31
+ on: (event, handler) => {
32
+ if (!listeners.has(event)) listeners.set(event, /* @__PURE__ */ new Set());
33
+ listeners.get(event).add(handler);
34
+ },
35
+ off: (event, handler) => {
36
+ var _a;
37
+ (_a = listeners.get(event)) == null ? void 0 : _a.delete(handler);
38
+ },
39
+ once: (event, handler) => {
40
+ const wrapper = (...args) => {
41
+ var _a;
42
+ (_a = listeners.get(event)) == null ? void 0 : _a.delete(wrapper);
43
+ handler(...args);
44
+ };
45
+ if (!listeners.has(event)) listeners.set(event, /* @__PURE__ */ new Set());
46
+ listeners.get(event).add(wrapper);
47
+ },
48
+ waitFor: (event, options2) => {
49
+ return new Promise((resolve, reject) => {
50
+ let timer;
51
+ const handler = (data) => {
52
+ var _a;
53
+ if (timer) clearTimeout(timer);
54
+ (_a = listeners.get(event)) == null ? void 0 : _a.delete(handler);
55
+ resolve(data);
56
+ };
57
+ if (!listeners.has(event)) listeners.set(event, /* @__PURE__ */ new Set());
58
+ listeners.get(event).add(handler);
59
+ if (options2 == null ? void 0 : options2.timeout) {
60
+ timer = setTimeout(() => {
61
+ var _a;
62
+ (_a = listeners.get(event)) == null ? void 0 : _a.delete(handler);
63
+ reject(new Error(`waitFor("${event}") timed out after ${options2.timeout}ms`));
64
+ }, options2.timeout);
65
+ }
66
+ });
67
+ },
68
+ updateConfig: () => void 0,
69
+ destroy: () => {
70
+ listeners.clear();
71
+ }
72
+ };
73
+ const merged = { ...defaults, ...overrides };
74
+ const mock = {};
75
+ for (const [key, fn] of Object.entries(merged)) {
76
+ mock[key] = (...args) => {
77
+ calls.push({ method: key, args });
78
+ return fn(...args);
79
+ };
80
+ }
81
+ mock.__calls = calls;
82
+ mock.__callsFor = (method) => calls.filter((c) => c.method === method);
83
+ mock.__emitEvent = (event, data) => {
84
+ const handlers = listeners.get(event);
85
+ if (handlers) {
86
+ [...handlers].forEach((h) => h(data));
87
+ }
88
+ };
89
+ return mock;
90
+ }
91
+ export {
92
+ createMockClient as c
93
+ };
94
+ //# sourceMappingURL=createMockClient-B1DcBiIK.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"createMockClient-B1DcBiIK.js","sources":["../src/testing/createMockClient.ts"],"sourcesContent":["import type { AgoClient } from \"../client/AgoClient\";\nimport type {\n AgoClientEvents,\n AgoEventName,\n AgoMessage,\n Conversation,\n} from \"../client/types\";\nimport type { ClientFunctionSchema } from \"../functions/types\";\n\n// eslint-disable-next-line @typescript-eslint/no-explicit-any\ntype MockFn = (...args: any[]) => any;\n\nexport interface MockAgoClientOptions {\n overrides?: Partial<Record<string, MockFn>>;\n}\n\nexport interface MockAgoClient extends AgoClient {\n /**\n * Simulate a server-pushed event.\n * ```ts\n * mock.__emitEvent(\"message:complete\", { id: \"1\", content: \"hi\", ... });\n * ```\n */\n __emitEvent<K extends AgoEventName>(event: K, data: AgoClientEvents[K]): void;\n\n /**\n * All recorded method calls: `[methodName, ...args][]`\n */\n __calls: Array<{ method: string; args: unknown[] }>;\n\n /**\n * Get calls for a specific method.\n */\n __callsFor(method: string): Array<{ method: string; args: unknown[] }>;\n}\n\n/**\n * Create a mock AgoClient for testing. Works with any framework.\n *\n * ```ts\n * import { createMockClient } from \"@useago/sdk/testing\";\n *\n * const mock = createMockClient();\n * mock.__emitEvent(\"message:complete\", someMessage);\n * expect(mock.__callsFor(\"sendMessage\")).toHaveLength(1);\n * ```\n */\nexport function createMockClient(\n options: MockAgoClientOptions = {}\n): MockAgoClient {\n const { overrides = {} } = options;\n\n const noopMessage: AgoMessage = {\n id: \"mock-msg-1\",\n conversationId: \"mock-conv-1\",\n content: \"Mock response\",\n role: \"assistant\",\n status: \"DONE\",\n createdAt: new Date(),\n };\n\n const noopConversation: Conversation = {\n id: \"mock-conv-1\",\n title: \"Mock Conversation\",\n lastMessageDate: new Date(),\n };\n\n const listeners = new Map<string, Set<(...args: unknown[]) => void>>();\n const calls: Array<{ method: string; args: unknown[] }> = [];\n\n const defaults: Record<string, MockFn> = {\n sendMessage: async () => noopMessage,\n getConversations: async () => [noopConversation],\n getConversation: async () => noopConversation,\n getMessages: async () => [noopMessage],\n submitToolCallForm: async () => undefined,\n confirmToolCall: async () => undefined,\n rejectToolCall: async () => undefined,\n submitFeedback: async () => undefined,\n registerFunction: () => undefined,\n unregisterFunction: () => true,\n getRegisteredFunctions: () => [] as ClientFunctionSchema[],\n registerNavigationFunction: () => undefined,\n on: (event: string, handler: (...args: unknown[]) => void) => {\n if (!listeners.has(event)) listeners.set(event, new Set());\n listeners.get(event)!.add(handler);\n },\n off: (event: string, handler: (...args: unknown[]) => void) => {\n listeners.get(event)?.delete(handler);\n },\n once: (event: string, handler: (...args: unknown[]) => void) => {\n const wrapper = (...args: unknown[]) => {\n listeners.get(event)?.delete(wrapper);\n handler(...args);\n };\n if (!listeners.has(event)) listeners.set(event, new Set());\n listeners.get(event)!.add(wrapper);\n },\n waitFor: (event: string, options?: { timeout?: number }) => {\n return new Promise((resolve, reject) => {\n let timer: ReturnType<typeof setTimeout> | undefined;\n const handler = (data: unknown) => {\n if (timer) clearTimeout(timer);\n listeners.get(event)?.delete(handler);\n resolve(data);\n };\n if (!listeners.has(event)) listeners.set(event, new Set());\n listeners.get(event)!.add(handler);\n if (options?.timeout) {\n timer = setTimeout(() => {\n listeners.get(event)?.delete(handler);\n reject(new Error(`waitFor(\"${event}\") timed out after ${options.timeout}ms`));\n }, options.timeout);\n }\n });\n },\n updateConfig: () => undefined,\n destroy: () => {\n listeners.clear();\n },\n };\n\n const merged = { ...defaults, ...overrides } as Record<string, MockFn>;\n\n // Wrap all methods to record calls\n const mock: Record<string, unknown> = {};\n\n for (const [key, fn] of Object.entries(merged)) {\n mock[key] = (...args: unknown[]) => {\n calls.push({ method: key, args });\n return (fn as MockFn)(...args);\n };\n }\n\n // Test helpers (not recorded)\n mock.__calls = calls;\n mock.__callsFor = (method: string) => calls.filter((c) => c.method === method);\n mock.__emitEvent = (event: string, data: unknown) => {\n // Copy the set to avoid mutation during iteration (once handlers remove themselves)\n const handlers = listeners.get(event);\n if (handlers) {\n [...handlers].forEach((h) => h(data));\n }\n };\n\n return mock as unknown as MockAgoClient;\n}\n"],"names":["options"],"mappings":"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"}