@burdenoff/fe-libs 2026.913.2 → 2026.914.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.
- package/dist/shared/assistant/conversation.d.ts +29 -0
- package/dist/shared/assistant/conversation.d.ts.map +1 -1
- package/dist/shared/assistant/displayContent.d.ts +57 -0
- package/dist/shared/assistant/displayContent.d.ts.map +1 -0
- package/dist/shared/assistant/displayContent.js +26 -0
- package/dist/shared/assistant/exportConversation.d.ts +12 -2
- package/dist/shared/assistant/exportConversation.d.ts.map +1 -1
- package/dist/shared/assistant/exportConversation.js +24 -22
- package/dist/shared/assistant/index.d.ts +6 -0
- package/dist/shared/assistant/index.d.ts.map +1 -1
- package/dist/shared/assistant/legacyFiller.d.ts +60 -0
- package/dist/shared/assistant/legacyFiller.d.ts.map +1 -0
- package/dist/shared/assistant/legacyFiller.js +35 -0
- package/dist/shared/assistant/preview/previewTransitions.d.ts +15 -1
- package/dist/shared/assistant/preview/previewTransitions.d.ts.map +1 -1
- package/dist/shared/assistant/preview/previewTransitions.js +5 -2
- package/dist/shared/assistant/preview/useAssistantPreviewBridge.d.ts.map +1 -1
- package/dist/shared/assistant/preview/useAssistantPreviewBridge.js +51 -52
- package/dist/shared/assistant/spokenTurns.d.ts +25 -0
- package/dist/shared/assistant/spokenTurns.d.ts.map +1 -0
- package/dist/shared/assistant/spokenTurns.js +12 -0
- package/dist/shared/assistant/stageCopy.d.ts +23 -34
- package/dist/shared/assistant/stageCopy.d.ts.map +1 -1
- package/dist/shared/assistant/stageCopy.js +7 -16
- package/dist/shared/assistant/store.d.ts +10 -2
- package/dist/shared/assistant/store.d.ts.map +1 -1
- package/dist/shared/assistant/store.js +16 -9
- package/dist/shared/assistant/turnActivity.d.ts +66 -0
- package/dist/shared/assistant/turnActivity.d.ts.map +1 -0
- package/dist/shared/assistant/turnActivity.js +41 -0
- package/dist/shared/assistant/turnProgress.d.ts +51 -0
- package/dist/shared/assistant/turnProgress.d.ts.map +1 -0
- package/dist/shared/assistant/turnProgress.js +27 -0
- package/dist/shared/assistant/ui/AssistantChatArea.d.ts.map +1 -1
- package/dist/shared/assistant/ui/AssistantChatArea.js +285 -302
- package/dist/shared/assistant/ui/AssistantConversationList.d.ts.map +1 -1
- package/dist/shared/assistant/ui/AssistantConversationList.js +81 -80
- package/dist/shared/assistant/ui/AssistantMessageItem.d.ts +12 -1
- package/dist/shared/assistant/ui/AssistantMessageItem.d.ts.map +1 -1
- package/dist/shared/assistant/ui/AssistantMessageItem.js +103 -83
- package/dist/shared/assistant/ui/AssistantMessageList.d.ts +7 -1
- package/dist/shared/assistant/ui/AssistantMessageList.d.ts.map +1 -1
- package/dist/shared/assistant/ui/AssistantMessageList.js +16 -15
- package/dist/shared/assistant/ui/AssistantMoreMenu.d.ts.map +1 -1
- package/dist/shared/assistant/ui/AssistantMoreMenu.js +23 -20
- package/dist/shared/assistant/ui/AssistantTurnActivity.d.ts +37 -0
- package/dist/shared/assistant/ui/AssistantTurnActivity.d.ts.map +1 -0
- package/dist/shared/assistant/ui/AssistantTurnActivity.js +33 -0
- package/dist/shared-assistant.js +73 -67
- package/package.json +1 -1
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"AssistantConversationList.d.ts","sourceRoot":"","sources":["../../../../src/shared/assistant/ui/AssistantConversationList.tsx"],"names":[],"mappings":"AAAA,OAAO,EAAY,KAAK,EAAE,EAAE,MAAM,OAAO,CAAC;
|
|
1
|
+
{"version":3,"file":"AssistantConversationList.d.ts","sourceRoot":"","sources":["../../../../src/shared/assistant/ui/AssistantConversationList.tsx"],"names":[],"mappings":"AAAA,OAAO,EAAY,KAAK,EAAE,EAAE,MAAM,OAAO,CAAC;AAiB1C,eAAO,MAAM,yBAAyB,EAAE,EAiRvC,CAAC"}
|
|
@@ -2,156 +2,157 @@ import { useAssistantProduct as e } from "../product.js";
|
|
|
2
2
|
import { useAssistantTr as t } from "../i18n.js";
|
|
3
3
|
import { chatTurns as n } from "../voice/turnVisibility.js";
|
|
4
4
|
import { useAssistantStore as r } from "../store.js";
|
|
5
|
-
import {
|
|
6
|
-
import {
|
|
7
|
-
import {
|
|
8
|
-
import {
|
|
5
|
+
import { getAssistantDisplayContent as i } from "../displayContent.js";
|
|
6
|
+
import { useOverlayFocus as a } from "./useOverlayFocus.js";
|
|
7
|
+
import { useState as o } from "react";
|
|
8
|
+
import { Check as s, MessageSquare as c, PanelLeftClose as l, Pencil as u, Plus as d, Trash2 as f } from "lucide-react";
|
|
9
|
+
import { Fragment as p, jsx as m, jsxs as h } from "react/jsx-runtime";
|
|
9
10
|
//#region src/shared/assistant/ui/AssistantConversationList.tsx
|
|
10
|
-
var
|
|
11
|
-
let
|
|
12
|
-
|
|
13
|
-
},
|
|
14
|
-
let t =
|
|
15
|
-
|
|
16
|
-
},
|
|
17
|
-
|
|
18
|
-
},
|
|
19
|
-
|
|
20
|
-
},
|
|
21
|
-
e.stopPropagation(),
|
|
11
|
+
var g = () => {
|
|
12
|
+
let g = t(), { modes: _ } = e(), { conversations: v, activeConversationId: y, processingByConversationId: b, setActiveConversation: x, setMode: S, createConversation: C, deleteConversation: w, renameConversation: T, setConversationListOpen: E } = r(), [D, O] = o(null), [k, A] = o(""), j = () => {
|
|
13
|
+
C(), E(!1);
|
|
14
|
+
}, M = (e) => {
|
|
15
|
+
let t = v.find((t) => t.id === e);
|
|
16
|
+
x(e), t && S(t.mode), E(!1);
|
|
17
|
+
}, N = (e, t) => {
|
|
18
|
+
O(e), A(t);
|
|
19
|
+
}, P = () => {
|
|
20
|
+
D && k.trim() && T(D, k.trim()), O(null);
|
|
21
|
+
}, F = (e, t) => {
|
|
22
|
+
e.stopPropagation(), w(t);
|
|
22
23
|
};
|
|
23
|
-
return /* @__PURE__ */
|
|
24
|
-
ref:
|
|
24
|
+
return /* @__PURE__ */ h("div", {
|
|
25
|
+
ref: a("assistant-open-history"),
|
|
25
26
|
tabIndex: -1,
|
|
26
27
|
role: "region",
|
|
27
|
-
"aria-label":
|
|
28
|
+
"aria-label": g("conversations.title", "History"),
|
|
28
29
|
className: "absolute inset-0 z-10 flex flex-col bg-bg-surface outline-none animate-in slide-in-from-left-2 fade-in duration-200",
|
|
29
30
|
"data-testid": "conversation-list",
|
|
30
|
-
children: [/* @__PURE__ */
|
|
31
|
+
children: [/* @__PURE__ */ h("div", {
|
|
31
32
|
className: "flex items-center justify-between px-4 py-3 border-b border-border-default bg-bg-elevated",
|
|
32
|
-
children: [/* @__PURE__ */
|
|
33
|
+
children: [/* @__PURE__ */ m("span", {
|
|
33
34
|
className: "text-[13px] font-semibold text-text-primary",
|
|
34
|
-
children:
|
|
35
|
-
}), /* @__PURE__ */
|
|
35
|
+
children: g("conversations.title", "History")
|
|
36
|
+
}), /* @__PURE__ */ h("div", {
|
|
36
37
|
className: "flex items-center gap-0.5",
|
|
37
|
-
children: [/* @__PURE__ */
|
|
38
|
+
children: [/* @__PURE__ */ m("button", {
|
|
38
39
|
type: "button",
|
|
39
|
-
onClick:
|
|
40
|
+
onClick: j,
|
|
40
41
|
className: "p-1.5 rounded-lg text-text-secondary hover:bg-bg-sunken transition-colors",
|
|
41
|
-
"aria-label":
|
|
42
|
+
"aria-label": g("conversations.new", "New conversation"),
|
|
42
43
|
"data-testid": "new-conversation",
|
|
43
|
-
children: /* @__PURE__ */
|
|
44
|
-
}), /* @__PURE__ */
|
|
44
|
+
children: /* @__PURE__ */ m(d, { className: "size-4" })
|
|
45
|
+
}), /* @__PURE__ */ h("button", {
|
|
45
46
|
type: "button",
|
|
46
|
-
onClick: () =>
|
|
47
|
+
onClick: () => E(!1),
|
|
47
48
|
className: "flex items-center gap-1 px-2 py-1.5 rounded-lg text-text-secondary hover:bg-bg-sunken transition-colors",
|
|
48
|
-
"aria-label":
|
|
49
|
+
"aria-label": g("conversations.collapse", "Collapse history"),
|
|
49
50
|
"data-testid": "collapse-conversation-list",
|
|
50
|
-
children: [/* @__PURE__ */
|
|
51
|
+
children: [/* @__PURE__ */ m(l, { className: "size-4" }), /* @__PURE__ */ m("span", {
|
|
51
52
|
className: "text-[11px] font-medium",
|
|
52
|
-
children:
|
|
53
|
+
children: g("conversations.collapseLabel", "Collapse")
|
|
53
54
|
})]
|
|
54
55
|
})]
|
|
55
56
|
})]
|
|
56
|
-
}), /* @__PURE__ */
|
|
57
|
+
}), /* @__PURE__ */ m("div", {
|
|
57
58
|
className: "flex-1 overflow-y-auto",
|
|
58
|
-
children:
|
|
59
|
+
children: v.length === 0 ? /* @__PURE__ */ h("div", {
|
|
59
60
|
className: "flex flex-col items-center justify-center h-full text-center px-4",
|
|
60
61
|
children: [
|
|
61
|
-
/* @__PURE__ */
|
|
62
|
-
/* @__PURE__ */
|
|
62
|
+
/* @__PURE__ */ m(c, { className: "size-6 text-text-muted mb-2" }),
|
|
63
|
+
/* @__PURE__ */ m("p", {
|
|
63
64
|
className: "text-xs text-text-muted",
|
|
64
|
-
children:
|
|
65
|
+
children: g("conversations.empty", "No conversations yet")
|
|
65
66
|
}),
|
|
66
|
-
/* @__PURE__ */
|
|
67
|
+
/* @__PURE__ */ m("button", {
|
|
67
68
|
type: "button",
|
|
68
|
-
onClick:
|
|
69
|
+
onClick: j,
|
|
69
70
|
className: "mt-2 text-xs text-action-primary-bg hover:underline",
|
|
70
|
-
children:
|
|
71
|
+
children: g("conversations.startNew", "Start a new conversation")
|
|
71
72
|
})
|
|
72
73
|
]
|
|
73
|
-
}) : /* @__PURE__ */
|
|
74
|
+
}) : /* @__PURE__ */ m("div", {
|
|
74
75
|
className: "py-1",
|
|
75
|
-
children:
|
|
76
|
-
let t = e.id ===
|
|
77
|
-
return /* @__PURE__ */
|
|
76
|
+
children: v.map((e) => {
|
|
77
|
+
let t = e.id === y, r = e.id === D, a = _.find((t) => t.id === e.mode), o = n(e.messages), c = o[o.length - 1], l = o.length === 0 && e.messages.length > 0, d = b[e.id], v = c ? i(c, d, g).text.slice(0, 60) : "";
|
|
78
|
+
return /* @__PURE__ */ m("div", {
|
|
78
79
|
role: "button",
|
|
79
80
|
tabIndex: 0,
|
|
80
81
|
onKeyDown: (t) => {
|
|
81
|
-
(t.key === "Enter" || t.key === " ") && (t.preventDefault(), !r &&
|
|
82
|
+
(t.key === "Enter" || t.key === " ") && (t.preventDefault(), !r && M(e.id));
|
|
82
83
|
},
|
|
83
|
-
onClick: () => !r &&
|
|
84
|
+
onClick: () => !r && M(e.id),
|
|
84
85
|
className: `group px-3 py-2 cursor-pointer hover:bg-bg-elevated transition-colors ${t ? "bg-bg-elevated border-l-2 border-action-primary-bg" : ""}`,
|
|
85
|
-
children: r ? /* @__PURE__ */
|
|
86
|
+
children: r ? /* @__PURE__ */ h("div", {
|
|
86
87
|
className: "flex items-center gap-1",
|
|
87
|
-
children: [/* @__PURE__ */
|
|
88
|
-
"aria-label":
|
|
89
|
-
value:
|
|
90
|
-
onChange: (e) =>
|
|
88
|
+
children: [/* @__PURE__ */ m("input", {
|
|
89
|
+
"aria-label": g("conversations.renameLabel", "Conversation title"),
|
|
90
|
+
value: k,
|
|
91
|
+
onChange: (e) => A(e.target.value),
|
|
91
92
|
onKeyDown: (e) => {
|
|
92
|
-
e.key === "Enter" &&
|
|
93
|
+
e.key === "Enter" && P(), e.key === "Escape" && (e.preventDefault(), e.stopPropagation(), O(null));
|
|
93
94
|
},
|
|
94
95
|
className: "flex-1 text-xs bg-bg-sunken border border-border-default rounded px-2 py-1 text-text-primary focus:outline-none focus:border-action-primary-bg",
|
|
95
96
|
onClick: (e) => e.stopPropagation()
|
|
96
|
-
}), /* @__PURE__ */
|
|
97
|
+
}), /* @__PURE__ */ m("button", {
|
|
97
98
|
type: "button",
|
|
98
99
|
onClick: (e) => {
|
|
99
|
-
e.stopPropagation(),
|
|
100
|
+
e.stopPropagation(), P();
|
|
100
101
|
},
|
|
101
102
|
className: "p-1 hover:bg-bg-sunken rounded",
|
|
102
|
-
"aria-label":
|
|
103
|
-
children: /* @__PURE__ */
|
|
103
|
+
"aria-label": g("conversations.saveTitle", "Save title"),
|
|
104
|
+
children: /* @__PURE__ */ m(s, { className: "size-3 text-status-success-text" })
|
|
104
105
|
})]
|
|
105
|
-
}) : /* @__PURE__ */
|
|
106
|
-
/* @__PURE__ */
|
|
106
|
+
}) : /* @__PURE__ */ h(p, { children: [
|
|
107
|
+
/* @__PURE__ */ h("div", {
|
|
107
108
|
className: "flex items-center justify-between",
|
|
108
|
-
children: [/* @__PURE__ */
|
|
109
|
+
children: [/* @__PURE__ */ m("span", {
|
|
109
110
|
className: "text-xs font-medium text-text-primary truncate flex-1",
|
|
110
111
|
children: e.title
|
|
111
|
-
}), /* @__PURE__ */
|
|
112
|
+
}), /* @__PURE__ */ h("div", {
|
|
112
113
|
className: "hidden group-hover:flex group-focus-within:flex items-center gap-0.5 ml-1",
|
|
113
|
-
children: [/* @__PURE__ */
|
|
114
|
+
children: [/* @__PURE__ */ m("button", {
|
|
114
115
|
type: "button",
|
|
115
116
|
onClick: (t) => {
|
|
116
|
-
t.stopPropagation(),
|
|
117
|
+
t.stopPropagation(), N(e.id, e.title);
|
|
117
118
|
},
|
|
118
119
|
className: "p-0.5 hover:bg-bg-sunken rounded",
|
|
119
|
-
"aria-label":
|
|
120
|
-
children: /* @__PURE__ */
|
|
121
|
-
}), /* @__PURE__ */
|
|
120
|
+
"aria-label": g("conversations.rename", "Rename conversation"),
|
|
121
|
+
children: /* @__PURE__ */ m(u, { className: "size-3 text-text-muted" })
|
|
122
|
+
}), /* @__PURE__ */ m("button", {
|
|
122
123
|
type: "button",
|
|
123
|
-
onClick: (t) =>
|
|
124
|
+
onClick: (t) => F(t, e.id),
|
|
124
125
|
className: "p-0.5 hover:bg-bg-sunken rounded",
|
|
125
|
-
"aria-label":
|
|
126
|
+
"aria-label": g("conversations.delete", "Delete conversation"),
|
|
126
127
|
"data-testid": "delete-conversation",
|
|
127
|
-
children: /* @__PURE__ */
|
|
128
|
+
children: /* @__PURE__ */ m(f, { className: "size-3 text-status-error-text" })
|
|
128
129
|
})]
|
|
129
130
|
})]
|
|
130
131
|
}),
|
|
131
|
-
/* @__PURE__ */
|
|
132
|
+
/* @__PURE__ */ h("div", {
|
|
132
133
|
className: "flex items-center gap-1.5 mt-0.5",
|
|
133
134
|
children: [
|
|
134
|
-
/* @__PURE__ */
|
|
135
|
+
/* @__PURE__ */ m("span", {
|
|
135
136
|
className: "text-[10px] text-text-muted px-1 py-0.5 bg-bg-sunken rounded",
|
|
136
|
-
children:
|
|
137
|
+
children: a?.label ?? e.mode
|
|
137
138
|
}),
|
|
138
|
-
/* @__PURE__ */
|
|
139
|
+
/* @__PURE__ */ h("span", {
|
|
139
140
|
className: "text-[10px] text-text-muted",
|
|
140
|
-
children: [
|
|
141
|
+
children: [o.length, " msgs"]
|
|
141
142
|
}),
|
|
142
|
-
|
|
143
|
+
d && d.status !== "idle" && /* @__PURE__ */ m("span", {
|
|
143
144
|
className: "text-[10px] text-action-primary-bg px-1 py-0.5 bg-bg-sunken rounded",
|
|
144
|
-
children:
|
|
145
|
+
children: d.status
|
|
145
146
|
})
|
|
146
147
|
]
|
|
147
148
|
}),
|
|
148
|
-
|
|
149
|
+
v && /* @__PURE__ */ m("p", {
|
|
149
150
|
className: "text-[10px] text-text-muted truncate mt-0.5",
|
|
150
|
-
children:
|
|
151
|
+
children: v
|
|
151
152
|
}),
|
|
152
|
-
|
|
153
|
+
l && /* @__PURE__ */ m("p", {
|
|
153
154
|
className: "text-[10px] text-text-muted truncate mt-0.5",
|
|
154
|
-
children:
|
|
155
|
+
children: g("conversationList.voiceOnly", "Spoken conversation")
|
|
155
156
|
})
|
|
156
157
|
] })
|
|
157
158
|
}, e.id);
|
|
@@ -161,4 +162,4 @@ var h = () => {
|
|
|
161
162
|
});
|
|
162
163
|
};
|
|
163
164
|
//#endregion
|
|
164
|
-
export {
|
|
165
|
+
export { g as AssistantConversationList };
|
|
@@ -1,11 +1,22 @@
|
|
|
1
1
|
import { FC } from 'react';
|
|
2
|
-
import { Message } from '../conversation';
|
|
2
|
+
import { AssistantConversationProcessing, Message } from '../conversation';
|
|
3
3
|
interface Props {
|
|
4
4
|
/** Approve a pending write. Absent outside a live conversation. */
|
|
5
5
|
onApprovePendingWrite?: (reference: string) => void;
|
|
6
6
|
/** Reference currently being approved, so only that card shows a spinner. */
|
|
7
7
|
approvingWriteRef?: string | null;
|
|
8
8
|
message: Message;
|
|
9
|
+
/**
|
|
10
|
+
* The processing entry of this message's conversation. It decides what the
|
|
11
|
+
* bubble shows — waiting copy drawn from the live step, the model's output, or
|
|
12
|
+
* "Stopped" for a turn that ended with nothing — through
|
|
13
|
+
* `getAssistantDisplayContent`, the projection every surface shares.
|
|
14
|
+
*
|
|
15
|
+
* ★ Optional for hosts that mount the item directly. When it is not passed at
|
|
16
|
+
* all, `isStreaming` stands in for it, so such a host never sees a turn it is
|
|
17
|
+
* still streaming labelled "Stopped".
|
|
18
|
+
*/
|
|
19
|
+
processing?: AssistantConversationProcessing | null;
|
|
9
20
|
isStreaming?: boolean;
|
|
10
21
|
/** This assistant message ended in an error — show the Retry affordance. */
|
|
11
22
|
isFailed?: boolean;
|
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"AssistantMessageItem.d.ts","sourceRoot":"","sources":["../../../../src/shared/assistant/ui/AssistantMessageItem.tsx"],"names":[],"mappings":"AAAA,OAAO,EAAqB,KAAK,EAAE,EAAE,MAAM,OAAO,CAAC;
|
|
1
|
+
{"version":3,"file":"AssistantMessageItem.d.ts","sourceRoot":"","sources":["../../../../src/shared/assistant/ui/AssistantMessageItem.tsx"],"names":[],"mappings":"AAAA,OAAO,EAAqB,KAAK,EAAE,EAAE,MAAM,OAAO,CAAC;AAwBnD,OAAO,KAAK,EACV,+BAA+B,EAG/B,OAAO,EACR,MAAM,iBAAiB,CAAC;AAIzB,UAAU,KAAK;IACb,mEAAmE;IACnE,qBAAqB,CAAC,EAAE,CAAC,SAAS,EAAE,MAAM,KAAK,IAAI,CAAC;IACpD,6EAA6E;IAC7E,iBAAiB,CAAC,EAAE,MAAM,GAAG,IAAI,CAAC;IAClC,OAAO,EAAE,OAAO,CAAC;IACjB;;;;;;;;;OASG;IACH,UAAU,CAAC,EAAE,+BAA+B,GAAG,IAAI,CAAC;IACpD,WAAW,CAAC,EAAE,OAAO,CAAC;IACtB,4EAA4E;IAC5E,QAAQ,CAAC,EAAE,OAAO,CAAC;IACnB;;;;OAIG;IACH,eAAe,CAAC,EAAE,OAAO,CAAC;IAC1B,iEAAiE;IACjE,OAAO,CAAC,EAAE,MAAM,IAAI,CAAC;CACtB;AAyCD,eAAO,MAAM,oBAAoB,EAAE,EAAE,CAAC,KAAK,CAqU1C,CAAC"}
|
|
@@ -5,179 +5,199 @@ import { useAssistantTr as n } from "../i18n.js";
|
|
|
5
5
|
import { copyToClipboard as r } from "../clipboard.js";
|
|
6
6
|
import { AssistantMarkdownRenderer as i } from "./AssistantMarkdownRenderer.js";
|
|
7
7
|
import { downloadAssistantArtifact as a } from "../api.js";
|
|
8
|
-
import {
|
|
8
|
+
import { getAssistantDisplayContent as o } from "../displayContent.js";
|
|
9
9
|
import { AssistantToolActivity as s, parseToolActivity as c } from "./AssistantToolActivity.js";
|
|
10
|
-
import {
|
|
11
|
-
import {
|
|
12
|
-
import {
|
|
13
|
-
import {
|
|
14
|
-
import {
|
|
10
|
+
import { AssistantAvatar as l } from "./AssistantAvatar.js";
|
|
11
|
+
import { useAssistantSpeech as u } from "./AssistantSpeechProvider.js";
|
|
12
|
+
import { AssistantMessageAttachments as d } from "./AssistantMessageAttachments.js";
|
|
13
|
+
import { AssistantPendingWriteCard as f } from "./AssistantPendingWriteCard.js";
|
|
14
|
+
import { AssistantSpeakButton as p } from "./AssistantSpeakButton.js";
|
|
15
|
+
import { SaveToFilesButton as m } from "../../../storage/SaveToFilesButton.js";
|
|
15
16
|
import "../../../storage/index.js";
|
|
16
|
-
import {
|
|
17
|
-
import {
|
|
18
|
-
import {
|
|
17
|
+
import { AssistantTurnActivity as h } from "./AssistantTurnActivity.js";
|
|
18
|
+
import { useMemo as g, useState as _ } from "react";
|
|
19
|
+
import { Check as v, Copy as y, RotateCcw as b } from "lucide-react";
|
|
20
|
+
import { Fragment as x, jsx as S, jsxs as C } from "react/jsx-runtime";
|
|
19
21
|
//#region src/shared/assistant/ui/AssistantMessageItem.tsx
|
|
20
|
-
function
|
|
22
|
+
function w(e) {
|
|
21
23
|
return e.role === "assistant" ? e.metadata : void 0;
|
|
22
24
|
}
|
|
23
|
-
function
|
|
25
|
+
function T(e) {
|
|
24
26
|
return e?.artifacts ?? [];
|
|
25
27
|
}
|
|
26
|
-
function
|
|
28
|
+
function E(e) {
|
|
27
29
|
return window.atob(e);
|
|
28
30
|
}
|
|
29
|
-
function
|
|
30
|
-
let r =
|
|
31
|
+
function D(e, t, n) {
|
|
32
|
+
let r = E(e), i = new Uint8Array(r.length);
|
|
31
33
|
for (let e = 0; e < r.length; e += 1) i[e] = r.charCodeAt(e);
|
|
32
34
|
let a = new Blob([i], { type: n }), o = URL.createObjectURL(a), s = document.createElement("a");
|
|
33
35
|
s.href = o, s.download = t, document.body.appendChild(s), s.click(), document.body.removeChild(s), URL.revokeObjectURL(o);
|
|
34
36
|
}
|
|
35
|
-
var
|
|
36
|
-
let
|
|
37
|
+
var O = ({ onApprovePendingWrite: E, approvingWriteRef: O = null, message: k, processing: A, isStreaming: j, isFailed: M, isLastAssistant: N, onRetry: P }) => {
|
|
38
|
+
let F = n(), I = t(), { getAccessToken: L, getWorkspaceToken: R } = e(), z = u(), [B, V] = _(null), [H, U] = _(!1), W = k.role === "user", G = g(() => w(k), [k]), K = g(() => T(G), [G]), q = A === void 0 ? j ? {
|
|
39
|
+
status: "streaming",
|
|
40
|
+
messageId: k.id,
|
|
41
|
+
updatedAt: k.timestamp
|
|
42
|
+
} : null : A, J = o(k, q, F), { steps: Y, text: X } = g(() => W ? {
|
|
37
43
|
steps: [],
|
|
38
|
-
text:
|
|
39
|
-
} :
|
|
40
|
-
|
|
41
|
-
|
|
44
|
+
text: k.content
|
|
45
|
+
} : J.kind === "output" ? c(J.text) : {
|
|
46
|
+
steps: [],
|
|
47
|
+
text: ""
|
|
48
|
+
}, [
|
|
49
|
+
W,
|
|
50
|
+
k.content,
|
|
51
|
+
J.kind,
|
|
52
|
+
J.text
|
|
53
|
+
]), Z = () => {
|
|
54
|
+
r(X).then((e) => {
|
|
55
|
+
e && (U(!0), setTimeout(() => U(!1), 2e3));
|
|
42
56
|
});
|
|
43
|
-
},
|
|
44
|
-
if (!
|
|
57
|
+
}, Q = async (e) => {
|
|
58
|
+
if (!G?.sandboxId || !G.sessionId) return;
|
|
45
59
|
let t = new URLSearchParams(window.location.search).get("workspace") ?? "";
|
|
46
60
|
if (t) {
|
|
47
|
-
|
|
61
|
+
V(e.path);
|
|
48
62
|
try {
|
|
49
|
-
let n = await a(
|
|
50
|
-
accessToken:
|
|
51
|
-
workspaceToken:
|
|
63
|
+
let n = await a(G.sandboxId, t, G.sessionId, e.path, {
|
|
64
|
+
accessToken: L(),
|
|
65
|
+
workspaceToken: R()
|
|
52
66
|
});
|
|
53
|
-
|
|
67
|
+
D(n.contentBase64, n.filename, n.mimeType);
|
|
54
68
|
} finally {
|
|
55
|
-
|
|
69
|
+
V(null);
|
|
56
70
|
}
|
|
57
71
|
}
|
|
58
|
-
},
|
|
72
|
+
}, $ = new Date(k.timestamp).toLocaleTimeString([], {
|
|
59
73
|
hour: "2-digit",
|
|
60
74
|
minute: "2-digit"
|
|
61
75
|
});
|
|
62
|
-
if (
|
|
76
|
+
if (k.role === "system") return /* @__PURE__ */ S("div", {
|
|
63
77
|
className: "flex justify-center px-2 py-1",
|
|
64
78
|
"data-testid": "assistant-message-system",
|
|
65
|
-
children: /* @__PURE__ */
|
|
79
|
+
children: /* @__PURE__ */ S("p", {
|
|
66
80
|
className: "max-w-[90%] whitespace-pre-wrap break-words rounded-lg border border-border-subtle bg-bg-sunken/60 px-3 py-2 text-center text-xs leading-relaxed text-text-muted",
|
|
67
|
-
children:
|
|
81
|
+
children: k.content
|
|
68
82
|
})
|
|
69
83
|
});
|
|
70
|
-
if (
|
|
71
|
-
let e =
|
|
72
|
-
return /* @__PURE__ */
|
|
84
|
+
if (W) {
|
|
85
|
+
let e = k.metadata?.attachments ?? [];
|
|
86
|
+
return /* @__PURE__ */ S("div", {
|
|
73
87
|
className: "flex justify-end",
|
|
74
88
|
"data-testid": "assistant-message-user",
|
|
75
|
-
children: /* @__PURE__ */
|
|
89
|
+
children: /* @__PURE__ */ C("div", {
|
|
76
90
|
className: "max-w-[85%]",
|
|
77
91
|
children: [
|
|
78
|
-
|
|
92
|
+
k.content && /* @__PURE__ */ S("div", {
|
|
79
93
|
className: "rounded-2xl rounded-br-md bg-action-primary-bg/12 px-3.5 py-2.5 text-[15px] leading-relaxed text-text-primary",
|
|
80
|
-
children: /* @__PURE__ */
|
|
94
|
+
children: /* @__PURE__ */ S("p", {
|
|
81
95
|
className: "whitespace-pre-wrap",
|
|
82
|
-
children:
|
|
96
|
+
children: k.content
|
|
83
97
|
})
|
|
84
98
|
}),
|
|
85
|
-
/* @__PURE__ */
|
|
86
|
-
/* @__PURE__ */
|
|
99
|
+
/* @__PURE__ */ S(d, { attachments: e }),
|
|
100
|
+
/* @__PURE__ */ S("div", {
|
|
87
101
|
className: "mt-1 pr-1 text-right text-[10px] text-text-muted",
|
|
88
|
-
children:
|
|
102
|
+
children: $
|
|
89
103
|
})
|
|
90
104
|
]
|
|
91
105
|
})
|
|
92
106
|
});
|
|
93
107
|
}
|
|
94
|
-
return /* @__PURE__ */
|
|
108
|
+
return /* @__PURE__ */ C("div", {
|
|
95
109
|
className: "flex gap-2.5",
|
|
96
110
|
"data-testid": "assistant-message-assistant",
|
|
97
|
-
children: [/* @__PURE__ */
|
|
111
|
+
children: [/* @__PURE__ */ S(l, { active: j }), /* @__PURE__ */ C("div", {
|
|
98
112
|
className: "min-w-0 flex-1",
|
|
99
113
|
children: [
|
|
100
|
-
|
|
101
|
-
|
|
102
|
-
pendingWrite:
|
|
103
|
-
onApprove:
|
|
104
|
-
approving:
|
|
114
|
+
Y.length > 0 && /* @__PURE__ */ S(s, { steps: Y }),
|
|
115
|
+
G?.pendingWrite ? /* @__PURE__ */ S(f, {
|
|
116
|
+
pendingWrite: G.pendingWrite,
|
|
117
|
+
onApprove: E,
|
|
118
|
+
approving: O !== null && O === G.pendingWrite.reference
|
|
105
119
|
}) : null,
|
|
106
|
-
|
|
120
|
+
X && /* @__PURE__ */ S("div", {
|
|
107
121
|
className: "text-[15px] leading-relaxed text-text-primary",
|
|
108
|
-
children: /* @__PURE__ */
|
|
122
|
+
children: /* @__PURE__ */ S(i, { content: X })
|
|
123
|
+
}),
|
|
124
|
+
J.kind === "working" && /* @__PURE__ */ S(h, { processing: q }),
|
|
125
|
+
J.kind === "stopped" && /* @__PURE__ */ S("p", {
|
|
126
|
+
className: "text-[15px] leading-relaxed text-text-secondary",
|
|
127
|
+
"data-testid": "assistant-turn-stopped",
|
|
128
|
+
children: J.text
|
|
109
129
|
}),
|
|
110
|
-
|
|
130
|
+
j && /* @__PURE__ */ S("span", {
|
|
111
131
|
"aria-hidden": "true",
|
|
112
132
|
className: "ml-0.5 inline-block h-4 w-1.5 rounded-sm bg-text-secondary align-middle motion-safe:animate-pulse"
|
|
113
133
|
}),
|
|
114
|
-
|
|
134
|
+
K.length > 0 && G?.sandboxId && G.sessionId && /* @__PURE__ */ C("div", {
|
|
115
135
|
className: "mt-3 space-y-2 border-t border-border-subtle pt-2",
|
|
116
|
-
children: [/* @__PURE__ */
|
|
136
|
+
children: [/* @__PURE__ */ S("p", {
|
|
117
137
|
className: "text-[10px] font-medium uppercase tracking-wide text-text-muted",
|
|
118
|
-
children:
|
|
119
|
-
}), /* @__PURE__ */
|
|
138
|
+
children: F("message.downloads", "Downloads")
|
|
139
|
+
}), /* @__PURE__ */ S("div", {
|
|
120
140
|
className: "flex flex-wrap gap-2",
|
|
121
|
-
children:
|
|
141
|
+
children: K.map((e) => {
|
|
122
142
|
let t = `${e.name}${e.type === "directory" ? ".tar.gz" : ""}`;
|
|
123
|
-
return /* @__PURE__ */
|
|
143
|
+
return /* @__PURE__ */ S(m, {
|
|
124
144
|
label: t,
|
|
125
|
-
disabled:
|
|
145
|
+
disabled: B === e.path,
|
|
126
146
|
testId: `assistant-artifact-${e.name}`,
|
|
127
147
|
source: {
|
|
128
148
|
kind: "sandbox-artifact",
|
|
129
|
-
sandboxId:
|
|
130
|
-
sessionId:
|
|
149
|
+
sandboxId: G.sandboxId,
|
|
150
|
+
sessionId: G.sessionId,
|
|
131
151
|
path: e.path,
|
|
132
152
|
filename: t
|
|
133
153
|
},
|
|
134
|
-
defaultFolderPath:
|
|
135
|
-
onDownload: () =>
|
|
154
|
+
defaultFolderPath: I.artifacts,
|
|
155
|
+
onDownload: () => Q(e)
|
|
136
156
|
}, e.path);
|
|
137
157
|
})
|
|
138
158
|
})]
|
|
139
159
|
}),
|
|
140
|
-
!
|
|
160
|
+
!j && (X || M || N) && /* @__PURE__ */ C("div", {
|
|
141
161
|
className: "mt-1.5 flex items-center gap-1",
|
|
142
162
|
children: [
|
|
143
|
-
|
|
163
|
+
X && /* @__PURE__ */ S("button", {
|
|
144
164
|
type: "button",
|
|
145
|
-
onClick:
|
|
165
|
+
onClick: Z,
|
|
146
166
|
className: "flex items-center gap-1 rounded-md px-1.5 py-1 text-[11px] text-text-muted transition-colors hover:bg-bg-elevated hover:text-text-secondary",
|
|
147
|
-
"aria-label":
|
|
167
|
+
"aria-label": F("message.copy", "Copy message"),
|
|
148
168
|
"data-testid": "assistant-message-copy",
|
|
149
|
-
children:
|
|
169
|
+
children: H ? /* @__PURE__ */ C(x, { children: [/* @__PURE__ */ S(v, { className: "size-3 text-status-success-text" }), /* @__PURE__ */ S("span", { children: F("message.copied", "Copied") })] }) : /* @__PURE__ */ C(x, { children: [/* @__PURE__ */ S(y, { className: "size-3" }), /* @__PURE__ */ S("span", { children: F("message.copy", "Copy") })] })
|
|
150
170
|
}),
|
|
151
|
-
|
|
152
|
-
let e =
|
|
153
|
-
return /* @__PURE__ */ x
|
|
154
|
-
isSpeaking:
|
|
171
|
+
X && z.isSupported && (() => {
|
|
172
|
+
let e = z.blockedFor(k.id) ?? z.disabledReason, t = !!e && !!N, n = t ? `speak-reason-${k.id}` : void 0;
|
|
173
|
+
return /* @__PURE__ */ C(x, { children: [/* @__PURE__ */ S(p, {
|
|
174
|
+
isSpeaking: z.isSpeaking(k.id),
|
|
155
175
|
disabled: e !== null,
|
|
156
176
|
disabledReason: e,
|
|
157
177
|
describedById: n,
|
|
158
|
-
onClick: () =>
|
|
159
|
-
}), t && /* @__PURE__ */
|
|
178
|
+
onClick: () => z.toggle(k.id, X, G?.lang)
|
|
179
|
+
}), t && /* @__PURE__ */ S("span", {
|
|
160
180
|
id: n,
|
|
161
181
|
className: "text-[11px] text-text-muted",
|
|
162
182
|
"data-testid": "assistant-speak-reason",
|
|
163
183
|
children: e
|
|
164
184
|
})] });
|
|
165
185
|
})(),
|
|
166
|
-
(
|
|
186
|
+
(M || N) && P && /* @__PURE__ */ C("button", {
|
|
167
187
|
type: "button",
|
|
168
|
-
onClick:
|
|
169
|
-
className: `flex items-center gap-1 rounded-md px-1.5 py-1 text-[11px] transition-colors hover:bg-bg-elevated ${
|
|
170
|
-
"aria-label":
|
|
188
|
+
onClick: P,
|
|
189
|
+
className: `flex items-center gap-1 rounded-md px-1.5 py-1 text-[11px] transition-colors hover:bg-bg-elevated ${M ? "text-status-error-text" : "text-text-muted hover:text-text-secondary"}`,
|
|
190
|
+
"aria-label": F("message.retry", "Retry"),
|
|
171
191
|
"data-testid": "assistant-message-retry",
|
|
172
|
-
children: [/* @__PURE__ */ b
|
|
192
|
+
children: [/* @__PURE__ */ S(b, { className: "size-3" }), /* @__PURE__ */ S("span", { children: F("message.retry", "Retry") })]
|
|
173
193
|
})
|
|
174
194
|
]
|
|
175
195
|
}),
|
|
176
|
-
/* @__PURE__ */
|
|
196
|
+
/* @__PURE__ */ C("div", {
|
|
177
197
|
className: "mt-1 text-[10px] text-text-muted",
|
|
178
|
-
children: [
|
|
198
|
+
children: [$, k.tokens && /* @__PURE__ */ C("span", {
|
|
179
199
|
className: "ml-2",
|
|
180
|
-
children: [
|
|
200
|
+
children: [k.tokens.input + k.tokens.output, " tokens"]
|
|
181
201
|
})]
|
|
182
202
|
})
|
|
183
203
|
]
|
|
@@ -185,4 +205,4 @@ var E = ({ onApprovePendingWrite: w, approvingWriteRef: E = null, message: D, is
|
|
|
185
205
|
});
|
|
186
206
|
};
|
|
187
207
|
//#endregion
|
|
188
|
-
export {
|
|
208
|
+
export { O as AssistantMessageItem };
|
|
@@ -1,10 +1,16 @@
|
|
|
1
1
|
import { FC } from 'react';
|
|
2
|
-
import { Message } from '../conversation';
|
|
2
|
+
import { AssistantConversationProcessing, Message } from '../conversation';
|
|
3
3
|
interface Props {
|
|
4
4
|
/** Forwarded to each pending-write card; see AssistantPendingWriteCard. */
|
|
5
5
|
onApprovePendingWrite?: (reference: string) => void;
|
|
6
6
|
approvingWriteRef?: string | null;
|
|
7
7
|
messages: Message[];
|
|
8
|
+
/**
|
|
9
|
+
* The conversation's processing entry, which each item reads to decide what
|
|
10
|
+
* a turn is showing: live waiting copy, output, or "Stopped". Optional for
|
|
11
|
+
* hosts that mount the list directly; see `AssistantMessageItem`.
|
|
12
|
+
*/
|
|
13
|
+
processing?: AssistantConversationProcessing | null;
|
|
8
14
|
streamingMessageId: string | null;
|
|
9
15
|
/** The assistant message (if any) whose turn ended in an error. */
|
|
10
16
|
failedMessageId?: string | null;
|
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"AssistantMessageList.d.ts","sourceRoot":"","sources":["../../../../src/shared/assistant/ui/AssistantMessageList.tsx"],"names":[],"mappings":"AAAA,OAAO,EAAqB,KAAK,EAAE,EAAE,MAAM,OAAO,CAAC;AAEnD,OAAO,KAAK,EAAE,OAAO,EAAE,MAAM,iBAAiB,CAAC;
|
|
1
|
+
{"version":3,"file":"AssistantMessageList.d.ts","sourceRoot":"","sources":["../../../../src/shared/assistant/ui/AssistantMessageList.tsx"],"names":[],"mappings":"AAAA,OAAO,EAAqB,KAAK,EAAE,EAAE,MAAM,OAAO,CAAC;AAEnD,OAAO,KAAK,EAAE,+BAA+B,EAAE,OAAO,EAAE,MAAM,iBAAiB,CAAC;AAGhF,UAAU,KAAK;IACb,2EAA2E;IAC3E,qBAAqB,CAAC,EAAE,CAAC,SAAS,EAAE,MAAM,KAAK,IAAI,CAAC;IACpD,iBAAiB,CAAC,EAAE,MAAM,GAAG,IAAI,CAAC;IAClC,QAAQ,EAAE,OAAO,EAAE,CAAC;IACpB;;;;OAIG;IACH,UAAU,CAAC,EAAE,+BAA+B,GAAG,IAAI,CAAC;IACpD,kBAAkB,EAAE,MAAM,GAAG,IAAI,CAAC;IAClC,mEAAmE;IACnE,eAAe,CAAC,EAAE,MAAM,GAAG,IAAI,CAAC;IAChC,kEAAkE;IAClE,OAAO,CAAC,EAAE,MAAM,IAAI,CAAC;CACtB;AAED,eAAO,MAAM,oBAAoB,EAAE,EAAE,CAAC,KAAK,CAgF1C,CAAC"}
|