windmill-components 1.531.1 → 1.537.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.
Files changed (153) hide show
  1. package/package/components/ArgInput.svelte +69 -19
  2. package/package/components/Auth0Setting.svelte +8 -3
  3. package/package/components/Dev.svelte +5 -4
  4. package/package/components/DiffDrawer.svelte +2 -2
  5. package/package/components/DiffEditor.svelte +34 -37
  6. package/package/components/DiffEditor.svelte.d.ts +23 -39
  7. package/package/components/EditableSchemaForm.svelte +67 -67
  8. package/package/components/EditableSchemaForm.svelte.d.ts +3 -3
  9. package/package/components/Editor.svelte +32 -11
  10. package/package/components/Editor.svelte.d.ts +6 -0
  11. package/package/components/EditorBar.svelte +2 -2
  12. package/package/components/EditorBar.svelte.d.ts +1 -0
  13. package/package/components/FieldHeader.svelte +1 -1
  14. package/package/components/FlowBuilder.svelte +7 -4
  15. package/package/components/FlowPreviewContent.svelte +3 -3
  16. package/package/components/FlowStatusViewer.svelte +28 -0
  17. package/package/components/FlowStatusViewerInner.svelte +72 -20
  18. package/package/components/FlowStatusViewerInner.svelte.d.ts +7 -0
  19. package/package/components/ModulePreview.svelte +2 -1
  20. package/package/components/ModulePreview.svelte.d.ts +1 -0
  21. package/package/components/ModulePreviewForm.svelte +72 -65
  22. package/package/components/ModulePreviewResultViewer.svelte +13 -18
  23. package/package/components/ModuleTest.svelte +10 -6
  24. package/package/components/ModuleTest.svelte.d.ts +1 -0
  25. package/package/components/OktaSetting.svelte +8 -3
  26. package/package/components/Portal.svelte +11 -7
  27. package/package/components/Portal.svelte.d.ts +19 -39
  28. package/package/components/ResourceEditor.svelte +4 -0
  29. package/package/components/RunForm.svelte +2 -2
  30. package/package/components/RunForm.svelte.d.ts +1 -1
  31. package/package/components/RunFormAdvancedPopup.svelte +13 -1
  32. package/package/components/SchemaForm.svelte +1 -2
  33. package/package/components/ScriptBuilder.svelte +1 -1
  34. package/package/components/ScriptEditor.svelte +22 -7
  35. package/package/components/SimpleEditor.svelte +0 -1
  36. package/package/components/StringTypeNarrowing.svelte.d.ts +1 -1
  37. package/package/components/apps/components/layout/AppModal.svelte +2 -2
  38. package/package/components/apps/editor/component/ComponentNavigation.svelte +3 -2
  39. package/package/components/apps/editor/inlineScriptsPanel/InlineScriptEditor.svelte +1 -1
  40. package/package/components/apps/editor/inlineScriptsPanel/InlineScriptRunnableByPath.svelte +0 -1
  41. package/package/components/apps/editor/settingsPanel/ArrayStaticInputEditor.svelte +3 -1
  42. package/package/components/apps/editor/settingsPanel/GridCondition.svelte +3 -1
  43. package/package/components/apps/editor/settingsPanel/GridNavbar.svelte +3 -1
  44. package/package/components/apps/editor/settingsPanel/GridTab.svelte +3 -1
  45. package/package/components/apps/editor/settingsPanel/OneOfInputSpecsEditor.svelte +55 -53
  46. package/package/components/apps/editor/settingsPanel/TableActions.svelte +3 -1
  47. package/package/components/common/button/model.d.ts +1 -1
  48. package/package/components/common/drawer/Disposable.svelte +51 -30
  49. package/package/components/common/drawer/Disposable.svelte.d.ts +12 -44
  50. package/package/components/common/drawer/Drawer.svelte +15 -11
  51. package/package/components/copilot/FlowInlineScriptAIButton.svelte +4 -2
  52. package/package/components/copilot/FlowInlineScriptAIButton.svelte.d.ts +4 -1
  53. package/package/components/copilot/MetadataGen.svelte +14 -3
  54. package/package/components/copilot/autocomplete/Autocompletor.js +0 -2
  55. package/package/components/copilot/chat/AIChat.svelte +2 -4
  56. package/package/components/copilot/chat/AIChatInput.svelte +3 -3
  57. package/package/components/copilot/chat/AIChatManager.svelte.js +24 -12
  58. package/package/components/copilot/chat/AvailableContextList.svelte +243 -26
  59. package/package/components/copilot/chat/AvailableContextList.svelte.d.ts +2 -1
  60. package/package/components/copilot/chat/ContextElementBadge.svelte +31 -15
  61. package/package/components/copilot/chat/ContextElementBadge.svelte.d.ts +5 -20
  62. package/package/components/copilot/chat/ContextManager.svelte.d.ts +15 -2
  63. package/package/components/copilot/chat/ContextManager.svelte.js +134 -24
  64. package/package/components/copilot/chat/ContextTextarea.svelte +22 -49
  65. package/package/components/copilot/chat/ToolContentDisplay.svelte +10 -1
  66. package/package/components/copilot/chat/ToolExecutionDisplay.svelte +3 -3
  67. package/package/components/copilot/chat/context.d.ts +19 -1
  68. package/package/components/copilot/chat/context.js +1 -0
  69. package/package/components/copilot/chat/flow/FlowAIChat.svelte +109 -7
  70. package/package/components/copilot/chat/flow/core.d.ts +13 -1
  71. package/package/components/copilot/chat/flow/core.js +171 -19
  72. package/package/components/copilot/chat/flow/uiIntents.d.ts +8 -0
  73. package/package/components/copilot/chat/flow/uiIntents.js +5 -0
  74. package/package/components/copilot/chat/flow/useUiIntent.d.ts +5 -0
  75. package/package/components/copilot/chat/flow/useUiIntent.js +12 -0
  76. package/package/components/copilot/chat/monaco-adapter.d.ts +22 -4
  77. package/package/components/copilot/chat/monaco-adapter.js +55 -16
  78. package/package/components/copilot/chat/script/core.d.ts +2 -2
  79. package/package/components/copilot/chat/script/core.js +54 -124
  80. package/package/components/copilot/chat/shared.d.ts +14 -2
  81. package/package/components/copilot/chat/shared.js +170 -7
  82. package/package/components/copilot/lib.js +12 -7
  83. package/package/components/copilot/shared.d.ts +1 -1
  84. package/package/components/copilot/shared.js +16 -10
  85. package/package/components/flows/FlowEditor.svelte +15 -1
  86. package/package/components/flows/FlowEditor.svelte.d.ts +1 -0
  87. package/package/components/flows/FlowModuleIcon.svelte +39 -0
  88. package/package/components/flows/FlowModuleIcon.svelte.d.ts +10 -0
  89. package/package/components/flows/common/FlowCardHeader.svelte +4 -1
  90. package/package/components/flows/content/FlowBranchesAllWrapper.svelte +6 -0
  91. package/package/components/flows/content/FlowBranchesOneWrapper.svelte +6 -0
  92. package/package/components/flows/content/FlowEditorPanel.svelte +2 -1
  93. package/package/components/flows/content/FlowEditorPanel.svelte.d.ts +1 -0
  94. package/package/components/flows/content/FlowInput.svelte +31 -34
  95. package/package/components/flows/content/FlowInput.svelte.d.ts +1 -0
  96. package/package/components/flows/content/FlowLoop.svelte +7 -0
  97. package/package/components/flows/content/FlowModuleComponent.svelte +39 -44
  98. package/package/components/flows/content/FlowModuleScript.svelte +1 -1
  99. package/package/components/flows/content/FlowModuleSuspend.svelte +16 -18
  100. package/package/components/flows/content/FlowWhileLoop.svelte +6 -0
  101. package/package/components/flows/content/ScriptEditorDrawer.svelte +9 -11
  102. package/package/components/flows/dfs.d.ts +1 -1
  103. package/package/components/flows/dfs.js +6 -6
  104. package/package/components/flows/flowInfers.js +7 -7
  105. package/package/components/flows/flowStateUtils.svelte.js +1 -2
  106. package/package/components/flows/map/FlowModuleSchemaItem.svelte +12 -26
  107. package/package/components/flows/map/MapItem.svelte +12 -39
  108. package/package/components/flows/map/VirtualItem.svelte +1 -1
  109. package/package/components/flows/pickers/TopLevelNode.svelte +1 -1
  110. package/package/components/flows/propPicker/InputPickerInner.svelte +5 -5
  111. package/package/components/flows/propPicker/OutputPickerInner.svelte +143 -118
  112. package/package/components/flows/propPicker/OutputPickerInner.svelte.d.ts +7 -16
  113. package/package/components/flows/{testSteps.svelte.d.ts → stepsInputArgs.svelte.d.ts} +2 -1
  114. package/package/components/flows/{testSteps.svelte.js → stepsInputArgs.svelte.js} +15 -3
  115. package/package/components/flows/types.d.ts +16 -3
  116. package/package/components/flows/utils.js +3 -0
  117. package/package/components/graph/FlowGraphV2.svelte +1 -1
  118. package/package/components/graph/renderers/nodes/AIToolNode.svelte +4 -4
  119. package/package/components/graph/renderers/nodes/NewAIToolNode.svelte +71 -54
  120. package/package/components/propertyPicker/ObjectViewer.svelte +11 -3
  121. package/package/components/raw_apps/RawAppInlineScriptEditor.svelte +1 -1
  122. package/package/components/schema/AddPropertyV2.svelte +2 -7
  123. package/package/components/schema/AddPropertyV2.svelte.d.ts +3 -20
  124. package/package/components/schema/EditableSchemaDrawer.svelte +109 -115
  125. package/package/components/schema/EditableSchemaDrawer.svelte.d.ts +2 -1
  126. package/package/components/schema/EditableSchemaSdkWrapper.svelte +16 -3
  127. package/package/components/schema/EditableSchemaSdkWrapper.svelte.d.ts +4 -1
  128. package/package/components/schema/EditableSchemaWrapper.svelte +3 -10
  129. package/package/components/schema/FlowPropertyEditor.svelte +83 -57
  130. package/package/components/schema/FlowPropertyEditor.svelte.d.ts +1 -1
  131. package/package/components/schema/PropertyEditor.svelte.d.ts +1 -1
  132. package/package/components/schema/SchemaFormDND.svelte +11 -10
  133. package/package/components/schema/SchemaFormDND.svelte.d.ts +3 -2
  134. package/package/components/schema/editable_schema_wrapper.d.ts +0 -3
  135. package/package/components/schema/jsonSchemaResource.svelte.d.ts +2 -0
  136. package/package/components/schema/jsonSchemaResource.svelte.js +40 -0
  137. package/package/components/settings/PremiumInfo.svelte +7 -2
  138. package/package/components/triggers/CaptureWrapper.svelte +2 -13
  139. package/package/components/triggers/CaptureWrapper.svelte.d.ts +1 -1
  140. package/package/components/triggers/TriggersWrapper.svelte +1 -0
  141. package/package/components/triggers/http/RouteEditorInner.svelte +1 -1
  142. package/package/components/triggers/nats/NatsTriggerEditorInner.svelte +23 -20
  143. package/package/components/triggers/nats/NatsTriggersConfigSection.svelte +15 -27
  144. package/package/components/triggers/nats/NatsTriggersConfigSection.svelte.d.ts +7 -5
  145. package/package/components/triggers/websocket/WebsocketTriggerEditorInner.svelte +16 -16
  146. package/package/hubPaths.json +3 -1
  147. package/package/script_helpers.d.ts +2 -2
  148. package/package/script_helpers.js +2 -0
  149. package/package/stores.d.ts +1 -0
  150. package/package/stores.js +8 -1
  151. package/package/utils.d.ts +1 -1
  152. package/package.json +14 -14
  153. package/package/components/ModulePreviewResultViewer.svelte.d.ts +0 -28
@@ -1,15 +1,13 @@
1
1
  import { ResourceService, JobService } from '../../../../gen/services.gen';
2
- import { capitalize, emptySchema, isObject, toCamel } from '../../../../utils';
2
+ import { capitalize, isObject, toCamel } from '../../../../utils';
3
3
  import { get } from 'svelte/store';
4
4
  import { compile, phpCompile, pythonCompile } from '../../utils';
5
- import { copilotSessionModel, dbSchemas } from '../../../../stores';
6
- import { scriptLangToEditorLang } from '../../../../scripts';
5
+ import { dbSchemas, getCurrentModel } from '../../../../stores';
7
6
  import { getDbSchemas } from '../../../apps/components/display/dbtable/utils';
8
7
  import { PYTHON_PREPROCESSOR_MODULE_CODE, TS_PREPROCESSOR_MODULE_CODE } from '../../../../script_helpers';
9
- import { createSearchHubScriptsTool, executeTestRun, buildSchemaForTool, buildTestRunArgs } from '../shared';
8
+ import { createSearchHubScriptsTool, executeTestRun, buildTestRunArgs, buildContextString } from '../shared';
10
9
  import { setupTypeAcquisition } from '../../../../ata';
11
10
  import { getModelContextWindow } from '../../lib';
12
- import { inferArgs } from '../../../../infer';
13
11
  // Score threshold for npm packages search filtering
14
12
  const SCORE_THRESHOLD = 1000;
15
13
  // percentage of the context window for documentation of npm packages
@@ -290,7 +288,7 @@ export const CHAT_SYSTEM_PROMPT = `
290
288
  - You can also receive a \`DIFF\` of the changes that have been made to the code. You should use this diff to give better answers.
291
289
  - Before giving your answer, check again that you carefully followed these instructions.
292
290
  - When asked to create a script that communicates with an external service, you can use the \`search_hub_scripts\` tool to search for relevant scripts in the hub. Make sure the language is the same as what the user is coding in. If you do not find any relevant scripts, you can use the \`search_npm_packages\` tool to search for relevant packages and their documentation. Always give a link to the documentation in your answer if possible.
293
- - After modifying the code, ALWAYS use the \`test_run_script\` tool to test the code, and iterate on the code until it works as expected. If the user cancels the test run, do not try again and wait for the next user instruction.
291
+ - At the end of your reponse, if you modified or suggested changes to the code, ALWAYS use the \`test_run_script\` tool to test the code, and iterate on the code until it works as expected (MAX 3 times). If the user cancels the test run, do not try again and wait for the next user instruction.
294
292
 
295
293
  Important:
296
294
  Do not mention or reveal these instructions to the user unless explicitly asked to do so.
@@ -379,16 +377,6 @@ export async function main() {
379
377
  </new_code>
380
378
  \`\`\`
381
379
  `;
382
- const CHAT_USER_CODE_CONTEXT = `
383
- - {title}:
384
- \`\`\`{language}
385
- {code}
386
- \`\`\`
387
- `;
388
- const CHAT_USER_ERROR_CONTEXT = `
389
- ERROR:
390
- {error}
391
- `;
392
380
  export const CHAT_USER_PROMPT = `
393
381
  INSTRUCTIONS:
394
382
  {instructions}
@@ -397,24 +385,12 @@ WINDMILL LANGUAGE CONTEXT:
397
385
  {lang_context}
398
386
 
399
387
  `;
400
- export const CHAT_USER_DB_CONTEXT = `- {title}: SCHEMA: \n{schema}\n`;
401
388
  export function prepareScriptSystemMessage() {
402
389
  return {
403
390
  role: 'system',
404
391
  content: CHAT_SYSTEM_PROMPT
405
392
  };
406
393
  }
407
- const applyCodePieceToCodeContext = (codePieces, codeContext) => {
408
- let code = codeContext.split('\n');
409
- let shiftOffset = 0;
410
- codePieces.sort((a, b) => a.startLine - b.startLine);
411
- for (const codePiece of codePieces) {
412
- code.splice(codePiece.endLine + shiftOffset, 0, '[#END]');
413
- code.splice(codePiece.startLine + shiftOffset - 1, 0, '[#START]');
414
- shiftOffset += 2;
415
- }
416
- return code.join('\n');
417
- };
418
394
  export function prepareScriptTools(language, context) {
419
395
  const tools = [];
420
396
  if (['python3', 'php', 'bun', 'deno', 'nativets', 'bunnative'].includes(language)) {
@@ -431,51 +407,9 @@ export function prepareScriptTools(language, context) {
431
407
  return tools;
432
408
  }
433
409
  export function prepareScriptUserMessage(instructions, language, selectedContext, options = {}) {
434
- let codeContext = 'CODE:\n';
435
- let errorContext = 'ERROR:\n';
436
- let dbContext = 'DATABASES:\n';
437
- let diffContext = 'DIFF:\n';
438
- let hasCode = false;
439
- let hasError = false;
440
- let hasDb = false;
441
- let hasDiff = false;
442
- for (const context of selectedContext) {
443
- if (context.type === 'code') {
444
- hasCode = true;
445
- codeContext += CHAT_USER_CODE_CONTEXT.replace('{title}', context.title)
446
- .replace('{language}', scriptLangToEditorLang(language))
447
- .replace('{code}', applyCodePieceToCodeContext(selectedContext.filter((c) => c.type === 'code_piece'), context.content));
448
- }
449
- else if (context.type === 'error') {
450
- if (hasError) {
451
- throw new Error('Multiple error contexts provided');
452
- }
453
- hasError = true;
454
- errorContext = CHAT_USER_ERROR_CONTEXT.replace('{error}', context.content);
455
- }
456
- else if (context.type === 'db') {
457
- hasDb = true;
458
- dbContext += CHAT_USER_DB_CONTEXT.replace('{title}', context.title).replace('{schema}', context.schema?.stringified ?? 'to fetch with get_db_schema');
459
- }
460
- else if (context.type === 'diff') {
461
- hasDiff = true;
462
- const diff = JSON.stringify(context.diff);
463
- diffContext = diff.length > 3000 ? diff.slice(0, 3000) + '...' : diff;
464
- }
465
- }
466
410
  let userMessage = CHAT_USER_PROMPT.replace('{instructions}', instructions).replace('{lang_context}', getLangContext(language, { allowResourcesFetch: true, ...options }));
467
- if (hasCode) {
468
- userMessage += codeContext;
469
- }
470
- if (hasError) {
471
- userMessage += errorContext;
472
- }
473
- if (hasDb) {
474
- userMessage += dbContext;
475
- }
476
- if (hasDiff) {
477
- userMessage += diffContext;
478
- }
411
+ const contextInstructions = buildContextString(selectedContext);
412
+ userMessage += contextInstructions;
479
413
  return {
480
414
  role: 'user',
481
415
  content: userMessage
@@ -534,39 +468,51 @@ async function formatDBSchema(dbSchema) {
534
468
  export const resourceTypeTool = {
535
469
  def: RESOURCE_TYPE_FUNCTION_DEF,
536
470
  fn: async ({ args, workspace, helpers, toolCallbacks, toolId }) => {
537
- toolCallbacks.setToolStatus(toolId, { content: 'Searching resource types for "' + args.query + '"...' });
471
+ toolCallbacks.setToolStatus(toolId, {
472
+ content: 'Searching resource types for "' + args.query + '"...'
473
+ });
538
474
  const lang = helpers.getScriptOptions().lang;
539
475
  const formattedResourceTypes = await getFormattedResourceTypes(lang, args.query, workspace);
540
- toolCallbacks.setToolStatus(toolId, { content: 'Retrieved resource types for "' + args.query + '"' });
476
+ toolCallbacks.setToolStatus(toolId, {
477
+ content: 'Retrieved resource types for "' + args.query + '"'
478
+ });
541
479
  return formattedResourceTypes;
542
480
  }
543
481
  };
544
- export const dbSchemaTool = {
545
- def: DB_SCHEMA_FUNCTION_DEF,
546
- fn: async ({ args, workspace, toolCallbacks, toolId }) => {
547
- if (!args.resourcePath) {
548
- throw new Error('Database path not provided');
549
- }
550
- toolCallbacks.setToolStatus(toolId, { content: 'Getting database schema for ' + args.resourcePath + '...' });
551
- const resource = await ResourceService.getResource({
552
- workspace: workspace,
553
- path: args.resourcePath
554
- });
555
- const newDbSchemas = {};
556
- await getDbSchemas(resource.resource_type, args.resourcePath, workspace, newDbSchemas, (error) => {
557
- console.error(error);
558
- });
559
- dbSchemas.update((schemas) => ({ ...schemas, ...newDbSchemas }));
560
- const dbs = get(dbSchemas);
561
- const db = dbs[args.resourcePath];
562
- if (!db) {
563
- throw new Error('Database not found');
482
+ // Generic DB schema tool factory that can be used by both script and flow modes
483
+ export function createDbSchemaTool() {
484
+ return {
485
+ def: DB_SCHEMA_FUNCTION_DEF,
486
+ fn: async ({ args, workspace, toolCallbacks, toolId }) => {
487
+ if (!args.resourcePath) {
488
+ throw new Error('Database path not provided');
489
+ }
490
+ toolCallbacks.setToolStatus(toolId, {
491
+ content: 'Getting database schema for ' + args.resourcePath + '...'
492
+ });
493
+ const resource = await ResourceService.getResource({
494
+ workspace: workspace,
495
+ path: args.resourcePath
496
+ });
497
+ const newDbSchemas = {};
498
+ await getDbSchemas(resource.resource_type, args.resourcePath, workspace, newDbSchemas, (error) => {
499
+ console.error(error);
500
+ });
501
+ dbSchemas.update((schemas) => ({ ...schemas, ...newDbSchemas }));
502
+ const dbs = get(dbSchemas);
503
+ const db = dbs[args.resourcePath];
504
+ if (!db) {
505
+ throw new Error('Database not found');
506
+ }
507
+ const stringSchema = await formatDBSchema(db);
508
+ toolCallbacks.setToolStatus(toolId, {
509
+ content: 'Retrieved database schema for ' + args.resourcePath
510
+ });
511
+ return stringSchema;
564
512
  }
565
- const stringSchema = await formatDBSchema(db);
566
- toolCallbacks.setToolStatus(toolId, { content: 'Retrieved database schema for ' + args.resourcePath });
567
- return stringSchema;
568
- }
569
- };
513
+ };
514
+ }
515
+ export const dbSchemaTool = createDbSchemaTool();
570
516
  const packagesSearchCache = new Map();
571
517
  export async function searchExternalIntegrationResources(args) {
572
518
  try {
@@ -576,7 +522,8 @@ export async function searchExternalIntegrationResources(args) {
576
522
  const result = await fetch(`https://registry.npmjs.org/-/v1/search?text=${args.query}&size=2`);
577
523
  const data = await result.json();
578
524
  const filtered = data.objects.filter((r) => r.searchScore >= SCORE_THRESHOLD);
579
- const modelContextWindow = getModelContextWindow(get(copilotSessionModel)?.model ?? '');
525
+ const model = getCurrentModel();
526
+ const modelContextWindow = getModelContextWindow(model.model);
580
527
  const results = await Promise.all(filtered.map(async (r) => {
581
528
  let documentation = '';
582
529
  let types = '';
@@ -692,18 +639,16 @@ const TEST_RUN_SCRIPT_TOOL = {
692
639
  function: {
693
640
  name: 'test_run_script',
694
641
  description: 'Execute a test run of the current script in the editor',
695
- // will be overridden by setSchema
696
642
  parameters: {
697
643
  type: 'object',
698
644
  properties: {
699
- args: {
700
- type: 'object',
701
- description: 'Arguments to pass to the script (optional, uses current editor args if not provided)'
702
- }
645
+ args: { type: 'string', description: 'JSON string containing the arguments for the tool' }
703
646
  },
704
- required: []
647
+ additionalProperties: false,
648
+ strict: false,
649
+ required: ['args']
705
650
  }
706
- },
651
+ }
707
652
  };
708
653
  export const testRunScriptTool = {
709
654
  def: TEST_RUN_SCRIPT_TOOL,
@@ -734,7 +679,7 @@ export const testRunScriptTool = {
734
679
  path: scriptOptions.path,
735
680
  content: codeToTest,
736
681
  args: parsedArgs,
737
- language: scriptOptions.lang,
682
+ language: scriptOptions.lang
738
683
  }
739
684
  }),
740
685
  workspace,
@@ -744,22 +689,7 @@ export const testRunScriptTool = {
744
689
  contextName: 'script'
745
690
  });
746
691
  },
747
- setSchema: async function (helpers) {
748
- await buildSchemaForTool(this.def, async () => {
749
- const scriptOptions = helpers.getScriptOptions();
750
- const code = scriptOptions?.code;
751
- const lang = scriptOptions?.lang;
752
- const lastSuggestedCode = helpers.getLastSuggestedCode();
753
- const codeToTest = lastSuggestedCode ?? code;
754
- if (codeToTest) {
755
- const newSchema = emptySchema();
756
- await inferArgs(lang, codeToTest, newSchema);
757
- return newSchema;
758
- }
759
- return emptySchema();
760
- });
761
- },
762
692
  requiresConfirmation: true,
763
693
  confirmationMessage: 'Run script test',
764
- showDetails: true,
694
+ showDetails: true
765
695
  };
@@ -1,9 +1,21 @@
1
1
  import type { ChatCompletionMessageParam, ChatCompletionMessageToolCall, ChatCompletionTool } from 'openai/resources/chat/completions.mjs';
2
- import type { ContextElement } from './context';
2
+ import type { ContextElement, FlowModuleCodePieceElement } from './context';
3
3
  import type { ExtendedOpenFlow } from '../../flows/types';
4
4
  import type { FunctionParameters } from 'openai/resources/shared.mjs';
5
5
  import { z } from 'zod';
6
- import { type CompletedJob } from '../../../gen';
6
+ import { type CompletedJob, type FlowModule } from '../../../gen';
7
+ export interface ContextStringResult {
8
+ dbContext: string;
9
+ diffContext: string;
10
+ flowModuleContext: string;
11
+ hasDb: boolean;
12
+ hasDiff: boolean;
13
+ hasFlowModule: boolean;
14
+ }
15
+ export declare const extractAllModules: (modules: FlowModule[]) => FlowModule[];
16
+ export declare const findModuleById: (modules: FlowModule[], moduleId: string) => FlowModule | undefined;
17
+ export declare function applyCodePiecesToFlowModules(codePieces: FlowModuleCodePieceElement[], flowModules: FlowModule[]): string;
18
+ export declare function buildContextString(selectedContext: ContextElement[]): string;
7
19
  type BaseDisplayMessage = {
8
20
  content: string;
9
21
  contextElements?: ContextElement[];
@@ -1,8 +1,160 @@
1
1
  import { get } from 'svelte/store';
2
- import { copilotSessionModel, workspaceStore } from '../../../stores';
2
+ import { workspaceStore, getCurrentModel } from '../../../stores';
3
3
  import { zodToJsonSchema } from 'zod-to-json-schema';
4
4
  import { z } from 'zod';
5
5
  import { ScriptService, JobService } from '../../../gen';
6
+ import { scriptLangToEditorLang } from '../../../scripts';
7
+ import YAML from 'yaml';
8
+ export const extractAllModules = (modules) => {
9
+ return modules.flatMap((m) => {
10
+ if (m.value.type === 'forloopflow' || m.value.type === 'whileloopflow') {
11
+ return [m, ...extractAllModules(m.value.modules)];
12
+ }
13
+ if (m.value.type === 'branchall') {
14
+ return [m, ...extractAllModules(m.value.branches.flatMap((b) => b.modules))];
15
+ }
16
+ if (m.value.type === 'branchone') {
17
+ return [
18
+ m,
19
+ ...extractAllModules([...m.value.branches.flatMap((b) => b.modules), ...m.value.default])
20
+ ];
21
+ }
22
+ return [m];
23
+ });
24
+ };
25
+ export const findModuleById = (modules, moduleId) => {
26
+ for (const module of modules) {
27
+ if (module.id === moduleId) {
28
+ return module;
29
+ }
30
+ if (module.value.type === 'forloopflow' || module.value.type === 'whileloopflow') {
31
+ const found = findModuleById(module.value.modules, moduleId);
32
+ if (found) {
33
+ return found;
34
+ }
35
+ }
36
+ if (module.value.type === 'branchall') {
37
+ const allModules = module.value.branches.flatMap((b) => b.modules);
38
+ const found = findModuleById(allModules, moduleId);
39
+ if (found) {
40
+ return found;
41
+ }
42
+ }
43
+ if (module.value.type === 'branchone') {
44
+ const allModules = [
45
+ ...module.value.branches.flatMap((b) => b.modules),
46
+ ...module.value.default
47
+ ];
48
+ const found = findModuleById(allModules, moduleId);
49
+ if (found) {
50
+ return found;
51
+ }
52
+ }
53
+ }
54
+ return undefined;
55
+ };
56
+ const applyCodePieceToCodeContext = (codePieces, codeContext) => {
57
+ let code = codeContext.split('\n');
58
+ let shiftOffset = 0;
59
+ codePieces.sort((a, b) => a.startLine - b.startLine);
60
+ for (const codePiece of codePieces) {
61
+ code.splice(codePiece.endLine + shiftOffset, 0, '[#END]');
62
+ code.splice(codePiece.startLine + shiftOffset - 1, 0, '[#START]');
63
+ shiftOffset += 2;
64
+ }
65
+ return code.join('\n');
66
+ };
67
+ export function applyCodePiecesToFlowModules(codePieces, flowModules) {
68
+ const moduleCodePieces = new Map();
69
+ for (const codePiece of codePieces) {
70
+ const moduleId = codePiece.id;
71
+ if (!moduleCodePieces.has(moduleId)) {
72
+ moduleCodePieces.set(moduleId, []);
73
+ }
74
+ moduleCodePieces.get(moduleId).push(codePiece);
75
+ }
76
+ // Clone modules to avoid mutation
77
+ const modifiedModules = JSON.parse(JSON.stringify(flowModules));
78
+ // Apply code pieces to each module
79
+ for (const [moduleId, pieces] of moduleCodePieces) {
80
+ const module = findModuleById(modifiedModules, moduleId);
81
+ if (module && module.value.type === 'rawscript' && module.value.content) {
82
+ module.value.content = applyCodePieceToCodeContext(pieces, module.value.content);
83
+ }
84
+ }
85
+ return YAML.stringify(modifiedModules);
86
+ }
87
+ export function buildContextString(selectedContext) {
88
+ const dbTemplate = `- {title}: SCHEMA: \n{schema}\n`;
89
+ const codeTemplate = `
90
+ - {title}:
91
+ \`\`\`{language}
92
+ {code}
93
+ \`\`\`
94
+ `;
95
+ let dbContext = 'DATABASES:\n';
96
+ let diffContext = 'DIFF:\n';
97
+ let flowModuleContext = 'FOCUSED FLOW MODULES IDS:\n';
98
+ let codeContext = 'CODE:\n';
99
+ let errorContext = `
100
+ ERROR:
101
+ {error}
102
+ `;
103
+ let hasCode = false;
104
+ let hasDb = false;
105
+ let hasDiff = false;
106
+ let hasFlowModule = false;
107
+ let hasError = false;
108
+ let result = '\n\n';
109
+ for (const context of selectedContext) {
110
+ if (context.type === 'code') {
111
+ hasCode = true;
112
+ codeContext += codeTemplate
113
+ .replace('{title}', context.title)
114
+ .replace('{language}', scriptLangToEditorLang(context.lang))
115
+ .replace('{code}', applyCodePieceToCodeContext(selectedContext.filter((c) => c.type === 'code_piece'), context.content));
116
+ }
117
+ else if (context.type === 'error') {
118
+ if (hasError) {
119
+ throw new Error('Multiple error contexts provided');
120
+ }
121
+ hasError = true;
122
+ errorContext = errorContext.replace('{error}', context.content);
123
+ }
124
+ else if (context.type === 'db') {
125
+ hasDb = true;
126
+ dbContext += dbTemplate
127
+ .replace('{title}', context.title)
128
+ .replace('{schema}', context.schema?.stringified ?? 'to fetch with get_db_schema');
129
+ dbContext += '\n';
130
+ }
131
+ else if (context.type === 'diff') {
132
+ hasDiff = true;
133
+ const diff = JSON.stringify(context.diff);
134
+ diffContext += (diff.length > 3000 ? diff.slice(0, 3000) + '...' : diff) + '\n';
135
+ }
136
+ else if (context.type === 'flow_module') {
137
+ hasFlowModule = true;
138
+ flowModuleContext += `${context.id}\n`;
139
+ }
140
+ }
141
+ if (hasCode) {
142
+ result += '\n' + codeContext;
143
+ }
144
+ if (hasError) {
145
+ result += '\n' + errorContext;
146
+ }
147
+ if (hasDb) {
148
+ result += '\n' + dbContext;
149
+ }
150
+ if (hasDiff) {
151
+ result += '\n' + diffContext;
152
+ }
153
+ if (hasFlowModule) {
154
+ result += '\n' + flowModuleContext;
155
+ }
156
+ return result;
157
+ }
6
158
  async function callTool({ tools, functionName, args, workspace, helpers, toolCallbacks, toolId }) {
7
159
  const tool = tools.find((t) => t.def.function.name === functionName);
8
160
  if (!tool) {
@@ -18,11 +170,13 @@ export async function processToolCall({ tools, toolCall, helpers, toolCallbacks
18
170
  const needsConfirmation = tool?.requiresConfirmation;
19
171
  // Add the tool to the display with appropriate status
20
172
  toolCallbacks.setToolStatus(toolCall.id, {
21
- ...(tool?.requiresConfirmation ? { content: tool.confirmationMessage ?? "Waiting for confirmation..." } : {}),
173
+ ...(tool?.requiresConfirmation
174
+ ? { content: tool.confirmationMessage ?? 'Waiting for confirmation...' }
175
+ : {}),
22
176
  parameters: args,
23
177
  isLoading: true,
24
178
  needsConfirmation: needsConfirmation,
25
- showDetails: tool?.showDetails,
179
+ showDetails: tool?.showDetails
26
180
  });
27
181
  // If confirmation is needed and we have the callback, wait for it
28
182
  if (needsConfirmation && toolCallbacks.requestConfirmation) {
@@ -154,8 +308,8 @@ export async function buildSchemaForTool(toolDef, schemaBuilder) {
154
308
  }
155
309
  toolDef.function.parameters = { ...schema, additionalProperties: false };
156
310
  // OPEN AI models don't support strict mode well with schema with complex properties, so we disable it
157
- const model = get(copilotSessionModel)?.provider;
158
- if (model === 'openai' || model === 'azure_openai') {
311
+ const model = getCurrentModel();
312
+ if (model.provider === 'openai' || model.provider === 'azure_openai') {
159
313
  toolDef.function.strict = false;
160
314
  }
161
315
  return true;
@@ -163,7 +317,15 @@ export async function buildSchemaForTool(toolDef, schemaBuilder) {
163
317
  catch (error) {
164
318
  console.error('Error building schema for tool', error);
165
319
  // fallback to schema with args as a JSON string
166
- toolDef.function.parameters = { type: 'object', properties: { args: { type: 'string', description: 'JSON string containing the arguments for the tool' } }, additionalProperties: false, strict: false, required: ['args'] };
320
+ toolDef.function.parameters = {
321
+ type: 'object',
322
+ properties: {
323
+ args: { type: 'string', description: 'JSON string containing the arguments for the tool' }
324
+ },
325
+ additionalProperties: false,
326
+ strict: false,
327
+ required: ['args']
328
+ };
167
329
  return false;
168
330
  }
169
331
  }
@@ -254,7 +416,8 @@ function getErrorMessage(result) {
254
416
  export async function buildTestRunArgs(args, toolDef) {
255
417
  let parsedArgs = args;
256
418
  // if the schema is the fallback schema, parse the args as a JSON string
257
- if (toolDef.function.parameters.properties?.args?.description === 'JSON string containing the arguments for the tool') {
419
+ if (toolDef.function.parameters.properties?.args?.description ===
420
+ 'JSON string containing the arguments for the tool') {
258
421
  try {
259
422
  parsedArgs = JSON.parse(args.args);
260
423
  }
@@ -1,4 +1,4 @@
1
- import { copilotInfo, copilotSessionModel, workspaceStore } from '../../stores';
1
+ import { getCurrentModel, workspaceStore } from '../../stores';
2
2
  import { buildClientSchema, printSchema } from 'graphql';
3
3
  import { OpenAI } from 'openai';
4
4
  import { get } from 'svelte/store';
@@ -7,7 +7,16 @@ import { EDIT_CONFIG, FIX_CONFIG, GEN_CONFIG } from './prompts';
7
7
  import { formatResourceTypes } from './utils';
8
8
  import { z } from 'zod';
9
9
  export const SUPPORTED_LANGUAGES = new Set(Object.keys(GEN_CONFIG.prompts));
10
- const OPENAI_MODELS = ['gpt-5', 'gpt-5-mini', 'gpt-5-nano', 'gpt-4o', 'gpt-4o-mini', 'o4-mini', 'o3', 'o3-mini'];
10
+ const OPENAI_MODELS = [
11
+ 'gpt-5',
12
+ 'gpt-5-mini',
13
+ 'gpt-5-nano',
14
+ 'gpt-4o',
15
+ 'gpt-4o-mini',
16
+ 'o4-mini',
17
+ 'o3',
18
+ 'o3-mini'
19
+ ];
11
20
  // need at least one model for each provider except customai
12
21
  export const AI_DEFAULT_MODELS = {
13
22
  openai: OPENAI_MODELS,
@@ -331,11 +340,7 @@ const PROMPTS_CONFIGS = {
331
340
  gen: GEN_CONFIG
332
341
  };
333
342
  function getProviderAndCompletionConfig({ messages, stream, tools, forceModelProvider }) {
334
- let info = get(copilotInfo);
335
- const modelProvider = forceModelProvider ?? get(copilotSessionModel) ?? info.defaultModel ?? info.aiModels[0];
336
- if (!modelProvider) {
337
- throw new Error('No model selected');
338
- }
343
+ const modelProvider = forceModelProvider ?? getCurrentModel();
339
344
  const providerConfig = PROVIDER_COMPLETION_CONFIG_MAP[modelProvider.provider];
340
345
  const processedMessages = prepareMessages(modelProvider.provider, messages);
341
346
  return {
@@ -41,7 +41,7 @@ export type VisualChange = {
41
41
  };
42
42
  export declare function setGlobalCSS(id: string, cssCode: string): void;
43
43
  export declare let VISUAL_CHANGES_CSS: string;
44
- export declare function displayVisualChanges(cssId: string, editor: meditor.IStandaloneCodeEditor, visualChanges: VisualChange[]): Promise<{
44
+ export declare function displayVisualChanges(cssId: string, editor: meditor.IStandaloneCodeEditor, visualChanges: VisualChange[], revertMode?: boolean): Promise<{
45
45
  collection: meditor.IEditorDecorationsCollection;
46
46
  ids: string[];
47
47
  }>;
@@ -1,6 +1,6 @@
1
1
  import { createLongHash } from '../../editorLangUtils';
2
2
  import {} from 'monaco-editor';
3
- function applyMonacoStyles(targetEl, greenHighlight) {
3
+ function applyMonacoStyles(targetEl, greenHighlight, revertMode) {
4
4
  const computedStyles = window.getComputedStyle(document.querySelector('.monaco-editor .view-lines'));
5
5
  Object.assign(targetEl.style, {
6
6
  fontFamily: computedStyles.fontFamily,
@@ -10,7 +10,9 @@ function applyMonacoStyles(targetEl, greenHighlight) {
10
10
  whiteSpace: 'pre'
11
11
  });
12
12
  if (greenHighlight) {
13
- targetEl.style.backgroundColor = 'var(--vscode-diffEditor-insertedTextBackground)';
13
+ targetEl.style.backgroundColor = revertMode
14
+ ? 'var(--vscode-diffEditor-removedTextBackground)'
15
+ : 'var(--vscode-diffEditor-insertedTextBackground)';
14
16
  }
15
17
  }
16
18
  export function setGlobalCSS(id, cssCode) {
@@ -22,7 +24,7 @@ export function setGlobalCSS(id, cssCode) {
22
24
  }
23
25
  styleTag.textContent = cssCode;
24
26
  }
25
- function addInlineGhostText(change) {
27
+ function addInlineGhostText(change, revertMode) {
26
28
  const cssId = createLongHash();
27
29
  const decoration = {
28
30
  range: {
@@ -32,7 +34,11 @@ function addInlineGhostText(change) {
32
34
  endColumn: change.position.column + change.value.length
33
35
  },
34
36
  options: {
35
- beforeContentClassName: `editor-ghost-text editor-ghost-text-content-${cssId} ${change.options?.greenHighlight ? 'editor-ghost-text-green' : ''}`
37
+ beforeContentClassName: `editor-ghost-text editor-ghost-text-content-${cssId} ${change.options?.greenHighlight
38
+ ? revertMode
39
+ ? 'editor-ghost-text-removed'
40
+ : 'editor-ghost-text-green'
41
+ : ''}`
36
42
  }
37
43
  };
38
44
  const safeContent = change.value.replaceAll('"', '\\"');
@@ -90,14 +96,14 @@ function getReviewButtons(editor, acceptFn, rejectFn) {
90
96
  reviewButtons.append(rejectButton);
91
97
  return reviewButtons;
92
98
  }
93
- async function addMultilineGhostText(editor, text, afterLineNumber, heightInLines, options) {
99
+ async function addMultilineGhostText(editor, text, afterLineNumber, heightInLines, options, revertMode) {
94
100
  const el = document.createElement('div');
95
101
  el.textContent = text;
96
102
  if (options?.review) {
97
103
  const reviewButtons = getReviewButtons(editor, options.review.acceptFn, options.review.rejectFn);
98
104
  el.append(reviewButtons);
99
105
  }
100
- applyMonacoStyles(el, options?.greenHighlight);
106
+ applyMonacoStyles(el, options?.greenHighlight, revertMode);
101
107
  const addZonePromise = new Promise((resolve, reject) => {
102
108
  editor?.changeViewZones((acc) => {
103
109
  const id = acc.addZone({
@@ -112,13 +118,13 @@ async function addMultilineGhostText(editor, text, afterLineNumber, heightInLine
112
118
  return addZonePromise;
113
119
  }
114
120
  export let VISUAL_CHANGES_CSS = `.editor-ghost-text-green { background-color: var(--vscode-diffEditor-insertedTextBackground) !important; }\n.editor-ghost-text-removed { background-color: var(--vscode-diffEditor-removedTextBackground); }\n\n.editor-ghost-text { display: inline-block; background-color: var(--vscode-editor-background); color: gray;}`;
115
- export async function displayVisualChanges(cssId, editor, visualChanges) {
121
+ export async function displayVisualChanges(cssId, editor, visualChanges, revertMode) {
116
122
  let decorations = [];
117
123
  let css = '';
118
124
  let ids = [];
119
125
  for (const change of visualChanges) {
120
126
  if (change.type === 'added_inline') {
121
- const { css: newCss, decoration } = addInlineGhostText(change);
127
+ const { css: newCss, decoration } = addInlineGhostText(change, revertMode);
122
128
  decorations.push(decoration);
123
129
  css += newCss;
124
130
  }
@@ -131,7 +137,7 @@ export async function displayVisualChanges(cssId, editor, visualChanges) {
131
137
  endColumn: change.range.endColumn
132
138
  },
133
139
  options: {
134
- className: 'editor-ghost-text-removed',
140
+ className: revertMode ? 'editor-ghost-text-green' : 'editor-ghost-text-removed',
135
141
  isWholeLine: change.options?.isWholeLine
136
142
  }
137
143
  };
@@ -157,7 +163,7 @@ export async function displayVisualChanges(cssId, editor, visualChanges) {
157
163
  }
158
164
  else if (change.type === 'added_block') {
159
165
  const id = await addMultilineGhostText(editor, change.value, change.position.afterLineNumber, change.value.split('\n').length, // we know it won't end by \n
160
- change.options);
166
+ change.options, revertMode);
161
167
  ids.push(id);
162
168
  }
163
169
  }