windmill-components 1.677.1 → 1.695.0

This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
Files changed (552) hide show
  1. package/package/components/AppConnectInner.svelte +6 -0
  2. package/package/components/ArgInput.svelte +2 -0
  3. package/package/components/AutoscalingConfigEditor.svelte +18 -4
  4. package/package/components/CiTestResults.svelte +64 -0
  5. package/package/components/CiTestResults.svelte.d.ts +7 -0
  6. package/package/components/CompareWorkspaces.svelte +741 -484
  7. package/package/components/DBManager.svelte +35 -4
  8. package/package/components/DBManager.svelte.d.ts +2 -0
  9. package/package/components/DBManagerContent.svelte +3 -1
  10. package/package/components/DBManagerContent.svelte.d.ts +3 -0
  11. package/package/components/DBManagerDrawer.svelte +145 -3
  12. package/package/components/DBTableEditor.svelte +14 -4
  13. package/package/components/DatatablePicker.svelte +2 -5
  14. package/package/components/DatatableSchemaDiff.svelte +531 -0
  15. package/package/components/DatatableSchemaDiff.svelte.d.ts +29 -0
  16. package/package/components/DedicatedWorkersSelector.svelte +4 -2
  17. package/package/components/DefaultTagsInner.svelte +42 -2
  18. package/package/components/DeployWorkspaceDrawer.svelte +1 -1
  19. package/package/components/Dev.svelte +407 -74
  20. package/package/components/EditableSchemaForm.svelte +4 -0
  21. package/package/components/Editor.svelte +1 -1
  22. package/package/components/EditorBar.svelte +1 -1
  23. package/package/components/EditorBar.svelte.d.ts +1 -1
  24. package/package/components/ErrorOrRecoveryHandler.svelte +2 -2
  25. package/package/components/FlowPreviewContent.svelte +32 -30
  26. package/package/components/FlowRestartButton.svelte +143 -61
  27. package/package/components/FlowRestartButton.svelte.d.ts +37 -0
  28. package/package/components/FlowStatusViewer.svelte +15 -1
  29. package/package/components/FlowStatusViewer.svelte.d.ts +10 -2
  30. package/package/components/FlowStatusViewerInner.svelte +270 -222
  31. package/package/components/FlowStatusViewerInner.svelte.d.ts +6 -2
  32. package/package/components/FlowTimeline.svelte +1 -1
  33. package/package/components/FolderEditor.svelte +189 -4
  34. package/package/components/ForkConflictModal.svelte +57 -0
  35. package/package/components/ForkConflictModal.svelte.d.ts +3 -0
  36. package/package/components/ForkWorkspaceBanner.svelte +82 -11
  37. package/package/components/GitRepoViewer.svelte +251 -97
  38. package/package/components/GlobalUserOffboardingModal.svelte +293 -0
  39. package/package/components/GlobalUserOffboardingModal.svelte.d.ts +10 -0
  40. package/package/components/InputTransformSchemaForm.svelte +1 -1
  41. package/package/components/InstanceSettings.svelte +58 -19
  42. package/package/components/Login.svelte +133 -36
  43. package/package/components/Login.svelte.d.ts +1 -0
  44. package/package/components/ModuleTest.svelte +2 -1
  45. package/package/components/NoMainFuncBadge.svelte +1 -1
  46. package/package/components/OffboardItemsBox.svelte +56 -0
  47. package/package/components/OffboardItemsBox.svelte.d.ts +12 -0
  48. package/package/components/OffboardReassignControls.svelte +47 -0
  49. package/package/components/OffboardReassignControls.svelte.d.ts +20 -0
  50. package/package/components/OffboardWorkspaceSection.svelte +110 -0
  51. package/package/components/OffboardWorkspaceSection.svelte.d.ts +24 -0
  52. package/package/components/OnBehalfOfSelector.svelte +21 -3
  53. package/package/components/OnBehalfOfSelector.svelte.d.ts +7 -0
  54. package/package/components/Path.svelte +7 -1
  55. package/package/components/Path.svelte.d.ts +1 -1
  56. package/package/components/QueueAlerts.svelte +10 -10
  57. package/package/components/ResourcePicker.svelte +2 -2
  58. package/package/components/RunsPage.svelte +2 -1
  59. package/package/components/S3FilePickerInner.svelte +89 -89
  60. package/package/components/ScriptBuilder.svelte +52 -11
  61. package/package/components/ScriptEditor.svelte +19 -8
  62. package/package/components/ScriptEditor.svelte.d.ts +1 -1
  63. package/package/components/ShareModal.svelte +236 -98
  64. package/package/components/ShareModal.svelte.d.ts +1 -1
  65. package/package/components/SuperadminSettingsInner.svelte +362 -315
  66. package/package/components/UserOffboardingModal.svelte +238 -0
  67. package/package/components/UserOffboardingModal.svelte.d.ts +10 -0
  68. package/package/components/WorkspaceDeployLayout.svelte +3 -3
  69. package/package/components/WorkspaceDeployLayout.svelte.d.ts +1 -0
  70. package/package/components/apps/components/helpers/RunnableComponent.svelte.d.ts +3 -0
  71. package/package/components/apps/components/helpers/executeRunnable.js +2 -1
  72. package/package/components/apps/editor/AppReportsDrawerInner.svelte +1 -1
  73. package/package/components/apps/editor/appPolicy.js +2 -1
  74. package/package/components/apps/editor/commonAppUtils.d.ts +3 -0
  75. package/package/components/apps/editor/inlineScriptsPanel/CacheTtlPopup.svelte +1 -1
  76. package/package/components/apps/editor/inlineScriptsPanel/InlineScriptEditor.svelte +7 -0
  77. package/package/components/apps/editor/inlineScriptsPanel/InlineScriptRunnableByPath.svelte +4 -2
  78. package/package/components/apps/editor/inlineScriptsPanel/TagPopup.svelte +49 -0
  79. package/package/components/apps/editor/inlineScriptsPanel/TagPopup.svelte.d.ts +9 -0
  80. package/package/components/apps/editor/settingsPanel/mainInput/RunnableSelector.svelte +12 -0
  81. package/package/components/apps/inputType.d.ts +1 -0
  82. package/package/components/apps/sharedTypes.d.ts +1 -0
  83. package/package/components/assets/AssetsDropdownButton.svelte +1 -1
  84. package/package/components/auditLogs/AuditLogsFilters.svelte +8 -3
  85. package/package/components/common/confirmationModal/ConfirmationModal.svelte +1 -1
  86. package/package/components/common/fileUpload/S3ArgInput.svelte +12 -10
  87. package/package/components/common/fileUpload/S3ArgInput.svelte.d.ts +2 -0
  88. package/package/components/common/table/AppRow.svelte +3 -3
  89. package/package/components/common/table/FlowRow.svelte +3 -3
  90. package/package/components/common/table/RawAppRow.svelte +4 -4
  91. package/package/components/common/table/Row.svelte +6 -2
  92. package/package/components/common/table/ScriptRow.svelte +11 -3
  93. package/package/components/copilot/chat/AIChatDisplay.svelte +5 -36
  94. package/package/components/copilot/chat/AIChatInput.svelte +56 -47
  95. package/package/components/copilot/chat/AIChatManager.svelte.js +50 -48
  96. package/package/components/copilot/chat/ContextElementBadge.svelte +6 -4
  97. package/package/components/copilot/chat/anthropic.d.ts +7 -1
  98. package/package/components/copilot/chat/anthropic.js +5 -2
  99. package/package/components/copilot/chat/app/core.d.ts +12 -20
  100. package/package/components/copilot/chat/app/core.js +230 -159
  101. package/package/components/copilot/chat/app/core.test.js +417 -0
  102. package/package/components/copilot/chat/chatLoop.d.ts +3 -0
  103. package/package/components/copilot/chat/chatLoop.js +13 -5
  104. package/package/components/copilot/chat/context.js +44 -0
  105. package/package/components/copilot/chat/flow/FlowAIChat.svelte +57 -76
  106. package/package/components/copilot/chat/flow/core.d.ts +14 -3
  107. package/package/components/copilot/chat/flow/core.js +494 -116
  108. package/package/components/copilot/chat/flow/helperUtils.d.ts +22 -0
  109. package/package/components/copilot/chat/flow/helperUtils.js +100 -0
  110. package/package/components/copilot/chat/flow/helperUtils.test.js +231 -0
  111. package/package/components/copilot/chat/flow/inlineScriptsUtils.d.ts +5 -24
  112. package/package/components/copilot/chat/flow/inlineScriptsUtils.js +30 -55
  113. package/package/components/copilot/chat/flow/openFlow.json +1 -1
  114. package/package/components/copilot/chat/flow/openFlowZod.gen.js +24 -0
  115. package/package/components/copilot/chat/flow/utils.test.js +59 -0
  116. package/package/components/copilot/chat/openai-responses.d.ts +7 -1
  117. package/package/components/copilot/chat/openai-responses.js +5 -2
  118. package/package/components/copilot/chat/script/core.js +3 -0
  119. package/package/components/copilot/chat/shared.d.ts +7 -2
  120. package/package/components/copilot/chat/shared.js +116 -53
  121. package/package/components/copilot/chat/shared.test.d.ts +1 -0
  122. package/package/components/copilot/chat/shared.test.js +412 -0
  123. package/package/components/copilot/chat/tokenUsage.d.ts +23 -0
  124. package/package/components/copilot/chat/tokenUsage.js +42 -0
  125. package/package/components/copilot/chat/workspaceTools.d.ts +7 -0
  126. package/package/components/copilot/chat/workspaceTools.js +239 -0
  127. package/package/components/copilot/chat/workspaceToolsZod.gen.d.ts +1295 -0
  128. package/package/components/copilot/chat/workspaceToolsZod.gen.js +424 -0
  129. package/package/components/copilot/lib.d.ts +5 -1
  130. package/package/components/copilot/lib.js +24 -6
  131. package/package/components/copilot/lib.test.d.ts +1 -0
  132. package/package/components/copilot/lib.test.js +19 -0
  133. package/package/components/copilot/modelConfig.d.ts +3 -0
  134. package/package/components/copilot/modelConfig.js +10 -0
  135. package/package/components/deploymentRequest/DeploymentRequestPanel.svelte +337 -0
  136. package/package/components/deploymentRequest/DeploymentRequestPanel.svelte.d.ts +15 -0
  137. package/package/components/details/CopyableCodeBlock.svelte +18 -8
  138. package/package/components/details/CopyableCodeBlock.svelte.d.ts +1 -0
  139. package/package/components/flows/FlowAssetsHandler.svelte +19 -21
  140. package/package/components/flows/FlowProgressBar.svelte +5 -2
  141. package/package/components/flows/agentToolTree.d.ts +17 -0
  142. package/package/components/flows/agentToolTree.js +114 -0
  143. package/package/components/flows/agentToolTree.test.d.ts +1 -0
  144. package/package/components/flows/agentToolTree.test.js +86 -0
  145. package/package/components/flows/agentToolUtils.d.ts +0 -5
  146. package/package/components/flows/agentToolUtils.js +0 -49
  147. package/package/components/flows/content/FlowLoop.svelte +7 -4
  148. package/package/components/flows/content/FlowModuleComponent.svelte +636 -599
  149. package/package/components/flows/content/FlowModuleDeleteAfterUse.svelte +15 -7
  150. package/package/components/flows/content/FlowSettings.svelte +29 -0
  151. package/package/components/flows/conversations/FlowChatManager.svelte.js +21 -10
  152. package/package/components/flows/dfs.d.ts +6 -2
  153. package/package/components/flows/dfs.js +19 -11
  154. package/package/components/flows/flowDeleteController.d.ts +32 -0
  155. package/package/components/flows/flowDeleteController.js +54 -0
  156. package/package/components/flows/flowDeleteController.test.d.ts +1 -0
  157. package/package/components/flows/flowDeleteController.test.js +121 -0
  158. package/package/components/flows/flowDeleteUtils.d.ts +48 -0
  159. package/package/components/flows/flowDeleteUtils.js +150 -0
  160. package/package/components/flows/flowDeleteUtils.test.d.ts +1 -0
  161. package/package/components/flows/flowDeleteUtils.test.js +131 -0
  162. package/package/components/flows/flowDiff.d.ts +2 -47
  163. package/package/components/flows/flowDiff.js +16 -293
  164. package/package/components/flows/flowDiff.testUtils.d.ts +8 -0
  165. package/package/components/flows/flowDiff.testUtils.js +26 -0
  166. package/package/components/flows/flowDiffManager.svelte.js +20 -75
  167. package/package/components/flows/flowDiffManager.svelte.test.js +103 -2
  168. package/package/components/flows/flowExplorer.d.ts +4 -0
  169. package/package/components/flows/flowExplorer.js +7 -30
  170. package/package/components/flows/flowState.d.ts +1 -0
  171. package/package/components/flows/flowStateUtils.svelte.js +11 -2
  172. package/package/components/flows/flowTree.d.ts +91 -0
  173. package/package/components/flows/flowTree.js +326 -0
  174. package/package/components/flows/flowTree.test.d.ts +1 -0
  175. package/package/components/flows/flowTree.test.js +236 -0
  176. package/package/components/flows/map/FlowJobsMenu.svelte +36 -30
  177. package/package/components/flows/map/FlowModuleSchemaItem.svelte +1 -1
  178. package/package/components/flows/map/FlowModuleSchemaMap.svelte +73 -229
  179. package/package/components/flows/map/FlowModuleSchemaMap.svelte.d.ts +1 -2
  180. package/package/components/flows/pickers/PickHubScriptQuick.svelte +2 -2
  181. package/package/components/flows/previousResults.js +13 -41
  182. package/package/components/flows/previousResults.test.d.ts +1 -0
  183. package/package/components/flows/previousResults.test.js +65 -0
  184. package/package/components/flows/propPicker/OutputPicker.svelte +2 -1
  185. package/package/components/flows/propPicker/OutputPickerInner.svelte +41 -4
  186. package/package/components/flows/propPicker/StepHistory.svelte +9 -1
  187. package/package/components/git_sync/GitSyncContext.svelte.js +11 -7
  188. package/package/components/git_sync/GitSyncRepositoryCard.svelte +2 -29
  189. package/package/components/git_sync/PullWorkspaceModal.svelte +6 -7
  190. package/package/components/graph/FlowGraphV2.svelte +8 -4
  191. package/package/components/graph/FlowGraphV2.svelte.d.ts +2 -0
  192. package/package/components/graph/groupedModulesProxy.svelte.d.ts +10 -0
  193. package/package/components/graph/groupedModulesProxy.svelte.js +17 -1
  194. package/package/components/graph/renderers/triggers/TriggersBadge.svelte +8 -2
  195. package/package/components/home/HomeConnectDrawer.svelte +125 -0
  196. package/package/components/home/HomeConnectDrawer.svelte.d.ts +5 -0
  197. package/package/components/home/deploy_ui.js +1 -1
  198. package/package/components/icons/AzureIcon.svelte +12 -25
  199. package/package/components/icons/AzureIcon.svelte.d.ts +3 -2
  200. package/package/components/icons/GithubIcon.svelte +4 -4
  201. package/package/components/icons/GithubIcon.svelte.d.ts +5 -2
  202. package/package/components/instanceSettings/ExternalJwtTokens.svelte +85 -0
  203. package/package/components/instanceSettings/ExternalJwtTokens.svelte.d.ts +12 -0
  204. package/package/components/instanceSettings/GhesAppSettings.svelte +17 -0
  205. package/package/components/instanceSettings/IndexerMemorySettings.svelte +56 -29
  206. package/package/components/instanceSettings/SecretBackendConfig.svelte +9 -2
  207. package/package/components/instanceSettings.d.ts +1 -0
  208. package/package/components/instanceSettings.js +66 -8
  209. package/package/components/mcp/McpScopeSelector.svelte +119 -9
  210. package/package/components/mcp/McpScopeSelector.svelte.d.ts +1 -0
  211. package/package/components/offboarding-utils.d.ts +11 -0
  212. package/package/components/offboarding-utils.js +102 -0
  213. package/package/components/progressBar/ProgressBar.svelte +9 -5
  214. package/package/components/progressBar/ProgressBar.svelte.d.ts +1 -0
  215. package/package/components/raw_apps/DeleteAfterUsePopup.svelte +52 -0
  216. package/package/components/raw_apps/DeleteAfterUsePopup.svelte.d.ts +9 -0
  217. package/package/components/raw_apps/RawAppBackgroundRunner.svelte +5 -1
  218. package/package/components/raw_apps/RawAppDataTableDrawer.svelte +1 -1
  219. package/package/components/raw_apps/RawAppEditor.svelte +186 -102
  220. package/package/components/raw_apps/RawAppEditorHeader.svelte +6 -1
  221. package/package/components/raw_apps/RawAppEditorHeader.svelte.d.ts +1 -0
  222. package/package/components/raw_apps/RawAppInlineScriptEditor.svelte +9 -3
  223. package/package/components/raw_apps/RawAppInlineScriptEditor.svelte.d.ts +2 -1
  224. package/package/components/raw_apps/RawAppInlineScriptRunnable.svelte +1 -0
  225. package/package/components/raw_apps/RawAppInlineScriptRunnable.svelte.d.ts +1 -0
  226. package/package/components/raw_apps/RawAppInputsSpecEditor.svelte +48 -5
  227. package/package/components/raw_apps/RawAppSharedUiDrawer.svelte +129 -0
  228. package/package/components/raw_apps/RawAppSharedUiDrawer.svelte.d.ts +5 -0
  229. package/package/components/raw_apps/RawAppSidebar.svelte +12 -0
  230. package/package/components/raw_apps/RawAppYamlEditor.svelte +81 -0
  231. package/package/components/raw_apps/RawAppYamlEditor.svelte.d.ts +20 -0
  232. package/package/components/raw_apps/dataTableRefUtils.d.ts +7 -0
  233. package/package/components/raw_apps/dataTableRefUtils.js +34 -0
  234. package/package/components/raw_apps/dataTableRefUtils.test.d.ts +1 -0
  235. package/package/components/raw_apps/dataTableRefUtils.test.js +29 -0
  236. package/package/components/raw_apps/datatableUtils.svelte.js +1 -1
  237. package/package/components/raw_apps/rawAppPolicy.d.ts +1 -0
  238. package/package/components/raw_apps/rawAppPolicy.js +17 -2
  239. package/package/components/resources/resourceTypesFilter.d.ts +19 -0
  240. package/package/components/resources/resourceTypesFilter.js +21 -0
  241. package/package/components/restartFromStepPath.d.ts +39 -0
  242. package/package/components/restartFromStepPath.js +89 -0
  243. package/package/components/runs/JobDetailFieldConfig.d.ts +1 -0
  244. package/package/components/runs/JobDetailFieldConfig.js +57 -10
  245. package/package/components/runs/JobDetailHeader.svelte +24 -3
  246. package/package/components/runs/runsFilter.d.ts +1 -1
  247. package/package/components/schema/FlowPropertyEditor.svelte +30 -1
  248. package/package/components/schema/FlowPropertyEditor.svelte.d.ts +5 -2
  249. package/package/components/script_builder.d.ts +1 -1
  250. package/package/components/search/GlobalSearchModal.svelte +8 -1
  251. package/package/components/select/Select.svelte +3 -2
  252. package/package/components/select/Select.svelte.d.ts +1 -0
  253. package/package/components/settings/CreateToken.svelte +91 -71
  254. package/package/components/settings/CreateToken.svelte.d.ts +3 -0
  255. package/package/components/settings/EditTokenScopesModal.svelte +57 -0
  256. package/package/components/settings/EditTokenScopesModal.svelte.d.ts +10 -0
  257. package/package/components/settings/ScopesPicker.svelte +43 -0
  258. package/package/components/settings/ScopesPicker.svelte.d.ts +11 -0
  259. package/package/components/settings/TokensTable.svelte +51 -15
  260. package/package/components/settings/WorkspaceUserSettings.svelte +34 -28
  261. package/package/components/sidebar/OperatorMenu.svelte +6 -0
  262. package/package/components/sidebar/SidebarContent.svelte +68 -2
  263. package/package/components/sidebar/WorkspaceMenu.svelte +8 -4
  264. package/package/components/triggers/AddTriggersButton.svelte +17 -0
  265. package/package/components/triggers/CaptureWrapper.svelte +19 -1
  266. package/package/components/triggers/PermissionedAsLine.svelte +37 -3
  267. package/package/components/triggers/PermissionedAsLine.svelte.d.ts +6 -0
  268. package/package/components/triggers/TriggerEditorToolbar.svelte.d.ts +1 -1
  269. package/package/components/triggers/TriggerModeToggle.svelte +36 -7
  270. package/package/components/triggers/TriggerModeToggle.svelte.d.ts +1 -1
  271. package/package/components/triggers/TriggerSuspendedJobsModal.svelte.d.ts +1 -1
  272. package/package/components/triggers/TriggersEditor.svelte +10 -2
  273. package/package/components/triggers/TriggersWrapper.svelte +20 -0
  274. package/package/components/triggers/azure/AzureCapture.svelte +41 -0
  275. package/package/components/triggers/azure/AzureCapture.svelte.d.ts +44 -0
  276. package/package/components/triggers/azure/AzureTriggerEditor.svelte +20 -0
  277. package/package/components/triggers/azure/AzureTriggerEditor.svelte.d.ts +9 -0
  278. package/package/components/triggers/azure/AzureTriggerEditorConfigSection.svelte +301 -0
  279. package/package/components/triggers/azure/AzureTriggerEditorConfigSection.svelte.d.ts +16 -0
  280. package/package/components/triggers/azure/AzureTriggerEditorInner.svelte +422 -0
  281. package/package/components/triggers/azure/AzureTriggerEditorInner.svelte.d.ts +25 -0
  282. package/package/components/triggers/azure/AzureTriggerPanel.svelte +55 -0
  283. package/package/components/triggers/azure/AzureTriggerPanel.svelte.d.ts +10 -0
  284. package/{dist/sharedUtils/components/triggers/kafka → package/components/triggers/azure}/utils.d.ts +1 -1
  285. package/package/components/triggers/azure/utils.js +56 -0
  286. package/package/components/triggers/email/EmailTriggerEditorInner.svelte +15 -11
  287. package/package/components/triggers/gcp/GcpTriggerEditorInner.svelte +22 -14
  288. package/package/components/triggers/http/RouteEditorConfigSection.svelte +15 -7
  289. package/package/components/triggers/http/RouteEditorInner.svelte +16 -14
  290. package/package/components/triggers/http/RoutesGenerator.svelte +6 -1
  291. package/package/components/triggers/http/RoutesPanel.svelte +1 -1
  292. package/package/components/triggers/http/utils.d.ts +1 -1
  293. package/package/components/triggers/http/utils.js +2 -2
  294. package/package/components/triggers/kafka/KafkaTriggerEditorInner.svelte +22 -14
  295. package/package/components/triggers/mqtt/MqttTriggerEditorInner.svelte +22 -14
  296. package/package/components/triggers/native/NativeTriggerEditor.svelte +3 -0
  297. package/package/components/triggers/native/services/github/GitHubTriggerForm.svelte +118 -0
  298. package/package/components/triggers/native/services/github/GitHubTriggerForm.svelte.d.ts +17 -0
  299. package/package/components/triggers/native/utils.js +14 -0
  300. package/package/components/triggers/nats/NatsTriggerEditor.svelte.d.ts +4 -3
  301. package/package/components/triggers/nats/NatsTriggerEditorInner.svelte +22 -14
  302. package/package/components/triggers/postgres/PostgresTriggerEditor.svelte.d.ts +4 -3
  303. package/package/components/triggers/postgres/PostgresTriggerEditorInner.svelte +22 -14
  304. package/package/components/triggers/schedules/ScheduleEditorInner.svelte +22 -14
  305. package/package/components/triggers/sqs/SqsTriggerEditor.svelte.d.ts +4 -3
  306. package/package/components/triggers/sqs/SqsTriggerEditorInner.svelte +22 -14
  307. package/package/components/triggers/triggers.svelte.d.ts +1 -0
  308. package/package/components/triggers/triggers.svelte.js +24 -1
  309. package/package/components/triggers/utils.js +47 -6
  310. package/package/components/triggers/websocket/WebsocketTriggerEditorInner.svelte +22 -14
  311. package/package/components/triggers.d.ts +1 -1
  312. package/package/components/useFolderDefaultPermissionedAs.svelte.d.ts +13 -0
  313. package/package/components/useFolderDefaultPermissionedAs.svelte.js +63 -0
  314. package/package/components/useNestedRestartState.svelte.d.ts +56 -0
  315. package/package/components/useNestedRestartState.svelte.js +320 -0
  316. package/package/components/workspaceSettings/CreateWorkspace.svelte +16 -677
  317. package/package/components/workspaceSettings/CreateWorkspaceInner.svelte +604 -0
  318. package/package/components/workspaceSettings/CreateWorkspaceInner.svelte.d.ts +7 -0
  319. package/package/components/workspaceSettings/CustomInstanceDbSelect.svelte +27 -25
  320. package/package/components/workspaceSettings/CustomInstanceDbWizardModal.svelte +46 -8
  321. package/package/components/workspaceSettings/DataTableSettings.svelte +27 -22
  322. package/package/components/workspaceSettings/DucklakeSettings.svelte +1 -1
  323. package/package/components/workspaceSettings/ForkDatatableSection.svelte +228 -0
  324. package/package/components/workspaceSettings/ForkDatatableSection.svelte.d.ts +28 -0
  325. package/package/components/workspaceSettings/GitSyncFilterSettings.svelte +8 -2
  326. package/package/components/workspaceSettings/RulesetEditor.svelte +27 -2
  327. package/package/components/workspaceSettings/SharedUiSettings.svelte +175 -0
  328. package/package/components/workspaceSettings/SharedUiSettings.svelte.d.ts +3 -0
  329. package/package/components/workspaceSettings/VolumeStorageSettings.svelte +1 -1
  330. package/package/components/workspaceSettings/WorkspaceIntegrations.svelte +17 -1
  331. package/package/consts.d.ts +3 -0
  332. package/package/consts.js +10 -0
  333. package/package/gen/core/OpenAPI.js +1 -1
  334. package/package/gen/schemas.gen.d.ts +795 -59
  335. package/package/gen/schemas.gen.js +801 -60
  336. package/package/gen/services.gen.d.ts +475 -5
  337. package/package/gen/services.gen.js +976 -23
  338. package/package/gen/types.gen.d.ts +1865 -75
  339. package/package/githubApp.js +5 -1
  340. package/package/hubPaths.json +2 -8
  341. package/package/infer.d.ts +1 -1
  342. package/package/infer.js +50 -52
  343. package/package/infer.svelte.js +10 -1
  344. package/package/mcpEndpointTools.js +60 -4
  345. package/package/monaco_workers/sqlTypePlugin.worker.d.ts +10 -0
  346. package/package/monaco_workers/sqlTypePlugin.worker.js +39 -0
  347. package/package/script_helpers.d.ts +8 -2
  348. package/package/script_helpers.js +31 -0
  349. package/package/stores.d.ts +11 -0
  350. package/package/stores.js +6 -0
  351. package/package/system_prompts/index.d.ts +1 -0
  352. package/package/system_prompts/index.js +8 -0
  353. package/package/system_prompts/prompts.d.ts +17 -13
  354. package/package/system_prompts/prompts.js +921 -61
  355. package/package/templates/ci_test_bun.ts.template +27 -0
  356. package/package/templates/ci_test_python.py.template +26 -0
  357. package/package/utils/forkConflict.d.ts +26 -0
  358. package/package/utils/forkConflict.js +56 -0
  359. package/package/utils_deployable.d.ts +164 -121
  360. package/package/utils_deployable.js +61 -11
  361. package/package/utils_workspace_deploy.d.ts +8 -8
  362. package/package/utils_workspace_deploy.js +89 -421
  363. package/package.json +30 -6
  364. package/dist/sharedUtils/assets/tokens/colorTokensConfig.d.ts +0 -2
  365. package/dist/sharedUtils/base.d.ts +0 -1
  366. package/dist/sharedUtils/cloud.d.ts +0 -1
  367. package/dist/sharedUtils/common.d.ts +0 -111
  368. package/dist/sharedUtils/components/apps/components/display/dbtable/queries/count.d.ts +0 -5
  369. package/dist/sharedUtils/components/apps/components/display/dbtable/queries/delete.d.ts +0 -5
  370. package/dist/sharedUtils/components/apps/components/display/dbtable/queries/insert.d.ts +0 -5
  371. package/dist/sharedUtils/components/apps/components/display/dbtable/queries/select.d.ts +0 -13
  372. package/dist/sharedUtils/components/apps/components/display/dbtable/queries/update.d.ts +0 -11
  373. package/dist/sharedUtils/components/apps/components/display/dbtable/utils.d.ts +0 -95
  374. package/dist/sharedUtils/components/apps/editor/appPolicy.d.ts +0 -6
  375. package/dist/sharedUtils/components/apps/editor/appUtilsCore.d.ts +0 -7
  376. package/dist/sharedUtils/components/apps/editor/appUtilsS3.d.ts +0 -33
  377. package/dist/sharedUtils/components/apps/editor/commonAppUtils.d.ts +0 -10
  378. package/dist/sharedUtils/components/apps/editor/component/components.d.ts +0 -5371
  379. package/dist/sharedUtils/components/apps/editor/component/default-codes.d.ts +0 -3
  380. package/dist/sharedUtils/components/apps/editor/component/index.d.ts +0 -3
  381. package/dist/sharedUtils/components/apps/editor/component/sets.d.ts +0 -7
  382. package/dist/sharedUtils/components/apps/editor/componentsPanel/componentDefaultProps.d.ts +0 -3
  383. package/dist/sharedUtils/components/apps/gridUtils.d.ts +0 -14
  384. package/dist/sharedUtils/components/apps/inputType.d.ts +0 -178
  385. package/dist/sharedUtils/components/apps/rx.d.ts +0 -29
  386. package/dist/sharedUtils/components/apps/sharedTypes.d.ts +0 -21
  387. package/dist/sharedUtils/components/apps/types.d.ts +0 -274
  388. package/dist/sharedUtils/components/assets/lib.d.ts +0 -25
  389. package/dist/sharedUtils/components/common/alert/model.d.ts +0 -2
  390. package/dist/sharedUtils/components/common/badge/model.d.ts +0 -8
  391. package/dist/sharedUtils/components/common/button/model.d.ts +0 -45
  392. package/dist/sharedUtils/components/common/fileInput/model.d.ts +0 -1
  393. package/dist/sharedUtils/components/common/index.d.ts +0 -24
  394. package/dist/sharedUtils/components/common/skeleton/model.d.ts +0 -21
  395. package/dist/sharedUtils/components/dbTypes.d.ts +0 -14
  396. package/dist/sharedUtils/components/diff_drawer.d.ts +0 -26
  397. package/dist/sharedUtils/components/ducklake.d.ts +0 -1
  398. package/dist/sharedUtils/components/flows/scheduleUtils.d.ts +0 -7
  399. package/dist/sharedUtils/components/icons/index.d.ts +0 -101
  400. package/dist/sharedUtils/components/random_positive_adjetive.d.ts +0 -1
  401. package/dist/sharedUtils/components/raw_apps/rawAppPolicy.d.ts +0 -10
  402. package/dist/sharedUtils/components/raw_apps/utils.d.ts +0 -15
  403. package/dist/sharedUtils/components/triggers/email/utils.d.ts +0 -4
  404. package/dist/sharedUtils/components/triggers/gcp/utils.d.ts +0 -2
  405. package/dist/sharedUtils/components/triggers/http/utils.d.ts +0 -11
  406. package/dist/sharedUtils/components/triggers/mqtt/utils.d.ts +0 -2
  407. package/dist/sharedUtils/components/triggers/nats/utils.d.ts +0 -2
  408. package/dist/sharedUtils/components/triggers/postgres/utils.d.ts +0 -8
  409. package/dist/sharedUtils/components/triggers/sqs/utils.d.ts +0 -2
  410. package/dist/sharedUtils/components/triggers/triggers.svelte.d.ts +0 -32
  411. package/dist/sharedUtils/components/triggers/utils.d.ts +0 -80
  412. package/dist/sharedUtils/components/triggers/websocket/utils.d.ts +0 -2
  413. package/dist/sharedUtils/components/triggers.d.ts +0 -20
  414. package/dist/sharedUtils/gen/core/ApiError.d.ts +0 -10
  415. package/dist/sharedUtils/gen/core/ApiRequestOptions.d.ts +0 -13
  416. package/dist/sharedUtils/gen/core/ApiResult.d.ts +0 -7
  417. package/dist/sharedUtils/gen/core/CancelablePromise.d.ts +0 -26
  418. package/dist/sharedUtils/gen/core/OpenAPI.d.ts +0 -27
  419. package/dist/sharedUtils/gen/core/request.d.ts +0 -29
  420. package/dist/sharedUtils/gen/index.d.ts +0 -6
  421. package/dist/sharedUtils/gen/schemas.gen.d.ts +0 -7036
  422. package/dist/sharedUtils/gen/services.gen.d.ts +0 -6047
  423. package/dist/sharedUtils/gen/types.gen.d.ts +0 -21881
  424. package/dist/sharedUtils/history.svelte.d.ts +0 -9
  425. package/dist/sharedUtils/hub.d.ts +0 -49
  426. package/dist/sharedUtils/jsr.json +0 -6
  427. package/dist/sharedUtils/lib.d.ts +0 -5
  428. package/dist/sharedUtils/lib.es.js +0 -1588
  429. package/dist/sharedUtils/package.json +0 -12
  430. package/dist/sharedUtils/schema.d.ts +0 -3
  431. package/dist/sharedUtils/stores.d.ts +0 -97
  432. package/dist/sharedUtils/svelte5Utils.svelte.d.ts +0 -80
  433. package/dist/sharedUtils/toast.d.ts +0 -8
  434. package/dist/sharedUtils/utils.d.ts +0 -265
  435. package/package/components/copilot/chat/__tests__/app/appChat.eval.test.js +0 -153
  436. package/package/components/copilot/chat/__tests__/app/appEvalComparison.d.ts +0 -21
  437. package/package/components/copilot/chat/__tests__/app/appEvalComparison.js +0 -136
  438. package/package/components/copilot/chat/__tests__/app/appEvalHelpers.d.ts +0 -15
  439. package/package/components/copilot/chat/__tests__/app/appEvalHelpers.js +0 -107
  440. package/package/components/copilot/chat/__tests__/app/appEvalRunner.d.ts +0 -50
  441. package/package/components/copilot/chat/__tests__/app/appEvalRunner.js +0 -93
  442. package/package/components/copilot/chat/__tests__/app/appFixtureLoader.d.ts +0 -29
  443. package/package/components/copilot/chat/__tests__/app/appFixtureLoader.js +0 -134
  444. package/package/components/copilot/chat/__tests__/app/appResultsWriter.d.ts +0 -30
  445. package/package/components/copilot/chat/__tests__/app/appResultsWriter.js +0 -197
  446. package/package/components/copilot/chat/__tests__/app/initial/file_manager/backend/createFolder/main.d.ts +0 -10
  447. package/package/components/copilot/chat/__tests__/app/initial/file_manager/backend/createFolder/main.js +0 -9
  448. package/package/components/copilot/chat/__tests__/app/initial/file_manager/backend/createFolder/meta.json +0 -4
  449. package/package/components/copilot/chat/__tests__/app/initial/file_manager/backend/deleteItem/main.d.ts +0 -6
  450. package/package/components/copilot/chat/__tests__/app/initial/file_manager/backend/deleteItem/main.js +0 -5
  451. package/package/components/copilot/chat/__tests__/app/initial/file_manager/backend/deleteItem/meta.json +0 -4
  452. package/package/components/copilot/chat/__tests__/app/initial/file_manager/backend/listFiles/main.d.ts +0 -12
  453. package/package/components/copilot/chat/__tests__/app/initial/file_manager/backend/listFiles/main.js +0 -14
  454. package/package/components/copilot/chat/__tests__/app/initial/file_manager/backend/listFiles/meta.json +0 -4
  455. package/package/components/copilot/chat/__tests__/app/initial/file_manager/backend/listFolders/main.d.ts +0 -8
  456. package/package/components/copilot/chat/__tests__/app/initial/file_manager/backend/listFolders/main.js +0 -25
  457. package/package/components/copilot/chat/__tests__/app/initial/file_manager/backend/listFolders/meta.json +0 -4
  458. package/package/components/copilot/chat/__tests__/app/initial/file_manager/backend/moveItem/main.d.ts +0 -7
  459. package/package/components/copilot/chat/__tests__/app/initial/file_manager/backend/moveItem/main.js +0 -5
  460. package/package/components/copilot/chat/__tests__/app/initial/file_manager/backend/moveItem/meta.json +0 -4
  461. package/package/components/copilot/chat/__tests__/app/initial/file_manager/backend/renameItem/main.d.ts +0 -8
  462. package/package/components/copilot/chat/__tests__/app/initial/file_manager/backend/renameItem/main.js +0 -5
  463. package/package/components/copilot/chat/__tests__/app/initial/file_manager/backend/renameItem/meta.json +0 -4
  464. package/package/components/copilot/chat/__tests__/app/initial/file_manager/frontend/components/Breadcrumb.d.ts +0 -10
  465. package/package/components/copilot/chat/__tests__/app/initial/file_manager/frontend/components/Breadcrumb.tsx +0 -26
  466. package/package/components/copilot/chat/__tests__/app/initial/file_manager/frontend/components/FileItem.d.ts +0 -10
  467. package/package/components/copilot/chat/__tests__/app/initial/file_manager/frontend/components/FileItem.tsx +0 -79
  468. package/package/components/copilot/chat/__tests__/app/initial/file_manager/frontend/components/FileList.d.ts +0 -10
  469. package/package/components/copilot/chat/__tests__/app/initial/file_manager/frontend/components/FileList.tsx +0 -46
  470. package/package/components/copilot/chat/__tests__/app/initial/file_manager/frontend/components/FolderTree.d.ts +0 -10
  471. package/package/components/copilot/chat/__tests__/app/initial/file_manager/frontend/components/FolderTree.tsx +0 -56
  472. package/package/components/copilot/chat/__tests__/app/initial/file_manager/frontend/components/Toolbar.d.ts +0 -6
  473. package/package/components/copilot/chat/__tests__/app/initial/file_manager/frontend/components/Toolbar.tsx +0 -59
  474. package/package/components/copilot/chat/__tests__/app/initial/file_manager/frontend/index.d.ts +0 -16
  475. package/package/components/copilot/chat/__tests__/app/initial/file_manager/frontend/index.tsx +0 -119
  476. package/package/components/copilot/chat/__tests__/app/initial/shopping_cart/backend/addToCart/main.d.ts +0 -15
  477. package/package/components/copilot/chat/__tests__/app/initial/shopping_cart/backend/addToCart/main.js +0 -14
  478. package/package/components/copilot/chat/__tests__/app/initial/shopping_cart/backend/addToCart/meta.json +0 -4
  479. package/package/components/copilot/chat/__tests__/app/initial/shopping_cart/backend/calculateTotal/main.d.ts +0 -14
  480. package/package/components/copilot/chat/__tests__/app/initial/shopping_cart/backend/calculateTotal/main.js +0 -5
  481. package/package/components/copilot/chat/__tests__/app/initial/shopping_cart/backend/calculateTotal/meta.json +0 -4
  482. package/package/components/copilot/chat/__tests__/app/initial/shopping_cart/backend/getProducts/main.d.ts +0 -6
  483. package/package/components/copilot/chat/__tests__/app/initial/shopping_cart/backend/getProducts/main.js +0 -41
  484. package/package/components/copilot/chat/__tests__/app/initial/shopping_cart/backend/getProducts/meta.json +0 -4
  485. package/package/components/copilot/chat/__tests__/app/initial/shopping_cart/backend/removeFromCart/main.d.ts +0 -15
  486. package/package/components/copilot/chat/__tests__/app/initial/shopping_cart/backend/removeFromCart/main.js +0 -3
  487. package/package/components/copilot/chat/__tests__/app/initial/shopping_cart/backend/removeFromCart/meta.json +0 -4
  488. package/package/components/copilot/chat/__tests__/app/initial/shopping_cart/frontend/components/Cart.d.ts +0 -9
  489. package/package/components/copilot/chat/__tests__/app/initial/shopping_cart/frontend/components/Cart.tsx +0 -51
  490. package/package/components/copilot/chat/__tests__/app/initial/shopping_cart/frontend/components/ProductCard.d.ts +0 -8
  491. package/package/components/copilot/chat/__tests__/app/initial/shopping_cart/frontend/components/ProductCard.tsx +0 -27
  492. package/package/components/copilot/chat/__tests__/app/initial/shopping_cart/frontend/components/ProductList.d.ts +0 -8
  493. package/package/components/copilot/chat/__tests__/app/initial/shopping_cart/frontend/components/ProductList.tsx +0 -18
  494. package/package/components/copilot/chat/__tests__/app/initial/shopping_cart/frontend/index.d.ts +0 -12
  495. package/package/components/copilot/chat/__tests__/app/initial/shopping_cart/frontend/index.tsx +0 -81
  496. package/package/components/copilot/chat/__tests__/app/initial/test1_counter_app/backend/decrementCounter/main.d.ts +0 -3
  497. package/package/components/copilot/chat/__tests__/app/initial/test1_counter_app/backend/decrementCounter/main.js +0 -3
  498. package/package/components/copilot/chat/__tests__/app/initial/test1_counter_app/backend/decrementCounter/meta.json +0 -4
  499. package/package/components/copilot/chat/__tests__/app/initial/test1_counter_app/backend/incrementCounter/main.d.ts +0 -3
  500. package/package/components/copilot/chat/__tests__/app/initial/test1_counter_app/backend/incrementCounter/main.js +0 -3
  501. package/package/components/copilot/chat/__tests__/app/initial/test1_counter_app/backend/incrementCounter/meta.json +0 -4
  502. package/package/components/copilot/chat/__tests__/app/initial/test1_counter_app/frontend/index.d.ts +0 -2
  503. package/package/components/copilot/chat/__tests__/app/initial/test1_counter_app/frontend/index.tsx +0 -38
  504. package/package/components/copilot/chat/__tests__/app/variants/baseline.d.ts +0 -6
  505. package/package/components/copilot/chat/__tests__/app/variants/baseline.js +0 -10
  506. package/package/components/copilot/chat/__tests__/app/variants/index.d.ts +0 -3
  507. package/package/components/copilot/chat/__tests__/app/variants/index.js +0 -3
  508. package/package/components/copilot/chat/__tests__/app/variants/streamlined.d.ts +0 -6
  509. package/package/components/copilot/chat/__tests__/app/variants/streamlined.js +0 -137
  510. package/package/components/copilot/chat/__tests__/flow/expected/test1.json +0 -134
  511. package/package/components/copilot/chat/__tests__/flow/expected/test2.json +0 -183
  512. package/package/components/copilot/chat/__tests__/flow/expected/test3.json +0 -204
  513. package/package/components/copilot/chat/__tests__/flow/expected/test4.json +0 -175
  514. package/package/components/copilot/chat/__tests__/flow/expected/test5_modify_simple.json +0 -68
  515. package/package/components/copilot/chat/__tests__/flow/expected/test6_modify_medium.json +0 -142
  516. package/package/components/copilot/chat/__tests__/flow/expected/test7_modify_complex.json +0 -136
  517. package/package/components/copilot/chat/__tests__/flow/flowChat.eval.test.js +0 -294
  518. package/package/components/copilot/chat/__tests__/flow/flowEvalComparison.d.ts +0 -17
  519. package/package/components/copilot/chat/__tests__/flow/flowEvalComparison.js +0 -49
  520. package/package/components/copilot/chat/__tests__/flow/flowEvalHelpers.d.ts +0 -12
  521. package/package/components/copilot/chat/__tests__/flow/flowEvalHelpers.js +0 -79
  522. package/package/components/copilot/chat/__tests__/flow/flowEvalRunner.d.ts +0 -50
  523. package/package/components/copilot/chat/__tests__/flow/flowEvalRunner.js +0 -102
  524. package/package/components/copilot/chat/__tests__/flow/initial/test5_initial.json +0 -53
  525. package/package/components/copilot/chat/__tests__/flow/initial/test6_initial.json +0 -68
  526. package/package/components/copilot/chat/__tests__/flow/initial/test7_initial.json +0 -120
  527. package/package/components/copilot/chat/__tests__/flow/variants/baseline.d.ts +0 -6
  528. package/package/components/copilot/chat/__tests__/flow/variants/baseline.js +0 -10
  529. package/package/components/copilot/chat/__tests__/flow/variants/index.d.ts +0 -3
  530. package/package/components/copilot/chat/__tests__/flow/variants/index.js +0 -3
  531. package/package/components/copilot/chat/__tests__/flow/variants/minimal-single-tool.d.ts +0 -15
  532. package/package/components/copilot/chat/__tests__/flow/variants/minimal-single-tool.js +0 -388
  533. package/package/components/copilot/chat/__tests__/shared/baseEvalRunner.d.ts +0 -45
  534. package/package/components/copilot/chat/__tests__/shared/baseEvalRunner.js +0 -121
  535. package/package/components/copilot/chat/__tests__/shared/baseLLMEvaluator.d.ts +0 -28
  536. package/package/components/copilot/chat/__tests__/shared/baseLLMEvaluator.js +0 -96
  537. package/package/components/copilot/chat/__tests__/shared/baseResultsWriter.d.ts +0 -32
  538. package/package/components/copilot/chat/__tests__/shared/baseResultsWriter.js +0 -130
  539. package/package/components/copilot/chat/__tests__/shared/baseVariants.d.ts +0 -45
  540. package/package/components/copilot/chat/__tests__/shared/baseVariants.js +0 -57
  541. package/package/components/copilot/chat/__tests__/shared/index.d.ts +0 -10
  542. package/package/components/copilot/chat/__tests__/shared/index.js +0 -5
  543. package/package/components/copilot/chat/__tests__/shared/types.d.ts +0 -105
  544. package/package/components/copilot/chat/__tests__/shared/types.js +0 -9
  545. package/package/components/copilot/chat/flow/openFlowZod.js +0 -24
  546. package/package/components/copilot/chat/flow/utils.d.ts +0 -14
  547. package/package/components/copilot/chat/flow/utils.js +0 -108
  548. package/package/components/flows/agentToolUtils.test.js +0 -55
  549. /package/package/components/copilot/chat/{__tests__/app/appChat.eval.test.d.ts → app/core.test.d.ts} +0 -0
  550. /package/package/components/copilot/chat/{__tests__/flow/flowChat.eval.test.d.ts → flow/helperUtils.test.d.ts} +0 -0
  551. /package/package/components/copilot/chat/flow/{openFlowZod.d.ts → openFlowZod.gen.d.ts} +0 -0
  552. /package/package/components/{flows/agentToolUtils.test.d.ts → copilot/chat/flow/utils.test.d.ts} +0 -0
@@ -1,6 +1,6 @@
1
1
  import type { ChatCompletionSystemMessageParam, ChatCompletionUserMessageParam } from 'openai/resources/chat/completions.mjs';
2
2
  import { type Tool } from '../shared';
3
- import type { ContextElement, AppCodeSelectionElement } from '../context';
3
+ import { type ContextElement, type AppCodeSelectionElement } from '../context';
4
4
  export type BackendRunnableType = 'script' | 'flow' | 'hubscript' | 'inline';
5
5
  export interface InlineScript {
6
6
  language: 'bun' | 'python3';
@@ -57,28 +57,12 @@ export interface InspectorElementInfo {
57
57
  /** Computed styles of the element */
58
58
  styles: Record<string, string>;
59
59
  }
60
- /** Context about the currently selected file or runnable in the app editor */
60
+ /** App editor context that is implicitly attached to app-mode AI messages. */
61
61
  export interface SelectedContext {
62
- /** Type of selection: 'frontend' for frontend files, 'backend' for backend runnables, or 'none' if nothing is selected */
63
- type: 'frontend' | 'backend' | 'none';
64
- /** The path of the selected frontend file (when type is 'frontend') */
65
- frontendPath?: string;
66
- /** The content of the selected frontend file */
67
- frontendContent?: string;
68
- /** The key of the selected backend runnable (when type is 'backend') */
69
- backendKey?: string;
70
- /** The configuration of the selected backend runnable */
71
- backendRunnable?: BackendRunnable;
72
62
  /** Inspector-selected element info (when user has used the inspector tool) */
73
63
  inspectorElement?: InspectorElementInfo;
74
- /** Whether the file/runnable selection is excluded from being sent to the AI prompt */
75
- selectionExcluded?: boolean;
76
- /** Function to toggle whether the selection is excluded from the prompt */
77
- toggleSelectionExcluded?: () => void;
78
64
  /** Function to clear the inspector selection */
79
65
  clearInspector?: () => void;
80
- /** Function to clear the runnable selection (go back to frontend view) */
81
- clearRunnable?: () => void;
82
66
  /** Code selection from the editor (either frontend or backend) */
83
67
  codeSelection?: AppCodeSelectionElement;
84
68
  /** Function to clear the code selection */
@@ -94,6 +78,12 @@ export interface DataTableSchema {
94
78
  schemas: Record<string, Record<string, Record<string, string>>>;
95
79
  error?: string;
96
80
  }
81
+ export interface AppDatatableMetadata {
82
+ datatable_name: string;
83
+ schemas: Record<string, string[]>;
84
+ tableCount: number;
85
+ error?: string;
86
+ }
97
87
  export interface AppAIChatHelpers {
98
88
  listFrontendFiles: () => string[];
99
89
  getFrontendFile: (path: string) => string | undefined;
@@ -116,8 +106,10 @@ export interface AppAIChatHelpers {
116
106
  revertToSnapshot: (id: number) => void;
117
107
  /** Lint all frontend files and backend runnables, returns errors and warnings */
118
108
  lint: () => LintResult;
119
- /** Get all datatables configured in the app with their schemas */
120
- getDatatables: () => Promise<DataTableSchema[]>;
109
+ /** List configured datatables with schema/table names only. */
110
+ listDatatableTables: () => Promise<AppDatatableMetadata[]>;
111
+ /** Get columns for one datatable table. */
112
+ getDatatableTableSchema: (datatableName: string, schemaName: string, tableName: string) => Promise<Record<string, string>>;
121
113
  /** Get unique datatable names configured in the app (for UI policy selector) */
122
114
  getAvailableDatatableNames: () => string[];
123
115
  /** Execute a SQL query on a datatable. Optionally specify newTable to register a newly created table. */
@@ -1,15 +1,60 @@
1
1
  import { z } from 'zod';
2
2
  import { createSearchHubScriptsTool, createToolDef, createSearchWorkspaceTool, createGetRunnableDetailsTool } from '../shared';
3
- import { getDatatableSdkReference } from '../../../../system_prompts';
4
3
  import { aiChatManager } from '../AIChatManager.svelte';
4
+ import { formatAppDatatableContextTitle } from '../context';
5
5
  // ============= Utility =============
6
- /** Maximum characters per file in get_files tool */
7
- const BATCH_FILE_SIZE_LIMIT = 2500;
8
6
  /** Memoize a factory function - the factory is only called once, on first access */
9
7
  const memo = (factory) => {
10
8
  let cached;
11
9
  return () => (cached ??= factory());
12
10
  };
11
+ function countExactMatches(content, search) {
12
+ if (search.length === 0) {
13
+ return 0;
14
+ }
15
+ let count = 0;
16
+ let index = 0;
17
+ while ((index = content.indexOf(search, index)) !== -1) {
18
+ count += 1;
19
+ index += search.length;
20
+ }
21
+ return count;
22
+ }
23
+ function replaceFirstExactMatch(content, search, replace) {
24
+ const index = content.indexOf(search);
25
+ if (index === -1) {
26
+ return content;
27
+ }
28
+ return content.slice(0, index) + replace + content.slice(index + search.length);
29
+ }
30
+ function resolveAppPatchTarget(rawPath) {
31
+ const trimmedPath = rawPath.trim();
32
+ const backendMatch = trimmedPath.match(/^backend\/([^/]+)\/main\.(ts|py)$/);
33
+ if (backendMatch) {
34
+ return {
35
+ type: 'backend',
36
+ path: trimmedPath,
37
+ key: backendMatch[1],
38
+ extension: backendMatch[2]
39
+ };
40
+ }
41
+ return {
42
+ type: 'frontend',
43
+ path: trimmedPath.startsWith('/') ? trimmedPath : `/${trimmedPath}`
44
+ };
45
+ }
46
+ function getBackendInlineScriptExtension(runnable) {
47
+ return runnable.inlineScript?.language === 'python3' ? 'py' : 'ts';
48
+ }
49
+ function getFileKind(path) {
50
+ const filename = path.split('/').pop() ?? path;
51
+ const extension = filename.includes('.') ? filename.split('.').pop() : undefined;
52
+ return extension || 'unknown';
53
+ }
54
+ function getStaticInputKeys(runnable) {
55
+ const keys = runnable.staticInputs ? Object.keys(runnable.staticInputs) : [];
56
+ return keys.length > 0 ? keys : undefined;
57
+ }
13
58
  // ============= Frontend File Tools =============
14
59
  const getGetFrontendFileSchema = memo(() => z.object({
15
60
  path: z
@@ -24,6 +69,19 @@ const getSetFrontendFileSchema = memo(() => z.object({
24
69
  content: z.string().describe('The content of the file')
25
70
  }));
26
71
  const getSetFrontendFileToolDef = memo(() => createToolDef(getSetFrontendFileSchema(), 'set_frontend_file', 'Create or update a frontend file in the raw app. Returns lint diagnostics (errors and warnings).'));
72
+ const getPatchFileSchema = memo(() => z.object({
73
+ path: z
74
+ .string()
75
+ .describe('Path of the file to patch. Use frontend paths like /index.tsx or inline backend paths like backend/listRecipes/main.ts.'),
76
+ old_string: z.string().min(1).describe('Exact text to find in the current file content'),
77
+ new_string: z.string().describe('Replacement text'),
78
+ replace_all: z
79
+ .boolean()
80
+ .optional()
81
+ .default(false)
82
+ .describe('When true, replace every exact match. When false, old_string must match exactly once.')
83
+ }));
84
+ const getPatchFileToolDef = memo(() => createToolDef(getPatchFileSchema(), 'patch_file', 'Make a quick exact text edit in an existing frontend file or inline backend file. Prefer this for small localized changes instead of rewriting the whole file.'));
27
85
  const getDeleteFrontendFileSchema = memo(() => z.object({
28
86
  path: z.string().describe('The path of the frontend file to delete')
29
87
  }));
@@ -67,12 +125,17 @@ const getDeleteBackendRunnableToolDef = memo(() => createToolDef(getDeleteBacken
67
125
  // ============= Lint Tool =============
68
126
  const getLintSchema = memo(() => z.object({}));
69
127
  const getLintToolDef = memo(() => createToolDef(getLintSchema(), 'lint', 'Lint all frontend files and backend runnables. Returns errors and warnings grouped by frontend/backend. Use this to check for issues after making changes.'));
70
- // ============= Combined Files Tool =============
71
- const getGetFilesSchema = memo(() => z.object({}));
72
- const getGetFilesToolDef = memo(() => createToolDef(getGetFilesSchema(), 'get_files', 'Get an overview of all files in the app. Content may be truncated for large apps - use get_frontend_file or get_backend_runnable for full content of specific files.'));
128
+ const getListFilesSchema = memo(() => z.object({}));
129
+ const getListFilesToolDef = memo(() => createToolDef(getListFilesSchema(), 'list_files', 'List lightweight metadata for frontend files and backend runnables in the app. Does not include file or runnable content. Use get_frontend_file(path) or get_backend_runnable(key) to inspect specific content.'));
73
130
  // ============= Data Table Tools =============
74
- const getGetDatatablesSchema = memo(() => z.object({}));
75
- const getGetDatatablesToolDef = memo(() => createToolDef(getGetDatatablesSchema(), 'get_datatables', 'Get all datatables configured in this app with their full schemas. Returns datatable names, tables, and column definitions. Use this to understand the data layer available to the app.'));
131
+ const getListDatatablesSchema = memo(() => z.object({}));
132
+ const getListDatatablesToolDef = memo(() => createToolDef(getListDatatablesSchema(), 'list_datatables', 'List datatables configured in the app with schema and table names only. Does not include column definitions. Use this directly for table-list or available-tables summaries. Only call get_datatable_table_schema when column names/types are required.'));
133
+ const getGetDatatableTableSchemaSchema = memo(() => z.object({
134
+ datatable_name: z.string().describe('The datatable name to inspect, e.g. "main".'),
135
+ schema_name: z.string().describe('The schema name, e.g. "public".'),
136
+ table_name: z.string().describe('The table name to inspect.')
137
+ }));
138
+ const getGetDatatableTableSchemaToolDef = memo(() => createToolDef(getGetDatatableTableSchemaSchema(), 'get_datatable_table_schema', 'Get column definitions for one datatable table. Do not call this for row counts or table-list summaries; list_datatables is enough for those.'));
76
139
  const getExecDatatableSqlSchema = memo(() => z.object({
77
140
  datatable_name: z
78
141
  .string()
@@ -89,9 +152,6 @@ const getExecDatatableSqlSchema = memo(() => z.object({
89
152
  .describe('When executing a CREATE TABLE statement, provide this to register the new table in the app so it can be queried and its schema retrieved later.')
90
153
  }));
91
154
  const getExecDatatableSqlToolDef = memo(() => createToolDef(getExecDatatableSqlSchema(), 'exec_datatable_sql', 'Execute a SQL query on a datatable. Use this to explore data, test queries, create tables, or make changes. When creating a new table, pass new_table to register it in the app for future use.', { strict: false }));
92
- // ============= Selected Context Tool =============
93
- const getGetSelectedContextSchema = memo(() => z.object({}));
94
- const getGetSelectedContextToolDef = memo(() => createToolDef(getGetSelectedContextSchema(), 'get_selected_context', 'Get information about what is currently selected in the app editor. Returns the type of selection (frontend file or backend runnable) and the path/key of the selected item.'));
95
155
  // ============= Lint Result Formatting =============
96
156
  function formatLintMessages(messages) {
97
157
  let result = '';
@@ -140,68 +200,37 @@ function formatLintResultResponse(message, lintResult) {
140
200
  }
141
201
  // ============= Tools Array =============
142
202
  export const getAppTools = memo(() => [
143
- // Combined files tool (with per-file truncation for large apps)
203
+ // Lightweight file/runnable metadata tool (no source contents)
144
204
  {
145
- def: getGetFilesToolDef(),
205
+ def: getListFilesToolDef(),
146
206
  fn: async ({ helpers, toolId, toolCallbacks }) => {
147
- toolCallbacks.setToolStatus(toolId, { content: 'Getting all files...' });
207
+ toolCallbacks.setToolStatus(toolId, { content: 'Listing files...' });
148
208
  const files = helpers.getFiles();
149
- const frontendCount = Object.keys(files.frontend).length;
150
- const backendCount = Object.keys(files.backend).length;
151
- // Truncate each file individually to BATCH_FILE_SIZE_LIMIT
152
- let anyTruncated = false;
153
- const truncatedFiles = {
154
- frontend: {},
155
- backend: {}
209
+ const metadata = {
210
+ frontend: Object.entries(files.frontend).map(([path, content]) => ({
211
+ path,
212
+ size: content.length,
213
+ kind: getFileKind(path)
214
+ })),
215
+ backend: Object.entries(files.backend).map(([key, runnable]) => {
216
+ const staticInputKeys = getStaticInputKeys(runnable);
217
+ return {
218
+ key,
219
+ name: runnable.name,
220
+ type: runnable.type,
221
+ ...(runnable.path && { path: runnable.path }),
222
+ ...(runnable.inlineScript && {
223
+ language: runnable.inlineScript.language,
224
+ contentSize: runnable.inlineScript.content.length
225
+ }),
226
+ ...(staticInputKeys && { staticInputKeys })
227
+ };
228
+ })
156
229
  };
157
- for (const [path, content] of Object.entries(files.frontend)) {
158
- if (content.length > BATCH_FILE_SIZE_LIMIT) {
159
- truncatedFiles.frontend[path] =
160
- content.slice(0, BATCH_FILE_SIZE_LIMIT) + '\n... [TRUNCATED]';
161
- anyTruncated = true;
162
- }
163
- else {
164
- truncatedFiles.frontend[path] = content;
165
- }
166
- }
167
- for (const [key, runnable] of Object.entries(files.backend)) {
168
- const runnableCopy = { ...runnable };
169
- if (runnableCopy.inlineScript?.content) {
170
- const content = runnableCopy.inlineScript.content;
171
- if (content.length > BATCH_FILE_SIZE_LIMIT) {
172
- runnableCopy.inlineScript = {
173
- ...runnableCopy.inlineScript,
174
- content: content.slice(0, BATCH_FILE_SIZE_LIMIT) + '\n... [TRUNCATED]'
175
- };
176
- anyTruncated = true;
177
- }
178
- }
179
- truncatedFiles.backend[key] = runnableCopy;
180
- }
181
230
  toolCallbacks.setToolStatus(toolId, {
182
- content: `Retrieved ${frontendCount} frontend files and ${backendCount} backend runnables${anyTruncated ? ' (some truncated)' : ''}`
231
+ content: `Listed ${metadata.frontend.length} frontend files and ${metadata.backend.length} backend runnables`
183
232
  });
184
- let result = JSON.stringify(truncatedFiles, null, 2);
185
- if (anyTruncated) {
186
- result +=
187
- '\n\nNote: Some file contents were truncated. Use get_frontend_file(path) or get_backend_runnable(key) to get full content.';
188
- }
189
- return result;
190
- }
191
- },
192
- // Selected context tool
193
- {
194
- def: getGetSelectedContextToolDef(),
195
- fn: async ({ helpers, toolId, toolCallbacks }) => {
196
- toolCallbacks.setToolStatus(toolId, { content: 'Getting selected context...' });
197
- const context = helpers.getSelectedContext();
198
- const statusMsg = context.type === 'frontend'
199
- ? `Frontend file selected: ${context.frontendPath}`
200
- : context.type === 'backend'
201
- ? `Backend runnable selected: ${context.backendKey}`
202
- : 'No selection';
203
- toolCallbacks.setToolStatus(toolId, { content: statusMsg });
204
- return JSON.stringify(context, null, 2);
233
+ return JSON.stringify(metadata, null, 2);
205
234
  }
206
235
  },
207
236
  // Frontend tools
@@ -245,6 +274,73 @@ export const getAppTools = memo(() => [
245
274
  showDetails: true,
246
275
  showFade: true
247
276
  },
277
+ {
278
+ def: getPatchFileToolDef(),
279
+ streamArguments: true,
280
+ showDetails: true,
281
+ showFade: true,
282
+ fn: async ({ args, helpers, toolId, toolCallbacks }) => {
283
+ const parsedArgs = getPatchFileSchema().parse(args);
284
+ const { old_string: oldString, new_string: newString, replace_all: replaceAll } = parsedArgs;
285
+ const target = resolveAppPatchTarget(parsedArgs.path);
286
+ let currentContent = '';
287
+ let backendRunnable;
288
+ if (target.type === 'frontend') {
289
+ if (target.path === '/wmill.d.ts') {
290
+ throw new Error("'/wmill.d.ts' is generated automatically. Edit backend runnables instead.");
291
+ }
292
+ const frontendContent = helpers.getFrontendFile(target.path);
293
+ if (frontendContent === undefined) {
294
+ throw new Error(`Frontend file '${target.path}' not found.`);
295
+ }
296
+ currentContent = frontendContent;
297
+ }
298
+ else {
299
+ backendRunnable = helpers.getBackendRunnable(target.key);
300
+ if (!backendRunnable) {
301
+ throw new Error(`Backend runnable '${target.key}' not found.`);
302
+ }
303
+ if (backendRunnable.type !== 'inline' || !backendRunnable.inlineScript) {
304
+ throw new Error(`'${target.path}' points to backend runnable '${target.key}', but only inline runnables can be patched as files.`);
305
+ }
306
+ const expectedExtension = getBackendInlineScriptExtension(backendRunnable);
307
+ if (target.extension !== expectedExtension) {
308
+ throw new Error(`'${target.path}' does not match runnable '${target.key}' language. Use backend/${target.key}/main.${expectedExtension}.`);
309
+ }
310
+ currentContent = backendRunnable.inlineScript.content ?? '';
311
+ }
312
+ const matchCount = countExactMatches(currentContent, oldString);
313
+ if (matchCount === 0) {
314
+ throw new Error('old_string was not found in the current file content.');
315
+ }
316
+ if (!replaceAll && matchCount !== 1) {
317
+ throw new Error(`old_string matched ${matchCount} locations. Make it more specific or set replace_all to true.`);
318
+ }
319
+ const updatedContent = replaceAll
320
+ ? currentContent.split(oldString).join(newString)
321
+ : replaceFirstExactMatch(currentContent, oldString, newString);
322
+ toolCallbacks.setToolStatus(toolId, {
323
+ content: `Patching '${target.path}'...`
324
+ });
325
+ const lintResult = target.type === 'frontend'
326
+ ? helpers.setFrontendFile(target.path, updatedContent)
327
+ : await helpers.setBackendRunnable(target.key, {
328
+ ...backendRunnable,
329
+ inlineScript: {
330
+ ...backendRunnable.inlineScript,
331
+ content: updatedContent
332
+ }
333
+ });
334
+ toolCallbacks.setToolStatus(toolId, {
335
+ content: `Patched '${target.path}'`,
336
+ result: 'Success'
337
+ });
338
+ return formatLintResultResponse(`Patched '${target.path}' successfully.`, lintResult);
339
+ },
340
+ preAction: ({ toolCallbacks, toolId }) => {
341
+ toolCallbacks.setToolStatus(toolId, { content: 'Patching file...' });
342
+ }
343
+ },
248
344
  {
249
345
  def: getDeleteFrontendFileToolDef(),
250
346
  fn: async ({ args, helpers, toolId, toolCallbacks }) => {
@@ -351,24 +447,49 @@ export const getAppTools = memo(() => [
351
447
  createSearchHubScriptsTool(false),
352
448
  // Data table tools
353
449
  {
354
- def: getGetDatatablesToolDef(),
450
+ def: getListDatatablesToolDef(),
355
451
  fn: async ({ helpers, toolId, toolCallbacks }) => {
356
- toolCallbacks.setToolStatus(toolId, { content: 'Getting datatables...' });
452
+ toolCallbacks.setToolStatus(toolId, { content: 'Listing datatables...' });
357
453
  try {
358
- const datatables = await helpers.getDatatables();
359
- if (datatables.length === 0) {
454
+ const metadata = await helpers.listDatatableTables();
455
+ if (metadata.length === 0) {
360
456
  toolCallbacks.setToolStatus(toolId, { content: 'No datatables configured' });
361
457
  return 'No datatables are configured in this app. Use the Data panel in the sidebar to add datatable references.';
362
458
  }
363
- const totalTables = datatables.reduce((acc, dt) => acc +
364
- Object.values(dt.schemas).reduce((schemaAcc, tables) => schemaAcc + Object.keys(tables).length, 0), 0);
459
+ const totalTables = metadata.reduce((acc, datatable) => acc + datatable.tableCount, 0);
365
460
  toolCallbacks.setToolStatus(toolId, {
366
- content: `Found ${datatables.length} datatable(s) with ${totalTables} table(s)`
461
+ content: `Listed ${metadata.length} datatable(s) with ${totalTables} table(s)`
367
462
  });
368
- return JSON.stringify(datatables, null, 2);
463
+ return JSON.stringify(metadata, null, 2);
369
464
  }
370
465
  catch (e) {
371
- const errorMsg = `Error getting datatables: ${e instanceof Error ? e.message : String(e)}`;
466
+ const errorMsg = `Error listing datatables: ${e instanceof Error ? e.message : String(e)}`;
467
+ toolCallbacks.setToolStatus(toolId, { content: errorMsg, error: errorMsg });
468
+ return errorMsg;
469
+ }
470
+ }
471
+ },
472
+ {
473
+ def: getGetDatatableTableSchemaToolDef(),
474
+ fn: async ({ args, helpers, toolId, toolCallbacks }) => {
475
+ const parsedArgs = getGetDatatableTableSchemaSchema().parse(args);
476
+ toolCallbacks.setToolStatus(toolId, {
477
+ content: `Getting schema for ${parsedArgs.datatable_name}.${parsedArgs.schema_name}.${parsedArgs.table_name}...`
478
+ });
479
+ try {
480
+ const columns = await helpers.getDatatableTableSchema(parsedArgs.datatable_name, parsedArgs.schema_name, parsedArgs.table_name);
481
+ toolCallbacks.setToolStatus(toolId, {
482
+ content: `Retrieved schema for ${parsedArgs.schema_name}.${parsedArgs.table_name}`
483
+ });
484
+ return JSON.stringify({
485
+ datatable_name: parsedArgs.datatable_name,
486
+ schema_name: parsedArgs.schema_name,
487
+ table_name: parsedArgs.table_name,
488
+ columns
489
+ }, null, 2);
490
+ }
491
+ catch (e) {
492
+ const errorMsg = `Error getting table schema: ${e instanceof Error ? e.message : String(e)}`;
372
493
  toolCallbacks.setToolStatus(toolId, { content: errorMsg, error: errorMsg });
373
494
  return errorMsg;
374
495
  }
@@ -471,8 +592,9 @@ For inline scripts, the code must have a \`main\` function as its entrypoint.
471
592
  ## Available Tools
472
593
 
473
594
  ### File Management
474
- - \`get_files()\`: Get an overview of all files (content may be truncated for large files)
595
+ - \`list_files()\`: List lightweight metadata for frontend files and backend runnables. It does not include file or runnable content.
475
596
  - \`get_frontend_file(path)\`: Get full content of a specific frontend file
597
+ - \`patch_file(path, old_string, new_string, replace_all?)\`: Make a quick exact text edit to an existing file. Use frontend paths like \`/index.tsx\` and inline backend paths like \`backend/listRecipes/main.ts\`.
476
598
  - \`set_frontend_file(path, content)\`: Create or update a frontend file. Returns lint diagnostics.
477
599
  - \`delete_frontend_file(path)\`: Delete a frontend file
478
600
  - \`get_backend_runnable(key)\`: Get full configuration of a specific backend runnable
@@ -482,13 +604,23 @@ For inline scripts, the code must have a \`main\` function as its entrypoint.
482
604
  ### Linting
483
605
  - \`lint()\`: Lint all files. Returns errors/warnings grouped by frontend/backend. Use this to check for issues after making changes.
484
606
 
607
+ ## Quick Edits with patch_file
608
+
609
+ Use \`patch_file\` for small, localized edits when you can copy an exact snippet from the current file contents.
610
+
611
+ - \`old_string\` must be copied exactly from the current file contents
612
+ - Leave \`replace_all\` as false unless you intentionally want to update every exact match
613
+ - Never patch \`/wmill.d.ts\`; it is generated automatically from backend runnables
614
+ - Use \`set_frontend_file\` or \`set_backend_runnable\` instead for large rewrites, new files, or new runnables
615
+
485
616
  ### Discovery
486
617
  - \`search_workspace(query, type)\`: Search workspace scripts and flows
487
618
  - \`get_runnable_details(path, type)\`: Get details (summary, description, schema, content) of a specific script or flow
488
619
  - \`search_hub_scripts(query)\`: Search hub scripts
489
620
 
490
621
  ### Data Tables
491
- - \`get_datatables()\`: Get all datatables configured in the app with their schemas (tables, columns, types)
622
+ - \`list_datatables()\`: List configured datatables with schema and table names only. Does not include columns. Use this directly for table-list or available-tables summaries.
623
+ - \`get_datatable_table_schema(datatable_name, schema_name, table_name)\`: Get column definitions for one table. Do not call this for simple row counts or table-list summaries.
492
624
  - \`exec_datatable_sql(datatable_name, sql, new_table?)\`: Execute SQL query on a datatable. Use for data exploration or modifications. When creating a new table, pass \`new_table: { schema, name }\` to register it in the app.
493
625
 
494
626
  ## Data Storage with Data Tables
@@ -497,7 +629,7 @@ For inline scripts, the code must have a \`main\` function as its entrypoint.
497
629
 
498
630
  ### Key Principles
499
631
 
500
- 1. **Always check existing tables first**: Use \`get_datatables()\` to see what tables are already available. If a suitable table exists, **always reuse it** rather than creating a new one.
632
+ 1. **Always check existing tables first**: Use \`list_datatables()\` to see what tables are already available. If a suitable table exists, **always reuse it** rather than creating a new one. For dashboards that only show available tables or row counts, \`list_datatables()\` is enough. Only call \`get_datatable_table_schema()\` for tables whose column names/types you need.
501
633
 
502
634
  2. **CRITICAL: Create tables ONLY via exec_datatable_sql tool**: When you need to create a new table, you MUST use the \`exec_datatable_sql\` tool with the \`new_table\` parameter. **NEVER** create tables inside backend runnables using SQL queries - this will not register the table properly and it won't be available for future use.
503
635
  \`\`\`
@@ -541,9 +673,7 @@ def main(user_id: str):
541
673
  return user
542
674
  \`\`\`
543
675
 
544
- ### Datatable Client API Reference
545
-
546
- ${getDatatableSdkReference()}
676
+ Use these examples for normal datatable access.
547
677
 
548
678
  ### Schema Modifications (DDL) - Use exec_datatable_sql tool ONLY
549
679
 
@@ -618,12 +748,13 @@ When you are using the windmill-client, do not forget that as id for variables o
618
748
 
619
749
  ## Instructions
620
750
 
621
- 1. Start with \`get_files()\` to get an overview of all frontend files and backend runnables (content may be truncated for large files)
622
- 2. Use \`get_frontend_file(path)\` or \`get_backend_runnable(key)\` to get full content of specific files when needed
623
- 3. Make changes using \`set_frontend_file\` and \`set_backend_runnable\`. These return lint diagnostics.
751
+ 1. Use the smallest context needed. If the target file or runnable is clear, inspect only that item with \`get_frontend_file(path)\` or \`get_backend_runnable(key)\`.
752
+ 2. Use \`list_files()\` only when the target is unclear or the request needs a broad app overview. \`list_files()\` returns metadata only, never file contents.
753
+ 3. For small localized edits, prefer \`patch_file\`. Use \`set_frontend_file\` and \`set_backend_runnable\` for larger rewrites, new files, or new runnables. These return lint diagnostics.
624
754
  4. Use \`lint()\` at the end to check for and fix any remaining errors
625
755
 
626
756
  When creating a new app, use \`search_workspace\` or \`search_hub_scripts\` to find existing scripts/flows to reuse.
757
+ When the user mentions frontend files or backend runnables in context, only their identifiers are included. Use \`get_frontend_file\` or \`get_backend_runnable\` to inspect their contents before editing them or relying on implementation details.
627
758
 
628
759
  `;
629
760
  // Add datatable creation policy context
@@ -658,50 +789,10 @@ const MAX_CONTEXT_CONTENT_LENGTH = 3000;
658
789
  export function prepareAppUserMessage(instructions, selectedContext, additionalContext) {
659
790
  let content = '';
660
791
  // Check if we have any context to add
661
- const hasSelectedContext = selectedContext && (selectedContext.type !== 'none' || selectedContext.inspectorElement);
792
+ const hasSelectedContext = selectedContext && (selectedContext.inspectorElement || selectedContext.codeSelection);
662
793
  const hasAdditionalContext = additionalContext && additionalContext.length > 0;
663
794
  if (hasSelectedContext || hasAdditionalContext) {
664
795
  content += `## SELECTED CONTEXT:\n`;
665
- // Add frontend file context with content (unless excluded)
666
- if (selectedContext &&
667
- selectedContext.type === 'frontend' &&
668
- selectedContext.frontendPath &&
669
- !selectedContext.selectionExcluded) {
670
- content += `The user is currently viewing the frontend file: **${selectedContext.frontendPath}**\n`;
671
- if (selectedContext.frontendContent) {
672
- const truncatedContent = selectedContext.frontendContent.length > MAX_CONTEXT_CONTENT_LENGTH
673
- ? selectedContext.frontendContent.slice(0, MAX_CONTEXT_CONTENT_LENGTH) +
674
- '\n... [TRUNCATED]'
675
- : selectedContext.frontendContent;
676
- content += `\n\`\`\`\n${truncatedContent}\n\`\`\`\n`;
677
- }
678
- }
679
- // Add backend runnable context with content (unless excluded)
680
- if (selectedContext &&
681
- selectedContext.type === 'backend' &&
682
- selectedContext.backendKey &&
683
- !selectedContext.selectionExcluded) {
684
- content += `The user is currently viewing the backend runnable: **${selectedContext.backendKey}**\n`;
685
- if (selectedContext.backendRunnable) {
686
- const runnable = selectedContext.backendRunnable;
687
- content += `- **Name**: ${runnable.name}\n`;
688
- content += `- **Type**: ${runnable.type}\n`;
689
- if (runnable.path) {
690
- content += `- **Path**: ${runnable.path}\n`;
691
- }
692
- if (runnable.inlineScript) {
693
- const truncatedCode = runnable.inlineScript.content.length > MAX_CONTEXT_CONTENT_LENGTH
694
- ? runnable.inlineScript.content.slice(0, MAX_CONTEXT_CONTENT_LENGTH) +
695
- '\n... [TRUNCATED]'
696
- : runnable.inlineScript.content;
697
- content += `- **Language**: ${runnable.inlineScript.language}\n`;
698
- content += `- **Code**:\n\`\`\`${runnable.inlineScript.language === 'bun' ? 'typescript' : 'python'}\n${truncatedCode}\n\`\`\`\n`;
699
- }
700
- if (runnable.staticInputs && Object.keys(runnable.staticInputs).length > 0) {
701
- content += `- **Static inputs**: ${JSON.stringify(runnable.staticInputs)}\n`;
702
- }
703
- }
704
- }
705
796
  // Add inspector element context if available
706
797
  if (selectedContext?.inspectorElement) {
707
798
  const el = selectedContext.inspectorElement;
@@ -734,49 +825,29 @@ export function prepareAppUserMessage(instructions, selectedContext, additionalC
734
825
  content += `\n### ADDITIONAL CONTEXT (mentioned by user):\n`;
735
826
  for (const ctx of additionalContext) {
736
827
  if (ctx.type === 'app_frontend_file') {
737
- const fileCtx = ctx;
738
- content += `\n**Frontend File: ${fileCtx.path}**\n`;
739
- const truncatedContent = fileCtx.content.length > MAX_CONTEXT_CONTENT_LENGTH
740
- ? fileCtx.content.slice(0, MAX_CONTEXT_CONTENT_LENGTH) + '\n... [TRUNCATED]'
741
- : fileCtx.content;
742
- content += `\`\`\`\n${truncatedContent}\n\`\`\`\n`;
828
+ content += `\n- Frontend file: ${ctx.path}\n`;
743
829
  }
744
830
  else if (ctx.type === 'app_backend_runnable') {
745
- const runnableCtx = ctx;
746
- const runnable = runnableCtx.runnable;
747
- content += `\n**Backend Runnable: ${runnableCtx.key}**\n`;
748
- content += `- **Name**: ${runnable.name}\n`;
749
- content += `- **Type**: ${runnable.type}\n`;
750
- if (runnable.path) {
751
- content += `- **Path**: ${runnable.path}\n`;
752
- }
753
- if (runnable.inlineScript) {
754
- const truncatedCode = runnable.inlineScript.content.length > MAX_CONTEXT_CONTENT_LENGTH
755
- ? runnable.inlineScript.content.slice(0, MAX_CONTEXT_CONTENT_LENGTH) +
756
- '\n... [TRUNCATED]'
757
- : runnable.inlineScript.content;
758
- content += `- **Language**: ${runnable.inlineScript.language}\n`;
759
- content += `- **Code**:\n\`\`\`${runnable.inlineScript.language === 'bun' ? 'typescript' : 'python'}\n${truncatedCode}\n\`\`\`\n`;
760
- }
761
- if (runnable.staticInputs && Object.keys(runnable.staticInputs).length > 0) {
762
- content += `- **Static inputs**: ${JSON.stringify(runnable.staticInputs)}\n`;
763
- }
831
+ content += `\n- Backend runnable: ${ctx.key}\n`;
764
832
  }
765
833
  else if (ctx.type === 'app_datatable') {
766
834
  const datatableCtx = ctx;
767
- const tableRef = datatableCtx.schemaName === 'public'
768
- ? `${datatableCtx.datatableName}/${datatableCtx.tableName}`
769
- : `${datatableCtx.datatableName}/${datatableCtx.schemaName}:${datatableCtx.tableName}`;
835
+ const tableRef = formatAppDatatableContextTitle(datatableCtx.datatableName, datatableCtx.schemaName, datatableCtx.tableName);
770
836
  content += `\n**Table: ${tableRef}**\n`;
771
837
  content += `- **Datatable**: ${datatableCtx.datatableName}\n`;
772
838
  content += `- **Schema**: ${datatableCtx.schemaName}\n`;
773
839
  content += `- **Table**: ${datatableCtx.tableName}\n`;
774
840
  // Format columns as column_name: type
775
- const columnsStr = JSON.stringify(datatableCtx.columns, null, 2);
776
- const truncatedColumns = columnsStr.length > MAX_CONTEXT_CONTENT_LENGTH
777
- ? columnsStr.slice(0, MAX_CONTEXT_CONTENT_LENGTH) + '\n... [TRUNCATED]'
778
- : columnsStr;
779
- content += `- **Columns** (column_name -> type):\n\`\`\`json\n${truncatedColumns}\n\`\`\`\n`;
841
+ if (datatableCtx.columns) {
842
+ const columnsStr = JSON.stringify(datatableCtx.columns, null, 2);
843
+ const truncatedColumns = columnsStr.length > MAX_CONTEXT_CONTENT_LENGTH
844
+ ? columnsStr.slice(0, MAX_CONTEXT_CONTENT_LENGTH) + '\n... [TRUNCATED]'
845
+ : columnsStr;
846
+ content += `- **Columns** (column_name -> type):\n\`\`\`json\n${truncatedColumns}\n\`\`\`\n`;
847
+ }
848
+ else {
849
+ content += `- **Columns**: not loaded. Use get_datatable_table_schema() if column names or types are needed.\n`;
850
+ }
780
851
  }
781
852
  }
782
853
  }