painapple-code 1.0.0__tar.gz

This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
Files changed (513) hide show
  1. painapple_code-1.0.0/.devcontainer/devcontainer.json +44 -0
  2. painapple_code-1.0.0/.dockerignore +19 -0
  3. painapple_code-1.0.0/.gitignore +93 -0
  4. painapple_code-1.0.0/CHANGELOG.md +7 -0
  5. painapple_code-1.0.0/CONTRIBUTING.md +25 -0
  6. painapple_code-1.0.0/Dockerfile +196 -0
  7. painapple_code-1.0.0/LICENSE +661 -0
  8. painapple_code-1.0.0/MANIFEST.in +24 -0
  9. painapple_code-1.0.0/PKG-INFO +292 -0
  10. painapple_code-1.0.0/README.dockerhub.md +184 -0
  11. painapple_code-1.0.0/README.md +239 -0
  12. painapple_code-1.0.0/SECURITY.md +230 -0
  13. painapple_code-1.0.0/THIRD_PARTY_NOTICES.md +261 -0
  14. painapple_code-1.0.0/build-frontend.sh +49 -0
  15. painapple_code-1.0.0/docker-compose.yml +58 -0
  16. painapple_code-1.0.0/docker-entrypoint.sh +274 -0
  17. painapple_code-1.0.0/docs-site/assets/annotate-editor.png +0 -0
  18. painapple_code-1.0.0/docs-site/assets/browser-widget.png +0 -0
  19. painapple_code-1.0.0/docs-site/assets/comments-stash.gif +0 -0
  20. painapple_code-1.0.0/docs-site/assets/cost-analytics.png +0 -0
  21. painapple_code-1.0.0/docs-site/assets/favicon.png +0 -0
  22. painapple_code-1.0.0/docs-site/assets/input-autocomplete.gif +0 -0
  23. painapple_code-1.0.0/docs-site/assets/logo.png +0 -0
  24. painapple_code-1.0.0/docs-site/assets/markdown-quick-edit.gif +0 -0
  25. painapple_code-1.0.0/docs-site/assets/overview.png +0 -0
  26. painapple_code-1.0.0/docs-site/assets/prompt-history.png +0 -0
  27. painapple_code-1.0.0/docs-site/assets/quick-switcher.gif +0 -0
  28. painapple_code-1.0.0/docs-site/assets/quick-switcher.png +0 -0
  29. painapple_code-1.0.0/docs-site/assets/settings-appearance.png +0 -0
  30. painapple_code-1.0.0/docs-site/assets/settings-claude.png +0 -0
  31. painapple_code-1.0.0/docs-site/assets/shadow-journal.png +0 -0
  32. painapple_code-1.0.0/docs-site/assets/snippets-picker.png +0 -0
  33. painapple_code-1.0.0/docs-site/assets/terminal.gif +0 -0
  34. painapple_code-1.0.0/docs-site/assets/turn-summary-bar-expanded.png +0 -0
  35. painapple_code-1.0.0/docs-site/assets/turn-summary-bar.png +0 -0
  36. painapple_code-1.0.0/docs-site/assets/welcome-screen.png +0 -0
  37. painapple_code-1.0.0/docs-site/assets/zen-mode.png +0 -0
  38. painapple_code-1.0.0/docs-site/features.md +72 -0
  39. painapple_code-1.0.0/docs-site/getting-started/first-run.md +98 -0
  40. painapple_code-1.0.0/docs-site/getting-started/install-devcontainer.md +132 -0
  41. painapple_code-1.0.0/docs-site/getting-started/install-docker.md +178 -0
  42. painapple_code-1.0.0/docs-site/getting-started/install-pip.md +160 -0
  43. painapple_code-1.0.0/docs-site/getting-started/requirements.md +58 -0
  44. painapple_code-1.0.0/docs-site/getting-started/security.md +62 -0
  45. painapple_code-1.0.0/docs-site/guides/analytics-and-history.md +72 -0
  46. painapple_code-1.0.0/docs-site/guides/claude-artifacts.md +90 -0
  47. painapple_code-1.0.0/docs-site/guides/customization.md +89 -0
  48. painapple_code-1.0.0/docs-site/guides/engines.md +61 -0
  49. painapple_code-1.0.0/docs-site/guides/files.md +78 -0
  50. painapple_code-1.0.0/docs-site/guides/git-and-diffs.md +47 -0
  51. painapple_code-1.0.0/docs-site/guides/images-and-annotation.md +80 -0
  52. painapple_code-1.0.0/docs-site/guides/input-and-commands.md +70 -0
  53. painapple_code-1.0.0/docs-site/guides/ipad-and-mobile.md +59 -0
  54. painapple_code-1.0.0/docs-site/guides/permissions-and-thinking.md +70 -0
  55. painapple_code-1.0.0/docs-site/guides/sessions.md +106 -0
  56. painapple_code-1.0.0/docs-site/guides/shadow-git.md +84 -0
  57. painapple_code-1.0.0/docs-site/guides/stash-and-discussions.md +85 -0
  58. painapple_code-1.0.0/docs-site/guides/terminal.md +77 -0
  59. painapple_code-1.0.0/docs-site/guides/welcome-screen.md +56 -0
  60. painapple_code-1.0.0/docs-site/guides/zen-mode.md +52 -0
  61. painapple_code-1.0.0/docs-site/index.md +48 -0
  62. painapple_code-1.0.0/docs-site/reference/api.md +190 -0
  63. painapple_code-1.0.0/docs-site/reference/commands.md +130 -0
  64. painapple_code-1.0.0/docs-site/reference/data-storage.md +135 -0
  65. painapple_code-1.0.0/docs-site/reference/keyboard-shortcuts.md +128 -0
  66. painapple_code-1.0.0/docs-site/reference/optional-helpers.md +109 -0
  67. painapple_code-1.0.0/docs-site/reference/profiles.md +136 -0
  68. painapple_code-1.0.0/docs-site/reference/server-cli.md +236 -0
  69. painapple_code-1.0.0/mkdocs.yml +106 -0
  70. painapple_code-1.0.0/painapple-docker.sh +606 -0
  71. painapple_code-1.0.0/pyproject.toml +100 -0
  72. painapple_code-1.0.0/requirements-docs.txt +1 -0
  73. painapple_code-1.0.0/requirements.txt +61 -0
  74. painapple_code-1.0.0/setup.cfg +4 -0
  75. painapple_code-1.0.0/setup.py +90 -0
  76. painapple_code-1.0.0/src/painapple_code/__init__.py +30 -0
  77. painapple_code-1.0.0/src/painapple_code/__main__.py +18 -0
  78. painapple_code-1.0.0/src/painapple_code/_version.py +24 -0
  79. painapple_code-1.0.0/src/painapple_code/auth_middleware.py +930 -0
  80. painapple_code-1.0.0/src/painapple_code/cli/__init__.py +204 -0
  81. painapple_code-1.0.0/src/painapple_code/cli/deploy/__init__.py +15 -0
  82. painapple_code-1.0.0/src/painapple_code/cli/deploy/claude_seed.py +41 -0
  83. painapple_code-1.0.0/src/painapple_code/cli/deploy/config.py +260 -0
  84. painapple_code-1.0.0/src/painapple_code/cli/deploy/container.py +715 -0
  85. painapple_code-1.0.0/src/painapple_code/cli/deploy/launch.py +163 -0
  86. painapple_code-1.0.0/src/painapple_code/cli/deploy/runtime.py +223 -0
  87. painapple_code-1.0.0/src/painapple_code/cli/lifecycle_cmd.py +443 -0
  88. painapple_code-1.0.0/src/painapple_code/cli/list_cmd.py +572 -0
  89. painapple_code-1.0.0/src/painapple_code/cli/manage_cmd.py +670 -0
  90. painapple_code-1.0.0/src/painapple_code/cli/netinfo.py +125 -0
  91. painapple_code-1.0.0/src/painapple_code/cli/profiles.py +390 -0
  92. painapple_code-1.0.0/src/painapple_code/cli/serve_args.py +163 -0
  93. painapple_code-1.0.0/src/painapple_code/cli/serve_config.py +256 -0
  94. painapple_code-1.0.0/src/painapple_code/cli/setup_cmd.py +664 -0
  95. painapple_code-1.0.0/src/painapple_code/cli/ui.py +438 -0
  96. painapple_code-1.0.0/src/painapple_code/cost_analytics.py +879 -0
  97. painapple_code-1.0.0/src/painapple_code/data/models.defaults.yaml +18 -0
  98. painapple_code-1.0.0/src/painapple_code/data/models.yaml +18 -0
  99. painapple_code-1.0.0/src/painapple_code/data/presets.defaults.json +32 -0
  100. painapple_code-1.0.0/src/painapple_code/data/strings.yaml +2269 -0
  101. painapple_code-1.0.0/src/painapple_code/helpers.py +406 -0
  102. painapple_code-1.0.0/src/painapple_code/paths.py +1514 -0
  103. painapple_code-1.0.0/src/painapple_code/prompt_explorer.py +984 -0
  104. painapple_code-1.0.0/src/painapple_code/providers/__init__.py +224 -0
  105. painapple_code-1.0.0/src/painapple_code/providers/base.py +710 -0
  106. painapple_code-1.0.0/src/painapple_code/providers/claude/__init__.py +74 -0
  107. painapple_code-1.0.0/src/painapple_code/providers/claude/capabilities.py +218 -0
  108. painapple_code-1.0.0/src/painapple_code/providers/claude/errors.py +79 -0
  109. painapple_code-1.0.0/src/painapple_code/providers/claude/launch.py +50 -0
  110. painapple_code-1.0.0/src/painapple_code/providers/claude/summary.py +89 -0
  111. painapple_code-1.0.0/src/painapple_code/providers/claude/translate.py +74 -0
  112. painapple_code-1.0.0/src/painapple_code/providers/claude_sdk/__init__.py +139 -0
  113. painapple_code-1.0.0/src/painapple_code/providers/claude_sdk/driver.py +412 -0
  114. painapple_code-1.0.0/src/painapple_code/providers/codex/__init__.py +87 -0
  115. painapple_code-1.0.0/src/painapple_code/providers/codex/capabilities.py +321 -0
  116. painapple_code-1.0.0/src/painapple_code/providers/codex/errors.py +70 -0
  117. painapple_code-1.0.0/src/painapple_code/providers/codex/launch.py +142 -0
  118. painapple_code-1.0.0/src/painapple_code/providers/codex/summary.py +196 -0
  119. painapple_code-1.0.0/src/painapple_code/providers/codex/translate.py +204 -0
  120. painapple_code-1.0.0/src/painapple_code/providers/codex_app_server/__init__.py +100 -0
  121. painapple_code-1.0.0/src/painapple_code/providers/codex_app_server/capabilities.py +41 -0
  122. painapple_code-1.0.0/src/painapple_code/providers/codex_app_server/launch.py +202 -0
  123. painapple_code-1.0.0/src/painapple_code/providers/codex_app_server/summary.py +291 -0
  124. painapple_code-1.0.0/src/painapple_code/providers/codex_app_server/translate.py +263 -0
  125. painapple_code-1.0.0/src/painapple_code/providers/codex_app_server/transport.py +238 -0
  126. painapple_code-1.0.0/src/painapple_code/routes/__init__.py +0 -0
  127. painapple_code-1.0.0/src/painapple_code/routes/api_agents.py +441 -0
  128. painapple_code-1.0.0/src/painapple_code/routes/api_app.py +368 -0
  129. painapple_code-1.0.0/src/painapple_code/routes/api_app_commit_sections.py +127 -0
  130. painapple_code-1.0.0/src/painapple_code/routes/api_app_config.py +997 -0
  131. painapple_code-1.0.0/src/painapple_code/routes/api_app_session_prefs.py +217 -0
  132. painapple_code-1.0.0/src/painapple_code/routes/api_browser.py +690 -0
  133. painapple_code-1.0.0/src/painapple_code/routes/api_commands.py +374 -0
  134. painapple_code-1.0.0/src/painapple_code/routes/api_costs.py +128 -0
  135. painapple_code-1.0.0/src/painapple_code/routes/api_drafts.py +139 -0
  136. painapple_code-1.0.0/src/painapple_code/routes/api_exec.py +149 -0
  137. painapple_code-1.0.0/src/painapple_code/routes/api_files.py +542 -0
  138. painapple_code-1.0.0/src/painapple_code/routes/api_git.py +657 -0
  139. painapple_code-1.0.0/src/painapple_code/routes/api_logs.py +649 -0
  140. painapple_code-1.0.0/src/painapple_code/routes/api_plugins.py +275 -0
  141. painapple_code-1.0.0/src/painapple_code/routes/api_project_config.py +418 -0
  142. painapple_code-1.0.0/src/painapple_code/routes/api_prompts.py +231 -0
  143. painapple_code-1.0.0/src/painapple_code/routes/api_providers.py +53 -0
  144. painapple_code-1.0.0/src/painapple_code/routes/api_search.py +411 -0
  145. painapple_code-1.0.0/src/painapple_code/routes/api_session_stash.py +234 -0
  146. painapple_code-1.0.0/src/painapple_code/routes/api_session_welcome.py +151 -0
  147. painapple_code-1.0.0/src/painapple_code/routes/api_sessions.py +742 -0
  148. painapple_code-1.0.0/src/painapple_code/routes/api_shadow.py +323 -0
  149. painapple_code-1.0.0/src/painapple_code/routes/api_shadow_db.py +512 -0
  150. painapple_code-1.0.0/src/painapple_code/routes/api_shadow_files.py +332 -0
  151. painapple_code-1.0.0/src/painapple_code/routes/api_shadow_search.py +476 -0
  152. painapple_code-1.0.0/src/painapple_code/routes/api_skills.py +610 -0
  153. painapple_code-1.0.0/src/painapple_code/routes/api_tasks.py +147 -0
  154. painapple_code-1.0.0/src/painapple_code/routes/api_terminal.py +540 -0
  155. painapple_code-1.0.0/src/painapple_code/routes/api_upload.py +293 -0
  156. painapple_code-1.0.0/src/painapple_code/routes/api_viewer.py +229 -0
  157. painapple_code-1.0.0/src/painapple_code/routes/dependencies.py +109 -0
  158. painapple_code-1.0.0/src/painapple_code/routes/ws_chat.py +837 -0
  159. painapple_code-1.0.0/src/painapple_code/server.py +2208 -0
  160. painapple_code-1.0.0/src/painapple_code/server_logging.py +263 -0
  161. painapple_code-1.0.0/src/painapple_code/services/__init__.py +0 -0
  162. painapple_code-1.0.0/src/painapple_code/services/agent_session.py +2738 -0
  163. painapple_code-1.0.0/src/painapple_code/session_store.py +253 -0
  164. painapple_code-1.0.0/src/painapple_code/session_store_core.py +879 -0
  165. painapple_code-1.0.0/src/painapple_code/shadow_db.py +830 -0
  166. painapple_code-1.0.0/src/painapple_code/shadow_db_plans.py +369 -0
  167. painapple_code-1.0.0/src/painapple_code/shadow_db_queries.py +595 -0
  168. painapple_code-1.0.0/src/painapple_code/shadow_db_schema.py +676 -0
  169. painapple_code-1.0.0/src/painapple_code/shadow_git.py +1296 -0
  170. painapple_code-1.0.0/src/painapple_code/shadow_git_frontmatter.py +314 -0
  171. painapple_code-1.0.0/src/painapple_code/shadow_git_sections.py +520 -0
  172. painapple_code-1.0.0/src/painapple_code/shadow_git_summary.py +462 -0
  173. painapple_code-1.0.0/src/painapple_code/shadow_parser.py +560 -0
  174. painapple_code-1.0.0/src/painapple_code/static/css/00-variables.css +276 -0
  175. painapple_code-1.0.0/src/painapple_code/static/css/01-base.css +245 -0
  176. painapple_code-1.0.0/src/painapple_code/static/css/02-tooltips.css +36 -0
  177. painapple_code-1.0.0/src/painapple_code/static/css/09-left-rail.css +448 -0
  178. painapple_code-1.0.0/src/painapple_code/static/css/10-header.css +777 -0
  179. painapple_code-1.0.0/src/painapple_code/static/css/11-connection-bar.css +120 -0
  180. painapple_code-1.0.0/src/painapple_code/static/css/20-messages.css +750 -0
  181. painapple_code-1.0.0/src/painapple_code/static/css/21-tool-blocks.css +2340 -0
  182. painapple_code-1.0.0/src/painapple_code/static/css/22-edit-diff.css +619 -0
  183. painapple_code-1.0.0/src/painapple_code/static/css/23-thinking.css +1584 -0
  184. painapple_code-1.0.0/src/painapple_code/static/css/24-background-tasks.css +359 -0
  185. painapple_code-1.0.0/src/painapple_code/static/css/25-context-block.css +252 -0
  186. painapple_code-1.0.0/src/painapple_code/static/css/26-session-setup.css +144 -0
  187. painapple_code-1.0.0/src/painapple_code/static/css/30-markdown.css +854 -0
  188. painapple_code-1.0.0/src/painapple_code/static/css/40-input.css +2418 -0
  189. painapple_code-1.0.0/src/painapple_code/static/css/41-autocomplete.css +127 -0
  190. painapple_code-1.0.0/src/painapple_code/static/css/42-activity-strip.css +97 -0
  191. painapple_code-1.0.0/src/painapple_code/static/css/43-file-autocomplete.css +121 -0
  192. painapple_code-1.0.0/src/painapple_code/static/css/44-snippets-autocomplete.css +224 -0
  193. painapple_code-1.0.0/src/painapple_code/static/css/45-selection-bar.css +433 -0
  194. painapple_code-1.0.0/src/painapple_code/static/css/46-keyboard-bar.css +119 -0
  195. painapple_code-1.0.0/src/painapple_code/static/css/47-keyboard-longpress.css +116 -0
  196. painapple_code-1.0.0/src/painapple_code/static/css/47-token-profile.css +106 -0
  197. painapple_code-1.0.0/src/painapple_code/static/css/50-welcome.css +3095 -0
  198. painapple_code-1.0.0/src/painapple_code/static/css/51-modals.css +301 -0
  199. painapple_code-1.0.0/src/painapple_code/static/css/52-utilities.css +77 -0
  200. painapple_code-1.0.0/src/painapple_code/static/css/53-image-upload.css +456 -0
  201. painapple_code-1.0.0/src/painapple_code/static/css/54-todo-list.css +102 -0
  202. painapple_code-1.0.0/src/painapple_code/static/css/55-file-upload.css +113 -0
  203. painapple_code-1.0.0/src/painapple_code/static/css/56-chat-navigator.css +218 -0
  204. painapple_code-1.0.0/src/painapple_code/static/css/56-permission-card.css +332 -0
  205. painapple_code-1.0.0/src/painapple_code/static/css/56-plan-approval.css +204 -0
  206. painapple_code-1.0.0/src/painapple_code/static/css/56-question-form.css +602 -0
  207. painapple_code-1.0.0/src/painapple_code/static/css/57-swipe-indicator.css +95 -0
  208. painapple_code-1.0.0/src/painapple_code/static/css/58-session-families.css +627 -0
  209. painapple_code-1.0.0/src/painapple_code/static/css/59-about.css +196 -0
  210. painapple_code-1.0.0/src/painapple_code/static/css/61-log-explorer.css +723 -0
  211. painapple_code-1.0.0/src/painapple_code/static/css/62-json-tree.css +489 -0
  212. painapple_code-1.0.0/src/painapple_code/static/css/62-skills-widget.css +650 -0
  213. painapple_code-1.0.0/src/painapple_code/static/css/63-commands-widget.css +30 -0
  214. painapple_code-1.0.0/src/painapple_code/static/css/63-plugins-widget.css +174 -0
  215. painapple_code-1.0.0/src/painapple_code/static/css/63-terminal.css +516 -0
  216. painapple_code-1.0.0/src/painapple_code/static/css/64-search-files-widget.css +448 -0
  217. painapple_code-1.0.0/src/painapple_code/static/css/65-snippets-widget.css +426 -0
  218. painapple_code-1.0.0/src/painapple_code/static/css/66-active-sessions.css +979 -0
  219. painapple_code-1.0.0/src/painapple_code/static/css/66-agents-widget.css +265 -0
  220. painapple_code-1.0.0/src/painapple_code/static/css/66-file-explorer-widget.css +855 -0
  221. painapple_code-1.0.0/src/painapple_code/static/css/66-git-panel.css +791 -0
  222. painapple_code-1.0.0/src/painapple_code/static/css/66-history-explorer.css +1496 -0
  223. painapple_code-1.0.0/src/painapple_code/static/css/67-diff-viewer.css +602 -0
  224. painapple_code-1.0.0/src/painapple_code/static/css/67-editor-view.css +748 -0
  225. painapple_code-1.0.0/src/painapple_code/static/css/67-file-preview-widget.css +1873 -0
  226. painapple_code-1.0.0/src/painapple_code/static/css/68-browser-widget.css +337 -0
  227. painapple_code-1.0.0/src/painapple_code/static/css/68-compare-wizard.css +355 -0
  228. painapple_code-1.0.0/src/painapple_code/static/css/68-csv-preview.css +106 -0
  229. painapple_code-1.0.0/src/painapple_code/static/css/68-diff-preview.css +103 -0
  230. painapple_code-1.0.0/src/painapple_code/static/css/68-helpers-install-widget.css +491 -0
  231. painapple_code-1.0.0/src/painapple_code/static/css/68-image-annotate.css +346 -0
  232. painapple_code-1.0.0/src/painapple_code/static/css/68-terminal-view.css +98 -0
  233. painapple_code-1.0.0/src/painapple_code/static/css/68-uploads-widget.css +229 -0
  234. painapple_code-1.0.0/src/painapple_code/static/css/69-cost-analytics.css +537 -0
  235. painapple_code-1.0.0/src/painapple_code/static/css/70-config-panel.css +3736 -0
  236. painapple_code-1.0.0/src/painapple_code/static/css/70-excalidraw.css +136 -0
  237. painapple_code-1.0.0/src/painapple_code/static/css/70-prompt-explorer.css +890 -0
  238. painapple_code-1.0.0/src/painapple_code/static/css/71-chart.css +111 -0
  239. painapple_code-1.0.0/src/painapple_code/static/css/72-discussion-sidebar.css +678 -0
  240. painapple_code-1.0.0/src/painapple_code/static/css/74-debug-logs.css +656 -0
  241. painapple_code-1.0.0/src/painapple_code/static/css/80-open-dialog.css +146 -0
  242. painapple_code-1.0.0/src/painapple_code/static/css/80-quick-switcher.css +383 -0
  243. painapple_code-1.0.0/src/painapple_code/static/css/80-widget-system.css +1763 -0
  244. painapple_code-1.0.0/src/painapple_code/static/css/81-quick-actions.css +1020 -0
  245. painapple_code-1.0.0/src/painapple_code/static/css/82-context-popover.css +1233 -0
  246. painapple_code-1.0.0/src/painapple_code/static/css/83-context-menu.css +339 -0
  247. painapple_code-1.0.0/src/painapple_code/static/css/85-lazy-loading.css +102 -0
  248. painapple_code-1.0.0/src/painapple_code/static/css/86-zen-mode.css +708 -0
  249. painapple_code-1.0.0/src/painapple_code/static/css/87-grid-switcher.css +346 -0
  250. painapple_code-1.0.0/src/painapple_code/static/css/login.css +198 -0
  251. painapple_code-1.0.0/src/painapple_code/static/dist/app.bundle.js +7177 -0
  252. painapple_code-1.0.0/src/painapple_code/static/feature-triage.html +446 -0
  253. painapple_code-1.0.0/src/painapple_code/static/icons/apple-touch-icon.png +0 -0
  254. painapple_code-1.0.0/src/painapple_code/static/icons/favicon-32.png +0 -0
  255. painapple_code-1.0.0/src/painapple_code/static/icons/favicon.ico +0 -0
  256. painapple_code-1.0.0/src/painapple_code/static/icons/icon-128.png +0 -0
  257. painapple_code-1.0.0/src/painapple_code/static/icons/icon-144.png +0 -0
  258. painapple_code-1.0.0/src/painapple_code/static/icons/icon-152.png +0 -0
  259. painapple_code-1.0.0/src/painapple_code/static/icons/icon-180.png +0 -0
  260. painapple_code-1.0.0/src/painapple_code/static/icons/icon-192.png +0 -0
  261. painapple_code-1.0.0/src/painapple_code/static/icons/icon-384.png +0 -0
  262. painapple_code-1.0.0/src/painapple_code/static/icons/icon-512.png +0 -0
  263. painapple_code-1.0.0/src/painapple_code/static/icons/icon-72.png +0 -0
  264. painapple_code-1.0.0/src/painapple_code/static/icons/icon-96.png +0 -0
  265. painapple_code-1.0.0/src/painapple_code/static/js/action-delegate.js +187 -0
  266. painapple_code-1.0.0/src/painapple_code/static/js/activity-strip.js +193 -0
  267. painapple_code-1.0.0/src/painapple_code/static/js/app/context-menus.js +619 -0
  268. painapple_code-1.0.0/src/painapple_code/static/js/app/file-preview.js +163 -0
  269. painapple_code-1.0.0/src/painapple_code/static/js/app/init-ui.js +574 -0
  270. painapple_code-1.0.0/src/painapple_code/static/js/app/input-events.js +561 -0
  271. painapple_code-1.0.0/src/painapple_code/static/js/app/input-resize.js +313 -0
  272. painapple_code-1.0.0/src/painapple_code/static/js/app/message-actions.js +419 -0
  273. painapple_code-1.0.0/src/painapple_code/static/js/app/panels.js +210 -0
  274. painapple_code-1.0.0/src/painapple_code/static/js/app/rendering-delegators.js +246 -0
  275. painapple_code-1.0.0/src/painapple_code/static/js/app/server-loading.js +365 -0
  276. painapple_code-1.0.0/src/painapple_code/static/js/app/session-ops.js +287 -0
  277. painapple_code-1.0.0/src/painapple_code/static/js/app/session-switch.js +443 -0
  278. painapple_code-1.0.0/src/painapple_code/static/js/app/settings-helpers.js +280 -0
  279. painapple_code-1.0.0/src/painapple_code/static/js/app/startup-welcome.js +290 -0
  280. painapple_code-1.0.0/src/painapple_code/static/js/app-context.js +157 -0
  281. painapple_code-1.0.0/src/painapple_code/static/js/app.js +2134 -0
  282. painapple_code-1.0.0/src/painapple_code/static/js/auth-fetch.js +46 -0
  283. painapple_code-1.0.0/src/painapple_code/static/js/background-tasks.js +274 -0
  284. painapple_code-1.0.0/src/painapple_code/static/js/boot.js +73 -0
  285. painapple_code-1.0.0/src/painapple_code/static/js/caret-position.js +171 -0
  286. painapple_code-1.0.0/src/painapple_code/static/js/chat-navigator.js +710 -0
  287. painapple_code-1.0.0/src/painapple_code/static/js/chat-search.js +323 -0
  288. painapple_code-1.0.0/src/painapple_code/static/js/command-executor.js +176 -0
  289. painapple_code-1.0.0/src/painapple_code/static/js/command-store.js +497 -0
  290. painapple_code-1.0.0/src/painapple_code/static/js/components.js +1414 -0
  291. painapple_code-1.0.0/src/painapple_code/static/js/config.js +218 -0
  292. painapple_code-1.0.0/src/painapple_code/static/js/context-menu.js +740 -0
  293. painapple_code-1.0.0/src/painapple_code/static/js/controllers/chat-controller.js +4252 -0
  294. painapple_code-1.0.0/src/painapple_code/static/js/controllers/dialog-controller.js +217 -0
  295. painapple_code-1.0.0/src/painapple_code/static/js/controllers/tab-controller.js +1828 -0
  296. painapple_code-1.0.0/src/painapple_code/static/js/controllers/thinking-controller.js +915 -0
  297. painapple_code-1.0.0/src/painapple_code/static/js/diff-utils.js +486 -0
  298. painapple_code-1.0.0/src/painapple_code/static/js/drafts-pill.js +95 -0
  299. painapple_code-1.0.0/src/painapple_code/static/js/editor-view.js +815 -0
  300. painapple_code-1.0.0/src/painapple_code/static/js/effort-settings.js +430 -0
  301. painapple_code-1.0.0/src/painapple_code/static/js/feature-triage.js +811 -0
  302. painapple_code-1.0.0/src/painapple_code/static/js/file-autocomplete.js +516 -0
  303. painapple_code-1.0.0/src/painapple_code/static/js/file-tabs.js +123 -0
  304. painapple_code-1.0.0/src/painapple_code/static/js/gestures.js +448 -0
  305. painapple_code-1.0.0/src/painapple_code/static/js/grid-switcher.js +334 -0
  306. painapple_code-1.0.0/src/painapple_code/static/js/input-handler.js +1472 -0
  307. painapple_code-1.0.0/src/painapple_code/static/js/keyboard-bar.js +495 -0
  308. painapple_code-1.0.0/src/painapple_code/static/js/layout-switcher.js +109 -0
  309. painapple_code-1.0.0/src/painapple_code/static/js/linkify-utils.js +200 -0
  310. painapple_code-1.0.0/src/painapple_code/static/js/login.js +141 -0
  311. painapple_code-1.0.0/src/painapple_code/static/js/open-dialog.js +879 -0
  312. painapple_code-1.0.0/src/painapple_code/static/js/orphan-terminals.js +373 -0
  313. painapple_code-1.0.0/src/painapple_code/static/js/path-utils.js +179 -0
  314. painapple_code-1.0.0/src/painapple_code/static/js/perf-marks.js +102 -0
  315. painapple_code-1.0.0/src/painapple_code/static/js/permission-settings.js +475 -0
  316. painapple_code-1.0.0/src/painapple_code/static/js/pointer-input.js +59 -0
  317. painapple_code-1.0.0/src/painapple_code/static/js/preview/json-tree-menu.js +226 -0
  318. painapple_code-1.0.0/src/painapple_code/static/js/preview/json-tree-toolbar.js +291 -0
  319. painapple_code-1.0.0/src/painapple_code/static/js/preview/json-tree.js +457 -0
  320. painapple_code-1.0.0/src/painapple_code/static/js/preview/preview-breadcrumb.js +387 -0
  321. painapple_code-1.0.0/src/painapple_code/static/js/preview/preview-edit.js +367 -0
  322. painapple_code-1.0.0/src/painapple_code/static/js/preview/preview-events.js +361 -0
  323. painapple_code-1.0.0/src/painapple_code/static/js/preview/preview-history.js +567 -0
  324. painapple_code-1.0.0/src/painapple_code/static/js/preview/preview-inline-edit.js +869 -0
  325. painapple_code-1.0.0/src/painapple_code/static/js/preview/preview-poll.js +108 -0
  326. painapple_code-1.0.0/src/painapple_code/static/js/preview/preview-render.js +572 -0
  327. painapple_code-1.0.0/src/painapple_code/static/js/preview/preview-search.js +421 -0
  328. painapple_code-1.0.0/src/painapple_code/static/js/preview/preview-state.js +256 -0
  329. painapple_code-1.0.0/src/painapple_code/static/js/preview/preview-utils.js +251 -0
  330. painapple_code-1.0.0/src/painapple_code/static/js/preview-plugins/chart-plugin.js +22 -0
  331. painapple_code-1.0.0/src/painapple_code/static/js/preview-plugins/csv-plugin.js +188 -0
  332. painapple_code-1.0.0/src/painapple_code/static/js/preview-plugins/diff-plugin.js +258 -0
  333. painapple_code-1.0.0/src/painapple_code/static/js/preview-plugins/excalidraw-plugin.js +25 -0
  334. painapple_code-1.0.0/src/painapple_code/static/js/preview-plugins/html-plugin.js +104 -0
  335. painapple_code-1.0.0/src/painapple_code/static/js/preview-plugins/image-plugin.js +20 -0
  336. painapple_code-1.0.0/src/painapple_code/static/js/preview-plugins/index.js +34 -0
  337. painapple_code-1.0.0/src/painapple_code/static/js/preview-plugins/json-plugin.js +99 -0
  338. painapple_code-1.0.0/src/painapple_code/static/js/preview-plugins/jsonl-plugin.js +152 -0
  339. painapple_code-1.0.0/src/painapple_code/static/js/preview-plugins/markdown-plugin.js +266 -0
  340. painapple_code-1.0.0/src/painapple_code/static/js/preview-plugins/panzoom-plugin.js +63 -0
  341. painapple_code-1.0.0/src/painapple_code/static/js/preview-plugins/plugin-helpers.js +282 -0
  342. painapple_code-1.0.0/src/painapple_code/static/js/project-color-picker.js +110 -0
  343. painapple_code-1.0.0/src/painapple_code/static/js/project-colors.js +163 -0
  344. painapple_code-1.0.0/src/painapple_code/static/js/prompt-favorites.js +187 -0
  345. painapple_code-1.0.0/src/painapple_code/static/js/quick-actions-menu.js +1736 -0
  346. painapple_code-1.0.0/src/painapple_code/static/js/quick-actions-registry.js +1239 -0
  347. painapple_code-1.0.0/src/painapple_code/static/js/quick-switcher/controller.js +294 -0
  348. painapple_code-1.0.0/src/painapple_code/static/js/quick-switcher/fuzzy-scorer.js +123 -0
  349. painapple_code-1.0.0/src/painapple_code/static/js/quick-switcher/index.js +30 -0
  350. painapple_code-1.0.0/src/painapple_code/static/js/quick-switcher/providers/base-provider.js +51 -0
  351. painapple_code-1.0.0/src/painapple_code/static/js/quick-switcher/providers/command-provider.js +56 -0
  352. painapple_code-1.0.0/src/painapple_code/static/js/quick-switcher/providers/file-provider.js +291 -0
  353. painapple_code-1.0.0/src/painapple_code/static/js/quick-switcher/providers/panel-provider.js +132 -0
  354. painapple_code-1.0.0/src/painapple_code/static/js/quick-switcher/providers/project-provider.js +361 -0
  355. painapple_code-1.0.0/src/painapple_code/static/js/quick-switcher/providers/read-files-provider.js +104 -0
  356. painapple_code-1.0.0/src/painapple_code/static/js/quick-switcher/providers/skills-provider.js +129 -0
  357. painapple_code-1.0.0/src/painapple_code/static/js/quick-switcher/registry.js +69 -0
  358. painapple_code-1.0.0/src/painapple_code/static/js/quick-switcher/ui/item.js +54 -0
  359. painapple_code-1.0.0/src/painapple_code/static/js/quick-switcher/ui/picker.js +464 -0
  360. painapple_code-1.0.0/src/painapple_code/static/js/recent-opens.js +40 -0
  361. painapple_code-1.0.0/src/painapple_code/static/js/scroll-manager.js +530 -0
  362. painapple_code-1.0.0/src/painapple_code/static/js/scroll-state-machine.js +359 -0
  363. painapple_code-1.0.0/src/painapple_code/static/js/selection/action-bar.js +793 -0
  364. painapple_code-1.0.0/src/painapple_code/static/js/selection/index.js +15 -0
  365. painapple_code-1.0.0/src/painapple_code/static/js/selection/selection-handler.js +877 -0
  366. painapple_code-1.0.0/src/painapple_code/static/js/selection/state.js +181 -0
  367. painapple_code-1.0.0/src/painapple_code/static/js/session/agent-progress.js +202 -0
  368. painapple_code-1.0.0/src/painapple_code/static/js/session/handle-agent-message.js +481 -0
  369. painapple_code-1.0.0/src/painapple_code/static/js/session/handle-message.js +550 -0
  370. painapple_code-1.0.0/src/painapple_code/static/js/session/interactive.js +587 -0
  371. painapple_code-1.0.0/src/painapple_code/static/js/session/message-store.js +271 -0
  372. painapple_code-1.0.0/src/painapple_code/static/js/session/messages.js +253 -0
  373. painapple_code-1.0.0/src/painapple_code/static/js/session/persistence.js +179 -0
  374. painapple_code-1.0.0/src/painapple_code/static/js/session/restore.js +136 -0
  375. painapple_code-1.0.0/src/painapple_code/static/js/session/sync.js +333 -0
  376. painapple_code-1.0.0/src/painapple_code/static/js/session-container-pool.js +371 -0
  377. painapple_code-1.0.0/src/painapple_code/static/js/session-setup-panel.js +274 -0
  378. painapple_code-1.0.0/src/painapple_code/static/js/session.js +1047 -0
  379. painapple_code-1.0.0/src/painapple_code/static/js/shortcut-hints.js +272 -0
  380. painapple_code-1.0.0/src/painapple_code/static/js/shortcuts.js +1146 -0
  381. painapple_code-1.0.0/src/painapple_code/static/js/skills-autocomplete.js +262 -0
  382. painapple_code-1.0.0/src/painapple_code/static/js/snippets-autocomplete.js +738 -0
  383. painapple_code-1.0.0/src/painapple_code/static/js/stash-refs-view.js +83 -0
  384. painapple_code-1.0.0/src/painapple_code/static/js/stash-ui.js +768 -0
  385. painapple_code-1.0.0/src/painapple_code/static/js/stash.js +785 -0
  386. painapple_code-1.0.0/src/painapple_code/static/js/status-bar.js +1184 -0
  387. painapple_code-1.0.0/src/painapple_code/static/js/token-profile.js +274 -0
  388. painapple_code-1.0.0/src/painapple_code/static/js/tool-renderer-blocks.js +1626 -0
  389. painapple_code-1.0.0/src/painapple_code/static/js/tool-renderer-thinking.js +813 -0
  390. painapple_code-1.0.0/src/painapple_code/static/js/tool-renderer.js +1500 -0
  391. painapple_code-1.0.0/src/painapple_code/static/js/tooltips.js +197 -0
  392. painapple_code-1.0.0/src/painapple_code/static/js/upload-manager.js +1019 -0
  393. painapple_code-1.0.0/src/painapple_code/static/js/utils.js +521 -0
  394. painapple_code-1.0.0/src/painapple_code/static/js/welcome/api.js +363 -0
  395. painapple_code-1.0.0/src/painapple_code/static/js/welcome/cards.js +626 -0
  396. painapple_code-1.0.0/src/painapple_code/static/js/welcome/context-menu.js +585 -0
  397. painapple_code-1.0.0/src/painapple_code/static/js/welcome/families.js +801 -0
  398. painapple_code-1.0.0/src/painapple_code/static/js/welcome/preview.js +234 -0
  399. painapple_code-1.0.0/src/painapple_code/static/js/welcome/state.js +129 -0
  400. painapple_code-1.0.0/src/painapple_code/static/js/welcome.js +1874 -0
  401. painapple_code-1.0.0/src/painapple_code/static/js/widget-system/base-widget.js +717 -0
  402. painapple_code-1.0.0/src/painapple_code/static/js/widget-system/device-manager.js +178 -0
  403. painapple_code-1.0.0/src/painapple_code/static/js/widget-system/event-bus.js +152 -0
  404. painapple_code-1.0.0/src/painapple_code/static/js/widget-system/icons.js +120 -0
  405. painapple_code-1.0.0/src/painapple_code/static/js/widget-system/index.js +49 -0
  406. painapple_code-1.0.0/src/painapple_code/static/js/widget-system/init.js +54 -0
  407. painapple_code-1.0.0/src/painapple_code/static/js/widget-system/types/bottom-sheet.js +307 -0
  408. painapple_code-1.0.0/src/painapple_code/static/js/widget-system/types/floating.js +915 -0
  409. painapple_code-1.0.0/src/painapple_code/static/js/widget-system/types/index.js +40 -0
  410. painapple_code-1.0.0/src/painapple_code/static/js/widget-system/types/modal.js +147 -0
  411. painapple_code-1.0.0/src/painapple_code/static/js/widget-system/types/sidebar.js +158 -0
  412. painapple_code-1.0.0/src/painapple_code/static/js/widget-system/types/tab.js +146 -0
  413. painapple_code-1.0.0/src/painapple_code/static/js/widget-system/types/top-sheet.js +203 -0
  414. painapple_code-1.0.0/src/painapple_code/static/js/widget-system/widget-manager.js +1187 -0
  415. painapple_code-1.0.0/src/painapple_code/static/js/widgets/about-widget.js +260 -0
  416. painapple_code-1.0.0/src/painapple_code/static/js/widgets/active-sessions-widget.js +760 -0
  417. painapple_code-1.0.0/src/painapple_code/static/js/widgets/agents-widget.js +897 -0
  418. painapple_code-1.0.0/src/painapple_code/static/js/widgets/browser-widget.js +579 -0
  419. painapple_code-1.0.0/src/painapple_code/static/js/widgets/commands-widget.js +694 -0
  420. painapple_code-1.0.0/src/painapple_code/static/js/widgets/config/commit-sections.js +449 -0
  421. painapple_code-1.0.0/src/painapple_code/static/js/widgets/config/dir-autocomplete.js +224 -0
  422. painapple_code-1.0.0/src/painapple_code/static/js/widgets/config/gestures.js +161 -0
  423. painapple_code-1.0.0/src/painapple_code/static/js/widgets/config/models-tab.js +988 -0
  424. painapple_code-1.0.0/src/painapple_code/static/js/widgets/config/quick-actions-tab.js +882 -0
  425. painapple_code-1.0.0/src/painapple_code/static/js/widgets/config/shortcut-editor.js +587 -0
  426. painapple_code-1.0.0/src/painapple_code/static/js/widgets/config/state.js +517 -0
  427. painapple_code-1.0.0/src/painapple_code/static/js/widgets/config/system-controls.js +90 -0
  428. painapple_code-1.0.0/src/painapple_code/static/js/widgets/config-widget.js +1535 -0
  429. painapple_code-1.0.0/src/painapple_code/static/js/widgets/cost-analytics-widget.js +621 -0
  430. painapple_code-1.0.0/src/painapple_code/static/js/widgets/debug-widget.js +693 -0
  431. painapple_code-1.0.0/src/painapple_code/static/js/widgets/diff-viewer-widget.js +1420 -0
  432. painapple_code-1.0.0/src/painapple_code/static/js/widgets/discussion-widget.js +1107 -0
  433. painapple_code-1.0.0/src/painapple_code/static/js/widgets/file-explorer-widget.js +2166 -0
  434. painapple_code-1.0.0/src/painapple_code/static/js/widgets/file-preview-widget.js +861 -0
  435. painapple_code-1.0.0/src/painapple_code/static/js/widgets/git-widget.js +794 -0
  436. painapple_code-1.0.0/src/painapple_code/static/js/widgets/helpers-install-widget.js +720 -0
  437. painapple_code-1.0.0/src/painapple_code/static/js/widgets/history-explorer-widget.js +1804 -0
  438. painapple_code-1.0.0/src/painapple_code/static/js/widgets/image-annotate-widget.js +951 -0
  439. painapple_code-1.0.0/src/painapple_code/static/js/widgets/image-preview-widget.js +692 -0
  440. painapple_code-1.0.0/src/painapple_code/static/js/widgets/index.js +176 -0
  441. painapple_code-1.0.0/src/painapple_code/static/js/widgets/log-explorer-widget.js +1057 -0
  442. painapple_code-1.0.0/src/painapple_code/static/js/widgets/plugins-widget.js +305 -0
  443. painapple_code-1.0.0/src/painapple_code/static/js/widgets/prompt-explorer-widget.js +1119 -0
  444. painapple_code-1.0.0/src/painapple_code/static/js/widgets/search-files-widget.js +529 -0
  445. painapple_code-1.0.0/src/painapple_code/static/js/widgets/skills-widget.js +843 -0
  446. painapple_code-1.0.0/src/painapple_code/static/js/widgets/snippets-widget.js +479 -0
  447. painapple_code-1.0.0/src/painapple_code/static/js/widgets/sub-agents-widget.js +333 -0
  448. painapple_code-1.0.0/src/painapple_code/static/js/widgets/tasks-widget.js +379 -0
  449. painapple_code-1.0.0/src/painapple_code/static/js/widgets/terminal/connection.js +283 -0
  450. painapple_code-1.0.0/src/painapple_code/static/js/widgets/terminal/gestures.js +357 -0
  451. painapple_code-1.0.0/src/painapple_code/static/js/widgets/terminal/init.js +642 -0
  452. painapple_code-1.0.0/src/painapple_code/static/js/widgets/terminal/link-providers.js +532 -0
  453. painapple_code-1.0.0/src/painapple_code/static/js/widgets/terminal/osc52.js +213 -0
  454. painapple_code-1.0.0/src/painapple_code/static/js/widgets/terminal/render.js +159 -0
  455. painapple_code-1.0.0/src/painapple_code/static/js/widgets/terminal/size.js +54 -0
  456. painapple_code-1.0.0/src/painapple_code/static/js/widgets/terminal/state.js +211 -0
  457. painapple_code-1.0.0/src/painapple_code/static/js/widgets/terminal/wrap-utils.js +101 -0
  458. painapple_code-1.0.0/src/painapple_code/static/js/widgets/terminal-widget.js +793 -0
  459. painapple_code-1.0.0/src/painapple_code/static/js/widgets/uploads-widget.js +461 -0
  460. painapple_code-1.0.0/src/painapple_code/static/js/widgets/zen-widget.js +1001 -0
  461. painapple_code-1.0.0/src/painapple_code/static/login.html +51 -0
  462. painapple_code-1.0.0/src/painapple_code/static/manifest.json +73 -0
  463. painapple_code-1.0.0/src/painapple_code/static/sw.js +293 -0
  464. painapple_code-1.0.0/src/painapple_code/static/vendor/LICENSES.txt +769 -0
  465. painapple_code-1.0.0/src/painapple_code/static/vendor/README.md +103 -0
  466. painapple_code-1.0.0/src/painapple_code/static/vendor/codemirror.js +35 -0
  467. painapple_code-1.0.0/src/painapple_code/static/vendor/codemirror.js.LEGAL.txt +304 -0
  468. painapple_code-1.0.0/src/painapple_code/static/vendor/github-markdown-dark.min.css +1124 -0
  469. painapple_code-1.0.0/src/painapple_code/static/vendor/highlight-github-dark.min.css +10 -0
  470. painapple_code-1.0.0/src/painapple_code/static/vendor/highlight-lang-dockerfile.min.js +8 -0
  471. painapple_code-1.0.0/src/painapple_code/static/vendor/highlight-lang-nginx.min.js +21 -0
  472. painapple_code-1.0.0/src/painapple_code/static/vendor/highlight-lang-properties.min.js +10 -0
  473. painapple_code-1.0.0/src/painapple_code/static/vendor/highlight-lang-scala.min.js +28 -0
  474. painapple_code-1.0.0/src/painapple_code/static/vendor/highlight.min.js +1213 -0
  475. painapple_code-1.0.0/src/painapple_code/static/vendor/marked.min.js +6 -0
  476. painapple_code-1.0.0/src/painapple_code/static/vendor/purify.min.js +3 -0
  477. painapple_code-1.0.0/src/painapple_code/static/vendor/xterm-addon-fit.js +2 -0
  478. painapple_code-1.0.0/src/painapple_code/static/vendor/xterm.css +209 -0
  479. painapple_code-1.0.0/src/painapple_code/static/vendor/xterm.js +2 -0
  480. painapple_code-1.0.0/src/painapple_code/static/web-client.html +635 -0
  481. painapple_code-1.0.0/src/painapple_code/subprocess_registry.py +535 -0
  482. painapple_code-1.0.0/src/painapple_code/tls_cert.py +79 -0
  483. painapple_code-1.0.0/src/painapple_code/tools/agents/shadow-git-helper.md +400 -0
  484. painapple_code-1.0.0/src/painapple_code/tools/excalidraw-to-svg.js +143 -0
  485. painapple_code-1.0.0/src/painapple_code/tools/install-helpers.sh +148 -0
  486. painapple_code-1.0.0/src/painapple_code/tools/shadow-git +320 -0
  487. painapple_code-1.0.0/src/painapple_code/tools/shadow-query +120 -0
  488. painapple_code-1.0.0/src/painapple_code/tools/vegalite-to-svg.js +79 -0
  489. painapple_code-1.0.0/src/painapple_code/turn_query.py +766 -0
  490. painapple_code-1.0.0/src/painapple_code/turn_tracker.py +221 -0
  491. painapple_code-1.0.0/src/painapple_code/utils/__init__.py +0 -0
  492. painapple_code-1.0.0/src/painapple_code/utils/agent_cli.py +306 -0
  493. painapple_code-1.0.0/src/painapple_code/utils/chart.py +103 -0
  494. painapple_code-1.0.0/src/painapple_code/utils/excalidraw.py +107 -0
  495. painapple_code-1.0.0/src/painapple_code/utils/file_lock.py +162 -0
  496. painapple_code-1.0.0/src/painapple_code/utils/file_paths.py +648 -0
  497. painapple_code-1.0.0/src/painapple_code/utils/generate_icons.py +251 -0
  498. painapple_code-1.0.0/src/painapple_code/utils/proc.py +205 -0
  499. painapple_code-1.0.0/src/painapple_code/utils/pty_backend.py +59 -0
  500. painapple_code-1.0.0/src/painapple_code/utils/pty_posix.py +160 -0
  501. painapple_code-1.0.0/src/painapple_code/utils/pty_windows.py +245 -0
  502. painapple_code-1.0.0/src/painapple_code/utils/token_profiles.py +91 -0
  503. painapple_code-1.0.0/src/painapple_code/viewer_templates.py +657 -0
  504. painapple_code-1.0.0/src/painapple_code/welcome_search.py +879 -0
  505. painapple_code-1.0.0/src/painapple_code.egg-info/PKG-INFO +292 -0
  506. painapple_code-1.0.0/src/painapple_code.egg-info/SOURCES.txt +511 -0
  507. painapple_code-1.0.0/src/painapple_code.egg-info/dependency_links.txt +1 -0
  508. painapple_code-1.0.0/src/painapple_code.egg-info/entry_points.txt +2 -0
  509. painapple_code-1.0.0/src/painapple_code.egg-info/requires.txt +38 -0
  510. painapple_code-1.0.0/src/painapple_code.egg-info/scm_file_list.json +660 -0
  511. painapple_code-1.0.0/src/painapple_code.egg-info/scm_version.json +8 -0
  512. painapple_code-1.0.0/src/painapple_code.egg-info/top_level.txt +1 -0
  513. painapple_code-1.0.0/start.sh +132 -0
@@ -0,0 +1,44 @@
1
+ {
2
+ "name": "pAInapple Code",
3
+ "image": "mcr.microsoft.com/devcontainers/base:ubuntu",
4
+
5
+ // pAInapple Code itself isn't auto-installed — open a terminal and run
6
+ // curl -fsSL https://raw.githubusercontent.com/wrotek/painapple-code/main/features/src/painapple-code/install.sh | sudo bash
7
+ // (see features/src/painapple-code/README.md). The forwarded port and
8
+ // the VS Code settings below are everything Codespaces needs prepared
9
+ // up front; the rest is on-demand.
10
+ //
11
+ // Python + Node come from the official Features so npm / node-gyp /
12
+ // native-module builds work out of the box. (The base:ubuntu image is
13
+ // bare — common-utils only.)
14
+ "features": {
15
+ "ghcr.io/devcontainers/features/python:1": {},
16
+ "ghcr.io/devcontainers/features/node:1": {}
17
+ },
18
+
19
+ "forwardPorts": [8765],
20
+ "portsAttributes": {
21
+ "8765": {
22
+ "label": "pAInapple Code",
23
+ "onAutoForward": "notify",
24
+ "visibility": "private"
25
+ }
26
+ },
27
+
28
+ "customizations": {
29
+ "vscode": {
30
+ "extensions": [
31
+ "ms-python.python",
32
+ "redhat.vscode-yaml"
33
+ ],
34
+ // Default-hide the secondary side bar (Copilot Chat lives there).
35
+ // Users who want it can toggle with Ctrl+Alt+B at any time — this
36
+ // just keeps it out of the way on first open so the terminal has
37
+ // room to show the painapple-code login URL without wrapping.
38
+ // Setting added in VS Code 1.94 (Sept 2024).
39
+ "settings": {
40
+ "workbench.secondarySideBar.defaultVisibility": "hidden"
41
+ }
42
+ }
43
+ }
44
+ }
@@ -0,0 +1,19 @@
1
+ # Deny-by-default. Only the explicit allowlist below ships into the image.
2
+ # Why deny-first: the repo has ~1.4GB of side projects (tauri-app/, tao/),
3
+ # build-time deps (top-level tools/node_modules/), local-only docs, and
4
+ # multiple worktrees that have no business in a runtime image.
5
+ *
6
+
7
+ # --- Runtime essentials ---
8
+ !src/
9
+ !requirements.txt
10
+ !pyproject.toml
11
+ !docker-entrypoint.sh
12
+ !README.md
13
+ !LICENSE
14
+
15
+ # --- Re-exclusions inside the allowlist (cruft that sneaks in via src/) ---
16
+ **/__pycache__/
17
+ **/*.pyc
18
+ **/.pytest_cache/
19
+ **/.DS_Store
@@ -0,0 +1,93 @@
1
+ # Python virtual environment
2
+ venv/
3
+ __pycache__/
4
+ *.pyc
5
+
6
+ # Python build artifacts (from `pip install -e .` or `python -m build`)
7
+ *.egg-info/
8
+ build/
9
+ dist/
10
+
11
+ # IDE
12
+ .idea/
13
+ .vscode/
14
+ *.swp
15
+
16
+ # Logs
17
+ *.log
18
+
19
+ # OS
20
+ .DS_Store
21
+ sessions/
22
+
23
+ # Runtime worktrees
24
+ .painapple-code-worktrees/
25
+
26
+ # Review metadata (per-project, not committed)
27
+ .code-meta/
28
+
29
+ # Test results
30
+ test-results/
31
+
32
+ # Node.js (root package.json is for claude CLI only, not committed)
33
+ node_modules/
34
+ package.json
35
+ package-lock.json
36
+
37
+ # But tools/ has its own tracked package.json & lockfile
38
+ !tools/package.json
39
+ !tools/package-lock.json
40
+
41
+ # ...as does tools/bundler/ (esbuild + yaml only — the frontend bundler is
42
+ # kept separate so a from-source deploy needn't build native modules)
43
+ !tools/bundler/package.json
44
+ !tools/bundler/package-lock.json
45
+
46
+ # And tauri-app/ has its own tracked package.json & lockfile (native app shell)
47
+ !tauri-app/package.json
48
+ !tauri-app/package-lock.json
49
+
50
+ # Secrets / local data
51
+ .env*
52
+ *.duckdb
53
+
54
+ # Stray screenshot dumps
55
+ screenshots/
56
+
57
+ # Internal agent / personal infra (not for public)
58
+ .claude/
59
+ CLAUDE.md
60
+ deploy.fish
61
+ start-server.sh
62
+ TODO.md
63
+ TODO-PROD.md
64
+ bugs/
65
+ claude-stats.fish
66
+ docs/
67
+ docs-ai/
68
+ ideas/
69
+ design/
70
+ tests/
71
+
72
+ # Devcontainer CLI build artifact
73
+ .devcontainer/devcontainer-lock.json
74
+
75
+ # Generated by setuptools-scm at build time — derived from git tag.
76
+ src/painapple_code/_version.py
77
+
78
+ # Local tao fork carrying the iOS scene-delegate UAF patch
79
+ # (see tauri-app/src-tauri/Cargo.toml [patch.crates-io]).
80
+ tao/
81
+
82
+ # Local swift-rs fork carrying the Xcode 27 iOS build fixes
83
+ # (see tauri-app/scripts/swift-rs-setup.sh).
84
+ swift-rs/
85
+
86
+ # Generated by tools/bundle-feature-source.sh — mirror of features/src/painapple-code/
87
+ # (the canonical Feature) plus the bundled painapple source. Regenerated by the
88
+ # initializeCommand in .devcontainer/devcontainer.json on every build.
89
+ .devcontainer/painapple-code/
90
+ features/src/painapple-code/painapple-source/
91
+
92
+ # MkDocs build output
93
+ site/
@@ -0,0 +1,7 @@
1
+ # Changelog
2
+
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
+
5
+ ## 1.0.0 — unreleased
6
+
7
+ First public release.
@@ -0,0 +1,25 @@
1
+ # Contributing
2
+
3
+ pAInapple Code is a young, solo-maintained project. Formal contribution guidelines — contribution licensing policy (DCO/CLA), code of conduct, PR process — are still being worked out and will land here soon.
4
+
5
+ Until then, three things:
6
+
7
+ - **Open an issue before writing code** for anything bigger than a typo or an obvious small fix. A large PR that arrives without prior discussion may sit for a while or be declined if it doesn't fit the project's direction.
8
+ - **Security issues are never GitHub issues.** Use [private vulnerability reporting](https://github.com/wrotek/painapple-code/security/advisories/new) — see [SECURITY.md](SECURITY.md).
9
+ - Contributions are accepted under the project's license, [AGPL-3.0-or-later](LICENSE).
10
+
11
+ ## Dev setup, if you want to poke around
12
+
13
+ Python ≥ 3.12 and git are all you need:
14
+
15
+ ```bash
16
+ git clone https://github.com/wrotek/painapple-code.git
17
+ cd painapple-code
18
+ python3 -m venv venv && source venv/bin/activate
19
+ pip install -e '.[test]'
20
+ python -m painapple_code --port 8765 --workspace /path/to/some/project
21
+ ```
22
+
23
+ The frontend has no build step in development — edit a file under `src/painapple_code/static/`, refresh the browser, done.
24
+
25
+ Tests are in-process and quick (`python -m pytest tests/ -q`). One gotcha: `tests/` is blanket-gitignored and the visible modules are force-added — if you add a test file, `git add -f` it or CI won't see it.
@@ -0,0 +1,196 @@
1
+ # syntax=docker/dockerfile:1.7
2
+ # Fully-qualified registry path — podman has no default registry and otherwise
3
+ # prompts to pick one when ~/.config/containers/registries.conf lists multiple
4
+ # unqualified-search-registries (quay.io / ghcr.io / docker.io). Docker ignores
5
+ # the prefix, so the same Dockerfile works on both runtimes.
6
+ FROM docker.io/library/python:3.13-slim-bookworm
7
+
8
+ # OCI image metadata — surfaces on Docker Hub / GHCR as the image's title,
9
+ # description, license, and "Source" link. These are the values a local
10
+ # `docker build` produces. CI overrides several of them via --label
11
+ # (docker/metadata-action): `version` / `revision` / `created`, plus
12
+ # `description` / `licenses`, which it would otherwise auto-derive from the
13
+ # GitHub repo's About field — so keep those two in sync with the `labels:`
14
+ # block in .github/workflows/docker-publish.yml, which is what ships.
15
+ LABEL org.opencontainers.image.title="painapple-code" \
16
+ org.opencontainers.image.description="Self-hosted web client and PWA for Claude Code sessions" \
17
+ org.opencontainers.image.source="https://github.com/wrotek/painapple-code" \
18
+ org.opencontainers.image.licenses="AGPL-3.0-or-later" \
19
+ org.opencontainers.image.vendor="wrotek"
20
+
21
+ # Disable apt's _apt sandbox user — required when building under rootless
22
+ # Docker with fuse-overlayfs (the unprivileged _apt UID can't write /tmp).
23
+ RUN echo 'APT::Sandbox::User "root";' > /etc/apt/apt.conf.d/00no-sandbox
24
+
25
+ # System deps:
26
+ # git — used by api_git.py and shadow_git.py
27
+ # curl — NodeSource bootstrap
28
+ # tini — clean PID 1 / signal forwarding so SIGTERM kills child claude procs
29
+ # fd-find — fast file enumeration for /api/files/list (.gitignore-aware).
30
+ # Debian ships the binary as `fdfind`; symlink to `fd` so
31
+ # routes/api_files.py finds it without a fallback shim.
32
+ RUN apt-get update && apt-get install -y --no-install-recommends \
33
+ ca-certificates curl git tini fd-find \
34
+ && ln -s /usr/bin/fdfind /usr/local/bin/fd \
35
+ && rm -rf /var/lib/apt/lists/*
36
+
37
+ # Developer tools for the in-container terminal. The server exposes a PTY
38
+ # the user runs commands in, so a base slim image with no editor / pager /
39
+ # search / multiplexer is painful. Adds ~80 MB. Anything bigger (compilers,
40
+ # language toolchains, language servers) belongs in a user-built derived
41
+ # image, not the base.
42
+ #
43
+ # editors — vim, nano
44
+ # pagers/text — less, jq
45
+ # search — ripgrep (`rg`); `fd` is already installed above
46
+ # process/system — htop, lsof, procps (ps/top), psmisc (killall/pstree)
47
+ # files/inspection — tree, ncdu, file
48
+ # network — iproute2 (ip), iputils-ping, dnsutils (dig/nslookup),
49
+ # netcat-openbsd, wget, rsync, openssh-client
50
+ # compression — zip, unzip, xz-utils
51
+ # shell — zsh (default user shell), tmux, bash-completion
52
+ # build — make
53
+ # misc — git-lfs, gettext-base (envsubst)
54
+ RUN apt-get update && apt-get install -y --no-install-recommends \
55
+ vim nano \
56
+ less jq ripgrep \
57
+ htop lsof procps psmisc tree ncdu file \
58
+ iproute2 iputils-ping dnsutils netcat-openbsd wget rsync openssh-client \
59
+ zip unzip xz-utils \
60
+ zsh tmux bash-completion \
61
+ make \
62
+ git-lfs gettext-base \
63
+ && rm -rf /var/lib/apt/lists/*
64
+
65
+ # Node.js 20 LTS. Needed by the server itself (the vega-lite / excalidraw
66
+ # render helpers in src/painapple_code/tools/ are node scripts) and by the
67
+ # agent CLI the entrypoint installs on first run.
68
+ #
69
+ # The agent CLI is deliberately NOT baked in here. @anthropic-ai/claude-code
70
+ # is proprietary — "© Anthropic PBC. All rights reserved" — so shipping a
71
+ # copy inside a published image would be redistribution we have no written
72
+ # grant for. docker-entrypoint.sh installs it into /data on first boot
73
+ # instead, which makes the download the user's own under their own
74
+ # agreement with Anthropic, exactly like `npm i -g` on a host. See
75
+ # THIRD_PARTY_NOTICES.md → "Agent CLIs the server drives".
76
+ #
77
+ # DISABLE_AUTOUPDATER keeps the CLI on the version the entrypoint pinned
78
+ # (it now lives on a writable volume, so left alone it *would* update
79
+ # itself past the 2.x ceiling), and CLAUDE_CODE_DISABLE_NONESSENTIAL_TRAFFIC
80
+ # suppresses the update-check / telemetry calls that go with it.
81
+ ENV DISABLE_AUTOUPDATER=1 \
82
+ CLAUDE_CODE_DISABLE_NONESSENTIAL_TRAFFIC=1
83
+ RUN curl -fsSL https://deb.nodesource.com/setup_20.x | bash - \
84
+ && apt-get install -y --no-install-recommends nodejs \
85
+ && rm -rf /var/lib/apt/lists/* \
86
+ && npm cache clean --force
87
+
88
+ # Non-root user. The build-time UID/GID is only a starting point — the
89
+ # entrypoint re-stamps `app` to whoever owns the mounts and drops
90
+ # privileges, so a pulled image works on a host with any UID. Building
91
+ # with --build-arg USER_UID=$(id -u) still saves it the work.
92
+ ARG USER_UID=1000
93
+ ARG USER_GID=1000
94
+ RUN groupadd --gid ${USER_GID} app \
95
+ && useradd --uid ${USER_UID} --gid ${USER_GID} --create-home --shell /usr/bin/zsh app
96
+
97
+ # Read by the launcher (cli/deploy/runtime.py) to decide the uid story
98
+ # before it starts anything: which uid the server ends up as, and whether
99
+ # this image can align itself (older tags can't — podman remaps them via
100
+ # --userns=keep-id:uid=…, docker gets a real error instead of a crash loop).
101
+ LABEL io.painapple.app-uid="${USER_UID}" \
102
+ io.painapple.app-gid="${USER_GID}" \
103
+ io.painapple.uid-adapt="1"
104
+
105
+ WORKDIR /app
106
+
107
+ COPY requirements.txt ./
108
+ RUN pip install --no-cache-dir -r requirements.txt
109
+
110
+ # --chown collapses what used to be COPY + a separate `RUN chown -R app:app`
111
+ # layer that duplicated every file (~1GB rewritten just to flip metadata).
112
+ COPY --chown=app:app . /app
113
+
114
+ # Package version — setuptools-scm normally derives this from `git describe`,
115
+ # but .git is excluded from the build context (see .dockerignore), so we
116
+ # pass it in as a build arg and let setuptools-scm read it from the env.
117
+ # CI populates it from the git tag; local builds without --build-arg fall
118
+ # back to "0.0.0+docker".
119
+ ARG SCM_VERSION=0.0.0+docker
120
+ ENV SETUPTOOLS_SCM_PRETEND_VERSION_FOR_PAINAPPLE_CODE=${SCM_VERSION}
121
+
122
+ # Editable install registers the painapple_code package against /app/src so
123
+ # `python -m painapple_code` resolves correctly without setting PYTHONPATH.
124
+ RUN pip install --no-cache-dir -e .
125
+
126
+ # Mountpoints — created up-front so volume mounts inherit the right ownership.
127
+ # /workspace gets a sentinel file that the entrypoint script checks for: any
128
+ # real bind mount overlays it, so its presence means the user forgot to mount.
129
+ RUN mkdir -p /data /workspace /home/app/.claude /home/app/.config/painapple-code \
130
+ && touch /workspace/.painapple-not-mounted \
131
+ && chown -R app:app /data /workspace /home/app/.claude /home/app/.config
132
+
133
+ # Entrypoint guard — refuses to start if /workspace isn't bind-mounted.
134
+ COPY --chmod=755 docker-entrypoint.sh /usr/local/bin/docker-entrypoint.sh
135
+
136
+ USER app
137
+
138
+ # Install user-scoped helpers — same script a host install would run.
139
+ # Drops tools/shadow-git and tools/shadow-query into ~/.local/bin and the
140
+ # shadow-git-helper agent template into ~/.claude/agents, so users get
141
+ # `shadow-git` / `shadow-query` in the in-container terminal and the agent shows
142
+ # up inside Claude Code without a separate setup step.
143
+ RUN /app/src/painapple_code/tools/install-helpers.sh
144
+
145
+ # zsh config — the server spawns its PTY via $SHELL (see
146
+ # routes/api_terminal.py), so an interactive terminal opened in the web UI
147
+ # lands in zsh. Bake a couple of conveniences in.
148
+ RUN printf '%s\n' \
149
+ 'alias ll="ls -lahtr"' \
150
+ 'autoload -Uz promptinit && promptinit && prompt adam1 2>/dev/null || PROMPT="%n@%m %~ %# "' \
151
+ 'setopt HIST_IGNORE_DUPS SHARE_HISTORY' \
152
+ 'HISTFILE=~/.zsh_history HISTSIZE=10000 SAVEHIST=10000' \
153
+ > /home/app/.zshrc
154
+
155
+ # Mirror the alias for bash too, in case a script or `docker exec` lands
156
+ # the user there explicitly.
157
+ RUN echo "alias ll='ls -lahtr'" >> /home/app/.bashrc
158
+
159
+ # Back to root for the entrypoint ONLY: it re-stamps `app` to match the
160
+ # ownership of the mounts (nothing else can — usermod/chown need root),
161
+ # then hands over via setpriv. The server itself always runs as `app`;
162
+ # see docker-entrypoint.sh. `docker exec` lands as root, so use
163
+ # `exec --user app` (what `painapple shell` does) for a user shell.
164
+ USER root
165
+
166
+ # PAINAPPLE_CODE_HOME relocates all server state (logs, shadow DB, sessions,
167
+ # uploads, presets) to /data so a single named volume covers everything.
168
+ # SHELL is read by the server's PTY spawn (routes/api_terminal.py) — set it
169
+ # explicitly so the web terminal opens zsh even though the server process
170
+ # itself wasn't started via login(1).
171
+ # PAINAPPLE_IN_CONTAINER marks "running containerized" — a build-time constant
172
+ # (the image only ever runs in a container). It's a last-resort fallback in
173
+ # paths.detect_environment(); the docker-vs-podman decision is made at
174
+ # runtime from /.dockerenv vs /run/.containerenv, NOT from this marker — a baked
175
+ # ENV can't tell the two apart since the same image runs on both engines.
176
+ # HOME must be pinned: the image's last USER is root (for the entrypoint),
177
+ # and setpriv doesn't rewrite the environment when it drops to `app` — so
178
+ # without this the server and the `claude` CLI it spawns would look for
179
+ # ~/.claude in /root instead of the bind-mounted /home/app/.claude.
180
+ #
181
+ # PATH picks up /data/npm-global/bin — where the entrypoint installs the
182
+ # agent CLI on first run (see docker-entrypoint.sh). Baked in ENV rather
183
+ # than only exported by the entrypoint so `docker exec` shells and the
184
+ # web terminal find `claude` too. A custom PAINAPPLE_AGENT_CLI_PREFIX is
185
+ # prepended by the entrypoint at runtime.
186
+ ENV PAINAPPLE_CODE_HOME=/data \
187
+ PYTHONUNBUFFERED=1 \
188
+ SHELL=/usr/bin/zsh \
189
+ HOME=/home/app \
190
+ PATH=/data/npm-global/bin:${PATH} \
191
+ PAINAPPLE_IN_CONTAINER=1
192
+
193
+ EXPOSE 8765
194
+
195
+ ENTRYPOINT ["/usr/bin/tini", "--", "/usr/local/bin/docker-entrypoint.sh"]
196
+ CMD ["python", "-m", "painapple_code", "--host", "0.0.0.0", "--port", "8765", "--workspace", "/workspace"]