100 Commits
Author SHA1 Message Date
ProxySoul c27dac116d feat(locales): sync en (11179 keys), ar/fr/ko/ru from v3 and add zh-CN
- locales: en.json matches the current catalog
- locales: ar, fr, ko, ru take v3's reviewed strings; 266 stale keys pruned each
- locales: zh-CN added (99% translated)
2026-10-16 03:22:56 +02:00
ProxySoul 28802a4f16 feat(locales): sync en and translate every string in ar, fr, ko and ru 2026-10-04 02:00:26 +02:00
ProxySoul 669ff9198d docs: add demo and update docs
- add demo
- license & readme
2026-09-27 17:49:08 +02:00
ProxySoul 6329f0dd26 docs: update readme 2026-09-24 01:09:20 +02:00
ProxySoul 9b403ff4fa docs(readme): plain english, and counts that match what ships 2026-09-17 20:53:48 +02:00
ProxySoul 64ea2ec8d1 chore(i18n): sync en.json (+84 keys) and prune stale keys from ar/fr/ko/ru 2026-09-17 03:35:50 +02:00
ProxySoul 73dd4e1b8e chore(locales): sync en.json catalog (8413 keys), prune stale keys, mirror gate 2026-09-16 15:11:19 +02:00
ProxySoul f771fc238e feat(locales): complete Arabic French Korean and Russian 2026-09-11 01:43:54 +02:00
ProxySoul 5e3b873e75 chore(locales): prune 207 stale keys from ru.json, fix its {morph} placeholder 2026-09-07 18:47:19 +02:00
ProxySoul 9f12da5ed3 feat(morphs): publish the five official cells + directory index 2026-09-07 18:46:52 +02:00
ProxySoul d663b11a8a chore(locales): sync en.json catalog (7377 keys), prune stale ar/fr keys 2026-09-07 18:46:52 +02:00
ProxySoul 69e0a55d8a chore(assets): remove unused branding files 2026-09-06 11:58:22 +02:00
ProxySoul 10bee3374e docs(readme): refresh slogan and animated logo 2026-09-06 06:44:55 +02:00
ProxySoul 82b0efb1f0 chore(locales): sync en.json catalog (6105 keys), refresh ar, prune stale keys
en.json: 664 new keys, 65 removed. ar.json: current catalog (5438 keys). fr.json: 65 removed keys pruned, plus two entries whose English gained a {vendor} placeholder dropped until re-translated — they fall back to English meanwhile.
2026-09-02 12:16:14 +02:00
ProxySoul 67a985406f chore(locales): sync en.json catalog (5506 keys), prune stale ar keys 2026-08-27 01:28:49 +02:00
Pouiiro affe1e707a docs(backers): window92 in the jar 2026-08-25 23:44:10 +02:00
Pouiiro 922f7950d5 locales: 5484 keys; toggle replies join the catalog 2026-08-24 02:38:50 +02:00
Pouiiro 234dcfbe4a locales: 5480 keys, Arabic 100%; the engine packages join the catalog 2026-08-24 02:14:26 +02:00
Pouiiro 050c6c772a locales: 4847 keys, Arabic 100%; gate allows newlines the English has 2026-08-24 00:12:26 +02:00
Pouiiro 211c1160de locales: 4151 keys, Arabic 100%; gate no longer reads plural branch bodies as placeholders 2026-08-23 23:18:43 +02:00
Pouiiro 0a3d627de5 locales: 3601 keys, Arabic 100% — element-wrapping sentences and plural counts 2026-08-23 22:35:55 +02:00
Pouiiro 0170b9d7c7 locales: en.json 3571 keys — the catalog ar.json was already written against 2026-08-23 22:23:31 +02:00
Pouiiro 47db300a84 locales: 3571 keys, Arabic 100% — hint rows, splash lines, copy tables, command names 2026-08-23 22:23:09 +02:00
Pouiiro 612d23e886 locales: en.json 3380 keys, Arabic 100%, translators' README 2026-08-23 21:25:48 +02:00
Pouiiro c0de84eb98 locales: en.json from the wired catalog
- 1673 keys, now tracking nls() call sites
- ar.json pruned of 223 keys English dropped (class names, enum values)
- gate: --allow-stale (used by the private embed only; CI stays strict)
2026-08-23 21:12:15 +02:00
Pouiiro 10e374a36f ci: lint + typecheck only
- v2 is archived; drop compile gate, Windows bundle/installer/smoke jobs
- remove headless-forge, publish, release-windows workflows
- locales gate unchanged
2026-08-23 20:24:32 +02:00
Pouiiro 9f4f839e13 feat(locales): community translations
- locales/en.json: 1,850 UI strings, generated from source; translate by copying it to <tag>.json
- locales/README.md: how to add a language, what the checker refuses and why
- scripts/validate-locales.ts: the gate; rejects escape/control chars, bidi overrides, invisible chars, broken placeholders and plurals, oversize files
- .github/workflows/locales.yml: runs the gate on every PR, refuses edits to en.json, actions pinned by SHA
- CODEOWNERS: gate and en.json need maintainer review
2026-08-23 17:56:25 +02:00
Pouiiro eff0c8de75 docs(backers): 3utterfly3ffect at ember, Praneeth Merugu at spark 2026-08-20 18:34:58 +02:00
Pouiiro ee17ef78af docs: update readme 2026-08-10 03:28:06 +02:00
Pouiiro e6b5885db1 docs: expand readme with routing, benchmarks, and engineering story 2026-07-29 18:26:46 +02:00
Pouiiro a9ac0d01a6 docs: update readme 2026-07-29 18:13:59 +02:00
Pouiiro 83fd730e2e feat(docs): Empryo migration banner
- non-dismissible top banner: SoulForge has evolved into Empryo, links to docs/download
- Empryo-themed look (near-black + terminal green, mono) in both color schemes
- genome-scan sweep + breathing underglow animation, reduced-motion safe
2026-07-17 20:05:26 +02:00
Pouiiro 6bd5c9310f docs(backers): welcome @feketefh as the first Spark monthly sponsor 2026-07-17 10:14:27 +02:00
Pouiiro c691a2386a chore(release): 2.20.25 2026-07-12 17:16:04 +02:00
Pouiiro 555316e975 ci(publish): bump npm-publish node to 24
- npm@latest (12.x) requires node ^22.22.2 || ^24.15.0 || >=26; node 20 (now EOL) hit EBADENGINE
- node 24 satisfies it and keeps provenance/trusted-publish (id-token) working
2026-07-12 17:13:59 +02:00
Pouiiro 85e2043533 chore(release): 2.20.24 2026-07-12 17:07:52 +02:00
Pouiiro ea9278e746 feat: reface repo as Empryo + one-time TUI announcement
- README: rebrand to Empryo (previously SoulForge) — copied Empryo logo mark, concise copy, install, benchmarks vs Pi, changelog link; SoulForge stays downloadable with bug/critical fixes while development moves to Empryo
- TUI: one-time "SoulForge is now Empryo" popup (Close / Don't-show-again) reusing the update-popup chrome — green Empryo wordmark, gratitude note, macOS/Linux/Windows; persists empryoAnnouncementDismissed
- tests: headless-render e2e drive the popup keyboard + onClose contract + store wiring
- fix: refresh stale structural-edit ast-grep assertion
- chore: gitignore runtime .empryo dir
2026-07-12 17:06:42 +02:00
Pouiiro 8ae117e604 chore(release): 2.20.23 2026-07-08 16:52:47 +02:00
Pouiiro e294b6cc56 fix(intelligence): bound backend parsing and scans to prevent UI freezes (discussion #129)
- tree-sitter: skip files >1MB before parse (minified/generated content stalled the thread)
- tree-sitter: cancel parses over 5s via native progressCallback (a Promise.race timeout can't preempt the synchronous WASM parse proposed in #129)
- tree-sitter: guarantee tree.delete() on error paths in findImports/getFileOutline (WASM memory leak)
- tree-sitter: cap collectHashableNodes at 200 results; recursion depths kept at 40/10 to preserve clone-detection hash semantics
- regex: extractBraceScope now skips braces inside strings and comments (Rust lifetime-aware)
- regex: skip files >1MB in findSymbols/findImports/findExports
- ts-morph: skip files >1MB in getSourceFile, evicting any stale oversized entry
- router: per-op fallback timeouts (10s default, 30s for project-wide ops like findImplementation/getDiagnostics)
- router: BFS directory scans yield to the event loop every 20 dirs instead of cutting depth limits, keeping JVM project detection intact

Reported with proposed fixes by @Dojdik in discussion #129
2026-07-08 16:27:54 +02:00
Pouiiro 008d4a4298 chore(release): 2.20.22 2026-06-28 23:02:45 +02:00
PouiiroandSoulForge cfb23e2905 fix(repo-map): raise summaryGenerator callback timeout to 5min
Semantic summary generation aborted mid-run with "Callback timeout:
summaryGenerator" on slow models (Minimax M3, DeepSeek) at higher LLM
limits. Each batch summarizes 10 symbols via ctx.requestCallback, which
had a hardcoded 60s timeout — slow models exceed that on some batches,
rejecting the whole run. The outer RPC already allows 300s.

Pass 300_000ms to the summaryGenerator callback (matching the outer RPC
budget) and surface the optional timeoutMs param on the
WorkerHandlerContext.requestCallback interface.

Fixes #126

Co-Authored-By: SoulForge <[email protected]>
2026-06-28 16:35:48 +02:00
Pouiiro 500c698a88 chore(release): 2.20.21 2026-06-27 00:49:43 +02:00
Pouiiro 219a8ab223 chore(deps): bump OpenTUI 0.4.1 → 0.4.2 for resize hit-target fix 2026-06-27 00:44:05 +02:00
Pouiiro abb3f39286 fix(tui): delegate resize to OpenTUI built-in handler, fixing post-resize screen corruption (#125) 2026-06-27 00:25:44 +02:00
Pouiiro 1fe1ef4099 chore(release): 2.20.20 2026-06-27 00:08:10 +02:00
Pouiiro 69359be13f feat(proxy): recover Claude tool calls leaked as text over the proxy 2026-06-26 23:59:24 +02:00
Pouiiro a1c17eec92 fix(fuzzy): rank prefix matches above scattered subsequence matches 2026-06-26 23:59:24 +02:00
Pouiiro 97f69a271d fix(provider-settings): clamp info/section rows to one line so options stay visible 2026-06-26 23:59:24 +02:00
PouiiroandSoulForge 86c49b5d5f feat(providers): add dedicated LLM Gateway options tab
- Add llmgatewayReasoningEffort knob, overrides shared compat effort
- Expose cache TTL (5m/1h) and web search toggle in the tab
- Wire effort override through getCompatReasoningBody, falls through when off

Co-Authored-By: SoulForge <[email protected]>
2026-06-26 22:08:09 +02:00
PouiiroandSoulForge a1185601d4 fix(ui): improve fuzzy matching in command picker and setup wizard
- CommandPicker: rank prefix matches above scattered subsequence matches
- SetupStep: strip whitespace from fuzzy query before matching

Co-Authored-By: SoulForge <[email protected]>
2026-06-26 22:07:58 +02:00
Pouiiro a7a2382e05 chore(release): 2.20.19 2026-06-23 21:50:36 +02:00
Pouiiro 68f5d08d66 fix(lsp): support .luau files — map to lua and register luau-lsp server 2026-06-23 21:47:03 +02:00
Pouiiro 7470e2847a fix(command-picker): marquee-scroll long option descriptions instead of cutting 2026-06-23 21:22:29 +02:00
Pouiiro 8182b7f975 chore(release): 2.20.18 2026-06-23 21:08:54 +02:00
Pouiiro e5f9e0b9a9 fix(wizard): scroll provider list to fit terminal, truncate rows to one line 2026-06-23 18:59:23 +02:00
Pouiiro b5aadcf4c8 chore(release): 2.20.17 2026-06-23 18:55:07 +02:00
PouiiroandSoulForge e8c910a7bc fix(build): gate jsx parser plugin to .tsx in build.ts inline react-compiler
Co-Authored-By: SoulForge <[email protected]>
2026-06-23 18:53:40 +02:00
Pouiiro 0372a4a08f chore(release): 2.20.16 2026-06-23 18:50:22 +02:00
Pouiiro a8c850313f fix(build): parse .ts without jsx plugin to fix babel 8 generic-arrow crash 2026-06-23 18:48:52 +02:00
PouiiroandSoulForge 3a67afc309 feat(memory): surface active embedder, expand docs
Add a read-only Embedding row to the /memory Settings tab showing the resolved model and source, or offline (hashbag-v2) on fallback.
Expand memory docs to cover API key requirement, supported models, auto-resolution, and how to verify the embedder is active (#115).

Co-Authored-By: SoulForge <[email protected]>
2026-06-23 18:38:13 +02:00
PouiiroandSoulForge 02e8f55b82 fix(models): defer provider fetch to avoid Windows native segfault
Defer the /models background fetch storm one tick so OpenTUI paints the scrollbox before the io.worker HTTP burst.
Removes the native-render + worker-FFI contention that segfaults on Windows (#120).

Co-Authored-By: SoulForge <[email protected]>
2026-06-23 18:34:41 +02:00
Pouiiro 5bf13b10cb chore(release): 2.20.15 2026-06-12 01:43:37 +01:00
PouiiroandSoulForge 8bb70ac3ce fix(tui): suppress biome control-char lint on mode 2048 resize regex
ESC byte is required to match the CSI 48;rows;cols t in-band resize report. Same suppression pattern used in useMouse.ts and App.tsx for terminal protocol parsing.

Refs #91

Co-Authored-By: SoulForge <[email protected]>
2026-06-12 01:34:23 +01:00
PouiiroandSoulForge d65495d451 feat(tui): in-band resize notifications (mode 2048) with watchdog fallback
Replace the poll-only resize fix with the mechanism modern TUIs use: DEC mode 2048 in-band resize notifications. The terminal reports size changes as a stdin escape sequence (CSI 48;rows;cols;hpix;wpix t), which travels the input stream and survives transports that drop SIGWINCH (Win32-OpenSSH -> WSL2, #91).

- enable ?2048h at startup, parse reports via renderer.addInputHandler
- disable ?2048l in restoreTerminal on exit
- keep the 1s TIOCGWINSZ watchdog as fallback for terminals without
  mode 2048 (xterm, Alacritty, Windows Terminal)
- unsupported terminals ignore the enable sequence; strictly additive

Refs #91

Co-Authored-By: SoulForge <[email protected]>
2026-06-12 01:24:58 +01:00
PouiiroandSoulForge 0036e05d9d fix(tui): poll terminal size to catch resizes when SIGWINCH is dropped
Win32-OpenSSH (PowerShell ssh client) does not forward window-change to the remote PTY, so the renderer's SIGWINCH handler never fires and the TUI stays at its launch size (or corrupts on shrink). Add a 1s watchdog that reconciles process.stdout.columns/rows with the renderer via renderer.resize() — the documented hook for externally-driven resizes. No-op when sizes match; unref'd so it never holds the process open.

Fixes #91

Co-Authored-By: SoulForge <[email protected]>
2026-06-12 01:13:30 +01:00
Pouiiro 61b1d98020 chore(release): 2.20.14 2026-06-12 01:07:31 +01:00
PouiiroandSoulForge 015cda45d8 fix(clipboard): 100% copy/paste coverage across platforms, terminals, SSH and WSL
- fall back to raw OSC-52 on stdout when renderer capability detection misses osc52 (SSH)
- route non-ASCII Windows copy through base64-in-argv PowerShell (clip.exe codepage mojibake)
- resolve PowerShell binary properly for pwsh-only installs
- WSL: text + image clipboard via Windows interop (clip.exe / powershell.exe GetImage)
- order Linux image backends by WAYLAND_DISPLAY to avoid 3s wrong-backend timeout
- fix AppleScript escaping order in macOS image read

Fixes #93

Co-Authored-By: SoulForge <[email protected]>
2026-06-12 01:05:17 +01:00
PouiiroandSoulForge b134b8db95 fix(statusbar): replace vmmap with /usr/bin/footprint for macOS memory sampling
vmmap suspends the target task while walking its VM map, so the TTL cache from 8b459ca6 only made the freeze rarer (every 30s), not gone. /usr/bin/footprint reads task_info phys_footprint directly without stalling the target. Measured: vmmap caused 350-380ms stalls per sample; footprint caused zero.

Fixes #102

Co-Authored-By: SoulForge <[email protected]>
2026-06-12 00:42:32 +01:00
PouiiroandSoulForge aa44ea7953 fix(opencode-go): drop unsupported qwen3.7-max from fallback models
Co-Authored-By: SoulForge <[email protected]>
2026-06-12 00:34:08 +01:00
Pouiiro e29c026eb1 chore(release): 2.20.13 2026-06-12 00:31:18 +01:00
PouiiroandSoulForge 2af8c041a3 ci: compile gate on every push + PR to catch dep-bump build breaks
Cross-compile/release jobs were gated to pull_request only, so a dep bump pushed straight to main passed (lint+typecheck) then broke the release. Add a fast compile gate to the always-run check job.

- check job cross-compiles all 5 shipped targets (SKIP_SMOKE, ~5s each)
- a dep that breaks Bun static resolution now fails on main, not at release
- fix stale pinned @opentui/[email protected] in windows-bundle: derive version from installed @opentui/core

Co-Authored-By: SoulForge <[email protected]>
2026-06-12 00:28:14 +01:00
PouiiroandSoulForge f992b4393b fix(build): resolve @opentui/core 0.4.x platform imports in compile phase
opentui 0.4.x emits 8 hardcoded import("@opentui/core-<platform>") specifiers instead of one ${process.platform} template literal, breaking cross-compile.

- register opentuiNativePlugin in Phase 2 (compile) too, not just Phase 1
- widen resolver regex to match multi-hyphen suffixes (linux-x64-musl)

Co-Authored-By: SoulForge <[email protected]>
2026-06-12 00:23:21 +01:00
Pouiiro 355a6c0049 chore(release): 2.20.12 2026-06-12 00:15:33 +01:00
PouiiroandSoulForge c9ad628910 feat(llm): send per-chat session id to providers for sticky routing
- Stamp x-session-id + x-session-affinity on every LLM request
- Per-tab routing id (TUI), resumed/opts/UUID (headless), workspace id (hearth)
- /clear rotates the routing id so the chat re-scores its provider
- Skips vercel-gateway (prebuilt instance) and bedrock (SigV4-signed headers)

Co-Authored-By: SoulForge <[email protected]>
2026-06-12 00:12:08 +01:00
PouiiroandSoulForge 5c6ac399b8 feat(minimax): add MiniMax M3 model
Fixes #111

Co-Authored-By: SoulForge <[email protected]>
2026-06-11 23:55:25 +01:00
PouiiroandSoulForge 19a987e9ff chore(deps): upgrade TypeScript 6, ai 6, react 19.2 and related deps
Co-Authored-By: SoulForge <[email protected]>
2026-06-11 21:10:45 +01:00
Pouiiro 5264722d13 chore(release): 2.20.11 2026-06-09 22:42:07 +01:00
Pouiiro 18e11dc485 chore(release): 2.20.10 2026-06-09 22:36:42 +01:00
PouiiroandSoulForge b1781dbc5e chore: sync provider pricing to June 2026
- Add Claude Fable 5 / Mythos 5
- Add xAI Grok (was defaulting to $3/$15)
- DeepSeek: promo ended, fix cache-hit rates
- Mistral: medium 3.5, small 4
- OpenAI/Gemini/Groq verified unchanged

Co-Authored-By: SoulForge <[email protected]>
2026-06-09 22:34:12 +01:00
PouiiroandSoulForge 24900083df feat: Claude 5-gen model support + reliable proxy login detection
- Add isClaude5Plus() to gate temperature/adaptive-thinking for Fable 5 / Mythos 5
- Detect proxy login success via credential file changes, not proxy health
- Bounce running proxy after login so it reloads fresh upstream creds

Co-Authored-By: SoulForge <[email protected]>
2026-06-09 22:34:12 +01:00
Pouiiro b06dd7fb40 chore(release): 2.20.9 2026-06-09 15:13:26 +01:00
PouiiroandSoulForge 393cb2b721 fix(chat): stop selection clearing on release + duplicate streaming lines
- copy-on-select keeps the highlight; only explicit copy (right-click/Ctrl+C) clears
- reset drip state when content shrinks (native markdown assumes monotonic growth)
- pass real streaming flag to <markdown> so trailing block finalizes at handoff

Co-Authored-By: SoulForge <[email protected]>
2026-06-09 15:09:03 +01:00
PouiiroandSoulForge 0b1a2cf0ac test(prompts): match navigate() assertion in soul map usage text
Co-Authored-By: SoulForge <[email protected]>
2026-06-09 14:21:30 +01:00
PouiiroandSoulForge a398eeb1ae feat(telemetry): add mode, terminal, runtime, repomap fields
Co-Authored-By: SoulForge <[email protected]>
2026-06-09 14:16:08 +01:00
PouiiroandSoulForge 5c2f0d3d13 feat(telemetry): report all public models via shape gate
Replace per-family allow-list with a low-cardinality slug shape gate so new public models surface without regex upkeep; gate on first-slash segment to block path traversal. Relax worker MODEL_RE and FAMILIES to shape checks.

Co-Authored-By: SoulForge <[email protected]>
2026-06-09 14:09:42 +01:00
PouiiroandSoulForge 2d50737ff7 docs(prompts): frame Soul Map as ranked index, not ground truth
Co-Authored-By: SoulForge <[email protected]>
2026-06-09 13:30:35 +01:00
Pouiiro cd676ac25b chore(release): 2.20.8 2026-06-08 13:34:30 +01:00
PouiiroandSoulForge 6b0c009fa2 fix(proxy): sync /proxy login providers with CLIProxyAPI v7
- add Antigravity (-antigravity-login)
- add xAI/Grok (-xai-login)
- remove dead qwen/iflow flags (no v7 handler)
- update docs

Closes #92

Co-Authored-By: SoulForge <[email protected]>
2026-06-08 13:23:33 +01:00
Pouiiro 933395c0eb chore(release): 2.20.7 2026-06-08 12:17:01 +01:00
PouiiroandSoulForge 2b32ef2f50 fix(clipboard): repair text copy across platforms and terminals
- enable useMouse so the renderer builds a selection model
- copy via right-click, mouse-up, Ctrl+C and Ctrl+Y (console keybind)
- gate copy-on-select off on Windows; add Ctrl+C console guard + input flush
- wire copy-on-select into the modal/dialog overlay layer
- centralize logic in useCopySelection hook

Co-Authored-By: SoulForge <[email protected]>
2026-06-08 12:14:56 +01:00
Pouiiro 4a8b7da9e8 chore(release): 2.20.6 2026-06-04 22:34:24 +01:00
PouiiroandSoulForge ce15263106 fix(clipboard): repair Windows image paste
- resolve PowerShell: powershell on PATH → full System32 path → pwsh
- GetData('PNG') fallback before GetImage() for Snipping Tool/browser copies
- bump PS timeout 5s→10s for cold Add-Type JIT
- bind Alt+V as image-paste trigger (WT bracketed-paste / nvim Ctrl+V swallow)
- logBackgroundError on null/failed probe instead of silent no-op
- docs: Windows image-paste troubleshooting + @path file fallback

Co-Authored-By: SoulForge <[email protected]>
2026-06-04 22:32:31 +01:00
PouiiroandSoulForge e690466bb2 fix(chat): stop leading text re-streaming over tool rail
Co-Authored-By: SoulForge <[email protected]>
2026-06-04 22:25:58 +01:00
PouiiroandSoulForge be3c1095cc fix(repomap): clear stuck "waiting for soul map" semantic stub
- post-scan semantic/cache task could reject and strand /repo-map on the "waiting for soul map..." stub
- wrap in try/catch; on failure reset semantic status to off when still showing the stub

Co-Authored-By: SoulForge <[email protected]>
2026-06-04 22:25:49 +01:00
PouiiroandSoulForge c89d1e9f72 fix(llm): skip inline-reasoning extractor for native-reasoning models
- extractReasoningMiddleware scanned answer text for <think>/<thinking>, corrupting normal output containing those words near angle brackets
- gate middleware to non-native families only; Claude/OpenAI/Google/xAI/DeepSeek-R skip it (they stream reasoning natively)

Co-Authored-By: SoulForge <[email protected]>
2026-06-04 22:25:42 +01:00
PouiiroandSoulForge d3c2ae59af fix(chat): render reasoning in live streaming view
- live view (FinalResponseLiveAutoView) now shows reasoning blocks like static view
- "Thinking…" placeholder when no visible body yet — no bare header husk
- thread showReasoning/reasoningExpanded from TabInstance

Co-Authored-By: SoulForge <[email protected]>
2026-06-04 22:19:23 +01:00
Pouiiro 140e44a1c9 chore(release): 2.20.5 2026-06-04 22:14:02 +01:00
PouiiroandSoulForge be5a9c43b9 feat(llm): extract inline reasoning tags into reasoning parts
- wrap every resolved model with extractReasoningMiddleware
- splits <think> and <thinking> from text into native reasoning
- no-op for providers with a native reasoning channel

Co-Authored-By: SoulForge <[email protected]>
2026-06-04 22:12:11 +01:00
PouiiroandSoulForge 8633b15f7c fix(chat): snappier streaming + no bare assistant header
- yield via microtask budget, not setTimeout(0) — no event-loop starvation
- hoist + gate Hearth bridge streaming behind active binding
- show "Thinking…" placeholder when reasoning hidden and no visible body

Co-Authored-By: SoulForge <[email protected]>
2026-06-04 22:09:37 +01:00
Pouiiro 9ccc9b4b1a chore(release): 2.20.4 2026-06-04 21:58:37 +01:00