painapple-code 1.0.0__py3-none-any.whl
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/__init__.py +30 -0
- painapple_code/__main__.py +18 -0
- painapple_code/_version.py +24 -0
- painapple_code/auth_middleware.py +930 -0
- painapple_code/cli/__init__.py +204 -0
- painapple_code/cli/deploy/__init__.py +15 -0
- painapple_code/cli/deploy/claude_seed.py +41 -0
- painapple_code/cli/deploy/config.py +260 -0
- painapple_code/cli/deploy/container.py +715 -0
- painapple_code/cli/deploy/launch.py +163 -0
- painapple_code/cli/deploy/runtime.py +223 -0
- painapple_code/cli/lifecycle_cmd.py +443 -0
- painapple_code/cli/list_cmd.py +572 -0
- painapple_code/cli/manage_cmd.py +670 -0
- painapple_code/cli/netinfo.py +125 -0
- painapple_code/cli/profiles.py +390 -0
- painapple_code/cli/serve_args.py +163 -0
- painapple_code/cli/serve_config.py +256 -0
- painapple_code/cli/setup_cmd.py +664 -0
- painapple_code/cli/ui.py +438 -0
- painapple_code/cost_analytics.py +879 -0
- painapple_code/data/models.defaults.yaml +18 -0
- painapple_code/data/models.yaml +18 -0
- painapple_code/data/presets.defaults.json +32 -0
- painapple_code/data/strings.yaml +2269 -0
- painapple_code/helpers.py +406 -0
- painapple_code/paths.py +1514 -0
- painapple_code/prompt_explorer.py +984 -0
- painapple_code/providers/__init__.py +224 -0
- painapple_code/providers/base.py +710 -0
- painapple_code/providers/claude/__init__.py +74 -0
- painapple_code/providers/claude/capabilities.py +218 -0
- painapple_code/providers/claude/errors.py +79 -0
- painapple_code/providers/claude/launch.py +50 -0
- painapple_code/providers/claude/summary.py +89 -0
- painapple_code/providers/claude/translate.py +74 -0
- painapple_code/providers/claude_sdk/__init__.py +139 -0
- painapple_code/providers/claude_sdk/driver.py +412 -0
- painapple_code/providers/codex/__init__.py +87 -0
- painapple_code/providers/codex/capabilities.py +321 -0
- painapple_code/providers/codex/errors.py +70 -0
- painapple_code/providers/codex/launch.py +142 -0
- painapple_code/providers/codex/summary.py +196 -0
- painapple_code/providers/codex/translate.py +204 -0
- painapple_code/providers/codex_app_server/__init__.py +100 -0
- painapple_code/providers/codex_app_server/capabilities.py +41 -0
- painapple_code/providers/codex_app_server/launch.py +202 -0
- painapple_code/providers/codex_app_server/summary.py +291 -0
- painapple_code/providers/codex_app_server/translate.py +263 -0
- painapple_code/providers/codex_app_server/transport.py +238 -0
- painapple_code/routes/__init__.py +0 -0
- painapple_code/routes/api_agents.py +441 -0
- painapple_code/routes/api_app.py +368 -0
- painapple_code/routes/api_app_commit_sections.py +127 -0
- painapple_code/routes/api_app_config.py +997 -0
- painapple_code/routes/api_app_session_prefs.py +217 -0
- painapple_code/routes/api_browser.py +690 -0
- painapple_code/routes/api_commands.py +374 -0
- painapple_code/routes/api_costs.py +128 -0
- painapple_code/routes/api_drafts.py +139 -0
- painapple_code/routes/api_exec.py +149 -0
- painapple_code/routes/api_files.py +542 -0
- painapple_code/routes/api_git.py +657 -0
- painapple_code/routes/api_logs.py +649 -0
- painapple_code/routes/api_plugins.py +275 -0
- painapple_code/routes/api_project_config.py +418 -0
- painapple_code/routes/api_prompts.py +231 -0
- painapple_code/routes/api_providers.py +53 -0
- painapple_code/routes/api_search.py +411 -0
- painapple_code/routes/api_session_stash.py +234 -0
- painapple_code/routes/api_session_welcome.py +151 -0
- painapple_code/routes/api_sessions.py +742 -0
- painapple_code/routes/api_shadow.py +323 -0
- painapple_code/routes/api_shadow_db.py +512 -0
- painapple_code/routes/api_shadow_files.py +332 -0
- painapple_code/routes/api_shadow_search.py +476 -0
- painapple_code/routes/api_skills.py +610 -0
- painapple_code/routes/api_tasks.py +147 -0
- painapple_code/routes/api_terminal.py +540 -0
- painapple_code/routes/api_upload.py +293 -0
- painapple_code/routes/api_viewer.py +229 -0
- painapple_code/routes/dependencies.py +109 -0
- painapple_code/routes/ws_chat.py +837 -0
- painapple_code/server.py +2208 -0
- painapple_code/server_logging.py +263 -0
- painapple_code/services/__init__.py +0 -0
- painapple_code/services/agent_session.py +2738 -0
- painapple_code/session_store.py +253 -0
- painapple_code/session_store_core.py +879 -0
- painapple_code/shadow_db.py +830 -0
- painapple_code/shadow_db_plans.py +369 -0
- painapple_code/shadow_db_queries.py +595 -0
- painapple_code/shadow_db_schema.py +676 -0
- painapple_code/shadow_git.py +1296 -0
- painapple_code/shadow_git_frontmatter.py +314 -0
- painapple_code/shadow_git_sections.py +520 -0
- painapple_code/shadow_git_summary.py +462 -0
- painapple_code/shadow_parser.py +560 -0
- painapple_code/static/css/00-variables.css +276 -0
- painapple_code/static/css/01-base.css +245 -0
- painapple_code/static/css/02-tooltips.css +36 -0
- painapple_code/static/css/09-left-rail.css +448 -0
- painapple_code/static/css/10-header.css +777 -0
- painapple_code/static/css/11-connection-bar.css +120 -0
- painapple_code/static/css/20-messages.css +750 -0
- painapple_code/static/css/21-tool-blocks.css +2340 -0
- painapple_code/static/css/22-edit-diff.css +619 -0
- painapple_code/static/css/23-thinking.css +1584 -0
- painapple_code/static/css/24-background-tasks.css +359 -0
- painapple_code/static/css/25-context-block.css +252 -0
- painapple_code/static/css/26-session-setup.css +144 -0
- painapple_code/static/css/30-markdown.css +854 -0
- painapple_code/static/css/40-input.css +2418 -0
- painapple_code/static/css/41-autocomplete.css +127 -0
- painapple_code/static/css/42-activity-strip.css +97 -0
- painapple_code/static/css/43-file-autocomplete.css +121 -0
- painapple_code/static/css/44-snippets-autocomplete.css +224 -0
- painapple_code/static/css/45-selection-bar.css +433 -0
- painapple_code/static/css/46-keyboard-bar.css +119 -0
- painapple_code/static/css/47-keyboard-longpress.css +116 -0
- painapple_code/static/css/47-token-profile.css +106 -0
- painapple_code/static/css/50-welcome.css +3095 -0
- painapple_code/static/css/51-modals.css +301 -0
- painapple_code/static/css/52-utilities.css +77 -0
- painapple_code/static/css/53-image-upload.css +456 -0
- painapple_code/static/css/54-todo-list.css +102 -0
- painapple_code/static/css/55-file-upload.css +113 -0
- painapple_code/static/css/56-chat-navigator.css +218 -0
- painapple_code/static/css/56-permission-card.css +332 -0
- painapple_code/static/css/56-plan-approval.css +204 -0
- painapple_code/static/css/56-question-form.css +602 -0
- painapple_code/static/css/57-swipe-indicator.css +95 -0
- painapple_code/static/css/58-session-families.css +627 -0
- painapple_code/static/css/59-about.css +196 -0
- painapple_code/static/css/61-log-explorer.css +723 -0
- painapple_code/static/css/62-json-tree.css +489 -0
- painapple_code/static/css/62-skills-widget.css +650 -0
- painapple_code/static/css/63-commands-widget.css +30 -0
- painapple_code/static/css/63-plugins-widget.css +174 -0
- painapple_code/static/css/63-terminal.css +516 -0
- painapple_code/static/css/64-search-files-widget.css +448 -0
- painapple_code/static/css/65-snippets-widget.css +426 -0
- painapple_code/static/css/66-active-sessions.css +979 -0
- painapple_code/static/css/66-agents-widget.css +265 -0
- painapple_code/static/css/66-file-explorer-widget.css +855 -0
- painapple_code/static/css/66-git-panel.css +791 -0
- painapple_code/static/css/66-history-explorer.css +1496 -0
- painapple_code/static/css/67-diff-viewer.css +602 -0
- painapple_code/static/css/67-editor-view.css +748 -0
- painapple_code/static/css/67-file-preview-widget.css +1873 -0
- painapple_code/static/css/68-browser-widget.css +337 -0
- painapple_code/static/css/68-compare-wizard.css +355 -0
- painapple_code/static/css/68-csv-preview.css +106 -0
- painapple_code/static/css/68-diff-preview.css +103 -0
- painapple_code/static/css/68-helpers-install-widget.css +491 -0
- painapple_code/static/css/68-image-annotate.css +346 -0
- painapple_code/static/css/68-terminal-view.css +98 -0
- painapple_code/static/css/68-uploads-widget.css +229 -0
- painapple_code/static/css/69-cost-analytics.css +537 -0
- painapple_code/static/css/70-config-panel.css +3736 -0
- painapple_code/static/css/70-excalidraw.css +136 -0
- painapple_code/static/css/70-prompt-explorer.css +890 -0
- painapple_code/static/css/71-chart.css +111 -0
- painapple_code/static/css/72-discussion-sidebar.css +678 -0
- painapple_code/static/css/74-debug-logs.css +656 -0
- painapple_code/static/css/80-open-dialog.css +146 -0
- painapple_code/static/css/80-quick-switcher.css +383 -0
- painapple_code/static/css/80-widget-system.css +1763 -0
- painapple_code/static/css/81-quick-actions.css +1020 -0
- painapple_code/static/css/82-context-popover.css +1233 -0
- painapple_code/static/css/83-context-menu.css +339 -0
- painapple_code/static/css/85-lazy-loading.css +102 -0
- painapple_code/static/css/86-zen-mode.css +708 -0
- painapple_code/static/css/87-grid-switcher.css +346 -0
- painapple_code/static/css/login.css +198 -0
- painapple_code/static/dist/app.bundle.js +7177 -0
- painapple_code/static/feature-triage.html +446 -0
- painapple_code/static/icons/apple-touch-icon.png +0 -0
- painapple_code/static/icons/favicon-32.png +0 -0
- painapple_code/static/icons/favicon.ico +0 -0
- painapple_code/static/icons/icon-128.png +0 -0
- painapple_code/static/icons/icon-144.png +0 -0
- painapple_code/static/icons/icon-152.png +0 -0
- painapple_code/static/icons/icon-180.png +0 -0
- painapple_code/static/icons/icon-192.png +0 -0
- painapple_code/static/icons/icon-384.png +0 -0
- painapple_code/static/icons/icon-512.png +0 -0
- painapple_code/static/icons/icon-72.png +0 -0
- painapple_code/static/icons/icon-96.png +0 -0
- painapple_code/static/js/action-delegate.js +187 -0
- painapple_code/static/js/activity-strip.js +193 -0
- painapple_code/static/js/app/context-menus.js +619 -0
- painapple_code/static/js/app/file-preview.js +163 -0
- painapple_code/static/js/app/init-ui.js +574 -0
- painapple_code/static/js/app/input-events.js +561 -0
- painapple_code/static/js/app/input-resize.js +313 -0
- painapple_code/static/js/app/message-actions.js +419 -0
- painapple_code/static/js/app/panels.js +210 -0
- painapple_code/static/js/app/rendering-delegators.js +246 -0
- painapple_code/static/js/app/server-loading.js +365 -0
- painapple_code/static/js/app/session-ops.js +287 -0
- painapple_code/static/js/app/session-switch.js +443 -0
- painapple_code/static/js/app/settings-helpers.js +280 -0
- painapple_code/static/js/app/startup-welcome.js +290 -0
- painapple_code/static/js/app-context.js +157 -0
- painapple_code/static/js/app.js +2134 -0
- painapple_code/static/js/auth-fetch.js +46 -0
- painapple_code/static/js/background-tasks.js +274 -0
- painapple_code/static/js/boot.js +73 -0
- painapple_code/static/js/caret-position.js +171 -0
- painapple_code/static/js/chat-navigator.js +710 -0
- painapple_code/static/js/chat-search.js +323 -0
- painapple_code/static/js/command-executor.js +176 -0
- painapple_code/static/js/command-store.js +497 -0
- painapple_code/static/js/components.js +1414 -0
- painapple_code/static/js/config.js +218 -0
- painapple_code/static/js/context-menu.js +740 -0
- painapple_code/static/js/controllers/chat-controller.js +4252 -0
- painapple_code/static/js/controllers/dialog-controller.js +217 -0
- painapple_code/static/js/controllers/tab-controller.js +1828 -0
- painapple_code/static/js/controllers/thinking-controller.js +915 -0
- painapple_code/static/js/diff-utils.js +486 -0
- painapple_code/static/js/drafts-pill.js +95 -0
- painapple_code/static/js/editor-view.js +815 -0
- painapple_code/static/js/effort-settings.js +430 -0
- painapple_code/static/js/feature-triage.js +811 -0
- painapple_code/static/js/file-autocomplete.js +516 -0
- painapple_code/static/js/file-tabs.js +123 -0
- painapple_code/static/js/gestures.js +448 -0
- painapple_code/static/js/grid-switcher.js +334 -0
- painapple_code/static/js/input-handler.js +1472 -0
- painapple_code/static/js/keyboard-bar.js +495 -0
- painapple_code/static/js/layout-switcher.js +109 -0
- painapple_code/static/js/linkify-utils.js +200 -0
- painapple_code/static/js/login.js +141 -0
- painapple_code/static/js/open-dialog.js +879 -0
- painapple_code/static/js/orphan-terminals.js +373 -0
- painapple_code/static/js/path-utils.js +179 -0
- painapple_code/static/js/perf-marks.js +102 -0
- painapple_code/static/js/permission-settings.js +475 -0
- painapple_code/static/js/pointer-input.js +59 -0
- painapple_code/static/js/preview/json-tree-menu.js +226 -0
- painapple_code/static/js/preview/json-tree-toolbar.js +291 -0
- painapple_code/static/js/preview/json-tree.js +457 -0
- painapple_code/static/js/preview/preview-breadcrumb.js +387 -0
- painapple_code/static/js/preview/preview-edit.js +367 -0
- painapple_code/static/js/preview/preview-events.js +361 -0
- painapple_code/static/js/preview/preview-history.js +567 -0
- painapple_code/static/js/preview/preview-inline-edit.js +869 -0
- painapple_code/static/js/preview/preview-poll.js +108 -0
- painapple_code/static/js/preview/preview-render.js +572 -0
- painapple_code/static/js/preview/preview-search.js +421 -0
- painapple_code/static/js/preview/preview-state.js +256 -0
- painapple_code/static/js/preview/preview-utils.js +251 -0
- painapple_code/static/js/preview-plugins/chart-plugin.js +22 -0
- painapple_code/static/js/preview-plugins/csv-plugin.js +188 -0
- painapple_code/static/js/preview-plugins/diff-plugin.js +258 -0
- painapple_code/static/js/preview-plugins/excalidraw-plugin.js +25 -0
- painapple_code/static/js/preview-plugins/html-plugin.js +104 -0
- painapple_code/static/js/preview-plugins/image-plugin.js +20 -0
- painapple_code/static/js/preview-plugins/index.js +34 -0
- painapple_code/static/js/preview-plugins/json-plugin.js +99 -0
- painapple_code/static/js/preview-plugins/jsonl-plugin.js +152 -0
- painapple_code/static/js/preview-plugins/markdown-plugin.js +266 -0
- painapple_code/static/js/preview-plugins/panzoom-plugin.js +63 -0
- painapple_code/static/js/preview-plugins/plugin-helpers.js +282 -0
- painapple_code/static/js/project-color-picker.js +110 -0
- painapple_code/static/js/project-colors.js +163 -0
- painapple_code/static/js/prompt-favorites.js +187 -0
- painapple_code/static/js/quick-actions-menu.js +1736 -0
- painapple_code/static/js/quick-actions-registry.js +1239 -0
- painapple_code/static/js/quick-switcher/controller.js +294 -0
- painapple_code/static/js/quick-switcher/fuzzy-scorer.js +123 -0
- painapple_code/static/js/quick-switcher/index.js +30 -0
- painapple_code/static/js/quick-switcher/providers/base-provider.js +51 -0
- painapple_code/static/js/quick-switcher/providers/command-provider.js +56 -0
- painapple_code/static/js/quick-switcher/providers/file-provider.js +291 -0
- painapple_code/static/js/quick-switcher/providers/panel-provider.js +132 -0
- painapple_code/static/js/quick-switcher/providers/project-provider.js +361 -0
- painapple_code/static/js/quick-switcher/providers/read-files-provider.js +104 -0
- painapple_code/static/js/quick-switcher/providers/skills-provider.js +129 -0
- painapple_code/static/js/quick-switcher/registry.js +69 -0
- painapple_code/static/js/quick-switcher/ui/item.js +54 -0
- painapple_code/static/js/quick-switcher/ui/picker.js +464 -0
- painapple_code/static/js/recent-opens.js +40 -0
- painapple_code/static/js/scroll-manager.js +530 -0
- painapple_code/static/js/scroll-state-machine.js +359 -0
- painapple_code/static/js/selection/action-bar.js +793 -0
- painapple_code/static/js/selection/index.js +15 -0
- painapple_code/static/js/selection/selection-handler.js +877 -0
- painapple_code/static/js/selection/state.js +181 -0
- painapple_code/static/js/session/agent-progress.js +202 -0
- painapple_code/static/js/session/handle-agent-message.js +481 -0
- painapple_code/static/js/session/handle-message.js +550 -0
- painapple_code/static/js/session/interactive.js +587 -0
- painapple_code/static/js/session/message-store.js +271 -0
- painapple_code/static/js/session/messages.js +253 -0
- painapple_code/static/js/session/persistence.js +179 -0
- painapple_code/static/js/session/restore.js +136 -0
- painapple_code/static/js/session/sync.js +333 -0
- painapple_code/static/js/session-container-pool.js +371 -0
- painapple_code/static/js/session-setup-panel.js +274 -0
- painapple_code/static/js/session.js +1047 -0
- painapple_code/static/js/shortcut-hints.js +272 -0
- painapple_code/static/js/shortcuts.js +1146 -0
- painapple_code/static/js/skills-autocomplete.js +262 -0
- painapple_code/static/js/snippets-autocomplete.js +738 -0
- painapple_code/static/js/stash-refs-view.js +83 -0
- painapple_code/static/js/stash-ui.js +768 -0
- painapple_code/static/js/stash.js +785 -0
- painapple_code/static/js/status-bar.js +1184 -0
- painapple_code/static/js/token-profile.js +274 -0
- painapple_code/static/js/tool-renderer-blocks.js +1626 -0
- painapple_code/static/js/tool-renderer-thinking.js +813 -0
- painapple_code/static/js/tool-renderer.js +1500 -0
- painapple_code/static/js/tooltips.js +197 -0
- painapple_code/static/js/upload-manager.js +1019 -0
- painapple_code/static/js/utils.js +521 -0
- painapple_code/static/js/welcome/api.js +363 -0
- painapple_code/static/js/welcome/cards.js +626 -0
- painapple_code/static/js/welcome/context-menu.js +585 -0
- painapple_code/static/js/welcome/families.js +801 -0
- painapple_code/static/js/welcome/preview.js +234 -0
- painapple_code/static/js/welcome/state.js +129 -0
- painapple_code/static/js/welcome.js +1874 -0
- painapple_code/static/js/widget-system/base-widget.js +717 -0
- painapple_code/static/js/widget-system/device-manager.js +178 -0
- painapple_code/static/js/widget-system/event-bus.js +152 -0
- painapple_code/static/js/widget-system/icons.js +120 -0
- painapple_code/static/js/widget-system/index.js +49 -0
- painapple_code/static/js/widget-system/init.js +54 -0
- painapple_code/static/js/widget-system/types/bottom-sheet.js +307 -0
- painapple_code/static/js/widget-system/types/floating.js +915 -0
- painapple_code/static/js/widget-system/types/index.js +40 -0
- painapple_code/static/js/widget-system/types/modal.js +147 -0
- painapple_code/static/js/widget-system/types/sidebar.js +158 -0
- painapple_code/static/js/widget-system/types/tab.js +146 -0
- painapple_code/static/js/widget-system/types/top-sheet.js +203 -0
- painapple_code/static/js/widget-system/widget-manager.js +1187 -0
- painapple_code/static/js/widgets/about-widget.js +260 -0
- painapple_code/static/js/widgets/active-sessions-widget.js +760 -0
- painapple_code/static/js/widgets/agents-widget.js +897 -0
- painapple_code/static/js/widgets/browser-widget.js +579 -0
- painapple_code/static/js/widgets/commands-widget.js +694 -0
- painapple_code/static/js/widgets/config/commit-sections.js +449 -0
- painapple_code/static/js/widgets/config/dir-autocomplete.js +224 -0
- painapple_code/static/js/widgets/config/gestures.js +161 -0
- painapple_code/static/js/widgets/config/models-tab.js +988 -0
- painapple_code/static/js/widgets/config/quick-actions-tab.js +882 -0
- painapple_code/static/js/widgets/config/shortcut-editor.js +587 -0
- painapple_code/static/js/widgets/config/state.js +517 -0
- painapple_code/static/js/widgets/config/system-controls.js +90 -0
- painapple_code/static/js/widgets/config-widget.js +1535 -0
- painapple_code/static/js/widgets/cost-analytics-widget.js +621 -0
- painapple_code/static/js/widgets/debug-widget.js +693 -0
- painapple_code/static/js/widgets/diff-viewer-widget.js +1420 -0
- painapple_code/static/js/widgets/discussion-widget.js +1107 -0
- painapple_code/static/js/widgets/file-explorer-widget.js +2166 -0
- painapple_code/static/js/widgets/file-preview-widget.js +861 -0
- painapple_code/static/js/widgets/git-widget.js +794 -0
- painapple_code/static/js/widgets/helpers-install-widget.js +720 -0
- painapple_code/static/js/widgets/history-explorer-widget.js +1804 -0
- painapple_code/static/js/widgets/image-annotate-widget.js +951 -0
- painapple_code/static/js/widgets/image-preview-widget.js +692 -0
- painapple_code/static/js/widgets/index.js +176 -0
- painapple_code/static/js/widgets/log-explorer-widget.js +1057 -0
- painapple_code/static/js/widgets/plugins-widget.js +305 -0
- painapple_code/static/js/widgets/prompt-explorer-widget.js +1119 -0
- painapple_code/static/js/widgets/search-files-widget.js +529 -0
- painapple_code/static/js/widgets/skills-widget.js +843 -0
- painapple_code/static/js/widgets/snippets-widget.js +479 -0
- painapple_code/static/js/widgets/sub-agents-widget.js +333 -0
- painapple_code/static/js/widgets/tasks-widget.js +379 -0
- painapple_code/static/js/widgets/terminal/connection.js +283 -0
- painapple_code/static/js/widgets/terminal/gestures.js +357 -0
- painapple_code/static/js/widgets/terminal/init.js +642 -0
- painapple_code/static/js/widgets/terminal/link-providers.js +532 -0
- painapple_code/static/js/widgets/terminal/osc52.js +213 -0
- painapple_code/static/js/widgets/terminal/render.js +159 -0
- painapple_code/static/js/widgets/terminal/size.js +54 -0
- painapple_code/static/js/widgets/terminal/state.js +211 -0
- painapple_code/static/js/widgets/terminal/wrap-utils.js +101 -0
- painapple_code/static/js/widgets/terminal-widget.js +793 -0
- painapple_code/static/js/widgets/uploads-widget.js +461 -0
- painapple_code/static/js/widgets/zen-widget.js +1001 -0
- painapple_code/static/login.html +51 -0
- painapple_code/static/manifest.json +73 -0
- painapple_code/static/sw.js +293 -0
- painapple_code/static/vendor/LICENSES.txt +769 -0
- painapple_code/static/vendor/README.md +103 -0
- painapple_code/static/vendor/codemirror.js +35 -0
- painapple_code/static/vendor/codemirror.js.LEGAL.txt +304 -0
- painapple_code/static/vendor/github-markdown-dark.min.css +1124 -0
- painapple_code/static/vendor/highlight-github-dark.min.css +10 -0
- painapple_code/static/vendor/highlight-lang-dockerfile.min.js +8 -0
- painapple_code/static/vendor/highlight-lang-nginx.min.js +21 -0
- painapple_code/static/vendor/highlight-lang-properties.min.js +10 -0
- painapple_code/static/vendor/highlight-lang-scala.min.js +28 -0
- painapple_code/static/vendor/highlight.min.js +1213 -0
- painapple_code/static/vendor/marked.min.js +6 -0
- painapple_code/static/vendor/purify.min.js +3 -0
- painapple_code/static/vendor/xterm-addon-fit.js +2 -0
- painapple_code/static/vendor/xterm.css +209 -0
- painapple_code/static/vendor/xterm.js +2 -0
- painapple_code/static/web-client.html +635 -0
- painapple_code/subprocess_registry.py +535 -0
- painapple_code/tls_cert.py +79 -0
- painapple_code/tools/agents/shadow-git-helper.md +400 -0
- painapple_code/tools/excalidraw-to-svg.js +143 -0
- painapple_code/tools/install-helpers.sh +148 -0
- painapple_code/tools/shadow-git +320 -0
- painapple_code/tools/shadow-query +120 -0
- painapple_code/tools/vegalite-to-svg.js +79 -0
- painapple_code/turn_query.py +766 -0
- painapple_code/turn_tracker.py +221 -0
- painapple_code/utils/__init__.py +0 -0
- painapple_code/utils/agent_cli.py +306 -0
- painapple_code/utils/chart.py +103 -0
- painapple_code/utils/excalidraw.py +107 -0
- painapple_code/utils/file_lock.py +162 -0
- painapple_code/utils/file_paths.py +648 -0
- painapple_code/utils/generate_icons.py +251 -0
- painapple_code/utils/proc.py +205 -0
- painapple_code/utils/pty_backend.py +59 -0
- painapple_code/utils/pty_posix.py +160 -0
- painapple_code/utils/pty_windows.py +245 -0
- painapple_code/utils/token_profiles.py +91 -0
- painapple_code/viewer_templates.py +657 -0
- painapple_code/welcome_search.py +879 -0
- painapple_code-1.0.0.dist-info/METADATA +292 -0
- painapple_code-1.0.0.dist-info/RECORD +436 -0
- painapple_code-1.0.0.dist-info/WHEEL +5 -0
- painapple_code-1.0.0.dist-info/entry_points.txt +2 -0
- painapple_code-1.0.0.dist-info/licenses/LICENSE +661 -0
- painapple_code-1.0.0.dist-info/licenses/THIRD_PARTY_NOTICES.md +261 -0
- painapple_code-1.0.0.dist-info/top_level.txt +1 -0
|
@@ -0,0 +1,51 @@
|
|
|
1
|
+
<!DOCTYPE html>
|
|
2
|
+
<html lang="en">
|
|
3
|
+
<head>
|
|
4
|
+
<meta charset="UTF-8">
|
|
5
|
+
<!-- viewport-fit=contain, not cover: in-place nav leaks cover-mode into the chat UI →
|
|
6
|
+
empty bottom bar on iPad/iPhone. Keep all app surfaces non-cover (see web-client.html). -->
|
|
7
|
+
<meta name="viewport" content="width=device-width, initial-scale=1.0, viewport-fit=contain">
|
|
8
|
+
<meta name="theme-color" content="#0d1117">
|
|
9
|
+
<title>Sign in · pAInapple Code</title>
|
|
10
|
+
<link rel="stylesheet" href="/static/css/login.css">
|
|
11
|
+
</head>
|
|
12
|
+
<body>
|
|
13
|
+
<main class="login-shell">
|
|
14
|
+
<div class="login-card">
|
|
15
|
+
<h1 class="login-title">pAInapple Code</h1>
|
|
16
|
+
<p class="login-subtitle">Sign in to continue</p>
|
|
17
|
+
<!-- method="post" is defense-in-depth, not the submit path:
|
|
18
|
+
login.js preventDefault()s and POSTs JSON to /api/login.
|
|
19
|
+
But if that script ever fails to load, the native fallback
|
|
20
|
+
must not be a GET — that would put the password in the
|
|
21
|
+
query string and the access log. A POST to this GET-only
|
|
22
|
+
route 405s: visibly broken, credential intact. -->
|
|
23
|
+
<form id="login-form" method="post" novalidate>
|
|
24
|
+
<label for="password" class="login-label">Password</label>
|
|
25
|
+
<input id="password"
|
|
26
|
+
name="password"
|
|
27
|
+
type="password"
|
|
28
|
+
autocomplete="current-password"
|
|
29
|
+
autofocus
|
|
30
|
+
required>
|
|
31
|
+
<button type="submit" class="login-submit">Sign in</button>
|
|
32
|
+
<p id="error" class="login-error" role="alert" hidden></p>
|
|
33
|
+
</form>
|
|
34
|
+
<div class="login-hint">
|
|
35
|
+
<p class="login-hint-label" id="reveal-label">Reveal the password from your terminal:</p>
|
|
36
|
+
<button type="button"
|
|
37
|
+
class="login-cmd"
|
|
38
|
+
id="reveal-cmd"
|
|
39
|
+
title="Click to copy">
|
|
40
|
+
<code></code>
|
|
41
|
+
<span class="login-cmd-status" aria-live="polite">Copy</span>
|
|
42
|
+
</button>
|
|
43
|
+
</div>
|
|
44
|
+
</div>
|
|
45
|
+
</main>
|
|
46
|
+
<!-- Server-filled config. Non-JS type = data block, never executed,
|
|
47
|
+
so CSP script-src does not gate it. Read by js/login.js. -->
|
|
48
|
+
<script type="application/json" id="login-config">null</script>
|
|
49
|
+
<script src="/static/js/login.js"></script>
|
|
50
|
+
</body>
|
|
51
|
+
</html>
|
|
@@ -0,0 +1,73 @@
|
|
|
1
|
+
{
|
|
2
|
+
"name": "pAInapple Code",
|
|
3
|
+
"short_name": "pAInapple",
|
|
4
|
+
"description": "Remote pAInapple Code client",
|
|
5
|
+
"start_url": "/app",
|
|
6
|
+
"scope": "/",
|
|
7
|
+
"display": "standalone",
|
|
8
|
+
"orientation": "any",
|
|
9
|
+
"background_color": "#1a1a2e",
|
|
10
|
+
"theme_color": "#1a1a2e",
|
|
11
|
+
"icons": [
|
|
12
|
+
{
|
|
13
|
+
"src": "/static/icons/icon-72.png",
|
|
14
|
+
"sizes": "72x72",
|
|
15
|
+
"type": "image/png",
|
|
16
|
+
"purpose": "any"
|
|
17
|
+
},
|
|
18
|
+
{
|
|
19
|
+
"src": "/static/icons/icon-96.png",
|
|
20
|
+
"sizes": "96x96",
|
|
21
|
+
"type": "image/png",
|
|
22
|
+
"purpose": "any"
|
|
23
|
+
},
|
|
24
|
+
{
|
|
25
|
+
"src": "/static/icons/icon-128.png",
|
|
26
|
+
"sizes": "128x128",
|
|
27
|
+
"type": "image/png",
|
|
28
|
+
"purpose": "any"
|
|
29
|
+
},
|
|
30
|
+
{
|
|
31
|
+
"src": "/static/icons/icon-144.png",
|
|
32
|
+
"sizes": "144x144",
|
|
33
|
+
"type": "image/png",
|
|
34
|
+
"purpose": "any"
|
|
35
|
+
},
|
|
36
|
+
{
|
|
37
|
+
"src": "/static/icons/icon-152.png",
|
|
38
|
+
"sizes": "152x152",
|
|
39
|
+
"type": "image/png",
|
|
40
|
+
"purpose": "any"
|
|
41
|
+
},
|
|
42
|
+
{
|
|
43
|
+
"src": "/static/icons/icon-192.png",
|
|
44
|
+
"sizes": "192x192",
|
|
45
|
+
"type": "image/png",
|
|
46
|
+
"purpose": "any maskable"
|
|
47
|
+
},
|
|
48
|
+
{
|
|
49
|
+
"src": "/static/icons/icon-384.png",
|
|
50
|
+
"sizes": "384x384",
|
|
51
|
+
"type": "image/png",
|
|
52
|
+
"purpose": "any"
|
|
53
|
+
},
|
|
54
|
+
{
|
|
55
|
+
"src": "/static/icons/icon-512.png",
|
|
56
|
+
"sizes": "512x512",
|
|
57
|
+
"type": "image/png",
|
|
58
|
+
"purpose": "any maskable"
|
|
59
|
+
}
|
|
60
|
+
],
|
|
61
|
+
"categories": ["developer", "productivity", "utilities"],
|
|
62
|
+
"shortcuts": [
|
|
63
|
+
{
|
|
64
|
+
"name": "New Session",
|
|
65
|
+
"short_name": "New",
|
|
66
|
+
"description": "Start a new pAInapple Code session",
|
|
67
|
+
"url": "/app?new=true",
|
|
68
|
+
"icons": [{"src": "/static/icons/icon-96.png", "sizes": "96x96"}]
|
|
69
|
+
}
|
|
70
|
+
],
|
|
71
|
+
"related_applications": [],
|
|
72
|
+
"prefer_related_applications": false
|
|
73
|
+
}
|
|
@@ -0,0 +1,293 @@
|
|
|
1
|
+
/**
|
|
2
|
+
* Service Worker for pAInapple Code PWA
|
|
3
|
+
*
|
|
4
|
+
* Caching strategy:
|
|
5
|
+
* - Precache: App shell (HTML, critical CSS/JS)
|
|
6
|
+
* - Cache-first: Static assets (icons, fonts)
|
|
7
|
+
* - Network-first: HTML pages (for fresh content)
|
|
8
|
+
* - Network-only: API calls, WebSocket
|
|
9
|
+
*/
|
|
10
|
+
|
|
11
|
+
// Version is injected by server based on file mtimes (no manual bumping needed).
|
|
12
|
+
// Prefix bumped to `auth` to force full cache eviction on the auth rollout.
|
|
13
|
+
const CACHE_NAME = 'claude-code-auth-v__CACHE_VERSION__';
|
|
14
|
+
const STATIC_CACHE = 'claude-code-auth-static-v__CACHE_VERSION__';
|
|
15
|
+
|
|
16
|
+
// Assets to precache (app shell).
|
|
17
|
+
//
|
|
18
|
+
// The versioned entries must carry the SAME ?v= the page requests them with,
|
|
19
|
+
// for two reasons: an unversioned URL is served `no-store`, so precaching one
|
|
20
|
+
// downloaded a second, uncacheable copy of each module on every load; and
|
|
21
|
+
// `caches.match()` keys on the full URL, so a bare entry never matched the
|
|
22
|
+
// page's versioned request and the precache did nothing for JS/CSS.
|
|
23
|
+
// Injected by the server: already version-stamped, and listing the single
|
|
24
|
+
// bundle instead of the loose modules when this install ships one.
|
|
25
|
+
const PRECACHE_ASSETS = __PRECACHE_ASSETS__;
|
|
26
|
+
|
|
27
|
+
// Install event - precache assets
|
|
28
|
+
self.addEventListener('install', (event) => {
|
|
29
|
+
console.log('[SW] Installing service worker...');
|
|
30
|
+
|
|
31
|
+
event.waitUntil(
|
|
32
|
+
caches.open(CACHE_NAME)
|
|
33
|
+
.then((cache) => {
|
|
34
|
+
console.log('[SW] Precaching app shell');
|
|
35
|
+
return cache.addAll(PRECACHE_ASSETS);
|
|
36
|
+
})
|
|
37
|
+
.then(() => {
|
|
38
|
+
console.log('[SW] Precaching complete');
|
|
39
|
+
return self.skipWaiting();
|
|
40
|
+
})
|
|
41
|
+
.catch((err) => {
|
|
42
|
+
console.error('[SW] Precaching failed:', err);
|
|
43
|
+
})
|
|
44
|
+
);
|
|
45
|
+
});
|
|
46
|
+
|
|
47
|
+
// Activate event - clean old caches
|
|
48
|
+
self.addEventListener('activate', (event) => {
|
|
49
|
+
console.log('[SW] Activating service worker...');
|
|
50
|
+
|
|
51
|
+
event.waitUntil(
|
|
52
|
+
caches.keys()
|
|
53
|
+
.then((cacheNames) => {
|
|
54
|
+
return Promise.all(
|
|
55
|
+
cacheNames
|
|
56
|
+
.filter((name) => name !== CACHE_NAME && name !== STATIC_CACHE)
|
|
57
|
+
.map((name) => {
|
|
58
|
+
console.log('[SW] Deleting old cache:', name);
|
|
59
|
+
return caches.delete(name);
|
|
60
|
+
})
|
|
61
|
+
);
|
|
62
|
+
})
|
|
63
|
+
.then(() => {
|
|
64
|
+
console.log('[SW] Claiming clients');
|
|
65
|
+
return self.clients.claim();
|
|
66
|
+
})
|
|
67
|
+
);
|
|
68
|
+
});
|
|
69
|
+
|
|
70
|
+
// Fetch event - serve from cache or network
|
|
71
|
+
self.addEventListener('fetch', (event) => {
|
|
72
|
+
const url = new URL(event.request.url);
|
|
73
|
+
|
|
74
|
+
// Skip non-GET requests
|
|
75
|
+
if (event.request.method !== 'GET') {
|
|
76
|
+
return;
|
|
77
|
+
}
|
|
78
|
+
|
|
79
|
+
// Skip WebSocket requests
|
|
80
|
+
if (url.protocol === 'ws:' || url.protocol === 'wss:') {
|
|
81
|
+
return;
|
|
82
|
+
}
|
|
83
|
+
|
|
84
|
+
// Skip API requests (always go to network)
|
|
85
|
+
if (url.pathname.startsWith('/api/') || url.pathname === '/chat') {
|
|
86
|
+
return;
|
|
87
|
+
}
|
|
88
|
+
|
|
89
|
+
// Skip chrome-extension and other non-http(s) requests
|
|
90
|
+
if (!url.protocol.startsWith('http')) {
|
|
91
|
+
return;
|
|
92
|
+
}
|
|
93
|
+
|
|
94
|
+
// Skip cross-origin — browser HTTP cache handles third-party CDNs natively.
|
|
95
|
+
// Intercepting cross-origin module imports has historically caused Safari
|
|
96
|
+
// to mis-cache or reject responses, surfacing as a fake 503 from our
|
|
97
|
+
// catch handler and a `TypeError: Importing a module script failed`.
|
|
98
|
+
// (All third-party libs are now vendored under /static/vendor/, so the app
|
|
99
|
+
// itself no longer loads anything cross-origin; this guard stays defensive.)
|
|
100
|
+
if (url.origin !== self.location.origin) {
|
|
101
|
+
return;
|
|
102
|
+
}
|
|
103
|
+
|
|
104
|
+
// For JS/CSS files - network first (server adds cache-bust params)
|
|
105
|
+
if (url.pathname.match(/\/static\/.*\.(js|css)$/)) {
|
|
106
|
+
event.respondWith(networkFirst(event.request));
|
|
107
|
+
return;
|
|
108
|
+
}
|
|
109
|
+
|
|
110
|
+
// For other static assets (icons, images) - cache first
|
|
111
|
+
if (url.pathname.startsWith('/static/')) {
|
|
112
|
+
event.respondWith(cacheFirst(event.request));
|
|
113
|
+
return;
|
|
114
|
+
}
|
|
115
|
+
|
|
116
|
+
// App shell and PWA chrome - network first with cache fallback
|
|
117
|
+
if (isCacheablePage(url)) {
|
|
118
|
+
event.respondWith(networkFirst(event.request));
|
|
119
|
+
return;
|
|
120
|
+
}
|
|
121
|
+
|
|
122
|
+
// EVERYTHING ELSE GOES TO THE NETWORK AND IS NEVER STORED.
|
|
123
|
+
//
|
|
124
|
+
// This used to be `event.respondWith(networkFirst(...))` — a default that
|
|
125
|
+
// writes every 2xx to disk. `/view` serves raw project file content and is
|
|
126
|
+
// not under `/api/`, so it fell through and landed in the offline cache,
|
|
127
|
+
// where it outlives the session and is readable by anyone holding the
|
|
128
|
+
// device. That is exactly what WP-12 asks not to happen ("offline cache
|
|
129
|
+
// inspection contains no user/project content").
|
|
130
|
+
//
|
|
131
|
+
// Adding `/view` to the skip list above would have fixed today's leak and
|
|
132
|
+
// left the shape intact: with a default-allow, every route added later is
|
|
133
|
+
// cached unless someone remembers to exclude it, and nothing fails loudly
|
|
134
|
+
// when they don't. Inverted, a new route is uncached until it is
|
|
135
|
+
// deliberately listed as cacheable — the failure mode becomes "missing from
|
|
136
|
+
// the offline cache", which is visible, rather than "silently persisted".
|
|
137
|
+
});
|
|
138
|
+
|
|
139
|
+
// The complete set of non-/static/ paths allowed into the offline cache.
|
|
140
|
+
// Everything here is app chrome: HTML shells, the manifest and instance icons.
|
|
141
|
+
// None of it carries user or project content. `/view` is deliberately absent
|
|
142
|
+
// (project file content), as are `/health`, `/login` and `/sw.js` — none is
|
|
143
|
+
// useful offline and the last two should never be served stale.
|
|
144
|
+
const CACHEABLE_PAGES = new Set(['/', '/app', '/sessions', '/triage', '/manifest.json']);
|
|
145
|
+
|
|
146
|
+
function isCacheablePage(url) {
|
|
147
|
+
return CACHEABLE_PAGES.has(url.pathname) || url.pathname.startsWith('/instance-icons/');
|
|
148
|
+
}
|
|
149
|
+
|
|
150
|
+
/**
|
|
151
|
+
* Cache-first strategy
|
|
152
|
+
* Try cache, fall back to network (and update cache)
|
|
153
|
+
*/
|
|
154
|
+
async function cacheFirst(request) {
|
|
155
|
+
const cached = await caches.match(request);
|
|
156
|
+
if (cached) {
|
|
157
|
+
// Return cached version and update cache in background
|
|
158
|
+
updateCache(request);
|
|
159
|
+
return cached;
|
|
160
|
+
}
|
|
161
|
+
|
|
162
|
+
try {
|
|
163
|
+
const response = await fetch(request);
|
|
164
|
+
// Only cache 2xx and not redirects — redirect responses follow to the
|
|
165
|
+
// auth login page, which we don't want pinned to the requested URL.
|
|
166
|
+
if (response.ok && !response.redirected) {
|
|
167
|
+
const cache = await caches.open(STATIC_CACHE);
|
|
168
|
+
cache.put(request, response.clone());
|
|
169
|
+
}
|
|
170
|
+
return response;
|
|
171
|
+
} catch (err) {
|
|
172
|
+
console.error('[SW] Cache-first fetch failed:', err);
|
|
173
|
+
return new Response('Offline', { status: 503 });
|
|
174
|
+
}
|
|
175
|
+
}
|
|
176
|
+
|
|
177
|
+
/**
|
|
178
|
+
* Network-first strategy
|
|
179
|
+
* Try network, fall back to cache
|
|
180
|
+
*/
|
|
181
|
+
async function networkFirst(request) {
|
|
182
|
+
try {
|
|
183
|
+
const response = await fetch(request);
|
|
184
|
+
// Only cache 2xx and not redirects — an auth-redirected response would
|
|
185
|
+
// otherwise pin the login page under the original URL.
|
|
186
|
+
if (response.ok && !response.redirected) {
|
|
187
|
+
const cache = await caches.open(CACHE_NAME);
|
|
188
|
+
cache.put(request, response.clone());
|
|
189
|
+
}
|
|
190
|
+
return response;
|
|
191
|
+
} catch (err) {
|
|
192
|
+
console.log('[SW] Network failed, trying cache:', request.url);
|
|
193
|
+
const cached = await caches.match(request);
|
|
194
|
+
if (cached) {
|
|
195
|
+
return cached;
|
|
196
|
+
}
|
|
197
|
+
|
|
198
|
+
// Return offline page for HTML requests
|
|
199
|
+
if (request.headers.get('accept')?.includes('text/html')) {
|
|
200
|
+
return caches.match('/app') || new Response(offlineHTML(), {
|
|
201
|
+
headers: { 'Content-Type': 'text/html' }
|
|
202
|
+
});
|
|
203
|
+
}
|
|
204
|
+
|
|
205
|
+
// For everything else (JS modules, CSS, JSON, etc.), surface a real network
|
|
206
|
+
// error rather than a synthetic 503 — a fake 503 with a text body makes
|
|
207
|
+
// module imports fail with the misleading "Importing a module script failed".
|
|
208
|
+
return Response.error();
|
|
209
|
+
}
|
|
210
|
+
}
|
|
211
|
+
|
|
212
|
+
/**
|
|
213
|
+
* Update cache in background
|
|
214
|
+
*/
|
|
215
|
+
async function updateCache(request) {
|
|
216
|
+
try {
|
|
217
|
+
const response = await fetch(request);
|
|
218
|
+
if (response.ok && !response.redirected) {
|
|
219
|
+
const cache = await caches.open(STATIC_CACHE);
|
|
220
|
+
await cache.put(request, response);
|
|
221
|
+
}
|
|
222
|
+
} catch (err) {
|
|
223
|
+
// Ignore - just a background update
|
|
224
|
+
}
|
|
225
|
+
}
|
|
226
|
+
|
|
227
|
+
/**
|
|
228
|
+
* Offline HTML fallback
|
|
229
|
+
*/
|
|
230
|
+
function offlineHTML() {
|
|
231
|
+
return `<!DOCTYPE html>
|
|
232
|
+
<html lang="en">
|
|
233
|
+
<head>
|
|
234
|
+
<meta charset="UTF-8">
|
|
235
|
+
<meta name="viewport" content="width=device-width, initial-scale=1.0">
|
|
236
|
+
<title>pAInapple Code - Offline</title>
|
|
237
|
+
<style>
|
|
238
|
+
* { box-sizing: border-box; margin: 0; padding: 0; }
|
|
239
|
+
body {
|
|
240
|
+
font-family: -apple-system, BlinkMacSystemFont, 'Segoe UI', Roboto, sans-serif;
|
|
241
|
+
background: #1a1a2e;
|
|
242
|
+
color: #e0e0e0;
|
|
243
|
+
min-height: 100vh;
|
|
244
|
+
display: flex;
|
|
245
|
+
align-items: center;
|
|
246
|
+
justify-content: center;
|
|
247
|
+
padding: 20px;
|
|
248
|
+
}
|
|
249
|
+
.offline-container {
|
|
250
|
+
text-align: center;
|
|
251
|
+
max-width: 400px;
|
|
252
|
+
}
|
|
253
|
+
.offline-icon {
|
|
254
|
+
font-size: 64px;
|
|
255
|
+
margin-bottom: 20px;
|
|
256
|
+
}
|
|
257
|
+
h1 { font-size: 24px; margin-bottom: 12px; }
|
|
258
|
+
p { color: #a0a0a0; margin-bottom: 20px; line-height: 1.5; }
|
|
259
|
+
button {
|
|
260
|
+
background: #4a9eff;
|
|
261
|
+
color: white;
|
|
262
|
+
border: none;
|
|
263
|
+
padding: 12px 24px;
|
|
264
|
+
border-radius: 8px;
|
|
265
|
+
font-size: 16px;
|
|
266
|
+
cursor: pointer;
|
|
267
|
+
}
|
|
268
|
+
button:hover { background: #3a8eef; }
|
|
269
|
+
</style>
|
|
270
|
+
</head>
|
|
271
|
+
<body>
|
|
272
|
+
<div class="offline-container">
|
|
273
|
+
<div class="offline-icon">📡</div>
|
|
274
|
+
<h1>You're Offline</h1>
|
|
275
|
+
<p>pAInapple Code requires an internet connection to communicate with the server.</p>
|
|
276
|
+
<button onclick="location.reload()">Try Again</button>
|
|
277
|
+
</div>
|
|
278
|
+
</body>
|
|
279
|
+
</html>`;
|
|
280
|
+
}
|
|
281
|
+
|
|
282
|
+
// Handle messages from clients
|
|
283
|
+
self.addEventListener('message', (event) => {
|
|
284
|
+
if (event.data === 'skipWaiting') {
|
|
285
|
+
self.skipWaiting();
|
|
286
|
+
}
|
|
287
|
+
|
|
288
|
+
if (event.data === 'clearCache') {
|
|
289
|
+
caches.keys().then((names) => {
|
|
290
|
+
names.forEach((name) => caches.delete(name));
|
|
291
|
+
});
|
|
292
|
+
}
|
|
293
|
+
});
|