From f783499e1d3450d08826ce37974ae9e138a576db Mon Sep 17 00:00:00 2001 From: Odai Ahmad Date: Sun, 23 Aug 2026 13:39:56 +0300 Subject: [PATCH 1/5] feat(pieces): add output schemas to Microsoft Outlook, Dropbox, and HubSpot (#14925) --- .../dropbox/src/lib/actions/copy-file.ts | 2 + .../dropbox/src/lib/actions/copy-folder.ts | 2 + .../src/lib/actions/create-new-folder.ts | 2 + .../src/lib/actions/create-new-text-file.ts | 2 + .../dropbox/src/lib/actions/delete-file.ts | 2 + .../dropbox/src/lib/actions/delete-folder.ts | 2 + .../dropbox/src/lib/actions/download-file.ts | 2 + .../dropbox/src/lib/actions/get-file-link.ts | 2 + .../dropbox/src/lib/actions/list-a-folder.ts | 2 + .../dropbox/src/lib/actions/move-file.ts | 2 + .../dropbox/src/lib/actions/move-folder.ts | 2 + .../dropbox/src/lib/actions/search.ts | 2 + .../dropbox/src/lib/actions/upload-file.ts | 2 + .../dropbox/src/lib/output-schemas.ts | 71 ++++ .../dropbox/src/lib/triggers/new-folder.ts | 2 + .../src/lib/actions/create-associations.ts | 2 + .../src/lib/actions/create-blog-post.ts | 2 + .../hubspot/src/lib/actions/create-company.ts | 2 + .../hubspot/src/lib/actions/create-contact.ts | 2 + .../src/lib/actions/create-custom-object.ts | 2 + .../hubspot/src/lib/actions/create-deal.ts | 2 + .../src/lib/actions/create-line-item.ts | 2 + .../lib/actions/create-or-update-contact.ts | 2 + .../hubspot/src/lib/actions/create-page.ts | 2 + .../hubspot/src/lib/actions/create-product.ts | 2 + .../hubspot/src/lib/actions/create-ticket.ts | 2 + .../src/lib/actions/find-associations.ts | 2 + .../hubspot/src/lib/actions/find-company.ts | 2 + .../hubspot/src/lib/actions/find-contact.ts | 2 + .../src/lib/actions/find-custom-object.ts | 2 + .../hubspot/src/lib/actions/find-deal.ts | 2 + .../hubspot/src/lib/actions/find-line-item.ts | 2 + .../hubspot/src/lib/actions/find-product.ts | 2 + .../hubspot/src/lib/actions/find-ticket.ts | 2 + .../hubspot/src/lib/actions/get-company.ts | 2 + .../hubspot/src/lib/actions/get-contact.ts | 2 + .../src/lib/actions/get-custom-object.ts | 2 + .../hubspot/src/lib/actions/get-deal.ts | 2 + .../hubspot/src/lib/actions/get-line-item.ts | 2 + .../src/lib/actions/get-owner-by-email.ts | 2 + .../src/lib/actions/get-owner-by-id.ts | 2 + .../hubspot/src/lib/actions/get-page.ts | 2 + .../lib/actions/get-pipeline-stage-details.ts | 2 + .../hubspot/src/lib/actions/get-product.ts | 2 + .../hubspot/src/lib/actions/get-ticket.ts | 2 + .../src/lib/actions/remove-associations.ts | 2 + .../hubspot/src/lib/actions/update-company.ts | 2 + .../hubspot/src/lib/actions/update-contact.ts | 2 + .../src/lib/actions/update-custom-object.ts | 2 + .../hubspot/src/lib/actions/update-deal.ts | 2 + .../src/lib/actions/update-line-item.ts | 2 + .../hubspot/src/lib/actions/update-product.ts | 2 + .../hubspot/src/lib/actions/update-ticket.ts | 2 + .../hubspot/src/lib/actions/upload-file.ts | 2 + .../hubspot/src/lib/output-schemas.ts | 307 ++++++++++++++++++ .../src/lib/triggers/deal-stage-updated.ts | 2 + .../triggers/email-subscriptions-timeline.ts | 2 + .../src/lib/triggers/new-blog-article.ts | 2 + .../triggers/new-company-property-change.ts | 2 + .../hubspot/src/lib/triggers/new-company.ts | 2 + .../src/lib/triggers/new-contact-in-list.ts | 2 + .../triggers/new-contact-property-change.ts | 2 + .../hubspot/src/lib/triggers/new-contact.ts | 2 + .../new-custom-object-property-change.ts | 2 + .../src/lib/triggers/new-custom-object.ts | 2 + .../lib/triggers/new-deal-property-change.ts | 2 + .../hubspot/src/lib/triggers/new-deal.ts | 2 + .../src/lib/triggers/new-form-submission.ts | 2 + .../hubspot/src/lib/triggers/new-line-item.ts | 2 + .../lib/triggers/new-or-updated-company.ts | 2 + .../lib/triggers/new-or-updated-contact.ts | 2 + .../lib/triggers/new-or-updated-line-item.ts | 2 + .../lib/triggers/new-or-updated-product.ts | 2 + .../hubspot/src/lib/triggers/new-product.ts | 2 + .../hubspot/src/lib/triggers/new-task.ts | 2 + .../triggers/new-ticket-property-change.ts | 2 + .../hubspot/src/lib/triggers/new-ticket.ts | 2 + .../src/lib/actions/add-label-to-email.ts | 2 + .../src/lib/actions/create-draft-email.ts | 8 +- .../lib/actions/download-email-attachment.ts | 4 +- .../src/lib/actions/find-email.ts | 5 +- .../src/lib/actions/forward-email.ts | 7 +- .../src/lib/actions/move-email-to-folder.ts | 2 + .../lib/actions/remove-label-from-email.ts | 2 + .../src/lib/actions/reply-email.ts | 8 +- .../actions/request-approval-send-email.ts | 2 + .../src/lib/actions/send-draft-email.ts | 2 + .../src/lib/actions/send-email.ts | 6 +- .../src/lib/output-schemas.ts | 107 ++++++ .../src/lib/triggers/new-attachment.ts | 2 + .../src/lib/triggers/new-email-in-folder.ts | 2 + .../src/lib/triggers/new-email.ts | 2 + 92 files changed, 674 insertions(+), 15 deletions(-) create mode 100644 packages/pieces/community/dropbox/src/lib/output-schemas.ts create mode 100644 packages/pieces/community/hubspot/src/lib/output-schemas.ts create mode 100644 packages/pieces/community/microsoft-outlook/src/lib/output-schemas.ts diff --git a/packages/pieces/community/dropbox/src/lib/actions/copy-file.ts b/packages/pieces/community/dropbox/src/lib/actions/copy-file.ts index 4e6d04aff5b..a49f5868ac2 100644 --- a/packages/pieces/community/dropbox/src/lib/actions/copy-file.ts +++ b/packages/pieces/community/dropbox/src/lib/actions/copy-file.ts @@ -5,6 +5,7 @@ import { AuthenticationType, } from '@activepieces/pieces-common'; import { dropboxAuth } from '../auth'; +import { fileMetadataOutputSchema } from '../output-schemas'; export const dropboxCopyFile = createAction({ auth: dropboxAuth, @@ -14,6 +15,7 @@ export const dropboxCopyFile = createAction({ audience: 'both', aiMetadata: { description: 'Copies the file at the source path to a new destination path within Dropbox, leaving the original in place; optionally autorenames on conflict. Use to duplicate a single file. Not idempotent: each call creates a copy, so repeating it errors on conflict or, with autorename, produces additional duplicates.', idempotent: false }, displayName: 'Copy file', + outputSchema: fileMetadataOutputSchema, props: { from_path: Property.ShortText({ displayName: 'From Path', diff --git a/packages/pieces/community/dropbox/src/lib/actions/copy-folder.ts b/packages/pieces/community/dropbox/src/lib/actions/copy-folder.ts index 7641bded4ef..3230d77aef5 100644 --- a/packages/pieces/community/dropbox/src/lib/actions/copy-folder.ts +++ b/packages/pieces/community/dropbox/src/lib/actions/copy-folder.ts @@ -5,6 +5,7 @@ import { AuthenticationType, } from '@activepieces/pieces-common'; import { dropboxAuth } from '../auth'; +import { folderMetadataOutputSchema } from '../output-schemas'; export const dropboxCopyFolder = createAction({ auth: dropboxAuth, @@ -14,6 +15,7 @@ export const dropboxCopyFolder = createAction({ audience: 'both', aiMetadata: { description: 'Copies the folder at the source path, including its contents, to a new destination path within Dropbox, leaving the original in place; optionally autorenames on conflict. Use to duplicate an entire directory. Not idempotent: each call creates a copy, so repeating it errors on conflict or, with autorename, produces additional duplicates.', idempotent: false }, displayName: 'Copy folder', + outputSchema: folderMetadataOutputSchema, props: { from_path: Property.ShortText({ displayName: 'From Path', diff --git a/packages/pieces/community/dropbox/src/lib/actions/create-new-folder.ts b/packages/pieces/community/dropbox/src/lib/actions/create-new-folder.ts index b44b4e9ba49..7555b90c7d1 100644 --- a/packages/pieces/community/dropbox/src/lib/actions/create-new-folder.ts +++ b/packages/pieces/community/dropbox/src/lib/actions/create-new-folder.ts @@ -6,6 +6,7 @@ import { httpClient, } from '@activepieces/pieces-common'; import { dropboxAuth } from '../auth'; +import { folderMetadataOutputSchema } from '../output-schemas'; export const dropboxCreateNewFolder = createAction({ auth: dropboxAuth, @@ -15,6 +16,7 @@ export const dropboxCreateNewFolder = createAction({ audience: 'both', aiMetadata: { description: 'Creates a new empty folder at the given Dropbox path; optionally autorenames on conflict. Use to set up a destination directory before placing files. Not idempotent: a repeat call for an existing path errors (or, with autorename, creates a differently named folder).', idempotent: false }, displayName: 'Create New Folder', + outputSchema: folderMetadataOutputSchema, props: { path: Property.ShortText({ displayName: 'Path', diff --git a/packages/pieces/community/dropbox/src/lib/actions/create-new-text-file.ts b/packages/pieces/community/dropbox/src/lib/actions/create-new-text-file.ts index f3b5b7af0f0..8552c5278f5 100644 --- a/packages/pieces/community/dropbox/src/lib/actions/create-new-text-file.ts +++ b/packages/pieces/community/dropbox/src/lib/actions/create-new-text-file.ts @@ -6,6 +6,7 @@ import { httpClient, } from '@activepieces/pieces-common'; import { dropboxAuth } from '../auth'; +import { uploadedFileOutputSchema } from '../output-schemas'; export const dropboxCreateNewTextFile = createAction({ auth: dropboxAuth, @@ -15,6 +16,7 @@ export const dropboxCreateNewTextFile = createAction({ audience: 'both', aiMetadata: { description: 'Writes the provided text content to a new file at the given Dropbox path (upload in add mode). Use when an agent needs to persist generated or supplied text directly as a file without first producing a file object. Not idempotent: each call uploads, so repeating it can create autorenamed duplicates rather than overwriting.', idempotent: false }, displayName: 'Create New Text File', + outputSchema: uploadedFileOutputSchema, props: { path: Property.ShortText({ displayName: 'Path', diff --git a/packages/pieces/community/dropbox/src/lib/actions/delete-file.ts b/packages/pieces/community/dropbox/src/lib/actions/delete-file.ts index 3650776e9b1..b9f1a1dffa0 100644 --- a/packages/pieces/community/dropbox/src/lib/actions/delete-file.ts +++ b/packages/pieces/community/dropbox/src/lib/actions/delete-file.ts @@ -5,6 +5,7 @@ import { AuthenticationType, } from '@activepieces/pieces-common'; import { dropboxAuth } from '../auth'; +import { fileMetadataOutputSchema } from '../output-schemas'; export const dropboxDeleteFile = createAction({ auth: dropboxAuth, @@ -14,6 +15,7 @@ export const dropboxDeleteFile = createAction({ audience: 'both', aiMetadata: { description: 'Permanently deletes the file at the given Dropbox path. Use to remove a specific file an agent has resolved the path for. Effectively idempotent on the end state once the path is gone, but a repeat call fails because the path no longer exists; treat as a destructive, non-recoverable mutation.', idempotent: false }, displayName: 'Delete file', + outputSchema: fileMetadataOutputSchema, props: { path: Property.ShortText({ displayName: 'Path', diff --git a/packages/pieces/community/dropbox/src/lib/actions/delete-folder.ts b/packages/pieces/community/dropbox/src/lib/actions/delete-folder.ts index 97c7a5c7f2b..954d9f06c3d 100644 --- a/packages/pieces/community/dropbox/src/lib/actions/delete-folder.ts +++ b/packages/pieces/community/dropbox/src/lib/actions/delete-folder.ts @@ -5,6 +5,7 @@ import { AuthenticationType, } from '@activepieces/pieces-common'; import { dropboxAuth } from '../auth'; +import { folderMetadataOutputSchema } from '../output-schemas'; export const dropboxDeleteFolder = createAction({ auth: dropboxAuth, @@ -14,6 +15,7 @@ export const dropboxDeleteFolder = createAction({ audience: 'both', aiMetadata: { description: 'Permanently deletes the folder at the given Dropbox path along with all of its contents. Use to remove an entire directory. Effectively idempotent on the end state once the path is gone, but a repeat call fails because the path no longer exists; treat as a destructive, non-recoverable mutation.', idempotent: false }, displayName: 'Delete folder', + outputSchema: folderMetadataOutputSchema, props: { path: Property.ShortText({ displayName: 'Path', diff --git a/packages/pieces/community/dropbox/src/lib/actions/download-file.ts b/packages/pieces/community/dropbox/src/lib/actions/download-file.ts index db9a30f055b..92a0c6f6363 100644 --- a/packages/pieces/community/dropbox/src/lib/actions/download-file.ts +++ b/packages/pieces/community/dropbox/src/lib/actions/download-file.ts @@ -5,6 +5,7 @@ import { AuthenticationType, } from '@activepieces/pieces-common'; import { dropboxAuth } from '../auth'; +import { downloadFileOutputSchema } from '../output-schemas'; export const dropboxDownloadFile = createAction({ auth: dropboxAuth, @@ -14,6 +15,7 @@ export const dropboxDownloadFile = createAction({ description: 'Download a File from Dropbox', audience: 'both', aiMetadata: { description: 'Downloads the file at the given Dropbox path and returns it as a file object for use by later steps. Use to retrieve file contents into a flow. Read-only on Dropbox; repeating the call with the same path is safe and yields the same file.', idempotent: true }, + outputSchema: downloadFileOutputSchema, props: { path: Property.ShortText({ displayName: "Path", diff --git a/packages/pieces/community/dropbox/src/lib/actions/get-file-link.ts b/packages/pieces/community/dropbox/src/lib/actions/get-file-link.ts index 8c77c1f034c..f46713012c6 100644 --- a/packages/pieces/community/dropbox/src/lib/actions/get-file-link.ts +++ b/packages/pieces/community/dropbox/src/lib/actions/get-file-link.ts @@ -5,6 +5,7 @@ import { AuthenticationType, } from '@activepieces/pieces-common'; import { dropboxAuth } from '../auth'; +import { getFileLinkOutputSchema } from '../output-schemas'; export const dropboxGetFileLink = createAction({ auth: dropboxAuth, @@ -14,6 +15,7 @@ export const dropboxGetFileLink = createAction({ audience: 'both', aiMetadata: { description: 'Returns a temporary, directly downloadable URL for the file at the given Dropbox path. Use when an agent needs a shareable or fetchable link to file contents rather than downloading the bytes into the flow. Read-only lookup; safe to repeat, though the returned URL is short-lived.', idempotent: true }, displayName: 'Get temporary file link', + outputSchema: getFileLinkOutputSchema, props: { path: Property.ShortText({ displayName: 'Path', diff --git a/packages/pieces/community/dropbox/src/lib/actions/list-a-folder.ts b/packages/pieces/community/dropbox/src/lib/actions/list-a-folder.ts index a3cd538442a..e93f29e71dc 100644 --- a/packages/pieces/community/dropbox/src/lib/actions/list-a-folder.ts +++ b/packages/pieces/community/dropbox/src/lib/actions/list-a-folder.ts @@ -5,6 +5,7 @@ import { AuthenticationType, } from '@activepieces/pieces-common'; import { dropboxAuth } from '../auth'; +import { listFolderOutputSchema } from '../output-schemas'; export const dropboxListAFolder = createAction({ auth: dropboxAuth, @@ -14,6 +15,7 @@ export const dropboxListAFolder = createAction({ audience: 'both', aiMetadata: { description: 'Lists the files and subfolders within the given Dropbox folder path (use an empty string for the root), optionally recursing into all subfolders. Use to enumerate folder contents and discover item paths/IDs. Read-only; safe to repeat and returns the same listing for unchanged folders.', idempotent: true }, displayName: 'List a folder', + outputSchema: listFolderOutputSchema, props: { path: Property.ShortText({ displayName: 'Path', diff --git a/packages/pieces/community/dropbox/src/lib/actions/move-file.ts b/packages/pieces/community/dropbox/src/lib/actions/move-file.ts index 43196eea7aa..2709a7fccb9 100644 --- a/packages/pieces/community/dropbox/src/lib/actions/move-file.ts +++ b/packages/pieces/community/dropbox/src/lib/actions/move-file.ts @@ -5,6 +5,7 @@ import { AuthenticationType, } from '@activepieces/pieces-common'; import { dropboxAuth } from '../auth'; +import { fileMetadataOutputSchema } from '../output-schemas'; export const dropboxMoveFile = createAction({ auth: dropboxAuth, @@ -14,6 +15,7 @@ export const dropboxMoveFile = createAction({ audience: 'both', aiMetadata: { description: 'Moves (or renames) the file at the source path to a new destination path within Dropbox; optionally autorenames on conflict. Use to relocate or rename a single file. Not idempotent: after a successful move the source no longer exists, so repeating the call fails or, with autorename, can produce a differently named copy.', idempotent: false }, displayName: 'Move file', + outputSchema: fileMetadataOutputSchema, props: { from_path: Property.ShortText({ displayName: 'From Path', diff --git a/packages/pieces/community/dropbox/src/lib/actions/move-folder.ts b/packages/pieces/community/dropbox/src/lib/actions/move-folder.ts index 65c2a3c3329..ebeb41b9809 100644 --- a/packages/pieces/community/dropbox/src/lib/actions/move-folder.ts +++ b/packages/pieces/community/dropbox/src/lib/actions/move-folder.ts @@ -5,6 +5,7 @@ import { AuthenticationType, } from '@activepieces/pieces-common'; import { dropboxAuth } from '../auth'; +import { folderMetadataOutputSchema } from '../output-schemas'; export const dropboxMoveFolder = createAction({ auth: dropboxAuth, @@ -14,6 +15,7 @@ export const dropboxMoveFolder = createAction({ audience: 'both', aiMetadata: { description: 'Moves (or renames) the folder at the source path, including its contents, to a new destination path within Dropbox; optionally autorenames on conflict. Use to relocate or rename an entire directory. Not idempotent: after a successful move the source no longer exists, so repeating the call fails or, with autorename, produces a differently named folder.', idempotent: false }, displayName: 'Move folder', + outputSchema: folderMetadataOutputSchema, props: { from_path: Property.ShortText({ displayName: 'From Path', diff --git a/packages/pieces/community/dropbox/src/lib/actions/search.ts b/packages/pieces/community/dropbox/src/lib/actions/search.ts index f776fc02c75..feca9b38c71 100644 --- a/packages/pieces/community/dropbox/src/lib/actions/search.ts +++ b/packages/pieces/community/dropbox/src/lib/actions/search.ts @@ -5,6 +5,7 @@ import { AuthenticationType, } from '@activepieces/pieces-common'; import { dropboxAuth } from '../auth'; +import { searchOutputSchema } from '../output-schemas'; export const dropboxSearch = createAction({ auth: dropboxAuth, @@ -14,6 +15,7 @@ export const dropboxSearch = createAction({ audience: 'both', aiMetadata: { description: 'Searches a Dropbox account for files and folders whose name or content matches a query string (minimum 3 characters), optionally scoped to a path and filtered by file status, extensions, categories, or account. Use to locate items and obtain their paths/IDs before acting on them. Read-only; repeating the same search is safe and returns the same matches.', idempotent: true }, displayName: 'Search', + outputSchema: searchOutputSchema, props: { query: Property.ShortText({ displayName: 'Query', diff --git a/packages/pieces/community/dropbox/src/lib/actions/upload-file.ts b/packages/pieces/community/dropbox/src/lib/actions/upload-file.ts index d423a0694d7..b340f345a8b 100644 --- a/packages/pieces/community/dropbox/src/lib/actions/upload-file.ts +++ b/packages/pieces/community/dropbox/src/lib/actions/upload-file.ts @@ -7,6 +7,7 @@ import { streamUtils, } from '@activepieces/pieces-common'; import { dropboxAuth } from '../auth'; +import { uploadedFileOutputSchema } from '../output-schemas'; const CONTENT_API_URL = 'https://content.dropboxapi.com/2'; const SINGLE_REQUEST_LIMIT = 150 * 1024 * 1024; @@ -20,6 +21,7 @@ export const dropboxUploadFile = createAction({ audience: 'both', aiMetadata: { description: 'Uploads a file (provided as a URL or base64 file object) to the given Dropbox path in add mode. Files over 150 MB are uploaded in chunks automatically. Use to store binary or arbitrary file content; prefer the create-text-file action when the source is plain text. Not idempotent: each call uploads, so repeating it can create autorenamed duplicates rather than overwriting.', idempotent: false }, displayName: 'Upload file', + outputSchema: uploadedFileOutputSchema, props: { path: Property.ShortText({ displayName: 'Path', diff --git a/packages/pieces/community/dropbox/src/lib/output-schemas.ts b/packages/pieces/community/dropbox/src/lib/output-schemas.ts new file mode 100644 index 00000000000..dfb9c5f5a8b --- /dev/null +++ b/packages/pieces/community/dropbox/src/lib/output-schemas.ts @@ -0,0 +1,71 @@ +import { OutputSchema } from '@activepieces/pieces-framework'; + +const entryFields: OutputSchema['fields'] = [ + { key: 'name', label: 'Name' }, + { key: 'id', label: 'ID' }, + { key: 'path_display', label: 'Path' }, + { key: 'path_lower', label: 'Path (Lowercase)' }, +]; + +const fileFields: OutputSchema['fields'] = [ + ...entryFields, + { key: 'size', label: 'Size', format: 'filesize' }, + { key: 'client_modified', label: 'Client Modified', format: 'datetime' }, + { key: 'server_modified', label: 'Server Modified', format: 'datetime' }, + { key: 'rev', label: 'Revision' }, + { key: 'content_hash', label: 'Content Hash' }, + { key: 'is_downloadable', label: 'Is Downloadable', format: 'boolean' }, +]; + +export const uploadedFileOutputSchema: OutputSchema = { fields: fileFields }; + +export const fileMetadataOutputSchema: OutputSchema = { + fields: [{ key: 'metadata', label: 'File', children: fileFields }], +}; + +export const folderMetadataOutputSchema: OutputSchema = { + fields: [{ key: 'metadata', label: 'Folder', children: entryFields }], +}; + +export const getFileLinkOutputSchema: OutputSchema = { + fields: [ + { key: 'link', label: 'Temporary Link', format: 'url' }, + { key: 'metadata', label: 'File', children: fileFields }, + ], +}; + +export const downloadFileOutputSchema: OutputSchema = { + fields: [ + { + key: 'file', + label: 'File', + format: 'url', + description: 'Signed download URL for the retrieved file.', + }, + ], +}; + +export const listFolderOutputSchema: OutputSchema = { + fields: [ + { key: 'entries', label: 'Entries', labelKey: 'name', listItems: entryFields }, + { key: 'has_more', label: 'Has More', format: 'boolean' }, + { key: 'cursor', label: 'Cursor' }, + ], +}; + +export const searchOutputSchema: OutputSchema = { + fields: [ + { + key: 'matches', + label: 'Matches', + labelKey: 'metadata.metadata.name', + listItems: entryFields.map((field) => ({ + ...field, + value: `metadata.metadata.${field.value ?? field.key}`, + })), + }, + { key: 'has_more', label: 'Has More', format: 'boolean' }, + ], +}; + +export const newFolderTriggerOutputSchema: OutputSchema = { fields: entryFields }; diff --git a/packages/pieces/community/dropbox/src/lib/triggers/new-folder.ts b/packages/pieces/community/dropbox/src/lib/triggers/new-folder.ts index 620bbe61e78..db0c77171ee 100644 --- a/packages/pieces/community/dropbox/src/lib/triggers/new-folder.ts +++ b/packages/pieces/community/dropbox/src/lib/triggers/new-folder.ts @@ -10,6 +10,7 @@ import { httpClient, } from '@activepieces/pieces-common'; import { dropboxAuth } from '../auth'; +import { newFolderTriggerOutputSchema } from '../output-schemas'; type DropboxListFolderEntry = { id: string; @@ -109,6 +110,7 @@ export const dropboxNewFolder = createTrigger({ type: TriggerStrategy.POLLING, + outputSchema: newFolderTriggerOutputSchema, props: { path: Property.ShortText({ displayName: 'Watched Folder Path', diff --git a/packages/pieces/community/hubspot/src/lib/actions/create-associations.ts b/packages/pieces/community/hubspot/src/lib/actions/create-associations.ts index 6bed1c1ef56..d6fe6bf13a2 100644 --- a/packages/pieces/community/hubspot/src/lib/actions/create-associations.ts +++ b/packages/pieces/community/hubspot/src/lib/actions/create-associations.ts @@ -9,6 +9,7 @@ import { OBJECT_TYPE } from '../common/constants'; import { Client } from '@hubspot/api-client'; import { AssociationSpecAssociationCategoryEnum } from '../common/types'; import { chunk } from '@activepieces/pieces-framework'; +import { createAssociationsOutputSchema } from '../output-schemas'; export const createAssociationsAction = createAction({ auth: hubspotAuth, @@ -18,6 +19,7 @@ export const createAssociationsAction = createAction({ description: 'Creates associations between objects', audience: 'both', aiMetadata: { description: 'Link one source HubSpot object (e.g. a company) to one or more target objects using a specific association type, batching the targets. Re-running with the same inputs re-applies the same association without creating duplicates. Use Remove Associations to undo a link.', idempotent: true }, + outputSchema: createAssociationsOutputSchema, props: { fromObjectId: Property.ShortText({ displayName: 'From Object ID', diff --git a/packages/pieces/community/hubspot/src/lib/actions/create-blog-post.ts b/packages/pieces/community/hubspot/src/lib/actions/create-blog-post.ts index 4d2a5f08d5e..035179c8892 100644 --- a/packages/pieces/community/hubspot/src/lib/actions/create-blog-post.ts +++ b/packages/pieces/community/hubspot/src/lib/actions/create-blog-post.ts @@ -2,6 +2,7 @@ import { AuthenticationType, httpClient, HttpMethod } from '@activepieces/pieces import { hubspotAuth } from '../auth'; import { createAction, Property } from '@activepieces/pieces-framework'; import { blogAuthorDropdown, blogUrlDropdown } from '../common/props'; +import { createBlogPostOutputSchema } from '../output-schemas'; export const createBlogPostAction = createAction({ auth: hubspotAuth, @@ -11,6 +12,7 @@ export const createBlogPostAction = createAction({ description: 'Creates a blog post in you Hubspot COS blog.', audience: 'both', aiMetadata: { description: 'Create a post in a HubSpot CMS (COS) blog with title, slug, body, and featured image, then optionally publish it immediately when Status is set to publish rather than draft. Each call creates a new post, so it is not idempotent.', idempotent: false }, + outputSchema: createBlogPostOutputSchema, props: { contentGroupId: blogUrlDropdown, authorId: blogAuthorDropdown, diff --git a/packages/pieces/community/hubspot/src/lib/actions/create-company.ts b/packages/pieces/community/hubspot/src/lib/actions/create-company.ts index f74aafbd448..8eeb033a5b0 100644 --- a/packages/pieces/community/hubspot/src/lib/actions/create-company.ts +++ b/packages/pieces/community/hubspot/src/lib/actions/create-company.ts @@ -4,6 +4,7 @@ import { getDefaultPropertiesForObject, standardObjectDynamicProperties, standar import { OBJECT_TYPE } from '../common/constants'; import { MarkdownVariant } from '@activepieces/pieces-framework'; import { Client } from '@hubspot/api-client'; +import { crmObjectOutputSchema } from '../output-schemas'; export const createCompanyAction = createAction({ auth: hubspotAuth, @@ -13,6 +14,7 @@ export const createCompanyAction = createAction({ description: 'Creates a company in Hubspot.', audience: 'both', aiMetadata: { description: 'Create a new HubSpot company record from the supplied properties (name, domain, industry, etc.). Always inserts a new company even if one with the same domain already exists, so it is not idempotent; to change an existing record use Update Company, and to locate one first use a find action.', idempotent: false }, + outputSchema: crmObjectOutputSchema, props: { objectProperties: standardObjectDynamicProperties(OBJECT_TYPE.COMPANY, []), markdown: Property.MarkDown({ diff --git a/packages/pieces/community/hubspot/src/lib/actions/create-contact.ts b/packages/pieces/community/hubspot/src/lib/actions/create-contact.ts index 8e55d8b6423..a46c89b9a43 100644 --- a/packages/pieces/community/hubspot/src/lib/actions/create-contact.ts +++ b/packages/pieces/community/hubspot/src/lib/actions/create-contact.ts @@ -5,6 +5,7 @@ import { MarkdownVariant } from '@activepieces/pieces-framework'; import { Client } from '@hubspot/api-client'; import { getDefaultPropertiesForObject, standardObjectDynamicProperties, standardObjectPropertiesDropdown } from '../common/props'; import { OBJECT_TYPE } from '../common/constants'; +import { crmObjectOutputSchema } from '../output-schemas'; export const createContactAction = createAction({ auth: hubspotAuth, @@ -14,6 +15,7 @@ export const createContactAction = createAction({ description: 'Creates a contact in Hubspot.', audience: 'both', aiMetadata: { description: 'Creates a new contact record in HubSpot from the supplied property values, then returns the created contact. Use when you specifically need a new contact; to avoid duplicates when a contact may already exist, prefer Create or Update Contact, which upserts on email. Not idempotent: each call creates a separate contact.', idempotent: false }, + outputSchema: crmObjectOutputSchema, props: { objectProperties: standardObjectDynamicProperties(OBJECT_TYPE.CONTACT, []), markdown: Property.MarkDown({ diff --git a/packages/pieces/community/hubspot/src/lib/actions/create-custom-object.ts b/packages/pieces/community/hubspot/src/lib/actions/create-custom-object.ts index c79b192bbba..e570a411636 100644 --- a/packages/pieces/community/hubspot/src/lib/actions/create-custom-object.ts +++ b/packages/pieces/community/hubspot/src/lib/actions/create-custom-object.ts @@ -8,6 +8,7 @@ import { } from '../common/props'; import { Client } from '@hubspot/api-client'; +import { crmObjectOutputSchema } from '../output-schemas'; export const createCustomObjectAction = createAction({ auth: hubspotAuth, @@ -17,6 +18,7 @@ export const createCustomObjectAction = createAction({ description: 'Creates a custom object in Hubspot.', audience: 'both', aiMetadata: { description: 'Create a new record of a selected HubSpot custom object type from the supplied properties. Each call inserts a new record, so it is not idempotent. Requires choosing the custom object type; use Find Custom Object to locate an existing record.', idempotent: false }, + outputSchema: crmObjectOutputSchema, props: { customObjectType: customObjectDropdown, objectProperties: customObjectDynamicProperties, diff --git a/packages/pieces/community/hubspot/src/lib/actions/create-deal.ts b/packages/pieces/community/hubspot/src/lib/actions/create-deal.ts index f77373b6d93..a200a62cfa0 100644 --- a/packages/pieces/community/hubspot/src/lib/actions/create-deal.ts +++ b/packages/pieces/community/hubspot/src/lib/actions/create-deal.ts @@ -13,6 +13,7 @@ import { } from '../common/props'; import { Client } from '@hubspot/api-client'; +import { crmObjectOutputSchema } from '../output-schemas'; export const createDealAction = createAction({ auth: hubspotAuth, @@ -22,6 +23,7 @@ export const createDealAction = createAction({ description: 'Creates a new deal in Hubspot.', audience: 'both', aiMetadata: { description: 'Creates a new deal in HubSpot, requiring a deal name plus a pipeline and stage, and returns the created deal. Use to open a new opportunity; use Update Deal to modify an existing one. Not idempotent: each call creates a separate deal, so guard against duplicates.', idempotent: false }, + outputSchema: crmObjectOutputSchema, props: { dealname: Property.ShortText({ displayName: 'Deal Name', diff --git a/packages/pieces/community/hubspot/src/lib/actions/create-line-item.ts b/packages/pieces/community/hubspot/src/lib/actions/create-line-item.ts index 00f713f76a3..2eb82ac4c82 100644 --- a/packages/pieces/community/hubspot/src/lib/actions/create-line-item.ts +++ b/packages/pieces/community/hubspot/src/lib/actions/create-line-item.ts @@ -10,6 +10,7 @@ import { OBJECT_TYPE } from '../common/constants'; import { MarkdownVariant } from '@activepieces/pieces-framework'; import { Client } from '@hubspot/api-client'; +import { crmObjectOutputSchema } from '../output-schemas'; export const createLineItemAction = createAction({ auth: hubspotAuth, @@ -19,6 +20,7 @@ export const createLineItemAction = createAction({ description: 'Creates a line item in Hubspot.', audience: 'both', aiMetadata: { description: 'Creates a new standalone line item in HubSpot from a required product plus optional property values (quantity, price, discount), and returns the created line item. Use when building out a quote or deal\'s line items. Not idempotent: each call creates a separate line item.', idempotent: false }, + outputSchema: crmObjectOutputSchema, props: { productId: productDropdown({ displayName: 'Line Item Information: Product ID', diff --git a/packages/pieces/community/hubspot/src/lib/actions/create-or-update-contact.ts b/packages/pieces/community/hubspot/src/lib/actions/create-or-update-contact.ts index eb4dce0b0f9..08f847765d6 100644 --- a/packages/pieces/community/hubspot/src/lib/actions/create-or-update-contact.ts +++ b/packages/pieces/community/hubspot/src/lib/actions/create-or-update-contact.ts @@ -5,6 +5,7 @@ import { Client } from '@hubspot/api-client'; import { standardObjectDynamicProperties } from '../common/props'; import { OBJECT_TYPE } from '../common/constants'; import { FilterOperatorEnum } from '../common/types'; +import { crmObjectOutputSchema } from '../output-schemas'; export const createOrUpdateContactAction = createAction({ @@ -15,6 +16,7 @@ export const createOrUpdateContactAction = createAction({ description: 'Creates a new contact or updates an existing contact based on email address.', audience: 'both', aiMetadata: { description: 'Upserts a contact keyed on email: searches for a contact with the given email and updates it if found, otherwise creates a new one with the provided properties. Use this safe-to-retry path when you want to set a contact by email without risking duplicates; use Create Contact when you specifically need a new record. Idempotent on the email key.', idempotent: true }, + outputSchema: crmObjectOutputSchema, props: { email: Property.ShortText({ displayName: 'Contact Email', diff --git a/packages/pieces/community/hubspot/src/lib/actions/create-page.ts b/packages/pieces/community/hubspot/src/lib/actions/create-page.ts index 714c4e09203..8c8259a81f9 100644 --- a/packages/pieces/community/hubspot/src/lib/actions/create-page.ts +++ b/packages/pieces/community/hubspot/src/lib/actions/create-page.ts @@ -2,6 +2,7 @@ import { AuthenticationType, httpClient, HttpMethod } from '@activepieces/pieces import { hubspotAuth } from '../auth'; import { createAction, Property } from '@activepieces/pieces-framework'; import { pageType } from '../common/props'; +import { pageOutputSchema } from '../output-schemas'; export const createPageAction = createAction({ auth: hubspotAuth, @@ -11,6 +12,7 @@ export const createPageAction = createAction({ description: 'Creates a new landing/site page.', audience: 'both', aiMetadata: { description: 'Create a new HubSpot CMS landing page or site page (choose via Page Type) from a template, then optionally publish it when State is set to publish rather than leaving it as a draft. Each call creates a distinct page, so it is not idempotent.', idempotent: false }, + outputSchema: pageOutputSchema, props: { pageType: pageType, pageTitle: Property.ShortText({ diff --git a/packages/pieces/community/hubspot/src/lib/actions/create-product.ts b/packages/pieces/community/hubspot/src/lib/actions/create-product.ts index 93ca74d0f85..b9c84084fba 100644 --- a/packages/pieces/community/hubspot/src/lib/actions/create-product.ts +++ b/packages/pieces/community/hubspot/src/lib/actions/create-product.ts @@ -8,6 +8,7 @@ import { import { OBJECT_TYPE } from '../common/constants'; import { MarkdownVariant } from '@activepieces/pieces-framework'; import { Client } from '@hubspot/api-client'; +import { crmObjectOutputSchema } from '../output-schemas'; export const createProductAction = createAction({ auth: hubspotAuth, @@ -21,6 +22,7 @@ export const createProductAction = createAction({ 'Create a new product record in the HubSpot product library from the supplied properties (such as name, price, and description). Use when adding a catalog item; each call always creates a separate product, so repeated calls produce duplicates rather than updating an existing one.', idempotent: false, }, + outputSchema: crmObjectOutputSchema, props: { objectProperties: standardObjectDynamicProperties(OBJECT_TYPE.PRODUCT,[]), markdown: Property.MarkDown({ diff --git a/packages/pieces/community/hubspot/src/lib/actions/create-ticket.ts b/packages/pieces/community/hubspot/src/lib/actions/create-ticket.ts index 4eaf44934bf..31763a86ba6 100644 --- a/packages/pieces/community/hubspot/src/lib/actions/create-ticket.ts +++ b/packages/pieces/community/hubspot/src/lib/actions/create-ticket.ts @@ -5,6 +5,7 @@ import { MarkdownVariant } from '@activepieces/pieces-framework'; import { hubspotAuth } from '../auth'; import { getDefaultPropertiesForObject, pipelineDropdown, pipelineStageDropdown, standardObjectDynamicProperties, standardObjectPropertiesDropdown } from '../common/props'; import { OBJECT_TYPE } from '../common/constants'; +import { crmObjectOutputSchema } from '../output-schemas'; export const createTicketAction = createAction({ auth: hubspotAuth, @@ -14,6 +15,7 @@ export const createTicketAction = createAction({ description: 'Creates a ticket in HubSpot.', audience: 'both', aiMetadata: { description: 'Create a new HubSpot support ticket with a name, pipeline, and pipeline stage plus optional properties. Each call creates a separate ticket even for identical input, so it is not idempotent.', idempotent: false }, + outputSchema: crmObjectOutputSchema, props: { ticketName: Property.ShortText({ displayName: 'Ticket Name', diff --git a/packages/pieces/community/hubspot/src/lib/actions/find-associations.ts b/packages/pieces/community/hubspot/src/lib/actions/find-associations.ts index 035af7454fb..a4a49e50e10 100644 --- a/packages/pieces/community/hubspot/src/lib/actions/find-associations.ts +++ b/packages/pieces/community/hubspot/src/lib/actions/find-associations.ts @@ -3,6 +3,7 @@ import { createAction, Property } from '@activepieces/pieces-framework'; import { fromObjectTypeAssociationDropdown } from '../common/props'; import { OBJECT_TYPE } from '../common/constants'; import { Client } from '@hubspot/api-client'; +import { findAssociationsOutputSchema } from '../output-schemas'; export const findAssociationsAction = createAction({ auth: hubspotAuth, @@ -12,6 +13,7 @@ export const findAssociationsAction = createAction({ description: 'Finds associations between objects', audience: 'both', aiMetadata: { description: 'Lists all associations from one CRM object to objects of another type (e.g. a company to its contacts or deals), paging through every result. Use to discover what records are linked to a known object given its ID and the from/to object types. Read-only and idempotent.', idempotent: true }, + outputSchema: findAssociationsOutputSchema, props: { fromObjectId: Property.ShortText({ displayName: 'From Object ID', diff --git a/packages/pieces/community/hubspot/src/lib/actions/find-company.ts b/packages/pieces/community/hubspot/src/lib/actions/find-company.ts index ce6ec181243..a13aac05ea6 100644 --- a/packages/pieces/community/hubspot/src/lib/actions/find-company.ts +++ b/packages/pieces/community/hubspot/src/lib/actions/find-company.ts @@ -8,6 +8,7 @@ import { import { OBJECT_TYPE, MAX_SEARCH_PAGE_SIZE } from '../common/constants'; import { Client } from '@hubspot/api-client'; import { FilterOperatorEnum } from '../common/types'; +import { companySearchOutputSchema } from '../output-schemas'; export const findCompanyAction = createAction({ auth: hubspotAuth, @@ -17,6 +18,7 @@ export const findCompanyAction = createAction({ description: 'Finds a company by searching.', audience: 'both', aiMetadata: { description: 'Searches companies via the HubSpot CRM search API, matching on one or two property name/value pairs (exact match, combined as AND), and returns matching companies. Use to locate a company by domain, name, or another property before reading or updating it; prefer Get Company when you already have the company ID. Read-only and idempotent.', idempotent: true }, + outputSchema: companySearchOutputSchema, props: { firstSearchPropertyName: standardObjectPropertiesDropdown( { diff --git a/packages/pieces/community/hubspot/src/lib/actions/find-contact.ts b/packages/pieces/community/hubspot/src/lib/actions/find-contact.ts index f874e3a2171..be5eebc52ec 100644 --- a/packages/pieces/community/hubspot/src/lib/actions/find-contact.ts +++ b/packages/pieces/community/hubspot/src/lib/actions/find-contact.ts @@ -5,6 +5,7 @@ import { hubspotAuth } from '../auth'; import { getDefaultPropertiesForObject, standardObjectPropertiesDropdown } from '../common/props'; import { OBJECT_TYPE, MAX_SEARCH_PAGE_SIZE } from '../common/constants'; import { FilterOperatorEnum } from '../common/types'; +import { contactSearchOutputSchema } from '../output-schemas'; export const findContactAction = createAction({ auth: hubspotAuth, @@ -14,6 +15,7 @@ export const findContactAction = createAction({ description: 'Finds a contact by searching.', audience: 'both', aiMetadata: { description: 'Search HubSpot contacts by one or two property/value pairs (matched with equality) and return the matching contacts. Read-only and repeatable. Use this to resolve a contact before updating or enrolling it; pick a create action instead when no match should exist.', idempotent: true }, + outputSchema: contactSearchOutputSchema, props: { firstSearchPropertyName: standardObjectPropertiesDropdown( { diff --git a/packages/pieces/community/hubspot/src/lib/actions/find-custom-object.ts b/packages/pieces/community/hubspot/src/lib/actions/find-custom-object.ts index 2990770e152..43687382301 100644 --- a/packages/pieces/community/hubspot/src/lib/actions/find-custom-object.ts +++ b/packages/pieces/community/hubspot/src/lib/actions/find-custom-object.ts @@ -5,6 +5,7 @@ import { hubspotAuth } from '../auth'; import { customObjectDropdown, customObjectPropertiesDropdown } from '../common/props'; import { FilterOperatorEnum } from '../common/types'; import { MAX_SEARCH_PAGE_SIZE } from '../common/constants'; +import { customObjectSearchOutputSchema } from '../output-schemas'; export const findCustomObjectAction = createAction({ auth: hubspotAuth, @@ -14,6 +15,7 @@ export const findCustomObjectAction = createAction({ description: 'Finds a custom object by searching.', audience: 'both', aiMetadata: { description: 'Search records of a selected HubSpot custom object type by one or two property/value pairs (matched with equality) and return the matches. Read-only and repeatable. Requires choosing the custom object type; use Create Custom Object to add a new record.', idempotent: true }, + outputSchema: customObjectSearchOutputSchema, props: { customObjectType: customObjectDropdown, firstSearchPropertyName: customObjectPropertiesDropdown( diff --git a/packages/pieces/community/hubspot/src/lib/actions/find-deal.ts b/packages/pieces/community/hubspot/src/lib/actions/find-deal.ts index 404c15aefb0..e99efc636b1 100644 --- a/packages/pieces/community/hubspot/src/lib/actions/find-deal.ts +++ b/packages/pieces/community/hubspot/src/lib/actions/find-deal.ts @@ -5,6 +5,7 @@ import { OBJECT_TYPE, MAX_SEARCH_PAGE_SIZE } from '../common/constants'; import { MarkdownVariant } from '@activepieces/pieces-framework'; import { FilterOperatorEnum } from '../common/types'; import { Client } from '@hubspot/api-client'; +import { dealSearchOutputSchema } from '../output-schemas'; export const findDealAction = createAction({ auth: hubspotAuth, @@ -14,6 +15,7 @@ export const findDealAction = createAction({ description: 'Finds a deal by searching.', audience: 'both', aiMetadata: { description: 'Search HubSpot deals by one or two property/value pairs (matched with equality) and return the matching deals. Read-only and repeatable. Use this to look up an existing deal before updating or associating it; pick a create action instead when no matching deal should exist.', idempotent: true }, + outputSchema: dealSearchOutputSchema, props: { firstSearchPropertyName: standardObjectPropertiesDropdown( { diff --git a/packages/pieces/community/hubspot/src/lib/actions/find-line-item.ts b/packages/pieces/community/hubspot/src/lib/actions/find-line-item.ts index c7353613b36..b9d9b9073be 100644 --- a/packages/pieces/community/hubspot/src/lib/actions/find-line-item.ts +++ b/packages/pieces/community/hubspot/src/lib/actions/find-line-item.ts @@ -5,6 +5,7 @@ import { hubspotAuth } from '../auth'; import { getDefaultPropertiesForObject, standardObjectPropertiesDropdown } from '../common/props'; import { OBJECT_TYPE, MAX_SEARCH_PAGE_SIZE } from '../common/constants'; import { FilterOperatorEnum } from '../common/types'; +import { lineItemSearchOutputSchema } from '../output-schemas'; export const findLineItemAction = createAction({ auth: hubspotAuth, @@ -14,6 +15,7 @@ export const findLineItemAction = createAction({ description: 'Finds a line item by searching.', audience: 'both', aiMetadata: { description: 'Search HubSpot line items by one or two property/value pairs (matched with equality) and return the matches. Read-only and repeatable. Use this to locate an existing line item before updating it.', idempotent: true }, + outputSchema: lineItemSearchOutputSchema, props: { firstSearchPropertyName: standardObjectPropertiesDropdown( { diff --git a/packages/pieces/community/hubspot/src/lib/actions/find-product.ts b/packages/pieces/community/hubspot/src/lib/actions/find-product.ts index c5e8254c04e..fa25a354b62 100644 --- a/packages/pieces/community/hubspot/src/lib/actions/find-product.ts +++ b/packages/pieces/community/hubspot/src/lib/actions/find-product.ts @@ -7,6 +7,7 @@ import { getDefaultPropertiesForObject, standardObjectPropertiesDropdown import { OBJECT_TYPE, MAX_SEARCH_PAGE_SIZE } from '../common/constants'; import { Client } from '@hubspot/api-client'; import { FilterOperatorEnum } from '../common/types'; +import { productSearchOutputSchema } from '../output-schemas'; export const findProductAction = createAction({ auth: hubspotAuth, @@ -16,6 +17,7 @@ export const findProductAction = createAction({ description: 'Finds a product by searching.', audience: 'both', aiMetadata: { description: 'Search the HubSpot product library by one or two property/value pairs (matched with equality) and return the matching products. Read-only and repeatable. Use Get Product instead when you already have the product ID.', idempotent: true }, + outputSchema: productSearchOutputSchema, props: { firstSearchPropertyName: standardObjectPropertiesDropdown( { diff --git a/packages/pieces/community/hubspot/src/lib/actions/find-ticket.ts b/packages/pieces/community/hubspot/src/lib/actions/find-ticket.ts index 9281fdc6e65..e1409479637 100644 --- a/packages/pieces/community/hubspot/src/lib/actions/find-ticket.ts +++ b/packages/pieces/community/hubspot/src/lib/actions/find-ticket.ts @@ -5,6 +5,7 @@ import { hubspotAuth } from '../auth'; import { getDefaultPropertiesForObject, standardObjectPropertiesDropdown } from '../common/props'; import { OBJECT_TYPE, MAX_SEARCH_PAGE_SIZE } from '../common/constants'; import { FilterOperatorEnum } from '../common/types'; +import { ticketSearchOutputSchema } from '../output-schemas'; export const findTicketAction = createAction({ auth: hubspotAuth, @@ -14,6 +15,7 @@ export const findTicketAction = createAction({ description: 'Finds a ticket by searching.', audience: 'both', aiMetadata: { description: 'Searches support tickets via the HubSpot CRM search API, matching on one or two property name/value pairs (exact match, combined as AND), and returns matching tickets. Use to locate a ticket by subject or another property before reading or updating it; prefer Get Ticket when you already have the ticket ID. Read-only and idempotent.', idempotent: true }, + outputSchema: ticketSearchOutputSchema, props: { firstSearchPropertyName: standardObjectPropertiesDropdown( { diff --git a/packages/pieces/community/hubspot/src/lib/actions/get-company.ts b/packages/pieces/community/hubspot/src/lib/actions/get-company.ts index 07246e63920..c2d07f90a2b 100644 --- a/packages/pieces/community/hubspot/src/lib/actions/get-company.ts +++ b/packages/pieces/community/hubspot/src/lib/actions/get-company.ts @@ -7,6 +7,7 @@ import { import { OBJECT_TYPE } from '../common/constants'; import { Client } from '@hubspot/api-client'; import { MarkdownVariant } from '@activepieces/pieces-framework'; +import { crmObjectOutputSchema } from '../output-schemas'; export const getCompanyAction = createAction({ auth: hubspotAuth, @@ -16,6 +17,7 @@ export const getCompanyAction = createAction({ description: 'Gets a company.', audience: 'both', aiMetadata: { description: 'Fetches a single company by its HubSpot company ID, returning default and any requested additional properties. Use when you already have the company ID; use Find Company to look one up by domain or another property first. Read-only and idempotent.', idempotent: true }, + outputSchema: crmObjectOutputSchema, props: { companyId: Property.ShortText({ displayName: 'Company ID', diff --git a/packages/pieces/community/hubspot/src/lib/actions/get-contact.ts b/packages/pieces/community/hubspot/src/lib/actions/get-contact.ts index 141e8d7401e..ea19434d4b1 100644 --- a/packages/pieces/community/hubspot/src/lib/actions/get-contact.ts +++ b/packages/pieces/community/hubspot/src/lib/actions/get-contact.ts @@ -5,6 +5,7 @@ import { MarkdownVariant } from '@activepieces/pieces-framework'; import { hubspotAuth } from '../auth'; import { getDefaultPropertiesForObject, standardObjectPropertiesDropdown } from '../common/props'; import { OBJECT_TYPE } from '../common/constants'; +import { crmObjectOutputSchema } from '../output-schemas'; export const getContactAction = createAction({ auth: hubspotAuth, @@ -14,6 +15,7 @@ export const getContactAction = createAction({ description: 'Gets a contact.', audience: 'both', aiMetadata: { description: 'Fetches a single contact by its HubSpot contact ID, returning default and any requested additional properties. Use when you already have the contact ID; to look one up by email instead, use a search-based action. Read-only and idempotent.', idempotent: true }, + outputSchema: crmObjectOutputSchema, props: { contactId: Property.ShortText({ displayName: 'Contact ID', diff --git a/packages/pieces/community/hubspot/src/lib/actions/get-custom-object.ts b/packages/pieces/community/hubspot/src/lib/actions/get-custom-object.ts index f020706e85e..722e0a30735 100644 --- a/packages/pieces/community/hubspot/src/lib/actions/get-custom-object.ts +++ b/packages/pieces/community/hubspot/src/lib/actions/get-custom-object.ts @@ -4,6 +4,7 @@ import { Client } from '@hubspot/api-client'; import { MarkdownVariant } from '@activepieces/pieces-framework'; import { hubspotAuth } from '../auth'; import { customObjectDropdown, customObjectPropertiesDropdown } from '../common/props'; +import { crmObjectOutputSchema } from '../output-schemas'; export const getCustomObjectAction = createAction({ auth: hubspotAuth, @@ -13,6 +14,7 @@ export const getCustomObjectAction = createAction({ description: 'Gets a custom object.', audience: 'both', aiMetadata: { description: 'Fetches a single custom-object record by its ID for a chosen custom object type, returning the requested properties. Use when you already have the record ID and the custom object type; for standard CRM objects use the dedicated Get Contact / Deal / Company / Ticket actions instead. Read-only and idempotent.', idempotent: true }, + outputSchema: crmObjectOutputSchema, props: { customObjectType: customObjectDropdown, customObjectId: Property.ShortText({ diff --git a/packages/pieces/community/hubspot/src/lib/actions/get-deal.ts b/packages/pieces/community/hubspot/src/lib/actions/get-deal.ts index 61cb5e396dc..7407303b82e 100644 --- a/packages/pieces/community/hubspot/src/lib/actions/get-deal.ts +++ b/packages/pieces/community/hubspot/src/lib/actions/get-deal.ts @@ -5,6 +5,7 @@ import { MarkdownVariant } from '@activepieces/pieces-framework'; import { hubspotAuth } from '../auth'; import { getDefaultPropertiesForObject, standardObjectPropertiesDropdown } from '../common/props'; import { OBJECT_TYPE } from '../common/constants'; +import { crmObjectOutputSchema } from '../output-schemas'; export const getDealAction = createAction({ auth: hubspotAuth, @@ -14,6 +15,7 @@ export const getDealAction = createAction({ description: 'Gets a deal.', audience: 'both', aiMetadata: { description: 'Fetches a single deal by its HubSpot deal ID, returning default and any requested additional properties such as amount, stage, and close date. Use when you already have the deal ID. Read-only and idempotent.', idempotent: true }, + outputSchema: crmObjectOutputSchema, props: { dealId: Property.ShortText({ displayName: 'Deal ID', diff --git a/packages/pieces/community/hubspot/src/lib/actions/get-line-item.ts b/packages/pieces/community/hubspot/src/lib/actions/get-line-item.ts index 234b25324a5..c591c88f5fc 100644 --- a/packages/pieces/community/hubspot/src/lib/actions/get-line-item.ts +++ b/packages/pieces/community/hubspot/src/lib/actions/get-line-item.ts @@ -4,6 +4,7 @@ import { MarkdownVariant } from '@activepieces/pieces-framework'; import { getDefaultPropertiesForObject, standardObjectPropertiesDropdown } from '../common/props'; import { OBJECT_TYPE } from '../common/constants'; import { Client } from '@hubspot/api-client'; +import { crmObjectOutputSchema } from '../output-schemas'; export const getLineItemAction = createAction({ auth: hubspotAuth, @@ -13,6 +14,7 @@ export const getLineItemAction = createAction({ description: 'Gets a line item.', audience: 'both', aiMetadata: { description: 'Fetches a single line item by its HubSpot line item ID, returning default and any requested additional properties. Use when you already have the line item ID and need its details (price, quantity, product). Read-only and idempotent.', idempotent: true }, + outputSchema: crmObjectOutputSchema, props: { lineItemId: Property.ShortText({ displayName: 'Line Item ID', diff --git a/packages/pieces/community/hubspot/src/lib/actions/get-owner-by-email.ts b/packages/pieces/community/hubspot/src/lib/actions/get-owner-by-email.ts index 623c3f42a23..44a9b7c34e5 100644 --- a/packages/pieces/community/hubspot/src/lib/actions/get-owner-by-email.ts +++ b/packages/pieces/community/hubspot/src/lib/actions/get-owner-by-email.ts @@ -1,6 +1,7 @@ import { createAction, Property } from '@activepieces/pieces-framework'; import { hubspotAuth } from '../auth'; import { Client } from '@hubspot/api-client'; +import { getOwnerByEmailOutputSchema } from '../output-schemas'; export const getOwnerByEmailAction = createAction({ auth: hubspotAuth, @@ -14,6 +15,7 @@ export const getOwnerByEmailAction = createAction({ 'Look up a single HubSpot CRM owner (user) by their email address; use to resolve an email into an owner identity before assigning records to that owner. Read-only and repeatable. Fails if no owner matches the given email.', idempotent: true, }, + outputSchema: getOwnerByEmailOutputSchema, props: { email: Property.ShortText({ displayName: 'Owner Email', diff --git a/packages/pieces/community/hubspot/src/lib/actions/get-owner-by-id.ts b/packages/pieces/community/hubspot/src/lib/actions/get-owner-by-id.ts index decec1b0882..37042c3dfdd 100644 --- a/packages/pieces/community/hubspot/src/lib/actions/get-owner-by-id.ts +++ b/packages/pieces/community/hubspot/src/lib/actions/get-owner-by-id.ts @@ -1,6 +1,7 @@ import { createAction, Property } from '@activepieces/pieces-framework'; import { hubspotAuth } from '../auth'; import { Client } from '@hubspot/api-client'; +import { getOwnerByIdOutputSchema } from '../output-schemas'; export const getOwnerByIdAction = createAction({ auth: hubspotAuth, @@ -10,6 +11,7 @@ export const getOwnerByIdAction = createAction({ description: 'Gets an existing owner by ID.', audience: 'both', aiMetadata: { description: 'Fetches a single HubSpot owner (user) by their numeric owner ID, returning their identity details such as name and email. Use to resolve an owner ID into a person before assigning records or displaying who owns a deal, contact, or ticket. Read-only and idempotent.', idempotent: true }, + outputSchema: getOwnerByIdOutputSchema, props: { ownerId: Property.ShortText({ displayName: 'Owner ID', diff --git a/packages/pieces/community/hubspot/src/lib/actions/get-page.ts b/packages/pieces/community/hubspot/src/lib/actions/get-page.ts index bff6a64c760..4ffc8d53eb6 100644 --- a/packages/pieces/community/hubspot/src/lib/actions/get-page.ts +++ b/packages/pieces/community/hubspot/src/lib/actions/get-page.ts @@ -2,6 +2,7 @@ import { hubspotAuth } from '../auth'; import { createAction, Property } from '@activepieces/pieces-framework'; import { Client } from '@hubspot/api-client'; import { pageType } from '../common/props'; +import { pageOutputSchema } from '../output-schemas'; export const getPageAction = createAction({ auth: hubspotAuth, @@ -15,6 +16,7 @@ export const getPageAction = createAction({ 'Fetch the details of a single HubSpot CMS page by its ID. Use when you already have a page ID and need its current data; the page type input selects whether to read a site page or a landing page. Read-only and repeatable.', idempotent: true, }, + outputSchema: pageOutputSchema, props: { pageType: pageType, pageId: Property.ShortText({ diff --git a/packages/pieces/community/hubspot/src/lib/actions/get-pipeline-stage-details.ts b/packages/pieces/community/hubspot/src/lib/actions/get-pipeline-stage-details.ts index 2d67326b5a7..a7c73342095 100644 --- a/packages/pieces/community/hubspot/src/lib/actions/get-pipeline-stage-details.ts +++ b/packages/pieces/community/hubspot/src/lib/actions/get-pipeline-stage-details.ts @@ -1,6 +1,7 @@ import { hubspotAuth } from '../auth'; import { createAction, Property } from '@activepieces/pieces-framework'; import { Client } from '@hubspot/api-client'; +import { pipelineStageDetailsOutputSchema } from '../output-schemas'; export const getPipelineStageDetailsAction = createAction({ auth: hubspotAuth, @@ -10,6 +11,7 @@ export const getPipelineStageDetailsAction = createAction({ description: 'Finds and retrieves CRM object pipeline stage details.', audience: 'both', aiMetadata: { description: 'Retrieves the configuration of a single pipeline stage (label, order, metadata) for a ticket or deal pipeline, given the object type, pipeline ID, and stage ID. Use to resolve or validate a stage ID before setting a deal or ticket stage. Read-only and idempotent.', idempotent: true }, + outputSchema: pipelineStageDetailsOutputSchema, props: { objectType: Property.StaticDropdown({ displayName: 'Object Type', diff --git a/packages/pieces/community/hubspot/src/lib/actions/get-product.ts b/packages/pieces/community/hubspot/src/lib/actions/get-product.ts index 6b146b48d20..a84545c5d9b 100644 --- a/packages/pieces/community/hubspot/src/lib/actions/get-product.ts +++ b/packages/pieces/community/hubspot/src/lib/actions/get-product.ts @@ -5,6 +5,7 @@ import { MarkdownVariant } from '@activepieces/pieces-framework'; import { hubspotAuth } from '../auth'; import { getDefaultPropertiesForObject, standardObjectPropertiesDropdown } from '../common/props'; import { OBJECT_TYPE } from '../common/constants'; +import { crmObjectOutputSchema } from '../output-schemas'; export const getProductAction = createAction({ auth: hubspotAuth, @@ -14,6 +15,7 @@ export const getProductAction = createAction({ description: 'Gets a product.', audience: 'both', aiMetadata: { description: 'Fetch a single HubSpot product by its product ID, returning its default and any requested additional properties. Read-only and repeatable. Use Find Product when you only know property values rather than the ID.', idempotent: true }, + outputSchema: crmObjectOutputSchema, props: { productId: Property.ShortText({ displayName: 'Product ID', diff --git a/packages/pieces/community/hubspot/src/lib/actions/get-ticket.ts b/packages/pieces/community/hubspot/src/lib/actions/get-ticket.ts index af681c817ec..4b07632684d 100644 --- a/packages/pieces/community/hubspot/src/lib/actions/get-ticket.ts +++ b/packages/pieces/community/hubspot/src/lib/actions/get-ticket.ts @@ -5,6 +5,7 @@ import { MarkdownVariant } from '@activepieces/pieces-framework'; import { getDefaultPropertiesForObject, standardObjectPropertiesDropdown } from '../common/props'; import { OBJECT_TYPE } from '../common/constants'; import { hubspotAuth } from '../auth'; +import { crmObjectOutputSchema } from '../output-schemas'; export const getTicketAction = createAction({ auth: hubspotAuth, @@ -14,6 +15,7 @@ export const getTicketAction = createAction({ description: 'Gets a ticket.', audience: 'both', aiMetadata: { description: 'Fetches a single support ticket by its HubSpot ticket ID, returning default and any requested additional properties. Use when you already have the ticket ID; use Find Ticket to look one up by another property first. Read-only and idempotent.', idempotent: true }, + outputSchema: crmObjectOutputSchema, props: { ticketId: Property.ShortText({ displayName: 'Ticket ID', diff --git a/packages/pieces/community/hubspot/src/lib/actions/remove-associations.ts b/packages/pieces/community/hubspot/src/lib/actions/remove-associations.ts index ccd599f1604..661675967ff 100644 --- a/packages/pieces/community/hubspot/src/lib/actions/remove-associations.ts +++ b/packages/pieces/community/hubspot/src/lib/actions/remove-associations.ts @@ -9,6 +9,7 @@ import { OBJECT_TYPE } from '../common/constants'; import { Client } from '@hubspot/api-client'; import { AssociationSpecAssociationCategoryEnum } from '../common/types'; import { chunk } from '@activepieces/pieces-framework'; +import { removeAssociationsOutputSchema } from '../output-schemas'; export const removeAssociationsAction = createAction({ auth: hubspotAuth, @@ -18,6 +19,7 @@ export const removeAssociationsAction = createAction({ description: 'Removes associations between objects', audience: 'both', aiMetadata: { description: 'Remove the labeled association of a specific type between one source HubSpot object and one or more target objects, batching the targets. Removing an already-absent association is harmless, so it is idempotent on the end state. Use Create Associations to add links.', idempotent: true }, + outputSchema: removeAssociationsOutputSchema, props: { fromObjectId: Property.ShortText({ displayName: 'From Object ID', diff --git a/packages/pieces/community/hubspot/src/lib/actions/update-company.ts b/packages/pieces/community/hubspot/src/lib/actions/update-company.ts index 40cac9d63e7..57267544737 100644 --- a/packages/pieces/community/hubspot/src/lib/actions/update-company.ts +++ b/packages/pieces/community/hubspot/src/lib/actions/update-company.ts @@ -9,6 +9,7 @@ import { import { OBJECT_TYPE } from '../common/constants'; import { MarkdownVariant } from '@activepieces/pieces-framework'; import { Client } from '@hubspot/api-client'; +import { crmObjectOutputSchema } from '../output-schemas'; export const updateCompanyAction = createAction({ auth: hubspotAuth, @@ -18,6 +19,7 @@ export const updateCompanyAction = createAction({ description: 'Updates a company in Hubspot.', audience: 'both', aiMetadata: { description: 'Update properties on an existing HubSpot company identified by Company ID; only the supplied fields are changed. Applying the same field values repeatedly leaves the record in the same state, so it is idempotent. Use Create Company to add a new record, or a find action to obtain the ID first.', idempotent: true }, + outputSchema: crmObjectOutputSchema, props: { companyId: Property.ShortText({ displayName: 'Company ID', diff --git a/packages/pieces/community/hubspot/src/lib/actions/update-contact.ts b/packages/pieces/community/hubspot/src/lib/actions/update-contact.ts index afcc82b0b33..c2f5ca19304 100644 --- a/packages/pieces/community/hubspot/src/lib/actions/update-contact.ts +++ b/packages/pieces/community/hubspot/src/lib/actions/update-contact.ts @@ -9,6 +9,7 @@ import { import { OBJECT_TYPE } from '../common/constants'; import { MarkdownVariant } from '@activepieces/pieces-framework'; import { Client } from '@hubspot/api-client'; +import { crmObjectOutputSchema } from '../output-schemas'; export const updateContactAction = createAction({ auth: hubspotAuth, @@ -18,6 +19,7 @@ export const updateContactAction = createAction({ description: 'Updates a contact in Hubspot.', audience: 'both', aiMetadata: { description: 'Update properties on an existing HubSpot contact identified by Contact ID; only the supplied fields are changed. Applying the same values repeatedly is idempotent. Use a find action to resolve the contact ID first, or a create action to add a new contact.', idempotent: true }, + outputSchema: crmObjectOutputSchema, props: { contactId: Property.ShortText({ displayName: 'Contact ID', diff --git a/packages/pieces/community/hubspot/src/lib/actions/update-custom-object.ts b/packages/pieces/community/hubspot/src/lib/actions/update-custom-object.ts index 188468bf984..b7911e01986 100644 --- a/packages/pieces/community/hubspot/src/lib/actions/update-custom-object.ts +++ b/packages/pieces/community/hubspot/src/lib/actions/update-custom-object.ts @@ -8,6 +8,7 @@ import { } from '../common/props'; import { Client } from '@hubspot/api-client'; +import { crmObjectOutputSchema } from '../output-schemas'; export const updateCustomObjectAction = createAction({ auth: hubspotAuth, @@ -17,6 +18,7 @@ export const updateCustomObjectAction = createAction({ description: 'Updates a custom object in Hubspot.', audience: 'both', aiMetadata: { description: 'Updates properties on an existing custom-object record identified by its custom object type and record ID, then returns the refreshed record. Use to modify a known custom-object record; for standard CRM objects use the dedicated update actions instead. Idempotent: applying the same property values converges to the same record state.', idempotent: true }, + outputSchema: crmObjectOutputSchema, props: { customObjectType: customObjectDropdown, customObjectId: Property.ShortText({ diff --git a/packages/pieces/community/hubspot/src/lib/actions/update-deal.ts b/packages/pieces/community/hubspot/src/lib/actions/update-deal.ts index a3118412b06..1be47f83e6e 100644 --- a/packages/pieces/community/hubspot/src/lib/actions/update-deal.ts +++ b/packages/pieces/community/hubspot/src/lib/actions/update-deal.ts @@ -16,6 +16,7 @@ import { } from '../common/props'; import { Client } from '@hubspot/api-client'; +import { crmObjectOutputSchema } from '../output-schemas'; export const updateDealAction = createAction({ auth: hubspotAuth, @@ -25,6 +26,7 @@ export const updateDealAction = createAction({ description: 'Updates a deal in HubSpot.', audience: 'both', aiMetadata: { description: 'Updates properties on an existing deal identified by its deal ID, such as name, pipeline, stage, or custom fields, then returns the refreshed deal. Use to modify a known deal; use Create Deal to make a new one. Idempotent: applying the same property values converges to the same deal state.', idempotent: true }, + outputSchema: crmObjectOutputSchema, props: { dealId: Property.ShortText({ displayName: 'Deal ID', diff --git a/packages/pieces/community/hubspot/src/lib/actions/update-line-item.ts b/packages/pieces/community/hubspot/src/lib/actions/update-line-item.ts index 7aaf55a19f6..6c8a01b8309 100644 --- a/packages/pieces/community/hubspot/src/lib/actions/update-line-item.ts +++ b/packages/pieces/community/hubspot/src/lib/actions/update-line-item.ts @@ -10,6 +10,7 @@ import { OBJECT_TYPE } from '../common/constants'; import { MarkdownVariant } from '@activepieces/pieces-framework'; import { Client } from '@hubspot/api-client'; +import { crmObjectOutputSchema } from '../output-schemas'; export const updateLineItemAction = createAction({ auth: hubspotAuth, @@ -19,6 +20,7 @@ export const updateLineItemAction = createAction({ description: 'Updates a line item in Hubspot.', audience: 'both', aiMetadata: { description: 'Update properties (product, quantity, price, etc.) on an existing HubSpot line item identified by Line Item ID; only supplied fields change. Applying the same values repeatedly is idempotent. Use a find action to obtain the line item ID first.', idempotent: true }, + outputSchema: crmObjectOutputSchema, props: { lineItemId: Property.ShortText({ displayName: 'Line Item ID', diff --git a/packages/pieces/community/hubspot/src/lib/actions/update-product.ts b/packages/pieces/community/hubspot/src/lib/actions/update-product.ts index 2b0b4642e2e..b8d43c90045 100644 --- a/packages/pieces/community/hubspot/src/lib/actions/update-product.ts +++ b/packages/pieces/community/hubspot/src/lib/actions/update-product.ts @@ -9,6 +9,7 @@ import { import { OBJECT_TYPE } from '../common/constants'; import { MarkdownVariant } from '@activepieces/pieces-framework'; import { Client } from '@hubspot/api-client'; +import { crmObjectOutputSchema } from '../output-schemas'; export const updateProductAction = createAction({ auth: hubspotAuth, @@ -18,6 +19,7 @@ export const updateProductAction = createAction({ description: 'Updates a product in Hubspot.', audience: 'both', aiMetadata: { description: 'Updates properties on an existing product identified by its product ID, such as name, price, description, or tax, then returns the refreshed product. Use to modify a known product in the product library. Idempotent: applying the same property values converges to the same product state.', idempotent: true }, + outputSchema: crmObjectOutputSchema, props: { productId:Property.ShortText({ displayName:'Product ID', diff --git a/packages/pieces/community/hubspot/src/lib/actions/update-ticket.ts b/packages/pieces/community/hubspot/src/lib/actions/update-ticket.ts index f38dc5f9184..a96dd2731b1 100644 --- a/packages/pieces/community/hubspot/src/lib/actions/update-ticket.ts +++ b/packages/pieces/community/hubspot/src/lib/actions/update-ticket.ts @@ -5,6 +5,7 @@ import { MarkdownVariant } from '@activepieces/pieces-framework'; import { hubspotAuth } from '../auth'; import { getDefaultPropertiesForObject, pipelineDropdown, pipelineStageDropdown, standardObjectDynamicProperties, standardObjectPropertiesDropdown } from '../common/props'; import { OBJECT_TYPE } from '../common/constants'; +import { crmObjectOutputSchema } from '../output-schemas'; export const updateTicketAction = createAction({ auth: hubspotAuth, @@ -14,6 +15,7 @@ export const updateTicketAction = createAction({ description: 'Updates a ticket in HubSpot.', audience: 'both', aiMetadata: { description: 'Updates properties on an existing support ticket identified by its ticket ID, such as subject, pipeline, stage, or custom fields, then returns the refreshed ticket. Use to modify a known ticket. Idempotent: applying the same property values converges to the same ticket state.', idempotent: true }, + outputSchema: crmObjectOutputSchema, props: { ticketId: Property.ShortText({ displayName: 'Ticket ID', diff --git a/packages/pieces/community/hubspot/src/lib/actions/upload-file.ts b/packages/pieces/community/hubspot/src/lib/actions/upload-file.ts index 1bcf2feeb39..b6713f7c3c9 100644 --- a/packages/pieces/community/hubspot/src/lib/actions/upload-file.ts +++ b/packages/pieces/community/hubspot/src/lib/actions/upload-file.ts @@ -6,6 +6,7 @@ import { Property, } from '@activepieces/pieces-framework'; import { Client } from '@hubspot/api-client'; +import { uploadFileOutputSchema } from '../output-schemas'; export const uploadFileAction = createAction({ auth: hubspotAuth, @@ -15,6 +16,7 @@ export const uploadFileAction = createAction({ description: 'Uploads a file to HubSpot File Manager.', audience: 'both', aiMetadata: { description: 'Upload a file into a chosen folder in the HubSpot File Manager with a given name and access level. Each call uploads a new file rather than replacing an existing one, so it is not idempotent.', idempotent: false }, + outputSchema: uploadFileOutputSchema, props: { folderId: Property.Dropdown({ auth: hubspotAuth, diff --git a/packages/pieces/community/hubspot/src/lib/output-schemas.ts b/packages/pieces/community/hubspot/src/lib/output-schemas.ts new file mode 100644 index 00000000000..63b92a1f7ae --- /dev/null +++ b/packages/pieces/community/hubspot/src/lib/output-schemas.ts @@ -0,0 +1,307 @@ +import { OutputSchema, OutputSchemaField } from '@activepieces/pieces-framework'; + +const crmObjectFields: OutputSchemaField[] = [ + { key: 'id', label: 'Record ID' }, + { + key: 'properties', + label: 'Properties', + dynamicKey: true, + description: 'Requested properties, keyed by their HubSpot internal names.', + }, + { key: 'createdAt', label: 'Created At', format: 'datetime' }, + { key: 'updatedAt', label: 'Updated At', format: 'datetime' }, + { key: 'archived', label: 'Archived', format: 'boolean' }, + { key: 'archivedAt', label: 'Archived At', format: 'datetime' }, +]; + +const pagingFields: OutputSchemaField[] = [ + { + key: 'next', + label: 'Next Page', + children: [ + { key: 'after', label: 'After Cursor' }, + { key: 'link', label: 'Link', format: 'url' }, + ], + }, +]; + +function crmSearchFields({ + itemsLabel, + labelKey, +}: { + itemsLabel: string; + labelKey: string; +}): OutputSchemaField[] { + return [ + { key: 'total', label: 'Total Matches', format: 'number' }, + { key: 'results', label: itemsLabel, labelKey, listItems: crmObjectFields }, + { key: 'paging', label: 'Paging', children: pagingFields }, + ]; +} + +export const crmObjectOutputSchema: OutputSchema = { fields: crmObjectFields }; + +export const contactSearchOutputSchema: OutputSchema = { + fields: crmSearchFields({ itemsLabel: 'Contacts', labelKey: 'properties.email' }), +}; + +export const companySearchOutputSchema: OutputSchema = { + fields: crmSearchFields({ itemsLabel: 'Companies', labelKey: 'properties.name' }), +}; + +export const dealSearchOutputSchema: OutputSchema = { + fields: crmSearchFields({ itemsLabel: 'Deals', labelKey: 'properties.dealname' }), +}; + +export const ticketSearchOutputSchema: OutputSchema = { + fields: crmSearchFields({ itemsLabel: 'Tickets', labelKey: 'properties.subject' }), +}; + +export const productSearchOutputSchema: OutputSchema = { + fields: crmSearchFields({ itemsLabel: 'Products', labelKey: 'properties.name' }), +}; + +export const lineItemSearchOutputSchema: OutputSchema = { + fields: crmSearchFields({ itemsLabel: 'Line Items', labelKey: 'properties.name' }), +}; + +const ownerFields: OutputSchema['fields'] = [ + { key: 'id', label: 'Owner ID' }, + { key: 'email', label: 'Email', format: 'email' }, + { key: 'firstName', label: 'First Name' }, + { key: 'lastName', label: 'Last Name' }, + { key: 'type', label: 'Type' }, + { key: 'userId', label: 'User ID' }, + { key: 'userIdIncludingInactive', label: 'User ID (Including Inactive)' }, + { key: 'createdAt', label: 'Created At', format: 'datetime' }, + { key: 'updatedAt', label: 'Updated At', format: 'datetime' }, + { key: 'archived', label: 'Archived', format: 'boolean' }, +]; + +export const getOwnerByIdOutputSchema: OutputSchema = { fields: ownerFields }; + +export const getOwnerByEmailOutputSchema: OutputSchema = { + fields: [{ key: 'results', label: 'Owners', labelKey: 'email', listItems: ownerFields }], +}; + +export const pipelineStageDetailsOutputSchema: OutputSchema = { + fields: [ + { key: 'id', label: 'Stage ID' }, + { key: 'label', label: 'Label' }, + { key: 'displayOrder', label: 'Display Order', format: 'number' }, + { key: 'writePermissions', label: 'Write Permissions' }, + { + key: 'metadata', + label: 'Metadata', + dynamicKey: true, + description: 'Stage settings, keyed by name; varies between deal and ticket pipelines.', + }, + { key: 'createdAt', label: 'Created At', format: 'datetime' }, + { key: 'updatedAt', label: 'Updated At', format: 'datetime' }, + { key: 'archived', label: 'Archived', format: 'boolean' }, + ], +}; + +const pageFields: OutputSchema['fields'] = [ + { key: 'id', label: 'Page ID' }, + { key: 'name', label: 'Internal Page Name' }, + { key: 'htmlTitle', label: 'Page Title' }, + { key: 'slug', label: 'Slug' }, + { key: 'url', label: 'URL', format: 'url' }, + { key: 'domain', label: 'Domain' }, + { key: 'state', label: 'State' }, + { key: 'published', label: 'Published', format: 'boolean' }, + { key: 'templatePath', label: 'Template Path' }, + { key: 'language', label: 'Language' }, + { key: 'authorName', label: 'Author Name' }, + { key: 'createdAt', label: 'Created At', format: 'datetime' }, + { key: 'updatedAt', label: 'Updated At', format: 'datetime' }, + { key: 'archivedAt', label: 'Archived At', format: 'datetime' }, +]; + +export const pageOutputSchema: OutputSchema = { fields: pageFields }; + +const associationBatchResultFields: OutputSchema['fields'] = [ + { key: 'fromObjectId', label: 'From Object ID' }, + { key: 'fromObjectTypeId', label: 'From Object Type ID' }, + { key: 'toObjectId', label: 'To Object ID' }, + { key: 'toObjectTypeId', label: 'To Object Type ID' }, + { key: 'labels', label: 'Labels' }, +]; + +export const createAssociationsOutputSchema: OutputSchema = { + fields: [ + { key: 'totalAssociations', label: 'Total Associations', format: 'number' }, + { key: 'batchCount', label: 'Batch Count', format: 'number' }, + { + key: 'responses', + label: 'Batch Responses', + listItems: [ + { key: 'status', label: 'Status' }, + { key: 'startedAt', label: 'Started At', format: 'datetime' }, + { key: 'completedAt', label: 'Completed At', format: 'datetime' }, + { key: 'results', label: 'Results', listItems: associationBatchResultFields }, + ], + }, + ], +}; + +export const removeAssociationsOutputSchema: OutputSchema = { + fields: [ + { key: 'success', label: 'Success', format: 'boolean' }, + { key: 'totalAssociations', label: 'Total Associations', format: 'number' }, + { key: 'batchCount', label: 'Batch Count', format: 'number' }, + { + key: 'responses', + label: 'Batch Responses', + description: 'One entry per batch; HubSpot returns no content per batch on success.', + }, + ], +}; + +export const findAssociationsOutputSchema: OutputSchema = { + itemLabel: 'To Object {toObjectId}', + fields: [ + { + key: 'associations', + label: 'Associations', + value: '', + listItems: [ + { key: 'toObjectId', label: 'To Object ID' }, + { + key: 'associationTypes', + label: 'Association Types', + listItems: [ + { key: 'typeId', label: 'Type ID', format: 'number' }, + { key: 'label', label: 'Label' }, + { key: 'category', label: 'Category' }, + ], + }, + ], + }, + ], +}; + +export const newContactInListTriggerOutputSchema: OutputSchema = { + fields: [...crmObjectFields, { key: 'membershipTimestamp', label: 'Added to List At', format: 'datetime' }], +}; + +export const newFormSubmissionTriggerOutputSchema: OutputSchema = { + fields: [ + { key: 'conversionId', label: 'Conversion ID' }, + { key: 'submittedAt', label: 'Submitted At', format: 'datetime' }, + { + key: 'values', + label: 'Submitted Values', + dynamicKey: true, + description: 'Field values, keyed by the form field label.', + }, + { key: 'pageUrl', label: 'Page URL', format: 'url' }, + ], +}; + +export const newEmailSubscriptionsTimelineTriggerOutputSchema: OutputSchema = { + fields: [ + { key: 'timestamp', label: 'Timestamp', format: 'datetime' }, + { key: 'recipient', label: 'Recipient', format: 'email' }, + { key: 'normalizedEmailId', label: 'Normalized Email ID' }, + { key: 'portalId', label: 'Portal ID', format: 'number' }, + { + key: 'changes', + label: 'Changes', + listItems: [ + { key: 'timestamp', label: 'Timestamp', format: 'datetime' }, + { key: 'subscriptionId', label: 'Subscription ID', format: 'number' }, + { key: 'changeType', label: 'Change Type' }, + { key: 'change', label: 'Change' }, + { key: 'source', label: 'Source' }, + { key: 'portalId', label: 'Portal ID', format: 'number' }, + { + key: 'causedByEvent', + label: 'Caused By Event', + children: [ + { key: 'id', label: 'Event ID' }, + { key: 'created', label: 'Created At', format: 'datetime' }, + ], + }, + ], + }, + ], +}; + +export const createBlogPostOutputSchema: OutputSchema = { + fields: [ + { key: 'id', label: 'Post ID' }, + { key: 'name', label: 'Name' }, + { key: 'title', label: 'Title' }, + { key: 'slug', label: 'Slug' }, + { key: 'url', label: 'URL', format: 'url' }, + { key: 'absolute_url', label: 'Absolute URL', format: 'url' }, + { key: 'state', label: 'State' }, + { key: 'currently_published', label: 'Currently Published', format: 'boolean' }, + { key: 'content_group_id', label: 'Blog ID' }, + { key: 'blog_author_id', label: 'Author ID' }, + { key: 'author_name', label: 'Author Name' }, + { key: 'meta_description', label: 'Meta Description' }, + { key: 'post_body', label: 'Body', format: 'html' }, + { key: 'featured_image', label: 'Featured Image', format: 'image' }, + { key: 'created', label: 'Created At', format: 'datetime' }, + { key: 'updated', label: 'Updated At', format: 'datetime' }, + { key: 'publish_date', label: 'Publish Date', format: 'datetime' }, + ], +}; + +export const newBlogArticleTriggerOutputSchema: OutputSchema = { + fields: [ + { key: 'id', label: 'Post ID' }, + { key: 'name', label: 'Name' }, + { key: 'htmlTitle', label: 'Title' }, + { key: 'slug', label: 'Slug' }, + { key: 'url', label: 'URL', format: 'url' }, + { key: 'state', label: 'State' }, + { key: 'currentState', label: 'Current State' }, + { key: 'currentlyPublished', label: 'Currently Published', format: 'boolean' }, + { key: 'contentGroupId', label: 'Blog ID' }, + { key: 'blogAuthorId', label: 'Author ID' }, + { key: 'authorName', label: 'Author Name' }, + { key: 'metaDescription', label: 'Meta Description' }, + { key: 'postBody', label: 'Body', format: 'html' }, + { key: 'featuredImage', label: 'Featured Image', format: 'image' }, + { key: 'created', label: 'Created At', format: 'datetime' }, + { key: 'updated', label: 'Updated At', format: 'datetime' }, + { key: 'publishDate', label: 'Publish Date', format: 'datetime' }, + { key: 'publishedAt', label: 'Published At', format: 'datetime' }, + ], +}; + +export const customObjectSearchOutputSchema: OutputSchema = { + fields: [ + { key: 'total', label: 'Total Matches', format: 'number' }, + { + key: 'results', + label: 'Records', + listItems: crmObjectFields, + description: 'No labelKey is set: which property best labels a record varies per custom object type.', + }, + { key: 'paging', label: 'Paging', children: pagingFields }, + ], +}; + +export const uploadFileOutputSchema: OutputSchema = { + fields: [ + { key: 'id', label: 'File ID' }, + { key: 'name', label: 'Name' }, + { key: 'path', label: 'Path' }, + { key: 'parentFolderId', label: 'Parent Folder ID' }, + { key: 'size', label: 'Size', format: 'filesize' }, + { key: 'type', label: 'Type' }, + { key: 'extension', label: 'Extension' }, + { key: 'url', label: 'URL', format: 'url' }, + { key: 'defaultHostingUrl', label: 'Default Hosting URL', format: 'url' }, + { key: 'access', label: 'Access Level' }, + { key: 'isUsableInContent', label: 'Usable In Content', format: 'boolean' }, + { key: 'createdAt', label: 'Created At', format: 'datetime' }, + { key: 'updatedAt', label: 'Updated At', format: 'datetime' }, + { key: 'archived', label: 'Archived', format: 'boolean' }, + ], +}; diff --git a/packages/pieces/community/hubspot/src/lib/triggers/deal-stage-updated.ts b/packages/pieces/community/hubspot/src/lib/triggers/deal-stage-updated.ts index d46e6bebc3d..0d5e602e9e8 100644 --- a/packages/pieces/community/hubspot/src/lib/triggers/deal-stage-updated.ts +++ b/packages/pieces/community/hubspot/src/lib/triggers/deal-stage-updated.ts @@ -30,6 +30,7 @@ type Props = { }; import { AppConnectionValueForAuthProperty } from '@activepieces/pieces-framework'; +import { crmObjectOutputSchema } from '../output-schemas'; const polling: Polling, Props> = { strategy: DedupeStrategy.TIMEBASED, async items({ auth, propsValue, lastFetchEpochMS }) { @@ -129,6 +130,7 @@ export const dealStageUpdatedTrigger = createTrigger({ required: false, }), }, + outputSchema: crmObjectOutputSchema, type: TriggerStrategy.POLLING, async onEnable(context) { await pollingHelper.onEnable(polling, context); diff --git a/packages/pieces/community/hubspot/src/lib/triggers/email-subscriptions-timeline.ts b/packages/pieces/community/hubspot/src/lib/triggers/email-subscriptions-timeline.ts index 9d78e1b7916..b8c24514ebf 100644 --- a/packages/pieces/community/hubspot/src/lib/triggers/email-subscriptions-timeline.ts +++ b/packages/pieces/community/hubspot/src/lib/triggers/email-subscriptions-timeline.ts @@ -14,6 +14,7 @@ import { PiecePropValueSchema, TriggerStrategy, } from '@activepieces/pieces-framework'; +import { newEmailSubscriptionsTimelineTriggerOutputSchema } from '../output-schemas'; type SubscriptionTimeLineResponse = { hasMore: boolean; @@ -65,6 +66,7 @@ export const newEmailSubscriptionsTimelineTrigger = createTrigger({ description: 'Fires when a new email-subscription timeline event is recorded for the HubSpot portal. Each event represents one subscription change (such as a bounce, unsubscribe, or opt-in) for a recipient, including the change type, source, and the underlying event that caused it. Polls the portal-wide email subscription timeline by timestamp.', }, + outputSchema: newEmailSubscriptionsTimelineTriggerOutputSchema, type: TriggerStrategy.POLLING, props: {}, async onEnable(context) { diff --git a/packages/pieces/community/hubspot/src/lib/triggers/new-blog-article.ts b/packages/pieces/community/hubspot/src/lib/triggers/new-blog-article.ts index b8ec5703d69..129f271d71d 100644 --- a/packages/pieces/community/hubspot/src/lib/triggers/new-blog-article.ts +++ b/packages/pieces/community/hubspot/src/lib/triggers/new-blog-article.ts @@ -15,6 +15,7 @@ import { TriggerStrategy, } from '@activepieces/pieces-framework'; import dayjs from 'dayjs'; +import { newBlogArticleTriggerOutputSchema } from '../output-schemas'; type Props = { articleState: string; @@ -91,6 +92,7 @@ export const newBlogArticleTrigger = createTrigger({ description: 'Fires when a blog post is added to your HubSpot COS (CMS) blog. The configured article state (Published only, Draft only, or Both) determines which posts qualify; published posts are tracked by publish date and drafts by creation date. Each event represents one blog post with its full CMS metadata.', }, + outputSchema: newBlogArticleTriggerOutputSchema, type: TriggerStrategy.POLLING, props: { articleState: Property.StaticDropdown({ diff --git a/packages/pieces/community/hubspot/src/lib/triggers/new-company-property-change.ts b/packages/pieces/community/hubspot/src/lib/triggers/new-company-property-change.ts index b88f38dafe6..0819917d5f9 100644 --- a/packages/pieces/community/hubspot/src/lib/triggers/new-company-property-change.ts +++ b/packages/pieces/community/hubspot/src/lib/triggers/new-company-property-change.ts @@ -13,6 +13,7 @@ import { chunk } from '@activepieces/pieces-framework'; import { Client } from '@hubspot/api-client'; import dayjs from 'dayjs'; import { FilterOperatorEnum } from '../common/types'; +import { crmObjectOutputSchema } from '../output-schemas'; type Props = { propertyName?: string | string[]; @@ -143,6 +144,7 @@ export const newCompanyPropertyChangeTrigger = createTrigger({ true, ), }, + outputSchema: crmObjectOutputSchema, type: TriggerStrategy.POLLING, async onEnable(context) { await pollingHelper.onEnable(polling, context); diff --git a/packages/pieces/community/hubspot/src/lib/triggers/new-company.ts b/packages/pieces/community/hubspot/src/lib/triggers/new-company.ts index 6518b941b4d..30e1a82d8e5 100644 --- a/packages/pieces/community/hubspot/src/lib/triggers/new-company.ts +++ b/packages/pieces/community/hubspot/src/lib/triggers/new-company.ts @@ -16,6 +16,7 @@ type Props = { }; import { AppConnectionValueForAuthProperty } from '@activepieces/pieces-framework'; +import { crmObjectOutputSchema } from '../output-schemas'; const polling: Polling, Props> = { strategy: DedupeStrategy.TIMEBASED, async items({ auth, propsValue, lastFetchEpochMS }) { @@ -94,6 +95,7 @@ export const newCompanyTrigger = createTrigger({ required: false, }), }, + outputSchema: crmObjectOutputSchema, type: TriggerStrategy.POLLING, async onEnable(context) { await pollingHelper.onEnable(polling, context); diff --git a/packages/pieces/community/hubspot/src/lib/triggers/new-contact-in-list.ts b/packages/pieces/community/hubspot/src/lib/triggers/new-contact-in-list.ts index 1c299b3db34..51c126b43a2 100644 --- a/packages/pieces/community/hubspot/src/lib/triggers/new-contact-in-list.ts +++ b/packages/pieces/community/hubspot/src/lib/triggers/new-contact-in-list.ts @@ -12,6 +12,7 @@ import { MarkdownVariant } from '@activepieces/pieces-framework'; import { getDefaultPropertiesForObject, standardObjectPropertiesDropdown } from '../common/props'; import { OBJECT_TYPE } from '../common/constants'; import dayjs from 'dayjs'; +import { newContactInListTriggerOutputSchema } from '../output-schemas'; type Props = { listId: string; @@ -95,6 +96,7 @@ export const newContactInListTrigger = createTrigger({ description: 'Fires when a contact is added to the selected HubSpot contact list. Each event represents one contact whose membership was added since the last poll, enriched with the contact record properties (name, email, etc.) plus the timestamp it joined the list. Tracked by list-membership date.', }, + outputSchema: newContactInListTriggerOutputSchema, type: TriggerStrategy.POLLING, props: { listId: Property.Dropdown({ diff --git a/packages/pieces/community/hubspot/src/lib/triggers/new-contact-property-change.ts b/packages/pieces/community/hubspot/src/lib/triggers/new-contact-property-change.ts index 65d62c11fed..c6159c23362 100644 --- a/packages/pieces/community/hubspot/src/lib/triggers/new-contact-property-change.ts +++ b/packages/pieces/community/hubspot/src/lib/triggers/new-contact-property-change.ts @@ -19,6 +19,7 @@ type Props = { }; import { AppConnectionValueForAuthProperty } from '@activepieces/pieces-framework'; +import { crmObjectOutputSchema } from '../output-schemas'; const polling: Polling, Props> = { strategy: DedupeStrategy.TIMEBASED, async items({ auth, propsValue, lastFetchEpochMS }) { @@ -145,6 +146,7 @@ export const newContactPropertyChangeTrigger = createTrigger({ true, ), }, + outputSchema: crmObjectOutputSchema, type: TriggerStrategy.POLLING, async onEnable(context) { await pollingHelper.onEnable(polling, context); diff --git a/packages/pieces/community/hubspot/src/lib/triggers/new-contact.ts b/packages/pieces/community/hubspot/src/lib/triggers/new-contact.ts index 2478622e07a..9bc9a2bd580 100644 --- a/packages/pieces/community/hubspot/src/lib/triggers/new-contact.ts +++ b/packages/pieces/community/hubspot/src/lib/triggers/new-contact.ts @@ -10,6 +10,7 @@ import { OBJECT_TYPE, MAX_SEARCH_PAGE_SIZE, MAX_SEARCH_TOTAL_RESULTS } from '../ import { hubspotAuth } from '../auth'; import { Client } from '@hubspot/api-client'; import { FilterOperatorEnum } from '../common/types'; +import { crmObjectOutputSchema } from '../output-schemas'; type Props = { additionalPropertiesToRetrieve?: string | string[]; @@ -96,6 +97,7 @@ export const newContactTrigger = createTrigger({ required: false, }), }, + outputSchema: crmObjectOutputSchema, type: TriggerStrategy.POLLING, async onEnable(context) { await pollingHelper.onEnable(polling, context); diff --git a/packages/pieces/community/hubspot/src/lib/triggers/new-custom-object-property-change.ts b/packages/pieces/community/hubspot/src/lib/triggers/new-custom-object-property-change.ts index c4f42db6a11..7525e3f46f6 100644 --- a/packages/pieces/community/hubspot/src/lib/triggers/new-custom-object-property-change.ts +++ b/packages/pieces/community/hubspot/src/lib/triggers/new-custom-object-property-change.ts @@ -17,6 +17,7 @@ import { Client } from '@hubspot/api-client'; import dayjs from 'dayjs'; import { FilterOperatorEnum } from '../common/types'; import { MAX_SEARCH_PAGE_SIZE, MAX_SEARCH_TOTAL_RESULTS } from '../common/constants'; +import { crmObjectOutputSchema } from '../output-schemas'; type Props = { customObjectType?: string; @@ -143,6 +144,7 @@ export const newCustomObjectPropertyChangeTrigger = createTrigger({ customObjectType: customObjectDropdown, propertyName: customObjectPropertiesDropdown('Property Name', true, true), }, + outputSchema: crmObjectOutputSchema, type: TriggerStrategy.POLLING, async onEnable(context) { await pollingHelper.onEnable(polling, context); diff --git a/packages/pieces/community/hubspot/src/lib/triggers/new-custom-object.ts b/packages/pieces/community/hubspot/src/lib/triggers/new-custom-object.ts index 4875b890ae3..c28efaefced 100644 --- a/packages/pieces/community/hubspot/src/lib/triggers/new-custom-object.ts +++ b/packages/pieces/community/hubspot/src/lib/triggers/new-custom-object.ts @@ -14,6 +14,7 @@ import { Client } from '@hubspot/api-client'; import { FilterOperatorEnum } from '../common/types'; import { MAX_SEARCH_PAGE_SIZE, MAX_SEARCH_TOTAL_RESULTS } from '../common/constants'; import dayjs from 'dayjs'; +import { crmObjectOutputSchema } from '../output-schemas'; type Props = { customObjectType?: string; @@ -112,6 +113,7 @@ export const newCustomObjectTrigger = createTrigger({ false, ), }, + outputSchema: crmObjectOutputSchema, type: TriggerStrategy.POLLING, async onEnable(context) { await pollingHelper.onEnable(polling, context); diff --git a/packages/pieces/community/hubspot/src/lib/triggers/new-deal-property-change.ts b/packages/pieces/community/hubspot/src/lib/triggers/new-deal-property-change.ts index 94f3b7cbf1b..85cf21a3f8e 100644 --- a/packages/pieces/community/hubspot/src/lib/triggers/new-deal-property-change.ts +++ b/packages/pieces/community/hubspot/src/lib/triggers/new-deal-property-change.ts @@ -19,6 +19,7 @@ type Props = { }; import { AppConnectionValueForAuthProperty } from '@activepieces/pieces-framework'; +import { crmObjectOutputSchema } from '../output-schemas'; const polling: Polling, Props> = { strategy: DedupeStrategy.TIMEBASED, async items({ auth, propsValue, lastFetchEpochMS }) { @@ -144,6 +145,7 @@ export const newDealPropertyChangeTrigger = createTrigger({ true, ), }, + outputSchema: crmObjectOutputSchema, type: TriggerStrategy.POLLING, async onEnable(context) { await pollingHelper.onEnable(polling, context); diff --git a/packages/pieces/community/hubspot/src/lib/triggers/new-deal.ts b/packages/pieces/community/hubspot/src/lib/triggers/new-deal.ts index 60a451ae1c5..18ee4639675 100644 --- a/packages/pieces/community/hubspot/src/lib/triggers/new-deal.ts +++ b/packages/pieces/community/hubspot/src/lib/triggers/new-deal.ts @@ -16,6 +16,7 @@ type Props = { }; import { AppConnectionValueForAuthProperty } from '@activepieces/pieces-framework'; +import { crmObjectOutputSchema } from '../output-schemas'; const polling: Polling, Props> = { strategy: DedupeStrategy.TIMEBASED, async items({ auth, propsValue, lastFetchEpochMS }) { @@ -96,6 +97,7 @@ export const newDealTrigger = createTrigger({ required: false, }), }, + outputSchema: crmObjectOutputSchema, type: TriggerStrategy.POLLING, async onEnable(context) { await pollingHelper.onEnable(polling, context); diff --git a/packages/pieces/community/hubspot/src/lib/triggers/new-form-submission.ts b/packages/pieces/community/hubspot/src/lib/triggers/new-form-submission.ts index 8eb91c0236a..61848239b65 100644 --- a/packages/pieces/community/hubspot/src/lib/triggers/new-form-submission.ts +++ b/packages/pieces/community/hubspot/src/lib/triggers/new-form-submission.ts @@ -15,6 +15,7 @@ import { Property, } from '@activepieces/pieces-framework'; import { formDropdown } from '../common/props'; +import { newFormSubmissionTriggerOutputSchema } from '../output-schemas'; type Props = { formId: string; @@ -131,6 +132,7 @@ export const newFormSubmissionTrigger = createTrigger({ description: 'Fires when the selected HubSpot form receives a submission. Each event represents one submission, with field values mapped to their human-readable form labels plus metadata such as submission timestamp, conversion ID, and page URL. Polls the form-integrations submissions API.', }, + outputSchema: newFormSubmissionTriggerOutputSchema, type: TriggerStrategy.POLLING, props: { formId: formDropdown, diff --git a/packages/pieces/community/hubspot/src/lib/triggers/new-line-item.ts b/packages/pieces/community/hubspot/src/lib/triggers/new-line-item.ts index c38fe36b6d5..af8a02a12b1 100644 --- a/packages/pieces/community/hubspot/src/lib/triggers/new-line-item.ts +++ b/packages/pieces/community/hubspot/src/lib/triggers/new-line-item.ts @@ -19,6 +19,7 @@ type Props = { }; import { AppConnectionValueForAuthProperty } from '@activepieces/pieces-framework'; +import { crmObjectOutputSchema } from '../output-schemas'; const polling: Polling, Props> = { strategy: DedupeStrategy.TIMEBASED, async items({ auth, propsValue, lastFetchEpochMS }) { @@ -100,6 +101,7 @@ export const newLineItemTrigger = createTrigger({ required: false, }), }, + outputSchema: crmObjectOutputSchema, type: TriggerStrategy.POLLING, async onEnable(context) { await pollingHelper.onEnable(polling, context); diff --git a/packages/pieces/community/hubspot/src/lib/triggers/new-or-updated-company.ts b/packages/pieces/community/hubspot/src/lib/triggers/new-or-updated-company.ts index d9b37184d3d..185be052de7 100644 --- a/packages/pieces/community/hubspot/src/lib/triggers/new-or-updated-company.ts +++ b/packages/pieces/community/hubspot/src/lib/triggers/new-or-updated-company.ts @@ -15,6 +15,7 @@ import { FilterOperatorEnum } from '../common/types'; import dayjs from 'dayjs'; import { AppConnectionValueForAuthProperty } from '@activepieces/pieces-framework'; +import { crmObjectOutputSchema } from '../output-schemas'; const polling: Polling,{ additionalPropertiesToRetrieve?: string[] | string }> = { strategy: DedupeStrategy.TIMEBASED, async items({ auth, propsValue, lastFetchEpochMS }) { @@ -96,6 +97,7 @@ export const newOrUpdatedCompanyTrigger = createTrigger({ required: false, }), }, + outputSchema: crmObjectOutputSchema, type: TriggerStrategy.POLLING, async onEnable(context) { await pollingHelper.onEnable(polling, context); diff --git a/packages/pieces/community/hubspot/src/lib/triggers/new-or-updated-contact.ts b/packages/pieces/community/hubspot/src/lib/triggers/new-or-updated-contact.ts index ce7683bb724..1e3c6b8eaa4 100644 --- a/packages/pieces/community/hubspot/src/lib/triggers/new-or-updated-contact.ts +++ b/packages/pieces/community/hubspot/src/lib/triggers/new-or-updated-contact.ts @@ -15,6 +15,7 @@ import { FilterOperatorEnum } from '../common/types'; import dayjs from 'dayjs'; import { AppConnectionValueForAuthProperty } from '@activepieces/pieces-framework'; +import { crmObjectOutputSchema } from '../output-schemas'; const polling: Polling,{ additionalPropertiesToRetrieve?: string[] | string }> = { strategy: DedupeStrategy.TIMEBASED, async items({ auth, propsValue, lastFetchEpochMS }) { @@ -96,6 +97,7 @@ export const newOrUpdatedContactTrigger = createTrigger({ required: false, }), }, + outputSchema: crmObjectOutputSchema, type: TriggerStrategy.POLLING, async onEnable(context) { await pollingHelper.onEnable(polling, context); diff --git a/packages/pieces/community/hubspot/src/lib/triggers/new-or-updated-line-item.ts b/packages/pieces/community/hubspot/src/lib/triggers/new-or-updated-line-item.ts index 34c46142c6c..3aa2744d7d0 100644 --- a/packages/pieces/community/hubspot/src/lib/triggers/new-or-updated-line-item.ts +++ b/packages/pieces/community/hubspot/src/lib/triggers/new-or-updated-line-item.ts @@ -15,6 +15,7 @@ import { FilterOperatorEnum } from '../common/types'; import dayjs from 'dayjs'; import { AppConnectionValueForAuthProperty } from '@activepieces/pieces-framework'; +import { crmObjectOutputSchema } from '../output-schemas'; const polling: Polling,{ additionalPropertiesToRetrieve?: string[] | string }> = { strategy: DedupeStrategy.TIMEBASED, async items({ auth, propsValue, lastFetchEpochMS }) { @@ -96,6 +97,7 @@ export const newOrUpdatedLineItemTrigger = createTrigger({ required: false, }), }, + outputSchema: crmObjectOutputSchema, type: TriggerStrategy.POLLING, async onEnable(context) { await pollingHelper.onEnable(polling, context); diff --git a/packages/pieces/community/hubspot/src/lib/triggers/new-or-updated-product.ts b/packages/pieces/community/hubspot/src/lib/triggers/new-or-updated-product.ts index 1d189def441..fe17f4426b9 100644 --- a/packages/pieces/community/hubspot/src/lib/triggers/new-or-updated-product.ts +++ b/packages/pieces/community/hubspot/src/lib/triggers/new-or-updated-product.ts @@ -15,6 +15,7 @@ import { FilterOperatorEnum } from '../common/types'; import dayjs from 'dayjs'; import { AppConnectionValueForAuthProperty } from '@activepieces/pieces-framework'; +import { crmObjectOutputSchema } from '../output-schemas'; const polling: Polling,{ additionalPropertiesToRetrieve?: string[] | string }> = { strategy: DedupeStrategy.TIMEBASED, async items({ auth, propsValue, lastFetchEpochMS }) { @@ -96,6 +97,7 @@ export const newOrUpdatedProductTrigger = createTrigger({ required: false, }), }, + outputSchema: crmObjectOutputSchema, type: TriggerStrategy.POLLING, async onEnable(context) { await pollingHelper.onEnable(polling, context); diff --git a/packages/pieces/community/hubspot/src/lib/triggers/new-product.ts b/packages/pieces/community/hubspot/src/lib/triggers/new-product.ts index b82f5458c7b..10ed94914c7 100644 --- a/packages/pieces/community/hubspot/src/lib/triggers/new-product.ts +++ b/packages/pieces/community/hubspot/src/lib/triggers/new-product.ts @@ -19,6 +19,7 @@ type Props = { }; import { AppConnectionValueForAuthProperty } from '@activepieces/pieces-framework'; +import { crmObjectOutputSchema } from '../output-schemas'; const polling: Polling, Props> = { strategy: DedupeStrategy.TIMEBASED, async items({ auth, propsValue, lastFetchEpochMS }) { @@ -100,6 +101,7 @@ export const newProductTrigger = createTrigger({ required: false, }), }, + outputSchema: crmObjectOutputSchema, type: TriggerStrategy.POLLING, async onEnable(context) { await pollingHelper.onEnable(polling, context); diff --git a/packages/pieces/community/hubspot/src/lib/triggers/new-task.ts b/packages/pieces/community/hubspot/src/lib/triggers/new-task.ts index acf7eca2ce8..3da18a72929 100644 --- a/packages/pieces/community/hubspot/src/lib/triggers/new-task.ts +++ b/packages/pieces/community/hubspot/src/lib/triggers/new-task.ts @@ -16,6 +16,7 @@ type Props = { }; import { AppConnectionValueForAuthProperty } from '@activepieces/pieces-framework'; +import { crmObjectOutputSchema } from '../output-schemas'; const polling: Polling, Props> = { strategy: DedupeStrategy.TIMEBASED, async items({ auth, propsValue, lastFetchEpochMS }) { @@ -96,6 +97,7 @@ export const newTaskTrigger = createTrigger({ required: false, }), }, + outputSchema: crmObjectOutputSchema, type: TriggerStrategy.POLLING, async onEnable(context) { await pollingHelper.onEnable(polling, context); diff --git a/packages/pieces/community/hubspot/src/lib/triggers/new-ticket-property-change.ts b/packages/pieces/community/hubspot/src/lib/triggers/new-ticket-property-change.ts index b5fbcb6274e..00f082c0558 100644 --- a/packages/pieces/community/hubspot/src/lib/triggers/new-ticket-property-change.ts +++ b/packages/pieces/community/hubspot/src/lib/triggers/new-ticket-property-change.ts @@ -19,6 +19,7 @@ type Props = { }; import { AppConnectionValueForAuthProperty } from '@activepieces/pieces-framework'; +import { crmObjectOutputSchema } from '../output-schemas'; const polling: Polling, Props> = { strategy: DedupeStrategy.TIMEBASED, async items({ auth, propsValue, lastFetchEpochMS }) { @@ -144,6 +145,7 @@ export const newTicketPropertyChangeTrigger = createTrigger({ true, ), }, + outputSchema: crmObjectOutputSchema, type: TriggerStrategy.POLLING, async onEnable(context) { await pollingHelper.onEnable(polling, context); diff --git a/packages/pieces/community/hubspot/src/lib/triggers/new-ticket.ts b/packages/pieces/community/hubspot/src/lib/triggers/new-ticket.ts index 3ee850ec2fc..91bed067625 100644 --- a/packages/pieces/community/hubspot/src/lib/triggers/new-ticket.ts +++ b/packages/pieces/community/hubspot/src/lib/triggers/new-ticket.ts @@ -16,6 +16,7 @@ type Props = { }; import { AppConnectionValueForAuthProperty } from '@activepieces/pieces-framework'; +import { crmObjectOutputSchema } from '../output-schemas'; const polling: Polling, Props> = { strategy: DedupeStrategy.TIMEBASED, async items({ auth, propsValue, lastFetchEpochMS }) { @@ -96,6 +97,7 @@ export const newTicketTrigger = createTrigger({ required: false, }), }, + outputSchema: crmObjectOutputSchema, type: TriggerStrategy.POLLING, async onEnable(context) { await pollingHelper.onEnable(polling, context); diff --git a/packages/pieces/community/microsoft-outlook/src/lib/actions/add-label-to-email.ts b/packages/pieces/community/microsoft-outlook/src/lib/actions/add-label-to-email.ts index 46416072129..15a8397f26e 100644 --- a/packages/pieces/community/microsoft-outlook/src/lib/actions/add-label-to-email.ts +++ b/packages/pieces/community/microsoft-outlook/src/lib/actions/add-label-to-email.ts @@ -2,6 +2,7 @@ import { createAction, Property } from '@activepieces/pieces-framework'; import { microsoftOutlookAuth } from '../common/auth'; import { outlookCommon } from '../common/client'; import { messageIdDropdown } from '../common/props'; +import { messageActionOutputSchema } from '../output-schemas'; export const addLabelToEmailAction = createAction({ auth: microsoftOutlookAuth, @@ -11,6 +12,7 @@ export const addLabelToEmailAction = createAction({ description: 'Adds a category (label) to an email message.', audience: 'both', aiMetadata: { description: 'Adds one or more Outlook categories (labels) to a specific message, merging them with any categories already present. Use this to tag or classify an email. Idempotent: re-adding the same categories leaves the message unchanged since duplicates are de-duplicated.', idempotent: true }, + outputSchema: messageActionOutputSchema, props: { messageId: messageIdDropdown({ displayName: 'Email', diff --git a/packages/pieces/community/microsoft-outlook/src/lib/actions/create-draft-email.ts b/packages/pieces/community/microsoft-outlook/src/lib/actions/create-draft-email.ts index 02e83c9688e..4fa22b2a2d6 100644 --- a/packages/pieces/community/microsoft-outlook/src/lib/actions/create-draft-email.ts +++ b/packages/pieces/community/microsoft-outlook/src/lib/actions/create-draft-email.ts @@ -2,6 +2,7 @@ import { ApFile, createAction, Property } from '@activepieces/pieces-framework'; import { BodyType, Message } from '@microsoft/microsoft-graph-types'; import { microsoftOutlookAuth } from '../common/auth'; import { outlookCommon } from '../common/client'; +import { draftMessageActionOutputSchema } from '../output-schemas'; export const createDraftEmailAction = createAction({ auth: microsoftOutlookAuth, @@ -11,6 +12,7 @@ export const createDraftEmailAction = createAction({ description: 'Creates a draft email message.', audience: 'both', aiMetadata: { description: 'Creates a new unsent draft email in the Outlook mailbox with recipients, subject, body, and optional attachments. Use this to stage a message for later review or sending (pair with Send Draft Email). Not idempotent: each call creates a separate draft.', idempotent: false }, + outputSchema: draftMessageActionOutputSchema, props: { recipients: Property.Array({ displayName: 'To Email(s)', @@ -64,9 +66,9 @@ export const createDraftEmailAction = createAction({ }, async run(context) { const recipients = context.propsValue.recipients as string[]; - const ccRecipients = context.propsValue.ccRecipients as string[]; - const bccRecipients = context.propsValue.bccRecipients as string[]; - const attachments = context.propsValue.attachments as Array<{ file: ApFile; fileName: string }>; + const ccRecipients = (context.propsValue.ccRecipients ?? []) as string[]; + const bccRecipients = (context.propsValue.bccRecipients ?? []) as string[]; + const attachments = (context.propsValue.attachments ?? []) as Array<{ file: ApFile; fileName: string }>; const { subject, body, bodyFormat } = context.propsValue; diff --git a/packages/pieces/community/microsoft-outlook/src/lib/actions/download-email-attachment.ts b/packages/pieces/community/microsoft-outlook/src/lib/actions/download-email-attachment.ts index 82ec56e9c82..54e588974e1 100644 --- a/packages/pieces/community/microsoft-outlook/src/lib/actions/download-email-attachment.ts +++ b/packages/pieces/community/microsoft-outlook/src/lib/actions/download-email-attachment.ts @@ -3,6 +3,7 @@ import { PageCollection } from '@microsoft/microsoft-graph-client'; import { FileAttachment } from '@microsoft/microsoft-graph-types'; import { microsoftOutlookAuth } from '../common/auth'; import { outlookCommon } from '../common/client'; +import { downloadAttachmentActionOutputSchema } from '../output-schemas'; export const downloadAttachmentAction = createAction({ auth: microsoftOutlookAuth, @@ -10,8 +11,9 @@ export const downloadAttachmentAction = createAction({ classification: 'READ', displayName: 'Download Attachment', description: 'Download attachments from a specific email message.', - audience: 'both', + audience: 'human', aiMetadata: { description: 'Fetches all file attachments from a specific Outlook message (by message ID) and writes them to storage for downstream steps. Use this after locating a message to retrieve its attached files. Requires a valid message ID; idempotent since it only reads.', idempotent: true }, + outputSchema: downloadAttachmentActionOutputSchema, props: { messageId: Property.ShortText({ displayName: 'Message ID', diff --git a/packages/pieces/community/microsoft-outlook/src/lib/actions/find-email.ts b/packages/pieces/community/microsoft-outlook/src/lib/actions/find-email.ts index 1cb89d04a70..aaf7b1ac77b 100644 --- a/packages/pieces/community/microsoft-outlook/src/lib/actions/find-email.ts +++ b/packages/pieces/community/microsoft-outlook/src/lib/actions/find-email.ts @@ -5,6 +5,7 @@ import dayjs from 'dayjs'; import { microsoftOutlookAuth } from '../common/auth'; import { outlookCommon } from '../common/client'; import { mailFolderIdDropdown } from '../common/props'; +import { findEmailActionOutputSchema } from '../output-schemas'; export const findEmailAction = createAction({ auth: microsoftOutlookAuth, @@ -14,6 +15,7 @@ export const findEmailAction = createAction({ description: 'Searches for emails using full-text search.', audience: 'both', aiMetadata: { description: 'Searches the Outlook mailbox for messages matching a full-text query (supports field syntax like from:, subject:, hasAttachments:), optionally scoped to one folder and capped by a max-results count. Use this to locate emails and obtain their message IDs for follow-up actions. Idempotent read-only lookup.', idempotent: true }, + outputSchema: findEmailActionOutputSchema, props: { searchQuery: Property.ShortText({ displayName: 'Search Query', @@ -41,9 +43,8 @@ export const findEmailAction = createAction({ const baseUrl = folderId ? `${outlookCommon.mailboxPrefix(context.auth)}/mailFolders/${folderId}/messages` : `${outlookCommon.mailboxPrefix(context.auth)}/messages`; const searchParam = `$search="${searchQuery}"`; const topParam = top ? `$top=${Math.min(Math.max(top, 1), 1000)}` : '$top=25'; - const selectParam = ['id', 'subject', 'from', 'toRecipients', 'receivedDateTime'].join(','); - const queryParams = [searchParam, topParam, selectParam].filter(Boolean).join('&'); + const queryParams = [searchParam, topParam].filter(Boolean).join('&'); const url = `${baseUrl}?${queryParams}`; const headers: Record = { diff --git a/packages/pieces/community/microsoft-outlook/src/lib/actions/forward-email.ts b/packages/pieces/community/microsoft-outlook/src/lib/actions/forward-email.ts index 9bd717d4c97..a0efa57fd83 100644 --- a/packages/pieces/community/microsoft-outlook/src/lib/actions/forward-email.ts +++ b/packages/pieces/community/microsoft-outlook/src/lib/actions/forward-email.ts @@ -3,6 +3,7 @@ import { BodyType, Message } from '@microsoft/microsoft-graph-types'; import { microsoftOutlookAuth } from '../common/auth'; import { outlookCommon } from '../common/client'; import { messageIdDropdown } from '../common/props'; +import { forwardEmailActionOutputSchema } from '../output-schemas'; export const forwardEmailAction = createAction({ auth: microsoftOutlookAuth, @@ -12,6 +13,7 @@ export const forwardEmailAction = createAction({ description: 'Forwards an email message.', audience: 'both', aiMetadata: { description: 'Forwards an existing Outlook message (by message ID) to new recipients, preserving the original body and attachments and prepending an optional comment. Use this to pass an existing email along rather than composing a new one. Not idempotent: each call sends a new forwarded email.', idempotent: false }, + outputSchema: forwardEmailActionOutputSchema, props: { messageId: messageIdDropdown({ displayName: 'Email', @@ -49,7 +51,7 @@ export const forwardEmailAction = createAction({ attachments: message.attachments, }; - const response = await client + await client .api(`${outlookCommon.mailboxPrefix(context.auth)}/messages/${messageId}/forward`) .post({ message:messagePayload, @@ -58,8 +60,7 @@ export const forwardEmailAction = createAction({ return { success: true, message: 'Email forwarded successfully.', - messageId: response.id, - ...response, + messageId, }; }, }); diff --git a/packages/pieces/community/microsoft-outlook/src/lib/actions/move-email-to-folder.ts b/packages/pieces/community/microsoft-outlook/src/lib/actions/move-email-to-folder.ts index 3b9e85fdea2..b34525f3df4 100644 --- a/packages/pieces/community/microsoft-outlook/src/lib/actions/move-email-to-folder.ts +++ b/packages/pieces/community/microsoft-outlook/src/lib/actions/move-email-to-folder.ts @@ -2,6 +2,7 @@ import { createAction, Property } from '@activepieces/pieces-framework'; import { microsoftOutlookAuth } from '../common/auth'; import { outlookCommon } from '../common/client'; import { mailFolderIdDropdown, messageIdDropdown } from '../common/props'; +import { messageActionOutputSchema } from '../output-schemas'; export const moveEmailToFolderAction = createAction({ auth: microsoftOutlookAuth, @@ -11,6 +12,7 @@ export const moveEmailToFolderAction = createAction({ description: 'Moves an email message to a specific folder.', audience: 'both', aiMetadata: { description: 'Moves a specific Outlook message into a chosen mail folder. Use this to organize, archive, or route an email after processing it. Note: the move assigns a new message ID, so re-running with the original ID will fail once moved.', idempotent: false }, + outputSchema: messageActionOutputSchema, props: { messageId: messageIdDropdown({ displayName: 'Email', diff --git a/packages/pieces/community/microsoft-outlook/src/lib/actions/remove-label-from-email.ts b/packages/pieces/community/microsoft-outlook/src/lib/actions/remove-label-from-email.ts index 98037dd22fb..efe826bed8b 100644 --- a/packages/pieces/community/microsoft-outlook/src/lib/actions/remove-label-from-email.ts +++ b/packages/pieces/community/microsoft-outlook/src/lib/actions/remove-label-from-email.ts @@ -2,6 +2,7 @@ import { createAction, Property } from '@activepieces/pieces-framework'; import { microsoftOutlookAuth } from '../common/auth'; import { outlookCommon } from '../common/client'; import { messageIdDropdown } from '../common/props'; +import { messageActionOutputSchema } from '../output-schemas'; export const removeLabelFromEmailAction = createAction({ auth: microsoftOutlookAuth, @@ -11,6 +12,7 @@ export const removeLabelFromEmailAction = createAction({ description: 'Removes a category (label) from an email message.', audience: 'both', aiMetadata: { description: 'Removes one or more Outlook categories (labels) from a specific message, leaving any other categories intact. Use this to untag or reclassify an email. Idempotent: re-running with the same categories yields the same final label set.', idempotent: true }, + outputSchema: messageActionOutputSchema, props: { messageId: messageIdDropdown({ displayName: 'Email', diff --git a/packages/pieces/community/microsoft-outlook/src/lib/actions/reply-email.ts b/packages/pieces/community/microsoft-outlook/src/lib/actions/reply-email.ts index c34f464c56e..19f7b1f7e1e 100644 --- a/packages/pieces/community/microsoft-outlook/src/lib/actions/reply-email.ts +++ b/packages/pieces/community/microsoft-outlook/src/lib/actions/reply-email.ts @@ -3,6 +3,7 @@ import { microsoftOutlookAuth } from '../common/auth'; import { outlookCommon } from '../common/client'; import { BodyType, Message } from '@microsoft/microsoft-graph-types'; import { PageCollection } from '@microsoft/microsoft-graph-client'; +import { replyEmailActionOutputSchema } from '../output-schemas'; export const replyEmailAction = createAction({ auth: microsoftOutlookAuth, @@ -12,6 +13,7 @@ export const replyEmailAction = createAction({ description: 'Reply to an outlook email.', audience: 'both', aiMetadata: { description: 'Replies to an existing Outlook message (identified by message ID), supporting added CC/BCC recipients and attachments. Set the Create Draft flag to stage the reply without sending; otherwise it is sent immediately. Not idempotent when sending: each call creates and dispatches a new reply.', idempotent: false }, + outputSchema: replyEmailActionOutputSchema, props: { messageId: Property.Dropdown({ auth: microsoftOutlookAuth, @@ -100,9 +102,9 @@ export const replyEmailAction = createAction({ }, async run(context) { const { replyBody, bodyFormat, messageId, draft } = context.propsValue; - const ccRecipients = context.propsValue.ccRecipients as string[]; - const bccRecipients = context.propsValue.bccRecipients as string[]; - const attachments = context.propsValue.attachments as Array<{ + const ccRecipients = (context.propsValue.ccRecipients ?? []) as string[]; + const bccRecipients = (context.propsValue.bccRecipients ?? []) as string[]; + const attachments = (context.propsValue.attachments ?? []) as Array<{ file: ApFile; fileName: string; }>; diff --git a/packages/pieces/community/microsoft-outlook/src/lib/actions/request-approval-send-email.ts b/packages/pieces/community/microsoft-outlook/src/lib/actions/request-approval-send-email.ts index c39f91c2121..346c0fd60ca 100644 --- a/packages/pieces/community/microsoft-outlook/src/lib/actions/request-approval-send-email.ts +++ b/packages/pieces/community/microsoft-outlook/src/lib/actions/request-approval-send-email.ts @@ -4,6 +4,7 @@ import { assertNotNullOrUndefined } from '@activepieces/pieces-framework'; import { ExecutionType } from '@activepieces/pieces-framework'; import { microsoftOutlookAuth } from '../common/auth'; import { outlookCommon } from '../common/client'; +import { requestApprovalActionOutputSchema } from '../output-schemas'; export const requestApprovalInMail = createAction({ auth: microsoftOutlookAuth, @@ -14,6 +15,7 @@ export const requestApprovalInMail = createAction({ 'Send approval request email and then wait until the email is approved or disapproved', audience: 'both', aiMetadata: { description: 'Sends an email with a single link to a confirmation page where the recipient chooses Approve or Disapprove, then pauses the flow until they respond, resuming with the decision. Use this as a human-in-the-loop approval gate before proceeding. Not idempotent: each call sends a new email and creates a new pending waitpoint.', idempotent: false }, + outputSchema: requestApprovalActionOutputSchema, props: { recipients: Property.ShortText({ displayName: 'To Email Address', diff --git a/packages/pieces/community/microsoft-outlook/src/lib/actions/send-draft-email.ts b/packages/pieces/community/microsoft-outlook/src/lib/actions/send-draft-email.ts index 86bf5055960..da207fa374d 100644 --- a/packages/pieces/community/microsoft-outlook/src/lib/actions/send-draft-email.ts +++ b/packages/pieces/community/microsoft-outlook/src/lib/actions/send-draft-email.ts @@ -2,6 +2,7 @@ import { createAction } from '@activepieces/pieces-framework'; import { microsoftOutlookAuth } from '../common/auth'; import { outlookCommon } from '../common/client'; import { draftMessageIdDropdown } from '../common/props'; +import { sendDraftEmailActionOutputSchema } from '../output-schemas'; export const sendDraftEmailAction = createAction({ auth: microsoftOutlookAuth, @@ -11,6 +12,7 @@ export const sendDraftEmailAction = createAction({ description: 'Sends a draft email message.', audience: 'both', aiMetadata: { description: 'Sends an existing draft email (identified by draft message ID) from the Outlook mailbox. Use this to dispatch a draft previously staged by Create Draft Email or a draft reply. Not idempotent: once sent the draft no longer exists, so re-running with the same ID will fail.', idempotent: false }, + outputSchema: sendDraftEmailActionOutputSchema, props: { messageId: draftMessageIdDropdown({ displayName: 'Draft Email', diff --git a/packages/pieces/community/microsoft-outlook/src/lib/actions/send-email.ts b/packages/pieces/community/microsoft-outlook/src/lib/actions/send-email.ts index edf507a19ae..11c5233dd24 100644 --- a/packages/pieces/community/microsoft-outlook/src/lib/actions/send-email.ts +++ b/packages/pieces/community/microsoft-outlook/src/lib/actions/send-email.ts @@ -65,9 +65,9 @@ export const sendEmailAction = createAction({ }, async run(context) { const recipients = context.propsValue.recipients as string[]; - const ccRecipients = context.propsValue.ccRecipients as string[]; - const bccRecipients = context.propsValue.bccRecipients as string[]; - const attachments = context.propsValue.attachments as Array<{ file: ApFile; fileName: string }>; + const ccRecipients = (context.propsValue.ccRecipients ?? []) as string[]; + const bccRecipients = (context.propsValue.bccRecipients ?? []) as string[]; + const attachments = (context.propsValue.attachments ?? []) as Array<{ file: ApFile; fileName: string }>; const { subject, body, bodyFormat } = context.propsValue; diff --git a/packages/pieces/community/microsoft-outlook/src/lib/output-schemas.ts b/packages/pieces/community/microsoft-outlook/src/lib/output-schemas.ts new file mode 100644 index 00000000000..75c991c6537 --- /dev/null +++ b/packages/pieces/community/microsoft-outlook/src/lib/output-schemas.ts @@ -0,0 +1,107 @@ +import { OutputSchema } from '@activepieces/pieces-framework'; + +const emailAddressFields: OutputSchema['fields'] = [ + { key: 'name', label: 'Name', value: 'emailAddress.name' }, + { key: 'address', label: 'Email Address', value: 'emailAddress.address', format: 'email' }, +]; + +const messageFields: OutputSchema['fields'] = [ + { key: 'id', label: 'Message ID' }, + { key: 'subject', label: 'Subject' }, + { key: 'bodyPreview', label: 'Body Preview' }, + { + key: 'body', + label: 'Body', + children: [ + { key: 'contentType', label: 'Content Type' }, + { key: 'content', label: 'Content' }, + ], + }, + { key: 'from', label: 'From', children: emailAddressFields }, + { key: 'sender', label: 'Sender', children: emailAddressFields }, + { key: 'toRecipients', label: 'To Recipients', labelKey: 'address', listItems: emailAddressFields }, + { key: 'ccRecipients', label: 'CC Recipients', labelKey: 'address', listItems: emailAddressFields }, + { key: 'bccRecipients', label: 'BCC Recipients', labelKey: 'address', listItems: emailAddressFields }, + { key: 'replyTo', label: 'Reply To', labelKey: 'address', listItems: emailAddressFields }, + { key: 'receivedDateTime', label: 'Received At', format: 'datetime' }, + { key: 'sentDateTime', label: 'Sent At', format: 'datetime' }, + { key: 'createdDateTime', label: 'Created At', format: 'datetime' }, + { key: 'lastModifiedDateTime', label: 'Last Modified At', format: 'datetime' }, + { key: 'hasAttachments', label: 'Has Attachments', format: 'boolean' }, + { key: 'isRead', label: 'Is Read', format: 'boolean' }, + { key: 'isDraft', label: 'Is Draft', format: 'boolean' }, + { key: 'importance', label: 'Importance' }, + { key: 'categories', label: 'Categories' }, + { key: 'flag', label: 'Flag', children: [{ key: 'flagStatus', label: 'Flag Status' }] }, + { key: 'webLink', label: 'Web Link', format: 'url' }, + { key: 'parentFolderId', label: 'Parent Folder ID' }, + { key: 'conversationId', label: 'Conversation ID' }, + { key: 'internetMessageId', label: 'Internet Message ID' }, +]; + +const attachmentFields: OutputSchema['fields'] = [ + { key: 'id', label: 'Attachment ID' }, + { key: 'name', label: 'File Name' }, + { key: 'file', label: 'File', format: 'url' }, + { key: 'contentType', label: 'Content Type' }, + { key: 'size', label: 'Size', format: 'filesize' }, + { key: 'isInline', label: 'Is Inline', format: 'boolean' }, + { key: 'lastModifiedDateTime', label: 'Last Modified At', format: 'datetime' }, +]; + +const dispatchResultFields: OutputSchema['fields'] = [ + { key: 'success', label: 'Success', format: 'boolean' }, + { key: 'message', label: 'Message' }, + { key: 'messageId', label: 'Message ID' }, +]; + +export const messageActionOutputSchema: OutputSchema = { fields: messageFields }; + +export const draftMessageActionOutputSchema: OutputSchema = { + fields: messageFields.filter((field) => field.key !== 'from' && field.key !== 'sender'), +}; + +export const findEmailActionOutputSchema: OutputSchema = { + fields: [ + { key: 'found', label: 'Found', format: 'boolean' }, + { key: 'totalCount', label: 'Total Count', format: 'number' }, + { key: 'hasMore', label: 'Has More', format: 'boolean' }, + { key: 'nextPageUrl', label: 'Next Page URL', format: 'url' }, + { key: 'result', label: 'Emails', labelKey: 'subject', listItems: messageFields }, + ], +}; + +export const downloadAttachmentActionOutputSchema: OutputSchema = { + itemLabel: '{name}', + fields: [{ key: 'attachments', label: 'Attachments', value: '', listItems: attachmentFields }], +}; + +export const sendDraftEmailActionOutputSchema: OutputSchema = { fields: dispatchResultFields }; + +export const forwardEmailActionOutputSchema: OutputSchema = { fields: dispatchResultFields }; + +export const replyEmailActionOutputSchema: OutputSchema = { + fields: [ + { key: 'success', label: 'Success', format: 'boolean' }, + { key: 'message', label: 'Message' }, + { key: 'draftId', label: 'Draft ID' }, + { key: 'draftLink', label: 'Draft Link', format: 'url' }, + ], +}; + +export const requestApprovalActionOutputSchema: OutputSchema = { + fields: [{ key: 'approved', label: 'Approved', format: 'boolean' }], +}; + +export const newEmailTriggerOutputSchema: OutputSchema = { fields: messageFields }; + +export const newAttachmentTriggerOutputSchema: OutputSchema = { + fields: [ + ...attachmentFields, + { key: 'messageId', label: 'Message ID' }, + { key: 'messageSubject', label: 'Message Subject' }, + { key: 'messageSender', label: 'Message Sender', children: emailAddressFields }, + { key: 'messageReceivedDateTime', label: 'Message Received At', format: 'datetime' }, + { key: 'parentFolderId', label: 'Parent Folder ID' }, + ], +}; diff --git a/packages/pieces/community/microsoft-outlook/src/lib/triggers/new-attachment.ts b/packages/pieces/community/microsoft-outlook/src/lib/triggers/new-attachment.ts index ff2374dd48c..9fe572a705a 100644 --- a/packages/pieces/community/microsoft-outlook/src/lib/triggers/new-attachment.ts +++ b/packages/pieces/community/microsoft-outlook/src/lib/triggers/new-attachment.ts @@ -6,6 +6,7 @@ import { microsoftOutlookAuth } from '../common/auth'; import { outlookCommon } from '../common/client'; import { mailFolderIdDropdown } from '../common/props'; import { isNil } from '@activepieces/pieces-framework'; +import { newAttachmentTriggerOutputSchema } from '../output-schemas'; async function enrichAttachments( client: Client, @@ -63,6 +64,7 @@ export const newAttachmentTrigger = createTrigger({ aiMetadata: { description: 'Fires once per attachment when a new email carrying one or more file attachments arrives, optionally scoped to a folder, sender, or attachment-name filter. Each fire represents a single attachment from a newly received message.', }, + outputSchema: newAttachmentTriggerOutputSchema, props: { folderId: mailFolderIdDropdown({ displayName: 'Folder', diff --git a/packages/pieces/community/microsoft-outlook/src/lib/triggers/new-email-in-folder.ts b/packages/pieces/community/microsoft-outlook/src/lib/triggers/new-email-in-folder.ts index ef1631d3970..e7a4d395680 100644 --- a/packages/pieces/community/microsoft-outlook/src/lib/triggers/new-email-in-folder.ts +++ b/packages/pieces/community/microsoft-outlook/src/lib/triggers/new-email-in-folder.ts @@ -11,6 +11,7 @@ import dayjs from 'dayjs'; import { microsoftOutlookAuth } from '../common/auth'; import { outlookCommon } from '../common/client'; import { mailFolderIdDropdown } from '../common/props'; +import { newEmailTriggerOutputSchema } from '../output-schemas'; const polling: Polling, { folderId?: string }> = { strategy: DedupeStrategy.TIMEBASED, @@ -64,6 +65,7 @@ export const newEmailInFolderTrigger = createTrigger({ aiMetadata: { description: 'Fires when a new message appears in the chosen Outlook mail folder. Each fire represents one new email added to that folder.', }, + outputSchema: newEmailTriggerOutputSchema, props: { folderId: mailFolderIdDropdown({ displayName: 'Folder', diff --git a/packages/pieces/community/microsoft-outlook/src/lib/triggers/new-email.ts b/packages/pieces/community/microsoft-outlook/src/lib/triggers/new-email.ts index bd9580c691a..1a8cce68aa4 100644 --- a/packages/pieces/community/microsoft-outlook/src/lib/triggers/new-email.ts +++ b/packages/pieces/community/microsoft-outlook/src/lib/triggers/new-email.ts @@ -10,6 +10,7 @@ import { Message } from '@microsoft/microsoft-graph-types'; import dayjs from 'dayjs'; import { microsoftOutlookAuth } from '../common/auth'; import { outlookCommon } from '../common/client'; +import { newEmailTriggerOutputSchema } from '../output-schemas'; const polling: Polling, { sender?: string; @@ -90,6 +91,7 @@ export const newEmailTrigger = createTrigger({ aiMetadata: { description: 'Fires when a new message arrives in the mailbox Inbox, optionally narrowed to a specific sender and/or recipient address. Each fire represents one newly received email.', }, + outputSchema: newEmailTriggerOutputSchema, props: { sender: Property.ShortText({ displayName: 'From (Sender Email)', From 89e514ec349b37d0359fb5188af2b538a1e31f47 Mon Sep 17 00:00:00 2001 From: Mo AbuAboud Date: Sun, 23 Aug 2026 13:13:52 +0200 Subject: [PATCH 2/5] ci(cloud): run the canary workflow on cloud-hotfix instead of skipping it (#14755) Co-authored-by: AbdulTheActivePiecer Co-authored-by: Abdul <106555838+AbdulTheActivePiecer@users.noreply.github.com> --- .../workflows/continuous-delivery-canary.yml | 28 +++++++++++++++++-- .../workflows/continuous-delivery-cloud.yml | 25 ++++++----------- .../engineering/cloud-deployment-paths.md | 10 ++++--- 3 files changed, 40 insertions(+), 23 deletions(-) diff --git a/.github/workflows/continuous-delivery-canary.yml b/.github/workflows/continuous-delivery-canary.yml index 7e5c8ae197a..6deea1fe854 100644 --- a/.github/workflows/continuous-delivery-canary.yml +++ b/.github/workflows/continuous-delivery-canary.yml @@ -3,11 +3,23 @@ name: Continuous Delivery — Canary on: workflow_dispatch: workflow_call: + inputs: + image_tag: + description: 'Deploy this already-built tag instead of building a new image' + type: string + required: false + default: '' + skip_migration_check: + description: 'Deploy even when a pending migration is marked breaking' + type: boolean + required: false + default: false schedule: - cron: '0 9 * * *' # Daily 9 AM UTC — scheduled runs always use the default branch jobs: build-image: + if: ${{ !inputs.image_tag }} runs-on: ubuntu-24.04 permissions: contents: read @@ -54,6 +66,10 @@ jobs: check-migrations: needs: build-image + if: | + always() && + needs.build-image.result != 'failure' && + inputs.skip_migration_check != true runs-on: ubuntu-latest outputs: has_breaking: ${{ steps.check.outputs.has_breaking }} @@ -114,10 +130,18 @@ jobs: deploy-canary: needs: [build-image, check-migrations] + if: | + always() && + needs.build-image.result != 'failure' && + needs.check-migrations.result != 'failure' runs-on: ubuntu-latest environment: name: canary steps: + - name: Resolve image tag + id: image + run: echo "image_tag=${{ inputs.image_tag || needs.build-image.outputs.image_tag }}" >> $GITHUB_OUTPUT + - name: Configure SSH run: | mkdir -p ~/.ssh/ @@ -137,9 +161,9 @@ jobs: - name: Deploy canary app run: | - ssh ops -t -t 'bash -ic "cd mrsk/prod && kamal deploy --version ${{ needs.build-image.outputs.image_tag }} --config-file=config/app-canary.yml --skip-push; exit"' + ssh ops -t -t 'bash -ic "cd mrsk/prod && kamal deploy --version ${{ steps.image.outputs.image_tag }} --config-file=config/app-canary.yml --skip-push; exit"' - name: Deploy canary workers run: | - ssh ops -t -t 'bash -ic "cd mrsk/prod && kamal deploy --version ${{ needs.build-image.outputs.image_tag }} --config-file=config/worker-canary.yml --skip-push; exit"' + ssh ops -t -t 'bash -ic "cd mrsk/prod && kamal deploy --version ${{ steps.image.outputs.image_tag }} --config-file=config/worker-canary.yml --skip-push; exit"' diff --git a/.github/workflows/continuous-delivery-cloud.yml b/.github/workflows/continuous-delivery-cloud.yml index 9f6e1b1bb87..e106d73b5af 100644 --- a/.github/workflows/continuous-delivery-cloud.yml +++ b/.github/workflows/continuous-delivery-cloud.yml @@ -73,22 +73,23 @@ jobs: tags: ghcr.io/activepieces/activepieces-cloud:${{ steps.set-tag.outputs.image_tag }} deploy-canary: - needs: [build-image] + needs: [guard, build-image] if: | always() && - github.event_name != 'workflow_dispatch' && - needs.build-image.result == 'skipped' + needs.guard.result != 'failure' && + (needs.build-image.result == 'success' || needs.build-image.result == 'skipped') uses: ./.github/workflows/continuous-delivery-canary.yml + with: + image_tag: ${{ needs.build-image.outputs.image_tag }} + skip_migration_check: ${{ github.event_name == 'workflow_dispatch' }} secrets: inherit promote-to-production: needs: [build-image, deploy-canary] if: | always() && - ( - (needs.build-image.result == 'success' && github.event_name == 'workflow_dispatch') || - (needs.deploy-canary.result == 'success') - ) + needs.deploy-canary.result == 'success' && + (needs.build-image.result == 'success' || needs.build-image.result == 'skipped') runs-on: ubuntu-latest permissions: contents: write @@ -125,16 +126,6 @@ jobs: echo "image_tag=release-candidate" >> $GITHUB_OUTPUT fi - - name: Deploy App to canary - if: github.event_name == 'workflow_dispatch' - run: | - ssh ops -t -t 'bash -ic "cd mrsk/prod && kamal deploy --version ${{ steps.image.outputs.image_tag }} --config-file=config/app-canary.yml --skip-push; exit"' - - - name: Deploy Workers to canary - if: github.event_name == 'workflow_dispatch' - run: | - ssh ops -t -t 'bash -ic "cd mrsk/prod && kamal deploy --version ${{ steps.image.outputs.image_tag }} --config-file=config/worker-canary.yml --skip-push; exit"' - - name: Deploy App to production run: | ssh ops -t -t 'bash -ic "cd mrsk/prod && kamal deploy --version ${{ steps.image.outputs.image_tag }} --config-file=config/app.yml --skip-push; exit"' diff --git a/brain/knowledge/engineering/cloud-deployment-paths.md b/brain/knowledge/engineering/cloud-deployment-paths.md index ca7801fec6e..757a641c22e 100644 --- a/brain/knowledge/engineering/cloud-deployment-paths.md +++ b/brain/knowledge/engineering/cloud-deployment-paths.md @@ -4,19 +4,21 @@ icon: 🚀 # Cloud Deployment Paths -How code reaches `cloud.activepieces.com`. Two workflows in `.github/workflows/`: `continuous-delivery-canary.yml` and `continuous-delivery-cloud.yml`. +How code reaches `cloud.activepieces.com`. Two workflows in `.github/workflows/`: `continuous-delivery-canary.yml` and `continuous-delivery-cloud.yml`. Both cloud paths run the same job graph — `guard` → `build-image` → `deploy-canary` → `promote-to-production` — and both reach prod only after canary deploys cleanly. ## The normal path -Cloud's `workflow_call`/scheduled run calls the canary workflow as a job, then promotes the `release-candidate` tag to prod. Canary builds its own `.canary` image; prod deploys the `release-candidate` tag, not that image. +Cloud's `workflow_call`/scheduled run skips `build-image`, so `deploy-canary` gets an empty `image_tag` and the canary workflow builds its own `.canary` image and runs `check-migrations`. Prod then deploys the `release-candidate` tag, not that image. ## The override path -`Continuous Delivery — Cloud` → **Run workflow** → `cloud-hotfix` builds a `.beta` image from the current branch and deploys it to canary **and** prod, in that order, from the `promote-to-production` job. It never invokes the canary workflow. A `guard` job refuses the hotfix if the scheduled promotion is under an hour away. +`Continuous Delivery — Cloud` → **Run workflow** → `cloud-hotfix` builds one `.beta` image from the current branch and hands its tag to the canary workflow via `image_tag`, so canary deploys the exact artifact prod is about to get instead of rebuilding it. It also passes `skip_migration_check: true`. A `guard` job refuses the hotfix if the scheduled promotion is under an hour away, and a rejected guard skips canary too. ## Staging (upstream of both) `continuous-delivery-stg.yml` builds every push to `main` and deploys it with **Kamal**, not Kubernetes: it SSHes to the devops box and runs `kamal deploy --config-file=config/{app,worker}.yml` from `/root/mrsk/stg`. App containers live on one host, workers on another; `kubectl`'s `stg` context on that box is dead and points at a node that no longer runs k3s — ignore it. Env vars for staging go in `config/app.yml` under `env.clear` (secrets are name-listed under `env.secret` and read from `.kamal/secrets`). The Thursday job retags whatever staging is running as `release-candidate`, which is what cloud promotes. ## Gotchas - **Kamal reads its config at deploy time, so editing `config/app.yml` during an in-flight CD run silently misses.** The build takes ~5 min and the deploy job reads the file when *it* starts; an edit that lands in between applies to neither the running containers nor the deploy. Worse, Kamal replaces containers one at a time, so a mid-deploy edit can leave app_1 and app_2 disagreeing about a flag — which reads downstream as a flaky feature, not a config race. Always re-run `kamal deploy --version --config-file=config/app.yml --skip-push` after editing, and verify with `docker inspect --format '{{range .Config.Env}}...'` on **every** container, not one. The command needs a TTY (`ssh -tt`); without it Kamal exits 0 having done nothing ("the input device is not a TTY"). -- **`check-migrations` gates canary *and* the scheduled cloud promotion.** The canary workflow fails when any pending migration carries `breaking = true` (rollback safety — see `tools/scripts/check-manifest-migrations.ts`). Because the scheduled cloud run calls that workflow, one breaking migration blocks both. The escape hatch is `cloud-hotfix`: it deploys canary and prod without touching the canary workflow, so it bypasses the gate by construction — there is no skip flag, and there is no canary-only override. +- **`check-migrations` gates canary *and* the cloud promotion that calls it.** The canary workflow fails when any pending migration carries `breaking = true` (rollback safety — see `tools/scripts/check-manifest-migrations.ts`), and the scheduled cloud run inherits that gate. `cloud-hotfix` passes `skip_migration_check: true` to bypass it: a deliberate cloud release ships the breaking migration to prod anyway, so blocking canary on it only leaves canary behind prod. There is still no canary-only override — dispatch the cloud workflow. +- **Skipping a `needs` job reads the same as a rejected one.** `build-image` is skipped both when the run is scheduled *and* when `guard` fails a hotfix, so `needs.build-image.result == 'skipped'` alone would deploy canary for a hotfix the guard just refused. `deploy-canary` therefore also needs `guard` and checks `needs.guard.result != 'failure'`. +- **`docker pull … error from registry: denied` on the ops host can be transient.** Seen 2026-08-12 pulling a `.beta` tag to the canary host; re-running the same job with no other change pulled and deployed fine. The tag existed in GHCR the whole time. Re-run once before suspecting the host's registry credential — GHCR does answer `GET /v2/` for a token that cannot pull, so login-succeeds/pull-denied is *consistent* with an expired credential, but it is not evidence of one. - **Never put a BuildKit cache mount on `/var/cache/apt` or `/var/lib/apt`.** The `node:*-bullseye-slim` base ships `/etc/apt/apt.conf.d/docker-clean`, which wipes downloaded `.deb`s and sets `Keep-Downloaded-Packages "false"` — so the mount caches nothing, but it does persist stale `apt` lists and `partial/` leftovers across Depot builds. When `bullseye-security` republishes and old `.deb`s rotate out, the next build dies on `Hash Sum mismatch` / `Unable to fetch some archives` → `exit code: 100`, which reads like a missing package but isn't. Removed from both Dockerfiles on 2026-08-12; a plain `apt-get update && apt-get install` is what works. Also: bullseye `main` has been frozen since Aug 2025 and Debian 11 LTS ends Aug 2026, so the base image needs a bookworm bump. - **`breaking = true` on a migration and the `⛓️‍💥 breaking-change` PR label are different axes.** The migration flag is about rollback safety and is what stops deploys; the label is about self-hoster upgrade impact and is enforced by `breaking-change-check.yml` on PRs. Neither implies the other. From e13c84195450656c9651b8e75a2af8a477e8daea Mon Sep 17 00:00:00 2001 From: Kishan Parmar <135701940+kishanprmr@users.noreply.github.com> Date: Sun, 23 Aug 2026 19:33:44 +0530 Subject: [PATCH 3/5] chore(codeowners): unown docs/ and tsconfig.base.json (#14977) --- .github/CODEOWNERS | 2 ++ 1 file changed, 2 insertions(+) diff --git a/.github/CODEOWNERS b/.github/CODEOWNERS index ecf7d0a776d..700e21a4d22 100644 --- a/.github/CODEOWNERS +++ b/.github/CODEOWNERS @@ -15,4 +15,6 @@ # The leading slash is required — unanchored patterns would also match the # per-piece lockfiles under packages/pieces/. /bun.lock +/docs/ +/tsconfig.base.json /brain/ From 2fb922dc17d01ef24d434009ae6ce0a6cb4a0c80 Mon Sep 17 00:00:00 2001 From: Bartosz Majewski <30874844+majewskibartosz@users.noreply.github.com> Date: Sun, 23 Aug 2026 16:04:04 +0200 Subject: [PATCH 4/5] fix(tables): deleting many records no longer hangs (#14371) Co-authored-by: Mohammad AbuAboud Co-authored-by: AbdulTheActivePiecer Co-authored-by: Claude Opus 5 (1M context) --- .../engineering/architecture-spine.md | 8 + .../1818000000000-AddCellCascadeIndices.ts | 42 ++++ .../src/app/database/postgres-connection.ts | 2 + .../src/app/mcp/tools/ap-delete-records.ts | 8 +- .../api/src/app/tables/record/cell.entity.ts | 8 + .../app/tables/record/record-side-effects.ts | 97 +++++---- .../app/tables/record/record.controller.ts | 5 +- .../src/app/tables/record/record.service.ts | 196 +++++++++--------- .../test/integration/ce/tables/record.test.ts | 84 ++++++++ 9 files changed, 317 insertions(+), 133 deletions(-) create mode 100644 packages/server/api/src/app/database/migration/postgres/1818000000000-AddCellCascadeIndices.ts diff --git a/brain/knowledge/engineering/architecture-spine.md b/brain/knowledge/engineering/architecture-spine.md index 28d65f8411d..7cac79f8c81 100644 --- a/brain/knowledge/engineering/architecture-spine.md +++ b/brain/knowledge/engineering/architecture-spine.md @@ -37,6 +37,14 @@ Activepieces: open-source AI-first workflow automation platform (self-hosted or **Don't `.max()` a business limit on a request body — cap server-side.** A `.max()` on a request-body field rejects the *whole* request with a 400 the moment a user crosses it, so a user editing a list that reaches 50 items loses their entire save. Reserve `.max()` for a true trust-boundary DoS guard (Fastify's global body limit already covers gross abuse) and let business limits just *apply*: accept the input and `slice(0, MAX)` in the service layer, so the write always succeeds with the limit quietly enforced. Surfaced 2026-07 on `POST /v1/chat/memory`, where the schema's `.max(50)`/`.max(280)` duplicated a `slice` the save helper already did — redundant *and* a data-loss bug. +**`unique()` from `core-utils` is O(n²) over `JSON.stringify` — never put it on a hot path.** It is `filter` + `findIndex` with a `JSON.stringify` on *both* sides of every comparison, so it blocks the event loop: 1k items → 42ms, 5k → 889ms, 10k → 3.6s, during which health checks, websockets and webhook dispatch all stall. It exists for deep-equality dedupe of objects; for primitives use `[...new Set(xs)]`. Found 2026-07 as the first statement of the bulk record delete the same PR was trying to speed up (GIT-1652). + +**`DeleteResult.affected` is `undefined` on PGlite — don't count rows with it.** TypeORM's `PostgresQueryRunner` only sets `affected` when the driver result carries `rowCount`; PGlite reports `affectedRows` instead and `typeorm-pglite` doesn't map it. So `result.affected ?? 0` is correct on `pg` and silently `0` on every PGlite deployment and test — the worst failure mode, since CI is green. Use `.returning('id')` and count the rows. + +**Migration timestamps are hand-picked, so two PRs in flight will collide.** `postgres-connection.ts` uses round numbers (`1815000000000`, `1816000000000`, …), not `Date.now()`, and TypeORM orders migrations by the 13-digit suffix of the class name. Two branches both taking "the next one" produce duplicate keys, and ordering — including `rollback-migrations.ts` — silently falls back to `getMigrations()` array order. Check `git ls-tree main packages/server/api/src/app/database/migration/postgres/` for the number before you commit, and re-check after any rebase. + +**`CREATE INDEX CONCURRENTLY IF NOT EXISTS` can record success over a permanently invalid index.** `CONCURRENTLY` requires `transaction = false`, so nothing rolls back an interrupted build — it leaves an `indisvalid = false` index. `IF NOT EXISTS` then matches on *name only*, so the retry skips it with a NOTICE and TypeORM marks the migration applied: the query the index was meant to fix stays slow, with a green migration log. An invalid index is not inert either — still maintained on every insert, still blocks HOT updates. Use `DROP INDEX CONCURRENTLY IF EXISTS` before the create, and assert `pg_index.indisvalid` after. The existing `1810`/`1815`/`1818` index migrations all carry this shape. + **TypeORM soft-delete (`@DeleteDateColumn`) is not canary/rollback-safe on a shared DB.** TypeORM only appends `WHERE "deleted" IS NULL` for code whose entity *declares* the column, so any two versions sharing one Postgres — every canary window (canary shares prod's DB), every rollback — means old code reads soft-deleted rows as live. During canary a row deleted by new code reappears live and editable on old-code requests; on rollback every soft-deleted row returns permanently. Partially unrecoverable, too: old code's delete is a hard `DELETE`, so it can destroy a resurrected row the new restore feature could otherwise bring back. Partial indexes (`WHERE deleted IS NULL`) also stop serving old queries → seq scans. Do it expand-contract: ship the column and make **all** read paths filter on it first, roll that out everywhere, and only then flip the write path to `softDelete()`. The additive column is fine — it's the read-semantics change that can't run split across versions, and the same applies to any migration where old code must interpret a column it doesn't know about. Seen in PR #14219 (feat: chat core). **Canary doesn't proxy websockets — only broadcasts reach canary users.** Canary is a worker group that *also* has its own app tier (`CANARY_APP_URL`, `IS_CANARY_APP`), sharing prod's Postgres and Redis. The prod app is the ingress and `canaryRoutingMiddleware` HTTP-proxies a platform whose `workerGroupId === 'canary'` to the canary app — but the middleware is registered inside the `/api` scope, so only `/api/*` is proxied (the SPA is served at root from the baked-in bundle) and it bails on upgrades: `if (request.headers.upgrade === 'websocket') return`. A canary platform therefore runs the **prod** frontend, and its websocket is terminated by **prod (old code)** while its HTTP and flow jobs run on canary. Across a version split, server→client broadcasts still work (socket.io's Redis adapter relays canary's `emit` name-agnostically), but inbound handlers — `LOCK_RESOURCE`/`UNLOCK_RESOURCE`, presence — run on old prod code and silently degrade. The fix, verified 2026-07: point canary-platform websockets at the already-live `canary.activepieces.com` by making the frontend socket URL a runtime value from an authenticated `/api` flag (that call *is* proxied, so canary answers `wss://canary.activepieces.com` and prod answers same-origin) and deferring socket creation until it resolves. Cross-origin is fine (`cors:{origin:'*'}`, token in `socket.auth`, not cookies), and it closes the inbound half of the seam too. kamal-proxy can't help — host/path routing only, no cookie/header routing — and `reply.from` is HTTP-only. Canary is the only worker group with a separate app tier; dedicated groups share the prod app, so their users' websockets already hit the right code. Workers are the mirror case: they carry `workerGroupId` in post-upgrade auth but use an explicit `socketUrl`, so canary workers must point at the canary app by config. diff --git a/packages/server/api/src/app/database/migration/postgres/1818000000000-AddCellCascadeIndices.ts b/packages/server/api/src/app/database/migration/postgres/1818000000000-AddCellCascadeIndices.ts new file mode 100644 index 00000000000..396ffb4d66f --- /dev/null +++ b/packages/server/api/src/app/database/migration/postgres/1818000000000-AddCellCascadeIndices.ts @@ -0,0 +1,42 @@ +import { QueryRunner } from 'typeorm' +import { system } from '../../../helper/system/system' +import { AppSystemProp } from '../../../helper/system/system-props' +import { DatabaseType } from '../../database-type' +import { Migration } from '../../migration' + +export class AddCellCascadeIndices1818000000000 implements Migration { + name = 'AddCellCascadeIndices1818000000000' + breaking = false + release = '0.86.4' + transaction = false + + public async up(queryRunner: QueryRunner): Promise { + if (isPGlite()) { + await queryRunner.query(` + CREATE INDEX IF NOT EXISTS "idx_cell_record_id" + ON "cell" ("recordId") + `) + await queryRunner.query(` + CREATE INDEX IF NOT EXISTS "idx_cell_field_id" + ON "cell" ("fieldId") + `) + } + else { + await queryRunner.query(` + CREATE INDEX CONCURRENTLY IF NOT EXISTS "idx_cell_record_id" + ON "cell" ("recordId") + `) + await queryRunner.query(` + CREATE INDEX CONCURRENTLY IF NOT EXISTS "idx_cell_field_id" + ON "cell" ("fieldId") + `) + } + } + + public async down(queryRunner: QueryRunner): Promise { + await queryRunner.query('DROP INDEX IF EXISTS "idx_cell_field_id"') + await queryRunner.query('DROP INDEX IF EXISTS "idx_cell_record_id"') + } +} + +const isPGlite = (): boolean => system.get(AppSystemProp.DB_TYPE) === DatabaseType.PGLITE diff --git a/packages/server/api/src/app/database/postgres-connection.ts b/packages/server/api/src/app/database/postgres-connection.ts index 918b00b2732..1ab49d593ca 100644 --- a/packages/server/api/src/app/database/postgres-connection.ts +++ b/packages/server/api/src/app/database/postgres-connection.ts @@ -407,6 +407,7 @@ import { AddSampleDataFlowIdIndexToFile1815000000000 } from './migration/postgre import { AddTeamsBotInstallation1816000000000 } from './migration/postgres/1816000000000-AddTeamsBotInstallation' import { AddUserChatMemory1817000000000 } from './migration/postgres/1817000000000-AddUserChatMemory' import { AddAutumnBillingColumnsToPlatformPlan1818000000000 } from './migration/postgres/1818000000000-AddAutumnBillingColumnsToPlatformPlan' +import { AddCellCascadeIndices1818000000000 } from './migration/postgres/1818000000000-AddCellCascadeIndices' import { AddFieldPosition1818000000000 } from './migration/postgres/1818000000000-AddFieldPosition' import { AddAgentConversationSource1819000000000 } from './migration/postgres/1819000000000-AddAgentConversationSource' import { DropPieceTags1819000000000 } from './migration/postgres/1819000000000-DropPieceTags' @@ -841,6 +842,7 @@ export const getMigrations = (): (new () => Migration)[] => { AddSampleDataFlowIdIndexToFile1815000000000, AddTeamsBotInstallation1816000000000, AddUserChatMemory1817000000000, + AddCellCascadeIndices1818000000000, AddAutumnBillingColumnsToPlatformPlan1818000000000, AddFieldPosition1818000000000, DropPieceTags1819000000000, diff --git a/packages/server/api/src/app/mcp/tools/ap-delete-records.ts b/packages/server/api/src/app/mcp/tools/ap-delete-records.ts index 90f1196ca5d..ec6420c6c4a 100644 --- a/packages/server/api/src/app/mcp/tools/ap-delete-records.ts +++ b/packages/server/api/src/app/mcp/tools/ap-delete-records.ts @@ -6,6 +6,7 @@ import { recordService } from '../../tables/record/record.service' import { mcpUtils } from './mcp-utils' const deleteRecordsInput = z.object({ + tableId: z.string().describe('ID of the table the records belong to. Use ap_find_records to find it.'), recordIds: z.array(z.string()).describe('Array of record IDs to delete. Use ap_find_records to find them.'), displayName: z.string().optional().describe('Short approval prompt shown to the user (e.g. "Delete 3 records from Emails table"). Must include what the action does and the target name.'), }) @@ -19,21 +20,22 @@ export const apDeleteRecordsTool = (mcp: ProjectScopedMcpServer, log: FastifyBas annotations: { destructiveHint: true, openWorldHint: false }, execute: async (args) => { try { - const { recordIds } = deleteRecordsInput.parse(args) + const { tableId, recordIds } = deleteRecordsInput.parse(args) if (recordIds.length === 0) { return { content: [{ type: 'text', text: '❌ No record IDs provided.' }] } } - const deleted = await recordService.delete({ + const { deletedCount } = await recordService.delete({ ids: recordIds, projectId: mcp.projectId, + tableId, }) return { content: [{ type: 'text', - text: `✅ Deleted ${deleted.length} record(s).`, + text: `✅ Deleted ${deletedCount} record(s).`, }], } } diff --git a/packages/server/api/src/app/tables/record/cell.entity.ts b/packages/server/api/src/app/tables/record/cell.entity.ts index 05c8d57a7d9..6ae7d111336 100644 --- a/packages/server/api/src/app/tables/record/cell.entity.ts +++ b/packages/server/api/src/app/tables/record/cell.entity.ts @@ -34,6 +34,14 @@ export const CellEntity = new EntitySchema({ columns: ['projectId', 'fieldId', 'recordId'], unique: true, }, + { + name: 'idx_cell_record_id', + columns: ['recordId'], + }, + { + name: 'idx_cell_field_id', + columns: ['fieldId'], + }, ], relations: { record: { diff --git a/packages/server/api/src/app/tables/record/record-side-effects.ts b/packages/server/api/src/app/tables/record/record-side-effects.ts index e41aed8de6a..0e590953c43 100644 --- a/packages/server/api/src/app/tables/record/record-side-effects.ts +++ b/packages/server/api/src/app/tables/record/record-side-effects.ts @@ -1,20 +1,57 @@ +import { chunk } from '@activepieces/core-utils' import { PopulatedRecord, TableAutomationTrigger, TableWebhookEventType } from '@activepieces/shared' import { FastifyBaseLogger } from 'fastify' -import { recordService } from './record.service' +import { WebhookFlowVersionToRun, webhookService } from '../../webhooks/webhook.service' +import { tableService } from '../table/table.service' -type BulkSideEffectParams = { - projectId: string - tableId: string - records: PopulatedRecord[] - logger: FastifyBaseLogger - authorization: string - agentUpdate?: boolean -} +export const recordSideEffects = (_log: FastifyBaseLogger) => ({ + async handleRecordsEvent( + params: BulkSideEffectParams, + eventKey: keyof typeof EVENT_TYPE_MAP, + ) { + const { projectId, tableId, records, logger, authorization } = params + if (records.length === 0) { + return + } + const { eventType } = EVENT_TYPE_MAP[eventKey] + + const webhooks = await tableService.getWebhooks({ + projectId, + id: tableId, + events: [eventType], + }) + if (webhooks.length === 0) { + return + } + + const dispatches = records.flatMap((record) => + webhooks.map((webhook) => ({ record, webhook })), + ) + for (const batch of chunk(dispatches, MAX_CONCURRENT_WEBHOOK_DISPATCHES)) { + await Promise.all(batch.map(({ record, webhook }) => + webhookService.handleWebhook({ + async: true, + flowId: webhook.flowId, + flowVersionToRun: WebhookFlowVersionToRun.LOCKED_FALL_BACK_TO_LATEST, + saveSampleData: false, + data: async (_projectId: string) => ({ + method: 'POST', + headers: { + authorization, + }, + body: { record }, + queryParams: {}, + }), + execute: true, + logger, + failParentOnFailure: true, + }), + )) + } + }, +}) - type EventTypeWithAutomation = { - eventType: TableWebhookEventType - automationTrigger?: TableAutomationTrigger - } +const MAX_CONCURRENT_WEBHOOK_DISPATCHES = 50 const EVENT_TYPE_MAP: Record< 'created' | 'updated' | 'deleted', @@ -33,26 +70,16 @@ EventTypeWithAutomation }, } +type EventTypeWithAutomation = { + eventType: TableWebhookEventType + automationTrigger?: TableAutomationTrigger +} -export const recordSideEffects = (_log: FastifyBaseLogger) => ({ - async handleRecordsEvent( - params: BulkSideEffectParams, - eventKey: keyof typeof EVENT_TYPE_MAP, - ) { - const { projectId, tableId, records, logger, authorization } = params - const { eventType } = EVENT_TYPE_MAP[eventKey] - - await Promise.all( - records.map(async (record) => { - await recordService.triggerWebhooks({ - projectId, - tableId, - eventType, - data: { record }, - logger, - authorization, - }) - }), - ) - }, -}) \ No newline at end of file +type BulkSideEffectParams = { + projectId: string + tableId: string + records: PopulatedRecord[] + logger: FastifyBaseLogger + authorization: string + agentUpdate?: boolean +} diff --git a/packages/server/api/src/app/tables/record/record.controller.ts b/packages/server/api/src/app/tables/record/record.controller.ts index cd0685e890b..3811b808a64 100644 --- a/packages/server/api/src/app/tables/record/record.controller.ts +++ b/packages/server/api/src/app/tables/record/record.controller.ts @@ -57,13 +57,14 @@ export const recordController: FastifyPluginAsyncZod = async (fastify) => { }) fastify.delete('/', DeleteRecordRequest, async (request, reply) => { - const deletedRecords = await recordService.delete({ + const { records: deletedRecords } = await recordService.delete({ ids: request.body.ids, projectId: request.projectId, + tableId: request.body.tableId, }) await reply.status(StatusCodes.OK).send([]) await recordSideEffects(fastify.log).handleRecordsEvent({ - tableId: deletedRecords[0]?.tableId, + tableId: request.body.tableId, projectId: request.projectId, records: deletedRecords, logger: request.log, diff --git a/packages/server/api/src/app/tables/record/record.service.ts b/packages/server/api/src/app/tables/record/record.service.ts index 4805b05b3df..408af1a6ca2 100644 --- a/packages/server/api/src/app/tables/record/record.service.ts +++ b/packages/server/api/src/app/tables/record/record.service.ts @@ -6,7 +6,6 @@ import { repoFactory } from '../../core/db/repo-factory' import { transaction } from '../../core/db/transaction' import { system } from '../../helper/system/system' import { AppSystemProp } from '../../helper/system/system-props' -import { WebhookFlowVersionToRun, webhookService } from '../../webhooks/webhook.service' import { FieldEntity } from '../field/field.entity' import { fieldService } from '../field/field.service' import { tableService } from '../table/table.service' @@ -229,102 +228,44 @@ export const recordService = { async delete({ ids, projectId, - }: DeleteParams): Promise { - const firstRecord = await recordRepo().findOne({ - where: { id: ids[0], projectId }, - select: ['tableId'], - }) - if (isNil(firstRecord)) { + tableId, + }: DeleteParams): Promise { + const uniqueIds = [...new Set(ids)] + if (uniqueIds.length === 0) { + return { deletedCount: 0, records: [] } + } + const maxRecordsPerTable = system.getNumberOrThrow(AppSystemProp.MAX_RECORDS_PER_TABLE) + if (uniqueIds.length > maxRecordsPerTable) { throw new ActivepiecesError({ - code: ErrorCode.ENTITY_NOT_FOUND, - params: { entityType: 'Record', entityId: ids[0] }, + code: ErrorCode.VALIDATION, + params: { + message: `Max records per delete request reached: ${maxRecordsPerTable}`, + }, }) } - - const records = await recordRepo().find({ - where: { id: In(ids), projectId, tableId: firstRecord.tableId }, - relations: ['cells'], - }) - - await recordRepo().delete({ - id: In(ids), + const { deletedIds, records } = await deleteRecordsAndReturnWebhookPayloads({ projectId, - tableId: firstRecord.tableId, + tableId, + recordIds: uniqueIds, }) - - if (records.length === 0) { - return [] + if (deletedIds.length === 0) { + throw new ActivepiecesError({ + code: ErrorCode.ENTITY_NOT_FOUND, + params: { entityType: 'Record', entityId: uniqueIds[0] }, + }) + } + return { + deletedCount: deletedIds.length, + records, } - - return formatRecordsAndFetchField({ records, tableId: firstRecord.tableId, projectId }) }, async deleteAll({ tableId, projectId, }: DeleteAllParams): Promise { - const deletedRecords = await transaction(async (entityManager: EntityManager) => { - const records = await entityManager.getRepository(RecordEntity).find({ - where: { projectId, tableId }, - relations: ['cells'], - }) - - const recordIds = records.map((record) => record.id) - - if (recordIds.length > 0) { - await entityManager.getRepository(RecordEntity).delete({ - id: In(recordIds), - projectId, - tableId, - }) - } - - return records - }) - - if (deletedRecords.length === 0) { - return [] - } - - return formatRecordsAndFetchField({ records: deletedRecords, tableId, projectId }) - }, - - async triggerWebhooks({ - projectId, - tableId, - eventType, - data, - logger, - authorization, - }: TriggerWebhooksParams): Promise { - const webhooks = await tableService.getWebhooks({ - projectId, - id: tableId, - events: [eventType], - }) - - if (webhooks.length === 0) { - return - } - await Promise.all(webhooks.map((webhook) => { - return webhookService.handleWebhook({ - async: true, - flowId: webhook.flowId, - flowVersionToRun: WebhookFlowVersionToRun.LOCKED_FALL_BACK_TO_LATEST, - saveSampleData: false, - data: async (_projectId: string) => ({ - method: 'POST', - headers: { - authorization, - }, - body: data, - queryParams: {}, - }), - execute: true, - logger, - failParentOnFailure: true, - }) - })) + const { records } = await deleteRecordsAndReturnWebhookPayloads({ projectId, tableId }) + return records }, async count({ projectId, tableId }: CountParams): Promise { @@ -380,7 +321,78 @@ function prepareCellInsertions( ) } +async function loadRecordsForDeleteWebhook({ + projectId, + tableId, + recordIds, +}: { + projectId: string + tableId: string + recordIds?: string[] +}): Promise { + const webhooks = await tableService.getWebhooks({ + projectId, + id: tableId, + events: [TableWebhookEventType.RECORD_DELETED], + }) + if (webhooks.length === 0) { + return [] + } + return recordRepo().find({ + where: isNil(recordIds) ? { projectId, tableId } : { id: In(recordIds), projectId, tableId }, + relations: ['cells'], + }) +} + +async function deleteRecordsReturningIds({ + projectId, + tableId, + recordIds, +}: { + projectId: string + tableId: string + recordIds?: string[] +}): Promise { + const result = await recordRepo() + .createQueryBuilder() + .delete() + .where(isNil(recordIds) ? { projectId, tableId } : { id: In(recordIds), projectId, tableId }) + .returning('id') + .execute() + const deletedRows: unknown = result.raw + if (!Array.isArray(deletedRows)) { + return [] + } + return deletedRows.filter(isRowWithId).map((row) => row.id) +} + +function isRowWithId(row: unknown): row is { id: string } { + return typeof row === 'object' && !isNil(row) && typeof Reflect.get(row, 'id') === 'string' +} + +async function deleteRecordsAndReturnWebhookPayloads({ + projectId, + tableId, + recordIds, +}: { + projectId: string + tableId: string + recordIds?: string[] +}): Promise<{ deletedIds: string[], records: PopulatedRecord[] }> { + const snapshot = await loadRecordsForDeleteWebhook({ projectId, tableId, recordIds }) + const deletedIds = await deleteRecordsReturningIds({ projectId, tableId, recordIds }) + const deletedIdSet = new Set(deletedIds) + const deletedRecords = snapshot.filter((record) => deletedIdSet.has(record.id)) + return { + deletedIds, + records: await formatRecordsAndFetchField({ records: deletedRecords, tableId, projectId }), + } +} + async function formatRecordsAndFetchField({ records, tableId, projectId, fields: prefetchedFields }: { records: RecordSchema[], tableId: string, projectId: string, fields?: Field[] }): Promise { + if (records.length === 0) { + return [] + } const fields = prefetchedFields ?? await fieldService.getAll({ tableId, projectId, @@ -512,6 +524,12 @@ type UpdateParams = { type DeleteParams = { ids: string[] projectId: string + tableId: string +} + +type DeleteRecordsResult = { + deletedCount: number + records: PopulatedRecord[] } type DeleteAllParams = { @@ -519,14 +537,6 @@ type DeleteAllParams = { projectId: string } -type TriggerWebhooksParams = { - projectId: string - tableId: string - eventType: TableWebhookEventType - data: Record - logger: FastifyBaseLogger - authorization: string -} type CountParams = { projectId: string tableId: string diff --git a/packages/server/api/test/integration/ce/tables/record.test.ts b/packages/server/api/test/integration/ce/tables/record.test.ts index a1a0f366b3d..78f9eaca534 100644 --- a/packages/server/api/test/integration/ce/tables/record.test.ts +++ b/packages/server/api/test/integration/ce/tables/record.test.ts @@ -531,6 +531,90 @@ describe('Record API', () => { expect(response?.statusCode).toBe(StatusCodes.NOT_FOUND) }) + + it('should delete existing records when the first id does not exist', async () => { + const ctx = await setup() + const { table } = await createTableWithField(ctx) + const record1 = createMockRecord({ tableId: table.id, projectId: ctx.project.id }) + const record2 = createMockRecord({ tableId: table.id, projectId: ctx.project.id }) + await db.save('record', [record1, record2]) + + const response = await ctx.inject({ + method: 'DELETE', + url: '/api/v1/records', + body: { + tableId: table.id, + ids: [apId(), record1.id, record2.id], + }, + }) + + expect(response?.statusCode).toBe(StatusCodes.OK) + const getResponse1 = await ctx.get(`/v1/records/${record1.id}`) + expect(getResponse1?.statusCode).toBe(StatusCodes.NOT_FOUND) + const getResponse2 = await ctx.get(`/v1/records/${record2.id}`) + expect(getResponse2?.statusCode).toBe(StatusCodes.NOT_FOUND) + }) + + it('should delete more records than one batch in a single request', async () => { + const ctx = await setup() + const { table } = await createTableWithField(ctx) + const records = Array.from({ length: 120 }, () => + createMockRecord({ tableId: table.id, projectId: ctx.project.id }), + ) + await db.save('record', records) + + const response = await ctx.inject({ + method: 'DELETE', + url: '/api/v1/records', + body: { + tableId: table.id, + ids: records.map((record) => record.id), + }, + }) + + expect(response?.statusCode).toBe(StatusCodes.OK) + const listResponse = await ctx.get(`/v1/records?tableId=${table.id}`) + expect(listResponse?.statusCode).toBe(StatusCodes.OK) + expect(listResponse?.json().data.length).toBe(0) + }) + + it('should reject a delete request with more ids than the per-table record limit', async () => { + const ctx = await setup() + const { table } = await createTableWithField(ctx) + + const response = await ctx.inject({ + method: 'DELETE', + url: '/api/v1/records', + body: { + tableId: table.id, + ids: Array.from({ length: 10001 }, () => apId()), + }, + }) + + expect(response?.statusCode).toBe(StatusCodes.CONFLICT) + }) + + it('should not delete records that belong to another table', async () => { + const ctx = await setup() + const { table } = await createTableWithField(ctx) + const otherTable = await createTableWithField(ctx) + const record = createMockRecord({ tableId: table.id, projectId: ctx.project.id }) + const otherRecord = createMockRecord({ tableId: otherTable.table.id, projectId: ctx.project.id }) + await db.save('record', [record, otherRecord]) + + const response = await ctx.inject({ + method: 'DELETE', + url: '/api/v1/records', + body: { + tableId: table.id, + ids: [record.id, otherRecord.id], + }, + }) + + expect(response?.statusCode).toBe(StatusCodes.OK) + expect((await ctx.get(`/v1/records/${record.id}`))?.statusCode).toBe(StatusCodes.NOT_FOUND) + expect((await ctx.get(`/v1/records/${otherRecord.id}`))?.statusCode).toBe(StatusCodes.OK) + }) }) }) From c36f5c9e7c503dc25a775ee66f9726a86e46178d Mon Sep 17 00:00:00 2001 From: Kishan Parmar <135701940+kishanprmr@users.noreply.github.com> Date: Sun, 23 Aug 2026 19:34:43 +0530 Subject: [PATCH 5/5] docs: fix outdated content in Build Pieces section (#14986) --- .../building-pieces/create-action.mdx | 4 +- .../building-pieces/create-trigger.mdx | 2 +- .../building-pieces/development-setup.mdx | 4 +- .../building-pieces/piece-definition.mdx | 2 + .../building-pieces/setup-fork.mdx | 2 +- docs/build-pieces/misc/bundling-pieces.mdx | 18 ++--- .../build-pieces/misc/migrate-nx-to-turbo.mdx | 14 ++-- .../misc/migrate-pieces-to-bundles.mdx | 10 +-- .../piece-reference/ai-metadata.mdx | 18 ++--- .../build-pieces/piece-reference/examples.mdx | 8 +++ .../piece-reference/external-libraries.mdx | 4 +- docs/build-pieces/piece-reference/files.mdx | 2 +- .../piece-reference/flow-control.mdx | 18 ++--- .../piece-reference/large-file-streaming.mdx | 44 ++++++------ .../piece-reference/output-schema.mdx | 6 +- .../piece-reference/piece-versioning.mdx | 7 +- .../piece-reference/properties.mdx | 14 ++-- .../triggers/webhook-trigger.mdx | 66 +++++++++++++++++- .../build-pieces/sharing-pieces/community.mdx | 2 +- docs/build-pieces/sharing-pieces/private.mdx | 2 +- .../development-setup_codespaces.png | Bin 183319 -> 145443 bytes .../resources/screenshots/fork-repository.jpg | Bin 55440 -> 0 bytes .../resources/screenshots/fork-repository.png | Bin 0 -> 64950 bytes docs/resources/screenshots/install-piece.png | Bin 138765 -> 185980 bytes 24 files changed, 161 insertions(+), 86 deletions(-) delete mode 100644 docs/resources/screenshots/fork-repository.jpg create mode 100644 docs/resources/screenshots/fork-repository.png diff --git a/docs/build-pieces/building-pieces/create-action.mdx b/docs/build-pieces/building-pieces/create-action.mdx index 034cf7f0c55..435f851b40d 100755 --- a/docs/build-pieces/building-pieces/create-action.mdx +++ b/docs/build-pieces/building-pieces/create-action.mdx @@ -54,7 +54,7 @@ export const getIcecreamFlavor = createAction({ method: HttpMethod.GET, url: 'https://cloud.activepieces.com/api/v1/webhooks/RGjv57ex3RAHOgs0YK6Ja/sync', headers: { - Authorization: context.auth, // Pass API key in headers + Authorization: context.auth.secret_text, // Pass API key in headers }, }); return res.body; @@ -73,7 +73,7 @@ The `run` function is the function that is called when the action is executed. I The `run` function utilizes the httpClient.sendRequest function to make a GET request, fetching a random ice cream flavor. It incorporates API key authentication in the request headers. Finally, it returns the response body. -You can describe how an action's output is presented in the builder — including readable labels for outputs keyed by opaque IDs or returned as arrays — by declaring an [Output Schema](/build-pieces/piece-reference/output-schema). +You can describe how an action's output is presented in the builder, including readable labels for outputs keyed by opaque IDs or returned as arrays, by declaring an [Output Schema](/build-pieces/piece-reference/output-schema). ## Expose The Definition diff --git a/docs/build-pieces/building-pieces/create-trigger.mdx b/docs/build-pieces/building-pieces/create-trigger.mdx index c737097215a..92ea576c259 100644 --- a/docs/build-pieces/building-pieces/create-trigger.mdx +++ b/docs/build-pieces/building-pieces/create-trigger.mdx @@ -61,7 +61,7 @@ const polling: Polling< method: HttpMethod.GET, url: 'https://cloud.activepieces.com/api/v1/webhooks/aHlEaNLc6vcF1nY2XJ2ed/sync', headers: { - authorization: auth, + authorization: auth.secret_text, }, }; const res = await httpClient.sendRequest(request); diff --git a/docs/build-pieces/building-pieces/development-setup.mdx b/docs/build-pieces/building-pieces/development-setup.mdx index c3a3cfd9014..f8911fa41a8 100644 --- a/docs/build-pieces/building-pieces/development-setup.mdx +++ b/docs/build-pieces/building-pieces/development-setup.mdx @@ -5,7 +5,7 @@ icon: 'circle-2' ## Prerequisites -- Node.js v18+ +- Node.js v22.15+ or v24 - npm v9+ ## Instructions @@ -18,7 +18,7 @@ node tools/setup-dev.js 2. Start the environment -This command will start activepieces with sqlite3 and in memory queue. +This command will start activepieces with PGLite and an in-memory queue. ```bash npm start diff --git a/docs/build-pieces/building-pieces/piece-definition.mdx b/docs/build-pieces/building-pieces/piece-definition.mdx index 1295d588ba2..0d22515c951 100755 --- a/docs/build-pieces/building-pieces/piece-definition.mdx +++ b/docs/build-pieces/building-pieces/piece-definition.mdx @@ -42,8 +42,10 @@ import { PieceAuth, createPiece } from '@activepieces/pieces-framework'; export const gelato = createPiece({ displayName: 'Gelato', + description: '', logoUrl: 'https://cdn.activepieces.com/pieces/gelato.png', auth: PieceAuth.None(), + minimumSupportedRelease: '0.36.1', authors: [], actions: [], triggers: [], diff --git a/docs/build-pieces/building-pieces/setup-fork.mdx b/docs/build-pieces/building-pieces/setup-fork.mdx index 7fef06325b8..258f621b0ea 100644 --- a/docs/build-pieces/building-pieces/setup-fork.mdx +++ b/docs/build-pieces/building-pieces/setup-fork.mdx @@ -13,7 +13,7 @@ If you are on windows, please install [WSL](https://learn.microsoft.com/en-us/wi 1. Go to the repository page at https://github.com/activepieces/activepieces. 2. Click the `Fork` button located in the top right corner of the page. -![Fork Repository](/resources/screenshots/fork-repository.jpg) +![Fork Repository](/resources/screenshots/fork-repository.png) 3. Clone your fork using a shallow clone for faster setup: diff --git a/docs/build-pieces/misc/bundling-pieces.mdx b/docs/build-pieces/misc/bundling-pieces.mdx index f12bf1663d1..2ff310170f1 100644 --- a/docs/build-pieces/misc/bundling-pieces.mdx +++ b/docs/build-pieces/misc/bundling-pieces.mdx @@ -5,15 +5,15 @@ icon: 'cube' Activepieces builds every piece into a **self-contained bundle**. Instead of shipping a piece that depends on `@activepieces/shared`, `@activepieces/pieces-framework`, `@activepieces/pieces-common`, and the `@activepieces/core-*` packages at install time, the build inlines all of that code into a single artifact. -This is what lets the engine provision a piece by downloading **one artifact** — no `bun install` / `npm install` of a dependency tree at runtime. +This is what lets the engine provision a piece by downloading **one artifact**, with no `bun install` / `npm install` of a dependency tree at runtime. ### What gets bundled When a piece is built for publishing, the bundler: -- **Inlines all `@activepieces/*` workspace libraries** (`shared`, `pieces-framework`, `pieces-common`, `core-utils`, `core-piece-types`, …) directly into the bundle. These libraries are **never published to npm** — they only exist as part of each piece's bundle. +- **Inlines all `@activepieces/*` workspace libraries** (`shared`, `pieces-framework`, `pieces-common`, `core-utils`, `core-piece-types`, …) directly into the bundle. These libraries are **never published to npm**; they only exist as part of each piece's bundle. - **Inlines third-party dependencies** (e.g. an SDK the piece imports) into the same bundle. -- **Keeps a small allow-list of deps external** only when they genuinely cannot be inlined — native addons or packages that use dynamic `require`. These remain in the published `dependencies` so the runtime installer resolves them. +- **Keeps a small allow-list of deps external** only when they genuinely cannot be inlined: native addons or packages that use dynamic `require`. These remain in the published `dependencies` so the runtime installer resolves them. The result is typically **~2–3× smaller** than the raw inputs, and the published `package.json` lists only the few unavoidable external deps (e.g. `tslib`). @@ -33,7 +33,7 @@ After bundling, the piece's `dist/package.json` is rewritten: } ``` -No `@activepieces/*` dependency appears — installing the piece never requires those packages to exist on the registry. +No `@activepieces/*` dependency appears, so installing the piece never requires those packages to exist on the registry. ### Forcing a dependency to stay external @@ -48,7 +48,7 @@ If a dependency must not be inlined (for example a native module), add it to a ` ### Files loaded at runtime (forked processes) -A file your piece loads by path at runtime — for example `child_process.fork(path.join(__dirname, 'runner.js'))` — is invisible to the bundler's import graph, so by default it would not exist in the published package. Declare it in `bundleForkedEntries`: +A file your piece loads by path at runtime (for example `child_process.fork(path.join(__dirname, 'runner.js'))`) is invisible to the bundler's import graph, so by default it would not exist in the published package. Declare it in `bundleForkedEntries`: ```jsonc { @@ -57,7 +57,7 @@ A file your piece loads by path at runtime — for example `child_process.fork(p } ``` -Each declared entry is bundled on its own and emitted **next to the main bundle** at `src/.js` — which is where `path.join(__dirname, '.js')` resolves at runtime, since the bundled parent code lives at `src/index.js`. Dependencies that only the forked file imports (e.g. `oracledb`) are still captured into the published `dependencies`. +Each declared entry is bundled on its own and emitted **next to the main bundle** at `src/.js`, which is where `path.join(__dirname, '.js')` resolves at runtime, since the bundled parent code lives at `src/index.js`. Dependencies that only the forked file imports (e.g. `oracledb`) are still captured into the published `dependencies`. The bundler **fails the build** if piece code uses `__dirname` without declaring any `bundleForkedEntries`, because such code breaks silently after publishing. @@ -65,7 +65,7 @@ The bundler **fails the build** if piece code uses `__dirname` without declaring Bundling happens automatically when you build or publish a piece: -- `npm run build-piece ` — builds and packs the bundle into a `.tgz` (see [Build Custom Pieces](./build-piece)). -- `npm run publish-piece-to-api` — bundles and uploads the piece to a platform (see [Publish Custom Pieces](./publish-piece)). +- `npm run build-piece `: builds and packs the bundle into a `.tgz` (see [Build Custom Pieces](./build-piece)). +- `npm run publish-piece-to-api`: bundles and uploads the piece to a platform (see [Publish Custom Pieces](./publish-piece)). -You don't need to configure anything for bundling — it is the default behavior. +You don't need to configure anything for bundling; it is the default behavior. diff --git a/docs/build-pieces/misc/migrate-nx-to-turbo.mdx b/docs/build-pieces/misc/migrate-nx-to-turbo.mdx index 46ce603cfcf..1bf9f5d9d22 100644 --- a/docs/build-pieces/misc/migrate-nx-to-turbo.mdx +++ b/docs/build-pieces/misc/migrate-nx-to-turbo.mdx @@ -23,9 +23,9 @@ The Activepieces monorepo replaced [Nx](https://nx.dev) with [Turbo](https://tur ### Files affected per piece -- **`project.json`** — Deleted (no longer needed) -- **`package.json`** — Added `build` and `lint` scripts, added `main` and `types` fields, added workspace dependencies -- **`tsconfig.lib.json`** — Updated `outDir`, added `rootDir`, `baseUrl`, `paths` +- **`project.json`**: Deleted (no longer needed) +- **`package.json`**: Added `build` and `lint` scripts, added `main` and `types` fields, added workspace dependencies +- **`tsconfig.lib.json`**: Updated `outDir`, added `rootDir`, `baseUrl`, `paths` ## Automatic Migration @@ -49,10 +49,10 @@ npx ts-node tools/scripts/migrate-custom-piece-to-turbo.ts packages/pieces/custo For each piece, the script: -1. **Updates `package.json`** — adds `build` and `lint` scripts, sets `main` and `types` entry points, ensures `@activepieces/pieces-framework`, `@activepieces/shared`, and `tslib` are listed as dependencies -2. **Updates `tsconfig.lib.json`** — sets `outDir` to `./dist`, adds `rootDir`, `baseUrl`, `paths`, and `declaration` settings -3. **Creates `tsconfig.json`** if missing — extends the root `tsconfig.base.json` -4. **Deletes `project.json`** — removes Nx configuration +1. **Updates `package.json`**: adds `build` and `lint` scripts, sets `main` and `types` entry points, ensures `@activepieces/pieces-framework`, `@activepieces/shared`, and `tslib` are listed as dependencies +2. **Updates `tsconfig.lib.json`**: sets `outDir` to `./dist`, adds `rootDir`, `baseUrl`, `paths`, and `declaration` settings +3. **Creates `tsconfig.json`** if missing, extending the root `tsconfig.base.json` +4. **Deletes `project.json`**, removing the Nx configuration ## Verify the Migration diff --git a/docs/build-pieces/misc/migrate-pieces-to-bundles.mdx b/docs/build-pieces/misc/migrate-pieces-to-bundles.mdx index 7a8f5658822..8c01109a3b9 100644 --- a/docs/build-pieces/misc/migrate-pieces-to-bundles.mdx +++ b/docs/build-pieces/misc/migrate-pieces-to-bundles.mdx @@ -4,10 +4,10 @@ icon: 'boxes-stacked' --- -This applies to forks with custom pieces created before pieces moved to self-contained bundles. Pieces created with `npm run cli pieces create` already use the bundle model — nothing to do. +This applies to forks with custom pieces created before pieces moved to self-contained bundles. Pieces created with `npm run cli pieces create` already use the bundle model, so there's nothing to do. -Activepieces builds each piece into a single self-contained bundle — see [Bundling Pieces](./bundling-pieces) for how that works. If you maintain custom pieces from before this change, update them so they conform to the new model. +Activepieces builds each piece into a single self-contained bundle (see [Bundling Pieces](./bundling-pieces) for how that works). If you maintain custom pieces from before this change, update them so they conform to the new model. ## What changed @@ -33,7 +33,7 @@ npm run cli -- pieces migrate ``` - Pass `--all` to migrate every piece under `packages/pieces`. -- It is idempotent — re-running it on an already-migrated piece makes no changes. +- It is idempotent: re-running it on an already-migrated piece makes no changes. Then build the piece to verify: @@ -41,7 +41,7 @@ Then build the piece to verify: npm run build-piece ``` -To migrate by hand — or to see exactly what the command changes — follow the steps below. +To migrate by hand, or to see exactly what the command changes, follow the steps below. ## What it changes (or migrate by hand) @@ -61,7 +61,7 @@ If a symbol isn't re-exported by the framework, it was server-only and shouldn't -Remove `@activepieces/shared` and move `tslib` to `devDependencies`. Add `@activepieces/core-piece-types` and `@activepieces/core-utils` — these are build-time only (they let `tsc` emit portable type declarations; your source never imports them directly). Add the `bundle` script. +Remove `@activepieces/shared` and move `tslib` to `devDependencies`. Add `@activepieces/core-piece-types` and `@activepieces/core-utils`, which are build-time only (they let `tsc` emit portable type declarations; your source never imports them directly). Add the `bundle` script. ```jsonc { diff --git a/docs/build-pieces/piece-reference/ai-metadata.mdx b/docs/build-pieces/piece-reference/ai-metadata.mdx index 6029473d641..867a7d8f161 100644 --- a/docs/build-pieces/piece-reference/ai-metadata.mdx +++ b/docs/build-pieces/piece-reference/ai-metadata.mdx @@ -4,7 +4,7 @@ icon: "robot" description: "Make your piece's actions and triggers discoverable and safe for AI agents" --- -Every action and trigger you build is also an AI tool: agents connected through the [MCP server](/mcp/overview) discover piece actions and execute them directly. Two optional fields control how your piece appears to agents — `aiMetadata` describes the operation in agent terms, and `audience` controls which surfaces an action shows up in. Both are additive: omitting them leaves the piece behaving exactly as before. +Every action and trigger you build is also an AI tool: agents connected through the [MCP server](/mcp/overview) discover piece actions and execute them directly. Two optional fields control how your piece appears to agents: `aiMetadata` describes the operation in agent terms, and `audience` controls which surfaces an action shows up in. Both are additive: omitting them leaves the piece behaving exactly as before. ## aiMetadata @@ -12,14 +12,14 @@ Available on both actions and triggers: ```typescript aiMetadata: { - description: string, // optional — agent-oriented description - idempotent: boolean, // optional — is repeating the call with the same input safe? + description: string, // optional, agent-oriented description + idempotent: boolean, // optional, is repeating the call with the same input safe? } ``` **`description`** is written for an agent, not for the UI. The regular `description` stays a short label under the action name in the builder; `aiMetadata.description` can be a full paragraph that states what the operation does, its notable options and constraints, and how it differs from sibling actions ("Use *Send Message To A User* for a private DM"). This text feeds the [tool search](/mcp/tool-search) index, so a precise description directly improves whether agents find your action. -**`idempotent`** declares whether calling the operation twice with the same input is safe. Reads, upserts, and set-value operations are idempotent; anything that creates, sends, or appends on every call is not. The value is exposed to agents and MCP clients as metadata that informs whether a retry is safe — it does not by itself prevent or trigger retries. +**`idempotent`** declares whether calling the operation twice with the same input is safe. Reads, upserts, and set-value operations are idempotent; anything that creates, sends, or appends on every call is not. The value is exposed to agents and MCP clients as metadata that informs whether a retry is safe; it does not by itself prevent or trigger retries. ```typescript import { createAction } from '@activepieces/pieces-framework'; @@ -46,7 +46,7 @@ export const createTask = createAction({ ## audience -Available on actions only (triggers have no audience — they always start flows, which both humans and agents build): +Available on actions only (triggers have no audience: they always start flows, which both humans and agents build): ```typescript audience: 'human' | 'ai' | 'both' @@ -58,10 +58,10 @@ audience: 'human' | 'ai' | 'both' | `human` | Shown | Hidden from agent discovery | | `ai` | Hidden from the piece selector | Shown | -Mark an action `human` when it only makes sense with the builder around it — for example the generic custom API call, or composite actions whose inputs assume a person picking from dropdowns. Mark an action `ai` for atomic operations added specifically for agents that would clutter the human piece selector. +Mark an action `human` when it only makes sense with the builder around it, for example the generic custom API call, or composite actions whose inputs assume a person picking from dropdowns. Mark an action `ai` for atomic operations added specifically for agents that would clutter the human piece selector. -`audience` is a discovery filter, not a permission. It controls which catalogs an action appears in — it does not prevent execution, so don't rely on it to keep a dangerous action away from agents. +`audience` is a discovery filter, not a permission. It controls which catalogs an action appears in; it does not prevent execution, so don't rely on it to keep a dangerous action away from agents. ## Writing actions agents can use well @@ -69,6 +69,6 @@ Mark an action `human` when it only makes sense with the builder around it — f Agents work best with actions that behave like clean API calls: - **Atomic over composite.** One action should map to one capability with explicit inputs. Agents compose multi-step work themselves, so a focused *Create Task* beats a *Create Task and Notify Channel*. -- **Explicit inputs.** Every behavior should be reachable through a documented prop — agents fill inputs from the [property schema](/build-pieces/piece-reference/properties), not from a UI. +- **Explicit inputs.** Every behavior should be reachable through a documented prop; agents fill inputs from the [property schema](/build-pieces/piece-reference/properties), not from a UI. - **Describe the output.** Pair the action with an [output schema](/build-pieces/piece-reference/output-schema) so both the data selector and agents know the shape of what comes back. -- **Disambiguate in `aiMetadata.description`.** When a piece has several similar actions, say which one to use when — that sentence is often what decides which action the search returns. +- **Disambiguate in `aiMetadata.description`.** When a piece has several similar actions, say which one to use when: that sentence is often what decides which action the search returns. diff --git a/docs/build-pieces/piece-reference/examples.mdx b/docs/build-pieces/piece-reference/examples.mdx index 1039f9ca2ab..c639449733f 100755 --- a/docs/build-pieces/piece-reference/examples.mdx +++ b/docs/build-pieces/piece-reference/examples.mdx @@ -10,6 +10,7 @@ To get the full benefit, it is recommended to read the tutorial first. **Webhooks:** - [New Form Submission on Typeform](https://github.com/activepieces/activepieces/blob/main/packages/pieces/community/typeform/src/lib/trigger/new-submission.ts) +- [New Event on Okta (with Handshake Configuration)](https://github.com/activepieces/activepieces/blob/main/packages/pieces/community/okta/src/lib/triggers/new-event.ts) **Polling:** - [New Completed Task On Todoist](https://github.com/activepieces/activepieces/blob/main/packages/pieces/community/todoist/src/lib/triggers/task-completed-trigger.ts) @@ -29,3 +30,10 @@ To get the full benefit, it is recommended to read the tutorial first. **Basic Authentication:** - [Twilio](https://github.com/activepieces/activepieces/blob/main/packages/pieces/community/twilio/src/index.ts) + +**Custom Auth:** +- [Kimai](https://github.com/activepieces/activepieces/blob/main/packages/pieces/community/kimai/src/index.ts) + +**Custom Auth with Token Refresh:** +- [Umami](https://github.com/activepieces/activepieces/blob/main/packages/pieces/community/umami/src/lib/auth.ts) +- [OmniHR](https://github.com/activepieces/activepieces/blob/main/packages/pieces/community/omnihr/src/lib/auth.ts) diff --git a/docs/build-pieces/piece-reference/external-libraries.mdx b/docs/build-pieces/piece-reference/external-libraries.mdx index 9087cc33951..70034b13578 100644 --- a/docs/build-pieces/piece-reference/external-libraries.mdx +++ b/docs/build-pieces/piece-reference/external-libraries.mdx @@ -4,7 +4,7 @@ icon: 'npm' description: "Learn how to install and use external libraries." --- -The Activepieces repository is structured as a monorepo, employing Nx as its build tool. +The Activepieces repository is structured as a monorepo, employing Turbo as its build tool. To keep our main `package.json` as light as possible, we keep libraries that are only used for a piece in the piece `package.json` . This means when adding a new library you should navigate to the piece folder and install the library with our package manager `bun` @@ -21,7 +21,7 @@ Guidelines: ## Dependency Pinning -When pieces are built for publishing, all dependency versions — including **transitive dependencies** (dependencies of your dependencies) — are automatically pinned to the exact versions resolved in the monorepo's `bun.lock` file. +When pieces are built for publishing, all dependency versions, including **transitive dependencies** (dependencies of your dependencies), are automatically pinned to the exact versions resolved in the monorepo's `bun.lock` file. This means: - You don't need to worry about manually pinning transitive dependency versions. diff --git a/docs/build-pieces/piece-reference/files.mdx b/docs/build-pieces/piece-reference/files.mdx index bfc9f248f7b..bc6ef4efe9d 100644 --- a/docs/build-pieces/piece-reference/files.mdx +++ b/docs/build-pieces/piece-reference/files.mdx @@ -20,7 +20,7 @@ const fileReference = await files.write({ For large files, pass a `Readable` instead of a `Buffer` so the file streams to storage -without being held in memory — see [Large File Streaming](./large-file-streaming). +without being held in memory. See [Large File Streaming](./large-file-streaming). diff --git a/docs/build-pieces/piece-reference/flow-control.mdx b/docs/build-pieces/piece-reference/flow-control.mdx index 68f62139849..e679d455040 100644 --- a/docs/build-pieces/piece-reference/flow-control.mdx +++ b/docs/build-pieces/piece-reference/flow-control.mdx @@ -4,7 +4,7 @@ icon: 'Joystick' description: 'Learn how to control flow execution from inside a piece' --- -Flow Controls let an action change the shape of the run — stop it early, send an intermediate HTTP response, or **pause the flow and resume later** when an external signal arrives. All of these are exposed on the `ctx` parameter of the action's `run` method. +Flow Controls let an action change the shape of the run: stop it early, send an intermediate HTTP response, or **pause the flow and resume later** when an external signal arrives. All of these are exposed on the `ctx` parameter of the action's `run` method. ## Stop Flow @@ -30,9 +30,9 @@ context.run.stop(); ## Pause with a waitpoint -A **waitpoint** is a durable checkpoint: the run is marked `PAUSED`, its execution state is persisted, and the action will be invoked a second time once the waitpoint is resumed. Waitpoints survive worker restarts — see [Durable Execution](/install/architecture/durable-execution) for the full model. +A **waitpoint** is a durable checkpoint: the run is marked `PAUSED`, its execution state is persisted, and the action will be invoked a second time once the waitpoint is resumed. Waitpoints survive worker restarts; see [Durable Execution](/install/architecture/durable-execution) for the full model. -The same action runs twice — once to create the waitpoint, once to read the resume payload — so every pausing action branches on `ctx.executionType`: +The same action runs twice (once to create the waitpoint, once to read the resume payload), so every pausing action branches on `ctx.executionType`: ```typescript import { ExecutionType } from '@activepieces/shared'; @@ -41,7 +41,7 @@ async run(ctx) { if (ctx.executionType === ExecutionType.BEGIN) { // First invocation: create the waitpoint and pause. // A real WEBHOOK waitpoint must surface waitpoint.buildResumeUrl(...) to - // the outside world — see the "Wait for a webhook callback" section below. + // the outside world, see the "Wait for a webhook callback" section below. const waitpoint = await ctx.run.createWaitpoint({ type: 'WEBHOOK' }); ctx.run.waitForWaitpoint(waitpoint.id); return {}; @@ -58,14 +58,14 @@ async run(ctx) { Two hooks do the work: -- `ctx.run.createWaitpoint({ type, ... })` — registers the waitpoint on the server and returns `{ id, resumeUrl, buildResumeUrl }`. -- `ctx.run.waitForWaitpoint(waitpointId)` — tells the engine the step's verdict is `paused`; the run transitions to `PAUSED` after the action returns. +- `ctx.run.createWaitpoint({ type, ... })`: registers the waitpoint on the server and returns `{ id, resumeUrl, buildResumeUrl }`. +- `ctx.run.waitForWaitpoint(waitpointId)`: tells the engine the step's verdict is `paused`; the run transitions to `PAUSED` after the action returns. There are two waitpoint types. ### Wait for a webhook callback -Create a `WEBHOOK` waitpoint and expose its resume URL — the flow will resume whenever that URL is called. +Create a `WEBHOOK` waitpoint and expose its resume URL. The flow will resume whenever that URL is called. ```typescript async run(ctx) { @@ -93,7 +93,7 @@ async run(ctx) { ### Respond immediately and wait for the next webhook -Pause the flow **and** immediately reply to the webhook trigger — useful for "we got your submission, we'll call you back" patterns. Pass `responseToSend` and your HTTP response is sent right away; the flow then sits paused until the returned URL is called. +Pause the flow **and** immediately reply to the webhook trigger, useful for "we got your submission, we'll call you back" patterns. Pass `responseToSend` and your HTTP response is sent right away; the flow then sits paused until the returned URL is called. ```typescript async run(ctx) { @@ -159,7 +159,7 @@ ctx.resumePayload.headers // HTTP headers from the webhook caller ctx.resumePayload.queryParams // parsed ?foo=bar query string ``` -For `DELAY` waitpoints there is no incoming HTTP request, so the payload is empty — use the `RESUME` branch simply to produce the step's final output. +For `DELAY` waitpoints there is no incoming HTTP request, so the payload is empty. Use the `RESUME` branch simply to produce the step's final output. **Deprecated:** older pieces use `ctx.run.pause({ pauseMetadata: { type: PauseType.WEBHOOK | PauseType.DELAY, ... } })` together with `ctx.generateResumeUrl(...)`. That V0 API is kept for backwards compatibility with in-flight paused runs and will be removed. New actions must use `ctx.run.createWaitpoint` + `ctx.run.waitForWaitpoint`. diff --git a/docs/build-pieces/piece-reference/large-file-streaming.mdx b/docs/build-pieces/piece-reference/large-file-streaming.mdx index 9e9d1bb52d8..a5db6f163b6 100644 --- a/docs/build-pieces/piece-reference/large-file-streaming.mdx +++ b/docs/build-pieces/piece-reference/large-file-streaming.mdx @@ -4,8 +4,8 @@ icon: 'water' description: "Move large files through a flow without buffering them in memory" --- -Large file streaming lets a piece process a big file by passing it through as a stream — -transferring the bytes a chunk at a time — instead of loading the whole file into memory +Large file streaming lets a piece process a big file by passing it through as a stream, +transferring the bytes a chunk at a time, instead of loading the whole file into memory first. It is useful when a file is too large to hold in RAM at either the source or the destination. Because the file is never fully buffered, a flow can move files far larger than the worker's memory budget. @@ -13,19 +13,19 @@ than the worker's memory budget. ## Why it matters A worker runs your piece code inside a sandbox with a bounded memory budget (about 1 GB, -minus overhead — see [Limits](/install/reference/limits)). Reading a large file into a +minus overhead, see [Limits](/install/reference/limits)). Reading a large file into a `Buffer` holds the entire file in that budget at once, so a big enough file exhausts the memory and the worker is OOM-killed. Streaming avoids this: the bytes flow through as a Node `Readable`, roughly 5 MB at a -time, so no process ever holds the whole file. The transfer is transparent — there are no +time, so no process ever holds the whole file. The transfer is transparent: there are no extra "chunk" steps in your flow; a streaming action looks and behaves like any other. **Requires S3 file storage.** Full streaming only works when file storage is set to S3 (`AP_FILE_STORAGE_LOCATION=S3`). With the default database (`DB`) storage a stream **can't** be written into a column incrementally, so the server buffers the whole file in memory -before saving it — which defeats the memory savings and means very large files can still +before saving it, which defeats the memory savings and means very large files can still fail. Self-hosted installs default to `DB`; set S3 to get the benefit. See [Set up S3](/install/configure-operate/setup-s3). @@ -35,9 +35,9 @@ fail. Self-hosted installs default to `DB`; set S3 to get the benefit. See **Which approach should you use?** -- **Buffer** (a `Buffer`, the default) — small files of known size where holding the whole +- **Buffer** (a `Buffer`, the default): small files of known size where holding the whole file in memory is cheap and simple. -- **Stream** (a `Readable`) — large files, files of unknown size, or app-to-app transfers +- **Stream** (a `Readable`): large files, files of unknown size, or app-to-app transfers (e.g. downloading a large object from one service and uploading it to another) where buffering would risk exhausting memory. @@ -57,11 +57,11 @@ Streaming is enabled per action. "In" means the action reads its **input** file | Dropbox | Upload file | Download File | | Google Drive | Upload file | Read File Content, List files, Set public access, New File (trigger) | | Microsoft OneDrive | Upload file | Get File | -| Microsoft SharePoint | Upload File | — | +| Microsoft SharePoint | Upload File | N/A | | FTP/SFTP | Upload File | Read File Content | -| Subflows | Stream CSV to Subflows | — | +| Subflows | Stream CSV to Subflows | N/A | -More pieces are being enabled over time. Actions not listed here still work — they buffer +More pieces are being enabled over time. Actions not listed here still work: they buffer the file in memory, which is fine within the [size limit](/install/reference/limits). @@ -83,7 +83,7 @@ what a single request can carry, the action switches to a chunked upload session These are pre-existing API limits rather than streaming limits, and each action now handles its own. One difference matters if your source doesn't report a size: Dropbox's session is offset-based, so it just streams the chunks as they arrive, while Graph wants the file's total length in every fragment's -`Content-Range` header — so the two Microsoft actions buffer once to learn the length before they can +`Content-Range` header, so the two Microsoft actions buffer once to learn the length before they can chunk. Give those a source that reports `Content-Length` when you can. ## Building streaming actions @@ -93,8 +93,8 @@ input file as a stream, and write an output file as a stream. ### Writing a file as a stream -`ctx.files.write` accepts a `Buffer` **or** a `Readable`. Pass a `Readable` — such as an S3 -object body or a streaming HTTP response — and it streams straight to storage instead of +`ctx.files.write` accepts a `Buffer` **or** a `Readable`. Pass a `Readable`, such as an S3 +object body or a streaming HTTP response, and it streams straight to storage instead of being buffered. It returns a file reference string you return from the action, exactly like the buffered form (see [Files](./files)). @@ -104,7 +104,7 @@ async run(context) { const { Body } = await s3.getObject({ Bucket: bucket, Key: key }); - // Body is a Readable — hand it straight to files.write, no Buffer in between + // Body is a Readable: hand it straight to files.write, no Buffer in between return context.files.write({ fileName: key, data: Body, @@ -127,7 +127,7 @@ type ApStreamingFile = { ``` Consume `body` directly. How you hand it to the destination depends on what that destination's -client accepts — in order of preference: +client accepts, in order of preference: **1. A chunking uploader (best).** Accepts a stream of unknown length and buffers each part before sending it, so no content length is needed and parts are individually replayable. For S3 @@ -157,11 +157,11 @@ async run(context) { } ``` -**2. An SDK that takes a stream directly.** Some clients accept a `Readable` as-is — Google +**2. An SDK that takes a stream directly.** Some clients accept a `Readable` as-is: Google Drive's `media.body`, SFTP's `client.put`. Just pass `file.body`. **3. A single-request HTTP upload.** If the destination is a plain `PUT`/`POST` that needs an -explicit `Content-Length`, you have to use `file.size` — and `size` is best-effort, so this +explicit `Content-Length`, you have to use `file.size`, and `size` is best-effort, so this path needs a buffered fallback for when it is missing. Dropbox, SharePoint and OneDrive all look like this: @@ -178,13 +178,13 @@ if (file.size != null) { } ``` -`size` is informational and best-effort — it is `undefined` when the source reports no +`size` is informational and best-effort: it is `undefined` when the source reports no `Content-Length`, and it is also dropped when the response is compressed (`Content-Encoding: gzip`/`br`/`deflate`), because the decompressed body no longer matches the advertised length. Don't require it: prefer pattern 1 or 2, which never need it. -`Property.File()` without `streaming` is unchanged — it still resolves to an `ApFile` with a +`Property.File()` without `streaming` is unchanged: it still resolves to an `ApFile` with a `data` buffer, so existing actions keep working. @@ -195,9 +195,9 @@ advertised length. Don't require it: prefer pattern 1 or 2, which never need it. flow; exceeding it aborts the transfer and fails the step. See [Limits](/install/reference/limits). - **Reading a streamed input is not capped.** A `streaming: true` file input has no - `AP_MAX_FILE_SIZE_MB` ceiling — that is deliberate, since the point of the feature is to move + `AP_MAX_FILE_SIZE_MB` ceiling; that is deliberate, since the point of the feature is to move files larger than the cap out to an external service. -- **Storage backend.** Streaming end-to-end requires S3 file storage — see the callout at +- **Storage backend.** Streaming end-to-end requires S3 file storage; see the callout at the top of this page. @@ -207,7 +207,7 @@ advertised length. Don't require it: prefer pattern 1 or 2, which never need it. streamed `ctx.files.write` gets no S3-error fallback to database storage, and a step that fails after its stream is drained cannot simply be re-run against the same stream. - **`httpClient` does not retry a stream body at all.** The retry loop in `pieces-common` - reuses the body it serialized before the first attempt, and a stream is one-shot — retrying + reuses the body it serialized before the first attempt, and a stream is one-shot, so retrying would replay a drained stream and send a truncated body. So a request whose body is a `Readable` (or a `form-data` payload, which is streamed too) runs its `retries` setting as `0`. This applies to **any** piece sending a stream through `httpClient`, not just file diff --git a/docs/build-pieces/piece-reference/output-schema.mdx b/docs/build-pieces/piece-reference/output-schema.mdx index d8acf5d04b5..a933a640140 100644 --- a/docs/build-pieces/piece-reference/output-schema.mdx +++ b/docs/build-pieces/piece-reference/output-schema.mdx @@ -7,7 +7,7 @@ description: 'Describe how a step output is presented in the builder' By default, the builder renders a step's output as raw JSON. You can opt in to a friendly, labelled presentation by declaring an `outputSchema` on your action or trigger. The schema drives both the **Smart Output Viewer** (test step / run details) and the **Data Selector** (variable -picker), giving users readable labels, formatted values, and nested/tabular views — without +picker), giving users readable labels, formatted values, and nested/tabular views, without changing the expression paths used in automations. The schema is fully type-checked against the `OutputSchema` type exported from @@ -56,7 +56,7 @@ When your output is an object keyed by UUIDs/slugs (`dynamicKey: true`) or an ar to point at a property **inside each entry/item** whose value should be shown as the label instead. -The expression path is never affected — `labelKey` only changes what the user sees. Inserting a +The expression path is never affected: `labelKey` only changes what the user sees. Inserting a variable still references the opaque key (`step_1['']`) or numeric index. This is ideal when keying by UUID: the key stays stable even if the name changes in the external system, so existing automations never break. @@ -109,7 +109,7 @@ view derives its headers from property keys. When your action returns a **top-level array** (e.g. a list of search results), the schema's `fields` describe a single item, and they are applied to every element of the array. Use the optional -`itemLabel` template to label each item — `{dotPath}` placeholders are resolved against that item: +`itemLabel` template to label each item. `{dotPath}` placeholders are resolved against that item: ```typescript outputSchema: { diff --git a/docs/build-pieces/piece-reference/piece-versioning.mdx b/docs/build-pieces/piece-reference/piece-versioning.mdx index dfe0cbf69a5..74c8ac403b6 100644 --- a/docs/build-pieces/piece-reference/piece-versioning.mdx +++ b/docs/build-pieces/piece-reference/piece-versioning.mdx @@ -14,9 +14,9 @@ This page is for *piece authors* deciding what version number to publish. For ho The version number is `MAJOR.MINOR.PATCH`: -- **MAJOR** — bump when you make a breaking change. -- **MINOR** — bump when you add functionality without breaking existing flows. -- **PATCH** — bump for bug fixes that don't change behavior. +- **MAJOR**: bump when you make a breaking change. +- **MINOR**: bump when you add functionality without breaking existing flows. +- **PATCH**: bump for bug fixes that don't change behavior. ## Classifying changes @@ -27,6 +27,7 @@ Use this checklist when deciding which segment to bump. - Remove an existing action or trigger. - Add a required prop to an existing action or trigger. - Remove an existing prop, whether required or optional. +- Rename an existing prop, or change its type/shape. - Remove an attribute from an action output. - Change the existing behavior of an action or trigger. diff --git a/docs/build-pieces/piece-reference/properties.mdx b/docs/build-pieces/piece-reference/properties.mdx index 6ee9c8430e0..b168084131f 100644 --- a/docs/build-pieces/piece-reference/properties.mdx +++ b/docs/build-pieces/piece-reference/properties.mdx @@ -13,7 +13,7 @@ import { SegmentedTabsPreview, FilterBuilderPreview, SectionCardsPreview, } from '/snippets/prop-previews.jsx'; -Properties are used in actions and triggers to collect information from the user. They are also displayed to the user for input. Each property renders as a labelled field in the step settings form — the previews below show exactly what the user sees. +Properties are used in actions and triggers to collect information from the user. They are also displayed to the user for input. Each property renders as a labelled field in the step settings form; the previews below show exactly what the user sees. ## Basic Properties @@ -51,7 +51,7 @@ Property.LongText({ ### Rich Text -This property gives the user a formatting toolbar (bold, italic, underline, links, lists) and preserves `{{ variables }}` inserted from previous steps. Pair it with a sibling dropdown via `formatProperty` to let the user switch between **plain text** and **HTML** — the returned value is a plain string in the chosen format. +This property gives the user a formatting toolbar (bold, italic, underline, links, lists) and preserves `{{ variables }}` inserted from previous steps. Pair it with a sibling dropdown via `formatProperty` to let the user switch between **plain text** and **HTML**; the returned value is a plain string in the chosen format. @@ -174,7 +174,7 @@ Property.DateRange({ }); ``` -The value is `{ preset, after?, before? }`. Resolve it to concrete ISO bounds inside `run()` with `dateRangeUtils.resolve` — relative presets resolve against "now", so recurring flows roll the window forward: +The value is `{ preset, after?, before? }`. Resolve it to concrete ISO bounds inside `run()` with `dateRangeUtils.resolve`. Relative presets resolve against "now", so recurring flows roll the window forward: ```typescript import { dateRangeUtils } from '@activepieces/pieces-framework'; @@ -539,7 +539,7 @@ Every property accepts a few optional hints that fine-tune how it renders. They | `icon` | any prop | A named icon shown beside the field in the filter builder. | | `advanced: true` | any prop | Moves the field into the collapsible *Advanced* section. Props render in the main form by default. | -Every property renders in the main form by default, required or not. Set `advanced: true` on a secondary option to tuck it into the collapsible **Advanced** section — `advanced: false` is the default and has no effect. Avoid the flag on required props: the section starts collapsed, so a mandatory field hidden there only surfaces as a validation error. +Every property renders in the main form by default, required or not. Set `advanced: true` on a secondary option to tuck it into the collapsible **Advanced** section; `advanced: false` is the default and has no effect. Avoid the flag on required props: the section starts collapsed, so a mandatory field hidden there only surfaces as a validation error. **Half-width fields** @@ -558,7 +558,7 @@ Actions and triggers can declare `propertyGroups` to organize related fields. Ea ### Segmented tabs -`display: 'tabs'` groups a set of props into a segmented tab control — for example To / Cc / Bcc recipients. +`display: 'tabs'` groups a set of props into a segmented tab control, for example To / Cc / Bcc recipients. @@ -606,12 +606,12 @@ createAction({ ``` - A filter row is shown when its value is set, so there's nothing extra to persist. Give filters short `placeholder` hints and an `icon` so each row reads clearly. Note that a `builder` or `footer` group also switches off the *Advanced* section for the whole step — every prop lives in the builder. + A filter row is shown when its value is set, so there's nothing extra to persist. Give filters short `placeholder` hints and an `icon` so each row reads clearly. Note that a `builder` or `footer` group also switches off the *Advanced* section for the whole step: every prop lives in the builder. ### Sectioned cards -`display: 'section'` groups related props into titled cards — for example a *Send to* card and a *Message* card. Unlike tabs and the filter builder, sectioned layouts **keep the collapsible _Advanced_ section** for props outside the cards: an ungrouped prop still honours `advanced: true` — unless it is a checkbox `reveals` target, which renders inline under its toggle instead. Props inside a section are always essential. Give each group a `label` and `icon`, and use `width: 'half'` on members to pack two fields per row. +`display: 'section'` groups related props into titled cards, for example a *Send to* card and a *Message* card. Unlike tabs and the filter builder, sectioned layouts **keep the collapsible _Advanced_ section** for props outside the cards: an ungrouped prop still honours `advanced: true`, unless it is a checkbox `reveals` target, which renders inline under its toggle instead. Props inside a section are always essential. Give each group a `label` and `icon`, and use `width: 'half'` on members to pack two fields per row. diff --git a/docs/build-pieces/piece-reference/triggers/webhook-trigger.mdx b/docs/build-pieces/piece-reference/triggers/webhook-trigger.mdx index 80f13a28125..8e8dca18937 100644 --- a/docs/build-pieces/piece-reference/triggers/webhook-trigger.mdx +++ b/docs/build-pieces/piece-reference/triggers/webhook-trigger.mdx @@ -9,7 +9,9 @@ The way webhook triggers usually work is as follows: Use `context.webhookUrl` to perform an HTTP request to register the webhook in a third-party app, and store the webhook Id in the `store`. **On Handshake:** -Some services require a successful handshake request usually consisting of some challenge. It works similar to a normal run except that you return the correct challenge response. This is optional and in order to enable the handshake you need to configure one of the available handshake strategies in the `handshakeConfiguration` option. +Some services require a successful handshake request usually consisting of some challenge. It works similar to a normal run except that you return the correct challenge response. This is optional and in order to enable the handshake you need to configure one of the available handshake strategies in the `handshakeConfiguration` option, and implement `onHandshake` to return the expected `WebhookResponse` (`{ status, body?, headers? }`). + +Available `WebhookHandshakeStrategy` values: `NONE` (default), `HEADER_PRESENT`, `QUERY_PRESENT`, `BODY_PARAM_PRESENT`, and `HEAD_REQUEST`. For the `*_PRESENT` strategies, also set `paramName` to the header/query/body key to check. **Run:** You can find the HTTP body inside `context.payload.body`. If needed, alter the body; otherwise, return an array with a single item `context.payload.body`. @@ -17,6 +19,68 @@ You can find the HTTP body inside `context.payload.body`. If needed, alter the b **Disable:** Using the `context.store`, fetch the webhook ID from the enable step and delete the webhook on the third-party app. +**Full Example:** + +```ts +import { createTrigger, TriggerStrategy, WebhookHandshakeStrategy } from '@activepieces/pieces-framework'; +import { HttpMethod, httpClient } from '@activepieces/pieces-common'; + +export const newEvent = createTrigger({ + auth: someAuth, + name: 'new_event', + displayName: 'New Event', + description: 'Fires when a new event is generated', + type: TriggerStrategy.WEBHOOK, + props: {}, + sampleData: { + id: 'evt_123', + type: 'event.created', + }, + + // Called once when the flow is published; register the webhook with the third-party app. + async onEnable(context) { + const response = await httpClient.sendRequest<{ id: string }>({ + method: HttpMethod.POST, + url: 'https://api.example.com/webhooks', + body: { + url: context.webhookUrl, + }, + }); + await context.store.put('webhookId', response.body.id); + }, + + // Called once when the flow is disabled; deregister the webhook. + async onDisable(context) { + const webhookId = await context.store.get('webhookId'); + if (webhookId) { + await httpClient.sendRequest({ + method: HttpMethod.DELETE, + url: `https://api.example.com/webhooks/${webhookId}`, + }); + } + }, + + // Optional; only needed if the third-party app requires a verification challenge + // when the webhook URL is first registered. + handshakeConfiguration: { + strategy: WebhookHandshakeStrategy.HEADER_PRESENT, + paramName: 'x-verification-challenge', + }, + async onHandshake(context) { + const challenge = context.payload.headers['x-verification-challenge']; + return { + status: 200, + body: { challenge }, + }; + }, + + // Called on every incoming webhook request once the trigger is live. + async run(context) { + return [context.payload.body]; + }, +}); +``` + **Testing:** You cannot test it with Test Flow, as it uses static sample data provided in the piece. To test the trigger, publish the flow, perform the event. Then check the flow runs from the main dashboard. diff --git a/docs/build-pieces/sharing-pieces/community.mdx b/docs/build-pieces/sharing-pieces/community.mdx index 2ae7df35d27..e8ae334c795 100644 --- a/docs/build-pieces/sharing-pieces/community.mdx +++ b/docs/build-pieces/sharing-pieces/community.mdx @@ -13,7 +13,7 @@ You can publish your pieces to the npm registry and share them with the communit ``` - Rename the piece name in `package.json` to something unique or related to your organization's scope (e.g., `@my-org/piece-PIECE_NAME`). You can find it at `packages/pieces/PIECE_NAME/package.json`. + Rename the piece name in `package.json` to something unique or related to your organization's scope (e.g., `@my-org/piece-PIECE_NAME`). You can find it at `packages/pieces/community/PIECE_NAME/package.json`. Don't forget to increase the version number in `package.json` for each new release. diff --git a/docs/build-pieces/sharing-pieces/private.mdx b/docs/build-pieces/sharing-pieces/private.mdx index 028cc5737ed..81a246a9d09 100644 --- a/docs/build-pieces/sharing-pieces/private.mdx +++ b/docs/build-pieces/sharing-pieces/private.mdx @@ -26,7 +26,7 @@ Friendly Tip: There is a CLI to easily upload it to your platform. Please check - Upload the generated tarball inside `dist/packages/pieces/${name}`from Activepieces Platform Admin -> Pieces + Upload the generated tarball from `packages/pieces/custom/${name}/dist` from Activepieces Platform Admin -> Pieces ![Manage Pieces](/resources/screenshots/install-piece.png) diff --git a/docs/resources/screenshots/development-setup_codespaces.png b/docs/resources/screenshots/development-setup_codespaces.png index 27e6a2c82b16bbe07407800203418499c6f00e40..1ab08643e248bb657d291674f83be94a9fcdc33c 100644 GIT binary patch literal 145443 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�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