@burdenoff/fe-libs 2026.928.2 → 2026.929.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 (142) hide show
  1. package/dist/shared/assistant/adminModeSendGate.d.ts +6 -5
  2. package/dist/shared/assistant/adminModeSendGate.d.ts.map +1 -1
  3. package/dist/shared/assistant/adminModeSendGate.js +11 -11
  4. package/dist/shared/assistant/api.d.ts +291 -28
  5. package/dist/shared/assistant/api.d.ts.map +1 -1
  6. package/dist/shared/assistant/api.js +351 -147
  7. package/dist/shared/assistant/autoRouting.d.ts +11 -3
  8. package/dist/shared/assistant/autoRouting.d.ts.map +1 -1
  9. package/dist/shared/assistant/autoRouting.js +7 -7
  10. package/dist/shared/assistant/capabilities.d.ts +28 -0
  11. package/dist/shared/assistant/capabilities.d.ts.map +1 -1
  12. package/dist/shared/assistant/capabilities.js +19 -10
  13. package/dist/shared/assistant/conversation.d.ts +24 -2
  14. package/dist/shared/assistant/conversation.d.ts.map +1 -1
  15. package/dist/shared/assistant/createSandboxAssistantTransport.d.ts.map +1 -1
  16. package/dist/shared/assistant/createSandboxAssistantTransport.js +67 -54
  17. package/dist/shared/assistant/history/historyList.js +1 -1
  18. package/dist/shared/assistant/history/historyMapping.d.ts.map +1 -1
  19. package/dist/shared/assistant/history/historyMapping.js +5 -1
  20. package/dist/shared/assistant/history/historyResume.js +7 -7
  21. package/dist/shared/assistant/i18nManifest.d.ts +53 -0
  22. package/dist/shared/assistant/i18nManifest.d.ts.map +1 -1
  23. package/dist/shared/assistant/i18nManifest.js +75 -16
  24. package/dist/shared/assistant/index.d.ts +15 -0
  25. package/dist/shared/assistant/index.d.ts.map +1 -1
  26. package/dist/shared/assistant/modeCapabilities.js +1 -1
  27. package/dist/shared/assistant/operations.d.ts +22 -0
  28. package/dist/shared/assistant/operations.d.ts.map +1 -1
  29. package/dist/shared/assistant/operations.js +2 -2
  30. package/dist/shared/assistant/prewarm.d.ts +7 -0
  31. package/dist/shared/assistant/prewarm.d.ts.map +1 -1
  32. package/dist/shared/assistant/prewarm.js +1 -1
  33. package/dist/shared/assistant/product.d.ts +80 -2
  34. package/dist/shared/assistant/product.d.ts.map +1 -1
  35. package/dist/shared/assistant/product.js +10 -6
  36. package/dist/shared/assistant/proposalWriteRules.d.ts +40 -0
  37. package/dist/shared/assistant/proposalWriteRules.d.ts.map +1 -0
  38. package/dist/shared/assistant/proposalWriteRules.js +14 -0
  39. package/dist/shared/assistant/store.d.ts +17 -0
  40. package/dist/shared/assistant/store.d.ts.map +1 -1
  41. package/dist/shared/assistant/store.js +50 -43
  42. package/dist/shared/assistant/turnOutcome.d.ts +34 -2
  43. package/dist/shared/assistant/turnOutcome.d.ts.map +1 -1
  44. package/dist/shared/assistant/turnOutcome.js +28 -17
  45. package/dist/shared/assistant/turnOutcomeCopy.d.ts +29 -7
  46. package/dist/shared/assistant/turnOutcomeCopy.d.ts.map +1 -1
  47. package/dist/shared/assistant/turnOutcomeCopy.js +18 -6
  48. package/dist/shared/assistant/types.d.ts +5 -1
  49. package/dist/shared/assistant/types.d.ts.map +1 -1
  50. package/dist/shared/assistant/ui/AssistantApiCallsConsentDialog.js +4 -4
  51. package/dist/shared/assistant/ui/AssistantChatArea.d.ts.map +1 -1
  52. package/dist/shared/assistant/ui/AssistantChatArea.js +989 -718
  53. package/dist/shared/assistant/ui/AssistantConversationList.js +6 -6
  54. package/dist/shared/assistant/ui/AssistantLanguageMenu.js +6 -6
  55. package/dist/shared/assistant/ui/AssistantMessageItem.d.ts +8 -1
  56. package/dist/shared/assistant/ui/AssistantMessageItem.d.ts.map +1 -1
  57. package/dist/shared/assistant/ui/AssistantMessageItem.js +77 -76
  58. package/dist/shared/assistant/ui/AssistantMessageList.d.ts +13 -1
  59. package/dist/shared/assistant/ui/AssistantMessageList.d.ts.map +1 -1
  60. package/dist/shared/assistant/ui/AssistantMessageList.js +15 -13
  61. package/dist/shared/assistant/ui/AssistantReplyLanguageSelector.js +5 -5
  62. package/dist/shared/assistant/ui/AssistantSpeechProvider.js +209 -209
  63. package/dist/shared/assistant/ui/AssistantWriteConfirmDialog.d.ts +62 -0
  64. package/dist/shared/assistant/ui/AssistantWriteConfirmDialog.d.ts.map +1 -0
  65. package/dist/shared/assistant/ui/AssistantWriteConfirmDialog.js +253 -0
  66. package/dist/shared/assistant/ui/AssistantWriteProposalCard.d.ts +72 -0
  67. package/dist/shared/assistant/ui/AssistantWriteProposalCard.d.ts.map +1 -0
  68. package/dist/shared/assistant/ui/AssistantWriteProposalCard.js +439 -0
  69. package/dist/shared/assistant/ui/AssistantWriteProposalSlot.d.ts +40 -0
  70. package/dist/shared/assistant/ui/AssistantWriteProposalSlot.d.ts.map +1 -0
  71. package/dist/shared/assistant/ui/AssistantWriteProposalSlot.js +35 -0
  72. package/dist/shared/assistant/ui/composer/AssistantComposer.js +8 -8
  73. package/dist/shared/assistant/ui/useVoiceSession.d.ts +28 -0
  74. package/dist/shared/assistant/ui/useVoiceSession.d.ts.map +1 -1
  75. package/dist/shared/assistant/ui/useVoiceSession.js +159 -110
  76. package/dist/shared/assistant/ui/useWriteProposalConfirm.d.ts +61 -0
  77. package/dist/shared/assistant/ui/useWriteProposalConfirm.d.ts.map +1 -0
  78. package/dist/shared/assistant/ui/useWriteProposalConfirm.js +109 -0
  79. package/dist/shared/assistant/ui/useWriteProposals.d.ts +102 -0
  80. package/dist/shared/assistant/ui/useWriteProposals.d.ts.map +1 -0
  81. package/dist/shared/assistant/ui/useWriteProposals.js +230 -0
  82. package/dist/shared/assistant/ui/voice/AssistantVoiceSession.d.ts +17 -1
  83. package/dist/shared/assistant/ui/voice/AssistantVoiceSession.d.ts.map +1 -1
  84. package/dist/shared/assistant/ui/voice/AssistantVoiceSession.js +141 -109
  85. package/dist/shared/assistant/ui/writeProposalPresentation.d.ts +76 -0
  86. package/dist/shared/assistant/ui/writeProposalPresentation.d.ts.map +1 -0
  87. package/dist/shared/assistant/ui/writeProposalPresentation.js +110 -0
  88. package/dist/shared/assistant/usageReporting.d.ts +108 -0
  89. package/dist/shared/assistant/usageReporting.d.ts.map +1 -0
  90. package/dist/shared/assistant/usageReporting.js +155 -0
  91. package/dist/shared/assistant/useAssistantApiAccess.d.ts +49 -14
  92. package/dist/shared/assistant/useAssistantApiAccess.d.ts.map +1 -1
  93. package/dist/shared/assistant/useAssistantApiAccess.js +43 -25
  94. package/dist/shared/assistant/useAssistantHeartbeat.d.ts.map +1 -1
  95. package/dist/shared/assistant/useAssistantHeartbeat.js +5 -5
  96. package/dist/shared/assistant/useWorkspaceWriteAccess.d.ts +5 -6
  97. package/dist/shared/assistant/useWorkspaceWriteAccess.d.ts.map +1 -1
  98. package/dist/shared/assistant/voice/voiceSession.d.ts +46 -0
  99. package/dist/shared/assistant/voice/voiceSession.d.ts.map +1 -1
  100. package/dist/shared/assistant/voice/voiceSession.js +35 -2
  101. package/dist/shared/assistant/writeConfirmSeam.d.ts +32 -0
  102. package/dist/shared/assistant/writeConfirmSeam.d.ts.map +1 -0
  103. package/dist/shared/assistant/writeConfirmSeam.js +23 -0
  104. package/dist/shared/assistant/writeModeConsent.d.ts +16 -8
  105. package/dist/shared/assistant/writeModeConsent.d.ts.map +1 -1
  106. package/dist/shared/assistant/writeModeConsent.js +2 -2
  107. package/dist/shared/assistant/writeProposalDiscovery.d.ts +123 -0
  108. package/dist/shared/assistant/writeProposalDiscovery.d.ts.map +1 -0
  109. package/dist/shared/assistant/writeProposalDiscovery.js +210 -0
  110. package/dist/shared/assistant/writeProposalErrorCopy.d.ts +135 -0
  111. package/dist/shared/assistant/writeProposalErrorCopy.d.ts.map +1 -0
  112. package/dist/shared/assistant/writeProposalErrorCopy.js +135 -0
  113. package/dist/shared/assistant/writeProposalVoice.d.ts +133 -0
  114. package/dist/shared/assistant/writeProposalVoice.d.ts.map +1 -0
  115. package/dist/shared/assistant/writeProposalVoice.js +66 -0
  116. package/dist/shared/assistant/writeProposals.d.ts +268 -0
  117. package/dist/shared/assistant/writeProposals.d.ts.map +1 -0
  118. package/dist/shared/assistant/writeProposals.js +445 -0
  119. package/dist/shared/assistant/writeReplyBinder.d.ts +166 -0
  120. package/dist/shared/assistant/writeReplyBinder.d.ts.map +1 -0
  121. package/dist/shared/assistant/writeReplyBinder.js +233 -0
  122. package/dist/shared/assistant/writeReplySend.d.ts +110 -0
  123. package/dist/shared/assistant/writeReplySend.d.ts.map +1 -0
  124. package/dist/shared/assistant/writeReplySend.js +93 -0
  125. package/dist/shared/graphql/fetch.d.ts +12 -1
  126. package/dist/shared/graphql/fetch.d.ts.map +1 -1
  127. package/dist/shared/graphql/fetch.js +101 -80
  128. package/dist/shared/providers/shell/ActiveContextProvider.d.ts.map +1 -1
  129. package/dist/shared/providers/shell/ActiveContextProvider.js +28 -26
  130. package/dist/shared/providers/shell/PersonaSurfaceProvider.d.ts.map +1 -1
  131. package/dist/shared/providers/shell/PersonaSurfaceProvider.js +165 -193
  132. package/dist/shared/providers/shell/personaSurfaceRemote.d.ts +8 -2
  133. package/dist/shared/providers/shell/personaSurfaceRemote.d.ts.map +1 -1
  134. package/dist/shared/providers/shell/personaSurfaceRemote.js +37 -15
  135. package/dist/shared/providers/shell/useRemoteNavPreferences.d.ts +30 -0
  136. package/dist/shared/providers/shell/useRemoteNavPreferences.d.ts.map +1 -0
  137. package/dist/shared/providers/shell/useRemoteNavPreferences.js +43 -0
  138. package/dist/shared-assistant.js +167 -152
  139. package/dist/ui/modal-shell.d.ts +14 -1
  140. package/dist/ui/modal-shell.d.ts.map +1 -1
  141. package/dist/ui/modal-shell.js +8 -6
  142. package/package.json +2 -2
@@ -0,0 +1,439 @@
1
+ import { usePrefersReducedMotion as e } from "./usePrefersReducedMotion.js";
2
+ import { WRITE_PROPOSAL_MASK as t, formatWriteProposalValue as n, redactWriteProposalText as r, useWriteProposalRemainingMs as i, writeProposalArgumentValues as a, writeProposalConfirmState as o, writeProposalCountdownText as ee, writeProposalGatewayText as s, writeProposalKindText as te, writeProposalRootFieldName as c, writeProposalSensitiveTexts as l, writeProposalVariableValues as u } from "./writeProposalPresentation.js";
3
+ import { useEffect as d, useId as ne, useRef as f, useState as p } from "react";
4
+ import { ShieldAlert as re } from "lucide-react";
5
+ import { jsx as m, jsxs as h } from "react/jsx-runtime";
6
+ //#region src/shared/assistant/ui/AssistantWriteProposalCard.tsx
7
+ var g = new Set([
8
+ "destructive",
9
+ "financial",
10
+ "bulk",
11
+ "permission",
12
+ "credential",
13
+ "irreversible"
14
+ ]);
15
+ function _(e) {
16
+ return e.description.confirmSurface.kind === "dialog" || e.risk.kinds.some((e) => g.has(e));
17
+ }
18
+ var v = 500, ie = [
19
+ 0,
20
+ .1,
21
+ .2,
22
+ .3,
23
+ .4,
24
+ .5,
25
+ .6,
26
+ .7,
27
+ .8,
28
+ .9,
29
+ 1
30
+ ];
31
+ function ae(e, t) {
32
+ switch (e.status) {
33
+ case "pending": return t("writeProposal.status.pending", "Waiting for you");
34
+ case "executing": return t("writeProposal.status.executing", "Working…");
35
+ case "succeeded": {
36
+ let n = r((e.result?.summary || e.description.readbackPast).trim(), l(e));
37
+ return n ? t("writeProposal.status.succeeded", "Done — {{summary}}", { summary: n }) : t("writeProposal.status.succeededNoDetail", "Done");
38
+ }
39
+ case "failed": {
40
+ let n = r((e.result?.errors?.find((e) => e.message.trim())?.message ?? e.result?.summary ?? "").trim(), l(e));
41
+ return n ? t("writeProposal.status.failed", "Didn't go through: {{error}}", { error: n }) : t("writeProposal.status.failedNoDetail", "Didn't go through");
42
+ }
43
+ case "outcome_unknown": return t("writeProposal.status.outcomeUnknown", "Couldn't confirm — check before trying again");
44
+ case "declined": return t("writeProposal.status.declined", "Cancelled");
45
+ case "superseded": return t("writeProposal.status.superseded", "Replaced — the conversation moved on");
46
+ case "expired": return t("writeProposal.status.expired", "Expired — nothing was done");
47
+ }
48
+ }
49
+ function oe(e) {
50
+ switch (e.status) {
51
+ case "pending":
52
+ case "outcome_unknown": return "border-status-warning-border bg-status-warning-bg text-status-warning-text";
53
+ case "executing": return "border-status-info-border bg-status-info-bg text-status-info-text";
54
+ case "succeeded": return "border-status-success-border bg-status-success-bg text-status-success-text";
55
+ case "failed": return "border-status-error-border bg-status-error-bg text-status-error-text";
56
+ case "declined":
57
+ case "superseded":
58
+ case "expired": return "border-border-subtle bg-bg-muted text-text-secondary";
59
+ }
60
+ }
61
+ function y(e, t) {
62
+ return [
63
+ {
64
+ key: "label",
65
+ label: t("writeProposal.diff.change", "Change"),
66
+ value: e.description.label,
67
+ sensitive: !1
68
+ },
69
+ {
70
+ key: "gateway",
71
+ label: t("writeProposal.diff.gateway", "Data"),
72
+ value: s(e, t),
73
+ sensitive: !1
74
+ },
75
+ ...e.description.rootFields.flatMap((e) => a(e).map((t) => ({
76
+ ...t,
77
+ label: `${e.alias ?? e.field}.${t.label}`
78
+ }))),
79
+ ...u(e)
80
+ ];
81
+ }
82
+ function se(e, t, r) {
83
+ let i = new Map(y(e, r).map((e) => [e.key, e])), a = y(t, r), o = [];
84
+ for (let e of a) {
85
+ let t = i.get(e.key) ?? null;
86
+ i.delete(e.key), (!t || n(t.value) !== n(e.value)) && o.push({
87
+ key: e.key,
88
+ label: e.label,
89
+ before: t,
90
+ after: e
91
+ });
92
+ }
93
+ for (let e of i.values()) o.push({
94
+ key: e.key,
95
+ label: e.label,
96
+ before: e,
97
+ after: null
98
+ });
99
+ return o;
100
+ }
101
+ function b(e) {
102
+ return typeof e == "object" && !!e && typeof e.then == "function";
103
+ }
104
+ var x = ({ view: g, serverNow: v, capabilities: y, inert: x = !1, turnInFlight: S, tr: C, onApprove: ce, onDecline: le, onReview: ue, onPresented: w, previous: T }) => {
105
+ let E = e(), D = ne(), O = f(null), k = g.status === "pending", A = i(g.expiresAt, v, k), j = A <= 0, [M, de] = p({
106
+ proposalId: g.proposalId,
107
+ keys: /* @__PURE__ */ new Set()
108
+ }), fe = M.proposalId === g.proposalId ? M.keys : /* @__PURE__ */ new Set(), pe = (e) => de((t) => {
109
+ let n = new Set(t.proposalId === g.proposalId ? t.keys : []);
110
+ return n.has(e) ? n.delete(e) : n.add(e), {
111
+ proposalId: g.proposalId,
112
+ keys: n
113
+ };
114
+ }), N = f(null), [P, F] = p(null), I = P?.proposalId === g.proposalId ? P.action : null, L = (e, t) => {
115
+ let n = g.proposalId;
116
+ if (N.current?.proposalId === n) return;
117
+ let r = {
118
+ proposalId: n,
119
+ action: e
120
+ };
121
+ N.current = r, F(r);
122
+ let i = () => {
123
+ N.current === r && (N.current = null, F((e) => e === r ? null : e));
124
+ }, a;
125
+ try {
126
+ a = t();
127
+ } catch (e) {
128
+ throw i(), e;
129
+ }
130
+ b(a) && a.then(i, i);
131
+ }, { available: R, fenced: z, showControls: B, offerConfirm: V } = o(g, x ? null : y), H = f(w);
132
+ d(() => {
133
+ H.current = w;
134
+ });
135
+ let U = f(null);
136
+ d(() => {
137
+ let e = g.proposalId;
138
+ if (!k || !R || U.current === e) return;
139
+ let t = O.current;
140
+ if (!t || typeof IntersectionObserver > "u") return;
141
+ let n = null, r = () => {
142
+ n !== null && clearTimeout(n), n = null;
143
+ }, i = new IntersectionObserver((t) => {
144
+ let a = t[t.length - 1];
145
+ if (a) {
146
+ if (!(a.isIntersecting && (a.intersectionRatio >= .5 || a.rootBounds !== null && a.rootBounds.height > 0 && a.intersectionRect.height >= a.rootBounds.height / 2))) {
147
+ r();
148
+ return;
149
+ }
150
+ n === null && (n = setTimeout(() => {
151
+ n = null, U.current !== e && (U.current = e, i.disconnect(), H.current("card"));
152
+ }, 500));
153
+ }
154
+ }, { threshold: ie });
155
+ return i.observe(t), () => {
156
+ r(), i.disconnect();
157
+ };
158
+ }, [
159
+ g.proposalId,
160
+ k,
161
+ R
162
+ ]);
163
+ let W = _(g), G = S || I !== null, K = G || j, q = (e) => {
164
+ e.isTrusted && (!V || W || K || L("approve", ce));
165
+ }, me = () => {
166
+ !B || G || L("decline", le);
167
+ }, he = () => {
168
+ !V || !W || K || ue();
169
+ }, ge = ae(g, C), J = [...new Set(g.risk.kinds)].map((e) => ({
170
+ kind: e,
171
+ text: te(e, C)
172
+ })).filter((e) => !!e.text), Y = u(g), X = g.revision > 1 && T && T.proposalId === g.supersedes ? se(T, g, C) : null, Z = (e, r) => {
173
+ let i = e.sensitive && !fe.has(e.key);
174
+ return /* @__PURE__ */ h("span", {
175
+ className: "inline-flex min-w-0 flex-wrap items-baseline gap-x-2",
176
+ children: [i ? /* @__PURE__ */ h("span", {
177
+ "data-testid": "assistant-write-proposal-masked",
178
+ children: [/* @__PURE__ */ m("span", {
179
+ "aria-hidden": "true",
180
+ className: "font-mono text-text-muted",
181
+ children: t
182
+ }), /* @__PURE__ */ m("span", {
183
+ className: "sr-only",
184
+ children: C("writeProposal.hiddenValue", "Hidden value")
185
+ })]
186
+ }) : /* @__PURE__ */ m("span", {
187
+ className: "min-w-0 whitespace-pre-wrap break-words font-medium text-text-primary",
188
+ children: n(e.value)
189
+ }), e.sensitive && r ? /* @__PURE__ */ m("button", {
190
+ type: "button",
191
+ onClick: () => pe(e.key),
192
+ "aria-pressed": !i,
193
+ "aria-describedby": r,
194
+ className: "rounded text-[11px] font-medium text-text-link underline focus:outline-none focus-visible:ring-2 focus-visible:ring-border-strong",
195
+ "data-testid": "assistant-write-proposal-reveal",
196
+ children: i ? C("writeProposal.showValue", "Show") : C("writeProposal.hideValue", "Hide")
197
+ }) : null]
198
+ });
199
+ }, Q = (e, t) => /* @__PURE__ */ m("dl", {
200
+ className: "mt-1 grid grid-cols-[minmax(0,auto)_minmax(0,1fr)] gap-x-3 gap-y-1 text-xs",
201
+ children: e.map((e, n) => {
202
+ let r = `${D}-${t}-${n}`;
203
+ return /* @__PURE__ */ h("div", {
204
+ className: "contents",
205
+ children: [/* @__PURE__ */ m("dt", {
206
+ id: r,
207
+ className: "truncate text-text-muted",
208
+ children: e.label
209
+ }), /* @__PURE__ */ m("dd", {
210
+ className: "min-w-0",
211
+ children: Z(e, r)
212
+ })]
213
+ }, `${n}:${e.key}`);
214
+ })
215
+ }), _e = l(g), $ = g.description.consequences.map((e) => r(e, _e));
216
+ return /* @__PURE__ */ h("div", {
217
+ ref: O,
218
+ role: "group",
219
+ "aria-label": C("writeProposal.aria", "Proposed change: {{label}}", { label: g.description.label }),
220
+ className: `my-2 overflow-hidden rounded-xl border ${k ? "border-status-warning bg-status-warning/10" : "border-border-subtle bg-bg-surface"}`,
221
+ "data-testid": "assistant-write-proposal",
222
+ "data-status": g.status,
223
+ children: [
224
+ /* @__PURE__ */ h("div", {
225
+ className: "flex items-start justify-between gap-2 border-b border-border-subtle px-3 py-2",
226
+ children: [/* @__PURE__ */ h("div", {
227
+ className: "flex min-w-0 items-start gap-2",
228
+ children: [/* @__PURE__ */ m(re, {
229
+ className: "mt-0.5 size-4 flex-shrink-0 text-status-warning",
230
+ "aria-hidden": "true"
231
+ }), /* @__PURE__ */ h("div", {
232
+ className: "min-w-0",
233
+ children: [
234
+ /* @__PURE__ */ m("p", {
235
+ className: "break-words font-mono text-xs font-semibold text-text-primary",
236
+ "data-testid": "assistant-write-proposal-label",
237
+ children: g.description.label
238
+ }),
239
+ /* @__PURE__ */ m("p", {
240
+ className: "text-[11px] text-text-muted",
241
+ children: s(g, C)
242
+ }),
243
+ V ? /* @__PURE__ */ m("p", {
244
+ className: "text-[11px] text-text-secondary",
245
+ children: C("writeProposal.title", "Review and approve this change.")
246
+ }) : null
247
+ ]
248
+ })]
249
+ }), /* @__PURE__ */ m("span", {
250
+ role: "status",
251
+ "aria-live": "polite",
252
+ "aria-atomic": "true",
253
+ className: `max-w-[50%] flex-shrink-0 rounded-full border px-2 py-0.5 text-[11px] font-medium break-words ${oe(g)}`,
254
+ "data-testid": "assistant-write-proposal-status",
255
+ children: ge
256
+ })]
257
+ }),
258
+ /* @__PURE__ */ h("div", {
259
+ className: "space-y-2 px-3 py-2",
260
+ children: [
261
+ J.length > 0 ? /* @__PURE__ */ m("ul", {
262
+ className: "flex flex-wrap gap-1",
263
+ "data-testid": "assistant-write-proposal-kinds",
264
+ children: J.map(({ kind: e, text: t }) => /* @__PURE__ */ m("li", {
265
+ className: "rounded-full border border-status-error-border bg-status-error-bg px-2 py-0.5 text-[11px] font-medium text-status-error-text",
266
+ children: t
267
+ }, e))
268
+ }) : null,
269
+ g.description.rootFields.map((e, t) => {
270
+ let n = a(e);
271
+ return /* @__PURE__ */ h("div", {
272
+ "data-testid": "assistant-write-proposal-field",
273
+ children: [/* @__PURE__ */ m("p", {
274
+ className: "break-words font-mono text-xs text-text-primary",
275
+ children: c(e)
276
+ }), n.length > 0 ? Q(n, `field${t}`) : null]
277
+ }, `${t}:${e.alias ?? e.field}`);
278
+ }),
279
+ Y.length > 0 ? /* @__PURE__ */ h("div", {
280
+ "data-testid": "assistant-write-proposal-variables",
281
+ children: [/* @__PURE__ */ m("p", {
282
+ className: "text-[11px] font-medium text-text-secondary",
283
+ children: C("writeProposal.values", "Values")
284
+ }), Q(Y, "vars")]
285
+ }) : null,
286
+ g.description.variablesOmitted ? /* @__PURE__ */ m("p", {
287
+ className: "text-[11px] text-text-muted",
288
+ children: C("writeProposal.variablesOmitted", "{{count}} more values not shown", { count: g.description.variablesOmitted })
289
+ }) : null,
290
+ g.description.targetCount > 0 ? /* @__PURE__ */ m("p", {
291
+ className: "text-xs text-text-secondary",
292
+ "data-testid": "assistant-write-proposal-target-count",
293
+ children: C("writeProposal.targetCount", "Items affected: {{count}}", { count: g.description.targetCount })
294
+ }) : null,
295
+ $.length > 0 ? /* @__PURE__ */ h("div", { children: [/* @__PURE__ */ m("p", {
296
+ className: "text-[11px] font-medium text-text-secondary",
297
+ children: C("writeProposal.consequences", "What this will do")
298
+ }), /* @__PURE__ */ m("ul", {
299
+ className: "list-disc pl-4 text-xs text-text-primary",
300
+ "data-testid": "assistant-write-proposal-consequences",
301
+ children: $.map((e, t) => /* @__PURE__ */ m("li", { children: e }, t))
302
+ })] }) : null,
303
+ g.repeatOf ? /* @__PURE__ */ m("p", {
304
+ className: "text-xs text-status-warning-text",
305
+ children: C("writeProposal.repeat", "You made this same change recently. Confirming makes it again.")
306
+ }) : null,
307
+ g.revision > 1 ? /* @__PURE__ */ h("div", {
308
+ "data-testid": "assistant-write-proposal-revision",
309
+ children: [
310
+ /* @__PURE__ */ m("p", {
311
+ className: "text-[11px] font-medium text-text-secondary",
312
+ children: C("writeProposal.revision", "Revised — version {{revision}}", { revision: g.revision })
313
+ }),
314
+ X && X.length === 0 ? /* @__PURE__ */ m("p", {
315
+ className: "text-[11px] text-text-muted",
316
+ children: C("writeProposal.diff.none", "No values changed")
317
+ }) : null,
318
+ X && X.length > 0 ? /* @__PURE__ */ h("table", {
319
+ className: "mt-1 w-full table-fixed text-xs",
320
+ "data-testid": "assistant-write-proposal-diff",
321
+ children: [/* @__PURE__ */ m("thead", { children: /* @__PURE__ */ h("tr", {
322
+ className: "text-left text-[11px] text-text-muted",
323
+ children: [
324
+ /* @__PURE__ */ m("th", {
325
+ scope: "col",
326
+ className: "w-1/3 font-medium",
327
+ children: /* @__PURE__ */ m("span", {
328
+ className: "sr-only",
329
+ children: C("writeProposal.diff.value", "Value")
330
+ })
331
+ }),
332
+ /* @__PURE__ */ m("th", {
333
+ scope: "col",
334
+ className: "font-medium",
335
+ children: C("writeProposal.diff.before", "Before")
336
+ }),
337
+ /* @__PURE__ */ m("th", {
338
+ scope: "col",
339
+ className: "font-medium",
340
+ children: C("writeProposal.diff.after", "After")
341
+ })
342
+ ]
343
+ }) }), /* @__PURE__ */ m("tbody", { children: X.map((e) => /* @__PURE__ */ h("tr", {
344
+ className: "align-top",
345
+ children: [
346
+ /* @__PURE__ */ m("th", {
347
+ scope: "row",
348
+ className: "break-words pr-2 text-left font-normal text-text-muted",
349
+ children: e.label
350
+ }),
351
+ /* @__PURE__ */ m("td", {
352
+ className: "break-words pr-2",
353
+ children: e.before ? Z({
354
+ ...e.before,
355
+ sensitive: e.before.sensitive || !!e.after?.sensitive
356
+ }, null) : /* @__PURE__ */ m("span", {
357
+ className: "text-text-muted",
358
+ children: C("writeProposal.diff.absent", "(not set)")
359
+ })
360
+ }),
361
+ /* @__PURE__ */ m("td", {
362
+ className: "break-words",
363
+ children: e.after ? Z(e.after, null) : /* @__PURE__ */ m("span", {
364
+ className: "text-text-muted",
365
+ children: C("writeProposal.diff.absent", "(not set)")
366
+ })
367
+ })
368
+ ]
369
+ }, e.key)) })]
370
+ }) : null
371
+ ]
372
+ }) : null
373
+ ]
374
+ }),
375
+ k ? /* @__PURE__ */ h("div", {
376
+ className: "space-y-1 border-t border-border-subtle px-3 py-2 text-[11px]",
377
+ children: [
378
+ /* @__PURE__ */ m("p", {
379
+ className: "text-text-secondary",
380
+ "data-testid": "assistant-write-proposal-countdown",
381
+ children: j ? C("writeProposal.timeUp", "Time's up — this can no longer be confirmed") : ee(A, E, C)
382
+ }),
383
+ x ? /* @__PURE__ */ m("p", {
384
+ className: "text-text-secondary",
385
+ "data-testid": "assistant-write-proposal-inert",
386
+ children: C("writeProposal.inert", "This change can no longer be confirmed here. Nothing was done; ask the assistant to prepare it again if you still want it.")
387
+ }) : R ? g.approvable ? z ? /* @__PURE__ */ m("p", {
388
+ className: "text-text-secondary",
389
+ "data-testid": "assistant-write-proposal-fenced",
390
+ children: C("writeProposal.executionFenced", "You can review or cancel this change. Running it from the assistant becomes available once secure confirmation is enabled.")
391
+ }) : null : /* @__PURE__ */ m("p", {
392
+ className: "text-text-secondary",
393
+ "data-testid": "assistant-write-proposal-not-approvable",
394
+ children: C("writeProposal.notApprovable", "This change isn't ready to confirm. If it stays this way, ask the assistant to prepare it again.")
395
+ }) : /* @__PURE__ */ m("p", {
396
+ className: "text-text-secondary",
397
+ "data-testid": "assistant-write-proposal-not-available",
398
+ children: C("writeProposal.notAvailableYet", "Confirming changes from the assistant isn't available in this session yet.")
399
+ }),
400
+ B && S ? /* @__PURE__ */ m("p", {
401
+ className: "text-text-muted",
402
+ children: C("writeProposal.waitForTurn", "You can confirm once the assistant finishes replying.")
403
+ }) : null
404
+ ]
405
+ }) : null,
406
+ B ? /* @__PURE__ */ h("div", {
407
+ className: "flex flex-wrap justify-end gap-2 border-t border-border-subtle px-3 py-2",
408
+ children: [
409
+ /* @__PURE__ */ m("button", {
410
+ type: "button",
411
+ onClick: me,
412
+ disabled: G,
413
+ className: "rounded-md border border-action-secondary-border bg-action-secondary-bg px-3 py-1.5 text-xs font-medium text-action-secondary-fg hover:bg-action-secondary-bg-hover disabled:opacity-60 focus:outline-none focus-visible:ring-2 focus-visible:ring-border-strong",
414
+ "data-testid": "assistant-write-proposal-cancel",
415
+ children: C("writeProposal.cancel", "Cancel")
416
+ }),
417
+ V && W ? /* @__PURE__ */ m("button", {
418
+ type: "button",
419
+ onClick: he,
420
+ disabled: K,
421
+ className: "rounded-md bg-action-primary-bg px-3 py-1.5 text-xs font-medium text-action-primary-fg hover:bg-action-primary-bg-hover disabled:opacity-60 focus:outline-none focus-visible:ring-2 focus-visible:ring-border-strong",
422
+ "data-testid": "assistant-write-proposal-review",
423
+ children: C("writeProposal.review", "Review & confirm…")
424
+ }) : null,
425
+ V && !W ? /* @__PURE__ */ m("button", {
426
+ type: "button",
427
+ onClick: q,
428
+ disabled: K,
429
+ className: "rounded-md bg-action-primary-bg px-3 py-1.5 text-xs font-medium text-action-primary-fg hover:bg-action-primary-bg-hover disabled:opacity-60 focus:outline-none focus-visible:ring-2 focus-visible:ring-border-strong",
430
+ "data-testid": "assistant-write-proposal-confirm",
431
+ children: I === "approve" ? C("writeProposal.confirming", "Confirming…") : g.description.confirmLabel.trim() || C("writeProposal.confirmFallback", "Confirm this change")
432
+ }) : null
433
+ ]
434
+ }) : null
435
+ ]
436
+ });
437
+ };
438
+ //#endregion
439
+ export { x as AssistantWriteProposalCard, g as WRITE_PROPOSAL_DIALOG_KINDS, v as WRITE_PROPOSAL_PRESENTED_AFTER_MS, _ as writeProposalUsesDialog };
@@ -0,0 +1,40 @@
1
+ import { FC } from 'react';
2
+ import { AssistantTr } from '../i18n';
3
+ import { WriteProposalMessageRef } from '../writeProposalDiscovery';
4
+ import { SandboxWriteCapabilities, WriteProposalView } from '../writeProposals';
5
+ import { WriteProposalEntries, WriteProposalPanel } from './useWriteProposals';
6
+ /**
7
+ * The write-proposal cards of ONE reply (BOFF-7803 5a, unit FE7): each of the
8
+ * reply's `writeProposalRefs`, drawn from what its ISSUING sandbox last
9
+ * answered.
10
+ *
11
+ * ★★ 5a is a safety floor, not the final security boundary. A card offers a
12
+ * press; the sandbox and wspace-sandbox-svc decide. Every call goes to the
13
+ * proposal's own sandbox (`panel`, keyed by the entry's session), whatever mode
14
+ * the panel is in now.
15
+ *
16
+ * ★ A reference whose record this panel does not hold yet draws nothing, and
17
+ * asks for it once (`ensureKnown`: "when a card mounts"). A card is never drawn
18
+ * from anything but a record.
19
+ */
20
+ export interface AssistantWriteProposalSlotProps {
21
+ refs: readonly WriteProposalMessageRef[];
22
+ /** The conversation the reply is in. */
23
+ conversationId: string;
24
+ panel: WriteProposalPanel;
25
+ entries: WriteProposalEntries;
26
+ /** A sandbox's `/health` write capabilities, by sandbox id. */
27
+ capabilitiesOf: (sandboxId: string) => SandboxWriteCapabilities | null | undefined;
28
+ /** A turn is running in this conversation: no decision can be made. */
29
+ turnInFlight: boolean;
30
+ tr: AssistantTr;
31
+ /** "Review & confirm…" on a dialog kind (OD-12). */
32
+ onReview: (view: WriteProposalView) => void;
33
+ /**
34
+ * ★ BOFF-7803 FE8: sandboxes a failover replaced. Their cards are inert
35
+ * records: no control, and nothing is decided in them.
36
+ */
37
+ retiredSandboxes?: ReadonlySet<string>;
38
+ }
39
+ export declare const AssistantWriteProposalSlot: FC<AssistantWriteProposalSlotProps>;
40
+ //# sourceMappingURL=AssistantWriteProposalSlot.d.ts.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"AssistantWriteProposalSlot.d.ts","sourceRoot":"","sources":["../../../../src/shared/assistant/ui/AssistantWriteProposalSlot.tsx"],"names":[],"mappings":"AAAA,OAAO,EAAqB,KAAK,EAAE,EAAE,MAAM,OAAO,CAAC;AAEnD,OAAO,KAAK,EAAE,WAAW,EAAE,MAAM,SAAS,CAAC;AAC3C,OAAO,KAAK,EAAE,uBAAuB,EAAE,MAAM,2BAA2B,CAAC;AACzE,OAAO,KAAK,EACV,wBAAwB,EACxB,iBAAiB,EAClB,MAAM,mBAAmB,CAAC;AAE3B,OAAO,KAAK,EACV,oBAAoB,EACpB,kBAAkB,EACnB,MAAM,qBAAqB,CAAC;AAE7B;;;;;;;;;;;;;GAaG;AACH,MAAM,WAAW,+BAA+B;IAC9C,IAAI,EAAE,SAAS,uBAAuB,EAAE,CAAC;IACzC,wCAAwC;IACxC,cAAc,EAAE,MAAM,CAAC;IACvB,KAAK,EAAE,kBAAkB,CAAC;IAC1B,OAAO,EAAE,oBAAoB,CAAC;IAC9B,+DAA+D;IAC/D,cAAc,EAAE,CACd,SAAS,EAAE,MAAM,KACd,wBAAwB,GAAG,IAAI,GAAG,SAAS,CAAC;IACjD,uEAAuE;IACvE,YAAY,EAAE,OAAO,CAAC;IACtB,EAAE,EAAE,WAAW,CAAC;IAChB,oDAAoD;IACpD,QAAQ,EAAE,CAAC,IAAI,EAAE,iBAAiB,KAAK,IAAI,CAAC;IAC5C;;;OAGG;IACH,gBAAgB,CAAC,EAAE,WAAW,CAAC,MAAM,CAAC,CAAC;CACxC;AAED,eAAO,MAAM,0BAA0B,EAAE,EAAE,CACzC,+BAA+B,CAoDhC,CAAC"}
@@ -0,0 +1,35 @@
1
+ import { AssistantWriteProposalCard as e } from "./AssistantWriteProposalCard.js";
2
+ import { useEffect as t, useRef as n } from "react";
3
+ import { Fragment as r, jsx as i } from "react/jsx-runtime";
4
+ //#region src/shared/assistant/ui/AssistantWriteProposalSlot.tsx
5
+ var a = ({ refs: a, conversationId: o, panel: s, entries: c, capabilitiesOf: l, turnInFlight: u, tr: d, onReview: f, retiredSandboxes: p }) => {
6
+ let m = n(a);
7
+ return t(() => {
8
+ m.current = a;
9
+ }), t(() => {
10
+ for (let e of m.current) s.ensureKnown(e, o);
11
+ }, [
12
+ a.map((e) => `${e.sandboxId}/${e.sessionId}/${e.proposalId}`).join("|"),
13
+ o,
14
+ s
15
+ ]), /* @__PURE__ */ i(r, { children: a.map((t) => {
16
+ let n = c[t.proposalId];
17
+ if (!n) return null;
18
+ let { view: r, serverNow: a } = n, o = r.supersedes ? c[r.supersedes]?.view ?? null : null;
19
+ return /* @__PURE__ */ i(e, {
20
+ view: r,
21
+ serverNow: a,
22
+ capabilities: l(n.session.sandboxId),
23
+ inert: p?.has(n.session.sandboxId) ?? !1,
24
+ turnInFlight: u,
25
+ tr: d,
26
+ onApprove: () => s.approve(r, "card"),
27
+ onDecline: () => s.decline(r, "user_declined", "card"),
28
+ onReview: () => f(r),
29
+ onPresented: (e) => void s.presented(r, e),
30
+ previous: o
31
+ }, t.proposalId);
32
+ }) });
33
+ };
34
+ //#endregion
35
+ export { a as AssistantWriteProposalSlot };
@@ -1,10 +1,10 @@
1
1
  import { useI18n as e } from "../../../providers/shell/I18nProvider.js";
2
2
  import { useVoiceInput as t } from "../../voice/useVoiceInput.js";
3
3
  import { useAssistantTr as ee } from "../../i18n.js";
4
- import { languageDisplayName as n } from "../../voice/speechVoices.js";
5
- import { resolveAssistantLanguage as r } from "../../voice/languages.js";
6
- import { getSendableAttachments as i } from "../../attachments.js";
7
- import { useAssistantStore as a } from "../../store.js";
4
+ import { useAssistantStore as n } from "../../store.js";
5
+ import { languageDisplayName as r } from "../../voice/speechVoices.js";
6
+ import { resolveAssistantLanguage as i } from "../../voice/languages.js";
7
+ import { getSendableAttachments as a } from "../../attachments.js";
8
8
  import { AssistantAttachmentButton as o } from "./AssistantAttachmentButton.js";
9
9
  import { AssistantAttachmentChips as s } from "./AssistantAttachmentChips.js";
10
10
  import { AssistantModeSelector as c } from "./AssistantModeSelector.js";
@@ -22,10 +22,10 @@ var v = 200, y = ({ writeAccessDenied: y = !1, onSend: b, disabled: x = !1, read
22
22
  }, [U, w]);
23
23
  let pe = l((e) => {
24
24
  A((t) => t ? `${t.replace(/\s+$/, "")} ${e}` : e);
25
- }, []), G = a((e) => e.assistantLanguage), K = t({
25
+ }, []), G = n((e) => e.assistantLanguage), K = t({
26
26
  onFinalize: pe,
27
- language: d(() => r(G, E), [G, E]).tag
28
- }), me = oe ?? T("composer.placeholder", "Ask me anything…"), q = k.trim(), J = i(P), Y = P.filter((e) => e.status === "error"), X = (q.length > 0 || J.length > 0) && !D && L === null;
27
+ language: d(() => i(G, E), [G, E]).tag
28
+ }), me = oe ?? T("composer.placeholder", "Ask me anything…"), q = k.trim(), J = a(P), Y = P.filter((e) => e.status === "error"), X = (q.length > 0 || J.length > 0) && !D && L === null;
29
29
  u(() => {
30
30
  let e = O.current;
31
31
  e && (e.style.height = "auto", e.style.height = `${Math.min(e.scrollHeight, v)}px`);
@@ -65,7 +65,7 @@ var v = 200, y = ({ writeAccessDenied: y = !1, onSend: b, disabled: x = !1, read
65
65
  case "not-allowed": return T("voice.denied", "Microphone access is blocked. Allow it in your browser settings to dictate.");
66
66
  case "audio-capture": return T("voice.noMic", "No microphone was found.");
67
67
  case "network": return T("voice.network", "Speech recognition is offline right now.");
68
- case "language-not-supported": return T("voice.languageNotSupported", "This browser cannot recognise spoken {{language}}. Try a different browser, or type instead.", { language: n(K.language, E) });
68
+ case "language-not-supported": return T("voice.languageNotSupported", "This browser cannot recognise spoken {{language}}. Try a different browser, or type instead.", { language: r(K.language, E) });
69
69
  case "unknown": return T("voice.failed", "Dictation stopped unexpectedly.");
70
70
  default: return null;
71
71
  }
@@ -10,6 +10,27 @@ import { VoiceSessionSnapshot } from '../voice/voiceSession';
10
10
  * and `unknown` and the session ignored both.
11
11
  */
12
12
  export type VoiceSessionNotice = "network" | "not-capturing" | "nothing-heard" | "recognition-failed";
13
+ /**
14
+ * A line the PANEL says in the voice conversation, outside any turn (BOFF-7803
15
+ * FE9: the readback of a change that waits for its button).
16
+ *
17
+ * ★ Spoken like a reply — the microphone is closed for it, and it is the echo
18
+ * reference while it plays — but it is not a reply: nothing is sent, and the
19
+ * session does not advance a turn for it. It is said right after the reply
20
+ * being spoken, or at once from a quiet listening (`planVoiceAnnouncement`).
21
+ */
22
+ export interface VoiceAnnouncement {
23
+ /** Unique: playback is tracked by it, and a repeat of a queued id is ignored. */
24
+ id: string;
25
+ text: string;
26
+ /** The language the text is in, for the voice that says it. */
27
+ lang?: string;
28
+ /**
29
+ * Asked just before it is said: false drops it. The conversation may have
30
+ * moved on while it waited behind a reply.
31
+ */
32
+ stillWanted?: () => boolean;
33
+ }
13
34
  interface Options {
14
35
  /** Send a turn. The reply is observed via `latestReply`, not returned here. */
15
36
  /**
@@ -90,6 +111,13 @@ export declare function useVoiceSession({ onSubmit, latestReply, language }: Opt
90
111
  isCurrentSession: (voiceSessionId: string) => boolean;
91
112
  toggleMute: () => void;
92
113
  interrupt: () => void;
114
+ /** Say a line of the panel's own (BOFF-7803 FE9, `VoiceAnnouncement`). */
115
+ announce: (item: VoiceAnnouncement) => void;
116
+ /**
117
+ * Pause listening (true) while something else needs the person — the
118
+ * change confirmation dialog — and resume it (false). BOFF-7803 FE9.
119
+ */
120
+ holdListening: (requested: boolean) => void;
93
121
  };
94
122
  export {};
95
123
  //# sourceMappingURL=useVoiceSession.d.ts.map
@@ -1 +1 @@
1
- {"version":3,"file":"useVoiceSession.d.ts","sourceRoot":"","sources":["../../../../src/shared/assistant/ui/useVoiceSession.ts"],"names":[],"mappings":"AASA,OAAO,EAAe,KAAK,eAAe,EAAE,MAAM,iBAAiB,CAAC;AAEpE,OAAO,EAcL,KAAK,oBAAoB,EAE1B,MAAM,uBAAuB,CAAC;AAsC/B;;;;;;;;GAQG;AACH,MAAM,MAAM,kBAAkB,GAC5B,SAAS,GAAG,eAAe,GAAG,eAAe,GAAG,oBAAoB,CAAC;AAMvE,UAAU,OAAO;IACf,+EAA+E;IAC/E;;;;;;;OAOG;IACH,QAAQ,EAAE,CACR,IAAI,EAAE,MAAM,EACZ,cAAc,EAAE,MAAM;IACtB;;;OAGG;IACH,MAAM,EAAE,eAAe,KACpB,IAAI,CAAC;IACV;;;;OAIG;IACH,WAAW,EAAE;QAAE,EAAE,EAAE,MAAM,CAAC;QAAC,IAAI,EAAE,MAAM,CAAA;KAAE,GAAG,IAAI,CAAC;IACjD,6EAA6E;IAC7E,QAAQ,EAAE,MAAM,CAAC;CAClB;AAED;;;;;;;;;;;;;GAaG;AACH,wBAAgB,eAAe,CAAC,EAAE,QAAQ,EAAE,WAAW,EAAE,QAAQ,EAAE,EAAE,OAAO;;IAqlBtE,qEAAqE;;IAErE;;;;;;;OAOG;;;;;IAEH,+DAA+D;;IAE/D;;;;;;;OAOG;;IAIH,0EAA0E;;IAE1E,6DAA6D;;IAE7D,sDAAsD;;;;uCAzDvC,MAAM;;;EAuF1B"}
1
+ {"version":3,"file":"useVoiceSession.d.ts","sourceRoot":"","sources":["../../../../src/shared/assistant/ui/useVoiceSession.ts"],"names":[],"mappings":"AAUA,OAAO,EAAe,KAAK,eAAe,EAAE,MAAM,iBAAiB,CAAC;AAEpE,OAAO,EAgBL,KAAK,oBAAoB,EAE1B,MAAM,uBAAuB,CAAC;AAsC/B;;;;;;;;GAQG;AACH,MAAM,MAAM,kBAAkB,GAC5B,SAAS,GAAG,eAAe,GAAG,eAAe,GAAG,oBAAoB,CAAC;AAEvE;;;;;;;;GAQG;AACH,MAAM,WAAW,iBAAiB;IAChC,iFAAiF;IACjF,EAAE,EAAE,MAAM,CAAC;IACX,IAAI,EAAE,MAAM,CAAC;IACb,+DAA+D;IAC/D,IAAI,CAAC,EAAE,MAAM,CAAC;IACd;;;OAGG;IACH,WAAW,CAAC,EAAE,MAAM,OAAO,CAAC;CAC7B;AAMD,UAAU,OAAO;IACf,+EAA+E;IAC/E;;;;;;;OAOG;IACH,QAAQ,EAAE,CACR,IAAI,EAAE,MAAM,EACZ,cAAc,EAAE,MAAM;IACtB;;;OAGG;IACH,MAAM,EAAE,eAAe,KACpB,IAAI,CAAC;IACV;;;;OAIG;IACH,WAAW,EAAE;QAAE,EAAE,EAAE,MAAM,CAAC;QAAC,IAAI,EAAE,MAAM,CAAA;KAAE,GAAG,IAAI,CAAC;IACjD,6EAA6E;IAC7E,QAAQ,EAAE,MAAM,CAAC;CAClB;AAED;;;;;;;;;;;;;GAaG;AACH,wBAAgB,eAAe,CAAC,EAAE,QAAQ,EAAE,WAAW,EAAE,QAAQ,EAAE,EAAE,OAAO;;IA4sBtE,qEAAqE;;IAErE;;;;;;;OAOG;;;;;IAEH,+DAA+D;;IAE/D;;;;;;;OAOG;;IAIH,0EAA0E;;IAE1E,6DAA6D;;IAE7D,sDAAsD;;;;uCAzDvC,MAAM;;;IAgErB,0EAA0E;qBA7nB1C,iBAAiB;IA+nBjD;;;OAGG;+BA7oBuC,OAAO;EAwqBtD"}