From 7941cb660292396fb52e292406064875d74478f0 Mon Sep 17 00:00:00 2001 From: Adria Navarro Date: Fri, 18 Oct 2024 11:36:11 +0200 Subject: [PATCH 01/14] Allow passing test to row action test --- .../automation/AutomationBuilder/FlowChart/TestDataModal.svelte | 1 + .../components/automation/SetupPanel/AutomationBlockSetup.svelte | 1 + packages/builder/src/constants/backend/automations.js | 1 + 3 files changed, 3 insertions(+) diff --git a/packages/builder/src/components/automation/AutomationBuilder/FlowChart/TestDataModal.svelte b/packages/builder/src/components/automation/AutomationBuilder/FlowChart/TestDataModal.svelte index f656a1ecb9..21cdc4b893 100644 --- a/packages/builder/src/components/automation/AutomationBuilder/FlowChart/TestDataModal.svelte +++ b/packages/builder/src/components/automation/AutomationBuilder/FlowChart/TestDataModal.svelte @@ -19,6 +19,7 @@ AutomationEventType.ROW_DELETE, AutomationEventType.ROW_UPDATE, AutomationEventType.ROW_SAVE, + AutomationEventType.ROW_ACTION, ] /** diff --git a/packages/builder/src/components/automation/SetupPanel/AutomationBlockSetup.svelte b/packages/builder/src/components/automation/SetupPanel/AutomationBlockSetup.svelte index bc65c234e9..bf5fd702cd 100644 --- a/packages/builder/src/components/automation/SetupPanel/AutomationBlockSetup.svelte +++ b/packages/builder/src/components/automation/SetupPanel/AutomationBlockSetup.svelte @@ -76,6 +76,7 @@ TriggerStepID.ROW_UPDATED, TriggerStepID.ROW_SAVED, TriggerStepID.ROW_DELETED, + TriggerStepID.ROW_ACTION, ] const rowEvents = [ diff --git a/packages/builder/src/constants/backend/automations.js b/packages/builder/src/constants/backend/automations.js index 7c3e17e225..37ae35aea0 100644 --- a/packages/builder/src/constants/backend/automations.js +++ b/packages/builder/src/constants/backend/automations.js @@ -2,6 +2,7 @@ export const TriggerStepID = { ROW_SAVED: "ROW_SAVED", ROW_UPDATED: "ROW_UPDATED", ROW_DELETED: "ROW_DELETED", + ROW_ACTION: "ROW_ACTION", WEBHOOK: "WEBHOOK", APP: "APP", CRON: "CRON", From 0f705763b0656558b2262b5b7aad30be0a037c1e Mon Sep 17 00:00:00 2001 From: Adria Navarro Date: Fri, 18 Oct 2024 16:46:21 +0200 Subject: [PATCH 02/14] Change QA branch trigger --- .github/workflows/budibase_ci.yml | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/.github/workflows/budibase_ci.yml b/.github/workflows/budibase_ci.yml index 4b9ebf1e5d..49e77ab13a 100644 --- a/.github/workflows/budibase_ci.yml +++ b/.github/workflows/budibase_ci.yml @@ -9,7 +9,7 @@ on: # but only for the master branch push: branches: - - master + - v3-ui pull_request: workflow_dispatch: workflow_call: From f119c517306fc4f9c8408dd855a5077fd2e76ca7 Mon Sep 17 00:00:00 2001 From: Adria Navarro Date: Fri, 18 Oct 2024 16:52:22 +0200 Subject: [PATCH 03/14] Change QA branch trigger --- .github/workflows/budibase_ci.yml | 2 +- .github/workflows/deploy-qa.yml | 2 +- 2 files changed, 2 insertions(+), 2 deletions(-) diff --git a/.github/workflows/budibase_ci.yml b/.github/workflows/budibase_ci.yml index 49e77ab13a..4b9ebf1e5d 100644 --- a/.github/workflows/budibase_ci.yml +++ b/.github/workflows/budibase_ci.yml @@ -9,7 +9,7 @@ on: # but only for the master branch push: branches: - - v3-ui + - master pull_request: workflow_dispatch: workflow_call: diff --git a/.github/workflows/deploy-qa.yml b/.github/workflows/deploy-qa.yml index 1339ad2eb9..2a30e44def 100644 --- a/.github/workflows/deploy-qa.yml +++ b/.github/workflows/deploy-qa.yml @@ -3,7 +3,7 @@ name: Deploy QA on: push: branches: - - master + - v3-ui workflow_dispatch: jobs: From 94789ff03d953a39463189f453ac1a09cab690f4 Mon Sep 17 00:00:00 2001 From: mike12345567 Date: Fri, 18 Oct 2024 16:51:23 +0100 Subject: [PATCH 04/14] Adding all feature flags to enum, just so there is a simple reference to see all feature flags that are available. --- packages/backend-core/src/features/features.ts | 6 +++--- packages/types/src/sdk/featureFlag.ts | 3 +++ 2 files changed, 6 insertions(+), 3 deletions(-) diff --git a/packages/backend-core/src/features/features.ts b/packages/backend-core/src/features/features.ts index e95472a784..39b8558d2a 100644 --- a/packages/backend-core/src/features/features.ts +++ b/packages/backend-core/src/features/features.ts @@ -267,9 +267,9 @@ export class FlagSet, T extends { [key: string]: V }> { // All of the machinery in this file is to make sure that flags have their // default values set correctly and their types flow through the system. export const flags = new FlagSet({ - DEFAULT_VALUES: Flag.boolean(env.isDev()), - AUTOMATION_BRANCHING: Flag.boolean(env.isDev()), - SQS: Flag.boolean(true), + [FeatureFlag.DEFAULT_VALUES]: Flag.boolean(env.isDev()), + [FeatureFlag.AUTOMATION_BRANCHING]: Flag.boolean(env.isDev()), + [FeatureFlag.SQS]: Flag.boolean(true), [FeatureFlag.AI_CUSTOM_CONFIGS]: Flag.boolean(env.isDev()), [FeatureFlag.ENRICHED_RELATIONSHIPS]: Flag.boolean(env.isDev()), [FeatureFlag.TABLES_DEFAULT_ADMIN]: Flag.boolean(env.isDev()), diff --git a/packages/types/src/sdk/featureFlag.ts b/packages/types/src/sdk/featureFlag.ts index e35929efe9..a1033236d7 100644 --- a/packages/types/src/sdk/featureFlag.ts +++ b/packages/types/src/sdk/featureFlag.ts @@ -1,7 +1,10 @@ export enum FeatureFlag { PER_CREATOR_PER_USER_PRICE = "PER_CREATOR_PER_USER_PRICE", PER_CREATOR_PER_USER_PRICE_ALERT = "PER_CREATOR_PER_USER_PRICE_ALERT", + AUTOMATION_BRANCHING = "AUTOMATION_BRANCHING", + SQS = "SQS", AI_CUSTOM_CONFIGS = "AI_CUSTOM_CONFIGS", + DEFAULT_VALUES = "DEFAULT_VALUES", ENRICHED_RELATIONSHIPS = "ENRICHED_RELATIONSHIPS", TABLES_DEFAULT_ADMIN = "TABLES_DEFAULT_ADMIN", } From 87bdd68afaf57aade6bf560f670a3522d68ba3d1 Mon Sep 17 00:00:00 2001 From: mike12345567 Date: Fri, 18 Oct 2024 17:07:35 +0100 Subject: [PATCH 05/14] Updating to use enum for feature flags across the board. --- .../backend-core/src/db/couch/DatabaseImpl.ts | 3 +- packages/pro | 2 +- .../server/src/api/controllers/table/utils.ts | 31 ++++++++++--------- packages/server/src/automations/actions.ts | 3 +- packages/server/src/sdk/app/rows/search.ts | 5 +-- packages/server/src/sdk/app/tables/getters.ts | 3 +- .../src/utilities/rowProcessor/index.ts | 3 +- .../src/api/controllers/system/environment.ts | 7 +++-- 8 files changed, 33 insertions(+), 24 deletions(-) diff --git a/packages/backend-core/src/db/couch/DatabaseImpl.ts b/packages/backend-core/src/db/couch/DatabaseImpl.ts index 8ca20bf8e1..b807db0ee3 100644 --- a/packages/backend-core/src/db/couch/DatabaseImpl.ts +++ b/packages/backend-core/src/db/couch/DatabaseImpl.ts @@ -10,6 +10,7 @@ import { DatabaseQueryOpts, DBError, Document, + FeatureFlag, isDocument, RowResponse, RowValue, @@ -456,7 +457,7 @@ export class DatabaseImpl implements Database { async destroy() { if ( - (await flags.isEnabled("SQS")) && + (await flags.isEnabled(FeatureFlag.SQS)) && (await this.exists(SQLITE_DESIGN_DOC_ID)) ) { // delete the design document, then run the cleanup operation diff --git a/packages/pro b/packages/pro index fc4c7f4925..cad8edfba8 160000 --- a/packages/pro +++ b/packages/pro @@ -1 +1 @@ -Subproject commit fc4c7f4925139af078480217965c3d6338dc0a7f +Subproject commit cad8edfba856058cd12dd9e7363b998ddea76034 diff --git a/packages/server/src/api/controllers/table/utils.ts b/packages/server/src/api/controllers/table/utils.ts index 106d0e23a6..96c01a15b8 100644 --- a/packages/server/src/api/controllers/table/utils.ts +++ b/packages/server/src/api/controllers/table/utils.ts @@ -1,34 +1,35 @@ -import { parse, isSchema, isRows } from "../../../utilities/schema" -import { getRowParams, generateRowID, InternalTables } from "../../../db/utils" +import { isRows, isSchema, parse } from "../../../utilities/schema" +import { generateRowID, getRowParams, InternalTables } from "../../../db/utils" import isEqual from "lodash/isEqual" import { - GOOGLE_SHEETS_PRIMARY_KEY, - USERS_TABLE_SCHEMA, - SwitchableTypes, CanSwitchTypes, + GOOGLE_SHEETS_PRIMARY_KEY, + SwitchableTypes, + USERS_TABLE_SCHEMA, } from "../../../constants" import { - inputProcessing, AttachmentCleanup, + inputProcessing, } from "../../../utilities/rowProcessor" import { getViews, saveView } from "../view/utils" import viewTemplate from "../view/viewBuilder" import { cloneDeep } from "lodash/fp" import { quotas } from "@budibase/pro" -import { events, context, features } from "@budibase/backend-core" +import { context, events, features } from "@budibase/backend-core" import { AutoFieldSubType, + Database, Datasource, + FeatureFlag, + FieldSchema, + FieldType, + NumberFieldMetadata, + RelationshipFieldMetadata, + RenameColumn, Row, SourceName, Table, - Database, - RenameColumn, - NumberFieldMetadata, - FieldSchema, View, - RelationshipFieldMetadata, - FieldType, } from "@budibase/types" import sdk from "../../../sdk" import env from "../../../environment" @@ -329,7 +330,7 @@ class TableSaveFunctions { importRows: this.importRows, userId: this.userId, }) - if (await features.flags.isEnabled("SQS")) { + if (await features.flags.isEnabled(FeatureFlag.SQS)) { await sdk.tables.sqs.addTable(table) } return table @@ -523,7 +524,7 @@ export async function internalTableCleanup(table: Table, rows?: Row[]) { if (rows) { await AttachmentCleanup.tableDelete(table, rows) } - if (await features.flags.isEnabled("SQS")) { + if (await features.flags.isEnabled(FeatureFlag.SQS)) { await sdk.tables.sqs.removeTable(table) } } diff --git a/packages/server/src/automations/actions.ts b/packages/server/src/automations/actions.ts index f78174aa7a..e921e569c9 100644 --- a/packages/server/src/automations/actions.ts +++ b/packages/server/src/automations/actions.ts @@ -26,6 +26,7 @@ import { Hosting, ActionImplementation, AutomationStepDefinition, + FeatureFlag, } from "@budibase/types" import sdk from "../sdk" import { getAutomationPlugin } from "../utilities/fileSystem" @@ -100,7 +101,7 @@ if (env.SELF_HOSTED) { } export async function getActionDefinitions() { - if (await features.flags.isEnabled("AUTOMATION_BRANCHING")) { + if (await features.flags.isEnabled(FeatureFlag.AUTOMATION_BRANCHING)) { BUILTIN_ACTION_DEFINITIONS["BRANCH"] = branch.definition } const actionDefinitions = BUILTIN_ACTION_DEFINITIONS diff --git a/packages/server/src/sdk/app/rows/search.ts b/packages/server/src/sdk/app/rows/search.ts index 7ac3bb8ead..f80c1c1f8a 100644 --- a/packages/server/src/sdk/app/rows/search.ts +++ b/packages/server/src/sdk/app/rows/search.ts @@ -1,5 +1,6 @@ import { EmptyFilterOption, + FeatureFlag, LegacyFilter, LogicalOperator, Row, @@ -101,7 +102,7 @@ export async function search( viewQuery = checkFilters(table, viewQuery) delete viewQuery?.onEmptyFilter - const sqsEnabled = await features.flags.isEnabled("SQS") + const sqsEnabled = await features.flags.isEnabled(FeatureFlag.SQS) const supportsLogicalOperators = isExternalTableID(view.tableId) || sqsEnabled @@ -168,7 +169,7 @@ export async function search( if (isExternalTable) { span?.addTags({ searchType: "external" }) result = await external.search(options, source) - } else if (await features.flags.isEnabled("SQS")) { + } else if (await features.flags.isEnabled(FeatureFlag.SQS)) { span?.addTags({ searchType: "sqs" }) result = await internal.sqs.search(options, source) } else { diff --git a/packages/server/src/sdk/app/tables/getters.ts b/packages/server/src/sdk/app/tables/getters.ts index 49944bce85..7b3d6913cf 100644 --- a/packages/server/src/sdk/app/tables/getters.ts +++ b/packages/server/src/sdk/app/tables/getters.ts @@ -12,6 +12,7 @@ import { TableResponse, TableSourceType, TableViewsResponse, + FeatureFlag, } from "@budibase/types" import datasources from "../datasources" import sdk from "../../../sdk" @@ -39,7 +40,7 @@ export async function processTable(table: Table): Promise { sourceId: table.sourceId || INTERNAL_TABLE_SOURCE_ID, sourceType: TableSourceType.INTERNAL, } - const sqsEnabled = await features.flags.isEnabled("SQS") + const sqsEnabled = await features.flags.isEnabled(FeatureFlag.SQS) if (sqsEnabled) { processed.sql = true } diff --git a/packages/server/src/utilities/rowProcessor/index.ts b/packages/server/src/utilities/rowProcessor/index.ts index dd17bc9ba6..6872924f58 100644 --- a/packages/server/src/utilities/rowProcessor/index.ts +++ b/packages/server/src/utilities/rowProcessor/index.ts @@ -19,6 +19,7 @@ import { Table, User, ViewV2, + FeatureFlag, } from "@budibase/types" import { cloneDeep } from "lodash/fp" import { @@ -417,7 +418,7 @@ export async function coreOutputProcessing( // remove null properties to match internal API const isExternal = isExternalTableID(table._id!) - if (isExternal || (await features.flags.isEnabled("SQS"))) { + if (isExternal || (await features.flags.isEnabled(FeatureFlag.SQS))) { for (const row of rows) { for (const key of Object.keys(row)) { if (row[key] === null) { diff --git a/packages/worker/src/api/controllers/system/environment.ts b/packages/worker/src/api/controllers/system/environment.ts index 90f303d3a8..b6352ea5e7 100644 --- a/packages/worker/src/api/controllers/system/environment.ts +++ b/packages/worker/src/api/controllers/system/environment.ts @@ -1,4 +1,4 @@ -import { Ctx, MaintenanceType } from "@budibase/types" +import { Ctx, MaintenanceType, FeatureFlag } from "@budibase/types" import env from "../../../environment" import { env as coreEnv, db as dbCore, features } from "@budibase/backend-core" import nodeFetch from "node-fetch" @@ -29,7 +29,10 @@ async function isSqsAvailable() { } async function isSqsMissing() { - return (await features.flags.isEnabled("SQS")) && !(await isSqsAvailable()) + return ( + (await features.flags.isEnabled(FeatureFlag.SQS)) && + !(await isSqsAvailable()) + ) } export const fetch = async (ctx: Ctx) => { From b94498e5832ab7f96a6785e352e8fc3e355a6107 Mon Sep 17 00:00:00 2001 From: mike12345567 Date: Fri, 18 Oct 2024 17:29:22 +0100 Subject: [PATCH 06/14] Backporting types from v3 to support updating pro submodule. --- packages/backend-core/src/sql/sqlTable.ts | 5 +- packages/shared-core/src/table.ts | 3 + packages/types/src/documents/app/row.ts | 7 ++ .../src/documents/app/table/constants.ts | 1 + .../types/src/documents/app/table/schema.ts | 13 +++ packages/types/src/sdk/ai.ts | 91 +++++++++++++++++++ packages/types/src/sdk/index.ts | 1 + 7 files changed, 120 insertions(+), 1 deletion(-) create mode 100644 packages/types/src/sdk/ai.ts diff --git a/packages/backend-core/src/sql/sqlTable.ts b/packages/backend-core/src/sql/sqlTable.ts index f5b02cc4e4..84f4e290aa 100644 --- a/packages/backend-core/src/sql/sqlTable.ts +++ b/packages/backend-core/src/sql/sqlTable.ts @@ -17,7 +17,7 @@ import SchemaBuilder = Knex.SchemaBuilder import CreateTableBuilder = Knex.CreateTableBuilder function isIgnoredType(type: FieldType) { - const ignored = [FieldType.LINK, FieldType.FORMULA] + const ignored = [FieldType.LINK, FieldType.FORMULA, FieldType.AI] return ignored.indexOf(type) !== -1 } @@ -144,6 +144,9 @@ function generateSchema( case FieldType.FORMULA: // This is allowed, but nothing to do on the external datasource break + case FieldType.AI: + // This is allowed, but nothing to do on the external datasource + break case FieldType.ATTACHMENTS: case FieldType.ATTACHMENT_SINGLE: case FieldType.SIGNATURE_SINGLE: diff --git a/packages/shared-core/src/table.ts b/packages/shared-core/src/table.ts index e81e8266cc..73e3ad6cb7 100644 --- a/packages/shared-core/src/table.ts +++ b/packages/shared-core/src/table.ts @@ -8,6 +8,7 @@ const allowDisplayColumnByType: Record = { [FieldType.NUMBER]: true, [FieldType.DATETIME]: true, [FieldType.FORMULA]: true, + [FieldType.AI]: true, [FieldType.AUTO]: true, [FieldType.INTERNAL]: true, [FieldType.BARCODEQR]: true, @@ -38,6 +39,7 @@ const allowSortColumnByType: Record = { [FieldType.JSON]: true, [FieldType.FORMULA]: false, + [FieldType.AI]: false, [FieldType.ATTACHMENTS]: false, [FieldType.ATTACHMENT_SINGLE]: false, [FieldType.SIGNATURE_SINGLE]: false, @@ -62,6 +64,7 @@ const allowDefaultColumnByType: Record = { [FieldType.BIGINT]: false, [FieldType.BOOLEAN]: false, [FieldType.FORMULA]: false, + [FieldType.AI]: false, [FieldType.ATTACHMENTS]: false, [FieldType.ATTACHMENT_SINGLE]: false, [FieldType.SIGNATURE_SINGLE]: false, diff --git a/packages/types/src/documents/app/row.ts b/packages/types/src/documents/app/row.ts index 673d481e3c..b0c5267b37 100644 --- a/packages/types/src/documents/app/row.ts +++ b/packages/types/src/documents/app/row.ts @@ -76,6 +76,13 @@ export enum FieldType { * that is part of the initial formula definition, the formula will be live evaluated in the browser. */ AUTO = "auto", + /** + * A complex type, called an AI column within Budibase. This type is only supported against internal tables + * and calculates the output based on a chosen operation (summarise text, translation etc) which passes to + * the configured Budibase Large Language Model to retrieve the output and write it back into the row. + * AI fields function in a similar fashion to static formulas, and possess many of the same characteristics. + */ + AI = "ai", /** * a JSON type, called JSON within Budibase. This type allows any arbitrary JSON to be input to this column * type, which will be represented as a JSON object in the row. This type depends on a schema being diff --git a/packages/types/src/documents/app/table/constants.ts b/packages/types/src/documents/app/table/constants.ts index fffaddc5df..117cfa0eba 100644 --- a/packages/types/src/documents/app/table/constants.ts +++ b/packages/types/src/documents/app/table/constants.ts @@ -30,6 +30,7 @@ export enum JsonFieldSubType { export enum FormulaType { STATIC = "static", DYNAMIC = "dynamic", + AI = "ai", } export enum BBReferenceFieldSubType { diff --git a/packages/types/src/documents/app/table/schema.ts b/packages/types/src/documents/app/table/schema.ts index b98a0a3d4a..45d0aa78d2 100644 --- a/packages/types/src/documents/app/table/schema.ts +++ b/packages/types/src/documents/app/table/schema.ts @@ -9,6 +9,7 @@ import { JsonFieldSubType, RelationshipType, } from "./constants" +import { AIOperationEnum } from "../../../sdk/ai" export interface UIFieldMetadata { order?: number @@ -116,6 +117,16 @@ export interface FormulaFieldMetadata extends BaseFieldSchema { formulaType?: FormulaType } +export interface AIFieldMetadata extends BaseFieldSchema { + type: FieldType.AI + operation: AIOperationEnum + columns?: string[] + column?: string + categories?: string[] + prompt?: string + language?: string +} + export interface BBReferenceFieldMetadata extends Omit { type: FieldType.BB_REFERENCE @@ -194,6 +205,7 @@ interface OtherFieldMetadata extends BaseFieldSchema { | FieldType.LINK | FieldType.AUTO | FieldType.FORMULA + | FieldType.AI | FieldType.NUMBER | FieldType.LONGFORM | FieldType.BB_REFERENCE @@ -211,6 +223,7 @@ export type FieldSchema = | RelationshipFieldMetadata | AutoColumnFieldMetadata | FormulaFieldMetadata + | AIFieldMetadata | NumberFieldMetadata | LongFormFieldMetadata | StringFieldMetadata diff --git a/packages/types/src/sdk/ai.ts b/packages/types/src/sdk/ai.ts new file mode 100644 index 0000000000..345effa939 --- /dev/null +++ b/packages/types/src/sdk/ai.ts @@ -0,0 +1,91 @@ +export enum AIOperationEnum { + SUMMARISE_TEXT = "SUMMARISE_TEXT", + CLEAN_DATA = "CLEAN_DATA", + TRANSLATE = "TRANSLATE", + CATEGORISE_TEXT = "CATEGORISE_TEXT", + SENTIMENT_ANALYSIS = "SENTIMENT_ANALYSIS", + PROMPT = "PROMPT", + SEARCH_WEB = "SEARCH_WEB", +} + +export enum OperationFieldTypeEnum { + MULTI_COLUMN = "columns", + COLUMN = "column", + BINDABLE_TEXT = "prompt", +} + +export type OperationFieldsType = { + [AIOperationEnum.SUMMARISE_TEXT]: { + columns: OperationFieldTypeEnum.MULTI_COLUMN + } + [AIOperationEnum.CLEAN_DATA]: { + column: OperationFieldTypeEnum.COLUMN + } + [AIOperationEnum.TRANSLATE]: { + column: OperationFieldTypeEnum.COLUMN + language: OperationFieldTypeEnum.BINDABLE_TEXT + } + [AIOperationEnum.CATEGORISE_TEXT]: { + columns: OperationFieldTypeEnum.MULTI_COLUMN + categories: OperationFieldTypeEnum.BINDABLE_TEXT + } + [AIOperationEnum.SENTIMENT_ANALYSIS]: { + column: OperationFieldTypeEnum.COLUMN + } + [AIOperationEnum.PROMPT]: { + prompt: OperationFieldTypeEnum.BINDABLE_TEXT + } + [AIOperationEnum.SEARCH_WEB]: { + columns: OperationFieldTypeEnum.MULTI_COLUMN + } +} + +type BaseSchema = { + operation: AIOperationEnum +} + +type SummariseTextSchema = BaseSchema & { + operation: AIOperationEnum.SUMMARISE_TEXT + columns: string[] +} + +type CleanDataSchema = BaseSchema & { + operation: AIOperationEnum.CLEAN_DATA + column: string +} + +type TranslateSchema = BaseSchema & { + operation: AIOperationEnum.TRANSLATE + column: string + language: string +} + +type CategoriseTextSchema = BaseSchema & { + operation: AIOperationEnum.CATEGORISE_TEXT + columns: string[] + categories: string[] +} + +type SentimentAnalysisSchema = BaseSchema & { + operation: AIOperationEnum.SENTIMENT_ANALYSIS + column: string +} + +type PromptSchema = BaseSchema & { + operation: AIOperationEnum.PROMPT + prompt: string +} + +type SearchWebSchema = BaseSchema & { + operation: AIOperationEnum.SEARCH_WEB + columns: string[] +} + +export type AIColumnSchema = + | SummariseTextSchema + | CleanDataSchema + | TranslateSchema + | CategoriseTextSchema + | SentimentAnalysisSchema + | PromptSchema + | SearchWebSchema diff --git a/packages/types/src/sdk/index.ts b/packages/types/src/sdk/index.ts index d87ec58b0c..86eb5b1a24 100644 --- a/packages/types/src/sdk/index.ts +++ b/packages/types/src/sdk/index.ts @@ -1,3 +1,4 @@ +export * from "./ai" export * from "./automations" export * from "./hosting" export * from "./context" From e7a6e587515d9ca2893cb6796403d707c8e9d08b Mon Sep 17 00:00:00 2001 From: mike12345567 Date: Fri, 18 Oct 2024 17:59:26 +0100 Subject: [PATCH 07/14] Updating some further types - added 2 ts-ignores which will be removed on v3 branch. --- packages/server/src/api/routes/tests/row.spec.ts | 1 + packages/server/src/api/routes/tests/viewV2.spec.ts | 8 ++++---- packages/server/src/integrations/googlesheets.ts | 4 +++- packages/server/src/integrations/utils/utils.ts | 1 + packages/server/src/sdk/app/tables/internal/sqs.ts | 1 + packages/server/src/tests/utilities/structures.ts | 1 + 6 files changed, 11 insertions(+), 5 deletions(-) diff --git a/packages/server/src/api/routes/tests/row.spec.ts b/packages/server/src/api/routes/tests/row.spec.ts index 2717a1b7d5..31067ab40f 100644 --- a/packages/server/src/api/routes/tests/row.spec.ts +++ b/packages/server/src/api/routes/tests/row.spec.ts @@ -2074,6 +2074,7 @@ describe.each([ ) tableId = table._id! + // @ts-ignore - until AI implemented const rowValues: Record = { [FieldType.STRING]: generator.guid(), [FieldType.LONGFORM]: generator.paragraph(), diff --git a/packages/server/src/api/routes/tests/viewV2.spec.ts b/packages/server/src/api/routes/tests/viewV2.spec.ts index 7979fac555..dfd4f50bd1 100644 --- a/packages/server/src/api/routes/tests/viewV2.spec.ts +++ b/packages/server/src/api/routes/tests/viewV2.spec.ts @@ -206,7 +206,7 @@ describe.each([ visible: false, icon: "ic", }, - } as Record, + } as ViewV2Schema, } const createdView = await config.api.viewV2.create(newView) @@ -250,7 +250,7 @@ describe.each([ name: "Category", type: FieldType.STRING, }, - } as Record, + } as ViewV2Schema, } await config.api.viewV2.create(newView, { @@ -1044,7 +1044,7 @@ describe.each([ visible: false, icon: "ic", }, - } as Record, + } as ViewV2Schema, }) expect(updatedView).toEqual({ @@ -1078,7 +1078,7 @@ describe.each([ name: "Category", type: FieldType.STRING, }, - } as Record, + } as ViewV2Schema, }, { status: 200, diff --git a/packages/server/src/integrations/googlesheets.ts b/packages/server/src/integrations/googlesheets.ts index 831528f84d..5f61791683 100644 --- a/packages/server/src/integrations/googlesheets.ts +++ b/packages/server/src/integrations/googlesheets.ts @@ -56,6 +56,7 @@ interface AuthTokenResponse { const isTypeAllowed: Record = { [FieldType.STRING]: true, [FieldType.FORMULA]: true, + [FieldType.AI]: true, [FieldType.NUMBER]: true, [FieldType.LONGFORM]: true, [FieldType.DATETIME]: true, @@ -490,7 +491,8 @@ export class GoogleSheetsIntegration implements DatasourcePlus { } if ( !sheet.headerValues.includes(key) && - column.type !== FieldType.FORMULA + column.type !== FieldType.FORMULA && + column.type !== FieldType.AI ) { updatedHeaderValues.push(key) } diff --git a/packages/server/src/integrations/utils/utils.ts b/packages/server/src/integrations/utils/utils.ts index 43302de36f..73b2f637f8 100644 --- a/packages/server/src/integrations/utils/utils.ts +++ b/packages/server/src/integrations/utils/utils.ts @@ -242,6 +242,7 @@ function copyExistingPropsOver( let shouldKeepSchema = false switch (existingColumnType) { case FieldType.FORMULA: + case FieldType.AI: case FieldType.AUTO: case FieldType.INTERNAL: shouldKeepSchema = true diff --git a/packages/server/src/sdk/app/tables/internal/sqs.ts b/packages/server/src/sdk/app/tables/internal/sqs.ts index bd71644537..7533e2b22a 100644 --- a/packages/server/src/sdk/app/tables/internal/sqs.ts +++ b/packages/server/src/sdk/app/tables/internal/sqs.ts @@ -19,6 +19,7 @@ const FieldTypeMap: Record = { [FieldType.BOOLEAN]: SQLiteType.NUMERIC, [FieldType.DATETIME]: SQLiteType.TEXT, [FieldType.FORMULA]: SQLiteType.TEXT, + [FieldType.AI]: SQLiteType.TEXT, [FieldType.LONGFORM]: SQLiteType.TEXT, [FieldType.NUMBER]: SQLiteType.REAL, [FieldType.STRING]: SQLiteType.TEXT, diff --git a/packages/server/src/tests/utilities/structures.ts b/packages/server/src/tests/utilities/structures.ts index cf6d47053a..ad2ec5bec3 100644 --- a/packages/server/src/tests/utilities/structures.ts +++ b/packages/server/src/tests/utilities/structures.ts @@ -605,6 +605,7 @@ export function fullSchemaWithoutLinks({ }): { [type in Exclude]: FieldSchema & { type: type } } { + // @ts-ignore - until AI implemented return { [FieldType.STRING]: { name: "string", From b46626c926341b7c3fce5e2a46661c1ff506d67b Mon Sep 17 00:00:00 2001 From: mike12345567 Date: Fri, 18 Oct 2024 18:23:01 +0100 Subject: [PATCH 08/14] Removing ts-ignore. --- packages/server/src/api/routes/tests/row.spec.ts | 1 - packages/server/src/tests/utilities/structures.ts | 1 - 2 files changed, 2 deletions(-) diff --git a/packages/server/src/api/routes/tests/row.spec.ts b/packages/server/src/api/routes/tests/row.spec.ts index fa288081c7..66e931d0ab 100644 --- a/packages/server/src/api/routes/tests/row.spec.ts +++ b/packages/server/src/api/routes/tests/row.spec.ts @@ -2087,7 +2087,6 @@ describe.each([ ) tableId = table._id! - // @ts-ignore - until AI implemented const rowValues: Record = { [FieldType.STRING]: generator.guid(), [FieldType.LONGFORM]: generator.paragraph(), diff --git a/packages/server/src/tests/utilities/structures.ts b/packages/server/src/tests/utilities/structures.ts index 1198dc514d..b38cc6484f 100644 --- a/packages/server/src/tests/utilities/structures.ts +++ b/packages/server/src/tests/utilities/structures.ts @@ -606,7 +606,6 @@ export function fullSchemaWithoutLinks({ }): { [type in Exclude]: FieldSchema & { type: type } } { - // @ts-ignore - until AI implemented return { [FieldType.STRING]: { name: "string", From aaa4e7b8dec03ceb3e1e47e9d25ef21abb1d8acf Mon Sep 17 00:00:00 2001 From: mike12345567 Date: Fri, 18 Oct 2024 18:31:06 +0100 Subject: [PATCH 09/14] Pro to master. --- packages/pro | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/packages/pro b/packages/pro index cad8edfba8..297fdc937e 160000 --- a/packages/pro +++ b/packages/pro @@ -1 +1 @@ -Subproject commit cad8edfba856058cd12dd9e7363b998ddea76034 +Subproject commit 297fdc937e9c650b4964fc1a942b60022b195865 From e4702070d84e6c63e36ddf357dc1d62c4372f2c4 Mon Sep 17 00:00:00 2001 From: Dean Date: Mon, 21 Oct 2024 09:08:34 +0100 Subject: [PATCH 10/14] Lint. Remove duplicate entry --- packages/builder/src/constants/backend/automations.js | 1 - 1 file changed, 1 deletion(-) diff --git a/packages/builder/src/constants/backend/automations.js b/packages/builder/src/constants/backend/automations.js index 1c40c925ac..37ae35aea0 100644 --- a/packages/builder/src/constants/backend/automations.js +++ b/packages/builder/src/constants/backend/automations.js @@ -6,7 +6,6 @@ export const TriggerStepID = { WEBHOOK: "WEBHOOK", APP: "APP", CRON: "CRON", - ROW_ACTION: "ROW_ACTION", } export const ActionStepID = { From e9fd5415be8b195fe117869b89bdf71f198492ca Mon Sep 17 00:00:00 2001 From: Dean Date: Mon, 21 Oct 2024 09:10:22 +0100 Subject: [PATCH 11/14] Bump Pro Version --- packages/pro | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/packages/pro b/packages/pro index 1a749caba9..297fdc937e 160000 --- a/packages/pro +++ b/packages/pro @@ -1 +1 @@ -Subproject commit 1a749caba9c85aab2645e5d00db479eb53d3f80f +Subproject commit 297fdc937e9c650b4964fc1a942b60022b195865 From f857e2a3e97c917aad958ff4498f2214825c6f4a Mon Sep 17 00:00:00 2001 From: mike12345567 Date: Mon, 21 Oct 2024 12:56:59 +0100 Subject: [PATCH 12/14] Adding BUDIBASE_AI feature flag. --- packages/backend-core/src/features/features.ts | 1 + packages/types/src/sdk/featureFlag.ts | 1 + 2 files changed, 2 insertions(+) diff --git a/packages/backend-core/src/features/features.ts b/packages/backend-core/src/features/features.ts index 39b8558d2a..e2f8d9b6a1 100644 --- a/packages/backend-core/src/features/features.ts +++ b/packages/backend-core/src/features/features.ts @@ -273,6 +273,7 @@ export const flags = new FlagSet({ [FeatureFlag.AI_CUSTOM_CONFIGS]: Flag.boolean(env.isDev()), [FeatureFlag.ENRICHED_RELATIONSHIPS]: Flag.boolean(env.isDev()), [FeatureFlag.TABLES_DEFAULT_ADMIN]: Flag.boolean(env.isDev()), + [FeatureFlag.BUDIBASE_AI]: Flag.boolean(env.isDev()), }) type UnwrapPromise = T extends Promise ? U : T diff --git a/packages/types/src/sdk/featureFlag.ts b/packages/types/src/sdk/featureFlag.ts index a1033236d7..99ee0f9996 100644 --- a/packages/types/src/sdk/featureFlag.ts +++ b/packages/types/src/sdk/featureFlag.ts @@ -7,6 +7,7 @@ export enum FeatureFlag { DEFAULT_VALUES = "DEFAULT_VALUES", ENRICHED_RELATIONSHIPS = "ENRICHED_RELATIONSHIPS", TABLES_DEFAULT_ADMIN = "TABLES_DEFAULT_ADMIN", + BUDIBASE_AI = "BUDIBASE_AI", } export interface TenantFeatureFlags { From 01edb34b6e01149e73e5618eec55848524f21f71 Mon Sep 17 00:00:00 2001 From: mikesealey Date: Mon, 21 Oct 2024 15:16:45 +0100 Subject: [PATCH 13/14] deprecates Section component --- .../[componentId]/new/_components/componentStructure.json | 2 +- .../client/src/components/app/{ => deprecated}/Section.svelte | 2 +- packages/client/src/components/app/index.js | 2 +- 3 files changed, 3 insertions(+), 3 deletions(-) rename packages/client/src/components/app/{ => deprecated}/Section.svelte (97%) diff --git a/packages/builder/src/pages/builder/app/[application]/design/[screenId]/[componentId]/new/_components/componentStructure.json b/packages/builder/src/pages/builder/app/[application]/design/[screenId]/[componentId]/new/_components/componentStructure.json index ff58a66221..84e1bd75b8 100644 --- a/packages/builder/src/pages/builder/app/[application]/design/[screenId]/[componentId]/new/_components/componentStructure.json +++ b/packages/builder/src/pages/builder/app/[application]/design/[screenId]/[componentId]/new/_components/componentStructure.json @@ -14,7 +14,7 @@ { "name": "Layout", "icon": "ClassicGridView", - "children": ["container", "section", "sidepanel", "modal"] + "children": ["container", "sidepanel", "modal"] }, { "name": "Data", diff --git a/packages/client/src/components/app/Section.svelte b/packages/client/src/components/app/deprecated/Section.svelte similarity index 97% rename from packages/client/src/components/app/Section.svelte rename to packages/client/src/components/app/deprecated/Section.svelte index b86c5cc352..245d280dc0 100644 --- a/packages/client/src/components/app/Section.svelte +++ b/packages/client/src/components/app/deprecated/Section.svelte @@ -1,6 +1,6 @@