Skip to content

Releases: CaryWang1234/SLATE

v0.4.4

Choose a tag to compare

@github-actions github-actions released this 05 Oct 09:02

SLATE v0.4.4

This release is about shape and surface: an Extensions page, custom themes and reply modes on the surface; a single-instance gate and tray residency in the shell. Underneath, the biggest win is rendering — long conversations no longer rebuild the whole thread on every streamed chunk.

✨ New

  • Extensions page — a new left-rail tab that consolidates five capability classes (skills, MCP servers, expert packs, knowledge bases and evolved tools) into columns instead of scattering them across Settings. Self-evolved tools now live in data/evolved/ rather than inside the source tree — the runtime no longer writes to the repo — and each one can be disabled, rolled back or reverted.
  • Custom themes — four source colours derive the whole token set; while a custom theme is on, the light/dark switch is locked. Adds a panel-transparency slider (55–100 %, --bg follows the mask density only), local font import (woff2 / woff / ttf / otf, ≤ 16 MB, shape-checked before the real name is adopted) and a read-only Wallpaper Engine integration: it reads WE's own config and preview images — multi-monitor sorted by number, anything over 4 MB skipped — and never launches the engine or changes its settings. Status text never leaks local paths.
  • Reply modes — four built-ins (Smart / Chat / Economy / Berserk) each bundle a reasoning effort, a tool whitelist and a max-round count. Modes are stored per conversation; Settings keeps only the default for new conversations. Switching happens in a capsule in the input bar with a button-anchored popover (up to seven at once); the old drop-down is retired. The whitelist has two gates — the native tools schema is filtered by mode, and modeAllowsTool blocks at the execution point — so a tool the mode doesn't allow cannot be reached even if the model asks for it.
  • Single-instance gate — one window per installation. Launching a second time brings the existing window to the front instead of opening a second process with two backends racing on one SQLite file (the second process used to truncate the first one's log on startup). The gate is a named mutex derived from the install directory and runs before log-clearing and backend start; the window it re-activates is pinned to the pid holding the lock. Installing to a different directory counts as a different installation. If the lock cannot be created, the app starts normally — better a second window than an app that won't open.
  • Windows tray residency — closing the window minimizes to the notification area and keeps working. Zero-dependency ctypes calling Shell_NotifyIcon directly; if the tray fails to come up, it falls back to exiting outright rather than disappearing silently.
  • Session archive, automatic titles, auto-resume on round cap — archive a conversation from the task rail (a run still generating is refused with a reason); restore or delete from Settings → Session archive (delete confirms first and clears the messages with it, and an older database gets the archived column added on upgrade). Titles are generated after the first round but only ever replace the placeholder name — a name you edited, or one given by the background or a team conversation, is never touched. AutoPilot now auto-resumes when the round cap is hit in any non-Manual approval level, waits until the conversation is genuinely idle, and gives one echo per resume (max 2 per conversation); Manual still just hangs the resume bar.
  • Round snapshot & revert — when the model actually wrote files during a round, a card appears at the end of the reply listing every file changed, its line delta and a per-file diff, with one-click revert (red confirmation) — groundwork for source-level self-evolution. Only the three real write endpoints (apply-edit / create-file / append-file) are accounted; a file you edited after the round is skipped and reported rather than clobbered. Snapshots are scoped to the project and stored in data/round_snapshots/ (7 days, 2 MB per file), never inside your repository.
  • Team conversations: persistence and decision stops — full transcripts are written to the database instead of living only in localStorage, failed members are marked as not participating instead of entering the context, manual stops are also recorded and re-readable, usage comes from the real usage field, and a decision point can stop the round and wait for you. The wake channel and the task centre share one path.
  • Night mode keeps the machine awake — the fully-managed approval level now also holds the power state while a run is active, via a resident backend thread (a lease heartbeat covers a page crash).
  • Settings left rail, rebuilt — the rail is generated from the actual .settings-block sections (21 of them) instead of a hand-written list, which had silently missed three blocks; storage is its own group, and the top of the rail gets a search box that filters by section, outlines the matching row without changing its size, reports "N groups / matched N" and resets on Esc.
  • macOS — window sizing, data directory (~/Library/Application Support/SLATE, not inside the .app), packaging manifest, update links and shortcuts are split by platform. ⌘N / ⌘D work; diskutil joins the approval list. Note: tray residency and the single-instance gate are Windows-only for now.
  • Grind rounds no longer execute tools — "grind a requirement" and the Autopilot charter's "must include a tool call" were two opposite instructions in the same request; the grind round now gets its own prompt variant, no tool catalogue, and runToolLoop is not called at all.

⚡ Performance

  • Streaming render coalescing + incremental thread repaint. Measured baseline, isolated data directory and a real browser: appending a 300-message transcript cost 180 ms (5.7 ms at 4 messages), and a single 5,638-character reply rewrote the DOM 1,411 times, with the longest frame at 3,016 ms — 6.4 seconds of long tasks. Four streaming paths now go through one painter that repaints at most every 60 ms, always drawing the last version to arrive, and must flush before the cursor is removed (otherwise the final chunk is lost or the removed cursor gets painted back). renderThreadInto no longer starts by clearing innerHTML; it compares against a threadViews ledger keyed by message object identity plus an O(1) signature and redraws only what changed — the signature deliberately excludes msg.id, so bubbles don't redraw just because the id landed, which would otherwise drop the thinking panel and any expanded cards. After: 300-message append 2.1 ms; longest streaming frame 99.5 ms; long tasks down to zero.
  • The tool catalogue sent to the model shrank by nearly a fifth (11,925 → 9,336 characters), with the closure protocol defined in exactly one place.

🐛 Fixed

  • The Extensions page could not create a mode by hand. setFormDisabled unconditionally included the id field, running after the correct fId.disabled = !isNew and overwriting it: the id box was greyed out on "new" while save() required an id. The previous round only exercised creation through the model's mode_write, so the guard stayed green. The form lock no longer touches the id.
  • Incremental repaint left another conversation's subagent panel on screen. That panel is an adopted child node, not a message; the old code cleared the host on every notify and swept it away, but incremental repaint had no one to do it. The panel now records its owning conversation, and the repaint tail removes anything that isn't an accounted message node, the shared project chip, or a panel belonging to the current conversation.
  • Desktop dialogs toggled a class that moved no pixels. Desktop style.css has no global .hidden utility (that one is mobile-only), so 13 controls that open and close by toggling it — including three "Stop" buttons that were present from the very first frame and wrote false state when clicked — needed explicit rules. Three mobile ones too.
  • The docs pages could stay permanently invisible. The IntersectionObserver only listened for isIntersecting; a block that jumps from below the viewport to above it in one frame never fires, so it stayed at opacity: 0 and the counters stayed at 0 (removing the fallback measured 45/45 sections affected). A scroll sweep, a noscript fallback and a reduced-motion path were added.
  • The parallel cap was bypassed by the whole queue at once. In pump, the starter hadn't awaited startRun yet, so runs.size was still the old value and the entire queue was released — same-project serialization defeated. canStart now takes a reserved count, and a pump is scheduled when the cap or the background switch changes.
  • Context compression turned system messages into user bubbles. After compaction the retained segment was rebuilt from the backend's keep_messages projection, which only carries {role, content, display} — hidden and model were dropped, so nudges and tool-result injections rendered as ordinary user messages. It now reads the local message objects, in one shared pure function across desktop-auto, desktop-manual and mobile. (Hidden turns are still sent to the model; not sending them was never the fix.)
  • Repeatedly sending "continue" recursed without bound. The back-look pointer that finds the task text carried no depth, so every layer borrowed the same row. Depth is threaded now, with both a deep and a shallow assertion pinned.
  • i18n silently failed on attributes. The skip list was one list, so input / textarea were skipped wholesale "because they're input boxes" — every placeholder / title key in the dictionary was a dead key. Split into content and attribute sets; the dictionary grew 1,927 → 2,067 (140 audited misses plus 8 backend labels and JS template strings found by a walk) and 59 duplicate keys wer...
Read more

v0.4.3

Choose a tag to compare

@github-actions github-actions released this 26 Sep 08:48

SLATE v0.4.3

The largest release so far. Two themes run through it: many projects at once (a project registry, cross-project parallel runs, per-project overlays for Actions / knowledge / MCP) and long-running work you can see and stop (background terminal tasks and subagents, three-tier wake-up, a rebuilt autonomous loop with an explicit "done" channel and one-click resume). On top of that, three approval levels moved into the input bar, the right rail was consolidated into a single column, and silent endings became loud.

✨ New

  • Project registry and switcher — register several projects and switch the active one from the sidebar; each conversation belongs to a project. Per-project config overlays merge three effective values (global / project / workspace) at a single injection point, so Actions, the knowledge base and MCP servers can differ per project.
  • Cross-project parallel runs — a registry of runs keyed by conversation: two projects can generate at the same time, each with its own usage accounting and background badge. Switching the visible conversation mid-run rebinds cleanly instead of disturbing the other run.
  • Background terminal tasks (bg_task) — for long commands (experiment servers, compiles, training). Actions start / status / log / stop / list, a ring buffer plus data/bg_tasks/<id>.log, and the whole process tree is collected (killpg on POSIX, taskkill /F /T on Windows). States are running | exited | stopped | failed. High-risk commands still pass the same double check as terminal. Crucially, the model is not asked to poll: it is woken by events — at an idle round boundary, at the round cap via extend, and by an idle slow-probe auto-resume (global switch on by default, 3 auto-resumes per conversation).
  • Background subagents — subagent_run accepts background=true and shares the same wake-up, badges and right-rail panel as bg_task; local batch lists and backend task lists merge into one view.
  • Background task panel — a right-rail panel listing every live task with its state, tail output and stop control.
  • Three approval levels, per conversation — Manual (commands and network access both ask) / Auto (only high-risk rules ask) / Full Access (nothing asks; catastrophic commands are still hard-blocked by the backend, and the icon and label are both red). The level lives in the input bar, is stored per conversation, and the Settings page is demoted to "the default level for new conversations". Mobile gets the same control; the decision point is consolidated into riskguard alone, and parallel calls now queue their dialogs instead of racing.
  • Per-item AI feature switches — Settings → AI helpers lists every token-spending feature with its own on/off switch and model picker.
  • Workspace project type — a project that stores config in the host directory while its members can be arbitrary folders, with exactly one current root at any time; file / Git / terminal keep single-root semantics, and you add or remove members from the sidebar chip.
  • Per-project constitution — opening a project no longer overwrites the global constitution; an effective version is computed and injected at one point, and Settings says which copy you are editing.
  • Context budget per model + capability-aware thinking effort — a per-model context slider (Auto / 100K / 200K / 400K / 600K / 800K / 1M) whose value is simultaneously the auto-compaction threshold and the usage-bar denominator. Thinking effort is split into 9 endpoint capability classes covering Kimi / Qwen / GLM / Doubao / MiniMax / ERNIE / Ollama and custom endpoints: models that force reasoning get no "off", on/off models are labelled "low/medium/high are all treated as on", unsupported ones are greyed out with an explanatory toast, and a 400 naming the field causes one retry with it stripped — worst case the level is ignored, not the model unusable.
  • Autonomous loop made visible and stoppable — AutoPilot no longer treats "no tool call this round" as finished: when the model claims completion it runs a bounded wrap-up check and feeds the gap back. exit_target_mode and exit_autopilot let the model stop after its final report rather than being aborted. When a run stops, the reason is stated and a "Continue to completion" bar appears in the message list — one click resumes from the current context. Round caps were raised (Autopilot 18/28 → 24/40, target mode 50 → 80), and narrow stored maxRounds are lifted on load.
  • Board view: Workflow (5th tab) — a wall of Slate Actions cards you can run directly, plus a live progress layer that pulls snapshots and patches only changed leaves to survive per-round redraw storms. Team conversations persist with real ledger edges (parentCallId), so the star map draws actual edges rather than guesses.
  • Sidebar task list: sorting + four states — a zero-dependency pure function classifies each conversation as in-progress / needs-attention / errored / done-unread, with five sort orders (recent / by project / by status / created / by usage). Both the classic Tasks tab and the Codex history rail host a control over the same preference. "In progress" only ever comes from live generation rights and is never persisted (no zombie spinners after restart).
  • Right-rail TODOLIST can be collapsed at will — a top-bar switch (mirrored into the Codex quick row above the input) returns the whole column's width to the message area, shows {done}/{total} while collapsed, and greys out with a reason when this conversation has no list. The preference is local-only.
  • Collapsible history summary — the auto-compaction summary is still sent to the model in the same format but renders as a collapsed strip on both desktop and mobile, parsing Markdown only when expanded.
  • Terminal: one-shot shells on Windows — one PowerShell process per command, the command body fed over stdin, exit code reported by the script tail. This kills the whole class of "my command got eaten": multi-line blocks hang in continuation mode, a dirty pipe pins later commands, and PowerShell 5.1 does not understand && yet returns 0.
  • MCP brand icons — 22 vendor SVGs from LobeHub's static set are inlined as SVG marks (with fill-rule preserved, otherwise hollow logos fill in as solid blocks) and matched by server name or URL, in one colour path across light and dark themes.
  • Docs site v2 — aurora backdrop, glass cards, cursor-follow highlight and a facts marquee.

🐛 Fixed

  • A new conversation no longer sends empty history — state.messages (the reference to the visible thread) and threads (one array per conversation) could diverge: creating a conversation changed currentConversationId without rebinding, so the user's message advanced the previous thread's array while buildMessages read an empty bucket for the new id — upstream received only ['system'] even though the bubble was visible. Now the new conversation rebinds immediately, and addMessage decides three ways, including adopting the caller's array when it has no owner, because the kernel's render-suppression marker (_pendingToolMsgs) is released by object identity — swapping that array would leak the marker forever.
  • An interrupted output is no longer silent — when the stream ends naturally after producing content but with neither [DONE] nor finish_reason, the round is now flagged and reported in every mode, with the cause distinguished (thinking consumed the whole output budget, or upstream cut the stream early). A run that produced text but stopped early is marked possibly incomplete, and the existing "Continue" entry is reused. Previously both the notice and the resume path hung off Autopilot/target mode, so with them off you got zero signal and just watched it stop.
  • The right rail can no longer split into two columns — TODOLIST, task centre and the ink panel were direct children of the horizontal chat row, so two open panels became two side-by-side columns squeezing the message area. They are now stacked inside one .rail-col; the column collapses on its own when all are hidden.
  • Thinking-effort slider popup stuck open on desktop — #effort-pop had no .effort-pop.hidden { display:none }, and desktop style.css has no global .hidden utility class (that one is mobile-only), so JS toggled a class while the pixels never moved.
  • The build script did not run — Chinese comments in build_desktop.bat made cmd.exe swallow line breaks and execute the following line as garbage; comments are now ASCII-only.
  • Model icons follow the model on any path, and the GLM logo no longer inverts wrongly in dark mode.
  • buildPersistentData dropped reasoningEffort — the downstream normalizer turned undefined into auto, and the merge-style write overwrote the user's choice, so the level never reached desktop_state.json. A consumed ⊆ produced invariant now pins the whole persistence chain.
  • renderFileTree empty-check fooled by built-in array methods — !data.entries let an array with its own .entries through, throwing "not iterable" when a project was closed.
  • Background panel state enum was missing the backend's failed, so a non-zero exit displayed as a vague "ended abnormally".

🔧 Chores

  • Version bumped to 0.4.3 (APP_VERSION and installer MyAppVersion in sync); frontend cache string refreshed to 20260925-011; 35 self-check scripts in tree, all green, plus browser walks and mutation probes for every new contract.
  • 79 groups of colloquial and verbose UI strings removed, with i18n keys, English values and literals rewritten together (9 guards re-pinned to the new anchors).
  • The five built-in SKILL.md skills and two expert-pack seeds ship with the package (installed only if absent).
  • README / GUIDE / docs site counts and the setup guide synced.

📥 ...

Read more

v0.4.2

Choose a tag to compare

@github-actions github-actions released this 13 Sep 14:08

SLATE v0.4.2

A feature patch that turned the Settings activity view into something you can actually read a habit off, shipped the first half of the Slate Actions mechanism, and closed a class of silent frontend failures.

✨ New

  • Activity heatmap, rebuilt — cell size cap raised 13px → 20px with auto-scaling gaps, and the canvas is now centered as a whole when it is narrower than its container. A new metrics strip reports longest streak / current streak / best day / active-day average, counted only over the visible range (an empty today does not break the streak). Hovering a cell lifts it with a gold ring.
  • 2048, hidden in the heatmap — double-click any cell to play; the best score stays in local storage.
  • Slate Actions P0/P1 — backend/slate_yaml.py parses and validates the SAY-1 subset; routers/actions.py exposes list / read / write / delete / history-rollback; two tools (actions_read, actions_write) with writes behind the approval gate; the action directory is injected into the system prompt; the Settings panel gets a read-only list, an editor, delete and rollback; @mention candidates inject with a size cap.
  • Reasoning effort mapped upstream — proxy.py now maps reasoning_effort across all four protocols and passes Gemini thinking through.

🐛 Fixed

  • A contradiction inside the conversation-mode prompt — SYSTEM_BASE split into four sections (role / duties / agent protocol & tool discipline / answer style); agent mode reassembles byte-identically, conversation mode strips every tool instruction instead of arguing with its own [对话模式] declaration.
  • Refreshing ate your thinking-effort level — the control fell back and persisted during assembly, when the model was not yet known, so a reload could knock high back to auto. It now only falls back once the model is settled.
  • No more silent frontend failures — a new POST /api/diagnostics/js-error writes to data/js_errors.log (500KB rotation, deduplicated, origin+path only); error_sink.js captures error and unhandledrejection (with network-noise filtering and a 30-per-session cap), and five catch sites in the chat path now report their stage.
  • Whiteboard focus blew the stack — Math.min(...xs) over a large point set is a RangeError at ~125k points; replaced with a per-point scan. pointermove also drops sub-0.5px jitter, and the same spread-on-Math.max fix was applied to the Git tree canvas.
  • glm.svg updated.

🔧 Chores

  • Version bumped to 0.4.2; frontend cache string refreshed to 20260913-008; 16 self-check scripts in tree by this tag (check_error_sink, check_reasoning_effort, check_proxy_reasoning, check_usage_heatmap and check_slate_yaml, check_actions_contract among them); README / GUIDE / docs site counts synced.

📥 Downloads

Platform File
Windows 10/11 x64 SLATE-Setup-0.4.2.exe (checksum: SLATE-Setup-0.4.2.exe.sha256)
macOS SLATE-Setup-0.4.2.dmg (checksum: SLATE-Setup-0.4.2.dmg.sha256)

Install over the previous version — chat history, projects and API key settings are preserved.

⚠️ Known limitations

  • Slate Actions is at P0/P1: a SAY-1 subset only, and the @mention injection is capped, so long action libraries are not fully addressable.
  • The activity heatmap reads days aggregated locally; changing the machine time zone re-buckets history.
  • The hidden 2048 keeps its best score on one machine only.

SLATE 砚 v0.4.2

本次为功能补丁:把设置页的活跃度视图做成真能看出习惯的样子、落地 Slate Actions 机制的 P0/P1,并收掉一类前端静默失败。

✨ 新功能

  • 活跃度热力图重做:格子边长上限 13px → 20px、缝随边长自适应,画布窄于容器时整块居中。新增指标条「最长连续 / 当前连续 / 单日最高 / 活跃日均」,只在可见区间统计(今天空着不算断连续)。格子悬停抬起并加金圈。
  • 藏在热力图里的 2048:双击任意格子即可开局,最高分只存本机。
  • Slate Actions P0/P1:backend/slate_yaml.py 实现 SAY-1 子集解析与校验;routers/actions.py 提供列表/读取/写入/删除/历史回滚路由;actions_read、actions_write 两个工具(写入走审批门);系统提示注入动作目录;设置页面板支持只读列表、编辑器、删除与回滚;@mention 候选带上限注入。
  • 推理强度映射到上游:proxy.py 补齐 reasoning_effort 在四种协议下的映射,并透传 Gemini 思考。

🐛 修复

  • 对话态提示词自相矛盾:SYSTEM_BASE 拆成「角色 / 职责 / Agent 协议与工具纪律 / 回答风格」四段,智能体态拼回逐字一致,对话态整段剥离工具指令,不再与自己的 [对话模式] 声明打架。
  • 刷新把「思考强度」档位吃掉:装配期模型尚未确定时就回落并落盘,一次刷新能把 high 打回 auto;现在只在模型已确定时才回落。
  • 前端异常不再静默:新增 POST /api/diagnostics/js-error 落 data/js_errors.log(500KB 轮转、去重、只留 origin+path);error_sink.js 捕获 error 与 unhandledrejection(过滤网络噪音、每会话上限 30 条),聊天链路上 5 处 catch 补上环节名上报。
  • 白板聚焦爆栈:Math.min(...xs) 在大点集上是 RangeError(约 12.5 万点即触发),改为逐点扫描;pointermove 顺带丢掉 0.5px 以下的抖动,git 树画布的 Math.max 同理修正。
  • glm.svg 更新。

🔧 工程

  • 版本号升至 0.4.2;前端缓存串刷新为 20260913-008;该 tag 时仓库内共 16 个自检脚本(含 check_error_sink、check_reasoning_effort、check_proxy_reasoning、check_usage_heatmap、check_slate_yaml、check_actions_contract);README / GUIDE / 官网计数同步。

📥 下载

平台 文件
Windows 10/11 x64 SLATE-Setup-0.4.2.exe(校验:SLATE-Setup-0.4.2.exe.sha256)
macOS SLATE-Setup-0.4.2.dmg(校验:SLATE-Setup-0.4.2.dmg.sha256)

覆盖安装即可,会话历史、项目与 API Key 配置全部保留。

⚠️ 已知限制

  • Slate Actions 处于 P0/P1:只支持 SAY-1 子集,且 @mention 注入带上限,动作库很长时无法全部寻址。
  • 热度图按本机日聚合,改机器时区会把历史重新分桶。
  • 隐藏 2048 的最高分只记在本机。

v0.4.1

Choose a tag to compare

@github-actions github-actions released this 12 Sep 05:04

SLATE v0.4.1

A stability and polish patch focused on three things: tool calls no longer vanish silently, the backend no longer stalls on long-running tools, and the typing game now ships a bigger, user-editable corpus.

✨ New

  • Typing game: larger corpus + custom lists — built-in lines grew from 20 to 62, spanning git/shell, PowerShell, Python, JS/TS, SQL, containers & networking, HTML/CSS/JSON/YAML and English prose. A custom corpus now lives at data/typing_custom.txt: edit and save it in Settings, or change the file in any editor and hit Reload. Choose Mixed / Built-in only / Custom only (preference remembered locally); non-ASCII lines and out-of-range lengths are dropped with a skipped-line count.

🐛 Fixed

  • Tag-style tool calls are no longer read as plain text — some models emit <tool_name> instead of the ◈◈◈ opener; those calls were never parsed, so the round ended as an ordinary reply and the task silently stopped. Recognition is now unified across ◈◈◈, tag-style and DeepSeek DSML forms, including prose cleanup.
  • No more wasted rounds — a call with complete arguments but a </tool_name> closer is no longer mislabelled as "truncated" and skipped.
  • MCP tool calls blocked the whole backend — tools/call now runs in a thread pool. Previously synchronous tools such as terminal, computer_use and web_search (tens of seconds each) held the event loop and froze streaming chat responses.
  • Pressing Escape on the high-risk approval dialog broke the permission guard — the pending authorization stayed suspended forever; Escape now settles it as a reject before closing.

🔧 Chores

  • Version bumped to 0.4.1 (APP_VERSION and installer MyAppVersion in sync); frontend cache string refreshed to 20260912-002.

📥 Downloads

Platform File
Windows 10/11 x64 SLATE-Setup-0.4.1.exe (checksum: SLATE-Setup-0.4.1.exe.sha256)
macOS SLATE-Setup-0.4.1.dmg (checksum: SLATE-Setup-0.4.1.dmg.sha256)

Install over the previous version — chat history, projects and API key settings are preserved.

⚠️ Known limitations

  • Custom corpora are one entry per line, English and symbols only (6–220 characters); lines with CJK characters are skipped.
  • Live argument streaming (Ink Stream) still only covers unclosed ◈◈◈ blocks; tag-style calls render once the round completes.

SLATE 砚 v0.4.1

本次为稳定性与体验补丁,聚焦三件事:模型工具调用不再静默丢失、后端不再被长耗时工具挂起、打字小游戏可自带题库。

✨ 新功能

  • 打字小游戏题库扩充与自定义:内置题库由 20 条扩至 62 条,覆盖 git/shell、PowerShell、Python、JS/TS、SQL、容器与网络、HTML/CSS/JSON/YAML、英文散文八类;新增 data/typing_custom.txt 自定义题库,设置页可直接编辑保存,也可用任意编辑器改文件后点「重新读取」。支持「混合 / 只用内置 / 只用自定义」三档切换,偏好本地记忆;非 ASCII 与长度不合的行会自动剔除并提示跳过条数。

🐛 修复

  • 标签式工具调用不再被误判成纯文本:部分模型会把 ◈◈◈ 开标记写成 <tool_name>,此前这类调用解析不出来,整轮被当成普通回复收尾、任务静默停止。现已与 ◈◈◈、DeepSeek DSML 三种写法同源识别,正文清洗同步跟上。
  • 不再白跑一轮:收尾标记写成 </tool_name> 但参数其实完整的调用,不再被误标为「截断」而跳过执行。
  • MCP 工具调用阻塞整个后端:tools/call 改为在线程池中执行。此前 terminal、computer_use、web_search 等耗时数十秒的同步工具会占住事件循环,导致聊天流式响应整体卡死。
  • 高危审批弹窗按 Escape 会失效权限守卫:Escape 直接隐藏弹窗会让等待中的授权请求永久挂起,现在统一走「拒绝」分支后再收起。

🔧 工程

  • 版本号升至 0.4.1(APP_VERSION 与安装包 MyAppVersion 同步),前端资源缓存串刷新为 20260912-002。

📥 下载

平台 文件
Windows 10/11 x64 SLATE-Setup-0.4.1.exe(校验:SLATE-Setup-0.4.1.exe.sha256)
macOS SLATE-Setup-0.4.1.dmg(校验:SLATE-Setup-0.4.1.dmg.sha256)

覆盖安装即可,会话历史、项目与 API Key 配置全部保留。

⚠️ 已知限制

  • 自定义题库一行一条,仅支持英文与符号(6–220 字符),中文行会被跳过。
  • 流式参数实时预览(砚流)暂只覆盖 ◈◈◈ 未闭合形态,标签式写法要等本轮结束才呈现。

v0.4.0

Choose a tag to compare

@github-actions github-actions released this 11 Sep 14:33

English

SLATE v0.4.0

🆕 New Features

  • Second UI: Codex layout (v3) — switchable from Settings, persisted in shared config so desktop and mobile agree
    • Slim left sidebar: 6 entries + project-grouped session history + settings pinned to the bottom
    • Welcome screen keeps only the slogan; the input box is docked full-width at the bottom
    • Mode entries collapsed into the "+" menu above the input (Grind Mode / Brainstorm Mode / Target Mode / Scheduled Tasks, plus @-mention groups); the four legacy header buttons are gone
    • Tool calls render as a single-line summary (icon + tool name + content); message bubbles flattened, radii opened up
    • anime.js entrance motion layer, fully bypassed under prefers-reduced-motion
  • Inkstream: tool arguments previewed while they stream
    • Schema-aware, fault-tolerant prefix parser — even half-written JSON surfaces as readable progress
    • Bounded excerpts with 120–200ms throttling; trivially short params skipped
  • True cancellation of running tools
    • New POST /api/skills/stream; closing the stream cancels the call server-side
    • terminal / code_scan / html_bundle implement run_stream, and the abort signal is threaded through executeToolCalls — "Stop" now really stops work in progress
  • One agent-loop kernel for desktop and mobile
    • agent_loop.js + agent_common.js: a single loop, with per-surface io / policy adapters
    • Tool-call events are persisted to a ledger (backend events.py) and projected back into the UI (agent_ledger.js / tool_meta.js), so live and replayed runs share one vocabulary
  • Session summary rail (classic UI)
    • Left column becomes three tabs; the summary aggregates commands, CLI and file activity into icon-labelled groups
    • Context metered per bucket (system / tools / conversation / …) — switching models no longer zeroes the usage panel
    • Settings gains a model connectivity test (TTFT, elapsed, reply preview, stop) and a typing game
  • Kanban rail can go full-screen over the Whiteboard panel
  • Docs site rebuilt around a positioning page ("four differences from hosted agents"), with an anime.js motion layer and the full 34-tool grid moved into guide chapter 17

🔧 Fixes

  • DeepSeek-family models intermittently leak their internal DSML tool-call markup into the reply body; such a round used to be judged as plain text and the agent loop silently stopped. Complete invokes are now recovered into executable calls (still passing validation and the risk guard — a truncated call is never guessed, the model is asked to resend), and all 9 "did this round call a tool?" gates in desktop and mobile are format-agnostic, so leaked markup is stripped from both live and history bubbles.
  • Model registry corrected for stale ids, names and endpoints, with an id-migration path so renaming an entry no longer discards its stored API key; supports_responses removed from non-OpenAI endpoints.
  • The input tool row leaked into the classic layout; it is now Codex-only.

📦 Installers

  • Windows: SLATE-Setup-0.4.0.exe (with SHA256 checksum)
  • macOS: SLATE-Setup-0.4.0.dmg (with SHA256 checksum)

Full Changelog: v0.3.8...v0.4.0

中文

SLATE v0.4.0

🆕 新功能

  • 第二套界面:Codex 布局(v3)——设置页可切换,uiMode 存进共享配置,桌面与移动同源
    • 精简左栏:6 个入口 + 历史会话按项目分组 + 设置常驻底部
    • 欢迎页只留 Slogan,输入框贴底并铺满整行宽度
    • 模式入口收拢到输入框上方的「+」菜单(磨墨 / 头脑风暴 / 目标模式 / 定时任务,含提及分组),原四个顶栏按钮删除
    • 工具调用改为单行摘要(图标 + 工具名 + 内容);消息气泡去边框扁平化、圆角整体加大一档
    • anime.js 入场动效层,开启 prefers-reduced-motion 时整层不介入
  • 砚流:工具参数边生成边预览
    • schema-aware 容错前缀解析,半截 JSON 也能还原成可读进度
    • 摘录长度有界 + 120–200ms 节流,过短的参数直接跳过
  • 停止即真取消
    • 新增 POST /api/skills/stream,关闭响应流即从服务端取消该次调用
    • terminal / code_scan / html_bundle 实现 run_stream,abort signal 贯穿 executeToolCalls——点停止不再只是断开显示
  • 桌面与移动共用一个 agent 循环 kernel
    • agent_loop.js + agent_common.js:单一循环,各端只提供 io / policy 适配
    • 工具调用事件落账到后端 events.py,再由 agent_ledger.js / tool_meta.js 投影回界面,实时执行与回放同一套口径
  • 会话总结栏(经典界面)
    • 左栏改三页签;总结栏按命令 / CLI / 文件分组并配图标
    • 上下文分桶计量(system / tools / 对话 …),切换模型不再清零用量面板
    • 设置页新增模型连通性测试(首字耗时、总耗时、回复预览、停止)与打字小游戏
  • 看板栏可全屏铺满黑板面板
  • docs 官网改版为定位页(「与托管型 Agent 的四点差异」),接入 anime.js 动效层,34 个内置工具全量清单下沉至 guide 第 17 章

🔧 修复

  • DeepSeek 系模型偶发把内部 DSML 工具调用标记吐进正文,此前该轮会被判成纯文本回复、agent 循环静默停止。现在闭合完整的 invoke 会还原为可执行调用(仍照常走参数校验与高危拦截;被截断的半截调用绝不猜着执行,而是催模型重发),桌面与移动共 9 处「本轮是否有工具调用」的门控改为格式无关,泄漏标记在实时气泡与历史记录里都会被清除。
  • 模型注册表纠正过时的 id / 名称 / 端点,并提供 id 迁移,改名不再丢已存的 API Key;清除非 OpenAI 端点上误标的 supports_responses。
  • 输入框工具行曾泄露到经典布局,现仅 Codex 展示。

📦 安装包

  • Windows:SLATE-Setup-0.4.0.exe(含 SHA256 校验和)
  • macOS:SLATE-Setup-0.4.0.dmg(含 SHA256 校验和)

Full Changelog: v0.3.8...v0.4.0

v0.3.8

Choose a tag to compare

@github-actions github-actions released this 31 Aug 13:09

English

SLATE v0.3.8

🆕 New Features

  • Global Code Search (code_search) — VSCode Ctrl+Shift+F style
    • Search text or regex across the current project, with precise file:line:column results
    • Defaults to the entire project root; narrow it down with the scope parameter (subdirectories inside the project)
    • Supports case sensitivity, filename glob filtering, and a result limit
    • Pure Python, zero new dependencies: skips noisy directories, whitelists text files, and scans concurrently for speed
    • Registered in the Settings → Tools / Skills panel, with a parameter form for manual execution
  • AI Media Generation Tools (image_gen / video_gen)
    • Generate images / short videos from a description (OpenAI-compatible /images/generations and /videos/generations)
    • New media-generation configuration section in Settings (model + API key), with sync return or async task polling
    • Inline preview of generated images and videos in chat
  • user_ask Requirement Input Dialog
    • When a task is missing a key condition (style / audience / format / language, etc.), the model proactively pops up a multiple-choice dialog
    • Users can pick a preset option or type a custom answer; the answer is fed back to the model to continue the task
  • Prompts Default to Tool-First Behavior (balanced activeness)
    • New "tools first" principle in the discipline section: verify instead of guessing, execute instead of describing
    • Factual / state questions default to checking project files or searching the web before answering
    • Removed suppressive wording such as "never call tools for pure Q&A" and "don't call tools just to look proactive"
  • Native OpenAI-style Tool Calling (function calling)
    • Streams and parses tool_calls, auto-serializes tool schemas, and feeds results back automatically
    • Automatically falls back to the text protocol for endpoints without tools support, staying compatible across models

🔧 Fixes

  • Goal mode stall detection: recognizes "talk-only, no-action" loops, warns and exits automatically
  • After a tool call fails, retries with different parameters / a different tool / more context instead of repeating the identical failed call

📦 Installers

  • Windows: SLATE-Setup-0.3.8.exe (with SHA256 checksum)
  • macOS: SLATE-Setup-0.3.8.dmg (with SHA256 checksum)

Full Changelog: v0.3.7...v0.3.8


中文

SLATE v0.3.8

🆕 新功能

  • 全局代码搜索 code_search(类似 VSCode Ctrl+Shift+F)
    • 在当前项目中按文本/正则搜索,返回 文件:行号:列 精确定位
    • 默认全局 = 当前项目根目录,可用 scope 缩小到项目内子目录
    • 支持大小写敏感、文件名 glob 过滤、结果数量上限
    • 纯 Python 零依赖实现:忽略噪音目录、文本文件白名单、并发扫描,高速轻量
    • 已注册进设置页「工具 / 技能」框,可点击弹出参数表单手动执行
  • AI 媒体生成工具 image_gen / video_gen
    • 基于描述生成图片 / 短视频(OpenAI 兼容 /images/generations 与 /videos/generations)
    • 设置页新增媒体生成配置栏(模型 + API Key),支持同步返回或异步任务轮询
    • 聊天内直接预览生成的图片与视频
  • user_ask 需求输入框
    • 模型执行任务缺关键条件(风格 / 受众 / 格式 / 语言等)时,主动弹出选择题弹窗
    • 用户可点选预设选项,也可自由输入自定义答案;答案回灌模型继续任务
  • 提示词默认工具优先(主动化平衡版)
    • 纪律区新增「工具优先」总则:能查证就不猜、能执行就不描述
    • 事实性 / 现状性问题默认查项目文件或联网佐证后再回答
    • 移除「纯问答绝不调用工具」「不要为了显得积极而滥用工具」等抑制措辞
  • 接入 OpenAI 系原生工具调用(function calling)
    • 流式解析 tool_calls、工具 schema 自动序列化、结果自动回灌
    • 不支持 tools 的端点自动降级为文本协议,兼容多模型

🔧 修复

  • 目标模式连续空转止损:检测「只说话不动手」的停滞循环,自动警告并退出
  • 工具调用失败后换参数/换工具/读上下文,不再重复相同失败调用

📦 安装包

  • Windows: SLATE-Setup-0.3.8.exe(含 SHA256 校验和)
  • macOS: SLATE-Setup-0.3.8.dmg(含 SHA256 校验和)

Full Changelog: v0.3.7...v0.3.8

v0.3.7

Choose a tag to compare

@github-actions github-actions released this 31 Aug 06:19

SLATE v0.3.7

🆕 新功能

  • 移动端遥控 UI(SLATE Mobile)
    • 手机浏览器遥控专用界面(独立入口 m.html,桌面版零回归)
    • 底部 Tab 导航五大面板:对话、会话历史、长期记忆、待办/定时任务、设置
    • 全能力对话:流式输出、思考卡片、工具循环、高危命令底部确认、文件 diff 审批
    • 会话管理:切换 / 新建 / 重命名 / 删除;长期记忆浏览与 CRUD;定时任务创建 / 立即运行
    • 设置面板:模型切换、API Key 管理、遥控地址 + 二维码、深浅主题
    • 手机访问遥控地址自动进入移动版,桌面 UA 不受影响
  • 系统元认知工具 system_info:查看本机系统信息(CPU / 内存 / 磁盘 / 网络),可加入技能列表,含自定义图标
  • 模型图标深浅色模式适配

🔧 修复

  • system_info 工具 URL 重复 /api 前缀导致模型调用 404
  • system_info 路由延迟加载、兼容无 psutil 环境
  • 移动端 sheet 弹窗 DOM 残留、密钥"留空清除"不可达、模型解析链、主题色同步等多项缺陷

⚙️ 构建 / CI

  • Windows Inno Setup:跟踪 ChineseSimplified.isl 语言文件,修复 CI 编译失败
  • Release workflow:手动触发时显式传入 tag_name,支持 workflow_dispatch 发布
  • macOS:spec 数据文件与依赖完整性、build_macos.sh bundle 名称、应用图标 app.icns
  • PyInstaller spec 补充 system_info / psutil hidden imports

📦 安装包

  • Windows: SLATE-Setup-0.3.7.exe(含 SHA256 校验和)
  • macOS: SLATE-Setup-0.3.7.dmg(含 SHA256 校验和)

Full Changelog: v0.3.6...v0.3.7

v0.3.6

Choose a tag to compare

@CaryWang1234 CaryWang1234 released this 29 Aug 08:49

SLATE v0.3.6 Release Notes

🎨 UI 改进

  • 模型选择栏位置调整:将模型下拉框从顶栏移至输入栏底部,与专家选择和发送按钮同列
  • 快捷按钮文字标签:四个顶栏按钮恢复文字显示(密钥/遥控/明暗/设置)
  • 模型图标支持:在模型选择器左侧显示对应供应商图标

🌓 主题适配

  • GPT 图标深浅色模式:浅色保持原色,深色模式变白(CSS filter)
  • Kimi 图标深浅色模式:浅色模式变黑,深色保持原色(CSS filter)

🛠️ macOS CI 构建修复

  • PyInstaller spec 兼容性:使用内置 SPECPATH 变量替代 __file__,避免运行时错误
  • 构建流程简化:移除 COLLECT 中间步骤,BUNDLE 直接接收 exe
  • 路径配置修正:统一输出路径为 dist/ 而非 dist/macos/
  • 工作流触发方式:改为仅手动触发(workflow_dispatch),避免自动构建

🐛 Bug 修复

  • 思维内容过滤:防止模型的推理/思考过程文本泄露到项目导览和规则手册中
  • UI 渲染问题:修复多处界面显示异常
  • 文件清理:删除无用文件,优化项目结构

📦 版本信息

  • 构建时间戳:20260829-143
  • 包含提交:12 个 commits(自 v0.3.5 起)

v0.3.5

Choose a tag to compare

@CaryWang1234 CaryWang1234 released this 29 Aug 01:37

SLATE v0.3.5 Release Notes

Release Date: 2026-08-29


Overview

v0.3.5 is a focused refinement release that modernizes the chat input UI, renames "Harness" to "Target Mode" across all user-facing surfaces, and fixes several critical bugs affecting Qwen model compatibility and placeholder rendering. All documentation (README, landing pages, user guide) has been updated to reflect the new naming.


New Features & Improvements

Modernized Chat Input UI

The chat input area has been redesigned into a cohesive card-style container following SLATE's flat/border-driven design language:

  • Two-zone layout: Borderless textarea on top, toolbar row (attach + expert select / voice + send) on bottom
  • Card container: Single border-radius: 8px with focus-within shadow elevation
  • Paperclip icon: Attach button upgraded from plain "+" text to SVG paperclip for visual consistency
  • Improved spatial organization: Toolbar actions clearly separated into left/right groups
  • Mention highlight integration: Updated to work seamlessly within the new .input-editor-zone structure

"Harness" Renamed to "Target Mode" (目标模式)

All user-visible references to "Harness" have been renamed to "Target Mode" / "目标模式" for clearer semantics:

  • Button label & icon: Lightning bolt replaced with bullseye/target SVG; tooltip updated
  • Onboarding cards: Title and description text updated in both English and Chinese
  • Toast messages: Toggle on/off, idle status, round progress, exit reason, abort notice — all updated
  • Grind mode actions: "Send to Target Mode" replaces "Send to Harness"
  • System prompt: HARNESS_PREFIX internal constant renamed; round tag [Target Mode · x/N]
  • Settings & notifications: Description text updated
  • i18n translations: 15+ Chinese/English translation pairs synchronized

Documentation Updates

All public-facing documentation now reflects "Target Mode" naming:

  • README.md / README-zh.md: Intro, highlights, feature sections
  • docs/index.html: Meta description, stat hints, feature cards, highlight section
  • docs/zh/index.html: Full Chinese localization parity
  • docs/guide.html: TOC, Chapter 4 heading, bilingual content, Grind Mode three-action description

Bug Fixes

Qwen Model Stream Compatibility (#P0)

Problem: Qwen3.7-Plus (and potentially other OpenAI-compatible providers) sends SSE chunks with empty choices: [] arrays during streaming. The backend crashed with list index out of range when accessing choices[0].

Fix: Added safety checks before array access in both streaming (_stream_openai) and non-streaming (_call_openai) paths:

  • Empty choices → skip chunk (streaming) or return friendly error (non-streaming)
  • No more crashes on metadata-only frames

Placeholder Overlap After Send (#P1)

Problem: After sending a message, the textarea placeholder text would visually overlap with the empty input box. Clicking/focusing the textarea fixed it temporarily.

Root cause: Programmatic value = "" clearing doesn't always trigger browser placeholder recalculation when the element retains focus.

Fix: Dispatch new Event("input", { bubbles: true }) after every textarea clear (4 locations: normal send, queue capture, /grind command, abstract task detection). Forces browser to recompute and correctly render the placeholder.

escapeHtml ReferenceError (#P0)

Problem: renderUsageBar() called undefined escapeHtml(), crashing model list initialization. The actual function is named escapeHtmlLocal() (chat.js line 396).

Fix: Updated two calls at lines 3695 and 3697 to use escapeHtmlLocal().


Technical Details

Files Modified

File Changes
frontend/index.html Input area HTML restructure; harness button icon/title; onboarding cards; settings text
frontend/css/style.css New #chat-input-area card styles; .input-editor-zone; .input-toolbar; updated #chat-input; mention layer padding
frontend/js/components/chat.js setupMentionHighlight() targets .input-editor-zone; escapeHtmlLocal fix; all "目标" → "目标模式" toast/progress messages; input event dispatch after clear
frontend/js/services/i18n_dict.js 15+ translation key updates for Target Mode naming
frontend/js/app.js Enhanced loadModels() logging for debugging
backend/routers/proxy.py Empty choices safety check in _stream_openai and _call_openai
README.md / README-zh.md All Harness → Target Mode references
docs/index.html / docs/zh/index.html Landing page content updates
docs/guide.html User guide chapter updates

Version Bump Chain

This release accumulated multiple version bumps during development:

  • 20260828-132 → Input UI HTML restructure
  • 20260828-133 → Input UI CSS + JS integration
  • 20260828-134 → Target Mode rename (icon, HTML, onboarding)
  • 20260828-135 → Target Mode rename (chat.js toasts, i18n)
  • 20260828-136 → escapeHtml fix
  • 20260828-137 → Placeholder overlap fix
  • 20260828-138 → Documentation updates

Final frontend version: 20260828-138
Installer version: 0.3.5


Upgrade Notes

  • Frontend cache: All JS/CSS files carry ?v=20260828-138 query string; browsers will fetch fresh copies automatically
  • Backend: Only proxy.py changed; restart the server to apply the empty-choices fix
  • No database migration required: This release contains no schema changes
  • No breaking changes: "Target Mode" is a rename only; all existing conversations, TODOLISTs, and settings remain intact

Known Issues

None introduced in this release. Pre-existing issues from prior versions remain unchanged.


Credits

All changes authored and verified by the SLATE core team. Syntax checks, mojibake validation, and manual browser testing completed before release.

v0.3.4

Choose a tag to compare

@CaryWang1234 CaryWang1234 released this 28 Aug 02:42

v0.3.4 (2026-08-28)

基于 commit dbb2c1b | Full Changelog: v0.3.3...v0.3.4

✨ 新增

  • 网页获取与联网搜索全面升级
    • 重写 web_fetch:trafilatura 智能正文提取(保留 Markdown 列表 / 表格结构),支持 PDF 提取;疑似 JS 渲染页面自动降级到无头浏览器渲染,渲染策略 auto / on / off 三档可调
    • 重写 web_search:Bing + DuckDuckGo 双引擎并发合并去重(免 API Key),引擎可选(自动 / Bing / DuckDuckGo)
    • 设置页新增「联网搜索」区块:默认搜索引擎、网页 JS 渲染策略
  • 模型请求错误诊断与展示:按 HTTP 状态分类给出中文诊断(鉴权失败、模型 / 接口不存在、上游超时、请求体过大、限流或额度不足、上游服务器错误、参数被拒等),前端展示友好错误提示并附带 trace_id 便于排查
  • @ 提及搜索增强:@ 可搜索项目文件、内置工具、MCP 工具与专家包,支持打分排序与防抖搜索
  • AutoPilot 收尾自动同步:模型判定任务完成时,自动将待办清单中未完成项标记为完成
  • SVG 图标系统:全界面 emoji 图标统一替换为内联 SVG(Feather 风格描边),中英文界面外观一致;DuckDuckGo / GitHub 使用品牌 logo
  • 安装包语言选择:安装向导第一步选择安装包语言(简体中文 / English),应用界面语言在后续步骤独立选择,默认跟随安装包语言

🔄 变更

  • 聊天输入栏布局优化:输入框独占一行,附件、专家选择、语音、发送按钮对齐到第二行,整体更整齐
  • 输入区专家选择器与图标按钮高度统一

🔧 修复

  • 修复消息持久化后「重新生成 / 编辑 / 删除」按钮失效的问题
  • 修复白板看板栏展开时工具栏(选择 / 连线 / 笔 / 文字)无法选中的问题;展开状态下选择工具会自动收起看板栏回到画布
  • 修复白板看板栏展开时缺少上边框的问题

🔧 其他

  • 补充中英文界面翻译,UI 细节打磨