Repository navigation
Releases
Releases · curtainsmall/dsh-electro-lab
v0.13.0
Added
- External solvers: register your own calculation solvers over http. A declaration (name, description, parameters, an explicit
returns, endpoint, extra headers, timeout) lives in~/.dsh-electro-lab/external-solvers.jsonland is registered into the solver registry at engine start, sosolver_infoandcallwork on it unchanged; changes apply after a host restart. Manage them withexternal_solver_add/external_solver_update/external_solver_delete, by editing the archive file, or from the panel's External solvers tab. The protocol is a POST-only typed envelope,{requestId, args}→{requestId, result}or{requestId, error}, with the same error codes as local solvers (EXTERNAL_ERROR/EXTERNAL_HTTP/EXTERNAL_TIMEOUT/EXTERNAL_RESPONSE).
Changed
- A quantity leaf — in a declaration and in a built-in solver's signature — is spelled
numberorcomplex; the wordquantityis gone from signatures, failure receipts and the declaration editor.complextakes a real as well (ℝ ⊂ ℂ) andnumbertakes reals only, refusing a complex payload instead of narrowing it, so a signature can state which of the two it needs:solver_inforeadscomplex(resistance)where it used to readquantity(resistance), and a call that would narrow fails at the argument. Values keep their own spelling —numberfor a real,complexfor a{re, im}/{mag, ang}payload — so records, the wire format and peers are untouched.
Fixed
- Quantities nested in an array or object argument are converted like top-level ones. Before, a prefix or a variant word inside such an argument reached the solver untouched:
equivalent_impedanceon[0.1 kilo-ohm, 50 ohm]returned 50.1 instead of 150, silently, and the trace'sresolvedfield kept theprefixit claims to have applied. Every solver taking an array or object of quantities was affected — impedance networks, transfer-function coefficients, DFT sample arrays, transient time points. - A failed external call now keeps the reason fetch hides in its cause:
fetch failed: connect ECONNREFUSED 127.0.0.1:8787instead offetch failed. The log line carries it too, where it used to record only the code.
v0.12.0
Breaking
- PDF compilation now needs a LaTeX driver: latexmk (TeX Live) or MiKTeX's texify. A machine with only
xelatexinstalled no longer produces a PDF — the setup dialog says so before the run, and the.texis written either way.
Changed
- PDF compilation is delegated to a LaTeX driver — latexmk, else MiKTeX's texify — which decides how often the engine runs; the host never runs an engine itself. The LaTeX setup dialog checks the toolchain once per host start: without a usable driver and
xelatexthe Generate button is disabled with the reason shown, missing macros are only a warning, and such a request is refused before any model call. - A run compiles with that driver and reports the result: the PDF path, or one failure line with the
.texkept. No fallback at run time. - The failure line quotes the compiler when it says something, and is otherwise a localized note pointing at the log, which holds the driver's full output.
Fixed
- The pending-restart flag is cleared at every host start, whether or not external solvers are enabled; a state file that cannot be written is logged as
restart flag not clearedinstead of failing the mount.
v0.11.0
Added
- Logging: one text line per event, on stdout and in one file per host run (
~/.dsh-electro-lab/logs/<YYYY-MM-DD_HH-mm-ss.SSS>.log).DSH_ELECTRO_LAB_LOG_LEVEL(defaultinfo) is the only setting; the newest 20 files up to 50 MB are kept.
Changed
- Plugin state is one file,
~/.dsh-electro-lab/state.json(generation settings + external-declaration restart flag), written through one owner module that replaces the file atomically.
v0.10.0
Breaking
- Upgrading from 0.9.0: previously saved records (
records.jsonl+open-record.json) are no longer read and are not migrated — the engine now stores traces asrecord-index.jsonl+records/<id>.jsonl, so old records will not appear in the panel. - Sessions and integrations built for the old tool catalog will break: the previous tool names are gone — drive the engine with
set/get/callinstead (see Changed below).
Changed
- The tool catalog is replaced by a deterministic calculation engine (
set/get/callprimitives over typed values — number/complex/string/boolean/array/object with kind, variant and prefix — plus slot references that resolve at call time and are copied onset). One engine per process, one variable table per question; failures are receipts with no side effects. - Engine terminology everywhere: callables are solvers (38 kernel solvers: expression algebra, series, transfer functions, DSP/DFT, signal quality, circuits, electronics, RF & Smith chart, transmission lines, noise, filter design), the docs are the ElectroLab engine manual, and the record markers bracket each solve.
- The records UI follows the trace: Records list (indexed, 5 s refresh, incomplete badge, select mode with multi-delete) and a per-record timeline detail (collapsible writes/reads/failures/call cards, JSON tree values with zebra rows, display-all toggle, fixed toolbar/title with the timeline scrolling beneath, right-hand article rail).
- Record storage moved to append-only traces:
record-index.jsonl+records/<id>.jsonlunder~/.dsh-electro-lab(orDSH_ELECTRO_LAB_HOME), replayed — never recomputed — after a host restart.
Added
- Self-healing receipts: missing or mistyped arguments are listed together with the expected spec and a ready-to-send typed example;
@nameslot strings are rejected with a migration hint;solver_infointrospects any solver before its first call. - Article generation (Markdown and LaTeX) through the host LLM: the detail rail's two buttons open per-format setup dialogs (article language, host-driven directory browser, file name — remembered), and a cancellable background job reports phase progress in a dialog that can minimize to a corner pill surviving navigation. LaTeX output is a sanitized model body inside a XeLaTeX shell (ctexart / fontspec + unicode-math + siunitx, pure Unicode); PDF compilation is LaTeX-only (xelatex, two passes). Articles are written as the model's own calculation — never mentioning ElectroLab, solvers or the generation process.
Removed
- The old tool catalog's declaration machinery, solve-step orchestration and the five-section record UI.
v0.9.0
Added
- LaTeX article generation: the record detail action rail now has one Generate button per format (Markdown / LaTeX), each opening its own dedicated setup dialog — the format never switches inside a dialog, so layouts stay stable. LaTeX articles are proper technical documents: XeLaTeX shells (ctexart for zh-CN, article for en; both with unicode-math scalable math fonts — no cmex substitution warnings), the model writes only the body, and the host sanitizes it (forbidden preamble commands, brace/dollar balance, bare-% escaping) before wrapping.
- Compile-to-PDF checkbox (LaTeX dialog): the host finds xelatex (PATH first, then known MiKTeX install locations), runs two passes with
-interaction=nonstopmode -halt-on-error -synctex=1(plus--enable-installeron Windows so MiKTeX never shows an interactive prompt that would hang the job) and reports both the .tex and the PDF paths on completion; Open file opens the PDF. No TeX on the machine degrades gracefully to .tex only. - Per-project output folders for LaTeX:
<output>/<name>/holds<name>.tex, the PDF and the compiler's.aux/.logfiles, keeping the chosen directory clean; Markdown output stays a flat single file. - Markdown→PDF compilation through pandoc + xelatex when pandoc is installed (the compile checkbox works for both formats); a missing converter reports exactly what to install.
- The
compilephase in the generation progress dialog ("Compiling PDF…" / 「编译 PDF 中…」), sharedGenerationPhasewire codes between host and client, and a fixed-width label column + left-aligned labels in the setup dialogs. - All UI icons now come from Font Awesome free (SVG core, per-icon deep imports so the bundle stays small), including the official Markdown and TeX brand logos; the sidebar entry glyph is the FA wave-square path.
Changed
- The single Generate action was replaced by two per-format buttons with their own dialogs; the detail action rail matches the global sidebar width (55px) with full-width buttons.
v0.8.1
Added
- Cross-platform Open file / Open directory: the launcher follows the host's OS — explorer.exe on Windows,
openwith-Rreveal on macOS, xdg-open on Linux (reveal opens the containing folder, since xdg-open has no select). Previously non-Windows returned "not supported on this platform". - Spawn error detection: a missing opener binary (ENOENT, with a
/usr/binfallback for xdg-open) or a nonexistent target path is now reported to the client instead of silently succeeding.
v0.8.0
Added
- Article generation through the host LLM: the record detail page gains a Generate action; the setup dialog picks the output directory through a host-driven lazy directory browser (pure HTTP — works locally and remotely), the file name (default
electro-lab-<record-id>.md) and the article language; the host writes a proper technical article (exact H1/author line, H2 section headings, formulas and calculations on their own lines, numbers only from tool outputs) to disk. - Explicit article language in the generation setup: follow the question (default), Simplified Chinese, or English — a forced language is pinned in both the system and the user prompt; the choice is remembered together with the output directory (state.json, migrated from the legacy plain-text file).
- Progress dialog with stage text and an elapsed timer, cancel while running, and Open file (default application) / Open directory (Explorer reveal) actions on completion.
- Minimizable generation progress: the dialog collapses into a corner status pill (running / done / error) that survives any navigation — the records list, the session chat, even closing the panel. Generation state lives in a module-level client store rendered in a body-level overlay root, so the job keeps polling and stays visible anywhere.
- Fixed-size (380×190) progress dialog with both-axis centered content; generation errors display in the same dialog; the setup dialog shows inline validation for an empty output directory.
- Unified dialog shell and button language across the records page: a right action rail starting at the title row, an inline SVG icon set (no emoji or system glyphs), and reusable ghost/primary button components.
- Cross-panel center-column eviction: opening ElectroLab closes the SSH and task-board views and their controllers (and vice versa).
v0.7.0
Added
- Markdown export of a record (save-file picker with a download fallback): a localized H1, the id and timestamps as separate paragraphs, the five steps as unnumbered H2 sections, and each tool call as an H3 block with
Parameters/ResultH4 headings — value objects render in compact mathematical notation (100 Ω,100 + 25j Ω,1 ∠ 0 rad) and the outermost JSON braces are dropped. - Compact mathematical display for value objects in the records page: rect/polar inputs and serialized outputs (
{re, im, kind, …}) render as one math line with the unit fromkindand no expansion; numbers use standard notation (6 significant digits, scientific for extreme magnitudes). - Tool calls and results merged into one collapsible panel per call in the detail page (name → parameters → result); strings that embed JSON unwrap into trees.
- Record cards show the record id beneath the title (11 px monospace).
- Multi-select mode: a select button toggles selection of settled records — selected cards get the accent border plus a tint heavier than hover; a delete button batch-deletes the selection through a confirm dialog.
- Visible scrollbars in both themes (label-colored thumbs with the padding-box rounding trick) now that the page-level blur root cause is gone.
- Persona hard rules: value parameters must be value objects, never stringified JSON or bare numbers; the model must read the electro-lab-template skill before any tool call;
record_analysemust precede the first calculation tool and hold only the conditions and the approach — every computed value belongs inrecord_answer.
Changed
- The in-chat five-part template is dropped — records carry the structure, the chat answer stays natural; the template skill is now the record protocol.
- Circuit network leaves are complex value objects (
{form, re, im, kind}with kindresistance|inductance|capacitance); the bare-number{kind, value}leaf DSL is rejected by validation. - Records page polish: the Config tab and the header hint are gone (a single tab remains, styled like the dsh-ssh panel tabs); record cards are borderless ghosts that highlight only their border on hover; buttons and hover borders use solid label colors visible in both themes.
- Exported blocks switch from
jsontotextfences, since value objects are rendered as math lines rather than raw JSON.
Removed
- The single-record delete button on cards — batch delete covers deletion.
v0.6.0
Added
- Dual-language UI: every panel and records-page string moves into zh/en dictionaries registered into the DSH locale service; components re-render when the user switches language.
- Collapsible result panels in the detail page, matching the tool-call sections: one panel per result (titled by the matching call), outputs as a recursive collapsible JSON tree when parseable.
- Record error messages translate with the UI; error codes and tool error identifiers stay raw.
Changed
- The angle key is
angeverywhere — input and output — since the phase angle is always radians (SI); the oldangRadname is gone. - The preset persona and skills no longer force Simplified Chinese — the model follows the user language.
v0.5.1
Added
- Record detail as a tab-covering page: a back header with the record title, id and timestamps, a left table of contents that jumps to each section heading, and ONE shared scroll area where the five part headings stick to the top while scrolling (plain text only, no nested scrollbars).
- Collapsible tool-call panels in the detail page: one panel per call (expanded by default), arguments rendered as a recursive collapsible JSON tree.
Changed
- Detail texts use the session-chat font size; id/timestamps, the table of contents and the record-card title/timestamp use the navbar size. The back-to-record button matches the back-to-session button, with the title on its own line beneath; the panel back button now reads 返回会话.