@gokulvenkatareddy/cortex 0.1.7

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 (299) hide show
  1. package/README.md +1295 -0
  2. package/apps/octogent/.github/workflows/ci.yml +40 -0
  3. package/apps/octogent/.shims/claude +4 -0
  4. package/apps/octogent/AGENTS.md +71 -0
  5. package/apps/octogent/CONTRIBUTING.md +72 -0
  6. package/apps/octogent/LICENSE +21 -0
  7. package/apps/octogent/README.md +184 -0
  8. package/apps/octogent/apps/api/AGENTS.md +32 -0
  9. package/apps/octogent/apps/api/package.json +19 -0
  10. package/apps/octogent/apps/api/src/agentStateDetection.ts +181 -0
  11. package/apps/octogent/apps/api/src/claudeSessionScanner.ts +235 -0
  12. package/apps/octogent/apps/api/src/claudeSkills.ts +182 -0
  13. package/apps/octogent/apps/api/src/claudeUsage.ts +922 -0
  14. package/apps/octogent/apps/api/src/cli.ts +595 -0
  15. package/apps/octogent/apps/api/src/codeIntelStore.ts +46 -0
  16. package/apps/octogent/apps/api/src/codexUsage.ts +278 -0
  17. package/apps/octogent/apps/api/src/createApiServer/codeIntelRoutes.ts +60 -0
  18. package/apps/octogent/apps/api/src/createApiServer/conversationRoutes.ts +128 -0
  19. package/apps/octogent/apps/api/src/createApiServer/deckRoutes.ts +873 -0
  20. package/apps/octogent/apps/api/src/createApiServer/gitParsers.ts +140 -0
  21. package/apps/octogent/apps/api/src/createApiServer/gitRoutes.ts +214 -0
  22. package/apps/octogent/apps/api/src/createApiServer/miscRoutes.ts +316 -0
  23. package/apps/octogent/apps/api/src/createApiServer/monitorParsers.ts +137 -0
  24. package/apps/octogent/apps/api/src/createApiServer/monitorRoutes.ts +95 -0
  25. package/apps/octogent/apps/api/src/createApiServer/requestHandler.ts +311 -0
  26. package/apps/octogent/apps/api/src/createApiServer/requestParsers.ts +25 -0
  27. package/apps/octogent/apps/api/src/createApiServer/routeHelpers.ts +97 -0
  28. package/apps/octogent/apps/api/src/createApiServer/security.ts +70 -0
  29. package/apps/octogent/apps/api/src/createApiServer/terminalParsers.ts +167 -0
  30. package/apps/octogent/apps/api/src/createApiServer/terminalRoutes.ts +315 -0
  31. package/apps/octogent/apps/api/src/createApiServer/types.ts +24 -0
  32. package/apps/octogent/apps/api/src/createApiServer/uiStateParsers.ts +255 -0
  33. package/apps/octogent/apps/api/src/createApiServer/upgradeHandler.ts +38 -0
  34. package/apps/octogent/apps/api/src/createApiServer/usageRoutes.ts +84 -0
  35. package/apps/octogent/apps/api/src/createApiServer.ts +176 -0
  36. package/apps/octogent/apps/api/src/deck/readDeckTentacles.ts +595 -0
  37. package/apps/octogent/apps/api/src/githubRepoSummary.ts +397 -0
  38. package/apps/octogent/apps/api/src/logging.ts +9 -0
  39. package/apps/octogent/apps/api/src/monitor/defaults.ts +3 -0
  40. package/apps/octogent/apps/api/src/monitor/index.ts +8 -0
  41. package/apps/octogent/apps/api/src/monitor/repository.ts +303 -0
  42. package/apps/octogent/apps/api/src/monitor/service.ts +349 -0
  43. package/apps/octogent/apps/api/src/monitor/types.ts +120 -0
  44. package/apps/octogent/apps/api/src/monitor/xProvider.ts +587 -0
  45. package/apps/octogent/apps/api/src/projectPersistence.ts +377 -0
  46. package/apps/octogent/apps/api/src/prompts/index.ts +10 -0
  47. package/apps/octogent/apps/api/src/prompts/promptResolver.ts +145 -0
  48. package/apps/octogent/apps/api/src/runtimeMetadata.ts +69 -0
  49. package/apps/octogent/apps/api/src/server.ts +80 -0
  50. package/apps/octogent/apps/api/src/setupState.ts +80 -0
  51. package/apps/octogent/apps/api/src/setupStatus.ts +174 -0
  52. package/apps/octogent/apps/api/src/startupPrerequisites.ts +146 -0
  53. package/apps/octogent/apps/api/src/terminalRuntime/channelMessaging.ts +87 -0
  54. package/apps/octogent/apps/api/src/terminalRuntime/claudeTranscript.ts +279 -0
  55. package/apps/octogent/apps/api/src/terminalRuntime/constants.ts +15 -0
  56. package/apps/octogent/apps/api/src/terminalRuntime/conversations.ts +492 -0
  57. package/apps/octogent/apps/api/src/terminalRuntime/gitOperations.ts +341 -0
  58. package/apps/octogent/apps/api/src/terminalRuntime/hookProcessor.ts +405 -0
  59. package/apps/octogent/apps/api/src/terminalRuntime/protocol.ts +46 -0
  60. package/apps/octogent/apps/api/src/terminalRuntime/ptyEnvironment.ts +50 -0
  61. package/apps/octogent/apps/api/src/terminalRuntime/registry.ts +423 -0
  62. package/apps/octogent/apps/api/src/terminalRuntime/sessionRuntime.ts +671 -0
  63. package/apps/octogent/apps/api/src/terminalRuntime/systemClients.ts +432 -0
  64. package/apps/octogent/apps/api/src/terminalRuntime/types.ts +157 -0
  65. package/apps/octogent/apps/api/src/terminalRuntime/worktreeManager.ts +135 -0
  66. package/apps/octogent/apps/api/src/terminalRuntime.ts +567 -0
  67. package/apps/octogent/apps/api/src/usageUtils.ts +16 -0
  68. package/apps/octogent/apps/api/src/ws-shim.d.ts +28 -0
  69. package/apps/octogent/apps/api/tests/agentStateDetection.test.ts +67 -0
  70. package/apps/octogent/apps/api/tests/claudeUsage.test.ts +583 -0
  71. package/apps/octogent/apps/api/tests/codexUsage.test.ts +107 -0
  72. package/apps/octogent/apps/api/tests/createApiServer.test.ts +3207 -0
  73. package/apps/octogent/apps/api/tests/githubRepoSummary.test.ts +100 -0
  74. package/apps/octogent/apps/api/tests/logging.test.ts +33 -0
  75. package/apps/octogent/apps/api/tests/monitorApi.test.ts +467 -0
  76. package/apps/octogent/apps/api/tests/monitorCore.test.ts +104 -0
  77. package/apps/octogent/apps/api/tests/promptResolver.test.ts +109 -0
  78. package/apps/octogent/apps/api/tests/protocol.test.ts +14 -0
  79. package/apps/octogent/apps/api/tests/sessionRuntime.test.ts +608 -0
  80. package/apps/octogent/apps/api/tests/startupPrerequisites.test.ts +70 -0
  81. package/apps/octogent/apps/api/tests/upgradeHandler.test.ts +40 -0
  82. package/apps/octogent/apps/api/tests/xMonitorProvider.test.ts +109 -0
  83. package/apps/octogent/apps/api/tsconfig.json +7 -0
  84. package/apps/octogent/apps/api/vitest.config.ts +7 -0
  85. package/apps/octogent/apps/web/AGENTS.md +38 -0
  86. package/apps/octogent/apps/web/index.html +13 -0
  87. package/apps/octogent/apps/web/package.json +32 -0
  88. package/apps/octogent/apps/web/public/octopus-favicon.svg +26 -0
  89. package/apps/octogent/apps/web/src/App.tsx +646 -0
  90. package/apps/octogent/apps/web/src/app/canvas/types.ts +34 -0
  91. package/apps/octogent/apps/web/src/app/codeIntelAggregation.ts +278 -0
  92. package/apps/octogent/apps/web/src/app/constants.ts +28 -0
  93. package/apps/octogent/apps/web/src/app/conversationNormalizers.ts +135 -0
  94. package/apps/octogent/apps/web/src/app/formatTimestamp.ts +18 -0
  95. package/apps/octogent/apps/web/src/app/githubMetrics.ts +76 -0
  96. package/apps/octogent/apps/web/src/app/githubNormalizers.ts +91 -0
  97. package/apps/octogent/apps/web/src/app/hooks/useAgentRuntimeStates.ts +18 -0
  98. package/apps/octogent/apps/web/src/app/hooks/useBackendLivenessPolling.ts +53 -0
  99. package/apps/octogent/apps/web/src/app/hooks/useCanvasGraphData.ts +449 -0
  100. package/apps/octogent/apps/web/src/app/hooks/useCanvasTransform.ts +260 -0
  101. package/apps/octogent/apps/web/src/app/hooks/useClaudeUsagePolling.ts +40 -0
  102. package/apps/octogent/apps/web/src/app/hooks/useClickOutside.ts +30 -0
  103. package/apps/octogent/apps/web/src/app/hooks/useCodeIntelRuntime.ts +83 -0
  104. package/apps/octogent/apps/web/src/app/hooks/useCodexUsagePolling.ts +35 -0
  105. package/apps/octogent/apps/web/src/app/hooks/useConsoleKeyboardShortcuts.ts +31 -0
  106. package/apps/octogent/apps/web/src/app/hooks/useConversationsRuntime.ts +377 -0
  107. package/apps/octogent/apps/web/src/app/hooks/useForceSimulation.ts +319 -0
  108. package/apps/octogent/apps/web/src/app/hooks/useGitHubPrimaryViewModel.ts +143 -0
  109. package/apps/octogent/apps/web/src/app/hooks/useGithubSummaryPolling.ts +28 -0
  110. package/apps/octogent/apps/web/src/app/hooks/useInitialColumnsHydration.ts +64 -0
  111. package/apps/octogent/apps/web/src/app/hooks/useMonitorRuntime.ts +220 -0
  112. package/apps/octogent/apps/web/src/app/hooks/usePersistedUiState.ts +536 -0
  113. package/apps/octogent/apps/web/src/app/hooks/usePollingData.ts +79 -0
  114. package/apps/octogent/apps/web/src/app/hooks/usePromptLibrary.ts +185 -0
  115. package/apps/octogent/apps/web/src/app/hooks/useTentacleGitLifecycle.ts +530 -0
  116. package/apps/octogent/apps/web/src/app/hooks/useTerminalCompletionNotification.ts +94 -0
  117. package/apps/octogent/apps/web/src/app/hooks/useTerminalMutations.ts +266 -0
  118. package/apps/octogent/apps/web/src/app/hooks/useTerminalStateReconciliation.ts +23 -0
  119. package/apps/octogent/apps/web/src/app/hooks/useUsageHeatmapPolling.ts +43 -0
  120. package/apps/octogent/apps/web/src/app/hooks/useWorkspaceSetup.ts +80 -0
  121. package/apps/octogent/apps/web/src/app/hotkeys.ts +31 -0
  122. package/apps/octogent/apps/web/src/app/monitorNormalizers.ts +145 -0
  123. package/apps/octogent/apps/web/src/app/notificationSounds.ts +164 -0
  124. package/apps/octogent/apps/web/src/app/terminalRuntimeStateStore.ts +261 -0
  125. package/apps/octogent/apps/web/src/app/terminalState.ts +21 -0
  126. package/apps/octogent/apps/web/src/app/types.ts +42 -0
  127. package/apps/octogent/apps/web/src/app/uiStateNormalizers.ts +113 -0
  128. package/apps/octogent/apps/web/src/app/usageNormalizers.ts +58 -0
  129. package/apps/octogent/apps/web/src/components/ActiveAgentsSidebar.tsx +60 -0
  130. package/apps/octogent/apps/web/src/components/ActivityPrimaryView.tsx +21 -0
  131. package/apps/octogent/apps/web/src/components/AgentStateBadge.tsx +47 -0
  132. package/apps/octogent/apps/web/src/components/CanvasPrimaryView.tsx +1532 -0
  133. package/apps/octogent/apps/web/src/components/ClearAllConversationsDialog.tsx +33 -0
  134. package/apps/octogent/apps/web/src/components/CodeIntelArcDiagram.tsx +245 -0
  135. package/apps/octogent/apps/web/src/components/CodeIntelPrimaryView.tsx +104 -0
  136. package/apps/octogent/apps/web/src/components/CodeIntelTreemap.tsx +138 -0
  137. package/apps/octogent/apps/web/src/components/ConsolePrimaryNav.tsx +31 -0
  138. package/apps/octogent/apps/web/src/components/ConversationsPrimaryView.tsx +243 -0
  139. package/apps/octogent/apps/web/src/components/DeckPrimaryView.tsx +613 -0
  140. package/apps/octogent/apps/web/src/components/DeleteTentacleDialog.tsx +91 -0
  141. package/apps/octogent/apps/web/src/components/EmptyOctopus.tsx +715 -0
  142. package/apps/octogent/apps/web/src/components/GitHubPrimaryView.tsx +494 -0
  143. package/apps/octogent/apps/web/src/components/MonitorPrimaryView.tsx +475 -0
  144. package/apps/octogent/apps/web/src/components/PrimaryViewRouter.tsx +99 -0
  145. package/apps/octogent/apps/web/src/components/PromptsPrimaryView.tsx +243 -0
  146. package/apps/octogent/apps/web/src/components/RuntimeStatusStrip.tsx +273 -0
  147. package/apps/octogent/apps/web/src/components/SettingsPrimaryView.tsx +92 -0
  148. package/apps/octogent/apps/web/src/components/SidebarActionPanel.tsx +124 -0
  149. package/apps/octogent/apps/web/src/components/SidebarConversationsList.tsx +279 -0
  150. package/apps/octogent/apps/web/src/components/SidebarPromptsList.tsx +116 -0
  151. package/apps/octogent/apps/web/src/components/TelemetryTape.tsx +106 -0
  152. package/apps/octogent/apps/web/src/components/TentacleGitActionsDialog.tsx +341 -0
  153. package/apps/octogent/apps/web/src/components/Terminal.tsx +524 -0
  154. package/apps/octogent/apps/web/src/components/TerminalPromptPicker.tsx +140 -0
  155. package/apps/octogent/apps/web/src/components/UsageHeatmap.tsx +702 -0
  156. package/apps/octogent/apps/web/src/components/canvas/CanvasTentaclePanel.tsx +485 -0
  157. package/apps/octogent/apps/web/src/components/canvas/CanvasTerminalColumn.tsx +89 -0
  158. package/apps/octogent/apps/web/src/components/canvas/DeleteAllTerminalsDialog.tsx +221 -0
  159. package/apps/octogent/apps/web/src/components/canvas/OctopusNode.tsx +307 -0
  160. package/apps/octogent/apps/web/src/components/canvas/SessionNode.tsx +185 -0
  161. package/apps/octogent/apps/web/src/components/deck/ActionCards.tsx +118 -0
  162. package/apps/octogent/apps/web/src/components/deck/AddTentacleForm.tsx +269 -0
  163. package/apps/octogent/apps/web/src/components/deck/DeckBottomActions.tsx +56 -0
  164. package/apps/octogent/apps/web/src/components/deck/TentaclePod.tsx +334 -0
  165. package/apps/octogent/apps/web/src/components/deck/WorkspaceSetupCard.tsx +105 -0
  166. package/apps/octogent/apps/web/src/components/deck/octopusVisuals.ts +72 -0
  167. package/apps/octogent/apps/web/src/components/terminalReplay.ts +62 -0
  168. package/apps/octogent/apps/web/src/components/terminalWheel.ts +54 -0
  169. package/apps/octogent/apps/web/src/components/ui/ActionButton.tsx +34 -0
  170. package/apps/octogent/apps/web/src/components/ui/ConfirmationDialog.tsx +86 -0
  171. package/apps/octogent/apps/web/src/components/ui/MarkdownContent.tsx +43 -0
  172. package/apps/octogent/apps/web/src/components/ui/SettingsToggle.tsx +34 -0
  173. package/apps/octogent/apps/web/src/components/ui/StatusBadge.tsx +24 -0
  174. package/apps/octogent/apps/web/src/main.tsx +17 -0
  175. package/apps/octogent/apps/web/src/runtime/HttpTerminalSnapshotReader.ts +87 -0
  176. package/apps/octogent/apps/web/src/runtime/runtimeEndpoints.ts +412 -0
  177. package/apps/octogent/apps/web/src/styles/chrome-and-buttons.css +272 -0
  178. package/apps/octogent/apps/web/src/styles/console-canvas-activity.css +358 -0
  179. package/apps/octogent/apps/web/src/styles/console-canvas-canvas.css +1843 -0
  180. package/apps/octogent/apps/web/src/styles/console-canvas-code-intel.css +227 -0
  181. package/apps/octogent/apps/web/src/styles/console-canvas-conversations.css +705 -0
  182. package/apps/octogent/apps/web/src/styles/console-canvas-deck.css +1524 -0
  183. package/apps/octogent/apps/web/src/styles/console-canvas-github.css +541 -0
  184. package/apps/octogent/apps/web/src/styles/console-canvas-monitor.css +595 -0
  185. package/apps/octogent/apps/web/src/styles/console-canvas-pixpack.css +81 -0
  186. package/apps/octogent/apps/web/src/styles/console-canvas-prompts.css +474 -0
  187. package/apps/octogent/apps/web/src/styles/console-canvas-settings.css +207 -0
  188. package/apps/octogent/apps/web/src/styles/console-chrome-status-nav.css +441 -0
  189. package/apps/octogent/apps/web/src/styles/console-overrides-telemetry.css +320 -0
  190. package/apps/octogent/apps/web/src/styles/console-theme-tokens.css +25 -0
  191. package/apps/octogent/apps/web/src/styles/cortex-theme.css +412 -0
  192. package/apps/octogent/apps/web/src/styles/foundation.css +100 -0
  193. package/apps/octogent/apps/web/src/styles/sidebar-and-scrollbars.css +447 -0
  194. package/apps/octogent/apps/web/src/styles/terminal-and-status.css +356 -0
  195. package/apps/octogent/apps/web/src/styles.css +25 -0
  196. package/apps/octogent/apps/web/src/types/ws.d.ts +23 -0
  197. package/apps/octogent/apps/web/tests/CanvasPrimaryView.test.tsx +347 -0
  198. package/apps/octogent/apps/web/tests/HttpTerminalSnapshotReader.test.tsx +54 -0
  199. package/apps/octogent/apps/web/tests/RuntimeStatusStrip.test.tsx +70 -0
  200. package/apps/octogent/apps/web/tests/Terminal.test.tsx +87 -0
  201. package/apps/octogent/apps/web/tests/add-tentacle-form.test.tsx +48 -0
  202. package/apps/octogent/apps/web/tests/app-github-runtime.test.tsx +162 -0
  203. package/apps/octogent/apps/web/tests/app-monitor-runtime.test.tsx +657 -0
  204. package/apps/octogent/apps/web/tests/app-shell-navigation.test.tsx +109 -0
  205. package/apps/octogent/apps/web/tests/app-swarm-refresh.test.tsx +268 -0
  206. package/apps/octogent/apps/web/tests/app-ui-state-persistence.test.tsx +116 -0
  207. package/apps/octogent/apps/web/tests/app-workspace-setup.test.tsx +217 -0
  208. package/apps/octogent/apps/web/tests/canvas-tentacle-panel.test.tsx +195 -0
  209. package/apps/octogent/apps/web/tests/delete-all-terminals-dialog.test.tsx +76 -0
  210. package/apps/octogent/apps/web/tests/githubMetrics.test.tsx +52 -0
  211. package/apps/octogent/apps/web/tests/hotkeys.test.tsx +44 -0
  212. package/apps/octogent/apps/web/tests/runtimeEndpoints.test.tsx +240 -0
  213. package/apps/octogent/apps/web/tests/setup.ts +39 -0
  214. package/apps/octogent/apps/web/tests/tentacle-pod.test.tsx +62 -0
  215. package/apps/octogent/apps/web/tests/terminalReplay.test.ts +71 -0
  216. package/apps/octogent/apps/web/tests/terminalState.test.tsx +49 -0
  217. package/apps/octogent/apps/web/tests/terminalWheel.test.tsx +51 -0
  218. package/apps/octogent/apps/web/tests/test-utils/appTestHarness.ts +48 -0
  219. package/apps/octogent/apps/web/tests/uiPrimitives.test.tsx +31 -0
  220. package/apps/octogent/apps/web/tests/useAgentRuntimeStates.test.tsx +47 -0
  221. package/apps/octogent/apps/web/tsconfig.json +8 -0
  222. package/apps/octogent/apps/web/vite.api.bundle.config.mts +32 -0
  223. package/apps/octogent/apps/web/vite.config.ts +22 -0
  224. package/apps/octogent/bin/octogent +3 -0
  225. package/apps/octogent/biome.json +21 -0
  226. package/apps/octogent/docs/concepts/mental-model.md +79 -0
  227. package/apps/octogent/docs/concepts/runtime-and-api.md +60 -0
  228. package/apps/octogent/docs/concepts/tentacles.md +85 -0
  229. package/apps/octogent/docs/getting-started/installation.md +54 -0
  230. package/apps/octogent/docs/getting-started/quickstart.md +79 -0
  231. package/apps/octogent/docs/guides/inter-agent-messaging.md +43 -0
  232. package/apps/octogent/docs/guides/orchestrating-child-agents.md +49 -0
  233. package/apps/octogent/docs/guides/working-with-todos.md +56 -0
  234. package/apps/octogent/docs/index.md +40 -0
  235. package/apps/octogent/docs/reference/api.md +103 -0
  236. package/apps/octogent/docs/reference/cli.md +71 -0
  237. package/apps/octogent/docs/reference/experimental-features.md +28 -0
  238. package/apps/octogent/docs/reference/filesystem-layout.md +62 -0
  239. package/apps/octogent/docs/reference/troubleshooting.md +49 -0
  240. package/apps/octogent/package.json +35 -0
  241. package/apps/octogent/packages/core/AGENTS.md +31 -0
  242. package/apps/octogent/packages/core/package.json +12 -0
  243. package/apps/octogent/packages/core/src/adapters/InMemoryTerminalSnapshotReader.ts +10 -0
  244. package/apps/octogent/packages/core/src/application/buildTerminalList.ts +13 -0
  245. package/apps/octogent/packages/core/src/domain/agentRuntime.ts +18 -0
  246. package/apps/octogent/packages/core/src/domain/channel.ts +8 -0
  247. package/apps/octogent/packages/core/src/domain/completionSound.ts +14 -0
  248. package/apps/octogent/packages/core/src/domain/conversation.ts +48 -0
  249. package/apps/octogent/packages/core/src/domain/deck.ts +33 -0
  250. package/apps/octogent/packages/core/src/domain/git.ts +32 -0
  251. package/apps/octogent/packages/core/src/domain/monitor.ts +62 -0
  252. package/apps/octogent/packages/core/src/domain/setup.ts +27 -0
  253. package/apps/octogent/packages/core/src/domain/terminal.ts +17 -0
  254. package/apps/octogent/packages/core/src/domain/uiState.ts +22 -0
  255. package/apps/octogent/packages/core/src/domain/usage.ts +60 -0
  256. package/apps/octogent/packages/core/src/index.ts +15 -0
  257. package/apps/octogent/packages/core/src/ports/TerminalSnapshotReader.ts +5 -0
  258. package/apps/octogent/packages/core/src/util/typeCoercion.ts +20 -0
  259. package/apps/octogent/packages/core/tests/buildTerminalList.test.ts +75 -0
  260. package/apps/octogent/packages/core/tsconfig.json +7 -0
  261. package/apps/octogent/packages/core/tsconfig.tsbuildinfo +1 -0
  262. package/apps/octogent/packages/core/vitest.config.ts +7 -0
  263. package/apps/octogent/pnpm-lock.yaml +3212 -0
  264. package/apps/octogent/pnpm-workspace.yaml +3 -0
  265. package/apps/octogent/prompts/meta-prompt-generator.md +223 -0
  266. package/apps/octogent/prompts/octoboss-clean-contexts.md +30 -0
  267. package/apps/octogent/prompts/octoboss-reorganize-tentacles.md +29 -0
  268. package/apps/octogent/prompts/octoboss-reorganize-todos.md +27 -0
  269. package/apps/octogent/prompts/sandbox-init.md +3 -0
  270. package/apps/octogent/prompts/swarm-parent.md +83 -0
  271. package/apps/octogent/prompts/swarm-worker.md +50 -0
  272. package/apps/octogent/prompts/tentacle-context-init.md +1 -0
  273. package/apps/octogent/prompts/tentacle-planner.md +110 -0
  274. package/apps/octogent/prompts/tentacle-reorganize-todos.md +20 -0
  275. package/apps/octogent/prompts/tentacle-update-tentacle.md +18 -0
  276. package/apps/octogent/scripts/build-package.mjs +23 -0
  277. package/apps/octogent/scripts/dev.mjs +158 -0
  278. package/apps/octogent/scripts/smoke-public-install.mjs +271 -0
  279. package/apps/octogent/static/images/octogent-header.png +0 -0
  280. package/apps/octogent/static/images/preview_1.jpg +0 -0
  281. package/apps/octogent/static/images/preview_2.jpg +0 -0
  282. package/apps/octogent/static/images/preview_3.jpg +0 -0
  283. package/apps/octogent/static/images/preview_4.jpg +0 -0
  284. package/apps/octogent/static/images/preview_5.jpg +0 -0
  285. package/apps/octogent/static/images/preview_6.jpg +0 -0
  286. package/apps/octogent/tsconfig.base.json +16 -0
  287. package/bin/AGI +3 -0
  288. package/bin/AGI-install-app +71 -0
  289. package/bin/AGI-ui +16 -0
  290. package/bin/AGI-voice +15 -0
  291. package/bin/AGI-web +16 -0
  292. package/bin/cortex +109 -0
  293. package/bin/cortex-octogent +99 -0
  294. package/bin/import-specifier.mjs +13 -0
  295. package/bin/import-specifier.test.mjs +13 -0
  296. package/bin/octo +150 -0
  297. package/dist/cli.mjs +555650 -0
  298. package/package.json +157 -0
  299. package/scripts/setup-wizard.ts +390 -0
@@ -0,0 +1,1843 @@
1
+ /* Canvas tab — force-directed graph view (Obsidian-style) */
2
+
3
+ .console-shell .canvas-view {
4
+ position: relative;
5
+ min-height: 0;
6
+ display: flex;
7
+ flex: 1;
8
+ overflow: hidden;
9
+ background-color: #0a0e14;
10
+ background-image: radial-gradient(#1a2030 1.5px, transparent 1.5px);
11
+ background-size: 24px 24px;
12
+ }
13
+
14
+ .canvas-svg {
15
+ width: 100%;
16
+ height: 100%;
17
+ display: block;
18
+ cursor: default;
19
+ user-select: none;
20
+ touch-action: none;
21
+ }
22
+
23
+ .canvas-svg.canvas-svg--panning {
24
+ cursor: grabbing;
25
+ }
26
+
27
+ /* ─── Edges ─────────────────────────────────────────────────────────────────── */
28
+
29
+ .canvas-edge {
30
+ stroke-linecap: round;
31
+ pointer-events: none;
32
+ }
33
+
34
+ .canvas-edge-activity-dot {
35
+ pointer-events: none;
36
+ filter: drop-shadow(0 0 4px rgba(255, 232, 168, 0.95))
37
+ drop-shadow(0 0 10px rgba(255, 163, 44, 0.9)) drop-shadow(0 0 18px rgba(255, 112, 43, 0.7));
38
+ }
39
+
40
+ .canvas-edge-activity-dot--trail {
41
+ filter: blur(1.4px) drop-shadow(0 0 10px rgba(255, 163, 44, 0.6))
42
+ drop-shadow(0 0 18px rgba(255, 112, 43, 0.45));
43
+ }
44
+
45
+ /* ─── Node labels — hidden by default, visible on hover ─────────────────────── */
46
+
47
+ .canvas-node-label {
48
+ font-family: "PP Neue Machina Plain", sans-serif;
49
+ font-size: 11px;
50
+ pointer-events: none;
51
+ user-select: none;
52
+ opacity: 0;
53
+ transition: opacity 0.2s ease;
54
+ }
55
+
56
+ .canvas-node:hover .canvas-node-label,
57
+ .canvas-node--selected .canvas-node-label {
58
+ opacity: 1;
59
+ }
60
+
61
+ .canvas-node-label--terminal {
62
+ font-size: 15px;
63
+ font-weight: 700;
64
+ }
65
+
66
+ .canvas-node-label--always {
67
+ opacity: 1;
68
+ }
69
+
70
+ /* ─── Node glow bloom animation ─────────────────────────────────────────────── */
71
+
72
+ .canvas-node-bloom {
73
+ pointer-events: none;
74
+ }
75
+
76
+ .canvas-node-bloom--pulse {
77
+ animation: canvas-bloom-pulse 3s ease-in-out infinite;
78
+ }
79
+
80
+ @keyframes canvas-bloom-pulse {
81
+ 0%,
82
+ 100% {
83
+ opacity: 0.35;
84
+ }
85
+ 50% {
86
+ opacity: 0.65;
87
+ }
88
+ }
89
+
90
+ /* ─── Focused node glow ────────────────────────────────────────────────────── */
91
+
92
+ .canvas-node-focus-glow {
93
+ pointer-events: none;
94
+ filter: blur(5px);
95
+ animation: canvas-focus-glow-breathe 3s ease-in-out infinite;
96
+ }
97
+
98
+ @keyframes canvas-focus-glow-breathe {
99
+ 0%,
100
+ 100% {
101
+ opacity: 0.5;
102
+ }
103
+ 50% {
104
+ opacity: 0.7;
105
+ }
106
+ }
107
+
108
+ /* ─── Node interactivity ───────────────────────────────────────────────────── */
109
+
110
+ .canvas-node--terminal {
111
+ cursor: grab;
112
+ }
113
+
114
+ .canvas-node--terminal:active {
115
+ cursor: grabbing;
116
+ }
117
+
118
+ .canvas-node--session {
119
+ cursor: pointer;
120
+ }
121
+
122
+ .canvas-node--session:hover .canvas-node-core {
123
+ r: attr(r + 2);
124
+ }
125
+
126
+ /* ─── Node type rings (worktree / swarm) ─────────────────────────────────── */
127
+
128
+ .canvas-node-ring {
129
+ pointer-events: none;
130
+ }
131
+
132
+ .canvas-node-ring--worktree {
133
+ stroke-width: 1.5;
134
+ stroke-dasharray: 4 3;
135
+ opacity: 0.7;
136
+ }
137
+
138
+ .canvas-node-ring--swarm {
139
+ stroke-width: 1;
140
+ opacity: 0.5;
141
+ }
142
+
143
+ .canvas-node-ring--swarm-outer {
144
+ stroke-width: 1;
145
+ opacity: 0.3;
146
+ }
147
+
148
+ /* ─── Waiting indicator on session nodes ──────────────────────────────────── */
149
+
150
+ .canvas-node-waiting-pill {
151
+ fill: #f59e0b;
152
+ opacity: 0.9;
153
+ animation: canvas-waiting-pill-pulse 1.5s ease-in-out infinite;
154
+ }
155
+
156
+ @keyframes canvas-waiting-pill-pulse {
157
+ 0%,
158
+ 100% {
159
+ opacity: 0.75;
160
+ }
161
+ 50% {
162
+ opacity: 1;
163
+ }
164
+ }
165
+
166
+ .canvas-node-waiting-label {
167
+ font-family: "PP Neue Machina Plain", sans-serif;
168
+ font-size: 9px;
169
+ font-weight: 700;
170
+ fill: #0a0e14;
171
+ pointer-events: none;
172
+ user-select: none;
173
+ }
174
+
175
+ /* ─── Waiting notification bars (below toolbar) ──────────────────────────── */
176
+
177
+ .canvas-waiting-list {
178
+ position: absolute;
179
+ left: 16px;
180
+ top: 72px;
181
+ z-index: 10;
182
+ display: flex;
183
+ flex-direction: column;
184
+ gap: 4px;
185
+ max-width: 240px;
186
+ }
187
+
188
+ .canvas-waiting-bar {
189
+ display: flex;
190
+ align-items: center;
191
+ gap: 6px;
192
+ padding: 5px 10px;
193
+ border: none;
194
+ border-radius: 6px;
195
+ background: #f59e0b;
196
+ color: #0a0e14;
197
+ font-family: "PP Neue Machina Plain", sans-serif;
198
+ font-size: 11px;
199
+ font-weight: 600;
200
+ cursor: pointer;
201
+ line-height: 1.2;
202
+ text-align: left;
203
+ transition: opacity 0.15s ease;
204
+ }
205
+
206
+ .canvas-waiting-bar:hover {
207
+ opacity: 0.85;
208
+ }
209
+
210
+ .canvas-waiting-bar-name {
211
+ overflow: hidden;
212
+ text-overflow: ellipsis;
213
+ white-space: nowrap;
214
+ }
215
+
216
+ .canvas-waiting-bar-prefix {
217
+ opacity: 0.7;
218
+ }
219
+
220
+ /* ─── Canvas toolbar (top-left action buttons) ───────────────────────────── */
221
+
222
+ .canvas-toolbar {
223
+ position: absolute;
224
+ left: 16px;
225
+ top: 16px;
226
+ z-index: 10;
227
+ display: flex;
228
+ align-items: stretch;
229
+ gap: 2px;
230
+ padding: 4px;
231
+ border: 1px solid #2b2f36;
232
+ border-radius: 8px;
233
+ background: #0d1017ee;
234
+ backdrop-filter: blur(6px);
235
+ }
236
+
237
+ .canvas-setup-overlay {
238
+ position: absolute;
239
+ top: 16px;
240
+ right: 16px;
241
+ z-index: 12;
242
+ width: min(720px, calc(100% - 32px));
243
+ max-height: calc(100% - 32px);
244
+ overflow-y: auto;
245
+ padding-right: 4px;
246
+ }
247
+
248
+ .canvas-toolbar-btn {
249
+ display: flex;
250
+ flex-direction: column;
251
+ align-items: center;
252
+ justify-content: center;
253
+ gap: 2px;
254
+ padding: 5px 8px;
255
+ border: 1px solid transparent;
256
+ border-radius: 6px;
257
+ background: none;
258
+ color: #9ca3af;
259
+ font-family: "PP Neue Machina Plain", sans-serif;
260
+ cursor: pointer;
261
+ line-height: 1;
262
+ transition: background 0.15s ease, color 0.15s ease, border-color 0.15s ease;
263
+ }
264
+
265
+ .canvas-toolbar-btn:hover {
266
+ background: #2b3040;
267
+ border-color: #4b5563;
268
+ color: #e5e7eb;
269
+ }
270
+
271
+ .canvas-toolbar-btn:active {
272
+ background: #3b4252;
273
+ }
274
+
275
+ .canvas-toolbar-btn--active {
276
+ background: color-mix(in srgb, var(--accent-primary) 20%, transparent);
277
+ border-color: var(--accent-primary);
278
+ color: var(--accent-primary);
279
+ }
280
+
281
+ .canvas-toolbar-btn--active:hover {
282
+ background: color-mix(in srgb, var(--accent-primary) 30%, transparent);
283
+ color: var(--accent-primary);
284
+ }
285
+
286
+ .canvas-toolbar-icon {
287
+ display: inline-flex;
288
+ align-items: center;
289
+ justify-content: center;
290
+ font-size: 15px;
291
+ line-height: 1;
292
+ }
293
+
294
+ .canvas-toolbar-label {
295
+ font-size: 9px;
296
+ font-weight: 600;
297
+ letter-spacing: 0.04em;
298
+ text-transform: uppercase;
299
+ white-space: nowrap;
300
+ line-height: 1;
301
+ }
302
+
303
+ .canvas-toolbar-separator {
304
+ width: 1px;
305
+ align-self: stretch;
306
+ margin: 4px 2px;
307
+ background: #2b2f36;
308
+ }
309
+
310
+ /* ─── Force tuner panel (top-left) ─────────────────────────────────────────── */
311
+
312
+ .canvas-tuner-toggle {
313
+ position: absolute;
314
+ left: 16px;
315
+ top: 16px;
316
+ z-index: 10;
317
+ display: flex;
318
+ align-items: center;
319
+ justify-content: center;
320
+ width: 32px;
321
+ height: 32px;
322
+ border: 1px solid #4b5563;
323
+ border-radius: 6px;
324
+ background: #2b3040;
325
+ color: #e5e7eb;
326
+ font-size: 16px;
327
+ cursor: pointer;
328
+ transition: background 0.15s ease;
329
+ }
330
+
331
+ .canvas-tuner-toggle:hover {
332
+ background: #3b4252;
333
+ border-color: #6b7280;
334
+ }
335
+
336
+ .canvas-tuner {
337
+ position: absolute;
338
+ left: 16px;
339
+ top: 56px;
340
+ z-index: 10;
341
+ width: 240px;
342
+ padding: 10px 12px;
343
+ border: 1px solid #2b2f36;
344
+ border-radius: 6px;
345
+ background: #0d1017ee;
346
+ display: flex;
347
+ flex-direction: column;
348
+ gap: 6px;
349
+ }
350
+
351
+ .canvas-tuner-title {
352
+ font-family: "PP Neue Machina Plain", sans-serif;
353
+ font-size: 11px;
354
+ text-transform: uppercase;
355
+ letter-spacing: 0.06em;
356
+ color: #6b7280;
357
+ margin-bottom: 2px;
358
+ }
359
+
360
+ .canvas-tuner-row {
361
+ display: grid;
362
+ grid-template-columns: 72px 1fr 48px;
363
+ align-items: center;
364
+ gap: 6px;
365
+ }
366
+
367
+ .canvas-tuner-label {
368
+ font-family: "PP Neue Machina Plain", sans-serif;
369
+ font-size: 11px;
370
+ color: #c8cdd5;
371
+ }
372
+
373
+ .canvas-tuner-slider {
374
+ width: 100%;
375
+ height: 4px;
376
+ appearance: none;
377
+ background: #2b3040;
378
+ border-radius: 2px;
379
+ outline: none;
380
+ cursor: pointer;
381
+ }
382
+
383
+ .canvas-tuner-slider::-webkit-slider-thumb {
384
+ appearance: none;
385
+ width: 12px;
386
+ height: 12px;
387
+ background: #ff6b2b;
388
+ border-radius: 50%;
389
+ cursor: pointer;
390
+ }
391
+
392
+ .canvas-tuner-value {
393
+ font-family: monospace;
394
+ font-size: 10px;
395
+ color: #6b7280;
396
+ text-align: right;
397
+ }
398
+
399
+ .canvas-tuner-reset {
400
+ margin-top: 4px;
401
+ padding: 4px 0;
402
+ border: 1px solid #4b5563;
403
+ border-radius: 4px;
404
+ background: #2b3040;
405
+ color: #c8cdd5;
406
+ font-family: "PP Neue Machina Plain", sans-serif;
407
+ font-size: 11px;
408
+ cursor: pointer;
409
+ transition: background 0.15s ease;
410
+ }
411
+
412
+ .canvas-tuner-reset:hover {
413
+ background: #3b4252;
414
+ }
415
+
416
+ /* ─── Zoom controls (bottom-right) ─────────────────────────────────────────── */
417
+
418
+ .canvas-controls {
419
+ position: absolute;
420
+ right: 16px;
421
+ bottom: 16px;
422
+ display: flex;
423
+ flex-direction: column;
424
+ gap: 4px;
425
+ z-index: 10;
426
+ }
427
+
428
+ .canvas-control-btn {
429
+ display: flex;
430
+ align-items: center;
431
+ justify-content: center;
432
+ width: 32px;
433
+ height: 32px;
434
+ border: 1px solid #4b5563;
435
+ border-radius: 6px;
436
+ background: #2b3040;
437
+ color: #e5e7eb;
438
+ font-size: 16px;
439
+ font-family: "PP Neue Machina Plain", sans-serif;
440
+ cursor: pointer;
441
+ line-height: 1;
442
+ transition: background 0.15s ease;
443
+ }
444
+
445
+ .canvas-control-btn:hover {
446
+ background: #3b4252;
447
+ border-color: #6b7280;
448
+ }
449
+
450
+ .canvas-control-btn:active {
451
+ background: #4b5563;
452
+ }
453
+
454
+ .canvas-control-btn--fit {
455
+ font-size: 14px;
456
+ }
457
+
458
+ /* ─── Split layout: graph panel + terminals panel ──────────────────────────── */
459
+
460
+ .canvas-graph-panel {
461
+ position: relative;
462
+ flex: 1;
463
+ min-height: 0;
464
+ overflow: hidden;
465
+ }
466
+
467
+ .canvas-graph-panel--split {
468
+ flex: 3 1 0;
469
+ min-width: 300px;
470
+ }
471
+
472
+ .canvas-panel-divider {
473
+ flex: 0 0 6px;
474
+ cursor: col-resize;
475
+ border-left: 1px solid #2b2f36;
476
+ border-right: 1px solid #11151b;
477
+ background: linear-gradient(180deg, #141920, #0b0f15);
478
+ }
479
+
480
+ .canvas-panel-divider:focus-visible {
481
+ outline: 1px solid var(--accent-primary);
482
+ outline-offset: -1px;
483
+ }
484
+
485
+ .canvas-terminals-panel {
486
+ flex: 7 1 0;
487
+ display: flex;
488
+ flex-direction: row;
489
+ min-height: 0;
490
+ overflow-x: auto;
491
+ overflow-y: hidden;
492
+ background: #0a0e14;
493
+ }
494
+
495
+ /* ─── Terminal skeleton loading ───────────────────────────────────────────── */
496
+
497
+ .canvas-terminal-skeleton {
498
+ flex: 1 0 370px;
499
+ display: flex;
500
+ flex-direction: column;
501
+ background: #0a0e14;
502
+ border-left: 1px solid var(--border-subtle);
503
+ }
504
+
505
+ .canvas-terminal-skeleton__header {
506
+ height: 32px;
507
+ background: #151b24;
508
+ border-bottom: 1px solid var(--border-subtle);
509
+ }
510
+
511
+ .canvas-terminal-skeleton__body {
512
+ flex: 1;
513
+ padding: 16px;
514
+ display: flex;
515
+ flex-direction: column;
516
+ gap: 10px;
517
+ }
518
+
519
+ .canvas-terminal-skeleton__line {
520
+ height: 12px;
521
+ background: #151b24;
522
+ border-radius: 3px;
523
+ animation: skeleton-pulse 1.2s ease-in-out infinite;
524
+ }
525
+
526
+ @keyframes skeleton-pulse {
527
+ 0%,
528
+ 100% {
529
+ opacity: 0.3;
530
+ }
531
+ 50% {
532
+ opacity: 0.6;
533
+ }
534
+ }
535
+
536
+ /* ─── Individual terminal column in the panel ──────────────────────────────── */
537
+
538
+ .canvas-terminal-column {
539
+ flex: 1 0 370px;
540
+ display: grid;
541
+ grid-template-rows: auto minmax(0, 1fr);
542
+ overflow: hidden;
543
+ border-left: 1px solid var(--border-subtle);
544
+ container-type: inline-size;
545
+ }
546
+
547
+ .canvas-terminal-column:first-child {
548
+ border-left: none;
549
+ }
550
+
551
+ .canvas-terminal-column-header {
552
+ display: flex;
553
+ align-items: center;
554
+ gap: 0.45rem;
555
+ padding: 0.3rem 0.45rem;
556
+ background: linear-gradient(
557
+ 180deg,
558
+ color-mix(in srgb, var(--accent-primary) 90%, #ffd89d 10%) 0%,
559
+ color-mix(in srgb, var(--accent-primary) 78%, #d9851c 22%) 100%
560
+ );
561
+ border-bottom-color: color-mix(in srgb, #121212 35%, transparent);
562
+ color: #121212;
563
+ user-select: none;
564
+ }
565
+
566
+ .canvas-terminal-column-heading {
567
+ flex: 1 1 0;
568
+ min-width: 0;
569
+ overflow: hidden;
570
+ }
571
+
572
+ .canvas-terminal-column-heading h2 {
573
+ display: flex;
574
+ align-items: center;
575
+ gap: 6px;
576
+ margin: 0;
577
+ min-width: 0;
578
+ max-width: 100%;
579
+ overflow: hidden;
580
+ font-family: var(--font-main);
581
+ font-size: 0.75rem;
582
+ font-weight: 700;
583
+ line-height: 1.25;
584
+ letter-spacing: 0.08em;
585
+ text-transform: uppercase;
586
+ color: inherit;
587
+ }
588
+
589
+ .canvas-terminal-column-name {
590
+ overflow: hidden;
591
+ text-overflow: ellipsis;
592
+ white-space: nowrap;
593
+ }
594
+
595
+ .canvas-terminal-column-tentacle-tag {
596
+ font-family: var(--font-main);
597
+ font-size: 0.65rem;
598
+ font-weight: 800;
599
+ letter-spacing: 0.06em;
600
+ text-transform: uppercase;
601
+ padding: 2px 5px;
602
+ border-radius: 0;
603
+ border: 1.5px solid #121212;
604
+ color: #121212;
605
+ white-space: nowrap;
606
+ overflow: hidden;
607
+ text-overflow: ellipsis;
608
+ max-width: 160px;
609
+ }
610
+
611
+ .canvas-terminal-column-badge {
612
+ font-size: 0.55rem;
613
+ font-weight: 800;
614
+ letter-spacing: 0.06em;
615
+ padding: 1px 4px;
616
+ border-radius: 3px;
617
+ background: rgba(0, 0, 0, 0.2);
618
+ color: inherit;
619
+ }
620
+
621
+ .canvas-terminal-column-actions {
622
+ display: flex;
623
+ align-items: center;
624
+ gap: 6px;
625
+ min-width: 0;
626
+ }
627
+
628
+ .canvas-terminal-column-close {
629
+ background: none;
630
+ border: none;
631
+ color: inherit;
632
+ font-size: 16px;
633
+ font-weight: 700;
634
+ cursor: pointer;
635
+ padding: 0 0.25rem;
636
+ line-height: 1;
637
+ flex: 0 0 auto;
638
+ }
639
+
640
+ .canvas-terminal-column-close:hover {
641
+ color: #000;
642
+ }
643
+
644
+ .canvas-terminal-column-body {
645
+ min-height: 0;
646
+ display: flex;
647
+ flex-direction: column;
648
+ overflow: hidden;
649
+ }
650
+
651
+ .canvas-terminal-column-body .terminal-pane {
652
+ min-height: 0;
653
+ flex: 1 1 auto;
654
+ display: flex;
655
+ flex-direction: column;
656
+ }
657
+
658
+ .canvas-terminal-column-body .terminal-header {
659
+ display: none;
660
+ }
661
+
662
+ .canvas-terminal-column-body .terminal-mount {
663
+ flex: 1 1 auto;
664
+ min-height: 0;
665
+ }
666
+
667
+ .canvas-terminal-column-body .terminal-mount .xterm {
668
+ height: 100%;
669
+ }
670
+
671
+ .canvas-terminal-column-body .terminal-mount .xterm-viewport {
672
+ height: 100% !important;
673
+ }
674
+
675
+ .canvas-terminal-column-actions .status-badge,
676
+ .canvas-terminal-column-actions .canvas-terminal-column-tentacle-tag {
677
+ min-width: 0;
678
+ }
679
+
680
+ @container (max-width: 460px) {
681
+ .canvas-terminal-column-tentacle-tag {
682
+ display: none;
683
+ }
684
+ }
685
+
686
+ @container (max-width: 410px) {
687
+ .canvas-terminal-column-actions .status-badge {
688
+ padding-inline: 0.26rem;
689
+ }
690
+
691
+ .canvas-terminal-column-actions .status-badge__full {
692
+ display: none;
693
+ }
694
+
695
+ .canvas-terminal-column-actions .status-badge__compact {
696
+ display: inline;
697
+ }
698
+ }
699
+
700
+ /* ─── Context menu ──────────────────────────────────────────────────────── */
701
+
702
+ .canvas-context-menu-backdrop {
703
+ position: fixed;
704
+ inset: 0;
705
+ z-index: 29;
706
+ }
707
+
708
+ .canvas-context-menu {
709
+ position: fixed;
710
+ z-index: 30;
711
+ min-width: 140px;
712
+ border: 1px solid var(--border-subtle);
713
+ border-radius: 4px;
714
+ background: var(--bg-surface-1);
715
+ box-shadow: 0 6px 24px rgba(0, 0, 0, 0.5);
716
+ padding: 4px 0;
717
+ display: flex;
718
+ flex-direction: column;
719
+ }
720
+
721
+ .canvas-context-menu-icon {
722
+ display: inline-flex;
723
+ align-items: center;
724
+ justify-content: center;
725
+ width: 1.4em;
726
+ margin-right: 8px;
727
+ opacity: 0.7;
728
+ flex-shrink: 0;
729
+ font-size: 1.1rem;
730
+ }
731
+
732
+ .canvas-context-menu-item:hover:not(:disabled) .canvas-context-menu-icon {
733
+ opacity: 1;
734
+ }
735
+
736
+ .canvas-context-menu-item {
737
+ border: none;
738
+ background: none;
739
+ color: var(--text-primary);
740
+ font-family: var(--font-main);
741
+ font-size: 0.65rem;
742
+ font-weight: 600;
743
+ letter-spacing: 0.04em;
744
+ text-transform: uppercase;
745
+ text-align: left;
746
+ padding: 0.4rem 0.7rem;
747
+ cursor: pointer;
748
+ display: flex;
749
+ align-items: center;
750
+ }
751
+
752
+ .canvas-context-menu-item:hover:not(:disabled) {
753
+ background: color-mix(in srgb, var(--accent-primary) 25%, transparent);
754
+ color: var(--accent-primary);
755
+ }
756
+
757
+ .canvas-context-menu-item--danger:hover:not(:disabled) {
758
+ background: color-mix(in srgb, #ef4444 25%, transparent);
759
+ color: #ef4444;
760
+ }
761
+
762
+ .canvas-context-menu-item:disabled {
763
+ opacity: 0.35;
764
+ cursor: not-allowed;
765
+ }
766
+
767
+ /* ─── Detail panel (MiroFish-style, right side) ───────────────────────────── */
768
+
769
+ .detail-panel {
770
+ flex: 1 0 280px;
771
+ display: flex;
772
+ flex-direction: column;
773
+ min-height: 0;
774
+ container-type: inline-size;
775
+ background: #111720;
776
+ border-left: 1px solid rgba(255, 255, 255, 0.08);
777
+ font-family: var(--font-main);
778
+ font-size: 13px;
779
+ color: #cdd6e4;
780
+ overflow: hidden;
781
+ transition: border-color 0.2s;
782
+ }
783
+
784
+ .detail-panel--focused {
785
+ border-left-color: var(--accent-primary);
786
+ box-shadow: inset 1px 0 0 var(--accent-primary);
787
+ }
788
+
789
+ .detail-panel:first-child {
790
+ border-left: none;
791
+ }
792
+
793
+ .detail-panel--focused:first-child {
794
+ border-left: 1px solid var(--accent-primary);
795
+ box-shadow: inset 1px 0 0 var(--accent-primary);
796
+ }
797
+
798
+ .detail-panel-header {
799
+ display: flex;
800
+ align-items: center;
801
+ gap: 0.45rem;
802
+ padding: 0.3rem 0.45rem;
803
+ border-bottom-color: color-mix(in srgb, #121212 35%, transparent);
804
+ color: #121212;
805
+ user-select: none;
806
+ flex-shrink: 0;
807
+ }
808
+
809
+ .detail-title {
810
+ flex: 1 1 0;
811
+ min-width: 0;
812
+ overflow: hidden;
813
+ text-overflow: ellipsis;
814
+ white-space: nowrap;
815
+ font-family: var(--font-main);
816
+ font-size: 0.75rem;
817
+ font-weight: 700;
818
+ line-height: 1.25;
819
+ letter-spacing: 0.08em;
820
+ text-transform: uppercase;
821
+ color: inherit;
822
+ }
823
+
824
+ .detail-type-badge {
825
+ font-family: var(--font-main);
826
+ font-size: 0.65rem;
827
+ font-weight: 800;
828
+ letter-spacing: 0.06em;
829
+ text-transform: uppercase;
830
+ padding: 2px 5px;
831
+ border-radius: 0;
832
+ border: 1.5px solid #121212;
833
+ color: #121212;
834
+ white-space: nowrap;
835
+ }
836
+
837
+ .detail-close {
838
+ background: none;
839
+ border: none;
840
+ color: inherit;
841
+ font-size: 16px;
842
+ font-weight: 800;
843
+ cursor: pointer;
844
+ padding: 0 0.25rem;
845
+ line-height: 1;
846
+ flex-shrink: 0;
847
+ transition: transform 0.12s ease, filter 0.12s ease, text-shadow 0.12s ease;
848
+ }
849
+
850
+ .detail-close:hover {
851
+ filter: brightness(1.08);
852
+ transform: translateY(-1px);
853
+ text-shadow: 0 0 10px color-mix(in srgb, var(--accent-primary) 45%, transparent);
854
+ }
855
+
856
+ .detail-close:active {
857
+ transform: translateY(0);
858
+ }
859
+
860
+ .detail-content {
861
+ padding: 16px;
862
+ overflow-y: auto;
863
+ flex: 1;
864
+ }
865
+
866
+ .detail-identity {
867
+ display: flex;
868
+ gap: 14px;
869
+ align-items: flex-start;
870
+ margin-bottom: 4px;
871
+ }
872
+
873
+ .detail-glyph {
874
+ flex-shrink: 0;
875
+ }
876
+
877
+ .detail-identity-info {
878
+ flex: 1;
879
+ min-width: 0;
880
+ }
881
+
882
+ .detail-name {
883
+ font-size: 18px;
884
+ font-weight: 700;
885
+ color: #e6edf3;
886
+ margin-bottom: 8px;
887
+ word-break: break-word;
888
+ line-height: 1.3;
889
+ }
890
+
891
+ /* Stack identity vertically when panel is narrow */
892
+ @container (max-width: 340px) {
893
+ .detail-identity {
894
+ flex-direction: column;
895
+ align-items: center;
896
+ text-align: center;
897
+ gap: 10px;
898
+ }
899
+
900
+ .detail-identity-info {
901
+ width: 100%;
902
+ text-align: left;
903
+ }
904
+
905
+ .detail-row {
906
+ flex-direction: column;
907
+ gap: 2px;
908
+ }
909
+
910
+ .detail-label {
911
+ min-width: unset;
912
+ }
913
+ }
914
+
915
+ .detail-row {
916
+ margin-bottom: 10px;
917
+ display: flex;
918
+ flex-wrap: wrap;
919
+ gap: 4px;
920
+ }
921
+
922
+ .detail-label {
923
+ color: #6b7280;
924
+ font-size: 12px;
925
+ font-weight: 500;
926
+ min-width: 80px;
927
+ }
928
+
929
+ .detail-value {
930
+ color: #cdd6e4;
931
+ flex: 1;
932
+ word-break: break-word;
933
+ line-height: 1.4;
934
+ }
935
+
936
+ .detail-value--mono {
937
+ font-family: monospace;
938
+ font-size: 11px;
939
+ color: #8b949e;
940
+ }
941
+
942
+ .detail-section {
943
+ margin-top: 14px;
944
+ padding-top: 12px;
945
+ border-top: 1px solid rgba(255, 255, 255, 0.06);
946
+ }
947
+
948
+ .detail-section-title {
949
+ font-size: 11px;
950
+ font-weight: 600;
951
+ color: #8b949e;
952
+ margin-bottom: 10px;
953
+ text-transform: uppercase;
954
+ letter-spacing: 0.06em;
955
+ }
956
+
957
+ .detail-empty {
958
+ font-size: 12px;
959
+ color: #484f58;
960
+ font-style: italic;
961
+ }
962
+
963
+ .detail-progress {
964
+ display: flex;
965
+ align-items: center;
966
+ gap: 10px;
967
+ margin-bottom: 10px;
968
+ }
969
+
970
+ .detail-progress-bar {
971
+ flex: 1;
972
+ height: 4px;
973
+ border-radius: 2px;
974
+ background: #21262d;
975
+ overflow: hidden;
976
+ }
977
+
978
+ .detail-progress-fill {
979
+ height: 100%;
980
+ border-radius: 2px;
981
+ transition: width 0.3s ease;
982
+ }
983
+
984
+ .detail-progress-label {
985
+ font-size: 11px;
986
+ font-weight: 600;
987
+ color: #8b949e;
988
+ flex-shrink: 0;
989
+ }
990
+
991
+ .detail-todos {
992
+ list-style: none;
993
+ margin: 0;
994
+ padding: 0;
995
+ display: flex;
996
+ flex-direction: column;
997
+ gap: 2px;
998
+ }
999
+
1000
+ .detail-todo {
1001
+ display: flex;
1002
+ align-items: center;
1003
+ gap: 8px;
1004
+ font-size: 12px;
1005
+ color: #cdd6e4;
1006
+ padding: 5px 6px;
1007
+ border-radius: 4px;
1008
+ transition: background 0.1s;
1009
+ }
1010
+
1011
+ .detail-todo-controls {
1012
+ display: inline-flex;
1013
+ align-items: center;
1014
+ gap: 8px;
1015
+ flex-shrink: 0;
1016
+ }
1017
+
1018
+ .detail-todo:hover {
1019
+ background: rgba(255, 255, 255, 0.03);
1020
+ }
1021
+
1022
+ .detail-todo--done {
1023
+ opacity: 0.4;
1024
+ text-decoration: line-through;
1025
+ }
1026
+
1027
+ .detail-todo input[type="checkbox"] {
1028
+ flex-shrink: 0;
1029
+ accent-color: var(--accent-primary);
1030
+ }
1031
+
1032
+ .detail-todo-text {
1033
+ flex: 1;
1034
+ min-width: 0;
1035
+ cursor: text;
1036
+ }
1037
+
1038
+ .detail-todo-edit-input {
1039
+ flex: 1;
1040
+ min-width: 0;
1041
+ background: #161b22;
1042
+ border: 1px solid rgba(255, 255, 255, 0.12);
1043
+ border-radius: 3px;
1044
+ color: #cdd6e4;
1045
+ font-family: var(--font-main);
1046
+ font-size: 12px;
1047
+ padding: 2px 6px;
1048
+ outline: none;
1049
+ }
1050
+
1051
+ .detail-todo-edit-input:focus {
1052
+ border-color: var(--accent-primary);
1053
+ }
1054
+
1055
+ .detail-todo-solve,
1056
+ .detail-todo-delete {
1057
+ background: none;
1058
+ border: none;
1059
+ font-size: 14px;
1060
+ font-weight: 700;
1061
+ cursor: pointer;
1062
+ padding: 0 2px;
1063
+ line-height: 1;
1064
+ flex-shrink: 0;
1065
+ transition: opacity 0.1s, color 0.1s;
1066
+ }
1067
+
1068
+ .detail-todo-solve {
1069
+ display: inline-flex;
1070
+ align-items: center;
1071
+ justify-content: center;
1072
+ color: var(--accent-primary);
1073
+ min-width: 18px;
1074
+ padding: 0;
1075
+ opacity: 1;
1076
+ transition: transform 0.12s ease, filter 0.12s ease, text-shadow 0.12s ease;
1077
+ }
1078
+
1079
+ .detail-todo:hover .detail-todo-solve,
1080
+ .detail-todo:hover .detail-todo-delete {
1081
+ opacity: 1;
1082
+ }
1083
+
1084
+ .detail-todo-solve:hover {
1085
+ filter: brightness(1.08);
1086
+ transform: translateY(-1px);
1087
+ text-shadow: 0 0 10px color-mix(in srgb, var(--accent-primary) 45%, transparent);
1088
+ }
1089
+
1090
+ .detail-todo-solve:active {
1091
+ transform: translateY(0);
1092
+ }
1093
+
1094
+ .detail-todo-solve:disabled {
1095
+ cursor: default;
1096
+ opacity: 0.45;
1097
+ filter: saturate(0.45);
1098
+ text-shadow: none;
1099
+ }
1100
+
1101
+ .detail-todo-solve svg {
1102
+ display: block;
1103
+ overflow: visible;
1104
+ }
1105
+
1106
+ .detail-todo-delete {
1107
+ color: var(--accent-primary);
1108
+ opacity: 1;
1109
+ }
1110
+
1111
+ .detail-todo-delete:hover {
1112
+ color: var(--term-red, #ff6b6b);
1113
+ transform: translateY(-1px);
1114
+ }
1115
+
1116
+ .detail-todo-add-row {
1117
+ padding: 4px 6px;
1118
+ }
1119
+
1120
+ .detail-todo-add-btn {
1121
+ background: none;
1122
+ border: none;
1123
+ color: #484f58;
1124
+ font-family: var(--font-main);
1125
+ font-size: 11px;
1126
+ cursor: pointer;
1127
+ padding: 6px 6px;
1128
+ transition: color 0.15s;
1129
+ }
1130
+
1131
+ .detail-todo-add-btn:hover {
1132
+ color: var(--accent-primary);
1133
+ }
1134
+
1135
+ .detail-labels-list {
1136
+ display: flex;
1137
+ flex-wrap: wrap;
1138
+ gap: 6px;
1139
+ }
1140
+
1141
+ .detail-label-tag {
1142
+ display: inline-block;
1143
+ padding: 4px 10px;
1144
+ background: #21262d;
1145
+ border: 1px solid rgba(255, 255, 255, 0.08);
1146
+ border-radius: 14px;
1147
+ font-size: 11px;
1148
+ color: #8b949e;
1149
+ max-width: 100%;
1150
+ overflow: hidden;
1151
+ text-overflow: ellipsis;
1152
+ white-space: nowrap;
1153
+ }
1154
+
1155
+ .detail-sessions {
1156
+ display: flex;
1157
+ flex-direction: column;
1158
+ gap: 4px;
1159
+ max-height: 260px;
1160
+ overflow-y: auto;
1161
+ }
1162
+
1163
+ .detail-session-item {
1164
+ width: 100%;
1165
+ display: flex;
1166
+ flex-direction: column;
1167
+ gap: 3px;
1168
+ padding: 8px 10px;
1169
+ border: 1px solid transparent;
1170
+ border-radius: 6px;
1171
+ background: #161b22;
1172
+ color: #cdd6e4;
1173
+ font-family: var(--font-main);
1174
+ font-size: 12px;
1175
+ text-align: left;
1176
+ cursor: pointer;
1177
+ transition: background 0.15s, border-color 0.15s;
1178
+ }
1179
+
1180
+ .detail-session-item:hover {
1181
+ background: #1c2129;
1182
+ border-color: rgba(255, 255, 255, 0.06);
1183
+ }
1184
+
1185
+ .detail-session-preview {
1186
+ overflow: hidden;
1187
+ text-overflow: ellipsis;
1188
+ white-space: nowrap;
1189
+ font-weight: 500;
1190
+ }
1191
+
1192
+ .detail-session-meta {
1193
+ font-size: 11px;
1194
+ color: #484f58;
1195
+ }
1196
+
1197
+ .detail-actions {
1198
+ display: flex;
1199
+ gap: 6px;
1200
+ }
1201
+
1202
+ /* Stack action buttons when narrow */
1203
+ @container (max-width: 380px) {
1204
+ .detail-actions {
1205
+ flex-direction: column;
1206
+ }
1207
+ }
1208
+
1209
+ .detail-action-btn {
1210
+ flex: 1;
1211
+ display: flex;
1212
+ align-items: center;
1213
+ justify-content: center;
1214
+ gap: 8px;
1215
+ padding: 9px 12px;
1216
+ border: 1px solid rgba(255, 255, 255, 0.08);
1217
+ border-radius: 6px;
1218
+ background: #161b22;
1219
+ color: #cdd6e4;
1220
+ font-family: var(--font-main);
1221
+ font-size: 12px;
1222
+ font-weight: 500;
1223
+ cursor: pointer;
1224
+ white-space: nowrap;
1225
+ transition: background 0.15s, border-color 0.15s, color 0.15s;
1226
+ }
1227
+
1228
+ .detail-action-btn:hover {
1229
+ background: #1c2129;
1230
+ border-color: var(--accent-primary);
1231
+ color: var(--accent-primary);
1232
+ }
1233
+
1234
+ /* ── Delete confirmation dialog (bottom-left corner) ── */
1235
+
1236
+ .canvas-delete-dialog {
1237
+ position: absolute;
1238
+ bottom: 16px;
1239
+ left: 16px;
1240
+ z-index: 60;
1241
+ width: 340px;
1242
+ max-width: calc(100% - 32px);
1243
+ }
1244
+
1245
+ /* ── Danger toolbar button (subtle until hovered) ── */
1246
+
1247
+ .canvas-toolbar-btn--danger:hover {
1248
+ background: color-mix(in srgb, #ef4444 10%, transparent);
1249
+ border-color: #6b3030;
1250
+ color: #e5a0a0;
1251
+ }
1252
+
1253
+ /* ── Delete-all mode toggle ── */
1254
+
1255
+ .delete-all-mode-row {
1256
+ display: flex;
1257
+ align-items: center;
1258
+ justify-content: space-between;
1259
+ padding: 0.5rem 0;
1260
+ }
1261
+
1262
+ .delete-all-mode-label {
1263
+ font-size: 0.78rem;
1264
+ font-weight: 600;
1265
+ color: #d0d0d0;
1266
+ letter-spacing: 0.04em;
1267
+ text-transform: uppercase;
1268
+ }
1269
+
1270
+ .delete-all-toggle-switch {
1271
+ position: relative;
1272
+ width: 2.35rem;
1273
+ height: 1.22rem;
1274
+ border: 1px solid #333333;
1275
+ border-radius: 999px;
1276
+ background: #0a0a0a;
1277
+ display: inline-flex;
1278
+ align-items: center;
1279
+ padding: 0.1rem;
1280
+ cursor: pointer;
1281
+ transition: background-color 120ms ease, border-color 120ms ease;
1282
+ }
1283
+
1284
+ .delete-all-toggle-switch:disabled {
1285
+ opacity: 0.5;
1286
+ cursor: not-allowed;
1287
+ }
1288
+
1289
+ .delete-all-toggle-thumb {
1290
+ display: block;
1291
+ width: 0.9rem;
1292
+ height: 0.9rem;
1293
+ border-radius: 999px;
1294
+ border: 1px solid #444444;
1295
+ background: #888888;
1296
+ transform: translateX(0);
1297
+ transition: transform 120ms ease, background-color 120ms ease, border-color 120ms ease;
1298
+ }
1299
+
1300
+ .delete-all-toggle-switch[aria-checked="true"] {
1301
+ border-color: color-mix(in srgb, var(--accent-primary) 60%, #333333);
1302
+ background: color-mix(in srgb, var(--accent-primary) 12%, #0a0a0a);
1303
+ }
1304
+
1305
+ .delete-all-toggle-switch[aria-checked="true"] .delete-all-toggle-thumb {
1306
+ transform: translateX(1.08rem);
1307
+ background: var(--accent-primary);
1308
+ border-color: color-mix(in srgb, var(--accent-primary) 80%, #3a3526);
1309
+ }
1310
+
1311
+ .delete-all-details div {
1312
+ gap: 0.5rem;
1313
+ }
1314
+
1315
+ .delete-all-progress {
1316
+ font-size: 0.78rem;
1317
+ color: #9ca3af;
1318
+ padding-top: 0.25rem;
1319
+ }
1320
+
1321
+ /* ── Delete confirmation dialog (shared inner styles — Bloomberg terminal) ── */
1322
+
1323
+ .delete-confirm-dialog {
1324
+ width: 100%;
1325
+ border: 1px solid var(--accent-primary);
1326
+ background: #000000;
1327
+ box-shadow: 0 0 0 1px color-mix(in srgb, var(--accent-primary) 30%, #000000), 0 0 16px
1328
+ color-mix(in srgb, var(--accent-primary) 12%, transparent);
1329
+ }
1330
+
1331
+ .delete-confirm-header {
1332
+ display: flex;
1333
+ align-items: center;
1334
+ justify-content: space-between;
1335
+ gap: 0.5rem;
1336
+ padding: 0.42rem 0.56rem;
1337
+ border-bottom: 1px solid color-mix(in srgb, var(--accent-primary) 50%, #1a1a1a);
1338
+ background: var(--accent-primary);
1339
+ }
1340
+
1341
+ .delete-confirm-header h2 {
1342
+ margin: 0;
1343
+ color: #000000;
1344
+ font-family: var(--font-main);
1345
+ font-weight: 700;
1346
+ font-size: 0.66rem;
1347
+ text-transform: uppercase;
1348
+ letter-spacing: 0.1em;
1349
+ line-height: 1.2;
1350
+ }
1351
+
1352
+ .delete-confirm-header-actions {
1353
+ display: inline-flex;
1354
+ align-items: center;
1355
+ gap: 0.32rem;
1356
+ }
1357
+
1358
+ .delete-confirm-body {
1359
+ display: grid;
1360
+ gap: 0.5rem;
1361
+ padding: 0.72rem 0.56rem 0.5rem;
1362
+ }
1363
+
1364
+ .delete-confirm-message {
1365
+ margin: 0;
1366
+ color: var(--accent-primary);
1367
+ font-size: 0.74rem;
1368
+ line-height: 1.4;
1369
+ }
1370
+
1371
+ .delete-confirm-message strong {
1372
+ color: #ffffff;
1373
+ }
1374
+
1375
+ .delete-confirm-warning {
1376
+ margin: 0;
1377
+ border: 1px solid color-mix(in srgb, #ff4444 40%, #333333);
1378
+ background: color-mix(in srgb, #ff4444 8%, #0a0000);
1379
+ color: #ff6b6b;
1380
+ padding: 0.32rem 0.42rem;
1381
+ text-transform: uppercase;
1382
+ letter-spacing: 0.06em;
1383
+ font-size: 0.6rem;
1384
+ font-weight: 600;
1385
+ }
1386
+
1387
+ .delete-confirm-details {
1388
+ margin: 0;
1389
+ display: grid;
1390
+ gap: 0;
1391
+ border: 1px solid color-mix(in srgb, var(--accent-primary) 28%, #1a1a1a);
1392
+ background: #050505;
1393
+ }
1394
+
1395
+ .delete-confirm-details div {
1396
+ display: flex;
1397
+ align-items: baseline;
1398
+ gap: 0.5rem;
1399
+ padding: 0.3rem 0.42rem;
1400
+ border-bottom: 1px solid color-mix(in srgb, var(--accent-primary) 16%, #1a1a1a);
1401
+ }
1402
+
1403
+ .delete-confirm-details div:last-child {
1404
+ border-bottom: 0;
1405
+ }
1406
+
1407
+ .delete-confirm-details dt {
1408
+ margin: 0;
1409
+ white-space: nowrap;
1410
+ color: color-mix(in srgb, var(--accent-primary) 70%, #999999);
1411
+ text-transform: uppercase;
1412
+ letter-spacing: 0.06em;
1413
+ font-size: 0.58rem;
1414
+ font-weight: 600;
1415
+ }
1416
+
1417
+ .delete-confirm-details dd {
1418
+ margin: 0;
1419
+ color: #ffffff;
1420
+ font-size: 0.7rem;
1421
+ line-height: 1.2;
1422
+ font-variant-numeric: tabular-nums;
1423
+ word-break: break-word;
1424
+ }
1425
+
1426
+ .delete-confirm-typed-check {
1427
+ display: grid;
1428
+ gap: 0.32rem;
1429
+ }
1430
+
1431
+ .delete-confirm-typed-check label {
1432
+ color: color-mix(in srgb, var(--accent-primary) 70%, #999999);
1433
+ text-transform: uppercase;
1434
+ letter-spacing: 0.06em;
1435
+ font-size: 0.58rem;
1436
+ font-weight: 600;
1437
+ }
1438
+
1439
+ .delete-confirm-typed-check input {
1440
+ border: 1px solid color-mix(in srgb, var(--accent-primary) 30%, #1a1a1a);
1441
+ background: #050505;
1442
+ color: #ffffff;
1443
+ font-family: var(--font-main);
1444
+ font-size: 0.72rem;
1445
+ letter-spacing: 0.03em;
1446
+ padding: 0.34rem 0.42rem;
1447
+ }
1448
+
1449
+ .delete-confirm-typed-check input:focus-visible {
1450
+ outline: 1px solid var(--accent-primary);
1451
+ outline-offset: -1px;
1452
+ }
1453
+
1454
+ .delete-confirm-actions {
1455
+ display: flex;
1456
+ justify-content: flex-end;
1457
+ gap: 0.42rem;
1458
+ padding: 0 0.56rem 0.56rem;
1459
+ }
1460
+
1461
+ .delete-confirm-cancel,
1462
+ .delete-confirm-submit {
1463
+ --action-button-padding-y: 0.22rem;
1464
+ --action-button-padding-x: 0.4rem;
1465
+ --action-button-letter-spacing: 0.07em;
1466
+ }
1467
+
1468
+ /* ── Git actions dialog (Bloomberg terminal style) ── */
1469
+
1470
+ .git-actions-dialog {
1471
+ width: 100%;
1472
+ border: 1px solid var(--accent-primary);
1473
+ background: #000000;
1474
+ box-shadow: 0 0 0 1px color-mix(in srgb, var(--accent-primary) 30%, #000000), 0 0 16px
1475
+ color-mix(in srgb, var(--accent-primary) 12%, transparent);
1476
+ }
1477
+
1478
+ .git-actions-header {
1479
+ display: flex;
1480
+ align-items: center;
1481
+ justify-content: space-between;
1482
+ gap: 0.5rem;
1483
+ padding: 0.42rem 0.56rem;
1484
+ border-bottom: 1px solid color-mix(in srgb, var(--accent-primary) 50%, #1a1a1a);
1485
+ background: var(--accent-primary);
1486
+ }
1487
+
1488
+ .git-actions-header h2 {
1489
+ margin: 0;
1490
+ color: #000000;
1491
+ font-family: var(--font-main);
1492
+ font-weight: 700;
1493
+ font-size: 0.66rem;
1494
+ text-transform: uppercase;
1495
+ letter-spacing: 0.1em;
1496
+ line-height: 1.2;
1497
+ }
1498
+
1499
+ .git-actions-header-actions {
1500
+ display: inline-flex;
1501
+ align-items: center;
1502
+ gap: 0.32rem;
1503
+ }
1504
+
1505
+ .git-actions-worktree-badge {
1506
+ border-color: color-mix(in srgb, var(--accent-primary) 60%, #333333);
1507
+ background: color-mix(in srgb, var(--accent-primary) 80%, #1a1a1a);
1508
+ color: #000000;
1509
+ }
1510
+
1511
+ .git-actions-body {
1512
+ display: grid;
1513
+ gap: 0.55rem;
1514
+ padding: 0.72rem 0.56rem 0.5rem;
1515
+ }
1516
+
1517
+ .git-actions-message {
1518
+ margin: 0;
1519
+ color: var(--accent-primary);
1520
+ font-size: 0.74rem;
1521
+ line-height: 1.4;
1522
+ }
1523
+
1524
+ .git-actions-message strong {
1525
+ color: #ffffff;
1526
+ }
1527
+
1528
+ .git-actions-loading {
1529
+ margin: 0;
1530
+ color: color-mix(in srgb, var(--accent-primary) 70%, #999999);
1531
+ text-transform: uppercase;
1532
+ letter-spacing: 0.06em;
1533
+ font-size: 0.62rem;
1534
+ }
1535
+
1536
+ .git-actions-status {
1537
+ margin: 0;
1538
+ display: grid;
1539
+ gap: 0;
1540
+ border: 1px solid color-mix(in srgb, var(--accent-primary) 28%, #1a1a1a);
1541
+ background: #050505;
1542
+ }
1543
+
1544
+ .git-actions-status div {
1545
+ display: flex;
1546
+ align-items: baseline;
1547
+ gap: 0.5rem;
1548
+ padding: 0.3rem 0.42rem;
1549
+ border-bottom: 1px solid color-mix(in srgb, var(--accent-primary) 16%, #1a1a1a);
1550
+ }
1551
+
1552
+ .git-actions-status div:last-child {
1553
+ border-bottom: 0;
1554
+ }
1555
+
1556
+ .git-actions-status dt {
1557
+ margin: 0;
1558
+ white-space: nowrap;
1559
+ color: color-mix(in srgb, var(--accent-primary) 70%, #999999);
1560
+ text-transform: uppercase;
1561
+ letter-spacing: 0.06em;
1562
+ font-size: 0.58rem;
1563
+ font-weight: 600;
1564
+ }
1565
+
1566
+ .git-actions-status dd {
1567
+ margin: 0;
1568
+ color: #ffffff;
1569
+ font-size: 0.7rem;
1570
+ line-height: 1.15;
1571
+ font-weight: 600;
1572
+ font-variant-numeric: tabular-nums;
1573
+ word-break: break-word;
1574
+ }
1575
+
1576
+ .git-actions-sync-metric,
1577
+ .git-actions-line-diff-metric {
1578
+ display: inline-flex;
1579
+ align-items: center;
1580
+ gap: 0.14rem;
1581
+ }
1582
+
1583
+ .git-actions-ahead-count,
1584
+ .git-actions-insertions-count {
1585
+ color: #77e4a5;
1586
+ }
1587
+
1588
+ .git-actions-behind-count,
1589
+ .git-actions-deletions-count {
1590
+ color: #ff8f9c;
1591
+ }
1592
+
1593
+ .git-actions-metric-separator {
1594
+ color: color-mix(in srgb, var(--accent-primary) 50%, #666666);
1595
+ }
1596
+
1597
+ .git-actions-commit-label {
1598
+ color: color-mix(in srgb, var(--accent-primary) 70%, #999999);
1599
+ text-transform: uppercase;
1600
+ letter-spacing: 0.06em;
1601
+ font-size: 0.6rem;
1602
+ font-weight: 600;
1603
+ }
1604
+
1605
+ .git-actions-operation-group {
1606
+ display: grid;
1607
+ gap: 0.36rem;
1608
+ }
1609
+
1610
+ .git-actions-commit-panel {
1611
+ display: grid;
1612
+ gap: 0.3rem;
1613
+ border: 1px solid color-mix(in srgb, var(--accent-primary) 28%, #1a1a1a);
1614
+ background: #050505;
1615
+ padding: 0.32rem 0.38rem;
1616
+ }
1617
+
1618
+ .git-actions-message-input {
1619
+ border: 1px solid color-mix(in srgb, var(--accent-primary) 28%, #1a1a1a);
1620
+ background: #000000;
1621
+ color: #ffffff;
1622
+ font-family: var(--font-main);
1623
+ font-size: 0.72rem;
1624
+ line-height: 1.35;
1625
+ letter-spacing: 0.03em;
1626
+ padding: 0.34rem 0.42rem;
1627
+ resize: vertical;
1628
+ }
1629
+
1630
+ .git-actions-message-input:focus-visible {
1631
+ outline: 1px solid var(--accent-primary);
1632
+ outline-offset: -1px;
1633
+ }
1634
+
1635
+ .git-actions-commit-controls {
1636
+ display: grid;
1637
+ grid-template-columns: minmax(0, 1fr) auto;
1638
+ align-items: stretch;
1639
+ width: 100%;
1640
+ position: relative;
1641
+ }
1642
+
1643
+ .console-shell .git-actions-commit-main.action-button {
1644
+ width: 100%;
1645
+ border-right: 0;
1646
+ --action-button-border: color-mix(in srgb, var(--accent-primary) 70%, #333333);
1647
+ --action-button-bg: color-mix(in srgb, var(--accent-primary) 82%, #1a1a1a);
1648
+ --action-button-color: #000000;
1649
+ }
1650
+
1651
+ .console-shell .git-actions-commit-main.action-button:hover:not(:disabled) {
1652
+ --action-button-bg: var(--accent-primary);
1653
+ }
1654
+
1655
+ .git-actions-commit-toggle {
1656
+ border: 1px solid color-mix(in srgb, var(--accent-primary) 70%, #333333);
1657
+ border-left: 0;
1658
+ background: color-mix(in srgb, var(--accent-primary) 82%, #1a1a1a);
1659
+ color: #000000;
1660
+ font-family: var(--font-main);
1661
+ font-size: 0.7rem;
1662
+ letter-spacing: 0.06em;
1663
+ padding: 0 0.42rem;
1664
+ min-width: 1.9rem;
1665
+ }
1666
+
1667
+ .git-actions-commit-toggle:hover:not(:disabled) {
1668
+ background: var(--accent-primary);
1669
+ }
1670
+
1671
+ .git-actions-commit-toggle:disabled {
1672
+ opacity: 0.6;
1673
+ }
1674
+
1675
+ .git-actions-commit-menu {
1676
+ position: absolute;
1677
+ top: calc(100% + 0.2rem);
1678
+ left: 0;
1679
+ right: 0;
1680
+ min-width: 0;
1681
+ border: 1px solid color-mix(in srgb, var(--accent-primary) 45%, #1a1a1a);
1682
+ background: #050505;
1683
+ box-shadow: 0 0 0 1px #000000;
1684
+ z-index: 2;
1685
+ display: grid;
1686
+ }
1687
+
1688
+ .git-actions-commit-menu-item {
1689
+ border: 0;
1690
+ border-bottom: 1px solid color-mix(in srgb, var(--accent-primary) 16%, #1a1a1a);
1691
+ background: transparent;
1692
+ color: var(--accent-primary);
1693
+ font-family: var(--font-main);
1694
+ font-size: 0.66rem;
1695
+ letter-spacing: 0.06em;
1696
+ text-transform: uppercase;
1697
+ text-align: left;
1698
+ padding: 0.3rem 0.42rem;
1699
+ cursor: pointer;
1700
+ }
1701
+
1702
+ .git-actions-commit-menu-item:last-child {
1703
+ border-bottom: 0;
1704
+ }
1705
+
1706
+ .git-actions-commit-menu-item:hover:not(:disabled) {
1707
+ background: color-mix(in srgb, var(--accent-primary) 12%, #000000);
1708
+ }
1709
+
1710
+ .git-actions-commit-menu-item:disabled {
1711
+ color: #444444;
1712
+ cursor: not-allowed;
1713
+ }
1714
+
1715
+ .git-action-row {
1716
+ display: grid;
1717
+ grid-template-columns: minmax(0, 1fr) auto;
1718
+ align-items: start;
1719
+ gap: 0.44rem;
1720
+ border: 1px solid color-mix(in srgb, var(--accent-primary) 28%, #1a1a1a);
1721
+ background: #050505;
1722
+ padding: 0.32rem 0.38rem;
1723
+ }
1724
+
1725
+ .git-action-row--compact {
1726
+ align-items: center;
1727
+ }
1728
+
1729
+ .git-action-row--cleanup {
1730
+ margin-top: 0.1rem;
1731
+ }
1732
+
1733
+ .git-action-content {
1734
+ display: grid;
1735
+ gap: 0.24rem;
1736
+ min-width: 0;
1737
+ }
1738
+
1739
+ .git-action-title {
1740
+ margin: 0;
1741
+ color: var(--accent-primary);
1742
+ text-transform: uppercase;
1743
+ letter-spacing: 0.05em;
1744
+ font-size: 0.61rem;
1745
+ font-weight: 700;
1746
+ }
1747
+
1748
+ .git-action-hint {
1749
+ margin: 0;
1750
+ color: #777777;
1751
+ font-size: 0.64rem;
1752
+ line-height: 1.28;
1753
+ }
1754
+
1755
+ .git-action-reason {
1756
+ margin: 0;
1757
+ color: color-mix(in srgb, var(--accent-primary) 80%, #ffcc00);
1758
+ font-size: 0.62rem;
1759
+ line-height: 1.28;
1760
+ }
1761
+
1762
+ .git-actions-pr-section {
1763
+ display: grid;
1764
+ gap: 0.38rem;
1765
+ border-top: 1px solid color-mix(in srgb, var(--accent-primary) 20%, #1a1a1a);
1766
+ margin-top: 0.22rem;
1767
+ padding-top: 0.52rem;
1768
+ }
1769
+
1770
+ .git-actions-pr-header {
1771
+ display: flex;
1772
+ justify-content: space-between;
1773
+ gap: 0.5rem;
1774
+ align-items: baseline;
1775
+ flex-wrap: wrap;
1776
+ }
1777
+
1778
+ .git-actions-pr-section h3 {
1779
+ margin: 0;
1780
+ color: var(--accent-primary);
1781
+ font-family: var(--font-main);
1782
+ text-transform: uppercase;
1783
+ letter-spacing: 0.06em;
1784
+ font-size: 0.62rem;
1785
+ }
1786
+
1787
+ .git-actions-pr-status {
1788
+ margin: 0;
1789
+ color: #777777;
1790
+ text-transform: uppercase;
1791
+ letter-spacing: 0.05em;
1792
+ font-size: 0.58rem;
1793
+ }
1794
+
1795
+ .git-actions-pr-form-grid {
1796
+ display: grid;
1797
+ gap: 0.36rem;
1798
+ grid-template-columns: minmax(0, 1fr) minmax(0, 130px);
1799
+ }
1800
+
1801
+ .git-actions-pr-body-input {
1802
+ border: 1px solid color-mix(in srgb, var(--accent-primary) 28%, #1a1a1a);
1803
+ background: #000000;
1804
+ color: #ffffff;
1805
+ font-family: var(--font-main);
1806
+ font-size: 0.7rem;
1807
+ line-height: 1.4;
1808
+ letter-spacing: 0.02em;
1809
+ padding: 0.36rem 0.42rem;
1810
+ resize: vertical;
1811
+ }
1812
+
1813
+ .git-actions-pr-body-input:focus-visible {
1814
+ outline: 1px solid var(--accent-primary);
1815
+ outline-offset: -1px;
1816
+ }
1817
+
1818
+ .git-actions-pr-buttons {
1819
+ display: flex;
1820
+ justify-content: flex-start;
1821
+ gap: 0.42rem;
1822
+ flex-wrap: wrap;
1823
+ }
1824
+
1825
+ .git-actions-error {
1826
+ margin: 0;
1827
+ border: 1px solid color-mix(in srgb, #ff4444 40%, #333333);
1828
+ background: color-mix(in srgb, #ff4444 8%, #0a0000);
1829
+ color: #ff6b6b;
1830
+ padding: 0.38rem 0.42rem;
1831
+ text-transform: uppercase;
1832
+ letter-spacing: 0.06em;
1833
+ font-size: 0.62rem;
1834
+ font-weight: 600;
1835
+ }
1836
+
1837
+ .git-actions-merge-pr,
1838
+ .git-actions-open-pr,
1839
+ .git-actions-cleanup {
1840
+ --action-button-padding-y: 0.22rem;
1841
+ --action-button-padding-x: 0.4rem;
1842
+ --action-button-letter-spacing: 0.07em;
1843
+ }