windmill-components 1.687.0 → 1.695.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/ArgInput.svelte +2 -0
- package/package/components/AutoscalingConfigEditor.svelte +18 -4
- package/package/components/CompareWorkspaces.svelte +206 -157
- package/package/components/DatatableSchemaDiff.svelte +2 -2
- package/package/components/Dev.svelte +401 -85
- package/package/components/EditableSchemaForm.svelte +4 -0
- package/package/components/ErrorOrRecoveryHandler.svelte +2 -2
- package/package/components/FlowPreviewContent.svelte +32 -30
- package/package/components/FlowRestartButton.svelte +143 -61
- package/package/components/FlowRestartButton.svelte.d.ts +37 -0
- package/package/components/FlowStatusViewer.svelte +15 -1
- package/package/components/FlowStatusViewer.svelte.d.ts +10 -2
- package/package/components/FlowStatusViewerInner.svelte +1 -2
- package/package/components/FlowStatusViewerInner.svelte.d.ts +6 -2
- package/package/components/ForkConflictModal.svelte +57 -0
- package/package/components/ForkConflictModal.svelte.d.ts +3 -0
- package/package/components/GitRepoViewer.svelte +251 -97
- package/package/components/InputTransformSchemaForm.svelte +1 -1
- package/package/components/InstanceSettings.svelte +36 -16
- package/package/components/Login.svelte +113 -28
- package/package/components/Login.svelte.d.ts +1 -0
- package/package/components/Path.svelte +7 -1
- package/package/components/Path.svelte.d.ts +1 -1
- package/package/components/RunsPage.svelte +2 -1
- package/package/components/S3FilePickerInner.svelte +89 -89
- package/package/components/ScriptEditor.svelte +18 -5
- package/package/components/ShareModal.svelte.d.ts +1 -1
- package/package/components/apps/components/helpers/RunnableComponent.svelte.d.ts +3 -0
- package/package/components/apps/components/helpers/executeRunnable.js +2 -1
- package/package/components/apps/editor/AppReportsDrawerInner.svelte +1 -1
- package/package/components/apps/editor/appPolicy.js +2 -1
- package/package/components/apps/editor/commonAppUtils.d.ts +3 -0
- package/package/components/apps/editor/inlineScriptsPanel/CacheTtlPopup.svelte +1 -1
- package/package/components/apps/editor/inlineScriptsPanel/InlineScriptEditor.svelte +7 -0
- package/package/components/apps/editor/inlineScriptsPanel/TagPopup.svelte +49 -0
- package/package/components/apps/editor/inlineScriptsPanel/TagPopup.svelte.d.ts +9 -0
- package/package/components/apps/inputType.d.ts +1 -0
- package/package/components/apps/sharedTypes.d.ts +1 -0
- package/package/components/auditLogs/AuditLogsFilters.svelte +8 -3
- package/package/components/common/fileUpload/S3ArgInput.svelte +12 -10
- package/package/components/common/fileUpload/S3ArgInput.svelte.d.ts +2 -0
- package/package/components/copilot/chat/AIChatDisplay.svelte +5 -36
- package/package/components/copilot/chat/AIChatInput.svelte +56 -47
- package/package/components/copilot/chat/AIChatManager.svelte.js +48 -46
- package/package/components/copilot/chat/ContextElementBadge.svelte +6 -4
- package/package/components/copilot/chat/app/core.d.ts +12 -20
- package/package/components/copilot/chat/app/core.js +103 -160
- package/package/components/copilot/chat/app/core.test.js +234 -9
- package/package/components/copilot/chat/context.js +44 -0
- package/package/components/copilot/chat/flow/FlowAIChat.svelte +5 -3
- package/package/components/copilot/chat/flow/core.d.ts +2 -1
- package/package/components/copilot/chat/flow/core.js +48 -21
- package/package/components/copilot/chat/flow/helperUtils.d.ts +5 -2
- package/package/components/copilot/chat/flow/helperUtils.js +33 -1
- package/package/components/copilot/chat/flow/helperUtils.test.js +116 -1
- package/package/components/copilot/chat/flow/openFlow.json +1 -1
- package/package/components/copilot/chat/flow/openFlowZod.gen.js +24 -0
- package/package/components/copilot/chat/script/core.js +3 -0
- package/package/components/copilot/chat/shared.d.ts +6 -0
- package/package/components/copilot/chat/shared.js +22 -1
- package/package/components/copilot/chat/shared.test.d.ts +1 -0
- package/package/components/copilot/chat/shared.test.js +412 -0
- package/package/components/copilot/chat/workspaceTools.d.ts +7 -0
- package/package/components/copilot/chat/workspaceTools.js +239 -0
- package/package/components/copilot/chat/workspaceToolsZod.gen.d.ts +1295 -0
- package/package/components/copilot/chat/workspaceToolsZod.gen.js +424 -0
- package/package/components/copilot/lib.js +3 -1
- package/package/components/copilot/lib.test.d.ts +1 -0
- package/package/components/copilot/lib.test.js +19 -0
- package/package/components/copilot/modelConfig.d.ts +3 -0
- package/package/components/copilot/modelConfig.js +10 -0
- package/package/components/flows/FlowProgressBar.svelte +5 -2
- package/package/components/flows/content/FlowModuleComponent.svelte +636 -599
- package/package/components/flows/conversations/FlowChatManager.svelte.js +21 -10
- package/package/components/flows/flowStateUtils.svelte.js +5 -1
- package/package/components/flows/map/FlowModuleSchemaMap.svelte +3 -2
- package/package/components/flows/map/FlowModuleSchemaMap.svelte.d.ts +1 -0
- package/package/components/git_sync/GitSyncContext.svelte.js +0 -2
- package/package/components/graph/FlowGraphV2.svelte +7 -3
- package/package/components/graph/FlowGraphV2.svelte.d.ts +1 -0
- package/package/components/graph/renderers/triggers/TriggersBadge.svelte +3 -0
- package/package/components/home/deploy_ui.js +1 -1
- package/package/components/icons/AzureIcon.svelte +12 -25
- package/package/components/icons/AzureIcon.svelte.d.ts +3 -2
- package/package/components/instanceSettings.js +24 -0
- package/package/components/mcp/McpScopeSelector.svelte +119 -9
- package/package/components/mcp/McpScopeSelector.svelte.d.ts +1 -0
- package/package/components/offboarding-utils.js +2 -0
- package/package/components/progressBar/ProgressBar.svelte +9 -5
- package/package/components/progressBar/ProgressBar.svelte.d.ts +1 -0
- package/package/components/raw_apps/DeleteAfterUsePopup.svelte +52 -0
- package/package/components/raw_apps/DeleteAfterUsePopup.svelte.d.ts +9 -0
- package/package/components/raw_apps/RawAppBackgroundRunner.svelte +5 -1
- package/package/components/raw_apps/RawAppEditor.svelte +159 -102
- package/package/components/raw_apps/RawAppInlineScriptEditor.svelte +9 -3
- package/package/components/raw_apps/RawAppInlineScriptEditor.svelte.d.ts +2 -1
- package/package/components/raw_apps/RawAppInlineScriptRunnable.svelte +1 -0
- package/package/components/raw_apps/RawAppInlineScriptRunnable.svelte.d.ts +1 -0
- package/package/components/raw_apps/RawAppInputsSpecEditor.svelte +48 -5
- package/package/components/raw_apps/RawAppSharedUiDrawer.svelte +129 -0
- package/package/components/raw_apps/RawAppSharedUiDrawer.svelte.d.ts +5 -0
- package/package/components/raw_apps/RawAppSidebar.svelte +12 -0
- package/package/components/raw_apps/dataTableRefUtils.d.ts +7 -0
- package/package/components/raw_apps/dataTableRefUtils.js +34 -0
- package/package/components/raw_apps/dataTableRefUtils.test.d.ts +1 -0
- package/package/components/raw_apps/dataTableRefUtils.test.js +29 -0
- package/package/components/raw_apps/rawAppPolicy.d.ts +1 -0
- package/package/components/raw_apps/rawAppPolicy.js +17 -2
- package/package/components/resources/resourceTypesFilter.d.ts +19 -0
- package/package/components/resources/resourceTypesFilter.js +21 -0
- package/package/components/restartFromStepPath.d.ts +39 -0
- package/package/components/restartFromStepPath.js +89 -0
- package/package/components/runs/JobDetailFieldConfig.d.ts +1 -0
- package/package/components/runs/JobDetailFieldConfig.js +57 -10
- package/package/components/runs/JobDetailHeader.svelte +24 -3
- package/package/components/runs/runsFilter.d.ts +1 -1
- package/package/components/schema/FlowPropertyEditor.svelte +30 -1
- package/package/components/schema/FlowPropertyEditor.svelte.d.ts +5 -2
- package/package/components/search/GlobalSearchModal.svelte +8 -1
- package/package/components/select/Select.svelte +1 -1
- package/package/components/settings/CreateToken.svelte +48 -77
- package/package/components/settings/EditTokenScopesModal.svelte +57 -0
- package/package/components/settings/EditTokenScopesModal.svelte.d.ts +10 -0
- package/package/components/settings/ScopesPicker.svelte +43 -0
- package/package/components/settings/ScopesPicker.svelte.d.ts +11 -0
- package/package/components/settings/TokensTable.svelte +51 -15
- package/package/components/sidebar/OperatorMenu.svelte +6 -0
- package/package/components/sidebar/SidebarContent.svelte +11 -1
- package/package/components/triggers/AddTriggersButton.svelte +6 -0
- package/package/components/triggers/CaptureWrapper.svelte +19 -1
- package/package/components/triggers/TriggerEditorToolbar.svelte.d.ts +1 -1
- package/package/components/triggers/TriggerModeToggle.svelte +36 -7
- package/package/components/triggers/TriggerModeToggle.svelte.d.ts +1 -1
- package/package/components/triggers/TriggerSuspendedJobsModal.svelte.d.ts +1 -1
- package/package/components/triggers/TriggersEditor.svelte +5 -1
- package/package/components/triggers/TriggersWrapper.svelte +10 -0
- package/package/components/triggers/azure/AzureCapture.svelte +41 -0
- package/package/components/triggers/azure/AzureCapture.svelte.d.ts +44 -0
- package/package/components/triggers/azure/AzureTriggerEditor.svelte +20 -0
- package/package/components/triggers/azure/AzureTriggerEditor.svelte.d.ts +9 -0
- package/package/components/triggers/azure/AzureTriggerEditorConfigSection.svelte +301 -0
- package/package/components/triggers/azure/AzureTriggerEditorConfigSection.svelte.d.ts +16 -0
- package/package/components/triggers/azure/AzureTriggerEditorInner.svelte +422 -0
- package/package/components/triggers/azure/AzureTriggerEditorInner.svelte.d.ts +25 -0
- package/package/components/triggers/azure/AzureTriggerPanel.svelte +55 -0
- package/package/components/triggers/azure/AzureTriggerPanel.svelte.d.ts +10 -0
- package/{dist/sharedUtils/components/triggers/kafka → package/components/triggers/azure}/utils.d.ts +1 -1
- package/package/components/triggers/azure/utils.js +56 -0
- package/package/components/triggers/email/EmailTriggerEditorInner.svelte +2 -0
- package/package/components/triggers/gcp/GcpTriggerEditorInner.svelte +9 -3
- package/package/components/triggers/http/RouteEditorInner.svelte +2 -0
- package/package/components/triggers/kafka/KafkaTriggerEditorInner.svelte +9 -3
- package/package/components/triggers/mqtt/MqttTriggerEditorInner.svelte +9 -3
- package/package/components/triggers/nats/NatsTriggerEditorInner.svelte +9 -3
- package/package/components/triggers/postgres/PostgresTriggerEditorInner.svelte +9 -3
- package/package/components/triggers/schedules/ScheduleEditorInner.svelte +9 -3
- package/package/components/triggers/sqs/SqsTriggerEditorInner.svelte +9 -3
- package/package/components/triggers/triggers.svelte.d.ts +1 -0
- package/package/components/triggers/triggers.svelte.js +23 -1
- package/package/components/triggers/utils.js +20 -0
- package/package/components/triggers/websocket/WebsocketTriggerEditorInner.svelte +9 -3
- package/package/components/triggers.d.ts +1 -1
- package/package/components/useNestedRestartState.svelte.d.ts +56 -0
- package/package/components/useNestedRestartState.svelte.js +320 -0
- package/package/components/workspaceSettings/SharedUiSettings.svelte +175 -0
- package/package/components/workspaceSettings/SharedUiSettings.svelte.d.ts +3 -0
- package/package/gen/core/OpenAPI.js +1 -1
- package/package/gen/schemas.gen.d.ts +294 -24
- package/package/gen/schemas.gen.js +297 -25
- package/package/gen/services.gen.d.ts +247 -4
- package/package/gen/services.gen.js +498 -7
- package/package/gen/types.gen.d.ts +990 -37
- package/package/hubPaths.json +2 -5
- package/package/infer.d.ts +1 -1
- package/package/infer.js +37 -51
- package/package/mcpEndpointTools.js +60 -4
- package/package/script_helpers.js +17 -0
- package/package/stores.d.ts +7 -0
- package/package/stores.js +6 -1
- package/package/system_prompts/index.d.ts +1 -0
- package/package/system_prompts/index.js +8 -0
- package/package/system_prompts/prompts.d.ts +16 -13
- package/package/system_prompts/prompts.js +653 -43
- package/package/templates/ci_test_bun.ts.template +8 -0
- package/package/templates/ci_test_python.py.template +8 -0
- package/package/utils/forkConflict.d.ts +26 -0
- package/package/utils/forkConflict.js +56 -0
- package/package/utils_deployable.d.ts +164 -121
- package/package/utils_deployable.js +61 -11
- package/package/utils_workspace_deploy.js +3 -1
- package/package.json +29 -5
- package/dist/sharedUtils/assets/tokens/colorTokensConfig.d.ts +0 -2
- package/dist/sharedUtils/base.d.ts +0 -1
- package/dist/sharedUtils/cloud.d.ts +0 -1
- package/dist/sharedUtils/common.d.ts +0 -111
- package/dist/sharedUtils/components/apps/components/display/dbtable/queries/count.d.ts +0 -5
- package/dist/sharedUtils/components/apps/components/display/dbtable/queries/delete.d.ts +0 -5
- package/dist/sharedUtils/components/apps/components/display/dbtable/queries/insert.d.ts +0 -5
- package/dist/sharedUtils/components/apps/components/display/dbtable/queries/select.d.ts +0 -13
- package/dist/sharedUtils/components/apps/components/display/dbtable/queries/update.d.ts +0 -11
- package/dist/sharedUtils/components/apps/components/display/dbtable/utils.d.ts +0 -95
- package/dist/sharedUtils/components/apps/editor/appPolicy.d.ts +0 -6
- package/dist/sharedUtils/components/apps/editor/appUtilsCore.d.ts +0 -7
- package/dist/sharedUtils/components/apps/editor/appUtilsS3.d.ts +0 -33
- package/dist/sharedUtils/components/apps/editor/commonAppUtils.d.ts +0 -10
- package/dist/sharedUtils/components/apps/editor/component/components.d.ts +0 -5371
- package/dist/sharedUtils/components/apps/editor/component/default-codes.d.ts +0 -3
- package/dist/sharedUtils/components/apps/editor/component/index.d.ts +0 -3
- package/dist/sharedUtils/components/apps/editor/component/sets.d.ts +0 -7
- package/dist/sharedUtils/components/apps/editor/componentsPanel/componentDefaultProps.d.ts +0 -3
- package/dist/sharedUtils/components/apps/gridUtils.d.ts +0 -14
- package/dist/sharedUtils/components/apps/inputType.d.ts +0 -178
- package/dist/sharedUtils/components/apps/rx.d.ts +0 -29
- package/dist/sharedUtils/components/apps/sharedTypes.d.ts +0 -21
- package/dist/sharedUtils/components/apps/types.d.ts +0 -274
- package/dist/sharedUtils/components/assets/lib.d.ts +0 -25
- package/dist/sharedUtils/components/common/alert/model.d.ts +0 -2
- package/dist/sharedUtils/components/common/badge/model.d.ts +0 -8
- package/dist/sharedUtils/components/common/button/model.d.ts +0 -45
- package/dist/sharedUtils/components/common/fileInput/model.d.ts +0 -1
- package/dist/sharedUtils/components/common/index.d.ts +0 -24
- package/dist/sharedUtils/components/common/skeleton/model.d.ts +0 -21
- package/dist/sharedUtils/components/dbTypes.d.ts +0 -14
- package/dist/sharedUtils/components/diff_drawer.d.ts +0 -26
- package/dist/sharedUtils/components/ducklake.d.ts +0 -1
- package/dist/sharedUtils/components/flows/scheduleUtils.d.ts +0 -7
- package/dist/sharedUtils/components/icons/index.d.ts +0 -101
- package/dist/sharedUtils/components/random_positive_adjetive.d.ts +0 -1
- package/dist/sharedUtils/components/raw_apps/rawAppPolicy.d.ts +0 -10
- package/dist/sharedUtils/components/raw_apps/utils.d.ts +0 -15
- package/dist/sharedUtils/components/triggers/email/utils.d.ts +0 -4
- package/dist/sharedUtils/components/triggers/gcp/utils.d.ts +0 -2
- package/dist/sharedUtils/components/triggers/http/utils.d.ts +0 -11
- package/dist/sharedUtils/components/triggers/mqtt/utils.d.ts +0 -2
- package/dist/sharedUtils/components/triggers/nats/utils.d.ts +0 -2
- package/dist/sharedUtils/components/triggers/postgres/utils.d.ts +0 -8
- package/dist/sharedUtils/components/triggers/sqs/utils.d.ts +0 -2
- package/dist/sharedUtils/components/triggers/triggers.svelte.d.ts +0 -32
- package/dist/sharedUtils/components/triggers/utils.d.ts +0 -80
- package/dist/sharedUtils/components/triggers/websocket/utils.d.ts +0 -2
- package/dist/sharedUtils/components/triggers.d.ts +0 -20
- package/dist/sharedUtils/gen/core/ApiError.d.ts +0 -10
- package/dist/sharedUtils/gen/core/ApiRequestOptions.d.ts +0 -13
- package/dist/sharedUtils/gen/core/ApiResult.d.ts +0 -7
- package/dist/sharedUtils/gen/core/CancelablePromise.d.ts +0 -26
- package/dist/sharedUtils/gen/core/OpenAPI.d.ts +0 -27
- package/dist/sharedUtils/gen/core/request.d.ts +0 -29
- package/dist/sharedUtils/gen/index.d.ts +0 -6
- package/dist/sharedUtils/gen/schemas.gen.d.ts +0 -7036
- package/dist/sharedUtils/gen/services.gen.d.ts +0 -6047
- package/dist/sharedUtils/gen/types.gen.d.ts +0 -21881
- package/dist/sharedUtils/history.svelte.d.ts +0 -9
- package/dist/sharedUtils/hub.d.ts +0 -49
- package/dist/sharedUtils/jsr.json +0 -6
- package/dist/sharedUtils/lib.d.ts +0 -5
- package/dist/sharedUtils/lib.es.js +0 -1588
- package/dist/sharedUtils/package.json +0 -12
- package/dist/sharedUtils/schema.d.ts +0 -3
- package/dist/sharedUtils/stores.d.ts +0 -97
- package/dist/sharedUtils/svelte5Utils.svelte.d.ts +0 -80
- package/dist/sharedUtils/toast.d.ts +0 -8
- package/dist/sharedUtils/utils.d.ts +0 -265
- package/package/components/copilot/chat/flow/openFlowZod.js +0 -24
- /package/package/components/copilot/chat/flow/{openFlowZod.d.ts → openFlowZod.gen.d.ts} +0 -0
|
@@ -0,0 +1,49 @@
|
|
|
1
|
+
<script lang="ts">import { Button } from '../../../common';
|
|
2
|
+
import { Tag } from 'lucide-svelte';
|
|
3
|
+
import Popover from '../../../meltComponents/Popover.svelte';
|
|
4
|
+
import { autoPlacement } from '@floating-ui/core';
|
|
5
|
+
import WorkerTagSelect from '../../../WorkerTagSelect.svelte';
|
|
6
|
+
let { tag = $bindable(), btnProps } = $props();
|
|
7
|
+
$effect(() => {
|
|
8
|
+
if (tag === '')
|
|
9
|
+
tag = undefined;
|
|
10
|
+
});
|
|
11
|
+
</script>
|
|
12
|
+
|
|
13
|
+
<Popover
|
|
14
|
+
floatingConfig={{
|
|
15
|
+
middleware: [
|
|
16
|
+
autoPlacement({
|
|
17
|
+
allowedPlacements: ['bottom-start', 'bottom-end', 'top-start', 'top-end', 'top', 'bottom']
|
|
18
|
+
})
|
|
19
|
+
]
|
|
20
|
+
}}
|
|
21
|
+
closeButton
|
|
22
|
+
contentClasses="block text-primary p-3 w-56"
|
|
23
|
+
>
|
|
24
|
+
{#snippet trigger()}
|
|
25
|
+
<Button
|
|
26
|
+
nonCaptureEvent={true}
|
|
27
|
+
btnClasses={tag
|
|
28
|
+
? 'bg-blue-100 text-blue-800 border border-blue-300 hover:bg-blue-200 dark:bg-frost-700 dark:text-frost-100 dark:border-frost-600'
|
|
29
|
+
: 'bg-surface text-primary hover:bg-hover'}
|
|
30
|
+
color="light"
|
|
31
|
+
variant="contained"
|
|
32
|
+
size="xs2"
|
|
33
|
+
iconOnly
|
|
34
|
+
startIcon={{ icon: Tag }}
|
|
35
|
+
title={tag ? `Worker tag: ${tag}` : 'Assign a worker tag'}
|
|
36
|
+
{...btnProps}
|
|
37
|
+
/>
|
|
38
|
+
{/snippet}
|
|
39
|
+
{#snippet content()}
|
|
40
|
+
<div class="flex flex-col gap-2">
|
|
41
|
+
<span class="text-xs font-bold">Worker tag</span>
|
|
42
|
+
<span class="text-2xs text-tertiary">
|
|
43
|
+
Assign a worker tag to run this inline script on a specific worker group. Leave empty to use
|
|
44
|
+
the language default.
|
|
45
|
+
</span>
|
|
46
|
+
<WorkerTagSelect bind:tag noLabel placeholder="lang default" />
|
|
47
|
+
</div>
|
|
48
|
+
{/snippet}
|
|
49
|
+
</Popover>
|
|
@@ -0,0 +1,9 @@
|
|
|
1
|
+
import { Button } from '../../../common';
|
|
2
|
+
import type { ComponentProps } from 'svelte';
|
|
3
|
+
interface Props {
|
|
4
|
+
tag: string | undefined;
|
|
5
|
+
btnProps?: ComponentProps<typeof Button>;
|
|
6
|
+
}
|
|
7
|
+
declare const TagPopup: import("svelte").Component<Props, {}, "tag">;
|
|
8
|
+
type TagPopup = ReturnType<typeof TagPopup>;
|
|
9
|
+
export default TagPopup;
|
|
@@ -253,7 +253,7 @@ $effect(() => {
|
|
|
253
253
|
});
|
|
254
254
|
</script>
|
|
255
255
|
|
|
256
|
-
<div class="flex flex-col
|
|
256
|
+
<div class="flex flex-col gap-8 2xl:gap-2 2xl:flex-row mt-4 xl:mt-0 pr-2">
|
|
257
257
|
{#if $workspaceStore == 'admins'}
|
|
258
258
|
<div class="flex gap-1 relative">
|
|
259
259
|
<span class="text-xs absolute font-semibold text-emphasis -top-4">Scope</span>
|
|
@@ -286,7 +286,7 @@ $effect(() => {
|
|
|
286
286
|
</ToggleButtonGroup>
|
|
287
287
|
</div>
|
|
288
288
|
{/if}
|
|
289
|
-
<div class="flex relative">
|
|
289
|
+
<div class="flex relative bg-surface-input">
|
|
290
290
|
<span class="text-xs absolute font-semibold text-emphasis -top-4">From</span>
|
|
291
291
|
<input type="text" value={after ?? 'From'} disabled />
|
|
292
292
|
<CalendarPicker
|
|
@@ -302,7 +302,7 @@ $effect(() => {
|
|
|
302
302
|
}}
|
|
303
303
|
/>
|
|
304
304
|
</div>
|
|
305
|
-
<div class="flex relative">
|
|
305
|
+
<div class="flex relative bg-surface-input">
|
|
306
306
|
<span class="text-xs absolute font-semibold text-emphasis -top-4">To</span>
|
|
307
307
|
<input type="text" value={before ?? 'To'} disabled />
|
|
308
308
|
<CalendarPicker
|
|
@@ -322,6 +322,7 @@ $effect(() => {
|
|
|
322
322
|
<div class="flex relative">
|
|
323
323
|
<span class="text-xs absolute font-semibold text-emphasis -top-4">Username</span>
|
|
324
324
|
<Select
|
|
325
|
+
class="w-full"
|
|
325
326
|
bind:value={username}
|
|
326
327
|
RightIcon={ChevronDown}
|
|
327
328
|
items={usernames
|
|
@@ -342,6 +343,7 @@ $effect(() => {
|
|
|
342
343
|
<span class="text-xs absolute font-semibold text-emphasis -top-4">Resource</span>
|
|
343
344
|
|
|
344
345
|
<Select
|
|
346
|
+
class="w-full"
|
|
345
347
|
onCreateItem={(r) => (resources.value?.push(r), (resource = r))}
|
|
346
348
|
createText="Press enter to use this value"
|
|
347
349
|
bind:value={resource}
|
|
@@ -355,6 +357,7 @@ $effect(() => {
|
|
|
355
357
|
<span class="text-xs absolute font-semibold text-emphasis -top-4">Operation</span>
|
|
356
358
|
|
|
357
359
|
<Select
|
|
360
|
+
class="w-full"
|
|
358
361
|
bind:value={operation}
|
|
359
362
|
items={['all', ...Object.values(operations)].map((r) => ({ value: r, label: r }))}
|
|
360
363
|
inputClass="dark:!bg-gray-700"
|
|
@@ -366,6 +369,7 @@ $effect(() => {
|
|
|
366
369
|
<span class="text-xs absolute font-semibold text-emphasis -top-4">Action</span>
|
|
367
370
|
|
|
368
371
|
<Select
|
|
372
|
+
class="w-full"
|
|
369
373
|
bind:value={actionKind}
|
|
370
374
|
RightIcon={ChevronDown}
|
|
371
375
|
items={[
|
|
@@ -410,6 +414,7 @@ $effect(() => {
|
|
|
410
414
|
refresh++
|
|
411
415
|
}}
|
|
412
416
|
unifiedSize="md"
|
|
417
|
+
wrapperClasses="ml-auto"
|
|
413
418
|
>
|
|
414
419
|
<div class="flex flex-row gap-1 items-center">
|
|
415
420
|
{#if loading}
|
|
@@ -4,13 +4,13 @@ import { Loader2, Pipette } from 'lucide-svelte';
|
|
|
4
4
|
import FileUpload from './FileUpload.svelte';
|
|
5
5
|
import Button from '../button/Button.svelte';
|
|
6
6
|
import { userStore } from '../../../stores';
|
|
7
|
-
let { multiple, value = $bindable(), defaultValue, setNewValueFromCode, onFocus, onBlur, computeS3ForceViewerPolicies, workspace, editor = $bindable(), appPath, bottom } = $props();
|
|
7
|
+
let { multiple, value = $bindable(), defaultValue, setNewValueFromCode, onFocus, onBlur, computeS3ForceViewerPolicies, workspace, editor = $bindable(), appPath, bottom, hideCatalogPicker = false, hideRawInput = false } = $props();
|
|
8
8
|
let s3FileUploadRawMode = $state(false);
|
|
9
9
|
let s3FilePicker = $state(undefined);
|
|
10
10
|
let fileUpload = $state(undefined);
|
|
11
11
|
</script>
|
|
12
12
|
|
|
13
|
-
{#if $userStore}
|
|
13
|
+
{#if $userStore && !hideCatalogPicker}
|
|
14
14
|
<S3FilePicker
|
|
15
15
|
bind:this={s3FilePicker}
|
|
16
16
|
onSelectAndClose={(selected) => {
|
|
@@ -88,7 +88,7 @@ let fileUpload = $state(undefined);
|
|
|
88
88
|
initialValue={value}
|
|
89
89
|
/>
|
|
90
90
|
{/if}
|
|
91
|
-
{#if $userStore}
|
|
91
|
+
{#if $userStore && !hideCatalogPicker}
|
|
92
92
|
<Button
|
|
93
93
|
variant="default"
|
|
94
94
|
size="xs"
|
|
@@ -102,11 +102,13 @@ let fileUpload = $state(undefined);
|
|
|
102
102
|
</Button>
|
|
103
103
|
{/if}
|
|
104
104
|
{@render bottom?.()}
|
|
105
|
-
|
|
106
|
-
|
|
107
|
-
|
|
108
|
-
|
|
109
|
-
|
|
110
|
-
|
|
111
|
-
|
|
105
|
+
{#if !hideRawInput}
|
|
106
|
+
<Toggle
|
|
107
|
+
class="mt-1"
|
|
108
|
+
textClass="font-normal text-hint"
|
|
109
|
+
bind:checked={s3FileUploadRawMode}
|
|
110
|
+
size="xs"
|
|
111
|
+
options={{ right: `Raw S3 object${multiple ? 's' : ''} input` }}
|
|
112
|
+
/>
|
|
113
|
+
{/if}
|
|
112
114
|
</div>
|
|
@@ -16,6 +16,8 @@ type $$ComponentProps = {
|
|
|
16
16
|
editor: SimpleEditor | undefined;
|
|
17
17
|
appPath: string | undefined;
|
|
18
18
|
bottom?: import('svelte').Snippet;
|
|
19
|
+
hideCatalogPicker?: boolean;
|
|
20
|
+
hideRawInput?: boolean;
|
|
19
21
|
};
|
|
20
22
|
declare const S3ArgInput: import("svelte").Component<$$ComponentProps, {}, "value" | "editor">;
|
|
21
23
|
type S3ArgInput = ReturnType<typeof S3ArgInput>;
|
|
@@ -1,6 +1,6 @@
|
|
|
1
1
|
<script lang="ts">import AIChatMessage from './AIChatMessage.svelte';
|
|
2
2
|
import {} from 'svelte';
|
|
3
|
-
import { CheckIcon,
|
|
3
|
+
import { CheckIcon, HistoryIcon, Loader2, MousePointer2, Plus, Square, TextSelect, X, XIcon } from 'lucide-svelte';
|
|
4
4
|
import Button from '../../common/button/Button.svelte';
|
|
5
5
|
import Popover from '../../meltComponents/Popover.svelte';
|
|
6
6
|
import {} from './shared';
|
|
@@ -86,7 +86,7 @@ const appContext = $derived.by(() => {
|
|
|
86
86
|
<div class="text-center text-primary text-xs">No history</div>
|
|
87
87
|
{:else}
|
|
88
88
|
<div class="flex flex-col">
|
|
89
|
-
{#each pastChats as chat}
|
|
89
|
+
{#each pastChats as chat (chat.id)}
|
|
90
90
|
<button
|
|
91
91
|
class="text-left flex flex-row items-center gap-2 justify-between hover:bg-gray-100 dark:hover:bg-gray-700 rounded-md p-1"
|
|
92
92
|
onclick={() => {
|
|
@@ -149,7 +149,7 @@ const appContext = $derived.by(() => {
|
|
|
149
149
|
}}
|
|
150
150
|
>
|
|
151
151
|
<div class="flex flex-col" bind:clientHeight={height}>
|
|
152
|
-
{#each messages as message, messageIndex}
|
|
152
|
+
{#each messages as message, messageIndex (messageIndex)}
|
|
153
153
|
<AIChatMessage
|
|
154
154
|
{message}
|
|
155
155
|
{messageIndex}
|
|
@@ -236,38 +236,7 @@ const appContext = $derived.by(() => {
|
|
|
236
236
|
{/if}
|
|
237
237
|
<ProviderModelSelector />
|
|
238
238
|
|
|
239
|
-
{#if aiChatManager.mode === AIMode.APP && appContext && (appContext.
|
|
240
|
-
{#if appContext.type === 'frontend' && appContext.frontendPath && !appContext.selectionExcluded}
|
|
241
|
-
<div
|
|
242
|
-
class="inline-flex items-center gap-1 px-1.5 py-0.5 rounded bg-blue-100 dark:bg-blue-900/30 text-blue-700 dark:text-blue-300 text-2xs"
|
|
243
|
-
title={appContext.frontendPath}
|
|
244
|
-
>
|
|
245
|
-
<FileCode class="w-3 h-3" />
|
|
246
|
-
<span class="truncate max-w-[80px]">{appContext.frontendPath}</span>
|
|
247
|
-
<button
|
|
248
|
-
class="hover:bg-blue-200 dark:hover:bg-blue-800/50 rounded p-0.5 -mr-0.5"
|
|
249
|
-
onclick={() => appContext.toggleSelectionExcluded?.()}
|
|
250
|
-
title="Exclude from prompt"
|
|
251
|
-
>
|
|
252
|
-
<X class="w-2.5 h-2.5" />
|
|
253
|
-
</button>
|
|
254
|
-
</div>
|
|
255
|
-
{:else if appContext.type === 'backend' && appContext.backendKey && !appContext.selectionExcluded}
|
|
256
|
-
<div
|
|
257
|
-
class="inline-flex items-center gap-1 px-1.5 py-0.5 rounded bg-green-100 dark:bg-green-900/30 text-green-700 dark:text-green-300 text-2xs"
|
|
258
|
-
title={appContext.backendKey}
|
|
259
|
-
>
|
|
260
|
-
<Code2 class="w-3 h-3" />
|
|
261
|
-
<span class="truncate max-w-[80px]">{appContext.backendKey}</span>
|
|
262
|
-
<button
|
|
263
|
-
class="hover:bg-green-200 dark:hover:bg-green-800/50 rounded p-0.5 -mr-0.5"
|
|
264
|
-
onclick={() => appContext.toggleSelectionExcluded?.()}
|
|
265
|
-
title="Exclude from prompt"
|
|
266
|
-
>
|
|
267
|
-
<X class="w-2.5 h-2.5" />
|
|
268
|
-
</button>
|
|
269
|
-
</div>
|
|
270
|
-
{/if}
|
|
239
|
+
{#if aiChatManager.mode === AIMode.APP && appContext && (appContext.inspectorElement || appContext.codeSelection)}
|
|
271
240
|
{#if appContext.inspectorElement}
|
|
272
241
|
<div
|
|
273
242
|
class="inline-flex items-center gap-1 px-1.5 py-0.5 rounded bg-purple-100 dark:bg-purple-900/30 text-purple-700 dark:text-purple-300 text-2xs"
|
|
@@ -317,7 +286,7 @@ const appContext = $derived.by(() => {
|
|
|
317
286
|
{#if (aiChatManager.mode === AIMode.NAVIGATOR || aiChatManager.mode === AIMode.ASK) && suggestions.length > 0 && messages.filter((m) => m.role === 'user').length === 0 && !disabled}
|
|
318
287
|
<div class="px-2 mt-4">
|
|
319
288
|
<div class="flex flex-col gap-2">
|
|
320
|
-
{#each suggestions as suggestion}
|
|
289
|
+
{#each suggestions as suggestion (suggestion)}
|
|
321
290
|
<Button
|
|
322
291
|
on:click={() => submitSuggestion(suggestion)}
|
|
323
292
|
size="xs2"
|
|
@@ -9,6 +9,7 @@ import { twMerge } from 'tailwind-merge';
|
|
|
9
9
|
import Portal from '../../Portal.svelte';
|
|
10
10
|
import { zIndexes } from '../../../zIndexes';
|
|
11
11
|
import { tick, untrack } from 'svelte';
|
|
12
|
+
import { sendUserToast } from '../../../toast';
|
|
12
13
|
let { availableContext, selectedContext = $bindable([]), disabled = false, isFirstMessage = false, placeholder, initialInstructions = '', editingMessageIndex = null, onEditEnd = () => { }, className = '', onClickOutside = () => { }, onSendRequest = undefined, showContext = true, bottomRightSnippet, onKeyDown = undefined } = $props();
|
|
13
14
|
// Generate mode-specific placeholder
|
|
14
15
|
const modePlaceholder = $derived.by(() => {
|
|
@@ -65,7 +66,7 @@ function clickOutside(node) {
|
|
|
65
66
|
}
|
|
66
67
|
};
|
|
67
68
|
}
|
|
68
|
-
function addContextToSelection(contextElement) {
|
|
69
|
+
async function addContextToSelection(contextElement) {
|
|
69
70
|
if (!selectedContext || !availableContext)
|
|
70
71
|
return;
|
|
71
72
|
const alreadySelected = selectedContext.find((c) => c.type === contextElement.type && c.title === contextElement.title);
|
|
@@ -78,13 +79,29 @@ function addContextToSelection(contextElement) {
|
|
|
78
79
|
!availableContext.find((c) => c.type === contextElement.type && c.title === contextElement.title)) {
|
|
79
80
|
return;
|
|
80
81
|
}
|
|
81
|
-
|
|
82
|
-
// If it's a datatable table, add it to the app's whitelisted tables
|
|
82
|
+
let contextToAdd = contextElement;
|
|
83
83
|
if (contextElement.type === 'app_datatable' &&
|
|
84
84
|
aiChatManager.mode === AIMode.APP &&
|
|
85
85
|
aiChatManager.appAiChatHelpers) {
|
|
86
|
-
|
|
86
|
+
const appAiChatHelpers = aiChatManager.appAiChatHelpers;
|
|
87
|
+
appAiChatHelpers.addTableToWhitelist(contextElement.datatableName, contextElement.schemaName, contextElement.tableName);
|
|
88
|
+
if (!contextElement.columns) {
|
|
89
|
+
try {
|
|
90
|
+
contextToAdd = {
|
|
91
|
+
...contextElement,
|
|
92
|
+
columns: await appAiChatHelpers.getDatatableTableSchema(contextElement.datatableName, contextElement.schemaName, contextElement.tableName)
|
|
93
|
+
};
|
|
94
|
+
}
|
|
95
|
+
catch (e) {
|
|
96
|
+
console.error('Failed to load datatable table schema:', e);
|
|
97
|
+
sendUserToast('Failed to load datatable table schema', true, [], e instanceof Error ? e.message : String(e));
|
|
98
|
+
}
|
|
99
|
+
}
|
|
87
100
|
}
|
|
101
|
+
const duplicateAfterAwait = selectedContext.find((c) => c.type === contextToAdd.type && c.title === contextToAdd.title);
|
|
102
|
+
if (duplicateAfterAwait)
|
|
103
|
+
return;
|
|
104
|
+
selectedContext = [...selectedContext, contextToAdd];
|
|
88
105
|
}
|
|
89
106
|
function sendRequest() {
|
|
90
107
|
if (aiChatManager.loading) {
|
|
@@ -258,7 +275,7 @@ function handleAppInput(_e) {
|
|
|
258
275
|
}
|
|
259
276
|
}
|
|
260
277
|
function handleAppContextSelection(contextElement) {
|
|
261
|
-
addContextToSelection(contextElement);
|
|
278
|
+
void addContextToSelection(contextElement);
|
|
262
279
|
// Update instructions with the selected context title
|
|
263
280
|
const index = instructions.lastIndexOf('@');
|
|
264
281
|
if (index !== -1) {
|
|
@@ -279,31 +296,27 @@ $effect(() => {
|
|
|
279
296
|
<div class="flex flex-row gap-1 mb-1 overflow-scroll pt-2 no-scrollbar">
|
|
280
297
|
<Popover>
|
|
281
298
|
{#snippet trigger()}
|
|
282
|
-
|
|
283
|
-
|
|
284
|
-
|
|
285
|
-
|
|
286
|
-
|
|
287
|
-
|
|
288
|
-
{/snippet}
|
|
299
|
+
<div
|
|
300
|
+
class="border rounded-md px-1 py-0.5 font-normal text-primary text-xs hover:bg-surface-hover bg-surface"
|
|
301
|
+
>@</div
|
|
302
|
+
>
|
|
303
|
+
{/snippet}
|
|
289
304
|
{#snippet content({ close })}
|
|
290
|
-
|
|
291
|
-
|
|
292
|
-
|
|
293
|
-
|
|
294
|
-
|
|
295
|
-
|
|
296
|
-
|
|
297
|
-
|
|
298
|
-
|
|
299
|
-
|
|
300
|
-
|
|
301
|
-
|
|
302
|
-
|
|
303
|
-
|
|
304
|
-
{/snippet}
|
|
305
|
+
<AvailableContextList
|
|
306
|
+
{availableContext}
|
|
307
|
+
{selectedContext}
|
|
308
|
+
onSelect={(element) => {
|
|
309
|
+
void addContextToSelection(element)
|
|
310
|
+
close()
|
|
311
|
+
}}
|
|
312
|
+
onSelectWorkspaceItem={(element) => {
|
|
313
|
+
void addContextToSelection(element)
|
|
314
|
+
close()
|
|
315
|
+
}}
|
|
316
|
+
/>
|
|
317
|
+
{/snippet}
|
|
305
318
|
</Popover>
|
|
306
|
-
{#each selectedContext as element}
|
|
319
|
+
{#each selectedContext as element (element.type + '-' + element.title)}
|
|
307
320
|
<ContextElementBadge
|
|
308
321
|
contextElement={element}
|
|
309
322
|
deletable
|
|
@@ -323,7 +336,7 @@ $effect(() => {
|
|
|
323
336
|
{selectedContext}
|
|
324
337
|
{isFirstMessage}
|
|
325
338
|
placeholder={modePlaceholder}
|
|
326
|
-
onAddContext={(contextElement) => addContextToSelection(contextElement)}
|
|
339
|
+
onAddContext={(contextElement) => void addContextToSelection(contextElement)}
|
|
327
340
|
onSendRequest={() => {
|
|
328
341
|
if (disabled) {
|
|
329
342
|
return
|
|
@@ -338,25 +351,21 @@ $effect(() => {
|
|
|
338
351
|
<div class="flex flex-row gap-1 mb-1 overflow-scroll pt-2 no-scrollbar">
|
|
339
352
|
<Popover>
|
|
340
353
|
{#snippet trigger()}
|
|
341
|
-
|
|
342
|
-
|
|
343
|
-
|
|
344
|
-
|
|
345
|
-
|
|
346
|
-
|
|
347
|
-
{/snippet}
|
|
354
|
+
<div
|
|
355
|
+
class="border rounded-md px-1 py-0.5 font-normal text-primary text-xs hover:bg-surface-hover bg-surface"
|
|
356
|
+
>@</div
|
|
357
|
+
>
|
|
358
|
+
{/snippet}
|
|
348
359
|
{#snippet content({ close })}
|
|
349
|
-
|
|
350
|
-
|
|
351
|
-
|
|
352
|
-
|
|
353
|
-
|
|
354
|
-
|
|
355
|
-
|
|
356
|
-
|
|
357
|
-
|
|
358
|
-
|
|
359
|
-
{/snippet}
|
|
360
|
+
<AppAvailableContextList
|
|
361
|
+
{availableContext}
|
|
362
|
+
{selectedContext}
|
|
363
|
+
onSelect={(element) => {
|
|
364
|
+
void addContextToSelection(element)
|
|
365
|
+
close()
|
|
366
|
+
}}
|
|
367
|
+
/>
|
|
368
|
+
{/snippet}
|
|
360
369
|
</Popover>
|
|
361
370
|
{#each selectedContext as element (element.type + '-' + element.title)}
|
|
362
371
|
<ContextElementBadge
|
|
@@ -18,6 +18,7 @@ import { get } from 'svelte/store';
|
|
|
18
18
|
import { workspaceStore } from '../../../stores';
|
|
19
19
|
import { askTools, prepareAskSystemMessage, prepareAskUserMessage } from './ask/core';
|
|
20
20
|
import { chatState, DEFAULT_SIZE, triggerablesByAi } from './sharedChatState.svelte';
|
|
21
|
+
import { createAppBackendRunnableContextElement, createAppFrontendFileContextElement, flattenDatatablesToAppContextElements } from './context';
|
|
21
22
|
import { prepareApiSystemMessage, prepareApiUserMessage } from './api/core';
|
|
22
23
|
import { runChatLoop } from './chatLoop';
|
|
23
24
|
import { getCurrentModel, tryGetCurrentModel, getCombinedCustomPrompt } from '../../../aiStore';
|
|
@@ -33,6 +34,9 @@ export var AIMode;
|
|
|
33
34
|
AIMode["API"] = "API";
|
|
34
35
|
AIMode["ASK"] = "ask";
|
|
35
36
|
})(AIMode || (AIMode = {}));
|
|
37
|
+
function isWorkspacePath(path) {
|
|
38
|
+
return path?.startsWith('f/') === true || path?.startsWith('u/') === true;
|
|
39
|
+
}
|
|
36
40
|
class AIChatManager {
|
|
37
41
|
contextManager = new ContextManager();
|
|
38
42
|
historyManager = new HistoryManager();
|
|
@@ -71,6 +75,7 @@ class AIChatManager {
|
|
|
71
75
|
/** Cached datatables for app context (fetched asynchronously) */
|
|
72
76
|
cachedDatatables = $state([]);
|
|
73
77
|
confirmationCallback = $state(undefined);
|
|
78
|
+
appDatatablesRefreshTimeout = undefined;
|
|
74
79
|
allowedModes = $derived({
|
|
75
80
|
script: this.flowAiChatHelpers === undefined && this.scriptEditorOptions !== undefined,
|
|
76
81
|
flow: this.flowAiChatHelpers !== undefined,
|
|
@@ -158,6 +163,24 @@ class AIChatManager {
|
|
|
158
163
|
this.changeMode(firstKey);
|
|
159
164
|
}
|
|
160
165
|
}
|
|
166
|
+
getScriptWorkspaceMutationTarget = () => {
|
|
167
|
+
const path = this.scriptEditorOptions?.path;
|
|
168
|
+
const workspacePath = isWorkspacePath(path) ? path : undefined;
|
|
169
|
+
return {
|
|
170
|
+
kind: 'script',
|
|
171
|
+
path: workspacePath,
|
|
172
|
+
deployed: workspacePath !== undefined && this.scriptEditorOptions?.lastDeployedCode !== undefined
|
|
173
|
+
};
|
|
174
|
+
};
|
|
175
|
+
getFlowWorkspaceMutationTarget = () => {
|
|
176
|
+
return {
|
|
177
|
+
kind: 'flow',
|
|
178
|
+
path: this.flowOptions?.path,
|
|
179
|
+
deployed: !!this.flowOptions?.path &&
|
|
180
|
+
!!this.flowOptions.lastDeployedFlow &&
|
|
181
|
+
!this.flowOptions.lastDeployedFlow.draft_only
|
|
182
|
+
};
|
|
183
|
+
};
|
|
161
184
|
changeMode(mode, pendingPrompt, options) {
|
|
162
185
|
if (mode === AIMode.SCRIPT && !tryGetCurrentModel())
|
|
163
186
|
return;
|
|
@@ -180,6 +203,7 @@ class AIChatManager {
|
|
|
180
203
|
args: this.scriptEditorOptions?.args ?? {}
|
|
181
204
|
};
|
|
182
205
|
},
|
|
206
|
+
getWorkspaceMutationTarget: this.getScriptWorkspaceMutationTarget,
|
|
183
207
|
applyCode: (code, opts) => {
|
|
184
208
|
this.scriptEditorApplyCode?.(code, opts);
|
|
185
209
|
},
|
|
@@ -202,7 +226,10 @@ class AIChatManager {
|
|
|
202
226
|
this.systemMessage = prepareFlowSystemMessage(customPrompt);
|
|
203
227
|
this.systemMessage.content = this.systemMessage.content;
|
|
204
228
|
this.tools = [...flowTools];
|
|
205
|
-
this.helpers =
|
|
229
|
+
this.helpers = {
|
|
230
|
+
...(this.flowAiChatHelpers ?? {}),
|
|
231
|
+
getWorkspaceMutationTarget: this.getFlowWorkspaceMutationTarget
|
|
232
|
+
};
|
|
206
233
|
}
|
|
207
234
|
else if (mode === AIMode.NAVIGATOR) {
|
|
208
235
|
const customPrompt = getCombinedCustomPrompt(mode);
|
|
@@ -834,33 +861,8 @@ class AIChatManager {
|
|
|
834
861
|
return;
|
|
835
862
|
}
|
|
836
863
|
try {
|
|
837
|
-
const datatables = await this.appAiChatHelpers.
|
|
838
|
-
|
|
839
|
-
// Flatten to individual tables
|
|
840
|
-
const tableElements = [];
|
|
841
|
-
for (const dt of datatables) {
|
|
842
|
-
if (dt.error) {
|
|
843
|
-
// Skip datatables with errors
|
|
844
|
-
continue;
|
|
845
|
-
}
|
|
846
|
-
for (const [schemaName, tables] of Object.entries(dt.schemas)) {
|
|
847
|
-
for (const [tableName, columns] of Object.entries(tables)) {
|
|
848
|
-
// Format title as "datatable/schema:table" or "datatable/table" if schema is public
|
|
849
|
-
const title = schemaName === 'public'
|
|
850
|
-
? `${dt.datatable_name}/${tableName}`
|
|
851
|
-
: `${dt.datatable_name}/${schemaName}:${tableName}`;
|
|
852
|
-
tableElements.push({
|
|
853
|
-
type: 'app_datatable',
|
|
854
|
-
datatableName: dt.datatable_name,
|
|
855
|
-
schemaName,
|
|
856
|
-
tableName,
|
|
857
|
-
title,
|
|
858
|
-
columns
|
|
859
|
-
});
|
|
860
|
-
}
|
|
861
|
-
}
|
|
862
|
-
}
|
|
863
|
-
this.cachedDatatables = tableElements;
|
|
864
|
+
const datatables = await this.appAiChatHelpers.listDatatableTables();
|
|
865
|
+
this.cachedDatatables = flattenDatatablesToAppContextElements(datatables);
|
|
864
866
|
}
|
|
865
867
|
catch (err) {
|
|
866
868
|
console.error('Failed to refresh datatables:', err);
|
|
@@ -880,13 +882,7 @@ class AIChatManager {
|
|
|
880
882
|
for (const path of frontendFiles) {
|
|
881
883
|
const content = this.appAiChatHelpers.getFrontendFile(path);
|
|
882
884
|
if (content !== undefined) {
|
|
883
|
-
|
|
884
|
-
type: 'app_frontend_file',
|
|
885
|
-
path,
|
|
886
|
-
title: path,
|
|
887
|
-
content
|
|
888
|
-
};
|
|
889
|
-
context.push(element);
|
|
885
|
+
context.push(createAppFrontendFileContextElement(path, content));
|
|
890
886
|
}
|
|
891
887
|
}
|
|
892
888
|
// Add backend runnables
|
|
@@ -894,13 +890,7 @@ class AIChatManager {
|
|
|
894
890
|
for (const { key } of runnables) {
|
|
895
891
|
const runnable = this.appAiChatHelpers.getBackendRunnable(key);
|
|
896
892
|
if (runnable) {
|
|
897
|
-
|
|
898
|
-
type: 'app_backend_runnable',
|
|
899
|
-
key,
|
|
900
|
-
title: key,
|
|
901
|
-
runnable
|
|
902
|
-
};
|
|
903
|
-
context.push(element);
|
|
893
|
+
context.push(createAppBackendRunnableContextElement(key, runnable));
|
|
904
894
|
}
|
|
905
895
|
}
|
|
906
896
|
// Add cached datatables
|
|
@@ -911,12 +901,24 @@ class AIChatManager {
|
|
|
911
901
|
this.appAiChatHelpers = appHelpers;
|
|
912
902
|
// Refresh datatables when app helpers are set (deferred to avoid loop)
|
|
913
903
|
// Use setTimeout to ensure this runs after the effect completes
|
|
914
|
-
|
|
915
|
-
this.
|
|
904
|
+
if (this.appDatatablesRefreshTimeout) {
|
|
905
|
+
clearTimeout(this.appDatatablesRefreshTimeout);
|
|
906
|
+
}
|
|
907
|
+
this.appDatatablesRefreshTimeout = setTimeout(() => {
|
|
908
|
+
this.appDatatablesRefreshTimeout = undefined;
|
|
909
|
+
if (this.appAiChatHelpers === appHelpers) {
|
|
910
|
+
void this.refreshDatatables();
|
|
911
|
+
}
|
|
916
912
|
}, 50);
|
|
917
913
|
return () => {
|
|
918
|
-
this.
|
|
919
|
-
|
|
914
|
+
if (this.appDatatablesRefreshTimeout) {
|
|
915
|
+
clearTimeout(this.appDatatablesRefreshTimeout);
|
|
916
|
+
this.appDatatablesRefreshTimeout = undefined;
|
|
917
|
+
}
|
|
918
|
+
if (this.appAiChatHelpers === appHelpers) {
|
|
919
|
+
this.appAiChatHelpers = undefined;
|
|
920
|
+
this.cachedDatatables = [];
|
|
921
|
+
}
|
|
920
922
|
};
|
|
921
923
|
};
|
|
922
924
|
cancelLoadingTools = (messageText = 'Canceled') => {
|
|
@@ -1,7 +1,7 @@
|
|
|
1
1
|
<script lang="ts">import { untrack } from 'svelte';
|
|
2
2
|
import { Popover } from '../../meltComponents';
|
|
3
3
|
import { Loader2, X } from 'lucide-svelte';
|
|
4
|
-
import { ContextIconMap } from './context';
|
|
4
|
+
import { ContextIconMap, formatAppDatatableContextTitle } from './context';
|
|
5
5
|
import { Highlight } from 'svelte-highlight';
|
|
6
6
|
import { json } from 'svelte-highlight/languages';
|
|
7
7
|
import { twMerge } from 'tailwind-merge';
|
|
@@ -123,9 +123,11 @@ const isDeletable = $derived(deletable && contextElement.deletable !== false);
|
|
|
123
123
|
{:else if contextElement.type === 'app_datatable'}
|
|
124
124
|
<div class="p-2 max-w-96 max-h-[300px] text-xs overflow-auto">
|
|
125
125
|
<div class="text-tertiary text-xs mb-1">
|
|
126
|
-
{
|
|
127
|
-
|
|
128
|
-
|
|
126
|
+
{formatAppDatatableContextTitle(
|
|
127
|
+
contextElement.datatableName,
|
|
128
|
+
contextElement.schemaName,
|
|
129
|
+
contextElement.tableName
|
|
130
|
+
)}
|
|
129
131
|
</div>
|
|
130
132
|
<ObjectViewer json={contextElement.columns} pureViewer collapseLevel={1} />
|
|
131
133
|
</div>
|