@nextclaw/ui 0.11.0 → 0.11.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 (87) hide show
  1. package/CHANGELOG.md +16 -2
  2. package/dist/assets/{ChannelsList-BqsOYnXz.js → ChannelsList-CKl1Zg8f.js} +3 -3
  3. package/dist/assets/ChatPage-BJgO27mk.js +37 -0
  4. package/dist/assets/{DocBrowser-BmL0QXBZ.js → DocBrowser-DYRBs4-z.js} +1 -1
  5. package/dist/assets/{LogoBadge-C1HiPZPf.js → LogoBadge-33Qlv3Hg.js} +1 -1
  6. package/dist/assets/MarketplacePage-B8BZVtjV.js +49 -0
  7. package/dist/assets/{McpMarketplacePage-CLHFnNBd.js → McpMarketplacePage-BRuE5fJJ.js} +2 -2
  8. package/dist/assets/{ModelConfig-LQSR58tc.js → ModelConfig-BiFblwO-.js} +1 -1
  9. package/dist/assets/ProvidersList-9goRgHE4.js +1 -0
  10. package/dist/assets/RemoteAccessPage-5vCxZPS6.js +1 -0
  11. package/dist/assets/RuntimeConfig-BmDFHBdW.js +1 -0
  12. package/dist/assets/{SearchConfig-Chzo_JGs.js → SearchConfig-CJx5CKwG.js} +1 -1
  13. package/dist/assets/{SecretsConfig-CEIbjZYA.js → SecretsConfig-B91efXoK.js} +2 -2
  14. package/dist/assets/SessionsConfig-CbFPVmx3.js +2 -0
  15. package/dist/assets/index-BtAuUyww.css +1 -0
  16. package/dist/assets/index-COJomMe9.js +8 -0
  17. package/dist/assets/{label-GACO2RzW.js → label-BnSDpjhL.js} +1 -1
  18. package/dist/assets/ncp-session-adapter-w8ZHprab.js +1 -0
  19. package/dist/assets/{page-layout-DjXaK3A3.js → page-layout-B1RIu5-r.js} +1 -1
  20. package/dist/assets/popover-ChzbCIfO.js +1 -0
  21. package/dist/assets/security-config-eYa6Ovfa.js +1 -0
  22. package/dist/assets/skeleton-D4Eyop0R.js +1 -0
  23. package/dist/assets/{status-dot-IWEBezqb.js → status-dot-CrCw5tkJ.js} +1 -1
  24. package/dist/assets/{switch-DCHAJSrA.js → switch-C3vVTpfU.js} +1 -1
  25. package/dist/assets/tabs-custom-Ilrgt6n1.js +1 -0
  26. package/dist/assets/useConfirmDialog-BeaFLDO8.js +1 -0
  27. package/dist/assets/{vendor-CNhxtHCf.js → vendor-waGu-koL.js} +101 -86
  28. package/dist/index.html +3 -3
  29. package/package.json +5 -5
  30. package/src/App.test.tsx +42 -10
  31. package/src/App.tsx +5 -40
  32. package/src/api/api-base.test.ts +37 -0
  33. package/src/api/api-base.ts +0 -4
  34. package/src/api/config.ts +2 -270
  35. package/src/api/types.ts +0 -117
  36. package/src/components/chat/ChatPage.tsx +1 -11
  37. package/src/components/chat/ChatSidebar.test.tsx +1 -50
  38. package/src/components/chat/ChatSidebar.tsx +0 -5
  39. package/src/components/chat/README.md +2 -0
  40. package/src/components/chat/adapters/chat-message.adapter.test.ts +71 -4
  41. package/src/components/chat/adapters/chat-message.adapter.ts +195 -78
  42. package/src/components/chat/chat-attachment-upload-limit.test.ts +41 -0
  43. package/src/components/chat/chat-session-display.ts +9 -0
  44. package/src/components/chat/chat-session-label.service.ts +3 -12
  45. package/src/components/chat/chat-session-preference-sync.test.ts +10 -13
  46. package/src/components/chat/chat-stream/types.ts +4 -57
  47. package/src/components/chat/containers/chat-message-list.container.tsx +7 -0
  48. package/src/components/chat/ncp/NcpChatPage.tsx +3 -3
  49. package/src/components/chat/useHydratedNcpAgent.test.tsx +77 -0
  50. package/src/components/config/README.md +2 -0
  51. package/src/components/config/SessionsConfig.tsx +152 -132
  52. package/src/hooks/use-auth.test.ts +3 -3
  53. package/src/hooks/use-auth.ts +16 -4
  54. package/src/hooks/use-realtime-query-bridge.ts +0 -24
  55. package/src/hooks/useConfig.ts +10 -137
  56. package/src/lib/i18n.chat.ts +7 -0
  57. package/src/lib/session-run-status.ts +1 -63
  58. package/src/vite-env.d.ts +1 -0
  59. package/vite.config.ts +4 -4
  60. package/dist/assets/ChatPage-CJBYKR-Y.js +0 -38
  61. package/dist/assets/MarketplacePage-BIRP0NRS.js +0 -49
  62. package/dist/assets/ProvidersList-CwI-mxah.js +0 -1
  63. package/dist/assets/RemoteAccessPage-Cw5BqZb6.js +0 -1
  64. package/dist/assets/RuntimeConfig-DbowSRAb.js +0 -1
  65. package/dist/assets/SessionsConfig-BR8GfGWL.js +0 -2
  66. package/dist/assets/chat-message-CPG7zxRR.js +0 -3
  67. package/dist/assets/index-j6A_-1b6.js +0 -8
  68. package/dist/assets/index-kaPUhd-8.css +0 -1
  69. package/dist/assets/popover-DTaFiTmU.js +0 -1
  70. package/dist/assets/security-config-Dk-yoKvK.js +0 -1
  71. package/dist/assets/skeleton-Dm2xOBSA.js +0 -1
  72. package/dist/assets/tabs-custom-DKSbDSB9.js +0 -1
  73. package/dist/assets/useConfirmDialog-ByJ8A8n7.js +0 -1
  74. package/src/api/config.stream.test.ts +0 -115
  75. package/src/components/chat/chat-chain.test.ts +0 -22
  76. package/src/components/chat/chat-chain.ts +0 -23
  77. package/src/components/chat/chat-page-data.ts +0 -171
  78. package/src/components/chat/chat-page-runtime.ts +0 -190
  79. package/src/components/chat/chat-stream/nextbot-parsers.ts +0 -52
  80. package/src/components/chat/chat-stream/nextbot-runtime-agent.ts +0 -413
  81. package/src/components/chat/chat-stream/stream-event-adapter.ts +0 -98
  82. package/src/components/chat/chat-stream/transport.ts +0 -253
  83. package/src/components/chat/legacy/LegacyChatPage.tsx +0 -223
  84. package/src/components/chat/managers/chat-input.manager.ts +0 -228
  85. package/src/components/chat/managers/chat-thread.manager.ts +0 -87
  86. package/src/components/chat/presenter/chat.presenter.ts +0 -32
  87. package/src/components/chat/useChatRuntimeController.ts +0 -134
@@ -1,87 +0,0 @@
1
- import { deleteSession as deleteSessionApi } from '@/api/config';
2
- import { useChatSessionListStore } from '@/components/chat/stores/chat-session-list.store';
3
- import { useChatThreadStore } from '@/components/chat/stores/chat-thread.store';
4
- import type { ChatSessionListManager } from '@/components/chat/managers/chat-session-list.manager';
5
- import type { ChatUiManager } from '@/components/chat/managers/chat-ui.manager';
6
- import type { ChatThreadSnapshot } from '@/components/chat/stores/chat-thread.store';
7
- import { t } from '@/lib/i18n';
8
- import type { ChatStreamActionsManager } from '@/components/chat/managers/chat-stream-actions.manager';
9
-
10
- export type ChatThreadManagerActions = {
11
- refetchSessions: () => Promise<unknown>;
12
- };
13
-
14
- const noopAsync = async () => {};
15
- export class ChatThreadManager {
16
- private actions: ChatThreadManagerActions = {
17
- refetchSessions: noopAsync
18
- };
19
-
20
- constructor(
21
- private uiManager: ChatUiManager,
22
- private sessionListManager: ChatSessionListManager,
23
- private streamActionsManager: ChatStreamActionsManager
24
- ) {}
25
-
26
- bindActions = (patch: Partial<ChatThreadManagerActions>) => {
27
- this.actions = {
28
- ...this.actions,
29
- ...patch
30
- };
31
- };
32
-
33
- private hasSnapshotChanges = (patch: Partial<ChatThreadSnapshot>): boolean => {
34
- const current = useChatThreadStore.getState().snapshot;
35
- for (const [key, value] of Object.entries(patch) as Array<[keyof ChatThreadSnapshot, ChatThreadSnapshot[keyof ChatThreadSnapshot]]>) {
36
- if (!Object.is(current[key], value)) {
37
- return true;
38
- }
39
- }
40
- return false;
41
- };
42
-
43
- syncSnapshot = (patch: Partial<ChatThreadSnapshot>) => {
44
- if (!this.hasSnapshotChanges(patch)) {
45
- return;
46
- }
47
- useChatThreadStore.getState().setSnapshot(patch);
48
- };
49
-
50
- deleteSession = () => {
51
- void this.deleteCurrentSession();
52
- };
53
-
54
- createSession = () => {
55
- this.sessionListManager.createSession();
56
- };
57
-
58
- goToProviders = () => {
59
- this.uiManager.goToProviders();
60
- };
61
-
62
- private deleteCurrentSession = async () => {
63
- const {
64
- snapshot: { selectedSessionKey }
65
- } = useChatSessionListStore.getState();
66
- if (!selectedSessionKey) {
67
- return;
68
- }
69
- const confirmed = await this.uiManager.confirm({
70
- title: t('chatDeleteSessionConfirm'),
71
- variant: 'destructive',
72
- confirmLabel: t('delete')
73
- });
74
- if (!confirmed) {
75
- return;
76
- }
77
- useChatThreadStore.getState().setSnapshot({ isDeletePending: true });
78
- try {
79
- await deleteSessionApi(selectedSessionKey);
80
- this.streamActionsManager.resetStreamState();
81
- this.uiManager.goToChatRoot({ replace: true });
82
- await this.actions.refetchSessions();
83
- } finally {
84
- useChatThreadStore.getState().setSnapshot({ isDeletePending: false });
85
- }
86
- };
87
- }
@@ -1,32 +0,0 @@
1
- import { ChatInputManager } from '@/components/chat/managers/chat-input.manager';
2
- import { nextbotParsers } from '@/components/chat/chat-stream/nextbot-parsers';
3
- import { ChatRunStatusManager } from '@/components/chat/managers/chat-run-status.manager';
4
- import { ChatSessionListManager } from '@/components/chat/managers/chat-session-list.manager';
5
- import { ChatStreamActionsManager } from '@/components/chat/managers/chat-stream-actions.manager';
6
- import { ChatThreadManager } from '@/components/chat/managers/chat-thread.manager';
7
- import { ChatUiManager } from '@/components/chat/managers/chat-ui.manager';
8
- import { NextbotRuntimeAgent } from '@/components/chat/chat-stream/nextbot-runtime-agent';
9
- import { AgentChatController } from '@nextclaw/agent-chat';
10
-
11
- export class ChatPresenter {
12
- chatUiManager = new ChatUiManager();
13
- runtimeAgent = new NextbotRuntimeAgent();
14
- chatController = new AgentChatController(
15
- {
16
- agent: this.runtimeAgent,
17
- getToolDefs: () => [],
18
- getContexts: () => [],
19
- getToolExecutor: () => undefined
20
- },
21
- { metadataParsers: nextbotParsers }
22
- );
23
- chatStreamActionsManager = new ChatStreamActionsManager();
24
- chatInputManager = new ChatInputManager(this.chatUiManager, this.chatStreamActionsManager);
25
- chatSessionListManager = new ChatSessionListManager(this.chatUiManager, this.chatStreamActionsManager);
26
- chatRunStatusManager = new ChatRunStatusManager();
27
- chatThreadManager = new ChatThreadManager(
28
- this.chatUiManager,
29
- this.chatSessionListManager,
30
- this.chatStreamActionsManager
31
- );
32
- }
@@ -1,134 +0,0 @@
1
- import { useCallback, useEffect, useRef } from 'react';
2
- import { type AgentChatController, getStopDisabledReason } from '@nextclaw/agent-chat';
3
- import type { ChatRunView, SessionMessageView } from '@/api/types';
4
- import type { SendMessageParams, UseChatStreamControllerParams } from '@/components/chat/chat-stream/types';
5
- import { buildResumeMetadata, buildSendMetadata } from '@/components/chat/chat-stream/nextbot-parsers';
6
- import { buildUiMessagesFromHistoryMessages, normalizeRequestedSkills } from '@/lib/chat-runtime-utils';
7
- import { useValueFromBehaviorSubject, useValueFromObservable } from '@/hooks/useObservable';
8
-
9
- export function useChatRuntimeController(
10
- params: UseChatStreamControllerParams,
11
- controller: AgentChatController
12
- ) {
13
- const paramsRef = useRef(params);
14
- useEffect(() => {
15
- paramsRef.current = params;
16
- });
17
-
18
- const activeHistorySessionKeyRef = useRef<string | null>(null);
19
-
20
- // Bind callbacks to controller
21
- useEffect(() => {
22
- controller.setCallbacks({
23
- onRunSettled: async ({ sourceSessionId, resultSessionId }) => {
24
- const bindings = paramsRef.current;
25
- await bindings.refetchSessions();
26
- const activeSessionKey = bindings.selectedSessionKeyRef.current;
27
- if (!activeSessionKey || activeSessionKey === sourceSessionId || (resultSessionId && activeSessionKey === resultSessionId)) {
28
- await bindings.refetchHistory();
29
- }
30
- },
31
- onRunError: ({ sourceMessage, restoreDraft }) => {
32
- if (restoreDraft) {
33
- paramsRef.current.setDraft((prev) => (prev.trim().length === 0 && sourceMessage ? sourceMessage : prev));
34
- }
35
- },
36
- onSessionChanged: (sessionId) => {
37
- paramsRef.current.setSelectedSessionKey((prev) => (prev === sessionId ? prev : sessionId));
38
- }
39
- });
40
- }, [controller]);
41
-
42
- // Reactive state from controller observables
43
- const uiMessages = useValueFromObservable(controller.messages$, controller.getMessages());
44
- const isSending = useValueFromBehaviorSubject(controller.isAgentResponding$);
45
- const isAwaitingAssistantOutput = useValueFromBehaviorSubject(controller.isAwaitingResponse$);
46
- const activeRun = useValueFromBehaviorSubject(controller.activeRun$);
47
- const lastSendError = useValueFromBehaviorSubject(controller.lastError$);
48
-
49
- // Derived state
50
- const activeBackendRunId = activeRun?.remoteRunId ?? null;
51
- const stopDisabledReason = getStopDisabledReason(activeRun);
52
- const canStopCurrentRun = Boolean(
53
- activeRun && (stopDisabledReason === null || (activeRun.remoteStopCapable && !activeBackendRunId))
54
- );
55
-
56
- const sendMessage = useCallback(async (payload: SendMessageParams) => {
57
- const requestedSkills = normalizeRequestedSkills(payload.requestedSkills);
58
- const metadata = buildSendMetadata(payload, requestedSkills);
59
- await controller.send({
60
- message: payload.message,
61
- sessionId: payload.sessionKey,
62
- agentId: payload.agentId,
63
- metadata,
64
- restoreDraftOnError: payload.restoreDraftOnError,
65
- stopCapable: payload.stopSupported,
66
- stopReason: payload.stopReason
67
- });
68
- }, [controller]);
69
-
70
- const resumeRun = useCallback(async (run: ChatRunView) => {
71
- const backendRunId = run.runId?.trim();
72
- const sessionKey = run.sessionKey?.trim();
73
- if (!backendRunId || !sessionKey) {
74
- return;
75
- }
76
- const metadata = buildResumeMetadata(run);
77
- await controller.resume({
78
- remoteRunId: backendRunId,
79
- sessionId: sessionKey,
80
- agentId: run.agentId,
81
- metadata,
82
- stopCapable: run.stopSupported,
83
- stopReason: run.stopReason
84
- });
85
- }, [controller]);
86
-
87
- const stopCurrentRun = useCallback(async () => {
88
- await controller.stop();
89
- }, [controller]);
90
-
91
- const resetStreamState = useCallback(() => {
92
- activeHistorySessionKeyRef.current = null;
93
- controller.reset();
94
- }, [controller]);
95
-
96
- const applyHistoryMessages = useCallback((messages: SessionMessageView[], options?: { isLoading?: boolean }) => {
97
- const isRunActive = Boolean(controller.activeRun$.getValue() || controller.isAgentResponding$.getValue());
98
- if (isRunActive) {
99
- return;
100
- }
101
- const selectedSessionKey = paramsRef.current.selectedSessionKeyRef.current;
102
- if (selectedSessionKey !== activeHistorySessionKeyRef.current) {
103
- activeHistorySessionKeyRef.current = selectedSessionKey;
104
- if (controller.getMessages().length > 0) {
105
- controller.setMessages([]);
106
- }
107
- }
108
- if (!selectedSessionKey) {
109
- if (controller.getMessages().length > 0) {
110
- controller.setMessages([]);
111
- }
112
- return;
113
- }
114
- if (options?.isLoading && messages.length === 0) {
115
- return;
116
- }
117
- controller.setMessages(buildUiMessagesFromHistoryMessages(messages));
118
- }, [controller]);
119
-
120
- return {
121
- uiMessages,
122
- isSending,
123
- isAwaitingAssistantOutput,
124
- canStopCurrentRun,
125
- stopDisabledReason,
126
- lastSendError,
127
- activeBackendRunId,
128
- sendMessage,
129
- stopCurrentRun,
130
- resumeRun,
131
- resetStreamState,
132
- applyHistoryMessages
133
- };
134
- }