757998cb03
feat(desktop): add NIP-ER reminder UI — create, view, and manage encrypted reminders
...
Implements the desktop client UI for kind:30300 event reminders (NIP-ER):
- Service layer (reminderService.ts): create, complete, snooze, and cancel
reminders as individual parameterized-replaceable events with NIP-44
encrypt-to-self. Each reminder has a random d-tag, not_before timestamp,
and encrypted content containing the target message reference and optional
note.
- "Remind me later" action: new menu item in MessageActionBar opens a dialog
with time presets (30min, 1hr, 3hr, tomorrow 9am, next Monday 9am) and an
optional note field.
- Reminders panel: accessible from sidebar (Bell icon), shows pending
reminders grouped by due status (overdue/today/upcoming) with
complete/snooze/cancel action buttons per row.
- Due-detection: local 60-second interval checks not_before against
Date.now() and fires toast notifications when reminders become due.
No relay scheduler dependency for v1 — purely client-side.
- RemindMeLaterProvider context avoids prop-threading through 4 intermediate
components; MessageRow uses the hook directly.
All reminder content is NIP-44 encrypted — never stored or transmitted in
plaintext. Completed/cancelled reminders get jittered 30-90 day expiration
tags for eventual relay-side cleanup.
Co-authored-by: Will Pfleger <pfleger.will@gmail.com >
Signed-off-by: Will Pfleger <pfleger.will@gmail.com >
2026-06-11 15:32:26 -04:00
275ad4be4a
feat(relay): add NIP-ER push scheduler, ingest relaxation, and NIP-11 advertisement
...
The relay now proactively delivers due reminders via Redis pub/sub.
Cross-pod dedup uses an atomic delivered_at claim (mirrors the reaper's
archived_at guard). Ingest relaxed to allow kind:30300 without
not_before (bookmarks/terminal states). max_not_before_delta enforced
to prevent unbounded-future scheduling abuse.
Schema: nullable not_before + delivered_at columns on events, partial
index for scheduler queries. NIP-11: supported_extensions ["nip-er"],
due_delivery_mode "push", max_not_before_delta advertised.
Spec (NIP-ER.md) amended: not_before optional on kind:30300, required
only for pending reminders that may become due.
Co-authored-by: Will Pfleger <pfleger.will@gmail.com >
Signed-off-by: Will Pfleger <pfleger.will@gmail.com >
2026-06-11 15:31:10 -04:00
Will Pfleger
f319f2fae5
style: fix formatting in e2e_event_reminder.rs
2026-06-11 15:25:04 -04:00
84b0dadee3
fix(relay): relax not_before to optional, add d-tag validation
...
The spec requires not_before on pending reminders only — terminal states
(done/cancelled) and bookmarks omit it. The validator incorrectly
required exactly one not_before on all kind:30300 events, blocking the
entire completion/cancellation lifecycle.
Also adds d-tag structure validation per spec: reject zero, empty, or
duplicate d tags.
Co-authored-by: Will Pfleger <will@pfleger.dev >
Signed-off-by: Will Pfleger <will@pfleger.dev >
2026-06-11 15:10:01 -04:00
0b3bed62bf
feat(relay): implement NIP-ER event reminder support (kind:30300)
...
Adds relay-side support for NIP-ER encrypted event reminders:
Write path (ingest):
- Register KIND_EVENT_REMINDER (30300) as parameterized replaceable,
global-only, and UsersWrite-scoped
- Validate not_before tag: exactly one, decimal digits only, no leading
zeros, range 0..=MAX_SAFE_INTEGER
- Reject expiration <= not_before when both are present and parseable
Read path (REQ/COUNT/bridge):
- AUTHOR_ONLY_KINDS array gates visibility — only the authenticated
event author may read kind:30300 events
- Exclusive author-only filters (kinds:[30300]) require authors=[self]
or get CLOSED/403
- Mixed-kind filters pass the gate but per-event filtering silently
omits other authors' reminders
- COUNT fast path disabled when author-only kinds are in play to
prevent leaking aggregate counts
Integration tests (e2e_event_reminder.rs):
- Write validation: valid, missing, duplicate, malformed not_before;
expiration ordering; edge cases (0, MAX_SAFE_INTEGER)
- Read filtering: author self-query, cross-user rejection (HTTP 403
and WS CLOSED), mixed-kind omission, replacement semantics
Signed-off-by: npub1mn7jgtj4w2pd0g0zeuhxsa6jy6p0rewxz4kujt98my82ahfmp72sxjexk7 <dcfd242e557282d7a1e2cf2e6877522682f1e5c6156dc92ca7d90eaedd3b0f95@sprout-oss.stage.blox.sqprod.co >
Co-authored-by: Will Pfleger <wpfleger@squareup.com >
Signed-off-by: Will Pfleger <wpfleger@squareup.com >
2026-06-11 15:10:01 -04:00
Will Pfleger and GitHub
a101fd6ad3
chore(justfile): build git-credential-nostr in dev and staging recipes ( #980 )
...
Signed-off-by: Will Pfleger <wpfleger@block.xyz >
2026-06-11 14:53:36 -04:00
Wes and GitHub
824c55114e
Fix Buzz command migration for saved agents ( #979 )
2026-06-11 11:27:58 -07:00
63738139ba
fix(desktop): resolve effective model and prompt from persona in display path ( #972 )
...
Signed-off-by: Will Pfleger <pfleger.will@gmail.com >
Co-authored-by: npub1mn7jgtj4w2pd0g0zeuhxsa6jy6p0rewxz4kujt98my82ahfmp72sxjexk7 <dcfd242e557282d7a1e2cf2e6877522682f1e5c6156dc92ca7d90eaedd3b0f95@sprout-oss.stage.blox.sqprod.co >
2026-06-11 13:29:38 -04:00
1bb8b8d547
docs: clean up remaining Buzz references ( #977 )
...
Signed-off-by: Wes <wesbillman@users.noreply.github.com >
Co-authored-by: Pinky <44b8e82baa6e0e254e0208d68f335c283c94e7b78dd1fa10d5a49d3f13dd0435@sprout-oss.stage.blox.sqprod.co >
2026-06-11 10:22:14 -07:00
Wes and GitHub
9242b91f00
chore(release): release version 0.3.17 ( #976 )
v0.3.17
2026-06-11 10:10:34 -07:00
tlongwell-block and GitHub
e4a0824c6a
fix(onboarding): skip onboarding when relay already has a profile ( #973 )
2026-06-11 13:09:43 -04:00
79bcee55cb
docs: finish Buzz rename cleanup ( #974 )
...
Signed-off-by: Wes <wesbillman@users.noreply.github.com >
Co-authored-by: Pinky <44b8e82baa6e0e254e0208d68f335c283c94e7b78dd1fa10d5a49d3f13dd0435@sprout-oss.stage.blox.sqprod.co >
2026-06-11 09:28:18 -07:00
6f3733d43b
fix(desktop): let channel members bypass mention agent gate ( #965 )
...
Co-authored-by: Claude Opus 4.7 (1M context) <noreply@anthropic.com >
2026-06-11 09:21:07 -07:00
8f580f308c
Rename desktop app to Buzz ( #960 )
...
Signed-off-by: Wes <wesbillman@users.noreply.github.com >
Co-authored-by: Pinky <44b8e82baa6e0e254e0208d68f335c283c94e7b78dd1fa10d5a49d3f13dd0435@sprout-oss.stage.blox.sqprod.co >
2026-06-11 15:06:24 +00:00
dcb2639b35
feat(desktop): open profile panel from MembersSidebar rows ( #962 )
...
Co-authored-by: Claude Opus 4.7 (1M context) <noreply@anthropic.com >
2026-06-11 07:42:24 -07:00
4e4dc723e4
feat(desktop): per-event notification sounds and alert controls ( #968 )
...
Co-authored-by: Claude Opus 4.7 (1M context) <noreply@anthropic.com >
2026-06-11 07:31:19 -07:00
1ca16c898c
fix(desktop): make header chrome zoom-correct and tidy split-pane ( #941 )
...
Signed-off-by: Taylor Ho <taylorkmho@gmail.com >
Co-authored-by: npub1223z34hd7vtwc6qj4s7flsxkj644nlre2nthu7lrrmkumhu3xddsrx9r6w <52a228d6edf316ec6812ac3c9fc0d696ab59fc7954d77e7be31eedcddf91335b@sprout-oss.stage.blox.sqprod.co >
Co-authored-by: Claude Fable 5 <noreply@anthropic.com >
2026-06-11 07:27:23 -07:00
tlongwell-block and GitHub
8c8312932a
fix(desktop): rename SPROUT_ env vars to BUZZ_ for child agent processes ( #971 )
2026-06-11 10:13:52 -04:00
31b0665cff
fix(justfile): complete buzz rename in dev and staging recipes ( #966 )
...
Co-authored-by: Claude Opus 4.7 (1M context) <noreply@anthropic.com >
2026-06-11 01:06:29 -07:00
d99ad131f1
refactor: rename sprout backend to buzz ( #958 )
...
Signed-off-by: Will Pfleger <pfleger.will@gmail.com >
Signed-off-by: Will Pfleger <wpfleger@block.xyz >
Signed-off-by: Will Pfleger <wpfleger@squareup.com >
Signed-off-by: Will Pfleger <wpfleger96@gmail.com >
Co-authored-by: npub1mn7jgtj4w2pd0g0zeuhxsa6jy6p0rewxz4kujt98my82ahfmp72sxjexk7 <dcfd242e557282d7a1e2cf2e6877522682f1e5c6156dc92ca7d90eaedd3b0f95@sprout-oss.stage.blox.sqprod.co >
Co-authored-by: npub1fgdl5qqnh3k3f2xkqrvt7cujalhm623x4s7fdjdj5yrtp5fzjl9qrjpucw <4a1bfa0013bc6d14a8d600d8bf6392efefbd2a26ac3c96c9b2a106b0d12297ca@sprout-oss.stage.blox.sqprod.co >
Co-authored-by: npub16v54tttfqacx9ycvc3k0ut0npj564ahcuajzy6qjvh57ntmsf4uq4806j2 <d32955ad69077062930cc46cfe2df30ca9aaf6f8e76422681265e9e9af704d78@sprout-oss.stage.blox.sqprod.co >
Co-authored-by: Will Pfleger <wpfleger96@gmail.com >
2026-06-10 19:29:51 -04:00
53e3f09485
fix(desktop): reap orphaned agent processes across instances ( #954 )
...
Signed-off-by: npub1mn7jgtj4w2pd0g0zeuhxsa6jy6p0rewxz4kujt98my82ahfmp72sxjexk7 <dcfd242e557282d7a1e2cf2e6877522682f1e5c6156dc92ca7d90eaedd3b0f95@sprout-oss.stage.blox.sqprod.co >
Signed-off-by: Will Pfleger <pfleger.will@gmail.com >
Co-authored-by: npub1mn7jgtj4w2pd0g0zeuhxsa6jy6p0rewxz4kujt98my82ahfmp72sxjexk7 <dcfd242e557282d7a1e2cf2e6877522682f1e5c6156dc92ca7d90eaedd3b0f95@sprout-oss.stage.blox.sqprod.co >
2026-06-10 17:38:39 -04:00
c5a54dcc39
Rename web app to Buzz ( #959 )
...
Signed-off-by: Wes <wesbillman@users.noreply.github.com >
Co-authored-by: Pinky <44b8e82baa6e0e254e0208d68f335c283c94e7b78dd1fa10d5a49d3f13dd0435@sprout-oss.stage.blox.sqprod.co >
2026-06-10 21:07:02 +00:00
510009c11d
fix(desktop): allow restarting saved relay-mesh agents from the UI ( #956 )
...
Signed-off-by: npub1qyvc0c5kl4gqv2fd97fsk46tu378sqgy35vc83rvgfwne90sel7s0ed67d <011987e296fd5006292d2f930b574be47c7801048d1983c46c425d3c95f0cffd@sprout-oss.stage.blox.sqprod.co >
Co-authored-by: npub1qyvc0c5kl4gqv2fd97fsk46tu378sqgy35vc83rvgfwne90sel7s0ed67d <011987e296fd5006292d2f930b574be47c7801048d1983c46c425d3c95f0cffd@sprout-oss.stage.blox.sqprod.co >
2026-06-10 16:56:02 -04:00
60c8c5036a
feat(acp): agent timeout resilience — idle margin, tool-call reset, death notices, keepalive ( #935 )
...
Signed-off-by: Will Pfleger <pfleger.will@gmail.com >
Co-authored-by: npub1mn7jgtj4w2pd0g0zeuhxsa6jy6p0rewxz4kujt98my82ahfmp72sxjexk7 <dcfd242e557282d7a1e2cf2e6877522682f1e5c6156dc92ca7d90eaedd3b0f95@sprout-oss.stage.blox.sqprod.co >
Co-authored-by: npub16v54tttfqacx9ycvc3k0ut0npj564ahcuajzy6qjvh57ntmsf4uq4806j2 <d32955ad69077062930cc46cfe2df30ca9aaf6f8e76422681265e9e9af704d78@sprout-oss.stage.blox.sqprod.co >
2026-06-10 16:54:16 -04:00
c63e018b05
Rename mobile app to Buzz ( #955 )
...
Signed-off-by: Wes <wesbillman@users.noreply.github.com >
Co-authored-by: Pinky <44b8e82baa6e0e254e0208d68f335c283c94e7b78dd1fa10d5a49d3f13dd0435@sprout-oss.stage.blox.sqprod.co >
2026-06-10 13:38:11 -07:00
929cc8861e
fix(desktop): repair team-persona mismatch and deduplicate legacy imports ( #949 )
...
Signed-off-by: Will Pfleger <pfleger.will@gmail.com >
Co-authored-by: npub1mn7jgtj4w2pd0g0zeuhxsa6jy6p0rewxz4kujt98my82ahfmp72sxjexk7 <dcfd242e557282d7a1e2cf2e6877522682f1e5c6156dc92ca7d90eaedd3b0f95@sprout-oss.stage.blox.sqprod.co >
2026-06-10 15:47:36 -04:00
b792aa4704
fix(desktop): populate last_message_at in channel browser ( #951 )
...
Signed-off-by: Will Pfleger <wpfleger@squareup.com >
Co-authored-by: npub1mn7jgtj4w2pd0g0zeuhxsa6jy6p0rewxz4kujt98my82ahfmp72sxjexk7 <dcfd242e557282d7a1e2cf2e6877522682f1e5c6156dc92ca7d90eaedd3b0f95@sprout-oss.stage.blox.sqprod.co >
2026-06-10 12:23:44 -07:00
klopez4212 and GitHub
e5f0c32648
Kit/circular avatars ( #927 )
2026-06-10 19:53:45 +01:00
dbe973dacd
fix(relay): accept mesh signaling kinds (24620/24621) via POST /events ( #946 )
...
Signed-off-by: npub1qyvc0c5kl4gqv2fd97fsk46tu378sqgy35vc83rvgfwne90sel7s0ed67d <011987e296fd5006292d2f930b574be47c7801048d1983c46c425d3c95f0cffd@sprout-oss.stage.blox.sqprod.co >
Co-authored-by: npub1qyvc0c5kl4gqv2fd97fsk46tu378sqgy35vc83rvgfwne90sel7s0ed67d <011987e296fd5006292d2f930b574be47c7801048d1983c46c425d3c95f0cffd@sprout-oss.stage.blox.sqprod.co >
2026-06-10 14:51:38 -04:00
f49cdcdd30
feat(sprout-dev-mcp): add read_file tool and replace_all to str_replace ( #928 )
...
Co-authored-by: Will Pfleger <wpfleger@block.xyz >
Signed-off-by: Will Pfleger <wpfleger@block.xyz >
Co-authored-by: npub16v54tttfqacx9ycvc3k0ut0npj564ahcuajzy6qjvh57ntmsf4uq4806j2 <d32955ad69077062930cc46cfe2df30ca9aaf6f8e76422681265e9e9af704d78@sprout-oss.stage.blox.sqprod.co >
2026-06-10 17:28:53 +00:00
Will Pfleger and GitHub
c28d14f460
chore(release): release version 0.3.16 ( #943 )
v0.3.16
2026-06-10 13:04:14 -04:00
34c8bdab1a
fix(desktop): land live presence updates for not-yet-cached pubkeys ( #947 )
...
Signed-off-by: Wes <wesbillman@users.noreply.github.com >
Co-authored-by: Brain <21994759fc7a6fa6b965551d35cfd7897d262f2495467f2d78694ddcfa6a5c7e@sprout-oss.stage.blox.sqprod.co >
2026-06-10 16:58:12 +00:00
Will Pfleger and GitHub
5c0af0bc93
fix(release): make just release idempotent for re-runs ( #948 )
2026-06-10 12:50:18 -04:00
klopez4212 and GitHub
e9cd1c3926
Improve mentions for agents + people ( #942 )
2026-06-10 17:40:53 +01:00
384eb6cba4
feat: agent memory viewer (read-only) in profile panel ( #917 )
...
Signed-off-by: Taylor Ho <taylorkmho@gmail.com >
Co-authored-by: npub1223z34hd7vtwc6qj4s7flsxkj644nlre2nthu7lrrmkumhu3xddsrx9r6w <52a228d6edf316ec6812ac3c9fc0d696ab59fc7954d77e7be31eedcddf91335b@sprout-oss.stage.blox.sqprod.co >
Co-authored-by: Bart Simpson <bart@sprout.local >
2026-06-10 08:32:38 -07:00
2dc466fe0b
Fix channel visibility controls ( #940 )
...
Signed-off-by: Wes <wesbillman@users.noreply.github.com >
Co-authored-by: Pinky <44b8e82baa6e0e254e0208d68f335c283c94e7b78dd1fa10d5a49d3f13dd0435@sprout-oss.stage.blox.sqprod.co >
2026-06-10 07:46:43 -07:00
3e56331e9c
fix(delete): make agent-deleted messages disappear from desktop UI immediately ( #918 )
...
Signed-off-by: Taylor Ho <taylorkmho@gmail.com >
Co-authored-by: Bart <bart@sprout.local >
2026-06-09 23:02:13 -07:00
e08937cdde
Fix emoji message rendering ( #938 )
...
Signed-off-by: Wes <wesbillman@users.noreply.github.com >
Co-authored-by: Pinky <44b8e82baa6e0e254e0208d68f335c283c94e7b78dd1fa10d5a49d3f13dd0435@sprout-oss.stage.blox.sqprod.co >
2026-06-09 20:52:37 -07:00
Will Pfleger and GitHub
ba2fdbf697
refactor(desktop): consolidate packs into teams ( #852 )
2026-06-09 23:22:34 -04:00
tlongwell-block and GitHub
384a34ec31
Update README.md wording
2026-06-09 22:37:36 -04:00
fe14daa5d6
Fix post-compact handoff context for OpenAI providers ( #931 )
...
Signed-off-by: npub1t2tgm7d8f995uqvmnm8h88sg3wnpp9a5xysjf6dg3tjmgt3ltulqdp8ehr <5a968df9a7494b4e019b9ecf739e088ba61097b4312124e9a88ae5b42e3f5f3e@sprout-oss.stage.blox.sqprod.co >
Co-authored-by: npub1t2tgm7d8f995uqvmnm8h88sg3wnpp9a5xysjf6dg3tjmgt3ltulqdp8ehr <5a968df9a7494b4e019b9ecf739e088ba61097b4312124e9a88ae5b42e3f5f3e@sprout-oss.stage.blox.sqprod.co >
2026-06-09 21:56:54 -04:00
Wes and GitHub
98aa535935
chore(release): release version 0.3.15 ( #936 )
v0.3.15
2026-06-09 18:02:31 -07:00
877048d68f
fix: persona is source of truth at spawn + thread-depth conventions ( #930 )
...
Signed-off-by: Wes <wesbillman@users.noreply.github.com >
Signed-off-by: npub1mn7jgtj4w2pd0g0zeuhxsa6jy6p0rewxz4kujt98my82ahfmp72sxjexk7 <dcfd242e557282d7a1e2cf2e6877522682f1e5c6156dc92ca7d90eaedd3b0f95@sprout-oss.stage.blox.sqprod.co >
Co-authored-by: Brain <21994759fc7a6fa6b965551d35cfd7897d262f2495467f2d78694ddcfa6a5c7e@sprout-oss.stage.blox.sqprod.co >
Co-authored-by: npub1mn7jgtj4w2pd0g0zeuhxsa6jy6p0rewxz4kujt98my82ahfmp72sxjexk7 <dcfd242e557282d7a1e2cf2e6877522682f1e5c6156dc92ca7d90eaedd3b0f95@sprout-oss.stage.blox.sqprod.co >
2026-06-09 23:58:45 +00:00
73cd8d082d
fix: skip avatar reconciliation for legacy agent records ( #933 )
...
Signed-off-by: npub1mn7jgtj4w2pd0g0zeuhxsa6jy6p0rewxz4kujt98my82ahfmp72sxjexk7 <dcfd242e557282d7a1e2cf2e6877522682f1e5c6156dc92ca7d90eaedd3b0f95@sprout-oss.stage.blox.sqprod.co >
Signed-off-by: npub1fgdl5qqnh3k3f2xkqrvt7cujalhm623x4s7fdjdj5yrtp5fzjl9qrjpucw <4a1bfa0013bc6d14a8d600d8bf6392efefbd2a26ac3c96c9b2a106b0d12297ca@sprout-oss.stage.blox.sqprod.co >
Co-authored-by: npub1fgdl5qqnh3k3f2xkqrvt7cujalhm623x4s7fdjdj5yrtp5fzjl9qrjpucw <4a1bfa0013bc6d14a8d600d8bf6392efefbd2a26ac3c96c9b2a106b0d12297ca@sprout-oss.stage.blox.sqprod.co >
2026-06-09 19:52:11 -04:00
165b9f7a5f
feat(desktop): add nest commit identity guidance with human sign-off ( #929 )
...
Signed-off-by: npub1fgdl5qqnh3k3f2xkqrvt7cujalhm623x4s7fdjdj5yrtp5fzjl9qrjpucw <4a1bfa0013bc6d14a8d600d8bf6392efefbd2a26ac3c96c9b2a106b0d12297ca@sprout-oss.stage.blox.sqprod.co >
Signed-off-by: Will Pfleger <wpfleger@squareup.com >
Signed-off-by: Will Pfleger <pfleger.will@gmail.com >
Co-authored-by: npub1fgdl5qqnh3k3f2xkqrvt7cujalhm623x4s7fdjdj5yrtp5fzjl9qrjpucw <4a1bfa0013bc6d14a8d600d8bf6392efefbd2a26ac3c96c9b2a106b0d12297ca@sprout-oss.stage.blox.sqprod.co >
Co-authored-by: npub1mn7jgtj4w2pd0g0zeuhxsa6jy6p0rewxz4kujt98my82ahfmp72sxjexk7 <dcfd242e557282d7a1e2cf2e6877522682f1e5c6156dc92ca7d90eaedd3b0f95@sprout-oss.stage.blox.sqprod.co >
2026-06-09 18:46:55 -04:00
Will Pfleger and GitHub
9a98e60fc2
feat: provider/model selection for personas and runtime-aware env injection ( #794 )
2026-06-09 20:42:27 +00:00
762a45969a
fix: reconcile agent profile on startup when relay publish was missed ( #921 )
...
Signed-off-by: npub1mn7jgtj4w2pd0g0zeuhxsa6jy6p0rewxz4kujt98my82ahfmp72sxjexk7 <dcfd242e557282d7a1e2cf2e6877522682f1e5c6156dc92ca7d90eaedd3b0f95@sprout-oss.stage.blox.sqprod.co >
Co-authored-by: npub1mn7jgtj4w2pd0g0zeuhxsa6jy6p0rewxz4kujt98my82ahfmp72sxjexk7 <dcfd242e557282d7a1e2cf2e6877522682f1e5c6156dc92ca7d90eaedd3b0f95@sprout-oss.stage.blox.sqprod.co >
2026-06-09 15:05:42 -04:00
klopez4212 and GitHub
5d927aba0c
Revamp first-run onboarding ( #924 )
2026-06-09 19:47:52 +01:00
klopez4212 and GitHub
f362650195
Update setup loading screen ( #926 )
2026-06-09 18:27:54 +01:00
c38301bca5
fix(dm): keep hidden DMs hidden across refetch via relay-signed visibility snapshot (NIP-DV) ( #857 )
...
Signed-off-by: Wes <wesbillman@users.noreply.github.com >
Signed-off-by: npub1qyvc0c5kl4gqv2fd97fsk46tu378sqgy35vc83rvgfwne90sel7s0ed67d <011987e296fd5006292d2f930b574be47c7801048d1983c46c425d3c95f0cffd@sprout-oss.stage.blox.sqprod.co >
Co-authored-by: Brain <21994759fc7a6fa6b965551d35cfd7897d262f2495467f2d78694ddcfa6a5c7e@sprout-oss.stage.blox.sqprod.co >
Co-authored-by: npub1qyvc0c5kl4gqv2fd97fsk46tu378sqgy35vc83rvgfwne90sel7s0ed67d <011987e296fd5006292d2f930b574be47c7801048d1983c46c425d3c95f0cffd@sprout-oss.stage.blox.sqprod.co >
2026-06-09 10:23:57 -07:00