@agent-native/toolkit 0.198.3 → 0.198.5

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 (157) hide show
  1. package/dist/app/agentkit/react/components.d.ts +8 -3
  2. package/dist/app/agentkit/react/components.d.ts.map +1 -1
  3. package/dist/app/agentkit/react/components.js +24 -10
  4. package/dist/app/agentkit/react/components.js.map +1 -1
  5. package/dist/app/chat/AgentKitAssistantChat.d.ts.map +1 -1
  6. package/dist/app/chat/AgentKitAssistantChat.js +65 -33
  7. package/dist/app/chat/AgentKitAssistantChat.js.map +1 -1
  8. package/dist/app/chat/AgentSidebar.d.ts.map +1 -1
  9. package/dist/app/chat/AgentSidebar.js +2 -0
  10. package/dist/app/chat/AgentSidebar.js.map +1 -1
  11. package/dist/app/chat/FileStorageSetupPopover.js +2 -2
  12. package/dist/app/chat/FileStorageSetupPopover.js.map +1 -1
  13. package/dist/app/chat/MultiTabAssistantChat.js +1 -1
  14. package/dist/app/chat/agentkit-chat/connections.d.ts +1 -4
  15. package/dist/app/chat/agentkit-chat/connections.d.ts.map +1 -1
  16. package/dist/app/chat/agentkit-chat/connections.js +1 -26
  17. package/dist/app/chat/agentkit-chat/connections.js.map +1 -1
  18. package/dist/app/chat/agentkit-chat/history.d.ts +4 -1
  19. package/dist/app/chat/agentkit-chat/history.d.ts.map +1 -1
  20. package/dist/app/chat/agentkit-chat/history.js +17 -5
  21. package/dist/app/chat/agentkit-chat/history.js.map +1 -1
  22. package/dist/app/chat/chat/history-types.d.ts +1 -1
  23. package/dist/app/chat/chat/history-types.d.ts.map +1 -1
  24. package/dist/app/chat/chat-first/copy.d.ts +1 -2
  25. package/dist/app/chat/chat-first/copy.d.ts.map +1 -1
  26. package/dist/app/chat/chat-first/copy.js +1 -121
  27. package/dist/app/chat/chat-first/copy.js.map +1 -1
  28. package/dist/app/chat/chat-first-copy.d.ts +3 -0
  29. package/dist/app/chat/chat-first-copy.d.ts.map +1 -0
  30. package/dist/app/chat/chat-first-copy.js +122 -0
  31. package/dist/app/chat/chat-first-copy.js.map +1 -0
  32. package/dist/app/feature-flags/FeatureFlagsPanel.d.ts.map +1 -1
  33. package/dist/app/feature-flags/FeatureFlagsPanel.js +1 -0
  34. package/dist/app/feature-flags/FeatureFlagsPanel.js.map +1 -1
  35. package/dist/app/i18n/catalogs/ar-SA.d.ts.map +1 -1
  36. package/dist/app/i18n/catalogs/ar-SA.js +2 -1
  37. package/dist/app/i18n/catalogs/ar-SA.js.map +1 -1
  38. package/dist/app/i18n/catalogs/de-DE.d.ts.map +1 -1
  39. package/dist/app/i18n/catalogs/de-DE.js +2 -1
  40. package/dist/app/i18n/catalogs/de-DE.js.map +1 -1
  41. package/dist/app/i18n/catalogs/en-US.d.ts +2 -1
  42. package/dist/app/i18n/catalogs/en-US.d.ts.map +1 -1
  43. package/dist/app/i18n/catalogs/en-US.js +2 -1
  44. package/dist/app/i18n/catalogs/en-US.js.map +1 -1
  45. package/dist/app/i18n/catalogs/es-ES.d.ts.map +1 -1
  46. package/dist/app/i18n/catalogs/es-ES.js +2 -1
  47. package/dist/app/i18n/catalogs/es-ES.js.map +1 -1
  48. package/dist/app/i18n/catalogs/fr-FR.d.ts.map +1 -1
  49. package/dist/app/i18n/catalogs/fr-FR.js +2 -1
  50. package/dist/app/i18n/catalogs/fr-FR.js.map +1 -1
  51. package/dist/app/i18n/catalogs/hi-IN.d.ts.map +1 -1
  52. package/dist/app/i18n/catalogs/hi-IN.js +2 -1
  53. package/dist/app/i18n/catalogs/hi-IN.js.map +1 -1
  54. package/dist/app/i18n/catalogs/ja-JP.d.ts.map +1 -1
  55. package/dist/app/i18n/catalogs/ja-JP.js +2 -1
  56. package/dist/app/i18n/catalogs/ja-JP.js.map +1 -1
  57. package/dist/app/i18n/catalogs/ko-KR.d.ts.map +1 -1
  58. package/dist/app/i18n/catalogs/ko-KR.js +2 -1
  59. package/dist/app/i18n/catalogs/ko-KR.js.map +1 -1
  60. package/dist/app/i18n/catalogs/pt-BR.d.ts.map +1 -1
  61. package/dist/app/i18n/catalogs/pt-BR.js +2 -1
  62. package/dist/app/i18n/catalogs/pt-BR.js.map +1 -1
  63. package/dist/app/i18n/catalogs/zh-CN.d.ts.map +1 -1
  64. package/dist/app/i18n/catalogs/zh-CN.js +2 -1
  65. package/dist/app/i18n/catalogs/zh-CN.js.map +1 -1
  66. package/dist/app/i18n/catalogs/zh-TW.d.ts.map +1 -1
  67. package/dist/app/i18n/catalogs/zh-TW.js +2 -1
  68. package/dist/app/i18n/catalogs/zh-TW.js.map +1 -1
  69. package/dist/app/labs/LabsSettings.d.ts.map +1 -1
  70. package/dist/app/labs/LabsSettings.js +7 -3
  71. package/dist/app/labs/LabsSettings.js.map +1 -1
  72. package/dist/app/org/OrgGeneralSection.d.ts.map +1 -1
  73. package/dist/app/org/OrgGeneralSection.js +21 -18
  74. package/dist/app/org/OrgGeneralSection.js.map +1 -1
  75. package/dist/app/org/OrgSwitcher.d.ts.map +1 -1
  76. package/dist/app/org/OrgSwitcher.js +3 -2
  77. package/dist/app/org/OrgSwitcher.js.map +1 -1
  78. package/dist/app/org/workspace-app-links.d.ts +1 -0
  79. package/dist/app/org/workspace-app-links.d.ts.map +1 -1
  80. package/dist/app/org/workspace-app-links.js +3 -0
  81. package/dist/app/org/workspace-app-links.js.map +1 -1
  82. package/dist/app/resources/McpAgentKitConnectionRequest.d.ts +7 -2
  83. package/dist/app/resources/McpAgentKitConnectionRequest.d.ts.map +1 -1
  84. package/dist/app/resources/McpAgentKitConnectionRequest.js +132 -13
  85. package/dist/app/resources/McpAgentKitConnectionRequest.js.map +1 -1
  86. package/dist/composer/PromptComposer.d.ts +3 -0
  87. package/dist/composer/PromptComposer.d.ts.map +1 -1
  88. package/dist/composer/PromptComposer.js +2 -2
  89. package/dist/composer/PromptComposer.js.map +1 -1
  90. package/dist/composer/TiptapComposer.d.ts +4 -1
  91. package/dist/composer/TiptapComposer.d.ts.map +1 -1
  92. package/dist/composer/TiptapComposer.js +8 -4
  93. package/dist/composer/TiptapComposer.js.map +1 -1
  94. package/dist/icons/ResourceIconPicker.d.ts +6 -1
  95. package/dist/icons/ResourceIconPicker.d.ts.map +1 -1
  96. package/dist/icons/ResourceIconPicker.js +45 -6
  97. package/dist/icons/ResourceIconPicker.js.map +1 -1
  98. package/package.json +6 -4
  99. package/src/app/agentkit/react/components.interaction.spec.tsx +93 -0
  100. package/src/app/agentkit/react/components.spec.tsx +4 -5
  101. package/src/app/agentkit/react/components.tsx +51 -8
  102. package/src/app/agentkit/react/composer-context.spec.tsx +7 -0
  103. package/src/app/agentkit/react/lifecycle.spec.tsx +42 -0
  104. package/src/app/chat/AgentKitAssistantChat.spec.tsx +151 -11
  105. package/src/app/chat/AgentKitAssistantChat.tsx +110 -28
  106. package/src/app/chat/AgentPanel.header.spec.ts +59 -22
  107. package/src/app/chat/AgentSidebar.tsx +2 -0
  108. package/src/app/chat/FileStorageSetupPopover.tsx +2 -2
  109. package/src/app/chat/MultiTabAssistantChat.messageCount.spec.tsx +3 -1
  110. package/src/app/chat/MultiTabAssistantChat.spec.tsx +8 -4
  111. package/src/app/chat/MultiTabAssistantChat.tsx +1 -1
  112. package/src/app/chat/agentkit-chat/action-widget.spec.tsx +5 -17
  113. package/src/app/chat/agentkit-chat/connections.spec.tsx +137 -0
  114. package/src/app/chat/agentkit-chat/connections.ts +2 -37
  115. package/src/app/chat/agentkit-chat/history.tsx +23 -8
  116. package/src/app/chat/chat/history-types.ts +1 -1
  117. package/src/app/chat/chat/tool-call-display.spec.tsx +2 -2
  118. package/src/app/chat/chat/widgets/record-change-widget.spec.tsx +20 -29
  119. package/src/app/chat/chat-first/copy.ts +1 -133
  120. package/src/app/chat/chat-first-copy.ts +133 -0
  121. package/src/app/chat/composer/use-agentkit-capabilities.hardening.spec.tsx +3 -2
  122. package/src/app/feature-flags/FeatureFlagsPanel.tsx +1 -0
  123. package/src/app/i18n/catalogs/ar-SA.ts +2 -1
  124. package/src/app/i18n/catalogs/de-DE.ts +3 -1
  125. package/src/app/i18n/catalogs/en-US.ts +2 -1
  126. package/src/app/i18n/catalogs/es-ES.ts +2 -1
  127. package/src/app/i18n/catalogs/fr-FR.ts +3 -1
  128. package/src/app/i18n/catalogs/hi-IN.ts +2 -1
  129. package/src/app/i18n/catalogs/ja-JP.ts +2 -1
  130. package/src/app/i18n/catalogs/ko-KR.ts +2 -1
  131. package/src/app/i18n/catalogs/pt-BR.ts +3 -1
  132. package/src/app/i18n/catalogs/zh-CN.ts +2 -1
  133. package/src/app/i18n/catalogs/zh-TW.ts +2 -1
  134. package/src/app/integrations/IntegrationDetailPage.spec.tsx +1 -1
  135. package/src/app/labs/LabsSettings.tsx +46 -10
  136. package/src/app/observability/ThumbsFeedback.spec.tsx +15 -0
  137. package/src/app/onboarding/FirstRunOnboarding.spec.tsx +4 -0
  138. package/src/app/org/OrgGeneralSection.tsx +32 -22
  139. package/src/app/org/OrgSwitcher.tsx +3 -2
  140. package/src/app/org/workspace-app-links.spec.ts +4 -0
  141. package/src/app/org/workspace-app-links.ts +8 -1
  142. package/src/app/resources/McpAgentKitConnectionRequest.spec.tsx +371 -2
  143. package/src/app/resources/McpAgentKitConnectionRequest.tsx +171 -11
  144. package/src/app/settings/SettingsTabsPage.spec.tsx +4 -2
  145. package/src/app/settings/shell/SettingsShell.spec.tsx +14 -8
  146. package/src/app/settings/shell/pages/app-group-pages.spec.tsx +35 -5
  147. package/src/app/settings/shell/pages/resource-pages.spec.tsx +3 -0
  148. package/src/app/settings/usage/UsagePage.spec.tsx +3 -3
  149. package/src/app/shared/lazy-chunk-error-boundary.spec.tsx +2 -0
  150. package/src/app-shell/sidebar-overflow.spec.tsx +4 -1
  151. package/src/composer/PromptComposer.tsx +7 -0
  152. package/src/composer/TiptapComposer.spec.ts +26 -4
  153. package/src/composer/TiptapComposer.tsx +12 -3
  154. package/src/design-tweaks/visual-style-controls.spec.tsx +38 -0
  155. package/src/editor/useCollabReconcile.concurrent.spec.ts +2 -1
  156. package/src/icons/ResourceIconPicker.spec.tsx +270 -0
  157. package/src/icons/ResourceIconPicker.tsx +72 -4
@@ -42,24 +42,12 @@ vi.mock("@agent-native/core/client/hooks", () => ({
42
42
 
43
43
  import { ACTION_CHAT_UI_RECORD_CHANGE_RENDERER } from "@agent-native/core/action-ui";
44
44
  import { normalizeActionChangeResult } from "@agent-native/core/action-ui";
45
- import {
46
- AgentNativeI18nProvider as CoreAgentNativeI18nProvider,
47
- type AgentNativeI18nProviderProps,
48
- } from "@agent-native/core/client/i18n";
45
+ import { AgentNativeI18nProvider } from "@agent-native/core/client/i18n";
49
46
 
50
47
  import { createToolkitI18nCatalog } from "../../../i18n.js";
51
48
  import { RecordChangeWidget } from "./RecordChangeWidget.js";
52
49
 
53
- const toolkitI18nCatalog = createToolkitI18nCatalog({ messages: {} });
54
-
55
- function AgentNativeI18nProvider(props: AgentNativeI18nProviderProps) {
56
- return (
57
- <CoreAgentNativeI18nProvider
58
- {...props}
59
- catalog={props.catalog ?? toolkitI18nCatalog}
60
- />
61
- );
62
- }
50
+ const catalog = createToolkitI18nCatalog({ messages: {} });
63
51
 
64
52
  describe("core.record-change", () => {
65
53
  let container: HTMLDivElement;
@@ -179,7 +167,7 @@ describe("core.record-change", () => {
179
167
  };
180
168
  await act(async () => {
181
169
  root.render(
182
- <AgentNativeI18nProvider persistPreference={false}>
170
+ <AgentNativeI18nProvider catalog={catalog} persistPreference={false}>
183
171
  <RecordChangeWidget context={context} />
184
172
  </AgentNativeI18nProvider>,
185
173
  );
@@ -211,7 +199,7 @@ describe("core.record-change", () => {
211
199
 
212
200
  await act(async () => {
213
201
  root.render(
214
- <AgentNativeI18nProvider persistPreference={false}>
202
+ <AgentNativeI18nProvider catalog={catalog} persistPreference={false}>
215
203
  <RecordChangeWidget context={context} />
216
204
  </AgentNativeI18nProvider>,
217
205
  );
@@ -248,7 +236,7 @@ describe("core.record-change", () => {
248
236
 
249
237
  await act(async () => {
250
238
  root.render(
251
- <AgentNativeI18nProvider persistPreference={false}>
239
+ <AgentNativeI18nProvider catalog={catalog} persistPreference={false}>
252
240
  <RecordChangeWidget context={context} />
253
241
  </AgentNativeI18nProvider>,
254
242
  );
@@ -272,7 +260,7 @@ describe("core.record-change", () => {
272
260
  root = createRoot(container);
273
261
  await act(async () => {
274
262
  root.render(
275
- <AgentNativeI18nProvider persistPreference={false}>
263
+ <AgentNativeI18nProvider catalog={catalog} persistPreference={false}>
276
264
  <RecordChangeWidget context={context} />
277
265
  </AgentNativeI18nProvider>,
278
266
  );
@@ -306,10 +294,10 @@ describe("core.record-change", () => {
306
294
  await act(async () => {
307
295
  root.render(
308
296
  <>
309
- <AgentNativeI18nProvider persistPreference={false}>
297
+ <AgentNativeI18nProvider catalog={catalog} persistPreference={false}>
310
298
  <RecordChangeWidget context={context} />
311
299
  </AgentNativeI18nProvider>
312
- <AgentNativeI18nProvider persistPreference={false}>
300
+ <AgentNativeI18nProvider catalog={catalog} persistPreference={false}>
313
301
  <RecordChangeWidget context={context} />
314
302
  </AgentNativeI18nProvider>
315
303
  </>,
@@ -382,7 +370,7 @@ describe("core.record-change", () => {
382
370
 
383
371
  await act(async () => {
384
372
  root.render(
385
- <AgentNativeI18nProvider persistPreference={false}>
373
+ <AgentNativeI18nProvider catalog={catalog} persistPreference={false}>
386
374
  <RecordChangeWidget context={context} />
387
375
  </AgentNativeI18nProvider>,
388
376
  );
@@ -411,7 +399,7 @@ describe("core.record-change", () => {
411
399
  it("does not render unsafe change URLs as links", async () => {
412
400
  await act(async () => {
413
401
  root.render(
414
- <AgentNativeI18nProvider persistPreference={false}>
402
+ <AgentNativeI18nProvider catalog={catalog} persistPreference={false}>
415
403
  <RecordChangeWidget
416
404
  context={{
417
405
  toolName: "test-action",
@@ -438,7 +426,7 @@ describe("core.record-change", () => {
438
426
  it("shows saved drafts as awaiting review with a review and edit action", async () => {
439
427
  await act(async () => {
440
428
  root.render(
441
- <AgentNativeI18nProvider persistPreference={false}>
429
+ <AgentNativeI18nProvider catalog={catalog} persistPreference={false}>
442
430
  <RecordChangeWidget
443
431
  context={{
444
432
  toolName: "manage-draft",
@@ -473,7 +461,7 @@ describe("core.record-change", () => {
473
461
  it("uses the filter icon for Mail rule changes", async () => {
474
462
  await act(async () => {
475
463
  root.render(
476
- <AgentNativeI18nProvider persistPreference={false}>
464
+ <AgentNativeI18nProvider catalog={catalog} persistPreference={false}>
477
465
  <RecordChangeWidget
478
466
  context={{
479
467
  toolName: "manage-email-rules",
@@ -503,7 +491,7 @@ describe("core.record-change", () => {
503
491
  it("localizes sharing roles and visibility in action cards", async () => {
504
492
  await act(async () => {
505
493
  root.render(
506
- <AgentNativeI18nProvider persistPreference={false}>
494
+ <AgentNativeI18nProvider catalog={catalog} persistPreference={false}>
507
495
  <RecordChangeWidget
508
496
  context={{
509
497
  toolName: "share-resource",
@@ -537,7 +525,7 @@ describe("core.record-change", () => {
537
525
  ]) {
538
526
  await act(async () => {
539
527
  root.render(
540
- <AgentNativeI18nProvider persistPreference={false}>
528
+ <AgentNativeI18nProvider catalog={catalog} persistPreference={false}>
541
529
  <RecordChangeWidget
542
530
  context={{
543
531
  toolName: "set-resource-visibility",
@@ -566,7 +554,7 @@ describe("core.record-change", () => {
566
554
  it("renders an available Calendar time with a use-time action", async () => {
567
555
  await act(async () => {
568
556
  root.render(
569
- <AgentNativeI18nProvider persistPreference={false}>
557
+ <AgentNativeI18nProvider catalog={catalog} persistPreference={false}>
570
558
  <RecordChangeWidget
571
559
  context={{
572
560
  toolName: "find-a-time",
@@ -602,7 +590,7 @@ describe("core.record-change", () => {
602
590
  }).format(Date.parse(scheduledAt));
603
591
  await act(async () => {
604
592
  root.render(
605
- <AgentNativeI18nProvider persistPreference={false}>
593
+ <AgentNativeI18nProvider catalog={catalog} persistPreference={false}>
606
594
  <RecordChangeWidget
607
595
  context={{
608
596
  toolName: "create-scheduled-send",
@@ -634,7 +622,7 @@ describe("core.record-change", () => {
634
622
  it("localizes booking-link fallback titles and durations", async () => {
635
623
  await act(async () => {
636
624
  root.render(
637
- <AgentNativeI18nProvider persistPreference={false}>
625
+ <AgentNativeI18nProvider catalog={catalog} persistPreference={false}>
638
626
  <RecordChangeWidget
639
627
  context={{
640
628
  toolName: "create-booking-link",
@@ -666,6 +654,7 @@ describe("core.record-change", () => {
666
654
  await act(async () => {
667
655
  root.render(
668
656
  <AgentNativeI18nProvider
657
+ catalog={catalog}
669
658
  initialLocale="es-ES"
670
659
  initialPreference="es-ES"
671
660
  persistPreference={false}
@@ -697,6 +686,7 @@ describe("core.record-change", () => {
697
686
  await act(async () => {
698
687
  root.render(
699
688
  <AgentNativeI18nProvider
689
+ catalog={catalog}
700
690
  initialLocale="fr-FR"
701
691
  initialPreference="fr-FR"
702
692
  persistPreference={false}
@@ -730,6 +720,7 @@ describe("core.record-change", () => {
730
720
  await act(async () => {
731
721
  root.render(
732
722
  <AgentNativeI18nProvider
723
+ catalog={catalog}
733
724
  initialLocale="es-ES"
734
725
  initialPreference="es-ES"
735
726
  persistPreference={false}
@@ -1,133 +1 @@
1
- import type { ChatFirstSurfaceKind } from "@agent-native/core/client/agent-chat";
2
-
3
- import type { ChatFirstCopy } from "./types.js";
4
-
5
- const DEFAULT_COPY: Record<string, string> = {
6
- newChat: "New chat",
7
- search: "Search",
8
- workspaceApps: "Apps",
9
- allApps: "All apps",
10
- integrations: "Integrations",
11
- scheduled: "Scheduled",
12
- createWorkspaceApp: "Create app",
13
- openApp: "Open {name}",
14
- appsLoadError: "Apps could not be loaded",
15
- noWorkspaceApps: "No apps yet",
16
- createApp: "Create app",
17
- retry: "Retry",
18
- dismiss: "Dismiss",
19
- unpinApp: "Unpin this app",
20
- pinApp: "Pin this app",
21
- reloadApp: "Reload app",
22
- removePinned: "Remove from pinned apps",
23
- pinTop: "Pin app to the top",
24
- moveUp: "Move up",
25
- moveDown: "Move down",
26
- removeApp: "Remove app from workspace",
27
- showMore: "Show more",
28
- showLess: "Show less",
29
- appOrderUnavailable: "App order could not be saved on this device.",
30
- openSideSurfaces: "Open side surfaces",
31
- sideSurfaces: "Side surfaces",
32
- resizeSideSurface: "Resize side surface",
33
- closeTab: "Close {name}",
34
- close: "Close",
35
- closeOthers: "Close others",
36
- closeToRight: "Close to the right",
37
- closeAll: "Close all",
38
- deferred: "Deferred",
39
- openActivity: "Open activity",
40
- unavailable: "This surface is not available here.",
41
- browserBack: "Back",
42
- browserForward: "Forward",
43
- browserReload: "Reload page",
44
- browserAddress: "Browser address",
45
- browserOpenExternal: "Open in external browser",
46
- browserClose: "Close browser",
47
- browserPage: "Browser page",
48
- browserInvalidUrl: "Enter a full http(s) URL to navigate.",
49
- browserPreviewStarting: "Starting preview…",
50
- browserPreviewError: "Preview unavailable",
51
- appUnavailable: "This workspace app is no longer available.",
52
- appLoadError: "This app could not be loaded",
53
- appLoading: "Loading app",
54
- agentActivityEyebrow: "Workspace",
55
- agentActivityTitle: "Agent activity",
56
- agentActivityDescription:
57
- "Follow runs and open a second session beside this chat.",
58
- refreshAgentActivity: "Refresh agent activity",
59
- noAgentSessions: "No agent sessions yet",
60
- startAgentSession: "Start an agent run and it will appear here.",
61
- watchSession: "Watch",
62
- copySessionId: "Copy session ID",
63
- copySessionIdFor: "Copy session ID for {name}",
64
- sessionIdCopied: "Session ID copied",
65
- sessionIdShort: "ID",
66
- copied: "Copied",
67
- agentActivityStatusQueued: "Queued",
68
- agentActivityStatusRunning: "Running",
69
- agentActivityStatusPaused: "Paused",
70
- agentActivityStatusNeedsApproval: "Needs approval",
71
- agentActivityStatusCompleted: "Completed",
72
- agentActivityStatusErrored: "Needs attention",
73
- agentActivityStatusRecent: "Recent",
74
- agentActivityStatusUnknown: "Unknown",
75
- watchingSession: "Watching {name}",
76
- session: "session",
77
- stopWatchingSession: "Stop watching session",
78
- stopWatching: "Stop watching",
79
- watchedSession: "Watched session",
80
- agentsTitle: "Subagents",
81
- };
82
-
83
- const SURFACE_COPY: Record<
84
- ChatFirstSurfaceKind,
85
- { label: string; reason: string }
86
- > = {
87
- app: {
88
- label: "App",
89
- reason: "Open a workspace app beside the conversation.",
90
- },
91
- browser: {
92
- label: "Browser",
93
- reason: "Ask the agent to open a web URL.",
94
- },
95
- terminal: {
96
- label: "Terminal",
97
- reason:
98
- "Deferred: an embedded PTY lifecycle is not connected in this release.",
99
- },
100
- files: {
101
- label: "Files",
102
- reason:
103
- "Deferred: a bounded workspace tree is not connected in this release.",
104
- },
105
- diff: {
106
- label: "Diff",
107
- reason: "Deferred: changed-file data is not connected in this release.",
108
- },
109
- "side-chat": {
110
- label: "Side chat",
111
- reason: "Choose Watch and message from any chat row.",
112
- },
113
- agents: {
114
- label: "Agents",
115
- reason: "Review recent runs or watch one beside this conversation.",
116
- },
117
- };
118
-
119
- function interpolate(value: string, values?: Record<string, string>): string {
120
- if (!values) return value;
121
- return value.replace(/\{(\w+)\}/g, (_, key: string) => values[key] ?? "");
122
- }
123
-
124
- export const defaultChatFirstCopy: ChatFirstCopy = (key, values) => {
125
- if (key.startsWith("surface.")) {
126
- const [, kind, field] = key.split(".");
127
- const surface = SURFACE_COPY[kind as ChatFirstSurfaceKind];
128
- if (surface && (field === "label" || field === "reason")) {
129
- return surface[field];
130
- }
131
- }
132
- return interpolate(DEFAULT_COPY[key] ?? key, values);
133
- };
1
+ export { defaultChatFirstCopy } from "../chat-first-copy.js";
@@ -0,0 +1,133 @@
1
+ import type { ChatFirstSurfaceKind } from "@agent-native/core/client/agent-chat";
2
+
3
+ import type { ChatFirstCopy } from "./chat-first/types.js";
4
+
5
+ const DEFAULT_COPY: Record<string, string> = {
6
+ newChat: "New chat",
7
+ search: "Search",
8
+ workspaceApps: "Apps",
9
+ allApps: "All apps",
10
+ integrations: "Integrations",
11
+ scheduled: "Scheduled",
12
+ createWorkspaceApp: "Create app",
13
+ openApp: "Open {name}",
14
+ appsLoadError: "Apps could not be loaded",
15
+ noWorkspaceApps: "No apps yet",
16
+ createApp: "Create app",
17
+ retry: "Retry",
18
+ dismiss: "Dismiss",
19
+ unpinApp: "Unpin this app",
20
+ pinApp: "Pin this app",
21
+ reloadApp: "Reload app",
22
+ removePinned: "Remove from pinned apps",
23
+ pinTop: "Pin app to the top",
24
+ moveUp: "Move up",
25
+ moveDown: "Move down",
26
+ removeApp: "Remove app from workspace",
27
+ showMore: "Show more",
28
+ showLess: "Show less",
29
+ appOrderUnavailable: "App order could not be saved on this device.",
30
+ openSideSurfaces: "Open side surfaces",
31
+ sideSurfaces: "Side surfaces",
32
+ resizeSideSurface: "Resize side surface",
33
+ closeTab: "Close {name}",
34
+ close: "Close",
35
+ closeOthers: "Close others",
36
+ closeToRight: "Close to the right",
37
+ closeAll: "Close all",
38
+ deferred: "Deferred",
39
+ openActivity: "Open activity",
40
+ unavailable: "This surface is not available here.",
41
+ browserBack: "Back",
42
+ browserForward: "Forward",
43
+ browserReload: "Reload page",
44
+ browserAddress: "Browser address",
45
+ browserOpenExternal: "Open in external browser",
46
+ browserClose: "Close browser",
47
+ browserPage: "Browser page",
48
+ browserInvalidUrl: "Enter a full http(s) URL to navigate.",
49
+ browserPreviewStarting: "Starting preview…",
50
+ browserPreviewError: "Preview unavailable",
51
+ appUnavailable: "This workspace app is no longer available.",
52
+ appLoadError: "This app could not be loaded",
53
+ appLoading: "Loading app",
54
+ agentActivityEyebrow: "Workspace",
55
+ agentActivityTitle: "Agent activity",
56
+ agentActivityDescription:
57
+ "Follow runs and open a second session beside this chat.",
58
+ refreshAgentActivity: "Refresh agent activity",
59
+ noAgentSessions: "No agent sessions yet",
60
+ startAgentSession: "Start an agent run and it will appear here.",
61
+ watchSession: "Watch",
62
+ copySessionId: "Copy session ID",
63
+ copySessionIdFor: "Copy session ID for {name}",
64
+ sessionIdCopied: "Session ID copied",
65
+ sessionIdShort: "ID",
66
+ copied: "Copied",
67
+ agentActivityStatusQueued: "Queued",
68
+ agentActivityStatusRunning: "Running",
69
+ agentActivityStatusPaused: "Paused",
70
+ agentActivityStatusNeedsApproval: "Needs approval",
71
+ agentActivityStatusCompleted: "Completed",
72
+ agentActivityStatusErrored: "Needs attention",
73
+ agentActivityStatusRecent: "Recent",
74
+ agentActivityStatusUnknown: "Unknown",
75
+ watchingSession: "Watching {name}",
76
+ session: "session",
77
+ stopWatchingSession: "Stop watching session",
78
+ stopWatching: "Stop watching",
79
+ watchedSession: "Watched session",
80
+ agentsTitle: "Subagents",
81
+ };
82
+
83
+ const SURFACE_COPY: Record<
84
+ ChatFirstSurfaceKind,
85
+ { label: string; reason: string }
86
+ > = {
87
+ app: {
88
+ label: "App",
89
+ reason: "Open a workspace app beside the conversation.",
90
+ },
91
+ browser: {
92
+ label: "Browser",
93
+ reason: "Ask the agent to open a web URL.",
94
+ },
95
+ terminal: {
96
+ label: "Terminal",
97
+ reason:
98
+ "Deferred: an embedded PTY lifecycle is not connected in this release.",
99
+ },
100
+ files: {
101
+ label: "Files",
102
+ reason:
103
+ "Deferred: a bounded workspace tree is not connected in this release.",
104
+ },
105
+ diff: {
106
+ label: "Diff",
107
+ reason: "Deferred: changed-file data is not connected in this release.",
108
+ },
109
+ "side-chat": {
110
+ label: "Side chat",
111
+ reason: "Choose Watch and message from any chat row.",
112
+ },
113
+ agents: {
114
+ label: "Agents",
115
+ reason: "Review recent runs or watch one beside this conversation.",
116
+ },
117
+ };
118
+
119
+ function interpolate(value: string, values?: Record<string, string>): string {
120
+ if (!values) return value;
121
+ return value.replace(/\{(\w+)\}/g, (_, key: string) => values[key] ?? "");
122
+ }
123
+
124
+ export const defaultChatFirstCopy: ChatFirstCopy = (key, values) => {
125
+ if (key.startsWith("surface.")) {
126
+ const [, kind, field] = key.split(".");
127
+ const surface = SURFACE_COPY[kind as ChatFirstSurfaceKind];
128
+ if (surface && (field === "label" || field === "reason")) {
129
+ return surface[field];
130
+ }
131
+ }
132
+ return interpolate(DEFAULT_COPY[key] ?? key, values);
133
+ };
@@ -132,8 +132,9 @@ describe("AgentKit capability lifecycle", () => {
132
132
  await settle();
133
133
  expect(result.data).toBeUndefined();
134
134
  next.resolve(empty);
135
- await settle();
136
- expect(result.data).toEqual(empty);
135
+ await act(async () => {
136
+ await vi.waitFor(() => expect(result.data).toEqual(empty));
137
+ });
137
138
  },
138
139
  );
139
140
 
@@ -473,6 +473,7 @@ export function FeatureFlagsEditor({
473
473
  const sortedFlags = useMemo(
474
474
  () =>
475
475
  flags
476
+ .filter((flag) => flag.canManage !== false)
476
477
  .map((flag) => ({
477
478
  ...flag,
478
479
  rules: normalizeFeatureFlagRules(flag.rules),
@@ -789,7 +789,7 @@ const messages: ToolkitAgentChatTranslation = {
789
789
  "mcpIntegrations.catalog.gong.useCase":
790
790
  "مكالمات المبيعات، والنصوص المفرّغة، ورؤى الصفقات، وملخصات الحسابات",
791
791
  "mcpIntegrations.catalog.gong.setupNote":
792
- "يتطلب Gong أن ينشئ مسؤول تقني تكامل MCP ويختار تفويضًا شخصيًا أو مشتركًا. يجب إعداد معرّف العميل والسر الناتجين قبل الربط.",
792
+ "يجب أن ينشئ المسؤول التقني في Gong تكامل MCP مع تفويض شخصي أو مشترك. للتسجيل اليدوي، احفظ معرّف العميل والسر الناتجين كسرّي مساحة العمل `GONG_MCP_CLIENT_ID` و`GONG_MCP_CLIENT_SECRET`؛ أما التسجيل التلقائي فلا يحتاج إلى بيانات اعتماد للعميل.",
793
793
  "mcpIntegrations.catalog.semgrep.description":
794
794
  "فحص التعليمات البرمجية بحثًا عن مشكلات أمنية.",
795
795
  "mcpIntegrations.catalog.semgrep.useCase":
@@ -1007,6 +1007,7 @@ const messages: ToolkitAgentChatTranslation = {
1007
1007
  "message.revertQuestion":
1008
1008
  "هل تريد الرجوع إلى هذه النقطة؟ ستفقد التغييرات التي أُجريت بعدها.",
1009
1009
  "message.restoreRequestFailed": "فشل طلب الاستعادة.",
1010
+ "message.historyUnavailable": "تعذر تحميل سجل التغييرات.",
1010
1011
  "message.threadNotFound":
1011
1012
  "لم تعد سلسلة الدردشة هذه متاحة. ابدأ دردشة جديدة أو أعد المحاولة إذا كان ذلك غير متوقع.",
1012
1013
  "message.restoring": "جارٍ الاستعادة...",
@@ -544,7 +544,7 @@ const messages: ToolkitAgentChatTranslation = {
544
544
  "mcpIntegrations.catalog.gong.useCase":
545
545
  "Verkaufsgespräche, Transkripte, Deal-Erkenntnisse, Account-Zusammenfassungen",
546
546
  "mcpIntegrations.catalog.gong.setupNote":
547
- "In Gong muss ein technischer Admin eine MCP-Integration erstellen und persönliche oder geteilte Autorisierung wählen. Die generierte Client-ID und das Secret müssen vor dem Verbinden konfiguriert werden.",
547
+ "Ein technischer Gong-Admin muss eine MCP-Integration mit persönlicher oder geteilter Autorisierung erstellen. Bei manueller Registrierung speicherst du die generierte Client-ID und das Secret als Workspace-Secrets `GONG_MCP_CLIENT_ID` und `GONG_MCP_CLIENT_SECRET`; die automatische Registrierung benötigt keine Client-Zugangsdaten.",
548
548
  "mcpIntegrations.catalog.semgrep.description":
549
549
  "Code auf Sicherheitsbefunde scannen.",
550
550
  "mcpIntegrations.catalog.semgrep.useCase":
@@ -756,6 +756,8 @@ const messages: ToolkitAgentChatTranslation = {
756
756
  "message.revertQuestion":
757
757
  "Zu diesem Punkt zurückkehren? Änderungen danach gehen verloren.",
758
758
  "message.restoreRequestFailed": "Wiederherstellungsanfrage fehlgeschlagen.",
759
+ "message.historyUnavailable":
760
+ "Der Änderungsverlauf konnte nicht geladen werden.",
759
761
  "message.threadNotFound":
760
762
  "Dieser Chat-Thread ist nicht mehr verfügbar. Starte einen neuen Chat oder versuche es erneut, falls das unerwartet war.",
761
763
  "message.restoring": "Wird wiederhergestellt...",
@@ -785,7 +785,7 @@ const messages = {
785
785
  "mcpIntegrations.catalog.gong.useCase":
786
786
  "Sales calls, transcripts, deal insights, account summaries",
787
787
  "mcpIntegrations.catalog.gong.setupNote":
788
- "Gong requires a tech admin to create an MCP integration and choose personal or shared authorization. The generated client ID and secret must be configured before connecting.",
788
+ "A Gong tech admin must create an MCP integration with personal or shared authorization. For Manual registration, save the generated client ID and secret as workspace secrets `GONG_MCP_CLIENT_ID` and `GONG_MCP_CLIENT_SECRET`; Automatic registration needs no client credentials.",
789
789
  "mcpIntegrations.catalog.semgrep.description":
790
790
  "Scan code for security findings.",
791
791
  "mcpIntegrations.catalog.semgrep.useCase":
@@ -997,6 +997,7 @@ const messages = {
997
997
  "message.revertQuestion":
998
998
  "Revert to this point? Changes made after this point will be lost.",
999
999
  "message.restoreRequestFailed": "Restore request failed.",
1000
+ "message.historyUnavailable": "Could not load change history.",
1000
1001
  "message.threadNotFound":
1001
1002
  "This chat thread is no longer available. Start a new chat or retry if this was unexpected.",
1002
1003
  "message.restoring": "Restoring...",
@@ -542,7 +542,7 @@ const messages: ToolkitAgentChatTranslation = {
542
542
  "mcpIntegrations.catalog.gong.useCase":
543
543
  "Llamadas de ventas, transcripciones, información sobre oportunidades, resúmenes de cuentas",
544
544
  "mcpIntegrations.catalog.gong.setupNote":
545
- "Gong requiere que un administrador técnico cree una integración MCP y elija una autorización personal o compartida. El ID de cliente y el secreto generados deben configurarse antes de conectar.",
545
+ "Un administrador técnico de Gong debe crear una integración MCP con autorización personal o compartida. Para el registro Manual, guarda el ID y el secreto de cliente generados como secretos del espacio de trabajo `GONG_MCP_CLIENT_ID` y `GONG_MCP_CLIENT_SECRET`; el registro Automático no requiere credenciales de cliente.",
546
546
  "mcpIntegrations.catalog.semgrep.description":
547
547
  "Analiza el código en busca de problemas de seguridad.",
548
548
  "mcpIntegrations.catalog.semgrep.useCase":
@@ -754,6 +754,7 @@ const messages: ToolkitAgentChatTranslation = {
754
754
  "message.revertQuestion":
755
755
  "¿Volver a este punto? Se perderán los cambios posteriores.",
756
756
  "message.restoreRequestFailed": "Error en la solicitud de restauración.",
757
+ "message.historyUnavailable": "No se pudo cargar el historial de cambios.",
757
758
  "message.threadNotFound":
758
759
  "Este hilo de chat ya no está disponible. Inicia un chat nuevo o inténtalo de nuevo si esto no era esperado.",
759
760
  "message.restoring": "Restaurando...",
@@ -549,7 +549,7 @@ const messages: ToolkitAgentChatTranslation = {
549
549
  "mcpIntegrations.catalog.gong.useCase":
550
550
  "Appels commerciaux, transcriptions, insights sur les opportunités, résumés de comptes",
551
551
  "mcpIntegrations.catalog.gong.setupNote":
552
- "Gong exige qu’un administrateur technique crée une intégration MCP et choisisse une autorisation personnelle ou partagée. L’ID client et le secret générés doivent être configurés avant la connexion.",
552
+ "Un administrateur technique Gong doit créer une intégration MCP avec une autorisation personnelle ou partagée. Pour l’inscription manuelle, enregistrez l’ID client et le secret générés dans les secrets de l’espace de travail `GONG_MCP_CLIENT_ID` et `GONG_MCP_CLIENT_SECRET` ; l’inscription automatique ne nécessite pas d’identifiants client.",
553
553
  "mcpIntegrations.catalog.semgrep.description":
554
554
  "Analysez le code pour détecter des problèmes de sécurité.",
555
555
  "mcpIntegrations.catalog.semgrep.useCase":
@@ -760,6 +760,8 @@ const messages: ToolkitAgentChatTranslation = {
760
760
  "message.revertQuestion":
761
761
  "Revenir à ce point ? Les modifications ultérieures seront perdues.",
762
762
  "message.restoreRequestFailed": "Échec de la demande de restauration.",
763
+ "message.historyUnavailable":
764
+ "Impossible de charger l’historique des modifications.",
763
765
  "message.threadNotFound":
764
766
  "Ce fil de discussion n’est plus disponible. Démarrez une nouvelle discussion ou réessayez si cela est inattendu.",
765
767
  "message.restoring": "Restauration...",
@@ -775,7 +775,7 @@ const messages: ToolkitAgentChatTranslation = {
775
775
  "mcpIntegrations.catalog.gong.useCase":
776
776
  "सेल्स कॉल, ट्रांसक्रिप्ट, डील इनसाइट, खाते का सारांश",
777
777
  "mcpIntegrations.catalog.gong.setupNote":
778
- "Gong में एक टेक एडमिन को MCP इंटीग्रेशन बनाना होगा और व्यक्तिगत या साझा ऑथराइज़ेशन चुनना होगा। कनेक्ट करने से पहले जनरेट किए गए क्लाइंट ID और सीक्रेट को कॉन्फ़िगर करना ज़रूरी है।",
778
+ "Gong के टेक एडमिन को व्यक्तिगत या साझा ऑथराइज़ेशन वाला MCP इंटीग्रेशन बनाना होगा। मैन्युअल रजिस्ट्रेशन के लिए जनरेट किया गया क्लाइंट ID और सीक्रेट वर्कस्पेस सीक्रेट `GONG_MCP_CLIENT_ID` और `GONG_MCP_CLIENT_SECRET` के रूप में सेव करें; ऑटोमैटिक रजिस्ट्रेशन के लिए क्लाइंट क्रेडेंशियल की ज़रूरत नहीं है।",
779
779
  "mcpIntegrations.catalog.semgrep.description":
780
780
  "सुरक्षा से जुड़ी समस्याओं के लिए कोड स्कैन करें।",
781
781
  "mcpIntegrations.catalog.semgrep.useCase":
@@ -980,6 +980,7 @@ const messages: ToolkitAgentChatTranslation = {
980
980
  "message.restoreQuestion": "यहाँ तक पुनर्स्थापित करें?",
981
981
  "message.revertQuestion": "इस बिंदु पर वापस जाएँ? इसके बाद किए गए बदलाव खो जाएँगे।",
982
982
  "message.restoreRequestFailed": "पुनर्स्थापना अनुरोध विफल रहा।",
983
+ "message.historyUnavailable": "बदलावों का इतिहास लोड नहीं हो सका।",
983
984
  "message.threadNotFound":
984
985
  "यह चैट थ्रेड अब उपलब्ध नहीं है। नई चैट शुरू करें या यदि यह अप्रत्याशित है तो फिर कोशिश करें।",
985
986
  "message.restoring": "पुनर्स्थापित किया जा रहा है...",
@@ -804,7 +804,7 @@ const messages: ToolkitAgentChatTranslation = {
804
804
  "mcpIntegrations.catalog.gong.useCase":
805
805
  "営業通話、文字起こし、商談のインサイト、アカウントの概要",
806
806
  "mcpIntegrations.catalog.gong.setupNote":
807
- "Gong では、技術管理者が MCP 連携を作成し、個人または共有の認証を選択する必要があります。接続する前に、生成されたクライアント ID とシークレットを設定してください。",
807
+ "Gong の技術管理者が、個人または共有の認証を選んで MCP 連携を作成する必要があります。手動登録では、生成されたクライアント ID とシークレットをワークスペースのシークレット `GONG_MCP_CLIENT_ID` と `GONG_MCP_CLIENT_SECRET` として保存してください。自動登録ではクライアント認証情報は不要です。",
808
808
  "mcpIntegrations.catalog.semgrep.description":
809
809
  "コードをスキャンしてセキュリティ上の問題を検出します。",
810
810
  "mcpIntegrations.catalog.semgrep.useCase":
@@ -1013,6 +1013,7 @@ const messages: ToolkitAgentChatTranslation = {
1013
1013
  "message.restoreQuestion": "ここまで復元しますか?",
1014
1014
  "message.revertQuestion": "この時点に戻しますか?この後の変更は失われます。",
1015
1015
  "message.restoreRequestFailed": "復元リクエストに失敗しました。",
1016
+ "message.historyUnavailable": "変更履歴を読み込めませんでした。",
1016
1017
  "message.threadNotFound":
1017
1018
  "このチャットスレッドは利用できなくなりました。新しいチャットを開始するか、想定外の場合は再試行してください。",
1018
1019
  "message.restoring": "復元中...",
@@ -781,7 +781,7 @@ const messages: ToolkitAgentChatTranslation = {
781
781
  "mcpIntegrations.catalog.gong.useCase":
782
782
  "영업 통화, 스크립트, 거래 인사이트, 계정 요약",
783
783
  "mcpIntegrations.catalog.gong.setupNote":
784
- "Gong에서는 기술 관리자가 MCP 연동을 만들고 개인 또는 공유 승인 방식을 선택해야 합니다. 연결하기 전에 생성된 클라이언트 ID와 시크릿을 구성해야 합니다.",
784
+ "Gong 기술 관리자가 개인 또는 공유 승인을 선택해 MCP 연동을 만들어야 합니다. 수동 등록에서는 생성된 클라이언트 ID와 시크릿을 워크스페이스 시크릿 `GONG_MCP_CLIENT_ID` 및 `GONG_MCP_CLIENT_SECRET`으로 저장하세요. 자동 등록에는 클라이언트 인증 정보가 필요하지 않습니다.",
785
785
  "mcpIntegrations.catalog.semgrep.description":
786
786
  "코드에서 보안 문제를 스캔합니다.",
787
787
  "mcpIntegrations.catalog.semgrep.useCase":
@@ -991,6 +991,7 @@ const messages: ToolkitAgentChatTranslation = {
991
991
  "message.revertQuestion":
992
992
  "이 지점으로 되돌릴까요? 이후 변경 사항은 사라집니다.",
993
993
  "message.restoreRequestFailed": "복원 요청에 실패했습니다.",
994
+ "message.historyUnavailable": "변경 기록을 불러올 수 없습니다.",
994
995
  "message.threadNotFound":
995
996
  "이 채팅 스레드는 더 이상 사용할 수 없습니다. 새 채팅을 시작하거나 예상치 못한 문제라면 다시 시도하세요.",
996
997
  "message.restoring": "복원 중...",
@@ -537,7 +537,7 @@ const messages: ToolkitAgentChatTranslation = {
537
537
  "mcpIntegrations.catalog.gong.useCase":
538
538
  "Chamadas de vendas, transcrições, insights de negócios, resumos de contas",
539
539
  "mcpIntegrations.catalog.gong.setupNote":
540
- "O Gong exige que um administrador técnico crie uma integração MCP e escolha a autorização pessoal ou compartilhada. O ID e o segredo do cliente gerados precisam ser configurados antes de conectar.",
540
+ "Um administrador técnico do Gong precisa criar uma integração MCP com autorização pessoal ou compartilhada. No registro Manual, salve o ID e o segredo do cliente gerados como segredos do espaço de trabalho `GONG_MCP_CLIENT_ID` e `GONG_MCP_CLIENT_SECRET`; o registro Automático não precisa de credenciais de cliente.",
541
541
  "mcpIntegrations.catalog.semgrep.description":
542
542
  "Analise o código em busca de problemas de segurança.",
543
543
  "mcpIntegrations.catalog.semgrep.useCase":
@@ -747,6 +747,8 @@ const messages: ToolkitAgentChatTranslation = {
747
747
  "message.revertQuestion":
748
748
  "Reverter para este ponto? As alterações feitas depois serão perdidas.",
749
749
  "message.restoreRequestFailed": "Falha na solicitação de restauração.",
750
+ "message.historyUnavailable":
751
+ "Não foi possível carregar o histórico de alterações.",
750
752
  "message.threadNotFound":
751
753
  "Esta conversa não está mais disponível. Inicie uma nova conversa ou tente novamente se isso for inesperado.",
752
754
  "message.restoring": "Restaurando...",
@@ -744,7 +744,7 @@ const messages: ToolkitAgentChatTranslation = {
744
744
  "mcpIntegrations.catalog.gong.useCase":
745
745
  "销售通话、转录文本、交易洞察、客户摘要",
746
746
  "mcpIntegrations.catalog.gong.setupNote":
747
- "Gong 需要技术管理员创建 MCP 集成,并选择个人授权或共享授权。连接前必须配置生成的客户端 ID 和密钥。",
747
+ "Gong 技术管理员需要创建 MCP 集成并选择个人或共享授权。使用手动注册时,请将生成的客户端 ID 和密钥保存为工作区密钥 `GONG_MCP_CLIENT_ID` 和 `GONG_MCP_CLIENT_SECRET`;自动注册无需客户端凭据。",
748
748
  "mcpIntegrations.catalog.semgrep.description": "扫描代码中的安全问题。",
749
749
  "mcpIntegrations.catalog.semgrep.useCase": "安全扫描、漏洞检测、代码分析",
750
750
  "mcpIntegrations.catalog.linear.description": "读取和写入 Linear 议题。",
@@ -934,6 +934,7 @@ const messages: ToolkitAgentChatTranslation = {
934
934
  "message.restoreQuestion": "恢复到此处?",
935
935
  "message.revertQuestion": "还原到此处?此后所做的更改将会丢失。",
936
936
  "message.restoreRequestFailed": "恢复请求失败。",
937
+ "message.historyUnavailable": "无法加载更改历史。",
937
938
  "message.threadNotFound":
938
939
  "此聊天线程已不可用。请开始新聊天;如果这是意外情况,也可以重试。",
939
940
  "message.restoring": "正在恢复...",