Michael Neale
fc832f4d5d
fix(serverless): membership via direct kind:39002 (join/leave/add/remove) + CLI channel ops
...
In serverless mode there's no relay to process membership command kinds
(9021 join, 9022 leave, 9000/9001 add/remove member). The client now mutates
the replaceable kind:39002 member-list event directly (read-modify-write).
- desktop: join/leave/add/remove_channel_member publish 39002 directly
- sprout-sdk: build_channel_metadata_serverless (39000) +
build_channel_members_serverless (39002), shared builders
- sprout-cli: channels create/join/leave/add-member/remove-member serverless
branches (fixes agent replies + CLI parity with desktop)
Verified end-to-end against wss://relay.damus.io: create -> list -> send ->
read all round-trip with zero Sprout infrastructure.
2026-06-02 08:33:06 +10:00
Michael Neale
84f84931f1
feat(serverless): run channels, DMs, messages, and agents against a generic Nostr relay
...
Adds a 'serverless' workspace mode that points the desktop app at any generic
public Nostr relay (e.g. wss://relay.damus.io) with zero Sprout server
infrastructure — no Postgres, no HTTP /query|/events bridge, no NIP-98 auth.
Reuses Sprout's native event kinds (39000 channel metadata, 39002 membership,
kind 9 messages, h-tag scoping); 'serverless' is purely a transport + auth
concern, so the server-mode path is untouched.
Transport: reads/writes go over plain WebSocket (REQ/EOSE, EVENT/OK) instead
of the HTTP bridge; NIP-42 AUTH is answered only if the relay challenges.
Desktop backend:
- AppState.serverless flag + is_serverless(); apply_workspace gains a flag
- ws_relay.rs: query_relay_ws / submit_event_ws / publish_signed_event_ws
- relay.rs: query_relay/submit_event + agent profile sync branch to WS
- events.rs: build_channel_metadata_serverless (39000) + members (39002)
- create_channel/open_dm publish those events directly (DM ids = UUIDv5 over
sorted participants so both sides converge without a server)
- managed agents inherit SPROUT_SERVERLESS into the ACP subprocess env
Agents (full support, not a follow-up):
- sprout-acp: RestClient + HarnessRelay gain serverless mode; query/submit use
plain WS, NIP-42 handshake skipped on (re)connect; SPROUT_SERVERLESS env/arg
- sprout-cli: SproutClient serverless WS query/submit; --serverless flag,
to_ws_url helper, NetworkMsg error variant
- npub respond-to permissions are in-process and work unchanged
Frontend:
- Workspace.mode + workspaceMode()/isServerlessWorkspace() helpers
- relayClient.setServerless() skips the AUTH-wait on connect; late challenges
still answered so writes succeed on relays that require auth
- ServerlessContext/useIsServerless() hides search, pulse, projects, workflows
- Serverless toggle in the Add Workspace dialog and Welcome screen
Docs: docs/SPROUT_LITE_MODE.md updated with the implementation + testing steps.
2026-06-01 20:42:29 +10:00
Will Pfleger and GitHub
2a03851527
refactor: consolidate infra management into justfile + add mobile-dev ( #797 )
2026-05-29 18:26:24 -04:00
6d50090c01
feat(cli): add channels search for human-readable channel lookup ( #712 )
...
Signed-off-by: tlongwell-block <109685178+tlongwell-block@users.noreply.github.com >
Co-authored-by: Dawn (sprout agent) <c6237ef84fa537c78dcee78efd2d4e59f728859c7f194da42ac51ededfa0be05@sprout-oss.stage.blox.sqprod.co >
2026-05-26 11:41:49 -04:00
tlongwell-block and GitHub
2a8b765c45
feat(notes): add --latest to notes get for ambiguous slugs ( #730 )
...
Signed-off-by: Tyler Longwell <109685178+tlongwell-block@users.noreply.github.com >
2026-05-22 21:16:48 -04:00
Will Pfleger and GitHub
a65b7fc06f
fix(deps): migrate nostr crate from 0.36 to 0.44 ( #708 )
2026-05-22 17:17:11 -04:00
8e26836015
Allow owners to read agent memories ( #727 )
...
Signed-off-by: Tyler Longwell <109685178+tlongwell-block@users.noreply.github.com >
Co-authored-by: Max (sprout agent) <d8473ee32b973aa31a21a65adddcc4b69cc2a8a4dee8121ecd51926e0cddbc02@sprout-oss.stage.blox.sqprod.co >
2026-05-22 16:52:02 -04:00
Will Pfleger and GitHub
6dcb04bcd9
Fix CLI output normalization and wrong Nostr kinds (MCP parity) ( #612 )
2026-05-22 10:32:20 -04:00
504cfea20d
feat: sprout notes NIP-23 long-form CLI + relay a-tag deletion ( #719 )
...
Signed-off-by: tlongwell-block <109685178+tlongwell-block@users.noreply.github.com >
Co-authored-by: Dawn (sprout agent) <c6237ef84fa537c78dcee78efd2d4e59f728859c7f194da42ac51ededfa0be05@sprout-oss.stage.blox.sqprod.co >
Co-authored-by: Max (sprout agent) <d8473ee32b973aa31a21a65adddcc4b69cc2a8a4dee8121ecd51926e0cddbc02@sprout-oss.stage.blox.sqprod.co >
Co-authored-by: Quinn (sprout agent) <96f056ad5f2305c8ddf637dc65d048aa4c12d7daeb8867690e34fca46b0ef64c@sprout-oss.stage.blox.sqprod.co >
2026-05-21 22:30:21 -04:00
c9dd97ba1a
feat(cli/mem): add mem patch, mem hash, and reject empty-stdin in mem set ( #627 )
...
Signed-off-by: tlongwell-block <109685178+tlongwell-block@users.noreply.github.com >
Co-authored-by: Dawn (sprout agent) <c6237ef84fa537c78dcee78efd2d4e59f728859c7f194da42ac51ededfa0be05@sprout-oss.stage.blox.sqprod.co >
2026-05-20 14:51:30 -04:00
23c8fa72c7
Add relay support for NIP-51 lists ( #616 )
...
Signed-off-by: Tyler Longwell <tlongwell@squareup.com >
Signed-off-by: tlongwell-block <109685178+tlongwell-block@users.noreply.github.com >
Co-authored-by: Dawn (sprout agent) <c6237ef84fa537c78dcee78efd2d4e59f728859c7f194da42ac51ededfa0be05@sprout-oss.stage.blox.sqprod.co >
2026-05-20 13:59:22 -04:00
2a69f285e7
cli(mem): clarify 'no memories' wording to note core is excluded ( #622 )
...
Signed-off-by: Tyler Longwell <109685178+tlongwell-block@users.noreply.github.com >
Co-authored-by: Dawn <dawn@sprout-agents.local >
2026-05-20 14:10:39 +00:00
c0c9cf9271
cli(messages): allow --content - to read body from stdin ( #624 )
...
Signed-off-by: Tyler Longwell <109685178+tlongwell-block@users.noreply.github.com >
Co-authored-by: Dawn (sprout agent) <c6237ef84fa537c78dcee78efd2d4e59f728859c7f194da42ac51ededfa0be05@sprout-oss.stage.blox.sqprod.co >
2026-05-20 02:38:17 +00:00
tlongwell-block and GitHub
24520aa2b1
NIP-AE: agent engrams (kind:30174) — core memory injection + sprout mem CLI ( #593 )
...
Signed-off-by: Tyler Longwell <tlongwell@squareup.com >
Signed-off-by: Tyler Longwell <109685178+tlongwell-block@users.noreply.github.com >
2026-05-19 13:16:37 -04:00
Will Pfleger and GitHub
1d8a130b32
refactor(cli): restructure flat commands into 12 subcommand groups ( #585 )
2026-05-14 19:13:49 -04:00
Will Pfleger and GitHub
01a3df7f1f
feat(sdk): add builder functions for workflows, DMs, and presence ( #589 )
2026-05-14 18:49:57 -04:00
1b87a0905f
refactor: extract shared @mention resolver into sprout-sdk ( #580 )
...
Signed-off-by: Tyler Longwell <109685178+tlongwell-block@users.noreply.github.com >
Co-authored-by: npub1cc3ha7z055mu0rwwu7806t2wt8mj3pvu0uv5mfp2c50dahaqhczshdalg6 <c6237ef84fa537c78dcee78efd2d4e59f728859c7f194da42ac51ededfa0be05@sprout-oss.stage.blox.sqprod.co >
Co-authored-by: Dawn <dawn@sprout.local >
2026-05-14 11:38:52 -04:00
tlongwell-block and GitHub
e427581ca3
fix(cli): derive thread root from parent event tags ( #564 )
...
Signed-off-by: tlongwell-block <109685178+tlongwell-block@users.noreply.github.com >
2026-05-13 09:54:43 -04:00
tlongwell-block and GitHub
6b4f9f05d4
cli: add display name lookup to get-users ( #543 )
2026-05-11 20:41:02 -04:00
tlongwell-block and GitHub
98030c526a
feat: Git repository management commands ( #533 )
2026-05-11 13:40:51 -04:00
tlongwell-block and GitHub
91f16e326f
feat: embed sprout CLI in dev-mcp, add NIP-OA auth tag support ( #525 )
2026-05-11 06:57:34 -04:00
0dcfa86f84
chore: remove dead API token references from GUI, docs, and config ( #498 )
...
Co-authored-by: Claude Opus 4.6 <noreply@anthropic.com >
2026-05-07 19:07:44 +00:00
tlongwell-block and GitHub
454781caae
Sprout speaks Nostr. Nothing else. ( #475 )
2026-05-05 12:03:06 -04:00
f23560d3d4
feat: Image & video uploads for MCP and CLI (Blossom protocol) ( #433 )
...
Co-authored-by: Tyler Longwell <tlongwell@block.xyz >
2026-04-30 14:35:02 -04:00
tlongwell-block and GitHub
d07385fe02
feat: Markdown-based persona packs (crate + ACP + desktop) ( #297 )
2026-04-11 13:32:14 -04:00
7a9218ba54
Update all non-major dependencies ( #248 )
...
Co-authored-by: renovate[bot] <29139614+renovate[bot]@users.noreply.github.com>
Co-authored-by: Wes <wesb@block.xyz >
2026-04-08 11:55:11 -07:00
tlongwell-block and GitHub
8bfce0975b
feat: social notes MCP + CLI tools (kind:1/kind:3) ( #268 )
2026-04-08 14:08:53 -04:00
tlongwell-block and GitHub
853ebe5bfd
feat: auto-resolve @mentions in MCP server and CLI ( #256 )
2026-04-07 12:57:33 -04:00
tlongwell-block and GitHub
b20d4596a9
feat(messages): add since parameter to get_messages API and MCP tool ( #154 )
2026-03-24 14:46:17 -04:00
tlongwell-block and GitHub
25ed2dcc23
feat: event-first refactor — unified ingest pipeline, SDK, client migrations ( #162 )
2026-03-24 13:38:36 -04:00
tlongwell-block and GitHub
4c9b8aae9c
feat: sprout-cli — agent-first CLI with full MCP parity (48 commands) ( #158 )
2026-03-21 21:23:32 -04:00