@burdenoff/fe-libs 2026.1024.2 → 2026.1024.4

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 (151) hide show
  1. package/dist/chrome/FooterBar.d.ts +1 -1
  2. package/dist/chrome/NativePageTransition.d.ts +1 -1
  3. package/dist/chrome/ProductPickerSheet.js +42 -42
  4. package/dist/chrome/ProductSwitcher.d.ts +8 -0
  5. package/dist/chrome/ProductSwitcher.js +83 -72
  6. package/dist/chrome/index.d.ts +9 -9
  7. package/dist/chrome/swipe/swipeMath.d.ts +1 -1
  8. package/dist/shared/assistant/api.d.ts +3 -3
  9. package/dist/shared/assistant/appControls/grammar.d.ts +21 -21
  10. package/dist/shared/assistant/appControls/languageReply.d.ts +1 -1
  11. package/dist/shared/assistant/appControls/names.d.ts +3 -3
  12. package/dist/shared/assistant/appControls/pageAdapters.d.ts +5 -5
  13. package/dist/shared/assistant/appControls/plan.d.ts +38 -38
  14. package/dist/shared/assistant/appControls/types.d.ts +15 -15
  15. package/dist/shared/assistant/appControls/useAssistantControl.d.ts +1 -1
  16. package/dist/shared/assistant/attachmentSources.d.ts +2 -2
  17. package/dist/shared/assistant/attachments.d.ts +5 -5
  18. package/dist/shared/assistant/autoRouting.d.ts +6 -6
  19. package/dist/shared/assistant/avatar/live/LiveAvatarMinutes.d.ts +24 -0
  20. package/dist/shared/assistant/avatar/live/LiveAvatarMinutes.js +161 -0
  21. package/dist/shared/assistant/avatar/live/LiveAvatarStage.js +95 -73
  22. package/dist/shared/assistant/avatar/live/LiveAvatarTabView.d.ts +6 -0
  23. package/dist/shared/assistant/avatar/live/LiveAvatarTabView.js +195 -171
  24. package/dist/shared/assistant/avatar/live/avatarSessionClient.d.ts +77 -1
  25. package/dist/shared/assistant/avatar/live/avatarSessionClient.js +193 -72
  26. package/dist/shared/assistant/avatar/live/createLiveAvatarSeam.d.ts +14 -1
  27. package/dist/shared/assistant/avatar/live/createLiveAvatarSeam.js +65 -40
  28. package/dist/shared/assistant/avatar/live/liveAvatarController.d.ts +64 -2
  29. package/dist/shared/assistant/avatar/live/liveAvatarController.js +403 -242
  30. package/dist/shared/assistant/avatar/live/liveAvatarMinutesView.d.ts +127 -0
  31. package/dist/shared/assistant/avatar/live/liveAvatarMinutesView.js +168 -0
  32. package/dist/shared/assistant/avatar/live/liveAvatarStatus.d.ts +3 -0
  33. package/dist/shared/assistant/avatar/live/liveAvatarStatus.js +11 -7
  34. package/dist/shared/assistant/avatar/useAvatarCopy.d.ts +127 -2
  35. package/dist/shared/assistant/avatar/useAvatarCopy.js +116 -7
  36. package/dist/shared/assistant/conversation.d.ts +20 -20
  37. package/dist/shared/assistant/displayContent.d.ts +4 -4
  38. package/dist/shared/assistant/documentText.d.ts +3 -3
  39. package/dist/shared/assistant/exportConversation.d.ts +1 -1
  40. package/dist/shared/assistant/history/historyControls.d.ts +4 -4
  41. package/dist/shared/assistant/history/historyErrors.d.ts +3 -3
  42. package/dist/shared/assistant/history/historyList.d.ts +5 -5
  43. package/dist/shared/assistant/history/historyMerge.d.ts +4 -4
  44. package/dist/shared/assistant/history/historyOperations.d.ts +1 -1
  45. package/dist/shared/assistant/history/historySearch.d.ts +5 -5
  46. package/dist/shared/assistant/history/historyStatus.d.ts +1 -1
  47. package/dist/shared/assistant/history/historyTypes.d.ts +12 -12
  48. package/dist/shared/assistant/history/profileBoundStorage.d.ts +2 -2
  49. package/dist/shared/assistant/i18n.d.ts +1 -1
  50. package/dist/shared/assistant/i18nManifest.d.ts +566 -535
  51. package/dist/shared/assistant/i18nManifest.js +55 -24
  52. package/dist/shared/assistant/index.d.ts +2 -0
  53. package/dist/shared/assistant/liveDeltas.d.ts +1 -1
  54. package/dist/shared/assistant/liveOverlay.d.ts +1 -1
  55. package/dist/shared/assistant/localUiCommandCopy.d.ts +1 -1
  56. package/dist/shared/assistant/localUiCommands.d.ts +22 -22
  57. package/dist/shared/assistant/localeCommands/engine.d.ts +5 -5
  58. package/dist/shared/assistant/localeCommands/evaluate.d.ts +8 -8
  59. package/dist/shared/assistant/localeCommands/fold.d.ts +2 -2
  60. package/dist/shared/assistant/localeCommands/frames.d.ts +3 -3
  61. package/dist/shared/assistant/localeCommands/gate.d.ts +3 -3
  62. package/dist/shared/assistant/localeCommands/languageNames.d.ts +1 -1
  63. package/dist/shared/assistant/localeCommands/normalise.d.ts +1 -1
  64. package/dist/shared/assistant/localeCommands/types.d.ts +4 -4
  65. package/dist/shared/assistant/modeCapabilities.d.ts +1 -1
  66. package/dist/shared/assistant/modeCopy.d.ts +2 -2
  67. package/dist/shared/assistant/permissionError.d.ts +2 -2
  68. package/dist/shared/assistant/preview/surfaceState.d.ts +1 -1
  69. package/dist/shared/assistant/preview/types.d.ts +5 -5
  70. package/dist/shared/assistant/preview/writeActionResults.d.ts +1 -1
  71. package/dist/shared/assistant/prewarm.d.ts +5 -5
  72. package/dist/shared/assistant/quota.d.ts +2 -2
  73. package/dist/shared/assistant/sandboxReadiness.d.ts +2 -2
  74. package/dist/shared/assistant/speech/speechFeed.d.ts +3 -3
  75. package/dist/shared/assistant/turnOutcome.d.ts +2 -2
  76. package/dist/shared/assistant/turnProgress.d.ts +1 -1
  77. package/dist/shared/assistant/turnState.d.ts +1 -1
  78. package/dist/shared/assistant/turnStream.d.ts +3 -3
  79. package/dist/shared/assistant/turnTimeline.d.ts +13 -13
  80. package/dist/shared/assistant/turnTimingReport.d.ts +1 -1
  81. package/dist/shared/assistant/turnTimingReporter.d.ts +3 -3
  82. package/dist/shared/assistant/ui/AssistantAvatarTabs.d.ts +1 -1
  83. package/dist/shared/assistant/ui/AssistantChatArea.js +17 -17
  84. package/dist/shared/assistant/ui/AssistantHistoryNotices.d.ts +1 -1
  85. package/dist/shared/assistant/ui/AssistantMarkdownRenderer.d.ts +5 -2
  86. package/dist/shared/assistant/ui/AssistantToolActivity.d.ts +1 -1
  87. package/dist/shared/assistant/ui/AssistantUiOfferLink.d.ts +2 -2
  88. package/dist/shared/assistant/ui/AssistantWriteConfirmDialog.d.ts +3 -3
  89. package/dist/shared/assistant/ui/assistantLiveAvatarSeam.d.ts +10 -2
  90. package/dist/shared/assistant/ui/avatar/AssistantAvatarTab.js +78 -76
  91. package/dist/shared/assistant/ui/avatar/avatarAskGate.d.ts +2 -0
  92. package/dist/shared/assistant/ui/avatar/avatarAskGate.js +1 -0
  93. package/dist/shared/assistant/ui/composer/AssistantAttachmentButton.d.ts +1 -1
  94. package/dist/shared/assistant/ui/composer/AssistantConnectSourceItem.d.ts +1 -1
  95. package/dist/shared/assistant/ui/leaveConfirmFocus.d.ts +1 -1
  96. package/dist/shared/assistant/ui/leaveConfirmNavigate.d.ts +3 -3
  97. package/dist/shared/assistant/ui/panelOverlays.d.ts +5 -5
  98. package/dist/shared/assistant/ui/useVoiceSession.d.ts +5 -5
  99. package/dist/shared/assistant/ui/useWriteProposalConfirm.d.ts +4 -4
  100. package/dist/shared/assistant/ui/useWriteProposals.d.ts +2 -2
  101. package/dist/shared/assistant/ui/voice/AssistantVoiceSession.d.ts +1 -1
  102. package/dist/shared/assistant/ui/voice/VoiceCaption.d.ts +1 -1
  103. package/dist/shared/assistant/ui/voice/VoiceWaveform.d.ts +1 -1
  104. package/dist/shared/assistant/ui/voice/voiceSessionEscape.d.ts +2 -2
  105. package/dist/shared/assistant/ui/voice/voiceStartGate.d.ts +6 -6
  106. package/dist/shared/assistant/ui/writeProposalPresentation.d.ts +1 -1
  107. package/dist/shared/assistant/uiActions/actOnResolve.d.ts +5 -5
  108. package/dist/shared/assistant/uiActions/assistantHref.d.ts +2 -2
  109. package/dist/shared/assistant/uiActions/backStack.d.ts +1 -1
  110. package/dist/shared/assistant/uiActions/deixis.d.ts +3 -3
  111. package/dist/shared/assistant/uiActions/entityRoutes.d.ts +1 -1
  112. package/dist/shared/assistant/uiActions/navigationOutcome.d.ts +8 -8
  113. package/dist/shared/assistant/uiActions/offerYesOnSurface.d.ts +1 -1
  114. package/dist/shared/assistant/uiActions/resolveTarget.d.ts +2 -2
  115. package/dist/shared/assistant/uiActions/uiOffers.d.ts +5 -5
  116. package/dist/shared/assistant/usageReporting.d.ts +2 -2
  117. package/dist/shared/assistant/useWorkspaceWriteAccess.d.ts +1 -1
  118. package/dist/shared/assistant/voice/affirmations.d.ts +1 -1
  119. package/dist/shared/assistant/voice/handsFree.d.ts +3 -3
  120. package/dist/shared/assistant/voice/handsfree/bargeIn.d.ts +5 -5
  121. package/dist/shared/assistant/voice/handsfree/echoGate.d.ts +6 -6
  122. package/dist/shared/assistant/voice/handsfree/handsFreeController.d.ts +7 -7
  123. package/dist/shared/assistant/voice/handsfree/handsFreeSetting.d.ts +2 -2
  124. package/dist/shared/assistant/voice/handsfree/micCapture.d.ts +1 -1
  125. package/dist/shared/assistant/voice/handsfree/playbackReference.d.ts +1 -1
  126. package/dist/shared/assistant/voice/handsfree/sttTransport.d.ts +3 -3
  127. package/dist/shared/assistant/voice/handsfree/useHandsFreeInterrupt.d.ts +4 -4
  128. package/dist/shared/assistant/voice/handsfree/vad.d.ts +1 -1
  129. package/dist/shared/assistant/voice/speechPlayback.d.ts +7 -7
  130. package/dist/shared/assistant/voice/useVoiceInput.d.ts +1 -1
  131. package/dist/shared/assistant/voice/voiceReopen.d.ts +8 -8
  132. package/dist/shared/assistant/writeConfirmSeam.d.ts +1 -1
  133. package/dist/shared/assistant/writeModeConsent.d.ts +7 -7
  134. package/dist/shared/assistant/writeProposalDiscovery.d.ts +3 -3
  135. package/dist/shared/assistant/writeProposalErrorCopy.d.ts +1 -1
  136. package/dist/shared/assistant/writeProposals.d.ts +23 -23
  137. package/dist/shared/assistant/writeReplyBinder.d.ts +11 -11
  138. package/dist/shared/assistant/writeReplySend.d.ts +7 -7
  139. package/dist/shared/components/LandingOrDashboardRedirect.d.ts +18 -3
  140. package/dist/shared/components/LandingOrDashboardRedirect.js +58 -28
  141. package/dist/shared/components/index.d.ts +2 -1
  142. package/dist/shared/events/index.d.ts +2 -1
  143. package/dist/shared/hooks/shell/globalSearchError.d.ts +2 -2
  144. package/dist/shared/navigation/productSwitchHandoff.d.ts +45 -0
  145. package/dist/shared/navigation/productSwitchHandoff.js +27 -0
  146. package/dist/shared/navigation/unsavedChanges.d.ts +1 -1
  147. package/dist/shared/utils/index.d.ts +3 -3
  148. package/dist/shared-assistant.js +227 -225
  149. package/dist/shared-components.js +7 -6
  150. package/dist/shared.js +71 -70
  151. package/package.json +3 -2
@@ -4,23 +4,121 @@ import { VOICE_THINKING_LABEL as n } from "../voice/voiceStatus.js";
4
4
  import { useMemo as r } from "react";
5
5
  //#region src/shared/assistant/avatar/useAvatarCopy.ts
6
6
  var i = {
7
+ title: {
8
+ key: "avatar.minutes.howCounted.title",
9
+ fallback: "How avatar credits are counted"
10
+ },
11
+ unit: {
12
+ key: "avatar.minutes.howCounted.unit",
13
+ fallback: "1 credit = 1 minute of avatar time."
14
+ },
15
+ start: {
16
+ key: "avatar.minutes.howCounted.start",
17
+ fallback: "Counting starts once you and the avatar are both connected. Waiting for the avatar and starts that fail are free."
18
+ },
19
+ rounding: {
20
+ key: "avatar.minutes.howCounted.rounding",
21
+ fallback: "Each started minute uses one avatar credit. For example, a 2-minute-10-second session uses 3 credits."
22
+ },
23
+ drops: {
24
+ key: "avatar.minutes.howCounted.drops",
25
+ fallback: "Short connection drops that don't end the session count as part of it, like a phone call."
26
+ },
27
+ lost: {
28
+ key: "avatar.minutes.howCounted.lost",
29
+ fallback: "If the connection is lost, counting stops at the last moment we saw you both connected, minus a {{seconds}}-second safety margin."
30
+ },
31
+ lostNoFigure: {
32
+ key: "avatar.minutes.howCounted.lostNoFigure",
33
+ fallback: "If the connection is lost, counting stops at the last moment we saw you both connected, minus a safety margin."
34
+ },
35
+ ourEnd: {
36
+ key: "avatar.minutes.howCounted.ourEnd",
37
+ fallback: "If we stop the session because of a problem or maintenance on our side, or the avatar fails, the unfinished minute is free."
38
+ },
39
+ support: {
40
+ key: "avatar.minutes.howCounted.support",
41
+ fallback: "If something looks wrong, contact support: we credit the whole session back."
42
+ }
43
+ }, a = {
7
44
  hour: "numeric",
8
45
  minute: "2-digit"
9
- }, a = {
46
+ }, o = {
10
47
  month: "short",
11
48
  day: "numeric",
12
49
  hour: "numeric",
13
50
  minute: "2-digit"
14
51
  };
15
- function o(e, t, n) {
16
- let r = new Date(e).toDateString() === new Date(t).toDateString() ? i : a;
52
+ function s(e, t, n) {
53
+ let r = new Date(e).toDateString() === new Date(t).toDateString() ? a : o;
17
54
  try {
18
55
  return new Intl.DateTimeFormat(n, r).format(e);
19
56
  } catch {
20
57
  return new Intl.DateTimeFormat("en", r).format(e);
21
58
  }
22
59
  }
23
- function s() {
60
+ var c = {
61
+ timeZone: "UTC",
62
+ day: "numeric",
63
+ month: "short"
64
+ }, l = /* @__PURE__ */ new Map(), u = /* @__PURE__ */ new Map();
65
+ function d(e, t) {
66
+ let n = t ?? "", r = l.get(n);
67
+ if (r === void 0) {
68
+ try {
69
+ r = new Intl.DateTimeFormat(t, c);
70
+ } catch {
71
+ r = new Intl.DateTimeFormat("en", c);
72
+ }
73
+ l.set(n, r);
74
+ }
75
+ return r.format(e);
76
+ }
77
+ function f(e, t) {
78
+ let n = t ?? "", r = u.get(n);
79
+ if (r === void 0) {
80
+ try {
81
+ r = new Intl.NumberFormat(t, { maximumFractionDigits: 0 });
82
+ } catch {
83
+ r = new Intl.NumberFormat("en", { maximumFractionDigits: 0 });
84
+ }
85
+ u.set(n, r);
86
+ }
87
+ return r.format(e);
88
+ }
89
+ function p(e, t) {
90
+ let n = (e) => f(e, t), r = (e) => d(e, t), a = (t, n) => e(t.key, t.fallback, n), o = i;
91
+ return {
92
+ left: (t) => e("avatar.minutes.left", "Avatar credits left: {{count}}", { count: n(t) }),
93
+ shared: e("avatar.minutes.shared", "Everyone in this workspace shares these credits."),
94
+ freePerMonth: (t) => e("avatar.minutes.freePerMonth", "Free avatar credits each month: {{count}}", { count: n(t) }),
95
+ noFree: e("avatar.minutes.noFree", "No free avatar credits are included."),
96
+ planPerMonth: (t) => e("avatar.minutes.planPerMonth", "Avatar credits from paid plans each month: {{count}}", { count: n(t) }),
97
+ resetsOn: (t) => e("avatar.minutes.resetsOn", "Avatar credits reset on {{date}} (UTC).", { date: r(t) }),
98
+ freePerPerson: (t) => e("avatar.minutes.freePerPerson", "Free avatar credits per person each month: {{count}}", { count: n(t) }),
99
+ low: e("avatar.minutes.low", "Avatar credits are running low. The avatar stops when they run out."),
100
+ sessionLeft: (t) => e("avatar.minutes.sessionLeft", "Minutes left in this session: about {{count}}", { count: n(t) }),
101
+ seePlans: e("avatar.minutes.seePlans", "See plans"),
102
+ askAdmin: e("avatar.minutes.askAdmin", "Ask your billing administrator about a plan with more avatar credits."),
103
+ checkAgain: e("avatar.minutes.checkAgain", "Check again"),
104
+ checking: e("avatar.minutes.checking", "Checking…"),
105
+ checkingPlan: e("avatar.minutes.checkingPlan", "Checking your plan…"),
106
+ assignPlan: e("avatar.minutes.assignPlan", "Assign your new plan to this workspace in Billing to use its credits."),
107
+ ended: e("avatar.minutes.ended", "The avatar stopped because this workspace’s avatar credits ran out. Continuing with voice only."),
108
+ endedNoVoice: e("avatar.minutes.endedNoVoice", "The avatar stopped because this workspace’s avatar credits ran out."),
109
+ howCountedTitle: a(o.title),
110
+ howCounted: (e) => [
111
+ a(o.unit),
112
+ a(o.start),
113
+ a(o.rounding),
114
+ a(o.drops),
115
+ e === null ? a(o.lostNoFigure) : a(o.lost, { seconds: n(e) }),
116
+ a(o.ourEnd),
117
+ a(o.support)
118
+ ]
119
+ };
120
+ }
121
+ function m() {
24
122
  let i = t(), { locale: a } = e();
25
123
  return r(() => ({
26
124
  toggle: i("avatar.toggle", "Live avatar"),
@@ -58,7 +156,7 @@ function s() {
58
156
  chooserLocked: i("avatar.chooserLocked", "Turn off the avatar to change it."),
59
157
  tabLeaveHint: i("avatar.tabLeaveHint", "Leaving the Avatar tab turns the avatar off."),
60
158
  availableAgain: (e) => i("avatar.availableAgain", "You can start it again at {{time}}.", { time: e }),
61
- retryTime: (e, t) => o(e, t, a),
159
+ retryTime: (e, t) => s(e, t, a),
62
160
  stateTimeLimitNoVoice: i("avatar.stateTimeLimitNoVoice", "The avatar reached its time limit."),
63
161
  stateVoiceOnlyNoVoice: i("avatar.stateVoiceOnlyNoVoice", "The avatar is unavailable right now."),
64
162
  turnOnStarting: i("avatar.turnOnStarting", "Starting the avatar…"),
@@ -89,6 +187,7 @@ function s() {
89
187
  case "mode-escalated": return i("avatar.askMode", "This conversation can make changes, so typed questions to the avatar aren't available here. Start a new conversation to ask one.");
90
188
  case "avatar-off": return i("avatar.askNeedsAvatar", "Turn on the avatar to send your question. You can type it now.");
91
189
  case "avatar-again": return i("avatar.askAgain", "You can send your question when the avatar is on again.");
190
+ case "avatar-minutes": return i("avatar.askNoMinutes", "You can send your question when avatar credits are available.");
92
191
  case "sound": return i("avatar.askSound", "Turn on the avatar's sound first.");
93
192
  case "starting": return i("avatar.askStarting", "You can send your question when the avatar is ready.");
94
193
  case "busy": return i("avatar.askBusy", "You can send your question when the assistant is ready.");
@@ -135,9 +234,19 @@ function s() {
135
234
  case "needs-hosted-voice": return i("avatar.problemNeedsHostedVoice", "The avatar needs one of the assistant’s own voices. Choose one in the voice settings.");
136
235
  case "unsupported-browser": return i("avatar.problemUnsupportedBrowser", "This browser can’t show the avatar.");
137
236
  case "playback-blocked": return i("avatar.problemPlaybackBlocked", "The browser blocked the avatar’s sound. Tap the avatar to turn it on.");
237
+ case "minutes-exhausted": switch (t.minutesReason) {
238
+ case "FREE_CEILING": return i("avatar.problemMinutesFreeCeiling", "You’ve used your free avatar credits for this month.");
239
+ case "NOT_INCLUDED": return i("avatar.problemMinutesNotIncluded", "Avatar credits aren’t included for this workspace.");
240
+ case "ZERO_SESSION_LIMIT": return i("avatar.problemMinutesZeroSessionLimit", "You’ve started too many short avatar sessions today.");
241
+ default: return t.minutesResetsAt === void 0 || t.minutesResetsAt === null ? i("avatar.problemMinutesExhausted", "No avatar credits left in this workspace.") : i("avatar.problemMinutesExhaustedUntil", "No avatar credits left in this workspace. They come back on {{date}} (UTC).", { date: d(t.minutesResetsAt, a) });
242
+ }
243
+ case "minutes-in-use": return r ? i("avatar.problemMinutesInUseTimed", "Avatar credits are in use in another session.") : i("avatar.problemMinutesInUse", "Avatar credits are in use in another session. Try again when it ends.");
244
+ case "minutes-in-use-self": return r ? i("avatar.problemMinutesInUseSelfTimed", "Your avatar is still running on another device. End it there.") : i("avatar.problemMinutesInUseSelf", "Your avatar is still running on another device. End it there, or try again when it ends.");
245
+ case "minutes-unavailable": return r ? i("avatar.problemMinutesUnavailableTimed", "Avatar credits can’t be checked right now.") : i("avatar.problemMinutesUnavailable", "Avatar credits can’t be checked right now. Try again in a moment.");
138
246
  }
139
- }
247
+ },
248
+ minutes: p(i, a)
140
249
  }), [i, a]);
141
250
  }
142
251
  //#endregion
143
- export { o as formatAvatarRetryTime, s as useAvatarCopy };
252
+ export { i as AVATAR_MINUTES_HOW_COUNTED, f as formatAvatarCount, d as formatAvatarMinutesDate, s as formatAvatarRetryTime, m as useAvatarCopy };
@@ -2,8 +2,8 @@ import { PendingWrite } from './pendingWrite';
2
2
  import { WriteProposalMessageRef } from './writeProposalDiscovery';
3
3
  import { AssistantMessageAttachment } from './attachments';
4
4
  import { AssistantMode, AssistantTokenUsage } from './types';
5
- export type AssistantSandboxStatus = "none" | "provisioning" | "running" | "stopping" | "error";
6
- export type AssistantConversationStatus = "idle" | "provisioning" | "connecting" | "streaming" | "complete" | "error";
5
+ export type AssistantSandboxStatus = 'none' | 'provisioning' | 'running' | 'stopping' | 'error';
6
+ export type AssistantConversationStatus = 'idle' | 'provisioning' | 'connecting' | 'streaming' | 'complete' | 'error';
7
7
  /**
8
8
  * ★ `AssistantPanelArtifact`, not `AssistantArtifact`. The transport already
9
9
  * exports an `AssistantArtifact` in `./types` and the two genuinely differ —
@@ -17,7 +17,7 @@ export type AssistantConversationStatus = "idle" | "provisioning" | "connecting"
17
17
  export interface AssistantPanelArtifact {
18
18
  name: string;
19
19
  path: string;
20
- type: "file" | "directory";
20
+ type: 'file' | 'directory';
21
21
  size: number;
22
22
  downloadPath?: string;
23
23
  }
@@ -35,7 +35,7 @@ export interface AssistantPanelArtifact {
35
35
  * history). Each string is at most 256 characters.
36
36
  */
37
37
  export interface AssistantNavigateAction {
38
- kind: "navigate";
38
+ kind: 'navigate';
39
39
  destinationId: string;
40
40
  path: string;
41
41
  alreadyHere: boolean;
@@ -51,36 +51,36 @@ export interface AssistantNavigateAction {
51
51
  /** ★ N3: the sandbox's offer id (`uo_` + 32 hex) — only with `via: "offer"`. */
52
52
  offerId?: string;
53
53
  }
54
- export type AssistantNavigateVia = "named" | "link" | "choice" | "back" | "offer";
54
+ export type AssistantNavigateVia = 'named' | 'link' | 'choice' | 'back' | 'offer';
55
55
  /**
56
56
  * ★ BOFF-8060 (N3): `tap` — the "Open {page}" link; `deixis` — "take me there";
57
57
  * `yes` — a bare "yes" the binder accepted (§6); `resolve` — act-on-resolve
58
58
  * (§8), the person's own explicit request answered by exactly one offer.
59
59
  */
60
- export type AssistantNavigateOfferTrigger = "tap" | "deixis" | "yes" | "resolve";
61
- export type AssistantNavigateOutcome = "arrived" | "redirected" | "new-tab" | "refused" | "unconfirmed";
60
+ export type AssistantNavigateOfferTrigger = 'tap' | 'deixis' | 'yes' | 'resolve';
61
+ export type AssistantNavigateOutcome = 'arrived' | 'redirected' | 'new-tab' | 'refused' | 'unconfirmed';
62
62
  /**
63
63
  * ★ BOFF-8060: an app control the panel operated (header, sidebar, language,
64
64
  * assistant panel, page). `control` names the registry key; `outcome` is what
65
65
  * happened — `confirm` is a workspace switch or logout waiting for its button.
66
66
  */
67
67
  export interface AssistantAppControlAction {
68
- kind: "app-control";
68
+ kind: 'app-control';
69
69
  control: string;
70
70
  outcome: AssistantAppControlOutcome;
71
71
  /** Optional display parameter for a language confirmation; never an instruction. */
72
72
  languageLabel?: string;
73
73
  }
74
- export type AssistantAppControlOutcome = "done" | "already" | "failed" | "blocked" | "not-found" | "ambiguous" | "confirm";
74
+ export type AssistantAppControlOutcome = 'done' | 'already' | 'failed' | 'blocked' | 'not-found' | 'ambiguous' | 'confirm';
75
75
  export type AssistantLocalAction = {
76
- kind: "theme";
76
+ kind: 'theme';
77
77
  mode: string;
78
78
  alreadyApplied: boolean;
79
79
  } | AssistantAppControlAction | AssistantNavigateAction | {
80
- kind: "choose-destination";
80
+ kind: 'choose-destination';
81
81
  candidateIds: string[];
82
82
  } | {
83
- kind: "write-reply";
83
+ kind: 'write-reply';
84
84
  line: string;
85
85
  };
86
86
  export interface AssistantMessageMetadata {
@@ -185,7 +185,7 @@ export interface AssistantMessageMetadata {
185
185
  * contains a payload or approval capability, and never leaves for history.
186
186
  */
187
187
  writeProposalTransportNote?: WriteProposalMessageRef & {
188
- status: "uncertain" | "succeeded" | "failed" | "declined" | "superseded" | "expired";
188
+ status: 'uncertain' | 'succeeded' | 'failed' | 'declined' | 'superseded' | 'expired';
189
189
  };
190
190
  /**
191
191
  * ★ BOFF-7802: this reply is a UI command the panel carried out ITSELF — a
@@ -238,7 +238,7 @@ export interface AssistantMessageMetadata {
238
238
  [key: string]: unknown;
239
239
  }
240
240
  /** Where a recorded action stands. `proposed` never survives a reload (it reads back as `expired`). */
241
- export type AssistantHistoryRecordStatus = "proposed" | "applied" | "failed" | "expired" | "cancelled";
241
+ export type AssistantHistoryRecordStatus = 'proposed' | 'applied' | 'failed' | 'expired' | 'cancelled';
242
242
  /**
243
243
  * One structured record on a message (BOFF-7335). `kind` is namespaced by the
244
244
  * feature that writes it (`[a-z][a-z0-9._-]*`) and `version` versions its
@@ -256,7 +256,7 @@ export interface AssistantHistoryRecord {
256
256
  }
257
257
  export interface Message {
258
258
  id: string;
259
- role: "user" | "assistant" | "system";
259
+ role: 'user' | 'assistant' | 'system';
260
260
  content: string;
261
261
  timestamp: string;
262
262
  tokens?: AssistantTokenUsage;
@@ -274,7 +274,7 @@ export interface Message {
274
274
  historySeq?: number;
275
275
  }
276
276
  /** See `Message.historyState`. */
277
- export type MessageHistoryState = "pending" | "saved";
277
+ export type MessageHistoryState = 'pending' | 'saved';
278
278
  export interface Conversation {
279
279
  id: string;
280
280
  title: string;
@@ -337,7 +337,7 @@ export interface ConversationSyncStamp {
337
337
  workspaceId: string;
338
338
  actorId: string;
339
339
  /** `created` on this device · `remote` read from the server · `legacy` saved before v2 (read-only). */
340
- origin: "created" | "remote" | "legacy";
340
+ origin: 'created' | 'remote' | 'legacy';
341
341
  /** The server's own id, once known. */
342
342
  serverId?: string;
343
343
  /** The server revision of the conversation last applied here. */
@@ -355,7 +355,7 @@ export interface ConversationSyncStamp {
355
355
  */
356
356
  titleLocked?: true;
357
357
  /** Why the latest turns are not being saved. */
358
- blocked?: "quota" | "invalid" | "scope";
358
+ blocked?: 'quota' | 'invalid' | 'scope';
359
359
  /** When it was last opened here (ISO), for cache eviction. */
360
360
  openedAt?: string;
361
361
  }
@@ -363,7 +363,7 @@ export interface ConversationSyncStamp {
363
363
  * How a conversation came by its mode. See `Conversation.routedBy` and
364
364
  * `autoRouting.ts`.
365
365
  */
366
- export type ConversationRouting = "auto";
366
+ export type ConversationRouting = 'auto';
367
367
  export interface AssistantSandboxRuntime {
368
368
  sandboxId: string;
369
369
  status: AssistantSandboxStatus;
@@ -382,7 +382,7 @@ export interface AssistantSandboxRuntime {
382
382
  * environment steps, and `connecting` is only ever shown as "Preparing
383
383
  * session...". The names are `STAGE_COPY`'s keys, which `stageCopy.ts` enforces.
384
384
  */
385
- export type AssistantTurnStage = "reusingEnvironment" | "lookingForEnvironment" | "startingEnvironment" | "preparingSession" | "connecting" | "thinking";
385
+ export type AssistantTurnStage = 'reusingEnvironment' | 'lookingForEnvironment' | 'startingEnvironment' | 'preparingSession' | 'connecting' | 'thinking';
386
386
  export interface AssistantConversationProcessing {
387
387
  status: AssistantConversationStatus;
388
388
  messageId: string | null;
@@ -16,13 +16,13 @@ import { AssistantTr } from './i18n';
16
16
  * session never advances on anything else.
17
17
  */
18
18
  export type AssistantDisplayContent = {
19
- readonly kind: "output";
19
+ readonly kind: 'output';
20
20
  readonly text: string;
21
21
  } | {
22
- readonly kind: "working";
23
- readonly text: "";
22
+ readonly kind: 'working';
23
+ readonly text: '';
24
24
  } | {
25
- readonly kind: "stopped";
25
+ readonly kind: 'stopped';
26
26
  readonly text: string;
27
27
  };
28
28
  /**
@@ -65,11 +65,11 @@ export declare const MIN_TEXT_PAGE_SHARE = 0.5;
65
65
  * both have to look different from one we never tried. Silence here is what
66
66
  * makes an assistant answer confidently about a file it never saw.
67
67
  */
68
- export type DocumentExtractionStatus = "ok" | "no-text" | "encrypted" | "corrupt"
68
+ export type DocumentExtractionStatus = 'ok' | 'no-text' | 'encrypted' | 'corrupt'
69
69
  /** No extractor for this type — we did not even try. */
70
- | "unsupported";
70
+ | 'unsupported';
71
71
  /** Document formats we can turn into text in the browser. */
72
- export type DocumentFormat = "pdf" | "docx" | "xlsx";
72
+ export type DocumentFormat = 'pdf' | 'docx' | 'xlsx';
73
73
  export interface DocumentExtraction {
74
74
  status: DocumentExtractionStatus;
75
75
  /**
@@ -9,7 +9,7 @@ export interface ExportConversationOptions {
9
9
  /** The product's translator, for "Stopped". English when omitted. */
10
10
  tr?: AssistantTr;
11
11
  }
12
- export declare function exportConversation(conversation: Conversation, format: "json" | "markdown", options?: ExportConversationOptions): {
12
+ export declare function exportConversation(conversation: Conversation, format: 'json' | 'markdown', options?: ExportConversationOptions): {
13
13
  content: string;
14
14
  filename: string;
15
15
  mimeType: string;
@@ -41,7 +41,7 @@ export declare function isValidUpdatePatch(patch: AssistantHistoryUpdatePatch):
41
41
  * voice marker on its USER messages (notes and replies do not count; a local
42
42
  * command counts as the person's turn, as on the server). Null with none.
43
43
  */
44
- export declare function localChannelOf(conversation: Pick<Conversation, "messages">): AssistantHistoryChannel | null;
44
+ export declare function localChannelOf(conversation: Pick<Conversation, 'messages'>): AssistantHistoryChannel | null;
45
45
  /** A queued control change, as the row reads it. */
46
46
  export interface AssistantHistoryPendingUpdate {
47
47
  patch: AssistantHistoryUpdatePatch;
@@ -75,7 +75,7 @@ export interface AssistantHistoryRowControls {
75
75
  * held conversation's title in step with the server, and a title renamed on
76
76
  * this device before renames were synced — `titleLocked` — stays here).
77
77
  */
78
- export declare function resolveRowControls(conversation: Pick<Conversation, "messages"> | null, header: AssistantHistoryHeader | null, pending?: readonly AssistantHistoryPendingUpdate[]): AssistantHistoryRowControls;
78
+ export declare function resolveRowControls(conversation: Pick<Conversation, 'messages'> | null, header: AssistantHistoryHeader | null, pending?: readonly AssistantHistoryPendingUpdate[]): AssistantHistoryRowControls;
79
79
  /** The list's default: every conversation that is not archived. */
80
80
  export declare const DEFAULT_HISTORY_LIST_FILTER: Readonly<AssistantHistoryConversationFilter>;
81
81
  /**
@@ -84,7 +84,7 @@ export declare const DEFAULT_HISTORY_LIST_FILTER: Readonly<AssistantHistoryConve
84
84
  * and a MIXED row matches both. A row whose channel is unknown matches only
85
85
  * ANY. Archived rows are left out unless asked for.
86
86
  */
87
- export declare function matchesHistoryFilter(row: Pick<AssistantHistoryRowControls, "pinnedAt" | "archivedAt" | "channel">, filter?: Readonly<AssistantHistoryConversationFilter>): boolean;
87
+ export declare function matchesHistoryFilter(row: Pick<AssistantHistoryRowControls, 'pinnedAt' | 'archivedAt' | 'channel'>, filter?: Readonly<AssistantHistoryConversationFilter>): boolean;
88
88
  /**
89
89
  * A filter as a stable key ("" for none): the list's "Show older" listing is
90
90
  * paged per filter, and its `hasMore` answers for one key only.
@@ -97,5 +97,5 @@ export declare function isDefaultHistoryFilter(filter: Readonly<AssistantHistory
97
97
  * them — Archived, then Pinned, then the channel. Null for the default
98
98
  * filter, whose empty list is "No conversations yet".
99
99
  */
100
- export type HistoryFilterEmptyKind = "archived" | "pinned" | "voice" | "chat";
100
+ export type HistoryFilterEmptyKind = 'archived' | 'pinned' | 'voice' | 'chat';
101
101
  export declare function historyFilterEmptyKind(filter: Readonly<AssistantHistoryConversationFilter>): HistoryFilterEmptyKind | null;
@@ -32,7 +32,7 @@
32
32
  * carries on and nothing pauses. Only a call that has no such document (a
33
33
  * control change, a filtered list) is refused this way, and it waits.
34
34
  */
35
- export type AssistantHistoryErrorClass = "schema-unavailable" | "rejected" | "quota" | "auth" | "not-found" | "scope-inactive" | "controls-unavailable" | "transient";
35
+ export type AssistantHistoryErrorClass = 'schema-unavailable' | 'rejected' | 'quota' | 'auth' | 'not-found' | 'scope-inactive' | 'controls-unavailable' | 'transient';
36
36
  export interface AssistantHistoryErrorVerdict {
37
37
  class: AssistantHistoryErrorClass;
38
38
  /** The first `extensions.code` found, for logs. */
@@ -67,7 +67,7 @@ export declare const ASSISTANT_HISTORY_BACKOFF_MAX_MS: number;
67
67
  * changes, or (a control change) until the server has the controls again;
68
68
  * `retry` — this item after `delayMs`.
69
69
  */
70
- export type AssistantHistoryRetryAction = "drop" | "pause" | "park" | "hold" | "retry";
70
+ export type AssistantHistoryRetryAction = 'drop' | 'pause' | 'park' | 'hold' | 'retry';
71
71
  export interface AssistantHistoryRetryPlan {
72
72
  action: AssistantHistoryRetryAction;
73
73
  delayMs: number;
@@ -86,6 +86,6 @@ export declare function assistantHistoryBackoffMs(attempts: number, random?: ()
86
86
  * be stored, and the list then shows what the server holds.
87
87
  */
88
88
  export declare function planAssistantHistoryRetry(verdict: AssistantHistoryErrorVerdict, item: {
89
- type: "save" | "delete" | "update";
89
+ type: 'save' | 'delete' | 'update';
90
90
  attempts: number;
91
91
  }, random?: () => number): AssistantHistoryRetryPlan;
@@ -5,7 +5,7 @@ import { AssistantHistoryChannel, AssistantHistoryConvKey, AssistantHistoryConve
5
5
  /** The scope a stamped conversation belongs to. */
6
6
  export declare function historyScopeKeyOfStamp(sync: ConversationSyncStamp): AssistantHistoryScopeKey;
7
7
  /** A server conversation's key here: its client id, or `legacy:<id>` for a pre-v2 row. */
8
- export declare function historyConvKeyOf(conversation: Pick<AssistantHistoryServerConversation, "id" | "clientConversationId">): AssistantHistoryConvKey;
8
+ export declare function historyConvKeyOf(conversation: Pick<AssistantHistoryServerConversation, 'id' | 'clientConversationId'>): AssistantHistoryConvKey;
9
9
  /**
10
10
  * The header the list keeps for a live server conversation. The history
11
11
  * controls are copied only when the server's answer carried them: a header
@@ -23,7 +23,7 @@ export declare function conversationHasHistory(conversation: Conversation): bool
23
23
  * never used as context — the composer is disabled while it is open, and a
24
24
  * send that arrives anyway starts a new conversation.
25
25
  */
26
- export declare function isReadOnlyHistoryConversation(conversation: Pick<Conversation, "sync"> | undefined): boolean;
26
+ export declare function isReadOnlyHistoryConversation(conversation: Pick<Conversation, 'sync'> | undefined): boolean;
27
27
  /**
28
28
  * Stamped for another owner than a conversation created now would get
29
29
  * (`stamp`): another account, workspace or product. Such a conversation is
@@ -33,7 +33,7 @@ export declare function isReadOnlyHistoryConversation(conversation: Pick<Convers
33
33
  * (history off, or the owner unknown) there is nothing to compare with, and
34
34
  * nothing is "other".
35
35
  */
36
- export declare function isOtherScopeHistoryConversation(conversation: Pick<Conversation, "sync"> | undefined, stamp: AssistantHistoryScope | null): boolean;
36
+ export declare function isOtherScopeHistoryConversation(conversation: Pick<Conversation, 'sync'> | undefined, stamp: AssistantHistoryScope | null): boolean;
37
37
  /**
38
38
  * May `conversation` be reused as a fresh draft by a mode switch? Only an
39
39
  * empty one with nothing to lose (`conversationHasHistory`) — and only one
@@ -75,7 +75,7 @@ export interface AssistantHistoryListRow {
75
75
  /** Saved before v2: opens read-only. */
76
76
  legacy: boolean;
77
77
  /** Why its latest turns are not being saved. */
78
- blocked?: ConversationSyncStamp["blocked"];
78
+ blocked?: ConversationSyncStamp['blocked'];
79
79
  loading: boolean;
80
80
  /** When it was pinned (a queued pin: when the person pinned it). Null: not pinned. */
81
81
  pinnedAt: string | null;
@@ -138,7 +138,7 @@ export declare function selectAssistantHistoryList(input: AssistantHistoryListIn
138
138
  * here with nothing saved or queued to save (an empty draft) keeps only
139
139
  * Rename (this device's) and Delete.
140
140
  */
141
- export declare function historyRowAcceptsControls(row: Pick<AssistantHistoryListRow, "key" | "legacy" | "header" | "conversation">, outbox: readonly AssistantHistoryOutboxItem[], scopeKey: AssistantHistoryScopeKey | null): boolean;
141
+ export declare function historyRowAcceptsControls(row: Pick<AssistantHistoryListRow, 'key' | 'legacy' | 'header' | 'conversation'>, outbox: readonly AssistantHistoryOutboxItem[], scopeKey: AssistantHistoryScopeKey | null): boolean;
142
142
  /** Server-backed conversations kept on this device at most (the least recently opened go first). */
143
143
  export declare const ASSISTANT_HISTORY_MAX_CACHED_CONVERSATIONS = 25;
144
144
  export interface HistoryEvictionInput {
@@ -24,17 +24,17 @@ export declare function highestContiguousHistorySeq(messages: readonly Message[]
24
24
  export type HistoryLoadPlan =
25
25
  /** The newest window (nothing held yet, or too far behind to catch up). */
26
26
  {
27
- kind: "latest";
27
+ kind: 'latest';
28
28
  paging: AssistantHistoryEntryPaging;
29
29
  }
30
30
  /** Everything after the last contiguous message held. */
31
31
  | {
32
- kind: "catch-up";
32
+ kind: 'catch-up';
33
33
  paging: AssistantHistoryEntryPaging;
34
34
  }
35
35
  /** The window before the oldest held ("Show earlier messages"). */
36
36
  | {
37
- kind: "earlier";
37
+ kind: 'earlier';
38
38
  paging: AssistantHistoryEntryPaging;
39
39
  };
40
40
  /**
@@ -58,7 +58,7 @@ export declare function planHistoryEarlierLoad(sync: ConversationSyncStamp): His
58
58
  * - `hasOlder`/`olderCursor` follow a BACKWARD page only; a catch-up page says
59
59
  * nothing about what lies before the window.
60
60
  */
61
- export declare function applyHistoryPage(sync: ConversationSyncStamp, local: readonly Message[], loaded: readonly Message[], page: Pick<AssistantHistoryEntryPage, "conversation" | "pageInfo">, plan: HistoryLoadPlan): {
61
+ export declare function applyHistoryPage(sync: ConversationSyncStamp, local: readonly Message[], loaded: readonly Message[], page: Pick<AssistantHistoryEntryPage, 'conversation' | 'pageInfo'>, plan: HistoryLoadPlan): {
62
62
  messages: Message[];
63
63
  syncPatch: Partial<ConversationSyncStamp>;
64
64
  };
@@ -46,7 +46,7 @@ export declare const ASSISTANT_HISTORY_UPDATE_MUTATION = "\n mutation UpdateAss
46
46
  export declare const ASSISTANT_HISTORY_OPERATIONS: ReadonlyArray<{
47
47
  operationName: string;
48
48
  document: string;
49
- set: "full" | "base" | "search";
49
+ set: 'full' | 'base' | 'search';
50
50
  }>;
51
51
  export declare function buildHistoryPageVariables(scope: AssistantHistoryScope, page: {
52
52
  first: number;
@@ -51,13 +51,13 @@ export interface AssistantHistorySearchInput {
51
51
  export type AssistantHistorySearchServerState =
52
52
  /** Nothing asked of it: no query, a query under 2 characters, or no server to ask. */
53
53
  {
54
- status: "idle";
54
+ status: 'idle';
55
55
  }
56
56
  /** The first page is on its way. */
57
57
  | {
58
- status: "searching";
58
+ status: 'searching';
59
59
  } | {
60
- status: "results";
60
+ status: 'results';
61
61
  hits: readonly AssistantHistorySearchHit[];
62
62
  /** "Show more results". */
63
63
  hasMore: boolean;
@@ -68,8 +68,8 @@ export type AssistantHistorySearchServerState =
68
68
  }
69
69
  /** No server matches: this device's matches only, and a notice says why. */
70
70
  | {
71
- status: "fallback";
72
- reason: "busy" | "failed";
71
+ status: 'fallback';
72
+ reason: 'busy' | 'failed';
73
73
  };
74
74
  export interface AssistantHistorySearchSnapshot {
75
75
  /** The query every result answers: the box's text, normalised, once typing paused. "" = no search. */
@@ -89,7 +89,7 @@ export interface AssistantHistoryGeneration {
89
89
  export declare const createAssistantHistoryStatusStore: () => import('zustand').UseBoundStore<import('zustand').StoreApi<AssistantHistoryStatusState>>;
90
90
  export type AssistantHistoryStatusStore = ReturnType<typeof createAssistantHistoryStatusStore>;
91
91
  export declare const useAssistantHistoryStatus: AssistantHistoryStatusStore;
92
- type GenerationState = Pick<AssistantHistoryStatusState, "scopeKey" | "epoch">;
92
+ type GenerationState = Pick<AssistantHistoryStatusState, 'scopeKey' | 'epoch'>;
93
93
  /** The generation a request starting now belongs to, or null when no scope is active. */
94
94
  export declare function assistantHistoryGenerationOf(state: GenerationState, boundKey: string | null): AssistantHistoryGeneration | null;
95
95
  /**
@@ -38,15 +38,15 @@ export type AssistantHistoryConvRef = {
38
38
  } | {
39
39
  conversationId: string;
40
40
  };
41
- export type AssistantHistoryEntryKind = "TURN" | "LOCAL_COMMAND" | "NOTE";
42
- export type AssistantHistoryRole = "USER" | "ASSISTANT" | "NOTE";
43
- export type AssistantHistorySaveOutcome = "APPLIED" | "ALREADY_APPLIED" | "CONVERSATION_DELETED";
44
- export type AssistantHistoryDeleteOutcome = "DELETED" | "ALREADY_DELETED" | "TOMBSTONED_UNSEEN" | "NOT_PRESENT";
41
+ export type AssistantHistoryEntryKind = 'TURN' | 'LOCAL_COMMAND' | 'NOTE';
42
+ export type AssistantHistoryRole = 'USER' | 'ASSISTANT' | 'NOTE';
43
+ export type AssistantHistorySaveOutcome = 'APPLIED' | 'ALREADY_APPLIED' | 'CONVERSATION_DELETED';
44
+ export type AssistantHistoryDeleteOutcome = 'DELETED' | 'ALREADY_DELETED' | 'TOMBSTONED_UNSEEN' | 'NOT_PRESENT';
45
45
  /** The kinds of person turns a conversation holds (notes do not count). */
46
- export type AssistantHistoryChannel = "CHAT" | "VOICE" | "MIXED";
47
- export type AssistantHistoryUpdateOutcome = "APPLIED" | "ALREADY_APPLIED" | "CONVERSATION_DELETED" | "PIN_LIMIT_REACHED";
48
- export type AssistantHistoryArchivedFilter = "EXCLUDE" | "ONLY" | "INCLUDE";
49
- export type AssistantHistoryChannelFilter = "ANY" | "CHAT" | "VOICE";
46
+ export type AssistantHistoryChannel = 'CHAT' | 'VOICE' | 'MIXED';
47
+ export type AssistantHistoryUpdateOutcome = 'APPLIED' | 'ALREADY_APPLIED' | 'CONVERSATION_DELETED' | 'PIN_LIMIT_REACHED';
48
+ export type AssistantHistoryArchivedFilter = 'EXCLUDE' | 'ONLY' | 'INCLUDE';
49
+ export type AssistantHistoryChannelFilter = 'ANY' | 'CHAT' | 'VOICE';
50
50
  /**
51
51
  * `AssistantHistoryConversationFilter`. Every field optional, as on the
52
52
  * server: `channel` defaults to ANY, `archived` to EXCLUDE, and an absent
@@ -279,18 +279,18 @@ export interface AssistantHistoryTombstone {
279
279
  */
280
280
  export interface AssistantHistorySaveItem {
281
281
  id: string;
282
- type: "save";
282
+ type: 'save';
283
283
  scopeKey: AssistantHistoryScopeKey;
284
284
  convKey: AssistantHistoryConvKey;
285
285
  kind: AssistantHistoryEntryKind;
286
286
  entries: AssistantHistoryEntryInput[];
287
287
  attempts: number;
288
288
  nextAttemptAt?: number;
289
- parked?: "quota";
289
+ parked?: 'quota';
290
290
  }
291
291
  export interface AssistantHistoryDeleteItem {
292
292
  id: string;
293
- type: "delete";
293
+ type: 'delete';
294
294
  scopeKey: AssistantHistoryScopeKey;
295
295
  convKey: AssistantHistoryConvKey;
296
296
  serverId?: string;
@@ -308,7 +308,7 @@ export interface AssistantHistoryDeleteItem {
308
308
  */
309
309
  export interface AssistantHistoryUpdateItem {
310
310
  id: string;
311
- type: "update";
311
+ type: 'update';
312
312
  scopeKey: AssistantHistoryScopeKey;
313
313
  convKey: AssistantHistoryConvKey;
314
314
  serverId?: string;
@@ -28,8 +28,8 @@ export interface ProfileBoundStorageOptions {
28
28
  /** Resolve the profile-scoped key for a base name (default: the app's active profile). */
29
29
  resolveKey?: (name: string) => string;
30
30
  /** The storage to use (default: `window.localStorage`, when there is one). */
31
- storage?: () => Pick<Storage, "getItem" | "setItem" | "removeItem"> | null;
31
+ storage?: () => Pick<Storage, 'getItem' | 'setItem' | 'removeItem'> | null;
32
32
  /** Told once per refusal streak, and about every failed write. */
33
- onRefused?: (reason: "unbound" | "profile-changed" | "write-failed", error?: unknown) => void;
33
+ onRefused?: (reason: 'unbound' | 'profile-changed' | 'write-failed', error?: unknown) => void;
34
34
  }
35
35
  export declare function createProfileBoundStorage(options?: ProfileBoundStorageOptions): ProfileBoundStorage;
@@ -50,7 +50,7 @@ export interface AssistantI18nProviderProps {
50
50
  * transport already needs for `AI_ASSISTANT_PRODUCT`, so there is one answer to
51
51
  * "which product is this?" rather than two that can disagree.
52
52
  */
53
- export declare function AssistantI18nProvider({ namespace, children, }: AssistantI18nProviderProps): import('react/jsx-runtime').JSX.Element;
53
+ export declare function AssistantI18nProvider({ namespace, children }: AssistantI18nProviderProps): import('react/jsx-runtime').JSX.Element;
54
54
  /** The namespace in force, or null when no provider is mounted. */
55
55
  export declare function useAssistantI18nNamespace(): string | null;
56
56
  export type AssistantTr = (key: string, fallback: string, params?: Record<string, string | number>) => string;