@nextclaw/ui 0.15.24 → 0.15.25

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 (94) hide show
  1. package/CHANGELOG.md +21 -0
  2. package/dist/assets/{api-BxPNDp30.js → api-FK7tikI1.js} +3 -3
  3. package/dist/assets/appearance-settings-page-BYbvl2wj.js +1 -0
  4. package/dist/assets/{channels-list-page-DRaNWAxC.js → channels-list-page-CocdcIko.js} +2 -2
  5. package/dist/assets/chat-page-C5E-LLVd.js +1 -0
  6. package/dist/assets/{config-split-page-BVWVDbvG.js → config-split-page-CA_a0AJ5.js} +1 -1
  7. package/dist/assets/{confirm-dialog-mA2iVzxh.js → confirm-dialog-CxZfenjK.js} +1 -1
  8. package/dist/assets/{desktop-update-config-DyQb1LXr.js → desktop-update-config-BEKC8Ly9.js} +1 -1
  9. package/dist/assets/{dist-B4Pf5X3Q.js → dist-BH7W5yCi.js} +1 -1
  10. package/dist/assets/{dist-DHEWkGWX.js → dist-CaYdVVeO.js} +1 -1
  11. package/dist/assets/doc-browser-Cl2ldE3f.js +1 -0
  12. package/dist/assets/doc-browser-DXCSd63E.js +1 -0
  13. package/dist/assets/{doc-browser-context-CuGI6PQc.js → doc-browser-context-FDPs3gJf.js} +1 -1
  14. package/dist/assets/{form-actions-BOfIyG3O.js → form-actions-0c0aw_bl.js} +1 -1
  15. package/dist/assets/i18n-provider-DkITJNz8.js +1 -0
  16. package/dist/assets/index-CQ2LcI2p.css +1 -0
  17. package/dist/assets/index-CrdfvBVg.js +107 -0
  18. package/dist/assets/loader-circle-DHtUxCIA.js +1 -0
  19. package/dist/assets/{mcp-marketplace-page-ofDqbOIF.js → mcp-marketplace-page-Bc_jI5iH.js} +2 -2
  20. package/dist/assets/mcp-marketplace-page-CzCieD9r.js +1 -0
  21. package/dist/assets/{model-config-page-D73Tu3jW.js → model-config-page-C4jw-pcj.js} +1 -1
  22. package/dist/assets/{navigation-link-CAFOcXNg.js → navigation-link-CVy0_kVl.js} +1 -1
  23. package/dist/assets/plus-CG1RwZQq.js +1 -0
  24. package/dist/assets/{provider-scoped-model-input-BaJJJYMX.js → provider-scoped-model-input-CmH4BFvc.js} +1 -1
  25. package/dist/assets/{providers-config-page-BL6IRVBm.js → providers-config-page-CJQjwzaw.js} +1 -1
  26. package/dist/assets/{react-BC_orpAj.js → react-DjFBVA0n.js} +1 -1
  27. package/dist/assets/{refresh-cw-CWDp_JnN.js → refresh-cw-j2bl79Ea.js} +1 -1
  28. package/dist/assets/remote-BIlpD3yL.js +1 -0
  29. package/dist/assets/rotate-cw-bKG8zH8M.js +1 -0
  30. package/dist/assets/runtime-config-page-B_x2Glz5.js +1 -0
  31. package/dist/assets/{save-Cnr71JON.js → save-BKNrtK81.js} +1 -1
  32. package/dist/assets/{search-CCX11X2m.js → search-CkOm65W_.js} +1 -1
  33. package/dist/assets/{search-config-page-BB6d5gT7.js → search-config-page-BaIijtmO.js} +1 -1
  34. package/dist/assets/{secrets-config-page-DYsDeT9K.js → secrets-config-page-CJjtdFAl.js} +2 -2
  35. package/dist/assets/security-config-DB8apj09.js +1 -0
  36. package/dist/assets/{select-DvwBu99K.js → select-Ea7ffKCE.js} +1 -1
  37. package/dist/assets/{settings-2-Dmv6zMne.js → settings-2-CtyN3m_V.js} +1 -1
  38. package/dist/assets/skeleton-Bt6zxcAB.js +1 -0
  39. package/dist/assets/{tag-chip-gMPvx7n_.js → tag-chip-C9l4xsKp.js} +1 -1
  40. package/dist/assets/x-CowtCu9Z.js +1 -0
  41. package/dist/index.html +20 -20
  42. package/package.json +8 -8
  43. package/src/features/chat/features/conversation/components/__tests__/session-conversation-area.test.tsx +30 -1
  44. package/src/features/chat/features/conversation/components/session-conversation-area.tsx +1 -1
  45. package/src/features/chat/features/ncp/hooks/__tests__/use-hydrated-ncp-agent.test.tsx +40 -3
  46. package/src/features/chat/features/workspace/components/__tests__/chat-session-workspace-file-preview.selection.test.tsx +66 -0
  47. package/src/features/chat/features/workspace/components/__tests__/chat-session-workspace-file-preview.test.tsx +13 -1
  48. package/src/features/chat/features/workspace/components/__tests__/chat-session-workspace-panel-content.test.tsx +573 -90
  49. package/src/features/chat/features/workspace/components/chat-session-workspace-directory-browser.tsx +389 -288
  50. package/src/features/chat/features/workspace/components/chat-session-workspace-file-breadcrumbs.tsx +54 -35
  51. package/src/features/chat/features/workspace/components/chat-session-workspace-file-preview.tsx +79 -148
  52. package/src/features/chat/features/workspace/components/chat-session-workspace-panel-content.tsx +149 -94
  53. package/src/features/chat/features/workspace/components/project-files/__tests__/workspace-directory-entry-menu.test.tsx +50 -0
  54. package/src/features/chat/features/workspace/components/project-files/workspace-directory-entry-menu.tsx +209 -0
  55. package/src/features/chat/features/workspace/components/project-files/workspace-directory-tree.tsx +411 -0
  56. package/src/features/chat/features/workspace/components/project-files/workspace-new-folder-tree-item.tsx +112 -0
  57. package/src/features/chat/features/workspace/components/project-files/workspace-project-files-toolbar.tsx +64 -0
  58. package/src/features/chat/features/workspace/hooks/use-workspace-explorer-layout.ts +88 -0
  59. package/src/features/chat/features/workspace/hooks/use-workspace-file-actions.ts +335 -0
  60. package/src/features/chat/features/workspace/utils/chat-workspace-file-path-mutation.utils.ts +58 -0
  61. package/src/features/chat/features/workspace/utils/chat-workspace-file-tab.utils.ts +23 -22
  62. package/src/features/chat/features/workspace/utils/chat-workspace-panel-layout.utils.ts +13 -4
  63. package/src/features/chat/managers/__tests__/chat-composer-intent.manager.test.ts +86 -60
  64. package/src/features/chat/managers/__tests__/chat-thread.manager.test.ts +103 -99
  65. package/src/features/chat/managers/chat-composer-intent.manager.ts +37 -33
  66. package/src/features/chat/managers/chat-thread.manager.ts +132 -128
  67. package/src/features/chat/stores/__tests__/chat-thread.store.test.ts +20 -40
  68. package/src/features/chat/stores/chat-thread.store.ts +47 -74
  69. package/src/shared/components/resizable-right-panel/__tests__/resizable-right-panel.test.tsx +35 -38
  70. package/src/shared/components/resizable-right-panel/resizable-right-panel.tsx +25 -19
  71. package/src/shared/components/ui/context-menu/__tests__/context-menu.test.tsx +60 -34
  72. package/src/shared/components/ui/context-menu/context-menu.tsx +95 -68
  73. package/src/shared/lib/api/managers/client.manager.ts +31 -17
  74. package/src/shared/lib/api/server-path/server-path.types.ts +66 -0
  75. package/src/shared/lib/api/types.ts +145 -116
  76. package/src/shared/lib/api/utils/server-path.utils.ts +35 -11
  77. package/src/shared/lib/i18n/locales/en-US/chat.json +42 -0
  78. package/src/shared/lib/i18n/locales/zh-CN/chat.json +42 -0
  79. package/dist/assets/appearance-settings-page-DpVJjvkB.js +0 -1
  80. package/dist/assets/chat-page-BuFDmG5_.js +0 -1
  81. package/dist/assets/doc-browser-CtO_HtRy.js +0 -1
  82. package/dist/assets/doc-browser-eMUagyBV.js +0 -1
  83. package/dist/assets/index-BjBdWHV1.js +0 -107
  84. package/dist/assets/index-DmpmjAGQ.css +0 -1
  85. package/dist/assets/loader-circle-Df8wF2Pr.js +0 -1
  86. package/dist/assets/mcp-marketplace-page-DI49IKxp.js +0 -1
  87. package/dist/assets/plus-DVU5RLCS.js +0 -1
  88. package/dist/assets/remote-T24O58lH.js +0 -1
  89. package/dist/assets/rotate-cw-BqhwSV5p.js +0 -1
  90. package/dist/assets/runtime-config-page-CXUx017t.js +0 -1
  91. package/dist/assets/security-config-CVPgqL7G.js +0 -1
  92. package/dist/assets/skeleton-C5tWata3.js +0 -1
  93. package/dist/assets/use-confirm-dialog-D_3-QpZU.js +0 -1
  94. package/dist/assets/x-BEWSqeux.js +0 -1
@@ -1,7 +1,24 @@
1
1
  import type { NcpSessionStatus } from '@nextclaw/ncp';
2
2
  import type { RuntimeEntryView, NcpSessionSummaryView } from './ncp-session.types';
3
- export type { ProjectAddExistingRequest, ProjectCreateRequest, ProjectListView, ProjectTemplateView, ProjectView } from '@nextclaw/client-sdk';
4
- export type { SessionEntryView, RuntimeEntryView, SessionTypeIconView, SessionMessageView, SessionEventView, NcpSessionSummaryView, NcpSessionsListView, NcpMessageView, NcpSessionMessagesView, SessionContextWindowView } from './ncp-session.types';
3
+ export type {
4
+ ProjectAddExistingRequest,
5
+ ProjectCreateRequest,
6
+ ProjectListView,
7
+ ProjectTemplateView,
8
+ ProjectView,
9
+ } from '@nextclaw/client-sdk';
10
+ export type {
11
+ SessionEntryView,
12
+ RuntimeEntryView,
13
+ SessionTypeIconView,
14
+ SessionMessageView,
15
+ SessionEventView,
16
+ NcpSessionSummaryView,
17
+ NcpSessionsListView,
18
+ NcpMessageView,
19
+ NcpSessionMessagesView,
20
+ SessionContextWindowView,
21
+ } from './ncp-session.types';
5
22
 
6
23
  // API Types - matching backend response format
7
24
  export type ApiError = {
@@ -10,18 +27,11 @@ export type ApiError = {
10
27
  details?: Record<string, unknown>;
11
28
  };
12
29
 
13
- export type ApiResponse<T> =
14
- | { ok: true; data: T }
15
- | { ok: false; error: ApiError };
30
+ export type ApiResponse<T> = { ok: true; data: T } | { ok: false; error: ApiError };
16
31
 
17
32
  export type AppMetaView = { name: string; productVersion: string };
18
33
 
19
- export type BootstrapPhase =
20
- | 'kernel-starting'
21
- | 'shell-ready'
22
- | 'hydrating-capabilities'
23
- | 'ready'
24
- | 'error';
34
+ export type BootstrapPhase = 'kernel-starting' | 'shell-ready' | 'hydrating-capabilities' | 'ready' | 'error';
25
35
 
26
36
  export type BootstrapStageState = 'pending' | 'running' | 'ready' | 'error';
27
37
 
@@ -56,10 +66,13 @@ export type BootstrapStatusView = {
56
66
  lastError?: string;
57
67
  };
58
68
 
59
- export type ThinkingLevel = "off" | "minimal" | "low" | "medium" | "high" | "adaptive" | "xhigh";
60
- export type AgentModelsView = Record<string, {
61
- params: Record<string, unknown>;
62
- } & Record<string, unknown>>;
69
+ export type ThinkingLevel = 'off' | 'minimal' | 'low' | 'medium' | 'high' | 'adaptive' | 'xhigh';
70
+ export type AgentModelsView = Record<
71
+ string,
72
+ {
73
+ params: Record<string, unknown>;
74
+ } & Record<string, unknown>
75
+ >;
63
76
 
64
77
  export type ProviderInstanceView = {
65
78
  providerId: string;
@@ -73,12 +86,15 @@ export type ProviderInstanceView = {
73
86
  apiKeyMasked?: string;
74
87
  apiBase?: string | null;
75
88
  extraHeaders?: Record<string, string> | null;
76
- wireApi?: "auto" | "chat" | "responses" | null;
89
+ wireApi?: 'auto' | 'chat' | 'responses' | null;
77
90
  models?: string[];
78
- modelConfig?: Record<string, {
79
- thinking?: { supported: ThinkingLevel[]; default?: ThinkingLevel | null };
80
- vision?: boolean;
81
- }>;
91
+ modelConfig?: Record<
92
+ string,
93
+ {
94
+ thinking?: { supported: ThinkingLevel[]; default?: ThinkingLevel | null };
95
+ vision?: boolean;
96
+ }
97
+ >;
82
98
  };
83
99
 
84
100
  export type ProviderConfigView = ProviderInstanceView;
@@ -90,28 +106,34 @@ export type ProviderConfigUpdate = {
90
106
  apiKey?: string | null;
91
107
  apiBase?: string | null;
92
108
  extraHeaders?: Record<string, string> | null;
93
- wireApi?: "auto" | "chat" | "responses" | null;
109
+ wireApi?: 'auto' | 'chat' | 'responses' | null;
94
110
  models?: string[] | null;
95
- modelConfig?: Record<string, {
96
- thinking?: { supported?: ThinkingLevel[]; default?: ThinkingLevel | null };
97
- vision?: boolean;
98
- }> | null;
111
+ modelConfig?: Record<
112
+ string,
113
+ {
114
+ thinking?: {
115
+ supported?: ThinkingLevel[];
116
+ default?: ThinkingLevel | null;
117
+ };
118
+ vision?: boolean;
119
+ }
120
+ > | null;
99
121
  };
100
122
 
101
123
  export type ProviderConnectionTestRequest = ProviderConfigUpdate & {
102
124
  model?: string | null;
103
125
  };
104
126
 
105
- export type ProviderModelDiscoveryRequest = Pick<
106
- ProviderConfigUpdate,
107
- 'apiKey' | 'apiBase' | 'extraHeaders'
108
- >;
127
+ export type ProviderModelDiscoveryRequest = Pick<ProviderConfigUpdate, 'apiKey' | 'apiBase' | 'extraHeaders'>;
109
128
 
110
129
  export type ProviderCreateRequest = ProviderConfigUpdate & {
111
130
  providerId?: string | null;
112
131
  };
113
132
 
114
- export type ProviderCreateResult = { providerId: string; provider: ProviderInstanceView };
133
+ export type ProviderCreateResult = {
134
+ providerId: string;
135
+ provider: ProviderInstanceView;
136
+ };
115
137
  export type ProviderDeleteResult = { deleted: boolean; providerId: string };
116
138
  export type ProvidersView = { providers: Record<string, ProviderInstanceView> };
117
139
 
@@ -152,21 +174,24 @@ export type ProviderModelCatalogView = {
152
174
  refreshing: boolean;
153
175
  lastRefreshStartedAt: string | null;
154
176
  lastRefreshCompletedAt: string | null;
155
- providers: Record<string, {
156
- providerId: string;
157
- models: string[];
158
- source: 'provider' | 'catalog' | null;
159
- fetchedAt: string | null;
160
- lastError: {
161
- message: string;
162
- occurredAt: string;
163
- } | null;
164
- }>;
165
- };
166
-
167
- export type SearchProviderName = "bocha" | "tavily" | "brave" | "exa";
168
- export type BochaFreshnessValue = "noLimit" | "oneDay" | "oneWeek" | "oneMonth" | "oneYear" | string;
169
- export type TavilySearchDepthValue = "basic" | "advanced";
177
+ providers: Record<
178
+ string,
179
+ {
180
+ providerId: string;
181
+ models: string[];
182
+ source: 'provider' | 'catalog' | null;
183
+ fetchedAt: string | null;
184
+ lastError: {
185
+ message: string;
186
+ occurredAt: string;
187
+ } | null;
188
+ }
189
+ >;
190
+ };
191
+
192
+ export type SearchProviderName = 'bocha' | 'tavily' | 'brave' | 'exa';
193
+ export type BochaFreshnessValue = 'noLimit' | 'oneDay' | 'oneWeek' | 'oneMonth' | 'oneYear' | string;
194
+ export type TavilySearchDepthValue = 'basic' | 'advanced';
170
195
 
171
196
  export type SearchProviderConfigView = {
172
197
  enabled: boolean;
@@ -227,7 +252,7 @@ export type SearchConfigUpdate = {
227
252
 
228
253
  export type ProviderAuthStartResult = {
229
254
  provider: string;
230
- kind: "device_code";
255
+ kind: 'device_code';
231
256
  methodId?: string;
232
257
  sessionId: string;
233
258
  verificationUri: string;
@@ -242,21 +267,31 @@ export type ProviderAuthPollRequest = { sessionId: string };
242
267
 
243
268
  export type ProviderAuthPollResult = {
244
269
  provider: string;
245
- status: "pending" | "authorized" | "denied" | "expired" | "error";
270
+ status: 'pending' | 'authorized' | 'denied' | 'expired' | 'error';
246
271
  message?: string;
247
272
  nextPollMs?: number;
248
273
  };
249
274
 
250
- export type ProviderAuthImportResult = { provider: string; status: "imported"; source: "cli"; expiresAt?: string };
275
+ export type ProviderAuthImportResult = {
276
+ provider: string;
277
+ status: 'imported';
278
+ source: 'cli';
279
+ expiresAt?: string;
280
+ };
251
281
 
252
282
  export type {
253
283
  AuthEnabledUpdateRequest,
254
284
  AuthLoginRequest,
255
285
  AuthPasswordUpdateRequest,
256
286
  AuthSetupRequest,
257
- AuthStatusView
287
+ AuthStatusView,
258
288
  } from './auth.types';
259
- export type { ChannelAuthPollRequest, ChannelAuthPollResult, ChannelAuthStartRequest, ChannelAuthStartResult } from './channel-auth.types';
289
+ export type {
290
+ ChannelAuthPollRequest,
291
+ ChannelAuthPollResult,
292
+ ChannelAuthStartRequest,
293
+ ChannelAuthStartResult,
294
+ } from './channel-auth.types';
260
295
 
261
296
  export type {
262
297
  RemoteAccessView,
@@ -269,7 +304,7 @@ export type {
269
304
  RemoteServiceActionResult,
270
305
  RemoteServiceView,
271
306
  RemoteSettingsUpdateRequest,
272
- RemoteSettingsView
307
+ RemoteSettingsView,
273
308
  } from './remote.types';
274
309
  export type {
275
310
  RuntimeActionCapability,
@@ -279,7 +314,7 @@ export type {
279
314
  RuntimeControlView,
280
315
  RuntimeLifecycleState,
281
316
  RuntimeServiceState,
282
- RuntimeControlActionResult
317
+ RuntimeControlActionResult,
283
318
  } from './runtime-control.types';
284
319
 
285
320
  export type AgentProfileView = {
@@ -331,7 +366,7 @@ export type AgentDeleteResult = {
331
366
  };
332
367
 
333
368
  export type BindingPeerView = {
334
- kind: "direct" | "group" | "channel";
369
+ kind: 'direct' | 'group' | 'channel';
335
370
  id: string;
336
371
  };
337
372
 
@@ -345,7 +380,7 @@ export type AgentBindingView = {
345
380
  };
346
381
 
347
382
  export type SessionConfigView = {
348
- dmScope?: "main" | "per-peer" | "per-channel-peer" | "per-account-channel-peer";
383
+ dmScope?: 'main' | 'per-peer' | 'per-channel-peer' | 'per-account-channel-peer';
349
384
  };
350
385
 
351
386
  export type SessionSkillEntryView = {
@@ -391,51 +426,29 @@ export type SessionPatchUpdate = {
391
426
  clearHistory?: boolean;
392
427
  };
393
428
 
394
- export type ServerPathEntryView = { name: string; path: string; kind: "directory" | "file"; hidden: boolean };
395
-
396
- export type ServerPathBreadcrumbView = { label: string; path: string };
397
-
398
- export type ServerPathLocationView = {
399
- kind: "desktop" | "documents" | "downloads" | "icloud-drive" | "applications" | "volumes";
400
- path: string;
401
- };
402
-
403
- export type ServerPathBrowseView = {
404
- currentPath: string;
405
- parentPath: string | null;
406
- homePath: string;
407
- breadcrumbs: ServerPathBreadcrumbView[];
408
- entries: ServerPathEntryView[];
409
- locations: ServerPathLocationView[];
410
- };
411
-
412
- export type ServerPathSearchEntryView = {
413
- name: string;
414
- path: string;
415
- relativePath: string;
416
- parentRelativePath: string;
417
- kind: "directory" | "file";
418
- hidden: boolean;
419
- };
420
-
421
- export type ServerPathSearchView = {
422
- basePath: string;
423
- query: string;
424
- entries: ServerPathSearchEntryView[];
425
- truncated: boolean;
426
- };
427
-
428
- export type ServerPathDirectoryCreateRequest = { parentPath: string; name: string };
429
-
430
- export type ServerPathDirectoryCreateView = { path: string };
431
-
432
- export type ServerPathReadView = { requestedPath: string; resolvedPath: string; kind: "text" | "markdown" | "binary"; sizeBytes: number; startLine?: number; truncated: boolean; text?: string; languageHint?: string | null };
429
+ export type {
430
+ ServerPathBreadcrumbView,
431
+ ServerPathBrowseView,
432
+ ServerPathDirectoryCreateRequest,
433
+ ServerPathDirectoryCreateView,
434
+ ServerPathEntryDeleteView,
435
+ ServerPathEntryRenameRequest,
436
+ ServerPathEntryRenameView,
437
+ ServerPathEntryView,
438
+ ServerPathFileCreateRequest,
439
+ ServerPathFileCreateView,
440
+ ServerPathFilesUploadView,
441
+ ServerPathLocationView,
442
+ ServerPathReadView,
443
+ ServerPathSearchEntryView,
444
+ ServerPathSearchView,
445
+ } from './server-path/server-path.types';
433
446
 
434
447
  export type PanelAppEntryView = {
435
448
  id: string;
436
449
  appId: string;
437
450
  fileName: string;
438
- kind: "single-file" | "folder";
451
+ kind: 'single-file' | 'folder';
439
452
  title: string;
440
453
  description?: string;
441
454
  icon?: string;
@@ -467,12 +480,12 @@ export type {
467
480
  } from './chat-session-type.types';
468
481
 
469
482
  export type CronScheduleView =
470
- | { kind: "at"; atMs?: number | null }
471
- | { kind: "every"; everyMs?: number | null }
472
- | { kind: "cron"; expr?: string | null; tz?: string | null };
483
+ | { kind: 'at'; atMs?: number | null }
484
+ | { kind: 'every'; everyMs?: number | null }
485
+ | { kind: 'cron'; expr?: string | null; tz?: string | null };
473
486
 
474
487
  export type CronPayloadView = {
475
- kind?: "system_event" | "agent_turn";
488
+ kind?: 'system_event' | 'agent_turn';
476
489
  message: string;
477
490
  agentId?: string | null;
478
491
  sessionId?: string | null;
@@ -481,7 +494,7 @@ export type CronPayloadView = {
481
494
  export type CronJobStateView = {
482
495
  nextRunAt?: string | null;
483
496
  lastRunAt?: string | null;
484
- lastStatus?: "ok" | "error" | "skipped" | null;
497
+ lastStatus?: 'ok' | 'error' | 'skipped' | null;
485
498
  lastError?: string | null;
486
499
  };
487
500
 
@@ -497,7 +510,7 @@ export type CronJobView = {
497
510
  deleteAfterRun: boolean;
498
511
  };
499
512
 
500
- export type CronListStatus = "all" | "enabled" | "disabled" | "attention";
513
+ export type CronListStatus = 'all' | 'enabled' | 'disabled' | 'attention';
501
514
 
502
515
  export type CronListQuery = {
503
516
  all?: boolean;
@@ -549,7 +562,7 @@ export type RuntimeConfigUpdate = {
549
562
  session?: SessionConfigView;
550
563
  };
551
564
 
552
- export type SecretSourceView = "env" | "file" | "exec";
565
+ export type SecretSourceView = 'env' | 'file' | 'exec';
553
566
 
554
567
  export type SecretRefView = {
555
568
  source: SecretSourceView;
@@ -558,18 +571,18 @@ export type SecretRefView = {
558
571
  };
559
572
 
560
573
  export type SecretProviderEnvView = {
561
- source: "env";
574
+ source: 'env';
562
575
  prefix?: string;
563
576
  };
564
577
 
565
578
  export type SecretProviderFileView = {
566
- source: "file";
579
+ source: 'file';
567
580
  path: string;
568
- format?: "json";
581
+ format?: 'json';
569
582
  };
570
583
 
571
584
  export type SecretProviderExecView = {
572
- source: "exec";
585
+ source: 'exec';
573
586
  command: string;
574
587
  args?: string[];
575
588
  cwd?: string;
@@ -650,7 +663,7 @@ export type ProviderTemplateView = {
650
663
  id: string;
651
664
  providerType: string;
652
665
  displayName?: string;
653
- apiProtocol?: "openai-compatible" | "anthropic-messages";
666
+ apiProtocol?: 'openai-compatible' | 'anthropic-messages';
654
667
  modelPrefix?: string;
655
668
  keywords: string[];
656
669
  envKey: string;
@@ -664,7 +677,7 @@ export type ProviderTemplateView = {
664
677
  zh?: string;
665
678
  };
666
679
  auth?: {
667
- kind: "device_code";
680
+ kind: 'device_code';
668
681
  displayName?: string;
669
682
  note?: {
670
683
  en?: string;
@@ -686,13 +699,16 @@ export type ProviderTemplateView = {
686
699
  };
687
700
  defaultModels?: string[];
688
701
  supportsModelDiscovery?: boolean;
689
- modelConfig?: Record<string, {
690
- thinking?: { supported: ThinkingLevel[]; default?: ThinkingLevel | null };
691
- vision?: boolean;
692
- }>;
702
+ modelConfig?: Record<
703
+ string,
704
+ {
705
+ thinking?: { supported: ThinkingLevel[]; default?: ThinkingLevel | null };
706
+ vision?: boolean;
707
+ }
708
+ >;
693
709
  supportsWireApi?: boolean;
694
- wireApiOptions?: Array<"auto" | "chat" | "responses">;
695
- defaultWireApi?: "auto" | "chat" | "responses";
710
+ wireApiOptions?: Array<'auto' | 'chat' | 'responses'>;
711
+ defaultWireApi?: 'auto' | 'chat' | 'responses';
696
712
  };
697
713
 
698
714
  export type ProviderTemplatesView = {
@@ -800,10 +816,23 @@ export type ConfigActionExecuteResult = {
800
816
  // WebSocket events
801
817
  export type WsEvent =
802
818
  | { type: 'config.updated'; payload: { path: string } }
803
- | { type: 'channel.config.apply-status'; payload: { channel: string; status: 'started' | 'succeeded' | 'failed'; message?: string } }
819
+ | {
820
+ type: 'channel.config.apply-status';
821
+ payload: {
822
+ channel: string;
823
+ status: 'started' | 'succeeded' | 'failed';
824
+ message?: string;
825
+ };
826
+ }
804
827
  | { type: 'session.updated'; payload: { sessionKey: string } }
805
- | { type: 'session.run-status'; payload: { sessionKey: string; status: 'running' | 'idle' } }
806
- | { type: 'session.summary.upsert'; payload: { summary: NcpSessionSummaryView } }
828
+ | {
829
+ type: 'session.run-status';
830
+ payload: { sessionKey: string; status: 'running' | 'idle' };
831
+ }
832
+ | {
833
+ type: 'session.summary.upsert';
834
+ payload: { summary: NcpSessionSummaryView };
835
+ }
807
836
  | { type: 'session.summary.delete'; payload: { sessionKey: string } }
808
837
  | { type: 'config.reload.started'; payload?: Record<string, unknown> }
809
838
  | { type: 'config.reload.finished'; payload?: Record<string, unknown> }
@@ -4,6 +4,12 @@ import type {
4
4
  ServerPathBrowseView,
5
5
  ServerPathDirectoryCreateRequest,
6
6
  ServerPathDirectoryCreateView,
7
+ ServerPathEntryDeleteView,
8
+ ServerPathEntryRenameRequest,
9
+ ServerPathEntryRenameView,
10
+ ServerPathFileCreateRequest,
11
+ ServerPathFileCreateView,
12
+ ServerPathFilesUploadView,
7
13
  ServerPathReadView,
8
14
  ServerPathSearchView,
9
15
  } from '@/shared/lib/api/types';
@@ -24,6 +30,30 @@ export async function createServerPathDirectory(
24
30
  return await nextclawClient.serverPaths.createDirectory(input);
25
31
  }
26
32
 
33
+ export async function createServerPathFile(input: ServerPathFileCreateRequest): Promise<ServerPathFileCreateView> {
34
+ return await nextclawClient.serverPaths.createFile(input);
35
+ }
36
+
37
+ export async function renameServerPathEntry(input: ServerPathEntryRenameRequest): Promise<ServerPathEntryRenameView> {
38
+ return await nextclawClient.serverPaths.renameEntry(input);
39
+ }
40
+
41
+ export async function deleteServerPathEntry(params: {
42
+ basePath: string;
43
+ path: string;
44
+ }): Promise<ServerPathEntryDeleteView> {
45
+ return await nextclawClient.serverPaths.deleteEntry(params);
46
+ }
47
+
48
+ export async function uploadServerPathFiles(params: {
49
+ basePath: string;
50
+ targetPath: string;
51
+ files: readonly File[];
52
+ overwrite?: boolean;
53
+ }): Promise<ServerPathFilesUploadView> {
54
+ return await nextclawClient.serverPaths.uploadFiles(params);
55
+ }
56
+
27
57
  export async function fetchServerPathRead(params: {
28
58
  path: string;
29
59
  basePath?: string | null;
@@ -41,23 +71,17 @@ export async function fetchServerPathSearch(params: {
41
71
  }
42
72
 
43
73
  export function buildServerPathContentUrl(path: string): string;
44
- export function buildServerPathContentUrl(
45
- path: string,
46
- basePath: string | null,
47
- ): string | null;
48
- export function buildServerPathContentUrl(
49
- path: string,
50
- basePath?: string | null,
51
- ): string | null {
74
+ export function buildServerPathContentUrl(path: string, basePath: string | null): string | null;
75
+ export function buildServerPathContentUrl(path: string, basePath?: string | null): string | null {
52
76
  const normalizedPath = path.trim();
53
- const isAbsolute = normalizedPath.startsWith("/") || /^[a-z]:[\\/]/i.test(normalizedPath);
54
- const normalizedBasePath = basePath?.trim() ?? "";
77
+ const isAbsolute = normalizedPath.startsWith('/') || /^[a-z]:[\\/]/i.test(normalizedPath);
78
+ const normalizedBasePath = basePath?.trim() ?? '';
55
79
  if (!isAbsolute && !normalizedBasePath) {
56
80
  return null;
57
81
  }
58
82
  const query = new URLSearchParams({ path: normalizedPath });
59
83
  if (normalizedBasePath) {
60
- query.set("basePath", normalizedBasePath);
84
+ query.set('basePath', normalizedBasePath);
61
85
  }
62
86
  return `${API_BASE}${SERVER_PATH_CONTENT_BASE_PATH}?${query.toString()}`;
63
87
  }
@@ -53,11 +53,15 @@
53
53
  "chatWorkspaceChildSessionsEmpty": "No child sessions yet.",
54
54
  "chatWorkspaceSessionCronJobsDescription": "Review scheduled tasks associated with this session.",
55
55
  "chatWorkspaceProjectFiles": "Project files",
56
+ "chatWorkspaceShowProjectFiles": "Show project files",
57
+ "chatWorkspaceHideProjectFiles": "Hide project files",
58
+ "chatWorkspaceResizeProjectFiles": "Resize project files",
56
59
  "chatWorkspaceProjectFilesDescription": "Browse files from the selected project directory.",
57
60
  "chatWorkspaceProjectFilesUnavailable": "Select a project directory to browse its files.",
58
61
  "chatWorkspaceSideChatDraftTitle": "Side chat",
59
62
  "chatWorkspaceSideChatDraftSubtitle": "This draft will inherit the parent session context when you send the first message.",
60
63
  "chatWorkspaceChildSessions": "Child sessions",
64
+ "chatWorkspaceOpen": "Open",
61
65
  "chatWorkspaceOpenFiles": "Open files",
62
66
  "chatWorkspacePreview": "Preview",
63
67
  "chatWorkspaceOpenPreview": "Open preview",
@@ -74,7 +78,45 @@
74
78
  "chatWorkspaceDirectoryEmpty": "This directory is empty.",
75
79
  "chatWorkspaceDirectoryLoadFailed": "Failed to load directory",
76
80
  "chatWorkspaceFileContextMenu": "Project file actions",
81
+ "chatWorkspaceRootContextMenu": "Project root actions",
77
82
  "chatWorkspaceAddToChat": "Add to chat",
83
+ "chatWorkspaceMoreActionsFor": "More actions for {name}",
84
+ "chatWorkspaceNewFolder": "New folder",
85
+ "chatWorkspaceNewFile": "New file",
86
+ "chatWorkspaceRefreshExplorer": "Refresh project files",
87
+ "chatWorkspaceCollapseAll": "Collapse all",
88
+ "chatWorkspaceRootMoreActions": "More project file actions",
89
+ "chatWorkspaceFileName": "File name",
90
+ "chatWorkspaceFileNamePlaceholder": "untitled",
91
+ "chatWorkspaceFileCreated": "File created.",
92
+ "chatWorkspaceFileCreateFailed": "Failed to create file",
93
+ "chatWorkspaceCreateFolder": "Create",
94
+ "chatWorkspaceCreateFolderIn": "Create in {name}",
95
+ "chatWorkspaceFolderName": "Folder name",
96
+ "chatWorkspaceFolderNamePlaceholder": "Untitled folder",
97
+ "chatWorkspaceFolderCreated": "Folder created.",
98
+ "chatWorkspaceFolderCreateFailed": "Could not create the folder",
99
+ "chatWorkspaceUploadFiles": "Upload files",
100
+ "chatWorkspaceUploadingFiles": "Uploading…",
101
+ "chatWorkspaceUploadFilesHere": "Upload files here",
102
+ "chatWorkspaceUploadSucceeded": "Uploaded {count} file(s).",
103
+ "chatWorkspaceUploadFailed": "Could not upload the files",
104
+ "chatWorkspaceUploadConflictTitle": "Replace existing files?",
105
+ "chatWorkspaceUploadConflictDescription": "{count} file(s) already exist in this folder. Replacing them cannot be undone.",
106
+ "chatWorkspaceReplaceFiles": "Replace files",
107
+ "chatWorkspaceDownloadFile": "Download",
108
+ "chatWorkspaceDelete": "Delete",
109
+ "chatWorkspaceRename": "Rename",
110
+ "chatWorkspaceRenameSucceeded": "Renamed to {name}.",
111
+ "chatWorkspaceRenameFailed": "Failed to rename",
112
+ "chatWorkspaceRenameName": "New name",
113
+ "chatWorkspaceDeleting": "Deleting {name}…",
114
+ "chatWorkspaceDeleteFileTitle": "Delete {name}?",
115
+ "chatWorkspaceDeleteFolderTitle": "Delete folder {name}?",
116
+ "chatWorkspaceDeleteFileDescription": "This file will be permanently deleted from the project workspace.",
117
+ "chatWorkspaceDeleteFolderDescription": "This folder and everything inside it will be permanently deleted from the project workspace.",
118
+ "chatWorkspaceDeleteSucceeded": "Deleted {name}.",
119
+ "chatWorkspaceDeleteFailed": "Could not delete {name}",
78
120
  "chatWorkspaceExcerptSelectionTooLong": "Selection is too long",
79
121
  "chatWorkspaceRevealInFileManager": "Reveal in file manager",
80
122
  "chatWorkspaceCopyPath": "Copy path",
@@ -53,11 +53,15 @@
53
53
  "chatWorkspaceChildSessionsEmpty": "当前还没有子会话。",
54
54
  "chatWorkspaceSessionCronJobsDescription": "查看与当前会话关联的定时任务。",
55
55
  "chatWorkspaceProjectFiles": "项目文件",
56
+ "chatWorkspaceShowProjectFiles": "展开项目文件",
57
+ "chatWorkspaceHideProjectFiles": "收起项目文件",
58
+ "chatWorkspaceResizeProjectFiles": "调整项目文件宽度",
56
59
  "chatWorkspaceProjectFilesDescription": "浏览已选项目目录中的文件。",
57
60
  "chatWorkspaceProjectFilesUnavailable": "请先选择项目目录,再浏览其中的文件。",
58
61
  "chatWorkspaceSideChatDraftTitle": "侧边对话",
59
62
  "chatWorkspaceSideChatDraftSubtitle": "发送第一条消息后,会继承父会话上下文并创建真实 child 会话。",
60
63
  "chatWorkspaceChildSessions": "子会话",
64
+ "chatWorkspaceOpen": "打开",
61
65
  "chatWorkspaceOpenFiles": "打开的文件",
62
66
  "chatWorkspacePreview": "预览",
63
67
  "chatWorkspaceOpenPreview": "打开预览",
@@ -74,7 +78,45 @@
74
78
  "chatWorkspaceDirectoryEmpty": "这个目录为空。",
75
79
  "chatWorkspaceDirectoryLoadFailed": "读取目录失败",
76
80
  "chatWorkspaceFileContextMenu": "项目文件操作",
81
+ "chatWorkspaceRootContextMenu": "项目根目录操作",
77
82
  "chatWorkspaceAddToChat": "添加到聊天",
83
+ "chatWorkspaceMoreActionsFor": "{name} 的更多操作",
84
+ "chatWorkspaceNewFolder": "新建文件夹",
85
+ "chatWorkspaceNewFile": "新建文件",
86
+ "chatWorkspaceRefreshExplorer": "刷新项目文件",
87
+ "chatWorkspaceCollapseAll": "全部折叠",
88
+ "chatWorkspaceRootMoreActions": "更多项目文件操作",
89
+ "chatWorkspaceFileName": "文件名称",
90
+ "chatWorkspaceFileNamePlaceholder": "未命名文件",
91
+ "chatWorkspaceFileCreated": "文件已创建。",
92
+ "chatWorkspaceFileCreateFailed": "创建文件失败",
93
+ "chatWorkspaceCreateFolder": "创建",
94
+ "chatWorkspaceCreateFolderIn": "在 {name} 中创建",
95
+ "chatWorkspaceFolderName": "文件夹名称",
96
+ "chatWorkspaceFolderNamePlaceholder": "未命名文件夹",
97
+ "chatWorkspaceFolderCreated": "文件夹已创建。",
98
+ "chatWorkspaceFolderCreateFailed": "无法创建文件夹",
99
+ "chatWorkspaceUploadFiles": "上传文件",
100
+ "chatWorkspaceUploadingFiles": "正在上传…",
101
+ "chatWorkspaceUploadFilesHere": "上传文件到此处",
102
+ "chatWorkspaceUploadSucceeded": "已上传 {count} 个文件。",
103
+ "chatWorkspaceUploadFailed": "无法上传文件",
104
+ "chatWorkspaceUploadConflictTitle": "替换已有文件?",
105
+ "chatWorkspaceUploadConflictDescription": "这个文件夹中已有 {count} 个同名文件。替换后无法撤销。",
106
+ "chatWorkspaceReplaceFiles": "替换文件",
107
+ "chatWorkspaceDownloadFile": "下载",
108
+ "chatWorkspaceDelete": "删除",
109
+ "chatWorkspaceRename": "重命名",
110
+ "chatWorkspaceRenameSucceeded": "已重命名为 {name}。",
111
+ "chatWorkspaceRenameFailed": "重命名失败",
112
+ "chatWorkspaceRenameName": "新名称",
113
+ "chatWorkspaceDeleting": "正在删除 {name}…",
114
+ "chatWorkspaceDeleteFileTitle": "删除 {name}?",
115
+ "chatWorkspaceDeleteFolderTitle": "删除文件夹 {name}?",
116
+ "chatWorkspaceDeleteFileDescription": "这个文件将从项目工作区中永久删除。",
117
+ "chatWorkspaceDeleteFolderDescription": "这个文件夹及其中的全部内容将从项目工作区中永久删除。",
118
+ "chatWorkspaceDeleteSucceeded": "已删除 {name}。",
119
+ "chatWorkspaceDeleteFailed": "无法删除 {name}",
78
120
  "chatWorkspaceExcerptSelectionTooLong": "选择内容过长",
79
121
  "chatWorkspaceRevealInFileManager": "在文件管理器中显示",
80
122
  "chatWorkspaceCopyPath": "复制路径",
@@ -1 +0,0 @@
1
- import{i as e}from"./chunk-DseTPa7n.js";import{A as t,F as n,N as r,a as i,i as a}from"./react-BC_orpAj.js";import{Et as o,Gt as s,Ht as c,Ut as l,Wt as u}from"./api-BxPNDp30.js";import{a as d,i as f,n as p,r as m,t as h,w as g}from"./select-DvwBu99K.js";import{r as _}from"./use-confirm-dialog-D_3-QpZU.js";import{f as v,m as y,q as b,r as x}from"./index-BjBdWHV1.js";var S=e(n(),1);function C(){let{language:e,setLanguage:t}=_();return{currentLanguage:e,currentLanguageLabel:i.find(t=>t.value===e)?.label??e,languageOptions:i,selectLanguage:(0,S.useCallback)(n=>{e!==n&&(t(n),window.location.reload())},[e,t])}}var w=r(),T=[{value:`card`,labelKey:`chatMessageLayoutCard`,descriptionKey:`chatMessageLayoutCardDescription`},{value:`flat`,labelKey:`chatMessageLayoutFlat`,descriptionKey:`chatMessageLayoutFlatDescription`}];function E(){let{theme:e,setTheme:n}=v(),{currentLanguage:r,languageOptions:i,selectLanguage:_}=C(),S=b(e=>e.layout),E=b(e=>e.setLayout),D=x(e=>e.isVisible),O=x(e=>e.setVisible);return(0,w.jsx)(s,{title:a(`appearance`),children:(0,w.jsx)(u,{children:(0,w.jsxs)(l,{children:[(0,w.jsx)(c,{title:a(`theme`),control:(0,w.jsxs)(h,{value:e,onValueChange:e=>n(e),children:[(0,w.jsx)(f,{"aria-label":a(`theme`),className:`w-36 sm:w-44`,children:(0,w.jsx)(d,{})}),(0,w.jsx)(p,{children:y.map(e=>(0,w.jsx)(m,{value:e.value,children:a(e.labelKey)},e.value))})]})}),(0,w.jsx)(c,{title:a(`language`),control:(0,w.jsxs)(h,{value:r,onValueChange:e=>_(e),children:[(0,w.jsx)(f,{"aria-label":a(`language`),className:`w-36 sm:w-44`,children:(0,w.jsx)(d,{})}),(0,w.jsx)(p,{children:i.map(e=>(0,w.jsx)(m,{value:e.value,children:e.label},e.value))})]})}),(0,w.jsx)(c,{title:a(`chatMessageLayoutTitle`),description:a(`chatMessageLayoutDescription`),layout:`stacked`,children:(0,w.jsx)(`div`,{role:`radiogroup`,"aria-label":a(`chatMessageLayoutTitle`),className:`grid gap-1 rounded-xl bg-background/65 p-1 sm:grid-cols-2`,children:T.map(e=>{let n=e.value===S;return(0,w.jsxs)(`button`,{type:`button`,role:`radio`,"aria-checked":n,onClick:()=>E(e.value),className:t(`flex min-w-0 items-start gap-3 rounded-lg px-3 py-2.5 text-left transition-colors focus-visible:outline-none focus-visible:ring-2 focus-visible:ring-ring/40`,n?`bg-card text-foreground shadow-sm`:`text-muted-foreground hover:bg-card/60 hover:text-foreground`),children:[(0,w.jsx)(`span`,{className:t(`mt-0.5 flex h-4 w-4 shrink-0 items-center justify-center rounded-full ring-1`,n?`bg-primary text-primary-foreground ring-primary`:`bg-background ring-border`),children:n?(0,w.jsx)(g,{className:`h-2.5 w-2.5`,strokeWidth:3}):null}),(0,w.jsxs)(`span`,{className:`min-w-0`,children:[(0,w.jsx)(`span`,{className:`block text-sm font-medium`,children:a(e.labelKey)}),(0,w.jsx)(`span`,{className:`mt-1 block text-xs leading-5 text-muted-foreground`,children:a(e.descriptionKey)})]})]},e.value)})})}),(0,w.jsx)(c,{title:a(`sideDockVisibilityTitle`),description:a(`sideDockVisibilityDescription`),control:(0,w.jsx)(o,{id:`appearance-side-dock-visible`,"aria-label":a(`sideDockVisibilityTitle`),checked:D,onCheckedChange:O})})]})})})}export{E as AppearanceSettingsPage};