cct-cli 0.7.9.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 (325) hide show
  1. calc_terminal/__init__.py +14 -0
  2. calc_terminal/__main__.py +14 -0
  3. calc_terminal/activity.py +1334 -0
  4. calc_terminal/agent.py +3387 -0
  5. calc_terminal/agent_runtime.py +519 -0
  6. calc_terminal/ai_context.py +447 -0
  7. calc_terminal/ai_modes.py +752 -0
  8. calc_terminal/ai_personalization.py +286 -0
  9. calc_terminal/ai_preview_feedback.py +213 -0
  10. calc_terminal/aicore.py +2572 -0
  11. calc_terminal/anim.py +367 -0
  12. calc_terminal/app.py +3685 -0
  13. calc_terminal/art.py +639 -0
  14. calc_terminal/atomsim.py +368 -0
  15. calc_terminal/attachments.py +743 -0
  16. calc_terminal/benchmark_system.py +414 -0
  17. calc_terminal/browser/__init__.py +36 -0
  18. calc_terminal/browser/browser_state.py +346 -0
  19. calc_terminal/browser/devserver.py +176 -0
  20. calc_terminal/browser/engine.py +494 -0
  21. calc_terminal/browser/navigation.py +84 -0
  22. calc_terminal/browser/preview.py +429 -0
  23. calc_terminal/browser/preview_entry.py +95 -0
  24. calc_terminal/browser/project_detector.py +144 -0
  25. calc_terminal/browser/server.py +449 -0
  26. calc_terminal/browser/state.py +75 -0
  27. calc_terminal/browser/watcher.py +99 -0
  28. calc_terminal/browser_gui/__init__.py +1 -0
  29. calc_terminal/browser_gui/__main__.py +3 -0
  30. calc_terminal/browser_gui/launcher.py +173 -0
  31. calc_terminal/browser_gui/playwright_browser.py +117 -0
  32. calc_terminal/browser_gui/qt_browser.py +1501 -0
  33. calc_terminal/browser_gui/webview_browser.py +57 -0
  34. calc_terminal/capabilities/__init__.py +35 -0
  35. calc_terminal/capabilities/adapters/__init__.py +33 -0
  36. calc_terminal/capabilities/adapters/bioinformatics.py +204 -0
  37. calc_terminal/capabilities/adapters/browser_adapter.py +205 -0
  38. calc_terminal/capabilities/adapters/filesystem.py +206 -0
  39. calc_terminal/capabilities/adapters/git_adapter.py +202 -0
  40. calc_terminal/capabilities/adapters/jupyter_adapter.py +138 -0
  41. calc_terminal/capabilities/adapters/ml_frameworks.py +158 -0
  42. calc_terminal/capabilities/adapters/platforms.py +200 -0
  43. calc_terminal/capabilities/adapters/python_exec.py +93 -0
  44. calc_terminal/capabilities/adapters/quantum_adapter.py +150 -0
  45. calc_terminal/capabilities/adapters/scientific_comp.py +123 -0
  46. calc_terminal/capabilities/adapters/structural_bio.py +161 -0
  47. calc_terminal/capabilities/adapters/terminal.py +99 -0
  48. calc_terminal/capabilities/bus.py +178 -0
  49. calc_terminal/capabilities/discovery.py +207 -0
  50. calc_terminal/capabilities/schema.py +221 -0
  51. calc_terminal/cat.ico +0 -0
  52. calc_terminal/cat_browser.py +2018 -0
  53. calc_terminal/chat_store.py +703 -0
  54. calc_terminal/cli.py +1178 -0
  55. calc_terminal/code_editor.py +640 -0
  56. calc_terminal/collaboration.py +723 -0
  57. calc_terminal/commands_data.py +139 -0
  58. calc_terminal/compatibility_engine.py +352 -0
  59. calc_terminal/compute/__init__.py +31 -0
  60. calc_terminal/compute/fabric.py +350 -0
  61. calc_terminal/config.py +227 -0
  62. calc_terminal/core/__init__.py +41 -0
  63. calc_terminal/core/checkpoint.py +156 -0
  64. calc_terminal/core/input/__init__.py +45 -0
  65. calc_terminal/core/mode_registry.py +300 -0
  66. calc_terminal/core/project_graph.py +172 -0
  67. calc_terminal/core/recovery.py +129 -0
  68. calc_terminal/core/security_layer.py +112 -0
  69. calc_terminal/core/task_graph.py +202 -0
  70. calc_terminal/core/unified_runtime.py +184 -0
  71. calc_terminal/core/verification.py +257 -0
  72. calc_terminal/customization.py +1566 -0
  73. calc_terminal/derivations.py +153 -0
  74. calc_terminal/device_control.py +263 -0
  75. calc_terminal/diagnostics/__init__.py +27 -0
  76. calc_terminal/diagnostics/doctor_engine.py +382 -0
  77. calc_terminal/diagnostics/self_test.py +247 -0
  78. calc_terminal/doctor.py +519 -0
  79. calc_terminal/easter_eggs.py +274 -0
  80. calc_terminal/editor/__init__.py +1 -0
  81. calc_terminal/editor/actions.py +263 -0
  82. calc_terminal/editor/commands.py +160 -0
  83. calc_terminal/editor/shortcuts.py +226 -0
  84. calc_terminal/engine.py +259 -0
  85. calc_terminal/errors.py +120 -0
  86. calc_terminal/event_stream.py +146 -0
  87. calc_terminal/eventbus.py +133 -0
  88. calc_terminal/extensions.py +733 -0
  89. calc_terminal/fallback_cli.py +1321 -0
  90. calc_terminal/first_run.py +265 -0
  91. calc_terminal/fomoji_auth.py +1043 -0
  92. calc_terminal/formulas.py +82 -0
  93. calc_terminal/fs_cache.py +121 -0
  94. calc_terminal/fs_watcher.py +277 -0
  95. calc_terminal/game.py +193 -0
  96. calc_terminal/gen1.py +5 -0
  97. calc_terminal/generators.py +245 -0
  98. calc_terminal/gestures/__init__.py +42 -0
  99. calc_terminal/gestures/bindings.py +175 -0
  100. calc_terminal/gestures/manager.py +477 -0
  101. calc_terminal/goodbye.py +363 -0
  102. calc_terminal/gpu3d.py +290 -0
  103. calc_terminal/graphs.py +358 -0
  104. calc_terminal/hardware_analyzer.py +440 -0
  105. calc_terminal/host/__init__.py +30 -0
  106. calc_terminal/host/browser_manager.py +187 -0
  107. calc_terminal/host/desktop.py +1386 -0
  108. calc_terminal/host/launcher.py +395 -0
  109. calc_terminal/host/terminal.py +279 -0
  110. calc_terminal/identity.py +216 -0
  111. calc_terminal/input/__init__.py +54 -0
  112. calc_terminal/input/capabilities.py +258 -0
  113. calc_terminal/input/focus.py +87 -0
  114. calc_terminal/input/gestures.py +64 -0
  115. calc_terminal/input/pointer.py +114 -0
  116. calc_terminal/input/touch.py +345 -0
  117. calc_terminal/keys.py +84 -0
  118. calc_terminal/live_automation.py +165 -0
  119. calc_terminal/mathtext.py +433 -0
  120. calc_terminal/mcp.py +386 -0
  121. calc_terminal/memory.py +337 -0
  122. calc_terminal/memory_v2.py +479 -0
  123. calc_terminal/metrics.py +333 -0
  124. calc_terminal/mode_detection.py +146 -0
  125. calc_terminal/model.py +2431 -0
  126. calc_terminal/model_router.py +665 -0
  127. calc_terminal/models/__init__.py +0 -0
  128. calc_terminal/models/active_state.py +187 -0
  129. calc_terminal/models/dynamic_registry.py +584 -0
  130. calc_terminal/models/manager.py +781 -0
  131. calc_terminal/models/model_metadata.json +3526 -0
  132. calc_terminal/models/profiles.py +194 -0
  133. calc_terminal/models/registry.py +265 -0
  134. calc_terminal/models/schema.py +197 -0
  135. calc_terminal/models/validator.py +287 -0
  136. calc_terminal/models/verification_engine.py +368 -0
  137. calc_terminal/native_picker.py +215 -0
  138. calc_terminal/ollama_catalog.py +279 -0
  139. calc_terminal/ollama_download.py +233 -0
  140. calc_terminal/orchestrator.py +304 -0
  141. calc_terminal/package_research.py +322 -0
  142. calc_terminal/packages.py +1024 -0
  143. calc_terminal/pc_specs.py +116 -0
  144. calc_terminal/permissions.py +334 -0
  145. calc_terminal/pet.py +106 -0
  146. calc_terminal/pipeline.py +505 -0
  147. calc_terminal/platform/__init__.py +491 -0
  148. calc_terminal/platform/desktop.py +491 -0
  149. calc_terminal/platform/web.py +781 -0
  150. calc_terminal/preview/__init__.py +1 -0
  151. calc_terminal/preview/dev_server.py +303 -0
  152. calc_terminal/preview/diagnostics.py +131 -0
  153. calc_terminal/preview/live_reload.py +66 -0
  154. calc_terminal/preview/manager.py +129 -0
  155. calc_terminal/project_stats.py +209 -0
  156. calc_terminal/projects.py +328 -0
  157. calc_terminal/providers/__init__.py +0 -0
  158. calc_terminal/providers/adapters/__init__.py +80 -0
  159. calc_terminal/providers/adapters/anthropic_adapter.py +127 -0
  160. calc_terminal/providers/adapters/base.py +106 -0
  161. calc_terminal/providers/adapters/chinese_adapters.py +420 -0
  162. calc_terminal/providers/adapters/gemini_adapter.py +101 -0
  163. calc_terminal/providers/adapters/ollama_adapter.py +83 -0
  164. calc_terminal/providers/adapters/openai_adapter.py +159 -0
  165. calc_terminal/providers/adapters/other_adapters.py +246 -0
  166. calc_terminal/providers/anthropic_provider.py +172 -0
  167. calc_terminal/providers/auto_update.py +416 -0
  168. calc_terminal/providers/base_provider.py +105 -0
  169. calc_terminal/providers/discovery_manager.py +207 -0
  170. calc_terminal/providers/gemini_provider.py +178 -0
  171. calc_terminal/providers/lifecycle.py +767 -0
  172. calc_terminal/providers/ollama_adapter.py +707 -0
  173. calc_terminal/providers/openai_provider.py +254 -0
  174. calc_terminal/providers/provider_manager.py +1827 -0
  175. calc_terminal/providers/providers.json +4075 -0
  176. calc_terminal/reactionsim.py +279 -0
  177. calc_terminal/registry.py +337 -0
  178. calc_terminal/report.py +162 -0
  179. calc_terminal/research/__init__.py +45 -0
  180. calc_terminal/research/artifact_intel.py +126 -0
  181. calc_terminal/research/data_lineage.py +123 -0
  182. calc_terminal/research/experiment_ledger.py +303 -0
  183. calc_terminal/research/reproducibility.py +131 -0
  184. calc_terminal/resilience/__init__.py +47 -0
  185. calc_terminal/resilience/agent_state.py +121 -0
  186. calc_terminal/resilience/capability_matcher.py +174 -0
  187. calc_terminal/resilience/circuit_breaker.py +158 -0
  188. calc_terminal/resilience/failover_engine.py +230 -0
  189. calc_terminal/resilience/health_monitor.py +192 -0
  190. calc_terminal/resilience/ollama_adapter.py +125 -0
  191. calc_terminal/resilience/orchestrator.py +312 -0
  192. calc_terminal/resilience/types.py +134 -0
  193. calc_terminal/sandbox.py +98 -0
  194. calc_terminal/scires.py +558 -0
  195. calc_terminal/security_scanner.py +126 -0
  196. calc_terminal/session.py +294 -0
  197. calc_terminal/sim3d.py +206 -0
  198. calc_terminal/solver.py +276 -0
  199. calc_terminal/sound.py +127 -0
  200. calc_terminal/task_reports.py +287 -0
  201. calc_terminal/terminal_host.py +201 -0
  202. calc_terminal/terminal_identity.py +411 -0
  203. calc_terminal/test_ai_mode_reliability.py +344 -0
  204. calc_terminal/test_browser.py +368 -0
  205. calc_terminal/test_code_editor_upgrade.py +485 -0
  206. calc_terminal/test_customization.py +1148 -0
  207. calc_terminal/test_customization_ui.py +612 -0
  208. calc_terminal/test_dynamic_registry.py +304 -0
  209. calc_terminal/test_extensions.py +436 -0
  210. calc_terminal/test_overhaul.py +557 -0
  211. calc_terminal/test_project_detect.py +255 -0
  212. calc_terminal/test_root_cause_fix.py +527 -0
  213. calc_terminal/test_stability.py +532 -0
  214. calc_terminal/test_terminal_identity.py +132 -0
  215. calc_terminal/test_v079_speed.py +460 -0
  216. calc_terminal/theme.py +1107 -0
  217. calc_terminal/timeline.py +139 -0
  218. calc_terminal/todos.py +246 -0
  219. calc_terminal/tool_call_normalizer.py +419 -0
  220. calc_terminal/tui.py +104 -0
  221. calc_terminal/ui/__init__.py +8 -0
  222. calc_terminal/ui/activity_panel.py +231 -0
  223. calc_terminal/ui/activity_stream_panel.py +238 -0
  224. calc_terminal/ui/animations.py +122 -0
  225. calc_terminal/ui/app.py +7271 -0
  226. calc_terminal/ui/attach_panel.py +597 -0
  227. calc_terminal/ui/attachments.py +424 -0
  228. calc_terminal/ui/backup_panel.py +810 -0
  229. calc_terminal/ui/browser_shell.py +887 -0
  230. calc_terminal/ui/cat_agent.py +357 -0
  231. calc_terminal/ui/chats_panel.py +899 -0
  232. calc_terminal/ui/command_palette.py +125 -0
  233. calc_terminal/ui/command_palette_modal.py +166 -0
  234. calc_terminal/ui/composer.py +1141 -0
  235. calc_terminal/ui/context_menu.py +197 -0
  236. calc_terminal/ui/conversation.py +1435 -0
  237. calc_terminal/ui/customization_panel.py +1229 -0
  238. calc_terminal/ui/dashboard.py +404 -0
  239. calc_terminal/ui/design_system.py +557 -0
  240. calc_terminal/ui/diff_panel.py +213 -0
  241. calc_terminal/ui/editor.py +2102 -0
  242. calc_terminal/ui/empty_state.py +302 -0
  243. calc_terminal/ui/events.py +487 -0
  244. calc_terminal/ui/extensions_panel.py +815 -0
  245. calc_terminal/ui/footer.py +166 -0
  246. calc_terminal/ui/gestures_panel.py +383 -0
  247. calc_terminal/ui/goodbye_screen.py +100 -0
  248. calc_terminal/ui/header.py +1034 -0
  249. calc_terminal/ui/help_panel.py +254 -0
  250. calc_terminal/ui/live_activities.py +914 -0
  251. calc_terminal/ui/mcp_panel.py +570 -0
  252. calc_terminal/ui/memory_center.py +524 -0
  253. calc_terminal/ui/mode_colors_panel.py +525 -0
  254. calc_terminal/ui/nav_screens.py +747 -0
  255. calc_terminal/ui/ollama_panel.py +536 -0
  256. calc_terminal/ui/palette.py +221 -0
  257. calc_terminal/ui/permission_panel.py +269 -0
  258. calc_terminal/ui/personalization_panel.py +517 -0
  259. calc_terminal/ui/personalize_center.py +1568 -0
  260. calc_terminal/ui/preview_panel.py +441 -0
  261. calc_terminal/ui/resizers.py +402 -0
  262. calc_terminal/ui/sidebar.py +1285 -0
  263. calc_terminal/ui/statusbar.py +168 -0
  264. calc_terminal/ui/theme_css.py +1396 -0
  265. calc_terminal/ui/thinking.py +226 -0
  266. calc_terminal/ui/timeline_panel.py +102 -0
  267. calc_terminal/ui/todo_panel.py +193 -0
  268. calc_terminal/ui/viewport.py +136 -0
  269. calc_terminal/ui/vision_panel.py +489 -0
  270. calc_terminal/ui/welcome_modal.py +343 -0
  271. calc_terminal/ui/widgets.py +160 -0
  272. calc_terminal/ui/workspace.py +831 -0
  273. calc_terminal/viewers/__init__.py +1 -0
  274. calc_terminal/viewers/document_viewer.py +252 -0
  275. calc_terminal/viewers/image_viewer.py +241 -0
  276. calc_terminal/viewers/pdf_viewer.py +203 -0
  277. calc_terminal/viewers/presentation_viewer.py +164 -0
  278. calc_terminal/viewers/registry.py +120 -0
  279. calc_terminal/viewers/spreadsheet_viewer.py +204 -0
  280. calc_terminal/vision/__init__.py +89 -0
  281. calc_terminal/vision/analysis.py +194 -0
  282. calc_terminal/vision/annotations.py +297 -0
  283. calc_terminal/vision/capture.py +171 -0
  284. calc_terminal/vision/context.py +231 -0
  285. calc_terminal/vision/correlation.py +169 -0
  286. calc_terminal/vision/cursor.py +258 -0
  287. calc_terminal/vision/events.py +66 -0
  288. calc_terminal/vision/frame_pipeline.py +259 -0
  289. calc_terminal/vision/priority.py +218 -0
  290. calc_terminal/vision/provider.py +180 -0
  291. calc_terminal/vision/safety.py +149 -0
  292. calc_terminal/vision/session.py +281 -0
  293. calc_terminal/vision/verify.py +162 -0
  294. calc_terminal/vision.py +514 -0
  295. calc_terminal/vscode_integration.py +113 -0
  296. calc_terminal/web/__init__.py +8 -0
  297. calc_terminal/web/cat_runtime.py +710 -0
  298. calc_terminal/web/server.py +2891 -0
  299. calc_terminal/web/static/css/app.css +3152 -0
  300. calc_terminal/web/static/icons/badge-72.png +0 -0
  301. calc_terminal/web/static/icons/cat.ico +0 -0
  302. calc_terminal/web/static/icons/icon-128.png +0 -0
  303. calc_terminal/web/static/icons/icon-144.png +0 -0
  304. calc_terminal/web/static/icons/icon-152.png +0 -0
  305. calc_terminal/web/static/icons/icon-192.png +0 -0
  306. calc_terminal/web/static/icons/icon-384.png +0 -0
  307. calc_terminal/web/static/icons/icon-512.png +0 -0
  308. calc_terminal/web/static/icons/icon-72.png +0 -0
  309. calc_terminal/web/static/icons/icon-96.png +0 -0
  310. calc_terminal/web/static/icons/icon.svg +34 -0
  311. calc_terminal/web/static/icons/new-project.png +0 -0
  312. calc_terminal/web/static/icons/open-project.png +0 -0
  313. calc_terminal/web/static/index.html +734 -0
  314. calc_terminal/web/static/js/app.js +2403 -0
  315. calc_terminal/web/static/manifest.json +88 -0
  316. calc_terminal/web/static/sw.js +230 -0
  317. calc_terminal/workflow_engine.py +769 -0
  318. calc_terminal/workspace.py +593 -0
  319. calc_terminal/workspace_index.py +385 -0
  320. cct_cli-0.7.9.0.dist-info/METADATA +210 -0
  321. cct_cli-0.7.9.0.dist-info/RECORD +325 -0
  322. cct_cli-0.7.9.0.dist-info/WHEEL +5 -0
  323. cct_cli-0.7.9.0.dist-info/entry_points.txt +4 -0
  324. cct_cli-0.7.9.0.dist-info/licenses/LICENSE +21 -0
  325. cct_cli-0.7.9.0.dist-info/top_level.txt +1 -0
@@ -0,0 +1,139 @@
1
+ """
2
+ CCT slash-command registry — single source of truth.
3
+
4
+ This used to be a module-level list inside app.py. It moved here in
5
+ v0.6.0 so calc_terminal/ui/palette.py's CommandPalette (the "/ opens an
6
+ integrated command palette inside the composer" piece of the v6.0
7
+ redesign brief) can list/filter the *exact* same commands the plain
8
+ print()/input() REPL supports, instead of hand-maintaining a second
9
+ copy that silently drifts out of sync every time a command is added.
10
+
11
+ app.py imports COMMANDS from here (see the top of app.py) and behaves
12
+ exactly as it did before this refactor — nothing about the REPL's
13
+ behavior changed, only where the list lives.
14
+ """
15
+
16
+ COMMANDS = [
17
+ ("/help", "Show help & shortcuts"),
18
+ ("/calculator", "Quick scientific calculator"),
19
+ ("/solve", "Universal formula calculator (39 formulas + custom)"),
20
+ ("/formulas", "Browse the formula library"),
21
+ ("/kinetics", "Chemical kinetics numericals"),
22
+ ("/derive", "Real step-by-step calculus derivations (not examples)"),
23
+ ("/electrochemistry", "Cell potential & Nernst numericals"),
24
+ ("/atomsim", "Live Bohr atom & electron simulation"),
25
+ ("/orbitals", "Live quantum orbital (electron cloud) simulation"),
26
+ ("/orbitalgrid", "Export a reference chart of many hydrogen orbitals"),
27
+ ("/bonding", "Chemical bonding density map (ELF-style) for a molecule"),
28
+ ("/bloch", "Bloch sphere for a single qubit state (theta, phi in degrees)"),
29
+ ("/permissions", "View or switch AI permission mode (ask/restricted/full)"),
30
+ ("/workspace", "Workspace manager — detect, open, and manage project folders; browse generated files"),
31
+ ("/graph", "Chemistry graphs — animated 2D + exported 2D/3D"),
32
+ ("/game", "Element Quiz — learn chemistry by playing"),
33
+ ("/history", "Review previously solved notebooks"),
34
+ ("/settings", "Autosave, precision & preferences"),
35
+ ("/shortcuts", "Full shortcut key reference"),
36
+ ("/about", "About this terminal"),
37
+ ("/random", "Solve a random numerical"),
38
+ ("/upload", "Simulate solving from an image"),
39
+ ("/voice", "Simulate voice input"),
40
+ ("/sim3d", "[BETA] Real-time 3D Atomic Simulation"),
41
+ ("/gpu3d", "[BETA] Real GPU-rendered 3D (atom/graph/scale) — opens in browser"),
42
+ ("/mode", "Cycle or jump to an AI mode: Notebook, Research, Plan, Build, Debugger, or Agent"),
43
+ ("/summarize", "Summarize the full conversation and generate a smart chat title"),
44
+ ("/summary", "Alias for /summarize — full chat summary & title"),
45
+ ("/notebook", "Switch to Notebook AI mode — chemistry/physics/math, daily use"),
46
+ ("/research", "Deep research: multi-query web search + AI-synthesized summary"),
47
+ ("/agent", "Switch to Agent AI mode — real tool use: solves/plots/simulates for you"),
48
+ ("/build", "Switch to Build AI mode — code generation, debugging, architecture"),
49
+ ("/plan", "Switch to Plan AI mode — roadmaps, brainstorming, prototypes"),
50
+ ("/debug", "Switch to Debugger AI mode — focused troubleshooting of broken code"),
51
+ ("/ai", "Alias for /notebook — CAT AI's original quick-chat persona"),
52
+ ("/install", "Autonomous package manager — install real packages with permission"),
53
+ ("/packages", "Installation dashboard — supported managers & remembered decisions"),
54
+ ("/pipeline", "AI Execution Pipeline — Planner→Research→Build→Verify, fully visible"),
55
+ ("/orchestrate", "Agent Orchestrator — Coordinator + specialist agent roster"),
56
+ ("/devices", "Responsible device control — provider roster & approval-gated actions"),
57
+ ("/ai-verify", "Test your AI provider connection & list models"),
58
+ ("/memory", "What CAT remembers about you — facts, activity, topics"),
59
+ ("/codepad", "Write/run code, or have CAT AI generate it (GitHub Light syntax)"),
60
+ ("/edit", "Plain-text in-terminal editor — notes, todo lists, snippets"),
61
+ ("/model", "Switch AI model for the current provider (live list, search & filters)"),
62
+ ("/model search", "Search available models by name, family, or capability"),
63
+ ("/model refresh", "Force-refresh the model list from the provider's API"),
64
+ ("/free", "Show only free models for the current provider"),
65
+ ("/latest", "Show the newest available models for the current provider"),
66
+ ("/provider", "Switch AI provider (data-driven list from providers.json)"),
67
+ ("/status", "Provider / model / source / last refresh status"),
68
+ ("/refresh-models", "Force-refresh the model list from the selected provider"),
69
+ ("/tokens", "Session token usage & estimated context remaining"),
70
+ ("/theme", "Switch terminal theme — Tokyo Night (dark) or GitHub Light"),
71
+ ("/websearch", "Live web search (no API key needed)"),
72
+ ("/import", "Import a text file, image, or .zip for the AI/agent to read/see"),
73
+ ("/pet", "Show the live mascot pet — walks, runs, or sleeps based on activity"),
74
+ ("/react", "NEW Reaction simulator — balance equations + kinetics/equilibrium playback"),
75
+ ("/export", "NEW Export solved notebooks to Markdown or PDF"),
76
+ ("/tui", "NEW Real Textual dashboard — sidebar + scrolling history + status bar"),
77
+ ("/composer", "Reopen the primary chat UI if you dropped to the fallback terminal"),
78
+ ("/open", "Open a project folder as the IDE workspace (Explorer + Editor)"),
79
+ ("/sidebar", "Toggle the Explorer sidebar"),
80
+ ("/find", "Toggle find/replace in the active editor tab"),
81
+ ("/preview", "Live Web Preview — open/close the embedded browser (Ctrl+Shift+P)"),
82
+ ("/preview start", "Start the live preview server + embedded browser"),
83
+ ("/preview stop", "Stop the live preview and return to the code editor"),
84
+ ("/preview reload", "Reload the web preview page"),
85
+ ("/preview fullscreen", "Expand/restore the right workspace pane (⿻)"),
86
+ ("/preview status", "Show live server / browser / watcher state"),
87
+ ("/browser", "CAT Browser — graphical browser (tabs, address bar, Fomoji)"),
88
+ ("/browse", "Alias for /browser — open any URL or search"),
89
+ ("/cat", "Open CAT Browser (Chromium / Qt WebEngine) — our own browser"),
90
+ ("/browser open", "Open a URL in CAT Browser"),
91
+ ("/browser search", "Search the web in CAT Browser (Google/DuckDuckGo)"),
92
+ ("/signout", "Sign out of Fomoji — clear CAT session"),
93
+ ("/logout", "Alias for /signout"),
94
+ ("/todo", "NEW AI Todo Manager — manual + AI-detected tasks, per project"),
95
+ ("/timeline", "NEW Session Timeline — searchable log of this run's activity"),
96
+ ("/copycode", "Copy the most recent code block shown by the AI to your clipboard"),
97
+ ("/vision", "CAT Vision — screen sharing + annotation + visual debugging"),
98
+ ("/vision start", "Start a Vision capture session"),
99
+ ("/vision stop", "Stop the current Vision session"),
100
+ ("/vision pause", "Pause Vision capture"),
101
+ ("/vision analyze", "Analyze current annotated region"),
102
+ ("/vision screenshot", "Capture a single screenshot for analysis"),
103
+ ("/vision clear", "Clear Vision session data"),
104
+ ("/touch", "Toggle touch-friendly touchscreen laptop UI mode"),
105
+ ("/cat doctor", "Comprehensive 19-dimension health check across runtime, providers & tools"),
106
+ ("/cat self-test", "Automated self-test suite validating all core agent subsystems"),
107
+ ("/cat verify", "Verify workspace edits, AST syntax, tests, and endpoints via Reality Engine"),
108
+ ("/doctor", "Alias for /cat doctor — system diagnostic check"),
109
+ ("/self-test", "Alias for /cat self-test — automated test suite"),
110
+ ("/verify", "Alias for /cat verify — reality engine verification"),
111
+ ("/mode create", "Create a custom AI mode by name"),
112
+ ("/mode list", "List active built-in and custom AI modes"),
113
+ ("/mode delete", "Delete a custom AI mode"),
114
+ ("/checkpoint", "Create workspace snapshot or rollback recent changes"),
115
+ ("/compute", "List compute fabric targets and hardware resources"),
116
+ ("/fabric", "Alias for /compute — inspect compute fabric"),
117
+ ("/clear", "Clear screen & return home"),
118
+ ("/exit", "Quit Chemistry Calc Terminal"),
119
+ ]
120
+
121
+ # Commands calc_terminal/ui/app.py's CCTApp runs natively, in-process,
122
+ # without leaving the Textual UI — small, quick, no blocking input()
123
+ # menus of their own. Every other command in COMMANDS above still
124
+ # works from inside the composer: CCTApp suspends the Textual screen
125
+ # (textual's real suspend/resume, not a fake), lets the existing
126
+ # fallback_cli.App.handle() run it exactly as it always has in a real
127
+ # terminal, and resumes the chat UI when that finishes — so nothing on
128
+ # this list is unsupported, this is just the set worth a native,
129
+ # no-suspend round trip.
130
+ NATIVE_UI_COMMANDS = {"/clear", "/theme", "/model", "/tokens", "/tui", "/composer",
131
+ "/history", "/memory", "/about", "/help", "/exit",
132
+ "/mode", "/notebook", "/agent", "/build", "/plan", "/ai",
133
+ "/research", "/debug",
134
+ "/open", "/sidebar", "/find", "/todo", "/timeline",
135
+ "/preview", "/browser", "/browse", "/cat",
136
+ "/vision", "/signout", "/logout", "/touch",
137
+ "/doctor", "/self-test", "/verify", "/checkpoint",
138
+ "/compute", "/fabric"}
139
+
@@ -0,0 +1,352 @@
1
+ """
2
+ calc_terminal/compatibility_engine.py
3
+ =====================================
4
+ CAT Model Compatibility Engine — Intelligent hardware-to-model matching.
5
+
6
+ Part of CAT (Created by Kazi Zillani).
7
+ Calculates realistic operational memory footprints considering:
8
+ - Parameter count (e.g. 1.5B, 3B, 4B, 7B, 14B, 32B, 70B)
9
+ - Quantization format (e.g. Q4_K_M, Q5_K_M, Q8_0, FP16, FP8)
10
+ - Model disk size
11
+ - Target context window (e.g. 4K, 8K, 32K, 128K)
12
+ - KV-cache memory requirements
13
+ - GPU VRAM vs. System RAM hybrid offloading
14
+ - Available memory headroom
15
+
16
+ Classifies models into the 5 standard CAT tiers:
17
+ 🟢 Excellent — 100% in VRAM, full GPU acceleration, peak tokens/sec.
18
+ 🟢 Recommended — Fully comfortable on device, fast interactive speeds.
19
+ 🟡 Usable — Supported via RAM/CPU offloading; acceptable speed.
20
+ 🟠 Heavy — High RAM consumption; reduced generation speed.
21
+ 🔴 Not Recommended — Exceeds total system resources, high risk of OOM.
22
+ """
23
+
24
+ from __future__ import annotations
25
+
26
+ import re
27
+ from dataclasses import dataclass, field
28
+ from typing import Any, Dict, Optional, Tuple
29
+
30
+ from .hardware_analyzer import HardwareAnalyzer, HardwareProfile
31
+
32
+
33
+ @dataclass
34
+ class CompatibilityReport:
35
+ model_name: str
36
+ tier: str # EXCELLENT, RECOMMENDED, USABLE, HEAVY, NOT_RECOMMENDED
37
+ tier_label: str # e.g. "🟢 Excellent", "🟢 Recommended", etc.
38
+ tier_label_ascii: str # e.g. "[EXCELLENT]", "[RECOMMENDED]", etc.
39
+ weights_gb: float
40
+ kv_cache_gb: float
41
+ total_memory_gb: float
42
+ vram_used_gb: float
43
+ ram_offload_gb: float
44
+ estimated_tps: float # Estimated tokens per second
45
+ summary: str
46
+ details: list[str] = field(default_factory=list)
47
+
48
+ def to_dict(self) -> Dict[str, Any]:
49
+ return {
50
+ "model_name": self.model_name,
51
+ "tier": self.tier,
52
+ "tier_label": self.tier_label,
53
+ "tier_label_ascii": self.tier_label_ascii,
54
+ "weights_gb": self.weights_gb,
55
+ "kv_cache_gb": self.kv_cache_gb,
56
+ "total_memory_gb": self.total_memory_gb,
57
+ "vram_used_gb": self.vram_used_gb,
58
+ "ram_offload_gb": self.ram_offload_gb,
59
+ "estimated_tps": self.estimated_tps,
60
+ "summary": self.summary,
61
+ "details": self.details,
62
+ }
63
+
64
+
65
+ class ModelCompatibilityEngine:
66
+ """Evaluates how a model will perform on the user's specific hardware."""
67
+
68
+ TIER_EXCELLENT = "EXCELLENT"
69
+ TIER_RECOMMENDED = "RECOMMENDED"
70
+ TIER_USABLE = "USABLE"
71
+ TIER_HEAVY = "HEAVY"
72
+ TIER_NOT_RECOMMENDED = "NOT_RECOMMENDED"
73
+
74
+ TIER_BADGES = {
75
+ "EXCELLENT": "🟢 Excellent",
76
+ "RECOMMENDED": "🟢 Recommended",
77
+ "USABLE": "🟡 Usable",
78
+ "HEAVY": "🟠 Heavy",
79
+ "NOT_RECOMMENDED": "🔴 Not Recommended",
80
+ }
81
+
82
+ TIER_ASCII_BADGES = {
83
+ "EXCELLENT": "[EXCELLENT]",
84
+ "RECOMMENDED": "[RECOMMENDED]",
85
+ "USABLE": "[USABLE]",
86
+ "HEAVY": "[HEAVY]",
87
+ "NOT_RECOMMENDED": "[NOT RECOMMENDED]",
88
+ }
89
+
90
+ @classmethod
91
+ def evaluate_model(
92
+ cls,
93
+ model_name: str,
94
+ params_str: str = "",
95
+ size_gb: float = 0.0,
96
+ quant: str = "Q4_K_M",
97
+ context_len: int = 4096,
98
+ hardware: Optional[HardwareProfile] = None,
99
+ ) -> CompatibilityReport:
100
+ """Calculate complete compatibility profile for a model."""
101
+ hw = hardware or HardwareAnalyzer.analyze()
102
+
103
+ # 1. Parse parameter count in billions
104
+ billions = cls._parse_params(params_str or model_name)
105
+
106
+ # 2. Calculate base weights memory
107
+ if size_gb > 0.1:
108
+ weights_gb = round(size_gb, 2)
109
+ else:
110
+ weights_gb = round(cls._estimate_weights_gb(billions, quant), 2)
111
+
112
+ # 3. Calculate KV-cache memory requirement
113
+ kv_cache_gb = round(cls._estimate_kv_cache_gb(billions, context_len), 2)
114
+
115
+ # Runtime overhead (CUDA buffers, context allocation) ~0.5 GB
116
+ runtime_overhead = 0.5
117
+ total_memory_gb = round(weights_gb + kv_cache_gb + runtime_overhead, 2)
118
+
119
+ # 4. Compare with GPU VRAM and System RAM
120
+ vram_total = hw.gpu.vram_total_gb if hw.gpu.detected else 0.0
121
+ vram_available = hw.gpu.vram_free_gb if hw.gpu.detected else 0.0
122
+ if vram_available <= 0:
123
+ vram_available = vram_total * 0.85
124
+
125
+ ram_total = hw.ram.total_gb
126
+ ram_available = hw.ram.available_gb
127
+
128
+ # Compute offload split
129
+ if hw.gpu.detected and vram_total > 0.5:
130
+ if total_memory_gb <= vram_available:
131
+ vram_used = total_memory_gb
132
+ ram_offload = 0.0
133
+ else:
134
+ vram_used = max(0.0, vram_available - 0.5)
135
+ ram_offload = max(0.0, total_memory_gb - vram_used)
136
+ else:
137
+ vram_used = 0.0
138
+ ram_offload = total_memory_gb
139
+
140
+ # 5. Classify into Tiers
141
+ tier, summary, details, est_tps = cls._classify_tier(
142
+ hw=hw,
143
+ billions=billions,
144
+ weights_gb=weights_gb,
145
+ total_memory_gb=total_memory_gb,
146
+ vram_used=vram_used,
147
+ ram_offload=ram_offload,
148
+ vram_total=vram_total,
149
+ ram_total=ram_total,
150
+ context_len=context_len,
151
+ )
152
+
153
+ badge = cls.TIER_BADGES.get(tier, "🟡 Usable")
154
+ badge_ascii = cls.TIER_ASCII_BADGES.get(tier, "[USABLE]")
155
+
156
+ return CompatibilityReport(
157
+ model_name=model_name,
158
+ tier=tier,
159
+ tier_label=badge,
160
+ tier_label_ascii=badge_ascii,
161
+ weights_gb=weights_gb,
162
+ kv_cache_gb=kv_cache_gb,
163
+ total_memory_gb=total_memory_gb,
164
+ vram_used_gb=round(vram_used, 2),
165
+ ram_offload_gb=round(ram_offload, 2),
166
+ estimated_tps=est_tps,
167
+ summary=summary,
168
+ details=details,
169
+ )
170
+
171
+ @classmethod
172
+ def _parse_params(cls, text: str) -> float:
173
+ """Extract billion parameters from string like '70b', '3.8B', 'qwen2.5-coder:3b'."""
174
+ text = text.lower()
175
+ match = re.search(r"[:\-_]?(\d+(?:\.\d+)?)\s*b\b", text)
176
+ if match:
177
+ try:
178
+ return float(match.group(1))
179
+ except Exception:
180
+ pass
181
+ match_m = re.search(r"[:\-_]?(\d+(?:\.\d+)?)\s*m\b", text)
182
+ if match_m:
183
+ try:
184
+ return float(match_m.group(1)) / 1000.0
185
+ except Exception:
186
+ pass
187
+ # Default fallback
188
+ return 7.0
189
+
190
+ @classmethod
191
+ def _estimate_weights_gb(cls, billions: float, quant: str) -> float:
192
+ """Estimate model weights size based on parameter count and quantization."""
193
+ q = quant.upper()
194
+ if "Q2" in q:
195
+ bits = 2.6
196
+ elif "Q3" in q:
197
+ bits = 3.5
198
+ elif "Q4" in q:
199
+ bits = 4.5
200
+ elif "Q5" in q:
201
+ bits = 5.5
202
+ elif "Q6" in q:
203
+ bits = 6.6
204
+ elif "Q8" in q or "FP8" in q:
205
+ bits = 8.5
206
+ elif "16" in q or "FP16" in q:
207
+ bits = 16.0
208
+ else:
209
+ bits = 4.5 # Q4_K_M default
210
+
211
+ return max(0.4, (billions * bits) / 8.0)
212
+
213
+ @classmethod
214
+ def _estimate_kv_cache_gb(cls, billions: float, context_len: int) -> float:
215
+ """Estimate KV cache memory consumption for target context."""
216
+ # Baseline: ~0.25MB per 1K context for ~7B models, scales with params and context
217
+ heads_dim_factor = max(0.5, (billions / 7.0) ** 0.5)
218
+ mb = (context_len / 1024.0) * 0.25 * heads_dim_factor * 1024.0
219
+ return mb / 1024.0
220
+
221
+ @classmethod
222
+ def _classify_tier(
223
+ cls,
224
+ hw: HardwareProfile,
225
+ billions: float,
226
+ weights_gb: float,
227
+ total_memory_gb: float,
228
+ vram_used: float,
229
+ ram_offload: float,
230
+ vram_total: float,
231
+ ram_total: float,
232
+ context_len: int,
233
+ ) -> Tuple[str, str, list[str], float]:
234
+ details = []
235
+ details.append(f"Model parameters: {billions:.1f}B | Operational Memory: {total_memory_gb:.1f} GB")
236
+
237
+ total_system_memory = (vram_total if hw.gpu.detected else 0) + ram_total
238
+
239
+ # Impossible / Out of Memory
240
+ if total_memory_gb > (total_system_memory * 0.95):
241
+ tier = cls.TIER_NOT_RECOMMENDED
242
+ summary = f"Requires {total_memory_gb:.1f} GB memory; exceeds total system capacity ({total_system_memory:.1f} GB)."
243
+ details.append("High probability of Out-Of-Memory (OOM) crash or extreme disk paging.")
244
+ est_tps = 0.5
245
+ return tier, summary, details, est_tps
246
+
247
+ # 100% Fits in GPU VRAM (or Apple Unified Memory)
248
+ if hw.gpu.detected and ram_offload <= 0.05 and vram_total >= total_memory_gb:
249
+ if billions <= 4.0:
250
+ tier = cls.TIER_EXCELLENT
251
+ est_tps = 45.0 if hw.gpu.backend == "CUDA" else 35.0
252
+ summary = f"Fits entirely inside {hw.gpu.name} ({vram_total:.1f} GB VRAM) with zero RAM offloading."
253
+ details.append("Maximum GPU acceleration with low latency.")
254
+ else:
255
+ tier = cls.TIER_RECOMMENDED
256
+ est_tps = 30.0 if hw.gpu.backend == "CUDA" else 25.0
257
+ summary = f"Comfortably accommodated in GPU VRAM with full {hw.gpu.backend} acceleration."
258
+ details.append("High interactive tokens/sec throughput.")
259
+ return tier, summary, details, est_tps
260
+
261
+ # Hybrid VRAM + RAM Offload
262
+ if hw.gpu.detected and vram_total >= 3.0:
263
+ offload_pct = (ram_offload / total_memory_gb) * 100.0
264
+ if offload_pct <= 45.0 and total_memory_gb <= (hw.ram.total_gb * 0.7):
265
+ tier = cls.TIER_RECOMMENDED
266
+ est_tps = 18.0
267
+ summary = f"Hybrid execution: {vram_used:.1f} GB in GPU VRAM + {ram_offload:.1f} GB offloaded to System RAM."
268
+ details.append(f"Fast execution with ~{int(100 - offload_pct)}% GPU compute acceleration.")
269
+ elif total_memory_gb <= (hw.ram.total_gb * 0.85):
270
+ tier = cls.TIER_USABLE
271
+ est_tps = 8.0
272
+ summary = f"Partial offload: {vram_used:.1f} GB in VRAM, {ram_offload:.1f} GB in System RAM."
273
+ details.append("Workable for background coding and general questions; generation speed is moderate.")
274
+ else:
275
+ tier = cls.TIER_HEAVY
276
+ est_tps = 2.5
277
+ summary = f"Heavy RAM offload ({ram_offload:.1f} GB); will utilize most available System RAM."
278
+ details.append("Technically runnable, but response generation will be CPU-bound and slow.")
279
+ return tier, summary, details, est_tps
280
+
281
+ # CPU Only Inference (No GPU or very small VRAM)
282
+ if total_memory_gb <= (hw.ram.total_gb * 0.45):
283
+ if billions <= 2.0:
284
+ tier = cls.TIER_RECOMMENDED
285
+ est_tps = 14.0
286
+ summary = "Compact architecture runs smoothly on modern CPU."
287
+ else:
288
+ tier = cls.TIER_USABLE
289
+ est_tps = 7.0
290
+ summary = f"Runs purely in System RAM ({total_memory_gb:.1f} GB) via CPU multi-threading."
291
+ elif total_memory_gb <= (hw.ram.total_gb * 0.8):
292
+ tier = cls.TIER_HEAVY
293
+ est_tps = 2.5
294
+ summary = f"Heavy CPU workload: requires {total_memory_gb:.1f} GB of {hw.ram.total_gb:.1f} GB System RAM."
295
+ details.append("Noticeable system slowdown may occur during generation.")
296
+ else:
297
+ tier = cls.TIER_NOT_RECOMMENDED
298
+ est_tps = 0.8
299
+ summary = f"Consumes {total_memory_gb:.1f} GB RAM; risks system freeze or paging."
300
+
301
+ return tier, summary, details, est_tps
302
+
303
+ def __init__(self, hw: Optional[HardwareProfile] = None):
304
+ self.hw = hw or HardwareAnalyzer.detect()
305
+ self.profile = self.hw
306
+
307
+ def evaluate(self, model_dict_or_name: Union[Dict[str, Any], str], context_len: int = 8192) -> CompatibilityReport:
308
+ if isinstance(model_dict_or_name, str):
309
+ name = model_dict_or_name
310
+ params = name
311
+ size_gb = 0.0
312
+ else:
313
+ name = model_dict_or_name.get("name", "model")
314
+ params = model_dict_or_name.get("params", name)
315
+ size_gb = float(model_dict_or_name.get("size_gb", 0.0))
316
+ context_len = int(model_dict_or_name.get("context", context_len))
317
+
318
+ return self.evaluate_model(
319
+ model_name=name,
320
+ params_str=params,
321
+ size_gb=size_gb,
322
+ context_len=context_len,
323
+ hardware=self.hw,
324
+ )
325
+
326
+ def recommend_models(self, catalog_models: List[Dict[str, Any]]) -> Dict[str, List[Dict[str, Any]]]:
327
+ """Categorize catalog models into optimal hardware-supported recommendations."""
328
+ evaluated = []
329
+ for m in catalog_models:
330
+ rep = self.evaluate(m)
331
+ evaluated.append({"model": m, "compat": rep})
332
+
333
+ # Filter to viable tiers
334
+ viable = [
335
+ e for e in evaluated
336
+ if e["compat"].tier in (self.TIER_EXCELLENT, self.TIER_RECOMMENDED, self.TIER_USABLE)
337
+ ]
338
+
339
+ def _sort_best(items):
340
+ order = {self.TIER_EXCELLENT: 0, self.TIER_RECOMMENDED: 1, self.TIER_USABLE: 2}
341
+ return sorted(items, key=lambda x: (order.get(x["compat"].tier, 9), -x["compat"].estimated_tps))
342
+
343
+ coding = [e for e in viable if "coding" in e["model"].get("categories", []) or "code" in e["model"].get("caps", [])]
344
+ reasoning = [e for e in viable if "reasoning" in e["model"].get("categories", []) or "reasoning" in e["model"].get("caps", [])]
345
+ fast = [e for e in viable if "small" in e["model"].get("categories", []) or e["compat"].estimated_tps >= 25.0]
346
+
347
+ return {
348
+ "best_coding": _sort_best(coding),
349
+ "best_reasoning": _sort_best(reasoning),
350
+ "best_fast": _sort_best(fast),
351
+ "all_viable": viable,
352
+ }
@@ -0,0 +1,31 @@
1
+ """
2
+ CAT Compute Fabric Package per §25, §26, §87-§90.
3
+ """
4
+
5
+ from __future__ import annotations
6
+
7
+ from calc_terminal.compute.fabric import (
8
+ ComputeTarget,
9
+ ComputeTargetType,
10
+ ComputeTargetStatus,
11
+ LocalCPUTarget,
12
+ LocalGPUTarget,
13
+ OllamaTarget,
14
+ DockerTarget,
15
+ WSLTarget,
16
+ ComputeFabric,
17
+ compute_fabric,
18
+ )
19
+
20
+ __all__ = [
21
+ "ComputeTarget",
22
+ "ComputeTargetType",
23
+ "ComputeTargetStatus",
24
+ "LocalCPUTarget",
25
+ "LocalGPUTarget",
26
+ "OllamaTarget",
27
+ "DockerTarget",
28
+ "WSLTarget",
29
+ "ComputeFabric",
30
+ "compute_fabric",
31
+ ]