Commit graph

11353 commits

Author SHA1 Message Date
Anish Sarkar
e7bc4b191c
Merge pull request #2313 from AnishSarkar22/feat/studio-html-design
Some checks are pending
Desktop Tests / Changes (push) Waiting to run
Desktop Tests / Backend (macos-latest) (push) Blocked by required conditions
Desktop Tests / Backend (ubuntu-latest) (push) Blocked by required conditions
Desktop Tests / Backend (windows-latest) (push) Blocked by required conditions
Desktop Tests / Frontend (push) Blocked by required conditions
Desktop Tests / Electron (macos-latest) (push) Blocked by required conditions
Desktop Tests / Electron (ubuntu-latest) (push) Blocked by required conditions
Desktop Tests / Electron (windows-latest) (push) Blocked by required conditions
Desktop Tests / Desktop Gate (push) Blocked by required conditions
docs(proposals): web pages the model writes, for the agent and Studio
2026-10-21 19:21:18 +05:30
Anish Sarkar
fe791adef7 docs(proposals): web pages the model writes, for the agent and Studio
Proposes letting a model at the agent's bar write a web page as HTML,
through a new agent tool and skill and Studio's Web page button, run in
a viewer frame with no network. ADR 0066 records the decision.
2026-10-21 19:19:03 +05:30
Anish Sarkar
13f16c33e1
Merge pull request #2311 from AnishSarkar22/docs/plugin-submit-form-wording
Some checks are pending
Desktop Tests / Changes (push) Waiting to run
Desktop Tests / Backend (macos-latest) (push) Blocked by required conditions
Desktop Tests / Backend (ubuntu-latest) (push) Blocked by required conditions
Desktop Tests / Backend (windows-latest) (push) Blocked by required conditions
Desktop Tests / Frontend (push) Blocked by required conditions
Desktop Tests / Electron (macos-latest) (push) Blocked by required conditions
Desktop Tests / Electron (ubuntu-latest) (push) Blocked by required conditions
Desktop Tests / Electron (windows-latest) (push) Blocked by required conditions
Desktop Tests / Desktop Gate (push) Blocked by required conditions
Build and Push Docker Images / image_version (push) Waiting to run
Build and Push Docker Images / build (./docker/sandbox, cpu, ./docker/sandbox/Dockerfile, sandbox, surfsense-sandbox, ubuntu-24.04-arm, linux/arm64, arm64, , false, cpu) (push) Blocked by required conditions
Build and Push Docker Images / build (./docker/sandbox, cpu, ./docker/sandbox/Dockerfile, sandbox, surfsense-sandbox, ubuntu-latest, linux/amd64, amd64, , false, cpu) (push) Blocked by required conditions
Build and Push Docker Images / build (./surfsense_backend, cpu, ./surfsense_backend/Dockerfile, backend, surfsense-backend, ubuntu-24.04-arm, linux/arm64, arm64, , production, false, cpu) (push) Blocked by required conditions
Build and Push Docker Images / build (./surfsense_backend, cpu, ./surfsense_backend/Dockerfile, backend, surfsense-backend, ubuntu-latest, linux/amd64, amd64, , production, false, cpu) (push) Blocked by required conditions
Build and Push Docker Images / build (./surfsense_backend, cu126, ./surfsense_backend/Dockerfile, backend, surfsense-backend, ubuntu-24.04-arm, linux/arm64, arm64, -cuda126, production, true, cuda126) (push) Blocked by required conditions
Build and Push Docker Images / build (./surfsense_backend, cu126, ./surfsense_backend/Dockerfile, backend, surfsense-backend, ubuntu-latest, linux/amd64, amd64, -cuda126, production, true, cuda126) (push) Blocked by required conditions
Build and Push Docker Images / build (./surfsense_backend, cu128, ./surfsense_backend/Dockerfile, backend, surfsense-backend, ubuntu-24.04-arm, linux/arm64, arm64, -cuda, production, true, cuda) (push) Blocked by required conditions
Build and Push Docker Images / build (./surfsense_backend, cu128, ./surfsense_backend/Dockerfile, backend, surfsense-backend, ubuntu-latest, linux/amd64, amd64, -cuda, production, true, cuda) (push) Blocked by required conditions
Build and Push Docker Images / build (./surfsense_web, cpu, ./surfsense_web/Dockerfile, web, surfsense-web, ubuntu-24.04-arm, linux/arm64, arm64, , runner, false, cpu) (push) Blocked by required conditions
Build and Push Docker Images / build (./surfsense_web, cpu, ./surfsense_web/Dockerfile, web, surfsense-web, ubuntu-latest, linux/amd64, amd64, , runner, false, cpu) (push) Blocked by required conditions
Build and Push Docker Images / verify_digests (push) Blocked by required conditions
Build and Push Docker Images / create_manifest (backend, surfsense-backend, , cpu) (push) Blocked by required conditions
Build and Push Docker Images / create_manifest (backend, surfsense-backend, -cuda, cuda) (push) Blocked by required conditions
Build and Push Docker Images / create_manifest (backend, surfsense-backend, -cuda126, cuda126) (push) Blocked by required conditions
Build and Push Docker Images / create_manifest (sandbox, surfsense-sandbox, , cpu) (push) Blocked by required conditions
Build and Push Docker Images / create_manifest (web, surfsense-web, , cpu) (push) Blocked by required conditions
docs(registry): simpler plugin submission form
2026-10-21 17:36:24 +05:30
Anish Sarkar
fde61ef2fc
Merge pull request #2309 from AnishSarkar22/feat/web-plugin-pages
feat(web): a page for every plugin, replacing the scraper pages
2026-10-21 17:18:36 +05:30
Anish Sarkar
5c860bacdf feat(web): plainer plugin section subtitles, no Community label
The SurfSense and other-publisher sections get shorter subtitles, and a
plugin's page no longer names Community: only a verified plugin is
marked, as in the lists.

Co-Authored-By: Claude Opus 5.5 <noreply@anthropic.com>
2026-10-21 17:17:47 +05:30
Anish Sarkar
2744921607 feat(web): registry marks on taupe, bylines beside the plugin's name
A registry icon may be white, as DeepWiki's is, or black, so its tile is
taupe, readable against both, in place of a light grey that hid white
icons. A letter mark is white on it. Another publisher's byline sits with
the plugin's name and verified mark rather than at the row's far end.

Co-Authored-By: Claude Opus 5.5 <noreply@anthropic.com>
2026-10-21 17:14:37 +05:30
Anish Sarkar
4f132dea5f feat(web): list plugins as compact rows, keeping Featured as cards
Below Featured, each plugin is one row: its mark once, its name with the
verified mark, and one line, with a byline only for other publishers. A
plugin page's homepage and privacy links end in the app's external-link
arrow, and its header separators are Hugeicons' dot.

Co-Authored-By: Claude Opus 5.5 <noreply@anthropic.com>
2026-10-21 17:05:43 +05:30
Anish Sarkar
0eb0656a7b feat(web): a page for every plugin, replacing the scraper pages
Each listed plugin gets a page at /plugins/<id>, built from its list entry
as the app's plugin page is: about, tools and details. SurfSense's own come
from a copy of the app's first-party list, the registry's from the signed
list, so a newly listed plugin gets its page without a change here. Cards
open the page and show the name with the app's verified mark.

The per-scraper marketing pages and the [slug] route are removed. Their
addresses redirect permanently to the plugin's page, and /reddit and
/instagram, which the app does not list, to /plugins. Homepage components
no page imported are removed with them.

Co-Authored-By: Claude Opus 5.5 <noreply@anthropic.com>
2026-10-21 16:55:21 +05:30
Anish Sarkar
13008b4242 Merge remote-tracking branch 'upstream/dev' into docs/plugin-submit-form-wording 2026-10-21 16:37:31 +05:30
Anish Sarkar
3985083b3e
Merge pull request #2308 from AnishSarkar22/docs/changelog-v2.2.3
docs(changelog): v2.2.3
2026-10-21 16:36:56 +05:30
Anish Sarkar
807045fabd docs(registry): simpler plugin submission form
Say what servers the registry supports, drop the Inspector paragraph,
shorten the no-secrets box, and word the access choices as Free and Paid,
so a free account no longer reads as needing one sold by the publisher.
The intake's FREE and PAID match the new choices.

Co-Authored-By: Claude Opus 5.5 <noreply@anthropic.com>
2026-10-21 16:36:12 +05:30
Anish Sarkar
683ae7ebf7 docs(changelog): drop the Claude plan platform note from v2.2.3
Co-Authored-By: Claude Opus 5.5 <noreply@anthropic.com>
2026-10-21 16:23:34 +05:30
Anish Sarkar
dfae8b33f1 docs(changelog): v2.2.3
Co-Authored-By: Claude Opus 5.5 <noreply@anthropic.com>
2026-10-21 16:21:11 +05:30
Anish Sarkar
ed14a1df3d ci(registry): skip the signed plugin list in detect-secrets 2026-10-21 13:49:28 +05:30
Anish Sarkar
75a2352896 chore(local): release 2.2.3 2026-10-21 13:12:53 +05:30
Anish Sarkar
9fa4a388b6
Merge pull request #2306 from AnishSarkar22/ci/registry-submission-github-token
ci(registry): open submission pull requests with GITHUB_TOKEN and start their checks
2026-10-21 13:11:41 +05:30
Anish Sarkar
52da43d2b9 ci(registry): open submission pull requests with GITHUB_TOKEN and start their checks
The accept job no longer needs a personal token: it acts as github-actions[bot]
and runs plugins-registry.yml on the submission branch itself, live included.

Co-Authored-By: Claude Opus 5.5 <noreply@anthropic.com>
2026-10-21 13:09:44 +05:30
Anish Sarkar
54c27e6149
Merge pull request #2304 from AnishSarkar22/fix/homepage-buttons
Some checks are pending
Desktop Tests / Changes (push) Waiting to run
Desktop Tests / Backend (macos-latest) (push) Blocked by required conditions
Desktop Tests / Backend (ubuntu-latest) (push) Blocked by required conditions
Desktop Tests / Backend (windows-latest) (push) Blocked by required conditions
Desktop Tests / Frontend (push) Blocked by required conditions
Desktop Tests / Electron (macos-latest) (push) Blocked by required conditions
Desktop Tests / Electron (ubuntu-latest) (push) Blocked by required conditions
Desktop Tests / Electron (windows-latest) (push) Blocked by required conditions
Desktop Tests / Desktop Gate (push) Blocked by required conditions
Build and Push Docker Images / build (./surfsense_backend, cpu, ./surfsense_backend/Dockerfile, backend, surfsense-backend, ubuntu-latest, linux/amd64, amd64, , production, false, cpu) (push) Blocked by required conditions
Build and Push Docker Images / build (./surfsense_backend, cu126, ./surfsense_backend/Dockerfile, backend, surfsense-backend, ubuntu-latest, linux/amd64, amd64, -cuda126, production, true, cuda126) (push) Blocked by required conditions
Build and Push Docker Images / build (./surfsense_backend, cu128, ./surfsense_backend/Dockerfile, backend, surfsense-backend, ubuntu-24.04-arm, linux/arm64, arm64, -cuda, production, true, cuda) (push) Blocked by required conditions
Build and Push Docker Images / build (./surfsense_web, cpu, ./surfsense_web/Dockerfile, web, surfsense-web, ubuntu-24.04-arm, linux/arm64, arm64, , runner, false, cpu) (push) Blocked by required conditions
Build and Push Docker Images / image_version (push) Waiting to run
Build and Push Docker Images / verify_digests (push) Blocked by required conditions
Build and Push Docker Images / build (./surfsense_web, cpu, ./surfsense_web/Dockerfile, web, surfsense-web, ubuntu-latest, linux/amd64, amd64, , runner, false, cpu) (push) Blocked by required conditions
Build and Push Docker Images / build (./docker/sandbox, cpu, ./docker/sandbox/Dockerfile, sandbox, surfsense-sandbox, ubuntu-latest, linux/amd64, amd64, , false, cpu) (push) Blocked by required conditions
Build and Push Docker Images / build (./surfsense_backend, cpu, ./surfsense_backend/Dockerfile, backend, surfsense-backend, ubuntu-24.04-arm, linux/arm64, arm64, , production, false, cpu) (push) Blocked by required conditions
Build and Push Docker Images / build (./surfsense_backend, cu126, ./surfsense_backend/Dockerfile, backend, surfsense-backend, ubuntu-24.04-arm, linux/arm64, arm64, -cuda126, production, true, cuda126) (push) Blocked by required conditions
Build and Push Docker Images / build (./surfsense_backend, cu128, ./surfsense_backend/Dockerfile, backend, surfsense-backend, ubuntu-latest, linux/amd64, amd64, -cuda, production, true, cuda) (push) Blocked by required conditions
Build and Push Docker Images / build (./docker/sandbox, cpu, ./docker/sandbox/Dockerfile, sandbox, surfsense-sandbox, ubuntu-24.04-arm, linux/arm64, arm64, , false, cpu) (push) Blocked by required conditions
Build and Push Docker Images / create_manifest (backend, surfsense-backend, , cpu) (push) Blocked by required conditions
Build and Push Docker Images / create_manifest (backend, surfsense-backend, -cuda, cuda) (push) Blocked by required conditions
Build and Push Docker Images / create_manifest (backend, surfsense-backend, -cuda126, cuda126) (push) Blocked by required conditions
Build and Push Docker Images / create_manifest (sandbox, surfsense-sandbox, , cpu) (push) Blocked by required conditions
Build and Push Docker Images / create_manifest (web, surfsense-web, , cpu) (push) Blocked by required conditions
Plugins Registry / Detect changes (push) Waiting to run
Plugins Registry / Refuse hand edits to the signed list (push) Blocked by required conditions
Plugins Registry / Check registry (push) Blocked by required conditions
Plugins Registry / Sign the registry (push) Waiting to run
feat(web): press feedback on marketing buttons
2026-10-21 04:24:59 +05:30
Anish Sarkar
14c3ba5ca1 style(web): size the download call to action
44px tall with 15px text, so the button reads as the page's main action.

Co-Authored-By: Claude Opus 5.5 <noreply@anthropic.com>
2026-10-21 04:22:50 +05:30
Anish Sarkar
8c56b41569 feat(web): press feedback on marketing buttons
HomeButton now presses like the desktop app's button: a 0.95 scale that
springs back, with a static option that presses by colour for wide buttons
and a bare variant for pills and tiles that bring their own look. Marketing
pages that used the dashboard Button now use HomeButton.

The download buttons in the navbar and the homepage CTA are plain rounded
HomeButtons, without the arrow.

Co-Authored-By: Claude Opus 5.5 <noreply@anthropic.com>
2026-10-21 03:55:04 +05:30
github-actions[bot]
2dae4d5c6c chore(registry): sign the plugin list 2026-10-20 21:56:08 +00:00
Anish Sarkar
959f8938cd
Merge pull request #2303 from AnishSarkar22/chore/registry-notion-verified
chore(registry): mark Notion as verified
2026-10-21 03:25:38 +05:30
Anish Sarkar
878be9a281 chore(registry): mark Notion as verified
Co-Authored-By: Claude Opus 5.5 <noreply@anthropic.com>
2026-10-21 03:23:34 +05:30
Anish Sarkar
e6d168b99c
Merge pull request #2302 from AnishSarkar22/feat/plugins-homepage
feat(plugins): connect any remote MCP server, through SurfSense's gateway
2026-10-21 03:15:31 +05:30
Anish Sarkar
524a5613bb feat(plugins): an OAuth server added by URL is saved signed out and signed in from its row
Adding one no longer starts a sign-in: it answers 201 once the
authorization server's hosts are allowed, and Connect on its row
registers and opens the sign-in.

Co-Authored-By: Claude Opus 5.5 <noreply@anthropic.com>
2026-10-21 02:58:09 +05:30
Anish Sarkar
172aacfcab fix(plugins): a tool's description is no longer shown on hover
Co-Authored-By: Claude Opus 5.5 <noreply@anthropic.com>
2026-10-21 02:57:42 +05:30
Anish Sarkar
eeecadf2ed test(plugins): allow third-party plugins before adding a server
Adding a server by URL now waits for the third-party switch, so the plugin
route tests start with it allowed, and the few about it being off keep the
default with a third_party_off marker. The agent tests allow it before they
connect, as the screen does. A custom plugin held by the switch is now shown
by turning it off once added, since none can be added while it is off.

Co-Authored-By: Claude Opus 5.5 <noreply@anthropic.com>
2026-10-21 00:52:42 +05:30
Anish Sarkar
c1a026e945 Merge upstream dev into feat/plugins-homepage
Resolves dev's sign-in failure codes (#2267) and its OCR ADR (#2295)
against this branch:
- dev's ADR 0062 keeps its number; this branch's become 0063, 0064 and
  0065, with every citation updated.
- A failed sign-in says why on the plugin's details, where this branch
  follows it, in dev's words for its code.
- dev's refusal tests keep the plugin waiting to sign in, as this branch
  saves it first, and its failure tests read the plugin's details.

Co-Authored-By: Claude Opus 5.5 <noreply@anthropic.com>
2026-10-21 00:31:35 +05:30
Anish Sarkar
2a8c06c658 feat(plugins): nothing reaches a third-party server while those are off
While third-party plugins are off, every route that reaches a plugin's
server refuses one SurfSense does not publish with 403 third_party_off
before sending anything, and turning the switch off ends any third-party
sign-in under way. Yours says "Third-party plugins are off" with no Connect,
a plugin's details say "Not used" with only Remove, and Add custom plugin
holds Connect beside the same switch and consent as Browse. The in-place
sign-in fallbacks for screens outside Settings › Plugins, which none are,
and the test stand-in's probe route, which the API no longer has, are gone.

Co-Authored-By: Claude Opus 5.5 <noreply@anthropic.com>
2026-10-21 00:15:40 +05:30
Anish Sarkar
1e75df0301 fix(frontend): type form submits as SubmitEvent, not the deprecated FormEvent
Co-Authored-By: Claude Opus 5.5 <noreply@anthropic.com>
2026-10-21 00:01:03 +05:30
Anish Sarkar
f94e84295a feat(plugins): a plugin's state on one line, why behind an info button
A plugin's details show its state alone, with at most one reason behind an
info button beside it: why it needs an OAuth app, the registry's reason for
a delisted plugin, or "Not used" for a third-party plugin while those are
off. Notes about its tools sit with its tools. The plugin's icon there is as
tall as its name and type.

Co-Authored-By: Claude Opus 5.5 <noreply@anthropic.com>
2026-10-21 00:00:57 +05:30
Anish Sarkar
ecae8de8f6 feat(plugins): one Connect or Disconnect per plugin, and Connect in its row
A plugin's details show one action beside its menu: Connect while it is not
connected, whatever that takes, and Disconnect once it is. Edit connection,
Edit headers, Change OAuth app and License settings move into the menu, and
the status line holds no buttons. Every plugin in Yours not connected, of any
type, shows the same Connect in its row with why beside it in grey; an OAuth
sign-in started there runs in the plugin's details.

Co-Authored-By: Claude Opus 5.5 <noreply@anthropic.com>
2026-10-20 23:34:11 +05:30
Anish Sarkar
265578d6fa feat(plugins): an OAuth plugin is saved first and finished in its details
Connect from Add custom plugin, Browse, a public page or search saves an
OAuth plugin and opens its details in Yours, where the sign-in runs; the
browser opens at once. A provider taking only registered apps, or a
registry entry declaring user_client, keeps the plugin as "Needs an OAuth
app" and its details set one up. A saved Browse entry shows its status as
Yours does, opening its details. A plugin never signed in reads "Not
connected" with Connect, nothing to disconnect, and the user's own OAuth
app is offered only where it is needed.

Co-Authored-By: Claude Opus 5.5 <noreply@anthropic.com>
2026-10-20 23:09:11 +05:30
Anish Sarkar
dcbb71320e fix(plugins): a server on the older SSE transport signs in with OAuth
A sign-in listed the server's tools over Streamable HTTP alone, so an SSE
server whose POST asks for a sign-in, as Asana's, Atlassian's and
PayPal's /sse do, was signed in and then refused. A finished sign-in now
lists as adding a server does, Streamable HTTP then SSE, and records the
transport that answered.

Co-Authored-By: Claude Opus 5.5 <noreply@anthropic.com>
2026-10-20 21:46:45 +05:30
Anish Sarkar
24bbf29719 fix(plugins): an SSE server's refusal says why, and a retired address is gone
The SSE client raises a refused stream as the HTTP library's error, which
SurfSense's MCP client never kept, so any status an SSE stream answered
was lost. It is now kept, and when neither transport answers, an SSE
address that answered anything but "nothing here" is the one reported: a
key it asks for, a server down, or 410, an address its server retired,
as DeepWiki did its /sse, reported as plugin_gone.

Co-Authored-By: Claude Opus 5.5 <noreply@anthropic.com>
2026-10-20 21:29:24 +05:30
Anish Sarkar
948317e7f8 feat(plugins): own OAuth app in three steps, chosen when adding
- The own-app dialog lays out the steps it takes: register an app with
  the provider, give it the callback address, copied in one click with
  a note where a developer build's address moves, and paste the client
  ID and secret, with scopes folded away.
- A plugin's own app is chosen when it is added, from Advanced settings,
  as Claude Code takes it; the menu item on every OAuth plugin is gone.
- A provider whose metadata names no registration, as GitHub's, is asked
  for the user's own app at once, with no registration sent only to
  fail. Refusals SurfSense handles log one line, not the SDK's traceback.

Co-Authored-By: Claude Opus 5.5 <noreply@anthropic.com>
2026-10-20 21:26:23 +05:30
Anish Sarkar
f476926978 feat(plugins): a connection is header rows, as other MCP clients take them
Advanced settings and Edit connection hold rows of a header name and a
hidden value, the first named Authorization with its value hinted
"Bearer your-key", in place of a key with a Bearer, Basic or custom
header switch. Only rows with a value are sent. The switch, its draft
and the Basic encoding are gone.

Co-Authored-By: Claude Opus 5.5 <noreply@anthropic.com>
2026-10-20 20:25:56 +05:30
Anish Sarkar
b437e0884b feat(plugins): own OAuth app apart, turn notices, tools by message
- The user's own OAuth app has a dialog of its own, opened only when a
  server registers no app or refused SurfSense, from Add or Sign in. A
  plugin signed in with one shows Change OAuth app; the API says which
  with `own_app`. Advanced settings no longer holds it.
- The gateway names a plugin whose refresh is refused in the running
  turn, and answers a call to a tool blocked mid-turn without reaching
  the server. It declines the optional GET stream for Streamable HTTP.
- opencode 1.x fixes a turn's tools when it starts (measured), so its
  budget goes first to the tools the user's message matches.
- Plugin dialogs scroll within a height below Settings', faded.
- The real Claude Code tests serve the API on a port, and one finds a
  deferred plugin tool among 81.

Co-Authored-By: Claude Opus 5.5 <noreply@anthropic.com>
2026-10-20 20:23:48 +05:30
Anish Sarkar
496e80dc9f feat(agent): size a turn's plugin tools by the window, not 24
A turn offered at most 24 plugin tools, the plugins connected first winning,
so one with many tools hid the rest and the agent called them not connected.

- Claude Code is given every ready tool and finds them with its own tool
  search, pinned with ENABLE_TOOL_SEARCH=auto; SurfSense's server is always
  loaded.
- opencode, which sends every definition with every request, is offered what
  fits a tenth of the model's window: a mentioned plugin first, then each
  plugin a tool in turn.
- A plugin left out is named to the user and to the agent, with how to bring
  it in: a mention.

Co-Authored-By: Claude Opus 5.5 <noreply@anthropic.com>
2026-10-20 18:31:08 +05:30
Anish Sarkar
59bd11ac58 feat(agent): runtimes reach plugins through SurfSense's gateway
opencode and Claude Code are given each plugin as a loopback address on the
API and a per-thread key, never its key, headers or token. The gateway checks
the plugin is ready on every request, adds its sign-in, and streams the answer
back.

- An OAuth plugin's 401 mid-session is refreshed once and sent again, so the
  runtime keeps its MCP session.
- A 403 insufficient_scope is recorded as a check records it, and the running
  turn names the plugin as needing more access.
- A server on the older SSE transport has its endpoint pointed back at the
  gateway.
- opencode's proxy now refuses every host, and Claude Code's agent runs use
  the chat proxy; the plugin proxy becomes runtime_proxy.

Co-Authored-By: Claude Opus 5.5 <noreply@anthropic.com>
2026-10-20 17:36:09 +05:30
Anish Sarkar
e9b495c0ee docs(plugins): a plugin's connection is a transport and one sign-in
ADR 0062 records the connection model: Streamable HTTP or SSE, found from
the server; no sign-in, headers, or OAuth registered in the spec's order or
as the user's own app; one Add screen with Advanced settings. The plugins
doc describes the built behaviour, and the connections proposal it replaces
is removed.

Co-Authored-By: Claude Opus 5.5 <noreply@anthropic.com>
2026-10-20 16:30:55 +05:30
Anish Sarkar
762bb05887 feat(local): connect any remote MCP server with one Connect
Add custom plugin is one screen: name, URL and Connect, with the key, how it
is sent, more headers and the user's own OAuth app under Advanced settings,
opened by a refusal they fix. The same fields edit a connected plugin.

- Every connect path names a failure from its HTTP status: needs a key or a
  sign-in, not an MCP server, or out of reach.
- Servers on the older SSE transport connect, and a check finds a server
  that moved transports.
- OAuth registers as a public client, then as a confidential one, and tells
  a provider that registers no one from one that refused SurfSense.
- An OAuth plugin is kept once its sign-in page opens, needing a sign-in.

Co-Authored-By: Claude Opus 5.5 <noreply@anthropic.com>
2026-10-20 16:30:43 +05:30
Anish Sarkar
b7fa6cfb74 feat(registry): entries name their headers, the user's own app and transport
A registry entry can name the headers a key goes in, say `auth.user_client`
for a provider that takes only registered apps, and record `transport`. The
submission form and the bot check them.

Co-Authored-By: Claude Opus 5.5 <noreply@anthropic.com>
2026-10-20 16:29:33 +05:30
Anish Sarkar
d928ec672e docs(plugins): propose connecting any remote MCP server with any sign-in
A connection is a transport, Streamable HTTP or legacy SSE, and one sign-in:
none, headers for any key, or OAuth that registers itself or uses the user's
own app. Detected from the server where it can be, shared by the Add custom
plugin dialog and the registry bot, with no migration.

Co-Authored-By: Claude Opus 5.5 <noreply@anthropic.com>
2026-10-20 03:50:12 +05:30
Anish Sarkar
d7850f4013 docs(plugins): local MCP servers wait for bundles, not custom plugins
Plugins stay remote MCP servers. A server started by a command is not added
as a custom plugin; local ones come with bundles, whose design is redone
first. The reasons move from the open questions into a decided section.

Co-Authored-By: Claude Opus 5.5 <noreply@anthropic.com>
2026-10-20 02:36:31 +05:30
Rohan Verma
1d551c097a
Merge pull request #2299 from MohammadHijjawi97/fix/local-in-stream-cache-full
Some checks failed
Desktop Tests / Changes (push) Has been cancelled
Desktop Tests / Backend (macos-latest) (push) Has been cancelled
Desktop Tests / Backend (ubuntu-latest) (push) Has been cancelled
Desktop Tests / Backend (windows-latest) (push) Has been cancelled
Desktop Tests / Frontend (push) Has been cancelled
Desktop Tests / Electron (macos-latest) (push) Has been cancelled
Desktop Tests / Electron (ubuntu-latest) (push) Has been cancelled
Desktop Tests / Electron (windows-latest) (push) Has been cancelled
Desktop Tests / Desktop Gate (push) Has been cancelled
fix(local): sort llama.cpp's shared-cache overflow as runtime_busy
2026-10-19 12:48:54 -07:00
Anish Sarkar
49e1ab842b feat(local): offer a custom plugin to the registry from its menu
Submit to the registry opens the submission form with the plugin's name and
URL filled in.

Co-Authored-By: Claude Opus 5.5 <noreply@anthropic.com>
2026-10-19 22:36:46 +05:30
Anish Sarkar
4d47e14d4f feat(registry): list a plugin from an issue form a bot checks
A publisher or an agent fills in the Submit a plugin form; no git. The bot
contacts the server as the app does, reads how it signs in and its hosts,
checks the declared tool names against what it lists without sign-in, fetches
the icon, and keeps one comment with the entry or what to fix. A maintainer's
registry: accept label has it open the pull request into dev.

Tool names are required, since the plugin's page shows them; a token entry's
key wording is optional, the app's own being used without it.

Co-Authored-By: Claude Opus 5.5 <noreply@anthropic.com>
2026-10-19 22:36:38 +05:30
Anish Sarkar
8ca3d43a5c feat(web): the plugins page lists every plugin as a gallery
Featured, By SurfSense and From other publishers rows with search, in the
site design. Other publishers' plugins and their icons are read from the
signed list plugins.surfsense.com serves, so a listing reaches the page with
no change here. Submit a plugin opens the registry's submission form.

Co-Authored-By: Claude Opus 5.5 <noreply@anthropic.com>
2026-10-19 22:36:26 +05:30
Rohan Verma
299abf676a
Merge pull request #2287 from MohammadHijjawi97/fix/studio-word-list-numbering
Some checks failed
Desktop Tests / Changes (push) Has been cancelled
Desktop Tests / Backend (macos-latest) (push) Has been cancelled
Desktop Tests / Backend (ubuntu-latest) (push) Has been cancelled
Desktop Tests / Backend (windows-latest) (push) Has been cancelled
Desktop Tests / Frontend (push) Has been cancelled
Desktop Tests / Electron (macos-latest) (push) Has been cancelled
Desktop Tests / Electron (ubuntu-latest) (push) Has been cancelled
Desktop Tests / Electron (windows-latest) (push) Has been cancelled
Desktop Tests / Desktop Gate (push) Has been cancelled
fix(local): count each numbered list in a Studio Word file from 1
2026-10-17 18:28:01 -07:00