aov-agent 1.0.0 → 1.0.1

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 (30) hide show
  1. package/README.md +250 -1
  2. package/dist/agent-ui/components/Assistant/AgentButton/AgentButton.js +28 -0
  3. package/dist/agent-ui/components/Assistant/AgentButton/AgentButton.scss +40 -0
  4. package/dist/agent-ui/components/Assistant/Assistant.js +73 -0
  5. package/dist/agent-ui/components/Assistant/Assistant.scss +3 -0
  6. package/dist/agent-ui/components/Assistant/AssistantWidget/AssistantWidget.js +187 -0
  7. package/dist/agent-ui/components/Assistant/AssistantWidget/AssistantWidget.scss +211 -0
  8. package/dist/agent-ui/components/Assistant/AssistantWidget/components/CampaignRendered.js +30 -0
  9. package/dist/agent-ui/components/Assistant/AssistantWidget/components/ListChat.js +129 -0
  10. package/dist/agent-ui/components/Assistant/Markdown/MarkdownText.js +228 -0
  11. package/dist/agent-ui/components/Assistant/Markdown/MarkdownText.scss +222 -0
  12. package/dist/agent-ui/components/Assistant/Markdown/MathRenderer.js +46 -0
  13. package/dist/agent-ui/components/Assistant/Suggestions/Suggestions.js +62 -0
  14. package/dist/agent-ui/components/Assistant/Suggestions/Suggestions.scss +22 -0
  15. package/dist/agent-ui/components/Assistant/ThreadProvider.js +482 -0
  16. package/dist/agent-ui/components/Assistant/ToolResult/CardTool.js +41 -0
  17. package/dist/agent-ui/components/Assistant/ToolResult/ToolResult.js +20 -0
  18. package/dist/agent-ui/components/ResizableModal/ResizableModal.js +262 -0
  19. package/dist/agent-ui/components/ResizableModal/ResizableModal.scss +117 -0
  20. package/dist/agent-ui/contexts/AgentContext.js +39 -0
  21. package/dist/agent-ui/contexts/SuggestionsContext.js +64 -0
  22. package/dist/agent-ui/contexts/ThreadContext.js +60 -0
  23. package/dist/agent-ui/hooks/useFetchApi.js +238 -0
  24. package/dist/agent-ui/hooks/useStreamApi.js +127 -0
  25. package/dist/agent-ui/index.js +1 -0
  26. package/dist/agent-ui/services/errorService.js +39 -0
  27. package/dist/agent-ui/utils/api.js +164 -0
  28. package/package.json +26 -9
  29. package/dist/index.js +0 -7
  30. package/types/index.d.ts +0 -5
@@ -0,0 +1,482 @@
1
+ function _typeof(o) { "@babel/helpers - typeof"; return _typeof = "function" == typeof Symbol && "symbol" == typeof Symbol.iterator ? function (o) { return typeof o; } : function (o) { return o && "function" == typeof Symbol && o.constructor === Symbol && o !== Symbol.prototype ? "symbol" : typeof o; }, _typeof(o); }
2
+ function asyncGeneratorStep(n, t, e, r, o, a, c) { try { var i = n[a](c), u = i.value; } catch (n) { return void e(n); } i.done ? t(u) : Promise.resolve(u).then(r, o); }
3
+ function _asyncToGenerator(n) { return function () { var t = this, e = arguments; return new Promise(function (r, o) { var a = n.apply(t, e); function _next(n) { asyncGeneratorStep(a, r, o, _next, _throw, "next", n); } function _throw(n) { asyncGeneratorStep(a, r, o, _next, _throw, "throw", n); } _next(void 0); }); }; }
4
+ function _toConsumableArray(r) { return _arrayWithoutHoles(r) || _iterableToArray(r) || _unsupportedIterableToArray(r) || _nonIterableSpread(); }
5
+ function _nonIterableSpread() { throw new TypeError("Invalid attempt to spread non-iterable instance.\nIn order to be iterable, non-array objects must have a [Symbol.iterator]() method."); }
6
+ function _iterableToArray(r) { if ("undefined" != typeof Symbol && null != r[Symbol.iterator] || null != r["@@iterator"]) return Array.from(r); }
7
+ function _arrayWithoutHoles(r) { if (Array.isArray(r)) return _arrayLikeToArray(r); }
8
+ function ownKeys(e, r) { var t = Object.keys(e); if (Object.getOwnPropertySymbols) { var o = Object.getOwnPropertySymbols(e); r && (o = o.filter(function (r) { return Object.getOwnPropertyDescriptor(e, r).enumerable; })), t.push.apply(t, o); } return t; }
9
+ function _objectSpread(e) { for (var r = 1; r < arguments.length; r++) { var t = null != arguments[r] ? arguments[r] : {}; r % 2 ? ownKeys(Object(t), !0).forEach(function (r) { _defineProperty(e, r, t[r]); }) : Object.getOwnPropertyDescriptors ? Object.defineProperties(e, Object.getOwnPropertyDescriptors(t)) : ownKeys(Object(t)).forEach(function (r) { Object.defineProperty(e, r, Object.getOwnPropertyDescriptor(t, r)); }); } return e; }
10
+ function _defineProperty(e, r, t) { return (r = _toPropertyKey(r)) in e ? Object.defineProperty(e, r, { value: t, enumerable: !0, configurable: !0, writable: !0 }) : e[r] = t, e; }
11
+ function _toPropertyKey(t) { var i = _toPrimitive(t, "string"); return "symbol" == _typeof(i) ? i : i + ""; }
12
+ function _toPrimitive(t, r) { if ("object" != _typeof(t) || !t) return t; var e = t[Symbol.toPrimitive]; if (void 0 !== e) { var i = e.call(t, r || "default"); if ("object" != _typeof(i)) return i; throw new TypeError("@@toPrimitive must return a primitive value."); } return ("string" === r ? String : Number)(t); }
13
+ function _regenerator() { /*! regenerator-runtime -- Copyright (c) 2014-present, Facebook, Inc. -- license (MIT): https://github.com/babel/babel/blob/main/packages/babel-helpers/LICENSE */ var e, t, r = "function" == typeof Symbol ? Symbol : {}, n = r.iterator || "@@iterator", o = r.toStringTag || "@@toStringTag"; function i(r, n, o, i) { var c = n && n.prototype instanceof Generator ? n : Generator, u = Object.create(c.prototype); return _regeneratorDefine2(u, "_invoke", function (r, n, o) { var i, c, u, f = 0, p = o || [], y = !1, G = { p: 0, n: 0, v: e, a: d, f: d.bind(e, 4), d: function d(t, r) { return i = t, c = 0, u = e, G.n = r, a; } }; function d(r, n) { for (c = r, u = n, t = 0; !y && f && !o && t < p.length; t++) { var o, i = p[t], d = G.p, l = i[2]; r > 3 ? (o = l === n) && (u = i[(c = i[4]) ? 5 : (c = 3, 3)], i[4] = i[5] = e) : i[0] <= d && ((o = r < 2 && d < i[1]) ? (c = 0, G.v = n, G.n = i[1]) : d < l && (o = r < 3 || i[0] > n || n > l) && (i[4] = r, i[5] = n, G.n = l, c = 0)); } if (o || r > 1) return a; throw y = !0, n; } return function (o, p, l) { if (f > 1) throw TypeError("Generator is already running"); for (y && 1 === p && d(p, l), c = p, u = l; (t = c < 2 ? e : u) || !y;) { i || (c ? c < 3 ? (c > 1 && (G.n = -1), d(c, u)) : G.n = u : G.v = u); try { if (f = 2, i) { if (c || (o = "next"), t = i[o]) { if (!(t = t.call(i, u))) throw TypeError("iterator result is not an object"); if (!t.done) return t; u = t.value, c < 2 && (c = 0); } else 1 === c && (t = i["return"]) && t.call(i), c < 2 && (u = TypeError("The iterator does not provide a '" + o + "' method"), c = 1); i = e; } else if ((t = (y = G.n < 0) ? u : r.call(n, G)) !== a) break; } catch (t) { i = e, c = 1, u = t; } finally { f = 1; } } return { value: t, done: y }; }; }(r, o, i), !0), u; } var a = {}; function Generator() {} function GeneratorFunction() {} function GeneratorFunctionPrototype() {} t = Object.getPrototypeOf; var c = [][n] ? t(t([][n]())) : (_regeneratorDefine2(t = {}, n, function () { return this; }), t), u = GeneratorFunctionPrototype.prototype = Generator.prototype = Object.create(c); function f(e) { return Object.setPrototypeOf ? Object.setPrototypeOf(e, GeneratorFunctionPrototype) : (e.__proto__ = GeneratorFunctionPrototype, _regeneratorDefine2(e, o, "GeneratorFunction")), e.prototype = Object.create(u), e; } return GeneratorFunction.prototype = GeneratorFunctionPrototype, _regeneratorDefine2(u, "constructor", GeneratorFunctionPrototype), _regeneratorDefine2(GeneratorFunctionPrototype, "constructor", GeneratorFunction), GeneratorFunction.displayName = "GeneratorFunction", _regeneratorDefine2(GeneratorFunctionPrototype, o, "GeneratorFunction"), _regeneratorDefine2(u), _regeneratorDefine2(u, o, "Generator"), _regeneratorDefine2(u, n, function () { return this; }), _regeneratorDefine2(u, "toString", function () { return "[object Generator]"; }), (_regenerator = function _regenerator() { return { w: i, m: f }; })(); }
14
+ function _regeneratorDefine2(e, r, n, t) { var i = Object.defineProperty; try { i({}, "", {}); } catch (e) { i = 0; } _regeneratorDefine2 = function _regeneratorDefine(e, r, n, t) { function o(r, n) { _regeneratorDefine2(e, r, function (e) { return this._invoke(r, n, e); }); } r ? i ? i(e, r, { value: n, enumerable: !t, configurable: !t, writable: !t }) : e[r] = n : (o("next", 0), o("throw", 1), o("return", 2)); }, _regeneratorDefine2(e, r, n, t); }
15
+ function _slicedToArray(r, e) { return _arrayWithHoles(r) || _iterableToArrayLimit(r, e) || _unsupportedIterableToArray(r, e) || _nonIterableRest(); }
16
+ function _nonIterableRest() { throw new TypeError("Invalid attempt to destructure non-iterable instance.\nIn order to be iterable, non-array objects must have a [Symbol.iterator]() method."); }
17
+ function _unsupportedIterableToArray(r, a) { if (r) { if ("string" == typeof r) return _arrayLikeToArray(r, a); var t = {}.toString.call(r).slice(8, -1); return "Object" === t && r.constructor && (t = r.constructor.name), "Map" === t || "Set" === t ? Array.from(r) : "Arguments" === t || /^(?:Ui|I)nt(?:8|16|32)(?:Clamped)?Array$/.test(t) ? _arrayLikeToArray(r, a) : void 0; } }
18
+ function _arrayLikeToArray(r, a) { (null == a || a > r.length) && (a = r.length); for (var e = 0, n = Array(a); e < a; e++) n[e] = r[e]; return n; }
19
+ function _iterableToArrayLimit(r, l) { var t = null == r ? null : "undefined" != typeof Symbol && r[Symbol.iterator] || r["@@iterator"]; if (null != t) { var e, n, i, u, a = [], f = !0, o = !1; try { if (i = (t = t.call(r)).next, 0 === l) { if (Object(t) !== t) return; f = !1; } else for (; !(f = (e = i.call(t)).done) && (a.push(e.value), a.length !== l); f = !0); } catch (r) { o = !0, n = r; } finally { try { if (!f && null != t["return"] && (u = t["return"](), Object(u) !== u)) return; } finally { if (o) throw n; } } return a; } }
20
+ function _arrayWithHoles(r) { if (Array.isArray(r)) return r; }
21
+ function _awaitAsyncGenerator(e) { return new _OverloadYield(e, 0); }
22
+ function _wrapAsyncGenerator(e) { return function () { return new AsyncGenerator(e.apply(this, arguments)); }; }
23
+ function AsyncGenerator(e) { var r, t; function resume(r, t) { try { var n = e[r](t), o = n.value, u = o instanceof _OverloadYield; Promise.resolve(u ? o.v : o).then(function (t) { if (u) { var i = "return" === r ? "return" : "next"; if (!o.k || t.done) return resume(i, t); t = e[i](t).value; } settle(n.done ? "return" : "normal", t); }, function (e) { resume("throw", e); }); } catch (e) { settle("throw", e); } } function settle(e, n) { switch (e) { case "return": r.resolve({ value: n, done: !0 }); break; case "throw": r.reject(n); break; default: r.resolve({ value: n, done: !1 }); } (r = r.next) ? resume(r.key, r.arg) : t = null; } this._invoke = function (e, n) { return new Promise(function (o, u) { var i = { key: e, arg: n, resolve: o, reject: u, next: null }; t ? t = t.next = i : (r = t = i, resume(e, n)); }); }, "function" != typeof e["return"] && (this["return"] = void 0); }
24
+ AsyncGenerator.prototype["function" == typeof Symbol && Symbol.asyncIterator || "@@asyncIterator"] = function () { return this; }, AsyncGenerator.prototype.next = function (e) { return this._invoke("next", e); }, AsyncGenerator.prototype["throw"] = function (e) { return this._invoke("throw", e); }, AsyncGenerator.prototype["return"] = function (e) { return this._invoke("return", e); };
25
+ function _OverloadYield(e, d) { this.v = e, this.k = d; }
26
+ import React, { useMemo, useState, useCallback, useRef, useEffect } from "react";
27
+ import PropTypes from "prop-types";
28
+ import { AssistantRuntimeProvider, useLocalRuntime, useThread, useThreadViewport } from "@assistant-ui/react";
29
+ import { useStreamApi } from "../../hooks/useStreamApi.js";
30
+ import useFetchApi from "../../hooks/useFetchApi.js";
31
+ import { ThreadContext } from "../../contexts/ThreadContext.js";
32
+ import { fetchAuthenticateApi } from "../../utils/api.js";
33
+ import { useSuggestions } from "../../contexts/SuggestionsContext.js";
34
+
35
+ /**
36
+ * Custom hook for fixing auto-scroll behavior in thread viewport
37
+ *
38
+ * @returns {Object} Object with autoScroll state and handleScroll function
39
+ */
40
+ export var useThreadAutoScrollFix = function useThreadAutoScrollFix() {
41
+ var isRunning = useThread(function (thread) {
42
+ return thread.isRunning;
43
+ });
44
+ var isAtBottom = useThreadViewport(function (thread) {
45
+ return thread.isAtBottom;
46
+ });
47
+ var _useState = useState(true),
48
+ _useState2 = _slicedToArray(_useState, 2),
49
+ autoScroll = _useState2[0],
50
+ setAutoScroll = _useState2[1];
51
+ var lastScrollTop = useRef(0);
52
+ useEffect(function () {
53
+ setAutoScroll(true);
54
+ }, [isRunning]);
55
+ useEffect(function () {
56
+ if (isRunning && isAtBottom) {
57
+ setAutoScroll(true);
58
+ }
59
+ }, [isRunning, isAtBottom]);
60
+ var handleScroll = function handleScroll(event) {
61
+ var target = event.target;
62
+ if (isRunning && lastScrollTop.current > target.scrollTop) {
63
+ setAutoScroll(false);
64
+ }
65
+ lastScrollTop.current = target.scrollTop;
66
+ };
67
+ return {
68
+ autoScroll: autoScroll,
69
+ handleScroll: handleScroll
70
+ };
71
+ };
72
+ var createStreamingModelAdapter = function createStreamingModelAdapter(_ref) {
73
+ var stream = _ref.stream,
74
+ threadId = _ref.threadId,
75
+ onSuggestions = _ref.onSuggestions,
76
+ _onStart = _ref.onStart,
77
+ clearSuggestions = _ref.clearSuggestions,
78
+ shop = _ref.shop;
79
+ return {
80
+ run: function run(_x) {
81
+ return _wrapAsyncGenerator(function (_ref2) {
82
+ var messages = _ref2.messages,
83
+ abortSignal = _ref2.abortSignal;
84
+ return /*#__PURE__*/_regenerator().m(function _callee() {
85
+ var _messages$findLast, content, textContent, accumulatedResponse, contentQueue, streamResolved, streamPromise, patch, _t;
86
+ return _regenerator().w(function (_context) {
87
+ while (1) switch (_context.p = _context.n) {
88
+ case 0:
89
+ _context.p = 0;
90
+ clearSuggestions();
91
+ if (!(!messages || !messages.length)) {
92
+ _context.n = 1;
93
+ break;
94
+ }
95
+ return _context.a(2, []);
96
+ case 1:
97
+ content = (_messages$findLast = messages.findLast(function (m) {
98
+ return m.role === "user";
99
+ })) === null || _messages$findLast === void 0 ? void 0 : _messages$findLast.content;
100
+ textContent = Array.isArray(content) ? content.map(function (item) {
101
+ return item.text;
102
+ }).join(" ") : content;
103
+ accumulatedResponse = "";
104
+ contentQueue = [];
105
+ streamResolved = false;
106
+ streamPromise = new Promise(function (resolve) {
107
+ stream({
108
+ method: "POST",
109
+ data: {
110
+ content: textContent,
111
+ chatId: threadId,
112
+ shopId: shop === null || shop === void 0 ? void 0 : shop.id
113
+ },
114
+ onSuggestions: onSuggestions,
115
+ onContent: function onContent(content) {
116
+ accumulatedResponse += content;
117
+ contentQueue.push({
118
+ content: [{
119
+ type: "text",
120
+ text: accumulatedResponse
121
+ }],
122
+ replace: false
123
+ });
124
+ },
125
+ onStart: function onStart(data) {
126
+ return _onStart(data);
127
+ },
128
+ onTool: function onTool(data) {
129
+ contentQueue.push({
130
+ content: [{
131
+ type: "text",
132
+ text: accumulatedResponse
133
+ }, {
134
+ type: "tool-call",
135
+ toolCallId: data === null || data === void 0 ? void 0 : data.toolCallId,
136
+ toolName: data === null || data === void 0 ? void 0 : data.toolName,
137
+ args: data === null || data === void 0 ? void 0 : data.args,
138
+ result: data === null || data === void 0 ? void 0 : data.result
139
+ }],
140
+ replace: true
141
+ });
142
+ },
143
+ abortSignal: abortSignal
144
+ }).then(function () {
145
+ streamResolved = true;
146
+ resolve();
147
+ });
148
+ });
149
+ case 2:
150
+ if (!(!streamResolved || contentQueue.length > 0)) {
151
+ _context.n = 6;
152
+ break;
153
+ }
154
+ if (!(contentQueue.length > 0)) {
155
+ _context.n = 4;
156
+ break;
157
+ }
158
+ patch = contentQueue.shift();
159
+ _context.n = 3;
160
+ return patch;
161
+ case 3:
162
+ _context.n = 5;
163
+ break;
164
+ case 4:
165
+ _context.n = 5;
166
+ return _awaitAsyncGenerator(new Promise(function (resolve) {
167
+ return setTimeout(resolve, 0);
168
+ }));
169
+ case 5:
170
+ _context.n = 2;
171
+ break;
172
+ case 6:
173
+ _context.n = 7;
174
+ return _awaitAsyncGenerator(streamPromise);
175
+ case 7:
176
+ _context.n = 10;
177
+ break;
178
+ case 8:
179
+ _context.p = 8;
180
+ _t = _context.v;
181
+ console.error("Error in StreamingModelAdapter:", _t);
182
+ _context.n = 9;
183
+ return {
184
+ content: [{
185
+ type: "text",
186
+ text: "Something went wrong"
187
+ }],
188
+ replace: false
189
+ };
190
+ case 9:
191
+ return _context.a(2);
192
+ case 10:
193
+ return _context.a(2);
194
+ }
195
+ }, _callee, null, [[0, 8]]);
196
+ })();
197
+ }).apply(this, arguments);
198
+ }
199
+ };
200
+ };
201
+
202
+ /**
203
+ * ThreadProvider - Provides thread management context and streaming runtime
204
+ *
205
+ * @param {React.ReactNode} children - Child components
206
+ * @param {Object} shop - Shop data object
207
+ * @param {string} apiUrl - API endpoint for streaming
208
+ * @returns {React.ReactElement} ThreadProvider component
209
+ */
210
+ var ThreadProvider = function ThreadProvider(_ref3) {
211
+ var children = _ref3.children,
212
+ shop = _ref3.shop,
213
+ apiUrl = _ref3.apiUrl;
214
+ var _useFetchApi = useFetchApi({
215
+ url: "/chats"
216
+ }),
217
+ _useFetchApi$data = _useFetchApi.data,
218
+ threads = _useFetchApi$data === void 0 ? [] : _useFetchApi$data,
219
+ loadingThreads = _useFetchApi.loading,
220
+ setThreads = _useFetchApi.setData;
221
+ var _useState3 = useState({}),
222
+ _useState4 = _slicedToArray(_useState3, 2),
223
+ thread = _useState4[0],
224
+ setThread = _useState4[1];
225
+ var _useState5 = useState(false),
226
+ _useState6 = _slicedToArray(_useState5, 2),
227
+ loadingMessages = _useState6[0],
228
+ setLoadingMessages = _useState6[1];
229
+ var _useStreamApi = useStreamApi(apiUrl),
230
+ stream = _useStreamApi.stream;
231
+ var _useSuggestions = useSuggestions(),
232
+ updateSuggestions = _useSuggestions.updateSuggestions,
233
+ clearSuggestions = _useSuggestions.clearSuggestions;
234
+ var onStart = useCallback(function (data) {
235
+ var currentChat = threads.find(function (chat) {
236
+ return chat.title === "Today";
237
+ });
238
+ setThread(data);
239
+ if (currentChat) {
240
+ setThreads(function (prev) {
241
+ return prev.map(function (chat) {
242
+ return chat.title === "Today" ? _objectSpread(_objectSpread({}, chat), {}, {
243
+ items: [data].concat(_toConsumableArray(chat.items))
244
+ }) : chat;
245
+ });
246
+ });
247
+ } else {
248
+ setThreads(function (prev) {
249
+ return [{
250
+ title: "Today",
251
+ items: [data]
252
+ }].concat(_toConsumableArray(prev));
253
+ });
254
+ }
255
+ }, [threads, setThreads]);
256
+ var onSuggestions = useCallback(function (suggestions) {
257
+ return updateSuggestions(suggestions);
258
+ }, [updateSuggestions]);
259
+ var modelAdapter = useMemo(function () {
260
+ return createStreamingModelAdapter({
261
+ stream: stream,
262
+ threadId: "id" in thread ? thread.id : undefined,
263
+ onSuggestions: onSuggestions,
264
+ onStart: onStart,
265
+ clearSuggestions: clearSuggestions,
266
+ shop: shop
267
+ });
268
+ }, [onSuggestions, stream, thread, onStart, clearSuggestions, shop]);
269
+ var runtime = useLocalRuntime(modelAdapter);
270
+ var getThread = useCallback(/*#__PURE__*/function () {
271
+ var _ref4 = _asyncToGenerator(/*#__PURE__*/_regenerator().m(function _callee2(id) {
272
+ var _response$data, response, _t2;
273
+ return _regenerator().w(function (_context2) {
274
+ while (1) switch (_context2.p = _context2.n) {
275
+ case 0:
276
+ if (id) {
277
+ _context2.n = 1;
278
+ break;
279
+ }
280
+ return _context2.a(2);
281
+ case 1:
282
+ _context2.p = 1;
283
+ clearSuggestions();
284
+ setLoadingMessages(true);
285
+ _context2.n = 2;
286
+ return fetchAuthenticateApi({
287
+ uri: "/chat/".concat(id),
288
+ options: {},
289
+ clientConfig: {
290
+ baseURL: "/api"
291
+ }
292
+ });
293
+ case 2:
294
+ response = _context2.v;
295
+ runtime.reset({
296
+ initialMessages: (response === null || response === void 0 || (_response$data = response.data) === null || _response$data === void 0 ? void 0 : _response$data.messages) || []
297
+ });
298
+ _context2.n = 4;
299
+ break;
300
+ case 3:
301
+ _context2.p = 3;
302
+ _t2 = _context2.v;
303
+ console.error("Failed to fetch initial messages:", _t2);
304
+ case 4:
305
+ _context2.p = 4;
306
+ setLoadingMessages(false);
307
+ return _context2.f(4);
308
+ case 5:
309
+ return _context2.a(2);
310
+ }
311
+ }, _callee2, null, [[1, 3, 4, 5]]);
312
+ }));
313
+ return function (_x2) {
314
+ return _ref4.apply(this, arguments);
315
+ };
316
+ }(), [runtime, clearSuggestions]);
317
+ var updateThread = useCallback(/*#__PURE__*/function () {
318
+ var _ref6 = _asyncToGenerator(/*#__PURE__*/_regenerator().m(function _callee3(_ref5) {
319
+ var id, title, _t3;
320
+ return _regenerator().w(function (_context3) {
321
+ while (1) switch (_context3.p = _context3.n) {
322
+ case 0:
323
+ id = _ref5.id, title = _ref5.title;
324
+ _context3.p = 1;
325
+ if (id) {
326
+ _context3.n = 2;
327
+ break;
328
+ }
329
+ return _context3.a(2);
330
+ case 2:
331
+ setThreads(function (prev) {
332
+ var matchingThread = prev.some(function (chat) {
333
+ return chat.items.some(function (item) {
334
+ return item.id === id;
335
+ });
336
+ });
337
+ if (matchingThread) {
338
+ return prev.map(function (chat) {
339
+ return _objectSpread(_objectSpread({}, chat), {}, {
340
+ items: chat.items.map(function (item) {
341
+ return item.id === id ? {
342
+ id: id,
343
+ title: title
344
+ } : item;
345
+ })
346
+ });
347
+ });
348
+ }
349
+ return prev;
350
+ });
351
+ if ("id" in thread && thread.id === id) {
352
+ setThread({
353
+ id: id,
354
+ title: title
355
+ });
356
+ }
357
+ _context3.n = 3;
358
+ return fetchAuthenticateApi({
359
+ uri: "/chat/".concat(id),
360
+ options: {
361
+ method: "PUT",
362
+ body: {
363
+ title: title
364
+ }
365
+ },
366
+ clientConfig: {
367
+ baseURL: "/api"
368
+ }
369
+ });
370
+ case 3:
371
+ _context3.n = 5;
372
+ break;
373
+ case 4:
374
+ _context3.p = 4;
375
+ _t3 = _context3.v;
376
+ console.error("Failed to update thread:", _t3);
377
+ case 5:
378
+ return _context3.a(2);
379
+ }
380
+ }, _callee3, null, [[1, 4]]);
381
+ }));
382
+ return function (_x3) {
383
+ return _ref6.apply(this, arguments);
384
+ };
385
+ }(), [thread, setThreads]);
386
+ var deleteThread = useCallback(/*#__PURE__*/function () {
387
+ var _ref7 = _asyncToGenerator(/*#__PURE__*/_regenerator().m(function _callee4(id) {
388
+ var _t4;
389
+ return _regenerator().w(function (_context4) {
390
+ while (1) switch (_context4.p = _context4.n) {
391
+ case 0:
392
+ if (id) {
393
+ _context4.n = 1;
394
+ break;
395
+ }
396
+ return _context4.a(2);
397
+ case 1:
398
+ _context4.p = 1;
399
+ setThreads(function (prev) {
400
+ var matchingThread = prev.some(function (chat) {
401
+ return chat.items.some(function (item) {
402
+ return item.id === id;
403
+ });
404
+ });
405
+ if (matchingThread) {
406
+ return prev.map(function (chat) {
407
+ return _objectSpread(_objectSpread({}, chat), {}, {
408
+ items: chat.items.filter(function (item) {
409
+ return item.id !== id;
410
+ })
411
+ });
412
+ });
413
+ }
414
+ return prev;
415
+ });
416
+ _context4.n = 2;
417
+ return fetchAuthenticateApi({
418
+ uri: "/chat/".concat(id),
419
+ options: {
420
+ method: "DELETE"
421
+ },
422
+ clientConfig: {
423
+ baseURL: "/api"
424
+ }
425
+ });
426
+ case 2:
427
+ if ("id" in thread && thread.id === id) {
428
+ setThread({});
429
+ runtime.reset({
430
+ initialMessages: []
431
+ });
432
+ clearSuggestions();
433
+ }
434
+ _context4.n = 4;
435
+ break;
436
+ case 3:
437
+ _context4.p = 3;
438
+ _t4 = _context4.v;
439
+ console.error("Failed to delete thread:", _t4);
440
+ case 4:
441
+ return _context4.a(2);
442
+ }
443
+ }, _callee4, null, [[1, 3]]);
444
+ }));
445
+ return function (_x4) {
446
+ return _ref7.apply(this, arguments);
447
+ };
448
+ }(), [thread, runtime, clearSuggestions, setThreads]);
449
+ var resetThread = useCallback(function () {
450
+ setThread({});
451
+ runtime.reset({
452
+ initialMessages: []
453
+ });
454
+ clearSuggestions();
455
+ }, [runtime, clearSuggestions]);
456
+ var contextValue = useMemo(function () {
457
+ return {
458
+ threads: threads || [],
459
+ loadingThreads: loadingThreads,
460
+ loadingMessages: loadingMessages,
461
+ getThread: getThread,
462
+ thread: thread,
463
+ setThread: setThread,
464
+ resetThread: resetThread,
465
+ deleteThread: deleteThread,
466
+ updateThread: updateThread
467
+ };
468
+ }, [threads, loadingThreads, loadingMessages, getThread, thread, setThread, resetThread, deleteThread, updateThread]);
469
+ return /*#__PURE__*/React.createElement(ThreadContext.Provider, {
470
+ value: contextValue
471
+ }, /*#__PURE__*/React.createElement(AssistantRuntimeProvider, {
472
+ runtime: runtime
473
+ }, children));
474
+ };
475
+ ThreadProvider.propTypes = {
476
+ children: PropTypes.node.isRequired,
477
+ shop: PropTypes.shape({
478
+ id: PropTypes.string
479
+ }),
480
+ apiUrl: PropTypes.string
481
+ };
482
+ export default ThreadProvider;
@@ -0,0 +1,41 @@
1
+ import React from "react";
2
+ import { Card, BlockStack, InlineStack, Text, Button } from "@shopify/polaris";
3
+ export var TalkToHumanCard = function TalkToHumanCard(_ref) {
4
+ var result = _ref.result;
5
+ if (!result) return null;
6
+ var _ref2 = result || {},
7
+ summary = _ref2.summary,
8
+ userMessage = _ref2.userMessage;
9
+ var handleContactSupport = function handleContactSupport() {
10
+ if (window.$crisp) {
11
+ window.$crisp.push(["do", "chat:open"]);
12
+ if (userMessage) {
13
+ window.$crisp.push(["set", "message:text", [userMessage]]);
14
+ }
15
+ }
16
+ };
17
+ return /*#__PURE__*/React.createElement(Card, null, /*#__PURE__*/React.createElement(BlockStack, {
18
+ gap: "300"
19
+ }, /*#__PURE__*/React.createElement(InlineStack, {
20
+ align: "start",
21
+ gap: "200"
22
+ }, /*#__PURE__*/React.createElement(Text, {
23
+ as: "span"
24
+ }, "\uD83D\uDE4B"), /*#__PURE__*/React.createElement(Text, {
25
+ as: "span",
26
+ variant: "bodyMd",
27
+ fontWeight: "medium"
28
+ }, "Need human support?")), /*#__PURE__*/React.createElement(Text, {
29
+ as: "p",
30
+ variant: "bodySm",
31
+ tone: "subdued"
32
+ }, summary || "Our support team can help with your request"), userMessage && /*#__PURE__*/React.createElement(Text, {
33
+ as: "p",
34
+ variant: "bodySm",
35
+ tone: "subdued"
36
+ }, "Message: \"", userMessage, "\""), /*#__PURE__*/React.createElement(Button, {
37
+ onClick: handleContactSupport,
38
+ variant: "secondary",
39
+ size: "slim"
40
+ }, "Contact Support")));
41
+ };
@@ -0,0 +1,20 @@
1
+ import React from "react";
2
+ import { TalkToHumanCard } from "./CardTool.js";
3
+ var ToolResult = function ToolResult(_ref) {
4
+ var toolName = _ref.toolName,
5
+ args = _ref.args,
6
+ result = _ref.result;
7
+ switch (toolName) {
8
+ case "talk_to_human":
9
+ return /*#__PURE__*/React.createElement(TalkToHumanCard, {
10
+ result: result
11
+ });
12
+ case "get_shop_info":
13
+ return /*#__PURE__*/React.createElement("div", null, "Get shop info");
14
+ case "get_plan_info":
15
+ return /*#__PURE__*/React.createElement("div", null, "Get plan info");
16
+ default:
17
+ return /*#__PURE__*/React.createElement("div", null, "ToolResult");
18
+ }
19
+ };
20
+ export default ToolResult;