Skip to content

[Local|Release] Release desktop 2.2.3 - #2307

Merged
AnishSarkar22 merged 117 commits into
mainfrom
dev
Oct 21, 2026
Merged

AnishSarkar22 merged 117 commits into
mainfrom
dev

Conversation

@AnishSarkar22

Copy link
Copy Markdown
Collaborator

What

Desktop release 2.2.3: dev into main. The tag v2.2.3 goes on this pull request's merge commit (surfsense_local/RELEASE.md).

What's in it since 2.2.2:

Why

Ship the desktop app's 2.2.3, with the signed plugin list, to main.

Fixes #

How to test

Before merging:

After merging:

  • Tag v2.2.3 on the merge commit, open the draft release with --notes-start-tag v2.2.2, and wait for Mac, Windows, Linux and legacy-update-bridge.
  • Add Known issues above the generated notes, including what going back to 2.2.2 takes after migrations 0031 and 0032.
  • Redeploy from main on Coolify: the license server (APP_RELEASE_VERSION is compiled in, so a redeploy, not a restart), the plugin host and the plugin registry. The website deploys itself on Vercel.

🤖 Generated with Claude Code

Cedric921 and others added 30 commits October 14, 2026 20:44
A failed sign-in's poll carried only a sentence, in English, so the
screen could not say why in the user's language. The API now sends a
code beside it, SignInFailure, one per cause it already told apart:
the provider's refusal, declined or other, a timeout, a host not
allowed, the sign-in server unreachable, a server that could not list
its tools, a plugin disconnected or connected under another name
meanwhile, an unfinished flow, and anything else.

The sentences and the browser's callback page are unchanged.
A failed plugin sign-in read "The sign-in didn't finish" whatever the
cause. The screen now has its own words for each code the API sends,
wherever a sign-in is shown: Connect on a listed plugin, Add custom
plugin and Sign in again. A code it has no words for shows the API's
own sentence; once the API has forgotten the sign-in, the old sentence
stays.
The ten sentences of sign-in-failure-text.ts in the nine other languages, following the translate skill's tone per language and its glossary.
plugins.md describes the code where it describes the poll, the screen
and the tests, and its Known gaps line for the unshown reason is gone.
localization.md lists the sign-in reasons among the backend texts that
carry a code.
Once the API has forgotten a sign-in, Sign in again says "The sign-in didn't finish." without "Try again.", as the other surfaces do.
The Word builder gave every ordered list the template's List Number style,
and every paragraph in that style shares one numbering. A second list in
the same document went on from where the first stopped (4, 5, ...), and a
numbered list nested under a later bullet went on from the one under the
earlier bullet. The PDF builder already starts each list at 1.

Each ordered list now gets its own numbering on the style's list, with a
start override of 1. Removes the Known gap from docs/architecture/studio.md.
# Conflicts:
#	docs/architecture/localization.md
#	docs/architecture/plugins.md
Four of the screen's sentences said what the API does not know, or
dropped what it does: the host it was not allowed to contact, and the
name the server is already connected as, are now sent as raw values
beside the code and placed in the sentence, as an install's disk
refusal sends its sizes. A sign-in that finds its plugin gone says
"removed", which is what Remove does; Disconnect keeps the row. And
"declined" is the provider's word, not the user's: access_denied also
covers the authorization server refusing.

A provider refusal other than access_denied is covered by a test now.
Measured: Claude Code returns output_format answers through its own
StructuredOutput tool, valid against the schema in every run, and needs
more than one turn. A Claude plan model can therefore take the chat
router step and Studio's schemas; the open question is closed.

Co-Authored-By: Claude Opus 5.5 <noreply@anthropic.com>
locate_claude searches PATH, then where Claude Code's installers put it
on macOS, Linux and Windows; on Windows only a claude.exe counts, since
the Agent SDK refuses npm's claude.cmd. read_status runs --version and
auth status and reports not_installed, too_old, signed_out or ready,
treating a hang or unreadable answer as no answer. Tests run a stand-in
claude on every system.

Co-Authored-By: Claude Opus 5.5 <noreply@anthropic.com>
launch_options is the one place a run's options are made: the user's
binary, no user settings or MCP servers, verbatim prompts, the default
permission mode, no API key, no telemetry, and SurfSense's proxy, none of
which a caller can override. failure_of turns Claude Code's messages into
the sign-in, plan-limit and egress errors SurfSense already shows.
Pins claude-agent-sdk 0.2.168.

Co-Authored-By: Claude Opus 5.5 <noreply@anthropic.com>
ClaudeRun is the only code that touches the Agent SDK's client: send a
message and stream what follows, interrupt, list models, close. Its tests
run the user's real Claude Code under the new opt-in claude_code marker,
skipped unless SURFSENSE_CLAUDE_CODE_TESTS=1 and Claude Code is signed in.

Co-Authored-By: Claude Opus 5.5 <noreply@anthropic.com>
Revision 0031 widens provider_connections.auth_kind to accept
claude_plan, the only schema change the Claude plan needs: it stores no
credential, and what Claude Code reports is read live. SQLite cannot
alter a CHECK, so the table is rebuilt from its own stored definition,
with every remote selection kept aside and put back, since dropping the
table cascades through selected_models.

Co-Authored-By: Claude Opus 5.5 <noreply@anthropic.com>
GET /llm/connections/claude reads Claude Code's state live: not
installed, too old, signed out, or ready with its account and plan.
POST makes the claude_plan connection once Claude Code is ready and
api.anthropic.com allowed, one per install. The connection serves chat
only, lists Claude Code's models by their full ids so the manifest's
Anthropic capabilities apply, and can only be renamed.

Co-Authored-By: Claude Opus 5.5 <noreply@anthropic.com>
ClaudePlanProvider is a Generator over Claude Code with every tool off:
SurfSense's system prompt in place of Claude Code's, text and thinking
streamed, a schema answered as structured output, the newest message's
images sent beside it, and plan, sign-in and run failures raised as the
errors chat already shows. A warm run per conversation, at most four,
answers the next message from what it holds; an edited conversation, a
busy run or another model starts from the whole conversation instead.

Co-Authored-By: Claude Opus 5.5 <noreply@anthropic.com>
A claude_plan connection now resolves to the Claude plan's generator,
over one pool of warm runs for the API process, so chat, thread titles,
the chat check and Studio answer through the user's own Claude Code.
The API closes every warm run when it stops.

Co-Authored-By: Claude Opus 5.5 <noreply@anthropic.com>
Every Claude Code run goes through a loopback proxy the API serves,
which tunnels only api.anthropic.com, for model calls, and
platform.claude.com, where Claude Code refreshes its sign-in, each
while its egress is on. No run starts without the proxy. Connecting,
listing models, choosing one and generating all require both hosts,
named in one refusal; a host turned off mid-reply ends the run at
Claude Code's first retry rather than its tenth. The proxy reuses the
plugin proxy's tunnel with a host list of its own, so opencode never
reaches Anthropic and Claude Code never reaches a plugin.

Co-Authored-By: Claude Opus 5.5 <noreply@anthropic.com>
An nvm folder's version is read by splitting vX.Y.Z, with a folder that
is not a version ranked below every one, and the real chat test reads
the tunnelled hosts from the proxy's log records rather than its text.
Claude Code's own version string keeps its regex: it is another
program's output, and a pattern found anywhere survives its changes.

Co-Authored-By: Claude Opus 5.5 <noreply@anthropic.com>
The SDK's wheel carries a 241 MB Claude Code that PyInstaller leaves
out, since nothing asks for the SDK's data. A packaging test now reads
every spec and fails when any collector names the SDK, and the frozen
API test fails when a claude binary is in the bundle. Measured: the SDK
adds 0.22 MB to the frozen API and no Claude Code.

Co-Authored-By: Claude Opus 5.5 <noreply@anthropic.com>
The SDK's wheels carry a 241 MB Claude Code; its source package carries
none. no-binary-package makes uv build the SDK from source, so no venv,
CI cache or frozen app holds that copy, and pnpm dev's predev does it
through uv run with nothing done by hand. A unit test, run on every
system in CI, fails if the installed SDK ever carries one again; it
replaces the spec-reading packaging test, which guarded a file that is
no longer installed.

Co-Authored-By: Claude Opus 5.5 <noreply@anthropic.com>
A Claude plan raised the ChatGPT plan's errors, so chat told its users
to sign in to ChatGPT in Model setup. Its sign-in and limit errors are
now Claude subclasses of those, sorted first into claude_sign_in and
claude_limit, and a missing or signed-out Claude Code answers the model
check with claude_sign_in_required. Code that catches the parent errors
is unchanged.

Co-Authored-By: Claude Opus 5.5 <noreply@anthropic.com>
A "Use your Claude plan" row beside the ChatGPT one opens a dialog that
reads Claude Code's state live and says what to do: install it, run
claude and sign in, or update it, with Check again; once ready, Add
Claude models asks for both of its hosts in one egress question and
makes the connection. The egress prompt now asks about every host a
refusal or askEgress names at once, wording a Claude plan's two by what
each gets, which also makes ChatGPT's sign-in one question. Editing a
Claude plan only renames it, chat names its failures in Claude's terms,
and Electron opens Claude Code's install guide and no other page of
that site. Every new string is in all ten languages.

Co-Authored-By: Claude Opus 5.5 <noreply@anthropic.com>
The architecture doc and the route's docstring still said the hosts
were asked about one by one, which the multi-host egress prompt
changed.

Co-Authored-By: Claude Opus 5.5 <noreply@anthropic.com>
PUT /egress takes every destination one answer covers and switches them
together: each is checked before any is written, and the request's one
transaction commits them all or none, so a failed Allow leaves no host
on. It replaces PUT /egress/{destination}; Settings > Network sends a
list of one, and every consent question, the frontend's only caller of
both, now makes one request. Recording consent changes; checking it,
egress.require() on every call, does not.

Co-Authored-By: Claude Opus 5.5 <noreply@anthropic.com>
ADR 0058 records which hosts one egress question names: every host a
user action may reach, including hosts its background work reaches,
which no dialog could ask about later, and never a host SurfSense has
not named. egress.md says the same under asking for consent.

Co-Authored-By: Claude Opus 5.5 <noreply@anthropic.com>
…its hosts

The status check now runs through the Claude proxy with the environment
every run gets: it contacts nothing today, but a later Claude Code that
checks its sign-in online is held to consent too. The proxy logs a
refused host as Claude Code's, not opencode's, so a host a new release
tries on its own shows at once, and a claude_code test fails when the
installed binary refreshes its sign-in on a host SurfSense does not
allow.

Co-Authored-By: Claude Opus 5.5 <noreply@anthropic.com>
A Claude Code run stopped at once when a host it needs was turned off
mid-reply, but the chat called it unknown: chat had an error kind for
an egress refusal only before a reply. It now sorts EgressDeniedError
into egress_disabled, which says the host was turned off in Settings >
Network and to allow it there, in every language.

Co-Authored-By: Claude Opus 5.5 <noreply@anthropic.com>
The connection doc keeps Claude Code's proxy to Anthropic's two hosts,
while the agent doc gave Claude Code each plugin server, which needs
plugin hosts on that proxy. Record it as an open question for the agent
spikes, preferring plugins through SurfSense's tool endpoint.

Co-Authored-By: Claude Opus 5.5 <noreply@anthropic.com>
…dry-run-signing

# Conflicts:
#	docs/architecture/packaging.md
AnishSarkar22 and others added 23 commits October 20, 2026 20:25
… 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>
- 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>
… 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>
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>
…ails

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>
…ts 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>
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>
…ormEvent

Co-Authored-By: Claude Opus 5.5 <noreply@anthropic.com>
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>
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>
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>
Co-Authored-By: Claude Opus 5.5 <noreply@anthropic.com>
…igned 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>
feat(plugins): connect any remote MCP server, through SurfSense's gateway
Co-Authored-By: Claude Opus 5.5 <noreply@anthropic.com>
…ified

chore(registry): mark Notion as verified
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>
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>
feat(web): press feedback on marketing buttons
…rt 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>
…thub-token

ci(registry): open submission pull requests with GITHUB_TOKEN and start their checks
@vercel

vercel Bot commented Oct 21, 2026 •

Copy link
Copy Markdown

The latest updates on your projects. Learn more about Vercel for GitHub.

Project Deployment Actions Updated
surf-sense-frontend Ready Ready Preview Oct 21, 2026 8:20am UTC

Request Review

@coderabbitai

coderabbitai Bot commented Oct 21, 2026 •

Copy link
Copy Markdown

Important

Review skipped

Too many files!

This PR contains 477 files, which is 177 over the limit of 300.

To get a review, reduce the PR to 300 files or fewer by splitting it into smaller PRs or changing its base branch.

Usage-priced reviews support at most 300 files.

⚙️ Run configuration
  • Configuration used: Repository: MODSetter/SurfSense/.coderabbit.yaml
  • Review profile: CHILL
  • Plan: Advanced
  • Run ID: 6beb85fa-9aa4-4d0d-a962-cecd7fc0ffbb
📥 Commits

Reviewing files that changed from the base of the PR and between 176aed2 and ed14a1d.

⛔ Files ignored due to path filters: 1
  • surfsense_local/backend/uv.lock is excluded by !**/*.lock
📒 Files selected for processing: 477
  • .agents/skills/translate/glossary.md
  • .github/ISSUE_TEMPLATE/plugin-submit.yml
  • .github/workflows/notarization-credentials.yml
  • .github/workflows/plugins-registry-submission.yml
  • .github/workflows/plugins-registry.yml
  • .github/workflows/release-local.yml
  • .pre-commit-config.yaml
  • docs/adr/0057-a-claude-plan-runs-through-the-users-own-claude-code.md
  • docs/adr/0060-one-consent-question-per-user-action.md
  • docs/adr/0061-claude-code-reaches-anthropic-and-in-the-agent-the-turns-plugins.md
  • docs/adr/0062-a-scan-is-read-by-ocr-alone-before-docling.md
  • docs/adr/0063-a-plugins-connection-is-a-transport-and-one-sign-in.md
  • docs/adr/0064-agent-runtimes-reach-plugins-through-surfsenses-gateway.md
  • docs/adr/0065-a-turns-plugin-tools-are-sized-by-the-window-not-counted.md
  • docs/adr/README.md
  • docs/architecture/about.md
  • docs/architecture/agent.md
  • docs/architecture/chat.md
  • docs/architecture/chatgpt-subscription.md
  • docs/architecture/claude-plan.md
  • docs/architecture/connections.md
  • docs/architecture/data-model.md
  • docs/architecture/documents.md
  • docs/architecture/egress.md
  • docs/architecture/localization.md
  • docs/architecture/overview.md
  • docs/architecture/packaging.md
  • docs/architecture/plugin-registry.md
  • docs/architecture/plugins.md
  • docs/architecture/studio.md
  • docs/proposals/claude-plan/01-connection.md
  • docs/proposals/claude-plan/02-chat.md
  • docs/proposals/claude-plan/03-agent.md
  • docs/proposals/claude-plan/04-handover.md
  • docs/proposals/claude-plan/05-dialog.md
  • docs/proposals/claude-plan/README.md
  • docs/proposals/file-agent/04-runtime-and-packs.md
  • docs/proposals/mermaid-diagrams.md
  • docs/proposals/plugins/README.md
  • plugins/registry/README.md
  • plugins/registry/check/registry_check/__main__.py
  • plugins/registry/check/registry_check/live/oauth_findings.py
  • plugins/registry/check/registry_check/live/server_check.py
  • plugins/registry/check/registry_check/live/server_contact.py
  • plugins/registry/check/registry_check/live/tool_findings.py
  • plugins/registry/check/registry_check/static/entry_rules.py
  • plugins/registry/check/registry_check/submission/__init__.py
  • plugins/registry/check/registry_check/submission/icon_fetch.py
  • plugins/registry/check/registry_check/submission/issue_form.py
  • plugins/registry/check/registry_check/submission/listing.py
  • plugins/registry/check/registry_check/submission/public_address.py
  • plugins/registry/check/registry_check/submission/server_report.py
  • plugins/registry/check/registry_check/submission/submission_check.py
  • plugins/registry/check/registry_check/submission/submission_comment.py
  • plugins/registry/check/registry_check/submission/submitted_entry.py
  • plugins/registry/check/tests/live_servers.py
  • plugins/registry/check/tests/registry_files.py
  • plugins/registry/check/tests/submission_forms.py
  • plugins/registry/check/tests/test_icon_fetch.py
  • plugins/registry/check/tests/test_issue_form.py
  • plugins/registry/check/tests/test_live_check.py
  • plugins/registry/check/tests/test_server_report.py
  • plugins/registry/check/tests/test_static_check.py
  • plugins/registry/check/tests/test_submission.py
  • plugins/registry/check/tests/test_submission_command.py
  • plugins/registry/plugins.json
  • plugins/registry/published/plugins.json
  • plugins/registry/published/plugins.json.sig
  • surfsense_backend/app/license/release.py
  • surfsense_local/RELEASE.md
  • surfsense_local/VERSION
  • surfsense_local/backend/alembic/versions/0031_claude_plan_connection.py
  • surfsense_local/backend/alembic/versions/0032_agent_thread_engine.py
  • surfsense_local/backend/api/main.py
  • surfsense_local/backend/bundling/worker.spec
  • surfsense_local/backend/modules/agent/agent_threads/router.py
  • surfsense_local/backend/modules/agent/agent_threads/turn.py
  • surfsense_local/backend/modules/agent/engines/__init__.py
  • surfsense_local/backend/modules/agent/engines/agent_engine.py
  • surfsense_local/backend/modules/agent/engines/both_sessions.py
  • surfsense_local/backend/modules/agent/engines/claude_code/__init__.py
  • surfsense_local/backend/modules/agent/engines/claude_code/agent_options.py
  • surfsense_local/backend/modules/agent/engines/claude_code/agent_runs.py
  • surfsense_local/backend/modules/agent/engines/claude_code/approvals.py
  • surfsense_local/backend/modules/agent/engines/claude_code/endings.py
  • surfsense_local/backend/modules/agent/engines/claude_code/engine.py
  • surfsense_local/backend/modules/agent/engines/claude_code/gate.py
  • surfsense_local/backend/modules/agent/engines/claude_code/mcp_config.py
  • surfsense_local/backend/modules/agent/engines/claude_code/models.py
  • surfsense_local/backend/modules/agent/engines/claude_code/opencode_shape.py
  • surfsense_local/backend/modules/agent/engines/claude_code/plugin_statuses.py
  • surfsense_local/backend/modules/agent/engines/claude_code/saved_results.py
  • surfsense_local/backend/modules/agent/engines/claude_code/session_files.py
  • surfsense_local/backend/modules/agent/engines/claude_code/session_store.py
  • surfsense_local/backend/modules/agent/engines/claude_code/skills_plugin.py
  • surfsense_local/backend/modules/agent/engines/claude_code/tool_names.py
  • surfsense_local/backend/modules/agent/engines/claude_code/tool_result.py
  • surfsense_local/backend/modules/agent/engines/claude_code/transcript_shape.py
  • surfsense_local/backend/modules/agent/engines/claude_code/turn.py
  • surfsense_local/backend/modules/agent/engines/claude_code/turn_link.py
  • surfsense_local/backend/modules/agent/engines/handover/__init__.py
  • surfsense_local/backend/modules/agent/engines/handover/note.py
  • surfsense_local/backend/modules/agent/engines/handover/take_over.py
  • surfsense_local/backend/modules/agent/engines/opencode_engine.py
  • surfsense_local/backend/modules/agent/engines/thread_engine.py
  • surfsense_local/backend/modules/agent/opencode_client/client.py
  • surfsense_local/backend/modules/agent/opencode_runtime.py
  • surfsense_local/backend/modules/agent/plugin_gateway/__init__.py
  • surfsense_local/backend/modules/agent/plugin_gateway/blocked_call.py
  • surfsense_local/backend/modules/agent/plugin_gateway/expired_token.py
  • surfsense_local/backend/modules/agent/plugin_gateway/forwarded.py
  • surfsense_local/backend/modules/agent/plugin_gateway/gateway_key.py
  • surfsense_local/backend/modules/agent/plugin_gateway/given_server.py
  • surfsense_local/backend/modules/agent/plugin_gateway/missing_scopes.py
  • surfsense_local/backend/modules/agent/plugin_gateway/ready_upstream.py
  • surfsense_local/backend/modules/agent/plugin_gateway/recorded_call.py
  • surfsense_local/backend/modules/agent/plugin_gateway/router.py
  • surfsense_local/backend/modules/agent/plugin_gateway/sse_endpoint.py
  • surfsense_local/backend/modules/agent/plugin_gateway/turn_notice.py
  • surfsense_local/backend/modules/agent/plugin_gateway/upstream_headers.py
  • surfsense_local/backend/modules/agent/plugin_proxy/allowed_hosts.py
  • surfsense_local/backend/modules/agent/plugin_tools/changed_tools.py
  • surfsense_local/backend/modules/agent/plugin_tools/connect_limit.py
  • surfsense_local/backend/modules/agent/plugin_tools/give_plugins.py
  • surfsense_local/backend/modules/agent/plugin_tools/left_out.py
  • surfsense_local/backend/modules/agent/plugin_tools/refreshed_sign_ins.py
  • surfsense_local/backend/modules/agent/plugin_tools/router.py
  • surfsense_local/backend/modules/agent/plugin_tools/stop_plugin_calls.py
  • surfsense_local/backend/modules/agent/plugin_tools/tool_budget.py
  • surfsense_local/backend/modules/agent/plugin_tools/tool_relevance.py
  • surfsense_local/backend/modules/agent/plugin_tools/turn_plugins.py
  • surfsense_local/backend/modules/agent/plugin_tools/unavailable_plugin.py
  • surfsense_local/backend/modules/agent/runtime_proxy/__init__.py
  • surfsense_local/backend/modules/agent/runtime_proxy/allowed_hosts.py
  • surfsense_local/backend/modules/agent/runtime_proxy/server.py
  • surfsense_local/backend/modules/agent/skills/surfsense-data/SKILL.md
  • surfsense_local/backend/modules/agent/thread_folder/retire_workspace_folder.py
  • surfsense_local/backend/modules/agent/thread_folder/sync.py
  • surfsense_local/backend/modules/agent/tool_endpoint/messages.py
  • surfsense_local/backend/modules/agent/tool_endpoint/offered_tools.py
  • surfsense_local/backend/modules/agent/tool_endpoint/registration.py
  • surfsense_local/backend/modules/agent/tool_endpoint/turn_scope.py
  • surfsense_local/backend/modules/chat/errors.py
  • surfsense_local/backend/modules/chat/models.py
  • surfsense_local/backend/modules/chat/router.py
  • surfsense_local/backend/modules/documents/docling_batches/ended_in_queue.py
  • surfsense_local/backend/modules/documents/docling_batches/layout.py
  • surfsense_local/backend/modules/egress/last_calls.py
  • surfsense_local/backend/modules/egress/router.py
  • surfsense_local/backend/modules/llm/capability/modes/new_chat.py
  • surfsense_local/backend/modules/llm/connections/listing.py
  • surfsense_local/backend/modules/llm/connections/router.py
  • surfsense_local/backend/modules/llm/connections/serves.py
  • surfsense_local/backend/modules/llm/connections/text_generator.py
  • surfsense_local/backend/modules/llm/models.py
  • surfsense_local/backend/modules/llm/providers/types.py
  • surfsense_local/backend/modules/llm/resolution.py
  • surfsense_local/backend/modules/llm/router.py
  • surfsense_local/backend/modules/llm/subscriptions/chatgpt/router.py
  • surfsense_local/backend/modules/llm/subscriptions/claude/__init__.py
  • surfsense_local/backend/modules/llm/subscriptions/claude/account.py
  • surfsense_local/backend/modules/llm/subscriptions/claude/chat.py
  • surfsense_local/backend/modules/llm/subscriptions/claude/chat_prompt.py
  • surfsense_local/backend/modules/llm/subscriptions/claude/chat_runs.py
  • surfsense_local/backend/modules/llm/subscriptions/claude/errors.py
  • surfsense_local/backend/modules/llm/subscriptions/claude/extra_usage.py
  • surfsense_local/backend/modules/llm/subscriptions/claude/hosts.py
  • surfsense_local/backend/modules/llm/subscriptions/claude/installed_version.py
  • surfsense_local/backend/modules/llm/subscriptions/claude/launch.py
  • surfsense_local/backend/modules/llm/subscriptions/claude/locate.py
  • surfsense_local/backend/modules/llm/subscriptions/claude/models.py
  • surfsense_local/backend/modules/llm/subscriptions/claude/plan_generator.py
  • surfsense_local/backend/modules/llm/subscriptions/claude/proxy.py
  • surfsense_local/backend/modules/llm/subscriptions/claude/proxy_hosts.py
  • surfsense_local/backend/modules/llm/subscriptions/claude/router.py
  • surfsense_local/backend/modules/llm/subscriptions/claude/run.py
  • surfsense_local/backend/modules/llm/subscriptions/claude/schemas.py
  • surfsense_local/backend/modules/llm/subscriptions/claude/status.py
  • surfsense_local/backend/modules/llm/subscriptions/claude/tested_version.py
  • surfsense_local/backend/modules/llm/subscriptions/claude/usable_claude.py
  • surfsense_local/backend/modules/llm/subscriptions/plan_usage_frame.py
  • surfsense_local/backend/modules/plugins/installed/awaiting_sign_in.py
  • surfsense_local/backend/modules/plugins/installed/custom_plugin.py
  • surfsense_local/backend/modules/plugins/installed/plugin_check.py
  • surfsense_local/backend/modules/plugins/installed/plugin_read.py
  • surfsense_local/backend/modules/plugins/installed/registry_plugin.py
  • surfsense_local/backend/modules/plugins/installed/replace_headers.py
  • surfsense_local/backend/modules/plugins/installed/third_party_off.py
  • surfsense_local/backend/modules/plugins/lists/list_entry.py
  • surfsense_local/backend/modules/plugins/lists/registry/entry_headers.py
  • surfsense_local/backend/modules/plugins/lists/registry/registry_read.py
  • surfsense_local/backend/modules/plugins/lists/registry/routes.py
  • surfsense_local/backend/modules/plugins/remote/connect_refusal.py
  • surfsense_local/backend/modules/plugins/remote/either_transport.py
  • surfsense_local/backend/modules/plugins/remote/mcp_client/http_failure.py
  • surfsense_local/backend/modules/plugins/remote/mcp_client/scope_challenge.py
  • surfsense_local/backend/modules/plugins/remote/mcp_client/sdk_errors.py
  • surfsense_local/backend/modules/plugins/remote/mcp_client/server_error.py
  • surfsense_local/backend/modules/plugins/remote/mcp_client/session.py
  • surfsense_local/backend/modules/plugins/remote/mcp_client/transports.py
  • surfsense_local/backend/modules/plugins/remote/sign_in/headers/__init__.py
  • surfsense_local/backend/modules/plugins/remote/sign_in/headers/given_headers.py
  • surfsense_local/backend/modules/plugins/remote/sign_in/headers/header_rules.py
  • surfsense_local/backend/modules/plugins/remote/sign_in/headers/headers_credential.py
  • surfsense_local/backend/modules/plugins/remote/sign_in/oauth/handled_refusals.py
  • surfsense_local/backend/modules/plugins/remote/sign_in/oauth/listed_after_refresh.py
  • surfsense_local/backend/modules/plugins/remote/sign_in/oauth/own_app.py
  • surfsense_local/backend/modules/plugins/remote/sign_in/oauth/own_app_needed.py
  • surfsense_local/backend/modules/plugins/remote/sign_in/oauth/plugin_draft.py
  • surfsense_local/backend/modules/plugins/remote/sign_in/oauth/plugin_sign_ins.py
  • surfsense_local/backend/modules/plugins/remote/sign_in/oauth/registration_offer.py
  • surfsense_local/backend/modules/plugins/remote/sign_in/oauth/routes.py
  • surfsense_local/backend/modules/plugins/remote/sign_in/oauth/sign_in_client.py
  • surfsense_local/backend/modules/plugins/remote/sign_in/oauth/sign_in_failure.py
  • surfsense_local/backend/modules/plugins/remote/sign_in/oauth/sign_in_flow.py
  • surfsense_local/backend/modules/plugins/remote/sign_in/oauth/sign_in_read.py
  • surfsense_local/backend/modules/plugins/remote/sign_in/oauth/signed_in_plugin.py
  • surfsense_local/backend/modules/plugins/remote/sign_in/oauth/start_sign_in.py
  • surfsense_local/backend/modules/plugins/remote/sign_in/plugin_headers.py
  • surfsense_local/backend/modules/plugins/remote/source.py
  • surfsense_local/backend/modules/plugins/remote/transport_moved.py
  • surfsense_local/backend/modules/plugins/routes.py
  • surfsense_local/backend/modules/workspaces/router.py
  • surfsense_local/backend/pyproject.toml
  • surfsense_local/backend/shared/config.py
  • surfsense_local/backend/shared/db.py
  • surfsense_local/backend/tests/claude_agent_stand_in.py
  • surfsense_local/backend/tests/claude_code/conftest.py
  • surfsense_local/backend/tests/claude_code/connect_recorder.py
  • surfsense_local/backend/tests/claude_code/test_agent_engine.py
  • surfsense_local/backend/tests/claude_code/test_app_agent.py
  • surfsense_local/backend/tests/claude_code/test_app_chat.py
  • surfsense_local/backend/tests/claude_code/test_chat.py
  • surfsense_local/backend/tests/claude_code/test_connection.py
  • surfsense_local/backend/tests/claude_code/test_hosts.py
  • surfsense_local/backend/tests/claude_code/test_run.py
  • surfsense_local/backend/tests/claude_run_stand_in.py
  • surfsense_local/backend/tests/claude_stand_in.py
  • surfsense_local/backend/tests/conftest.py
  • surfsense_local/backend/tests/integration/agent/claude_code/conftest.py
  • surfsense_local/backend/tests/integration/agent/claude_code/test_both_engines.py
  • surfsense_local/backend/tests/integration/agent/claude_code/test_claude_account.py
  • surfsense_local/backend/tests/integration/agent/claude_code/test_claude_agent.py
  • surfsense_local/backend/tests/integration/agent/claude_code/test_handover.py
  • surfsense_local/backend/tests/integration/agent/claude_code/test_session_store.py
  • surfsense_local/backend/tests/integration/agent/test_plugin_gateway.py
  • surfsense_local/backend/tests/integration/agent/test_plugin_proxy.py
  • surfsense_local/backend/tests/integration/agent/test_plugin_tools.py
  • surfsense_local/backend/tests/integration/agent/test_routes_without_opencode.py
  • surfsense_local/backend/tests/integration/agent/test_runtime_proxy.py
  • surfsense_local/backend/tests/integration/agent/test_thread_folders.py
  • surfsense_local/backend/tests/integration/agent/test_thread_modes.py
  • surfsense_local/backend/tests/integration/agent/test_tool_endpoint.py
  • surfsense_local/backend/tests/integration/agent/test_turn_preparation.py
  • surfsense_local/backend/tests/integration/agent/test_turn_sources.py
  • surfsense_local/backend/tests/integration/agent/tool_endpoint_client.py
  • surfsense_local/backend/tests/integration/llm/chatgpt/test_sign_in_routes.py
  • surfsense_local/backend/tests/integration/llm/claude/conftest.py
  • surfsense_local/backend/tests/integration/llm/claude/test_claude_chat.py
  • surfsense_local/backend/tests/integration/llm/claude/test_claude_proxy.py
  • surfsense_local/backend/tests/integration/llm/claude/test_claude_routes.py
  • surfsense_local/backend/tests/integration/llm/test_egress.py
  • surfsense_local/backend/tests/integration/plugins/routes/conftest.py
  • surfsense_local/backend/tests/integration/plugins/routes/test_disconnect.py
  • surfsense_local/backend/tests/integration/plugins/routes/test_oauth_own_app.py
  • surfsense_local/backend/tests/integration/plugins/routes/test_oauth_sign_in.py
  • surfsense_local/backend/tests/integration/plugins/routes/test_plugin_headers.py
  • surfsense_local/backend/tests/integration/plugins/routes/test_plugin_transport.py
  • surfsense_local/backend/tests/integration/plugins/routes/test_registry.py
  • surfsense_local/backend/tests/integration/plugins/routes/test_third_party_off.py
  • surfsense_local/backend/tests/integration/plugins/routes/test_tool_settings.py
  • surfsense_local/backend/tests/integration/runtime_packs/test_office_routes.py
  • surfsense_local/backend/tests/integration/test_migration_0031.py
  • surfsense_local/backend/tests/integration/test_migration_0032.py
  • surfsense_local/backend/tests/integration/worker/test_ocr_first.py
  • surfsense_local/backend/tests/integration/worker/test_parsing.py
  • surfsense_local/backend/tests/integration/worker/test_rapidocr_engine.py
  • surfsense_local/backend/tests/integration/worker/test_vision_engine.py
  • surfsense_local/backend/tests/mcp_test_server.py
  • surfsense_local/backend/tests/oauth_stand_in.py
  • surfsense_local/backend/tests/packaging/test_real_binaries.py
  • surfsense_local/backend/tests/unit/agent/engines/claude_code/test_agent_options.py
  • surfsense_local/backend/tests/unit/agent/engines/claude_code/test_agent_runs.py
  • surfsense_local/backend/tests/unit/agent/engines/claude_code/test_gate.py
  • surfsense_local/backend/tests/unit/agent/engines/claude_code/test_mcp_config.py
  • surfsense_local/backend/tests/unit/agent/engines/claude_code/test_opencode_shape.py
  • surfsense_local/backend/tests/unit/agent/engines/claude_code/test_plugin_statuses.py
  • surfsense_local/backend/tests/unit/agent/engines/claude_code/test_skills_plugin.py
  • surfsense_local/backend/tests/unit/agent/engines/claude_code/test_tool_names.py
  • surfsense_local/backend/tests/unit/agent/engines/claude_code/test_transcript_shape.py
  • surfsense_local/backend/tests/unit/agent/engines/claude_code/test_turn_link.py
  • surfsense_local/backend/tests/unit/agent/engines/handover/test_note.py
  • surfsense_local/backend/tests/unit/agent/engines/test_both_sessions.py
  • surfsense_local/backend/tests/unit/agent/test_give_plugins.py
  • surfsense_local/backend/tests/unit/agent/test_tool_budget.py
  • surfsense_local/backend/tests/unit/chat/test_errors.py
  • surfsense_local/backend/tests/unit/egress/test_last_calls.py
  • surfsense_local/backend/tests/unit/llm/subscriptions/claude/test_chat.py
  • surfsense_local/backend/tests/unit/llm/subscriptions/claude/test_errors.py
  • surfsense_local/backend/tests/unit/llm/subscriptions/claude/test_launch.py
  • surfsense_local/backend/tests/unit/llm/subscriptions/claude/test_locate.py
  • surfsense_local/backend/tests/unit/llm/subscriptions/claude/test_sdk_install.py
  • surfsense_local/backend/tests/unit/llm/subscriptions/claude/test_status.py
  • surfsense_local/backend/tests/unit/llm/subscriptions/claude/test_tested_version.py
  • surfsense_local/backend/tests/unit/worker/test_scan_ocr.py
  • surfsense_local/backend/tests/unit/worker/test_studio_markdown_documents.py
  • surfsense_local/backend/worker.py
  • surfsense_local/backend/worker/ingestion/docling_batches/waiting_work.py
  • surfsense_local/backend/worker/ingestion/parsing.py
  • surfsense_local/backend/worker/ingestion/pdf_reading/ocr_first.py
  • surfsense_local/backend/worker/ingestion/pdf_reading/ocr_kept.py
  • surfsense_local/backend/worker/ingestion/pdf_reading/route.py
  • surfsense_local/backend/worker/ingestion/scan_ocr/__init__.py
  • surfsense_local/backend/worker/ingestion/scan_ocr/check.py
  • surfsense_local/backend/worker/ingestion/scan_ocr/frames.py
  • surfsense_local/backend/worker/ingestion/scan_ocr/images.py
  • surfsense_local/backend/worker/ingestion/scan_ocr/page.py
  • surfsense_local/backend/worker/ingestion/scan_ocr/pages_at_once.py
  • surfsense_local/backend/worker/ingestion/scan_ocr/rapid.py
  • surfsense_local/backend/worker/ingestion/scan_ocr/reader.py
  • surfsense_local/backend/worker/ingestion/scan_ocr/reading_order.py
  • surfsense_local/backend/worker/ingestion/scan_ocr/switch.py
  • surfsense_local/backend/worker/ingestion/scan_ocr/upright.py
  • surfsense_local/backend/worker/ingestion/scan_ocr/vision.py
  • surfsense_local/backend/worker/studio/office/markdown/word.py
  • surfsense_local/electron/package.json
  • surfsense_local/electron/scripts/notices/allowed-without-text.json
  • surfsense_local/electron/src/main/about/data-folder-ipc.ts
  • surfsense_local/electron/src/main/external-url.test.ts
  • surfsense_local/electron/src/main/external-url.ts
  • surfsense_local/electron/src/main/index.ts
  • surfsense_local/electron/src/main/sidecars/boot.ts
  • surfsense_local/electron/src/main/sidecars/opencode.test.ts
  • surfsense_local/electron/src/main/sidecars/opencode.ts
  • surfsense_local/electron/src/main/sidecars/python.test.ts
  • surfsense_local/electron/src/main/sidecars/python.ts
  • surfsense_local/electron/src/main/sidecars/types.ts
  • surfsense_local/electron/src/preload/index.ts
  • surfsense_local/frontend/package.json
  • surfsense_local/frontend/src/app/app-bootstrap.test.tsx
  • surfsense_local/frontend/src/components/ui/icons.tsx
  • surfsense_local/frontend/src/features/about/about-settings.tsx
  • surfsense_local/frontend/src/features/about/data-folder.test.tsx
  • surfsense_local/frontend/src/features/about/data-folder.tsx
  • surfsense_local/frontend/src/features/agent/agent-thread.test.tsx
  • surfsense_local/frontend/src/features/agent/api.ts
  • surfsense_local/frontend/src/features/agent/plugins-unavailable.tsx
  • surfsense_local/frontend/src/features/chat/chat-composer.test.tsx
  • surfsense_local/frontend/src/features/chat/chat-error-text.ts
  • surfsense_local/frontend/src/features/chat/claude-code-refusal.ts
  • surfsense_local/frontend/src/features/chat/extra-usage/extra-usage-notice.tsx
  • surfsense_local/frontend/src/features/chat/extra-usage/extra-usage-store.test.ts
  • surfsense_local/frontend/src/features/chat/extra-usage/extra-usage-store.ts
  • surfsense_local/frontend/src/features/chat/extra-usage/use-selected-on-claude-plan.ts
  • surfsense_local/frontend/src/features/chat/model-issue-notice.test.tsx
  • surfsense_local/frontend/src/features/chat/model-issue-notice.tsx
  • surfsense_local/frontend/src/features/chat/runs/apply-frame.ts
  • surfsense_local/frontend/src/features/chat/sse.ts
  • surfsense_local/frontend/src/features/chat/thread-panel.tsx
  • surfsense_local/frontend/src/features/chat/use-chat-runtime.test.tsx
  • surfsense_local/frontend/src/features/chat/use-chat-runtime.ts
  • surfsense_local/frontend/src/features/dashboard/dashboard-page.tsx
  • surfsense_local/frontend/src/features/egress/api.ts
  • surfsense_local/frontend/src/features/egress/ask-egress.ts
  • surfsense_local/frontend/src/features/egress/egress-prompt.test.tsx
  • surfsense_local/frontend/src/features/egress/egress-prompt.tsx
  • surfsense_local/frontend/src/features/egress/network-settings.tsx
  • surfsense_local/frontend/src/features/models/add-model/add-model-options.tsx
  • surfsense_local/frontend/src/features/models/local/chat/download-chat-models.test.tsx
  • surfsense_local/frontend/src/features/models/local/chat/model-search.tsx
  • surfsense_local/frontend/src/features/models/remote/connections/api.ts
  • surfsense_local/frontend/src/features/models/remote/connections/chatgpt/api.ts
  • surfsense_local/frontend/src/features/models/remote/connections/claude/api.ts
  • surfsense_local/frontend/src/features/models/remote/connections/claude/claude-dialog.tsx
  • surfsense_local/frontend/src/features/models/remote/connections/claude/claude-option.test.tsx
  • surfsense_local/frontend/src/features/models/remote/connections/claude/claude-option.tsx
  • surfsense_local/frontend/src/features/models/remote/connections/claude/claude-plan-edit.test.tsx
  • surfsense_local/frontend/src/features/models/remote/connections/claude/claude-plan-edit.tsx
  • surfsense_local/frontend/src/features/models/remote/connections/connection-form.tsx
  • surfsense_local/frontend/src/features/models/remote/connections/use-connections.test.tsx
  • surfsense_local/frontend/src/features/models/remote/connections/use-connections.ts
  • surfsense_local/frontend/src/features/models/remote/models/server-models.tsx
  • surfsense_local/frontend/src/features/models/remote/models/try-model-dialog.test.tsx
  • surfsense_local/frontend/src/features/models/remote/models/try-model-dialog.tsx
  • surfsense_local/frontend/src/features/models/remote/models/use-connection-models.ts
  • surfsense_local/frontend/src/features/models/remote/voices/server-voices.tsx
  • surfsense_local/frontend/src/features/office-support/office-support-settings.test.tsx
  • surfsense_local/frontend/src/features/office-support/office-support-settings.tsx
  • surfsense_local/frontend/src/features/onboarding/model-step/local/local-model-list.tsx
  • surfsense_local/frontend/src/features/onboarding/model-step/model-step.tsx
  • surfsense_local/frontend/src/features/onboarding/onboarding-page.test.tsx
  • surfsense_local/frontend/src/features/onboarding/onboarding-page.tsx
  • surfsense_local/frontend/src/features/plugins/add-custom/add-plugin-dialog.tsx
  • surfsense_local/frontend/src/features/plugins/api.ts
  • surfsense_local/frontend/src/features/plugins/browse/connect-listed-plugin.tsx
  • surfsense_local/frontend/src/features/plugins/browse/registry-headers-dialog.tsx
  • surfsense_local/frontend/src/features/plugins/browse/registry-key-dialog.tsx
  • surfsense_local/frontend/src/features/plugins/browse/registry-plugins.tsx
  • surfsense_local/frontend/src/features/plugins/browse/saved-plugin-status.tsx
  • surfsense_local/frontend/src/features/plugins/connect-toasts.ts
  • surfsense_local/frontend/src/features/plugins/connection/connection-editor.tsx
  • surfsense_local/frontend/src/features/plugins/connection/connection-headers.ts
  • surfsense_local/frontend/src/features/plugins/connection/edit-connection-button.tsx
  • surfsense_local/frontend/src/features/plugins/connection/scrolling-dialog.ts
  • surfsense_local/frontend/src/features/plugins/details/connect-plugin-button.tsx
  • surfsense_local/frontend/src/features/plugins/details/edit-headers-button.tsx
  • surfsense_local/frontend/src/features/plugins/details/plugin-actions-menu.tsx
  • surfsense_local/frontend/src/features/plugins/details/plugin-details-card.tsx
  • surfsense_local/frontend/src/features/plugins/details/plugin-main-action.tsx
  • surfsense_local/frontend/src/features/plugins/details/plugin-status-line.tsx
  • surfsense_local/frontend/src/features/plugins/details/plugin-tool-row.tsx
  • surfsense_local/frontend/src/features/plugins/details/registry-submission.ts
  • surfsense_local/frontend/src/features/plugins/details/replace-key-button.tsx
  • surfsense_local/frontend/src/features/plugins/headers/filled-headers.ts
  • surfsense_local/frontend/src/features/plugins/headers/header-rows.tsx
  • surfsense_local/frontend/src/features/plugins/in-thread/plugin-step-line.test.tsx
  • surfsense_local/frontend/src/features/plugins/not-connected.ts
  • surfsense_local/frontend/src/features/plugins/open-plugin.ts
  • surfsense_local/frontend/src/features/plugins/plugins-settings.test.tsx
  • surfsense_local/frontend/src/features/plugins/plugins-settings.tsx
  • surfsense_local/frontend/src/features/plugins/refusal-message.ts
  • surfsense_local/frontend/src/features/plugins/sign-in/opened-sign-in.ts
  • surfsense_local/frontend/src/features/plugins/sign-in/own-app/callback-address.tsx
  • surfsense_local/frontend/src/features/plugins/sign-in/own-app/own-app-button.tsx
  • surfsense_local/frontend/src/features/plugins/sign-in/own-app/own-app-dialog.tsx
  • surfsense_local/frontend/src/features/plugins/sign-in/own-app/own-app-draft.ts
  • surfsense_local/frontend/src/features/plugins/sign-in/own-app/own-app-fields.tsx
  • surfsense_local/frontend/src/features/plugins/sign-in/own-app/own-app-reason.ts
  • surfsense_local/frontend/src/features/plugins/sign-in/own-app/plugin-own-app-dialog.tsx
  • surfsense_local/frontend/src/features/plugins/sign-in/sign-in-again-button.tsx
  • surfsense_local/frontend/src/features/plugins/sign-in/sign-in-failure-text.ts
  • surfsense_local/frontend/src/features/plugins/sign-in/sign-in-progress.tsx
  • surfsense_local/frontend/src/features/plugins/sign-in/use-plugin-sign-in.ts
  • surfsense_local/frontend/src/features/plugins/third-party-held.ts
  • surfsense_local/frontend/src/features/plugins/yours/connect-reason.ts
  • surfsense_local/frontend/src/features/plugins/yours/connected-plugins-table.tsx
  • surfsense_local/frontend/src/features/plugins/yours/plugin-status.ts
  • surfsense_local/frontend/src/features/plugins/yours/status-tone.ts
  • surfsense_local/frontend/src/features/plugins/yours/your-plugins.tsx
  • surfsense_local/frontend/src/features/sources/note-editor-dialog.tsx
  • surfsense_local/frontend/src/features/sources/rename-source-dialog.tsx
  • surfsense_local/frontend/src/features/sources/tree/folder-name-dialog.tsx
  • surfsense_local/frontend/src/features/sources/tree/move-to-dialog.tsx
  • surfsense_local/frontend/src/features/speech-setup/speech-setup-popover.test.tsx
  • surfsense_local/frontend/src/features/studio/refine-box.tsx
  • surfsense_local/frontend/src/lib/api.ts
  • surfsense_local/frontend/translations/de.json
  • surfsense_local/frontend/translations/en.json
  • surfsense_local/frontend/translations/es.json
  • surfsense_local/frontend/translations/fr.json
  • surfsense_local/frontend/translations/hi.json
  • surfsense_local/frontend/translations/ja.json
  • surfsense_local/frontend/translations/ko.json
  • surfsense_local/frontend/translations/pt-BR.json
  • surfsense_local/frontend/translations/ru.json
  • surfsense_local/frontend/translations/zh-CN.json
  • surfsense_web/app/(home)/downloads/download-panels.tsx
  • surfsense_web/app/(home)/external-mcp-connectors/page.tsx
  • surfsense_web/app/(home)/login/GoogleLoginButton.tsx
  • surfsense_web/app/(home)/login/LocalLoginForm.tsx
  • surfsense_web/app/(home)/login/page.tsx
  • surfsense_web/app/(home)/mcp-server/page.tsx
  • surfsense_web/app/(home)/plugins/page.tsx
  • surfsense_web/app/(home)/plugins/plugin-browser.tsx
  • surfsense_web/app/(home)/plugins/plugin-card.tsx
  • surfsense_web/app/(home)/plugins/plugin-list.ts
  • surfsense_web/app/(home)/plugins/registry-plugins.ts
  • surfsense_web/app/(home)/register/page.tsx
  • surfsense_web/components/contact/contact-sections.tsx
  • surfsense_web/components/homepage/home/home-announcement.tsx
  • surfsense_web/components/homepage/home/home-button.tsx
  • surfsense_web/components/homepage/home/home-confidential/home-confidential.tsx
  • surfsense_web/components/homepage/home/home-download-button.tsx
  • surfsense_web/components/site/site-nav.tsx
  • surfsense_web/components/site/site-socials.tsx
  • surfsense_web/components/ui/icons.tsx
  • surfsense_web/lib/app-release.ts

You can disable this status message by setting the reviews.review_status to false in the CodeRabbit configuration file.

  • Autofix · Keep fixing CodeRabbit findings and required CI, and resolving merge conflicts

Thanks for using CodeRabbit! It's free for OSS, and your support helps us grow. If you like it, consider giving us a shout-out.

❤️ Share

Comment @coderabbitai help to get the list of available commands.

@AnishSarkar22
AnishSarkar22 merged commit 08e915c into main Oct 21, 2026
41 of 43 checks passed

This branch was successfully deployed

1 active deployment
Preview — ed14a1df Deployed Oct 21, 2026 by vercel[bot]
Sign up for free to join this conversation on GitHub. Already have an account? Sign in to comment

Labels

None yet

Projects

None yet

Development

Successfully merging this pull request may close these issues.

5 participants