@nextclaw/ui 0.20.0 → 0.20.1

This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
Files changed (67) hide show
  1. package/CHANGELOG.md +18 -0
  2. package/dist/assets/{api-C2iYhdTe.js → api-BBFMpRGl.js} +1 -1
  3. package/dist/assets/{appearance-settings-page-BwQDQr0n.js → appearance-settings-page-C1Erayzl.js} +1 -1
  4. package/dist/assets/{book-open-C0IlT9zs.js → book-open-BhTIpBKg.js} +1 -1
  5. package/dist/assets/{channels-list-page-B0z4bh8e.js → channels-list-page-OTCkjMOW.js} +1 -1
  6. package/dist/assets/{config-split-page-VDTf3zZb.js → config-split-page-By7p-4X-.js} +1 -1
  7. package/dist/assets/{confirm-dialog-BI_Vt2s_.js → confirm-dialog-xpl1Yl7r.js} +1 -1
  8. package/dist/assets/{createLucideIcon-Bydi9Gc5.js → createLucideIcon-B_8khHn8.js} +1 -1
  9. package/dist/assets/{desktop-update-config-DVoD6NxG.js → desktop-update-config-CGFfa7-Z.js} +1 -1
  10. package/dist/assets/{dist-CmHtkFbs.js → dist-CXN62DSs.js} +1 -1
  11. package/dist/assets/{dist-A5btQciA.js → dist-DdE-kCbi.js} +1 -1
  12. package/dist/assets/{doc-browser-Cm_tMZ_C.js → doc-browser-5xrHcQ2z.js} +1 -1
  13. package/dist/assets/doc-browser-c2yO477-.js +1 -0
  14. package/dist/assets/{doc-browser-context-Bxw0ora-.js → doc-browser-context-B8NCuMv5.js} +1 -1
  15. package/dist/assets/{extensions-CG4voDCh.js → extensions-CMctxyTf.js} +1 -1
  16. package/dist/assets/{form-actions-lv47uGIB.js → form-actions-BFgTdxqI.js} +1 -1
  17. package/dist/assets/index-DUCA8m2w.js +109 -0
  18. package/dist/assets/loader-circle-CbdTrSp3.js +1 -0
  19. package/dist/assets/{mcp-marketplace-page-BSk0qUOX.js → mcp-marketplace-page-DGve0muV.js} +1 -1
  20. package/dist/assets/mcp-marketplace-page-_37VzG2q.js +1 -0
  21. package/dist/assets/{model-config-page-c8RnUGoH.js → model-config-page-DyC5H0bu.js} +1 -1
  22. package/dist/assets/{navigation-link-D0agTj5t.js → navigation-link-BwWrm4k1.js} +1 -1
  23. package/dist/assets/plus-DbeE4r-Q.js +1 -0
  24. package/dist/assets/{privacy-settings-page-CPkyTvEE.js → privacy-settings-page--MOnhAZ6.js} +1 -1
  25. package/dist/assets/{providers-config-page-CGUEb5Dx.js → providers-config-page-ChL3FUvK.js} +1 -1
  26. package/dist/assets/react-DVMmnPWz.js +8 -0
  27. package/dist/assets/{refresh-cw-DjgY2Eju.js → refresh-cw-B7NmPJ_Z.js} +1 -1
  28. package/dist/assets/remote-DFoxj4ls.js +1 -0
  29. package/dist/assets/{rotate-cw-Dot4PVh0.js → rotate-cw-B0ajMaHu.js} +1 -1
  30. package/dist/assets/{runtime-config-page-C6nzqTHg.js → runtime-config-page-BQdT3nmd.js} +1 -1
  31. package/dist/assets/{save-B-jdTe_c.js → save-DWnYYpgQ.js} +1 -1
  32. package/dist/assets/{search-CEp2AIiV.js → search-D6pX7FC-.js} +1 -1
  33. package/dist/assets/{search-config-page-Dp5guS5O.js → search-config-page-Cx3o_675.js} +1 -1
  34. package/dist/assets/{secrets-config-page-C7nRMjiv.js → secrets-config-page-tyFl7Rvt.js} +1 -1
  35. package/dist/assets/security-config-CUTUm6JT.js +1 -0
  36. package/dist/assets/{select-BNA3cma8.js → select-qEtFTWB5.js} +1 -1
  37. package/dist/assets/skeleton-7MYPzn8w.js +1 -0
  38. package/dist/assets/{tag-chip-DmCNi4-9.js → tag-chip-vcjAYdV_.js} +1 -1
  39. package/dist/assets/x-DThaS5ZL.js +1 -0
  40. package/dist/index.html +20 -20
  41. package/package.json +7 -7
  42. package/src/features/chat/features/message/components/chat-message-list.container.tsx +33 -4
  43. package/src/features/chat/features/message/utils/__tests__/chat-message-file-operation.utils.test.ts +186 -0
  44. package/src/features/chat/features/message/utils/__tests__/chat-message-texts.utils.test.ts +9 -0
  45. package/src/features/chat/features/message/utils/__tests__/chat-message-timeline.utils.test.ts +71 -0
  46. package/src/features/chat/features/message/utils/__tests__/chat-message-trigger-details.utils.test.ts +112 -0
  47. package/src/features/chat/features/message/utils/chat-message-part.utils.ts +1 -1
  48. package/src/features/chat/features/message/utils/chat-message-texts.utils.ts +36 -0
  49. package/src/features/chat/features/message/utils/chat-message-trigger-details.utils.ts +118 -0
  50. package/src/features/chat/features/ncp/hooks/__tests__/use-ncp-agent-runtime.test.tsx +90 -1
  51. package/src/features/chat/features/session/utils/ncp-session-context-metadata.utils.ts +5 -1
  52. package/src/features/chat/features/workspace/components/__tests__/chat-session-workspace-panel-content.test.tsx +5 -5
  53. package/src/features/chat/features/workspace/components/chat-session-workspace-panel-content.tsx +3 -40
  54. package/src/features/chat/managers/__tests__/chat-completion-notification.manager.test.ts +70 -0
  55. package/src/features/chat/managers/chat-completion-notification.manager.ts +23 -6
  56. package/src/shared/lib/i18n/locales/en-US/chat.json +21 -0
  57. package/src/shared/lib/i18n/locales/zh-CN/chat.json +21 -0
  58. package/dist/assets/doc-browser-Dto54tCf.js +0 -1
  59. package/dist/assets/index-BTSwNDVi.js +0 -109
  60. package/dist/assets/loader-circle-CkaqeEne.js +0 -1
  61. package/dist/assets/mcp-marketplace-page-BgZGc-S_.js +0 -1
  62. package/dist/assets/plus-BiMjkv3R.js +0 -1
  63. package/dist/assets/react-BMYFkaGi.js +0 -8
  64. package/dist/assets/remote-1LxkpRED.js +0 -1
  65. package/dist/assets/security-config-DvHUDxSg.js +0 -1
  66. package/dist/assets/skeleton-CbroEO8Q.js +0 -1
  67. package/dist/assets/x-BTo5-A8h.js +0 -1
@@ -1,4 +1,4 @@
1
- import { act, renderHook, waitFor } from "@testing-library/react";
1
+ import { act, render, renderHook, waitFor } from "@testing-library/react";
2
2
  import {
3
3
  type NcpAgentClientEndpoint,
4
4
  type NcpAgentSendEnvelope,
@@ -158,6 +158,29 @@ class ExistingSessionLiveClient implements NcpAgentClientEndpoint {
158
158
  };
159
159
  }
160
160
 
161
+ function RuntimeMessagesProbe({
162
+ client,
163
+ manager,
164
+ }: {
165
+ client: NcpAgentClientEndpoint;
166
+ manager: DefaultNcpAgentConversationStateManager;
167
+ }) {
168
+ const { visibleMessages } = useNcpAgentRuntime({
169
+ sessionId: "ncp-mt7hs0u9-15yce6jv",
170
+ client,
171
+ manager,
172
+ });
173
+ return (
174
+ <div data-testid="runtime-messages">
175
+ {visibleMessages.map((message) => (
176
+ <div key={message.id} data-message-id={message.id}>
177
+ {message.id}
178
+ </div>
179
+ ))}
180
+ </div>
181
+ );
182
+ }
183
+
161
184
  function readAssistantText(messages: readonly NcpMessage[]): string {
162
185
  const assistant = messages.find((message) => message.role === "assistant");
163
186
  return assistant?.parts
@@ -421,6 +444,72 @@ describe("useNcpAgentRuntime", () => {
421
444
  ]);
422
445
  });
423
446
 
447
+ it("keeps the live assistant boundary and DOM identity when a steered user has an earlier timestamp", async () => {
448
+ const client = new DeferredSendClient();
449
+ const manager = new DefaultNcpAgentConversationStateManager();
450
+ manager.hydrate({
451
+ sessionId: "ncp-mt7hs0u9-15yce6jv",
452
+ messages: [{
453
+ id: "user-mt7jp7vd",
454
+ sessionId: "ncp-mt7hs0u9-15yce6jv",
455
+ role: "user",
456
+ status: "final",
457
+ parts: [{ type: "text", text: "first" }],
458
+ timestamp: "2026-08-24T18:04:10.460Z",
459
+ }],
460
+ });
461
+ await manager.dispatchBatch([
462
+ {
463
+ type: NcpEventType.RunStarted,
464
+ payload: {
465
+ sessionId: "ncp-mt7hs0u9-15yce6jv",
466
+ runId: "agent-run-7c65d8b1-6bda-4f08-a2ad-d5f5318366fb",
467
+ },
468
+ },
469
+ {
470
+ type: NcpEventType.MessageReasoningDelta,
471
+ payload: {
472
+ sessionId: "ncp-mt7hs0u9-15yce6jv",
473
+ messageId: "assistant-message-2629eaf9-c4ce-4562-b22d-c70f1e8c85e2",
474
+ delta: "Planning",
475
+ },
476
+ },
477
+ ]);
478
+
479
+ const view = render(<RuntimeMessagesProbe client={client} manager={manager} />);
480
+ const assistantSelector = '[data-message-id="assistant-message-2629eaf9-c4ce-4562-b22d-c70f1e8c85e2"]';
481
+ const assistantNode = view.container.querySelector(assistantSelector);
482
+ expect(assistantNode).not.toBeNull();
483
+
484
+ await act(async () => {
485
+ await manager.dispatch({
486
+ type: NcpEventType.MessageSent,
487
+ payload: {
488
+ sessionId: "ncp-mt7hs0u9-15yce6jv",
489
+ message: {
490
+ id: "user-mt7jpad5",
491
+ sessionId: "ncp-mt7hs0u9-15yce6jv",
492
+ role: "user",
493
+ status: "final",
494
+ parts: [{ type: "text", text: "steer" }],
495
+ timestamp: "2026-08-24T18:04:13.625Z",
496
+ },
497
+ },
498
+ });
499
+ });
500
+
501
+ await waitFor(() => {
502
+ const ids = [...view.container.querySelectorAll("[data-message-id]")]
503
+ .map((node) => node.getAttribute("data-message-id"));
504
+ expect(ids).toEqual([
505
+ "user-mt7jp7vd",
506
+ "assistant-message-2629eaf9-c4ce-4562-b22d-c70f1e8c85e2",
507
+ "user-mt7jpad5",
508
+ ]);
509
+ });
510
+ expect(view.container.querySelector(assistantSelector)).toBe(assistantNode);
511
+ });
512
+
424
513
  });
425
514
 
426
515
  describe("useNcpAgentRuntime commands and live stream", () => {
@@ -91,7 +91,11 @@ export type ContextCompactionTimelineView = {
91
91
 
92
92
  export function readContextCompactionTimeline(message: Pick<NcpMessageView, 'metadata'>): ContextCompactionTimelineView | null {
93
93
  const { metadata } = message;
94
- if (!metadata || metadata[NEXTCLAW_TIMELINE_KIND_METADATA_KEY] !== CONTEXT_COMPACTION_TIMELINE_KIND) {
94
+ if (
95
+ !metadata ||
96
+ readOptionalString(metadata.inherited_from_session_id) ||
97
+ metadata[NEXTCLAW_TIMELINE_KIND_METADATA_KEY] !== CONTEXT_COMPACTION_TIMELINE_KIND
98
+ ) {
95
99
  return null;
96
100
  }
97
101
  const rawCheckpoint =
@@ -222,7 +222,7 @@ function createChildTab(): ResolvedChildSessionTab {
222
222
  };
223
223
  }
224
224
 
225
- it('shows compact child session metadata in a full-height column layout', () => {
225
+ it('shows child session content without a redundant metadata header', () => {
226
226
  render(
227
227
  <ChatSessionWorkspacePanelContent
228
228
  activeSelection={{
@@ -239,10 +239,10 @@ it('shows compact child session metadata in a full-height column layout', () =>
239
239
  );
240
240
 
241
241
  expect(screen.queryByText('Child title')).toBeNull();
242
- expect(screen.getByText('原生')).toBeTruthy();
243
- expect(screen.getByText('minimax/MiniMax-M3')).toBeTruthy();
244
- expect(screen.getByText('nextbot')).toBeTruthy();
245
- expect(screen.getByTitle('/Users/peiwang/Projects/nextbot')).toBeTruthy();
242
+ expect(screen.queryByText('原生')).toBeNull();
243
+ expect(screen.queryByText('minimax/MiniMax-M3')).toBeNull();
244
+ expect(screen.queryByText('nextbot')).toBeNull();
245
+ expect(screen.queryByTitle('/Users/peiwang/Projects/nextbot')).toBeNull();
246
246
  const conversationArea = screen.getByTestId('session-conversation-area');
247
247
  const selectedContentHost = conversationArea.parentElement?.parentElement;
248
248
  expect(Array.from(selectedContentHost?.classList ?? [])).toEqual(
@@ -202,40 +202,6 @@ function WorkspaceProjectFiles({
202
202
  );
203
203
  }
204
204
 
205
- function ChildSessionMetaChip({ value }: { value: string }) {
206
- return (
207
- <span className="inline-flex max-w-full shrink-0 items-center rounded border border-gray-200 bg-gray-50 px-1.5 py-0.5 text-[10px] font-medium text-gray-600">
208
- <span className="truncate">{value}</span>
209
- </span>
210
- );
211
- }
212
-
213
- function ChildSessionMetaStrip({ tab }: { tab: ResolvedChildSessionTab }) {
214
- const metaItems = [tab.sessionTypeLabel, tab.preferredModel, tab.projectName].filter((value): value is string =>
215
- Boolean(value?.trim()),
216
- );
217
-
218
- if (metaItems.length === 0 && !tab.projectRoot) {
219
- return null;
220
- }
221
-
222
- return (
223
- <div className="flex min-h-9 min-w-0 items-center gap-1.5 border-b border-gray-200/70 px-3 py-1.5 text-[11px] text-gray-500">
224
- {metaItems.map((item) => (
225
- <ChildSessionMetaChip key={item} value={item} />
226
- ))}
227
- {tab.projectRoot ? (
228
- <span
229
- title={tab.projectRoot}
230
- className="min-w-0 flex-1 truncate rounded border border-gray-200 bg-gray-50 px-1.5 py-0.5 font-mono text-[10px] text-gray-500"
231
- >
232
- {tab.projectRoot}
233
- </span>
234
- ) : null}
235
- </div>
236
- );
237
- }
238
-
239
205
  function WorkspaceSideChatDraftHeader() {
240
206
  return (
241
207
  <div className="border-b border-gray-200/70 px-4 py-3">
@@ -307,12 +273,9 @@ function WorkspaceSelectedContent({
307
273
 
308
274
  if (activeSelection.kind === 'child-session') {
309
275
  return (
310
- <>
311
- <ChildSessionMetaStrip tab={activeSelection.tab} />
312
- <div className="flex min-h-0 flex-1 flex-col">
313
- <SessionConversationArea sessionKey={activeSelection.tab.sessionKey} />
314
- </div>
315
- </>
276
+ <div className="flex min-h-0 flex-1 flex-col">
277
+ <SessionConversationArea sessionKey={activeSelection.tab.sessionKey} />
278
+ </div>
316
279
  );
317
280
  }
318
281
 
@@ -117,6 +117,76 @@ describe("ChatCompletionNotificationManager", () => {
117
117
  expect(show).toHaveBeenCalledOnce();
118
118
  });
119
119
 
120
+ it("notifies only for human-triggered background runs", () => {
121
+ manager.start();
122
+ emit(createCompletedEvent(createMessage({
123
+ id: "assistant-agent",
124
+ metadata: {
125
+ run_trigger: {
126
+ version: 1,
127
+ actor: "agent",
128
+ source: "sessions_spawn",
129
+ triggeredAt: "2026-08-05T09:59:00.000Z",
130
+ targetRunId: "run-agent",
131
+ },
132
+ },
133
+ })));
134
+ emit(createCompletedEvent(createMessage({
135
+ id: "assistant-automation",
136
+ metadata: {
137
+ run_trigger: {
138
+ version: 1,
139
+ actor: "automation",
140
+ source: "observation",
141
+ triggeredAt: "2026-08-05T09:59:00.000Z",
142
+ targetRunId: "run-automation",
143
+ },
144
+ },
145
+ })));
146
+ emit(createCompletedEvent(createMessage({
147
+ id: "assistant-human",
148
+ metadata: {
149
+ run_trigger: {
150
+ version: 1,
151
+ actor: "human",
152
+ source: "ui-http",
153
+ triggeredAt: "2026-08-05T09:59:00.000Z",
154
+ targetRunId: "run-human",
155
+ },
156
+ },
157
+ })));
158
+
159
+ expect(show).toHaveBeenCalledOnce();
160
+ expect(show).toHaveBeenCalledWith(expect.objectContaining({
161
+ id: "chat-reply:assistant-human",
162
+ }));
163
+ });
164
+
165
+ it("silences legacy child replies without changing legacy top-level behavior", () => {
166
+ useChatQueryStore.setState({
167
+ snapshot: {
168
+ sessionsQuery: {
169
+ data: {
170
+ sessions: [{
171
+ sessionId: "session-background",
172
+ messageCount: 2,
173
+ updatedAt: "2026-08-05T10:00:00.000Z",
174
+ metadata: { parent_session_id: "parent-session" },
175
+ }],
176
+ total: 1,
177
+ },
178
+ } as never,
179
+ },
180
+ });
181
+ manager.start();
182
+ emit(createCompletedEvent());
183
+ expect(show).not.toHaveBeenCalled();
184
+
185
+ useChatQueryStore.setState({ snapshot: {} });
186
+ emit(createCompletedEvent(createMessage({ id: "legacy-top-level" })));
187
+ expect(show).toHaveBeenCalledOnce();
188
+ });
189
+
120
190
  it("ignores non-final, non-assistant, hidden, and unrelated events", () => {
121
191
  manager.start();
122
192
  emit(createCompletedEvent(createMessage({ status: "streaming" })));
@@ -1,6 +1,7 @@
1
1
  import {
2
2
  isHiddenNcpMessage,
3
3
  NcpEventType,
4
+ readNcpRunTriggerMetadata,
4
5
  type NcpEndpointEvent,
5
6
  type NcpMessage,
6
7
  } from "@nextclaw/ncp";
@@ -16,6 +17,14 @@ import { t } from "@/shared/lib/i18n";
16
17
  const NOTIFICATION_PREVIEW_MAX_CHARACTERS = 120;
17
18
  const NOTIFIED_MESSAGE_HISTORY_LIMIT = 200;
18
19
 
20
+ function isChildSessionMetadata(
21
+ metadata: Record<string, unknown> | null | undefined,
22
+ ): boolean {
23
+ return [metadata?.parent_session_id, metadata?.parentSessionId].some(
24
+ (value) => typeof value === "string" && value.trim().length > 0,
25
+ );
26
+ }
27
+
19
28
  function buildNotificationPreview(value: string): string {
20
29
  const normalized = value
21
30
  .replace(/\r\n?/gu, "\n")
@@ -119,7 +128,18 @@ export class ChatCompletionNotificationManager {
119
128
  return;
120
129
  }
121
130
 
122
- const title = this.resolveSessionTitle(sessionId);
131
+ const summary = this.resolveSessionSummary(sessionId);
132
+ const trigger = readNcpRunTriggerMetadata(message.metadata);
133
+ if (
134
+ (trigger && trigger.actor !== "human") ||
135
+ (!trigger && summary && isChildSessionMetadata(summary.metadata))
136
+ ) {
137
+ return;
138
+ }
139
+
140
+ const title = summary
141
+ ? sessionDisplayName(adaptNcpSessionSummary(summary))
142
+ : t("chatBackgroundReplyFallbackTitle");
123
143
  const preview = readAssistantReplyPreview(message);
124
144
  this.notificationManager.show({
125
145
  id: `chat-reply:${message.id}`,
@@ -130,13 +150,10 @@ export class ChatCompletionNotificationManager {
130
150
  });
131
151
  };
132
152
 
133
- private readonly resolveSessionTitle = (sessionId: string): string => {
153
+ private readonly resolveSessionSummary = (sessionId: string) => {
134
154
  const summaries =
135
155
  useChatQueryStore.getState().snapshot.sessionsQuery?.data?.sessions ?? [];
136
- const summary = summaries.find((item) => item.sessionId === sessionId);
137
- return summary
138
- ? sessionDisplayName(adaptNcpSessionSummary(summary))
139
- : t("chatBackgroundReplyFallbackTitle");
156
+ return summaries.find((item) => item.sessionId === sessionId);
140
157
  };
141
158
 
142
159
  private readonly rememberHandledMessage = (messageId: string): void => {
@@ -280,6 +280,27 @@
280
280
  "chatAiExecutionUsageReported": "Reported",
281
281
  "chatAiExecutionUsagePartial": "Partial",
282
282
  "chatAiExecutionUsageUnavailable": "Unavailable",
283
+ "chatRunTriggerView": "View trigger details",
284
+ "chatRunTriggerTitle": "Run trigger",
285
+ "chatRunTriggerDescription": "See what started this run and the source context retained with the message.",
286
+ "chatRunTriggerClose": "Close trigger details",
287
+ "chatRunTriggerActor": "Started by",
288
+ "chatRunTriggerSource": "Trigger source",
289
+ "chatRunTriggerTime": "Triggered at",
290
+ "chatRunTriggerTargetRun": "Target run ID",
291
+ "chatRunTriggerSourceSession": "Source session ID",
292
+ "chatRunTriggerSourceMessage": "Source message ID",
293
+ "chatRunTriggerSourceRun": "Source run ID",
294
+ "chatRunTriggerSourceToolCall": "Source tool call ID",
295
+ "chatRunTriggerSourceRequest": "Source request ID",
296
+ "chatRunTriggerSourceModel": "Source model",
297
+ "chatRunTriggerTargetModel": "Run model",
298
+ "chatRunTriggerSourceContext": "Source context",
299
+ "chatRunTriggerRaw": "Raw metadata",
300
+ "chatRunTriggerActorHuman": "Human",
301
+ "chatRunTriggerActorAgent": "Agent",
302
+ "chatRunTriggerActorAutomation": "Automation",
303
+ "chatRunTriggerActorSystem": "System",
283
304
  "chatToolActivityReadOne": "Read 1 file",
284
305
  "chatToolActivityReadOther": "Read {count} files",
285
306
  "chatToolActivityEditOne": "Edit 1 file",
@@ -280,6 +280,27 @@
280
280
  "chatAiExecutionUsageReported": "已报告",
281
281
  "chatAiExecutionUsagePartial": "部分报告",
282
282
  "chatAiExecutionUsageUnavailable": "不可用",
283
+ "chatRunTriggerView": "查看触发详情",
284
+ "chatRunTriggerTitle": "运行触发信息",
285
+ "chatRunTriggerDescription": "查看本次运行由谁发起,以及消息中保留的来源信息。",
286
+ "chatRunTriggerClose": "关闭触发详情",
287
+ "chatRunTriggerActor": "发起方",
288
+ "chatRunTriggerSource": "触发来源",
289
+ "chatRunTriggerTime": "触发时间",
290
+ "chatRunTriggerTargetRun": "目标运行 ID",
291
+ "chatRunTriggerSourceSession": "来源会话 ID",
292
+ "chatRunTriggerSourceMessage": "来源消息 ID",
293
+ "chatRunTriggerSourceRun": "来源运行 ID",
294
+ "chatRunTriggerSourceToolCall": "来源工具调用 ID",
295
+ "chatRunTriggerSourceRequest": "来源请求 ID",
296
+ "chatRunTriggerSourceModel": "来源模型",
297
+ "chatRunTriggerTargetModel": "本次运行模型",
298
+ "chatRunTriggerSourceContext": "来源上下文",
299
+ "chatRunTriggerRaw": "原始元数据",
300
+ "chatRunTriggerActorHuman": "用户",
301
+ "chatRunTriggerActorAgent": "代理",
302
+ "chatRunTriggerActorAutomation": "自动任务",
303
+ "chatRunTriggerActorSystem": "系统",
283
304
  "chatToolActivityReadOne": "读取 1 个文件",
284
305
  "chatToolActivityReadOther": "读取 {count} 个文件",
285
306
  "chatToolActivityEditOne": "编辑 1 个文件",
@@ -1 +0,0 @@
1
- import{t as e}from"./doc-browser-Cm_tMZ_C.js";export{e as DocBrowser};