pcode 0.1.8__tar.gz → 0.1.9__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 (190) hide show
  1. {pcode-0.1.8 → pcode-0.1.9}/PKG-INFO +5 -2
  2. {pcode-0.1.8 → pcode-0.1.9}/README.md +4 -1
  3. {pcode-0.1.8 → pcode-0.1.9}/src/pcode/agent.py +10 -29
  4. {pcode-0.1.8 → pcode-0.1.9}/src/pcode/app.py +427 -87
  5. {pcode-0.1.8 → pcode-0.1.9}/src/pcode/aside.py +38 -4
  6. {pcode-0.1.8 → pcode-0.1.9}/src/pcode/aside_ui.py +154 -64
  7. pcode-0.1.9/src/pcode/auth.py +17 -0
  8. {pcode-0.1.8 → pcode-0.1.9}/src/pcode/background_delegation.py +1 -1
  9. {pcode-0.1.8 → pcode-0.1.9}/src/pcode/browser.py +324 -3
  10. pcode-0.1.9/src/pcode/btw_view.py +211 -0
  11. {pcode-0.1.8 → pcode-0.1.9}/src/pcode/cache_settings.py +1 -2
  12. {pcode-0.1.8 → pcode-0.1.9}/src/pcode/cache_warnings.py +2 -2
  13. {pcode-0.1.8 → pcode-0.1.9}/src/pcode/claude_sdk/__init__.py +2 -3
  14. pcode-0.1.9/src/pcode/claude_sdk/login.py +114 -0
  15. {pcode-0.1.8 → pcode-0.1.9}/src/pcode/claude_sdk/model.py +1 -2
  16. {pcode-0.1.8 → pcode-0.1.9}/src/pcode/clipboard.py +48 -1
  17. {pcode-0.1.8 → pcode-0.1.9}/src/pcode/config.py +10 -12
  18. {pcode-0.1.8 → pcode-0.1.9}/src/pcode/controller.py +367 -153
  19. {pcode-0.1.8 → pcode-0.1.9}/src/pcode/conversation_ids.py +6 -5
  20. {pcode-0.1.8 → pcode-0.1.9}/src/pcode/conversation_tree.py +39 -5
  21. {pcode-0.1.8 → pcode-0.1.9}/src/pcode/copy_ui.py +5 -167
  22. {pcode-0.1.8 → pcode-0.1.9}/src/pcode/extensions/browser.py +104 -5
  23. {pcode-0.1.8 → pcode-0.1.9}/src/pcode/extensions/plan_mode.py +52 -77
  24. pcode-0.1.9/src/pcode/extensions/reflect.py +364 -0
  25. {pcode-0.1.8 → pcode-0.1.9}/src/pcode/extensions/sandbox.py +12 -5
  26. pcode-0.1.9/src/pcode/extensions/session_history.py +179 -0
  27. {pcode-0.1.8 → pcode-0.1.9}/src/pcode/file_refs.py +2 -1
  28. pcode-0.1.9/src/pcode/filesystem.py +289 -0
  29. pcode-0.1.9/src/pcode/glyphs.py +202 -0
  30. pcode-0.1.9/src/pcode/history.py +705 -0
  31. pcode-0.1.9/src/pcode/history_index.py +331 -0
  32. {pcode-0.1.8 → pcode-0.1.9}/src/pcode/host.py +37 -7
  33. pcode-0.1.9/src/pcode/images.py +257 -0
  34. {pcode-0.1.8 → pcode-0.1.9}/src/pcode/inspection.py +18 -6
  35. {pcode-0.1.8 → pcode-0.1.9}/src/pcode/keymap.py +9 -3
  36. {pcode-0.1.8 → pcode-0.1.9}/src/pcode/live.py +233 -45
  37. {pcode-0.1.8 → pcode-0.1.9}/src/pcode/logins.py +7 -109
  38. {pcode-0.1.8 → pcode-0.1.9}/src/pcode/mcp_notice.py +1 -1
  39. {pcode-0.1.8 → pcode-0.1.9}/src/pcode/mcp_oauth.py +1 -1
  40. {pcode-0.1.8 → pcode-0.1.9}/src/pcode/model_metadata.py +51 -38
  41. {pcode-0.1.8 → pcode-0.1.9}/src/pcode/models.py +4 -32
  42. {pcode-0.1.8 → pcode-0.1.9}/src/pcode/native_results.py +3 -3
  43. pcode-0.1.9/src/pcode/obsidian_plans.py +213 -0
  44. {pcode-0.1.8 → pcode-0.1.9}/src/pcode/output_limits.py +1 -1
  45. {pcode-0.1.8 → pcode-0.1.9}/src/pcode/popup_ui.py +4 -3
  46. {pcode-0.1.8 → pcode-0.1.9}/src/pcode/preferences.py +77 -44
  47. pcode-0.1.9/src/pcode/prompt_images.py +179 -0
  48. {pcode-0.1.8 → pcode-0.1.9}/src/pcode/prompt_keys.py +156 -14
  49. {pcode-0.1.8 → pcode-0.1.9}/src/pcode/remote.py +9 -9
  50. {pcode-0.1.8 → pcode-0.1.9}/src/pcode/remote_profile.py +0 -5
  51. {pcode-0.1.8 → pcode-0.1.9}/src/pcode/replay_benchmark.py +13 -0
  52. {pcode-0.1.8 → pcode-0.1.9}/src/pcode/retries.py +5 -1
  53. {pcode-0.1.8 → pcode-0.1.9}/src/pcode/session_naming.py +18 -3
  54. {pcode-0.1.8 → pcode-0.1.9}/src/pcode/session_ui.py +63 -3
  55. {pcode-0.1.8 → pcode-0.1.9}/src/pcode/sessions.py +46 -30
  56. {pcode-0.1.8 → pcode-0.1.9}/src/pcode/startup_input.py +40 -7
  57. {pcode-0.1.8 → pcode-0.1.9}/src/pcode/steering.py +25 -6
  58. pcode-0.1.9/src/pcode/terminal_color.py +122 -0
  59. {pcode-0.1.8 → pcode-0.1.9}/src/pcode/theme.py +67 -13
  60. {pcode-0.1.8 → pcode-0.1.9}/src/pcode/tool_display.py +34 -3
  61. {pcode-0.1.8 → pcode-0.1.9}/src/pcode/tool_output_limits.py +36 -5
  62. {pcode-0.1.8 → pcode-0.1.9}/src/pcode/tree_ui.py +44 -15
  63. {pcode-0.1.8 → pcode-0.1.9}/src/pcode/turn.py +3 -0
  64. {pcode-0.1.8 → pcode-0.1.9}/src/pcode/ui.py +694 -198
  65. pcode-0.1.9/src/pcode/usage.py +213 -0
  66. {pcode-0.1.8 → pcode-0.1.9}/src/pcode/word_wrap.py +76 -4
  67. {pcode-0.1.8 → pcode-0.1.9}/src/pcode/workspace_filesystem.py +2 -0
  68. {pcode-0.1.8 → pcode-0.1.9}/src/pcode/worktree.py +43 -4
  69. pcode-0.1.8/src/pcode/anthropic_oauth.py +0 -469
  70. pcode-0.1.8/src/pcode/auth.py +0 -113
  71. pcode-0.1.8/src/pcode/extensions/basic_memory/Brief format.md +0 -91
  72. pcode-0.1.8/src/pcode/extensions/basic_memory/Briefs.base +0 -50
  73. pcode-0.1.8/src/pcode/extensions/basic_memory/Home.md +0 -11
  74. pcode-0.1.8/src/pcode/extensions/basic_memory/__init__.py +0 -731
  75. pcode-0.1.8/src/pcode/extensions/basic_memory/memory-states.css +0 -58
  76. pcode-0.1.8/src/pcode/extensions/session_history.py +0 -170
  77. pcode-0.1.8/src/pcode/filesystem.py +0 -131
  78. pcode-0.1.8/src/pcode/history.py +0 -589
  79. pcode-0.1.8/src/pcode/history_cursor.py +0 -147
  80. pcode-0.1.8/src/pcode/meridian.py +0 -233
  81. pcode-0.1.8/src/pcode/meridian_process.py +0 -337
  82. pcode-0.1.8/src/pcode/meridian_setup.py +0 -356
  83. pcode-0.1.8/src/pcode/oauth_pages.py +0 -66
  84. pcode-0.1.8/src/pcode/usage.py +0 -293
  85. {pcode-0.1.8 → pcode-0.1.9}/.gitignore +0 -0
  86. {pcode-0.1.8 → pcode-0.1.9}/LICENSE +0 -0
  87. {pcode-0.1.8 → pcode-0.1.9}/pyproject.toml +0 -0
  88. {pcode-0.1.8 → pcode-0.1.9}/src/pcode/__init__.py +0 -0
  89. {pcode-0.1.8 → pcode-0.1.9}/src/pcode/_job_supervisor.py +0 -0
  90. {pcode-0.1.8 → pcode-0.1.9}/src/pcode/appearance.py +0 -0
  91. {pcode-0.1.8 → pcode-0.1.9}/src/pcode/aside_guard.py +0 -0
  92. {pcode-0.1.8 → pcode-0.1.9}/src/pcode/block.py +0 -0
  93. {pcode-0.1.8 → pcode-0.1.9}/src/pcode/cache_diagnostics.py +0 -0
  94. {pcode-0.1.8 → pcode-0.1.9}/src/pcode/claude_sdk/cli.py +0 -0
  95. {pcode-0.1.8 → pcode-0.1.9}/src/pcode/claude_sdk/errors.py +0 -0
  96. {pcode-0.1.8 → pcode-0.1.9}/src/pcode/claude_sdk/messages.py +0 -0
  97. {pcode-0.1.8 → pcode-0.1.9}/src/pcode/claude_sdk/resume.py +0 -0
  98. {pcode-0.1.8 → pcode-0.1.9}/src/pcode/claude_sdk/session.py +0 -0
  99. {pcode-0.1.8 → pcode-0.1.9}/src/pcode/claude_sdk/session_pool.py +0 -0
  100. {pcode-0.1.8 → pcode-0.1.9}/src/pcode/claude_sdk/web.py +0 -0
  101. {pcode-0.1.8 → pcode-0.1.9}/src/pcode/claude_sdk/workspace.py +0 -0
  102. {pcode-0.1.8 → pcode-0.1.9}/src/pcode/cli.py +0 -0
  103. {pcode-0.1.8 → pcode-0.1.9}/src/pcode/code_mode.py +0 -0
  104. {pcode-0.1.8 → pcode-0.1.9}/src/pcode/codex_login.py +0 -0
  105. {pcode-0.1.8 → pcode-0.1.9}/src/pcode/command_transcript.py +0 -0
  106. {pcode-0.1.8 → pcode-0.1.9}/src/pcode/commands.py +0 -0
  107. {pcode-0.1.8 → pcode-0.1.9}/src/pcode/compaction.py +0 -0
  108. {pcode-0.1.8 → pcode-0.1.9}/src/pcode/completion.py +0 -0
  109. {pcode-0.1.8 → pcode-0.1.9}/src/pcode/config_ui.py +0 -0
  110. {pcode-0.1.8 → pcode-0.1.9}/src/pcode/context_breakdown.py +0 -0
  111. {pcode-0.1.8 → pcode-0.1.9}/src/pcode/context_usage.py +0 -0
  112. {pcode-0.1.8 → pcode-0.1.9}/src/pcode/delegation.py +0 -0
  113. {pcode-0.1.8 → pcode-0.1.9}/src/pcode/delta.py +0 -0
  114. {pcode-0.1.8 → pcode-0.1.9}/src/pcode/diagnostics.py +0 -0
  115. {pcode-0.1.8 → pcode-0.1.9}/src/pcode/edit_preview.py +0 -0
  116. {pcode-0.1.8 → pcode-0.1.9}/src/pcode/edit_transcript.py +0 -0
  117. {pcode-0.1.8 → pcode-0.1.9}/src/pcode/edit_ui.py +0 -0
  118. {pcode-0.1.8 → pcode-0.1.9}/src/pcode/edits.py +0 -0
  119. {pcode-0.1.8 → pcode-0.1.9}/src/pcode/email_remote/__init__.py +0 -0
  120. {pcode-0.1.8 → pcode-0.1.9}/src/pcode/email_remote/cli.py +0 -0
  121. {pcode-0.1.8 → pcode-0.1.9}/src/pcode/email_remote/listener.py +0 -0
  122. {pcode-0.1.8 → pcode-0.1.9}/src/pcode/email_remote/mailbox.py +0 -0
  123. {pcode-0.1.8 → pcode-0.1.9}/src/pcode/email_remote/outbound.py +0 -0
  124. {pcode-0.1.8 → pcode-0.1.9}/src/pcode/email_remote/parsing.py +0 -0
  125. {pcode-0.1.8 → pcode-0.1.9}/src/pcode/email_remote/render.py +0 -0
  126. {pcode-0.1.8 → pcode-0.1.9}/src/pcode/email_remote/state.py +0 -0
  127. {pcode-0.1.8 → pcode-0.1.9}/src/pcode/error_report.py +0 -0
  128. {pcode-0.1.8 → pcode-0.1.9}/src/pcode/ext.py +0 -0
  129. {pcode-0.1.8 → pcode-0.1.9}/src/pcode/extension_guide.md +0 -0
  130. {pcode-0.1.8 → pcode-0.1.9}/src/pcode/extensions/ponytail.py +0 -0
  131. {pcode-0.1.8 → pcode-0.1.9}/src/pcode/extensions/web_research.py +0 -0
  132. {pcode-0.1.8 → pcode-0.1.9}/src/pcode/frame.py +0 -0
  133. {pcode-0.1.8 → pcode-0.1.9}/src/pcode/gateway.py +0 -0
  134. {pcode-0.1.8 → pcode-0.1.9}/src/pcode/git_diff.py +0 -0
  135. {pcode-0.1.8 → pcode-0.1.9}/src/pcode/history_embeddings.py +0 -0
  136. {pcode-0.1.8 → pcode-0.1.9}/src/pcode/host_protocol.py +0 -0
  137. {pcode-0.1.8 → pcode-0.1.9}/src/pcode/host_ui.py +0 -0
  138. {pcode-0.1.8 → pcode-0.1.9}/src/pcode/input_keys.py +0 -0
  139. {pcode-0.1.8 → pcode-0.1.9}/src/pcode/inspector_ui.py +0 -0
  140. {pcode-0.1.8 → pcode-0.1.9}/src/pcode/isolated_delegation.py +0 -0
  141. {pcode-0.1.8 → pcode-0.1.9}/src/pcode/job_notices.py +0 -0
  142. {pcode-0.1.8 → pcode-0.1.9}/src/pcode/jobs.py +0 -0
  143. {pcode-0.1.8 → pcode-0.1.9}/src/pcode/jobs_ui.py +0 -0
  144. {pcode-0.1.8 → pcode-0.1.9}/src/pcode/keyboard_protocol.py +0 -0
  145. {pcode-0.1.8 → pcode-0.1.9}/src/pcode/layout_speed.py +0 -0
  146. {pcode-0.1.8 → pcode-0.1.9}/src/pcode/links.py +0 -0
  147. {pcode-0.1.8 → pcode-0.1.9}/src/pcode/links_ui.py +0 -0
  148. {pcode-0.1.8 → pcode-0.1.9}/src/pcode/llm_proxy.py +0 -0
  149. {pcode-0.1.8 → pcode-0.1.9}/src/pcode/mcp.py +0 -0
  150. {pcode-0.1.8 → pcode-0.1.9}/src/pcode/model_ui.py +0 -0
  151. {pcode-0.1.8 → pcode-0.1.9}/src/pcode/path_completion.py +0 -0
  152. {pcode-0.1.8 → pcode-0.1.9}/src/pcode/plan_preview.py +0 -0
  153. {pcode-0.1.8 → pcode-0.1.9}/src/pcode/plan_sizes.py +0 -0
  154. {pcode-0.1.8 → pcode-0.1.9}/src/pcode/planning.py +0 -0
  155. {pcode-0.1.8 → pcode-0.1.9}/src/pcode/prefix_keys.py +0 -0
  156. {pcode-0.1.8 → pcode-0.1.9}/src/pcode/proctitle.py +0 -0
  157. {pcode-0.1.8 → pcode-0.1.9}/src/pcode/profile_benchmark.py +0 -0
  158. {pcode-0.1.8 → pcode-0.1.9}/src/pcode/profiling.py +0 -0
  159. {pcode-0.1.8 → pcode-0.1.9}/src/pcode/project_trust.py +0 -0
  160. /pcode-0.1.8/src/pcode/meridian_reminders.py → /pcode-0.1.9/src/pcode/reminders.py +0 -0
  161. {pcode-0.1.8 → pcode-0.1.9}/src/pcode/remote_print.py +0 -0
  162. {pcode-0.1.8 → pcode-0.1.9}/src/pcode/repo_context.py +0 -0
  163. {pcode-0.1.8 → pcode-0.1.9}/src/pcode/rpc.py +0 -0
  164. {pcode-0.1.8 → pcode-0.1.9}/src/pcode/runtime.py +0 -0
  165. {pcode-0.1.8 → pcode-0.1.9}/src/pcode/sandbox.py +0 -0
  166. {pcode-0.1.8 → pcode-0.1.9}/src/pcode/shell.py +0 -0
  167. {pcode-0.1.8 → pcode-0.1.9}/src/pcode/shell_mode.py +0 -0
  168. {pcode-0.1.8 → pcode-0.1.9}/src/pcode/shell_tools.py +0 -0
  169. {pcode-0.1.8 → pcode-0.1.9}/src/pcode/skills.py +0 -0
  170. {pcode-0.1.8 → pcode-0.1.9}/src/pcode/stall_log.py +0 -0
  171. {pcode-0.1.8 → pcode-0.1.9}/src/pcode/stream_display.py +0 -0
  172. {pcode-0.1.8 → pcode-0.1.9}/src/pcode/stream_events.py +0 -0
  173. {pcode-0.1.8 → pcode-0.1.9}/src/pcode/strict_tools.py +0 -0
  174. {pcode-0.1.8 → pcode-0.1.9}/src/pcode/syntax.py +0 -0
  175. {pcode-0.1.8 → pcode-0.1.9}/src/pcode/syntax_colors.py +0 -0
  176. {pcode-0.1.8 → pcode-0.1.9}/src/pcode/task_prompt.py +0 -0
  177. {pcode-0.1.8 → pcode-0.1.9}/src/pcode/task_worktrees.py +0 -0
  178. {pcode-0.1.8 → pcode-0.1.9}/src/pcode/terminal_notify.py +0 -0
  179. {pcode-0.1.8 → pcode-0.1.9}/src/pcode/terminal_text.py +0 -0
  180. {pcode-0.1.8 → pcode-0.1.9}/src/pcode/text_selection.py +0 -0
  181. {pcode-0.1.8 → pcode-0.1.9}/src/pcode/theme_gallery.py +0 -0
  182. {pcode-0.1.8 → pcode-0.1.9}/src/pcode/thinking_markdown.py +0 -0
  183. {pcode-0.1.8 → pcode-0.1.9}/src/pcode/token_accounting.py +0 -0
  184. {pcode-0.1.8 → pcode-0.1.9}/src/pcode/tool_panel.py +0 -0
  185. {pcode-0.1.8 → pcode-0.1.9}/src/pcode/transcript_log.py +0 -0
  186. {pcode-0.1.8 → pcode-0.1.9}/src/pcode/transcript_notice.py +0 -0
  187. {pcode-0.1.8 → pcode-0.1.9}/src/pcode/update_check.py +0 -0
  188. {pcode-0.1.8 → pcode-0.1.9}/src/pcode/worker_ui.py +0 -0
  189. {pcode-0.1.8 → pcode-0.1.9}/src/pcode/workers.py +0 -0
  190. {pcode-0.1.8 → pcode-0.1.9}/src/pcode/workspace.py +0 -0
@@ -1,6 +1,6 @@
1
1
  Metadata-Version: 2.5
2
2
  Name: pcode
3
- Version: 0.1.8
3
+ Version: 0.1.9
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/
@@ -64,6 +64,8 @@ your Claude or ChatGPT subscription.
64
64
 
65
65
  **Documentation: [cruxwell.github.io/pcode](https://cruxwell.github.io/pcode/)**
66
66
 
67
+ **Tried it? [Share feedback](https://github.com/cruxwell/pcode/discussions/4)**: what worked, what didn't, and where you got stuck.
68
+
67
69
  ## Install
68
70
 
69
71
  With [Homebrew](https://brew.sh/):
@@ -131,7 +133,7 @@ See [PLAN.md](https://github.com/cruxwell/pcode/blob/master/PLAN.md) for the lon
131
133
  | [Configuration](https://cruxwell.github.io/pcode/configuration/) | `pcode config`, per-repository overrides, trusting repository code, the settings table, syntax styles |
132
134
  | [Commands and keys](https://cruxwell.github.io/pcode/commands/) | Slash commands, key bindings, vi mode, tmux newlines, status line, `!command`, the diff and tool inspectors |
133
135
  | [Keybindings](https://cruxwell.github.io/pcode/keybindings/) | Custom command mappings with `/bind`, Ctrl shortcuts, vi editing, a normal-mode leader, and custom escape sequences such as `jj` |
134
- | [Terminal setup](https://cruxwell.github.io/pcode/terminal/) | Tab titles, the progress bar, iTerm2 and tmux settings |
136
+ | [Terminal setup](https://cruxwell.github.io/pcode/terminal/) | Tab titles, the progress bar, symbols and colors, iTerm2 and tmux settings |
135
137
  | [Tools](https://cruxwell.github.io/pcode/tools/) | Tool permissions, web search, the browser, code mode |
136
138
  | [MCP servers](https://cruxwell.github.io/pcode/mcp/) | Opt-in MCP configuration, OAuth sign-in, deferred tool search |
137
139
  | [Working in a repository](https://cruxwell.github.io/pcode/workspace/) | `AGENTS.md`/`CLAUDE.md`, skills as slash commands, one worktree per session |
@@ -148,6 +150,7 @@ checks every page and anchor link.
148
150
  ## Contributing
149
151
 
150
152
  Bugs: [open an issue](https://github.com/cruxwell/pcode/issues/new/choose).
153
+ Feedback and ideas: [the feedback discussion](https://github.com/cruxwell/pcode/discussions/4).
151
154
  Security problems: see [SECURITY.md](https://github.com/cruxwell/pcode/blob/master/SECURITY.md). Setup and checks are in
152
155
  [CONTRIBUTING.md](https://github.com/cruxwell/pcode/blob/master/CONTRIBUTING.md).
153
156
 
@@ -28,6 +28,8 @@ your Claude or ChatGPT subscription.
28
28
 
29
29
  **Documentation: [cruxwell.github.io/pcode](https://cruxwell.github.io/pcode/)**
30
30
 
31
+ **Tried it? [Share feedback](https://github.com/cruxwell/pcode/discussions/4)**: what worked, what didn't, and where you got stuck.
32
+
31
33
  ## Install
32
34
 
33
35
  With [Homebrew](https://brew.sh/):
@@ -95,7 +97,7 @@ See [PLAN.md](https://github.com/cruxwell/pcode/blob/master/PLAN.md) for the lon
95
97
  | [Configuration](https://cruxwell.github.io/pcode/configuration/) | `pcode config`, per-repository overrides, trusting repository code, the settings table, syntax styles |
96
98
  | [Commands and keys](https://cruxwell.github.io/pcode/commands/) | Slash commands, key bindings, vi mode, tmux newlines, status line, `!command`, the diff and tool inspectors |
97
99
  | [Keybindings](https://cruxwell.github.io/pcode/keybindings/) | Custom command mappings with `/bind`, Ctrl shortcuts, vi editing, a normal-mode leader, and custom escape sequences such as `jj` |
98
- | [Terminal setup](https://cruxwell.github.io/pcode/terminal/) | Tab titles, the progress bar, iTerm2 and tmux settings |
100
+ | [Terminal setup](https://cruxwell.github.io/pcode/terminal/) | Tab titles, the progress bar, symbols and colors, iTerm2 and tmux settings |
99
101
  | [Tools](https://cruxwell.github.io/pcode/tools/) | Tool permissions, web search, the browser, code mode |
100
102
  | [MCP servers](https://cruxwell.github.io/pcode/mcp/) | Opt-in MCP configuration, OAuth sign-in, deferred tool search |
101
103
  | [Working in a repository](https://cruxwell.github.io/pcode/workspace/) | `AGENTS.md`/`CLAUDE.md`, skills as slash commands, one worktree per session |
@@ -112,6 +114,7 @@ checks every page and anchor link.
112
114
  ## Contributing
113
115
 
114
116
  Bugs: [open an issue](https://github.com/cruxwell/pcode/issues/new/choose).
117
+ Feedback and ideas: [the feedback discussion](https://github.com/cruxwell/pcode/discussions/4).
115
118
  Security problems: see [SECURITY.md](https://github.com/cruxwell/pcode/blob/master/SECURITY.md). Setup and checks are in
116
119
  [CONTRIBUTING.md](https://github.com/cruxwell/pcode/blob/master/CONTRIBUTING.md).
117
120
 
@@ -39,12 +39,12 @@ from pcode.code_mode import create_code_mode
39
39
  from pcode.delegation import DelegationReporting, stream_child_activity
40
40
  from pcode.ext import EXTENSION_GUIDE, ExtensionCapabilities
41
41
  from pcode.filesystem import DisplayFileSystem
42
+ from pcode.images import ImageGate
42
43
  from pcode.isolated_delegation import WorkspaceSubAgents
43
44
  from pcode.job_notices import JobNotices
44
45
  from pcode.jobs import isolated_registry
45
46
  from pcode.mcp import configured_servers
46
47
  from pcode.mcp_notice import MCPServers
47
- from pcode.meridian import MeridianSessionIdentity
48
48
  from pcode.output_limits import ModelOutputLimits
49
49
  from pcode.planning import IdentifiedPlanning
50
50
  from pcode.preferences import SETTINGS, load_preferences, subagent_models
@@ -214,13 +214,11 @@ def _job_shell(shell: Shell, workspace: Path) -> JobShell:
214
214
  `__init__`.
215
215
  """
216
216
  values = _init_fields(shell)
217
- # direnv writes its status banner to stderr on every cd into a managed
218
- # directory, which pollutes command output the agent parses (e.g.
219
- # `... | jq`). An empty log format silences it.
220
- values["env"] = {**(shell.env or os.environ), "DIRENV_LOG_FORMAT": ""}
221
217
  # Commands inherit the whole host environment (see `JobShell`), so keep
222
218
  # provider credentials out of it, as Coder did before it left the
223
- # environment to the workspace.
219
+ # environment to the workspace. The env must be explicit: Harness applies
220
+ # `denied_env_patterns` only to an explicit env, never to `None`.
221
+ values["env"] = dict(shell.env or os.environ)
224
222
  values["denied_env_patterns"] = [*values["denied_env_patterns"], *LLM_API_KEY_ENV_PATTERNS]
225
223
  return JobShell(**values, workdir=workspace)
226
224
 
@@ -279,8 +277,8 @@ def _worker_capabilities(capabilities: Sequence) -> list:
279
277
  """
280
278
  shared_types = (
281
279
  ToolOutputLimits,
282
- MeridianSessionIdentity,
283
280
  ModelOutputLimits,
281
+ ImageGate,
284
282
  CacheBustReporting,
285
283
  TurnLimits,
286
284
  )
@@ -337,8 +335,8 @@ def _delegation(
337
335
  shared_capabilities=[
338
336
  # Extension sub-agents have no coder of their own to set it.
339
337
  ClaudeWorkspace(workspace, fallback=True),
340
- MeridianSessionIdentity(),
341
338
  ModelOutputLimits(),
339
+ ImageGate(),
342
340
  *([replace(cache_notices)] if cache_notices else []),
343
341
  ProviderCacheSettings(),
344
342
  replace(output_limits),
@@ -360,7 +358,7 @@ def create_coder(
360
358
  _ensure_bundled_rg()
361
359
  # Delegation is pcode's own `WorkspaceSubAgents`, added below. Caching is
362
360
  # `ProviderCacheSettings`' per-provider choice: Coder's default `cache=True`
363
- # would also reach Meridian and OpenAI's explicit-breakpoint models.
361
+ # would also reach OpenAI's explicit-breakpoint models.
364
362
  coder = Coder(sub_agents=False, caching=False)
365
363
  output_limits = create_tool_output_limits()
366
364
  # Keep Coder's tool selection, including its persistent shell (as a
@@ -379,8 +377,8 @@ def create_coder(
379
377
  ClaudeWorkspace(workspace),
380
378
  IdentifiedPlanning(),
381
379
  DelegationReporting(),
382
- MeridianSessionIdentity(),
383
380
  ModelOutputLimits(),
381
+ ImageGate(),
384
382
  *turn_limits(),
385
383
  ]
386
384
  # Ahead of the worker copy below, so a delegate edits under the same schema.
@@ -482,33 +480,16 @@ def resolve_model(model: str) -> Model | str:
482
480
  """
483
481
  if model.startswith("openai-codex:"):
484
482
  return codex_model(model)
485
- if model.startswith("meridian:"):
486
- from pcode.models import LEGACY_ANTHROPIC_AUTH
487
-
488
- if not LEGACY_ANTHROPIC_AUTH:
489
- name = model.removeprefix("meridian:")
490
- raise ValueError(f"Meridian is turned off; switch to claude:{name} with /model.")
491
- from pcode.meridian import meridian_model
492
-
493
- return meridian_model(model)
494
483
  if model.startswith("claude:"):
495
484
  from pcode.claude_sdk import claude_model
496
485
 
497
486
  return claude_model(model)
498
487
  if not model.startswith("anthropic:"):
499
488
  return model
500
- from pcode.anthropic_oauth import anthropic_auth_source
501
489
  from pcode.auth import anthropic_model
502
490
 
503
- auth_source = anthropic_auth_source()
504
- if auth_source == "oauth":
505
- from pcode.anthropic_oauth import AnthropicOAuthModel
506
-
507
- return AnthropicOAuthModel(model)
508
- if auth_source == "api-key":
509
- key = os.environ.get("ANTHROPIC_API_KEY", "").strip()
510
- return anthropic_model(model, key) if key else model
511
- raise ValueError("PCODE_ANTHROPIC_AUTH must be api-key or oauth.")
491
+ key = os.environ.get("ANTHROPIC_API_KEY", "").strip()
492
+ return anthropic_model(model, key) if key else model
512
493
 
513
494
 
514
495
  @dataclass(frozen=True)