@nextclaw/ui 0.10.5 → 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 (89) hide show
  1. package/CHANGELOG.md +23 -2
  2. package/dist/assets/{ChannelsList-Nu7Ig6_-.js → ChannelsList-CVPqrxns.js} +4 -4
  3. package/dist/assets/ChatPage-BO1VUrAY.js +37 -0
  4. package/dist/assets/{DocBrowser-3CfKmJA6.js → DocBrowser-FBwg8iji.js} +1 -1
  5. package/dist/assets/{LogoBadge-DdthDJOp.js → LogoBadge-BCmJfRT8.js} +1 -1
  6. package/dist/assets/MarketplacePage-DWxXUOCx.js +49 -0
  7. package/dist/assets/{McpMarketplacePage-Dg8GSZh6.js → McpMarketplacePage-Bth9X_hu.js} +2 -2
  8. package/dist/assets/{ModelConfig-DyQ6cC92.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-R1BcCLWO.js → SearchConfig-KZUAqYJN.js} +1 -1
  13. package/dist/assets/{SecretsConfig-D-jZMHeY.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-BulnQWr6.js → index-D41ntvb7.js} +6 -6
  17. package/dist/assets/{label-C7yzBvzK.js → label-7JEFhkur.js} +1 -1
  18. package/dist/assets/ncp-session-adapter-BOqhkrc-.js +1 -0
  19. package/dist/assets/{page-layout-DF0xpax2.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-B9opOZ22.js → status-dot-BilwNdTT.js} +1 -1
  24. package/dist/assets/{switch-l1P0ev4D.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/ncp-attachments.ts +12 -12
  36. package/src/api/types.ts +4 -121
  37. package/src/components/chat/ChatPage.tsx +1 -11
  38. package/src/components/chat/ChatSidebar.test.tsx +1 -50
  39. package/src/components/chat/ChatSidebar.tsx +0 -5
  40. package/src/components/chat/README.md +2 -0
  41. package/src/components/chat/adapters/chat-message.adapter.test.ts +39 -0
  42. package/src/components/chat/adapters/chat-message.adapter.ts +56 -0
  43. package/src/components/chat/chat-attachment-upload-limit.test.ts +41 -0
  44. package/src/components/chat/chat-composer-state.test.ts +4 -4
  45. package/src/components/chat/chat-composer-state.ts +1 -1
  46. package/src/components/chat/chat-session-display.ts +9 -0
  47. package/src/components/chat/chat-session-label.service.ts +3 -12
  48. package/src/components/chat/chat-session-preference-sync.test.ts +10 -13
  49. package/src/components/chat/chat-stream/types.ts +4 -57
  50. package/src/components/chat/containers/chat-input-bar.container.tsx +2 -2
  51. package/src/components/chat/ncp/NcpChatPage.tsx +3 -3
  52. package/src/components/chat/ncp/ncp-chat-input.manager.ts +1 -1
  53. package/src/components/chat/useHydratedNcpAgent.test.tsx +77 -0
  54. package/src/components/config/README.md +2 -0
  55. package/src/components/config/SessionsConfig.tsx +152 -132
  56. package/src/hooks/use-auth.test.ts +3 -3
  57. package/src/hooks/use-auth.ts +16 -4
  58. package/src/hooks/use-realtime-query-bridge.ts +0 -24
  59. package/src/hooks/useConfig.ts +10 -137
  60. package/src/lib/session-run-status.ts +1 -63
  61. package/src/vite-env.d.ts +1 -0
  62. package/vite.config.ts +4 -4
  63. package/dist/assets/ChatPage-CBCFSk4e.js +0 -38
  64. package/dist/assets/MarketplacePage-inGGiv1T.js +0 -49
  65. package/dist/assets/ProvidersList-B2T8Lc_i.js +0 -1
  66. package/dist/assets/RemoteAccessPage-C9LxgK-C.js +0 -1
  67. package/dist/assets/RuntimeConfig-Ey4VIqTW.js +0 -1
  68. package/dist/assets/SessionsConfig-Cawoh4_2.js +0 -2
  69. package/dist/assets/chat-message-BbuIK4dQ.js +0 -3
  70. package/dist/assets/index-kaPUhd-8.css +0 -1
  71. package/dist/assets/popover-DjaScZDJ.js +0 -1
  72. package/dist/assets/security-config-Bg2eriNx.js +0 -1
  73. package/dist/assets/skeleton-DycBJAJF.js +0 -1
  74. package/dist/assets/tabs-custom-BG9y2JhC.js +0 -1
  75. package/dist/assets/useConfirmDialog-DTducNfn.js +0 -1
  76. package/src/api/config.stream.test.ts +0 -115
  77. package/src/components/chat/chat-chain.test.ts +0 -22
  78. package/src/components/chat/chat-chain.ts +0 -23
  79. package/src/components/chat/chat-page-data.ts +0 -171
  80. package/src/components/chat/chat-page-runtime.ts +0 -190
  81. package/src/components/chat/chat-stream/nextbot-parsers.ts +0 -52
  82. package/src/components/chat/chat-stream/nextbot-runtime-agent.ts +0 -413
  83. package/src/components/chat/chat-stream/stream-event-adapter.ts +0 -98
  84. package/src/components/chat/chat-stream/transport.ts +0 -253
  85. package/src/components/chat/legacy/LegacyChatPage.tsx +0 -223
  86. package/src/components/chat/managers/chat-input.manager.ts +0 -228
  87. package/src/components/chat/managers/chat-thread.manager.ts +0 -87
  88. package/src/components/chat/presenter/chat.presenter.ts +0 -32
  89. 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
- }