@nextclaw/ui 0.10.0 → 0.10.2

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 (75) hide show
  1. package/CHANGELOG.md +24 -1
  2. package/dist/assets/{ChannelsList-VSRZzxx2.js → ChannelsList-DSMuOmMG.js} +4 -4
  3. package/dist/assets/ChatPage-do9TwNxj.js +38 -0
  4. package/dist/assets/{DocBrowser-C65Hbvnb.js → DocBrowser-BjoTblYl.js} +1 -1
  5. package/dist/assets/{LogoBadge-4qtguXEJ.js → LogoBadge-2yDaYdxw.js} +1 -1
  6. package/dist/assets/MarketplacePage-DVVk4dlH.js +49 -0
  7. package/dist/assets/{McpMarketplacePage-CHLkD8yX.js → McpMarketplacePage-B4WUzuLw.js} +1 -1
  8. package/dist/assets/{ModelConfig-CjsGdmZa.js → ModelConfig-Dr0eI9nN.js} +1 -1
  9. package/dist/assets/ProvidersList-C7A-mIbe.js +1 -0
  10. package/dist/assets/{RemoteAccessPage-rOZCnH1x.js → RemoteAccessPage-CI3Am3w1.js} +1 -1
  11. package/dist/assets/{RuntimeConfig-CmJh6g0R.js → RuntimeConfig-DvSNVSs8.js} +1 -1
  12. package/dist/assets/{SearchConfig-C_hUuzR4.js → SearchConfig-B6TGIZow.js} +1 -1
  13. package/dist/assets/{SecretsConfig-Bu_zIRlQ.js → SecretsConfig-CpxaKU1j.js} +1 -1
  14. package/dist/assets/{SessionsConfig-DA_nqkM_.js → SessionsConfig-B-VHnv4G.js} +1 -1
  15. package/dist/assets/{chat-message-BOdA4h43.js → chat-message-BMqngrjp.js} +1 -1
  16. package/dist/assets/index-C6MeoecJ.js +8 -0
  17. package/dist/assets/index-DdXzLuNG.css +1 -0
  18. package/dist/assets/{label-BYZ62ajO.js → label-s2ILtQeP.js} +1 -1
  19. package/dist/assets/{page-layout-UC-h92sU.js → page-layout-BX5Ro4Sj.js} +1 -1
  20. package/dist/assets/{popover-DASCEr3G.js → popover-qmNpQSIy.js} +1 -1
  21. package/dist/assets/{security-config-Cvujq4fH.js → security-config--F-f-nDl.js} +1 -1
  22. package/dist/assets/skeleton-DthPOKSc.js +1 -0
  23. package/dist/assets/{status-dot-C1AvPwDD.js → status-dot-DWj7aUy8.js} +1 -1
  24. package/dist/assets/{switch-D3wVuCSh.js → switch-62r7L4Lj.js} +1 -1
  25. package/dist/assets/tabs-custom-DEmoGMsc.js +1 -0
  26. package/dist/assets/useConfirmDialog-DzT94nC_.js +1 -0
  27. package/dist/assets/{vendor-DJt0Azq5.js → vendor-CNhxtHCf.js} +1 -1
  28. package/dist/index.html +3 -3
  29. package/package.json +5 -5
  30. package/src/App.test.tsx +41 -0
  31. package/src/App.tsx +37 -0
  32. package/src/api/client.test.ts +12 -0
  33. package/src/api/client.ts +4 -2
  34. package/src/api/config.ts +1 -1
  35. package/src/components/chat/ChatSidebar.tsx +41 -69
  36. package/src/components/chat/adapters/chat-input-bar.adapter.test.ts +32 -1
  37. package/src/components/chat/adapters/chat-input-bar.adapter.ts +6 -3
  38. package/src/components/chat/adapters/chat-message.adapter.test.ts +141 -163
  39. package/src/components/chat/adapters/chat-message.adapter.ts +35 -0
  40. package/src/components/chat/chat-composer-state.ts +38 -0
  41. package/src/components/chat/chat-stream/types.ts +2 -0
  42. package/src/components/chat/containers/chat-input-bar.container.tsx +116 -55
  43. package/src/components/chat/containers/chat-message-list.container.tsx +2 -0
  44. package/src/components/chat/managers/chat-session-list.manager.test.ts +16 -1
  45. package/src/components/chat/managers/chat-session-list.manager.ts +0 -2
  46. package/src/components/chat/managers/chat-thread.manager.ts +0 -1
  47. package/src/components/chat/ncp/NcpChatPage.tsx +18 -18
  48. package/src/components/chat/ncp/ncp-app-client-fetch.test.ts +50 -33
  49. package/src/components/chat/ncp/ncp-app-client-fetch.ts +5 -123
  50. package/src/components/chat/ncp/ncp-chat-input.manager.ts +56 -1
  51. package/src/components/chat/ncp/ncp-chat-page-data.test.ts +8 -0
  52. package/src/components/chat/ncp/ncp-chat-thread.manager.ts +0 -1
  53. package/src/components/chat/presenter/chat-presenter-context.tsx +6 -0
  54. package/src/components/chat/stores/chat-input.store.ts +3 -0
  55. package/src/components/config/ChannelsList.test.tsx +2 -1
  56. package/src/components/config/weixin-channel-auth-section.test.tsx +2 -1
  57. package/src/components/layout/Sidebar.tsx +62 -102
  58. package/src/components/layout/sidebar-items.tsx +172 -0
  59. package/src/components/layout/sidebar.layout.test.tsx +11 -4
  60. package/src/hooks/use-auth.ts +1 -2
  61. package/src/lib/i18n.chat.ts +117 -0
  62. package/src/lib/i18n.remote.ts +1 -1
  63. package/src/lib/i18n.ts +2 -112
  64. package/src/transport/local.transport.ts +28 -7
  65. package/src/transport/remote.transport.test.ts +135 -0
  66. package/src/transport/remote.transport.ts +14 -1
  67. package/src/transport/transport.types.ts +1 -0
  68. package/dist/assets/ChatPage-CX0ZKE5i.js +0 -41
  69. package/dist/assets/MarketplacePage-DPCYptfD.js +0 -49
  70. package/dist/assets/ProvidersList-aXp_mo4J.js +0 -1
  71. package/dist/assets/index-C63mHRbE.css +0 -1
  72. package/dist/assets/index-DS7D1-KS.js +0 -8
  73. package/dist/assets/skeleton-DlYEKkkj.js +0 -1
  74. package/dist/assets/tabs-custom-CbgS7tu0.js +0 -1
  75. package/dist/assets/useConfirmDialog-BYbFEIbQ.js +0 -1
@@ -27,6 +27,7 @@ type RemoteBrowserCommand =
27
27
  type PendingRequest = {
28
28
  resolve: (value: unknown) => void;
29
29
  reject: (error: Error) => void;
30
+ timeoutId: number;
30
31
  };
31
32
 
32
33
  type PendingStream = {
@@ -69,6 +70,8 @@ function createId(prefix: string): string {
69
70
  return `${prefix}-${Date.now().toString(36)}-${Math.random().toString(36).slice(2, 10)}`;
70
71
  }
71
72
 
73
+ const REMOTE_REQUEST_TIMEOUT_MS = 15_000;
74
+
72
75
  export class RemoteSessionMultiplexTransport implements AppTransport {
73
76
  private socket: WebSocket | null = null;
74
77
  private connectPromise: Promise<void> | null = null;
@@ -87,10 +90,18 @@ export class RemoteSessionMultiplexTransport implements AppTransport {
87
90
  async request<T>(input: RequestInput): Promise<T> {
88
91
  await this.ensureSocket();
89
92
  const id = createId('req');
93
+ const timeoutMs = Number.isFinite(input.timeoutMs) && (input.timeoutMs ?? 0) > 0
94
+ ? Math.trunc(input.timeoutMs as number)
95
+ : REMOTE_REQUEST_TIMEOUT_MS;
90
96
  return await new Promise<T>((resolve, reject) => {
97
+ const timeoutId = window.setTimeout(() => {
98
+ this.pendingRequests.delete(id);
99
+ reject(new Error(`Timed out waiting for remote request response after ${timeoutMs}ms: ${input.method} ${input.path}`));
100
+ }, timeoutMs);
91
101
  this.pendingRequests.set(id, {
92
102
  resolve: (value) => resolve(value as T),
93
- reject
103
+ reject,
104
+ timeoutId
94
105
  });
95
106
  this.send({
96
107
  type: 'request',
@@ -297,6 +308,7 @@ export class RemoteSessionMultiplexTransport implements AppTransport {
297
308
 
298
309
  private failPendingWork(error: Error): void {
299
310
  for (const pending of this.pendingRequests.values()) {
311
+ window.clearTimeout(pending.timeoutId);
300
312
  pending.reject(error);
301
313
  }
302
314
  this.pendingRequests.clear();
@@ -331,6 +343,7 @@ export class RemoteSessionMultiplexTransport implements AppTransport {
331
343
  return;
332
344
  }
333
345
  this.pendingRequests.delete(frame.id);
346
+ window.clearTimeout(pending.timeoutId);
334
347
  if (frame.type === 'request.error') {
335
348
  pending.reject(new Error(frame.message));
336
349
  return;
@@ -6,6 +6,7 @@ export type RequestInput = {
6
6
  method: RequestMethod;
7
7
  path: string;
8
8
  body?: unknown;
9
+ timeoutMs?: number;
9
10
  };
10
11
 
11
12
  export type StreamEvent = {