painapple-code 1.1.0__tar.gz → 1.1.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 (515) hide show
  1. {painapple_code-1.1.0 → painapple_code-1.1.2}/CHANGELOG.md +21 -0
  2. {painapple_code-1.1.0/src/painapple_code.egg-info → painapple_code-1.1.2}/PKG-INFO +1 -1
  3. {painapple_code-1.1.0 → painapple_code-1.1.2}/docs-site/guides/terminal.md +4 -0
  4. {painapple_code-1.1.0 → painapple_code-1.1.2}/docs-site/reference/profiles.md +1 -1
  5. {painapple_code-1.1.0 → painapple_code-1.1.2}/docs-site/reference/server-cli.md +1 -1
  6. {painapple_code-1.1.0 → painapple_code-1.1.2}/src/painapple_code/_version.py +3 -3
  7. {painapple_code-1.1.0 → painapple_code-1.1.2}/src/painapple_code/auth_middleware.py +3 -0
  8. {painapple_code-1.1.0 → painapple_code-1.1.2}/src/painapple_code/cli/setup_cmd.py +34 -7
  9. {painapple_code-1.1.0 → painapple_code-1.1.2}/src/painapple_code/data/models.defaults.yaml +5 -5
  10. {painapple_code-1.1.0 → painapple_code-1.1.2}/src/painapple_code/data/models.yaml +5 -5
  11. {painapple_code-1.1.0 → painapple_code-1.1.2}/src/painapple_code/paths.py +1 -1
  12. {painapple_code-1.1.0 → painapple_code-1.1.2}/src/painapple_code/server.py +30 -4
  13. {painapple_code-1.1.0 → painapple_code-1.1.2}/src/painapple_code/static/login.html +6 -0
  14. {painapple_code-1.1.0 → painapple_code-1.1.2}/src/painapple_code/static/web-client.html +6 -6
  15. {painapple_code-1.1.0 → painapple_code-1.1.2}/src/painapple_code/tools/agents/shadow-git-helper.md +1 -1
  16. painapple_code-1.1.2/src/painapple_code/tools/term-bin/pbcopy +40 -0
  17. {painapple_code-1.1.0 → painapple_code-1.1.2}/src/painapple_code/utils/pty_posix.py +14 -0
  18. {painapple_code-1.1.0 → painapple_code-1.1.2/src/painapple_code.egg-info}/PKG-INFO +1 -1
  19. {painapple_code-1.1.0 → painapple_code-1.1.2}/src/painapple_code.egg-info/SOURCES.txt +1 -0
  20. {painapple_code-1.1.0 → painapple_code-1.1.2}/src/painapple_code.egg-info/scm_file_list.json +2 -0
  21. painapple_code-1.1.2/src/painapple_code.egg-info/scm_version.json +8 -0
  22. painapple_code-1.1.0/src/painapple_code.egg-info/scm_version.json +0 -8
  23. {painapple_code-1.1.0 → painapple_code-1.1.2}/.devcontainer/devcontainer.json +0 -0
  24. {painapple_code-1.1.0 → painapple_code-1.1.2}/.dockerignore +0 -0
  25. {painapple_code-1.1.0 → painapple_code-1.1.2}/.gitignore +0 -0
  26. {painapple_code-1.1.0 → painapple_code-1.1.2}/CONTRIBUTING.md +0 -0
  27. {painapple_code-1.1.0 → painapple_code-1.1.2}/Dockerfile +0 -0
  28. {painapple_code-1.1.0 → painapple_code-1.1.2}/LICENSE +0 -0
  29. {painapple_code-1.1.0 → painapple_code-1.1.2}/MANIFEST.in +0 -0
  30. {painapple_code-1.1.0 → painapple_code-1.1.2}/README.dockerhub.md +0 -0
  31. {painapple_code-1.1.0 → painapple_code-1.1.2}/README.md +0 -0
  32. {painapple_code-1.1.0 → painapple_code-1.1.2}/SECURITY.md +0 -0
  33. {painapple_code-1.1.0 → painapple_code-1.1.2}/THIRD_PARTY_NOTICES.md +0 -0
  34. {painapple_code-1.1.0 → painapple_code-1.1.2}/build-frontend.sh +0 -0
  35. {painapple_code-1.1.0 → painapple_code-1.1.2}/docker-compose.yml +0 -0
  36. {painapple_code-1.1.0 → painapple_code-1.1.2}/docker-entrypoint.sh +0 -0
  37. {painapple_code-1.1.0 → painapple_code-1.1.2}/docs-site/assets/annotate-editor.png +0 -0
  38. {painapple_code-1.1.0 → painapple_code-1.1.2}/docs-site/assets/browser-widget.png +0 -0
  39. {painapple_code-1.1.0 → painapple_code-1.1.2}/docs-site/assets/comments-stash.gif +0 -0
  40. {painapple_code-1.1.0 → painapple_code-1.1.2}/docs-site/assets/cost-analytics.png +0 -0
  41. {painapple_code-1.1.0 → painapple_code-1.1.2}/docs-site/assets/favicon.png +0 -0
  42. {painapple_code-1.1.0 → painapple_code-1.1.2}/docs-site/assets/input-autocomplete.gif +0 -0
  43. {painapple_code-1.1.0 → painapple_code-1.1.2}/docs-site/assets/logo.png +0 -0
  44. {painapple_code-1.1.0 → painapple_code-1.1.2}/docs-site/assets/markdown-quick-edit.gif +0 -0
  45. {painapple_code-1.1.0 → painapple_code-1.1.2}/docs-site/assets/overview.png +0 -0
  46. {painapple_code-1.1.0 → painapple_code-1.1.2}/docs-site/assets/prompt-history.png +0 -0
  47. {painapple_code-1.1.0 → painapple_code-1.1.2}/docs-site/assets/quick-switcher.gif +0 -0
  48. {painapple_code-1.1.0 → painapple_code-1.1.2}/docs-site/assets/quick-switcher.png +0 -0
  49. {painapple_code-1.1.0 → painapple_code-1.1.2}/docs-site/assets/settings-appearance.png +0 -0
  50. {painapple_code-1.1.0 → painapple_code-1.1.2}/docs-site/assets/settings-claude.png +0 -0
  51. {painapple_code-1.1.0 → painapple_code-1.1.2}/docs-site/assets/shadow-journal.png +0 -0
  52. {painapple_code-1.1.0 → painapple_code-1.1.2}/docs-site/assets/snippets-picker.png +0 -0
  53. {painapple_code-1.1.0 → painapple_code-1.1.2}/docs-site/assets/terminal.gif +0 -0
  54. {painapple_code-1.1.0 → painapple_code-1.1.2}/docs-site/assets/turn-summary-bar-expanded.png +0 -0
  55. {painapple_code-1.1.0 → painapple_code-1.1.2}/docs-site/assets/turn-summary-bar.png +0 -0
  56. {painapple_code-1.1.0 → painapple_code-1.1.2}/docs-site/assets/welcome-screen.png +0 -0
  57. {painapple_code-1.1.0 → painapple_code-1.1.2}/docs-site/assets/zen-mode.png +0 -0
  58. {painapple_code-1.1.0 → painapple_code-1.1.2}/docs-site/changelog.md +0 -0
  59. {painapple_code-1.1.0 → painapple_code-1.1.2}/docs-site/features.md +0 -0
  60. {painapple_code-1.1.0 → painapple_code-1.1.2}/docs-site/getting-started/first-run.md +0 -0
  61. {painapple_code-1.1.0 → painapple_code-1.1.2}/docs-site/getting-started/install-devcontainer.md +0 -0
  62. {painapple_code-1.1.0 → painapple_code-1.1.2}/docs-site/getting-started/install-docker.md +0 -0
  63. {painapple_code-1.1.0 → painapple_code-1.1.2}/docs-site/getting-started/install-pip.md +0 -0
  64. {painapple_code-1.1.0 → painapple_code-1.1.2}/docs-site/getting-started/requirements.md +0 -0
  65. {painapple_code-1.1.0 → painapple_code-1.1.2}/docs-site/getting-started/security.md +0 -0
  66. {painapple_code-1.1.0 → painapple_code-1.1.2}/docs-site/guides/analytics-and-history.md +0 -0
  67. {painapple_code-1.1.0 → painapple_code-1.1.2}/docs-site/guides/claude-artifacts.md +0 -0
  68. {painapple_code-1.1.0 → painapple_code-1.1.2}/docs-site/guides/customization.md +0 -0
  69. {painapple_code-1.1.0 → painapple_code-1.1.2}/docs-site/guides/files.md +0 -0
  70. {painapple_code-1.1.0 → painapple_code-1.1.2}/docs-site/guides/git-and-diffs.md +0 -0
  71. {painapple_code-1.1.0 → painapple_code-1.1.2}/docs-site/guides/images-and-annotation.md +0 -0
  72. {painapple_code-1.1.0 → painapple_code-1.1.2}/docs-site/guides/input-and-commands.md +0 -0
  73. {painapple_code-1.1.0 → painapple_code-1.1.2}/docs-site/guides/ipad-and-mobile.md +0 -0
  74. {painapple_code-1.1.0 → painapple_code-1.1.2}/docs-site/guides/permissions-and-thinking.md +0 -0
  75. {painapple_code-1.1.0 → painapple_code-1.1.2}/docs-site/guides/providers.md +0 -0
  76. {painapple_code-1.1.0 → painapple_code-1.1.2}/docs-site/guides/sessions.md +0 -0
  77. {painapple_code-1.1.0 → painapple_code-1.1.2}/docs-site/guides/shadow-git.md +0 -0
  78. {painapple_code-1.1.0 → painapple_code-1.1.2}/docs-site/guides/stash-and-discussions.md +0 -0
  79. {painapple_code-1.1.0 → painapple_code-1.1.2}/docs-site/guides/welcome-screen.md +0 -0
  80. {painapple_code-1.1.0 → painapple_code-1.1.2}/docs-site/guides/zen-mode.md +0 -0
  81. {painapple_code-1.1.0 → painapple_code-1.1.2}/docs-site/index.md +0 -0
  82. {painapple_code-1.1.0 → painapple_code-1.1.2}/docs-site/reference/api.md +0 -0
  83. {painapple_code-1.1.0 → painapple_code-1.1.2}/docs-site/reference/commands.md +0 -0
  84. {painapple_code-1.1.0 → painapple_code-1.1.2}/docs-site/reference/data-storage.md +0 -0
  85. {painapple_code-1.1.0 → painapple_code-1.1.2}/docs-site/reference/keyboard-shortcuts.md +0 -0
  86. {painapple_code-1.1.0 → painapple_code-1.1.2}/docs-site/reference/optional-helpers.md +0 -0
  87. {painapple_code-1.1.0 → painapple_code-1.1.2}/mkdocs.yml +0 -0
  88. {painapple_code-1.1.0 → painapple_code-1.1.2}/painapple-docker.sh +0 -0
  89. {painapple_code-1.1.0 → painapple_code-1.1.2}/pyproject.toml +0 -0
  90. {painapple_code-1.1.0 → painapple_code-1.1.2}/requirements-docs.txt +0 -0
  91. {painapple_code-1.1.0 → painapple_code-1.1.2}/requirements.txt +0 -0
  92. {painapple_code-1.1.0 → painapple_code-1.1.2}/setup.cfg +0 -0
  93. {painapple_code-1.1.0 → painapple_code-1.1.2}/setup.py +0 -0
  94. {painapple_code-1.1.0 → painapple_code-1.1.2}/src/painapple_code/__init__.py +0 -0
  95. {painapple_code-1.1.0 → painapple_code-1.1.2}/src/painapple_code/__main__.py +0 -0
  96. {painapple_code-1.1.0 → painapple_code-1.1.2}/src/painapple_code/cli/__init__.py +0 -0
  97. {painapple_code-1.1.0 → painapple_code-1.1.2}/src/painapple_code/cli/deploy/__init__.py +0 -0
  98. {painapple_code-1.1.0 → painapple_code-1.1.2}/src/painapple_code/cli/deploy/claude_seed.py +0 -0
  99. {painapple_code-1.1.0 → painapple_code-1.1.2}/src/painapple_code/cli/deploy/config.py +0 -0
  100. {painapple_code-1.1.0 → painapple_code-1.1.2}/src/painapple_code/cli/deploy/container.py +0 -0
  101. {painapple_code-1.1.0 → painapple_code-1.1.2}/src/painapple_code/cli/deploy/launch.py +0 -0
  102. {painapple_code-1.1.0 → painapple_code-1.1.2}/src/painapple_code/cli/deploy/runtime.py +0 -0
  103. {painapple_code-1.1.0 → painapple_code-1.1.2}/src/painapple_code/cli/lifecycle_cmd.py +0 -0
  104. {painapple_code-1.1.0 → painapple_code-1.1.2}/src/painapple_code/cli/list_cmd.py +0 -0
  105. {painapple_code-1.1.0 → painapple_code-1.1.2}/src/painapple_code/cli/manage_cmd.py +0 -0
  106. {painapple_code-1.1.0 → painapple_code-1.1.2}/src/painapple_code/cli/netinfo.py +0 -0
  107. {painapple_code-1.1.0 → painapple_code-1.1.2}/src/painapple_code/cli/profiles.py +0 -0
  108. {painapple_code-1.1.0 → painapple_code-1.1.2}/src/painapple_code/cli/serve_args.py +0 -0
  109. {painapple_code-1.1.0 → painapple_code-1.1.2}/src/painapple_code/cli/serve_config.py +0 -0
  110. {painapple_code-1.1.0 → painapple_code-1.1.2}/src/painapple_code/cli/ui.py +0 -0
  111. {painapple_code-1.1.0 → painapple_code-1.1.2}/src/painapple_code/cost_analytics.py +0 -0
  112. {painapple_code-1.1.0 → painapple_code-1.1.2}/src/painapple_code/data/presets.defaults.json +0 -0
  113. {painapple_code-1.1.0 → painapple_code-1.1.2}/src/painapple_code/data/strings.yaml +0 -0
  114. {painapple_code-1.1.0 → painapple_code-1.1.2}/src/painapple_code/helpers.py +0 -0
  115. {painapple_code-1.1.0 → painapple_code-1.1.2}/src/painapple_code/prompt_explorer.py +0 -0
  116. {painapple_code-1.1.0 → painapple_code-1.1.2}/src/painapple_code/providers/__init__.py +0 -0
  117. {painapple_code-1.1.0 → painapple_code-1.1.2}/src/painapple_code/providers/base.py +0 -0
  118. {painapple_code-1.1.0 → painapple_code-1.1.2}/src/painapple_code/providers/claude/__init__.py +0 -0
  119. {painapple_code-1.1.0 → painapple_code-1.1.2}/src/painapple_code/providers/claude/capabilities.py +0 -0
  120. {painapple_code-1.1.0 → painapple_code-1.1.2}/src/painapple_code/providers/claude/errors.py +0 -0
  121. {painapple_code-1.1.0 → painapple_code-1.1.2}/src/painapple_code/providers/claude/launch.py +0 -0
  122. {painapple_code-1.1.0 → painapple_code-1.1.2}/src/painapple_code/providers/claude/summary.py +0 -0
  123. {painapple_code-1.1.0 → painapple_code-1.1.2}/src/painapple_code/providers/claude/translate.py +0 -0
  124. {painapple_code-1.1.0 → painapple_code-1.1.2}/src/painapple_code/providers/claude_sdk/__init__.py +0 -0
  125. {painapple_code-1.1.0 → painapple_code-1.1.2}/src/painapple_code/providers/claude_sdk/driver.py +0 -0
  126. {painapple_code-1.1.0 → painapple_code-1.1.2}/src/painapple_code/providers/codex/__init__.py +0 -0
  127. {painapple_code-1.1.0 → painapple_code-1.1.2}/src/painapple_code/providers/codex/capabilities.py +0 -0
  128. {painapple_code-1.1.0 → painapple_code-1.1.2}/src/painapple_code/providers/codex/errors.py +0 -0
  129. {painapple_code-1.1.0 → painapple_code-1.1.2}/src/painapple_code/providers/codex/translate.py +0 -0
  130. {painapple_code-1.1.0 → painapple_code-1.1.2}/src/painapple_code/providers/codex_app_server/__init__.py +0 -0
  131. {painapple_code-1.1.0 → painapple_code-1.1.2}/src/painapple_code/providers/codex_app_server/capabilities.py +0 -0
  132. {painapple_code-1.1.0 → painapple_code-1.1.2}/src/painapple_code/providers/codex_app_server/launch.py +0 -0
  133. {painapple_code-1.1.0 → painapple_code-1.1.2}/src/painapple_code/providers/codex_app_server/summary.py +0 -0
  134. {painapple_code-1.1.0 → painapple_code-1.1.2}/src/painapple_code/providers/codex_app_server/translate.py +0 -0
  135. {painapple_code-1.1.0 → painapple_code-1.1.2}/src/painapple_code/providers/codex_app_server/transport.py +0 -0
  136. {painapple_code-1.1.0 → painapple_code-1.1.2}/src/painapple_code/routes/__init__.py +0 -0
  137. {painapple_code-1.1.0 → painapple_code-1.1.2}/src/painapple_code/routes/api_agents.py +0 -0
  138. {painapple_code-1.1.0 → painapple_code-1.1.2}/src/painapple_code/routes/api_app.py +0 -0
  139. {painapple_code-1.1.0 → painapple_code-1.1.2}/src/painapple_code/routes/api_app_commit_sections.py +0 -0
  140. {painapple_code-1.1.0 → painapple_code-1.1.2}/src/painapple_code/routes/api_app_config.py +0 -0
  141. {painapple_code-1.1.0 → painapple_code-1.1.2}/src/painapple_code/routes/api_app_session_prefs.py +0 -0
  142. {painapple_code-1.1.0 → painapple_code-1.1.2}/src/painapple_code/routes/api_browser.py +0 -0
  143. {painapple_code-1.1.0 → painapple_code-1.1.2}/src/painapple_code/routes/api_commands.py +0 -0
  144. {painapple_code-1.1.0 → painapple_code-1.1.2}/src/painapple_code/routes/api_costs.py +0 -0
  145. {painapple_code-1.1.0 → painapple_code-1.1.2}/src/painapple_code/routes/api_drafts.py +0 -0
  146. {painapple_code-1.1.0 → painapple_code-1.1.2}/src/painapple_code/routes/api_exec.py +0 -0
  147. {painapple_code-1.1.0 → painapple_code-1.1.2}/src/painapple_code/routes/api_files.py +0 -0
  148. {painapple_code-1.1.0 → painapple_code-1.1.2}/src/painapple_code/routes/api_git.py +0 -0
  149. {painapple_code-1.1.0 → painapple_code-1.1.2}/src/painapple_code/routes/api_logs.py +0 -0
  150. {painapple_code-1.1.0 → painapple_code-1.1.2}/src/painapple_code/routes/api_plugins.py +0 -0
  151. {painapple_code-1.1.0 → painapple_code-1.1.2}/src/painapple_code/routes/api_project_config.py +0 -0
  152. {painapple_code-1.1.0 → painapple_code-1.1.2}/src/painapple_code/routes/api_prompts.py +0 -0
  153. {painapple_code-1.1.0 → painapple_code-1.1.2}/src/painapple_code/routes/api_providers.py +0 -0
  154. {painapple_code-1.1.0 → painapple_code-1.1.2}/src/painapple_code/routes/api_search.py +0 -0
  155. {painapple_code-1.1.0 → painapple_code-1.1.2}/src/painapple_code/routes/api_session_stash.py +0 -0
  156. {painapple_code-1.1.0 → painapple_code-1.1.2}/src/painapple_code/routes/api_session_welcome.py +0 -0
  157. {painapple_code-1.1.0 → painapple_code-1.1.2}/src/painapple_code/routes/api_sessions.py +0 -0
  158. {painapple_code-1.1.0 → painapple_code-1.1.2}/src/painapple_code/routes/api_shadow.py +0 -0
  159. {painapple_code-1.1.0 → painapple_code-1.1.2}/src/painapple_code/routes/api_shadow_db.py +0 -0
  160. {painapple_code-1.1.0 → painapple_code-1.1.2}/src/painapple_code/routes/api_shadow_files.py +0 -0
  161. {painapple_code-1.1.0 → painapple_code-1.1.2}/src/painapple_code/routes/api_shadow_search.py +0 -0
  162. {painapple_code-1.1.0 → painapple_code-1.1.2}/src/painapple_code/routes/api_skills.py +0 -0
  163. {painapple_code-1.1.0 → painapple_code-1.1.2}/src/painapple_code/routes/api_tasks.py +0 -0
  164. {painapple_code-1.1.0 → painapple_code-1.1.2}/src/painapple_code/routes/api_terminal.py +0 -0
  165. {painapple_code-1.1.0 → painapple_code-1.1.2}/src/painapple_code/routes/api_upload.py +0 -0
  166. {painapple_code-1.1.0 → painapple_code-1.1.2}/src/painapple_code/routes/api_viewer.py +0 -0
  167. {painapple_code-1.1.0 → painapple_code-1.1.2}/src/painapple_code/routes/dependencies.py +0 -0
  168. {painapple_code-1.1.0 → painapple_code-1.1.2}/src/painapple_code/routes/ws_chat.py +0 -0
  169. {painapple_code-1.1.0 → painapple_code-1.1.2}/src/painapple_code/server_logging.py +0 -0
  170. {painapple_code-1.1.0 → painapple_code-1.1.2}/src/painapple_code/services/__init__.py +0 -0
  171. {painapple_code-1.1.0 → painapple_code-1.1.2}/src/painapple_code/services/agent_session.py +0 -0
  172. {painapple_code-1.1.0 → painapple_code-1.1.2}/src/painapple_code/session_store.py +0 -0
  173. {painapple_code-1.1.0 → painapple_code-1.1.2}/src/painapple_code/session_store_core.py +0 -0
  174. {painapple_code-1.1.0 → painapple_code-1.1.2}/src/painapple_code/shadow_db.py +0 -0
  175. {painapple_code-1.1.0 → painapple_code-1.1.2}/src/painapple_code/shadow_db_plans.py +0 -0
  176. {painapple_code-1.1.0 → painapple_code-1.1.2}/src/painapple_code/shadow_db_queries.py +0 -0
  177. {painapple_code-1.1.0 → painapple_code-1.1.2}/src/painapple_code/shadow_db_schema.py +0 -0
  178. {painapple_code-1.1.0 → painapple_code-1.1.2}/src/painapple_code/shadow_git.py +0 -0
  179. {painapple_code-1.1.0 → painapple_code-1.1.2}/src/painapple_code/shadow_git_frontmatter.py +0 -0
  180. {painapple_code-1.1.0 → painapple_code-1.1.2}/src/painapple_code/shadow_git_sections.py +0 -0
  181. {painapple_code-1.1.0 → painapple_code-1.1.2}/src/painapple_code/shadow_git_summary.py +0 -0
  182. {painapple_code-1.1.0 → painapple_code-1.1.2}/src/painapple_code/shadow_parser.py +0 -0
  183. {painapple_code-1.1.0 → painapple_code-1.1.2}/src/painapple_code/static/css/00-variables.css +0 -0
  184. {painapple_code-1.1.0 → painapple_code-1.1.2}/src/painapple_code/static/css/01-base.css +0 -0
  185. {painapple_code-1.1.0 → painapple_code-1.1.2}/src/painapple_code/static/css/02-tooltips.css +0 -0
  186. {painapple_code-1.1.0 → painapple_code-1.1.2}/src/painapple_code/static/css/09-left-rail.css +0 -0
  187. {painapple_code-1.1.0 → painapple_code-1.1.2}/src/painapple_code/static/css/10-header.css +0 -0
  188. {painapple_code-1.1.0 → painapple_code-1.1.2}/src/painapple_code/static/css/11-connection-bar.css +0 -0
  189. {painapple_code-1.1.0 → painapple_code-1.1.2}/src/painapple_code/static/css/20-messages.css +0 -0
  190. {painapple_code-1.1.0 → painapple_code-1.1.2}/src/painapple_code/static/css/21-tool-blocks.css +0 -0
  191. {painapple_code-1.1.0 → painapple_code-1.1.2}/src/painapple_code/static/css/22-edit-diff.css +0 -0
  192. {painapple_code-1.1.0 → painapple_code-1.1.2}/src/painapple_code/static/css/23-thinking.css +0 -0
  193. {painapple_code-1.1.0 → painapple_code-1.1.2}/src/painapple_code/static/css/24-background-tasks.css +0 -0
  194. {painapple_code-1.1.0 → painapple_code-1.1.2}/src/painapple_code/static/css/25-context-block.css +0 -0
  195. {painapple_code-1.1.0 → painapple_code-1.1.2}/src/painapple_code/static/css/26-session-setup.css +0 -0
  196. {painapple_code-1.1.0 → painapple_code-1.1.2}/src/painapple_code/static/css/30-markdown.css +0 -0
  197. {painapple_code-1.1.0 → painapple_code-1.1.2}/src/painapple_code/static/css/40-input.css +0 -0
  198. {painapple_code-1.1.0 → painapple_code-1.1.2}/src/painapple_code/static/css/41-autocomplete.css +0 -0
  199. {painapple_code-1.1.0 → painapple_code-1.1.2}/src/painapple_code/static/css/42-activity-strip.css +0 -0
  200. {painapple_code-1.1.0 → painapple_code-1.1.2}/src/painapple_code/static/css/43-file-autocomplete.css +0 -0
  201. {painapple_code-1.1.0 → painapple_code-1.1.2}/src/painapple_code/static/css/44-snippets-autocomplete.css +0 -0
  202. {painapple_code-1.1.0 → painapple_code-1.1.2}/src/painapple_code/static/css/45-selection-bar.css +0 -0
  203. {painapple_code-1.1.0 → painapple_code-1.1.2}/src/painapple_code/static/css/46-keyboard-bar.css +0 -0
  204. {painapple_code-1.1.0 → painapple_code-1.1.2}/src/painapple_code/static/css/47-keyboard-longpress.css +0 -0
  205. {painapple_code-1.1.0 → painapple_code-1.1.2}/src/painapple_code/static/css/47-token-profile.css +0 -0
  206. {painapple_code-1.1.0 → painapple_code-1.1.2}/src/painapple_code/static/css/50-welcome.css +0 -0
  207. {painapple_code-1.1.0 → painapple_code-1.1.2}/src/painapple_code/static/css/51-modals.css +0 -0
  208. {painapple_code-1.1.0 → painapple_code-1.1.2}/src/painapple_code/static/css/52-utilities.css +0 -0
  209. {painapple_code-1.1.0 → painapple_code-1.1.2}/src/painapple_code/static/css/53-image-upload.css +0 -0
  210. {painapple_code-1.1.0 → painapple_code-1.1.2}/src/painapple_code/static/css/54-todo-list.css +0 -0
  211. {painapple_code-1.1.0 → painapple_code-1.1.2}/src/painapple_code/static/css/55-file-upload.css +0 -0
  212. {painapple_code-1.1.0 → painapple_code-1.1.2}/src/painapple_code/static/css/56-chat-navigator.css +0 -0
  213. {painapple_code-1.1.0 → painapple_code-1.1.2}/src/painapple_code/static/css/56-permission-card.css +0 -0
  214. {painapple_code-1.1.0 → painapple_code-1.1.2}/src/painapple_code/static/css/56-plan-approval.css +0 -0
  215. {painapple_code-1.1.0 → painapple_code-1.1.2}/src/painapple_code/static/css/56-question-form.css +0 -0
  216. {painapple_code-1.1.0 → painapple_code-1.1.2}/src/painapple_code/static/css/57-swipe-indicator.css +0 -0
  217. {painapple_code-1.1.0 → painapple_code-1.1.2}/src/painapple_code/static/css/58-session-families.css +0 -0
  218. {painapple_code-1.1.0 → painapple_code-1.1.2}/src/painapple_code/static/css/59-about.css +0 -0
  219. {painapple_code-1.1.0 → painapple_code-1.1.2}/src/painapple_code/static/css/61-log-explorer.css +0 -0
  220. {painapple_code-1.1.0 → painapple_code-1.1.2}/src/painapple_code/static/css/62-json-tree.css +0 -0
  221. {painapple_code-1.1.0 → painapple_code-1.1.2}/src/painapple_code/static/css/62-skills-widget.css +0 -0
  222. {painapple_code-1.1.0 → painapple_code-1.1.2}/src/painapple_code/static/css/63-commands-widget.css +0 -0
  223. {painapple_code-1.1.0 → painapple_code-1.1.2}/src/painapple_code/static/css/63-plugins-widget.css +0 -0
  224. {painapple_code-1.1.0 → painapple_code-1.1.2}/src/painapple_code/static/css/63-terminal.css +0 -0
  225. {painapple_code-1.1.0 → painapple_code-1.1.2}/src/painapple_code/static/css/64-search-files-widget.css +0 -0
  226. {painapple_code-1.1.0 → painapple_code-1.1.2}/src/painapple_code/static/css/65-snippets-widget.css +0 -0
  227. {painapple_code-1.1.0 → painapple_code-1.1.2}/src/painapple_code/static/css/66-active-sessions.css +0 -0
  228. {painapple_code-1.1.0 → painapple_code-1.1.2}/src/painapple_code/static/css/66-agents-widget.css +0 -0
  229. {painapple_code-1.1.0 → painapple_code-1.1.2}/src/painapple_code/static/css/66-file-explorer-widget.css +0 -0
  230. {painapple_code-1.1.0 → painapple_code-1.1.2}/src/painapple_code/static/css/66-git-panel.css +0 -0
  231. {painapple_code-1.1.0 → painapple_code-1.1.2}/src/painapple_code/static/css/66-history-explorer.css +0 -0
  232. {painapple_code-1.1.0 → painapple_code-1.1.2}/src/painapple_code/static/css/67-diff-viewer.css +0 -0
  233. {painapple_code-1.1.0 → painapple_code-1.1.2}/src/painapple_code/static/css/67-editor-view.css +0 -0
  234. {painapple_code-1.1.0 → painapple_code-1.1.2}/src/painapple_code/static/css/67-file-preview-widget.css +0 -0
  235. {painapple_code-1.1.0 → painapple_code-1.1.2}/src/painapple_code/static/css/68-browser-widget.css +0 -0
  236. {painapple_code-1.1.0 → painapple_code-1.1.2}/src/painapple_code/static/css/68-compare-wizard.css +0 -0
  237. {painapple_code-1.1.0 → painapple_code-1.1.2}/src/painapple_code/static/css/68-csv-preview.css +0 -0
  238. {painapple_code-1.1.0 → painapple_code-1.1.2}/src/painapple_code/static/css/68-diff-preview.css +0 -0
  239. {painapple_code-1.1.0 → painapple_code-1.1.2}/src/painapple_code/static/css/68-helpers-install-widget.css +0 -0
  240. {painapple_code-1.1.0 → painapple_code-1.1.2}/src/painapple_code/static/css/68-image-annotate.css +0 -0
  241. {painapple_code-1.1.0 → painapple_code-1.1.2}/src/painapple_code/static/css/68-terminal-view.css +0 -0
  242. {painapple_code-1.1.0 → painapple_code-1.1.2}/src/painapple_code/static/css/68-uploads-widget.css +0 -0
  243. {painapple_code-1.1.0 → painapple_code-1.1.2}/src/painapple_code/static/css/69-cost-analytics.css +0 -0
  244. {painapple_code-1.1.0 → painapple_code-1.1.2}/src/painapple_code/static/css/70-config-panel.css +0 -0
  245. {painapple_code-1.1.0 → painapple_code-1.1.2}/src/painapple_code/static/css/70-excalidraw.css +0 -0
  246. {painapple_code-1.1.0 → painapple_code-1.1.2}/src/painapple_code/static/css/70-prompt-explorer.css +0 -0
  247. {painapple_code-1.1.0 → painapple_code-1.1.2}/src/painapple_code/static/css/71-chart.css +0 -0
  248. {painapple_code-1.1.0 → painapple_code-1.1.2}/src/painapple_code/static/css/72-discussion-sidebar.css +0 -0
  249. {painapple_code-1.1.0 → painapple_code-1.1.2}/src/painapple_code/static/css/74-debug-logs.css +0 -0
  250. {painapple_code-1.1.0 → painapple_code-1.1.2}/src/painapple_code/static/css/80-open-dialog.css +0 -0
  251. {painapple_code-1.1.0 → painapple_code-1.1.2}/src/painapple_code/static/css/80-quick-switcher.css +0 -0
  252. {painapple_code-1.1.0 → painapple_code-1.1.2}/src/painapple_code/static/css/80-widget-system.css +0 -0
  253. {painapple_code-1.1.0 → painapple_code-1.1.2}/src/painapple_code/static/css/81-quick-actions.css +0 -0
  254. {painapple_code-1.1.0 → painapple_code-1.1.2}/src/painapple_code/static/css/82-context-popover.css +0 -0
  255. {painapple_code-1.1.0 → painapple_code-1.1.2}/src/painapple_code/static/css/83-context-menu.css +0 -0
  256. {painapple_code-1.1.0 → painapple_code-1.1.2}/src/painapple_code/static/css/85-lazy-loading.css +0 -0
  257. {painapple_code-1.1.0 → painapple_code-1.1.2}/src/painapple_code/static/css/86-zen-mode.css +0 -0
  258. {painapple_code-1.1.0 → painapple_code-1.1.2}/src/painapple_code/static/css/87-grid-switcher.css +0 -0
  259. {painapple_code-1.1.0 → painapple_code-1.1.2}/src/painapple_code/static/css/login.css +0 -0
  260. {painapple_code-1.1.0 → painapple_code-1.1.2}/src/painapple_code/static/dist/app.bundle.js +0 -0
  261. {painapple_code-1.1.0 → painapple_code-1.1.2}/src/painapple_code/static/feature-triage.html +0 -0
  262. {painapple_code-1.1.0 → painapple_code-1.1.2}/src/painapple_code/static/icons/apple-touch-icon.png +0 -0
  263. {painapple_code-1.1.0 → painapple_code-1.1.2}/src/painapple_code/static/icons/favicon-32.png +0 -0
  264. {painapple_code-1.1.0 → painapple_code-1.1.2}/src/painapple_code/static/icons/favicon.ico +0 -0
  265. {painapple_code-1.1.0 → painapple_code-1.1.2}/src/painapple_code/static/icons/icon-128.png +0 -0
  266. {painapple_code-1.1.0 → painapple_code-1.1.2}/src/painapple_code/static/icons/icon-144.png +0 -0
  267. {painapple_code-1.1.0 → painapple_code-1.1.2}/src/painapple_code/static/icons/icon-152.png +0 -0
  268. {painapple_code-1.1.0 → painapple_code-1.1.2}/src/painapple_code/static/icons/icon-180.png +0 -0
  269. {painapple_code-1.1.0 → painapple_code-1.1.2}/src/painapple_code/static/icons/icon-192.png +0 -0
  270. {painapple_code-1.1.0 → painapple_code-1.1.2}/src/painapple_code/static/icons/icon-384.png +0 -0
  271. {painapple_code-1.1.0 → painapple_code-1.1.2}/src/painapple_code/static/icons/icon-512.png +0 -0
  272. {painapple_code-1.1.0 → painapple_code-1.1.2}/src/painapple_code/static/icons/icon-72.png +0 -0
  273. {painapple_code-1.1.0 → painapple_code-1.1.2}/src/painapple_code/static/icons/icon-96.png +0 -0
  274. {painapple_code-1.1.0 → painapple_code-1.1.2}/src/painapple_code/static/js/action-delegate.js +0 -0
  275. {painapple_code-1.1.0 → painapple_code-1.1.2}/src/painapple_code/static/js/activity-strip.js +0 -0
  276. {painapple_code-1.1.0 → painapple_code-1.1.2}/src/painapple_code/static/js/app/context-menus.js +0 -0
  277. {painapple_code-1.1.0 → painapple_code-1.1.2}/src/painapple_code/static/js/app/file-preview.js +0 -0
  278. {painapple_code-1.1.0 → painapple_code-1.1.2}/src/painapple_code/static/js/app/init-ui.js +0 -0
  279. {painapple_code-1.1.0 → painapple_code-1.1.2}/src/painapple_code/static/js/app/input-events.js +0 -0
  280. {painapple_code-1.1.0 → painapple_code-1.1.2}/src/painapple_code/static/js/app/input-resize.js +0 -0
  281. {painapple_code-1.1.0 → painapple_code-1.1.2}/src/painapple_code/static/js/app/message-actions.js +0 -0
  282. {painapple_code-1.1.0 → painapple_code-1.1.2}/src/painapple_code/static/js/app/panels.js +0 -0
  283. {painapple_code-1.1.0 → painapple_code-1.1.2}/src/painapple_code/static/js/app/rendering-delegators.js +0 -0
  284. {painapple_code-1.1.0 → painapple_code-1.1.2}/src/painapple_code/static/js/app/server-loading.js +0 -0
  285. {painapple_code-1.1.0 → painapple_code-1.1.2}/src/painapple_code/static/js/app/session-ops.js +0 -0
  286. {painapple_code-1.1.0 → painapple_code-1.1.2}/src/painapple_code/static/js/app/session-switch.js +0 -0
  287. {painapple_code-1.1.0 → painapple_code-1.1.2}/src/painapple_code/static/js/app/settings-helpers.js +0 -0
  288. {painapple_code-1.1.0 → painapple_code-1.1.2}/src/painapple_code/static/js/app/startup-welcome.js +0 -0
  289. {painapple_code-1.1.0 → painapple_code-1.1.2}/src/painapple_code/static/js/app-context.js +0 -0
  290. {painapple_code-1.1.0 → painapple_code-1.1.2}/src/painapple_code/static/js/app.js +0 -0
  291. {painapple_code-1.1.0 → painapple_code-1.1.2}/src/painapple_code/static/js/auth-fetch.js +0 -0
  292. {painapple_code-1.1.0 → painapple_code-1.1.2}/src/painapple_code/static/js/background-tasks.js +0 -0
  293. {painapple_code-1.1.0 → painapple_code-1.1.2}/src/painapple_code/static/js/boot.js +0 -0
  294. {painapple_code-1.1.0 → painapple_code-1.1.2}/src/painapple_code/static/js/caret-position.js +0 -0
  295. {painapple_code-1.1.0 → painapple_code-1.1.2}/src/painapple_code/static/js/chat-navigator.js +0 -0
  296. {painapple_code-1.1.0 → painapple_code-1.1.2}/src/painapple_code/static/js/chat-search.js +0 -0
  297. {painapple_code-1.1.0 → painapple_code-1.1.2}/src/painapple_code/static/js/command-executor.js +0 -0
  298. {painapple_code-1.1.0 → painapple_code-1.1.2}/src/painapple_code/static/js/command-store.js +0 -0
  299. {painapple_code-1.1.0 → painapple_code-1.1.2}/src/painapple_code/static/js/components.js +0 -0
  300. {painapple_code-1.1.0 → painapple_code-1.1.2}/src/painapple_code/static/js/config.js +0 -0
  301. {painapple_code-1.1.0 → painapple_code-1.1.2}/src/painapple_code/static/js/context-menu.js +0 -0
  302. {painapple_code-1.1.0 → painapple_code-1.1.2}/src/painapple_code/static/js/controllers/chat-controller.js +0 -0
  303. {painapple_code-1.1.0 → painapple_code-1.1.2}/src/painapple_code/static/js/controllers/dialog-controller.js +0 -0
  304. {painapple_code-1.1.0 → painapple_code-1.1.2}/src/painapple_code/static/js/controllers/tab-controller.js +0 -0
  305. {painapple_code-1.1.0 → painapple_code-1.1.2}/src/painapple_code/static/js/controllers/thinking-controller.js +0 -0
  306. {painapple_code-1.1.0 → painapple_code-1.1.2}/src/painapple_code/static/js/diff-utils.js +0 -0
  307. {painapple_code-1.1.0 → painapple_code-1.1.2}/src/painapple_code/static/js/drafts-pill.js +0 -0
  308. {painapple_code-1.1.0 → painapple_code-1.1.2}/src/painapple_code/static/js/editor-view.js +0 -0
  309. {painapple_code-1.1.0 → painapple_code-1.1.2}/src/painapple_code/static/js/effort-settings.js +0 -0
  310. {painapple_code-1.1.0 → painapple_code-1.1.2}/src/painapple_code/static/js/feature-triage.js +0 -0
  311. {painapple_code-1.1.0 → painapple_code-1.1.2}/src/painapple_code/static/js/file-autocomplete.js +0 -0
  312. {painapple_code-1.1.0 → painapple_code-1.1.2}/src/painapple_code/static/js/file-tabs.js +0 -0
  313. {painapple_code-1.1.0 → painapple_code-1.1.2}/src/painapple_code/static/js/gestures.js +0 -0
  314. {painapple_code-1.1.0 → painapple_code-1.1.2}/src/painapple_code/static/js/grid-switcher.js +0 -0
  315. {painapple_code-1.1.0 → painapple_code-1.1.2}/src/painapple_code/static/js/input-handler.js +0 -0
  316. {painapple_code-1.1.0 → painapple_code-1.1.2}/src/painapple_code/static/js/keyboard-bar.js +0 -0
  317. {painapple_code-1.1.0 → painapple_code-1.1.2}/src/painapple_code/static/js/layout-switcher.js +0 -0
  318. {painapple_code-1.1.0 → painapple_code-1.1.2}/src/painapple_code/static/js/linkify-utils.js +0 -0
  319. {painapple_code-1.1.0 → painapple_code-1.1.2}/src/painapple_code/static/js/login.js +0 -0
  320. {painapple_code-1.1.0 → painapple_code-1.1.2}/src/painapple_code/static/js/open-dialog.js +0 -0
  321. {painapple_code-1.1.0 → painapple_code-1.1.2}/src/painapple_code/static/js/orphan-terminals.js +0 -0
  322. {painapple_code-1.1.0 → painapple_code-1.1.2}/src/painapple_code/static/js/path-utils.js +0 -0
  323. {painapple_code-1.1.0 → painapple_code-1.1.2}/src/painapple_code/static/js/perf-marks.js +0 -0
  324. {painapple_code-1.1.0 → painapple_code-1.1.2}/src/painapple_code/static/js/permission-settings.js +0 -0
  325. {painapple_code-1.1.0 → painapple_code-1.1.2}/src/painapple_code/static/js/pointer-input.js +0 -0
  326. {painapple_code-1.1.0 → painapple_code-1.1.2}/src/painapple_code/static/js/preview/json-tree-menu.js +0 -0
  327. {painapple_code-1.1.0 → painapple_code-1.1.2}/src/painapple_code/static/js/preview/json-tree-toolbar.js +0 -0
  328. {painapple_code-1.1.0 → painapple_code-1.1.2}/src/painapple_code/static/js/preview/json-tree.js +0 -0
  329. {painapple_code-1.1.0 → painapple_code-1.1.2}/src/painapple_code/static/js/preview/preview-breadcrumb.js +0 -0
  330. {painapple_code-1.1.0 → painapple_code-1.1.2}/src/painapple_code/static/js/preview/preview-edit.js +0 -0
  331. {painapple_code-1.1.0 → painapple_code-1.1.2}/src/painapple_code/static/js/preview/preview-events.js +0 -0
  332. {painapple_code-1.1.0 → painapple_code-1.1.2}/src/painapple_code/static/js/preview/preview-history.js +0 -0
  333. {painapple_code-1.1.0 → painapple_code-1.1.2}/src/painapple_code/static/js/preview/preview-inline-edit.js +0 -0
  334. {painapple_code-1.1.0 → painapple_code-1.1.2}/src/painapple_code/static/js/preview/preview-poll.js +0 -0
  335. {painapple_code-1.1.0 → painapple_code-1.1.2}/src/painapple_code/static/js/preview/preview-render.js +0 -0
  336. {painapple_code-1.1.0 → painapple_code-1.1.2}/src/painapple_code/static/js/preview/preview-search.js +0 -0
  337. {painapple_code-1.1.0 → painapple_code-1.1.2}/src/painapple_code/static/js/preview/preview-state.js +0 -0
  338. {painapple_code-1.1.0 → painapple_code-1.1.2}/src/painapple_code/static/js/preview/preview-utils.js +0 -0
  339. {painapple_code-1.1.0 → painapple_code-1.1.2}/src/painapple_code/static/js/preview-plugins/chart-plugin.js +0 -0
  340. {painapple_code-1.1.0 → painapple_code-1.1.2}/src/painapple_code/static/js/preview-plugins/csv-plugin.js +0 -0
  341. {painapple_code-1.1.0 → painapple_code-1.1.2}/src/painapple_code/static/js/preview-plugins/diff-plugin.js +0 -0
  342. {painapple_code-1.1.0 → painapple_code-1.1.2}/src/painapple_code/static/js/preview-plugins/excalidraw-plugin.js +0 -0
  343. {painapple_code-1.1.0 → painapple_code-1.1.2}/src/painapple_code/static/js/preview-plugins/html-plugin.js +0 -0
  344. {painapple_code-1.1.0 → painapple_code-1.1.2}/src/painapple_code/static/js/preview-plugins/image-plugin.js +0 -0
  345. {painapple_code-1.1.0 → painapple_code-1.1.2}/src/painapple_code/static/js/preview-plugins/index.js +0 -0
  346. {painapple_code-1.1.0 → painapple_code-1.1.2}/src/painapple_code/static/js/preview-plugins/json-plugin.js +0 -0
  347. {painapple_code-1.1.0 → painapple_code-1.1.2}/src/painapple_code/static/js/preview-plugins/jsonl-plugin.js +0 -0
  348. {painapple_code-1.1.0 → painapple_code-1.1.2}/src/painapple_code/static/js/preview-plugins/markdown-plugin.js +0 -0
  349. {painapple_code-1.1.0 → painapple_code-1.1.2}/src/painapple_code/static/js/preview-plugins/panzoom-plugin.js +0 -0
  350. {painapple_code-1.1.0 → painapple_code-1.1.2}/src/painapple_code/static/js/preview-plugins/plugin-helpers.js +0 -0
  351. {painapple_code-1.1.0 → painapple_code-1.1.2}/src/painapple_code/static/js/project-color-picker.js +0 -0
  352. {painapple_code-1.1.0 → painapple_code-1.1.2}/src/painapple_code/static/js/project-colors.js +0 -0
  353. {painapple_code-1.1.0 → painapple_code-1.1.2}/src/painapple_code/static/js/prompt-favorites.js +0 -0
  354. {painapple_code-1.1.0 → painapple_code-1.1.2}/src/painapple_code/static/js/quick-actions-menu.js +0 -0
  355. {painapple_code-1.1.0 → painapple_code-1.1.2}/src/painapple_code/static/js/quick-actions-registry.js +0 -0
  356. {painapple_code-1.1.0 → painapple_code-1.1.2}/src/painapple_code/static/js/quick-switcher/controller.js +0 -0
  357. {painapple_code-1.1.0 → painapple_code-1.1.2}/src/painapple_code/static/js/quick-switcher/fuzzy-scorer.js +0 -0
  358. {painapple_code-1.1.0 → painapple_code-1.1.2}/src/painapple_code/static/js/quick-switcher/index.js +0 -0
  359. {painapple_code-1.1.0 → painapple_code-1.1.2}/src/painapple_code/static/js/quick-switcher/providers/base-provider.js +0 -0
  360. {painapple_code-1.1.0 → painapple_code-1.1.2}/src/painapple_code/static/js/quick-switcher/providers/command-provider.js +0 -0
  361. {painapple_code-1.1.0 → painapple_code-1.1.2}/src/painapple_code/static/js/quick-switcher/providers/file-provider.js +0 -0
  362. {painapple_code-1.1.0 → painapple_code-1.1.2}/src/painapple_code/static/js/quick-switcher/providers/panel-provider.js +0 -0
  363. {painapple_code-1.1.0 → painapple_code-1.1.2}/src/painapple_code/static/js/quick-switcher/providers/project-provider.js +0 -0
  364. {painapple_code-1.1.0 → painapple_code-1.1.2}/src/painapple_code/static/js/quick-switcher/providers/read-files-provider.js +0 -0
  365. {painapple_code-1.1.0 → painapple_code-1.1.2}/src/painapple_code/static/js/quick-switcher/providers/skills-provider.js +0 -0
  366. {painapple_code-1.1.0 → painapple_code-1.1.2}/src/painapple_code/static/js/quick-switcher/registry.js +0 -0
  367. {painapple_code-1.1.0 → painapple_code-1.1.2}/src/painapple_code/static/js/quick-switcher/ui/item.js +0 -0
  368. {painapple_code-1.1.0 → painapple_code-1.1.2}/src/painapple_code/static/js/quick-switcher/ui/picker.js +0 -0
  369. {painapple_code-1.1.0 → painapple_code-1.1.2}/src/painapple_code/static/js/recent-opens.js +0 -0
  370. {painapple_code-1.1.0 → painapple_code-1.1.2}/src/painapple_code/static/js/scroll-manager.js +0 -0
  371. {painapple_code-1.1.0 → painapple_code-1.1.2}/src/painapple_code/static/js/scroll-state-machine.js +0 -0
  372. {painapple_code-1.1.0 → painapple_code-1.1.2}/src/painapple_code/static/js/selection/action-bar.js +0 -0
  373. {painapple_code-1.1.0 → painapple_code-1.1.2}/src/painapple_code/static/js/selection/index.js +0 -0
  374. {painapple_code-1.1.0 → painapple_code-1.1.2}/src/painapple_code/static/js/selection/selection-handler.js +0 -0
  375. {painapple_code-1.1.0 → painapple_code-1.1.2}/src/painapple_code/static/js/selection/state.js +0 -0
  376. {painapple_code-1.1.0 → painapple_code-1.1.2}/src/painapple_code/static/js/session/agent-progress.js +0 -0
  377. {painapple_code-1.1.0 → painapple_code-1.1.2}/src/painapple_code/static/js/session/handle-agent-message.js +0 -0
  378. {painapple_code-1.1.0 → painapple_code-1.1.2}/src/painapple_code/static/js/session/handle-message.js +0 -0
  379. {painapple_code-1.1.0 → painapple_code-1.1.2}/src/painapple_code/static/js/session/interactive.js +0 -0
  380. {painapple_code-1.1.0 → painapple_code-1.1.2}/src/painapple_code/static/js/session/message-store.js +0 -0
  381. {painapple_code-1.1.0 → painapple_code-1.1.2}/src/painapple_code/static/js/session/messages.js +0 -0
  382. {painapple_code-1.1.0 → painapple_code-1.1.2}/src/painapple_code/static/js/session/persistence.js +0 -0
  383. {painapple_code-1.1.0 → painapple_code-1.1.2}/src/painapple_code/static/js/session/restore.js +0 -0
  384. {painapple_code-1.1.0 → painapple_code-1.1.2}/src/painapple_code/static/js/session/sync.js +0 -0
  385. {painapple_code-1.1.0 → painapple_code-1.1.2}/src/painapple_code/static/js/session-container-pool.js +0 -0
  386. {painapple_code-1.1.0 → painapple_code-1.1.2}/src/painapple_code/static/js/session-setup-panel.js +0 -0
  387. {painapple_code-1.1.0 → painapple_code-1.1.2}/src/painapple_code/static/js/session.js +0 -0
  388. {painapple_code-1.1.0 → painapple_code-1.1.2}/src/painapple_code/static/js/shortcut-hints.js +0 -0
  389. {painapple_code-1.1.0 → painapple_code-1.1.2}/src/painapple_code/static/js/shortcuts.js +0 -0
  390. {painapple_code-1.1.0 → painapple_code-1.1.2}/src/painapple_code/static/js/skills-autocomplete.js +0 -0
  391. {painapple_code-1.1.0 → painapple_code-1.1.2}/src/painapple_code/static/js/snippets-autocomplete.js +0 -0
  392. {painapple_code-1.1.0 → painapple_code-1.1.2}/src/painapple_code/static/js/stash-refs-view.js +0 -0
  393. {painapple_code-1.1.0 → painapple_code-1.1.2}/src/painapple_code/static/js/stash-ui.js +0 -0
  394. {painapple_code-1.1.0 → painapple_code-1.1.2}/src/painapple_code/static/js/stash.js +0 -0
  395. {painapple_code-1.1.0 → painapple_code-1.1.2}/src/painapple_code/static/js/status-bar.js +0 -0
  396. {painapple_code-1.1.0 → painapple_code-1.1.2}/src/painapple_code/static/js/token-profile.js +0 -0
  397. {painapple_code-1.1.0 → painapple_code-1.1.2}/src/painapple_code/static/js/tool-renderer-blocks.js +0 -0
  398. {painapple_code-1.1.0 → painapple_code-1.1.2}/src/painapple_code/static/js/tool-renderer-thinking.js +0 -0
  399. {painapple_code-1.1.0 → painapple_code-1.1.2}/src/painapple_code/static/js/tool-renderer.js +0 -0
  400. {painapple_code-1.1.0 → painapple_code-1.1.2}/src/painapple_code/static/js/tooltips.js +0 -0
  401. {painapple_code-1.1.0 → painapple_code-1.1.2}/src/painapple_code/static/js/upload-manager.js +0 -0
  402. {painapple_code-1.1.0 → painapple_code-1.1.2}/src/painapple_code/static/js/utils.js +0 -0
  403. {painapple_code-1.1.0 → painapple_code-1.1.2}/src/painapple_code/static/js/welcome/api.js +0 -0
  404. {painapple_code-1.1.0 → painapple_code-1.1.2}/src/painapple_code/static/js/welcome/cards.js +0 -0
  405. {painapple_code-1.1.0 → painapple_code-1.1.2}/src/painapple_code/static/js/welcome/context-menu.js +0 -0
  406. {painapple_code-1.1.0 → painapple_code-1.1.2}/src/painapple_code/static/js/welcome/families.js +0 -0
  407. {painapple_code-1.1.0 → painapple_code-1.1.2}/src/painapple_code/static/js/welcome/preview.js +0 -0
  408. {painapple_code-1.1.0 → painapple_code-1.1.2}/src/painapple_code/static/js/welcome/state.js +0 -0
  409. {painapple_code-1.1.0 → painapple_code-1.1.2}/src/painapple_code/static/js/welcome.js +0 -0
  410. {painapple_code-1.1.0 → painapple_code-1.1.2}/src/painapple_code/static/js/widget-system/base-widget.js +0 -0
  411. {painapple_code-1.1.0 → painapple_code-1.1.2}/src/painapple_code/static/js/widget-system/device-manager.js +0 -0
  412. {painapple_code-1.1.0 → painapple_code-1.1.2}/src/painapple_code/static/js/widget-system/event-bus.js +0 -0
  413. {painapple_code-1.1.0 → painapple_code-1.1.2}/src/painapple_code/static/js/widget-system/icons.js +0 -0
  414. {painapple_code-1.1.0 → painapple_code-1.1.2}/src/painapple_code/static/js/widget-system/index.js +0 -0
  415. {painapple_code-1.1.0 → painapple_code-1.1.2}/src/painapple_code/static/js/widget-system/init.js +0 -0
  416. {painapple_code-1.1.0 → painapple_code-1.1.2}/src/painapple_code/static/js/widget-system/types/bottom-sheet.js +0 -0
  417. {painapple_code-1.1.0 → painapple_code-1.1.2}/src/painapple_code/static/js/widget-system/types/floating.js +0 -0
  418. {painapple_code-1.1.0 → painapple_code-1.1.2}/src/painapple_code/static/js/widget-system/types/index.js +0 -0
  419. {painapple_code-1.1.0 → painapple_code-1.1.2}/src/painapple_code/static/js/widget-system/types/modal.js +0 -0
  420. {painapple_code-1.1.0 → painapple_code-1.1.2}/src/painapple_code/static/js/widget-system/types/sidebar.js +0 -0
  421. {painapple_code-1.1.0 → painapple_code-1.1.2}/src/painapple_code/static/js/widget-system/types/tab.js +0 -0
  422. {painapple_code-1.1.0 → painapple_code-1.1.2}/src/painapple_code/static/js/widget-system/types/top-sheet.js +0 -0
  423. {painapple_code-1.1.0 → painapple_code-1.1.2}/src/painapple_code/static/js/widget-system/widget-manager.js +0 -0
  424. {painapple_code-1.1.0 → painapple_code-1.1.2}/src/painapple_code/static/js/widgets/about-widget.js +0 -0
  425. {painapple_code-1.1.0 → painapple_code-1.1.2}/src/painapple_code/static/js/widgets/active-sessions-widget.js +0 -0
  426. {painapple_code-1.1.0 → painapple_code-1.1.2}/src/painapple_code/static/js/widgets/agents-widget.js +0 -0
  427. {painapple_code-1.1.0 → painapple_code-1.1.2}/src/painapple_code/static/js/widgets/browser-widget.js +0 -0
  428. {painapple_code-1.1.0 → painapple_code-1.1.2}/src/painapple_code/static/js/widgets/commands-widget.js +0 -0
  429. {painapple_code-1.1.0 → painapple_code-1.1.2}/src/painapple_code/static/js/widgets/config/commit-sections.js +0 -0
  430. {painapple_code-1.1.0 → painapple_code-1.1.2}/src/painapple_code/static/js/widgets/config/dir-autocomplete.js +0 -0
  431. {painapple_code-1.1.0 → painapple_code-1.1.2}/src/painapple_code/static/js/widgets/config/gestures.js +0 -0
  432. {painapple_code-1.1.0 → painapple_code-1.1.2}/src/painapple_code/static/js/widgets/config/models-tab.js +0 -0
  433. {painapple_code-1.1.0 → painapple_code-1.1.2}/src/painapple_code/static/js/widgets/config/quick-actions-tab.js +0 -0
  434. {painapple_code-1.1.0 → painapple_code-1.1.2}/src/painapple_code/static/js/widgets/config/shortcut-editor.js +0 -0
  435. {painapple_code-1.1.0 → painapple_code-1.1.2}/src/painapple_code/static/js/widgets/config/state.js +0 -0
  436. {painapple_code-1.1.0 → painapple_code-1.1.2}/src/painapple_code/static/js/widgets/config/system-controls.js +0 -0
  437. {painapple_code-1.1.0 → painapple_code-1.1.2}/src/painapple_code/static/js/widgets/config-widget.js +0 -0
  438. {painapple_code-1.1.0 → painapple_code-1.1.2}/src/painapple_code/static/js/widgets/cost-analytics-widget.js +0 -0
  439. {painapple_code-1.1.0 → painapple_code-1.1.2}/src/painapple_code/static/js/widgets/debug-widget.js +0 -0
  440. {painapple_code-1.1.0 → painapple_code-1.1.2}/src/painapple_code/static/js/widgets/diff-viewer-widget.js +0 -0
  441. {painapple_code-1.1.0 → painapple_code-1.1.2}/src/painapple_code/static/js/widgets/discussion-widget.js +0 -0
  442. {painapple_code-1.1.0 → painapple_code-1.1.2}/src/painapple_code/static/js/widgets/file-explorer-widget.js +0 -0
  443. {painapple_code-1.1.0 → painapple_code-1.1.2}/src/painapple_code/static/js/widgets/file-preview-widget.js +0 -0
  444. {painapple_code-1.1.0 → painapple_code-1.1.2}/src/painapple_code/static/js/widgets/git-widget.js +0 -0
  445. {painapple_code-1.1.0 → painapple_code-1.1.2}/src/painapple_code/static/js/widgets/helpers-install-widget.js +0 -0
  446. {painapple_code-1.1.0 → painapple_code-1.1.2}/src/painapple_code/static/js/widgets/history-explorer-widget.js +0 -0
  447. {painapple_code-1.1.0 → painapple_code-1.1.2}/src/painapple_code/static/js/widgets/image-annotate-widget.js +0 -0
  448. {painapple_code-1.1.0 → painapple_code-1.1.2}/src/painapple_code/static/js/widgets/image-preview-widget.js +0 -0
  449. {painapple_code-1.1.0 → painapple_code-1.1.2}/src/painapple_code/static/js/widgets/index.js +0 -0
  450. {painapple_code-1.1.0 → painapple_code-1.1.2}/src/painapple_code/static/js/widgets/log-explorer-widget.js +0 -0
  451. {painapple_code-1.1.0 → painapple_code-1.1.2}/src/painapple_code/static/js/widgets/plugins-widget.js +0 -0
  452. {painapple_code-1.1.0 → painapple_code-1.1.2}/src/painapple_code/static/js/widgets/prompt-explorer-widget.js +0 -0
  453. {painapple_code-1.1.0 → painapple_code-1.1.2}/src/painapple_code/static/js/widgets/search-files-widget.js +0 -0
  454. {painapple_code-1.1.0 → painapple_code-1.1.2}/src/painapple_code/static/js/widgets/skills-widget.js +0 -0
  455. {painapple_code-1.1.0 → painapple_code-1.1.2}/src/painapple_code/static/js/widgets/snippets-widget.js +0 -0
  456. {painapple_code-1.1.0 → painapple_code-1.1.2}/src/painapple_code/static/js/widgets/sub-agents-widget.js +0 -0
  457. {painapple_code-1.1.0 → painapple_code-1.1.2}/src/painapple_code/static/js/widgets/tasks-widget.js +0 -0
  458. {painapple_code-1.1.0 → painapple_code-1.1.2}/src/painapple_code/static/js/widgets/terminal/connection.js +0 -0
  459. {painapple_code-1.1.0 → painapple_code-1.1.2}/src/painapple_code/static/js/widgets/terminal/gestures.js +0 -0
  460. {painapple_code-1.1.0 → painapple_code-1.1.2}/src/painapple_code/static/js/widgets/terminal/init.js +0 -0
  461. {painapple_code-1.1.0 → painapple_code-1.1.2}/src/painapple_code/static/js/widgets/terminal/link-providers.js +0 -0
  462. {painapple_code-1.1.0 → painapple_code-1.1.2}/src/painapple_code/static/js/widgets/terminal/osc52.js +0 -0
  463. {painapple_code-1.1.0 → painapple_code-1.1.2}/src/painapple_code/static/js/widgets/terminal/render.js +0 -0
  464. {painapple_code-1.1.0 → painapple_code-1.1.2}/src/painapple_code/static/js/widgets/terminal/size.js +0 -0
  465. {painapple_code-1.1.0 → painapple_code-1.1.2}/src/painapple_code/static/js/widgets/terminal/state.js +0 -0
  466. {painapple_code-1.1.0 → painapple_code-1.1.2}/src/painapple_code/static/js/widgets/terminal/wrap-utils.js +0 -0
  467. {painapple_code-1.1.0 → painapple_code-1.1.2}/src/painapple_code/static/js/widgets/terminal-widget.js +0 -0
  468. {painapple_code-1.1.0 → painapple_code-1.1.2}/src/painapple_code/static/js/widgets/uploads-widget.js +0 -0
  469. {painapple_code-1.1.0 → painapple_code-1.1.2}/src/painapple_code/static/js/widgets/zen-widget.js +0 -0
  470. {painapple_code-1.1.0 → painapple_code-1.1.2}/src/painapple_code/static/manifest.json +0 -0
  471. {painapple_code-1.1.0 → painapple_code-1.1.2}/src/painapple_code/static/sw.js +0 -0
  472. {painapple_code-1.1.0 → painapple_code-1.1.2}/src/painapple_code/static/vendor/LICENSES.txt +0 -0
  473. {painapple_code-1.1.0 → painapple_code-1.1.2}/src/painapple_code/static/vendor/README.md +0 -0
  474. {painapple_code-1.1.0 → painapple_code-1.1.2}/src/painapple_code/static/vendor/codemirror.js +0 -0
  475. {painapple_code-1.1.0 → painapple_code-1.1.2}/src/painapple_code/static/vendor/codemirror.js.LEGAL.txt +0 -0
  476. {painapple_code-1.1.0 → painapple_code-1.1.2}/src/painapple_code/static/vendor/github-markdown-dark.min.css +0 -0
  477. {painapple_code-1.1.0 → painapple_code-1.1.2}/src/painapple_code/static/vendor/highlight-github-dark.min.css +0 -0
  478. {painapple_code-1.1.0 → painapple_code-1.1.2}/src/painapple_code/static/vendor/highlight-lang-dockerfile.min.js +0 -0
  479. {painapple_code-1.1.0 → painapple_code-1.1.2}/src/painapple_code/static/vendor/highlight-lang-nginx.min.js +0 -0
  480. {painapple_code-1.1.0 → painapple_code-1.1.2}/src/painapple_code/static/vendor/highlight-lang-properties.min.js +0 -0
  481. {painapple_code-1.1.0 → painapple_code-1.1.2}/src/painapple_code/static/vendor/highlight-lang-scala.min.js +0 -0
  482. {painapple_code-1.1.0 → painapple_code-1.1.2}/src/painapple_code/static/vendor/highlight.min.js +0 -0
  483. {painapple_code-1.1.0 → painapple_code-1.1.2}/src/painapple_code/static/vendor/marked.min.js +0 -0
  484. {painapple_code-1.1.0 → painapple_code-1.1.2}/src/painapple_code/static/vendor/purify.min.js +0 -0
  485. {painapple_code-1.1.0 → painapple_code-1.1.2}/src/painapple_code/static/vendor/xterm-addon-fit.js +0 -0
  486. {painapple_code-1.1.0 → painapple_code-1.1.2}/src/painapple_code/static/vendor/xterm.css +0 -0
  487. {painapple_code-1.1.0 → painapple_code-1.1.2}/src/painapple_code/static/vendor/xterm.js +0 -0
  488. {painapple_code-1.1.0 → painapple_code-1.1.2}/src/painapple_code/subprocess_registry.py +0 -0
  489. {painapple_code-1.1.0 → painapple_code-1.1.2}/src/painapple_code/tls_cert.py +0 -0
  490. {painapple_code-1.1.0 → painapple_code-1.1.2}/src/painapple_code/tools/excalidraw-to-svg.js +0 -0
  491. {painapple_code-1.1.0 → painapple_code-1.1.2}/src/painapple_code/tools/install-helpers.sh +0 -0
  492. {painapple_code-1.1.0 → painapple_code-1.1.2}/src/painapple_code/tools/shadow-git +0 -0
  493. {painapple_code-1.1.0 → painapple_code-1.1.2}/src/painapple_code/tools/shadow-query +0 -0
  494. {painapple_code-1.1.0 → painapple_code-1.1.2}/src/painapple_code/tools/vegalite-to-svg.js +0 -0
  495. {painapple_code-1.1.0 → painapple_code-1.1.2}/src/painapple_code/turn_query.py +0 -0
  496. {painapple_code-1.1.0 → painapple_code-1.1.2}/src/painapple_code/turn_tracker.py +0 -0
  497. {painapple_code-1.1.0 → painapple_code-1.1.2}/src/painapple_code/utils/__init__.py +0 -0
  498. {painapple_code-1.1.0 → painapple_code-1.1.2}/src/painapple_code/utils/agent_cli.py +0 -0
  499. {painapple_code-1.1.0 → painapple_code-1.1.2}/src/painapple_code/utils/bash_file_ops.py +0 -0
  500. {painapple_code-1.1.0 → painapple_code-1.1.2}/src/painapple_code/utils/chart.py +0 -0
  501. {painapple_code-1.1.0 → painapple_code-1.1.2}/src/painapple_code/utils/excalidraw.py +0 -0
  502. {painapple_code-1.1.0 → painapple_code-1.1.2}/src/painapple_code/utils/file_lock.py +0 -0
  503. {painapple_code-1.1.0 → painapple_code-1.1.2}/src/painapple_code/utils/file_paths.py +0 -0
  504. {painapple_code-1.1.0 → painapple_code-1.1.2}/src/painapple_code/utils/generate_icons.py +0 -0
  505. {painapple_code-1.1.0 → painapple_code-1.1.2}/src/painapple_code/utils/proc.py +0 -0
  506. {painapple_code-1.1.0 → painapple_code-1.1.2}/src/painapple_code/utils/pty_backend.py +0 -0
  507. {painapple_code-1.1.0 → painapple_code-1.1.2}/src/painapple_code/utils/pty_windows.py +0 -0
  508. {painapple_code-1.1.0 → painapple_code-1.1.2}/src/painapple_code/utils/token_profiles.py +0 -0
  509. {painapple_code-1.1.0 → painapple_code-1.1.2}/src/painapple_code/viewer_templates.py +0 -0
  510. {painapple_code-1.1.0 → painapple_code-1.1.2}/src/painapple_code/welcome_search.py +0 -0
  511. {painapple_code-1.1.0 → painapple_code-1.1.2}/src/painapple_code.egg-info/dependency_links.txt +0 -0
  512. {painapple_code-1.1.0 → painapple_code-1.1.2}/src/painapple_code.egg-info/entry_points.txt +0 -0
  513. {painapple_code-1.1.0 → painapple_code-1.1.2}/src/painapple_code.egg-info/requires.txt +0 -0
  514. {painapple_code-1.1.0 → painapple_code-1.1.2}/src/painapple_code.egg-info/top_level.txt +0 -0
  515. {painapple_code-1.1.0 → painapple_code-1.1.2}/start.sh +0 -0
@@ -2,6 +2,27 @@
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.1.2 — 2026-09-30
6
+
7
+ ### Added
8
+
9
+ - `pbcopy` in the built-in terminal on Linux and macOS servers: `git diff | pbcopy` copies to the clipboard of the device you're using (via OSC 52, so it needs Settings → Terminal → "Terminal apps may write to clipboard"; inside tmux also `set -g allow-passthrough on`). A server's native `pbcopy` still takes priority.
10
+
11
+ ### Changed
12
+
13
+ - Claude Sonnet 5.5 replaces Sonnet 5 in the model catalog, and is the new default model for the shadow-git-helper subagent.
14
+
15
+ ## 1.1.1 — 2026-09-23
16
+
17
+ ### Added
18
+
19
+ - Claude Opus 5.5 (1M context) in the model catalog, replacing Opus 4.8.
20
+
21
+ ### Fixed
22
+
23
+ - Fresh installs show the real app icon — in the browser tab, on the login page and as the installed PWA/home-screen icon — instead of a generic "P" tile, and the service worker no longer fails to install from the login page.
24
+ - `painapple setup` no longer forces a container-runtime choice: a **Skip** option (the default when nothing is configured yet) leaves the runtime and image untouched, and an existing custom runtime path is kept on Enter.
25
+
5
26
  ## 1.1.0 — 2026-09-08
6
27
 
7
28
  Also ships everything listed under **1.0.5** below — that tag was cut but never published.
@@ -1,6 +1,6 @@
1
1
  Metadata-Version: 2.4
2
2
  Name: painapple-code
3
- Version: 1.1.0
3
+ Version: 1.1.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
@@ -59,6 +59,10 @@ With it enabled, three guardrails stay on unconditionally:
59
59
  - **Reading the clipboard is never allowed.** The OSC 52 read form is consumed and refused, so a terminal program can't see what you've copied.
60
60
  - **Reconnects never replay writes.** Scrollback replayed after a reconnect (which iPad PWAs do constantly) is stripped of clipboard sequences server-side, so an hour-old yank can't re-hijack your clipboard when a tab wakes up.
61
61
 
62
+ ### `pbcopy`
63
+
64
+ Terminals on Linux and macOS servers come with a `pbcopy` that works like the macOS one, except it copies to the clipboard of the device you're using. `git diff | pbcopy`, `pbcopy < notes.txt` and `pwd | pbcopy` all work. It sends OSC 52, so it needs the setting above, and inside tmux it also needs `set -g allow-passthrough on`. It's added to the **end** of `PATH`, which means a macOS server's own `pbcopy` still takes priority. There is no `pbpaste`, because terminal programs are never allowed to read the clipboard. To paste, use Cmd/Ctrl+V.
65
+
62
66
  ## Logging into Claude from the terminal
63
67
 
64
68
  The Claude CLI's OAuth login is interactive, so the `/login` slash command drops you into a terminal tab pre-typed with `claude auth login` — follow the prompts there. If the CLI hits an expired or missing token mid-session, the error card in the chat includes a one-click **Login** button that opens the same terminal. `/logout` mirrors this with `claude auth logout`.
@@ -24,7 +24,7 @@ It's the containerized twin of a bare `painapple`: the current directory (or `--
24
24
 
25
25
  ## Global defaults vs profiles
26
26
 
27
- `painapple setup` (no name) saves **global** defaults to `~/.painapple-code/serve.yaml`: the network bind (host/port/TLS) for a bare serve, and the container runtime for `--in-docker` — a chooser listing every runtime detected on the machine (with version and path), a custom binary path, and the image tag.
27
+ `painapple setup` (no name) saves **global** defaults to `~/.painapple-code/serve.yaml`: the network bind (host/port/TLS) for a bare serve, and the container runtime for `--in-docker` — optional (**Skip** is the default until one is configured), a chooser listing every runtime detected on the machine (with version and path), a custom binary path, and the image tag.
28
28
 
29
29
  Workspace and cosmetics are deliberately **not** global: a bare `painapple` always serves the directory you launch it from, and a label/accent only makes sense on a named deployment. Those live in profiles.
30
30
 
@@ -6,7 +6,7 @@ Flags and environment variables for the default server invocation — `painapple
6
6
 
7
7
  ## Saved defaults — `painapple setup`
8
8
 
9
- `painapple setup` is an interactive wizard that saves **global** defaults to `~/.painapple-code/serve.yaml`: the network bind (host/port/TLS) a bare `painapple` starts with, and the container runtime + image used by [`--in-docker`](profiles.md#ad-hoc-container-mode-in-docker). Explicit flags always override the saved values. Two quick sections plus a review screen; nothing is written until you confirm.
9
+ `painapple setup` is an interactive wizard that saves **global** defaults to `~/.painapple-code/serve.yaml`: the network bind (host/port/TLS) a bare `painapple` starts with, and — optionally, skippable if you don't use containers — the container runtime + image used by [`--in-docker`](profiles.md#ad-hoc-container-mode-in-docker). Explicit flags always override the saved values. Two quick sections plus a review screen; nothing is written until you confirm.
10
10
 
11
11
  Workspace and cosmetics are **profile-only** since the CLI unification — a bare `painapple` serves the cwd, and a label/accent belongs to a named deployment. `painapple setup NAME` creates/edits that [profile](profiles.md) instead (host or docker mode).
12
12
 
@@ -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.0'
22
- __version_tuple__ = version_tuple = (1, 1, 0)
21
+ __version__ = version = '1.1.2'
22
+ __version_tuple__ = version_tuple = (1, 1, 2)
23
23
 
24
- __commit_id__ = commit_id = 'g599bd34'
24
+ __commit_id__ = commit_id = 'g2fe4788'
@@ -103,6 +103,9 @@ PUBLIC_PATHS = frozenset({
103
103
  # the form falls back to a native GET submit and the password lands in
104
104
  # the URL instead of a POST to /api/login.
105
105
  "/static/js/login.js",
106
+ # Implicit browser request. /instance-icons/ is the public icon channel;
107
+ # this is the same file under the name the browser asks for on its own.
108
+ "/favicon.ico",
106
109
  })
107
110
 
108
111
  PUBLIC_PREFIXES = (
@@ -147,24 +147,51 @@ def step_cosmetics(cfg, back, n=3, default_label=""):
147
147
  def step_runtime(cfg, back, n=2):
148
148
  from painapple_code.cli.deploy.runtime import detect_runtimes
149
149
  _section(n, "Container runtime",
150
- "Used by `painapple --in-docker` and docker-mode profiles")
150
+ "Optional — only used by `painapple --in-docker` and "
151
+ "docker-mode profiles")
151
152
  detected = detect_runtimes()
152
- choices = [Choice("", "Auto", "prefer docker, fall back to podman")]
153
+ # "Skip" leaves runtime/image untouched rather than writing a value:
154
+ # a user who never types --in-docker has nothing to answer here, and
155
+ # one who already configured a runtime shouldn't have to re-pick it
156
+ # to get past the step.
157
+ choices = [Choice("skip", "Skip — not using containers",
158
+ "leave these defaults alone"),
159
+ Choice("", "Auto", "prefer docker, fall back to podman")]
153
160
  for name, path, version in detected:
154
161
  choices.append(Choice(name, f"{name} {version}".strip(), path))
162
+
163
+ # A configured binary path is offered as its own row, so Enter keeps
164
+ # it. Defaulting to "custom" instead (as this once did) pre-armed the
165
+ # binary-path text prompt for anyone whose runtime came from a custom
166
+ # pick or the docker.yaml migration. The row is added even when the
167
+ # path matches a detected runtime: `podman` and `/usr/bin/podman` are
168
+ # different saved values (PATH lookup vs pinned binary), so collapsing
169
+ # them would rewrite the user's config on a plain Enter.
170
+ current = cfg.get("runtime") or ""
171
+ if current and current not in {c.value for c in choices}:
172
+ choices.append(Choice(current, f"Custom: {current}",
173
+ "configured binary path"))
155
174
  choices.append(Choice("custom", "Custom binary path…",
156
175
  "a docker/podman-compatible CLI"))
157
176
  if not detected:
158
177
  warn("Neither docker nor podman found on PATH — --in-docker needs "
159
- "one installed (or a custom binary path).")
178
+ "one installed (or a custom binary path). Skip if you don't "
179
+ "use containers.")
160
180
 
161
- current = cfg.get("runtime") or ""
181
+ # Nothing configured yet → land on Skip, so a user who only came for
182
+ # the network settings can Enter straight past. Note "" (Auto) is
183
+ # itself a valid choice value, so this can't be folded into a
184
+ # `current in known` test.
162
185
  known = {c.value for c in choices}
163
- picked = ui.select("Runtime", choices,
164
- default=current if current in known else "custom",
165
- back=back)
186
+ if cfg.get("runtime") or cfg.get("image"):
187
+ default = current if current in known else ""
188
+ else:
189
+ default = "skip"
190
+ picked = ui.select("Runtime", choices, default=default, back=back)
166
191
  if picked is BACK:
167
192
  return BACK
193
+ if picked == "skip":
194
+ return None
168
195
  if picked == "custom":
169
196
  path = ui.text(
170
197
  "Runtime binary path (docker/podman-compatible)",
@@ -3,14 +3,14 @@
3
3
  # this over models.yaml. Keep in sync with the shipped models.yaml.
4
4
 
5
5
  selectable:
6
- - id: claude-sonnet-5
7
- label: Sonnet 5
6
+ - id: claude-sonnet-5-5
7
+ label: Sonnet 5.5
8
8
  desc: Balanced speed and capability
9
+ - id: claude-opus-5-5[1m]
10
+ label: Opus 5.5 (1M)
11
+ desc: Long-running agentic coding and knowledge work
9
12
  - id: claude-opus-5[1m]
10
13
  label: Opus 5 (1M)
11
- desc: Complex agentic coding and enterprise work
12
- - id: claude-opus-4-8[1m]
13
- label: Opus 4.8 (1M)
14
14
  desc: Previous Opus tier (1M context)
15
15
  - id: claude-fable-5-1[1m]
16
16
  label: Fable 5.1
@@ -3,14 +3,14 @@
3
3
  # Edit via Settings → Providers, or by hand (both work).
4
4
 
5
5
  selectable:
6
- - id: claude-sonnet-5
7
- label: Sonnet 5
6
+ - id: claude-sonnet-5-5
7
+ label: Sonnet 5.5
8
8
  desc: Balanced speed and capability
9
+ - id: claude-opus-5-5[1m]
10
+ label: Opus 5.5 (1M)
11
+ desc: Long-running agentic coding and knowledge work
9
12
  - id: claude-opus-5[1m]
10
13
  label: Opus 5 (1M)
11
- desc: Complex agentic coding and enterprise work
12
- - id: claude-opus-4-8[1m]
13
- label: Opus 4.8 (1M)
14
14
  desc: Previous Opus tier (1M context)
15
15
  - id: claude-fable-5-1[1m]
16
16
  label: Fable 5.1
@@ -633,7 +633,7 @@ def save_global_config(config: dict):
633
633
  # Persisted in the global config so it survives helper reinstalls
634
634
  # (install-helpers.sh cp -f's the bundled default over the top; we re-apply this).
635
635
  HELPER_AGENT_INHERIT = "inherit"
636
- DEFAULT_HELPER_AGENT_MODEL = "claude-sonnet-5"
636
+ DEFAULT_HELPER_AGENT_MODEL = "claude-sonnet-5-5"
637
637
 
638
638
 
639
639
  def get_helper_agent_options() -> list[str]:
@@ -1563,8 +1563,12 @@ async def service_worker():
1563
1563
  # module graph, so it is not covered by either arm of `shell`.
1564
1564
  f"/static/js/boot.js?v={version}",
1565
1565
  *[f"/static/{rel}?v={version}" for rel in shell],
1566
- "/static/icons/icon-192.png",
1567
- "/static/icons/icon-512.png",
1566
+ # Public icon route, not /static/icons/ — cache.addAll() rejects
1567
+ # the ENTIRE precache if any single entry is non-2xx, so a 401
1568
+ # here would fail the whole service-worker install (e.g. when
1569
+ # the SW registers from the pre-auth login page).
1570
+ "/instance-icons/icon-192.png",
1571
+ "/instance-icons/icon-512.png",
1568
1572
  ]
1569
1573
  # Inject version into SW
1570
1574
  content = (
@@ -1625,6 +1629,18 @@ async def serve_instance_icon(filename: str):
1625
1629
  raise HTTPException(status_code=404, detail="Icon not found")
1626
1630
 
1627
1631
 
1632
+ @app.get("/favicon.ico")
1633
+ async def serve_favicon():
1634
+ """Root favicon, public — browsers request it implicitly.
1635
+
1636
+ Every HTML shell carries explicit <link rel="icon"> tags, so this is a
1637
+ backstop for the contexts that don't consult them (bare 404 pages, some
1638
+ feed/bookmark readers). Without it the implicit request 401s and the
1639
+ browser caches the failure as "no icon".
1640
+ """
1641
+ return await serve_instance_icon("favicon.ico")
1642
+
1643
+
1628
1644
  @app.get("/manifest.json")
1629
1645
  async def manifest():
1630
1646
  """Serve PWA manifest, customized for instance identity if configured."""
@@ -1639,8 +1655,18 @@ async def manifest():
1639
1655
  data["name"] = f"pAInapple Code {name}"
1640
1656
  data["short_name"] = f"pAInapple {name}"
1641
1657
 
1642
- if _instance_icons_dir:
1643
- for icon in data.get("icons", []):
1658
+ # Always point at /instance-icons/, never /static/icons/ — the manifest
1659
+ # itself is public but /static/ is NOT, and a browser fetches manifest
1660
+ # icons without credentials even for a logged-in user. Pointing at
1661
+ # /static/icons/ therefore 401s on every icon and the PWA falls back to
1662
+ # a synthesized initial-letter tile ("P"). serve_instance_icon() already
1663
+ # falls back to the shipped artwork when no instance dir exists, so this
1664
+ # is correct with or without --instance-name.
1665
+ for icon in data.get("icons", []):
1666
+ size = icon["sizes"].split("x")[0]
1667
+ icon["src"] = f"/instance-icons/icon-{size}.png"
1668
+ for shortcut in data.get("shortcuts", []):
1669
+ for icon in shortcut.get("icons", []):
1644
1670
  size = icon["sizes"].split("x")[0]
1645
1671
  icon["src"] = f"/instance-icons/icon-{size}.png"
1646
1672
 
@@ -7,6 +7,12 @@
7
7
  <meta name="viewport" content="width=device-width, initial-scale=1.0, viewport-fit=contain">
8
8
  <meta name="theme-color" content="#0d1117">
9
9
  <title>Sign in &middot; pAInapple Code</title>
10
+ <!-- /instance-icons/, not /static/icons/ — this page is served pre-auth
11
+ and /static/ is not allowlisted. Without these the browser falls
12
+ back to an implicit /favicon.ico and the tab shows a blank sheet. -->
13
+ <link rel="icon" type="image/png" sizes="32x32" href="/instance-icons/favicon-32.png">
14
+ <link rel="icon" type="image/x-icon" href="/instance-icons/favicon.ico">
15
+ <link rel="apple-touch-icon" href="/instance-icons/apple-touch-icon.png">
10
16
  <link rel="stylesheet" href="/static/css/login.css">
11
17
  </head>
12
18
  <body>
@@ -25,12 +25,12 @@
25
25
  <link rel="manifest" href="/manifest.json">
26
26
 
27
27
  <!-- Favicons & Icons -->
28
- <link rel="icon" type="image/png" sizes="32x32" href="/static/icons/favicon-32.png">
29
- <link rel="icon" type="image/x-icon" href="/static/icons/favicon.ico">
30
- <link rel="apple-touch-icon" href="/static/icons/apple-touch-icon.png">
31
- <link rel="apple-touch-icon" sizes="152x152" href="/static/icons/icon-152.png">
32
- <link rel="apple-touch-icon" sizes="180x180" href="/static/icons/icon-180.png">
33
- <link rel="apple-touch-icon" sizes="167x167" href="/static/icons/icon-152.png">
28
+ <link rel="icon" type="image/png" sizes="32x32" href="/instance-icons/favicon-32.png">
29
+ <link rel="icon" type="image/x-icon" href="/instance-icons/favicon.ico">
30
+ <link rel="apple-touch-icon" href="/instance-icons/apple-touch-icon.png">
31
+ <link rel="apple-touch-icon" sizes="152x152" href="/instance-icons/icon-152.png">
32
+ <link rel="apple-touch-icon" sizes="180x180" href="/instance-icons/icon-180.png">
33
+ <link rel="apple-touch-icon" sizes="167x167" href="/instance-icons/icon-152.png">
34
34
 
35
35
  <!-- External Libraries (vendored via tools/package.json build pipeline) -->
36
36
  <!-- Pin marked to v4 for stable API (v5+ has breaking changes) -->
@@ -1,7 +1,7 @@
1
1
  ---
2
2
  name: shadow-git-helper
3
3
  description: "Searches Shadow Git repository to find file history, changes by session, blame analysis, and code archaeology. Uses git commands on the bare repo to trace when/how/why code changed."
4
- model: claude-sonnet-5
4
+ model: claude-sonnet-5-5
5
5
  ---
6
6
 
7
7
  # Shadow Git Helper - Code Archaeologist
@@ -0,0 +1,40 @@
1
+ #!/bin/sh
2
+ # pbcopy for painapple terminals — copies stdin to the BROWSER's clipboard.
3
+ #
4
+ # The PTY runs on the server, so a native clipboard tool (if any) would
5
+ # write the server's clipboard, not the one on the device you're typing on.
6
+ # Instead this emits OSC 52 (ESC ] 52 ; c ; <base64> BEL), which the
7
+ # terminal widget turns into navigator.clipboard.writeText() — see
8
+ # static/js/widgets/terminal/osc52.js. That handler is opt-in
9
+ # (Settings → Terminal → "Terminal apps may write to clipboard"); when it's
10
+ # off the widget toasts instead of copying, so a failure is never silent.
11
+ #
12
+ # The server APPENDS this directory to PATH, so a real pbcopy (macOS) still
13
+ # wins. Usage mirrors macOS: `cmd | pbcopy`, `pbcopy < file`. Flags that
14
+ # macOS pbcopy accepts (-pboard, -Prefer) are ignored.
15
+
16
+ # Where the escape goes: the controlling terminal, so `pbcopy >/dev/null`
17
+ # and redirected stdout still work. No tty → nothing can receive it.
18
+ tty_out=/dev/tty
19
+ if ! { true >"$tty_out"; } 2>/dev/null; then
20
+ echo "pbcopy: no terminal to send the clipboard escape to" >&2
21
+ exit 1
22
+ fi
23
+
24
+ # The widget refuses payloads over 2,000,000 base64 chars (~1.5 MB of text).
25
+ max_bytes=1500000
26
+
27
+ data=$(base64 | tr -d '\r\n')
28
+ if [ "${#data}" -gt 2000000 ]; then
29
+ echo "pbcopy: input too large for the terminal clipboard (max ~$max_bytes bytes)" >&2
30
+ exit 1
31
+ fi
32
+
33
+ if [ -n "$TMUX" ]; then
34
+ # Inside tmux the outer terminal never sees an app's raw OSC 52 unless
35
+ # `set-clipboard on`; wrap it in DCS passthrough (tmux >= 3.3 also
36
+ # needs `set -g allow-passthrough on`).
37
+ printf '\033Ptmux;\033\033]52;c;%s\a\033\\' "$data" >"$tty_out"
38
+ else
39
+ printf '\033]52;c;%s\a' "$data" >"$tty_out"
40
+ fi
@@ -20,6 +20,19 @@ import termios
20
20
 
21
21
  logger = logging.getLogger(__name__)
22
22
 
23
+ # Shims that make clipboard tools reach the BROWSER (tools/term-bin/pbcopy
24
+ # emits OSC 52, which the terminal widget handles). Appended — never
25
+ # prepended — to PATH, so a native pbcopy (a macOS server) still wins.
26
+ TERM_BIN_DIR = os.path.join(os.path.dirname(os.path.dirname(os.path.abspath(__file__))), 'tools', 'term-bin')
27
+
28
+
29
+ def with_term_bin(path: str) -> str:
30
+ """PATH with TERM_BIN_DIR appended once (idempotent for nested spawns)."""
31
+ parts = [p for p in path.split(os.pathsep) if p] if path else []
32
+ if TERM_BIN_DIR in parts:
33
+ return path
34
+ return os.pathsep.join(parts + [TERM_BIN_DIR])
35
+
23
36
 
24
37
  class PosixPty:
25
38
  """A forked shell attached to a pty master fd."""
@@ -147,6 +160,7 @@ def spawn_pty(cwd: str, rows: int = 24, cols: int = 80) -> PosixPty:
147
160
 
148
161
  os.environ['TERM'] = 'xterm-256color'
149
162
  os.environ['COLORTERM'] = 'truecolor'
163
+ os.environ['PATH'] = with_term_bin(os.environ.get('PATH', ''))
150
164
 
151
165
  shell = os.environ.get('SHELL', '/bin/bash')
152
166
  os.execvp(shell, [shell, '-i'])
@@ -1,6 +1,6 @@
1
1
  Metadata-Version: 2.4
2
2
  Name: painapple-code
3
- Version: 1.1.0
3
+ Version: 1.1.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
@@ -496,6 +496,7 @@ src/painapple_code/tools/shadow-git
496
496
  src/painapple_code/tools/shadow-query
497
497
  src/painapple_code/tools/vegalite-to-svg.js
498
498
  src/painapple_code/tools/agents/shadow-git-helper.md
499
+ src/painapple_code/tools/term-bin/pbcopy
499
500
  src/painapple_code/utils/__init__.py
500
501
  src/painapple_code/utils/agent_cli.py
501
502
  src/painapple_code/utils/bash_file_ops.py
@@ -504,6 +504,7 @@
504
504
  "src/painapple_code/tools/install-helpers.sh",
505
505
  "src/painapple_code/tools/shadow-git",
506
506
  "src/painapple_code/tools/shadow-query",
507
+ "src/painapple_code/tools/term-bin/pbcopy",
507
508
  "src/painapple_code/tools/vegalite-to-svg.js",
508
509
  "src/painapple_code/turn_query.py",
509
510
  "src/painapple_code/turn_tracker.py",
@@ -633,6 +634,7 @@
633
634
  "tests/test_process_chain_collapse.py",
634
635
  "tests/test_providers.py",
635
636
  "tests/test_security_headers.py",
637
+ "tests/test_terminal_pbcopy.py",
636
638
  "tests/test_text_io_encoding.py",
637
639
  "tests/test_tls_cert_san.py",
638
640
  "tests/test_tls_optional.py",
@@ -0,0 +1,8 @@
1
+ {
2
+ "tag": "1.1.2",
3
+ "distance": 0,
4
+ "node": "g2fe4788",
5
+ "dirty": false,
6
+ "branch": "HEAD",
7
+ "node_date": "2026-09-30"
8
+ }
@@ -1,8 +0,0 @@
1
- {
2
- "tag": "1.1.0",
3
- "distance": 0,
4
- "node": "g599bd34",
5
- "dirty": false,
6
- "branch": "HEAD",
7
- "node_date": "2026-09-08"
8
- }
File without changes
File without changes
File without changes