feat: release v1.5 - #928
Merged
Merged
Conversation
Create a new USlideover-based drawer component that wraps EGUserAccessPanel. The drawer provides a side panel UI for editing user access within an organization, with conditional mounting to avoid unnecessary data fetches when the drawer is closed. Task 11 of EGV-214: Membership Management.
…uery param Row clicks now open the drawer inline instead of navigating to a separate edit-user page, using the query param as the single source of truth so page reloads and future deep-links reopen the same drawer.
Replaces the two edit-user page files with redirect-only shims that push to the /orgs/:orgId?openUser=:userId form, preserving deep-link and bookmark compatibility now that user access is managed via drawer.
…mbly-fasta fix: regenerate openapi assembly fasta
…rower width The org-admin-toggle row used justify-between with no shrink/grow constraints on either side, so it worked fine at full page width but in the drawer's narrower context the unbounded EGUserDisplay text (name/email) squeezed the "Organization Admin" label/toggle instead of yielding space to it. The user info side now shrinks/overflows-hidden first; the label+toggle side is shrink-0 so it always renders in full.
…odal EGAddLabUsersModule.vue was originally designed to render inline on a full-width page. Wrapping it in a modal (this PR) exposed two layout problems it never hit before: the user-picker's forced min-w-96 on its trigger overflowed the modal's narrower width, and both USelectMenus used the default 'absolute' popper strategy, which can misposition a floating dropdown relative to a modal's stacking/overflow context. Fix: stack the user picker (full width) above the role picker + Add button (their own row) instead of one wide horizontal row, drop the min-w-96 override so the picker respects its container's actual width, and set popper strategy to 'fixed' on both selects so their dropdowns anchor to the viewport instead of the modal's boundary.
fix: resolve TDZ crashes, org-redirect reload loop, and run wizard stepper desync
Task 3 registered the new endpoint in ROUTE_SCHEMAS and regenerated the OpenAPI spec (yaml), but never ran generate:api-types, so generated.d.ts never picked up AddBulkLaboratoryUsersRequest / addBulkLaboratoryUsers. development now runs both generation steps in pre-commit and guards their freshness in CI (a54af56); this file was stale relative to that guard.
…in the drawer header The overflow-hidden added to stop the Org Admin toggle from being squeezed clips EGUserDisplay's name/email text abruptly with no indication it's cut off. Pierce into EGUserDisplay's text column (scoped :deep()) to constrain its width and apply proper ellipsis truncation instead, without touching the shared component itself.
…uncating USlideover defaults to max-w-md (448px), too narrow for the header card's name + email + "Organization Admin" toggle plus the two-column lab-access table below it. Widen to max-w-xl (576px) so this content has room to breathe instead of relying on truncation to cope.
…the request is in flight The dialog closed immediately on click, before the removeUser API call even started, leaving a window where the user had no visual feedback and could re-trigger the same or another action. EGDialog already supports a :loading prop (spinner + disables both buttons) — it just wasn't wired here. Stop closing the dialog eagerly; let the existing finally block close it once the request actually completes, and pass isRemovingUser as :loading so it can't be double-triggered.
fix: load Swagger UI spec as JSON so the docs route works on the local dev server
…nstead of creating them
feat(data-collections): tag samples from a metadata sheet during import
…tionName to Laboratory schema
This generated sibling of easy-genomics-api.yaml was never staged in Tasks 1-3's commits (the plan's git-add lists only named the .yaml and generated.d.ts outputs), so it silently drifted out of sync in the working tree after each commit's pre-commit hook regenerated it.
#889) * fix: show loading skeletons on first paint instead of flashing content * fix: dont flash integration off status while lab details load * fix: clear stale run wizard load flags and skeleton lab settings sections --------- Co-authored-by: Nacho Nistal <ignacio.nistal@Nachos-MacBook-Pro.local>
Selecting HealthOmics VPC Networking and saving Lab Settings threw 'import_client_omics.GetConfigurationCommand is not a constructor' in the deployed environment (worked fine locally). Root cause: every Lambda here bundles with externalModules: ['@aws-sdk/*'], so @aws-sdk/* imports resolve from the AWS-managed Lambda Node.js 20.x runtime's own bundled SDK at runtime, not from the pinned @aws-sdk/client-omics@^3.1090.0 in package.json. HealthOmics' Configuration API (used for custom VPC networking) is new enough that it's missing from whatever SDK snapshot the managed runtime ships, so GetConfigurationCommand is undefined there. create-laboratory and update-laboratory both call assertHealthOmicsVpcConfigurationIsActive, which calls OmicsService.getConfiguration() -> new GetConfigurationCommand(...). Adding nodeModules: ['@aws-sdk/client-omics'] to those two Lambda entries forces esbuild to install the actual pinned package into the deployment artifact instead of relying on the runtime's copy, matching the existing nodeModules: ['swagger-ui-dist'] escape-hatch pattern used elsewhere for the same bundling mechanism.
fix: coalesce concurrent loadWorkflowsForLab requests for same lab
…undling fix: Bundle @aws-sdk/client-omics into create/update-laboratory Lambdas
…r changes The API key and Model ID for AI Failure Analysis (HealthOmics) were single fields shared across all LLM providers (bedrock/openai/anthropic) rather than scoped per-provider. Switching the provider dropdown (e.g. OpenAI -> Anthropic) silently reused the previous provider's saved key and model with no validation error, only failing downstream at the actual provider API call. - Front-end: clear Model ID/API Key when the provider changes away from the originally-saved one; validate() now enforces the key requirement via the previously-unused LlmApiKeySchema (the :required prop alone was cosmetic and never enforced anything); hide the 'KEY SAVED' badge once it no longer applies to the selected provider. - Back-end: update-laboratory.lambda.ts rejects the save with a 400 when HealthOmicsLlmProvider changes to openai/anthropic without a new HealthOmicsLlmApiKey in the request, closing the same gap for direct API calls. Scoped to HealthOmics only; Seqera has the identical pattern but is being soft-deprecated.
* feat: release candidate v1.4 (#759) * fix: error handling in modified create-run lambda * feat: omics run tag based access controls on workflows * Revert "feat: omics run tag based access controls on workflows" This reverts commit bdf90ab. * feat: surface workflow versions * fix: resolve merge conflict * feat: revert server-side pagination of runs table * feat: added new side menu across application (#704) * fix: merge error on org admin tabs * feat: refactor aws cdk stacks to avoid cf limit * fix: run linter * feat: migration - add preflight deletion protection script * docs: update migration script readme * fix: organization written in british english in some places (#727) * fix: text in egdialog component rendering outside of component (#728) * fix: migration for dynamodb tables, ui deploy * fix: cicd unit test failures re: shared lib imports * fix: unit tests modules mapping paths (#731) fix: jest config adding missing module mapper fix: github pipelines dependencies install fix: unit tests path imports * fix: front-end import for Sequera workflow (#733) * fix: dashboard side menu item re added (#734) * fix: Dashboard side menu item re added * fix: api gateway urls in ci-cd pipeline build after migration (#737) * fix: workflow run name validation to allow numbers in health omics runs (#739) * fix: invite user to organization error (#743) * fix: show only worflows assigned to laboratory (#749) * fix: saved workflow parameters not pre filling form (#748) --------- Co-authored-by: Kevin Loftus <kevin.loftus@deptagency.com> * fix: organizations table org switch with context (#767) * fix: dialog component break word instead of all (#768) * fix: s3 bucket errors for past runs * docs: update migration docs for s3 retention * feat: add s3 refs script, fix s3 construct call * fix: add script to projen * fix: redirect to correct laboratory when org changed (#774) * chore: reset staging content to match main Co-authored-by: Cursor <cursoragent@cursor.com> * fix: workflow access bugs --------- Co-authored-by: Kevin Loftus <kevin.loftus@deptagency.com> Co-authored-by: Cursor <cursoragent@cursor.com> Co-authored-by: Nacho Nistal <ignacio.nistal@Nachos-MacBook-Pro.local>
Two related bugs in RAM-shared HealthOmics workflow handling: 1. GetWorkflow/ListWorkflowVersions/StartRun require an explicit workflowOwnerId for a workflow owned by another account - AWS never resolves a bare workflow id outside the caller's own account, even with IAM authorizing the call. None of read-private-workflow, list-workflow-versions, or create-run-execution passed it, so the Run Workflow stepper failed to load a shared-in workflow even after granting cross-account IAM access. Added resolveSharedWorkflowOwnerId (looked up via ListShares) with a retry-on-404 fallback in all three handlers. 2. ListWorkflows(type: PRIVATE) never includes cross-account RAM-shared workflows - only ListShares(resourceOwner: OTHER) surfaces those. list-private-workflows, which backs the lab dashboard's workflow list and New Run search, only called ListWorkflows, so a shared-in workflow could be shared, accepted, and enabled for a lab and still never appear where a user goes to run it. Merged in ListShares results, filtered through the same laboratory-workflow-access rules already applied to owned workflows. Also grants the new omics:ListShares calls in IAM (own-account /shares resource, no cross-account grant needed for that action). Verified against live AWS in both dev (851725267090) and qa (654654609030) accounts before and after the fix.
…smatch fix: HealthOmics AI Failure Analysis LLM key/model reuse across providers
…s-shared-workflow-cross-account-iam # Conflicts: # packages/back-end/src/app/controllers/aws-healthomics/run/create-run-execution.lambda.ts # packages/back-end/src/app/controllers/aws-healthomics/workflow/list-private-workflows.lambda.ts # packages/back-end/src/app/controllers/aws-healthomics/workflow/list-workflow-versions.lambda.ts # packages/back-end/src/app/controllers/aws-healthomics/workflow/read-private-workflow.lambda.ts # packages/back-end/src/app/utils/omics-shared-workflow-utils.ts # packages/back-end/src/infra/stacks/aws-healthomics-nested-stack.ts # packages/back-end/test/app/controllers/aws-healthomics/run/create-run-execution.lambda.test.ts # packages/back-end/test/app/controllers/aws-healthomics/workflow/list-workflow-versions.lambda.test.ts # packages/back-end/test/app/controllers/aws-healthomics/workflow/read-private-workflow.lambda.test.ts # packages/back-end/test/app/utils/omics-shared-workflow-utils.test.ts
Per review (kevin-loftus-dept): development's list-shared-workflows Lambda already surfaces cross-account RAM-shared workflows correctly (ACTIVE-only, access-filtered, tagged source: SHARED with ownerAccountId), and the front-end store already fetches it alongside list-private-workflows and dedupes with private winning. Merging shared workflows into list-private-workflows too made a shared-in workflow appear in the private response first, so the FE store's dedup claimed it as an untagged PRIVATE row before the correctly-tagged SHARED row was processed - stripping the Shared badge and ownerAccountId in EGLabView. Reverted list-private-workflows.lambda.ts to development's plain listAllPrivateWorkflows-only version, dropped the now-unused omics:ListShares IAM grant on that Lambda, and removed the corresponding test.
fix: stop spurious Seqera error toast when cancelling a run
Extends the cross-account shared-workflow IAM test coverage added for read-private-workflow, list-workflow-versions, and create-run-execution to also cover read-workflow-schema's GetWorkflow and ListShares grants (GitHub-fallback path).
…ss-account-iam fix: (EGV-294) cross-account HealthOmics shared workflow access (Run Workflow stepper)
feat: release v1.5
Co-authored-by: Cursor <cursoragent@cursor.com>
Intermediate waves now patch currently deployed templates instead of cdk deploying app code, include nested-stack tables, and share deploy-env/CFN helpers. Tests cover the wave loop, restore-on-failure path, and nested template discovery. GitHub OIDC session duration is 2 hours so multi-wave CI does not expire mid-rollout. Co-authored-by: Cursor <cursoragent@cursor.com>
fix: apply dynamodb gsi changes one index per stack update
sf-dept
self-requested a review
September 2, 2026 13:20
This file contains hidden or bidirectional Unicode text that may be interpreted or compiled differently than what appears below. To review, open the file in an editor that reveals hidden Unicode characters.
Learn more about bidirectional Unicode characters
Sign up for free
to join this conversation on GitHub.
Already have an account?
Sign in to comment
Add this suggestion to a batch that can be applied as a single commit.This suggestion is invalid because no changes were made to the code.Suggestions cannot be applied while the pull request is closed.Suggestions cannot be applied while viewing a subset of changes.Only one suggestion per line can be applied in a batch.Add this suggestion to a batch that can be applied as a single commit.Applying suggestions on deleted lines is not supported.You must change the existing code in this line in order to create a valid suggestion.Outdated suggestions cannot be applied.This suggestion has been applied or marked resolved.Suggestions cannot be applied from pending reviews.Suggestions cannot be applied on multi-line comments.Suggestions cannot be applied while the pull request is queued to merge.Suggestion cannot be applied right now. Please check back later.
🧬 Easy Genomics v1.5
✨ Summary of changes
📋 What's Changed
✨ Features
🐛 Fixes
🔒 Security
📚 Documentation
🧹 Chores, CI & Infrastructure
🎫 Release board tickets
ARCHITECTURE.mdinto the repositoryAlso shipping in v1.5 but not on the release board: EGV-164/166/168/169/170/171/172/173/174/175/176/177 (docs + OpenAPI foundation), EGV-179/182/198/199/200/203/215 (Data Collections), EGV-180/181 (AI failure analysis), EGV-212 (accessibility audit), EGV-217, EGV-219, EGV-221, EGV-222 (HealthOmics VPC networking), EGV-225 (run email notifications), EGV-259, and EGV-206/207/208 (security upgrades).
✅ Type of Change
🧪 Testing
Not verified on this release head. No code is authored in this PR — it promotes already-reviewed, already-merged branches. Verification to date is what each constituent PR carried, plus the
development/stagingpipeline runs.To verify before merging:
pnpm install && pnpm test, andpnpm lintper package, on the release head.pnpm run test-e2eagainst the deployed quality environment (Playwright; requires a deployed env, and now fails the run on any user-type failure rather than|| true-ing past it).📌 Notes for reviewers
CHANGELOG.mdhas nov1.5entry. Its only section is the[Unreleased] — Back-End API stack splitblock carried over from v1.4, which predates the three new DynamoDB tables, thedeploy-dynamodb-gsi-wavesdeploy step, and themigrate-laboratory-s3-access-seedhook. This should be written and the release tagged before/with the merge.git log main..stagingoverstates the change set, becausemainrecords releases as squashed commits (feat: release v1.4 (#772)) — pre-v1.4 merge commits therefore appear as "new". Thegit difffigures above are the accurate content delta, and the ticket mapping is built from that diff rather than the commit list.staginganddevelopmentare content-identical at this point (git diff origin/staging origin/developmentis empty); they differ only by one parallel merge commit of the same DynamoDB GSI fix (fix: apply dynamodb gsi changes one index per stack update #925 on staging, fix: apply dynamodb gsi changes one index per stack update #926 on development).☑️ Checklist
docs/tree,ERROR_HANDLING.md,docs/development/architecture.md,docs/getting-started/data-collections.md—CHANGELOG.mdstill needs its v1.5 entry)