Commit Graph
787 Commits
Author SHA1 Message Date
npub1223z34hd7vtwc6qj4s7flsxkj644nlre2nthu7lrrmkumhu3xddsrx9r6w fc25329420 test: drop screenshot suite (preview), keep gate-bypass infra
Per tho: don't add the screenshot test suite to this PR — it's not a
common path elsewhere yet, and the dedicated config / CI step / 12 PNGs
go with it.

Removed:
- desktop/playwright-screenshot.config.ts
- desktop/tests/e2e/screenshot-feature-flags.ts
- 12 screenshot PNGs under desktop/tests/e2e/screenshots/
- the Desktop screenshot e2e step from .github/workflows/ci.yml

Kept (genuine test infra, not a 'test addition' in tho's sense):
- bridge.ts seedPreviewFeatures option — preview features default-on in
  E2E so existing smoke specs (workflows.spec.ts etc.) can still reach
  preview-gated entry points
- tests/helpers/features.ts — single SoT for the seeding's preview ID
  list, derived from preview-features.json
- src/shared/features/resolveEnabled.test.mjs — unit coverage for code
  this PR added

Updated stale doc comment in bridge.ts that referenced the removed spec
by name.

Signed-off-by: npub1223z34hd7vtwc6qj4s7flsxkj644nlre2nthu7lrrmkumhu3xddsrx9r6w <52a228d6edf316ec6812ac3c9fc0d696ab59fc7954d77e7be31eedcddf91335b@sprout-oss.stage.blox.sqprod.co>
2026-06-08 17:03:13 -07:00
npub1223z34hd7vtwc6qj4s7flsxkj644nlre2nthu7lrrmkumhu3xddsrx9r6w e120d6dfaa refactor(features): preview-only manifest + screenshot CI wiring
Per tho's clarification, the manifest is preview-only by design — a bad
rebase had widened it to include stable entries with an explicit `tier`
field. Restoring the original shape:

- Rename `features.json` -> `preview-features.json` (loader, alias,
  ts-config, vite alias, test-loader-hooks, helpers, log strings).
- Drop the 4 stable entries from the manifest. Only the 4 preview
  features remain (workflows, projects, pulse, forum).
- Drop the `tier` field from the schema, types, and Zod validator —
  manifest membership is now sufficient ("in the file = preview;
  absent = stable, fail-open").
- Simplify `resolveEnabled(featureId, overrides)` — once you're inside
  it, the feature is preview by definition.
- `useFeatureEnabled`: in-manifest -> check overrides; otherwise return
  true (fail-open).
- `usePreviewFeatureWarning`: gate on manifest membership instead of
  `tier === 'preview'`.
- Settings: `ExperimentalFeaturesCard` lists every desktop feature in
  the manifest directly; SettingsView feature gate uses the new
  `resolveEnabled` signature.
- Tests: rewrote `resolveEnabled.test.mjs` for the new signature; helper
  drops the tier filter.

Per Marge's review on the previous push, `screenshot-feature-flags.ts`
was dropped from smoke testMatch but no CI step invoked the dedicated
screenshot config — coverage was dark. Adding a `Desktop screenshot e2e`
step in `.github/workflows/ci.yml` that runs `--config=
playwright-screenshot.config.ts` after the smoke step, restoring
coverage without dirtying smoke.

Signed-off-by: npub1223z34hd7vtwc6qj4s7flsxkj644nlre2nthu7lrrmkumhu3xddsrx9r6w <52a228d6edf316ec6812ac3c9fc0d696ab59fc7954d77e7be31eedcddf91335b@sprout-oss.stage.blox.sqprod.co>
2026-06-08 16:54:57 -07:00
npub1223z34hd7vtwc6qj4s7flsxkj644nlre2nthu7lrrmkumhu3xddsrx9r6w d9968a31d4 fix(features): flip useFeatureEnabled to fail-open for unknown ids
Per tho's call: manifest membership signals 'this needs gating'; absence
means 'just render it.' A stray <FeatureGate feature='removed-id'> should
not hide UI. Dev-mode console.warn stays so typos still surface during
development; only the resolution flips false -> true.

No call sites or tests asserted the old fail-closed behavior.

Signed-off-by: npub1223z34hd7vtwc6qj4s7flsxkj644nlre2nthu7lrrmkumhu3xddsrx9r6w <52a228d6edf316ec6812ac3c9fc0d696ab59fc7954d77e7be31eedcddf91335b@sprout-oss.stage.blox.sqprod.co>
2026-06-08 16:38:58 -07:00
npub1223z34hd7vtwc6qj4s7flsxkj644nlre2nthu7lrrmkumhu3xddsrx9r6w 5a0508ef21 fix(features): address Wes review (Zod, route warnings, version key)
- B1: real Zod manifest validation; on parse failure log + return empty
- C1: invert preview-route gating (Pulse, projects, workflows, forum
       post) — render screen and surface a sonner toast.warning via
       new usePreviewFeatureWarning hook so direct links still work
- C3: derive localStorage overrides key from manifest.version
- N1: replace stale 'avoids JSON.parse' comment with accurate
       reference-equality cache rationale
- N2: add cross-window 'storage' listener to mirror channel sections /
       stars / mutes / thread follows pattern
- N3: explicit getServerSnapshot returning '{}' for SSR/test safety
- N4: swap 'channels' for 'doctor' in resolveEnabled test (channels
       isn't in the manifest; doctor is stable)
- N5: drop screenshot-feature-flags from smoke testMatch — runs only
       under playwright-screenshot.config.ts now

Signed-off-by: npub1223z34hd7vtwc6qj4s7flsxkj644nlre2nthu7lrrmkumhu3xddsrx9r6w <52a228d6edf316ec6812ac3c9fc0d696ab59fc7954d77e7be31eedcddf91335b@sprout-oss.stage.blox.sqprod.co>
2026-06-08 16:34:22 -07:00
npub1223z34hd7vtwc6qj4s7flsxkj644nlre2nthu7lrrmkumhu3xddsrx9r6w ab7c11f0f5 refactor(sidebar): unwrap no-op managed-agents FeatureGate
managed-agents is tier: 'stable' in features.json, so the wrapper
always resolved to true — leftover from the original fail-open
blocker fix. Removed the wrapper, kept the SidebarMenuItem.

Biome + typecheck clean; agents.spec.ts, smoke.spec.ts, and the
screenshot-feature-flags suite all pass locally (27/27).

Signed-off-by: Taylor Ho <taylorkmho@gmail.com>
Signed-off-by: npub1223z34hd7vtwc6qj4s7flsxkj644nlre2nthu7lrrmkumhu3xddsrx9r6w <52a228d6edf316ec6812ac3c9fc0d696ab59fc7954d77e7be31eedcddf91335b@sprout-oss.stage.blox.sqprod.co>
2026-06-08 13:36:59 -07:00
npub1223z34hd7vtwc6qj4s7flsxkj644nlre2nthu7lrrmkumhu3xddsrx9r6wandTaylor Ho 0ca05eddc5 test(e2e): derive preview-feature list from features.json
Both the screenshot 'all on' test and the bridge mock seed were
hand-maintaining a parallel array of preview feature ids. tier
transitions (e.g. promoting huddles to stable) required updating
two places that the type system couldn't help us with.

Add tests/helpers/features.ts as a single source of truth that
imports /features.json directly and filters tier === 'preview'.
The 'all on' test now loops over PREVIEW_FEATURE_IDS, and bridge.ts
re-uses the same constant for its localStorage seeding.

12/12 screenshot-feature-flags tests pass locally.

Signed-off-by: npub1223z34hd7vtwc6qj4s7flsxkj644nlre2nthu7lrrmkumhu3xddsrx9r6w <52a228d6edf316ec6812ac3c9fc0d696ab59fc7954d77e7be31eedcddf91335b@sprout-oss.stage.blox.sqprod.co>
Signed-off-by: Taylor Ho <taylorkmho@gmail.com>
2026-06-08 13:02:59 -07:00
npub1223z34hd7vtwc6qj4s7flsxkj644nlre2nthu7lrrmkumhu3xddsrx9r6wandTaylor Ho 0c5c43d591 fix: auto-seed preview features in E2E mock bridge
CI was failing 16 smoke tests (workflows.spec, channels.spec, smoke.spec,
file-attachment.spec) because preview-gated UI (workflows, forum, pulse,
projects) didn't render in mock-bridge tests. Tests clicked testIDs that
were behind <FeatureGate>, timing out.

- bridge.ts: seed sprout-feature-overrides-v1 in localStorage with all
  preview feature IDs enabled by default via addInitScript. New
  seedPreviewFeatures option (default true) opts out for specs that
  exercise the toggle UI itself.
- screenshot-feature-flags.ts: pass seedPreviewFeatures: false so the
  Experiments toggle flow still drives each feature on via the UI.

59/59 affected smoke tests passing locally.

Signed-off-by: Taylor Ho <taylorkmho@gmail.com>
2026-06-08 13:02:59 -07:00
Taylor Ho dcd558910d fix: promote Huddles back to stable — remove all gating
- Remove huddles entry from features.json (stable = no manifest entry)
- Unwrap FeatureGate wrappers in AppShell.tsx and ChannelMembersBar.tsx
- Remove unused FeatureGate imports
- Remove huddles screenshot test and view-huddles.png
- Remove huddles toggle from 'all on' test (now 4 features)

12/12 E2E tests passing.

Signed-off-by: Taylor Ho <taylorkmho@gmail.com>
2026-06-08 13:02:59 -07:00
Taylor Ho 80b0838f3b fix: rename to Experiments, add body title, fix formatting
- Rename sidebar label from 'Experimental' to 'Experiments'
- Add h2 title in main body to match other settings panels
- Fix biome formatting: collapse FeatureGate JSX, expand sections array

Signed-off-by: Taylor Ho <taylorkmho@gmail.com>
2026-06-08 13:02:59 -07:00
Taylor Ho 09ddabc8cb fix: move Experiments into App nav group in settings sidebar
Signed-off-by: Taylor Ho <taylorkmho@gmail.com>
2026-06-08 13:02:59 -07:00
Taylor Ho e923241e2e feat: promote mesh-compute to stable (remove from preview list)
Signed-off-by: Taylor Ho <taylorkmho@gmail.com>
2026-06-08 13:02:59 -07:00
Taylor Ho 7194016d48 fix: regenerate E2E screenshots for 2-tier feature system
- Rewrote screenshot-feature-flags.ts: removed stale 'unstable' tier
  references (relay-members, identity-archive), updated close button
  selector to settings-back-to-app
- Deleted all old screenshots + feature-flags-tour/ artifacts
- Regenerated 13 fresh screenshots matching current UI
- Added Experiments nav group to SettingsView (was defined but missing
  from settingsNavGroups)
- Registered test in playwright.config.ts smoke project

Signed-off-by: Taylor Ho <taylorkmho@gmail.com>
2026-06-08 13:02:58 -07:00
Taylor Ho 185d94db61 fix: gate huddles UI behind feature flag
- Wrap HuddleIndicator in ChannelMembersBar with FeatureGate
- Wrap HuddleBar in AppShell with FeatureGate
- Keep HuddleProvider in place (useHuddle called unconditionally elsewhere)
- Huddles now properly hidden when preview toggle is off

Signed-off-by: Taylor Ho <taylorkmho@gmail.com>
2026-06-08 13:02:58 -07:00
Taylor Ho 3cf8c38484 refactor: remove unstable tier, simplify to stable/preview only
- Remove 'unstable' from FeatureTier type and resolveEnabled logic
- Remove identity-archive and relay-members from manifest (stable, permission-gated)
- Move mesh-compute to preview tier
- Flatten ExperimentalFeaturesCard to simple list (no disclosure/badges)
- Fix semantic HTML: replace <label> with <div> + aria-labelledby
- Remove featureGate from relay-members settings (role-gated only)
- Remove unstable tier tests

Signed-off-by: Taylor Ho <taylorkmho@gmail.com>
2026-06-08 13:02:58 -07:00
Taylor Ho 92064820f9 feat: flatten experimental settings into single list with unstable disclosure
- Rename tab label from 'Preview & Unstable' to 'Experimental'
- Show preview features as a flat list (no section heading)
- Add collapsible disclosure button at bottom to reveal unstable features
- Unstable rows get a warning badge; otherwise visually identical to preview rows
- Collapsed/expanded state is local (not persisted)

Signed-off-by: Taylor Ho <taylorkmho@gmail.com>
2026-06-08 13:02:58 -07:00
Taylor Ho a5ea4ce7b3 refactor: rename tiers to stable/preview/unstable, remove dev-build gate
Signed-off-by: Taylor Ho <taylorkmho@gmail.com>
2026-06-08 13:02:58 -07:00
Taylor Ho 8af3aa17e3 feat: gate pulse behind experimental feature flag
Signed-off-by: Taylor Ho <taylorkmho@gmail.com>
2026-06-08 13:02:58 -07:00
Taylor Ho cef9fbde0a feat: promote custom-emoji to stable
Signed-off-by: Taylor Ho <taylorkmho@gmail.com>
2026-06-08 13:02:58 -07:00
Taylor Ho ba3da8aa46 feat: gate forum channels behind experimental feature flag
Signed-off-by: Taylor Ho <taylorkmho@gmail.com>
2026-06-08 13:02:58 -07:00
Taylor Ho 876191c36f feat: promote managed-agents, channel-templates, doctor to stable
Signed-off-by: Taylor Ho <taylorkmho@gmail.com>
2026-06-08 13:02:58 -07:00
Taylor Ho 6096318861 refactor: remove feature flags migration — experimental features are opt-in only
Signed-off-by: Taylor Ho <taylorkmho@gmail.com>
2026-06-08 13:02:58 -07:00
Taylor Ho eadd698f23 fix: only seed experimental features for existing users
Detect existing installs via prior localStorage keys (sprout-theme,
sprout-workspaces). New installs get clean opt-in; existing users
keep features they were already using.

Signed-off-by: Taylor Ho <taylorkmho@gmail.com>
2026-06-08 13:02:58 -07:00
Taylor Ho 5a58fd2b4a fix: address review feedback — migration, reactivity, standards, tests
1. Migration: existing users auto-seed experimental features as enabled
   on first load (no feature loss on upgrade). New installs get opt-in UX.
2. Reactivity: SettingsView uses useFeatureSnapshot() so section list
   updates instantly when toggles change (fixes stale useMemo deps).
3. Standards: Switch component replaces raw checkboxes, data-testid on
   every toggle (feature-toggle-{id}, feature-toggle-dev-global).
4. Tests: 11 unit tests for resolveEnabled covering all tiers + edge cases.
5. Architecture: @features-manifest Vite alias replaces fragile ../../../../
   relative import. Test loader also resolves the alias.
6. Versioned localStorage: keys now use -v1 suffix aligned to manifest version.
7. Cache: JSON.parse result cached across hook instances per render cycle.
8. Dev warning: console.warn in dev when getFeature() returns undefined.

Signed-off-by: Taylor Ho <taylorkmho@gmail.com>
2026-06-08 13:02:58 -07:00
Taylor Ho eb155c973f feat: add feature flags system with tiered gating
- Add features.json manifest at repo root (single source of truth)
- Implement useFeatureEnabled hook + FeatureGate component
- Add ExperimentalFeaturesCard settings panel with opt-in toggles
- Gate sidebar items: managed-agents, projects, workflows
- Gate settings sections via featureGate descriptor field
- Three tiers: stable (always on), experimental (opt-in), dev (dev-only)
- Global 'Show developer features' toggle for dev tier suppression
- localStorage persistence for user overrides
- Designed for Flutter consumption (JSON manifest, platforms field)

Signed-off-by: Taylor Ho <taylorkmho@gmail.com>
2026-06-08 13:02:58 -07:00
klopez4212andGitHub dd08f988de Animate reaction counts (#904) 2026-06-08 10:47:24 -07:00
10b6674bd7 Mobile custom emoji + settings redesign (#906)
Signed-off-by: Wes <wesbillman@users.noreply.github.com>
Co-authored-by: Brain <21994759fc7a6fa6b965551d35cfd7897d262f2495467f2d78694ddcfa6a5c7e@sprout-oss.stage.blox.sqprod.co>
Co-authored-by: Pinky <44b8e82baa6e0e254e0208d68f335c283c94e7b78dd1fa10d5a49d3f13dd0435@sprout-oss.stage.blox.sqprod.co>
2026-06-08 10:28:32 -07:00
732e23dd5c Renew TTL when unarchiving ephemeral channels (#902)
Signed-off-by: npub1mprnacetjua2xx3p5eddmhxyk6wv929ymm5py8kd2xfxurxahspqqlgyta <d8473ee32b973aa31a21a65adddcc4b69cc2a8a4dee8121ecd51926e0cddbc02@sprout-oss.stage.blox.sqprod.co>
Co-authored-by: npub1mprnacetjua2xx3p5eddmhxyk6wv929ymm5py8kd2xfxurxahspqqlgyta <d8473ee32b973aa31a21a65adddcc4b69cc2a8a4dee8121ecd51926e0cddbc02@sprout-oss.stage.blox.sqprod.co>
2026-06-08 12:43:39 -04:00
WesandGitHub d8278f7588 chore(release): release version 0.3.13 (#903) v0.3.13 2026-06-08 09:36:16 -07:00
klopez4212andGitHub ecca5e77e4 Collapse channel header actions (#901) 2026-06-08 16:18:11 +00:00
4ec7f8125e sprout-agent: make Databricks defaults env-only (#868)
Signed-off-by: Wes <wesbillman@users.noreply.github.com>
Co-authored-by: Pinky <44b8e82baa6e0e254e0208d68f335c283c94e7b78dd1fa10d5a49d3f13dd0435@sprout-oss.stage.blox.sqprod.co>
2026-06-08 09:17:30 -07:00
klopez4212andGitHub b384354e2b Restyle settings sections (#894) 2026-06-08 14:59:26 +00:00
klopez4212andGitHub fdcbb696fe Add emoji reaction particles (#890) 2026-06-08 07:37:47 -07:00
klopez4212andGitHub 32039b9a25 Move settings into the app shell (#893) 2026-06-08 07:23:11 -07:00
klopez4212andGitHub 45f3dfe5ba Tune chat text sizing (#891) 2026-06-08 07:13:22 -07:00
klopez4212andGitHub 29f6ccf9e9 Style channel header navigation (#889) 2026-06-08 07:03:06 -07:00
tlongwell-blockandGitHub 2ebe551741 fix: rename missed known_acp_provider_exact → known_acp_runtime_exact (#900) 2026-06-08 09:29:12 -04:00
renovate[bot]GitHubrenovate[bot] <29139614+renovate[bot]@users.noreply.github.com>
97bdb79ded chore(deps): update radix-ui-primitives monorepo (#898)
Co-authored-by: renovate[bot] <29139614+renovate[bot]@users.noreply.github.com>
2026-06-07 22:32:11 -04:00
renovate[bot]GitHubrenovate[bot] <29139614+renovate[bot]@users.noreply.github.com>
4a93100e19 chore(deps): update actions/checkout digest to df4cb1c (#897)
Co-authored-by: renovate[bot] <29139614+renovate[bot]@users.noreply.github.com>
2026-06-07 22:31:08 -04:00
Will PflegerandGitHub 0a6067ca1b refactor: rename ACP "provider" to "runtime" across the codebase (#783) 2026-06-07 14:40:59 -04:00
klopez4212andGitHub 056b87d3da Unify avatar radius (#892) 2026-06-07 09:41:15 -04:00
WesandGitHub 9bbb85b439 chore(release): release version 0.3.12 (#886) v0.3.12 2026-06-05 21:17:01 +00:00
1b7b6978fc Show hover cards for inline message emoji (#885)
Signed-off-by: Wes <wesbillman@users.noreply.github.com>
Co-authored-by: Pinky <44b8e82baa6e0e254e0208d68f335c283c94e7b78dd1fa10d5a49d3f13dd0435@sprout-oss.stage.blox.sqprod.co>
2026-06-05 14:01:06 -07:00
5268fac2d8 Fix monotonic read-state merges (#884)
Signed-off-by: Wes <wesbillman@users.noreply.github.com>
Co-authored-by: Pinky <44b8e82baa6e0e254e0208d68f335c283c94e7b78dd1fa10d5a49d3f13dd0435@sprout-oss.stage.blox.sqprod.co>
2026-06-05 14:00:50 -07:00
klopez4212andGitHub 0a4783c6f8 Refine sidebar behavior and borders (#869) 2026-06-05 14:00:37 -07:00
Will PflegerandGitHub 5d7c748969 fix(presence): clear on disconnect, fix heartbeat/TTL, drop broken REST path (#877) 2026-06-05 13:28:00 -07:00
Will PflegerandGitHub ef98ae942a fix(cli): publish ephemeral events over WebSocket via sprout-ws-client (#876) 2026-06-05 16:26:30 -04:00
Will PflegerandGitHub 2f50011bdd docs(sprout-acp): add communication discipline rules to base prompt + deprecate --mention flag (#883) 2026-06-05 15:52:05 -04:00
klopez4212andGitHub 5c2476a71e Polish thread summaries and reactions (#881) 2026-06-05 20:50:19 +01:00
Will PflegerandGitHub 7129cd6f23 feat(cli): add emoji export and import subcommands (#882) 2026-06-05 15:33:31 -04:00
klopez4212andGitHub b84f8e6a01 Polish message row hover states (#880) 2026-06-05 20:32:35 +01:00