@belonguniverseai/react-sdk 0.6.32 → 0.6.34

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 (129) hide show
  1. package/dist/api/account-connectors.d.ts +2 -2
  2. package/dist/api/client.d.ts +1722 -125
  3. package/dist/api/computer.d.ts +60 -0
  4. package/dist/api/goals.d.ts +4 -4
  5. package/dist/api/proactive.d.ts +36 -0
  6. package/dist/api/query-keys.d.ts +3 -0
  7. package/dist/api/quota-refusal.d.ts +49 -0
  8. package/dist/api/secret-paste.d.ts +5 -0
  9. package/dist/api/suggestions.d.ts +18 -0
  10. package/dist/api/task-schedule-folders.d.ts +3 -3
  11. package/dist/api/task-schedule-projects.d.ts +5 -5
  12. package/dist/api/task-schedule-sharing.d.ts +13 -1
  13. package/dist/api/task-schedules.d.ts +60 -8
  14. package/dist/api/vault.d.ts +49 -0
  15. package/dist/app/dock-story-data.d.ts +7 -1
  16. package/dist/component/{abnfDiagram-N423BO3Z-Cs6vuzym.js → abnfDiagram-N423BO3Z-K52-wOfg.js} +4 -4
  17. package/dist/component/{architectureDiagram-T3A2C74G-BdBpK2d_.js → architectureDiagram-T3A2C74G-B64SrMLF.js} +6 -6
  18. package/dist/component/{blockDiagram-VBNYF7ZC-Cf6dsn1j.js → blockDiagram-VBNYF7ZC-B7Di5R1s.js} +8 -8
  19. package/dist/component/{c4Diagram-5PPSVZJV-Cxt2hfnn.js → c4Diagram-5PPSVZJV-ClDtA2m4.js} +4 -4
  20. package/dist/component/{channel-COtJQ6CP.js → channel-C6_lLEWW.js} +2 -2
  21. package/dist/component/{chunk-2GRJ4B5K-C14K2lKj.js → chunk-2GRJ4B5K-B07moQal.js} +2 -2
  22. package/dist/component/{chunk-3NCLNEKW-oHacP_OI.js → chunk-3NCLNEKW-TUF1Wrf6.js} +2 -2
  23. package/dist/component/{chunk-4I5QYGJK-CGOVqmKQ.js → chunk-4I5QYGJK-qY-_sgVE.js} +2 -2
  24. package/dist/component/{chunk-5RXB4S5H-CMJnmUzX.js → chunk-5RXB4S5H-BU0H_zl3.js} +6 -6
  25. package/dist/component/{chunk-6Q2QTUOP-B5ACmZa2.js → chunk-6Q2QTUOP-nIHNEMhm.js} +3 -3
  26. package/dist/component/{chunk-7Z6QIM7H-CSfSb_Xc.js → chunk-7Z6QIM7H-D7mHGFzt.js} +8 -8
  27. package/dist/component/{chunk-GF5L2VYU-xi_oDTd2.js → chunk-GF5L2VYU-uM1RliIa.js} +6 -6
  28. package/dist/component/{chunk-I66GZJ75-DB1sFGc-.js → chunk-I66GZJ75-oDyTlx3R.js} +2 -2
  29. package/dist/component/{chunk-J7OUQ5F2-DB9d7Gt_.js → chunk-J7OUQ5F2-c7iD4Gpa.js} +7 -7
  30. package/dist/component/{chunk-JQJVKLGR-De7zUJDv.js → chunk-JQJVKLGR-JeqFPv2A.js} +8 -8
  31. package/dist/component/{chunk-KBJHAD2P-CVoxmRa8.js → chunk-KBJHAD2P-DjQd-FIs.js} +2 -2
  32. package/dist/component/{chunk-NSK5VX7P-ur_ZGcVX.js → chunk-NSK5VX7P-Bq0sOWgd.js} +2 -2
  33. package/dist/component/{chunk-QR6OTTB3-Bl3Z_jKC.js → chunk-QR6OTTB3-DctDLVWm.js} +7 -7
  34. package/dist/component/{chunk-UBXNYLIW-CDKeQUnO.js → chunk-UBXNYLIW-Ka1R3omP.js} +3 -3
  35. package/dist/component/{chunk-W5SLKNZC-Dq8uD14N.js → chunk-W5SLKNZC-CI_OqVnD.js} +2 -2
  36. package/dist/component/{chunk-WRU74C26-BwQb4DnE.js → chunk-WRU74C26-BMkh1mHN.js} +4 -4
  37. package/dist/component/{classDiagram-JCYQIIEL-yl7JabGO.js → classDiagram-JCYQIIEL-C1E0BQye.js} +13 -13
  38. package/dist/component/{classDiagram-v2-OCEON4UE-ozBAEvyC.js → classDiagram-v2-OCEON4UE-hQKKIbDF.js} +13 -13
  39. package/dist/component/{component-DnTvWVQQ.js → component-B44aZ-1Z.js} +24455 -21767
  40. package/dist/component/{cynefinDiagram-MW4NZA55-fdKo3DVx.js → cynefinDiagram-MW4NZA55-0yefvDKM.js} +4 -4
  41. package/dist/component/{dagre-VZM6K2ZE-C7nAehQV.js → dagre-VZM6K2ZE-CBlt7UUF.js} +9 -9
  42. package/dist/component/{diagram-7IWD3JNH-DRM3Hv3P.js → diagram-7IWD3JNH-D0zEzayZ.js} +5 -5
  43. package/dist/component/{diagram-B4RE2ZJO-DXqATSZd.js → diagram-B4RE2ZJO-Dm2FX5kh.js} +3 -3
  44. package/dist/component/{diagram-LBJQPF4R-DJRJfBnF.js → diagram-LBJQPF4R-nQGWQGIp.js} +4 -4
  45. package/dist/component/{diagram-Q27KOJAE-B4cTzsYZ.js → diagram-Q27KOJAE-Co-Dq4kd.js} +6 -6
  46. package/dist/component/{diagram-UB23O5K3-CyUjYCbX.js → diagram-UB23O5K3-ClWS8vTp.js} +4 -4
  47. package/dist/component/{ebnfDiagram-BXEA7PRR-C6GS4eTe.js → ebnfDiagram-BXEA7PRR-Cq6K_q0O.js} +4 -4
  48. package/dist/component/{erDiagram-JOGREHBK-D8qt0_mW.js → erDiagram-JOGREHBK-DvPI-BqP.js} +12 -12
  49. package/dist/component/flowDiagram-UKHOOZJN-2MBQiA4G.js +19 -0
  50. package/dist/component/{ganttDiagram-PKOTCBZU-D6o-gloU.js → ganttDiagram-PKOTCBZU-DXzfT7Q5.js} +3 -3
  51. package/dist/component/{gitGraphDiagram-DS77QQ5N-Cz3kf7xj.js → gitGraphDiagram-DS77QQ5N-CMKpJJJ_.js} +3 -3
  52. package/dist/component/index.js +2 -2
  53. package/dist/component/{infoDiagram-6WML65LV-sdz8qoTE.js → infoDiagram-6WML65LV-Ck5rB_GF.js} +3 -3
  54. package/dist/component/{ishikawaDiagram-WSZJBQD7--tUiPVAr.js → ishikawaDiagram-WSZJBQD7-CHQxwGjK.js} +4 -4
  55. package/dist/component/{journeyDiagram-NVQOT4AX-_-TjqBid.js → journeyDiagram-NVQOT4AX-CnPVgyHk.js} +3 -3
  56. package/dist/component/{kanban-definition-27J2QSJJ-BXBySx2U.js → kanban-definition-27J2QSJJ-CC8oOHrI.js} +9 -9
  57. package/dist/component/{line-C2WkjBlg.js → line-AtEledwJ.js} +2 -2
  58. package/dist/component/{mindmap-definition-FAOFIHXS-CbpSDN_k.js → mindmap-definition-FAOFIHXS-WWI6yyUJ.js} +11 -11
  59. package/dist/component/{pegDiagram-VL7TDLO6-Cp_Wn0PS.js → pegDiagram-VL7TDLO6-D5NeC_IJ.js} +4 -4
  60. package/dist/component/{pieDiagram-7S7Q4E2Y-D6KGBWSF.js → pieDiagram-7S7Q4E2Y-M4MUAitH.js} +4 -4
  61. package/dist/component/{quadrantDiagram-CIZ2JOQS-BWjdUg-z.js → quadrantDiagram-CIZ2JOQS-viErJFsV.js} +2 -2
  62. package/dist/component/{railroadDiagram-AXF67PYL-B5iYZXm-.js → railroadDiagram-AXF67PYL-C8IhZ-59.js} +4 -4
  63. package/dist/component/{requirementDiagram-LRYGKXZP-CewRkYfE.js → requirementDiagram-LRYGKXZP-D1vdZzCs.js} +11 -11
  64. package/dist/component/{sankeyDiagram-W5VNT64P-D3Zb5dQ6.js → sankeyDiagram-W5VNT64P-Bl52MqzW.js} +2 -2
  65. package/dist/component/{sequenceDiagram-SI44F4Z6-BfxhjyrN.js → sequenceDiagram-SI44F4Z6-Cx-Aio7P.js} +4 -4
  66. package/dist/component/{stateDiagram-OKZ733FA-DLd9YI1A.js → stateDiagram-OKZ733FA-CHqMp3xm.js} +14 -14
  67. package/dist/component/{stateDiagram-v2-UEYNNEHI-Dd_FaBaY.js → stateDiagram-v2-UEYNNEHI-DqTLHDUB.js} +13 -13
  68. package/dist/component/{swimlanes-SLNWSIFB-C56sHJuV.js → swimlanes-SLNWSIFB-BkaXpBe5.js} +9 -9
  69. package/dist/component/{swimlanesDiagram-ULZ7WXOC-nHtka4qn.js → swimlanesDiagram-ULZ7WXOC-DyMFUKdr.js} +13 -13
  70. package/dist/component/{timeline-definition-Z64GVDOM-JYR_6zGi.js → timeline-definition-Z64GVDOM-Ba3A3s-L.js} +4 -4
  71. package/dist/component/{vennDiagram-T6HMQDX7-CEGGwXxv.js → vennDiagram-T6HMQDX7-4W_JJhIz.js} +4 -4
  72. package/dist/component/{wardleyDiagram-T6FBY63Y-zZGm618Q.js → wardleyDiagram-T6FBY63Y-CllyyQYm.js} +4 -4
  73. package/dist/component/{xychartDiagram-ELKLHX3M-BYbnWmqD.js → xychartDiagram-ELKLHX3M-DS3MPPul.js} +7 -7
  74. package/dist/components/embed/ComputerSettings.d.ts +7 -0
  75. package/dist/components/embed/EmbedRail.d.ts +15 -2
  76. package/dist/components/embed/EmbedSessions.d.ts +15 -2
  77. package/dist/components/embed/MobileNavBar.d.ts +4 -2
  78. package/dist/components/embed/NextStepCard.d.ts +6 -0
  79. package/dist/components/embed/ProactiveChecksSetting.d.ts +7 -0
  80. package/dist/components/embed/QuotaNoticeCard.d.ts +4 -0
  81. package/dist/components/embed/SessionSwitcher.d.ts +6 -1
  82. package/dist/components/embed/quota-notice-copy.d.ts +3 -0
  83. package/dist/components/embed/use-settings-owner-key.d.ts +15 -0
  84. package/dist/components/pinned/PinnedChatHeader.d.ts +9 -0
  85. package/dist/components/pinned/use-agent-name.d.ts +2 -0
  86. package/dist/components/scheduled/schedule-dialog-model.d.ts +2 -1
  87. package/dist/components/scheduled/schedule-format.d.ts +4 -1
  88. package/dist/components/vault/SecretPasteFeedback.d.ts +6 -0
  89. package/dist/components/vault/SecretsPanel.d.ts +23 -0
  90. package/dist/components/vault/vault-open.d.ts +3 -0
  91. package/dist/embed/goal-cap-notice.d.ts +0 -9
  92. package/dist/embed/goal-edit-command.d.ts +6 -1
  93. package/dist/embed/pinned-chat.d.ts +34 -0
  94. package/dist/embed/quota-notice.d.ts +9 -0
  95. package/dist/embed/theme.d.ts +10 -0
  96. package/dist/embed/voice/agent-spawn.d.ts +12 -2
  97. package/dist/embed/voice/line-run-reader.d.ts +1 -1
  98. package/dist/embed/voice-call.d.ts +10 -1
  99. package/dist/i18n/messages/en.d.ts +135 -8
  100. package/dist/i18n/messages/surfaces/pinned.d.ts +76 -0
  101. package/dist/i18n/messages/surfaces/quota.d.ts +69 -0
  102. package/dist/i18n/messages/surfaces/scheduled.d.ts +69 -5
  103. package/dist/i18n/messages/surfaces/settings.d.ts +148 -0
  104. package/dist/i18n/messages/surfaces/stream.d.ts +56 -4
  105. package/dist/i18n/messages/surfaces/vault.d.ts +120 -0
  106. package/dist/lib/use-tab-leadership.d.ts +1 -0
  107. package/dist/routes/chat/history-cache.d.ts +5 -0
  108. package/dist/routes/chat/history-merge.d.ts +4 -1
  109. package/dist/routes/chat/question-parts.d.ts +26 -0
  110. package/dist/routes/chat/queued-delivery.d.ts +20 -0
  111. package/dist/routes/chat/queued-messages.d.ts +15 -0
  112. package/dist/routes/chat/session-api.d.ts +52 -0
  113. package/dist/routes/chat/session-history-api.d.ts +9 -0
  114. package/dist/routes/chat/transcript-update.d.ts +45 -0
  115. package/dist/routes/chat/use-catch-up-on-return.d.ts +7 -0
  116. package/dist/routes/chat/use-next-step-suggestion.d.ts +38 -0
  117. package/dist/routes/chat/use-quota-notice.d.ts +29 -0
  118. package/dist/routes/chat/use-quota-stop-refresh.d.ts +27 -0
  119. package/dist/routes/chat/use-session-goal.d.ts +6 -0
  120. package/dist/routes/chat.d.ts +9 -15
  121. package/dist/stream/belong-chat-transport.d.ts +23 -11
  122. package/dist/stream/belong-data-parts.d.ts +31 -1
  123. package/dist/stream/pause-notice-copy.d.ts +3 -0
  124. package/dist/stream/provider-blocked.d.ts +16 -0
  125. package/dist/stream/reconnect-backoff.d.ts +39 -0
  126. package/dist/stream/run-error-copy.d.ts +25 -0
  127. package/dist/stream/stream-notice.d.ts +9 -0
  128. package/package.json +1 -1
  129. package/dist/component/flowDiagram-UKHOOZJN-U55NEBew.js +0 -19
@@ -4,8 +4,21 @@ export interface SessionSummary {
4
4
  readonly title: string | null;
5
5
  readonly updatedAt: string;
6
6
  }
7
+ /** The pinned chat's row, always first (BEL-348). */
8
+ export interface PinnedChatRow {
9
+ readonly name: string;
10
+ readonly brand: {
11
+ readonly logo?: string;
12
+ readonly initials: string;
13
+ };
14
+ readonly unreadCount: number;
15
+ readonly lastMessage: string | null;
16
+ readonly active: boolean;
17
+ readonly onOpen: () => void;
18
+ }
7
19
  type SessionsBodyProps = {
8
20
  sessions: readonly SessionSummary[];
21
+ pinned?: PinnedChatRow | undefined;
9
22
  activeId: string | null;
10
23
  onNew: () => void;
11
24
  onSelect: (id: string) => void;
@@ -27,7 +40,7 @@ type SessionsBodyProps = {
27
40
  /** Shared history behavior for the compact menu and fullscreen settings.
28
41
  * Panel rows use native buttons with sibling edit actions, so history does
29
42
  * not depend on a Radix menu context or nest interactive controls. */
30
- export declare function EmbedSessionsBody({ sessions, activeId, onNew, onSelect, onDelete, onRename, sessionAgentLine, onViewStats, presentation, }: SessionsBodyProps & {
43
+ export declare function EmbedSessionsBody({ sessions, pinned, activeId, onNew, onSelect, onDelete, onRename, sessionAgentLine, onViewStats, presentation, }: SessionsBodyProps & {
31
44
  presentation?: "menu" | "panel";
32
45
  }): import("react").JSX.Element;
33
46
  /**
@@ -35,7 +48,7 @@ export declare function EmbedSessionsBody({ sessions, activeId, onNew, onSelect,
35
48
  * an inline text edit, or delete one via an inline trash → confirm flow. Rename +
36
49
  * delete are per-row inline affordances that keep the menu open (BEL-120).
37
50
  */
38
- export declare function EmbedSessions({ sessions, activeId, theme, side, triggerClassName, triggerLabel, presentation, onNew, onSelect, onDelete, onRename, onOpen, sessionAgentLine, onViewStats, }: SessionsBodyProps & {
51
+ export declare function EmbedSessions({ sessions, pinned, activeId, theme, side, triggerClassName, triggerLabel, presentation, onNew, onSelect, onDelete, onRename, onOpen, sessionAgentLine, onViewStats, }: SessionsBodyProps & {
39
52
  theme: BelongTheme;
40
53
  /** Which way the menu opens — toward the panel from the rail edge, or
41
54
  * upward when the trigger lives in the mobile bottom nav bar. */
@@ -1,12 +1,14 @@
1
1
  import { ComponentProps } from 'react';
2
2
  import { EmbedAvatar } from './EmbedAvatar';
3
- import { SessionSummary } from './EmbedSessions';
3
+ import { PinnedChatRow, SessionSummary } from './EmbedSessions';
4
4
  import { EmbedView } from './EmbedRail';
5
5
  import { BelongTheme, BelongThemePalette, PresetName } from '../../types/public.ts';
6
6
  /** Four mobile destinations. Secondary tools and account controls live in
7
7
  * Tools; session switching lives above the conversation. Primary cells retain
8
8
  * 44px targets (56px with labels) and surface-scaled glyphs without horizontal scrolling. */
9
- export declare function MobileNavBar({ view, user, theme, palette, sessions, activeId, voiceSupported, readReplies, accent, cssVars, presets, activePreset, onSelectView, onClose, onToggleMode, onToggleSide, onAccentChange, onAccentReset, onCssVarsChange, onApplyPreset, onLogout, onNewSession, onSelectSession, onDeleteSession, onRenameSession, onSessionsOpen, onViewStats, navigationLabelsVisible, onToggleNavigationLabels, connectorsUnavailable, skillsUnavailable, artifactsUnavailable, goalPresent, }: {
9
+ export declare function MobileNavBar({ pinned, view, user, theme, palette, sessions, activeId, voiceSupported, readReplies, accent, cssVars, presets, activePreset, onSelectView, onClose, onToggleMode, onToggleSide, onAccentChange, onAccentReset, onCssVarsChange, onApplyPreset, onLogout, onNewSession, onSelectSession, onDeleteSession, onRenameSession, onSessionsOpen, onViewStats, navigationLabelsVisible, onToggleNavigationLabels, connectorsUnavailable, skillsUnavailable, artifactsUnavailable, goalPresent, }: {
10
+ /** The pinned chat's row at the top of Chat history (BEL-348). */
11
+ pinned?: PinnedChatRow | undefined;
10
12
  /** Focus changes navigation labels only; the icons always remain available. */
11
13
  navigationLabelsVisible?: boolean;
12
14
  onToggleNavigationLabels?: () => void;
@@ -0,0 +1,6 @@
1
+ import { NextStepSuggestion } from '../../api/suggestions.ts';
2
+ export declare function NextStepCard({ suggestion, onPick, onDismiss, }: {
3
+ readonly suggestion: NextStepSuggestion;
4
+ readonly onPick: (message: string) => void;
5
+ readonly onDismiss: () => void;
6
+ }): import("react").JSX.Element;
@@ -0,0 +1,7 @@
1
+ /**
2
+ * Settings → General: on/off for proactive checks (BEL-348). Renders nothing
3
+ * when the feature is not on for this user. It names the connected apps a check
4
+ * reads, so that's never a surprise. What a check finds shows up in the pinned
5
+ * chat and on Slack, not here.
6
+ */
7
+ export declare const ProactiveChecksSetting: () => import("react").JSX.Element | null;
@@ -0,0 +1,4 @@
1
+ import { QuotaNoticeData } from '../../stream/belong-data-parts.ts';
2
+ export declare function QuotaNoticeCard({ notice }: {
3
+ readonly notice: QuotaNoticeData;
4
+ }): import("react").JSX.Element;
@@ -1,12 +1,17 @@
1
+ import { SpawnAgent } from '../../embed/voice/agent-spawn.ts';
1
2
  import { BelongTheme } from '../../types/public.ts';
2
3
  import { SessionSummary } from './EmbedSessions';
3
4
  /** A view of the real line registry. Selection never remints or reassigns a
4
5
  * session; the dock owns that boundary, including resume and unseen state. */
5
- export declare function SessionSwitcher({ layout, theme, sessions, activeId, onSelect, onClose, }: {
6
+ export declare function SessionSwitcher({ layout, theme, sessions, activeId, onSelect, onClose, spawnAgent, pendingAgentLine, }: {
6
7
  layout: "dock" | "mobile" | "sidebar";
7
8
  theme: BelongTheme;
8
9
  sessions: readonly SessionSummary[];
9
10
  activeId: string | null;
10
11
  onSelect: (sessionId: string | null) => void;
11
12
  onClose: (line: number) => void;
13
+ /** The "+". The dock passes the version that shows the new chat on the click. */
14
+ spawnAgent?: SpawnAgent;
15
+ /** The line whose new chat is on screen before its session exists. */
16
+ pendingAgentLine?: number | null;
12
17
  }): import("react").JSX.Element | null;
@@ -0,0 +1,3 @@
1
+ import { TFunction } from 'i18next';
2
+ import { QuotaNoticeData } from '../../stream/belong-data-parts.ts';
3
+ export declare const quotaNoticeCopy: (notice: QuotaNoticeData, t: TFunction, locale: string) => string;
@@ -0,0 +1,15 @@
1
+ /**
2
+ * The signed-in user a settings section's cached data belongs to: the API
3
+ * base URL plus the token's issuer, tenant and user. Null until the host has
4
+ * handed the dock a token.
5
+ */
6
+ export declare const readSettingsOwnerKey: (baseUrl: string) => string | null;
7
+ /**
8
+ * Track the owner key so a section re-keys (and drops another user's cached
9
+ * data) the moment the host switches users. `authError` turns true when no
10
+ * token arrives at all, so the section can say so instead of loading forever.
11
+ */
12
+ export declare const useSettingsOwnerKey: () => {
13
+ readonly ownerKey: string | null;
14
+ readonly authError: boolean;
15
+ };
@@ -0,0 +1,9 @@
1
+ import { ReactElement, ReactNode } from 'react';
2
+ import { Proactive } from '../../api/proactive.ts';
3
+ export declare const PinnedChatHeader: ({ proactive, name, onClear, layoutControl, }: {
4
+ readonly proactive: Proactive;
5
+ readonly name: string;
6
+ readonly onClear: () => void;
7
+ /** On a phone, where there's no rail: the logo, as every other header has it. */
8
+ readonly layoutControl?: ReactNode;
9
+ }) => ReactElement;
@@ -0,0 +1,2 @@
1
+ /** What the dock calls the agent: "Belong agent", or the tenant's own brand as is. */
2
+ export declare const useAgentName: () => string;
@@ -11,9 +11,10 @@ export type ScheduleDialogInputs = {
11
11
  /** Only meaningful when `recurrence === "interval"`; carried always so the
12
12
  * control keeps its value while the user toggles kinds. */
13
13
  readonly intervalMinutes: number;
14
+ readonly weekdays: number[];
14
15
  };
15
16
  export type ScheduleEditorValue = Pick<TaskScheduleDetail, "explicitTitle" | "message" | "anchorAt" | "timezone" | "recurrence"> & {
16
17
  readonly nextRunAt?: string | null;
17
18
  };
18
19
  export declare const scheduleDialogInputs: (schedule: ScheduleEditorValue) => ScheduleDialogInputs;
19
- export declare const scheduleTimeShapeChanged: (schedule: ScheduleEditorValue, input: Pick<ScheduleDialogInputs, "date" | "time" | "timezone" | "recurrence" | "intervalMinutes">) => boolean;
20
+ export declare const scheduleTimeShapeChanged: (schedule: ScheduleEditorValue, input: Pick<ScheduleDialogInputs, "date" | "time" | "timezone" | "recurrence" | "intervalMinutes" | "weekdays">) => boolean;
@@ -8,6 +8,8 @@ export declare const weekdayIn: (timezone: string, iso: string, locale: Locale)
8
8
  export declare const dateTimeLocal: (iso: string, locale: Locale) => string;
9
9
  /** Non-null when the schedule's zone differs from the viewer's (shown as a suffix). */
10
10
  export declare const foreignTimezone: (timezone: string) => string | null;
11
+ /** Monday-first names, independent of the viewer's timezone. */
12
+ export declare const selectedWeekdayNames: (weekdays: readonly number[], locale: Locale, width?: "short" | "long") => string[];
11
13
  /** i18n params for the recurrence summary line, keyed by kind. */
12
14
  export declare const recurrenceSummaryParams: (input: {
13
15
  readonly kind: RecurrenceKind;
@@ -17,8 +19,9 @@ export declare const recurrenceSummaryParams: (input: {
17
19
  readonly locale: Locale;
18
20
  /** Interval width — only read for the `interval` kind. */
19
21
  readonly intervalMinutes: number | null;
22
+ readonly weekdays?: readonly number[] | null;
20
23
  }) => {
21
- readonly key: `scheduled.summary${"Once" | "Daily" | "Weekdays" | "Weekly" | "Interval" | "Manual"}`;
24
+ readonly key: `scheduled.summary${"Once" | "Daily" | "Weekdays" | "Weekly" | "CustomWeekly" | "Interval" | "Manual"}`;
22
25
  readonly time: string;
23
26
  readonly day: string;
24
27
  /** Interval width for the `Interval` message (0 for other kinds). */
@@ -0,0 +1,6 @@
1
+ export declare function SecretPasteFeedback({ text, onReplace, blocked, disabled, }: {
2
+ readonly text?: string;
3
+ readonly onReplace?: (value: string, reference: string) => void;
4
+ readonly blocked?: boolean;
5
+ readonly disabled?: boolean;
6
+ }): import("react").JSX.Element | null;
@@ -0,0 +1,23 @@
1
+ import { VaultSecretSummary, VaultSecretKind } from '@belong/codec/vault';
2
+ type Editor = {
3
+ readonly kind: "add";
4
+ } | {
5
+ readonly kind: "replace";
6
+ readonly secret: VaultSecretSummary;
7
+ };
8
+ export declare function SecretEditor({ editor, onDone, initialSecret, inline, disabled, }: {
9
+ readonly editor: Editor;
10
+ readonly onDone: (reference?: string) => void;
11
+ readonly initialSecret?: {
12
+ readonly name: string;
13
+ readonly kind: VaultSecretKind;
14
+ readonly value: string;
15
+ };
16
+ readonly inline?: boolean;
17
+ readonly disabled?: boolean;
18
+ }): import("react").JSX.Element;
19
+ /** Metadata-only query cache; each editor owns its value until save or unmount. */
20
+ export declare function SecretsPanel({ initialAdd }: {
21
+ readonly initialAdd?: boolean;
22
+ }): import("react").JSX.Element;
23
+ export {};
@@ -0,0 +1,3 @@
1
+ /** Opens the existing account dialog at Add secret. Never carries secret text. */
2
+ export declare const requestAddSecret: () => void;
3
+ export declare const subscribeAddSecret: (listener: () => void) => (() => void);
@@ -1,4 +1,3 @@
1
- import { PostMessageError } from '../stream/belong-chat-transport.ts';
2
1
  export type GoalRefusal = {
3
2
  readonly kind: "exists";
4
3
  } | {
@@ -26,11 +25,3 @@ export type GoalRefusal = {
26
25
  * chat's own generic error surface instead of being misread as a refusal.
27
26
  */
28
27
  export declare const goalRefusalFromError: (error: unknown) => GoalRefusal | null;
29
- /**
30
- * A refused POST, whatever the reason. `PostMessageError.message` embeds the
31
- * server's status AND its raw body (a wire enum, untranslated English prose,
32
- * or a Zod issue list) — never show that to a user: the dock renders its own
33
- * i18n'd fallback instead. The memory note "server prose isn't localized" is
34
- * exactly this failure, and §42's "reads as breakage" is the cost.
35
- */
36
- export declare const isPostMessageRefusal: (error: unknown) => error is PostMessageError;
@@ -21,6 +21,11 @@ export declare const goalEditRequestBody: (command: GoalEditCommand) => GoalEdit
21
21
  * cap that un-stalled a `budget_limited` goal) gets its own copy distinct
22
22
  * from a plain edit — see `GoalActionOutcome`'s `revived` flag — and one
23
23
  * that left the goal `budget_limited` says it is still stopped (#766).
24
+ *
25
+ * Console P1 — `statusReason` is the goal's reason AFTER the edit. A goal the
26
+ * monthly token quota keeps stopped has no cap to raise (`exhaustedBudgets`
27
+ * is empty), so "every limit it reached has to go above…" would be untrue:
28
+ * it says the plain "Goal updated." and the orange notice card explains.
24
29
  */
25
- export declare const goalEditNoticeText: (t: TFunction, outcome: GoalEditOutcome) => string;
30
+ export declare const goalEditNoticeText: (t: TFunction, outcome: GoalEditOutcome, statusReason?: string | null) => string;
26
31
  export {};
@@ -0,0 +1,34 @@
1
+ /**
2
+ * Which Session is the user's pinned chat (BEL-348).
3
+ *
4
+ * A tiny external store because places that don't share props need it: BelongDock
5
+ * (header, presentation) and ChatRoute (it must never be adopted as "Agent 1",
6
+ * which it isn't, and its quiet check replies aren't rendered).
7
+ *
8
+ * Remembered across reloads: ChatRoute binds what's on screen to line 1 in the
9
+ * dock's first commit, before the dock has read anything, and binding the pinned
10
+ * chat would take that line from the user's regular chat. An id left by another
11
+ * account on this browser is harmless: it never matches a Session of theirs.
12
+ */
13
+ export declare const peekPinnedChatSessionId: () => string | null;
14
+ export declare const setPinnedChatSessionId: (sessionId: string | null) => void;
15
+ export declare const usePinnedChatSessionId: () => string | null;
16
+ type MessageLike = {
17
+ readonly role: string;
18
+ readonly parts: readonly {
19
+ readonly type: string;
20
+ readonly text?: unknown;
21
+ }[];
22
+ };
23
+ /**
24
+ * A quiet check reply. A reply to the user's own message never is, whatever it
25
+ * says: "NO" can be the answer they asked for. The check's own message is internal,
26
+ * so a check's reply never follows one of theirs. A prefix ("NO", "NO_UP"…) counts
27
+ * only while it streams in; the cloud stores the real thing internal, so this keeps
28
+ * the live render the same as the reload (§41).
29
+ */
30
+ export declare const isQuietPinnedMessage: (message: MessageLike, context: {
31
+ readonly previousRole: string | undefined;
32
+ readonly streaming: boolean;
33
+ }) => boolean;
34
+ export {};
@@ -0,0 +1,9 @@
1
+ import { QuotaRefusal } from '../api/quota-refusal.ts';
2
+ /**
3
+ * Console P1 (TS-DOCK-01) — classify a failed send handed to `useChat`'s
4
+ * `onError` as a monthly-quota refusal (the body schema and its rules live in
5
+ * `api/quota-refusal.ts`). `null` when it is not one — the goal and generic
6
+ * error paths still own it. The goal classifier (`goal-cap-notice.ts`)
7
+ * returns `null` for this body, so the two never both claim one failure.
8
+ */
9
+ export declare const quotaNoticeFromError: (error: unknown) => QuotaRefusal | null;
@@ -39,6 +39,16 @@ export declare const peekCustomCssVars: () => Record<string, string>;
39
39
  export declare const activePalette: (theme: BelongTheme) => BelongThemePalette;
40
40
  /** Pick a readable foreground (near-black or white) for text on `color`. */
41
41
  export declare const contrastForeground: (color: string) => string;
42
+ /** WCAG contrast ratio of two colours, or null when either can't be parsed. */
43
+ export declare const contrastRatio: (first: string, second: string) => number | null;
44
+ /**
45
+ * The background of inline code in the user's bubble. The chip's text is the
46
+ * bubble's own, so the chip must be derived from that pair: any fixed grey goes
47
+ * unreadable on some bubble (white text on a pale chip, on a bright accent).
48
+ * A roomy pair gets a gentle tint; a tight one moves away from the text until
49
+ * the code is readable, even when the bubble's own text falls short of AA.
50
+ */
51
+ export declare const userBubbleCodeBackground: (bubble: string, foreground: string) => string;
42
52
  /** Recolor only the brand/primary family with `accent`; leave bg/text/border. */
43
53
  export declare const applyAccent: (palette: BelongThemePalette, accent: string) => BelongThemePalette;
44
54
  export declare const toggleThemeMode: () => void;
@@ -31,8 +31,18 @@ export type SpawnAgentLineResult = {
31
31
  * they got exactly that. The caller must not navigate and must not surface a
32
32
  * message. Distinct from `create_failed` precisely so it can be told apart.
33
33
  */
34
+ /**
35
+ * `superseded` is quiet too: the mint succeeded, but the user went to another
36
+ * chat while it was out. The agent keeps its chip; nothing may navigate.
37
+ */
34
38
  | {
35
39
  readonly ok: false;
36
- readonly reason: "cap_reached" | "create_failed" | "line_released";
40
+ readonly reason: "cap_reached" | "create_failed" | "line_released" | "superseded";
37
41
  };
38
- export declare const spawnAgentLine: (fetchFn?: typeof fetch) => Promise<SpawnAgentLineResult>;
42
+ /**
43
+ * `onLineReserved` runs synchronously once the line is reserved and BEFORE the
44
+ * mint's round trip, so the dock can show the new chat on the click itself. It
45
+ * does not run when the spawn is refused up front (at the cap, or no workspace).
46
+ */
47
+ export type SpawnAgent = (onLineReserved: (line: number) => void) => Promise<SpawnAgentLineResult>;
48
+ export declare const spawnAgentLine: (fetchFn?: typeof fetch, onLineReserved?: (line: number) => void) => Promise<SpawnAgentLineResult>;
@@ -55,4 +55,4 @@ export type WatchLineRunInput = {
55
55
  */
56
56
  readonly onTick?: () => void;
57
57
  };
58
- export declare const watchLineRun: (input: WatchLineRunInput, fetchFn?: typeof fetch) => (() => void);
58
+ export declare const watchLineRun: (input: WatchLineRunInput, fetchFn?: typeof fetch, sleepMs?: (ms: number, signal: AbortSignal) => Promise<void>) => (() => void);
@@ -195,6 +195,12 @@ export declare const notifyCallProgress: (hint: string) => void;
195
195
  /** ChatRoute mirrors the run's current tool phase — the orb wears it as a
196
196
  * small work badge while the agent is busy. */
197
197
  export declare const setCallWorkPhase: (phase: CallState["workPhase"]) => void;
198
+ /**
199
+ * Clear a chat's visible history and refresh it if it's the one on screen. For
200
+ * what isn't ChatRoute and can't call `runClearCommand`: a call, the pinned chat's
201
+ * header. False when the server refused; nothing changed then.
202
+ */
203
+ export declare const clearChatOnScreen: (sessionId: string) => Promise<boolean>;
198
204
  /**
199
205
  * The lines strip chip on CallScreen calls this directly (no tool-call round
200
206
  * trip, no ack — there is no voice tool for it any more, which is why nothing
@@ -273,8 +279,11 @@ export declare const deliverAgentReply: (text: string) => void;
273
279
  * ChatRoute calls this when the delegated run FAILS (stream error, run_error).
274
280
  * Without it the call stays silently "Working…" forever — the voice agent
275
281
  * must tell the user something went wrong and offer to retry.
282
+ *
283
+ * `nextStep`: what the voice offers. A refused answer (#974) is not fixed by
284
+ * asking again, so it points at a new conversation, as the dock's notice does.
276
285
  */
277
- export declare const deliverAgentFailure: (message: string) => void;
286
+ export declare const deliverAgentFailure: (message: string, nextStep?: "try_again" | "new_conversation") => void;
278
287
  /** A background line finished: converge its chip. Nothing is spoken — see
279
288
  * this section's header. */
280
289
  export declare const deliverLineReply: (line: number) => void;
@@ -237,12 +237,36 @@ export declare const en: {
237
237
  readonly reconnecting: "Reconnecting to Simetrik…";
238
238
  };
239
239
  readonly reconnectingBadge: "reconnecting";
240
- readonly incompleteTask: "Paused — unfinished";
240
+ readonly pauseOutputLimit: "Paused — this answer reached its length limit. Reply to continue.";
241
+ readonly pauseStepLimit: "Paused — this task reached its automatic work limit. Reply to continue.";
242
+ readonly pauseWatchdog: "Paused — a step stopped responding or ran out of time. Reply to continue.";
243
+ readonly pauseRepeatedFailure: "Paused — the same step kept failing. Reply with what to change.";
244
+ readonly pauseQuotaExceeded: "Paused — unfinished";
245
+ readonly pauseGeneric: "Paused before finishing. Reply to continue.";
241
246
  readonly resumingAfterPause: "Taking longer than expected — picking it back up…";
247
+ readonly answerBlocked: "That answer was blocked before it finished. You can start a new conversation. If it keeps happening, contact support.";
248
+ readonly runErrorStoppedShort: "That answer stopped before it was finished. Ask again and it will pick up where it left off.";
249
+ readonly runErrorContextFull: "That answer stopped because this conversation has grown too long. Start a new chat to carry the work on there.";
250
+ readonly runErrorStepTooLong: "That step took too long, so it was stopped. Ask again to carry on.";
251
+ readonly runErrorConnectionRevoked: "A connection was turned off, so this stopped. Connect it again to continue.";
252
+ readonly runErrorGeneric: "Something went wrong and that answer couldn't finish. Ask again in a moment.";
253
+ readonly runCancelled: "Stopped";
254
+ readonly runThrottled: "Paused";
242
255
  readonly open: "Open";
243
256
  readonly reconnectRateLimited: "{{provider}} is busy — trying again automatically in {{seconds}}s.";
244
257
  readonly reconnectRateLimitedStill: "{{provider}} is still busy. We'll keep trying on our own.";
245
258
  };
259
+ readonly quota: {
260
+ readonly notice: {
261
+ readonly exhausted: "You've used this month's tokens for {{product}}. They reset on {{resetDate}}. Ask your {{product}} admin if you need more.";
262
+ readonly exhaustedNoDate: "You've used this month's tokens for {{product}}. Ask your {{product}} admin if you need more.";
263
+ readonly exhaustedNoProduct: "You've used this month's tokens. They reset on {{resetDate}}. Ask your admin if you need more.";
264
+ readonly exhaustedNoProductNoDate: "You've used this month's tokens. Ask your admin if you need more.";
265
+ readonly blocked: "Your access to the agent in {{product}} is paused. Ask your {{product}} admin to turn it back on.";
266
+ readonly blockedNoProduct: "Your access to the agent is paused. Ask your admin to turn it back on.";
267
+ readonly scheduleSkipped: "Skipped: this month's tokens are used up.";
268
+ };
269
+ };
246
270
  readonly myUsage: {
247
271
  readonly thisMonth: "This month";
248
272
  readonly today: "Today";
@@ -375,10 +399,37 @@ export declare const en: {
375
399
  usageDescription: string;
376
400
  about: string;
377
401
  aboutDescription: string;
402
+ secrets: string;
403
+ secretsDescription: string;
378
404
  apiKeys: string;
379
405
  apiKeysDescription: string;
380
406
  guide: string;
381
407
  guideDescription: string;
408
+ computer: string;
409
+ computerDescription: string;
410
+ computerIntro: string;
411
+ computerLoading: string;
412
+ computerLoadError: string;
413
+ computerAuthError: string;
414
+ computerDownload: string;
415
+ computerConnect: string;
416
+ computerReplace: string;
417
+ computerConnectError: string;
418
+ computerOpenApp: string;
419
+ computerPairingHint: string;
420
+ computerCopyLink: string;
421
+ computerCopied: string;
422
+ computerCopyError: string;
423
+ computerWaiting: string;
424
+ computerOnline: string;
425
+ computerOffline: string;
426
+ computerMeta: string;
427
+ computerDisconnect: string;
428
+ computerConfirmDisconnect: string;
429
+ computerDisconnectError: string;
430
+ computerOsMacos: string;
431
+ computerOsWindows: string;
432
+ computerOsLinux: string;
382
433
  apiKeysName: string;
383
434
  apiKeysCreate: string;
384
435
  apiKeysRevoke: string;
@@ -399,6 +450,16 @@ export declare const en: {
399
450
  workspaceScopeDescription: string;
400
451
  workspaceScopeApplies: string;
401
452
  workspaceScopeSaveError: string;
453
+ proactiveTitle: string;
454
+ proactiveBody: string;
455
+ proactiveBodySlack: string;
456
+ proactiveWatching: string;
457
+ proactiveOff: string;
458
+ proactiveLastCheck: string;
459
+ proactiveNextCheck: string;
460
+ proactiveCheckNow: string;
461
+ proactiveChecking: string;
462
+ proactiveNothingNew: string;
402
463
  profile: string;
403
464
  languageDescription: string;
404
465
  dockPosition: string;
@@ -503,10 +564,12 @@ export declare const en: {
503
564
  readonly sharedConflict: "Someone updated this task while you were editing. Your text is still here. Copy any changes you want to keep, then reopen the editor to load the latest version.";
504
565
  readonly sharedReadOnly: "You no longer have edit access. Your unsaved changes are still here.";
505
566
  readonly templateUnavailable: "The linked HTML template could not be read. Ask the owner to restore it, then resume this task.";
567
+ readonly sharedOwnerUnavailable: "This shared task is unavailable right now. Resume it when its owner's workspace is back.";
506
568
  readonly cliReconnectRequired: "Simetrik couldn't be reached during this run. It reconnects on its own the next time you open Simetrik.";
507
569
  readonly deliveryFailed: "The task ran but couldn't send its result: every message or email it tried to send failed. Check that its Slack, Teams or email connection is still connected.";
508
570
  readonly cliUnavailable: "Simetrik didn't respond during this run, so nothing could be checked and no email was sent.";
509
571
  readonly emailNotPrepared: "This run ended before it finished its check, so no email was sent. Open the run to see what stopped it.";
572
+ readonly runIncomplete: "This run stopped before it finished, so its work may be partial. Open its conversation to see where it stopped.";
510
573
  readonly viewTitle: "Scheduled";
511
574
  readonly subtitle: "Run work automatically, even when you're away";
512
575
  readonly newTask: "New task";
@@ -519,6 +582,7 @@ export declare const en: {
519
582
  readonly loading: "Loading scheduled tasks…";
520
583
  readonly empty: "No scheduled tasks yet";
521
584
  readonly emptyHint: "Create one to run a prompt later — once or on a repeating schedule.";
585
+ readonly emptyProjectHint: "Or start a project to share tasks and files with your team.";
522
586
  readonly noResults: "No matches for “{{q}}”";
523
587
  readonly loadError: "Couldn't load scheduled tasks.";
524
588
  readonly loadMore: "Load more";
@@ -573,6 +637,10 @@ export declare const en: {
573
637
  readonly summaryDaily: "Daily at {{time}}";
574
638
  readonly summaryWeekdays: "Weekdays at {{time}}";
575
639
  readonly summaryWeekly: "Every {{day}} at {{time}}";
640
+ readonly recurrenceCustomWeekly: "Custom weekly";
641
+ readonly weekdaysLabel: "Days of the week";
642
+ readonly daysRequired: "Select at least one day.";
643
+ readonly summaryCustomWeekly: "Every {{day}} at {{time}}";
576
644
  readonly summaryInterval: "Every {{minutes}} min";
577
645
  readonly summaryManual: "Manual only";
578
646
  readonly timezoneSuffix: "({{timezone}})";
@@ -631,14 +699,22 @@ export declare const en: {
631
699
  readonly runStatusNeedsAttention: "Needs attention";
632
700
  readonly runStatusCompleted: "Completed";
633
701
  readonly runStatusFailed: "Failed";
702
+ readonly runStatusStoppedEarly: "Stopped early";
634
703
  readonly runNeedsAttentionHint: "Waiting for your input.";
635
704
  readonly manualRun: "Manual run";
636
705
  readonly manualRunPaused: "Manual run while paused";
637
- readonly deliverySentTo_one: "Email sent to {{count}} person";
638
- readonly deliverySentTo_other: "Email sent to {{count}} people";
639
- readonly deliverySent: "Email sent";
640
- readonly deliveryEmailsSent_one: "{{count}} email sent";
641
- readonly deliveryEmailsSent_other: "{{count}} emails sent";
706
+ readonly deliverySentTo_one: "Email accepted by provider for {{count}} person";
707
+ readonly deliverySentTo_other: "Email accepted by provider for {{count}} people";
708
+ readonly deliverySent: "Email accepted by provider";
709
+ readonly deliveryEmailsSent_one: "{{count}} email accepted by provider";
710
+ readonly deliveryEmailsSent_other: "{{count}} emails accepted by provider";
711
+ readonly deliveryUnknown: "Email status unknown — verify before resending";
712
+ readonly deliveryBounced: "At least one email bounced";
713
+ readonly deliveryComplained: "An email was reported as spam";
714
+ readonly deliveryProviderFailed: "The provider reported an email delivery failure";
715
+ readonly deliveryDelayed: "Email delivery delayed";
716
+ readonly deliveryConfirmed_one: "{{count}} email delivered";
717
+ readonly deliveryConfirmed_other: "{{count}} emails delivered";
642
718
  readonly deliveryPartlySent: "Email partly sent";
643
719
  readonly deliveryNotSentNoMatch: "Email not sent: the condition didn't match";
644
720
  readonly deliveryNotSentNotWritten: "Email not sent: the task didn't write it";
@@ -698,6 +774,7 @@ export declare const en: {
698
774
  readonly projectHandoverAccepted: "You now own this project.";
699
775
  readonly projectHandoverHelp: "The new owner's workspace runs every task and keeps the files. You keep Can edit.";
700
776
  readonly projectHandoverFailed: "Couldn't complete the handover. Try again.";
777
+ readonly projectHandoverTooManyFiles: "This project has too many files to hand over.";
701
778
  readonly projectFiles: "Files";
702
779
  readonly projectFilesTitle: "Files in “{{name}}”";
703
780
  readonly projectFilesDescription: "One copy everyone in the project works on. Every task in the project runs with these files.";
@@ -797,6 +874,22 @@ export declare const en: {
797
874
  readonly signInPrompt: "Sign in to start chatting.";
798
875
  readonly signIn: "Sign in";
799
876
  };
877
+ readonly pinned: {
878
+ readonly railLabel: "{{name}}, always on";
879
+ readonly railLabelUnread: "{{name}}, {{count}} new";
880
+ readonly rowStatus: "Always on";
881
+ readonly rowStatusUnread: "Always on, {{count}} new";
882
+ readonly statusWorking: "Working on something";
883
+ readonly statusWatching: "Watching {{apps}}";
884
+ readonly statusOn: "Always on";
885
+ readonly statusPaused: "Paused";
886
+ readonly openDetails: "What {{name}} is watching";
887
+ readonly composerPlaceholder: "Message {{name}}";
888
+ readonly emptyTitle: "This is your chat with {{name}}";
889
+ readonly emptyBody: "It keeps working while you're away and writes here when something needs you. Tell it what to watch, or ask for anything.";
890
+ readonly clear: "Clear chat";
891
+ readonly clearHint: "Starts this chat over. What it remembers about you stays.";
892
+ };
800
893
  readonly navigation: {
801
894
  minimizeAgent: string;
802
895
  showLabels: string;
@@ -1392,6 +1485,34 @@ export declare const en: {
1392
1485
  readonly nextBranch: "Next branch";
1393
1486
  readonly branchPage: "{{current}} of {{total}}";
1394
1487
  };
1488
+ readonly vault: {
1489
+ readonly title: "Secrets";
1490
+ readonly description: "Save credentials for your own use across workspaces. Only their names and references are shown to the agent.";
1491
+ readonly add: "Add secret";
1492
+ readonly empty: "No secrets saved.";
1493
+ readonly loading: "Loading secrets…";
1494
+ readonly unavailable: "Secrets are unavailable here. Remove credentials from your message before sending.";
1495
+ readonly name: "Name";
1496
+ readonly nameHint: "Use lowercase letters, numbers and hyphens. Names cannot be changed.";
1497
+ readonly kind: "Kind";
1498
+ readonly apiKey: "API key, token or password";
1499
+ readonly pem: "PEM private key";
1500
+ readonly value: "Secret value";
1501
+ readonly save: "Save";
1502
+ readonly saveSecret: "Save secret";
1503
+ readonly captureHint: "Secret detected. Save it securely; only its reference will be included in your message.";
1504
+ readonly saving: "Saving…";
1505
+ readonly cancel: "Cancel";
1506
+ readonly replace: "Replace value";
1507
+ readonly delete: "Delete";
1508
+ readonly deleteConfirm: "Delete {{name}}? Commands using this reference will no longer work.";
1509
+ readonly nameTaken: "That name is already in use.";
1510
+ readonly notFound: "This secret no longer exists. Refresh and try again.";
1511
+ readonly invalidInput: "Check the name and secret value.";
1512
+ readonly requestFailed: "Could not update secrets. Try again.";
1513
+ readonly forbidden: "You do not have access to secrets.";
1514
+ readonly pasteBlocked: "This text looks like a credential. Remove it from your message and save it as a secret.";
1515
+ };
1395
1516
  readonly common: {
1396
1517
  readonly language: "Language";
1397
1518
  readonly retry: "Retry";
@@ -1668,6 +1789,8 @@ export declare const en: {
1668
1789
  readonly newGoal: "Start a new goal";
1669
1790
  readonly newGoalHint: "Say what the new goal should get done…";
1670
1791
  readonly exit: "Exit goal mode";
1792
+ readonly quotaHeadline: "Paused";
1793
+ readonly quotaDetail: "This month's tokens are used up";
1671
1794
  };
1672
1795
  readonly composerHint: "Tell it what to try instead…";
1673
1796
  };
@@ -1799,16 +1922,20 @@ export declare const en: {
1799
1922
  };
1800
1923
  readonly chat: {
1801
1924
  readonly queued: "Queued";
1925
+ readonly nextStepLabel: "Suggested next step";
1926
+ readonly nextStepDismiss: "Dismiss suggestion";
1802
1927
  readonly notDelivered: "Not delivered — please resend";
1803
- readonly runFailed: "Run failed";
1928
+ readonly notSent: "Not sent";
1804
1929
  readonly uploadFailed: "Attachment upload failed — remove it or try again.";
1805
1930
  readonly uploadRejectedType: "“{{filename}}” isn’t a file type that can be attached — remove it. Text, data, config, code, document and image files work.";
1806
1931
  readonly uploadRejectedSecret: "“{{filename}}” looks like an environment/secrets file — it can’t be attached. Remove it and paste only the values you need.";
1807
1932
  readonly uploadTooLarge: "“{{filename}}” is larger than 25 MB, the most you can attach.";
1808
1933
  readonly authExpired: "Your session expired — please sign in to {{name}} again, then retry.";
1809
1934
  readonly backendUnavailable: "Can't reach the assistant service — check your connection.";
1810
- readonly streamError: "Stream error — {{message}}";
1935
+ readonly streamError: "Something went wrong. Please try again.";
1811
1936
  readonly streamErrorFallback: "please retry";
1937
+ readonly streamInterrupted: "The answer stopped updating before it finished. Reload the page to see the latest.";
1938
+ readonly streamNoticeGeneric: "Something went wrong while showing the answer. Reload the page to see the latest.";
1812
1939
  readonly workspaceUnavailable: "Waiting for a workspace — select one in the app to continue.";
1813
1940
  };
1814
1941
  };