@useago/sdk 1.0.0 → 1.0.2
This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
- package/CHANGELOG.md +44 -0
- package/README.md +103 -74
- package/dist/AgoClient-_fig8FoN.cjs +6 -0
- package/dist/{AgoClient-BrYhSO5M.js → AgoClient-bQozE6-A.js} +174 -134
- package/dist/angular.cjs +1 -1
- package/dist/angular.d.cts +131 -1
- package/dist/angular.d.ts +131 -1
- package/dist/angular.js +1 -1
- package/dist/{createConversationSession-Dmqd80DX.js → createConversationSession-BbK3ou1k.js} +1 -1
- package/dist/{createConversationSession-CGRO0bs2.cjs → createConversationSession-DJUFgOXy.cjs} +1 -1
- package/dist/createFormCollector-CdQjGAl_.cjs +1 -0
- package/dist/createFormCollector-D-TpSd9x.js +257 -0
- package/dist/devtools.d.cts +131 -1
- package/dist/devtools.d.ts +131 -1
- package/dist/index.cjs +1 -1
- package/dist/index.d.cts +126 -4
- package/dist/index.d.ts +126 -4
- package/dist/index.js +94 -92
- package/dist/react.cjs +20 -20
- package/dist/react.d.cts +125 -30
- package/dist/react.d.ts +125 -30
- package/dist/react.js +2207 -2135
- package/dist/testing.d.cts +131 -1
- package/dist/testing.d.ts +131 -1
- package/dist/vue.cjs +1 -1
- package/dist/vue.d.cts +131 -1
- package/dist/vue.d.ts +131 -1
- package/dist/vue.js +1 -1
- package/dist/widget.cjs +4 -4
- package/dist/widget.d.cts +115 -5
- package/dist/widget.d.ts +115 -5
- package/dist/widget.js +408 -322
- package/package.json +2 -2
- package/dist/AgoClient-CPqPT5s6.cjs +0 -6
- package/dist/createFormCollector-CPS2phYq.js +0 -245
- package/dist/createFormCollector-DaWZsBsI.cjs +0 -1
|
@@ -1,28 +1,28 @@
|
|
|
1
|
-
var
|
|
1
|
+
var h = class extends Error {
|
|
2
2
|
constructor(e, t, s) {
|
|
3
3
|
super(e), this.code = t, this.statusCode = s, this.name = "AgoError";
|
|
4
4
|
}
|
|
5
|
-
},
|
|
6
|
-
constructor(t, s,
|
|
7
|
-
super(t, s,
|
|
5
|
+
}, d = class v extends h {
|
|
6
|
+
constructor(t, s, n, i, r, a) {
|
|
7
|
+
super(t, s, n), this.type = i, this.param = r, this.docUrl = a, this.name = "AgoApiError";
|
|
8
8
|
}
|
|
9
9
|
static fromResponse(t, s) {
|
|
10
|
-
const
|
|
11
|
-
return new
|
|
10
|
+
const n = t.error;
|
|
11
|
+
return new v(n.doc_url ? `${n.message} See ${n.doc_url}` : n.message, n.code, s, n.type, n.param, n.doc_url);
|
|
12
12
|
}
|
|
13
|
-
}, u = class extends
|
|
13
|
+
}, u = class extends h {
|
|
14
14
|
constructor(e, t) {
|
|
15
15
|
super(e, "network_error"), this.originalError = t, this.name = "AgoNetworkError";
|
|
16
16
|
}
|
|
17
|
-
},
|
|
18
|
-
constructor(e) {
|
|
19
|
-
super(e,
|
|
17
|
+
}, m = class extends h {
|
|
18
|
+
constructor(e, t = "stream_error") {
|
|
19
|
+
super(e, t), this.name = "AgoStreamError";
|
|
20
20
|
}
|
|
21
|
-
},
|
|
21
|
+
}, g = class extends h {
|
|
22
22
|
constructor(e, t, s) {
|
|
23
23
|
super(e, "function_error"), this.functionName = t, this.originalError = s, this.name = "AgoFunctionError";
|
|
24
24
|
}
|
|
25
|
-
},
|
|
25
|
+
}, E = class {
|
|
26
26
|
constructor(e = !1) {
|
|
27
27
|
this.enabled = e;
|
|
28
28
|
}
|
|
@@ -44,25 +44,25 @@ var d = class extends Error {
|
|
|
44
44
|
debug(...e) {
|
|
45
45
|
this.enabled && console.debug("[AGO SDK]", ...e);
|
|
46
46
|
}
|
|
47
|
-
},
|
|
48
|
-
function
|
|
47
|
+
}, o = new E(), f = "ago_widget_id";
|
|
48
|
+
function _() {
|
|
49
49
|
if (typeof localStorage < "u") {
|
|
50
50
|
const t = localStorage.getItem(f);
|
|
51
51
|
if (t) return t;
|
|
52
52
|
}
|
|
53
|
-
const e = crypto.randomUUID()
|
|
53
|
+
const e = typeof crypto < "u" && typeof crypto.randomUUID == "function" ? crypto.randomUUID() : `ago-${Date.now().toString(36)}-${Math.random().toString(36).slice(2, 12)}`;
|
|
54
54
|
if (typeof localStorage < "u") try {
|
|
55
55
|
localStorage.setItem(f, e);
|
|
56
56
|
} catch {
|
|
57
57
|
}
|
|
58
58
|
return e;
|
|
59
59
|
}
|
|
60
|
-
var
|
|
60
|
+
var S = class {
|
|
61
61
|
constructor(e) {
|
|
62
|
-
this.baseUrl = e.baseUrl.replace(/\/$/, ""), this.headers = { "X-
|
|
62
|
+
this.baseUrl = e.baseUrl.replace(/\/$/, ""), this.headers = { "X-User-Anon-Id": e.widgetId || _() }, e.userEmail && (this.headers["X-User-Email"] = e.userEmail), e.userJwt && (this.headers.Authorization = `Bearer ${e.userJwt}`), e.permission && (this.headers["X-Widget-Permission"] = e.permission);
|
|
63
63
|
}
|
|
64
64
|
updateConfig(e) {
|
|
65
|
-
e.baseUrl && (this.baseUrl = e.baseUrl.replace(/\/$/, "")), e.widgetId && (this.headers["X-
|
|
65
|
+
e.baseUrl && (this.baseUrl = e.baseUrl.replace(/\/$/, "")), e.widgetId && (this.headers["X-User-Anon-Id"] = e.widgetId), e.userEmail && (this.headers["X-User-Email"] = e.userEmail), e.userJwt && (this.headers.Authorization = `Bearer ${e.userJwt}`), e.permission !== void 0 && (e.permission ? this.headers["X-Widget-Permission"] = e.permission : delete this.headers["X-Widget-Permission"]);
|
|
66
66
|
}
|
|
67
67
|
async get(e) {
|
|
68
68
|
return this.request("GET", e);
|
|
@@ -72,9 +72,9 @@ var E = class {
|
|
|
72
72
|
}
|
|
73
73
|
async postStream(e, t) {
|
|
74
74
|
const s = `${this.baseUrl}${e}`;
|
|
75
|
-
|
|
75
|
+
o.debug("POST (stream)", s, t);
|
|
76
76
|
try {
|
|
77
|
-
const
|
|
77
|
+
const n = await fetch(s, {
|
|
78
78
|
method: "POST",
|
|
79
79
|
headers: {
|
|
80
80
|
...this.headers,
|
|
@@ -82,31 +82,31 @@ var E = class {
|
|
|
82
82
|
},
|
|
83
83
|
body: t ? JSON.stringify(t) : void 0
|
|
84
84
|
});
|
|
85
|
-
return
|
|
86
|
-
} catch (
|
|
87
|
-
throw
|
|
85
|
+
return n.ok || await this.handleErrorResponse(n), n;
|
|
86
|
+
} catch (n) {
|
|
87
|
+
throw n instanceof d ? n : new u(`Network error: ${n instanceof Error ? n.message : "Unknown error"}. Check that \`baseUrl\` is reachable and includes the protocol (https://).`, n instanceof Error ? n : void 0);
|
|
88
88
|
}
|
|
89
89
|
}
|
|
90
90
|
async postFormData(e, t) {
|
|
91
91
|
const s = `${this.baseUrl}${e}`;
|
|
92
|
-
|
|
93
|
-
const
|
|
92
|
+
o.debug("POST (formData)", s);
|
|
93
|
+
const n = { ...this.headers };
|
|
94
94
|
try {
|
|
95
95
|
const i = await fetch(s, {
|
|
96
96
|
method: "POST",
|
|
97
|
-
headers:
|
|
97
|
+
headers: n,
|
|
98
98
|
body: t
|
|
99
99
|
});
|
|
100
100
|
return i.ok || await this.handleErrorResponse(i), i;
|
|
101
101
|
} catch (i) {
|
|
102
|
-
throw i instanceof
|
|
102
|
+
throw i instanceof d ? i : new u(`Network error: ${i instanceof Error ? i.message : "Unknown error"}. Check that \`baseUrl\` is reachable and includes the protocol (https://).`, i instanceof Error ? i : void 0);
|
|
103
103
|
}
|
|
104
104
|
}
|
|
105
105
|
async request(e, t, s) {
|
|
106
|
-
const
|
|
107
|
-
|
|
106
|
+
const n = `${this.baseUrl}${t}`;
|
|
107
|
+
o.debug(e, n, s);
|
|
108
108
|
try {
|
|
109
|
-
const i = await fetch(
|
|
109
|
+
const i = await fetch(n, {
|
|
110
110
|
method: e,
|
|
111
111
|
headers: {
|
|
112
112
|
...this.headers,
|
|
@@ -116,7 +116,7 @@ var E = class {
|
|
|
116
116
|
});
|
|
117
117
|
return i.ok || await this.handleErrorResponse(i), i.status === 204 ? void 0 : i.json();
|
|
118
118
|
} catch (i) {
|
|
119
|
-
throw i instanceof
|
|
119
|
+
throw i instanceof d ? i : new u(`Network error: ${i instanceof Error ? i.message : "Unknown error"}. Check that \`baseUrl\` is reachable and includes the protocol (https://).`, i instanceof Error ? i : void 0);
|
|
120
120
|
}
|
|
121
121
|
}
|
|
122
122
|
async handleErrorResponse(e) {
|
|
@@ -125,33 +125,35 @@ var E = class {
|
|
|
125
125
|
t = await e.json();
|
|
126
126
|
} catch {
|
|
127
127
|
}
|
|
128
|
-
|
|
128
|
+
if (t?.error) throw d.fromResponse(t, e.status);
|
|
129
|
+
let s = "";
|
|
130
|
+
throw e.status === 401 || e.status === 403 ? s = " Check `userJwt` (and that it has not expired)." : e.status === 404 && (s = " Check that `baseUrl` points at your AGO API root."), new d(`HTTP ${e.status}: ${e.statusText}.${s}`, "http_error", e.status, "api_error");
|
|
129
131
|
}
|
|
130
|
-
},
|
|
132
|
+
}, k = class {
|
|
131
133
|
constructor() {
|
|
132
134
|
this.functions = /* @__PURE__ */ new Map();
|
|
133
135
|
}
|
|
134
136
|
register(e, t, s) {
|
|
135
137
|
if (typeof e == "object") {
|
|
136
|
-
const { name: i, handler:
|
|
137
|
-
return this.register(i,
|
|
138
|
+
const { name: i, handler: r, description: a, parameters: l } = e;
|
|
139
|
+
return this.register(i, r, {
|
|
138
140
|
description: a,
|
|
139
141
|
parameters: l
|
|
140
142
|
});
|
|
141
143
|
}
|
|
142
|
-
const
|
|
143
|
-
if (!t || !s) throw new
|
|
144
|
-
this.functions.has(
|
|
144
|
+
const n = e;
|
|
145
|
+
if (!t || !s) throw new h(`registerFunction("${n}"): both a handler and a schema are required. Pass them as arguments or use the single-object form: registerFunction({ name, parameters, handler }).`, "function_invalid_registration");
|
|
146
|
+
this.functions.has(n) && o.warn(`Function "${n}" is being overwritten`), this.functions.set(n, {
|
|
145
147
|
schema: {
|
|
146
148
|
...s,
|
|
147
|
-
name:
|
|
149
|
+
name: n
|
|
148
150
|
},
|
|
149
151
|
handler: t
|
|
150
|
-
}),
|
|
152
|
+
}), o.log(`Registered function: ${n}`);
|
|
151
153
|
}
|
|
152
154
|
unregister(e) {
|
|
153
155
|
const t = this.functions.delete(e);
|
|
154
|
-
return t &&
|
|
156
|
+
return t && o.log(`Unregistered function: ${e}`), t;
|
|
155
157
|
}
|
|
156
158
|
get(e) {
|
|
157
159
|
return this.functions.get(e);
|
|
@@ -164,71 +166,71 @@ var E = class {
|
|
|
164
166
|
}
|
|
165
167
|
async execute(e, t) {
|
|
166
168
|
const s = this.functions.get(e);
|
|
167
|
-
if (!s) throw new
|
|
168
|
-
|
|
169
|
+
if (!s) throw new g(`Function "${e}" is not registered`, e);
|
|
170
|
+
o.log(`Executing function: ${e}`, t);
|
|
169
171
|
try {
|
|
170
|
-
const
|
|
171
|
-
return
|
|
172
|
-
} catch (
|
|
173
|
-
throw
|
|
172
|
+
const n = await s.handler(t);
|
|
173
|
+
return o.log(`Function ${e} completed:`, n), n;
|
|
174
|
+
} catch (n) {
|
|
175
|
+
throw o.error(`Function ${e} failed:`, n), new g(`Function "${e}" execution failed: ${n instanceof Error ? n.message : "Unknown error"}`, e, n instanceof Error ? n : void 0);
|
|
174
176
|
}
|
|
175
177
|
}
|
|
176
178
|
clear() {
|
|
177
|
-
this.functions.clear(),
|
|
179
|
+
this.functions.clear(), o.log("Cleared all registered functions");
|
|
178
180
|
}
|
|
179
181
|
get size() {
|
|
180
182
|
return this.functions.size;
|
|
181
183
|
}
|
|
182
|
-
},
|
|
184
|
+
}, A = class {
|
|
183
185
|
constructor() {
|
|
184
186
|
this.entries = /* @__PURE__ */ new Map(), this.dynamicProviders = /* @__PURE__ */ new Map();
|
|
185
187
|
}
|
|
186
188
|
set(e, t) {
|
|
187
|
-
this.entries.set(e, t),
|
|
189
|
+
this.entries.set(e, t), o.log(`ClientContext set: ${e}`);
|
|
188
190
|
}
|
|
189
191
|
remove(e) {
|
|
190
192
|
const t = this.entries.delete(e);
|
|
191
|
-
return t &&
|
|
193
|
+
return t && o.log(`ClientContext removed: ${e}`), t;
|
|
192
194
|
}
|
|
193
195
|
addDynamicProvider(e, t) {
|
|
194
|
-
this.dynamicProviders.set(e, t),
|
|
196
|
+
this.dynamicProviders.set(e, t), o.log(`DynamicContext provider added: ${e}`);
|
|
195
197
|
}
|
|
196
198
|
removeDynamicProvider(e) {
|
|
197
199
|
const t = this.dynamicProviders.delete(e);
|
|
198
|
-
return t &&
|
|
200
|
+
return t && o.log(`DynamicContext provider removed: ${e}`), t;
|
|
199
201
|
}
|
|
200
202
|
getSnapshot() {
|
|
201
203
|
if (this.entries.size === 0 && this.dynamicProviders.size === 0) return null;
|
|
202
204
|
const e = {};
|
|
203
205
|
for (const [t, s] of this.entries) e[t] = s;
|
|
204
206
|
for (const [t, s] of this.dynamicProviders) try {
|
|
205
|
-
const
|
|
206
|
-
|
|
207
|
-
} catch (
|
|
208
|
-
|
|
207
|
+
const n = s();
|
|
208
|
+
n && (e[t] = n);
|
|
209
|
+
} catch (n) {
|
|
210
|
+
o.error(`DynamicContext provider "${t}" threw:`, n);
|
|
209
211
|
}
|
|
210
212
|
return Object.keys(e).length === 0 ? null : { entries: e };
|
|
211
213
|
}
|
|
212
214
|
clear() {
|
|
213
|
-
this.entries.clear(), this.dynamicProviders.clear(),
|
|
215
|
+
this.entries.clear(), this.dynamicProviders.clear(), o.log("ClientContext cleared");
|
|
214
216
|
}
|
|
215
|
-
},
|
|
217
|
+
}, x = class {
|
|
216
218
|
constructor(e) {
|
|
217
219
|
this.callbacks = e, this.buffer = "", this.message = {}, this.toolCalls = [], this.sources = [], this.followUpReplies = [], this.isFirstChunk = !0, this.answerCompleteEmitted = !1;
|
|
218
220
|
}
|
|
219
221
|
async processStream(e) {
|
|
220
|
-
if (!e.body) throw new
|
|
222
|
+
if (!e.body) throw new m("Response has no body. The endpoint did not return a stream: check that `baseUrl` points at an AGO API and nothing (proxy, mock) strips the SSE body.", "stream_no_body");
|
|
221
223
|
const t = e.body.getReader(), s = new TextDecoder();
|
|
222
224
|
try {
|
|
223
225
|
for (; ; ) {
|
|
224
|
-
const { done:
|
|
225
|
-
if (
|
|
226
|
-
const
|
|
227
|
-
this.buffer +=
|
|
226
|
+
const { done: n, value: i } = await t.read();
|
|
227
|
+
if (n) break;
|
|
228
|
+
const r = s.decode(i, { stream: !0 });
|
|
229
|
+
this.buffer += r, this.processBuffer();
|
|
228
230
|
}
|
|
229
231
|
return this.buffer.trim() && this.processBuffer(), this.buildFinalMessage();
|
|
230
|
-
} catch (
|
|
231
|
-
const i =
|
|
232
|
+
} catch (n) {
|
|
233
|
+
const i = n instanceof Error ? n : new m("Stream processing failed mid-flight. The connection may have dropped; retry the message.");
|
|
232
234
|
throw this.callbacks.onError?.(i), i;
|
|
233
235
|
} finally {
|
|
234
236
|
t.releaseLock();
|
|
@@ -243,14 +245,14 @@ var E = class {
|
|
|
243
245
|
if (!t.trim()) continue;
|
|
244
246
|
const s = t.split(`
|
|
245
247
|
`);
|
|
246
|
-
for (const
|
|
247
|
-
if (!
|
|
248
|
-
const i =
|
|
248
|
+
for (const n of s)
|
|
249
|
+
if (!n.startsWith(": ") && n.startsWith("data: ")) {
|
|
250
|
+
const i = n.slice(6);
|
|
249
251
|
try {
|
|
250
|
-
const
|
|
251
|
-
this.handleChunk(
|
|
252
|
-
} catch (
|
|
253
|
-
|
|
252
|
+
const r = JSON.parse(i);
|
|
253
|
+
this.handleChunk(r);
|
|
254
|
+
} catch (r) {
|
|
255
|
+
o.warn("Failed to parse SSE data:", i, r);
|
|
254
256
|
}
|
|
255
257
|
}
|
|
256
258
|
}
|
|
@@ -282,7 +284,7 @@ var E = class {
|
|
|
282
284
|
}), e.tool_call_data && e.type && e.type !== "client_function") {
|
|
283
285
|
const t = this.parseToolCall(e);
|
|
284
286
|
this.callbacks.onToolCall?.(t);
|
|
285
|
-
const s = this.toolCalls.findIndex((
|
|
287
|
+
const s = this.toolCalls.findIndex((n) => n.id === t.id);
|
|
286
288
|
s >= 0 ? this.toolCalls[s] = t : this.toolCalls.push(t);
|
|
287
289
|
}
|
|
288
290
|
e.follow_up_replies && (this.followUpReplies = e.follow_up_replies), this.message.status === "DONE" && !this.answerCompleteEmitted && this.message.id && (this.answerCompleteEmitted = !0, this.callbacks.onAnswerComplete?.(this.buildMessage()));
|
|
@@ -320,11 +322,11 @@ var E = class {
|
|
|
320
322
|
return this.callbacks.onComplete?.(e), e;
|
|
321
323
|
}
|
|
322
324
|
};
|
|
323
|
-
function
|
|
325
|
+
function R(e) {
|
|
324
326
|
const t = e.message.toLowerCase();
|
|
325
327
|
return t.includes("load failed") || t.includes("failed to fetch") || t.includes("network") || t.includes("abort");
|
|
326
328
|
}
|
|
327
|
-
var
|
|
329
|
+
var $ = class {
|
|
328
330
|
constructor() {
|
|
329
331
|
this.handlers = /* @__PURE__ */ new Map();
|
|
330
332
|
}
|
|
@@ -337,99 +339,124 @@ var S = class {
|
|
|
337
339
|
}
|
|
338
340
|
emit(e, t) {
|
|
339
341
|
const s = this.handlers.get(e);
|
|
340
|
-
s && s.forEach((
|
|
342
|
+
s && s.forEach((n) => {
|
|
341
343
|
try {
|
|
342
|
-
|
|
344
|
+
n(t);
|
|
343
345
|
} catch (i) {
|
|
344
346
|
console.error(`Error in event handler for ${String(e)}:`, i);
|
|
345
347
|
}
|
|
346
348
|
});
|
|
347
349
|
}
|
|
348
350
|
once(e, t) {
|
|
349
|
-
const s = ((
|
|
350
|
-
this.off(e, s), t(
|
|
351
|
+
const s = ((n) => {
|
|
352
|
+
this.off(e, s), t(n);
|
|
351
353
|
});
|
|
352
354
|
this.on(e, s);
|
|
353
355
|
}
|
|
354
356
|
waitFor(e, t) {
|
|
355
|
-
return new Promise((s,
|
|
357
|
+
return new Promise((s, n) => {
|
|
356
358
|
let i;
|
|
357
|
-
const
|
|
359
|
+
const r = ((a) => {
|
|
358
360
|
i && clearTimeout(i), s(a);
|
|
359
361
|
});
|
|
360
|
-
this.once(e,
|
|
361
|
-
this.off(e,
|
|
362
|
+
this.once(e, r), t?.timeout && (i = setTimeout(() => {
|
|
363
|
+
this.off(e, r), n(/* @__PURE__ */ new Error(`waitFor("${String(e)}") timed out after ${t.timeout}ms`));
|
|
362
364
|
}, t.timeout));
|
|
363
365
|
});
|
|
364
366
|
}
|
|
365
367
|
removeAllListeners(e) {
|
|
366
368
|
e ? this.handlers.delete(e) : this.handlers.clear();
|
|
367
369
|
}
|
|
368
|
-
},
|
|
370
|
+
}, p = '`baseUrl` is required, e.g. new AgoClient({ baseUrl: "https://YOUR-DOMAIN.api.useago.com" }). Try the live demo endpoint https://playground.api.useago.com. See docs/general/configuration.md#error-codes (config_missing_base_url).', I = /^[a-z][a-z0-9+.-]*:\/\//i, y = !1;
|
|
371
|
+
function w(e, t = "AgoClient") {
|
|
372
|
+
if (typeof e != "object" || e === null) throw new h(`${t}: ${p}`, "config_missing_base_url");
|
|
373
|
+
const s = e.baseUrl;
|
|
374
|
+
if (typeof s != "string" || s.trim() === "") throw new h(`${t}: ${p}`, "config_missing_base_url");
|
|
375
|
+
!s.startsWith("/") && !I.test(s) && (y || (y = !0, console.warn(`[AGO] ${t}: \`baseUrl\` has no protocol and is not a relative path (config_suspect_base_url). Requests will fail: Node throws a URL parse error, browsers fetch it as a relative path. Use "https://..." (or a "/path" for a same-origin proxy).`)));
|
|
376
|
+
}
|
|
377
|
+
var U = class C {
|
|
369
378
|
constructor(t) {
|
|
370
|
-
this.config = t, this.httpClient = new
|
|
379
|
+
this.warnedEmptyConversations = /* @__PURE__ */ new Set(), w(t, "AgoClient"), this.config = t, this.httpClient = new S(t), this.functionRegistry = new k(), this.contextRegistry = new A(), this.eventEmitter = new $(), t.debug && o.enable(), o.log("AgoClient initialized");
|
|
371
380
|
}
|
|
372
381
|
async sendMessage(t, s) {
|
|
373
|
-
const
|
|
382
|
+
const n = this.functionRegistry.getSchemas(), i = this.contextRegistry.getSnapshot(), r = this.config.agent || this.config.defaultAgentId, a = {
|
|
374
383
|
content: t,
|
|
375
384
|
conversation_id: s?.conversationId,
|
|
376
|
-
agent_id: s?.agentId ||
|
|
385
|
+
agent_id: s?.agentId || r
|
|
377
386
|
};
|
|
378
|
-
|
|
387
|
+
n.length > 0 && (a.client_functions = n), i && (a.client_context = i);
|
|
379
388
|
let l;
|
|
380
389
|
if (s?.files && s.files.length > 0) {
|
|
381
390
|
const c = new FormData();
|
|
382
|
-
c.append("content", t), s.conversationId && c.append("conversation_id", s.conversationId), (s.agentId ||
|
|
383
|
-
for (const
|
|
391
|
+
c.append("content", t), s.conversationId && c.append("conversation_id", s.conversationId), (s.agentId || r) && c.append("agent_id", s.agentId || r || ""), n.length > 0 && c.append("client_functions", JSON.stringify(n)), i && c.append("client_context", JSON.stringify(i));
|
|
392
|
+
for (const b of s.files) c.append("files", b);
|
|
384
393
|
l = await this.httpClient.postFormData("/api/sdk/v1/messages", c);
|
|
385
394
|
} else l = await this.httpClient.postStream("/api/sdk/v1/messages", a);
|
|
386
395
|
return this.processSSEResponse(l);
|
|
387
396
|
}
|
|
388
397
|
async processSSEResponse(t) {
|
|
389
|
-
|
|
390
|
-
|
|
391
|
-
|
|
398
|
+
let s = !1;
|
|
399
|
+
const n = await new x({
|
|
400
|
+
onStart: (i) => {
|
|
401
|
+
this.eventEmitter.emit("message:start", i);
|
|
392
402
|
},
|
|
393
|
-
onChunk: (
|
|
394
|
-
this.eventEmitter.emit("message:chunk",
|
|
403
|
+
onChunk: (i) => {
|
|
404
|
+
this.eventEmitter.emit("message:chunk", i);
|
|
395
405
|
},
|
|
396
|
-
onToolCall: (
|
|
397
|
-
this.eventEmitter.emit("toolCall:received",
|
|
406
|
+
onToolCall: (i) => {
|
|
407
|
+
this.eventEmitter.emit("toolCall:received", i), i.type === "form" && this.eventEmitter.emit("toolCall:form", i);
|
|
398
408
|
},
|
|
399
|
-
onClientFunction: async (
|
|
400
|
-
this.eventEmitter.emit("function:invoke",
|
|
409
|
+
onClientFunction: async (i) => {
|
|
410
|
+
s = !0, this.eventEmitter.emit("function:invoke", i), await this.handleClientFunctionInvocation(i);
|
|
401
411
|
},
|
|
402
|
-
onAnswerComplete: (
|
|
403
|
-
this.eventEmitter.emit("message:answer-complete",
|
|
412
|
+
onAnswerComplete: (i) => {
|
|
413
|
+
this.eventEmitter.emit("message:answer-complete", i);
|
|
404
414
|
},
|
|
405
|
-
onComplete: (
|
|
406
|
-
this.eventEmitter.emit("message:complete",
|
|
415
|
+
onComplete: (i) => {
|
|
416
|
+
this.eventEmitter.emit("message:complete", i);
|
|
407
417
|
},
|
|
408
|
-
onError: (
|
|
409
|
-
this.eventEmitter.emit("message:error", {
|
|
418
|
+
onError: (i) => {
|
|
419
|
+
this.eventEmitter.emit("message:error", {
|
|
420
|
+
error: i.message,
|
|
421
|
+
code: i instanceof h ? i.code : void 0
|
|
422
|
+
});
|
|
410
423
|
}
|
|
411
424
|
}).processStream(t);
|
|
425
|
+
return this.maybeFlagEmptyReply(n, s), n;
|
|
426
|
+
}
|
|
427
|
+
maybeFlagEmptyReply(t, s) {
|
|
428
|
+
t.status === "DONE" && (t.content ?? "").trim() === "" && !s && !(t.toolCalls && t.toolCalls.length > 0) && !(t.followUpReplies && t.followUpReplies.length > 0) && setTimeout(() => {
|
|
429
|
+
if (this.eventEmitter.emit("message:empty", {
|
|
430
|
+
conversationId: t.conversationId ?? "",
|
|
431
|
+
messageId: t.id ?? ""
|
|
432
|
+
}), this.config.warnOnEmptyReply === !1) return;
|
|
433
|
+
const n = t.conversationId || "(no conversation)";
|
|
434
|
+
if (this.warnedEmptyConversations.has(n)) return;
|
|
435
|
+
this.warnedEmptyConversations.add(n);
|
|
436
|
+
const i = this.config.agent || this.config.defaultAgentId;
|
|
437
|
+
t.id ? console.warn("[AGO] Reply completed with empty content. Possible causes: " + (i ? `the agent "${i}" may not exist for this tenant, ` : "an unknown `agent` slug, ") + "or the agent replied with no text. Listen for the `message:empty` event to handle this in your app; silence this warning with `warnOnEmptyReply: false`.") : console.warn("[AGO] The stream completed without any message data. Possible causes: " + (i ? `the agent "${i}" may not exist for this tenant, or ` : "") + "`baseUrl` does not point at an AGO endpoint that returns server-sent events. Listen for the `message:empty` event to handle this in your app; silence this warning with `warnOnEmptyReply: false`.");
|
|
438
|
+
}, 0);
|
|
412
439
|
}
|
|
413
440
|
async handleClientFunctionInvocation(t) {
|
|
414
|
-
let s,
|
|
441
|
+
let s, n;
|
|
415
442
|
try {
|
|
416
443
|
s = await this.functionRegistry.execute(t.functionName, t.arguments);
|
|
417
444
|
} catch (i) {
|
|
418
|
-
|
|
445
|
+
n = i instanceof Error ? i.message : "Unknown error", o.error("Client function execution failed:", i);
|
|
419
446
|
}
|
|
420
447
|
if (t.invocationId) try {
|
|
421
448
|
await this.submitToolCallForm(t.invocationId, {
|
|
422
449
|
result: s,
|
|
423
|
-
error:
|
|
450
|
+
error: n,
|
|
424
451
|
_type: "client_function_result"
|
|
425
452
|
});
|
|
426
453
|
} catch (i) {
|
|
427
|
-
|
|
454
|
+
o.error("Failed to submit function result:", i);
|
|
428
455
|
}
|
|
429
456
|
this.eventEmitter.emit("function:result", {
|
|
430
457
|
invocationId: t.invocationId,
|
|
431
458
|
result: s,
|
|
432
|
-
error:
|
|
459
|
+
error: n
|
|
433
460
|
});
|
|
434
461
|
}
|
|
435
462
|
async getConversations() {
|
|
@@ -440,7 +467,7 @@ var S = class {
|
|
|
440
467
|
}));
|
|
441
468
|
}
|
|
442
469
|
async getConversation(t) {
|
|
443
|
-
const s = await this.httpClient.get(`/api/sdk/v1/conversations/${t}`),
|
|
470
|
+
const s = await this.httpClient.get(`/api/sdk/v1/conversations/${t}`), n = {
|
|
444
471
|
id: s.id,
|
|
445
472
|
title: s.title,
|
|
446
473
|
lastMessageDate: new Date(s.last_message_date),
|
|
@@ -451,10 +478,10 @@ var S = class {
|
|
|
451
478
|
role: i.role,
|
|
452
479
|
status: i.status,
|
|
453
480
|
createdAt: new Date(i.created_at),
|
|
454
|
-
toolCalls:
|
|
481
|
+
toolCalls: C.mapPersistedToolCalls(i.tool_call_data)
|
|
455
482
|
}))
|
|
456
483
|
};
|
|
457
|
-
return this.eventEmitter.emit("conversation:loaded",
|
|
484
|
+
return this.eventEmitter.emit("conversation:loaded", n), n;
|
|
458
485
|
}
|
|
459
486
|
static mapPersistedToolCalls(t) {
|
|
460
487
|
if (!(!t || t.length === 0))
|
|
@@ -483,6 +510,15 @@ var S = class {
|
|
|
483
510
|
async rejectToolCall(t) {
|
|
484
511
|
await this.httpClient.post(`/api/tool-calls/${t}/reject/`);
|
|
485
512
|
}
|
|
513
|
+
async getFormCollector(t) {
|
|
514
|
+
const s = await this.httpClient.get(`/api/sdk/v1/forms/${encodeURIComponent(t)}`);
|
|
515
|
+
return {
|
|
516
|
+
name: s.name,
|
|
517
|
+
description: s.description,
|
|
518
|
+
schema: s.schema,
|
|
519
|
+
submit: s.submit ?? void 0
|
|
520
|
+
};
|
|
521
|
+
}
|
|
486
522
|
async submitFormCollector(t, s) {
|
|
487
523
|
return this.httpClient.post("/api/sdk/v1/forms/submit", {
|
|
488
524
|
destination: t,
|
|
@@ -492,8 +528,8 @@ var S = class {
|
|
|
492
528
|
async submitFeedback(t, s) {
|
|
493
529
|
await this.httpClient.post(`/api/sdk/v1/messages/${t}/feedback`, { rating: s });
|
|
494
530
|
}
|
|
495
|
-
registerFunction(t, s,
|
|
496
|
-
typeof t == "object" ? this.functionRegistry.register(t) : this.functionRegistry.register(t, s,
|
|
531
|
+
registerFunction(t, s, n) {
|
|
532
|
+
typeof t == "object" ? this.functionRegistry.register(t) : this.functionRegistry.register(t, s, n);
|
|
497
533
|
}
|
|
498
534
|
register(t) {
|
|
499
535
|
if (Array.isArray(t)) for (const s of t) this.functionRegistry.register(s);
|
|
@@ -506,10 +542,10 @@ var S = class {
|
|
|
506
542
|
return this.functionRegistry.getSchemas();
|
|
507
543
|
}
|
|
508
544
|
registerNavigationFunction(t, s) {
|
|
509
|
-
const
|
|
545
|
+
const n = s.map((r) => r.name), i = s.map((r) => `- "${r.name}": ${r.description}`).join(`
|
|
510
546
|
`);
|
|
511
|
-
this.registerFunction("navigateToPage", async (
|
|
512
|
-
const a =
|
|
547
|
+
this.registerFunction("navigateToPage", async (r) => {
|
|
548
|
+
const a = r.page, l = s.find((c) => c.name === a);
|
|
513
549
|
return l ? (t(l.path), {
|
|
514
550
|
success: !0,
|
|
515
551
|
navigatedTo: l.path
|
|
@@ -525,7 +561,7 @@ ${i}`,
|
|
|
525
561
|
properties: { page: {
|
|
526
562
|
type: "string",
|
|
527
563
|
description: "The page to navigate to",
|
|
528
|
-
enum:
|
|
564
|
+
enum: n
|
|
529
565
|
} },
|
|
530
566
|
required: ["page"]
|
|
531
567
|
}
|
|
@@ -577,26 +613,30 @@ ${i}`,
|
|
|
577
613
|
return this.eventEmitter.waitFor(t, s);
|
|
578
614
|
}
|
|
579
615
|
updateConfig(t) {
|
|
580
|
-
|
|
616
|
+
const s = {};
|
|
617
|
+
for (const [i, r] of Object.entries(t)) r !== void 0 && (s[i] = r);
|
|
618
|
+
const n = {
|
|
581
619
|
...this.config,
|
|
582
|
-
...
|
|
583
|
-
}
|
|
620
|
+
...s
|
|
621
|
+
};
|
|
622
|
+
w(n, "AgoClient.updateConfig"), this.config = n, this.httpClient.updateConfig(s), s.debug !== void 0 && (s.debug ? o.enable() : o.disable());
|
|
584
623
|
}
|
|
585
624
|
destroy() {
|
|
586
|
-
this.eventEmitter.removeAllListeners(), this.functionRegistry.clear(), this.contextRegistry.clear(),
|
|
625
|
+
this.eventEmitter.removeAllListeners(), this.functionRegistry.clear(), this.contextRegistry.clear(), o.log("AgoClient destroyed");
|
|
587
626
|
}
|
|
588
627
|
};
|
|
589
628
|
export {
|
|
590
|
-
|
|
591
|
-
|
|
592
|
-
|
|
593
|
-
|
|
629
|
+
R as a,
|
|
630
|
+
o as c,
|
|
631
|
+
g as d,
|
|
632
|
+
u as f,
|
|
594
633
|
x as i,
|
|
595
634
|
d as l,
|
|
596
|
-
|
|
597
|
-
|
|
598
|
-
|
|
599
|
-
|
|
600
|
-
|
|
601
|
-
|
|
635
|
+
w as n,
|
|
636
|
+
A as o,
|
|
637
|
+
m as p,
|
|
638
|
+
$ as r,
|
|
639
|
+
k as s,
|
|
640
|
+
U as t,
|
|
641
|
+
h as u
|
|
602
642
|
};
|
package/dist/angular.cjs
CHANGED
|
@@ -1 +1 @@
|
|
|
1
|
-
Object.defineProperty(exports,Symbol.toStringTag,{value:"Module"});const o=require("./AgoClient-
|
|
1
|
+
Object.defineProperty(exports,Symbol.toStringTag,{value:"Module"});const o=require("./AgoClient-_fig8FoN.cjs");var n=class{constructor(e){this.client=new o.AgoClient(e),this.messages$=this.fromEvent("message:complete"),this.chunks$=this.fromEvent("message:chunk"),this.errors$=this.fromEvent("message:error"),this.messageStart$=this.fromEvent("message:start")}fromEvent(e){const t=this.client;return{subscribe(i){const s=r=>{i.next?.(r)};return t.on(e,s),{unsubscribe:()=>t.off(e,s)}}}}sendMessage(e,t){return this.client.sendMessage(e,t)}getConversations(){return this.client.getConversations()}getConversation(e){return this.client.getConversation(e)}getMessages(e){return this.client.getMessages(e)}submitToolCallForm(e,t){return this.client.submitToolCallForm(e,t)}confirmToolCall(e){return this.client.confirmToolCall(e)}rejectToolCall(e){return this.client.rejectToolCall(e)}submitFeedback(e,t){return this.client.submitFeedback(e,t)}registerFunction(e,t,i){typeof e=="object"?this.client.registerFunction(e):this.client.registerFunction(e,t,i)}unregisterFunction(e){return this.client.unregisterFunction(e)}registerNavigationFunction(e,t){this.client.registerNavigationFunction(e,t)}on(e,t){this.client.on(e,t)}off(e,t){this.client.off(e,t)}updateConfig(e){this.client.updateConfig(e)}getClient(){return this.client}destroy(){this.client.destroy()}};function c(e){return{provide:n,useValue:new n(e)}}exports.AgoService=n;exports.provideAgo=c;
|