hyperagents 1.2.3rc5.post3__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 (361) hide show
  1. agents/__init__.py +31 -0
  2. agents/background_monitor.py +453 -0
  3. agents/learning.py +460 -0
  4. agents/planner.py +421 -0
  5. agents/transcriber.py +341 -0
  6. civilization/__init__.py +51 -0
  7. civilization/api/__init__.py +7 -0
  8. civilization/api/civilization_api.py +361 -0
  9. civilization/graph/__init__.py +19 -0
  10. civilization/graph/knowledge_linker.py +348 -0
  11. civilization/graph/org_graph.py +348 -0
  12. civilization/graph/process_graph.py +386 -0
  13. civilization/ingestion/__init__.py +20 -0
  14. civilization/ingestion/chunker.py +273 -0
  15. civilization/ingestion/document_ingestor.py +358 -0
  16. civilization/ingestion/embedder.py +262 -0
  17. civilization/ingestion/extractor.py +224 -0
  18. civilization/interview/__init__.py +19 -0
  19. civilization/interview/gap_detector.py +380 -0
  20. civilization/interview/interviewer.py +323 -0
  21. civilization/interview/questioner.py +363 -0
  22. civilization/retrieval/__init__.py +17 -0
  23. civilization/retrieval/civilization_rag.py +316 -0
  24. civilization/retrieval/context_injector.py +342 -0
  25. civilization/retrieval/relevance_ranker.py +287 -0
  26. civilization/schema.py +299 -0
  27. civilization/store.py +177 -0
  28. civilization/sync/__init__.py +16 -0
  29. civilization/sync/confluence_sync.py +317 -0
  30. civilization/sync/gdrive_sync.py +262 -0
  31. civilization/sync/notion_sync.py +237 -0
  32. civilization/versioning/__init__.py +19 -0
  33. civilization/versioning/diff_engine.py +351 -0
  34. civilization/versioning/staleness_detector.py +303 -0
  35. civilization/versioning/version_manager.py +293 -0
  36. cli/__init__.py +1 -0
  37. cli/doctor.py +334 -0
  38. cli/hyperclaw.py +1357 -0
  39. cli/onboarding.py +469 -0
  40. core/__init__.py +1 -0
  41. core/connectors/__init__.py +119 -0
  42. core/connectors/infrastructure.py +772 -0
  43. core/connectors/messaging.py +586 -0
  44. core/connectors/productivity.py +764 -0
  45. core/connectors/smarthome.py +528 -0
  46. core/connectors/social.py +730 -0
  47. core/hyperrouter/__init__.py +23 -0
  48. core/hyperrouter/bandit.py +218 -0
  49. core/hyperrouter/fast_loop.py +68 -0
  50. core/hyperrouter/slow_loop.py +143 -0
  51. core/hyperstate/__init__.py +24 -0
  52. core/hyperstate/certifier.py +154 -0
  53. core/hyperstate/schema.py +160 -0
  54. core/hyperstate/state_manager.py +103 -0
  55. core/hyperstate/store.py +163 -0
  56. core/providers/__init__.py +121 -0
  57. core/providers/embeddings.py +389 -0
  58. core/providers/image.py +534 -0
  59. core/providers/llm.py +1935 -0
  60. core/providers/search.py +608 -0
  61. core/providers/voice.py +474 -0
  62. hyperagents-1.2.3rc5.post3.dist-info/METADATA +469 -0
  63. hyperagents-1.2.3rc5.post3.dist-info/RECORD +361 -0
  64. hyperagents-1.2.3rc5.post3.dist-info/WHEEL +5 -0
  65. hyperagents-1.2.3rc5.post3.dist-info/entry_points.txt +6 -0
  66. hyperagents-1.2.3rc5.post3.dist-info/licenses/LICENSE +21 -0
  67. hyperagents-1.2.3rc5.post3.dist-info/top_level.txt +13 -0
  68. hyperclaw/__init__.py +67 -0
  69. hyperclaw/__main__.py +220 -0
  70. hyperclaw/agent.py +775 -0
  71. hyperclaw/agent_coordinator.py +577 -0
  72. hyperclaw/anthropic_params.py +225 -0
  73. hyperclaw/api_utils.py +85 -0
  74. hyperclaw/approval_telegram.py +209 -0
  75. hyperclaw/approval_terminal.py +80 -0
  76. hyperclaw/attachments.py +177 -0
  77. hyperclaw/branding.py +55 -0
  78. hyperclaw/brief/__init__.py +11 -0
  79. hyperclaw/brief/cli.py +204 -0
  80. hyperclaw/brief/collect.py +146 -0
  81. hyperclaw/brief/compose.py +333 -0
  82. hyperclaw/brief/diff.py +110 -0
  83. hyperclaw/brief/errors.py +99 -0
  84. hyperclaw/brief/google.py +269 -0
  85. hyperclaw/brief/google_auth.py +294 -0
  86. hyperclaw/brief/links.py +124 -0
  87. hyperclaw/brief/service.py +424 -0
  88. hyperclaw/brief/store.py +205 -0
  89. hyperclaw/brief/tasks.py +200 -0
  90. hyperclaw/chat_scope.py +115 -0
  91. hyperclaw/cli_tui.py +497 -0
  92. hyperclaw/client_guard.py +717 -0
  93. hyperclaw/connection_check.py +113 -0
  94. hyperclaw/cost_guard.py +1728 -0
  95. hyperclaw/default_config/agents.yaml +534 -0
  96. hyperclaw/default_config/hyperclaw.yaml +27 -0
  97. hyperclaw/default_config/models.yaml +161 -0
  98. hyperclaw/deployment.py +39 -0
  99. hyperclaw/digest/__init__.py +9 -0
  100. hyperclaw/digest/cli.py +117 -0
  101. hyperclaw/digest/errors.py +100 -0
  102. hyperclaw/digest/gitlab.py +187 -0
  103. hyperclaw/digest/http.py +113 -0
  104. hyperclaw/digest/redact.py +32 -0
  105. hyperclaw/digest/service.py +271 -0
  106. hyperclaw/digest/slack.py +223 -0
  107. hyperclaw/digest/state.py +124 -0
  108. hyperclaw/digest/summarize.py +198 -0
  109. hyperclaw/digest/tokens.py +143 -0
  110. hyperclaw/distribution.py +46 -0
  111. hyperclaw/documents.py +351 -0
  112. hyperclaw/feeds.py +339 -0
  113. hyperclaw/google_workspace/__init__.py +5 -0
  114. hyperclaw/google_workspace/api.py +151 -0
  115. hyperclaw/google_workspace/auth.py +397 -0
  116. hyperclaw/google_workspace/calendar.py +157 -0
  117. hyperclaw/google_workspace/cli.py +72 -0
  118. hyperclaw/google_workspace/drive.py +236 -0
  119. hyperclaw/google_workspace/errors.py +58 -0
  120. hyperclaw/google_workspace/gmail.py +295 -0
  121. hyperclaw/google_workspace/meet.py +122 -0
  122. hyperclaw/google_workspace/tools.py +319 -0
  123. hyperclaw/hyperspeed.py +57 -0
  124. hyperclaw/integrations_layer.py +1427 -0
  125. hyperclaw/live_state.py +188 -0
  126. hyperclaw/managed_config.py +245 -0
  127. hyperclaw/media_hub.py +179 -0
  128. hyperclaw/memory_manager.py +584 -0
  129. hyperclaw/model_catalog.py +551 -0
  130. hyperclaw/model_policy.py +211 -0
  131. hyperclaw/model_router.py +595 -0
  132. hyperclaw/model_selector.py +72 -0
  133. hyperclaw/naming.py +284 -0
  134. hyperclaw/notices.py +65 -0
  135. hyperclaw/oai_stream.py +106 -0
  136. hyperclaw/orchestrator.py +591 -0
  137. hyperclaw/outbox.py +82 -0
  138. hyperclaw/persona.py +367 -0
  139. hyperclaw/prometheus.py +219 -0
  140. hyperclaw/prompt_assembly.py +157 -0
  141. hyperclaw/provider_setup.py +146 -0
  142. hyperclaw/providers.py +340 -0
  143. hyperclaw/qualification.py +341 -0
  144. hyperclaw/qualification_keys/hyper-d292fd127cef5a3e.pub +1 -0
  145. hyperclaw/qualification_records/anthropic--claude-sonnet-5-5.json +14 -0
  146. hyperclaw/reasoning_display.py +35 -0
  147. hyperclaw/scheduler.py +454 -0
  148. hyperclaw/server.py +847 -0
  149. hyperclaw/setup.py +627 -0
  150. hyperclaw/skills.py +717 -0
  151. hyperclaw/solomon.py +442 -0
  152. hyperclaw/swarm.py +533 -0
  153. hyperclaw/taint.py +832 -0
  154. hyperclaw/team/__init__.py +28 -0
  155. hyperclaw/team/dispatcher.py +431 -0
  156. hyperclaw/team/genesis.py +106 -0
  157. hyperclaw/team/lead.py +110 -0
  158. hyperclaw/team/model.py +135 -0
  159. hyperclaw/team/morning.py +238 -0
  160. hyperclaw/team/repos.py +66 -0
  161. hyperclaw/team/roster.py +264 -0
  162. hyperclaw/team/specialist.py +235 -0
  163. hyperclaw/team/status.py +163 -0
  164. hyperclaw/team/watchers.py +112 -0
  165. hyperclaw/teamsetup/__init__.py +17 -0
  166. hyperclaw/teamsetup/checks.py +208 -0
  167. hyperclaw/teamsetup/item.py +391 -0
  168. hyperclaw/teamsetup/oauth_loopback.py +84 -0
  169. hyperclaw/teamsetup/onboard.py +550 -0
  170. hyperclaw/teamsetup/profile.py +82 -0
  171. hyperclaw/teamsetup/secrets.py +313 -0
  172. hyperclaw/teamsetup/selfcheck.py +295 -0
  173. hyperclaw/teamsetup/service.py +495 -0
  174. hyperclaw/teamsetup/slack_oauth.py +442 -0
  175. hyperclaw/teamsetup/tty.py +62 -0
  176. hyperclaw/telegram_bot.py +1106 -0
  177. hyperclaw/telegram_intake.py +126 -0
  178. hyperclaw/telegram_pairing.py +360 -0
  179. hyperclaw/terminal_provider.py +323 -0
  180. hyperclaw/tools/__init__.py +1 -0
  181. hyperclaw/tools/approval.py +949 -0
  182. hyperclaw/tools/args.py +212 -0
  183. hyperclaw/tools/catalog.py +244 -0
  184. hyperclaw/tools/classify.py +266 -0
  185. hyperclaw/tools/effects.py +724 -0
  186. hyperclaw/tools/egress.py +210 -0
  187. hyperclaw/tools/envelope.py +188 -0
  188. hyperclaw/tools/guard.py +367 -0
  189. hyperclaw/tools/ledger.py +339 -0
  190. hyperclaw/tools/receipts.py +70 -0
  191. hyperclaw/tools/registry.py +318 -0
  192. hyperclaw/tools/service_guard.py +151 -0
  193. hyperclaw/tools/surfaces.py +54 -0
  194. hyperclaw/tools/workspace.py +87 -0
  195. hyperclaw/trading/__init__.py +77 -0
  196. hyperclaw/truth_guard.py +791 -0
  197. hyperclaw/tts.py +124 -0
  198. hyperclaw/tui.py +4255 -0
  199. hyperclaw/tui_bridge.py +938 -0
  200. hyperclaw/unattended.py +60 -0
  201. hyperclaw/updates/__init__.py +54 -0
  202. hyperclaw/updates/check.py +131 -0
  203. hyperclaw/updates/index.py +178 -0
  204. hyperclaw/updates/install.py +110 -0
  205. hyperclaw/updates/managed.py +161 -0
  206. hyperclaw/updates/manifest.py +138 -0
  207. hyperclaw/updates/notices.py +86 -0
  208. hyperclaw/updates/paths.py +53 -0
  209. hyperclaw/updates/release.py +146 -0
  210. hyperclaw/updates/upgrade.py +253 -0
  211. hyperclaw/updates/versioning.py +104 -0
  212. hyperclaw/userconfig.py +119 -0
  213. hyperclaw/xai.py +83 -0
  214. integrations/__init__.py +31 -0
  215. integrations/automation/__init__.py +1 -0
  216. integrations/automation/make.py +87 -0
  217. integrations/automation/zapier.py +87 -0
  218. integrations/base.py +476 -0
  219. integrations/communication/__init__.py +1 -0
  220. integrations/communication/twilio.py +279 -0
  221. integrations/communication/zoom.py +290 -0
  222. integrations/data/__init__.py +1 -0
  223. integrations/data/google_analytics.py +135 -0
  224. integrations/data/postgres.py +182 -0
  225. integrations/data/supabase_connector.py +202 -0
  226. integrations/data/weather_feeds.py +450 -0
  227. integrations/developer/__init__.py +9 -0
  228. integrations/developer/github.py +406 -0
  229. integrations/developer/gitlab.py +298 -0
  230. integrations/enterprise/__init__.py +13 -0
  231. integrations/enterprise/confluence.py +266 -0
  232. integrations/enterprise/hubspot.py +293 -0
  233. integrations/enterprise/jira.py +314 -0
  234. integrations/enterprise/salesforce.py +286 -0
  235. integrations/finance/__init__.py +1 -0
  236. integrations/finance/polymarket_client.py +247 -0
  237. integrations/finance/quickbooks.py +281 -0
  238. integrations/finance/stripe.py +261 -0
  239. integrations/gateway.py +238 -0
  240. integrations/messaging/__init__.py +32 -0
  241. integrations/messaging/discord.py +159 -0
  242. integrations/messaging/email.py +401 -0
  243. integrations/messaging/imessage.py +443 -0
  244. integrations/messaging/signal.py +175 -0
  245. integrations/messaging/slack.py +217 -0
  246. integrations/messaging/sms.py +175 -0
  247. integrations/messaging/teams.py +208 -0
  248. integrations/messaging/telegram.py +260 -0
  249. integrations/messaging/whatsapp.py +203 -0
  250. integrations/productivity/__init__.py +17 -0
  251. integrations/productivity/airtable.py +217 -0
  252. integrations/productivity/asana.py +248 -0
  253. integrations/productivity/google/__init__.py +19 -0
  254. integrations/productivity/google/base.py +89 -0
  255. integrations/productivity/google/calendar.py +272 -0
  256. integrations/productivity/google/docs.py +202 -0
  257. integrations/productivity/google/drive.py +268 -0
  258. integrations/productivity/google/gmail.py +279 -0
  259. integrations/productivity/google/meet.py +218 -0
  260. integrations/productivity/google/sheets.py +222 -0
  261. integrations/productivity/google/tasks.py +199 -0
  262. integrations/productivity/linear.py +279 -0
  263. integrations/productivity/microsoft/__init__.py +13 -0
  264. integrations/productivity/microsoft/base.py +93 -0
  265. integrations/productivity/microsoft/calendar.py +207 -0
  266. integrations/productivity/microsoft/onedrive.py +222 -0
  267. integrations/productivity/microsoft/outlook.py +241 -0
  268. integrations/productivity/microsoft/sharepoint.py +211 -0
  269. integrations/productivity/notion.py +243 -0
  270. integrations/productivity/todoist.py +250 -0
  271. integrations/productivity/trello.py +244 -0
  272. integrations/storage/__init__.py +1 -0
  273. integrations/storage/box.py +279 -0
  274. integrations/storage/dropbox.py +215 -0
  275. integrations/telegram_inbound.py +179 -0
  276. integrations/telegram_poller.py +151 -0
  277. memory/__init__.py +1 -0
  278. memory/causal_graph.py +125 -0
  279. memory/impact_tracker.py +88 -0
  280. memory/vector_memory.py +436 -0
  281. models/__init__.py +12 -0
  282. models/chatjimmy_client.py +210 -0
  283. models/claude_client.py +235 -0
  284. models/claude_code_subagent.py +192 -0
  285. models/openai_client.py +120 -0
  286. models/router.py +162 -0
  287. recursive/discovery_loop.py +118 -0
  288. recursive/optimization_loop.py +135 -0
  289. recursive/validation_loop.py +38 -0
  290. security/__init__.py +1 -0
  291. security/audit_logger.py +106 -0
  292. security/filesystem_guard.py +100 -0
  293. security/hypershield.py +99 -0
  294. security/network_guard.py +97 -0
  295. security/policy_engine.py +198 -0
  296. swarm/__init__.py +1 -0
  297. swarm/agents/__init__.py +0 -0
  298. swarm/agents/base.py +230 -0
  299. swarm/agents/business/__init__.py +0 -0
  300. swarm/agents/business/counsel.py +31 -0
  301. swarm/agents/business/herald.py +32 -0
  302. swarm/agents/business/ledger.py +26 -0
  303. swarm/agents/business/nexus.py +30 -0
  304. swarm/agents/business/ops.py +30 -0
  305. swarm/agents/business/pipeline.py +28 -0
  306. swarm/agents/business/revenue.py +30 -0
  307. swarm/agents/business/sovereign.py +31 -0
  308. swarm/agents/business/strategos.py +27 -0
  309. swarm/agents/business/talent.py +27 -0
  310. swarm/agents/business/venture.py +32 -0
  311. swarm/agents/comms/__init__.py +1 -0
  312. swarm/agents/comms/cipher.py +32 -0
  313. swarm/agents/comms/echo_comms.py +31 -0
  314. swarm/agents/comms/envoy.py +31 -0
  315. swarm/agents/comms/herald_scheduler.py +33 -0
  316. swarm/agents/comms/pulse.py +29 -0
  317. swarm/agents/creative/__init__.py +0 -0
  318. swarm/agents/creative/author.py +27 -0
  319. swarm/agents/creative/lens.py +25 -0
  320. swarm/agents/executive/__init__.py +1 -0
  321. swarm/agents/intelligence/__init__.py +1 -0
  322. swarm/agents/intelligence/arbiter.py +30 -0
  323. swarm/agents/intelligence/sentinel.py +30 -0
  324. swarm/agents/media/__init__.py +0 -0
  325. swarm/agents/personal/__init__.py +0 -0
  326. swarm/agents/personal/atlas.py +27 -0
  327. swarm/agents/personal/hearth.py +26 -0
  328. swarm/agents/personal/midas.py +27 -0
  329. swarm/agents/personal/navigator.py +27 -0
  330. swarm/agents/personal/nourish.py +31 -0
  331. swarm/agents/personal/vitals.py +33 -0
  332. swarm/agents/recursive/__init__.py +0 -0
  333. swarm/agents/recursive/alchemist.py +73 -0
  334. swarm/agents/recursive/calibrator.py +45 -0
  335. swarm/agents/recursive/scout.py +97 -0
  336. swarm/agents/scientific/__init__.py +0 -0
  337. swarm/agents/scientific/cosmos.py +36 -0
  338. swarm/agents/scientific/gaia.py +26 -0
  339. swarm/agents/scientific/medicus.py +33 -0
  340. swarm/agents/scientific/oracle_agent.py +39 -0
  341. swarm/agents/scientific/scribe.py +39 -0
  342. swarm/agents/talent/__init__.py +0 -0
  343. swarm/agents/talent/deal.py +28 -0
  344. swarm/agents/talent/roster.py +29 -0
  345. swarm/agents/talent/scout.py +29 -0
  346. swarm/agents/talent/stage.py +27 -0
  347. swarm/agents/tech/__init__.py +0 -0
  348. swarm/agents/tech/aegis.py +28 -0
  349. swarm/agents/tech/bridge.py +28 -0
  350. swarm/agents/tech/forge.py +28 -0
  351. swarm/agents/trading/__init__.py +1 -0
  352. swarm/agents/trading/global_prediction_engine.py +611 -0
  353. swarm/agents/trading/polymarket_trader.py +165 -0
  354. swarm/agents/trading/prediction_strategist.py +218 -0
  355. swarm/autogen_bridge.py +68 -0
  356. swarm/bid_protocol.py +196 -0
  357. swarm/dispatcher.py +527 -0
  358. swarm/nexus.py +181 -0
  359. swarm/registry.py +112 -0
  360. telegram_listener.py +403 -0
  361. ui/tui/app.py +214 -0
hyperclaw/skills.py ADDED
@@ -0,0 +1,717 @@
1
+ """
2
+ HyperClaw Skills Engine
3
+ =======================
4
+ Manages Assistant's and the swarm's skill library.
5
+ - Skills are atomic, reusable capabilities agents can invoke
6
+ - GENESIS (scout) discovers new skills and proposes them
7
+ - Skills are versioned, tagged, and safety-audited before activation
8
+ - All new skills go through a 3-step pipeline: Discover → Audit → Activate
9
+
10
+ the user's directive: Scouts should always be looking for new skills
11
+ that improve Assistant's overall capability.
12
+ """
13
+
14
+ from __future__ import annotations
15
+
16
+ import json
17
+ import logging
18
+ import hashlib
19
+ import asyncio
20
+ import os
21
+ from datetime import datetime
22
+ from pathlib import Path
23
+ from typing import Optional, Callable, Any
24
+
25
+ import anthropic
26
+ from hyperclaw.api_utils import extract_text
27
+ from hyperclaw.cost_guard import max_output
28
+ from hyperclaw.taint import training_sink
29
+ from dotenv import load_dotenv
30
+
31
+ load_dotenv()
32
+
33
+ logger = logging.getLogger("hyperclaw.skills")
34
+
35
+ HYPERCLAW_ROOT = Path(os.environ.get("HYPERCLAW_ROOT", str(Path.home() / ".hyperclaw")))
36
+ SKILLS_DIR = HYPERCLAW_ROOT / "config" / "skills"
37
+ SKILLS_REGISTRY = SKILLS_DIR / "registry.json"
38
+ SKILLS_PROPOSALS = SKILLS_DIR / "proposals.json"
39
+
40
+ SKILLS_DIR.mkdir(parents=True, exist_ok=True)
41
+
42
+ # ── Skill Schema ──────────────────────────────────────────────────────────────
43
+
44
+ class Skill:
45
+ """A single atomic capability."""
46
+
47
+ def __init__(self, data: dict):
48
+ self.id = data["id"]
49
+ self.name = data["name"]
50
+ self.description = data["description"]
51
+ self.category = data.get("category", "general")
52
+ self.tags = data.get("tags", [])
53
+ self.agents = data.get("agents", []) # Which agents can use this
54
+ self.implementation = data.get("implementation", "")
55
+ self.status = data.get("status", "active") # active | proposed | deprecated
56
+ self.safety_score = data.get("safety_score", 1.0) # 0.0-1.0
57
+ self.added_at = data.get("added_at", datetime.now().isoformat())
58
+ self.source = data.get("source", "manual") # manual | genesis | openclaw
59
+ self.version = data.get("version", "1.0.0")
60
+
61
+ def to_dict(self) -> dict:
62
+ return {
63
+ "id": self.id,
64
+ "name": self.name,
65
+ "description": self.description,
66
+ "category": self.category,
67
+ "tags": self.tags,
68
+ "agents": self.agents,
69
+ "implementation": self.implementation,
70
+ "status": self.status,
71
+ "safety_score": self.safety_score,
72
+ "added_at": self.added_at,
73
+ "source": self.source,
74
+ "version": self.version,
75
+ }
76
+
77
+ def __repr__(self):
78
+ return f"<Skill {self.id}: {self.name} [{self.category}] {self.status}>"
79
+
80
+
81
+ # ── Skills Registry ───────────────────────────────────────────────────────────
82
+
83
+ class SkillsRegistry:
84
+ """
85
+ Central registry of all Assistant and swarm skills.
86
+ Persists to JSON. Thread-safe via asyncio lock.
87
+ """
88
+
89
+ # Core skills — pre-loaded, always active
90
+ CORE_SKILLS = [
91
+ {
92
+ "id": "skill_email_read",
93
+ "name": "Email Read",
94
+ "description": "Read and parse Gmail inbox messages",
95
+ "category": "communications",
96
+ "tags": ["gmail", "email", "inbox", "read"],
97
+ "agents": ["assistant", "comms_agent", "briefing_agent"],
98
+ "status": "active",
99
+ "safety_score": 1.0,
100
+ "source": "core",
101
+ },
102
+ {
103
+ "id": "skill_email_send",
104
+ "name": "Email Send",
105
+ "description": "Compose and send emails via Gmail with CC policy enforcement",
106
+ "category": "communications",
107
+ "tags": ["gmail", "email", "send", "draft"],
108
+ "agents": ["assistant", "comms_agent", "seldon_sales"],
109
+ "status": "active",
110
+ "safety_score": 0.9,
111
+ "source": "core",
112
+ },
113
+ {
114
+ "id": "skill_telegram_send",
115
+ "name": "Telegram Send",
116
+ "description": "Send messages to the user via Telegram bot",
117
+ "category": "communications",
118
+ "tags": ["telegram", "message", "notify"],
119
+ "agents": ["assistant", "solomon", "telegram_agent"],
120
+ "status": "active",
121
+ "safety_score": 1.0,
122
+ "source": "core",
123
+ },
124
+ {
125
+ "id": "skill_imessage",
126
+ "name": "iMessage",
127
+ "description": "Send and read iMessages via native macOS AppleScript",
128
+ "category": "communications",
129
+ "tags": ["imessage", "sms", "apple"],
130
+ "agents": ["assistant", "comms_agent"],
131
+ "status": "active",
132
+ "safety_score": 0.95,
133
+ "source": "core",
134
+ },
135
+ {
136
+ "id": "skill_calendar_read",
137
+ "name": "Calendar Read",
138
+ "description": "Read Google Calendar events for the user",
139
+ "category": "scheduling",
140
+ "tags": ["calendar", "events", "schedule"],
141
+ "agents": ["assistant", "personal_assistant"],
142
+ "status": "active",
143
+ "safety_score": 1.0,
144
+ "source": "core",
145
+ },
146
+ {
147
+ "id": "skill_calendar_create",
148
+ "name": "Calendar Create",
149
+ "description": "Create Google Calendar events with attendees",
150
+ "category": "scheduling",
151
+ "tags": ["calendar", "event", "create", "invite"],
152
+ "agents": ["assistant", "personal_assistant"],
153
+ "status": "active",
154
+ "safety_score": 0.95,
155
+ "source": "core",
156
+ },
157
+ {
158
+ "id": "skill_bash_execute",
159
+ "name": "Bash Execute",
160
+ "description": "Execute shell commands on the local macOS system",
161
+ "category": "system",
162
+ "tags": ["bash", "shell", "execute", "system"],
163
+ "agents": ["assistant", "code_specialist", "infra_agent", "security_agent"],
164
+ "status": "active",
165
+ "safety_score": 0.85,
166
+ "source": "core",
167
+ },
168
+ {
169
+ "id": "skill_file_read",
170
+ "name": "File Read",
171
+ "description": "Read any file from the local filesystem",
172
+ "category": "system",
173
+ "tags": ["file", "read", "filesystem"],
174
+ "agents": ["*"],
175
+ "status": "active",
176
+ "safety_score": 1.0,
177
+ "source": "core",
178
+ },
179
+ {
180
+ "id": "skill_file_write",
181
+ "name": "File Write",
182
+ "description": "Write and create files on the local filesystem",
183
+ "category": "system",
184
+ "tags": ["file", "write", "create", "filesystem"],
185
+ "agents": ["*"],
186
+ "status": "active",
187
+ "safety_score": 0.95,
188
+ "source": "core",
189
+ },
190
+ {
191
+ "id": "skill_supabase_query",
192
+ "name": "Supabase Query",
193
+ "description": "Query HyperClaw Supabase database tables",
194
+ "category": "data",
195
+ "tags": ["supabase", "database", "query", "sql"],
196
+ "agents": ["assistant", "db_agent", "memory_agent", "ledger"],
197
+ "status": "active",
198
+ "safety_score": 0.95,
199
+ "source": "core",
200
+ },
201
+ {
202
+ "id": "skill_memory_store",
203
+ "name": "Memory Store",
204
+ "description": "Store episodic memories in Supabase for long-term persistence",
205
+ "category": "memory",
206
+ "tags": ["memory", "memory_store", "store", "persist"],
207
+ "agents": ["*"],
208
+ "status": "active",
209
+ "safety_score": 1.0,
210
+ "source": "core",
211
+ },
212
+ {
213
+ "id": "skill_web_search",
214
+ "name": "Web Research",
215
+ "description": "Search the web and retrieve live information via bash/curl",
216
+ "category": "research",
217
+ "tags": ["web", "search", "research", "internet"],
218
+ "agents": ["assistant", "intel_agent", "nexus_strategy", "core_reasoner"],
219
+ "status": "active",
220
+ "safety_score": 0.9,
221
+ "source": "core",
222
+ },
223
+ {
224
+ "id": "skill_swarm_dispatch",
225
+ "name": "Swarm Dispatch",
226
+ "description": "Route tasks to specialist agents in the HyperSwarm",
227
+ "category": "orchestration",
228
+ "tags": ["swarm", "dispatch", "route", "delegate"],
229
+ "agents": ["assistant", "solomon"],
230
+ "status": "active",
231
+ "safety_score": 1.0,
232
+ "source": "core",
233
+ },
234
+ {
235
+ "id": "skill_trading_monitor",
236
+ "name": "Trading Monitor",
237
+ "description": "Monitor ATLAS_TRADING trading positions and P&L on Hyperliquid",
238
+ "category": "trading",
239
+ "tags": ["trading", "trading", "hyperliquid", "pnl"],
240
+ "agents": ["trading_agent", "assistant"],
241
+ "status": "active",
242
+ "safety_score": 0.9,
243
+ "source": "core",
244
+ },
245
+ {
246
+ "id": "skill_elevenlabs_tts",
247
+ "name": "ElevenLabs TTS",
248
+ "description": "Convert text to speech using ElevenLabs George voice",
249
+ "category": "voice",
250
+ "tags": ["tts", "voice", "audio", "elevenlabs", "george"],
251
+ "agents": ["voice_agent", "assistant"],
252
+ "status": "active",
253
+ "safety_score": 1.0,
254
+ "source": "core",
255
+ },
256
+ {
257
+ "id": "skill_runway_video",
258
+ "name": "Runway Video Generation",
259
+ "description": "Generate video content via Runway ML API (350 credits)",
260
+ "category": "creative",
261
+ "tags": ["runway", "video", "generate", "ai", "creative"],
262
+ "agents": ["video_agent", "creative_agent"],
263
+ "status": "active",
264
+ "safety_score": 1.0,
265
+ "source": "core",
266
+ },
267
+ {
268
+ "id": "skill_news_feed",
269
+ "name": "News Intelligence Feed",
270
+ "description": "Parse 60+ global news sources for intelligence relevant to the organization",
271
+ "category": "intelligence",
272
+ "tags": ["news", "feed", "intelligence", "global"],
273
+ "agents": ["intel_agent", "briefing_agent"],
274
+ "status": "active",
275
+ "safety_score": 1.0,
276
+ "source": "core",
277
+ },
278
+ {
279
+ "id": "skill_document_analysis",
280
+ "name": "Document Analysis",
281
+ "description": "Read, parse, and extract insights from PDFs, docs, and text files",
282
+ "category": "analysis",
283
+ "tags": ["document", "pdf", "parse", "extract", "analysis"],
284
+ "agents": ["*"],
285
+ "status": "active",
286
+ "safety_score": 1.0,
287
+ "source": "core",
288
+ },
289
+ {
290
+ "id": "skill_code_generation",
291
+ "name": "Code Generation",
292
+ "description": "Write, debug, and deploy production-quality code across languages",
293
+ "category": "technology",
294
+ "tags": ["code", "python", "javascript", "debug", "build"],
295
+ "agents": ["code_specialist", "infra_agent", "assistant"],
296
+ "status": "active",
297
+ "safety_score": 0.9,
298
+ "source": "core",
299
+ },
300
+ {
301
+ "id": "skill_financial_modeling",
302
+ "name": "Financial Modeling",
303
+ "description": "Build P&L models, projections, and financial analysis",
304
+ "category": "finance",
305
+ "tags": ["finance", "model", "projections", "analysis", "pnl"],
306
+ "agents": ["finance_agent", "core_reasoner"],
307
+ "status": "active",
308
+ "safety_score": 1.0,
309
+ "source": "core",
310
+ },
311
+ {
312
+ "id": "skill_contract_review",
313
+ "name": "Contract Review",
314
+ "description": "Review contracts, term sheets, and legal documents for risk flags",
315
+ "category": "legal",
316
+ "tags": ["contract", "legal", "review", "terms"],
317
+ "agents": ["legal_agent"],
318
+ "status": "active",
319
+ "safety_score": 1.0,
320
+ "source": "core",
321
+ },
322
+ {
323
+ "id": "skill_talent_intelligence",
324
+ "name": "Talent Intelligence",
325
+ "description": "Research athletes, entertainers, and talent for talent management roster",
326
+ "category": "talent",
327
+ "tags": ["talent", "athlete", "research", "roster"],
328
+ "agents": ["talent_agent", "talent_ops_agent"],
329
+ "status": "active",
330
+ "safety_score": 1.0,
331
+ "source": "core",
332
+ },
333
+ {
334
+ "id": "skill_brand_strategy",
335
+ "name": "Brand Strategy",
336
+ "description": "Develop brand positioning, narrative, and marketing strategy",
337
+ "category": "marketing",
338
+ "tags": ["brand", "strategy", "marketing", "positioning"],
339
+ "agents": ["creative_agent", "nexus_strategy", "pr_agent"],
340
+ "status": "active",
341
+ "safety_score": 1.0,
342
+ "source": "core",
343
+ },
344
+ {
345
+ "id": "skill_pitch_deck",
346
+ "name": "Pitch Deck Creation",
347
+ "description": "Create investor pitch decks and presentations for the organization",
348
+ "category": "business",
349
+ "tags": ["pitch", "deck", "investor", "presentation"],
350
+ "agents": ["copy_agent", "nexus_strategy", "finance_agent"],
351
+ "status": "active",
352
+ "safety_score": 1.0,
353
+ "source": "core",
354
+ },
355
+ {
356
+ "id": "skill_geopolitical_analysis",
357
+ "name": "Geopolitical Analysis",
358
+ "description": "Analyze geopolitical trends relevant to the organization global expansion",
359
+ "category": "intelligence",
360
+ "tags": ["geopolitics", "global", "analysis", "trends"],
361
+ "agents": ["geo_agent", "intel_agent"],
362
+ "status": "active",
363
+ "safety_score": 1.0,
364
+ "source": "core",
365
+ },
366
+ {
367
+ "id": "skill_crypto_analysis",
368
+ "name": "Crypto & Web3 Analysis",
369
+ "description": "Analyze crypto markets, DeFi protocols, and blockchain opportunities",
370
+ "category": "crypto",
371
+ "tags": ["crypto", "defi", "blockchain", "web3", "analysis"],
372
+ "agents": ["crypto_agent", "trading_agent"],
373
+ "status": "active",
374
+ "safety_score": 0.85,
375
+ "source": "core",
376
+ },
377
+ {
378
+ "id": "skill_space_research",
379
+ "name": "Space Technology Research",
380
+ "description": "Research satellite, CubeSat, and space tech opportunities for the space vertical",
381
+ "category": "scientific",
382
+ "tags": ["space", "satellite", "cubesat", "research"],
383
+ "agents": ["space_agent"],
384
+ "status": "active",
385
+ "safety_score": 1.0,
386
+ "source": "core",
387
+ },
388
+ {
389
+ "id": "skill_health_research",
390
+ "name": "Healthcare Research",
391
+ "description": "Research drug discovery, concierge medicine, and hospital AI for Hyper Health",
392
+ "category": "scientific",
393
+ "tags": ["health", "medical", "drug", "research", "ai"],
394
+ "agents": ["health_research_agent", "health_agent"],
395
+ "status": "active",
396
+ "safety_score": 1.0,
397
+ "source": "core",
398
+ },
399
+ {
400
+ "id": "skill_optimization",
401
+ "name": "System Optimization",
402
+ "description": "Identify and resolve performance bottlenecks across HyperClaw infrastructure",
403
+ "category": "technology",
404
+ "tags": ["optimize", "performance", "system", "audit"],
405
+ "agents": ["optimization_agent", "infra_agent"],
406
+ "status": "active",
407
+ "safety_score": 0.95,
408
+ "source": "core",
409
+ },
410
+ {
411
+ "id": "skill_security_audit",
412
+ "name": "Security Audit",
413
+ "description": "Scan for vulnerabilities, RLS gaps, and security threats across HyperClaw",
414
+ "category": "security",
415
+ "tags": ["security", "audit", "vulnerability", "rls", "threat"],
416
+ "agents": ["security_agent"],
417
+ "status": "active",
418
+ "safety_score": 1.0,
419
+ "source": "core",
420
+ },
421
+ {
422
+ "id": "skill_prediction_market",
423
+ "name": "Prediction Market Analysis",
424
+ "description": "Query and analyze Polymarket prediction markets for strategic intelligence",
425
+ "category": "intelligence",
426
+ "tags": ["polymarket", "prediction", "probability", "forecast"],
427
+ "agents": ["prediction_agent"],
428
+ "status": "active",
429
+ "safety_score": 1.0,
430
+ "source": "core",
431
+ },
432
+ ]
433
+
434
+ def __init__(self):
435
+ self._lock = asyncio.Lock()
436
+ self._skills: dict[str, Skill] = {}
437
+ self._proposals: list[dict] = []
438
+ self._load()
439
+
440
+ def _load(self):
441
+ """Load skills from disk, seeding with core skills."""
442
+ # Load core skills first
443
+ for s in self.CORE_SKILLS:
444
+ s.setdefault("added_at", datetime.now().isoformat())
445
+ s.setdefault("version", "1.0.0")
446
+ skill = Skill(s)
447
+ self._skills[skill.id] = skill
448
+
449
+ # Load persisted skills
450
+ if SKILLS_REGISTRY.exists():
451
+ try:
452
+ data = json.loads(SKILLS_REGISTRY.read_text())
453
+ for s in data.get("skills", []):
454
+ skill = Skill(s)
455
+ self._skills[skill.id] = skill
456
+ except Exception as e:
457
+ logger.error(f"Skills registry load error: {e}")
458
+
459
+ # Load proposals
460
+ if SKILLS_PROPOSALS.exists():
461
+ try:
462
+ data = json.loads(SKILLS_PROPOSALS.read_text())
463
+ self._proposals = data.get("proposals", [])
464
+ except Exception:
465
+ self._proposals = []
466
+
467
+ logger.info(f"Skills loaded: {len(self._skills)} active, {len(self._proposals)} proposed")
468
+
469
+ @training_sink("skills.save")
470
+ def _save(self):
471
+ """Persist skills to disk."""
472
+ try:
473
+ data = {"skills": [s.to_dict() for s in self._skills.values()
474
+ if s.source != "core"]}
475
+ SKILLS_REGISTRY.write_text(json.dumps(data, indent=2))
476
+
477
+ prop_data = {"proposals": self._proposals}
478
+ SKILLS_PROPOSALS.write_text(json.dumps(prop_data, indent=2))
479
+ except Exception as e:
480
+ logger.error(f"Skills save error: {e}")
481
+
482
+ def get(self, skill_id: str) -> Optional[Skill]:
483
+ return self._skills.get(skill_id)
484
+
485
+ def list_all(self, status: str = None, category: str = None) -> list[Skill]:
486
+ skills = list(self._skills.values())
487
+ if status:
488
+ skills = [s for s in skills if s.status == status]
489
+ if category:
490
+ skills = [s for s in skills if s.category == category]
491
+ return skills
492
+
493
+ def list_for_agent(self, agent_id: str) -> list[Skill]:
494
+ """Return all active skills available to a given agent."""
495
+ return [
496
+ s for s in self._skills.values()
497
+ if s.status == "active" and (
498
+ "*" in s.agents or agent_id in s.agents
499
+ )
500
+ ]
501
+
502
+ @training_sink("skills.add_skill")
503
+ async def add_skill(self, skill_data: dict, source: str = "genesis") -> Skill:
504
+ """Add a new skill (post safety audit)."""
505
+ async with self._lock:
506
+ skill_data["source"] = source
507
+ skill_data["added_at"] = datetime.now().isoformat()
508
+ skill_data.setdefault("version", "1.0.0")
509
+ skill_data.setdefault("status", "active")
510
+ skill = Skill(skill_data)
511
+ self._skills[skill.id] = skill
512
+ self._save()
513
+ logger.info(f"Skill added: {skill.id} ({skill.name}) from {source}")
514
+ return skill
515
+
516
+ @training_sink("skills.propose_skill")
517
+ async def propose_skill(self, proposal: dict) -> str:
518
+ """GENESIS submits a skill proposal for audit."""
519
+ async with self._lock:
520
+ proposal["proposed_at"] = datetime.now().isoformat()
521
+ proposal["status"] = "proposed"
522
+ proposal_id = hashlib.md5(
523
+ (proposal.get("name", "") + proposal.get("proposed_at", "")).encode()
524
+ ).hexdigest()[:8]
525
+ proposal["proposal_id"] = proposal_id
526
+ self._proposals.append(proposal)
527
+ self._save()
528
+ logger.info(f"Skill proposed: {proposal.get('name')} (ID: {proposal_id})")
529
+ return proposal_id
530
+
531
+ def get_proposals(self) -> list[dict]:
532
+ return self._proposals
533
+
534
+ def status_summary(self) -> dict:
535
+ by_cat = {}
536
+ for s in self._skills.values():
537
+ cat = s.category
538
+ by_cat[cat] = by_cat.get(cat, 0) + 1
539
+ return {
540
+ "total_skills": len(self._skills),
541
+ "active": len([s for s in self._skills.values() if s.status == "active"]),
542
+ "proposed": len(self._proposals),
543
+ "by_category": by_cat,
544
+ }
545
+
546
+
547
+ # ── GENESIS — Capability Scout ─────────────────────────────────────────────────
548
+
549
+ class GenesisScout:
550
+ """
551
+ GENESIS capability scout.
552
+ Continuously monitors the swarm for capability gaps and proposes new skills.
553
+ Runs as a background task — reports findings to Assistant via the scheduler.
554
+
555
+ the user's directive: "Always have your scouts, agents look for new skills
556
+ that will improve your overall capability."
557
+ """
558
+
559
+ DISCOVERY_PROMPT = """You are GENESIS — the HyperClaw self-expansion engine.
560
+
561
+ Your mission: Identify capability gaps in the current AI agent swarm and propose NEW SKILLS
562
+ that would meaningfully improve Assistant and the team's ability to serve the user.
563
+
564
+ Current swarm has {agent_count} agents across these domains: {domains}
565
+
566
+ Current skill categories: {categories}
567
+
568
+ Consider:
569
+ 1. What tasks come up repeatedly that could be automated?
570
+ 2. What external APIs or data sources would improve intelligence quality?
571
+ 3. What workflows are manual that could become agent skills?
572
+ 4. What capabilities do world-class executive AI systems have that we lack?
573
+ 5. What would specifically help the organization (hospitality AI) and talent management?
574
+
575
+ Generate exactly 5 NEW SKILL PROPOSALS in this JSON format:
576
+ {{
577
+ "proposals": [
578
+ {{
579
+ "id": "skill_unique_id",
580
+ "name": "Skill Name",
581
+ "description": "What it does in 1-2 sentences",
582
+ "category": "category",
583
+ "tags": ["tag1", "tag2"],
584
+ "agents": ["agent_id_1", "agent_id_2"],
585
+ "implementation": "How it would be implemented (tool, API, or capability)",
586
+ "why_valuable": "Why this improves Assistant's capability specifically",
587
+ "safety_score": 0.95
588
+ }}
589
+ ]
590
+ }}
591
+
592
+ Focus on skills that are:
593
+ - SAFE (no data exfiltration, no unauthorized external actions)
594
+ - PRACTICAL (can be implemented within HyperClaw's infrastructure)
595
+ - HIGH-VALUE (meaningfully improves the user's AI executive system)
596
+
597
+ Current context: {context}
598
+ """
599
+
600
+ def __init__(self, registry: SkillsRegistry):
601
+ self.registry = registry
602
+ from hyperclaw.cost_guard import guard_client
603
+ self.client = guard_client(
604
+ anthropic.Anthropic(api_key=os.environ.get("ANTHROPIC_API_KEY", "")), "anthropic")
605
+ self._last_scan = None
606
+
607
+ @training_sink("skills.genesis_scan")
608
+ async def scan(self, swarm_status: dict = None) -> list[dict]:
609
+ """
610
+ Run a capability scan. Propose new skills.
611
+ Returns list of proposals submitted.
612
+ """
613
+ logger.info("GENESIS: Running capability scan...")
614
+
615
+ # Build context
616
+ agent_count = swarm_status.get("total_agents", 56) if swarm_status else 56
617
+ domains = list(swarm_status.get("domains", {}).keys()) if swarm_status else []
618
+ current_skills = self.registry.list_all(status="active")
619
+ categories = list(set(s.category for s in current_skills))
620
+
621
+ # Build context summary
622
+ context = f"""
623
+ - the organization: GTM planning, revenue targets, product suite, sales pipeline
624
+ - talent management: signed roster, revenue stage, fundraising status
625
+ - ATLAS_TRADING: Live trading on Hyperliquid (balance and positions read live from the exchange)
626
+ - Infrastructure: macOS + FastAPI + Supabase + Telegram + Gmail + ElevenLabs + Runway ML
627
+ - Current tools: email, calendar, iMessage, bash, file I/O, Supabase, Telegram, ElevenLabs TTS, Runway video
628
+ - Gap areas: WhatsApp API, LinkedIn intelligence, Polymarket live data, space-sector intel, sports analytics
629
+ """
630
+ prompt = self.DISCOVERY_PROMPT.format(
631
+ agent_count=agent_count,
632
+ domains=", ".join(domains) if domains else "executive, business, comms, personal, scientific, technology, creative, talent, recursive",
633
+ categories=", ".join(categories),
634
+ context=context,
635
+ )
636
+
637
+ try:
638
+ response = await asyncio.to_thread(
639
+ self.client.messages.create,
640
+ model="claude-haiku-3-5", # Fast + cheap for discovery
641
+ max_tokens=max_output("genesis", "anthropic", "claude-haiku-3-5"),
642
+ system="You are GENESIS, HyperClaw's self-expansion engine. Output valid JSON only. No markdown, no explanation.",
643
+ messages=[{"role": "user", "content": prompt}],
644
+ )
645
+
646
+ raw = extract_text(response)
647
+ # Clean up any markdown code blocks
648
+ if raw.startswith("```"):
649
+ raw = raw.split("```")[1]
650
+ if raw.startswith("json"):
651
+ raw = raw[4:]
652
+ raw = raw.strip()
653
+
654
+ data = json.loads(raw)
655
+ proposals = data.get("proposals", [])
656
+
657
+ submitted = []
658
+ for proposal in proposals:
659
+ # Safety gate: reject low safety scores
660
+ if proposal.get("safety_score", 0) < 0.7:
661
+ logger.warning(f"GENESIS: Rejected unsafe skill proposal: {proposal.get('name')}")
662
+ continue
663
+
664
+ proposal_id = await self.registry.propose_skill(proposal)
665
+ submitted.append({**proposal, "proposal_id": proposal_id})
666
+ logger.info(f"GENESIS: Proposed skill '{proposal.get('name')}' (ID: {proposal_id})")
667
+
668
+ self._last_scan = datetime.now().isoformat()
669
+ return submitted
670
+
671
+ except json.JSONDecodeError as e:
672
+ logger.error(f"GENESIS: JSON parse error: {e}")
673
+ return []
674
+ except Exception as e:
675
+ logger.error(f"GENESIS: Scan error: {e}")
676
+ return []
677
+
678
+ @training_sink("skills.genesis_auto_activate")
679
+ async def auto_activate_safe_proposals(self) -> list[Skill]:
680
+ """
681
+ Auto-activate proposals with safety_score >= 0.95.
682
+ Lower scores are held for the user's approval.
683
+ """
684
+ proposals = self.registry.get_proposals()
685
+ activated = []
686
+
687
+ for proposal in proposals:
688
+ if proposal.get("status") == "proposed" and proposal.get("safety_score", 0) >= 0.95:
689
+ skill = await self.registry.add_skill(proposal, source="genesis")
690
+ proposal["status"] = "activated"
691
+ activated.append(skill)
692
+ logger.info(f"GENESIS: Auto-activated skill: {skill.name}")
693
+
694
+ if activated:
695
+ self.registry._save()
696
+
697
+ return activated
698
+
699
+
700
+ # ── Singletons ────────────────────────────────────────────────────────────────
701
+
702
+ _registry: Optional[SkillsRegistry] = None
703
+ _genesis: Optional[GenesisScout] = None
704
+
705
+
706
+ def get_skills_registry() -> SkillsRegistry:
707
+ global _registry
708
+ if _registry is None:
709
+ _registry = SkillsRegistry()
710
+ return _registry
711
+
712
+
713
+ def get_genesis_scout() -> GenesisScout:
714
+ global _genesis
715
+ if _genesis is None:
716
+ _genesis = GenesisScout(get_skills_registry())
717
+ return _genesis