Skip to content

Integrate reviewed community contributions since v1.7.1 - #2466

Merged
pancacake merged 282 commits into
devfrom
codex/nov-06-contributor-integration
Nov 5, 2026
Merged

pancacake merged 282 commits into
devfrom
codex/nov-06-contributor-integration

Conversation

@pancacake

@pancacake pancacake commented Nov 5, 2026 •

Copy link
Copy Markdown
Collaborator

Integrates the reviewed post-v1.7.1 contributions onto dev. Original PR heads and their authors remain in the Git history. The integration fixes shared session migration locks, plugin subprocess environments, model compatibility, source retrieval and the shared speech player, and includes native Windows and browser regression coverage.

The desktop dependency update keeps the existing runner matrix. Validate the combined result through the repository CI matrix before integration.

The included history of #2325 also carries the original #2261 commit by LucianVane, opened before this review window.

113 reviewed source PRs from 39 contributors
Pull request Contributor Source head Account-linked commit
#2262 AleFlyX 34c404228 34c404228
#2265 tanishqbaweja 22aa804d6 22aa804d6
#2266 cgycorey 3845c9f23 3845c9f23
#2267 Plastic-time 4ffda7aa2 4ffda7aa2
#2268 Plastic-time bd5c2854a bd5c2854a
#2269 Plastic-time 1b41175ca 1b41175ca
#2270 Plastic-time ee678ec8c ee678ec8c
#2271 Plastic-time e80c26bd1 e80c26bd1
#2272 Plastic-time 0c8593bf0 0c8593bf0
#2273 Plastic-time 8ebb1d31f 4838e7738
#2274 Plastic-time e64840d1a e64840d1a
#2275 Plastic-time fd04d1946 1a54befba
#2276 Plastic-time 60a29f09c 60a29f09c
#2277 Plastic-time f50d2ff4b f50d2ff4b
#2278 Plastic-time 83464cdf8 83464cdf8
#2280 Plastic-time 61e259b49 d072a786f
#2281 Plastic-time 4de11b45f bf20e3c4d
#2282 Plastic-time 953a6106f 953a6106f
#2283 Plastic-time 2d3bf1f42 2d3bf1f42
#2284 Plastic-time 6e87980a2 6e87980a2
#2285 Plastic-time 171bd9ec4 171bd9ec4
#2287 erhanurgun b5dc296e3 be7b58ee0
#2288 remote-controlled-man a065f7049 6fd950589
#2295 panghufattiger996-maker 78d0fb035 685922442
#2296 tanishqbaweja aa4b6ec25 aa4b6ec25
#2298 Antonio-Faure 48a9826a5 8a89f68f8
#2299 Antonio-Faure 5acbfcb01 bc680bd76
#2303 Antonio-Faure 75d65b7de 75d65b7de
#2304 Antonio-Faure b93451dd0 b93451dd0
#2306 iSanae233 2c5f84490 2c5f84490
#2307 rudycelekli b71c2b7e3 b71c2b7e3
#2308 rudycelekli 6498bc7fb 6498bc7fb
#2309 rudycelekli 9e8e80f7a 9e8e80f7a
#2310 rudycelekli 81557468c 81557468c
#2311 rudycelekli f930c5ece f930c5ece
#2312 rudycelekli 1cd621a63 1cd621a63
#2313 rudycelekli c6b263b86 c6b263b86
#2314 rudycelekli 1eb4d01d0 1eb4d01d0
#2315 rudycelekli 775e54870 775e54870
#2316 rudycelekli 2c30cf5e1 2c30cf5e1
#2317 rudycelekli bbdf745f4 bbdf745f4
#2318 rudycelekli 5c39ff5b4 5c39ff5b4
#2319 rudycelekli 8fa247d81 8fa247d81
#2320 FSOTM 70031420a 70031420a
#2321 FSOTM 4fb9d78c9 4fb9d78c9
#2322 FSOTM 64dec0953 64dec0953
#2324 BenjiAvH 1a00aa9b5 1a00aa9b5
#2325 BenjiAvH c4befc370 c4befc370
#2328 Antonio-Faure e3380f375 e3380f375
#2332 markjoin123 db014f0ed db014f0ed
#2334 yertYang edb205369 edb205369
#2335 yertYang 9afd724b1 880ea294e
#2336 remote-controlled-man 225b39a67 02339d506
#2337 yertYang 4e113d0e4 4e113d0e4
#2341 rudycelekli d4a051bde d4a051bde
#2342 rudycelekli 604c835cc 604c835cc
#2343 rudycelekli 83a0c7ace 83a0c7ace
#2344 rudycelekli ff39562d7 ff39562d7
#2345 rudycelekli fd7ef5e4c fd7ef5e4c
#2346 rudycelekli c77f88896 c77f88896
#2347 rudycelekli f67f71b8e f67f71b8e
#2348 rudycelekli 472e386f5 472e386f5
#2349 rudycelekli d516269b4 d516269b4
#2350 yertYang a13bcb26c a13bcb26c
#2351 rahul05ranjan a141132c5 47595d6fa
#2353 stefanielizeth73-art 879421710 879421710
#2357 Antonio-Faure 56073ebb7 f39b5d1c1
#2358 Antonio-Faure 0f5d5dcfb 406301d0b
#2359 wayfarer6 7847c0cbc 1ae2bcf96
#2360 sriv144 db0b84b4a db0b84b4a
#2362 sriv144 5a4fc3e0f 5a4fc3e0f
#2368 KKandLL-Forever 7187d5b61 2bcd7822e
#2371 sriv144 4a910a317 4a910a317
#2375 Mahdi-Hasan 93fa314ce 93fa314ce
#2376 WhitePepperLambSoup ab34adb78 ab34adb78
#2378 evan188199-tech 1695c9408 964e80058
#2379 remote-controlled-man b4dab154d ad92fd11b
#2384 stefanielizeth73-art 3f943e14c 3f943e14c
#2388 Adithya1331 4dd10949b 4dd10949b
#2390 evan188199-tech 19420e652 857bc6f6a
#2392 x-labb 15c79b435 15c79b435
#2393 evan188199-tech 4ceb78ca1 41a92edc1
#2395 evan188199-tech 1fefa4fd9 ed709477b
#2397 Antonio-Faure db3095272 a7703bd3c
#2398 Antonio-Faure c75b0c8c7 c75b0c8c7
#2402 KKandLL-Forever 731a9589c 26e3a4b52
#2403 zhouyao423 11a9567a8 53202de41
#2405 evan188199-tech c7bfa8c8d 5e46c4f32
#2406 zhouyao423 538cfbf8f 0be136555
#2407 evan188199-tech 4b3753760 aad58b82f
#2409 evan188199-tech ce60d1a6d a5ab4c6ea
#2410 chen-12-03 739f6406a 739f6406a
#2412 EastonSell 5eb1f2b6b 5eb1f2b6b
#2413 pcbeingused333 15a6864a6 15a6864a6
#2414 maxsheng215-cyber f6cbb25e7 f6cbb25e7
#2415 maxsheng215-cyber 7b5390ffe 7b5390ffe
#2420 KKandLL-Forever 475714cad 475714cad
#2425 panghufattiger996-maker aac3d8874 3fbd73460
#2428 AleFlyX c8aa7a886 c8aa7a886
#2429 MohammadHijjawi97 a4a610ad0 a4a610ad0
#2430 NanMubai a9705b3cc 6f8ed7706
#2434 jingmaowang 080cd71cd 080cd71cd
#2435 mathewgeejo b9756c612 b9756c612
#2441 Eapp1e 8e331f809 8e331f809
#2442 yuleihaotong 9417f76f4 9417f76f4
#2444 rudycelekli c35eb7266 c35eb7266
#2445 iSanae233 a40786370 a40786370
#2447 Yi-111-a 1eaddc3e3 d5adc0c2a
#2454 Mahdi-Hasan 1cc4fa460 1cc4fa460
#2456 Mahdi-Hasan 87e920b4b 87e920b4b
#2457 wangjianming c55d55abf c55d55abf
#2460 Bortlesboat f8540eb5c f8540eb5c
#2463 BearSur 8c1bb91cd 8c1bb91cd

Plastic-time and others added 30 commits October 31, 2026 22:46
…K's limit

msvcrt's LK_LOCK gives up with EDEADLK after about ten seconds, and a worker
importing a large legacy store holds the lock longer than that. Retry on
EDEADLK so the other workers wait, as flock does on POSIX; any other lock
error still propagates.
… limit

msvcrt's LK_LOCK gives up with EDEADLK after about ten seconds, and a
one-time upgrade of a large session database can hold the lock longer than
that. Retry on EDEADLK so the other workers wait, as flock does on POSIX;
any other lock error still propagates.
…ode sample

_parse_quiz_payload swapped the reply for the body of its first ``` fence
before parsing anything. The quiz FINISH schema asks for a bare JSON object
whose `question` is Markdown and whose coding answer is code, so that fence
is usually a code sample inside a string value. The parser decoded the
sample instead, got {}, and the question was lost: after one repair round
that hit the same parser, the learner got "[Generation failed] <topic>"
with N/A as the answer and the explanation.

Take a reply that is one complete JSON object as it is first, the order
parse_json_response already uses for the same case (#825). Wrapped replies
still go through the fence; when a fence inside a field cuts the wrapper's
body short, the first object in the whole reply is used instead.
Removed legacy-peer-deps option from npm ci command.
Override vulnerable ASAR dependencies and extend desktop shell checks to macOS runners.

Co-Authored-By: GPT-6 Astra <noreply@openai.com>
mapMarkdownProse closed a fenced code block at any later line whose fence
marker matched, including lines that carry an info string (```tex inside a
```text block). Per CommonMark a closing fence has no info string, so such a
line is code content, not a close. Closing early let the block's remaining
content run through prose normalization — e.g. a documented \(x+y\) example
became $x+y$ — which is exactly what this helper exists to prevent.

Require an empty info string before treating a line as a closing fence,
matching the sibling fence trackers in reading-outline.ts and
think-segments.ts.

Co-Authored-By: Claude Opus 4.8 <noreply@anthropic.com>
markdown_to_anki_html took the whole span between the opening and closing
backtick runs as code, so a fenced block's info string (its language) became
the first line of the rendered code. ```python\nprint(1)\n``` exported as
<pre><code>python<br>print(1)</code></pre>, putting a stray "python" line
inside every language-tagged code card.

Start the code body after the opening fence line's newline, matching how a
fenced code block is defined. Fences without an info string, and single-line
spans with no newline, are unchanged.

Co-Authored-By: Claude Opus 4.8 <noreply@anthropic.com>
In the interactive chat REPL, `/notebook add <ref>` passed the ref straight to
_parse_notebook_refs, which raises typer.BadParameter on an empty notebook id
(e.g. `/notebook add :`). The REPL loop does not guard the _apply_command call,
so the exception propagated out and terminated the whole session — while every
other command (bad /config, unparsable shlex input, etc.) just prints a notice
and keeps the session alive.

Catch BadParameter at the `/notebook add` site, print the message, and continue.

Co-Authored-By: Claude Opus 4.8 <noreply@anthropic.com>
The LightRAG index probe reported doc_count=None for every native-layout
index. _lightrag_doc_count read kv_store_doc_status.json from the version
root, but native LightRAG keeps its KV stores under a deeptutor_<hash>
workspace subdir; every other reader (has_output, failure_summary,
document_error) resolves that subdir via storage._store_root first.

Move the count into the storage module as a public doc_count() that
resolves the store root the same way, and have index_probe delegate to it.
A ready native index now reports its real count instead of None, so the KB
version list, last_indexed_count and linked-folder probe stop falling back
to a raw-file guess.

Co-Authored-By: Claude Opus 4.8 <noreply@anthropic.com>
parse() swallowed a `[^token]` that was part of an entry's text. The
new-bullet regex matched trailing markers as `[^...]` (any non-`]`
run), so prose ending in a footnote-like token (e.g. "footnote syntax
is [^note]") was absorbed into the markers group and dropped, breaking
the documented `parse(serialize(d)) == d` contract. Because the token
label failed to resolve, the text was silently truncated and, once the
entry also carried a real ref, its markers were mangled too.

serialize() emits integer labels exclusively, so narrow the inline-marker
pattern to `[^<digits>]`. Non-integer footnote-like tokens now stay in
the text where they belong; real numeric citation markers still parse
(including the legacy compact `[^1][^2]` form).

Co-Authored-By: Claude Opus 4.8 <noreply@anthropic.com>
_migrate_legacy_tutorbot used the raw legacy directory name as the new
partner_id. Every other creation path slugifies the id with
slugify_partner_id, because ids ride in /partners/<id> URLs and must be
ASCII/URL-safe. A legacy bot whose directory name is non-ASCII (e.g. a CJK
name) was therefore migrated under an un-slugged id, leaving it unreachable —
the "Partner not found" symptom in #2166.

Slugify the id, keeping the display name and soul_origin provenance as the
original. Migration stays idempotent across the old layout: an entry already
migrated under either its slug or its raw name is skipped.

Co-Authored-By: Claude Opus 4.8 <noreply@anthropic.com>
_is_tool_format_error classifies a 400 so a non-streaming tool call can
fall back to streaming (e.g. DashScope Coding Plan rejecting malformed
tool arguments). It tested every marker with `kw in text`, but one
marker, "invalid.*parameter.*function", is a regex: as a substring it
only matches text that literally contains ".*", which no error body
does, so that marker was dead and the "invalid ... parameter ...
function" shape it was added for never triggered the fallback — the tool
turn hard-failed instead.

Search that marker with re.search while keeping the two literal markers
as substring checks.

Co-Authored-By: Claude Opus 4.8 <noreply@anthropic.com>
markdown_to_docx matched _..._ anywhere, so prose mentioning an identifier like
snake_case_word was exported with "case" italicized and the surrounding
underscores dropped ("snakecaseword"). Per CommonMark, _ only opens or closes
emphasis at a word boundary (unlike *, which may emphasise intra-word).

Guard the _ emphasis branch with word-boundary lookarounds, matching the
pattern already used for Anki export in deeptutor/notes/anki_export.py.
Word-bounded _italic_ is unchanged.

Co-Authored-By: Claude Opus 4.8 <noreply@anthropic.com>
… name

is_response_format_unsupported gates every marker behind an explicit
"response_format" mention. But its own docstring lists DashScope's
rejection — "'json_object' is not supported by this model" — which names
the value, not the parameter, so the guard returned False and the
graceful drop-response_format-and-retry never fired; the JSON call hard-
failed instead.

Let the value-specific markers (json_object, json_schema, the
response_format.type messages) stand on their own, and keep the generic
"unsupported"/"not valid" markers gated behind the response_format
mention so an unrelated unsupported-parameter error (e.g. stream_options)
still does not strip response_format.

Co-Authored-By: Claude Opus 4.8 <noreply@anthropic.com>
`notebook add-md` and `replace-md` read the file with read_text(encoding="utf-8"),
so a markdown file in another encoding (e.g. a Windows-authored cp1252/latin-1
file) aborted the command with an uncaught UnicodeDecodeError traceback instead
of the clean CLI errors these commands raise for other problems.

Read the bytes and decode through FileTypeRouter.decode_bytes, the shared
fallback-encoding chain the rest of the app already uses for text input (as in
`deeptutor notebook`'s sibling `kb` command).

Co-Authored-By: Claude Opus 4.8 <noreply@anthropic.com>
panghufattiger996-maker and others added 26 commits November 6, 2026 02:04
@pancacake
pancacake merged commit 39bde55 into dev Nov 5, 2026
28 checks passed
@pancacake
pancacake deleted the codex/nov-06-contributor-integration branch November 5, 2026 19:03
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.