painapple-code 1.1.11__tar.gz → 1.2.2__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 (524) hide show
  1. {painapple_code-1.1.11 → painapple_code-1.2.2}/CHANGELOG.md +32 -0
  2. {painapple_code-1.1.11/src/painapple_code.egg-info → painapple_code-1.2.2}/PKG-INFO +1 -1
  3. {painapple_code-1.1.11 → painapple_code-1.2.2}/docs-site/getting-started/requirements.md +1 -1
  4. {painapple_code-1.1.11 → painapple_code-1.2.2}/docs-site/guides/providers.md +1 -0
  5. {painapple_code-1.1.11 → painapple_code-1.2.2}/src/painapple_code/_version.py +3 -3
  6. {painapple_code-1.1.11 → painapple_code-1.2.2}/src/painapple_code/data/models.defaults.yaml +4 -4
  7. {painapple_code-1.1.11 → painapple_code-1.2.2}/src/painapple_code/data/models.yaml +4 -4
  8. {painapple_code-1.1.11 → painapple_code-1.2.2}/src/painapple_code/data/strings.yaml +27 -0
  9. {painapple_code-1.1.11 → painapple_code-1.2.2}/src/painapple_code/paths.py +3 -3
  10. {painapple_code-1.1.11 → painapple_code-1.2.2}/src/painapple_code/providers/__init__.py +38 -0
  11. {painapple_code-1.1.11 → painapple_code-1.2.2}/src/painapple_code/providers/base.py +139 -0
  12. {painapple_code-1.1.11 → painapple_code-1.2.2}/src/painapple_code/providers/claude/capabilities.py +27 -1
  13. {painapple_code-1.1.11 → painapple_code-1.2.2}/src/painapple_code/providers/claude/summary.py +3 -2
  14. {painapple_code-1.1.11 → painapple_code-1.2.2}/src/painapple_code/providers/claude_sdk/driver.py +21 -11
  15. {painapple_code-1.1.11 → painapple_code-1.2.2}/src/painapple_code/providers/codex_app_server/launch.py +9 -0
  16. {painapple_code-1.1.11 → painapple_code-1.2.2}/src/painapple_code/providers/codex_app_server/transport.py +3 -0
  17. {painapple_code-1.1.11 → painapple_code-1.2.2}/src/painapple_code/routes/api_app_config.py +105 -19
  18. {painapple_code-1.1.11 → painapple_code-1.2.2}/src/painapple_code/routes/ws_chat.py +14 -4
  19. {painapple_code-1.1.11 → painapple_code-1.2.2}/src/painapple_code/server.py +31 -0
  20. {painapple_code-1.1.11 → painapple_code-1.2.2}/src/painapple_code/services/agent_session.py +27 -6
  21. {painapple_code-1.1.11 → painapple_code-1.2.2}/src/painapple_code/shadow_git_summary.py +2 -1
  22. painapple_code-1.2.2/src/painapple_code/static/css/68-cli-version-widget.css +107 -0
  23. {painapple_code-1.1.11 → painapple_code-1.2.2}/src/painapple_code/static/css/70-config-panel.css +76 -4
  24. {painapple_code-1.1.11 → painapple_code-1.2.2}/src/painapple_code/static/dist/app.bundle.js +620 -574
  25. {painapple_code-1.1.11 → painapple_code-1.2.2}/src/painapple_code/static/js/app/settings-helpers.js +16 -0
  26. {painapple_code-1.1.11 → painapple_code-1.2.2}/src/painapple_code/static/js/app.js +2 -0
  27. {painapple_code-1.1.11 → painapple_code-1.2.2}/src/painapple_code/static/js/components.js +4 -1
  28. {painapple_code-1.1.11 → painapple_code-1.2.2}/src/painapple_code/static/js/quick-actions-registry.js +9 -0
  29. {painapple_code-1.1.11 → painapple_code-1.2.2}/src/painapple_code/static/js/status-bar.js +1 -1
  30. painapple_code-1.2.2/src/painapple_code/static/js/widgets/cli-version-widget.js +152 -0
  31. {painapple_code-1.1.11 → painapple_code-1.2.2}/src/painapple_code/static/js/widgets/config/models-tab.js +198 -1
  32. {painapple_code-1.1.11 → painapple_code-1.2.2}/src/painapple_code/static/js/widgets/index.js +2 -0
  33. {painapple_code-1.1.11 → painapple_code-1.2.2}/src/painapple_code/utils/agent_cli.py +31 -5
  34. {painapple_code-1.1.11 → painapple_code-1.2.2/src/painapple_code.egg-info}/PKG-INFO +1 -1
  35. {painapple_code-1.1.11 → painapple_code-1.2.2}/src/painapple_code.egg-info/SOURCES.txt +2 -0
  36. {painapple_code-1.1.11 → painapple_code-1.2.2}/src/painapple_code.egg-info/scm_file_list.json +4 -0
  37. painapple_code-1.2.2/src/painapple_code.egg-info/scm_version.json +8 -0
  38. painapple_code-1.1.11/src/painapple_code.egg-info/scm_version.json +0 -8
  39. {painapple_code-1.1.11 → painapple_code-1.2.2}/.devcontainer/devcontainer.json +0 -0
  40. {painapple_code-1.1.11 → painapple_code-1.2.2}/.dockerignore +0 -0
  41. {painapple_code-1.1.11 → painapple_code-1.2.2}/.gitignore +0 -0
  42. {painapple_code-1.1.11 → painapple_code-1.2.2}/CONTRIBUTING.md +0 -0
  43. {painapple_code-1.1.11 → painapple_code-1.2.2}/Dockerfile +0 -0
  44. {painapple_code-1.1.11 → painapple_code-1.2.2}/LICENSE +0 -0
  45. {painapple_code-1.1.11 → painapple_code-1.2.2}/MANIFEST.in +0 -0
  46. {painapple_code-1.1.11 → painapple_code-1.2.2}/README.dockerhub.md +0 -0
  47. {painapple_code-1.1.11 → painapple_code-1.2.2}/README.md +0 -0
  48. {painapple_code-1.1.11 → painapple_code-1.2.2}/SECURITY.md +0 -0
  49. {painapple_code-1.1.11 → painapple_code-1.2.2}/THIRD_PARTY_NOTICES.md +0 -0
  50. {painapple_code-1.1.11 → painapple_code-1.2.2}/build-frontend.sh +0 -0
  51. {painapple_code-1.1.11 → painapple_code-1.2.2}/docker-compose.yml +0 -0
  52. {painapple_code-1.1.11 → painapple_code-1.2.2}/docker-entrypoint.sh +0 -0
  53. {painapple_code-1.1.11 → painapple_code-1.2.2}/docs-site/assets/annotate-editor.png +0 -0
  54. {painapple_code-1.1.11 → painapple_code-1.2.2}/docs-site/assets/browser-widget.png +0 -0
  55. {painapple_code-1.1.11 → painapple_code-1.2.2}/docs-site/assets/comments-stash.gif +0 -0
  56. {painapple_code-1.1.11 → painapple_code-1.2.2}/docs-site/assets/cost-analytics.png +0 -0
  57. {painapple_code-1.1.11 → painapple_code-1.2.2}/docs-site/assets/favicon.png +0 -0
  58. {painapple_code-1.1.11 → painapple_code-1.2.2}/docs-site/assets/input-autocomplete.gif +0 -0
  59. {painapple_code-1.1.11 → painapple_code-1.2.2}/docs-site/assets/logo.png +0 -0
  60. {painapple_code-1.1.11 → painapple_code-1.2.2}/docs-site/assets/markdown-quick-edit.gif +0 -0
  61. {painapple_code-1.1.11 → painapple_code-1.2.2}/docs-site/assets/overview.png +0 -0
  62. {painapple_code-1.1.11 → painapple_code-1.2.2}/docs-site/assets/prompt-history.png +0 -0
  63. {painapple_code-1.1.11 → painapple_code-1.2.2}/docs-site/assets/quick-switcher.gif +0 -0
  64. {painapple_code-1.1.11 → painapple_code-1.2.2}/docs-site/assets/quick-switcher.png +0 -0
  65. {painapple_code-1.1.11 → painapple_code-1.2.2}/docs-site/assets/settings-appearance.png +0 -0
  66. {painapple_code-1.1.11 → painapple_code-1.2.2}/docs-site/assets/settings-claude.png +0 -0
  67. {painapple_code-1.1.11 → painapple_code-1.2.2}/docs-site/assets/shadow-journal.png +0 -0
  68. {painapple_code-1.1.11 → painapple_code-1.2.2}/docs-site/assets/snippets-picker.png +0 -0
  69. {painapple_code-1.1.11 → painapple_code-1.2.2}/docs-site/assets/terminal.gif +0 -0
  70. {painapple_code-1.1.11 → painapple_code-1.2.2}/docs-site/assets/turn-summary-bar-expanded.png +0 -0
  71. {painapple_code-1.1.11 → painapple_code-1.2.2}/docs-site/assets/turn-summary-bar.png +0 -0
  72. {painapple_code-1.1.11 → painapple_code-1.2.2}/docs-site/assets/welcome-screen.png +0 -0
  73. {painapple_code-1.1.11 → painapple_code-1.2.2}/docs-site/assets/zen-mode.png +0 -0
  74. {painapple_code-1.1.11 → painapple_code-1.2.2}/docs-site/changelog.md +0 -0
  75. {painapple_code-1.1.11 → painapple_code-1.2.2}/docs-site/features.md +0 -0
  76. {painapple_code-1.1.11 → painapple_code-1.2.2}/docs-site/getting-started/first-run.md +0 -0
  77. {painapple_code-1.1.11 → painapple_code-1.2.2}/docs-site/getting-started/install-devcontainer.md +0 -0
  78. {painapple_code-1.1.11 → painapple_code-1.2.2}/docs-site/getting-started/install-docker.md +0 -0
  79. {painapple_code-1.1.11 → painapple_code-1.2.2}/docs-site/getting-started/install-pip.md +0 -0
  80. {painapple_code-1.1.11 → painapple_code-1.2.2}/docs-site/getting-started/security.md +0 -0
  81. {painapple_code-1.1.11 → painapple_code-1.2.2}/docs-site/guides/analytics-and-history.md +0 -0
  82. {painapple_code-1.1.11 → painapple_code-1.2.2}/docs-site/guides/claude-artifacts.md +0 -0
  83. {painapple_code-1.1.11 → painapple_code-1.2.2}/docs-site/guides/customization.md +0 -0
  84. {painapple_code-1.1.11 → painapple_code-1.2.2}/docs-site/guides/files.md +0 -0
  85. {painapple_code-1.1.11 → painapple_code-1.2.2}/docs-site/guides/git-and-diffs.md +0 -0
  86. {painapple_code-1.1.11 → painapple_code-1.2.2}/docs-site/guides/images-and-annotation.md +0 -0
  87. {painapple_code-1.1.11 → painapple_code-1.2.2}/docs-site/guides/input-and-commands.md +0 -0
  88. {painapple_code-1.1.11 → painapple_code-1.2.2}/docs-site/guides/ipad-and-mobile.md +0 -0
  89. {painapple_code-1.1.11 → painapple_code-1.2.2}/docs-site/guides/permissions-and-thinking.md +0 -0
  90. {painapple_code-1.1.11 → painapple_code-1.2.2}/docs-site/guides/sessions.md +0 -0
  91. {painapple_code-1.1.11 → painapple_code-1.2.2}/docs-site/guides/shadow-git.md +0 -0
  92. {painapple_code-1.1.11 → painapple_code-1.2.2}/docs-site/guides/stash-and-discussions.md +0 -0
  93. {painapple_code-1.1.11 → painapple_code-1.2.2}/docs-site/guides/terminal.md +0 -0
  94. {painapple_code-1.1.11 → painapple_code-1.2.2}/docs-site/guides/welcome-screen.md +0 -0
  95. {painapple_code-1.1.11 → painapple_code-1.2.2}/docs-site/guides/zen-mode.md +0 -0
  96. {painapple_code-1.1.11 → painapple_code-1.2.2}/docs-site/index.md +0 -0
  97. {painapple_code-1.1.11 → painapple_code-1.2.2}/docs-site/reference/api.md +0 -0
  98. {painapple_code-1.1.11 → painapple_code-1.2.2}/docs-site/reference/commands.md +0 -0
  99. {painapple_code-1.1.11 → painapple_code-1.2.2}/docs-site/reference/data-storage.md +0 -0
  100. {painapple_code-1.1.11 → painapple_code-1.2.2}/docs-site/reference/keyboard-shortcuts.md +0 -0
  101. {painapple_code-1.1.11 → painapple_code-1.2.2}/docs-site/reference/optional-helpers.md +0 -0
  102. {painapple_code-1.1.11 → painapple_code-1.2.2}/docs-site/reference/profiles.md +0 -0
  103. {painapple_code-1.1.11 → painapple_code-1.2.2}/docs-site/reference/server-cli.md +0 -0
  104. {painapple_code-1.1.11 → painapple_code-1.2.2}/mkdocs.yml +0 -0
  105. {painapple_code-1.1.11 → painapple_code-1.2.2}/painapple-docker.sh +0 -0
  106. {painapple_code-1.1.11 → painapple_code-1.2.2}/pyproject.toml +0 -0
  107. {painapple_code-1.1.11 → painapple_code-1.2.2}/requirements-docs.txt +0 -0
  108. {painapple_code-1.1.11 → painapple_code-1.2.2}/requirements.txt +0 -0
  109. {painapple_code-1.1.11 → painapple_code-1.2.2}/setup.cfg +0 -0
  110. {painapple_code-1.1.11 → painapple_code-1.2.2}/setup.py +0 -0
  111. {painapple_code-1.1.11 → painapple_code-1.2.2}/src/painapple_code/__init__.py +0 -0
  112. {painapple_code-1.1.11 → painapple_code-1.2.2}/src/painapple_code/__main__.py +0 -0
  113. {painapple_code-1.1.11 → painapple_code-1.2.2}/src/painapple_code/auth_middleware.py +0 -0
  114. {painapple_code-1.1.11 → painapple_code-1.2.2}/src/painapple_code/cli/__init__.py +0 -0
  115. {painapple_code-1.1.11 → painapple_code-1.2.2}/src/painapple_code/cli/deploy/__init__.py +0 -0
  116. {painapple_code-1.1.11 → painapple_code-1.2.2}/src/painapple_code/cli/deploy/claude_seed.py +0 -0
  117. {painapple_code-1.1.11 → painapple_code-1.2.2}/src/painapple_code/cli/deploy/config.py +0 -0
  118. {painapple_code-1.1.11 → painapple_code-1.2.2}/src/painapple_code/cli/deploy/container.py +0 -0
  119. {painapple_code-1.1.11 → painapple_code-1.2.2}/src/painapple_code/cli/deploy/launch.py +0 -0
  120. {painapple_code-1.1.11 → painapple_code-1.2.2}/src/painapple_code/cli/deploy/runtime.py +0 -0
  121. {painapple_code-1.1.11 → painapple_code-1.2.2}/src/painapple_code/cli/lifecycle_cmd.py +0 -0
  122. {painapple_code-1.1.11 → painapple_code-1.2.2}/src/painapple_code/cli/list_cmd.py +0 -0
  123. {painapple_code-1.1.11 → painapple_code-1.2.2}/src/painapple_code/cli/manage_cmd.py +0 -0
  124. {painapple_code-1.1.11 → painapple_code-1.2.2}/src/painapple_code/cli/netinfo.py +0 -0
  125. {painapple_code-1.1.11 → painapple_code-1.2.2}/src/painapple_code/cli/profiles.py +0 -0
  126. {painapple_code-1.1.11 → painapple_code-1.2.2}/src/painapple_code/cli/serve_args.py +0 -0
  127. {painapple_code-1.1.11 → painapple_code-1.2.2}/src/painapple_code/cli/serve_config.py +0 -0
  128. {painapple_code-1.1.11 → painapple_code-1.2.2}/src/painapple_code/cli/setup_cmd.py +0 -0
  129. {painapple_code-1.1.11 → painapple_code-1.2.2}/src/painapple_code/cli/ui.py +0 -0
  130. {painapple_code-1.1.11 → painapple_code-1.2.2}/src/painapple_code/cost_analytics.py +0 -0
  131. {painapple_code-1.1.11 → painapple_code-1.2.2}/src/painapple_code/data/presets.defaults.json +0 -0
  132. {painapple_code-1.1.11 → painapple_code-1.2.2}/src/painapple_code/helpers.py +0 -0
  133. {painapple_code-1.1.11 → painapple_code-1.2.2}/src/painapple_code/prompt_explorer.py +0 -0
  134. {painapple_code-1.1.11 → painapple_code-1.2.2}/src/painapple_code/providers/claude/__init__.py +0 -0
  135. {painapple_code-1.1.11 → painapple_code-1.2.2}/src/painapple_code/providers/claude/errors.py +0 -0
  136. {painapple_code-1.1.11 → painapple_code-1.2.2}/src/painapple_code/providers/claude/launch.py +0 -0
  137. {painapple_code-1.1.11 → painapple_code-1.2.2}/src/painapple_code/providers/claude/translate.py +0 -0
  138. {painapple_code-1.1.11 → painapple_code-1.2.2}/src/painapple_code/providers/claude_sdk/__init__.py +0 -0
  139. {painapple_code-1.1.11 → painapple_code-1.2.2}/src/painapple_code/providers/codex/__init__.py +0 -0
  140. {painapple_code-1.1.11 → painapple_code-1.2.2}/src/painapple_code/providers/codex/capabilities.py +0 -0
  141. {painapple_code-1.1.11 → painapple_code-1.2.2}/src/painapple_code/providers/codex/errors.py +0 -0
  142. {painapple_code-1.1.11 → painapple_code-1.2.2}/src/painapple_code/providers/codex/translate.py +0 -0
  143. {painapple_code-1.1.11 → painapple_code-1.2.2}/src/painapple_code/providers/codex_app_server/__init__.py +0 -0
  144. {painapple_code-1.1.11 → painapple_code-1.2.2}/src/painapple_code/providers/codex_app_server/capabilities.py +0 -0
  145. {painapple_code-1.1.11 → painapple_code-1.2.2}/src/painapple_code/providers/codex_app_server/summary.py +0 -0
  146. {painapple_code-1.1.11 → painapple_code-1.2.2}/src/painapple_code/providers/codex_app_server/translate.py +0 -0
  147. {painapple_code-1.1.11 → painapple_code-1.2.2}/src/painapple_code/routes/__init__.py +0 -0
  148. {painapple_code-1.1.11 → painapple_code-1.2.2}/src/painapple_code/routes/api_agents.py +0 -0
  149. {painapple_code-1.1.11 → painapple_code-1.2.2}/src/painapple_code/routes/api_app.py +0 -0
  150. {painapple_code-1.1.11 → painapple_code-1.2.2}/src/painapple_code/routes/api_app_commit_sections.py +0 -0
  151. {painapple_code-1.1.11 → painapple_code-1.2.2}/src/painapple_code/routes/api_app_session_prefs.py +0 -0
  152. {painapple_code-1.1.11 → painapple_code-1.2.2}/src/painapple_code/routes/api_browser.py +0 -0
  153. {painapple_code-1.1.11 → painapple_code-1.2.2}/src/painapple_code/routes/api_commands.py +0 -0
  154. {painapple_code-1.1.11 → painapple_code-1.2.2}/src/painapple_code/routes/api_costs.py +0 -0
  155. {painapple_code-1.1.11 → painapple_code-1.2.2}/src/painapple_code/routes/api_drafts.py +0 -0
  156. {painapple_code-1.1.11 → painapple_code-1.2.2}/src/painapple_code/routes/api_exec.py +0 -0
  157. {painapple_code-1.1.11 → painapple_code-1.2.2}/src/painapple_code/routes/api_files.py +0 -0
  158. {painapple_code-1.1.11 → painapple_code-1.2.2}/src/painapple_code/routes/api_git.py +0 -0
  159. {painapple_code-1.1.11 → painapple_code-1.2.2}/src/painapple_code/routes/api_logs.py +0 -0
  160. {painapple_code-1.1.11 → painapple_code-1.2.2}/src/painapple_code/routes/api_plugins.py +0 -0
  161. {painapple_code-1.1.11 → painapple_code-1.2.2}/src/painapple_code/routes/api_project_config.py +0 -0
  162. {painapple_code-1.1.11 → painapple_code-1.2.2}/src/painapple_code/routes/api_prompts.py +0 -0
  163. {painapple_code-1.1.11 → painapple_code-1.2.2}/src/painapple_code/routes/api_providers.py +0 -0
  164. {painapple_code-1.1.11 → painapple_code-1.2.2}/src/painapple_code/routes/api_search.py +0 -0
  165. {painapple_code-1.1.11 → painapple_code-1.2.2}/src/painapple_code/routes/api_session_stash.py +0 -0
  166. {painapple_code-1.1.11 → painapple_code-1.2.2}/src/painapple_code/routes/api_session_welcome.py +0 -0
  167. {painapple_code-1.1.11 → painapple_code-1.2.2}/src/painapple_code/routes/api_sessions.py +0 -0
  168. {painapple_code-1.1.11 → painapple_code-1.2.2}/src/painapple_code/routes/api_shadow.py +0 -0
  169. {painapple_code-1.1.11 → painapple_code-1.2.2}/src/painapple_code/routes/api_shadow_db.py +0 -0
  170. {painapple_code-1.1.11 → painapple_code-1.2.2}/src/painapple_code/routes/api_shadow_files.py +0 -0
  171. {painapple_code-1.1.11 → painapple_code-1.2.2}/src/painapple_code/routes/api_shadow_search.py +0 -0
  172. {painapple_code-1.1.11 → painapple_code-1.2.2}/src/painapple_code/routes/api_skills.py +0 -0
  173. {painapple_code-1.1.11 → painapple_code-1.2.2}/src/painapple_code/routes/api_tasks.py +0 -0
  174. {painapple_code-1.1.11 → painapple_code-1.2.2}/src/painapple_code/routes/api_terminal.py +0 -0
  175. {painapple_code-1.1.11 → painapple_code-1.2.2}/src/painapple_code/routes/api_upload.py +0 -0
  176. {painapple_code-1.1.11 → painapple_code-1.2.2}/src/painapple_code/routes/api_viewer.py +0 -0
  177. {painapple_code-1.1.11 → painapple_code-1.2.2}/src/painapple_code/routes/dependencies.py +0 -0
  178. {painapple_code-1.1.11 → painapple_code-1.2.2}/src/painapple_code/server_logging.py +0 -0
  179. {painapple_code-1.1.11 → painapple_code-1.2.2}/src/painapple_code/services/__init__.py +0 -0
  180. {painapple_code-1.1.11 → painapple_code-1.2.2}/src/painapple_code/session_store.py +0 -0
  181. {painapple_code-1.1.11 → painapple_code-1.2.2}/src/painapple_code/session_store_core.py +0 -0
  182. {painapple_code-1.1.11 → painapple_code-1.2.2}/src/painapple_code/shadow_db.py +0 -0
  183. {painapple_code-1.1.11 → painapple_code-1.2.2}/src/painapple_code/shadow_db_plans.py +0 -0
  184. {painapple_code-1.1.11 → painapple_code-1.2.2}/src/painapple_code/shadow_db_queries.py +0 -0
  185. {painapple_code-1.1.11 → painapple_code-1.2.2}/src/painapple_code/shadow_db_schema.py +0 -0
  186. {painapple_code-1.1.11 → painapple_code-1.2.2}/src/painapple_code/shadow_git.py +0 -0
  187. {painapple_code-1.1.11 → painapple_code-1.2.2}/src/painapple_code/shadow_git_frontmatter.py +0 -0
  188. {painapple_code-1.1.11 → painapple_code-1.2.2}/src/painapple_code/shadow_git_sections.py +0 -0
  189. {painapple_code-1.1.11 → painapple_code-1.2.2}/src/painapple_code/shadow_parser.py +0 -0
  190. {painapple_code-1.1.11 → painapple_code-1.2.2}/src/painapple_code/static/css/00-variables.css +0 -0
  191. {painapple_code-1.1.11 → painapple_code-1.2.2}/src/painapple_code/static/css/01-base.css +0 -0
  192. {painapple_code-1.1.11 → painapple_code-1.2.2}/src/painapple_code/static/css/02-tooltips.css +0 -0
  193. {painapple_code-1.1.11 → painapple_code-1.2.2}/src/painapple_code/static/css/09-left-rail.css +0 -0
  194. {painapple_code-1.1.11 → painapple_code-1.2.2}/src/painapple_code/static/css/10-header.css +0 -0
  195. {painapple_code-1.1.11 → painapple_code-1.2.2}/src/painapple_code/static/css/11-connection-bar.css +0 -0
  196. {painapple_code-1.1.11 → painapple_code-1.2.2}/src/painapple_code/static/css/20-messages.css +0 -0
  197. {painapple_code-1.1.11 → painapple_code-1.2.2}/src/painapple_code/static/css/21-tool-blocks.css +0 -0
  198. {painapple_code-1.1.11 → painapple_code-1.2.2}/src/painapple_code/static/css/22-edit-diff.css +0 -0
  199. {painapple_code-1.1.11 → painapple_code-1.2.2}/src/painapple_code/static/css/23-thinking.css +0 -0
  200. {painapple_code-1.1.11 → painapple_code-1.2.2}/src/painapple_code/static/css/24-background-tasks.css +0 -0
  201. {painapple_code-1.1.11 → painapple_code-1.2.2}/src/painapple_code/static/css/25-context-block.css +0 -0
  202. {painapple_code-1.1.11 → painapple_code-1.2.2}/src/painapple_code/static/css/26-session-setup.css +0 -0
  203. {painapple_code-1.1.11 → painapple_code-1.2.2}/src/painapple_code/static/css/30-markdown.css +0 -0
  204. {painapple_code-1.1.11 → painapple_code-1.2.2}/src/painapple_code/static/css/40-input.css +0 -0
  205. {painapple_code-1.1.11 → painapple_code-1.2.2}/src/painapple_code/static/css/41-autocomplete.css +0 -0
  206. {painapple_code-1.1.11 → painapple_code-1.2.2}/src/painapple_code/static/css/42-activity-strip.css +0 -0
  207. {painapple_code-1.1.11 → painapple_code-1.2.2}/src/painapple_code/static/css/42-goal-bar.css +0 -0
  208. {painapple_code-1.1.11 → painapple_code-1.2.2}/src/painapple_code/static/css/43-file-autocomplete.css +0 -0
  209. {painapple_code-1.1.11 → painapple_code-1.2.2}/src/painapple_code/static/css/44-snippets-autocomplete.css +0 -0
  210. {painapple_code-1.1.11 → painapple_code-1.2.2}/src/painapple_code/static/css/45-selection-bar.css +0 -0
  211. {painapple_code-1.1.11 → painapple_code-1.2.2}/src/painapple_code/static/css/46-keyboard-bar.css +0 -0
  212. {painapple_code-1.1.11 → painapple_code-1.2.2}/src/painapple_code/static/css/47-keyboard-longpress.css +0 -0
  213. {painapple_code-1.1.11 → painapple_code-1.2.2}/src/painapple_code/static/css/47-token-profile.css +0 -0
  214. {painapple_code-1.1.11 → painapple_code-1.2.2}/src/painapple_code/static/css/50-welcome.css +0 -0
  215. {painapple_code-1.1.11 → painapple_code-1.2.2}/src/painapple_code/static/css/51-modals.css +0 -0
  216. {painapple_code-1.1.11 → painapple_code-1.2.2}/src/painapple_code/static/css/52-utilities.css +0 -0
  217. {painapple_code-1.1.11 → painapple_code-1.2.2}/src/painapple_code/static/css/53-image-upload.css +0 -0
  218. {painapple_code-1.1.11 → painapple_code-1.2.2}/src/painapple_code/static/css/54-todo-list.css +0 -0
  219. {painapple_code-1.1.11 → painapple_code-1.2.2}/src/painapple_code/static/css/55-file-upload.css +0 -0
  220. {painapple_code-1.1.11 → painapple_code-1.2.2}/src/painapple_code/static/css/56-chat-navigator.css +0 -0
  221. {painapple_code-1.1.11 → painapple_code-1.2.2}/src/painapple_code/static/css/56-permission-card.css +0 -0
  222. {painapple_code-1.1.11 → painapple_code-1.2.2}/src/painapple_code/static/css/56-plan-approval.css +0 -0
  223. {painapple_code-1.1.11 → painapple_code-1.2.2}/src/painapple_code/static/css/56-question-form.css +0 -0
  224. {painapple_code-1.1.11 → painapple_code-1.2.2}/src/painapple_code/static/css/57-swipe-indicator.css +0 -0
  225. {painapple_code-1.1.11 → painapple_code-1.2.2}/src/painapple_code/static/css/58-session-families.css +0 -0
  226. {painapple_code-1.1.11 → painapple_code-1.2.2}/src/painapple_code/static/css/59-about.css +0 -0
  227. {painapple_code-1.1.11 → painapple_code-1.2.2}/src/painapple_code/static/css/61-log-explorer.css +0 -0
  228. {painapple_code-1.1.11 → painapple_code-1.2.2}/src/painapple_code/static/css/62-json-tree.css +0 -0
  229. {painapple_code-1.1.11 → painapple_code-1.2.2}/src/painapple_code/static/css/62-skills-widget.css +0 -0
  230. {painapple_code-1.1.11 → painapple_code-1.2.2}/src/painapple_code/static/css/63-commands-widget.css +0 -0
  231. {painapple_code-1.1.11 → painapple_code-1.2.2}/src/painapple_code/static/css/63-plugins-widget.css +0 -0
  232. {painapple_code-1.1.11 → painapple_code-1.2.2}/src/painapple_code/static/css/63-terminal.css +0 -0
  233. {painapple_code-1.1.11 → painapple_code-1.2.2}/src/painapple_code/static/css/64-search-files-widget.css +0 -0
  234. {painapple_code-1.1.11 → painapple_code-1.2.2}/src/painapple_code/static/css/65-snippets-widget.css +0 -0
  235. {painapple_code-1.1.11 → painapple_code-1.2.2}/src/painapple_code/static/css/66-active-sessions.css +0 -0
  236. {painapple_code-1.1.11 → painapple_code-1.2.2}/src/painapple_code/static/css/66-agents-widget.css +0 -0
  237. {painapple_code-1.1.11 → painapple_code-1.2.2}/src/painapple_code/static/css/66-file-explorer-widget.css +0 -0
  238. {painapple_code-1.1.11 → painapple_code-1.2.2}/src/painapple_code/static/css/66-git-panel.css +0 -0
  239. {painapple_code-1.1.11 → painapple_code-1.2.2}/src/painapple_code/static/css/66-history-explorer.css +0 -0
  240. {painapple_code-1.1.11 → painapple_code-1.2.2}/src/painapple_code/static/css/67-diff-viewer.css +0 -0
  241. {painapple_code-1.1.11 → painapple_code-1.2.2}/src/painapple_code/static/css/67-editor-view.css +0 -0
  242. {painapple_code-1.1.11 → painapple_code-1.2.2}/src/painapple_code/static/css/67-file-preview-widget.css +0 -0
  243. {painapple_code-1.1.11 → painapple_code-1.2.2}/src/painapple_code/static/css/68-browser-widget.css +0 -0
  244. {painapple_code-1.1.11 → painapple_code-1.2.2}/src/painapple_code/static/css/68-compare-wizard.css +0 -0
  245. {painapple_code-1.1.11 → painapple_code-1.2.2}/src/painapple_code/static/css/68-csv-preview.css +0 -0
  246. {painapple_code-1.1.11 → painapple_code-1.2.2}/src/painapple_code/static/css/68-diff-preview.css +0 -0
  247. {painapple_code-1.1.11 → painapple_code-1.2.2}/src/painapple_code/static/css/68-helpers-install-widget.css +0 -0
  248. {painapple_code-1.1.11 → painapple_code-1.2.2}/src/painapple_code/static/css/68-image-annotate.css +0 -0
  249. {painapple_code-1.1.11 → painapple_code-1.2.2}/src/painapple_code/static/css/68-terminal-view.css +0 -0
  250. {painapple_code-1.1.11 → painapple_code-1.2.2}/src/painapple_code/static/css/68-uploads-widget.css +0 -0
  251. {painapple_code-1.1.11 → painapple_code-1.2.2}/src/painapple_code/static/css/69-cost-analytics.css +0 -0
  252. {painapple_code-1.1.11 → painapple_code-1.2.2}/src/painapple_code/static/css/70-excalidraw.css +0 -0
  253. {painapple_code-1.1.11 → painapple_code-1.2.2}/src/painapple_code/static/css/70-prompt-explorer.css +0 -0
  254. {painapple_code-1.1.11 → painapple_code-1.2.2}/src/painapple_code/static/css/71-chart.css +0 -0
  255. {painapple_code-1.1.11 → painapple_code-1.2.2}/src/painapple_code/static/css/71-mermaid.css +0 -0
  256. {painapple_code-1.1.11 → painapple_code-1.2.2}/src/painapple_code/static/css/72-discussion-sidebar.css +0 -0
  257. {painapple_code-1.1.11 → painapple_code-1.2.2}/src/painapple_code/static/css/74-debug-logs.css +0 -0
  258. {painapple_code-1.1.11 → painapple_code-1.2.2}/src/painapple_code/static/css/80-open-dialog.css +0 -0
  259. {painapple_code-1.1.11 → painapple_code-1.2.2}/src/painapple_code/static/css/80-quick-switcher.css +0 -0
  260. {painapple_code-1.1.11 → painapple_code-1.2.2}/src/painapple_code/static/css/80-widget-system.css +0 -0
  261. {painapple_code-1.1.11 → painapple_code-1.2.2}/src/painapple_code/static/css/81-quick-actions.css +0 -0
  262. {painapple_code-1.1.11 → painapple_code-1.2.2}/src/painapple_code/static/css/82-context-popover.css +0 -0
  263. {painapple_code-1.1.11 → painapple_code-1.2.2}/src/painapple_code/static/css/83-context-menu.css +0 -0
  264. {painapple_code-1.1.11 → painapple_code-1.2.2}/src/painapple_code/static/css/85-lazy-loading.css +0 -0
  265. {painapple_code-1.1.11 → painapple_code-1.2.2}/src/painapple_code/static/css/86-zen-mode.css +0 -0
  266. {painapple_code-1.1.11 → painapple_code-1.2.2}/src/painapple_code/static/css/87-grid-switcher.css +0 -0
  267. {painapple_code-1.1.11 → painapple_code-1.2.2}/src/painapple_code/static/css/login.css +0 -0
  268. {painapple_code-1.1.11 → painapple_code-1.2.2}/src/painapple_code/static/feature-triage.html +0 -0
  269. {painapple_code-1.1.11 → painapple_code-1.2.2}/src/painapple_code/static/icons/apple-touch-icon.png +0 -0
  270. {painapple_code-1.1.11 → painapple_code-1.2.2}/src/painapple_code/static/icons/favicon-32.png +0 -0
  271. {painapple_code-1.1.11 → painapple_code-1.2.2}/src/painapple_code/static/icons/favicon.ico +0 -0
  272. {painapple_code-1.1.11 → painapple_code-1.2.2}/src/painapple_code/static/icons/icon-128.png +0 -0
  273. {painapple_code-1.1.11 → painapple_code-1.2.2}/src/painapple_code/static/icons/icon-144.png +0 -0
  274. {painapple_code-1.1.11 → painapple_code-1.2.2}/src/painapple_code/static/icons/icon-152.png +0 -0
  275. {painapple_code-1.1.11 → painapple_code-1.2.2}/src/painapple_code/static/icons/icon-180.png +0 -0
  276. {painapple_code-1.1.11 → painapple_code-1.2.2}/src/painapple_code/static/icons/icon-192.png +0 -0
  277. {painapple_code-1.1.11 → painapple_code-1.2.2}/src/painapple_code/static/icons/icon-384.png +0 -0
  278. {painapple_code-1.1.11 → painapple_code-1.2.2}/src/painapple_code/static/icons/icon-512.png +0 -0
  279. {painapple_code-1.1.11 → painapple_code-1.2.2}/src/painapple_code/static/icons/icon-72.png +0 -0
  280. {painapple_code-1.1.11 → painapple_code-1.2.2}/src/painapple_code/static/icons/icon-96.png +0 -0
  281. {painapple_code-1.1.11 → painapple_code-1.2.2}/src/painapple_code/static/js/action-delegate.js +0 -0
  282. {painapple_code-1.1.11 → painapple_code-1.2.2}/src/painapple_code/static/js/activity-strip.js +0 -0
  283. {painapple_code-1.1.11 → painapple_code-1.2.2}/src/painapple_code/static/js/app/context-menus.js +0 -0
  284. {painapple_code-1.1.11 → painapple_code-1.2.2}/src/painapple_code/static/js/app/file-preview.js +0 -0
  285. {painapple_code-1.1.11 → painapple_code-1.2.2}/src/painapple_code/static/js/app/init-ui.js +0 -0
  286. {painapple_code-1.1.11 → painapple_code-1.2.2}/src/painapple_code/static/js/app/input-events.js +0 -0
  287. {painapple_code-1.1.11 → painapple_code-1.2.2}/src/painapple_code/static/js/app/input-resize.js +0 -0
  288. {painapple_code-1.1.11 → painapple_code-1.2.2}/src/painapple_code/static/js/app/message-actions.js +0 -0
  289. {painapple_code-1.1.11 → painapple_code-1.2.2}/src/painapple_code/static/js/app/panels.js +0 -0
  290. {painapple_code-1.1.11 → painapple_code-1.2.2}/src/painapple_code/static/js/app/rendering-delegators.js +0 -0
  291. {painapple_code-1.1.11 → painapple_code-1.2.2}/src/painapple_code/static/js/app/server-loading.js +0 -0
  292. {painapple_code-1.1.11 → painapple_code-1.2.2}/src/painapple_code/static/js/app/session-ops.js +0 -0
  293. {painapple_code-1.1.11 → painapple_code-1.2.2}/src/painapple_code/static/js/app/session-switch.js +0 -0
  294. {painapple_code-1.1.11 → painapple_code-1.2.2}/src/painapple_code/static/js/app/startup-welcome.js +0 -0
  295. {painapple_code-1.1.11 → painapple_code-1.2.2}/src/painapple_code/static/js/app-context.js +0 -0
  296. {painapple_code-1.1.11 → painapple_code-1.2.2}/src/painapple_code/static/js/auth-fetch.js +0 -0
  297. {painapple_code-1.1.11 → painapple_code-1.2.2}/src/painapple_code/static/js/background-tasks.js +0 -0
  298. {painapple_code-1.1.11 → painapple_code-1.2.2}/src/painapple_code/static/js/boot.js +0 -0
  299. {painapple_code-1.1.11 → painapple_code-1.2.2}/src/painapple_code/static/js/caret-position.js +0 -0
  300. {painapple_code-1.1.11 → painapple_code-1.2.2}/src/painapple_code/static/js/chat-navigator.js +0 -0
  301. {painapple_code-1.1.11 → painapple_code-1.2.2}/src/painapple_code/static/js/chat-search.js +0 -0
  302. {painapple_code-1.1.11 → painapple_code-1.2.2}/src/painapple_code/static/js/command-executor.js +0 -0
  303. {painapple_code-1.1.11 → painapple_code-1.2.2}/src/painapple_code/static/js/command-store.js +0 -0
  304. {painapple_code-1.1.11 → painapple_code-1.2.2}/src/painapple_code/static/js/config.js +0 -0
  305. {painapple_code-1.1.11 → painapple_code-1.2.2}/src/painapple_code/static/js/context-menu.js +0 -0
  306. {painapple_code-1.1.11 → painapple_code-1.2.2}/src/painapple_code/static/js/controllers/chat-controller.js +0 -0
  307. {painapple_code-1.1.11 → painapple_code-1.2.2}/src/painapple_code/static/js/controllers/dialog-controller.js +0 -0
  308. {painapple_code-1.1.11 → painapple_code-1.2.2}/src/painapple_code/static/js/controllers/tab-controller.js +0 -0
  309. {painapple_code-1.1.11 → painapple_code-1.2.2}/src/painapple_code/static/js/controllers/thinking-controller.js +0 -0
  310. {painapple_code-1.1.11 → painapple_code-1.2.2}/src/painapple_code/static/js/diff-utils.js +0 -0
  311. {painapple_code-1.1.11 → painapple_code-1.2.2}/src/painapple_code/static/js/drafts-pill.js +0 -0
  312. {painapple_code-1.1.11 → painapple_code-1.2.2}/src/painapple_code/static/js/editor-view.js +0 -0
  313. {painapple_code-1.1.11 → painapple_code-1.2.2}/src/painapple_code/static/js/effort-settings.js +0 -0
  314. {painapple_code-1.1.11 → painapple_code-1.2.2}/src/painapple_code/static/js/feature-triage.js +0 -0
  315. {painapple_code-1.1.11 → painapple_code-1.2.2}/src/painapple_code/static/js/file-autocomplete.js +0 -0
  316. {painapple_code-1.1.11 → painapple_code-1.2.2}/src/painapple_code/static/js/file-tabs.js +0 -0
  317. {painapple_code-1.1.11 → painapple_code-1.2.2}/src/painapple_code/static/js/gestures.js +0 -0
  318. {painapple_code-1.1.11 → painapple_code-1.2.2}/src/painapple_code/static/js/goal-bar.js +0 -0
  319. {painapple_code-1.1.11 → painapple_code-1.2.2}/src/painapple_code/static/js/grid-switcher.js +0 -0
  320. {painapple_code-1.1.11 → painapple_code-1.2.2}/src/painapple_code/static/js/input-handler.js +0 -0
  321. {painapple_code-1.1.11 → painapple_code-1.2.2}/src/painapple_code/static/js/keyboard-bar.js +0 -0
  322. {painapple_code-1.1.11 → painapple_code-1.2.2}/src/painapple_code/static/js/layout-switcher.js +0 -0
  323. {painapple_code-1.1.11 → painapple_code-1.2.2}/src/painapple_code/static/js/linkify-utils.js +0 -0
  324. {painapple_code-1.1.11 → painapple_code-1.2.2}/src/painapple_code/static/js/login.js +0 -0
  325. {painapple_code-1.1.11 → painapple_code-1.2.2}/src/painapple_code/static/js/open-dialog.js +0 -0
  326. {painapple_code-1.1.11 → painapple_code-1.2.2}/src/painapple_code/static/js/orphan-terminals.js +0 -0
  327. {painapple_code-1.1.11 → painapple_code-1.2.2}/src/painapple_code/static/js/path-utils.js +0 -0
  328. {painapple_code-1.1.11 → painapple_code-1.2.2}/src/painapple_code/static/js/perf-marks.js +0 -0
  329. {painapple_code-1.1.11 → painapple_code-1.2.2}/src/painapple_code/static/js/permission-settings.js +0 -0
  330. {painapple_code-1.1.11 → painapple_code-1.2.2}/src/painapple_code/static/js/pointer-input.js +0 -0
  331. {painapple_code-1.1.11 → painapple_code-1.2.2}/src/painapple_code/static/js/preview/json-tree-menu.js +0 -0
  332. {painapple_code-1.1.11 → painapple_code-1.2.2}/src/painapple_code/static/js/preview/json-tree-toolbar.js +0 -0
  333. {painapple_code-1.1.11 → painapple_code-1.2.2}/src/painapple_code/static/js/preview/json-tree.js +0 -0
  334. {painapple_code-1.1.11 → painapple_code-1.2.2}/src/painapple_code/static/js/preview/preview-breadcrumb.js +0 -0
  335. {painapple_code-1.1.11 → painapple_code-1.2.2}/src/painapple_code/static/js/preview/preview-edit.js +0 -0
  336. {painapple_code-1.1.11 → painapple_code-1.2.2}/src/painapple_code/static/js/preview/preview-events.js +0 -0
  337. {painapple_code-1.1.11 → painapple_code-1.2.2}/src/painapple_code/static/js/preview/preview-history.js +0 -0
  338. {painapple_code-1.1.11 → painapple_code-1.2.2}/src/painapple_code/static/js/preview/preview-inline-edit.js +0 -0
  339. {painapple_code-1.1.11 → painapple_code-1.2.2}/src/painapple_code/static/js/preview/preview-poll.js +0 -0
  340. {painapple_code-1.1.11 → painapple_code-1.2.2}/src/painapple_code/static/js/preview/preview-render.js +0 -0
  341. {painapple_code-1.1.11 → painapple_code-1.2.2}/src/painapple_code/static/js/preview/preview-search.js +0 -0
  342. {painapple_code-1.1.11 → painapple_code-1.2.2}/src/painapple_code/static/js/preview/preview-state.js +0 -0
  343. {painapple_code-1.1.11 → painapple_code-1.2.2}/src/painapple_code/static/js/preview/preview-utils.js +0 -0
  344. {painapple_code-1.1.11 → painapple_code-1.2.2}/src/painapple_code/static/js/preview-plugins/chart-plugin.js +0 -0
  345. {painapple_code-1.1.11 → painapple_code-1.2.2}/src/painapple_code/static/js/preview-plugins/csv-plugin.js +0 -0
  346. {painapple_code-1.1.11 → painapple_code-1.2.2}/src/painapple_code/static/js/preview-plugins/diff-plugin.js +0 -0
  347. {painapple_code-1.1.11 → painapple_code-1.2.2}/src/painapple_code/static/js/preview-plugins/excalidraw-plugin.js +0 -0
  348. {painapple_code-1.1.11 → painapple_code-1.2.2}/src/painapple_code/static/js/preview-plugins/html-plugin.js +0 -0
  349. {painapple_code-1.1.11 → painapple_code-1.2.2}/src/painapple_code/static/js/preview-plugins/image-plugin.js +0 -0
  350. {painapple_code-1.1.11 → painapple_code-1.2.2}/src/painapple_code/static/js/preview-plugins/index.js +0 -0
  351. {painapple_code-1.1.11 → painapple_code-1.2.2}/src/painapple_code/static/js/preview-plugins/json-plugin.js +0 -0
  352. {painapple_code-1.1.11 → painapple_code-1.2.2}/src/painapple_code/static/js/preview-plugins/jsonl-plugin.js +0 -0
  353. {painapple_code-1.1.11 → painapple_code-1.2.2}/src/painapple_code/static/js/preview-plugins/markdown-plugin.js +0 -0
  354. {painapple_code-1.1.11 → painapple_code-1.2.2}/src/painapple_code/static/js/preview-plugins/panzoom-plugin.js +0 -0
  355. {painapple_code-1.1.11 → painapple_code-1.2.2}/src/painapple_code/static/js/preview-plugins/plugin-helpers.js +0 -0
  356. {painapple_code-1.1.11 → painapple_code-1.2.2}/src/painapple_code/static/js/project-color-picker.js +0 -0
  357. {painapple_code-1.1.11 → painapple_code-1.2.2}/src/painapple_code/static/js/project-colors.js +0 -0
  358. {painapple_code-1.1.11 → painapple_code-1.2.2}/src/painapple_code/static/js/prompt-favorites.js +0 -0
  359. {painapple_code-1.1.11 → painapple_code-1.2.2}/src/painapple_code/static/js/quick-actions-menu.js +0 -0
  360. {painapple_code-1.1.11 → painapple_code-1.2.2}/src/painapple_code/static/js/quick-switcher/controller.js +0 -0
  361. {painapple_code-1.1.11 → painapple_code-1.2.2}/src/painapple_code/static/js/quick-switcher/fuzzy-scorer.js +0 -0
  362. {painapple_code-1.1.11 → painapple_code-1.2.2}/src/painapple_code/static/js/quick-switcher/index.js +0 -0
  363. {painapple_code-1.1.11 → painapple_code-1.2.2}/src/painapple_code/static/js/quick-switcher/providers/base-provider.js +0 -0
  364. {painapple_code-1.1.11 → painapple_code-1.2.2}/src/painapple_code/static/js/quick-switcher/providers/command-provider.js +0 -0
  365. {painapple_code-1.1.11 → painapple_code-1.2.2}/src/painapple_code/static/js/quick-switcher/providers/file-provider.js +0 -0
  366. {painapple_code-1.1.11 → painapple_code-1.2.2}/src/painapple_code/static/js/quick-switcher/providers/panel-provider.js +0 -0
  367. {painapple_code-1.1.11 → painapple_code-1.2.2}/src/painapple_code/static/js/quick-switcher/providers/project-provider.js +0 -0
  368. {painapple_code-1.1.11 → painapple_code-1.2.2}/src/painapple_code/static/js/quick-switcher/providers/read-files-provider.js +0 -0
  369. {painapple_code-1.1.11 → painapple_code-1.2.2}/src/painapple_code/static/js/quick-switcher/providers/skills-provider.js +0 -0
  370. {painapple_code-1.1.11 → painapple_code-1.2.2}/src/painapple_code/static/js/quick-switcher/registry.js +0 -0
  371. {painapple_code-1.1.11 → painapple_code-1.2.2}/src/painapple_code/static/js/quick-switcher/ui/item.js +0 -0
  372. {painapple_code-1.1.11 → painapple_code-1.2.2}/src/painapple_code/static/js/quick-switcher/ui/picker.js +0 -0
  373. {painapple_code-1.1.11 → painapple_code-1.2.2}/src/painapple_code/static/js/recent-opens.js +0 -0
  374. {painapple_code-1.1.11 → painapple_code-1.2.2}/src/painapple_code/static/js/scroll-manager.js +0 -0
  375. {painapple_code-1.1.11 → painapple_code-1.2.2}/src/painapple_code/static/js/scroll-state-machine.js +0 -0
  376. {painapple_code-1.1.11 → painapple_code-1.2.2}/src/painapple_code/static/js/selection/action-bar.js +0 -0
  377. {painapple_code-1.1.11 → painapple_code-1.2.2}/src/painapple_code/static/js/selection/index.js +0 -0
  378. {painapple_code-1.1.11 → painapple_code-1.2.2}/src/painapple_code/static/js/selection/selection-handler.js +0 -0
  379. {painapple_code-1.1.11 → painapple_code-1.2.2}/src/painapple_code/static/js/selection/state.js +0 -0
  380. {painapple_code-1.1.11 → painapple_code-1.2.2}/src/painapple_code/static/js/session/agent-progress.js +0 -0
  381. {painapple_code-1.1.11 → painapple_code-1.2.2}/src/painapple_code/static/js/session/handle-agent-message.js +0 -0
  382. {painapple_code-1.1.11 → painapple_code-1.2.2}/src/painapple_code/static/js/session/handle-message.js +0 -0
  383. {painapple_code-1.1.11 → painapple_code-1.2.2}/src/painapple_code/static/js/session/interactive.js +0 -0
  384. {painapple_code-1.1.11 → painapple_code-1.2.2}/src/painapple_code/static/js/session/message-store.js +0 -0
  385. {painapple_code-1.1.11 → painapple_code-1.2.2}/src/painapple_code/static/js/session/messages.js +0 -0
  386. {painapple_code-1.1.11 → painapple_code-1.2.2}/src/painapple_code/static/js/session/persistence.js +0 -0
  387. {painapple_code-1.1.11 → painapple_code-1.2.2}/src/painapple_code/static/js/session/restore.js +0 -0
  388. {painapple_code-1.1.11 → painapple_code-1.2.2}/src/painapple_code/static/js/session/sync.js +0 -0
  389. {painapple_code-1.1.11 → painapple_code-1.2.2}/src/painapple_code/static/js/session-container-pool.js +0 -0
  390. {painapple_code-1.1.11 → painapple_code-1.2.2}/src/painapple_code/static/js/session-setup-panel.js +0 -0
  391. {painapple_code-1.1.11 → painapple_code-1.2.2}/src/painapple_code/static/js/session.js +0 -0
  392. {painapple_code-1.1.11 → painapple_code-1.2.2}/src/painapple_code/static/js/shortcut-hints.js +0 -0
  393. {painapple_code-1.1.11 → painapple_code-1.2.2}/src/painapple_code/static/js/shortcuts.js +0 -0
  394. {painapple_code-1.1.11 → painapple_code-1.2.2}/src/painapple_code/static/js/skills-autocomplete.js +0 -0
  395. {painapple_code-1.1.11 → painapple_code-1.2.2}/src/painapple_code/static/js/snippets-autocomplete.js +0 -0
  396. {painapple_code-1.1.11 → painapple_code-1.2.2}/src/painapple_code/static/js/stash-refs-view.js +0 -0
  397. {painapple_code-1.1.11 → painapple_code-1.2.2}/src/painapple_code/static/js/stash-ui.js +0 -0
  398. {painapple_code-1.1.11 → painapple_code-1.2.2}/src/painapple_code/static/js/stash.js +0 -0
  399. {painapple_code-1.1.11 → painapple_code-1.2.2}/src/painapple_code/static/js/token-profile.js +0 -0
  400. {painapple_code-1.1.11 → painapple_code-1.2.2}/src/painapple_code/static/js/tool-renderer-blocks.js +0 -0
  401. {painapple_code-1.1.11 → painapple_code-1.2.2}/src/painapple_code/static/js/tool-renderer-thinking.js +0 -0
  402. {painapple_code-1.1.11 → painapple_code-1.2.2}/src/painapple_code/static/js/tool-renderer.js +0 -0
  403. {painapple_code-1.1.11 → painapple_code-1.2.2}/src/painapple_code/static/js/tooltips.js +0 -0
  404. {painapple_code-1.1.11 → painapple_code-1.2.2}/src/painapple_code/static/js/upload-manager.js +0 -0
  405. {painapple_code-1.1.11 → painapple_code-1.2.2}/src/painapple_code/static/js/utils.js +0 -0
  406. {painapple_code-1.1.11 → painapple_code-1.2.2}/src/painapple_code/static/js/welcome/api.js +0 -0
  407. {painapple_code-1.1.11 → painapple_code-1.2.2}/src/painapple_code/static/js/welcome/cards.js +0 -0
  408. {painapple_code-1.1.11 → painapple_code-1.2.2}/src/painapple_code/static/js/welcome/context-menu.js +0 -0
  409. {painapple_code-1.1.11 → painapple_code-1.2.2}/src/painapple_code/static/js/welcome/families.js +0 -0
  410. {painapple_code-1.1.11 → painapple_code-1.2.2}/src/painapple_code/static/js/welcome/preview.js +0 -0
  411. {painapple_code-1.1.11 → painapple_code-1.2.2}/src/painapple_code/static/js/welcome/state.js +0 -0
  412. {painapple_code-1.1.11 → painapple_code-1.2.2}/src/painapple_code/static/js/welcome.js +0 -0
  413. {painapple_code-1.1.11 → painapple_code-1.2.2}/src/painapple_code/static/js/widget-system/base-widget.js +0 -0
  414. {painapple_code-1.1.11 → painapple_code-1.2.2}/src/painapple_code/static/js/widget-system/device-manager.js +0 -0
  415. {painapple_code-1.1.11 → painapple_code-1.2.2}/src/painapple_code/static/js/widget-system/event-bus.js +0 -0
  416. {painapple_code-1.1.11 → painapple_code-1.2.2}/src/painapple_code/static/js/widget-system/icons.js +0 -0
  417. {painapple_code-1.1.11 → painapple_code-1.2.2}/src/painapple_code/static/js/widget-system/index.js +0 -0
  418. {painapple_code-1.1.11 → painapple_code-1.2.2}/src/painapple_code/static/js/widget-system/init.js +0 -0
  419. {painapple_code-1.1.11 → painapple_code-1.2.2}/src/painapple_code/static/js/widget-system/types/bottom-sheet.js +0 -0
  420. {painapple_code-1.1.11 → painapple_code-1.2.2}/src/painapple_code/static/js/widget-system/types/floating.js +0 -0
  421. {painapple_code-1.1.11 → painapple_code-1.2.2}/src/painapple_code/static/js/widget-system/types/index.js +0 -0
  422. {painapple_code-1.1.11 → painapple_code-1.2.2}/src/painapple_code/static/js/widget-system/types/modal.js +0 -0
  423. {painapple_code-1.1.11 → painapple_code-1.2.2}/src/painapple_code/static/js/widget-system/types/sidebar.js +0 -0
  424. {painapple_code-1.1.11 → painapple_code-1.2.2}/src/painapple_code/static/js/widget-system/types/tab.js +0 -0
  425. {painapple_code-1.1.11 → painapple_code-1.2.2}/src/painapple_code/static/js/widget-system/types/top-sheet.js +0 -0
  426. {painapple_code-1.1.11 → painapple_code-1.2.2}/src/painapple_code/static/js/widget-system/widget-manager.js +0 -0
  427. {painapple_code-1.1.11 → painapple_code-1.2.2}/src/painapple_code/static/js/widgets/about-widget.js +0 -0
  428. {painapple_code-1.1.11 → painapple_code-1.2.2}/src/painapple_code/static/js/widgets/active-sessions-widget.js +0 -0
  429. {painapple_code-1.1.11 → painapple_code-1.2.2}/src/painapple_code/static/js/widgets/agents-widget.js +0 -0
  430. {painapple_code-1.1.11 → painapple_code-1.2.2}/src/painapple_code/static/js/widgets/browser-widget.js +0 -0
  431. {painapple_code-1.1.11 → painapple_code-1.2.2}/src/painapple_code/static/js/widgets/commands-widget.js +0 -0
  432. {painapple_code-1.1.11 → painapple_code-1.2.2}/src/painapple_code/static/js/widgets/config/commit-sections.js +0 -0
  433. {painapple_code-1.1.11 → painapple_code-1.2.2}/src/painapple_code/static/js/widgets/config/dir-autocomplete.js +0 -0
  434. {painapple_code-1.1.11 → painapple_code-1.2.2}/src/painapple_code/static/js/widgets/config/gestures.js +0 -0
  435. {painapple_code-1.1.11 → painapple_code-1.2.2}/src/painapple_code/static/js/widgets/config/quick-actions-tab.js +0 -0
  436. {painapple_code-1.1.11 → painapple_code-1.2.2}/src/painapple_code/static/js/widgets/config/shortcut-editor.js +0 -0
  437. {painapple_code-1.1.11 → painapple_code-1.2.2}/src/painapple_code/static/js/widgets/config/state.js +0 -0
  438. {painapple_code-1.1.11 → painapple_code-1.2.2}/src/painapple_code/static/js/widgets/config/system-controls.js +0 -0
  439. {painapple_code-1.1.11 → painapple_code-1.2.2}/src/painapple_code/static/js/widgets/config-widget.js +0 -0
  440. {painapple_code-1.1.11 → painapple_code-1.2.2}/src/painapple_code/static/js/widgets/cost-analytics-widget.js +0 -0
  441. {painapple_code-1.1.11 → painapple_code-1.2.2}/src/painapple_code/static/js/widgets/debug-widget.js +0 -0
  442. {painapple_code-1.1.11 → painapple_code-1.2.2}/src/painapple_code/static/js/widgets/diff-viewer-widget.js +0 -0
  443. {painapple_code-1.1.11 → painapple_code-1.2.2}/src/painapple_code/static/js/widgets/discussion-widget.js +0 -0
  444. {painapple_code-1.1.11 → painapple_code-1.2.2}/src/painapple_code/static/js/widgets/file-explorer-widget.js +0 -0
  445. {painapple_code-1.1.11 → painapple_code-1.2.2}/src/painapple_code/static/js/widgets/file-preview-widget.js +0 -0
  446. {painapple_code-1.1.11 → painapple_code-1.2.2}/src/painapple_code/static/js/widgets/git-widget.js +0 -0
  447. {painapple_code-1.1.11 → painapple_code-1.2.2}/src/painapple_code/static/js/widgets/helpers-install-widget.js +0 -0
  448. {painapple_code-1.1.11 → painapple_code-1.2.2}/src/painapple_code/static/js/widgets/history-explorer-widget.js +0 -0
  449. {painapple_code-1.1.11 → painapple_code-1.2.2}/src/painapple_code/static/js/widgets/image-annotate-widget.js +0 -0
  450. {painapple_code-1.1.11 → painapple_code-1.2.2}/src/painapple_code/static/js/widgets/image-preview-widget.js +0 -0
  451. {painapple_code-1.1.11 → painapple_code-1.2.2}/src/painapple_code/static/js/widgets/log-explorer-widget.js +0 -0
  452. {painapple_code-1.1.11 → painapple_code-1.2.2}/src/painapple_code/static/js/widgets/plugins-widget.js +0 -0
  453. {painapple_code-1.1.11 → painapple_code-1.2.2}/src/painapple_code/static/js/widgets/prompt-explorer-widget.js +0 -0
  454. {painapple_code-1.1.11 → painapple_code-1.2.2}/src/painapple_code/static/js/widgets/search-files-widget.js +0 -0
  455. {painapple_code-1.1.11 → painapple_code-1.2.2}/src/painapple_code/static/js/widgets/skills-widget.js +0 -0
  456. {painapple_code-1.1.11 → painapple_code-1.2.2}/src/painapple_code/static/js/widgets/snippets-widget.js +0 -0
  457. {painapple_code-1.1.11 → painapple_code-1.2.2}/src/painapple_code/static/js/widgets/sub-agents-widget.js +0 -0
  458. {painapple_code-1.1.11 → painapple_code-1.2.2}/src/painapple_code/static/js/widgets/tasks-widget.js +0 -0
  459. {painapple_code-1.1.11 → painapple_code-1.2.2}/src/painapple_code/static/js/widgets/terminal/connection.js +0 -0
  460. {painapple_code-1.1.11 → painapple_code-1.2.2}/src/painapple_code/static/js/widgets/terminal/gestures.js +0 -0
  461. {painapple_code-1.1.11 → painapple_code-1.2.2}/src/painapple_code/static/js/widgets/terminal/init.js +0 -0
  462. {painapple_code-1.1.11 → painapple_code-1.2.2}/src/painapple_code/static/js/widgets/terminal/link-providers.js +0 -0
  463. {painapple_code-1.1.11 → painapple_code-1.2.2}/src/painapple_code/static/js/widgets/terminal/osc52.js +0 -0
  464. {painapple_code-1.1.11 → painapple_code-1.2.2}/src/painapple_code/static/js/widgets/terminal/render.js +0 -0
  465. {painapple_code-1.1.11 → painapple_code-1.2.2}/src/painapple_code/static/js/widgets/terminal/size.js +0 -0
  466. {painapple_code-1.1.11 → painapple_code-1.2.2}/src/painapple_code/static/js/widgets/terminal/state.js +0 -0
  467. {painapple_code-1.1.11 → painapple_code-1.2.2}/src/painapple_code/static/js/widgets/terminal/wrap-utils.js +0 -0
  468. {painapple_code-1.1.11 → painapple_code-1.2.2}/src/painapple_code/static/js/widgets/terminal-widget.js +0 -0
  469. {painapple_code-1.1.11 → painapple_code-1.2.2}/src/painapple_code/static/js/widgets/uploads-widget.js +0 -0
  470. {painapple_code-1.1.11 → painapple_code-1.2.2}/src/painapple_code/static/js/widgets/zen-widget.js +0 -0
  471. {painapple_code-1.1.11 → painapple_code-1.2.2}/src/painapple_code/static/login.html +0 -0
  472. {painapple_code-1.1.11 → painapple_code-1.2.2}/src/painapple_code/static/manifest.json +0 -0
  473. {painapple_code-1.1.11 → painapple_code-1.2.2}/src/painapple_code/static/sw.js +0 -0
  474. {painapple_code-1.1.11 → painapple_code-1.2.2}/src/painapple_code/static/vendor/LICENSES.txt +0 -0
  475. {painapple_code-1.1.11 → painapple_code-1.2.2}/src/painapple_code/static/vendor/README.md +0 -0
  476. {painapple_code-1.1.11 → painapple_code-1.2.2}/src/painapple_code/static/vendor/codemirror.js +0 -0
  477. {painapple_code-1.1.11 → painapple_code-1.2.2}/src/painapple_code/static/vendor/codemirror.js.LEGAL.txt +0 -0
  478. {painapple_code-1.1.11 → painapple_code-1.2.2}/src/painapple_code/static/vendor/github-markdown-dark.min.css +0 -0
  479. {painapple_code-1.1.11 → painapple_code-1.2.2}/src/painapple_code/static/vendor/highlight-github-dark.min.css +0 -0
  480. {painapple_code-1.1.11 → painapple_code-1.2.2}/src/painapple_code/static/vendor/highlight-lang-dockerfile.min.js +0 -0
  481. {painapple_code-1.1.11 → painapple_code-1.2.2}/src/painapple_code/static/vendor/highlight-lang-nginx.min.js +0 -0
  482. {painapple_code-1.1.11 → painapple_code-1.2.2}/src/painapple_code/static/vendor/highlight-lang-properties.min.js +0 -0
  483. {painapple_code-1.1.11 → painapple_code-1.2.2}/src/painapple_code/static/vendor/highlight-lang-scala.min.js +0 -0
  484. {painapple_code-1.1.11 → painapple_code-1.2.2}/src/painapple_code/static/vendor/highlight.min.js +0 -0
  485. {painapple_code-1.1.11 → painapple_code-1.2.2}/src/painapple_code/static/vendor/marked.min.js +0 -0
  486. {painapple_code-1.1.11 → painapple_code-1.2.2}/src/painapple_code/static/vendor/mermaid.js +0 -0
  487. {painapple_code-1.1.11 → painapple_code-1.2.2}/src/painapple_code/static/vendor/mermaid.js.LEGAL.txt +0 -0
  488. {painapple_code-1.1.11 → painapple_code-1.2.2}/src/painapple_code/static/vendor/purify.min.js +0 -0
  489. {painapple_code-1.1.11 → painapple_code-1.2.2}/src/painapple_code/static/vendor/xterm-addon-fit.js +0 -0
  490. {painapple_code-1.1.11 → painapple_code-1.2.2}/src/painapple_code/static/vendor/xterm.css +0 -0
  491. {painapple_code-1.1.11 → painapple_code-1.2.2}/src/painapple_code/static/vendor/xterm.js +0 -0
  492. {painapple_code-1.1.11 → painapple_code-1.2.2}/src/painapple_code/static/web-client.html +0 -0
  493. {painapple_code-1.1.11 → painapple_code-1.2.2}/src/painapple_code/subprocess_registry.py +0 -0
  494. {painapple_code-1.1.11 → painapple_code-1.2.2}/src/painapple_code/tls_cert.py +0 -0
  495. {painapple_code-1.1.11 → painapple_code-1.2.2}/src/painapple_code/tools/agents/shadow-db-helper.md +0 -0
  496. {painapple_code-1.1.11 → painapple_code-1.2.2}/src/painapple_code/tools/agents/shadow-git-helper.md +0 -0
  497. {painapple_code-1.1.11 → painapple_code-1.2.2}/src/painapple_code/tools/excalidraw-to-svg.js +0 -0
  498. {painapple_code-1.1.11 → painapple_code-1.2.2}/src/painapple_code/tools/install-helpers.sh +0 -0
  499. {painapple_code-1.1.11 → painapple_code-1.2.2}/src/painapple_code/tools/shadow-git +0 -0
  500. {painapple_code-1.1.11 → painapple_code-1.2.2}/src/painapple_code/tools/shadow-query +0 -0
  501. {painapple_code-1.1.11 → painapple_code-1.2.2}/src/painapple_code/tools/term-bin/pbcopy +0 -0
  502. {painapple_code-1.1.11 → painapple_code-1.2.2}/src/painapple_code/tools/vegalite-to-svg.js +0 -0
  503. {painapple_code-1.1.11 → painapple_code-1.2.2}/src/painapple_code/turn_query.py +0 -0
  504. {painapple_code-1.1.11 → painapple_code-1.2.2}/src/painapple_code/turn_tracker.py +0 -0
  505. {painapple_code-1.1.11 → painapple_code-1.2.2}/src/painapple_code/uploads_store.py +0 -0
  506. {painapple_code-1.1.11 → painapple_code-1.2.2}/src/painapple_code/utils/__init__.py +0 -0
  507. {painapple_code-1.1.11 → painapple_code-1.2.2}/src/painapple_code/utils/bash_file_ops.py +0 -0
  508. {painapple_code-1.1.11 → painapple_code-1.2.2}/src/painapple_code/utils/chart.py +0 -0
  509. {painapple_code-1.1.11 → painapple_code-1.2.2}/src/painapple_code/utils/excalidraw.py +0 -0
  510. {painapple_code-1.1.11 → painapple_code-1.2.2}/src/painapple_code/utils/file_lock.py +0 -0
  511. {painapple_code-1.1.11 → painapple_code-1.2.2}/src/painapple_code/utils/file_paths.py +0 -0
  512. {painapple_code-1.1.11 → painapple_code-1.2.2}/src/painapple_code/utils/generate_icons.py +0 -0
  513. {painapple_code-1.1.11 → painapple_code-1.2.2}/src/painapple_code/utils/proc.py +0 -0
  514. {painapple_code-1.1.11 → painapple_code-1.2.2}/src/painapple_code/utils/pty_backend.py +0 -0
  515. {painapple_code-1.1.11 → painapple_code-1.2.2}/src/painapple_code/utils/pty_posix.py +0 -0
  516. {painapple_code-1.1.11 → painapple_code-1.2.2}/src/painapple_code/utils/pty_windows.py +0 -0
  517. {painapple_code-1.1.11 → painapple_code-1.2.2}/src/painapple_code/utils/token_profiles.py +0 -0
  518. {painapple_code-1.1.11 → painapple_code-1.2.2}/src/painapple_code/viewer_templates.py +0 -0
  519. {painapple_code-1.1.11 → painapple_code-1.2.2}/src/painapple_code/welcome_search.py +0 -0
  520. {painapple_code-1.1.11 → painapple_code-1.2.2}/src/painapple_code.egg-info/dependency_links.txt +0 -0
  521. {painapple_code-1.1.11 → painapple_code-1.2.2}/src/painapple_code.egg-info/entry_points.txt +0 -0
  522. {painapple_code-1.1.11 → painapple_code-1.2.2}/src/painapple_code.egg-info/requires.txt +0 -0
  523. {painapple_code-1.1.11 → painapple_code-1.2.2}/src/painapple_code.egg-info/top_level.txt +0 -0
  524. {painapple_code-1.1.11 → painapple_code-1.2.2}/start.sh +0 -0
@@ -2,6 +2,38 @@
2
2
 
3
3
  Notable changes are documented here per release. The format follows [Keep a Changelog](https://keepachangelog.com/en/1.1.0/); versions follow [SemVer](https://semver.org/), and the git tag is the single source of truth for the version (the PyPI wheel, the Docker image tag, and `__version__` all derive from it).
4
4
 
5
+ ## 1.2.2 — 2026-10-26
6
+
7
+ ### Fixed
8
+
9
+ - Long Codex sessions can be resumed again. Before, resuming a large Codex thread (including via `/goal resume`) failed with "Line exceeds maximum size of 10485760 bytes", and every retry failed the same way. The resume no longer pulls the whole thread history in one message. If an oversized message ever does arrive, the session now skips it with a notice instead of ending.
10
+
11
+ ## 1.2.1 — 2026-10-18
12
+
13
+ ### Added
14
+
15
+ - Settings → Providers has a new **Environment** section in each provider's panel. Use it to set extra environment variables for everything that provider's CLI runs: chat, auto-journal and the context probe. Each variable has its own enable toggle. New sessions use a change right away, and open sessions pick it up on their next message, with no server restart. Claude offers `CLAUDE_CODE_DISABLE_INLINE_SHELL_RM_PROMPT=1` as a suggested row, disabled until you tick it. Variables the app manages itself, such as the account token and `PAINAPPLE_*`, can't be overridden. Once any value is stored, the server config file becomes readable only by its owner.
16
+
17
+ ### Changed
18
+
19
+ - When you hover a web link in chat or in a Markdown preview, the tooltip now shows the full URL.
20
+
21
+ ### Fixed
22
+
23
+ - In YOLO mode, Claude Code CLI safety checks that need explicit approval (for example, 2.1.299+'s prompt for `bash -c` scripts that run `rm`) now show an approve/deny card. Before, they failed as "blocked by YOLO permission mode".
24
+
25
+ ## 1.2.0 — 2026-10-14
26
+
27
+ ### Added
28
+
29
+ - When an enabled agent CLI is older than the version pAInapple Code needs, a popup now says so on load. It shows the installed and minimum versions and what breaks below the minimum, and has an **Update in terminal** button that runs `claude update` in a terminal tab and confirms when it's done. You can choose **Later** or **Don't show again for this version**. The same warning appears in the server log at startup and under the version line in Settings → Providers. It's also available as the "CLI Version Check" quick action.
30
+
31
+ ### Changed
32
+
33
+ - **Requires Claude Code CLI 2.1.293 or newer** for the default auto-journal model. Older CLIs reject Haiku 5.5, and journal summaries fail until you update.
34
+ - The auto-journal now uses Haiku 5.5 by default, replacing Haiku 4.5.
35
+ - The model picker adds Haiku 5.5 and drops Opus 5 (Opus 5.5 remains). Sessions that had Opus 5 selected fall back to the default model.
36
+
5
37
  ## 1.1.11 — 2026-10-14
6
38
 
7
39
  ### Fixed
@@ -1,6 +1,6 @@
1
1
  Metadata-Version: 2.4
2
2
  Name: painapple-code
3
- Version: 1.1.11
3
+ Version: 1.2.2
4
4
  Summary: Self-hosted remote UI for Claude Code that journals every turn - background AI summaries become shadow-git commits and a queryable DuckDB history
5
5
  Author-email: Michał Booth-Wrotkowski <michal@boothw.com>
6
6
  License-Expression: AGPL-3.0-or-later
@@ -7,7 +7,7 @@ Here's what you need before installing pAInapple Code, and a frank note on what
7
7
  Running the server directly on a host (pip / pipx / source checkout):
8
8
 
9
9
  - **Python 3.12+**
10
- - **[Claude Code CLI](https://github.com/anthropics/claude-code)** installed and authenticated — either a Claude subscription (`claude login`) or an Anthropic API key
10
+ - **[Claude Code CLI](https://github.com/anthropics/claude-code)** installed and authenticated — either a Claude subscription (`claude login`) or an Anthropic API key. **Version 2.1.293 or newer**: older CLIs don't know Haiku 5.5, the default auto-journal model. The app checks on startup and offers a one-click `claude update` when yours is behind.
11
11
  - **Git** on `PATH` — the [auto-journal](../guides/shadow-git.md) records every turn as a commit in a shadow repository, and the Git panel shells out to it for diffs. Without git the server still runs, but it journals nothing and the Git panel stays empty; you'll get a warning in the log at startup.
12
12
  - **Network access between client and server** — any modern browser works as a client
13
13
  - *Optional:* the **[OpenAI Codex CLI](https://github.com/openai/codex)** if you want sessions on the Codex [provider](../guides/providers.md) — you can even log it in from inside the app. **Codex support is experimental** — newer and less exercised than the Claude path.
@@ -61,6 +61,7 @@ While a goal exists, a **goal bar** sits above the input: status (Active, Paused
61
61
  - **Model catalog** — every model with a show/hide toggle (hidden models disappear from all pickers). Claude's catalog is fully editable (add/edit/delete, restore defaults); Codex's is read-only because the Codex CLI owns it.
62
62
  - **New Session Defaults** — that provider's default model, default effort (its own vocabulary), default permissions (its own modes — e.g. Codex Full access), and default account/token profile where applicable.
63
63
  - **Auto-journal model** — which model writes the [Shadow Git](shadow-git.md) summaries for sessions on this provider.
64
+ - <a id="environment"></a>**Environment** — extra environment variables for every process the provider's CLI runs (chat, auto-journal, context probe), each with an enable toggle. New sessions pick a change up immediately; open sessions restart their idle CLI on the next message — no server restart. Suggested rows ship disabled, one tick away: Claude lists `CLAUDE_CODE_DISABLE_INLINE_SHELL_RM_PROMPT=1`, which skips the approval prompt Claude Code 2.1.299+ shows for `bash -c` scripts that run `rm` it can't check (otherwise those commands stop for approval even in YOLO mode). Variables the app manages itself (the account token, `PAINAPPLE_*`) can't be overridden. Values are stored in the server config, which becomes owner-readable only once it holds any.
64
65
 
65
66
  ## Related
66
67
 
@@ -18,7 +18,7 @@ version_tuple: tuple[int | str, ...]
18
18
  commit_id: str | None
19
19
  __commit_id__: str | None
20
20
 
21
- __version__ = version = '1.1.11'
22
- __version_tuple__ = version_tuple = (1, 1, 11)
21
+ __version__ = version = '1.2.2'
22
+ __version_tuple__ = version_tuple = (1, 2, 2)
23
23
 
24
- __commit_id__ = commit_id = 'ge43a938'
24
+ __commit_id__ = commit_id = 'g155ac61'
@@ -9,10 +9,10 @@ selectable:
9
9
  - id: claude-opus-5-5[1m]
10
10
  label: Opus 5.5 (1M)
11
11
  desc: Long-running agentic coding and knowledge work
12
- - id: claude-opus-5[1m]
13
- label: Opus 5 (1M)
14
- desc: Previous Opus tier (1M context)
15
12
  - id: claude-fable-5-1[1m]
16
13
  label: Fable 5.1
17
14
  desc: Most capable, premium cost
18
- summary_model: claude-haiku-4-5
15
+ - id: claude-haiku-5-5
16
+ label: Haiku 5.5
17
+ desc: Fastest and cheapest, 1M context
18
+ summary_model: claude-haiku-5-5
@@ -9,10 +9,10 @@ selectable:
9
9
  - id: claude-opus-5-5[1m]
10
10
  label: Opus 5.5 (1M)
11
11
  desc: Long-running agentic coding and knowledge work
12
- - id: claude-opus-5[1m]
13
- label: Opus 5 (1M)
14
- desc: Previous Opus tier (1M context)
15
12
  - id: claude-fable-5-1[1m]
16
13
  label: Fable 5.1
17
14
  desc: Most capable, premium cost
18
- summary_model: claude-haiku-4-5
15
+ - id: claude-haiku-5-5
16
+ label: Haiku 5.5
17
+ desc: Fastest and cheapest, 1M context
18
+ summary_model: claude-haiku-5-5
@@ -897,6 +897,7 @@ settings:
897
897
  provider_settings: "Provider Settings"
898
898
  provider_models: "Models"
899
899
  models_background: "Auto-journal Model"
900
+ provider_env: "Environment"
900
901
  # System tab
901
902
  sessions: "Sessions"
902
903
  permissions: "Permissions"
@@ -1098,6 +1099,7 @@ settings:
1098
1099
  provider_path_save: "Save"
1099
1100
  provider_path_reset: "Reset"
1100
1101
  provider_path_missing: "CLI not found"
1102
+ provider_version_too_old: "Older than the minimum supported version {min}"
1101
1103
  provider_models_readonly: "Model definitions come from the provider's own CLI. Use the toggles to choose which are listed in pickers."
1102
1104
  provider_models_empty: "No models reported yet — run this provider's CLI once to populate its catalog."
1103
1105
  provider_model_toggle_title: "Show or hide this model in pickers"
@@ -1113,6 +1115,18 @@ settings:
1113
1115
  provider_default_permission_label: "Default permissions"
1114
1116
  provider_defaults_hint: "Used when a new session starts on this provider — every provider keeps its own defaults. Override per-session via the status-bar chips."
1115
1117
  provider_journal_hint: "Model for this provider's auto-journal fork — runs after each turn to write journal summaries, tags and decisions. Clear to use the provider's default."
1118
+ provider_env_hint: "Extra environment variables for every process this provider's CLI runs (chat, auto-journal, context probe). Tick a row to enable it. New sessions use it right away; open sessions pick it up on their next message. Values are stored in the server config, owner-readable only."
1119
+ provider_env_name_placeholder: "NAME"
1120
+ provider_env_value_placeholder: "value"
1121
+ provider_env_add_button: "Add"
1122
+ provider_env_toggle_title: "Enable or disable this variable"
1123
+ provider_env_delete_title: "Remove"
1124
+ provider_env_delete_armed: "Click again to remove"
1125
+ provider_env_suggested: "suggested"
1126
+ provider_env_name_invalid: "Variable names use letters, digits and _ and can't start with a digit"
1127
+ provider_env_name_dupe: "{name} is already in the list"
1128
+ provider_env_reserved: "{name} is managed by the app and can't be set here"
1129
+ provider_env_save_failed: "Couldn't save environment: {error}"
1116
1130
  thinking_hint: "Default thinking budget when creating new sessions. Can be changed per-session via the sparkle button."
1117
1131
  token_hint: "Generate with <code>claude setup-token</code>, save to <code>~/.config/painapple-code/tokens/&lt;name&gt;</code> (filename becomes the profile name). Can be overridden per-session."
1118
1132
  model_hint: "Preselects the model for new sessions on the default provider. Can be overridden per-session via the model chip in the status bar."
@@ -1794,6 +1808,7 @@ quick_actions_registry:
1794
1808
  settings: { label: "Settings", desc: "Open settings panel" }
1795
1809
  help: { label: "Help", desc: "Show keyboard shortcuts" }
1796
1810
  about: { label: "About", desc: "Version, license, and source code" }
1811
+ cli_version: { label: "CLI Version Check", desc: "Check agent CLIs against the minimum supported version" }
1797
1812
  send_message: { label: "Send", desc: "Send message to Claude" }
1798
1813
  stop: { label: "Stop", desc: "Stop Claude's response" }
1799
1814
  scroll_bottom: { label: "Scroll Down", desc: "Jump to latest message" }
@@ -1956,6 +1971,18 @@ models:
1956
1971
  # Pill is always visible — clicking opens a modal that explains the
1957
1972
  # auto-journal feature and offers install / update / reinstall.
1958
1973
  # ============================================================
1974
+ cli_version:
1975
+ title: "Agent CLI out of date"
1976
+ heading: "{name} CLI is out of date"
1977
+ versions: "Installed {version} · minimum supported {min}"
1978
+ reason_prefix: "Below that,"
1979
+ update_btn: "Update in terminal"
1980
+ later_btn: "Later"
1981
+ dont_show: "Don't show again for this version"
1982
+ terminal_tab: "Update {name}"
1983
+ updated_toast: "{name} CLI updated — all set"
1984
+ all_ok: "All agent CLIs are up to date."
1985
+
1959
1986
  helpers:
1960
1987
  pill:
1961
1988
  # The pill names the RECORDING state, not the helper-file state — a
@@ -681,7 +681,7 @@ def load_models_config() -> dict:
681
681
  global _models_cache, _models_mtime
682
682
  yaml_path = PACKAGE_DIR / "data" / "models.yaml"
683
683
  if not yaml_path.exists():
684
- return {"selectable": [], "summary_model": "claude-haiku-4-5"}
684
+ return {"selectable": [], "summary_model": "claude-haiku-5-5"}
685
685
  mtime = yaml_path.stat().st_mtime
686
686
  if mtime == _models_mtime and _models_cache:
687
687
  return _models_cache
@@ -696,7 +696,7 @@ def get_summary_model() -> str:
696
696
  """Model ID for shadow-git summary / auto-journal forks (Claude → Haiku)."""
697
697
  cfg = load_models_config()
698
698
  # Back-compat: the models.yaml key was `haiku:` before the rename.
699
- return cfg.get("summary_model") or cfg.get("haiku") or "claude-haiku-4-5"
699
+ return cfg.get("summary_model") or cfg.get("haiku") or "claude-haiku-5-5"
700
700
 
701
701
 
702
702
  def get_selectable_models() -> list:
@@ -708,7 +708,7 @@ def get_default_models_config() -> dict:
708
708
  """Load the pristine default model list from models.defaults.yaml."""
709
709
  yaml_path = PACKAGE_DIR / "data" / "models.defaults.yaml"
710
710
  if not yaml_path.exists():
711
- return {"selectable": [], "summary_model": "claude-haiku-4-5"}
711
+ return {"selectable": [], "summary_model": "claude-haiku-5-5"}
712
712
  import yaml
713
713
  with open(yaml_path, encoding="utf-8") as f:
714
714
  return yaml.safe_load(f) or {}
@@ -208,6 +208,44 @@ def all_providers() -> list[Provider]:
208
208
  return list(_PROVIDERS.values())
209
209
 
210
210
 
211
+ def stale_cli_versions(enabled: dict) -> list[dict]:
212
+ """Enabled+available providers whose CLI is below its `min_cli_version`.
213
+
214
+ `enabled` is ``dependencies.provider_enabled_map(app)``. Blocking — probes
215
+ `<cli> --version` per candidate; call off the event loop. Each entry is
216
+ ``{provider, display_name, version, min_version, reason, upgrade_hint,
217
+ update_command}`` (`update_command` = shell-quoted binary + the
218
+ provider's `cli_update_args`, or None).
219
+ """
220
+ from painapple_code.utils.proc import shell_join
221
+ out = []
222
+ for p in all_providers():
223
+ if not p.min_cli_version or not enabled.get(p.name):
224
+ continue
225
+ if not p.is_available()[0]:
226
+ continue
227
+ version = p.cli_version()
228
+ status = p.cli_version_status(version)
229
+ if status["version_ok"]:
230
+ continue
231
+ update = None
232
+ if p.cli_update_args:
233
+ try:
234
+ update = shell_join([p.binary(), *p.cli_update_args])
235
+ except Exception:
236
+ update = None
237
+ out.append({
238
+ "provider": p.name,
239
+ "display_name": p.display_name,
240
+ "version": version,
241
+ "min_version": p.min_cli_version,
242
+ "reason": status["reason"],
243
+ "upgrade_hint": status["upgrade_hint"],
244
+ "update_command": update,
245
+ })
246
+ return out
247
+
248
+
211
249
  def valid_permission_values() -> set[str]:
212
250
  """Every permission value any provider accepts — the union of every
213
251
  provider's registered ``permission_modes()`` (Claude included; it's just
@@ -19,6 +19,7 @@ so a single provider instance can be shared across all sessions.
19
19
  from __future__ import annotations
20
20
 
21
21
  import json
22
+ import os
22
23
  from abc import ABC, abstractmethod
23
24
  from dataclasses import dataclass, field
24
25
  from enum import Enum
@@ -178,6 +179,14 @@ class PluginBackend:
178
179
  marketplace_root: Optional[object] = None # Path for component inventory; None → skip
179
180
 
180
181
 
182
+ def _parse_version(text: Optional[str]) -> Optional[tuple]:
183
+ """First dotted number in `text` as an int tuple ("2.1.293 (Claude Code)"
184
+ → (2, 1, 293)); None when there isn't one."""
185
+ import re
186
+ m = re.search(r"\d+(?:\.\d+)+", text or "")
187
+ return tuple(int(x) for x in m.group(0).split(".")) if m else None
188
+
189
+
181
190
  class StderrClass(str, Enum):
182
191
  """Classification of a single stderr line. The session layer applies its
183
192
  own state gates (retry budget, etc.) on top of this pure-text verdict."""
@@ -213,6 +222,20 @@ class Provider(ABC):
213
222
  # same binary), so the setting edits the provider, not the driver.
214
223
  path_config_key: Optional[str] = None
215
224
  default_binary: str = ""
225
+ # Oldest CLI release this provider is known to work with. Checked (never
226
+ # enforced) at startup and in the Settings version row: an older CLI still
227
+ # launches, but a feature that needs the newer one fails — usually quietly,
228
+ # e.g. a default model the CLI rejects as unrecognized. None → no floor.
229
+ # `min_cli_version_reason` says what breaks below it; `cli_upgrade_hint` how
230
+ # to fix it. Compared numerically on the first dotted number in
231
+ # `<binary> --version` output; an unparseable version never warns.
232
+ min_cli_version: Optional[str] = None
233
+ min_cli_version_reason: str = ""
234
+ cli_upgrade_hint: str = ""
235
+ # The CLI's own self-update verb, appended to the binary (["update"] →
236
+ # `claude update`). The out-of-date popup runs it in a terminal tab; None
237
+ # → no one-click update, the popup shows `cli_upgrade_hint` only.
238
+ cli_update_args: Optional[list] = None
216
239
  # Copy-paste CLI hint for the "Continue in CLI" quick action: a shell
217
240
  # command template that resumes a session by id ("{id}" placeholder). Self-
218
241
  # described so the client never hardcodes a provider's resume verb (Claude
@@ -252,6 +275,16 @@ class Provider(ABC):
252
275
  # means for this provider (e.g. Codex inherits the session's model).
253
276
  summary_model_config_key: Optional[str] = None
254
277
  summary_model_placeholder: str = ""
278
+ # Extra environment for every CLI process this provider spawns (chat,
279
+ # summary fork, /context probe) — Settings → Providers → Environment.
280
+ # Stored in the global config's `provider_env` map under `models_key`
281
+ # (driver pairs share one CLI, so they share its env). `suggested_env`
282
+ # lists known knobs the panel offers as ready-made rows, DISABLED until
283
+ # the user ticks them: ``{"name", "value", "desc"}``. `reserved_env`
284
+ # names this provider's CLI that the app itself owns (e.g. the token
285
+ # profile's OAuth variable) — the user can't override those.
286
+ suggested_env: tuple = ()
287
+ reserved_env: frozenset = frozenset()
255
288
  capabilities: Capabilities = Capabilities()
256
289
 
257
290
  # --- launch -----------------------------------------------------------
@@ -526,6 +559,49 @@ class Provider(ABC):
526
559
  return False, f"{binary} not found on PATH"
527
560
  return True, None
528
561
 
562
+ def cli_version(self, resolved: Optional[str] = None, timeout: float = 5) -> Optional[str]:
563
+ """Raw `<binary> --version` output (stripped), or None if it can't run.
564
+
565
+ Blocking — callers on the event loop wrap it in ``asyncio.to_thread``.
566
+ `resolved` is a full path when the caller already resolved one (on
567
+ win32 a bare npm-shim name isn't spawnable, the shutil.which path is).
568
+ """
569
+ import shutil
570
+ import subprocess
571
+ from pathlib import Path
572
+ if resolved is None:
573
+ try:
574
+ binary = self.binary()
575
+ except Exception:
576
+ return None
577
+ resolved = binary if Path(binary).is_absolute() else shutil.which(binary)
578
+ if not resolved:
579
+ return None
580
+ try:
581
+ result = subprocess.run(
582
+ [resolved, "--version"], capture_output=True, text=True,
583
+ encoding="utf-8", errors="replace", timeout=timeout)
584
+ except Exception:
585
+ return None
586
+ return result.stdout.strip() if result.returncode == 0 else None
587
+
588
+ def cli_version_status(self, version_text: Optional[str]) -> dict:
589
+ """Compare probed `--version` output against `min_cli_version`.
590
+
591
+ ``{min_version, version_ok, reason, upgrade_hint}`` — ``version_ok`` is
592
+ False only when both sides parse and the CLI is older; no floor, no
593
+ probe, or an unparseable version all count as OK (never cry wolf).
594
+ """
595
+ found = _parse_version(version_text)
596
+ floor = _parse_version(self.min_cli_version)
597
+ ok = not (found and floor and found < floor)
598
+ return {
599
+ "min_version": self.min_cli_version,
600
+ "version_ok": ok,
601
+ "reason": None if ok else (self.min_cli_version_reason or None),
602
+ "upgrade_hint": None if ok else (self.cli_upgrade_hint or None),
603
+ }
604
+
529
605
  def parse_auth_status(self, returncode: int, stdout: str, stderr: str) -> dict:
530
606
  """Interpret the `auth_status_args` probe → ``{logged_in, detail}``.
531
607
 
@@ -615,6 +691,69 @@ class Provider(ABC):
615
691
  return self.models()
616
692
  return [m for m in self.models() if m.get("id") not in disabled]
617
693
 
694
+ # --- environment overrides (Settings → Providers → Environment) ----------
695
+
696
+ @property
697
+ def env_key(self) -> str:
698
+ """Namespace in the `provider_env` config map (shared by driver pairs)."""
699
+ return self.models_key or self.name
700
+
701
+ def env_reserved(self, name: str) -> bool:
702
+ """True when `name` is app-owned and can't be set by the user."""
703
+ return name.upper().startswith("PAINAPPLE_") or name in self.reserved_env
704
+
705
+ def env_entries(self) -> list[dict]:
706
+ """Stored env rows + not-yet-stored suggestions (disabled), in order.
707
+
708
+ Each row: ``{name, value, enabled, suggested, desc}``. A stored row
709
+ whose name matches a suggestion keeps the suggestion's description, so
710
+ a ticked suggestion still explains itself.
711
+ """
712
+ from painapple_code import paths
713
+ raw = (paths.load_global_config().get("provider_env") or {}).get(self.env_key)
714
+ suggestions = {s["name"]: s for s in self.suggested_env}
715
+ rows, seen = [], set()
716
+ for e in raw if isinstance(raw, list) else []:
717
+ if not isinstance(e, dict) or not isinstance(e.get("name"), str):
718
+ continue
719
+ name = e["name"]
720
+ if name in seen:
721
+ continue
722
+ seen.add(name)
723
+ s = suggestions.get(name)
724
+ rows.append({
725
+ "name": name,
726
+ "value": str(e.get("value") or ""),
727
+ "enabled": bool(e.get("enabled")),
728
+ "suggested": s is not None,
729
+ "desc": s.get("desc", "") if s else "",
730
+ })
731
+ for name, s in suggestions.items():
732
+ if name not in seen:
733
+ rows.append({"name": name, "value": s.get("value", ""),
734
+ "enabled": False, "suggested": True,
735
+ "desc": s.get("desc", "")})
736
+ return rows
737
+
738
+ def env_overrides(self) -> dict:
739
+ """The enabled, non-reserved rows as a ``{name: value}`` dict."""
740
+ return {e["name"]: e["value"] for e in self.env_entries()
741
+ if e["enabled"] and not self.env_reserved(e["name"])}
742
+
743
+ def apply_env(self, base: Optional[dict]) -> Optional[dict]:
744
+ """Layer `env_overrides()` onto a spawn env.
745
+
746
+ `base` follows the spawners' convention: None = inherit the server's
747
+ environment. Returns None again when there's nothing to add, so the
748
+ no-override path is byte-for-byte what it was.
749
+ """
750
+ overrides = self.env_overrides()
751
+ if not overrides:
752
+ return base
753
+ env = dict(base) if base is not None else os.environ.copy()
754
+ env.update(overrides)
755
+ return env
756
+
618
757
  def effort_levels(self) -> list[str]:
619
758
  """Effort levels this provider meaningfully distinguishes, low→high.
620
759
 
@@ -36,6 +36,31 @@ class _CapabilitiesMixin:
36
36
  # paste-back code, which works fine inside a PTY terminal tab.
37
37
  auth_status_args = ["auth", "status", "--json"]
38
38
  auth_login_args = ["auth", "login"]
39
+ # 2.1.293 is the first CLI that knows claude-haiku-5-5 (bisected: 2.1.292
40
+ # rejects it as unrecognized_model) — the shipped auto-journal default.
41
+ # npm's `stable` dist-tag lagged behind it at release, hence `@latest`.
42
+ min_cli_version = "2.1.293"
43
+ min_cli_version_reason = (
44
+ "it doesn't know Haiku 5.5, the default auto-journal model, so journal "
45
+ "summaries fail")
46
+ cli_upgrade_hint = (
47
+ "Run `claude update` or `npm install -g @anthropic-ai/claude-code@latest` "
48
+ "(no server restart needed — every fork spawns the CLI fresh).")
49
+ cli_update_args = ["update"]
50
+ # Settings → Providers → Environment. The token profile owns the OAuth
51
+ # variable; CLAUDECODE is stripped on purpose (nested-session guard).
52
+ reserved_env = frozenset({"CLAUDE_CODE_OAUTH_TOKEN", "CLAUDECODE"})
53
+ suggested_env = (
54
+ {
55
+ "name": "CLAUDE_CODE_DISABLE_INLINE_SHELL_RM_PROMPT",
56
+ "value": "1",
57
+ # CLI 2.1.29x asks before running a `bash -c` script whose rm
58
+ # targets it can't analyse — an ask YOLO can't auto-allow.
59
+ "desc": ("Skip the CLI's approval prompt for `bash -c` scripts that "
60
+ "run rm it can't check (CLI 2.1.299+). Without it, those "
61
+ "commands stop for approval even in YOLO mode."),
62
+ },
63
+ )
39
64
 
40
65
  def binary(self) -> str:
41
66
  return get_claude_binary()
@@ -60,7 +85,7 @@ class _CapabilitiesMixin:
60
85
  from painapple_code import paths
61
86
  cleaned = (value or "").strip() or (
62
87
  paths.get_default_models_config().get("summary_model")
63
- or "claude-haiku-4-5")
88
+ or "claude-haiku-5-5")
64
89
  paths.save_models_config({
65
90
  "selectable": paths.get_selectable_models(),
66
91
  "summary_model": cleaned,
@@ -135,6 +160,7 @@ class _CapabilitiesMixin:
135
160
  provider_session_id=session_id,
136
161
  token_profile=token_profile,
137
162
  model=model,
163
+ provider=self,
138
164
  )
139
165
 
140
166
  # --- customization roots (skills / agents / plugins) ------------------
@@ -41,8 +41,9 @@ class _SummaryMixin:
41
41
  from painapple_code.paths import get_summary_model
42
42
  from painapple_code.utils.token_profiles import build_env as build_token_env
43
43
 
44
- # Always plain haiku — the [1m] variant hangs with --fork-session from
45
- # opus[1m] sessions (every fork times out at 300s even for 30k context).
44
+ # Never a `[1m]`-suffixed id — that variant hung with --fork-session from
45
+ # opus[1m] sessions (every fork timed out at 300s even for 30k context).
46
+ # Haiku 5.5 is 1M-context natively, so the plain id needs no suffix.
46
47
  summary_model = get_summary_model()
47
48
  return SummaryForkPlan(
48
49
  argv=[
@@ -175,12 +175,24 @@ async def _amain(args: argparse.Namespace) -> int:
175
175
  interrupt=bool(resp.get("interrupt")),
176
176
  )
177
177
 
178
- # bypassPermissions (YOLO) auto-approves every tool call before can_use_tool
179
- # is ever consulted, so wiring the callback does nothing except trip the
180
- # SDK's CanUseToolShadowedWarning — which the server's stderr reader surfaces
181
- # as a scary (but harmless) error line. Only attach the permission gate for
182
- # modes that can actually prompt.
183
- gate = None if args.permission_mode == "bypassPermissions" else on_permission
178
+ # The gate is attached in EVERY mode, bypassPermissions (YOLO) included.
179
+ # Bypass auto-approves ordinary tool calls before can_use_tool is
180
+ # consulted, but CLI safety checks can still return "ask" decisions that
181
+ # no mode can auto-allow — e.g. 2.1.29x's dangerous-rm check on an
182
+ # uncheckable `bash -c` script ("requires explicit approval and cannot be
183
+ # auto-allowed"). With no gate attached, the headless CLI resolves such an
184
+ # ask as a denial, so YOLO sessions saw tool calls "blocked by YOLO
185
+ # permission mode". With the gate, the ask becomes an approve/deny card.
186
+ # The SDK warns (CanUseToolShadowedWarning) that bypass shadows the
187
+ # callback; that's expected here and the server's stderr reader would
188
+ # surface it as an error line, so silence it.
189
+ if args.permission_mode == "bypassPermissions":
190
+ import warnings
191
+ import claude_agent_sdk
192
+ shadowed = getattr(claude_agent_sdk, "CanUseToolShadowedWarning", None)
193
+ if shadowed is not None:
194
+ warnings.filterwarnings("ignore", category=shadowed)
195
+ gate = on_permission
184
196
 
185
197
  options = ClaudeAgentOptions(
186
198
  can_use_tool=gate,
@@ -231,11 +243,9 @@ async def _amain(args: argparse.Namespace) -> int:
231
243
  # `permission_prompt_tool_name="stdio"` injection (it only applies it to
232
244
  # the transport it would have built itself), so set it on the *transport's*
233
245
  # options copy here. It must NOT go on the client's options — the client
234
- # rejects it alongside `can_use_tool`. Pair it with the gate: in bypass mode
235
- # there's nothing to route to stdio, so keep that path a clean pass-through.
236
- transport_opts = dataclasses.replace(options, can_use_tool=None)
237
- if gate is not None:
238
- transport_opts = dataclasses.replace(transport_opts, permission_prompt_tool_name="stdio")
246
+ # rejects it alongside `can_use_tool`.
247
+ transport_opts = dataclasses.replace(
248
+ options, can_use_tool=None, permission_prompt_tool_name="stdio")
239
249
  transport = _make_tee_transport(transport_opts)
240
250
  client = ClaudeSDKClient(options=options, transport=transport)
241
251
  try:
@@ -89,6 +89,12 @@ class _LaunchMixin:
89
89
  "cwd": cwd,
90
90
  "sandbox": _SANDBOX_BY_MODE.get(opts.permission_mode or "", _DEFAULT_SANDBOX),
91
91
  "approvalPolicy": "never",
92
+ # Without it the RESPONSE carries the whole thread history
93
+ # (thread.turns with every item) on ONE stdout line — a long
94
+ # thread blew past the reader's 10 MiB line cap and killed the
95
+ # session on resume. The transport never reads those turns; the
96
+ # model context is unaffected.
97
+ "excludeTurns": True,
92
98
  }
93
99
  model = self._wire_model(opts.model)
94
100
  if model:
@@ -113,6 +119,9 @@ class _LaunchMixin:
113
119
  "cwd": cwd,
114
120
  "sandbox": _SANDBOX_BY_MODE.get(opts.permission_mode or "", _DEFAULT_SANDBOX),
115
121
  "approvalPolicy": "never",
122
+ # Same reason as thread_resume_params: keep the full history out
123
+ # of the single-line response. The fork still carries it.
124
+ "excludeTurns": True,
116
125
  }
117
126
  model = self._wire_model(opts.model)
118
127
  if model:
@@ -206,6 +206,9 @@ class JsonRpcTransport:
206
206
  try:
207
207
  await self._request("initialize", {
208
208
  "clientInfo": {"name": "painapple-code", "version": _client_version()},
209
+ # Required for `excludeTurns` on thread/resume + thread/fork
210
+ # (0.144 rejects the field without this opt-in).
211
+ "capabilities": {"experimentalApi": True},
209
212
  })
210
213
  await self._notify("initialized")
211
214
  self._initialized = True