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,218 @@
|
|
|
1
|
+
/**
|
|
2
|
+
* Configuration constants and command registry
|
|
3
|
+
*/
|
|
4
|
+
|
|
5
|
+
// Debug mode: enabled via ?debug=true URL param or localStorage
|
|
6
|
+
const debugParam = new URLSearchParams(window.location.search).get('debug');
|
|
7
|
+
const DEBUG = debugParam === 'true' || localStorage.getItem('debug') === 'true';
|
|
8
|
+
|
|
9
|
+
// Server identity — set on /api/info fetch + first WebSocket connect.
|
|
10
|
+
// `serverHome` is the OS user home (e.g. /home/app inside Docker, /home/me on
|
|
11
|
+
// a host install) — only meaningful for ~ expansion.
|
|
12
|
+
// `serverWorkspace` is the server's --workspace value (e.g. /workspace/myproj
|
|
13
|
+
// inside Docker, /home/me/dev/myproj on host) — used as the project base for
|
|
14
|
+
// the file explorer, autocomplete, and relative path resolution.
|
|
15
|
+
let serverHome = null;
|
|
16
|
+
let serverWorkspace = null;
|
|
17
|
+
|
|
18
|
+
// Version identity, shown in the help dialog's About section.
|
|
19
|
+
// `serverVersion` / `serverStaticBuild` come from /api/info.
|
|
20
|
+
let serverVersion = null;
|
|
21
|
+
let serverStaticBuild = null;
|
|
22
|
+
// Set when the checkout has moved on since the server booted — the process is
|
|
23
|
+
// serving older code than what's on disk, so it needs a restart (not a reload).
|
|
24
|
+
let serverDiskVersion = null;
|
|
25
|
+
let serverRestartNeeded = false;
|
|
26
|
+
// How the frontend is delivered: one bundle or ~190 loose modules. Whether a
|
|
27
|
+
// source install got the bundle depends on Node being present at install time,
|
|
28
|
+
// which is invisible from the page — so the About panel says which it is.
|
|
29
|
+
// null (not false) until /api/info answers, and on servers too old to report.
|
|
30
|
+
let serverBundled = null;
|
|
31
|
+
let serverBundleReason = null;
|
|
32
|
+
// License expression + project URLs from the installed distribution, shown in
|
|
33
|
+
// the About widget. Server-supplied so a fork advertises its own source.
|
|
34
|
+
let serverLicense = null;
|
|
35
|
+
let serverUrls = {};
|
|
36
|
+
let serverAuthor = null;
|
|
37
|
+
|
|
38
|
+
// The frontend build THIS page actually loaded: /app rewrites every asset URL
|
|
39
|
+
// with `?v=<newest static mtime>`, so our own module URL carries it. Reading it
|
|
40
|
+
// here (rather than asking the server) is what makes a stale-page check
|
|
41
|
+
// meaningful — the server's current mtime moves the moment a file is edited,
|
|
42
|
+
// while this stays pinned to whatever the browser cached.
|
|
43
|
+
export const CLIENT_BUILD = (() => {
|
|
44
|
+
try {
|
|
45
|
+
return new URL(import.meta.url).searchParams.get('v');
|
|
46
|
+
} catch {
|
|
47
|
+
return null;
|
|
48
|
+
}
|
|
49
|
+
})();
|
|
50
|
+
|
|
51
|
+
// Default system settings
|
|
52
|
+
const DEFAULTS = {
|
|
53
|
+
SESSION_LIST_LIMIT: 100,
|
|
54
|
+
};
|
|
55
|
+
|
|
56
|
+
// User config storage key (shared with config-panel.js)
|
|
57
|
+
const CONFIG_STORAGE_KEY = 'claude-code-user-config';
|
|
58
|
+
|
|
59
|
+
// NOTE: there is deliberately no cap on concurrent session tabs. The old
|
|
60
|
+
// CONFIG.MAX_SESSIONS (default 10, user-settable 1-20) refused createSession()
|
|
61
|
+
// once the strip was full; nothing about the client actually breaks past that
|
|
62
|
+
// number, so the guard was pure friction. The legacy `maxSessions` key may
|
|
63
|
+
// still sit in localStorage on old profiles — it is simply ignored.
|
|
64
|
+
|
|
65
|
+
// Load session list limit from user config
|
|
66
|
+
function getSessionListLimit() {
|
|
67
|
+
try {
|
|
68
|
+
const saved = localStorage.getItem(CONFIG_STORAGE_KEY);
|
|
69
|
+
if (saved) {
|
|
70
|
+
const config = JSON.parse(saved);
|
|
71
|
+
if (config.sessionListLimit && Number.isInteger(config.sessionListLimit) && config.sessionListLimit >= 10 && config.sessionListLimit <= 500) {
|
|
72
|
+
return config.sessionListLimit;
|
|
73
|
+
}
|
|
74
|
+
}
|
|
75
|
+
} catch (e) {
|
|
76
|
+
console.error('Failed to load sessionListLimit from config:', e);
|
|
77
|
+
}
|
|
78
|
+
return DEFAULTS.SESSION_LIST_LIMIT;
|
|
79
|
+
}
|
|
80
|
+
|
|
81
|
+
// Determine protocol based on page protocol (http vs https)
|
|
82
|
+
const isSecure = window.location.protocol === 'https:';
|
|
83
|
+
const wsProtocol = isSecure ? 'wss:' : 'ws:';
|
|
84
|
+
const httpProtocol = isSecure ? 'https:' : 'http:';
|
|
85
|
+
|
|
86
|
+
export const CONFIG = {
|
|
87
|
+
DEBUG,
|
|
88
|
+
get SESSION_LIST_LIMIT() { return getSessionListLimit(); },
|
|
89
|
+
DEFAULT_SESSION_LIST_LIMIT: DEFAULTS.SESSION_LIST_LIMIT,
|
|
90
|
+
WS_URL: `${wsProtocol}//${window.location.host}/chat`,
|
|
91
|
+
API_BASE: `${httpProtocol}//${window.location.host}`,
|
|
92
|
+
RECONNECT_DELAYS: [1000, 2000, 4000, 8000, 16000, 30000],
|
|
93
|
+
STORAGE_KEY: 'claude-code-sessions',
|
|
94
|
+
ACTIVE_SESSION_KEY: 'claude-code-active-session',
|
|
95
|
+
ACTIVE_MODE_KEY: 'claude-code-active-mode',
|
|
96
|
+
WIDGET_TABS_KEY: 'claude-code-widget-tabs',
|
|
97
|
+
TAB_ORDER_KEY: 'claude-code-tab-order',
|
|
98
|
+
HISTORY_KEY: 'claude-code-history',
|
|
99
|
+
MAX_OUTPUT_LENGTH: 3000,
|
|
100
|
+
MAX_HISTORY: 10,
|
|
101
|
+
// Dynamic getters for paths that depend on server home / workspace.
|
|
102
|
+
// HOME = OS user home (~ semantics). PROJECTS_BASE = where to anchor the
|
|
103
|
+
// file explorer and resolve relative paths — prefer the explicit
|
|
104
|
+
// --workspace value, fall back to ~/dev for host installs.
|
|
105
|
+
get HOME() { return serverHome || '/home'; },
|
|
106
|
+
get WORKSPACE() { return serverWorkspace || serverHome || '/home'; },
|
|
107
|
+
get PROJECTS_BASE() {
|
|
108
|
+
if (serverWorkspace) return serverWorkspace;
|
|
109
|
+
return serverHome ? `${serverHome}/dev` : '/home';
|
|
110
|
+
},
|
|
111
|
+
};
|
|
112
|
+
|
|
113
|
+
// Instance identity (injected by server via --instance-name / --accent CLI flags)
|
|
114
|
+
export const INSTANCE = window.INSTANCE_CONFIG || null;
|
|
115
|
+
|
|
116
|
+
// Called when server sends home path in connected message
|
|
117
|
+
export function setServerHome(home) {
|
|
118
|
+
if (home && !serverHome) {
|
|
119
|
+
serverHome = home;
|
|
120
|
+
debug.log('Server home set:', home);
|
|
121
|
+
}
|
|
122
|
+
}
|
|
123
|
+
|
|
124
|
+
// Called when server sends --workspace value (in /api/info and the WS
|
|
125
|
+
// `connected` message). This is what powers the file explorer's anchor
|
|
126
|
+
// and CONFIG.PROJECTS_BASE; setting it once is enough since the server
|
|
127
|
+
// can't change --workspace at runtime.
|
|
128
|
+
export function setServerWorkspace(workspace) {
|
|
129
|
+
if (workspace && !serverWorkspace) {
|
|
130
|
+
serverWorkspace = workspace;
|
|
131
|
+
debug.log('Server workspace set:', workspace);
|
|
132
|
+
}
|
|
133
|
+
}
|
|
134
|
+
|
|
135
|
+
// Called with the /api/info payload. Unlike home/workspace these are allowed
|
|
136
|
+
// to be re-set: a reconnect after a server upgrade should report the new
|
|
137
|
+
// version rather than the one this tab booted against.
|
|
138
|
+
export function setServerVersionInfo({ version, staticBuild, bundled, bundleReason, diskVersion, restartNeeded, license, urls, author } = {}) {
|
|
139
|
+
if (version) serverVersion = version;
|
|
140
|
+
if (staticBuild) serverStaticBuild = String(staticBuild);
|
|
141
|
+
// Explicit undefined check: `false` is the interesting value here, and a
|
|
142
|
+
// truthiness guard would discard exactly the case worth reporting.
|
|
143
|
+
if (bundled !== undefined && bundled !== null) serverBundled = Boolean(bundled);
|
|
144
|
+
if (bundleReason !== undefined) serverBundleReason = bundleReason || null;
|
|
145
|
+
serverDiskVersion = diskVersion || null;
|
|
146
|
+
serverRestartNeeded = Boolean(restartNeeded);
|
|
147
|
+
if (license) serverLicense = license;
|
|
148
|
+
if (urls && typeof urls === 'object' && Object.keys(urls).length) serverUrls = urls;
|
|
149
|
+
if (author) serverAuthor = author;
|
|
150
|
+
}
|
|
151
|
+
|
|
152
|
+
/**
|
|
153
|
+
* Version identity for the About section.
|
|
154
|
+
* `stale` is true when the server has newer static assets than this page
|
|
155
|
+
* loaded — i.e. a reload would pick up frontend changes.
|
|
156
|
+
*/
|
|
157
|
+
export function getVersionInfo() {
|
|
158
|
+
return {
|
|
159
|
+
server: serverVersion,
|
|
160
|
+
clientBuild: CLIENT_BUILD,
|
|
161
|
+
serverBuild: serverStaticBuild,
|
|
162
|
+
stale: Boolean(
|
|
163
|
+
CLIENT_BUILD && serverStaticBuild && CLIENT_BUILD !== serverStaticBuild
|
|
164
|
+
),
|
|
165
|
+
bundled: serverBundled,
|
|
166
|
+
bundleReason: serverBundleReason,
|
|
167
|
+
diskVersion: serverDiskVersion,
|
|
168
|
+
restartNeeded: serverRestartNeeded,
|
|
169
|
+
license: serverLicense,
|
|
170
|
+
urls: serverUrls,
|
|
171
|
+
author: serverAuthor,
|
|
172
|
+
};
|
|
173
|
+
}
|
|
174
|
+
|
|
175
|
+
/**
|
|
176
|
+
* Debug logger - only logs when CONFIG.DEBUG is true
|
|
177
|
+
* Usage: debug.log('message'), debug.warn('warning')
|
|
178
|
+
*/
|
|
179
|
+
export const debug = {
|
|
180
|
+
log: (...args) => DEBUG && console.log('[DEBUG]', ...args),
|
|
181
|
+
warn: (...args) => DEBUG && console.warn('[DEBUG]', ...args),
|
|
182
|
+
info: (...args) => DEBUG && console.info('[DEBUG]', ...args),
|
|
183
|
+
};
|
|
184
|
+
|
|
185
|
+
// Detect if device likely has a physical keyboard
|
|
186
|
+
// iPhone = touch-only, everything else (iPad/desktop) likely has keyboard
|
|
187
|
+
export const HAS_PHYSICAL_KEYBOARD = !/iPhone/.test(navigator.userAgent);
|
|
188
|
+
|
|
189
|
+
export const COMMANDS = [
|
|
190
|
+
{ cmd: '/help', desc: 'Show help and keyboard shortcuts', action: 'showHelp' },
|
|
191
|
+
{ cmd: '/clear', desc: 'Archive session, start fresh in same project', action: 'clearMessages' },
|
|
192
|
+
{ cmd: '/compact', desc: 'Ask Claude to summarize conversation', action: 'compactSession', hasArgs: true },
|
|
193
|
+
{ cmd: '/new', desc: 'Create a new session', action: 'createSession' },
|
|
194
|
+
{ cmd: '/fork', desc: 'Fork session (branch conversation)', action: 'forkSession' },
|
|
195
|
+
{ cmd: '/fork-compact', desc: 'Fork session then compact (branch + summarize)', action: 'forkCompactSession', hasArgs: true },
|
|
196
|
+
{ cmd: '/clone', desc: 'Clone session (same project, fresh chat). Add text to send immediately.', action: 'cloneSession', hasArgs: true },
|
|
197
|
+
{ cmd: '/plan', desc: 'Enter plan mode (explore & design before coding)', action: 'planMode', hasArgs: true },
|
|
198
|
+
{ cmd: '/btw', desc: 'Side question — fork a quick discussion thread (no selection needed)', action: 'btwDiscussion', hasArgs: true },
|
|
199
|
+
{ cmd: '/login', desc: 'Sign in to Anthropic — opens an interactive terminal', action: 'openLoginTerminal' },
|
|
200
|
+
{ cmd: '/logout', desc: 'Sign out of Anthropic — opens an interactive terminal', action: 'openLogoutTerminal' },
|
|
201
|
+
];
|
|
202
|
+
|
|
203
|
+
// Default shell commands for autocomplete (loaded from localStorage if available)
|
|
204
|
+
export function getRecentShellCommands() {
|
|
205
|
+
try {
|
|
206
|
+
const saved = localStorage.getItem('recent-shell');
|
|
207
|
+
if (saved) {
|
|
208
|
+
return JSON.parse(saved);
|
|
209
|
+
}
|
|
210
|
+
} catch {}
|
|
211
|
+
return [
|
|
212
|
+
'git status',
|
|
213
|
+
'git diff',
|
|
214
|
+
'ls -la',
|
|
215
|
+
'npm test',
|
|
216
|
+
'npm run build',
|
|
217
|
+
];
|
|
218
|
+
}
|