cconnect 1.8.8__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.

Potentially problematic release.


This version of cconnect might be problematic. Click here for more details.

Files changed (98) hide show
  1. cconnect-1.8.8.dist-info/METADATA +44 -0
  2. cconnect-1.8.8.dist-info/RECORD +98 -0
  3. cconnect-1.8.8.dist-info/WHEEL +5 -0
  4. cconnect-1.8.8.dist-info/entry_points.txt +2 -0
  5. cconnect-1.8.8.dist-info/top_level.txt +6 -0
  6. core/__init__.py +0 -0
  7. core/access.py +17 -0
  8. core/app.py +97 -0
  9. core/cli.py +584 -0
  10. core/cli_manager.py +169 -0
  11. core/config.py +131 -0
  12. core/data_migration.py +116 -0
  13. core/db.py +66 -0
  14. core/models.py +110 -0
  15. core/paths.py +68 -0
  16. core/prompts/BLOCKS.md +17 -0
  17. core/prompts/BROWSER.md +10 -0
  18. core/prompts/CCONNECT.md +28 -0
  19. core/prompts/COMMIT.md +13 -0
  20. core/prompts/SUGGESTIONS.md +20 -0
  21. core/rate_limit.py +10 -0
  22. core/release.py +5 -0
  23. core/responses.py +65 -0
  24. core/sdk.py +63 -0
  25. core/settings_defs.py +49 -0
  26. core/ws.py +11 -0
  27. mcps/__init__.py +79 -0
  28. mcps/browser.py +122 -0
  29. mcps/check_progress.py +196 -0
  30. mcps/components.py +339 -0
  31. mcps/media.py +67 -0
  32. mcps/session.py +89 -0
  33. mcps/terminal.py +139 -0
  34. middleware/__init__.py +0 -0
  35. middleware/error_handler.py +27 -0
  36. middleware/public_auth.py +54 -0
  37. middleware/security.py +40 -0
  38. routers/__init__.py +0 -0
  39. routers/accounts.py +142 -0
  40. routers/browser.py +114 -0
  41. routers/capabilities.py +61 -0
  42. routers/chat.py +527 -0
  43. routers/claude.py +184 -0
  44. routers/cli.py +52 -0
  45. routers/git.py +111 -0
  46. routers/health.py +28 -0
  47. routers/list.py +44 -0
  48. routers/network.py +105 -0
  49. routers/projects.py +95 -0
  50. routers/sessions.py +358 -0
  51. routers/settings.py +39 -0
  52. routers/shared.py +229 -0
  53. routers/system.py +89 -0
  54. routers/terminal.py +105 -0
  55. schemas/__init__.py +0 -0
  56. schemas/accounts.py +40 -0
  57. schemas/chat.py +60 -0
  58. schemas/network.py +23 -0
  59. services/__init__.py +0 -0
  60. services/account_login.py +158 -0
  61. services/accounts.py +496 -0
  62. services/attachments.py +59 -0
  63. services/blocks.py +54 -0
  64. services/browser.py +831 -0
  65. services/categories.py +213 -0
  66. services/chat_list.py +297 -0
  67. services/claude_assets.py +337 -0
  68. services/claude_manage.py +136 -0
  69. services/claude_runtime.py +1217 -0
  70. services/claude_status.py +70 -0
  71. services/cli_info.py +296 -0
  72. services/cli_settings.py +160 -0
  73. services/diffs.py +44 -0
  74. services/directories.py +38 -0
  75. services/files.py +29 -0
  76. services/git.py +26 -0
  77. services/git_ops.py +263 -0
  78. services/live_sessions.py +560 -0
  79. services/network.py +522 -0
  80. services/project_files.py +326 -0
  81. services/project_watch.py +172 -0
  82. services/projects.py +62 -0
  83. services/providers.py +165 -0
  84. services/questions.py +93 -0
  85. services/repo.py +82 -0
  86. services/rewind.py +94 -0
  87. services/sessions.py +1593 -0
  88. services/settings_store.py +117 -0
  89. services/shared.py +525 -0
  90. services/shared_watch.py +132 -0
  91. services/speedtest.py +104 -0
  92. services/system_monitor.py +285 -0
  93. services/system_watch.py +99 -0
  94. services/terminal.py +256 -0
  95. services/todos.py +63 -0
  96. services/trash.py +127 -0
  97. services/usage.py +236 -0
  98. services/visibility.py +157 -0
@@ -0,0 +1,44 @@
1
+ Metadata-Version: 2.4
2
+ Name: cconnect
3
+ Version: 1.8.8
4
+ Summary: Remote bridge between the CConnect client and Claude Code
5
+ Author: jahirtrap
6
+ License-Expression: MIT
7
+ Project-URL: Homepage, https://cconnect.dev
8
+ Project-URL: Repository, https://github.com/jahirxtrap/cconnect
9
+ Keywords: claude,claude-code,anthropic,remote,mobile
10
+ Classifier: Environment :: Console
11
+ Classifier: Intended Audience :: Developers
12
+ Classifier: Operating System :: OS Independent
13
+ Classifier: Programming Language :: Python :: 3
14
+ Classifier: Topic :: Software Development
15
+ Requires-Python: >=3.11
16
+ Description-Content-Type: text/markdown
17
+ Requires-Dist: fastapi>=0.136.0
18
+ Requires-Dist: uvicorn[standard]>=0.45.0
19
+ Requires-Dist: pydantic>=2.13.3
20
+ Requires-Dist: loguru>=0.7.3
21
+ Requires-Dist: orjson>=3.12.0
22
+ Requires-Dist: python-dotenv>=1.0.0
23
+ Requires-Dist: slowapi>=0.1.9
24
+ Requires-Dist: httpx>=0.28.0
25
+ Requires-Dist: claude-agent-sdk>=0.2.148
26
+ Requires-Dist: qrcode>=7.4.2
27
+ Requires-Dist: sqlalchemy>=2.0.0
28
+ Requires-Dist: pillow>=10.0.0
29
+ Requires-Dist: psutil>=5.9.0
30
+ Requires-Dist: nvidia-ml-py>=12.0.0
31
+ Requires-Dist: py7zr>=1.0.0
32
+ Requires-Dist: rarfile>=4.2
33
+ Requires-Dist: watchdog>=4.0.0
34
+ Requires-Dist: pywinpty>=2.0.13; sys_platform == "win32"
35
+ Requires-Dist: ptyprocess>=0.7.0; sys_platform != "win32"
36
+ Provides-Extra: dev
37
+ Requires-Dist: pytest>=9.0.3; extra == "dev"
38
+ Requires-Dist: pytest-asyncio>=1.3.0; extra == "dev"
39
+
40
+ CConnect drives Claude Code running on your PC from an Android app, a desktop app
41
+ for Windows, Linux and macOS, or any browser.
42
+
43
+ This is the backend: install it and run `cconnect`. The apps, the docs and the
44
+ install one-liners are at https://cconnect.dev
@@ -0,0 +1,98 @@
1
+ core/__init__.py,sha256=47DEQpj8HBSa-_TImW-5JCeuQeRkm5NMpJWZG3hSuFU,0
2
+ core/access.py,sha256=8WxoF6uqszWB3II6b_UIlKXKqlvEGzfxVZpMzY58Tao,446
3
+ core/app.py,sha256=xlSGRoRL6M6cwVWxUI0VYL_3eXUfTWDIlLlsWLNynXI,2968
4
+ core/cli.py,sha256=yXv6gniVZv9D76-uYQNDGzXDHcoyJOALu2McxlRaKcU,22544
5
+ core/cli_manager.py,sha256=LbUcscUUQUbaDGuT_oCQAVpXsAKsEnVaeEM6kX9r4uE,5912
6
+ core/config.py,sha256=XQ_dyw3rSS75RLmVnLR8PVw-avQVbQ0R-3lgRNJamlE,4878
7
+ core/data_migration.py,sha256=VuvLvTWpTaY25XgY7CTUOwZtGH8_6DB-7cIDbarjKVw,3933
8
+ core/db.py,sha256=4hK0Q3v7HGPcCqFLVyMDQ8-5Ls3zBTBJHIhgtpdQDHE,2806
9
+ core/models.py,sha256=q1VQJt28TGs5IBPp2vs_6PgIQPRyl4GRM6yR0QFUTj8,3908
10
+ core/paths.py,sha256=tUiyAKjqCrQCuXGwcC4KIw4aMUGd6VvINdSYGfwoapk,2113
11
+ core/rate_limit.py,sha256=aH-oFMxd94dqvzsNCNHKHt0aOpn4oBi-NK0sNPrOWRA,227
12
+ core/release.py,sha256=TopPpjvSiXOw1OfPF0BH2VIOo9nhjo8bnH-GKWY7-VU,148
13
+ core/responses.py,sha256=4nStMYHOw_RQ62f-eCIilJZsZoOPwwWdAAqkJlyfOa0,1989
14
+ core/sdk.py,sha256=xkdaS8LannErUShC12-a9f-fY9a3OpQBi2MRw3hCGKQ,2174
15
+ core/settings_defs.py,sha256=2ZxIUiUFP7VGpvY0yA6jHOD55xE6KSVs9QnjxtS965Q,3848
16
+ core/ws.py,sha256=DctsLlzvhco8ym4lxxIAhXPkhs4Ez1qateUU63WGkns,346
17
+ core/prompts/BLOCKS.md,sha256=oLRcT4uEPCvqWFOtai3ls0xWr4fXZcD5uqf80Fv8I8s,520
18
+ core/prompts/BROWSER.md,sha256=fTLevrS4XProhkMZ21vMxHGOO1F1nbnfCv8NxG6NE9I,636
19
+ core/prompts/CCONNECT.md,sha256=i0eF_sZj2EpwtiIo-7ZhqzuuO7Ipba8GbIXChuWFkNo,1462
20
+ core/prompts/COMMIT.md,sha256=x6rruy9fQuBDiTds6Zoe0ElJ7ORoTPwLHwGV1vfbJg0,746
21
+ core/prompts/SUGGESTIONS.md,sha256=2BP4NUfaZ6S8XBhiohm3w4SGt3bxHB5a-ZoEI31ye0g,742
22
+ mcps/__init__.py,sha256=wKWxUD2phzEKnpJ8rp8q5GNl5QuParZljlxVaipbrx4,3218
23
+ mcps/browser.py,sha256=_VQVyH66WGoVHd5HO2j0ZaBGJFYg_W8zVNpCumagyQI,4331
24
+ mcps/check_progress.py,sha256=HjojFfG19tgLZuqgRXOcCAHLPjPv1lXhX1lWt-hyE3Q,8137
25
+ mcps/components.py,sha256=CBtQ-8IxjxAkTM384vTUHB5LM5Ih3zH3PXN-46ipDtw,15597
26
+ mcps/media.py,sha256=qTpTLgICZVwqEvTeR_wHNbN_G_zhk1lgj39Nq9xG1AA,2256
27
+ mcps/session.py,sha256=bAkDOouwQ3BfEUf6PJ9u8LMDx5X90Azbsio8yu7Peqw,3487
28
+ mcps/terminal.py,sha256=ak8WuFlS4LkX2oS4YlD5njAcb6l_8QMp0px65trjUvc,5316
29
+ middleware/__init__.py,sha256=47DEQpj8HBSa-_TImW-5JCeuQeRkm5NMpJWZG3hSuFU,0
30
+ middleware/error_handler.py,sha256=zE2yhfLU_93uqvhzNR_tcFZiW2g06OjGLFCzjlvXe1o,1104
31
+ middleware/public_auth.py,sha256=eiVxYoX2Bg5LnfnLlQi_bm4p64NeIMWf-GWhxiRxkjk,1845
32
+ middleware/security.py,sha256=KewtVYm8vnnDvrOlK1OIO34bbLfr-4f30UaT7dA5TQ0,1521
33
+ routers/__init__.py,sha256=47DEQpj8HBSa-_TImW-5JCeuQeRkm5NMpJWZG3hSuFU,0
34
+ routers/accounts.py,sha256=3FiEfPAo1bnrvvY1KUh1hfA4t1JO9Mm8_kUdstXiy0o,5047
35
+ routers/browser.py,sha256=ekKUHOW_qFR8PYKxvJQ8-PIU-zmLwumnrsMwDXA2oC8,3795
36
+ routers/capabilities.py,sha256=vU1Na1sGY1F-ce6wBF6Hhl1H47gsUMQAxXidU27GZFk,2243
37
+ routers/chat.py,sha256=azzwuU4YnHNvT7fVFq7FRaXgaN7So1VBg5svKhLJhXI,25338
38
+ routers/claude.py,sha256=9jk4vZ_HMQW5lRhO0olTpujHiQUAwnb3Wf4N1MEvUuc,5670
39
+ routers/cli.py,sha256=D6nk7xSOZRrpzcs09V_3OkRNIim28WAPEJHLgcMrJFc,1286
40
+ routers/git.py,sha256=N1qhNn2SIDaRjUadJeS-vvNGsj11kUnQi-1wdk7fYxE,4597
41
+ routers/health.py,sha256=CSxh2a0JmWWQlBk06esAlbzXr_7bg2YsU8DlVgegFPo,884
42
+ routers/list.py,sha256=k82lZURSv-qGcSwpMCiXU_6ea5K4BcVwFqiqE13VcSA,1275
43
+ routers/network.py,sha256=uMJPHEmXYPGUgH4kwmR71Qr-Vqa_vg5vJI52-_zi_LI,3190
44
+ routers/projects.py,sha256=RYOVgd_QChMNHKZe8TGlm4U9lgjC1sF5Hi37-5L2x2k,3285
45
+ routers/sessions.py,sha256=Haz1BcFxgwF6zqfvldzt9btbemvaSx7QLDZBzqHIUdA,13205
46
+ routers/settings.py,sha256=_pdfW2xZDTQ8FCGrwm7CDzNVsgGcT-W4DSmtZKpRRak,1211
47
+ routers/shared.py,sha256=V-zgFmmkkERkXnFt0BqTVghommc6fDId7HoWBEbyGnk,7306
48
+ routers/system.py,sha256=a5vR9cerKj3lV8yJCgjtOz59_aLKXNNrwAItMOpePiY,2476
49
+ routers/terminal.py,sha256=YqncTL6dAVFmk02kBEvuksjoCoC_ksxhrS8sCHzmL_o,3580
50
+ schemas/__init__.py,sha256=47DEQpj8HBSa-_TImW-5JCeuQeRkm5NMpJWZG3hSuFU,0
51
+ schemas/accounts.py,sha256=-T49ChsTw4a06XI3sdbBdz-aTYrjKtF4S24sYD7MjOk,783
52
+ schemas/chat.py,sha256=z8J4cw73hCLmkzZ6KJezsBMM1HmzO94uhiaQqpuQkxI,1544
53
+ schemas/network.py,sha256=9cszbUzf_OFuGQcIAjnNVFfjvl7WF-9tSmNg20515Gs,381
54
+ services/__init__.py,sha256=47DEQpj8HBSa-_TImW-5JCeuQeRkm5NMpJWZG3hSuFU,0
55
+ services/account_login.py,sha256=3D0OLr4RiwdJbJ1vvFx5MdIWjX51HTmYoSaDnmLDkvQ,4780
56
+ services/accounts.py,sha256=gL2gQ2Yu98JULtYTyKRmsvi9BrUcHD4_a-I7pqeu2tQ,17722
57
+ services/attachments.py,sha256=ozhN9iLFtNMUIcnpWEZpU6FI4SQ4Pw8ULDKjH_IIqgI,1971
58
+ services/blocks.py,sha256=Rk1ekPn-mbagIWyJY00XXTJlZpK5-XqgoKh8WUa1Qpc,1767
59
+ services/browser.py,sha256=FcQrO-z42RYoAt3stEBPRVYj-hIfAp6YmqCyTZBl14Y,31668
60
+ services/categories.py,sha256=2zQvlKUutwSL_ElS8AfPi3zrT2VAzC4v_ThAhEMFqWc,7984
61
+ services/chat_list.py,sha256=eG5nKrpYXIxkXDI65g8U-aLHPIMm-qpMMDu86PVIowg,11590
62
+ services/claude_assets.py,sha256=WIyxbKwNDjEv1R3M8F7qGqWAABxjM4EaeqeDgLt9fqM,12460
63
+ services/claude_manage.py,sha256=dvFJOzpaKFNPkAE9vDfdTaJdXqbNvVt6zHOHjrnXb9w,4947
64
+ services/claude_runtime.py,sha256=xMYRyYIMk5H65_MsTubYXU7gUhCYkTaxM0vGB4jORaY,53702
65
+ services/claude_status.py,sha256=vYKQ0IDh746sLhtqvuQzCnTLOgBzUEirf4mI37ZPnxc,2442
66
+ services/cli_info.py,sha256=63DXhOb_PZJu_7hwlOT-6FQ6M3hs_U-thhAEqWnnBIg,10888
67
+ services/cli_settings.py,sha256=510p6JvJZuBqlCQC5JscS5a7HMpQ7DDawDWoV5Btm8A,4669
68
+ services/diffs.py,sha256=XInKjtWmL9LxXkVq6eHSmeA3-bnomWZrHQheXAeWUS0,1574
69
+ services/directories.py,sha256=XADUdhIMLGGzOXkPjtscHbbPxz23TrdIgLMTRlKoNXQ,1405
70
+ services/files.py,sha256=vl3qamCb7Qk93WJe3vljTrnyUgCPjY_CBvzU4e5fY7w,858
71
+ services/git.py,sha256=1PA58F06_EqtMfvYB3GadUmlBl3iTeoJfnWCIQIcL2U,827
72
+ services/git_ops.py,sha256=F1B7JECP-2d9wdHd7FK1i_VC6S7XSuygvsjincisx6w,10611
73
+ services/live_sessions.py,sha256=rd038GTUdxIJ95jpnhhrebQmLr8-g6ORM5F39jWn9EY,21368
74
+ services/network.py,sha256=a1Au6y_uEKapAZifLTSFVohnAFgJoY6WjEiqPjyfdG4,18044
75
+ services/project_files.py,sha256=mcBUG3X47vLPIwvc63YSgl3H56ycbwf8wsxflEP_we0,11007
76
+ services/project_watch.py,sha256=GHgYjK33hs-p2zd7oFOAREDLxdHQSAtWFfElJF7qtcA,5829
77
+ services/projects.py,sha256=Nissy15y2xvhi4aIPZG3cwhYAY8u0LDGiWnKR6Voeag,2008
78
+ services/providers.py,sha256=AYljwxFRgzESZxN6FQi_h7VmVGiFYBTXrB_Qb97izos,6643
79
+ services/questions.py,sha256=5BS0gZEtPWhyhnteLWDi6Ne4QB0tYvq7UL5SCjnvqG8,3650
80
+ services/repo.py,sha256=y1n15IBKG695mVPuvENpS05ZAfM-6AqOJmrLL2UonBY,2340
81
+ services/rewind.py,sha256=y8_mQnDYNu7Vq1Y0aTDN6uSsCsH4xYfupleTfCAZvc4,3402
82
+ services/sessions.py,sha256=ZC-6lcoMq72vj9NdAgtHS9WxH--NAeEIUb6dXlWb-rs,64704
83
+ services/settings_store.py,sha256=8T3jSe8Km2PvdVGoPLZbIDAYK9SgCTsl6jKcG1HaD8k,3759
84
+ services/shared.py,sha256=bEvgrIYWutCioe0YiYqo2WaWYQFVWaEE5zjnekQiKA0,19643
85
+ services/shared_watch.py,sha256=vZcWAc6RkMq7AxoCnu2us2YjmFC8lBpU0kM-L2CaGEg,4371
86
+ services/speedtest.py,sha256=c8daT6HzPvlNX7wuhO6N2r08iW87wCcLe5xMdlPhQOA,3510
87
+ services/system_monitor.py,sha256=pHkRmnNBm9fvrRp6m-HVC_DbACGTdefPki3jrbOuHJU,8599
88
+ services/system_watch.py,sha256=dVv73It1RVyLaULJdoqMoPxVjlOxyIB4pmvM_863RPU,3080
89
+ services/terminal.py,sha256=gaO8QLUALEiFJP3cCW5r30WylxyD9Z-tL95uup9dtFY,8021
90
+ services/todos.py,sha256=QtQ_8UyO9gKKAraeHRIbGo2xi8RvwsHshCG22dQScgs,1738
91
+ services/trash.py,sha256=r4pKOhRMyYFCK7CC_SKJq-2yeAYlBSh_b6vTXyox5sQ,4119
92
+ services/usage.py,sha256=uEiDOfSRNLkxlj_BPkYw3h-2YHBlfvqYvGjVZNgJ6tE,7955
93
+ services/visibility.py,sha256=g87pH9CDbU3J6V03RWBBIoD0jRASqqcTTC3M11fUdQo,5291
94
+ cconnect-1.8.8.dist-info/METADATA,sha256=VtftNhOPXxmOkBN5fuk1Z8zmfbKq0oyPQlzPrAdFjYs,1679
95
+ cconnect-1.8.8.dist-info/WHEEL,sha256=YVMoNqKzERt-wjUZwJ33xBGAwnFl-4cqbYkTtWa4itE,91
96
+ cconnect-1.8.8.dist-info/entry_points.txt,sha256=XXx5guxUfioIkzvIL2AivSJ20CMsQeKtdlaj0omn-w8,43
97
+ cconnect-1.8.8.dist-info/top_level.txt,sha256=8lAYuK1x08_3n8GR9dkUzxyzqmEGzwEkV9lSodgcSJE,46
98
+ cconnect-1.8.8.dist-info/RECORD,,
@@ -0,0 +1,5 @@
1
+ Wheel-Version: 1.0
2
+ Generator: setuptools (84.0.0)
3
+ Root-Is-Purelib: true
4
+ Tag: py3-none-any
5
+
@@ -0,0 +1,2 @@
1
+ [console_scripts]
2
+ cconnect = core.cli:main
@@ -0,0 +1,6 @@
1
+ core
2
+ mcps
3
+ middleware
4
+ routers
5
+ schemas
6
+ services
core/__init__.py ADDED
File without changes
core/access.py ADDED
@@ -0,0 +1,17 @@
1
+ """The security key gating what belongs to the machine itself: shells and ignored files."""
2
+
3
+ import hmac
4
+
5
+ from core.config import PUBLIC_ACCESS_TOKEN, SECURITY_KEY
6
+
7
+ KEY_HEADER = "X-Security-Key"
8
+
9
+
10
+ def gated() -> bool:
11
+ return PUBLIC_ACCESS_TOKEN is not None
12
+
13
+
14
+ def key_matches(candidate: str) -> bool:
15
+ if not gated():
16
+ return True
17
+ return bool(SECURITY_KEY) and hmac.compare_digest(candidate or "", SECURITY_KEY)
core/app.py ADDED
@@ -0,0 +1,97 @@
1
+ """CConnect — FastAPI application entry point."""
2
+
3
+ import importlib
4
+ import os
5
+ import pkgutil
6
+
7
+ from contextlib import asynccontextmanager
8
+
9
+ from fastapi import FastAPI, Request
10
+ from fastapi.middleware.cors import CORSMiddleware
11
+ from fastapi.middleware.gzip import GZipMiddleware
12
+ from slowapi.errors import RateLimitExceeded
13
+
14
+ from core import data_migration, paths
15
+ from core.config import PORT
16
+ from core.db import init_db
17
+ from core.rate_limit import limiter
18
+ from core.responses import api_response
19
+ from core.sdk import ensure_sdk_installed, ensure_subscription_auth
20
+ from services import settings_store, system_monitor
21
+ from middleware.error_handler import register_error_handlers
22
+ from middleware.public_auth import register_public_auth_middleware
23
+ from middleware.security import register_security_middleware
24
+ import routers as routers_pkg
25
+
26
+
27
+ @asynccontextmanager
28
+ async def lifespan(app: FastAPI):
29
+ data_migration.migrate()
30
+ init_db()
31
+ settings_store.load()
32
+ paths.RUNTIME_FILE.write_text(f"PORT={PORT}\nPID={os.getpid()}\n", encoding="utf-8")
33
+ system_monitor.setup_log_capture()
34
+ ensure_subscription_auth()
35
+ await ensure_sdk_installed()
36
+ from services import cli_info
37
+ await cli_info.refresh()
38
+ from services import chat_list
39
+ await chat_list.hub.start()
40
+ from services import project_watch, shared_watch, system_watch
41
+ await shared_watch.hub.start()
42
+ await project_watch.hub.start()
43
+ await system_watch.hub.start()
44
+ from services import network
45
+ await network.watchdog.start()
46
+ yield
47
+ chat_list.hub.stop()
48
+ shared_watch.hub.stop()
49
+ project_watch.hub.stop()
50
+ system_watch.hub.stop()
51
+ network.watchdog.stop()
52
+ paths.RUNTIME_FILE.unlink(missing_ok=True)
53
+
54
+
55
+ app = FastAPI(
56
+ title="CConnect API",
57
+ version="0.1.0",
58
+ description="Remote bridge between the CConnect mobile app and Claude Code",
59
+ docs_url=None,
60
+ redoc_url=None,
61
+ openapi_url=None,
62
+ lifespan=lifespan,
63
+ )
64
+
65
+ app.state.limiter = limiter
66
+
67
+
68
+ async def _rate_limit_handler(request: Request, exc: RateLimitExceeded):
69
+ return api_response(status=429)
70
+
71
+
72
+ app.add_exception_handler(RateLimitExceeded, _rate_limit_handler)
73
+
74
+ app.add_middleware(GZipMiddleware, minimum_size=512)
75
+ register_security_middleware(app)
76
+ register_public_auth_middleware(app)
77
+ app.add_middleware(
78
+ CORSMiddleware,
79
+ allow_origins=["*"],
80
+ allow_methods=["*"],
81
+ allow_headers=["*"],
82
+ )
83
+ register_error_handlers(app)
84
+
85
+ for module_info in pkgutil.iter_modules(routers_pkg.__path__):
86
+ module = importlib.import_module(f"routers.{module_info.name}")
87
+ if hasattr(module, "router"):
88
+ app.include_router(module.router, prefix="/api")
89
+
90
+
91
+ @app.api_route(
92
+ "/{path:path}",
93
+ methods=["GET", "POST", "PUT", "DELETE", "PATCH", "HEAD"],
94
+ include_in_schema=False,
95
+ )
96
+ async def catch_all(request: Request, path: str):
97
+ return api_response(status=404)