Repository navigation
v0.10.0
-
[BRK] removed the profile-level
rolefield. The only "role" concepts that remain are the message-format wire encoding (Message.role, role-mapping) and plain prose in user-supplied context files.- Profile files with
role:frontmatter still parse -- the key is dropped and can never reach prompt assembly (covered by tests asserting a profile role can never leak into the system prompt). - Config keys
roleandtaskDefaultRoleand the--roleflag are gone; the{{ role }}placeholder was removed from the default system prompt template. If you had a role line, fold it into the profile body.
- Profile files with
-
[BRK] internals / hooks - pipeline handlers now patch the payload. Whatever a handler returns is written onto the payload, field by field, so every later handler and core read one thing: the payload. This replaces reading "the last handler's whole return value" at each call site, which silently dropped earlier patches — a
provider:requesthandler returning{ modelConfig }followed by one returning{ messages }used to lose the model. Same rule now coverscontext({ messages }),provider:request,provider:response,tool:result,tool:call,input, andcommand:dispatch. Non-object returns (a bare array, a string) are not patches and are ignored.runHookPipeline()no longer returns alastResultfield;results(every return, in order) andstoppedremain. The now-dead type-guard helpers (isGateActionBlock/Modify/Continue/Handled,isInputTransform,isInputHandled) are removed: call sites directly read the payload'saction. -
extensions - new opt-in tier:
@experimentalinextension_pathsloadssrc/experimental/(the setting replaces the default, so use["@extensions", "@experimental"]to keep the built-ins). First entry:file-watch, cooperative-editing awareness for a shared working tree — it tracks the files a session reads and writes, notices when the bytes on disk stop matching what the session believes, rides that onto each request as a harness system-notice, and blocks anoverwriteonto a file that changed underneath the session. -
fix - duplicate message delivery in the core agent loop: a UI host calling
run()afterSessionManagerhad already started the loop spawned a second consumer on the same queue, so one queued message could drive twoagent.run()calls (the loser threwAlreadyRunning).run()/runUntilCancelled()are now idempotent -- a later call joins the active loop instead of racing it. -
tools - a batch of core-tool and extension fixes found by auditing
src/extensions/:project_info: the non-git file listing was computed relative to the process CWD instead of the requested directory, so listing a directory from another launch dir produced absolute/../paths.web_search: theresultscount entry reported the number of output lines instead of the number of results (e.g. 3 results with descriptions read as 9).find:max_results: 0was accepted and silently returned "No files found" even when matches exist; it now falls back to the default like any other sub-minimum value. Thefile_typetool schema now documents the empty-file filter ("e") the code already supported.read: files above 1MB are now read with a single streaming pass (the whole-file read is kept for small files), so paginating a multi-GB log no longer materializes the entire file in memory per call.
-
config - removed two dead config keys:
coreTools.maxDiffSizeandhandoffTool.systemPrompt(declared in schema and docs, read by no code). Added the missinglayersblock to theloopconfig schema, which had leftloop.*settings outside the config resolution pipeline. -
questiontool: the schema no longer markskeyas required — it was always auto-generated from the prompt when omitted. -
hooks -
notifyHooks()is now awaitable: handlers start immediately in registration order (async ones run in parallel). Core call sites now await it where later code depends on the effect: the tool pipeline (TOOL_BEFORE_EXECUTE,AGENT_TOOL_CONTEXT,TOOL_AFTER_EXECUTE,TOOL_METRICS), turn boundaries (TURN_START/TURN_END), session create/swap, the bootstrap registration hooks, andSHUTDOWN_CLEANUP. Previously an asyncAGENT_TOOL_CONTEXThandler could complete its tool-context mount after theTOOL_CALLgate (e.g. the user-gate approval seam) had already run. Signature note:notifyHooks()returnsPromise<void>(wasvoid); unawaited call sites keep the old behavior.
Full Changelog: v0.9.2...v0.10.0