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