Skip to content

v0.9.3_2026-05-02

Choose a tag to compare

@fswair fswair released this 01 May 17:19
· 6 commits to acpkit_v1 since this release

Summary

0.9.3 brings the extension-seam surface from the Pydantic adapter into langchain-acp, but
mapped onto graph ownership and LangChain runtime truth instead of Pydantic agent internals.

This release keeps the LangChain adapter architecture intact:

  • AdapterConfig continues to own adapter-level runtime knobs.
  • NativeApprovalBridge owns approval persistence and ACP permission presentation.
  • LangChainAcpAgent owns slash-command interception, prompt execution, and session-surface
    refresh.
  • Projection maps continue to own ACP-visible rendering, not graph execution semantics.

Highlights

Prompt capability configuration

langchain-acp now exposes ACP prompt capability advertisement through adapter config:

  • AdapterPromptCapabilities
  • AdapterConfig.prompt_capabilities

This allows hosts to truthfully narrow ACP-visible audio, image, and embedded-context support even
when the underlying graph remains more permissive internally.

Approval presentation and remembered policy

Approval handling now has first-class seams parallel to the Pydantic path:

  • ApprovalPolicy
  • ApprovalPolicyStore
  • SessionMetadataApprovalPolicyStore
  • PermissionOptionSet
  • PermissionRequestContext
  • PermissionToolCallBuilder
  • DefaultPermissionToolCallBuilder
  • ProjectionAwareApprovalBridge
  • NativeApprovalBridge.enable_persistent_choices
  • NativeApprovalBridge.policy_store
  • NativeApprovalBridge.option_set
  • NativeApprovalBridge.tool_call_builder

ACP permission cards can now reuse projection-aware file, command, or search context, and
remembered allow/reject choices can be stored outside session metadata when the host needs custom
policy persistence.

ACP-owned slash commands

The adapter now owns a small ACP-native slash-command layer instead of leaving the entire surface to
the graph:

  • mode commands from configured session modes
  • /model
  • /tools
  • /mcp-servers
  • custom host commands through SlashCommandProvider

New public seams:

  • SlashCommandRequest
  • SlashCommandResult
  • SlashCommandProvider
  • SlashCommandHandler
  • StaticSlashCommand
  • StaticSlashCommandProvider
  • AdapterConfig.slash_command_provider

Custom commands can emit transcript updates, plain text, and optional session-surface refreshes
without invoking the graph.

External hook and runtime event projection

External runtimes can now push hook-style lifecycle events into ACP without depending on graph-owned
callbacks:

  • HookEvent
  • HookProjectionMap
  • EventEmissionMode
  • ExternalHookEventBridge

The bridge supports paired start/progress emission, start-only emission, hidden progress variants,
and bridge-owned metadata export.

Filesystem search projection and tool classification

Filesystem projection now supports search/list-specific rendering on the LangChain path:

  • FileSystemProjectionMap.search_tool_names
  • FileSystemProjectionMap.default_search_tool
  • FileSystemProjectionMap.search_path_arg
  • FileSystemProjectionMap.search_pattern_arg
  • FileSystemProjectionMap.render_search_results_as_tree
  • FileSystemProjectionMap.hide_dot_directories_in_tree
  • FileSystemProjectionMap.tree_root_label
  • ProjectionAwareToolClassifier

This lets search-style tool output render as deterministic ACP tree progress without touching the
filesystem, and gives approval rendering a better tool-kind classifier for projected tools.

Compatibility and behavior

  • Existing approval bridges keep working through the legacy compatibility path.
  • Projection-aware approval behavior is opt-in through ProjectionAwareApprovalBridge.
  • Remembered approval lookup is live runtime behavior through ApprovalPolicyStore.get_policy(...),
    not metadata export.
  • ProjectionAwareToolClassifier preserves raw_input when it falls back to the wrapped
    classifier, so arg-sensitive custom classifiers continue to behave correctly.
  • Custom slash command ids must already be normalized lowercase slash ids before they are advertised
    to ACP clients.
  • Built-in slash commands still run before host-defined commands.
  • Search/list projection remains opt-in; existing projection maps keep default behavior unless the
    new fields are configured.

Public API additions

New or newly-exported public seams in this release include:

  • AdapterPromptCapabilities
  • ApprovalPolicy
  • ApprovalPolicyStore
  • SessionMetadataApprovalPolicyStore
  • PermissionOptionSet
  • PermissionRequestContext
  • PermissionToolCallBuilder
  • DefaultPermissionToolCallBuilder
  • ProjectionAwareApprovalBridge
  • supports_projection_aware_approval_bridge(...)
  • SlashCommandRequest
  • SlashCommandResult
  • SlashCommandProvider
  • SlashCommandHandler
  • StaticSlashCommand
  • StaticSlashCommandProvider
  • HookEvent
  • HookProjectionMap
  • EventEmissionMode
  • ExternalHookEventBridge
  • ProjectionAwareToolClassifier

Documentation and examples

Documentation was expanded across the LangChain adapter docs:

  • docs/langchain-acp.md
  • docs/langchain-acp/adapter-config.md
  • docs/langchain-acp/runtime-controls.md
  • docs/langchain-acp/plans-thinking-approvals.md
  • docs/langchain-acp/bridges.md
  • docs/langchain-acp/projections.md
  • docs/langchain-acp/providers.md
  • docs/getting-started/langchain-quickstart.md
  • packages/adapters/langchain-acp/README.md

The docs now cover:

  • explicit prompt_capabilities
  • ACP-owned slash commands and custom providers
  • persistent approval choices on NativeApprovalBridge
  • projection-aware permission rendering
  • external hook-event projection
  • search/list tree rendering
  • Codex helper usage with required instructions=...

Validation

Validation for this release:

  • uv run pytest --cov=.: 469 passed
  • Line & Branch coverage: 100.00%
  • make prod: passed
  • git diff --check: passed

Changed files

Primary implementation areas:

  • packages/adapters/langchain-acp/src/langchain_acp/config.py
  • packages/adapters/langchain-acp/src/langchain_acp/prompt_capabilities.py
  • packages/adapters/langchain-acp/src/langchain_acp/approval_store.py
  • packages/adapters/langchain-acp/src/langchain_acp/permission_presentation.py
  • packages/adapters/langchain-acp/src/langchain_acp/approvals.py
  • packages/adapters/langchain-acp/src/langchain_acp/slash.py
  • packages/adapters/langchain-acp/src/langchain_acp/_slash_commands.py
  • packages/adapters/langchain-acp/src/langchain_acp/runtime/slash_commands.py
  • packages/adapters/langchain-acp/src/langchain_acp/hook_projection.py
  • packages/adapters/langchain-acp/src/langchain_acp/bridges/external_hooks.py
  • packages/adapters/langchain-acp/src/langchain_acp/projection.py
  • packages/adapters/langchain-acp/src/langchain_acp/runtime/adapter.py
  • packages/adapters/langchain-acp/src/langchain_acp/runtime/server.py
  • packages/adapters/langchain-acp/src/langchain_acp/__init__.py

Full Changelog: v0.9.0_2026-04-21...v0.9.3_2026-05-01

Full Changelog: v0.9.0_2026-04-21...v0.9.3_2026-05-01