Repository navigation
ci: release packages - #22
Open
github-actions[bot] wants to merge 1 commit into
Open
github-actions[bot] wants to merge 1 commit into
github-actions[bot] wants to merge 1 commit into
Conversation
github-actions
Bot
force-pushed
the
changeset-release/main
branch
11 times, most recently
from
October 3, 2026 05:37
824e259 to
46f18c5
Compare
github-actions
Bot
force-pushed
the
changeset-release/main
branch
16 times, most recently
from
October 11, 2026 03:45
8e6d493 to
d1602ed
Compare
github-actions
Bot
force-pushed
the
changeset-release/main
branch
3 times, most recently
from
October 15, 2026 03:30
a68fff2 to
814312e
Compare
github-actions
Bot
force-pushed
the
changeset-release/main
branch
10 times, most recently
from
October 22, 2026 03:24
d33471e to
224577e
Compare
github-actions
Bot
force-pushed
the
changeset-release/main
branch
10 times, most recently
from
October 30, 2026 10:04
ac6ed09 to
642e62b
Compare
github-actions
Bot
force-pushed
the
changeset-release/main
branch
from
October 31, 2026 03:48
642e62b to
796ee07
Compare
This file contains hidden or bidirectional Unicode text that may be interpreted or compiled differently than what appears below. To review, open the file in an editor that reveals hidden Unicode characters.
Learn more about bidirectional Unicode characters
Sign up for free
to join this conversation on GitHub.
Already have an account?
Sign in to comment
Add this suggestion to a batch that can be applied as a single commit.This suggestion is invalid because no changes were made to the code.Suggestions cannot be applied while the pull request is closed.Suggestions cannot be applied while viewing a subset of changes.Only one suggestion per line can be applied in a batch.Add this suggestion to a batch that can be applied as a single commit.Applying suggestions on deleted lines is not supported.You must change the existing code in this line in order to create a valid suggestion.Outdated suggestions cannot be applied.This suggestion has been applied or marked resolved.Suggestions cannot be applied from pending reviews.Suggestions cannot be applied on multi-line comments.Suggestions cannot be applied while the pull request is queued to merge.Suggestion cannot be applied right now. Please check back later.
This PR was opened by the Changesets release GitHub action. When you're ready to do a release, you can merge this and publish to npm yourself or setup this action to publish automatically. If you're not ready to do a release yet, that's fine, whenever you add more changesets to main, this PR will be updated.
Releases
scream-code@0.20.0
Minor Changes
151b05d- A fired scheduled task now also surfaces on the status row above the editor, not only as a transcript block. The chip follows the shared grammar:⏰ 定时任务已触发:<preview>— with(合并 N 次)when several fires collapsed into one delivery,⏰ 一次性提醒已触发:…for a one-shot task, and⚠️ 定时任务已过期,仍触发:…in the warning colour for a task past its 7-day cutoff. The prompt preview is sanitized and capped at 40 characters because it is model-authored text written into a terminal row. The reminder owns its own slot (10s TTL) drawn to the left of the collaboration ticker (8s), so a help request can neither evict a fired reminder nor outlive it, and a narrow terminal truncates the ticker first. Both chips are dropped together when the session switches.1a6ccd3- Scheduled tasks now report back to the IM chat that owns the session. A cron fire runs inside the session with no inbound context, so its output used to finish invisibly: the driver now keeps one event subscription per live session and handscron.firedto aCronRelay, which announces the fire (⏰ 定时任务已触发:…, the same copy the TUI status row uses), collects the turn's final text withLineTurnCollector, and delivers it through the newsendProactivepath. Both channels send using the target they cached from inbound traffic — Lark keeps the chat id (sendToChat), WeChat keeps the peer and itscontext_token(sendText) — and both answersent/no-target/failedinstead of throwing, so a scheduled task can never crash the daemon. A fire that lands while a user turn is running is skipped, becausesteer()has already merged it into that turn and its reply reaches the chat anyway; one forward runs per session at a time. The same tasks can now be managed from the chat itself:/cronlists them,/cron add <分 时 日 月 周> <要做的事>creates one on the current session (so it belongs to that chat and reports back here), and/cron rm <id>deletes. A fired turn that ends without any text now reports⚠️ 定时任务执行结束但没有输出:…to the chat instead of finishing in silence, and tasks can be quiet too:silentskips the "fired" notice while still delivering the result,mutedelivers nothing at all (both exposed throughCronCreateand/cron add --silent|--mute), and each task rememberslastErrorfrom its latest run, shown in/cron listand cleared by the next clean run. Media sent from a scheduled turn now resolves through a platform-level sender fallback, so an image still goes out after/stop,/cancelor a restart. A guard drops a turn that never reports its end after 15 minutes so one stuck task cannot block later fires. WeChat still cannot push after a daemon restart until the user messages the bot once — that restriction is the platform's token model, and the log says so rather than failing silently.1a6ccd3- IM channels gain an interrupt and lose their silent gaps./stopaborts the turn that is running right now via the newLineSessionDriver.stopActiveTurn()— the aborted turn suppresses its own reply so the chat is not told twice — and it is the one command that is not blocked while busy. A message that lands behind a running turn now answers immediately with收到,前面还有 N 条在处理中。回复 /stop 可中止当前任务。instead of waiting in silence. Voice support is probed once at startup (ffmpeg -encoders, looking for AMR-NB) and reported in/status, so a missing encoder is visible before the first fallback-to-file, and every submitted voice message logs that the gateway'sret: 0is not a delivery receipt — that log line is the only trace the platform gives./cancelstops and starts a fresh session, and a/stopthat cannot settle within 10 s closes the live session without deleting it, so the next message resumes the same session id — the same end result as tearing down the agent process. Shutdown now waits up to 60 s with a printed notice instead of cutting a turn after 10 s, the resolvedworkDiris printed at startup (warning when the config omits it), and daemon console lines carry ISO timestamps.041bc86- The footer is now two fixed rows. Line 1 keeps identity: model name, provider balance and the working-tree git summary, with the context gauge right-aligned as📨 Context:<bar> <percent>(slim▰▱bar, 10/6/0 cells at >=68/>=52/<52 columns, floored with at least one lit cell for non-zero usage; the whole gauge shares one semantic colour). Line 2 starts with the cache hit rate, then the plan/rlm/wolfpack mode badges, the goal badge and background-task badges, with the channel readout◆ Line: <Lark|Wechat|未连接> <work status>right-aligned (only the dot is coloured; line 2 shrinks its left side first). The status row above the editor now uses one chip grammar:⚠️ 重连中 n/max:reason · delay,🤝 name 求助:issue/✓ Scream 已处理 name 的请求, and the idle hint in the theme's dim colour instead of a hardcoded grey.Subagent-to-parent collaboration requests no longer cut into the transcript. A delivered request surfaces as a one-line ticker above the editor —
coder is asking Scream for help: <preview>— replaced by the newest event and echoed asScream handled the request from coderonce the main agent answers it. The request body stays in the parent's context and in the agent card's tool-call arguments. This removes the unreachable activity-pane component, the unused loader colour setter and the duplicate status-bar spinner branch, and stops the pulse-wave timer chain on shutdown.Patch Changes
e53d2f9- Collapsed activity blocks now default to eight rows instead of three. At three rows a busy run only showed its header plus one step, which read as a frozen agent; the default now surfaces the newest steps of the timeline./blockrowslets each user pick 5, 8 or 10, and a stored choice overrides the default; a previously stored 3 falls back to the new default.ca795a1- Give/configan entry menu: a bare/config(or/login) now asks which configuration flow to enter — the shortcut provider directory, the custom DIY setup, or image generation — instead of jumping straight into the catalog./config diyand/config imagekeep their direct paths, and the first-run nudge opens the same menu.49a3542- Make the agent behave consistently on macOS, Linux and Windows. The bundled ripgrep binary is now picked by probing the host libc instead of inferring it from the CPU architecture, Windows falls back to PowerShell when Git Bash is absent, and command execution resolves.cmd/.batshims throughPATHEXTrather than relying on a shell. Timed-out hooks and update steps terminate the whole process tree on Windows. Path safety checks understand Windows drive letters and UNC paths, the external editor no longer assumes a POSIX shell, and installing the package no longer hard-fails on platforms without a prebuilt local-embedding binary. State files are located through the shared home resolver and written atomically.5290a2a- Fix the embedding-model setup card reappearing on every startup on installs without a pre-existing model cache. The pinned model archive is now staged by the app itself from a first-party GitHub release with HTTP status validation and an on-disk sha256 check, instead of relying on the third-party model mirror that stopped serving anonymous downloads — its downloader never checks the response status, so a 403 error page used to be silently written into the staged archive and every subsequent extract failed. Lint ratchet baseline lowered to the new low.965f7df- Send the product user agent with requests to third-party model endpoints. The identity used to be attached only to providers configured with a session header, so most OpenAI-compatible and Anthropic endpoints saw the SDK's own library user agent instead of the product's. Device fingerprint headers remain host-scoped and are not forwarded to third-party endpoints.74904e9- The status-bar pulse wave now reports network silence only. While the agent is waiting on the model but receiving nothing — a request awaiting its first token, a reasoning or text stream that stopped delivering, or a tool call whose arguments are still being authored — the wave ramps from the brand colour to yellow at 15s and to a deep red at 25s, then stays deep red. Any qualifying inbound event returns it to the brand colour immediately.Tool execution is exempt: a local command that prints nothing (
sleep, a quiet install, a long test run) is still working, and its own timeout owns the outcome, so the wave keeps its brand colour for as long as the tool runs. The footer now distinguishes the two halves of a tool call —调用中 / Callingwhile the model streams the arguments,执行中 / Runningwhile the tool executes.A retry floors the wave at yellow, so a known failure never renders next to a "reconnecting" label while the wave still claims everything is healthy. Child-agent traffic and non-stream custom tool notifications (such as an MCP OAuth prompt) no longer reset the parent's silence clock, so activity that does not belong to the main model stream cannot hide a stalled call. Switching sessions clears the work phase and the liveness clock, so a new session cannot inherit a stalled indicator.
The wave uses dedicated palette tokens (
waveMidyellow /wavePeakdeep red) instead of the general warning/error colours, with a light-theme pair tuned for a white background. It remains an early warning only: retries still come from real transport failures (the stall timeout, disconnects, rate limits).#18
2fda5b7- Recover explicit status codes from OpenAI-compatible streaming errors and classify status-less provider messages so transient failures enter the existing retry policy instead of immediately failing agent tasks.165a7ca- Generated plan files no longer create a visibleplan/folder in the project root when an agent has no session home: they now go to.scream/plans, which is already gitignored. The coverage report also moved out of the repository root tonode_modules/.cache/coverage, so running the test suite no longer leaves a 27 MBcoverage/directory behind.7f6bf0d-/knowledgecan now ingest PDF, Word (.docx) and Excel (.xlsx) files alongside Markdown and plain text. Binary documents are converted to Markdown by the document engine that already ships with the runtime, then follow the exact same chunking and embedding path as a.mdfile, so the shared vector index and/memoryare unaffected.Details:
/memorysearches never pay for it.~$…) and unsupported formats.151b05d- Replies now colour their two plainest marks, with one palette across both modes:**bold**picks up a newmdBoldtoken and keeps SGR bold — violet, bright on dark (#C9A0FF, 7.9:1) and deep on light (#6C2B8C, 8.9:1) — and block quotes move tomdQuotefor both the text and the│border — pink, bright on dark (#FF6B9D, 6.2:1) and deep on light (#C2185B, 5.9:1). Only brightness is tuned per mode, so emphasis always reads as the heavier mark and the hues never change meaning. Headings keep their amber: the renderer builds them asheading(bold(text)), so the heading now drops inherited styling before recolouring — without that, the colouredboldrepainted every heading and replies looked randomly tinted. Table headers stay weight-only, the cli-highlightquotetoken inside fences stays neutral, and plain prose still carries no colour at all: it follows the terminal's own foreground.0baa2ce- Make /mcp uninstall honest for plugin-provided servers: the management panel now tags servers contributed by a plugin, refuses to "uninstall" them with a pointer to /plugin (that removal used to be undone on the next startup by the plugin hot-apply pass), and reports a real error instead of a fake success when a removed server is still listed.164e04b- Memory stays a single entity:memos./dreammerges near-duplicate memos and asks the model to write a distilled conclusion for each merge group, stored on the replacement memo as its latest distillation (最新归纳); merged memos also keep their sources' notes and a traceable lineage (distilledFrom,distilledAt,origin). Distilled rules are never age-pruned as resolved/stale, and a group that holds a rule is skipped when the plan carries no new conclusion. Bothdistilledandnoteare persisted, editable viaMemoryEditor in place from/memory, shown in/memoryand memo injection, and returned byMemoryLookup; both also count towards keyword relevance, and search falls back to a LIKE match when a term appears only in either field.Each memo now also records where it came from:
origin(session= extracted experience,dream= /dream rule,user= conclusion rewritten by the user),distilledAt(when the conclusion was generated or last rewritten) anddistilledFrom(a snapshot of the memos folded into it —{id, title, at}, title clipped to 80 chars, max 100 items, carried across consolidation generations so a rule distilled from other rules keeps its ancestry). Existing rows are migrated in place:originis backfilled todreamfor every memo that already carries adistilledconclusion.The
/memorypicker shows rule provenance on the card (归纳 / 人工归纳, the distilled time and the source count) and in the detail view (归纳于 + up to five source entries, then+N), and lets the user rewrite the conclusion in place withe→ Enter; a rewrite setsorigin='user'and a freshdistilledAt, while clearing the text drops back to an extracted memo. Because merging permanently deletes the original memos, the/dreampreview must show any existing conclusion it overrides, and deleting a rule in/memorynow warns that its originals are gone for good.49a3542- Stop reading injected reminders as a fresh user message when deciding whether to repeat the plan-mode reminder: only a real user prompt resets the cadence to the full reminder, so the periodic refresh threshold holds instead of re-emitting the long reminder on every step.71379e3- Harden the runtime and close two discoverability gaps:onlyBuiltDependencies: []), so a future dependency cannot silently run code at install time — the failure mode that once let a GPU download in an optional dependency break the vector feature./sessionsto recover; clean exits and terminal hangups stay silent./hotkeys(keyboard shortcut reference) and/copy(copy the last reply to the clipboard) commands.dbbf1d6- Support an optional per-provider session header that carries the stable conversation id, stamp known catalog entries when connecting, and surface an actionable config hint when a gateway reports a missing session header.4d9c653- Add a weighted offer tip to the empty-session tips carousel above the editor: the placement tip carries a clickable domain link (OSC 8) and is opened with Ctrl+F, rotations favor it at an 80% probability, and Ctrl+B still hides all tips.49a3542- Stop appending a todo reconciliation round after the final answer: the reminder is now injected before the answer is written, inside the work the turn is already doing. The TodoList suggestion now waits for the third step so short two-step tasks are no longer nudged, and the periodic todo reminder fires half as often and only while the list still has unfinished items. Goal turns no longer continue after the answer just because TodoList was not updated this turn, and a turn counts as having touched the list only when the TodoList call actually succeeded.e4b54e1- Buffer prompts that arrive while a turn is active so queued user input joins the steer path instead of failing as busy, and flush leftover steers at the start of the next turn.641f335- Move the local embedding engine off native binaries onto a self-contained WebAssembly pipeline. Installing no longer pulls a compiler toolchain or an unused GPU runtime on Linux (and can no longer lose the whole vector feature when that download fails), the dependency tree drops its deprecated packages, and the model download now reports byte progress with stall and overall timeout guards plus verify/load phases. A cache is only considered installed when the weights and both tokenizer files are present, so a half-restored cache repairs itself instead of failing at load time. Vectors are bit-compatible with the previous engine.151b05d- The status-bar pulse wave no longer reads a quiet tool call as a dead connection. It used to ramp from green to deep red after 25s of silence whenever the phase was not执行中— which caught the whole调用中window, so a long command being authored looked like a failure while it was fine. The wave now asks whether a tool call is actually in flight (StreamingUIController.hasInFlightToolCalls(), which counts argument previews as well as started calls) and keeps the brand colour for that call's entire lifetime, wherever the phase happens to be. A late argument preview can also no longer overwrite a call that already started, so a running command cannot regress to调用中and re-arm the ramp mid-execution. The silence ramp still covers the pure model phases (等待响应/思考中/输出中).@scream-code/config@0.20.0
Minor Changes
151b05d- A fired scheduled task now also surfaces on the status row above the editor, not only as a transcript block. The chip follows the shared grammar:⏰ 定时任务已触发:<preview>— with(合并 N 次)when several fires collapsed into one delivery,⏰ 一次性提醒已触发:…for a one-shot task, and⚠️ 定时任务已过期,仍触发:…in the warning colour for a task past its 7-day cutoff. The prompt preview is sanitized and capped at 40 characters because it is model-authored text written into a terminal row. The reminder owns its own slot (10s TTL) drawn to the left of the collaboration ticker (8s), so a help request can neither evict a fired reminder nor outlive it, and a narrow terminal truncates the ticker first. Both chips are dropped together when the session switches.041bc86- The footer is now two fixed rows. Line 1 keeps identity: model name, provider balance and the working-tree git summary, with the context gauge right-aligned as📨 Context:<bar> <percent>(slim▰▱bar, 10/6/0 cells at >=68/>=52/<52 columns, floored with at least one lit cell for non-zero usage; the whole gauge shares one semantic colour). Line 2 starts with the cache hit rate, then the plan/rlm/wolfpack mode badges, the goal badge and background-task badges, with the channel readout◆ Line: <Lark|Wechat|未连接> <work status>right-aligned (only the dot is coloured; line 2 shrinks its left side first). The status row above the editor now uses one chip grammar:⚠️ 重连中 n/max:reason · delay,🤝 name 求助:issue/✓ Scream 已处理 name 的请求, and the idle hint in the theme's dim colour instead of a hardcoded grey.Subagent-to-parent collaboration requests no longer cut into the transcript. A delivered request surfaces as a one-line ticker above the editor —
coder is asking Scream for help: <preview>— replaced by the newest event and echoed asScream handled the request from coderonce the main agent answers it. The request body stays in the parent's context and in the agent card's tool-call arguments. This removes the unreachable activity-pane component, the unused loader colour setter and the duplicate status-bar spinner branch, and stops the pulse-wave timer chain on shutdown.@scream-code/agent-core@0.20.0
Patch Changes
164e04b- Memory stays a single entity:memos./dreammerges near-duplicate memos and asks the model to write a distilled conclusion for each merge group, stored on the replacement memo as its latest distillation (最新归纳); merged memos also keep their sources' notes and a traceable lineage (distilledFrom,distilledAt,origin). Distilled rules are never age-pruned as resolved/stale, and a group that holds a rule is skipped when the plan carries no new conclusion. Bothdistilledandnoteare persisted, editable viaMemoryEditor in place from/memory, shown in/memoryand memo injection, and returned byMemoryLookup; both also count towards keyword relevance, and search falls back to a LIKE match when a term appears only in either field.Each memo now also records where it came from:
origin(session= extracted experience,dream= /dream rule,user= conclusion rewritten by the user),distilledAt(when the conclusion was generated or last rewritten) anddistilledFrom(a snapshot of the memos folded into it —{id, title, at}, title clipped to 80 chars, max 100 items, carried across consolidation generations so a rule distilled from other rules keeps its ancestry). Existing rows are migrated in place:originis backfilled todreamfor every memo that already carries adistilledconclusion.The
/memorypicker shows rule provenance on the card (归纳 / 人工归纳, the distilled time and the source count) and in the detail view (归纳于 + up to five source entries, then+N), and lets the user rewrite the conclusion in place withe→ Enter; a rewrite setsorigin='user'and a freshdistilledAt, while clearing the text drops back to an extracted memo. Because merging permanently deletes the original memos, the/dreampreview must show any existing conclusion it overrides, and deleting a rule in/memorynow warns that its originals are gone for good.6867cde- Fix three runtime robustness gaps: the per-step tool-call block index no longer leaks one Map entry per step; approval timeouts clear their rejection timer when the response arrives first; and a provider-wrapped context-overflow error now fails fast instead of burning the full retry budget (compaction handles it). Session deletion no longer reports success when the directory could not be removed (newsession.delete_failederror code), and session index/state writes all go through the shared atomic write. Tool name sets are centralized in one catalog module.Updated dependencies [
164e04b]:@scream-code/knowledge@0.20.0
Patch Changes
164e04b]:@scream-code/memory@0.20.0
Patch Changes
164e04b- Memory stays a single entity:memos./dreammerges near-duplicate memos and asks the model to write a distilled conclusion for each merge group, stored on the replacement memo as its latest distillation (最新归纳); merged memos also keep their sources' notes and a traceable lineage (distilledFrom,distilledAt,origin). Distilled rules are never age-pruned as resolved/stale, and a group that holds a rule is skipped when the plan carries no new conclusion. Bothdistilledandnoteare persisted, editable viaMemoryEditor in place from/memory, shown in/memoryand memo injection, and returned byMemoryLookup; both also count towards keyword relevance, and search falls back to a LIKE match when a term appears only in either field.Each memo now also records where it came from:
origin(session= extracted experience,dream= /dream rule,user= conclusion rewritten by the user),distilledAt(when the conclusion was generated or last rewritten) anddistilledFrom(a snapshot of the memos folded into it —{id, title, at}, title clipped to 80 chars, max 100 items, carried across consolidation generations so a rule distilled from other rules keeps its ancestry). Existing rows are migrated in place:originis backfilled todreamfor every memo that already carries adistilledconclusion.The
/memorypicker shows rule provenance on the card (归纳 / 人工归纳, the distilled time and the source count) and in the detail view (归纳于 + up to five source entries, then+N), and lets the user rewrite the conclusion in place withe→ Enter; a rewrite setsorigin='user'and a freshdistilledAt, while clearing the text drops back to an extracted memo. Because merging permanently deletes the original memos, the/dreampreview must show any existing conclusion it overrides, and deleting a rule in/memorynow warns that its originals are gone for good.@scream-code/evals@0.20.0
@scream-code/jian@0.20.0
@scream-code/ltod@0.20.0
@scream-code/scream-code-sdk@0.20.0