@nextclaw/ui 0.11.0 → 0.11.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 (82) hide show
  1. package/CHANGELOG.md +8 -2
  2. package/dist/assets/{ChannelsList-BqsOYnXz.js → ChannelsList-CVPqrxns.js} +4 -4
  3. package/dist/assets/ChatPage-BO1VUrAY.js +37 -0
  4. package/dist/assets/{DocBrowser-BmL0QXBZ.js → DocBrowser-FBwg8iji.js} +1 -1
  5. package/dist/assets/{LogoBadge-C1HiPZPf.js → LogoBadge-BCmJfRT8.js} +1 -1
  6. package/dist/assets/MarketplacePage-DWxXUOCx.js +49 -0
  7. package/dist/assets/{McpMarketplacePage-CLHFnNBd.js → McpMarketplacePage-Bth9X_hu.js} +2 -2
  8. package/dist/assets/{ModelConfig-LQSR58tc.js → ModelConfig-PkSp_ioc.js} +1 -1
  9. package/dist/assets/ProvidersList-DVDge8wa.js +1 -0
  10. package/dist/assets/RemoteAccessPage-BVkzfEaL.js +1 -0
  11. package/dist/assets/RuntimeConfig-ByJs3khh.js +1 -0
  12. package/dist/assets/{SearchConfig-Chzo_JGs.js → SearchConfig-KZUAqYJN.js} +1 -1
  13. package/dist/assets/{SecretsConfig-CEIbjZYA.js → SecretsConfig-qwB_Y_Ka.js} +2 -2
  14. package/dist/assets/SessionsConfig-CGCl4UTr.js +2 -0
  15. package/dist/assets/index-CrilScMo.css +1 -0
  16. package/dist/assets/{index-j6A_-1b6.js → index-D41ntvb7.js} +6 -6
  17. package/dist/assets/{label-GACO2RzW.js → label-7JEFhkur.js} +1 -1
  18. package/dist/assets/ncp-session-adapter-BOqhkrc-.js +1 -0
  19. package/dist/assets/{page-layout-DjXaK3A3.js → page-layout-B7q511TE.js} +1 -1
  20. package/dist/assets/popover-CywJGmPr.js +1 -0
  21. package/dist/assets/security-config-zi2UxN5r.js +1 -0
  22. package/dist/assets/skeleton-qUJZQ03S.js +1 -0
  23. package/dist/assets/{status-dot-IWEBezqb.js → status-dot-BilwNdTT.js} +1 -1
  24. package/dist/assets/{switch-DCHAJSrA.js → switch-BLp2Pno1.js} +1 -1
  25. package/dist/assets/tabs-custom-CgIdQMGC.js +1 -0
  26. package/dist/assets/useConfirmDialog-BitswAkv.js +1 -0
  27. package/dist/assets/{vendor-CNhxtHCf.js → vendor-D_JxmsLV.js} +87 -87
  28. package/dist/index.html +3 -3
  29. package/package.json +4 -4
  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/chat-attachment-upload-limit.test.ts +41 -0
  41. package/src/components/chat/chat-session-display.ts +9 -0
  42. package/src/components/chat/chat-session-label.service.ts +3 -12
  43. package/src/components/chat/chat-session-preference-sync.test.ts +10 -13
  44. package/src/components/chat/chat-stream/types.ts +4 -57
  45. package/src/components/chat/ncp/NcpChatPage.tsx +3 -3
  46. package/src/components/chat/useHydratedNcpAgent.test.tsx +77 -0
  47. package/src/components/config/README.md +2 -0
  48. package/src/components/config/SessionsConfig.tsx +152 -132
  49. package/src/hooks/use-auth.test.ts +3 -3
  50. package/src/hooks/use-auth.ts +16 -4
  51. package/src/hooks/use-realtime-query-bridge.ts +0 -24
  52. package/src/hooks/useConfig.ts +10 -137
  53. package/src/lib/session-run-status.ts +1 -63
  54. package/src/vite-env.d.ts +1 -0
  55. package/vite.config.ts +4 -4
  56. package/dist/assets/ChatPage-CJBYKR-Y.js +0 -38
  57. package/dist/assets/MarketplacePage-BIRP0NRS.js +0 -49
  58. package/dist/assets/ProvidersList-CwI-mxah.js +0 -1
  59. package/dist/assets/RemoteAccessPage-Cw5BqZb6.js +0 -1
  60. package/dist/assets/RuntimeConfig-DbowSRAb.js +0 -1
  61. package/dist/assets/SessionsConfig-BR8GfGWL.js +0 -2
  62. package/dist/assets/chat-message-CPG7zxRR.js +0 -3
  63. package/dist/assets/index-kaPUhd-8.css +0 -1
  64. package/dist/assets/popover-DTaFiTmU.js +0 -1
  65. package/dist/assets/security-config-Dk-yoKvK.js +0 -1
  66. package/dist/assets/skeleton-Dm2xOBSA.js +0 -1
  67. package/dist/assets/tabs-custom-DKSbDSB9.js +0 -1
  68. package/dist/assets/useConfirmDialog-ByJ8A8n7.js +0 -1
  69. package/src/api/config.stream.test.ts +0 -115
  70. package/src/components/chat/chat-chain.test.ts +0 -22
  71. package/src/components/chat/chat-chain.ts +0 -23
  72. package/src/components/chat/chat-page-data.ts +0 -171
  73. package/src/components/chat/chat-page-runtime.ts +0 -190
  74. package/src/components/chat/chat-stream/nextbot-parsers.ts +0 -52
  75. package/src/components/chat/chat-stream/nextbot-runtime-agent.ts +0 -413
  76. package/src/components/chat/chat-stream/stream-event-adapter.ts +0 -98
  77. package/src/components/chat/chat-stream/transport.ts +0 -253
  78. package/src/components/chat/legacy/LegacyChatPage.tsx +0 -223
  79. package/src/components/chat/managers/chat-input.manager.ts +0 -228
  80. package/src/components/chat/managers/chat-thread.manager.ts +0 -87
  81. package/src/components/chat/presenter/chat.presenter.ts +0 -32
  82. 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
- }