Skip to content

OUT-4015: gate Client Home Actions dropdown on app install published status - #231

Merged
SandipBajracharya merged 4 commits into
mainfrom
OUT-4015
Aug 4, 2026
Merged

OUT-4015: gate Client Home Actions dropdown on app install published status#231
SandipBajracharya merged 4 commits into
mainfrom
OUT-4015

Conversation

@SandipBajracharya

Copy link
Copy Markdown
Collaborator

Changes

  • Add an AppInstallStatus enum (draft / published) and expose the new status field on AppInstallsDataSchema — surfaced on the /installs endpoint by POR-21837.
  • Gate InstalledAppsService.getActionableInstalls() on status !== AppInstallStatus.DRAFT, so app-builder draft apps no longer appear in the Client Home "Your Actions" dropdown. This is the single choke point feeding both the client-facing card and the editor's Actions toggle list, so drafts drop off both surfaces.
  • Denylist semantics: only an explicit draft status is hidden; missing/null status is treated as non-draft and shown (avoids regressing installs without a status).

Testing Criteria

  • Loom walkthrough — pending
  • Added tests/unit/installed-apps.service.test.ts covering:
    • draft installs are hidden and their notification-settings endpoint is never called
    • a published install with a registered action label is shown
    • only explicit drafts are hidden — undefined/null status is shown (denylist)
    • a published install without a complete action label is excluded
  • pnpm vitest run tests/unit → 28 passed · pnpm typecheck clean · pnpm lint clean.

Notes

  • Depends on POR-21837 (backend, merged) which adds status to the app-install model / installs endpoint. Frontend should not deploy ahead of that backend change.
  • Worth confirming with backend/QA that status is populated for non-app-builder installs (legacy marketplace/native Studio apps) as well, not just newly created app-builder installs.

Impact & Surface Area of Change

  • Affects only the "Your Actions" list on Client Home (client preview card + editor Actions toggle), both fed by GET /api/installed-apps. Built-in rows (Invoices, Contracts, Tasks, Forms) are unaffected.
  • status is parsed via a strict z.enum on the whole installs array — a future third status value would fail the list parse; only draft/published exist today.

SandipBajracharya and others added 4 commits August 4, 2026 16:12
Add an AppInstallStatus enum (draft/published) and expose the new `status`
field on AppInstallsDataSchema, surfaced by the /installs endpoint via POR-21837.

Co-Authored-By: Claude Opus 4.8 <noreply@anthropic.com>
Only surface installs with status = published in getActionableInstalls, the
single choke point feeding both the client "Your Actions" card and the editor
Actions toggle list. App-builder drafts no longer appear until published.

Co-Authored-By: Claude Opus 4.8 <noreply@anthropic.com>
Assert getActionableInstalls hides only explicit drafts while missing/null
status is treated as non-draft and shown, matching the status != draft gate.

Co-Authored-By: Claude Opus 4.8 <noreply@anthropic.com>
@linear-code

linear-code Bot commented Aug 4, 2026

Copy link
Copy Markdown

OUT-4015

@SandipBajracharya SandipBajracharya changed the title feat(OUT-4015): gate Client Home Actions dropdown on app install published status OUT-4015: gate Client Home Actions dropdown on app install published status Aug 4, 2026
@greptile-apps

greptile-apps Bot commented Aug 4, 2026

Copy link
Copy Markdown

Greptile Summary

Adds the app-install publication status to the frontend schema and excludes explicit app-builder drafts from actionable installs before notification settings are fetched.

  • Defines AppInstallStatus and parses nullable or missing statuses.
  • Applies denylist filtering at the shared actionable-installs service.
  • Adds unit coverage for draft, published, nullish-status, and incomplete-label cases.

Confidence Score: 5/5

The PR appears safe to merge, with the new draft gate consistently applied at the shared actionable-installs boundary.

The schema accepts the documented current statuses and preserves legacy nullish values, while the combined lifecycle checks exclude drafts before notification settings are fetched; the added tests exercise the principal filtering paths.

Important Files Changed

Filename Overview
src/features/installed-apps/lib/installed-apps.service.ts Adds an explicit draft-status exclusion to the existing actionable-install filter before per-install notification requests.
src/lib/assembly/types.ts Defines the two supported install lifecycle statuses and adds a nullish status field to the response schema.
tests/unit/installed-apps.service.test.ts Covers draft exclusion, published inclusion, denylist handling of nullish statuses, request fan-out, and action-label validation.

Flowchart

%%{init: {'theme': 'neutral'}}%%
flowchart LR
    A[GET installs] --> B[Parse install status]
    B --> C{Eligible and not draft?}
    C -- No --> D[Exclude install]
    C -- Yes --> E[Fetch notification settings]
    E --> F{Complete action label?}
    F -- No --> D
    F -- Yes --> G[Return in Your Actions]
Loading

Reviews (1): Last reviewed commit: "test(OUT-4015): cover non-draft install ..." | Re-trigger Greptile

!install.isInternalApp,
!install.isInternalApp &&
// show non drafts apps in the action dropdown.
install.status !== AppInstallStatus.DRAFT,

Copy link
Copy Markdown
Collaborator

Choose a reason for hiding this comment

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

maybe install.status === AppINstallStatus.PUBLISHED is better?

@priosshrsth priosshrsth left a comment

Copy link
Copy Markdown
Collaborator

Choose a reason for hiding this comment

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

lgtm

@SandipBajracharya
SandipBajracharya merged commit 44eda19 into main Aug 4, 2026
11 checks passed
Sign up for free to join this conversation on GitHub. Already have an account? Sign in to comment

Labels

None yet

Projects

None yet

Development

Successfully merging this pull request may close these issues.

2 participants