cccc-pair 0.4.34__py3-none-win_amd64.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 (813) hide show
  1. cccc/__init__.py +16 -0
  2. cccc/_native/__init__.py +1 -0
  3. cccc/_native/cccc-rust.exe +0 -0
  4. cccc/cli/__init__.py +43 -0
  5. cccc/cli/__main__.py +7 -0
  6. cccc/cli/actor_cmds.py +478 -0
  7. cccc/cli/common.py +671 -0
  8. cccc/cli/daemon_lifecycle.py +172 -0
  9. cccc/cli/group_cmds.py +354 -0
  10. cccc/cli/im_cmds.py +841 -0
  11. cccc/cli/installation_diagnostics.py +117 -0
  12. cccc/cli/main.py +612 -0
  13. cccc/cli/messaging_cmds.py +490 -0
  14. cccc/cli/runtime_hook_cmd.py +61 -0
  15. cccc/cli/space_cmds.py +488 -0
  16. cccc/cli/system_cmds.py +645 -0
  17. cccc/contracts/__init__.py +2 -0
  18. cccc/contracts/v1/__init__.py +148 -0
  19. cccc/contracts/v1/actor.py +85 -0
  20. cccc/contracts/v1/actor_profile.py +56 -0
  21. cccc/contracts/v1/assistant.py +117 -0
  22. cccc/contracts/v1/async_result.py +40 -0
  23. cccc/contracts/v1/automation.py +111 -0
  24. cccc/contracts/v1/event.py +334 -0
  25. cccc/contracts/v1/group_bridge.py +105 -0
  26. cccc/contracts/v1/group_space.py +109 -0
  27. cccc/contracts/v1/ipc.py +31 -0
  28. cccc/contracts/v1/message.py +140 -0
  29. cccc/contracts/v1/notify.py +76 -0
  30. cccc/contracts/v1/presentation.py +60 -0
  31. cccc/daemon/__init__.py +2 -0
  32. cccc/daemon/actor_runtime_cache.py +38 -0
  33. cccc/daemon/actors/__init__.py +3 -0
  34. cccc/daemon/actors/actor_add_ops.py +402 -0
  35. cccc/daemon/actors/actor_exit_ops.py +75 -0
  36. cccc/daemon/actors/actor_lifecycle_ops.py +741 -0
  37. cccc/daemon/actors/actor_membership_ops.py +192 -0
  38. cccc/daemon/actors/actor_ops.py +336 -0
  39. cccc/daemon/actors/actor_profile_ops.py +507 -0
  40. cccc/daemon/actors/actor_profile_runtime.py +319 -0
  41. cccc/daemon/actors/actor_profile_store.py +735 -0
  42. cccc/daemon/actors/actor_runtime_ops.py +546 -0
  43. cccc/daemon/actors/actor_update_ops.py +408 -0
  44. cccc/daemon/actors/private_env_ops.py +271 -0
  45. cccc/daemon/actors/runner_ops.py +176 -0
  46. cccc/daemon/actors/web_model_actor_policy.py +88 -0
  47. cccc/daemon/actors/web_model_browser_delivery.py +1556 -0
  48. cccc/daemon/actors/web_model_browser_launch_policy.py +21 -0
  49. cccc/daemon/actors/web_model_browser_ops.py +89 -0
  50. cccc/daemon/actors/web_model_browser_recovery_watcher.py +420 -0
  51. cccc/daemon/actors/web_model_browser_session.py +572 -0
  52. cccc/daemon/actors/web_model_runtime_ops.py +775 -0
  53. cccc/daemon/assistants/__init__.py +1 -0
  54. cccc/daemon/assistants/assistant_ops.py +6902 -0
  55. cccc/daemon/assistants/assistant_state_views.py +50 -0
  56. cccc/daemon/assistants/local_asr_model_selection.py +121 -0
  57. cccc/daemon/assistants/local_streaming_asr.py +127 -0
  58. cccc/daemon/assistants/sense_voice_text.py +12 -0
  59. cccc/daemon/assistants/sherpa_diarization.py +345 -0
  60. cccc/daemon/assistants/sherpa_diarization_worker.py +178 -0
  61. cccc/daemon/assistants/sherpa_offline_asr.py +285 -0
  62. cccc/daemon/assistants/sherpa_offline_worker.py +108 -0
  63. cccc/daemon/assistants/sherpa_streaming_asr.py +280 -0
  64. cccc/daemon/assistants/sherpa_streaming_worker.py +134 -0
  65. cccc/daemon/assistants/sherpa_vad_segments.py +205 -0
  66. cccc/daemon/assistants/sherpa_vad_worker.py +105 -0
  67. cccc/daemon/assistants/voice_direct_dictation.py +21 -0
  68. cccc/daemon/assistants/voice_final_asr.py +377 -0
  69. cccc/daemon/assistants/voice_final_asr_debug.py +52 -0
  70. cccc/daemon/assistants/voice_final_document_apply.py +240 -0
  71. cccc/daemon/assistants/voice_idle_review_scheduler.py +62 -0
  72. cccc/daemon/assistants/voice_models.py +1255 -0
  73. cccc/daemon/assistants/voice_pcm_segments.py +182 -0
  74. cccc/daemon/assistants/voice_prompt_refine.py +85 -0
  75. cccc/daemon/assistants/voice_runtime_deps.py +654 -0
  76. cccc/daemon/assistants/voice_secretary_output_completion.py +198 -0
  77. cccc/daemon/assistants/voice_secretary_runtime_ops.py +288 -0
  78. cccc/daemon/assistants/voice_secretary_service.py +477 -0
  79. cccc/daemon/assistants/voice_service_runtime.py +319 -0
  80. cccc/daemon/assistants/voice_speaker_identity.py +952 -0
  81. cccc/daemon/assistants/voice_speaker_transcript_windows.py +155 -0
  82. cccc/daemon/assistants/voice_speaker_transcripts.py +77 -0
  83. cccc/daemon/assistive_jobs.py +604 -0
  84. cccc/daemon/automation/__init__.py +4 -0
  85. cccc/daemon/automation/automation_ops.py +712 -0
  86. cccc/daemon/automation/engine.py +2274 -0
  87. cccc/daemon/browser/__init__.py +2 -0
  88. cccc/daemon/browser/projected_browser_runtime.py +2177 -0
  89. cccc/daemon/claude_app_sessions.py +1955 -0
  90. cccc/daemon/client_ops.py +303 -0
  91. cccc/daemon/codex_app_sessions.py +2333 -0
  92. cccc/daemon/codex_app_thread_ops.py +155 -0
  93. cccc/daemon/codex_config_ops.py +63 -0
  94. cccc/daemon/context/__init__.py +3 -0
  95. cccc/daemon/context/context_ops.py +1429 -0
  96. cccc/daemon/group/__init__.py +3 -0
  97. cccc/daemon/group/bootstrap_actor_ops.py +310 -0
  98. cccc/daemon/group/group_bootstrap_ops.py +90 -0
  99. cccc/daemon/group/group_creation_ops.py +191 -0
  100. cccc/daemon/group/group_lifecycle_ops.py +447 -0
  101. cccc/daemon/group/group_ops.py +824 -0
  102. cccc/daemon/group/group_settings_ops.py +245 -0
  103. cccc/daemon/group/group_state_ops.py +89 -0
  104. cccc/daemon/group/presentation_browser_ops.py +115 -0
  105. cccc/daemon/group/presentation_browser_runtime.py +126 -0
  106. cccc/daemon/group/presentation_ops.py +706 -0
  107. cccc/daemon/group_bridge/__init__.py +6 -0
  108. cccc/daemon/group_bridge/cross_group_receipt_projection.py +126 -0
  109. cccc/daemon/group_bridge/identity.py +117 -0
  110. cccc/daemon/group_bridge/ops.py +380 -0
  111. cccc/daemon/group_bridge/peer_address_sync.py +32 -0
  112. cccc/daemon/group_bridge/receiver.py +308 -0
  113. cccc/daemon/group_bridge/remote_attachments.py +121 -0
  114. cccc/daemon/group_bridge/remote_dispatch.py +357 -0
  115. cccc/daemon/group_bridge/remote_outbox_worker.py +166 -0
  116. cccc/daemon/group_bridge/remote_payloads.py +49 -0
  117. cccc/daemon/group_bridge/reply_relay.py +199 -0
  118. cccc/daemon/group_bridge/route_lookup.py +76 -0
  119. cccc/daemon/group_bridge/transports/__init__.py +34 -0
  120. cccc/daemon/group_bridge/transports/base.py +105 -0
  121. cccc/daemon/group_bridge/transports/group_bridge_session.py +166 -0
  122. cccc/daemon/group_bridge/ws_auth.py +51 -0
  123. cccc/daemon/group_bridge/ws_client.py +258 -0
  124. cccc/daemon/group_bridge/ws_endpoint.py +195 -0
  125. cccc/daemon/group_bridge/ws_manager.py +92 -0
  126. cccc/daemon/group_bridge/ws_peer.py +75 -0
  127. cccc/daemon/group_bridge/ws_session.py +163 -0
  128. cccc/daemon/im/__init__.py +3 -0
  129. cccc/daemon/im/bootstrap_im_ops.py +79 -0
  130. cccc/daemon/im/im_bridge_ops.py +261 -0
  131. cccc/daemon/im/im_ops.py +127 -0
  132. cccc/daemon/mcp_install.py +951 -0
  133. cccc/daemon/memory/__init__.py +3 -0
  134. cccc/daemon/memory/memory_ops.py +1117 -0
  135. cccc/daemon/memory/memory_sdk_ops.py +327 -0
  136. cccc/daemon/messaging/__init__.py +3 -0
  137. cccc/daemon/messaging/actor_delivery_planner.py +161 -0
  138. cccc/daemon/messaging/actor_turn_rendering.py +371 -0
  139. cccc/daemon/messaging/chat_delivery_ops.py +311 -0
  140. cccc/daemon/messaging/chat_diagnostics.py +106 -0
  141. cccc/daemon/messaging/chat_ops.py +1322 -0
  142. cccc/daemon/messaging/chat_side_effects.py +15 -0
  143. cccc/daemon/messaging/chat_support_ops.py +313 -0
  144. cccc/daemon/messaging/delegation_contract.py +214 -0
  145. cccc/daemon/messaging/delegation_relay_ops.py +163 -0
  146. cccc/daemon/messaging/delegation_targets.py +44 -0
  147. cccc/daemon/messaging/delivery.py +1740 -0
  148. cccc/daemon/messaging/inbound_rendering.py +73 -0
  149. cccc/daemon/messaging/inbox_ack_ops.py +143 -0
  150. cccc/daemon/messaging/inbox_read_ops.py +137 -0
  151. cccc/daemon/messaging/install_slash_command.py +80 -0
  152. cccc/daemon/messaging/local_group_route.py +28 -0
  153. cccc/daemon/messaging/message_request_lanes.py +223 -0
  154. cccc/daemon/messaging/post_commit.py +55 -0
  155. cccc/daemon/messaging/post_commit_lanes.py +84 -0
  156. cccc/daemon/messaging/slash_skill_dispatch_ops.py +211 -0
  157. cccc/daemon/messaging/streaming.py +372 -0
  158. cccc/daemon/messaging/system_notify_ops.py +138 -0
  159. cccc/daemon/ops/__init__.py +12 -0
  160. cccc/daemon/ops/capability_ops/__init__.py +310 -0
  161. cccc/daemon/ops/capability_ops/_common.py +198 -0
  162. cccc/daemon/ops/capability_ops/_documents.py +517 -0
  163. cccc/daemon/ops/capability_ops/_github_skills.py +161 -0
  164. cccc/daemon/ops/capability_ops/_handlers.py +2387 -0
  165. cccc/daemon/ops/capability_ops/_import_sources.py +200 -0
  166. cccc/daemon/ops/capability_ops/_install.py +1453 -0
  167. cccc/daemon/ops/capability_ops/_install_visibility.py +38 -0
  168. cccc/daemon/ops/capability_ops/_policy.py +550 -0
  169. cccc/daemon/ops/capability_ops/_remote.py +1191 -0
  170. cccc/daemon/ops/capability_ops/_removed.py +47 -0
  171. cccc/daemon/ops/capability_ops/_runtime.py +310 -0
  172. cccc/daemon/ops/capability_ops/_search.py +2152 -0
  173. cccc/daemon/ops/capability_ops/_skillsmp.py +78 -0
  174. cccc/daemon/ops/capability_ops/_source_instances.py +101 -0
  175. cccc/daemon/ops/capability_ops/_state.py +1749 -0
  176. cccc/daemon/ops/capability_ops/_state_views.py +44 -0
  177. cccc/daemon/ops/daemon_core_ops.py +93 -0
  178. cccc/daemon/ops/diagnostics_ops.py +800 -0
  179. cccc/daemon/ops/execution_queues.py +210 -0
  180. cccc/daemon/ops/group_copy_files.py +174 -0
  181. cccc/daemon/ops/group_copy_ops.py +1023 -0
  182. cccc/daemon/ops/hermes_runtime_ops.py +52 -0
  183. cccc/daemon/ops/maintenance_ops.py +434 -0
  184. cccc/daemon/ops/registry_ops.py +130 -0
  185. cccc/daemon/ops/remote_access_ops.py +668 -0
  186. cccc/daemon/ops/socket_accept_ops.py +116 -0
  187. cccc/daemon/ops/socket_special_ops.py +386 -0
  188. cccc/daemon/ops/terminal_attach_ops.py +174 -0
  189. cccc/daemon/pty_activity_probe.py +44 -0
  190. cccc/daemon/pty_app_server_exit.py +17 -0
  191. cccc/daemon/request_dispatch_ops.py +447 -0
  192. cccc/daemon/request_queue_policy.py +50 -0
  193. cccc/daemon/runner_state_ops.py +178 -0
  194. cccc/daemon/runtime_hooks/__init__.py +1 -0
  195. cccc/daemon/runtime_hooks/claude.py +166 -0
  196. cccc/daemon/runtime_hooks/codex.py +211 -0
  197. cccc/daemon/runtime_hooks/input_observer.py +131 -0
  198. cccc/daemon/runtime_hooks/launch.py +363 -0
  199. cccc/daemon/runtime_hooks/provider_command.py +38 -0
  200. cccc/daemon/runtime_hooks/pty_launch.py +130 -0
  201. cccc/daemon/runtime_log_diagnostics.py +27 -0
  202. cccc/daemon/runtime_session_ops.py +1291 -0
  203. cccc/daemon/serve_ops.py +588 -0
  204. cccc/daemon/server.py +1355 -0
  205. cccc/daemon/socket_protocol_ops.py +97 -0
  206. cccc/daemon/space/__init__.py +3 -0
  207. cccc/daemon/space/group_space_memory_sync.py +678 -0
  208. cccc/daemon/space/group_space_ops.py +2683 -0
  209. cccc/daemon/space/group_space_paths.py +82 -0
  210. cccc/daemon/space/group_space_projection.py +171 -0
  211. cccc/daemon/space/group_space_provider.py +909 -0
  212. cccc/daemon/space/group_space_runtime.py +317 -0
  213. cccc/daemon/space/group_space_store.py +1509 -0
  214. cccc/daemon/space/group_space_sync.py +2292 -0
  215. cccc/daemon/space/notebooklm_auth_browser_runtime.py +96 -0
  216. cccc/daemon/space/notebooklm_auth_flow.py +1122 -0
  217. cccc/daemon/voice_secretary_control_turns.py +596 -0
  218. cccc/daemon_launcher.py +16 -0
  219. cccc/daemon_main.py +137 -0
  220. cccc/implementation.py +218 -0
  221. cccc/kernel/__init__.py +2 -0
  222. cccc/kernel/access_tokens.py +274 -0
  223. cccc/kernel/active.py +45 -0
  224. cccc/kernel/actor_avatar_assets.py +90 -0
  225. cccc/kernel/actor_runtime_projection.py +26 -0
  226. cccc/kernel/actors.py +588 -0
  227. cccc/kernel/agent_state_hygiene.py +227 -0
  228. cccc/kernel/blobs.py +111 -0
  229. cccc/kernel/capabilities.py +1204 -0
  230. cccc/kernel/chat_idempotency.py +48 -0
  231. cccc/kernel/context.py +804 -0
  232. cccc/kernel/delivery_policy.py +17 -0
  233. cccc/kernel/events.py +54 -0
  234. cccc/kernel/git.py +66 -0
  235. cccc/kernel/group.py +985 -0
  236. cccc/kernel/group_bridge/__init__.py +6 -0
  237. cccc/kernel/group_bridge/auth.py +71 -0
  238. cccc/kernel/group_bridge/credentials.py +180 -0
  239. cccc/kernel/group_bridge/pairing.py +972 -0
  240. cccc/kernel/group_bridge/pairing_outbound_sync.py +138 -0
  241. cccc/kernel/group_bridge/pairing_remote.py +429 -0
  242. cccc/kernel/group_bridge/pairing_remote_transport.py +76 -0
  243. cccc/kernel/group_bridge/peer_addresses.py +69 -0
  244. cccc/kernel/group_bridge/receipts.py +137 -0
  245. cccc/kernel/group_bridge/registration.py +231 -0
  246. cccc/kernel/group_bridge/state_lock.py +63 -0
  247. cccc/kernel/group_space.py +74 -0
  248. cccc/kernel/headless_events.py +118 -0
  249. cccc/kernel/help_markdown.py +298 -0
  250. cccc/kernel/hermes_runtime.py +567 -0
  251. cccc/kernel/im_state.py +112 -0
  252. cccc/kernel/inbox.py +1574 -0
  253. cccc/kernel/install_capability.py +67 -0
  254. cccc/kernel/internal_assistant_runtime.py +42 -0
  255. cccc/kernel/ledger.py +236 -0
  256. cccc/kernel/ledger_index.py +1026 -0
  257. cccc/kernel/ledger_retention.py +186 -0
  258. cccc/kernel/ledger_segments.py +377 -0
  259. cccc/kernel/ledger_state_snapshot.py +86 -0
  260. cccc/kernel/ledger_status_cache.py +433 -0
  261. cccc/kernel/memory.py +35 -0
  262. cccc/kernel/memory_export.py +31 -0
  263. cccc/kernel/memory_guide.py +58 -0
  264. cccc/kernel/memory_reme/__init__.py +38 -0
  265. cccc/kernel/memory_reme/adapter.py +274 -0
  266. cccc/kernel/memory_reme/layout.py +111 -0
  267. cccc/kernel/memory_reme/runtime.py +312 -0
  268. cccc/kernel/memory_reme/writer.py +192 -0
  269. cccc/kernel/message_sender_snapshot.py +66 -0
  270. cccc/kernel/messaging.py +129 -0
  271. cccc/kernel/nomcp_sessions.py +885 -0
  272. cccc/kernel/peer_insight.py +204 -0
  273. cccc/kernel/permissions.py +135 -0
  274. cccc/kernel/prompt_files.py +126 -0
  275. cccc/kernel/pty_terminal_state.py +125 -0
  276. cccc/kernel/query_projections.py +151 -0
  277. cccc/kernel/recipient_syntax.py +46 -0
  278. cccc/kernel/registry.py +125 -0
  279. cccc/kernel/runtime.py +412 -0
  280. cccc/kernel/runtime_hooks/__init__.py +5 -0
  281. cccc/kernel/runtime_hooks/activity.py +265 -0
  282. cccc/kernel/runtime_hooks/activity_projection.py +142 -0
  283. cccc/kernel/runtime_hooks/committed_io.py +57 -0
  284. cccc/kernel/runtime_hooks/contracts.py +170 -0
  285. cccc/kernel/runtime_hooks/projection.py +241 -0
  286. cccc/kernel/runtime_hooks/state_machine.py +270 -0
  287. cccc/kernel/runtime_hooks/store.py +242 -0
  288. cccc/kernel/runtime_state_source.py +97 -0
  289. cccc/kernel/scope.py +39 -0
  290. cccc/kernel/settings.py +686 -0
  291. cccc/kernel/system_prompt.py +179 -0
  292. cccc/kernel/task_types.py +40 -0
  293. cccc/kernel/terminal_transcript.py +83 -0
  294. cccc/kernel/terminal_transcript_filter.py +18 -0
  295. cccc/kernel/voice_secretary_actor.py +142 -0
  296. cccc/kernel/voice_secretary_prompt.py +60 -0
  297. cccc/kernel/web_model_connectors.py +526 -0
  298. cccc/kernel/working_state.py +146 -0
  299. cccc/launcher.py +240 -0
  300. cccc/paths.py +18 -0
  301. cccc/ports/__init__.py +2 -0
  302. cccc/ports/im/__init__.py +20 -0
  303. cccc/ports/im/__main__.py +44 -0
  304. cccc/ports/im/adapters/__init__.py +28 -0
  305. cccc/ports/im/adapters/base.py +305 -0
  306. cccc/ports/im/adapters/dingtalk.py +1101 -0
  307. cccc/ports/im/adapters/dingtalk_api.py +153 -0
  308. cccc/ports/im/adapters/dingtalk_card.py +291 -0
  309. cccc/ports/im/adapters/dingtalk_media.py +267 -0
  310. cccc/ports/im/adapters/dingtalk_messages.py +147 -0
  311. cccc/ports/im/adapters/dingtalk_reactions.py +89 -0
  312. cccc/ports/im/adapters/dingtalk_sender.py +196 -0
  313. cccc/ports/im/adapters/dingtalk_session.py +173 -0
  314. cccc/ports/im/adapters/discord.py +509 -0
  315. cccc/ports/im/adapters/feishu/__init__.py +12 -0
  316. cccc/ports/im/adapters/feishu/adapter.py +575 -0
  317. cccc/ports/im/adapters/feishu/attachments.py +29 -0
  318. cccc/ports/im/adapters/feishu/chats.py +29 -0
  319. cccc/ports/im/adapters/feishu/client.py +193 -0
  320. cccc/ports/im/adapters/feishu/domain.py +19 -0
  321. cccc/ports/im/adapters/feishu/events.py +66 -0
  322. cccc/ports/im/adapters/feishu/files.py +23 -0
  323. cccc/ports/im/adapters/feishu/identity.py +37 -0
  324. cccc/ports/im/adapters/feishu/mapper.py +142 -0
  325. cccc/ports/im/adapters/feishu/mentions.py +60 -0
  326. cccc/ports/im/adapters/feishu/outbound.py +56 -0
  327. cccc/ports/im/adapters/feishu/queue.py +26 -0
  328. cccc/ports/im/adapters/feishu/rate_limiter.py +40 -0
  329. cccc/ports/im/adapters/feishu/reactions.py +35 -0
  330. cccc/ports/im/adapters/feishu/text.py +21 -0
  331. cccc/ports/im/adapters/feishu/webhook.py +30 -0
  332. cccc/ports/im/adapters/feishu/ws.py +110 -0
  333. cccc/ports/im/adapters/outbound_text.py +136 -0
  334. cccc/ports/im/adapters/slack.py +474 -0
  335. cccc/ports/im/adapters/telegram.py +685 -0
  336. cccc/ports/im/adapters/wecom.py +1453 -0
  337. cccc/ports/im/adapters/weixin.py +448 -0
  338. cccc/ports/im/auth.py +306 -0
  339. cccc/ports/im/bridge.py +1957 -0
  340. cccc/ports/im/commands.py +423 -0
  341. cccc/ports/im/config_schema.py +170 -0
  342. cccc/ports/im/inbound_content.py +219 -0
  343. cccc/ports/im/lifecycle.py +163 -0
  344. cccc/ports/im/subscribers.py +290 -0
  345. cccc/ports/mcp/__init__.py +2 -0
  346. cccc/ports/mcp/common.py +565 -0
  347. cccc/ports/mcp/group_bridge.py +691 -0
  348. cccc/ports/mcp/handlers/__init__.py +2 -0
  349. cccc/ports/mcp/handlers/cccc_automation.py +144 -0
  350. cccc/ports/mcp/handlers/cccc_capability.py +628 -0
  351. cccc/ports/mcp/handlers/cccc_core.py +982 -0
  352. cccc/ports/mcp/handlers/cccc_group_actor.py +366 -0
  353. cccc/ports/mcp/handlers/cccc_im.py +18 -0
  354. cccc/ports/mcp/handlers/cccc_messaging.py +568 -0
  355. cccc/ports/mcp/handlers/cccc_repo.py +1216 -0
  356. cccc/ports/mcp/handlers/cccc_space.py +377 -0
  357. cccc/ports/mcp/handlers/code_mode.py +635 -0
  358. cccc/ports/mcp/handlers/context.py +710 -0
  359. cccc/ports/mcp/handlers/debug.py +103 -0
  360. cccc/ports/mcp/handlers/group_bridge_client.py +336 -0
  361. cccc/ports/mcp/handlers/headless.py +69 -0
  362. cccc/ports/mcp/handlers/memory.py +132 -0
  363. cccc/ports/mcp/handlers/notify.py +84 -0
  364. cccc/ports/mcp/handlers/presentation.py +64 -0
  365. cccc/ports/mcp/main.py +348 -0
  366. cccc/ports/mcp/server.py +1544 -0
  367. cccc/ports/mcp/task_types.py +11 -0
  368. cccc/ports/mcp/toolspecs.py +22 -0
  369. cccc/ports/mcp/utils/__init__.py +2 -0
  370. cccc/ports/mcp/utils/help_markdown.py +15 -0
  371. cccc/ports/mcp/utils/space_args.py +119 -0
  372. cccc/ports/web/__init__.py +2 -0
  373. cccc/ports/web/actor_avatar.py +28 -0
  374. cccc/ports/web/app.py +549 -0
  375. cccc/ports/web/bind_preflight.py +152 -0
  376. cccc/ports/web/branding.py +173 -0
  377. cccc/ports/web/dist/assets/ActorProfilesTab-DQvtFvjb.js +4 -0
  378. cccc/ports/web/dist/assets/AgentTab-DngAJlJQ.js +7 -0
  379. cccc/ports/web/dist/assets/AppModals-DBObXV-G.js +461 -0
  380. cccc/ports/web/dist/assets/AssistantsTab-Ba-8o725.js +2 -0
  381. cccc/ports/web/dist/assets/AutomationTab-xR2tdbPB.js +2 -0
  382. cccc/ports/web/dist/assets/BrandingTab-io6436sk.js +1 -0
  383. cccc/ports/web/dist/assets/CapabilitiesTab-BnmVa19x.js +2 -0
  384. cccc/ports/web/dist/assets/CapabilitiesTab-Bnu6pcJ6.js +1 -0
  385. cccc/ports/web/dist/assets/CapabilityCenterWorkspace-D2oL8Qo3.js +2 -0
  386. cccc/ports/web/dist/assets/ContextModal-CU9V6jmA.js +12 -0
  387. cccc/ports/web/dist/assets/CopyGroupsTab-BDCafTLB.js +1 -0
  388. cccc/ports/web/dist/assets/DeliveryTab-Devz0TzR.js +8 -0
  389. cccc/ports/web/dist/assets/DeveloperTab-CTG3ONXq.js +1 -0
  390. cccc/ports/web/dist/assets/GroupBridgeConnectionsSection-CKVhqq4Z.js +1 -0
  391. cccc/ports/web/dist/assets/GroupSpaceTab-BAWlhO7B.js +1 -0
  392. cccc/ports/web/dist/assets/GuidanceTab-BrTJnsyA.js +1 -0
  393. cccc/ports/web/dist/assets/HoverTooltip-DKwGea7S.js +1 -0
  394. cccc/ports/web/dist/assets/IMBridgeTab-Dpwyg_5P.js +1 -0
  395. cccc/ports/web/dist/assets/MarkdownRenderer-DyiJdjuM.js +2 -0
  396. cccc/ports/web/dist/assets/MessagingTab-By3pdxBo.js +1 -0
  397. cccc/ports/web/dist/assets/ModalFrame-CLW3tTch.js +1 -0
  398. cccc/ports/web/dist/assets/PresentationRail-piqz-cxJ.js +1 -0
  399. cccc/ports/web/dist/assets/PresentationViewerModal-BsXPtHIA.js +1 -0
  400. cccc/ports/web/dist/assets/ProjectedBrowserSurfacePanel-BTZh5Ak3.js +2 -0
  401. cccc/ports/web/dist/assets/SettingsModal-bBT4FDJe.js +5 -0
  402. cccc/ports/web/dist/assets/SetupChecklist-CQX-2XRv.js +1 -0
  403. cccc/ports/web/dist/assets/TranscriptTab-B7aClBaZ.js +1 -0
  404. cccc/ports/web/dist/assets/WebAccessTab-0oT0unj3.js +1 -0
  405. cccc/ports/web/dist/assets/WebModelConnectorsTab-ip0kP3uQ.js +1 -0
  406. cccc/ports/web/dist/assets/abnfDiagram-N423BO3Z-ovRSEl_k.js +1 -0
  407. cccc/ports/web/dist/assets/app-chrome-6lvXKxNW.js +1 -0
  408. cccc/ports/web/dist/assets/arc-BjSQqbzd.js +1 -0
  409. cccc/ports/web/dist/assets/architecture-TIHT7OUA-DtXO_UzA.js +1 -0
  410. cccc/ports/web/dist/assets/architectureDiagram-T3A2C74G-B-Gs6kkF.js +36 -0
  411. cccc/ports/web/dist/assets/array-BifhSqXX.js +1 -0
  412. cccc/ports/web/dist/assets/blockDiagram-VBNYF7ZC-Dm6fMUws.js +132 -0
  413. cccc/ports/web/dist/assets/button-BxhsGAD_.js +1 -0
  414. cccc/ports/web/dist/assets/button-variants-DhV76Q6H.js +1 -0
  415. cccc/ports/web/dist/assets/c4Diagram-5PPSVZJV-CZBfNRRr.js +10 -0
  416. cccc/ports/web/dist/assets/capabilityAutoload-BR_RvptK.js +2 -0
  417. cccc/ports/web/dist/assets/capabilityCenterRoute-BPL2wPpV.js +1 -0
  418. cccc/ports/web/dist/assets/capabilityManagementModel-DBTWCftP.js +1 -0
  419. cccc/ports/web/dist/assets/channel-B8UkxqdQ.js +1 -0
  420. cccc/ports/web/dist/assets/chat-core-33UBkWW7.js +80 -0
  421. cccc/ports/web/dist/assets/chunk-2GRJ4B5K-B-GIKU9Q.js +1 -0
  422. cccc/ports/web/dist/assets/chunk-2Q5K7J3B-C1jixKkw.js +1 -0
  423. cccc/ports/web/dist/assets/chunk-3NCLNEKW-BKmS1Qkn.js +1 -0
  424. cccc/ports/web/dist/assets/chunk-4I5QYGJK-BhmhhY8s.js +1 -0
  425. cccc/ports/web/dist/assets/chunk-5FCAYU7R-Dh_mDa6z.js +1 -0
  426. cccc/ports/web/dist/assets/chunk-5HE753X5-zPGfIu1R.js +1 -0
  427. cccc/ports/web/dist/assets/chunk-5JV3BV7I-BoO0HlT9.js +1 -0
  428. cccc/ports/web/dist/assets/chunk-5RXB4S5H-BDyDhBcP.js +231 -0
  429. cccc/ports/web/dist/assets/chunk-5TONJI2A-nyszRqSb.js +2 -0
  430. cccc/ports/web/dist/assets/chunk-5VM5RSS4-ZNzvKenW.js +15 -0
  431. cccc/ports/web/dist/assets/chunk-6Q2QTUOP-B_SIcBou.js +88 -0
  432. cccc/ports/web/dist/assets/chunk-7BUUIJ7U-Bb538aSH.js +1 -0
  433. cccc/ports/web/dist/assets/chunk-7Z6QIM7H-ChQLHkzp.js +10 -0
  434. cccc/ports/web/dist/assets/chunk-BIQX33UG-DkWRPZMF.js +1 -0
  435. cccc/ports/web/dist/assets/chunk-CQNSW5MT-Bjw5MV47.js +1 -0
  436. cccc/ports/web/dist/assets/chunk-CYSBUYHQ-C9Ut2Srr.js +1 -0
  437. cccc/ports/web/dist/assets/chunk-EMLP6XTP-DwDm8B2J.js +1 -0
  438. cccc/ports/web/dist/assets/chunk-GF5L2VYU-EGYHut8Z.js +206 -0
  439. cccc/ports/web/dist/assets/chunk-I66GZJ75-DwpT4b-3.js +127 -0
  440. cccc/ports/web/dist/assets/chunk-J7OUQ5F2-Qezf35JH.js +2 -0
  441. cccc/ports/web/dist/assets/chunk-JG7HCLWE-Dn3i7DI-.js +2 -0
  442. cccc/ports/web/dist/assets/chunk-JQJVKLGR-DaWop5hO.js +156 -0
  443. cccc/ports/web/dist/assets/chunk-JWPE2WC7-DVXcaiue.js +1 -0
  444. cccc/ports/web/dist/assets/chunk-KBJHAD2P-m21WkH6G.js +1 -0
  445. cccc/ports/web/dist/assets/chunk-KEIR6QF5-BfrZ3jm6.js +161 -0
  446. cccc/ports/web/dist/assets/chunk-MOZMSUNE-CVBq1RNG.js +1 -0
  447. cccc/ports/web/dist/assets/chunk-NSK5VX7P-CN6oWWa7.js +2 -0
  448. cccc/ports/web/dist/assets/chunk-OSBZ3O6U-Bf3gOl9M.js +1 -0
  449. cccc/ports/web/dist/assets/chunk-QBLGF6JB-BKUDNNEu.js +1 -0
  450. cccc/ports/web/dist/assets/chunk-QR6OTTB3-B2UngO3S.js +62 -0
  451. cccc/ports/web/dist/assets/chunk-R7FJI6CG-CxpPJvAz.js +1 -0
  452. cccc/ports/web/dist/assets/chunk-RYQCIY6F-CZ4ia6G4.js +1 -0
  453. cccc/ports/web/dist/assets/chunk-U6XO7XAA-CGdP5BIs.js +2 -0
  454. cccc/ports/web/dist/assets/chunk-UBXNYLIW-CBiIXgg8.js +1 -0
  455. cccc/ports/web/dist/assets/chunk-W5SLKNZC-C0LrkHON.js +1 -0
  456. cccc/ports/web/dist/assets/chunk-WRU74C26-CJhKVSCy.js +70 -0
  457. cccc/ports/web/dist/assets/chunk-XXDRQBXY-BuE3VzE_.js +1 -0
  458. cccc/ports/web/dist/assets/chunk-Y2CYZVJY-DsF7k-Jl.js +1 -0
  459. cccc/ports/web/dist/assets/chunk-YOTPTUD7-BGu72LlA.js +1 -0
  460. cccc/ports/web/dist/assets/chunk-ZIRB5QZD-C6fEPe3t.js +32 -0
  461. cccc/ports/web/dist/assets/classDiagram-JCYQIIEL-ZX71vPVh.js +1 -0
  462. cccc/ports/web/dist/assets/classDiagram-v2-OCEON4UE-ZX71vPVh.js +1 -0
  463. cccc/ports/web/dist/assets/cose-bilkent-JH36ORCC-CU59zlcZ.js +1 -0
  464. cccc/ports/web/dist/assets/cynefin-VYW2F7L2-CeOrb5B6.js +1 -0
  465. cccc/ports/web/dist/assets/cynefinDiagram-MW4NZA55-CHDRTg1V.js +62 -0
  466. cccc/ports/web/dist/assets/cytoscape.esm-B3I8pqwA.js +321 -0
  467. cccc/ports/web/dist/assets/dagre-CXRCoUWR.js +1 -0
  468. cccc/ports/web/dist/assets/dagre-VZM6K2ZE-B8gy7yJL.js +4 -0
  469. cccc/ports/web/dist/assets/defaultLocale-C8Fc0cco.js +1 -0
  470. cccc/ports/web/dist/assets/diagnostics-Ct4yPJfS.js +1 -0
  471. cccc/ports/web/dist/assets/diagram-7IWD3JNH-DKM2eoSp.js +30 -0
  472. cccc/ports/web/dist/assets/diagram-B4RE2ZJO-knaPckg7.js +3 -0
  473. cccc/ports/web/dist/assets/diagram-LBJQPF4R-C27fkN12.js +24 -0
  474. cccc/ports/web/dist/assets/diagram-Q27KOJAE-B8HcXuB1.js +24 -0
  475. cccc/ports/web/dist/assets/diagram-UB23O5K3-D3FLmAbW.js +41 -0
  476. cccc/ports/web/dist/assets/dist-D9sYb5Oa.js +1 -0
  477. cccc/ports/web/dist/assets/dnd-CC-hAtiu.js +5 -0
  478. cccc/ports/web/dist/assets/ebnfDiagram-BXEA7PRR-Gw_RD65m.js +1 -0
  479. cccc/ports/web/dist/assets/erDiagram-JOGREHBK-DJv2DSkK.js +85 -0
  480. cccc/ports/web/dist/assets/eventmodeling-45OFAUF4-Cb9JFwTS.js +1 -0
  481. cccc/ports/web/dist/assets/flowDiagram-UKHOOZJN-Zekxh4MI.js +1 -0
  482. cccc/ports/web/dist/assets/ganttDiagram-PKOTCBZU-DQkZaGWw.js +292 -0
  483. cccc/ports/web/dist/assets/gitGraph-TEB2WS4Q-B4lsv2BE.js +1 -0
  484. cccc/ports/web/dist/assets/gitGraphDiagram-DS77QQ5N-jRhXRdRx.js +106 -0
  485. cccc/ports/web/dist/assets/graphlib-B8gBHxth.js +1 -0
  486. cccc/ports/web/dist/assets/helpMarkdown-ehGjPvgU.js +15 -0
  487. cccc/ports/web/dist/assets/i18n-CTgBbY9e.js +1 -0
  488. cccc/ports/web/dist/assets/imBridgeConfig-eyN4pycq.js +1 -0
  489. cccc/ports/web/dist/assets/index-CK0ZiSqW.css +2 -0
  490. cccc/ports/web/dist/assets/index-EliRm0dW.js +2 -0
  491. cccc/ports/web/dist/assets/info-DKCQHKI2-tMxezh8p.js +1 -0
  492. cccc/ports/web/dist/assets/infoDiagram-6WML65LV-C383Xkvz.js +2 -0
  493. cccc/ports/web/dist/assets/init-D6jRqBbL.js +1 -0
  494. cccc/ports/web/dist/assets/ishikawaDiagram-WSZJBQD7-DTdVEjEF.js +70 -0
  495. cccc/ports/web/dist/assets/journeyDiagram-NVQOT4AX-BqTUrJxw.js +139 -0
  496. cccc/ports/web/dist/assets/kanban-definition-27J2QSJJ-DDoG5jcc.js +89 -0
  497. cccc/ports/web/dist/assets/katex-CddkPoXu.js +257 -0
  498. cccc/ports/web/dist/assets/line-rBFuhW2C.js +1 -0
  499. cccc/ports/web/dist/assets/linear-B7l8qgEw.js +1 -0
  500. cccc/ports/web/dist/assets/map-DsCK-0Cs.js +1 -0
  501. cccc/ports/web/dist/assets/markdown-DrXoryfG.js +14 -0
  502. cccc/ports/web/dist/assets/mermaid-parser.core-DhXghlfV.js +4 -0
  503. cccc/ports/web/dist/assets/mermaid.core-rx66Ji3_.js +11 -0
  504. cccc/ports/web/dist/assets/mindmap-definition-FAOFIHXS-D8UHnUbv.js +96 -0
  505. cccc/ports/web/dist/assets/ordinal-hYBb2elL.js +1 -0
  506. cccc/ports/web/dist/assets/packet-7NZHBO7P-B_kwytRC.js +1 -0
  507. cccc/ports/web/dist/assets/path-BWPyau1x.js +1 -0
  508. cccc/ports/web/dist/assets/pegDiagram-VL7TDLO6-j0-nm32K.js +1 -0
  509. cccc/ports/web/dist/assets/pie-RZYD4A2V-j1buGlhT.js +1 -0
  510. cccc/ports/web/dist/assets/pieDiagram-7S7Q4E2Y-Ckz82nfV.js +39 -0
  511. cccc/ports/web/dist/assets/privateEnvInput-ph9Bj98y.js +4 -0
  512. cccc/ports/web/dist/assets/quadrantDiagram-CIZ2JOQS-CvOkHjIf.js +7 -0
  513. cccc/ports/web/dist/assets/radar-I7S5WNFK-Cn0ataFo.js +1 -0
  514. cccc/ports/web/dist/assets/railroad-3IZDKUUU-DFg6iiGT.js +1 -0
  515. cccc/ports/web/dist/assets/railroad-abnf-AHOZXSZD-CZvN6irW.js +1 -0
  516. cccc/ports/web/dist/assets/railroad-ebnf-EBAXGLYW-C97iLB9Y.js +1 -0
  517. cccc/ports/web/dist/assets/railroad-peg-LSFZ7HO6-C9sIJ2kQ.js +1 -0
  518. cccc/ports/web/dist/assets/railroadDiagram-AXF67PYL-0RArkcmq.js +1 -0
  519. cccc/ports/web/dist/assets/react-vendor-BzymHuLu.js +61 -0
  520. cccc/ports/web/dist/assets/requirementDiagram-LRYGKXZP-nT3_Z_C2.js +84 -0
  521. cccc/ports/web/dist/assets/rfb-DVNK4U0c.js +1 -0
  522. cccc/ports/web/dist/assets/rolldown-runtime-QTnfLwEv.js +1 -0
  523. cccc/ports/web/dist/assets/rough.esm-CSKSodPl.js +1 -0
  524. cccc/ports/web/dist/assets/sankeyDiagram-W5VNT64P-bLAI1OvA.js +40 -0
  525. cccc/ports/web/dist/assets/sequenceDiagram-SI44F4Z6-DXoVQhop.js +162 -0
  526. cccc/ports/web/dist/assets/sizeCapture-X5ZJPWSS-B0uUizjq.js +1 -0
  527. cccc/ports/web/dist/assets/src-_wZywoZs.js +1 -0
  528. cccc/ports/web/dist/assets/stateDiagram-OKZ733FA-Du4OlgOT.js +1 -0
  529. cccc/ports/web/dist/assets/stateDiagram-v2-UEYNNEHI-S8dP2B3j.js +1 -0
  530. cccc/ports/web/dist/assets/swimlanes-SLNWSIFB-bGPWBnRt.js +2 -0
  531. cccc/ports/web/dist/assets/swimlanesDiagram-ULZ7WXOC-tF5SQIeK.js +8 -0
  532. cccc/ports/web/dist/assets/system-BnECq6C1.js +1 -0
  533. cccc/ports/web/dist/assets/timeline-definition-Z64GVDOM-BxtYG0UC.js +120 -0
  534. cccc/ports/web/dist/assets/treeView-QDETBFTQ-DWaHinax.js +1 -0
  535. cccc/ports/web/dist/assets/treemap-6X3UGDF4-BfSjF-Kv.js +1 -0
  536. cccc/ports/web/dist/assets/types-CBYqP1BE.js +1 -0
  537. cccc/ports/web/dist/assets/useSSE-sN7bmWBr.js +73 -0
  538. cccc/ports/web/dist/assets/useTheme-CzTU1034.js +1 -0
  539. cccc/ports/web/dist/assets/vendor-CLOuHXQ2.js +12 -0
  540. cccc/ports/web/dist/assets/vennDiagram-T6HMQDX7-D0qj92MT.js +34 -0
  541. cccc/ports/web/dist/assets/wardley-OPB4EBWU-DjIsTrje.js +1 -0
  542. cccc/ports/web/dist/assets/wardleyDiagram-T6FBY63Y-C6pvDB7y.js +78 -0
  543. cccc/ports/web/dist/assets/webModelConnector-Cs5koZ16.js +1 -0
  544. cccc/ports/web/dist/assets/xterm-CHOd7Rch.css +1 -0
  545. cccc/ports/web/dist/assets/xterm-D0rjqrls.js +20 -0
  546. cccc/ports/web/dist/assets/xychartDiagram-ELKLHX3M-BvXgmLcx.js +7 -0
  547. cccc/ports/web/dist/favicon.ico +0 -0
  548. cccc/ports/web/dist/favicon.png +0 -0
  549. cccc/ports/web/dist/index.html +39 -0
  550. cccc/ports/web/dist/logo-512.png +0 -0
  551. cccc/ports/web/dist/logo-dark.svg +24 -0
  552. cccc/ports/web/dist/logo.png +0 -0
  553. cccc/ports/web/dist/logo.svg +24 -0
  554. cccc/ports/web/dist/logos/amp.png +0 -0
  555. cccc/ports/web/dist/logos/antigravity.svg +1 -0
  556. cccc/ports/web/dist/logos/auggie.png +0 -0
  557. cccc/ports/web/dist/logos/claude.png +0 -0
  558. cccc/ports/web/dist/logos/cline.svg +5 -0
  559. cccc/ports/web/dist/logos/codex.png +0 -0
  560. cccc/ports/web/dist/logos/copilot.svg +1 -0
  561. cccc/ports/web/dist/logos/cursor.svg +1 -0
  562. cccc/ports/web/dist/logos/devin.svg +5 -0
  563. cccc/ports/web/dist/logos/droid.png +0 -0
  564. cccc/ports/web/dist/logos/grok.svg +3 -0
  565. cccc/ports/web/dist/logos/hermes.svg +11 -0
  566. cccc/ports/web/dist/logos/kilo.svg +13 -0
  567. cccc/ports/web/dist/logos/kimi.png +0 -0
  568. cccc/ports/web/dist/logos/kiro.svg +1 -0
  569. cccc/ports/web/dist/logos/opencode.svg +11 -0
  570. cccc/ports/web/dist/manifest.webmanifest +12 -0
  571. cccc/ports/web/main.py +157 -0
  572. cccc/ports/web/middleware.py +220 -0
  573. cccc/ports/web/routes/__init__.py +3 -0
  574. cccc/ports/web/routes/access_tokens.py +221 -0
  575. cccc/ports/web/routes/actors.py +1547 -0
  576. cccc/ports/web/routes/base.py +2197 -0
  577. cccc/ports/web/routes/browser_surface_proxy.py +78 -0
  578. cccc/ports/web/routes/group_bridge.py +519 -0
  579. cccc/ports/web/routes/group_copy_uploads.py +83 -0
  580. cccc/ports/web/routes/groups.py +4360 -0
  581. cccc/ports/web/routes/im.py +1300 -0
  582. cccc/ports/web/routes/messaging.py +459 -0
  583. cccc/ports/web/routes/nomcp.py +258 -0
  584. cccc/ports/web/routes/runtime_activity.py +109 -0
  585. cccc/ports/web/routes/space.py +548 -0
  586. cccc/ports/web/routes/voice_transcription_upload.py +138 -0
  587. cccc/ports/web/runtime_control.py +400 -0
  588. cccc/ports/web/schemas.py +797 -0
  589. cccc/ports/web/stream_close.py +20 -0
  590. cccc/ports/web/streams.py +428 -0
  591. cccc/ports/web/web_banner.py +62 -0
  592. cccc/ports/web_model_browser_sidecar.py +2965 -0
  593. cccc/providers/__init__.py +2 -0
  594. cccc/providers/notebooklm/__init__.py +11 -0
  595. cccc/providers/notebooklm/_vendor/LICENSE +21 -0
  596. cccc/providers/notebooklm/_vendor/VENDORED_FROM.md +27 -0
  597. cccc/providers/notebooklm/_vendor/notebooklm/__init__.py +12 -0
  598. cccc/providers/notebooklm/_vendor/notebooklm/_artifact/__init__.py +25 -0
  599. cccc/providers/notebooklm/_vendor/notebooklm/_artifact/_download_client.py +80 -0
  600. cccc/providers/notebooklm/_vendor/notebooklm/_artifact/_redirect_guard.py +70 -0
  601. cccc/providers/notebooklm/_vendor/notebooklm/_artifact/downloads.py +989 -0
  602. cccc/providers/notebooklm/_vendor/notebooklm/_artifact/formatters.py +267 -0
  603. cccc/providers/notebooklm/_vendor/notebooklm/_artifact/generation.py +596 -0
  604. cccc/providers/notebooklm/_vendor/notebooklm/_artifact/listing.py +357 -0
  605. cccc/providers/notebooklm/_vendor/notebooklm/_artifact/payloads.py +564 -0
  606. cccc/providers/notebooklm/_vendor/notebooklm/_artifact/polling.py +526 -0
  607. cccc/providers/notebooklm/_vendor/notebooklm/_artifact/validation.py +52 -0
  608. cccc/providers/notebooklm/_vendor/notebooklm/_artifacts.py +1000 -0
  609. cccc/providers/notebooklm/_vendor/notebooklm/_atomic_io.py +387 -0
  610. cccc/providers/notebooklm/_vendor/notebooklm/_auth/__init__.py +5 -0
  611. cccc/providers/notebooklm/_vendor/notebooklm/_auth/account.py +494 -0
  612. cccc/providers/notebooklm/_vendor/notebooklm/_auth/browser_capture.py +926 -0
  613. cccc/providers/notebooklm/_vendor/notebooklm/_auth/cookie_policy.py +608 -0
  614. cccc/providers/notebooklm/_vendor/notebooklm/_auth/cookies.py +645 -0
  615. cccc/providers/notebooklm/_vendor/notebooklm/_auth/extraction.py +286 -0
  616. cccc/providers/notebooklm/_vendor/notebooklm/_auth/headers.py +41 -0
  617. cccc/providers/notebooklm/_vendor/notebooklm/_auth/headless_reauth.py +693 -0
  618. cccc/providers/notebooklm/_vendor/notebooklm/_auth/keepalive.py +355 -0
  619. cccc/providers/notebooklm/_vendor/notebooklm/_auth/master_token.py +305 -0
  620. cccc/providers/notebooklm/_vendor/notebooklm/_auth/paths.py +68 -0
  621. cccc/providers/notebooklm/_vendor/notebooklm/_auth/psidts_recovery.py +690 -0
  622. cccc/providers/notebooklm/_vendor/notebooklm/_auth/refresh.py +925 -0
  623. cccc/providers/notebooklm/_vendor/notebooklm/_auth/session.py +280 -0
  624. cccc/providers/notebooklm/_vendor/notebooklm/_auth/storage.py +717 -0
  625. cccc/providers/notebooklm/_vendor/notebooklm/_auth/tokens.py +307 -0
  626. cccc/providers/notebooklm/_vendor/notebooklm/_auth_refresh_retry.py +168 -0
  627. cccc/providers/notebooklm/_vendor/notebooklm/_backoff.py +59 -0
  628. cccc/providers/notebooklm/_vendor/notebooklm/_callbacks.py +14 -0
  629. cccc/providers/notebooklm/_vendor/notebooklm/_chat/__init__.py +31 -0
  630. cccc/providers/notebooklm/_vendor/notebooklm/_chat/api.py +984 -0
  631. cccc/providers/notebooklm/_vendor/notebooklm/_chat/deleted_tracker.py +43 -0
  632. cccc/providers/notebooklm/_vendor/notebooklm/_chat/notes.py +362 -0
  633. cccc/providers/notebooklm/_vendor/notebooklm/_chat/transport.py +170 -0
  634. cccc/providers/notebooklm/_vendor/notebooklm/_chat/wire.py +782 -0
  635. cccc/providers/notebooklm/_vendor/notebooklm/_client_assembly.py +397 -0
  636. cccc/providers/notebooklm/_vendor/notebooklm/_client_composed.py +165 -0
  637. cccc/providers/notebooklm/_vendor/notebooklm/_client_metrics.py +147 -0
  638. cccc/providers/notebooklm/_vendor/notebooklm/_client_seams.py +74 -0
  639. cccc/providers/notebooklm/_vendor/notebooklm/_conversation_cache.py +120 -0
  640. cccc/providers/notebooklm/_vendor/notebooklm/_cookie_persistence.py +126 -0
  641. cccc/providers/notebooklm/_vendor/notebooklm/_curl_cffi_transport.py +538 -0
  642. cccc/providers/notebooklm/_vendor/notebooklm/_deadline.py +66 -0
  643. cccc/providers/notebooklm/_vendor/notebooklm/_deprecation.py +109 -0
  644. cccc/providers/notebooklm/_vendor/notebooklm/_env.py +99 -0
  645. cccc/providers/notebooklm/_vendor/notebooklm/_error_injection.py +140 -0
  646. cccc/providers/notebooklm/_vendor/notebooklm/_idempotency.py +506 -0
  647. cccc/providers/notebooklm/_vendor/notebooklm/_idempotency_policy.py +516 -0
  648. cccc/providers/notebooklm/_vendor/notebooklm/_kernel.py +165 -0
  649. cccc/providers/notebooklm/_vendor/notebooklm/_label/params.py +88 -0
  650. cccc/providers/notebooklm/_vendor/notebooklm/_labels.py +367 -0
  651. cccc/providers/notebooklm/_vendor/notebooklm/_logging.py +617 -0
  652. cccc/providers/notebooklm/_vendor/notebooklm/_lookup.py +47 -0
  653. cccc/providers/notebooklm/_vendor/notebooklm/_loop_affinity.py +62 -0
  654. cccc/providers/notebooklm/_vendor/notebooklm/_loop_bound.py +73 -0
  655. cccc/providers/notebooklm/_vendor/notebooklm/_middleware/__init__.py +91 -0
  656. cccc/providers/notebooklm/_vendor/notebooklm/_middleware/auth_refresh.py +364 -0
  657. cccc/providers/notebooklm/_vendor/notebooklm/_middleware/chain.py +144 -0
  658. cccc/providers/notebooklm/_vendor/notebooklm/_middleware/chain_host.py +138 -0
  659. cccc/providers/notebooklm/_vendor/notebooklm/_middleware/context.py +70 -0
  660. cccc/providers/notebooklm/_vendor/notebooklm/_middleware/core.py +279 -0
  661. cccc/providers/notebooklm/_vendor/notebooklm/_middleware/drain.py +109 -0
  662. cccc/providers/notebooklm/_vendor/notebooklm/_middleware/error_injection.py +234 -0
  663. cccc/providers/notebooklm/_vendor/notebooklm/_middleware/metrics.py +143 -0
  664. cccc/providers/notebooklm/_vendor/notebooklm/_middleware/retry.py +391 -0
  665. cccc/providers/notebooklm/_vendor/notebooklm/_middleware/semaphore.py +100 -0
  666. cccc/providers/notebooklm/_vendor/notebooklm/_middleware/tracing.py +143 -0
  667. cccc/providers/notebooklm/_vendor/notebooklm/_mind_map.py +86 -0
  668. cccc/providers/notebooklm/_vendor/notebooklm/_mind_maps_api.py +651 -0
  669. cccc/providers/notebooklm/_vendor/notebooklm/_note_service.py +453 -0
  670. cccc/providers/notebooklm/_vendor/notebooklm/_notebook_metadata.py +92 -0
  671. cccc/providers/notebooklm/_vendor/notebooklm/_notebook_payloads.py +106 -0
  672. cccc/providers/notebooklm/_vendor/notebooklm/_notebooks.py +949 -0
  673. cccc/providers/notebooklm/_vendor/notebooklm/_notes.py +310 -0
  674. cccc/providers/notebooklm/_vendor/notebooklm/_polling_registry.py +71 -0
  675. cccc/providers/notebooklm/_vendor/notebooklm/_redact.py +80 -0
  676. cccc/providers/notebooklm/_vendor/notebooklm/_reqid_counter.py +182 -0
  677. cccc/providers/notebooklm/_vendor/notebooklm/_request_types.py +116 -0
  678. cccc/providers/notebooklm/_vendor/notebooklm/_research.py +985 -0
  679. cccc/providers/notebooklm/_vendor/notebooklm/_research_import.py +207 -0
  680. cccc/providers/notebooklm/_vendor/notebooklm/_research_task_parser.py +299 -0
  681. cccc/providers/notebooklm/_vendor/notebooklm/_row_adapters/__init__.py +21 -0
  682. cccc/providers/notebooklm/_vendor/notebooklm/_row_adapters/artifacts.py +710 -0
  683. cccc/providers/notebooklm/_vendor/notebooklm/_row_adapters/chat.py +974 -0
  684. cccc/providers/notebooklm/_vendor/notebooklm/_row_adapters/labels.py +77 -0
  685. cccc/providers/notebooklm/_vendor/notebooklm/_row_adapters/notebooks.py +158 -0
  686. cccc/providers/notebooklm/_vendor/notebooklm/_row_adapters/notes.py +358 -0
  687. cccc/providers/notebooklm/_vendor/notebooklm/_row_adapters/research.py +448 -0
  688. cccc/providers/notebooklm/_vendor/notebooklm/_row_adapters/sources.py +910 -0
  689. cccc/providers/notebooklm/_vendor/notebooklm/_rpc_executor.py +596 -0
  690. cccc/providers/notebooklm/_vendor/notebooklm/_runtime/__init__.py +87 -0
  691. cccc/providers/notebooklm/_vendor/notebooklm/_runtime/auth.py +375 -0
  692. cccc/providers/notebooklm/_vendor/notebooklm/_runtime/config.py +86 -0
  693. cccc/providers/notebooklm/_vendor/notebooklm/_runtime/contracts.py +99 -0
  694. cccc/providers/notebooklm/_vendor/notebooklm/_runtime/helpers.py +196 -0
  695. cccc/providers/notebooklm/_vendor/notebooklm/_runtime/init.py +611 -0
  696. cccc/providers/notebooklm/_vendor/notebooklm/_runtime/lifecycle.py +605 -0
  697. cccc/providers/notebooklm/_vendor/notebooklm/_runtime/transport.py +382 -0
  698. cccc/providers/notebooklm/_vendor/notebooklm/_secrets.py +161 -0
  699. cccc/providers/notebooklm/_vendor/notebooklm/_settings.py +281 -0
  700. cccc/providers/notebooklm/_vendor/notebooklm/_sharing.py +251 -0
  701. cccc/providers/notebooklm/_vendor/notebooklm/_sharing_manager.py +63 -0
  702. cccc/providers/notebooklm/_vendor/notebooklm/_source/__init__.py +37 -0
  703. cccc/providers/notebooklm/_vendor/notebooklm/_source/_upload_decode.py +468 -0
  704. cccc/providers/notebooklm/_vendor/notebooklm/_source/add.py +489 -0
  705. cccc/providers/notebooklm/_vendor/notebooklm/_source/content.py +177 -0
  706. cccc/providers/notebooklm/_vendor/notebooklm/_source/drive_import.py +658 -0
  707. cccc/providers/notebooklm/_vendor/notebooklm/_source/listing.py +198 -0
  708. cccc/providers/notebooklm/_vendor/notebooklm/_source/polling.py +293 -0
  709. cccc/providers/notebooklm/_vendor/notebooklm/_source/upload.py +952 -0
  710. cccc/providers/notebooklm/_vendor/notebooklm/_source/upload_payloads.py +86 -0
  711. cccc/providers/notebooklm/_vendor/notebooklm/_sources.py +1000 -0
  712. cccc/providers/notebooklm/_vendor/notebooklm/_streaming_post.py +102 -0
  713. cccc/providers/notebooklm/_vendor/notebooklm/_transport_drain.py +324 -0
  714. cccc/providers/notebooklm/_vendor/notebooklm/_transport_errors.py +158 -0
  715. cccc/providers/notebooklm/_vendor/notebooklm/_types/__init__.py +1 -0
  716. cccc/providers/notebooklm/_vendor/notebooklm/_types/artifacts.py +566 -0
  717. cccc/providers/notebooklm/_vendor/notebooklm/_types/chat.py +166 -0
  718. cccc/providers/notebooklm/_vendor/notebooklm/_types/common.py +180 -0
  719. cccc/providers/notebooklm/_vendor/notebooklm/_types/labels.py +48 -0
  720. cccc/providers/notebooklm/_vendor/notebooklm/_types/mind_maps.py +55 -0
  721. cccc/providers/notebooklm/_vendor/notebooklm/_types/notebooks.py +250 -0
  722. cccc/providers/notebooklm/_vendor/notebooklm/_types/notes.py +27 -0
  723. cccc/providers/notebooklm/_vendor/notebooklm/_types/research.py +283 -0
  724. cccc/providers/notebooklm/_vendor/notebooklm/_types/sharing.py +188 -0
  725. cccc/providers/notebooklm/_vendor/notebooklm/_types/sources.py +357 -0
  726. cccc/providers/notebooklm/_vendor/notebooklm/_url_utils.py +178 -0
  727. cccc/providers/notebooklm/_vendor/notebooklm/_version_check.py +20 -0
  728. cccc/providers/notebooklm/_vendor/notebooklm/_version_info.py +66 -0
  729. cccc/providers/notebooklm/_vendor/notebooklm/artifacts.py +185 -0
  730. cccc/providers/notebooklm/_vendor/notebooklm/auth.py +337 -0
  731. cccc/providers/notebooklm/_vendor/notebooklm/client.py +945 -0
  732. cccc/providers/notebooklm/_vendor/notebooklm/config.py +24 -0
  733. cccc/providers/notebooklm/_vendor/notebooklm/exceptions.py +1524 -0
  734. cccc/providers/notebooklm/_vendor/notebooklm/io.py +10 -0
  735. cccc/providers/notebooklm/_vendor/notebooklm/log.py +9 -0
  736. cccc/providers/notebooklm/_vendor/notebooklm/migration.py +233 -0
  737. cccc/providers/notebooklm/_vendor/notebooklm/paths.py +503 -0
  738. cccc/providers/notebooklm/_vendor/notebooklm/py.typed +1 -0
  739. cccc/providers/notebooklm/_vendor/notebooklm/research.py +149 -0
  740. cccc/providers/notebooklm/_vendor/notebooklm/rpc/__init__.py +107 -0
  741. cccc/providers/notebooklm/_vendor/notebooklm/rpc/_safe_index.py +116 -0
  742. cccc/providers/notebooklm/_vendor/notebooklm/rpc/decoder.py +756 -0
  743. cccc/providers/notebooklm/_vendor/notebooklm/rpc/encoder.py +109 -0
  744. cccc/providers/notebooklm/_vendor/notebooklm/rpc/overrides.py +152 -0
  745. cccc/providers/notebooklm/_vendor/notebooklm/rpc/types.py +462 -0
  746. cccc/providers/notebooklm/_vendor/notebooklm/types.py +277 -0
  747. cccc/providers/notebooklm/_vendor/notebooklm/urls.py +13 -0
  748. cccc/providers/notebooklm/_vendor/notebooklm/utils.py +111 -0
  749. cccc/providers/notebooklm/adapter.py +1553 -0
  750. cccc/providers/notebooklm/compat.py +38 -0
  751. cccc/providers/notebooklm/errors.py +15 -0
  752. cccc/providers/notebooklm/health.py +155 -0
  753. cccc/resources/__init__.py +2 -0
  754. cccc/resources/capability-allowlist.default.yaml +686 -0
  755. cccc/resources/cccc-help.md +125 -0
  756. cccc/resources/code_mode_metadata.json +293 -0
  757. cccc/resources/code_mode_runtime.js +429 -0
  758. cccc/resources/mcp_tools.json +3429 -0
  759. cccc/resources/voice-models.default.json +99 -0
  760. cccc/runners/__init__.py +22 -0
  761. cccc/runners/headless.py +248 -0
  762. cccc/runners/platform_support.py +98 -0
  763. cccc/runners/pty.py +1338 -0
  764. cccc/runners/pty_lifecycle.py +138 -0
  765. cccc/runners/pty_snapshot.py +177 -0
  766. cccc/runners/pty_stub.py +153 -0
  767. cccc/runners/pty_win.py +1388 -0
  768. cccc/util/__init__.py +2 -0
  769. cccc/util/conv.py +39 -0
  770. cccc/util/file_lock.py +110 -0
  771. cccc/util/fs.py +129 -0
  772. cccc/util/node_env.py +52 -0
  773. cccc/util/obslog.py +142 -0
  774. cccc/util/process.py +402 -0
  775. cccc/util/terminal_render.py +405 -0
  776. cccc/util/time.py +23 -0
  777. cccc/vendor/reme/__init__.py +1 -0
  778. cccc/vendor/reme/core/__init__.py +1 -0
  779. cccc/vendor/reme/core/embedding/__init__.py +3 -0
  780. cccc/vendor/reme/core/embedding/base_embedding_model.py +24 -0
  781. cccc/vendor/reme/core/enumeration/__init__.py +4 -0
  782. cccc/vendor/reme/core/enumeration/memory_source.py +11 -0
  783. cccc/vendor/reme/core/enumeration/role.py +19 -0
  784. cccc/vendor/reme/core/file_store/__init__.py +4 -0
  785. cccc/vendor/reme/core/file_store/base_file_store.py +195 -0
  786. cccc/vendor/reme/core/file_store/local_file_store.py +506 -0
  787. cccc/vendor/reme/core/file_watcher/__init__.py +4 -0
  788. cccc/vendor/reme/core/file_watcher/base_file_watcher.py +204 -0
  789. cccc/vendor/reme/core/file_watcher/full_file_watcher.py +78 -0
  790. cccc/vendor/reme/core/schema/__init__.py +7 -0
  791. cccc/vendor/reme/core/schema/cut_point_result.py +21 -0
  792. cccc/vendor/reme/core/schema/file_metadata.py +15 -0
  793. cccc/vendor/reme/core/schema/memory_chunk.py +19 -0
  794. cccc/vendor/reme/core/schema/memory_search_result.py +23 -0
  795. cccc/vendor/reme/core/schema/message.py +12 -0
  796. cccc/vendor/reme/core/utils/__init__.py +4 -0
  797. cccc/vendor/reme/core/utils/chunking_utils.py +124 -0
  798. cccc/vendor/reme/core/utils/common_utils.py +35 -0
  799. cccc/vendor/reme/memory/__init__.py +1 -0
  800. cccc/vendor/reme/memory/file_based/__init__.py +1 -0
  801. cccc/vendor/reme/memory/file_based/fb_compactor.py +114 -0
  802. cccc/vendor/reme/memory/file_based/fb_context_checker.py +161 -0
  803. cccc/vendor/reme/memory/file_based/fb_summarizer.py +89 -0
  804. cccc/vendor/reme/memory/tools/__init__.py +1 -0
  805. cccc/vendor/reme/memory/tools/chunk/__init__.py +1 -0
  806. cccc/vendor/reme/memory/tools/chunk/memory_get.py +113 -0
  807. cccc/vendor/reme/memory/tools/chunk/memory_search.py +112 -0
  808. cccc_pair-0.4.34.dist-info/METADATA +647 -0
  809. cccc_pair-0.4.34.dist-info/RECORD +813 -0
  810. cccc_pair-0.4.34.dist-info/WHEEL +5 -0
  811. cccc_pair-0.4.34.dist-info/entry_points.txt +3 -0
  812. cccc_pair-0.4.34.dist-info/licenses/LICENSE +201 -0
  813. cccc_pair-0.4.34.dist-info/top_level.txt +1 -0
cccc/__init__.py ADDED
@@ -0,0 +1,16 @@
1
+ from __future__ import annotations
2
+
3
+ from importlib.metadata import PackageNotFoundError, version
4
+
5
+
6
+ def _detect_version() -> str:
7
+ for dist_name in ("cccc-pair", "cccc"):
8
+ try:
9
+ return version(dist_name)
10
+ except PackageNotFoundError:
11
+ continue
12
+ return "0.0.0"
13
+
14
+
15
+ __version__ = _detect_version()
16
+
@@ -0,0 +1 @@
1
+ """Private native payloads bundled by platform-specific CCCC wheels."""
Binary file
cccc/cli/__init__.py ADDED
@@ -0,0 +1,43 @@
1
+ from __future__ import annotations
2
+
3
+ """CCCC CLI package entrypoint."""
4
+
5
+ import sys
6
+ import types
7
+
8
+ # Re-export everything from submodules (mirroring main.py's imports).
9
+ # common.__all__ includes underscore names like _ensure_daemon_running.
10
+ from .common import * # noqa: F401,F403
11
+ from .group_cmds import * # noqa: F401,F403
12
+ from .actor_cmds import * # noqa: F401,F403
13
+ from .messaging_cmds import * # noqa: F401,F403
14
+ from .space_cmds import * # noqa: F401,F403
15
+ from .im_cmds import * # noqa: F401,F403
16
+ from .system_cmds import * # noqa: F401,F403
17
+ from .main import build_parser, main # noqa: F401
18
+
19
+ _PATCH_FORWARD_MODULES = (
20
+ "cccc.cli.common",
21
+ "cccc.cli.group_cmds",
22
+ "cccc.cli.actor_cmds",
23
+ "cccc.cli.messaging_cmds",
24
+ "cccc.cli.space_cmds",
25
+ "cccc.cli.im_cmds",
26
+ "cccc.cli.system_cmds",
27
+ )
28
+
29
+
30
+ class _CliModule(types.ModuleType):
31
+ """Forward patched attrs on cccc.cli to split command modules."""
32
+
33
+ def __setattr__(self, name: str, value: object) -> None:
34
+ super().__setattr__(name, value)
35
+ for mod_name in _PATCH_FORWARD_MODULES:
36
+ mod = sys.modules.get(mod_name)
37
+ if mod is None:
38
+ continue
39
+ if name in mod.__dict__:
40
+ mod.__dict__[name] = value
41
+
42
+
43
+ sys.modules[__name__].__class__ = _CliModule
cccc/cli/__main__.py ADDED
@@ -0,0 +1,7 @@
1
+ from __future__ import annotations
2
+
3
+ from .main import main
4
+
5
+
6
+ if __name__ == "__main__":
7
+ raise SystemExit(main())
cccc/cli/actor_cmds.py ADDED
@@ -0,0 +1,478 @@
1
+ from __future__ import annotations
2
+
3
+ """Actor related CLI command handlers."""
4
+
5
+ from .common import * # noqa: F401,F403
6
+
7
+ __all__ = [
8
+ "cmd_actor_list",
9
+ "cmd_actor_add",
10
+ "cmd_actor_remove",
11
+ "cmd_actor_start",
12
+ "cmd_actor_stop",
13
+ "cmd_actor_restart",
14
+ "cmd_actor_update",
15
+ "cmd_actor_secrets",
16
+ "cmd_runtime_list",
17
+ "cmd_runtime_hermes",
18
+ ]
19
+
20
+ def cmd_actor_list(args: argparse.Namespace) -> int:
21
+ group_id = _resolve_group_id(getattr(args, "group", ""))
22
+ if not group_id:
23
+ _print_json({"ok": False, "error": {"code": "missing_group_id", "message": "missing group_id (no active group?)"}})
24
+ return 2
25
+
26
+ if _ensure_daemon_running():
27
+ resp = call_daemon({"op": "actor_list", "args": {"group_id": group_id}})
28
+ if resp.get("ok"):
29
+ _print_json(resp)
30
+ return 0
31
+
32
+ group = load_group(group_id)
33
+ if group is None:
34
+ _print_json({"ok": False, "error": {"code": "group_not_found", "message": f"group not found: {group_id}"}})
35
+ return 2
36
+ _print_json({"ok": True, "result": {"actors": list_actors(group)}})
37
+ return 0
38
+
39
+ def cmd_actor_add(args: argparse.Namespace) -> int:
40
+ group_id = _resolve_group_id(getattr(args, "group", ""))
41
+ if not group_id:
42
+ _print_json({"ok": False, "error": {"code": "missing_group_id", "message": "missing group_id (no active group?)"}})
43
+ return 2
44
+ group = load_group(group_id)
45
+ if group is None:
46
+ _print_json({"ok": False, "error": {"code": "group_not_found", "message": f"group not found: {group_id}"}})
47
+ return 2
48
+
49
+ actor_id = str(args.actor_id or "").strip()
50
+ title = str(args.title or "").strip()
51
+ by = str(args.by or "user").strip()
52
+ submit = str(args.submit or "enter").strip() or "enter"
53
+ runner = str(getattr(args, "runner", "") or "pty").strip() or "pty"
54
+ runtime = str(getattr(args, "runtime", "") or "codex").strip() or "codex"
55
+ command: list[str] = []
56
+ if args.command:
57
+ try:
58
+ command = shlex.split(str(args.command), posix=(os.name != "nt"))
59
+ except Exception:
60
+ command = [str(args.command)]
61
+
62
+ # Auto-set command based on runtime if not provided
63
+ if not command:
64
+ from ..kernel.runtime import get_runtime_command_with_flags
65
+ command = get_runtime_command_with_flags(runtime)
66
+ if runtime == "custom" and not command:
67
+ _print_json({
68
+ "ok": False,
69
+ "error": {"code": "missing_command", "message": "custom runtime requires a command (PTY runner)"},
70
+ })
71
+ return 2
72
+
73
+ env: dict[str, str] = {}
74
+ if isinstance(args.env, list):
75
+ for item in args.env:
76
+ if not isinstance(item, str) or "=" not in item:
77
+ continue
78
+ k, v = item.split("=", 1)
79
+ k = k.strip()
80
+ if not k:
81
+ continue
82
+ env[k] = v
83
+ default_scope_key = ""
84
+ if args.scope:
85
+ default_scope_key = detect_scope(Path(args.scope)).scope_key
86
+ scopes = group.doc.get("scopes") if isinstance(group.doc.get("scopes"), list) else []
87
+ attached = any(isinstance(s, dict) and s.get("scope_key") == default_scope_key for s in scopes)
88
+ if not attached:
89
+ _print_json({"ok": False, "error": {"code": "scope_not_attached", "message": f"scope not attached: {default_scope_key}"}})
90
+ return 2
91
+
92
+ if _ensure_daemon_running():
93
+ resp = call_daemon(
94
+ {
95
+ "op": "actor_add",
96
+ "args": {
97
+ "group_id": group_id,
98
+ "actor_id": actor_id,
99
+ "title": title,
100
+ "submit": submit,
101
+ "runner": runner,
102
+ "runtime": runtime,
103
+ "by": by,
104
+ "command": command,
105
+ "env": env,
106
+ "default_scope_key": default_scope_key,
107
+ },
108
+ }
109
+ )
110
+ if resp.get("ok"):
111
+ _print_json(resp)
112
+ return 0
113
+ if not _daemon_response_allows_local_fallback(resp):
114
+ return _return_daemon_rejection(resp)
115
+
116
+ try:
117
+ require_actor_permission(group, by=by, action="actor.add")
118
+ # Note: role is auto-determined by stable position (first visible actor = foreman)
119
+ if runtime == "web_model":
120
+ runner = "headless"
121
+ command = []
122
+ elif runner != "pty":
123
+ raise ValueError("invalid runner (must be 'pty')")
124
+ if runtime not in (
125
+ "amp",
126
+ "antigravity",
127
+ "auggie",
128
+ "claude",
129
+ "cline",
130
+ "codex",
131
+ "copilot",
132
+ "cursor",
133
+ "devin",
134
+ "kiro",
135
+ "kilo",
136
+ "droid",
137
+ "grok",
138
+ "hermes",
139
+ "kimi",
140
+ "opencode",
141
+ "web_model",
142
+ "custom",
143
+ ):
144
+ raise ValueError("invalid runtime")
145
+ if runtime == "custom" and not command:
146
+ raise ValueError("custom runtime requires a command (PTY runner)")
147
+ actor = add_actor(
148
+ group,
149
+ actor_id=actor_id,
150
+ title=title,
151
+ command=command,
152
+ env=env,
153
+ default_scope_key=default_scope_key,
154
+ submit=submit,
155
+ runner=runner, # type: ignore
156
+ runtime=runtime, # type: ignore
157
+ )
158
+ except Exception as e:
159
+ _print_json({"ok": False, "error": {"code": "actor_add_failed", "message": str(e)}})
160
+ return 2
161
+ ev = append_event(group.ledger_path, kind="actor.add", group_id=group.group_id, scope_key="", by=by, data={"actor": actor})
162
+ _print_json({"ok": True, "result": {"actor": actor, "event": ev}})
163
+ return 0
164
+
165
+ def cmd_actor_remove(args: argparse.Namespace) -> int:
166
+ group_id = _resolve_group_id(getattr(args, "group", ""))
167
+ if not group_id:
168
+ _print_json({"ok": False, "error": {"code": "missing_group_id", "message": "missing group_id (no active group?)"}})
169
+ return 2
170
+ actor_id = str(args.actor_id or "").strip()
171
+ by = str(args.by or "user").strip()
172
+
173
+ if _ensure_daemon_running():
174
+ resp = call_daemon({"op": "actor_remove", "args": {"group_id": group_id, "actor_id": actor_id, "by": by}})
175
+ if resp.get("ok"):
176
+ _print_json(resp)
177
+ return 0
178
+ if not _daemon_response_allows_local_fallback(resp):
179
+ return _return_daemon_rejection(resp)
180
+
181
+ group = load_group(group_id)
182
+ if group is None:
183
+ _print_json({"ok": False, "error": {"code": "group_not_found", "message": f"group not found: {group_id}"}})
184
+ return 2
185
+ try:
186
+ require_actor_permission(group, by=by, action="actor.remove", target_actor_id=actor_id)
187
+ remove_actor(group, actor_id)
188
+ except Exception as e:
189
+ _print_json({"ok": False, "error": {"code": "actor_remove_failed", "message": str(e)}})
190
+ return 2
191
+ ev = append_event(group.ledger_path, kind="actor.remove", group_id=group.group_id, scope_key="", by=by, data={"actor_id": actor_id})
192
+ _print_json({"ok": True, "result": {"actor_id": actor_id, "event": ev}})
193
+ return 0
194
+
195
+ def cmd_actor_start(args: argparse.Namespace) -> int:
196
+ group_id = _resolve_group_id(getattr(args, "group", ""))
197
+ if not group_id:
198
+ _print_json({"ok": False, "error": {"code": "missing_group_id", "message": "missing group_id (no active group?)"}})
199
+ return 2
200
+ actor_id = str(args.actor_id or "").strip()
201
+ by = str(args.by or "user").strip()
202
+
203
+ if _ensure_daemon_running():
204
+ resp = call_daemon({"op": "actor_start", "args": {"group_id": group_id, "actor_id": actor_id, "by": by}})
205
+ if resp.get("ok"):
206
+ _print_json(resp)
207
+ return 0
208
+ if not _daemon_response_allows_local_fallback(resp):
209
+ return _return_daemon_rejection(resp)
210
+
211
+ group = load_group(group_id)
212
+ if group is None:
213
+ _print_json({"ok": False, "error": {"code": "group_not_found", "message": f"group not found: {group_id}"}})
214
+ return 2
215
+ try:
216
+ require_actor_permission(group, by=by, action="actor.start", target_actor_id=actor_id)
217
+ actor = update_actor(group, actor_id, {"enabled": True})
218
+ except Exception as e:
219
+ _print_json({"ok": False, "error": {"code": "actor_start_failed", "message": str(e)}})
220
+ return 2
221
+ ev = append_event(group.ledger_path, kind="actor.start", group_id=group.group_id, scope_key="", by=by, data={"actor_id": actor_id})
222
+ _print_json({"ok": True, "result": {"actor": actor, "event": ev}})
223
+ return 0
224
+
225
+ def cmd_actor_stop(args: argparse.Namespace) -> int:
226
+ group_id = _resolve_group_id(getattr(args, "group", ""))
227
+ if not group_id:
228
+ _print_json({"ok": False, "error": {"code": "missing_group_id", "message": "missing group_id (no active group?)"}})
229
+ return 2
230
+ actor_id = str(args.actor_id or "").strip()
231
+ by = str(args.by or "user").strip()
232
+
233
+ if _ensure_daemon_running():
234
+ resp = call_daemon({"op": "actor_stop", "args": {"group_id": group_id, "actor_id": actor_id, "by": by}})
235
+ if resp.get("ok"):
236
+ _print_json(resp)
237
+ return 0
238
+ if not _daemon_response_allows_local_fallback(resp):
239
+ return _return_daemon_rejection(resp)
240
+
241
+ group = load_group(group_id)
242
+ if group is None:
243
+ _print_json({"ok": False, "error": {"code": "group_not_found", "message": f"group not found: {group_id}"}})
244
+ return 2
245
+ try:
246
+ require_actor_permission(group, by=by, action="actor.stop", target_actor_id=actor_id)
247
+ actor = update_actor(group, actor_id, {"enabled": False})
248
+ except Exception as e:
249
+ _print_json({"ok": False, "error": {"code": "actor_stop_failed", "message": str(e)}})
250
+ return 2
251
+ ev = append_event(group.ledger_path, kind="actor.stop", group_id=group.group_id, scope_key="", by=by, data={"actor_id": actor_id})
252
+ _print_json({"ok": True, "result": {"actor": actor, "event": ev}})
253
+ return 0
254
+
255
+ def cmd_actor_restart(args: argparse.Namespace) -> int:
256
+ group_id = _resolve_group_id(getattr(args, "group", ""))
257
+ if not group_id:
258
+ _print_json({"ok": False, "error": {"code": "missing_group_id", "message": "missing group_id (no active group?)"}})
259
+ return 2
260
+ actor_id = str(args.actor_id or "").strip()
261
+ by = str(args.by or "user").strip()
262
+
263
+ if _ensure_daemon_running():
264
+ resp = call_daemon({"op": "actor_restart", "args": {"group_id": group_id, "actor_id": actor_id, "by": by}})
265
+ if resp.get("ok"):
266
+ _print_json(resp)
267
+ return 0
268
+ if not _daemon_response_allows_local_fallback(resp):
269
+ return _return_daemon_rejection(resp)
270
+
271
+ group = load_group(group_id)
272
+ if group is None:
273
+ _print_json({"ok": False, "error": {"code": "group_not_found", "message": f"group not found: {group_id}"}})
274
+ return 2
275
+ try:
276
+ require_actor_permission(group, by=by, action="actor.restart", target_actor_id=actor_id)
277
+ actor = update_actor(group, actor_id, {"enabled": True})
278
+ except Exception as e:
279
+ _print_json({"ok": False, "error": {"code": "actor_restart_failed", "message": str(e)}})
280
+ return 2
281
+ ev = append_event(group.ledger_path, kind="actor.restart", group_id=group.group_id, scope_key="", by=by, data={"actor_id": actor_id})
282
+ _print_json({"ok": True, "result": {"actor": actor, "event": ev}})
283
+ return 0
284
+
285
+ def cmd_actor_update(args: argparse.Namespace) -> int:
286
+ group_id = _resolve_group_id(getattr(args, "group", ""))
287
+ if not group_id:
288
+ _print_json({"ok": False, "error": {"code": "missing_group_id", "message": "missing group_id (no active group?)"}})
289
+ return 2
290
+
291
+ actor_id = str(args.actor_id or "").strip()
292
+ by = str(args.by or "user").strip()
293
+
294
+ group = load_group(group_id)
295
+ if group is None:
296
+ _print_json({"ok": False, "error": {"code": "group_not_found", "message": f"group not found: {group_id}"}})
297
+ return 2
298
+
299
+ patch: dict[str, Any] = {}
300
+ if args.title is not None:
301
+ patch["title"] = str(args.title or "")
302
+ role = getattr(args, "role", None)
303
+ if role:
304
+ patch["role"] = str(role)
305
+ if args.command is not None:
306
+ cmd: list[str] = []
307
+ if str(args.command).strip():
308
+ try:
309
+ cmd = shlex.split(str(args.command), posix=(os.name != "nt"))
310
+ except Exception:
311
+ cmd = [str(args.command)]
312
+ patch["command"] = cmd
313
+ if isinstance(args.env, list) and args.env:
314
+ env: dict[str, str] = {}
315
+ for item in args.env:
316
+ if not isinstance(item, str) or "=" not in item:
317
+ continue
318
+ k, v = item.split("=", 1)
319
+ k = k.strip()
320
+ if not k:
321
+ continue
322
+ env[k] = v
323
+ patch["env"] = env
324
+ if args.scope:
325
+ scope_key = detect_scope(Path(args.scope)).scope_key
326
+ scopes = group.doc.get("scopes") if isinstance(group.doc.get("scopes"), list) else []
327
+ attached = any(isinstance(s, dict) and s.get("scope_key") == scope_key for s in scopes)
328
+ if not attached:
329
+ _print_json({"ok": False, "error": {"code": "scope_not_attached", "message": f"scope not attached: {scope_key}"}})
330
+ return 2
331
+ patch["default_scope_key"] = scope_key
332
+ if args.submit is not None:
333
+ patch["submit"] = str(args.submit)
334
+ if getattr(args, "runner", None) is not None:
335
+ patch["runner"] = str(args.runner)
336
+ if getattr(args, "runtime", None) is not None:
337
+ patch["runtime"] = str(args.runtime)
338
+ if getattr(args, "runtime_state_source", None) is not None:
339
+ patch["runtime_state_source"] = str(args.runtime_state_source)
340
+ if args.enabled is not None:
341
+ patch["enabled"] = bool(args.enabled)
342
+
343
+ if not patch:
344
+ _print_json({"ok": False, "error": {"code": "empty_patch", "message": "nothing to update"}})
345
+ return 2
346
+
347
+ if _ensure_daemon_running():
348
+ resp = call_daemon({"op": "actor_update", "args": {"group_id": group_id, "actor_id": actor_id, "patch": patch, "by": by}})
349
+ _print_json(resp)
350
+ return 0 if resp.get("ok") else 2
351
+
352
+ try:
353
+ require_actor_permission(group, by=by, action="actor.update", target_actor_id=actor_id)
354
+ actor = update_actor(group, actor_id, patch)
355
+ except Exception as e:
356
+ _print_json({"ok": False, "error": {"code": "actor_update_failed", "message": str(e)}})
357
+ return 2
358
+ ev = append_event(group.ledger_path, kind="actor.update", group_id=group.group_id, scope_key="", by=by, data={"actor_id": actor_id, "patch": patch})
359
+ _print_json({"ok": True, "result": {"actor": actor, "event": ev}})
360
+ return 0
361
+
362
+ def cmd_actor_secrets(args: argparse.Namespace) -> int:
363
+ """Manage per-actor runtime-only secrets env (stored under CCCC_HOME/state, not in ledger)."""
364
+ group_id = _resolve_group_id(getattr(args, "group", ""))
365
+ if not group_id:
366
+ _print_json({"ok": False, "error": {"code": "missing_group_id", "message": "missing group_id (no active group?)"}})
367
+ return 2
368
+
369
+ actor_id = str(args.actor_id or "").strip()
370
+ by = str(args.by or "user").strip() or "user"
371
+
372
+ if not _ensure_daemon_running():
373
+ _print_json({"ok": False, "error": {"code": "daemon_unavailable", "message": "daemon unavailable"}})
374
+ return 2
375
+
376
+ if getattr(args, "keys", False):
377
+ resp = call_daemon({"op": "actor_env_private_keys", "args": {"group_id": group_id, "actor_id": actor_id, "by": by}})
378
+ _print_json(resp)
379
+ return 0 if resp.get("ok") else 2
380
+
381
+ set_vars: dict[str, str] = {}
382
+ for item in (args.set or []):
383
+ if not isinstance(item, str) or "=" not in item:
384
+ continue
385
+ k, v = item.split("=", 1)
386
+ k = k.strip()
387
+ if not k:
388
+ continue
389
+ set_vars[k] = v
390
+
391
+ unset_keys: list[str] = []
392
+ for item in (args.unset or []):
393
+ k = str(item or "").strip()
394
+ if k:
395
+ unset_keys.append(k)
396
+
397
+ clear = bool(getattr(args, "clear", False))
398
+ restart = bool(getattr(args, "restart", False))
399
+
400
+ resp = call_daemon(
401
+ {
402
+ "op": "actor_env_private_update",
403
+ "args": {
404
+ "group_id": group_id,
405
+ "actor_id": actor_id,
406
+ "by": by,
407
+ "set": set_vars,
408
+ "unset": unset_keys,
409
+ "clear": clear,
410
+ },
411
+ }
412
+ )
413
+ if not resp.get("ok"):
414
+ _print_json(resp)
415
+ return 2
416
+
417
+ if restart:
418
+ r = call_daemon({"op": "actor_restart", "args": {"group_id": group_id, "actor_id": actor_id, "by": by}})
419
+ if not r.get("ok"):
420
+ _print_json(r)
421
+ return 2
422
+ _print_json({"ok": True, "result": {"secrets": resp.get("result", {}), "restart": r.get("result", {})}})
423
+ return 0
424
+
425
+ _print_json(resp)
426
+ return 0
427
+
428
+ def cmd_runtime_list(args: argparse.Namespace) -> int:
429
+ """List available agent runtimes."""
430
+ from ..kernel.runtime import detect_all_runtimes
431
+
432
+ all_runtimes = args.all if hasattr(args, 'all') else False
433
+ runtimes = detect_all_runtimes(primary_only=not all_runtimes)
434
+
435
+ result = {
436
+ "runtimes": [
437
+ {
438
+ "name": rt.name,
439
+ "display_name": rt.display_name,
440
+ "command": rt.command,
441
+ "available": rt.available,
442
+ "path": rt.path,
443
+ "capabilities": rt.capabilities,
444
+ }
445
+ for rt in runtimes
446
+ ],
447
+ "available": [rt.name for rt in runtimes if rt.available],
448
+ }
449
+
450
+ _print_json({"ok": True, "result": result})
451
+ return 0
452
+
453
+ def cmd_runtime_hermes(args: argparse.Namespace) -> int:
454
+ """Probe or prepare Hermes runtime MCP wiring."""
455
+ from ..kernel.hermes_runtime import hermes_runtime_status, prepare_hermes_runtime, run_hermes_mcp_test
456
+
457
+ action = str(getattr(args, "hermes_action", "") or "").strip()
458
+ if action == "status":
459
+ _print_json({"ok": True, "result": hermes_runtime_status()})
460
+ return 0
461
+ if action == "prepare":
462
+ result = prepare_hermes_runtime(
463
+ cwd=Path(str(getattr(args, "path", "") or ".")).resolve(),
464
+ auto_enable_tools=bool(getattr(args, "yes", False)),
465
+ force_mcp=bool(getattr(args, "force", False)),
466
+ )
467
+ _print_json({"ok": bool(result.get("ok")), "result": result})
468
+ return 0 if result.get("ok") else 2
469
+ if action == "mcp-test":
470
+ result = run_hermes_mcp_test(
471
+ cwd=Path(str(getattr(args, "path", "") or ".")).resolve(),
472
+ group_id=str(getattr(args, "group_id", "") or "g_probe"),
473
+ actor_id=str(getattr(args, "actor_id", "") or "hermes-probe"),
474
+ )
475
+ _print_json({"ok": bool(result.get("ok")), "result": result})
476
+ return 0 if result.get("ok") else 2
477
+ _print_json({"ok": False, "error": {"code": "invalid_action", "message": f"unknown Hermes runtime action: {action}"}})
478
+ return 2