windmill-components 1.522.0 → 1.531.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/package/components/AIAgentLogViewer.svelte +123 -0
- package/package/components/AIAgentLogViewer.svelte.d.ts +13 -0
- package/package/components/AppConnectInner.svelte +10 -10
- package/package/components/AutoscalingConfigEditor.svelte +76 -2
- package/package/components/Dev.svelte +12 -28
- package/package/components/DiffEditor.svelte +6 -3
- package/package/components/DiffEditor.svelte.d.ts +1 -0
- package/package/components/DisplayResult.svelte +16 -10
- package/package/components/DisplayResult.svelte.d.ts +1 -0
- package/package/components/EditableSchemaForm.svelte +5 -2
- package/package/components/Editor.svelte +26 -8
- package/package/components/Editor.svelte.d.ts +1 -1
- package/package/components/EditorBar.svelte +25 -5
- package/package/components/EditorSettings.svelte +6 -0
- package/package/components/FirstStepInputs.svelte +2 -2
- package/package/components/FlowBuilder.svelte +18 -36
- package/package/components/FlowGraphViewerStep.svelte +7 -0
- package/package/components/FlowJobResult.svelte +15 -63
- package/package/components/FlowJobResult.svelte.d.ts +10 -4
- package/package/components/FlowLogViewer.svelte +660 -0
- package/package/components/FlowLogViewer.svelte.d.ts +34 -0
- package/package/components/FlowLogViewerWrapper.svelte +52 -0
- package/package/components/FlowLogViewerWrapper.svelte.d.ts +21 -0
- package/package/components/FlowLoopIterationPreview.svelte +3 -3
- package/package/components/FlowPreviewContent.svelte +4 -5
- package/package/components/FlowPreviewContent.svelte.d.ts +7 -7
- package/package/components/FlowPreviewResult.svelte +4 -5
- package/package/components/FlowPreviewResult.svelte.d.ts +3 -5
- package/package/components/FlowStatusViewer.svelte +28 -16
- package/package/components/FlowStatusViewer.svelte.d.ts +19 -27
- package/package/components/FlowStatusViewerInner.svelte +483 -296
- package/package/components/FlowStatusViewerInner.svelte.d.ts +27 -33
- package/package/components/FlowTimeline.svelte +11 -13
- package/package/components/FlowTimeline.svelte.d.ts +6 -5
- package/package/components/FlowWrapper.svelte +3 -2
- package/package/components/HighlightCode.svelte +4 -1
- package/package/components/IconedResourceType.svelte +9 -5
- package/package/components/JobLoader.svelte +61 -8
- package/package/components/JobLoader.svelte.d.ts +9 -1
- package/package/components/LogViewer.svelte +8 -2
- package/package/components/LogViewer.svelte.d.ts +1 -0
- package/package/components/LogViewerHeader.svelte +32 -0
- package/package/components/LogViewerHeader.svelte.d.ts +8 -0
- package/package/components/ModulePreviewForm.svelte +10 -6
- package/package/components/ModulePreviewResultViewer.svelte +16 -0
- package/package/components/ModulePreviewResultViewer.svelte.d.ts +1 -1
- package/package/components/ModuleTest.svelte +59 -16
- package/package/components/RelativeLineNumbers.svelte +16 -0
- package/package/components/RelativeLineNumbers.svelte.d.ts +18 -0
- package/package/components/ResourceEditor.svelte +9 -4
- package/package/components/ScriptBuilder.svelte +13 -11
- package/package/components/ScriptEditor.svelte +2 -2
- package/package/components/SimpleEditor.svelte +10 -4
- package/package/components/SimpleEditor.svelte.d.ts +1 -0
- package/package/components/TemplateEditor.svelte +1 -1
- package/package/components/UserSettings.svelte +4 -4
- package/package/components/apps/components/display/AppAccordionList.svelte +1 -1
- package/package/components/apps/components/display/AppCarouselList.svelte +10 -8
- package/package/components/apps/components/display/AppJobIdFlowStatus.svelte +3 -3
- package/package/components/apps/components/display/table/AppAggridTable.svelte +2 -2
- package/package/components/apps/components/helpers/HiddenComponent.svelte +0 -1
- package/package/components/apps/components/helpers/InputValue.svelte +6 -1
- package/package/components/apps/components/helpers/NonRunnableComponent.svelte +8 -4
- package/package/components/apps/components/helpers/NonRunnableComponent.svelte.d.ts +1 -1
- package/package/components/apps/components/helpers/RunnableComponent.svelte +7 -8
- package/package/components/apps/components/helpers/RunnableComponent.svelte.d.ts +1 -1
- package/package/components/apps/components/helpers/RunnableWrapper.svelte +12 -3
- package/package/components/apps/components/helpers/RunnableWrapper.svelte.d.ts +1 -1
- package/package/components/apps/components/inputs/AppCodeInputComponent.svelte +0 -5
- package/package/components/apps/components/layout/AppConditionalWrapper.svelte +1 -1
- package/package/components/apps/components/layout/AppContainer.svelte +1 -1
- package/package/components/apps/components/layout/AppDecisionTree.svelte +31 -20
- package/package/components/apps/components/layout/AppDrawer.svelte +1 -1
- package/package/components/apps/components/layout/AppList.svelte +9 -8
- package/package/components/apps/components/layout/AppModal.svelte +1 -1
- package/package/components/apps/components/layout/AppSplitpanes.svelte +5 -2
- package/package/components/apps/components/layout/AppStepper.svelte +9 -5
- package/package/components/apps/components/layout/AppTabs.svelte +2 -2
- package/package/components/apps/editor/AppJobsDrawer.svelte +2 -2
- package/package/components/apps/editor/GridEditor.svelte +24 -19
- package/package/components/apps/editor/GridEditor.svelte.d.ts +4 -1
- package/package/components/apps/editor/GridViewer.svelte +1 -1
- package/package/components/apps/editor/SubGridEditor.svelte +7 -11
- package/package/components/apps/editor/SubGridEditor.svelte.d.ts +3 -19
- package/package/components/apps/editor/appUtils.js +17 -68
- package/package/components/apps/editor/component/ComponentInner.svelte +845 -694
- package/package/components/apps/editor/component/componentCallbacks.svelte.js +8 -1
- package/package/components/apps/editor/contextPanel/components/OutputHeader.svelte +9 -46
- package/package/components/apps/editor/settingsPanel/DecisionTreeGraphEditor.svelte +29 -43
- package/package/components/apps/editor/settingsPanel/InputsSpecEditor.svelte +2 -1
- package/package/components/apps/editor/settingsPanel/InputsSpecEditor.svelte.d.ts +1 -0
- package/package/components/apps/editor/settingsPanel/inputEditor/EvalV2InputEditor.svelte +2 -2
- package/package/components/apps/editor/settingsPanel/inputEditor/EvalV2InputEditor.svelte.d.ts +1 -0
- package/package/components/apps/svelte-grid/Grid.svelte +23 -25
- package/package/components/apps/svelte-grid/Grid.svelte.d.ts +21 -9
- package/package/components/apps/svelte-grid/MoveResize.svelte +13 -15
- package/package/components/apps/svelte-grid/MoveResize.svelte.d.ts +17 -24
- package/package/components/apps/utils.d.ts +2 -0
- package/package/components/apps/utils.js +22 -0
- package/package/components/auditLogs/AuditLogsFilters.svelte.d.ts +1 -1
- package/package/components/common/fileDownload/FileDownload.svelte +1 -3
- package/package/components/common/fileDownload/FileDownload.svelte.d.ts +4 -18
- package/package/components/common/languageIcons/LanguageIcon.svelte +5 -2
- package/package/components/copilot/FlowInlineScriptAIButton.svelte +58 -0
- package/package/components/copilot/FlowInlineScriptAIButton.svelte.d.ts +3 -0
- package/package/components/copilot/MetadataGen.svelte +19 -1
- package/package/components/copilot/MetadataGen.svelte.d.ts +1 -1
- package/package/components/copilot/ScriptGen.svelte +23 -31
- package/package/components/copilot/ScriptGen.svelte.d.ts +0 -1
- package/package/components/copilot/autocomplete/Autocompletor.js +2 -0
- package/package/components/copilot/chat/AIChatDisplay.svelte +4 -4
- package/package/components/copilot/chat/AIChatInput.svelte +29 -6
- package/package/components/copilot/chat/AIChatManager.svelte.js +110 -26
- package/package/components/copilot/chat/AIChatMessage.svelte +3 -0
- package/package/components/copilot/chat/ToolContentDisplay.svelte +84 -0
- package/package/components/copilot/chat/ToolContentDisplay.svelte.d.ts +11 -0
- package/package/components/copilot/chat/ToolExecutionDisplay.svelte +105 -0
- package/package/components/copilot/chat/ToolExecutionDisplay.svelte.d.ts +7 -0
- package/package/components/copilot/chat/api/apiTools.d.ts +7 -0
- package/package/components/copilot/chat/api/apiTools.js +192 -0
- package/package/components/copilot/chat/api/core.d.ts +7 -0
- package/package/components/copilot/chat/api/core.js +61 -0
- package/package/components/copilot/chat/flow/FlowAIChat.svelte +4 -6
- package/package/components/copilot/chat/flow/core.js +213 -42
- package/package/components/copilot/chat/flow/utils.js +3 -0
- package/package/components/copilot/chat/monaco-adapter.d.ts +1 -1
- package/package/components/copilot/chat/monaco-adapter.js +10 -4
- package/package/components/copilot/chat/navigator/core.d.ts +1 -1
- package/package/components/copilot/chat/navigator/core.js +20 -22
- package/package/components/copilot/chat/script/core.d.ts +11 -3
- package/package/components/copilot/chat/script/core.js +92 -15
- package/package/components/copilot/chat/shared.d.ts +30 -3
- package/package/components/copilot/chat/shared.js +228 -9
- package/package/components/copilot/lib.d.ts +1 -1
- package/package/components/copilot/lib.js +15 -6
- package/package/components/custom_ui.d.ts +2 -0
- package/package/components/details/DetailPageLayout.svelte +34 -33
- package/package/components/flow_builder.d.ts +1 -2
- package/package/components/flows/FlowEditor.svelte +3 -3
- package/package/components/flows/FlowEditor.svelte.d.ts +7 -6
- package/package/components/flows/common/FlowCard.svelte +2 -2
- package/package/components/flows/common/FlowCard.svelte.d.ts +1 -0
- package/package/components/flows/common/FlowCardHeader.svelte +13 -4
- package/package/components/flows/common/FlowCardHeader.svelte.d.ts +1 -0
- package/package/components/flows/content/BranchPredicateEditor.svelte +4 -7
- package/package/components/flows/content/BranchPredicateEditor.svelte.d.ts +12 -11
- package/package/components/flows/content/FlowConstants.svelte +3 -3
- package/package/components/flows/content/FlowEditorPanel.svelte +3 -3
- package/package/components/flows/content/FlowEditorPanel.svelte.d.ts +2 -4
- package/package/components/flows/content/FlowInputsQuick.svelte +2 -1
- package/package/components/flows/content/FlowLoop.svelte +2 -2
- package/package/components/flows/content/FlowModuleComponent.svelte +130 -108
- package/package/components/flows/content/FlowModuleComponent.svelte.d.ts +1 -0
- package/package/components/flows/content/FlowModuleEarlyStop.svelte +2 -2
- package/package/components/flows/content/FlowModuleSkip.svelte +1 -1
- package/package/components/flows/content/FlowModuleSleep.svelte +1 -1
- package/package/components/flows/content/FlowModuleSuspend.svelte +1 -1
- package/package/components/flows/content/FlowModuleWrapper.svelte +15 -5
- package/package/components/flows/content/FlowModuleWrapper.svelte.d.ts +1 -0
- package/package/components/flows/content/FlowResult.svelte +2 -3
- package/package/components/flows/content/FlowResult.svelte.d.ts +2 -4
- package/package/components/flows/content/FlowWhileLoop.svelte +1 -1
- package/package/components/flows/dfs.d.ts +3 -1
- package/package/components/flows/dfs.js +5 -1
- package/package/components/flows/flowInfers.js +78 -0
- package/package/components/flows/flowState.d.ts +2 -3
- package/package/components/flows/flowState.js +2 -2
- package/package/components/flows/flowStateUtils.svelte.d.ts +4 -4
- package/package/components/flows/flowStateUtils.svelte.js +14 -13
- package/package/components/flows/flowStore.d.ts +3 -4
- package/package/components/flows/header/FlowPreviewButtons.svelte +2 -1
- package/package/components/flows/header/FlowYamlEditor.svelte +10 -1
- package/package/components/flows/map/FlowGraphPreviewButton.svelte +1 -1
- package/package/components/flows/map/FlowJobsMenu.svelte +7 -3
- package/package/components/flows/map/FlowJobsMenu.svelte.d.ts +1 -0
- package/package/components/flows/map/FlowModuleSchemaItem.svelte +12 -12
- package/package/components/flows/map/FlowModuleSchemaMap.svelte +26 -19
- package/package/components/flows/map/FlowModuleSchemaMap.svelte.d.ts +6 -4
- package/package/components/flows/map/InsertModuleInner.svelte +9 -1
- package/package/components/flows/map/InsertModuleInner.svelte.d.ts +1 -0
- package/package/components/flows/map/MapItem.svelte +4 -2
- package/package/components/flows/pickers/TopLevelNode.svelte +4 -1
- package/package/components/flows/propPicker/InputPickerInner.svelte +5 -4
- package/package/components/flows/propPicker/OutputBadge.svelte +11 -9
- package/package/components/flows/propPicker/OutputPickerInner.svelte +10 -1
- package/package/components/flows/propPicker/OutputPickerInner.svelte.d.ts +1 -1
- package/package/components/flows/testSteps.svelte.d.ts +3 -2
- package/package/components/flows/testSteps.svelte.js +26 -23
- package/package/components/flows/types.d.ts +1 -1
- package/package/components/flows/utils.d.ts +3 -5
- package/package/components/flows/utils.js +3 -4
- package/package/components/git_sync/GitSyncContext.svelte.js +2 -1
- package/package/components/graph/FlowGraphV2.svelte +44 -24
- package/package/components/graph/FlowGraphV2.svelte.d.ts +5 -2
- package/package/components/graph/graphBuilder.svelte.d.ts +49 -17
- package/package/components/graph/graphBuilder.svelte.js +30 -14
- package/package/components/graph/model.d.ts +9 -6
- package/package/components/graph/renderers/edges/BaseEdge.svelte +3 -3
- package/package/components/graph/renderers/edges/BaseEdge.svelte.d.ts +2 -3
- package/package/components/graph/renderers/nodes/AIToolNode.svelte +234 -0
- package/package/components/graph/renderers/nodes/AIToolNode.svelte.d.ts +24 -0
- package/package/components/graph/renderers/nodes/AssetNode.svelte +15 -10
- package/package/components/graph/renderers/nodes/AssetNode.svelte.d.ts +18 -1
- package/package/components/graph/renderers/nodes/BranchAllEndNode.svelte +1 -1
- package/package/components/graph/renderers/nodes/BranchAllStart.svelte +1 -1
- package/package/components/graph/renderers/nodes/BranchOneStart.svelte +1 -1
- package/package/components/graph/renderers/nodes/ForLoopEndNode.svelte +2 -2
- package/package/components/graph/renderers/nodes/ForLoopStartNode.svelte +1 -1
- package/package/components/graph/renderers/nodes/ModuleNode.svelte +21 -21
- package/package/components/graph/renderers/nodes/NewAIToolNode.svelte +64 -0
- package/package/components/graph/renderers/nodes/NewAIToolNode.svelte.d.ts +7 -0
- package/package/components/graph/renderers/nodes/branchOneEndNode.svelte +1 -1
- package/package/components/icons/RubyIcon.svelte +656 -0
- package/package/components/icons/RubyIcon.svelte.d.ts +7 -0
- package/package/components/instanceSettings.js +9 -0
- package/package/components/modulesTest.svelte.d.ts +6 -3
- package/package/components/modulesTest.svelte.js +32 -0
- package/package/components/preview/FlowPreviewStatus.svelte +3 -1
- package/package/components/raw_apps/RawAppEditor.svelte +27 -26
- package/package/components/raw_apps/RawAppEditor.svelte.d.ts +17 -17
- package/package/components/runs/{JobPreview.svelte → JobRunsPreview.svelte} +1 -4
- package/package/components/runs/{JobPreview.svelte.d.ts → JobRunsPreview.svelte.d.ts} +3 -3
- package/package/components/runs/RunRow.svelte +5 -1
- package/package/components/schema/AddProperty.svelte +41 -36
- package/package/components/schema/AddProperty.svelte.d.ts +2 -2
- package/package/components/schema/AddPropertyV2.svelte +41 -37
- package/package/components/schema/AddPropertyV2.svelte.d.ts +1 -1
- package/package/components/schema/FlowPropertyEditor.svelte +8 -6
- package/package/components/search/RunsSearch.svelte +1 -1
- package/package/components/settings/CreateToken.svelte +132 -12
- package/package/components/settings/CreateToken.svelte.d.ts +3 -20
- package/package/components/settings/TokenDisplay.svelte +18 -42
- package/package/components/settings/TokenDisplay.svelte.d.ts +0 -1
- package/package/components/settings/TokensTable.svelte +2 -4
- package/package/components/settings/TokensTable.svelte.d.ts +3 -19
- package/package/components/settings/WorkspaceUserSettings.svelte +428 -69
- package/package/components/sidebar/MenuButton.svelte +12 -10
- package/package/components/stepHistoryLoader.svelte.d.ts +2 -2
- package/package/components/stepHistoryLoader.svelte.js +7 -12
- package/package/components/triggers/http/OpenAPISpecGenerator.svelte +2 -2
- package/package/components/tutorials/FlowBuilderTutorialBranchOne.svelte +1 -1
- package/package/components/tutorials/FlowBuilderTutorialForLoop.svelte +4 -4
- package/package/components/tutorials/utils.js +3 -0
- package/package/components/worker_group.d.ts +4 -1
- package/package/components/worker_group.js +3 -2
- package/package/editorLangUtils.d.ts +1 -1
- package/package/editorLangUtils.js +2 -0
- package/package/editorUtils.d.ts +2 -1
- package/package/editorUtils.js +2 -1
- package/package/gen/core/OpenAPI.js +1 -1
- package/package/gen/schemas.gen.d.ts +296 -8
- package/package/gen/schemas.gen.js +364 -70
- package/package/gen/services.gen.d.ts +118 -16
- package/package/gen/services.gen.js +226 -19
- package/package/gen/types.gen.d.ts +660 -16
- package/package/hubPaths.json +7 -4
- package/package/infer.js +10 -1
- package/package/monaco_workers/graphql.worker.bundle.js +144 -110
- package/package/script_helpers.d.ts +3 -0
- package/package/script_helpers.js +58 -3
- package/package/scripts.d.ts +1 -1
- package/package/scripts.js +3 -2
- package/package/stores.d.ts +2 -0
- package/package/stores.js +2 -0
- package/package/svelte5Utils.svelte.d.ts +16 -0
- package/package/svelte5Utils.svelte.js +26 -0
- package/package/utils.d.ts +1 -1
- package/package.json +20 -19
- package/package/components/AllFlowLogs.svelte +0 -31
- package/package/components/AllFlowLogs.svelte.d.ts +0 -8
- package/package/components/copilot/chat/navigator/apiTools.d.ts +0 -68
- package/package/components/copilot/chat/navigator/apiTools.js +0 -258
|
@@ -1,10 +1,10 @@
|
|
|
1
1
|
import { flowTools, prepareFlowSystemMessage, prepareFlowUserMessage } from './flow/core';
|
|
2
2
|
import ContextManager from './ContextManager.svelte';
|
|
3
3
|
import HistoryManager from './HistoryManager.svelte';
|
|
4
|
-
import { processToolCall } from './shared';
|
|
4
|
+
import { extractCodeFromMarkdown, getLatestAssistantMessage, processToolCall } from './shared';
|
|
5
5
|
import { INLINE_CHAT_SYSTEM_PROMPT, prepareScriptSystemMessage, prepareScriptTools } from './script/core';
|
|
6
6
|
import { navigatorTools, prepareNavigatorSystemMessage } from './navigator/core';
|
|
7
|
-
import { loadApiTools } from './
|
|
7
|
+
import { loadApiTools } from './api/apiTools';
|
|
8
8
|
import { prepareScriptUserMessage } from './script/core';
|
|
9
9
|
import { prepareNavigatorUserMessage } from './navigator/core';
|
|
10
10
|
import { sendUserToast } from '../../../toast';
|
|
@@ -13,9 +13,10 @@ import { dfs } from '../../flows/previousResults';
|
|
|
13
13
|
import { getStringError } from './utils';
|
|
14
14
|
import { untrack } from 'svelte';
|
|
15
15
|
import { copilotSessionModel } from '../../../stores';
|
|
16
|
-
import { askTools, prepareAskSystemMessage } from './ask/core';
|
|
16
|
+
import { askTools, prepareAskSystemMessage, prepareAskUserMessage } from './ask/core';
|
|
17
17
|
import { chatState, DEFAULT_SIZE, triggerablesByAi } from './sharedChatState.svelte';
|
|
18
18
|
import { get } from 'svelte/store';
|
|
19
|
+
import { prepareApiSystemMessage, prepareApiUserMessage } from './api/core';
|
|
19
20
|
// If the estimated token usage is greater than the model context window - the threshold, we delete the oldest message
|
|
20
21
|
const MAX_TOKENS_THRESHOLD_PERCENTAGE = 0.05;
|
|
21
22
|
const MAX_TOKENS_HARD_LIMIT = 5000;
|
|
@@ -24,6 +25,7 @@ export var AIMode;
|
|
|
24
25
|
AIMode["SCRIPT"] = "script";
|
|
25
26
|
AIMode["FLOW"] = "flow";
|
|
26
27
|
AIMode["NAVIGATOR"] = "navigator";
|
|
28
|
+
AIMode["API"] = "API";
|
|
27
29
|
AIMode["ASK"] = "ask";
|
|
28
30
|
})(AIMode || (AIMode = {}));
|
|
29
31
|
class AIChatManager {
|
|
@@ -57,11 +59,13 @@ class AIChatManager {
|
|
|
57
59
|
pendingNewCode = $state(undefined);
|
|
58
60
|
apiTools = $state([]);
|
|
59
61
|
aiChatInput = $state(null);
|
|
62
|
+
confirmationCallback = $state(undefined);
|
|
60
63
|
allowedModes = $derived({
|
|
61
64
|
script: this.scriptEditorOptions !== undefined,
|
|
62
65
|
flow: this.flowAiChatHelpers !== undefined,
|
|
63
66
|
navigator: true,
|
|
64
|
-
ask: true
|
|
67
|
+
ask: true,
|
|
68
|
+
API: true
|
|
65
69
|
});
|
|
66
70
|
open = $derived(chatState.size > 0);
|
|
67
71
|
checkTokenUsageOverLimit = (messages) => {
|
|
@@ -103,8 +107,8 @@ class AIChatManager {
|
|
|
103
107
|
loadApiTools = async () => {
|
|
104
108
|
try {
|
|
105
109
|
this.apiTools = await loadApiTools();
|
|
106
|
-
if (this.mode === AIMode.
|
|
107
|
-
this.tools = [
|
|
110
|
+
if (this.mode === AIMode.API) {
|
|
111
|
+
this.tools = [...this.apiTools];
|
|
108
112
|
}
|
|
109
113
|
}
|
|
110
114
|
catch (err) {
|
|
@@ -112,6 +116,20 @@ class AIChatManager {
|
|
|
112
116
|
this.apiTools = [];
|
|
113
117
|
}
|
|
114
118
|
};
|
|
119
|
+
// Request confirmation from user for a tool call
|
|
120
|
+
requestConfirmation = (toolId) => {
|
|
121
|
+
return new Promise((resolve) => {
|
|
122
|
+
// Store the callback for this specific tool
|
|
123
|
+
this.confirmationCallback = resolve;
|
|
124
|
+
});
|
|
125
|
+
};
|
|
126
|
+
// Handle confirmation response for a specific tool
|
|
127
|
+
handleToolConfirmation = (toolId, confirmed) => {
|
|
128
|
+
if (this.confirmationCallback) {
|
|
129
|
+
this.confirmationCallback(confirmed);
|
|
130
|
+
this.confirmationCallback = undefined;
|
|
131
|
+
}
|
|
132
|
+
};
|
|
115
133
|
setAiChatInput(aiChatInput) {
|
|
116
134
|
this.aiChatInput = aiChatInput;
|
|
117
135
|
}
|
|
@@ -137,7 +155,27 @@ class AIChatManager {
|
|
|
137
155
|
const lang = this.scriptEditorOptions?.lang ?? 'bun';
|
|
138
156
|
this.tools = [this.changeModeTool, ...prepareScriptTools(lang, context)];
|
|
139
157
|
this.helpers = {
|
|
140
|
-
|
|
158
|
+
getScriptOptions: () => {
|
|
159
|
+
return {
|
|
160
|
+
code: this.scriptEditorOptions?.code ?? '',
|
|
161
|
+
lang: lang,
|
|
162
|
+
path: this.scriptEditorOptions?.path ?? '',
|
|
163
|
+
args: this.scriptEditorOptions?.args ?? {}
|
|
164
|
+
};
|
|
165
|
+
},
|
|
166
|
+
getLastSuggestedCode: () => {
|
|
167
|
+
const latestMessage = getLatestAssistantMessage(this.displayMessages);
|
|
168
|
+
if (latestMessage) {
|
|
169
|
+
const codeBlocks = extractCodeFromMarkdown(latestMessage);
|
|
170
|
+
if (codeBlocks.length > 0) {
|
|
171
|
+
return codeBlocks[codeBlocks.length - 1];
|
|
172
|
+
}
|
|
173
|
+
}
|
|
174
|
+
return undefined;
|
|
175
|
+
},
|
|
176
|
+
applyCode: (code, applyAll) => {
|
|
177
|
+
this.scriptEditorApplyCode?.(code, applyAll);
|
|
178
|
+
}
|
|
141
179
|
};
|
|
142
180
|
if (options?.closeScriptSettings) {
|
|
143
181
|
const closeComponent = triggerablesByAi['close-script-builder-settings'];
|
|
@@ -154,7 +192,7 @@ class AIChatManager {
|
|
|
154
192
|
}
|
|
155
193
|
else if (mode === AIMode.NAVIGATOR) {
|
|
156
194
|
this.systemMessage = prepareNavigatorSystemMessage();
|
|
157
|
-
this.tools = [this.changeModeTool, ...navigatorTools
|
|
195
|
+
this.tools = [this.changeModeTool, ...navigatorTools];
|
|
158
196
|
this.helpers = {};
|
|
159
197
|
}
|
|
160
198
|
else if (mode === AIMode.ASK) {
|
|
@@ -162,6 +200,11 @@ class AIChatManager {
|
|
|
162
200
|
this.tools = [...askTools];
|
|
163
201
|
this.helpers = {};
|
|
164
202
|
}
|
|
203
|
+
else if (mode === AIMode.API) {
|
|
204
|
+
this.systemMessage = prepareApiSystemMessage();
|
|
205
|
+
this.tools = [...this.apiTools];
|
|
206
|
+
this.helpers = {};
|
|
207
|
+
}
|
|
165
208
|
}
|
|
166
209
|
canApplyCode = $derived(this.allowedModes.script && this.mode === AIMode.SCRIPT);
|
|
167
210
|
changeModeTool = {
|
|
@@ -169,14 +212,14 @@ class AIChatManager {
|
|
|
169
212
|
type: 'function',
|
|
170
213
|
function: {
|
|
171
214
|
name: 'change_mode',
|
|
172
|
-
description: 'Change the AI mode to the one specified. Script mode is used to create scripts
|
|
215
|
+
description: 'Change the AI mode to the one specified. Script mode is used to create scripts. Flow mode is used to create flows. Navigator mode is used to navigate the application and help the user find what they are looking for. API mode is used to make API calls to the Windmill backend.',
|
|
173
216
|
parameters: {
|
|
174
217
|
type: 'object',
|
|
175
218
|
properties: {
|
|
176
219
|
mode: {
|
|
177
220
|
type: 'string',
|
|
178
221
|
description: 'The mode to change to',
|
|
179
|
-
enum: ['script', 'flow', 'navigator']
|
|
222
|
+
enum: ['script', 'flow', 'navigator', 'API']
|
|
180
223
|
},
|
|
181
224
|
pendingPrompt: {
|
|
182
225
|
type: 'string',
|
|
@@ -189,11 +232,11 @@ class AIChatManager {
|
|
|
189
232
|
}
|
|
190
233
|
},
|
|
191
234
|
fn: async ({ args, toolId, toolCallbacks }) => {
|
|
192
|
-
toolCallbacks.setToolStatus(toolId, 'Switching to ' + args.mode + ' mode...');
|
|
235
|
+
toolCallbacks.setToolStatus(toolId, { content: 'Switching to ' + args.mode + ' mode...' });
|
|
193
236
|
this.changeMode(args.mode, args.pendingPrompt, {
|
|
194
237
|
closeScriptSettings: true
|
|
195
238
|
});
|
|
196
|
-
toolCallbacks.setToolStatus(toolId, 'Switched to ' + args.mode + ' mode');
|
|
239
|
+
toolCallbacks.setToolStatus(toolId, { content: 'Switched to ' + args.mode + ' mode' });
|
|
197
240
|
return 'Mode changed to ' + args.mode;
|
|
198
241
|
}
|
|
199
242
|
};
|
|
@@ -259,13 +302,18 @@ class AIChatManager {
|
|
|
259
302
|
let completion = null;
|
|
260
303
|
while (true) {
|
|
261
304
|
const systemMessage = systemMessageOverride ?? this.systemMessage;
|
|
262
|
-
const tools = this.tools;
|
|
263
305
|
const helpers = this.helpers;
|
|
306
|
+
const tools = this.tools;
|
|
307
|
+
for (const tool of tools) {
|
|
308
|
+
if (tool.setSchema) {
|
|
309
|
+
await tool.setSchema(helpers);
|
|
310
|
+
}
|
|
311
|
+
}
|
|
264
312
|
let pendingPrompt = this.pendingPrompt;
|
|
265
313
|
let pendingUserMessage = undefined;
|
|
266
314
|
if (pendingPrompt) {
|
|
267
315
|
if (this.mode === AIMode.SCRIPT) {
|
|
268
|
-
pendingUserMessage =
|
|
316
|
+
pendingUserMessage = prepareScriptUserMessage(pendingPrompt, this.scriptEditorOptions?.lang, this.contextManager.getSelectedContext());
|
|
269
317
|
}
|
|
270
318
|
else if (this.mode === AIMode.FLOW) {
|
|
271
319
|
pendingUserMessage = prepareFlowUserMessage(pendingPrompt, this.flowAiChatHelpers.getFlowAndSelectedId());
|
|
@@ -348,7 +396,6 @@ class AIChatManager {
|
|
|
348
396
|
const messageToAdd = await processToolCall({
|
|
349
397
|
tools,
|
|
350
398
|
toolCall,
|
|
351
|
-
messages,
|
|
352
399
|
helpers,
|
|
353
400
|
toolCallbacks: callbacks
|
|
354
401
|
});
|
|
@@ -394,7 +441,7 @@ class AIChatManager {
|
|
|
394
441
|
};
|
|
395
442
|
let reply = '';
|
|
396
443
|
try {
|
|
397
|
-
const userMessage =
|
|
444
|
+
const userMessage = prepareScriptUserMessage(instructions, lang, selectedContext, {
|
|
398
445
|
isPreprocessor: false
|
|
399
446
|
});
|
|
400
447
|
const messages = [userMessage];
|
|
@@ -492,13 +539,29 @@ class AIChatManager {
|
|
|
492
539
|
}
|
|
493
540
|
const lang = this.scriptEditorOptions?.lang ?? options.lang ?? 'bun';
|
|
494
541
|
const isPreprocessor = this.scriptEditorOptions?.path === 'preprocessor' || options.isPreprocessor;
|
|
495
|
-
|
|
496
|
-
|
|
497
|
-
:
|
|
498
|
-
|
|
499
|
-
|
|
542
|
+
let userMessage = {
|
|
543
|
+
role: 'user',
|
|
544
|
+
content: ''
|
|
545
|
+
};
|
|
546
|
+
switch (this.mode) {
|
|
547
|
+
case AIMode.FLOW:
|
|
548
|
+
userMessage = prepareFlowUserMessage(oldInstructions, this.flowAiChatHelpers.getFlowAndSelectedId());
|
|
549
|
+
break;
|
|
550
|
+
case AIMode.NAVIGATOR:
|
|
551
|
+
userMessage = prepareNavigatorUserMessage(oldInstructions);
|
|
552
|
+
break;
|
|
553
|
+
case AIMode.ASK:
|
|
554
|
+
userMessage = prepareAskUserMessage(oldInstructions);
|
|
555
|
+
break;
|
|
556
|
+
case AIMode.SCRIPT:
|
|
557
|
+
userMessage = prepareScriptUserMessage(oldInstructions, lang, oldSelectedContext, {
|
|
500
558
|
isPreprocessor
|
|
501
559
|
});
|
|
560
|
+
break;
|
|
561
|
+
case AIMode.API:
|
|
562
|
+
userMessage = prepareApiUserMessage(oldInstructions);
|
|
563
|
+
break;
|
|
564
|
+
}
|
|
502
565
|
this.messages.push(userMessage);
|
|
503
566
|
await this.historyManager.saveChat(this.displayMessages, this.messages);
|
|
504
567
|
this.currentReply = '';
|
|
@@ -526,18 +589,34 @@ class AIChatManager {
|
|
|
526
589
|
}
|
|
527
590
|
this.currentReply = '';
|
|
528
591
|
},
|
|
529
|
-
setToolStatus: (id,
|
|
592
|
+
setToolStatus: (id, metadata) => {
|
|
530
593
|
const existingIdx = this.displayMessages.findIndex((m) => m.role === 'tool' && m.tool_call_id === id);
|
|
531
594
|
if (existingIdx !== -1) {
|
|
532
|
-
|
|
595
|
+
// Update existing tool message with metadata
|
|
596
|
+
const existing = this.displayMessages[existingIdx];
|
|
597
|
+
if (existing.content.length === 0 && metadata?.error) {
|
|
598
|
+
this.displayMessages[existingIdx].content = metadata.error;
|
|
599
|
+
}
|
|
600
|
+
this.displayMessages[existingIdx] = {
|
|
601
|
+
...existing,
|
|
602
|
+
...(metadata || {})
|
|
603
|
+
};
|
|
533
604
|
}
|
|
534
605
|
else {
|
|
535
|
-
|
|
606
|
+
// Create new tool message with metadata
|
|
607
|
+
const newMessage = {
|
|
608
|
+
role: 'tool',
|
|
609
|
+
tool_call_id: id,
|
|
610
|
+
content: metadata?.content ?? metadata?.error ?? '',
|
|
611
|
+
...(metadata || {})
|
|
612
|
+
};
|
|
613
|
+
this.displayMessages.push(newMessage);
|
|
536
614
|
}
|
|
537
|
-
}
|
|
615
|
+
},
|
|
616
|
+
requestConfirmation: this.requestConfirmation
|
|
538
617
|
}
|
|
539
618
|
};
|
|
540
|
-
if (this.mode === AIMode.
|
|
619
|
+
if (this.mode === AIMode.API && this.apiTools.length === 0) {
|
|
541
620
|
await this.loadApiTools();
|
|
542
621
|
}
|
|
543
622
|
const addedMessages = await this.chatRequest({
|
|
@@ -561,6 +640,10 @@ class AIChatManager {
|
|
|
561
640
|
}
|
|
562
641
|
};
|
|
563
642
|
cancel = () => {
|
|
643
|
+
if (this.confirmationCallback) {
|
|
644
|
+
this.confirmationCallback(false);
|
|
645
|
+
this.confirmationCallback = undefined;
|
|
646
|
+
}
|
|
564
647
|
this.abortController?.abort();
|
|
565
648
|
};
|
|
566
649
|
restartGeneration = (displayMessageIndex, newContent) => {
|
|
@@ -598,6 +681,7 @@ class AIChatManager {
|
|
|
598
681
|
this.focusInput();
|
|
599
682
|
};
|
|
600
683
|
saveAndClear = async () => {
|
|
684
|
+
this.cancel();
|
|
601
685
|
await this.historyManager.save(this.displayMessages, this.messages);
|
|
602
686
|
this.displayMessages = [];
|
|
603
687
|
this.messages = [];
|
|
@@ -5,6 +5,7 @@ import { aiChatManager } from './AIChatManager.svelte';
|
|
|
5
5
|
import { Button } from '../../common';
|
|
6
6
|
import { RefreshCwIcon, Undo2Icon } from 'lucide-svelte';
|
|
7
7
|
import AIChatInput from './AIChatInput.svelte';
|
|
8
|
+
import ToolExecutionDisplay from './ToolExecutionDisplay.svelte';
|
|
8
9
|
let { message, messageIndex, availableContext, selectedContext = $bindable(), editingMessageIndex = $bindable(null) } = $props();
|
|
9
10
|
function editMessage() {
|
|
10
11
|
if (message.role !== 'user' || editingMessageIndex !== null || aiChatManager.loading) {
|
|
@@ -60,6 +61,8 @@ function editMessage() {
|
|
|
60
61
|
>
|
|
61
62
|
{#if message.role === 'assistant'}
|
|
62
63
|
<AssistantMessage {message} />
|
|
64
|
+
{:else if message.role === 'tool'}
|
|
65
|
+
<ToolExecutionDisplay message={message as ToolDisplayMessage} />
|
|
63
66
|
{:else}
|
|
64
67
|
{message.content}
|
|
65
68
|
{/if}
|
|
@@ -0,0 +1,84 @@
|
|
|
1
|
+
<script lang="ts">import { Loader2, Copy, Check } from 'lucide-svelte';
|
|
2
|
+
let { title, content, error, loading, showCopy = true, showWhileLoading = true } = $props();
|
|
3
|
+
let copied = $state(false);
|
|
4
|
+
const hasContent = $derived(content !== undefined && content !== null);
|
|
5
|
+
function formatJson(obj) {
|
|
6
|
+
try {
|
|
7
|
+
if (typeof obj === 'string') {
|
|
8
|
+
try {
|
|
9
|
+
const parsed = JSON.parse(obj);
|
|
10
|
+
return JSON.stringify(parsed, null, 2);
|
|
11
|
+
}
|
|
12
|
+
catch {
|
|
13
|
+
return obj;
|
|
14
|
+
}
|
|
15
|
+
}
|
|
16
|
+
return JSON.stringify(obj, null, 2);
|
|
17
|
+
}
|
|
18
|
+
catch {
|
|
19
|
+
return String(obj);
|
|
20
|
+
}
|
|
21
|
+
}
|
|
22
|
+
async function copyToClipboard() {
|
|
23
|
+
if (!hasContent)
|
|
24
|
+
return;
|
|
25
|
+
try {
|
|
26
|
+
await navigator.clipboard.writeText(formatJson(content));
|
|
27
|
+
copied = true;
|
|
28
|
+
setTimeout(() => (copied = false), 1500);
|
|
29
|
+
}
|
|
30
|
+
catch (err) {
|
|
31
|
+
console.error('Failed to copy:', err);
|
|
32
|
+
}
|
|
33
|
+
}
|
|
34
|
+
</script>
|
|
35
|
+
|
|
36
|
+
{#if showWhileLoading || (!loading && hasContent)}
|
|
37
|
+
<div class="space-y-2">
|
|
38
|
+
<div class="flex items-center justify-between">
|
|
39
|
+
<span class="text-secondary text-2xs font-semibold uppercase tracking-wide">
|
|
40
|
+
{title}:
|
|
41
|
+
</span>
|
|
42
|
+
{#if showCopy && hasContent}
|
|
43
|
+
<button
|
|
44
|
+
class="p-1 rounded hover:bg-surface-secondary text-tertiary hover:text-secondary transition-colors"
|
|
45
|
+
onclick={copyToClipboard}
|
|
46
|
+
title="Copy {title.toLowerCase()}"
|
|
47
|
+
>
|
|
48
|
+
{#if copied}
|
|
49
|
+
<Check class="w-3 h-3 text-green-500" />
|
|
50
|
+
{:else}
|
|
51
|
+
<Copy class="w-3 h-3" />
|
|
52
|
+
{/if}
|
|
53
|
+
</button>
|
|
54
|
+
{/if}
|
|
55
|
+
</div>
|
|
56
|
+
|
|
57
|
+
{#if loading}
|
|
58
|
+
<div
|
|
59
|
+
class="bg-surface-secondary border border-gray-200 dark:border-gray-700 rounded p-3 flex items-center gap-2 text-tertiary"
|
|
60
|
+
>
|
|
61
|
+
<Loader2 class="w-3 h-3 animate-spin" />
|
|
62
|
+
<span class="text-2xs">Executing...</span>
|
|
63
|
+
</div>
|
|
64
|
+
{:else if error}
|
|
65
|
+
<div
|
|
66
|
+
class="bg-red-50 dark:bg-red-900/20 border border-red-200 dark:border-red-800 rounded p-3 overflow-x-auto max-h-64 overflow-y-auto"
|
|
67
|
+
>
|
|
68
|
+
<pre class="text-2xs text-red-700 dark:text-red-300 whitespace-pre-wrap">{error}</pre>
|
|
69
|
+
</div>
|
|
70
|
+
{:else if hasContent}
|
|
71
|
+
<div
|
|
72
|
+
class="bg-surface-secondary border border-gray-200 dark:border-gray-700 rounded p-3 overflow-x-auto max-h-64 overflow-y-auto"
|
|
73
|
+
>
|
|
74
|
+
<pre class="text-2xs text-primary whitespace-pre-wrap">{formatJson(content)}</pre>
|
|
75
|
+
</div>
|
|
76
|
+
{:else}
|
|
77
|
+
<div
|
|
78
|
+
class="bg-surface-secondary border border-gray-200 dark:border-gray-700 rounded p-3 text-center"
|
|
79
|
+
>
|
|
80
|
+
<span class="text-2xs text-tertiary">No {title.toLowerCase()} yet</span>
|
|
81
|
+
</div>
|
|
82
|
+
{/if}
|
|
83
|
+
</div>
|
|
84
|
+
{/if}
|
|
@@ -0,0 +1,11 @@
|
|
|
1
|
+
interface Props {
|
|
2
|
+
title: string;
|
|
3
|
+
content?: any;
|
|
4
|
+
error?: string;
|
|
5
|
+
loading?: boolean;
|
|
6
|
+
showCopy?: boolean;
|
|
7
|
+
showWhileLoading?: boolean;
|
|
8
|
+
}
|
|
9
|
+
declare const ToolContentDisplay: import("svelte").Component<Props, {}, "">;
|
|
10
|
+
type ToolContentDisplay = ReturnType<typeof ToolContentDisplay>;
|
|
11
|
+
export default ToolContentDisplay;
|
|
@@ -0,0 +1,105 @@
|
|
|
1
|
+
<script lang="ts">import { Loader2, ChevronDown, ChevronRight, XCircle, Play } from 'lucide-svelte';
|
|
2
|
+
import { Button } from '../../common';
|
|
3
|
+
import { aiChatManager } from './AIChatManager.svelte';
|
|
4
|
+
import { twMerge } from 'tailwind-merge';
|
|
5
|
+
import ToolContentDisplay from './ToolContentDisplay.svelte';
|
|
6
|
+
let { message } = $props();
|
|
7
|
+
let isExpanded = $state(message.showDetails || (message.isLoading && message.needsConfirmation));
|
|
8
|
+
const hasParameters = $derived(message.parameters !== undefined && Object.keys(message.parameters).length > 0);
|
|
9
|
+
</script>
|
|
10
|
+
|
|
11
|
+
<div
|
|
12
|
+
class="bg-surface border border-gray-200 dark:border-gray-700 rounded-md overflow-hidden font-mono text-xs"
|
|
13
|
+
>
|
|
14
|
+
<!-- Collapsible Header -->
|
|
15
|
+
<button
|
|
16
|
+
class={twMerge(
|
|
17
|
+
"w-full p-3 bg-surface-secondary hover:bg-surface-hover transition-colors flex items-center justify-between text-left border-b border-gray-200 dark:border-gray-700",
|
|
18
|
+
message.needsConfirmation ? "opacity-80" : ""
|
|
19
|
+
)}
|
|
20
|
+
onclick={() => (isExpanded = !isExpanded)}
|
|
21
|
+
disabled={!message.showDetails}
|
|
22
|
+
>
|
|
23
|
+
<div class="flex items-center gap-2 flex-1">
|
|
24
|
+
{#if message.showDetails}
|
|
25
|
+
{#if isExpanded}
|
|
26
|
+
<ChevronDown class="w-3 h-3 text-secondary" />
|
|
27
|
+
{:else}
|
|
28
|
+
<ChevronRight class="w-3 h-3 text-secondary" />
|
|
29
|
+
{/if}
|
|
30
|
+
{/if}
|
|
31
|
+
|
|
32
|
+
{#if message.isLoading && !message.needsConfirmation}
|
|
33
|
+
<Loader2 class="w-3.5 h-3.5 animate-spin text-blue-500" />
|
|
34
|
+
{:else if message.error}
|
|
35
|
+
<span class="text-red-500">✗</span>
|
|
36
|
+
{:else if !message.isLoading && !message.error}
|
|
37
|
+
<span class="text-green-500">✓</span>
|
|
38
|
+
{/if}
|
|
39
|
+
<span class="text-primary font-medium text-2xs">
|
|
40
|
+
{message.content}
|
|
41
|
+
</span>
|
|
42
|
+
</div>
|
|
43
|
+
</button>
|
|
44
|
+
|
|
45
|
+
<!-- Expanded Content -->
|
|
46
|
+
{#if isExpanded}
|
|
47
|
+
<div class="p-3 bg-surface space-y-3">
|
|
48
|
+
<!-- Parameters Section -->
|
|
49
|
+
<div class={message.needsConfirmation ? "opacity-80" : ""}>
|
|
50
|
+
<ToolContentDisplay title="Parameters" content={message.parameters} />
|
|
51
|
+
</div>
|
|
52
|
+
|
|
53
|
+
<!-- Confirmation Footer -->
|
|
54
|
+
{#if message.needsConfirmation}
|
|
55
|
+
<div
|
|
56
|
+
class={twMerge(
|
|
57
|
+
'mt-3 pt-3 flex flex-row items-center justify-end gap-2',
|
|
58
|
+
hasParameters ? 'border-t border-gray-200 dark:border-gray-700' : ''
|
|
59
|
+
)}
|
|
60
|
+
>
|
|
61
|
+
<Button
|
|
62
|
+
variant="border"
|
|
63
|
+
color="gray"
|
|
64
|
+
size="xs"
|
|
65
|
+
on:click={() => {
|
|
66
|
+
if (message.tool_call_id) {
|
|
67
|
+
aiChatManager.handleToolConfirmation(message.tool_call_id, false)
|
|
68
|
+
}
|
|
69
|
+
}}
|
|
70
|
+
startIcon={{ icon: XCircle }}
|
|
71
|
+
></Button>
|
|
72
|
+
<Button
|
|
73
|
+
variant="border"
|
|
74
|
+
color="green"
|
|
75
|
+
size="xs"
|
|
76
|
+
on:click={() => {
|
|
77
|
+
if (message.tool_call_id) {
|
|
78
|
+
aiChatManager.handleToolConfirmation(message.tool_call_id, true)
|
|
79
|
+
}
|
|
80
|
+
}}
|
|
81
|
+
startIcon={{ icon: Play }}
|
|
82
|
+
>
|
|
83
|
+
Run
|
|
84
|
+
</Button>
|
|
85
|
+
</div>
|
|
86
|
+
|
|
87
|
+
<!-- Result Section -->
|
|
88
|
+
{:else}
|
|
89
|
+
<ToolContentDisplay
|
|
90
|
+
title="Logs"
|
|
91
|
+
content={message.logs}
|
|
92
|
+
loading={message.isLoading}
|
|
93
|
+
showWhileLoading={false}
|
|
94
|
+
/>
|
|
95
|
+
|
|
96
|
+
<ToolContentDisplay
|
|
97
|
+
title="Result"
|
|
98
|
+
content={message.result}
|
|
99
|
+
error={message.error}
|
|
100
|
+
loading={message.isLoading}
|
|
101
|
+
/>
|
|
102
|
+
{/if}
|
|
103
|
+
</div>
|
|
104
|
+
{/if}
|
|
105
|
+
</div>
|
|
@@ -0,0 +1,7 @@
|
|
|
1
|
+
import type { ToolDisplayMessage } from './shared';
|
|
2
|
+
interface Props {
|
|
3
|
+
message: ToolDisplayMessage;
|
|
4
|
+
}
|
|
5
|
+
declare const ToolExecutionDisplay: import("svelte").Component<Props, {}, "">;
|
|
6
|
+
type ToolExecutionDisplay = ReturnType<typeof ToolExecutionDisplay>;
|
|
7
|
+
export default ToolExecutionDisplay;
|
|
@@ -0,0 +1,7 @@
|
|
|
1
|
+
import type { ChatCompletionTool } from 'openai/resources/index.mjs';
|
|
2
|
+
import type { Tool } from '../shared';
|
|
3
|
+
export declare function createApiTools(chatTools: ChatCompletionTool[], endpointMap?: Record<string, {
|
|
4
|
+
method: string;
|
|
5
|
+
path: string;
|
|
6
|
+
}>): Tool<{}>[];
|
|
7
|
+
export declare function loadApiTools(): Promise<Tool<{}>[]>;
|