@blocklet/pages-kit 0.2.312 → 0.2.313

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 (41) hide show
  1. package/lib/cjs/builtin/async/ai-runtime/api/session.js +10 -1
  2. package/lib/cjs/builtin/async/ai-runtime/components/PopperMenuButton/LoadingMenuItem.js +49 -0
  3. package/lib/cjs/builtin/async/ai-runtime/components/PopperMenuButton/index.js +68 -0
  4. package/lib/cjs/builtin/async/ai-runtime/locales/index.js +1 -1
  5. package/lib/cjs/builtin/async/ai-runtime/runtime/ChatBotButton/index.js +21 -4
  6. package/lib/cjs/builtin/async/ai-runtime/runtime/Runtime/index.js +22 -33
  7. package/lib/cjs/builtin/async/ai-runtime/runtime-components/AutoForm/index.js +2 -2
  8. package/lib/cjs/builtin/async/ai-runtime/runtime-components/MultiAgentsChat/index.js +6 -5
  9. package/lib/cjs/builtin/async/ai-runtime/runtime-components/PhotoGallery/index.js +6 -5
  10. package/lib/cjs/builtin/async/ai-runtime/runtime-components/SimpleChat/index.js +39 -14
  11. package/lib/cjs/builtin/async/ai-runtime/runtime-components/SimplePage/index.js +2 -2
  12. package/lib/cjs/builtin/async/ai-runtime/runtime-components/V0/Input.js +2 -2
  13. package/lib/cjs/builtin/async/ai-runtime/runtime-components/V0/Page.js +2 -3
  14. package/lib/cjs/builtin/async/ai-runtime/state/session.js +217 -79
  15. package/lib/cjs/builtin/page/header.js +45 -3
  16. package/lib/cjs/tsconfig.tsbuildinfo +1 -1
  17. package/lib/esm/builtin/async/ai-runtime/api/session.js +8 -0
  18. package/lib/esm/builtin/async/ai-runtime/components/PopperMenuButton/LoadingMenuItem.js +46 -0
  19. package/lib/esm/builtin/async/ai-runtime/components/PopperMenuButton/index.js +42 -0
  20. package/lib/esm/builtin/async/ai-runtime/locales/index.js +1 -1
  21. package/lib/esm/builtin/async/ai-runtime/runtime/ChatBotButton/index.js +23 -6
  22. package/lib/esm/builtin/async/ai-runtime/runtime/Runtime/index.js +23 -34
  23. package/lib/esm/builtin/async/ai-runtime/runtime-components/AutoForm/index.js +3 -3
  24. package/lib/esm/builtin/async/ai-runtime/runtime-components/MultiAgentsChat/index.js +7 -6
  25. package/lib/esm/builtin/async/ai-runtime/runtime-components/PhotoGallery/index.js +7 -6
  26. package/lib/esm/builtin/async/ai-runtime/runtime-components/SimpleChat/index.js +35 -10
  27. package/lib/esm/builtin/async/ai-runtime/runtime-components/SimplePage/index.js +3 -3
  28. package/lib/esm/builtin/async/ai-runtime/runtime-components/V0/Input.js +3 -3
  29. package/lib/esm/builtin/async/ai-runtime/runtime-components/V0/Page.js +3 -4
  30. package/lib/esm/builtin/async/ai-runtime/state/session.js +215 -79
  31. package/lib/esm/builtin/page/header.js +42 -1
  32. package/lib/esm/tsconfig.tsbuildinfo +1 -1
  33. package/lib/types/builtin/async/ai-runtime/api/session.d.ts +3 -0
  34. package/lib/types/builtin/async/ai-runtime/components/PopperMenuButton/LoadingMenuItem.d.ts +5 -0
  35. package/lib/types/builtin/async/ai-runtime/components/PopperMenuButton/index.d.ts +6 -0
  36. package/lib/types/builtin/async/ai-runtime/runtime-components/SimpleChat/index.d.ts +2 -1
  37. package/lib/types/builtin/async/ai-runtime/state/runtime.d.ts +1 -0
  38. package/lib/types/builtin/async/ai-runtime/state/session.d.ts +27 -6
  39. package/lib/types/builtin/page/header.d.ts +13 -0
  40. package/lib/types/tsconfig.tsbuildinfo +1 -1
  41. package/package.json +4 -3
@@ -14,12 +14,23 @@ var __asyncValues = (this && this.__asyncValues) || function (o) {
14
14
  function verb(n) { i[n] = o[n] && function (v) { return new Promise(function (resolve, reject) { v = o[n](v), settle(resolve, reject, v.done, v.value); }); }; }
15
15
  function settle(resolve, reject, d, v) { Promise.resolve(v).then(function(v) { resolve({ value: v, done: d }); }, reject); }
16
16
  };
17
+ var __rest = (this && this.__rest) || function (s, e) {
18
+ var t = {};
19
+ for (var p in s) if (Object.prototype.hasOwnProperty.call(s, p) && e.indexOf(p) < 0)
20
+ t[p] = s[p];
21
+ if (s != null && typeof Object.getOwnPropertySymbols === "function")
22
+ for (var i = 0, p = Object.getOwnPropertySymbols(s); i < p.length; i++) {
23
+ if (e.indexOf(p[i]) < 0 && Object.prototype.propertyIsEnumerable.call(s, p[i]))
24
+ t[p[i]] = s[p[i]];
25
+ }
26
+ return t;
27
+ };
17
28
  import { parseIdentity } from '@blocklet/ai-runtime/common/aid';
18
29
  import { useEffect, useMemo } from 'react';
19
30
  import { create } from 'zustand';
20
31
  import { immer } from 'zustand/middleware/immer';
21
32
  import { getMessages } from '../api/message';
22
- import { createSession, getSessions, runAgent } from '../api/session';
33
+ import { clearSession, createSession, deleteSession, getSessions, runAgent } from '../api/session';
23
34
  import { useRuntimeContext } from '../contexts/Runtime';
24
35
  import { createCachedStore } from '../utils/zustand';
25
36
  const GET_MESSAGES_LIMIT = 100;
@@ -30,88 +41,190 @@ export const createSessionState = ({ aid }) => {
30
41
  set((state) => {
31
42
  state.loading = undefined;
32
43
  state.loaded = undefined;
33
- state.running = undefined;
34
- state.session = undefined;
35
- state.messages = undefined;
36
- state.noMoreMessage = undefined;
37
- state.messageLoading = undefined;
38
- state.error = undefined;
44
+ state.sessions = undefined;
45
+ state.sessionMap = undefined;
46
+ state.currentSessionId = undefined;
39
47
  });
40
48
  },
41
49
  load: () => __awaiter(void 0, void 0, void 0, function* () {
42
- var _a;
43
- set((state) => {
44
- state.loading = true;
45
- });
46
- try {
47
- const { sessions } = yield getSessions({ aid });
48
- const session = (_a = sessions[0]) !== null && _a !== void 0 ? _a : (yield createSession({ aid })).created;
49
- const { messages } = yield getMessages({
50
- sessionId: session.id,
51
- orderDirection: GET_MESSAGES_ORDER_DIRECTION,
52
- limit: GET_MESSAGES_LIMIT,
53
- });
50
+ const { loading, loaded } = get();
51
+ if (!loading && !loaded) {
54
52
  set((state) => {
55
- state.session = session;
56
- state.messages = messages.toReversed();
57
- state.noMoreMessage = messages.length < GET_MESSAGES_LIMIT;
53
+ state.loading = true;
58
54
  });
55
+ try {
56
+ const { sessions } = yield getSessions({ aid });
57
+ set((state) => {
58
+ var _a;
59
+ state.sessions = sessions;
60
+ state.currentSessionId = (_a = sessions[0]) === null || _a === void 0 ? void 0 : _a.id;
61
+ state.sessionMap = Object.fromEntries(sessions.map((i) => [i.id, { session: i }]));
62
+ });
63
+ }
64
+ catch (error) {
65
+ set((state) => {
66
+ state.error = error;
67
+ });
68
+ throw error;
69
+ }
70
+ finally {
71
+ set((state) => {
72
+ state.loading = false;
73
+ state.loaded = true;
74
+ });
75
+ }
59
76
  }
60
- catch (error) {
61
- set((state) => {
62
- state.error = error;
63
- });
64
- throw error;
65
- }
66
- finally {
67
- set((state) => {
68
- state.loaded = true;
69
- state.loading = false;
70
- });
77
+ const { sessionMap, currentSessionId: sessionId } = get();
78
+ const s = sessionMap === null || sessionMap === void 0 ? void 0 : sessionMap[sessionId];
79
+ if (!s || !sessionId)
80
+ return;
81
+ if (!s.loading && !s.loaded) {
82
+ try {
83
+ set((state) => {
84
+ var _a;
85
+ const s = (_a = state.sessionMap) === null || _a === void 0 ? void 0 : _a[state.currentSessionId];
86
+ if (!s)
87
+ return;
88
+ s.loading = true;
89
+ });
90
+ const { messages } = yield getMessages({
91
+ sessionId,
92
+ orderDirection: GET_MESSAGES_ORDER_DIRECTION,
93
+ limit: GET_MESSAGES_LIMIT,
94
+ });
95
+ set((state) => {
96
+ var _a;
97
+ const s = (_a = state.sessionMap) === null || _a === void 0 ? void 0 : _a[state.currentSessionId];
98
+ if (!s)
99
+ return;
100
+ s.messages = messages.toReversed();
101
+ s.noMoreMessage = messages.length < GET_MESSAGES_LIMIT;
102
+ });
103
+ }
104
+ catch (error) {
105
+ set((state) => {
106
+ var _a;
107
+ const s = (_a = state.sessionMap) === null || _a === void 0 ? void 0 : _a[state.currentSessionId];
108
+ if (!s)
109
+ return;
110
+ s.error = error;
111
+ });
112
+ throw error;
113
+ }
114
+ finally {
115
+ set((state) => {
116
+ var _a;
117
+ const s = (_a = state.sessionMap) === null || _a === void 0 ? void 0 : _a[state.currentSessionId];
118
+ if (!s)
119
+ return;
120
+ s.loaded = true;
121
+ s.loading = false;
122
+ });
123
+ }
71
124
  }
72
125
  }),
73
- loadMoreMessages: () => __awaiter(void 0, void 0, void 0, function* () {
74
- var _b;
126
+ setCurrentSessionId: (sessionId) => {
75
127
  set((state) => {
76
- state.messageLoading = true;
128
+ state.currentSessionId = sessionId;
77
129
  });
78
- const { session, messages } = get();
79
- if (!session)
130
+ },
131
+ createSession: () => __awaiter(void 0, void 0, void 0, function* () {
132
+ const { created, sessions } = yield createSession({ aid });
133
+ set((state) => {
134
+ state.sessions = sessions;
135
+ state.currentSessionId = created.id;
136
+ state.sessionMap = Object.fromEntries(sessions.map((i) => {
137
+ var _a;
138
+ return [
139
+ i.id,
140
+ Object.assign(Object.assign(Object.assign({}, (_a = state.sessionMap) === null || _a === void 0 ? void 0 : _a[i.id]), { session: i }), (i.id === created.id ? { messages: [], loaded: true } : {})),
141
+ ];
142
+ }));
143
+ });
144
+ return created;
145
+ }),
146
+ deleteSession: (...args_1) => __awaiter(void 0, [...args_1], void 0, function* (args = {}) {
147
+ const sessionId = args.sessionId || get().currentSessionId;
148
+ if (!sessionId)
149
+ return;
150
+ const { sessions } = yield deleteSession({ sessionId });
151
+ set((state) => {
152
+ var _a;
153
+ state.sessions = sessions;
154
+ if (!sessions.some((i) => i.id === state.currentSessionId))
155
+ state.currentSessionId = (_a = sessions[0]) === null || _a === void 0 ? void 0 : _a.id;
156
+ });
157
+ }),
158
+ clearSession: (...args_2) => __awaiter(void 0, [...args_2], void 0, function* (args = {}) {
159
+ const sessionId = args.sessionId || get().currentSessionId;
160
+ if (!sessionId)
161
+ return;
162
+ yield clearSession({ sessionId });
163
+ set((state) => {
164
+ var _a;
165
+ const s = (_a = state.sessionMap) === null || _a === void 0 ? void 0 : _a[sessionId];
166
+ if (!s)
167
+ return;
168
+ s.messages = undefined;
169
+ s.noMoreMessage = undefined;
170
+ s.messageLoading = undefined;
171
+ });
172
+ }),
173
+ loadMoreMessages: (...args_3) => __awaiter(void 0, [...args_3], void 0, function* (args = {}) {
174
+ var _a, _b;
175
+ const sessionId = args.sessionId || get().currentSessionId;
176
+ if (!sessionId)
177
+ return;
178
+ set((state) => {
179
+ var _a;
180
+ const s = (_a = state.sessionMap) === null || _a === void 0 ? void 0 : _a[sessionId];
181
+ if (!s)
182
+ return;
183
+ s.messageLoading = true;
184
+ });
185
+ const { sessionMap } = get();
186
+ const s = sessionMap === null || sessionMap === void 0 ? void 0 : sessionMap[sessionId];
187
+ if (!s)
80
188
  return;
81
189
  try {
82
190
  const result = yield getMessages({
83
- sessionId: session.id,
84
- before: (_b = messages === null || messages === void 0 ? void 0 : messages.slice(-1)[0]) === null || _b === void 0 ? void 0 : _b.id,
191
+ sessionId: s.session.id,
192
+ before: (_b = (_a = s.messages) === null || _a === void 0 ? void 0 : _a.slice(-1)[0]) === null || _b === void 0 ? void 0 : _b.id,
85
193
  orderDirection: GET_MESSAGES_ORDER_DIRECTION,
86
194
  limit: GET_MESSAGES_LIMIT,
87
195
  });
88
196
  set((state) => {
89
- var _a;
90
- state.messages = ((_a = state.messages) !== null && _a !== void 0 ? _a : []).concat(result.messages.toReversed());
91
- state.noMoreMessage = result.messages.length < GET_MESSAGES_LIMIT;
197
+ var _a, _b;
198
+ const s = (_a = state.sessionMap) === null || _a === void 0 ? void 0 : _a[sessionId];
199
+ if (!s)
200
+ return;
201
+ s.messages = ((_b = s.messages) !== null && _b !== void 0 ? _b : []).concat(result.messages.toReversed());
202
+ s.noMoreMessage = result.messages.length < GET_MESSAGES_LIMIT;
92
203
  });
93
204
  }
94
205
  finally {
95
206
  set((state) => {
96
- state.messageLoading = false;
207
+ var _a;
208
+ const s = (_a = state.sessionMap) === null || _a === void 0 ? void 0 : _a[sessionId];
209
+ if (!s)
210
+ return;
211
+ s.messageLoading = false;
97
212
  });
98
213
  }
99
214
  }),
100
- execute: (_c) => __awaiter(void 0, [_c], void 0, function* ({ aid, working, parameters, onResponseStart, }) {
215
+ execute: (_c) => __awaiter(void 0, void 0, void 0, function* () {
101
216
  var _d, e_1, _e, _f;
102
- let { session } = get();
103
- if (!session) {
104
- yield get().load();
105
- session = get().session;
106
- }
107
- if (!session)
108
- throw new Error('This session is not initialized');
109
- const { id: sessionId } = session;
217
+ var { aid, working, parameters, onResponseStart } = _c, args = __rest(_c, ["aid", "working", "parameters", "onResponseStart"]);
218
+ const sessionId = args.sessionId || get().currentSessionId || (yield get().createSession()).id;
110
219
  const identity = parseIdentity(aid, { rejectWhenError: true });
111
220
  let message;
112
221
  set((state) => {
113
- state.running = true;
114
- state.error = undefined;
222
+ var _a;
223
+ const s = (_a = state.sessionMap) === null || _a === void 0 ? void 0 : _a[sessionId];
224
+ if (!s)
225
+ return;
226
+ s.running = true;
227
+ s.error = undefined;
115
228
  });
116
229
  try {
117
230
  const stream = runAgent({
@@ -142,26 +255,32 @@ export const createSessionState = ({ aid }) => {
142
255
  loading: true,
143
256
  };
144
257
  set((state) => {
145
- var _a;
146
- (_a = state.messages) !== null && _a !== void 0 ? _a : (state.messages = []);
147
- state.messages.push(message);
258
+ var _a, _b;
259
+ const s = (_a = state.sessionMap) === null || _a === void 0 ? void 0 : _a[sessionId];
260
+ if (!s)
261
+ return;
262
+ (_b = s.messages) !== null && _b !== void 0 ? _b : (s.messages = []);
263
+ s.messages.push(message);
148
264
  });
149
265
  }
150
266
  if (message.taskId === value.taskId) {
151
267
  requestAnimationFrame(() => {
152
268
  set((state) => {
153
- var _a, _b, _c, _d, _e, _f;
154
- var _g;
155
- const msg = (_a = state.messages) === null || _a === void 0 ? void 0 : _a.findLast((i) => i.taskId === message.taskId);
269
+ var _a, _b, _c, _d, _e, _f, _g;
270
+ var _h;
271
+ const s = (_a = state.sessionMap) === null || _a === void 0 ? void 0 : _a[sessionId];
272
+ if (!s)
273
+ return;
274
+ const msg = (_b = s.messages) === null || _b === void 0 ? void 0 : _b.findLast((i) => i.taskId === message.taskId);
156
275
  if (!msg)
157
276
  return;
158
- (_b = msg.result) !== null && _b !== void 0 ? _b : (msg.result = {});
277
+ (_c = msg.result) !== null && _c !== void 0 ? _c : (msg.result = {});
159
278
  msg.result.content = (msg.result.content || '') + (value.delta.content || '');
160
- if ((_d = (_c = value.delta) === null || _c === void 0 ? void 0 : _c.images) === null || _d === void 0 ? void 0 : _d.length) {
161
- msg.result.images = ((_e = msg.result.images) !== null && _e !== void 0 ? _e : []).concat(value.delta.images);
279
+ if ((_e = (_d = value.delta) === null || _d === void 0 ? void 0 : _d.images) === null || _e === void 0 ? void 0 : _e.length) {
280
+ msg.result.images = ((_f = msg.result.images) !== null && _f !== void 0 ? _f : []).concat(value.delta.images);
162
281
  }
163
282
  if (value.delta.object) {
164
- (_f = (_g = msg.result).objects) !== null && _f !== void 0 ? _f : (_g.objects = []);
283
+ (_g = (_h = msg.result).objects) !== null && _g !== void 0 ? _g : (_h.objects = []);
165
284
  msg.result.objects.push({ taskId: value.taskId, data: value.delta.object });
166
285
  }
167
286
  });
@@ -170,8 +289,11 @@ export const createSessionState = ({ aid }) => {
170
289
  }
171
290
  if ((value === null || value === void 0 ? void 0 : value.type) === 'ERROR') {
172
291
  set((state) => {
173
- var _a;
174
- const msg = (_a = state.messages) === null || _a === void 0 ? void 0 : _a.findLast((i) => i.taskId === message.taskId);
292
+ var _a, _b;
293
+ const s = (_a = state.sessionMap) === null || _a === void 0 ? void 0 : _a[sessionId];
294
+ if (!s)
295
+ return;
296
+ const msg = (_b = s.messages) === null || _b === void 0 ? void 0 : _b.findLast((i) => i.taskId === message.taskId);
175
297
  if (msg)
176
298
  msg.error = value.error;
177
299
  else
@@ -190,15 +312,22 @@ export const createSessionState = ({ aid }) => {
190
312
  }
191
313
  catch (error) {
192
314
  set((state) => {
193
- state.error = error;
315
+ var _a;
316
+ const s = (_a = state.sessionMap) === null || _a === void 0 ? void 0 : _a[sessionId];
317
+ if (!s)
318
+ return;
319
+ s.error = error;
194
320
  });
195
321
  }
196
322
  finally {
197
323
  set((state) => {
198
- var _a;
199
- state.running = false;
324
+ var _a, _b;
325
+ const s = (_a = state.sessionMap) === null || _a === void 0 ? void 0 : _a[sessionId];
326
+ if (!s)
327
+ return;
328
+ s.running = false;
200
329
  if (message) {
201
- const msg = (_a = state.messages) === null || _a === void 0 ? void 0 : _a.findLast((i) => i.taskId === message.taskId);
330
+ const msg = (_b = s.messages) === null || _b === void 0 ? void 0 : _b.findLast((i) => i.taskId === message.taskId);
202
331
  if (msg)
203
332
  msg.loading = false;
204
333
  }
@@ -207,15 +336,22 @@ export const createSessionState = ({ aid }) => {
207
336
  }),
208
337
  }))));
209
338
  };
210
- export function useSessionState({ autoLoad } = {}) {
339
+ export function useAutoLoadSessionState() {
211
340
  const { aid } = useRuntimeContext();
212
341
  const state = useMemo(() => createSessionState({ aid }), [aid]);
342
+ const currentSessionId = state((s) => s.currentSessionId);
213
343
  useEffect(() => {
214
- if (!autoLoad)
215
- return;
216
- const { loading, loaded, load } = state.getState();
217
- if (!loading && !loaded)
218
- load();
219
- }, [state, autoLoad]);
220
- return state;
344
+ state.getState().load();
345
+ }, [state, currentSessionId]);
346
+ }
347
+ export function useSessionState(selector) {
348
+ const { aid } = useRuntimeContext();
349
+ return useMemo(() => createSessionState({ aid }), [aid])(selector);
350
+ }
351
+ export function useCurrentSessionState(selector) {
352
+ return useSessionState((state) => {
353
+ var _a;
354
+ const s = (_a = state.sessionMap) === null || _a === void 0 ? void 0 : _a[state.currentSessionId];
355
+ return selector(s);
356
+ });
221
357
  }
@@ -1,3 +1,44 @@
1
+ import { enableMapSet } from 'immer';
2
+ import { useEffect } from 'react';
1
3
  import { create } from 'zustand';
2
4
  import { immer } from 'zustand/middleware/immer';
3
- export const useHeaderState = create()(immer(() => ({})));
5
+ enableMapSet();
6
+ export const useHeaderState = create()(immer((set, get) => ({
7
+ stack: new Set(),
8
+ add: (creator) => {
9
+ set((state) => {
10
+ state.stack.add(creator);
11
+ });
12
+ get().refresh();
13
+ },
14
+ delete: (creator) => {
15
+ set((state) => {
16
+ state.stack.delete(creator);
17
+ });
18
+ get().refresh();
19
+ },
20
+ refresh: () => {
21
+ const widgets = [];
22
+ for (const i of get().stack) {
23
+ widgets.push(i());
24
+ }
25
+ const r = widgets.reduce((res, i) => (Object.assign(Object.assign(Object.assign({}, res), i), { addons: (...exists) => {
26
+ var _a, _b, _c, _d;
27
+ const a = (_b = (_a = res.addons) === null || _a === void 0 ? void 0 : _a.call(res, ...exists)) !== null && _b !== void 0 ? _b : exists;
28
+ const b = (_d = (_c = i.addons) === null || _c === void 0 ? void 0 : _c.call(i, ...a)) !== null && _d !== void 0 ? _d : a;
29
+ return b;
30
+ } })), {});
31
+ set((state) => {
32
+ state.logo = r.logo;
33
+ state.description = r.description;
34
+ state.brand = r.brand;
35
+ state.addons = r.addons;
36
+ });
37
+ },
38
+ })));
39
+ export function useHeader(creator, deps) {
40
+ useEffect(() => {
41
+ useHeaderState.getState().add(creator);
42
+ return () => useHeaderState.getState().delete(creator);
43
+ }, deps);
44
+ }