@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.
- package/CHANGELOG.md +8 -2
- package/dist/assets/{ChannelsList-BqsOYnXz.js → ChannelsList-CVPqrxns.js} +4 -4
- package/dist/assets/ChatPage-BO1VUrAY.js +37 -0
- package/dist/assets/{DocBrowser-BmL0QXBZ.js → DocBrowser-FBwg8iji.js} +1 -1
- package/dist/assets/{LogoBadge-C1HiPZPf.js → LogoBadge-BCmJfRT8.js} +1 -1
- package/dist/assets/MarketplacePage-DWxXUOCx.js +49 -0
- package/dist/assets/{McpMarketplacePage-CLHFnNBd.js → McpMarketplacePage-Bth9X_hu.js} +2 -2
- package/dist/assets/{ModelConfig-LQSR58tc.js → ModelConfig-PkSp_ioc.js} +1 -1
- package/dist/assets/ProvidersList-DVDge8wa.js +1 -0
- package/dist/assets/RemoteAccessPage-BVkzfEaL.js +1 -0
- package/dist/assets/RuntimeConfig-ByJs3khh.js +1 -0
- package/dist/assets/{SearchConfig-Chzo_JGs.js → SearchConfig-KZUAqYJN.js} +1 -1
- package/dist/assets/{SecretsConfig-CEIbjZYA.js → SecretsConfig-qwB_Y_Ka.js} +2 -2
- package/dist/assets/SessionsConfig-CGCl4UTr.js +2 -0
- package/dist/assets/index-CrilScMo.css +1 -0
- package/dist/assets/{index-j6A_-1b6.js → index-D41ntvb7.js} +6 -6
- package/dist/assets/{label-GACO2RzW.js → label-7JEFhkur.js} +1 -1
- package/dist/assets/ncp-session-adapter-BOqhkrc-.js +1 -0
- package/dist/assets/{page-layout-DjXaK3A3.js → page-layout-B7q511TE.js} +1 -1
- package/dist/assets/popover-CywJGmPr.js +1 -0
- package/dist/assets/security-config-zi2UxN5r.js +1 -0
- package/dist/assets/skeleton-qUJZQ03S.js +1 -0
- package/dist/assets/{status-dot-IWEBezqb.js → status-dot-BilwNdTT.js} +1 -1
- package/dist/assets/{switch-DCHAJSrA.js → switch-BLp2Pno1.js} +1 -1
- package/dist/assets/tabs-custom-CgIdQMGC.js +1 -0
- package/dist/assets/useConfirmDialog-BitswAkv.js +1 -0
- package/dist/assets/{vendor-CNhxtHCf.js → vendor-D_JxmsLV.js} +87 -87
- package/dist/index.html +3 -3
- package/package.json +4 -4
- package/src/App.test.tsx +42 -10
- package/src/App.tsx +5 -40
- package/src/api/api-base.test.ts +37 -0
- package/src/api/api-base.ts +0 -4
- package/src/api/config.ts +2 -270
- package/src/api/types.ts +0 -117
- package/src/components/chat/ChatPage.tsx +1 -11
- package/src/components/chat/ChatSidebar.test.tsx +1 -50
- package/src/components/chat/ChatSidebar.tsx +0 -5
- package/src/components/chat/README.md +2 -0
- package/src/components/chat/chat-attachment-upload-limit.test.ts +41 -0
- package/src/components/chat/chat-session-display.ts +9 -0
- package/src/components/chat/chat-session-label.service.ts +3 -12
- package/src/components/chat/chat-session-preference-sync.test.ts +10 -13
- package/src/components/chat/chat-stream/types.ts +4 -57
- package/src/components/chat/ncp/NcpChatPage.tsx +3 -3
- package/src/components/chat/useHydratedNcpAgent.test.tsx +77 -0
- package/src/components/config/README.md +2 -0
- package/src/components/config/SessionsConfig.tsx +152 -132
- package/src/hooks/use-auth.test.ts +3 -3
- package/src/hooks/use-auth.ts +16 -4
- package/src/hooks/use-realtime-query-bridge.ts +0 -24
- package/src/hooks/useConfig.ts +10 -137
- package/src/lib/session-run-status.ts +1 -63
- package/src/vite-env.d.ts +1 -0
- package/vite.config.ts +4 -4
- package/dist/assets/ChatPage-CJBYKR-Y.js +0 -38
- package/dist/assets/MarketplacePage-BIRP0NRS.js +0 -49
- package/dist/assets/ProvidersList-CwI-mxah.js +0 -1
- package/dist/assets/RemoteAccessPage-Cw5BqZb6.js +0 -1
- package/dist/assets/RuntimeConfig-DbowSRAb.js +0 -1
- package/dist/assets/SessionsConfig-BR8GfGWL.js +0 -2
- package/dist/assets/chat-message-CPG7zxRR.js +0 -3
- package/dist/assets/index-kaPUhd-8.css +0 -1
- package/dist/assets/popover-DTaFiTmU.js +0 -1
- package/dist/assets/security-config-Dk-yoKvK.js +0 -1
- package/dist/assets/skeleton-Dm2xOBSA.js +0 -1
- package/dist/assets/tabs-custom-DKSbDSB9.js +0 -1
- package/dist/assets/useConfirmDialog-ByJ8A8n7.js +0 -1
- package/src/api/config.stream.test.ts +0 -115
- package/src/components/chat/chat-chain.test.ts +0 -22
- package/src/components/chat/chat-chain.ts +0 -23
- package/src/components/chat/chat-page-data.ts +0 -171
- package/src/components/chat/chat-page-runtime.ts +0 -190
- package/src/components/chat/chat-stream/nextbot-parsers.ts +0 -52
- package/src/components/chat/chat-stream/nextbot-runtime-agent.ts +0 -413
- package/src/components/chat/chat-stream/stream-event-adapter.ts +0 -98
- package/src/components/chat/chat-stream/transport.ts +0 -253
- package/src/components/chat/legacy/LegacyChatPage.tsx +0 -223
- package/src/components/chat/managers/chat-input.manager.ts +0 -228
- package/src/components/chat/managers/chat-thread.manager.ts +0 -87
- package/src/components/chat/presenter/chat.presenter.ts +0 -32
- 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
|
-
}
|