@burdenoff/fe-libs 2026.928.3 → 2026.930.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/adminModeSendGate.d.ts +6 -5
- package/dist/shared/assistant/adminModeSendGate.d.ts.map +1 -1
- package/dist/shared/assistant/adminModeSendGate.js +11 -11
- package/dist/shared/assistant/api.d.ts +313 -28
- package/dist/shared/assistant/api.d.ts.map +1 -1
- package/dist/shared/assistant/api.js +351 -135
- package/dist/shared/assistant/autoRouting.d.ts +11 -3
- package/dist/shared/assistant/autoRouting.d.ts.map +1 -1
- package/dist/shared/assistant/autoRouting.js +7 -7
- package/dist/shared/assistant/capabilities.d.ts +28 -0
- package/dist/shared/assistant/capabilities.d.ts.map +1 -1
- package/dist/shared/assistant/capabilities.js +19 -10
- package/dist/shared/assistant/conversation.d.ts +24 -2
- package/dist/shared/assistant/conversation.d.ts.map +1 -1
- package/dist/shared/assistant/createSandboxAssistantTransport.d.ts.map +1 -1
- package/dist/shared/assistant/createSandboxAssistantTransport.js +67 -54
- package/dist/shared/assistant/history/historyList.js +1 -1
- package/dist/shared/assistant/history/historyMapping.d.ts.map +1 -1
- package/dist/shared/assistant/history/historyMapping.js +5 -1
- package/dist/shared/assistant/history/historyResume.js +7 -7
- package/dist/shared/assistant/i18nManifest.d.ts +53 -0
- package/dist/shared/assistant/i18nManifest.d.ts.map +1 -1
- package/dist/shared/assistant/i18nManifest.js +75 -16
- package/dist/shared/assistant/index.d.ts +15 -0
- package/dist/shared/assistant/index.d.ts.map +1 -1
- package/dist/shared/assistant/modeCapabilities.js +1 -1
- package/dist/shared/assistant/operations.d.ts +22 -0
- package/dist/shared/assistant/operations.d.ts.map +1 -1
- package/dist/shared/assistant/operations.js +2 -2
- package/dist/shared/assistant/prewarm.d.ts +7 -0
- package/dist/shared/assistant/prewarm.d.ts.map +1 -1
- package/dist/shared/assistant/prewarm.js +1 -1
- package/dist/shared/assistant/product.d.ts +80 -2
- package/dist/shared/assistant/product.d.ts.map +1 -1
- package/dist/shared/assistant/product.js +10 -6
- package/dist/shared/assistant/proposalWriteRules.d.ts +40 -0
- package/dist/shared/assistant/proposalWriteRules.d.ts.map +1 -0
- package/dist/shared/assistant/proposalWriteRules.js +14 -0
- package/dist/shared/assistant/store.d.ts +17 -0
- package/dist/shared/assistant/store.d.ts.map +1 -1
- package/dist/shared/assistant/store.js +50 -43
- package/dist/shared/assistant/turnOutcome.d.ts +34 -2
- package/dist/shared/assistant/turnOutcome.d.ts.map +1 -1
- package/dist/shared/assistant/turnOutcome.js +28 -17
- package/dist/shared/assistant/turnOutcomeCopy.d.ts +29 -7
- package/dist/shared/assistant/turnOutcomeCopy.d.ts.map +1 -1
- package/dist/shared/assistant/turnOutcomeCopy.js +18 -6
- package/dist/shared/assistant/types.d.ts +5 -1
- package/dist/shared/assistant/types.d.ts.map +1 -1
- package/dist/shared/assistant/ui/AssistantApiCallsConsentDialog.js +4 -4
- package/dist/shared/assistant/ui/AssistantChatArea.d.ts.map +1 -1
- package/dist/shared/assistant/ui/AssistantChatArea.js +992 -718
- package/dist/shared/assistant/ui/AssistantConversationList.js +6 -6
- package/dist/shared/assistant/ui/AssistantLanguageMenu.js +6 -6
- package/dist/shared/assistant/ui/AssistantMessageItem.d.ts +8 -1
- package/dist/shared/assistant/ui/AssistantMessageItem.d.ts.map +1 -1
- package/dist/shared/assistant/ui/AssistantMessageItem.js +77 -76
- package/dist/shared/assistant/ui/AssistantMessageList.d.ts +13 -1
- package/dist/shared/assistant/ui/AssistantMessageList.d.ts.map +1 -1
- package/dist/shared/assistant/ui/AssistantMessageList.js +15 -13
- package/dist/shared/assistant/ui/AssistantReplyLanguageSelector.js +5 -5
- package/dist/shared/assistant/ui/AssistantSpeechProvider.js +209 -209
- package/dist/shared/assistant/ui/AssistantWriteConfirmDialog.d.ts +62 -0
- package/dist/shared/assistant/ui/AssistantWriteConfirmDialog.d.ts.map +1 -0
- package/dist/shared/assistant/ui/AssistantWriteConfirmDialog.js +253 -0
- package/dist/shared/assistant/ui/AssistantWriteProposalCard.d.ts +72 -0
- package/dist/shared/assistant/ui/AssistantWriteProposalCard.d.ts.map +1 -0
- package/dist/shared/assistant/ui/AssistantWriteProposalCard.js +439 -0
- package/dist/shared/assistant/ui/AssistantWriteProposalSlot.d.ts +40 -0
- package/dist/shared/assistant/ui/AssistantWriteProposalSlot.d.ts.map +1 -0
- package/dist/shared/assistant/ui/AssistantWriteProposalSlot.js +35 -0
- package/dist/shared/assistant/ui/composer/AssistantComposer.js +8 -8
- package/dist/shared/assistant/ui/useVoiceSession.d.ts +28 -0
- package/dist/shared/assistant/ui/useVoiceSession.d.ts.map +1 -1
- package/dist/shared/assistant/ui/useVoiceSession.js +159 -110
- package/dist/shared/assistant/ui/useWriteProposalConfirm.d.ts +61 -0
- package/dist/shared/assistant/ui/useWriteProposalConfirm.d.ts.map +1 -0
- package/dist/shared/assistant/ui/useWriteProposalConfirm.js +109 -0
- package/dist/shared/assistant/ui/useWriteProposals.d.ts +128 -0
- package/dist/shared/assistant/ui/useWriteProposals.d.ts.map +1 -0
- package/dist/shared/assistant/ui/useWriteProposals.js +240 -0
- package/dist/shared/assistant/ui/voice/AssistantVoiceSession.d.ts +17 -1
- package/dist/shared/assistant/ui/voice/AssistantVoiceSession.d.ts.map +1 -1
- package/dist/shared/assistant/ui/voice/AssistantVoiceSession.js +141 -109
- package/dist/shared/assistant/ui/writeProposalPresentation.d.ts +76 -0
- package/dist/shared/assistant/ui/writeProposalPresentation.d.ts.map +1 -0
- package/dist/shared/assistant/ui/writeProposalPresentation.js +110 -0
- package/dist/shared/assistant/usageReporting.d.ts +108 -0
- package/dist/shared/assistant/usageReporting.d.ts.map +1 -0
- package/dist/shared/assistant/usageReporting.js +155 -0
- package/dist/shared/assistant/useAssistantApiAccess.d.ts +49 -14
- package/dist/shared/assistant/useAssistantApiAccess.d.ts.map +1 -1
- package/dist/shared/assistant/useAssistantApiAccess.js +43 -25
- package/dist/shared/assistant/useAssistantHeartbeat.d.ts.map +1 -1
- package/dist/shared/assistant/useAssistantHeartbeat.js +5 -5
- package/dist/shared/assistant/useWorkspaceWriteAccess.d.ts +5 -6
- package/dist/shared/assistant/useWorkspaceWriteAccess.d.ts.map +1 -1
- package/dist/shared/assistant/voice/voiceSession.d.ts +46 -0
- package/dist/shared/assistant/voice/voiceSession.d.ts.map +1 -1
- package/dist/shared/assistant/voice/voiceSession.js +35 -2
- package/dist/shared/assistant/writeConfirmSeam.d.ts +32 -0
- package/dist/shared/assistant/writeConfirmSeam.d.ts.map +1 -0
- package/dist/shared/assistant/writeConfirmSeam.js +23 -0
- package/dist/shared/assistant/writeModeConsent.d.ts +16 -8
- package/dist/shared/assistant/writeModeConsent.d.ts.map +1 -1
- package/dist/shared/assistant/writeModeConsent.js +2 -2
- package/dist/shared/assistant/writeProposalDiscovery.d.ts +187 -0
- package/dist/shared/assistant/writeProposalDiscovery.d.ts.map +1 -0
- package/dist/shared/assistant/writeProposalDiscovery.js +246 -0
- package/dist/shared/assistant/writeProposalErrorCopy.d.ts +135 -0
- package/dist/shared/assistant/writeProposalErrorCopy.d.ts.map +1 -0
- package/dist/shared/assistant/writeProposalErrorCopy.js +135 -0
- package/dist/shared/assistant/writeProposalVoice.d.ts +133 -0
- package/dist/shared/assistant/writeProposalVoice.d.ts.map +1 -0
- package/dist/shared/assistant/writeProposalVoice.js +66 -0
- package/dist/shared/assistant/writeProposals.d.ts +268 -0
- package/dist/shared/assistant/writeProposals.d.ts.map +1 -0
- package/dist/shared/assistant/writeProposals.js +445 -0
- package/dist/shared/assistant/writeReplyBinder.d.ts +166 -0
- package/dist/shared/assistant/writeReplyBinder.d.ts.map +1 -0
- package/dist/shared/assistant/writeReplyBinder.js +233 -0
- package/dist/shared/assistant/writeReplySend.d.ts +110 -0
- package/dist/shared/assistant/writeReplySend.d.ts.map +1 -0
- package/dist/shared/assistant/writeReplySend.js +93 -0
- package/dist/shared-assistant.js +168 -153
- package/dist/ui/modal-shell.d.ts +14 -1
- package/dist/ui/modal-shell.d.ts.map +1 -1
- package/dist/ui/modal-shell.js +8 -6
- package/package.json +1 -1
|
@@ -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 {
|
|
5
|
-
import {
|
|
6
|
-
import {
|
|
7
|
-
import {
|
|
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 =
|
|
25
|
+
}, []), G = n((e) => e.assistantLanguage), K = t({
|
|
26
26
|
onFinalize: pe,
|
|
27
|
-
language: d(() =>
|
|
28
|
-
}), me = oe ?? T("composer.placeholder", "Ask me anything…"), q = k.trim(), J =
|
|
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:
|
|
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":"
|
|
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"}
|