Tags: ToolJet/ToolJet
Tags
chore: release 3.20.199-lts (#17307) * chore: bump version to 3.20.199-lts across all components * Fix: Text input height in preview (#17284) * fix: consider label height in preview * fix: review comments * fix: page load and app load events execute after AI generation (#17252) * fix: page load and app load events execute after AI generation * Submodule update * chore: server/ee submodule update * Submodule update --------- Co-authored-by: Swathi Hameed <42898362+swathihameed@users.noreply.github.com> * chore: update frontend and server submodules to latest commits * fix: enforce ModuleContainer parent for module app components (#17319) * fix: add type casting for pagesWithComponents return value (#17321) * fix: enforce ModuleContainer parent for module app components (#17322) For module-type apps, prevents components from being placed directly on the root canvas (parent: null). If a component would be saved without a parent, and the app is a module, the guard automatically assigns the ModuleContainer as the parent. Guard is applied in: - createComponentsAndLayouts (new components) - updateComponents (property updates with parent change) - componentLayoutChange (layout moves with re-parenting) - updateComponentLayouts (batch layout changes with re-parenting) --------- Co-authored-by: Parth <108089718+parthy007@users.noreply.github.com> Co-authored-by: Shaurya Sharma <79473274+shaurya-sharma064@users.noreply.github.com> Co-authored-by: Swathi Hameed <42898362+swathihameed@users.noreply.github.com> Co-authored-by: vjaris42 <vjy239@gmail.com>
chore: update version to 3.20.199-lts across all components
Release v3.21.52 beta (#17147) * chore: update version to 3.21.52-beta * Feature: background git-sync jobs with realtime notifications (#16820) * Perf: kill redundant branch predicate on /api/apps dashboard query The dashboard /api/apps endpoint took ~28s end-to-end on the Swiggy dataset (~540k app_versions rows). The CE applyAppVersionsJoin already INNER JOINs app_versions on the branch, and EE's addBranchFilter was adding a NOT EXISTS / OR EXISTS predicate on top — the planner ran two correlated subplans per app row, ~600x over the necessary cost. Plumb a skipBranchScope flag from buildViewableAppsQuery so EE skips its branch predicate whenever the inner join will run. The count() path still applies it. Same redundant block deleted from folder-apps getAppsFor; INNER JOIN there enforces scope on its own. Add an index on app_versions(branch_id) WHERE branch_id IS NOT NULL, plus composite (app_id, branch_id), so even the EE addBranchFilter EXISTS probe runs as an index scan instead of a seq scan. Local EXPLAIN ANALYZE on the prod-cloned DB: COUNT query drops from cost 3,029,131 / 53k buffers / 233ms to 1,882 / 138 buffers / 2.1ms. Folder path EXPLAIN drops from 454 to 216 cost. Co-Authored-By: Claude Opus 4.7 (1M context) <noreply@anthropic.com> * Add folder_apps(folder_id) index for /api/folder-apps sidebar The folder-apps sidebar count endpoint was timing out at 60s on the prod-shape dataset. The outer query filters folder_apps by folder_id IN (...) but folder_apps had no index on folder_id — only on app_id. Adding this composite-friendly index drops the local plan cost from 1.25M to 43K and execution from 94ms to 7ms. The endpoint's existing branch predicate (NOT EXISTS / OR EXISTS on app_versions.branch_id) is the legitimate sole branch enforcer here since there is no INNER JOIN on app_versions; it benefits from the indexes added in this same migration. Co-Authored-By: Claude Opus 4.7 (1M context) <noreply@anthropic.com> * Fix: sidebar folder counts inflated by per-branch folder_apps replication server/ee bump for the folder_apps.branch_id constraint added to EE applyBranchFilter. Co-Authored-By: Claude Opus 4.7 (1M context) <noreply@anthropic.com> * Perf: trim heavy JSONB columns from /api/apps editing version hydration hydrateEditingVersionInBulk now selects only the columns dashboard cards need (id, name, ids, timestamps), skipping definition / globalSettings / pageSettings. Saves ~50KB+ per dashboard request on apps with non-trivial definitions; payload drops proportionally. Verified no other consumer of these columns sits on the /api/apps path (getBySlug / getOne / workflow runner / git pull all fetch via direct repository calls that pull full rows). applyAppVersionsJoin kept on innerJoinAndSelect — TypeORM's DISTINCT pagination wrapper for getManyAndCount breaks when innerJoin + addSelect are mixed (missing FROM-clause for alias). The bulk-hydrated editingVersion is the dominant payload anyway. Also: caveman the applyAppVersionsJoin docstring. Co-Authored-By: Claude Opus 4.7 (1M context) <noreply@anthropic.com> * Perf: trim /api/apps/:id show path (module fetch, license memo, repo tx wraps) Three independent improvements observed via OTel/Tempo traces on a 14k-app worktree (app 342abbce, parent of 1 module across 8 branches): 1. fetchModules — replace dbTransactionWrap + N per-module findOne with a single DISTINCT ON query, and wrap in skipAppEditingVersionHydration so loaded module Apps skip subscriber.afterLoad. For an app with N embedded modules, drops 1 tx + (2N) SELECTs (afterLoad + per-module branch-version probe) and N round trips. 2. LicenseRepository.getLicense — memoize the InstanceSettings lookup per request via RequestContext.res.locals. Same row was being fetched 17 times per /api/apps/:id (each call to getLicenseTerms triggers licenseInitService.init). Drops 15 SELECTs + 15 START/COMMIT pairs per warm request. 3. Repository tx-wrap cleanup — replace dbTransactionWrap(op, manager || this.manager) with direct (manager ?? this.manager).op(...) in read-only methods of versions/apps/data-queries/data-sources/orgs/ group-permissions repositories. No behavioural change (the helper already no-op'd when a manager was passed), but removes dispatch overhead and clarifies that these are not atomic operations. Write methods (createOne / save / multi-statement updates) keep the wrap. Verified via Playwright + Tempo on app 342abbce: cold first-open trace (with stub hydration): 14318 ms / 1395 spans warm trace pre-changes: 1313 ms / 225 spans warm trace post-changes (1+2+3): 1259 ms / 165 spans Frontend response shape unchanged: parent editing_version (25 keys) and modules[].editing_version (25 keys, branch-scoped) both intact. The 21 START/COMMIT pairs still present on the warm path come from util.service callers (org themes, ai conversation, app-environments, app-git) that invoke dbTransactionWrap without a manager — those are the next target. * Perf: per-request memos for theme/findVersion/getAppEnvironment + drop read tx wraps Add per-request memoization via RequestContext.res.locals for hot lookups that the /api/apps/:id show path repeats with identical arguments: - OrganizationThemesUtilService.getTheme — same (orgId, themeId) fetched 4× per show (CE prepare + EE prepare + module path). Memo keyed by `${orgId}:${themeId ?? '_default'}`. 4 → 1 SELECT (observed in trace 7d199d8d: OrganizationThemes count 4 → 2; remaining 2 are distinct themeIds on the same page). - AppEnvironmentUtilService.get + getByPriority — drop dbTransactionWrap (single-statement reads) and memo by (orgId, id, multiEnv, priorityCheck). AppEnvironment SELECT count 2 → 0 in trace (cache + reuse of resolved env entity). - VersionRepository.findVersion — memo by versionId, skipped when a tx-bound manager is passed (caller owns isolation). Bounded by request lifetime. Also bumps EE submodule to pick up the matching findAppGitByAppOrCoRelationId call-site updates (CE+EE collapsed two queries into one OR query against the new repository method). Trace comparison on app 342abbce, warm /api/apps/:id: pre (6510ab0b): 1259 ms, 165 spans, 21 START / 55 SELECT post (7d199d8d): 770 ms, 153 spans, 19 START / 50 SELECT ~-40% latency on warm path. The remaining 19 transactions are from AiConversation (×2 panels), folderApp visibility query, ability/permission checks, and session/audit writes — separate PRs. * Perf: drop unneeded tx wrap from folder-permissions read block in ability service resourceActionsPermission ran a block of 2-4 FolderApp+folder JOIN SELECTs inside dbTransactionWrap. All reads, no writes. The wrap was opening an unnecessary transaction (saw one extra START/COMMIT per permission resolution in /api/apps/:id show traces). Replace with bare getConnectionInstance().manager scope. Behaviour unchanged — Postgres READ COMMITTED gives per-statement snapshots regardless of whether they're wrapped in a tx. Bigger wins for these queries (combine 2 JOINs into 1 OR query, or memo the entire resolved permission set per request) deferred to follow-up work — both touch the broader permission resolution flow. * Perf: per-(user, app) rate limit on data-query run endpoints Adds two named throttler buckets ('editor' and 'viewer') registered in DataQueriesModule via ThrottlerModule.forRootAsync with env-driven values. A custom AppScopedThrottlerGuard subclasses ThrottlerGuard to key buckets by (user, app) — falling back to (ip, app) for anon viewer hits on public apps — so one runaway query loop in one app can't starve other apps or other users on the same app. Endpoints guarded: - POST /api/data-queries/:id/versions/:versionId/run/:environmentId - POST /api/data-queries/:id/run Decorator pattern: @SkipThrottle({ <other>: true }) selects which named bucket counts per endpoint. NOT @Throttle({...}) literals — those would bake values at class-load and bypass env config. Env knobs (defaults match historical no-limit behavior closely enough to be safe): DATA_QUERY_RUN_THROTTLE_ENABLED=true # runtime kill-switch DATA_QUERY_RUN_EDITOR_TTL=10000 # window ms DATA_QUERY_RUN_EDITOR_LIMIT=30 # per (user, app) per window DATA_QUERY_RUN_VIEWER_TTL=10000 DATA_QUERY_RUN_VIEWER_LIMIT=60 Verified via curl: - defaults: 60 viewer reqs pass, 61st returns 429 with Retry-After-viewer - env override LIMIT=5: 5 pass, 6th 429 - ENABLED=false: no X-RateLimit headers, no 429 Notes: - Single-pod only. Multi-pod will need ThrottlerStorageRedisService — effective limit otherwise = LIMIT * pod_count. - Internal callers (workflow execution invoking the service directly) bypass HTTP so are unaffected. * Perf: dedupe folder_apps in SQL during permission resolution createUserAppsPermissions fetched folder_apps with .getMany() then JS-deduped to a Set. folder_apps is replicated per branch, so on git-sync orgs (e.g. 519 branches) this hydrated ~133k rows to yield ~553 distinct app ids — per request, on every ability-guarded endpoint. Push DISTINCT into SQL via getRawMany so Postgres returns the 553 rows directly; +11ms server HashAggregate trades for ~132k fewer rows transferred and hydrated per call. All four folderApp arms (owned / all-folders / editable / viewable) get the same treatment. Output unchanged — the Set already collapsed to the distinct set. Co-Authored-By: Claude Opus 4.8 (1M context) <noreply@anthropic.com> * Perf: O(1) raw-row lookup in allGlobalDS data-source list Replace two rawResults.find() calls inside the per-DS map with a single Map keyed by data_source_id. Quadratic at list scale (390+ global data sources per org on git-sync workspaces); ~75ms CPU saved at 5k sources. Co-Authored-By: Claude Opus 4.8 (1M context) <noreply@anthropic.com> * Perf: flag misnamed meta_timestamp; bump ee (data-source N+1 batching) - FIXME on DataSourceVersion.metaTimestamp: it stores a content hash (truncated sha256 of the DS git JSON, used for pull dedup), not a timestamp; numeric column returns as string so callers must coerce. - Bump server/ee submodule: batched data-source deserialize (kills the per-data-source N+1 on branch create/pull). Co-Authored-By: Claude Opus 4.8 (1M context) <noreply@anthropic.com> * test(git-cache): mirrorPathFor keying + flag unit tests Co-Authored-By: Claude Opus 4.8 (1M context) <noreply@anthropic.com> * chore(git-cache): bump server/ee pointer to git-object-cache scaffold Co-Authored-By: Claude Opus 4.8 (1M context) <noreply@anthropic.com> * test(git-cache): auth header hygiene unit test Co-Authored-By: Claude Opus 4.8 (1M context) <noreply@anthropic.com> * chore(git-cache): bump server/ee pointer (auth header builder) Co-Authored-By: Claude Opus 4.8 (1M context) <noreply@anthropic.com> * chore(git-cache): bump server/ee pointer (lock + ensureMirror) Co-Authored-By: Claude Opus 4.8 (1M context) <noreply@anthropic.com> * chore(git-cache): bump server/ee pointer (cachedSparseClone) Co-Authored-By: Claude Opus 4.8 (1M context) <noreply@anthropic.com> * feat(git-cache): register GitObjectCacheService in DI Add GitObjectCacheService to WorkspaceBranchesModule providers + exports via getProviders dynamic import, so it can be injected by WorkspaceBranchService, PlatformGitPullService, and git-sync service in upcoming tasks. RedisService is already globally available via RedisModule.forRoot() in the app loader. Co-Authored-By: Claude Opus 4.8 (1M context) <noreply@anthropic.com> * chore(git-cache): bump server/ee pointer (route workspace-branches clones) Co-Authored-By: Claude Opus 4.8 (1M context) <noreply@anthropic.com> * test(git-cache): eviction TTL + size-cap + evict unit tests Co-Authored-By: Claude Opus 4.8 (1M context) <noreply@anthropic.com> * chore(git-cache): bump server/ee pointer (eviction) Co-Authored-By: Claude Opus 4.8 (1M context) <noreply@anthropic.com> * feat(git-cache): wire cache DI for git-sync disconnect Co-Authored-By: Claude Opus 4.8 (1M context) <noreply@anthropic.com> * chore(git-cache): bump server/ee pointer (redis pub/sub eviction) Co-Authored-By: Claude Opus 4.8 (1M context) <noreply@anthropic.com> * fix(git-cache): single GitObjectCacheService instance (own+export in GitSyncModule) Co-Authored-By: Claude Opus 4.8 (1M context) <noreply@anthropic.com> * chore(git-cache): bump server/ee pointer (route hydrate clone through cache) Co-Authored-By: Claude Opus 4.8 (1M context) <noreply@anthropic.com> * chore(git-cache): bump server/ee pointer (--dissociate reference clone) Co-Authored-By: Claude Opus 4.8 (1M context) <noreply@anthropic.com> * docs(git-cache): document GIT_OBJECT_CACHE flags Co-Authored-By: Claude Opus 4.8 (1M context) <noreply@anthropic.com> * docs(git-cache): record parity + cold/warm + security verification results Co-Authored-By: Claude Opus 4.8 (1M context) <noreply@anthropic.com> * chore(git-cache): bump server/ee pointer (caveman comments) Co-Authored-By: Claude Opus 4.8 (1M context) <noreply@anthropic.com> * chore(git-cache): move perf findings doc out of repo (to local vault) Co-Authored-By: Claude Opus 4.8 (1M context) <noreply@anthropic.com> * test(git-cache): GIT_OBJECT_CACHE_DIR root resolution; docs: cache dir + 2GB cap Co-Authored-By: Claude Opus 4.8 (1M context) <noreply@anthropic.com> * chore(git-cache): bump server/ee pointer (default-branch blobs + cache dir) Co-Authored-By: Claude Opus 4.8 (1M context) <noreply@anthropic.com> * chore(git-cache): bump server/ee pointer (non-blobless mirror + local-blob clone) Co-Authored-By: Claude Opus 4.8 (1M context) <noreply@anthropic.com> * test(git-cache): cover plainClone fallback precondition; bump server/ee pointer Adds a unit test that forces ensureMirror to fail and asserts the empty-temp-dir precondition is restored before plainClone runs (Invariant 4 safety net). Bumps server/ee to the unconditional-broadcast fix. Co-Authored-By: Claude Opus 4.8 (1M context) <noreply@anthropic.com> * feat(git-cache): CE stub for GitObjectCacheService + Redis fleet-eviction specs CE builds resolve providers from src/modules/git-sync/ — without a sibling GitObjectCacheService there, getProviders' dynamic import rejects and CE boot fails. Add an inert pass-through stub (isEnabled=false, cachedSparseClone runs plainClone, evictEverywhere no-op) so CE behaves exactly as flag-off. Adds concrete fake-Redis specs (subscribe on init, deliver->evict mirror, ignore malformed message, publish+disconnect on evictEverywhere, unsubscribe on destroy). 17 unit tests pass. Co-Authored-By: Claude Opus 4.8 (1M context) <noreply@anthropic.com> * docs(git-cache): make cache unit spec readable for a novice engineer Adds a file-level explainer (what the service does, what the suite covers), per-block intros, and plain-language Arrange/Act/Assert comments. Renames tests to describe behavior in prose. No behavior change — 17 tests still pass. Co-Authored-By: Claude Opus 4.8 (1M context) <noreply@anthropic.com> * docs(git-cache): trim redundant test-coverage list from spec header The numbered coverage list duplicated the describe blocks and the AAA note was generic — kept only the service explainer. Co-Authored-By: Claude Opus 4.8 (1M context) <noreply@anthropic.com> * test(git-cache): enforce fake-Redis fidelity at runtime The repo runs ts-jest with diagnostics off + isolatedModules, so specs are not type-checked — type-only guards would never fail `npm test`. Instead assert at runtime that RedisService keeps its factory methods and that an ioredis connection exposes every method the fake stubs (prototype checks, no server contacted). Fakes still `implements` a narrow contract for authoring/IDE. Co-Authored-By: Claude Opus 4.8 (1M context) <noreply@anthropic.com> * test(git-cache): address spec review — kill tautology, close coverage gaps - garbage-message test was a tautology (sync .not.toThrow on a promise); now awaits .resolves and asserts no mirror was evicted on bad input - add OFF-path test (flag off -> plainClone directly, temp dir untouched) — the byte-for-byte/CE-parity guarantee - add withLock serialization tests (same key serial, different keys concurrent) - add 'still broadcasts when local evict fails' regression guard - harden fire-and-forget assertions: poll (flushUntil) instead of one setImmediate - tighten test isolation: clear ROOT + all cache env vars in early describe blocks - explain the size-cap magic number 23 tests pass. Co-Authored-By: Claude Opus 4.8 (1M context) <noreply@anthropic.com> * feat: background git-sync jobs for create/pull/delete branch - git-sync-queue (BullMQ) registered in workspace-branches module; processor gated WORKER=true (workflows pattern); Bull Board visibility at /jobs - CE stubs keep module graph identical across editions - Frontend: enqueue ack toasts, no auto-switch to not-yet-created branches - E2E: jobs run inline via enqueue spies; branch ids resolved from list Co-Authored-By: Claude Fable 5 <noreply@anthropic.com> * fix: address review — worker-side tests + submodule pointer - Unit tests for delete-branch 404 tolerance (gone = success, others retry) and failed-event hook safety; BullMQ Queue fidelity check - ee pointer: retry-poisoning purge, failed-job logging, lease-overrun warning Co-Authored-By: Claude Fable 5 <noreply@anthropic.com> * feat: git-push-app-deletion job constant + tests - New job type constant; unit tests for coalescing enqueue (jobId + delay) and processor dispatch; e2e inline spy for the new job Co-Authored-By: Claude Fable 5 <noreply@anthropic.com> * feat: transactional branch delete (remote ref then DB) via git-sync queue - deleteWorkspaceBranch returns enqueue ack; interfaces + CE stub updated - DeleteBranchJobPayload carries branchId/branchName/userId; jobId keyed by branchId - unit + e2e updated: dispatch → executeDeleteBranch, remote-helper 404 tests kept Co-Authored-By: Claude Opus 4.8 <noreply@anthropic.com> * chore: trim comments to terse why-only Remove what-changed narration from CE-side and test comments; bump ee pointer. Co-Authored-By: Claude Opus 4.8 <noreply@anthropic.com> * feat: BullMQ queue + worker metrics; CE stub parity - BullMqMetricsService emits OTel ObservableGauges bullmq.queue.jobs (by queue + state) and bullmq.queue.workers via the existing OTLP push; reads counts from Redis so it runs on any pod (ENABLE_OTEL-gated, not WORKER-gated) - register BullMqMetricsModule under ENABLE_OTEL in the app loader - CE git-sync-queue stub: add enqueuePushAppDeletion no-op for edition parity - bump server/ee submodule pointer (git.operation + git.db-import spans) Co-Authored-By: Claude Opus 4.8 <noreply@anthropic.com> * chore: reword async git-sync toasts to plain in-progress copy Co-Authored-By: Claude Opus 4.8 <noreply@anthropic.com> * feat(notifications): add Notification + NotificationRecipient entities and module constants Co-Authored-By: Claude Sonnet 4.6 <noreply@anthropic.com> * feat(notifications): migration for notifications + notification_recipients tables Co-Authored-By: Claude Sonnet 4.6 <noreply@anthropic.com> * feat(notifications): NotificationService.notify + repository + persist-only InAppChannel Co-Authored-By: Claude Sonnet 4.6 <noreply@anthropic.com> * feat(notifications): Task 4 — REST controller, CE/EE modules, e2e tests - ListNotificationsQueryDto with class-validator (status/limit/before) - INotificationController interface - NotificationController: GET /notifications, GET /notifications/unread-count, PATCH /notifications/:recipientId/read, PATCH /notifications/read-all (JwtAuthGuard + @user() decorator; consistent with workspace-branches pattern) - NotificationsModule (CE SubModule) registered in AppModule.baseImports so it loads under IS_GET_CONTEXT:true (test mode) as well - server/ee/notifications/module.ts re-exports CE module for EE edition dynamic-import resolution - unreadCount uses raw SQL (SELECT COUNT(*)) — TypeORM manager.count() returns stale data after a QueryBuilder UPDATE within the test transaction proxy (same-session cache; raw query() sees the update) - e2e: 5 tests covering list / unread-count / mark-read / read-all / 401 Co-Authored-By: Claude Sonnet 4.6 <noreply@anthropic.com> * fix(notifications): restore isMainImport guard, fix test discovery, DTO validation - module.ts: gate controller mounting on isMainImport so feature modules (e.g. workspace-branches) can import NotificationsModule for the exported NotificationService without re-registering the route (duplicate-route bug) - app/module.ts: pass isMainImport=true in baseImports so the controller mounts exactly once at the main app import - e2e: wrap the unauthenticated-request test in its own describe so jest-runner-groups discovers it (was silently skipped; now 5 run, not 4) - dto: add @IsDateString() to `before` cursor so an invalid value is rejected at validation instead of producing Invalid Date - update server/ee submodule pointer (orphaned EE re-export removed) Co-Authored-By: Claude Opus 4.8 <noreply@anthropic.com> * feat(notifications): git-error-classifier unit tests + submodule pointer Co-Authored-By: Claude Opus 4.8 <noreply@anthropic.com> * fix(notifications): cover gho/ghu/ghr token scrub + classifier ordering; tests Co-Authored-By: Claude Opus 4.8 <noreply@anthropic.com> * feat(notifications): wire git-sync error producer + NotificationsModule into workspace-branches Co-Authored-By: Claude Sonnet 4.6 <noreply@anthropic.com> * feat(notifications): real notifications service + store + generic bell row + error detail modal - notificationsService wraps HttpClient for list/unreadCount/markRead/markAllRead - notificationsStore (zustand) holds items/unreadCount/isLoading; fetch/refreshUnread/markRead/markAllRead actions - NotificationRow: icon-typed generic row (info/success/warning/error), error rows open ErrorDetailModal on click - ErrorDetailModal: collapsible stack trace with clipboard copy; P2 git-sync deep-link omitted (app-builder-scoped) - NotificationCenter/index.jsx rewired from commentNotificationsService to store; badge shows live unreadCount - SCSS row + trace styles added to theme.scss; en.json gets notifications.* keys Co-Authored-By: Claude Opus 4.8 <noreply@anthropic.com> * fix(notifications): markRead/markAllRead return { error } so callers can destructure Both mutating store actions previously returned undefined (set with no return, early-return on error), so handleMarkAllRead's `const { error } = await actions.markAllRead()` threw TypeError: Cannot destructure property 'error' of undefined. Return a consistent { error } shape. Co-Authored-By: Claude Opus 4.8 <noreply@anthropic.com> * fix(notifications): align bell row icon column with panel header Row padding (8px 4px) inside the p-3 list pushed the icon 4px off the 'Notifications' header's left edge. Use p-2 list + symmetric 8px row padding so the icon column lines up with the header (x=68). Co-Authored-By: Claude Opus 4.8 <noreply@anthropic.com> * fix(notifications): cap bell list to ~4 rows with scroll, open upward Bell sits low in the left rail; with placement=right the panel grew downward and clipped at the viewport bottom. Switch to right-end (grows up from the bell) and cap the list at 320px with overflow-y:auto so it shows ~4 rows and scrolls the rest. Co-Authored-By: Claude Opus 4.8 <noreply@anthropic.com> * feat(git-cache): default object cache on in env + tests - .env.example: GIT_OBJECT_CACHE=false -> DISABLE_GIT_OBJECT_CACHE=false - update git-object-cache unit spec for inverted enable semantics * chore: update submodule pointer (server/ee) * chore: update submodule pointer (frontend/ee) Record frontend/ee merge of release/v3.21.46-beta into superproject. * chore(git-sync): drop dead code + fix stale test after async-job merge - Remove dead deleteBranch from CE stub + IWorkspaceBranchService; live delete path is deleteWorkspaceBranch (enqueue) -> queue worker. - Delete orphaned PullConflictDetectionService (replaced by GitConflictDetectionService during the merge). - Fix push-path-resolution unit test for resolveAppPath's 3-arg displayName signature; drop `any` casts. Co-Authored-By: Claude Opus 4.8 <noreply@anthropic.com> * feat(notifications): realtime push, redesigned panel, clear-read + arrival toasts Backend: - /ws/notifications gateway relays producer notifications from Redis pub/sub to the recipient's sockets, carrying an ephemeral toast flag - DELETE /notifications/read clears read notifications (recipients + orphaned content rows); unread items are untouched - notify() accepts toast intent; in-app channel publishes it with the realtime payload without persisting it Frontend (per Figma notification system design): - panel redesign: unread count pill, mark-all-read + clear-read header actions, cursor-based Load more, empty state - rows: per-type icons, right-edge unread dot, hover open/mark-read actions (detail opens only via the open icon), mono branch names - branded arrival toast (self-managed mount; react-hot-toast drops dispatches from the ws handler) with View details -> mark read + modal - error detail modal restyled: trace shown by default, Copy trace button Co-Authored-By: Claude Fable 5 <noreply@anthropic.com> * chore: update submodule pointers Co-Authored-By: Claude Fable 5 <noreply@anthropic.com> * chore(git-sync): restore frontend/ee submodule pointer dropped by PR #16937 merge GitHub PR merge copied error-notifications' older frontend/ee pointer (9cd092e0), dropping bg-jobs commit #488 (cross-branch push conflict-detection UI). Restore to 88cbe992. Co-Authored-By: Claude Opus 4.8 <noreply@anthropic.com> * fix(git-sync): remove duplicate GitObjectCacheService provider entries * test(git-sync): cover conflict-trace formatting + fix stale processor constructor calls New coverage for the drift-net path: onFailed formats conflictGroups into the notification trace (conflict vs generic branching), extractConflictGroups rejects malformed payloads, formatConflictTrace caps at 50 items and labels slug groups. Also passes the notificationService fake the processor constructor has required since the notifications merge. Co-Authored-By: Claude Fable 5 <noreply@anthropic.com> * chore: update submodule pointer (server/ee) * fix(notifications): org-scope reads, repair clear-read cleanup, keep standard toasts - Scope list/unread-count/mark-all-read/clear-read to the active organization so multi-workspace users only see the current workspace's notifications - Fix clear-read orphan cleanup: TypeORM returns [rows, rowCount] for DELETE, so the content-row delete never matched; destructure and cast ids to uuid[] - Drop the custom ToastCard; arrival toasts ride the standard react-hot-toast look with an inline "View details" action - Remove superseded comment-notifications component and service * chore: update submodule pointers * feat(git-sync): wire mirror-warm broadcast service with CE stub CE stub is inert (no cache to warm); EE implementation registered through the edition-routed provider list. Unit spec covers broadcast payload, disable flags, cred resolution, and best-effort failure handling. * chore: update submodule pointers * chore: update submodule pointers * test(git-sync): cover import-specific notification copy Also updates the server/ee submodule pointer. * fix(notifications): style Load more as pinned footer bar per design Centered label with top border below the scroll area (Figma 70:8193), replacing the left-aligned link-style text. * feat(notifications): remove deletes, read on explicit click Row X now deletes the notification (user-scoped recipient delete with orphan-guard content cleanup via DELETE /notifications/:recipientId). Row click marks read; rows with details open the popup instead, which already marks read. Mark-read-on-view was considered and dropped. Co-Authored-By: Claude Fable 5 <noreply@anthropic.com> * chore(nginx): route /jobs to the server for the queue dashboard Without a location block, /jobs fell into the SPA catch-all and rendered the React unknown-route page instead of Bull Board. Co-Authored-By: Claude Fable 5 <noreply@anthropic.com> * fix(git-sync): import-aware create toast + default branch in delete copy Create-branch ack now carries isImport so both create modals say "Importing branch" when the remote ref already exists. Feature-branch app deletion confirm names the actual default branch instead of "main". Co-Authored-By: Claude Fable 5 <noreply@anthropic.com> * perf(git-sync): export GitMirrorWarmerService for check-updates warm checkForUpdates in ee now broadcasts a mirror warm; expose the warmer from the git-sync module so the ee service can inject it. * fix(notifications): match toast to design and widen one-line toasts View details is now a bordered secondary button on the same row as the message (design 70:6926). react-hot-toast caps toasts at 350px which wrapped the copy to three lines — raise maxWidth to 640px on notification toasts and git-sync create/import acks. * chore: update submodule pointers * chore: remove dead commented-out code and obvious comments * fix(notifications): dark mode panel colors per design --borders-weak has no dark token and --slate3 stays light inside .dark-theme, so the panel border, header divider, and unread count pill rendered light-mode colors on the dark panel. Scope explicit dark values on .notification-center.dark-theme (Figma 282:4776). * chore: update submodule pointers --------- Co-authored-by: Claude Opus 4.7 (1M context) <noreply@anthropic.com> Co-authored-by: gsmithun4 <gsmithun4@gmail.com> * Chore: Deprecate `appId` and enhance page entity relationships with `targetCorelationId` (#16425) * feat: deprecate appId in favor of targetCorelationId for improved page entity relationships * feat: add methods to resolve app slugs by co_relation_id and merge additional page data for improved app navigation * feat: refactor AddNewPagePopup to use targetCorelationId and update app fetching logic for improved app integration * feat: add targetCorelationId to page service and utility for improved page data handling * feat: implement reverse lookup for app slugs to co_relation_id mapping, enhancing page import functionality * Update ee-server submodule reference * feat: update EventManager and GotoApp components to utilize co_relation_id, enhancing app selection and event handling * feat: add mergeAdditionalEventData method to AppsUtilService for enhanced event handling and update service.ts to utilize new functionality * feat: implement normalization of go-to-app event blobs by replacing legacy slug with correlationId during import, ensuring compatibility with migrated data * feat: refactor AppsService and AppsUtilService to streamline page and event data handling, replacing legacy methods with new linkedApps collection logic for improved app navigation * feat: add linkedApps state management to appSlice and update useAppData hook for enhanced app navigation and event handling * feat: enhance GotoApp and AddNewPagePopup components to utilize linkedApps for improved app selection and slug management, ensuring compatibility with migrated data * feat: update AppsUtilService and IUtilService to return app data including currentVersionId alongside slug, enhancing app resolution logic for improved data handling * feat: enhance EventManager, GotoApp, and AddNewPagePopup components to validate linked apps, improving error handling and user feedback for undefined apps * Update ee-server submodule reference * Resolved comments * Potential fix for pull request finding Co-authored-by: Copilot Autofix powered by AI <175728472+Copilot@users.noreply.github.com> * Update submodule references * Update ee-server submodule reference * Refactor app validation logic in EventManager, GotoApp, AddNewPagePopup, and PageMenuItem components to improve correlation ID checks. Update error handling for undefined apps and enhance user feedback with tooltips. Ensure backward compatibility for go-to-app events in eventsSlice. * Update ee-server submodule reference * Refactor: Update appService to appsService in EventManager and AddNewPagePopup components for consistency in service usage * Update ee-server submodule ref * Update ee-server submodule references * Refactor app link validation logic across components to improve error handling and messaging. Update `isLinkedAppValid` function to return detailed validation results. Adjust related components to utilize new validation structure, enhancing user feedback for undefined or unreleased apps. * Update ee-server submodule reference * Enhance app data handling in useAppData hook by preserving linkedApps during data conversion for preview versions. * update submodule reference * Update submodule references * Add migrations to backfill correlation IDs for go-to-app events and pages - Implemented a migration to replace the `slug` key with a `correlationId` in go-to-app event handlers, ensuring cross-environment navigation resolves correctly. - Added a new column `target_corelation_id` to the `pages` table and backfilled it for pages referencing other apps, enhancing cross-app navigation consistency. * Refactor useAppData and convertAllKeysToSnakeCase functions - Removed the handling of `linkedApps` from the `useAppData` hook to streamline data processing. - Updated the `convertAllKeysToSnakeCase` function to exclude `linkedApps` from key conversion, ensuring consistent data structure. * Refactor event and page menu slices to safely access linkedApps - Updated the access pattern for `appSlug` in both `eventsSlice.js` and `pageMenuSlice.js` to use optional chaining, preventing potential runtime errors when `linkedApps` is undefined. * Update migrations to use organization_git_sync_branches for correlation ID backfill - Modified the migration for backfilling `goToAppEventSlug` to join with `organization_git_sync_branches` instead of `workspace_branches`, ensuring accurate correlation ID retrieval. - Enhanced the `AddTargetCorelationIdToPages` migration to include a check for `pages.type = 'app'` during the backfill process, improving data integrity and preventing junk values. * Enhance resolveCorelationIdsBySlugs method for improved app correlation ID resolution - Updated the method to restrict lookups to front-end apps only, aligning with navigation requirements. - Improved the ordering logic to prioritize default branches and ensure deterministic results based on `updated_at` and `id`. - Expanded documentation to clarify the method's purpose and tie-breaker logic for resolving app slugs. * Update submodule reference * Fix: update co_relation_id assignment in Import logic to prioritize co_relation_id over id * Update app-import-export service to enhance correlation ID handling and import logic; remove legacy methods and streamline target correlation ID resolution. * Fix: correlation ID resolution * Add go-to-app link helpers for legacy slug resolution and import normalization This commit introduces a new helper module for resolving legacy go-to-app references during app imports. It includes functions for mapping app slugs to correlation IDs, rewriting event blobs, and collecting legacy slugs from various components. The app-import-export service has been updated to utilize these helpers, streamlining the import process and ensuring compatibility with legacy data formats. * Enhance migration scripts for backfilling correlation IDs This commit updates the migration scripts to improve logging and tracking of processed records. The `BackfillGoToAppEventSlugWithCorrelationId` migration now reports total processed and updated records, while the `AddTargetCorelationIdToPages` migration includes detailed progress logs and handles cases with no candidate pages more gracefully. These changes enhance visibility into the migration process and ensure better handling of edge cases. * Update submodule reference and add method to find default workspace branch ID This commit updates the submodule reference in the server/ee file and introduces a new method in the OrganizationGitSyncRepository class to find the default workspace branch ID for an organization. The new method enhances the repository's functionality by allowing for better management of workspace branches in git-enabled environments. * Refactor findAppDataByCorelationIds method for deterministic row selection This commit enhances the findAppDataByCorelationIds method in the AppsUtilService by updating the SQL query to ensure deterministic selection of app rows sharing the same co_relation_id. The changes include modifying the GROUP BY clause and adding an ORDER BY clause to prioritize released rows, followed by the most recently updated and lowest ID rows. Additionally, comments have been added to clarify the logic behind the row selection process. * Refactor AppsUtilService to improve branch ID handling and query execution This commit modifies the AppsUtilService to allow `branchId` to be a lazy provider, enhancing performance by deferring its resolution until necessary. Additionally, it updates the `findAppDataByCorelationIds` method to use a single read-only statement without a transaction, streamlining the SQL query execution. The GotoApp component is also updated to use optional chaining for safer property access. * Update submodule reference * Update submodule reference * Update app-import-export service to include branch ID handling and improve correlation ID resolution logic. This commit adds an optional `branchId` parameter to relevant methods and refines the query for identity holder checks, ensuring proper handling of app imports across branches. * Enhance ToolTip component with maxWidth and popperConfig props for better display control. Update EventManager and PageMenuItem to utilize new ToolTip features, improving error message presentation. * Update submodule reference --------- Co-authored-by: Copilot Autofix powered by AI <175728472+Copilot@users.noreply.github.com> Co-authored-by: gsmithun4 <gsmithun4@gmail.com> * fix: never send secret constant plaintext to frontend (#17170) * fix: never send secret constant plaintext to frontend * fix: mask secret constants only when a value actually exists * fix: keep secret value placeholder masked while editing * chore: bump version to 3.21.52-beta across all components * Fix: Refactor dynamic layout handling with module ID scoping (#17141) * refactor: enhance dynamic layout handling by scoping temporary layouts to module IDs - Updated `getDynamicLayoutKey` and related functions to include `moduleId` for better management of temporary layouts across different module instances. - Adjusted various components (e.g., `Listview`, `ModalV2`, `WidgetWrapper`) to pass `moduleId` where necessary, ensuring consistent layout behavior in nested modules. - Improved the `clearContainerTempLayouts` function to accommodate module-specific layout clearing, preventing layout conflicts in shared components. * refactor: enhance ModalV2 dynamic class handling and grid slice key matching - Introduced `getDynamicClassName` to generate scoped class names for ModalV2, improving dynamic height handling. - Updated ModalV2 component to utilize the new class name for better CSS management. - Enhanced grid slice key matching logic to accommodate suffixed keys, ensuring accurate context handling for nested components. * Revert "refactor: enhance ModalV2 dynamic class handling and grid slice key matching" This reverts commit 2729671. * refactor: update clearContainerTempLayouts to use getDynamicLayoutKey - Modified the clearContainerTempLayouts function to utilize getDynamicLayoutKey for improved module ID handling. - Clarified comments regarding module ID scoping for embedded modules. * Update submodule references --------- Co-authored-by: johnsoncherian <johnsonc.dev@gmail.com> * fix: move secret Edit button next to the Value label --------- Co-authored-by: Pratush <pratush@Pratushs-MacBook-Pro.local> Co-authored-by: johnsoncherian <johnsonc.dev@gmail.com> Co-authored-by: Devanshu Rastogi <devanshu.rastogi05@gmail.com> * fix the duplicat occurance * Fix: remove git-sync hard reloads and heal active branch after delete (#17184) * Chore: restore server/ee pointer to ee release/v3.21.52-beta tip The single-app-pull merge clobbered the gitlink back to a commit that predates the background git-sync jobs EE changes, leaving the release branch CE/EE inconsistent (EE workspace-branches no longer compiles against CE). Points server/ee back at the ee-server release branch tip. Co-Authored-By: Claude Fable 5 <noreply@anthropic.com> * Fix: remove git-sync hard reloads and heal active branch after background delete Branch delete, switch, and homepage pull no longer force page reloads. The dashboard now reacts to git-sync job success notifications: it refetches the branch list and, when the deleted branch was the active one, silently switches to the default branch (fixes stale branch_id false-empty workspace). fetchBranches self-heals a stored branch id that no longer exists, focus-sync validates ids before writing to localStorage, and a storage listener syncs heals across tabs. Enter on the push-commit modal no longer triggers a native form submit reload. Co-Authored-By: Claude Fable 5 <noreply@anthropic.com> * Bump server/ee: configurable git-sync worker concurrency Co-Authored-By: Claude Fable 5 <noreply@anthropic.com> * Refetch data sources on pull success notification Data sources page now reacts to git-pull-branch success like the dashboard does, so the notification no longer asks for a manual refresh. Co-Authored-By: Claude Fable 5 <noreply@anthropic.com> * Fix: don't propagate branch switches across tabs The storage listener adopted every localStorage change into the tab's sessionStorage, so a deliberate switch in one tab force-switched all other tabs. Now it only triggers a refetch that reconciles from the tab's own sessionStorage: a valid branch is kept, a deleted one still self-heals to the default. Co-Authored-By: Claude Fable 5 <noreply@anthropic.com> * Drop the switched-to-default toast on active branch deletion The notification toast already announces the deletion; the branch switch happens silently. Fixes the toast pile-up on delete. Co-Authored-By: Claude Fable 5 <noreply@anthropic.com> * Heal deleted active branch on the data sources page The delete-success notification now triggers a branch refetch on the data sources page too, so deleting the active branch there switches to the default branch and reloads the list without a dashboard visit. Co-Authored-By: Claude Fable 5 <noreply@anthropic.com> * Fix notification badge clipping at 99+ Badge was left-anchored 16px into a 32px icon, so the three-character 99+ pill crossed the 48px sidebar's overflow-x: hidden edge. Right- anchor it so the pill grows leftward instead. Co-Authored-By: Claude Fable 5 <noreply@anthropic.com> --------- Co-authored-by: Claude Fable 5 <noreply@anthropic.com> * fix: notification message in non-git workspace (#17164) * fix: notification message in non-git workspace * fix: notifications tooltip --------- Co-authored-by: Vamshi <vamshi@Vamshis-MacBook-Pro.local> * fix: skip writing module files when app pins to a published version (#17157) * update cypress test cases for the ws constants visibility update feature. * bump version to 3.21.53-beta --------- Co-authored-by: Akshay <akshaysasidrn@gmail.com> Co-authored-by: Claude Opus 4.7 (1M context) <noreply@anthropic.com> Co-authored-by: Devanshu Rastogi <devanshu.rastogi05@gmail.com> Co-authored-by: Copilot Autofix powered by AI <175728472+Copilot@users.noreply.github.com> Co-authored-by: Pratush Sinha <104584767+Pratush613@users.noreply.github.com> Co-authored-by: Pratush <pratush@Pratushs-MacBook-Pro.local> Co-authored-by: johnsoncherian <johnsonc.dev@gmail.com> Co-authored-by: Vamshi Krishna <vamshi@tooljet.com> Co-authored-by: Vamshi <vamshi@Vamshis-MacBook-Pro.local> Co-authored-by: vjaris42 <vjy239@gmail.com> Co-authored-by: ajith-k-v <ajith.jaban@gmail.com> Co-authored-by: Adish M <44204658+adishM98@users.noreply.github.com>
PreviousNext