Skip to content

feat(persistence): fix QuotaExceededError and cross-workspace draft leakage#8520

Merged
christian-byrne merged 8 commits intomainfrom
01-31-feat_persistence_integrate_v2_system_migration_4_4_
Feb 21, 2026
Merged

feat(persistence): fix QuotaExceededError and cross-workspace draft leakage#8520
christian-byrne merged 8 commits intomainfrom
01-31-feat_persistence_integrate_v2_system_migration_4_4_

Conversation

@christian-byrne
Copy link
Contributor

@christian-byrne christian-byrne commented Feb 1, 2026

Summary

Completes the workflow persistence overhaul by integrating the new draft system into the app and migrating existing data. Fixes two critical bugs:

  1. QuotaExceededError - localStorage fills up with workflow drafts, breaking auto-save
  2. Cross-workspace data leakage - Drafts from one ComfyUI instance appear in another

Changes

  • What:
    • useWorkflowPersistenceV2.ts - Main composable that hooks into graph changes with 512ms debounce
    • migrateV1toV2.ts - One-time migration of existing drafts to the new scoped format
    • Updated E2E tests for new storage key patterns
  • Why: Users lose work when storage quota is exceeded, and see confusing workflows from other instances

How It Works

  • Workspace scoping: Each ComfyUI instance (identified by server URL) has isolated draft storage
  • LRU eviction: When storage is full, oldest drafts are automatically removed (keeps 32 most recent)
  • Tab isolation: Each browser tab tracks its own active/open workflows via sessionStorage
  • Debounced saves: Graph changes are batched with 512ms delay to reduce storage writes

Migration

Existing V1 drafts are automatically migrated on first load. The migration:

  1. Reads drafts from old Comfy.Workflow.* keys
  2. Converts to new workspace-scoped format
  3. Cleans up old keys after successful migration

Part 4 of 4 in the workflow persistence improvements stack

@coderabbitai
Copy link
Contributor

coderabbitai bot commented Feb 1, 2026

No actionable comments were generated in the recent review. 🎉


📝 Walkthrough

Walkthrough

Implements V2 per-draft workflow persistence with workspace-scoped keys, a V1→V2 migration, session-pointer tab restoration, per-workspace in-memory index caching, workspace-aware storage I/O, logout confirmation for unsaved edits, and related tests and browser-test updates.

Changes

Cohort / File(s) Summary
V2 Persistence Core
src/platform/workflow/persistence/composables/useWorkflowPersistenceV2.ts
New composable implementing V2 flow: migration on load, debounced per-draft saves, session-pointer tab tracking, template URL handling, and public init/restore APIs.
Migration Module & Tests
src/platform/workflow/persistence/migration/migrateV1toV2.ts, src/platform/workflow/persistence/migration/migrateV1toV2.test.ts
Adds V1→V2 migration, status/cleanup helpers, and comprehensive tests validating payload/key migration and ordering.
Storage Key API
src/platform/workflow/persistence/base/storageKeys.ts, src/platform/workflow/persistence/base/storageKeys.test.ts
Exposes getWorkspaceId(), removes module-level workspace cache; draftIndex/draftPayload now require explicit workspaceId; tests updated.
Storage I/O & Pointer Migration
src/platform/workflow/persistence/base/storageIO.ts, src/platform/workflow/persistence/base/storageIO.test.ts
Adds workspace-aware pointer reads and findAndMigratePointer, extends readActivePath/readOpenPaths signatures to accept optional targetWorkspaceId, and tests for pointer migration/fallback behavior.
Draft Store & Cache
src/platform/workflow/persistence/stores/workflowDraftStoreV2.ts, src/platform/workflow/persistence/base/draftCacheV2.ts
Switches to per-workspace index cache, updates cache lookups/eviction to workspace scope, and refactors eviction logic to non-mutating count-based removal.
Tab State Composables & Tests
src/platform/workflow/persistence/composables/useWorkflowTabState.ts, src/platform/workflow/persistence/composables/useWorkflowTabState.test.ts
Derives workspaceId per operation, persists workspaceId with pointers, and adds test for path retention in same workspace.
Auth & Localization
src/composables/auth/useFirebaseAuthActions.ts, src/locales/en/main.json
Adds logout confirmation guarding unsaved workflows and corresponding i18n keys signOut.unsavedChangesTitle and signOut.unsavedChangesMessage.
GraphCanvas Import
src/components/graph/GraphCanvas.vue
Re-aliased import to use useWorkflowPersistenceV2 (import path/source changed; call sites unchanged).
Tests / Browser Tests
browser_tests/tests/colorPalette.spec.ts, browser_tests/tests/interaction.spec.ts
E2E adjustments: direct evaluation of graph state instead of localStorage parsing; replaced fixed delays with polling against DraftIndex.v2 and sessionStorage-based open-path pointers.
Misc / Typing
src/platform/workflow/persistence/base/draftTypes.ts
Removed a documentation comment; constants unchanged.

Sequence Diagram

sequenceDiagram
    participant App as App
    participant Persistence as useWorkflowPersistenceV2
    participant Migration as migrateV1toV2
    participant Store as workflowDraftStoreV2
    participant Storage as StorageIO
    App->>Persistence: initializeWorkflow()
    Persistence->>Migration: isV2MigrationComplete(workspaceId)
    alt migration needed
        Persistence->>Migration: migrateV1toV2(workspaceId)
        Migration->>Storage: read V1 drafts (localStorage)
        Migration->>Store: saveDraft(...) per draft
        Store->>Storage: write DraftIndex.v2 and payloads
        Migration-->>Persistence: return migrated count
    end
    Persistence->>Store: loadIndex(currentWorkspaceId)
    Store->>Storage: read DraftIndex.v2:<workspaceId>
    Storage-->>Store: index
    Persistence->>Store: loadActiveOrLatestWorkflow(clientId, workspaceId)
    Store->>Storage: readActivePath(clientId, targetWorkspaceId)
    Storage-->>Store: pointer (may migrate)
    Note over Persistence,Store: On graph change → debounced saveDraft → update index & session pointer
    Persistence->>Store: saveDraft(path, payload)
    Store->>Storage: persist payload & update DraftIndex.v2
Loading

Estimated code review effort

🎯 4 (Complex) | ⏱️ ~45 minutes

Possibly related PRs

Suggested labels

area:workflows

Suggested reviewers

  • comfyui-wiki

Poem

🐰 I hopped your drafts from old to new,
Workspace snug, each tab found its view,
Migration finished, pointers set right,
I binkied a carrot and slept through the night. ✨

🚥 Pre-merge checks | ✅ 3
✅ Passed checks (3 passed)
Check name Status Explanation
Title check ✅ Passed The title accurately summarizes the two main bugs being fixed: QuotaExceededError and cross-workspace draft leakage, which are the primary objectives of this PR.
Description check ✅ Passed The PR description includes a clear summary, detailed changes section, explanation of how the system works, and migration details. All required template sections are addressed with substantive content.
Docstring Coverage ✅ Passed Docstring coverage is 93.10% which is sufficient. The required threshold is 80.00%.

✏️ Tip: You can configure your own custom pre-merge checks in the settings.

✨ Finishing Touches
  • 📝 Generate docstrings (stacked PR)
  • 📝 Generate docstrings (commit on current branch)
🧪 Generate unit tests (beta)
  • Create PR with unit tests
  • Post copyable unit tests in a comment
  • Commit unit tests in branch 01-31-feat_persistence_integrate_v2_system_migration_4_4_

Tip

Issue Planner is now in beta. Read the docs and try it out! Share your feedback on Discord.


Comment @coderabbitai help to get the list of available commands and usage tips.

Copy link
Contributor Author

christian-byrne commented Feb 1, 2026

@github-actions
Copy link

github-actions bot commented Feb 1, 2026

🎨 Storybook Build Status

Build completed successfully!

⏰ Completed at: 02/20/2026, 06:03:53 PM UTC

🔗 Links


🎉 Your Storybook is ready for review!

@github-actions
Copy link

github-actions bot commented Feb 1, 2026

Playwright: ✅ 530 passed, 0 failed · 2 flaky

📊 Browser Reports
  • chromium: View Report (✅ 517 / ❌ 0 / ⚠️ 2 / ⏭️ 10)
  • chromium-2x: View Report (✅ 2 / ❌ 0 / ⚠️ 0 / ⏭️ 0)
  • chromium-0.5x: View Report (✅ 1 / ❌ 0 / ⚠️ 0 / ⏭️ 0)
  • mobile-chrome: View Report (✅ 10 / ❌ 0 / ⚠️ 0 / ⏭️ 0)

@christian-byrne christian-byrne marked this pull request as ready for review February 1, 2026 04:36
@christian-byrne christian-byrne requested a review from a team as a code owner February 1, 2026 04:36
@dosubot dosubot bot added the size:XL This PR changes 500-999 lines, ignoring generated files. label Feb 1, 2026
@dosubot
Copy link

dosubot bot commented Feb 1, 2026

Related Documentation

Checked 0 published document(s) in 1 knowledge base(s). No updates required.

How did I do? Any feedback?  Join Discord

@christian-byrne christian-byrne changed the title feat(persistence): add V2 persistence composable and migration feat(persistence): fix QuotaExceededError and cross-workspace draft leakage Feb 2, 2026
@christian-byrne christian-byrne force-pushed the 01-31-feat_persistence_integrate_v2_system_migration_4_4_ branch from fd0b584 to 5a1e9ae Compare February 3, 2026 01:17
@christian-byrne christian-byrne force-pushed the 01-31-feat_persistence_rewrite_store_with_per-draft_keys_3_4_ branch from 0c88af0 to 07ae110 Compare February 3, 2026 04:46
@christian-byrne christian-byrne force-pushed the 01-31-feat_persistence_integrate_v2_system_migration_4_4_ branch from b7118ee to bec1fb2 Compare February 3, 2026 04:46
@christian-byrne christian-byrne marked this pull request as draft February 3, 2026 20:27
@christian-byrne christian-byrne force-pushed the 01-31-feat_persistence_rewrite_store_with_per-draft_keys_3_4_ branch from 07ae110 to f1bc97f Compare February 3, 2026 20:38
@christian-byrne christian-byrne force-pushed the 01-31-feat_persistence_integrate_v2_system_migration_4_4_ branch from bec1fb2 to 2cb0251 Compare February 3, 2026 20:39
@christian-byrne christian-byrne force-pushed the 01-31-feat_persistence_rewrite_store_with_per-draft_keys_3_4_ branch from f1bc97f to 84ac4bd Compare February 9, 2026 02:33
@christian-byrne christian-byrne force-pushed the 01-31-feat_persistence_integrate_v2_system_migration_4_4_ branch from 2cb0251 to 0cda81c Compare February 9, 2026 02:33
@christian-byrne christian-byrne force-pushed the 01-31-feat_persistence_rewrite_store_with_per-draft_keys_3_4_ branch from 84ac4bd to a00870f Compare February 18, 2026 23:25
@christian-byrne christian-byrne force-pushed the 01-31-feat_persistence_integrate_v2_system_migration_4_4_ branch 2 times, most recently from 2cf9bbe to b19bb1e Compare February 20, 2026 04:37
@christian-byrne christian-byrne force-pushed the 01-31-feat_persistence_integrate_v2_system_migration_4_4_ branch from 0884d1d to b62ed7e Compare February 20, 2026 06:21
@christian-byrne christian-byrne force-pushed the 01-31-feat_persistence_rewrite_store_with_per-draft_keys_3_4_ branch from b77c98a to e07f341 Compare February 20, 2026 06:21
@christian-byrne christian-byrne force-pushed the 01-31-feat_persistence_integrate_v2_system_migration_4_4_ branch 3 times, most recently from a83bbea to e5c8c5b Compare February 20, 2026 07:33
@github-actions
Copy link

🔧 Auto-fixes Applied

This PR has been automatically updated to fix linting and formatting issues.

⚠️ Important: Your local branch is now behind. Run git pull before making additional changes to avoid conflicts.

Changes made:

  • ESLint auto-fixes
  • Oxfmt formatting

@christian-byrne christian-byrne force-pushed the 01-31-feat_persistence_integrate_v2_system_migration_4_4_ branch from e2902ea to f20f794 Compare February 20, 2026 07:44
Base automatically changed from 01-31-feat_persistence_rewrite_store_with_per-draft_keys_3_4_ to main February 20, 2026 07:53
christian-byrne and others added 3 commits February 19, 2026 23:54
Complete the V2 integration:

- useWorkflowPersistenceV2: New composable with:
  - 512ms debounce on graphChanged events
  - Uses V2 draft store with per-draft keys
  - Uses tab state composable for session pointers
  - Clears storage on signout (cloud only)

- migrateV1toV2: One-time migration from V1 blob to V2 per-draft keys
  - Runs on first load if V2 index doesn't exist
  - Preserves LRU order during migration
  - Keeps V1 data intact for rollback until 2026-07-15

The V2 composable is ready but not yet wired as the default export.
This allows gradual rollout and easy rollback.

Co-authored-by: Amp <amp@ampcode.com>
Amp-Thread-ID: https://ampcode.com/threads/T-019c16f4-05a2-779d-aa0e-a0e098308a95
Port two bug fixes to V2 persistence system:

From #8854 (clear draft on workflow close):
- workflowStore.ts: removeDraft() now runs for ALL workflows, not just temporary
- workflowService.ts: remove draft BEFORE tab switch to prevent re-saving

From #8851 (skip drafts when Persist disabled):
- comfyWorkflow.ts: guard draft loading with Persist setting check
- useWorkflowPersistenceV2.ts: watch to clear drafts when Persist toggled off

Amp-Thread-ID: https://ampcode.com/threads/T-019c5898-2097-7710-aab9-52c38a97399a
@christian-byrne christian-byrne force-pushed the 01-31-feat_persistence_integrate_v2_system_migration_4_4_ branch from bb7b441 to 816759e Compare February 20, 2026 07:55
@github-actions
Copy link

github-actions bot commented Feb 20, 2026

📦 Bundle: 4.32 MB gzip 🔴 +3.26 kB

Details

Summary

  • Raw size: 20.3 MB baseline 20.3 MB — 🔴 +16.3 kB
  • Gzip: 4.32 MB baseline 4.32 MB — 🔴 +3.26 kB
  • Brotli: 3.33 MB baseline 3.33 MB — 🔴 +2.68 kB
  • Bundles: 219 current • 219 baseline • 129 added / 129 removed

Category Glance
Graph Workspace 🔴 +15.9 kB (949 kB) · Data & Services 🔴 +231 B (2.47 MB) · Other 🔴 +163 B (7.38 MB) · Vendor & Third-Party 🔴 +18 B (8.86 MB) · Panels & Settings ⚪ 0 B (430 kB) · Views & Navigation ⚪ 0 B (68.6 kB) · + 5 more

App Entry Points — 21.4 kB (baseline 21.4 kB) • ⚪ 0 B

Main entry bundles and manifests

File Before After Δ Raw Δ Gzip Δ Brotli
assets/index-B9QysWfG.js (new) 21.4 kB 🔴 +21.4 kB 🔴 +6.99 kB 🔴 +6.07 kB
assets/index-k3FYkmkZ.js (removed) 21.4 kB 🟢 -21.4 kB 🟢 -7 kB 🟢 -6.09 kB

Status: 1 added / 1 removed

Graph Workspace — 949 kB (baseline 933 kB) • 🔴 +15.9 kB

Graph editor runtime, canvas, workflow orchestration

File Before After Δ Raw Δ Gzip Δ Brotli
assets/GraphView-CoHwbPCu.js (new) 949 kB 🔴 +949 kB 🔴 +202 kB 🔴 +154 kB
assets/GraphView-hlZrTVIe.js (removed) 933 kB 🟢 -933 kB 🟢 -199 kB 🟢 -151 kB

Status: 1 added / 1 removed

Views & Navigation — 68.6 kB (baseline 68.6 kB) • ⚪ 0 B

Top-level views, pages, and routed surfaces

File Before After Δ Raw Δ Gzip Δ Brotli
assets/CloudSurveyView-DVHj85RL.js (removed) 15.5 kB 🟢 -15.5 kB 🟢 -3.32 kB 🟢 -2.82 kB
assets/CloudSurveyView-pld9ULb7.js (new) 15.5 kB 🔴 +15.5 kB 🔴 +3.32 kB 🔴 +2.83 kB
assets/CloudLoginView-BdoMLj6l.js (removed) 10 kB 🟢 -10 kB 🟢 -2.91 kB 🟢 -2.56 kB
assets/CloudLoginView-BKu97dBS.js (new) 10 kB 🔴 +10 kB 🔴 +2.91 kB 🔴 +2.56 kB
assets/UserCheckView-Bn3nOczX.js (new) 8.41 kB 🔴 +8.41 kB 🔴 +2.23 kB 🔴 +1.94 kB
assets/UserCheckView-DTnR0NKJ.js (removed) 8.41 kB 🟢 -8.41 kB 🟢 -2.23 kB 🟢 -1.95 kB
assets/CloudSignupView-B8DfK82F.js (new) 7.38 kB 🔴 +7.38 kB 🔴 +2.31 kB 🔴 +2.03 kB
assets/CloudSignupView-CFN0nLIi.js (removed) 7.38 kB 🟢 -7.38 kB 🟢 -2.31 kB 🟢 -2.03 kB
assets/CloudLayoutView-B5TUJV4m.js (removed) 6.4 kB 🟢 -6.4 kB 🟢 -2.09 kB 🟢 -1.81 kB
assets/CloudLayoutView-BYF_AQbF.js (new) 6.4 kB 🔴 +6.4 kB 🔴 +2.08 kB 🔴 +1.82 kB
assets/CloudForgotPasswordView-BFOsMbeb.js (new) 5.53 kB 🔴 +5.53 kB 🔴 +1.92 kB 🔴 +1.69 kB
assets/CloudForgotPasswordView-qopRZ2RB.js (removed) 5.53 kB 🟢 -5.53 kB 🟢 -1.92 kB 🟢 -1.7 kB
assets/CloudAuthTimeoutView-BfbJ9LiT.js (new) 4.88 kB 🔴 +4.88 kB 🔴 +1.76 kB 🔴 +1.54 kB
assets/CloudAuthTimeoutView-DahWcDsK.js (removed) 4.88 kB 🟢 -4.88 kB 🟢 -1.75 kB 🟢 -1.54 kB
assets/CloudSubscriptionRedirectView-BT5aT1ez.js (removed) 4.68 kB 🟢 -4.68 kB 🟢 -1.77 kB 🟢 -1.57 kB
assets/CloudSubscriptionRedirectView-CUggcwfN.js (new) 4.68 kB 🔴 +4.68 kB 🔴 +1.76 kB 🔴 +1.56 kB
assets/UserSelectView-C5HI7CtU.js (removed) 4.5 kB 🟢 -4.5 kB 🟢 -1.64 kB 🟢 -1.46 kB
assets/UserSelectView-CycR8cMi.js (new) 4.5 kB 🔴 +4.5 kB 🔴 +1.64 kB 🔴 +1.46 kB
assets/layout-B8-bSqjh.js (removed) 296 B 🟢 -296 B 🟢 -223 B 🟢 -181 B
assets/layout-CcOkCURZ.js (new) 296 B 🔴 +296 B 🔴 +224 B 🔴 +185 B
assets/CloudSorryContactSupportView-CgAH2vyP.js 1.02 kB 1.02 kB ⚪ 0 B ⚪ 0 B ⚪ 0 B

Status: 10 added / 10 removed

Panels & Settings — 430 kB (baseline 430 kB) • ⚪ 0 B

Configuration panels, inspectors, and settings screens

File Before After Δ Raw Δ Gzip Δ Brotli
assets/SecretsPanel-DUbdGt7w.js (removed) 21.5 kB 🟢 -21.5 kB 🟢 -5.31 kB 🟢 -4.65 kB
assets/SecretsPanel-DWOA3DYA.js (new) 21.5 kB 🔴 +21.5 kB 🔴 +5.31 kB 🔴 +4.64 kB
assets/LegacyCreditsPanel-Du4eZTHv.js (new) 20.6 kB 🔴 +20.6 kB 🔴 +5.55 kB 🔴 +4.88 kB
assets/LegacyCreditsPanel-dxUupVHn.js (removed) 20.6 kB 🟢 -20.6 kB 🟢 -5.55 kB 🟢 -4.88 kB
assets/SubscriptionPanel-B40UHkiH.js (removed) 18.5 kB 🟢 -18.5 kB 🟢 -4.69 kB 🟢 -4.13 kB
assets/SubscriptionPanel-CuY9WUPY.js (new) 18.5 kB 🔴 +18.5 kB 🔴 +4.69 kB 🔴 +4.13 kB
assets/KeybindingPanel-CGKC9DGZ.js (removed) 12.3 kB 🟢 -12.3 kB 🟢 -3.56 kB 🟢 -3.16 kB
assets/KeybindingPanel-gzBJ_P6A.js (new) 12.3 kB 🔴 +12.3 kB 🔴 +3.56 kB 🔴 +3.15 kB
assets/ExtensionPanel-BETtPWe0.js (removed) 9.35 kB 🟢 -9.35 kB 🟢 -2.64 kB 🟢 -2.34 kB
assets/ExtensionPanel-SIQjYhGK.js (new) 9.35 kB 🔴 +9.35 kB 🔴 +2.64 kB 🔴 +2.35 kB
assets/AboutPanel-BMDS1dLo.js (removed) 8.53 kB 🟢 -8.53 kB 🟢 -2.45 kB 🟢 -2.19 kB
assets/AboutPanel-ByXSnNId.js (new) 8.53 kB 🔴 +8.53 kB 🔴 +2.44 kB 🔴 +2.2 kB
assets/ServerConfigPanel-D7-T6kxj.js (new) 6.41 kB 🔴 +6.41 kB 🔴 +2.11 kB 🔴 +1.88 kB
assets/ServerConfigPanel-neklsnJ5.js (removed) 6.41 kB 🟢 -6.41 kB 🟢 -2.11 kB 🟢 -1.9 kB
assets/UserPanel-BRfY0x6g.js (new) 6.13 kB 🔴 +6.13 kB 🔴 +1.98 kB 🔴 +1.73 kB
assets/UserPanel-f-Vs0TAn.js (removed) 6.13 kB 🟢 -6.13 kB 🟢 -1.98 kB 🟢 -1.74 kB
assets/cloudRemoteConfig-DVZTCN2p.js (new) 1.41 kB 🔴 +1.41 kB 🔴 +690 B 🔴 +594 B
assets/cloudRemoteConfig-DY2BZ2rG.js (removed) 1.41 kB 🟢 -1.41 kB 🟢 -696 B 🟢 -594 B
assets/refreshRemoteConfig-CgSBYUp7.js (removed) 1.14 kB 🟢 -1.14 kB 🟢 -522 B 🟢 -471 B
assets/refreshRemoteConfig-DBz5vjGF.js (new) 1.14 kB 🔴 +1.14 kB 🔴 +519 B 🔴 +441 B
assets/config-C5QaqZix.js 996 B 996 B ⚪ 0 B ⚪ 0 B ⚪ 0 B
assets/settings-B0mOvnTo.js 32 kB 32 kB ⚪ 0 B ⚪ 0 B ⚪ 0 B
assets/settings-BcrCrxYO.js 27.4 kB 27.4 kB ⚪ 0 B ⚪ 0 B ⚪ 0 B
assets/settings-BdMQ9yxb.js 24.2 kB 24.2 kB ⚪ 0 B ⚪ 0 B ⚪ 0 B
assets/settings-BMpJMaIw.js 33.7 kB 33.7 kB ⚪ 0 B ⚪ 0 B ⚪ 0 B
assets/settings-C-rh-es6.js 30.1 kB 30.1 kB ⚪ 0 B ⚪ 0 B ⚪ 0 B
assets/settings-CgiUGcth.js 23.6 kB 23.6 kB ⚪ 0 B ⚪ 0 B ⚪ 0 B
assets/settings-CzjpXwlp.js 38 kB 38 kB ⚪ 0 B ⚪ 0 B ⚪ 0 B
assets/settings-CzpC_oh3.js 28.4 kB 28.4 kB ⚪ 0 B ⚪ 0 B ⚪ 0 B
assets/settings-Dp3u6l4N.js 29.5 kB 29.5 kB ⚪ 0 B ⚪ 0 B ⚪ 0 B
assets/settings-DZjzU5N0.js 28.4 kB 28.4 kB ⚪ 0 B ⚪ 0 B ⚪ 0 B
assets/settings-rQc1NwAI.js 27.6 kB 27.6 kB ⚪ 0 B ⚪ 0 B ⚪ 0 B

Status: 10 added / 10 removed

User & Accounts — 16 kB (baseline 16 kB) • ⚪ 0 B

Authentication, profile, and account management bundles

File Before After Δ Raw Δ Gzip Δ Brotli
assets/auth-BSYB-QAQ.js (new) 3.4 kB 🔴 +3.4 kB 🔴 +1.18 kB 🔴 +993 B
assets/auth-QfKilwJL.js (removed) 3.4 kB 🟢 -3.4 kB 🟢 -1.18 kB 🟢 -990 B
assets/SignUpForm-Bc6Yvu52.js (removed) 3.01 kB 🟢 -3.01 kB 🟢 -1.23 kB 🟢 -1.1 kB
assets/SignUpForm-CKVCnnDz.js (new) 3.01 kB 🔴 +3.01 kB 🔴 +1.23 kB 🔴 +1.1 kB
assets/UpdatePasswordContent-CRZElw5K.js (removed) 2.34 kB 🟢 -2.34 kB 🟢 -1.05 kB 🟢 -930 B
assets/UpdatePasswordContent-DGEOa25G.js (new) 2.34 kB 🔴 +2.34 kB 🔴 +1.05 kB 🔴 +946 B
assets/firebaseAuthStore-DFb9SDiT.js (removed) 758 B 🟢 -758 B 🟢 -375 B 🟢 -334 B
assets/firebaseAuthStore-zCf2eFt4.js (new) 758 B 🔴 +758 B 🔴 +369 B 🔴 +332 B
assets/auth-C3aL1PxE.js (new) 357 B 🔴 +357 B 🔴 +223 B 🔴 +192 B
assets/auth-DSK3eanp.js (removed) 357 B 🟢 -357 B 🟢 -226 B 🟢 -188 B
assets/PasswordFields-BlvAA1Ro.js 4.51 kB 4.51 kB ⚪ 0 B ⚪ 0 B ⚪ 0 B
assets/WorkspaceProfilePic-CqcS6A50.js 1.57 kB 1.57 kB ⚪ 0 B ⚪ 0 B ⚪ 0 B

Status: 5 added / 5 removed

Editors & Dialogs — 706 B (baseline 706 B) • ⚪ 0 B

Modals, dialogs, drawers, and in-app editors

File Before After Δ Raw Δ Gzip Δ Brotli
assets/useSubscriptionDialog-Gc-Smuyn.js (removed) 706 B 🟢 -706 B 🟢 -363 B 🟢 -316 B
assets/useSubscriptionDialog-vgVEUJOS.js (new) 706 B 🔴 +706 B 🔴 +364 B 🔴 +332 B

Status: 1 added / 1 removed

UI Components — 43.2 kB (baseline 43.2 kB) • ⚪ 0 B

Reusable component library chunks

File Before After Δ Raw Δ Gzip Δ Brotli
assets/useTerminalTabs-f2yr78DB.js (new) 9.81 kB 🔴 +9.81 kB 🔴 +3.39 kB 🔴 +2.99 kB
assets/useTerminalTabs-rF8_4QUs.js (removed) 9.81 kB 🟢 -9.81 kB 🟢 -3.39 kB 🟢 -2.98 kB
assets/ComfyQueueButton-DcM2Vxjt.js (removed) 8.02 kB 🟢 -8.02 kB 🟢 -2.49 kB 🟢 -2.23 kB
assets/ComfyQueueButton-vbaX58VT.js (new) 8.02 kB 🔴 +8.02 kB 🔴 +2.49 kB 🔴 +2.22 kB
assets/TopbarBadge-Bgg1wIx2.js (new) 7.45 kB 🔴 +7.45 kB 🔴 +1.82 kB 🔴 +1.6 kB
assets/TopbarBadge-ywTy5WOA.js (removed) 7.45 kB 🟢 -7.45 kB 🟢 -1.82 kB 🟢 -1.6 kB
assets/ScrubableNumberInput-BUAbPzqP.js (new) 5.96 kB 🔴 +5.96 kB 🔴 +2.07 kB 🔴 +1.84 kB
assets/ScrubableNumberInput-C0lDHdes.js (removed) 5.96 kB 🟢 -5.96 kB 🟢 -2.06 kB 🟢 -1.83 kB
assets/Button-BHXQOs0p.js (new) 2.98 kB 🔴 +2.98 kB 🔴 +1.21 kB 🔴 +1.05 kB
assets/Button-BsKiLsiK.js (removed) 2.98 kB 🟢 -2.98 kB 🟢 -1.21 kB 🟢 -1.05 kB
assets/SubscribeButton-_nnpTVIr.js (new) 2.35 kB 🔴 +2.35 kB 🔴 +1.02 kB 🔴 +891 B
assets/SubscribeButton-CusedxJV.js (removed) 2.35 kB 🟢 -2.35 kB 🟢 -1.02 kB 🟢 -885 B
assets/WidgetButton-COeYD1rf.js (new) 1.84 kB 🔴 +1.84 kB 🔴 +876 B 🔴 +769 B
assets/WidgetButton-Dy-ogYZ8.js (removed) 1.84 kB 🟢 -1.84 kB 🟢 -878 B 🟢 -767 B
assets/cloudFeedbackTopbarButton-BBBCkqVr.js (removed) 1.56 kB 🟢 -1.56 kB 🟢 -843 B 🟢 -748 B
assets/cloudFeedbackTopbarButton-WFNgdewi.js (new) 1.56 kB 🔴 +1.56 kB 🔴 +839 B 🔴 +740 B
assets/CloudBadge-CZtGkOlb.js (new) 1.24 kB 🔴 +1.24 kB 🔴 +606 B 🔴 +526 B
assets/CloudBadge-DsWsl22p.js (removed) 1.24 kB 🟢 -1.24 kB 🟢 -608 B 🟢 -526 B
assets/ComfyQueueButton-j5wLohnS.js (removed) 763 B 🟢 -763 B 🟢 -381 B 🟢 -339 B
assets/ComfyQueueButton-YhID9PmU.js (new) 763 B 🔴 +763 B 🔴 +375 B 🔴 +337 B
assets/UserAvatar-CFOb8MYw.js 1.17 kB 1.17 kB ⚪ 0 B ⚪ 0 B ⚪ 0 B

Status: 10 added / 10 removed

Data & Services — 2.47 MB (baseline 2.47 MB) • 🔴 +231 B

Stores, services, APIs, and repositories

File Before After Δ Raw Δ Gzip Δ Brotli
assets/dialogService-CwYtyz8M.js (new) 1.69 MB 🔴 +1.69 MB 🔴 +378 kB 🔴 +287 kB
assets/dialogService-CnnHsV18.js (removed) 1.69 MB 🟢 -1.69 MB 🟢 -378 kB 🟢 -287 kB
assets/api-_HOXWX_S.js (removed) 649 kB 🟢 -649 kB 🟢 -147 kB 🟢 -117 kB
assets/api-Bty-cTPM.js (new) 649 kB 🔴 +649 kB 🔴 +147 kB 🔴 +117 kB
assets/load3dService-BQPnL2bS.js (removed) 90.9 kB 🟢 -90.9 kB 🟢 -19 kB 🟢 -16.4 kB
assets/load3dService-d35h8scD.js (new) 90.9 kB 🔴 +90.9 kB 🔴 +19 kB 🔴 +16.4 kB
assets/systemStatsStore-D1WQZzt0.js (removed) 12.3 kB 🟢 -12.3 kB 🟢 -4.31 kB 🟢 -3.79 kB
assets/systemStatsStore-vn-D0fig.js (new) 12.3 kB 🔴 +12.3 kB 🔴 +4.31 kB 🔴 +3.79 kB
assets/releaseStore--HN1ai0m.js (new) 7.96 kB 🔴 +7.96 kB 🔴 +2.22 kB 🔴 +1.95 kB
assets/releaseStore-YcsolPhV.js (removed) 7.96 kB 🟢 -7.96 kB 🟢 -2.22 kB 🟢 -1.96 kB
assets/keybindingService-Bx20WvWX.js (removed) 6.52 kB 🟢 -6.52 kB 🟢 -1.71 kB 🟢 -1.48 kB
assets/keybindingService-DSHpABiV.js (new) 6.52 kB 🔴 +6.52 kB 🔴 +1.71 kB 🔴 +1.48 kB
assets/bootstrapStore-ByZPAVq4.js (removed) 2.08 kB 🟢 -2.08 kB 🟢 -877 B 🟢 -796 B
assets/bootstrapStore-NRFBHLDM.js (new) 2.08 kB 🔴 +2.08 kB 🔴 +875 B 🔴 +793 B
assets/userStore-CaynXb97.js (removed) 1.85 kB 🟢 -1.85 kB 🟢 -720 B 🟢 -682 B
assets/userStore-DyXb-d7L.js (new) 1.85 kB 🔴 +1.85 kB 🔴 +720 B 🔴 +670 B
assets/audioService-CapP-8Q1.js (new) 1.73 kB 🔴 +1.73 kB 🔴 +847 B 🔴 +729 B
assets/audioService-CZGowpKv.js (removed) 1.73 kB 🟢 -1.73 kB 🟢 -850 B 🟢 -726 B
assets/releaseStore-BAB8aji3.js (removed) 730 B 🟢 -730 B 🟢 -373 B 🟢 -324 B
assets/releaseStore-CJY3mplh.js (new) 730 B 🔴 +730 B 🔴 +366 B 🔴 +325 B
assets/settingStore-CKp_R7VD.js (removed) 714 B 🟢 -714 B 🟢 -373 B 🟢 -327 B
assets/settingStore-Cw0K6Cjy.js (new) 714 B 🔴 +714 B 🔴 +368 B 🔴 +348 B
assets/workflowDraftStore-_svShuel.js (new) 706 B 🔴 +706 B 🔴 +360 B 🔴 +319 B
assets/workflowDraftStore-B2zXFQXa.js (removed) 706 B 🟢 -706 B 🟢 -367 B 🟢 -320 B
assets/dialogService-BGNF38sI.js (removed) 695 B 🟢 -695 B 🟢 -355 B 🟢 -317 B
assets/dialogService-CiJCzz2C.js (new) 695 B 🔴 +695 B 🔴 +352 B 🔴 +331 B
assets/serverConfigStore-LxCPjmH7.js 2.32 kB 2.32 kB ⚪ 0 B ⚪ 0 B ⚪ 0 B

Status: 13 added / 13 removed

Utilities & Hooks — 57.6 kB (baseline 57.6 kB) • ⚪ 0 B

Helpers, composables, and utility bundles

File Before After Δ Raw Δ Gzip Δ Brotli
assets/useLoad3d-DN4LCC-E.js (removed) 14.6 kB 🟢 -14.6 kB 🟢 -3.63 kB 🟢 -3.21 kB
assets/useLoad3d-pkv906Js.js (new) 14.6 kB 🔴 +14.6 kB 🔴 +3.63 kB 🔴 +3.21 kB
assets/useLoad3dViewer-CGnxRDRD.js (new) 14.1 kB 🔴 +14.1 kB 🔴 +3.15 kB 🔴 +2.79 kB
assets/useLoad3dViewer-D7tRdwED.js (removed) 14.1 kB 🟢 -14.1 kB 🟢 -3.15 kB 🟢 -2.79 kB
assets/colorUtil-C4W9XXdl.js (removed) 7 kB 🟢 -7 kB 🟢 -2.14 kB 🟢 -1.9 kB
assets/colorUtil-cyQe_9WR.js (new) 7 kB 🔴 +7 kB 🔴 +2.14 kB 🔴 +1.89 kB
assets/useFeatureFlags-DLRUtGu2.js (new) 3.5 kB 🔴 +3.5 kB 🔴 +1.08 kB 🔴 +925 B
assets/useFeatureFlags-ptNZzOEw.js (removed) 3.5 kB 🟢 -3.5 kB 🟢 -1.08 kB 🟢 -924 B
assets/useWorkspaceUI-BDIABKk9.js (removed) 3 kB 🟢 -3 kB 🟢 -823 B 🟢 -704 B
assets/useWorkspaceUI-D-WzJtiM.js (new) 3 kB 🔴 +3 kB 🔴 +822 B 🔴 +703 B
assets/useSubscriptionCredits-B-OheVPe.js (new) 2.75 kB 🔴 +2.75 kB 🔴 +1.04 kB 🔴 +901 B
assets/useSubscriptionCredits-CUR6hU4S.js (removed) 2.75 kB 🟢 -2.75 kB 🟢 -1.04 kB 🟢 -899 B
assets/subscriptionCheckoutUtil-CB4WwopG.js (removed) 2.53 kB 🟢 -2.53 kB 🟢 -1.06 kB 🟢 -928 B
assets/subscriptionCheckoutUtil-m1NtwNi2.js (new) 2.53 kB 🔴 +2.53 kB 🔴 +1.06 kB 🔴 +957 B
assets/useExternalLink-CBqIv4y_.js (removed) 1.66 kB 🟢 -1.66 kB 🟢 -775 B 🟢 -679 B
assets/useExternalLink-CvEQWsMF.js (new) 1.66 kB 🔴 +1.66 kB 🔴 +772 B 🔴 +680 B
assets/useErrorHandling-IT0bChn3.js (removed) 1.5 kB 🟢 -1.5 kB 🟢 -630 B 🟢 -536 B
assets/useErrorHandling-mXE4f3vC.js (new) 1.5 kB 🔴 +1.5 kB 🔴 +629 B 🔴 +533 B
assets/useWorkspaceSwitch-CCpYG_3k.js (removed) 1.25 kB 🟢 -1.25 kB 🟢 -543 B 🟢 -476 B
assets/useWorkspaceSwitch-Czi3Hifb.js (new) 1.25 kB 🔴 +1.25 kB 🔴 +544 B 🔴 +489 B
assets/audioUtils-6E2q8eJB.js (new) 858 B 🔴 +858 B 🔴 +502 B 🔴 +402 B
assets/audioUtils-CQh9W0km.js (removed) 858 B 🟢 -858 B 🟢 -501 B 🟢 -404 B
assets/useLoad3d-CnWuMRaK.js (new) 829 B 🔴 +829 B 🔴 +408 B 🔴 +364 B
assets/useLoad3d-mVwV-Djp.js (removed) 829 B 🟢 -829 B 🟢 -413 B 🟢 -365 B
assets/useLoad3dViewer-CcSqypep.js (new) 808 B 🔴 +808 B 🔴 +394 B 🔴 +355 B
assets/useLoad3dViewer-DpDJ2KLZ.js (removed) 808 B 🟢 -808 B 🟢 -399 B 🟢 -350 B
assets/useCurrentUser-BexowDZ1.js (new) 692 B 🔴 +692 B 🔴 +355 B 🔴 +335 B
assets/useCurrentUser-CaTwqxyF.js (removed) 692 B 🟢 -692 B 🟢 -359 B 🟢 -314 B
assets/_plugin-vue_export-helper-CY4XIWDa.js 315 B 315 B ⚪ 0 B ⚪ 0 B ⚪ 0 B
assets/envUtil-BQSmRN2Q.js 466 B 466 B ⚪ 0 B ⚪ 0 B ⚪ 0 B
assets/markdownRendererUtil-BNtwue5s.js 1.56 kB 1.56 kB ⚪ 0 B ⚪ 0 B ⚪ 0 B
assets/SkeletonUtils-Dbobu-mZ.js 133 B 133 B ⚪ 0 B ⚪ 0 B ⚪ 0 B

Status: 14 added / 14 removed

Vendor & Third-Party — 8.86 MB (baseline 8.86 MB) • 🔴 +18 B

External libraries and shared vendor chunks

File Before After Δ Raw Δ Gzip Δ Brotli
assets/vendor-other-B3_udOyB.js (new) 1.52 MB 🔴 +1.52 MB 🔴 +318 kB 🔴 +253 kB
assets/vendor-other-CzqznI4C.js (removed) 1.52 MB 🟢 -1.52 MB 🟢 -318 kB 🟢 -254 kB
assets/vendor-axios-C4mPrLmU.js 70.3 kB 70.3 kB ⚪ 0 B ⚪ 0 B ⚪ 0 B
assets/vendor-chart-BVph5xqx.js 399 kB 399 kB ⚪ 0 B ⚪ 0 B ⚪ 0 B
assets/vendor-firebase-BvMr43CG.js 836 kB 836 kB ⚪ 0 B ⚪ 0 B ⚪ 0 B
assets/vendor-i18n-CJliEbVY.js 131 kB 131 kB ⚪ 0 B ⚪ 0 B ⚪ 0 B
assets/vendor-markdown-DDKkCsp-.js 145 kB 145 kB ⚪ 0 B ⚪ 0 B ⚪ 0 B
assets/vendor-primevue-CoGfUUGx.js 1.73 MB 1.73 MB ⚪ 0 B ⚪ 0 B ⚪ 0 B
assets/vendor-reka-ui-CWMIYdD2.js 379 kB 379 kB ⚪ 0 B ⚪ 0 B ⚪ 0 B
assets/vendor-sentry-SQwstEKc.js 182 kB 182 kB ⚪ 0 B ⚪ 0 B ⚪ 0 B
assets/vendor-three-DSpQy18i.js 1.8 MB 1.8 MB ⚪ 0 B ⚪ 0 B ⚪ 0 B
assets/vendor-tiptap-Bi_34iZD.js 625 kB 625 kB ⚪ 0 B ⚪ 0 B ⚪ 0 B
assets/vendor-vue-core-CmHHRvL9.js 311 kB 311 kB ⚪ 0 B ⚪ 0 B ⚪ 0 B
assets/vendor-vueuse-B4hGe0IQ.js 113 kB 113 kB ⚪ 0 B ⚪ 0 B ⚪ 0 B
assets/vendor-xterm-C4cqihSk.js 374 kB 374 kB ⚪ 0 B ⚪ 0 B ⚪ 0 B
assets/vendor-yjs-CP_4YO8u.js 143 kB 143 kB ⚪ 0 B ⚪ 0 B ⚪ 0 B
assets/vendor-zod-DcCUUPIi.js 109 kB 109 kB ⚪ 0 B ⚪ 0 B ⚪ 0 B

Status: 1 added / 1 removed

Other — 7.38 MB (baseline 7.38 MB) • 🔴 +163 B

Bundles that do not match a named category

File Before After Δ Raw Δ Gzip Δ Brotli
assets/i18n-D-vJp-KK.js (new) 506 kB 🔴 +506 kB 🔴 +97.1 kB 🔴 +75.7 kB
assets/i18n-B3jA0_YD.js (removed) 506 kB 🟢 -506 kB 🟢 -97 kB 🟢 -75.5 kB
assets/core-_CbC_3_1.js (new) 72.2 kB 🔴 +72.2 kB 🔴 +18.6 kB 🔴 +15.9 kB
assets/core-CIuYDZf6.js (removed) 72.2 kB 🟢 -72.2 kB 🟢 -18.6 kB 🟢 -16 kB
assets/groupNode-CymU4C-P.js (removed) 71.8 kB 🟢 -71.8 kB 🟢 -17.7 kB 🟢 -15.5 kB
assets/groupNode-DpMlTeyk.js (new) 71.8 kB 🔴 +71.8 kB 🔴 +17.7 kB 🔴 +15.5 kB
assets/WidgetSelect-B8UPYm2Y.js (removed) 57.6 kB 🟢 -57.6 kB 🟢 -12.2 kB 🟢 -10.5 kB
assets/WidgetSelect-LJegcnPH.js (new) 57.6 kB 🔴 +57.6 kB 🔴 +12.2 kB 🔴 +10.5 kB
assets/SubscriptionRequiredDialogContentWorkspace-CMP4Jhw7.js (removed) 45.8 kB 🟢 -45.8 kB 🟢 -8.55 kB 🟢 -7.4 kB
assets/SubscriptionRequiredDialogContentWorkspace-DC-aR7B0.js (new) 45.8 kB 🔴 +45.8 kB 🔴 +8.55 kB 🔴 +7.4 kB
assets/Load3DControls-Bx3sF41t.js (removed) 30.9 kB 🟢 -30.9 kB 🟢 -5.34 kB 🟢 -4.65 kB
assets/Load3DControls-DcMVGDbd.js (new) 30.9 kB 🔴 +30.9 kB 🔴 +5.34 kB 🔴 +4.65 kB
assets/WorkspacePanelContent-ChWMeg6v.js (new) 29.2 kB 🔴 +29.2 kB 🔴 +6.09 kB 🔴 +5.35 kB
assets/WorkspacePanelContent-UNKF_hlk.js (removed) 29.2 kB 🟢 -29.2 kB 🟢 -6.09 kB 🟢 -5.35 kB
assets/SubscriptionRequiredDialogContent-6hck31Oh.js (removed) 26.2 kB 🟢 -26.2 kB 🟢 -6.55 kB 🟢 -5.76 kB
assets/SubscriptionRequiredDialogContent-BAvGlhaM.js (new) 26.2 kB 🔴 +26.2 kB 🔴 +6.55 kB 🔴 +5.77 kB
assets/Load3dViewerContent-B1dDAnRN.js (removed) 23 kB 🟢 -23 kB 🟢 -5.19 kB 🟢 -4.5 kB
assets/Load3dViewerContent-qbMMEMIZ.js (new) 23 kB 🔴 +23 kB 🔴 +5.19 kB 🔴 +4.5 kB
assets/WidgetImageCrop-BnT0b6e6.js (removed) 22.1 kB 🟢 -22.1 kB 🟢 -5.49 kB 🟢 -4.84 kB
assets/WidgetImageCrop-DRXftSPZ.js (new) 22.1 kB 🔴 +22.1 kB 🔴 +5.49 kB 🔴 +4.83 kB
assets/SubscriptionPanelContentWorkspace-BWUUiG2_.js (new) 21.6 kB 🔴 +21.6 kB 🔴 +5.02 kB 🔴 +4.43 kB
assets/SubscriptionPanelContentWorkspace-Oh0vjbTn.js (removed) 21.6 kB 🟢 -21.6 kB 🟢 -5.02 kB 🟢 -4.43 kB
assets/CurrentUserPopoverWorkspace-DR4OMTF2.js (removed) 19.8 kB 🟢 -19.8 kB 🟢 -4.85 kB 🟢 -4.32 kB
assets/CurrentUserPopoverWorkspace-gPfziUJj.js (new) 19.8 kB 🔴 +19.8 kB 🔴 +4.85 kB 🔴 +4.31 kB
assets/SignInContent-CrQQM7zk.js (removed) 18.9 kB 🟢 -18.9 kB 🟢 -4.78 kB 🟢 -4.17 kB
assets/SignInContent-FOnE3j09.js (new) 18.9 kB 🔴 +18.9 kB 🔴 +4.77 kB 🔴 +4.17 kB
assets/WidgetRecordAudio-DmeAXtvI.js (new) 17.3 kB 🔴 +17.3 kB 🔴 +4.93 kB 🔴 +4.41 kB
assets/WidgetRecordAudio-PjVzj6in.js (removed) 17.3 kB 🟢 -17.3 kB 🟢 -4.93 kB 🟢 -4.41 kB
assets/Load3D-Be9xRNPt.js (new) 16.2 kB 🔴 +16.2 kB 🔴 +4.03 kB 🔴 +3.52 kB
assets/Load3D-CSF1ekBo.js (removed) 16.2 kB 🟢 -16.2 kB 🟢 -4.03 kB 🟢 -3.52 kB
assets/load3d-b7TOc2UH.js (removed) 14.7 kB 🟢 -14.7 kB 🟢 -4.18 kB 🟢 -3.63 kB
assets/load3d-BKnzeLDM.js (new) 14.7 kB 🔴 +14.7 kB 🔴 +4.18 kB 🔴 +3.61 kB
assets/LazyImage-BThYoZlE.js (removed) 12.3 kB 🟢 -12.3 kB 🟢 -3.81 kB 🟢 -3.36 kB
assets/LazyImage-OmzvqDj_.js (new) 12.3 kB 🔴 +12.3 kB 🔴 +3.81 kB 🔴 +3.36 kB
assets/WidgetInputNumber-Bld2J8LV.js (new) 11.8 kB 🔴 +11.8 kB 🔴 +3.32 kB 🔴 +2.98 kB
assets/WidgetInputNumber-yq6BqJPW.js (removed) 11.8 kB 🟢 -11.8 kB 🟢 -3.32 kB 🟢 -2.97 kB
assets/AudioPreviewPlayer-BR_r02tZ.js (new) 10.8 kB 🔴 +10.8 kB 🔴 +3.18 kB 🔴 +2.85 kB
assets/AudioPreviewPlayer-PqN8hHc7.js (removed) 10.8 kB 🟢 -10.8 kB 🟢 -3.18 kB 🟢 -2.85 kB
assets/changeTracker-C-Oo1R6W.js (removed) 9.38 kB 🟢 -9.38 kB 🟢 -2.89 kB 🟢 -2.54 kB
assets/changeTracker-C2XhRn2w.js (new) 9.38 kB 🔴 +9.38 kB 🔴 +2.89 kB 🔴 +2.54 kB
assets/nodeTemplates-Byyfut5n.js (removed) 9.26 kB 🟢 -9.26 kB 🟢 -3.25 kB 🟢 -2.85 kB
assets/nodeTemplates-CXrXyNOy.js (new) 9.26 kB 🔴 +9.26 kB 🔴 +3.25 kB 🔴 +2.84 kB
assets/SelectValue-C3sWXfX5.js (removed) 8.94 kB 🟢 -8.94 kB 🟢 -2.27 kB 🟢 -2 kB
assets/SelectValue-uU-KL9Wx.js (new) 8.94 kB 🔴 +8.94 kB 🔴 +2.27 kB 🔴 +2 kB
assets/InviteMemberDialogContent-D1f84L28.js (new) 7.35 kB 🔴 +7.35 kB 🔴 +2.28 kB 🔴 +1.99 kB
assets/InviteMemberDialogContent-Dn_DgQCX.js (removed) 7.35 kB 🟢 -7.35 kB 🟢 -2.28 kB 🟢 -1.98 kB
assets/WidgetWithControl-_hNMigOR.js (new) 7.06 kB 🔴 +7.06 kB 🔴 +2.66 kB 🔴 +2.37 kB
assets/WidgetWithControl-BA5mfjGh.js (removed) 7.06 kB 🟢 -7.06 kB 🟢 -2.66 kB 🟢 -2.38 kB
assets/WidgetToggleSwitch-C5hOqXif.js (removed) 6.8 kB 🟢 -6.8 kB 🟢 -2.19 kB 🟢 -1.94 kB
assets/WidgetToggleSwitch-DHAhsmCa.js (new) 6.8 kB 🔴 +6.8 kB 🔴 +2.19 kB 🔴 +1.93 kB
assets/Load3DConfiguration-BJKdHja_.js (removed) 6.27 kB 🟢 -6.27 kB 🟢 -1.91 kB 🟢 -1.68 kB
assets/Load3DConfiguration-D9H4kGRR.js (new) 6.27 kB 🔴 +6.27 kB 🔴 +1.91 kB 🔴 +1.68 kB
assets/CreateWorkspaceDialogContent-BC4j41vW.js (new) 5.5 kB 🔴 +5.5 kB 🔴 +1.98 kB 🔴 +1.72 kB
assets/CreateWorkspaceDialogContent-Br_i4xYQ.js (removed) 5.5 kB 🟢 -5.5 kB 🟢 -1.98 kB 🟢 -1.73 kB
assets/EditWorkspaceDialogContent-5oBuFqs4.js (removed) 5.3 kB 🟢 -5.3 kB 🟢 -1.93 kB 🟢 -1.68 kB
assets/EditWorkspaceDialogContent-pkDiqZEO.js (new) 5.3 kB 🔴 +5.3 kB 🔴 +1.93 kB 🔴 +1.68 kB
assets/ValueControlPopover-B4jYf2Uz.js (removed) 4.89 kB 🟢 -4.89 kB 🟢 -1.75 kB 🟢 -1.57 kB
assets/ValueControlPopover-DNIrb2ew.js (new) 4.89 kB 🔴 +4.89 kB 🔴 +1.75 kB 🔴 +1.57 kB
assets/Preview3d-6ufz1_ji.js (removed) 4.78 kB 🟢 -4.78 kB 🟢 -1.55 kB 🟢 -1.36 kB
assets/Preview3d-mRajdNPw.js (new) 4.78 kB 🔴 +4.78 kB 🔴 +1.55 kB 🔴 +1.35 kB
assets/CancelSubscriptionDialogContent-CFOLSAvh.js (removed) 4.76 kB 🟢 -4.76 kB 🟢 -1.77 kB 🟢 -1.55 kB
assets/CancelSubscriptionDialogContent-DzkxDvTj.js (new) 4.76 kB 🔴 +4.76 kB 🔴 +1.77 kB 🔴 +1.54 kB
assets/AnimationControls-B0NGft7e.js (new) 4.61 kB 🔴 +4.61 kB 🔴 +1.6 kB 🔴 +1.41 kB
assets/AnimationControls-uQSjTFcj.js (removed) 4.61 kB 🟢 -4.61 kB 🟢 -1.6 kB 🟢 -1.41 kB
assets/DeleteWorkspaceDialogContent-BbcPaUxt.js (new) 4.2 kB 🔴 +4.2 kB 🔴 +1.61 kB 🔴 +1.41 kB
assets/DeleteWorkspaceDialogContent-caxBZmsP.js (removed) 4.2 kB 🟢 -4.2 kB 🟢 -1.62 kB 🟢 -1.4 kB
assets/LeaveWorkspaceDialogContent-CvuhkuSv.js (removed) 4.03 kB 🟢 -4.03 kB 🟢 -1.57 kB 🟢 -1.36 kB
assets/LeaveWorkspaceDialogContent-CW1m_nDV.js (new) 4.03 kB 🔴 +4.03 kB 🔴 +1.56 kB 🔴 +1.36 kB
assets/RemoveMemberDialogContent-B7EeFw9X.js (new) 4.01 kB 🔴 +4.01 kB 🔴 +1.51 kB 🔴 +1.32 kB
assets/RemoveMemberDialogContent-BTgtQ9Jy.js (removed) 4.01 kB 🟢 -4.01 kB 🟢 -1.51 kB 🟢 -1.32 kB
assets/RevokeInviteDialogContent-BJVADTR7.js (removed) 3.92 kB 🟢 -3.92 kB 🟢 -1.53 kB 🟢 -1.34 kB
assets/RevokeInviteDialogContent-D5_am8Bg.js (new) 3.92 kB 🔴 +3.92 kB 🔴 +1.53 kB 🔴 +1.34 kB
assets/InviteMemberUpsellDialogContent-D-pCxVQx.js (new) 3.79 kB 🔴 +3.79 kB 🔴 +1.39 kB 🔴 +1.22 kB
assets/InviteMemberUpsellDialogContent-Dpn9bCWJ.js (removed) 3.79 kB 🟢 -3.79 kB 🟢 -1.39 kB 🟢 -1.22 kB
assets/Slider-BcKuGEHE.js (new) 3.52 kB 🔴 +3.52 kB 🔴 +1.37 kB 🔴 +1.19 kB
assets/Slider-GQ9VWDai.js (removed) 3.52 kB 🟢 -3.52 kB 🟢 -1.36 kB 🟢 -1.19 kB
assets/saveMesh-BKL6gXYS.js (new) 3.35 kB 🔴 +3.35 kB 🔴 +1.44 kB 🔴 +1.29 kB
assets/saveMesh-BZVNJaxf.js (removed) 3.35 kB 🟢 -3.35 kB 🟢 -1.45 kB 🟢 -1.28 kB
assets/WidgetBoundingBox-CZEvKty8.js (new) 3.19 kB 🔴 +3.19 kB 🔴 +897 B 🔴 +779 B
assets/WidgetBoundingBox-TjlkeDqM.js (removed) 3.19 kB 🟢 -3.19 kB 🟢 -894 B 🟢 -778 B
assets/WidgetTextarea-BVc4_cxh.js (removed) 3.13 kB 🟢 -3.13 kB 🟢 -1.29 kB 🟢 -1.15 kB
assets/WidgetTextarea-DQ3T0VpG.js (new) 3.13 kB 🔴 +3.13 kB 🔴 +1.29 kB 🔴 +1.15 kB
assets/cloudSessionCookie-DNAKTc_f.js (new) 3.07 kB 🔴 +3.07 kB 🔴 +1.07 kB 🔴 +958 B
assets/cloudSessionCookie-fwu4Akml.js (removed) 3.07 kB 🟢 -3.07 kB 🟢 -1.07 kB 🟢 -960 B
assets/GlobalToast-C4Mcuxsa.js (new) 2.91 kB 🔴 +2.91 kB 🔴 +1.21 kB 🔴 +1.03 kB
assets/GlobalToast-Cj5ZI2MV.js (removed) 2.91 kB 🟢 -2.91 kB 🟢 -1.21 kB 🟢 -1.06 kB
assets/WidgetColorPicker-BbpzLsd8.js (removed) 2.9 kB 🟢 -2.9 kB 🟢 -1.23 kB 🟢 -1.1 kB
assets/WidgetColorPicker-COeUsp1P.js (new) 2.9 kB 🔴 +2.9 kB 🔴 +1.23 kB 🔴 +1.11 kB
assets/ApiNodesSignInContent-CN66V3nz.js (new) 2.69 kB 🔴 +2.69 kB 🔴 +1.05 kB 🔴 +925 B
assets/ApiNodesSignInContent-D23DWNJs.js (removed) 2.69 kB 🟢 -2.69 kB 🟢 -1.05 kB 🟢 -924 B
assets/SubscribeToRun-D0IteGKJ.js (removed) 2.2 kB 🟢 -2.2 kB 🟢 -1.01 kB 🟢 -892 B
assets/SubscribeToRun-qx_YsUGz.js (new) 2.2 kB 🔴 +2.2 kB 🔴 +1.01 kB 🔴 +866 B
assets/WidgetLayoutField-BN4bMP-H.js (removed) 1.95 kB 🟢 -1.95 kB 🟢 -876 B 🟢 -765 B
assets/WidgetLayoutField-f002IgQc.js (new) 1.95 kB 🔴 +1.95 kB 🔴 +878 B 🔴 +764 B
assets/WidgetInputText-BhIQJgjH.js (removed) 1.86 kB 🟢 -1.86 kB 🟢 -873 B 🟢 -784 B
assets/WidgetInputText-CLgeVbbU.js (new) 1.86 kB 🔴 +1.86 kB 🔴 +875 B 🔴 +790 B
assets/CloudRunButtonWrapper-BOUNGdkc.js (removed) 1.65 kB 🟢 -1.65 kB 🟢 -774 B 🟢 -689 B
assets/CloudRunButtonWrapper-ffr_zT2-.js (new) 1.65 kB 🔴 +1.65 kB 🔴 +769 B 🔴 +679 B
assets/signInSchema-Dy3xmO-Z.js (removed) 1.53 kB 🟢 -1.53 kB 🟢 -563 B 🟢 -514 B
assets/signInSchema-DZWRCcrU.js (new) 1.53 kB 🔴 +1.53 kB 🔴 +562 B 🔴 +513 B
assets/cloudBadges-BLveRQpX.js (removed) 1.34 kB 🟢 -1.34 kB 🟢 -693 B 🟢 -598 B
assets/cloudBadges-BmAIFIcO.js (new) 1.34 kB 🔴 +1.34 kB 🔴 +690 B 🔴 +596 B
assets/cloudSubscription-CGNG4COa.js (new) 1.3 kB 🔴 +1.3 kB 🔴 +639 B 🔴 +557 B
assets/cloudSubscription-DIXEGLUY.js (removed) 1.3 kB 🟢 -1.3 kB 🟢 -642 B 🟢 -556 B
assets/Load3D-BsM4U7MI.js (new) 1.04 kB 🔴 +1.04 kB 🔴 +484 B 🔴 +432 B
assets/Load3D-CJE-glg5.js (removed) 1.04 kB 🟢 -1.04 kB 🟢 -487 B 🟢 -431 B
assets/nightlyBadges-Co7UiPTs.js (new) 971 B 🔴 +971 B 🔴 +518 B 🔴 +462 B
assets/nightlyBadges-CoPhYbkl.js (removed) 971 B 🟢 -971 B 🟢 -522 B 🟢 -457 B
assets/Load3dViewerContent-BqFUj4Vq.js (removed) 963 B 🟢 -963 B 🟢 -457 B 🟢 -405 B
assets/Load3dViewerContent-C0YPNoep.js (new) 963 B 🔴 +963 B 🔴 +454 B 🔴 +407 B
assets/SubscriptionPanelContentWorkspace-DAHSwLTi.js (new) 900 B 🔴 +900 B 🔴 +419 B 🔴 +368 B
assets/SubscriptionPanelContentWorkspace-S1LZckA6.js (removed) 900 B 🟢 -900 B 🟢 -428 B 🟢 -366 B
assets/graphHasMissingNodes-D8uyULK2.js (removed) 761 B 🟢 -761 B 🟢 -374 B 🟢 -331 B
assets/graphHasMissingNodes-DtmNJjzR.js (new) 761 B 🔴 +761 B 🔴 +372 B 🔴 +324 B
assets/changeTracker-4NCXWR7L.js (removed) 727 B 🟢 -727 B 🟢 -374 B 🟢 -326 B
assets/changeTracker-D_hczrMa.js (new) 727 B 🔴 +727 B 🔴 +368 B 🔴 +323 B
assets/WidgetLegacy-3rEZSa5L.js (removed) 715 B 🟢 -715 B 🟢 -373 B 🟢 -324 B
assets/WidgetLegacy-CEVygHql.js (new) 715 B 🔴 +715 B 🔴 +365 B 🔴 +326 B
assets/WidgetInputNumber--j472Taw.js (new) 437 B 🔴 +437 B 🔴 +252 B 🔴 +216 B
assets/WidgetInputNumber-BiKCbJxp.js (removed) 437 B 🟢 -437 B 🟢 -249 B 🟢 -216 B
assets/WidgetBoundingBox-C_gF1pHp.js (new) 283 B 🔴 +283 B 🔴 +186 B 🔴 +169 B
assets/WidgetBoundingBox-IjS9HZ0B.js (removed) 283 B 🟢 -283 B 🟢 -183 B 🟢 -161 B
assets/src-BEVAOZ7s.js (new) 251 B 🔴 +251 B 🔴 +214 B 🔴 +186 B
assets/src-nNVkhr_P.js (removed) 251 B 🟢 -251 B 🟢 -210 B 🟢 -182 B
assets/i18n-BOydOvCs.js (removed) 199 B 🟢 -199 B 🟢 -162 B 🟢 -168 B
assets/i18n-CEXbEOyy.js (new) 199 B 🔴 +199 B 🔴 +159 B 🔴 +137 B
assets/auto-P6cmVFBq.js 1.7 kB 1.7 kB ⚪ 0 B ⚪ 0 B ⚪ 0 B
assets/BaseViewTemplate-Ct70qdN0.js 1.78 kB 1.78 kB ⚪ 0 B ⚪ 0 B ⚪ 0 B
assets/comfy-logo-single-Bzuu84gN.js 198 B 198 B ⚪ 0 B ⚪ 0 B ⚪ 0 B
assets/ComfyOrgHeader-DFzBWZrP.js 910 B 910 B ⚪ 0 B ⚪ 0 B ⚪ 0 B
assets/commands-6ntdtqc9.js 16.6 kB 16.6 kB ⚪ 0 B ⚪ 0 B ⚪ 0 B
assets/commands-B4RbG9Th.js 17.2 kB 17.2 kB ⚪ 0 B ⚪ 0 B ⚪ 0 B
assets/commands-BmIbopvA.js 14.9 kB 14.9 kB ⚪ 0 B ⚪ 0 B ⚪ 0 B
assets/commands-Br2FiHkj.js 17.1 kB 17.1 kB ⚪ 0 B ⚪ 0 B ⚪ 0 B
assets/commands-BrlWvwVz.js 15.7 kB 15.7 kB ⚪ 0 B ⚪ 0 B ⚪ 0 B
assets/commands-BV_NDvWz.js 15.5 kB 15.5 kB ⚪ 0 B ⚪ 0 B ⚪ 0 B
assets/commands-CSxUmE31.js 14.7 kB 14.7 kB ⚪ 0 B ⚪ 0 B ⚪ 0 B
assets/commands-D3gGGUgv.js 16.3 kB 16.3 kB ⚪ 0 B ⚪ 0 B ⚪ 0 B
assets/commands-DBqn--Z9.js 15.8 kB 15.8 kB ⚪ 0 B ⚪ 0 B ⚪ 0 B
assets/commands-DgX9pWvG.js 15.8 kB 15.8 kB ⚪ 0 B ⚪ 0 B ⚪ 0 B
assets/commands-DlSpFU8-.js 18.4 kB 18.4 kB ⚪ 0 B ⚪ 0 B ⚪ 0 B
assets/constants-BKU8e69-.js 579 B 579 B ⚪ 0 B ⚪ 0 B ⚪ 0 B
assets/main-Bg-1LcRk.js 120 kB 120 kB ⚪ 0 B ⚪ 0 B ⚪ 0 B
assets/main-BhTuc8pp.js 144 kB 144 kB ⚪ 0 B ⚪ 0 B ⚪ 0 B
assets/main-BjNyGyrP.js 136 kB 136 kB ⚪ 0 B ⚪ 0 B ⚪ 0 B
assets/main-Bl8Fy3rY.js 141 kB 141 kB ⚪ 0 B ⚪ 0 B ⚪ 0 B
assets/main-Bo3hm2ug.js 190 kB 190 kB ⚪ 0 B ⚪ 0 B ⚪ 0 B
assets/main-C-XiaTzV.js 157 kB 157 kB ⚪ 0 B ⚪ 0 B ⚪ 0 B
assets/main-D-LaWT4q.js 121 kB 121 kB ⚪ 0 B ⚪ 0 B ⚪ 0 B
assets/main-DkPPQYpL.js 170 kB 170 kB ⚪ 0 B ⚪ 0 B ⚪ 0 B
assets/main-paKyiK5-.js 137 kB 137 kB ⚪ 0 B ⚪ 0 B ⚪ 0 B
assets/main-wXc1MGIE.js 139 kB 139 kB ⚪ 0 B ⚪ 0 B ⚪ 0 B
assets/main-XEp46eGp.js 164 kB 164 kB ⚪ 0 B ⚪ 0 B ⚪ 0 B
assets/Media3DTop-Dh4-HFFk.js 1.82 kB 1.82 kB ⚪ 0 B ⚪ 0 B ⚪ 0 B
assets/MediaAudioTop-DzoZYGHS.js 1.43 kB 1.43 kB ⚪ 0 B ⚪ 0 B ⚪ 0 B
assets/MediaImageTop-CL20xhK_.js 1.75 kB 1.75 kB ⚪ 0 B ⚪ 0 B ⚪ 0 B
assets/MediaVideoTop-CfUwIe0I.js 2.23 kB 2.23 kB ⚪ 0 B ⚪ 0 B ⚪ 0 B
assets/nodeDefs-Bheu43Bb.js 391 kB 391 kB ⚪ 0 B ⚪ 0 B ⚪ 0 B
assets/nodeDefs-BPuceShu.js 346 kB 346 kB ⚪ 0 B ⚪ 0 B ⚪ 0 B
assets/nodeDefs-BvgDpig6.js 377 kB 377 kB ⚪ 0 B ⚪ 0 B ⚪ 0 B
assets/nodeDefs-BZpu0NoU.js 463 kB 463 kB ⚪ 0 B ⚪ 0 B ⚪ 0 B
assets/nodeDefs-Cev_L1ap.js 381 kB 381 kB ⚪ 0 B ⚪ 0 B ⚪ 0 B
assets/nodeDefs-CGC_NG3k.js 369 kB 369 kB ⚪ 0 B ⚪ 0 B ⚪ 0 B
assets/nodeDefs-Cj5X8IGf.js 343 kB 343 kB ⚪ 0 B ⚪ 0 B ⚪ 0 B
assets/nodeDefs-DAEaB4hJ.js 373 kB 373 kB ⚪ 0 B ⚪ 0 B ⚪ 0 B
assets/nodeDefs-DJG4rq9g.js 377 kB 377 kB ⚪ 0 B ⚪ 0 B ⚪ 0 B
assets/nodeDefs-DJl7ITPK.js 424 kB 424 kB ⚪ 0 B ⚪ 0 B ⚪ 0 B
assets/nodeDefs-Dywtk58C.js 424 kB 424 kB ⚪ 0 B ⚪ 0 B ⚪ 0 B
assets/OBJLoader2WorkerModule-DTMpvldF.js 109 kB 109 kB ⚪ 0 B ⚪ 0 B ⚪ 0 B
assets/previousFullPath-CxcvRxyJ.js 665 B 665 B ⚪ 0 B ⚪ 0 B ⚪ 0 B
assets/rolldown-runtime-DLICfi3-.js 1.97 kB 1.97 kB ⚪ 0 B ⚪ 0 B ⚪ 0 B
assets/telemetry-zZf2dHJ2.js 226 B 226 B ⚪ 0 B ⚪ 0 B ⚪ 0 B
assets/types-DT3N7am7.js 204 B 204 B ⚪ 0 B ⚪ 0 B ⚪ 0 B
assets/widget-DTUjK0ZE.js 445 B 445 B ⚪ 0 B ⚪ 0 B ⚪ 0 B
assets/WidgetChart-D9xu7nZ_.js 2.21 kB 2.21 kB ⚪ 0 B ⚪ 0 B ⚪ 0 B
assets/WidgetGalleria-BHuY17AM.js 3.61 kB 3.61 kB ⚪ 0 B ⚪ 0 B ⚪ 0 B
assets/WidgetImageCompare-D4L7op4g.js 3.1 kB 3.1 kB ⚪ 0 B ⚪ 0 B ⚪ 0 B
assets/WidgetMarkdown-Eg9fZF2S.js 2.93 kB 2.93 kB ⚪ 0 B ⚪ 0 B ⚪ 0 B
assets/widgetPropFilter-DfMXJwGW.js 1.1 kB 1.1 kB ⚪ 0 B ⚪ 0 B ⚪ 0 B
assets/widgetTypes-BtuQMzwn.js 393 B 393 B ⚪ 0 B ⚪ 0 B ⚪ 0 B

Status: 63 added / 63 removed

Copy link
Contributor

@coderabbitai coderabbitai bot left a comment

Choose a reason for hiding this comment

The reason will be displayed to describe this comment to others. Learn more.

Actionable comments posted: 3

🤖 Prompt for all review comments with AI agents
Verify each finding against the current code and only fix it if needed.

Inline comments:
In `@browser_tests/tests/interaction.spec.ts`:
- Around line 736-739: The fixed 600ms setTimeout in comfyPage.page.evaluate is
brittle; replace it with a persistence-based wait that polls localStorage for
the draft index update (the key used by V2 persistence) instead of sleeping.
Capture the current localStorage draft index value before the change, then use
comfyPage.page.waitForFunction (or an evaluate loop) to wait until
localStorage.getItem('draftIndex') (or the exact V2 draft index key used in the
app) changes/updates, and only proceed once the new value is observed so the
debounced persistence has completed.

In `@src/platform/workflow/persistence/composables/useWorkflowPersistenceV2.ts`:
- Around line 186-193: The watcher on workflowStore.activeWorkflow?.key can
persist the new workflow before pending debounced writes from the previous
workflow complete; call debouncedPersist.flush() before calling
persistCurrentWorkflow() so any pending edits for the previous workflow are
flushed, e.g. flush debouncedPersist in the watch callback prior to invoking
persistCurrentWorkflow() (referencing debouncedPersist.flush(),
persistCurrentWorkflow(), and the watch on workflowStore.activeWorkflow?.key).

In `@src/platform/workflow/persistence/migration/migrateV1toV2.ts`:
- Around line 73-78: When no V1 data exists the code calls
writeIndex(workspaceId, createEmptyIndex()) but ignores its result and possible
failures; change migrateV1toV2 so that after calling writeIndex you check its
return value or catch errors from it, log or surface the error (using the same
logger used elsewhere), and return a non-zero/failure code on write failure
instead of returning 0. Locate the block around readV1Drafts, createEmptyIndex
and writeIndex and ensure writeIndex's promise/return is awaited/inspected and
migration returns a failure status when the write fails.

@christian-byrne christian-byrne marked this pull request as ready for review February 20, 2026 08:27
@dosubot dosubot bot added size:XXL This PR changes 1000+ lines, ignoring generated files. and removed size:XL This PR changes 500-999 lines, ignoring generated files. labels Feb 20, 2026
…ebounce on switch, handle writeIndex failure, replace brittle timeout

- Extract findAndMigratePointer/readSessionPointer to DRY duplicated fallback search in storageIO
- Flush debouncedPersist before persisting new workflow on switch to prevent data loss
- Handle writeIndex failure when creating empty V2 index during migration
- Replace 600ms setTimeout with localStorage-based waitForFunction in browser test
- Revert unrelated package.json change

Amp-Thread-ID: https://ampcode.com/threads/T-019c7a1f-7f9e-778b-925c-bda5192177f4
Copy link
Contributor

@coderabbitai coderabbitai bot left a comment

Choose a reason for hiding this comment

The reason will be displayed to describe this comment to others. Learn more.

Actionable comments posted: 2

🧹 Nitpick comments (1)
src/platform/workflow/persistence/composables/useWorkflowPersistenceV2.ts (1)

64-76: Prefer function declarations for internal helpers.

These helper functions don’t require expression form and can be declared as functions to align with repository conventions and improve hoisting clarity.

♻️ Example refactor (apply similarly to other helpers)
-  const ensureTemplateQueryFromIntent = async () => {
+  async function ensureTemplateQueryFromIntent() {
     hydratePreservedQuery(TEMPLATE_NAMESPACE)
     const mergedQuery = mergePreservedQueryIntoQuery(
       TEMPLATE_NAMESPACE,
       route.query
     )
@@
-  }
+  }

As per coding guidelines: "Do not use function expressions if it's possible to use function declarations instead".

Also applies to: 91-128, 133-184, 240-278

🤖 Prompt for AI Agents
Verify each finding against the current code and only fix it if needed.

In `@src/platform/workflow/persistence/composables/useWorkflowPersistenceV2.ts`
around lines 64 - 76, The helper currently defined as a const arrow function
ensureTemplateQueryFromIntent should be converted to a function declaration
(e.g., function ensureTemplateQueryFromIntent() { ... }) to follow repository
conventions and enable hoisting; update its definition and any other internal
helpers in this file (the other const arrow helpers mentioned) to function
declarations as well, keeping the same logic, parameters and return values so
callers (like router.replace/mergePreservedQuery/hydratePreservedQuery usage)
continue to work unchanged.
🤖 Prompt for all review comments with AI agents
Verify each finding against the current code and only fix it if needed.

Inline comments:
In `@src/platform/workflow/persistence/base/storageIO.ts`:
- Around line 193-213: The findAndMigratePointer function currently calls
JSON.parse on each sessionStorage entry which can throw on malformed JSON and
abort the scan; update findAndMigratePointer to wrap the
JSON.parse(sessionStorage.getItem(storageKey)) in a try/catch, skip (and
optionally remove) entries that fail to parse, and continue the loop so valid
pointers later in sessionStorage can still be migrated; keep the existing
behavior of matching pointer.workspaceId === targetWorkspaceId, setting newKey,
removing the old storageKey, and returning the pointer when a match is found.
- Around line 220-233: readSessionPointer currently returns a parsed pointer
from sessionStorage without checking that the parsed object's workspaceId
matches the provided targetWorkspaceId, allowing potential cross-workspace
leakage; update readSessionPointer to, after JSON.parse, if targetWorkspaceId is
provided validate parsed.workspaceId === targetWorkspaceId and if it does not
match either call findAndMigratePointer<T>(key, prefix, targetWorkspaceId) or
return null (preserve original fallback behavior), ensuring the function
enforces workspace consistency internally; refer to readSessionPointer,
targetWorkspaceId, parsed object's workspaceId, and findAndMigratePointer when
making the change.

---

Nitpick comments:
In `@src/platform/workflow/persistence/composables/useWorkflowPersistenceV2.ts`:
- Around line 64-76: The helper currently defined as a const arrow function
ensureTemplateQueryFromIntent should be converted to a function declaration
(e.g., function ensureTemplateQueryFromIntent() { ... }) to follow repository
conventions and enable hoisting; update its definition and any other internal
helpers in this file (the other const arrow helpers mentioned) to function
declarations as well, keeping the same logic, parameters and return values so
callers (like router.replace/mergePreservedQuery/hydratePreservedQuery usage)
continue to work unchanged.

…ed entries

- readSessionPointer now validates workspaceId on exact match and removes stale cross-workspace pointers before falling back
- findAndMigratePointer guards JSON.parse per entry so one corrupt record doesn't abort the scan
- Remove redundant workspace validation from useWorkflowTabState (now handled in storageIO)
- Add test for cross-workspace exact match removal and fallback

Amp-Thread-ID: https://ampcode.com/threads/T-019c7a1f-7f9e-778b-925c-bda5192177f4
@christian-byrne christian-byrne assigned simula-r and unassigned simula-r Feb 20, 2026
Copy link
Contributor

@simula-r simula-r left a comment

Choose a reason for hiding this comment

The reason will be displayed to describe this comment to others. Learn more.

LGTM 💪

@christian-byrne christian-byrne merged commit 40aa7c5 into main Feb 21, 2026
30 checks passed
@christian-byrne christian-byrne deleted the 01-31-feat_persistence_integrate_v2_system_migration_4_4_ branch February 21, 2026 08:57
Sign up for free to join this conversation on GitHub. Already have an account? Sign in to comment

Labels

size:XXL This PR changes 1000+ lines, ignoring generated files.

Projects

None yet

Development

Successfully merging this pull request may close these issues.

3 participants