diff --git a/.changeset/activity-collapsed-rows.md b/.changeset/activity-collapsed-rows.md deleted file mode 100644 index f7bb992e..00000000 --- a/.changeset/activity-collapsed-rows.md +++ /dev/null @@ -1,5 +0,0 @@ ---- -"scream-code": patch ---- - -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. `/blockrows` lets each user pick 5, 8 or 10, and a stored choice overrides the default; a previously stored 3 falls back to the new default. diff --git a/.changeset/config-entry-menu.md b/.changeset/config-entry-menu.md deleted file mode 100644 index a3ea2412..00000000 --- a/.changeset/config-entry-menu.md +++ /dev/null @@ -1,5 +0,0 @@ ---- -"scream-code": patch ---- - -Give `/config` an 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 diy` and `/config image` keep their direct paths, and the first-run nudge opens the same menu. diff --git a/.changeset/cron-status-reminder.md b/.changeset/cron-status-reminder.md deleted file mode 100644 index e17ee5f0..00000000 --- a/.changeset/cron-status-reminder.md +++ /dev/null @@ -1,6 +0,0 @@ ---- -"scream-code": minor -"@scream-code/config": minor ---- - -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: `⏰ 定时任务已触发:` — 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. diff --git a/.changeset/cross-platform-robustness.md b/.changeset/cross-platform-robustness.md deleted file mode 100644 index 2d10567c..00000000 --- a/.changeset/cross-platform-robustness.md +++ /dev/null @@ -1,5 +0,0 @@ ---- -"scream-code": patch ---- - -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`/`.bat` shims through `PATHEXT` rather 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. diff --git a/.changeset/embedding-model-selfhost.md b/.changeset/embedding-model-selfhost.md deleted file mode 100644 index 4cd2354d..00000000 --- a/.changeset/embedding-model-selfhost.md +++ /dev/null @@ -1,5 +0,0 @@ ---- -"scream-code": patch ---- - -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. diff --git a/.changeset/first-party-user-agent.md b/.changeset/first-party-user-agent.md deleted file mode 100644 index f2a6efff..00000000 --- a/.changeset/first-party-user-agent.md +++ /dev/null @@ -1,5 +0,0 @@ ---- -"scream-code": patch ---- - -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. diff --git a/.changeset/first-token-wave-ramp.md b/.changeset/first-token-wave-ramp.md deleted file mode 100644 index 6a9f68da..00000000 --- a/.changeset/first-token-wave-ramp.md +++ /dev/null @@ -1,11 +0,0 @@ ---- -"scream-code": patch ---- - -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 — `调用中 / Calling` while the model streams the arguments, `执行中 / Running` while 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 (`waveMid` yellow / `wavePeak` deep 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). diff --git a/.changeset/fix-stream-error-retries.md b/.changeset/fix-stream-error-retries.md deleted file mode 100644 index ebfd6601..00000000 --- a/.changeset/fix-stream-error-retries.md +++ /dev/null @@ -1,5 +0,0 @@ ---- -"scream-code": patch ---- - -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. diff --git a/.changeset/generated-artifacts-out-of-tree.md b/.changeset/generated-artifacts-out-of-tree.md deleted file mode 100644 index 84222ae4..00000000 --- a/.changeset/generated-artifacts-out-of-tree.md +++ /dev/null @@ -1,5 +0,0 @@ ---- -"scream-code": patch ---- - -Generated plan files no longer create a visible `plan/` 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 to `node_modules/.cache/coverage`, so running the test suite no longer leaves a 27 MB `coverage/` directory behind. diff --git a/.changeset/knowledge-document-formats.md b/.changeset/knowledge-document-formats.md deleted file mode 100644 index 99b8c803..00000000 --- a/.changeset/knowledge-document-formats.md +++ /dev/null @@ -1,13 +0,0 @@ ---- -"scream-code": patch ---- - -`/knowledge` can 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 `.md` file, so the shared vector index and `/memory` are unaffected. - -Details: - -- The converter engine moved into the knowledge package (no new dependencies, no new package). It is imported lazily, so startup and `/memory` searches never pay for it. -- Images are dropped and their placeholders stripped; a document with no text layer (scanned PDF) fails with a clear message instead of storing an empty record. -- Documents are fingerprinted by their raw bytes, so an identical file is skipped and a changed one is re-ingested. -- Directory ingestion skips hidden entries, Office lock files (`~$…`) and unsupported formats. -- Ingest prompts now recommend Markdown first and warn that scans, image-heavy files and wide tables extract poorly. diff --git a/.changeset/line-cron-delivery.md b/.changeset/line-cron-delivery.md deleted file mode 100644 index 57de8497..00000000 --- a/.changeset/line-cron-delivery.md +++ /dev/null @@ -1,5 +0,0 @@ ---- -"scream-code": minor ---- - -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 hands `cron.fired` to a `CronRelay`, which announces the fire (`⏰ 定时任务已触发:…`, the same copy the TUI status row uses), collects the turn's final text with `LineTurnCollector`, and delivers it through the new `sendProactive` path. Both channels send using the target they cached from inbound traffic — Lark keeps the chat id (`sendToChat`), WeChat keeps the peer and its `context_token` (`sendText`) — and both answer `sent` / `no-target` / `failed` instead of throwing, so a scheduled task can never crash the daemon. A fire that lands while a user turn is running is skipped, because `steer()` 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: `/cron` lists them, `/cron add <分 时 日 月 周> <要做的事>` creates one on the current session (so it belongs to that chat and reports back here), and `/cron rm ` 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: `silent` skips the "fired" notice while still delivering the result, `mute` delivers nothing at all (both exposed through `CronCreate` and `/cron add --silent|--mute`), and each task remembers `lastError` from its latest run, shown in `/cron list` and 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`, `/cancel` or 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. diff --git a/.changeset/line-stop-and-voice-visibility.md b/.changeset/line-stop-and-voice-visibility.md deleted file mode 100644 index d3cc5413..00000000 --- a/.changeset/line-stop-and-voice-visibility.md +++ /dev/null @@ -1,5 +0,0 @@ ---- -"scream-code": minor ---- - -IM channels gain an interrupt and lose their silent gaps. `/stop` aborts the turn that is running right now via the new `LineSessionDriver.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's `ret: 0` is not a delivery receipt — that log line is the only trace the platform gives. `/cancel` stops and starts a fresh session, and a `/stop` that 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 resolved `workDir` is printed at startup (warning when the config omits it), and daemon console lines carry ISO timestamps. diff --git a/.changeset/markdown-bold-quote-colors.md b/.changeset/markdown-bold-quote-colors.md deleted file mode 100644 index 8ffc157f..00000000 --- a/.changeset/markdown-bold-quote-colors.md +++ /dev/null @@ -1,5 +0,0 @@ ---- -"scream-code": patch ---- - -Replies now colour their two plainest marks, with one palette across both modes: `**bold**` picks up a new `mdBold` token and keeps SGR bold — violet, bright on dark (`#C9A0FF`, 7.9:1) and deep on light (`#6C2B8C`, 8.9:1) — and block quotes move to `mdQuote` for 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 as `heading(bold(text))`, so the heading now drops inherited styling before recolouring — without that, the coloured `bold` repainted every heading and replies looked randomly tinted. Table headers stay weight-only, the cli-highlight `quote` token inside fences stays neutral, and plain prose still carries no colour at all: it follows the terminal's own foreground. diff --git a/.changeset/mcp-uninstall-plugin-ownership.md b/.changeset/mcp-uninstall-plugin-ownership.md deleted file mode 100644 index 30e32c50..00000000 --- a/.changeset/mcp-uninstall-plugin-ownership.md +++ /dev/null @@ -1,5 +0,0 @@ ---- -"scream-code": patch ---- - -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. diff --git a/.changeset/memory-latest-distillation.md b/.changeset/memory-latest-distillation.md deleted file mode 100644 index b5ec78ff..00000000 --- a/.changeset/memory-latest-distillation.md +++ /dev/null @@ -1,11 +0,0 @@ ---- -"@scream-code/memory": patch -"@scream-code/agent-core": patch -"scream-code": patch ---- - -Memory stays a single entity: `memos`. `/dream` merges 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. Both `distilled` and `note` are persisted, editable via `MemoryEdit` or in place from `/memory`, shown in `/memory` and memo injection, and returned by `MemoryLookup`; 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) and `distilledFrom` (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: `origin` is backfilled to `dream` for every memo that already carries a `distilled` conclusion. - -The `/memory` picker 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 with `e` → Enter; a rewrite sets `origin='user'` and a fresh `distilledAt`, while clearing the text drops back to an extracted memo. Because merging permanently deletes the original memos, the `/dream` preview must show any existing conclusion it overrides, and deleting a rule in `/memory` now warns that its originals are gone for good. diff --git a/.changeset/plan-mode-reminder-trigger.md b/.changeset/plan-mode-reminder-trigger.md deleted file mode 100644 index 33f0eb5e..00000000 --- a/.changeset/plan-mode-reminder-trigger.md +++ /dev/null @@ -1,5 +0,0 @@ ---- -"scream-code": patch ---- - -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. diff --git a/.changeset/runtime-hardening.md b/.changeset/runtime-hardening.md deleted file mode 100644 index 8881f00c..00000000 --- a/.changeset/runtime-hardening.md +++ /dev/null @@ -1,10 +0,0 @@ ---- -"scream-code": patch ---- - -Harden the runtime and close two discoverability gaps: - -- Dependency install scripts are denied by default (`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. -- Concurrent writes to the same file are serialized (per-path queue): parallel edits from one tool batch or from sibling sub-agents can no longer lose an update, while different files still write in parallel. -- An abnormal exit is reported once on the next launch, pointing at `/sessions` to recover; clean exits and terminal hangups stay silent. -- New `/hotkeys` (keyboard shortcut reference) and `/copy` (copy the last reply to the clipboard) commands. diff --git a/.changeset/runtime-robustness-fixes.md b/.changeset/runtime-robustness-fixes.md deleted file mode 100644 index dd399fbf..00000000 --- a/.changeset/runtime-robustness-fixes.md +++ /dev/null @@ -1,5 +0,0 @@ ---- -'@scream-code/agent-core': patch ---- - -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 (new `session.delete_failed` error code), and session index/state writes all go through the shared atomic write. Tool name sets are centralized in one catalog module. diff --git a/.changeset/session-header-injection.md b/.changeset/session-header-injection.md deleted file mode 100644 index 30c854a4..00000000 --- a/.changeset/session-header-injection.md +++ /dev/null @@ -1,5 +0,0 @@ ---- -"scream-code": patch ---- - -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. diff --git a/.changeset/tips-offer-placement.md b/.changeset/tips-offer-placement.md deleted file mode 100644 index 575ccc87..00000000 --- a/.changeset/tips-offer-placement.md +++ /dev/null @@ -1,5 +0,0 @@ ---- -"scream-code": patch ---- - -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. diff --git a/.changeset/todo-reconcile-before-answer.md b/.changeset/todo-reconcile-before-answer.md deleted file mode 100644 index 5005bce7..00000000 --- a/.changeset/todo-reconcile-before-answer.md +++ /dev/null @@ -1,5 +0,0 @@ ---- -"scream-code": patch ---- - -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. diff --git a/.changeset/tui-status-bar-rows.md b/.changeset/tui-status-bar-rows.md deleted file mode 100644 index b2aec9c5..00000000 --- a/.changeset/tui-status-bar-rows.md +++ /dev/null @@ -1,8 +0,0 @@ ---- -"scream-code": minor -"@scream-code/config": minor ---- - -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: ` (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: ` 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: ` — replaced by the newest event and echoed as `Scream handled the request from coder` once 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. diff --git a/.changeset/turn-queue-and-todo-reconcile.md b/.changeset/turn-queue-and-todo-reconcile.md deleted file mode 100644 index 26be2226..00000000 --- a/.changeset/turn-queue-and-todo-reconcile.md +++ /dev/null @@ -1,5 +0,0 @@ ---- -"scream-code": patch ---- - -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. diff --git a/.changeset/wasm-embedding-engine.md b/.changeset/wasm-embedding-engine.md deleted file mode 100644 index 606e1a1e..00000000 --- a/.changeset/wasm-embedding-engine.md +++ /dev/null @@ -1,5 +0,0 @@ ---- -"scream-code": patch ---- - -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. diff --git a/.changeset/wave-quiet-tool-calls.md b/.changeset/wave-quiet-tool-calls.md deleted file mode 100644 index 199ca72d..00000000 --- a/.changeset/wave-quiet-tool-calls.md +++ /dev/null @@ -1,5 +0,0 @@ ---- -"scream-code": patch ---- - -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 (`等待响应` / `思考中` / `输出中`). diff --git a/apps/scream-code/CHANGELOG.md b/apps/scream-code/CHANGELOG.md new file mode 100644 index 00000000..3ae3fe8f --- /dev/null +++ b/apps/scream-code/CHANGELOG.md @@ -0,0 +1,80 @@ +# scream-code + +## 0.20.0 + +### Minor Changes + +- [`151b05d`](https://github.com/LIUTod/scream-code/commit/151b05d4f6feb4c316eb367fa546b6d4826ced79) - 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: `⏰ 定时任务已触发:` — 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`](https://github.com/LIUTod/scream-code/commit/1a6ccd3a08fc0a4e9341813d68c4b59466223126) - 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 hands `cron.fired` to a `CronRelay`, which announces the fire (`⏰ 定时任务已触发:…`, the same copy the TUI status row uses), collects the turn's final text with `LineTurnCollector`, and delivers it through the new `sendProactive` path. Both channels send using the target they cached from inbound traffic — Lark keeps the chat id (`sendToChat`), WeChat keeps the peer and its `context_token` (`sendText`) — and both answer `sent` / `no-target` / `failed` instead of throwing, so a scheduled task can never crash the daemon. A fire that lands while a user turn is running is skipped, because `steer()` 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: `/cron` lists them, `/cron add <分 时 日 月 周> <要做的事>` creates one on the current session (so it belongs to that chat and reports back here), and `/cron rm ` 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: `silent` skips the "fired" notice while still delivering the result, `mute` delivers nothing at all (both exposed through `CronCreate` and `/cron add --silent|--mute`), and each task remembers `lastError` from its latest run, shown in `/cron list` and 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`, `/cancel` or 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`](https://github.com/LIUTod/scream-code/commit/1a6ccd3a08fc0a4e9341813d68c4b59466223126) - IM channels gain an interrupt and lose their silent gaps. `/stop` aborts the turn that is running right now via the new `LineSessionDriver.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's `ret: 0` is not a delivery receipt — that log line is the only trace the platform gives. `/cancel` stops and starts a fresh session, and a `/stop` that 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 resolved `workDir` is printed at startup (warning when the config omits it), and daemon console lines carry ISO timestamps. + +- [`041bc86`](https://github.com/LIUTod/scream-code/commit/041bc862d5aadca77bd04635e475f887f4f942c5) - 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: ` (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: ` 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: ` — replaced by the newest event and echoed as `Scream handled the request from coder` once 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`](https://github.com/LIUTod/scream-code/commit/e53d2f9e9da0e2e7e8ea9141e8bc8fed847d4d8e) - 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. `/blockrows` lets 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`](https://github.com/LIUTod/scream-code/commit/ca795a1a3e6dea6a1928e71d8bb4781ae85fa471) - Give `/config` an 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 diy` and `/config image` keep their direct paths, and the first-run nudge opens the same menu. + +- [`49a3542`](https://github.com/LIUTod/scream-code/commit/49a3542835bbdd4a6043a346b9c1ad45369e698c) - 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`/`.bat` shims through `PATHEXT` rather 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`](https://github.com/LIUTod/scream-code/commit/5290a2a9d6ba94b51587fb4ad1478b335ce6924b) - 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`](https://github.com/LIUTod/scream-code/commit/965f7df148bfe9c0d39bcb2756b22ebdd8f4df9f) - 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`](https://github.com/LIUTod/scream-code/commit/74904e9f3832466a8f16d2e35e5b9568c36f35fc) - 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 — `调用中 / Calling` while the model streams the arguments, `执行中 / Running` while 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 (`waveMid` yellow / `wavePeak` deep 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](https://github.com/LIUTod/scream-code/pull/18) [`2fda5b7`](https://github.com/LIUTod/scream-code/commit/2fda5b7ce50f060d09875a54f35f26e5fa7d8c58) - 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`](https://github.com/LIUTod/scream-code/commit/165a7caa67c618fa82a6037d2cf0aa7da3c039b0) - Generated plan files no longer create a visible `plan/` 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 to `node_modules/.cache/coverage`, so running the test suite no longer leaves a 27 MB `coverage/` directory behind. + +- [`7f6bf0d`](https://github.com/LIUTod/scream-code/commit/7f6bf0d9b49026ced29de226884849add0a0ec32) - `/knowledge` can 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 `.md` file, so the shared vector index and `/memory` are unaffected. + + Details: + + - The converter engine moved into the knowledge package (no new dependencies, no new package). It is imported lazily, so startup and `/memory` searches never pay for it. + - Images are dropped and their placeholders stripped; a document with no text layer (scanned PDF) fails with a clear message instead of storing an empty record. + - Documents are fingerprinted by their raw bytes, so an identical file is skipped and a changed one is re-ingested. + - Directory ingestion skips hidden entries, Office lock files (`~$…`) and unsupported formats. + - Ingest prompts now recommend Markdown first and warn that scans, image-heavy files and wide tables extract poorly. + +- [`151b05d`](https://github.com/LIUTod/scream-code/commit/151b05d4f6feb4c316eb367fa546b6d4826ced79) - Replies now colour their two plainest marks, with one palette across both modes: `**bold**` picks up a new `mdBold` token and keeps SGR bold — violet, bright on dark (`#C9A0FF`, 7.9:1) and deep on light (`#6C2B8C`, 8.9:1) — and block quotes move to `mdQuote` for 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 as `heading(bold(text))`, so the heading now drops inherited styling before recolouring — without that, the coloured `bold` repainted every heading and replies looked randomly tinted. Table headers stay weight-only, the cli-highlight `quote` token inside fences stays neutral, and plain prose still carries no colour at all: it follows the terminal's own foreground. + +- [`0baa2ce`](https://github.com/LIUTod/scream-code/commit/0baa2ce006a5a611a2c16b1e02f163369a99108e) - 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`](https://github.com/LIUTod/scream-code/commit/164e04b413618ef27ca4e9c81f69d7a9c50d6259) - Memory stays a single entity: `memos`. `/dream` merges 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. Both `distilled` and `note` are persisted, editable via `MemoryEdit` or in place from `/memory`, shown in `/memory` and memo injection, and returned by `MemoryLookup`; 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) and `distilledFrom` (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: `origin` is backfilled to `dream` for every memo that already carries a `distilled` conclusion. + + The `/memory` picker 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 with `e` → Enter; a rewrite sets `origin='user'` and a fresh `distilledAt`, while clearing the text drops back to an extracted memo. Because merging permanently deletes the original memos, the `/dream` preview must show any existing conclusion it overrides, and deleting a rule in `/memory` now warns that its originals are gone for good. + +- [`49a3542`](https://github.com/LIUTod/scream-code/commit/49a3542835bbdd4a6043a346b9c1ad45369e698c) - 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`](https://github.com/LIUTod/scream-code/commit/71379e35d8d184f1481312d97a5d5a674fb52c16) - Harden the runtime and close two discoverability gaps: + + - Dependency install scripts are denied by default (`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. + - Concurrent writes to the same file are serialized (per-path queue): parallel edits from one tool batch or from sibling sub-agents can no longer lose an update, while different files still write in parallel. + - An abnormal exit is reported once on the next launch, pointing at `/sessions` to recover; clean exits and terminal hangups stay silent. + - New `/hotkeys` (keyboard shortcut reference) and `/copy` (copy the last reply to the clipboard) commands. + +- [`dbbf1d6`](https://github.com/LIUTod/scream-code/commit/dbbf1d6f59f0123dd263f69c2583e8bd534ca67a) - 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`](https://github.com/LIUTod/scream-code/commit/4d9c6530bf9d10505e7649082bf7dd80912faf59) - 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`](https://github.com/LIUTod/scream-code/commit/49a3542835bbdd4a6043a346b9c1ad45369e698c) - 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`](https://github.com/LIUTod/scream-code/commit/e4b54e1e13c05551755e92d8ab6798851d989933) - 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`](https://github.com/LIUTod/scream-code/commit/641f3353706fb03a7eeadc8860fb5b27126042f8) - 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`](https://github.com/LIUTod/scream-code/commit/151b05d4f6feb4c316eb367fa546b6d4826ced79) - 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 (`等待响应` / `思考中` / `输出中`). diff --git a/apps/scream-code/package.json b/apps/scream-code/package.json index 04ddbe89..19833b2e 100644 --- a/apps/scream-code/package.json +++ b/apps/scream-code/package.json @@ -1,6 +1,6 @@ { "name": "scream-code", - "version": "0.19.5", + "version": "0.20.0", "description": "A terminal-native AI agent for builders", "license": "MIT", "author": "ScreamCli", diff --git a/packages/agent-core/CHANGELOG.md b/packages/agent-core/CHANGELOG.md new file mode 100644 index 00000000..1a3c5103 --- /dev/null +++ b/packages/agent-core/CHANGELOG.md @@ -0,0 +1,19 @@ +# @scream-code/agent-core + +## 0.20.0 + +### Patch Changes + +- [`164e04b`](https://github.com/LIUTod/scream-code/commit/164e04b413618ef27ca4e9c81f69d7a9c50d6259) - Memory stays a single entity: `memos`. `/dream` merges 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. Both `distilled` and `note` are persisted, editable via `MemoryEdit` or in place from `/memory`, shown in `/memory` and memo injection, and returned by `MemoryLookup`; 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) and `distilledFrom` (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: `origin` is backfilled to `dream` for every memo that already carries a `distilled` conclusion. + + The `/memory` picker 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 with `e` → Enter; a rewrite sets `origin='user'` and a fresh `distilledAt`, while clearing the text drops back to an extracted memo. Because merging permanently deletes the original memos, the `/dream` preview must show any existing conclusion it overrides, and deleting a rule in `/memory` now warns that its originals are gone for good. + +- [`6867cde`](https://github.com/LIUTod/scream-code/commit/6867cde2fb1dd7b8951d12a3f4d9316a4aad3b8a) - 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 (new `session.delete_failed` error 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`](https://github.com/LIUTod/scream-code/commit/164e04b413618ef27ca4e9c81f69d7a9c50d6259)]: + - @scream-code/memory@0.20.0 + - @scream-code/knowledge@0.20.0 + - @scream-code/jian@0.20.0 + - @scream-code/ltod@0.20.0 diff --git a/packages/agent-core/package.json b/packages/agent-core/package.json index 48d8ad1a..813d704b 100644 --- a/packages/agent-core/package.json +++ b/packages/agent-core/package.json @@ -1,6 +1,6 @@ { "name": "@scream-code/agent-core", - "version": "0.19.5", + "version": "0.20.0", "private": true, "description": "The unified agent engine for Scream", "license": "MIT", diff --git a/packages/config/CHANGELOG.md b/packages/config/CHANGELOG.md new file mode 100644 index 00000000..663f5da2 --- /dev/null +++ b/packages/config/CHANGELOG.md @@ -0,0 +1,11 @@ +# @scream-code/config + +## 0.20.0 + +### Minor Changes + +- [`151b05d`](https://github.com/LIUTod/scream-code/commit/151b05d4f6feb4c316eb367fa546b6d4826ced79) - 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: `⏰ 定时任务已触发:` — 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`](https://github.com/LIUTod/scream-code/commit/041bc862d5aadca77bd04635e475f887f4f942c5) - 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: ` (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: ` 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: ` — replaced by the newest event and echoed as `Scream handled the request from coder` once 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. diff --git a/packages/config/package.json b/packages/config/package.json index 02c85b0d..93c455b4 100644 --- a/packages/config/package.json +++ b/packages/config/package.json @@ -1,6 +1,6 @@ { "name": "@scream-code/config", - "version": "0.19.5", + "version": "0.20.0", "private": true, "description": "Platform configuration and model management for Scream Code", "license": "MIT", diff --git a/packages/evals/CHANGELOG.md b/packages/evals/CHANGELOG.md new file mode 100644 index 00000000..bafa9e3a --- /dev/null +++ b/packages/evals/CHANGELOG.md @@ -0,0 +1,3 @@ +# @scream-code/evals + +## 0.20.0 diff --git a/packages/evals/package.json b/packages/evals/package.json index 2cb436b4..7ba88a04 100644 --- a/packages/evals/package.json +++ b/packages/evals/package.json @@ -1,6 +1,6 @@ { "name": "@scream-code/evals", - "version": "0.19.5", + "version": "0.20.0", "private": true, "type": "module", "scripts": { diff --git a/packages/jian/CHANGELOG.md b/packages/jian/CHANGELOG.md new file mode 100644 index 00000000..eaa917e1 --- /dev/null +++ b/packages/jian/CHANGELOG.md @@ -0,0 +1,3 @@ +# @scream-code/jian + +## 0.20.0 diff --git a/packages/jian/package.json b/packages/jian/package.json index 42c3d6c2..02223d9e 100644 --- a/packages/jian/package.json +++ b/packages/jian/package.json @@ -1,6 +1,6 @@ { "name": "@scream-code/jian", - "version": "0.19.5", + "version": "0.20.0", "private": true, "description": "Execution environment abstraction for AI agent applications", "license": "MIT", diff --git a/packages/knowledge/CHANGELOG.md b/packages/knowledge/CHANGELOG.md new file mode 100644 index 00000000..c1fa05a6 --- /dev/null +++ b/packages/knowledge/CHANGELOG.md @@ -0,0 +1,8 @@ +# @scream-code/knowledge + +## 0.20.0 + +### Patch Changes + +- Updated dependencies [[`164e04b`](https://github.com/LIUTod/scream-code/commit/164e04b413618ef27ca4e9c81f69d7a9c50d6259)]: + - @scream-code/memory@0.20.0 diff --git a/packages/knowledge/package.json b/packages/knowledge/package.json index 46030c11..8b27e7ef 100644 --- a/packages/knowledge/package.json +++ b/packages/knowledge/package.json @@ -1,6 +1,6 @@ { "name": "@scream-code/knowledge", - "version": "0.19.5", + "version": "0.20.0", "private": true, "description": "Local knowledge base library for scream-code agent retrieval", "license": "MIT", diff --git a/packages/ltod/CHANGELOG.md b/packages/ltod/CHANGELOG.md new file mode 100644 index 00000000..e44f3689 --- /dev/null +++ b/packages/ltod/CHANGELOG.md @@ -0,0 +1,3 @@ +# @scream-code/ltod + +## 0.20.0 diff --git a/packages/ltod/package.json b/packages/ltod/package.json index daa5f893..fa2ead8a 100644 --- a/packages/ltod/package.json +++ b/packages/ltod/package.json @@ -1,6 +1,6 @@ { "name": "@scream-code/ltod", - "version": "0.19.5", + "version": "0.20.0", "private": true, "description": "The LLM abstraction layer for modern AI agent applications", "license": "MIT", diff --git a/packages/memory/CHANGELOG.md b/packages/memory/CHANGELOG.md new file mode 100644 index 00000000..f4e5e574 --- /dev/null +++ b/packages/memory/CHANGELOG.md @@ -0,0 +1,11 @@ +# @scream-code/memory + +## 0.20.0 + +### Patch Changes + +- [`164e04b`](https://github.com/LIUTod/scream-code/commit/164e04b413618ef27ca4e9c81f69d7a9c50d6259) - Memory stays a single entity: `memos`. `/dream` merges 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. Both `distilled` and `note` are persisted, editable via `MemoryEdit` or in place from `/memory`, shown in `/memory` and memo injection, and returned by `MemoryLookup`; 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) and `distilledFrom` (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: `origin` is backfilled to `dream` for every memo that already carries a `distilled` conclusion. + + The `/memory` picker 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 with `e` → Enter; a rewrite sets `origin='user'` and a fresh `distilledAt`, while clearing the text drops back to an extracted memo. Because merging permanently deletes the original memos, the `/dream` preview must show any existing conclusion it overrides, and deleting a rule in `/memory` now warns that its originals are gone for good. diff --git a/packages/memory/package.json b/packages/memory/package.json index e92a0222..94e9f833 100644 --- a/packages/memory/package.json +++ b/packages/memory/package.json @@ -1,6 +1,6 @@ { "name": "@scream-code/memory", - "version": "0.19.5", + "version": "0.20.0", "private": true, "description": "Persistent memory memo store for cross-session knowledge sharing", "license": "MIT", diff --git a/packages/node-sdk/CHANGELOG.md b/packages/node-sdk/CHANGELOG.md new file mode 100644 index 00000000..3328ac27 --- /dev/null +++ b/packages/node-sdk/CHANGELOG.md @@ -0,0 +1,3 @@ +# @scream-code/scream-code-sdk + +## 0.20.0 diff --git a/packages/node-sdk/package.json b/packages/node-sdk/package.json index d22505c9..cf858f02 100644 --- a/packages/node-sdk/package.json +++ b/packages/node-sdk/package.json @@ -1,6 +1,6 @@ { "name": "@scream-code/scream-code-sdk", - "version": "0.19.5", + "version": "0.20.0", "private": true, "description": "TypeScript SDK for the Scream Code Agent", "license": "MIT",