@useago/sdk 0.2.0 → 0.3.0

This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
Files changed (69) hide show
  1. package/README.md +102 -6
  2. package/dist/AgoClient-B-SONi_K.js +861 -0
  3. package/dist/AgoClient-B-SONi_K.js.map +1 -0
  4. package/dist/AgoClient-xTWfMWKh.cjs +860 -0
  5. package/dist/AgoClient-xTWfMWKh.cjs.map +1 -0
  6. package/dist/angular.cjs +100 -138
  7. package/dist/angular.cjs.map +1 -1
  8. package/dist/angular.d.ts +0 -1
  9. package/dist/angular.js +103 -139
  10. package/dist/angular.js.map +1 -1
  11. package/dist/client/AgoClient.d.ts +0 -56
  12. package/dist/client/types.d.ts +1 -5
  13. package/dist/createMockClient-B1DcBiIK.js +94 -0
  14. package/dist/createMockClient-B1DcBiIK.js.map +1 -0
  15. package/dist/createMockClient-BqNSJUu4.cjs +93 -0
  16. package/dist/createMockClient-BqNSJUu4.cjs.map +1 -0
  17. package/dist/helpers.cjs +305 -14
  18. package/dist/helpers.cjs.map +1 -0
  19. package/dist/helpers.d.ts +0 -1
  20. package/dist/helpers.js +306 -2
  21. package/dist/helpers.js.map +1 -0
  22. package/dist/index.cjs +151 -284
  23. package/dist/index.cjs.map +1 -1
  24. package/dist/index.d.ts +0 -3
  25. package/dist/index.js +163 -258
  26. package/dist/index.js.map +1 -1
  27. package/dist/react/components/ChatWidget.d.ts +0 -2
  28. package/dist/react/components/Message.d.ts +0 -2
  29. package/dist/react/components/index.d.ts +0 -2
  30. package/dist/react/context/AgoContext.d.ts +3 -29
  31. package/dist/react/context/index.d.ts +1 -1
  32. package/dist/react/hooks/index.d.ts +0 -1
  33. package/dist/react/hooks/useAgoFunction.d.ts +2 -14
  34. package/dist/react/index.d.ts +1 -4
  35. package/dist/react.cjs +10274 -22104
  36. package/dist/react.cjs.map +1 -1
  37. package/dist/react.d.ts +0 -1
  38. package/dist/react.js +10289 -22103
  39. package/dist/react.js.map +1 -1
  40. package/dist/vue.cjs +208 -287
  41. package/dist/vue.cjs.map +1 -1
  42. package/dist/vue.d.ts +0 -1
  43. package/dist/vue.js +218 -287
  44. package/dist/vue.js.map +1 -1
  45. package/dist/widget/types.d.ts +0 -1
  46. package/dist/widget.cjs +2 -0
  47. package/dist/widget.cjs.map +1 -0
  48. package/dist/widget.d.ts +0 -1
  49. package/dist/widget.js +2 -0
  50. package/dist/widget.js.map +1 -0
  51. package/package.json +1 -1
  52. package/dist/AgoClient-CNT-8sh_.js +0 -905
  53. package/dist/AgoClient-CNT-8sh_.js.map +0 -1
  54. package/dist/AgoClient-D0l1GTRs.cjs +0 -976
  55. package/dist/AgoClient-D0l1GTRs.cjs.map +0 -1
  56. package/dist/createMockClient-Ci_N2tH8.cjs +0 -104
  57. package/dist/createMockClient-Ci_N2tH8.cjs.map +0 -1
  58. package/dist/createMockClient-U0ae_AYy.js +0 -99
  59. package/dist/createMockClient-U0ae_AYy.js.map +0 -1
  60. package/dist/functions--c6lx3ic.cjs +0 -480
  61. package/dist/functions--c6lx3ic.cjs.map +0 -1
  62. package/dist/functions-C9F1dnmh.js +0 -398
  63. package/dist/functions-C9F1dnmh.js.map +0 -1
  64. package/dist/helpers/factory.d.ts +0 -20
  65. package/dist/react/components/Markdown.d.ts +0 -12
  66. package/dist/react/hooks/useAgoContext.d.ts +0 -40
  67. package/dist/rolldown-runtime-BqCkTl7Q.cjs +0 -50
  68. package/dist/rolldown-runtime-CNZpIYwj.js +0 -33
  69. package/dist/state/ClientContextRegistry.d.ts +0 -64
package/dist/vue.cjs CHANGED
@@ -1,303 +1,225 @@
1
+ "use strict";
1
2
  Object.defineProperty(exports, Symbol.toStringTag, { value: "Module" });
2
- require("./rolldown-runtime-BqCkTl7Q.cjs");
3
- const require_AgoClient = require("./AgoClient-D0l1GTRs.cjs");
4
- let vue = require("vue");
5
- //#region src/vue/symbols.ts
6
- var AGO_CLIENT_KEY = Symbol("ago-client");
7
- //#endregion
8
- //#region src/vue/plugin.ts
9
- /**
10
- * Vue plugin that provides an AgoClient to the entire app via inject/provide.
11
- *
12
- * ```ts
13
- * import { AgoPlugin } from "@useago/sdk/vue";
14
- *
15
- * app.use(AgoPlugin, { baseUrl: "https://YOUR-DOMAIN.useago.com" });
16
- * ```
17
- */
18
- var AgoPlugin = { install(app, options) {
19
- const client = new require_AgoClient.AgoClient(options);
20
- app.provide(AGO_CLIENT_KEY, client);
21
- } };
22
- //#endregion
23
- //#region src/vue/composables/useAgo.ts
24
- /**
25
- * Get or create an AgoClient.
26
- *
27
- * - Without args: returns the client from `AgoPlugin` (throws if none).
28
- * - With config: creates a new client instance.
29
- *
30
- * ```ts
31
- * // From plugin
32
- * const client = useAgo();
33
- *
34
- * // Standalone
35
- * const client = useAgo({ baseUrl: "https://YOUR-DOMAIN.useago.com" });
36
- * ```
37
- */
3
+ const AgoClient = require("./AgoClient-xTWfMWKh.cjs");
4
+ const vue = require("vue");
5
+ const AGO_CLIENT_KEY = Symbol("ago-client");
6
+ const AgoPlugin = {
7
+ install(app, options) {
8
+ const client = new AgoClient.AgoClient(options);
9
+ app.provide(AGO_CLIENT_KEY, client);
10
+ }
11
+ };
38
12
  function useAgo(config) {
39
- if (config) return new require_AgoClient.AgoClient(config);
40
- const client = (0, vue.inject)(AGO_CLIENT_KEY);
41
- if (!client) throw new Error("useAgo(): no AgoClient found. Either pass config or install AgoPlugin.");
42
- return client;
13
+ if (config) {
14
+ return new AgoClient.AgoClient(config);
15
+ }
16
+ const client = vue.inject(AGO_CLIENT_KEY);
17
+ if (!client) {
18
+ throw new Error(
19
+ "useAgo(): no AgoClient found. Either pass config or install AgoPlugin."
20
+ );
21
+ }
22
+ return client;
43
23
  }
44
- //#endregion
45
- //#region src/vue/composables/useMessages.ts
46
- /**
47
- * Composable to manage messages in a conversation.
48
- *
49
- * ```ts
50
- * const { messages, sendMessage, isLoading } = useMessages();
51
- * ```
52
- */
53
24
  function useMessages(options = {}) {
54
- const client = options.client ?? useAgo();
55
- const messages = (0, vue.ref)([]);
56
- const conversationId = (0, vue.ref)(options.conversationId);
57
- const isLoading = (0, vue.ref)(false);
58
- const error = (0, vue.ref)(null);
59
- const handleStart = (data) => {
60
- if (!conversationId.value) conversationId.value = data.conversationId;
61
- };
62
- const handleChunk = (data) => {
63
- const idx = messages.value.findIndex((m) => m.id === data.messageId);
64
- if (idx >= 0) messages.value[idx] = {
65
- ...messages.value[idx],
66
- content: messages.value[idx].content + data.content
67
- };
68
- };
69
- const handleComplete = (message) => {
70
- const idx = messages.value.findIndex((m) => m.id === message.id);
71
- if (idx >= 0) messages.value[idx] = message;
72
- else messages.value.push(message);
73
- isLoading.value = false;
74
- };
75
- const handleError = (data) => {
76
- error.value = new Error(data.error);
77
- isLoading.value = false;
78
- };
79
- (0, vue.onMounted)(() => {
80
- client.on("message:start", handleStart);
81
- client.on("message:chunk", handleChunk);
82
- client.on("message:complete", handleComplete);
83
- client.on("message:error", handleError);
84
- });
85
- (0, vue.onUnmounted)(() => {
86
- client.off("message:start", handleStart);
87
- client.off("message:chunk", handleChunk);
88
- client.off("message:complete", handleComplete);
89
- client.off("message:error", handleError);
90
- });
91
- async function sendMessage(content, files) {
92
- isLoading.value = true;
93
- error.value = null;
94
- const userMsg = {
95
- id: `temp-${Date.now()}`,
96
- conversationId: conversationId.value || "",
97
- content,
98
- role: "user",
99
- status: "DONE",
100
- createdAt: /* @__PURE__ */ new Date()
101
- };
102
- const assistantMsg = {
103
- id: `temp-assistant-${Date.now()}`,
104
- conversationId: conversationId.value || "",
105
- content: "",
106
- role: "assistant",
107
- status: "IN_PROGRESS",
108
- createdAt: /* @__PURE__ */ new Date()
109
- };
110
- messages.value.push(userMsg, assistantMsg);
111
- try {
112
- const response = await client.sendMessage(content, {
113
- conversationId: conversationId.value,
114
- files
115
- });
116
- if (response.conversationId && !conversationId.value) conversationId.value = response.conversationId;
117
- messages.value = messages.value.filter((m) => !m.id.startsWith("temp-"));
118
- const updatedUser = {
119
- ...userMsg,
120
- id: userMsg.id.replace("temp-", "user-"),
121
- conversationId: response.conversationId
122
- };
123
- if (!messages.value.some((m) => m.id === response.id)) messages.value.push(updatedUser, response);
124
- else messages.value.push(updatedUser);
125
- return response;
126
- } catch (err) {
127
- error.value = err instanceof Error ? err : /* @__PURE__ */ new Error("Failed to send");
128
- isLoading.value = false;
129
- messages.value = messages.value.filter((m) => !m.id.startsWith("temp-"));
130
- return null;
131
- }
132
- }
133
- function clearMessages() {
134
- messages.value = [];
135
- conversationId.value = void 0;
136
- error.value = null;
137
- }
138
- return {
139
- messages,
140
- isLoading,
141
- error,
142
- conversationId,
143
- sendMessage,
144
- clearMessages
145
- };
25
+ const client = options.client ?? useAgo();
26
+ const messages = vue.ref([]);
27
+ const conversationId = vue.ref(options.conversationId);
28
+ const isLoading = vue.ref(false);
29
+ const error = vue.ref(null);
30
+ const handleStart = (data) => {
31
+ if (!conversationId.value) {
32
+ conversationId.value = data.conversationId;
33
+ }
34
+ };
35
+ const handleChunk = (data) => {
36
+ const idx = messages.value.findIndex((m) => m.id === data.messageId);
37
+ if (idx >= 0) {
38
+ messages.value[idx] = {
39
+ ...messages.value[idx],
40
+ content: messages.value[idx].content + data.content
41
+ };
42
+ }
43
+ };
44
+ const handleComplete = (message) => {
45
+ const idx = messages.value.findIndex((m) => m.id === message.id);
46
+ if (idx >= 0) {
47
+ messages.value[idx] = message;
48
+ } else {
49
+ messages.value.push(message);
50
+ }
51
+ isLoading.value = false;
52
+ };
53
+ const handleError = (data) => {
54
+ error.value = new Error(data.error);
55
+ isLoading.value = false;
56
+ };
57
+ vue.onMounted(() => {
58
+ client.on("message:start", handleStart);
59
+ client.on("message:chunk", handleChunk);
60
+ client.on("message:complete", handleComplete);
61
+ client.on("message:error", handleError);
62
+ });
63
+ vue.onUnmounted(() => {
64
+ client.off("message:start", handleStart);
65
+ client.off("message:chunk", handleChunk);
66
+ client.off("message:complete", handleComplete);
67
+ client.off("message:error", handleError);
68
+ });
69
+ async function sendMessage(content, files) {
70
+ isLoading.value = true;
71
+ error.value = null;
72
+ const userMsg = {
73
+ id: `temp-${Date.now()}`,
74
+ conversationId: conversationId.value || "",
75
+ content,
76
+ role: "user",
77
+ status: "DONE",
78
+ createdAt: /* @__PURE__ */ new Date()
79
+ };
80
+ const assistantMsg = {
81
+ id: `temp-assistant-${Date.now()}`,
82
+ conversationId: conversationId.value || "",
83
+ content: "",
84
+ role: "assistant",
85
+ status: "IN_PROGRESS",
86
+ createdAt: /* @__PURE__ */ new Date()
87
+ };
88
+ messages.value.push(userMsg, assistantMsg);
89
+ try {
90
+ const response = await client.sendMessage(content, {
91
+ conversationId: conversationId.value,
92
+ files
93
+ });
94
+ if (response.conversationId && !conversationId.value) {
95
+ conversationId.value = response.conversationId;
96
+ }
97
+ messages.value = messages.value.filter((m) => !m.id.startsWith("temp-"));
98
+ const updatedUser = { ...userMsg, id: userMsg.id.replace("temp-", "user-"), conversationId: response.conversationId };
99
+ if (!messages.value.some((m) => m.id === response.id)) {
100
+ messages.value.push(updatedUser, response);
101
+ } else {
102
+ messages.value.push(updatedUser);
103
+ }
104
+ return response;
105
+ } catch (err) {
106
+ error.value = err instanceof Error ? err : new Error("Failed to send");
107
+ isLoading.value = false;
108
+ messages.value = messages.value.filter((m) => !m.id.startsWith("temp-"));
109
+ return null;
110
+ }
111
+ }
112
+ function clearMessages() {
113
+ messages.value = [];
114
+ conversationId.value = void 0;
115
+ error.value = null;
116
+ }
117
+ return { messages, isLoading, error, conversationId, sendMessage, clearMessages };
146
118
  }
147
- //#endregion
148
- //#region src/vue/composables/useConversation.ts
149
- /**
150
- * Composable to manage conversations.
151
- *
152
- * ```ts
153
- * const { conversations, selectConversation } = useConversation();
154
- * ```
155
- */
156
119
  function useConversation(options = {}) {
157
- const client = options.client ?? useAgo();
158
- const autoLoad = options.autoLoad ?? true;
159
- const conversations = (0, vue.ref)([]);
160
- const currentConversation = (0, vue.ref)(null);
161
- const isLoading = (0, vue.ref)(false);
162
- const error = (0, vue.ref)(null);
163
- async function refreshConversations() {
164
- isLoading.value = true;
165
- error.value = null;
166
- try {
167
- conversations.value = await client.getConversations();
168
- } catch (err) {
169
- error.value = err instanceof Error ? err : /* @__PURE__ */ new Error("Failed to load conversations");
170
- } finally {
171
- isLoading.value = false;
172
- }
173
- }
174
- async function selectConversation(id) {
175
- isLoading.value = true;
176
- error.value = null;
177
- try {
178
- currentConversation.value = await client.getConversation(id);
179
- } catch (err) {
180
- error.value = err instanceof Error ? err : /* @__PURE__ */ new Error("Failed to load conversation");
181
- } finally {
182
- isLoading.value = false;
183
- }
184
- }
185
- function startNewConversation() {
186
- currentConversation.value = null;
187
- }
188
- (0, vue.onMounted)(() => {
189
- if (autoLoad) refreshConversations();
190
- });
191
- return {
192
- conversations,
193
- currentConversation,
194
- isLoading,
195
- error,
196
- selectConversation,
197
- startNewConversation,
198
- refreshConversations
199
- };
120
+ const client = options.client ?? useAgo();
121
+ const autoLoad = options.autoLoad ?? true;
122
+ const conversations = vue.ref([]);
123
+ const currentConversation = vue.ref(null);
124
+ const isLoading = vue.ref(false);
125
+ const error = vue.ref(null);
126
+ async function refreshConversations() {
127
+ isLoading.value = true;
128
+ error.value = null;
129
+ try {
130
+ conversations.value = await client.getConversations();
131
+ } catch (err) {
132
+ error.value = err instanceof Error ? err : new Error("Failed to load conversations");
133
+ } finally {
134
+ isLoading.value = false;
135
+ }
136
+ }
137
+ async function selectConversation(id) {
138
+ isLoading.value = true;
139
+ error.value = null;
140
+ try {
141
+ currentConversation.value = await client.getConversation(id);
142
+ } catch (err) {
143
+ error.value = err instanceof Error ? err : new Error("Failed to load conversation");
144
+ } finally {
145
+ isLoading.value = false;
146
+ }
147
+ }
148
+ function startNewConversation() {
149
+ currentConversation.value = null;
150
+ }
151
+ vue.onMounted(() => {
152
+ if (autoLoad) refreshConversations();
153
+ });
154
+ return {
155
+ conversations,
156
+ currentConversation,
157
+ isLoading,
158
+ error,
159
+ selectConversation,
160
+ startNewConversation,
161
+ refreshConversations
162
+ };
200
163
  }
201
- //#endregion
202
- //#region src/vue/composables/useChat.ts
203
- /**
204
- * All-in-one composable combining messages + conversations.
205
- *
206
- * ```ts
207
- * const { messages, sendMessage, conversations, selectConversation } = useChat();
208
- * ```
209
- */
210
164
  function useChat(options = {}) {
211
- const msgResult = useMessages({
212
- client: options.client,
213
- conversationId: options.conversationId
214
- });
215
- const convResult = useConversation({
216
- client: options.client,
217
- autoLoad: options.autoLoad
218
- });
219
- const error = (0, vue.computed)(() => msgResult.error.value || convResult.error.value);
220
- return {
221
- messages: msgResult.messages,
222
- isLoading: msgResult.isLoading,
223
- error,
224
- sendMessage: msgResult.sendMessage,
225
- clearMessages: msgResult.clearMessages,
226
- conversationId: msgResult.conversationId,
227
- conversations: convResult.conversations,
228
- currentConversation: convResult.currentConversation,
229
- isConversationsLoading: convResult.isLoading,
230
- selectConversation: convResult.selectConversation,
231
- startNewConversation: convResult.startNewConversation,
232
- refreshConversations: convResult.refreshConversations
233
- };
165
+ const msgResult = useMessages({
166
+ client: options.client,
167
+ conversationId: options.conversationId
168
+ });
169
+ const convResult = useConversation({
170
+ client: options.client,
171
+ autoLoad: options.autoLoad
172
+ });
173
+ const error = vue.computed(
174
+ () => msgResult.error.value || convResult.error.value
175
+ );
176
+ return {
177
+ // Messages
178
+ messages: msgResult.messages,
179
+ isLoading: msgResult.isLoading,
180
+ error,
181
+ sendMessage: msgResult.sendMessage,
182
+ clearMessages: msgResult.clearMessages,
183
+ conversationId: msgResult.conversationId,
184
+ // Conversations
185
+ conversations: convResult.conversations,
186
+ currentConversation: convResult.currentConversation,
187
+ isConversationsLoading: convResult.isLoading,
188
+ selectConversation: convResult.selectConversation,
189
+ startNewConversation: convResult.startNewConversation,
190
+ refreshConversations: convResult.refreshConversations
191
+ };
234
192
  }
235
- //#endregion
236
- //#region src/vue/composables/useAgoFunction.ts
237
- /**
238
- * Register a client-side function with auto-cleanup on unmount.
239
- *
240
- * ```ts
241
- * useAgoFunction("showToast", {
242
- * description: "Show a toast",
243
- * parameters: { type: "object", properties: { message: { type: "string" } } },
244
- * handler: async (args) => { toast(args.message); return { shown: true }; },
245
- * });
246
- * ```
247
- */
248
193
  function useAgoFunction(name, options) {
249
- const client = useAgo();
250
- (0, vue.onMounted)(() => {
251
- client.registerFunction(name, options.handler, {
252
- description: options.description,
253
- parameters: options.parameters
254
- });
255
- });
256
- (0, vue.onUnmounted)(() => {
257
- client.unregisterFunction(name);
258
- });
194
+ const client = useAgo();
195
+ vue.onMounted(() => {
196
+ client.registerFunction(name, options.handler, {
197
+ description: options.description,
198
+ parameters: options.parameters
199
+ });
200
+ });
201
+ vue.onUnmounted(() => {
202
+ client.unregisterFunction(name);
203
+ });
259
204
  }
260
- /**
261
- * Register navigation routes with auto-cleanup on unmount.
262
- * Works with vue-router's `useRouter().push`.
263
- *
264
- * ```ts
265
- * const router = useRouter();
266
- * useAgoNavigation((path) => router.push(path), [
267
- * { name: "dashboard", path: "/dashboard", description: "Main dashboard" },
268
- * ]);
269
- * ```
270
- */
271
205
  function useAgoNavigation(navigate, routes) {
272
- const client = useAgo();
273
- (0, vue.onMounted)(() => {
274
- client.registerNavigationFunction(navigate, routes);
275
- });
276
- (0, vue.onUnmounted)(() => {
277
- client.unregisterFunction("navigateToPage");
278
- });
206
+ const client = useAgo();
207
+ vue.onMounted(() => {
208
+ client.registerNavigationFunction(navigate, routes);
209
+ });
210
+ vue.onUnmounted(() => {
211
+ client.unregisterFunction("navigateToPage");
212
+ });
279
213
  }
280
- //#endregion
281
- //#region src/vue/composables/useAgoEvents.ts
282
- /**
283
- * Subscribe to AGO client events with auto-cleanup on unmount.
284
- *
285
- * ```ts
286
- * useAgoEvents("message:complete", (msg) => {
287
- * console.log("Got message:", msg.content);
288
- * });
289
- * ```
290
- */
291
214
  function useAgoEvents(event, handler) {
292
- const client = useAgo();
293
- (0, vue.onMounted)(() => {
294
- client.on(event, handler);
295
- });
296
- (0, vue.onUnmounted)(() => {
297
- client.off(event, handler);
298
- });
215
+ const client = useAgo();
216
+ vue.onMounted(() => {
217
+ client.on(event, handler);
218
+ });
219
+ vue.onUnmounted(() => {
220
+ client.off(event, handler);
221
+ });
299
222
  }
300
- //#endregion
301
223
  exports.AGO_CLIENT_KEY = AGO_CLIENT_KEY;
302
224
  exports.AgoPlugin = AgoPlugin;
303
225
  exports.useAgo = useAgo;
@@ -307,5 +229,4 @@ exports.useAgoNavigation = useAgoNavigation;
307
229
  exports.useChat = useChat;
308
230
  exports.useConversation = useConversation;
309
231
  exports.useMessages = useMessages;
310
-
311
- //# sourceMappingURL=vue.cjs.map
232
+ //# sourceMappingURL=vue.cjs.map
package/dist/vue.cjs.map CHANGED
@@ -1 +1 @@
1
- {"version":3,"file":"vue.cjs","names":[],"sources":["../src/vue/symbols.ts","../src/vue/plugin.ts","../src/vue/composables/useAgo.ts","../src/vue/composables/useMessages.ts","../src/vue/composables/useConversation.ts","../src/vue/composables/useChat.ts","../src/vue/composables/useAgoFunction.ts","../src/vue/composables/useAgoEvents.ts"],"sourcesContent":["import type { InjectionKey } from \"vue\";\nimport type { AgoClient } from \"../client/AgoClient\";\n\nexport const AGO_CLIENT_KEY: InjectionKey<AgoClient> = Symbol(\"ago-client\");\n","import type { App } from \"vue\";\nimport { AgoClient } from \"../client/AgoClient\";\nimport type { AgoConfig } from \"../client/types\";\nimport { AGO_CLIENT_KEY } from \"./symbols\";\n\nexport interface AgoPluginOptions extends AgoConfig {}\n\n/**\n * Vue plugin that provides an AgoClient to the entire app via inject/provide.\n *\n * ```ts\n * import { AgoPlugin } from \"@useago/sdk/vue\";\n *\n * app.use(AgoPlugin, { baseUrl: \"https://YOUR-DOMAIN.useago.com\" });\n * ```\n */\nexport const AgoPlugin = {\n install(app: App, options: AgoPluginOptions) {\n const client = new AgoClient(options);\n app.provide(AGO_CLIENT_KEY, client);\n },\n};\n","import { inject } from \"vue\";\nimport { AgoClient } from \"../../client/AgoClient\";\nimport type { AgoConfig } from \"../../client/types\";\nimport { AGO_CLIENT_KEY } from \"../symbols\";\n\n/**\n * Get or create an AgoClient.\n *\n * - Without args: returns the client from `AgoPlugin` (throws if none).\n * - With config: creates a new client instance.\n *\n * ```ts\n * // From plugin\n * const client = useAgo();\n *\n * // Standalone\n * const client = useAgo({ baseUrl: \"https://YOUR-DOMAIN.useago.com\" });\n * ```\n */\nexport function useAgo(config?: AgoConfig): AgoClient {\n if (config) {\n return new AgoClient(config);\n }\n\n const client = inject(AGO_CLIENT_KEY);\n if (!client) {\n throw new Error(\n \"useAgo(): no AgoClient found. Either pass config or install AgoPlugin.\"\n );\n }\n return client;\n}\n","import { ref, onMounted, onUnmounted } from \"vue\";\nimport type { AgoClient } from \"../../client/AgoClient\";\nimport type { AgoMessage } from \"../../client/types\";\nimport { useAgo } from \"./useAgo\";\n\nexport interface UseMessagesOptions {\n client?: AgoClient;\n conversationId?: string;\n}\n\n/**\n * Composable to manage messages in a conversation.\n *\n * ```ts\n * const { messages, sendMessage, isLoading } = useMessages();\n * ```\n */\nexport function useMessages(options: UseMessagesOptions = {}) {\n const client = options.client ?? useAgo();\n\n const messages = ref<AgoMessage[]>([]);\n const conversationId = ref<string | undefined>(options.conversationId);\n const isLoading = ref(false);\n const error = ref<Error | null>(null);\n\n const handleStart = (data: { conversationId: string; messageId: string }) => {\n if (!conversationId.value) {\n conversationId.value = data.conversationId;\n }\n };\n\n const handleChunk = (data: { content: string; messageId: string }) => {\n const idx = messages.value.findIndex((m: AgoMessage) => m.id === data.messageId);\n if (idx >= 0) {\n messages.value[idx] = {\n ...messages.value[idx],\n content: messages.value[idx].content + data.content,\n };\n }\n };\n\n const handleComplete = (message: AgoMessage) => {\n const idx = messages.value.findIndex((m: AgoMessage) => m.id === message.id);\n if (idx >= 0) {\n messages.value[idx] = message;\n } else {\n messages.value.push(message);\n }\n isLoading.value = false;\n };\n\n const handleError = (data: { error: string }) => {\n error.value = new Error(data.error);\n isLoading.value = false;\n };\n\n onMounted(() => {\n client.on(\"message:start\", handleStart);\n client.on(\"message:chunk\", handleChunk);\n client.on(\"message:complete\", handleComplete);\n client.on(\"message:error\", handleError);\n });\n\n onUnmounted(() => {\n client.off(\"message:start\", handleStart);\n client.off(\"message:chunk\", handleChunk);\n client.off(\"message:complete\", handleComplete);\n client.off(\"message:error\", handleError);\n });\n\n async function sendMessage(content: string, files?: File[]): Promise<AgoMessage | null> {\n isLoading.value = true;\n error.value = null;\n\n // Optimistic user message\n const userMsg: AgoMessage = {\n id: `temp-${Date.now()}`,\n conversationId: conversationId.value || \"\",\n content,\n role: \"user\",\n status: \"DONE\",\n createdAt: new Date(),\n };\n const assistantMsg: AgoMessage = {\n id: `temp-assistant-${Date.now()}`,\n conversationId: conversationId.value || \"\",\n content: \"\",\n role: \"assistant\",\n status: \"IN_PROGRESS\",\n createdAt: new Date(),\n };\n messages.value.push(userMsg, assistantMsg);\n\n try {\n const response = await client.sendMessage(content, {\n conversationId: conversationId.value,\n files,\n });\n if (response.conversationId && !conversationId.value) {\n conversationId.value = response.conversationId;\n }\n // Replace temp messages\n messages.value = messages.value.filter((m: AgoMessage) => !m.id.startsWith(\"temp-\"));\n const updatedUser = { ...userMsg, id: userMsg.id.replace(\"temp-\", \"user-\"), conversationId: response.conversationId };\n if (!messages.value.some((m: AgoMessage) => m.id === response.id)) {\n messages.value.push(updatedUser, response);\n } else {\n messages.value.push(updatedUser);\n }\n return response;\n } catch (err) {\n error.value = err instanceof Error ? err : new Error(\"Failed to send\");\n isLoading.value = false;\n messages.value = messages.value.filter((m: AgoMessage) => !m.id.startsWith(\"temp-\"));\n return null;\n }\n }\n\n function clearMessages() {\n messages.value = [];\n conversationId.value = undefined;\n error.value = null;\n }\n\n return { messages, isLoading, error, conversationId, sendMessage, clearMessages };\n}\n","import { ref, onMounted } from \"vue\";\nimport type { AgoClient } from \"../../client/AgoClient\";\nimport type { Conversation } from \"../../client/types\";\nimport { useAgo } from \"./useAgo\";\n\nexport interface UseConversationOptions {\n client?: AgoClient;\n autoLoad?: boolean;\n}\n\n/**\n * Composable to manage conversations.\n *\n * ```ts\n * const { conversations, selectConversation } = useConversation();\n * ```\n */\nexport function useConversation(options: UseConversationOptions = {}) {\n const client = options.client ?? useAgo();\n const autoLoad = options.autoLoad ?? true;\n\n const conversations = ref<Conversation[]>([]);\n const currentConversation = ref<Conversation | null>(null);\n const isLoading = ref(false);\n const error = ref<Error | null>(null);\n\n async function refreshConversations() {\n isLoading.value = true;\n error.value = null;\n try {\n conversations.value = await client.getConversations();\n } catch (err) {\n error.value = err instanceof Error ? err : new Error(\"Failed to load conversations\");\n } finally {\n isLoading.value = false;\n }\n }\n\n async function selectConversation(id: string) {\n isLoading.value = true;\n error.value = null;\n try {\n currentConversation.value = await client.getConversation(id);\n } catch (err) {\n error.value = err instanceof Error ? err : new Error(\"Failed to load conversation\");\n } finally {\n isLoading.value = false;\n }\n }\n\n function startNewConversation() {\n currentConversation.value = null;\n }\n\n onMounted(() => {\n if (autoLoad) refreshConversations();\n });\n\n return {\n conversations,\n currentConversation,\n isLoading,\n error,\n selectConversation,\n startNewConversation,\n refreshConversations,\n };\n}\n","import { computed } from \"vue\";\nimport type { AgoClient } from \"../../client/AgoClient\";\nimport { useMessages } from \"./useMessages\";\nimport { useConversation } from \"./useConversation\";\n\nexport interface UseChatOptions {\n client?: AgoClient;\n conversationId?: string;\n autoLoad?: boolean;\n}\n\n/**\n * All-in-one composable combining messages + conversations.\n *\n * ```ts\n * const { messages, sendMessage, conversations, selectConversation } = useChat();\n * ```\n */\nexport function useChat(options: UseChatOptions = {}) {\n const msgResult = useMessages({\n client: options.client,\n conversationId: options.conversationId,\n });\n\n const convResult = useConversation({\n client: options.client,\n autoLoad: options.autoLoad,\n });\n\n const error = computed(\n () => msgResult.error.value || convResult.error.value\n );\n\n return {\n // Messages\n messages: msgResult.messages,\n isLoading: msgResult.isLoading,\n error,\n sendMessage: msgResult.sendMessage,\n clearMessages: msgResult.clearMessages,\n conversationId: msgResult.conversationId,\n // Conversations\n conversations: convResult.conversations,\n currentConversation: convResult.currentConversation,\n isConversationsLoading: convResult.isLoading,\n selectConversation: convResult.selectConversation,\n startNewConversation: convResult.startNewConversation,\n refreshConversations: convResult.refreshConversations,\n };\n}\n","import { onMounted, onUnmounted } from \"vue\";\nimport type { ClientFunctionHandler, ClientFunctionSchema } from \"../../functions/types\";\nimport { useAgo } from \"./useAgo\";\n\n/**\n * Register a client-side function with auto-cleanup on unmount.\n *\n * ```ts\n * useAgoFunction(\"showToast\", {\n * description: \"Show a toast\",\n * parameters: { type: \"object\", properties: { message: { type: \"string\" } } },\n * handler: async (args) => { toast(args.message); return { shown: true }; },\n * });\n * ```\n */\nexport function useAgoFunction(\n name: string,\n options: {\n description: string;\n parameters: ClientFunctionSchema[\"parameters\"];\n handler: ClientFunctionHandler;\n }\n): void {\n const client = useAgo();\n\n onMounted(() => {\n client.registerFunction(name, options.handler, {\n description: options.description,\n parameters: options.parameters,\n });\n });\n\n onUnmounted(() => {\n client.unregisterFunction(name);\n });\n}\n\nexport interface AgoRoute {\n name: string;\n path: string;\n description: string;\n}\n\n/**\n * Register navigation routes with auto-cleanup on unmount.\n * Works with vue-router's `useRouter().push`.\n *\n * ```ts\n * const router = useRouter();\n * useAgoNavigation((path) => router.push(path), [\n * { name: \"dashboard\", path: \"/dashboard\", description: \"Main dashboard\" },\n * ]);\n * ```\n */\nexport function useAgoNavigation(\n navigate: (path: string) => void,\n routes: AgoRoute[]\n): void {\n const client = useAgo();\n\n onMounted(() => {\n client.registerNavigationFunction(navigate, routes);\n });\n\n onUnmounted(() => {\n client.unregisterFunction(\"navigateToPage\");\n });\n}\n","import { onMounted, onUnmounted } from \"vue\";\nimport type { AgoClientEvents, AgoEventName } from \"../../client/types\";\nimport { useAgo } from \"./useAgo\";\n\n/**\n * Subscribe to AGO client events with auto-cleanup on unmount.\n *\n * ```ts\n * useAgoEvents(\"message:complete\", (msg) => {\n * console.log(\"Got message:\", msg.content);\n * });\n * ```\n */\nexport function useAgoEvents<K extends AgoEventName>(\n event: K,\n handler: (data: AgoClientEvents[K]) => void\n): void {\n const client = useAgo();\n\n onMounted(() => {\n client.on(event, handler);\n });\n\n onUnmounted(() => {\n client.off(event, handler);\n });\n}\n"],"mappings":";;;;;AAGA,IAAa,iBAA0C,OAAO,aAAa;;;;;;;;;;;;ACa3E,IAAa,YAAY,EACvB,QAAQ,KAAU,SAA2B;CAC3C,MAAM,SAAS,IAAI,kBAAA,UAAU,QAAQ;AACrC,KAAI,QAAQ,gBAAgB,OAAO;GAEtC;;;;;;;;;;;;;;;;;ACFD,SAAgB,OAAO,QAA+B;AACpD,KAAI,OACF,QAAO,IAAI,kBAAA,UAAU,OAAO;CAG9B,MAAM,UAAA,GAAA,IAAA,QAAgB,eAAe;AACrC,KAAI,CAAC,OACH,OAAM,IAAI,MACR,yEACD;AAEH,QAAO;;;;;;;;;;;ACbT,SAAgB,YAAY,UAA8B,EAAE,EAAE;CAC5D,MAAM,SAAS,QAAQ,UAAU,QAAQ;CAEzC,MAAM,YAAA,GAAA,IAAA,KAA6B,EAAE,CAAC;CACtC,MAAM,kBAAA,GAAA,IAAA,KAAyC,QAAQ,eAAe;CACtE,MAAM,aAAA,GAAA,IAAA,KAAgB,MAAM;CAC5B,MAAM,SAAA,GAAA,IAAA,KAA0B,KAAK;CAErC,MAAM,eAAe,SAAwD;AAC3E,MAAI,CAAC,eAAe,MAClB,gBAAe,QAAQ,KAAK;;CAIhC,MAAM,eAAe,SAAiD;EACpE,MAAM,MAAM,SAAS,MAAM,WAAW,MAAkB,EAAE,OAAO,KAAK,UAAU;AAChF,MAAI,OAAO,EACT,UAAS,MAAM,OAAO;GACpB,GAAG,SAAS,MAAM;GAClB,SAAS,SAAS,MAAM,KAAK,UAAU,KAAK;GAC7C;;CAIL,MAAM,kBAAkB,YAAwB;EAC9C,MAAM,MAAM,SAAS,MAAM,WAAW,MAAkB,EAAE,OAAO,QAAQ,GAAG;AAC5E,MAAI,OAAO,EACT,UAAS,MAAM,OAAO;MAEtB,UAAS,MAAM,KAAK,QAAQ;AAE9B,YAAU,QAAQ;;CAGpB,MAAM,eAAe,SAA4B;AAC/C,QAAM,QAAQ,IAAI,MAAM,KAAK,MAAM;AACnC,YAAU,QAAQ;;AAGpB,EAAA,GAAA,IAAA,iBAAgB;AACd,SAAO,GAAG,iBAAiB,YAAY;AACvC,SAAO,GAAG,iBAAiB,YAAY;AACvC,SAAO,GAAG,oBAAoB,eAAe;AAC7C,SAAO,GAAG,iBAAiB,YAAY;GACvC;AAEF,EAAA,GAAA,IAAA,mBAAkB;AAChB,SAAO,IAAI,iBAAiB,YAAY;AACxC,SAAO,IAAI,iBAAiB,YAAY;AACxC,SAAO,IAAI,oBAAoB,eAAe;AAC9C,SAAO,IAAI,iBAAiB,YAAY;GACxC;CAEF,eAAe,YAAY,SAAiB,OAA4C;AACtF,YAAU,QAAQ;AAClB,QAAM,QAAQ;EAGd,MAAM,UAAsB;GAC1B,IAAI,QAAQ,KAAK,KAAK;GACtB,gBAAgB,eAAe,SAAS;GACxC;GACA,MAAM;GACN,QAAQ;GACR,2BAAW,IAAI,MAAM;GACtB;EACD,MAAM,eAA2B;GAC/B,IAAI,kBAAkB,KAAK,KAAK;GAChC,gBAAgB,eAAe,SAAS;GACxC,SAAS;GACT,MAAM;GACN,QAAQ;GACR,2BAAW,IAAI,MAAM;GACtB;AACD,WAAS,MAAM,KAAK,SAAS,aAAa;AAE1C,MAAI;GACF,MAAM,WAAW,MAAM,OAAO,YAAY,SAAS;IACjD,gBAAgB,eAAe;IAC/B;IACD,CAAC;AACF,OAAI,SAAS,kBAAkB,CAAC,eAAe,MAC7C,gBAAe,QAAQ,SAAS;AAGlC,YAAS,QAAQ,SAAS,MAAM,QAAQ,MAAkB,CAAC,EAAE,GAAG,WAAW,QAAQ,CAAC;GACpF,MAAM,cAAc;IAAE,GAAG;IAAS,IAAI,QAAQ,GAAG,QAAQ,SAAS,QAAQ;IAAE,gBAAgB,SAAS;IAAgB;AACrH,OAAI,CAAC,SAAS,MAAM,MAAM,MAAkB,EAAE,OAAO,SAAS,GAAG,CAC/D,UAAS,MAAM,KAAK,aAAa,SAAS;OAE1C,UAAS,MAAM,KAAK,YAAY;AAElC,UAAO;WACA,KAAK;AACZ,SAAM,QAAQ,eAAe,QAAQ,sBAAM,IAAI,MAAM,iBAAiB;AACtE,aAAU,QAAQ;AAClB,YAAS,QAAQ,SAAS,MAAM,QAAQ,MAAkB,CAAC,EAAE,GAAG,WAAW,QAAQ,CAAC;AACpF,UAAO;;;CAIX,SAAS,gBAAgB;AACvB,WAAS,QAAQ,EAAE;AACnB,iBAAe,QAAQ,KAAA;AACvB,QAAM,QAAQ;;AAGhB,QAAO;EAAE;EAAU;EAAW;EAAO;EAAgB;EAAa;EAAe;;;;;;;;;;;AC3GnF,SAAgB,gBAAgB,UAAkC,EAAE,EAAE;CACpE,MAAM,SAAS,QAAQ,UAAU,QAAQ;CACzC,MAAM,WAAW,QAAQ,YAAY;CAErC,MAAM,iBAAA,GAAA,IAAA,KAAoC,EAAE,CAAC;CAC7C,MAAM,uBAAA,GAAA,IAAA,KAA+C,KAAK;CAC1D,MAAM,aAAA,GAAA,IAAA,KAAgB,MAAM;CAC5B,MAAM,SAAA,GAAA,IAAA,KAA0B,KAAK;CAErC,eAAe,uBAAuB;AACpC,YAAU,QAAQ;AAClB,QAAM,QAAQ;AACd,MAAI;AACF,iBAAc,QAAQ,MAAM,OAAO,kBAAkB;WAC9C,KAAK;AACZ,SAAM,QAAQ,eAAe,QAAQ,sBAAM,IAAI,MAAM,+BAA+B;YAC5E;AACR,aAAU,QAAQ;;;CAItB,eAAe,mBAAmB,IAAY;AAC5C,YAAU,QAAQ;AAClB,QAAM,QAAQ;AACd,MAAI;AACF,uBAAoB,QAAQ,MAAM,OAAO,gBAAgB,GAAG;WACrD,KAAK;AACZ,SAAM,QAAQ,eAAe,QAAQ,sBAAM,IAAI,MAAM,8BAA8B;YAC3E;AACR,aAAU,QAAQ;;;CAItB,SAAS,uBAAuB;AAC9B,sBAAoB,QAAQ;;AAG9B,EAAA,GAAA,IAAA,iBAAgB;AACd,MAAI,SAAU,uBAAsB;GACpC;AAEF,QAAO;EACL;EACA;EACA;EACA;EACA;EACA;EACA;EACD;;;;;;;;;;;AChDH,SAAgB,QAAQ,UAA0B,EAAE,EAAE;CACpD,MAAM,YAAY,YAAY;EAC5B,QAAQ,QAAQ;EAChB,gBAAgB,QAAQ;EACzB,CAAC;CAEF,MAAM,aAAa,gBAAgB;EACjC,QAAQ,QAAQ;EAChB,UAAU,QAAQ;EACnB,CAAC;CAEF,MAAM,SAAA,GAAA,IAAA,gBACE,UAAU,MAAM,SAAS,WAAW,MAAM,MACjD;AAED,QAAO;EAEL,UAAU,UAAU;EACpB,WAAW,UAAU;EACrB;EACA,aAAa,UAAU;EACvB,eAAe,UAAU;EACzB,gBAAgB,UAAU;EAE1B,eAAe,WAAW;EAC1B,qBAAqB,WAAW;EAChC,wBAAwB,WAAW;EACnC,oBAAoB,WAAW;EAC/B,sBAAsB,WAAW;EACjC,sBAAsB,WAAW;EAClC;;;;;;;;;;;;;;;ACjCH,SAAgB,eACd,MACA,SAKM;CACN,MAAM,SAAS,QAAQ;AAEvB,EAAA,GAAA,IAAA,iBAAgB;AACd,SAAO,iBAAiB,MAAM,QAAQ,SAAS;GAC7C,aAAa,QAAQ;GACrB,YAAY,QAAQ;GACrB,CAAC;GACF;AAEF,EAAA,GAAA,IAAA,mBAAkB;AAChB,SAAO,mBAAmB,KAAK;GAC/B;;;;;;;;;;;;;AAoBJ,SAAgB,iBACd,UACA,QACM;CACN,MAAM,SAAS,QAAQ;AAEvB,EAAA,GAAA,IAAA,iBAAgB;AACd,SAAO,2BAA2B,UAAU,OAAO;GACnD;AAEF,EAAA,GAAA,IAAA,mBAAkB;AAChB,SAAO,mBAAmB,iBAAiB;GAC3C;;;;;;;;;;;;;ACrDJ,SAAgB,aACd,OACA,SACM;CACN,MAAM,SAAS,QAAQ;AAEvB,EAAA,GAAA,IAAA,iBAAgB;AACd,SAAO,GAAG,OAAO,QAAQ;GACzB;AAEF,EAAA,GAAA,IAAA,mBAAkB;AAChB,SAAO,IAAI,OAAO,QAAQ;GAC1B"}
1
+ {"version":3,"file":"vue.cjs","sources":["../src/vue/symbols.ts","../src/vue/plugin.ts","../src/vue/composables/useAgo.ts","../src/vue/composables/useMessages.ts","../src/vue/composables/useConversation.ts","../src/vue/composables/useChat.ts","../src/vue/composables/useAgoFunction.ts","../src/vue/composables/useAgoEvents.ts"],"sourcesContent":["import type { InjectionKey } from \"vue\";\nimport type { AgoClient } from \"../client/AgoClient\";\n\nexport const AGO_CLIENT_KEY: InjectionKey<AgoClient> = Symbol(\"ago-client\");\n","import type { App } from \"vue\";\nimport { AgoClient } from \"../client/AgoClient\";\nimport type { AgoConfig } from \"../client/types\";\nimport { AGO_CLIENT_KEY } from \"./symbols\";\n\nexport interface AgoPluginOptions extends AgoConfig {}\n\n/**\n * Vue plugin that provides an AgoClient to the entire app via inject/provide.\n *\n * ```ts\n * import { AgoPlugin } from \"@useago/sdk/vue\";\n *\n * app.use(AgoPlugin, { baseUrl: \"https://YOUR-DOMAIN.useago.com\" });\n * ```\n */\nexport const AgoPlugin = {\n install(app: App, options: AgoPluginOptions) {\n const client = new AgoClient(options);\n app.provide(AGO_CLIENT_KEY, client);\n },\n};\n","import { inject } from \"vue\";\nimport { AgoClient } from \"../../client/AgoClient\";\nimport type { AgoConfig } from \"../../client/types\";\nimport { AGO_CLIENT_KEY } from \"../symbols\";\n\n/**\n * Get or create an AgoClient.\n *\n * - Without args: returns the client from `AgoPlugin` (throws if none).\n * - With config: creates a new client instance.\n *\n * ```ts\n * // From plugin\n * const client = useAgo();\n *\n * // Standalone\n * const client = useAgo({ baseUrl: \"https://YOUR-DOMAIN.useago.com\" });\n * ```\n */\nexport function useAgo(config?: AgoConfig): AgoClient {\n if (config) {\n return new AgoClient(config);\n }\n\n const client = inject(AGO_CLIENT_KEY);\n if (!client) {\n throw new Error(\n \"useAgo(): no AgoClient found. Either pass config or install AgoPlugin.\"\n );\n }\n return client;\n}\n","import { ref, onMounted, onUnmounted } from \"vue\";\nimport type { AgoClient } from \"../../client/AgoClient\";\nimport type { AgoMessage } from \"../../client/types\";\nimport { useAgo } from \"./useAgo\";\n\nexport interface UseMessagesOptions {\n client?: AgoClient;\n conversationId?: string;\n}\n\n/**\n * Composable to manage messages in a conversation.\n *\n * ```ts\n * const { messages, sendMessage, isLoading } = useMessages();\n * ```\n */\nexport function useMessages(options: UseMessagesOptions = {}) {\n const client = options.client ?? useAgo();\n\n const messages = ref<AgoMessage[]>([]);\n const conversationId = ref<string | undefined>(options.conversationId);\n const isLoading = ref(false);\n const error = ref<Error | null>(null);\n\n const handleStart = (data: { conversationId: string; messageId: string }) => {\n if (!conversationId.value) {\n conversationId.value = data.conversationId;\n }\n };\n\n const handleChunk = (data: { content: string; messageId: string }) => {\n const idx = messages.value.findIndex((m: AgoMessage) => m.id === data.messageId);\n if (idx >= 0) {\n messages.value[idx] = {\n ...messages.value[idx],\n content: messages.value[idx].content + data.content,\n };\n }\n };\n\n const handleComplete = (message: AgoMessage) => {\n const idx = messages.value.findIndex((m: AgoMessage) => m.id === message.id);\n if (idx >= 0) {\n messages.value[idx] = message;\n } else {\n messages.value.push(message);\n }\n isLoading.value = false;\n };\n\n const handleError = (data: { error: string }) => {\n error.value = new Error(data.error);\n isLoading.value = false;\n };\n\n onMounted(() => {\n client.on(\"message:start\", handleStart);\n client.on(\"message:chunk\", handleChunk);\n client.on(\"message:complete\", handleComplete);\n client.on(\"message:error\", handleError);\n });\n\n onUnmounted(() => {\n client.off(\"message:start\", handleStart);\n client.off(\"message:chunk\", handleChunk);\n client.off(\"message:complete\", handleComplete);\n client.off(\"message:error\", handleError);\n });\n\n async function sendMessage(content: string, files?: File[]): Promise<AgoMessage | null> {\n isLoading.value = true;\n error.value = null;\n\n // Optimistic user message\n const userMsg: AgoMessage = {\n id: `temp-${Date.now()}`,\n conversationId: conversationId.value || \"\",\n content,\n role: \"user\",\n status: \"DONE\",\n createdAt: new Date(),\n };\n const assistantMsg: AgoMessage = {\n id: `temp-assistant-${Date.now()}`,\n conversationId: conversationId.value || \"\",\n content: \"\",\n role: \"assistant\",\n status: \"IN_PROGRESS\",\n createdAt: new Date(),\n };\n messages.value.push(userMsg, assistantMsg);\n\n try {\n const response = await client.sendMessage(content, {\n conversationId: conversationId.value,\n files,\n });\n if (response.conversationId && !conversationId.value) {\n conversationId.value = response.conversationId;\n }\n // Replace temp messages\n messages.value = messages.value.filter((m: AgoMessage) => !m.id.startsWith(\"temp-\"));\n const updatedUser = { ...userMsg, id: userMsg.id.replace(\"temp-\", \"user-\"), conversationId: response.conversationId };\n if (!messages.value.some((m: AgoMessage) => m.id === response.id)) {\n messages.value.push(updatedUser, response);\n } else {\n messages.value.push(updatedUser);\n }\n return response;\n } catch (err) {\n error.value = err instanceof Error ? err : new Error(\"Failed to send\");\n isLoading.value = false;\n messages.value = messages.value.filter((m: AgoMessage) => !m.id.startsWith(\"temp-\"));\n return null;\n }\n }\n\n function clearMessages() {\n messages.value = [];\n conversationId.value = undefined;\n error.value = null;\n }\n\n return { messages, isLoading, error, conversationId, sendMessage, clearMessages };\n}\n","import { ref, onMounted } from \"vue\";\nimport type { AgoClient } from \"../../client/AgoClient\";\nimport type { Conversation } from \"../../client/types\";\nimport { useAgo } from \"./useAgo\";\n\nexport interface UseConversationOptions {\n client?: AgoClient;\n autoLoad?: boolean;\n}\n\n/**\n * Composable to manage conversations.\n *\n * ```ts\n * const { conversations, selectConversation } = useConversation();\n * ```\n */\nexport function useConversation(options: UseConversationOptions = {}) {\n const client = options.client ?? useAgo();\n const autoLoad = options.autoLoad ?? true;\n\n const conversations = ref<Conversation[]>([]);\n const currentConversation = ref<Conversation | null>(null);\n const isLoading = ref(false);\n const error = ref<Error | null>(null);\n\n async function refreshConversations() {\n isLoading.value = true;\n error.value = null;\n try {\n conversations.value = await client.getConversations();\n } catch (err) {\n error.value = err instanceof Error ? err : new Error(\"Failed to load conversations\");\n } finally {\n isLoading.value = false;\n }\n }\n\n async function selectConversation(id: string) {\n isLoading.value = true;\n error.value = null;\n try {\n currentConversation.value = await client.getConversation(id);\n } catch (err) {\n error.value = err instanceof Error ? err : new Error(\"Failed to load conversation\");\n } finally {\n isLoading.value = false;\n }\n }\n\n function startNewConversation() {\n currentConversation.value = null;\n }\n\n onMounted(() => {\n if (autoLoad) refreshConversations();\n });\n\n return {\n conversations,\n currentConversation,\n isLoading,\n error,\n selectConversation,\n startNewConversation,\n refreshConversations,\n };\n}\n","import { computed } from \"vue\";\nimport type { AgoClient } from \"../../client/AgoClient\";\nimport { useMessages } from \"./useMessages\";\nimport { useConversation } from \"./useConversation\";\n\nexport interface UseChatOptions {\n client?: AgoClient;\n conversationId?: string;\n autoLoad?: boolean;\n}\n\n/**\n * All-in-one composable combining messages + conversations.\n *\n * ```ts\n * const { messages, sendMessage, conversations, selectConversation } = useChat();\n * ```\n */\nexport function useChat(options: UseChatOptions = {}) {\n const msgResult = useMessages({\n client: options.client,\n conversationId: options.conversationId,\n });\n\n const convResult = useConversation({\n client: options.client,\n autoLoad: options.autoLoad,\n });\n\n const error = computed(\n () => msgResult.error.value || convResult.error.value\n );\n\n return {\n // Messages\n messages: msgResult.messages,\n isLoading: msgResult.isLoading,\n error,\n sendMessage: msgResult.sendMessage,\n clearMessages: msgResult.clearMessages,\n conversationId: msgResult.conversationId,\n // Conversations\n conversations: convResult.conversations,\n currentConversation: convResult.currentConversation,\n isConversationsLoading: convResult.isLoading,\n selectConversation: convResult.selectConversation,\n startNewConversation: convResult.startNewConversation,\n refreshConversations: convResult.refreshConversations,\n };\n}\n","import { onMounted, onUnmounted } from \"vue\";\nimport type { ClientFunctionHandler, ClientFunctionSchema } from \"../../functions/types\";\nimport { useAgo } from \"./useAgo\";\n\n/**\n * Register a client-side function with auto-cleanup on unmount.\n *\n * ```ts\n * useAgoFunction(\"showToast\", {\n * description: \"Show a toast\",\n * parameters: { type: \"object\", properties: { message: { type: \"string\" } } },\n * handler: async (args) => { toast(args.message); return { shown: true }; },\n * });\n * ```\n */\nexport function useAgoFunction(\n name: string,\n options: {\n description: string;\n parameters: ClientFunctionSchema[\"parameters\"];\n handler: ClientFunctionHandler;\n }\n): void {\n const client = useAgo();\n\n onMounted(() => {\n client.registerFunction(name, options.handler, {\n description: options.description,\n parameters: options.parameters,\n });\n });\n\n onUnmounted(() => {\n client.unregisterFunction(name);\n });\n}\n\nexport interface AgoRoute {\n name: string;\n path: string;\n description: string;\n}\n\n/**\n * Register navigation routes with auto-cleanup on unmount.\n * Works with vue-router's `useRouter().push`.\n *\n * ```ts\n * const router = useRouter();\n * useAgoNavigation((path) => router.push(path), [\n * { name: \"dashboard\", path: \"/dashboard\", description: \"Main dashboard\" },\n * ]);\n * ```\n */\nexport function useAgoNavigation(\n navigate: (path: string) => void,\n routes: AgoRoute[]\n): void {\n const client = useAgo();\n\n onMounted(() => {\n client.registerNavigationFunction(navigate, routes);\n });\n\n onUnmounted(() => {\n client.unregisterFunction(\"navigateToPage\");\n });\n}\n","import { onMounted, onUnmounted } from \"vue\";\nimport type { AgoClientEvents, AgoEventName } from \"../../client/types\";\nimport { useAgo } from \"./useAgo\";\n\n/**\n * Subscribe to AGO client events with auto-cleanup on unmount.\n *\n * ```ts\n * useAgoEvents(\"message:complete\", (msg) => {\n * console.log(\"Got message:\", msg.content);\n * });\n * ```\n */\nexport function useAgoEvents<K extends AgoEventName>(\n event: K,\n handler: (data: AgoClientEvents[K]) => void\n): void {\n const client = useAgo();\n\n onMounted(() => {\n client.on(event, handler);\n });\n\n onUnmounted(() => {\n client.off(event, handler);\n });\n}\n"],"names":["AgoClient","inject","ref","onMounted","onUnmounted","computed"],"mappings":"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"}
package/dist/vue.d.ts CHANGED
@@ -1,2 +1 @@
1
1
  export * from './vue/index'
2
- export {}