@helpai/elements 0.46.1 → 0.46.3
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/elements-web-component.esm.js +18 -18
- package/elements-web-component.esm.js.map +3 -3
- package/elements.cjs.js +18 -18
- package/elements.cjs.js.map +3 -3
- package/elements.esm.js +18 -18
- package/elements.esm.js.map +3 -3
- package/elements.js +18 -18
- package/elements.js.map +3 -3
- package/index.d.ts +1 -1
- package/index.mjs +25 -8
- package/package.json +1 -1
- package/schema.d.ts +26 -26
- package/web-component.mjs +25 -8
package/index.d.ts
CHANGED
|
@@ -1,4 +1,4 @@
|
|
|
1
|
-
export { A as Asset, B as BlocksConfig, C as ConnectionConfig, a as ConnectionConfigPartial, H as HandshakeResponse, L as Link, S as ServerConfig, b as SiteConfig, W as WidgetConfig, c as WidgetConfigPartial, d as WidgetSettings, e as WidgetSettingsPartial } from './deployment-
|
|
1
|
+
export { A as Asset, B as BlocksConfig, C as ConnectionConfig, a as ConnectionConfigPartial, H as HandshakeResponse, L as Link, S as ServerConfig, b as SiteConfig, W as WidgetConfig, c as WidgetConfigPartial, d as WidgetSettings, e as WidgetSettingsPartial } from './deployment-oSJ2nv2G.js';
|
|
2
2
|
import 'zod';
|
|
3
3
|
|
|
4
4
|
/**
|
package/index.mjs
CHANGED
|
@@ -30,7 +30,7 @@ var BRAND = {
|
|
|
30
30
|
};
|
|
31
31
|
|
|
32
32
|
// src/core/version.ts
|
|
33
|
-
var ELEMENTS_VERSION = true ? "0.46.
|
|
33
|
+
var ELEMENTS_VERSION = true ? "0.46.3" : "0.0.0-dev";
|
|
34
34
|
var ELEMENTS_VERSION_PARAM = "_ev";
|
|
35
35
|
|
|
36
36
|
// src/i18n/strings.ts
|
|
@@ -1653,7 +1653,10 @@ var DEFAULT_PATHS = {
|
|
|
1653
1653
|
var CONTEXT_PARAM = "context";
|
|
1654
1654
|
function buildSendMessageRequest(params) {
|
|
1655
1655
|
const wire = params.messages.map((m) => ({
|
|
1656
|
-
id
|
|
1656
|
+
// Use the backend's id when known (adopted from the stream's `start` chunk)
|
|
1657
|
+
// so a resumed assistant message matches what the backend persisted; falls
|
|
1658
|
+
// back to the client id (user messages, pre-`start` shells).
|
|
1659
|
+
id: m.serverMessageId ?? m.id,
|
|
1657
1660
|
parts: messageToWireParts(m),
|
|
1658
1661
|
role: m.role,
|
|
1659
1662
|
// Internal clock is epoch ms; the wire speaks ISO-8601 (Mongo ISODate).
|
|
@@ -2371,12 +2374,13 @@ function makeAssistantMessage() {
|
|
|
2371
2374
|
};
|
|
2372
2375
|
}
|
|
2373
2376
|
function makeInstantWelcomeMessage(m) {
|
|
2377
|
+
const id = uuid7();
|
|
2374
2378
|
return toReactive({
|
|
2375
|
-
id
|
|
2379
|
+
id,
|
|
2376
2380
|
role: m.role,
|
|
2377
2381
|
createdAt: Date.now(),
|
|
2378
2382
|
status: "complete",
|
|
2379
|
-
parts: [{ kind: "text", id: `${
|
|
2383
|
+
parts: [{ kind: "text", id: `${id}-t0`, text: m.text, done: true }]
|
|
2380
2384
|
});
|
|
2381
2385
|
}
|
|
2382
2386
|
function toReactive(m) {
|
|
@@ -2387,6 +2391,7 @@ function toReactive(m) {
|
|
|
2387
2391
|
status: m.status,
|
|
2388
2392
|
errorText: m.errorText,
|
|
2389
2393
|
finishReason: m.finishReason,
|
|
2394
|
+
serverMessageId: m.serverMessageId,
|
|
2390
2395
|
attachments: m.attachments,
|
|
2391
2396
|
partsSig: signal(m.parts.map(partToReactive))
|
|
2392
2397
|
};
|
|
@@ -2440,6 +2445,9 @@ function fromWireMessage(w) {
|
|
|
2440
2445
|
return {
|
|
2441
2446
|
id: w.id,
|
|
2442
2447
|
role: w.role,
|
|
2448
|
+
// On reload the wire `id` IS the backend's id — keep it as `serverMessageId`
|
|
2449
|
+
// too so a HITL re-POST after a reload still references the backend's message.
|
|
2450
|
+
serverMessageId: w.id,
|
|
2443
2451
|
// Real send time when the backend provides it; otherwise fall back to now
|
|
2444
2452
|
// (older backends) so the timestamp + day divider still render.
|
|
2445
2453
|
createdAt: parseWireDate(w.createdAt) ?? Date.now(),
|
|
@@ -2455,6 +2463,7 @@ function fromReactive(m) {
|
|
|
2455
2463
|
status: m.status,
|
|
2456
2464
|
errorText: m.errorText,
|
|
2457
2465
|
finishReason: m.finishReason,
|
|
2466
|
+
serverMessageId: m.serverMessageId,
|
|
2458
2467
|
attachments: m.attachments,
|
|
2459
2468
|
parts: m.partsSig.value.map(partFromReactive)
|
|
2460
2469
|
};
|
|
@@ -2525,6 +2534,8 @@ var StreamReducer = class {
|
|
|
2525
2534
|
if (!m) return;
|
|
2526
2535
|
switch (chunk.type) {
|
|
2527
2536
|
case "start":
|
|
2537
|
+
if (chunk.messageId) m.serverMessageId = chunk.messageId;
|
|
2538
|
+
return;
|
|
2528
2539
|
case "finish-step":
|
|
2529
2540
|
return;
|
|
2530
2541
|
case "start-step":
|
|
@@ -6951,6 +6962,9 @@ var p34 = BRAND.cssPrefix;
|
|
|
6951
6962
|
function makeLocalizedWelcome(w, strings) {
|
|
6952
6963
|
return makeInstantWelcomeMessage({ ...w, text: localizeText(strings, w.text) });
|
|
6953
6964
|
}
|
|
6965
|
+
function firstText(m) {
|
|
6966
|
+
return m.partsSig.value.find((p35) => p35.kind === "text")?.textSig.value ?? "";
|
|
6967
|
+
}
|
|
6954
6968
|
function allToolPartsSettled(msg) {
|
|
6955
6969
|
const tools = msg.partsSig.value.filter((p35) => p35.kind === "tool");
|
|
6956
6970
|
return tools.length > 0 && tools.every((p35) => {
|
|
@@ -7144,8 +7158,9 @@ function App({ options, hostElement, bus }) {
|
|
|
7144
7158
|
(n) => n !== void 0
|
|
7145
7159
|
);
|
|
7146
7160
|
const welcomeAnchor = (timelineStamps.length ? Math.min(...timelineStamps) : Date.now()) - 1;
|
|
7147
|
-
const
|
|
7148
|
-
const
|
|
7161
|
+
const welcomeKey = (role, text) => `${role}|${text}`;
|
|
7162
|
+
const loadedKeys = new Set(loaded.map((m) => welcomeKey(m.role, firstText(m))));
|
|
7163
|
+
const welcomeRows = (welcomeRef.current?.messages ?? []).filter((w) => !loadedKeys.has(welcomeKey(w.role, localizeText(stringsRef.current, w.text)))).map((w) => {
|
|
7149
7164
|
const row = makeLocalizedWelcome(w, stringsRef.current);
|
|
7150
7165
|
row.createdAt = welcomeAnchor;
|
|
7151
7166
|
return row;
|
|
@@ -7434,8 +7449,10 @@ function App({ options, hostElement, bus }) {
|
|
|
7434
7449
|
const body = buildSendMessageRequest({
|
|
7435
7450
|
messages: thread.map(fromReactive),
|
|
7436
7451
|
conversationId: activeConversationId,
|
|
7437
|
-
// The assistant message being generated / resumed
|
|
7438
|
-
|
|
7452
|
+
// The assistant message being generated / resumed — prefer the id the
|
|
7453
|
+
// backend assigned (adopted from the `start` chunk) so a HITL re-POST
|
|
7454
|
+
// resumes the message the backend persisted, not the client-minted id.
|
|
7455
|
+
messageId: assistantMsg.serverMessageId ?? assistantMsg.id,
|
|
7439
7456
|
// textModel + imageModel are backend-only — selected per deployment.
|
|
7440
7457
|
tools: options.features.tools,
|
|
7441
7458
|
// Identity + preferences ride on every message — server may need
|
package/package.json
CHANGED
package/schema.d.ts
CHANGED
|
@@ -1,4 +1,4 @@
|
|
|
1
|
-
export { A as Asset, B as BlocksConfig, C as ConnectionConfig, a as ConnectionConfigPartial, E as Endpoints, H as HandshakeResponse, L as Link, P as PAGE_AREA_SUGGESTIONS, f as PageContext, S as ServerConfig, b as SiteConfig, U as UserContext, W as WidgetConfig, c as WidgetConfigPartial, d as WidgetSettings, e as WidgetSettingsPartial, g as assetSchema, h as blocksConfigSchema, i as connectionConfigPartialSchema, j as connectionConfigSchema, k as cssColorSchema, l as cssLengthSchema, m as endpointsSchema, n as handshakeResponseSchema, o as linkSchema, p as localeSchema, q as pageContextSchema, s as serverConfigSchema, r as siteConfigSchema, u as userContextSchema, t as uuid7Schema, w as widgetConfigPartialSchema, v as widgetConfigSchema, x as widgetSettingsPartialSchema, y as widgetSettingsSchema } from './deployment-
|
|
1
|
+
export { A as Asset, B as BlocksConfig, C as ConnectionConfig, a as ConnectionConfigPartial, E as Endpoints, H as HandshakeResponse, L as Link, P as PAGE_AREA_SUGGESTIONS, f as PageContext, S as ServerConfig, b as SiteConfig, U as UserContext, W as WidgetConfig, c as WidgetConfigPartial, d as WidgetSettings, e as WidgetSettingsPartial, g as assetSchema, h as blocksConfigSchema, i as connectionConfigPartialSchema, j as connectionConfigSchema, k as cssColorSchema, l as cssLengthSchema, m as endpointsSchema, n as handshakeResponseSchema, o as linkSchema, p as localeSchema, q as pageContextSchema, s as serverConfigSchema, r as siteConfigSchema, u as userContextSchema, t as uuid7Schema, w as widgetConfigPartialSchema, v as widgetConfigSchema, x as widgetSettingsPartialSchema, y as widgetSettingsSchema } from './deployment-oSJ2nv2G.js';
|
|
2
2
|
import { z } from 'zod';
|
|
3
3
|
|
|
4
4
|
/**
|
|
@@ -56,9 +56,9 @@ declare const presentationSchema: z.ZodObject<{
|
|
|
56
56
|
inset: z.ZodOptional<z.ZodString>;
|
|
57
57
|
initialSize: z.ZodDefault<z.ZodEnum<{
|
|
58
58
|
fullscreen: "fullscreen";
|
|
59
|
+
normal: "normal";
|
|
59
60
|
expanded: "expanded";
|
|
60
61
|
auto: "auto";
|
|
61
|
-
normal: "normal";
|
|
62
62
|
}>>;
|
|
63
63
|
autoSizeBreakpoint: z.ZodDefault<z.ZodNumber>;
|
|
64
64
|
}, z.core.$loose>>;
|
|
@@ -240,9 +240,9 @@ type LauncherOptions = z.infer<typeof launcherOptionsSchema>;
|
|
|
240
240
|
|
|
241
241
|
declare const initialSizeSchema: z.ZodEnum<{
|
|
242
242
|
fullscreen: "fullscreen";
|
|
243
|
+
normal: "normal";
|
|
243
244
|
expanded: "expanded";
|
|
244
245
|
auto: "auto";
|
|
245
|
-
normal: "normal";
|
|
246
246
|
}>;
|
|
247
247
|
declare const resizeOptionsSchema: z.ZodObject<{
|
|
248
248
|
enabled: z.ZodDefault<z.ZodBoolean>;
|
|
@@ -269,9 +269,9 @@ declare const sizeOptionsSchema: z.ZodObject<{
|
|
|
269
269
|
inset: z.ZodOptional<z.ZodString>;
|
|
270
270
|
initialSize: z.ZodDefault<z.ZodEnum<{
|
|
271
271
|
fullscreen: "fullscreen";
|
|
272
|
+
normal: "normal";
|
|
272
273
|
expanded: "expanded";
|
|
273
274
|
auto: "auto";
|
|
274
|
-
normal: "normal";
|
|
275
275
|
}>>;
|
|
276
276
|
autoSizeBreakpoint: z.ZodDefault<z.ZodNumber>;
|
|
277
277
|
}, z.core.$loose>;
|
|
@@ -323,40 +323,40 @@ type FeatureFlags = z.infer<typeof featureFlagsSchema>;
|
|
|
323
323
|
*/
|
|
324
324
|
|
|
325
325
|
declare const actionNameSchema: z.ZodEnum<{
|
|
326
|
-
close: "close";
|
|
327
326
|
expand: "expand";
|
|
328
327
|
fullscreen: "fullscreen";
|
|
329
|
-
|
|
330
|
-
theme: "theme";
|
|
328
|
+
close: "close";
|
|
331
329
|
language: "language";
|
|
330
|
+
theme: "theme";
|
|
332
331
|
textSize: "textSize";
|
|
333
332
|
history: "history";
|
|
333
|
+
clear: "clear";
|
|
334
334
|
sound: "sound";
|
|
335
335
|
}>;
|
|
336
336
|
type ActionName = z.infer<typeof actionNameSchema>;
|
|
337
337
|
declare const headerActionsSchema: z.ZodArray<z.ZodEnum<{
|
|
338
|
-
close: "close";
|
|
339
338
|
expand: "expand";
|
|
340
339
|
fullscreen: "fullscreen";
|
|
341
|
-
|
|
342
|
-
theme: "theme";
|
|
340
|
+
close: "close";
|
|
343
341
|
language: "language";
|
|
342
|
+
theme: "theme";
|
|
344
343
|
textSize: "textSize";
|
|
345
344
|
history: "history";
|
|
345
|
+
clear: "clear";
|
|
346
346
|
sound: "sound";
|
|
347
347
|
}>>;
|
|
348
348
|
type HeaderActions = z.infer<typeof headerActionsSchema>;
|
|
349
349
|
/** Section wrapper — `actions` list wrapped under `header` in the dashboard form. */
|
|
350
350
|
declare const headerSchema: z.ZodObject<{
|
|
351
351
|
actions: z.ZodOptional<z.ZodArray<z.ZodEnum<{
|
|
352
|
-
close: "close";
|
|
353
352
|
expand: "expand";
|
|
354
353
|
fullscreen: "fullscreen";
|
|
355
|
-
|
|
356
|
-
theme: "theme";
|
|
354
|
+
close: "close";
|
|
357
355
|
language: "language";
|
|
356
|
+
theme: "theme";
|
|
358
357
|
textSize: "textSize";
|
|
359
358
|
history: "history";
|
|
359
|
+
clear: "clear";
|
|
360
360
|
sound: "sound";
|
|
361
361
|
}>>>;
|
|
362
362
|
}, z.core.$loose>;
|
|
@@ -372,33 +372,33 @@ type HeaderOptions = z.infer<typeof headerSchema>;
|
|
|
372
372
|
*/
|
|
373
373
|
|
|
374
374
|
declare const feedbackEventSchema: z.ZodEnum<{
|
|
375
|
-
voiceStart: "voiceStart";
|
|
376
|
-
voiceStop: "voiceStop";
|
|
377
375
|
error: "error";
|
|
378
376
|
messageReceived: "messageReceived";
|
|
379
377
|
messageSent: "messageSent";
|
|
378
|
+
voiceStart: "voiceStart";
|
|
379
|
+
voiceStop: "voiceStop";
|
|
380
380
|
}>;
|
|
381
381
|
type FeedbackEvent = z.infer<typeof feedbackEventSchema>;
|
|
382
382
|
declare const soundOptionsSchema: z.ZodObject<{
|
|
383
383
|
enabled: z.ZodDefault<z.ZodBoolean>;
|
|
384
384
|
volume: z.ZodDefault<z.ZodNumber>;
|
|
385
385
|
events: z.ZodOptional<z.ZodRecord<z.ZodEnum<{
|
|
386
|
-
voiceStart: "voiceStart";
|
|
387
|
-
voiceStop: "voiceStop";
|
|
388
386
|
error: "error";
|
|
389
387
|
messageReceived: "messageReceived";
|
|
390
388
|
messageSent: "messageSent";
|
|
389
|
+
voiceStart: "voiceStart";
|
|
390
|
+
voiceStop: "voiceStop";
|
|
391
391
|
}> & z.core.$partial, z.ZodUnion<readonly [z.ZodBoolean, z.ZodString]>>>;
|
|
392
392
|
}, z.core.$loose>;
|
|
393
393
|
type SoundOptions = z.infer<typeof soundOptionsSchema>;
|
|
394
394
|
declare const hapticsOptionsSchema: z.ZodObject<{
|
|
395
395
|
enabled: z.ZodDefault<z.ZodBoolean>;
|
|
396
396
|
events: z.ZodOptional<z.ZodRecord<z.ZodEnum<{
|
|
397
|
-
voiceStart: "voiceStart";
|
|
398
|
-
voiceStop: "voiceStop";
|
|
399
397
|
error: "error";
|
|
400
398
|
messageReceived: "messageReceived";
|
|
401
399
|
messageSent: "messageSent";
|
|
400
|
+
voiceStart: "voiceStart";
|
|
401
|
+
voiceStop: "voiceStop";
|
|
402
402
|
}> & z.core.$partial, z.ZodUnion<readonly [z.ZodBoolean, z.ZodNumber, z.ZodArray<z.ZodNumber>]>>>;
|
|
403
403
|
}, z.core.$loose>;
|
|
404
404
|
type HapticsOptions = z.infer<typeof hapticsOptionsSchema>;
|
|
@@ -407,21 +407,21 @@ declare const feedbackSchema: z.ZodObject<{
|
|
|
407
407
|
enabled: z.ZodDefault<z.ZodBoolean>;
|
|
408
408
|
volume: z.ZodDefault<z.ZodNumber>;
|
|
409
409
|
events: z.ZodOptional<z.ZodRecord<z.ZodEnum<{
|
|
410
|
-
voiceStart: "voiceStart";
|
|
411
|
-
voiceStop: "voiceStop";
|
|
412
410
|
error: "error";
|
|
413
411
|
messageReceived: "messageReceived";
|
|
414
412
|
messageSent: "messageSent";
|
|
413
|
+
voiceStart: "voiceStart";
|
|
414
|
+
voiceStop: "voiceStop";
|
|
415
415
|
}> & z.core.$partial, z.ZodUnion<readonly [z.ZodBoolean, z.ZodString]>>>;
|
|
416
416
|
}, z.core.$loose>>;
|
|
417
417
|
haptics: z.ZodOptional<z.ZodObject<{
|
|
418
418
|
enabled: z.ZodDefault<z.ZodBoolean>;
|
|
419
419
|
events: z.ZodOptional<z.ZodRecord<z.ZodEnum<{
|
|
420
|
-
voiceStart: "voiceStart";
|
|
421
|
-
voiceStop: "voiceStop";
|
|
422
420
|
error: "error";
|
|
423
421
|
messageReceived: "messageReceived";
|
|
424
422
|
messageSent: "messageSent";
|
|
423
|
+
voiceStart: "voiceStart";
|
|
424
|
+
voiceStop: "voiceStop";
|
|
425
425
|
}> & z.core.$partial, z.ZodUnion<readonly [z.ZodBoolean, z.ZodNumber, z.ZodArray<z.ZodNumber>]>>>;
|
|
426
426
|
}, z.core.$loose>>;
|
|
427
427
|
}, z.core.$loose>;
|
|
@@ -856,18 +856,18 @@ type I18nOptions = z.infer<typeof i18nSchema>;
|
|
|
856
856
|
*/
|
|
857
857
|
|
|
858
858
|
declare const moduleLayoutSchema: z.ZodEnum<{
|
|
859
|
-
home: "home";
|
|
860
859
|
chat: "chat";
|
|
861
860
|
help: "help";
|
|
861
|
+
home: "home";
|
|
862
862
|
news: "news";
|
|
863
863
|
}>;
|
|
864
864
|
type ModuleLayout = z.infer<typeof moduleLayoutSchema>;
|
|
865
865
|
declare const moduleSchema: z.ZodObject<{
|
|
866
866
|
label: z.ZodString;
|
|
867
867
|
layout: z.ZodEnum<{
|
|
868
|
-
home: "home";
|
|
869
868
|
chat: "chat";
|
|
870
869
|
help: "help";
|
|
870
|
+
home: "home";
|
|
871
871
|
news: "news";
|
|
872
872
|
}>;
|
|
873
873
|
contentTags: z.ZodOptional<z.ZodArray<z.ZodString>>;
|
|
@@ -893,9 +893,9 @@ type ModuleOptions = z.infer<typeof moduleSchema>;
|
|
|
893
893
|
declare const modulesSchema: z.ZodArray<z.ZodObject<{
|
|
894
894
|
label: z.ZodString;
|
|
895
895
|
layout: z.ZodEnum<{
|
|
896
|
-
home: "home";
|
|
897
896
|
chat: "chat";
|
|
898
897
|
help: "help";
|
|
898
|
+
home: "home";
|
|
899
899
|
news: "news";
|
|
900
900
|
}>;
|
|
901
901
|
contentTags: z.ZodOptional<z.ZodArray<z.ZodString>>;
|
package/web-component.mjs
CHANGED
|
@@ -1445,7 +1445,7 @@ function createAuth(opts) {
|
|
|
1445
1445
|
}
|
|
1446
1446
|
|
|
1447
1447
|
// src/core/version.ts
|
|
1448
|
-
var ELEMENTS_VERSION = true ? "0.46.
|
|
1448
|
+
var ELEMENTS_VERSION = true ? "0.46.3" : "0.0.0-dev";
|
|
1449
1449
|
var ELEMENTS_VERSION_PARAM = "_ev";
|
|
1450
1450
|
|
|
1451
1451
|
// src/stream/types.ts
|
|
@@ -1612,7 +1612,10 @@ var DEFAULT_PATHS = {
|
|
|
1612
1612
|
var CONTEXT_PARAM = "context";
|
|
1613
1613
|
function buildSendMessageRequest(params) {
|
|
1614
1614
|
const wire = params.messages.map((m) => ({
|
|
1615
|
-
id
|
|
1615
|
+
// Use the backend's id when known (adopted from the stream's `start` chunk)
|
|
1616
|
+
// so a resumed assistant message matches what the backend persisted; falls
|
|
1617
|
+
// back to the client id (user messages, pre-`start` shells).
|
|
1618
|
+
id: m.serverMessageId ?? m.id,
|
|
1616
1619
|
parts: messageToWireParts(m),
|
|
1617
1620
|
role: m.role,
|
|
1618
1621
|
// Internal clock is epoch ms; the wire speaks ISO-8601 (Mongo ISODate).
|
|
@@ -2330,12 +2333,13 @@ function makeAssistantMessage() {
|
|
|
2330
2333
|
};
|
|
2331
2334
|
}
|
|
2332
2335
|
function makeInstantWelcomeMessage(m) {
|
|
2336
|
+
const id = uuid7();
|
|
2333
2337
|
return toReactive({
|
|
2334
|
-
id
|
|
2338
|
+
id,
|
|
2335
2339
|
role: m.role,
|
|
2336
2340
|
createdAt: Date.now(),
|
|
2337
2341
|
status: "complete",
|
|
2338
|
-
parts: [{ kind: "text", id: `${
|
|
2342
|
+
parts: [{ kind: "text", id: `${id}-t0`, text: m.text, done: true }]
|
|
2339
2343
|
});
|
|
2340
2344
|
}
|
|
2341
2345
|
function toReactive(m) {
|
|
@@ -2346,6 +2350,7 @@ function toReactive(m) {
|
|
|
2346
2350
|
status: m.status,
|
|
2347
2351
|
errorText: m.errorText,
|
|
2348
2352
|
finishReason: m.finishReason,
|
|
2353
|
+
serverMessageId: m.serverMessageId,
|
|
2349
2354
|
attachments: m.attachments,
|
|
2350
2355
|
partsSig: signal(m.parts.map(partToReactive))
|
|
2351
2356
|
};
|
|
@@ -2399,6 +2404,9 @@ function fromWireMessage(w) {
|
|
|
2399
2404
|
return {
|
|
2400
2405
|
id: w.id,
|
|
2401
2406
|
role: w.role,
|
|
2407
|
+
// On reload the wire `id` IS the backend's id — keep it as `serverMessageId`
|
|
2408
|
+
// too so a HITL re-POST after a reload still references the backend's message.
|
|
2409
|
+
serverMessageId: w.id,
|
|
2402
2410
|
// Real send time when the backend provides it; otherwise fall back to now
|
|
2403
2411
|
// (older backends) so the timestamp + day divider still render.
|
|
2404
2412
|
createdAt: parseWireDate(w.createdAt) ?? Date.now(),
|
|
@@ -2414,6 +2422,7 @@ function fromReactive(m) {
|
|
|
2414
2422
|
status: m.status,
|
|
2415
2423
|
errorText: m.errorText,
|
|
2416
2424
|
finishReason: m.finishReason,
|
|
2425
|
+
serverMessageId: m.serverMessageId,
|
|
2417
2426
|
attachments: m.attachments,
|
|
2418
2427
|
parts: m.partsSig.value.map(partFromReactive)
|
|
2419
2428
|
};
|
|
@@ -2484,6 +2493,8 @@ var StreamReducer = class {
|
|
|
2484
2493
|
if (!m) return;
|
|
2485
2494
|
switch (chunk.type) {
|
|
2486
2495
|
case "start":
|
|
2496
|
+
if (chunk.messageId) m.serverMessageId = chunk.messageId;
|
|
2497
|
+
return;
|
|
2487
2498
|
case "finish-step":
|
|
2488
2499
|
return;
|
|
2489
2500
|
case "start-step":
|
|
@@ -6910,6 +6921,9 @@ var p34 = BRAND.cssPrefix;
|
|
|
6910
6921
|
function makeLocalizedWelcome(w, strings) {
|
|
6911
6922
|
return makeInstantWelcomeMessage({ ...w, text: localizeText(strings, w.text) });
|
|
6912
6923
|
}
|
|
6924
|
+
function firstText(m) {
|
|
6925
|
+
return m.partsSig.value.find((p35) => p35.kind === "text")?.textSig.value ?? "";
|
|
6926
|
+
}
|
|
6913
6927
|
function allToolPartsSettled(msg) {
|
|
6914
6928
|
const tools = msg.partsSig.value.filter((p35) => p35.kind === "tool");
|
|
6915
6929
|
return tools.length > 0 && tools.every((p35) => {
|
|
@@ -7103,8 +7117,9 @@ function App({ options, hostElement, bus }) {
|
|
|
7103
7117
|
(n) => n !== void 0
|
|
7104
7118
|
);
|
|
7105
7119
|
const welcomeAnchor = (timelineStamps.length ? Math.min(...timelineStamps) : Date.now()) - 1;
|
|
7106
|
-
const
|
|
7107
|
-
const
|
|
7120
|
+
const welcomeKey = (role, text) => `${role}|${text}`;
|
|
7121
|
+
const loadedKeys = new Set(loaded.map((m) => welcomeKey(m.role, firstText(m))));
|
|
7122
|
+
const welcomeRows = (welcomeRef.current?.messages ?? []).filter((w) => !loadedKeys.has(welcomeKey(w.role, localizeText(stringsRef.current, w.text)))).map((w) => {
|
|
7108
7123
|
const row = makeLocalizedWelcome(w, stringsRef.current);
|
|
7109
7124
|
row.createdAt = welcomeAnchor;
|
|
7110
7125
|
return row;
|
|
@@ -7393,8 +7408,10 @@ function App({ options, hostElement, bus }) {
|
|
|
7393
7408
|
const body = buildSendMessageRequest({
|
|
7394
7409
|
messages: thread.map(fromReactive),
|
|
7395
7410
|
conversationId: activeConversationId,
|
|
7396
|
-
// The assistant message being generated / resumed
|
|
7397
|
-
|
|
7411
|
+
// The assistant message being generated / resumed — prefer the id the
|
|
7412
|
+
// backend assigned (adopted from the `start` chunk) so a HITL re-POST
|
|
7413
|
+
// resumes the message the backend persisted, not the client-minted id.
|
|
7414
|
+
messageId: assistantMsg.serverMessageId ?? assistantMsg.id,
|
|
7398
7415
|
// textModel + imageModel are backend-only — selected per deployment.
|
|
7399
7416
|
tools: options.features.tools,
|
|
7400
7417
|
// Identity + preferences ride on every message — server may need
|