@nanocollective/nanocoder 1.13.3 → 1.13.4
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/README.md +1 -0
- package/dist/app/hooks/useAppInitialization.d.ts +3 -1
- package/dist/app/hooks/useAppInitialization.d.ts.map +1 -1
- package/dist/app/hooks/useAppInitialization.js +13 -2
- package/dist/app/hooks/useAppInitialization.js.map +1 -1
- package/dist/app/hooks/useAppState.d.ts +3 -2
- package/dist/app/hooks/useAppState.d.ts.map +1 -1
- package/dist/app/hooks/useAppState.js +3 -7
- package/dist/app/hooks/useAppState.js.map +1 -1
- package/dist/app/hooks/useChatHandler.d.ts +1 -3
- package/dist/app/hooks/useChatHandler.d.ts.map +1 -1
- package/dist/app/hooks/useChatHandler.js +10 -318
- package/dist/app/hooks/useChatHandler.js.map +1 -1
- package/dist/app/hooks/useModeHandlers.d.ts +2 -1
- package/dist/app/hooks/useModeHandlers.d.ts.map +1 -1
- package/dist/app/hooks/useModeHandlers.js +5 -2
- package/dist/app/hooks/useModeHandlers.js.map +1 -1
- package/dist/app/utils/appUtils.d.ts.map +1 -1
- package/dist/app/utils/appUtils.js +5 -1
- package/dist/app/utils/appUtils.js.map +1 -1
- package/dist/app.d.ts.map +1 -1
- package/dist/app.js +30 -5
- package/dist/app.js.map +1 -1
- package/dist/commands/index.d.ts +1 -0
- package/dist/commands/index.d.ts.map +1 -1
- package/dist/commands/index.js +1 -0
- package/dist/commands/index.js.map +1 -1
- package/dist/commands/status.d.ts +3 -0
- package/dist/commands/status.d.ts.map +1 -0
- package/dist/commands/status.js +11 -0
- package/dist/commands/status.js.map +1 -0
- package/dist/components/assistant-message.d.ts +1 -0
- package/dist/components/assistant-message.d.ts.map +1 -1
- package/dist/components/assistant-message.js +1 -1
- package/dist/components/assistant-message.js.map +1 -1
- package/dist/components/chat-queue.d.ts.map +1 -1
- package/dist/components/chat-queue.js +43 -19
- package/dist/components/chat-queue.js.map +1 -1
- package/dist/components/status.d.ts +10 -0
- package/dist/components/status.d.ts.map +1 -1
- package/dist/components/status.js +7 -25
- package/dist/components/status.js.map +1 -1
- package/dist/components/theme-selector.d.ts.map +1 -1
- package/dist/components/theme-selector.js +5 -2
- package/dist/components/theme-selector.js.map +1 -1
- package/dist/components/thinking-indicator.d.ts +1 -2
- package/dist/components/thinking-indicator.d.ts.map +1 -1
- package/dist/components/thinking-indicator.js +2 -9
- package/dist/components/thinking-indicator.js.map +1 -1
- package/dist/config/index.d.ts.map +1 -1
- package/dist/config/index.js +12 -1
- package/dist/config/index.js.map +1 -1
- package/dist/langgraph-client.d.ts +0 -1
- package/dist/langgraph-client.d.ts.map +1 -1
- package/dist/langgraph-client.js +8 -28
- package/dist/langgraph-client.js.map +1 -1
- package/dist/tools/delete-lines.d.ts.map +1 -1
- package/dist/tools/delete-lines.js +4 -12
- package/dist/tools/delete-lines.js.map +1 -1
- package/dist/tools/insert-lines.d.ts.map +1 -1
- package/dist/tools/insert-lines.js +4 -12
- package/dist/tools/insert-lines.js.map +1 -1
- package/dist/tools/read-file.js +17 -20
- package/dist/tools/read-file.js.map +1 -1
- package/dist/tools/read-many-files.d.ts.map +1 -1
- package/dist/tools/read-many-files.js +27 -29
- package/dist/tools/read-many-files.js.map +1 -1
- package/dist/tools/replace-lines.d.ts.map +1 -1
- package/dist/tools/replace-lines.js +4 -12
- package/dist/tools/replace-lines.js.map +1 -1
- package/dist/types/app.d.ts +3 -0
- package/dist/types/app.d.ts.map +1 -1
- package/dist/types/components.d.ts +1 -6
- package/dist/types/components.d.ts.map +1 -1
- package/dist/types/hooks.d.ts +0 -2
- package/dist/types/hooks.d.ts.map +1 -1
- package/package.json +2 -2
package/README.md
CHANGED
|
@@ -300,6 +300,7 @@ Nanocoder automatically saves your preferences to remember your choices across s
|
|
|
300
300
|
- `/clear` - Clear chat history
|
|
301
301
|
- `/model` - Switch between available models
|
|
302
302
|
- `/provider` - Switch between configured AI providers
|
|
303
|
+
- `/status` - Display current status (CWD, provider, model, theme, available updates, AGENTS setup)
|
|
303
304
|
- `/recommendations` - Get AI model recommendations based on your system capabilities (RAM, GPU, network)
|
|
304
305
|
- `/mcp` - Show connected MCP servers and their tools
|
|
305
306
|
- `/debug` - Toggle logging levels (silent/normal/verbose)
|
|
@@ -3,6 +3,7 @@ import { LLMClient } from '../../types/core.js';
|
|
|
3
3
|
import { ToolManager } from '../../tools/tool-manager.js';
|
|
4
4
|
import { CustomCommandLoader } from '../../custom-commands/loader.js';
|
|
5
5
|
import { CustomCommandExecutor } from '../../custom-commands/executor.js';
|
|
6
|
+
import type { UpdateInfo } from '../../types/index.js';
|
|
6
7
|
interface UseAppInitializationProps {
|
|
7
8
|
setClient: (client: LLMClient | null) => void;
|
|
8
9
|
setCurrentModel: (model: string) => void;
|
|
@@ -13,11 +14,12 @@ interface UseAppInitializationProps {
|
|
|
13
14
|
setCustomCommandCache: (cache: Map<string, any>) => void;
|
|
14
15
|
setStartChat: (start: boolean) => void;
|
|
15
16
|
setMcpInitialized: (initialized: boolean) => void;
|
|
17
|
+
setUpdateInfo: (info: UpdateInfo | null) => void;
|
|
16
18
|
addToChatQueue: (component: React.ReactNode) => void;
|
|
17
19
|
componentKeyCounter: number;
|
|
18
20
|
customCommandCache: Map<string, any>;
|
|
19
21
|
}
|
|
20
|
-
export declare function useAppInitialization({ setClient, setCurrentModel, setCurrentProvider, setToolManager, setCustomCommandLoader, setCustomCommandExecutor, setCustomCommandCache, setStartChat, setMcpInitialized, addToChatQueue, componentKeyCounter, customCommandCache, }: UseAppInitializationProps): {
|
|
22
|
+
export declare function useAppInitialization({ setClient, setCurrentModel, setCurrentProvider, setToolManager, setCustomCommandLoader, setCustomCommandExecutor, setCustomCommandCache, setStartChat, setMcpInitialized, setUpdateInfo, addToChatQueue, componentKeyCounter, customCommandCache, }: UseAppInitializationProps): {
|
|
21
23
|
initializeClient: (preferredProvider?: string) => Promise<void>;
|
|
22
24
|
loadCustomCommands: (loader: CustomCommandLoader) => Promise<void>;
|
|
23
25
|
initializeMCPServers: (toolManager: ToolManager) => Promise<void>;
|
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"useAppInitialization.d.ts","sourceRoot":"","sources":["../../../source/app/hooks/useAppInitialization.tsx"],"names":[],"mappings":"AAAA,OAAO,KAAkB,MAAM,OAAO,CAAC;AACvC,OAAO,EAAC,SAAS,EAAC,MAAM,qBAAqB,CAAC;AAC9C,OAAO,EAAC,WAAW,EAAC,MAAM,6BAA6B,CAAC;AACxD,OAAO,EAAC,mBAAmB,EAAC,MAAM,iCAAiC,CAAC;AACpE,OAAO,EAAC,qBAAqB,EAAC,MAAM,mCAAmC,CAAC;
|
|
1
|
+
{"version":3,"file":"useAppInitialization.d.ts","sourceRoot":"","sources":["../../../source/app/hooks/useAppInitialization.tsx"],"names":[],"mappings":"AAAA,OAAO,KAAkB,MAAM,OAAO,CAAC;AACvC,OAAO,EAAC,SAAS,EAAC,MAAM,qBAAqB,CAAC;AAC9C,OAAO,EAAC,WAAW,EAAC,MAAM,6BAA6B,CAAC;AACxD,OAAO,EAAC,mBAAmB,EAAC,MAAM,iCAAiC,CAAC;AACpE,OAAO,EAAC,qBAAqB,EAAC,MAAM,mCAAmC,CAAC;AAmCxE,OAAO,KAAK,EAAC,UAAU,EAAC,MAAM,sBAAsB,CAAC;AAErD,UAAU,yBAAyB;IAClC,SAAS,EAAE,CAAC,MAAM,EAAE,SAAS,GAAG,IAAI,KAAK,IAAI,CAAC;IAC9C,eAAe,EAAE,CAAC,KAAK,EAAE,MAAM,KAAK,IAAI,CAAC;IACzC,kBAAkB,EAAE,CAAC,QAAQ,EAAE,MAAM,KAAK,IAAI,CAAC;IAC/C,cAAc,EAAE,CAAC,OAAO,EAAE,WAAW,GAAG,IAAI,KAAK,IAAI,CAAC;IACtD,sBAAsB,EAAE,CAAC,MAAM,EAAE,mBAAmB,GAAG,IAAI,KAAK,IAAI,CAAC;IACrE,wBAAwB,EAAE,CAAC,QAAQ,EAAE,qBAAqB,GAAG,IAAI,KAAK,IAAI,CAAC;IAC3E,qBAAqB,EAAE,CAAC,KAAK,EAAE,GAAG,CAAC,MAAM,EAAE,GAAG,CAAC,KAAK,IAAI,CAAC;IACzD,YAAY,EAAE,CAAC,KAAK,EAAE,OAAO,KAAK,IAAI,CAAC;IACvC,iBAAiB,EAAE,CAAC,WAAW,EAAE,OAAO,KAAK,IAAI,CAAC;IAClD,aAAa,EAAE,CAAC,IAAI,EAAE,UAAU,GAAG,IAAI,KAAK,IAAI,CAAC;IACjD,cAAc,EAAE,CAAC,SAAS,EAAE,KAAK,CAAC,SAAS,KAAK,IAAI,CAAC;IACrD,mBAAmB,EAAE,MAAM,CAAC;IAC5B,kBAAkB,EAAE,GAAG,CAAC,MAAM,EAAE,GAAG,CAAC,CAAC;CACrC;AAED,wBAAgB,oBAAoB,CAAC,EACpC,SAAS,EACT,eAAe,EACf,kBAAkB,EAClB,cAAc,EACd,sBAAsB,EACtB,wBAAwB,EACxB,qBAAqB,EACrB,YAAY,EACZ,iBAAiB,EACjB,aAAa,EACb,cAAc,EACd,mBAAmB,EACnB,kBAAkB,GAClB,EAAE,yBAAyB;2CAEyB,MAAM;iCA4BhB,mBAAmB;wCA4BZ,WAAW;EA+J5D"}
|
|
@@ -9,11 +9,12 @@ import { setToolManagerGetter, setToolRegistryGetter, } from '../../message-hand
|
|
|
9
9
|
import { commandRegistry } from '../../commands.js';
|
|
10
10
|
import { shouldLog } from '../../config/logging.js';
|
|
11
11
|
import { appConfig } from '../../config/index.js';
|
|
12
|
-
import { clearCommand, commandsCommand, debugCommand, exitCommand, exportCommand, helpCommand, initCommand, mcpCommand, modelCommand, providerCommand, recommendationsCommand, themeCommand, updateCommand, } from '../../commands/index.js';
|
|
12
|
+
import { clearCommand, commandsCommand, debugCommand, exitCommand, exportCommand, helpCommand, initCommand, mcpCommand, modelCommand, providerCommand, recommendationsCommand, statusCommand, themeCommand, updateCommand, } from '../../commands/index.js';
|
|
13
13
|
import SuccessMessage from '../../components/success-message.js';
|
|
14
14
|
import ErrorMessage from '../../components/error-message.js';
|
|
15
15
|
import InfoMessage from '../../components/info-message.js';
|
|
16
|
-
|
|
16
|
+
import { checkForUpdates } from '../../utils/update-checker.js';
|
|
17
|
+
export function useAppInitialization({ setClient, setCurrentModel, setCurrentProvider, setToolManager, setCustomCommandLoader, setCustomCommandExecutor, setCustomCommandCache, setStartChat, setMcpInitialized, setUpdateInfo, addToChatQueue, componentKeyCounter, customCommandCache, }) {
|
|
17
18
|
// Initialize LLM client and model
|
|
18
19
|
const initializeClient = async (preferredProvider) => {
|
|
19
20
|
const { client, actualProvider } = await createLLMClient(preferredProvider);
|
|
@@ -134,9 +135,19 @@ export function useAppInitialization({ setClient, setCurrentModel, setCurrentPro
|
|
|
134
135
|
exportCommand,
|
|
135
136
|
updateCommand,
|
|
136
137
|
recommendationsCommand,
|
|
138
|
+
statusCommand,
|
|
137
139
|
]);
|
|
138
140
|
// Now start with the properly initialized objects (excluding MCP)
|
|
139
141
|
await start(newToolManager, newCustomCommandLoader, preferences);
|
|
142
|
+
// Check for updates before showing UI
|
|
143
|
+
try {
|
|
144
|
+
const info = await checkForUpdates();
|
|
145
|
+
setUpdateInfo(info);
|
|
146
|
+
}
|
|
147
|
+
catch (error) {
|
|
148
|
+
// Silent failure - don't show errors for update checks
|
|
149
|
+
setUpdateInfo(null);
|
|
150
|
+
}
|
|
140
151
|
setStartChat(true);
|
|
141
152
|
// Initialize MCP servers after UI is shown
|
|
142
153
|
await initializeMCPServers(newToolManager);
|
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"useAppInitialization.js","sourceRoot":"","sources":["../../../source/app/hooks/useAppInitialization.tsx"],"names":[],"mappings":";AAAA,OAAc,EAAC,SAAS,EAAC,MAAM,OAAO,CAAC;AAEvC,OAAO,EAAC,WAAW,EAAC,MAAM,6BAA6B,CAAC;AACxD,OAAO,EAAC,mBAAmB,EAAC,MAAM,iCAAiC,CAAC;AACpE,OAAO,EAAC,qBAAqB,EAAC,MAAM,mCAAmC,CAAC;AACxE,OAAO,EAAC,eAAe,EAAC,MAAM,yBAAyB,CAAC;AACxD,OAAO,EACN,gBAAgB,EAChB,eAAe,EACf,cAAc,GACd,MAAM,6BAA6B,CAAC;AAErC,OAAO,EACN,oBAAoB,EACpB,qBAAqB,GACrB,MAAM,0BAA0B,CAAC;AAClC,OAAO,EAAC,eAAe,EAAC,MAAM,mBAAmB,CAAC;AAClD,OAAO,EAAC,SAAS,EAAC,MAAM,yBAAyB,CAAC;AAClD,OAAO,EAAC,SAAS,EAAC,MAAM,uBAAuB,CAAC;AAChD,OAAO,EACN,YAAY,EACZ,eAAe,EACf,YAAY,EACZ,WAAW,EACX,aAAa,EACb,WAAW,EACX,WAAW,EACX,UAAU,EACV,YAAY,EACZ,eAAe,EACf,sBAAsB,EACtB,YAAY,EACZ,aAAa,GACb,MAAM,yBAAyB,CAAC;AACjC,OAAO,cAAc,MAAM,qCAAqC,CAAC;AACjE,OAAO,YAAY,MAAM,mCAAmC,CAAC;AAC7D,OAAO,WAAW,MAAM,kCAAkC,CAAC;
|
|
1
|
+
{"version":3,"file":"useAppInitialization.js","sourceRoot":"","sources":["../../../source/app/hooks/useAppInitialization.tsx"],"names":[],"mappings":";AAAA,OAAc,EAAC,SAAS,EAAC,MAAM,OAAO,CAAC;AAEvC,OAAO,EAAC,WAAW,EAAC,MAAM,6BAA6B,CAAC;AACxD,OAAO,EAAC,mBAAmB,EAAC,MAAM,iCAAiC,CAAC;AACpE,OAAO,EAAC,qBAAqB,EAAC,MAAM,mCAAmC,CAAC;AACxE,OAAO,EAAC,eAAe,EAAC,MAAM,yBAAyB,CAAC;AACxD,OAAO,EACN,gBAAgB,EAChB,eAAe,EACf,cAAc,GACd,MAAM,6BAA6B,CAAC;AAErC,OAAO,EACN,oBAAoB,EACpB,qBAAqB,GACrB,MAAM,0BAA0B,CAAC;AAClC,OAAO,EAAC,eAAe,EAAC,MAAM,mBAAmB,CAAC;AAClD,OAAO,EAAC,SAAS,EAAC,MAAM,yBAAyB,CAAC;AAClD,OAAO,EAAC,SAAS,EAAC,MAAM,uBAAuB,CAAC;AAChD,OAAO,EACN,YAAY,EACZ,eAAe,EACf,YAAY,EACZ,WAAW,EACX,aAAa,EACb,WAAW,EACX,WAAW,EACX,UAAU,EACV,YAAY,EACZ,eAAe,EACf,sBAAsB,EACtB,aAAa,EACb,YAAY,EACZ,aAAa,GACb,MAAM,yBAAyB,CAAC;AACjC,OAAO,cAAc,MAAM,qCAAqC,CAAC;AACjE,OAAO,YAAY,MAAM,mCAAmC,CAAC;AAC7D,OAAO,WAAW,MAAM,kCAAkC,CAAC;AAC3D,OAAO,EAAC,eAAe,EAAC,MAAM,+BAA+B,CAAC;AAmB9D,MAAM,UAAU,oBAAoB,CAAC,EACpC,SAAS,EACT,eAAe,EACf,kBAAkB,EAClB,cAAc,EACd,sBAAsB,EACtB,wBAAwB,EACxB,qBAAqB,EACrB,YAAY,EACZ,iBAAiB,EACjB,aAAa,EACb,cAAc,EACd,mBAAmB,EACnB,kBAAkB,GACS;IAC3B,kCAAkC;IAClC,MAAM,gBAAgB,GAAG,KAAK,EAAE,iBAA0B,EAAE,EAAE;QAC7D,MAAM,EAAC,MAAM,EAAE,cAAc,EAAC,GAAG,MAAM,eAAe,CAAC,iBAAiB,CAAC,CAAC;QAC1E,SAAS,CAAC,MAAM,CAAC,CAAC;QAClB,kBAAkB,CAAC,cAAc,CAAC,CAAC;QAEnC,mDAAmD;QACnD,MAAM,aAAa,GAAG,gBAAgB,CAAC,cAAc,CAAC,CAAC;QAEvD,IAAI,UAAkB,CAAC;QACvB,IAAI,aAAa,EAAE,CAAC;YACnB,MAAM,eAAe,GAAG,MAAM,MAAM,CAAC,kBAAkB,EAAE,CAAC;YAC1D,IAAI,eAAe,CAAC,QAAQ,CAAC,aAAa,CAAC,EAAE,CAAC;gBAC7C,MAAM,CAAC,QAAQ,CAAC,aAAa,CAAC,CAAC;gBAC/B,UAAU,GAAG,aAAa,CAAC;YAC5B,CAAC;iBAAM,CAAC;gBACP,UAAU,GAAG,MAAM,CAAC,eAAe,EAAE,CAAC;YACvC,CAAC;QACF,CAAC;aAAM,CAAC;YACP,UAAU,GAAG,MAAM,CAAC,eAAe,EAAE,CAAC;QACvC,CAAC;QAED,eAAe,CAAC,UAAU,CAAC,CAAC;QAE5B,+EAA+E;QAC/E,cAAc,CAAC,cAAc,EAAE,UAAU,CAAC,CAAC;IAC5C,CAAC,CAAC;IAEF,iCAAiC;IACjC,MAAM,kBAAkB,GAAG,KAAK,EAAE,MAA2B,EAAE,EAAE;QAChE,MAAM,MAAM,CAAC,YAAY,EAAE,CAAC;QAC5B,MAAM,cAAc,GAAG,MAAM,CAAC,cAAc,EAAE,IAAI,EAAE,CAAC;QAErD,gDAAgD;QAChD,kBAAkB,CAAC,KAAK,EAAE,CAAC;QAC3B,KAAK,MAAM,OAAO,IAAI,cAAc,EAAE,CAAC;YACtC,kBAAkB,CAAC,GAAG,CAAC,OAAO,CAAC,IAAI,EAAE,OAAO,CAAC,CAAC;YAC9C,sCAAsC;YACtC,IAAI,OAAO,CAAC,QAAQ,EAAE,OAAO,EAAE,CAAC;gBAC/B,KAAK,MAAM,KAAK,IAAI,OAAO,CAAC,QAAQ,CAAC,OAAO,EAAE,CAAC;oBAC9C,kBAAkB,CAAC,GAAG,CAAC,KAAK,EAAE,OAAO,CAAC,CAAC;gBACxC,CAAC;YACF,CAAC;QACF,CAAC;QAED,IAAI,cAAc,CAAC,MAAM,GAAG,CAAC,IAAI,SAAS,CAAC,MAAM,CAAC,EAAE,CAAC;YACpD,cAAc,CACb,KAAC,WAAW,IAEX,OAAO,EAAE,UAAU,cAAc,CAAC,MAAM,2CAA2C,EACnF,OAAO,EAAE,IAAI,IAFR,0BAA0B,mBAAmB,EAAE,CAGnD,CACF,CAAC;QACH,CAAC;IACF,CAAC,CAAC;IAEF,uCAAuC;IACvC,MAAM,oBAAoB,GAAG,KAAK,EAAE,WAAwB,EAAE,EAAE;QAC/D,IAAI,SAAS,CAAC,UAAU,IAAI,SAAS,CAAC,UAAU,CAAC,MAAM,GAAG,CAAC,EAAE,CAAC;YAC7D,uCAAuC;YACvC,cAAc,CACb,KAAC,WAAW,IAEX,OAAO,EAAE,iBAAiB,SAAS,CAAC,UAAU,CAAC,MAAM,cACpD,SAAS,CAAC,UAAU,CAAC,MAAM,GAAG,CAAC,CAAC,CAAC,CAAC,GAAG,CAAC,CAAC,CAAC,EACzC,KAAK,EACL,OAAO,EAAE,IAAI,IAJR,kBAAkB,mBAAmB,EAAE,CAK3C,CACF,CAAC;YAEF,gDAAgD;YAChD,MAAM,UAAU,GAAG,CAAC,MAAqB,EAAE,EAAE;gBAC5C,IAAI,MAAM,CAAC,OAAO,EAAE,CAAC;oBACpB,cAAc,CACb,KAAC,cAAc,IAEd,OAAO,EAAE,4BAA4B,MAAM,CAAC,UAAU,UAAU,MAAM,CAAC,SAAS,QAAQ,EACxF,OAAO,EAAE,IAAI,IAFR,eAAe,MAAM,CAAC,UAAU,IAAI,mBAAmB,EAAE,CAG7D,CACF,CAAC;gBACH,CAAC;qBAAM,CAAC;oBACP,cAAc,CACb,KAAC,YAAY,IAEZ,OAAO,EAAE,oCAAoC,MAAM,CAAC,UAAU,MAAM,MAAM,CAAC,KAAK,EAAE,EAClF,OAAO,EAAE,IAAI,IAFR,aAAa,MAAM,CAAC,UAAU,IAAI,mBAAmB,EAAE,CAG3D,CACF,CAAC;gBACH,CAAC;YACF,CAAC,CAAC;YAEF,IAAI,CAAC;gBACJ,MAAM,WAAW,CAAC,aAAa,CAAC,SAAS,CAAC,UAAU,EAAE,UAAU,CAAC,CAAC;YACnE,CAAC;YAAC,OAAO,KAAK,EAAE,CAAC;gBAChB,cAAc,CACb,KAAC,YAAY,IAEZ,OAAO,EAAE,qCAAqC,KAAK,EAAE,EACrD,OAAO,EAAE,IAAI,IAFR,mBAAmB,mBAAmB,EAAE,CAG5C,CACF,CAAC;YACH,CAAC;YACD,oDAAoD;YACpD,iBAAiB,CAAC,IAAI,CAAC,CAAC;QACzB,CAAC;aAAM,CAAC;YACP,6DAA6D;YAC7D,iBAAiB,CAAC,IAAI,CAAC,CAAC;QACzB,CAAC;IACF,CAAC,CAAC;IAEF,MAAM,KAAK,GAAG,KAAK,EAClB,cAA2B,EAC3B,sBAA2C,EAC3C,WAA4B,EACZ,EAAE;QAClB,IAAI,CAAC;YACJ,MAAM,gBAAgB,CAAC,WAAW,CAAC,YAAY,CAAC,CAAC;QAClD,CAAC;QAAC,OAAO,KAAK,EAAE,CAAC;YAChB,0EAA0E;YAC1E,cAAc,CACb,KAAC,YAAY,IAEZ,OAAO,EAAE,2BAA2B,KAAK,EAAE,EAC3C,OAAO,EAAE,IAAI,IAFR,cAAc,mBAAmB,EAAE,CAGvC,CACF,CAAC;YACF,4DAA4D;QAC7D,CAAC;QAED,IAAI,CAAC;YACJ,MAAM,kBAAkB,CAAC,sBAAsB,CAAC,CAAC;QAClD,CAAC;QAAC,OAAO,KAAK,EAAE,CAAC;YAChB,cAAc,CACb,KAAC,YAAY,IAEZ,OAAO,EAAE,mCAAmC,KAAK,EAAE,EACnD,OAAO,EAAE,IAAI,IAFR,kBAAkB,mBAAmB,EAAE,CAG3C,CACF,CAAC;QACH,CAAC;IACF,CAAC,CAAC;IAEF,SAAS,CAAC,GAAG,EAAE;QACd,MAAM,aAAa,GAAG,KAAK,IAAI,EAAE;YAChC,SAAS,CAAC,IAAI,CAAC,CAAC;YAChB,eAAe,CAAC,EAAE,CAAC,CAAC;YAEpB,MAAM,cAAc,GAAG,IAAI,WAAW,EAAE,CAAC;YACzC,MAAM,sBAAsB,GAAG,IAAI,mBAAmB,EAAE,CAAC;YACzD,MAAM,wBAAwB,GAAG,IAAI,qBAAqB,EAAE,CAAC;YAE7D,cAAc,CAAC,cAAc,CAAC,CAAC;YAC/B,sBAAsB,CAAC,sBAAsB,CAAC,CAAC;YAC/C,wBAAwB,CAAC,wBAAwB,CAAC,CAAC;YAEnD,2EAA2E;YAC3E,MAAM,WAAW,GAAG,eAAe,EAAE,CAAC;YAEtC,6DAA6D;YAC7D,cAAc,CACb,KAAC,cAAc,IAEd,OAAO,EAAC,4BAA4B,EACpC,OAAO,EAAE,IAAI,IAFT,oBAAoB,CAGvB,CACF,CAAC;YAEF,0DAA0D;YAC1D,qBAAqB,CAAC,GAAG,EAAE,CAAC,cAAc,CAAC,eAAe,EAAE,CAAC,CAAC;YAE9D,2DAA2D;YAC3D,oBAAoB,CAAC,GAAG,EAAE,CAAC,cAAc,CAAC,CAAC;YAE3C,eAAe,CAAC,QAAQ,CAAC;gBACxB,WAAW;gBACX,WAAW;gBACX,YAAY;gBACZ,YAAY;gBACZ,eAAe;gBACf,eAAe;gBACf,YAAY;gBACZ,UAAU;gBACV,WAAW;gBACX,YAAY;gBACZ,aAAa;gBACb,aAAa;gBACb,sBAAsB;gBACtB,aAAa;aACb,CAAC,CAAC;YAEH,kEAAkE;YAClE,MAAM,KAAK,CAAC,cAAc,EAAE,sBAAsB,EAAE,WAAW,CAAC,CAAC;YAEjE,sCAAsC;YACtC,IAAI,CAAC;gBACJ,MAAM,IAAI,GAAG,MAAM,eAAe,EAAE,CAAC;gBACrC,aAAa,CAAC,IAAI,CAAC,CAAC;YACrB,CAAC;YAAC,OAAO,KAAK,EAAE,CAAC;gBAChB,uDAAuD;gBACvD,aAAa,CAAC,IAAI,CAAC,CAAC;YACrB,CAAC;YAED,YAAY,CAAC,IAAI,CAAC,CAAC;YAEnB,2CAA2C;YAC3C,MAAM,oBAAoB,CAAC,cAAc,CAAC,CAAC;QAC5C,CAAC,CAAC;QAEF,aAAa,EAAE,CAAC;IACjB,CAAC,EAAE,EAAE,CAAC,CAAC;IAEP,OAAO;QACN,gBAAgB;QAChB,kBAAkB;QAClB,oBAAoB;KACpB,CAAC;AACH,CAAC"}
|
|
@@ -3,6 +3,7 @@ import { ToolManager } from '../../tools/tool-manager.js';
|
|
|
3
3
|
import { CustomCommandLoader } from '../../custom-commands/loader.js';
|
|
4
4
|
import { CustomCommandExecutor } from '../../custom-commands/executor.js';
|
|
5
5
|
import type { ThemePreset } from '../../types/ui.js';
|
|
6
|
+
import type { UpdateInfo } from '../../types/index.js';
|
|
6
7
|
import React from 'react';
|
|
7
8
|
export interface ThinkingStats {
|
|
8
9
|
tokenCount: number;
|
|
@@ -29,9 +30,9 @@ export declare function useAppState(): {
|
|
|
29
30
|
customCommandCache: Map<string, any>;
|
|
30
31
|
startChat: boolean;
|
|
31
32
|
mcpInitialized: boolean;
|
|
33
|
+
updateInfo: UpdateInfo | null;
|
|
32
34
|
isThinking: boolean;
|
|
33
35
|
isCancelling: boolean;
|
|
34
|
-
thinkingStats: ThinkingStats;
|
|
35
36
|
abortController: AbortController | null;
|
|
36
37
|
isModelSelectionMode: boolean;
|
|
37
38
|
isProviderSelectionMode: boolean;
|
|
@@ -61,9 +62,9 @@ export declare function useAppState(): {
|
|
|
61
62
|
setCustomCommandCache: React.Dispatch<React.SetStateAction<Map<string, any>>>;
|
|
62
63
|
setStartChat: React.Dispatch<React.SetStateAction<boolean>>;
|
|
63
64
|
setMcpInitialized: React.Dispatch<React.SetStateAction<boolean>>;
|
|
65
|
+
setUpdateInfo: React.Dispatch<React.SetStateAction<UpdateInfo | null>>;
|
|
64
66
|
setIsThinking: React.Dispatch<React.SetStateAction<boolean>>;
|
|
65
67
|
setIsCancelling: React.Dispatch<React.SetStateAction<boolean>>;
|
|
66
|
-
setThinkingStats: React.Dispatch<React.SetStateAction<ThinkingStats>>;
|
|
67
68
|
setAbortController: React.Dispatch<React.SetStateAction<AbortController | null>>;
|
|
68
69
|
setIsModelSelectionMode: React.Dispatch<React.SetStateAction<boolean>>;
|
|
69
70
|
setIsProviderSelectionMode: React.Dispatch<React.SetStateAction<boolean>>;
|
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"useAppState.d.ts","sourceRoot":"","sources":["../../../source/app/hooks/useAppState.tsx"],"names":[],"mappings":"AACA,OAAO,EAAC,SAAS,EAAE,OAAO,EAAE,eAAe,EAAC,MAAM,qBAAqB,CAAC;AACxE,OAAO,EAAC,WAAW,EAAC,MAAM,6BAA6B,CAAC;AACxD,OAAO,EAAC,mBAAmB,EAAC,MAAM,iCAAiC,CAAC;AACpE,OAAO,EAAC,qBAAqB,EAAC,MAAM,mCAAmC,CAAC;AAGxE,OAAO,KAAK,EAAC,WAAW,EAAC,MAAM,mBAAmB,CAAC;AACnD,OAAO,KAAK,MAAM,OAAO,CAAC;AAE1B,MAAM,WAAW,aAAa;IAC7B,UAAU,EAAE,MAAM,CAAC;IACnB,WAAW,EAAE,MAAM,CAAC;IACpB,eAAe,EAAE,MAAM,CAAC;IACxB,eAAe,CAAC,EAAE,MAAM,CAAC;CACzB;AAED,MAAM,WAAW,mBAAmB;IACnC,eAAe,EAAE,OAAO,EAAE,CAAC;IAC3B,YAAY,EAAE,OAAO,CAAC;IACtB,aAAa,EAAE,OAAO,CAAC;CACvB;AAED,wBAAgB,WAAW;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;
|
|
1
|
+
{"version":3,"file":"useAppState.d.ts","sourceRoot":"","sources":["../../../source/app/hooks/useAppState.tsx"],"names":[],"mappings":"AACA,OAAO,EAAC,SAAS,EAAE,OAAO,EAAE,eAAe,EAAC,MAAM,qBAAqB,CAAC;AACxE,OAAO,EAAC,WAAW,EAAC,MAAM,6BAA6B,CAAC;AACxD,OAAO,EAAC,mBAAmB,EAAC,MAAM,iCAAiC,CAAC;AACpE,OAAO,EAAC,qBAAqB,EAAC,MAAM,mCAAmC,CAAC;AAGxE,OAAO,KAAK,EAAC,WAAW,EAAC,MAAM,mBAAmB,CAAC;AACnD,OAAO,KAAK,EAAC,UAAU,EAAC,MAAM,sBAAsB,CAAC;AACrD,OAAO,KAAK,MAAM,OAAO,CAAC;AAE1B,MAAM,WAAW,aAAa;IAC7B,UAAU,EAAE,MAAM,CAAC;IACnB,WAAW,EAAE,MAAM,CAAC;IACpB,eAAe,EAAE,MAAM,CAAC;IACxB,eAAe,CAAC,EAAE,MAAM,CAAC;CACzB;AAED,MAAM,WAAW,mBAAmB;IACnC,eAAe,EAAE,OAAO,EAAE,CAAC;IAC3B,YAAY,EAAE,OAAO,CAAC;IACtB,aAAa,EAAE,OAAO,CAAC;CACvB;AAED,wBAAgB,WAAW;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;gCAmEb,KAAK,CAAC,SAAS;gCAwBjB,OAAO;kCAe+B,OAAO,EAAE;;EAiG1D"}
|
|
@@ -19,14 +19,10 @@ export function useAppState() {
|
|
|
19
19
|
const [customCommandCache, setCustomCommandCache] = useState(new Map());
|
|
20
20
|
const [startChat, setStartChat] = useState(false);
|
|
21
21
|
const [mcpInitialized, setMcpInitialized] = useState(false);
|
|
22
|
+
const [updateInfo, setUpdateInfo] = useState(null);
|
|
22
23
|
// Thinking indicator state
|
|
23
24
|
const [isThinking, setIsThinking] = useState(false);
|
|
24
25
|
const [isCancelling, setIsCancelling] = useState(false);
|
|
25
|
-
const [thinkingStats, setThinkingStats] = useState({
|
|
26
|
-
tokenCount: 0,
|
|
27
|
-
contextSize: 0,
|
|
28
|
-
totalTokensUsed: 0,
|
|
29
|
-
});
|
|
30
26
|
// Cancellation state
|
|
31
27
|
const [abortController, setAbortController] = useState(null);
|
|
32
28
|
// Mode states
|
|
@@ -109,9 +105,9 @@ export function useAppState() {
|
|
|
109
105
|
customCommandCache,
|
|
110
106
|
startChat,
|
|
111
107
|
mcpInitialized,
|
|
108
|
+
updateInfo,
|
|
112
109
|
isThinking,
|
|
113
110
|
isCancelling,
|
|
114
|
-
thinkingStats,
|
|
115
111
|
abortController,
|
|
116
112
|
isModelSelectionMode,
|
|
117
113
|
isProviderSelectionMode,
|
|
@@ -142,9 +138,9 @@ export function useAppState() {
|
|
|
142
138
|
setCustomCommandCache,
|
|
143
139
|
setStartChat,
|
|
144
140
|
setMcpInitialized,
|
|
141
|
+
setUpdateInfo,
|
|
145
142
|
setIsThinking,
|
|
146
143
|
setIsCancelling,
|
|
147
|
-
setThinkingStats,
|
|
148
144
|
setAbortController,
|
|
149
145
|
setIsModelSelectionMode,
|
|
150
146
|
setIsProviderSelectionMode,
|
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"useAppState.js","sourceRoot":"","sources":["../../../source/app/hooks/useAppState.tsx"],"names":[],"mappings":"AAAA,OAAO,EAAC,QAAQ,EAAE,WAAW,EAAC,MAAM,OAAO,CAAC;AAK5C,OAAO,EAAC,eAAe,EAAC,MAAM,6BAA6B,CAAC;AAC5D,OAAO,EAAC,YAAY,EAAC,MAAM,wBAAwB,CAAC;
|
|
1
|
+
{"version":3,"file":"useAppState.js","sourceRoot":"","sources":["../../../source/app/hooks/useAppState.tsx"],"names":[],"mappings":"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"}
|
|
@@ -1,6 +1,5 @@
|
|
|
1
1
|
import { LLMClient, Message } from '../../types/core.js';
|
|
2
2
|
import { ToolManager } from '../../tools/tool-manager.js';
|
|
3
|
-
import { ThinkingStats } from './useAppState.js';
|
|
4
3
|
import React from 'react';
|
|
5
4
|
interface UseChatHandlerProps {
|
|
6
5
|
client: LLMClient | null;
|
|
@@ -11,7 +10,6 @@ interface UseChatHandlerProps {
|
|
|
11
10
|
currentModel: string;
|
|
12
11
|
setIsThinking: (thinking: boolean) => void;
|
|
13
12
|
setIsCancelling: (cancelling: boolean) => void;
|
|
14
|
-
setThinkingStats: (stats: ThinkingStats | ((prev: ThinkingStats) => ThinkingStats)) => void;
|
|
15
13
|
addToChatQueue: (component: React.ReactNode) => void;
|
|
16
14
|
componentKeyCounter: number;
|
|
17
15
|
abortController: AbortController | null;
|
|
@@ -19,7 +17,7 @@ interface UseChatHandlerProps {
|
|
|
19
17
|
developmentMode?: 'normal' | 'auto-accept' | 'plan';
|
|
20
18
|
onStartToolConfirmationFlow: (toolCalls: any[], updatedMessages: Message[], assistantMsg: Message, systemMessage: Message) => void;
|
|
21
19
|
}
|
|
22
|
-
export declare function useChatHandler({ client, toolManager, messages, setMessages, getMessageTokens, currentModel, setIsThinking, setIsCancelling,
|
|
20
|
+
export declare function useChatHandler({ client, toolManager, messages, setMessages, getMessageTokens, currentModel, setIsThinking, setIsCancelling, addToChatQueue, componentKeyCounter, abortController, setAbortController, developmentMode, onStartToolConfirmationFlow, }: UseChatHandlerProps): {
|
|
23
21
|
handleChatMessage: (message: string) => Promise<void>;
|
|
24
22
|
processAssistantResponse: (systemMessage: Message, messages: Message[]) => Promise<void>;
|
|
25
23
|
};
|
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"useChatHandler.d.ts","sourceRoot":"","sources":["../../../source/app/hooks/useChatHandler.tsx"],"names":[],"mappings":"AAAA,OAAO,EAAC,SAAS,EAAE,OAAO,EAAuB,MAAM,qBAAqB,CAAC;AAC7E,OAAO,EAAC,WAAW,EAAC,MAAM,6BAA6B,CAAC;
|
|
1
|
+
{"version":3,"file":"useChatHandler.d.ts","sourceRoot":"","sources":["../../../source/app/hooks/useChatHandler.tsx"],"names":[],"mappings":"AAAA,OAAO,EAAC,SAAS,EAAE,OAAO,EAAuB,MAAM,qBAAqB,CAAC;AAC7E,OAAO,EAAC,WAAW,EAAC,MAAM,6BAA6B,CAAC;AAaxD,OAAO,KAAK,MAAM,OAAO,CAAC;AAuC1B,UAAU,mBAAmB;IAC5B,MAAM,EAAE,SAAS,GAAG,IAAI,CAAC;IACzB,WAAW,EAAE,WAAW,GAAG,IAAI,CAAC;IAChC,QAAQ,EAAE,OAAO,EAAE,CAAC;IACpB,WAAW,EAAE,CAAC,QAAQ,EAAE,OAAO,EAAE,KAAK,IAAI,CAAC;IAC3C,gBAAgB,CAAC,EAAE,CAAC,OAAO,EAAE,OAAO,KAAK,MAAM,CAAC;IAChD,YAAY,EAAE,MAAM,CAAC;IACrB,aAAa,EAAE,CAAC,QAAQ,EAAE,OAAO,KAAK,IAAI,CAAC;IAC3C,eAAe,EAAE,CAAC,UAAU,EAAE,OAAO,KAAK,IAAI,CAAC;IAE/C,cAAc,EAAE,CAAC,SAAS,EAAE,KAAK,CAAC,SAAS,KAAK,IAAI,CAAC;IACrD,mBAAmB,EAAE,MAAM,CAAC;IAC5B,eAAe,EAAE,eAAe,GAAG,IAAI,CAAC;IACxC,kBAAkB,EAAE,CAAC,UAAU,EAAE,eAAe,GAAG,IAAI,KAAK,IAAI,CAAC;IACjE,eAAe,CAAC,EAAE,QAAQ,GAAG,aAAa,GAAG,MAAM,CAAC;IACpD,2BAA2B,EAAE,CAC5B,SAAS,EAAE,GAAG,EAAE,EAChB,eAAe,EAAE,OAAO,EAAE,EAC1B,YAAY,EAAE,OAAO,EACrB,aAAa,EAAE,OAAO,KAClB,IAAI,CAAC;CACV;AAED,wBAAgB,cAAc,CAAC,EAC9B,MAAM,EACN,WAAW,EACX,QAAQ,EACR,WAAW,EACX,gBAAgB,EAChB,YAAY,EACZ,aAAa,EACb,eAAe,EACf,cAAc,EACd,mBAAmB,EACnB,eAAe,EACf,kBAAkB,EAClB,eAA0B,EAC1B,2BAA2B,GAC3B,EAAE,mBAAmB;iCAudqB,MAAM;8CA/VhC,OAAO,YACZ,OAAO,EAAE;EAgbpB"}
|
|
@@ -36,7 +36,7 @@ const filterValidToolCalls = (toolCalls) => {
|
|
|
36
36
|
return true;
|
|
37
37
|
});
|
|
38
38
|
};
|
|
39
|
-
export function useChatHandler({ client, toolManager, messages, setMessages, getMessageTokens, currentModel, setIsThinking, setIsCancelling,
|
|
39
|
+
export function useChatHandler({ client, toolManager, messages, setMessages, getMessageTokens, currentModel, setIsThinking, setIsCancelling, addToChatQueue, componentKeyCounter, abortController, setAbortController, developmentMode = 'normal', onStartToolConfirmationFlow, }) {
|
|
40
40
|
// Conversation state manager for enhanced context
|
|
41
41
|
const conversationStateManager = React.useRef(new ConversationStateManager());
|
|
42
42
|
// Reset conversation state when messages are cleared
|
|
@@ -82,18 +82,6 @@ export function useChatHandler({ client, toolManager, messages, setMessages, get
|
|
|
82
82
|
}
|
|
83
83
|
}
|
|
84
84
|
};
|
|
85
|
-
// Throttle thinking stats updates to reduce re-renders
|
|
86
|
-
const throttledSetThinkingStats = React.useCallback((() => {
|
|
87
|
-
let lastUpdate = 0;
|
|
88
|
-
const throttleMs = 250; // Update at most 4 times per second
|
|
89
|
-
return (stats) => {
|
|
90
|
-
const now = Date.now();
|
|
91
|
-
if (now - lastUpdate >= throttleMs) {
|
|
92
|
-
lastUpdate = now;
|
|
93
|
-
setThinkingStats(stats);
|
|
94
|
-
}
|
|
95
|
-
};
|
|
96
|
-
})(), [setThinkingStats]);
|
|
97
85
|
// Helper to make async iterator cancellable with frequent abort checking
|
|
98
86
|
const makeCancellableStream = async function* (stream, abortSignal) {
|
|
99
87
|
const iterator = stream[Symbol.asyncIterator]();
|
|
@@ -132,286 +120,6 @@ export function useChatHandler({ client, toolManager, messages, setMessages, get
|
|
|
132
120
|
}
|
|
133
121
|
}
|
|
134
122
|
};
|
|
135
|
-
// Process assistant response with token tracking (for initial user messages)
|
|
136
|
-
const processAssistantResponseWithTokenTracking = async (systemMessage, messages, controller) => {
|
|
137
|
-
if (!client)
|
|
138
|
-
return;
|
|
139
|
-
const stream = client.chatStream([systemMessage, ...messages], toolManager?.getAllTools() || []);
|
|
140
|
-
let toolCalls = null;
|
|
141
|
-
let fullContent = '';
|
|
142
|
-
let tokenCount = 0;
|
|
143
|
-
let hasContent = false;
|
|
144
|
-
// Process streaming response with cancellation support
|
|
145
|
-
const cancellableStream = makeCancellableStream(stream, controller.signal);
|
|
146
|
-
for await (const chunk of cancellableStream) {
|
|
147
|
-
hasContent = true;
|
|
148
|
-
if (chunk.message?.content) {
|
|
149
|
-
fullContent += chunk.message.content;
|
|
150
|
-
tokenCount = Math.ceil(fullContent.length / 4);
|
|
151
|
-
}
|
|
152
|
-
// If server provides eval_count, use it as it's more accurate
|
|
153
|
-
// But ensure we don't reset to a lower count if content tokens are higher
|
|
154
|
-
if (chunk.eval_count) {
|
|
155
|
-
tokenCount = Math.max(tokenCount, chunk.eval_count);
|
|
156
|
-
}
|
|
157
|
-
if (chunk.message?.tool_calls) {
|
|
158
|
-
toolCalls = chunk.message.tool_calls;
|
|
159
|
-
}
|
|
160
|
-
// Update thinking stats in real-time
|
|
161
|
-
if (!chunk.done) {
|
|
162
|
-
const systemTokens = Math.ceil(systemMessage.content.length / 4); // Use actual system prompt length
|
|
163
|
-
const conversationTokens = getMessageTokens
|
|
164
|
-
? messages.reduce((total, msg) => total + getMessageTokens(msg), 0)
|
|
165
|
-
: messages.reduce((total, msg) => total + Math.ceil((msg.content?.length || 0) / 4), 0);
|
|
166
|
-
const totalTokensUsed = systemTokens + conversationTokens + tokenCount;
|
|
167
|
-
throttledSetThinkingStats({
|
|
168
|
-
tokenCount,
|
|
169
|
-
contextSize: client.getContextSize(),
|
|
170
|
-
totalTokensUsed,
|
|
171
|
-
tokensPerSecond: chunk.tokens_per_second,
|
|
172
|
-
});
|
|
173
|
-
}
|
|
174
|
-
}
|
|
175
|
-
if (!hasContent) {
|
|
176
|
-
throw new Error('No response received from model');
|
|
177
|
-
}
|
|
178
|
-
// Parse any tool calls from content for non-tool-calling models
|
|
179
|
-
const parsedToolCalls = parseToolCallsFromContent(fullContent);
|
|
180
|
-
const cleanedContent = cleanContentFromToolCalls(fullContent, parsedToolCalls);
|
|
181
|
-
// Display the assistant response (cleaned of any tool calls)
|
|
182
|
-
if (cleanedContent.trim()) {
|
|
183
|
-
addToChatQueue(_jsx(AssistantMessage, { message: cleanedContent, model: currentModel }, `assistant-${componentKeyCounter}`));
|
|
184
|
-
}
|
|
185
|
-
// Merge structured tool calls from LangGraph with content-parsed tool calls
|
|
186
|
-
const allToolCalls = [...(toolCalls || []), ...parsedToolCalls];
|
|
187
|
-
const validToolCalls = filterValidToolCalls(allToolCalls);
|
|
188
|
-
// Add assistant message to conversation history
|
|
189
|
-
const assistantMsg = {
|
|
190
|
-
role: 'assistant',
|
|
191
|
-
content: cleanedContent,
|
|
192
|
-
tool_calls: validToolCalls.length > 0 ? validToolCalls : undefined,
|
|
193
|
-
};
|
|
194
|
-
setMessages([...messages, assistantMsg]);
|
|
195
|
-
// Update conversation state with assistant message
|
|
196
|
-
conversationStateManager.current.updateAssistantMessage(assistantMsg);
|
|
197
|
-
// Handle tool calls if present - this continues the loop
|
|
198
|
-
if (validToolCalls && validToolCalls.length > 0) {
|
|
199
|
-
// First, validate tools and separate valid from unknown
|
|
200
|
-
const knownToolCalls = [];
|
|
201
|
-
const unknownToolErrors = [];
|
|
202
|
-
for (const toolCall of validToolCalls) {
|
|
203
|
-
if (!toolManager?.hasTool(toolCall.function.name)) {
|
|
204
|
-
// Get list of available tools for helpful error message
|
|
205
|
-
const availableTools = toolManager?.getAllTools().map(t => t.function.name) || [];
|
|
206
|
-
const toolList = availableTools.slice(0, 5).join(', ');
|
|
207
|
-
const moreTools = availableTools.length > 5
|
|
208
|
-
? ` (and ${availableTools.length - 5} more)`
|
|
209
|
-
: '';
|
|
210
|
-
// Create error result for unknown tool
|
|
211
|
-
const errorResult = {
|
|
212
|
-
tool_call_id: toolCall.id,
|
|
213
|
-
role: 'tool',
|
|
214
|
-
name: toolCall.function.name,
|
|
215
|
-
content: `⚒ Unknown tool: "${toolCall.function.name}". Available tools: ${toolList}${moreTools}`,
|
|
216
|
-
};
|
|
217
|
-
unknownToolErrors.push(errorResult);
|
|
218
|
-
// Display the error to user
|
|
219
|
-
addToChatQueue(_jsx(ErrorMessage, { message: `⚒ Unknown tool: "${toolCall.function.name}"`, hideBox: true }, `unknown-tool-${toolCall.id}-${Date.now()}`));
|
|
220
|
-
}
|
|
221
|
-
else {
|
|
222
|
-
// Tool exists, add to valid list
|
|
223
|
-
knownToolCalls.push(toolCall);
|
|
224
|
-
}
|
|
225
|
-
}
|
|
226
|
-
// If there were unknown tools, continue conversation with all errors
|
|
227
|
-
if (unknownToolErrors.length > 0) {
|
|
228
|
-
const toolMessages = unknownToolErrors.map(result => ({
|
|
229
|
-
role: 'tool',
|
|
230
|
-
content: result.content || '',
|
|
231
|
-
tool_call_id: result.tool_call_id,
|
|
232
|
-
name: result.name,
|
|
233
|
-
}));
|
|
234
|
-
const updatedMessagesWithError = [
|
|
235
|
-
...messages,
|
|
236
|
-
assistantMsg,
|
|
237
|
-
...toolMessages,
|
|
238
|
-
];
|
|
239
|
-
setMessages(updatedMessagesWithError);
|
|
240
|
-
// Continue the main conversation loop with error messages as context
|
|
241
|
-
await processAssistantResponse(systemMessage, updatedMessagesWithError);
|
|
242
|
-
return;
|
|
243
|
-
}
|
|
244
|
-
// If we get here, all tools are valid - proceed with normal flow
|
|
245
|
-
// Use knownToolCalls for the rest of the processing
|
|
246
|
-
// In Plan Mode, block file modification tools
|
|
247
|
-
if (developmentMode === 'plan') {
|
|
248
|
-
const fileModificationTools = ['create_file', 'delete_lines', 'insert_lines', 'replace_lines'];
|
|
249
|
-
const blockedTools = knownToolCalls.filter(tc => fileModificationTools.includes(tc.function.name));
|
|
250
|
-
if (blockedTools.length > 0) {
|
|
251
|
-
// Create error results for blocked tools
|
|
252
|
-
const blockedToolErrors = blockedTools.map(toolCall => ({
|
|
253
|
-
tool_call_id: toolCall.id,
|
|
254
|
-
role: 'tool',
|
|
255
|
-
name: toolCall.function.name,
|
|
256
|
-
content: `⚠ Tool "${toolCall.function.name}" is not allowed in Plan Mode. File modification tools are restricted in this mode. Switch to Normal Mode or Auto-accept Mode to execute file modifications.`,
|
|
257
|
-
}));
|
|
258
|
-
// Display error messages
|
|
259
|
-
for (const error of blockedToolErrors) {
|
|
260
|
-
addToChatQueue(_jsx(ErrorMessage, { message: error.content, hideBox: true }, `plan-mode-blocked-${error.tool_call_id}-${Date.now()}`));
|
|
261
|
-
}
|
|
262
|
-
// Continue conversation with error messages
|
|
263
|
-
const toolMessages = blockedToolErrors.map(result => ({
|
|
264
|
-
role: 'tool',
|
|
265
|
-
content: result.content || '',
|
|
266
|
-
tool_call_id: result.tool_call_id,
|
|
267
|
-
name: result.name,
|
|
268
|
-
}));
|
|
269
|
-
const updatedMessagesWithError = [
|
|
270
|
-
...messages,
|
|
271
|
-
assistantMsg,
|
|
272
|
-
...toolMessages,
|
|
273
|
-
];
|
|
274
|
-
setMessages(updatedMessagesWithError);
|
|
275
|
-
// Continue the main conversation loop with error messages as context
|
|
276
|
-
await processAssistantResponse(systemMessage, updatedMessagesWithError);
|
|
277
|
-
return;
|
|
278
|
-
}
|
|
279
|
-
}
|
|
280
|
-
// Separate tools that need confirmation vs those that don't
|
|
281
|
-
// BUT: if a tool fails validation, execute directly (skip confirmation)
|
|
282
|
-
const toolsNeedingConfirmation = [];
|
|
283
|
-
const toolsToExecuteDirectly = [];
|
|
284
|
-
for (const toolCall of knownToolCalls) {
|
|
285
|
-
const toolDef = toolDefinitions.find(def => def.config.function.name === toolCall.function.name);
|
|
286
|
-
// Check if tool has a validator
|
|
287
|
-
let validationFailed = false;
|
|
288
|
-
if (toolManager) {
|
|
289
|
-
const validator = toolManager.getToolValidator(toolCall.function.name);
|
|
290
|
-
if (validator) {
|
|
291
|
-
try {
|
|
292
|
-
// Parse arguments if they're a JSON string
|
|
293
|
-
let parsedArgs = toolCall.function.arguments;
|
|
294
|
-
if (typeof parsedArgs === 'string') {
|
|
295
|
-
try {
|
|
296
|
-
parsedArgs = JSON.parse(parsedArgs);
|
|
297
|
-
}
|
|
298
|
-
catch (e) {
|
|
299
|
-
// If parsing fails, use as-is
|
|
300
|
-
}
|
|
301
|
-
}
|
|
302
|
-
const validationResult = await validator(parsedArgs);
|
|
303
|
-
if (!validationResult.valid) {
|
|
304
|
-
validationFailed = true;
|
|
305
|
-
}
|
|
306
|
-
}
|
|
307
|
-
catch (error) {
|
|
308
|
-
// Validation threw an error - treat as validation failure
|
|
309
|
-
validationFailed = true;
|
|
310
|
-
}
|
|
311
|
-
}
|
|
312
|
-
}
|
|
313
|
-
// If validation failed OR tool doesn't require confirmation OR in auto-accept mode, execute directly
|
|
314
|
-
// EXCEPT: execute_bash always requires confirmation for security
|
|
315
|
-
const isBashTool = toolCall.function.name === 'execute_bash';
|
|
316
|
-
if (validationFailed ||
|
|
317
|
-
(toolDef && toolDef.requiresConfirmation === false) ||
|
|
318
|
-
(developmentMode === 'auto-accept' && !isBashTool)) {
|
|
319
|
-
toolsToExecuteDirectly.push(toolCall);
|
|
320
|
-
}
|
|
321
|
-
else {
|
|
322
|
-
toolsNeedingConfirmation.push(toolCall);
|
|
323
|
-
}
|
|
324
|
-
}
|
|
325
|
-
// Execute non-confirmation tools directly
|
|
326
|
-
if (toolsToExecuteDirectly.length > 0) {
|
|
327
|
-
// Import processToolUse here to avoid circular dependencies
|
|
328
|
-
const { processToolUse } = await import('../../message-handler.js');
|
|
329
|
-
const directResults = [];
|
|
330
|
-
for (const toolCall of toolsToExecuteDirectly) {
|
|
331
|
-
try {
|
|
332
|
-
// Double-check tool exists before execution (safety net)
|
|
333
|
-
if (!toolManager?.hasTool(toolCall.function.name)) {
|
|
334
|
-
throw new Error(`Unknown tool: ${toolCall.function.name}`);
|
|
335
|
-
}
|
|
336
|
-
// Run validator if available
|
|
337
|
-
const validator = toolManager?.getToolValidator(toolCall.function.name);
|
|
338
|
-
if (validator) {
|
|
339
|
-
// Parse arguments if they're a JSON string
|
|
340
|
-
let parsedArgs = toolCall.function.arguments;
|
|
341
|
-
if (typeof parsedArgs === 'string') {
|
|
342
|
-
try {
|
|
343
|
-
parsedArgs = JSON.parse(parsedArgs);
|
|
344
|
-
}
|
|
345
|
-
catch (e) {
|
|
346
|
-
// If parsing fails, use as-is
|
|
347
|
-
}
|
|
348
|
-
}
|
|
349
|
-
const validationResult = await validator(parsedArgs);
|
|
350
|
-
if (!validationResult.valid) {
|
|
351
|
-
// Validation failed - create error result and skip execution
|
|
352
|
-
const errorResult = {
|
|
353
|
-
tool_call_id: toolCall.id,
|
|
354
|
-
role: 'tool',
|
|
355
|
-
name: toolCall.function.name,
|
|
356
|
-
content: validationResult.error,
|
|
357
|
-
};
|
|
358
|
-
directResults.push(errorResult);
|
|
359
|
-
// Update conversation state with error
|
|
360
|
-
conversationStateManager.current.updateAfterToolExecution(toolCall, errorResult.content);
|
|
361
|
-
// Display the validation error to the user
|
|
362
|
-
addToChatQueue(_jsx(ErrorMessage, { message: validationResult.error, hideBox: true }, `validation-error-${toolCall.id}-${Date.now()}`));
|
|
363
|
-
continue; // Skip to next tool
|
|
364
|
-
}
|
|
365
|
-
}
|
|
366
|
-
const result = await processToolUse(toolCall);
|
|
367
|
-
directResults.push(result);
|
|
368
|
-
// Update conversation state with tool execution
|
|
369
|
-
conversationStateManager.current.updateAfterToolExecution(toolCall, result.content);
|
|
370
|
-
// Display the tool result immediately
|
|
371
|
-
await displayToolResult(toolCall, result);
|
|
372
|
-
}
|
|
373
|
-
catch (error) {
|
|
374
|
-
// Handle tool execution errors
|
|
375
|
-
const errorResult = {
|
|
376
|
-
tool_call_id: toolCall.id,
|
|
377
|
-
role: 'tool',
|
|
378
|
-
name: toolCall.function.name,
|
|
379
|
-
content: `Error: ${error instanceof Error ? error.message : String(error)}`,
|
|
380
|
-
};
|
|
381
|
-
directResults.push(errorResult);
|
|
382
|
-
// Update conversation state with error
|
|
383
|
-
conversationStateManager.current.updateAfterToolExecution(toolCall, errorResult.content);
|
|
384
|
-
// Display the error result
|
|
385
|
-
await displayToolResult(toolCall, errorResult);
|
|
386
|
-
}
|
|
387
|
-
}
|
|
388
|
-
// If we have results, continue the conversation with them
|
|
389
|
-
if (directResults.length > 0) {
|
|
390
|
-
// Format tool results as standard tool messages
|
|
391
|
-
const toolMessages = directResults.map(result => ({
|
|
392
|
-
role: 'tool',
|
|
393
|
-
content: result.content || '',
|
|
394
|
-
tool_call_id: result.tool_call_id,
|
|
395
|
-
name: result.name,
|
|
396
|
-
}));
|
|
397
|
-
const updatedMessagesWithTools = [
|
|
398
|
-
...messages,
|
|
399
|
-
assistantMsg,
|
|
400
|
-
...toolMessages,
|
|
401
|
-
];
|
|
402
|
-
setMessages(updatedMessagesWithTools);
|
|
403
|
-
// Continue the main conversation loop with tool results as context
|
|
404
|
-
await processAssistantResponse(systemMessage, updatedMessagesWithTools);
|
|
405
|
-
return;
|
|
406
|
-
}
|
|
407
|
-
}
|
|
408
|
-
// Start confirmation flow only for tools that need it
|
|
409
|
-
if (toolsNeedingConfirmation.length > 0) {
|
|
410
|
-
onStartToolConfirmationFlow(toolsNeedingConfirmation, messages, assistantMsg, systemMessage);
|
|
411
|
-
return; // IMPORTANT: Stop processing here, wait for user confirmation
|
|
412
|
-
}
|
|
413
|
-
}
|
|
414
|
-
};
|
|
415
123
|
// Process assistant response - handles the conversation loop with potential tool calls (for follow-ups)
|
|
416
124
|
const processAssistantResponse = async (systemMessage, messages) => {
|
|
417
125
|
if (!client)
|
|
@@ -445,20 +153,6 @@ export function useChatHandler({ client, toolManager, messages, setMessages, get
|
|
|
445
153
|
if (chunk.message?.tool_calls) {
|
|
446
154
|
toolCalls = chunk.message.tool_calls;
|
|
447
155
|
}
|
|
448
|
-
// Update thinking stats in real-time (similar to initial response)
|
|
449
|
-
if (!chunk.done) {
|
|
450
|
-
const systemTokens = Math.ceil(systemMessage.content.length / 4); // Use actual system prompt length
|
|
451
|
-
const conversationTokens = getMessageTokens
|
|
452
|
-
? messages.reduce((total, msg) => total + getMessageTokens(msg), 0)
|
|
453
|
-
: messages.reduce((total, msg) => total + Math.ceil((msg.content?.length || 0) / 4), 0);
|
|
454
|
-
const totalTokensUsed = systemTokens + conversationTokens + tokenCount;
|
|
455
|
-
throttledSetThinkingStats({
|
|
456
|
-
tokenCount,
|
|
457
|
-
contextSize: client.getContextSize(),
|
|
458
|
-
totalTokensUsed,
|
|
459
|
-
tokensPerSecond: chunk.tokens_per_second,
|
|
460
|
-
});
|
|
461
|
-
}
|
|
462
156
|
}
|
|
463
157
|
if (!hasContent) {
|
|
464
158
|
throw new Error('No response received from model');
|
|
@@ -486,7 +180,12 @@ export function useChatHandler({ client, toolManager, messages, setMessages, get
|
|
|
486
180
|
if (validToolCalls && validToolCalls.length > 0) {
|
|
487
181
|
// In Plan Mode, block file modification tools
|
|
488
182
|
if (developmentMode === 'plan') {
|
|
489
|
-
const fileModificationTools = [
|
|
183
|
+
const fileModificationTools = [
|
|
184
|
+
'create_file',
|
|
185
|
+
'delete_lines',
|
|
186
|
+
'insert_lines',
|
|
187
|
+
'replace_lines',
|
|
188
|
+
];
|
|
490
189
|
const blockedTools = validToolCalls.filter(tc => fileModificationTools.includes(tc.function.name));
|
|
491
190
|
if (blockedTools.length > 0) {
|
|
492
191
|
// Create error results for blocked tools
|
|
@@ -514,8 +213,7 @@ export function useChatHandler({ client, toolManager, messages, setMessages, get
|
|
|
514
213
|
];
|
|
515
214
|
setMessages(updatedMessagesWithError);
|
|
516
215
|
// Continue the main conversation loop with error messages as context
|
|
517
|
-
|
|
518
|
-
await processAssistantResponseWithTokenTracking(systemMessage, updatedMessagesWithError, controller);
|
|
216
|
+
await processAssistantResponse(systemMessage, updatedMessagesWithError);
|
|
519
217
|
return;
|
|
520
218
|
}
|
|
521
219
|
}
|
|
@@ -639,8 +337,7 @@ export function useChatHandler({ client, toolManager, messages, setMessages, get
|
|
|
639
337
|
];
|
|
640
338
|
setMessages(updatedMessagesWithTools);
|
|
641
339
|
// Continue the main conversation loop with tool results as context
|
|
642
|
-
|
|
643
|
-
await processAssistantResponseWithTokenTracking(systemMessage, updatedMessagesWithTools, controller);
|
|
340
|
+
await processAssistantResponse(systemMessage, updatedMessagesWithTools);
|
|
644
341
|
return;
|
|
645
342
|
}
|
|
646
343
|
}
|
|
@@ -702,13 +399,8 @@ export function useChatHandler({ client, toolManager, messages, setMessages, get
|
|
|
702
399
|
// Use the new conversation loop
|
|
703
400
|
// Initialize per-message stats with actual system prompt tokens
|
|
704
401
|
const systemTokens = Math.ceil(systemMessage.content.length / 4);
|
|
705
|
-
setThinkingStats({
|
|
706
|
-
tokenCount: 0,
|
|
707
|
-
contextSize: client.getContextSize(),
|
|
708
|
-
totalTokensUsed: systemTokens + existingConversationTokens,
|
|
709
|
-
});
|
|
710
402
|
// Use the new conversation loop
|
|
711
|
-
await
|
|
403
|
+
await processAssistantResponse(systemMessage, updatedMessages);
|
|
712
404
|
}
|
|
713
405
|
catch (error) {
|
|
714
406
|
if (error instanceof Error &&
|