All notable changes to this project will be documented in this file.
The format is based on Keep a Changelog, and this project adheres to Semantic Versioning.
- Custom tool descriptions — all toolset factories now accept
descriptions: dict[str, str] | Noneparameter to override any tool's built-in description. Applies toSkillsToolset,AgentMemoryToolset,CheckpointToolset,create_team_toolset(),create_plan_toolset(), andcreate_web_toolset() - Custom commands — user-triggered slash commands from
.mdfiles (cli/commands/). Built-in commands:/commit,/pr,/review,/test,/fix,/explain. Three-scope discovery: built-in → user → project - Diff viewer for file approvals (
cli/diff_display.py) — colored unified diffs with gutter bars (▌ green/red) foredit_file, line-numbered head/tail previews forwrite_file, shown before Y/N/A approval prompt - Tool call success/error rendering (
cli/tool_display.py) —render_tool_call_success()shows ✓ with elapsed time in green,render_tool_call_error()shows ✗ in red - New glyphs (
cli/theme.py) —gutter_bar(▌),box_vertical(│),progress_filled(█),progress_empty(░) with ASCII fallbacks
- CLI streaming — single
Livecontext that starts as a braille spinner and transitions to Markdown rendering seamlessly, eliminating the visual gap between thinking and text output - CLI status bar — visual context progress bar (
█████░░░░░ 45%) with threshold colors (green <60%, amber 60–85%, red >85%) and auto-approve indicator - CLI tool calls — pending → success (✓) or error (✗) state transitions with elapsed time display; reduced tool result preview from 6 to 3 lines
- CLI file approval —
edit_fileshows colored unified diff with+N -Mstats;write_fileshows syntax-aware preview with line numbers (head 20 / tail 10 for large files) - BrailleSpinner — bold accent color for status text, muted for elapsed time
- Moved tool-specific guidance from system prompt to tool descriptions — All local toolsets now use exported description constants wired via
@toolset.tool(description=CONSTANT):- Skills:
LIST_SKILLS_DESCRIPTION,LOAD_SKILL_DESCRIPTION,READ_SKILL_RESOURCE_DESCRIPTION,RUN_SKILL_SCRIPT_DESCRIPTION - Memory:
READ_MEMORY_DESCRIPTION,WRITE_MEMORY_DESCRIPTION,UPDATE_MEMORY_DESCRIPTION - Checkpointing:
SAVE_CHECKPOINT_DESCRIPTION,LIST_CHECKPOINTS_DESCRIPTION,REWIND_TO_DESCRIPTION - Plan:
ASK_USER_DESCRIPTION,SAVE_PLAN_DESCRIPTION - Teams:
SPAWN_TEAM_DESCRIPTION,ASSIGN_TASK_DESCRIPTION,CHECK_TEAMMATES_DESCRIPTION,MESSAGE_TEAMMATE_DESCRIPTION,DISSOLVE_TEAM_DESCRIPTION
- Skills:
- Slimmed CLI system prompt (
cli/prompts.py) — Reduced from ~350 lines to ~100 lines. Removed_SHELL_SECTION,_GIT_SECTION,_DEPENDENCIES_SECTION,_PLANNING_SECTION,_DELEGATION_SECTION(all moved to tool descriptions in pydantic-ai-backend and pydantic-ai-subagents). Kept only general behavioral guidance: path handling, exactness requirements, code quality, verification. - Simplified
build_cli_instructions()— Removed tool-conditional sections.include_execute,include_todo,include_subagentsparams kept for backwards compatibility but are now no-ops. - Updated
pydantic-ai-backenddependency to>=0.1.8— fixesDockerSandbox.grep_raw()defaulting to/instead of., which caused grep without explicit path to scan the entire container filesystem (pydantic-ai-backend#13) - Repository restructuring — moved
swebench_agent/,harbor_agent/, anddeepresearch/intoapps/directory. Internal imports converted to relative. Core library (pydantic_deep/) and CLI (cli/) remain at root.
- Command injection in
BackendSkillScriptExecutor— shell metacharacters in skill script arguments are now escaped withshlex.quote()(#31)
- Textual TUI — removed
cli/tui/directory (7 files),pydantic-deep tuicommand, andtextualoptional dependency due to fundamental scrolling issues with touchpad/wheel input
- Checkpointing & Rewind: Save conversation state at intervals, rewind to any checkpoint, or fork into a new session.
Checkpoint,CheckpointStoreprotocol,InMemoryCheckpointStore,FileCheckpointStore,CheckpointMiddleware(auto-save every tool/turn/manual),CheckpointToolset(save_checkpoint, list_checkpoints, rewind_to tools),RewindRequestedexception for app-level rewind,fork_from_checkpoint()utility for session forking. Enable viainclude_checkpoints=True. - Agent Teams: Shared TODO lists with asyncio-safe claiming and dependency blocking (
SharedTodoList), peer-to-peer message bus (TeamMessageBus), team coordinator (AgentTeam) with spawn, assign, broadcast, wait_all, dissolve operations,create_team_toolset()factory. Enable viainclude_teams=True. - Claude Code-Style Hooks:
Hook,HookEventenum (PRE_TOOL_USE, POST_TOOL_USE, POST_TOOL_USE_FAILURE),HookInput,HookResult,HooksMiddleware. Execute shell commands or Python handlers on tool lifecycle events. Exit code conventions (0=allow, 2=deny), regex matchers, timeout, and background execution support. - Persistent Memory:
AgentMemoryToolsetwith read_memory, write_memory, update_memory tools. Per-agent MEMORY.md files auto-injected into system prompt (first 200 lines). Per-subagent memory with opt-out viaextra={"memory": False}. Enable viainclude_memory=True. - Context Files:
ContextToolsetfor auto-discovering and injecting DEEP.md, AGENTS.md, CLAUDE.md, SOUL.md into system prompt. Subagent filtering (only DEEP.md + AGENTS.md forwarded). Per-subagent context_files via SubAgentConfig. Truncation support. Enable viacontext_files=[...]orcontext_discovery=True. - Eviction Processor:
EvictionProcessorsaves large tool outputs (>20k tokens by default) to files and replaces with head/tail preview + file reference. Keeps conversation lean while preserving data access. Enable viaeviction_token_limit=20000. - Output Styles: 4 built-in styles (concise, explanatory, formal, conversational), custom
OutputStyleinstances, file-based styles with YAML frontmatter, directory discovery viastyles_dir. Apply viaoutput_style="concise". - Plan Mode: Built-in 'planner' subagent with
ask_user(interactive options with headless mode) andsave_plantools. Plans saved as markdown files to configurableplans_dir. Enable viainclude_plan=True(default). - Patch Tool Calls Processor: Fixes orphaned tool calls when resuming interrupted conversations by injecting synthetic "Tool call was cancelled." responses. Enable via
patch_tool_calls=True. BASE_PROMPT: Exported default system prompt for inspection and customization.share_todosonDeepAgentDeps: When True, subagents share the same todo list reference as the parent agent. Default False (isolated).subagent_extra_toolsetsparameter: Pass additional toolsets (e.g., MCP servers) to all subagents viacreate_deep_agent().subagent_registryparameter: OptionalDynamicAgentRegistryfor runtime agent creation viacreate_agent_factory_toolset.
- Skills system rewrite: Complete refactor from single-file
skills.pyto protocol-basedskills/package. New abstractions:Skilldataclass,SkillResource/SkillScript/SkillsDirectoryprotocols,SkillWrapper. Two implementations: file-based (FileBasedSkillResource,LocalSkillScriptExecutor) and backend-based (BackendSkillResource,BackendSkillScriptExecutor,BackendSkillsDirectory). Skill scripts for executable actions. Comprehensive exception hierarchy (SkillException,SkillNotFoundError,SkillValidationError,SkillResourceNotFoundError,SkillResourceLoadError,SkillScriptExecutionError). - Cost tracking enabled by default:
cost_tracking=TrueviaCostTrackingMiddlewarefrom pydantic-ai-middleware. New params:cost_budget_usd(raisesBudgetExceededError),on_cost_updatecallback. - Context manager enabled by default:
context_manager=TrueenablesContextManagerMiddlewarefor automatic token tracking and auto-compression when approaching token budget. New params:context_manager_max_tokens(default 200,000),on_context_updatecallback. - Middleware integration: New
middleware,permission_handler,middleware_contextparams for composableAgentMiddlewarechains via pydantic-ai-middleware. Agent automatically wrapped inMiddlewareAgentwhen any middleware is active. - Updated
pydantic-ai-tododependency to>=0.1.8(todo IDs in system prompt, improved active_form descriptions) - Updated
subagents-pydantic-aidependency to>=0.0.5 - Updated
pydantic-ai-middlewaredependency to>=0.2.1 - Updated
summarization-pydantic-aidependency to>=0.0.3 - Updated
pydantic-ai-backenddependency to>=0.1.7
- Added 11 new advanced feature guides: checkpointing, teams, hooks, memory, context-files, eviction, cost-tracking, middleware, output-styles, plan-mode, multi-user
- Updated agents, toolsets, and skills concept pages for all new features
- Updated API reference (agent, toolsets, types) with all new parameters and types
- Comprehensive CLAUDE.md with full architecture documentation
- Updated
subagents-pydantic-aidependency from>=0.0.3to>=0.0.4— fixesAttributeError: 'Agent' object has no attribute '_register_toolset'compatibility issue with pydantic-ai >= 1.38 (subagents-pydantic-ai#5) - Removed
_register_toolsetmock from test fixtures (tests/conftest.py) — no longer needed after subagents fix
retriesparameter forcreate_deep_agent(): New explicit parameter (default: 3) that controls max retries for tool calls across all built-in toolsets. When the model sends invalid arguments (e.g. missing a required field), the validation error is fed back and the model can self-correct up toretriestimes. Previously, console tools (includingwrite_file) were hardcoded to 1 retry viaFunctionToolsetdefault, making self-correction nearly impossible. (#25)- llms.txt support: Added
mkdocs-llmstxtplugin to generate/llms.txtand/llms-full.txtfiles following the llmstxt.org standard (#26) - Added
mkdocs-llmstxt>=0.2.0to docs dependency group
write_filetool exceeded max retries count of 1: Thewrite_file(and all other console tools) hadmax_retries=1hardcoded viaFunctionToolsetdefault. When the model omitted a required argument likecontent, it got only 1 retry attempt before raisingUnexpectedModelBehavior. Theretriesparameter passed tocreate_deep_agent()was forwarded to theAgentconstructor but never propagated to toolsets. Nowretriesis applied to the console toolset and all its tools, and the default is raised from 1 to 3. (#25)- Fixed 404 when accessing
/llms.txt- the file was referenced in documentation but never generated (#26)
- Breaking: Removed local
pydantic_deep/processors/module - now uses external summarization-pydantic-ai library - Breaking: Removed local
pydantic_deep/toolsets/subagents.pymodule - now uses external subagents-pydantic-ai library - Added
summarization-pydantic-ai>=0.0.1dependency - Added
subagents-pydantic-ai>=0.0.3dependency (fixed docs imports) - Updated
pydantic-ai-todo>=0.1.5dependency (added missing exports) - Updated
summarization-pydantic-ai>=0.0.2dependency (new documentation site) - Updated
pydantic-ai-backend>=0.1.4dependency (new documentation site) - Re-exported
SummarizationProcessor,SlidingWindowProcessor,create_summarization_processor,create_sliding_window_processorfrom summarization-pydantic-ai - Re-exported
SubAgentToolset,create_subagent_toolset,get_subagent_system_promptfrom subagents-pydantic-ai - Re-exported
SubAgentConfig,CompiledSubAgenttypes from subagents-pydantic-ai - Updated
DeepAgentDeps.clone_for_subagent()to accept optionalmax_depthparameter for nested subagent support
SlidingWindowProcessor- zero-cost message trimming without LLM calls (new from summarization-pydantic-ai)create_sliding_window_processor()- factory function for sliding window processors- Dual-mode execution: Subagents can now run in sync (blocking) or async (background) modes
- Auto mode: Intelligent mode selection based on task characteristics
- Task management tools:
check_task,list_active_tasks,soft_cancel_task,hard_cancel_task - Subagent communication:
ask_parenttool for subagents to query the parent agent - Dynamic agent creation: Runtime agent creation via
create_agent_factory_toolset - New types:
TaskHandle,TaskStatus,TaskPriority,TaskCharacteristics,ExecutionMode
- Added
chardet>=5.0.0dependency back - was incorrectly removed in 0.2.13 but is still needed forDeepAgentDeps.upload_file()encoding detection (#22) - Subagents now automatically get
console_toolsetandtodo_toolsetlike in previous versions - the migration tosubagents-pydantic-aiaccidentally removed these default tools (#21)
- Updated
docs/advanced/processors.mdwith SlidingWindowProcessor documentation - Updated
docs/api/processors.mdwith full API reference for both processors - Updated
CLAUDE.mdwith new processor imports and subagent imports from external packages - Updated
README.mdwith subagents-pydantic-ai references in modular architecture - Updated
docs/advanced/subagents.mdwith dual-mode execution and new SubAgentConfig fields - Updated
docs/api/toolsets.mdwith complete SubAgentToolset API including task management tools - Updated
docs/api/types.mdwith new subagent types (TaskHandle, TaskStatus, TaskPriority, ExecutionMode) - Updated
docs/examples/subagents.mdwith correct tool names and updated SubAgentConfig example - Updated
docs/concepts/toolsets.mdwith SubAgentToolset tools and correct parameter names - Fixed
CLAUDE.md- correctedLocalBackend(root=...)toLocalBackend(root_dir=...) - Fixed
CLAUDE.md- correctedCompositeBackendAPI signature (usesdefaultandroutes, notbackends) - Fixed
README.md- corrected import pathpydantic_deep.processorstopydantic_deep - Fixed
docs/api/agent.md- added missinginclude_executeparameter to signature and parameters table - Fixed
pydantic_deep/agent.py- corrected docstring model default from "Claude Sonnet 4" to "openai:gpt-4.1"
- Breaking: Updated
pydantic-ai-backenddependency to>=0.1.0 - Breaking: Removed
FilesystemBackendandLocalSandbox- useLocalBackendinstead - Breaking: Removed
FilesystemToolset- usecreate_console_toolsetfrom pydantic-ai-backend - Replaced custom filesystem toolset with
create_console_toolsetfrom pydantic-ai-backend - Re-exported
LocalBackend,create_console_toolset,get_console_system_prompt,ConsoleDepsfrom pydantic-ai-backend
pydantic_deep/toolsets/filesystem.py- now provided by pydantic-ai-backendchardetdependency - moved to pydantic-ai-backend
- Simplified backend documentation - now links to pydantic-ai-backend docs
- Updated all examples to use
LocalBackendinstead ofFilesystemBackend - Updated toolsets documentation to reference Console Toolset from pydantic-ai-backend
- Updated
pydantic-ai-backenddependency to>=0.0.4for persistent storage support __version__now dynamically reads from package metadata (pyproject.toml) viaimportlib.metadata
- Added persistent storage documentation to
docs/examples/docker-sandbox.md:volumesparameter for DockerSandboxworkspace_rootparameter for SessionManager
- Added
workspace_rootdocumentation todocs/examples/docker-runtimes.md:- Configuration options section
- New "Persistent Storage with workspace_root" section with examples
- Directory structure diagram
- Updated
docs/examples/full-app.mdwithworkspace_rootin SessionManager example - Updated
examples/full_app/app.pyto useworkspace_rootfor persistent user files