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.
- painapple_code-1.0.0/.devcontainer/devcontainer.json +44 -0
- painapple_code-1.0.0/.dockerignore +19 -0
- painapple_code-1.0.0/.gitignore +93 -0
- painapple_code-1.0.0/CHANGELOG.md +7 -0
- painapple_code-1.0.0/CONTRIBUTING.md +25 -0
- painapple_code-1.0.0/Dockerfile +196 -0
- painapple_code-1.0.0/LICENSE +661 -0
- painapple_code-1.0.0/MANIFEST.in +24 -0
- painapple_code-1.0.0/PKG-INFO +292 -0
- painapple_code-1.0.0/README.dockerhub.md +184 -0
- painapple_code-1.0.0/README.md +239 -0
- painapple_code-1.0.0/SECURITY.md +230 -0
- painapple_code-1.0.0/THIRD_PARTY_NOTICES.md +261 -0
- painapple_code-1.0.0/build-frontend.sh +49 -0
- painapple_code-1.0.0/docker-compose.yml +58 -0
- painapple_code-1.0.0/docker-entrypoint.sh +274 -0
- painapple_code-1.0.0/docs-site/assets/annotate-editor.png +0 -0
- painapple_code-1.0.0/docs-site/assets/browser-widget.png +0 -0
- painapple_code-1.0.0/docs-site/assets/comments-stash.gif +0 -0
- painapple_code-1.0.0/docs-site/assets/cost-analytics.png +0 -0
- painapple_code-1.0.0/docs-site/assets/favicon.png +0 -0
- painapple_code-1.0.0/docs-site/assets/input-autocomplete.gif +0 -0
- painapple_code-1.0.0/docs-site/assets/logo.png +0 -0
- painapple_code-1.0.0/docs-site/assets/markdown-quick-edit.gif +0 -0
- painapple_code-1.0.0/docs-site/assets/overview.png +0 -0
- painapple_code-1.0.0/docs-site/assets/prompt-history.png +0 -0
- painapple_code-1.0.0/docs-site/assets/quick-switcher.gif +0 -0
- painapple_code-1.0.0/docs-site/assets/quick-switcher.png +0 -0
- painapple_code-1.0.0/docs-site/assets/settings-appearance.png +0 -0
- painapple_code-1.0.0/docs-site/assets/settings-claude.png +0 -0
- painapple_code-1.0.0/docs-site/assets/shadow-journal.png +0 -0
- painapple_code-1.0.0/docs-site/assets/snippets-picker.png +0 -0
- painapple_code-1.0.0/docs-site/assets/terminal.gif +0 -0
- painapple_code-1.0.0/docs-site/assets/turn-summary-bar-expanded.png +0 -0
- painapple_code-1.0.0/docs-site/assets/turn-summary-bar.png +0 -0
- painapple_code-1.0.0/docs-site/assets/welcome-screen.png +0 -0
- painapple_code-1.0.0/docs-site/assets/zen-mode.png +0 -0
- painapple_code-1.0.0/docs-site/features.md +72 -0
- painapple_code-1.0.0/docs-site/getting-started/first-run.md +98 -0
- painapple_code-1.0.0/docs-site/getting-started/install-devcontainer.md +132 -0
- painapple_code-1.0.0/docs-site/getting-started/install-docker.md +178 -0
- painapple_code-1.0.0/docs-site/getting-started/install-pip.md +160 -0
- painapple_code-1.0.0/docs-site/getting-started/requirements.md +58 -0
- painapple_code-1.0.0/docs-site/getting-started/security.md +62 -0
- painapple_code-1.0.0/docs-site/guides/analytics-and-history.md +72 -0
- painapple_code-1.0.0/docs-site/guides/claude-artifacts.md +90 -0
- painapple_code-1.0.0/docs-site/guides/customization.md +89 -0
- painapple_code-1.0.0/docs-site/guides/engines.md +61 -0
- painapple_code-1.0.0/docs-site/guides/files.md +78 -0
- painapple_code-1.0.0/docs-site/guides/git-and-diffs.md +47 -0
- painapple_code-1.0.0/docs-site/guides/images-and-annotation.md +80 -0
- painapple_code-1.0.0/docs-site/guides/input-and-commands.md +70 -0
- painapple_code-1.0.0/docs-site/guides/ipad-and-mobile.md +59 -0
- painapple_code-1.0.0/docs-site/guides/permissions-and-thinking.md +70 -0
- painapple_code-1.0.0/docs-site/guides/sessions.md +106 -0
- painapple_code-1.0.0/docs-site/guides/shadow-git.md +84 -0
- painapple_code-1.0.0/docs-site/guides/stash-and-discussions.md +85 -0
- painapple_code-1.0.0/docs-site/guides/terminal.md +77 -0
- painapple_code-1.0.0/docs-site/guides/welcome-screen.md +56 -0
- painapple_code-1.0.0/docs-site/guides/zen-mode.md +52 -0
- painapple_code-1.0.0/docs-site/index.md +48 -0
- painapple_code-1.0.0/docs-site/reference/api.md +190 -0
- painapple_code-1.0.0/docs-site/reference/commands.md +130 -0
- painapple_code-1.0.0/docs-site/reference/data-storage.md +135 -0
- painapple_code-1.0.0/docs-site/reference/keyboard-shortcuts.md +128 -0
- painapple_code-1.0.0/docs-site/reference/optional-helpers.md +109 -0
- painapple_code-1.0.0/docs-site/reference/profiles.md +136 -0
- painapple_code-1.0.0/docs-site/reference/server-cli.md +236 -0
- painapple_code-1.0.0/mkdocs.yml +106 -0
- painapple_code-1.0.0/painapple-docker.sh +606 -0
- painapple_code-1.0.0/pyproject.toml +100 -0
- painapple_code-1.0.0/requirements-docs.txt +1 -0
- painapple_code-1.0.0/requirements.txt +61 -0
- painapple_code-1.0.0/setup.cfg +4 -0
- painapple_code-1.0.0/setup.py +90 -0
- painapple_code-1.0.0/src/painapple_code/__init__.py +30 -0
- painapple_code-1.0.0/src/painapple_code/__main__.py +18 -0
- painapple_code-1.0.0/src/painapple_code/_version.py +24 -0
- painapple_code-1.0.0/src/painapple_code/auth_middleware.py +930 -0
- painapple_code-1.0.0/src/painapple_code/cli/__init__.py +204 -0
- painapple_code-1.0.0/src/painapple_code/cli/deploy/__init__.py +15 -0
- painapple_code-1.0.0/src/painapple_code/cli/deploy/claude_seed.py +41 -0
- painapple_code-1.0.0/src/painapple_code/cli/deploy/config.py +260 -0
- painapple_code-1.0.0/src/painapple_code/cli/deploy/container.py +715 -0
- painapple_code-1.0.0/src/painapple_code/cli/deploy/launch.py +163 -0
- painapple_code-1.0.0/src/painapple_code/cli/deploy/runtime.py +223 -0
- painapple_code-1.0.0/src/painapple_code/cli/lifecycle_cmd.py +443 -0
- painapple_code-1.0.0/src/painapple_code/cli/list_cmd.py +572 -0
- painapple_code-1.0.0/src/painapple_code/cli/manage_cmd.py +670 -0
- painapple_code-1.0.0/src/painapple_code/cli/netinfo.py +125 -0
- painapple_code-1.0.0/src/painapple_code/cli/profiles.py +390 -0
- painapple_code-1.0.0/src/painapple_code/cli/serve_args.py +163 -0
- painapple_code-1.0.0/src/painapple_code/cli/serve_config.py +256 -0
- painapple_code-1.0.0/src/painapple_code/cli/setup_cmd.py +664 -0
- painapple_code-1.0.0/src/painapple_code/cli/ui.py +438 -0
- painapple_code-1.0.0/src/painapple_code/cost_analytics.py +879 -0
- painapple_code-1.0.0/src/painapple_code/data/models.defaults.yaml +18 -0
- painapple_code-1.0.0/src/painapple_code/data/models.yaml +18 -0
- painapple_code-1.0.0/src/painapple_code/data/presets.defaults.json +32 -0
- painapple_code-1.0.0/src/painapple_code/data/strings.yaml +2269 -0
- painapple_code-1.0.0/src/painapple_code/helpers.py +406 -0
- painapple_code-1.0.0/src/painapple_code/paths.py +1514 -0
- painapple_code-1.0.0/src/painapple_code/prompt_explorer.py +984 -0
- painapple_code-1.0.0/src/painapple_code/providers/__init__.py +224 -0
- painapple_code-1.0.0/src/painapple_code/providers/base.py +710 -0
- painapple_code-1.0.0/src/painapple_code/providers/claude/__init__.py +74 -0
- painapple_code-1.0.0/src/painapple_code/providers/claude/capabilities.py +218 -0
- painapple_code-1.0.0/src/painapple_code/providers/claude/errors.py +79 -0
- painapple_code-1.0.0/src/painapple_code/providers/claude/launch.py +50 -0
- painapple_code-1.0.0/src/painapple_code/providers/claude/summary.py +89 -0
- painapple_code-1.0.0/src/painapple_code/providers/claude/translate.py +74 -0
- painapple_code-1.0.0/src/painapple_code/providers/claude_sdk/__init__.py +139 -0
- painapple_code-1.0.0/src/painapple_code/providers/claude_sdk/driver.py +412 -0
- painapple_code-1.0.0/src/painapple_code/providers/codex/__init__.py +87 -0
- painapple_code-1.0.0/src/painapple_code/providers/codex/capabilities.py +321 -0
- painapple_code-1.0.0/src/painapple_code/providers/codex/errors.py +70 -0
- painapple_code-1.0.0/src/painapple_code/providers/codex/launch.py +142 -0
- painapple_code-1.0.0/src/painapple_code/providers/codex/summary.py +196 -0
- painapple_code-1.0.0/src/painapple_code/providers/codex/translate.py +204 -0
- painapple_code-1.0.0/src/painapple_code/providers/codex_app_server/__init__.py +100 -0
- painapple_code-1.0.0/src/painapple_code/providers/codex_app_server/capabilities.py +41 -0
- painapple_code-1.0.0/src/painapple_code/providers/codex_app_server/launch.py +202 -0
- painapple_code-1.0.0/src/painapple_code/providers/codex_app_server/summary.py +291 -0
- painapple_code-1.0.0/src/painapple_code/providers/codex_app_server/translate.py +263 -0
- painapple_code-1.0.0/src/painapple_code/providers/codex_app_server/transport.py +238 -0
- painapple_code-1.0.0/src/painapple_code/routes/__init__.py +0 -0
- painapple_code-1.0.0/src/painapple_code/routes/api_agents.py +441 -0
- painapple_code-1.0.0/src/painapple_code/routes/api_app.py +368 -0
- painapple_code-1.0.0/src/painapple_code/routes/api_app_commit_sections.py +127 -0
- painapple_code-1.0.0/src/painapple_code/routes/api_app_config.py +997 -0
- painapple_code-1.0.0/src/painapple_code/routes/api_app_session_prefs.py +217 -0
- painapple_code-1.0.0/src/painapple_code/routes/api_browser.py +690 -0
- painapple_code-1.0.0/src/painapple_code/routes/api_commands.py +374 -0
- painapple_code-1.0.0/src/painapple_code/routes/api_costs.py +128 -0
- painapple_code-1.0.0/src/painapple_code/routes/api_drafts.py +139 -0
- painapple_code-1.0.0/src/painapple_code/routes/api_exec.py +149 -0
- painapple_code-1.0.0/src/painapple_code/routes/api_files.py +542 -0
- painapple_code-1.0.0/src/painapple_code/routes/api_git.py +657 -0
- painapple_code-1.0.0/src/painapple_code/routes/api_logs.py +649 -0
- painapple_code-1.0.0/src/painapple_code/routes/api_plugins.py +275 -0
- painapple_code-1.0.0/src/painapple_code/routes/api_project_config.py +418 -0
- painapple_code-1.0.0/src/painapple_code/routes/api_prompts.py +231 -0
- painapple_code-1.0.0/src/painapple_code/routes/api_providers.py +53 -0
- painapple_code-1.0.0/src/painapple_code/routes/api_search.py +411 -0
- painapple_code-1.0.0/src/painapple_code/routes/api_session_stash.py +234 -0
- painapple_code-1.0.0/src/painapple_code/routes/api_session_welcome.py +151 -0
- painapple_code-1.0.0/src/painapple_code/routes/api_sessions.py +742 -0
- painapple_code-1.0.0/src/painapple_code/routes/api_shadow.py +323 -0
- painapple_code-1.0.0/src/painapple_code/routes/api_shadow_db.py +512 -0
- painapple_code-1.0.0/src/painapple_code/routes/api_shadow_files.py +332 -0
- painapple_code-1.0.0/src/painapple_code/routes/api_shadow_search.py +476 -0
- painapple_code-1.0.0/src/painapple_code/routes/api_skills.py +610 -0
- painapple_code-1.0.0/src/painapple_code/routes/api_tasks.py +147 -0
- painapple_code-1.0.0/src/painapple_code/routes/api_terminal.py +540 -0
- painapple_code-1.0.0/src/painapple_code/routes/api_upload.py +293 -0
- painapple_code-1.0.0/src/painapple_code/routes/api_viewer.py +229 -0
- painapple_code-1.0.0/src/painapple_code/routes/dependencies.py +109 -0
- painapple_code-1.0.0/src/painapple_code/routes/ws_chat.py +837 -0
- painapple_code-1.0.0/src/painapple_code/server.py +2208 -0
- painapple_code-1.0.0/src/painapple_code/server_logging.py +263 -0
- painapple_code-1.0.0/src/painapple_code/services/__init__.py +0 -0
- painapple_code-1.0.0/src/painapple_code/services/agent_session.py +2738 -0
- painapple_code-1.0.0/src/painapple_code/session_store.py +253 -0
- painapple_code-1.0.0/src/painapple_code/session_store_core.py +879 -0
- painapple_code-1.0.0/src/painapple_code/shadow_db.py +830 -0
- painapple_code-1.0.0/src/painapple_code/shadow_db_plans.py +369 -0
- painapple_code-1.0.0/src/painapple_code/shadow_db_queries.py +595 -0
- painapple_code-1.0.0/src/painapple_code/shadow_db_schema.py +676 -0
- painapple_code-1.0.0/src/painapple_code/shadow_git.py +1296 -0
- painapple_code-1.0.0/src/painapple_code/shadow_git_frontmatter.py +314 -0
- painapple_code-1.0.0/src/painapple_code/shadow_git_sections.py +520 -0
- painapple_code-1.0.0/src/painapple_code/shadow_git_summary.py +462 -0
- painapple_code-1.0.0/src/painapple_code/shadow_parser.py +560 -0
- painapple_code-1.0.0/src/painapple_code/static/css/00-variables.css +276 -0
- painapple_code-1.0.0/src/painapple_code/static/css/01-base.css +245 -0
- painapple_code-1.0.0/src/painapple_code/static/css/02-tooltips.css +36 -0
- painapple_code-1.0.0/src/painapple_code/static/css/09-left-rail.css +448 -0
- painapple_code-1.0.0/src/painapple_code/static/css/10-header.css +777 -0
- painapple_code-1.0.0/src/painapple_code/static/css/11-connection-bar.css +120 -0
- painapple_code-1.0.0/src/painapple_code/static/css/20-messages.css +750 -0
- painapple_code-1.0.0/src/painapple_code/static/css/21-tool-blocks.css +2340 -0
- painapple_code-1.0.0/src/painapple_code/static/css/22-edit-diff.css +619 -0
- painapple_code-1.0.0/src/painapple_code/static/css/23-thinking.css +1584 -0
- painapple_code-1.0.0/src/painapple_code/static/css/24-background-tasks.css +359 -0
- painapple_code-1.0.0/src/painapple_code/static/css/25-context-block.css +252 -0
- painapple_code-1.0.0/src/painapple_code/static/css/26-session-setup.css +144 -0
- painapple_code-1.0.0/src/painapple_code/static/css/30-markdown.css +854 -0
- painapple_code-1.0.0/src/painapple_code/static/css/40-input.css +2418 -0
- painapple_code-1.0.0/src/painapple_code/static/css/41-autocomplete.css +127 -0
- painapple_code-1.0.0/src/painapple_code/static/css/42-activity-strip.css +97 -0
- painapple_code-1.0.0/src/painapple_code/static/css/43-file-autocomplete.css +121 -0
- painapple_code-1.0.0/src/painapple_code/static/css/44-snippets-autocomplete.css +224 -0
- painapple_code-1.0.0/src/painapple_code/static/css/45-selection-bar.css +433 -0
- painapple_code-1.0.0/src/painapple_code/static/css/46-keyboard-bar.css +119 -0
- painapple_code-1.0.0/src/painapple_code/static/css/47-keyboard-longpress.css +116 -0
- painapple_code-1.0.0/src/painapple_code/static/css/47-token-profile.css +106 -0
- painapple_code-1.0.0/src/painapple_code/static/css/50-welcome.css +3095 -0
- painapple_code-1.0.0/src/painapple_code/static/css/51-modals.css +301 -0
- painapple_code-1.0.0/src/painapple_code/static/css/52-utilities.css +77 -0
- painapple_code-1.0.0/src/painapple_code/static/css/53-image-upload.css +456 -0
- painapple_code-1.0.0/src/painapple_code/static/css/54-todo-list.css +102 -0
- painapple_code-1.0.0/src/painapple_code/static/css/55-file-upload.css +113 -0
- painapple_code-1.0.0/src/painapple_code/static/css/56-chat-navigator.css +218 -0
- painapple_code-1.0.0/src/painapple_code/static/css/56-permission-card.css +332 -0
- painapple_code-1.0.0/src/painapple_code/static/css/56-plan-approval.css +204 -0
- painapple_code-1.0.0/src/painapple_code/static/css/56-question-form.css +602 -0
- painapple_code-1.0.0/src/painapple_code/static/css/57-swipe-indicator.css +95 -0
- painapple_code-1.0.0/src/painapple_code/static/css/58-session-families.css +627 -0
- painapple_code-1.0.0/src/painapple_code/static/css/59-about.css +196 -0
- painapple_code-1.0.0/src/painapple_code/static/css/61-log-explorer.css +723 -0
- painapple_code-1.0.0/src/painapple_code/static/css/62-json-tree.css +489 -0
- painapple_code-1.0.0/src/painapple_code/static/css/62-skills-widget.css +650 -0
- painapple_code-1.0.0/src/painapple_code/static/css/63-commands-widget.css +30 -0
- painapple_code-1.0.0/src/painapple_code/static/css/63-plugins-widget.css +174 -0
- painapple_code-1.0.0/src/painapple_code/static/css/63-terminal.css +516 -0
- painapple_code-1.0.0/src/painapple_code/static/css/64-search-files-widget.css +448 -0
- painapple_code-1.0.0/src/painapple_code/static/css/65-snippets-widget.css +426 -0
- painapple_code-1.0.0/src/painapple_code/static/css/66-active-sessions.css +979 -0
- painapple_code-1.0.0/src/painapple_code/static/css/66-agents-widget.css +265 -0
- painapple_code-1.0.0/src/painapple_code/static/css/66-file-explorer-widget.css +855 -0
- painapple_code-1.0.0/src/painapple_code/static/css/66-git-panel.css +791 -0
- painapple_code-1.0.0/src/painapple_code/static/css/66-history-explorer.css +1496 -0
- painapple_code-1.0.0/src/painapple_code/static/css/67-diff-viewer.css +602 -0
- painapple_code-1.0.0/src/painapple_code/static/css/67-editor-view.css +748 -0
- painapple_code-1.0.0/src/painapple_code/static/css/67-file-preview-widget.css +1873 -0
- painapple_code-1.0.0/src/painapple_code/static/css/68-browser-widget.css +337 -0
- painapple_code-1.0.0/src/painapple_code/static/css/68-compare-wizard.css +355 -0
- painapple_code-1.0.0/src/painapple_code/static/css/68-csv-preview.css +106 -0
- painapple_code-1.0.0/src/painapple_code/static/css/68-diff-preview.css +103 -0
- painapple_code-1.0.0/src/painapple_code/static/css/68-helpers-install-widget.css +491 -0
- painapple_code-1.0.0/src/painapple_code/static/css/68-image-annotate.css +346 -0
- painapple_code-1.0.0/src/painapple_code/static/css/68-terminal-view.css +98 -0
- painapple_code-1.0.0/src/painapple_code/static/css/68-uploads-widget.css +229 -0
- painapple_code-1.0.0/src/painapple_code/static/css/69-cost-analytics.css +537 -0
- painapple_code-1.0.0/src/painapple_code/static/css/70-config-panel.css +3736 -0
- painapple_code-1.0.0/src/painapple_code/static/css/70-excalidraw.css +136 -0
- painapple_code-1.0.0/src/painapple_code/static/css/70-prompt-explorer.css +890 -0
- painapple_code-1.0.0/src/painapple_code/static/css/71-chart.css +111 -0
- painapple_code-1.0.0/src/painapple_code/static/css/72-discussion-sidebar.css +678 -0
- painapple_code-1.0.0/src/painapple_code/static/css/74-debug-logs.css +656 -0
- painapple_code-1.0.0/src/painapple_code/static/css/80-open-dialog.css +146 -0
- painapple_code-1.0.0/src/painapple_code/static/css/80-quick-switcher.css +383 -0
- painapple_code-1.0.0/src/painapple_code/static/css/80-widget-system.css +1763 -0
- painapple_code-1.0.0/src/painapple_code/static/css/81-quick-actions.css +1020 -0
- painapple_code-1.0.0/src/painapple_code/static/css/82-context-popover.css +1233 -0
- painapple_code-1.0.0/src/painapple_code/static/css/83-context-menu.css +339 -0
- painapple_code-1.0.0/src/painapple_code/static/css/85-lazy-loading.css +102 -0
- painapple_code-1.0.0/src/painapple_code/static/css/86-zen-mode.css +708 -0
- painapple_code-1.0.0/src/painapple_code/static/css/87-grid-switcher.css +346 -0
- painapple_code-1.0.0/src/painapple_code/static/css/login.css +198 -0
- painapple_code-1.0.0/src/painapple_code/static/dist/app.bundle.js +7177 -0
- painapple_code-1.0.0/src/painapple_code/static/feature-triage.html +446 -0
- painapple_code-1.0.0/src/painapple_code/static/icons/apple-touch-icon.png +0 -0
- painapple_code-1.0.0/src/painapple_code/static/icons/favicon-32.png +0 -0
- painapple_code-1.0.0/src/painapple_code/static/icons/favicon.ico +0 -0
- painapple_code-1.0.0/src/painapple_code/static/icons/icon-128.png +0 -0
- painapple_code-1.0.0/src/painapple_code/static/icons/icon-144.png +0 -0
- painapple_code-1.0.0/src/painapple_code/static/icons/icon-152.png +0 -0
- painapple_code-1.0.0/src/painapple_code/static/icons/icon-180.png +0 -0
- painapple_code-1.0.0/src/painapple_code/static/icons/icon-192.png +0 -0
- painapple_code-1.0.0/src/painapple_code/static/icons/icon-384.png +0 -0
- painapple_code-1.0.0/src/painapple_code/static/icons/icon-512.png +0 -0
- painapple_code-1.0.0/src/painapple_code/static/icons/icon-72.png +0 -0
- painapple_code-1.0.0/src/painapple_code/static/icons/icon-96.png +0 -0
- painapple_code-1.0.0/src/painapple_code/static/js/action-delegate.js +187 -0
- painapple_code-1.0.0/src/painapple_code/static/js/activity-strip.js +193 -0
- painapple_code-1.0.0/src/painapple_code/static/js/app/context-menus.js +619 -0
- painapple_code-1.0.0/src/painapple_code/static/js/app/file-preview.js +163 -0
- painapple_code-1.0.0/src/painapple_code/static/js/app/init-ui.js +574 -0
- painapple_code-1.0.0/src/painapple_code/static/js/app/input-events.js +561 -0
- painapple_code-1.0.0/src/painapple_code/static/js/app/input-resize.js +313 -0
- painapple_code-1.0.0/src/painapple_code/static/js/app/message-actions.js +419 -0
- painapple_code-1.0.0/src/painapple_code/static/js/app/panels.js +210 -0
- painapple_code-1.0.0/src/painapple_code/static/js/app/rendering-delegators.js +246 -0
- painapple_code-1.0.0/src/painapple_code/static/js/app/server-loading.js +365 -0
- painapple_code-1.0.0/src/painapple_code/static/js/app/session-ops.js +287 -0
- painapple_code-1.0.0/src/painapple_code/static/js/app/session-switch.js +443 -0
- painapple_code-1.0.0/src/painapple_code/static/js/app/settings-helpers.js +280 -0
- painapple_code-1.0.0/src/painapple_code/static/js/app/startup-welcome.js +290 -0
- painapple_code-1.0.0/src/painapple_code/static/js/app-context.js +157 -0
- painapple_code-1.0.0/src/painapple_code/static/js/app.js +2134 -0
- painapple_code-1.0.0/src/painapple_code/static/js/auth-fetch.js +46 -0
- painapple_code-1.0.0/src/painapple_code/static/js/background-tasks.js +274 -0
- painapple_code-1.0.0/src/painapple_code/static/js/boot.js +73 -0
- painapple_code-1.0.0/src/painapple_code/static/js/caret-position.js +171 -0
- painapple_code-1.0.0/src/painapple_code/static/js/chat-navigator.js +710 -0
- painapple_code-1.0.0/src/painapple_code/static/js/chat-search.js +323 -0
- painapple_code-1.0.0/src/painapple_code/static/js/command-executor.js +176 -0
- painapple_code-1.0.0/src/painapple_code/static/js/command-store.js +497 -0
- painapple_code-1.0.0/src/painapple_code/static/js/components.js +1414 -0
- painapple_code-1.0.0/src/painapple_code/static/js/config.js +218 -0
- painapple_code-1.0.0/src/painapple_code/static/js/context-menu.js +740 -0
- painapple_code-1.0.0/src/painapple_code/static/js/controllers/chat-controller.js +4252 -0
- painapple_code-1.0.0/src/painapple_code/static/js/controllers/dialog-controller.js +217 -0
- painapple_code-1.0.0/src/painapple_code/static/js/controllers/tab-controller.js +1828 -0
- painapple_code-1.0.0/src/painapple_code/static/js/controllers/thinking-controller.js +915 -0
- painapple_code-1.0.0/src/painapple_code/static/js/diff-utils.js +486 -0
- painapple_code-1.0.0/src/painapple_code/static/js/drafts-pill.js +95 -0
- painapple_code-1.0.0/src/painapple_code/static/js/editor-view.js +815 -0
- painapple_code-1.0.0/src/painapple_code/static/js/effort-settings.js +430 -0
- painapple_code-1.0.0/src/painapple_code/static/js/feature-triage.js +811 -0
- painapple_code-1.0.0/src/painapple_code/static/js/file-autocomplete.js +516 -0
- painapple_code-1.0.0/src/painapple_code/static/js/file-tabs.js +123 -0
- painapple_code-1.0.0/src/painapple_code/static/js/gestures.js +448 -0
- painapple_code-1.0.0/src/painapple_code/static/js/grid-switcher.js +334 -0
- painapple_code-1.0.0/src/painapple_code/static/js/input-handler.js +1472 -0
- painapple_code-1.0.0/src/painapple_code/static/js/keyboard-bar.js +495 -0
- painapple_code-1.0.0/src/painapple_code/static/js/layout-switcher.js +109 -0
- painapple_code-1.0.0/src/painapple_code/static/js/linkify-utils.js +200 -0
- painapple_code-1.0.0/src/painapple_code/static/js/login.js +141 -0
- painapple_code-1.0.0/src/painapple_code/static/js/open-dialog.js +879 -0
- painapple_code-1.0.0/src/painapple_code/static/js/orphan-terminals.js +373 -0
- painapple_code-1.0.0/src/painapple_code/static/js/path-utils.js +179 -0
- painapple_code-1.0.0/src/painapple_code/static/js/perf-marks.js +102 -0
- painapple_code-1.0.0/src/painapple_code/static/js/permission-settings.js +475 -0
- painapple_code-1.0.0/src/painapple_code/static/js/pointer-input.js +59 -0
- painapple_code-1.0.0/src/painapple_code/static/js/preview/json-tree-menu.js +226 -0
- painapple_code-1.0.0/src/painapple_code/static/js/preview/json-tree-toolbar.js +291 -0
- painapple_code-1.0.0/src/painapple_code/static/js/preview/json-tree.js +457 -0
- painapple_code-1.0.0/src/painapple_code/static/js/preview/preview-breadcrumb.js +387 -0
- painapple_code-1.0.0/src/painapple_code/static/js/preview/preview-edit.js +367 -0
- painapple_code-1.0.0/src/painapple_code/static/js/preview/preview-events.js +361 -0
- painapple_code-1.0.0/src/painapple_code/static/js/preview/preview-history.js +567 -0
- painapple_code-1.0.0/src/painapple_code/static/js/preview/preview-inline-edit.js +869 -0
- painapple_code-1.0.0/src/painapple_code/static/js/preview/preview-poll.js +108 -0
- painapple_code-1.0.0/src/painapple_code/static/js/preview/preview-render.js +572 -0
- painapple_code-1.0.0/src/painapple_code/static/js/preview/preview-search.js +421 -0
- painapple_code-1.0.0/src/painapple_code/static/js/preview/preview-state.js +256 -0
- painapple_code-1.0.0/src/painapple_code/static/js/preview/preview-utils.js +251 -0
- painapple_code-1.0.0/src/painapple_code/static/js/preview-plugins/chart-plugin.js +22 -0
- painapple_code-1.0.0/src/painapple_code/static/js/preview-plugins/csv-plugin.js +188 -0
- painapple_code-1.0.0/src/painapple_code/static/js/preview-plugins/diff-plugin.js +258 -0
- painapple_code-1.0.0/src/painapple_code/static/js/preview-plugins/excalidraw-plugin.js +25 -0
- painapple_code-1.0.0/src/painapple_code/static/js/preview-plugins/html-plugin.js +104 -0
- painapple_code-1.0.0/src/painapple_code/static/js/preview-plugins/image-plugin.js +20 -0
- painapple_code-1.0.0/src/painapple_code/static/js/preview-plugins/index.js +34 -0
- painapple_code-1.0.0/src/painapple_code/static/js/preview-plugins/json-plugin.js +99 -0
- painapple_code-1.0.0/src/painapple_code/static/js/preview-plugins/jsonl-plugin.js +152 -0
- painapple_code-1.0.0/src/painapple_code/static/js/preview-plugins/markdown-plugin.js +266 -0
- painapple_code-1.0.0/src/painapple_code/static/js/preview-plugins/panzoom-plugin.js +63 -0
- painapple_code-1.0.0/src/painapple_code/static/js/preview-plugins/plugin-helpers.js +282 -0
- painapple_code-1.0.0/src/painapple_code/static/js/project-color-picker.js +110 -0
- painapple_code-1.0.0/src/painapple_code/static/js/project-colors.js +163 -0
- painapple_code-1.0.0/src/painapple_code/static/js/prompt-favorites.js +187 -0
- painapple_code-1.0.0/src/painapple_code/static/js/quick-actions-menu.js +1736 -0
- painapple_code-1.0.0/src/painapple_code/static/js/quick-actions-registry.js +1239 -0
- painapple_code-1.0.0/src/painapple_code/static/js/quick-switcher/controller.js +294 -0
- painapple_code-1.0.0/src/painapple_code/static/js/quick-switcher/fuzzy-scorer.js +123 -0
- painapple_code-1.0.0/src/painapple_code/static/js/quick-switcher/index.js +30 -0
- painapple_code-1.0.0/src/painapple_code/static/js/quick-switcher/providers/base-provider.js +51 -0
- painapple_code-1.0.0/src/painapple_code/static/js/quick-switcher/providers/command-provider.js +56 -0
- painapple_code-1.0.0/src/painapple_code/static/js/quick-switcher/providers/file-provider.js +291 -0
- painapple_code-1.0.0/src/painapple_code/static/js/quick-switcher/providers/panel-provider.js +132 -0
- painapple_code-1.0.0/src/painapple_code/static/js/quick-switcher/providers/project-provider.js +361 -0
- painapple_code-1.0.0/src/painapple_code/static/js/quick-switcher/providers/read-files-provider.js +104 -0
- painapple_code-1.0.0/src/painapple_code/static/js/quick-switcher/providers/skills-provider.js +129 -0
- painapple_code-1.0.0/src/painapple_code/static/js/quick-switcher/registry.js +69 -0
- painapple_code-1.0.0/src/painapple_code/static/js/quick-switcher/ui/item.js +54 -0
- painapple_code-1.0.0/src/painapple_code/static/js/quick-switcher/ui/picker.js +464 -0
- painapple_code-1.0.0/src/painapple_code/static/js/recent-opens.js +40 -0
- painapple_code-1.0.0/src/painapple_code/static/js/scroll-manager.js +530 -0
- painapple_code-1.0.0/src/painapple_code/static/js/scroll-state-machine.js +359 -0
- painapple_code-1.0.0/src/painapple_code/static/js/selection/action-bar.js +793 -0
- painapple_code-1.0.0/src/painapple_code/static/js/selection/index.js +15 -0
- painapple_code-1.0.0/src/painapple_code/static/js/selection/selection-handler.js +877 -0
- painapple_code-1.0.0/src/painapple_code/static/js/selection/state.js +181 -0
- painapple_code-1.0.0/src/painapple_code/static/js/session/agent-progress.js +202 -0
- painapple_code-1.0.0/src/painapple_code/static/js/session/handle-agent-message.js +481 -0
- painapple_code-1.0.0/src/painapple_code/static/js/session/handle-message.js +550 -0
- painapple_code-1.0.0/src/painapple_code/static/js/session/interactive.js +587 -0
- painapple_code-1.0.0/src/painapple_code/static/js/session/message-store.js +271 -0
- painapple_code-1.0.0/src/painapple_code/static/js/session/messages.js +253 -0
- painapple_code-1.0.0/src/painapple_code/static/js/session/persistence.js +179 -0
- painapple_code-1.0.0/src/painapple_code/static/js/session/restore.js +136 -0
- painapple_code-1.0.0/src/painapple_code/static/js/session/sync.js +333 -0
- painapple_code-1.0.0/src/painapple_code/static/js/session-container-pool.js +371 -0
- painapple_code-1.0.0/src/painapple_code/static/js/session-setup-panel.js +274 -0
- painapple_code-1.0.0/src/painapple_code/static/js/session.js +1047 -0
- painapple_code-1.0.0/src/painapple_code/static/js/shortcut-hints.js +272 -0
- painapple_code-1.0.0/src/painapple_code/static/js/shortcuts.js +1146 -0
- painapple_code-1.0.0/src/painapple_code/static/js/skills-autocomplete.js +262 -0
- painapple_code-1.0.0/src/painapple_code/static/js/snippets-autocomplete.js +738 -0
- painapple_code-1.0.0/src/painapple_code/static/js/stash-refs-view.js +83 -0
- painapple_code-1.0.0/src/painapple_code/static/js/stash-ui.js +768 -0
- painapple_code-1.0.0/src/painapple_code/static/js/stash.js +785 -0
- painapple_code-1.0.0/src/painapple_code/static/js/status-bar.js +1184 -0
- painapple_code-1.0.0/src/painapple_code/static/js/token-profile.js +274 -0
- painapple_code-1.0.0/src/painapple_code/static/js/tool-renderer-blocks.js +1626 -0
- painapple_code-1.0.0/src/painapple_code/static/js/tool-renderer-thinking.js +813 -0
- painapple_code-1.0.0/src/painapple_code/static/js/tool-renderer.js +1500 -0
- painapple_code-1.0.0/src/painapple_code/static/js/tooltips.js +197 -0
- painapple_code-1.0.0/src/painapple_code/static/js/upload-manager.js +1019 -0
- painapple_code-1.0.0/src/painapple_code/static/js/utils.js +521 -0
- painapple_code-1.0.0/src/painapple_code/static/js/welcome/api.js +363 -0
- painapple_code-1.0.0/src/painapple_code/static/js/welcome/cards.js +626 -0
- painapple_code-1.0.0/src/painapple_code/static/js/welcome/context-menu.js +585 -0
- painapple_code-1.0.0/src/painapple_code/static/js/welcome/families.js +801 -0
- painapple_code-1.0.0/src/painapple_code/static/js/welcome/preview.js +234 -0
- painapple_code-1.0.0/src/painapple_code/static/js/welcome/state.js +129 -0
- painapple_code-1.0.0/src/painapple_code/static/js/welcome.js +1874 -0
- painapple_code-1.0.0/src/painapple_code/static/js/widget-system/base-widget.js +717 -0
- painapple_code-1.0.0/src/painapple_code/static/js/widget-system/device-manager.js +178 -0
- painapple_code-1.0.0/src/painapple_code/static/js/widget-system/event-bus.js +152 -0
- painapple_code-1.0.0/src/painapple_code/static/js/widget-system/icons.js +120 -0
- painapple_code-1.0.0/src/painapple_code/static/js/widget-system/index.js +49 -0
- painapple_code-1.0.0/src/painapple_code/static/js/widget-system/init.js +54 -0
- painapple_code-1.0.0/src/painapple_code/static/js/widget-system/types/bottom-sheet.js +307 -0
- painapple_code-1.0.0/src/painapple_code/static/js/widget-system/types/floating.js +915 -0
- painapple_code-1.0.0/src/painapple_code/static/js/widget-system/types/index.js +40 -0
- painapple_code-1.0.0/src/painapple_code/static/js/widget-system/types/modal.js +147 -0
- painapple_code-1.0.0/src/painapple_code/static/js/widget-system/types/sidebar.js +158 -0
- painapple_code-1.0.0/src/painapple_code/static/js/widget-system/types/tab.js +146 -0
- painapple_code-1.0.0/src/painapple_code/static/js/widget-system/types/top-sheet.js +203 -0
- painapple_code-1.0.0/src/painapple_code/static/js/widget-system/widget-manager.js +1187 -0
- painapple_code-1.0.0/src/painapple_code/static/js/widgets/about-widget.js +260 -0
- painapple_code-1.0.0/src/painapple_code/static/js/widgets/active-sessions-widget.js +760 -0
- painapple_code-1.0.0/src/painapple_code/static/js/widgets/agents-widget.js +897 -0
- painapple_code-1.0.0/src/painapple_code/static/js/widgets/browser-widget.js +579 -0
- painapple_code-1.0.0/src/painapple_code/static/js/widgets/commands-widget.js +694 -0
- painapple_code-1.0.0/src/painapple_code/static/js/widgets/config/commit-sections.js +449 -0
- painapple_code-1.0.0/src/painapple_code/static/js/widgets/config/dir-autocomplete.js +224 -0
- painapple_code-1.0.0/src/painapple_code/static/js/widgets/config/gestures.js +161 -0
- painapple_code-1.0.0/src/painapple_code/static/js/widgets/config/models-tab.js +988 -0
- painapple_code-1.0.0/src/painapple_code/static/js/widgets/config/quick-actions-tab.js +882 -0
- painapple_code-1.0.0/src/painapple_code/static/js/widgets/config/shortcut-editor.js +587 -0
- painapple_code-1.0.0/src/painapple_code/static/js/widgets/config/state.js +517 -0
- painapple_code-1.0.0/src/painapple_code/static/js/widgets/config/system-controls.js +90 -0
- painapple_code-1.0.0/src/painapple_code/static/js/widgets/config-widget.js +1535 -0
- painapple_code-1.0.0/src/painapple_code/static/js/widgets/cost-analytics-widget.js +621 -0
- painapple_code-1.0.0/src/painapple_code/static/js/widgets/debug-widget.js +693 -0
- painapple_code-1.0.0/src/painapple_code/static/js/widgets/diff-viewer-widget.js +1420 -0
- painapple_code-1.0.0/src/painapple_code/static/js/widgets/discussion-widget.js +1107 -0
- painapple_code-1.0.0/src/painapple_code/static/js/widgets/file-explorer-widget.js +2166 -0
- painapple_code-1.0.0/src/painapple_code/static/js/widgets/file-preview-widget.js +861 -0
- painapple_code-1.0.0/src/painapple_code/static/js/widgets/git-widget.js +794 -0
- painapple_code-1.0.0/src/painapple_code/static/js/widgets/helpers-install-widget.js +720 -0
- painapple_code-1.0.0/src/painapple_code/static/js/widgets/history-explorer-widget.js +1804 -0
- painapple_code-1.0.0/src/painapple_code/static/js/widgets/image-annotate-widget.js +951 -0
- painapple_code-1.0.0/src/painapple_code/static/js/widgets/image-preview-widget.js +692 -0
- painapple_code-1.0.0/src/painapple_code/static/js/widgets/index.js +176 -0
- painapple_code-1.0.0/src/painapple_code/static/js/widgets/log-explorer-widget.js +1057 -0
- painapple_code-1.0.0/src/painapple_code/static/js/widgets/plugins-widget.js +305 -0
- painapple_code-1.0.0/src/painapple_code/static/js/widgets/prompt-explorer-widget.js +1119 -0
- painapple_code-1.0.0/src/painapple_code/static/js/widgets/search-files-widget.js +529 -0
- painapple_code-1.0.0/src/painapple_code/static/js/widgets/skills-widget.js +843 -0
- painapple_code-1.0.0/src/painapple_code/static/js/widgets/snippets-widget.js +479 -0
- painapple_code-1.0.0/src/painapple_code/static/js/widgets/sub-agents-widget.js +333 -0
- painapple_code-1.0.0/src/painapple_code/static/js/widgets/tasks-widget.js +379 -0
- painapple_code-1.0.0/src/painapple_code/static/js/widgets/terminal/connection.js +283 -0
- painapple_code-1.0.0/src/painapple_code/static/js/widgets/terminal/gestures.js +357 -0
- painapple_code-1.0.0/src/painapple_code/static/js/widgets/terminal/init.js +642 -0
- painapple_code-1.0.0/src/painapple_code/static/js/widgets/terminal/link-providers.js +532 -0
- painapple_code-1.0.0/src/painapple_code/static/js/widgets/terminal/osc52.js +213 -0
- painapple_code-1.0.0/src/painapple_code/static/js/widgets/terminal/render.js +159 -0
- painapple_code-1.0.0/src/painapple_code/static/js/widgets/terminal/size.js +54 -0
- painapple_code-1.0.0/src/painapple_code/static/js/widgets/terminal/state.js +211 -0
- painapple_code-1.0.0/src/painapple_code/static/js/widgets/terminal/wrap-utils.js +101 -0
- painapple_code-1.0.0/src/painapple_code/static/js/widgets/terminal-widget.js +793 -0
- painapple_code-1.0.0/src/painapple_code/static/js/widgets/uploads-widget.js +461 -0
- painapple_code-1.0.0/src/painapple_code/static/js/widgets/zen-widget.js +1001 -0
- painapple_code-1.0.0/src/painapple_code/static/login.html +51 -0
- painapple_code-1.0.0/src/painapple_code/static/manifest.json +73 -0
- painapple_code-1.0.0/src/painapple_code/static/sw.js +293 -0
- painapple_code-1.0.0/src/painapple_code/static/vendor/LICENSES.txt +769 -0
- painapple_code-1.0.0/src/painapple_code/static/vendor/README.md +103 -0
- painapple_code-1.0.0/src/painapple_code/static/vendor/codemirror.js +35 -0
- painapple_code-1.0.0/src/painapple_code/static/vendor/codemirror.js.LEGAL.txt +304 -0
- painapple_code-1.0.0/src/painapple_code/static/vendor/github-markdown-dark.min.css +1124 -0
- painapple_code-1.0.0/src/painapple_code/static/vendor/highlight-github-dark.min.css +10 -0
- painapple_code-1.0.0/src/painapple_code/static/vendor/highlight-lang-dockerfile.min.js +8 -0
- painapple_code-1.0.0/src/painapple_code/static/vendor/highlight-lang-nginx.min.js +21 -0
- painapple_code-1.0.0/src/painapple_code/static/vendor/highlight-lang-properties.min.js +10 -0
- painapple_code-1.0.0/src/painapple_code/static/vendor/highlight-lang-scala.min.js +28 -0
- painapple_code-1.0.0/src/painapple_code/static/vendor/highlight.min.js +1213 -0
- painapple_code-1.0.0/src/painapple_code/static/vendor/marked.min.js +6 -0
- painapple_code-1.0.0/src/painapple_code/static/vendor/purify.min.js +3 -0
- painapple_code-1.0.0/src/painapple_code/static/vendor/xterm-addon-fit.js +2 -0
- painapple_code-1.0.0/src/painapple_code/static/vendor/xterm.css +209 -0
- painapple_code-1.0.0/src/painapple_code/static/vendor/xterm.js +2 -0
- painapple_code-1.0.0/src/painapple_code/static/web-client.html +635 -0
- painapple_code-1.0.0/src/painapple_code/subprocess_registry.py +535 -0
- painapple_code-1.0.0/src/painapple_code/tls_cert.py +79 -0
- painapple_code-1.0.0/src/painapple_code/tools/agents/shadow-git-helper.md +400 -0
- painapple_code-1.0.0/src/painapple_code/tools/excalidraw-to-svg.js +143 -0
- painapple_code-1.0.0/src/painapple_code/tools/install-helpers.sh +148 -0
- painapple_code-1.0.0/src/painapple_code/tools/shadow-git +320 -0
- painapple_code-1.0.0/src/painapple_code/tools/shadow-query +120 -0
- painapple_code-1.0.0/src/painapple_code/tools/vegalite-to-svg.js +79 -0
- painapple_code-1.0.0/src/painapple_code/turn_query.py +766 -0
- painapple_code-1.0.0/src/painapple_code/turn_tracker.py +221 -0
- painapple_code-1.0.0/src/painapple_code/utils/__init__.py +0 -0
- painapple_code-1.0.0/src/painapple_code/utils/agent_cli.py +306 -0
- painapple_code-1.0.0/src/painapple_code/utils/chart.py +103 -0
- painapple_code-1.0.0/src/painapple_code/utils/excalidraw.py +107 -0
- painapple_code-1.0.0/src/painapple_code/utils/file_lock.py +162 -0
- painapple_code-1.0.0/src/painapple_code/utils/file_paths.py +648 -0
- painapple_code-1.0.0/src/painapple_code/utils/generate_icons.py +251 -0
- painapple_code-1.0.0/src/painapple_code/utils/proc.py +205 -0
- painapple_code-1.0.0/src/painapple_code/utils/pty_backend.py +59 -0
- painapple_code-1.0.0/src/painapple_code/utils/pty_posix.py +160 -0
- painapple_code-1.0.0/src/painapple_code/utils/pty_windows.py +245 -0
- painapple_code-1.0.0/src/painapple_code/utils/token_profiles.py +91 -0
- painapple_code-1.0.0/src/painapple_code/viewer_templates.py +657 -0
- painapple_code-1.0.0/src/painapple_code/welcome_search.py +879 -0
- painapple_code-1.0.0/src/painapple_code.egg-info/PKG-INFO +292 -0
- painapple_code-1.0.0/src/painapple_code.egg-info/SOURCES.txt +511 -0
- painapple_code-1.0.0/src/painapple_code.egg-info/dependency_links.txt +1 -0
- painapple_code-1.0.0/src/painapple_code.egg-info/entry_points.txt +2 -0
- painapple_code-1.0.0/src/painapple_code.egg-info/requires.txt +38 -0
- painapple_code-1.0.0/src/painapple_code.egg-info/scm_file_list.json +660 -0
- painapple_code-1.0.0/src/painapple_code.egg-info/scm_version.json +8 -0
- painapple_code-1.0.0/src/painapple_code.egg-info/top_level.txt +1 -0
- 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"]
|