Commit graph

4038 commits

Author SHA1 Message Date
DESKTOP-RTLN3BA\$punk
9704730486 chore(local): release 2.2.2 2026-10-16 14:20:07 -07:00
DESKTOP-RTLN3BA\$punk
fd7f1b9e38 chore: link the new subreddit, r/SurfSenseAI
Every link to r/SurfSense now points at https://www.reddit.com/r/SurfSenseAI/:
the website's navbar (desktop and mobile), the footer socials, the
homepage community strip and its label, the Organization sameAs in the
site's JSON-LD, and the backend's 'Join our Subreddit' incentive task.
2026-10-15 15:44:37 -07:00
DESKTOP-RTLN3BA\$punk
4ad33c4c1e chore(local): release 2.2.1 2026-10-13 22:18:13 -07: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
aleekaz
a671291098 feat(proxy): add NodeMaven provider 2026-10-07 11:47:59 +03:00
Rohan Verma
0edb66be3d
Merge pull request #2123 from Cedric921/test/license-routes
test(license): cover the portal routes, their rate limits and Keygen
2026-10-04 16:56:06 -07:00
Rohan Verma
5abe834b83
Merge pull request #2094 from MohammadHijjawi97/fix/export-comma-and-fullwidth-citations
fix(export): strip every citation marker form from exported chats
2026-10-04 16:56:02 -07:00
Mohammad Hijjawi
74ee908cd1 fix(export): skip numeric citations past the int digit limit 2026-10-04 15:08:04 +01:00
Cedric Karungu
2393df5a51 test(license): cover a trial whose address the mail server refuses 2026-10-04 16:07:28 +02:00
Cedric Karungu
eac149de5d test(license): keep the portal route tests off live Stripe 2026-10-04 16:07:28 +02:00
Cedric Karungu
2163e2cc87 test(license): fake Keygen at its transport and cover the file route
Review of #2123. The route tests faked the license functions under the
routes, so the trial's folded-address refusal and resend skipping a
suspended license never ran. Keygen is now faked at its transport: a
tagged address is refused once the folded one holds a trial, a suspended
license is not mailed, and GET /license/file is covered. The contract
test no longer expects snake_case to miss, since Keygen underscores
every key; it proves a key with another word answers nothing. The email
bucket asserts the whole sequence, and the docs keep a narrowed gap for
the contract test's first live run.
2026-10-04 16:07:27 +02:00
Cedric Karungu
79f44f24e7 test(license): cover the portal routes, their rate limits and Keygen
The route and rate-limit suites were deleted with the fakes they stood on,
leaving the unauthenticated license routes without coverage. Resend and
trial are now driven over HTTP with Keygen and the mailer faked at the
router's imports and the real token bucket on its in-memory fallback, and
an opt-in contract test runs the Keygen client against a real Keygen to
prove the metadata filter spellings.

Refs #1964
2026-10-04 16:07:27 +02:00
Mohammad Hijjawi
d890813bba fix(export): split only numeric citation lists, keep URL payloads whole
_citation_payloads() split every marker payload on commas, URLs
included. The renderer only splits payloads that match its id-list
grammar and keeps a URL citation whole, so
[citation:https://news.example/7,114883,30573452,story.html] produced
chunk ids 114883 and 30573452: the wrong titles were attached, and a
piece >= 2**31 failed to bind to the Integer Chunk.id column and broke
the export.

Split a payload only when it fully matches the renderer's list grammar,
(?:doc-)?-?\d+(?:\s*,\s*(?:doc-)?-?\d+)*, and keep anything else as one
payload. When looking up titles, accept only plain ASCII integer ids in
the 32-bit range, so an oversized numeric id is skipped instead of
failing the query. doc- ids stay unresolved as before (they point at
SurfSense docs chunks, not workspace chunks).

Also apply ruff format to the test file, which the backend-lint hook
checks for every changed file.
2026-10-04 11:35:18 +01:00
CREDO23
791eb63145 chore(local): release 2.1.0 2026-10-03 07:40:31 +02:00
DESKTOP-RTLN3BA\$punk
6d7cf272ff docs(license): say Keygen ignores the case of metadata keys
Keygen v1.7.2 snake-cases every request key on the way in
(config/initializers/jsonapi.rb) and every metadata filter key
(License.search_metadata), and camelCases keys in responses, so
checkoutSessionId and checkout_session_id are one key. What returns an
empty list is a key with a different word. The keygen.py docstring, the
models.py comment and portal.md said filters were case-sensitive, and the
docstring cited a live contract test that does not exist yet.

Co-Authored-By: Claude Opus 5.5 <noreply@anthropic.com>
2026-10-01 15:10:08 -07:00
Rohan Verma
15f7eed50a
Merge pull request #2121 from MODSetter/fix/backend-dependabot-majors
fix(backend): lift the starlette and pyarrow caps, move transformers to 5
2026-09-30 23:43:03 -07:00
Rohan Verma
ee5bd56757
Merge pull request #2120 from MODSetter/fix/backend-dependabot-alerts
fix(backend): patch dependency advisories with lock bumps and floor raises
2026-09-30 23:36:58 -07:00
DESKTOP-RTLN3BA\$punk
035dab5bc8 fix(backend): move transformers to 5.10 to clear its advisories
transformers is transitive (sentence-transformers, docling-ibm-models,
kokoro, unstructured-inference, chonkie, docling-core). None of them caps
it below 5: docling-ibm-models 3.13 declares >=4.42,<6 minus 5.0-5.3,
sentence-transformers 5.6 declares <6. The app does not import
transformers. transformers 5 needs huggingface-hub 1.x.

- transformers 4.57.6 -> 5.10.4 (lowest patched line)
- huggingface-hub 0.36.2 -> 1.20.1 (held to a release from the same
  month as transformers 5.10.4), hf-xet 1.4.2 -> 1.6.0

Checked on Windows against the previous lock: the all-MiniLM-L6-v2
embedding, Kokoro synthesis and Docling's PDF conversion of
tests/fixtures/sample.pdf give identical output.

Advisories cleared:
- transformers 5.10.4: GHSA-29pf-2h5f-8g72, GHSA-69w3-r845-3855,
  GHSA-fgcw-684q-jj6r, GHSA-x9r9-c232-4q39, GHSA-xrqw-3rrv-vx5w

Co-Authored-By: Claude Opus 5.5 <noreply@anthropic.com>
2026-09-30 23:23:01 -07:00
DESKTOP-RTLN3BA\$punk
eae437648d fix(whatsapp-bridge): bump sharp, protobufjs, qs and body-parser
Clears the 7 open Dependabot alerts on
surfsense_backend/scripts/whatsapp-bridge/package-lock.json. All four
packages are transitive, so only the lockfile changes; package.json is
untouched and lockfileVersion stays 3.

sharp 0.34.5 -> 0.35.4 (peer dep of @whiskeysockets/baileys; bundled
libvips 1.2.4 -> 1.3.3)
- GHSA-f88m-g3jw-g9cj (libvips CVE-2026-33327, -33328, -35590, -35591)
- GHSA-rgj7-g3m4-5g8c (libheif)

protobufjs 7.6.1 -> 7.6.6 (via baileys and libsignal)
- GHSA-f38q-mgvj-vph7 (CVE-2026-54269)
- GHSA-j3f2-48v5-ccww (CVE-2026-59877)

qs 6.15.2 -> 6.16.0 (via express and body-parser)
- GHSA-4mjr-xmp4-gh2g (CVE-2026-82417)
- GHSA-x5fp-wj9c-mxmx (CVE-2026-82562)

body-parser 2.2.2 -> 2.3.0 (via express 5.2.1)
- GHSA-v422-hmwv-36x6 (CVE-2026-12590)

Moved along with them: semver 7.8.5 (required by sharp 0.35),
side-channel 1.1.1 (required by qs 6.16), content-type 2.1.0 nested under
body-parser, @emnapi/runtime 1.11.3 (sharp-wasm32), and
@protobufjs/inquire dropped by protobufjs 7.6.6.

sharp 0.35 needs Node >= 20.9.0; the bridge image (node:20-alpine)
ships 20.20.x. sharp 0.35.5 (published 2026-09-27) was skipped as younger
than seven days, so versions were resolved with
npm update --before=2026-09-23.

Deferred: nothing.

Co-Authored-By: Claude Opus 5.5 <noreply@anthropic.com>
2026-09-30 23:23:01 -07:00
DESKTOP-RTLN3BA\$punk
a57201c546 fix(backend): lift the pyarrow cap to clear its advisory
The <19.0.0 cap came in with dbd9c837e ("fix: docker version mismatch",
Dec 2025), which added datasets and pyarrow together and records no
reason for the cap. The Docker image has since been installed strictly
from a uv.lock export, so the drift that commit fought cannot recur.
Nothing in the app imports datasets or pyarrow; datasets was held at
4.0.0 only because every later release needs pyarrow>=21.

- pyarrow >=23.0.1 (lock 18.1.0 -> 23.0.1)
- datasets 4.0.0 -> 5.0.1 in the lock, which also fixes the path
  traversal in folder-based builders (PYSEC-2026-3716, OSV only).

Advisories cleared (uv.lock and pyproject.toml alerts):
- pyarrow 23.0.1: GHSA-rgxp-2hwp-jwgg

Co-Authored-By: Claude Opus 5.5 <noreply@anthropic.com>
2026-09-30 23:23:01 -07:00
DESKTOP-RTLN3BA\$punk
31141702d9 fix(backend): lift the starlette cap to clear its advisories
The <0.51.0 cap and the sse-starlette <3.1.2 pin came in with the MCP
connector (305a981d1) and mirrored FastAPI's own starlette range at the
time (fastapi 0.128 required starlette<0.51.0). FastAPI supports
Starlette 1.x since 0.133.0, so the cap now only blocks security fixes.

- starlette >=1.3.1 (lock 0.50.0 -> 1.3.1), fastapi floor >=0.133.0
  (lock unchanged at 0.135.2), sse-starlette pin lifted (lock unchanged;
  only mcp's server side imports it, the app uses the MCP client).
- The app uses none of the APIs Starlette 1.0 removed (on_event,
  on_startup/on_shutdown, @app.route/@app.middleware/@app.exception_handler
  decorators, TemplateResponse(name, context), FileResponse(method=)).

Advisories cleared (uv.lock and pyproject.toml alerts):
- starlette 1.3.1: GHSA-82w8-qh3p-5jfq, GHSA-86qp-5c8j-p5mr,
  GHSA-jp82-jpqv-5vv3, GHSA-wqp7-x3pw-xc5r, GHSA-x746-7m8f-x49c

Co-Authored-By: Claude Opus 5.5 <noreply@anthropic.com>
2026-09-30 23:23:01 -07:00
DESKTOP-RTLN3BA\$punk
ef92bebf68 fix(backend): patch dependabot alerts with lock bumps and floor raises
Clears 202 of the 224 open Dependabot alerts on surfsense_backend without
application code changes and without lifting a deliberate cap. Versions
are the lowest patched line, capped at releases at least 7 days old.

Manifest changes:
- chonkie[all] -> chonkie[all] minus its vector-store handshakes (chroma,
  qdrant, tpuf, pgvector, weaviate, pinecone, mongodb, elastic, milvus,
  datasets). The app only uses AutoEmbeddings, RecursiveChunker and
  CodeChunker. This drops chromadb, which has no patched release, and
  vecs, whose deprecated==1.2.* -> wrapt<2 pin blocked unstructured>=0.24.
- unstructured[all-docs] -> the same extras minus audio. From 0.24
  all-docs adds openai-whisper (sdist only); audio goes through litellm.
- Raised floors of direct deps to their patched versions: authlib, PyJWT,
  tornado, docling, pypdf, sentence-transformers, langgraph-checkpoint-
  postgres, mcp, unstructured, langchain, litellm, pillow, pytest.

Side effects in the lock: cryptography 50 needs langchain-litellm 0.7.2,
which needs langchain-core 1.6 (langchain 1.3.18, langgraph 1.2.12,
langgraph-sdk 0.4.5); unstructured 0.24 needs wrapt 2, which moves the
OpenTelemetry stack 1.40/0.61b0 -> 1.41.1/0.62b1, and caps pandas <3
(3.0.1 -> 2.3.3); docling 2.94 drops ocrmac/pyobjc (macOS only).
lxml-html-clean 0.4.4 -> 0.4.5 for GHSA-4jhm-jv67-739f (OSV, no alert).

Advisories cleared:
- accelerate 1.15.0: GHSA-4j2p-28q2-5m79
- aiohttp 3.14.3: GHSA-2fqr-mr3j-6wp8, GHSA-4fvr-rgm6-gqmc,
  GHSA-4m7w-qmgq-4wj5, GHSA-63hw-fmq6-xxg2, GHSA-9x8q-7h8h-wcw9,
  GHSA-cq5v-8q36-5273, GHSA-g3cq-j2xw-wf74, GHSA-hg6j-4rv6-33pg,
  GHSA-hpj7-wq8m-9hgp, GHSA-jg22-mg44-37j8, GHSA-m6qw-4cw2-hm4m,
  GHSA-mfx4-hv73-q22v, GHSA-mq44-7p77-q5h7, GHSA-xcgm-r5h9-7989
- anthropic 0.125.0: GHSA-q5f5-3gjm-7mfm, GHSA-w828-4qhx-vxx3
- anyio 4.14.2: GHSA-5p39-cfhj-2xmp, GHSA-82r6-8w77-94w6
- authlib 1.6.12: GHSA-jj8c-mmj3-mmgv, GHSA-r95x-qfjj-fjj2,
  GHSA-w8p2-r796-3vmq
- banks 2.4.5: GHSA-gphh-9q3h-jgpp, GHSA-x8wg-4xgc-vr54
- chromadb (removed): GHSA-2wm9-hf6c-p5cr, GHSA-36p7-vc44-83pf,
  GHSA-f4j7-r4q5-qw2c, GHSA-xph7-9rjv-w5fr
- cryptography 50.0.1: GHSA-537c-gmf6-5ccf, GHSA-g6cj-pr64-35w5,
  GHSA-jwv3-5hgf-82ww, GHSA-m2h6-j472-rp4c, GHSA-p423-j2cm-9vmq
- docling 2.94.0: GHSA-2j5p-7p5m-cvqr, GHSA-cjqg-rq2h-2fvj,
  GHSA-pj2v-ggqh-cmq2, GHSA-q29v-xc37-wh5m, GHSA-r3xg-rg9j-67fv
- docling-core 2.76.0: GHSA-j5xp-7m2f-49jv, GHSA-jmmv-h3mp-59v8
- h2 4.4.1: GHSA-6hr6-w5qg-qmwg
- hpack 4.2.0: GHSA-8v8h-hg4w-mvq2
- httplib2 0.32.0: GHSA-j5g9-f88f-gfj3
- idna 3.15: GHSA-65pc-fj4g-8rjx
- langchain 1.3.18, langchain-anthropic 1.4.8: GHSA-gr75-jv2w-4656
- langchain-classic 1.0.8: GHSA-3644-q5cj-c5c7
- langchain-core 1.6.4: GHSA-926x-3r5x-gfhw, GHSA-pjwx-r37v-7724
- langchain-text-splitters 1.1.2: GHSA-fv5p-p927-qmxr
- langgraph-checkpoint 4.1.1: GHSA-fjqc-hq36-qh5p
- langgraph-checkpoint-postgres 3.1.2: GHSA-47pj-3jcm-6whg
- langgraph-sdk 0.4.5: GHSA-w39p-vh2g-g8g5
- langsmith 0.8.18: GHSA-3644-q5cj-c5c7, GHSA-f4xh-w4cj-qxq8,
  GHSA-rr7j-v2q5-chgv
- litellm 1.88.6: GHSA-3cv6-jpf6-8222
- mako 1.3.12: GHSA-2h4p-vjrc-8xpq, GHSA-v92g-xgxw-vvmm
- mcp 1.30.0: GHSA-hvrp-rf83-w775, GHSA-jpw9-pfvf-9f58,
  GHSA-vj7q-gjh5-988w
- mistune 3.3.4: GHSA-2hm2-hc3v-44h9, GHSA-4j32-57v6-6g45,
  GHSA-58cw-g322-p94v, GHSA-6269-cqxg-mhhv, GHSA-8c25-4j27-2rv3,
  GHSA-8g87-j6q8-g93x, GHSA-8mp2-v27r-99xp, GHSA-8mpj-m6qm-5qr8,
  GHSA-c8j7-8cv4-2xmq, GHSA-ccfx-mfmx-2fx9, GHSA-ffq3-xpv3-j92q,
  GHSA-g97x-gvcm-x72h, GHSA-qcq2-496w-v96p, GHSA-qfrw-5rxm-mhh2,
  GHSA-r4rv-85jg-w4mf, GHSA-v87v-83h2-53w7
- nltk 3.10.3: GHSA-3gq4-3j92-5w49, GHSA-3gqm-fcw5-w839,
  GHSA-568f-pv23-39p4, GHSA-6hm5-jgcp-p838, GHSA-6hwm-xvph-95vm,
  GHSA-6ww7-3frv-cqxh, GHSA-8mpw-7fpc-4gqj, GHSA-97qj-x29f-37w7,
  GHSA-cv22-g7mw-8v73, GHSA-cw6x-m8jw-qmrh, GHSA-f794-5jv7-7672,
  GHSA-ff5c-cp5c-9wjf, GHSA-fg7f-2386-8897, GHSA-m42h-3232-vpv3,
  GHSA-m4rf-3fr8-xwx3, GHSA-p3m8-78j2-g5p3, GHSA-p4gq-832x-fm9v,
  GHSA-p4rw-rvv2-7xwr, GHSA-qvv7-cg9c-w4x3, GHSA-qx2g-xrx7-vfh8,
  GHSA-rhp5-r9x4-f5g2, GHSA-rrv8-h7p8-rx55, GHSA-vp2x-qp44-57v7,
  GHSA-w3v8-gmh9-3wv7, GHSA-ww6m-cw3f-q94g, GHSA-x5ph-mj9p-rfr8,
  GHSA-x99w-6fgc-pmfw, GHSA-xh95-f55m-82fw
- onnx 1.22.0: GHSA-538c-55jv-c5g9, GHSA-cmw6-hcpp-c6jp,
  GHSA-hqmj-h5c6-369m, GHSA-hwpq-hmq9-wj77, GHSA-p433-9wv8-28xj,
  GHSA-p893-rvq9-2xf9, GHSA-q56x-g2fj-4rj6
- pillow 12.3.0: GHSA-45hq-cxwh-f6vc, GHSA-4x4j-2g7c-83w6,
  GHSA-5x94-69rx-g8h2, GHSA-5xmw-vc9v-4wf2, GHSA-62p4-gmf7-7g93,
  GHSA-6r8x-57c9-28j4, GHSA-8v84-f9pq-wr9x, GHSA-9hw9-ch79-4vh6,
  GHSA-fj7v-r99m-22gq, GHSA-jjj6-mw9f-p565, GHSA-pg7v-jwj7-p798,
  GHSA-phj9-mv4w-65pm, GHSA-pwv6-vv43-88gr, GHSA-r73j-pqj5-w3x7,
  GHSA-vjc4-5qp5-m44j, GHSA-whj4-6x5x-4v2j, GHSA-wjx4-4jcj-g98j,
  GHSA-xj96-63gp-2gmr
- pyasn1 0.6.4: GHSA-8ppf-4f7h-5ppj, GHSA-hm4w-wwcw-mr6r,
  GHSA-m4p7-r5rc-7g4j
- pydantic-settings 2.14.2: GHSA-4xgf-cpjx-pc3j
- pygments 2.20.0: GHSA-5239-wwwm-4pmq
- pyjwt 2.15.0: GHSA-2gx3-rcp4-g85q, GHSA-42vr-xj54-vc7v,
  GHSA-993g-76c3-p5m4, GHSA-9v7f-9g4p-ffgj, GHSA-ffc3-869f-jxw9,
  GHSA-fhv5-28vv-h8m8, GHSA-gvp8-978c-rx2q, GHSA-hxm8-2xgr-2p9m,
  GHSA-jq35-7prp-9v3f, GHSA-jwrc-g2q2-pq5p, GHSA-p4g4-x82p-q773,
  GHSA-w6j9-cwv2-h6wq, GHSA-w7vc-732c-9m39, GHSA-xgmm-8j9v-c9wx
- pypdf 6.16.2: GHSA-23w6-3w8w-8484, GHSA-248m-82v9-q6g6,
  GHSA-3crg-w4f6-42mx, GHSA-4pxv-j86v-mhcw, GHSA-52x6-gq3r-vpf4,
  GHSA-55h5-xmcq-c37v, GHSA-5hgr-hg42-57jg, GHSA-5qjq-93h5-hrgp,
  GHSA-5xf7-4p34-54qr, GHSA-763m-79hh-57f2, GHSA-7gw9-cf7v-778f,
  GHSA-cj93-chg6-vgv8, GHSA-fc8x-2rww-xw9m, GHSA-fp3f-mc75-235c,
  GHSA-fwg2-594c-jp42, GHSA-g867-7843-wf8q, GHSA-g9xf-7f8q-9mcj,
  GHSA-j543-4vmf-qm7v, GHSA-jj6c-8h6c-hppx, GHSA-jm82-fx9c-mx94,
  GHSA-jp53-mhqp-8xcg, GHSA-m2v9-299j-rv96, GHSA-wjqc-6w8f-h24c,
  GHSA-x284-j5p8-9c5p
- pytest 9.0.3: GHSA-6w46-j5rx-g56g
- python-multipart 0.0.32: GHSA-5rvq-cxj2-64vf, GHSA-6jv3-5f52-599m,
  GHSA-mj87-hwqh-73pj, GHSA-pp6c-gr5w-3c5g, GHSA-v9pg-7xvm-68hf,
  GHSA-vffw-93wf-4j4q
- sentence-transformers 5.6.1: GHSA-jhr6-gm9c-rqjv
- soupsieve 2.9.2: GHSA-2wc2-fm75-p42x, GHSA-836r-79rf-4m37,
  GHSA-gjv8-xp57-g29c, GHSA-j934-xhv5-fg8f
- tornado 6.5.10: GHSA-3hv7-mjh2-fv65, GHSA-3x9g-8vmp-wqvf,
  GHSA-8423-8fgw-73vq, GHSA-c2m8-h5v5-343r, GHSA-chx6-46f5-w4vp,
  GHSA-cx3h-4qpv-8hc9, GHSA-mgf9-4vpg-hj56, GHSA-mpf4-983q-p7j4,
  GHSA-pw6j-qg29-8w7f, GHSA-wwv5-g3v4-889x
- unstructured 0.24.1: GHSA-4mvj-m6j5-pmf7
- urllib3 2.8.0: GHSA-8988-9cw3-xx77, GHSA-gh4c-6fx4-qh6g,
  GHSA-mf9v-mfxr-j63j, GHSA-qccp-gfcp-xxvc, GHSA-vxq7-64xx-v4gw

Deferred:
- starlette (10 alerts incl. pyproject.toml) and pyarrow (2): need the
  deliberate <0.51.0 / <19.0.0 caps lifted; done in a follow-up branch.
- torch (GHSA-rrmf-rvhw-rf47) and setuptools (GHSA-h35f-9h28-mq5c):
  torch==2.11.0 pins setuptools<82; needs the torch/torchvision pin bump.
- transformers (5 alerts): needs the 4.x -> 5.x major.
- oauthlib (GHSA-hj66-6f7g-4r5v, GHSA-xpv3-w29h-x7cv): the only fix,
  4.0.0, is a major published 2026-09-28; wait out the 7-day window.
- nltk GHSA-8mgp-746c-j5xp: affects <=3.10.3, the latest release.

Co-Authored-By: Claude Opus 5.5 <noreply@anthropic.com>
2026-09-30 23:23:00 -07:00
Rohan Verma
ed1da3af0a
Merge pull request #2093 from MohammadHijjawi97/fix/export-unique-document-paths
fix(export): give each exported document its own path
2026-09-30 17:52:54 -07:00
Claude
3938ab1a5e
Merge remote-tracking branch 'origin/dev' into claude/modest-einstein-7an8yq
# Conflicts:
#	docs/architecture/license/portal.md
2026-09-30 23:29:03 +00:00
Claude
cc8edf87b6
fix(license): refuse trial emails on the disposable-email-domains list
The trial check refused 20 hand-picked domains by exact match, so trial
spam walked around it with any other throwaway provider, any subdomain
of a listed one, or a punycode spelling.

Refuse the community disposable-email-domains list (~9.2k domains, CC0),
installed as its official PyPI package and pinned in uv.lock, plus the
three hand-picked domains it lacks. Match every parent domain short of
the TLD, as upstream requires, and look up the punycode form, since
EmailStr hands the route Unicode. Purchases and resends are unaffected.

Co-Authored-By: Claude Opus 5.5 <noreply@anthropic.com>
Claude-Session: https://claude.ai/code/session_01KrM98FAv8YT3boAVJpf6PW
2026-09-30 23:10:24 +00:00
Rohan Verma
4258a10de3
Merge pull request #2087 from Cedric921/fix/partial-refund-suspension
Some checks are pending
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
fix(license): suspend only the license a fully refunded charge paid for
2026-09-30 16:10:06 -07:00
Mohammad Hijjawi
6b5f0e64ef fix(export): strip every citation marker form from exported chats
The chat export only recognised [citation:<id>]. Older assistant
messages also hold the other forms the web renderer accepts, from when
the model wrote markers itself: full-width brackets (【citation:12】),
zero-width spaces inside the brackets, and comma-separated ids
([citation:12, 34]). The first two were left in the exported text as
raw markers; for the third, "12, 34" never parsed as a chunk id, so
the message lost its source titles.

Match the same forms as the renderer and split comma lists into
separate ids. Also apply ruff format to the file, which the
backend-lint hook checks for every changed file.
2026-09-30 23:55:31 +01:00
Mohammad Hijjawi
083f0aa9cf fix(export): give each exported document its own path
When two documents in one folder share a title, the second gets a _2
suffix. The suffix was not checked, so if another document was already
titled "Notes_2", both were written to Notes_2.md: the ZIP held two
entries with that name and the manifest listed the path twice. Import
reads the last entry for both, so one document never arrived.

Keep counting until the path is free. Also apply ruff format to the
file, which the backend-lint hook checks for every changed file.
2026-09-30 23:52:25 +01:00
Cedric Karungu
1d4885961f fix(license): suspend only the license a fully refunded charge paid for
charge.refunded suspended every license the Stripe customer held, so a
partial refund, or a refund of one of two purchases, silently disabled a
license the customer still paid for. The handler now acts only on a full
refund, resolves the charge's payment intent to its checkout session and
that session to its one license, and suspends that license alone. A
refund that traces to no single license suspends nothing and logs.

Fixes #1962
2026-09-30 23:18:00 +02:00
Cedric Karungu
92a1125437 fix(license): let support correct a trial's address
correct_license_email.py could only find a license by its Stripe checkout
session, and a trial has none, so a mistyped trial address could not be
corrected. --trial-email finds the trial issued to exactly that address,
filtering on the typed email and its folded trial key so neither a
lookalike nor a paid license matches, and refuses when two answer.

Fixes #1965
2026-09-30 23:09:33 +02:00
DESKTOP-RTLN3BA\$punk
441b3ce3fe Merge remote-tracking branch 'origin/dev' into test/hosted-account-purge-guards
Co-authored-by: Cursor <cursoragent@cursor.com>

# Conflicts:
#	docs/architecture/sunset.md
2026-09-29 13:28:29 -07:00
DESKTOP-RTLN3BA\$punk
1c37f9996c Merge remote-tracking branch 'origin/dev' into fix/1938-sunset-url-in-410
Co-authored-by: Cursor <cursoragent@cursor.com>

# Conflicts:
#	docs/architecture/sunset.md
2026-09-29 13:27:22 -07:00
Rohan Verma
d991279322
Merge pull request #2020 from sb123sb123/fix/2005-sunset-scheduled-work
fix(sunset): pause hosted recurring user work
2026-09-29 13:26:18 -07:00
mehul2409
50ef1bd99b fix(license): answer 503 before Keygen when SMTP config is invalid
A bad SMTP_* setting only raised when the mailer was first built, at send
time. /license/trial had already created the trial in Keygen by then, so
the caller got a 500 and their address was spent.

_require_mailer() now builds the mailer as well as checking SMTP_ENABLED,
so a configuration error answers 503 before any Keygen call on both POST
routes. That also stops /license/resend answering differently for
customers and non-customers on a misconfigured deployment. A 503 was
chosen over failing at startup so a mail setting cannot take down every
other route.

Fixes #1963

Co-Authored-By: Claude Opus 5.5 <noreply@anthropic.com>
2026-09-30 00:06:13 +05:30
chenminghao.99
d78f95ef33 test(sunset): cover hosted account purge guards 2026-09-29 23:45:25 +08:00
Parman Mohammadalizadeh
30d073d333 fix(sunset): include sunset_url in the 410 export-only body
The 410 now carries the same sunset_url() that GET /health reads, so a
client refused a write can reach the sunset page without a second call.

Fixes #1938
2026-09-29 09:01:42 +02:00
sb123sb123
638f705b4a fix(sunset): pause hosted user schedules during sunset 2026-09-29 14:27:46 +08:00
Rohan Verma
d084e8bdef
Merge pull request #1937 from MohammadHijjawi97/fix/blocknote-nested-numbered-lists
fix(export): number nested BlockNote lists on their own
2026-09-28 15:55:01 -07:00
Mohammad Hijjawi
c315e7264c fix(export): number nested BlockNote lists on their own
Children of a block were rendered with the parent's numbered-list counter
and handed the result back to it, so a nested numbered list continued the
parent's numbering ("1. A / 2. A.1") and the next sibling skipped ahead
("4. B"). Children now count from zero and the parent's counter is kept.
2026-09-28 20:20:59 +01:00
Mohammad Hijjawi
41d01acaa4 fix(indexing): keep a table's last row when it ends the document
The table-aware chunker only matched table lines ending in a newline, so a
table closing a document with no trailing newline lost its last row to a
separate prose chunk, splitting the table mid-row.
2026-09-28 20:20:04 +01:00
CREDO23
aa58ad2ce8 chore(local): release 2.0.3
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-24.04-arm, linux/arm64, arm64, -cuda, production, true, cuda) (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_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-09-26 16:52:22 +02:00
Anish Sarkar
a989bb55d0 ci: keep only repo-wide checks shared and have each product lint, scan and test itself
code-quality.yml ran every pre-commit hook minus a skip list in each job, so
newer hooks leaked in: check-docs ran four times per PR, the translation hooks
ran in every job, and Biome ran on every PR whether the web app changed or not.
The desktop backend had no security scan at all, the gates counted a cancelled
or timed-out job as passing, and hooks pinned tool versions a second time.

- code-quality.yml keeps only what belongs to no product, run by hook name on
  every PR: file checks, check-docs and detect-secrets
- docker-tests.yml replaces backend-tests.yml and e2e-tests.yml for
  surfsense_backend and surfsense_web: ruff, bandit, Biome, backend unit and
  integration tests, and the e2e journey, each job run only when its files
  change
- desktop-tests.yml filters per job instead of per workflow, adds bandit for
  the desktop backend, and checks translations, failing on a stale en.json
  that typecheck used to regenerate silently
- each workflow ends in a gate (Docker Gate, Desktop Gate, Quality Gate) that
  always reports and fails on failed or cancelled jobs, so it can be made a
  required check without blocking PRs that don't touch that product
- bandit is split into bandit-docker and bandit-desktop aliases, so each
  product scans only its own code
- the Biome hook runs only when a commit touches surfsense_web, instead of
  blocking every commit on the app's existing formatting errors
- Biome and formatjs run from each app's own install (pnpm exec, and a new
  translations:verify script), so their versions live only in package.json
- hook versions updated: pre-commit-hooks v6.0.0, bandit 1.9.4, commitizen
  v4.19.0, and ruff v0.15.8 to match surfsense_backend's own ruff
- surfsense_web's pnpm comes from its own package.json and the root
  package.json is removed; every action is on its latest version
- CONTRIBUTING.md, docs/contracts/README.md, auth_mint.py, the translate
  skill and localization.md name the new workflows and commands
2026-09-25 18:23:56 +05:30
DESKTOP-RTLN3BA\$punk
a7d797d2c1 chore: point code comments at the moved docs
Comments, docstrings and .env.example notes that cited moved or
deleted plan files now cite their new homes under docs/.

The three llama.cpp checksums in fetch-llamacpp.mjs and a URL-format
example in the backend config are marked `pragma: allowlist secret`.
Touching those files puts them in front of detect-secrets, and both
are false positives.

Co-authored-by: Cursor <cursoragent@cursor.com>
2026-09-22 21:27:27 -07:00
DESKTOP-RTLN3BA\$punk
3313fa1448 docs: reorganize engineering docs under docs/
Move the engineering specs out of plans/ into a root docs/ folder.
architecture/ describes what is true in the code now, one doc per
feature. adr/ records decisions: 0003 is restored and 0004-0027 are
new. proposals/ holds designs not built yet: plugins and the CUDA
backend. contracts/ holds the frozen interfaces between trees, with
the fixtures their tests read. ROADMAP.md names the initiatives.

The shipped phase plans are deleted; git history keeps them. plans/
keeps business, launch and ops material only.

Also: CONTRIBUTING.md rewritten around this flow, a CODEOWNERS file,
a Docs section in AGENTS.md, scripts/check_docs.py (was
check_plan_links.py) as a pre-commit hook, the backend tests path
filter extended to docs/contracts, and the five tests that read the
contract fixtures pointed at their new path.

Co-authored-by: Cursor <cursoragent@cursor.com>
2026-09-22 21:27:26 -07:00
DESKTOP-RTLN3BA\$punk
9b20b5aa74 Merge commit '4fb0156ea5' into dev
Some checks failed
Build and Push Docker Images / image_version (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-24.04-arm, linux/arm64, arm64, -cuda, production, true, cuda) (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_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
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 (./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
2026-09-21 14:46:19 -07:00
DESKTOP-RTLN3BA\$punk
d238958650 chore(local): release 2.0.2
Co-authored-by: Cursor <cursoragent@cursor.com>
2026-09-21 14:14:08 -07:00
DESKTOP-RTLN3BA\$punk
6f59919992 feat(release): permalink downloads via unversioned asset names
GitHub's Latest badge now points at the newest 2.x release instead of
legacy v0.0.40. The legacy 0.0.x desktop resolves updates through
/releases/latest and reads latest*.yml from whatever it names, so a
legacy-update-bridge job copies v0.0.40's manifests onto every release
with a `tag: v0.0.40` key. electron-updater honours that over the
release it resolved, so those clients still land on v0.0.40 and its
/sunset redirect, and the installers still come from v0.0.40's own
assets with nothing duplicated.

Artifact names drop ${version}, which makes
/releases/latest/download/<name> a permalink the README and the site
can hardcode. Safe for auto-update: a cached download is validated by
sha512 before it is installed, and every consumer labels assets by
suffix rather than by full name.

Also corrects docs and comments that asserted the pin was permanent,
including a stale bug report in the SEO brief -- the site's hero
already resolves by tag.

Co-authored-by: Cursor <cursoragent@cursor.com>
2026-09-21 13:46:15 -07:00
Anish Sarkar
774ae8a8a5 fix(sunset): keep PAT create/revoke working under SUNSET_MODE, matching the "PATs survive until T+30" contract 2026-09-20 18:08:33 +05:30
Anish Sarkar
aae178d294 fix(sunset): gate SUNSET_MODE on DEPLOYMENT_MODE=cloud so self-hosted instances can never be sunset-blocked 2026-09-20 18:08:33 +05:30
Thierry CH.
5bfa0a9092 chore(local): release 2.0.1 2026-09-19 00:05:34 +02:00