acpkit 0.7.0__tar.gz → 0.8.0__tar.gz

This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
Files changed (229) hide show
  1. {acpkit-0.7.0 → acpkit-0.8.0}/.agents/skills/acpkit-sdk/SKILL.md +72 -0
  2. {acpkit-0.7.0 → acpkit-0.8.0}/.gitignore +3 -0
  3. {acpkit-0.7.0 → acpkit-0.8.0}/.pre-commit-config.yaml +3 -3
  4. acpkit-0.8.0/CHANGELOG +74 -0
  5. acpkit-0.8.0/COVERAGE +2 -0
  6. {acpkit-0.7.0 → acpkit-0.8.0}/PKG-INFO +2 -1
  7. acpkit-0.8.0/VERSION +1 -0
  8. {acpkit-0.7.0 → acpkit-0.8.0}/docs/api/pydantic_acp.md +26 -0
  9. {acpkit-0.7.0 → acpkit-0.8.0}/docs/bridges.md +206 -0
  10. {acpkit-0.7.0 → acpkit-0.8.0}/docs/cli.md +50 -7
  11. acpkit-0.8.0/docs/examples/finance.md +38 -0
  12. acpkit-0.8.0/docs/examples/index.md +28 -0
  13. acpkit-0.8.0/docs/examples/travel.md +27 -0
  14. {acpkit-0.7.0 → acpkit-0.8.0}/docs/getting-started/quickstart.md +1 -1
  15. {acpkit-0.7.0 → acpkit-0.8.0}/docs/index.md +2 -2
  16. {acpkit-0.7.0 → acpkit-0.8.0}/docs/llms-full.txt +461 -432
  17. {acpkit-0.7.0 → acpkit-0.8.0}/docs/llms.txt +7 -13
  18. {acpkit-0.7.0 → acpkit-0.8.0}/docs/pydantic-acp/plans-thinking-approvals.md +86 -5
  19. {acpkit-0.7.0 → acpkit-0.8.0}/docs/pydantic-acp/session-state.md +24 -0
  20. {acpkit-0.7.0 → acpkit-0.8.0}/docs/pydantic-acp.md +6 -2
  21. acpkit-0.8.0/examples/pydantic/.gitignore +6 -0
  22. acpkit-0.8.0/examples/pydantic/.travel-agent/ideas.txt +4 -0
  23. acpkit-0.8.0/examples/pydantic/.travel-agent/itinerary.md +5 -0
  24. acpkit-0.8.0/examples/pydantic/README.md +44 -0
  25. acpkit-0.8.0/examples/pydantic/finance_agent.py +263 -0
  26. acpkit-0.8.0/examples/pydantic/travel_agent.py +262 -0
  27. {acpkit-0.7.0 → acpkit-0.8.0}/mkdocs.yml +2 -4
  28. {acpkit-0.7.0 → acpkit-0.8.0}/packages/adapters/pydantic-acp/README.md +1 -1
  29. acpkit-0.8.0/packages/adapters/pydantic-acp/VERSION +1 -0
  30. {acpkit-0.7.0 → acpkit-0.8.0}/packages/adapters/pydantic-acp/pyproject.toml +1 -1
  31. {acpkit-0.7.0 → acpkit-0.8.0}/packages/adapters/pydantic-acp/src/pydantic_acp/__init__.py +56 -0
  32. {acpkit-0.7.0/src/acpkit → acpkit-0.8.0/packages/adapters/pydantic-acp/src/pydantic_acp}/_version.py +1 -1
  33. {acpkit-0.7.0 → acpkit-0.8.0}/packages/adapters/pydantic-acp/src/pydantic_acp/bridges/__init__.py +26 -1
  34. {acpkit-0.7.0 → acpkit-0.8.0}/packages/adapters/pydantic-acp/src/pydantic_acp/bridges/base.py +64 -23
  35. acpkit-0.8.0/packages/adapters/pydantic-acp/src/pydantic_acp/bridges/capability_support.py +658 -0
  36. {acpkit-0.7.0 → acpkit-0.8.0}/packages/adapters/pydantic-acp/src/pydantic_acp/bridges/hooks.py +6 -0
  37. {acpkit-0.7.0 → acpkit-0.8.0}/packages/adapters/pydantic-acp/src/pydantic_acp/bridges/prepare_tools.py +96 -5
  38. {acpkit-0.7.0 → acpkit-0.8.0}/packages/adapters/pydantic-acp/src/pydantic_acp/builders/agent.py +2 -7
  39. {acpkit-0.7.0 → acpkit-0.8.0}/packages/adapters/pydantic-acp/src/pydantic_acp/projection.py +608 -25
  40. acpkit-0.7.0/packages/adapters/pydantic-acp/src/pydantic_acp/runtime/adapter.py → acpkit-0.8.0/packages/adapters/pydantic-acp/src/pydantic_acp/runtime/_adapter_mixins.py +201 -423
  41. {acpkit-0.7.0 → acpkit-0.8.0}/packages/adapters/pydantic-acp/src/pydantic_acp/runtime/_adapter_prompt.py +7 -3
  42. acpkit-0.8.0/packages/adapters/pydantic-acp/src/pydantic_acp/runtime/_compat.py +103 -0
  43. {acpkit-0.7.0 → acpkit-0.8.0}/packages/adapters/pydantic-acp/src/pydantic_acp/runtime/_native_plan_runtime.py +20 -3
  44. {acpkit-0.7.0 → acpkit-0.8.0}/packages/adapters/pydantic-acp/src/pydantic_acp/runtime/_prompt_execution.py +20 -0
  45. {acpkit-0.7.0 → acpkit-0.8.0}/packages/adapters/pydantic-acp/src/pydantic_acp/runtime/_prompt_runtime.py +7 -7
  46. {acpkit-0.7.0 → acpkit-0.8.0}/packages/adapters/pydantic-acp/src/pydantic_acp/runtime/_session_runtime.py +2 -9
  47. acpkit-0.8.0/packages/adapters/pydantic-acp/src/pydantic_acp/runtime/adapter.py +282 -0
  48. {acpkit-0.7.0 → acpkit-0.8.0}/packages/adapters/pydantic-acp/src/pydantic_acp/runtime/hook_introspection.py +40 -46
  49. acpkit-0.8.0/packages/adapters/pydantic-acp/src/pydantic_acp/serialization.py +46 -0
  50. acpkit-0.8.0/packages/adapters/pydantic-acp/src/pydantic_acp/types.py +43 -0
  51. acpkit-0.8.0/packages/helpers/codex-auth-helper/VERSION +1 -0
  52. {acpkit-0.7.0/packages/adapters/pydantic-acp/src/pydantic_acp → acpkit-0.8.0/packages/helpers/codex-auth-helper/src/codex_auth_helper}/_version.py +1 -1
  53. {acpkit-0.7.0 → acpkit-0.8.0}/pyproject.toml +2 -3
  54. {acpkit-0.7.0 → acpkit-0.8.0}/scripts/generate_llms_docs.py +7 -19
  55. {acpkit-0.7.0/packages/helpers/codex-auth-helper/src/codex_auth_helper → acpkit-0.8.0/src/acpkit}/_version.py +1 -1
  56. {acpkit-0.7.0 → acpkit-0.8.0}/src/acpkit/cli.py +2 -2
  57. acpkit-0.8.0/tests/codex_auth_helper/test_auth.py +260 -0
  58. {acpkit-0.7.0 → acpkit-0.8.0}/tests/pydantic/support.py +26 -0
  59. {acpkit-0.7.0 → acpkit-0.8.0}/tests/pydantic/test_adapter_helpers.py +441 -6
  60. acpkit-0.8.0/tests/pydantic/test_bridge_capability_support.py +749 -0
  61. acpkit-0.8.0/tests/pydantic/test_bridge_prepare_tools.py +248 -0
  62. {acpkit-0.7.0 → acpkit-0.8.0}/tests/pydantic/test_bridge_thinking.py +10 -5
  63. acpkit-0.8.0/tests/pydantic/test_bridge_web_capabilities.py +107 -0
  64. acpkit-0.8.0/tests/pydantic/test_compat.py +129 -0
  65. acpkit-0.8.0/tests/pydantic/test_examples.py +435 -0
  66. {acpkit-0.7.0 → acpkit-0.8.0}/tests/pydantic/test_hook_introspection.py +123 -15
  67. {acpkit-0.7.0 → acpkit-0.8.0}/tests/pydantic/test_low_level_helpers.py +36 -0
  68. {acpkit-0.7.0 → acpkit-0.8.0}/tests/pydantic/test_models.py +95 -115
  69. acpkit-0.8.0/tests/pydantic/test_projection.py +1039 -0
  70. {acpkit-0.7.0 → acpkit-0.8.0}/tests/pydantic/test_runtime.py +20 -0
  71. acpkit-0.8.0/tests/pydantic/test_session_runtime_helpers.py +276 -0
  72. {acpkit-0.7.0 → acpkit-0.8.0}/tests/pydantic/test_slash_commands.py +49 -4
  73. {acpkit-0.7.0 → acpkit-0.8.0}/tests/test_acpkit_cli.py +157 -5
  74. acpkit-0.8.0/tests/test_compatibility_manifest.py +200 -0
  75. acpkit-0.8.0/tests/test_native_pydantic_agent.py +189 -0
  76. acpkit-0.7.0/COVERAGE +0 -2
  77. acpkit-0.7.0/VERSION +0 -1
  78. acpkit-0.7.0/docs/examples/factory.md +0 -47
  79. acpkit-0.7.0/docs/examples/index.md +0 -43
  80. acpkit-0.7.0/docs/examples/minimal.md +0 -42
  81. acpkit-0.7.0/docs/examples/providers.md +0 -33
  82. acpkit-0.7.0/docs/examples/workspace-agent.md +0 -277
  83. acpkit-0.7.0/examples/pydantic/.gitignore +0 -2
  84. acpkit-0.7.0/examples/pydantic/README.md +0 -63
  85. acpkit-0.7.0/examples/pydantic/approvals.py +0 -57
  86. acpkit-0.7.0/examples/pydantic/bridges.py +0 -137
  87. acpkit-0.7.0/examples/pydantic/factory_agent.py +0 -68
  88. acpkit-0.7.0/examples/pydantic/hook_projection.py +0 -240
  89. acpkit-0.7.0/examples/pydantic/host_context.py +0 -71
  90. acpkit-0.7.0/examples/pydantic/providers.py +0 -253
  91. acpkit-0.7.0/examples/pydantic/static_agent.py +0 -36
  92. acpkit-0.7.0/examples/pydantic/strong_agent.py +0 -719
  93. acpkit-0.7.0/examples/pydantic/strong_agent_v2.py +0 -705
  94. acpkit-0.7.0/packages/adapters/pydantic-acp/VERSION +0 -1
  95. acpkit-0.7.0/packages/adapters/pydantic-acp/src/pydantic_acp/serialization.py +0 -28
  96. acpkit-0.7.0/packages/helpers/codex-auth-helper/VERSION +0 -1
  97. acpkit-0.7.0/tests/pydantic/test_bridge_prepare_tools.py +0 -101
  98. acpkit-0.7.0/tests/pydantic/test_projection.py +0 -364
  99. acpkit-0.7.0/tests/test_compatibility_manifest.py +0 -103
  100. acpkit-0.7.0/tests/test_native_pydantic_agent.py +0 -129
  101. {acpkit-0.7.0 → acpkit-0.8.0}/.agents/skills/acpkit-sdk/agents/openai.yaml +0 -0
  102. {acpkit-0.7.0 → acpkit-0.8.0}/.agents/skills/acpkit-sdk/resources/intro.md +0 -0
  103. {acpkit-0.7.0 → acpkit-0.8.0}/.agents/skills/acpkit-sdk/scripts/list_examples.py +0 -0
  104. {acpkit-0.7.0 → acpkit-0.8.0}/.agents/skills/acpkit-sdk/scripts/list_public_exports.py +0 -0
  105. {acpkit-0.7.0 → acpkit-0.8.0}/.cursorrules +0 -0
  106. {acpkit-0.7.0 → acpkit-0.8.0}/.editorconfig +0 -0
  107. {acpkit-0.7.0 → acpkit-0.8.0}/.github/ISSUE_TEMPLATE/bug_report.yml +0 -0
  108. {acpkit-0.7.0 → acpkit-0.8.0}/.github/ISSUE_TEMPLATE/feature_request.yml +0 -0
  109. {acpkit-0.7.0 → acpkit-0.8.0}/.github/PULL_REQUEST_TEMPLATE.md +0 -0
  110. {acpkit-0.7.0 → acpkit-0.8.0}/.github/dependabot.yml +0 -0
  111. {acpkit-0.7.0 → acpkit-0.8.0}/.github/workflows/ci.yml +0 -0
  112. {acpkit-0.7.0 → acpkit-0.8.0}/.github/workflows/codecov.yml +0 -0
  113. {acpkit-0.7.0 → acpkit-0.8.0}/.github/workflows/docs.yml +0 -0
  114. {acpkit-0.7.0 → acpkit-0.8.0}/.github/workflows/publish.yml +0 -0
  115. {acpkit-0.7.0 → acpkit-0.8.0}/.github/workflows/test.yml +0 -0
  116. {acpkit-0.7.0 → acpkit-0.8.0}/.python-version +0 -0
  117. {acpkit-0.7.0 → acpkit-0.8.0}/CODE_OF_CONDUCT.md +0 -0
  118. {acpkit-0.7.0 → acpkit-0.8.0}/CONTRIBUTING.md +0 -0
  119. {acpkit-0.7.0 → acpkit-0.8.0}/LICENSE +0 -0
  120. {acpkit-0.7.0 → acpkit-0.8.0}/Makefile +0 -0
  121. {acpkit-0.7.0 → acpkit-0.8.0}/README.md +0 -0
  122. {acpkit-0.7.0 → acpkit-0.8.0}/SECURITY.md +0 -0
  123. {acpkit-0.7.0 → acpkit-0.8.0}/context7.json +0 -0
  124. {acpkit-0.7.0 → acpkit-0.8.0}/docs/.partials/index-header.html +0 -0
  125. {acpkit-0.7.0 → acpkit-0.8.0}/docs/about/index.md +0 -0
  126. {acpkit-0.7.0 → acpkit-0.8.0}/docs/api/acpkit.md +0 -0
  127. {acpkit-0.7.0 → acpkit-0.8.0}/docs/api/codex_auth_helper.md +0 -0
  128. {acpkit-0.7.0 → acpkit-0.8.0}/docs/compatibility-matrix-template.md +0 -0
  129. {acpkit-0.7.0 → acpkit-0.8.0}/docs/getting-started/installation.md +0 -0
  130. {acpkit-0.7.0 → acpkit-0.8.0}/docs/helpers.md +0 -0
  131. {acpkit-0.7.0 → acpkit-0.8.0}/docs/host-backends.md +0 -0
  132. {acpkit-0.7.0 → acpkit-0.8.0}/docs/integration-audit.md +0 -0
  133. {acpkit-0.7.0 → acpkit-0.8.0}/docs/integration-readiness.md +0 -0
  134. {acpkit-0.7.0 → acpkit-0.8.0}/docs/integration-testing.md +0 -0
  135. {acpkit-0.7.0 → acpkit-0.8.0}/docs/projection-cookbook.md +0 -0
  136. {acpkit-0.7.0 → acpkit-0.8.0}/docs/providers.md +0 -0
  137. {acpkit-0.7.0 → acpkit-0.8.0}/docs/pydantic-acp/adapter-config.md +0 -0
  138. {acpkit-0.7.0 → acpkit-0.8.0}/docs/pydantic-acp/prompt-resources.md +0 -0
  139. {acpkit-0.7.0 → acpkit-0.8.0}/docs/pydantic-acp/runtime-controls.md +0 -0
  140. {acpkit-0.7.0 → acpkit-0.8.0}/docs/stylesheets/tweaks.css +0 -0
  141. {acpkit-0.7.0 → acpkit-0.8.0}/docs/testing.md +0 -0
  142. {acpkit-0.7.0 → acpkit-0.8.0}/examples/__init__.py +0 -0
  143. {acpkit-0.7.0 → acpkit-0.8.0}/examples/pydantic/__init__.py +0 -0
  144. {acpkit-0.7.0 → acpkit-0.8.0}/packages/adapters/pydantic-acp/src/pydantic_acp/_projection_risk.py +0 -0
  145. {acpkit-0.7.0 → acpkit-0.8.0}/packages/adapters/pydantic-acp/src/pydantic_acp/_projection_text.py +0 -0
  146. {acpkit-0.7.0 → acpkit-0.8.0}/packages/adapters/pydantic-acp/src/pydantic_acp/_slash_commands.py +0 -0
  147. {acpkit-0.7.0 → acpkit-0.8.0}/packages/adapters/pydantic-acp/src/pydantic_acp/agent_source.py +0 -0
  148. {acpkit-0.7.0 → acpkit-0.8.0}/packages/adapters/pydantic-acp/src/pydantic_acp/agent_types.py +0 -0
  149. {acpkit-0.7.0 → acpkit-0.8.0}/packages/adapters/pydantic-acp/src/pydantic_acp/approvals.py +0 -0
  150. {acpkit-0.7.0 → acpkit-0.8.0}/packages/adapters/pydantic-acp/src/pydantic_acp/awaitables.py +0 -0
  151. {acpkit-0.7.0 → acpkit-0.8.0}/packages/adapters/pydantic-acp/src/pydantic_acp/bridges/_hook_capability.py +0 -0
  152. {acpkit-0.7.0 → acpkit-0.8.0}/packages/adapters/pydantic-acp/src/pydantic_acp/bridges/history_processor.py +0 -0
  153. {acpkit-0.7.0 → acpkit-0.8.0}/packages/adapters/pydantic-acp/src/pydantic_acp/bridges/mcp.py +0 -0
  154. {acpkit-0.7.0 → acpkit-0.8.0}/packages/adapters/pydantic-acp/src/pydantic_acp/bridges/thinking.py +0 -0
  155. {acpkit-0.7.0 → acpkit-0.8.0}/packages/adapters/pydantic-acp/src/pydantic_acp/builders/__init__.py +0 -0
  156. {acpkit-0.7.0 → acpkit-0.8.0}/packages/adapters/pydantic-acp/src/pydantic_acp/config.py +0 -0
  157. {acpkit-0.7.0 → acpkit-0.8.0}/packages/adapters/pydantic-acp/src/pydantic_acp/hook_projection.py +0 -0
  158. {acpkit-0.7.0 → acpkit-0.8.0}/packages/adapters/pydantic-acp/src/pydantic_acp/host/__init__.py +0 -0
  159. {acpkit-0.7.0 → acpkit-0.8.0}/packages/adapters/pydantic-acp/src/pydantic_acp/host/_policy_commands.py +0 -0
  160. {acpkit-0.7.0 → acpkit-0.8.0}/packages/adapters/pydantic-acp/src/pydantic_acp/host/_policy_paths.py +0 -0
  161. {acpkit-0.7.0 → acpkit-0.8.0}/packages/adapters/pydantic-acp/src/pydantic_acp/host/context.py +0 -0
  162. {acpkit-0.7.0 → acpkit-0.8.0}/packages/adapters/pydantic-acp/src/pydantic_acp/host/filesystem.py +0 -0
  163. {acpkit-0.7.0 → acpkit-0.8.0}/packages/adapters/pydantic-acp/src/pydantic_acp/host/policy.py +0 -0
  164. {acpkit-0.7.0 → acpkit-0.8.0}/packages/adapters/pydantic-acp/src/pydantic_acp/host/terminal.py +0 -0
  165. {acpkit-0.7.0 → acpkit-0.8.0}/packages/adapters/pydantic-acp/src/pydantic_acp/models.py +0 -0
  166. {acpkit-0.7.0 → acpkit-0.8.0}/packages/adapters/pydantic-acp/src/pydantic_acp/projection_helpers.py +0 -0
  167. {acpkit-0.7.0 → acpkit-0.8.0}/packages/adapters/pydantic-acp/src/pydantic_acp/providers.py +0 -0
  168. {acpkit-0.7.0 → acpkit-0.8.0}/packages/adapters/pydantic-acp/src/pydantic_acp/py.typed +0 -0
  169. {acpkit-0.7.0 → acpkit-0.8.0}/packages/adapters/pydantic-acp/src/pydantic_acp/runtime/__init__.py +0 -0
  170. {acpkit-0.7.0 → acpkit-0.8.0}/packages/adapters/pydantic-acp/src/pydantic_acp/runtime/_agent_state.py +0 -0
  171. {acpkit-0.7.0 → acpkit-0.8.0}/packages/adapters/pydantic-acp/src/pydantic_acp/runtime/_prompt_model_runtime.py +0 -0
  172. {acpkit-0.7.0 → acpkit-0.8.0}/packages/adapters/pydantic-acp/src/pydantic_acp/runtime/_session_lifecycle.py +0 -0
  173. {acpkit-0.7.0 → acpkit-0.8.0}/packages/adapters/pydantic-acp/src/pydantic_acp/runtime/_session_model_runtime.py +0 -0
  174. {acpkit-0.7.0 → acpkit-0.8.0}/packages/adapters/pydantic-acp/src/pydantic_acp/runtime/_session_surface_runtime.py +0 -0
  175. {acpkit-0.7.0 → acpkit-0.8.0}/packages/adapters/pydantic-acp/src/pydantic_acp/runtime/bridge_manager.py +0 -0
  176. {acpkit-0.7.0 → acpkit-0.8.0}/packages/adapters/pydantic-acp/src/pydantic_acp/runtime/prompts.py +0 -0
  177. {acpkit-0.7.0 → acpkit-0.8.0}/packages/adapters/pydantic-acp/src/pydantic_acp/runtime/server.py +0 -0
  178. {acpkit-0.7.0 → acpkit-0.8.0}/packages/adapters/pydantic-acp/src/pydantic_acp/runtime/session_surface.py +0 -0
  179. {acpkit-0.7.0 → acpkit-0.8.0}/packages/adapters/pydantic-acp/src/pydantic_acp/runtime/slash_commands.py +0 -0
  180. {acpkit-0.7.0 → acpkit-0.8.0}/packages/adapters/pydantic-acp/src/pydantic_acp/session/__init__.py +0 -0
  181. {acpkit-0.7.0 → acpkit-0.8.0}/packages/adapters/pydantic-acp/src/pydantic_acp/session/state.py +0 -0
  182. {acpkit-0.7.0 → acpkit-0.8.0}/packages/adapters/pydantic-acp/src/pydantic_acp/session/store.py +0 -0
  183. {acpkit-0.7.0 → acpkit-0.8.0}/packages/adapters/pydantic-acp/src/pydantic_acp/testing/__init__.py +0 -0
  184. {acpkit-0.7.0 → acpkit-0.8.0}/packages/adapters/pydantic-acp/src/pydantic_acp/testing/fakes.py +0 -0
  185. {acpkit-0.7.0 → acpkit-0.8.0}/packages/adapters/pydantic-acp/src/pydantic_acp/testing/harness.py +0 -0
  186. {acpkit-0.7.0 → acpkit-0.8.0}/packages/helpers/codex-auth-helper/.gitignore +0 -0
  187. {acpkit-0.7.0 → acpkit-0.8.0}/packages/helpers/codex-auth-helper/LICENSE +0 -0
  188. {acpkit-0.7.0 → acpkit-0.8.0}/packages/helpers/codex-auth-helper/README.md +0 -0
  189. {acpkit-0.7.0 → acpkit-0.8.0}/packages/helpers/codex-auth-helper/pyproject.toml +0 -0
  190. {acpkit-0.7.0 → acpkit-0.8.0}/packages/helpers/codex-auth-helper/src/codex_auth_helper/__init__.py +0 -0
  191. {acpkit-0.7.0 → acpkit-0.8.0}/packages/helpers/codex-auth-helper/src/codex_auth_helper/auth/__init__.py +0 -0
  192. {acpkit-0.7.0 → acpkit-0.8.0}/packages/helpers/codex-auth-helper/src/codex_auth_helper/auth/config.py +0 -0
  193. {acpkit-0.7.0 → acpkit-0.8.0}/packages/helpers/codex-auth-helper/src/codex_auth_helper/auth/manager.py +0 -0
  194. {acpkit-0.7.0 → acpkit-0.8.0}/packages/helpers/codex-auth-helper/src/codex_auth_helper/auth/state.py +0 -0
  195. {acpkit-0.7.0 → acpkit-0.8.0}/packages/helpers/codex-auth-helper/src/codex_auth_helper/auth/store.py +0 -0
  196. {acpkit-0.7.0 → acpkit-0.8.0}/packages/helpers/codex-auth-helper/src/codex_auth_helper/client.py +0 -0
  197. {acpkit-0.7.0 → acpkit-0.8.0}/packages/helpers/codex-auth-helper/src/codex_auth_helper/factory.py +0 -0
  198. {acpkit-0.7.0 → acpkit-0.8.0}/packages/helpers/codex-auth-helper/src/codex_auth_helper/model.py +0 -0
  199. {acpkit-0.7.0 → acpkit-0.8.0}/packages/helpers/codex-auth-helper/src/codex_auth_helper/py.typed +0 -0
  200. {acpkit-0.7.0 → acpkit-0.8.0}/pyrightconfig.json +0 -0
  201. {acpkit-0.7.0 → acpkit-0.8.0}/scripts/check_pypi_versions.py +0 -0
  202. {acpkit-0.7.0 → acpkit-0.8.0}/scripts/demo_mcp_server.py +0 -0
  203. {acpkit-0.7.0 → acpkit-0.8.0}/scripts/mock_hook_audit.py +0 -0
  204. {acpkit-0.7.0 → acpkit-0.8.0}/scripts/mock_hook_snapshot.py +0 -0
  205. {acpkit-0.7.0 → acpkit-0.8.0}/scripts/run_if_major_change.py +0 -0
  206. {acpkit-0.7.0 → acpkit-0.8.0}/scripts/save_coverage_summary.py +0 -0
  207. {acpkit-0.7.0 → acpkit-0.8.0}/src/acpkit/__init__.py +0 -0
  208. {acpkit-0.7.0 → acpkit-0.8.0}/src/acpkit/__main__.py +0 -0
  209. {acpkit-0.7.0 → acpkit-0.8.0}/src/acpkit/_compatibility_schema.py +0 -0
  210. {acpkit-0.7.0 → acpkit-0.8.0}/src/acpkit/adapters.py +0 -0
  211. {acpkit-0.7.0 → acpkit-0.8.0}/src/acpkit/compatibility.py +0 -0
  212. {acpkit-0.7.0 → acpkit-0.8.0}/src/acpkit/py.typed +0 -0
  213. {acpkit-0.7.0 → acpkit-0.8.0}/src/acpkit/runtime.py +0 -0
  214. {acpkit-0.7.0 → acpkit-0.8.0}/tests/__init__.py +0 -0
  215. {acpkit-0.7.0 → acpkit-0.8.0}/tests/codex_auth_helper/__init__.py +0 -0
  216. {acpkit-0.7.0 → acpkit-0.8.0}/tests/codex_auth_helper/support.py +0 -0
  217. {acpkit-0.7.0 → acpkit-0.8.0}/tests/codex_auth_helper/test_factory.py +0 -0
  218. {acpkit-0.7.0 → acpkit-0.8.0}/tests/conftest.py +0 -0
  219. {acpkit-0.7.0 → acpkit-0.8.0}/tests/pydantic/__init__.py +0 -0
  220. {acpkit-0.7.0 → acpkit-0.8.0}/tests/pydantic/test_approvals.py +0 -0
  221. {acpkit-0.7.0 → acpkit-0.8.0}/tests/pydantic/test_bridge_builder.py +0 -0
  222. {acpkit-0.7.0 → acpkit-0.8.0}/tests/pydantic/test_bridge_hooks.py +0 -0
  223. {acpkit-0.7.0 → acpkit-0.8.0}/tests/pydantic/test_bridge_mcp.py +0 -0
  224. {acpkit-0.7.0 → acpkit-0.8.0}/tests/pydantic/test_host.py +0 -0
  225. {acpkit-0.7.0 → acpkit-0.8.0}/tests/pydantic/test_host_policy.py +0 -0
  226. {acpkit-0.7.0 → acpkit-0.8.0}/tests/pydantic/test_projection_helpers.py +0 -0
  227. {acpkit-0.7.0 → acpkit-0.8.0}/tests/pydantic/test_sources.py +0 -0
  228. {acpkit-0.7.0 → acpkit-0.8.0}/tests/pydantic/test_testing_fakes.py +0 -0
  229. {acpkit-0.7.0 → acpkit-0.8.0}/tests/pydantic/test_testing_harness.py +0 -0
@@ -36,6 +36,78 @@ The core contract across the repo is:
36
36
  That rule affects model selection, mode switching, slash commands, native plan state, approval
37
37
  flow, MCP metadata, hook rendering, cancellation, and host-backed tooling.
38
38
 
39
+ ## Capability Bridges And UI Projection
40
+
41
+ Recent `pydantic-acp` bridge support covers both upstream capability wiring and ACP-visible transcript rendering, but those are different seams.
42
+
43
+ Important distinction:
44
+
45
+ - a capability bridge wires runtime behavior into the agent
46
+ - a projection map decides whether matching tool calls render as rich ACP cards or generic tool output
47
+ - provider-owned compaction visibility is now built into the runtime path and does not need a projection map
48
+
49
+ Current high-value capability bridges:
50
+
51
+ - `ThreadExecutorBridge`
52
+ - `SetToolMetadataBridge`
53
+ - `IncludeToolReturnSchemasBridge`
54
+ - `WebSearchBridge`
55
+ - `WebFetchBridge`
56
+ - `ImageGenerationBridge`
57
+ - `McpCapabilityBridge`
58
+ - `ToolsetBridge`
59
+ - `PrefixToolsBridge`
60
+ - `OpenAICompactionBridge`
61
+ - `AnthropicCompactionBridge`
62
+
63
+ Current projection helpers for capability-owned builtin tools:
64
+
65
+ - `WebToolProjectionMap()`
66
+ - `BuiltinToolProjectionMap()`
67
+
68
+ Use them like this:
69
+
70
+ ```python
71
+ from pydantic_acp import (
72
+ AdapterConfig,
73
+ BuiltinToolProjectionMap,
74
+ WebFetchBridge,
75
+ WebSearchBridge,
76
+ )
77
+
78
+ config = AdapterConfig(
79
+ capability_bridges=[
80
+ WebSearchBridge(),
81
+ WebFetchBridge(),
82
+ ],
83
+ projection_maps=[BuiltinToolProjectionMap()],
84
+ )
85
+ ```
86
+
87
+ What this means in ACP clients:
88
+
89
+ - `WebSearchBridge` + `WebToolProjectionMap` or `BuiltinToolProjectionMap`
90
+ - start card shows query/domain context
91
+ - completion card shows search results instead of opaque raw output
92
+ - `WebFetchBridge` + `WebToolProjectionMap` or `BuiltinToolProjectionMap`
93
+ - start card shows URL
94
+ - completion card shows title, preview text, or binary fetch status
95
+ - `ImageGenerationBridge` + `BuiltinToolProjectionMap`
96
+ - start card shows prompt and settings
97
+ - completion card shows revised prompt / image-generation summary
98
+ - `McpCapabilityBridge` + `BuiltinToolProjectionMap`
99
+ - builtin `mcp_server:*` calls render as intentional MCP cards instead of generic execute noise
100
+
101
+ Compaction is different:
102
+
103
+ - `OpenAICompactionBridge` does not rely on a projection map for visibility
104
+ - `AnthropicCompactionBridge` does not rely on a projection map for visibility
105
+ - when compaction happens, ACP now emits a visible `Context Compaction` card
106
+ - OpenAI compaction opens and closes a visible card around the preflight compaction request
107
+ - Anthropic `CompactionPart` summaries are projected into the transcript as visible completion updates
108
+
109
+ Use this when the product should avoid the "blank wait" failure mode during provider-owned history compaction.
110
+
39
111
  ## Use The Right Construction Seam
40
112
 
41
113
  Pick the narrowest seam that matches the job:
@@ -85,4 +85,7 @@ coverage.json
85
85
  *-integration.md
86
86
  *-improvement.md
87
87
  *-plan.md
88
+ *PLAN.md
88
89
  scripts/openrouter*.py
90
+ scripts/check_releases.py
91
+ /.finance-agent
@@ -14,7 +14,7 @@ repos:
14
14
  hooks:
15
15
  - id: check-pypi-version-ordering
16
16
  name: ensure local package versions are ahead of PyPI
17
- entry: python3.11 scripts/check_pypi_versions.py
17
+ entry: uv run --extra dev python3.11 scripts/check_pypi_versions.py
18
18
  language: system
19
19
  pass_filenames: false
20
20
  stages: [pre-commit]
@@ -25,8 +25,8 @@ repos:
25
25
  pass_filenames: false
26
26
  stages: [pre-commit]
27
27
  - id: check-coverage
28
- name: check coverage thresholds for major changes
29
- entry: python3.11 scripts/run_if_major_change.py --stage pre-commit -- make check-coverage
28
+ name: save and check coverage thresholds for major changes
29
+ entry: python3.11 scripts/run_if_major_change.py --stage pre-commit -- make save-coverage
30
30
  language: system
31
31
  pass_filenames: false
32
32
  stages: [pre-commit]
acpkit-0.8.0/CHANGELOG ADDED
@@ -0,0 +1,74 @@
1
+ ## Release Summary — 2026-04-17
2
+
3
+ This release upgrades `pydantic-acp` to `pydantic-ai-slim==1.83.0`, expands the upstream
4
+ capability bridge surface, improves ACP-native plan mode behavior, and tightens documentation,
5
+ projection coverage, and runtime compatibility seams.
6
+
7
+ ### Highlights
8
+
9
+ - Upgraded `pydantic-acp` to `pydantic-ai-slim==1.83.0`.
10
+ - Hardened hook observation and introspection against upstream private API drift.
11
+ - Added a generic bridge capability seam through `CapabilityBridge.build_agent_capabilities(...)`.
12
+ - Expanded the built-in capability bridge surface to cover:
13
+ - `ThreadExecutorBridge`
14
+ - `SetToolMetadataBridge`
15
+ - `IncludeToolReturnSchemasBridge`
16
+ - `WebSearchBridge`
17
+ - `WebFetchBridge`
18
+ - `ImageGenerationBridge`
19
+ - `McpCapabilityBridge`
20
+ - `ToolsetBridge`
21
+ - `PrefixToolsBridge`
22
+ - `OpenAICompactionBridge`
23
+ - `AnthropicCompactionBridge`
24
+ - Re-exported the new bridges from the public `pydantic_acp` package surface.
25
+
26
+ ### ACP Projection And UX
27
+
28
+ - Added `WebToolProjectionMap` and `BuiltinToolProjectionMap`.
29
+ - Added richer ACP tool-card projection for:
30
+ - web search starts and results
31
+ - web fetch starts, previews, and binary fetch fallbacks
32
+ - image generation starts and summaries
33
+ - upstream MCP capability calls and tool-list responses
34
+ - Added visible transcript updates for provider-owned compaction, including OpenAI preflight
35
+ compaction visibility and Anthropic `CompactionPart` projection.
36
+ - Fixed builtin tool result projection from `ModelResponse` history.
37
+ - Expanded the default tool classifier to recognize common web, image, and `mcp_server:*` builtin
38
+ tool names.
39
+
40
+ ### Native Plan Mode
41
+
42
+ - Added `TaskPlan` as the structured native-plan output surface for ACP plan mode.
43
+ - Added a session-local `plan_generation_type` config option for `PrepareToolsBridge` with
44
+ `structured` and `tools` modes.
45
+ - Made `structured` the default plan-mode behavior so native plan mode can require structured plan
46
+ generation without exposing `acp_set_plan`.
47
+ - Restored tool-based native plan recording behind `plan_generation_type="tools"`.
48
+ - Kept plan progress tools (`acp_update_plan_entry`, `acp_mark_plan_done`) tied to
49
+ `plan_tools=True` execution flows.
50
+
51
+ ### Runtime And Maintainability
52
+
53
+ - Moved remaining private and semi-private hook access behind a dedicated compatibility layer.
54
+ - Preserved hook ordering when wrapping `Hooks(...)` capabilities.
55
+ - Split the large `runtime/adapter.py` delegation surface into dedicated runtime mixins.
56
+ - Added focused inline docstrings on the public ACP-facing adapter methods and runtime mixins.
57
+
58
+ ### Docs And Examples
59
+
60
+ - Extended the maintained bridges example to cover the new bridge and projection surfaces.
61
+ - Updated API and bridge docs to reflect the generic capability seam and the current bridge set.
62
+ - Clarified CLI ownership boundaries between `acpkit run ...`, `run_acp(...)`, and
63
+ `create_acp_agent(...)`.
64
+ - Expanded the factory example docs with explicit session-derived input handling and fallback
65
+ guidance.
66
+ - Documented native plan persistence wiring and clarified how ACP-native plan rendering already
67
+ works through `AgentPlanUpdate` plus `acp_get_plan`.
68
+ - Clarified `FileSessionStore` recovery guarantees versus host-owned recovery metrics.
69
+
70
+ ### Verification
71
+
72
+ - Added regression coverage for the new capability bridges, hook compatibility paths, projection
73
+ updates, native plan generation modes, and adapter runtime mixin delegation paths.
74
+ - Added helper-path tests to keep coverage above the repository thresholds.
acpkit-0.8.0/COVERAGE ADDED
@@ -0,0 +1,2 @@
1
+ Line coverage: 98.86% (5344 / 5386)
2
+ Branch coverage: 97.70% (1614 / 1652)
@@ -1,6 +1,6 @@
1
1
  Metadata-Version: 2.4
2
2
  Name: acpkit
3
- Version: 0.7.0
3
+ Version: 0.8.0
4
4
  Summary: ACP Kit provides a common adapter for Agent Frameworks.
5
5
  Project-URL: Homepage, https://github.com/vcoderun/acpkit
6
6
  Project-URL: Issues, https://github.com/vcoderun/acpkit/issues
@@ -16,6 +16,7 @@ Classifier: Programming Language :: Python :: 3.12
16
16
  Classifier: Programming Language :: Python :: 3.13
17
17
  Requires-Python: >=3.11
18
18
  Requires-Dist: click>=8.1.8
19
+ Requires-Dist: mcp>=1.27.0
19
20
  Requires-Dist: typing-extensions>=4.12.0
20
21
  Provides-Extra: all
21
22
  Requires-Dist: agent-client-protocol>=0.9.0; extra == 'all'
acpkit-0.8.0/VERSION ADDED
@@ -0,0 +1 @@
1
+ 0.8.0
@@ -74,6 +74,28 @@ This page documents the public surface re-exported by `pydantic_acp`.
74
74
 
75
75
  ::: pydantic_acp.HistoryProcessorBridge
76
76
 
77
+ ::: pydantic_acp.ThreadExecutorBridge
78
+
79
+ ::: pydantic_acp.ImageGenerationBridge
80
+
81
+ ::: pydantic_acp.SetToolMetadataBridge
82
+
83
+ ::: pydantic_acp.IncludeToolReturnSchemasBridge
84
+
85
+ ::: pydantic_acp.ToolsetBridge
86
+
87
+ ::: pydantic_acp.PrefixToolsBridge
88
+
89
+ ::: pydantic_acp.WebSearchBridge
90
+
91
+ ::: pydantic_acp.WebFetchBridge
92
+
93
+ ::: pydantic_acp.McpCapabilityBridge
94
+
95
+ ::: pydantic_acp.OpenAICompactionBridge
96
+
97
+ ::: pydantic_acp.AnthropicCompactionBridge
98
+
77
99
  ::: pydantic_acp.McpBridge
78
100
 
79
101
  ::: pydantic_acp.McpServerDefinition
@@ -90,6 +112,10 @@ This page documents the public surface re-exported by `pydantic_acp`.
90
112
 
91
113
  ::: pydantic_acp.FileSystemProjectionMap
92
114
 
115
+ ::: pydantic_acp.WebToolProjectionMap
116
+
117
+ ::: pydantic_acp.BuiltinToolProjectionMap
118
+
93
119
  ::: pydantic_acp.CompositeProjectionMap
94
120
 
95
121
  ## Projection Helpers
@@ -37,6 +37,7 @@ Use `BufferedCapabilityBridge` when the bridge also needs to emit ACP transcript
37
37
 
38
38
  | Method | Override it when | Return value |
39
39
  |---|---|---|
40
+ | `build_agent_capabilities(...)` | your bridge contributes Pydantic AI capabilities that should be attached to the active agent | `tuple[AbstractCapability, ...]` |
40
41
  | `get_session_metadata(...)` | you want a metadata section under your bridge `metadata_key` | `dict[str, JsonValue]` |
41
42
  | `get_tool_kind(...)` | you want custom ACP tool classification | `ToolKind` |
42
43
  | `get_mcp_capabilities(...)` | your bridge requires MCP transport capability flags | `McpCapabilities` |
@@ -47,11 +48,52 @@ Use `BufferedCapabilityBridge` when the bridge also needs to emit ACP transcript
47
48
 
48
49
  Practical rules:
49
50
 
51
+ - use `build_agent_capabilities(...)` when the bridge needs to materialize upstream Pydantic AI capabilities
52
+ - `AgentBridgeBuilder` is the adapter-local helper that turns those bridge contributions into agent constructor inputs
50
53
  - set `metadata_key` if you want your metadata to appear in session metadata
51
54
  - keep classification deterministic; the first bridge that returns a `ToolKind` wins
52
55
  - return `None` when your bridge is not authoritative for that surface
53
56
  - use bridge-local buffering only when you truly need ACP transcript updates, not just metadata
54
57
 
58
+ ## `AgentBridgeBuilder` Is The Capability Wiring Seam
59
+
60
+ `AdapterConfig(capability_bridges=[...])` makes the adapter aware of bridge-owned ACP surfaces such as:
61
+
62
+ - session metadata
63
+ - tool classification
64
+ - config options
65
+ - mode state
66
+ - model settings
67
+
68
+ If a bridge also contributes upstream Pydantic AI capabilities, those still need to be attached to
69
+ the active agent instance.
70
+
71
+ Use `AgentBridgeBuilder(...)` inside your factory or source:
72
+
73
+ ```python
74
+ builder = AgentBridgeBuilder(
75
+ session=session,
76
+ capability_bridges=bridges,
77
+ )
78
+ contributions = builder.build()
79
+
80
+ agent = Agent(
81
+ model,
82
+ capabilities=contributions.capabilities,
83
+ history_processors=contributions.history_processors,
84
+ )
85
+ ```
86
+
87
+ That is the intended seam for:
88
+
89
+ - `HookBridge`
90
+ - `PrepareToolsBridge`
91
+ - `ThreadExecutorBridge`
92
+ - `SetToolMetadataBridge`
93
+ - `IncludeToolReturnSchemasBridge`
94
+ - `WebSearchBridge`
95
+ - `WebFetchBridge`
96
+
55
97
  ## Compatibility Note: History Processor Types
56
98
 
57
99
  `HistoryProcessorBridge` depends on Pydantic AI history-processor callable types.
@@ -218,8 +260,172 @@ HookBridge(hide_all=True)
218
260
 
219
261
  Wraps history processors so their activity can be reflected into ACP updates.
220
262
 
263
+ ### `WebSearchBridge`
264
+
265
+ Adds Pydantic AI's `WebSearch` capability into the active agent and classifies matching tools as ACP `search`.
266
+
267
+ Use it when:
268
+
269
+ - the runtime should expose builtin or local web search through one bridge-owned capability
270
+ - ACP transcript cards should classify `web_search` or local fallback search tools as search operations
271
+ - session metadata should show search configuration such as allowed domains or context size
272
+
273
+ Default classified tool names:
274
+
275
+ - `web_search`
276
+ - `duckduckgo_search`
277
+ - `exa_search`
278
+ - `tavily_search`
279
+
280
+ UI note:
281
+
282
+ - add `WebToolProjectionMap()` or `BuiltinToolProjectionMap()` when you want ACP transcript cards to show query/domain context at start and search results at completion instead of generic tool output
283
+
284
+ ### `WebFetchBridge`
285
+
286
+ Adds Pydantic AI's `WebFetch` capability into the active agent and classifies matching tools as ACP `fetch`.
287
+
288
+ Use it when:
289
+
290
+ - the runtime should expose builtin or local URL fetching through one bridge-owned capability
291
+ - ACP transcript cards should classify `web_fetch` as a fetch operation instead of generic execute
292
+ - session metadata should show fetch guardrails such as allowed domains, citations, or token limits
293
+
221
294
  This is useful when you want message-history trimming or contextual rewriting to remain observable.
222
295
 
296
+ UI note:
297
+
298
+ - add `WebToolProjectionMap()` or `BuiltinToolProjectionMap()` when you want ACP transcript cards to show fetched URLs, page titles, text previews, and binary-fetch status
299
+
300
+ ### `ImageGenerationBridge`
301
+
302
+ Adds upstream `ImageGeneration` through the bridge-builder seam.
303
+
304
+ Use it when:
305
+
306
+ - the runtime should expose builtin image generation or a local fallback subagent through one ACP-owned seam
307
+ - session metadata should reflect image-generation policy such as quality, size, or output format
308
+ - projection maps should recognize `image_generation` or `generate_image` as intentional builtin work instead of generic tool noise
309
+
310
+ UI note:
311
+
312
+ - add `BuiltinToolProjectionMap()` when you want ACP transcript cards to show prompt, quality, size, and revised prompt summary for builtin image generation
313
+
314
+ ### `ThreadExecutorBridge`
315
+
316
+ Adds Pydantic AI's `ThreadExecutor` capability through the bridge-builder seam.
317
+
318
+ Use it when:
319
+
320
+ - your ACP service is long-lived
321
+ - sync tools or callbacks should run on a bounded executor
322
+ - you want bridge-owned agent construction to keep executor policy explicit
323
+
324
+ ### `SetToolMetadataBridge`
325
+
326
+ Adds upstream `SetToolMetadata` capability through the bridge-builder seam.
327
+
328
+ Use it when:
329
+
330
+ - tool metadata should be attached centrally instead of per-tool definition
331
+ - downstream selectors, MCP logic, or provider behavior depend on consistent metadata
332
+
333
+ ### `IncludeToolReturnSchemasBridge`
334
+
335
+ Adds upstream `IncludeToolReturnSchemas` capability through the bridge-builder seam.
336
+
337
+ Use it when:
338
+
339
+ - you want richer tool return contracts sent to models
340
+ - downstream integrations should enable return-schema support consistently across selected tools
341
+
342
+ ### `ToolsetBridge`
343
+
344
+ Adds upstream `Toolset` capability through the bridge-builder seam.
345
+
346
+ Use it when:
347
+
348
+ - a maintained `FunctionToolset` or other agent toolset should be injected through the same ACP-owned bridge path as other capabilities
349
+ - integration code wants one explicit place to wire toolset-owned instructions or wrappers
350
+
351
+ Compatibility notes:
352
+
353
+ - toolset `get_instructions()` output passes through to the upstream model request as `instruction_parts`
354
+ - ordering is explicit: `AgentBridgeBuilder.build(capabilities=...)` keeps user-supplied capabilities first, then appends bridge capabilities in configured bridge order
355
+
356
+ ### `PrefixToolsBridge`
357
+
358
+ Adds upstream `PrefixTools` capability through the bridge-builder seam.
359
+
360
+ Use it when:
361
+
362
+ - a wrapped capability's tool names need a stable namespace prefix
363
+ - downstream clients should see prefixed tool names without custom tool re-registration logic
364
+
365
+ ### `McpCapabilityBridge`
366
+
367
+ Adds upstream `MCP` capability through the bridge-builder seam.
368
+
369
+ Use it when:
370
+
371
+ - the model should use builtin MCP server support when available and local HTTP fallback otherwise
372
+ - ACP session metadata should expose the connected MCP URL, resolved server id, or allowlist shape
373
+ - projection maps should summarize `mcp_server:*` builtin tool calls
374
+
375
+ Compatibility note:
376
+
377
+ - this bridge is separate from MCP toolsets such as `MCPServerStdio` or `MCPServerStreamableHTTP`
378
+ - if those toolsets are attached directly to the agent with `include_instructions=True`, their server instructions still flow through the normal upstream toolset path into `instruction_parts`
379
+
380
+ UI note:
381
+
382
+ - add `BuiltinToolProjectionMap()` when you want ACP transcript cards to summarize builtin MCP calls such as `call_tool`, `list_tools`, and output previews instead of generic execute cards
383
+
384
+ ### `OpenAICompactionBridge`
385
+
386
+ Adds provider-owned OpenAI Responses compaction through the bridge-builder seam.
387
+
388
+ Use it when:
389
+
390
+ - long-running ACP sessions should compact history without looking stalled in the client
391
+ - the ACP transcript should show a visible `Context Compaction` card before and after OpenAI compaction runs
392
+ - session metadata should still expose the configured trigger and instructions
393
+
394
+ UI behavior:
395
+
396
+ - no extra projection map is required
397
+ - when compaction triggers, ACP emits a visible `Context Compaction` start/update pair
398
+ - OpenAI shows provider status and round-trip payload preservation instead of a blank wait
399
+ - OpenAI completion is emitted by the bridge-owned wrapper so the same card opens and closes around the compaction request
400
+
401
+ ### `AnthropicCompactionBridge`
402
+
403
+ Adds provider-owned Anthropic context-management compaction through the bridge-builder seam.
404
+
405
+ Use it when:
406
+
407
+ - Anthropic context management should be configured through the bridge seam
408
+ - Anthropic compaction summaries should be visible in ACP transcripts instead of disappearing into raw provider behavior
409
+
410
+ UI behavior:
411
+
412
+ - no extra projection map is required
413
+ - when Anthropic returns a `CompactionPart`, ACP emits a visible `Context Compaction` card
414
+ - readable Anthropic compaction summaries are shown in the completion update
415
+
416
+ ## Builtin Capability Projection
417
+
418
+ Use `BuiltinToolProjectionMap()` when the agent exposes upstream builtin capability tools and you want ACP-visible cards instead of generic execute noise.
419
+
420
+ Current builtin projection coverage:
421
+
422
+ - web search
423
+ - web fetch
424
+ - image generation
425
+ - builtin MCP server tools
426
+
427
+ Compaction visibility is built into the runtime path and does not require a projection map.
428
+
223
429
  ### `McpBridge`
224
430
 
225
431
  Adds MCP-aware metadata and tool classification:
@@ -13,7 +13,7 @@ The root `acpkit` package exposes two command families:
13
13
  ```bash
14
14
  acpkit run TARGET [-p PATH]...
15
15
  acpkit launch TARGET [-p PATH]...
16
- acpkit launch --command "python3.11 strong_agent.py"
16
+ acpkit launch --command "python3.11 finance_agent.py"
17
17
  ```
18
18
 
19
19
  `TARGET` can be:
@@ -42,21 +42,63 @@ If the resolved value is not a supported agent type, `acpkit` raises `Unsupporte
42
42
  Use `run` when the target itself should be resolved and exposed through ACP:
43
43
 
44
44
  ```bash
45
- acpkit run strong_agent
46
- acpkit run strong_agent:agent
45
+ acpkit run finance_agent
46
+ acpkit run finance_agent:agent
47
47
  acpkit run app.agents.demo:agent -p ./examples
48
48
  acpkit run external_agent -p /absolute/path/to/agents
49
49
  ```
50
50
 
51
51
  This is the most direct path from Python code to a running ACP server.
52
52
 
53
+ The expected Python module shape is:
54
+
55
+ ```python
56
+ from pydantic_ai import Agent
57
+ from pydantic_acp import run_acp
58
+
59
+ agent = Agent("openai:gpt-5", name="demo-agent")
60
+
61
+ run_acp(agent=agent)
62
+ ```
63
+
64
+ That means:
65
+
66
+ - `acpkit run my_agent_module`
67
+ - imports `my_agent_module`
68
+ - finds the last defined `pydantic_ai.Agent`
69
+ - exposes it through the matching ACP adapter
70
+ - `acpkit run my_agent_module:agent`
71
+ - imports the explicit `agent` symbol and exposes that one
72
+
73
+ If you need adapter configuration such as session persistence, plan bridges, approvals, or host
74
+ projection maps, keep that wiring inside the target module and still run the module through
75
+ `acpkit run`.
76
+
77
+ ## CLI Versus Runtime API
78
+
79
+ Use the root CLI when:
80
+
81
+ - you want target resolution from a module path
82
+ - your editor or launcher shells out to a command
83
+ - ACP transport lifecycle should be owned by the `acpkit` process
84
+
85
+ Use `run_acp(...)` when:
86
+
87
+ - you already have the Python agent object in-process
88
+ - the module itself should start the ACP server directly
89
+
90
+ Use `create_acp_agent(...)` when:
91
+
92
+ - another runtime should own transport lifecycle
93
+ - you want the ACP-compatible agent object without starting the server immediately
94
+
53
95
  ## `acpkit launch`
54
96
 
55
97
  Use `launch` when you want Toad ACP to launch the command for you:
56
98
 
57
99
  ```bash
58
- acpkit launch strong_agent
59
- acpkit launch strong_agent:agent -p ./examples
100
+ acpkit launch finance_agent
101
+ acpkit launch finance_agent:agent -p ./examples
60
102
  ```
61
103
 
62
104
  This mirrors the resolved target through:
@@ -68,13 +110,13 @@ toad acp "acpkit run TARGET [-p PATH]..."
68
110
  Raw command mode skips target resolution entirely:
69
111
 
70
112
  ```bash
71
- acpkit launch --command "python3.11 strong_agent.py"
113
+ acpkit launch --command "python3.11 finance_agent.py"
72
114
  ```
73
115
 
74
116
  That becomes:
75
117
 
76
118
  ```bash
77
- toad acp "python3.11 strong_agent.py"
119
+ toad acp "python3.11 finance_agent.py"
78
120
  ```
79
121
 
80
122
  ## Installation Hints And Failure Modes
@@ -90,6 +132,7 @@ Common failure cases:
90
132
  - the module imports but contains no detectable supported agent
91
133
  - `module:attribute` points at a non-agent object
92
134
  - the requested adapter package is not installed
135
+ - the target module starts ACP with `run_acp(...)` but imports fail before the agent is created
93
136
 
94
137
  ## Runtime API
95
138
 
@@ -0,0 +1,38 @@
1
+ # Finance Agent
2
+
3
+ The maintained finance showcase is [`examples/pydantic/finance_agent.py`](https://github.com/vcoderun/acpkit/blob/main/examples/pydantic/finance_agent.py).
4
+
5
+ It is the main example for:
6
+
7
+ - a direct module-level `Agent(...)` plus `AdapterConfig(...)` surface
8
+ - `PrepareToolsBridge` mode shaping
9
+ - structured native plan generation
10
+ - approval-gated writes with `FileSystemProjectionMap`
11
+ - file-backed ACP session persistence
12
+
13
+ ## Why This Example Exists
14
+
15
+ Older examples in this repo split these ideas across separate files. That made the codebase noisy
16
+ and kept coverage low in files that were too small to justify keeping around.
17
+
18
+ `finance_agent.py` intentionally keeps those ACP surfaces together in one realistic workflow:
19
+
20
+ - `ask` mode for read-only inspection
21
+ - `plan` mode for ACP-native structured plans
22
+ - `trade` mode for approval-gated note updates
23
+
24
+ ## Run It
25
+
26
+ ```bash
27
+ uv run python -m examples.pydantic.finance_agent
28
+ ```
29
+
30
+ By default the example uses `TestModel`. Set `ACP_FINANCE_MODEL` when you want a live model.
31
+
32
+ ## Key Patterns
33
+
34
+ - the module exports plain `agent`, `config`, and `main` symbols without factory wrappers
35
+ - `FinancePlanPersistenceProvider` writes ACP plans into `.acpkit/plans/`
36
+ - `PrepareToolsBridge` keeps `ask`, `plan`, and `trade` behaviors explicit instead of scattering them across separate examples
37
+ - `FileSystemProjectionMap` turns note reads and writes into rich ACP diffs
38
+ - `NativeApprovalBridge` keeps mutating writes truthfully approval-gated
@@ -0,0 +1,28 @@
1
+ # Examples
2
+
3
+ All maintained examples live under [`examples/pydantic/`](https://github.com/vcoderun/acpkit/tree/main/examples/pydantic).
4
+
5
+ The repo intentionally keeps the maintained set small. Each example is broad enough to be useful on
6
+ its own instead of only demonstrating one narrow helper.
7
+
8
+ ## Maintained Examples
9
+
10
+ | Example | What it demonstrates |
11
+ |---|---|
12
+ | [`finance_agent.py`](https://github.com/vcoderun/acpkit/blob/main/examples/pydantic/finance_agent.py) | session-aware finance workspace with ACP plans, approvals, mode-aware tool shaping, and projected note diffs |
13
+ | [`travel_agent.py`](https://github.com/vcoderun/acpkit/blob/main/examples/pydantic/travel_agent.py) | travel planning runtime with hook projection, approval-gated trip files, and prompt-model override behavior for media prompts |
14
+
15
+ ## Recommended Reading Order
16
+
17
+ 1. [Finance Agent](finance.md)
18
+ 2. [Travel Agent](travel.md)
19
+
20
+ ## Running The Examples
21
+
22
+ ```bash
23
+ uv run python -m examples.pydantic.finance_agent
24
+ uv run python -m examples.pydantic.travel_agent
25
+ ```
26
+
27
+ Both examples run without credentials by default. Set the example-specific environment variables
28
+ only when you want live models.
@@ -0,0 +1,27 @@
1
+ # Travel Agent
2
+
3
+ The maintained travel showcase is [`examples/pydantic/travel_agent.py`](https://github.com/vcoderun/acpkit/blob/main/examples/pydantic/travel_agent.py).
4
+
5
+ It is the main example for:
6
+
7
+ - `Hooks` capability introspection rendered through `HookProjectionMap`
8
+ - approval-gated read/write diff projection in a local workspace
9
+ - prompt-model override behavior for image and audio prompts
10
+ - a direct module-level `Agent(...)` plus `AdapterConfig(...)` surface without example-only factories
11
+
12
+ ## Run It
13
+
14
+ ```bash
15
+ uv run python -m examples.pydantic.travel_agent
16
+ ```
17
+
18
+ Without `MODEL_NAME`, the example uses `TestModel` so the demo remains credential-free. Set
19
+ `MODEL_NAME` and optionally `ACP_TRAVEL_MEDIA_MODEL` when you want live-model behavior.
20
+
21
+ ## Key Patterns
22
+
23
+ - the module exports plain `agent`, `config`, and `main` symbols without factory wrappers
24
+ - `HookProjectionMap` relabels and hides selected hook lifecycle events
25
+ - `TravelPromptModelProvider` shows how a host can supply an explicit media-model override
26
+ - generated trip files keep the example self-contained instead of relying on tracked demo fixtures
27
+ - `FileSystemProjectionMap` turns travel file reads and writes into ACP-visible diffs
@@ -200,4 +200,4 @@ acpkit run my_agent_module:agent -p ./examples
200
200
  - Want every `AdapterConfig` knob? Read [AdapterConfig](../pydantic-acp/adapter-config.md).
201
201
  - Want host-owned session state? Read [Providers](../providers.md).
202
202
  - Want ACP-visible capabilities? Read [Bridges](../bridges.md).
203
- - Want a full coding-agent setup? Read [Workspace Agent](../examples/workspace-agent.md).
203
+ - Want maintained end-to-end examples? Read [Finance Agent](../examples/finance.md) and [Travel Agent](../examples/travel.md).