65155fe50c
Closes twentyhq/core-team-issues#2742 A logic function run is capped by its own `timeoutSeconds` (900s max), so anything that can't finish in one run — a full re-sync, a per-record fan-out, a rate-limited third-party API — had no way to continue. This adds a way to hand that work to the workers. ## What it looks like for an app author ```ts import { enqueueJob } from 'twenty-sdk/logic-function'; await enqueueJob({ logicFunctionUniversalIdentifier: '9f1c3d7e-51b8-4a29-8f0d-7c4e2a6b1d33', payload: { cursor: nextCursor }, retryLimit: 3, priority: 2, delayMs: 60_000, }); ``` The target runs in its own process with its own timeout budget. The classic shape is a function that enqueues *itself* with the next cursor until there is nothing left. ## Changes **twenty-shared** — `EnqueueJobInput` / `EnqueueJobOptions` / `EnqueueJobResult` in `application`. **twenty-server** — new `application-job` module under `core-modules/application`, following the `application-key-value` pattern: - `enqueueJob` mutation on the metadata API, `@AuthApplication`-scoped - the lookup is scoped to `applicationId` + `workspaceId` — that's the authorization boundary, an app can only enqueue its own logic functions, anything else is `LOGIC_FUNCTION_NOT_FOUND` - pushes a `LogicFunctionTriggerJob` onto the existing `logicFunctionQueue`, so the enqueued run goes through the same executor (and the same execution throttling) as every other trigger - the queued run inherits the caller's `userId`/`userWorkspaceId`, so its app access token carries the same permissions as the function that queued it **Job options** are range-checked via `ResolverValidationPipe`, since the values come from application code and an unbounded delay or retry count would let an app pin work in the shared queue: | Option | Default | Range | |--------|---------|-------| | `retryLimit` | `0` | `0`–`10` | | `priority` | queue default | `1`–`10` (lower first) | | `delayMs` | `0` | `0`–7 days | `retryLimit` defaults to `0` rather than inheriting the server-route path's `3`: retries re-run the whole handler, so opting in should be the author's explicit choice. **twenty-sdk** — `enqueueJob` in `twenty-sdk/logic-function`, same shape as `runAgent`/`kv`. **Docs** — new "Background Jobs" page under Extend → Apps → Logic, plus nav and overview entries. **Generated** — regenerated `twenty-front/src/generated-metadata` and `twenty-client-sdk/src/metadata/generated` for the new mutation. ## Tests - `application-job.service.spec.ts` — 5 unit tests: job options mapping, defaults, acting-user propagation, application-scoped lookup, not-found - `enqueue-job.integration-spec.ts` — 5 integration tests: rejects a non-`APPLICATION_ACCESS` token, enqueues a function the app owns, rejects a function owned by another application, rejects an unknown identifier, rejects out-of-range options All green locally, along with `typecheck` for `twenty-server`/`twenty-sdk` and oxlint/oxfmt on the touched files. ## Notes for review - The target is addressed by `universalIdentifier`, matching `runAgent({ agentUniversalIdentifier })` and `ServerRouteDispatchResult.targetLogicFunctionUniversalIdentifier`. Addressing by `name` would be friendlier, but logic function names aren't validated for uniqueness within an app — happy to add it as a convenience if you'd rather. - `enqueueJob` returns as soon as the job is accepted; it can't return the target's result, since the queue driver's `add` returns void. Documented, with a pointer to the KV store for handing results back. --- _Generated by [Claude Code](https://claude.ai/code/session_01QrYvGonS3HMdeuMAVjs5hR)_ <!-- This is an auto-generated description by cubic. --> <a href="https://cubic.dev/pr/twentyhq/twenty/pull/23527?utm_source=github" target="_blank" rel="noopener noreferrer" data-no-image-dialog="true"><picture><source media="(prefers-color-scheme: dark)" srcset="https://www.cubic.dev/buttons/review-in-cubic-dark.svg"><source media="(prefers-color-scheme: light)" srcset="https://www.cubic.dev/buttons/review-in-cubic-light.svg"><img alt="Review in cubic" src="https://www.cubic.dev/buttons/review-in-cubic-dark.svg"></picture></a> <!-- End of auto-generated description by cubic. --> --------- Co-authored-by: github-actions <github-actions@twenty.com>
331 lines
19 KiB
TypeScript
331 lines
19 KiB
TypeScript
/*
|
|
* _____ _
|
|
*|_ _|_ _____ _ __ | |_ _ _
|
|
* | | \ \ /\ / / _ \ '_ \| __| | | | Auto-generated file
|
|
* | | \ V V / __/ | | | |_| |_| | DO NOT EDIT - changes will be overwritten
|
|
* |_| \_/\_/ \___|_| |_|\__|\__, | Generated by: yarn docs:generate-paths
|
|
* |___/
|
|
*
|
|
* This file is generated from packages/twenty-docs/navigation/base-structure.json
|
|
* To add new documentation pages, add them to base-structure.json and run:
|
|
* yarn docs:generate-paths
|
|
*/
|
|
|
|
export const DOCUMENTATION_PATHS = {
|
|
DEVELOPERS_CONTRIBUTE_CAPABILITIES_LOCAL_SETUP:
|
|
'/developers/contribute/capabilities/local-setup',
|
|
DEVELOPERS_CONTRIBUTE_COMMANDS: '/developers/contribute/commands',
|
|
DEVELOPERS_CONTRIBUTE_STYLE_GUIDE: '/developers/contribute/style-guide',
|
|
DEVELOPERS_EXTEND_API: '/developers/extend/api',
|
|
DEVELOPERS_EXTEND_APPS_CONFIG_APPLICATION:
|
|
'/developers/extend/apps/config/application',
|
|
DEVELOPERS_EXTEND_APPS_CONFIG_INSTALL_HOOKS:
|
|
'/developers/extend/apps/config/install-hooks',
|
|
DEVELOPERS_EXTEND_APPS_CONFIG_OVERVIEW:
|
|
'/developers/extend/apps/config/overview',
|
|
DEVELOPERS_EXTEND_APPS_CONFIG_PUBLIC_ASSETS:
|
|
'/developers/extend/apps/config/public-assets',
|
|
DEVELOPERS_EXTEND_APPS_CONFIG_ROLES: '/developers/extend/apps/config/roles',
|
|
DEVELOPERS_EXTEND_APPS_DATA_EXTENDING_OBJECTS:
|
|
'/developers/extend/apps/data/extending-objects',
|
|
DEVELOPERS_EXTEND_APPS_DATA_OBJECTS: '/developers/extend/apps/data/objects',
|
|
DEVELOPERS_EXTEND_APPS_DATA_OVERVIEW: '/developers/extend/apps/data/overview',
|
|
DEVELOPERS_EXTEND_APPS_DATA_RELATIONS:
|
|
'/developers/extend/apps/data/relations',
|
|
DEVELOPERS_EXTEND_APPS_DATA_SYSTEM_FIELDS:
|
|
'/developers/extend/apps/data/system-fields',
|
|
DEVELOPERS_EXTEND_APPS_GETTING_STARTED_CONCEPTS:
|
|
'/developers/extend/apps/getting-started/concepts',
|
|
DEVELOPERS_EXTEND_APPS_GETTING_STARTED_LOCAL_SERVER:
|
|
'/developers/extend/apps/getting-started/local-server',
|
|
DEVELOPERS_EXTEND_APPS_GETTING_STARTED_PROJECT_STRUCTURE:
|
|
'/developers/extend/apps/getting-started/project-structure',
|
|
DEVELOPERS_EXTEND_APPS_GETTING_STARTED_QUICK_START:
|
|
'/developers/extend/apps/getting-started/quick-start',
|
|
DEVELOPERS_EXTEND_APPS_GETTING_STARTED_SCAFFOLDING:
|
|
'/developers/extend/apps/getting-started/scaffolding',
|
|
DEVELOPERS_EXTEND_APPS_GETTING_STARTED_TROUBLESHOOTING:
|
|
'/developers/extend/apps/getting-started/troubleshooting',
|
|
DEVELOPERS_EXTEND_APPS_LAYOUT_COMMAND_MENU_ITEMS:
|
|
'/developers/extend/apps/layout/command-menu-items',
|
|
DEVELOPERS_EXTEND_APPS_LAYOUT_FRONT_COMPONENTS:
|
|
'/developers/extend/apps/layout/front-components',
|
|
DEVELOPERS_EXTEND_APPS_LAYOUT_NAVIGATION_MENU_ITEMS:
|
|
'/developers/extend/apps/layout/navigation-menu-items',
|
|
DEVELOPERS_EXTEND_APPS_LAYOUT_OVERVIEW:
|
|
'/developers/extend/apps/layout/overview',
|
|
DEVELOPERS_EXTEND_APPS_LAYOUT_PAGE_LAYOUTS:
|
|
'/developers/extend/apps/layout/page-layouts',
|
|
DEVELOPERS_EXTEND_APPS_LAYOUT_VIEWS: '/developers/extend/apps/layout/views',
|
|
DEVELOPERS_EXTEND_APPS_LOGIC_BACKGROUND_JOBS:
|
|
'/developers/extend/apps/logic/background-jobs',
|
|
DEVELOPERS_EXTEND_APPS_LOGIC_CONNECTIONS:
|
|
'/developers/extend/apps/logic/connections',
|
|
DEVELOPERS_EXTEND_APPS_LOGIC_KEY_VALUE_STORE:
|
|
'/developers/extend/apps/logic/key-value-store',
|
|
DEVELOPERS_EXTEND_APPS_LOGIC_LOGIC_FUNCTIONS:
|
|
'/developers/extend/apps/logic/logic-functions',
|
|
DEVELOPERS_EXTEND_APPS_LOGIC_OVERVIEW:
|
|
'/developers/extend/apps/logic/overview',
|
|
DEVELOPERS_EXTEND_APPS_LOGIC_SKILLS_AND_AGENTS:
|
|
'/developers/extend/apps/logic/skills-and-agents',
|
|
DEVELOPERS_EXTEND_APPS_OPERATIONS_CLI:
|
|
'/developers/extend/apps/operations/cli',
|
|
DEVELOPERS_EXTEND_APPS_OPERATIONS_OVERVIEW:
|
|
'/developers/extend/apps/operations/overview',
|
|
DEVELOPERS_EXTEND_APPS_OPERATIONS_PUBLISHING:
|
|
'/developers/extend/apps/operations/publishing',
|
|
DEVELOPERS_EXTEND_APPS_OPERATIONS_SYNC_AND_RECOVERY:
|
|
'/developers/extend/apps/operations/sync-and-recovery',
|
|
DEVELOPERS_EXTEND_APPS_OPERATIONS_TESTING:
|
|
'/developers/extend/apps/operations/testing',
|
|
DEVELOPERS_EXTEND_APPS_TRANSLATIONS_OVERVIEW:
|
|
'/developers/extend/apps/translations/overview',
|
|
DEVELOPERS_EXTEND_APPS_TUTORIALS_DOCUMENT_GENERATOR_AI_AGENT:
|
|
'/developers/extend/apps/tutorials/document-generator/ai-agent',
|
|
DEVELOPERS_EXTEND_APPS_TUTORIALS_DOCUMENT_GENERATOR_BUILDING_THE_UI:
|
|
'/developers/extend/apps/tutorials/document-generator/building-the-ui',
|
|
DEVELOPERS_EXTEND_APPS_TUTORIALS_DOCUMENT_GENERATOR_DATA_MODEL:
|
|
'/developers/extend/apps/tutorials/document-generator/data-model',
|
|
DEVELOPERS_EXTEND_APPS_TUTORIALS_DOCUMENT_GENERATOR_GENERATING_DOCUMENTS:
|
|
'/developers/extend/apps/tutorials/document-generator/generating-documents',
|
|
DEVELOPERS_EXTEND_APPS_TUTORIALS_DOCUMENT_GENERATOR_HTTP_ROUTES:
|
|
'/developers/extend/apps/tutorials/document-generator/http-routes',
|
|
DEVELOPERS_EXTEND_APPS_TUTORIALS_DOCUMENT_GENERATOR_OVERVIEW:
|
|
'/developers/extend/apps/tutorials/document-generator/overview',
|
|
DEVELOPERS_EXTEND_APPS_TUTORIALS_DOCUMENT_GENERATOR_PUBLISHING:
|
|
'/developers/extend/apps/tutorials/document-generator/publishing',
|
|
DEVELOPERS_EXTEND_OAUTH: '/developers/extend/oauth',
|
|
DEVELOPERS_EXTEND_WEBHOOKS: '/developers/extend/webhooks',
|
|
DEVELOPERS_INTRODUCTION: '/developers/introduction',
|
|
DEVELOPERS_SELF_HOST_CAPABILITIES_DOCKER_COMPOSE:
|
|
'/developers/self-host/capabilities/docker-compose',
|
|
DEVELOPERS_SELF_HOST_CAPABILITIES_SETUP:
|
|
'/developers/self-host/capabilities/setup',
|
|
DEVELOPERS_SELF_HOST_CAPABILITIES_TROUBLESHOOTING:
|
|
'/developers/self-host/capabilities/troubleshooting',
|
|
DEVELOPERS_SELF_HOST_CAPABILITIES_UPGRADE_GUIDE:
|
|
'/developers/self-host/capabilities/upgrade-guide',
|
|
GETTING_STARTED_CORE_CONCEPTS_AI: '/getting-started/core-concepts/ai',
|
|
GETTING_STARTED_CORE_CONCEPTS_APPS: '/getting-started/core-concepts/apps',
|
|
GETTING_STARTED_CORE_CONCEPTS_CALENDAR_AND_EMAIL:
|
|
'/getting-started/core-concepts/calendar-and-email',
|
|
GETTING_STARTED_CORE_CONCEPTS_DASHBOARDS:
|
|
'/getting-started/core-concepts/dashboards',
|
|
GETTING_STARTED_CORE_CONCEPTS_DATA_MODEL:
|
|
'/getting-started/core-concepts/data-model',
|
|
GETTING_STARTED_CORE_CONCEPTS_GLOSSARY:
|
|
'/getting-started/core-concepts/glossary',
|
|
GETTING_STARTED_CORE_CONCEPTS_LAYOUT: '/getting-started/core-concepts/layout',
|
|
GETTING_STARTED_CORE_CONCEPTS_WORKFLOWS:
|
|
'/getting-started/core-concepts/workflows',
|
|
GETTING_STARTED_INTRODUCTION: '/getting-started/introduction',
|
|
GETTING_STARTED_KEY_FEATURES: '/getting-started/key-features',
|
|
GETTING_STARTED_QUICKSTART: '/getting-started/quickstart',
|
|
USER_GUIDE_AI_CAPABILITIES_AI_AGENTS: '/user-guide/ai/capabilities/ai-agents',
|
|
USER_GUIDE_AI_CAPABILITIES_AI_CHATBOT:
|
|
'/user-guide/ai/capabilities/ai-chatbot',
|
|
USER_GUIDE_AI_CAPABILITIES_PERMISSIONS_ACCESS_CONTROL:
|
|
'/user-guide/ai/capabilities/permissions-access-control',
|
|
USER_GUIDE_AI_HOW_TOS_AI_FAQ: '/user-guide/ai/how-tos/ai-faq',
|
|
USER_GUIDE_AI_OVERVIEW: '/user-guide/ai/overview',
|
|
USER_GUIDE_BILLING_CAPABILITIES_CREDITS:
|
|
'/user-guide/billing/capabilities/credits',
|
|
USER_GUIDE_BILLING_CAPABILITIES_PRICING_PLANS:
|
|
'/user-guide/billing/capabilities/pricing-plans',
|
|
USER_GUIDE_BILLING_HOW_TOS_BILLING_FAQ:
|
|
'/user-guide/billing/how-tos/billing-faq',
|
|
USER_GUIDE_BILLING_OVERVIEW: '/user-guide/billing/overview',
|
|
USER_GUIDE_CALENDAR_EMAILS_CAPABILITIES_CALENDAR:
|
|
'/user-guide/calendar-emails/capabilities/calendar',
|
|
USER_GUIDE_CALENDAR_EMAILS_CAPABILITIES_MAILBOX:
|
|
'/user-guide/calendar-emails/capabilities/mailbox',
|
|
USER_GUIDE_CALENDAR_EMAILS_HOW_TOS_CAN_I_BOOK_MEETINGS_FROM_TWENTY:
|
|
'/user-guide/calendar-emails/how-tos/can-i-book-meetings-from-twenty',
|
|
USER_GUIDE_CALENDAR_EMAILS_HOW_TOS_CAN_I_SEND_EMAILS_FROM_TWENTY:
|
|
'/user-guide/calendar-emails/how-tos/can-i-send-emails-from-twenty',
|
|
USER_GUIDE_CALENDAR_EMAILS_HOW_TOS_CAN_I_TRACK_EMAIL_ACTIVITY_ON_ALL_OBJECTS:
|
|
'/user-guide/calendar-emails/how-tos/can-i-track-email-activity-on-all-objects',
|
|
USER_GUIDE_CALENDAR_EMAILS_HOW_TOS_CONNECT_SEVERAL_MAILBOXES_PER_USER:
|
|
'/user-guide/calendar-emails/how-tos/connect-several-mailboxes-per-user',
|
|
USER_GUIDE_CALENDAR_EMAILS_HOW_TOS_I_DONT_SEE_EMAILS_ON_RECORDS:
|
|
'/user-guide/calendar-emails/how-tos/i-dont-see-emails-on-records',
|
|
USER_GUIDE_CALENDAR_EMAILS_HOW_TOS_LIMIT_EMAILS_IMPORTED:
|
|
'/user-guide/calendar-emails/how-tos/limit-emails-imported',
|
|
USER_GUIDE_CALENDAR_EMAILS_OVERVIEW: '/user-guide/calendar-emails/overview',
|
|
USER_GUIDE_DASHBOARDS_CAPABILITIES_CHART_SETTINGS:
|
|
'/user-guide/dashboards/capabilities/chart-settings',
|
|
USER_GUIDE_DASHBOARDS_CAPABILITIES_DASHBOARDS:
|
|
'/user-guide/dashboards/capabilities/dashboards',
|
|
USER_GUIDE_DASHBOARDS_CAPABILITIES_WIDGETS:
|
|
'/user-guide/dashboards/capabilities/widgets',
|
|
USER_GUIDE_DASHBOARDS_HOW_TOS_DASHBOARDS_FAQ:
|
|
'/user-guide/dashboards/how-tos/dashboards-faq',
|
|
USER_GUIDE_DASHBOARDS_HOW_TOS_WIDGET_FAQ:
|
|
'/user-guide/dashboards/how-tos/widget-faq',
|
|
USER_GUIDE_DASHBOARDS_OVERVIEW: '/user-guide/dashboards/overview',
|
|
USER_GUIDE_DATA_MIGRATION_CAPABILITIES_ERROR_HANDLING:
|
|
'/user-guide/data-migration/capabilities/error-handling',
|
|
USER_GUIDE_DATA_MIGRATION_CAPABILITIES_FIELD_MAPPING:
|
|
'/user-guide/data-migration/capabilities/field-mapping',
|
|
USER_GUIDE_DATA_MIGRATION_CAPABILITIES_FILE_FORMATS:
|
|
'/user-guide/data-migration/capabilities/file-formats',
|
|
USER_GUIDE_DATA_MIGRATION_CAPABILITIES_IMPORT_RELATIONS:
|
|
'/user-guide/data-migration/capabilities/import-relations',
|
|
USER_GUIDE_DATA_MIGRATION_CAPABILITIES_UNIQUENESS_CONSTRAINTS:
|
|
'/user-guide/data-migration/capabilities/uniqueness-constraints',
|
|
USER_GUIDE_DATA_MIGRATION_HOW_TOS_EXPORT_YOUR_DATA:
|
|
'/user-guide/data-migration/how-tos/export-your-data',
|
|
USER_GUIDE_DATA_MIGRATION_HOW_TOS_FIX_IMPORT_ERRORS:
|
|
'/user-guide/data-migration/how-tos/fix-import-errors',
|
|
USER_GUIDE_DATA_MIGRATION_HOW_TOS_IMPORT_COMPANIES_VIA_CSV:
|
|
'/user-guide/data-migration/how-tos/import-companies-via-csv',
|
|
USER_GUIDE_DATA_MIGRATION_HOW_TOS_IMPORT_CONTACTS_VIA_CSV:
|
|
'/user-guide/data-migration/how-tos/import-contacts-via-csv',
|
|
USER_GUIDE_DATA_MIGRATION_HOW_TOS_IMPORT_DATA_VIA_API:
|
|
'/user-guide/data-migration/how-tos/import-data-via-api',
|
|
USER_GUIDE_DATA_MIGRATION_HOW_TOS_IMPORT_RELATIONS_BETWEEN_OBJECTS_VIA_CSV:
|
|
'/user-guide/data-migration/how-tos/import-relations-between-objects-via-csv',
|
|
USER_GUIDE_DATA_MIGRATION_HOW_TOS_MIGRATING_FROM_OTHER_CRMS:
|
|
'/user-guide/data-migration/how-tos/migrating-from-other-crms',
|
|
USER_GUIDE_DATA_MIGRATION_HOW_TOS_MIGRATING_FROM_SELF_HOSTED_TO_CLOUD:
|
|
'/user-guide/data-migration/how-tos/migrating-from-self-hosted-to-cloud',
|
|
USER_GUIDE_DATA_MIGRATION_HOW_TOS_PREPARE_YOUR_CSV_FILES:
|
|
'/user-guide/data-migration/how-tos/prepare-your-csv-files',
|
|
USER_GUIDE_DATA_MIGRATION_HOW_TOS_UPDATE_EXISTING_RECORDS_VIA_IMPORT:
|
|
'/user-guide/data-migration/how-tos/update-existing-records-via-import',
|
|
USER_GUIDE_DATA_MIGRATION_OVERVIEW: '/user-guide/data-migration/overview',
|
|
USER_GUIDE_DATA_MODEL_CAPABILITIES_FIELDS:
|
|
'/user-guide/data-model/capabilities/fields',
|
|
USER_GUIDE_DATA_MODEL_CAPABILITIES_OBJECTS:
|
|
'/user-guide/data-model/capabilities/objects',
|
|
USER_GUIDE_DATA_MODEL_CAPABILITIES_RELATION_FIELDS:
|
|
'/user-guide/data-model/capabilities/relation-fields',
|
|
USER_GUIDE_DATA_MODEL_HOW_TOS_CREATE_CUSTOM_FIELDS:
|
|
'/user-guide/data-model/how-tos/create-custom-fields',
|
|
USER_GUIDE_DATA_MODEL_HOW_TOS_CREATE_CUSTOM_OBJECTS:
|
|
'/user-guide/data-model/how-tos/create-custom-objects',
|
|
USER_GUIDE_DATA_MODEL_HOW_TOS_CREATE_MANY_TO_MANY_RELATIONS:
|
|
'/user-guide/data-model/how-tos/create-many-to-many-relations',
|
|
USER_GUIDE_DATA_MODEL_HOW_TOS_CREATE_RELATION_FIELDS:
|
|
'/user-guide/data-model/how-tos/create-relation-fields',
|
|
USER_GUIDE_DATA_MODEL_HOW_TOS_CUSTOMIZE_YOUR_DATA_MODEL:
|
|
'/user-guide/data-model/how-tos/customize-your-data-model',
|
|
USER_GUIDE_DATA_MODEL_HOW_TOS_DATA_MODEL_FAQ:
|
|
'/user-guide/data-model/how-tos/data-model-faq',
|
|
USER_GUIDE_DATA_MODEL_OVERVIEW: '/user-guide/data-model/overview',
|
|
USER_GUIDE_INTRODUCTION: '/user-guide/introduction',
|
|
USER_GUIDE_LAYOUT_CAPABILITIES_NAVIGATION:
|
|
'/user-guide/layout/capabilities/navigation',
|
|
USER_GUIDE_LAYOUT_CAPABILITIES_RECORD_PAGES:
|
|
'/user-guide/layout/capabilities/record-pages',
|
|
USER_GUIDE_LAYOUT_OVERVIEW: '/user-guide/layout/overview',
|
|
USER_GUIDE_LEGAL_HOW_TOS_LEGAL_FAQ: '/user-guide/legal/how-tos/legal-faq',
|
|
USER_GUIDE_LEGAL_OVERVIEW: '/user-guide/legal/overview',
|
|
USER_GUIDE_PERMISSIONS_ACCESS_CAPABILITIES_PERMISSIONS:
|
|
'/user-guide/permissions-access/capabilities/permissions',
|
|
USER_GUIDE_PERMISSIONS_ACCESS_CAPABILITIES_SSO_CONFIGURATION:
|
|
'/user-guide/permissions-access/capabilities/sso-configuration',
|
|
USER_GUIDE_PERMISSIONS_ACCESS_HOW_TOS_PERMISSIONS_FAQ:
|
|
'/user-guide/permissions-access/how-tos/permissions-faq',
|
|
USER_GUIDE_PERMISSIONS_ACCESS_OVERVIEW:
|
|
'/user-guide/permissions-access/overview',
|
|
USER_GUIDE_SETTINGS_CAPABILITIES_COMMUNITY_SETTINGS:
|
|
'/user-guide/settings/capabilities/community-settings',
|
|
USER_GUIDE_SETTINGS_CAPABILITIES_DOMAINS_SETTINGS:
|
|
'/user-guide/settings/capabilities/domains-settings',
|
|
USER_GUIDE_SETTINGS_CAPABILITIES_EXPERIENCE_SETTINGS:
|
|
'/user-guide/settings/capabilities/experience-settings',
|
|
USER_GUIDE_SETTINGS_CAPABILITIES_MEMBER_MANAGEMENT:
|
|
'/user-guide/settings/capabilities/member-management',
|
|
USER_GUIDE_SETTINGS_CAPABILITIES_PROFILE_SETTINGS:
|
|
'/user-guide/settings/capabilities/profile-settings',
|
|
USER_GUIDE_SETTINGS_CAPABILITIES_WORKSPACE_SETTINGS:
|
|
'/user-guide/settings/capabilities/workspace-settings',
|
|
USER_GUIDE_SETTINGS_HOW_TOS_SETTINGS_FAQ:
|
|
'/user-guide/settings/how-tos/settings-faq',
|
|
USER_GUIDE_SETTINGS_OVERVIEW: '/user-guide/settings/overview',
|
|
USER_GUIDE_VIEWS_PIPELINES_CAPABILITIES_CALENDAR_VIEW:
|
|
'/user-guide/views-pipelines/capabilities/calendar-view',
|
|
USER_GUIDE_VIEWS_PIPELINES_CAPABILITIES_FIELDS_AND_COLUMNS:
|
|
'/user-guide/views-pipelines/capabilities/fields-and-columns',
|
|
USER_GUIDE_VIEWS_PIPELINES_CAPABILITIES_FILTERS_AND_SORTING:
|
|
'/user-guide/views-pipelines/capabilities/filters-and-sorting',
|
|
USER_GUIDE_VIEWS_PIPELINES_CAPABILITIES_KANBAN_VIEWS:
|
|
'/user-guide/views-pipelines/capabilities/kanban-views',
|
|
USER_GUIDE_VIEWS_PIPELINES_CAPABILITIES_TABLE_VIEWS:
|
|
'/user-guide/views-pipelines/capabilities/table-views',
|
|
USER_GUIDE_VIEWS_PIPELINES_CAPABILITIES_VIEW_SETTINGS:
|
|
'/user-guide/views-pipelines/capabilities/view-settings',
|
|
USER_GUIDE_VIEWS_PIPELINES_HOW_TOS_CREATE_A_CALENDAR_VIEW_FOR_TASKS_DUE:
|
|
'/user-guide/views-pipelines/how-tos/create-a-calendar-view-for-tasks-due',
|
|
USER_GUIDE_VIEWS_PIPELINES_HOW_TOS_CREATE_A_KANBAN_VIEW_FOR_PROJECTS:
|
|
'/user-guide/views-pipelines/how-tos/create-a-kanban-view-for-projects',
|
|
USER_GUIDE_VIEWS_PIPELINES_HOW_TOS_CREATE_A_TABLE_VIEW_WITH_GROUPING:
|
|
'/user-guide/views-pipelines/how-tos/create-a-table-view-with-grouping',
|
|
USER_GUIDE_VIEWS_PIPELINES_HOW_TOS_RESTRICT_ACCESS_TO_YOUR_VIEW:
|
|
'/user-guide/views-pipelines/how-tos/restrict-access-to-your-view',
|
|
USER_GUIDE_VIEWS_PIPELINES_HOW_TOS_SET_UP_A_SALES_PIPELINE:
|
|
'/user-guide/views-pipelines/how-tos/set-up-a-sales-pipeline',
|
|
USER_GUIDE_VIEWS_PIPELINES_HOW_TOS_SHOW_EXPECTED_AMOUNT_IN_PIPELINE:
|
|
'/user-guide/views-pipelines/how-tos/show-expected-amount-in-pipeline',
|
|
USER_GUIDE_VIEWS_PIPELINES_HOW_TOS_TRACK_TIME_IN_STAGE:
|
|
'/user-guide/views-pipelines/how-tos/track-time-in-stage',
|
|
USER_GUIDE_WORKFLOWS_CAPABILITIES_SEND_EMAILS_FROM_WORKFLOWS:
|
|
'/user-guide/workflows/capabilities/send-emails-from-workflows',
|
|
USER_GUIDE_WORKFLOWS_CAPABILITIES_USE_BRANCHES_IN_WORKFLOWS:
|
|
'/user-guide/workflows/capabilities/use-branches-in-workflows',
|
|
USER_GUIDE_WORKFLOWS_CAPABILITIES_USE_ITERATOR:
|
|
'/user-guide/workflows/capabilities/use-iterator',
|
|
USER_GUIDE_WORKFLOWS_CAPABILITIES_WORKFLOW_ACTIONS:
|
|
'/user-guide/workflows/capabilities/workflow-actions',
|
|
USER_GUIDE_WORKFLOWS_CAPABILITIES_WORKFLOW_BRANCHES:
|
|
'/user-guide/workflows/capabilities/workflow-branches',
|
|
USER_GUIDE_WORKFLOWS_CAPABILITIES_WORKFLOW_CREDITS:
|
|
'/user-guide/workflows/capabilities/workflow-credits',
|
|
USER_GUIDE_WORKFLOWS_CAPABILITIES_WORKFLOW_RUNS:
|
|
'/user-guide/workflows/capabilities/workflow-runs',
|
|
USER_GUIDE_WORKFLOWS_CAPABILITIES_WORKFLOW_TRIGGERS:
|
|
'/user-guide/workflows/capabilities/workflow-triggers',
|
|
USER_GUIDE_WORKFLOWS_CAPABILITIES_WORKFLOW_VERSIONS:
|
|
'/user-guide/workflows/capabilities/workflow-versions',
|
|
USER_GUIDE_WORKFLOWS_HOW_TOS_ADVANCED_CONFIGURATIONS_HANDLE_ARRAYS_IN_CODE_ACTIONS:
|
|
'/user-guide/workflows/how-tos/advanced-configurations/handle-arrays-in-code-actions',
|
|
USER_GUIDE_WORKFLOWS_HOW_TOS_CONNECT_TO_OTHER_TOOLS_BRING_PRODUCT_DATA_IN_TWENTY:
|
|
'/user-guide/workflows/how-tos/connect-to-other-tools/bring-product-data-in-twenty',
|
|
USER_GUIDE_WORKFLOWS_HOW_TOS_CONNECT_TO_OTHER_TOOLS_BRING_TYPEFORM_SUBMISSIONS_IN_TWENTY:
|
|
'/user-guide/workflows/how-tos/connect-to-other-tools/bring-typeform-submissions-in-twenty',
|
|
USER_GUIDE_WORKFLOWS_HOW_TOS_CONNECT_TO_OTHER_TOOLS_GENERATE_PDF_FROM_TWENTY:
|
|
'/user-guide/workflows/how-tos/connect-to-other-tools/generate-pdf-from-twenty',
|
|
USER_GUIDE_WORKFLOWS_HOW_TOS_CONNECT_TO_OTHER_TOOLS_GENERATE_QUOTE_OR_INVOICE_FROM_TWENTY:
|
|
'/user-guide/workflows/how-tos/connect-to-other-tools/generate-quote-or-invoice-from-twenty',
|
|
USER_GUIDE_WORKFLOWS_HOW_TOS_CONNECT_TO_OTHER_TOOLS_SET_UP_A_WEBHOOK_TRIGGER:
|
|
'/user-guide/workflows/how-tos/connect-to-other-tools/set-up-a-webhook-trigger',
|
|
USER_GUIDE_WORKFLOWS_HOW_TOS_CRM_AUTOMATIONS_AUTO_REPLY_TO_INBOUND_EMAILS:
|
|
'/user-guide/workflows/how-tos/crm-automations/auto-reply-to-inbound-emails',
|
|
USER_GUIDE_WORKFLOWS_HOW_TOS_CRM_AUTOMATIONS_CLOSED_WON_AUTOMATIONS:
|
|
'/user-guide/workflows/how-tos/crm-automations/closed-won-automations',
|
|
USER_GUIDE_WORKFLOWS_HOW_TOS_CRM_AUTOMATIONS_DETECT_STALE_OPPORTUNITIES:
|
|
'/user-guide/workflows/how-tos/crm-automations/detect-stale-opportunities',
|
|
USER_GUIDE_WORKFLOWS_HOW_TOS_CRM_AUTOMATIONS_DISPLAY_NUMBER_OF_EMAILS_RECEIVED:
|
|
'/user-guide/workflows/how-tos/crm-automations/display-number-of-emails-received',
|
|
USER_GUIDE_WORKFLOWS_HOW_TOS_CRM_AUTOMATIONS_DISPLAY_RELATED_RECORD_DATA:
|
|
'/user-guide/workflows/how-tos/crm-automations/display-related-record-data',
|
|
USER_GUIDE_WORKFLOWS_HOW_TOS_CRM_AUTOMATIONS_FORMULA_FIELDS:
|
|
'/user-guide/workflows/how-tos/crm-automations/formula-fields',
|
|
USER_GUIDE_WORKFLOWS_HOW_TOS_CRM_AUTOMATIONS_NOTIFY_TEAMMATES_OF_NOTE_TO_REVIEW:
|
|
'/user-guide/workflows/how-tos/crm-automations/notify-teammates-of-note-to-review',
|
|
USER_GUIDE_WORKFLOWS_HOW_TOS_CRM_AUTOMATIONS_SEND_EMAIL_ALERTS_WITH_TASKS_DUE:
|
|
'/user-guide/workflows/how-tos/crm-automations/send-email-alerts-with-tasks-due',
|
|
USER_GUIDE_WORKFLOWS_HOW_TOS_NEED_MORE_HELP_PROFESSIONAL_SERVICES:
|
|
'/user-guide/workflows/how-tos/need-more-help/professional-services',
|
|
USER_GUIDE_WORKFLOWS_HOW_TOS_NEED_MORE_HELP_WORKFLOW_TROUBLESHOOTING:
|
|
'/user-guide/workflows/how-tos/need-more-help/workflow-troubleshooting',
|
|
USER_GUIDE_WORKFLOWS_HOW_TOS_NEED_MORE_HELP_WORKFLOWS_FAQ:
|
|
'/user-guide/workflows/how-tos/need-more-help/workflows-faq',
|
|
USER_GUIDE_WORKFLOWS_OVERVIEW: '/user-guide/workflows/overview',
|
|
} as const;
|
|
|
|
export type DocumentationPath =
|
|
(typeof DOCUMENTATION_PATHS)[keyof typeof DOCUMENTATION_PATHS];
|