Michael Neale
4c49c8f521
Merge remote-tracking branch 'origin/main' into micn/serverless-mode
...
* origin/main: (36 commits)
fix: use immutable commit-SHA URLs in screenshot PR comments (#842 )
feat(mobile+desktop): two-tier Slack-style app icon badge (#802 )
chore: simplify file-size check to a flat 1000-line limit (#839 )
fix(desktop): robust emoji picker — unify picker + fix custom emoji in editing, status, reactions (#837 )
feat(desktop): reusable screenshot workflow for agents (#826 )
desktop(mesh-llm): let a serving node route a different model (#833 )
chore(release): release version 0.3.9 (#832 )
fix: native arbitrary-file download + image context-menu flash (#830 )
fix(desktop): custom emoji reaction rendering + picker autofocus (#831 )
Mesh-LLM v1: relay-gated direct-iroh inference between users (WAN) (#822 )
chore(release): release version 0.3.8 (#829 )
chore(release): release version 0.3.7 (#825 )
feat: code block rendering, syntax highlighting, and compose fixes (#803 )
feat: custom emoji — user-owned NIP-30 sets with a client-side union (#816 )
Install sprout-cli skill at repo root + fix desktop clippy (#818 )
fix(desktop): use public re-export path for ensure_client_node_for_model (#824 )
refactor(desktop): feature-gate mesh-llm-sdk behind optional Cargo feature (#823 )
fix(desktop): align workflow read/save commands to the frontend contract (#820 )
fix(desktop): disable mesh-llm auto-build to prevent git config corruption (#819 )
fix(desktop): clear clippy lints in agents/mesh_llm commands (#817 )
...
# Conflicts:
# Cargo.lock
# desktop/scripts/check-file-sizes.mjs
# desktop/src-tauri/Cargo.toml
# desktop/src/app/AppShell.tsx
# desktop/src/app/AppTopChrome.tsx
# desktop/src/features/messages/hooks.ts
# desktop/src/features/workspaces/useWorkspaceInit.ts
# desktop/src/shared/api/tauri.ts
2026-06-04 15:08:56 +10:00
33cfc85293
Mesh-LLM v1: relay-gated direct-iroh inference between users (WAN) ( #822 )
...
Signed-off-by: Eva <011987e296fd5006292d2f930b574be47c7801048d1983c46c425d3c95f0cffd@sprout-oss.stage.blox.sqprod.co >
Co-authored-by: npub1qyvc0c5kl4gqv2fd97fsk46tu378sqgy35vc83rvgfwne90sel7s0ed67d <011987e296fd5006292d2f930b574be47c7801048d1983c46c425d3c95f0cffd@sprout-oss.stage.blox.sqprod.co >
Co-authored-by: npub1t2tgm7d8f995uqvmnm8h88sg3wnpp9a5xysjf6dg3tjmgt3ltulqdp8ehr <5a968df9a7494b4e019b9ecf739e088ba61097b4312124e9a88ae5b42e3f5f3e@sprout-oss.stage.blox.sqprod.co >
Co-authored-by: Max <d8473ee32b973aa31a21a65adddcc4b69cc2a8a4dee8121ecd51926e0cddbc02@sprout-oss.stage.blox.sqprod.co >
2026-06-03 10:49:09 -04:00
tlongwell-block and GitHub
ede8ddb425
Sprout × mesh-llm: in-process mesh node (serve/consume) + relay admission ( #798 )
2026-06-02 10:28:20 -04:00
Michael Neale
191de54143
docs(serverless): document multi-relay, agents, and NIP-17 encryption
2026-06-02 10:33:00 +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
bd93649cba
docs(nips): add profile-attestation owner path to NIP-IA ( #732 )
...
Signed-off-by: Tyler Longwell <109685178+tlongwell-block@users.noreply.github.com >
Co-authored-by: npub1qyvc0c5kl4gqv2fd97fsk46tu378sqgy35vc83rvgfwne90sel7s0ed67d <011987e296fd5006292d2f930b574be47c7801048d1983c46c425d3c95f0cffd@sprout-oss.stage.blox.sqprod.co >
Co-authored-by: Max (sprout agent) <d8473ee32b973aa31a21a65adddcc4b69cc2a8a4dee8121ecd51926e0cddbc02@sprout-oss.stage.blox.sqprod.co >
2026-05-22 22:30:26 -04:00
8bc94413eb
feat(relay/git): git on Sprout, S3-backed ( #726 )
...
Signed-off-by: tlongwell-block <109685178+tlongwell-block@users.noreply.github.com >
Co-authored-by: Dawn <c6237ef84fa537c78dcee78efd2d4e59f728859c7f194da42ac51ededfa0be05@users.noreply.sprout >
Co-authored-by: Sami <sami@users.noreply.sprout >
Co-authored-by: Quinn <quinn@users.noreply.sprout >
Co-authored-by: Mari <95cae996907d7cab9f5dbf43c0f53edeac6ab0b032a6feae4abfd784e467b3f5@users.noreply.sprout >
Co-authored-by: Eva <eva@users.noreply.sprout >
Co-authored-by: Tyler Longwell <tyler@block.xyz >
2026-05-22 15:05:07 -04:00
741c09d9fe
docs(nips): add NIP-IA identity archival ( #713 )
...
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 >
Co-authored-by: Dawn (sprout agent) <c6237ef84fa537c78dcee78efd2d4e59f728859c7f194da42ac51ededfa0be05@sprout-oss.stage.blox.sqprod.co >
Co-authored-by: Quinn (sprout agent) <96f056ad5f2305c8ddf637dc65d048aa4c12d7daeb8867690e34fca46b0ef64c@sprout-oss.stage.blox.sqprod.co >
Co-authored-by: Mari (sprout agent) <95cae996907d7cab9f5dbf43c0f53edeac6ab0b032a6feae4abfd784e467b3f5@sprout-oss.stage.blox.sqprod.co >
2026-05-21 23:46:07 -04:00
3467a67b2a
docs: formal spec + machine-checked proof for git refs over object storage ( #721 )
...
Signed-off-by: tlongwell-block <109685178+tlongwell-block@users.noreply.github.com >
Co-authored-by: Eva (sprout agent) <18234bd709ff00c47a3b66f001675bd14c07700d862ed61c21a4423dcc1d9687@sprout-oss.stage.blox.sqprod.co >
2026-05-21 23:43:46 -04:00
bda98da771
docs(nips): NIP-AE — Agent Engrams ( #575 )
...
Signed-off-by: Tyler Longwell <109685178+tlongwell-block@users.noreply.github.com >
Co-authored-by: Dawn <c6237ef84fa537c78dcee78efd2d4e59f728859c7f194da42ac51ededfa0be05@sprout-oss.stage.blox.sqprod.co >
2026-05-14 12:10:56 -04:00
tlongwell-block and GitHub
082414bf3f
feat: sprout-agent + sprout-dev-mcp — minimal ACP coding agent ( #493 )
2026-05-10 22:33:58 -04:00
tlongwell-block and GitHub
d57e03f315
NIP-AA: Agent Authentication via NIP-OA Credentials ( #465 )
2026-05-03 15:36:26 -04:00
tlongwell-block and GitHub
1487ce6252
docs(nips): NIP-GS — Git Object Signing with Nostr Keys ( #455 )
2026-05-02 15:20:46 -04:00
Wes and GitHub
e0fdeb2ff5
[codex] clean up root docs and assets ( #445 )
2026-05-01 15:58:06 +00:00
fcec10547d
Route ACP observer traffic over relay ( #421 )
...
Signed-off-by: Tyler Longwell <tlongwell@squareup.com >
Co-authored-by: tlongwell-block <109685178+tlongwell-block@users.noreply.github.com >
Co-authored-by: Tyler Longwell <tlongwell@squareup.com >
2026-04-30 09:34:37 -04:00