Repository navigation
Synth 0.10.1
0.10.1 (2026-10-15)
An engineering release without new subsystems: god-object decomposition (ADR-095), the split of
architecture documents into ADR and PROP, num_ctx configured through Synth, the native
/api/chat for Ollama and a series of security fixes (P0/P1/P2). 52 commits after v0.10.0.
God-object decomposition (ADR-095)
- The seam extraction pattern was adopted: the facade keeps its public API, related blocks move
into modules and methods delegate; one seam — one commit, every step under greentypecheck/lint/test. - Step 1 —
ui/lib/api/synthApi.ts: 2 596 → 161 lines (32 domain moduleslib/api/*+ a barrel,
a verbatim move of 223 methods, a contract test of the surface). - Step 2 —
shared/types/index.ts: 1 452 → 51 (12 modulestypes/*+ a barrel; the public exports of
@itphx/synth-sharedare identical, 531/531). - Step 3 —
ui/components/panels/LeftPanel.tsx: 2 230 → 59 (subcomponents and hooks inleft-panel/*). - Step 4 —
core/server/app.ts2 014 → 380 andbackend/app.ts1 738 → 286 (modulesapp/*,
the route mounting order is preserved byte for byte). - Step 5 —
core/engine/tools/task.ts: 1 926 → 29 (7 modulesengine/tools/task/*, exports 1:1). - Step 6 —
core/engine/orchestrator.ts: 5 393 → 3 777 (9 modulesorchestrator/*+phases/*,
_processMessage1 668 → ~980 lines). - Behaviour did not change: the full run (~5 084 tests) is green, each step is a separate commit that
updates the per-packageAGENTS.mdand the roadmap. The remaining 6b-2 part (the Tool Use loop body) is deferred on purpose.
Architecture decisions: splitting ADR and PROP
- The catalog is split into ADR — accepted decisions (43) and PROP — proposals with a due date
(41: 32 actionable + 9 vision); the files areadr-NNN-*.md/prop-NNN-*.md, the ids and references
were updated across the repository. - The rules live in the new
docs/ARCH_DECISIONS.md: five document classes, "by default there is no
document", an ADR no longer than a page, the history block; the proposal index and due dates are indocs/roadmap.md. - The checker
scripts/adr-check.mjs(pnpm adr:check/pnpm adr:write) assembles the ADR/PROP index and
runs in a dedicated docs workflow. - The bulky historical ADRs were compressed to one page and their as-built part moved into the spec homes:
ADR-052 (415→60), ADR-046 (652→54), ADR-069 (608→59), ADR-070 (717→72), ADR-089 (601→49). - New proposals: PROP-091 (backup/restore/transfer), PROP-092 (instance lifecycle),
PROP-093 (docs versioning), PROP-094 (observability and metrics), PROP-096 (background subagent sessions),
PROP-097 (background processes), PROP-098 (steering), PROP-099 (memory footprint optimization). - Roadmap: the "Priority goals of release 0.11" section — PostgreSQL (+ a YDB assessment), operations and
ops skills, memory optimization.
Providers and context window
num_ctxis now configured through Synth: theProviderConfig.numCtxfield (APIPOST/PATCH /providers,
CLIsynth config provider add --num-ctx, envSYNTH_PROVIDER_<NAME>_NUM_CTX) and it takes priority over
the model'scontextWindow.- The ollama provider type switched to the native
/api/chat: a URL with/v1is normalized
(the suffix is stripped with a warning), because the OpenAI-compatible layer ignoresoptions/num_ctx. - README/compose/LLM_PROVIDERS and the portal were updated: the recommended local model is
qwen3.8:27b,
with an explanation of the effective window andOLLAMA_CONTEXT_LENGTH.
Security
- P0: the WS calls
send_message/permission_reply/permission_hold/cancelnow authorize by session
visibility;/api/v2/fs/*usesauthorizeProject(read/write separately); the backend session routes
(export/notes/optimization/debug-system-message) are undercanAccessSession. - P1: fail-closed for external paths (
external_directory:ask, anddenyin plan/strict);
{dataDir}/secretsand{dataDir}/securityare in the denied prefixes; shell-guard is fail-closed for
$VAR/glob/$()and resolves$SYNTH_DATA_DIR. - P1: OIDC
issuer/audience, fail-closed CORS (open CORS only withSYNTH_CORS_ALLOW_ALL=true),
aSecurecookie by default, avatar containment byusername, a rate limit onPOST /me/identities/claim. - P2: an SSRF policy for
web_fetch(private/loopback/link-local) with manual redirects (≤5 hops);
docker-compose:SYNTH_API_KEYcomes from.env, no hardcoding. - A gitleaks allowlist for confirmed false positives.
Reliability and fixes
- FileMutex: acquisition is confirmed by
mkdir— theENOENTrace betweenmkdirandstatno
longer yields a "lock without ownership" (droppedScheduleStore/FileLeaderupdates); a deterministic
regression was added. - A terminal LLM error is persisted into the session (
metadata.status=error) and kept out of the LLM context. - Providers API: the
url/model/apiKeyaliases,base_urlvalidation,PATCHsupport. - Flakes stabilized:
task-resume(a fresh session read instead of a stale snapshot),webhooks/service
(drain()instead ofsetTimeout), UISchedulerTab/EventsAdminSettings(waitFor/flush instead of emptyactpauses).
Performance and UI
- Code-splitting: the entry chunk went 2 024 → 420 kB (vendor groups, a separate themes chunk, lazy
RightPanel tabs andAppmodals); heavy modals mount on first open while keeping the closing animation. - A WCAG AA contrast test across 62 themes was added (
contrast.test.ts).
CI, build and publishing
- The workflows were split:
ci-docs(adr-check + docs-link-check overdocs/**and**/*.md),ci—
code/UI tests andpnpm audit(report-only); a regular push is checked by tests, while build and publishing
happen only on a release tag. - A dedicated step publishes the GitVerse Release body (
scripts/publish-release.mjs) instead ofactions/create-release@v1. - GitHub is a mirror without Actions: the
publish-githubjob pushesmaster:mainand the tags and creates
a GitHub Release; all three base images (synth,synth-backend,synth-ui) are published togitverse.ruandghcr.io(version tag only). - The stub package
@itphx/synth-runnerwas removed (7 → 6 packages);Runnerremains only in PROP-050. - The GitHub Release body is English (
changelog.sh --lang en), together with the English "Installation" block.
Documentation
- English documentation for the GitHub mirror:
README.en.md, thedocs/en/catalog (ARCHITECTURE, API_V2,
CONFIGURATION, HYBRID, UI-KIT, ROUTING, LLM_PROVIDERS, QUICKSTART, DEVELOPMENT, PUBLISHING, TROUBLESHOOTING,
KEYCLOAK) and the mandatory glossarydocs/en/GLOSSARY.md(RU→EN, product strings take priority). - A pair of release descriptions was introduced:
docs/releases/<VERSION>.md(the GitVerse body) and
<VERSION>.en.md(the GitHub body);scripts/changelog.shgained the--langand--outoptions. - Community files for the public mirror: CONTRIBUTING, CODE_OF_CONDUCT, SECURITY, SUPPORT, CHANGELOG,
THIRD-PARTY-NOTICES, issue/PR templates. - The positioning was updated: "AI platform for team collaboration" (self-hosted); promises about the
unimplemented opencode/cline engines were removed. - References to the
t11prototype were removed from the instructions and actionable places. - The dev docs were updated for the decomposition (per-package
AGENTS.md, module maps).
Artifacts
- npm:
@itphx/synth*@0.10.1(6 packages; npmjs.org and GitVerse Package Registry) - Docker: the base images are published to both registries (version tag only) —
gitverse.ru/itphx/synth:0.10.1,gitverse.ru/itphx/synth-backend:0.10.1,gitverse.ru/itphx/synth-ui:0.10.1andghcr.io/itphx/synth:0.10.1,ghcr.io/itphx/synth-backend:0.10.1,ghcr.io/itphx/synth-ui:0.10.1 - Helm: the
synthchart 0.10.1
Installation
CLI (npm — from npmjs.org or the GitVerse Package Registry):
npm install -g @itphx/synth@0.10.1Base Docker image from the GitHub Container Registry:
docker pull ghcr.io/itphx/synth:0.10.1
docker run -p 4300:4300 ghcr.io/itphx/synth:0.10.1The primary image registry is gitverse.ru/itphx/synth:0.10.1;
all three base images (synth, synth-backend, synth-ui) are published to
both gitverse.ru and ghcr.io (version tag only).