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.
- agents/__init__.py +31 -0
- agents/background_monitor.py +453 -0
- agents/learning.py +460 -0
- agents/planner.py +421 -0
- agents/transcriber.py +341 -0
- civilization/__init__.py +51 -0
- civilization/api/__init__.py +7 -0
- civilization/api/civilization_api.py +361 -0
- civilization/graph/__init__.py +19 -0
- civilization/graph/knowledge_linker.py +348 -0
- civilization/graph/org_graph.py +348 -0
- civilization/graph/process_graph.py +386 -0
- civilization/ingestion/__init__.py +20 -0
- civilization/ingestion/chunker.py +273 -0
- civilization/ingestion/document_ingestor.py +358 -0
- civilization/ingestion/embedder.py +262 -0
- civilization/ingestion/extractor.py +224 -0
- civilization/interview/__init__.py +19 -0
- civilization/interview/gap_detector.py +380 -0
- civilization/interview/interviewer.py +323 -0
- civilization/interview/questioner.py +363 -0
- civilization/retrieval/__init__.py +17 -0
- civilization/retrieval/civilization_rag.py +316 -0
- civilization/retrieval/context_injector.py +342 -0
- civilization/retrieval/relevance_ranker.py +287 -0
- civilization/schema.py +299 -0
- civilization/store.py +177 -0
- civilization/sync/__init__.py +16 -0
- civilization/sync/confluence_sync.py +317 -0
- civilization/sync/gdrive_sync.py +262 -0
- civilization/sync/notion_sync.py +237 -0
- civilization/versioning/__init__.py +19 -0
- civilization/versioning/diff_engine.py +351 -0
- civilization/versioning/staleness_detector.py +303 -0
- civilization/versioning/version_manager.py +293 -0
- cli/__init__.py +1 -0
- cli/doctor.py +334 -0
- cli/hyperclaw.py +1357 -0
- cli/onboarding.py +469 -0
- core/__init__.py +1 -0
- core/connectors/__init__.py +119 -0
- core/connectors/infrastructure.py +772 -0
- core/connectors/messaging.py +586 -0
- core/connectors/productivity.py +764 -0
- core/connectors/smarthome.py +528 -0
- core/connectors/social.py +730 -0
- core/hyperrouter/__init__.py +23 -0
- core/hyperrouter/bandit.py +218 -0
- core/hyperrouter/fast_loop.py +68 -0
- core/hyperrouter/slow_loop.py +143 -0
- core/hyperstate/__init__.py +24 -0
- core/hyperstate/certifier.py +154 -0
- core/hyperstate/schema.py +160 -0
- core/hyperstate/state_manager.py +103 -0
- core/hyperstate/store.py +163 -0
- core/providers/__init__.py +121 -0
- core/providers/embeddings.py +389 -0
- core/providers/image.py +534 -0
- core/providers/llm.py +1935 -0
- core/providers/search.py +608 -0
- core/providers/voice.py +474 -0
- hyperagents-1.2.3rc5.post3.dist-info/METADATA +469 -0
- hyperagents-1.2.3rc5.post3.dist-info/RECORD +361 -0
- hyperagents-1.2.3rc5.post3.dist-info/WHEEL +5 -0
- hyperagents-1.2.3rc5.post3.dist-info/entry_points.txt +6 -0
- hyperagents-1.2.3rc5.post3.dist-info/licenses/LICENSE +21 -0
- hyperagents-1.2.3rc5.post3.dist-info/top_level.txt +13 -0
- hyperclaw/__init__.py +67 -0
- hyperclaw/__main__.py +220 -0
- hyperclaw/agent.py +775 -0
- hyperclaw/agent_coordinator.py +577 -0
- hyperclaw/anthropic_params.py +225 -0
- hyperclaw/api_utils.py +85 -0
- hyperclaw/approval_telegram.py +209 -0
- hyperclaw/approval_terminal.py +80 -0
- hyperclaw/attachments.py +177 -0
- hyperclaw/branding.py +55 -0
- hyperclaw/brief/__init__.py +11 -0
- hyperclaw/brief/cli.py +204 -0
- hyperclaw/brief/collect.py +146 -0
- hyperclaw/brief/compose.py +333 -0
- hyperclaw/brief/diff.py +110 -0
- hyperclaw/brief/errors.py +99 -0
- hyperclaw/brief/google.py +269 -0
- hyperclaw/brief/google_auth.py +294 -0
- hyperclaw/brief/links.py +124 -0
- hyperclaw/brief/service.py +424 -0
- hyperclaw/brief/store.py +205 -0
- hyperclaw/brief/tasks.py +200 -0
- hyperclaw/chat_scope.py +115 -0
- hyperclaw/cli_tui.py +497 -0
- hyperclaw/client_guard.py +717 -0
- hyperclaw/connection_check.py +113 -0
- hyperclaw/cost_guard.py +1728 -0
- hyperclaw/default_config/agents.yaml +534 -0
- hyperclaw/default_config/hyperclaw.yaml +27 -0
- hyperclaw/default_config/models.yaml +161 -0
- hyperclaw/deployment.py +39 -0
- hyperclaw/digest/__init__.py +9 -0
- hyperclaw/digest/cli.py +117 -0
- hyperclaw/digest/errors.py +100 -0
- hyperclaw/digest/gitlab.py +187 -0
- hyperclaw/digest/http.py +113 -0
- hyperclaw/digest/redact.py +32 -0
- hyperclaw/digest/service.py +271 -0
- hyperclaw/digest/slack.py +223 -0
- hyperclaw/digest/state.py +124 -0
- hyperclaw/digest/summarize.py +198 -0
- hyperclaw/digest/tokens.py +143 -0
- hyperclaw/distribution.py +46 -0
- hyperclaw/documents.py +351 -0
- hyperclaw/feeds.py +339 -0
- hyperclaw/google_workspace/__init__.py +5 -0
- hyperclaw/google_workspace/api.py +151 -0
- hyperclaw/google_workspace/auth.py +397 -0
- hyperclaw/google_workspace/calendar.py +157 -0
- hyperclaw/google_workspace/cli.py +72 -0
- hyperclaw/google_workspace/drive.py +236 -0
- hyperclaw/google_workspace/errors.py +58 -0
- hyperclaw/google_workspace/gmail.py +295 -0
- hyperclaw/google_workspace/meet.py +122 -0
- hyperclaw/google_workspace/tools.py +319 -0
- hyperclaw/hyperspeed.py +57 -0
- hyperclaw/integrations_layer.py +1427 -0
- hyperclaw/live_state.py +188 -0
- hyperclaw/managed_config.py +245 -0
- hyperclaw/media_hub.py +179 -0
- hyperclaw/memory_manager.py +584 -0
- hyperclaw/model_catalog.py +551 -0
- hyperclaw/model_policy.py +211 -0
- hyperclaw/model_router.py +595 -0
- hyperclaw/model_selector.py +72 -0
- hyperclaw/naming.py +284 -0
- hyperclaw/notices.py +65 -0
- hyperclaw/oai_stream.py +106 -0
- hyperclaw/orchestrator.py +591 -0
- hyperclaw/outbox.py +82 -0
- hyperclaw/persona.py +367 -0
- hyperclaw/prometheus.py +219 -0
- hyperclaw/prompt_assembly.py +157 -0
- hyperclaw/provider_setup.py +146 -0
- hyperclaw/providers.py +340 -0
- hyperclaw/qualification.py +341 -0
- hyperclaw/qualification_keys/hyper-d292fd127cef5a3e.pub +1 -0
- hyperclaw/qualification_records/anthropic--claude-sonnet-5-5.json +14 -0
- hyperclaw/reasoning_display.py +35 -0
- hyperclaw/scheduler.py +454 -0
- hyperclaw/server.py +847 -0
- hyperclaw/setup.py +627 -0
- hyperclaw/skills.py +717 -0
- hyperclaw/solomon.py +442 -0
- hyperclaw/swarm.py +533 -0
- hyperclaw/taint.py +832 -0
- hyperclaw/team/__init__.py +28 -0
- hyperclaw/team/dispatcher.py +431 -0
- hyperclaw/team/genesis.py +106 -0
- hyperclaw/team/lead.py +110 -0
- hyperclaw/team/model.py +135 -0
- hyperclaw/team/morning.py +238 -0
- hyperclaw/team/repos.py +66 -0
- hyperclaw/team/roster.py +264 -0
- hyperclaw/team/specialist.py +235 -0
- hyperclaw/team/status.py +163 -0
- hyperclaw/team/watchers.py +112 -0
- hyperclaw/teamsetup/__init__.py +17 -0
- hyperclaw/teamsetup/checks.py +208 -0
- hyperclaw/teamsetup/item.py +391 -0
- hyperclaw/teamsetup/oauth_loopback.py +84 -0
- hyperclaw/teamsetup/onboard.py +550 -0
- hyperclaw/teamsetup/profile.py +82 -0
- hyperclaw/teamsetup/secrets.py +313 -0
- hyperclaw/teamsetup/selfcheck.py +295 -0
- hyperclaw/teamsetup/service.py +495 -0
- hyperclaw/teamsetup/slack_oauth.py +442 -0
- hyperclaw/teamsetup/tty.py +62 -0
- hyperclaw/telegram_bot.py +1106 -0
- hyperclaw/telegram_intake.py +126 -0
- hyperclaw/telegram_pairing.py +360 -0
- hyperclaw/terminal_provider.py +323 -0
- hyperclaw/tools/__init__.py +1 -0
- hyperclaw/tools/approval.py +949 -0
- hyperclaw/tools/args.py +212 -0
- hyperclaw/tools/catalog.py +244 -0
- hyperclaw/tools/classify.py +266 -0
- hyperclaw/tools/effects.py +724 -0
- hyperclaw/tools/egress.py +210 -0
- hyperclaw/tools/envelope.py +188 -0
- hyperclaw/tools/guard.py +367 -0
- hyperclaw/tools/ledger.py +339 -0
- hyperclaw/tools/receipts.py +70 -0
- hyperclaw/tools/registry.py +318 -0
- hyperclaw/tools/service_guard.py +151 -0
- hyperclaw/tools/surfaces.py +54 -0
- hyperclaw/tools/workspace.py +87 -0
- hyperclaw/trading/__init__.py +77 -0
- hyperclaw/truth_guard.py +791 -0
- hyperclaw/tts.py +124 -0
- hyperclaw/tui.py +4255 -0
- hyperclaw/tui_bridge.py +938 -0
- hyperclaw/unattended.py +60 -0
- hyperclaw/updates/__init__.py +54 -0
- hyperclaw/updates/check.py +131 -0
- hyperclaw/updates/index.py +178 -0
- hyperclaw/updates/install.py +110 -0
- hyperclaw/updates/managed.py +161 -0
- hyperclaw/updates/manifest.py +138 -0
- hyperclaw/updates/notices.py +86 -0
- hyperclaw/updates/paths.py +53 -0
- hyperclaw/updates/release.py +146 -0
- hyperclaw/updates/upgrade.py +253 -0
- hyperclaw/updates/versioning.py +104 -0
- hyperclaw/userconfig.py +119 -0
- hyperclaw/xai.py +83 -0
- integrations/__init__.py +31 -0
- integrations/automation/__init__.py +1 -0
- integrations/automation/make.py +87 -0
- integrations/automation/zapier.py +87 -0
- integrations/base.py +476 -0
- integrations/communication/__init__.py +1 -0
- integrations/communication/twilio.py +279 -0
- integrations/communication/zoom.py +290 -0
- integrations/data/__init__.py +1 -0
- integrations/data/google_analytics.py +135 -0
- integrations/data/postgres.py +182 -0
- integrations/data/supabase_connector.py +202 -0
- integrations/data/weather_feeds.py +450 -0
- integrations/developer/__init__.py +9 -0
- integrations/developer/github.py +406 -0
- integrations/developer/gitlab.py +298 -0
- integrations/enterprise/__init__.py +13 -0
- integrations/enterprise/confluence.py +266 -0
- integrations/enterprise/hubspot.py +293 -0
- integrations/enterprise/jira.py +314 -0
- integrations/enterprise/salesforce.py +286 -0
- integrations/finance/__init__.py +1 -0
- integrations/finance/polymarket_client.py +247 -0
- integrations/finance/quickbooks.py +281 -0
- integrations/finance/stripe.py +261 -0
- integrations/gateway.py +238 -0
- integrations/messaging/__init__.py +32 -0
- integrations/messaging/discord.py +159 -0
- integrations/messaging/email.py +401 -0
- integrations/messaging/imessage.py +443 -0
- integrations/messaging/signal.py +175 -0
- integrations/messaging/slack.py +217 -0
- integrations/messaging/sms.py +175 -0
- integrations/messaging/teams.py +208 -0
- integrations/messaging/telegram.py +260 -0
- integrations/messaging/whatsapp.py +203 -0
- integrations/productivity/__init__.py +17 -0
- integrations/productivity/airtable.py +217 -0
- integrations/productivity/asana.py +248 -0
- integrations/productivity/google/__init__.py +19 -0
- integrations/productivity/google/base.py +89 -0
- integrations/productivity/google/calendar.py +272 -0
- integrations/productivity/google/docs.py +202 -0
- integrations/productivity/google/drive.py +268 -0
- integrations/productivity/google/gmail.py +279 -0
- integrations/productivity/google/meet.py +218 -0
- integrations/productivity/google/sheets.py +222 -0
- integrations/productivity/google/tasks.py +199 -0
- integrations/productivity/linear.py +279 -0
- integrations/productivity/microsoft/__init__.py +13 -0
- integrations/productivity/microsoft/base.py +93 -0
- integrations/productivity/microsoft/calendar.py +207 -0
- integrations/productivity/microsoft/onedrive.py +222 -0
- integrations/productivity/microsoft/outlook.py +241 -0
- integrations/productivity/microsoft/sharepoint.py +211 -0
- integrations/productivity/notion.py +243 -0
- integrations/productivity/todoist.py +250 -0
- integrations/productivity/trello.py +244 -0
- integrations/storage/__init__.py +1 -0
- integrations/storage/box.py +279 -0
- integrations/storage/dropbox.py +215 -0
- integrations/telegram_inbound.py +179 -0
- integrations/telegram_poller.py +151 -0
- memory/__init__.py +1 -0
- memory/causal_graph.py +125 -0
- memory/impact_tracker.py +88 -0
- memory/vector_memory.py +436 -0
- models/__init__.py +12 -0
- models/chatjimmy_client.py +210 -0
- models/claude_client.py +235 -0
- models/claude_code_subagent.py +192 -0
- models/openai_client.py +120 -0
- models/router.py +162 -0
- recursive/discovery_loop.py +118 -0
- recursive/optimization_loop.py +135 -0
- recursive/validation_loop.py +38 -0
- security/__init__.py +1 -0
- security/audit_logger.py +106 -0
- security/filesystem_guard.py +100 -0
- security/hypershield.py +99 -0
- security/network_guard.py +97 -0
- security/policy_engine.py +198 -0
- swarm/__init__.py +1 -0
- swarm/agents/__init__.py +0 -0
- swarm/agents/base.py +230 -0
- swarm/agents/business/__init__.py +0 -0
- swarm/agents/business/counsel.py +31 -0
- swarm/agents/business/herald.py +32 -0
- swarm/agents/business/ledger.py +26 -0
- swarm/agents/business/nexus.py +30 -0
- swarm/agents/business/ops.py +30 -0
- swarm/agents/business/pipeline.py +28 -0
- swarm/agents/business/revenue.py +30 -0
- swarm/agents/business/sovereign.py +31 -0
- swarm/agents/business/strategos.py +27 -0
- swarm/agents/business/talent.py +27 -0
- swarm/agents/business/venture.py +32 -0
- swarm/agents/comms/__init__.py +1 -0
- swarm/agents/comms/cipher.py +32 -0
- swarm/agents/comms/echo_comms.py +31 -0
- swarm/agents/comms/envoy.py +31 -0
- swarm/agents/comms/herald_scheduler.py +33 -0
- swarm/agents/comms/pulse.py +29 -0
- swarm/agents/creative/__init__.py +0 -0
- swarm/agents/creative/author.py +27 -0
- swarm/agents/creative/lens.py +25 -0
- swarm/agents/executive/__init__.py +1 -0
- swarm/agents/intelligence/__init__.py +1 -0
- swarm/agents/intelligence/arbiter.py +30 -0
- swarm/agents/intelligence/sentinel.py +30 -0
- swarm/agents/media/__init__.py +0 -0
- swarm/agents/personal/__init__.py +0 -0
- swarm/agents/personal/atlas.py +27 -0
- swarm/agents/personal/hearth.py +26 -0
- swarm/agents/personal/midas.py +27 -0
- swarm/agents/personal/navigator.py +27 -0
- swarm/agents/personal/nourish.py +31 -0
- swarm/agents/personal/vitals.py +33 -0
- swarm/agents/recursive/__init__.py +0 -0
- swarm/agents/recursive/alchemist.py +73 -0
- swarm/agents/recursive/calibrator.py +45 -0
- swarm/agents/recursive/scout.py +97 -0
- swarm/agents/scientific/__init__.py +0 -0
- swarm/agents/scientific/cosmos.py +36 -0
- swarm/agents/scientific/gaia.py +26 -0
- swarm/agents/scientific/medicus.py +33 -0
- swarm/agents/scientific/oracle_agent.py +39 -0
- swarm/agents/scientific/scribe.py +39 -0
- swarm/agents/talent/__init__.py +0 -0
- swarm/agents/talent/deal.py +28 -0
- swarm/agents/talent/roster.py +29 -0
- swarm/agents/talent/scout.py +29 -0
- swarm/agents/talent/stage.py +27 -0
- swarm/agents/tech/__init__.py +0 -0
- swarm/agents/tech/aegis.py +28 -0
- swarm/agents/tech/bridge.py +28 -0
- swarm/agents/tech/forge.py +28 -0
- swarm/agents/trading/__init__.py +1 -0
- swarm/agents/trading/global_prediction_engine.py +611 -0
- swarm/agents/trading/polymarket_trader.py +165 -0
- swarm/agents/trading/prediction_strategist.py +218 -0
- swarm/autogen_bridge.py +68 -0
- swarm/bid_protocol.py +196 -0
- swarm/dispatcher.py +527 -0
- swarm/nexus.py +181 -0
- swarm/registry.py +112 -0
- telegram_listener.py +403 -0
- 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
|