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.
Files changed (436) hide show
  1. painapple_code/__init__.py +30 -0
  2. painapple_code/__main__.py +18 -0
  3. painapple_code/_version.py +24 -0
  4. painapple_code/auth_middleware.py +930 -0
  5. painapple_code/cli/__init__.py +204 -0
  6. painapple_code/cli/deploy/__init__.py +15 -0
  7. painapple_code/cli/deploy/claude_seed.py +41 -0
  8. painapple_code/cli/deploy/config.py +260 -0
  9. painapple_code/cli/deploy/container.py +715 -0
  10. painapple_code/cli/deploy/launch.py +163 -0
  11. painapple_code/cli/deploy/runtime.py +223 -0
  12. painapple_code/cli/lifecycle_cmd.py +443 -0
  13. painapple_code/cli/list_cmd.py +572 -0
  14. painapple_code/cli/manage_cmd.py +670 -0
  15. painapple_code/cli/netinfo.py +125 -0
  16. painapple_code/cli/profiles.py +390 -0
  17. painapple_code/cli/serve_args.py +163 -0
  18. painapple_code/cli/serve_config.py +256 -0
  19. painapple_code/cli/setup_cmd.py +664 -0
  20. painapple_code/cli/ui.py +438 -0
  21. painapple_code/cost_analytics.py +879 -0
  22. painapple_code/data/models.defaults.yaml +18 -0
  23. painapple_code/data/models.yaml +18 -0
  24. painapple_code/data/presets.defaults.json +32 -0
  25. painapple_code/data/strings.yaml +2269 -0
  26. painapple_code/helpers.py +406 -0
  27. painapple_code/paths.py +1514 -0
  28. painapple_code/prompt_explorer.py +984 -0
  29. painapple_code/providers/__init__.py +224 -0
  30. painapple_code/providers/base.py +710 -0
  31. painapple_code/providers/claude/__init__.py +74 -0
  32. painapple_code/providers/claude/capabilities.py +218 -0
  33. painapple_code/providers/claude/errors.py +79 -0
  34. painapple_code/providers/claude/launch.py +50 -0
  35. painapple_code/providers/claude/summary.py +89 -0
  36. painapple_code/providers/claude/translate.py +74 -0
  37. painapple_code/providers/claude_sdk/__init__.py +139 -0
  38. painapple_code/providers/claude_sdk/driver.py +412 -0
  39. painapple_code/providers/codex/__init__.py +87 -0
  40. painapple_code/providers/codex/capabilities.py +321 -0
  41. painapple_code/providers/codex/errors.py +70 -0
  42. painapple_code/providers/codex/launch.py +142 -0
  43. painapple_code/providers/codex/summary.py +196 -0
  44. painapple_code/providers/codex/translate.py +204 -0
  45. painapple_code/providers/codex_app_server/__init__.py +100 -0
  46. painapple_code/providers/codex_app_server/capabilities.py +41 -0
  47. painapple_code/providers/codex_app_server/launch.py +202 -0
  48. painapple_code/providers/codex_app_server/summary.py +291 -0
  49. painapple_code/providers/codex_app_server/translate.py +263 -0
  50. painapple_code/providers/codex_app_server/transport.py +238 -0
  51. painapple_code/routes/__init__.py +0 -0
  52. painapple_code/routes/api_agents.py +441 -0
  53. painapple_code/routes/api_app.py +368 -0
  54. painapple_code/routes/api_app_commit_sections.py +127 -0
  55. painapple_code/routes/api_app_config.py +997 -0
  56. painapple_code/routes/api_app_session_prefs.py +217 -0
  57. painapple_code/routes/api_browser.py +690 -0
  58. painapple_code/routes/api_commands.py +374 -0
  59. painapple_code/routes/api_costs.py +128 -0
  60. painapple_code/routes/api_drafts.py +139 -0
  61. painapple_code/routes/api_exec.py +149 -0
  62. painapple_code/routes/api_files.py +542 -0
  63. painapple_code/routes/api_git.py +657 -0
  64. painapple_code/routes/api_logs.py +649 -0
  65. painapple_code/routes/api_plugins.py +275 -0
  66. painapple_code/routes/api_project_config.py +418 -0
  67. painapple_code/routes/api_prompts.py +231 -0
  68. painapple_code/routes/api_providers.py +53 -0
  69. painapple_code/routes/api_search.py +411 -0
  70. painapple_code/routes/api_session_stash.py +234 -0
  71. painapple_code/routes/api_session_welcome.py +151 -0
  72. painapple_code/routes/api_sessions.py +742 -0
  73. painapple_code/routes/api_shadow.py +323 -0
  74. painapple_code/routes/api_shadow_db.py +512 -0
  75. painapple_code/routes/api_shadow_files.py +332 -0
  76. painapple_code/routes/api_shadow_search.py +476 -0
  77. painapple_code/routes/api_skills.py +610 -0
  78. painapple_code/routes/api_tasks.py +147 -0
  79. painapple_code/routes/api_terminal.py +540 -0
  80. painapple_code/routes/api_upload.py +293 -0
  81. painapple_code/routes/api_viewer.py +229 -0
  82. painapple_code/routes/dependencies.py +109 -0
  83. painapple_code/routes/ws_chat.py +837 -0
  84. painapple_code/server.py +2208 -0
  85. painapple_code/server_logging.py +263 -0
  86. painapple_code/services/__init__.py +0 -0
  87. painapple_code/services/agent_session.py +2738 -0
  88. painapple_code/session_store.py +253 -0
  89. painapple_code/session_store_core.py +879 -0
  90. painapple_code/shadow_db.py +830 -0
  91. painapple_code/shadow_db_plans.py +369 -0
  92. painapple_code/shadow_db_queries.py +595 -0
  93. painapple_code/shadow_db_schema.py +676 -0
  94. painapple_code/shadow_git.py +1296 -0
  95. painapple_code/shadow_git_frontmatter.py +314 -0
  96. painapple_code/shadow_git_sections.py +520 -0
  97. painapple_code/shadow_git_summary.py +462 -0
  98. painapple_code/shadow_parser.py +560 -0
  99. painapple_code/static/css/00-variables.css +276 -0
  100. painapple_code/static/css/01-base.css +245 -0
  101. painapple_code/static/css/02-tooltips.css +36 -0
  102. painapple_code/static/css/09-left-rail.css +448 -0
  103. painapple_code/static/css/10-header.css +777 -0
  104. painapple_code/static/css/11-connection-bar.css +120 -0
  105. painapple_code/static/css/20-messages.css +750 -0
  106. painapple_code/static/css/21-tool-blocks.css +2340 -0
  107. painapple_code/static/css/22-edit-diff.css +619 -0
  108. painapple_code/static/css/23-thinking.css +1584 -0
  109. painapple_code/static/css/24-background-tasks.css +359 -0
  110. painapple_code/static/css/25-context-block.css +252 -0
  111. painapple_code/static/css/26-session-setup.css +144 -0
  112. painapple_code/static/css/30-markdown.css +854 -0
  113. painapple_code/static/css/40-input.css +2418 -0
  114. painapple_code/static/css/41-autocomplete.css +127 -0
  115. painapple_code/static/css/42-activity-strip.css +97 -0
  116. painapple_code/static/css/43-file-autocomplete.css +121 -0
  117. painapple_code/static/css/44-snippets-autocomplete.css +224 -0
  118. painapple_code/static/css/45-selection-bar.css +433 -0
  119. painapple_code/static/css/46-keyboard-bar.css +119 -0
  120. painapple_code/static/css/47-keyboard-longpress.css +116 -0
  121. painapple_code/static/css/47-token-profile.css +106 -0
  122. painapple_code/static/css/50-welcome.css +3095 -0
  123. painapple_code/static/css/51-modals.css +301 -0
  124. painapple_code/static/css/52-utilities.css +77 -0
  125. painapple_code/static/css/53-image-upload.css +456 -0
  126. painapple_code/static/css/54-todo-list.css +102 -0
  127. painapple_code/static/css/55-file-upload.css +113 -0
  128. painapple_code/static/css/56-chat-navigator.css +218 -0
  129. painapple_code/static/css/56-permission-card.css +332 -0
  130. painapple_code/static/css/56-plan-approval.css +204 -0
  131. painapple_code/static/css/56-question-form.css +602 -0
  132. painapple_code/static/css/57-swipe-indicator.css +95 -0
  133. painapple_code/static/css/58-session-families.css +627 -0
  134. painapple_code/static/css/59-about.css +196 -0
  135. painapple_code/static/css/61-log-explorer.css +723 -0
  136. painapple_code/static/css/62-json-tree.css +489 -0
  137. painapple_code/static/css/62-skills-widget.css +650 -0
  138. painapple_code/static/css/63-commands-widget.css +30 -0
  139. painapple_code/static/css/63-plugins-widget.css +174 -0
  140. painapple_code/static/css/63-terminal.css +516 -0
  141. painapple_code/static/css/64-search-files-widget.css +448 -0
  142. painapple_code/static/css/65-snippets-widget.css +426 -0
  143. painapple_code/static/css/66-active-sessions.css +979 -0
  144. painapple_code/static/css/66-agents-widget.css +265 -0
  145. painapple_code/static/css/66-file-explorer-widget.css +855 -0
  146. painapple_code/static/css/66-git-panel.css +791 -0
  147. painapple_code/static/css/66-history-explorer.css +1496 -0
  148. painapple_code/static/css/67-diff-viewer.css +602 -0
  149. painapple_code/static/css/67-editor-view.css +748 -0
  150. painapple_code/static/css/67-file-preview-widget.css +1873 -0
  151. painapple_code/static/css/68-browser-widget.css +337 -0
  152. painapple_code/static/css/68-compare-wizard.css +355 -0
  153. painapple_code/static/css/68-csv-preview.css +106 -0
  154. painapple_code/static/css/68-diff-preview.css +103 -0
  155. painapple_code/static/css/68-helpers-install-widget.css +491 -0
  156. painapple_code/static/css/68-image-annotate.css +346 -0
  157. painapple_code/static/css/68-terminal-view.css +98 -0
  158. painapple_code/static/css/68-uploads-widget.css +229 -0
  159. painapple_code/static/css/69-cost-analytics.css +537 -0
  160. painapple_code/static/css/70-config-panel.css +3736 -0
  161. painapple_code/static/css/70-excalidraw.css +136 -0
  162. painapple_code/static/css/70-prompt-explorer.css +890 -0
  163. painapple_code/static/css/71-chart.css +111 -0
  164. painapple_code/static/css/72-discussion-sidebar.css +678 -0
  165. painapple_code/static/css/74-debug-logs.css +656 -0
  166. painapple_code/static/css/80-open-dialog.css +146 -0
  167. painapple_code/static/css/80-quick-switcher.css +383 -0
  168. painapple_code/static/css/80-widget-system.css +1763 -0
  169. painapple_code/static/css/81-quick-actions.css +1020 -0
  170. painapple_code/static/css/82-context-popover.css +1233 -0
  171. painapple_code/static/css/83-context-menu.css +339 -0
  172. painapple_code/static/css/85-lazy-loading.css +102 -0
  173. painapple_code/static/css/86-zen-mode.css +708 -0
  174. painapple_code/static/css/87-grid-switcher.css +346 -0
  175. painapple_code/static/css/login.css +198 -0
  176. painapple_code/static/dist/app.bundle.js +7177 -0
  177. painapple_code/static/feature-triage.html +446 -0
  178. painapple_code/static/icons/apple-touch-icon.png +0 -0
  179. painapple_code/static/icons/favicon-32.png +0 -0
  180. painapple_code/static/icons/favicon.ico +0 -0
  181. painapple_code/static/icons/icon-128.png +0 -0
  182. painapple_code/static/icons/icon-144.png +0 -0
  183. painapple_code/static/icons/icon-152.png +0 -0
  184. painapple_code/static/icons/icon-180.png +0 -0
  185. painapple_code/static/icons/icon-192.png +0 -0
  186. painapple_code/static/icons/icon-384.png +0 -0
  187. painapple_code/static/icons/icon-512.png +0 -0
  188. painapple_code/static/icons/icon-72.png +0 -0
  189. painapple_code/static/icons/icon-96.png +0 -0
  190. painapple_code/static/js/action-delegate.js +187 -0
  191. painapple_code/static/js/activity-strip.js +193 -0
  192. painapple_code/static/js/app/context-menus.js +619 -0
  193. painapple_code/static/js/app/file-preview.js +163 -0
  194. painapple_code/static/js/app/init-ui.js +574 -0
  195. painapple_code/static/js/app/input-events.js +561 -0
  196. painapple_code/static/js/app/input-resize.js +313 -0
  197. painapple_code/static/js/app/message-actions.js +419 -0
  198. painapple_code/static/js/app/panels.js +210 -0
  199. painapple_code/static/js/app/rendering-delegators.js +246 -0
  200. painapple_code/static/js/app/server-loading.js +365 -0
  201. painapple_code/static/js/app/session-ops.js +287 -0
  202. painapple_code/static/js/app/session-switch.js +443 -0
  203. painapple_code/static/js/app/settings-helpers.js +280 -0
  204. painapple_code/static/js/app/startup-welcome.js +290 -0
  205. painapple_code/static/js/app-context.js +157 -0
  206. painapple_code/static/js/app.js +2134 -0
  207. painapple_code/static/js/auth-fetch.js +46 -0
  208. painapple_code/static/js/background-tasks.js +274 -0
  209. painapple_code/static/js/boot.js +73 -0
  210. painapple_code/static/js/caret-position.js +171 -0
  211. painapple_code/static/js/chat-navigator.js +710 -0
  212. painapple_code/static/js/chat-search.js +323 -0
  213. painapple_code/static/js/command-executor.js +176 -0
  214. painapple_code/static/js/command-store.js +497 -0
  215. painapple_code/static/js/components.js +1414 -0
  216. painapple_code/static/js/config.js +218 -0
  217. painapple_code/static/js/context-menu.js +740 -0
  218. painapple_code/static/js/controllers/chat-controller.js +4252 -0
  219. painapple_code/static/js/controllers/dialog-controller.js +217 -0
  220. painapple_code/static/js/controllers/tab-controller.js +1828 -0
  221. painapple_code/static/js/controllers/thinking-controller.js +915 -0
  222. painapple_code/static/js/diff-utils.js +486 -0
  223. painapple_code/static/js/drafts-pill.js +95 -0
  224. painapple_code/static/js/editor-view.js +815 -0
  225. painapple_code/static/js/effort-settings.js +430 -0
  226. painapple_code/static/js/feature-triage.js +811 -0
  227. painapple_code/static/js/file-autocomplete.js +516 -0
  228. painapple_code/static/js/file-tabs.js +123 -0
  229. painapple_code/static/js/gestures.js +448 -0
  230. painapple_code/static/js/grid-switcher.js +334 -0
  231. painapple_code/static/js/input-handler.js +1472 -0
  232. painapple_code/static/js/keyboard-bar.js +495 -0
  233. painapple_code/static/js/layout-switcher.js +109 -0
  234. painapple_code/static/js/linkify-utils.js +200 -0
  235. painapple_code/static/js/login.js +141 -0
  236. painapple_code/static/js/open-dialog.js +879 -0
  237. painapple_code/static/js/orphan-terminals.js +373 -0
  238. painapple_code/static/js/path-utils.js +179 -0
  239. painapple_code/static/js/perf-marks.js +102 -0
  240. painapple_code/static/js/permission-settings.js +475 -0
  241. painapple_code/static/js/pointer-input.js +59 -0
  242. painapple_code/static/js/preview/json-tree-menu.js +226 -0
  243. painapple_code/static/js/preview/json-tree-toolbar.js +291 -0
  244. painapple_code/static/js/preview/json-tree.js +457 -0
  245. painapple_code/static/js/preview/preview-breadcrumb.js +387 -0
  246. painapple_code/static/js/preview/preview-edit.js +367 -0
  247. painapple_code/static/js/preview/preview-events.js +361 -0
  248. painapple_code/static/js/preview/preview-history.js +567 -0
  249. painapple_code/static/js/preview/preview-inline-edit.js +869 -0
  250. painapple_code/static/js/preview/preview-poll.js +108 -0
  251. painapple_code/static/js/preview/preview-render.js +572 -0
  252. painapple_code/static/js/preview/preview-search.js +421 -0
  253. painapple_code/static/js/preview/preview-state.js +256 -0
  254. painapple_code/static/js/preview/preview-utils.js +251 -0
  255. painapple_code/static/js/preview-plugins/chart-plugin.js +22 -0
  256. painapple_code/static/js/preview-plugins/csv-plugin.js +188 -0
  257. painapple_code/static/js/preview-plugins/diff-plugin.js +258 -0
  258. painapple_code/static/js/preview-plugins/excalidraw-plugin.js +25 -0
  259. painapple_code/static/js/preview-plugins/html-plugin.js +104 -0
  260. painapple_code/static/js/preview-plugins/image-plugin.js +20 -0
  261. painapple_code/static/js/preview-plugins/index.js +34 -0
  262. painapple_code/static/js/preview-plugins/json-plugin.js +99 -0
  263. painapple_code/static/js/preview-plugins/jsonl-plugin.js +152 -0
  264. painapple_code/static/js/preview-plugins/markdown-plugin.js +266 -0
  265. painapple_code/static/js/preview-plugins/panzoom-plugin.js +63 -0
  266. painapple_code/static/js/preview-plugins/plugin-helpers.js +282 -0
  267. painapple_code/static/js/project-color-picker.js +110 -0
  268. painapple_code/static/js/project-colors.js +163 -0
  269. painapple_code/static/js/prompt-favorites.js +187 -0
  270. painapple_code/static/js/quick-actions-menu.js +1736 -0
  271. painapple_code/static/js/quick-actions-registry.js +1239 -0
  272. painapple_code/static/js/quick-switcher/controller.js +294 -0
  273. painapple_code/static/js/quick-switcher/fuzzy-scorer.js +123 -0
  274. painapple_code/static/js/quick-switcher/index.js +30 -0
  275. painapple_code/static/js/quick-switcher/providers/base-provider.js +51 -0
  276. painapple_code/static/js/quick-switcher/providers/command-provider.js +56 -0
  277. painapple_code/static/js/quick-switcher/providers/file-provider.js +291 -0
  278. painapple_code/static/js/quick-switcher/providers/panel-provider.js +132 -0
  279. painapple_code/static/js/quick-switcher/providers/project-provider.js +361 -0
  280. painapple_code/static/js/quick-switcher/providers/read-files-provider.js +104 -0
  281. painapple_code/static/js/quick-switcher/providers/skills-provider.js +129 -0
  282. painapple_code/static/js/quick-switcher/registry.js +69 -0
  283. painapple_code/static/js/quick-switcher/ui/item.js +54 -0
  284. painapple_code/static/js/quick-switcher/ui/picker.js +464 -0
  285. painapple_code/static/js/recent-opens.js +40 -0
  286. painapple_code/static/js/scroll-manager.js +530 -0
  287. painapple_code/static/js/scroll-state-machine.js +359 -0
  288. painapple_code/static/js/selection/action-bar.js +793 -0
  289. painapple_code/static/js/selection/index.js +15 -0
  290. painapple_code/static/js/selection/selection-handler.js +877 -0
  291. painapple_code/static/js/selection/state.js +181 -0
  292. painapple_code/static/js/session/agent-progress.js +202 -0
  293. painapple_code/static/js/session/handle-agent-message.js +481 -0
  294. painapple_code/static/js/session/handle-message.js +550 -0
  295. painapple_code/static/js/session/interactive.js +587 -0
  296. painapple_code/static/js/session/message-store.js +271 -0
  297. painapple_code/static/js/session/messages.js +253 -0
  298. painapple_code/static/js/session/persistence.js +179 -0
  299. painapple_code/static/js/session/restore.js +136 -0
  300. painapple_code/static/js/session/sync.js +333 -0
  301. painapple_code/static/js/session-container-pool.js +371 -0
  302. painapple_code/static/js/session-setup-panel.js +274 -0
  303. painapple_code/static/js/session.js +1047 -0
  304. painapple_code/static/js/shortcut-hints.js +272 -0
  305. painapple_code/static/js/shortcuts.js +1146 -0
  306. painapple_code/static/js/skills-autocomplete.js +262 -0
  307. painapple_code/static/js/snippets-autocomplete.js +738 -0
  308. painapple_code/static/js/stash-refs-view.js +83 -0
  309. painapple_code/static/js/stash-ui.js +768 -0
  310. painapple_code/static/js/stash.js +785 -0
  311. painapple_code/static/js/status-bar.js +1184 -0
  312. painapple_code/static/js/token-profile.js +274 -0
  313. painapple_code/static/js/tool-renderer-blocks.js +1626 -0
  314. painapple_code/static/js/tool-renderer-thinking.js +813 -0
  315. painapple_code/static/js/tool-renderer.js +1500 -0
  316. painapple_code/static/js/tooltips.js +197 -0
  317. painapple_code/static/js/upload-manager.js +1019 -0
  318. painapple_code/static/js/utils.js +521 -0
  319. painapple_code/static/js/welcome/api.js +363 -0
  320. painapple_code/static/js/welcome/cards.js +626 -0
  321. painapple_code/static/js/welcome/context-menu.js +585 -0
  322. painapple_code/static/js/welcome/families.js +801 -0
  323. painapple_code/static/js/welcome/preview.js +234 -0
  324. painapple_code/static/js/welcome/state.js +129 -0
  325. painapple_code/static/js/welcome.js +1874 -0
  326. painapple_code/static/js/widget-system/base-widget.js +717 -0
  327. painapple_code/static/js/widget-system/device-manager.js +178 -0
  328. painapple_code/static/js/widget-system/event-bus.js +152 -0
  329. painapple_code/static/js/widget-system/icons.js +120 -0
  330. painapple_code/static/js/widget-system/index.js +49 -0
  331. painapple_code/static/js/widget-system/init.js +54 -0
  332. painapple_code/static/js/widget-system/types/bottom-sheet.js +307 -0
  333. painapple_code/static/js/widget-system/types/floating.js +915 -0
  334. painapple_code/static/js/widget-system/types/index.js +40 -0
  335. painapple_code/static/js/widget-system/types/modal.js +147 -0
  336. painapple_code/static/js/widget-system/types/sidebar.js +158 -0
  337. painapple_code/static/js/widget-system/types/tab.js +146 -0
  338. painapple_code/static/js/widget-system/types/top-sheet.js +203 -0
  339. painapple_code/static/js/widget-system/widget-manager.js +1187 -0
  340. painapple_code/static/js/widgets/about-widget.js +260 -0
  341. painapple_code/static/js/widgets/active-sessions-widget.js +760 -0
  342. painapple_code/static/js/widgets/agents-widget.js +897 -0
  343. painapple_code/static/js/widgets/browser-widget.js +579 -0
  344. painapple_code/static/js/widgets/commands-widget.js +694 -0
  345. painapple_code/static/js/widgets/config/commit-sections.js +449 -0
  346. painapple_code/static/js/widgets/config/dir-autocomplete.js +224 -0
  347. painapple_code/static/js/widgets/config/gestures.js +161 -0
  348. painapple_code/static/js/widgets/config/models-tab.js +988 -0
  349. painapple_code/static/js/widgets/config/quick-actions-tab.js +882 -0
  350. painapple_code/static/js/widgets/config/shortcut-editor.js +587 -0
  351. painapple_code/static/js/widgets/config/state.js +517 -0
  352. painapple_code/static/js/widgets/config/system-controls.js +90 -0
  353. painapple_code/static/js/widgets/config-widget.js +1535 -0
  354. painapple_code/static/js/widgets/cost-analytics-widget.js +621 -0
  355. painapple_code/static/js/widgets/debug-widget.js +693 -0
  356. painapple_code/static/js/widgets/diff-viewer-widget.js +1420 -0
  357. painapple_code/static/js/widgets/discussion-widget.js +1107 -0
  358. painapple_code/static/js/widgets/file-explorer-widget.js +2166 -0
  359. painapple_code/static/js/widgets/file-preview-widget.js +861 -0
  360. painapple_code/static/js/widgets/git-widget.js +794 -0
  361. painapple_code/static/js/widgets/helpers-install-widget.js +720 -0
  362. painapple_code/static/js/widgets/history-explorer-widget.js +1804 -0
  363. painapple_code/static/js/widgets/image-annotate-widget.js +951 -0
  364. painapple_code/static/js/widgets/image-preview-widget.js +692 -0
  365. painapple_code/static/js/widgets/index.js +176 -0
  366. painapple_code/static/js/widgets/log-explorer-widget.js +1057 -0
  367. painapple_code/static/js/widgets/plugins-widget.js +305 -0
  368. painapple_code/static/js/widgets/prompt-explorer-widget.js +1119 -0
  369. painapple_code/static/js/widgets/search-files-widget.js +529 -0
  370. painapple_code/static/js/widgets/skills-widget.js +843 -0
  371. painapple_code/static/js/widgets/snippets-widget.js +479 -0
  372. painapple_code/static/js/widgets/sub-agents-widget.js +333 -0
  373. painapple_code/static/js/widgets/tasks-widget.js +379 -0
  374. painapple_code/static/js/widgets/terminal/connection.js +283 -0
  375. painapple_code/static/js/widgets/terminal/gestures.js +357 -0
  376. painapple_code/static/js/widgets/terminal/init.js +642 -0
  377. painapple_code/static/js/widgets/terminal/link-providers.js +532 -0
  378. painapple_code/static/js/widgets/terminal/osc52.js +213 -0
  379. painapple_code/static/js/widgets/terminal/render.js +159 -0
  380. painapple_code/static/js/widgets/terminal/size.js +54 -0
  381. painapple_code/static/js/widgets/terminal/state.js +211 -0
  382. painapple_code/static/js/widgets/terminal/wrap-utils.js +101 -0
  383. painapple_code/static/js/widgets/terminal-widget.js +793 -0
  384. painapple_code/static/js/widgets/uploads-widget.js +461 -0
  385. painapple_code/static/js/widgets/zen-widget.js +1001 -0
  386. painapple_code/static/login.html +51 -0
  387. painapple_code/static/manifest.json +73 -0
  388. painapple_code/static/sw.js +293 -0
  389. painapple_code/static/vendor/LICENSES.txt +769 -0
  390. painapple_code/static/vendor/README.md +103 -0
  391. painapple_code/static/vendor/codemirror.js +35 -0
  392. painapple_code/static/vendor/codemirror.js.LEGAL.txt +304 -0
  393. painapple_code/static/vendor/github-markdown-dark.min.css +1124 -0
  394. painapple_code/static/vendor/highlight-github-dark.min.css +10 -0
  395. painapple_code/static/vendor/highlight-lang-dockerfile.min.js +8 -0
  396. painapple_code/static/vendor/highlight-lang-nginx.min.js +21 -0
  397. painapple_code/static/vendor/highlight-lang-properties.min.js +10 -0
  398. painapple_code/static/vendor/highlight-lang-scala.min.js +28 -0
  399. painapple_code/static/vendor/highlight.min.js +1213 -0
  400. painapple_code/static/vendor/marked.min.js +6 -0
  401. painapple_code/static/vendor/purify.min.js +3 -0
  402. painapple_code/static/vendor/xterm-addon-fit.js +2 -0
  403. painapple_code/static/vendor/xterm.css +209 -0
  404. painapple_code/static/vendor/xterm.js +2 -0
  405. painapple_code/static/web-client.html +635 -0
  406. painapple_code/subprocess_registry.py +535 -0
  407. painapple_code/tls_cert.py +79 -0
  408. painapple_code/tools/agents/shadow-git-helper.md +400 -0
  409. painapple_code/tools/excalidraw-to-svg.js +143 -0
  410. painapple_code/tools/install-helpers.sh +148 -0
  411. painapple_code/tools/shadow-git +320 -0
  412. painapple_code/tools/shadow-query +120 -0
  413. painapple_code/tools/vegalite-to-svg.js +79 -0
  414. painapple_code/turn_query.py +766 -0
  415. painapple_code/turn_tracker.py +221 -0
  416. painapple_code/utils/__init__.py +0 -0
  417. painapple_code/utils/agent_cli.py +306 -0
  418. painapple_code/utils/chart.py +103 -0
  419. painapple_code/utils/excalidraw.py +107 -0
  420. painapple_code/utils/file_lock.py +162 -0
  421. painapple_code/utils/file_paths.py +648 -0
  422. painapple_code/utils/generate_icons.py +251 -0
  423. painapple_code/utils/proc.py +205 -0
  424. painapple_code/utils/pty_backend.py +59 -0
  425. painapple_code/utils/pty_posix.py +160 -0
  426. painapple_code/utils/pty_windows.py +245 -0
  427. painapple_code/utils/token_profiles.py +91 -0
  428. painapple_code/viewer_templates.py +657 -0
  429. painapple_code/welcome_search.py +879 -0
  430. painapple_code-1.0.0.dist-info/METADATA +292 -0
  431. painapple_code-1.0.0.dist-info/RECORD +436 -0
  432. painapple_code-1.0.0.dist-info/WHEEL +5 -0
  433. painapple_code-1.0.0.dist-info/entry_points.txt +2 -0
  434. painapple_code-1.0.0.dist-info/licenses/LICENSE +661 -0
  435. painapple_code-1.0.0.dist-info/licenses/THIRD_PARTY_NOTICES.md +261 -0
  436. painapple_code-1.0.0.dist-info/top_level.txt +1 -0
@@ -0,0 +1,1584 @@
1
+ /* ═══════════════════════════════════════════════════════════════════
2
+ THINKING BLOCKS - CLEAN MINIMAL DESIGN (2025-12-29)
3
+
4
+ Design principles:
5
+ - Reasoning text is SUBTLE (muted, italic) - secondary to tools
6
+ - Tools are PROMINENT - full width, normal styling
7
+ - Orange left accent ties it together as "thinking" context
8
+ - Clean, uncluttered appearance
9
+ ═══════════════════════════════════════════════════════════════════ */
10
+ .message.thinking {
11
+ /* Orange-tinted bubble like assistant messages */
12
+ background: rgba(251, 146, 60, 0.06);
13
+ padding: var(--layout-msg-padding-v) var(--layout-msg-padding-h);
14
+ border-radius: var(--layout-msg-radius);
15
+ border: 1px solid rgba(251, 146, 60, 0.15);
16
+ /* Allow gutter icons to extend outside the message */
17
+ overflow: visible;
18
+ }
19
+
20
+ /* Section container */
21
+ .thinking-section {
22
+ position: relative;
23
+ display: flex;
24
+ flex-direction: column;
25
+ gap: 4px;
26
+ }
27
+
28
+ /* ═══════════════════════════════════════════════════════════════════
29
+ COLLAPSE ALL BUTTON - Toggles all tool outputs in the section
30
+ Positioned sticky in the right gutter. Uses negative margin-bottom
31
+ to negate vertical space (height + gap) so it doesn't create empty row.
32
+ Hidden by default, shown when gutter space is detected
33
+ ═══════════════════════════════════════════════════════════════════ */
34
+ .thinking-collapse-tools-btn {
35
+ display: none; /* Hidden by default, shown when gutter space detected */
36
+ position: sticky;
37
+ top: 8px;
38
+ /* Align to right edge of flex column cross-axis */
39
+ align-self: flex-end;
40
+ /* Push into right gutter */
41
+ margin-right: calc(-1 * var(--layout-msg-padding-h) - 32px);
42
+ /* Negate vertical space: 24px height + 4px gap = 28px */
43
+ margin-bottom: -28px;
44
+ width: 24px;
45
+ height: 24px;
46
+ padding: 0;
47
+ background: var(--bg-tertiary);
48
+ border: 1px solid var(--border-primary);
49
+ border-radius: var(--radius-sm);
50
+ color: var(--text-secondary);
51
+ cursor: pointer;
52
+ transition: background-color 0.15s ease, color 0.15s ease, border-color 0.15s ease, opacity 0.15s ease;
53
+ z-index: 10;
54
+ }
55
+
56
+ /* Show collapse-all button when gutter space is detected */
57
+ .thinking-section.has-gutter-space .thinking-collapse-tools-btn {
58
+ display: flex;
59
+ align-items: center;
60
+ justify-content: center;
61
+ }
62
+
63
+ .thinking-collapse-tools-btn:hover {
64
+ background: var(--bg-hover);
65
+ color: var(--text-primary);
66
+ border-color: var(--accent);
67
+ }
68
+
69
+ /* Icon states */
70
+ .thinking-collapse-tools-btn .expand-icon {
71
+ display: none;
72
+ }
73
+
74
+ .thinking-collapse-tools-btn .collapse-icon {
75
+ display: block;
76
+ }
77
+
78
+ /* When collapsed - show expand icon instead */
79
+ .thinking-section.tools-collapsed .thinking-collapse-tools-btn .collapse-icon {
80
+ display: none;
81
+ }
82
+
83
+ .thinking-section.tools-collapsed .thinking-collapse-tools-btn .expand-icon {
84
+ display: block;
85
+ }
86
+
87
+ /* ═══════════════════════════════════════════════════════════════════
88
+ TOOLS COLLAPSED STATE - Section-level collapse affects Task groups only
89
+ Individual tool content hiding is handled by .tool-collapsed on each card
90
+ (This allows individual tools to be expanded while section is "collapsed")
91
+ ═══════════════════════════════════════════════════════════════════ */
92
+
93
+ /* Collapse Task groups when section is collapsed
94
+ (Task groups don't have individual gutter icons, so they only toggle via collapse-all) */
95
+ .thinking-section.tools-collapsed .task-group-body {
96
+ display: none !important;
97
+ }
98
+
99
+ .thinking-section.tools-collapsed .task-group-preview {
100
+ display: block !important;
101
+ }
102
+
103
+ /* Visual indicator that tool is collapsed - rounded corners on headers */
104
+ .thinking-tool-card.tool-collapsed .grep-header,
105
+ .thinking-tool-card.tool-collapsed .glob-header,
106
+ .thinking-tool-card.tool-collapsed .bash-header,
107
+ .thinking-tool-card.tool-collapsed .read-header,
108
+ .thinking-tool-card.tool-collapsed .write-header,
109
+ .thinking-tool-card.tool-collapsed .edit-diff-header,
110
+ .thinking-tool-card.tool-collapsed .tt-header,
111
+ .thinking-tool-card.tool-collapsed .tool-header {
112
+ border-radius: var(--radius-sm);
113
+ }
114
+
115
+ /* ═══════════════════════════════════════════════════════════════════
116
+ GUTTER ICONS - Per-tool collapse in right margin
117
+ Only visible when .has-gutter-space is set (detected by JavaScript)
118
+ ═══════════════════════════════════════════════════════════════════ */
119
+
120
+ /* Tool card - no special positioning needed since gutter icon is sticky */
121
+ .thinking-tool-card {
122
+ /* Default block positioning */
123
+ }
124
+
125
+ /* Per-tool gutter icon - sticky in right margin, below collapse-all button
126
+ Sticks at top: 40px (below collapse-all at ~8px + 24px height + 8px gap) */
127
+ .tool-gutter-icon {
128
+ display: none; /* Hidden by default, shown when space detected */
129
+ position: sticky;
130
+ top: 40px;
131
+ /* Float to right edge, then into gutter */
132
+ float: right;
133
+ margin-right: -32px;
134
+ margin-left: 8px;
135
+ margin-bottom: -24px; /* Pull following content up */
136
+ width: 24px;
137
+ height: 24px;
138
+ padding: 0;
139
+ background: var(--bg-secondary);
140
+ border: 1px solid var(--border-secondary);
141
+ border-radius: var(--radius-sm);
142
+ color: var(--text-muted);
143
+ cursor: pointer;
144
+ transition: background-color 0.15s ease, color 0.15s ease, border-color 0.15s ease, opacity 0.15s ease;
145
+ align-items: center;
146
+ justify-content: center;
147
+ z-index: 5;
148
+ }
149
+
150
+ .tool-gutter-icon:hover {
151
+ background: var(--bg-tertiary);
152
+ color: var(--text-secondary);
153
+ border-color: var(--border-primary);
154
+ }
155
+
156
+ /* Show gutter icons when space is detected - only for top-level tools
157
+ Use direct child selector to exclude tools nested inside Task groups */
158
+ .thinking-section.has-gutter-space .thinking-step-tools > .thinking-tool-card > .tool-gutter-icon {
159
+ display: flex;
160
+ }
161
+
162
+ /* Hide gutter icons for tools nested inside Task groups
163
+ (Task groups are already collapsible, and nested tool positioning is different) */
164
+ .task-group-children .tool-gutter-icon {
165
+ display: none !important;
166
+ }
167
+
168
+ /* Icon states for gutter icons */
169
+ .tool-gutter-icon .gutter-expand-icon {
170
+ display: none;
171
+ }
172
+
173
+ .tool-gutter-icon .gutter-collapse-icon {
174
+ display: block;
175
+ }
176
+
177
+ /* When tool is collapsed - show expand icon */
178
+ .thinking-tool-card.tool-collapsed .tool-gutter-icon .gutter-collapse-icon {
179
+ display: none;
180
+ }
181
+
182
+ .thinking-tool-card.tool-collapsed .tool-gutter-icon .gutter-expand-icon {
183
+ display: block;
184
+ }
185
+
186
+ /* ═══════════════════════════════════════════════════════════════════
187
+ PER-TOOL COLLAPSED STATE - Individual tool collapse
188
+ ═══════════════════════════════════════════════════════════════════ */
189
+
190
+ /* Hide tool output when individually collapsed */
191
+ .thinking-tool-card.tool-collapsed .grep-results,
192
+ .thinking-tool-card.tool-collapsed .grep-empty,
193
+ .thinking-tool-card.tool-collapsed .glob-files,
194
+ .thinking-tool-card.tool-collapsed .glob-empty,
195
+ .thinking-tool-card.tool-collapsed .bash-output,
196
+ .thinking-tool-card.tool-collapsed .read-content,
197
+ .thinking-tool-card.tool-collapsed .read-image-preview,
198
+ .thinking-tool-card.tool-collapsed .write-content,
199
+ .thinking-tool-card.tool-collapsed .edit-diff-content,
200
+ .thinking-tool-card.tool-collapsed .tool-content,
201
+ .thinking-tool-card.tool-collapsed .tt-code,
202
+ .thinking-tool-card.tool-collapsed .tt-results,
203
+ .thinking-tool-card.tool-collapsed .tt-output,
204
+ .thinking-tool-card.tool-collapsed .todo-list {
205
+ display: none !important;
206
+ }
207
+
208
+ /* ═══════════════════════════════════════════════════════════════════
209
+ STEP - One thought with its tools
210
+ ═══════════════════════════════════════════════════════════════════ */
211
+ .thinking-step {
212
+ display: block;
213
+ padding: 0;
214
+ cursor: default;
215
+ }
216
+
217
+ /* Signature-only thinking blocks arrive with thinking: "" — no header is
218
+ rendered for them, and until a tool streams in there is nothing to show.
219
+ Hide rather than skip rendering: the step is the anchor tools attach to,
220
+ and :has() un-hides it the instant the first tool card is inserted. */
221
+ .thinking-step:not(:has(.thinking-step-header)):not(:has(.thinking-step-tools > *)) {
222
+ display: none;
223
+ }
224
+
225
+ /* Same test one level up, so an all-empty section does not leave the orange
226
+ bubble behind as a bare bordered bar above the assistant message. */
227
+ .message.thinking:not(:has(.thinking-step-header)):not(:has(.thinking-step-tools > *)) {
228
+ display: none;
229
+ }
230
+
231
+ /* Clickable header - text aligns with normal message content */
232
+ .thinking-step-header {
233
+ display: flex;
234
+ align-items: flex-start;
235
+ gap: 6px;
236
+ padding: 0;
237
+ cursor: pointer;
238
+ }
239
+
240
+ /* Preview text - shown when collapsed, truncated */
241
+ .thinking-step-preview {
242
+ flex: 1;
243
+ min-width: 0;
244
+ color: var(--text-secondary);
245
+ font-size: var(--font-size-content);
246
+ line-height: var(--layout-line-height-tight);
247
+ overflow: hidden;
248
+ text-overflow: ellipsis;
249
+ white-space: nowrap;
250
+ padding-right: 28px; /* Space for collapse button */
251
+ }
252
+
253
+ /* Hide preview when expanded */
254
+ .thinking-step.expanded .thinking-step-preview {
255
+ display: none;
256
+ }
257
+
258
+ /* Compact header when expanded - only chevron visible, minimize height */
259
+ .thinking-step.expanded .thinking-step-header {
260
+ line-height: 1;
261
+ }
262
+
263
+ /* Full content with markdown - hidden by default */
264
+ .thinking-step-content {
265
+ display: none;
266
+ padding: 0 0 8px;
267
+ color: var(--text-primary);
268
+ font-size: var(--font-size-content);
269
+ line-height: 1.5;
270
+ }
271
+
272
+ /* Show content when expanded */
273
+ .thinking-step.expanded .thinking-step-content {
274
+ display: block;
275
+ }
276
+
277
+ /* Remove top margin from first child to prevent gap after header */
278
+ .thinking-step-content > :first-child {
279
+ margin-top: 0;
280
+ }
281
+
282
+ /* Markdown styling within thinking content */
283
+ .thinking-step-content h1,
284
+ .thinking-step-content h2,
285
+ .thinking-step-content h3,
286
+ .thinking-step-content h4 {
287
+ margin-top: 0.8em;
288
+ margin-bottom: 0.4em;
289
+ color: var(--text-primary);
290
+ font-weight: 600;
291
+ }
292
+
293
+ .thinking-step-content p {
294
+ margin: 0.5em 0;
295
+ }
296
+
297
+ .thinking-step-content pre {
298
+ background: var(--bg-secondary);
299
+ padding: 8px;
300
+ border-radius: var(--radius-sm);
301
+ overflow-x: auto;
302
+ font-size: 11px;
303
+ margin: 0.5em 0;
304
+ }
305
+
306
+ .thinking-step-content code {
307
+ background: var(--bg-secondary);
308
+ padding: 1px 4px;
309
+ border-radius: var(--radius-sm);
310
+ font-size: 0.9em;
311
+ }
312
+
313
+ .thinking-step-content pre code {
314
+ background: none;
315
+ padding: 0;
316
+ }
317
+
318
+ .thinking-step-content ul,
319
+ .thinking-step-content ol {
320
+ margin: 0.5em 0;
321
+ padding-left: 1.5em;
322
+ }
323
+
324
+ .thinking-step-content table {
325
+ border-collapse: collapse;
326
+ margin: 0.5em 0;
327
+ font-size: 12px;
328
+ }
329
+
330
+ .thinking-step-content th,
331
+ .thinking-step-content td {
332
+ border: 1px solid var(--border-primary);
333
+ padding: 4px 8px;
334
+ }
335
+
336
+ .thinking-step-content th {
337
+ background: var(--bg-secondary);
338
+ }
339
+
340
+ /* Legacy: keep .thinking-step-text for backwards compat */
341
+ .thinking-step-text {
342
+ flex: 1;
343
+ min-width: 0;
344
+ color: var(--text-secondary);
345
+ font-size: var(--font-size-content);
346
+ line-height: var(--layout-line-height-tight);
347
+ overflow: hidden;
348
+ text-overflow: ellipsis;
349
+ white-space: nowrap;
350
+ }
351
+
352
+ .thinking-step.expanded .thinking-step-text {
353
+ white-space: pre-wrap;
354
+ word-break: break-word;
355
+ overflow: visible;
356
+ }
357
+
358
+ /* Expand indicator */
359
+ .thinking-step-expand {
360
+ flex-shrink: 0;
361
+ color: var(--text-muted);
362
+ font-size: 10px;
363
+ transition: transform 0.2s ease;
364
+ opacity: 0.3;
365
+ margin-top: 3px;
366
+ }
367
+
368
+ .thinking-step-header:hover .thinking-step-expand {
369
+ opacity: 0.7;
370
+ }
371
+
372
+ .thinking-step.expanded .thinking-step-expand {
373
+ transform: rotate(90deg);
374
+ opacity: 0.7;
375
+ }
376
+
377
+ /* Tools container - full width, with spacing from reasoning text */
378
+ .thinking-step-tools {
379
+ display: flex;
380
+ flex-direction: column;
381
+ gap: 4px;
382
+ margin-top: 6px;
383
+ }
384
+
385
+ /* Tool cards - break out of padding for full width */
386
+ .thinking-tool-card {
387
+ width: calc(100% + var(--layout-msg-padding-h) * 2);
388
+ margin-left: calc(-1 * var(--layout-msg-padding-h));
389
+ margin-right: calc(-1 * var(--layout-msg-padding-h));
390
+ }
391
+
392
+ /* Reset tool block margins and borders for consistent spacing */
393
+ .thinking-tool-card .read-block,
394
+ .thinking-tool-card .bash-block,
395
+ .thinking-tool-card .grep-block,
396
+ .thinking-tool-card .glob-block,
397
+ .thinking-tool-card .write-block,
398
+ .thinking-tool-card .edit-diff,
399
+ .thinking-tool-card .tool-block {
400
+ margin: 0;
401
+ border-left: none;
402
+ border-radius: 0;
403
+ }
404
+
405
+ /* Compact tool items (.ta-item) inside thinking tool cards
406
+ These are used for tools without dedicated block renderers (Skill, etc.) */
407
+ .thinking-tool-card > .ta-item {
408
+ background: var(--bg-secondary);
409
+ padding: 8px 12px;
410
+ border-left: 2px solid var(--border);
411
+ }
412
+
413
+ .thinking-tool-card > .ta-item.ta-cyan {
414
+ border-left-color: #22d3ee;
415
+ }
416
+
417
+ /* ═══════════════════════════════════════════════════════════════════
418
+ LEGACY STYLES - Kept for backwards compatibility
419
+ Old thinking blocks may still exist in loaded conversations
420
+ ═══════════════════════════════════════════════════════════════════ */
421
+
422
+ /* Old collapsible thinking block */
423
+ .thinking-block {
424
+ padding: 0;
425
+ border: 1px solid var(--border-primary);
426
+ border-left: 3px solid #fb923c;
427
+ border-radius: var(--radius-sm);
428
+ background: var(--bg-tertiary);
429
+ overflow: hidden;
430
+ }
431
+
432
+ .thinking-header {
433
+ display: flex;
434
+ align-items: center;
435
+ gap: 6px;
436
+ padding: 5px 8px;
437
+ background: var(--bg-secondary);
438
+ cursor: pointer;
439
+ user-select: none;
440
+ font-size: 12px;
441
+ }
442
+
443
+ .thinking-header:hover {
444
+ background: var(--bg-hover);
445
+ }
446
+
447
+ .thinking-label {
448
+ display: flex;
449
+ align-items: center;
450
+ gap: 6px;
451
+ color: #fb923c;
452
+ font-weight: 600;
453
+ flex-shrink: 0;
454
+ }
455
+
456
+ .thinking-label svg {
457
+ width: 14px;
458
+ height: 14px;
459
+ transition: transform 0.2s ease;
460
+ }
461
+
462
+ .thinking-block.collapsed .thinking-label svg {
463
+ transform: rotate(-90deg);
464
+ }
465
+
466
+ .thinking-preview {
467
+ color: var(--text-muted);
468
+ font-style: italic;
469
+ font-size: 11px;
470
+ overflow: hidden;
471
+ text-overflow: ellipsis;
472
+ white-space: nowrap;
473
+ flex: 1;
474
+ }
475
+
476
+ .thinking-block:not(.collapsed) .thinking-preview {
477
+ display: none;
478
+ }
479
+
480
+ .thinking-content {
481
+ padding: var(--layout-tool-padding);
482
+ border-top: 1px solid var(--border-secondary);
483
+ color: var(--text-secondary);
484
+ font-family: var(--font-mono);
485
+ font-size: 12px;
486
+ max-height: 400px;
487
+ overflow-y: auto;
488
+ /* iOS: Allow vertical scroll without blocking parent */
489
+ -webkit-overflow-scrolling: touch;
490
+ touch-action: pan-y;
491
+ /* Prevent scroll chaining to parent when reaching scroll bounds */
492
+ overscroll-behavior: contain;
493
+ }
494
+
495
+ .thinking-block.collapsed .thinking-content {
496
+ display: none;
497
+ }
498
+
499
+ /* Old thinking message tools */
500
+ .thinking-tools {
501
+ margin-top: var(--layout-gap-md);
502
+ padding-top: var(--layout-gap-sm);
503
+ border-top: 1px solid var(--border-secondary);
504
+ }
505
+
506
+ .thinking-msg-tool {
507
+ margin: var(--layout-gap-xs) 0;
508
+ padding: var(--layout-tool-padding);
509
+ background: var(--bg-tertiary);
510
+ border-radius: var(--radius-sm);
511
+ border-left: 2px solid var(--warning);
512
+ font-size: 11px;
513
+ }
514
+
515
+ .thinking-msg-tool-header {
516
+ display: flex;
517
+ align-items: center;
518
+ gap: 8px;
519
+ flex-wrap: wrap;
520
+ }
521
+
522
+ .thinking-msg-tool-name {
523
+ color: var(--warning);
524
+ font-weight: 500;
525
+ }
526
+
527
+ .thinking-msg-tool-header code {
528
+ background: var(--bg-secondary);
529
+ padding: 1px 4px;
530
+ border-radius: var(--radius-sm);
531
+ font-size: 10px;
532
+ color: var(--text-muted);
533
+ }
534
+
535
+ .thinking-msg-tool-output {
536
+ margin-top: 4px;
537
+ padding: 4px 6px;
538
+ background: var(--bg-secondary);
539
+ border-radius: var(--radius-sm);
540
+ color: var(--text-muted);
541
+ white-space: pre-wrap;
542
+ max-height: 80px;
543
+ overflow-y: auto;
544
+ font-size: 10px;
545
+ }
546
+
547
+ .thinking-msg-tool-output.completed {
548
+ color: var(--text-secondary);
549
+ }
550
+
551
+ /* Old tool output expand button */
552
+ .thinking-msg-tool-output-wrapper {
553
+ position: relative;
554
+ }
555
+
556
+ .thinking-msg-tool-output-wrapper .thinking-msg-tool-output {
557
+ max-height: 80px;
558
+ overflow: hidden;
559
+ }
560
+
561
+ .thinking-msg-tool-output-wrapper::after {
562
+ content: '';
563
+ position: absolute;
564
+ bottom: 24px;
565
+ left: 0;
566
+ right: 0;
567
+ height: 30px;
568
+ background: linear-gradient(transparent, var(--bg-secondary));
569
+ pointer-events: none;
570
+ }
571
+
572
+ .tool-output-expand-btn {
573
+ display: block;
574
+ width: 100%;
575
+ padding: 4px 8px;
576
+ margin-top: 2px;
577
+ background: var(--bg-tertiary);
578
+ border: 1px solid var(--border-secondary);
579
+ border-radius: var(--radius-sm);
580
+ color: var(--text-muted);
581
+ font-size: 10px;
582
+ cursor: pointer;
583
+ text-align: center;
584
+ transition: background-color 0.15s ease, color 0.15s ease, border-color 0.15s ease, opacity 0.15s ease;
585
+ }
586
+
587
+ .tool-output-expand-btn:hover {
588
+ background: var(--bg-hover);
589
+ color: var(--text-secondary);
590
+ }
591
+
592
+ /* Old expanded state */
593
+ .thinking-msg-tool-output-wrapper.expanded .thinking-msg-tool-output {
594
+ max-height: 400px;
595
+ overflow-y: auto;
596
+ }
597
+
598
+ .thinking-msg-tool-output-wrapper.expanded::after {
599
+ display: none;
600
+ }
601
+
602
+ .thinking-text {
603
+ white-space: pre-wrap;
604
+ margin: 0;
605
+ }
606
+
607
+ .thinking-text:empty {
608
+ display: none;
609
+ }
610
+
611
+ /* Old grouped thinking session */
612
+ .thinking-group {
613
+ padding: 0;
614
+ border: 1px solid var(--border-primary);
615
+ border-left: 3px solid #fb923c;
616
+ border-radius: var(--radius-sm);
617
+ background: var(--bg-tertiary);
618
+ margin: var(--layout-gap-sm) 0;
619
+ overflow: hidden;
620
+ }
621
+
622
+ .thinking-group-header {
623
+ display: flex;
624
+ align-items: center;
625
+ gap: 6px;
626
+ padding: 5px 8px;
627
+ background: var(--bg-secondary);
628
+ cursor: pointer;
629
+ user-select: none;
630
+ font-size: 12px;
631
+ }
632
+
633
+ .thinking-group-header:hover {
634
+ background: var(--bg-hover);
635
+ }
636
+
637
+ .thinking-group-label {
638
+ display: flex;
639
+ align-items: center;
640
+ gap: 6px;
641
+ color: #fb923c;
642
+ font-weight: 600;
643
+ flex-shrink: 0;
644
+ }
645
+
646
+ .thinking-group-label svg {
647
+ width: 14px;
648
+ height: 14px;
649
+ transition: transform 0.2s ease;
650
+ }
651
+
652
+ .thinking-group.collapsed .thinking-group-label svg {
653
+ transform: rotate(-90deg);
654
+ }
655
+
656
+ .thinking-group-preview {
657
+ color: var(--text-muted);
658
+ font-style: italic;
659
+ font-size: 11px;
660
+ overflow: hidden;
661
+ text-overflow: ellipsis;
662
+ white-space: nowrap;
663
+ flex: 1;
664
+ }
665
+
666
+ .thinking-group:not(.collapsed) .thinking-group-preview {
667
+ display: none;
668
+ }
669
+
670
+ .thinking-group-content {
671
+ border-top: 1px solid var(--border-secondary);
672
+ padding: var(--layout-gap-md) 0;
673
+ }
674
+
675
+ .thinking-group.collapsed .thinking-group-content {
676
+ display: none;
677
+ }
678
+
679
+ /* Old timeline view */
680
+ .thinking-timeline {
681
+ display: flex;
682
+ flex-direction: column;
683
+ gap: 0;
684
+ }
685
+
686
+ /* REMOVED - legacy .thinking-step was overriding new design
687
+ .thinking-step {
688
+ display: flex;
689
+ flex-wrap: wrap;
690
+ align-items: baseline;
691
+ padding: 3px 8px;
692
+ cursor: pointer;
693
+ transition: background 0.15s ease;
694
+ }
695
+
696
+ .thinking-step:hover {
697
+ background: var(--bg-hover);
698
+ }
699
+ */
700
+
701
+ .thinking-step-marker {
702
+ font-family: var(--font-mono);
703
+ font-size: 10px;
704
+ font-weight: 500;
705
+ color: #fb923c;
706
+ opacity: 0.6;
707
+ margin-right: 4px;
708
+ }
709
+
710
+ .thinking-step:hover .thinking-step-marker {
711
+ opacity: 1;
712
+ }
713
+
714
+ .thinking-step-summary {
715
+ flex: 1;
716
+ min-width: 0;
717
+ display: flex;
718
+ align-items: baseline;
719
+ gap: 6px;
720
+ }
721
+
722
+ /* Note: .thinking-step-preview, .thinking-step-tools, .thinking-step-expand
723
+ now defined above in new inline design section */
724
+
725
+ .thinking-step-detail {
726
+ display: none;
727
+ flex-basis: 100%;
728
+ margin: 6px 0 4px 0;
729
+ padding: 8px;
730
+ background: var(--bg-secondary);
731
+ border-radius: var(--radius-sm);
732
+ font-family: var(--font-mono);
733
+ font-size: 11px;
734
+ color: var(--text-secondary);
735
+ max-height: 70vh;
736
+ overflow-y: auto;
737
+ cursor: default;
738
+ }
739
+
740
+ .thinking-step.expanded .thinking-step-detail {
741
+ display: block;
742
+ }
743
+
744
+ .thinking-step-detail.has-expanded-output {
745
+ max-height: 80vh;
746
+ }
747
+
748
+ .thinking-step-detail .thinking-tools {
749
+ margin-top: var(--layout-gap-md);
750
+ padding-top: var(--layout-gap-md);
751
+ border-top: 1px solid var(--border-secondary);
752
+ }
753
+
754
+ /* Old thinking tools content */
755
+ .thinking-tools-content {
756
+ display: flex;
757
+ flex-direction: column;
758
+ gap: var(--layout-gap-sm);
759
+ }
760
+
761
+ /* Old thinking summary */
762
+ .thinking-summary {
763
+ margin-top: var(--layout-gap-sm);
764
+ }
765
+
766
+ /* Old thinking edits */
767
+ .thinking-edits {
768
+ padding: var(--layout-gap-md);
769
+ background: var(--bg-secondary);
770
+ border-radius: var(--radius-sm);
771
+ border-left: 2px solid var(--accent);
772
+ }
773
+
774
+ .thinking-edits-header {
775
+ display: flex;
776
+ align-items: center;
777
+ gap: 6px;
778
+ color: var(--accent);
779
+ font-size: 12px;
780
+ font-weight: 500;
781
+ margin-bottom: var(--layout-gap-md);
782
+ }
783
+
784
+ .thinking-edits-header svg {
785
+ width: 14px;
786
+ height: 14px;
787
+ stroke: currentColor;
788
+ }
789
+
790
+ .thinking-edits-content {
791
+ display: flex;
792
+ flex-direction: column;
793
+ gap: var(--layout-gap-sm);
794
+ }
795
+
796
+ .thinking-edits-content > .thinking-tool {
797
+ margin: 0;
798
+ }
799
+
800
+ .thinking-edit-card {
801
+ /* Wrapper for edit-diff inside thinking */
802
+ }
803
+
804
+ .thinking-edit-card .edit-diff {
805
+ margin: 0;
806
+ font-size: 12px;
807
+ }
808
+
809
+ .thinking-edit-card .edit-diff-content {
810
+ max-height: 200px;
811
+ overflow-y: auto;
812
+ }
813
+
814
+ /* Simple file card for Write tool */
815
+ .simple-file-card {
816
+ background: var(--bg-tertiary);
817
+ }
818
+
819
+ .simple-file-card .edit-diff-header {
820
+ padding: 8px 12px;
821
+ }
822
+
823
+ .simple-file-card .edit-diff-action {
824
+ color: var(--success);
825
+ font-size: 11px;
826
+ font-weight: 500;
827
+ margin-left: auto;
828
+ margin-right: 8px;
829
+ }
830
+
831
+ .simple-file-card .edit-diff-footer {
832
+ padding: 4px 12px 8px;
833
+ }
834
+
835
+ /* ═══════════════════════════════════════════════════════════════════
836
+ THINKING TOOL MINI-BLOCKS (tt-*)
837
+ Compact styled tool displays inside thinking blocks
838
+ ═══════════════════════════════════════════════════════════════════ */
839
+
840
+ .thinking-tool {
841
+ background: var(--bg-secondary);
842
+ border-radius: var(--radius-sm);
843
+ margin: 6px 0;
844
+ overflow: hidden;
845
+ }
846
+
847
+ .tt-header {
848
+ display: flex;
849
+ align-items: center;
850
+ gap: 8px;
851
+ padding: 6px 10px;
852
+ font-size: 11px;
853
+ }
854
+
855
+ .tt-icon {
856
+ display: flex;
857
+ align-items: center;
858
+ flex-shrink: 0;
859
+ color: var(--text-muted);
860
+ }
861
+
862
+ .tt-icon-blue { color: var(--accent); }
863
+ .tt-icon-green { color: var(--success); }
864
+ .tt-icon-orange { color: var(--warning); }
865
+ .tt-icon-purple { color: #a78bfa; }
866
+ .tt-icon-yellow { color: #fbbf24; }
867
+ .tt-icon-cyan { color: #22d3ee; }
868
+
869
+ .tt-skill-name {
870
+ font-family: var(--font-mono);
871
+ font-weight: 600;
872
+ color: #22d3ee;
873
+ font-size: 12px;
874
+ }
875
+
876
+ .tt-args {
877
+ font-family: var(--font-mono);
878
+ font-size: 10px;
879
+ color: var(--text-secondary);
880
+ background: var(--bg-tertiary);
881
+ padding: 2px 6px;
882
+ border-radius: var(--radius-sm);
883
+ margin-left: 6px;
884
+ }
885
+
886
+ .tt-filename {
887
+ font-family: var(--font-mono);
888
+ font-weight: 500;
889
+ color: var(--text-primary);
890
+ overflow: hidden;
891
+ text-overflow: ellipsis;
892
+ white-space: nowrap;
893
+ }
894
+
895
+ .tt-cmd {
896
+ font-family: var(--font-mono);
897
+ font-size: 10px;
898
+ color: var(--text-secondary);
899
+ background: var(--bg-tertiary);
900
+ padding: 2px 6px;
901
+ border-radius: var(--radius-sm);
902
+ overflow: hidden;
903
+ text-overflow: ellipsis;
904
+ white-space: nowrap;
905
+ flex: 1;
906
+ min-width: 0;
907
+ }
908
+
909
+ .tt-pattern {
910
+ font-family: var(--font-mono);
911
+ font-size: 10px;
912
+ color: var(--text-secondary);
913
+ background: var(--bg-tertiary);
914
+ padding: 2px 6px;
915
+ border-radius: var(--radius-sm);
916
+ }
917
+
918
+ .tt-url, .tt-desc, .tt-op, .tt-name {
919
+ color: var(--text-secondary);
920
+ overflow: hidden;
921
+ text-overflow: ellipsis;
922
+ white-space: nowrap;
923
+ flex: 1;
924
+ min-width: 0;
925
+ }
926
+
927
+ .tt-preview {
928
+ font-size: 10px;
929
+ color: var(--text-muted);
930
+ background: var(--bg-tertiary);
931
+ padding: 1px 4px;
932
+ border-radius: var(--radius-xs);
933
+ }
934
+
935
+ .tt-badge {
936
+ font-size: 10px;
937
+ padding: 2px 6px;
938
+ border-radius: var(--radius-sm);
939
+ flex-shrink: 0;
940
+ font-weight: 500;
941
+ }
942
+
943
+ .tt-badge-muted {
944
+ background: var(--bg-tertiary);
945
+ color: var(--text-muted);
946
+ }
947
+
948
+ .tt-badge-success {
949
+ background: rgba(34, 197, 94, 0.15);
950
+ color: #22c55e;
951
+ }
952
+
953
+ .tt-badge-pending {
954
+ background: rgba(251, 191, 36, 0.15);
955
+ color: #fbbf24;
956
+ }
957
+
958
+ .tt-badge-lines {
959
+ background: rgba(255, 213, 79, 0.12);
960
+ color: #ffd54f;
961
+ border: 1px solid rgba(255, 213, 79, 0.3);
962
+ }
963
+
964
+ .tt-badge-lang {
965
+ background: var(--bg-tertiary);
966
+ color: var(--text-muted);
967
+ text-transform: lowercase;
968
+ }
969
+
970
+ .tt-badge-diff {
971
+ background: var(--bg-tertiary);
972
+ font-family: var(--font-mono);
973
+ }
974
+
975
+ .tt-plus { color: #22c55e; }
976
+ .tt-minus { color: #ef4444; }
977
+
978
+ .tt-status {
979
+ font-size: 10px;
980
+ flex-shrink: 0;
981
+ margin-left: auto;
982
+ }
983
+
984
+ .tt-ok { color: var(--success); }
985
+ .tt-pending { color: var(--text-muted); }
986
+
987
+ .tt-output {
988
+ font-family: var(--font-mono);
989
+ font-size: 10px;
990
+ padding: 6px 10px;
991
+ background: var(--bg-tertiary);
992
+ color: var(--text-muted);
993
+ white-space: pre-wrap;
994
+ max-height: 60px;
995
+ overflow: hidden;
996
+ border-top: 1px solid var(--border-secondary);
997
+ }
998
+
999
+ .tt-output.tt-running {
1000
+ color: var(--warning);
1001
+ font-style: italic;
1002
+ }
1003
+
1004
+ /* Tool-specific left borders */
1005
+ .tt-bash { border-left: 2px solid var(--text-muted); }
1006
+ .tt-read { border-left: none; }
1007
+ .tt-write { border-left: 2px solid var(--success); }
1008
+ .tt-edit { border-left: 2px solid var(--warning); }
1009
+ .tt-grep { border-left: 2px solid #a78bfa; }
1010
+ .tt-glob { border-left: 2px solid #fbbf24; }
1011
+ .tt-web { border-left: 2px solid #22d3ee; }
1012
+ .tt-task { border-left: 2px solid #a78bfa; }
1013
+ .tt-lsp { border-left: 2px solid var(--accent); }
1014
+ .tt-default { border-left: 2px solid var(--text-muted); }
1015
+
1016
+ /* Code preview */
1017
+ .tt-code {
1018
+ font-family: var(--font-mono);
1019
+ font-size: 11px;
1020
+ background: var(--bg-primary);
1021
+ border-top: 1px solid var(--border-secondary);
1022
+ max-height: 200px;
1023
+ overflow-y: auto;
1024
+ }
1025
+
1026
+ .tt-code.tt-running {
1027
+ padding: 8px 10px;
1028
+ color: var(--warning);
1029
+ font-style: italic;
1030
+ background: var(--bg-tertiary);
1031
+ }
1032
+
1033
+ .tt-code-line {
1034
+ display: flex;
1035
+ line-height: 1.5;
1036
+ }
1037
+
1038
+ .tt-code-line:hover {
1039
+ background: rgba(255, 255, 255, 0.03);
1040
+ }
1041
+
1042
+ .tt-line-num {
1043
+ flex-shrink: 0;
1044
+ width: 40px;
1045
+ padding: 0 8px;
1046
+ text-align: right;
1047
+ color: var(--text-muted);
1048
+ background: var(--bg-secondary);
1049
+ user-select: none;
1050
+ border-right: 1px solid var(--border-secondary);
1051
+ }
1052
+
1053
+ .tt-line-content {
1054
+ flex: 1;
1055
+ padding: 0 10px;
1056
+ white-space: pre;
1057
+ overflow-x: auto;
1058
+ color: var(--text-secondary);
1059
+ }
1060
+
1061
+ .tt-code-line.tt-added {
1062
+ background: rgba(34, 197, 94, 0.08);
1063
+ }
1064
+
1065
+ .tt-code-line.tt-added .tt-line-num {
1066
+ background: rgba(34, 197, 94, 0.15);
1067
+ color: #22c55e;
1068
+ }
1069
+
1070
+ /* Image thumbnail in thinking tools */
1071
+ .tt-image-thumb {
1072
+ padding: 6px 8px;
1073
+ background: var(--bg-primary);
1074
+ border-top: 1px solid var(--border-secondary);
1075
+ text-align: center;
1076
+ }
1077
+
1078
+ .tt-image-thumb img {
1079
+ max-width: 100%;
1080
+ max-height: 180px;
1081
+ border-radius: var(--radius-sm);
1082
+ cursor: pointer;
1083
+ object-fit: contain;
1084
+ }
1085
+
1086
+ .tt-image-thumb img:hover {
1087
+ opacity: 0.85;
1088
+ }
1089
+
1090
+ /* Search results */
1091
+ .tt-results {
1092
+ font-family: var(--font-mono);
1093
+ font-size: 11px;
1094
+ background: var(--bg-tertiary);
1095
+ border-top: 1px solid var(--border-secondary);
1096
+ padding: 6px 0;
1097
+ max-height: 160px;
1098
+ overflow-y: auto;
1099
+ }
1100
+
1101
+ .tt-results.tt-running {
1102
+ padding: 8px 10px;
1103
+ color: var(--warning);
1104
+ font-style: italic;
1105
+ }
1106
+
1107
+ .tt-result-line {
1108
+ display: flex;
1109
+ align-items: baseline;
1110
+ padding: 2px 10px;
1111
+ gap: 4px;
1112
+ overflow: hidden;
1113
+ }
1114
+
1115
+ .tt-result-line:hover {
1116
+ background: rgba(255, 255, 255, 0.03);
1117
+ }
1118
+
1119
+ .tt-result-dir {
1120
+ color: var(--text-muted);
1121
+ font-size: 10px;
1122
+ overflow: hidden;
1123
+ text-overflow: ellipsis;
1124
+ white-space: nowrap;
1125
+ flex-shrink: 1;
1126
+ min-width: 0;
1127
+ }
1128
+
1129
+ .tt-result-file {
1130
+ color: var(--text-primary);
1131
+ font-weight: 500;
1132
+ flex-shrink: 0;
1133
+ }
1134
+
1135
+ .tt-result-linenum {
1136
+ color: var(--text-muted);
1137
+ flex-shrink: 0;
1138
+ }
1139
+
1140
+ .tt-result-content {
1141
+ color: var(--text-secondary);
1142
+ overflow: hidden;
1143
+ text-overflow: ellipsis;
1144
+ white-space: nowrap;
1145
+ margin-left: 8px;
1146
+ flex: 1;
1147
+ min-width: 0;
1148
+ }
1149
+
1150
+ .tt-more {
1151
+ padding: 4px 10px;
1152
+ color: var(--text-muted);
1153
+ font-size: 10px;
1154
+ font-style: italic;
1155
+ border-top: 1px solid var(--border-secondary);
1156
+ margin-top: 4px;
1157
+ }
1158
+
1159
+ .tt-input-desc {
1160
+ color: var(--text-muted);
1161
+ font-size: 10px;
1162
+ overflow: hidden;
1163
+ text-overflow: ellipsis;
1164
+ white-space: nowrap;
1165
+ flex: 1;
1166
+ min-width: 0;
1167
+ }
1168
+
1169
+ /* ═══════════════════════════════════════════════════════════════════
1170
+ THINKING ACTIVITY LOG (ta-*)
1171
+ Ultra-compact single-line tool summary
1172
+ ═══════════════════════════════════════════════════════════════════ */
1173
+
1174
+ .thinking-activity {
1175
+ font-size: 12px;
1176
+ margin-bottom: var(--layout-gap-sm);
1177
+ }
1178
+
1179
+ .ta-item {
1180
+ display: flex;
1181
+ align-items: center;
1182
+ gap: 6px;
1183
+ padding: 4px 8px;
1184
+ border-radius: var(--radius-sm);
1185
+ transition: background 0.1s ease;
1186
+ }
1187
+
1188
+ .ta-item:hover {
1189
+ background: var(--bg-tertiary);
1190
+ }
1191
+
1192
+ .ta-icon {
1193
+ width: 14px;
1194
+ height: 14px;
1195
+ flex-shrink: 0;
1196
+ stroke-linecap: round;
1197
+ stroke-linejoin: round;
1198
+ }
1199
+
1200
+ .ta-item.ta-blue .ta-icon { stroke: var(--accent); }
1201
+ .ta-item.ta-green .ta-icon { stroke: var(--success); }
1202
+ .ta-item.ta-orange .ta-icon { stroke: var(--warning); }
1203
+ .ta-item.ta-purple .ta-icon { stroke: #a78bfa; }
1204
+ .ta-item.ta-yellow .ta-icon { stroke: #fbbf24; }
1205
+ .ta-item.ta-cyan .ta-icon { stroke: #22d3ee; }
1206
+
1207
+ .ta-file {
1208
+ font-family: var(--font-mono);
1209
+ font-size: 11px;
1210
+ color: var(--text-primary);
1211
+ overflow: hidden;
1212
+ text-overflow: ellipsis;
1213
+ white-space: nowrap;
1214
+ }
1215
+
1216
+ .ta-desc {
1217
+ font-size: 11px;
1218
+ color: var(--text-secondary);
1219
+ overflow: hidden;
1220
+ text-overflow: ellipsis;
1221
+ white-space: nowrap;
1222
+ flex: 1;
1223
+ min-width: 0;
1224
+ }
1225
+
1226
+ .ta-op {
1227
+ font-size: 10px;
1228
+ color: var(--text-muted);
1229
+ background: var(--bg-tertiary);
1230
+ padding: 1px 4px;
1231
+ border-radius: var(--radius-sm);
1232
+ }
1233
+
1234
+ .ta-name {
1235
+ font-size: 11px;
1236
+ color: var(--text-secondary);
1237
+ }
1238
+
1239
+ .ta-skill {
1240
+ font-family: var(--font-mono);
1241
+ font-size: 11px;
1242
+ font-weight: 600;
1243
+ color: #22d3ee;
1244
+ }
1245
+
1246
+ .ta-url {
1247
+ font-family: var(--font-mono);
1248
+ font-size: 10px;
1249
+ color: var(--text-muted);
1250
+ overflow: hidden;
1251
+ text-overflow: ellipsis;
1252
+ white-space: nowrap;
1253
+ }
1254
+
1255
+ .ta-item code {
1256
+ font-family: var(--font-mono);
1257
+ font-size: 11px;
1258
+ color: var(--text-secondary);
1259
+ background: var(--bg-tertiary);
1260
+ padding: 1px 5px;
1261
+ border-radius: var(--radius-sm);
1262
+ overflow: hidden;
1263
+ text-overflow: ellipsis;
1264
+ white-space: nowrap;
1265
+ max-width: 300px;
1266
+ }
1267
+
1268
+ .ta-bash-cmd {
1269
+ cursor: pointer;
1270
+ transition: background-color 0.15s, color 0.15s, border-color 0.15s, opacity 0.15s;
1271
+ }
1272
+
1273
+ .ta-bash-cmd:hover {
1274
+ background: var(--bg-hover);
1275
+ color: var(--text-primary);
1276
+ }
1277
+
1278
+ .ta-bash-cmd.copied {
1279
+ background: rgba(34, 197, 94, 0.15);
1280
+ color: #22c55e;
1281
+ }
1282
+
1283
+ .ta-result {
1284
+ margin-left: auto;
1285
+ font-size: 11px;
1286
+ color: var(--text-muted);
1287
+ flex-shrink: 0;
1288
+ }
1289
+
1290
+ .ta-success {
1291
+ color: var(--success);
1292
+ }
1293
+
1294
+ .ta-pending {
1295
+ color: var(--warning);
1296
+ font-style: italic;
1297
+ }
1298
+
1299
+ .ta-muted {
1300
+ color: var(--text-muted);
1301
+ }
1302
+
1303
+ .ta-diff {
1304
+ font-family: var(--font-mono);
1305
+ font-size: 10px;
1306
+ margin-left: auto;
1307
+ }
1308
+
1309
+ .ta-diff .ta-plus { color: #22c55e; }
1310
+ .ta-diff .ta-minus { color: #ef4444; }
1311
+
1312
+ .ta-action {
1313
+ display: inline-flex;
1314
+ align-items: center;
1315
+ justify-content: center;
1316
+ width: 18px;
1317
+ height: 18px;
1318
+ margin-left: 4px;
1319
+ padding: 0;
1320
+ border: none;
1321
+ border-radius: var(--radius-sm);
1322
+ background: transparent;
1323
+ color: var(--text-muted);
1324
+ cursor: pointer;
1325
+ opacity: 0;
1326
+ transition: background-color 0.1s, color 0.1s, border-color 0.1s, opacity 0.1s;
1327
+ }
1328
+
1329
+ .ta-item:hover .ta-action {
1330
+ opacity: 1;
1331
+ }
1332
+
1333
+ .ta-action:hover {
1334
+ background: var(--bg-tertiary);
1335
+ color: var(--accent);
1336
+ }
1337
+
1338
+ .ta-action svg {
1339
+ width: 12px;
1340
+ height: 12px;
1341
+ }
1342
+
1343
+ /* ═══════════════════════════════════════════════════════════════════
1344
+ TASK GROUP (Sub-agent container)
1345
+ Collapsible container for Task tool + its sub-agent tools
1346
+ ═══════════════════════════════════════════════════════════════════ */
1347
+
1348
+ .task-group {
1349
+ background: var(--bg-secondary);
1350
+ border: 1px solid var(--border-primary);
1351
+ border-left: 3px solid #a78bfa;
1352
+ border-radius: var(--radius-sm);
1353
+ overflow: hidden;
1354
+ margin: 4px 0;
1355
+ }
1356
+
1357
+ .task-group-header {
1358
+ display: flex;
1359
+ align-items: center;
1360
+ gap: 8px;
1361
+ padding: 8px 12px;
1362
+ background: var(--bg-secondary);
1363
+ cursor: pointer;
1364
+ user-select: none;
1365
+ font-size: 12px;
1366
+ transition: background 0.1s;
1367
+ }
1368
+
1369
+ .task-group-header:hover {
1370
+ background: var(--bg-tertiary);
1371
+ }
1372
+
1373
+ .task-group-icon {
1374
+ display: flex;
1375
+ align-items: center;
1376
+ color: #a78bfa;
1377
+ flex-shrink: 0;
1378
+ }
1379
+
1380
+ .task-group-label {
1381
+ color: #a78bfa;
1382
+ font-weight: 600;
1383
+ flex-shrink: 0;
1384
+ }
1385
+
1386
+ .task-group-desc {
1387
+ color: var(--text-secondary);
1388
+ flex: 1;
1389
+ min-width: 0;
1390
+ overflow: hidden;
1391
+ text-overflow: ellipsis;
1392
+ white-space: nowrap;
1393
+ }
1394
+
1395
+ .task-group-type {
1396
+ font-family: var(--font-mono);
1397
+ font-size: 10px;
1398
+ color: var(--text-muted);
1399
+ background: var(--bg-tertiary);
1400
+ padding: 2px 6px;
1401
+ border-radius: var(--radius-sm);
1402
+ flex-shrink: 0;
1403
+ }
1404
+
1405
+ .task-group-count {
1406
+ font-family: var(--font-mono);
1407
+ font-size: 10px;
1408
+ color: var(--text-muted);
1409
+ background: rgba(167, 139, 250, 0.1);
1410
+ padding: 2px 6px;
1411
+ border-radius: var(--radius-sm);
1412
+ flex-shrink: 0;
1413
+ }
1414
+
1415
+ .task-group-tokens,
1416
+ .task-group-duration {
1417
+ font-family: var(--font-mono);
1418
+ font-size: 10px;
1419
+ color: var(--text-muted);
1420
+ background: rgba(167, 139, 250, 0.08);
1421
+ padding: 2px 6px;
1422
+ border-radius: var(--radius-lg);
1423
+ flex-shrink: 0;
1424
+ }
1425
+
1426
+ .task-group-badge {
1427
+ font-size: 10px;
1428
+ padding: 2px 8px;
1429
+ border-radius: var(--radius-sm);
1430
+ font-weight: 500;
1431
+ flex-shrink: 0;
1432
+ }
1433
+
1434
+ .task-group-badge-success {
1435
+ background: rgba(34, 197, 94, 0.15);
1436
+ color: #22c55e;
1437
+ }
1438
+
1439
+ .task-group-badge-pending {
1440
+ background: rgba(251, 191, 36, 0.15);
1441
+ color: #fbbf24;
1442
+ }
1443
+
1444
+ .task-group-expand {
1445
+ color: var(--text-muted);
1446
+ font-size: 12px;
1447
+ transition: transform 0.2s ease;
1448
+ flex-shrink: 0;
1449
+ margin-left: auto;
1450
+ }
1451
+
1452
+ .task-group.expanded .task-group-expand {
1453
+ transform: rotate(90deg);
1454
+ }
1455
+
1456
+ /* Task preview - shown when collapsed */
1457
+ .task-group-preview {
1458
+ display: block;
1459
+ padding: 8px 12px;
1460
+ font-size: 12px;
1461
+ color: var(--text-secondary);
1462
+ background: var(--bg-tertiary);
1463
+ border-top: 1px solid var(--border-secondary);
1464
+ white-space: nowrap;
1465
+ overflow: hidden;
1466
+ text-overflow: ellipsis;
1467
+ }
1468
+
1469
+ /* Hide preview when expanded */
1470
+ .task-group.expanded .task-group-preview {
1471
+ display: none;
1472
+ }
1473
+
1474
+ /* Body container - hidden by default, shown when expanded */
1475
+ .task-group-body {
1476
+ display: none;
1477
+ flex-direction: column;
1478
+ border-top: 1px solid var(--border-secondary);
1479
+ }
1480
+
1481
+ .task-group.expanded .task-group-body {
1482
+ display: flex;
1483
+ }
1484
+
1485
+ /* Full response with markdown rendering */
1486
+ .task-group-response {
1487
+ padding: 12px;
1488
+ background: var(--bg-primary);
1489
+ font-size: 13px;
1490
+ line-height: 1.5;
1491
+ color: var(--text-primary);
1492
+ max-height: 400px;
1493
+ overflow-y: auto;
1494
+ }
1495
+
1496
+ /* Markdown styling within response */
1497
+ .task-group-response h1,
1498
+ .task-group-response h2,
1499
+ .task-group-response h3 {
1500
+ margin-top: 1em;
1501
+ margin-bottom: 0.5em;
1502
+ color: var(--text-primary);
1503
+ }
1504
+
1505
+ .task-group-response h1:first-child,
1506
+ .task-group-response h2:first-child,
1507
+ .task-group-response h3:first-child {
1508
+ margin-top: 0;
1509
+ }
1510
+
1511
+ .task-group-response p {
1512
+ margin: 0.5em 0;
1513
+ }
1514
+
1515
+ .task-group-response pre {
1516
+ background: var(--bg-secondary);
1517
+ padding: 8px;
1518
+ border-radius: var(--radius-sm);
1519
+ overflow-x: auto;
1520
+ font-size: 11px;
1521
+ }
1522
+
1523
+ .task-group-response code {
1524
+ background: var(--bg-secondary);
1525
+ padding: 1px 4px;
1526
+ border-radius: var(--radius-sm);
1527
+ font-size: 0.9em;
1528
+ }
1529
+
1530
+ .task-group-response pre code {
1531
+ background: none;
1532
+ padding: 0;
1533
+ }
1534
+
1535
+ .task-group-response ul,
1536
+ .task-group-response ol {
1537
+ margin: 0.5em 0;
1538
+ padding-left: 1.5em;
1539
+ }
1540
+
1541
+ .task-group-response table {
1542
+ border-collapse: collapse;
1543
+ margin: 0.5em 0;
1544
+ font-size: 12px;
1545
+ }
1546
+
1547
+ .task-group-response th,
1548
+ .task-group-response td {
1549
+ border: 1px solid var(--border-primary);
1550
+ padding: 4px 8px;
1551
+ }
1552
+
1553
+ .task-group-response th {
1554
+ background: var(--bg-secondary);
1555
+ }
1556
+
1557
+ /* Children container - inside body */
1558
+ .task-group-children {
1559
+ display: flex;
1560
+ flex-direction: column;
1561
+ gap: 0;
1562
+ background: var(--bg-secondary);
1563
+ padding: 4px 0;
1564
+ border-top: 1px solid var(--border-secondary);
1565
+ }
1566
+
1567
+ /* Indent and style child tools */
1568
+ .task-group-children .thinking-tool-card {
1569
+ width: calc(100% - 12px);
1570
+ margin-left: 12px;
1571
+ margin-right: 0;
1572
+ border-left: 2px solid rgba(167, 139, 250, 0.3);
1573
+ }
1574
+
1575
+ /* Nested tool blocks - reset padding for consistency */
1576
+ .task-group-children .bash-block,
1577
+ .task-group-children .grep-block,
1578
+ .task-group-children .glob-block,
1579
+ .task-group-children .read-block,
1580
+ .task-group-children .write-block,
1581
+ .task-group-children .edit-diff {
1582
+ border-radius: 0;
1583
+ border-left: none;
1584
+ }