eb1ca1b9ec
## Summary
Logic-function bundles produced by the twenty-sdk CLI were ~1.18 MB even
for a one-line handler. Root cause: the SDK shipped as a single bundled
barrel (`twenty-sdk` → `dist/index.mjs`) that co-mingled server-side
definition factories with the front-component runtime, validation (zod),
and React. With no `\"sideEffects\"` declaration on the SDK package,
esbuild had to assume every module-level statement could have side
effects and refused to drop unused code.
This PR restructures the SDK so consumers' bundlers can tree-shake at
the leaf level:
- **Reorganized SDK source.** All server-side definition factories now
live under `src/sdk/define/` (agents, application, fields,
logic-functions, objects, page-layouts, roles, skills, views,
navigation-menu-items, etc.). All front-component runtime
(components, hooks, host APIs, command primitives) lives under
`src/sdk/front-component/`. The legacy bare `src/sdk/index.ts` is
removed; the bare `twenty-sdk` entry no longer exists.
- **Split the build configs by purpose / runtime env.** Replaced
`vite.config.sdk.ts` with two purpose-specific configs:
- `vite.config.define.ts` — node target, externals from package
`dependencies`, emits to `dist/define/**`
- `vite.config.front-component.ts` — browser/React target, emits to
`dist/front-component/**`
Both use `preserveModules: true` so each leaf ships as its own `.mjs`.
- **\`\"sideEffects\": false\`** on `twenty-sdk` so esbuild can drop
unreferenced re-exports.
- **\`package.json\` exports + \`typesVersions\`** updated: dropped the
bare \`.\` entry, added \`./front-component\`, and pointed \`./define\`
at the new per-module dist layout.
- **Migrated every internal/example/community app** to the new subpath
imports (`twenty-sdk/define`, `twenty-sdk/front-component`,
`twenty-sdk/ui`).
- **Added \`bundle-investigation\` internal app** that reproduces the
bundle bloat and demonstrates the fix.
- Cleaned up dead \`twenty-sdk/dist/sdk/...\` references in the
front-component story builder, the call-recording app, and the SDK
tsconfig.
## Bundle size impact
Measured with esbuild using the same options as the SDK CLI
(\`packages/twenty-apps/internal/bundle-investigation\`):
| Variant | Imports | Before | After |
| ----------------------- |
------------------------------------------------------- | ---------- |
--------- |
| \`01-bare\` | \`defineLogicFunction\` from \`twenty-sdk/define\` |
1177 KB | **1.6 KB** |
| \`02-with-sdk-client\` | + \`CoreApiClient\` from
\`twenty-client-sdk/core\` | 1177 KB | **1.9 KB** |
| \`03-fetch-issues\` | + GitHub GraphQL fetch + JWT signing + 2
mutations | 1181 KB | **5.8 KB** |
| \`05-via-define-subpath\` | same as \`01\`, via the public subpath |
1177 KB | **1.7 KB** |
That's a ~735× reduction on the bare baseline. Knock-on benefits for
Lambda warm + cold starts, S3 upload size, and \`/tmp\` disk usage in
warm containers.
## Test plan
- [x] \`npx nx run twenty-sdk:build\` succeeds
- [x] \`npx nx run twenty-sdk:typecheck\` passes
- [x] \`npx nx run twenty-sdk:test:unit\` passes (31 files / 257 tests)
- [x] \`npx nx run-many -t typecheck
--projects=twenty-front,twenty-server,twenty-front-component-renderer,twenty-sdk,twenty-shared,bundle-investigation\`
passes
- [x] \`node
packages/twenty-apps/internal/bundle-investigation/scripts/build-variants.mjs\`
produces the sizes above
- [ ] CI green
Made with [Cursor](https://cursor.com)
82 lines
3.0 KiB
TypeScript
82 lines
3.0 KiB
TypeScript
import { type ApplicationConfig } from 'twenty-sdk/define';
|
|
|
|
const config: ApplicationConfig = {
|
|
universalIdentifier: 'a4df0c0f-c65e-44e5-8436-24814182d4ac',
|
|
displayName: 'Fireflies',
|
|
description: 'Sync Fireflies meeting summaries, sentiment, and action items into Twenty.',
|
|
icon: 'IconMicrophone',
|
|
applicationVariables: {
|
|
FIREFLIES_WEBHOOK_SECRET: {
|
|
universalIdentifier: 'f51f7646-be9f-4ba9-9b75-160dd288cd0c',
|
|
description: 'Secret key for verifying Fireflies webhook signatures',
|
|
//isSecret: true,
|
|
value: '',
|
|
},
|
|
FIREFLIES_API_KEY: {
|
|
universalIdentifier: 'faa41f07-b28e-4500-b1c0-ce4b3d27924c',
|
|
description: 'Fireflies GraphQL API key used to fetch meeting summaries',
|
|
//isSecret: true,
|
|
value: '',
|
|
},
|
|
FIREFLIES_PLAN: {
|
|
universalIdentifier: '57dbb73c-aac5-4247-9fcc-a070bb669f16',
|
|
description: 'Fireflies plan: free, pro, business, enterprise',
|
|
value: 'free',
|
|
},
|
|
TWENTY_API_KEY: {
|
|
universalIdentifier: '02756551-5bf7-4fb2-8e08-1f622008d305',
|
|
description: 'Twenty API key used when running scripts locally',
|
|
//isSecret: true,
|
|
value: '',
|
|
},
|
|
SERVER_URL: {
|
|
universalIdentifier: '9b3a5e8e-5973-4e6b-a059-2966075652aa',
|
|
description: 'Base URL for the Twenty workspace (default: http://localhost:3000)',
|
|
value: 'http://localhost:3000',
|
|
},
|
|
AUTO_CREATE_CONTACTS: {
|
|
universalIdentifier: 'c4fa946e-e06b-4d54-afb6-288b0ac75bdf',
|
|
description: 'Whether to auto-create contacts for unknown participants',
|
|
value: 'true',
|
|
},
|
|
LOG_LEVEL: {
|
|
universalIdentifier: '2b019cf1-d198-48dd-943e-110571aa541e',
|
|
description: 'Log level: silent, error, warn, info, debug (default: error)',
|
|
value: 'error',
|
|
},
|
|
CAPTURE_LOGS: {
|
|
universalIdentifier: 'adbcc267-309d-49b2-af71-76f1299d863e',
|
|
description: 'Capture logs in webhook response for debugging (true/false)',
|
|
value: 'true',
|
|
},
|
|
FIREFLIES_SUMMARY_STRATEGY: {
|
|
universalIdentifier: '562b43d9-cd47-4ec1-ae16-5cc7ebc9729b',
|
|
description: 'Summary fetch strategy: immediate_only, immediate_with_retry, delayed_polling, or basic_only',
|
|
value: 'immediate_with_retry',
|
|
},
|
|
FIREFLIES_RETRY_ATTEMPTS: {
|
|
universalIdentifier: '670ca203-01ce-4ae8-8294-eb38b29434f2',
|
|
description: 'Number of retry attempts when fetching summaries',
|
|
value: '3',
|
|
},
|
|
FIREFLIES_RETRY_DELAY: {
|
|
universalIdentifier: '2e8ccb82-9390-47ba-b628-ca2726931bce',
|
|
description: 'Delay in milliseconds between retry attempts',
|
|
value: '5000',
|
|
},
|
|
FIREFLIES_POLL_INTERVAL: {
|
|
universalIdentifier: '904538f7-7bec-4ee6-9bac-5d43c619b667',
|
|
description: 'Polling interval (ms) when using delayed polling strategy',
|
|
value: '30000',
|
|
},
|
|
FIREFLIES_MAX_POLLS: {
|
|
universalIdentifier: '84d54c97-5572-4c01-9039-764ab3aa87b8',
|
|
description: 'Maximum number of polling attempts when waiting for summaries',
|
|
value: '10',
|
|
},
|
|
},
|
|
};
|
|
|
|
export default config;
|
|
|