npub1mn7jgtj4w2pd0g0zeuhxsa6jy6p0rewxz4kujt98my82ahfmp72sxjexk7 and Will Pfleger
0b9eebcbee
feat(ci): add relay E2E testing job and persona event tests
...
The 184 ignored Rust E2E tests in sprout-test-client were never run in
CI — the relay only got exercised indirectly through Playwright. This
adds a dedicated relay-e2e job and shared infra script so relay protocol
correctness is tested directly.
Changes:
- scripts/start-relay-for-tests.sh: shared script that starts docker
compose services, waits for health, applies schema, builds and starts
the relay, and polls readiness. Used by both the new relay-e2e job and
the refactored desktop-e2e-integration job.
- .github/workflows/ci.yml: new relay-e2e job (triggers on crates/**
changes, ~5 min) that runs all ignored E2E tests against the relay.
desktop-e2e-integration refactored to use the shared script instead of
inline infra setup.
- crates/sprout-test-client/tests/e2e_persona.rs: 11 new E2E tests for
kind:30175 persona events covering publish+query, NIP-33 replacement
semantics, d-tag validation (empty, missing, too long, uppercase,
special chars, underscore start), valid slug acceptance, and multiple
personas per author.
Co-authored-by: Will Pfleger <pfleger.will@gmail.com >
Signed-off-by: Will Pfleger <pfleger.will@gmail.com >
2026-06-10 19:54:53 -04:00
c95517812a
docs: add NIP-AP spec for kind:30175 persona events ( #950 )
...
Signed-off-by: npub16v54tttfqacx9ycvc3k0ut0npj564ahcuajzy6qjvh57ntmsf4uq4806j2 <d32955ad69077062930cc46cfe2df30ca9aaf6f8e76422681265e9e9af704d78@sprout-oss.stage.blox.sqprod.co >
Signed-off-by: Will Pfleger <pfleger.will@gmail.com >
Co-authored-by: npub16v54tttfqacx9ycvc3k0ut0npj564ahcuajzy6qjvh57ntmsf4uq4806j2 <d32955ad69077062930cc46cfe2df30ca9aaf6f8e76422681265e9e9af704d78@sprout-oss.stage.blox.sqprod.co >
2026-06-10 15:40:47 -04:00
npub1mn7jgtj4w2pd0g0zeuhxsa6jy6p0rewxz4kujt98my82ahfmp72sxjexk7 and Will Pfleger
56c68b2e35
fix(desktop): drop env_vars from public PersonaEventContent
...
The kind:30175 content body is published unencrypted, so carrying env_vars there leaked any secrets a persona held (API keys, tokens) in plaintext to every relay and reader. Per NIP-AP, persona events are public configuration; secrets travel only via the NIP-44-encrypted mem/persona engram. persona_from_event now returns an empty env_vars map; engram instantiation is the sole secret path.
Co-authored-by: Will Pfleger <pfleger.will@gmail.com >
Signed-off-by: Will Pfleger <pfleger.will@gmail.com >
2026-06-10 14:24:39 -04:00
npub1mn7jgtj4w2pd0g0zeuhxsa6jy6p0rewxz4kujt98my82ahfmp72sxjexk7 and Will Pfleger
632e736acd
fix(relay): validate kind:30175 persona d-tag slug grammar on ingest
...
A persona event with an empty or malformed d-tag would win NIP-33 replacement against the (pubkey, 30175, "") slot, collapsing every persona into one address and silently destroying data. The relay now rejects persona events at ingest unless they carry exactly one d tag matching the NIP-AP slug grammar ^[a-z0-9][a-z0-9_-]{0,63}$ (1-64 bytes). Mirrors the existing validate_engram_envelope gate so malformed events never reach storage.
Co-authored-by: Will Pfleger <pfleger.will@gmail.com >
Signed-off-by: Will Pfleger <pfleger.will@gmail.com >
2026-06-10 14:24:14 -04:00
npub1mn7jgtj4w2pd0g0zeuhxsa6jy6p0rewxz4kujt98my82ahfmp72sxjexk7 and Will Pfleger
a2e9c8c077
fix(desktop): sign every migrated persona event and drop the sentinel file
...
The persona-event migration stored synthetic placeholder events (zero
pubkey/sig, non-hex id) whenever signing keys were unavailable, producing
retention rows that fail event parsing and signature verification — the
read path would silently skip every such persona. It also tracked
idempotency with a migration_state.json sentinel that was written even on
partial failure and reset pending_sync on every boot if the write failed.
Migration now takes the owner's resolved Keys and runs after
resolve_persisted_identity, so every retained row is a real signed event;
the no-keys branch is gone. Idempotency keys on whether the retention
store already holds rows for the owner pubkey — the data is the sentinel.
Core logic is extracted into migrate_personas_in_dir for unit testing.
Co-authored-by: Will Pfleger <pfleger.will@gmail.com >
Signed-off-by: Will Pfleger <pfleger.will@gmail.com >
2026-06-10 10:27:44 -04:00
npub1mn7jgtj4w2pd0g0zeuhxsa6jy6p0rewxz4kujt98my82ahfmp72sxjexk7 and Will Pfleger
3c6cd9c3f0
feat(desktop): add persona event kind with client publish/read/retain
...
Implements the foundation for personas-as-events architecture:
- Define KIND_PERSONA (30175) as NIP-33 parameterized replaceable,
keyed by (pubkey, kind, d_tag) where d_tag is the plaintext persona
slug. Relay allowlists the kind under UsersWrite scope and marks it
global-only (never channel-scoped).
- Client-side serialization: PersonaRecord ↔ kind:30175 event with
JSON content body. Publish and fetch functions via relay HTTP API.
- SQLite retention store: local durable storage for persona events
enabling offline boot. INSERT OR REPLACE on (kind, pubkey, d_tag)
for NIP-33 latest-wins semantics. Pending-sync queue for deferred
relay publish.
- Migration: on first launch after upgrade, non-builtin personas from
personas.json are serialized as events and written to the retention
store with pending_sync=1. Idempotent via sentinel file. Runs after
the packs→teams migration.
The existing load_personas path is unchanged — retention-based loading
is wired up as a helper for PR 2 (instantiation flow) to activate.
Co-authored-by: Will Pfleger <pfleger.will@gmail.com >
Signed-off-by: Will Pfleger <pfleger.will@gmail.com >
2026-06-10 00:17:51 -04: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
klopez4212 and GitHub
4dfae61f24
Maximize desktop window on launch ( #925 )
2026-06-09 18:08:37 +01:00
Taylor Ho and GitHub
ae430d4dd9
feat: preview features (experiments settings UI) ( #888 )
...
Signed-off-by: Taylor Ho <taylorkmho@gmail.com >
Signed-off-by: npub1223z34hd7vtwc6qj4s7flsxkj644nlre2nthu7lrrmkumhu3xddsrx9r6w <52a228d6edf316ec6812ac3c9fc0d696ab59fc7954d77e7be31eedcddf91335b@sprout-oss.stage.blox.sqprod.co >
2026-06-09 09:53:09 -07:00
a357e220d8
fix(updater): send no-cache header on update check to avoid stale manifest ( #922 )
...
Signed-off-by: Wes <wesbillman@users.noreply.github.com >
Co-authored-by: Brain <21994759fc7a6fa6b965551d35cfd7897d262f2495467f2d78694ddcfa6a5c7e@sprout-oss.stage.blox.sqprod.co >
2026-06-09 09:52:49 -07:00
56230c1442
fix(desktop): refresh channel state after unarchive ( #923 )
...
Signed-off-by: Wes <wesbillman@users.noreply.github.com >
Co-authored-by: Brain <21994759fc7a6fa6b965551d35cfd7897d262f2495467f2d78694ddcfa6a5c7e@sprout-oss.stage.blox.sqprod.co >
2026-06-09 09:49:27 -07:00
7dd5b34536
Add channel visibility & ephemeral TTL controls to manage sidebar ( #911 )
...
Signed-off-by: Wes <wesbillman@users.noreply.github.com >
Co-authored-by: Brain <21994759fc7a6fa6b965551d35cfd7897d262f2495467f2d78694ddcfa6a5c7e@sprout-oss.stage.blox.sqprod.co >
2026-06-09 09:01:10 -07:00
tlongwell-block and GitHub
4b78fe3bea
ci(release): add Intel macOS (x86_64) DMG as a release target ( #748 )
...
Signed-off-by: tlongwell-block <109685178+tlongwell-block@users.noreply.github.com >
2026-06-09 11:52:41 -04:00
421593062f
mesh: Rust-owned coordinator — fix saved-agent reconnect flakiness + DRY the start path ( #879 )
...
Signed-off-by: npub1qyvc0c5kl4gqv2fd97fsk46tu378sqgy35vc83rvgfwne90sel7s0ed67d <011987e296fd5006292d2f930b574be47c7801048d1983c46c425d3c95f0cffd@sprout-oss.stage.blox.sqprod.co >
Signed-off-by: npub1mprnacetjua2xx3p5eddmhxyk6wv929ymm5py8kd2xfxurxahspqqlgyta <d8473ee32b973aa31a21a65adddcc4b69cc2a8a4dee8121ecd51926e0cddbc02@sprout-oss.stage.blox.sqprod.co >
Co-authored-by: npub1qyvc0c5kl4gqv2fd97fsk46tu378sqgy35vc83rvgfwne90sel7s0ed67d <011987e296fd5006292d2f930b574be47c7801048d1983c46c425d3c95f0cffd@sprout-oss.stage.blox.sqprod.co >
Co-authored-by: npub1mprnacetjua2xx3p5eddmhxyk6wv929ymm5py8kd2xfxurxahspqqlgyta <d8473ee32b973aa31a21a65adddcc4b69cc2a8a4dee8121ecd51926e0cddbc02@sprout-oss.stage.blox.sqprod.co >
2026-06-09 10:59:28 -04:00
Wes and GitHub
d099866ace
chore(release): release version 0.3.14 ( #916 )
v0.3.14
2026-06-09 07:43:02 -07:00
7b3012b777
docs: add NIP-ER event reminders ( #875 )
...
Signed-off-by: npub1mprnacetjua2xx3p5eddmhxyk6wv929ymm5py8kd2xfxurxahspqqlgyta <d8473ee32b973aa31a21a65adddcc4b69cc2a8a4dee8121ecd51926e0cddbc02@sprout-oss.stage.blox.sqprod.co >
Signed-off-by: npub1qyvc0c5kl4gqv2fd97fsk46tu378sqgy35vc83rvgfwne90sel7s0ed67d <011987e296fd5006292d2f930b574be47c7801048d1983c46c425d3c95f0cffd@sprout-oss.stage.blox.sqprod.co >
Co-authored-by: npub1mprnacetjua2xx3p5eddmhxyk6wv929ymm5py8kd2xfxurxahspqqlgyta <d8473ee32b973aa31a21a65adddcc4b69cc2a8a4dee8121ecd51926e0cddbc02@sprout-oss.stage.blox.sqprod.co >
Co-authored-by: npub1qyvc0c5kl4gqv2fd97fsk46tu378sqgy35vc83rvgfwne90sel7s0ed67d <011987e296fd5006292d2f930b574be47c7801048d1983c46c425d3c95f0cffd@sprout-oss.stage.blox.sqprod.co >
2026-06-09 10:02:54 -04:00
7b854971c6
feat(acp): pass slash commands through to ACP connectors ( #919 )
...
Signed-off-by: npub1qyvc0c5kl4gqv2fd97fsk46tu378sqgy35vc83rvgfwne90sel7s0ed67d <011987e296fd5006292d2f930b574be47c7801048d1983c46c425d3c95f0cffd@sprout-oss.stage.blox.sqprod.co >
Co-authored-by: npub1qyvc0c5kl4gqv2fd97fsk46tu378sqgy35vc83rvgfwne90sel7s0ed67d <011987e296fd5006292d2f930b574be47c7801048d1983c46c425d3c95f0cffd@sprout-oss.stage.blox.sqprod.co >
2026-06-09 10:02:21 -04:00
bfafdd46b2
fix(sdk): resolve multi-word display names and add NIP-27 nostr:npub mention extraction ( #905 )
...
Signed-off-by: npub1mn7jgtj4w2pd0g0zeuhxsa6jy6p0rewxz4kujt98my82ahfmp72sxjexk7 <dcfd242e557282d7a1e2cf2e6877522682f1e5c6156dc92ca7d90eaedd3b0f95@sprout-oss.stage.blox.sqprod.co >
Co-authored-by: npub1mn7jgtj4w2pd0g0zeuhxsa6jy6p0rewxz4kujt98my82ahfmp72sxjexk7 <dcfd242e557282d7a1e2cf2e6877522682f1e5c6156dc92ca7d90eaedd3b0f95@sprout-oss.stage.blox.sqprod.co >
2026-06-08 19:05:37 -04:00
15f610dcd5
fix(desktop): re-enable mcp_command reconciliation and harden spawn site ( #909 )
...
Signed-off-by: Wes <wesbillman@users.noreply.github.com >
Co-authored-by: Brain <21994759fc7a6fa6b965551d35cfd7897d262f2495467f2d78694ddcfa6a5c7e@sprout-oss.stage.blox.sqprod.co >
Co-authored-by: Duncan <dcfd242e557282d7a1e2cf2e6877522682f1e5c6156dc92ca7d90eaedd3b0f95@sprout-oss.stage.blox.sqprod.co >
2026-06-08 13:54:42 -07:00
klopez4212 and GitHub
da80c7340f
Fix desktop DM and sidebar UI polish ( #908 )
2026-06-08 21:04:20 +01:00
klopez4212 and GitHub
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
Wes and GitHub
d8278f7588
chore(release): release version 0.3.13 ( #903 )
v0.3.13
2026-06-08 09:36:16 -07:00
klopez4212 and GitHub
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
klopez4212 and GitHub
b384354e2b
Restyle settings sections ( #894 )
2026-06-08 14:59:26 +00:00
klopez4212 and GitHub
fdcbb696fe
Add emoji reaction particles ( #890 )
2026-06-08 07:37:47 -07:00
klopez4212 and GitHub
32039b9a25
Move settings into the app shell ( #893 )
2026-06-08 07:23:11 -07:00
klopez4212 and GitHub
45f3dfe5ba
Tune chat text sizing ( #891 )
2026-06-08 07:13:22 -07:00
klopez4212 and GitHub
29f6ccf9e9
Style channel header navigation ( #889 )
2026-06-08 07:03:06 -07:00
tlongwell-block and GitHub
2ebe551741
fix: rename missed known_acp_provider_exact → known_acp_runtime_exact ( #900 )
2026-06-08 09:29:12 -04:00
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
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 Pfleger and GitHub
0a6067ca1b
refactor: rename ACP "provider" to "runtime" across the codebase ( #783 )
2026-06-07 14:40:59 -04:00
klopez4212 and GitHub
056b87d3da
Unify avatar radius ( #892 )
2026-06-07 09:41:15 -04:00
Wes and GitHub
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