Commit graph

10854 commits

Author SHA1 Message Date
DESKTOP-RTLN3BA\$punk
4dd3ce2f66 docs: cover the work since 2.1.0 so others can pick it up
- chat.md, overview.md: how a streamed token renders only the live reply
  (runSummaries, the 32 ms notice gap, LiveThreadRuntime, the bounded
  highlighter, memoized panels) and that the columns resize.
- model-capabilities.md, agent.md, data-model.md, 07-dev-setup.md: the two
  chat modes, their gates and defaults, where a pick is stored, the 0-id fix,
  and how to re-run the OpenRouter sweep and regenerate capabilities.json.
- RELEASE.md: the steps 2.2.0 was released by, from the bump (with its
  PowerShell form) to the tag on the merge, the Known issues, an optional
  update check and publishing with --latest; dry runs are signed.
- 06-repo-readme.md, AGENTS.md, README.md's comment: the README's structure,
  how to change it and its translations, re-checking the format table, and
  replacing the demo video.
- Stale statements fixed (the Apple agreement, opencode never shipped, three
  languages, Studio's exec(), proposal statuses, the roadmap), and each gap
  still open after the release in its doc's Known gaps, linked to #2219-#2230.
2026-10-11 17:55:51 -07:00
DESKTOP-RTLN3BA\$punk
f6a3c97272 data(capability): commit the OpenRouter sweep's input and its two runs
capability_list/sweep/openrouter-screen-v1.json is the input the shipped
list's 259 openrouter-screen and assumed rows come from: the screen of 7 and
8 Oct 2026 with the 18 models re-run after the optional-id-0 fix in place of
their first verdicts. With only the ladder's rows in capabilities.json,
catalog_rows.py on it writes the shipped list back unchanged.

Its two runs are beside it under sweep/runs/, each a sweep-results.json and
its attempts.jsonl, with the listing's absolute path made repo-relative. The
run folders, about 840 MB of transcripts and files, stay out.
2026-10-11 17:55:51 -07:00
Rohan Verma
7a41fcce36
Merge pull request #2184 from Cedric921/fix/office-formats-on-script-runner
fix(local): run Studio's PowerPoint and Excel scripts in the script runner
2026-10-11 16:33:17 -07:00
Rohan Verma
6b6e21d304
Merge pull request #2209 from ybai08/feat/embedder-repo-codes
feat(local): give an embedder repo's refusal a code the interface can translate
2026-10-11 16:16:41 -07:00
Rohan Verma
b2b99c8181
Merge pull request #2215 from llwand1/refactor/docker-03-sidecar-boot
refactor(sidecars): move boot and the watchers out of index.ts
2026-10-11 16:11:40 -07:00
11w
d730e643c4 docs(sidecars): add JSDoc to boot, supervisor and watcher functions 2026-10-11 09:49:18 +08:00
Anish Sarkar
52f51cbb5b
Merge pull request #2216 from AnishSarkar22/feat/plugins
docs(plugins): one plugin host, two plugin lists, bundle code moved aside
2026-10-10 21:29:34 +05:30
Anish Sarkar
3ca8167b4d docs(plugins): give each plugin kind its own folder in the app
The app's plugin module mirrors plugins/: what every kind shares at the
top (routes, gateway, installed, results), both plugin lists in lists/,
the remote kind in remote/ (MCP client, sign-in, RemoteMcpSource), and
bundles in bundles/. The license key, SurfSense's row in who can publish
what, and withdrawing a built-in plugin now cover bundles as well as
remote plugins.

Co-Authored-By: Claude Opus 5.5 <noreply@anthropic.com>
2026-10-10 21:25:39 +05:30
Anish Sarkar
09c35da112 refactor(plugins): move the desktop bundle runner under modules/plugins/bundles
The earlier design's runner, its plugin_runs model, task and stop
helpers move from modules/plugins/ to modules/plugins/bundles/, with
their tests, mirroring plugins/bundles/. modules/plugins/ is left for
the remote plugin code. Docs and links follow the move. No behaviour
change.

Co-Authored-By: Claude Opus 5.5 <noreply@anthropic.com>
2026-10-10 21:16:49 +05:30
Anish Sarkar
58d91c9e79 docs(plugins): list SurfSense's plugins in the app, others in the registry
SurfSense's plugins are listed in a built-in list packaged into the app
and shown with no network or consent. The registry holds only partners'
and community plugins; the app fetches it, signed, when the user turns
on other publishers, and no installer carries it. Only the built-in list
can say `surfsense` or carry `license`, and no list holds plugin code,
so the app does not grow with plugins. ADR 0053 records the split.

Co-Authored-By: Claude Opus 5.5 <noreply@anthropic.com>
2026-10-10 20:57:45 +05:30
Anish Sarkar
f804a704c9 docs(plugins): run SurfSense's plugins on one plugin host
SurfSense's plugins, free and paid, run in one container on Azure
Container Apps at plugins.surfsense.com, which also serves the signed
registry. Their code moves to plugins/remote/, with paid code in
plugins/remote/proprietary/: the folder decides the license, `access`
the price. The registry ships with the app and shows with no consent.
ADR 0054 records the change and supersedes ADR 0047 in part.

Co-Authored-By: Claude Opus 5.5 <noreply@anthropic.com>
2026-10-10 20:28:56 +05:30
Anish Sarkar
602e13d98c refactor(plugins): move the bundle tooling under plugins/bundles
Plugins are being built as remote MCP servers first. The earlier, local
design's SDK, CLI, manifest rules and example move from plugins/core/ and
plugins/example/ to plugins/bundles/, deferred with bundles, so the top of
plugins/ is free for the plugin host and the registry. No behaviour change.

Co-Authored-By: Claude Opus 5.5 <noreply@anthropic.com>
2026-10-10 20:19:47 +05:30
NiuWa
d992b72973 refactor(sidecars): move boot and the watchers out of index.ts
bootSidecars() moves to sidecars/boot.ts and takes its paths, the packaged flag and the secret as a BootContext, instead of reading app, process.resourcesPath and safeStorage. The three watchers get their own files and tests. index.ts builds the context from Electron and passes the crash notice to the window in as the crash handler.

Nothing under sidecars/ imports electron, so the container can run the same code.

Fixes #2103
2026-10-10 20:21:19 +08:00
DESKTOP-RTLN3BA\$punk
36cb688d05 feat(release): 2.2.0
Some checks failed
Build and Push Docker Images / image_version (push) Has been cancelled
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) Has been cancelled
Build and Push Docker Images / build (./docker/sandbox, cpu, ./docker/sandbox/Dockerfile, sandbox, surfsense-sandbox, ubuntu-latest, linux/amd64, amd64, , false, cpu) (push) Has been cancelled
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) Has been cancelled
Build and Push Docker Images / build (./surfsense_backend, cpu, ./surfsense_backend/Dockerfile, backend, surfsense-backend, ubuntu-latest, linux/amd64, amd64, , production, false, cpu) (push) Has been cancelled
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) Has been cancelled
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) Has been cancelled
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) Has been cancelled
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) Has been cancelled
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) Has been cancelled
Build and Push Docker Images / build (./surfsense_web, cpu, ./surfsense_web/Dockerfile, web, surfsense-web, ubuntu-latest, linux/amd64, amd64, , runner, false, cpu) (push) Has been cancelled
Build and Push Docker Images / verify_digests (push) Has been cancelled
Build and Push Docker Images / create_manifest (backend, surfsense-backend, , cpu) (push) Has been cancelled
Build and Push Docker Images / create_manifest (backend, surfsense-backend, -cuda, cuda) (push) Has been cancelled
Build and Push Docker Images / create_manifest (backend, surfsense-backend, -cuda126, cuda126) (push) Has been cancelled
Build and Push Docker Images / create_manifest (sandbox, surfsense-sandbox, , cpu) (push) Has been cancelled
Build and Push Docker Images / create_manifest (web, surfsense-web, , cpu) (push) Has been cancelled
2026-10-09 14:31:04 -07:00
Rohan Verma
1a7575811d
Merge pull request #2212 from MODSetter/dev_mod
docs(readme): a shorter README led by the format table, translated into ten languages
2026-10-09 13:53:48 -07:00
DESKTOP-RTLN3BA\$punk
870cf21633 docs(readme): bring the ten translated READMEs up to the new layout
Each README.<locale>.md is now a full translation of README.md, section for
section: the format table, Quick start, the demo video, the comparison and
Star history. Each one keeps its earlier register and terms, names what the
app shows with the app's own translation of that string, and links its nav
to its own translated headings. Arabic, which the app does not translate,
gives the English UI name in parentheses.
2026-10-09 13:52:44 -07:00
DESKTOP-RTLN3BA\$punk
25db53c2b6 docs(readme): fix the English slips and the stale maintainer notes
Capitalise NotebookLM, hyphenate privacy-focused, end the licence line with a
full stop and put a blank line before Quick start. The top comment drops the
Quick start image notes, since those images are gone, and says every
README.<locale>.md follows this file section for section.
2026-10-09 13:52:44 -07:00
Anish Sarkar
ec0c387568
Merge pull request #2211 from AnishSarkar22/fix/composer-ui-changes
feat(chat): simplify the composer's mode menus and hide model capability tags in production
2026-10-10 02:09:46 +05:30
DESKTOP-RTLN3BA\$punk
3f8381728a docs(readme): remove self-hosting note from README 2026-10-09 13:38:12 -07:00
Anish Sarkar
d402901054 feat(chat): list both modes in an open chat's mode menu
An open chat's menu now shows the same Basic and Agentic rows as a new chat,
with its own mode checked and the other marked "New chat". The doc also says
the model picker's capability tags show only in dev builds.

Co-Authored-By: Claude Opus 5.5 <noreply@anthropic.com>
2026-10-10 02:07:45 +05:30
DESKTOP-RTLN3BA\$punk
83b3aaa5e4 docs(readme): updated readme 2026-10-09 13:37:01 -07:00
Anish Sarkar
f3029a2161 feat(chat): tag an untested Agentic in the new chat's mode menu
Each mode gets a short line. An Agentic that did not pass carries a tag, and
its reason or gate shows in a tooltip beside the row, as the add menu does.

Co-Authored-By: Claude Opus 5.5 <noreply@anthropic.com>
2026-10-10 01:59:15 +05:30
Anish Sarkar
fef489c92c fix(chat): drop the Agentic note under the composer, show model levels only in dev
The mode menu already says each model's Agentic reason, so the line under a
new chat's composer repeated it. The model picker's capability label is now a
dev-only badge.

Co-Authored-By: Claude Opus 5.5 <noreply@anthropic.com>
2026-10-10 01:58:55 +05:30
DESKTOP-RTLN3BA\$punk
2ccb2af69d docs(readme): show the contract redline demo under the header
The hero GIF placeholder becomes the recorded demo: the agent revises a city
contract as a copy, with tracked changes and a comment on each change. The
video is a GitHub upload that plays inline; the top comment says how to
replace it.
2026-10-09 13:25:44 -07:00
DESKTOP-RTLN3BA\$punk
7453104b22 docs(readme): lead with what the agent does to each format, add a Quick start
The README is shorter and leads with a table of the file formats SurfSense
reads, makes, edits as a copy and transforms. A five-step Quick start, from
install to a cited answer and a Word file from Studio, replaces the old one.
Private by default and Models are gone; Star history stays.

Only the English README changes. The translations still follow the old layout.
The hero GIF and the five Quick start images are still to record; a comment
above each one says what to show.
2026-10-08 17:36:49 -07:00
Anish Sarkar
c5ff7938a2
Merge pull request #2206 from AnishSarkar22/feat/plugins
docs(plugins): redesign plugins as MCP servers behind one tool gateway
2026-10-09 03:47:34 +05:30
Anish Sarkar
85516877c8 Merge remote-tracking branch 'upstream/dev' into feat/plugins 2026-10-09 03:45:28 +05:30
Anish Sarkar
6128d2aed1 docs(plugins): keep the shared license check in plugins/proprietary 2026-10-09 03:41:42 +05:30
Anish Sarkar
5cab8adf7c docs(plugins): fix contradictions and tighten the proposal 2026-10-09 03:36:07 +05:30
ybai08
14627e28d8 feat(local): give an embedder repo's refusal a code the interface can translate
An opened Hugging Face embedder repo that cannot run says why in a sentence
the backend words, so it was English in every language. Four of its five
refusals now carry a NotAnEmbedderCode in the row's not_runnable_code:
gated, no ONNX build, no tokenizer.json, flagged by Hugging Face's scan.
The interface has a line for each, in ten languages. The fifth names a
file and keeps travelling as its English sentence.

Refs #1967
2026-10-08 16:59:57 -05:00
Cedric Karungu
566cf29595 refactor(local): share one attempt loop between Studio's script formats 2026-10-08 23:50:44 +02:00
Anish Sarkar
5b481eb4ae docs(plugins): split the proposal into core, remote and bundles 2026-10-09 03:16:21 +05:30
Rohan Verma
41a978899c
Merge pull request #2208 from ybai08/test/office-pack-staging-on-macos
test(local): find the office pack's staging folder on macOS too
2026-10-08 14:44:25 -07:00
Cedric Karungu
b4fc4fce2d Merge branch 'dev' of github.com:MODSetter/SurfSense into fix/office-formats-on-script-runner
# Conflicts:
#	docs/architecture/egress.md
#	docs/architecture/studio.md
#	docs/proposals/file-agent/05-model-ladder-and-evals.md
2026-10-08 23:43:58 +02:00
Rohan Verma
eddb039ad0
Merge pull request #2205 from Ehaan-Dadarkar/fix/main-warnings-to-session-log
feat(desktop): route main process warnings into the session log
2026-10-08 14:42:52 -07:00
Rohan Verma
c0690121d2
Merge pull request #2204 from Ehaan-Dadarkar/fix/model-search-followup
perf(models): follow-ups to search debounce and cache
2026-10-08 14:42:44 -07:00
Rohan Verma
a2573731a4
Merge pull request #2200 from ybai08/feat/not-runnable-codes
feat(local): give a model that cannot run a code the interface can translate
2026-10-08 14:41:05 -07:00
Rohan Verma
99a92ace86
Merge pull request #2174 from Cedric921/fix/chatgpt-revoke-on-sign-in-again
fix(local): revoke the grant a ChatGPT sign-in replaces
2026-10-08 14:38:45 -07:00
Rohan Verma
9acbaf0aae
Merge pull request #2173 from Cedric921/fix/agent-thread-thinking-switch
fix(local): offer no thinking switch in an agent thread
2026-10-08 14:38:38 -07:00
Anish Sarkar
2983412b96 docs(plugins): check the license on the server and keep paid plugins under BSL 2026-10-09 03:04:35 +05:30
ybai08
71e6f4be10 test(local): find the office pack's staging folder on macOS too
The test read the staging folder as the program's grandparent, which it
is on Windows and Linux (program/soffice). On macOS the program is
Contents/MacOS/soffice, the grandparent is Contents, and the test
failed.
2026-10-08 16:23:42 -05:00
Rohan Verma
42c1390572
Merge pull request #2202 from 8rulerstar/docs/0027-test-name
docs(local): name the 0027 migration test in data-model.md
2026-10-08 14:17:59 -07:00
Rohan Verma
6a00c36fc0
Merge pull request #2201 from ybai08/test/source-upload-tooltip-closed
test(local): wait for the error tooltip to close, not for its text to change
2026-10-08 14:17:52 -07:00
Cedric Karungu
1e8b7e2786 Merge branch 'dev' of github.com:MODSetter/SurfSense into fix/agent-thread-thinking-switch
# Conflicts:
#	surfsense_local/frontend/src/features/chat/chat-composer.tsx
2026-10-08 23:15:26 +02:00
Rohan Verma
2f5e1a2f24
Merge pull request #2207 from MODSetter/dev_mod
Basic (Q&A) and Agentic modes, a 270-model tested list, and the agent in installers
2026-10-08 14:08:40 -07:00
DESKTOP-RTLN3BA\$punk
4330d89783 Merge remote-tracking branch 'origin/dev' into slice/release-modes 2026-10-08 13:46:16 -07:00
DESKTOP-RTLN3BA\$punk
f93b46ce87 fix(capability): keep the ladder's own source line in the shipped list
The list is written by its generators only, which keep the ladder's
source; the sweep is described in model-capabilities.md.
2026-10-08 13:45:29 -07:00
DESKTOP-RTLN3BA\$punk
47bf1fa155 feat(capability): take the re-run verdicts of the models an id of 0 had failed
With an optional id of 0 left out, 18 OpenAI and Grok models ran the
screening again: o3, GPT-4.1, GPT-5 mini, GPT-5.4 mini, GPT-5.1 Codex
mini, GPT-5.6 Luna Pro, GPT-6 Luna and both Grok models now pass both
cases and start chats in Agentic. 106 screened models are now agent, 102
below.
2026-10-08 13:36:28 -07:00
Anish Sarkar
4a5b009ccd docs(plugins): turn the router on per model and validate its replies
The chat router now decides per model whether it is on by default. It is
on for models that pass the router test, remote models the catalog marks
as supporting structured output, and ChatGPT plan models. It is off
until the user turns it on for unmeasured local models, models the
catalog says nothing about, and custom connections. It never runs on a
model the catalog marks as lacking structured output.

A schema does not guarantee the reply matches it, so every router reply
is now checked against its schema. A choose reply that does not match
counts as none, a fill reply that does not match ends the router with no
call, and three mismatches in a row switch the router off for that model
with a notice. If an @ mention cannot be filled, the composer shows the
tool's inputs as a small form. ADR 0052 is updated to match and notes
that router calls on a ChatGPT plan count against the user's plan.

The plugins README gains a prior-art table (Pi, Claude's connectors,
Obsidian), an order of work, what this design gives up, a
contributor-guide workstream and the offline wording for the interface.
02-registry gains a "who can publish what" table, and bundles/README a
side-by-side comparison of remote and bundle plugins.
2026-10-09 01:58:57 +05:30
Anish Sarkar
a1210061cf docs(plugins): serve one signed plugins.json list from SurfSense's host
Rename the registry file from connectors.json to plugins.json. It is now
the only list: every plugin the app shows is in it, SurfSense's own
included. An entry points to the plugin, and the code stays with its
publisher.

On each merge to main, CI signs the list with Ed25519 and uploads it to
SurfSense's plugin host. The app fetches it from there and checks the
signature against a key built into the app, so new plugins show up
without an app update. The copy in the installer is only used when there
is no network. This replaces the unsigned fetch from
raw.githubusercontent.com.

Describe how bundle entries will work later. A bundle's code and release
files stay in its author's repository. A scanner checks each release and
records its file URLs and sha256s in the entry, and the app refuses any
file whose hash does not match.

Also: a tool whose description changes is switched off again, tool
descriptions are capped at 2,000 characters, and CODEOWNERS requires a
maintainer to approve surfsense and partner entries. ADR 0053, the
plugins and bundles READMEs, 03-remote-plugins and 07-later are updated
to match.
2026-10-09 01:50:03 +05:30