@burdenoff/fe-libs 2026.913.1 → 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.
Files changed (67) hide show
  1. package/dist/shared/assistant/conversation.d.ts +29 -0
  2. package/dist/shared/assistant/conversation.d.ts.map +1 -1
  3. package/dist/shared/assistant/displayContent.d.ts +57 -0
  4. package/dist/shared/assistant/displayContent.d.ts.map +1 -0
  5. package/dist/shared/assistant/displayContent.js +26 -0
  6. package/dist/shared/assistant/exportConversation.d.ts +12 -2
  7. package/dist/shared/assistant/exportConversation.d.ts.map +1 -1
  8. package/dist/shared/assistant/exportConversation.js +24 -22
  9. package/dist/shared/assistant/index.d.ts +9 -0
  10. package/dist/shared/assistant/index.d.ts.map +1 -1
  11. package/dist/shared/assistant/legacyFiller.d.ts +60 -0
  12. package/dist/shared/assistant/legacyFiller.d.ts.map +1 -0
  13. package/dist/shared/assistant/legacyFiller.js +35 -0
  14. package/dist/shared/assistant/preview/previewTransitions.d.ts +15 -1
  15. package/dist/shared/assistant/preview/previewTransitions.d.ts.map +1 -1
  16. package/dist/shared/assistant/preview/previewTransitions.js +5 -2
  17. package/dist/shared/assistant/preview/useAssistantPreviewBridge.d.ts.map +1 -1
  18. package/dist/shared/assistant/preview/useAssistantPreviewBridge.js +51 -52
  19. package/dist/shared/assistant/spokenTurns.d.ts +25 -0
  20. package/dist/shared/assistant/spokenTurns.d.ts.map +1 -0
  21. package/dist/shared/assistant/spokenTurns.js +12 -0
  22. package/dist/shared/assistant/stageCopy.d.ts +23 -34
  23. package/dist/shared/assistant/stageCopy.d.ts.map +1 -1
  24. package/dist/shared/assistant/stageCopy.js +7 -16
  25. package/dist/shared/assistant/store.d.ts +10 -2
  26. package/dist/shared/assistant/store.d.ts.map +1 -1
  27. package/dist/shared/assistant/store.js +16 -9
  28. package/dist/shared/assistant/turnActivity.d.ts +66 -0
  29. package/dist/shared/assistant/turnActivity.d.ts.map +1 -0
  30. package/dist/shared/assistant/turnActivity.js +41 -0
  31. package/dist/shared/assistant/turnProgress.d.ts +51 -0
  32. package/dist/shared/assistant/turnProgress.d.ts.map +1 -0
  33. package/dist/shared/assistant/turnProgress.js +27 -0
  34. package/dist/shared/assistant/ui/AssistantChatArea.d.ts.map +1 -1
  35. package/dist/shared/assistant/ui/AssistantChatArea.js +362 -379
  36. package/dist/shared/assistant/ui/AssistantConversationList.d.ts.map +1 -1
  37. package/dist/shared/assistant/ui/AssistantConversationList.js +81 -80
  38. package/dist/shared/assistant/ui/AssistantMessageItem.d.ts +12 -1
  39. package/dist/shared/assistant/ui/AssistantMessageItem.d.ts.map +1 -1
  40. package/dist/shared/assistant/ui/AssistantMessageItem.js +103 -83
  41. package/dist/shared/assistant/ui/AssistantMessageList.d.ts +7 -1
  42. package/dist/shared/assistant/ui/AssistantMessageList.d.ts.map +1 -1
  43. package/dist/shared/assistant/ui/AssistantMessageList.js +16 -15
  44. package/dist/shared/assistant/ui/AssistantMoreMenu.d.ts.map +1 -1
  45. package/dist/shared/assistant/ui/AssistantMoreMenu.js +23 -20
  46. package/dist/shared/assistant/ui/AssistantTurnActivity.d.ts +37 -0
  47. package/dist/shared/assistant/ui/AssistantTurnActivity.d.ts.map +1 -0
  48. package/dist/shared/assistant/ui/AssistantTurnActivity.js +33 -0
  49. package/dist/shared/assistant/ui/voice/AssistantVoiceSession.d.ts.map +1 -1
  50. package/dist/shared/assistant/ui/voice/AssistantVoiceSession.js +112 -102
  51. package/dist/shared/assistant/ui/voice/VoiceMiniController.d.ts +10 -0
  52. package/dist/shared/assistant/ui/voice/VoiceMiniController.d.ts.map +1 -1
  53. package/dist/shared/assistant/ui/voice/VoiceMiniController.js +29 -28
  54. package/dist/shared/assistant/ui/voice/VoiceStage.d.ts +10 -0
  55. package/dist/shared/assistant/ui/voice/VoiceStage.d.ts.map +1 -1
  56. package/dist/shared/assistant/ui/voice/VoiceStage.js +35 -34
  57. package/dist/shared/assistant/ui/voice/VoiceStatusText.d.ts +51 -0
  58. package/dist/shared/assistant/ui/voice/VoiceStatusText.d.ts.map +1 -0
  59. package/dist/shared/assistant/ui/voice/VoiceStatusText.js +42 -0
  60. package/dist/shared/assistant/voice/rotationClock.d.ts +31 -0
  61. package/dist/shared/assistant/voice/rotationClock.d.ts.map +1 -0
  62. package/dist/shared/assistant/voice/rotationClock.js +27 -0
  63. package/dist/shared/assistant/voice/voiceStatus.d.ts +81 -0
  64. package/dist/shared/assistant/voice/voiceStatus.d.ts.map +1 -0
  65. package/dist/shared/assistant/voice/voiceStatus.js +33 -0
  66. package/dist/shared-assistant.js +94 -85
  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;AAgB1C,eAAO,MAAM,yBAAyB,EAAE,EAuQvC,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 { useOverlayFocus as i } from "./useOverlayFocus.js";
6
- import { useState as a } from "react";
7
- import { Check as o, MessageSquare as s, PanelLeftClose as c, Pencil as l, Plus as u, Trash2 as d } from "lucide-react";
8
- import { Fragment as f, jsx as p, jsxs as m } from "react/jsx-runtime";
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 h = () => {
11
- let h = t(), { modes: g } = e(), { conversations: _, activeConversationId: v, processingByConversationId: y, setActiveConversation: b, setMode: x, createConversation: S, deleteConversation: C, renameConversation: w, setConversationListOpen: T } = r(), [E, D] = a(null), [O, k] = a(""), A = () => {
12
- S(), T(!1);
13
- }, j = (e) => {
14
- let t = _.find((t) => t.id === e);
15
- b(e), t && x(t.mode), T(!1);
16
- }, M = (e, t) => {
17
- D(e), k(t);
18
- }, N = () => {
19
- E && O.trim() && w(E, O.trim()), D(null);
20
- }, P = (e, t) => {
21
- e.stopPropagation(), C(t);
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__ */ m("div", {
24
- ref: i("assistant-open-history"),
24
+ return /* @__PURE__ */ h("div", {
25
+ ref: a("assistant-open-history"),
25
26
  tabIndex: -1,
26
27
  role: "region",
27
- "aria-label": h("conversations.title", "History"),
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__ */ m("div", {
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__ */ p("span", {
33
+ children: [/* @__PURE__ */ m("span", {
33
34
  className: "text-[13px] font-semibold text-text-primary",
34
- children: h("conversations.title", "History")
35
- }), /* @__PURE__ */ m("div", {
35
+ children: g("conversations.title", "History")
36
+ }), /* @__PURE__ */ h("div", {
36
37
  className: "flex items-center gap-0.5",
37
- children: [/* @__PURE__ */ p("button", {
38
+ children: [/* @__PURE__ */ m("button", {
38
39
  type: "button",
39
- onClick: A,
40
+ onClick: j,
40
41
  className: "p-1.5 rounded-lg text-text-secondary hover:bg-bg-sunken transition-colors",
41
- "aria-label": h("conversations.new", "New conversation"),
42
+ "aria-label": g("conversations.new", "New conversation"),
42
43
  "data-testid": "new-conversation",
43
- children: /* @__PURE__ */ p(u, { className: "size-4" })
44
- }), /* @__PURE__ */ m("button", {
44
+ children: /* @__PURE__ */ m(d, { className: "size-4" })
45
+ }), /* @__PURE__ */ h("button", {
45
46
  type: "button",
46
- onClick: () => T(!1),
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": h("conversations.collapse", "Collapse history"),
49
+ "aria-label": g("conversations.collapse", "Collapse history"),
49
50
  "data-testid": "collapse-conversation-list",
50
- children: [/* @__PURE__ */ p(c, { className: "size-4" }), /* @__PURE__ */ p("span", {
51
+ children: [/* @__PURE__ */ m(l, { className: "size-4" }), /* @__PURE__ */ m("span", {
51
52
  className: "text-[11px] font-medium",
52
- children: h("conversations.collapseLabel", "Collapse")
53
+ children: g("conversations.collapseLabel", "Collapse")
53
54
  })]
54
55
  })]
55
56
  })]
56
- }), /* @__PURE__ */ p("div", {
57
+ }), /* @__PURE__ */ m("div", {
57
58
  className: "flex-1 overflow-y-auto",
58
- children: _.length === 0 ? /* @__PURE__ */ m("div", {
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__ */ p(s, { className: "size-6 text-text-muted mb-2" }),
62
- /* @__PURE__ */ p("p", {
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: h("conversations.empty", "No conversations yet")
65
+ children: g("conversations.empty", "No conversations yet")
65
66
  }),
66
- /* @__PURE__ */ p("button", {
67
+ /* @__PURE__ */ m("button", {
67
68
  type: "button",
68
- onClick: A,
69
+ onClick: j,
69
70
  className: "mt-2 text-xs text-action-primary-bg hover:underline",
70
- children: h("conversations.startNew", "Start a new conversation")
71
+ children: g("conversations.startNew", "Start a new conversation")
71
72
  })
72
73
  ]
73
- }) : /* @__PURE__ */ p("div", {
74
+ }) : /* @__PURE__ */ m("div", {
74
75
  className: "py-1",
75
- children: _.map((e) => {
76
- let t = e.id === v, r = e.id === E, i = g.find((t) => t.id === e.mode), a = n(e.messages), s = a[a.length - 1], c = a.length === 0 && e.messages.length > 0, u = y[e.id];
77
- return /* @__PURE__ */ p("div", {
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 && j(e.id));
82
+ (t.key === "Enter" || t.key === " ") && (t.preventDefault(), !r && M(e.id));
82
83
  },
83
- onClick: () => !r && j(e.id),
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__ */ m("div", {
86
+ children: r ? /* @__PURE__ */ h("div", {
86
87
  className: "flex items-center gap-1",
87
- children: [/* @__PURE__ */ p("input", {
88
- "aria-label": h("conversations.renameLabel", "Conversation title"),
89
- value: O,
90
- onChange: (e) => k(e.target.value),
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" && N(), e.key === "Escape" && (e.preventDefault(), e.stopPropagation(), D(null));
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__ */ p("button", {
97
+ }), /* @__PURE__ */ m("button", {
97
98
  type: "button",
98
99
  onClick: (e) => {
99
- e.stopPropagation(), N();
100
+ e.stopPropagation(), P();
100
101
  },
101
102
  className: "p-1 hover:bg-bg-sunken rounded",
102
- "aria-label": h("conversations.saveTitle", "Save title"),
103
- children: /* @__PURE__ */ p(o, { className: "size-3 text-status-success-text" })
103
+ "aria-label": g("conversations.saveTitle", "Save title"),
104
+ children: /* @__PURE__ */ m(s, { className: "size-3 text-status-success-text" })
104
105
  })]
105
- }) : /* @__PURE__ */ m(f, { children: [
106
- /* @__PURE__ */ m("div", {
106
+ }) : /* @__PURE__ */ h(p, { children: [
107
+ /* @__PURE__ */ h("div", {
107
108
  className: "flex items-center justify-between",
108
- children: [/* @__PURE__ */ p("span", {
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__ */ m("div", {
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__ */ p("button", {
114
+ children: [/* @__PURE__ */ m("button", {
114
115
  type: "button",
115
116
  onClick: (t) => {
116
- t.stopPropagation(), M(e.id, e.title);
117
+ t.stopPropagation(), N(e.id, e.title);
117
118
  },
118
119
  className: "p-0.5 hover:bg-bg-sunken rounded",
119
- "aria-label": h("conversations.rename", "Rename conversation"),
120
- children: /* @__PURE__ */ p(l, { className: "size-3 text-text-muted" })
121
- }), /* @__PURE__ */ p("button", {
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) => P(t, e.id),
124
+ onClick: (t) => F(t, e.id),
124
125
  className: "p-0.5 hover:bg-bg-sunken rounded",
125
- "aria-label": h("conversations.delete", "Delete conversation"),
126
+ "aria-label": g("conversations.delete", "Delete conversation"),
126
127
  "data-testid": "delete-conversation",
127
- children: /* @__PURE__ */ p(d, { className: "size-3 text-status-error-text" })
128
+ children: /* @__PURE__ */ m(f, { className: "size-3 text-status-error-text" })
128
129
  })]
129
130
  })]
130
131
  }),
131
- /* @__PURE__ */ m("div", {
132
+ /* @__PURE__ */ h("div", {
132
133
  className: "flex items-center gap-1.5 mt-0.5",
133
134
  children: [
134
- /* @__PURE__ */ p("span", {
135
+ /* @__PURE__ */ m("span", {
135
136
  className: "text-[10px] text-text-muted px-1 py-0.5 bg-bg-sunken rounded",
136
- children: i?.label ?? e.mode
137
+ children: a?.label ?? e.mode
137
138
  }),
138
- /* @__PURE__ */ m("span", {
139
+ /* @__PURE__ */ h("span", {
139
140
  className: "text-[10px] text-text-muted",
140
- children: [a.length, " msgs"]
141
+ children: [o.length, " msgs"]
141
142
  }),
142
- u && u.status !== "idle" && /* @__PURE__ */ p("span", {
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: u.status
145
+ children: d.status
145
146
  })
146
147
  ]
147
148
  }),
148
- s && /* @__PURE__ */ p("p", {
149
+ v && /* @__PURE__ */ m("p", {
149
150
  className: "text-[10px] text-text-muted truncate mt-0.5",
150
- children: s.content.slice(0, 60)
151
+ children: v
151
152
  }),
152
- c && /* @__PURE__ */ p("p", {
153
+ l && /* @__PURE__ */ m("p", {
153
154
  className: "text-[10px] text-text-muted truncate mt-0.5",
154
- children: h("conversationList.voiceOnly", "Spoken conversation")
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 { h as AssistantConversationList };
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;AAsBnD,OAAO,KAAK,EAGV,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,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,CAmS1C,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 { AssistantAvatar as o } from "./AssistantAvatar.js";
8
+ import { getAssistantDisplayContent as o } from "../displayContent.js";
9
9
  import { AssistantToolActivity as s, parseToolActivity as c } from "./AssistantToolActivity.js";
10
- import { useAssistantSpeech as l } from "./AssistantSpeechProvider.js";
11
- import { AssistantMessageAttachments as u } from "./AssistantMessageAttachments.js";
12
- import { AssistantPendingWriteCard as d } from "./AssistantPendingWriteCard.js";
13
- import { AssistantSpeakButton as f } from "./AssistantSpeakButton.js";
14
- import { SaveToFilesButton as p } from "../../../storage/SaveToFilesButton.js";
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 { useMemo as m, useState as h } from "react";
17
- import { Check as g, Copy as _, RotateCcw as v } from "lucide-react";
18
- import { Fragment as y, jsx as b, jsxs as x } from "react/jsx-runtime";
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 S(e) {
22
+ function w(e) {
21
23
  return e.role === "assistant" ? e.metadata : void 0;
22
24
  }
23
- function C(e) {
25
+ function T(e) {
24
26
  return e?.artifacts ?? [];
25
27
  }
26
- function w(e) {
28
+ function E(e) {
27
29
  return window.atob(e);
28
30
  }
29
- function T(e, t, n) {
30
- let r = w(e), i = new Uint8Array(r.length);
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 E = ({ onApprovePendingWrite: w, approvingWriteRef: E = null, message: D, isStreaming: O, isFailed: k, isLastAssistant: A, onRetry: j }) => {
36
- let M = n(), N = t(), { getAccessToken: P, getWorkspaceToken: F } = e(), I = l(), [L, R] = h(null), [z, B] = h(!1), V = D.role === "user", H = m(() => S(D), [D]), U = m(() => C(H), [H]), { steps: W, text: G } = m(() => V ? {
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: D.content
39
- } : c(D.content), [V, D.content]), K = () => {
40
- r(G || D.content).then((e) => {
41
- e && (B(!0), setTimeout(() => B(!1), 2e3));
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
- }, q = async (e) => {
44
- if (!H?.sandboxId || !H.sessionId) return;
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
- R(e.path);
61
+ V(e.path);
48
62
  try {
49
- let n = await a(H.sandboxId, t, H.sessionId, e.path, {
50
- accessToken: P(),
51
- workspaceToken: F()
63
+ let n = await a(G.sandboxId, t, G.sessionId, e.path, {
64
+ accessToken: L(),
65
+ workspaceToken: R()
52
66
  });
53
- T(n.contentBase64, n.filename, n.mimeType);
67
+ D(n.contentBase64, n.filename, n.mimeType);
54
68
  } finally {
55
- R(null);
69
+ V(null);
56
70
  }
57
71
  }
58
- }, J = new Date(D.timestamp).toLocaleTimeString([], {
72
+ }, $ = new Date(k.timestamp).toLocaleTimeString([], {
59
73
  hour: "2-digit",
60
74
  minute: "2-digit"
61
75
  });
62
- if (D.role === "system") return /* @__PURE__ */ b("div", {
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__ */ b("p", {
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: D.content
81
+ children: k.content
68
82
  })
69
83
  });
70
- if (V) {
71
- let e = D.metadata?.attachments ?? [];
72
- return /* @__PURE__ */ b("div", {
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__ */ x("div", {
89
+ children: /* @__PURE__ */ C("div", {
76
90
  className: "max-w-[85%]",
77
91
  children: [
78
- D.content && /* @__PURE__ */ b("div", {
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__ */ b("p", {
94
+ children: /* @__PURE__ */ S("p", {
81
95
  className: "whitespace-pre-wrap",
82
- children: D.content
96
+ children: k.content
83
97
  })
84
98
  }),
85
- /* @__PURE__ */ b(u, { attachments: e }),
86
- /* @__PURE__ */ b("div", {
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: J
102
+ children: $
89
103
  })
90
104
  ]
91
105
  })
92
106
  });
93
107
  }
94
- return /* @__PURE__ */ x("div", {
108
+ return /* @__PURE__ */ C("div", {
95
109
  className: "flex gap-2.5",
96
110
  "data-testid": "assistant-message-assistant",
97
- children: [/* @__PURE__ */ b(o, { active: O }), /* @__PURE__ */ x("div", {
111
+ children: [/* @__PURE__ */ S(l, { active: j }), /* @__PURE__ */ C("div", {
98
112
  className: "min-w-0 flex-1",
99
113
  children: [
100
- W.length > 0 && /* @__PURE__ */ b(s, { steps: W }),
101
- H?.pendingWrite ? /* @__PURE__ */ b(d, {
102
- pendingWrite: H.pendingWrite,
103
- onApprove: w,
104
- approving: E !== null && E === H.pendingWrite.reference
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
- G && /* @__PURE__ */ b("div", {
120
+ X && /* @__PURE__ */ S("div", {
107
121
  className: "text-[15px] leading-relaxed text-text-primary",
108
- children: /* @__PURE__ */ b(i, { content: G })
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
- O && /* @__PURE__ */ b("span", {
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
- U.length > 0 && H?.sandboxId && H.sessionId && /* @__PURE__ */ x("div", {
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__ */ b("p", {
136
+ children: [/* @__PURE__ */ S("p", {
117
137
  className: "text-[10px] font-medium uppercase tracking-wide text-text-muted",
118
- children: M("message.downloads", "Downloads")
119
- }), /* @__PURE__ */ b("div", {
138
+ children: F("message.downloads", "Downloads")
139
+ }), /* @__PURE__ */ S("div", {
120
140
  className: "flex flex-wrap gap-2",
121
- children: U.map((e) => {
141
+ children: K.map((e) => {
122
142
  let t = `${e.name}${e.type === "directory" ? ".tar.gz" : ""}`;
123
- return /* @__PURE__ */ b(p, {
143
+ return /* @__PURE__ */ S(m, {
124
144
  label: t,
125
- disabled: L === e.path,
145
+ disabled: B === e.path,
126
146
  testId: `assistant-artifact-${e.name}`,
127
147
  source: {
128
148
  kind: "sandbox-artifact",
129
- sandboxId: H.sandboxId,
130
- sessionId: H.sessionId,
149
+ sandboxId: G.sandboxId,
150
+ sessionId: G.sessionId,
131
151
  path: e.path,
132
152
  filename: t
133
153
  },
134
- defaultFolderPath: N.artifacts,
135
- onDownload: () => q(e)
154
+ defaultFolderPath: I.artifacts,
155
+ onDownload: () => Q(e)
136
156
  }, e.path);
137
157
  })
138
158
  })]
139
159
  }),
140
- !O && (G || k || A) && /* @__PURE__ */ x("div", {
160
+ !j && (X || M || N) && /* @__PURE__ */ C("div", {
141
161
  className: "mt-1.5 flex items-center gap-1",
142
162
  children: [
143
- G && /* @__PURE__ */ b("button", {
163
+ X && /* @__PURE__ */ S("button", {
144
164
  type: "button",
145
- onClick: K,
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": M("message.copy", "Copy message"),
167
+ "aria-label": F("message.copy", "Copy message"),
148
168
  "data-testid": "assistant-message-copy",
149
- children: z ? /* @__PURE__ */ x(y, { children: [/* @__PURE__ */ b(g, { className: "size-3 text-status-success-text" }), /* @__PURE__ */ b("span", { children: M("message.copied", "Copied") })] }) : /* @__PURE__ */ x(y, { children: [/* @__PURE__ */ b(_, { className: "size-3" }), /* @__PURE__ */ b("span", { children: M("message.copy", "Copy") })] })
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
- G && I.isSupported && (() => {
152
- let e = I.blockedFor(D.id) ?? I.disabledReason, t = !!e && !!A, n = t ? `speak-reason-${D.id}` : void 0;
153
- return /* @__PURE__ */ x(y, { children: [/* @__PURE__ */ b(f, {
154
- isSpeaking: I.isSpeaking(D.id),
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: () => I.toggle(D.id, G, H?.lang)
159
- }), t && /* @__PURE__ */ b("span", {
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
- (k || A) && j && /* @__PURE__ */ x("button", {
186
+ (M || N) && P && /* @__PURE__ */ C("button", {
167
187
  type: "button",
168
- onClick: j,
169
- className: `flex items-center gap-1 rounded-md px-1.5 py-1 text-[11px] transition-colors hover:bg-bg-elevated ${k ? "text-status-error-text" : "text-text-muted hover:text-text-secondary"}`,
170
- "aria-label": M("message.retry", "Retry"),
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(v, { className: "size-3" }), /* @__PURE__ */ b("span", { children: M("message.retry", "Retry") })]
192
+ children: [/* @__PURE__ */ S(b, { className: "size-3" }), /* @__PURE__ */ S("span", { children: F("message.retry", "Retry") })]
173
193
  })
174
194
  ]
175
195
  }),
176
- /* @__PURE__ */ x("div", {
196
+ /* @__PURE__ */ C("div", {
177
197
  className: "mt-1 text-[10px] text-text-muted",
178
- children: [J, D.tokens && /* @__PURE__ */ x("span", {
198
+ children: [$, k.tokens && /* @__PURE__ */ C("span", {
179
199
  className: "ml-2",
180
- children: [D.tokens.input + D.tokens.output, " tokens"]
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 { E as AssistantMessageItem };
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;AAG/C,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,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,CA8E1C,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"}