Repository navigation
Beta v0.8.5
What's Changed
π New Features
- Session-local background shell tasks (bf23b10) β
bash_startstarts a command in the workspace root and returns a task ID without waiting, andbash_status,bash_logs, andbash_stopobserve, read, and stop it. Tasks areWorkonly, capped at 32 active at once, keep bounded logs with stdin closed, are not persisted, and are stopped when the session closes. - Selectable per-model context windows with
/context(6196fc1) β/contextcycles the budgets declared for the active model or sets one by value, such as/context 272k, with Tab completion from that model's choices. The choice is saved per provider and model inconfig.json.contextSelectionsand drives compaction,/status, and CTX percentages. - Ranked
searchtool for file discovery (910fe71, 16e51e0) βsearchmatches a .NET regular expression against workspace-relative paths and file contents and returns one ranked line per file with matching-line previews and optionalpath,glob,caseSensitive,offset, andlimitarguments. TheWorkandPlanprompts now direct the model to start withsearchwhen it does not know which files matter. - Configurable retry policies (a8a3012) β
retryandapprovalRetryinconfig.jsonsetenabled,maximumRetries,initialDelaySeconds,backoffFactor,jitterFactor, andmaximumDelaySecondsfor work turns, compaction, and the approval reviewer. A transient reviewer request failure is now retried instead of falling straight through to your approval prompt. - Host approval classifier for external tools (13e6e05, fa47d7b) β external dotnet tools can implement
IHostToolApprovalClassifier.ClassifyApprovalAsyncto classify their own calls before invocation, and the host bounds the call with a two-second budget, merges the result so it can only raise risk or authority, and fails closed on timeout, cancellation, or invalid values, disabling that classifier until the catalog reloads./toolslists a Pre-classifier column, and calls markedRequirePromptoffer only Once or Deny and cannot pass through a policy, a grant, or a reviewer Allow. - Reasoning replay across model switches (7ad11d6) β reasoning that a newly selected endpoint cannot consume as native state is replayed as assistant text, so switching models keeps the conversation instead of failing the turn.
- Endpoint-defined thinking effort tokens (f9b302c) β a model entry's
thinkingEffortsnow accepts a custom token that starts with a letter and then uses only letters, digits, and hyphens, and the host forwards it to the endpoint without interpreting it;/thinkingand--thinkingaccept the same tokens. - Unavailable thinking effort reporting (c8e7540) β
crystal runprints a note on its error stream when the requested thinking effort is unavailable for the model and continues with the provider default, and Gemini maps the portablemaximumeffort tohighbecause neither Gemini generation has a maximum level. - Anthropic
thinkingDisplayendpoint option (fb8ba48) β an Anthropic provider entry inproviders.jsoncan setthinkingDisplayin itsoptionsobject toomittedto leave the display field off a turned-on thinking block, whilesummarized(the default) asks for summarized thinking text; unknown or protocol-inapplicable options fail loading. - Declared audio and video input on model entries (2b23896) β
audioInputandvideoInputare accepted on a model entry and published to plugins, but they are declarations only: the host stores them without sending or accepting audio or video, andimageInputremains the only flag that allows media input. - Split bash timeouts with a 3-hour background default (8582c48, 87337fd) β the foreground
bashtimer now defaults to 600 seconds, backgroundbash_starttasks use their ownbackgroundBashTimeoutSecondssetting independent of the foreground timer, and that setting defaults to 10,800 seconds (3 hours). - Nested
contextSelectionsstorage (90b59a5) β saved context budgets inconfig.jsonare written as a nested{"provider": {"model": tokens}}map, and the older flat{"provider/model": tokens}form is still read and is rewritten nested on the next save. - Effective retry policies in
/status full(809e138) β/status fulland the full status overlay now report the retry and approval-retry policies in effect, including the retry count, base delay, factor, jitter, and cap. - Question tool answers as review authorization evidence (fd56a55) β answers you give to the
questiontool are marked as user evidence in the review transcript and count as user authorization, and the reviewer's transcript budgets grow to 8,000 message tokens and 4,000 tool tokens. - Approval review prompt hardening (3357034) β the reviewer now judges authorization by what your words materially permit rather than by exact phrasing, and an explicit approval of a concrete action after you were told its risk scores high even after an earlier refusal. It ignores untrusted text that tries to redefine the rules or demand approval and no longer claims to have inspected anything itself.
- Tighter compaction summaries (9739203) β compaction summaries now keep your authorized scope exact, record errors and dead ends with how they were resolved, keep unresolved failures under Blocked, and base Next Move on your most recent request.
π Fixes
- Tool calls lost on Responses streams (d985841) β GPT streams that send complete arguments in
response.function_call_arguments.doneorresponse.output_item.donewithout argument deltas now produce the tool call payload, and object or array argument values are accepted as raw JSON. - Null and blank tool arguments (7625f0e) β a JSON
nulloptional string is now read as absent, blank strings pass through so each tool applies its own default, path tools fall back to the workspace root, and approval classifiers agree on the same value. - Reasoning and message items on Responses streams (8dcfddf) β each provider
output_indexand item kind pair now maps to a distinct Crystal item index, so reasoning and the following message no longer collide or share an index, and a stale reasoning state event attaches to the item that was streamed. - Background shell task limits, logs, and display (81a61a8) β background tasks now close stdin, count only active tasks toward the 32-task limit, keep the newest output when the log buffer overflows, and await the process stop in
bash_stop;Planrejects background bash side effects, and the bash tools show progress and summary text. - Context window in the header and chrome (027f0fd) β the renderer's context window now follows the selected local budget from the session status, so the header and context-window field stay in sync with
/context. - Multiple reasoning blocks in one assistant turn (d24c670) β reasoning blocks now merge in order instead of failing the request: readable text joins the assistant content in arrival order, and Ollama concatenates
thinkingtext. - Cancellation while stopping a background task (651e33b) β cancelling a turn while
bash_stopwaits for the process to stop now cancels that wait instead of ignoring the cancellation. - Non-finite retry settings and backoff overflow (d05dbb4) β
retryandapprovalRetryvalues that are NaN or infinite are rejected when settings load, and the exponential delay is clamped to the configured cap before it can overflow. - Spurious thinking-off note for models without thinking (6fedd08) β a model that does not think already omits reasoning hints, so an explicit
offselection no longer prints a fallback note fromcrystal run; named efforts on such models still report the provider default.
π Documentation
- Plugin-extensible status bar in planned capabilities (7af5eef) β
README.md,docs/user-guide.md, andBUSINESS.mdnow list a plugin-extensible status bar among the planned capabilities that are not yet implemented. - Open question on configurable built-in tool limits (158b018) β
BUSINESS.mdrecords that whether built-in tool limits become operator configuration is under consideration and not decided, with the current host-owned constants standing.
π¬ If you run into any issues, please report them via GitHub Issues: https://github.com/YELANDAOKONG/CrystalCode/issues
Full Changelog: B0.8.4...B0.8.5