@burdenoff/fe-libs 2026.1001.4 → 2026.1001.6

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 (45) hide show
  1. package/dist/shared/assistant/api.d.ts +12 -0
  2. package/dist/shared/assistant/api.d.ts.map +1 -1
  3. package/dist/shared/assistant/api.js +159 -154
  4. package/dist/shared/assistant/createSandboxAssistantTransport.d.ts.map +1 -1
  5. package/dist/shared/assistant/createSandboxAssistantTransport.js +4 -1
  6. package/dist/shared/assistant/index.d.ts +2 -0
  7. package/dist/shared/assistant/index.d.ts.map +1 -1
  8. package/dist/shared/assistant/permissionError.d.ts +15 -2
  9. package/dist/shared/assistant/permissionError.d.ts.map +1 -1
  10. package/dist/shared/assistant/permissionError.js +24 -14
  11. package/dist/shared/assistant/preview/AssistantPreviewOverlay.js +4 -4
  12. package/dist/shared/assistant/preview/types.d.ts +13 -0
  13. package/dist/shared/assistant/preview/types.d.ts.map +1 -1
  14. package/dist/shared/assistant/preview/useAssistantPreviewBridge.d.ts +21 -1
  15. package/dist/shared/assistant/preview/useAssistantPreviewBridge.d.ts.map +1 -1
  16. package/dist/shared/assistant/preview/useAssistantPreviewBridge.js +1 -1
  17. package/dist/shared/assistant/preview/writeActionResults.d.ts +10 -0
  18. package/dist/shared/assistant/preview/writeActionResults.d.ts.map +1 -0
  19. package/dist/shared/assistant/preview/writeActionResults.js +26 -0
  20. package/dist/shared/assistant/progress.d.ts +9 -1
  21. package/dist/shared/assistant/progress.d.ts.map +1 -1
  22. package/dist/shared/assistant/progress.js +49 -46
  23. package/dist/shared/assistant/quota.d.ts +18 -2
  24. package/dist/shared/assistant/quota.d.ts.map +1 -1
  25. package/dist/shared/assistant/quota.js +46 -42
  26. package/dist/shared/assistant/sandboxProxyError.d.ts +91 -0
  27. package/dist/shared/assistant/sandboxProxyError.d.ts.map +1 -0
  28. package/dist/shared/assistant/sandboxProxyError.js +43 -0
  29. package/dist/shared/assistant/transportErrors.d.ts +14 -1
  30. package/dist/shared/assistant/transportErrors.d.ts.map +1 -1
  31. package/dist/shared/assistant/transportErrors.js +20 -14
  32. package/dist/shared/assistant/turnOutcome.d.ts +27 -3
  33. package/dist/shared/assistant/turnOutcome.d.ts.map +1 -1
  34. package/dist/shared/assistant/turnOutcome.js +82 -31
  35. package/dist/shared/assistant/turnOutcomeCopy.d.ts +24 -0
  36. package/dist/shared/assistant/turnOutcomeCopy.d.ts.map +1 -1
  37. package/dist/shared/assistant/turnOutcomeCopy.js +24 -0
  38. package/dist/shared/assistant/ui/AIAssistantPanel.js +14 -14
  39. package/dist/shared/assistant/ui/AssistantChatArea.d.ts.map +1 -1
  40. package/dist/shared/assistant/ui/AssistantChatArea.js +3 -2
  41. package/dist/shared/assistant/ui/AssistantHeader.js +4 -4
  42. package/dist/shared/assistant/ui/useWriteProposals.d.ts.map +1 -1
  43. package/dist/shared/assistant/ui/useWriteProposals.js +126 -99
  44. package/dist/shared-assistant.js +181 -179
  45. package/package.json +1 -1
@@ -16,6 +16,22 @@ var e = {
16
16
  key: "outcome.usageNotRecorded",
17
17
  fallback: "We couldn't record usage for your last reply, so the assistant is paused for a moment. Try again shortly."
18
18
  },
19
+ usageDailyLimitReached: {
20
+ key: "outcome.usageDailyLimitReached",
21
+ fallback: "You've reached your daily AI assistant limit. It resets at {{time}}."
22
+ },
23
+ usageDailyLimitReachedWorkspace: {
24
+ key: "outcome.usageDailyLimitReachedWorkspace",
25
+ fallback: "This workspace has reached its daily AI assistant limit. It resets at {{time}}."
26
+ },
27
+ usageDailyLimitReachedPlatform: {
28
+ key: "outcome.usageDailyLimitReachedPlatform",
29
+ fallback: "The AI assistant has reached today's usage limit. It resets at {{time}}."
30
+ },
31
+ usageDailyLimitReachedNoTime: {
32
+ key: "outcome.usageDailyLimitReachedNoTime",
33
+ fallback: "You've reached today's AI assistant limit. Try again tomorrow."
34
+ },
19
35
  permissionDenied: {
20
36
  key: "outcome.permissionDenied",
21
37
  fallback: "You do not have permission to do that in this workspace. Ask someone who administers it for access."
@@ -24,6 +40,10 @@ var e = {
24
40
  key: "outcome.sessionUnverified",
25
41
  fallback: "Your session could not be verified for this workspace. Reopen the page, then send again."
26
42
  },
43
+ provisioningNotPermitted: {
44
+ key: "outcome.provisioningNotPermitted",
45
+ fallback: "The AI assistant isn't available for your role in this workspace yet."
46
+ },
27
47
  modeWorkspaceAdminOnly: {
28
48
  key: "outcome.modeWorkspaceAdminOnly",
29
49
  fallback: "This assistant mode is only available to workspace admins. Switch to another mode and send again."
@@ -52,6 +72,10 @@ var e = {
52
72
  key: "outcome.temporaryNotConfirmed",
53
73
  fallback: "The assistant couldn't finish this just now, and no action was confirmed. It's a temporary problem on our side — not your plan or your access. Try again in a moment."
54
74
  },
75
+ conversationTooLong: {
76
+ key: "outcome.conversationTooLong",
77
+ fallback: "This conversation is too long for the assistant. Start a new conversation to continue."
78
+ },
55
79
  reference: {
56
80
  key: "outcome.reference",
57
81
  fallback: "Reference: {{id}}"
@@ -4,11 +4,11 @@ import { useAssistantTr as n } from "../i18n.js";
4
4
  import { AssistantNavigateProvider as r } from "./AssistantMarkdownRenderer.js";
5
5
  import { useAssistantStore as i } from "../store.js";
6
6
  import { AssistantSpeechProvider as a } from "./AssistantSpeechProvider.js";
7
- import { AssistantConnectSourceProvider as o } from "./composer/connectSource.js";
8
- import { ASSISTANT_OVERLAY_ATTR as s, ASSISTANT_PANEL_ATTR as c, activePanelOverlay as l, escapeDismisses as u, nextPanelOverlays as d } from "./panelOverlays.js";
9
- import { hasAssistantPreviewSurface as f } from "../preview/types.js";
10
- import { AssistantPreviewProvider as p } from "../preview/context.js";
11
- import { useAssistantPreviewBridge as m } from "../preview/useAssistantPreviewBridge.js";
7
+ import { AssistantPreviewProvider as o } from "../preview/context.js";
8
+ import { useAssistantPreviewBridge as s } from "../preview/useAssistantPreviewBridge.js";
9
+ import { AssistantConnectSourceProvider as c } from "./composer/connectSource.js";
10
+ import { ASSISTANT_OVERLAY_ATTR as l, ASSISTANT_PANEL_ATTR as u, activePanelOverlay as d, escapeDismisses as f, nextPanelOverlays as p } from "./panelOverlays.js";
11
+ import { hasAssistantPreviewSurface as m } from "../preview/types.js";
12
12
  import { panelOwnedPreviewBridge as h, useHostedAssistantPreviewBridge as g } from "../preview/bridgeHostContext.js";
13
13
  import { AssistantPreviewOverlay as _ } from "../preview/AssistantPreviewOverlay.js";
14
14
  import { AssistantHeader as v } from "./AssistantHeader.js";
@@ -25,17 +25,17 @@ import { jsx as O, jsxs as k } from "react/jsx-runtime";
25
25
  var A = ({ onClose: A, visible: j, docked: M, onToggleDock: N, writeAccess: ee, onNavigate: P, connectSourceHref: F, onConnectSource: I, preview: L, serverHistory: R = !1 }) => {
26
26
  let z = n();
27
27
  x(R);
28
- let [B, V] = D(!1), H = f(L);
28
+ let [B, V] = D(!1), H = m(L);
29
29
  B && !H && V(!1);
30
30
  let U = B && H;
31
- m(h(L, g()));
31
+ s(h(L, g()));
32
32
  let W = E(null);
33
33
  e(W);
34
- let { conversations: G, activeConversationId: K, conversationListOpen: q, setConversationListOpen: J, createConversation: Y } = i(), X = q || U, Z = l({
34
+ let { conversations: G, activeConversationId: K, conversationListOpen: q, setConversationListOpen: J, createConversation: Y } = i(), X = q || U, Z = d({
35
35
  historyOpen: q,
36
36
  previewOpen: U
37
37
  }), Q = (e) => {
38
- let t = d({
38
+ let t = p({
39
39
  historyOpen: q,
40
40
  previewOpen: U
41
41
  }, e);
@@ -46,7 +46,7 @@ var A = ({ onClose: A, visible: j, docked: M, onToggleDock: N, writeAccess: ee,
46
46
  return w({
47
47
  panelRef: W,
48
48
  onClose: () => {
49
- if (u({
49
+ if (f({
50
50
  historyOpen: q,
51
51
  previewOpen: U
52
52
  }) === "overlay") {
@@ -57,11 +57,11 @@ var A = ({ onClose: A, visible: j, docked: M, onToggleDock: N, writeAccess: ee,
57
57
  }
58
58
  }), /* @__PURE__ */ O(a, {
59
59
  visible: j ?? !0,
60
- children: /* @__PURE__ */ O(p, {
60
+ children: /* @__PURE__ */ O(o, {
61
61
  value: L,
62
62
  children: /* @__PURE__ */ O(r, {
63
63
  value: P,
64
- children: /* @__PURE__ */ O(o, {
64
+ children: /* @__PURE__ */ O(c, {
65
65
  value: F,
66
66
  onOpen: I,
67
67
  children: /* @__PURE__ */ O(b, { children: /* @__PURE__ */ k("div", {
@@ -70,8 +70,8 @@ var A = ({ onClose: A, visible: j, docked: M, onToggleDock: N, writeAccess: ee,
70
70
  role: "complementary",
71
71
  "aria-label": z("panel.ariaLabel", "AI Assistant"),
72
72
  "data-testid": "ai-assistant-panel",
73
- [c]: "",
74
- ...Z ? { [s]: Z } : {},
73
+ [u]: "",
74
+ ...Z ? { [l]: Z } : {},
75
75
  tabIndex: -1,
76
76
  children: [
77
77
  /* @__PURE__ */ O("div", {
@@ -1 +1 @@
1
- {"version":3,"file":"AssistantChatArea.d.ts","sourceRoot":"","sources":["../../../../src/shared/assistant/ui/AssistantChatArea.tsx"],"names":[],"mappings":"AAAA,OAAO,EAOL,KAAK,EAAE,EACR,MAAM,OAAO,CAAC;AA8Nf,OAAO,KAAK,EAAE,oBAAoB,EAAE,MAAM,4BAA4B,CAAC;AA8HvE;;;;;GAKG;AACH,MAAM,WAAW,sBAAsB;IACrC,OAAO,CAAC,EAAE,OAAO,CAAC;IAClB;;;;;;;;;;;;OAYG;IACH,WAAW,CAAC,EAAE,oBAAoB,CAAC;CACpC;AAED,eAAO,MAAM,iBAAiB,EAAE,EAAE,CAAC,sBAAsB,CA61JxD,CAAC"}
1
+ {"version":3,"file":"AssistantChatArea.d.ts","sourceRoot":"","sources":["../../../../src/shared/assistant/ui/AssistantChatArea.tsx"],"names":[],"mappings":"AAAA,OAAO,EAOL,KAAK,EAAE,EACR,MAAM,OAAO,CAAC;AA8Nf,OAAO,KAAK,EAAE,oBAAoB,EAAE,MAAM,4BAA4B,CAAC;AA8HvE;;;;;GAKG;AACH,MAAM,WAAW,sBAAsB;IACrC,OAAO,CAAC,EAAE,OAAO,CAAC;IAClB;;;;;;;;;;;;OAYG;IACH,WAAW,CAAC,EAAE,oBAAoB,CAAC;CACpC;AAED,eAAO,MAAM,iBAAiB,EAAE,EAAE,CAAC,sBAAsB,CAm2JxD,CAAC"}
@@ -841,7 +841,8 @@ var Jn = ({ visible: Jn = !0, writeAccess: Yn = "unknown" }) => {
841
841
  }
842
842
  if (w = mt(await fe(i, S, c, v, C, {
843
843
  limit: 50,
844
- sinceMs: h
844
+ sinceMs: h,
845
+ surfaceTurnTerminal: !0
845
846
  }), h, { accumulateNarration: se.accumulatesNarration }), hr(x, T, { content: ye(w.content) }), w.hasRenderableOutput ? Se || (Se = !0, xe !== null && k(T, "lastQuietPoll", xe), k(T, "firstOutput")) : xe = Et(), se.accumulatesNarration) w.hasText && k(T, "firstText");
846
847
  else {
847
848
  let e = vt(Ce, w, Et());
@@ -934,7 +935,7 @@ var Jn = ({ visible: Jn = !0, writeAccess: Yn = "unknown" }) => {
934
935
  capabilities: t ? b.getState().sandboxWriteCapabilities[t] : null
935
936
  }) });
936
937
  O(T, { outcome: r.kind === "temporary" ? "failed" : "refused" }), r.offersUpgrade && Mn(I, "sandbox");
937
- let i = Ce(r, F);
938
+ let i = Ce(r, F, { locale: V });
938
939
  _r(x, "error", T, i.headline), hr(x, T, { content: i.text }), gr(x, T, {
939
940
  lang: i.translated ? V : "en",
940
941
  ...E(n.voiceSessionId)
@@ -1,12 +1,12 @@
1
1
  import { useAssistantTr as e } from "../i18n.js";
2
- import { hasAssistantPreviewSurface as t } from "../preview/types.js";
3
- import { useAssistantPreview as n } from "../preview/context.js";
2
+ import { useAssistantPreview as t } from "../preview/context.js";
3
+ import { hasAssistantPreviewSurface as n } from "../preview/types.js";
4
4
  import { AssistantMoreMenu as r } from "./AssistantMoreMenu.js";
5
5
  import { Eye as i, History as a, PanelBottom as o, PanelRight as s, Plus as c, Sparkles as l, X as u } from "lucide-react";
6
6
  import { Fragment as d, jsx as f, jsxs as p } from "react/jsx-runtime";
7
7
  //#region src/shared/assistant/ui/AssistantHeader.tsx
8
8
  var m = ({ contextLabel: m, onNewConversation: h, onOpenHistory: g, historyOpen: _, onTogglePreview: v, previewOpen: y, onClose: b, docked: x, onToggleDock: S }) => {
9
- let C = e(), w = n();
9
+ let C = e(), w = t();
10
10
  return /* @__PURE__ */ p("div", {
11
11
  className: "flex items-center gap-2 border-b border-border-default bg-bg-elevated px-3 py-2.5",
12
12
  children: [/* @__PURE__ */ p("div", {
@@ -47,7 +47,7 @@ var m = ({ contextLabel: m, onNewConversation: h, onOpenHistory: g, historyOpen:
47
47
  "data-testid": "assistant-open-history",
48
48
  children: /* @__PURE__ */ f(a, { className: "size-4" })
49
49
  }),
50
- t(w) && v && /* @__PURE__ */ f("button", {
50
+ n(w) && v && /* @__PURE__ */ f("button", {
51
51
  type: "button",
52
52
  onClick: v,
53
53
  className: `rounded-lg p-1.5 transition-colors ${y ? "bg-action-primary-bg/15 text-action-primary-bg" : "text-text-secondary hover:bg-bg-sunken hover:text-text-primary"}`,
@@ -1 +1 @@
1
- {"version":3,"file":"useWriteProposals.d.ts","sourceRoot":"","sources":["../../../../src/shared/assistant/ui/useWriteProposals.ts"],"names":[],"mappings":"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"}
1
+ {"version":3,"file":"useWriteProposals.d.ts","sourceRoot":"","sources":["../../../../src/shared/assistant/ui/useWriteProposals.ts"],"names":[],"mappings":"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"}
@@ -4,21 +4,25 @@ import { useAssistantStore as t } from "../store.js";
4
4
  import { readSandboxWriteCapabilitiesOnce as n } from "../api.js";
5
5
  import { writeProposalErrorLine as r } from "../writeProposalErrorCopy.js";
6
6
  import { getOrganizationId as i, getWorkspaceId as a } from "../context.js";
7
- import { writeProposalConfirmState as o } from "./writeProposalPresentation.js";
8
- import { WRITE_PROPOSAL_SANDBOX_MODE as s, createSandboxWriteProposalClient as c } from "../writeProposals.js";
9
- import { createWriteProposalDiscovery as l, readWriteProposalRefs as u, writeProposalSessionsToReopen as d, writeProposalsEnabledFor as f } from "../writeProposalDiscovery.js";
10
- import { WRITE_REPLY_DECLINE_WAIT_MS as p, settleWithin as m, writeReplyLiveState as h } from "../writeReplySend.js";
11
- import { useEffect as g, useMemo as _, useRef as v, useState as y } from "react";
7
+ import { redactWriteProposalText as o, writeProposalConfirmState as s, writeProposalSensitiveTexts as c } from "./writeProposalPresentation.js";
8
+ import { useAssistantPreview as l } from "../preview/context.js";
9
+ import { currentPreviewOwner as u, sameOwner as d } from "../preview/surfaceState.js";
10
+ import { deliverPreviewEvent as f } from "../preview/useAssistantPreviewBridge.js";
11
+ import { writeActionResultEvents as p } from "../preview/writeActionResults.js";
12
+ import { WRITE_PROPOSAL_SANDBOX_MODE as m, createSandboxWriteProposalClient as h } from "../writeProposals.js";
13
+ import { createWriteProposalDiscovery as g, readWriteProposalRefs as _, writeProposalSessionsToReopen as v, writeProposalsEnabledFor as y } from "../writeProposalDiscovery.js";
14
+ import { WRITE_REPLY_DECLINE_WAIT_MS as b, settleWithin as x, writeReplyLiveState as S } from "../writeReplySend.js";
15
+ import { useEffect as C, useMemo as w, useRef as T, useState as E } from "react";
12
16
  //#region src/shared/assistant/ui/useWriteProposals.ts
13
- var b = new Set([
17
+ var D = new Set([
14
18
  "succeeded",
15
19
  "failed",
16
20
  "outcome_unknown",
17
21
  "declined",
18
22
  "superseded",
19
23
  "expired"
20
- ]), x = (e) => `${e.sandboxId}\u0000${e.sessionId}`;
21
- function S(e) {
24
+ ]), O = (e) => `${e.sandboxId}\u0000${e.sessionId}`;
25
+ function k(e) {
22
26
  return {
23
27
  accessToken: e.getAccessToken(),
24
28
  workspaceToken: e.getWorkspaceToken(),
@@ -26,15 +30,15 @@ function S(e) {
26
30
  organizationId: i()
27
31
  };
28
32
  }
29
- function C() {
33
+ function A() {
30
34
  return `${Date.now()}-${Math.random().toString(36).slice(2, 9)}`;
31
35
  }
32
- function w(e) {
36
+ function j(e) {
33
37
  let t = /* @__PURE__ */ new Set();
34
- for (let n of e.messages) for (let e of u(n.metadata)) t.add(e.proposalId);
38
+ for (let n of e.messages) for (let e of _(n.metadata)) t.add(e.proposalId);
35
39
  return t;
36
40
  }
37
- function T(e, t, n) {
41
+ function M(e, t, n) {
38
42
  if (n) {
39
43
  let t = e.messages.find((e) => e.id === n);
40
44
  if (t?.role === "assistant") return t;
@@ -45,11 +49,11 @@ function T(e, t, n) {
45
49
  }
46
50
  return null;
47
51
  }
48
- function E(e) {
52
+ function N(e) {
49
53
  let t = /* @__PURE__ */ new Map();
50
54
  for (let n of e) {
51
55
  if (n.view.status !== "pending") continue;
52
- let e = `${x(n.session)}\u0000${n.session.conversationId}`, r = t.get(e) ?? {
56
+ let e = `${O(n.session)}\u0000${n.session.conversationId}`, r = t.get(e) ?? {
53
57
  session: n.session,
54
58
  proposalIds: []
55
59
  };
@@ -57,192 +61,215 @@ function E(e) {
57
61
  }
58
62
  return t;
59
63
  }
60
- function D(i) {
61
- let { getAccessToken: D, getWorkspaceToken: O, userId: k } = e(), A = v({
64
+ function P(i) {
65
+ let { getAccessToken: P, getWorkspaceToken: F, userId: I } = e(), L = l(), R = T({
62
66
  tr: i.tr,
63
67
  productWriteApproval: i.productWriteApproval ?? "legacy",
64
- getAccessToken: D,
65
- getWorkspaceToken: O,
66
- userId: k
68
+ getAccessToken: P,
69
+ getWorkspaceToken: F,
70
+ userId: I,
71
+ preview: L
67
72
  });
68
- g(() => {
69
- A.current = {
73
+ C(() => {
74
+ R.current = {
70
75
  tr: i.tr,
71
76
  productWriteApproval: i.productWriteApproval ?? "legacy",
72
- getAccessToken: D,
73
- getWorkspaceToken: O,
74
- userId: k
77
+ getAccessToken: P,
78
+ getWorkspaceToken: F,
79
+ userId: I,
80
+ preview: L
75
81
  };
76
82
  });
77
- let [j, M] = y({}), N = v({}), P = v(/* @__PURE__ */ new Map()), F = v(/* @__PURE__ */ new Set()), I = v(null), L = v(/* @__PURE__ */ new Set()), R = v(/* @__PURE__ */ new Map()), z = v(/* @__PURE__ */ new Set()), [B, V] = y(() => /* @__PURE__ */ new Set());
78
- g(() => {
79
- let e = F.current, n = (e) => {
83
+ let [z, B] = E({}), V = T({}), H = T(/* @__PURE__ */ new Map()), U = T(/* @__PURE__ */ new Map()), W = T(/* @__PURE__ */ new Set()), G = T(/* @__PURE__ */ new Map()), K = T(/* @__PURE__ */ new Set()), q = T(null), J = T(/* @__PURE__ */ new Set()), Y = T(/* @__PURE__ */ new Map()), X = T(/* @__PURE__ */ new Set()), [Z, ee] = E(() => /* @__PURE__ */ new Set());
84
+ C(() => {
85
+ let e = K.current, n = t.subscribe((e, t) => {
86
+ e.activeConversationId !== t.activeConversationId && W.current.clear();
87
+ }), i = (e) => {
80
88
  if (e.length === 0) return;
81
- let t = { ...N.current };
82
- for (let n of e) {
83
- let e = t[n.view.proposalId];
84
- e && b.has(e.view.status) && !b.has(n.view.status) || (t[n.view.proposalId] = n);
89
+ let n = { ...V.current };
90
+ for (let r of [...e].sort((e, t) => e.view.createdAt - t.view.createdAt)) {
91
+ let e = n[r.view.proposalId];
92
+ if (!(e && D.has(e.view.status) && !D.has(r.view.status)) && (n[r.view.proposalId] = r, H.current.has(r.view.proposalId) || H.current.set(r.view.proposalId, U.current.get(`${O(r.session)}\u0000${r.session.conversationId}`) ?? u()), r.view.status === "succeeded" && !r.view.result?.errors?.length)) {
93
+ let n = H.current.get(r.view.proposalId);
94
+ if (!n || !d(n, u())) continue;
95
+ let i = t.getState(), a = i.conversations.find((e) => e.id === r.session.conversationId), s = a && (a.messages.find((e) => _(e.metadata).some((e) => e.proposalId === r.view.proposalId)) ?? M(a, r.session, null));
96
+ if (!s) continue;
97
+ if (i.activeConversationId === r.session.conversationId && R.current.preview?.onEvent) for (let e of p(r.view, r.session.conversationId, s.id, n)) W.current.has(e.action.id) || (W.current.add(e.action.id), f(R.current.preview, e));
98
+ if (!e || D.has(e.view.status)) continue;
99
+ i.addMessage(r.session.conversationId, {
100
+ id: A(),
101
+ role: "system",
102
+ content: R.current.tr("writeProposal.status.succeeded", "Done — {{summary}}", { summary: o(r.view.result?.summary || r.view.description.readbackPast, c(r.view)) }),
103
+ timestamp: (/* @__PURE__ */ new Date()).toISOString()
104
+ });
105
+ }
85
106
  }
86
- N.current = t, M(t);
87
- }, i = (e, n, r) => {
107
+ V.current = n, B(n);
108
+ }, s = (e, n, r) => {
88
109
  let i = t.getState(), a = i.conversations.find((t) => t.id === e.conversationId);
89
110
  if (!a) return;
90
- let o = w(a), s = n.filter((e) => !o.has(e.proposalId) && (e.status === "pending" || e.status === "executing"));
111
+ let o = j(a), s = n.filter((e) => !o.has(e.proposalId) && (e.status === "pending" || e.status === "executing"));
91
112
  if (s.length === 0) return;
92
- let c = T(a, e, r);
93
- c && i.mergeMessageMetadata(a.id, c.id, { writeProposalRefs: [...u(c.metadata), ...s.map((t) => ({
113
+ let c = M(a, e, r);
114
+ c && i.mergeMessageMetadata(a.id, c.id, { writeProposalRefs: [..._(c.metadata), ...s.map((t) => ({
94
115
  proposalId: t.proposalId,
95
116
  sandboxId: e.sandboxId,
96
117
  sessionId: e.sessionId
97
118
  }))] });
98
- }, o = l({
99
- client: c({
100
- getWorkspaceId: a,
101
- getAuthContext: () => S(A.current)
102
- }),
119
+ }, l = h({
120
+ getWorkspaceId: a,
121
+ getAuthContext: () => k(R.current)
122
+ }), m = g({
123
+ client: {
124
+ ...l,
125
+ list: (e, t) => {
126
+ let n = `${O(e)}\u0000${e.conversationId}`;
127
+ return U.current.has(n) || U.current.set(n, u()), l.list(e, t);
128
+ }
129
+ },
103
130
  capabilitiesOf: (e) => t.getState().sandboxWriteCapabilities[e],
104
- actorOf: () => A.current.userId,
105
- onList: (e, t, r) => {
106
- let a = {
131
+ actorOf: () => R.current.userId,
132
+ onList: (e, t, n) => {
133
+ let r = {
107
134
  serverNow: t.serverNow,
108
135
  arrivedAt: Date.now()
109
136
  };
110
- P.current.set(x(e), a), n(t.proposals.map((t) => ({
137
+ G.current.set(O(e), r), i(t.proposals.map((t) => ({
111
138
  view: t,
112
- ...a,
139
+ ...r,
113
140
  session: e
114
- }))), i(e, t.proposals, r.turnMessageId);
141
+ }))), s(e, t.proposals, n.turnMessageId);
115
142
  },
116
143
  onView: (e, t) => {
117
- let r = N.current[t.proposalId];
118
- n([{
144
+ let n = V.current[t.proposalId];
145
+ i([{
119
146
  view: t,
120
- ...P.current.get(x(e)) ?? {
121
- serverNow: r?.serverNow ?? NaN,
122
- arrivedAt: r?.arrivedAt ?? NaN
147
+ ...G.current.get(O(e)) ?? {
148
+ serverNow: n?.serverNow ?? NaN,
149
+ arrivedAt: n?.arrivedAt ?? NaN
123
150
  },
124
151
  session: e
125
152
  }]);
126
153
  },
127
154
  onError: (e, n, i) => {
128
- let a = r(n, i), { tr: o } = A.current;
155
+ let a = r(n, i), { tr: o } = R.current;
129
156
  t.getState().addMessage(e.conversationId, {
130
- id: C(),
157
+ id: A(),
131
158
  role: "system",
132
159
  content: o(a.key, a.fallback),
133
160
  timestamp: (/* @__PURE__ */ new Date()).toISOString()
134
161
  });
135
162
  }
136
163
  });
137
- I.current = o;
138
- let s = R.current;
164
+ q.current = m;
165
+ let v = Y.current;
139
166
  return () => {
140
- o.dispose(), I.current === o && (I.current = null), e.clear(), s.clear();
167
+ m.dispose(), n(), q.current === m && (q.current = null), e.clear(), v.clear();
141
168
  };
142
- }, []), g(() => t.subscribe((e, t) => {
169
+ }, []), C(() => t.subscribe((e, t) => {
143
170
  if (e.sandboxWriteCapabilities === t.sandboxWriteCapabilities) return;
144
- let n = R.current;
171
+ let n = Y.current;
145
172
  for (let [t, r] of [...n]) {
146
173
  let i = e.sandboxWriteCapabilities[r.sandboxId];
147
- i && (n.delete(t), f(i) && (F.current.add(x(r)), I.current?.discover(r, "open")));
174
+ i && (n.delete(t), y(i) && (K.current.add(O(r)), q.current?.discover(r, "open")));
148
175
  }
149
176
  }), []);
150
- let H = (e, t) => {
151
- let n = I.current;
177
+ let Q = (e, t) => {
178
+ let n = q.current;
152
179
  if (!n) return;
153
- let r = L.current, i = e.filter((e) => !r.has(e.view.proposalId));
154
- for (let { session: e, proposalIds: a } of E(i).values()) {
180
+ let r = J.current, i = e.filter((e) => !r.has(e.view.proposalId));
181
+ for (let { session: e, proposalIds: a } of N(i).values()) {
155
182
  for (let e of a) r.add(e);
156
183
  n.declineAll(e, t, "system");
157
184
  }
158
- }, U = v(H);
159
- return g(() => {
160
- U.current = H;
161
- }), g(() => t.subscribe((e, t) => {
185
+ }, $ = T(Q);
186
+ return C(() => {
187
+ $.current = Q;
188
+ }), C(() => t.subscribe((e, t) => {
162
189
  if (e.conversations === t.conversations) return;
163
- let n = new Set(e.conversations.map((e) => e.id)), r = Object.values(N.current).filter((e) => !n.has(e.session.conversationId));
164
- r.length > 0 && U.current(r, "conversation_closed");
190
+ let n = new Set(e.conversations.map((e) => e.id)), r = Object.values(V.current).filter((e) => !n.has(e.session.conversationId));
191
+ r.length > 0 && $.current(r, "conversation_closed");
165
192
  }), []), {
166
- panel: _(() => {
193
+ panel: w(() => {
167
194
  let e = (e) => t.getState().sandboxWriteCapabilities[e], r = (e) => {
168
- let t = A.current;
195
+ let t = R.current;
169
196
  if (t.productWriteApproval !== "proposal-v1") return;
170
- let r = z.current;
197
+ let r = X.current;
171
198
  if (r.has(e)) return;
172
199
  let i = a();
173
- i && (r.add(e), n(e, i, s, S(t)).finally(() => r.delete(e)));
200
+ i && (r.add(e), n(e, i, m, k(t)).finally(() => r.delete(e)));
174
201
  };
175
202
  return {
176
203
  afterTurn: (e, t) => {
177
- I.current?.discover(e, "turn", { turnMessageId: t });
204
+ q.current?.discover(e, "turn", { turnMessageId: t });
178
205
  },
179
206
  openConversation: (n) => {
180
- let i = I.current;
207
+ let i = q.current;
181
208
  if (!i) return;
182
- let a = R.current;
209
+ let a = Y.current;
183
210
  for (let [e, t] of [...a]) t.conversationId !== n && a.delete(e);
184
211
  let o = t.getState().conversations.find((e) => e.id === n);
185
- if (o) for (let { session: t, issuing: n } of d(o)) {
212
+ if (o) for (let { session: t, issuing: n } of v(o)) {
186
213
  let o = e(t.sandboxId);
187
- if (f(o)) {
214
+ if (y(o)) {
188
215
  i.discover(t, "open");
189
216
  continue;
190
217
  }
191
- o || (a.set(`${x(t)}\u0000${t.conversationId}`, t), n && r(t.sandboxId));
218
+ o || (a.set(`${O(t)}\u0000${t.conversationId}`, t), n && r(t.sandboxId));
192
219
  }
193
220
  },
194
221
  ensureKnown: (t, n) => {
195
- let r = I.current;
196
- if (!r || N.current[t.proposalId] || !f(e(t.sandboxId))) return;
197
- let i = x(t);
198
- F.current.has(i) || (F.current.add(i), r.discover({
222
+ let r = q.current;
223
+ if (!r || V.current[t.proposalId] || !y(e(t.sandboxId))) return;
224
+ let i = O(t);
225
+ K.current.has(i) || (K.current.add(i), r.discover({
199
226
  sandboxId: t.sandboxId,
200
227
  sessionId: t.sessionId,
201
228
  conversationId: n
202
229
  }, "mount"));
203
230
  },
204
231
  approve: async (e, t) => {
205
- let n = N.current[e.proposalId], r = I.current;
232
+ let n = V.current[e.proposalId], r = q.current;
206
233
  !n || !r || await r.approve(n.session, e, t);
207
234
  },
208
235
  decline: async (e, t, n) => {
209
- let r = N.current[e.proposalId], i = I.current;
236
+ let r = V.current[e.proposalId], i = q.current;
210
237
  !r || !i || await i.decline(r.session, e, t, "button", n);
211
238
  },
212
239
  presented: async (e, t) => {
213
- let n = N.current[e.proposalId], r = I.current;
240
+ let n = V.current[e.proposalId], r = q.current;
214
241
  !n || !r || await r.presented(n.session, e, t);
215
242
  },
216
- entry: (e) => N.current[e],
243
+ entry: (e) => V.current[e],
217
244
  liveFor: (t) => {
218
- let n = I.current;
219
- return h(t ? Object.values(N.current).filter((e) => e.session.conversationId === t && !n?.isRetired(e.session.sandboxId)).map((t) => ({
245
+ let n = q.current;
246
+ return S(t ? Object.values(V.current).filter((e) => e.session.conversationId === t && !n?.isRetired(e.session.sandboxId)).map((t) => ({
220
247
  status: t.view.status,
221
248
  sandboxId: t.session.sandboxId,
222
- offersConfirm: o(t.view, e(t.session.sandboxId)).offerConfirm
249
+ offersConfirm: s(t.view, e(t.session.sandboxId)).offerConfirm
223
250
  })) : []);
224
251
  },
225
252
  declineForReply: async (e, t, n) => {
226
- let r = I.current;
253
+ let r = q.current;
227
254
  if (!r) return;
228
255
  let i = n;
229
- await m([...E(Object.values(N.current).filter((t) => t.session.conversationId === e && !r.isRetired(t.session.sandboxId))).values()].map(({ session: e }) => r.declineAll(e, t, i, { report: !0 })), p);
256
+ await x([...N(Object.values(V.current).filter((t) => t.session.conversationId === e && !r.isRetired(t.session.sandboxId))).values()].map(({ session: e }) => r.declineAll(e, t, i, { report: !0 })), b);
230
257
  },
231
258
  withdraw: (e, t) => {
232
- U.current(Object.values(N.current).filter((t) => t.session.conversationId === e), t);
259
+ $.current(Object.values(V.current).filter((t) => t.session.conversationId === e), t);
233
260
  },
234
261
  retireSandbox: (e) => {
235
- let t = I.current;
236
- !t || t.isRetired(e) || (U.current(Object.values(N.current).filter((t) => t.session.sandboxId === e), "sandbox_replaced"), t.retire(e), V((t) => {
262
+ let t = q.current;
263
+ !t || t.isRetired(e) || ($.current(Object.values(V.current).filter((t) => t.session.sandboxId === e), "sandbox_replaced"), t.retire(e), ee((t) => {
237
264
  let n = new Set(t);
238
265
  return n.add(e), n;
239
266
  }));
240
267
  }
241
268
  };
242
269
  }, []),
243
- entries: j,
244
- retiredSandboxes: B
270
+ entries: z,
271
+ retiredSandboxes: Z
245
272
  };
246
273
  }
247
274
  //#endregion
248
- export { D as useWriteProposals };
275
+ export { P as useWriteProposals };