pcode 0.1.9__tar.gz → 0.1.10__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 (180) hide show
  1. {pcode-0.1.9 → pcode-0.1.10}/PKG-INFO +8 -5
  2. {pcode-0.1.9 → pcode-0.1.10}/pyproject.toml +14 -5
  3. {pcode-0.1.9 → pcode-0.1.10}/src/pcode/agent.py +13 -0
  4. {pcode-0.1.9 → pcode-0.1.10}/src/pcode/app.py +195 -68
  5. {pcode-0.1.9 → pcode-0.1.10}/src/pcode/aside.py +8 -5
  6. {pcode-0.1.9 → pcode-0.1.10}/src/pcode/aside_guard.py +7 -3
  7. pcode-0.1.10/src/pcode/auth.py +34 -0
  8. {pcode-0.1.9 → pcode-0.1.10}/src/pcode/background_delegation.py +136 -35
  9. {pcode-0.1.9 → pcode-0.1.10}/src/pcode/browser.py +74 -2
  10. {pcode-0.1.9 → pcode-0.1.10}/src/pcode/btw_view.py +9 -0
  11. {pcode-0.1.9 → pcode-0.1.10}/src/pcode/claude_sdk/model.py +34 -0
  12. {pcode-0.1.9 → pcode-0.1.10}/src/pcode/claude_sdk/session.py +4 -0
  13. {pcode-0.1.9 → pcode-0.1.10}/src/pcode/commands.py +21 -2
  14. {pcode-0.1.9 → pcode-0.1.10}/src/pcode/compaction.py +41 -23
  15. {pcode-0.1.9 → pcode-0.1.10}/src/pcode/controller.py +146 -42
  16. {pcode-0.1.9 → pcode-0.1.10}/src/pcode/conversation_tree.py +11 -2
  17. {pcode-0.1.9 → pcode-0.1.10}/src/pcode/copy_ui.py +31 -2
  18. {pcode-0.1.9 → pcode-0.1.10}/src/pcode/delegation.py +34 -3
  19. pcode-0.1.10/src/pcode/drafts.py +202 -0
  20. {pcode-0.1.9 → pcode-0.1.10}/src/pcode/edit_preview.py +2 -2
  21. {pcode-0.1.9 → pcode-0.1.10}/src/pcode/ext.py +5 -0
  22. {pcode-0.1.9 → pcode-0.1.10}/src/pcode/extensions/browser.py +8 -1
  23. pcode-0.1.10/src/pcode/extensions/manager.py +406 -0
  24. {pcode-0.1.9 → pcode-0.1.10}/src/pcode/extensions/session_history.py +23 -40
  25. pcode-0.1.10/src/pcode/extensions/workflows.py +189 -0
  26. {pcode-0.1.9 → pcode-0.1.10}/src/pcode/file_refs.py +1 -1
  27. {pcode-0.1.9 → pcode-0.1.10}/src/pcode/filesystem.py +42 -54
  28. {pcode-0.1.9 → pcode-0.1.10}/src/pcode/host.py +8 -7
  29. {pcode-0.1.9 → pcode-0.1.10}/src/pcode/host_protocol.py +6 -2
  30. {pcode-0.1.9 → pcode-0.1.10}/src/pcode/host_ui.py +44 -12
  31. {pcode-0.1.9 → pcode-0.1.10}/src/pcode/isolated_delegation.py +218 -50
  32. pcode-0.1.10/src/pcode/library_log.py +57 -0
  33. {pcode-0.1.9 → pcode-0.1.10}/src/pcode/live.py +74 -12
  34. {pcode-0.1.9 → pcode-0.1.10}/src/pcode/logins.py +21 -9
  35. {pcode-0.1.9 → pcode-0.1.10}/src/pcode/mcp_oauth.py +83 -1
  36. {pcode-0.1.9 → pcode-0.1.10}/src/pcode/models.py +5 -0
  37. {pcode-0.1.9 → pcode-0.1.10}/src/pcode/native_results.py +59 -0
  38. {pcode-0.1.9 → pcode-0.1.10}/src/pcode/planning.py +59 -23
  39. {pcode-0.1.9 → pcode-0.1.10}/src/pcode/popup_ui.py +49 -1
  40. {pcode-0.1.9 → pcode-0.1.10}/src/pcode/preferences.py +17 -3
  41. {pcode-0.1.9 → pcode-0.1.10}/src/pcode/prompt_images.py +1 -1
  42. {pcode-0.1.9 → pcode-0.1.10}/src/pcode/prompt_keys.py +12 -6
  43. {pcode-0.1.9 → pcode-0.1.10}/src/pcode/remote_print.py +2 -2
  44. {pcode-0.1.9 → pcode-0.1.10}/src/pcode/repo_context.py +7 -2
  45. {pcode-0.1.9 → pcode-0.1.10}/src/pcode/runtime.py +20 -0
  46. {pcode-0.1.9 → pcode-0.1.10}/src/pcode/session_ui.py +4 -38
  47. {pcode-0.1.9 → pcode-0.1.10}/src/pcode/sessions.py +158 -141
  48. {pcode-0.1.9 → pcode-0.1.10}/src/pcode/shell_tools.py +10 -3
  49. {pcode-0.1.9 → pcode-0.1.10}/src/pcode/steering.py +17 -4
  50. {pcode-0.1.9 → pcode-0.1.10}/src/pcode/stream_display.py +12 -3
  51. {pcode-0.1.9 → pcode-0.1.10}/src/pcode/stream_events.py +19 -2
  52. {pcode-0.1.9 → pcode-0.1.10}/src/pcode/tool_display.py +15 -1
  53. {pcode-0.1.9 → pcode-0.1.10}/src/pcode/tree_ui.py +23 -9
  54. {pcode-0.1.9 → pcode-0.1.10}/src/pcode/ui.py +20 -6
  55. pcode-0.1.10/src/pcode/worker_channel.py +433 -0
  56. {pcode-0.1.9 → pcode-0.1.10}/src/pcode/worker_ui.py +138 -18
  57. {pcode-0.1.9 → pcode-0.1.10}/src/pcode/workers.py +91 -3
  58. {pcode-0.1.9 → pcode-0.1.10}/src/pcode/worktree.py +1 -1
  59. pcode-0.1.9/src/pcode/auth.py +0 -17
  60. {pcode-0.1.9 → pcode-0.1.10}/.gitignore +0 -0
  61. {pcode-0.1.9 → pcode-0.1.10}/LICENSE +0 -0
  62. {pcode-0.1.9 → pcode-0.1.10}/README.md +0 -0
  63. {pcode-0.1.9 → pcode-0.1.10}/src/pcode/__init__.py +0 -0
  64. {pcode-0.1.9 → pcode-0.1.10}/src/pcode/_job_supervisor.py +0 -0
  65. {pcode-0.1.9 → pcode-0.1.10}/src/pcode/appearance.py +0 -0
  66. {pcode-0.1.9 → pcode-0.1.10}/src/pcode/aside_ui.py +0 -0
  67. {pcode-0.1.9 → pcode-0.1.10}/src/pcode/block.py +0 -0
  68. {pcode-0.1.9 → pcode-0.1.10}/src/pcode/cache_diagnostics.py +0 -0
  69. {pcode-0.1.9 → pcode-0.1.10}/src/pcode/cache_settings.py +0 -0
  70. {pcode-0.1.9 → pcode-0.1.10}/src/pcode/cache_warnings.py +0 -0
  71. {pcode-0.1.9 → pcode-0.1.10}/src/pcode/claude_sdk/__init__.py +0 -0
  72. {pcode-0.1.9 → pcode-0.1.10}/src/pcode/claude_sdk/cli.py +0 -0
  73. {pcode-0.1.9 → pcode-0.1.10}/src/pcode/claude_sdk/errors.py +0 -0
  74. {pcode-0.1.9 → pcode-0.1.10}/src/pcode/claude_sdk/login.py +0 -0
  75. {pcode-0.1.9 → pcode-0.1.10}/src/pcode/claude_sdk/messages.py +0 -0
  76. {pcode-0.1.9 → pcode-0.1.10}/src/pcode/claude_sdk/resume.py +0 -0
  77. {pcode-0.1.9 → pcode-0.1.10}/src/pcode/claude_sdk/session_pool.py +0 -0
  78. {pcode-0.1.9 → pcode-0.1.10}/src/pcode/claude_sdk/web.py +0 -0
  79. {pcode-0.1.9 → pcode-0.1.10}/src/pcode/claude_sdk/workspace.py +0 -0
  80. {pcode-0.1.9 → pcode-0.1.10}/src/pcode/cli.py +0 -0
  81. {pcode-0.1.9 → pcode-0.1.10}/src/pcode/clipboard.py +0 -0
  82. {pcode-0.1.9 → pcode-0.1.10}/src/pcode/code_mode.py +0 -0
  83. {pcode-0.1.9 → pcode-0.1.10}/src/pcode/codex_login.py +0 -0
  84. {pcode-0.1.9 → pcode-0.1.10}/src/pcode/command_transcript.py +0 -0
  85. {pcode-0.1.9 → pcode-0.1.10}/src/pcode/completion.py +0 -0
  86. {pcode-0.1.9 → pcode-0.1.10}/src/pcode/config.py +0 -0
  87. {pcode-0.1.9 → pcode-0.1.10}/src/pcode/config_ui.py +0 -0
  88. {pcode-0.1.9 → pcode-0.1.10}/src/pcode/context_breakdown.py +0 -0
  89. {pcode-0.1.9 → pcode-0.1.10}/src/pcode/context_usage.py +0 -0
  90. {pcode-0.1.9 → pcode-0.1.10}/src/pcode/conversation_ids.py +0 -0
  91. {pcode-0.1.9 → pcode-0.1.10}/src/pcode/delta.py +0 -0
  92. {pcode-0.1.9 → pcode-0.1.10}/src/pcode/diagnostics.py +0 -0
  93. {pcode-0.1.9 → pcode-0.1.10}/src/pcode/edit_transcript.py +0 -0
  94. {pcode-0.1.9 → pcode-0.1.10}/src/pcode/edit_ui.py +0 -0
  95. {pcode-0.1.9 → pcode-0.1.10}/src/pcode/edits.py +0 -0
  96. {pcode-0.1.9 → pcode-0.1.10}/src/pcode/email_remote/__init__.py +0 -0
  97. {pcode-0.1.9 → pcode-0.1.10}/src/pcode/email_remote/cli.py +0 -0
  98. {pcode-0.1.9 → pcode-0.1.10}/src/pcode/email_remote/listener.py +0 -0
  99. {pcode-0.1.9 → pcode-0.1.10}/src/pcode/email_remote/mailbox.py +0 -0
  100. {pcode-0.1.9 → pcode-0.1.10}/src/pcode/email_remote/outbound.py +0 -0
  101. {pcode-0.1.9 → pcode-0.1.10}/src/pcode/email_remote/parsing.py +0 -0
  102. {pcode-0.1.9 → pcode-0.1.10}/src/pcode/email_remote/render.py +0 -0
  103. {pcode-0.1.9 → pcode-0.1.10}/src/pcode/email_remote/state.py +0 -0
  104. {pcode-0.1.9 → pcode-0.1.10}/src/pcode/error_report.py +0 -0
  105. {pcode-0.1.9 → pcode-0.1.10}/src/pcode/extension_guide.md +0 -0
  106. {pcode-0.1.9 → pcode-0.1.10}/src/pcode/extensions/plan_mode.py +0 -0
  107. {pcode-0.1.9 → pcode-0.1.10}/src/pcode/extensions/ponytail.py +0 -0
  108. {pcode-0.1.9 → pcode-0.1.10}/src/pcode/extensions/reflect.py +0 -0
  109. {pcode-0.1.9 → pcode-0.1.10}/src/pcode/extensions/sandbox.py +0 -0
  110. {pcode-0.1.9 → pcode-0.1.10}/src/pcode/extensions/web_research.py +0 -0
  111. {pcode-0.1.9 → pcode-0.1.10}/src/pcode/frame.py +0 -0
  112. {pcode-0.1.9 → pcode-0.1.10}/src/pcode/gateway.py +0 -0
  113. {pcode-0.1.9 → pcode-0.1.10}/src/pcode/git_diff.py +0 -0
  114. {pcode-0.1.9 → pcode-0.1.10}/src/pcode/glyphs.py +0 -0
  115. {pcode-0.1.9 → pcode-0.1.10}/src/pcode/history.py +0 -0
  116. {pcode-0.1.9 → pcode-0.1.10}/src/pcode/history_embeddings.py +0 -0
  117. {pcode-0.1.9 → pcode-0.1.10}/src/pcode/history_index.py +0 -0
  118. {pcode-0.1.9 → pcode-0.1.10}/src/pcode/images.py +0 -0
  119. {pcode-0.1.9 → pcode-0.1.10}/src/pcode/input_keys.py +0 -0
  120. {pcode-0.1.9 → pcode-0.1.10}/src/pcode/inspection.py +0 -0
  121. {pcode-0.1.9 → pcode-0.1.10}/src/pcode/inspector_ui.py +0 -0
  122. {pcode-0.1.9 → pcode-0.1.10}/src/pcode/job_notices.py +0 -0
  123. {pcode-0.1.9 → pcode-0.1.10}/src/pcode/jobs.py +0 -0
  124. {pcode-0.1.9 → pcode-0.1.10}/src/pcode/jobs_ui.py +0 -0
  125. {pcode-0.1.9 → pcode-0.1.10}/src/pcode/keyboard_protocol.py +0 -0
  126. {pcode-0.1.9 → pcode-0.1.10}/src/pcode/keymap.py +0 -0
  127. {pcode-0.1.9 → pcode-0.1.10}/src/pcode/layout_speed.py +0 -0
  128. {pcode-0.1.9 → pcode-0.1.10}/src/pcode/links.py +0 -0
  129. {pcode-0.1.9 → pcode-0.1.10}/src/pcode/links_ui.py +0 -0
  130. {pcode-0.1.9 → pcode-0.1.10}/src/pcode/llm_proxy.py +0 -0
  131. {pcode-0.1.9 → pcode-0.1.10}/src/pcode/mcp.py +0 -0
  132. {pcode-0.1.9 → pcode-0.1.10}/src/pcode/mcp_notice.py +0 -0
  133. {pcode-0.1.9 → pcode-0.1.10}/src/pcode/model_metadata.py +0 -0
  134. {pcode-0.1.9 → pcode-0.1.10}/src/pcode/model_ui.py +0 -0
  135. {pcode-0.1.9 → pcode-0.1.10}/src/pcode/obsidian_plans.py +0 -0
  136. {pcode-0.1.9 → pcode-0.1.10}/src/pcode/output_limits.py +0 -0
  137. {pcode-0.1.9 → pcode-0.1.10}/src/pcode/path_completion.py +0 -0
  138. {pcode-0.1.9 → pcode-0.1.10}/src/pcode/plan_preview.py +0 -0
  139. {pcode-0.1.9 → pcode-0.1.10}/src/pcode/plan_sizes.py +0 -0
  140. {pcode-0.1.9 → pcode-0.1.10}/src/pcode/prefix_keys.py +0 -0
  141. {pcode-0.1.9 → pcode-0.1.10}/src/pcode/proctitle.py +0 -0
  142. {pcode-0.1.9 → pcode-0.1.10}/src/pcode/profile_benchmark.py +0 -0
  143. {pcode-0.1.9 → pcode-0.1.10}/src/pcode/profiling.py +0 -0
  144. {pcode-0.1.9 → pcode-0.1.10}/src/pcode/project_trust.py +0 -0
  145. {pcode-0.1.9 → pcode-0.1.10}/src/pcode/reminders.py +0 -0
  146. {pcode-0.1.9 → pcode-0.1.10}/src/pcode/remote.py +0 -0
  147. {pcode-0.1.9 → pcode-0.1.10}/src/pcode/remote_profile.py +0 -0
  148. {pcode-0.1.9 → pcode-0.1.10}/src/pcode/replay_benchmark.py +0 -0
  149. {pcode-0.1.9 → pcode-0.1.10}/src/pcode/retries.py +0 -0
  150. {pcode-0.1.9 → pcode-0.1.10}/src/pcode/rpc.py +0 -0
  151. {pcode-0.1.9 → pcode-0.1.10}/src/pcode/sandbox.py +0 -0
  152. {pcode-0.1.9 → pcode-0.1.10}/src/pcode/session_naming.py +0 -0
  153. {pcode-0.1.9 → pcode-0.1.10}/src/pcode/shell.py +0 -0
  154. {pcode-0.1.9 → pcode-0.1.10}/src/pcode/shell_mode.py +0 -0
  155. {pcode-0.1.9 → pcode-0.1.10}/src/pcode/skills.py +0 -0
  156. {pcode-0.1.9 → pcode-0.1.10}/src/pcode/stall_log.py +0 -0
  157. {pcode-0.1.9 → pcode-0.1.10}/src/pcode/startup_input.py +0 -0
  158. {pcode-0.1.9 → pcode-0.1.10}/src/pcode/strict_tools.py +0 -0
  159. {pcode-0.1.9 → pcode-0.1.10}/src/pcode/syntax.py +0 -0
  160. {pcode-0.1.9 → pcode-0.1.10}/src/pcode/syntax_colors.py +0 -0
  161. {pcode-0.1.9 → pcode-0.1.10}/src/pcode/task_prompt.py +0 -0
  162. {pcode-0.1.9 → pcode-0.1.10}/src/pcode/task_worktrees.py +0 -0
  163. {pcode-0.1.9 → pcode-0.1.10}/src/pcode/terminal_color.py +0 -0
  164. {pcode-0.1.9 → pcode-0.1.10}/src/pcode/terminal_notify.py +0 -0
  165. {pcode-0.1.9 → pcode-0.1.10}/src/pcode/terminal_text.py +0 -0
  166. {pcode-0.1.9 → pcode-0.1.10}/src/pcode/text_selection.py +0 -0
  167. {pcode-0.1.9 → pcode-0.1.10}/src/pcode/theme.py +0 -0
  168. {pcode-0.1.9 → pcode-0.1.10}/src/pcode/theme_gallery.py +0 -0
  169. {pcode-0.1.9 → pcode-0.1.10}/src/pcode/thinking_markdown.py +0 -0
  170. {pcode-0.1.9 → pcode-0.1.10}/src/pcode/token_accounting.py +0 -0
  171. {pcode-0.1.9 → pcode-0.1.10}/src/pcode/tool_output_limits.py +0 -0
  172. {pcode-0.1.9 → pcode-0.1.10}/src/pcode/tool_panel.py +0 -0
  173. {pcode-0.1.9 → pcode-0.1.10}/src/pcode/transcript_log.py +0 -0
  174. {pcode-0.1.9 → pcode-0.1.10}/src/pcode/transcript_notice.py +0 -0
  175. {pcode-0.1.9 → pcode-0.1.10}/src/pcode/turn.py +0 -0
  176. {pcode-0.1.9 → pcode-0.1.10}/src/pcode/update_check.py +0 -0
  177. {pcode-0.1.9 → pcode-0.1.10}/src/pcode/usage.py +0 -0
  178. {pcode-0.1.9 → pcode-0.1.10}/src/pcode/word_wrap.py +0 -0
  179. {pcode-0.1.9 → pcode-0.1.10}/src/pcode/workspace.py +0 -0
  180. {pcode-0.1.9 → pcode-0.1.10}/src/pcode/workspace_filesystem.py +0 -0
@@ -1,6 +1,6 @@
1
1
  Metadata-Version: 2.5
2
2
  Name: pcode
3
- Version: 0.1.9
3
+ Version: 0.1.10
4
4
  Summary: Terminal-native AI coding agent with background jobs, parallel worktrees, forkable sessions, and multi-model support
5
5
  Project-URL: Homepage, https://github.com/cruxwell/pcode
6
6
  Project-URL: Documentation, https://cruxwell.github.io/pcode/
@@ -20,18 +20,21 @@ Classifier: Programming Language :: Python :: 3.14
20
20
  Classifier: Programming Language :: Python :: 3.15
21
21
  Classifier: Topic :: Software Development
22
22
  Requires-Python: >=3.14
23
+ Requires-Dist: anthropic<3,>=2.7.0
23
24
  Requires-Dist: filelock<5,>=4
24
- Requires-Dist: genai-prices<0.2,>=0.1.7
25
+ Requires-Dist: genai-prices<0.3,>=0.2.2
26
+ Requires-Dist: google-genai<3,>=2.34.0
25
27
  Requires-Dist: httpx2<3,>=2.13.1
28
+ Requires-Dist: openai<4,>=3.48.0
26
29
  Requires-Dist: prompt-toolkit==3.0.53
27
30
  Requires-Dist: psutil<8,>=6
28
- Requires-Dist: pydantic-ai-harness[codemode,coder,exa,playwright]<0.57,>=0.56.0
29
- Requires-Dist: pydantic-ai-slim[anthropic,bedrock,duckduckgo,google,groq,mcp,openai,web-fetch,xai]<3,>=2.56.0
31
+ Requires-Dist: pydantic-ai-harness[codemode,coder,exa,playwright]<0.67,>=0.66.0
32
+ Requires-Dist: pydantic-ai-slim[anthropic,bedrock,duckduckgo,google,groq,mcp,openai,web-fetch,xai]<3,>=2.66.0
30
33
  Requires-Dist: rich<16,>=15
31
34
  Requires-Dist: websockets<17,>=15.0.1
32
35
  Requires-Dist: yappi<2,>=1.7.6
33
36
  Provides-Extra: claude
34
- Requires-Dist: claude-agent-sdk<0.3,>=0.2.167; extra == 'claude'
37
+ Requires-Dist: claude-agent-sdk<0.3,>=0.2.180; extra == 'claude'
35
38
  Description-Content-Type: text/markdown
36
39
 
37
40
  <img width="1392" height="1522" alt="pcode in a dark terminal" src="docs/assets/screenshots/tabs-dark.png" />
@@ -21,7 +21,8 @@ classifiers = [
21
21
  requires-python = ">=3.14"
22
22
  dependencies = [
23
23
  "filelock>=4,<5",
24
- "genai-prices>=0.1.7,<0.2",
24
+ # 0.2.2 is the first to price claude-fable-5-2.
25
+ "genai-prices>=0.2.2,<0.3",
25
26
  "httpx2>=2.13.1,<3",
26
27
  # Exact: pcode relies on prompt_toolkit internals, and point releases
27
28
  # change them. Bump on purpose after tests/test_prompt_toolkit_internals.py
@@ -33,14 +34,21 @@ dependencies = [
33
34
  # itself is downloaded on first use, not at install.
34
35
  # Harness ships from the pydantic-ai repo with every Pydantic AI release and
35
36
  # pins pydantic-ai-slim to the same minor; bump both together.
36
- "pydantic-ai-harness[exa,coder,codemode,playwright]>=0.56.0,<0.57",
37
+ "pydantic-ai-harness[exa,coder,codemode,playwright]>=0.66.0,<0.67",
37
38
  # duckduckgo and web-fetch back the bundled web_research extension when no
38
39
  # provider-native search or Exa key is available.
39
40
  # google covers both google and google-cloud providers; bedrock pulls boto3.
40
- "pydantic-ai-slim[anthropic,bedrock,duckduckgo,google,groq,mcp,openai,web-fetch,xai]>=2.56.0,<3",
41
+ "pydantic-ai-slim[anthropic,bedrock,duckduckgo,google,groq,mcp,openai,web-fetch,xai]>=2.66.0,<3",
42
+ # Floors for provider SDKs pydantic-ai-slim leaves loose. anthropic 2.7 is
43
+ # the first to list claude-fable-5-2. Pydantic AI's main branch caps
44
+ # google-genai below 3; follow it until a release says 3.x works.
45
+ "anthropic>=2.7.0,<3",
46
+ "openai>=3.48.0,<4",
47
+ "google-genai>=2.34.0,<3",
41
48
  "rich>=15,<16",
42
49
  # FastMCP 4.x OAuth callback server selects Uvicorn's websockets-sansio protocol.
43
- # Capped below 17 by google-genai (still <17 as of 2.29), not by pcode.
50
+ # The <17 cap came from google-genai, which allows <18 since 2.34; raise it
51
+ # once the OAuth callback flow is checked on websockets 17.
44
52
  "websockets>=15.0.1,<17",
45
53
  ]
46
54
 
@@ -49,7 +57,8 @@ dependencies = [
49
57
  # (about 95 MB to download, 215 MB installed); the sdist would run whatever
50
58
  # `claude` is on PATH instead of the CLI version pcode was verified against.
51
59
  claude = [
52
- "claude-agent-sdk>=0.2.167,<0.3",
60
+ # 0.2.180 bundles Claude Code 2.1.321, the first to serve claude-fable-5-2.
61
+ "claude-agent-sdk>=0.2.180,<0.3",
53
62
  ]
54
63
 
55
64
  [project.urls]
@@ -52,6 +52,7 @@ from pcode.repo_context import create_repo_context
52
52
  from pcode.shell_tools import JobShell
53
53
  from pcode.strict_tools import create_strict_tools
54
54
  from pcode.tool_output_limits import create_tool_output_limits
55
+ from pcode.worker_channel import ChildChannel
55
56
  from pcode.workspace import WorkspaceGuard
56
57
 
57
58
  if TYPE_CHECKING:
@@ -342,6 +343,8 @@ def _delegation(
342
343
  replace(output_limits),
343
344
  # A remote host's turn budget counts its sub-agents' work too.
344
345
  *turn_limits(),
346
+ # ask_parent, parent messages and the report format, for every delegate.
347
+ ChildChannel(),
345
348
  ],
346
349
  )
347
350
 
@@ -492,6 +495,16 @@ def resolve_model(model: str) -> Model | str:
492
495
  return anthropic_model(model, key) if key else model
493
496
 
494
497
 
498
+ def is_unknown_model(error: BaseException) -> bool:
499
+ """Whether Pydantic AI refused a model name it has no provider for.
500
+
501
+ Its message names only the model, so it is safe to show as is.
502
+ """
503
+ from pydantic_ai.exceptions import UserError
504
+
505
+ return isinstance(error, UserError) and str(error).startswith("Unknown model:")
506
+
507
+
495
508
  @dataclass(frozen=True)
496
509
  class SideModel:
497
510
  """A model a single run uses instead of the agent's, with its own settings."""