Full Code of aden-hive/hive for AI

main f0c7470f3d21 cached
1072 files
9.8 MB
2.6M tokens
9257 symbols
1 requests
Copy disabled (too large) Download .txt
Showing preview only (10,517K chars total). Download the full file to get everything.
Repository: aden-hive/hive
Branch: main
Commit: f0c7470f3d21
Files: 1072
Total size: 9.8 MB

Directory structure:
gitextract_4nmquuv5/

├── .claude/
│   ├── settings.json
│   ├── settings.local.json.example
│   └── skills/
│       └── triage-issue/
│           └── SKILL.md
├── .cursorrules
├── .dockerignore
├── .editorconfig
├── .gitattributes
├── .github/
│   ├── CODEOWNERS
│   ├── ISSUE_TEMPLATE/
│   │   ├── bug_report.md
│   │   ├── feature_request.md
│   │   ├── integration-bounty.yml
│   │   ├── integration-request.md
│   │   └── standard-bounty.yml
│   ├── PULL_REQUEST_TEMPLATE.md
│   └── workflows/
│       ├── auto-close-duplicates.yml
│       ├── bounty-completed.yml
│       ├── ci.yml
│       ├── claude-issue-triage.yml
│       ├── pr-check-command.yml
│       ├── pr-requirements-backfill.yml
│       ├── pr-requirements-enforce.yml
│       ├── pr-requirements.yml
│       ├── release.yml
│       └── weekly-leaderboard.yml
├── .gitignore
├── .mcp.json
├── .pre-commit-config.yaml
├── .python-version
├── AGENTS.md
├── CHANGELOG.md
├── CONTRIBUTING.md
├── LICENSE
├── Makefile
├── README.md
├── SECURITY.md
├── core/
│   ├── .gitignore
│   ├── .mcp.json
│   ├── MCP_BUILDER_TOOLS_GUIDE.md
│   ├── MCP_INTEGRATION_GUIDE.md
│   ├── MCP_SERVER_GUIDE.md
│   ├── README.md
│   ├── antigravity_auth.py
│   ├── codex_oauth.py
│   ├── examples/
│   │   ├── manual_agent.py
│   │   ├── mcp_integration_example.py
│   │   └── mcp_servers.json
│   ├── framework/
│   │   ├── __init__.py
│   │   ├── __main__.py
│   │   ├── agents/
│   │   │   ├── __init__.py
│   │   │   ├── credential_tester/
│   │   │   │   ├── __init__.py
│   │   │   │   ├── __main__.py
│   │   │   │   ├── agent.py
│   │   │   │   ├── config.py
│   │   │   │   ├── mcp_servers.json
│   │   │   │   └── nodes/
│   │   │   │       └── __init__.py
│   │   │   ├── discovery.py
│   │   │   ├── queen/
│   │   │   │   ├── __init__.py
│   │   │   │   ├── agent.py
│   │   │   │   ├── config.py
│   │   │   │   ├── mcp_servers.json
│   │   │   │   ├── nodes/
│   │   │   │   │   ├── __init__.py
│   │   │   │   │   └── thinking_hook.py
│   │   │   │   ├── queen_memory.py
│   │   │   │   ├── reference/
│   │   │   │   │   ├── anti_patterns.md
│   │   │   │   │   ├── file_templates.md
│   │   │   │   │   ├── framework_guide.md
│   │   │   │   │   ├── gcu_guide.md
│   │   │   │   │   └── queen_memory.md
│   │   │   │   ├── tests/
│   │   │   │   │   ├── __init__.py
│   │   │   │   │   └── conftest.py
│   │   │   │   └── ticket_receiver.py
│   │   │   └── worker_memory.py
│   │   ├── cli.py
│   │   ├── config.py
│   │   ├── credentials/
│   │   │   ├── __init__.py
│   │   │   ├── aden/
│   │   │   │   ├── __init__.py
│   │   │   │   ├── client.py
│   │   │   │   ├── provider.py
│   │   │   │   ├── storage.py
│   │   │   │   └── tests/
│   │   │   │       ├── __init__.py
│   │   │   │       └── test_aden_sync.py
│   │   │   ├── key_storage.py
│   │   │   ├── local/
│   │   │   │   ├── __init__.py
│   │   │   │   ├── models.py
│   │   │   │   └── registry.py
│   │   │   ├── models.py
│   │   │   ├── oauth2/
│   │   │   │   ├── __init__.py
│   │   │   │   ├── base_provider.py
│   │   │   │   ├── hubspot_provider.py
│   │   │   │   ├── lifecycle.py
│   │   │   │   ├── provider.py
│   │   │   │   └── zoho_provider.py
│   │   │   ├── provider.py
│   │   │   ├── setup.py
│   │   │   ├── storage.py
│   │   │   ├── store.py
│   │   │   ├── template.py
│   │   │   ├── tests/
│   │   │   │   ├── __init__.py
│   │   │   │   └── test_credential_store.py
│   │   │   └── validation.py
│   │   ├── debugger/
│   │   │   ├── __init__.py
│   │   │   └── cli.py
│   │   ├── graph/
│   │   │   ├── __init__.py
│   │   │   ├── checkpoint_config.py
│   │   │   ├── client_io.py
│   │   │   ├── context_handoff.py
│   │   │   ├── conversation.py
│   │   │   ├── conversation_judge.py
│   │   │   ├── edge.py
│   │   │   ├── event_loop_node.py
│   │   │   ├── executor.py
│   │   │   ├── files.py
│   │   │   ├── gcu.py
│   │   │   ├── goal.py
│   │   │   ├── node.py
│   │   │   ├── prompt_composer.py
│   │   │   ├── safe_eval.py
│   │   │   └── validator.py
│   │   ├── llm/
│   │   │   ├── __init__.py
│   │   │   ├── anthropic.py
│   │   │   ├── antigravity.py
│   │   │   ├── litellm.py
│   │   │   ├── mock.py
│   │   │   ├── provider.py
│   │   │   └── stream_events.py
│   │   ├── monitoring/
│   │   │   └── __init__.py
│   │   ├── observability/
│   │   │   ├── README.md
│   │   │   ├── __init__.py
│   │   │   └── logging.py
│   │   ├── runner/
│   │   │   ├── __init__.py
│   │   │   ├── cli.py
│   │   │   ├── mcp_client.py
│   │   │   ├── mcp_connection_manager.py
│   │   │   ├── orchestrator.py
│   │   │   ├── preload_validation.py
│   │   │   ├── protocol.py
│   │   │   ├── runner.py
│   │   │   └── tool_registry.py
│   │   ├── runtime/
│   │   │   ├── EVENT_TYPES.md
│   │   │   ├── README.md
│   │   │   ├── RESUMABLE_SESSIONS_DESIGN.md
│   │   │   ├── RUNTIME_LOGGING.md
│   │   │   ├── __init__.py
│   │   │   ├── agent_runtime.py
│   │   │   ├── core.py
│   │   │   ├── escalation_ticket.py
│   │   │   ├── event_bus.py
│   │   │   ├── execution_stream.py
│   │   │   ├── llm_debug_logger.py
│   │   │   ├── outcome_aggregator.py
│   │   │   ├── runtime_log_schemas.py
│   │   │   ├── runtime_log_store.py
│   │   │   ├── runtime_logger.py
│   │   │   ├── shared_state.py
│   │   │   ├── stream_runtime.py
│   │   │   ├── tests/
│   │   │   │   ├── __init__.py
│   │   │   │   ├── test_agent_runtime.py
│   │   │   │   ├── test_runtime_logging_paths.py
│   │   │   │   └── test_webhook_server.py
│   │   │   ├── triggers.py
│   │   │   └── webhook_server.py
│   │   ├── schemas/
│   │   │   ├── __init__.py
│   │   │   ├── checkpoint.py
│   │   │   ├── decision.py
│   │   │   ├── run.py
│   │   │   └── session_state.py
│   │   ├── server/
│   │   │   ├── README.md
│   │   │   ├── __init__.py
│   │   │   ├── app.py
│   │   │   ├── queen_orchestrator.py
│   │   │   ├── routes_credentials.py
│   │   │   ├── routes_events.py
│   │   │   ├── routes_execution.py
│   │   │   ├── routes_graphs.py
│   │   │   ├── routes_logs.py
│   │   │   ├── routes_sessions.py
│   │   │   ├── session_manager.py
│   │   │   ├── sse.py
│   │   │   └── tests/
│   │   │       ├── __init__.py
│   │   │       └── test_api.py
│   │   ├── skills/
│   │   │   ├── __init__.py
│   │   │   ├── _default_skills/
│   │   │   │   ├── batch-ledger/
│   │   │   │   │   └── SKILL.md
│   │   │   │   ├── context-preservation/
│   │   │   │   │   └── SKILL.md
│   │   │   │   ├── error-recovery/
│   │   │   │   │   └── SKILL.md
│   │   │   │   ├── note-taking/
│   │   │   │   │   └── SKILL.md
│   │   │   │   ├── quality-monitor/
│   │   │   │   │   └── SKILL.md
│   │   │   │   └── task-decomposition/
│   │   │   │       └── SKILL.md
│   │   │   ├── catalog.py
│   │   │   ├── cli.py
│   │   │   ├── config.py
│   │   │   ├── defaults.py
│   │   │   ├── discovery.py
│   │   │   ├── manager.py
│   │   │   ├── models.py
│   │   │   ├── parser.py
│   │   │   ├── skill_errors.py
│   │   │   └── trust.py
│   │   ├── storage/
│   │   │   ├── __init__.py
│   │   │   ├── backend.py
│   │   │   ├── checkpoint_store.py
│   │   │   ├── concurrent.py
│   │   │   ├── conversation_store.py
│   │   │   └── session_store.py
│   │   ├── testing/
│   │   │   ├── __init__.py
│   │   │   ├── approval_cli.py
│   │   │   ├── approval_types.py
│   │   │   ├── categorizer.py
│   │   │   ├── cli.py
│   │   │   ├── debug_tool.py
│   │   │   ├── llm_judge.py
│   │   │   ├── prompts.py
│   │   │   ├── test_case.py
│   │   │   ├── test_result.py
│   │   │   └── test_storage.py
│   │   ├── tools/
│   │   │   ├── __init__.py
│   │   │   ├── flowchart_utils.py
│   │   │   ├── queen_lifecycle_tools.py
│   │   │   ├── queen_memory_tools.py
│   │   │   ├── session_graph_tools.py
│   │   │   └── worker_monitoring_tools.py
│   │   └── utils/
│   │       ├── __init__.py
│   │       └── io.py
│   ├── frontend/
│   │   ├── components.json
│   │   ├── index.html
│   │   ├── package.json
│   │   ├── src/
│   │   │   ├── App.tsx
│   │   │   ├── api/
│   │   │   │   ├── agents.ts
│   │   │   │   ├── client.ts
│   │   │   │   ├── credentials.ts
│   │   │   │   ├── execution.ts
│   │   │   │   ├── graphs.ts
│   │   │   │   ├── logs.ts
│   │   │   │   ├── sessions.ts
│   │   │   │   └── types.ts
│   │   │   ├── components/
│   │   │   │   ├── ChatPanel.tsx
│   │   │   │   ├── CredentialsModal.tsx
│   │   │   │   ├── DraftGraph.tsx
│   │   │   │   ├── HistorySidebar.tsx
│   │   │   │   ├── MarkdownContent.tsx
│   │   │   │   ├── MultiQuestionWidget.tsx
│   │   │   │   ├── NodeDetailPanel.tsx
│   │   │   │   ├── ParallelSubagentBubble.tsx
│   │   │   │   ├── QuestionWidget.tsx
│   │   │   │   ├── RunButton.tsx
│   │   │   │   ├── TopBar.tsx
│   │   │   │   └── graph-types.ts
│   │   │   ├── hooks/
│   │   │   │   └── use-sse.ts
│   │   │   ├── index.css
│   │   │   ├── lib/
│   │   │   │   ├── chat-helpers.test.ts
│   │   │   │   ├── chat-helpers.ts
│   │   │   │   ├── graph-converter.test.ts
│   │   │   │   ├── graph-converter.ts
│   │   │   │   ├── graphUtils.ts
│   │   │   │   ├── tab-persistence.ts
│   │   │   │   └── utils.ts
│   │   │   ├── main.tsx
│   │   │   ├── pages/
│   │   │   │   ├── home.tsx
│   │   │   │   ├── my-agents.tsx
│   │   │   │   └── workspace.tsx
│   │   │   └── vite-env.d.ts
│   │   ├── tsconfig.json
│   │   ├── tsconfig.node.json
│   │   └── vite.config.ts
│   ├── pyproject.toml
│   ├── setup_mcp.sh
│   └── tests/
│       ├── __init__.py
│       ├── debug_codex_stream.py
│       ├── debug_codex_verbose.py
│       ├── dummy_agents/
│       │   ├── README.md
│       │   ├── __init__.py
│       │   ├── conftest.py
│       │   ├── nodes.py
│       │   ├── run_all.py
│       │   ├── test_branch.py
│       │   ├── test_echo.py
│       │   ├── test_feedback_loop.py
│       │   ├── test_gcu_subagent.py
│       │   ├── test_parallel_merge.py
│       │   ├── test_pipeline.py
│       │   ├── test_retry.py
│       │   └── test_worker.py
│       ├── test_antigravity_eventloop.py
│       ├── test_check_llm_key_openrouter.py
│       ├── test_cli_entry_point.py
│       ├── test_client_facing_validation.py
│       ├── test_client_io.py
│       ├── test_codex_eventloop.py
│       ├── test_conditional_edge_direct_key.py
│       ├── test_config.py
│       ├── test_context_handoff.py
│       ├── test_continuous_conversation.py
│       ├── test_conversation_judge.py
│       ├── test_credential_bootstrap.py
│       ├── test_default_skills.py
│       ├── test_event_loop_integration.py
│       ├── test_event_loop_node.py
│       ├── test_event_loop_wiring.py
│       ├── test_event_type_extension.py
│       ├── test_execution_quality.py
│       ├── test_execution_stream.py
│       ├── test_executor_feedback_edges.py
│       ├── test_executor_max_retries.py
│       ├── test_fanout.py
│       ├── test_find_json_hardened.py
│       ├── test_flowchart_utils.py
│       ├── test_graph_executor.py
│       ├── test_hallucination_detection.py
│       ├── test_litellm_provider.py
│       ├── test_litellm_streaming.py
│       ├── test_llm_judge.py
│       ├── test_mcp_client.py
│       ├── test_mcp_connection_manager.py
│       ├── test_mcp_server.py
│       ├── test_node_conversation.py
│       ├── test_node_json_performance.py
│       ├── test_on_failure_edges.py
│       ├── test_orchestrator.py
│       ├── test_path_traversal_fix.py
│       ├── test_phase_compaction.py
│       ├── test_pydantic_validation.py
│       ├── test_run.py
│       ├── test_runner_api_key_env_var.py
│       ├── test_runtime.py
│       ├── test_runtime_logger.py
│       ├── test_safe_eval.py
│       ├── test_session_manager_worker_handoff.py
│       ├── test_skill_allowlist.py
│       ├── test_skill_catalog.py
│       ├── test_skill_context_protection.py
│       ├── test_skill_discovery.py
│       ├── test_skill_errors.py
│       ├── test_skill_integration.py
│       ├── test_skill_parser.py
│       ├── test_skill_resources.py
│       ├── test_skill_trust.py
│       ├── test_storage.py
│       ├── test_stream_events.py
│       ├── test_subagent.py
│       ├── test_subagent_escalation_e2e.py
│       ├── test_testing_framework.py
│       ├── test_tool_registry.py
│       ├── test_trigger_fires_into_queen.py
│       ├── test_two_llm_calls.py
│       └── test_validate_agent_path.py
├── docs/
│   ├── CODE_OF_CONDUCT.md
│   ├── Queen Bee Outcome Evaluation - Generation.csv
│   ├── aden-credential-sync.md
│   ├── agent_runtime.md
│   ├── architecture/
│   │   ├── README.md
│   │   └── multi-entry-point-agents.md
│   ├── articles/
│   │   ├── README.md
│   │   ├── aden-vs-autogen.md
│   │   ├── aden-vs-crewai.md
│   │   ├── aden-vs-langchain.md
│   │   ├── ai-agent-cost-management-guide.md
│   │   ├── ai-agent-observability-monitoring.md
│   │   ├── building-production-ai-agents.md
│   │   ├── human-in-the-loop-ai-agents.md
│   │   ├── multi-agent-vs-single-agent-systems.md
│   │   ├── self-improving-vs-static-agents.md
│   │   └── top-10-ai-agent-frameworks-2025.md
│   ├── bounty-program/
│   │   ├── README.md
│   │   ├── contributor-guide.md
│   │   ├── game-master-manual.md
│   │   ├── promotion-checklist.md
│   │   ├── setup-guide.md
│   │   └── templates/
│   │       ├── agent-test-report-template.md
│   │       └── tool-readme-template.md
│   ├── cleanup-plan.md
│   ├── configuration.md
│   ├── contributing-lint-setup.md
│   ├── credential-identity-plan.md
│   ├── credential-store-design.md
│   ├── credential-store-usage.md
│   ├── credential-system-analysis.md
│   ├── developer-guide.md
│   ├── draft-flowchart-schema.md
│   ├── environment-setup.md
│   ├── getting-started.md
│   ├── hive-coder-meta-agent-plan.md
│   ├── i18n/
│   │   ├── es.md
│   │   ├── hi.md
│   │   ├── ja.md
│   │   ├── ko.md
│   │   ├── pt.md
│   │   ├── ru.md
│   │   └── zh-CN.md
│   ├── issue-local-credential-parity.md
│   ├── issue-queen-bee.md
│   ├── key_concepts/
│   │   ├── evolution.md
│   │   ├── goals_outcome.md
│   │   ├── graph.md
│   │   └── worker_agent.md
│   ├── mcp-registry-prd.md
│   ├── multi-graph-sessions.md
│   ├── pr-requirements.md
│   ├── quizzes/
│   │   ├── 00-job-post.md
│   │   ├── 01-getting-started.md
│   │   ├── 02-architecture-deep-dive.md
│   │   ├── 03-build-your-first-agent.md
│   │   ├── 04-frontend-challenge.md
│   │   ├── 05-devops-challenge.md
│   │   └── README.md
│   ├── releases/
│   │   └── v0.4.0.md
│   ├── roadmap-developer-success.md
│   ├── roadmap.md
│   ├── runtime_initialization.md
│   ├── server-cli-arch.md
│   ├── skill-registry-prd.md
│   ├── skills-user-guide.md
│   ├── tools.md
│   └── worker-health-monitoring.md
├── examples/
│   ├── README.md
│   ├── recipes/
│   │   └── sample_prompts_for_use_cases.md
│   └── templates/
│       ├── README.md
│       ├── competitive_intel_agent/
│       │   ├── README.md
│       │   ├── __init__.py
│       │   ├── __main__.py
│       │   ├── agent.json
│       │   ├── agent.py
│       │   ├── config.py
│       │   ├── flowchart.json
│       │   ├── mcp_servers.json
│       │   └── nodes/
│       │       └── __init__.py
│       ├── deep_research_agent/
│       │   ├── README.md
│       │   ├── __init__.py
│       │   ├── __main__.py
│       │   ├── agent.json
│       │   ├── agent.py
│       │   ├── config.py
│       │   ├── flowchart.json
│       │   ├── mcp_servers.json
│       │   └── nodes/
│       │       └── __init__.py
│       ├── email_inbox_management/
│       │   ├── README.md
│       │   ├── __init__.py
│       │   ├── __main__.py
│       │   ├── agent.json
│       │   ├── agent.py
│       │   ├── config.py
│       │   ├── flowchart.json
│       │   ├── mcp_servers.json
│       │   ├── nodes/
│       │   │   └── __init__.py
│       │   ├── tools.py
│       │   └── triggers.json
│       ├── email_reply_agent/
│       │   ├── __init__.py
│       │   ├── __main__.py
│       │   ├── agent.py
│       │   ├── config.py
│       │   ├── flowchart.json
│       │   ├── mcp_servers.json
│       │   ├── nodes/
│       │   │   └── __init__.py
│       │   └── tests/
│       │       ├── conftest.py
│       │       └── test_structure.py
│       ├── job_hunter/
│       │   ├── README.md
│       │   ├── __init__.py
│       │   ├── __main__.py
│       │   ├── agent.json
│       │   ├── agent.py
│       │   ├── config.py
│       │   ├── flowchart.json
│       │   ├── mcp_servers.json
│       │   └── nodes/
│       │       └── __init__.py
│       ├── local_business_extractor/
│       │   ├── README.md
│       │   ├── __init__.py
│       │   ├── __main__.py
│       │   ├── agent.py
│       │   ├── config.py
│       │   ├── flowchart.json
│       │   ├── mcp_servers.json
│       │   └── nodes/
│       │       └── __init__.py
│       ├── meeting_scheduler/
│       │   ├── __init__.py
│       │   ├── __main__.py
│       │   ├── agent.py
│       │   ├── config.py
│       │   ├── flowchart.json
│       │   ├── mcp_servers.json
│       │   ├── nodes/
│       │   │   └── __init__.py
│       │   └── tests/
│       │       ├── conftest.py
│       │       └── test_structure.py
│       ├── sdr_agent/
│       │   ├── README.md
│       │   ├── __init__.py
│       │   ├── __main__.py
│       │   ├── agent.json
│       │   ├── agent.py
│       │   ├── config.py
│       │   ├── demo_contacts.json
│       │   ├── flowchart.json
│       │   ├── mcp_servers.json
│       │   ├── nodes/
│       │   │   └── __init__.py
│       │   └── tools.py
│       ├── tech_news_reporter/
│       │   ├── README.md
│       │   ├── __init__.py
│       │   ├── __main__.py
│       │   ├── agent.json
│       │   ├── agent.py
│       │   ├── config.py
│       │   ├── flowchart.json
│       │   ├── mcp_servers.json
│       │   └── nodes/
│       │       └── __init__.py
│       ├── twitter_news_agent/
│       │   ├── README.md
│       │   ├── __init__.py
│       │   ├── __main__.py
│       │   ├── agent.py
│       │   ├── config.py
│       │   ├── flowchart.json
│       │   ├── mcp_servers.json
│       │   └── nodes/
│       │       └── __init__.py
│       └── vulnerability_assessment/
│           ├── README.md
│           ├── __init__.py
│           ├── __main__.py
│           ├── agent.json
│           ├── agent.py
│           ├── config.py
│           ├── flowchart.json
│           ├── mcp_servers.json
│           └── nodes/
│               └── __init__.py
├── hive
├── hive.ps1
├── package.json
├── pyproject.toml
├── quickstart.ps1
├── quickstart.sh
├── scripts/
│   ├── auto-close-duplicates.test.ts
│   ├── auto-close-duplicates.ts
│   ├── benchmark_quickstart.ps1
│   ├── bounty-tracker.ts
│   ├── check_llm_key.py
│   ├── check_requirements.py
│   ├── debug_queen_prompt.py
│   ├── llm_debug_log_visualizer.py
│   ├── setup-bounty-labels.sh
│   ├── setup_worker_model.ps1
│   ├── setup_worker_model.sh
│   ├── test_check_requirements.py
│   ├── test_init_package.py
│   └── uv-discovery.ps1
├── tools/
│   ├── BUILDING_TOOLS.md
│   ├── Dockerfile
│   ├── README.md
│   ├── coder_tools_server.py
│   ├── create_aden_testdb.py
│   ├── files_server.py
│   ├── grant_permissions.py
│   ├── init_aden_testdb.sql
│   ├── mcp_server.py
│   ├── mcp_servers.json
│   ├── payroll_analysis.py
│   ├── pyproject.toml
│   ├── query_avg_salary.py
│   ├── src/
│   │   ├── aden_tools/
│   │   │   ├── __init__.py
│   │   │   ├── _win32_atomic.py
│   │   │   ├── credentials/
│   │   │   │   ├── __init__.py
│   │   │   │   ├── airtable.py
│   │   │   │   ├── apify.py
│   │   │   │   ├── apollo.py
│   │   │   │   ├── asana.py
│   │   │   │   ├── attio.py
│   │   │   │   ├── aws_s3.py
│   │   │   │   ├── azure_sql.py
│   │   │   │   ├── base.py
│   │   │   │   ├── bigquery.py
│   │   │   │   ├── brevo.py
│   │   │   │   ├── browser.py
│   │   │   │   ├── calcom.py
│   │   │   │   ├── calendly.py
│   │   │   │   ├── cloudinary.py
│   │   │   │   ├── confluence.py
│   │   │   │   ├── databricks.py
│   │   │   │   ├── discord.py
│   │   │   │   ├── docker_hub.py
│   │   │   │   ├── email.py
│   │   │   │   ├── gcp_vision.py
│   │   │   │   ├── github.py
│   │   │   │   ├── gitlab.py
│   │   │   │   ├── google_analytics.py
│   │   │   │   ├── google_maps.py
│   │   │   │   ├── google_search_console.py
│   │   │   │   ├── greenhouse.py
│   │   │   │   ├── health_check.py
│   │   │   │   ├── hubspot.py
│   │   │   │   ├── huggingface.py
│   │   │   │   ├── integrations.py
│   │   │   │   ├── intercom.py
│   │   │   │   ├── jira.py
│   │   │   │   ├── kafka.py
│   │   │   │   ├── langfuse.py
│   │   │   │   ├── linear.py
│   │   │   │   ├── lusha.py
│   │   │   │   ├── microsoft_graph.py
│   │   │   │   ├── mongodb.py
│   │   │   │   ├── n8n.py
│   │   │   │   ├── news.py
│   │   │   │   ├── notion.py
│   │   │   │   ├── obsidian.py
│   │   │   │   ├── pagerduty.py
│   │   │   │   ├── pinecone.py
│   │   │   │   ├── pipedrive.py
│   │   │   │   ├── plaid.py
│   │   │   │   ├── postgres.py
│   │   │   │   ├── powerbi.py
│   │   │   │   ├── pushover.py
│   │   │   │   ├── quickbooks.py
│   │   │   │   ├── razorpay.py
│   │   │   │   ├── reddit.py
│   │   │   │   ├── redis.py
│   │   │   │   ├── redshift.py
│   │   │   │   ├── salesforce.py
│   │   │   │   ├── sap.py
│   │   │   │   ├── search.py
│   │   │   │   ├── serpapi.py
│   │   │   │   ├── shell_config.py
│   │   │   │   ├── shopify.py
│   │   │   │   ├── slack.py
│   │   │   │   ├── snowflake.py
│   │   │   │   ├── store_adapter.py
│   │   │   │   ├── stripe.py
│   │   │   │   ├── supabase.py
│   │   │   │   ├── telegram.py
│   │   │   │   ├── terraform.py
│   │   │   │   ├── tines.py
│   │   │   │   ├── trello.py
│   │   │   │   ├── twilio.py
│   │   │   │   ├── twitter.py
│   │   │   │   ├── vercel.py
│   │   │   │   ├── x.py
│   │   │   │   ├── youtube.py
│   │   │   │   ├── zendesk.py
│   │   │   │   ├── zoho.py
│   │   │   │   ├── zoho_crm.py
│   │   │   │   └── zoom.py
│   │   │   ├── file_ops.py
│   │   │   ├── hashline.py
│   │   │   ├── tools/
│   │   │   │   ├── __init__.py
│   │   │   │   ├── account_info_tool/
│   │   │   │   │   ├── README.md
│   │   │   │   │   ├── __init__.py
│   │   │   │   │   └── account_info_tool.py
│   │   │   │   ├── airtable_tool/
│   │   │   │   │   ├── README.md
│   │   │   │   │   ├── __init__.py
│   │   │   │   │   └── airtable_tool.py
│   │   │   │   ├── apify_tool/
│   │   │   │   │   ├── README.md
│   │   │   │   │   ├── __init__.py
│   │   │   │   │   └── apify_tool.py
│   │   │   │   ├── apollo_tool/
│   │   │   │   │   ├── README.md
│   │   │   │   │   ├── __init__.py
│   │   │   │   │   └── apollo_tool.py
│   │   │   │   ├── arxiv_tool/
│   │   │   │   │   ├── README.md
│   │   │   │   │   ├── __init__.py
│   │   │   │   │   └── arxiv_tool.py
│   │   │   │   ├── asana_tool/
│   │   │   │   │   ├── README.md
│   │   │   │   │   ├── __init__.py
│   │   │   │   │   └── asana_tool.py
│   │   │   │   ├── attio_tool/
│   │   │   │   │   ├── README.md
│   │   │   │   │   ├── __init__.py
│   │   │   │   │   ├── attio_tool.py
│   │   │   │   │   └── tests/
│   │   │   │   │       ├── __init__.py
│   │   │   │   │       └── test_attio_tool.py
│   │   │   │   ├── aws_s3_tool/
│   │   │   │   │   ├── __init__.py
│   │   │   │   │   └── aws_s3_tool.py
│   │   │   │   ├── azure_sql_tool/
│   │   │   │   │   ├── __init__.py
│   │   │   │   │   └── azure_sql_tool.py
│   │   │   │   ├── bigquery_tool/
│   │   │   │   │   ├── README.md
│   │   │   │   │   ├── __init__.py
│   │   │   │   │   └── bigquery_tool.py
│   │   │   │   ├── brevo_tool/
│   │   │   │   │   ├── README.md
│   │   │   │   │   ├── __init__.py
│   │   │   │   │   └── brevo_tool.py
│   │   │   │   ├── calcom_tool/
│   │   │   │   │   ├── README.md
│   │   │   │   │   ├── __init__.py
│   │   │   │   │   └── calcom_tool.py
│   │   │   │   ├── calendar_tool/
│   │   │   │   │   ├── README.md
│   │   │   │   │   ├── __init__.py
│   │   │   │   │   └── calendar_tool.py
│   │   │   │   ├── calendly_tool/
│   │   │   │   │   ├── README.md
│   │   │   │   │   ├── __init__.py
│   │   │   │   │   └── calendly_tool.py
│   │   │   │   ├── cloudinary_tool/
│   │   │   │   │   ├── __init__.py
│   │   │   │   │   └── cloudinary_tool.py
│   │   │   │   ├── confluence_tool/
│   │   │   │   │   ├── __init__.py
│   │   │   │   │   └── confluence_tool.py
│   │   │   │   ├── csv_tool/
│   │   │   │   │   ├── README.md
│   │   │   │   │   ├── __init__.py
│   │   │   │   │   └── csv_tool.py
│   │   │   │   ├── databricks_tool/
│   │   │   │   │   ├── README.md
│   │   │   │   │   ├── __init__.py
│   │   │   │   │   ├── databricks_mcp_tool.py
│   │   │   │   │   └── databricks_tool.py
│   │   │   │   ├── discord_tool/
│   │   │   │   │   ├── README.md
│   │   │   │   │   ├── __init__.py
│   │   │   │   │   └── discord_tool.py
│   │   │   │   ├── dns_security_scanner/
│   │   │   │   │   ├── README.md
│   │   │   │   │   ├── __init__.py
│   │   │   │   │   └── dns_security_scanner.py
│   │   │   │   ├── docker_hub_tool/
│   │   │   │   │   ├── __init__.py
│   │   │   │   │   └── docker_hub_tool.py
│   │   │   │   ├── duckduckgo_tool/
│   │   │   │   │   ├── __init__.py
│   │   │   │   │   └── duckduckgo_tool.py
│   │   │   │   ├── email_tool/
│   │   │   │   │   ├── README.md
│   │   │   │   │   ├── __init__.py
│   │   │   │   │   └── email_tool.py
│   │   │   │   ├── exa_search_tool/
│   │   │   │   │   ├── README.md
│   │   │   │   │   ├── __init__.py
│   │   │   │   │   └── exa_search_tool.py
│   │   │   │   ├── example_tool/
│   │   │   │   │   ├── README.md
│   │   │   │   │   ├── __init__.py
│   │   │   │   │   └── example_tool.py
│   │   │   │   ├── excel_tool/
│   │   │   │   │   ├── README.md
│   │   │   │   │   ├── __init__.py
│   │   │   │   │   └── excel_tool.py
│   │   │   │   ├── file_system_toolkits/
│   │   │   │   │   ├── apply_diff/
│   │   │   │   │   │   ├── README.md
│   │   │   │   │   │   ├── __init__.py
│   │   │   │   │   │   └── apply_diff.py
│   │   │   │   │   ├── apply_patch/
│   │   │   │   │   │   ├── README.md
│   │   │   │   │   │   ├── __init__.py
│   │   │   │   │   │   └── apply_patch.py
│   │   │   │   │   ├── command_sanitizer.py
│   │   │   │   │   ├── data_tools/
│   │   │   │   │   │   ├── __init__.py
│   │   │   │   │   │   └── data_tools.py
│   │   │   │   │   ├── execute_command_tool/
│   │   │   │   │   │   ├── README.md
│   │   │   │   │   │   ├── __init__.py
│   │   │   │   │   │   └── execute_command_tool.py
│   │   │   │   │   ├── grep_search/
│   │   │   │   │   │   ├── README.md
│   │   │   │   │   │   ├── __init__.py
│   │   │   │   │   │   └── grep_search.py
│   │   │   │   │   ├── hashline.py
│   │   │   │   │   ├── hashline_edit/
│   │   │   │   │   │   ├── README.md
│   │   │   │   │   │   ├── __init__.py
│   │   │   │   │   │   └── hashline_edit.py
│   │   │   │   │   ├── list_dir/
│   │   │   │   │   │   ├── README.md
│   │   │   │   │   │   ├── __init__.py
│   │   │   │   │   │   └── list_dir.py
│   │   │   │   │   ├── replace_file_content/
│   │   │   │   │   │   ├── README.md
│   │   │   │   │   │   ├── __init__.py
│   │   │   │   │   │   └── replace_file_content.py
│   │   │   │   │   └── security.py
│   │   │   │   ├── github_tool/
│   │   │   │   │   ├── README.md
│   │   │   │   │   ├── __init__.py
│   │   │   │   │   └── github_tool.py
│   │   │   │   ├── gitlab_tool/
│   │   │   │   │   ├── __init__.py
│   │   │   │   │   └── gitlab_tool.py
│   │   │   │   ├── gmail_tool/
│   │   │   │   │   ├── README.md
│   │   │   │   │   ├── __init__.py
│   │   │   │   │   └── gmail_tool.py
│   │   │   │   ├── google_analytics_tool/
│   │   │   │   │   ├── README.md
│   │   │   │   │   ├── __init__.py
│   │   │   │   │   └── google_analytics_tool.py
│   │   │   │   ├── google_docs_tool/
│   │   │   │   │   ├── README.md
│   │   │   │   │   ├── __init__.py
│   │   │   │   │   ├── google_docs_tool.py
│   │   │   │   │   └── tests/
│   │   │   │   │       ├── __init__.py
│   │   │   │   │       └── test_google_docs_tool.py
│   │   │   │   ├── google_maps_tool/
│   │   │   │   │   ├── README.md
│   │   │   │   │   ├── __init__.py
│   │   │   │   │   └── google_maps_tool.py
│   │   │   │   ├── google_search_console_tool/
│   │   │   │   │   ├── __init__.py
│   │   │   │   │   └── google_search_console_tool.py
│   │   │   │   ├── google_sheets_tool/
│   │   │   │   │   ├── README.md
│   │   │   │   │   ├── __init__.py
│   │   │   │   │   ├── google_sheets_tool.py
│   │   │   │   │   └── tests/
│   │   │   │   │       ├── __init__.py
│   │   │   │   │       ├── test_google_sheets_integration.py
│   │   │   │   │       └── test_google_sheets_tool.py
│   │   │   │   ├── greenhouse_tool/
│   │   │   │   │   ├── __init__.py
│   │   │   │   │   └── greenhouse_tool.py
│   │   │   │   ├── http_headers_scanner/
│   │   │   │   │   ├── README.md
│   │   │   │   │   ├── __init__.py
│   │   │   │   │   └── http_headers_scanner.py
│   │   │   │   ├── hubspot_tool/
│   │   │   │   │   ├── __init__.py
│   │   │   │   │   ├── hubspot_tool.py
│   │   │   │   │   └── tests/
│   │   │   │   │       ├── __init__.py
│   │   │   │   │       └── test_hubspot_tool.py
│   │   │   │   ├── huggingface_tool/
│   │   │   │   │   ├── __init__.py
│   │   │   │   │   └── huggingface_tool.py
│   │   │   │   ├── intercom_tool/
│   │   │   │   │   ├── README.md
│   │   │   │   │   ├── __init__.py
│   │   │   │   │   ├── intercom_tool.py
│   │   │   │   │   └── tests/
│   │   │   │   │       ├── __init__.py
│   │   │   │   │       └── test_intercom_tool.py
│   │   │   │   ├── jira_tool/
│   │   │   │   │   ├── __init__.py
│   │   │   │   │   └── jira_tool.py
│   │   │   │   ├── kafka_tool/
│   │   │   │   │   ├── __init__.py
│   │   │   │   │   └── kafka_tool.py
│   │   │   │   ├── langfuse_tool/
│   │   │   │   │   ├── __init__.py
│   │   │   │   │   └── langfuse_tool.py
│   │   │   │   ├── linear_tool/
│   │   │   │   │   ├── __init__.py
│   │   │   │   │   ├── linear_tool.py
│   │   │   │   │   └── tests/
│   │   │   │   │       ├── __init__.py
│   │   │   │   │       └── test_linear_tool.py
│   │   │   │   ├── lusha_tool/
│   │   │   │   │   ├── README.md
│   │   │   │   │   ├── __init__.py
│   │   │   │   │   └── lusha_tool.py
│   │   │   │   ├── microsoft_graph_tool/
│   │   │   │   │   ├── __init__.py
│   │   │   │   │   └── microsoft_graph_tool.py
│   │   │   │   ├── mongodb_tool/
│   │   │   │   │   ├── __init__.py
│   │   │   │   │   └── mongodb_tool.py
│   │   │   │   ├── mssql_tool/
│   │   │   │   │   ├── README.md
│   │   │   │   │   ├── __init__.py
│   │   │   │   │   └── mssql_tool.py
│   │   │   │   ├── n8n_tool/
│   │   │   │   │   ├── __init__.py
│   │   │   │   │   └── n8n_tool.py
│   │   │   │   ├── news_tool/
│   │   │   │   │   ├── README.md
│   │   │   │   │   ├── __init__.py
│   │   │   │   │   └── news_tool.py
│   │   │   │   ├── notion_tool/
│   │   │   │   │   ├── README.md
│   │   │   │   │   ├── __init__.py
│   │   │   │   │   └── notion_tool.py
│   │   │   │   ├── obsidian_tool/
│   │   │   │   │   ├── __init__.py
│   │   │   │   │   └── obsidian_tool.py
│   │   │   │   ├── pagerduty_tool/
│   │   │   │   │   ├── __init__.py
│   │   │   │   │   └── pagerduty_tool.py
│   │   │   │   ├── pdf_read_tool/
│   │   │   │   │   ├── README.md
│   │   │   │   │   ├── __init__.py
│   │   │   │   │   └── pdf_read_tool.py
│   │   │   │   ├── pinecone_tool/
│   │   │   │   │   ├── __init__.py
│   │   │   │   │   └── pinecone_tool.py
│   │   │   │   ├── pipedrive_tool/
│   │   │   │   │   ├── __init__.py
│   │   │   │   │   └── pipedrive_tool.py
│   │   │   │   ├── plaid_tool/
│   │   │   │   │   ├── __init__.py
│   │   │   │   │   └── plaid_tool.py
│   │   │   │   ├── port_scanner/
│   │   │   │   │   ├── README.md
│   │   │   │   │   ├── __init__.py
│   │   │   │   │   └── port_scanner.py
│   │   │   │   ├── postgres_tool/
│   │   │   │   │   ├── README.md
│   │   │   │   │   ├── __init__.py
│   │   │   │   │   └── postgres_tool.py
│   │   │   │   ├── powerbi_tool/
│   │   │   │   │   ├── __init__.py
│   │   │   │   │   └── powerbi_tool.py
│   │   │   │   ├── pushover_tool/
│   │   │   │   │   ├── README.md
│   │   │   │   │   ├── __init__.py
│   │   │   │   │   ├── pushover_tool.py
│   │   │   │   │   └── tests/
│   │   │   │   │       ├── __init__.py
│   │   │   │   │       └── test_pushover_tool.py
│   │   │   │   ├── quickbooks_tool/
│   │   │   │   │   ├── __init__.py
│   │   │   │   │   └── quickbooks_tool.py
│   │   │   │   ├── razorpay_tool/
│   │   │   │   │   ├── README.md
│   │   │   │   │   ├── __init__.py
│   │   │   │   │   └── razorpay_tool.py
│   │   │   │   ├── reddit_tool/
│   │   │   │   │   ├── README.md
│   │   │   │   │   ├── __init__.py
│   │   │   │   │   └── reddit_tool.py
│   │   │   │   ├── redis_tool/
│   │   │   │   │   ├── __init__.py
│   │   │   │   │   └── redis_tool.py
│   │   │   │   ├── redshift_tool/
│   │   │   │   │   ├── README.md
│   │   │   │   │   ├── __init__.py
│   │   │   │   │   └── redshift_tool.py
│   │   │   │   ├── risk_scorer/
│   │   │   │   │   ├── README.md
│   │   │   │   │   ├── __init__.py
│   │   │   │   │   └── risk_scorer.py
│   │   │   │   ├── runtime_logs_tool/
│   │   │   │   │   ├── README.md
│   │   │   │   │   ├── __init__.py
│   │   │   │   │   └── runtime_logs_tool.py
│   │   │   │   ├── salesforce_tool/
│   │   │   │   │   ├── __init__.py
│   │   │   │   │   └── salesforce_tool.py
│   │   │   │   ├── sap_tool/
│   │   │   │   │   ├── __init__.py
│   │   │   │   │   └── sap_tool.py
│   │   │   │   ├── serpapi_tool/
│   │   │   │   │   ├── README.md
│   │   │   │   │   ├── __init__.py
│   │   │   │   │   └── serpapi_tool.py
│   │   │   │   ├── shopify_tool/
│   │   │   │   │   ├── __init__.py
│   │   │   │   │   └── shopify_tool.py
│   │   │   │   ├── slack_tool/
│   │   │   │   │   ├── README.md
│   │   │   │   │   ├── __init__.py
│   │   │   │   │   └── slack_tool.py
│   │   │   │   ├── snowflake_tool/
│   │   │   │   │   ├── __init__.py
│   │   │   │   │   └── snowflake_tool.py
│   │   │   │   ├── ssl_tls_scanner/
│   │   │   │   │   ├── README.md
│   │   │   │   │   ├── __init__.py
│   │   │   │   │   └── ssl_tls_scanner.py
│   │   │   │   ├── stripe_tool/
│   │   │   │   │   ├── README.md
│   │   │   │   │   ├── __init__.py
│   │   │   │   │   └── stripe_tool.py
│   │   │   │   ├── subdomain_enumerator/
│   │   │   │   │   ├── README.md
│   │   │   │   │   ├── __init__.py
│   │   │   │   │   └── subdomain_enumerator.py
│   │   │   │   ├── supabase_tool/
│   │   │   │   │   ├── __init__.py
│   │   │   │   │   └── supabase_tool.py
│   │   │   │   ├── tech_stack_detector/
│   │   │   │   │   ├── README.md
│   │   │   │   │   ├── __init__.py
│   │   │   │   │   └── tech_stack_detector.py
│   │   │   │   ├── telegram_tool/
│   │   │   │   │   ├── README.md
│   │   │   │   │   ├── __init__.py
│   │   │   │   │   └── telegram_tool.py
│   │   │   │   ├── terraform_tool/
│   │   │   │   │   ├── __init__.py
│   │   │   │   │   └── terraform_tool.py
│   │   │   │   ├── time_tool/
│   │   │   │   │   ├── README.md
│   │   │   │   │   ├── __init__.py
│   │   │   │   │   └── time_tool.py
│   │   │   │   ├── tines_tool/
│   │   │   │   │   ├── __init__.py
│   │   │   │   │   └── tines_tool.py
│   │   │   │   ├── trello_tool/
│   │   │   │   │   ├── README.md
│   │   │   │   │   ├── __init__.py
│   │   │   │   │   ├── trello_client.py
│   │   │   │   │   └── trello_tool.py
│   │   │   │   ├── twilio_tool/
│   │   │   │   │   ├── __init__.py
│   │   │   │   │   └── twilio_tool.py
│   │   │   │   ├── twitter_tool/
│   │   │   │   │   ├── __init__.py
│   │   │   │   │   └── twitter_tool.py
│   │   │   │   ├── vercel_tool/
│   │   │   │   │   ├── __init__.py
│   │   │   │   │   └── vercel_tool.py
│   │   │   │   ├── vision_tool/
│   │   │   │   │   ├── README.md
│   │   │   │   │   ├── __init__.py
│   │   │   │   │   └── vision_tool.py
│   │   │   │   ├── web_scrape_tool/
│   │   │   │   │   ├── README.md
│   │   │   │   │   ├── __init__.py
│   │   │   │   │   └── web_scrape_tool.py
│   │   │   │   ├── web_search_tool/
│   │   │   │   │   ├── README.md
│   │   │   │   │   ├── __init__.py
│   │   │   │   │   └── web_search_tool.py
│   │   │   │   ├── wikipedia_tool/
│   │   │   │   │   ├── README.md
│   │   │   │   │   ├── __init__.py
│   │   │   │   │   └── wikipedia_tool.py
│   │   │   │   ├── yahoo_finance_tool/
│   │   │   │   │   ├── __init__.py
│   │   │   │   │   └── yahoo_finance_tool.py
│   │   │   │   ├── youtube_tool/
│   │   │   │   │   ├── README.md
│   │   │   │   │   ├── __init__.py
│   │   │   │   │   └── youtube_tool.py
│   │   │   │   ├── youtube_transcript_tool/
│   │   │   │   │   ├── __init__.py
│   │   │   │   │   └── youtube_transcript_tool.py
│   │   │   │   ├── zendesk_tool/
│   │   │   │   │   ├── __init__.py
│   │   │   │   │   └── zendesk_tool.py
│   │   │   │   ├── zoho_crm_tool/
│   │   │   │   │   ├── README.md
│   │   │   │   │   ├── __init__.py
│   │   │   │   │   ├── tests/
│   │   │   │   │   │   ├── __init__.py
│   │   │   │   │   │   └── test_zoho_crm_tool.py
│   │   │   │   │   └── zoho_crm_tool.py
│   │   │   │   └── zoom_tool/
│   │   │   │       ├── __init__.py
│   │   │   │       └── zoom_tool.py
│   │   │   └── utils/
│   │   │       ├── __init__.py
│   │   │       └── env_helpers.py
│   │   ├── gcu/
│   │   │   ├── __init__.py
│   │   │   ├── browser/
│   │   │   │   ├── __init__.py
│   │   │   │   ├── chrome_finder.py
│   │   │   │   ├── chrome_launcher.py
│   │   │   │   ├── highlight.py
│   │   │   │   ├── port_manager.py
│   │   │   │   ├── session.py
│   │   │   │   └── tools/
│   │   │   │       ├── __init__.py
│   │   │   │       ├── advanced.py
│   │   │   │       ├── inspection.py
│   │   │   │       ├── interactions.py
│   │   │   │       ├── lifecycle.py
│   │   │   │       ├── navigation.py
│   │   │   │       └── tabs.py
│   │   │   ├── files/
│   │   │   │   ├── __init__.py
│   │   │   │   └── tools.py
│   │   │   └── server.py
│   │   └── pyproject.toml
│   ├── test_highlights.py
│   ├── test_schema_discovery.py
│   ├── tests/
│   │   ├── __init__.py
│   │   ├── conftest.py
│   │   ├── credentials/
│   │   │   ├── __init__.py
│   │   │   └── test_google_analytics_credentials.py
│   │   ├── integrations/
│   │   │   ├── __init__.py
│   │   │   ├── conftest.py
│   │   │   ├── test_input_validation.py
│   │   │   ├── test_registration.py
│   │   │   └── test_spec_conformance.py
│   │   ├── test_browser_advanced_tools.py
│   │   ├── test_coder_tools_server.py
│   │   ├── test_command_sanitizer.py
│   │   ├── test_credential_registry.py
│   │   ├── test_credentials.py
│   │   ├── test_env_helpers.py
│   │   ├── test_health_checks.py
│   │   ├── test_live_health_checks.py
│   │   ├── test_x_page_load_repro.py
│   │   └── tools/
│   │       ├── __init__.py
│   │       ├── test_airtable_tool.py
│   │       ├── test_apify_tool.py
│   │       ├── test_apollo_tool.py
│   │       ├── test_arxiv_tool.py
│   │       ├── test_asana_tool.py
│   │       ├── test_attio_tool.py
│   │       ├── test_aws_s3_tool.py
│   │       ├── test_azure_sql_tool.py
│   │       ├── test_bigquery_tool.py
│   │       ├── test_brevo_tool.py
│   │       ├── test_calcom_tool.py
│   │       ├── test_calendar_tool.py
│   │       ├── test_calendly_tool.py
│   │       ├── test_cloudinary_tool.py
│   │       ├── test_confluence_tool.py
│   │       ├── test_csv_tool.py
│   │       ├── test_databricks_tool.py
│   │       ├── test_discord_tool.py
│   │       ├── test_dns_security_scanner.py
│   │       ├── test_docker_hub_tool.py
│   │       ├── test_duckduckgo_tool.py
│   │       ├── test_email_tool.py
│   │       ├── test_exa_search_tool.py
│   │       ├── test_example_tool.py
│   │       ├── test_excel_tool.py
│   │       ├── test_file_ops.py
│   │       ├── test_file_ops_hashline.py
│   │       ├── test_file_system_toolkits.py
│   │       ├── test_github_tool.py
│   │       ├── test_gitlab_tool.py
│   │       ├── test_gmail_tool.py
│   │       ├── test_google_analytics_tool.py
│   │       ├── test_google_docs_tool.py
│   │       ├── test_google_maps_tool.py
│   │       ├── test_google_search_console_tool.py
│   │       ├── test_google_sheets_tool.py
│   │       ├── test_greenhouse_tool.py
│   │       ├── test_hashline.py
│   │       ├── test_hashline_edit.py
│   │       ├── test_http_headers_scanner.py
│   │       ├── test_hubspot_tool.py
│   │       ├── test_huggingface_tool.py
│   │       ├── test_intercom_tool.py
│   │       ├── test_jira_tool.py
│   │       ├── test_kafka_tool.py
│   │       ├── test_langfuse_tool.py
│   │       ├── test_linear_tool.py
│   │       ├── test_lusha_tool.py
│   │       ├── test_microsoft_graph_tool.py
│   │       ├── test_mongodb_tool.py
│   │       ├── test_n8n_tool.py
│   │       ├── test_news_tool.py
│   │       ├── test_notion_tool.py
│   │       ├── test_obsidian_tool.py
│   │       ├── test_pagerduty_tool.py
│   │       ├── test_pdf_read_tool.py
│   │       ├── test_pinecone_tool.py
│   │       ├── test_pipedrive_tool.py
│   │       ├── test_plaid_tool.py
│   │       ├── test_port_scanner.py
│   │       ├── test_postgres_tool.py
│   │       ├── test_powerbi_tool.py
│   │       ├── test_pushover_tool.py
│   │       ├── test_quickbooks_tool.py
│   │       ├── test_razorpay_tool.py
│   │       ├── test_reddit_tool.py
│   │       ├── test_redis_tool.py
│   │       ├── test_redshift_tool.py
│   │       ├── test_risk_scorer.py
│   │       ├── test_run_command_pythonpath.py
│   │       ├── test_runtime_logs_tool.py
│   │       ├── test_salesforce_tool.py
│   │       ├── test_sap_tool.py
│   │       ├── test_security.py
│   │       ├── test_security_tools.py
│   │       ├── test_serpapi_tool.py
│   │       ├── test_shopify_tool.py
│   │       ├── test_slack_tool.py
│   │       ├── test_snowflake_tool.py
│   │       ├── test_ssl_tls_scanner.py
│   │       ├── test_stripe_tool.py
│   │       ├── test_subdomain_enumerator.py
│   │       ├── test_supabase_tool.py
│   │       ├── test_tech_stack_detector.py
│   │       ├── test_telegram_tool.py
│   │       ├── test_terraform_tool.py
│   │       ├── test_time_tool.py
│   │       ├── test_tines_tool.py
│   │       ├── test_trello_tool.py
│   │       ├── test_trello_tool_integration.py
│   │       ├── test_twilio_tool.py
│   │       ├── test_twitter_tool.py
│   │       ├── test_vercel_tool.py
│   │       ├── test_vision_tool.py
│   │       ├── test_web_scrape_tool.py
│   │       ├── test_web_search_tool.py
│   │       ├── test_wikipedia_tool.py
│   │       ├── test_yahoo_finance_tool.py
│   │       ├── test_youtube_tool.py
│   │       ├── test_youtube_transcript_tool.py
│   │       ├── test_zendesk_tool.py
│   │       ├── test_zoho_crm_tool.py
│   │       └── test_zoom_tool.py
│   └── top_salaries.py
└── tsconfig.base.json

================================================
FILE CONTENTS
================================================

================================================
FILE: .claude/settings.json
================================================
{
  "hooks": {
    "PostToolUse": [
      {
        "matcher": "Edit|Write|NotebookEdit",
        "hooks": [
          {
            "type": "command",
            "command": "ruff check --fix \"$CLAUDE_FILE_PATH\" 2>/dev/null; ruff format \"$CLAUDE_FILE_PATH\" 2>/dev/null; true"
          }
        ]
      }
    ]
  }
}


================================================
FILE: .claude/settings.local.json.example
================================================
{
  "permissions": {
    "allow": [
      "Bash(git status:*)",
      "Bash(gh run view:*)",
      "Bash(uv run:*)",
      "Bash(env:*)",
      "Bash(python -m py_compile:*)",
      "Bash(python -m pytest:*)",
      "Bash(source:*)",
      "Bash(find:*)",
      "Bash(PYTHONPATH=core:exports:tools/src uv run pytest:*)"
    ]
  },
  "enabledMcpjsonServers": ["tools"]
}


================================================
FILE: .claude/skills/triage-issue/SKILL.md
================================================
# Triage Issue Skill

Analyze a GitHub issue, verify claims against the codebase, and close invalid issues with a technical response.

## Trigger

User provides a GitHub issue URL or number, e.g.:
- `/triage-issue 1970`
- `/triage-issue https://github.com/adenhq/hive/issues/1970`

## Workflow

### Step 1: Fetch Issue Details

```bash
gh issue view <number> --repo adenhq/hive --json title,body,state,labels,author
```

Extract:
- Title
- Body (the claim/bug report)
- Current state
- Labels
- Author

If issue is already closed, inform user and stop.

### Step 2: Analyze the Claim

Read the issue body and identify:
1. **The core claim** - What is the user asserting?
2. **Technical specifics** - File paths, function names, code snippets mentioned
3. **Expected behavior** - What do they think should happen?
4. **Severity claimed** - Security issue? Bug? Feature request?

### Step 3: Investigate the Codebase

For each technical claim:
1. Find the referenced code using Grep/Glob/Read
2. Understand the actual implementation
3. Check if the claim accurately describes the behavior
4. Look for related tests, documentation, or design decisions

### Step 4: Evaluate Validity

Categorize the issue as one of:

| Category | Action |
|----------|--------|
| **Valid Bug** | Do NOT close. Inform user this is a real issue. |
| **Valid Feature Request** | Do NOT close. Suggest labeling appropriately. |
| **Misunderstanding** | Prepare technical explanation for why behavior is correct. |
| **Fundamentally Flawed** | Prepare critique explaining the technical impossibility or design rationale. |
| **Duplicate** | Find the original issue and prepare duplicate notice. |
| **Incomplete** | Prepare request for more information. |

### Step 5: Draft Response

For issues to be closed, draft a response that:

1. **Acknowledges the concern** - Don't be dismissive
2. **Explains the actual behavior** - With code references
3. **Provides technical rationale** - Why it works this way
4. **References industry standards** - If applicable
5. **Offers alternatives** - If there's a better approach for the user

Use this template:

```markdown
## Analysis

[Brief summary of what was investigated]

## Technical Details

[Explanation with code references]

## Why This Is Working As Designed

[Rationale]

## Recommendation

[What the user should do instead, if applicable]

---
*This issue was reviewed and closed by the maintainers.*
```

### Step 6: User Review

Present the draft to the user with:

```
## Issue #<number>: <title>

**Claim:** <summary of claim>

**Finding:** <valid/invalid/misunderstanding/etc>

**Draft Response:**
<the markdown response>

---
Do you want me to post this comment and close the issue?
```

Use AskUserQuestion with options:
- "Post and close" - Post comment, close issue
- "Edit response" - Let user modify the response
- "Skip" - Don't take action

### Step 7: Execute Action

If user approves:

```bash
# Post comment
gh issue comment <number> --repo adenhq/hive --body "<response>"

# Close issue
gh issue close <number> --repo adenhq/hive --reason "not planned"
```

Report success with link to the issue.

## Important Guidelines

1. **Never close valid issues** - If there's any merit to the claim, don't close it
2. **Be respectful** - The reporter took time to file the issue
3. **Be technical** - Provide code references and evidence
4. **Be educational** - Help them understand, don't just dismiss
5. **Check twice** - Make sure you understand the code before declaring something invalid
6. **Consider edge cases** - Maybe their environment reveals a real issue

## Example Critiques

### Security Misunderstanding
> "The claim that secrets are exposed in plaintext misunderstands the encryption architecture. While `SecretStr` is used for logging protection, actual encryption is provided by Fernet (AES-128-CBC) at the storage layer. The code path is: serialize → encrypt → write. Only encrypted bytes touch disk."

### Impossible Request
> "The requested feature would require [X] which violates [fundamental constraint]. This is not a limitation of our implementation but a fundamental property of [technology/protocol]."

### Already Handled
> "This scenario is already handled by [code reference]. The reporter may be using an older version or misconfigured environment."


================================================
FILE: .cursorrules
================================================
This project uses ruff for Python linting and formatting.

Rules:
- Line length: 100 characters
- Python target: 3.11+
- Use double quotes for strings
- Sort imports with isort (ruff I rules): stdlib, third-party, first-party (framework), local
- Combine as-imports
- Use type hints on all function signatures
- Use `from __future__ import annotations` for modern type syntax
- Raise exceptions with `from` in except blocks (B904)
- No unused imports (F401), no unused variables (F841)
- Prefer list/dict/set comprehensions over map/filter (C4)

Run `make lint` to auto-fix, `make check` to verify without modifying files.
Run `make format` to apply ruff formatting.

The ruff config lives in core/pyproject.toml under [tool.ruff].


================================================
FILE: .dockerignore
================================================
# Git
.git/
.gitignore

# Documentation
*.md
docs/
LICENSE

# IDE
.idea/
.vscode/

# Dependencies (rebuilt in container)
node_modules/

# Build artifacts
dist/
build/
coverage/

# Environment files
.env*
config.yaml

# Logs
*.log
logs/

# OS
.DS_Store
Thumbs.db

# GitHub
.github/


================================================
FILE: .editorconfig
================================================
# EditorConfig helps maintain consistent coding styles
# https://editorconfig.org

root = true

[*]
charset = utf-8
end_of_line = lf
indent_style = space
indent_size = 2
insert_final_newline = true
trim_trailing_whitespace = true

[*.py]
indent_size = 4

[*.md]
trim_trailing_whitespace = false

[*.{yml,yaml}]
indent_size = 2

[Makefile]
indent_style = tab


================================================
FILE: .gitattributes
================================================
# Normalize line endings for all text files
* text=auto

# Source code
*.py text diff=python
*.js text
*.ts text
*.jsx text
*.tsx text
*.json text
*.yaml text
*.yml text
*.toml text
*.ini text
*.cfg text

# Shell scripts (must use LF)
*.sh text eol=lf
quickstart.sh text eol=lf

# PowerShell scripts (Windows-friendly)
*.ps1 text eol=lf
*.psm1 text eol=lf

# Windows batch files (must use CRLF)
*.bat text eol=crlf
*.cmd text eol=crlf

# Documentation
*.md text
*.txt text
*.rst text
*.tex text

# Configuration files
.gitignore text
.gitattributes text
.editorconfig text
Dockerfile text
docker-compose.yml text
requirements*.txt text
pyproject.toml text
setup.py text
setup.cfg text
MANIFEST.in text
LICENSE text
README* text
CHANGELOG* text
CONTRIBUTING* text
CODE_OF_CONDUCT* text

# Web files
*.html text
*.css text
*.scss text
*.sass text

# Data files
*.xml text
*.csv text
*.sql text

# Graphics (binary)
*.png binary
*.jpg binary
*.jpeg binary
*.gif binary
*.ico binary
*.svg binary
*.eps binary
*.bmp binary
*.tif binary
*.tiff binary

# Archives (binary)
*.zip binary
*.tar binary
*.gz binary
*.bz2 binary
*.7z binary
*.rar binary

# Python compiled (binary)
*.pyc binary
*.pyo binary
*.pyd binary
*.whl binary
*.egg binary

# System libraries (binary)
*.so binary
*.dll binary
*.dylib binary
*.lib binary
*.a binary

# Documents (binary)
*.pdf binary
*.doc binary
*.docx binary
*.ppt binary
*.pptx binary
*.xls binary
*.xlsx binary

# Fonts (binary)
*.ttf binary
*.otf binary
*.woff binary
*.woff2 binary
*.eot binary

# Audio/Video (binary)
*.mp3 binary
*.mp4 binary
*.wav binary
*.avi binary
*.mov binary
*.flv binary

# Database files (binary)
*.db binary
*.sqlite binary
*.sqlite3 binary


================================================
FILE: .github/CODEOWNERS
================================================
# Default owners for everything in the repo
* @adenhq/maintainers

# Frontend
/honeycomb/ @adenhq/maintainers

# Backend
/hive/ @adenhq/maintainers

# Infrastructure
/.github/ @adenhq/maintainers

# Documentation
/docs/ @adenhq/maintainers
*.md @adenhq/maintainers


================================================
FILE: .github/ISSUE_TEMPLATE/bug_report.md
================================================
---
name: Bug Report
about: Report a bug to help us improve
title: "[Bug]: "
labels: bug, enhancement
assignees: ''

---

## Describe the Bug

A clear and concise description of what the bug is.

## To Reproduce

Steps to reproduce the behavior:

1. Go to '...'
2. Click on '...'
3. See error

## Expected Behavior

A clear and concise description of what you expected to happen.

## Screenshots

If applicable, add screenshots to help explain your problem.

## Environment

- OS: [e.g., Ubuntu 22.04, macOS 14]
- Python version: [e.g., 3.11.0]
- Docker version (if applicable): [e.g., 24.0.0]

## Configuration

Relevant parts of your agent configuration or environment setup (remove any sensitive data):

```yaml
# paste here
```

## Logs

Relevant log output:

```
paste logs here
```

## Additional Context

Add any other context about the problem here.


================================================
FILE: .github/ISSUE_TEMPLATE/feature_request.md
================================================
---
name: Feature Request
about: Suggest a new feature or enhancement
title: "[Feature]: "
labels: enhancement
assignees: ''

---

## Problem Statement

A clear and concise description of what problem this feature would solve.

Ex. I'm always frustrated when [...]

## Proposed Solution

A clear and concise description of what you want to happen.

## Alternatives Considered

A description of any alternative solutions or features you've considered.

## Additional Context

Add any other context, mockups, or screenshots about the feature request here.

## Implementation Ideas

If you have ideas about how this could be implemented, share them here.


================================================
FILE: .github/ISSUE_TEMPLATE/integration-bounty.yml
================================================
name: Integration Bounty
description: A bounty task for the integration contribution program
title: "[Bounty]: "
labels: []
body:
  - type: markdown
    attributes:
      value: |
        ## Integration Bounty

        This issue is part of the [Integration Bounty Program](../../docs/bounty-program/README.md).
        **Claim this bounty** by commenting below — a maintainer will assign you within 24 hours.

  - type: dropdown
    id: bounty-type
    attributes:
      label: Bounty Type
      options:
        - "Test a Tool (20 pts)"
        - "Write Docs (20 pts)"
        - "Code Contribution (30 pts)"
        - "New Integration (75 pts)"
    validations:
      required: true

  - type: dropdown
    id: difficulty
    attributes:
      label: Difficulty
      options:
        - Easy
        - Medium
        - Hard
    validations:
      required: true

  - type: input
    id: tool-name
    attributes:
      label: Tool Name
      description: The integration this bounty targets (e.g., `airtable`, `salesforce`)
      placeholder: e.g., airtable
    validations:
      required: true

  - type: textarea
    id: description
    attributes:
      label: Description
      description: What needs to be done to complete this bounty.
      placeholder: |
        Describe the specific task, including:
        - What the contributor needs to do
        - Links to relevant files in the repo
        - Any setup requirements (API keys, accounts, etc.)
    validations:
      required: true

  - type: textarea
    id: acceptance-criteria
    attributes:
      label: Acceptance Criteria
      description: What "done" looks like. The PR or report must meet all criteria.
      placeholder: |
        - [ ] Criterion 1
        - [ ] Criterion 2
        - [ ] CI passes
    validations:
      required: true

  - type: textarea
    id: relevant-files
    attributes:
      label: Relevant Files
      description: Links to tool directory, credential spec, health check file, etc.
      placeholder: |
        - Tool: `tools/src/aden_tools/tools/{tool_name}/`
        - Credential spec: `tools/src/aden_tools/credentials/{category}.py`
        - Health checks: `tools/src/aden_tools/credentials/health_check.py`

  - type: textarea
    id: resources
    attributes:
      label: Resources
      description: Links to API docs, examples, or guides that will help the contributor.
      placeholder: |
        - [Building Tools Guide](../../tools/BUILDING_TOOLS.md)
        - [Tool README Template](../../docs/bounty-program/templates/tool-readme-template.md)
        - API docs: https://...


================================================
FILE: .github/ISSUE_TEMPLATE/integration-request.md
================================================
---
name: Integration Request
about: Suggest a new integration
title: "[Integration]:"
labels: ''
assignees: ''

---

## Service                                                                                      
                                                                                                 
 Name and brief description of the service and what it enables agents to do.                     
                                                                                                 
 **Description:** [e.g., "API key for Slack Bot" — short one-liner for the credential spec]      
                                                                                                 
 ## Credential Identity                                                                          
                                                                                                 
 - **credential_id:** [e.g., `slack`]                                                            
 - **env_var:** [e.g., `SLACK_BOT_TOKEN`]                                                        
 - **credential_key:** [e.g., `access_token`, `api_key`, `bot_token`]                            
                                                                                                 
 ## Tools                                                                                        
                                                                                                 
 Tool function names that require this credential:                                               
                                                                                                 
 - [e.g., `slack_send_message`]                                                                  
 - [e.g., `slack_list_channels`]                                                                 
                                                                                                 
 ## Auth Methods                                                                                 
                                                                                                 
 - **Direct API key supported:** Yes / No                                                        
 - **Aden OAuth supported:** Yes / No                                                            
                                                                                                 
 If Aden OAuth is supported, describe the OAuth scopes/permissions required.                     
                                                                                                 
 ## How to Get the Credential                                                                    
                                                                                                 
 Link where users obtain the key/token:                                                          
                                                                                                 
 [e.g., https://api.slack.com/apps]                                                              
                                                                                                 
 Step-by-step instructions:                                                                      
                                                                                                 
 1. Go to ...                                                                                    
 2. Create a ...                                                                                 
 3. Select scopes/permissions: ...                                                               
 4. Copy the key/token                                                                           
                                                                                                 
 ## Health Check                                                                                 
                                                                                                 
 A lightweight API call to validate the credential (no writes, no charges).                      
                                                                                                 
 - **Endpoint:** [e.g., `https://slack.com/api/auth.test`]                                       
 - **Method:** [e.g., `GET` or `POST`]                                                           
 - **Auth header:** [e.g., `Authorization: Bearer {token}` or `X-Api-Key: {key}`]                
 - **Parameters (if any):** [e.g., `?limit=1`]                                                   
 - **200 means:** [e.g., key is valid]                                                           
 - **401 means:** [e.g., invalid or expired]                                                     
 - **429 means:** [e.g., rate limited but key is valid]                                          
                                                                                                 
 ## Credential Group                                                                             
                                                                                                 
 Does this require multiple credentials configured together? (e.g., Google Custom Search needs   
 both an API key and a CSE ID)                                                                   
                                                                                                 
 - [ ] No, single credential                                                                     
 - [ ] Yes — list the other credential IDs in the group:                                         
                                                                                                 
 ## Additional Context                                                                           
                                                                                                 
 Links to API docs, rate limits, free tier availability, or anything else relevant.


================================================
FILE: .github/ISSUE_TEMPLATE/standard-bounty.yml
================================================
name: Standard Bounty
description: A bounty task for general framework contributions (not integration-specific)
title: "[Bounty]: "
labels: []
body:
  - type: markdown
    attributes:
      value: |
        ## Standard Bounty

        This issue is part of the [Bounty Program](../../docs/bounty-program/README.md).
        **Claim this bounty** by commenting below — a maintainer will assign you within 24 hours.

  - type: dropdown
    id: bounty-size
    attributes:
      label: Bounty Size
      options:
        - "Small (10 pts)"
        - "Medium (30 pts)"
        - "Large (75 pts)"
        - "Extreme (150 pts)"
    validations:
      required: true

  - type: dropdown
    id: difficulty
    attributes:
      label: Difficulty
      options:
        - Easy
        - Medium
        - Hard
    validations:
      required: true

  - type: textarea
    id: description
    attributes:
      label: Description
      description: What needs to be done to complete this bounty.
      placeholder: |
        Describe the specific task, including:
        - What the contributor needs to do
        - Links to relevant files in the repo
        - Any context or motivation for the change
    validations:
      required: true

  - type: textarea
    id: acceptance-criteria
    attributes:
      label: Acceptance Criteria
      description: What "done" looks like. The PR must meet all criteria.
      placeholder: |
        - [ ] Criterion 1
        - [ ] Criterion 2
        - [ ] CI passes
    validations:
      required: true

  - type: textarea
    id: relevant-files
    attributes:
      label: Relevant Files
      description: Links to files or directories related to this bounty.
      placeholder: |
        - `path/to/file.py`
        - `path/to/directory/`

  - type: textarea
    id: resources
    attributes:
      label: Resources
      description: Links to docs, issues, or external references that will help.
      placeholder: |
        - Related issue: #XXXX
        - Docs: https://...


================================================
FILE: .github/PULL_REQUEST_TEMPLATE.md
================================================
## Description

Brief description of the changes in this PR.

## Type of Change

- [ ] Bug fix (non-breaking change that fixes an issue)
- [ ] New feature (non-breaking change that adds functionality)
- [ ] Breaking change (fix or feature that would cause existing functionality to not work as expected)
- [ ] Documentation update
- [ ] Refactoring (no functional changes)

## Related Issues

Fixes #(issue number)

## Changes Made

- Change 1
- Change 2
- Change 3

## Testing

Describe the tests you ran to verify your changes:

- [ ] Unit tests pass (`cd core && pytest tests/`)
- [ ] Lint passes (`cd core && ruff check .`)
- [ ] Manual testing performed

## Checklist

- [ ] My code follows the project's style guidelines
- [ ] I have performed a self-review of my code
- [ ] I have commented my code, particularly in hard-to-understand areas
- [ ] I have made corresponding changes to the documentation
- [ ] My changes generate no new warnings
- [ ] I have added tests that prove my fix is effective or that my feature works
- [ ] New and existing unit tests pass locally with my changes

## Screenshots (if applicable)

Add screenshots to demonstrate UI changes.


================================================
FILE: .github/workflows/auto-close-duplicates.yml
================================================
name: Auto-close duplicate issues
description: Auto-closes issues that are duplicates of existing issues
on:
  schedule:
    - cron: "0 */6 * * *"
  workflow_dispatch:

jobs:
  auto-close-duplicates:
    runs-on: ubuntu-latest
    timeout-minutes: 10
    permissions:
      contents: read
      issues: write

    steps:
      - name: Checkout repository
        uses: actions/checkout@v4

      - name: Setup Bun
        uses: oven-sh/setup-bun@v2
        with:
          bun-version: latest

      - name: Run auto-close-duplicates tests
        run: bun test scripts/auto-close-duplicates

      - name: Auto-close duplicate issues
        run: bun run scripts/auto-close-duplicates.ts
        env:
          GITHUB_TOKEN: ${{ secrets.GITHUB_TOKEN }}
          GITHUB_REPOSITORY_OWNER: ${{ github.repository_owner }}
          GITHUB_REPOSITORY_NAME: ${{ github.event.repository.name }}
          STATSIG_API_KEY: ${{ secrets.STATSIG_API_KEY }}


================================================
FILE: .github/workflows/bounty-completed.yml
================================================
name: Bounty completed
description: Awards points and notifies Discord when a bounty PR is merged

on:
  pull_request_target:
    types: [closed]

  workflow_dispatch:
    inputs:
      pr_number:
        description: "PR number to process (for missed bounties)"
        required: true
        type: number

jobs:
  bounty-notify:
    if: >
      github.event_name == 'workflow_dispatch' ||
      (github.event.pull_request.merged == true &&
       contains(join(github.event.pull_request.labels.*.name, ','), 'bounty:'))
    runs-on: ubuntu-latest
    timeout-minutes: 5
    permissions:
      contents: read
      pull-requests: read

    steps:
      - name: Checkout repository
        uses: actions/checkout@v4

      - name: Setup Bun
        uses: oven-sh/setup-bun@v2
        with:
          bun-version: latest

      - name: Award XP and notify Discord
        run: bun run scripts/bounty-tracker.ts notify
        env:
          GITHUB_TOKEN: ${{ secrets.GITHUB_TOKEN }}
          GITHUB_REPOSITORY_OWNER: ${{ github.repository_owner }}
          GITHUB_REPOSITORY_NAME: ${{ github.event.repository.name }}
          DISCORD_WEBHOOK_URL: ${{ secrets.DISCORD_BOUNTY_WEBHOOK_URL }}
          BOT_API_URL: ${{ secrets.BOT_API_URL }}
          BOT_API_KEY: ${{ secrets.BOT_API_KEY }}
          LURKR_API_KEY: ${{ secrets.LURKR_API_KEY }}
          LURKR_GUILD_ID: ${{ secrets.LURKR_GUILD_ID }}
          PR_NUMBER: ${{ inputs.pr_number || github.event.pull_request.number }}


================================================
FILE: .github/workflows/ci.yml
================================================
name: CI

on:
  push:
    branches: [main]
  pull_request:
    branches: [main]
    
concurrency:
  group: ${{ github.workflow }}-${{ github.ref }}
  cancel-in-progress: true

jobs:
  lint:
    name: Lint Python
    runs-on: ubuntu-latest
    steps:
      - uses: actions/checkout@v4

      - name: Setup Python
        uses: actions/setup-python@v5
        with:
          python-version: '3.11'

      - name: Install uv
        uses: astral-sh/setup-uv@v4
        with:
          enable-cache: true

      - name: Install dependencies
        run: uv sync --project core --group dev

      - name: Ruff lint
        run: |
          uv run --project core ruff check core/
          uv run --project core ruff check tools/

      - name: Ruff format
        run: |
          uv run --project core ruff format --check core/
          uv run --project core ruff format --check tools/

  test:
    name: Test Python Framework
    runs-on: ${{ matrix.os }}
    strategy:
      matrix:
        os: [ubuntu-latest, windows-latest]
    steps:
      - uses: actions/checkout@v4

      - name: Setup Python
        uses: actions/setup-python@v5
        with:
          python-version: '3.11'

      - name: Install uv
        uses: astral-sh/setup-uv@v4
        with:
          enable-cache: true

      - name: Install dependencies and run tests
        working-directory: core
        run: |
          uv sync
          uv run pytest tests/ -v

  test-tools:
    name: Test Tools (${{ matrix.os }})
    runs-on: ${{ matrix.os }}
    strategy:
      matrix:
        os: [ubuntu-latest, windows-latest]
    steps:
      - uses: actions/checkout@v4

      - name: Setup Python
        uses: actions/setup-python@v5
        with:
          python-version: '3.11'

      - name: Install uv
        uses: astral-sh/setup-uv@v4
        with:
          enable-cache: true

      - name: Install dependencies and run tests
        working-directory: tools
        run: |
          uv sync --extra dev
          uv run pytest tests/ -v

  validate:
    name: Validate Agent Exports
    runs-on: ubuntu-latest
    needs: [lint, test, test-tools]
    steps:
      - uses: actions/checkout@v4

      - name: Setup Python
        uses: actions/setup-python@v5
        with:
          python-version: '3.11'

      - name: Install uv
        uses: astral-sh/setup-uv@v4
        with:
          enable-cache: true
            
      - name: Install dependencies
        working-directory: core
        run: |
          uv sync

      - name: Validate exported agents
        run: |
          # Check that agent exports have valid structure
          if [ ! -d "exports" ]; then
            echo "No exports/ directory found, skipping validation"
            exit 0
          fi

          shopt -s nullglob
          agent_dirs=(exports/*/)
          shopt -u nullglob

          if [ ${#agent_dirs[@]} -eq 0 ]; then
            echo "No agent directories in exports/, skipping validation"
            exit 0
          fi

          validated=0
          for agent_dir in "${agent_dirs[@]}"; do
            if [ -f "$agent_dir/agent.json" ]; then
              echo "Validating $agent_dir"
              uv run python -c "import json; json.load(open('$agent_dir/agent.json'))"
              validated=$((validated + 1))
            fi
          done

          if [ "$validated" -eq 0 ]; then
            echo "No agent.json files found in exports/, skipping validation"
          else
            echo "Validated $validated agent(s)"
          fi


================================================
FILE: .github/workflows/claude-issue-triage.yml
================================================
name: Issue Triage

on:
  issues:
    types: [opened]

jobs:
  triage:
    runs-on: ubuntu-latest
    timeout-minutes: 10
    permissions:
      contents: read
      issues: write
      id-token: write

    steps:
      - name: Checkout repository
        uses: actions/checkout@v4
        with:
          fetch-depth: 1

      - name: Triage and check for duplicates
        uses: anthropics/claude-code-action@v1
        with:
          anthropic_api_key: ${{ secrets.ANTHROPIC_API_KEY }}
          github_token: ${{ secrets.GITHUB_TOKEN }}
          allowed_non_write_users: "*"
          prompt: |
            Analyze this new issue and perform triage tasks.

            Issue: #${{ github.event.issue.number }}
            Repository: ${{ github.repository }}

            ## Your Tasks:

            ### 1. Get issue details
            Use mcp__github__get_issue to get the full details of issue #${{ github.event.issue.number }}

            ### 2. Check for duplicates
            Search for similar existing issues using mcp__github__search_issues with relevant keywords from the issue title and body.

            Criteria for duplicates:
            - Same bug or error being reported
            - Same feature request (even if worded differently)
            - Same question being asked
            - Issues describing the same root problem

            If you find a duplicate:
            - Add a comment using EXACTLY this format (required for auto-close to work):
              "Found a possible duplicate of #<issue_number>: <brief explanation of why it's a duplicate>"
            - Do NOT apply the "duplicate" label yet (the auto-close script will add it after 12 hours if no objections)
            - Suggest the user react with a thumbs-down if they disagree

            ### 3. Check for Low-Quality / AI Spam
            Analyze the issue quality. We are receiving many low-effort, AI-generated spam issues.
            Flag the issue as INVALID if it matches these criteria:
            - **Vague/Generic**: Title is "Fix bug" or "Error" without specific context.
            - **Hallucinated**: Refers to files or features that do not exist in this repo.
            - **Template Filler**: Body contains "Insert description here" or unrelated gibberish.
            - **Low Effort**: No reproduction steps, no logs, only 1-2 sentences.

            If identified as spam/low-quality:
            - Add the "invalid" label.
            - Add a comment:
              "This issue has been automatically flagged as low-quality or potentially AI-generated spam. It lacks specific details (logs, reproduction steps, file references) required for us to help. Please open a new issue following the template exactly if this is a legitimate request."
            - Do NOT proceed to other steps.

            ### 4. Check for invalid issues (General)
            If the issue is not spam but still lacks information:
            - Add the "invalid" label
            - Comment asking for clarification

            ### 5. Categorize with labels (if NOT a duplicate or spam)
            Apply appropriate labels based on the issue content. Use ONLY these labels:
            - bug: Something isn't working
            - enhancement: New feature or request
            - question: Further information is requested
            - documentation: Improvements or additions to documentation
            - good first issue: Good for newcomers (if issue is well-defined and small scope)
            - help wanted: Extra attention is needed (if issue needs community input)
            - backlog: Tracked for the future, but not currently planned or prioritized

            ### 6. Estimate size (if NOT a duplicate, spam, or invalid)
            Apply exactly ONE size label to help contributors match their capacity to the task:
            - "size: small": Docs, typos, single-file fixes, config changes
            - "size: medium": Bug fixes with tests, adding a single tool, changes within one package
            - "size: large": Cross-package changes (core + tools), new modules, complex logic, architectural refactors

            You may apply multiple labels if appropriate (e.g., "bug", "size: small", and "good first issue").

            ## Tools Available:
            - mcp__github__get_issue: Get issue details
            - mcp__github__search_issues: Search for similar issues
            - mcp__github__list_issues: List recent issues if needed
            - mcp__github__add_issue_comment: Add a comment
            - mcp__github__update_issue: Add labels
            - mcp__github__get_issue_comments: Get existing comments

            Be thorough but efficient. Focus on accurate categorization and finding true duplicates.

          claude_args: |
            --model claude-haiku-4-5-20251001
            --allowedTools "mcp__github__get_issue,mcp__github__search_issues,mcp__github__list_issues,mcp__github__add_issue_comment,mcp__github__update_issue,mcp__github__get_issue_comments"


================================================
FILE: .github/workflows/pr-check-command.yml
================================================
name: PR Check Command

on:
  issue_comment:
    types: [created]

jobs:
  check-pr:
    # Only run on PR comments that start with /check
    if: github.event.issue.pull_request && startsWith(github.event.comment.body, '/check')
    runs-on: ubuntu-latest
    permissions:
      pull-requests: write
      issues: write
      checks: write
      statuses: write

    steps:
      - name: Check PR requirements
        uses: actions/github-script@v7
        with:
          script: |
            const prNumber = context.payload.issue.number;
            console.log(`Triggered by /check comment on PR #${prNumber}`);

            // Fetch PR data
            const { data: pr } = await github.rest.pulls.get({
              owner: context.repo.owner,
              repo: context.repo.repo,
              pull_number: prNumber,
            });

            const prBody = pr.body || '';
            const prTitle = pr.title || '';
            const prAuthor = pr.user.login;
            const headSha = pr.head.sha;

            // Create a check run in progress
            const { data: checkRun } = await github.rest.checks.create({
              owner: context.repo.owner,
              repo: context.repo.repo,
              name: 'check-requirements',
              head_sha: headSha,
              status: 'in_progress',
              started_at: new Date().toISOString(),
            });

            // Extract issue numbers
            const issuePattern = /(?:close[sd]?|fix(?:e[sd])?|resolve[sd]?)?\s*#(\d+)/gi;
            const allText = `${prTitle} ${prBody}`;
            const matches = [...allText.matchAll(issuePattern)];
            const issueNumbers = [...new Set(matches.map(m => parseInt(m[1], 10)))];

            console.log(`PR #${prNumber}:`);
            console.log(`  Author: ${prAuthor}`);
            console.log(`  Found issue references: ${issueNumbers.length > 0 ? issueNumbers.join(', ') : 'none'}`);

            if (issueNumbers.length === 0) {
              const message = `## PR Closed - Requirements Not Met

            This PR has been automatically closed because it doesn't meet the requirements.

            **Missing:** No linked issue found.

            **To fix:**
            1. Create or find an existing issue for this work
            2. Assign yourself to the issue
            3. Re-open this PR and add \`Fixes #123\` in the description

            **Why is this required?** See #472 for details.`;

              await github.rest.issues.createComment({
                owner: context.repo.owner,
                repo: context.repo.repo,
                issue_number: prNumber,
                body: message,
              });

              await github.rest.pulls.update({
                owner: context.repo.owner,
                repo: context.repo.repo,
                pull_number: prNumber,
                state: 'closed',
              });

              // Update check run to failure
              await github.rest.checks.update({
                owner: context.repo.owner,
                repo: context.repo.repo,
                check_run_id: checkRun.id,
                status: 'completed',
                conclusion: 'failure',
                completed_at: new Date().toISOString(),
                output: {
                  title: 'Missing linked issue',
                  summary: 'PR must reference an issue (e.g., `Fixes #123`)',
                },
              });

              core.setFailed('PR must reference an issue');
              return;
            }

            // Check if PR author is assigned to any linked issue
            let issueWithAuthorAssigned = null;
            let issuesWithoutAuthor = [];

            for (const issueNum of issueNumbers) {
              try {
                const { data: issue } = await github.rest.issues.get({
                  owner: context.repo.owner,
                  repo: context.repo.repo,
                  issue_number: issueNum,
                });

                const assigneeLogins = (issue.assignees || []).map(a => a.login);
                if (assigneeLogins.includes(prAuthor)) {
                  issueWithAuthorAssigned = issueNum;
                  console.log(`  Issue #${issueNum} has PR author ${prAuthor} as assignee`);
                  break;
                } else {
                  issuesWithoutAuthor.push({
                    number: issueNum,
                    assignees: assigneeLogins
                  });
                  console.log(`  Issue #${issueNum} assignees: ${assigneeLogins.length > 0 ? assigneeLogins.join(', ') : 'none'}`);
                }
              } catch (error) {
                console.log(`  Issue #${issueNum} not found`);
              }
            }

            if (!issueWithAuthorAssigned) {
              const issueList = issuesWithoutAuthor.map(i =>
                `#${i.number} (assignees: ${i.assignees.length > 0 ? i.assignees.join(', ') : 'none'})`
              ).join(', ');

              const message = `## PR Closed - Requirements Not Met

            This PR has been automatically closed because it doesn't meet the requirements.

            **PR Author:** @${prAuthor}
            **Found issues:** ${issueList}
            **Problem:** The PR author must be assigned to the linked issue.

            **To fix:**
            1. Assign yourself (@${prAuthor}) to one of the linked issues
            2. Re-open this PR

            **Why is this required?** See #472 for details.`;

              await github.rest.issues.createComment({
                owner: context.repo.owner,
                repo: context.repo.repo,
                issue_number: prNumber,
                body: message,
              });

              await github.rest.pulls.update({
                owner: context.repo.owner,
                repo: context.repo.repo,
                pull_number: prNumber,
                state: 'closed',
              });

              // Update check run to failure
              await github.rest.checks.update({
                owner: context.repo.owner,
                repo: context.repo.repo,
                check_run_id: checkRun.id,
                status: 'completed',
                conclusion: 'failure',
                completed_at: new Date().toISOString(),
                output: {
                  title: 'PR author not assigned to issue',
                  summary: `PR author @${prAuthor} must be assigned to one of the linked issues: ${issueList}`,
                },
              });

              core.setFailed('PR author must be assigned to the linked issue');
            } else {
              await github.rest.issues.createComment({
                owner: context.repo.owner,
                repo: context.repo.repo,
                issue_number: prNumber,
                body: `✅ PR requirements met! Issue #${issueWithAuthorAssigned} has @${prAuthor} as assignee.`,
              });

              // Update check run to success
              await github.rest.checks.update({
                owner: context.repo.owner,
                repo: context.repo.repo,
                check_run_id: checkRun.id,
                status: 'completed',
                conclusion: 'success',
                completed_at: new Date().toISOString(),
                output: {
                  title: 'Requirements met',
                  summary: `Issue #${issueWithAuthorAssigned} has @${prAuthor} as assignee.`,
                },
              });

              console.log(`PR requirements met!`);
            }


================================================
FILE: .github/workflows/pr-requirements-backfill.yml
================================================
name: PR Requirements Backfill

on:
  workflow_dispatch:

jobs:
  check-all-open-prs:
    runs-on: ubuntu-latest
    permissions:
      pull-requests: write
      issues: write

    steps:
      - name: Check all open PRs
        uses: actions/github-script@v7
        with:
          script: |
            const { data: pullRequests } = await github.rest.pulls.list({
              owner: context.repo.owner,
              repo: context.repo.repo,
              state: 'open',
              per_page: 100,
            });

            console.log(`Found ${pullRequests.length} open PRs`);

            for (const pr of pullRequests) {
              const prNumber = pr.number;
              const prBody = pr.body || '';
              const prTitle = pr.title || '';
              const prAuthor = pr.user.login;

              console.log(`\nChecking PR #${prNumber}: ${prTitle}`);

              // Extract issue numbers from body and title
              const issuePattern = /(?:close[sd]?|fix(?:e[sd])?|resolve[sd]?)?\s*#(\d+)/gi;
              const allText = `${prTitle} ${prBody}`;
              const matches = [...allText.matchAll(issuePattern)];
              const issueNumbers = [...new Set(matches.map(m => parseInt(m[1], 10)))];

              console.log(`  Found issue references: ${issueNumbers.length > 0 ? issueNumbers.join(', ') : 'none'}`);

              if (issueNumbers.length === 0) {
                console.log(`  ❌ No linked issue - closing PR`);

                const message = `## PR Closed - Requirements Not Met

            This PR has been automatically closed because it doesn't meet the requirements.

            **Missing:** No linked issue found.

            **To fix:**
            1. Create or find an existing issue for this work
            2. Assign yourself to the issue
            3. Re-open this PR and add \`Fixes #123\` in the description`;

                await github.rest.issues.createComment({
                  owner: context.repo.owner,
                  repo: context.repo.repo,
                  issue_number: prNumber,
                  body: message,
                });

                await github.rest.pulls.update({
                  owner: context.repo.owner,
                  repo: context.repo.repo,
                  pull_number: prNumber,
                  state: 'closed',
                });

                continue;
              }

              // Check if any linked issue has the PR author as assignee
              let issueWithAuthorAssigned = null;
              let issuesWithoutAuthor = [];

              for (const issueNum of issueNumbers) {
                try {
                  const { data: issue } = await github.rest.issues.get({
                    owner: context.repo.owner,
                    repo: context.repo.repo,
                    issue_number: issueNum,
                  });

                  const assigneeLogins = (issue.assignees || []).map(a => a.login);
                  if (assigneeLogins.includes(prAuthor)) {
                    issueWithAuthorAssigned = issueNum;
                    break;
                  } else {
                    issuesWithoutAuthor.push({
                      number: issueNum,
                      assignees: assigneeLogins
                    });
                  }
                } catch (error) {
                  console.log(`  Issue #${issueNum} not found or inaccessible`);
                }
              }

              if (!issueWithAuthorAssigned) {
                const issueList = issuesWithoutAuthor.map(i =>
                  `#${i.number} (assignees: ${i.assignees.length > 0 ? i.assignees.join(', ') : 'none'})`
                ).join(', ');

                console.log(`  ❌ PR author not assigned to any linked issue - closing PR`);

                const message = `## PR Closed - Requirements Not Met

            This PR has been automatically closed because it doesn't meet the requirements.

            **PR Author:** @${prAuthor}
            **Found issues:** ${issueList}
            **Problem:** The PR author must be assigned to the linked issue.

            **To fix:**
            1. Assign yourself (@${prAuthor}) to one of the linked issues
            2. Re-open this PR`;

                await github.rest.issues.createComment({
                  owner: context.repo.owner,
                  repo: context.repo.repo,
                  issue_number: prNumber,
                  body: message,
                });

                await github.rest.pulls.update({
                  owner: context.repo.owner,
                  repo: context.repo.repo,
                  pull_number: prNumber,
                  state: 'closed',
                });
              } else {
                console.log(`  ✅ PR requirements met! Issue #${issueWithAuthorAssigned} has ${prAuthor} as assignee.`);
              }
            }

            console.log('\nBackfill complete!');


================================================
FILE: .github/workflows/pr-requirements-enforce.yml
================================================
# Closes PRs that still have the `pr-requirements-warning` label
# after contributors were warned in pr-requirements.yml.
name: PR Requirements Enforcement
on:
  schedule:
    - cron: "0 0 * * *"   # runs every day once at midnight 
jobs:
  enforce:
    name: Close PRs still failing contribution requirements
    runs-on: ubuntu-latest
    permissions:
      pull-requests: write
      issues: write
    steps:
      - name: Close PRs still failing requirements
        uses: actions/github-script@v7
        with:
          script: |
            const { owner, repo } = context.repo;
            const prs = await github.paginate(github.rest.pulls.list, {
              owner,
              repo,
              state: "open",
              per_page: 100
            });
            for (const pr of prs) {
              // Skip draft PRs — author may still be actively working toward compliance
              if (pr.draft) continue;
              const labels = pr.labels.map(l => l.name);
              if (!labels.includes("pr-requirements-warning")) continue;
              const gracePeriod = 24 * 60 * 60 * 1000;
              const lastUpdated = new Date(pr.created_at);
              const now = new Date();
              if (now - lastUpdated < gracePeriod) {
                console.log(`Skipping PR #${pr.number} — still within grace period`);
                continue;
              }
              const prNumber = pr.number;
              const prAuthor = pr.user.login;
              await github.rest.issues.createComment({
                owner,
                repo,
                issue_number: prNumber,
                body: `Closing PR because the contribution requirements were not resolved within the 24-hour grace period.
                If this was closed in error, feel free to reopen the PR after fixing the requirements.`
              });
              await github.rest.pulls.update({
                owner,
                repo,
                pull_number: prNumber,
                state: "closed"
              });
              console.log(`Closed PR #${prNumber} by ${prAuthor} (PR requirements were not met)`);
            }

================================================
FILE: .github/workflows/pr-requirements.yml
================================================
name: PR Requirements Check

on:
  pull_request_target:
    types: [opened, reopened, edited, synchronize]

jobs:
  check-requirements:
    runs-on: ubuntu-latest
    permissions:
      pull-requests: write
      issues: write

    steps:
      - name: Check PR has linked issue with assignee
        uses: actions/github-script@v7
        with:
          script: |
            const pr = context.payload.pull_request;
            const prNumber = pr.number;
            const prBody = pr.body || '';
            const prTitle = pr.title || '';
            const prLabels = (pr.labels || []).map(l => l.name);

            // Allow micro-fix and documentation PRs without a linked issue
            const isMicroFix = prLabels.includes('micro-fix') || /micro-fix/i.test(prTitle);
            const isDocumentation = prLabels.includes('documentation') || /\bdocs?\b/i.test(prTitle);
            if (isMicroFix || isDocumentation) {
              const reason = isMicroFix ? 'micro-fix' : 'documentation';
              console.log(`PR #${prNumber} is a ${reason}, skipping issue requirement.`);
              return;
            }

            // Extract issue numbers from body and title
            // Matches: fixes #123, closes #123, resolves #123, or plain #123
            const issuePattern = /(?:close[sd]?|fix(?:e[sd])?|resolve[sd]?)?\s*#(\d+)/gi;

            const allText = `${prTitle} ${prBody}`;
            const matches = [...allText.matchAll(issuePattern)];
            const issueNumbers = [...new Set(matches.map(m => parseInt(m[1], 10)))];

            console.log(`PR #${prNumber}:`);
            console.log(`  Found issue references: ${issueNumbers.length > 0 ? issueNumbers.join(', ') : 'none'}`);

            if (issueNumbers.length === 0) {
              const message = `## PR Requirements Warning

            This PR does not meet the contribution requirements.
            If the issue is not fixed within ~24 hours, it may be automatically closed.

            **Missing:** No linked issue found.

            **To fix:**
            1. Create or find an existing issue for this work
            2. Assign yourself to the issue
            3. Re-open this PR and add \`Fixes #123\` in the description

            **Exception:** To bypass this requirement, you can:
            - Add the \`micro-fix\` label or include \`micro-fix\` in your PR title for trivial fixes
            - Add the \`documentation\` label or include \`doc\`/\`docs\` in your PR title for documentation changes

            **Micro-fix requirements** (must meet ALL):
            | Qualifies | Disqualifies |
            |-----------|--------------|
            | < 20 lines changed | Any functional bug fix |
            | Typos & Documentation & Linting | Refactoring for "clean code" |
            | No logic/API/DB changes | New features (even tiny ones) |

            **Why is this required?** See #472 for details.`;

              const comments = await github.paginate(github.rest.issues.listComments, {
                owner: context.repo.owner,
                repo: context.repo.repo,
                issue_number: prNumber,
                per_page: 100,
              });

              const botComment = comments.find(
                (c) => c.user.type === 'Bot' && c.body.includes('PR Requirements Warning')
              );

              if (!botComment) {
                await github.rest.issues.createComment({
                  owner: context.repo.owner,
                  repo: context.repo.repo,
                  issue_number: prNumber,
                  body: message,
                });
              }

              await github.rest.issues.addLabels({
                owner: context.repo.owner,
                repo: context.repo.repo,
                issue_number: prNumber,
                labels: ['pr-requirements-warning'],
              });

              core.setFailed('PR must reference an issue');
              return;
            }

            // Check if any linked issue has the PR author as assignee
            const prAuthor = pr.user.login;
            let issueWithAuthorAssigned = null;
            let issuesWithoutAuthor = [];

            for (const issueNum of issueNumbers) {
              try {
                const { data: issue } = await github.rest.issues.get({
                  owner: context.repo.owner,
                  repo: context.repo.repo,
                  issue_number: issueNum,
                });

                const assigneeLogins = (issue.assignees || []).map(a => a.login);
                if (assigneeLogins.includes(prAuthor)) {
                  issueWithAuthorAssigned = issueNum;
                  console.log(`  Issue #${issueNum} has PR author ${prAuthor} as assignee`);
                  break;
                } else {
                  issuesWithoutAuthor.push({
                    number: issueNum,
                    assignees: assigneeLogins
                  });
                  console.log(`  Issue #${issueNum} assignees: ${assigneeLogins.length > 0 ? assigneeLogins.join(', ') : 'none'} (PR author: ${prAuthor})`);
                }
              } catch (error) {
                console.log(`  Issue #${issueNum} not found or inaccessible`);
              }
            }

            if (!issueWithAuthorAssigned) {
              const issueList = issuesWithoutAuthor.map(i =>
                `#${i.number} (assignees: ${i.assignees.length > 0 ? i.assignees.join(', ') : 'none'})`
              ).join(', ');

              const message = `## PR Requirements Warning

            This PR does not meet the contribution requirements.
            If the issue is not fixed within ~24 hours, it may be automatically closed.

            **PR Author:** @${prAuthor}
            **Found issues:** ${issueList}
            **Problem:** The PR author must be assigned to the linked issue.

            **To fix:**
            1. Assign yourself (@${prAuthor}) to one of the linked issues
            2. Re-open this PR

            **Exception:** To bypass this requirement, you can:
            - Add the \`micro-fix\` label or include \`micro-fix\` in your PR title for trivial fixes
            - Add the \`documentation\` label or include \`doc\`/\`docs\` in your PR title for documentation changes

            **Micro-fix requirements** (must meet ALL):
            | Qualifies | Disqualifies |
            |-----------|--------------|
            | < 20 lines changed | Any functional bug fix |
            | Typos & Documentation & Linting | Refactoring for "clean code" |
            | No logic/API/DB changes | New features (even tiny ones) |

            **Why is this required?** See #472 for details.`;

              const comments = await github.paginate(github.rest.issues.listComments, {
                owner: context.repo.owner,
                repo: context.repo.repo,
                issue_number: prNumber,
                per_page: 100,
              });

              const botComment = comments.find(
                (c) => c.user.type === 'Bot' && c.body.includes('PR Requirements Warning')
              );

              if (!botComment) {
                await github.rest.issues.createComment({
                  owner: context.repo.owner,
                  repo: context.repo.repo,
                  issue_number: prNumber,
                  body: message,
                });
              }

              await github.rest.issues.addLabels({
                owner: context.repo.owner,
                repo: context.repo.repo,
                issue_number: prNumber,
                labels: ['pr-requirements-warning'],
              });

              core.setFailed('PR author must be assigned to the linked issue');
            } else {
              console.log(`PR requirements met! Issue #${issueWithAuthorAssigned} has ${prAuthor} as assignee.`);
              try {
                await github.rest.issues.removeLabel({
                  owner: context.repo.owner,
                  repo: context.repo.repo,
                  issue_number: prNumber,
                  name: "pr-requirements-warning"
                });
              }catch (error){
                //ignore if label doesn't exist
              }
            }

================================================
FILE: .github/workflows/release.yml
================================================
name: Release

on:
  push:
    tags:
      - 'v*'

permissions:
  contents: write

jobs:
  release:
    name: Create Release
    runs-on: ubuntu-latest
    steps:
      - uses: actions/checkout@v4
        with:
          fetch-depth: 0

      - name: Setup Python
        uses: actions/setup-python@v5
        with:
          python-version: '3.11'

      - name: Install uv
        uses: astral-sh/setup-uv@v4

      - name: Install dependencies
        run: |
          cd core
          uv sync

      - name: Run tests
        run: |
          cd core
          uv run pytest tests/ -v

      - name: Generate changelog
        id: changelog
        run: |
          # Extract version from tag
          VERSION=${GITHUB_REF#refs/tags/v}
          echo "version=$VERSION" >> $GITHUB_OUTPUT

      - name: Create GitHub Release
        uses: softprops/action-gh-release@v1
        with:
          generate_release_notes: true
          draft: false
          prerelease: ${{ contains(github.ref, '-') }}


================================================
FILE: .github/workflows/weekly-leaderboard.yml
================================================
name: Weekly bounty leaderboard
description: Posts the integration bounty leaderboard to Discord every Monday

on:
  schedule:
    # Every Monday at 9:00 UTC
    - cron: "0 9 * * 1"
  workflow_dispatch:
    inputs:
      since_date:
        description: "Only count PRs merged after this date (YYYY-MM-DD). Leave empty for all-time."
        required: false

jobs:
  leaderboard:
    runs-on: ubuntu-latest
    timeout-minutes: 5
    permissions:
      contents: read
      pull-requests: read

    steps:
      - name: Checkout repository
        uses: actions/checkout@v4

      - name: Setup Bun
        uses: oven-sh/setup-bun@v2
        with:
          bun-version: latest

      - name: Post leaderboard to Discord
        run: bun run scripts/bounty-tracker.ts leaderboard
        env:
          GITHUB_TOKEN: ${{ secrets.GITHUB_TOKEN }}
          GITHUB_REPOSITORY_OWNER: ${{ github.repository_owner }}
          GITHUB_REPOSITORY_NAME: ${{ github.event.repository.name }}
          DISCORD_WEBHOOK_URL: ${{ secrets.DISCORD_BOUNTY_WEBHOOK_URL }}
          BOT_API_URL: ${{ secrets.BOT_API_URL }}
          BOT_API_KEY: ${{ secrets.BOT_API_KEY }}
          LURKR_API_KEY: ${{ secrets.LURKR_API_KEY }}
          LURKR_GUILD_ID: ${{ secrets.LURKR_GUILD_ID }}
          SINCE_DATE: ${{ github.event.inputs.since_date || '' }}


================================================
FILE: .gitignore
================================================
# Dependencies
node_modules/
.pnpm-store/

# Build outputs
dist/
build/
workdir/
.next/
out/

# Environment files
.env
.env.local
.env.*.local

# User configuration (copied from .example)
config.yaml
docker-compose.override.yml

# IDE
.idea/
.vscode/*
!.vscode/extensions.json
!.vscode/settings.json.example
*.swp
*.swo
*~

# OS
.DS_Store
Thumbs.db

# Logs
logs/
*.log
npm-debug.log*
yarn-debug.log*
yarn-error.log*
pnpm-debug.log*

# Testing
coverage/
.nyc_output/
.pytest_cache/

# TypeScript
*.tsbuildinfo
vite.config.d.ts

# Python
__pycache__/
*.py[cod]
*$py.class
*.egg-info/
.eggs/
*.egg

# Generated runtime data
core/data/

# Misc
*.local
.cache/
tmp/
temp/

exports/*

.claude/settings.local.json

.venv

docs/github-issues/*
core/tests/*dumps/*

screenshots/*

.gemini/*


================================================
FILE: .mcp.json
================================================
{
  "mcpServers": {}
}


================================================
FILE: .pre-commit-config.yaml
================================================
repos:
  - repo: https://github.com/astral-sh/ruff-pre-commit
    rev: v0.15.0
    hooks:
      - id: ruff
        name: ruff lint (core)
        args: [--fix]
        files: ^core/
      - id: ruff
        name: ruff lint (tools)
        args: [--fix]
        files: ^tools/
      - id: ruff-format
        name: ruff format (core)
        files: ^core/
      - id: ruff-format
        name: ruff format (tools)
        files: ^tools/


================================================
FILE: .python-version
================================================
3.11


================================================
FILE: AGENTS.md
================================================
# Repository Guidelines

Shared agent instructions for this workspace.

## Coding Agent Notes

- 
- When working on a GitHub Issue or PR, print the full URL at the end of the task.
- When answering questions, respond with high-confidence answers only: verify in code; do not guess.
- Do not update dependencies casually. Version bumps, patched dependencies, overrides, or vendored dependency changes require explicit approval.
- Add brief comments for tricky logic. Keep files reasonably small when practical; split or refactor large files instead of growing them indefinitely.
- If shared guardrails are available locally, review them; otherwise follow this repo's guidance.
- Use `uv` for Python execution and package management. Do not use `python` or `python3` directly unless the user explicitly asks for it.
- Prefer `uv run` for scripts and tests, and `uv pip` for package operations.


## Multi-Agent Safety

- Do not create, apply, or drop `git stash` entries unless explicitly requested.
- Do not create, remove, or modify `git worktree` checkouts unless explicitly requested.
- Do not switch branches or check out a different branch unless explicitly requested.
- When the user says `push`, you may `git pull --rebase` to integrate latest changes, but never discard other in-progress work.
- When the user says `commit`, commit only your changes. When the user says `commit all`, commit everything in grouped chunks.
- When you see unrecognized files or unrelated changes, keep going and focus on your scoped changes.

## Change Hygiene

- If staged and unstaged diffs are formatting-only, resolve them without asking.
- If a commit or push was already requested, include formatting-only follow-up changes in that same commit when practical.
- Only stop to ask for confirmation when changes are semantic and may alter behavior.


================================================
FILE: CHANGELOG.md
================================================
# Release Notes

## v0.7.1

**Release Date:** March 13, 2026
**Tag:** v0.7.1

### Chrome-Native Browser Control

v0.7.1 replaces Playwright with direct Chrome DevTools Protocol (CDP) integration. The GCU now launches the user's system Chrome via `open -n` on macOS, connects over CDP, and manages browser lifecycle end-to-end -- no extra browser binary required.

---

### Highlights

#### System Chrome via CDP

The entire GCU browser stack has been rewritten:

- **Chrome finder & launcher** -- New `chrome_finder.py` discovers installed Chrome and `chrome_launcher.py` manages process lifecycle with `--remote-debugging-port`
- **Coexist with user's browser** -- `open -n` on macOS launches a separate Chrome instance so the user's tabs stay untouched
- **Dynamic viewport sizing** -- Viewport auto-sizes to the available display area, suppressing Chrome warning bars
- **Orphan cleanup** -- Chrome processes are killed on GCU server shutdown to prevent leaks
- **`--no-startup-window`** -- Chrome launches headlessly by default until a page is needed

#### Per-Subagent Browser Isolation

Each GCU subagent gets its own Chrome user-data directory, preventing cookie/session cross-contamination:

- Unique browser profiles injected per subagent
- Profiles cleaned up after top-level GCU node execution
- Tab origin and age metadata tracked per subagent

#### Dummy Agent Testing Framework

A comprehensive test suite for validating agent graph patterns without LLM calls:

- 8 test modules covering echo, pipeline, branch, parallel merge, retry, feedback loop, worker, and GCU subagent patterns
- Shared fixtures and a `run_all.py` runner for CI integration
- Subagent lifecycle tests

---

### What's New

#### GCU Browser

- **Switch from Playwright to system Chrome via CDP** -- Direct CDP connection replaces Playwright dependency. (@bryanadenhq)
- **Chrome finder and launcher modules** -- `chrome_finder.py` and `chrome_launcher.py` for cross-platform Chrome discovery and process management. (@bryanadenhq)
- **Dynamic viewport sizing** -- Auto-size viewport and suppress Chrome warning bar. (@bryanadenhq)
- **Per-subagent browser profile isolation** -- Unique user-data directories per subagent with cleanup. (@bryanadenhq)
- **Tab origin/age metadata** -- Track which subagent opened each tab and when. (@bryanadenhq)
- **`browser_close_all` tool** -- Bulk tab cleanup for agents managing many pages. (@bryanadenhq)
- **Auto-track popup pages** -- Popups are automatically captured and tracked. (@bryanadenhq)
- **Auto-snapshot from browser interactions** -- Browser interaction tools return screenshots automatically. (@bryanadenhq)
- **Kill orphaned Chrome processes** -- GCU server shutdown cleans up lingering Chrome instances. (@bryanadenhq)
- **`--no-startup-window` Chrome flag** -- Prevent empty window on launch. (@bryanadenhq)
- **Launch Chrome via `open -n` on macOS** -- Coexist with the user's running browser. (@bryanadenhq)

#### Framework & Runtime

- **Session resume fix for new agents** -- Correctly resume sessions when a new agent is loaded. (@bryanadenhq)
- **Queen upsert fix** -- Prevent duplicate queen entries on session restore. (@bryanadenhq)
- **Anchor worker monitoring to queen's session ID on cold-restore** -- Worker monitors reconnect to the correct queen after restart. (@bryanadenhq)
- **Update meta.json when loading workers** -- Worker metadata stays in sync with runtime state. (@RichardTang-Aden)
- **Generate worker MCP file correctly** -- Fix MCP config generation for spawned workers. (@RichardTang-Aden)
- **Share event bus so tool events are visible to parent** -- Tool execution events propagate up to parent graphs. (@bryanadenhq)
- **Subagent activity tracking in queen status** -- Queen instructions include live subagent status. (@bryanadenhq)
- **GCU system prompt updates** -- Auto-snapshots, batching, popup tracking, and close_all guidance. (@bryanadenhq)

#### Frontend

- **Loading spinner in draft panel** -- Shows spinner during planning phase instead of blank panel. (@bryanadenhq)
- **Fix credential modal errors** -- Modal no longer eats errors; banner stays visible. (@bryanadenhq)
- **Fix credentials_required loop** -- Stop clearing the flag on modal close to prevent infinite re-prompting. (@bryanadenhq)
- **Fix "Add tab" dropdown overflow** -- Dropdown no longer hidden when many agents are open. (@prasoonmhwr)

#### Testing

- **Dummy agent test framework** -- 8 test modules (echo, pipeline, branch, parallel merge, retry, feedback loop, worker, GCU subagent) with shared fixtures and CI runner. (@bryanadenhq)
- **Subagent lifecycle tests** -- Validate subagent spawn and completion flows. (@bryanadenhq)

#### Documentation & Infrastructure

- **MCP integration PRD** -- Product requirements for MCP server registry. (@TimothyZhang7)
- **Skills registry PRD** -- Product requirements for skill registry system. (@bryanadenhq)
- **Bounty program updates** -- Standard bounty issue template and updated contributor guide. (@bryanadenhq)
- **Windows quickstart** -- Add default context limit for PowerShell setup. (@bryanadenhq)
- **Remove deprecated files** -- Clean up `setup_mcp.py`, `verify_mcp.py`, `antigravity-setup.md`, and `setup-antigravity-mcp.sh`. (@bryanadenhq)

---

### Bug Fixes

- Fix credential modal eating errors and banner staying open
- Stop clearing `credentials_required` on modal close to prevent infinite loop
- Share event bus so tool events are visible to parent graph
- Use lazy %-formatting in subagent completion log to avoid f-string in logger
- Anchor worker monitoring to queen's session ID on cold-restore
- Update meta.json when loading workers
- Generate worker MCP file correctly
- Fix "Add tab" dropdown partially hidden when creating multiple agents

---

### Community Contributors

- **Prasoon Mahawar** (@prasoonmhwr) -- Fix UI overflow on agent tab dropdown
- **Richard Tang** (@RichardTang-Aden) -- Worker MCP generation and meta.json fixes

---

### Upgrading

```bash
git pull origin main
uv sync
```

The Playwright dependency is no longer required for GCU browser operations. Chrome must be installed on the host system.

---

## v0.7.0

**Release Date:** March 5, 2026
**Tag:** v0.7.0

Session management refactor release.

---

## v0.5.1

**Release Date:** February 18, 2026
**Tag:** v0.5.1

### The Hive Gets a Brain

v0.5.1 is our most ambitious release yet. Hive agents can now **build other agents** -- the new Hive Coder meta-agent writes, tests, and fixes agent packages from natural language. The runtime grows multi-graph support so one session can orchestrate multiple agents simultaneously. The TUI gets a complete overhaul with an in-app agent picker, live streaming, and seamless escalation to the Coder. And we're now provider-agnostic: Claude Code subscriptions, OpenAI-compatible endpoints, and any LiteLLM-supported model work out of the box.

---

### Highlights

#### Hive Coder -- The Agent That Builds Agents

A native meta-agent that lives inside the framework at `core/framework/agents/hive_coder/`. Give it a natural-language specification and it produces a complete agent package -- goal definition, node prompts, edge routing, MCP tool wiring, tests, and all boilerplate files.

```bash
# Launch the Coder directly
hive code

# Or escalate from any running agent (TUI)
Ctrl+E  # or /coder in chat
```

The Coder ships with:

- **Reference documentation** -- anti-patterns, construction guide, and design patterns baked into its system prompt
- **Guardian watchdog** -- an event-driven monitor that catches agent failures and triggers automatic remediation
- **Coder Tools MCP server** -- file I/O, fuzzy-match editing, git snapshots, and sandboxed shell execution (`tools/coder_tools_server.py`)
- **Test generation** -- structural tests for forever-alive agents that don't hang on `runner.run()`

#### Multi-Graph Agent Runtime

`AgentRuntime` now supports loading, managing, and switching between multiple agent graphs within a single session. Six new lifecycle tools give agents (and the TUI) full control:

```python
# Load a second agent into the runtime
await runtime.add_graph("exports/deep_research_agent")

# Tools available to agents:
# load_agent, unload_agent, start_agent, restart_agent, list_agents, get_user_presence
```

The Hive Coder uses multi-graph internally -- when you escalate from a worker agent, the Coder loads as a separate graph while the worker stays alive in the background.

#### TUI Revamp

The Terminal UI gets a ground-up rebuild with five major additions:

- **Agent Picker** (Ctrl+A) -- tabbed modal screen for browsing Your Agents, Framework agents, and Examples with metadata badges (node count, tool count, session count, tags)
- **Runtime-optional startup** -- TUI launches without a pre-loaded agent, showing the picker on first open
- **Live streaming pane** -- dedicated RichLog widget shows LLM tokens as they arrive, replacing the old one-token-per-line display
- **PDF attachments** -- `/attach` and `/detach` commands with native OS file dialog (macOS, Linux, Windows)
- **Multi-graph commands** -- `/graphs`, `/graph <id>`, `/load <path>`, `/unload <id>` for managing agent graphs in-session

#### Provider-Agnostic LLM Support

Hive is no longer Anthropic-only. v0.5.1 adds first-class support for:

- **Claude Code subscriptions** -- `use_claude_code_subscription: true` in `~/.hive/configuration.json` reads OAuth tokens from `~/.claude/.credentials.json` with automatic refresh
- **OpenAI-compatible endpoints** -- `api_base` config routes traffic through any compatible API (Azure OpenAI, vLLM, Ollama, etc.)
- **Any LiteLLM model** -- `RuntimeConfig` now passes `api_key`, `api_base`, and `extra_kwargs` through to LiteLLM

The quickstart script auto-detects Claude Code subscriptions and ZAI Code installations.

---

### What's New

#### Architecture & Runtime

- **Hive Coder meta-agent** -- Natural-language agent builder with reference docs, guardian watchdog, and `hive code` CLI command. (@TimothyZhang7)
- **Multi-graph agent sessions** -- `add_graph`/`remove_graph` on AgentRuntime with 6 lifecycle tools (`load_agent`, `unload_agent`, `start_agent`, `restart_agent`, `list_agents`, `get_user_presence`). (@TimothyZhang7)
- **Claude Code subscription support** -- OAuth token refresh via `use_claude_code_subscription` config, auto-detection in quickstart, LiteLLM header patching. (@TimothyZhang7)
- **OpenAI-compatible endpoint support** -- `api_base` and `extra_kwargs` in `RuntimeConfig` for any OpenAI-compatible API. (@TimothyZhang7)
- **Remove deprecated node types** -- Delete `FlexibleGraphExecutor`, `WorkerNode`, `HybridJudge`, `CodeSandbox`, `Plan`, `FunctionNode`, `LLMNode`, `RouterNode`. Deprecated types (`llm_tool_use`, `llm_generate`, `function`, `router`, `human_input`) now raise `RuntimeError` with migration guidance. (@TimothyZhang7)
- **Interactive credential setup** -- Guided `CredentialSetupSession` with health checks and encrypted storage, accessible via `hive setup-credentials` or automatic prompting on credential errors. (@RichardTang-Aden)
- **Pre-start confirmation prompt** -- Interactive prompt before agent execution allowing credential updates or abort. (@RichardTang-Aden)
- **Event bus multi-graph support** -- `graph_id` on events, `filter_graph` on subscriptions, `ESCALATION_REQUESTED` event type, `exclude_own_graph` filter. (@TimothyZhang7)

#### TUI Improvements

- **In-app agent picker** (Ctrl+A) -- Tabbed modal for browsing agents with metadata badges (nodes, tools, sessions, tags). (@TimothyZhang7)
- **Runtime-optional TUI startup** -- Launches without a pre-loaded agent, shows agent picker on startup. (@TimothyZhang7)
- **Hive Coder escalation** (Ctrl+E) -- Escalate to Hive Coder and return; also available via `/coder` and `/back` chat commands. (@TimothyZhang7)
- **PDF attachment support** -- `/attach` and `/detach` commands with native OS file dialog. (@TimothyZhang7)
- **Streaming output pane** -- Dedicated RichLog widget for live LLM token streaming. (@TimothyZhang7)
- **Multi-graph TUI commands** -- `/graphs`, `/graph <id>`, `/load <path>`, `/unload <id>`. (@TimothyZhang7)
- **Agent Guardian watchdog** -- Event-driven monitor that catches secondary agent failures and triggers automatic remediation, with `--no-guardian` CLI flag. (@TimothyZhang7)

#### New Tool Integrations

| Tool                   | Description                                                                                                                                                            | Contributor        |
| ---------------------- | ---------------------------------------------------------------------------------------------------------------------------------------------------------------------- | ------------------ |
| **Discord**            | 4 MCP tools (`discord_list_guilds`, `discord_list_channels`, `discord_send_message`, `discord_get_messages`) with rate-limit retry and channel filtering               | @mishrapravin114   |
| **Exa Search API**     | 4 AI-powered search tools (`exa_search`, `exa_find_similar`, `exa_get_contents`, `exa_answer`) with neural/keyword search, domain filters, and citation-backed answers | @JeetKaria06       |
| **Razorpay**           | 6 payment processing tools for payments, invoices, payment links, and refunds with HTTP Basic Auth                                                                     | @shivamshahi07     |
| **Google Docs**        | Document creation, reading, and editing with OAuth credential support                                                                                                  | @haliaeetusvocifer |
| **Gmail enhancements** | Expanded mail operations for inbox management                                                                                                                          | @bryanadenhq       |

#### Infrastructure

- **Default node type → `event_loop`** -- `NodeSpec.node_type` defaults to `"event_loop"` instead of `"llm_tool_use"`. (@TimothyZhang7)
- **Default `max_node_visits` → 0 (unlimited)** -- Nodes default to unlimited visits, reducing friction for feedback loops and forever-alive agents. (@TimothyZhang7)
- **Remove `function` field from NodeSpec** -- Follows deprecation of `FunctionNode`. (@TimothyZhang7)
- **LiteLLM OAuth patch** -- Correct header construction for OAuth tokens (remove `x-api-key` when Bearer token is present). (@TimothyZhang7)
- **Orchestrator config centralization** -- Reads `api_key`, `api_base`, `extra_kwargs` from centralized `~/.hive/configuration.json`. (@TimothyZhang7)
- **System prompt datetime injection** -- All system prompts now include current date/time for time-aware agent behavior. (@TimothyZhang7)
- **Utils module exports** -- Proper `__init__.py` exports for the utils module. (@Siddharth2624)
- **Increased default max_tokens** -- Opus 4.6 defaults to 32768, Sonnet 4.5 to 16384 (up from 8192). (@TimothyZhang7)

---

### Bug Fixes

- Flush WIP accumulator outputs on cancel/failure so edge conditions see correct values on resume
- Stall detection state preserved across resume (no more resets on checkpoint restore)
- Skip client-facing blocking for event-triggered executions (timer/webhook)
- Executor retry override scoped to actual EventLoopNode instances only
- Add `_awaiting_input` flag to EventLoopNode to prevent input injection race conditions
- Fix TUI streaming display (tokens no longer appear one-per-line)
- Fix `_return_from_escalation` crash when ChatRepl widgets not yet mounted
- Fix tools registration problems for Google Docs credentials (@RichardTang-Aden)
- Fix email agent version conflicts (@RichardTang-Aden)
- Fix coder tool timeouts (120s for tests, 300s cap for commands)

### Documentation

- Clarify installation and prevent root pip install misuse (@paarths-collab)

---

### Agent Updates

- **Email Inbox Management** -- Consolidate `gmail_inbox_guardian` and `inbox_management` into a single unified agent with updated prompts and config. (@RichardTang-Aden, @bryanadenhq)
- **Job Hunter** -- Updated node prompts, config, and agent metadata; added PDF resume selection. (@bryanadenhq)
- **Deep Research Agent** -- Revised node implementations with updated prompts and output handling.
- **Tech News Reporter** -- Revised node prompts for improved output quality.
- **Vulnerability Assessment** -- Expanded prompts with more detailed assessment instructions. (@bryanadenhq)

---

### Breaking Changes

- **Deprecated node types raise `RuntimeError`** -- `llm_tool_use`, `llm_generate`, `function`, `router`, `human_input` now fail instead of warning. Migrate to `event_loop`.
- **`NodeSpec.node_type` defaults to `"event_loop"`** (was `"llm_tool_use"`)
- **`NodeSpec.max_node_visits` defaults to `0` / unlimited** (was `1`)
- **`NodeSpec.function` field removed** -- `FunctionNode` is deleted; use event_loop nodes with tools instead.

---

### Community Contributors

A huge thank you to everyone who contributed to this release:

- **Richard Tang** (@RichardTang-Aden) -- Interactive credential setup, pre-start confirmation, email agent consolidation, tool registration fixes, lint and formatting
- **Pravin Mishra** (@mishrapravin114) -- Discord integration with 4 MCP tools
- **Jeet Karia** (@JeetKaria06) -- Exa Search API integration with 4 AI-powered search tools
- **Shivam Shahi** (@shivamshahi07) -- Razorpay payment processing integration
- **Siddharth Varshney** (@Siddharth2624) -- Utils module exports
- **@haliaeetusvocifer** -- Google Docs integration with OAuth support
- **Bryan** (@bryanadenhq) -- PDF selection, inbox agent fixes, Job Hunter and Vulnerability Assessment updates
- **@paarths-collab** -- Documentation improvements

---

### Upgrading

```bash
git pull origin main
uv sync
```

#### Migration Guide

If your agents use deprecated node types, update them:

```python
# Before (v0.5.0) -- these now raise RuntimeError
NodeSpec(node_type="llm_tool_use", ...)
NodeSpec(node_type="function", function=my_func, ...)

# After (v0.5.1) -- use event_loop for everything
NodeSpec(node_type="event_loop", ...)  # or just omit node_type (it's the default now)
```

If your agents set `max_node_visits=1` explicitly, they'll still work. The only change is the _default_ -- new agents without an explicit value now get unlimited visits.

To try the new Hive Coder:

```bash
# Launch Coder directly
hive code

# Or from TUI -- press Ctrl+E to escalate
hive tui
```


================================================
FILE: CONTRIBUTING.md
================================================
# Contributing to Aden Hive

> **"The best way to predict the future is to invent it."** — Alan Kay

Welcome to Aden Hive, an open-source AI agent framework built for developers who demand production-grade reliability, cross-platform support, and real-world performance. This guide will help you contribute effectively, whether you're fixing bugs, adding features, improving documentation, or building new tools.

Thank you for your interest in contributing! We're especially looking for help building tools, integrations ([check #2805](https://github.com/adenhq/hive/issues/2805)), and example agents for the framework.

---

## Table of Contents

1. [Code of Conduct](#code-of-conduct)
2. [Philosophy: Why We Build in the Open](#philosophy-why-we-build-in-the-open)
3. [Issue Assignment Policy](#issue-assignment-policy)
4. [Getting Started](#getting-started)
5. [OS Support: Write Once, Run Everywhere](#os-support-write-once-run-everywhere)
6. [Development Setup & Tooling](#development-setup--tooling)
7. [Tooling & Skills Required](#tooling--skills-required)
8. [LLM Models & Providers](#llm-models--providers)
9. [Sample Prompts & Agent Examples](#sample-prompts--agent-examples)
10. [Performance Metrics & Benchmarking](#performance-metrics--benchmarking)
11. [Commit Convention](#commit-convention)
12. [Pull Request Process](#pull-request-process)
13. [Code Style & Standards](#code-style--standards)
14. [Testing Philosophy](#testing-philosophy)
15. [Priority Contribution Areas](#priority-contribution-areas)
16. [Troubleshooting](#troubleshooting)
17. [Questions & Community](#questions--community)

---

## Code of Conduct

By participating in this project, you agree to abide by our [Code of Conduct](docs/CODE_OF_CONDUCT.md).

We follow the [Contributor Covenant](https://www.contributor-covenant.org/). In short:
- Be welcoming and inclusive
- Respect differing viewpoints
- Accept constructive criticism gracefully
- Focus on what's best for the community
- Show empathy towards others

---

## Philosophy: Why We Build in the Open

Like Linux, TypeScript, and PSPDFKit, **Aden Hive is built by practitioners for practitioners**. We believe:

- **Quality over speed**: A well-tested feature beats a rushed release
- **Transparency over mystery**: Every decision is documented and reviewable
- **Community over ego**: The best idea wins, regardless of who suggests it
- **Performance matters**: Agents should be fast, efficient, and measurable
- **Cross-platform is non-negotiable**: If it doesn't work on Windows, macOS, and Linux, it's not done

Our goal is to deliver **developer success** through:
1. **Reliability** — Agents that work consistently across platforms
2. **Observability** — Clear insights into what agents are doing and why
3. **Extensibility** — Easy to add new tools, models, and capabilities
4. **Performance** — Fast execution with measurable metrics

---

## Issue Assignment Policy

To prevent duplicate work and respect contributors' time, we require issue assignment before submitting PRs.

### How to Claim an Issue

1. **Find an Issue:** Browse existing issues or create a new one
2. **Claim It:** Leave a comment (e.g., *"I'd like to work on this!"*)
3. **Wait for Assignment:** A maintainer will assign you within 24 hours. Issues with reproducible steps or proposals are prioritized.
4. **Submit Your PR:** Once assigned, you're ready to contribute

> **Note:** PRs for unassigned issues may be delayed or closed if someone else was already assigned.

### Exceptions (No Assignment Needed)

You may submit PRs without prior assignment for:
- **Documentation:** Fixing typos or clarifying instructions — add the `documentation` label or include `doc`/`docs` in your PR title to bypass the linked issue requirement
- **Micro-fixes:** Add the `micro-fix` label or include `micro-fix` in your PR title to bypass the linked issue requirement. Micro-fixes must meet **all** qualification criteria:

  | Qualifies | Disqualifies |
  |-----------|--------------|
  | < 20 lines changed | Any functional bug fix |
  | Typos & Documentation & Linting | Refactoring for "clean code" |
  | No logic/API/DB changes | New features (even tiny ones) |

---

## Getting Started

### Quick Setup

```bash
# Clone the repository
git clone https://github.com/aden-hive/hive.git
cd hive

# Automated setup (installs uv, dependencies, and runs tests)
./quickstart.sh

# Or manual setup
uv venv
source .venv/bin/activate  # On Windows: .venv\Scripts\activate
uv sync
```

### Fork and Branch Workflow

1. Fork the repository
2. Clone your fork: `git clone https://github.com/YOUR_USERNAME/hive.git`
3. Add the upstream repository: `git remote add upstream https://github.com/aden-hive/hive.git`
4. Sync with upstream to ensure you're starting from the latest code:
   ```bash
   git fetch upstream
   git checkout main
   git merge upstream/main
   ```
5. Create a feature branch: `git checkout -b feature/your-feature-name`
6. Make your changes
7. Run checks and tests:
   ```bash
   make check    # Lint and format checks
   make test     # Core tests
   ```
   On Windows (no make), run directly:
   ```powershell
   uv run ruff check core/ tools/
   uv run ruff format --check core/ tools/
   uv run pytest core/tests/
   ```
8. Commit your changes following our commit conventions
9. Push to your fork and submit a Pull Request

### Verify Installation

```bash
# Run core tests
uv run pytest core/tests/

# Run tool tests (mocked, no real API calls)
uv run pytest tools/tests/

# Run linter
uv run ruff check .

# Run formatter
uv run ruff format .
```

---

## OS Support: Write Once, Run Everywhere

Aden Hive runs on **macOS, Windows, and Linux** with platform-specific optimizations.

### Current OS Support Matrix

| Feature | macOS | Windows | Linux | Notes |
|---------|-------|---------|-------|-------|
| Core Framework | ✅ | ✅ | ✅ | Fully tested |
| CLI Runner | ✅ | ✅ | ✅ | Platform-aware terminal handling |
| File Operations | ✅ | ✅ | ✅ | Atomic writes with ACL preservation (Windows) |
| Browser Automation | ✅ | ✅ | ✅ | Playwright-based |
| Process Spawning | ✅ | ✅ | ✅ | subprocess + asyncio |
| Credential Storage | ✅ | ✅ | ✅ | `~/.hive/credentials` |
| Web Dashboard | ✅ | ✅ | ✅ | React + FastAPI |

### Platform-Specific Code

**Windows Support** (`core/framework/credentials/_win32_atomic.py`)
- Uses `ReplaceFileW` API for atomic file replacement
- Preserves NTFS DACL (Discretionary Access Control Lists)
- Handles FAT32 vs NTFS volume detection

**macOS Support**
- Uses `open` command for browser launching
- Native terminal support with ANSI colors

**Linux Support**
- Uses `xdg-open` for browser launching
- Full systemd integration for daemon mode (future)

### Cross-Platform Best Practices

Use `pathlib.Path` for all file operations:

```python
from pathlib import Path

# ✅ Good: Cross-platform
config_path = Path.home() / ".hive" / "config.json"

# ❌ Bad: Unix-only
config_path = "~/.hive/config.json"
```

Use platform checks when needed:

```python
import sys
if sys.platform == "win32":
    # Windows-specific code
elif sys.platform == "darwin":
    # macOS-specific code
else:  # linux
    # Linux-specific code
```

### Priority Areas for OS Contributions

- [ ] **Windows WSL2 optimization** — Better detection and native integration
- [ ] **Linux systemd service** — Daemon mode for long-running agents
- [ ] **macOS app bundle** — `.app` distribution with proper sandboxing
- [ ] **Windows installer** — `.msi` or `.exe` installer with PATH setup
- [ ] **Docker images** — Official multi-arch images (amd64, arm64)

---

## Development Setup & Tooling

### Prerequisites

- **Python 3.11+** (3.12 or 3.13 recommended)
- **Git** for version control
- **uv** for package management (installed automatically by quickstart)
- **Node.js 18+** (optional, for frontend development)

> **Windows Users:**
> Native Windows is supported. Use `.\quickstart.ps1` for setup and `.\hive.ps1` to run (PowerShell 5.1+). Disable "App Execution Aliases" in Windows settings to avoid Python path conflicts. WSL is also an option but not required.

> **Tip:** Installing Claude Code skills is optional for running existing agents, but required if you plan to **build new agents**.

### Package Management with `uv`

`uv` is a fast Python package installer and resolver (replaces pip + venv):

```bash
# Install uv
curl -LsSf https://astral.sh/uv/install.sh | sh

# Install/sync dependencies
uv sync

# Add a new dependency
uv add <package>

# Run Python scripts
uv run python -m your_module

# Run pytest
uv run pytest
```

### Code Quality Tools

**ruff** — Fast Python linter and formatter (replaces black, isort, flake8)

```bash
# Format code
uv run ruff format .

# Check linting issues
uv run ruff check .

# Auto-fix linting issues
uv run ruff check . --fix
```

Configuration in `pyproject.toml`:
```toml
[tool.ruff]
line-length = 100
target-version = "py311"
```

### Makefile Targets

```bash
make lint          # Run ruff format + check
make check         # CI-safe checks (no modifications)
make test          # Run all tests
make test-tools    # Run tool tests only
make test-live     # Run live API integration tests (requires credentials)
```

### Recommended IDE Setup

**VS Code** (`.vscode/settings.json`)
```json
{
  "python.defaultInterpreterPath": "${workspaceFolder}/.venv/bin/python",
  "python.linting.enabled": true,
  "python.linting.ruffEnabled": true,
  "python.formatting.provider": "none",
  "[python]": {
    "editor.defaultFormatter": "charliermarsh.ruff",
    "editor.formatOnSave": true,
    "editor.codeActionsOnSave": {
      "source.fixAll": true,
      "source.organizeImports": true
    }
  }
}
```

**PyCharm**
- Enable ruff plugin
- Set Python interpreter to `.venv/bin/python`
- Enable pytest as test runner

---

## Tooling & Skills Required

### Required Skills by Contribution Type

**Core Framework Development**
- **Python 3.11+** with asyncio, type hints, and Pydantic
- **Graph theory** basics (nodes, edges, DAG traversal)
- **LLM fundamentals** (prompting, context windows, streaming)
- **Testing** with pytest, mocking, and async tests

**Tool Development** (99+ tools available)
- **API integration** (REST, GraphQL, WebSocket)
- **OAuth flows** (OAuth2, PKCE, refresh tokens)
- **MCP (Model Context Protocol)** for tool registration
- **Error handling** and retry logic

**Frontend Development** (Optional)
- **React 18+** with TypeScript
- **WebSocket** for real-time updates
- **Tailwind CSS** for styling

### Useful Development Commands

```bash
# Run tests with coverage
uv run pytest --cov=core --cov-report=html

# Run tests in parallel
uv run pytest -n auto

# Run only fast tests (skip live API tests)
uv run pytest -m "not live"

# Run linter with auto-fix
uv run ruff check . --fix

# Format code
uv run ruff format .

# Type checking (if using mypy)
uv run mypy core/

# Run a specific agent
uv run python -m exports.ai_outreach_architect
```

### Skills by Contribution Level

**Beginner-Friendly**
- Writing sample prompts (see `/examples/recipes/`)
- Fixing documentation typos
- Adding tool integrations (use existing tools as templates)
- Writing unit tests for existing code

**Intermediate**
- Building custom agents
- Adding new LLM provider support
- Improving error messages
- Adding new node types

**Advanced**
- Optimizing graph execution performance
- Building new judge evaluation methods
- Implementing cross-agent memory sharing
- Adding distributed execution support

---

## LLM Models & Providers

Aden Hive supports **100+ LLM providers** via LiteLLM, giving users maximum flexibility.

### Supported Providers

| Provider | Models | Notes |
|----------|--------|-------|
| **Anthropic** | Claude 3.5 Sonnet, Haiku, Opus | Default provider, best for reasoning |
| **OpenAI** | GPT-4, GPT-4 Turbo, GPT-4o | Function calling, vision |
| **Google** | Gemini 1.5 Pro, Flash | Long context windows |
| **DeepSeek** | DeepSeek V3 | Cost-effective, strong reasoning |
| **Mistral** | Mistral Large, Medium, Small | Open weights, EU hosting |
| **Groq** | Llama 3, Mixtral | Ultra-fast inference |
| **Ollama** | Any local model | Privacy-first, no API costs |
| **Azure OpenAI** | GPT-4, GPT-3.5 | Enterprise SSO, compliance |
| **Cohere** | Command, Command Light | Strong embeddings |
| **Together AI** | Open-source models | Flexible hosting |
| **Bedrock** | AWS-hosted models | Enterprise integration |

### Default Configuration

```python
# core/framework/llm/provider.py
DEFAULT_MODEL = "claude-haiku-4-5-20251001"
```

### Model Selection Guidelines

**For Production Agents**
- **Reliability**: Claude 3.5 Sonnet (best reasoning)
- **Speed**: Claude Haiku or GPT-4o-mini (fast responses)
- **Cost**: DeepSeek or Gemini Flash (budget-conscious)
- **Privacy**: Ollama with local models (no data leaves server)

**For Development**
- Use cheaper/faster models (Haiku, GPT-4o-mini)
- Test with multiple providers to catch provider-specific issues
- Mock LLM calls in unit tests

### How to Add a New LLM Provider

1. **Check if LiteLLM supports it** (most providers already work out of the box)
2. **Add credential handling** in `core/framework/credentials/`
3. **Add provider-specific configuration** in `core/framework/llm/`
4. **Write tests** in `core/tests/test_llm_provider.py`
5. **Update documentation** in `docs/llm_providers.md`

**Example: Testing LLM Integration**

```python
# core/tests/test_llm_provider.py
import pytest
from framework.llm.anthropic import AnthropicProvider

@pytest.mark.asyncio
async def test_anthropic_provider_basic():
    provider = AnthropicProvider(api_key="test_key", model="claude-3-5-sonnet-20241022")
    response = await provider.generate([{"role": "user", "content": "Hello"}])
    assert response.content
    assert response.model == "claude-3-5-sonnet-20241022"

@pytest.mark.live
@pytest.mark.asyncio
async def test_anthropic_provider_real(anthropic_api_key):
    """Live test with real API (requires credentials)"""
    provider = AnthropicProvider(api_key=anthropic_api_key)
    response = await provider.generate([{"role": "user", "content": "What is 2+2?"}])
    assert "4" in response.content
```

### Priority Areas for LLM Contributions

- [ ] **Cost tracking per agent** — Track spend by agent/workflow
- [ ] **Model degradation policies** — Auto-fallback to cheaper models
- [ ] **Context window optimization** — Smart truncation strategies
- [ ] **Streaming improvements** — Better UX for long-running tasks
- [ ] **Vision model support** — Standardized image input handling
- [ ] **Local model fine-tuning** — Tools for fine-tuning Llama/Mistral models
- [ ] **Provider benchmarks** — Speed, quality, cost comparison dashboard

---

## Sample Prompts & Agent Examples

We provide **100+ sample prompts** covering real-world use cases.

### Where to Find Sample Prompts

**1. Recipe Prompts** (`/examples/recipes/sample_prompts_for_use_cases.md`)
- 100 production-ready agent prompts
- Categories: Marketing, Sales, Operations, Engineering, Finance
- Copy-paste ready for quick experimentation

**2. Template Agents** (`/examples/templates/`)
- Competitive Intelligence Agent
- Deep Research Agent
- Tech News Reporter
- Vulnerability Assessment
- Email Inbox Management
- Job Hunter

**3. Exported Agents** (`/exports/`)
- 17+ production agents built by the community
- AI Outreach Architect
- Financial AI Auditor
- Gmail Star Drafter
- GitHub Reply Agent

### Agent Prompt Structure

Every agent prompt should include:

1. **Role definition** — "You are a [role]..."
2. **Goal statement** — "Your job is to..."
3. **Step-by-step process** — Clear, numbered instructions
4. **Output format** — JSON schema or structured format
5. **Edge cases** — How to handle failures, missing data, etc.

**Example: High-Quality Agent Prompt**

```markdown
You are an elite Competitive Intelligence Analyst.

Your job is to monitor competitor websites, extract pricing and feature updates,
and produce a weekly intelligence report.

**STEP 1 — Discovery**
1. Use web_search to find the competitor's pricing page, changelog, and blog
2. Try queries like: "{competitor_name} pricing 2025"
3. If no results, navigate directly to their known domain

**STEP 2 — Extraction**
1. Use web_scrape on each relevant URL
2. Extract: pricing tiers, feature changes, announcement dates
3. Format as JSON: {competitor, category, update, source, date}

**STEP 3 — Analysis**
1. Compare current data with last week's snapshot (load_data)
2. Flag significant changes (>10% price change, new features)
3. Save current snapshot (save_data)

**STEP 4 — Reporting**
1. Generate HTML report with key highlights
2. Include comparison table and trend analysis
3. Call serve_file_to_user to deliver the report

**Important:**
- Be factual — only report what you actually see
- Skip URLs that fail to load
- Prioritize recent content (last 7 days)
```

### How to Contribute Sample Prompts

1. **Test your prompt** with a real agent first
2. **Document the use case** clearly
3. **Include expected tools** needed (web_search, save_data, etc.)
4. **Add to the appropriate category** in `/examples/recipes/sample_prompts_for_use_cases.md`
5. **Submit a PR** with title: `docs: add sample prompt for [use case]`

### Prompt Quality Checklist

- [ ] Role is clearly defined
- [ ] Steps are numbered and actionable
- [ ] Output format is specified (JSON schema preferred)
- [ ] Edge cases are handled (failures, missing data, rate limits)
- [ ] Tools are explicitly mentioned
- [ ] Tested with at least one real execution

### Priority Areas for Prompt Contributions

- [ ] **Industry-specific agents** — Healthcare, Legal, Finance, Education
- [ ] **Multilingual prompts** — Non-English agent templates
- [ ] **Error recovery patterns** — How agents should handle failures
- [ ] **Human-in-the-loop prompts** — When to ask for approval
- [ ] **Multi-agent coordination** — How agents delegate to sub-agents

---

## Performance Metrics & Benchmarking

**Performance is a feature.** Slow agents frustrate users. We measure everything.

### Key Performance Metrics

| Metric | Target | How to Measure |
|--------|--------|----------------|
| **Agent Latency** | <30s for simple tasks | `RuntimeLogger.log_execution_time()` |
| **LLM Token Usage** | <10K tokens/task | `LiteLLM.track_cost()` |
| **Tool Call Success Rate** | >95% | `ToolExecutor.success_rate()` |
| **Judge Accuracy** | >90% agreement with human | Manual evaluation |
| **Memory Usage** | <500MB per agent | `psutil.Process().memory_info()` |
| **Concurrent Agents** | 10+ agents on 4-core CPU | Load testing |

### Current Monitoring Tools

**Runtime Performance**
```python
# core/framework/runtime/runtime_logger.py
class RuntimeLogger:
    def log_node_execution(self, node_id: str, duration: float, tokens: int):
        # Tracks per-node performance
        pass

    def log_tool_call(self, tool_name: str, duration: float, success: bool):
        # Tracks tool latency and reliability
        pass
```

**LLM Cost Tracking**
```python
# LiteLLM automatically tracks cost per request
from litellm import completion_cost
cost = completion_cost(model="claude-3-5-sonnet-20241022", messages=[...])
```

**Monitoring Dashboard** (`/core/framework/monitoring/`)
- WebSocket-based real-time monitoring
- Displays: active agents, tool calls, token usage, errors
- Access at: `http://localhost:8000/monitor`

### How to Add Performance Metrics

**1. Instrument your code**
```python
import time
from framework.runtime.runtime_logger import RuntimeLogger

logger = RuntimeLogger()

start = time.time()
result = await expensive_operation()
duration = time.time() - start

logger.log_execution_time("expensive_operation", duration)
```

**2. Add tests with performance assertions**
```python
@pytest.mark.asyncio
async def test_agent_performance():
    start = time.time()
    result = await run_agent(...)
    duration = time.time() - start

    assert duration < 30.0, f"Agent took {duration}s (expected <30s)"
    assert result.total_tokens < 10000, f"Used {result.total_tokens} tokens (expected <10K)"
```

**3. Create benchmark scripts** (`/benchmarks/`)
```python
# benchmarks/bench_agent_latency.py
import asyncio
import statistics
from exports.my_agent import MyAgent

async def benchmark_agent(iterations: int = 100):
    durations = []
    for i in range(iterations):
        start = time.time()
        await MyAgent().run("test input")
        durations.append(time.time() - start)

    print(f"Mean: {statistics.mean(durations):.2f}s")
    print(f"P50: {statistics.median(durations):.2f}s")
    print(f"P99: {statistics.quantiles(durations, n=100)[98]:.2f}s")

asyncio.run(benchmark_agent())
```

### Performance Optimization Tips

**1. Reduce LLM Calls**
- Cache repetitive responses
- Use cheaper models for simple tasks (Haiku vs Sonnet)
- Batch multiple questions into one prompt

**2. Optimize Tool Calls**
- Run independent tool calls in parallel (`asyncio.gather`)
- Cache API responses when appropriate
- Use webhooks instead of polling

**3. Memory Management**
- Use streaming for large files (don't load entire file into memory)
- Clear conversation history periodically
- Use database for large datasets (not in-memory)

**4. Graph Execution**
- Minimize sequential dependencies (more parallelism)
- Use conditional edges to skip unnecessary nodes
- Set appropriate timeouts

### Priority Areas for Performance Contributions

- [ ] **Comprehensive benchmark suite** — Standard tasks across providers
- [ ] **Real-time performance dashboard** — Live monitoring during execution
- [ ] **Cost tracking per agent/workflow** — Budget management
- [ ] **Provider comparison dashboard** — Speed, quality, cost metrics
- [ ] **Automatic performance regression detection** — CI integration

---

## Commit Convention

We follow [Conventional Commits](https://www.conventionalcommits.org/):

```
type(scope): description

[optional body]

[optional footer]
```

**Types:**
- `feat`: New feature
- `fix`: Bug fix
- `docs`: Documentation changes
- `style`: Code style changes (formatting, etc.)
- `refactor`: Code refactoring
- `test`: Adding or updating tests
- `chore`: Maintenance tasks
- `perf`: Performance improvements

**Examples:**
```
feat(auth): add OAuth2 login support
fix(api): handle null response from external service
docs(readme): update installation instructions
test(graph): add integration tests for graph executor
perf(llm): reduce token usage by 30% with prompt caching
```

---

## Pull Request Process

1. **Get assigned to the issue first** (see [Issue Assignment Policy](#issue-assignment-policy))
2. Update documentation if needed
3. Add tests for new functionality
4. Ensure `make check` and `make test` pass
5. Request review from maintainers

### PR Title Format

Follow the same convention as commits:
```
feat(component): add new feature description
```

### PR Template

```markdown
## Description
Brief description of what this PR does.

## Motivation
Why is this change needed?

## Changes
- Added X
- Fixed Y
- Updated Z

## Testing
- [ ] Unit tests added/updated
- [ ] Integration tests added/updated
- [ ] Tested on macOS
- [ ] Tested on Windows
- [ ] Tested on Linux

## Checklist
- [ ] Code follows style guidelines (ruff)
- [ ] Self-review completed
- [ ] Documentation updated
- [ ] No breaking changes (or documented if unavoidable)

Closes #123
```

---

## Code Style & Standards

### Project Structure

- `core/` - Core framework (agent runtime, graph executor, protocols)
- `tools/` - MCP Tools Package (tools for agent capabilities)
- `exports/` - Agent packages and examples
- `docs/` - Documentation
- `scripts/` - Build and utility scripts
- `.claude/` - Claude Code skills for building/testing agents

### Python Style Guidelines

- Use Python 3.11+ for all new code
- Follow PEP 8 style guide
- Add type hints to function signatures
- Write docstrings for classes and public functions
- Use meaningful variable and function names
- Keep functions focused and small
- **Line length**: 100 characters
- **Formatting**: Use `ruff format` (no manual formatting)
- **Linting**: Use `ruff check` (no warnings tolerated)

For linting and formatting (Ruff, pre-commit hooks), see [Linting & Formatting Setup](docs/contributing-lint-setup.md).

### Example: Good Code

```python
from typing import Optional
from pydantic import BaseModel

class AgentConfig(BaseModel):
    """Configuration for agent execution.

    Attributes:
        model: LLM model name (e.g., "claude-3-5-sonnet-20241022")
        max_tokens: Maximum tokens for completion (default: 4096)
        temperature: Sampling temperature 0.0-1.0 (default: 0.7)
    """
    model: str
    max_tokens: int = 4096
    temperature: float = 0.7

async def run_agent(config: AgentConfig, timeout: Optional[float] = None) -> dict:
    """Run an agent with the given configuration.

    Args:
        config: Agent configuration
        timeout: Optional timeout in seconds (default: no timeout)

    Returns:
        Dictionary containing agent results and metadata

    Raises:
        TimeoutError: If execution exceeds timeout
        ValueError: If config is invalid
    """
    # Implementation
    pass
```

### Architecture Principles

1. **Separation of concerns** — One class, one responsibility
2. **Dependency injection** — Pass dependencies explicitly (no global state)
3. **Async by default** — Use `async/await` for I/O operations
4. **Error handling** — Catch specific exceptions, log errors, fail gracefully
5. **Immutability** — Prefer immutable data structures (Pydantic models)

### Code Review Checklist

**For Authors**
- [ ] Self-review your diff before submitting
- [ ] All tests pass locally
- [ ] No commented-out code or debug prints
- [ ] No breaking changes (or documented if unavoidable)
- [ ] Documentation updated
- [ ] Conventional commit format used

**For Reviewers**
- [ ] Does the code solve the stated problem?
- [ ] Is the code readable and maintainable?
- [ ] Are there tests covering the new code?
- [ ] Are edge cases handled?
- [ ] Is performance acceptable?
- [ ] Does it follow existing patterns in the codebase?

---

## Testing Philosophy

> **"If it's not tested, it's broken."** — Linus Torvalds

### Test Pyramid

```
       /\
      /  \     End-to-End Tests (5%)
     /----\    Integration Tests (15%)
    /      \   Unit Tests (80%)
   /________\
```

### Types of Tests

**Unit Tests** (80% of tests)
- Test individual functions/classes in isolation
- Fast (<1ms per test)
- No external dependencies (mock everything)
- Live in `/core/tests/` and `/tools/tests/`

**Integration Tests** (15% of tests)
- Test multiple components together
- Moderate speed (<1s per test)
- May use test databases or mock APIs
- Live in `/core/tests/integration/`

**Live Tests** (5% of tests)
- Test against real external APIs
- Slow (>1s per test)
- Require credentials
- Marked with `@pytest.mark.live` (skipped by default)

### Running Tests

> **Note:** When testing agents in `exports/`, always set PYTHONPATH:
>
> ```bash
> PYTHONPATH=exports uv run python -m agent_name test
> ```

```bash
# Run lint and format checks (mirrors CI lint job)
make check

# Run core framework tests (mirrors CI test job)
make test

# Or run tests directly
cd core && pytest tests/ -v

# Run tools package tests (when contributing to tools/)
cd tools && uv run pytest tests/ -v

# Run tests for a specific agent
PYTHONPATH=exports uv run python -m agent_name test

# Run specific test file
uv run pytest core/tests/test_graph_executor.py

# Run specific test function
uv run pytest core/tests/test_graph_executor.py::test_simple_execution

# Run with coverage
uv run pytest --cov=core --cov-report=html

# Run in parallel
uv run pytest -n auto

# Run live tests (requires credentials)
uv run pytest -m live

# Run only fast tests
uv run pytest -m "not live"
```

> **CI also validates** that all exported agent JSON files (`exports/*/agent.json`) are well-formed JSON. Ensure your agent exports are valid before submitting.

### Test Coverage Goals

- **Core framework**: >90% coverage
- **Tools**: >80% coverage (some tools are hard to mock)
- **Critical paths**: 100% coverage (graph execution, credential handling, LLM calls)

### Example: Writing Tests

**Unit Test**
```python
import pytest
from framework.graph.node import Node

def test_node_creation():
    node = Node(id="test", name="Test Node", node_type="event_loop")
    assert node.id == "test"
    assert node.name == "Test Node"
    assert node.node_type == "event_loop"

@pytest.mark.asyncio
async def test_node_execution():
    node = Node(id="test", name="Test Node", node_type="event_loop")
    result = await node.execute({"input": "test"})
    assert result["status"] == "success"
```

**Integration Test**
```python
import pytest
from framework.graph.executor import GraphExecutor
from framework.graph.node import Node

@pytest.mark.asyncio
async def test_graph_execution_with_multiple_nodes():
    nodes = [
        Node(id="node1", ...),
        Node(id="node2", ...),
    ]
    edges = [...]

    executor = GraphExecutor(nodes, edges)
    result = await executor.run({"input": "test"})

    assert result["status"] == "success"
    assert "node1" in result["executed_nodes"]
    assert "node2" in result["executed_nodes"]
```

**Live Test**
```python
import pytest
import os

@pytest.mark.live
@pytest.mark.asyncio
async def test_anthropic_real_api():
    """Test against real Anthropic API (requires ANTHROPIC_API_KEY)"""
    api_key = os.getenv("ANTHROPIC_API_KEY")
    if not api_key:
        pytest.skip("ANTHROPIC_API_KEY not set")

    provider = AnthropicProvider(api_key=api_key)
    response = await provider.generate([{"role": "user", "content": "What is 2+2?"}])

    assert "4" in response.content
```

---

## Priority Contribution Areas

### High-Priority Areas

**1. Cross-Platform Support**
- [ ] Windows installer (`.msi` or `.exe`)
- [ ] Linux systemd service for daemon mode
- [ ] macOS app bundle (`.app` distribution)
- [ ] Docker images (multi-arch: amd64, arm64)

**2. Performance & Monitoring**
- [ ] Comprehensive benchmark suite
- [ ] Real-time performance dashboard
- [ ] Cost tracking per agent/workflow
- [ ] Provider comparison dashboard

**3. Developer Experience**
- [ ] Interactive agent builder CLI
- [ ] Visual graph editor (web-based)
- [ ] Improved error messages with suggestions
- [ ] Auto-generated agent documentation

**4. Tool Ecosystem**
- [ ] More database connectors (ClickHouse, TimescaleDB)
- [ ] More communication tools (WhatsApp, SMS)
- [ ] Cloud platform integrations (GCP, Azure)
- [ ] Developer tools (Figma, Linear, Notion)

**5. LLM & AI**
- [ ] Fine-tuning pipeline for local models
- [ ] Context window optimization strategies
- [ ] Multi-modal support (vision, audio)
- [ ] Embedding-based memory search

**6. Testing & Quality**
- [ ] Increase test coverage to >90%
- [ ] Add property-based testing (Hypothesis)
- [ ] Add mutation testing
- [ ] Add fuzzing for security-critical code

**7. Documentation**
- [ ] Video tutorials for common workflows
- [ ] Interactive playground (try agents in browser)
- [ ] Architecture decision records (ADRs)
- [ ] Case studies from production users

### Beginner-Friendly Contributions

- [ ] Add sample prompts to `/examples/recipes/`
- [ ] Improve error messages with helpful hints
- [ ] Add docstrings to undocumented functions
- [ ] Write tutorial blog posts
- [ ] Fix typos in documentation
- [ ] Add more unit tests to increase coverage
- [ ] Create visual diagrams for architecture docs

### Intermediate Contributions

- [ ] Add new tool integrations
- [ ] Build example agents for specific industries
- [ ] Optimize slow graph execution paths
- [ ] Add new LLM provider support
- [ ] Improve CLI UX with better prompts/colors
- [ ] Add integration tests for critical workflows

### Advanced Contributions

- [ ] Design and implement distributed execution
- [ ] Build advanced judge evaluation methods
- [ ] Add cross-agent memory sharing
- [ ] Implement automatic graph optimization
- [ ] Add support for multi-agent coordination
- [ ] Build real-time collaboration features

---

## Troubleshooting

### `make: command not found`
Install `make` using:

```bash
sudo apt install make
```

### `uv: command not found`
Install `uv` using:

```bash
curl -LsSf https://astral.sh/uv/install.sh | sh
source ~/.bashrc
```

### `ruff: not found`
If linting fails due to a missing `ruff` command, install it with:

```bash
uv tool install ruff
```

### WSL Path Recommendation
When using WSL, it is recommended to clone the repository inside your Linux home directory (e.g., ~/hive) instead of under /mnt/c/... to avoid potential performance and permission issues.

### Test Failures
If tests fail locally but pass in CI:
1. Make sure you're using Python 3.11+
2. Run `uv sync` to ensure dependencies are up-to-date
3. Clear pytest cache: `rm -rf .pytest_cache`
4. Run tests in verbose mode: `pytest -vv`

---

## Questions & Community

### Where to Get Help

- **GitHub Issues** — Bug reports, feature requests
- **GitHub Discussions** — Questions, ideas, showcase
- **Discord** — Real-time chat ([join here](https://discord.com/invite/MXE49hrKDk))
- **Documentation** — `/docs/` and README files
- **Email** — team@adenhq.com (for security issues only)

### Communication Guidelines

1. **Be respectful** — We're all here to build something great
2. **Be patient** — Maintainers are volunteers with day jobs
3. **Be clear** — Provide context, examples, and reproduction steps
4. **Be constructive** — Suggest solutions, not just problems
5. **Be thankful** — Recognize contributions from others

### Recognition

We recognize contributors through:
- **Changelog mentions** — Every PR is credited in releases
- **Leaderboard** — Weekly recognition of top contributors
- **README credits** — Major contributors listed in README
- **Swag** — Stickers, t-shirts for significant contributions

---

## Contributor License Agreement

By submitting a Pull Request, you agree that your contributions will be licensed under the Aden Agent Framework license (Apache 2.0).

---

## Final Thoughts

Building open-source software is a marathon, not a sprint. **Quality beats quantity.** We'd rather merge 10 well-tested, thoughtfully-designed features than 100 rushed, buggy ones.

As Peter Steinberger (PSPDFKit) says: *"The best code is code that doesn't exist."* Before adding a feature, ask:
- Is this really needed?
- Can we solve this with existing tools?
- Will users actually use this?
- Can we make it simpler?

As Linus Torvalds (Linux) says: *"Talk is cheap. Show me the code."* We value:
- Working code over lengthy discussions
- Tests over promises
- Documentation over assumptions
- Benchmarks over claims

As Anders Hejlsberg (TypeScript) says: *"Make it work, make it right, make it fast."* In that order:
- First, get it working (pass tests)
- Then, get it right (clean code, good design)
- Finally, get it fast (optimize hot paths only)

---

**Thank you for contributing to Aden Hive.** Together, we're building the most reliable, performant, and developer-friendly AI agent framework in the world.

Now go build something amazing. 🚀


================================================
FILE: LICENSE
================================================
                                 Apache License
                           Version 2.0, January 2004
                        http://www.apache.org/licenses/

   TERMS AND CONDITIONS FOR USE, REPRODUCTION, AND DISTRIBUTION

   1. Definitions.

      "License" shall mean the terms and conditions for use, reproduction,
      and distribution as defined by Sections 1 through 9 of this document.

      "Licensor" shall mean the copyright owner or entity authorized by
      the copyright owner that is granting the License.

      "Legal Entity" shall mean the union of the acting entity and all
      other entities that control, are controlled by, or are under common
      control with that entity. For the purposes of this definition,
      "control" means (i) the power, direct or indirect, to cause the
      direction or management of such entity, whether by contract or
      otherwise, or (ii) ownership of fifty percent (50%) or more of the
      outstanding shares, or (iii) beneficial ownership of such entity.

      "You" (or "Your") shall mean an individual or Legal Entity
      exercising permissions granted by this License.

      "Source" form shall mean the preferred form for making modifications,
      including but not limited to software source code, documentation
      source, and configuration files.

      "Object" form shall mean any form resulting from mechanical
      transformation or translation of a Source form, including but
      not limited to compiled object code, generated documentation,
      and conversions to other media types.

      "Work" shall mean the work of authorship, whether in Source or
      Object form, made available under the License, as indicated by a
      copyright notice that is included in or attached to the work
      (an example is provided in the Appendix below).

      "Derivative Works" shall mean any work, whether in Source or Object
      form, that is based on (or derived from) the Work and for which the
      editorial revisions, annotations, elaborations, or other modifications
      represent, as a whole, an original work of authorship. For the purposes
      of this License, Derivative Works shall not include works that remain
      separable from, or merely link (or bind by name) to the interfaces of,
      the Work and Derivative Works thereof.

      "Contribution" shall mean any work of authorship, including
      the original version of the Work and any modifications or additions
      to that Work or Derivative Works thereof, that is intentionally
      submitted to the Licensor for inclusion in the Work by the copyright owner
      or by an individual or Legal Entity authorized to submit on behalf of
      the copyright owner. For the purposes of this definition, "submitted"
      means any form of electronic, verbal, or written communication sent
      to the Licensor or its representatives, including but not limited to
      communication on electronic mailing lists, source code control systems,
      and issue tracking systems that are managed by, or on behalf of, the
      Licensor for the purpose of discussing and improving the Work, but
      excluding communication that is conspicuously marked or otherwise
      designated in writing by the copyright owner as "Not a Contribution."

      "Contributor" shall mean Licensor and any individual or Legal Entity
      on behalf of whom a Contribution has been received by Licensor and
      subsequently incorporated within the Work.

   2. Grant of Copyright License. Subject to the terms and conditions of
      this License, each Contributor hereby grants to You a perpetual,
      worldwide, non-exclusive, no-charge, royalty-free, irrevocable
      copyright license to reproduce, prepare Derivative Works of,
      publicly display, publicly perform, sublicense, and distribute the
      Work and such Derivative Works in Source or Object form.

   3. Grant of Patent License. Subject to the terms and conditions of
      this License, each Contributor hereby grants to You a perpetual,
      worldwide, non-exclusive, no-charge, royalty-free, irrevocable
      (except as stated in this section) patent license to make, have made,
      use, offer to sell, sell, import, and otherwise transfer the Work,
      where such license applies only to those patent claims licensable
      by such Contributor that are necessarily infringed by their
      Contribution(s) alone or by combination of their Contribution(s)
      with the Work to which such Contribution(s) was submitted. If You
      institute patent litigation against any entity (including a
      cross-claim or counterclaim in a lawsuit) alleging that the Work
      or a Contribution incorporated within the Work constitutes direct
      or contributory patent infringement, then any patent licenses
      granted to You under this License for that Work shall terminate
      as of the date such litigation is filed.

   4. Redistribution. You may reproduce and distribute copies of the
      Work or Derivative Works thereof in any medium, with or without
      modifications, and in Source or Object form, provided that You
      meet the following conditions:

      (a) You must give any other recipients of the Work or
          Derivative Works a copy of this License; and

      (b) You must cause any modified files to carry prominent notices
          stating that You changed the files; and

      (c) You must retain, in the Source form of any Derivative Works
          that You distribute, all copyright, patent, trademark, and
          attribution notices from the Source form of the Work,
          excluding those notices that do not pertain to any part of
          the Derivative Works; and

      (d) If the Work includes a "NOTICE" text file as part of its
          distribution, then any Derivative Works that You distribute must
          include a readable copy of the attribution notices contained
          within such NOTICE file, excluding those notices that do not
          pertain to any part of the Derivative Works, in at least one
          of the following places: within a NOTICE text file distributed
          as part of the Derivative Works; within the Source form or
          documentation, if provided along with the Derivative Works; or,
          within a display generated by the Derivative Works, if and
          wherever such third-party notices normally appear. The contents
          of the NOTICE file are for informational purposes only and
          do not modify the License. You may add Your own attribution
          notices within Derivative Works that You distribute, alongside
          or as an addendum to the NOTICE text from the Work, provided
          that such additional attribution notices cannot be construed
          as modifying the License.

      You may add Your own copyright statement to Your modifications and
      may provide additional or different license terms and conditions
      for use, reproduction, or distribution of Your modifications, or
      for any such Derivative Works as a whole, provided Your use,
      reproduction, and distribution of the Work otherwise complies with
      the conditions stated in this License.

   5. Submission of Contributions. Unless You explicitly state otherwise,
      any Contribution intentionally submitted for inclusion in the Work
      by You to the Licensor shall be under the terms and conditions of
      this License, without any additional terms or conditions.
      Notwithstanding the above, nothing herein shall supersede or modify
      the terms of any separate license agreement you may have executed
      with Licensor regarding such Contributions.

   6. Trademarks. This License does not grant permission to use the trade
      names, trademarks, service marks, or product names of the Licensor,
      except as required for reasonable and customary use in describing the
      origin of the Work and reproducing the content of the NOTICE file.

   7. Disclaimer of Warranty. Unless required by applicable law or
      agreed to in writing, Licensor provides the Work (and each
      Contributor provides its Contributions) on an "AS IS" BASIS,
      WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or
      implied, including, without limitation, any warranties or conditions
      of TITLE, NON-INFRINGEMENT, MERCHANTABILITY, or FITNESS FOR A
      PARTICULAR PURPOSE. You are solely responsible for determining the
      appropriateness of using or redistributing the Work and assume any
      risks associated with Your exercise of permissions under this License.

   8. Limitation of Liability. In no event and under no legal theory,
      whether in tort (including negligence), contract, or otherwise,
      unless required by applicable law (such as deliberate and grossly
      negligent acts) or agreed to in writing, shall any Contributor be
      liable to You for damages, including any direct, indirect, special,
      incidental, or consequential damages of any character arising as a
      result of this License or out of the use or inability to use the
      Work (including but not limited to damages for loss of goodwill,
      work stoppage, computer failure or malfunction, or any and all
      other commercial damages or losses), even if such Contributor
      has been advised of the possibility of such damages.

   9. Accepting Warranty or Additional Liability. While redistributing
      the Work or Derivative Works thereof, You may choose to offer,
      and charge a fee for, acceptance of support, warranty, indemnity,
      or other liability obligations and/or rights consistent with this
      License. However, in accepting such obligations, You may act only
      on Your own behalf and on Your sole responsibility, not on behalf
      of any other Contributor, and only if You agree to indemnify,
      defend, and hold each Contributor harmless for any liability
      incurred by, or claims asserted against, such Contributor by reason
      of your accepting any such warranty or additional liability.

   END OF TERMS AND CONDITIONS

   Copyright 2024 Aden

   Licensed under the Apache License, Version 2.0 (the "License");
   you may not use this file except in compliance with the License.
   You may obtain a copy of the License at

       http://www.apache.org/licenses/LICENSE-2.0

   Unless required by applicable law or agreed to in writing, software
   distributed under the License is distributed on an "AS IS" BASIS,
   WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
   See the License for the specific language governing permissions and
   limitations under the License.


================================================
FILE: Makefile
================================================
.PHONY: lint format check test test-tools test-live test-all install-hooks help frontend-install frontend-dev frontend-build

# ── Ensure uv is findable in Git Bash on Windows ──────────────────────────────
# uv installs to ~/.local/bin on Windows/Linux/macOS. Git Bash may not include
# this in PATH by default, so we prepend it here.
export PATH := $(HOME)/.local/bin:$(PATH)

# ── Targets ───────────────────────────────────────────────────────────────────

help: ## Show this help
	@grep -E '^[a-zA-Z_-]+:.*?## .*$$' $(MAKEFILE_LIST) | \
		awk 'BEGIN {FS = ":.*?## "}; {printf "  \033[36m%-15s\033[0m %s\n", $$1, $$2}'

lint: ## Run ruff linter and formatter (with auto-fix)
	cd core && uv run ruff check --fix .
	cd tools && uv run ruff check --fix .
	cd core && uv run ruff format .
	cd tools && uv run ruff format .

format: ## Run ruff formatter
	cd core && uv run ruff format .
	cd tools && uv run ruff format .

check: ## Run all checks without modifying files (CI-safe)
	cd core && uv run ruff check .
	cd tools && uv run ruff check .
	cd core && uv run ruff format --check .
	cd tools && uv run ruff format --check .

test: ## Run all tests (core + tools, excludes live)
	cd core && uv run python -m pytest tests/ -v
	cd tools && uv run python -m pytest -v

test-tools: ## Run tool tests only (mocked, no credentials needed)
	cd tools && uv run python -m pytest -v

test-live: ## Run live integration tests (requires real API credentials)
	cd tools && uv run python -m pytest -m live -s -o "addopts=" --log-cli-level=INFO

test-all: ## Run everything including live tests
	cd core && uv run python -m pytest tests/ -v
	cd tools && uv run python -m pytest -v
	cd tools && uv run python -m pytest -m live -s -o "addopts=" --log-cli-level=INFO

install-hooks: ## Install pre-commit hooks
	uv pip install pre-commit
	pre-commit install

frontend-install: ## Install frontend npm packages
	cd core/frontend && npm install

frontend-dev: ## Start frontend dev server
	cd core/frontend && npm run dev

frontend-build: ## Build frontend for production
	cd core/frontend && npm run build

================================================
FILE: README.md
================================================
<p align="center">
  <img width="100%" alt="Hive Banner" src="https://github.com/user-attachments/assets/a027429b-5d3c-4d34-88e4-0feaeaabbab3" />
</p>

<p align="center">
  <a href="README.md">English</a> |
  <a href="docs/i18n/zh-CN.md">简体中文</a> |
  <a href="docs/i18n/es.md">Español</a> |
  <a href="docs/i18n/hi.md">हिन्दी</a> |
  <a href="docs/i18n/pt.md">Português</a> |
  <a href="docs/i18n/ja.md">日本語</a> |
  <a href="docs/i18n/ru.md">Русский</a> |
  <a href="docs/i18n/ko.md">한국어</a>
</p>

<p align="center">
  <a href="https://github.com/aden-hive/hive/blob/main/LICENSE"><img src="https://img.shields.io/badge/License-Apache%202.0-blue.svg" alt="Apache 2.0 License" /></a>
  <a href="https://www.ycombinator.com/companies/aden"><img src="https://img.shields.io/badge/Y%20Combinator-Aden-orange" alt="Y Combinator" /></a>
  <a href="https://discord.com/invite/MXE49hrKDk"><img src="https://img.shields.io/discord/1172610340073242735?logo=discord&labelColor=%235462eb&logoColor=%23f5f5f5&color=%235462eb" alt="Discord" /></a>
  <a href="https://x.com/aden_hq"><img src="https://img.shields.io/twitter/follow/teamaden?logo=X&color=%23f5f5f5" alt="Twitter Follow" /></a>
  <a href="https://www.linkedin.com/company/teamaden/"><img src="https://custom-icon-badges.demolab.com/badge/LinkedIn-0A66C2?logo=linkedin-white&logoColor=fff" alt="LinkedIn" /></a>
  <img src="https://img.shields.io/badge/MCP-102_Tools-00ADD8?style=flat-square" alt="MCP" />
</p>

<p align="center">
  <img src="https://img.shields.io/badge/AI_Agents-Self--Improving-brightgreen?style=flat-square" alt="AI Agents" />
  <img src="https://img.shields.io/badge/Multi--Agent-Systems-blue?style=flat-square" alt="Multi-Agent" />
  <img src="https://img.shields.io/badge/Headless-Development-purple?style=flat-square" alt="Headless" />
  <img src="https://img.shields.io/badge/Human--in--the--Loop-orange?style=flat-square" alt="HITL" />
  <img src="https://img.shields.io/badge/Browser-Use-red?style=flat-square" alt="Browser Use" />
</p>
<p align="center">
  <img src="https://img.shields.io/badge/OpenAI-supported-412991?style=flat-square&logo=openai" alt="OpenAI" />
  <img src="https://img.shields.io/badge/Anthropic-supported-d4a574?style=flat-square" alt="Anthropic" />
  <img src="https://img.shields.io/badge/Google_Gemini-supported-4285F4?style=flat-square&logo=google" alt="Gemini" />
</p>

## Overview

Generate a swarm of worker agents with a coding agent(queen) that control them. Define your goal through conversation with hive queen, and the framework generates a node graph with dynamically created connection code. When things break, the framework captures failure data, evolves the agent through the coding agent, and redeploys. Built-in human-in-the-loop nodes, browser use, credential management, and real-time monitoring give you control without sacrificing adaptability.

Visit [adenhq.com](https://adenhq.com) for complete documentation, examples, and guides.


https://github.com/user-attachments/assets/bf10edc3-06ba-48b6-98ba-d069b15fb69d


## Who Is Hive For?

Hive is designed for developers and teams who want to build many **autonomous AI agents** fast without manually wiring complex workflows.

Hive is a good fit if you:

- Want AI agents that **execute real business processes**, not demos
- Need **fast or high volume agent execution** over open workflow
- Need **self-healing and adaptive agents** that improve over time
- Require **human-in-the-loop control**, observability, and cost limits
- Plan to run agents in **production environments**

Hive may not be the best fit if you’re only experimenting with simple agent chains or one-off scripts.

## When Should You Use Hive?

Use Hive when you need:

- Long-running, autonomous agents
- Strong guardrails, process, and controls
- Continuous improvement based on failures
- Multi-agent coordination
- A framework that evolves with your goals

## Quick Links

- **[Documentation](https://docs.adenhq.com/)** - Complete guides and API reference
- **[Self-Hosting Guide](https://docs.adenhq.com/getting-started/quickstart)** - Deploy Hive on your infrastructure
- **[Changelog](https://github.com/aden-hive/hive/releases)** - Latest updates and releases
- **[Roadmap](docs/roadmap.md)** - Upcoming features and plans
- **[Report Issues](https://github.com/adenhq/hive/issues)** - Bug reports and feature requests
- **[Contributing](CONTRIBUTING.md)** - How to contribute and submit PRs

## Quick Start

### Prerequisites

- Python 3.11+ for agent development
- An LLM provider that powers the agents
- **ripgrep (optional, recommended on Windows):** The `search_files` tool uses ripgrep for faster file search. If not installed, a Python fallback is used. On Windows: `winget install BurntSushi.ripgrep` or `scoop install ripgrep`

> **Windows Users:** Native Windows is supported via `quickstart.ps1` and `hive.ps1`. Run these in PowerShell 5.1+. WSL is also an option but not required.

### Installation

> **Note**
> Hive uses a `uv` workspace layout and is not installed with `pip install`.
> Running `pip install -e .` from the repository root will create a placeholder package and Hive will not function correctly.
> Please use the quickstart script below to set up the environment.

```bash
# Clone the repository
git clone https://github.com/aden-hive/hive.git
cd hive


# Run quickstart setup
./quickstart.sh
```

This sets up:

- **framework** - Core agent runtime and graph executor (in `core/.venv`)
- **aden_tools** - MCP tools for agent capabilities (in `tools/.venv`)
- **credential store** - Encrypted API key storage (`~/.hive/credentials`)
- **LLM provider** - Interactive default model configuration
- All required Python dependencies with `uv`

- Finally, it will open the Hive interface in your browser

> **Tip:** To reopen the dashboard later, run `hive open` from the project directory.

### Build Your First Agent

Type the agent you want to build in the home input box. The queen is going to ask you questions and work out a solution with you.

<img width="2500" height="1214" alt="Image" src="https://github.com/user-attachments/assets/1ce19141-a78b-46f5-8d64-dbf987e048f4" />

### Use Template Agents

Click "Try a sample agent" and check the templates. You can run a template directly or choose to build your version on top of the existing template.

### Run Agents

Now you can run an agent by selecting the agent (either an existing agent or example agent). You can click the Run button on the top left, or talk to the queen agent and it can run the agent for you.

<img width="2549" height="1174" alt="Screenshot 2026-03-12 at 9 27 36 PM" src="https://github.com/user-attachments/assets/7c7d30fa-9ceb-4c23-95af-b1caa405547d" />

## Features

- **Browser-Use** - Control the browser on your computer to achieve hard tasks
- **Parallel Execution** - Execute the generated graph in parallel. This way you can have multiple agents completing the jobs for you
- **[Goal-Driven Generation](docs/key_concepts/goals_outcome.md)** - Define objectives in natural language; the coding agent generates the agent graph and connection code to achieve them
- **[Adaptiveness](docs/key_concepts/evolution.md)** - Framework captures failures, calibrates according to the objectives, and evolves the agent graph
- **[Dynamic Node Connections](docs/key_concepts/graph.md)** - No predefined edges; connection code is generated by any capable LLM based on your goals
- **SDK-Wrapped Nodes** - Every node gets shared memory, local RLM memory, monitoring, tools, and LLM access out of the box
- **[Human-in-the-Loop](docs/key_concepts/graph.md#human-in-the-loop)** - Intervention nodes that pause execution for human input with configurable timeouts and escalation
- **Real-time Observability** - WebSocket streaming for live monitoring of agent execution, decisions, and node-to-node communication

## Integration

<a href="https://github.com/aden-hive/hive/tree/main/tools/src/aden_tools/tools"><img width="100%" alt="Integration" src="https://github.com/user-attachments/assets/a1573f93-cf02-4bb8-b3d5-b305b05b1e51" /></a>
Hive is built to be model-agnostic and system-agnostic.

- **LLM flexibility** - Hive Framework is designed to support various types of LLMs, including hosted and local models through LiteLLM-compatible providers.
- **Business system connectivity** - Hive Framework is designed to connect to all kinds of business systems as tools, such as CRM, support, messaging, data, file, and internal APIs via MCP.

## Why Aden

Hive focuses on generating agents that run real business processes rather than generic agents. Instead of requiring you to manually design workflows, define agent interactions, and handle failures reactively, Hive flips the paradigm: **you describe outcomes, and the system builds itself**—delivering an outcome-driven, adaptive experience with an easy-to-use set of tools and integrations.

```mermaid
flowchart LR
    GOAL["Define Goal"] --> GEN["Auto-Generate Graph"]
    GEN --> EXEC["Execute Agents"]
    EXEC --> MON["Monitor & Observe"]
    MON --> CHECK{{"Pass?"}}
    CHECK -- "Yes" --> DONE["Deliver Result"]
    CHECK -- "No" --> EVOLVE["Evolve Graph"]
    EVOLVE --> EXEC

    GOAL -.- V1["Natural Language"]
    GEN -.- V2["Instant Architecture"]
    EXEC -.- V3["Easy Integrations"]
    MON -.- V4["Full visibility"]
    EVOLVE -.- V5["Adaptability"]
    DONE -.- V6["Reliable outcomes"]

    style GOAL fill:#ffbe42,stroke:#cc5d00,stroke-width:2px,color:#333
    style GEN fill:#ffb100,stroke:#cc5d00,stroke-width:2px,color:#333
    style EXEC fill:#ff9800,stroke:#cc5d00,stroke-width:2px,color:#fff
    style MON fill:#ff9800,stroke:#cc5d00,stroke-width:2px,color:#fff
    style CHECK fill:#fff59d,stroke:#ed8c00,stroke-width:2px,color:#333
    style DONE fill:#4caf50,stroke:#2e7d32,stroke-width:2px,color:#fff
    style EVOLVE fill:#e8763d,stroke:#cc5d00,stroke-width:2px,color:#fff
    style V1 fill:#fff,stroke:#ed8c00,stroke-width:1px,color:#cc5d00
    style V2 fill:#fff,stroke:#ed8c00,stroke-width:1px,color:#cc5d00
    style V3 fill:#fff,stroke:#ed8c00,stroke-width:1px,color:#cc5d00
    style V4 fill:#fff,stroke:#ed8c00,stroke-width:1px,color:#cc5d00
    style V5 fill:#fff,stroke:#ed8c00,stroke-width:1px,color:#cc5d00
    style V6 fill:#fff,stroke:#ed8c00,stroke-width:1px,color:#cc5d00
```

### The Hive Advantage

| Traditional Frameworks     | Hive                                   |
| -------------------------- | -------------------------------------- |
| Hardcode agent workflows   | Describe goals in natural language     |
| Manual graph definition    | Auto-generated agent graphs            |
| Reactive error handling    | Outcome-evaluation and adaptiveness    |
| Static tool configurations | Dynamic SDK-wrapped nodes              |
| Separate monitoring setup  | Built-in real-time observability       |
| DIY budget management      | Integrated cost controls & degradation |

### How It Works

1. **[Define Your Goal](docs/key_concepts/goals_outcome.md)** → Describe what you want to achieve in plain English
2. **Coding Agent Generates** → Creates the [agent graph](docs/key_concepts/graph.md), connection code, and test cases
3. **[Workers Execute](docs/key_concepts/worker_agent.md)** → SDK-wrapped nodes run with full observability and tool access
4. **Control Plane Monitors** → Real-time metrics, budget enforcement, policy management
5. **[Adaptiveness](docs/key_concepts/evolution.md)** → On failure, the system evolves the graph and redeploys automatically

## Documentation

- **[Developer Guide](docs/developer-guide.md)** - Comprehensive guide for developers
- [Getting Started](docs/getting-started.md) - Quick setup instructions
- [Configuration Guide](docs/configuration.md) - All configuration options
- [Architecture Overview](docs/architecture/README.md) - System design and structure

## Roadmap

Aden Hive Agent Framework aims to help developers build outcome-oriented, self-adaptive agents. See [roadmap.md](docs/roadmap.md) for details.

```mermaid
flowchart TB
    %% Main Entity
    User([User])

    %% =========================================
    %% EXTERNAL EVENT SOURCES
    %% =========================================
    subgraph ExtEventSource [External Event Source]
        E_Sch["Schedulers"]
        E_WH["Webhook"]
        E_SSE["SSE"]
    end

    %% =========================================
    %% SYSTEM NODES
    %% =========================================
    subgraph WorkerBees [Worker Bees]
        WB_C["Conversation"]
        WB_SP["System prompt"]

        subgraph Graph [Graph]
            direction TB
            N1["Node"] --> N2["Node"] --> N3["Node"]
            N1 -.-> AN["Active Node"]
            N2 -.-> AN
            N3 -.-> AN

            %% Nested Event Loop Node
            subgraph EventLoopNode [Event Loop Node]
                ELN_L["listener"]
                ELN_SP["System Prompt<br/>(Task)"]
                ELN_EL["Event loop"]
                ELN_C["Conversation"]
            end
        end
    end

    subgraph JudgeNode [Judge]
        J_C["Criteria"]
        J_P["Principles"]
        J_EL["Event loop"] <--> J_S["Scheduler"]
    end

    subgraph QueenBee [Queen Bee]
        QB_SP["System prompt"]
        QB_EL["Event loop"]
        QB_C["Conversation"]
    end

    subgraph Infra [Infra]
        SA["Sub Agent"]
        TR["Tool Registry"]
        WTM["Write through Conversation Memory<br/>(Logs/RAM/Harddrive)"]
        SM["Shared Memory<br/>(State/Harddrive)"]
        EB["Event Bus<br/>(RAM)"]
        CS["Credential Store<br/>(Harddrive/Cloud)"]
    end

    subgraph PC [PC]
        B["Browser"]
        CB["Codebase<br/>v 0.0.x ... v n.n.n"]
    end

    %% =========================================
    %% CONNECTIONS & DATA FLOW
    %% =========================================

    %% External Event Routing
    E_Sch --> ELN_L
    E_WH --> ELN_L
    E_SSE --> ELN_L
    ELN_L -->|"triggers"| ELN_EL

    %% User Interactions
    User -->|"Talk"| WB_C
    User -->|"Talk"| QB_C
    User -->|"Read/Write Access"| CS

    %% Inter-System Logic
    ELN_C <-->|"Mirror"| WB_C
    WB_C -->|"Focus"| AN

    WorkerBees -->|"Inquire"| JudgeNode
    JudgeNode -->|"Approve"| WorkerBees

    %% Judge Alignments
    J_C <-.->|"aligns"| WB_SP
    J_P <-.->|"aligns"| QB_SP

    %% Escalate path
    J_EL -->|"Report (Escalate)"| QB_EL

    %% Pub/Sub Logic
    AN -->|"publish"| EB
    EB -->|"subscribe"| QB_C

    %% Infra and Process Spawning
    ELN_EL -->|"Spawn"| SA
    SA -->|"Inform"| ELN_EL
    SA -->|"Starts"| B
    B -->|"Report"| ELN_EL
    TR -->|"Assigned"| ELN_EL
    CB -->|"Modify Worker Bee"| WB_C

    %% =========================================
    %% SHARED MEMORY & LOGS ACCESS
    %% =========================================

    %% Worker Bees Access (link to node inside Graph subgraph)
    AN <-->|"Read/Write"| WTM
    AN <-->|"Read/Write"| SM

    %% Queen Bee Access
    QB_C <-->|"Read/Write"| WTM
    QB_EL <-->|"Read/Write"| SM

    %% Credentials Access
    CS -->|"Read Access"| QB_C
```

## Contributing
We welcome contributions from the community! We’re especially looking for help building tools, integrations, and example agents for the framework ([check #2805](https://github.com/aden-hive/hive/issues/2805)). If you’re interested in extending its functionality, this is the perfect place to start. Please see [CONTRIBUTING.md](CONTRIBUTING.md) for guidelines.

**Important:** Please get assigned to an issue before submitting a PR. Comment on an issue to claim it, and a maintainer will assign you. Issues with reproducible steps and proposals are prioritized. This helps prevent duplicate work.

1. Find or create an issue and get assigned
2. Fork the repository
3. Create your feature branch (`git checkout -b feature/amazing-feature`)
4. Commit your changes (`git commit -m 'Add amazing feature'`)
5. Push to the branch (`git push origin feature/amazing-feature`)
6. Open a Pull Request

## Community & Support

We use [Discord](https://discord.com/invite/MXE49hrKDk) for support, feature requests, and community discussions.

- Discord - [Join our community](https://discord.com/invite/MXE49hrKDk)
- Twitter/X - [@adenhq](https://x.com/aden_hq)
- LinkedIn - [Company Page](https://www.linkedin.com/company/teamaden/)

## Join Our Team

**We're hiring!** Join us in engineering, research, and go-to-market roles.

[View Open Positions](https://jobs.adenhq.com/a8cec478-cdbc-473c-bbd4-f4b7027ec193/applicant)

## Security

For security concerns, please see [SECURITY.md](SECURITY.md).

## License

This project is licensed under the Apache License 2.0 - see the [LICENSE](LICENSE) file for details.

## Frequently Asked Questions (FAQ)

**Q: What LLM providers does Hive support?**

Hive supports 100+ LLM providers through LiteLLM integration, including OpenAI (GPT-4, GPT-4o), Anthropic (Claude models), Google Gemini, DeepSeek, Mistral, Groq, and many more. Simply set the appropriate API key environment variable and specify the model name. We recommend using Claude, GLM and Gemini as they have the best performance.

**Q: Can I use Hive with local AI models like Ollama?**

Yes! Hive supports local models through LiteLLM. Simply use the model name format `ollama/model-name` (e.g., `ollama/llama3`, `ollama/mistral`) and ensure Ollama is running locally.

**Q: What makes Hive different from other agent frameworks?**

Hive generates your entire agent system from natural language goals using a coding agent—you don't hardcode workflows or manually define graphs. When agents fail, the framework automatically captures failure data, [evolves the agent graph](docs/key_concepts/evolution.md), and redeploys. This self-improving loop is unique to Aden.

**Q: Is Hive open-source?**

Yes, Hive is fully open-source under the Apache License 2.0. We actively encourage community contributions and collaboration.

**Q: Does Hive support human-in-the-loop workflows?**

Yes, Hive fully supports [human-in-the-loop](docs/key_concepts/graph.md#human-in-the-loop) workflows through intervention nodes that pause execution for human input. These include configurable timeouts and escalation policies, allowing seamless collaboration between human experts and AI agents.

**Q: What programming languages does Hive support?**

The Hive framework is built in Python. A JavaScript/TypeScript SDK is on the roadmap.

**Q: Can Hive agents interact with external tools and APIs?**

Yes. Aden's SDK-wrapped nodes provide built-in tool access, and the framework supports flexible tool ecosystems. Agents can integrate with external APIs, databases, and services through the node architecture.

**Q: How does cost control work in Hive?**

Hive provides granular budget controls including spending limits, throttles, and automatic model degradation policies. You can set budgets at the team, agent, or workflow level, with real-time cost tracking and alerts.

**Q: Where can I find examples and documentation?**

Visit [docs.adenhq.com](https://docs.adenhq.com/) for complete guides, API reference, and getting started tutorials. The repository also includes documentation in the `docs/` folder and a comprehensive [developer guide](docs/developer-guide.md).

**Q: How can I contribute to Aden?**

Contributions are welcome! Fork the repository, create your feature branch, implement your changes, and submit a pull request. See [CONTRIBUTING.md](CONTRIBUTING.md) for detailed guidelines.

## Star History

<a href="https://star-history.com/#aden-hive/hive&Date">
 <picture>
   <source media="(prefers-color-scheme: dark)" srcset="https://api.star-history.com/svg?repos=aden-hive/hive&type=Date&theme=dark" />
   <source media="(prefers-color-scheme: light)" srcset="https://api.star-history.com/svg?repos=aden-hive/hive&type=Date" />
   <img alt="Star History Chart" src="https://api.star-history.com/svg?repos=aden-hive/hive&type=Date" />
 </picture>
</a>

---

<p align="center">
  Made with 🔥 Passion in San Francisco
</p>


================================================
FILE: SECURITY.md
================================================
# Security Policy

## Supported Versions

| Version | Supported          |
| ------- | ------------------ |
| 0.x.x   | :white_check_mark: |

## Reporting a Vulnerability

We take security vulnerabilities seriously. If you discover a security issue, please report it responsibly.

### How to Report

**Please do NOT report security vulnerabilities through public GitHub issues.**

Instead, please send an email to contact@adenhq.com with:

1. A description of the vulnerability
2. Steps to reproduce the issue
3. Potential impact of the vulnerability
4. Any possible mitigations you've identified

### What to Expect

- **Acknowledgment**: We will acknowledge receipt of your report within 48 hours
- **Communication**: We will keep you informed of our progress
- **Resolution**: We aim to resolve critical vulnerabilities within 7 days
- **Credit**: We will credit you in our security advisories (unless you prefer to remain anonymous)

### Safe Harbor

We consider security research conducted in accordance with this policy to be:

- Authorized concerning any applicable anti-hacking laws
- Authorized concerning any relevant anti-circumvention laws
- Exempt from restrictions in our Terms of Service that would interfere with conducting security research

## Security Best Practices for Users

1. **Keep Updated**: Always run the latest version
2. **Secure Configuration**: Review your `~/.hive/configuration.json`, `.mcp.json`, and environment variable settings, especially in production
3. **Environment Variables**: Never commit `.env` files or any configuration files that contain secrets
4. **Network Security**: Use HTTPS in production, configure firewalls appropriately
5. **Database Security**: Use strong passwords, limit network access

## Security Features

- Environment-based configuration (no hardcoded secrets)
- Input validation on API endpoints
- Secure session handling
- CORS configuration
- Rate limiting (configurable)


================================================
FILE: core/.gitignore
================================================
exports/
docs/
.pytest_cache/
**/__pycache__/

================================================
FILE: core/.mcp.json
================================================
{
  "mcpServers": {
    "tools": {
      "command": "python",
      "args": ["-m", "aden_tools.mcp_server", "--stdio"],
      "cwd": "tools"
    }
  }
}


================================================
FILE: core/MCP_BUILDER_TOOLS_GUIDE.md
================================================
# Agent Builder MCP Tools - MCP Integration Guide

This guide explains how to use the new MCP integration tools in the agent builder MCP server.

## Overview

The agent builder now supports registering external MCP servers as tool sources. This allows you to:

1. Register MCP servers (like tools) during agent building
2. Discover available tools from those servers
3. Use those tools in your agent nodes
4. Automatically generate `mcp_servers.json` configuration on export

## New MCP Tools

### `add_mcp_server`

Register an MCP server as a tool source for your agent.

**Parameters:**

- `name` (string, required): Unique name for the MCP server
- `transport` (string, required): Transport type - "stdio" or "http"
- `command` (string): Command to run (for stdio transport)
- `args` (string): JSON array of command arguments (for stdio)
- `cwd` (string): Working directory (for stdio)
- `env` (string): JSON object of environment variables (for stdio)
- `url` (string): Server URL (for http transport)
- `headers` (string): JSON object of HTTP headers (for http)
- `description` (string): Description of the MCP server

**Example - STDIO:**

```json
{
  "name": "add_mcp_server",
  "arguments": {
    "name": "tools",
    "transport": "stdio",
    "command": "python",
    "args": "[\"mcp_server.py\", \"--stdio\"]",
    "cwd": "../tools",
    "description": "Aden tools for web search and file operations"
  }
}
```

**Example - HTTP:**

```json
{
  "name": "add_mcp_server",
  "arguments": {
    "name": "remote-tools",
    "transport": "http",
    "url": "http://localhost:4001",
    "description": "Remote tool server"
  }
}
```

**Response:**

```json
{
  "success": true,
  "server": {
    "name": "tools",
    "transport": "stdio",
    "command": "python",
    "args": ["mcp_server.py", "--stdio"],
    "cwd": "../tools",
    "description": "Aden tools..."
  },
  "tools_discovered": 6,
  "tools": [
    "web_search",
    "web_scrape",
    "file_read",
    "file_write",
    "pdf_read",
    "example_tool"
  ],
  "total_mcp_servers": 1,
  "note": "MCP server 'tools' registered with 6 tools. These tools can now be used in event_loop nodes."
}
```

### `list_mcp_servers`

List all registered MCP servers.

**Parameters:** None

**Response:**

```json
{
  "mcp_servers": [
    {
      "name": "tools",
      "transport": "stdio",
      "command": "python",
      "args": ["mcp_server.py", "--stdio"],
      "cwd": "../tools",
      "description": "Aden tools..."
    }
  ],
  "total": 1
}
```

### `list_mcp_tools`

List tools available from registered MCP servers.

**Parameters:**

- `server_name` (string, optional): Name of specific server to list tools from. If omitted, lists tools from all servers.

**Example:**

```json
{
  "name": "list_mcp_tools",
  "arguments": {
    "server_name": "tools"
  }
}
```

**Response:**

```json
{
  "success": true,
  "tools_by_server": {
    "tools": [
      {
        "name": "web_search",
        "description": "Search the web for information using Brave Search API...",
        "parameters": ["query", "num_results", "country"]
      },
      {
        "name": "web_scrape",
        "description": "Scrape and extract text content from a webpage...",
        "parameters": ["url", "selector", "include_links", "max_length"]
      }
    ]
  },
  "total_tools": 6,
  "note": "Use these tool names in the 'tools' parameter when adding event_loop nodes"
}
```

### `remove_mcp_server`

Remove a registered MCP server.

**Parameters:**

- `name` (string, required): Name of the MCP server to remove

**Example:**

```json
{
  "name": "remove_mcp_server",
  "arguments": {
    "name": "tools"
  }
}
```

**Response:**

```json
{
  "success": true,
  "removed": "tools",
  "remaining_servers": 0
}
```

## Workflow Example

Here's a complete workflow for building an agent with MCP tools:

### 1. Create Session

```json
{
  "name": "create_session",
  "arguments": {
    "name": "web-research-agent"
  }
}
```

### 2. Register MCP Server

```json
{
  "name": "add_mcp_server",
  "arguments": {
    "name": "tools",
    "transport": "stdio",
    "command": "python",
    "args": "[\"mcp_server.py\", \"--stdio\"]",
    "cwd": "../tools"
  }
}
```

### 3. List Available Tools

```json
{
  "name": "list_mcp_tools",
  "arguments": {
    "server_name": "tools"
  }
}
```

### 4. Set Goal

```json
{
  "name": "set_goal",
  "arguments": {
    "goal_id": "web-research",
    "name": "Web Research Agent",
    "description": "Search the web and summarize findings",
    "success_criteria": "[{\"id\": \"search-success\", \"description\": \"Successfully retrieve search results\", \"metric\": \"results_count\", \"target\": \">= 3\", \"weight\": 1.0}]"
  }
}
```

### 5. Add Node with MCP Tool

```json
{
  "name": "add_node",
  "arguments": {
    "node_id": "web-searcher",
    "name": "Web Search",
    "description": "Search the web for information",
    "node_type": "event_loop",
    "input_keys": "[\"query\"]",
    "output_keys": "[\"search_results\"]",
    "system_prompt": "Search for {query} using the web_search tool",
    "tools": "[\"web_search\"]"
  }
}
```

Note: `web_search` is now available because we registered the tools MCP server!

### 6. Export Agent

```json
{
  "name": "export_graph",
  "arguments": {}
}
```

The export will create:

- `exports/web-research-agent/agent.json` - Agent specification
- `exports/web-research-agent/README.md` - Documentation
- `exports/web-research-agent/mcp_servers.json` - **MCP server configuration** ✨

## MCP Configuration File

When you export an agent with registered MCP servers, an `mcp_servers.json` file is automatically created:

```json
{
  "servers": [
    {
      "name": "tools",
      "transport": "stdio",
      "command": "python",
      "args": ["mcp_server.py", "--stdio"],
      "cwd": "../tools",
      "description": "Aden tools for web search and file operations"
    }
  ]
}
```

This file is automatically loaded by the AgentRunner when the agent is executed, making the MCP tools available at runtime.

## Using the Exported Agent

Once exported, load and run the agent normally:

```python
from framework.runner.runner import AgentRunner

# Load agent - MCP servers auto-load from mcp_servers.json
runner = AgentRunner.load("exports/web-research-agent")

# Run with input
result = await runner.run({"query": "latest AI breakthroughs"})

# The web_search tool from tools is automatically available!
```

## Benefits

1. **Discoverable Tools**: See what tools are available before using them
2. **Validation**: Connection is tested when registering the server
3. **Automatic Configuration**: No manual file editing required
4. **Documentation**: README includes MCP server information
5. **Runtime Ready**: Exported agents work immediately with configured tools

## Common MCP Servers

### tools

Provides:

- `web_search` - Brave Search API integration
- `web_scrape` - Web page content extraction
- `file_read` / `file_write` - File operations
- `pdf_read` - PDF text extraction

### Custom MCP Servers

You can register any MCP server that follows the Model Context Protocol specification.

## Troubleshooting

### "Failed to connect to MCP server"

- Verify the `command` and `args` are correct
- Check that the server is accessible at the specified path/URL
- Ensure any required environment variables are set
- For STDIO: verify the command can be executed from the `cwd`
- For HTTP: verify the server is running and accessible

### Tools not appearing

- Use `list_mcp_tools` to verify tools were discovered
- Check the tool names match exactly (case-sensitive)
- Ensure the MCP server is still registered (`list_mcp_servers`)

### Export doesn't include mcp_servers.json

- Verify you registered at least one MCP server
- Check `get_session_status` to see `mcp_servers_count > 0`
- Re-export the agent after registering servers

## Credential Validation

When adding nodes with tools that require API keys (like `web_search`), the agent builder automatically validates that the required credentials are available.

### How It Works

When you call `add_node` or `update_node` with a `tools` parameter, the agent builder:

1. Checks which tools require credentials (e.g., `web_search` requires `BRAVE_SEARCH_API_KEY`)
2. Validates those credentials are set in the environment or `.env` file
3. Returns an error if any credentials are missing

### Missing Credentials Error

If credentials are missing, you'll receive a response like:

```json
{
  "valid": false,
  "errors": ["Missing credentials for tools: ['BRAVE_SEARCH_API_KEY']"],
  "missing_credentials": [
    {
      "credential": "brave_search",
      "env_var": "BRAVE_SEARCH_API_KEY",
      "tools_affected": ["web_search"],
      "help_url": "https://brave.com/search/api/",
      "description": "API key for Brave Search"
    }
  ],
  "action_required": "Add the credentials to your .env file and retry",
  "example": "Add to .env:\nBRAVE_SEARCH_API_KEY=your_key_here",
  "message": "Cannot add node: missing API credentials. Add them to .env and retry this command."
}
```

### Fixing Credential Errors

1. Get the required API key from the URL in `help_url`
2. Add it to your environment:

   ```bash
   # Option 1: Export directly
   export BRAVE_SEARCH_API_KEY=your-key-here

   # Option 2: Add to tools/.env
   echo "BRAVE_SEARCH_API_KEY=your-key-here" >> tools/.env
   ```

3. Retry the `add_node` command

### Required Credentials by Tool

| Tool         | Credential             | Get Key                                               |
| ------------ | ---------------------- | ----------------------------------------------------- |
| `web_search` | `BRAVE_SEARCH_API_KEY` | [brave.com/search/api](https://brave.com/search/api/) |

Note: The MCP server itself requires `ANTHROPIC_API_KEY` at startup for LLM operations.


================================================
FILE: core/MCP_INTEGRATION_GUIDE.md
================================================
# MCP Integration Guide

This guide explains how to integrate Model Context Protocol (MCP) servers with the Hive Core Framework, enabling agents to use tools from external MCP servers.

## Overview

The framework provides built-in support for MCP servers, allowing you to:

- **Register MCP servers** via STDIO or HTTP transport
- **Auto-discover tools** from registered servers
- **Use MCP tools** seamlessly in your agents
- **Manage multiple MCP servers** simultaneously

## Quick Start

### 1. Register an MCP Server Programmatically

```python
from framework.runner.runner import AgentRunner

# Load your agent
runner = AgentRunner.load("exports/my-agent")

# Register tools MCP server
runner.register_mcp_server(
    name="tools",
    transport="stdio",
    command="python",
    args=["-m", "aden_tools.mcp_server", "--stdio"],
    cwd="/path/to/tools"
)

# Tools are now available to your agent
result = await runner.run({"input": "data"})
```

### 2. Use Configuration File

Create `mcp_servers.json` in your agent folder:

```json
{
  "servers": [
    {
      "name": "tools",
      "transport": "stdio",
      "command": "python",
      "args": ["-m", "aden_tools.mcp_server", "--stdio"],
      "cwd": "../tools"
    }
  ]
}
```

The framework will automatically load and register these servers when you load the agent:

```python
runner = AgentRunner.load("exports/my-agent")  # MCP servers auto-loaded
```

## Transport Types

### STDIO Transport

Best for local MCP servers running as subprocesses:

```python
runner.register_mcp_server(
    name="local-tools",
    transport="stdio",
    command="python",
    args=["-m", "my_tools.server", "--stdio"],
    cwd="/path/to/my-tools",
    env={
        "API_KEY": "your-key-here"
    }
)
```

**Configuration:**

- `command`: Executable to run (e.g., "python", "node")
- `args`: List of command-line arguments
- `cwd`: Working directory for the process
- `env`: Environment variables (optional)

### HTTP Transport

Best for remote MCP servers or containerized deployments:

```python
runner.register_mcp_server(
    name="remote-tools",
    transport="http",
    url="http://localhost:4001",
    headers={
        "Authorization": "Bearer token"
    }
)
```

**Configuration:**

- `url`: Base URL of the MCP server
- `headers`: HTTP headers to include (optional)

## Using MCP Tools in Agents

Once registered, MCP tools are available just like any other tool:

### In Node Specifications

```python
from framework.builder.workflow import WorkflowBuilder

builder = WorkflowBuilder()

# Add a node that uses MCP tools
builder.add_node(
    node_id="researcher",
    name="Web Researcher",
    node_type="event_loop",
    system_prompt="Research the topic using web_search",
    tools=["web_search"],  # Tool from tools MCP server
    input_keys=["topic"],
    output_keys=["findings"]
)
```

### In Agent.json

Tools from MCP servers can be referenced in your agent.json just like built-in tools:

```json
{
  "nodes": [
    {
      "id": "searcher",
      "name": "Web Searcher",
      "node_type": "event_loop",
      "system_prompt": "Search for information about {topic}",
      "tools": ["web_search", "web_scrape"],
      "input_keys": ["topic"],
      "output_keys": ["results"]
    }
  ]
}
```

## Available Tools from tools

When you register the `tools` MCP server, the following tools become available:

- **web_search**: Search the web using Brave Search API
- **web_scrape**: Scrape content from a URL
- **file_read**: Read file contents
- **file_write**: Write content to a file
- **pdf_read**: Extract text from PDF files

## Environment Variables

Some MCP tools require environment variables. You can pass them in the configuration:

### Via Programmatic Registration

```python
runner.register_mcp_server(
    name="tools",
    transport="stdio",
    command="python",
    args=["-m", "aden_tools.mcp_server", "--stdio"],
    cwd="../tools",
    env={
        "BRAVE_SEARCH_API_KEY": os.environ["BRAVE_SEARCH_API_KEY"]
    }
)
```

### Via Configuration File

```json
{
  "servers": [
    {
      "name": "tools",
      "transport": "stdio",
      "command": "python",
      "args": ["-m", "aden_tools.mcp_server", "--stdio"],
      "cwd": "../tools",
      "env": {
        "BRAVE_SEARCH_API_KEY": "${BRAVE_SEARCH_API_KEY}"
      }
    }
  ]
}
```

The framework will substitute `${VAR_NAME}` with values from the environment.

## Multiple MCP Servers

You can register multiple MCP servers to access different sets of tools:

```json
{
  "servers": [
    {
      "name": "tools",
      "transport": "stdio",
      "command": "python",
      "args": ["-m", "aden_tools.mcp_server", "--stdio"],
      "cwd": "../tools"
    },
    {
      "name": "database-tools",
      "transport": "http",
      "url": "http://localhost:5001"
    },
    {
      "name": "analytics-tools",
      "transport": "http",
      "url": "http://analytics-server:6001"
    }
  ]
}
```

All tools from all servers will be available to your agent.

## Best Practices

### 1. Use STDIO for Development

STDIO transport is easier to debug and doesn't require managing server processes:

```python
runner.register_mcp_server(
    name="dev-tools",
    transport="stdio",
    command="python",
    args=["-m", "my_tools.server", "--stdio"]
)
```

### 2. Use HTTP for Production

HTTP transport is better for:

- Containerized deployments
- Shared tools across multiple agents
- Remote tool execution

```python
runner.register_mcp_server(
    name="prod-tools",
    transport="http",
    url="http://tools-service:8000"
)
```

### 3. Handle Cleanup

Always clean up MCP connections when done:

```python
try:
    runner = AgentRunner.load("exports/my-agent")
    runner.register_mcp_server(...)
    result = await runner.run(input_data)
finally:
    runner.cleanup()  # Disconnects all MCP servers
```

Or use context manager:

```python
async with AgentRunner.load("exports/my-agent") as runner:
    runner.register_mcp_server(...)
    result = await runner.run(input_data)
    # Automatic cleanup
```

### 4. Tool Name Conflicts

If multiple MCP servers provide tools with the same name, the last registered server wins. To avoid conflicts:

- Use unique tool names in your MCP servers
- Register servers in priority order (most important last)
- Use separate agents for different tool sets

## Troubleshooting

### Connection Errors

If you get connection errors with STDIO transport:

1. Check that the command and path are correct
2. Verify the MCP server starts successfully standalone
3. Check environment variables are set correctly
4. Look at stderr output for error messages

### Tool Not Found

If a tool is registered but not found:

1. Verify the server registered successfully (check logs)
2. List available tools: `runner._tool_registry.get_registered_names()`
3. Check tool name spelling in your node configuration

### HTTP Server Not Responding

If HTTP transport fails:

1. Verify the server is running: `curl http://localhost:4001/health`
2. Check firewall settings
3. Verify the URL and port are correct

## Example: Full Agent with MCP Tools

Here's a complete example of an agent that uses MCP tools:

```python
import asyncio
from pathlib import Path
from framework.runner.runner import AgentRunner

async def main():
    # Create agent path
    agent_path = Path("exports/web-research-agent")

    # Load agent
    runner = AgentRunner.load(agent_path)

    # Register MCP server
    runner.register_mcp_server(
        name="tools",
        transport="stdio",
        command="python",
        args=["-m", "aden_tools.mcp_server", "--stdio"],
        cwd="../tools",
        env={
            "BRAVE_SEARCH_API_KEY": "your-api-key"
        }
    )

    # Run agent
    result = await runner.run({
        "query": "latest developments in quantum computing"
    })

    print(f"Research complete: {result}")

    # Cleanup
    runner.cleanup()

if __name__ == "__main__":
    asyncio.run(main())
```

## See Also

- [MCP_SERVER_GUIDE.md](MCP_SERVER_GUIDE.md) - Building your own MCP servers
- [examples/mcp_integration_example.py](examples/mcp_integration_example.py) - More examples
- [examples/mcp_servers.json](examples/mcp_servers.json) - Example configuration


================================================
FILE: core/MCP_SERVER_GUIDE.md
================================================
# MCP Server Guide - Agent Building Tools

> **Note:** The standalone `agent-builder` MCP server (`framework.mcp.agent_builder_server`) has been replaced. Agent building is now done via the `coder-tools` server's `initialize_and_build_agent` tool, with underlying logic in `tools/coder_tools_server.py`.

This guide covers the MCP tools available for building goal-driven agents.

## Setup

### Quick Setup

```bash
# Run the quickstart script (recommended)
./quickstart.sh
```

### Manual Configuration

Add to your MCP client configuration (e.g., Claude Desktop):

```json
{
  "mcpServers": {
    "coder-tools": {
      "command": "uv",
      "args": ["run", "coder_tools_server.py", "--stdio"],
      "cwd": "/path/to/hive/tools"
    }
  }
}
```

## Available MCP Tools

### Session Management

#### `create_session`
Create a new agent building session.

**Parameters:**
- `name` (string, required): Name of the agent

**Example:**
```json
{
  "name": "research-summary-agent"
}
```

#### `get_session_status`
Get the current status of the build session.

**Returns:**
- Session name
- Goal status
- Number of nodes
- Number of edges
- Validation status

---

### Goal Definition

#### `set_goal`
Define the goal for the agent with success criteria and constraints.

**Parameters:**
- `goal_id` (string, required): Unique identifier for the goal
- `name` (string, required): Human-readable name
- `description` (string, required): What the agent should accomplish
- `success_criteria` (string, required): JSON array of success criteria
- `constraints` (string, optional): JSON array of constraints

**Success Criterion Structure:**
```json
{
  "id": "criterion_id",
  "description": "What should be achieved",
  "metric": "How to measure it",
  "target": "Target value",
  "weight": 1.0
}
```

**Constraint Structure:**
```json
{
  "id": "constraint_id",
  "description": "What must not happen",
  "constraint_type": "hard|soft",
  "category": "safety|quality|performance"
}
```

---

### Node Management

#### `add_node`
Add a processing node to the agent graph.

**Parameters:**
- `node_id` (string, required): Unique node identifier
- `name` (string, required): Human-readable name
- `description` (string, required): What this node does
- `node_type` (string, required): Must be `event_loop` (the only valid type)
- `input_keys` (string, required): JSON array of input variable names
- `output_keys` (string, required): JSON array of output variable names
- `system_prompt` (string, optional): System prompt for the LLM
- `tools` (string, optional): JSON array of tool names
- `client_facing` (boolean, optional): Set to true for human-in-the-loop interaction

**Node Type:**

**event_loop**: LLM-powered node with self-correction loop
- Requires: `system_prompt`
- Optional: `tools` (array of tool names, e.g., `["web_search", "web_fetch"]`)
- Optional: `client_facing` (set to true for HITL / user interaction)
- Supports: iterative refinement, judge-based evaluation, tool use, streaming

**Example:**
```json
{
  "node_id": "search_sources",
  "name": "Search Sources",
  "description": "Searches for relevant sources on the topic",
  "node_type": "event_loop",
  "input_keys": "[\"topic\", \"search_queries\"]",
  "output_keys": "[\"sources\", \"source_count\"]",
  "system_prompt": "Search for sources using the provided queries...",
  "tools": "[\"web_search\"]"
}
```

---

### Edge Management

#### `add_edge`
Connect two nodes with an edge to define execution flow.

**Parameters:**
- `edge_id` (string, required): Unique edge identifier
- `source` (string, required): Source node ID
- `target` (string, required): Target node ID
- `condition` (string, optional): When to traverse: `on_success` (default) or `on_failure`
- `condition_expr` (string, optional): Python expression for conditional routing
- `priority` (integer, optional): Edge priority (default: 0)

**Example:**
```json
{
  "edge_id": "search_to_extract",
  "source": "search_sources",
  "target": "extract_content",
  "condition": "on_success"
}
```

---

### Graph Validation

#### `validate_graph`
Validate the complete graph structure.

**Checks:**
- Entry node exists
- All nodes are reachable from entry
- Terminal nodes have no outgoing edges
- No cycles (unless explicitly allowed)
- Context flow: all required inputs are available

**Returns:**
- `valid` (boolean)
- `errors` (array): List of validation errors
- `warnings` (array): Non-critical issues
- `entry_node` (string): Entry node ID
- `terminal_nodes` (array): Terminal node IDs

---

### Graph Export

#### `export_graph`
Export the validated graph as an agent specification.

**What it does:**
1. Validates the graph
2. Validates edge connectivity
3. Writes files to disk:
   - `exports/{agent-name}/agent.json` - Full agent specification
   - `exports/{agent-name}/README.md` - Auto-generated documentation

**Returns:**
- `success` (boolean)
- `files_written` (object): Paths and sizes of written files
- `agent` (object): Agent metadata
- `graph` (object): Graph specification
- `goal` (object): Goal definition
- `required_tools` (array): All tools used by the agent

**Important:** This tool automatically writes files to the `exports/` directory!

---

### Testing

#### `test_node`
Test a single node with sample inputs.

**Parameters:**
- `node_id` (string, required): Node to test
- `test_input` (string, required): JSON object with input values
- `mock_llm_response` (string, optional): Mock LLM response for testing

**Example:**
```json
{
  "node_id": "research_planner",
  "test_input": "{\"topic\": \"LLM compaction\"}"
}
```

#### `test_graph`
Test the complete agent graph with sample inputs.

**Parameters:**
- `test_input` (string, required): JSON object with initial inputs
- `dry_run` (boolean, optional): Simulate without LLM calls (default: true)
- `max_steps` (integer, optional): Maximum execution steps (default: 10)

**Example:**
```json
{
  "test_input": "{\"topic\": \"AI safety\"}",
  "dry_run": true,
  "max_steps": 10
}
```

---

## Example Workflow

Here's a complete workflow for building a research agent:

```python
# 1. Create session
create_session(name="research-agent")

# 2. Define goal
set_goal(
    goal_id="research-goal",
    name="Research Topic Agent",
    description="Research a topic and produce a summary",
    success_criteria=json.dumps([{
        "id": "comprehensive",
        "description": "Cover main aspects",
        "metric": "Key topics addressed",
        "target": "At least 3-5 aspects",
        "weight": 1.0
    }])
)

# 3. Add nodes
add_node(
    node_id="planner",
    name="Research Planner",
    description="Creates research strategy",
    node_type="event_loop",
    input_keys='["topic"]',
    output_keys='["strategy", "queries"]',
    system_prompt="Analyze topic and create research plan..."
)

add_node(
    node_id="searcher",
    name="Search Sources",
    description="Find relevant sources",
    node_type="event_loop",
    input_keys='["queries"]',
    output_keys='["sources"]',
    system_prompt="Search for sources...",
    tools='["web_search"]'
)

# 4. Connect nodes
add_edge(
    edge_id="plan_to_search",
    source="planner",
    target="searcher"
)

# 5. Validate
validate_graph()

# 6. Export
export_graph()
```

The exported agent will be saved to `exports/research-agent/`.

---

## Tips

1. **Start with the goal**: Define clear success criteria before building nodes
2. **Test nodes individually**: Use `test_node` to verify each node works
3. **Use conditional edges for branching**: Define condition_expr on edges for decision points
4. **Validate early, validate often**: Run `validate_graph` after adding nodes/edges
5. **Check exports**: Review the generated README.md to verify your agent structure

---

## Common Issues

### "Node X is unreachable from entry"
- Make sure there's a path of edges from the entry node to all nodes
- Check that you've defined edges connecting your nodes

### "Missing required input Y for node X"
- Ensure previous nodes output the required inputs
- Check your input_keys and output_keys match

### "Router routes don't match edges"
- Don't worry! The export tool auto-generates missing edges from routes
- If you see this warning, it's informational only

### "Cannot find tool Z"
- Verify the tool name matches available tools (e.g., "web_search", "web_fetch")
- Check the `required_tools` section in the exported agent

---

## Resources

- **Framework Documentation**: See [README.md](README.md)
- **Example Agents**: Check the `exports/` directory for examples
- **MCP Protocol**: https://modelcontextprotocol.io


================================================
FILE: core/README.md
================================================
# Framework

A goal-driven agent runtime with Builder-friendly observability.

## Overview

Framework provides a runtime framework that captures **decisions**, not just actions. This enables a "Builder" LLM to analyze and improve agent behavior by understanding:

- What the agent was trying to accomplish
- What options it considered
- What it chose and why
- What happened as a result

## Installation

```bash
uv pip install -e .
```

## Agent Building

Agent scaffolding is handled by the `coder-tools` MCP server (in `tools/coder_tools_server.py`), which provides the `initialize_and_build_agent` tool and related utilities. The package generation logic lives directly in `tools/coder_tools_server.py`.

See the [Getting Started Guide](../docs/getting-started.md) for building agents.

## Quick Start

### Calculator Agent

Run an LLM-powered calculator:

```bash
# Run an exported agent
uv run python -m framework run exports/calculator --input '{"expression": "2 + 3 * 4"}'

# Interactive shell session
uv run python -m framework shell exports/calculator

# Show agent info
uv run python -m framework info exports/calculator
```

### Using the Runtime

```python
from framework import Runtime

runtime = Runtime("/path/to/storage")

# Start a run
run_id = runtime.start_run("my_goal", "Description of what we're doing")

# Record a decision
decision_id = runtime.decide(
    intent="Choose how to process the data",
    options=[
        {"id": "fast", "description": "Quick processing", "pros": ["Fast"], "cons": ["Less accurate"]},
        {"id": "thorough", "description": "Detailed processing", "pros": ["Accurate"], "cons": ["Slower"]},
    ],
    chosen="thorough",
    reasoning="Accuracy is more important for this task"
)

# Record the outcome
runtime.record_outcome(
    decision_id=decision_id,
    success=True,
    result={"processed": 100},
    summary="Processed 100 items with detailed analysis"
)

# End the run
runtime.end_run(success=True, narrative="Successfully processed all data")
```

### Testing Agents

The framework includes a goal-based testing framework for validating agent behavior.

Tests are generated using MCP tools (`generate_constraint_tests`, `generate_success_tests`) which return guidelines. Claude writes tests directly using the Write tool based on these guidelines.

```bash
# Run tests against an agent
uv run python -m framework test-run <agent_path> --goal <goal_id> --parallel 4

# Debug failed tests
uv run python -m framework test-debug <agent_path> <test_name>

# List tests for an agent
uv run python -m framework test-list <agent_path>
```

For detailed testing workflows, see [developer-guide.md](../docs/developer-guide.md).

### Analyzing Agent Behavior with Builder

The BuilderQuery interface allows you to analyze agent runs and identify improvements:

```python
from framework import BuilderQuery

query = BuilderQuery("/path/to/storage")

# Find patterns across runs
patterns = query.find_patterns("my_goal")
print(f"Success rate: {patterns.success_rate:.1%}")

# Analyze a failure
analysis = query.analyze_failure("run_123")
print(f"Root cause: {analysis.root_cause}")
print(f"Suggestions: {analysis.suggestions}")

# Get improvement recommendations
suggestions = query.suggest_improvements("my_goal")
for s in suggestions:
    print(f"[{s['priority']}] {s['recommendation']}")
```

## Architecture

```
┌─────────────────┐
│  Human Engineer │  ← Supervision, approval
└────────┬────────┘
         │
┌────────▼────────┐
│   Builder LLM   │  ← Analyzes runs, suggests improvements
│  (BuilderQuery) │
└────────┬────────┘
         │
┌────────▼────────┐
│   Agent LLM     │  ← Executes tasks, records decisions
│    (Runtime)    │
└─────────────────┘
```

## Key Concepts

- **Decision**: The atomic unit of agent behavior. Captures intent, options, choice, and reasoning.
- **Run**: A complete execution with all decisions and outcomes.
- **Runtime**: Interface agents use to record their behavior.
- **BuilderQuery**: Interface Builder uses to analyze agent behavior.

## Requirements

- Python 3.11+
- pydantic >= 2.0
- anthropic >= 0.40.0 (for LLM-powered agents)


================================================
FILE: core/antigravity_auth.py
================================================
#!/usr/bin/env python3
"""Antigravity authentication CLI.

Implements OAuth2 flow for Google's Antigravity Code Assist gateway.
Credentials are stored in ~/.hive/antigravity-accounts.json.

Usage:
    python -m antigravity_auth auth account add
    python -m antigravity_auth auth account list
    python -m antigravity_auth auth account remove <email>
"""

from __future__ import annotations

import argparse
import json
import logging
import os
import secrets
import socket
import sys
import time
import urllib.parse
import urllib.request
import webbrowser
from http.server import BaseHTTPRequestHandler, HTTPServer
from pathlib import Path
from typing import Any

logging.basicConfig(level=logging.INFO, format="%(message)s")
logger = logging.getLogger(__name__)

# OAuth endpoints
_OAUTH_AUTH_URL = "https://accounts.google.com/o/oauth2/v2/auth"
_OAUTH_TOKEN_URL = "https://oauth2.googleapis.com/token"

# Scopes for Antigravity/Cloud Code Assist
_OAUTH_SCOPES = [
    "https://www.googleapis.com/auth/cloud-platform",
    "https://www.googleapis.com/auth/userinfo.email",
    "https://www.googleapis.com/auth/userinfo.profile",
]

# Credentials file path in ~/.hive/
_ACCOUNTS_FILE = Path.home() / ".hive" / "antigravity-accounts.json"

# Default project ID
_DEFAULT_PROJECT_ID = "rising-fact-p41fc"
_DEFAULT_REDIRECT_PORT = 51121

# OAuth credentials fetched from the opencode-antigravity-auth project.
# This project reverse-engineered and published the public OAuth credentials
# for Google's Antigravity/Cloud Code Assist API.
# Source: https://github.com/NoeFabris/opencode-antigravity-auth
_CREDENTIALS_URL = (
    "https://raw.githubusercontent.com/NoeFabris/opencode-antigravity-auth/dev/src/constants.ts"
)

# Cached credentials fetched from public source
_cached_client_id: str | None = None
_cached_client_secret: str | None = None


def _fetch_credentials_from_public_source() -> tuple[str | None, str | None]:
    """Fetch OAuth client ID and secret from the public npm package source on GitHub."""
    global _cached_client_id, _cached_client_secret
    if _cached_client_id and _cached_client_secret:
        return _cached_client_id, _cached_client_secret

    try:
        req = urllib.request.Request(
            _CREDENTIALS_URL, headers={"User-Agent": "Hive-Antigravity-Auth/1.0"}
        )
        with urllib.request.urlopen(req, timeout=10) as resp:
            content = resp.read().decode("utf-8")
            import re

            id_match = re.search(r'ANTIGRAVITY_CLIENT_ID\s*=\s*"([^"]+)"', content)
            secret_match = re.search(r'ANTIGRAVITY_CLIENT_SECRET\s*=\s*"([^"]+)"', content)
            if id_match:
                _cached_client_id = id_match.group(1)
            if secret_match:
                _cached_client_secret = secret_match.group(1)
            return _cached_client_id, _cached_client_secret
    except Exception as e:
        logger.debug(f"Failed to fetch credentials from public source: {e}")
    return None, None


def get_client_id() -> str:
    """Get OAuth client ID from env, config, or public source."""
    env_id = os.environ.get("ANTIGRAVITY_CLIENT_ID")
    if env_id:
        return env_id

    # Try hive config
    hive_cfg = Path.home() / ".hive" / "configuration.json"
    if hive_cfg.exists():
        try:
            with open(hive_cfg) as f:
                cfg = json.load(f)
                cfg_id = cfg.get("llm", {}).get("antigravity_client_id")
                if cfg_id:
                    return cfg_id
        except Exception:
            pass

    # Fetch from public source
    client_id, _ = _fetch_credentials_from_public_source()
    if client_id:
        return client_id

    raise RuntimeError("Could not obtain Antigravity OAuth client ID")


def get_client_secret() -> str | None:
    """Get OAuth client secret from env, config, or public source."""
    secret = os.environ.get("ANTIGRAVITY_CLIENT_SECRET")
    if secret:
        return secret

    # Try to read from hive config
    hive_cfg = Path.home() / ".hive" / "configuration.json"
    if hive_cfg.exists():
        try:
            with open(hive_cfg) as f:
                cfg = json.load(f)
                secret = cfg.get("llm", {}).get("antigravity_client_secret")
                if secret:
                    return secret
        except Exception:
            pass

    # Fetch from public source (npm package on GitHub)
    _, secret = _fetch_credentials_from_public_source()
    return secret


def find_free_port() -> int:
    """Find an available local port."""
    with socket.socket(socket.AF_INET, socket.SOCK_STREAM) as s:
        s.bind(("", 0))
        s.listen(1)
        return s.getsockname()[1]


class OAuthCallbackHandler(BaseHTTPRequestHandler):
    """Handle OAuth callback from browser."""

    auth_code: str | None = None
    state: str | None = None
    error: str | None = None

    def log_message(self, format: str, *args: Any) -> None:
        pass  # Suppress default logging

    def do_GET(self) -> None:
        parsed = urllib.parse.urlparse(self.path)

        if parsed.path == "/oauth-callback":
            query = urllib.parse.parse_qs(parsed.query)

            if "error" in query:
                self.error = query["error"][0]
                self._send_response("Authentication failed. You can close this window.")
                return

            if "code" in query and "state" in query:
                OAuthCallbackHandler.auth_code = query["code"][0]
                OAuthCallbackHandler.state = query["state"][0]
                self._send_response(
                    "Authentication successful! You can close this window "
                    "and return to the terminal."
                )
                return

        self._send_response("Waiting for authentication...")

    def _send_response(self, message: str) -> None:
        self.send_response(200)
        self.send_header("Content-Type", "text/html")
        self.end_headers()
        html = f"""<!DOCTYPE html>
<html>
<head><title>Antigravity Auth</title></head>
<body style="font-family: system-ui; display: flex; align-items: center;
      justify-content: center; height: 100vh; margin: 0; background: #1a1a2e;
      color: #eee;">
    <div style="text-align: center;">
        <h2>{message}</h2>
    </div>
</body>
</html>"""
        self.wfile.write(html.encode())


def wait_for_callback(port: int, timeout: int = 300) -> tuple[str | None, str | None, str | None]:
    """Start local server and wait for OAuth callback."""
    server = HTTPServer(("localhost", port), OAuthCallbackHandler)
    server.timeout = 1

    start = time.time()
    while time.time() - start < timeout:
        if OAuthCallbackHandler.auth_code:
            return (
                OAuthCallbackHandler.auth_code,
                OAuthCallbackHandler.state,
                OAuthCallbackHandler.error,
            )
        server.handle_request()

    return None, None, "timeout"


def exchange_code_for_tokens(
    code: str, redirect_uri: str, client_id: str, client_secret: str | None
) -> dict[str, Any] | None:
    """Exchange authorization code for tokens."""
    data = {
        "code": code,
        "client_id": client_id,
        "redirect_uri": redirect_uri,
        "grant_type": "authorization_code",
    }
    if client_secret:
        data["client_secret"] = client_secret

    body = urllib.parse.urlencode(data).encode()

    req = urllib.request.Request(
        _OAUTH_TOKEN_URL,
        data=body,
        headers={"Content-Type": "application/x-www-form-urlencoded"},
        method="POST",
    )

    try:
        with urllib.request.urlopen(req, timeout=30) as resp:
            return json.loads(resp.read())
    except Exception as e:
        logger.error(f"Token exchange failed: {e}")
        return None


def get_user_email(access_token: str) -> str | None:
    """Get user email from Google API."""
    req = urllib.request.Request(
        "https://www.googleapis.com/oauth2/v2/userinfo",
        headers={"Authorization": f"Bearer {access_token}"},
    )
    try:
        with urllib.request.urlopen(req, timeout=10) as resp:
            data = json.loads(resp.read())
            return data.get("email")
    except Exception:
        return None


def load_accounts() -> dict[str, Any]:
    """Load existing accounts from file."""
    if not _ACCOUNTS_FILE.exists():
        return {"schemaVersion": 4, "accounts": []}
    try:
        with open(_ACCOUNTS_FILE) as f:
            return json.load(f)
    except Exception:
        return {"schemaVersion": 4, "accounts": []}


def save_accounts(data: dict[str, Any]) -> None:
    """Save accounts to file."""
    _ACCOUNTS_FILE.parent.mkdir(parents=True, exist_ok=True)
    with open(_ACCOUNTS_FILE, "w") as f:
        json.dump(data, f, indent=2)
    logger.info(f"Saved credentials to {_ACCOUNTS_FILE}")


def validate_credentials(access_token: str, project_id: str = _DEFAULT_PROJECT_ID) -> bool:
    """Test if credentials work by making a simple API call to Antigravity.

    Returns True if credentials are valid, False otherwise.
    """
    endpoint = "https://daily-cloudcode-pa.sandbox.googleapis.com"
    body = {
        "project": project_id,
        "model": "gemini-3-flash",
        "request": {
            "contents": [{"role": "user", "parts": [{"text": "hi"}]}],
            "generationConfig": {"maxOutputTokens": 10},
        },
        "requestType": "agent",
        "userAgent": "antigravity",
        "requestId": "validation-test",
    }
    headers = {
        "Authorization": f"Bearer {access_token}",
        "Content-Type": "application/json",
        "User-Agent": (
            "Mozilla/5.0 (Macintosh; Intel Mac OS X 10_15_7) "
            "AppleWebKit/537.36 (KHTML, like Gecko) Antigravity/1.18.3"
        ),
        "X-Goog-Api-Client": "google-cloud-sdk vscode_cloudshelleditor/0.1",
    }

    try:
        req = urllib.request.Request(
            f"{endpoint}/v1internal:generateContent",
            data=json.dumps(body).encode("utf-8"),
            headers=headers,
            method="POST",
        )
        with urllib.request.urlopen(req, timeout=30) as resp:
            json.loads(resp.read())
            return True
    except Exception:
        return False


def refresh_access_token(
    refresh_token: str, client_id: str, client_secret: str | None
) -> dict | None:
    """Refresh the access token using the refresh token."""
    data = {
        "grant_type": "refresh_token",
        "refresh_token": refresh_token,
        "client_id": client_id,
    }
    if client_secret:
        data["client_secret"] = client_secret

    body = urllib.parse.urlencode(data).encode()
    req = urllib.request.Request(
        _OAUTH_TOKEN_URL,
        data=body,
        headers={"Content-Type": "application/x-www-form-urlencoded"},
        method="POST",
    )
    try:
        with urllib.request.urlopen(req, timeout=30) as resp:
            return json.loads(resp.read())
    except Exception as e:
        logger.debug(f"Token refresh failed: {e}")
        return None


def cmd_account_add(args: argparse.Namespace) -> int:
    """Add a new Antigravity account via OAuth2.

    First checks if valid credentials already exist. If so, validates them
    and skips OAuth if they work. Otherwise, proceeds with OAuth flow.
    """
    client_id = get_client_id()
    client_secret = get_client_secret()

    # Check if credentials already exist
    accounts_data = load_accounts()
    accounts = accounts_data.get("accounts", [])

    if accounts:
        account = next((a for a in accounts if a.get("enabled", True) is not False), accounts[0])
        access_token = account.get("access")
        refresh_token_str = account.get("refresh", "")
        refresh_token = refresh_token_str.split("|")[0] if refresh_token_str else None
        project_id = (
            refresh_token_str.split("|")[1] if "|" in refresh_token_str else _DEFAULT_PROJECT_ID
        )
        email = account.get("email", "unknown")
        expires_ms = account.get("expires", 0)
        expires_at = expires_ms / 1000.0 if expires_ms else 0.0

        # Check if token is expired or near expiry
        if access_token and expires_at and time.time() < expires_at - 60:
            # Token still valid, test it
            logger.info(f"Found existing credentials for: {email}")
            logger.info("Validating existing credentials...")
            if validate_credentials(access_token, project_id):
                logger.info("✓ Credentials valid! Skipping OAuth.")
                return 0
            else:
                logger.info("Credentials failed validation, refreshing...")
        elif refresh_token:
            logger.info(f"Found expired credentials for: {email}")
            logger.info("Attempting token refresh...")

            tokens = refresh_access_token(refresh_token, client_id, client_secret)
            if tokens:
                new_access = tokens.get("access_token")
                expires_in = tokens.get("expires_in", 3600)
                if new_access:
                    # Update the account
                    account["access"] = new_access
                    account["expires"] = int((time.time() + expires_in) * 1000)
                    accounts_data["last_refresh"] = time.strftime(
                        "%Y-%m-%dT%H:%M:%SZ", time.gmtime()
                    )
                    save_accounts(accounts_data)

                    # Validate the refreshed token
                    logger.info("Validating refreshed credentials...")
                    if validate_credentials(new_access, project_id):
                        logger
Download .txt
gitextract_4nmquuv5/

├── .claude/
│   ├── settings.json
│   ├── settings.local.json.example
│   └── skills/
│       └── triage-issue/
│           └── SKILL.md
├── .cursorrules
├── .dockerignore
├── .editorconfig
├── .gitattributes
├── .github/
│   ├── CODEOWNERS
│   ├── ISSUE_TEMPLATE/
│   │   ├── bug_report.md
│   │   ├── feature_request.md
│   │   ├── integration-bounty.yml
│   │   ├── integration-request.md
│   │   └── standard-bounty.yml
│   ├── PULL_REQUEST_TEMPLATE.md
│   └── workflows/
│       ├── auto-close-duplicates.yml
│       ├── bounty-completed.yml
│       ├── ci.yml
│       ├── claude-issue-triage.yml
│       ├── pr-check-command.yml
│       ├── pr-requirements-backfill.yml
│       ├── pr-requirements-enforce.yml
│       ├── pr-requirements.yml
│       ├── release.yml
│       └── weekly-leaderboard.yml
├── .gitignore
├── .mcp.json
├── .pre-commit-config.yaml
├── .python-version
├── AGENTS.md
├── CHANGELOG.md
├── CONTRIBUTING.md
├── LICENSE
├── Makefile
├── README.md
├── SECURITY.md
├── core/
│   ├── .gitignore
│   ├── .mcp.json
│   ├── MCP_BUILDER_TOOLS_GUIDE.md
│   ├── MCP_INTEGRATION_GUIDE.md
│   ├── MCP_SERVER_GUIDE.md
│   ├── README.md
│   ├── antigravity_auth.py
│   ├── codex_oauth.py
│   ├── examples/
│   │   ├── manual_agent.py
│   │   ├── mcp_integration_example.py
│   │   └── mcp_servers.json
│   ├── framework/
│   │   ├── __init__.py
│   │   ├── __main__.py
│   │   ├── agents/
│   │   │   ├── __init__.py
│   │   │   ├── credential_tester/
│   │   │   │   ├── __init__.py
│   │   │   │   ├── __main__.py
│   │   │   │   ├── agent.py
│   │   │   │   ├── config.py
│   │   │   │   ├── mcp_servers.json
│   │   │   │   └── nodes/
│   │   │   │       └── __init__.py
│   │   │   ├── discovery.py
│   │   │   ├── queen/
│   │   │   │   ├── __init__.py
│   │   │   │   ├── agent.py
│   │   │   │   ├── config.py
│   │   │   │   ├── mcp_servers.json
│   │   │   │   ├── nodes/
│   │   │   │   │   ├── __init__.py
│   │   │   │   │   └── thinking_hook.py
│   │   │   │   ├── queen_memory.py
│   │   │   │   ├── reference/
│   │   │   │   │   ├── anti_patterns.md
│   │   │   │   │   ├── file_templates.md
│   │   │   │   │   ├── framework_guide.md
│   │   │   │   │   ├── gcu_guide.md
│   │   │   │   │   └── queen_memory.md
│   │   │   │   ├── tests/
│   │   │   │   │   ├── __init__.py
│   │   │   │   │   └── conftest.py
│   │   │   │   └── ticket_receiver.py
│   │   │   └── worker_memory.py
│   │   ├── cli.py
│   │   ├── config.py
│   │   ├── credentials/
│   │   │   ├── __init__.py
│   │   │   ├── aden/
│   │   │   │   ├── __init__.py
│   │   │   │   ├── client.py
│   │   │   │   ├── provider.py
│   │   │   │   ├── storage.py
│   │   │   │   └── tests/
│   │   │   │       ├── __init__.py
│   │   │   │       └── test_aden_sync.py
│   │   │   ├── key_storage.py
│   │   │   ├── local/
│   │   │   │   ├── __init__.py
│   │   │   │   ├── models.py
│   │   │   │   └── registry.py
│   │   │   ├── models.py
│   │   │   ├── oauth2/
│   │   │   │   ├── __init__.py
│   │   │   │   ├── base_provider.py
│   │   │   │   ├── hubspot_provider.py
│   │   │   │   ├── lifecycle.py
│   │   │   │   ├── provider.py
│   │   │   │   └── zoho_provider.py
│   │   │   ├── provider.py
│   │   │   ├── setup.py
│   │   │   ├── storage.py
│   │   │   ├── store.py
│   │   │   ├── template.py
│   │   │   ├── tests/
│   │   │   │   ├── __init__.py
│   │   │   │   └── test_credential_store.py
│   │   │   └── validation.py
│   │   ├── debugger/
│   │   │   ├── __init__.py
│   │   │   └── cli.py
│   │   ├── graph/
│   │   │   ├── __init__.py
│   │   │   ├── checkpoint_config.py
│   │   │   ├── client_io.py
│   │   │   ├── context_handoff.py
│   │   │   ├── conversation.py
│   │   │   ├── conversation_judge.py
│   │   │   ├── edge.py
│   │   │   ├── event_loop_node.py
│   │   │   ├── executor.py
│   │   │   ├── files.py
│   │   │   ├── gcu.py
│   │   │   ├── goal.py
│   │   │   ├── node.py
│   │   │   ├── prompt_composer.py
│   │   │   ├── safe_eval.py
│   │   │   └── validator.py
│   │   ├── llm/
│   │   │   ├── __init__.py
│   │   │   ├── anthropic.py
│   │   │   ├── antigravity.py
│   │   │   ├── litellm.py
│   │   │   ├── mock.py
│   │   │   ├── provider.py
│   │   │   └── stream_events.py
│   │   ├── monitoring/
│   │   │   └── __init__.py
│   │   ├── observability/
│   │   │   ├── README.md
│   │   │   ├── __init__.py
│   │   │   └── logging.py
│   │   ├── runner/
│   │   │   ├── __init__.py
│   │   │   ├── cli.py
│   │   │   ├── mcp_client.py
│   │   │   ├── mcp_connection_manager.py
│   │   │   ├── orchestrator.py
│   │   │   ├── preload_validation.py
│   │   │   ├── protocol.py
│   │   │   ├── runner.py
│   │   │   └── tool_registry.py
│   │   ├── runtime/
│   │   │   ├── EVENT_TYPES.md
│   │   │   ├── README.md
│   │   │   ├── RESUMABLE_SESSIONS_DESIGN.md
│   │   │   ├── RUNTIME_LOGGING.md
│   │   │   ├── __init__.py
│   │   │   ├── agent_runtime.py
│   │   │   ├── core.py
│   │   │   ├── escalation_ticket.py
│   │   │   ├── event_bus.py
│   │   │   ├── execution_stream.py
│   │   │   ├── llm_debug_logger.py
│   │   │   ├── outcome_aggregator.py
│   │   │   ├── runtime_log_schemas.py
│   │   │   ├── runtime_log_store.py
│   │   │   ├── runtime_logger.py
│   │   │   ├── shared_state.py
│   │   │   ├── stream_runtime.py
│   │   │   ├── tests/
│   │   │   │   ├── __init__.py
│   │   │   │   ├── test_agent_runtime.py
│   │   │   │   ├── test_runtime_logging_paths.py
│   │   │   │   └── test_webhook_server.py
│   │   │   ├── triggers.py
│   │   │   └── webhook_server.py
│   │   ├── schemas/
│   │   │   ├── __init__.py
│   │   │   ├── checkpoint.py
│   │   │   ├── decision.py
│   │   │   ├── run.py
│   │   │   └── session_state.py
│   │   ├── server/
│   │   │   ├── README.md
│   │   │   ├── __init__.py
│   │   │   ├── app.py
│   │   │   ├── queen_orchestrator.py
│   │   │   ├── routes_credentials.py
│   │   │   ├── routes_events.py
│   │   │   ├── routes_execution.py
│   │   │   ├── routes_graphs.py
│   │   │   ├── routes_logs.py
│   │   │   ├── routes_sessions.py
│   │   │   ├── session_manager.py
│   │   │   ├── sse.py
│   │   │   └── tests/
│   │   │       ├── __init__.py
│   │   │       └── test_api.py
│   │   ├── skills/
│   │   │   ├── __init__.py
│   │   │   ├── _default_skills/
│   │   │   │   ├── batch-ledger/
│   │   │   │   │   └── SKILL.md
│   │   │   │   ├── context-preservation/
│   │   │   │   │   └── SKILL.md
│   │   │   │   ├── error-recovery/
│   │   │   │   │   └── SKILL.md
│   │   │   │   ├── note-taking/
│   │   │   │   │   └── SKILL.md
│   │   │   │   ├── quality-monitor/
│   │   │   │   │   └── SKILL.md
│   │   │   │   └── task-decomposition/
│   │   │   │       └── SKILL.md
│   │   │   ├── catalog.py
│   │   │   ├── cli.py
│   │   │   ├── config.py
│   │   │   ├── defaults.py
│   │   │   ├── discovery.py
│   │   │   ├── manager.py
│   │   │   ├── models.py
│   │   │   ├── parser.py
│   │   │   ├── skill_errors.py
│   │   │   └── trust.py
│   │   ├── storage/
│   │   │   ├── __init__.py
│   │   │   ├── backend.py
│   │   │   ├── checkpoint_store.py
│   │   │   ├── concurrent.py
│   │   │   ├── conversation_store.py
│   │   │   └── session_store.py
│   │   ├── testing/
│   │   │   ├── __init__.py
│   │   │   ├── approval_cli.py
│   │   │   ├── approval_types.py
│   │   │   ├── categorizer.py
│   │   │   ├── cli.py
│   │   │   ├── debug_tool.py
│   │   │   ├── llm_judge.py
│   │   │   ├── prompts.py
│   │   │   ├── test_case.py
│   │   │   ├── test_result.py
│   │   │   └── test_storage.py
│   │   ├── tools/
│   │   │   ├── __init__.py
│   │   │   ├── flowchart_utils.py
│   │   │   ├── queen_lifecycle_tools.py
│   │   │   ├── queen_memory_tools.py
│   │   │   ├── session_graph_tools.py
│   │   │   └── worker_monitoring_tools.py
│   │   └── utils/
│   │       ├── __init__.py
│   │       └── io.py
│   ├── frontend/
│   │   ├── components.json
│   │   ├── index.html
│   │   ├── package.json
│   │   ├── src/
│   │   │   ├── App.tsx
│   │   │   ├── api/
│   │   │   │   ├── agents.ts
│   │   │   │   ├── client.ts
│   │   │   │   ├── credentials.ts
│   │   │   │   ├── execution.ts
│   │   │   │   ├── graphs.ts
│   │   │   │   ├── logs.ts
│   │   │   │   ├── sessions.ts
│   │   │   │   └── types.ts
│   │   │   ├── components/
│   │   │   │   ├── ChatPanel.tsx
│   │   │   │   ├── CredentialsModal.tsx
│   │   │   │   ├── DraftGraph.tsx
│   │   │   │   ├── HistorySidebar.tsx
│   │   │   │   ├── MarkdownContent.tsx
│   │   │   │   ├── MultiQuestionWidget.tsx
│   │   │   │   ├── NodeDetailPanel.tsx
│   │   │   │   ├── ParallelSubagentBubble.tsx
│   │   │   │   ├── QuestionWidget.tsx
│   │   │   │   ├── RunButton.tsx
│   │   │   │   ├── TopBar.tsx
│   │   │   │   └── graph-types.ts
│   │   │   ├── hooks/
│   │   │   │   └── use-sse.ts
│   │   │   ├── index.css
│   │   │   ├── lib/
│   │   │   │   ├── chat-helpers.test.ts
│   │   │   │   ├── chat-helpers.ts
│   │   │   │   ├── graph-converter.test.ts
│   │   │   │   ├── graph-converter.ts
│   │   │   │   ├── graphUtils.ts
│   │   │   │   ├── tab-persistence.ts
│   │   │   │   └── utils.ts
│   │   │   ├── main.tsx
│   │   │   ├── pages/
│   │   │   │   ├── home.tsx
│   │   │   │   ├── my-agents.tsx
│   │   │   │   └── workspace.tsx
│   │   │   └── vite-env.d.ts
│   │   ├── tsconfig.json
│   │   ├── tsconfig.node.json
│   │   └── vite.config.ts
│   ├── pyproject.toml
│   ├── setup_mcp.sh
│   └── tests/
│       ├── __init__.py
│       ├── debug_codex_stream.py
│       ├── debug_codex_verbose.py
│       ├── dummy_agents/
│       │   ├── README.md
│       │   ├── __init__.py
│       │   ├── conftest.py
│       │   ├── nodes.py
│       │   ├── run_all.py
│       │   ├── test_branch.py
│       │   ├── test_echo.py
│       │   ├── test_feedback_loop.py
│       │   ├── test_gcu_subagent.py
│       │   ├── test_parallel_merge.py
│       │   ├── test_pipeline.py
│       │   ├── test_retry.py
│       │   └── test_worker.py
│       ├── test_antigravity_eventloop.py
│       ├── test_check_llm_key_openrouter.py
│       ├── test_cli_entry_point.py
│       ├── test_client_facing_validation.py
│       ├── test_client_io.py
│       ├── test_codex_eventloop.py
│       ├── test_conditional_edge_direct_key.py
│       ├── test_config.py
│       ├── test_context_handoff.py
│       ├── test_continuous_conversation.py
│       ├── test_conversation_judge.py
│       ├── test_credential_bootstrap.py
│       ├── test_default_skills.py
│       ├── test_event_loop_integration.py
│       ├── test_event_loop_node.py
│       ├── test_event_loop_wiring.py
│       ├── test_event_type_extension.py
│       ├── test_execution_quality.py
│       ├── test_execution_stream.py
│       ├── test_executor_feedback_edges.py
│       ├── test_executor_max_retries.py
│       ├── test_fanout.py
│       ├── test_find_json_hardened.py
│       ├── test_flowchart_utils.py
│       ├── test_graph_executor.py
│       ├── test_hallucination_detection.py
│       ├── test_litellm_provider.py
│       ├── test_litellm_streaming.py
│       ├── test_llm_judge.py
│       ├── test_mcp_client.py
│       ├── test_mcp_connection_manager.py
│       ├── test_mcp_server.py
│       ├── test_node_conversation.py
│       ├── test_node_json_performance.py
│       ├── test_on_failure_edges.py
│       ├── test_orchestrator.py
│       ├── test_path_traversal_fix.py
│       ├── test_phase_compaction.py
│       ├── test_pydantic_validation.py
│       ├── test_run.py
│       ├── test_runner_api_key_env_var.py
│       ├── test_runtime.py
│       ├── test_runtime_logger.py
│       ├── test_safe_eval.py
│       ├── test_session_manager_worker_handoff.py
│       ├── test_skill_allowlist.py
│       ├── test_skill_catalog.py
│       ├── test_skill_context_protection.py
│       ├── test_skill_discovery.py
│       ├── test_skill_errors.py
│       ├── test_skill_integration.py
│       ├── test_skill_parser.py
│       ├── test_skill_resources.py
│       ├── test_skill_trust.py
│       ├── test_storage.py
│       ├── test_stream_events.py
│       ├── test_subagent.py
│       ├── test_subagent_escalation_e2e.py
│       ├── test_testing_framework.py
│       ├── test_tool_registry.py
│       ├── test_trigger_fires_into_queen.py
│       ├── test_two_llm_calls.py
│       └── test_validate_agent_path.py
├── docs/
│   ├── CODE_OF_CONDUCT.md
│   ├── Queen Bee Outcome Evaluation - Generation.csv
│   ├── aden-credential-sync.md
│   ├── agent_runtime.md
│   ├── architecture/
│   │   ├── README.md
│   │   └── multi-entry-point-agents.md
│   ├── articles/
│   │   ├── README.md
│   │   ├── aden-vs-autogen.md
│   │   ├── aden-vs-crewai.md
│   │   ├── aden-vs-langchain.md
│   │   ├── ai-agent-cost-management-guide.md
│   │   ├── ai-agent-observability-monitoring.md
│   │   ├── building-production-ai-agents.md
│   │   ├── human-in-the-loop-ai-agents.md
│   │   ├── multi-agent-vs-single-agent-systems.md
│   │   ├── self-improving-vs-static-agents.md
│   │   └── top-10-ai-agent-frameworks-2025.md
│   ├── bounty-program/
│   │   ├── README.md
│   │   ├── contributor-guide.md
│   │   ├── game-master-manual.md
│   │   ├── promotion-checklist.md
│   │   ├── setup-guide.md
│   │   └── templates/
│   │       ├── agent-test-report-template.md
│   │       └── tool-readme-template.md
│   ├── cleanup-plan.md
│   ├── configuration.md
│   ├── contributing-lint-setup.md
│   ├── credential-identity-plan.md
│   ├── credential-store-design.md
│   ├── credential-store-usage.md
│   ├── credential-system-analysis.md
│   ├── developer-guide.md
│   ├── draft-flowchart-schema.md
│   ├── environment-setup.md
│   ├── getting-started.md
│   ├── hive-coder-meta-agent-plan.md
│   ├── i18n/
│   │   ├── es.md
│   │   ├── hi.md
│   │   ├── ja.md
│   │   ├── ko.md
│   │   ├── pt.md
│   │   ├── ru.md
│   │   └── zh-CN.md
│   ├── issue-local-credential-parity.md
│   ├── issue-queen-bee.md
│   ├── key_concepts/
│   │   ├── evolution.md
│   │   ├── goals_outcome.md
│   │   ├── graph.md
│   │   └── worker_agent.md
│   ├── mcp-registry-prd.md
│   ├── multi-graph-sessions.md
│   ├── pr-requirements.md
│   ├── quizzes/
│   │   ├── 00-job-post.md
│   │   ├── 01-getting-started.md
│   │   ├── 02-architecture-deep-dive.md
│   │   ├── 03-build-your-first-agent.md
│   │   ├── 04-frontend-challenge.md
│   │   ├── 05-devops-challenge.md
│   │   └── README.md
│   ├── releases/
│   │   └── v0.4.0.md
│   ├── roadmap-developer-success.md
│   ├── roadmap.md
│   ├── runtime_initialization.md
│   ├── server-cli-arch.md
│   ├── skill-registry-prd.md
│   ├── skills-user-guide.md
│   ├── tools.md
│   └── worker-health-monitoring.md
├── examples/
│   ├── README.md
│   ├── recipes/
│   │   └── sample_prompts_for_use_cases.md
│   └── templates/
│       ├── README.md
│       ├── competitive_intel_agent/
│       │   ├── README.md
│       │   ├── __init__.py
│       │   ├── __main__.py
│       │   ├── agent.json
│       │   ├── agent.py
│       │   ├── config.py
│       │   ├── flowchart.json
│       │   ├── mcp_servers.json
│       │   └── nodes/
│       │       └── __init__.py
│       ├── deep_research_agent/
│       │   ├── README.md
│       │   ├── __init__.py
│       │   ├── __main__.py
│       │   ├── agent.json
│       │   ├── agent.py
│       │   ├── config.py
│       │   ├── flowchart.json
│       │   ├── mcp_servers.json
│       │   └── nodes/
│       │       └── __init__.py
│       ├── email_inbox_management/
│       │   ├── README.md
│       │   ├── __init__.py
│       │   ├── __main__.py
│       │   ├── agent.json
│       │   ├── agent.py
│       │   ├── config.py
│       │   ├── flowchart.json
│       │   ├── mcp_servers.json
│       │   ├── nodes/
│       │   │   └── __init__.py
│       │   ├── tools.py
│       │   └── triggers.json
│       ├── email_reply_agent/
│       │   ├── __init__.py
│       │   ├── __main__.py
│       │   ├── agent.py
│       │   ├── config.py
│       │   ├── flowchart.json
│       │   ├── mcp_servers.json
│       │   ├── nodes/
│       │   │   └── __init__.py
│       │   └── tests/
│       │       ├── conftest.py
│       │       └── test_structure.py
│       ├── job_hunter/
│       │   ├── README.md
│       │   ├── __init__.py
│       │   ├── __main__.py
│       │   ├── agent.json
│       │   ├── agent.py
│       │   ├── config.py
│       │   ├── flowchart.json
│       │   ├── mcp_servers.json
│       │   └── nodes/
│       │       └── __init__.py
│       ├── local_business_extractor/
│       │   ├── README.md
│       │   ├── __init__.py
│       │   ├── __main__.py
│       │   ├── agent.py
│       │   ├── config.py
│       │   ├── flowchart.json
│       │   ├── mcp_servers.json
│       │   └── nodes/
│       │       └── __init__.py
│       ├── meeting_scheduler/
│       │   ├── __init__.py
│       │   ├── __main__.py
│       │   ├── agent.py
│       │   ├── config.py
│       │   ├── flowchart.json
│       │   ├── mcp_servers.json
│       │   ├── nodes/
│       │   │   └── __init__.py
│       │   └── tests/
│       │       ├── conftest.py
│       │       └── test_structure.py
│       ├── sdr_agent/
│       │   ├── README.md
│       │   ├── __init__.py
│       │   ├── __main__.py
│       │   ├── agent.json
│       │   ├── agent.py
│       │   ├── config.py
│       │   ├── demo_contacts.json
│       │   ├── flowchart.json
│       │   ├── mcp_servers.json
│       │   ├── nodes/
│       │   │   └── __init__.py
│       │   └── tools.py
│       ├── tech_news_reporter/
│       │   ├── README.md
│       │   ├── __init__.py
│       │   ├── __main__.py
│       │   ├── agent.json
│       │   ├── agent.py
│       │   ├── config.py
│       │   ├── flowchart.json
│       │   ├── mcp_servers.json
│       │   └── nodes/
│       │       └── __init__.py
│       ├── twitter_news_agent/
│       │   ├── README.md
│       │   ├── __init__.py
│       │   ├── __main__.py
│       │   ├── agent.py
│       │   ├── config.py
│       │   ├── flowchart.json
│       │   ├── mcp_servers.json
│       │   └── nodes/
│       │       └── __init__.py
│       └── vulnerability_assessment/
│           ├── README.md
│           ├── __init__.py
│           ├── __main__.py
│           ├── agent.json
│           ├── agent.py
│           ├── config.py
│           ├── flowchart.json
│           ├── mcp_servers.json
│           └── nodes/
│               └── __init__.py
├── hive
├── hive.ps1
├── package.json
├── pyproject.toml
├── quickstart.ps1
├── quickstart.sh
├── scripts/
│   ├── auto-close-duplicates.test.ts
│   ├── auto-close-duplicates.ts
│   ├── benchmark_quickstart.ps1
│   ├── bounty-tracker.ts
│   ├── check_llm_key.py
│   ├── check_requirements.py
│   ├── debug_queen_prompt.py
│   ├── llm_debug_log_visualizer.py
│   ├── setup-bounty-labels.sh
│   ├── setup_worker_model.ps1
│   ├── setup_worker_model.sh
│   ├── test_check_requirements.py
│   ├── test_init_package.py
│   └── uv-discovery.ps1
├── tools/
│   ├── BUILDING_TOOLS.md
│   ├── Dockerfile
│   ├── README.md
│   ├── coder_tools_server.py
│   ├── create_aden_testdb.py
│   ├── files_server.py
│   ├── grant_permissions.py
│   ├── init_aden_testdb.sql
│   ├── mcp_server.py
│   ├── mcp_servers.json
│   ├── payroll_analysis.py
│   ├── pyproject.toml
│   ├── query_avg_salary.py
│   ├── src/
│   │   ├── aden_tools/
│   │   │   ├── __init__.py
│   │   │   ├── _win32_atomic.py
│   │   │   ├── credentials/
│   │   │   │   ├── __init__.py
│   │   │   │   ├── airtable.py
│   │   │   │   ├── apify.py
│   │   │   │   ├── apollo.py
│   │   │   │   ├── asana.py
│   │   │   │   ├── attio.py
│   │   │   │   ├── aws_s3.py
│   │   │   │   ├── azure_sql.py
│   │   │   │   ├── base.py
│   │   │   │   ├── bigquery.py
│   │   │   │   ├── brevo.py
│   │   │   │   ├── browser.py
│   │   │   │   ├── calcom.py
│   │   │   │   ├── calendly.py
│   │   │   │   ├── cloudinary.py
│   │   │   │   ├── confluence.py
│   │   │   │   ├── databricks.py
│   │   │   │   ├── discord.py
│   │   │   │   ├── docker_hub.py
│   │   │   │   ├── email.py
│   │   │   │   ├── gcp_vision.py
│   │   │   │   ├── github.py
│   │   │   │   ├── gitlab.py
│   │   │   │   ├── google_analytics.py
│   │   │   │   ├── google_maps.py
│   │   │   │   ├── google_search_console.py
│   │   │   │   ├── greenhouse.py
│   │   │   │   ├── health_check.py
│   │   │   │   ├── hubspot.py
│   │   │   │   ├── huggingface.py
│   │   │   │   ├── integrations.py
│   │   │   │   ├── intercom.py
│   │   │   │   ├── jira.py
│   │   │   │   ├── kafka.py
│   │   │   │   ├── langfuse.py
│   │   │   │   ├── linear.py
│   │   │   │   ├── lusha.py
│   │   │   │   ├── microsoft_graph.py
│   │   │   │   ├── mongodb.py
│   │   │   │   ├── n8n.py
│   │   │   │   ├── news.py
│   │   │   │   ├── notion.py
│   │   │   │   ├── obsidian.py
│   │   │   │   ├── pagerduty.py
│   │   │   │   ├── pinecone.py
│   │   │   │   ├── pipedrive.py
│   │   │   │   ├── plaid.py
│   │   │   │   ├── postgres.py
│   │   │   │   ├── powerbi.py
│   │   │   │   ├── pushover.py
│   │   │   │   ├── quickbooks.py
│   │   │   │   ├── razorpay.py
│   │   │   │   ├── reddit.py
│   │   │   │   ├── redis.py
│   │   │   │   ├── redshift.py
│   │   │   │   ├── salesforce.py
│   │   │   │   ├── sap.py
│   │   │   │   ├── search.py
│   │   │   │   ├── serpapi.py
│   │   │   │   ├── shell_config.py
│   │   │   │   ├── shopify.py
│   │   │   │   ├── slack.py
│   │   │   │   ├── snowflake.py
│   │   │   │   ├── store_adapter.py
│   │   │   │   ├── stripe.py
│   │   │   │   ├── supabase.py
│   │   │   │   ├── telegram.py
│   │   │   │   ├── terraform.py
│   │   │   │   ├── tines.py
│   │   │   │   ├── trello.py
│   │   │   │   ├── twilio.py
│   │   │   │   ├── twitter.py
│   │   │   │   ├── vercel.py
│   │   │   │   ├── x.py
│   │   │   │   ├── youtube.py
│   │   │   │   ├── zendesk.py
│   │   │   │   ├── zoho.py
│   │   │   │   ├── zoho_crm.py
│   │   │   │   └── zoom.py
│   │   │   ├── file_ops.py
│   │   │   ├── hashline.py
│   │   │   ├── tools/
│   │   │   │   ├── __init__.py
│   │   │   │   ├── account_info_tool/
│   │   │   │   │   ├── README.md
│   │   │   │   │   ├── __init__.py
│   │   │   │   │   └── account_info_tool.py
│   │   │   │   ├── airtable_tool/
│   │   │   │   │   ├── README.md
│   │   │   │   │   ├── __init__.py
│   │   │   │   │   └── airtable_tool.py
│   │   │   │   ├── apify_tool/
│   │   │   │   │   ├── README.md
│   │   │   │   │   ├── __init__.py
│   │   │   │   │   └── apify_tool.py
│   │   │   │   ├── apollo_tool/
│   │   │   │   │   ├── README.md
│   │   │   │   │   ├── __init__.py
│   │   │   │   │   └── apollo_tool.py
│   │   │   │   ├── arxiv_tool/
│   │   │   │   │   ├── README.md
│   │   │   │   │   ├── __init__.py
│   │   │   │   │   └── arxiv_tool.py
│   │   │   │   ├── asana_tool/
│   │   │   │   │   ├── README.md
│   │   │   │   │   ├── __init__.py
│   │   │   │   │   └── asana_tool.py
│   │   │   │   ├── attio_tool/
│   │   │   │   │   ├── README.md
│   │   │   │   │   ├── __init__.py
│   │   │   │   │   ├── attio_tool.py
│   │   │   │   │   └── tests/
│   │   │   │   │       ├── __init__.py
│   │   │   │   │       └── test_attio_tool.py
│   │   │   │   ├── aws_s3_tool/
│   │   │   │   │   ├── __init__.py
│   │   │   │   │   └── aws_s3_tool.py
│   │   │   │   ├── azure_sql_tool/
│   │   │   │   │   ├── __init__.py
│   │   │   │   │   └── azure_sql_tool.py
│   │   │   │   ├── bigquery_tool/
│   │   │   │   │   ├── README.md
│   │   │   │   │   ├── __init__.py
│   │   │   │   │   └── bigquery_tool.py
│   │   │   │   ├── brevo_tool/
│   │   │   │   │   ├── README.md
│   │   │   │   │   ├── __init__.py
│   │   │   │   │   └── brevo_tool.py
│   │   │   │   ├── calcom_tool/
│   │   │   │   │   ├── README.md
│   │   │   │   │   ├── __init__.py
│   │   │   │   │   └── calcom_tool.py
│   │   │   │   ├── calendar_tool/
│   │   │   │   │   ├── README.md
│   │   │   │   │   ├── __init__.py
│   │   │   │   │   └── calendar_tool.py
│   │   │   │   ├── calendly_tool/
│   │   │   │   │   ├── README.md
│   │   │   │   │   ├── __init__.py
│   │   │   │   │   └── calendly_tool.py
│   │   │   │   ├── cloudinary_tool/
│   │   │   │   │   ├── __init__.py
│   │   │   │   │   └── cloudinary_tool.py
│   │   │   │   ├── confluence_tool/
│   │   │   │   │   ├── __init__.py
│   │   │   │   │   └── confluence_tool.py
│   │   │   │   ├── csv_tool/
│   │   │   │   │   ├── README.md
│   │   │   │   │   ├── __init__.py
│   │   │   │   │   └── csv_tool.py
│   │   │   │   ├── databricks_tool/
│   │   │   │   │   ├── README.md
│   │   │   │   │   ├── __init__.py
│   │   │   │   │   ├── databricks_mcp_tool.py
│   │   │   │   │   └── databricks_tool.py
│   │   │   │   ├── discord_tool/
│   │   │   │   │   ├── README.md
│   │   │   │   │   ├── __init__.py
│   │   │   │   │   └── discord_tool.py
│   │   │   │   ├── dns_security_scanner/
│   │   │   │   │   ├── README.md
│   │   │   │   │   ├── __init__.py
│   │   │   │   │   └── dns_security_scanner.py
│   │   │   │   ├── docker_hub_tool/
│   │   │   │   │   ├── __init__.py
│   │   │   │   │   └── docker_hub_tool.py
│   │   │   │   ├── duckduckgo_tool/
│   │   │   │   │   ├── __init__.py
│   │   │   │   │   └── duckduckgo_tool.py
│   │   │   │   ├── email_tool/
│   │   │   │   │   ├── README.md
│   │   │   │   │   ├── __init__.py
│   │   │   │   │   └── email_tool.py
│   │   │   │   ├── exa_search_tool/
│   │   │   │   │   ├── README.md
│   │   │   │   │   ├── __init__.py
│   │   │   │   │   └── exa_search_tool.py
│   │   │   │   ├── example_tool/
│   │   │   │   │   ├── README.md
│   │   │   │   │   ├── __init__.py
│   │   │   │   │   └── example_tool.py
│   │   │   │   ├── excel_tool/
│   │   │   │   │   ├── README.md
│   │   │   │   │   ├── __init__.py
│   │   │   │   │   └── excel_tool.py
│   │   │   │   ├── file_system_toolkits/
│   │   │   │   │   ├── apply_diff/
│   │   │   │   │   │   ├── README.md
│   │   │   │   │   │   ├── __init__.py
│   │   │   │   │   │   └── apply_diff.py
│   │   │   │   │   ├── apply_patch/
│   │   │   │   │   │   ├── README.md
│   │   │   │   │   │   ├── __init__.py
│   │   │   │   │   │   └── apply_patch.py
│   │   │   │   │   ├── command_sanitizer.py
│   │   │   │   │   ├── data_tools/
│   │   │   │   │   │   ├── __init__.py
│   │   │   │   │   │   └── data_tools.py
│   │   │   │   │   ├── execute_command_tool/
│   │   │   │   │   │   ├── README.md
│   │   │   │   │   │   ├── __init__.py
│   │   │   │   │   │   └── execute_command_tool.py
│   │   │   │   │   ├── grep_search/
│   │   │   │   │   │   ├── README.md
│   │   │   │   │   │   ├── __init__.py
│   │   │   │   │   │   └── grep_search.py
│   │   │   │   │   ├── hashline.py
│   │   │   │   │   ├── hashline_edit/
│   │   │   │   │   │   ├── README.md
│   │   │   │   │   │   ├── __init__.py
│   │   │   │   │   │   └── hashline_edit.py
│   │   │   │   │   ├── list_dir/
│   │   │   │   │   │   ├── README.md
│   │   │   │   │   │   ├── __init__.py
│   │   │   │   │   │   └── list_dir.py
│   │   │   │   │   ├── replace_file_content/
│   │   │   │   │   │   ├── README.md
│   │   │   │   │   │   ├── __init__.py
│   │   │   │   │   │   └── replace_file_content.py
│   │   │   │   │   └── security.py
│   │   │   │   ├── github_tool/
│   │   │   │   │   ├── README.md
│   │   │   │   │   ├── __init__.py
│   │   │   │   │   └── github_tool.py
│   │   │   │   ├── gitlab_tool/
│   │   │   │   │   ├── __init__.py
│   │   │   │   │   └── gitlab_tool.py
│   │   │   │   ├── gmail_tool/
│   │   │   │   │   ├── README.md
│   │   │   │   │   ├── __init__.py
│   │   │   │   │   └── gmail_tool.py
│   │   │   │   ├── google_analytics_tool/
│   │   │   │   │   ├── README.md
│   │   │   │   │   ├── __init__.py
│   │   │   │   │   └── google_analytics_tool.py
│   │   │   │   ├── google_docs_tool/
│   │   │   │   │   ├── README.md
│   │   │   │   │   ├── __init__.py
│   │   │   │   │   ├── google_docs_tool.py
│   │   │   │   │   └── tests/
│   │   │   │   │       ├── __init__.py
│   │   │   │   │       └── test_google_docs_tool.py
│   │   │   │   ├── google_maps_tool/
│   │   │   │   │   ├── README.md
│   │   │   │   │   ├── __init__.py
│   │   │   │   │   └── google_maps_tool.py
│   │   │   │   ├── google_search_console_tool/
│   │   │   │   │   ├── __init__.py
│   │   │   │   │   └── google_search_console_tool.py
│   │   │   │   ├── google_sheets_tool/
│   │   │   │   │   ├── README.md
│   │   │   │   │   ├── __init__.py
│   │   │   │   │   ├── google_sheets_tool.py
│   │   │   │   │   └── tests/
│   │   │   │   │       ├── __init__.py
│   │   │   │   │       ├── test_google_sheets_integration.py
│   │   │   │   │       └── test_google_sheets_tool.py
│   │   │   │   ├── greenhouse_tool/
│   │   │   │   │   ├── __init__.py
│   │   │   │   │   └── greenhouse_tool.py
│   │   │   │   ├── http_headers_scanner/
│   │   │   │   │   ├── README.md
│   │   │   │   │   ├── __init__.py
│   │   │   │   │   └── http_headers_scanner.py
│   │   │   │   ├── hubspot_tool/
│   │   │   │   │   ├── __init__.py
│   │   │   │   │   ├── hubspot_tool.py
│   │   │   │   │   └── tests/
│   │   │   │   │       ├── __init__.py
│   │   │   │   │       └── test_hubspot_tool.py
│   │   │   │   ├── huggingface_tool/
│   │   │   │   │   ├── __init__.py
│   │   │   │   │   └── huggingface_tool.py
│   │   │   │   ├── intercom_tool/
│   │   │   │   │   ├── README.md
│   │   │   │   │   ├── __init__.py
│   │   │   │   │   ├── intercom_tool.py
│   │   │   │   │   └── tests/
│   │   │   │   │       ├── __init__.py
│   │   │   │   │       └── test_intercom_tool.py
│   │   │   │   ├── jira_tool/
│   │   │   │   │   ├── __init__.py
│   │   │   │   │   └── jira_tool.py
│   │   │   │   ├── kafka_tool/
│   │   │   │   │   ├── __init__.py
│   │   │   │   │   └── kafka_tool.py
│   │   │   │   ├── langfuse_tool/
│   │   │   │   │   ├── __init__.py
│   │   │   │   │   └── langfuse_tool.py
│   │   │   │   ├── linear_tool/
│   │   │   │   │   ├── __init__.py
│   │   │   │   │   ├── linear_tool.py
│   │   │   │   │   └── tests/
│   │   │   │   │       ├── __init__.py
│   │   │   │   │       └── test_linear_tool.py
│   │   │   │   ├── lusha_tool/
│   │   │   │   │   ├── README.md
│   │   │   │   │   ├── __init__.py
│   │   │   │   │   └── lusha_tool.py
│   │   │   │   ├── microsoft_graph_tool/
│   │   │   │   │   ├── __init__.py
│   │   │   │   │   └── microsoft_graph_tool.py
│   │   │   │   ├── mongodb_tool/
│   │   │   │   │   ├── __init__.py
│   │   │   │   │   └── mongodb_tool.py
│   │   │   │   ├── mssql_tool/
│   │   │   │   │   ├── README.md
│   │   │   │   │   ├── __init__.py
│   │   │   │   │   └── mssql_tool.py
│   │   │   │   ├── n8n_tool/
│   │   │   │   │   ├── __init__.py
│   │   │   │   │   └── n8n_tool.py
│   │   │   │   ├── news_tool/
│   │   │   │   │   ├── README.md
│   │   │   │   │   ├── __init__.py
│   │   │   │   │   └── news_tool.py
│   │   │   │   ├── notion_tool/
│   │   │   │   │   ├── README.md
│   │   │   │   │   ├── __init__.py
│   │   │   │   │   └── notion_tool.py
│   │   │   │   ├── obsidian_tool/
│   │   │   │   │   ├── __init__.py
│   │   │   │   │   └── obsidian_tool.py
│   │   │   │   ├── pagerduty_tool/
│   │   │   │   │   ├── __init__.py
│   │   │   │   │   └── pagerduty_tool.py
│   │   │   │   ├── pdf_read_tool/
│   │   │   │   │   ├── README.md
│   │   │   │   │   ├── __init__.py
│   │   │   │   │   └── pdf_read_tool.py
│   │   │   │   ├── pinecone_tool/
│   │   │   │   │   ├── __init__.py
│   │   │   │   │   └── pinecone_tool.py
│   │   │   │   ├── pipedrive_tool/
│   │   │   │   │   ├── __init__.py
│   │   │   │   │   └── pipedrive_tool.py
│   │   │   │   ├── plaid_tool/
│   │   │   │   │   ├── __init__.py
│   │   │   │   │   └── plaid_tool.py
│   │   │   │   ├── port_scanner/
│   │   │   │   │   ├── README.md
│   │   │   │   │   ├── __init__.py
│   │   │   │   │   └── port_scanner.py
│   │   │   │   ├── postgres_tool/
│   │   │   │   │   ├── README.md
│   │   │   │   │   ├── __init__.py
│   │   │   │   │   └── postgres_tool.py
│   │   │   │   ├── powerbi_tool/
│   │   │   │   │   ├── __init__.py
│   │   │   │   │   └── powerbi_tool.py
│   │   │   │   ├── pushover_tool/
│   │   │   │   │   ├── README.md
│   │   │   │   │   ├── __init__.py
│   │   │   │   │   ├── pushover_tool.py
│   │   │   │   │   └── tests/
│   │   │   │   │       ├── __init__.py
│   │   │   │   │       └── test_pushover_tool.py
│   │   │   │   ├── quickbooks_tool/
│   │   │   │   │   ├── __init__.py
│   │   │   │   │   └── quickbooks_tool.py
│   │   │   │   ├── razorpay_tool/
│   │   │   │   │   ├── README.md
│   │   │   │   │   ├── __init__.py
│   │   │   │   │   └── razorpay_tool.py
│   │   │   │   ├── reddit_tool/
│   │   │   │   │   ├── README.md
│   │   │   │   │   ├── __init__.py
│   │   │   │   │   └── reddit_tool.py
│   │   │   │   ├── redis_tool/
│   │   │   │   │   ├── __init__.py
│   │   │   │   │   └── redis_tool.py
│   │   │   │   ├── redshift_tool/
│   │   │   │   │   ├── README.md
│   │   │   │   │   ├── __init__.py
│   │   │   │   │   └── redshift_tool.py
│   │   │   │   ├── risk_scorer/
│   │   │   │   │   ├── README.md
│   │   │   │   │   ├── __init__.py
│   │   │   │   │   └── risk_scorer.py
│   │   │   │   ├── runtime_logs_tool/
│   │   │   │   │   ├── README.md
│   │   │   │   │   ├── __init__.py
│   │   │   │   │   └── runtime_logs_tool.py
│   │   │   │   ├── salesforce_tool/
│   │   │   │   │   ├── __init__.py
│   │   │   │   │   └── salesforce_tool.py
│   │   │   │   ├── sap_tool/
│   │   │   │   │   ├── __init__.py
│   │   │   │   │   └── sap_tool.py
│   │   │   │   ├── serpapi_tool/
│   │   │   │   │   ├── README.md
│   │   │   │   │   ├── __init__.py
│   │   │   │   │   └── serpapi_tool.py
│   │   │   │   ├── shopify_tool/
│   │   │   │   │   ├── __init__.py
│   │   │   │   │   └── shopify_tool.py
│   │   │   │   ├── slack_tool/
│   │   │   │   │   ├── README.md
│   │   │   │   │   ├── __init__.py
│   │   │   │   │   └── slack_tool.py
│   │   │   │   ├── snowflake_tool/
│   │   │   │   │   ├── __init__.py
│   │   │   │   │   └── snowflake_tool.py
│   │   │   │   ├── ssl_tls_scanner/
│   │   │   │   │   ├── README.md
│   │   │   │   │   ├── __init__.py
│   │   │   │   │   └── ssl_tls_scanner.py
│   │   │   │   ├── stripe_tool/
│   │   │   │   │   ├── README.md
│   │   │   │   │   ├── __init__.py
│   │   │   │   │   └── stripe_tool.py
│   │   │   │   ├── subdomain_enumerator/
│   │   │   │   │   ├── README.md
│   │   │   │   │   ├── __init__.py
│   │   │   │   │   └── subdomain_enumerator.py
│   │   │   │   ├── supabase_tool/
│   │   │   │   │   ├── __init__.py
│   │   │   │   │   └── supabase_tool.py
│   │   │   │   ├── tech_stack_detector/
│   │   │   │   │   ├── README.md
│   │   │   │   │   ├── __init__.py
│   │   │   │   │   └── tech_stack_detector.py
│   │   │   │   ├── telegram_tool/
│   │   │   │   │   ├── README.md
│   │   │   │   │   ├── __init__.py
│   │   │   │   │   └── telegram_tool.py
│   │   │   │   ├── terraform_tool/
│   │   │   │   │   ├── __init__.py
│   │   │   │   │   └── terraform_tool.py
│   │   │   │   ├── time_tool/
│   │   │   │   │   ├── README.md
│   │   │   │   │   ├── __init__.py
│   │   │   │   │   └── time_tool.py
│   │   │   │   ├── tines_tool/
│   │   │   │   │   ├── __init__.py
│   │   │   │   │   └── tines_tool.py
│   │   │   │   ├── trello_tool/
│   │   │   │   │   ├── README.md
│   │   │   │   │   ├── __init__.py
│   │   │   │   │   ├── trello_client.py
│   │   │   │   │   └── trello_tool.py
│   │   │   │   ├── twilio_tool/
│   │   │   │   │   ├── __init__.py
│   │   │   │   │   └── twilio_tool.py
│   │   │   │   ├── twitter_tool/
│   │   │   │   │   ├── __init__.py
│   │   │   │   │   └── twitter_tool.py
│   │   │   │   ├── vercel_tool/
│   │   │   │   │   ├── __init__.py
│   │   │   │   │   └── vercel_tool.py
│   │   │   │   ├── vision_tool/
│   │   │   │   │   ├── README.md
│   │   │   │   │   ├── __init__.py
│   │   │   │   │   └── vision_tool.py
│   │   │   │   ├── web_scrape_tool/
│   │   │   │   │   ├── README.md
│   │   │   │   │   ├── __init__.py
│   │   │   │   │   └── web_scrape_tool.py
│   │   │   │   ├── web_search_tool/
│   │   │   │   │   ├── README.md
│   │   │   │   │   ├── __init__.py
│   │   │   │   │   └── web_search_tool.py
│   │   │   │   ├── wikipedia_tool/
│   │   │   │   │   ├── README.md
│   │   │   │   │   ├── __init__.py
│   │   │   │   │   └── wikipedia_tool.py
│   │   │   │   ├── yahoo_finance_tool/
│   │   │   │   │   ├── __init__.py
│   │   │   │   │   └── yahoo_finance_tool.py
│   │   │   │   ├── youtube_tool/
│   │   │   │   │   ├── README.md
│   │   │   │   │   ├── __init__.py
│   │   │   │   │   └── youtube_tool.py
│   │   │   │   ├── youtube_transcript_tool/
│   │   │   │   │   ├── __init__.py
│   │   │   │   │   └── youtube_transcript_tool.py
│   │   │   │   ├── zendesk_tool/
│   │   │   │   │   ├── __init__.py
│   │   │   │   │   └── zendesk_tool.py
│   │   │   │   ├── zoho_crm_tool/
│   │   │   │   │   ├── README.md
│   │   │   │   │   ├── __init__.py
│   │   │   │   │   ├── tests/
│   │   │   │   │   │   ├── __init__.py
│   │   │   │   │   │   └── test_zoho_crm_tool.py
│   │   │   │   │   └── zoho_crm_tool.py
│   │   │   │   └── zoom_tool/
│   │   │   │       ├── __init__.py
│   │   │   │       └── zoom_tool.py
│   │   │   └── utils/
│   │   │       ├── __init__.py
│   │   │       └── env_helpers.py
│   │   ├── gcu/
│   │   │   ├── __init__.py
│   │   │   ├── browser/
│   │   │   │   ├── __init__.py
│   │   │   │   ├── chrome_finder.py
│   │   │   │   ├── chrome_launcher.py
│   │   │   │   ├── highlight.py
│   │   │   │   ├── port_manager.py
│   │   │   │   ├── session.py
│   │   │   │   └── tools/
│   │   │   │       ├── __init__.py
│   │   │   │       ├── advanced.py
│   │   │   │       ├── inspection.py
│   │   │   │       ├── interactions.py
│   │   │   │       ├── lifecycle.py
│   │   │   │       ├── navigation.py
│   │   │   │       └── tabs.py
│   │   │   ├── files/
│   │   │   │   ├── __init__.py
│   │   │   │   └── tools.py
│   │   │   └── server.py
│   │   └── pyproject.toml
│   ├── test_highlights.py
│   ├── test_schema_discovery.py
│   ├── tests/
│   │   ├── __init__.py
│   │   ├── conftest.py
│   │   ├── credentials/
│   │   │   ├── __init__.py
│   │   │   └── test_google_analytics_credentials.py
│   │   ├── integrations/
│   │   │   ├── __init__.py
│   │   │   ├── conftest.py
│   │   │   ├── test_input_validation.py
│   │   │   ├── test_registration.py
│   │   │   └── test_spec_conformance.py
│   │   ├── test_browser_advanced_tools.py
│   │   ├── test_coder_tools_server.py
│   │   ├── test_command_sanitizer.py
│   │   ├── test_credential_registry.py
│   │   ├── test_credentials.py
│   │   ├── test_env_helpers.py
│   │   ├── test_health_checks.py
│   │   ├── test_live_health_checks.py
│   │   ├── test_x_page_load_repro.py
│   │   └── tools/
│   │       ├── __init__.py
│   │       ├── test_airtable_tool.py
│   │       ├── test_apify_tool.py
│   │       ├── test_apollo_tool.py
│   │       ├── test_arxiv_tool.py
│   │       ├── test_asana_tool.py
│   │       ├── test_attio_tool.py
│   │       ├── test_aws_s3_tool.py
│   │       ├── test_azure_sql_tool.py
│   │       ├── test_bigquery_tool.py
│   │       ├── test_brevo_tool.py
│   │       ├── test_calcom_tool.py
│   │       ├── test_calendar_tool.py
│   │       ├── test_calendly_tool.py
│   │       ├── test_cloudinary_tool.py
│   │       ├── test_confluence_tool.py
│   │       ├── test_csv_tool.py
│   │       ├── test_databricks_tool.py
│   │       ├── test_discord_tool.py
│   │       ├── test_dns_security_scanner.py
│   │       ├── test_docker_hub_tool.py
│   │       ├── test_duckduckgo_tool.py
│   │       ├── test_email_tool.py
│   │       ├── test_exa_search_tool.py
│   │       ├── test_example_tool.py
│   │       ├── test_excel_tool.py
│   │       ├── test_file_ops.py
│   │       ├── test_file_ops_hashline.py
│   │       ├── test_file_system_toolkits.py
│   │       ├── test_github_tool.py
│   │       ├── test_gitlab_tool.py
│   │       ├── test_gmail_tool.py
│   │       ├── test_google_analytics_tool.py
│   │       ├── test_google_docs_tool.py
│   │       ├── test_google_maps_tool.py
│   │       ├── test_google_search_console_tool.py
│   │       ├── test_google_sheets_tool.py
│   │       ├── test_greenhouse_tool.py
│   │       ├── test_hashline.py
│   │       ├── test_hashline_edit.py
│   │       ├── test_http_headers_scanner.py
│   │       ├── test_hubspot_tool.py
│   │       ├── test_huggingface_tool.py
│   │       ├── test_intercom_tool.py
│   │       ├── test_jira_tool.py
│   │       ├── test_kafka_tool.py
│   │       ├── test_langfuse_tool.py
│   │       ├── test_linear_tool.py
│   │       ├── test_lusha_tool.py
│   │       ├── test_microsoft_graph_tool.py
│   │       ├── test_mongodb_tool.py
│   │       ├── test_n8n_tool.py
│   │       ├── test_news_tool.py
│   │       ├── test_notion_tool.py
│   │       ├── test_obsidian_tool.py
│   │       ├── test_pagerduty_tool.py
│   │       ├── test_pdf_read_tool.py
│   │       ├── test_pinecone_tool.py
│   │       ├── test_pipedrive_tool.py
│   │       ├── test_plaid_tool.py
│   │       ├── test_port_scanner.py
│   │       ├── test_postgres_tool.py
│   │       ├── test_powerbi_tool.py
│   │       ├── test_pushover_tool.py
│   │       ├── test_quickbooks_tool.py
│   │       ├── test_razorpay_tool.py
│   │       ├── test_reddit_tool.py
│   │       ├── test_redis_tool.py
│   │       ├── test_redshift_tool.py
│   │       ├── test_risk_scorer.py
│   │       ├── test_run_command_pythonpath.py
│   │       ├── test_runtime_logs_tool.py
│   │       ├── test_salesforce_tool.py
│   │       ├── test_sap_tool.py
│   │       ├── test_security.py
│   │       ├── test_security_tools.py
│   │       ├── test_serpapi_tool.py
│   │       ├── test_shopify_tool.py
│   │       ├── test_slack_tool.py
│   │       ├── test_snowflake_tool.py
│   │       ├── test_ssl_tls_scanner.py
│   │       ├── test_stripe_tool.py
│   │       ├── test_subdomain_enumerator.py
│   │       ├── test_supabase_tool.py
│   │       ├── test_tech_stack_detector.py
│   │       ├── test_telegram_tool.py
│   │       ├── test_terraform_tool.py
│   │       ├── test_time_tool.py
│   │       ├── test_tines_tool.py
│   │       ├── test_trello_tool.py
│   │       ├── test_trello_tool_integration.py
│   │       ├── test_twilio_tool.py
│   │       ├── test_twitter_tool.py
│   │       ├── test_vercel_tool.py
│   │       ├── test_vision_tool.py
│   │       ├── test_web_scrape_tool.py
│   │       ├── test_web_search_tool.py
│   │       ├── test_wikipedia_tool.py
│   │       ├── test_yahoo_finance_tool.py
│   │       ├── test_youtube_tool.py
│   │       ├── test_youtube_transcript_tool.py
│   │       ├── test_zendesk_tool.py
│   │       ├── test_zoho_crm_tool.py
│   │       └── test_zoom_tool.py
│   └── top_salaries.py
└── tsconfig.base.json
Download .txt
Showing preview only (842K chars total). Download the full file or copy to clipboard to get everything.
SYMBOL INDEX (9257 symbols across 550 files)

FILE: core/antigravity_auth.py
  function _fetch_credentials_from_public_source (line 64) | def _fetch_credentials_from_public_source() -> tuple[str | None, str | N...
  function get_client_id (line 90) | def get_client_id() -> str:
  function get_client_secret (line 116) | def get_client_secret() -> str | None:
  function find_free_port (line 139) | def find_free_port() -> int:
  class OAuthCallbackHandler (line 147) | class OAuthCallbackHandler(BaseHTTPRequestHandler):
    method log_message (line 154) | def log_message(self, format: str, *args: Any) -> None:
    method do_GET (line 157) | def do_GET(self) -> None:
    method _send_response (line 179) | def _send_response(self, message: str) -> None:
  function wait_for_callback (line 197) | def wait_for_callback(port: int, timeout: int = 300) -> tuple[str | None...
  function exchange_code_for_tokens (line 215) | def exchange_code_for_tokens(
  function get_user_email (line 245) | def get_user_email(access_token: str) -> str | None:
  function load_accounts (line 259) | def load_accounts() -> dict[str, Any]:
  function save_accounts (line 270) | def save_accounts(data: dict[str, Any]) -> None:
  function validate_credentials (line 278) | def validate_credentials(access_token: str, project_id: str = _DEFAULT_P...
  function refresh_access_token (line 319) | def refresh_access_token(
  function cmd_account_add (line 346) | def cmd_account_add(args: argparse.Namespace) -> int:
  function cmd_account_list (line 511) | def cmd_account_list(args: argparse.Namespace) -> int:
  function cmd_account_remove (line 530) | def cmd_account_remove(args: argparse.Namespace) -> int:
  function main (line 549) | def main() -> int:

FILE: core/codex_oauth.py
  function _base64url (line 46) | def _base64url(data: bytes) -> str:
  function generate_pkce (line 50) | def generate_pkce() -> tuple[str, str]:
  function build_authorize_url (line 58) | def build_authorize_url(state: str, challenge: str) -> str:
  function exchange_code_for_tokens (line 77) | def exchange_code_for_tokens(code: str, verifier: str) -> dict | None:
  function decode_jwt_payload (line 110) | def decode_jwt_payload(token: str) -> dict | None:
  function get_account_id (line 127) | def get_account_id(access_token: str) -> str | None:
  function save_credentials (line 140) | def save_credentials(token_data: dict, account_id: str) -> None:
  function open_browser (line 160) | def open_browser(url: str) -> bool:
  class OAuthCallbackHandler (line 176) | class OAuthCallbackHandler(http.server.BaseHTTPRequestHandler):
    method do_GET (line 182) | def do_GET(self) -> None:
    method log_message (line 212) | def log_message(self, format: str, *args: object) -> None:
  function wait_for_callback (line 217) | def wait_for_callback(state: str, timeout_secs: int = 120) -> str | None:
  function _serve_until_done (line 241) | def _serve_until_done(server: http.server.HTTPServer, deadline: float, s...
  function parse_manual_input (line 248) | def parse_manual_input(value: str, expected_state: str) -> str | None:
  function main (line 269) | def main() -> int:

FILE: core/examples/manual_agent.py
  class GreeterNode (line 24) | class GreeterNode(NodeProtocol):
    method execute (line 27) | async def execute(self, ctx: NodeContext) -> NodeResult:
  class UppercaserNode (line 34) | class UppercaserNode(NodeProtocol):
    method execute (line 37) | async def execute(self, ctx: NodeContext) -> NodeResult:
  function main (line 44) | async def main():

FILE: core/examples/mcp_integration_example.py
  function example_1_programmatic_registration (line 17) | async def example_1_programmatic_registration():
  function example_2_http_transport (line 50) | async def example_2_http_transport():
  function example_3_config_file (line 72) | async def example_3_config_file():
  function main (line 98) | async def main():

FILE: core/framework/agents/__init__.py
  function list_framework_agents (line 8) | def list_framework_agents() -> list[Path]:

FILE: core/framework/agents/credential_tester/__main__.py
  function setup_logging (line 10) | def setup_logging(verbose=False, debug=False):
  function pick_account (line 21) | def pick_account(agent: CredentialTesterAgent) -> dict | None:
  function cli (line 48) | def cli():
  function shell (line 56) | def shell(verbose, debug):
  function _interactive_shell (line 62) | async def _interactive_shell(verbose=False):
  function list_accounts (line 91) | def list_accounts():

FILE: core/framework/agents/credential_tester/agent.py
  function get_tools_for_provider (line 63) | def get_tools_for_provider(provider_name: str) -> list[str]:
  function _list_aden_accounts (line 78) | def _list_aden_accounts() -> list[dict]:
  function _list_local_accounts (line 114) | def _list_local_accounts() -> list[dict]:
  function _list_env_fallback_accounts (line 126) | def _list_env_fallback_accounts() -> list[dict]:
  function list_connected_accounts (line 193) | def list_connected_accounts() -> list[dict]:
  function configure_for_account (line 218) | def configure_for_account(runner: AgentRunner, account: dict) -> None:
  function _activate_local_account (line 241) | def _activate_local_account(credential_id: str, alias: str) -> None:
  function _configure_aden_node (line 307) | def _configure_aden_node(
  function _configure_local_node (line 350) | def _configure_local_node(
  class CredentialTesterAgent (line 466) | class CredentialTesterAgent:
    method __init__ (line 477) | def __init__(self, config=None):
    method list_accounts (line 484) | def list_accounts(self) -> list[dict]:
    method select_account (line 488) | def select_account(self, account: dict) -> None:
    method selected_provider (line 498) | def selected_provider(self) -> str:
    method selected_alias (line 504) | def selected_alias(self) -> str:
    method _build_graph (line 509) | def _build_graph(self) -> GraphSpec:
    method _setup (line 553) | def _setup(self) -> None:
    method start (line 599) | async def start(self) -> None:
    method stop (line 606) | async def stop(self) -> None:
    method run (line 612) | async def run(self) -> ExecutionResult:

FILE: core/framework/agents/credential_tester/config.py
  class AgentMetadata (line 9) | class AgentMetadata:

FILE: core/framework/agents/credential_tester/nodes/__init__.py
  function build_tester_node (line 6) | def build_tester_node(

FILE: core/framework/agents/discovery.py
  class AgentEntry (line 11) | class AgentEntry:
  function _get_last_active (line 26) | def _get_last_active(agent_path: Path) -> str | None:
  function _count_sessions (line 79) | def _count_sessions(agent_name: str) -> int:
  function _count_runs (line 87) | def _count_runs(agent_name: str) -> int:
  function _extract_agent_stats (line 112) | def _extract_agent_stats(agent_path: Path) -> tuple[int, int, list[str]]:
  function discover_agents (line 153) | def discover_agents() -> dict[str, list[AgentEntry]]:

FILE: core/framework/agents/queen/config.py
  function _load_preferred_model (line 8) | def _load_preferred_model() -> str:
  class RuntimeConfig (line 24) | class RuntimeConfig:
  class AgentMetadata (line 36) | class AgentMetadata:

FILE: core/framework/agents/queen/nodes/__init__.py
  function _is_gcu_enabled (line 16) | def _is_gcu_enabled() -> bool:
  function _build_appendices (line 25) | def _build_appendices() -> str:

FILE: core/framework/agents/queen/nodes/thinking_hook.py
  function select_expert_persona (line 43) | async def select_expert_persona(user_message: str, llm: LLMProvider) -> ...

FILE: core/framework/agents/queen/queen_memory.py
  function _queen_dir (line 30) | def _queen_dir() -> Path:
  function semantic_memory_path (line 34) | def semantic_memory_path() -> Path:
  function episodic_memory_path (line 38) | def episodic_memory_path(d: date | None = None) -> Path:
  function read_semantic_memory (line 43) | def read_semantic_memory() -> str:
  function read_episodic_memory (line 48) | def read_episodic_memory(d: date | None = None) -> str:
  function _find_recent_episodic (line 53) | def _find_recent_episodic(lookback: int = 7) -> tuple[date, str] | None:
  function format_for_injection (line 70) | def format_for_injection() -> str:
  function append_episodic_entry (line 121) | def append_episodic_entry(content: str) -> None:
  function seed_if_missing (line 141) | def seed_if_missing() -> None:
  function read_session_context (line 194) | def read_session_context(session_dir: Path, max_messages: int = 80) -> str:
  function _compact_context (line 254) | async def _compact_context(text: str, llm: object, *, _depth: int = 0) -...
  function consolidate_queen_memory (line 293) | async def consolidate_queen_memory(

FILE: core/framework/agents/queen/tests/conftest.py
  function mock_mode (line 19) | def mock_mode():
  function runner (line 24) | async def runner(tmp_path_factory, mock_mode):

FILE: core/framework/agents/worker_memory.py
  function _worker_runs_dir (line 42) | def _worker_runs_dir(agent_name: str) -> Path:
  function digest_path (line 46) | def digest_path(agent_name: str, run_id: str) -> Path:
  function _collect_run_events (line 50) | def _collect_run_events(bus: EventBus, run_id: str, limit: int = 2000) -...
  function _build_run_context (line 78) | def _build_run_context(
  function consolidate_worker_run (line 167) | async def consolidate_worker_run(
  function read_recent_digests (line 258) | def read_recent_digests(agent_name: str, max_runs: int = 5) -> list[tupl...

FILE: core/framework/cli.py
  function _configure_paths (line 24) | def _configure_paths():
  function main (line 67) | def main():

FILE: core/framework/config.py
  function get_hive_config (line 29) | def get_hive_config() -> dict[str, Any]:
  function get_preferred_model (line 50) | def get_preferred_model() -> str:
  function get_preferred_worker_model (line 64) | def get_preferred_worker_model() -> str | None:
  function get_worker_api_key (line 82) | def get_worker_api_key() -> str | None:
  function get_worker_api_base (line 137) | def get_worker_api_base() -> str | None:
  function get_worker_llm_extra_kwargs (line 157) | def get_worker_llm_extra_kwargs() -> dict[str, Any]:
  function get_worker_max_tokens (line 192) | def get_worker_max_tokens() -> int:
  function get_worker_max_context_tokens (line 200) | def get_worker_max_context_tokens() -> int:
  function get_max_tokens (line 208) | def get_max_tokens() -> int:
  function get_max_context_tokens (line 217) | def get_max_context_tokens() -> int:
  function get_api_key (line 222) | def get_api_key() -> str | None:
  function _fetch_antigravity_credentials (line 295) | def _fetch_antigravity_credentials() -> tuple[str | None, str | None]:
  function get_antigravity_client_id (line 322) | def get_antigravity_client_id() -> str:
  function get_antigravity_client_secret (line 343) | def get_antigravity_client_secret() -> str | None:
  function get_gcu_enabled (line 365) | def get_gcu_enabled() -> bool:
  function get_gcu_viewport_scale (line 370) | def get_gcu_viewport_scale() -> float:
  function get_api_base (line 378) | def get_api_base() -> str | None:
  function get_llm_extra_kwargs (line 397) | def get_llm_extra_kwargs() -> dict[str, Any]:
  class RuntimeConfig (line 444) | class RuntimeConfig:

FILE: core/framework/credentials/aden/client.py
  class AdenClientError (line 46) | class AdenClientError(Exception):
  class AdenAuthenticationError (line 52) | class AdenAuthenticationError(AdenClientError):
  class AdenNotFoundError (line 58) | class AdenNotFoundError(AdenClientError):
  class AdenRefreshError (line 64) | class AdenRefreshError(AdenClientError):
    method __init__ (line 67) | def __init__(
  class AdenRateLimitError (line 78) | class AdenRateLimitError(AdenClientError):
    method __init__ (line 81) | def __init__(self, message: str, retry_after: int = 60):
  class AdenClientConfig (line 87) | class AdenClientConfig:
    method __post_init__ (line 108) | def __post_init__(self) -> None:
  class AdenIntegrationInfo (line 119) | class AdenIntegrationInfo:
    method integration_type (line 154) | def integration_type(self) -> str:
    method from_dict (line 158) | def from_dict(cls, data: dict[str, Any]) -> AdenIntegrationInfo:
  class AdenCredentialResponse (line 174) | class AdenCredentialResponse:
    method integration_type (line 213) | def integration_type(self) -> str:
    method from_dict (line 217) | def from_dict(cls, data: dict[str, Any], integration_id: str = "") -> ...
  class AdenCredentialClient (line 240) | class AdenCredentialClient:
    method __init__ (line 260) | def __init__(self, config: AdenClientConfig):
    method _parse_json (line 265) | def _parse_json(response: httpx.Response) -> Any:
    method _get_client (line 269) | def _get_client(self) -> httpx.Client:
    method _request_with_retry (line 286) | def _request_with_retry(
    method list_integrations (line 354) | def list_integrations(self) -> list[AdenIntegrationInfo]:
    method get_credential (line 371) | def get_credential(self, integration_id: str) -> AdenCredentialRespons...
    method request_refresh (line 390) | def request_refresh(self, integration_id: str) -> AdenCredentialResponse:
    method validate_token (line 406) | def validate_token(self, integration_id: str) -> dict[str, Any]:
    method health_check (line 418) | def health_check(self) -> dict[str, Any]:
    method close (line 431) | def close(self) -> None:
    method __enter__ (line 436) | def __enter__(self) -> AdenCredentialClient:
    method __exit__ (line 439) | def __exit__(self, *args: Any) -> None:

FILE: core/framework/credentials/aden/provider.py
  class AdenSyncProvider (line 62) | class AdenSyncProvider(CredentialProvider):
    method __init__ (line 95) | def __init__(
    method provider_id (line 119) | def provider_id(self) -> str:
    method supported_types (line 124) | def supported_types(self) -> list[CredentialType]:
    method can_handle (line 128) | def can_handle(self, credential: CredentialObject) -> bool:
    method refresh (line 151) | def refresh(self, credential: CredentialObject) -> CredentialObject:
    method validate (line 213) | def validate(self, credential: CredentialObject) -> bool:
    method should_refresh (line 238) | def should_refresh(self, credential: CredentialObject) -> bool:
    method fetch_from_aden (line 260) | def fetch_from_aden(self, integration_id: str) -> CredentialObject | N...
    method sync_all (line 281) | def sync_all(self, store: CredentialStore) -> int:
    method report_credential_usage (line 318) | def report_credential_usage(
    method _update_credential_from_aden (line 342) | def _update_credential_from_aden(
    method _aden_response_to_credential (line 395) | def _aden_response_to_credential(

FILE: core/framework/credentials/aden/storage.py
  class AdenCachedStorage (line 59) | class AdenCachedStorage(CredentialStorage):
    method __init__ (line 94) | def __init__(
    method save (line 122) | def save(self, credential: CredentialObject) -> None:
    method load (line 134) | def load(self, credential_id: str) -> CredentialObject | None:
    method _load_by_id (line 179) | def _load_by_id(self, credential_id: str) -> CredentialObject | None:
    method load_all_for_provider (line 216) | def load_all_for_provider(self, provider_name: str) -> list[Credential...
    method delete (line 232) | def delete(self, credential_id: str) -> bool:
    method list_all (line 248) | def list_all(self) -> list[str]:
    method exists (line 257) | def exists(self, credential_id: str) -> bool:
    method _is_cache_fresh (line 277) | def _is_cache_fresh(self, credential_id: str) -> bool:
    method invalidate_cache (line 292) | def invalidate_cache(self, credential_id: str) -> None:
    method invalidate_all (line 304) | def invalidate_all(self) -> None:
    method _index_provider (line 309) | def _index_provider(self, credential: CredentialObject) -> None:
    method load_by_alias (line 341) | def load_by_alias(self, provider_name: str, alias: str) -> CredentialO...
    method rebuild_provider_index (line 356) | def rebuild_provider_index(self) -> int:
    method sync_all_from_aden (line 378) | def sync_all_from_aden(self) -> int:
    method get_cache_info (line 412) | def get_cache_info(self) -> dict[str, dict]:

FILE: core/framework/credentials/aden/tests/test_aden_sync.py
  function aden_config (line 40) | def aden_config():
  function mock_client (line 53) | def mock_client(aden_config):
  function aden_response (line 61) | def aden_response():
  function provider (line 77) | def provider(mock_client):
  function local_storage (line 88) | def local_storage():
  function cached_storage (line 94) | def cached_storage(local_storage, provider):
  class TestAdenCredentialResponse (line 109) | class TestAdenCredentialResponse:
    method test_from_dict_basic (line 112) | def test_from_dict_basic(self):
    method test_from_dict_full (line 131) | def test_from_dict_full(self):
  class TestAdenIntegrationInfo (line 156) | class TestAdenIntegrationInfo:
    method test_from_dict (line 159) | def test_from_dict(self):
    method test_from_dict_minimal (line 180) | def test_from_dict_minimal(self):
  class TestAdenSyncProvider (line 204) | class TestAdenSyncProvider:
    method test_provider_id (line 207) | def test_provider_id(self, provider):
    method test_supported_types (line 211) | def test_supported_types(self, provider):
    method test_can_handle_oauth2 (line 216) | def test_can_handle_oauth2(self, provider):
    method test_can_handle_aden_managed (line 227) | def test_can_handle_aden_managed(self, provider):
    method test_can_handle_wrong_type (line 242) | def test_can_handle_wrong_type(self, provider):
    method test_refresh_success (line 252) | def test_refresh_success(self, provider, mock_client, aden_response):
    method test_refresh_requires_reauth (line 276) | def test_refresh_requires_reauth(self, provider, mock_client):
    method test_refresh_aden_unavailable_cached_valid (line 297) | def test_refresh_aden_unavailable_cached_valid(self, provider, mock_cl...
    method test_should_refresh_expired (line 320) | def test_should_refresh_expired(self, provider):
    method test_should_refresh_within_buffer (line 337) | def test_should_refresh_within_buffer(self, provider):
    method test_should_refresh_still_valid (line 355) | def test_should_refresh_still_valid(self, provider):
    method test_fetch_from_aden (line 372) | def test_fetch_from_aden(self, provider, mock_client, aden_response):
    method test_fetch_from_aden_not_found (line 384) | def test_fetch_from_aden_not_found(self, provider, mock_client):
    method test_sync_all (line 392) | def test_sync_all(self, provider, mock_client, aden_response):
    method test_validate_via_aden (line 416) | def test_validate_via_aden(self, provider, mock_client):
    method test_validate_fallback_to_local (line 428) | def test_validate_fallback_to_local(self, provider, mock_client):
  class TestAdenCachedStorage (line 453) | class TestAdenCachedStorage:
    method test_save_updates_cache_timestamp (line 456) | def test_save_updates_cache_timestamp(self, cached_storage):
    method test_load_from_fresh_cache (line 474) | def test_load_from_fresh_cache(self, cached_storage, local_storage):
    method test_load_from_aden_when_stale (line 496) | def test_load_from_aden_when_stale(
    method test_load_falls_back_to_stale_when_aden_fails (line 524) | def test_load_falls_back_to_stale_when_aden_fails(
    method test_delete_removes_cache_timestamp (line 550) | def test_delete_removes_cache_timestamp(self, cached_storage, local_st...
    method test_invalidate_cache (line 566) | def test_invalidate_cache(self, cached_storage, local_storage):
    method test_invalidate_all (line 581) | def test_invalidate_all(self, cached_storage):
    method test_is_cache_fresh (line 590) | def test_is_cache_fresh(self, cached_storage):
    method test_get_cache_info (line 603) | def test_get_cache_info(self, cached_storage, local_storage):
    method test_save_indexes_provider (line 627) | def test_save_indexes_provider(self, cached_storage):
    method test_load_by_provider_name (line 648) | def test_load_by_provider_name(self, cached_storage):
    method test_load_by_direct_id_still_works (line 676) | def test_load_by_direct_id_still_works(self, cached_storage):
    method test_exists_by_provider_name (line 702) | def test_exists_by_provider_name(self, cached_storage):
    method test_rebuild_provider_index (line 726) | def test_rebuild_provider_index(self, cached_storage, local_storage):
    method test_save_without_integration_type_no_index (line 752) | def test_save_without_integration_type_no_index(self, cached_storage):
  class TestAdenIntegration (line 776) | class TestAdenIntegration:
    method test_full_workflow (line 779) | def test_full_workflow(self, mock_client, aden_response):
    method test_cached_storage_with_store (line 831) | def test_cached_storage_with_store(self, mock_client, aden_response):

FILE: core/framework/credentials/key_storage.py
  function load_credential_key (line 32) | def load_credential_key() -> str | None:
  function save_credential_key (line 58) | def save_credential_key(key: str) -> Path:
  function generate_and_save_credential_key (line 79) | def generate_and_save_credential_key() -> str:
  function load_aden_api_key (line 97) | def load_aden_api_key() -> str | None:
  function save_aden_api_key (line 126) | def save_aden_api_key(key: str) -> None:
  function delete_aden_api_key (line 145) | def delete_aden_api_key() -> bool:
  function _read_credential_key_file (line 173) | def _read_credential_key_file() -> str | None:
  function _read_from_shell_config (line 187) | def _read_from_shell_config(env_var: str) -> str | None:
  function _read_aden_from_encrypted_store (line 200) | def _read_aden_from_encrypted_store() -> str | None:

FILE: core/framework/credentials/local/models.py
  class LocalAccountInfo (line 17) | class LocalAccountInfo:
    method storage_id (line 41) | def storage_id(self) -> str:
    method to_account_dict (line 45) | def to_account_dict(self) -> dict:

FILE: core/framework/credentials/local/registry.py
  class LocalCredentialRegistry (line 53) | class LocalCredentialRegistry:
    method __init__ (line 61) | def __init__(self, storage: EncryptedFileStorage) -> None:
    method list_accounts (line 68) | def list_accounts(self, credential_id: str | None = None) -> list[Loca...
    method save_account (line 109) | def save_account(
    method get_account (line 189) | def get_account(self, credential_id: str, alias: str) -> CredentialObj...
    method get_key (line 193) | def get_key(self, credential_id: str, alias: str, key_name: str = "api...
    method get_account_info (line 210) | def get_account_info(self, credential_id: str, alias: str) -> LocalAcc...
    method delete_account (line 221) | def delete_account(self, credential_id: str, alias: str) -> bool:
    method validate_account (line 234) | def validate_account(self, credential_id: str, alias: str) -> HealthCh...
    method default (line 293) | def default(cls) -> LocalCredentialRegistry:
    method at_path (line 298) | def at_path(cls, path: str | Path) -> LocalCredentialRegistry:
    method _to_account_info (line 306) | def _to_account_info(self, cred_obj: CredentialObject) -> LocalAccount...

FILE: core/framework/credentials/models.py
  function _utc_now (line 17) | def _utc_now() -> datetime:
  class CredentialType (line 22) | class CredentialType(StrEnum):
  class CredentialKey (line 41) | class CredentialKey(BaseModel):
    method is_expired (line 62) | def is_expired(self) -> bool:
    method get_secret_value (line 68) | def get_secret_value(self) -> str:
  class CredentialIdentity (line 73) | class CredentialIdentity(BaseModel):
    method label (line 82) | def label(self) -> str:
    method is_known (line 87) | def is_known(self) -> bool:
    method to_dict (line 91) | def to_dict(self) -> dict[str, str]:
  class CredentialObject (line 96) | class CredentialObject(BaseModel):
    method get_key (line 146) | def get_key(self, key_name: str) -> str | None:
    method set_key (line 161) | def set_key(
    method has_key (line 185) | def has_key(self, key_name: str) -> bool:
    method needs_refresh (line 190) | def needs_refresh(self) -> bool:
    method is_valid (line 198) | def is_valid(self) -> bool:
    method record_usage (line 204) | def record_usage(self) -> None:
    method get_default_key (line 209) | def get_default_key(self) -> str | None:
    method identity (line 229) | def identity(self) -> CredentialIdentity:
    method provider_type (line 240) | def provider_type(self) -> str | None:
    method alias (line 246) | def alias(self) -> str | None:
    method set_identity (line 251) | def set_identity(self, **fields: str) -> None:
  class CredentialUsageSpec (line 258) | class CredentialUsageSpec(BaseModel):
  class CredentialError (line 312) | class CredentialError(Exception):
  class CredentialNotFoundError (line 318) | class CredentialNotFoundError(CredentialError):
  class CredentialKeyNotFoundError (line 324) | class CredentialKeyNotFoundError(CredentialError):
  class CredentialRefreshError (line 330) | class CredentialRefreshError(CredentialError):
  class CredentialValidationError (line 336) | class CredentialValidationError(CredentialError):
  class CredentialDecryptionError (line 342) | class CredentialDecryptionError(CredentialError):

FILE: core/framework/credentials/oauth2/base_provider.py
  class BaseOAuth2Provider (line 27) | class BaseOAuth2Provider(CredentialProvider):
    method __init__ (line 70) | def __init__(self, config: OAuth2Config, provider_id: str = "oauth2"):
    method provider_id (line 83) | def provider_id(self) -> str:
    method supported_types (line 87) | def supported_types(self) -> list[CredentialType]:
    method _get_client (line 90) | def _get_client(self) -> Any:
    method _close_client (line 103) | def _close_client(self) -> None:
    method __del__ (line 109) | def __del__(self) -> None:
    method get_authorization_url (line 115) | def get_authorization_url(
    method exchange_code (line 151) | def exchange_code(
    method client_credentials_grant (line 183) | def client_credentials_grant(
    method refresh_access_token (line 216) | def refresh_access_token(
    method revoke_token (line 251) | def revoke_token(
    method refresh (line 290) | def refresh(self, credential: CredentialObject) -> CredentialObject:
    method validate (line 331) | def validate(self, credential: CredentialObject) -> bool:
    method should_refresh (line 346) | def should_refresh(self, credential: CredentialObject) -> bool:
    method revoke (line 362) | def revoke(self, credential: CredentialObject) -> bool:
    method _token_request (line 390) | def _token_request(self, data: dict[str, Any]) -> OAuth2Token:
    method _parse_form_response (line 431) | def _parse_form_response(self, text: str) -> dict[str, str]:
    method format_for_request (line 440) | def format_for_request(self, token: OAuth2Token) -> dict[str, Any]:
    method format_credential_for_request (line 467) | def format_credential_for_request(self, credential: CredentialObject) ...

FILE: core/framework/credentials/oauth2/hubspot_provider.py
  class HubSpotOAuth2Provider (line 48) | class HubSpotOAuth2Provider(BaseOAuth2Provider):
    method __init__ (line 65) | def __init__(
    method supported_types (line 81) | def supported_types(self) -> list[CredentialType]:
    method validate (line 84) | def validate(self, credential: CredentialObject) -> bool:
    method _parse_token_response (line 108) | def _parse_token_response(self, response_data: dict[str, Any]) -> Any:

FILE: core/framework/credentials/oauth2/lifecycle.py
  class TokenRefreshResult (line 30) | class TokenRefreshResult:
  class TokenLifecycleManager (line 39) | class TokenLifecycleManager:
    method __init__ (line 70) | def __init__(
    method get_valid_token (line 103) | async def get_valid_token(self) -> OAuth2Token | None:
    method acquire_token_client_credentials (line 144) | async def acquire_token_client_credentials(
    method revoke (line 169) | async def revoke(self) -> bool:
    method sync_get_valid_token (line 186) | def sync_get_valid_token(self) -> OAuth2Token | None:
    method sync_acquire_token_client_credentials (line 221) | def sync_acquire_token_client_credentials(
    method _needs_refresh (line 233) | def _needs_refresh(self, token: OAuth2Token) -> bool:
    method _credential_to_token (line 239) | def _credential_to_token(self, credential: CredentialObject) -> OAuth2...
    method _save_token_to_store (line 258) | def _save_token_to_store(self, token: OAuth2Token) -> None:
    method _async_refresh_token (line 288) | async def _async_refresh_token(self, credential: CredentialObject) -> ...
    method _sync_refresh_token (line 293) | def _sync_refresh_token(self, credential: CredentialObject) -> TokenRe...
    method invalidate_cache (line 333) | def invalidate_cache(self) -> None:
    method get_request_headers (line 340) | def get_request_headers(self) -> dict[str, str]:
    method get_request_kwargs (line 353) | def get_request_kwargs(self) -> dict:

FILE: core/framework/credentials/oauth2/provider.py
  class TokenPlacement (line 18) | class TokenPlacement(StrEnum):
  class OAuth2Token (line 35) | class OAuth2Token:
    method is_expired (line 56) | def is_expired(self) -> bool:
    method can_refresh (line 69) | def can_refresh(self) -> bool:
    method expires_in_seconds (line 74) | def expires_in_seconds(self) -> int | None:
    method from_token_response (line 82) | def from_token_response(cls, data: dict[str, Any]) -> OAuth2Token:
  class OAuth2Config (line 107) | class OAuth2Config:
    method __post_init__ (line 163) | def __post_init__(self) -> None:
  class OAuth2Error (line 172) | class OAuth2Error(Exception):
    method __init__ (line 182) | def __init__(
  class TokenExpiredError (line 194) | class TokenExpiredError(OAuth2Error):
    method __init__ (line 197) | def __init__(self, credential_id: str):
  class RefreshTokenInvalidError (line 205) | class RefreshTokenInvalidError(OAuth2Error):
    method __init__ (line 208) | def __init__(self, credential_id: str, reason: str = ""):

FILE: core/framework/credentials/oauth2/zoho_provider.py
  class ZohoOAuth2Provider (line 45) | class ZohoOAuth2Provider(BaseOAuth2Provider):
    method __init__ (line 65) | def __init__(
    method supported_types (line 108) | def supported_types(self) -> list[CredentialType]:
    method format_for_request (line 111) | def format_for_request(self, token: OAuth2Token) -> dict[str, Any]:
    method validate (line 126) | def validate(self, credential: CredentialObject) -> bool:
    method _parse_token_response (line 152) | def _parse_token_response(self, response_data: dict[str, Any]) -> OAut...
    method refresh (line 170) | def refresh(self, credential: CredentialObject) -> CredentialObject:

FILE: core/framework/credentials/provider.py
  class CredentialProvider (line 23) | class CredentialProvider(ABC):
    method provider_id (line 56) | def provider_id(self) -> str:
    method supported_types (line 66) | def supported_types(self) -> list[CredentialType]:
    method refresh (line 76) | def refresh(self, credential: CredentialObject) -> CredentialObject:
    method validate (line 98) | def validate(self, credential: CredentialObject) -> bool:
    method should_refresh (line 115) | def should_refresh(self, credential: CredentialObject) -> bool:
    method revoke (line 137) | def revoke(self, credential: CredentialObject) -> bool:
    method can_handle (line 153) | def can_handle(self, credential: CredentialObject) -> bool:
  class StaticProvider (line 166) | class StaticProvider(CredentialProvider):
    method provider_id (line 179) | def provider_id(self) -> str:
    method supported_types (line 183) | def supported_types(self) -> list[CredentialType]:
    method refresh (line 186) | def refresh(self, credential: CredentialObject) -> CredentialObject:
    method validate (line 195) | def validate(self, credential: CredentialObject) -> bool:
    method should_refresh (line 216) | def should_refresh(self, credential: CredentialObject) -> bool:
  class BearerTokenProvider (line 221) | class BearerTokenProvider(CredentialProvider):
    method provider_id (line 234) | def provider_id(self) -> str:
    method supported_types (line 238) | def supported_types(self) -> list[CredentialType]:
    method refresh (line 241) | def refresh(self, credential: CredentialObject) -> CredentialObject:
    method validate (line 253) | def validate(self, credential: CredentialObject) -> bool:
    method should_refresh (line 266) | def should_refresh(self, credential: CredentialObject) -> bool:

FILE: core/framework/credentials/setup.py
  class Colors (line 42) | class Colors:
    method disable (line 53) | def disable(cls):
  class MissingCredential (line 60) | class MissingCredential:
  class SetupResult (line 98) | class SetupResult:
  class CredentialSetupSession (line 114) | class CredentialSetupSession:
    method __init__ (line 135) | def __init__(
    method from_nodes (line 161) | def from_nodes(cls, nodes: list[NodeSpec]) -> CredentialSetupSession:
    method from_agent_path (line 170) | def from_agent_path(
    method run_interactive (line 194) | def run_interactive(self) -> SetupResult:
    method _print (line 236) | def _print(self, msg: str) -> None:
    method _input (line 240) | def _input(self, prompt: str) -> str:
    method _print_header (line 244) | def _print_header(self) -> None:
    method _ensure_credential_key (line 257) | def _ensure_credential_key(self) -> bool:
    method _setup_single_credential (line 276) | def _setup_single_credential(self, cred: MissingCredential) -> bool:
    method _get_auth_options (line 299) | def _get_auth_options(self, cred: MissingCredential) -> list[tuple[str...
    method _prompt_choice (line 331) | def _prompt_choice(self, options: list[tuple[str, str, str]]) -> str:
    method _setup_direct_api_key (line 354) | def _setup_direct_api_key(self, cred: MissingCredential) -> bool:
    method _setup_via_aden (line 391) | def _setup_via_aden(self, cred: MissingCredential) -> bool:
    method _run_health_check (line 449) | def _run_health_check(self, cred: MissingCredential, value: str) -> di...
    method _store_credential (line 464) | def _store_credential(self, cred: MissingCredential, value: str) -> None:
    method _print_summary (line 489) | def _print_summary(self, configured: list[str], skipped: list[str], er...
  function load_agent_nodes (line 520) | def load_agent_nodes(agent_path: str | Path) -> list:
  function _load_nodes_from_python_agent (line 540) | def _load_nodes_from_python_agent(agent_path: Path) -> list:
  function _load_nodes_from_json_agent (line 568) | def _load_nodes_from_json_agent(agent_json: Path) -> list:
  function run_credential_setup_cli (line 595) | def run_credential_setup_cli(agent_path: str | Path | None = None) -> int:

FILE: core/framework/credentials/storage.py
  class CredentialStorage (line 28) | class CredentialStorage(ABC):
    method save (line 37) | def save(self, credential: CredentialObject) -> None:
    method load (line 47) | def load(self, credential_id: str) -> CredentialObject | None:
    method delete (line 60) | def delete(self, credential_id: str) -> bool:
    method list_all (line 73) | def list_all(self) -> list[str]:
    method exists (line 83) | def exists(self, credential_id: str) -> bool:
  class EncryptedFileStorage (line 96) | class EncryptedFileStorage(CredentialStorage):
    method __init__ (line 121) | def __init__(
    method _ensure_dirs (line 164) | def _ensure_dirs(self) -> None:
    method _cred_path (line 169) | def _cred_path(self, credential_id: str) -> Path:
    method save (line 175) | def save(self, credential: CredentialObject) -> None:
    method load (line 193) | def load(self, credential_id: str) -> CredentialObject | None:
    method delete (line 215) | def delete(self, credential_id: str) -> bool:
    method list_all (line 225) | def list_all(self) -> list[str]:
    method exists (line 234) | def exists(self, credential_id: str) -> bool:
    method _serialize_credential (line 238) | def _serialize_credential(self, credential: CredentialObject) -> dict[...
    method _deserialize_credential (line 252) | def _deserialize_credential(self, data: dict[str, Any]) -> CredentialO...
    method _update_index (line 261) | def _update_index(
  class EnvVarStorage (line 290) | class EnvVarStorage(CredentialStorage):
    method __init__ (line 307) | def __init__(
    method _get_env_var_name (line 324) | def _get_env_var_name(self, credential_id: str) -> str:
    method _read_env_value (line 331) | def _read_env_value(self, env_var: str) -> str | None:
    method save (line 351) | def save(self, credential: CredentialObject) -> None:
    method load (line 358) | def load(self, credential_id: str) -> CredentialObject | None:
    method delete (line 373) | def delete(self, credential_id: str) -> bool:
    method list_all (line 379) | def list_all(self) -> list[str]:
    method exists (line 390) | def exists(self, credential_id: str) -> bool:
    method add_mapping (line 395) | def add_mapping(self, credential_id: str, env_var: str) -> None:
  class InMemoryStorage (line 406) | class InMemoryStorage(CredentialStorage):
    method __init__ (line 418) | def __init__(self, initial_data: dict[str, CredentialObject] | None = ...
    method save (line 427) | def save(self, credential: CredentialObject) -> None:
    method load (line 431) | def load(self, credential_id: str) -> CredentialObject | None:
    method delete (line 435) | def delete(self, credential_id: str) -> bool:
    method list_all (line 442) | def list_all(self) -> list[str]:
    method exists (line 446) | def exists(self, credential_id: str) -> bool:
    method clear (line 450) | def clear(self) -> None:
  class CompositeStorage (line 455) | class CompositeStorage(CredentialStorage):
    method __init__ (line 470) | def __init__(
    method save (line 485) | def save(self, credential: CredentialObject) -> None:
    method load (line 489) | def load(self, credential_id: str) -> CredentialObject | None:
    method delete (line 504) | def delete(self, credential_id: str) -> bool:
    method list_all (line 508) | def list_all(self) -> list[str]:
    method exists (line 515) | def exists(self, credential_id: str) -> bool:

FILE: core/framework/credentials/store.py
  class CredentialStore (line 34) | class CredentialStore:
    method __init__ (line 68) | def __init__(
    method register_provider (line 104) | def register_provider(self, provider: CredentialProvider) -> None:
    method get_provider (line 114) | def get_provider(self, provider_id: str) -> CredentialProvider | None:
    method get_provider_for_credential (line 126) | def get_provider_for_credential(
    method register_usage (line 153) | def register_usage(self, spec: CredentialUsageSpec) -> None:
    method get_usage_spec (line 162) | def get_usage_spec(self, credential_id: str) -> CredentialUsageSpec | ...
    method get_credential (line 176) | def get_credential(
    method get_key (line 213) | def get_key(self, credential_id: str, key_name: str) -> str | None:
    method get (line 229) | def get(self, credential_id: str) -> str | None:
    method resolve (line 249) | def resolve(self, template: str) -> str:
    method resolve_headers (line 265) | def resolve_headers(self, headers: dict[str, str]) -> dict[str, str]:
    method resolve_params (line 283) | def resolve_params(self, params: dict[str, str]) -> dict[str, str]:
    method resolve_for_usage (line 295) | def resolve_for_usage(self, credential_id: str) -> dict[str, Any]:
    method save_credential (line 327) | def save_credential(self, credential: CredentialObject) -> None:
    method delete_credential (line 339) | def delete_credential(self, credential_id: str) -> bool:
    method list_credentials (line 356) | def list_credentials(self) -> list[str]:
    method list_accounts (line 365) | def list_accounts(self, provider_name: str) -> list[dict[str, Any]]:
    method get_credential_by_alias (line 389) | def get_credential_by_alias(self, provider_name: str, alias: str) -> C...
    method get_credential_by_identity (line 414) | def get_credential_by_identity(self, provider_name: str, label: str) -...
    method is_available (line 418) | def is_available(self, credential_id: str) -> bool:
    method exists (line 430) | def exists(self, credential_id: str) -> bool:
    method validate_for_usage (line 436) | def validate_for_usage(self, credential_id: str) -> list[str]:
    method validate_all (line 461) | def validate_all(self) -> dict[str, list[str]]:
    method validate_credential (line 476) | def validate_credential(self, credential_id: str) -> bool:
    method _should_refresh (line 499) | def _should_refresh(self, credential: CredentialObject) -> bool:
    method _refresh_credential (line 513) | def _refresh_credential(self, credential: CredentialObject) -> Credent...
    method refresh_credential (line 535) | def refresh_credential(self, credential_id: str) -> CredentialObject |...
    method _get_from_cache (line 556) | def _get_from_cache(self, credential_id: str) -> CredentialObject | None:
    method _add_to_cache (line 570) | def _add_to_cache(self, credential: CredentialObject) -> None:
    method _remove_from_cache (line 574) | def _remove_from_cache(self, credential_id: str) -> None:
    method clear_cache (line 578) | def clear_cache(self) -> None:
    method for_testing (line 586) | def for_testing(
    method with_encrypted_storage (line 624) | def with_encrypted_storage(
    method with_env_storage (line 650) | def with_env_storage(
    method with_aden_sync (line 674) | def with_aden_sync(

FILE: core/framework/credentials/template.py
  class TemplateResolver (line 28) | class TemplateResolver:
    method __init__ (line 48) | def __init__(self, credential_store: CredentialStore):
    method resolve (line 57) | def resolve(self, template: str, fail_on_missing: bool = True) -> str:
    method resolve_headers (line 107) | def resolve_headers(
    method resolve_params (line 133) | def resolve_params(
    method has_templates (line 150) | def has_templates(self, text: str) -> bool:
    method extract_references (line 162) | def extract_references(self, text: str) -> list[tuple[str, str | None]]:
    method validate_references (line 179) | def validate_references(self, text: str) -> list[str]:
    method get_required_credentials (line 208) | def get_required_credentials(self, text: str) -> list[str]:

FILE: core/framework/credentials/tests/test_credential_store.py
  class TestCredentialKey (line 38) | class TestCredentialKey:
    method test_create_basic_key (line 41) | def test_create_basic_key(self):
    method test_key_with_expiration (line 49) | def test_key_with_expiration(self):
    method test_expired_key (line 55) | def test_expired_key(self):
    method test_key_with_metadata (line 61) | def test_key_with_metadata(self):
  class TestCredentialObject (line 71) | class TestCredentialObject:
    method test_create_simple_credential (line 74) | def test_create_simple_credential(self):
    method test_create_multi_key_credential (line 85) | def test_create_multi_key_credential(self):
    method test_set_key (line 99) | def test_set_key(self):
    method test_set_key_with_expiration (line 105) | def test_set_key_with_expiration(self):
    method test_needs_refresh (line 112) | def test_needs_refresh(self):
    method test_get_default_key (line 121) | def test_get_default_key(self):
    method test_record_usage (line 139) | def test_record_usage(self):
  class TestCredentialUsageSpec (line 150) | class TestCredentialUsageSpec:
    method test_create_usage_spec (line 153) | def test_create_usage_spec(self):
  class TestInMemoryStorage (line 165) | class TestInMemoryStorage:
    method test_save_and_load (line 168) | def test_save_and_load(self):
    method test_load_nonexistent (line 183) | def test_load_nonexistent(self):
    method test_delete (line 188) | def test_delete(self):
    method test_list_all (line 198) | def test_list_all(self):
    method test_exists (line 208) | def test_exists(self):
    method test_clear (line 216) | def test_clear(self):
  class TestEnvVarStorage (line 225) | class TestEnvVarStorage:
    method test_load_from_env (line 228) | def test_load_from_env(self):
    method test_load_nonexistent (line 237) | def test_load_nonexistent(self):
    method test_default_env_var_pattern (line 242) | def test_default_env_var_pattern(self):
    method test_save_raises (line 251) | def test_save_raises(self):
    method test_delete_raises (line 257) | def test_delete_raises(self):
  class TestEncryptedFileStorage (line 264) | class TestEncryptedFileStorage:
    method temp_dir (line 268) | def temp_dir(self):
    method storage (line 274) | def storage(self, temp_dir):
    method test_save_and_load (line 278) | def test_save_and_load(self, storage):
    method test_encryption_key_from_env (line 293) | def test_encryption_key_from_env(self, temp_dir):
    method test_list_all (line 311) | def test_list_all(self, storage):
    method test_delete (line 320) | def test_delete(self, storage):
  class TestCompositeStorage (line 327) | class TestCompositeStorage:
    method test_read_from_primary (line 330) | def test_read_from_primary(self):
    method test_fallback_when_not_in_primary (line 352) | def test_fallback_when_not_in_primary(self):
    method test_write_to_primary_only (line 367) | def test_write_to_primary_only(self):
  class TestStaticProvider (line 379) | class TestStaticProvider:
    method test_provider_id (line 382) | def test_provider_id(self):
    method test_supported_types (line 387) | def test_supported_types(self):
    method test_refresh_returns_unchanged (line 393) | def test_refresh_returns_unchanged(self):
    method test_validate_with_keys (line 403) | def test_validate_with_keys(self):
    method test_validate_without_keys (line 412) | def test_validate_without_keys(self):
    method test_should_refresh (line 419) | def test_should_refresh(self):
  class TestTemplateResolver (line 427) | class TestTemplateResolver:
    method store (line 431) | def store(self):
    method resolver (line 441) | def resolver(self, store):
    method test_resolve_simple (line 445) | def test_resolve_simple(self, resolver):
    method test_resolve_multiple (line 450) | def test_resolve_multiple(self, resolver):
    method test_resolve_default_key (line 456) | def test_resolve_default_key(self, resolver):
    method test_resolve_headers (line 461) | def test_resolve_headers(self, resolver):
    method test_resolve_missing_credential (line 472) | def test_resolve_missing_credential(self, resolver):
    method test_resolve_missing_key (line 477) | def test_resolve_missing_key(self, resolver):
    method test_has_templates (line 482) | def test_has_templates(self, resolver):
    method test_extract_references (line 488) | def test_extract_references(self, resolver):
  class TestCredentialStore (line 495) | class TestCredentialStore:
    method test_for_testing_factory (line 498) | def test_for_testing_factory(self):
    method test_get_credential (line 505) | def test_get_credential(self):
    method test_get_nonexistent (line 513) | def test_get_nonexistent(self):
    method test_save_and_load (line 519) | def test_save_and_load(self):
    method test_delete_credential (line 530) | def test_delete_credential(self):
    method test_list_credentials (line 537) | def test_list_credentials(self):
    method test_is_available (line 545) | def test_is_available(self):
    method test_resolve_templates (line 552) | def test_resolve_templates(self):
    method test_resolve_headers (line 559) | def test_resolve_headers(self):
    method test_register_provider (line 566) | def test_register_provider(self):
    method test_register_usage_spec (line 574) | def test_register_usage_spec(self):
    method test_validate_for_usage (line 586) | def test_validate_for_usage(self):
    method test_validate_for_usage_missing_key (line 595) | def test_validate_for_usage_missing_key(self):
    method test_caching (line 604) | def test_caching(self):
    method test_clear_cache (line 623) | def test_clear_cache(self):
  class TestOAuth2Module (line 638) | class TestOAuth2Module:
    method test_oauth2_token_from_response (line 641) | def test_oauth2_token_from_response(self):
    method test_token_is_expired (line 660) | def test_token_is_expired(self):
    method test_token_can_refresh (line 674) | def test_token_can_refresh(self):
    method test_oauth2_config_validation (line 684) | def test_oauth2_config_validation(self):

FILE: core/framework/credentials/validation.py
  function ensure_credential_key_env (line 16) | def ensure_credential_key_env() -> None:
  class CredentialStatus (line 69) | class CredentialStatus:
  class CredentialValidationResult (line 91) | class CredentialValidationResult:
    method failed (line 98) | def failed(self) -> list[CredentialStatus]:
    method has_errors (line 129) | def has_errors(self) -> bool:
    method failed_cred_names (line 133) | def failed_cred_names(self) -> list[str]:
    method format_error_message (line 137) | def format_error_message(self) -> str:
  function _label (line 176) | def _label(c: CredentialStatus) -> str:
  function _presync_aden_tokens (line 185) | def _presync_aden_tokens(credential_specs: dict, *, force: bool = False)...
  function validate_agent_credentials (line 239) | def validate_agent_credentials(
  function build_setup_session_from_error (line 481) | def build_setup_session_from_error(
  function _status_to_missing (line 512) | def _status_to_missing(c: CredentialStatus):

FILE: core/framework/debugger/cli.py
  function register_debugger_commands (line 11) | def register_debugger_commands(subparsers: argparse._SubParsersAction) -...
  function cmd_debugger (line 59) | def cmd_debugger(args: argparse.Namespace) -> int:

FILE: core/framework/graph/checkpoint_config.py
  class CheckpointConfig (line 9) | class CheckpointConfig:
    method should_checkpoint_node_start (line 35) | def should_checkpoint_node_start(self) -> bool:
    method should_checkpoint_node_complete (line 39) | def should_checkpoint_node_complete(self) -> bool:
    method should_prune_checkpoints (line 43) | def should_prune_checkpoints(self, nodes_executed: int) -> bool:

FILE: core/framework/graph/client_io.py
  class NodeClientIO (line 24) | class NodeClientIO(ABC):
    method emit_output (line 28) | async def emit_output(self, content: str, is_final: bool = False) -> N...
    method request_input (line 32) | async def request_input(self, prompt: str = "", timeout: float | None ...
  class ActiveNodeClientIO (line 36) | class ActiveNodeClientIO(NodeClientIO):
    method __init__ (line 45) | def __init__(
    method emit_output (line 61) | async def emit_output(self, content: str, is_final: bool = False) -> N...
    method request_input (line 77) | async def request_input(self, prompt: str = "", timeout: float | None ...
    method provide_input (line 106) | async def provide_input(self, content: str) -> None:
    method output_stream (line 113) | async def output_stream(self) -> AsyncIterator[str]:
  class InertNodeClientIO (line 122) | class InertNodeClientIO(NodeClientIO):
    method __init__ (line 130) | def __init__(
    method emit_output (line 138) | async def emit_output(self, content: str, is_final: bool = False) -> N...
    method request_input (line 146) | async def request_input(self, prompt: str = "", timeout: float | None ...
  class ClientIOGateway (line 159) | class ClientIOGateway:
    method __init__ (line 162) | def __init__(self, event_bus: EventBus | None = None) -> None:
    method create_io (line 165) | def create_io(self, node_id: str, client_facing: bool, execution_id: s...

FILE: core/framework/graph/context_handoff.py
  class HandoffContext (line 26) | class HandoffContext:
  class ContextHandoff (line 41) | class ContextHandoff:
    method __init__ (line 51) | def __init__(self, llm: LLMProvider | None = None) -> None:
    method summarize_conversation (line 58) | def summarize_conversation(
    method format_as_input (line 109) | def format_as_input(handoff: HandoffContext) -> str:
    method _extractive_summary (line 137) | def _extractive_summary(messages: list) -> str:
    method _llm_summary (line 163) | def _llm_summary(self, messages: list, output_keys: list[str]) -> str:

FILE: core/framework/graph/conversation.py
  class Message (line 13) | class Message:
    method to_llm_dict (line 39) | def to_llm_dict(self) -> dict[str, Any]:
    method to_storage_dict (line 58) | def to_storage_dict(self) -> dict[str, Any]:
    method from_storage_dict (line 80) | def from_storage_dict(cls, data: dict[str, Any]) -> Message:
  function _extract_spillover_filename (line 95) | def _extract_spillover_filename(content: str) -> str | None:
  function _compact_tool_calls (line 109) | def _compact_tool_calls(tool_calls: list[dict[str, Any]]) -> list[dict[s...
  function extract_tool_call_history (line 157) | def extract_tool_call_history(messages: list[Message], max_entries: int ...
  class ConversationStore (line 229) | class ConversationStore(Protocol):
    method write_part (line 232) | async def write_part(self, seq: int, data: dict[str, Any]) -> None: ...
    method read_parts (line 234) | async def read_parts(self) -> list[dict[str, Any]]: ...
    method write_meta (line 236) | async def write_meta(self, data: dict[str, Any]) -> None: ...
    method read_meta (line 238) | async def read_meta(self) -> dict[str, Any] | None: ...
    method write_cursor (line 240) | async def write_cursor(self, data: dict[str, Any]) -> None: ...
    method read_cursor (line 242) | async def read_cursor(self) -> dict[str, Any] | None: ...
    method delete_parts_before (line 244) | async def delete_parts_before(self, seq: int) -> None: ...
    method close (line 246) | async def close(self) -> None: ...
    method destroy (line 248) | async def destroy(self) -> None: ...
  function _try_extract_key (line 256) | def _try_extract_key(content: str, key: str) -> str | None:
  class NodeConversation (line 300) | class NodeConversation:
    method __init__ (line 309) | def __init__(
    method system_prompt (line 331) | def system_prompt(self) -> str:
    method update_system_prompt (line 334) | def update_system_prompt(self, new_prompt: str) -> None:
    method set_current_phase (line 343) | def set_current_phase(self, phase_id: str) -> None:
    method current_phase (line 348) | def current_phase(self) -> str | None:
    method messages (line 352) | def messages(self) -> list[Message]:
    method turn_count (line 357) | def turn_count(self) -> int:
    method message_count (line 362) | def message_count(self) -> int:
    method next_seq (line 367) | def next_seq(self) -> int:
    method add_user_message (line 372) | async def add_user_message(
    method add_assistant_message (line 392) | async def add_assistant_message(
    method add_tool_result (line 409) | async def add_tool_result(
    method to_llm_messages (line 432) | def to_llm_messages(self) -> list[dict[str, Any]]:
    method _repair_orphaned_tool_calls (line 443) | def _repair_orphaned_tool_calls(
    method estimate_tokens (line 502) | def estimate_tokens(self) -> int:
    method update_token_count (line 522) | def update_token_count(self, actual_input_tokens: int) -> None:
    method usage_ratio (line 531) | def usage_ratio(self) -> float:
    method needs_compaction (line 540) | def needs_compaction(self) -> bool:
    method _extract_protected_values (line 545) | def _extract_protected_values(self, messages: list[Message]) -> dict[s...
    method _try_extract_key (line 569) | def _try_extract_key(self, content: str, key: str) -> str | None:
    method prune_old_tool_results (line 575) | async def prune_old_tool_results(
    method compact (line 677) | async def compact(
    method compact_preserving_structure (line 755) | async def compact_preserving_structure(
    method _find_phase_graduated_split (line 960) | def _find_phase_graduated_split(self) -> int | None:
    method clear (line 987) | async def clear(self) -> None:
    method export_summary (line 995) | def export_summary(self) -> str:
    method _persist (line 1026) | async def _persist(self, message: Message) -> None:
    method _persist_meta (line 1035) | async def _persist_meta(self) -> None:
    method restore (line 1052) | async def restore(

FILE: core/framework/graph/conversation_judge.py
  class PhaseVerdict (line 25) | class PhaseVerdict:
  function evaluate_phase_completion (line 33) | async def evaluate_phase_completion(
  function _extract_recent_context (line 105) | def _extract_recent_context(conversation: NodeConversation, max_messages...
  function _format_outputs (line 144) | def _format_outputs(accumulator_state: dict[str, Any]) -> str:
  function _parse_verdict (line 182) | def _parse_verdict(response: str) -> PhaseVerdict:

FILE: core/framework/graph/edge.py
  class EdgeCondition (line 39) | class EdgeCondition(StrEnum):
  class EdgeSpec (line 49) | class EdgeSpec(BaseModel):
    method should_traverse (line 107) | async def should_traverse(
    method _evaluate_condition (line 160) | def _evaluate_condition(
    method _llm_decide (line 206) | async def _llm_decide(
    method map_inputs (line 276) | def map_inputs(
  class AsyncEntryPointSpec (line 306) | class AsyncEntryPointSpec(BaseModel):
    method get_isolation_level (line 356) | def get_isolation_level(self):
  class GraphSpec (line 363) | class GraphSpec(BaseModel):
    method _resolve_max_tokens (line 456) | def _resolve_max_tokens(cls, values: Any) -> Any:
    method get_node (line 464) | def get_node(self, node_id: str) -> Any | None:
    method get_outgoing_edges (line 471) | def get_outgoing_edges(self, node_id: str) -> list[EdgeSpec]:
    method get_incoming_edges (line 476) | def get_incoming_edges(self, node_id: str) -> list[EdgeSpec]:
    method detect_fan_out_nodes (line 480) | def detect_fan_out_nodes(self) -> dict[str, list[str]]:
    method detect_fan_in_nodes (line 499) | def detect_fan_in_nodes(self) -> dict[str, list[str]]:
    method get_entry_point (line 516) | def get_entry_point(self, session_state: dict | None = None) -> str:
    method validate (line 548) | def validate(self) -> dict[str, list[str]]:

FILE: core/framework/graph/event_loop_node.py
  class TriggerEvent (line 41) | class TriggerEvent:
  function _is_context_too_large_error (line 64) | def _is_context_too_large_error(exc: BaseException) -> bool:
  class _EscalationReceiver (line 77) | class _EscalationReceiver:
    method __init__ (line 88) | def __init__(self) -> None:
    method inject_event (line 93) | async def inject_event(self, content: str, *, is_client_input: bool = ...
    method wait (line 98) | async def wait(self) -> str | None:
  class TurnCancelled (line 109) | class TurnCancelled(Exception):
  class JudgeVerdict (line 116) | class JudgeVerdict:
  class JudgeProtocol (line 127) | class JudgeProtocol(Protocol):
    method evaluate (line 134) | async def evaluate(self, context: dict[str, Any]) -> JudgeVerdict: ...
  class SubagentJudge (line 137) | class SubagentJudge:
    method __init__ (line 146) | def __init__(self, task: str, max_iterations: int = 10):
    method evaluate (line 150) | async def evaluate(self, context: dict[str, Any]) -> JudgeVerdict:
  class LoopConfig (line 180) | class LoopConfig:
    method __post_init__ (line 258) | def __post_init__(self) -> None:
  class HookContext (line 269) | class HookContext:
  class HookResult (line 278) | class HookResult:
  class OutputAccumulator (line 291) | class OutputAccumulator:
    method set (line 308) | async def set(self, key: str, value: Any) -> None:
    method _auto_spill (line 324) | def _auto_spill(self, key: str, value: Any) -> Any:
    method get (line 357) | def get(self, key: str) -> Any | None:
    method to_dict (line 361) | def to_dict(self) -> dict[str, Any]:
    method has_all_keys (line 365) | def has_all_keys(self, required: list[str]) -> bool:
    method restore (line 370) | async def restore(cls, store: ConversationStore) -> OutputAccumulator:
  class EventLoopNode (line 384) | class EventLoopNode(NodeProtocol):
    method __init__ (line 416) | def __init__(
    method validate_input (line 446) | def validate_input(self, ctx: NodeContext) -> list[str]:
    method execute (line 462) | async def execute(self, ctx: NodeContext) -> NodeResult:
    method inject_event (line 1913) | async def inject_event(self, content: str, *, is_client_input: bool = ...
    method inject_trigger (line 1933) | async def inject_trigger(self, trigger: TriggerEvent) -> None:
    method signal_shutdown (line 1942) | def signal_shutdown(self) -> None:
    method cancel_current_turn (line 1951) | def cancel_current_turn(self) -> None:
    method _await_user_input (line 1963) | async def _await_user_input(
    method _run_single_turn (line 2024) | async def _run_single_turn(
    method _build_ask_user_tool (line 2915) | def _build_ask_user_tool(self) -> Tool:
    method _build_ask_user_multiple_tool (line 2970) | def _build_ask_user_multiple_tool(self) -> Tool:
    method _build_set_output_tool (line 3036) | def _build_set_output_tool(self, output_keys: list[str] | None) -> Too...
    method _build_escalate_tool (line 3072) | def _build_escalate_tool(self) -> Tool:
    method _build_delegate_tool (line 3101) | def _build_delegate_tool(
    method _build_report_to_parent_tool (line 3154) | def _build_report_to_parent_tool(self) -> Tool:
    method _handle_set_output (line 3212) | def _handle_set_output(
    method _judge_turn (line 3266) | async def _judge_turn(
    method _extract_tool_call_history (line 3394) | def _extract_tool_call_history(
    method _build_initial_message (line 3406) | def _build_initial_message(self, ctx: NodeContext) -> str:
    method _get_missing_output_keys (line 3430) | def _get_missing_output_keys(
    method _ngram_similarity (line 3443) | def _ngram_similarity(s1: str, s2: str, n: int = 2) -> float:
    method _is_stalled (line 3464) | def _is_stalled(self, recent_responses: list[str]) -> bool:
    method _is_transient_error (line 3485) | def _is_transient_error(exc: BaseException) -> bool:
    method _fingerprint_tool_calls (line 3538) | def _fingerprint_tool_calls(
    method _is_tool_doom_loop (line 3557) | def _is_tool_doom_loop(
    method _execute_tool (line 3588) | async def _execute_tool(self, tc: ToolCallEvent) -> ToolResult:
    method _record_learning (line 3662) | def _record_learning(self, key: str, value: Any) -> None:
    method _next_spill_filename (line 3704) | def _next_spill_filename(self, tool_name: str) -> str:
    method _restore_spill_counter (line 3711) | def _restore_spill_counter(self) -> None:
    method _extract_json_metadata (line 3735) | def _extract_json_metadata(parsed: Any, *, _depth: int = 0, _max_depth...
    method _build_json_preview (line 3792) | def _build_json_preview(parsed: Any, *, max_chars: int = 5000) -> str ...
    method _truncate_tool_result (line 3849) | def _truncate_tool_result(
    method _compact (line 4042) | async def _compact(
    method _llm_compact (line 4139) | async def _llm_compact(
    method _llm_compact_split (line 4211) | async def _llm_compact_split(
    method _format_messages_for_summary (line 4232) | def _format_messages_for_summary(messages: list) -> str:
    method _build_llm_compaction_prompt (line 4249) | def _build_llm_compaction_prompt(
    method _build_message_inventory (line 4298) | def _build_message_inventory(
    method _log_compaction (line 4340) | async def _log_compaction(
    method _write_compaction_debug_log (line 4406) | def _write_compaction_debug_log(
    method _build_emergency_summary (line 4479) | def _build_emergency_summary(
    class _RestoredState (line 4601) | class _RestoredState:
    method _restore (line 4610) | async def _restore(
    method _write_cursor (line 4666) | async def _write_cursor(
    method _drain_injection_queue (line 4701) | async def _drain_injection_queue(self, conversation: NodeConversation)...
    method _drain_trigger_queue (line 4722) | async def _drain_trigger_queue(self, conversation: NodeConversation) -...
    method _check_pause (line 4750) | async def _check_pause(
    method _publish_loop_started (line 4786) | async def _publish_loop_started(
    method _generate_action_plan (line 4797) | async def _generate_action_plan(
    method _run_hooks (line 4844) | async def _run_hooks(
    method _publish_context_usage (line 4883) | async def _publish_context_usage(
    method _publish_iteration (line 4913) | async def _publish_iteration(
    method _publish_llm_turn_complete (line 4930) | async def _publish_llm_turn_complete(
    method _log_skip_judge (line 4955) | def _log_skip_judge(
    method _publish_loop_completed (line 4981) | async def _publish_loop_completed(
    method _publish_stalled (line 4992) | async def _publish_stalled(self, stream_id: str, node_id: str, executi...
    method _publish_text_delta (line 5001) | async def _publish_text_delta(
    method _publish_tool_started (line 5033) | async def _publish_tool_started(
    method _publish_tool_completed (line 5052) | async def _publish_tool_completed(
    method _publish_judge_verdict (line 5073) | async def _publish_judge_verdict(
    method _publish_output_key_set (line 5094) | async def _publish_output_key_set(
    method _execute_subagent (line 5110) | async def _execute_subagent(

FILE: core/framework/graph/executor.py
  function _default_max_context_tokens (line 40) | def _default_max_context_tokens() -> int:
  class ExecutionResult (line 51) | class ExecutionResult:
    method is_clean_success (line 75) | def is_clean_success(self) -> bool:
    method is_degraded_success (line 80) | def is_degraded_success(self) -> bool:
  class ParallelBranch (line 86) | class ParallelBranch:
  class ParallelExecutionConfig (line 99) | class ParallelExecutionConfig:
  class GraphExecutor (line 114) | class GraphExecutor:
    method __init__ (line 133) | def __init__(
    method _write_progress (line 233) | def _write_progress(
    method _validate_tools (line 287) | def _validate_tools(self, graph: GraphSpec) -> list[str]:
    method _phase_llm_compact (line 332) | async def _phase_llm_compact(
    method _phase_llm_compact_split (line 424) | async def _phase_llm_compact_split(
    method _get_runtime_log_session_id (line 447) | def _get_runtime_log_session_id(self) -> str:
    method execute (line 455) | async def execute(
    method _build_context (line 1808) | def _build_context(
    method _get_node_implementation (line 1924) | def _get_node_implementation(
    method _follow_edges (line 1997) | async def _follow_edges(
    method _get_all_traversable_edges (line 2030) | async def _get_all_traversable_edges(
    method _find_convergence_node (line 2078) | def _find_convergence_node(
    method _execute_parallel_branches (line 2112) | async def _execute_parallel_branches(
    method register_node (line 2370) | def register_node(self, node_id: str, implementation: NodeProtocol) ->...
    method request_pause (line 2374) | def request_pause(self) -> None:
    method _create_checkpoint (line 2387) | def _create_checkpoint(

FILE: core/framework/graph/goal.py
  class GoalStatus (line 21) | class GoalStatus(StrEnum):
  class SuccessCriterion (line 32) | class SuccessCriterion(BaseModel):
  class Constraint (line 59) | class Constraint(BaseModel):
  class Goal (line 83) | class Goal(BaseModel):
    method is_success (line 160) | def is_success(self) -> bool:
    method to_prompt_context (line 170) | def to_prompt_context(self) -> str:

FILE: core/framework/graph/node.py
  function _fix_unescaped_newlines_in_json (line 33) | def _fix_unescaped_newlines_in_json(json_str: str) -> str:
  function find_json_object (line 89) | def find_json_object(text: str) -> str | None:
  class NodeSpec (line 141) | class NodeSpec(BaseModel):
  class MemoryWriteError (line 278) | class MemoryWriteError(Exception):
  class SharedMemory (line 285) | class SharedMemory:
    method __post_init__ (line 303) | def __post_init__(self) -> None:
    method read (line 308) | def read(self, key: str) -> Any:
    method write (line 314) | def write(self, key: str, value: Any, validate: bool = True) -> None:
    method write_async (line 347) | async def write_async(self, key: str, value: Any, validate: bool = Tru...
    method _contains_code_indicators (line 389) | def _contains_code_indicators(self, value: str) -> bool:
    method read_all (line 450) | def read_all(self) -> dict[str, Any]:
    method with_permissions (line 456) | def with_permissions(
  class NodeContext (line 476) | class NodeContext:
  class NodeResult (line 580) | class NodeResult:
    method to_summary (line 609) | def to_summary(self, node_spec: Any = None) -> str:
  class NodeProtocol (line 630) | class NodeProtocol(ABC):
    method execute (line 662) | async def execute(self, ctx: NodeContext) -> NodeResult:
    method validate_input (line 674) | def validate_input(self, ctx: NodeContext) -> list[str]:

FILE: core/framework/graph/prompt_composer.py
  function _with_datetime (line 40) | def _with_datetime(prompt: str) -> str:
  function build_accounts_prompt (line 47) | def build_accounts_prompt(
  function compose_system_prompt (line 148) | def compose_system_prompt(
  function build_narrative (line 213) | def build_narrative(
  function build_transition_marker (line 261) | def build_transition_marker(

FILE: core/framework/graph/safe_eval.py
  class SafeEvalVisitor (line 56) | class SafeEvalVisitor(ast.NodeVisitor):
    method __init__ (line 57) | def __init__(self, context: dict[str, Any]):
    method visit (line 60) | def visit(self, node: ast.AST) -> Any:
    method generic_visit (line 66) | def generic_visit(self, node: ast.AST):
    method visit_Expression (line 69) | def visit_Expression(self, node: ast.Expression) -> Any:
    method visit_Expr (line 72) | def visit_Expr(self, node: ast.Expr) -> Any:
    method visit_Constant (line 75) | def visit_Constant(self, node: ast.Constant) -> Any:
    method visit_List (line 79) | def visit_List(self, node: ast.List) -> list:
    method visit_Tuple (line 82) | def visit_Tuple(self, node: ast.Tuple) -> tuple:
    method visit_Dict (line 85) | def visit_Dict(self, node: ast.Dict) -> dict:
    method visit_BinOp (line 93) | def visit_BinOp(self, node: ast.BinOp) -> Any:
    method visit_UnaryOp (line 99) | def visit_UnaryOp(self, node: ast.UnaryOp) -> Any:
    method visit_Compare (line 105) | def visit_Compare(self, node: ast.Compare) -> Any:
    method visit_BoolOp (line 117) | def visit_BoolOp(self, node: ast.BoolOp) -> Any:
    method visit_IfExp (line 137) | def visit_IfExp(self, node: ast.IfExp) -> Any:
    method visit_Name (line 145) | def visit_Name(self, node: ast.Name) -> Any:
    method visit_Subscript (line 152) | def visit_Subscript(self, node: ast.Subscript) -> Any:
    method visit_Attribute (line 158) | def visit_Attribute(self, node: ast.Attribute) -> Any:
    method visit_Call (line 185) | def visit_Call(self, node: ast.Call) -> Any:
    method visit_Index (line 231) | def visit_Index(self, node: ast.Index) -> Any:
  function safe_eval (line 236) | def safe_eval(expr: str, context: dict[str, Any] | None = None) -> Any:

FILE: core/framework/graph/validator.py
  class ValidationResult (line 17) | class ValidationResult:
    method error (line 24) | def error(self) -> str:
  class OutputValidator (line 29) | class OutputValidator:
    method _contains_code_indicators (line 36) | def _contains_code_indicators(self, value: str) -> bool:
    method validate_output_keys (line 100) | def validate_output_keys(
    method validate_with_pydantic (line 142) | def validate_with_pydantic(
    method format_validation_feedback (line 169) | def format_validation_feedback(
    method validate_no_hallucination (line 207) | def validate_no_hallucination(
    method validate_schema (line 246) | def validate_schema(
    method validate_all (line 276) | def validate_all(

FILE: core/framework/llm/anthropic.py
  function _get_api_key_from_credential_store (line 10) | def _get_api_key_from_credential_store() -> str | None:
  class AnthropicProvider (line 28) | class AnthropicProvider(LLMProvider):
    method __init__ (line 37) | def __init__(
    method complete (line 64) | def complete(
    method acomplete (line 85) | async def acomplete(

FILE: core/framework/llm/antigravity.py
  function _load_from_json_file (line 86) | def _load_from_json_file() -> tuple[str | None, str | None, str, float]:
  function _load_from_ide_db (line 147) | def _load_from_ide_db() -> tuple[str | None, str | None, float]:
  function _do_token_refresh (line 199) | def _do_token_refresh(refresh_token: str) -> tuple[str, float] | None:
  function _clean_tool_name (line 256) | def _clean_tool_name(name: str) -> str:
  function _to_gemini_contents (line 264) | def _to_gemini_contents(
  function _map_finish_reason (line 370) | def _map_finish_reason(reason: str) -> str:
  function _parse_complete_response (line 376) | def _parse_complete_response(raw: dict[str, Any], model: str) -> LLMResp...
  function _parse_sse_stream (line 398) | def _parse_sse_stream(
  class AntigravityProvider (line 477) | class AntigravityProvider(LLMProvider):
    method __init__ (line 484) | def __init__(self, model: str = "gemini-3-flash") -> None:
    method _init_credentials (line 500) | def _init_credentials(self) -> None:
    method has_credentials (line 517) | def has_credentials(self) -> bool:
    method _ensure_token (line 521) | def _ensure_token(self) -> str:
    method _build_body (line 547) | def _build_body(
    method _post (line 589) | def _post(self, body: dict[str, Any], *, streaming: bool) -> Any:
    method complete (line 651) | def complete(
    method stream (line 669) | async def stream(

FILE: core/framework/llm/litellm.py
  function _patch_litellm_anthropic_oauth (line 37) | def _patch_litellm_anthropic_oauth() -> None:
  function _patch_litellm_metadata_nonetype (line 105) | def _patch_litellm_metadata_nonetype() -> None:
  function _model_supports_cache_control (line 182) | def _model_supports_cache_control(model: str) -> bool:
  function _sample_js_code_unit (line 198) | def _sample_js_code_unit(text: str, idx: int) -> str:
  function _claude_code_billing_header (line 208) | def _claude_code_billing_header(messages: list[dict[str, Any]]) -> str:
  function _estimate_tokens (line 263) | def _estimate_tokens(model: str, messages: list[dict]) -> tuple[int, str]:
  function _prune_failed_request_dumps (line 278) | def _prune_failed_request_dumps(max_files: int = MAX_FAILED_REQUEST_DUMP...
  function _remember_openrouter_tool_compat_model (line 296) | def _remember_openrouter_tool_compat_model(model: str) -> None:
  function _is_openrouter_tool_compat_cached (line 303) | def _is_openrouter_tool_compat_cached(model: str) -> bool:
  function _dump_failed_request (line 314) | def _dump_failed_request(
  function _compute_retry_delay (line 351) | def _compute_retry_delay(
  function _is_stream_transient_error (line 407) | def _is_stream_transient_error(exc: BaseException) -> bool:
  class LiteLLMProvider (line 441) | class LiteLLMProvider(LLMProvider):
    method __init__ (line 478) | def __init__(
    method _default_api_base_for_model (line 543) | def _default_api_base_for_model(model: str) -> str | None:
    method _completion_with_rate_limit_retry (line 556) | def _completion_with_rate_limit_retry(
    method complete (line 668) | def complete(
    method _acompletion_with_rate_limit_retry (line 760) | async def _acompletion_with_rate_limit_retry(
    method acomplete (line 867) | async def acomplete(
    method _tool_to_openai_format (line 941) | def _tool_to_openai_format(self, tool: Tool) -> dict[str, Any]:
    method _is_anthropic_model (line 956) | def _is_anthropic_model(self) -> bool:
    method _is_minimax_model (line 961) | def _is_minimax_model(self) -> bool:
    method _is_openrouter_model (line 966) | def _is_openrouter_model(self) -> bool:
    method _should_use_openrouter_tool_compat (line 974) | def _should_use_openrouter_tool_compat(
    method _extract_json_object (line 988) | def _extract_json_object(text: str) -> dict[str, Any] | None:
    method _parse_openrouter_tool_compat_response (line 1020) | def _parse_openrouter_tool_compat_response(
    method _close_truncated_json_fragment (line 1114) | def _close_truncated_json_fragment(fragment: str) -> str:
    method _repair_truncated_tool_arguments (line 1153) | def _repair_truncated_tool_arguments(self, raw_arguments: str) -> dict...
    method _parse_tool_call_arguments (line 1173) | def _parse_tool_call_arguments(self, raw_arguments: str, tool_name: st...
    method _parse_openrouter_text_tool_calls (line 1196) | def _parse_openrouter_text_tool_calls(
    method _parse_openrouter_text_tool_call_block (line 1249) | def _parse_openrouter_text_tool_call_block(
    method _parse_openrouter_text_tool_call_arguments (line 1292) | def _parse_openrouter_text_tool_call_arguments(
    method _build_openrouter_tool_compat_messages (line 1314) | def _build_openrouter_tool_compat_messages(
    method _acomplete_via_openrouter_tool_compat (line 1358) | async def _acomplete_via_openrouter_tool_compat(
    method _stream_via_openrouter_tool_compat (line 1402) | async def _stream_via_openrouter_tool_compat(
    method _stream_via_nonstream_completion (line 1454) | async def _stream_via_nonstream_completion(
    method stream (line 1519) | async def stream(
    method _collect_stream_to_response (line 1930) | async def _collect_stream_to_response(

FILE: core/framework/llm/mock.py
  class MockLLMProvider (line 17) | class MockLLMProvider(LLMProvider):
    method __init__ (line 35) | def __init__(self, model: str = "mock-model"):
    method _extract_output_keys (line 44) | def _extract_output_keys(self, system: str) -> list[str]:
    method _generate_mock_response (line 85) | def _generate_mock_response(
    method complete (line 115) | def complete(
    method acomplete (line 149) | async def acomplete(
    method stream (line 170) | async def stream(

FILE: core/framework/llm/provider.py
  class LLMResponse (line 12) | class LLMResponse:
  class Tool (line 24) | class Tool:
  class ToolUse (line 33) | class ToolUse:
  class ToolResult (line 42) | class ToolResult:
  class LLMProvider (line 51) | class LLMProvider(ABC):
    method complete (line 63) | def complete(
    method acomplete (line 94) | async def acomplete(
    method stream (line 124) | async def stream(

FILE: core/framework/llm/stream_events.py
  class TextDeltaEvent (line 15) | class TextDeltaEvent:
  class TextEndEvent (line 24) | class TextEndEvent:
  class ToolCallEvent (line 32) | class ToolCallEvent:
  class ToolResultEvent (line 42) | class ToolResultEvent:
  class ReasoningStartEvent (line 52) | class ReasoningStartEvent:
  class ReasoningDeltaEvent (line 59) | class ReasoningDeltaEvent:
  class FinishEvent (line 67) | class FinishEvent:
  class StreamErrorEvent (line 79) | class StreamErrorEvent:

FILE: core/framework/observability/logging.py
  function strip_ansi_codes (line 37) | def strip_ansi_codes(text: str) -> str:
  class StructuredFormatter (line 42) | class StructuredFormatter(logging.Formatter):
    method format (line 52) | def format(self, record: logging.LogRecord) -> str:
  class HumanReadableFormatter (line 103) | class HumanReadableFormatter(logging.Formatter):
    method format (line 121) | def format(self, record: logging.LogRecord) -> str:
  function configure_logging (line 151) | def configure_logging(
  function _disable_third_party_colors (line 234) | def _disable_third_party_colors() -> None:
  function set_trace_context (line 251) | def set_trace_context(**kwargs: Any) -> None:
  function get_trace_context (line 283) | def get_trace_context() -> dict:
  function clear_trace_context (line 295) | def clear_trace_context() -> None:

FILE: core/framework/runner/cli.py
  function register_commands (line 10) | def register_commands(subparsers: argparse._SubParsersAction) -> None:
  function _load_resume_state (line 290) | def _load_resume_state(
  function _prompt_before_start (line 346) | def _prompt_before_start(agent_path: str, runner, model: str | None = No...
  function cmd_run (line 380) | def cmd_run(args: argparse.Namespace) -> int:
  function cmd_info (line 566) | def cmd_info(args: argparse.Namespace) -> int:
  function cmd_validate (line 633) | def cmd_validate(args: argparse.Namespace) -> int:
  function cmd_list (line 671) | def cmd_list(args: argparse.Namespace) -> int:
  function cmd_dispatch (line 725) | def cmd_dispatch(args: argparse.Namespace) -> int:
  function _interactive_approval (line 837) | def _interactive_approval(request):
  function _format_natural_language_to_json (line 905) | def _format_natural_language_to_json(
  function cmd_shell (line 923) | def cmd_shell(args: argparse.Namespace) -> int:
  function _get_framework_agents_dir (line 1156) | def _get_framework_agents_dir() -> Path:
  function _extract_python_agent_metadata (line 1161) | def _extract_python_agent_metadata(agent_path: Path) -> tuple[str, str]:
  function _eval_string_binop (line 1219) | def _eval_string_binop(node) -> str | None:
  function _is_valid_agent_dir (line 1233) | def _is_valid_agent_dir(path: Path) -> bool:
  function _has_agents (line 1240) | def _has_agents(directory: Path) -> bool:
  function _getch (line 1247) | def _getch() -> str:
  function _read_key (line 1271) | def _read_key() -> str:
  function _select_agent (line 1285) | def _select_agent(agents_dir: Path) -> str | None:
  function _interactive_multi (line 1412) | def _interactive_multi(agents_dir: Path) -> int:
  function cmd_setup_credentials (line 1513) | def cmd_setup_credentials(args: argparse.Namespace) -> int:
  function _open_browser (line 1535) | def _open_browser(url: str) -> None:
  function _build_frontend (line 1564) | def _build_frontend() -> bool:
  function cmd_serve (line 1626) | def cmd_serve(args: argparse.Namespace) -> int:
  function cmd_open (line 1701) | def cmd_open(args: argparse.Namespace) -> int:

FILE: core/framework/runner/mcp_client.py
  class MCPServerConfig (line 21) | class MCPServerConfig:
  class MCPTool (line 43) | class MCPTool:
  class MCPClient (line 52) | class MCPClient:
    method __init__ (line 60) | def __init__(self, config: MCPServerConfig):
    method _run_async (line 84) | def _run_async(self, coro):
    method connect (line 137) | def connect(self) -> None:
    method _connect_stdio (line 157) | def _connect_stdio(self) -> None:
    method _connect_http (line 253) | def _connect_http(self) -> None:
    method _connect_unix (line 275) | def _connect_unix(self) -> None:
    method _connect_sse (line 301) | def _connect_sse(self) -> None:
    method _discover_tools (line 359) | def _discover_tools(self) -> None:
    method _list_tools_stdio_async (line 385) | async def _list_tools_stdio_async(self) -> list[dict]:
    method _list_tools_http (line 406) | def _list_tools_http(self) -> list[dict]:
    method list_tools (line 432) | def list_tools(self) -> list[MCPTool]:
    method call_tool (line 444) | def call_tool(self, tool_name: str, arguments: dict[str, Any]) -> Any:
    method _call_tool_with_retry (line 473) | def _call_tool_with_retry(self, call: Any) -> Any:
    method _call_tool_stdio_async (line 495) | async def _call_tool_stdio_async(self, tool_name: str, arguments: dict...
    method _call_tool_http (line 526) | def _call_tool_http(self, tool_name: str, arguments: dict[str, Any]) -...
    method _reconnect (line 554) | def _reconnect(self) -> None:
    method _cleanup_stdio_async (line 563) | async def _cleanup_stdio_async(self) -> None:
    method disconnect (line 623) | def disconnect(self) -> None:
    method __enter__ (line 704) | def __enter__(self):
    method __exit__ (line 709) | def __exit__(self, exc_type, exc_val, exc_tb):

FILE: core/framework/runner/mcp_connection_manager.py
  class MCPConnectionManager (line 14) | class MCPConnectionManager:
    method __init__ (line 20) | def __init__(self) -> None:
    method get_instance (line 29) | def get_instance(cls) -> "MCPConnectionManager":
    method _is_connected (line 38) | def _is_connected(client: MCPClient | None) -> bool:
    method acquire (line 41) | def acquire(self, config: MCPServerConfig) -> MCPClient:
    method release (line 101) | def release(self, server_name: str) -> None:
    method health_check (line 139) | def health_check(self, server_name: str) -> bool:
    method reconnect (line 179) | def reconnect(self, server_name: str) -> MCPClient:
    method cleanup_all (line 226) | def cleanup_all(self) -> None:

FILE: core/framework/runner/orchestrator.py
  class RoutingDecision (line 24) | class RoutingDecision:
  class AgentOrchestrator (line 34) | class AgentOrchestrator:
    method __init__ (line 55) | def __init__(
    method register (line 84) | def register(
    method register_runner (line 111) | def register_runner(
    method list_agents (line 137) | def list_agents(self) -> list[dict]:
    method dispatch (line 152) | async def dispatch(
    method relay (line 263) | async def relay(
    method broadcast (line 299) | async def broadcast(
    method _check_all_capabilities (line 350) | async def _check_all_capabilities(
    method _route_request (line 378) | async def _route_request(
    method _llm_route (line 430) | async def _llm_route(
    method _send_to_agent (line 496) | async def _send_to_agent(
    method get_message_log (line 505) | def get_message_log(self) -> list[AgentMessage]:
    method clear_message_log (line 509) | def clear_message_log(self) -> None:
    method cleanup (line 513) | def cleanup(self) -> None:

FILE: core/framework/runner/preload_validation.py
  class PreloadValidationError (line 20) | class PreloadValidationError(Exception):
    method __init__ (line 23) | def __init__(self, errors: list[str]):
  class PreloadResult (line 30) | class PreloadResult:
  function validate_graph_structure (line 38) | def validate_graph_structure(graph: GraphSpec) -> list[str]:
  function validate_credentials (line 49) | def validate_credentials(
  function credential_errors_to_json (line 115) | def credential_errors_to_json(exc: Exception) -> dict:
  function run_preload_validation (line 160) | def run_preload_validation(

FILE: core/framework/runner/protocol.py
  class MessageType (line 10) | class MessageType(Enum):
  class CapabilityLevel (line 21) | class CapabilityLevel(Enum):
  class AgentMessage (line 31) | class AgentMessage:
    method reply (line 50) | def reply(
  class CapabilityResponse (line 69) | class CapabilityResponse:
  class OrchestratorResult (line 81) | class OrchestratorResult:
  class RegisteredAgent (line 92) | class RegisteredAgent:

FILE: core/framework/runner/runner.py
  function _read_claude_keychain (line 55) | def _read_claude_keychain() -> dict | None:
  function _save_claude_keychain (line 94) | def _save_claude_keychain(creds: dict) -> bool:
  function _read_claude_credentials (line 127) | def _read_claude_credentials() -> dict | None:
  function _refresh_claude_code_token (line 145) | def _refresh_claude_code_token(refresh_token: str) -> dict | None:
  function _save_refreshed_credentials (line 182) | def _save_refreshed_credentials(token_data: dict) -> None:
  function get_claude_code_token (line 212) | def get_claude_code_token() -> str | None:
  function _get_codex_keychain_account (line 267) | def _get_codex_keychain_account() -> str:
  function _read_codex_keychain (line 280) | def _read_codex_keychain() -> dict | None:
  function _read_codex_auth_file (line 319) | def _read_codex_auth_file() -> dict | None:
  function _is_codex_token_expired (line 330) | def _is_codex_token_expired(auth_data: dict) -> bool:
  function _refresh_codex_token (line 362) | def _refresh_codex_token(refresh_token: str) -> dict | None:
  function _save_refreshed_codex_credentials (line 397) | def _save_refreshed_codex_credentials(auth_data: dict, token_data: dict)...
  function get_codex_token (line 424) | def get_codex_token() -> str | None:
  function _get_account_id_from_jwt (line 466) | def _get_account_id_from_jwt(access_token: str) -> str | None:
  function get_codex_account_id (line 497) | def get_codex_account_id() -> str | None:
  function get_kimi_code_token (line 525) | def get_kimi_code_token() -> str | None:
  function _read_antigravity_ide_credentials (line 583) | def _read_antigravity_ide_credentials() -> dict | None:
  function _read_antigravity_credentials (line 659) | def _read_antigravity_credentials() -> dict | None:
  function _is_antigravity_token_expired (line 687) | def _is_antigravity_token_expired(auth_data: dict) -> bool:
  function _refresh_antigravity_token (line 728) | def _refresh_antigravity_token(refresh_token: str) -> dict | None:
  function _save_refreshed_antigravity_credentials (line 771) | def _save_refreshed_antigravity_credentials(auth_data: dict, token_data:...
  function get_antigravity_token (line 804) | def get_antigravity_token() -> str | None:
  function _is_antigravity_proxy_available (line 857) | def _is_antigravity_proxy_available() -> bool:
  class AgentInfo (line 869) | class AgentInfo:
  class ValidationResult (line 889) | class ValidationResult:
  function load_agent_export (line 899) | def load_agent_export(data: str | dict) -> tuple[GraphSpec, Goal]:
  class AgentRunner (line 997) | class AgentRunner:
    method _resolve_default_model (line 1023) | def _resolve_default_model() -> str:
    method __init__ (line 1027) | def __init__(
    method _import_agent_module (line 1125) | def _import_agent_module(agent_path: Path):
    method load (line 1164) | def load(
    method register_tool (line 1348) | def register_tool(
    method register_tools_from_module (line 1370) | def register_tools_from_module(self, module_path: Path) -> int:
    method register_mcp_server (line 1382) | def register_mcp_server(
    method _load_mcp_servers_from_config (line 1423) | def _load_mcp_servers_from_config(self, config_path: Path) -> None:
    method set_approval_callback (line 1427) | def set_approval_callback(self, callback: Callable) -> None:
    method _setup (line 1436) | def _setup(self, event_bus=None) -> None:
    method _get_api_key_env_var (line 1699) | def _get_api_key_env_var(self, model: str) -> str | None:
    method _get_api_key_from_credential_store (line 1739) | def _get_api_key_from_credential_store(self) -> str | None:
    method _is_local_model (line 1775) | def _is_local_model(model: str) -> bool:
    method _setup_agent_runtime (line 1790) | def _setup_agent_runtime(
    method run (line 1880) | async def run(
    method _run_with_agent_runtime (line 1922) | async def _run_with_agent_runtime(
    method start (line 2016) | async def start(self) -> None:
    method stop (line 2028) | async def stop(self) -> None:
    method trigger (line 2033) | async def trigger(
    method get_goal_progress (line 2064) | async def get_goal_progress(self) -> dict[str, Any]:
    method get_entry_points (line 2076) | def get_entry_points(self) -> list[EntryPointSpec]:
    method is_running (line 2089) | def is_running(self) -> bool:
    method info (line 2095) | def info(self) -> AgentInfo:
    method validate (line 2155) | def validate(self) -> ValidationResult:
    method can_handle (line 2234) | async def can_handle(
    method _keyword_capability_check (line 2329) | def _keyword_capability_check(self, request: dict) -> "CapabilityRespo...
    method receive_message (line 2366) | async def receive_message(self, message: "AgentMessage") -> "AgentMess...
    method setup_as_secondary (line 2433) | async def setup_as_secondary(
    method cleanup (line 2475) | def cleanup(self) -> None:
    method cleanup_async (line 2484) | async def cleanup_async(self) -> None:
    method __aenter__ (line 2493) | async def __aenter__(self) -> "AgentRunner":
    method __aexit__ (line 2500) | async def __aexit__(self, *args) -> None:
    method __del__ (line 2504) | def __del__(self) -> None:

FILE: core/framework/runner/tool_registry.py
  class RegisteredTool (line 28) | class RegisteredTool:
  class ToolRegistry (line 35) | class ToolRegistry:
    method __init__ (line 54) | def __init__(self):
    method register (line 68) | def register(
    method register_function (line 84) | def register_function(
    method discover_from_module (line 143) | def discover_from_module(self, module_path: Path) -> int:
    method get_tools (line 232) | def get_tools(self) -> dict[str, Tool]:
    method get_executor (line 236) | def get_executor(self) -> Callable[[ToolUse], ToolResult]:
    method get_registered_names (line 292) | def get_registered_names(self) -> list[str]:
    method has_tool (line 296) | def has_tool(self, name: str) -> bool:
    method get_server_tool_names (line 300) | def get_server_tool_names(self, server_name: str) -> set[str]:
    method set_session_context (line 304) | def set_session_context(self, **context) -> None:
    method set_execution_context (line 314) | def set_execution_context(**context) -> contextvars.Token:
    method reset_execution_context (line 327) | def reset_execution_context(token: contextvars.Token) -> None:
    method resolve_mcp_stdio_config (line 332) | def resolve_mcp_stdio_config(server_config: dict[str, Any], base_dir: ...
    method _resolve_mcp_server_config (line 342) | def _resolve_mcp_server_config(
    method load_mcp_config (line 428) | def load_mcp_config(self, config_path: Path) -> None:
    method register_mcp_server (line 482) | def register_mcp_server(
    method _convert_mcp_tool_to_framework_tool (line 609) | def _convert_mcp_tool_to_framework_tool(self, mcp_tool: Any) -> Tool:
    method build_provider_index (line 646) | def build_provider_index(self) -> None:
    method get_by_provider (line 666) | def get_by_provider(self, provider: str) -> dict[str, Tool]:
    method get_tool_names_by_provider (line 676) | def get_tool_names_by_provider(self, provider: str) -> list[str]:
    method get_all_provider_tool_names (line 683) | def get_all_provider_tool_names(self) -> list[str]:
    method _snapshot_credentials (line 696) | def _snapshot_credentials(self) -> set[str]:
    method resync_mcp_servers_if_needed (line 703) | def resync_mcp_servers_if_needed(self) -> bool:
    method cleanup (line 748) | def cleanup(self) -> None:
    method _cleanup_mcp_clients (line 752) | def _cleanup_mcp_clients(self, context: str = "") -> None:
    method __del__ (line 773) | def __del__(self):
  function tool (line 778) | def tool(

FILE: core/framework/runtime/agent_runtime.py
  class AgentRuntimeConfig (line 38) | class AgentRuntimeConfig:
  class _GraphRegistration (line 55) | class _GraphRegistration:
  class AgentRuntime (line 68) | class AgentRuntime:
    method __init__ (line 120) | def __init__(
    method skills_catalog_prompt (line 264) | def skills_catalog_prompt(self) -> str:
    method protocols_prompt (line 268) | def protocols_prompt(self) -> str:
    method register_entry_point (line 271) | def register_entry_point(self, spec: EntryPointSpec) -> None:
    method unregister_entry_point (line 295) | def unregister_entry_point(self, entry_point_id: str) -> bool:
    method start (line 316) | async def start(self) -> None:
    method stop (line 772) | async def stop(self) -> None:
    method pause_timers (line 811) | def pause_timers(self) -> None:
    method resume_timers (line 819) | def resume_timers(self) -> None:
    method _resolve_stream (line 824) | def _resolve_stream(
    method trigger (line 852) | async def trigger(
    method trigger_and_wait (line 890) | async def trigger_and_wait(
    method add_graph (line 917) | async def add_graph(
    method remove_graph (line 1235) | async def remove_graph(self, graph_id: str) -> None:
    method _teardown_graph (line 1254) | async def _teardown_graph(self, graph_id: str) -> None:
    method list_graphs (line 1276) | def list_graphs(self) -> list[str]:
    method graph_id (line 1287) | def graph_id(self) -> str:
    method active_graph_id (line 1292) | def active_graph_id(self) -> str:
    method active_graph_id (line 1297) | def active_graph_id(self, value: str) -> None:
    method get_active_graph (line 1302) | def get_active_graph(self) -> "GraphSpec":
    method user_idle_seconds (line 1312) | def user_idle_seconds(self) -> float:
    method agent_idle_seconds (line 1322) | def agent_idle_seconds(self) -> float:
    method get_graph_registration (line 1336) | def get_graph_registration(self, graph_id: str) -> _GraphRegistration ...
    method cancel_all_tasks (line 1340) | def cancel_all_tasks(self, loop: asyncio.AbstractEventLoop) -> bool:
    method cancel_all_tasks_async (line 1358) | async def cancel_all_tasks_async(self) -> bool:
    method _get_primary_session_state (line 1376) | def _get_primary_session_state(
    method inject_input (line 1470) | async def inject_input(
    method get_goal_progress (line 1512) | async def get_goal_progress(self) -> dict[str, Any]:
    method cancel_execution (line 1522) | async def cancel_execution(
    method get_entry_points (line 1546) | def get_entry_points(self, graph_id: str | None = None) -> list[EntryP...
    method get_timer_next_fire_in (line 1566) | def get_timer_next_fire_in(self, entry_point_id: str) -> float | None:
    method get_stream (line 1583) | def get_stream(self, entry_point_id: str) -> ExecutionStream | None:
    method find_awaiting_node (line 1587) | def find_awaiting_node(self) -> tuple[str | None, str | None]:
    method get_execution_result (line 1609) | def get_execution_result(
    method subscribe_to_events (line 1623) | def subscribe_to_events(
    method unsubscribe_from_events (line 1649) | def unsubscribe_from_events(self, subscription_id: str) -> bool:
    method get_stats (line 1655) | def get_stats(self) -> dict:
    method get_active_streams (line 1671) | def get_active_streams(self) -> list[dict[str, Any]]:
    method get_waiting_nodes (line 1695) | def get_waiting_nodes(self) -> list[dict[str, Any]]:
    method state_manager (line 1717) | def state_manager(self) -> SharedStateManager:
    method event_bus (line 1722) | def event_bus(self) -> EventBus:
    method outcome_aggregator (line 1727) | def outcome_aggregator(self) -> OutcomeAggregator:
    method webhook_server (line 1732) | def webhook_server(self) -> Any:
    method timers_paused (line 1737) | def timers_paused(self) -> bool:
    method is_running (line 1742) | def is_running(self) -> bool:
  function create_agent_runtime (line 1750) | def create_agent_runtime(

FILE: core/framework/runtime/core.py
  class Runtime (line 24) | class Runtime:
    method __init__ (line 58) | def __init__(self, storage_path: str | Path):
    method execution_id (line 70) | def execution_id(self) -> str:
    method start_run (line 75) | def start_run(
    method end_run (line 111) | def end_run(
    method set_node (line 139) | def set_node(self, node_id: str) -> None:
    method current_run (line 144) | def current_run(self) -> Run | None:
    method decide (line 150) | def decide(
    method record_outcome (line 226) | def record_outcome(
    method report_problem (line 274) | def report_problem(
    method decide_and_execute (line 316) | def decide_and_execute(
    method quick_decision (line 376) | def quick_decision(

FILE: core/framework/runtime/escalation_ticket.py
  class EscalationTicket (line 12) | class EscalationTicket(BaseModel):

FILE: core/framework/runtime/event_bus.py
  function _open_event_log (line 39) | def _open_event_log() -> IO[str] | None:
  class EventType (line 59) | class EventType(StrEnum):
  class AgentEvent (line 167) | class AgentEvent:
    method to_dict (line 180) | def to_dict(self) -> dict:
  class Subscription (line 202) | class Subscription:
  class EventBus (line 214) | class EventBus:
    method __init__ (line 245) | def __init__(
    method set_session_log (line 270) | def set_session_log(self, path: Path, *, iteration_offset: int = 0) ->...
    method close_session_log (line 291) | def close_session_log(self) -> None:
    method _write_session_log_event (line 312) | def _write_session_log_event(self, event: AgentEvent) -> None:
    method _flush_pending_snapshots (line 350) | def _flush_pending_snapshots(
    method subscribe (line 386) | def subscribe(
    method unsubscribe (line 427) | def unsubscribe(self, subscription_id: str) -> bool:
    method publish (line 443) | async def publish(self, event: AgentEvent) -> None:
    method _matches (line 503) | def _matches(self, subscription: Subscription, event: AgentEvent) -> b...
    method _execute_handlers (line 527) | async def _execute_handlers(
    method emit_execution_started (line 546) | async def emit_execution_started(
    method emit_execution_completed (line 566) | async def emit_execution_completed(
    method emit_execution_failed (line 586) | async def emit_execution_failed(
    method emit_goal_progress (line 606) | async def emit_goal_progress(
    method emit_constraint_violation (line 624) | async def emit_constraint_violation(
    method emit_state_changed (line 644) | async def emit_state_changed(
    method emit_node_loop_started (line 670) | async def emit_node_loop_started(
    method emit_node_loop_iteration (line 688) | async def emit_node_loop_iteration(
    method emit_node_loop_completed (line 710) | async def emit_node_loop_completed(
    method emit_node_action_plan (line 728) | async def emit_node_action_plan(
    method emit_llm_text_delta (line 748) | async def emit_llm_text_delta(
    method emit_llm_reasoning_delta (line 768) | async def emit_llm_reasoning_delta(
    method emit_llm_turn_complete (line 786) | async def emit_llm_turn_complete(
    method emit_tool_call_started (line 820) | async def emit_tool_call_started(
    method emit_tool_call_completed (line 844) | async def emit_tool_call_completed(
    method emit_client_output_delta (line 872) | async def emit_client_output_delta(
    method emit_client_input_requested (line 896) | async def emit_client_input_requested(
    method emit_node_internal_output (line 932) | async def emit_node_internal_output(
    method emit_node_stalled (line 950) | async def emit_node_stalled(
    method emit_tool_doom_loop (line 968) | async def emit_tool_doom_loop(
    method emit_node_input_blocked (line 986) | async def emit_node_input_blocked(
    method emit_judge_verdict (line 1006) | async def emit_judge_verdict(
    method emit_output_key_set (line 1032) | async def emit_output_key_set(
    method emit_node_retry (line 1050) | async def emit_node_retry(
    method emit_edge_traversed (line 1074) | async def emit_edge_traversed(
    method emit_execution_paused (line 1097) | async def emit_execution_paused(
    method emit_execution_resumed (line 1115) | async def emit_execution_resumed(
    method emit_webhook_received (line 1132) | async def emit_webhook_received(
    method emit_escalation_requested (line 1156) | async def emit_escalation_requested(
    method emit_worker_escalation_ticket (line 1175) | async def emit_worker_escalation_ticket(
    method emit_queen_intervention_requested (line 1193) | async def emit_queen_intervention_requested(
    method emit_subagent_report (line 1221) | async def emit_subagent_report(
    method get_history (line 1247) | def get_history(
    method get_stats (line 1278) | def get_stats(self) -> dict:
    method wait_for (line 1292) | async def wait_for(

FILE: core/framework/runtime/execution_stream.py
  class ExecutionAlreadyRunningError (line 37) | class ExecutionAlreadyRunningError(RuntimeError):
    method __init__ (line 40) | def __init__(self, stream_id: str, active_ids: list[str]):
  class GraphScopedEventBus (line 52) | class GraphScopedEventBus(EventBus):
    method __init__ (line 68) | def __init__(self, bus: "EventBus", graph_id: str) -> None:
    method publish (line 75) | async def publish(self, event: "AgentEvent") -> None:  # type: ignore[...
    method subscribe (line 84) | def subscribe(self, *args: Any, **kwargs: Any) -> str:
    method unsubscribe (line 87) | def unsubscribe(self, subscription_id: str) -> bool:
    method get_history (line 90) | def get_history(self, *args: Any, **kwargs: Any) -> list:
    method get_stats (line 93) | def get_stats(self) -> dict:
    method wait_for (line 96) | async def wait_for(self, *args: Any, **kwargs: Any) -> Any:
  class EntryPointSpec (line 101) | class EntryPointSpec:
    method get_isolation_level (line 114) | def get_isolation_level(self) -> IsolationLevel:
  class ExecutionContext (line 120) | class ExecutionContext:
  class ExecutionStream (line 136) | class ExecutionStream:
    method __init__ (line 167) | def __init__(
    method start (line 286) | async def start(self) -> None:
    method active_execution_ids (line 307) | def active_execution_ids(self) -> list[str]:
    method agent_idle_seconds (line 312) | def agent_idle_seconds(self) -> float:
    method is_awaiting_input (line 327) | def is_awaiting_input(self) -> bool:
    method get_waiting_nodes (line 337) | def get_waiting_nodes(self) -> list[dict[str, str]]:
    method get_injectable_nodes (line 349) | def get_injectable_nodes(self) -> list[dict[str, str]]:
    method _record_execution_result (line 369) | def _record_execution_result(self, execution_id: str, result: Executio...
    method _prune_execution_results (line 376) | def _prune_execution_results(self) -> None:
    method stop (line 390) | async def stop(self) -> None:
    method inject_input (line 430) | async def inject_input(
    method inject_trigger (line 451) | async def inject_trigger(
    method execute (line 475) | async def execute(
    method _is_fatal_error (line 590) | def _is_fatal_error(cls, error: str | None) -> bool:
    method _run_execution (line 597) | async def _run_execution(self, ctx: ExecutionContext) -> None:
    method _write_run_event (line 949) | def _write_run_event(
    method _write_session_state (line 979) | async def _write_session_state(
    method _create_modified_graph (line 1082) | def _create_modified_graph(self) -> "GraphSpec":
    method wait_for_completion (line 1124) | async def wait_for_completion(
    method get_result (line 1157) | def get_result(self, execution_id: str) -> ExecutionResult | None:
    method get_context (line 1162) | def get_context(self, execution_id: str) -> ExecutionContext | None:
    method cancel_execution (line 1166) | async def cancel_execution(self, execution_id: str, *, reason: str | N...
    method get_active_count (line 1195) | def get_active_count(self) -> int:
    method get_stats (line 1199) | def get_stats(self) -> dict:

FILE: core/framework/runtime/llm_debug_logger.py
  function _open_log (line 24) | def _open_log() -> IO[str] | None:
  function log_llm_turn (line 33) | def log_llm_turn(

FILE: core/framework/runtime/outcome_aggregator.py
  class CriterionStatus (line 24) | class CriterionStatus:
  class ConstraintCheck (line 36) | class ConstraintCheck:
  class DecisionRecord (line 49) | class DecisionRecord:
  class OutcomeAggregator (line 59) | class OutcomeAggregator:
    method __init__ (line 81) | def __init__(
    method _initialize_criteria (line 113) | def _initialize_criteria(self) -> None:
    method record_decision (line 125) | def record_decision(
    method record_outcome (line 153) | def record_outcome(
    method record_constraint_violation (line 182) | def record_constraint_violation(
    method evaluate_goal_progress (line 225) | async def evaluate_goal_progress(self) -> dict[str, Any]:
    method _evaluate_criterion (line 313) | async def _evaluate_criterion(self, criterion: Any) -> CriterionStatus:
    method _is_related_to_criterion (line 376) | def _is_related_to_criterion(self, decision: Decision, criterion: Any)...
    method _get_recommendation (line 385) | def _get_recommendation(self, result: dict) -> str:
    method _is_hard_constraint (line 404) | def _is_hard_constraint(self, constraint_id: str) -> bool:
    method get_decisions_by_stream (line 413) | def get_decisions_by_stream(self, stream_id: str) -> list[DecisionReco...
    method get_decisions_by_execution (line 417) | def get_decisions_by_execution(
    method get_recent_decisions (line 429) | def get_recent_decisions(self, limit: int = 10) -> list[DecisionRecord]:
    method get_criterion_status (line 433) | def get_criterion_status(self, criterion_id: str) -> CriterionStatus |...
    method get_stats (line 437) | def get_stats(self) -> dict:
    method reset (line 450) | def reset(self) -> None:

FILE: core/framework/runtime/runtime_log_schemas.py
  class ToolCallLog (line 19) | class ToolCallLog(BaseModel):
  class NodeStepLog (line 31) | class NodeStepLog(BaseModel):
  class NodeDetail (line 68) | class NodeDetail(BaseModel):
  class RunSummaryLog (line 104) | class RunSummaryLog(BaseModel):
  class RunDetailsLog (line 133) | class RunDetailsLog(BaseModel):
  class RunToolLogs (line 140) | class RunToolLogs(BaseModel):

FILE: core/framework/runtime/runtime_log_store.py
  class RuntimeLogStore (line 43) | class RuntimeLogStore:
    method __init__ (line 46) | def __init__(self, base_path: Path) -> None:
    method _session_logs_dir (line 50) | def _session_logs_dir(self, run_id: str) -> Path:
    method _legacy_run_dir (line 56) | def _legacy_run_dir(self, run_id: str) -> Path:
    method _get_run_dir (line 60) | def _get_run_dir(self, run_id: str) -> Path:
    method ensure_run_dir (line 83) | def ensure_run_dir(self, run_id: str) -> None:
    method ensure_session_run_dir (line 88) | def ensure_session_run_dir(self, run_id: str) -> None:
    method append_step (line 92) | def append_step(self, run_id: str, step: NodeStepLog) -> None:
    method append_node_detail (line 99) | def append_node_detail(self, run_id: str, detail: NodeDetail) -> None:
    method read_node_details_sync (line 106) | def read_node_details_sync(self, run_id: str) -> list[NodeDetail]:
    method save_summary (line 118) | async def save_summary(self, run_id: str, summary: RunSummaryLog) -> N...
    method load_summary (line 128) | async def load_summary(self, run_id: str) -> RunSummaryLog | None:
    method load_details (line 133) | async def load_details(self, run_id: str) -> RunDetailsLog | None:
    method load_tool_logs (line 145) | async def load_tool_logs(self, run_id: str) -> RunToolLogs | None:
    method list_runs (line 157) | async def list_runs(
    method _scan_run_dirs (line 203) | def _scan_run_dirs(self) -> list[str]:
    method _write_json (line 246) | async def _write_json(path: Path, data: dict) -> None:
    method _read_json (line 258) | async def _read_json(path: Path) -> dict | None:
  function _read_jsonl_as_models (line 278) | def _read_jsonl_as_models(path: Path, model_cls: type) -> list:
  function _infer_started_at (line 303) | def _infer_started_at(run_id: str) -> str:

FILE: core/framework/runtime/runtime_logger.py
  class RuntimeLogger (line 41) | class RuntimeLogger:
    method __init__ (line 47) | def __init__(self, store: RuntimeLogStore, agent_id: str = "") -> None:
    method start_run (line 56) | def start_run(self, goal_id: str = "", session_id: str = "") -> str:
    method log_step (line 81) | def log_step(
    method log_node_complete (line 151) | def log_node_complete(
    method ensure_node_logged (line 237) | def ensure_node_logged(
    method end_run (line 270) | async def end_run(

FILE: core/framework/runtime/shared_state.py
  class IsolationLevel (line 20) | class IsolationLevel(StrEnum):
  class StateScope (line 28) | class StateScope(StrEnum):
  class StateChange (line 37) | class StateChange:
  class SharedStateManager (line 49) | class SharedStateManager:
    method __init__ (line 78) | def __init__(self):
    method create_memory (line 96) | def create_memory(
    method cleanup_execution (line 129) | def cleanup_execution(self, execution_id: str) -> None:
    method cleanup_stream (line 139) | def cleanup_stream(self, stream_id: str) -> None:
    method read (line 152) | async def read(
    method write (line 184) | async def write(
    method _write_direct (line 229) | async def _write_direct(
    method _write_with_lock (line 253) | async def _write_with_lock(
    method _get_lock (line 266) | def _get_lock(self, scope: StateScope, key: str, stream_id: str) -> as...
    method _record_change (line 280) | def _record_change(self, change: StateChange) -> None:
    method read_all (line 290) | async def read_all(
    method write_batch (line 317) | async def write_batch(
    method get_stats (line 331) | def get_stats(self) -> dict:
    method get_recent_changes (line 341) | def get_recent_changes(self, limit: int = 10) -> list[StateChange]:
  class StreamMemory (line 346) | class StreamMemory:
    method __init__ (line 354) | def __init__(
    method with_permissions (line 370) | def with_permissions(
    method read (line 390) | async def read(self, key: str) -> Any:
    method write (line 403) | async def write(
    method read_all (line 423) | async def read_all(self) -> dict[str, Any]:
    method read_sync (line 439) | def read_sync(self, key: str) -> Any:
    method write_sync (line 466) | def write_sync(self, key: str, value: Any) -> None:
    method read_all_sync (line 481) | def read_all_sync(self) -> dict[str, Any]:

FILE: core/framework/runtime/stream_runtime.py
  class StreamRuntime (line 26) | class StreamRuntime:
    method __init__ (line 74) | def __init__(
    method start_run (line 102) | def start_run(
    method end_run (line 150) | def end_run(
    method _save_run (line 180) | async def _save_run(self, execution_id: str, run: Run) -> None:
    method set_node (line 192) | def set_node(self, execution_id: str, node_id: str) -> None:
    method get_run (line 196) | def get_run(self, execution_id: str) -> Run | None:
    method decide (line 202) | def decide(
    method record_outcome (line 281) | def record_outcome(
    method report_problem (line 335) | def report_problem(
    method quick_decision (line 376) | def quick_decision(
    method get_active_executions (line 413) | def get_active_executions(self) -> list[str]:
    method get_stats (line 417) | def get_stats(self) -> dict:
  class StreamRuntimeAdapter (line 426) | class StreamRuntimeAdapter:
    method __init__ (line 434) | def __init__(self, stream_runtime: StreamRuntime, execution_id: str):
    method storage (line 448) | def storage(self):
    method execution_id (line 452) | def execution_id(self) -> str:
    method current_run (line 456) | def current_run(self) -> Run | None:
    method start_run (line 459) | def start_run(
    method end_run (line 472) | def end_run(
    method set_node (line 485) | def set_node(self, node_id: str) -> None:
    method decide (line 489) | def decide(
    method record_outcome (line 512) | def record_outcome(
    method report_problem (line 535) | def report_problem(
    method quick_decision (line 552) | def quick_decision(

FILE: core/framework/runtime/tests/test_agent_runtime.py
  function sample_goal (line 33) | def sample_goal():
  function sample_graph (line 60) | def sample_graph():
  function temp_storage (line 118) | def temp_storage():
  class TestSharedStateManager (line 127) | class TestSharedStateManager:
    method test_create_memory (line 130) | def test_create_memory(self):
    method test_isolated_state (line 143) | async def test_isolated_state(self):
    method test_shared_state (line 157) | async def test_shared_state(self):
    method test_cleanup_execution (line 181) | def test_cleanup_execution(self):
  class TestEventBus (line 196) | class TestEventBus:
    method test_publish_subscribe (line 200) | async def test_publish_subscribe(self):
    method test_stream_filter (line 230) | async def test_stream_filter(self):
    method test_unsubscribe (line 265) | def test_unsubscribe(self):
    method test_wait_for (line 285) | async def test_wait_for(self):
  class TestOutcomeAggregator (line 318) | class TestOutcomeAggregator:
    method test_record_decision (line 321) | def test_record_decision(self, sample_goal):
    method test_evaluate_goal_progress (line 343) | async def test_evaluate_goal_progress(self, sample_goal):
    method test_record_constraint_violation (line 354) | def test_record_constraint_violation(self, sample_goal):
  class TestAgentRuntime (line 373) | class TestAgentRuntime:
    method test_register_entry_point (line 376) | def test_register_entry_point(self, sample_graph, sample_goal, temp_st...
    method test_register_duplicate_entry_point_fails (line 396) | def test_register_duplicate_entry_point_fails(self, sample_graph, samp...
    method test_register_invalid_entry_node_fails (line 416) | def test_register_invalid_entry_node_fails(self, sample_graph, sample_...
    method test_start_stop_lifecycle (line 435) | async def test_start_stop_lifecycle(self, sample_graph, sample_goal, t...
    method test_trigger_requires_running (line 465) | async def test_trigger_requires_running(self, sample_graph, sample_goa...
  class TestCreateAgentRuntime (line 492) | class TestCreateAgentRuntime:
    method test_create_with_entry_points (line 495) | def test_create_with_entry_points(self, sample_graph, sample_goal, tem...
  class TestTimerEntryPoints (line 527) | class TestTimerEntryPoints:
    method test_interval_timer_starts_task (line 531) | async def test_interval_timer_starts_task(self, sample_graph, sample_g...
    method test_cron_timer_starts_task (line 561) | async def test_cron_timer_starts_task(self, sample_graph, sample_goal,...
    method test_invalid_cron_expression_skipped (line 589) | async def test_invalid_cron_expression_skipped(
    method test_cron_takes_priority_over_interval (line 616) | async def test_cron_takes_priority_over_interval(
    method test_no_interval_or_cron_warns (line 647) | async def test_no_interval_or_cron_warns(self, sample_graph, sample_go...
    method test_cron_immediate_fires_first (line 672) | async def test_cron_immediate_fires_first(self, sample_graph, sample_g...
  class TestCancelAllTasks (line 707) | class TestCancelAllTasks:
    method test_cancel_all_tasks_async_returns_false_when_no_tasks (line 711) | async def test_cancel_all_tasks_async_returns_false_when_no_tasks(
    method test_cancel_all_tasks_async_cancels_running_task (line 737) | async def test_cancel_all_tasks_async_cancels_running_task(
    method test_cancel_all_tasks_async_cancels_multiple_tasks_across_streams (line 782) | async def test_cancel_all_tasks_async_cancels_multiple_tasks_across_st...

FILE: core/framework/runtime/tests/test_runtime_logging_paths.py
  function test_graph_executor_uses_custom_session_dir_name_for_runtime_logs (line 11) | def test_graph_executor_uses_custom_session_dir_name_for_runtime_logs():
  function test_runtime_logger_creates_session_log_dir_for_custom_session_id (line 20) | def test_runtime_logger_creates_session_log_dir_for_custom_session_id(tm...

FILE: core/framework/runtime/tests/test_webhook_server.py
  function _make_server (line 26) | def _make_server(event_bus: EventBus, routes: list[WebhookRoute] | None ...
  function _base_url (line 35) | def _base_url(server: WebhookServer) -> str:
  class TestWebhookServerLifecycle (line 40) | class TestWebhookServerLifecycle:
    method test_start_stop (line 44) | async def test_start_stop(self):
    method test_no_routes_skips_start (line 62) | async def test_no_routes_skips_start(self):
    method test_stop_when_not_started (line 70) | async def test_stop_when_not_started(self):
  class TestWebhookEventPublishing (line 79) | class TestWebhookEventPublishing:
    method test_post_publishes_webhook_received (line 83) | async def test_post_publishes_webhook_received(self):
    method test_query_params_included (line 126) | async def test_query_params_included(self):
    method test_non_json_body (line 159) | async def test_non_json_body(self):
    method test_empty_body (line 193) | async def test_empty_body(self):
    method test_multiple_routes (line 223) | async def test_multiple_routes(self):
    method test_filter_stream_subscription (line 262) | async def test_filter_stream_subscription(self):
  class TestHMACVerification (line 301) | class TestHMACVerification:
    method test_valid_signature_accepted (line 305) | async def test_valid_signature_accepted(self):
    method test_invalid_signature_rejected (line 349) | async def test_invalid_signature_rejected(self):
    method test_missing_signature_rejected (line 386) | async def test_missing_signature_rejected(self):
    method test_no_secret_skips_verification (line 423) | async def test_no_secret_skips_verification(self):
  class TestEventDrivenEntryPoints (line 460) | class TestEventDrivenEntryPoints:
    method _make_graph_and_goal (line 463) | def _make_graph_and_goal(self):
    method test_event_entry_point_subscribes_to_bus (line 508) | async def test_event_entry_point_subscribes_to_bus(self):
    method test_event_entry_point_filter_stream (line 579) | async def test_event_entry_point_filter_stream(self):
    method test_no_webhook_routes_skips_server (line 642) | async def test_no_webhook_routes_skips_server(self):
    method test_event_entry_point_custom_event (line 669) | async def test_event_entry_point_custom_event(self):

FILE: core/framework/runtime/triggers.py
  class TriggerDefinition (line 10) | class TriggerDefinition:

FILE: core/framework/runtime/webhook_server.py
  class WebhookRoute (line 22) | class WebhookRoute:
  class WebhookServerConfig (line 32) | class WebhookServerConfig:
  class WebhookServer (line 39) | class WebhookServer:
    method __init__ (line 55) | def __init__(
    method add_route (line 67) | def add_route(self, route: WebhookRoute) -> None:
    method start (line 71) | async def start(self) -> None:
    method stop (line 96) | async def stop(self) -> None:
    method _handle_request (line 105) | async def _handle_request(self, request: web.Request) -> web.Response:
    method _verify_signature (line 145) | def _verify_signature(
    method is_running (line 166) | def is_running(self) -> bool:
    method port (line 171) | def port(self) -> int | None:

FILE: core/framework/schemas/checkpoint.py
  class Checkpoint (line 14) | class Checkpoint(BaseModel):
    method create (line 49) | def create(
  class CheckpointSummary (line 102) | class CheckpointSummary(BaseModel):
    method from_checkpoint (line 121) | def from_checkpoint(cls, checkpoint: Checkpoint) -> "CheckpointSummary":
  class CheckpointIndex (line 134) | class CheckpointIndex(BaseModel):
    method add_checkpoint (line 149) | def add_checkpoint(self, checkpoint: Checkpoint) -> None:
    method get_checkpoint_summary (line 156) | def get_checkpoint_summary(self, checkpoint_id: str) -> CheckpointSumm...
    method filter_by_type (line 163) | def filter_by_type(self, checkpoint_type: str) -> list[CheckpointSumma...
    method filter_by_node (line 167) | def filter_by_node(self, node_id: str) -> list[CheckpointSummary]:
    method get_clean_checkpoints (line 171) | def get_clean_checkpoints(self) -> list[CheckpointSummary]:
    method get_latest_clean_checkpoint (line 175) | def get_latest_clean_checkpoint(self) -> CheckpointSummary | None:

FILE: core/framework/schemas/decision.py
  class DecisionType (line 19) | class DecisionType(StrEnum):
  class Option (line 32) | class Option(BaseModel):
  class Outcome (line 55) | class Outcome(BaseModel):
  class DecisionEvaluation (line 80) | class DecisionEvaluation(BaseModel):
  class Decision (line 109) | class Decision(BaseModel):
    method chosen_option (line 152) | def chosen_option(self) -> Option | None:
    method was_successful (line 161) | def was_successful(self) -> bool:
    method was_good_decision (line 167) | def was_good_decision(self) -> bool:
    method summary_for_builder (line 173) | def summary_for_builder(self) -> str:

FILE: core/framework/schemas/run.py
  class RunStatus (line 17) | class RunStatus(StrEnum):
  class Problem (line 27) | class Problem(BaseModel):
  class RunMetrics (line 45) | class RunMetrics(BaseModel):
    method success_rate (line 60) | def success_rate(self) -> float:
  class Run (line 68) | class Run(BaseModel):
    method duration_ms (line 104) | def duration_ms(self) -> int:
    method add_decision (line 111) | def add_decision(self, decision: Decision) -> None:
    method record_outcome (line 120) | def record_outcome(self, decision_id: str, outcome: Outcome) -> None:
    method add_problem (line 133) | def add_problem(
    method complete (line 154) | def complete(self, status: RunStatus, narrative: str = "") -> None:
    method _generate_narrative (line 160) | def _generate_narrative(self) -> str:
  class RunSummary (line 192) | class RunSummary(BaseModel):
    method from_run (line 225) | def from_run(cls, run: Run) -> "RunSummary":

FILE: core/framework/schemas/session_state.py
  class SessionStatus (line 19) | class SessionStatus(StrEnum):
  class SessionTimestamps (line 29) | class SessionTimestamps(BaseModel):
  class SessionProgress (line 40) | class SessionProgress(BaseModel):
  class SessionResult (line 62) | class SessionResult(BaseModel):
  class SessionMetrics (line 72) | class SessionMetrics(BaseModel):
  class SessionState (line 85) | class SessionState(BaseModel):
    method duration_ms (line 158) | def duration_ms(self) -> int:
    method is_resumable (line 168) | def is_resumable(self) -> bool:
    method is_resumable_from_checkpoint (line 179) | def is_resumable_from_checkpoint(self) -> bool:
    method from_execution_result (line 186) | def from_execution_result(
    method from_legacy_run (line 251) | def from_legacy_run(cls, run: "Run", session_id: str, stream_id: str =...
    method to_session_state_dict (line 295) | def to_session_state_dict(self) -> dict[str, Any]:

FILE: core/framework/server/app.py
  function _get_allowed_agent_roots (line 22) | def _get_allowed_agent_roots() -> tuple[Path, ...]:
  function validate_agent_path (line 39) | def validate_agent_path(agent_path: str | Path) -> Path:
  function safe_path_segment (line 60) | def safe_path_segment(value: str) -> str:
  function resolve_session (line 72) | def resolve_session(request: web.Request):
  function sessions_dir (line 85) | def sessions_dir(session: Session) -> Path:
  function cold_sessions_dir (line 97) | def cold_sessions_dir(session_id: str) -> Path | None:
  function _is_cors_allowed (line 124) | def _is_cors_allowed(origin: str) -> bool:
  function cors_middleware (line 135) | async def cors_middleware(request: web.Request, handler):
  function error_middleware (line 158) | async def error_middleware(request: web.Request, handler):
  function _on_shutdown (line 172) | async def _on_shutdown(app: web.Application) -> None:
  function handle_health (line 178) | async def handle_health(request: web.Request) -> web.Response:
  function create_app (line 191) | def create_app(model: str | None = None) -> web.Application:
  function _setup_static_serving (line 259) | def _setup_static_serving(app: web.Application) -> None:

FILE: core/framework/server/queen_orchestrator.py
  function create_queen (line 20) | async def create_queen(

FILE: core/framework/server/routes_credentials.py
  function _get_store (line 16) | def _get_store(request: web.Request) -> CredentialStore:
  function _credential_to_dict (line 20) | def _credential_to_dict(cred: CredentialObject) -> dict:
  function handle_list_credentials (line 31) | async def handle_list_credentials(request: web.Request) -> web.Response:
  function handle_get_credential (line 43) | async def handle_get_credential(request: web.Request) -> web.Response:
  function handle_save_credential (line 53) | async def handle_save_credential(request: web.Request) -> web.Response:
  function handle_delete_credential (line 99) | async def handle_delete_credential(request: web.Request) -> web.Response:
  function handle_check_agent (line 118) | async def handle_check_agent(request: web.Request) -> web.Response:
  function _status_to_dict (line 189) | def _status_to_dict(c) -> dict:
  function register_routes (line 209) | def register_routes(app: web.Application) -> None:

FILE: core/framework/server/routes_events.py
  function _parse_event_types (line 58) | def _parse_event_types(query_param: str | None) -> list[EventType]:
  function handle_events (line 77) | async def handle_events(request: web.Request) -> web.StreamResponse:
  function register_routes (line 271) | def register_routes(app: web.Application) -> None:

FILE: core/framework/server/routes_execution.py
  function handle_trigger (line 17) | async def handle_trigger(request: web.Request) -> web.Response:
  function handle_inject (line 81) | async def handle_inject(request: web.Request) -> web.Response:
  function handle_chat (line 105) | async def handle_chat(request: web.Request) -> web.Response:
  function handle_queen_context (line 162) | async def handle_queen_context(request: web.Request) -> web.Response:
  function handle_worker_input (line 205) | async def handle_worker_input(request: web.Request) -> web.Response:
  function handle_goal_progress (line 245) | async def handle_goal_progress(request: web.Request) -> web.Response:
  function handle_resume (line 258) | async def handle_resume(request: web.Request) -> web.Response:
  function handle_pause (line 330) | async def handle_pause(request: web.Request) -> web.Response:
  function handle_stop (line 384) | async def handle_stop(request: web.Request) -> web.Response:
  function handle_replay (line 439) | async def handle_replay(request: web.Request) -> web.Response:
  function handle_cancel_queen (line 491) | async def handle_cancel_queen(request: web.Request) -> web.Response:
  function register_routes (line 506) | def register_routes(app: web.Application) -> None:

FILE: core/framework/server/routes_graphs.py
  function _get_graph_registration (line 14) | def _get_graph_registration(session, graph_id: str):
  function _get_graph_spec (line 24) | def _get_graph_spec(session, graph_id: str):
  function _node_to_dict (line 32) | def _node_to_dict(node) -> dict:
  function handle_list_nodes (line 53) | async def handle_list_nodes(request: web.Request) -> web.Response:
  function handle_get_node (line 144) | async def handle_get_node(request: web.Request) -> web.Response:
  function handle_node_criteria (line 172) | async def handle_node_criteria(request: web.Request) -> web.Response:
  function handle_node_tools (line 215) | async def handle_node_tools(request: web.Request) -> web.Response:
  function handle_draft_graph (line 252) | async def handle_draft_graph(request: web.Request) -> web.Response:
  function handle_flowchart_map (line 265) | async def handle_flowchart_map(request: web.Request) -> web.Response:
  function register_routes (line 313) | def register_routes(app: web.Application) -> None:

FILE: core/framework/server/routes_logs.py
  function handle_logs (line 13) | async def handle_logs(request: web.Request) -> web.Response:
  function handle_node_logs (line 72) | async def handle_node_logs(request: web.Request) -> web.Response:
  function register_routes (line 107) | def register_routes(app: web.Application) -> None:

FILE: core/framework/server/routes_sessions.py
  function _get_manager (line 48) | def _get_manager(request: web.Request) -> SessionManager:
  function _session_to_live_dict (line 52) | def _session_to_live_dict(session) -> dict:
  function _credential_error_response (line 74) | def _credential_error_response(exc: Exception, agent_path: str | None) -...
  function handle_create_session (line 111) | async def handle_create_session(request: web.Request) -> web.Response:
  function handle_list_live_sessions (line 186) | async def handle_list_live_sessions(request: web.Request) -> web.Response:
  function handle_get_live_session (line 193) | async def handle_get_live_session(request: web.Request) -> web.Response:
  function handle_stop_session (line 259) | async def handle_stop_session(request: web.Request) -> web.Response:
  function handle_load_worker (line 279) | async def handle_load_worker(request: web.Request) -> web.Response:
  function handle_unload_worker (line 321) | async def handle_unload_worker(request: web.Request) -> web.Response:
  function handle_session_stats (line 347) | async def handle_session_stats(request: web.Request) -> web.Response:
  function handle_session_entry_points (line 363) | async def handle_session_entry_points(request: web.Request) -> web.Respo...
  function handle_update_trigger_task (line 411) | async def handle_update_trigger_task(request: web.Request) -> web.Response:
  function handle_session_graphs (line 565) | async def handle_session_graphs(request: web.Request) -> web.Response:
  function handle_list_worker_sessions (line 586) | async def handle_list_worker_sessions(request: web.Request) -> web.Respo...
  function handle_get_worker_session (line 635) | async def handle_get_worker_session(request: web.Request) -> web.Response:
  function handle_list_checkpoints (line 660) | async def handle_list_checkpoints(request: web.Request) -> web.Response:
  function handle_delete_worker_session (line 697) | async def handle_delete_worker_session(request: web.Request) -> web.Resp...
  function handle_restore_checkpoint (line 717) | async def handle_restore_checkpoint(request: web.Request) -> web.Response:
  function handle_messages (line 758) | async def handle_messages(request: web.Request) -> web.Response:
  function handle_session_events_history (line 864) | async def handle_session_events_history(request: web.Request) -> web.Res...
  function handle_session_history (line 896) | async def handle_session_history(request: web.Request) -> web.Response:
  function handle_delete_history_session (line 921) | async def handle_delete_history_session(request: web.Request) -> web.Res...
  function handle_discover (line 952) | async def handle_discover(request: web.Request) -> web.Response:
  function register_routes (line 986) | def register_routes(app: web.Application) -> None:

FILE: core/framework/server/session_manager.py
  class Session (line 28) | class Session:
  class SessionManager (line 72) | class SessionManager:
    method __init__ (line 79) | def __init__(self, model: str | None = None, credential_store=None) ->...
    method _create_session_core (line 90) | async def _create_session_core(
    method create_session (line 141) | async def create_session(
    method create_session_with_worker (line 169) | async def create_session_with_worker(
    method _load_worker_core (line 269) | async def _load_worker_core(
    method _cleanup_stale_active_sessions (line 404) | def _cleanup_stale_active_sessions(self, agent_path: Path) -> None:
    method _is_pid_alive (line 465) | def _is_pid_alive(pid: int) -> bool:
    method _restore_active_triggers (line 492) | async def _restore_active_triggers(self, session: "Session", session_i...
    method load_worker (line 537) | async def load_worker(
    method unload_worker (line 592) | async def unload_worker(self, session_id: str) -> bool:
    method stop_session (line 651) | async def stop_session(self, session_id: str) -> bool:
    method _handle_worker_handoff (line 737) | async def _handle_worker_handoff(self, session: Session, executor: Any...
    method _subscribe_worker_digest (line 762) | def _subscribe_worker_digest(self, session: Session) -> None:
    method _subscribe_worker_handoffs (line 891) | def _subscribe_worker_handoffs(self, session: Session, executor: Any) ...
    method _start_queen (line 907) | async def _start_queen(
    method _notify_queen_worker_loaded (line 1074) | async def _notify_queen_worker_loaded(self, session: Session) -> None:
    method _emit_worker_loaded (line 1103) | async def _emit_worker_loaded(self, session: Session) -> None:
    method _emit_flowchart_on_restore (line 1122) | async def _emit_flowchart_on_restore(self, session: Session, agent_pat...
    method _notify_queen_worker_unloaded (line 1145) | async def _notify_queen_worker_unloaded(self, session: Session) -> None:
    method _emit_trigger_events (line 1160) | async def _emit_trigger_events(
    method revive_queen (line 1191) | async def revive_queen(self, session: Session, initial_prompt: str | N...
    method get_session (line 1216) | def get_session(self, session_id: str) -> Session | None:
    method get_session_by_worker_id (line 1219) | def get_session_by_worker_id(self, worker_id: str) -> Session | None:
    method get_session_for_agent (line 1226) | def get_session_for_agent(self, agent_id: str) -> Session | None:
    method is_loading (line 1236) | def is_loading(self, session_id: str) -> bool:
    method list_sessions (line 1239) | def list_sessions(self) -> list[Session]:
    method get_cold_session_info (line 1247) | def get_cold_session_info(session_id: str) -> dict | None:
    method list_cold_sessions (line 1307) | def list_cold_sessions() -> list[dict]:
    method shutdown_all (line 1414) | async def shutdown_all(self) -> None:

FILE: core/framework/server/sse.py
  class SSEResponse (line 11) | class SSEResponse:
    method __init__ (line 21) | def __init__(self) -> None:
    method prepare (line 24) | async def prepare(self, request: web.Request) -> web.StreamResponse:
    method send_event (line 38) | async def send_event(
    method send_keepalive (line 65) | async def send_keepalive(self) -> None:
    method response (line 72) | def response(self) -> web.StreamResponse | None:

FILE: core/framework/server/tests/test_api.py
  class MockNodeSpec (line 30) | class MockNodeSpec:
  class MockEdgeSpec (line 49) | class MockEdgeSpec:
  class MockGraphSpec (line 58) | class MockGraphSpec:
    method get_node (line 63) | def get_node(self, node_id: str):
  class MockEntryPoint (line 71) | class MockEntryPoint:
  class MockStream (line 80) | class MockStream:
    method cancel_execution (line 86) | async def cancel_execution(self, execution_id: str) -> bool:
  class MockGraphRegistration (line 91) | class MockGraphRegistration:
  class MockRuntime (line 97) | class MockRuntime:
    method __init__ (line 100) | def __init__(self, graph=None, entry_points=None, log_store=None):
    method list_graphs (line 111) | def list_graphs(self):
    method get_graph_registration (line 114) | def get_graph_registration(self, graph_id):
    method get_entry_points (line 119) | def get_entry_points(self):
    method trigger (line 122) | async def trigger(self, ep_id, input_data=None, session_state=None):
    method inject_input (line 125) | async def inject_input(self, node_id, content, graph_id=None, *, is_cl...
    method pause_timers (line 128) | def pause_timers(self):
    method get_goal_progress (line 131) | async def get_goal_progress(self):
    method find_awaiting_node (line 134) | def find_awaiting_node(self):
    method get_stats (line 137) | def get_stats(self):
    method get_timer_next_fire_in (line 140) | def get_timer_next_fire_in(self, ep_id):
  class MockAgentInfo (line 144) | class MockAgentInfo:
  function _make_queen_executor (line 151) | def _make_queen_executor():
  function _make_session (line 160) | def _make_session(
  function tmp_agent_dir (line 202) | def tmp_agent_dir(tmp_path, monkeypatch):
  function _write_sample_session (line 216) | def _write_sample_session(base: Path, session_id: str):
  function sample_session (line 299) | def sample_session(tmp_agent_dir):
  function custom_id_session (line 306) | def custom_id_session(tmp_agent_dir):
  function _make_app_with_session (line 312) | def _make_app_with_session(session):
  function nodes_and_edges (line 321) | def nodes_and_edges():
  class TestHealth (line 353) | class TestHealth:
    method test_health (line 355) | async def test_health(self):
  class TestSessionCRUD (line 366) | class TestSessionCRUD:
    method test_create_session_with_worker_forwards_session_id (line 368) | async def test_create_session_with_worker_forwards_session_id(self):
    method test_list_sessions_empty (line 397) | async def test_list_sessions_empty(self):
    method test_list_sessions_with_loaded (line 406) | async def test_list_sessions_with_loaded(self):
    method test_get_session_found (line 418) | async def test_get_session_found(self):
    method test_get_session_not_found (line 431) | async def test_get_session_not_found(self):
    method test_stop_session (line 438) | async def test_stop_session(self):
    method test_stop_session_not_found (line 453) | async def test_stop_session_not_found(self):
    method test_session_stats (line 460) | async def test_session_stats(self):
    method test_session_entry_points (line 470) | async def test_session_entry_points(self):
    method test_session_graphs (line 481) | async def test_session_graphs(self):
    method test_update_trigger_task (line 491) | async def test_update_trigger_task(self, tmp_path):
    method test_update_trigger_cron_restarts_active_timer (line 512) | async def test_update_trigger_cron_restarts_active_timer(self, tmp_path):
    method test_update_trigger_cron_rejects_invalid_expression (line 538) | async def test_update_trigger_cron_rejects_invalid_expression(self, tm...
  class TestExecution (line 555) | class TestExecution:
    method test_trigger (line 557) | async def test_trigger(self):
    method test_trigger_not_found (line 570) | async def test_trigger_not_found(self):
    method test_inject (line 580) | async def test_inject(self):
    method test_inject_missing_node_id (line 593) | async def test_inject_missing_node_id(self):
    method test_chat_goes_to_queen_when_not_waiting (line 604) | async def test_chat_goes_to_queen_when_not_waiting(self):
    method test_chat_injects_when_node_waiting (line 619) | async def test_chat_injects_when_node_waiting(self):
    method test_chat_503_when_no_queen_or_worker (line 636) | async def test_chat_503_when_no_queen_or_worker(self):
    method test_chat_missing_message (line 648) | async def test_chat_missing_message(self):
    method test_pause_no_active_executions (line 659) | async def test_pause_no_active_executions(self):
    method test_pause_does_not_cancel_queen (line 675) | async def test_pause_does_not_cancel_queen(self):
    method test_goal_progress (line 690) | async def test_goal_progress(self):
  class TestResume (line 700) | class TestResume:
    method test_resume_from_session_state (line 702) | async def test_resume_from_session_state(self, sample_session, tmp_age...
    method test_resume_with_checkpoint (line 722) | async def test_resume_with_checkpoint(self, sample_session, tmp_agent_...
    method test_resume_missing_session_id (line 743) | async def test_resume_missing_session_id(self):
    method test_resume_session_not_found (line 754) | async def test_resume_session_not_found(self):
  class TestStop (line 765) | class TestStop:
    method test_stop_found (line 767) | async def test_stop_found(self):
    method test_stop_not_found (line 782) | async def test_stop_not_found(self):
    method test_stop_missing_execution_id (line 793) | async def test_stop_missing_execution_id(self):
  class TestReplay (line 804) | class TestReplay:
    method test_replay_success (line 806) | async def test_replay_success(self, sample_session, tmp_agent_dir):
    method test_replay_missing_fields (line 827) | async def test_replay_missing_fields(self):
    method test_replay_checkpoint_not_found (line 844) | async def test_replay_checkpoint_not_found(self, sample_session, tmp_a...
  class TestWorkerSessions (line 862) | class TestWorkerSessions:
    method test_list_sessions (line 864) | async def test_list_sessions(self, sample_session, tmp_agent_dir):
    method test_list_sessions_includes_custom_id (line 881) | async def test_list_sessions_includes_custom_id(self, custom_id_sessio...
    method test_list_sessions_empty (line 897) | async def test_list_sessions_empty(self, tmp_agent_dir):
    method test_get_session (line 909) | async def test_get_session(self, sample_session, tmp_agent_dir):
    method test_get_session_not_found (line 924) | async def test_get_session_not_found(self, tmp_agent_dir):
    method test_delete_session (line 934) | async def test_delete_session(self, sample_session, tmp_agent_dir):
    method test_delete_session_not_found (line 951) | async def test_delete_session_not_found(self, tmp_agent_dir):
    method test_list_checkpoints (line 961) | async def test_list_checkpoints(self, sample_session, tmp_agent_dir):
    method test_restore_checkpoint (line 981) | async def test_restore_checkpoint(self, sample_session, tmp_agent_dir):
    method test_restore_checkpoint_not_found (line 1000) | async def test_restore_checkpoint_not_found(self, sample_session, tmp_...
  class TestMessages (line 1014) | class TestMessages:
    method test_get_messages (line 1016) | async def test_get_messages(self, sample_session, tmp_agent_dir):
    method test_get_messages_filtered_by_node (line 1041) | async def test_get_messages_filtered_by_node(self, sample_session, tmp...
    method test_get_messages_no_conversations (line 1059) | async def test_get_messages_no_conversations(self, tmp_agent_dir):
    method test_get_messages_client_only (line 1079) | async def test_get_messages_client_only(self, tmp_agent_dir):
    method test_get_messages_client_only_no_runner_returns_all (line 1156) | async def test_get_messages_client_only_no_runner_returns_all(self, tm...
  class TestGraphNodes (line 1185) | class TestGraphNodes:
    method test_list_nodes (line 1187) | async def test_list_nodes(self, nodes_and_edges):
    method test_list_nodes_includes_edges (line 1205) | async def test_list_nodes_includes_edges(self, nodes_and_edges):
    method test_list_nodes_with_session_enrichment (line 1229) | async def test_list_nodes_with_session_enrichment(
    method test_list_nodes_graph_not_found (line 1257) | async def test_list_nodes_graph_not_found(self):
    method test_get_node (line 1265) | async def test_get_node(self, nodes_and_edges):
    method test_node_detail_includes_system_prompt (line 1284) | async def test_node_detail_includes_system_prompt(self, nodes_and_edges):
    method test_get_node_not_found (line 1306) | async def test_get_node_not_found(self, nodes_and_edges):
  class TestNodeCriteria (line 1316) | class TestNodeCriteria:
    method test_criteria_static (line 1318) | async def test_criteria_static(self, nodes_and_edges):
    method test_criteria_with_log_enrichment (line 1332) | async def test_criteria_with_log_enrichment(
    method test_criteria_node_not_found (line 1367) | async def test_criteria_node_not_found(self, nodes_and_edges):
  class TestLogs (line 1379) | class TestLogs:
    method test_logs_no_log_store (line 1381) | async def test_logs_no_log_store(self):
    method test_logs_list_summaries (line 1392) | async def test_logs_list_summaries(self, sample_session, tmp_agent_dir):
    method test_logs_list_summaries_with_custom_id (line 1414) | async def test_logs_list_summaries_with_custom_id(self, custom_id_sess...
    method test_logs_session_summary (line 1436) | async def test_logs_session_summary(self, sample_session, tmp_agent_dir):
    method test_logs_session_details (line 1459) | async def test_logs_session_details(self, sample_session, tmp_agent_dir):
    method test_logs_session_tools (line 1483) | async def test_logs_session_tools(self, sample_session, tmp_agent_dir):
  class TestNodeLogs (line 1506) | class TestNodeLogs:
    method test_node_logs (line 1508) | async def test_node_logs(self, sample_session, tmp_agent_dir, nodes_an...
    method test_node_logs_missing_session_id (line 1540) | async def test_node_logs_missing_session_id(self, nodes_and_edges):
  class TestCredentials (line 1553) | class TestCredentials:
    method _make_app (line 1556) | def _make_app(self, initial_creds=None):
    method test_list_credentials_empty (line 1565) | async def test_list_credentials_empty(self):
    method test_save_and_list_credential (line 1574) | async def test_save_and_list_credential(self):
    method test_get_credential (line 1594) | async def test_get_credential(self):
    method test_get_credential_not_found (line 1606) | async def test_get_credential_not_found(self):
    method test_delete_credential (line 1613) | async def test_delete_credential(self):
    method test_delete_credential_not_found (line 1626) | async def test_delete_credential_not_found(self):
    method test_save_credential_missing_fields (line 1633) | async def test_save_credential_missing_fields(self):
    method test_save_overwrites_existing (line 1643) | async def test_save_overwrites_existing(self):
  class TestSSEFormat (line 1656) | class TestSSEFormat:
    method test_send_event_without_event_field (line 1661) | async def test_send_event_without_event_field(self):
    method test_send_event_with_event_field_present (line 1678) | async def test_send_event_with_event_field_present(self):
    method test_events_route_does_not_pass_event_param (line 1692) | def test_events_route_does_not_pass_event_param(self):
  class TestErrorMiddleware (line 1705) | class TestErrorMiddleware:
    method test_404_on_unknown_api_route (line 1707) | async def test_404_on_unknown_api_route(self):
  class TestCleanupStaleActiveSessions (line 1714) | class TestCleanupStaleActiveSessions:
    method _make_manager (line 1717) | def _make_manager(self):
    method _write_state (line 1722) | def _write_state(self, session_dir: Path, status: str, pid: int | None...
    method _read_state (line 1729) | def _read_state(self, session_dir: Path) -> dict:
    method test_stale_session_is_cancelled (line 1732) | def test_stale_session_is_cancelled(self, tmp_path, monkeypatch):
    method test_live_in_memory_session_is_skipped (line 1748) | def test_live_in_memory_session_is_skipped(self, tmp_path, monkeypatch):
    method test_session_with_live_pid_is_skipped (line 1766) | def test_session_with_live_pid_is_skipped(self, tmp_path, monkeypatch):
    method test_session_with_dead_pid_is_cancelled (line 1784) | def test_session_with_dead_pid_is_cancelled(self, tmp_path, monkeypatch):
    method test_paused_session_is_never_touched (line 1801) | def test_paused_session_is_never_touched(self, tmp_path, monkeypatch):

FILE: core/framework/skills/catalog.py
  class SkillCatalog (line 26) | class SkillCatalog:
    method __init__ (line 29) | def __init__(self, skills: list[ParsedSkill] | None = None):
    method add (line 36) | def add(self, skill: ParsedSkill) -> None:
    method get (line 40) | def get(self, name: str) -> ParsedSkill | None:
    method mark_activated (line 44) | def mark_activated(self, name: str) -> None:
    method is_activated (line 48) | def is_activated(self, name: str) -> bool:
    method skill_count (line 53) | def skill_count(self) -> int:
    method allowlisted_dirs (line 57) | def allowlisted_dirs(self) -> list[str]:
    method to_prompt (line 61) | def to_prompt(self) -> str:
    method build_pre_activated_prompt (line 87) | def build_pre_activated_prompt(self, skill_names: list[str]) -> str:

FILE: core/framework/skills/cli.py
  function register_skill_commands (line 17) | def register_skill_commands(subparsers) -> None:
  function cmd_skill_list (line 44) | def cmd_skill_list(args) -> int:
  function cmd_skill_trust (line 75) | def cmd_skill_trust(args) -> int:

FILE: core/framework/skills/config.py
  class DefaultSkillConfig (line 14) | class DefaultSkillConfig:
    method from_dict (line 21) | def from_dict(cls, data: dict[str, Any]) -> DefaultSkillConfig:
  class SkillsConfig (line 28) | class SkillsConfig:
    method is_default_enabled (line 53) | def is_default_enabled(self, skill_name: str) -> bool:
    method get_default_overrides (line 62) | def get_default_overrides(self, skill_name: str) -> dict[str, Any]:
    method from_agent_vars (line 70) | def from_agent_vars(

FILE: core/framework/skills/defaults.py
  class DefaultSkillManager (line 57) | class DefaultSkillManager:
    method __init__ (line 60) | def __init__(self, config: SkillsConfig | None = None):
    method load (line 66) | def load(self) -> None:
    method build_protocols_prompt (line 108) | def build_protocols_prompt(self) -> str:
    method log_active_skills (line 146) | def log_active_skills(self) -> None:
    method active_skill_names (line 193) | def active_skill_names(self) -> list[str]:
    method active_skills (line 198) | def active_skills(self) -> dict[str, ParsedSkill]:

FILE: core/framework/skills/discovery.py
  class DiscoveryConfig (line 44) | class DiscoveryConfig:
  class SkillDiscovery (line 54) | class SkillDiscovery:
    method __init__ (line 57) | def __init__(self, config: DiscoveryConfig | None = None):
    method discover (line 60) | def discover(self) -> list[ParsedSkill]:
    method _scan_scope (line 117) | def _scan_scope(self, root: Path, scope: str) -> list[ParsedSkill]:
    method _find_skill_files (line 138) | def _find_skill_files(self, directory: Path, depth: int) -> list[Path]:
    method _resolve_collisions (line 165) | def _resolve_collisions(self, skills: list[ParsedSkill]) -> list[Parse...

FILE: core/framework/skills/manager.py
  class SkillsManagerConfig (line 36) | class SkillsManagerConfig:
  class SkillsManager (line 55) | class SkillsManager:
    method __init__ (line 64) | def __init__(self, config: SkillsManagerConfig | None = None) -> None:
    method from_precomputed (line 76) | def from_precomputed(
    method load (line 99) | def load(self) -> None:
    method _do_load (line 110) | def _do_load(self) -> None:
    method skills_catalog_prompt (line 178) | def skills_catalog_prompt(self) -> str:
    method protocols_prompt (line 183) | def protocols_prompt(self) -> str:
    method allowlisted_dirs (line 188) | def allowlisted_dirs(self) -> list[str]:
    method is_loaded (line 193) | def is_loaded(self) -> bool:

FILE: core/framework/skills/models.py
  class SkillScope (line 10) | class SkillScope(StrEnum):
  class TrustStatus (line 18) | class TrustStatus(StrEnum):
  class SkillEntry (line 27) | class SkillEntry:

FILE: core/framework/skills/parser.py
  class ParsedSkill (line 25) | class ParsedSkill:
  function _try_fix_yaml (line 42) | def _try_fix_yaml(raw: str) -> str:
  function parse_skill_md (line 65) | def parse_skill_md(path: Path, source_scope: str = "project") -> ParsedS...

FILE: core/framework/skills/skill_errors.py
  class SkillErrorCode (line 13) | class SkillErrorCode(Enum):
  class SkillError (line 25) | class SkillError(Exception):
    method __init__ (line 32) | def __init__(self, code: SkillErrorCode, what: str, why: str, fix: str):
  function log_skill_error (line 43) | def log_skill_error(

FILE: core/framework/skills/trust.py
  class TrustedRepoEntry (line 43) | class TrustedRepoEntry:
  class TrustedRepoStore (line 49) | class TrustedRepoStore:
    method __init__ (line 52) | def __init__(self, path: Path | None = None) -> None:
    method is_trusted (line 57) | def is_trusted(self, repo_key: str) -> bool:
    method trust (line 61) | def trust(self, repo_key: str, project_path: str = "") -> None:
    method revoke (line 71) | def revoke(self, repo_key: str) -> bool:
    method list_entries (line 80) | def list_entries(self) -> list[TrustedRepoEntry]:
    method _ensure_loaded (line 84) | def _ensure_loaded(self) -> None:
    method _load (line 89) | def _load(self) -> None:
    method _save (line 114) | def _save(self) -> None:
  class ProjectTrustClassification (line 138) | class ProjectTrustClassification(StrEnum):
  class ProjectTrustDetector (line 144) | class ProjectTrustDetector:
    method __init__ (line 158) | def __init__(self, store: TrustedRepoStore | None = None) -> None:
    method classify (line 161) | def classify(self, project_dir: Path | None) -> tuple[ProjectTrustClas...
    method _get_remote_origin (line 192) | def _get_remote_origin(self, project_dir: Path) -> str:
    method _matches_own_remotes (line 212) | def _matches_own_remotes(self, repo_key: str) -> bool:
  function _normalize_remote_url (line 245) | def _normalize_remote_url(url: str) -> str:
  function _is_localhost_remote (line 272) | def _is_localhost_remote(remote_url: str) -> bool:
  class TrustGate (line 293) | class TrustGate:
    method __init__ (line 300) | def __init__(
    method filter_and_gate (line 314) | def filter_and_gate(
    method _run_consent_flow (line 393) | def _run_consent_flow(
    method _maybe_show_security_notice (line 410) | def _maybe_show_security_notice(self, Colors) -> None:  # noqa: N803
    method _print_consent_prompt (line 430) | def _print_consent_prompt(
    method _prompt_consent (line 467) | def _prompt_consent(self, Colors) -> str:  # noqa: N803

FILE: core/framework/storage/backend.py
  class FileStorage (line 18) | class FileStorage:
    method __init__ (line 40) | def __init__(self, base_path: str | Path):
    method _ensure_dirs (line 44) | def _ensure_dirs(self) -> None:
    method _validate_key (line 54) | def _validate_key(self, key: str) -> None:
    method save_run (line 90) | def save_run(self, run: Run) -> None:
    method load_run (line 108) | def load_run(self, run_id: str) -> Run | None:
    method load_summary (line 116) | def load_summary(self, run_id: str) -> RunSummary | None:
    method delete_run (line 129) | def delete_run(self, run_id: str) -> bool:
    method get_runs_by_goal (line 153) | def get_runs_by_goal(self, goal_id: str) -> list[str]:
    method get_runs_by_status (line 169) | def get_runs_by_status(self, status: str | RunStatus) -> list[str]:
    method get_runs_by_node (line 187) | def get_runs_by_node(self, node_id: str) -> list[str]:
    method list_all_runs (line 203) | def list_all_runs(self) -> list[str]:
    method list_all_goals (line 208) | def list_all_goals(self) -> list[str]:
    method _get_index (line 229) | def _get_index(self, index_type: str, key: str) -> list[str]:
    method _add_to_index (line 238) | def _add_to_index(self, index_type: str, key: str, value: str) -> None:
    method _remove_from_index (line 248) | def _remove_from_index(self, index_type: str, key: str, value: str) ->...
    method get_stats (line 260) | def get_stats(self) -> dict:

FILE: core/framework/storage/checkpoint_store.py
  class CheckpointStore (line 19) | class CheckpointStore:
    method __init__ (line 32) | def __init__(self, base_path: Path):
    method save_checkpoint (line 44) | async def save_checkpoint(self, checkpoint: Checkpoint) -> None:
    method load_checkpoint (line 76) | async def load_checkpoint(
    method load_index (line 113) | async def load_index(self) -> CheckpointIndex | None:
    method list_checkpoints (line 135) | async def list_checkpoints(
    method delete_checkpoint (line 165) | async def delete_checkpoint(self, checkpoint_id: str) -> bool:
    method prune_checkpoints (line 201) | async def prune_checkpoints(
    method checkpoint_exists (line 242) | async def checkpoint_exists(self, checkpoint_id: str) -> bool:
    method _update_index_add (line 259) | async def _update_index_add(self, checkpoint: Checkpoint) -> None:
    method _update_index_remove (line 293) | async def _update_index_remove(self, checkpoint_id: str) -> None:

FILE: core/framework/storage/concurrent.py
  class CacheEntry (line 26) | class CacheEntry:
    method is_expired (line 32) | def is_expired(self, ttl: float) -> bool:
  class ConcurrentStorage (line 36) | class ConcurrentStorage:
    method __init__ (line 59) | def __init__(
    method start (line 98) | async def start(self) -> None:
    method stop (line 107) | async def stop(self) -> None:
    method _get_lock (line 128) | async def _get_lock(self, lock_key: str) -> asyncio.Lock:
    method save_run (line 162) | async def save_run(self, run: Run, immediate: bool = False) -> None:
    method _save_run_locked (line 182) | async def _save_run_locked(self, run: Run) -> None:
    method load_run (line 218) | async def load_run(self, run_id: str, use_cache: bool = True) -> Run |...
    method load_summary (line 251) | async def load_summary(self, run_id: str, use_cache: bool = True) -> R...
    method delete_run (line 273) | async def delete_run(self, run_id: str) -> bool:
    method get_runs_by_goal (line 288) | async def get_runs_by_goal(self, goal_id: str) -> list[str]:
    method get_runs_by_status (line 294) | async def get_runs_by_status(self, status: str | RunStatus) -> list[str]:
    method get_runs_by_node (line 302) | async def get_runs_by_node(self, node_id: str) -> list[str]:
    method list_all_runs (line 308) | async def list_all_runs(self) -> list[str]:
    method list_all_goals (line 313) | async def list_all_goals(self) -> list[str]:
    method _batch_writer (line 320) | async def _batch_writer(self) -> None:
    method _flush_batch (line 359) | async def _flush_batch(self, batch: list[tuple[str, Any]]) -> None:
    method _flush_pending (line 377) | async def _flush_pending(self) -> None:
    method clear_cache (line 392) | def clear_cache(self) -> None:
    method invalidate_cache (line 396) | def invalidate_cache(self, key: str) -> None:
    method get_cache_stats (line 400) | def get_cache_stats(self) -> dict:
    method get_stats (line 411) | async def get_stats(self) -> dict:
    method save_run_sync (line 425) | def save_run_sync(self, run: Run) -> None:
    method load_run_sync (line 430) | def load_run_sync(self, run_id: str) -> Run | None:

FILE: core/framework/storage/conversation_store.py
  class FileConversationStore (line 33) | class FileConversationStore:
    method __init__ (line 41) | def __init__(self, base_path: str | Path) -> None:
    method _write_json (line 47) | def _write_json(self, path: Path, data: dict) -> None:
    method _read_json (line 52) | def _read_json(self, path: Path) -> dict | None:
    method _run (line 63) | async def _run(self, fn, *args):
    method write_part (line 68) | async def write_part(self, seq: int, data: dict[str, Any]) -> None:
    method read_parts (line 72) | async def read_parts(self) -> list[dict[str, Any]]:
    method write_meta (line 86) | async def write_meta(self, data: dict[str, Any]) -> None:
    method read_meta (line 89) | async def read_meta(self) -> dict[str, Any] | None:
    method write_cursor (line 92) | async def write_cursor(self, data: dict[str, Any]) -> None:
    method read_cursor (line 95) | async def read_cursor(self) -> dict[str, Any] | None:
    method delete_parts_before (line 98) | async def delete_parts_before(self, seq: int) -> None:
    method close (line 109) | async def close(self) -> None:
    method destroy (line 113) | async def destroy(self) -> None:

FILE: core/framework/storage/session_store.py
  class SessionStore (line 20) | class SessionStore:
    method __init__ (line 35) | def __init__(self, base_path: Path):
    method generate_session_id (line 45) | def generate_session_id(self) -> str:
    method get_session_path (line 56) | def get_session_path(self, session_id: str) -> Path:
    method get_state_path (line 68) | def get_state_path(self, session_id: str) -> Path:
    method write_state (line 80) | async def write_state(self, session_id: str, state: SessionState) -> N...
    method read_state (line 101) | async def read_state(self, session_id: str) -> SessionState | None:
    method list_sessions (line 121) | async def list_sessions(
    method delete_session (line 175) | async def delete_session(self, session_id: str) -> bool:
    method session_exists (line 199) | async def session_exists(self, session_id: str) -> bool:

FILE: core/framework/testing/approval_cli.py
  function interactive_approval (line 24) | def interactive_approval(
  function batch_approval (line 68) | def batch_approval(
  function _display_test (line 156) | def _display_test(test: Test, index: int, total: int) -> None:
  function _get_user_action (line 185) | def _get_user_action() -> ApprovalAction:
  function _process_action (line 202) | def _process_action(
  function _edit_test_code (line 251) | def _edit_test_code(code: str) -> str:
  function _command_exists (line 292) | def _command_exists(cmd: str) -> bool:

FILE: core/framework/testing/approval_types.py
  class ApprovalAction (line 15) | class ApprovalAction(StrEnum):
  class ApprovalRequest (line 24) | class ApprovalRequest(BaseModel):
    method validate_action (line 37) | def validate_action(self) -> tuple[bool, str | None]:
  class ApprovalResult (line 51) | class ApprovalResult(BaseModel):
    method success_result (line 64) | def success_result(
    method error_result (line 76) | def error_result(cls, test_id: str, action: ApprovalAction, error: str...
  class BatchApprovalRequest (line 86) | class BatchApprovalRequest(BaseModel):
    method to_dict (line 96) | def to_dict(self) -> dict[str, Any]:
  class BatchApprovalResult (line 104) | class BatchApprovalResult(BaseModel):
    method summary (line 118) | def summary(self) -> str:

FILE: core/framework/testing/categorizer.py
  class ErrorCategorizer (line 16) | class ErrorCategorizer:
    method __init__ (line 81) | def __init__(self):
    method categorize (line 89) | def categorize(self, result: TestResult) -> ErrorCategory | None:
    method categorize_with_confidence (line 124) | def categorize_with_confidence(self, result: TestResult) -> tuple[Erro...
    method _get_error_text (line 162) | def _get_error_text(self, result: TestResult) -> str:
    method get_fix_suggestion (line 179) | def get_fix_suggestion(self, category: ErrorCategory) -> str:
    method get_iteration_guidance (line 205) | def get_iteration_guidance(self, category: ErrorCategory) -> dict[str,...

FILE: core/framework/testing/cli.py
  function _check_pytest_available (line 20) | def _check_pytest_available() -> bool:
  function register_testing_commands (line 43) | def register_testing_commands(subparsers: argparse._SubParsersAction) ->...
  function cmd_test_run (line 131) | def cmd_test_run(args: argparse.Namespace) -> int:
  function cmd_test_debug (line 207) | def cmd_test_debug(args: argparse.Namespace) -> int:
  function _scan_test_files (line 266) | def _scan_test_files(tests_dir: Path) -> list[dict]:
  function cmd_test_list (line 308) | def cmd_test_list(args: argparse.Namespace) -> int:
  function cmd_test_stats (line 356) | def cmd_test_stats(args: argparse.Namespace) -> int:

FILE: core/framework/testing/debug_tool.py
  class DebugInfo (line 22) | class DebugInfo(BaseModel):
    method to_dict (line 51) | def to_dict(self) -> dict[str, Any]:
  class DebugTool (line 56) | class DebugTool:
    method __init__ (line 66) | def __init__(
    method analyze (line 82) | def analyze(
    method analyze_result (line 147) | def analyze_result(
    method get_failure_summary (line 196) | def get_failure_summary(
    method _get_runtime_data (line 230) | def _get_runtime_data(self, run_id: str) -> dict[str, Any]:
    method _get_iteration_suggestions (line 255) | def _get_iteration_suggestions(

FILE: core/framework/testing/llm_judge.py
  class LLMJudge (line 16) | class LLMJudge:
    method __init__ (line 22) | def __init__(self, llm_provider: LLMProvider | None = None):
    method _get_client (line 27) | def _get_client(self):
    method _get_fallback_provider (line 41) | def _get_fallback_provider(self) -> LLMProvider | None:
    method evaluate (line 71) | def evaluate(
    method _parse_json_result (line 125) | def _parse_json_result(self, text: str) -> dict[str, Any]:

FILE: core/framework/testing/test_case.py
  class ApprovalStatus (line 15) | class ApprovalStatus(StrEnum):
  class TestType (line 24) | class TestType(StrEnum):
  class Test (line 33) | class Test(BaseModel):
    method approve (line 93) | def approve(self, approved_by: str = "user") -> None:
    method modify (line 100) | def modify(self, new_code: str, approved_by: str = "user") -> None:
    method reject (line 109) | def reject(self, reason: str) -> None:
    method record_result (line 115) | def record_result(self, passed: bool) -> None:
    method is_approved (line 127) | def is_approved(self) -> bool:
    method pass_rate (line 132) | def pass_rate(self) -> float | None:

FILE: core/framework/testing/test_result.py
  class ErrorCategory (line 15) | class ErrorCategory(StrEnum):
  class TestResult (line 30) | class TestResult(BaseModel):
    method summary_dict (line 73) | def summary_dict(self) -> dict[str, Any]:
  class TestSuiteResult (line 84) | class TestSuiteResult(BaseModel):
    method all_passed (line 108) | def all_passed(self) -> bool:
    method pass_rate (line 113) | def pass_rate(self) -> float:
    method summary_dict (line 119) | def summary_dict(self) -> dict[str, Any]:
    method get_failed_results (line 135) | def get_failed_results(self) -> list[TestResult]:
    method get_results_by_category (line 139) | def get_results_by_category(self, category: ErrorCategory) -> list[Tes...

FILE: core/framework/testing/test_storage.py
  class TestStorage (line 16) | class TestStorage:
    method __init__ (line 40) | def __init__(self, base_path: str | Path):
    method _ensure_dirs (line 44) | def _ensure_dirs(self) -> None:
    method save_test (line 60) | def save_test(self, test: Test) -> None:
    method load_test (line 77) | def load_test(self, goal_id: str, test_id: str) -> Test | None:
    method delete_test (line 85) | def delete_test(self, goal_id: str, test_id: str) -> bool:
    method update_test (line 111) | def update_test(self, test: Test) -> None:
    method get_tests_by_goal (line 131) | def get_tests_by_goal(self, goal_id: str) -> list[Test]:
    method get_tests_by_approval_status (line 141) | def get_tests_by_approval_status(self, status: ApprovalStatus) -> list...
    method get_tests_by_type (line 145) | def get_tests_by_type(self, test_type: TestType) -> list[str]:
    method get_tests_by_criteria (line 149) | def get_tests_by_criteria(self, criteria_id: str) -> list[str]:
    method get_pending_tests (line 153) | def get_pending_tests(self, goal_id: str) -> list[Test]:
    method get_approved_tests (line 158) | def get_approved_tests(self, goal_id: str) -> list[Test]:
    method list_all_goals (line 163) | def list_all_goals(self) -> list[str]:
    method save_result (line 170) | def save_result(self, test_id: str, result: TestResult) -> None:
    method get_latest_result (line 186) | def get_latest_result(self, test_id: str) -> TestResult | None:
    method get_result_history (line 194) | def get_result_history(self, test_id: str, limit: int = 10) -> list[Te...
    method _get_index (line 214) | def _get_index(self, index_type: str, key: str) -> list[str]:
    method _add_to_index (line 222) | def _add_to_index(self, index_type: str, key: str, value: str) -> None:
    method _remove_from_index (line 231) | def _remove_from_index(self, index_type: str, key: str, value: str) ->...
    method get_stats (line 242) | def get_stats(self) -> dict:

FILE: core/framework/tools/flowchart_utils.py
  function save_flowchart_file (line 58) | def save_flowchart_file(
  function load_flowchart_file (line 83) | def load_flowchart_file(
  function classify_flowchart_node (line 103) | def classify_flowchart_node(
  function synthesize_draft_from_runtime (line 198) | def synthesize_draft_from_runtime(
  function generate_fallback_flowchart (line 332) | def generate_fallback_flowchart(

FILE: core/framework/tools/queen_lifecycle_tools.py
  class WorkerSessionAdapter (line 66) | class WorkerSessionAdapter:
  class QueenPhaseState (line 79) | class QueenPhaseState:
    method get_current_tools (line 122) | def get_current_tools(self) -> list:
    method get_current_prompt (line 132) | def get_current_prompt(self) -> str:
    method _emit_phase_event (line 153) | async def _emit_phase_event(self) -> None:
    method switch_to_running (line 167) | async def switch_to_running(self, source: str = "tool") -> None:
    method switch_to_staging (line 190) | async def switch_to_staging(self, source: str = "tool") -> None:
    method switch_to_building (line 219) | async def switch_to_building(self, source: str = "tool") -> None:
    method switch_to_planning (line 238) | async def switch_to_planning(self, source: str = "tool") -> None:
  function build_worker_profile (line 261) | def build_worker_profile(runtime: AgentRuntime, agent_path: Path | str |...
  function _read_agent_triggers_json (line 307) | def _read_agent_triggers_json(agent_path: Path) -> list[dict]:
  function _write_agent_triggers_json (line 319) | def _write_agent_triggers_json(agent_path: Path, triggers: list[dict]) -...
  function _save_trigger_to_agent (line 328) | def _save_trigger_to_agent(session: Any, trigger_id: str, tdef: Any) -> ...
  function _remove_trigger_from_agent (line 348) | def _remove_trigger_from_agent(session: Any, trigger_id: str) -> None:
  function _persist_active_triggers (line 360) | async def _persist_active_triggers(session: Any, session_id: str) -> None:
  function _start_trigger_timer (line 388) | async def _start_trigger_timer(session: Any, trigger_id: str, tdef: Any)...
  function _start_trigger_webhook (line 449) | async def _start_trigger_webhook(session: Any, trigger_id: str, tdef: An...
  function _dissolve_planning_nodes (line 512) | def _dissolve_planning_nodes(
  function _update_meta_json (line 730) | def _update_meta_json(session_manager, manager_session_id, updates: dict...
  function register_queen_lifecycle_tools (line 749) | def register_queen_lifecycle_tools(

FILE: core/framework/tools/queen_memory_tools.py
  function write_to_diary (line 17) | def write_to_diary(entry: str) -> str:
  function recall_diary (line 37) | def recall_diary(query: str = "", days_back: int = 7) -> str:
  function register_queen_memory_tools (line 97) | def register_queen_memory_tools(registry: ToolRegistry) -> None:

FILE: core/framework/tools/session_graph_tools.py
  function register_graph_tools (line 30) | def register_graph_tools(registry: ToolRegistry, runtime: AgentRuntime) ...

FILE: core/framework/tools/worker_monitoring_tools.py
  function register_worker_monitoring_tools (line 41) | def register_worker_monitoring_tools(

FILE: core/framework/utils/io.py
  function atomic_write (line 7) | def atomic_write(path: Path, mode: str = "w", encoding: str = "utf-8"):

FILE: core/frontend/src/App.tsx
  function App (line 6) | function App() {

FILE: core/frontend/src/api/client.ts
  constant API_BASE (line 1) | const API_BASE = "/api";
  class ApiError (line 3) | class ApiError extends Error {
    method constructor (line 4) | constructor(
  function request (line 13) | async function request<T>(path: string, options: RequestInit = {}): Prom...

FILE: core/frontend/src/api/credentials.ts
  type CredentialInfo (line 3) | interface CredentialInfo {
  type AgentCredentialRequirement (line 11) | interface AgentCredentialRequirement {

FILE: core/frontend/src/api/types.ts
  type LiveSession (line 3) | interface LiveSession {
  type LiveSessionDetail (line 21) | interface LiveSessionDetail extends LiveSession {
  type EntryPoint (line 28) | interface EntryPoint {
  type DiscoverEntry (line 40) | interface DiscoverEntry {
  type DiscoverResult (line 55) | type DiscoverResult = Record<string, DiscoverEntry[]>;
  type TriggerResult (line 59) | interface TriggerResult {
  type InjectResult (line 63) | interface InjectResult {
  type ChatResult (line 67) | interface ChatResult {
  type StopResult (line 74) | interface StopResult {
  type ResumeResult (line 80) | interface ResumeResult {
  type ReplayResult (line 86) | interface ReplayResult {
  type GoalProgress (line 92) | interface GoalProgress {
  type SessionSummary (line 99) | interface SessionSummary {
  type SessionDetail (line 109) | interface SessionDetail {
  type Checkpoint (line 126) | interface Checkpoint {
  type Message (line 135) | interface Message {
  type NodeSpec (line 150) | interface NodeSpec {
  type EdgeInfo (line 173) | interface EdgeInfo {
  type NodeDetail (line 179) | interface NodeDetail extends NodeSpec {
  type GraphEdge (line 183) | interface GraphEdge {
  type GraphTopology (line 190) | interface GraphTopology {
  type DraftNode (line 199) | interface DraftNode {
  type DraftEdge (line 216) | interface DraftEdge {
  type DraftGraph (line 226) | interface DraftGraph {
  type FlowchartMap (line 240) | interface FlowchartMap {
  type NodeCriteria (line 247) | interface NodeCriteria {
  type ToolInfo (line 262) | interface ToolInfo {
  type LogEntry (line 270) | interface LogEntry {
  type LogNodeDetail (line 274) | interface LogNodeDetail {
  type LogToolStep (line 285) | interface LogToolStep {
  type EventTypeName (line 294) | type EventTypeName =
  type AgentEvent (line 344) | interface AgentEvent {

FILE: core/frontend/src/components/ChatPanel.tsx
  type ContextUsageEntry (line 4) | interface ContextUsageEntry {
  type ChatMessage (line 15) | interface ChatMessage {
  type ChatPanelProps (line 35) | interface ChatPanelProps {
  function getColor (line 69) | function getColor(_agent: string, role?: "queen" | "worker"): string {
  constant TOOL_HEX (line 76) | const TOOL_HEX = [
  function toolHex (line 87) | function toolHex(name: string): string {
  function ToolActivityRow (line 93) | function ToolActivityRow({ content }: { content: string }) {
  function ChatPanel (line 258) | function ChatPanel({ messages, onSend, isWaiting, isWorkerWaiting, isBus...

FILE: core/frontend/src/components/CredentialsModal.tsx
  type Credential (line 5) | interface Credential {
  function createFreshCredentials (line 17) | function createFreshCredentials(_agentType: string): Credential[] {
  function cloneCredentials (line 22) | function cloneCredentials(existing: Credential[]): Credential[] {
  function allRequiredCredentialsMet (line 27) | function allRequiredCredentialsMet(creds: Credential[]): boolean {
  type CredentialRow (line 32) | interface CredentialRow {
  function requirementToRow (line 46) | function requirementToRow(r: AgentCredentialRequirement): CredentialRow {
  function clearCredentialCache (line 68) | function clearCredentialCache(agentPath?: string) {
  type CredentialsModalProps (line 76) | interface CredentialsModalProps {
  function CredentialsModal (line 88) | function CredentialsModal({

FILE: core/frontend/src/components/DraftGraph.tsx
  constant TRIGGER_H (line 15) | const TRIGGER_H = 38;
  constant TRIGGER_PILL_GAP_X (line 16) | const TRIGGER_PILL_GAP_X = 16;
  constant TRIGGER_ICON_X (line 17) | const TRIGGER_ICON_X = 16;
  constant TRIGGER_LABEL_X (line 18) | const TRIGGER_LABEL_X = 30;
  constant TRIGGER_LABEL_INSET (line 19) | const TRIGGER_LABEL_INSET = 38;
  constant TRIGGER_TEXT_Y (line 20) | const TRIGGER_TEXT_Y = 11;
  constant TRIGGER_TEXT_STEP (line 21) | const TRIGGER_TEXT_STEP = 11;
  constant TRIGGER_CLEARANCE (line 22) | const TRIGGER_CLEARANCE = 30;
  type DraftChromeColors (line 24) | interface DraftChromeColors {
  function buildDraftChromeColors (line 40) | function buildDraftChromeColors(): DraftChromeColors {
  function useDraftChromeColors (line 72) | function useDraftChromeColors() {
  type DraftNodeStatus (line 85) | type DraftNodeStatus = "pending" | "running" | "complete" | "error";
  type DraftGraphProps (line 87) | interface DraftGraphProps {
  constant NODE_H (line 111) | const NODE_H = 52;
  constant GAP_Y (line 112) | const GAP_Y = 48;
  constant TOP_Y (line 113) | const TOP_Y = 28;
  constant MARGIN_X (line 114) | const MARGIN_X = 16;
  constant GAP_X (line 115) | const GAP_X = 16;
  constant GROUP_GAP_COLS (line 116) | const GROUP_GAP_COLS = 1;
  function formatNodeId (line 118) | function formatNodeId(id: string): string {
  function FlowchartShape (line 126) | function FlowchartShape({
  function Tooltip (line 221) | function Tooltip({ node, style }: { node: DraftNode; style: React.CSSPro...
  function DraftGraph (line 241) | function DraftGraph({ draft, originalDraft, onNodeClick, flowchartMap, r...

FILE: core/frontend/src/components/HistorySidebar.tsx
  type HistorySession (line 23) | type HistorySession = {
  constant LABEL_STORE_KEY (line 37) | const LABEL_STORE_KEY = "hive:history-labels";
  function loadLabelStore (line 39) | function loadLabelStore(): Record<string, string> {
  function saveLabelStore (line 48) | function saveLabelStore(store: Record<string, string>) {
  function defaultLabel (line 56) | function defaultLabel(s: HistorySession, index: number): string {
  function formatDateTime (line 68) | function formatDateTime(createdAt: number, sessionId: string): string {
  function deduplicateByAgent (line 87) | function deduplicateByAgent(sessions: HistorySession[]): HistorySession[] {
  function groupByDate (line 102) | function groupByDate(sessions: HistorySession[]): { label: string; items...
  type RowProps (line 126) | interface RowProps {
  function HistoryRow (line 137) | function HistoryRow({ session: s, label, isActive, isLive, onOpen, onRen...
  type HistorySidebarProps (line 260) | interface HistorySidebarProps {
  function HistorySidebar (line 274) | function HistorySidebar({ onOpen, openSessionIds = [], activeSessionId, ...

FILE: core/frontend/src/components/MarkdownContent.tsx
  type MarkdownContentProps (line 84) | interface MarkdownContentProps {
  function MarkdownContent (line 89) | function MarkdownContent({ content, className }: MarkdownContentProps) {

FILE: core/frontend/src/components/MultiQuestionWidget.tsx
  type QuestionItem (line 4) | interface QuestionItem {
  type MultiQuestionWidgetProps (line 10) | interface MultiQuestionWidgetProps {
  function MultiQuestionWidget (line 16) | function MultiQuestionWidget({ questions, onSubmit, onDismiss }: MultiQu...

FILE: core/frontend/src/components/NodeDetailPanel.tsx
  type Tool (line 9) | interface Tool {
  type ToolCredential (line 16) | interface ToolCredential {
  type SubagentReport (line 23) | interface SubagentReport {
  type ContextUsage (line 31) | interface ContextUsage {
  type NodeDetailPanelProps (line 38) | interface NodeDetailPanelProps {
  function formatNodeId (line 60) | function formatNodeId(id: string): string {
  function CredentialRow (line 64) | function CredentialRow({ cred }: { cred: ToolCredential }) {
  function ToolRow (line 82) | function ToolRow({ tool }: { tool: Tool }) {
  function LogsTab (line 118) | function LogsTab({ nodeId, isActive: _isActive, sessionId, graphId, work...
  function SystemPromptTab (line 177) | function SystemPromptTab({ systemPrompt }: { systemPrompt?: string }) {
  function SubagentStatusBadge (line 216) | function SubagentStatusBadge({ status }: { status?: "running" | "complet...
  function SubagentsTab (line 245) | function SubagentsTab({ subAgentIds, allNodeSpecs, subagentReports }: { ...
  type Tab (line 310) | type Tab = "overview" | "breakdown" | "tools" | "logs" | "subagents";
  function NodeDetailPanel (line 320) | function NodeDetailPanel({ node, nodeSpec, allNodeSpecs, subagentReports...

FILE: core/frontend/src/components/ParallelSubagentBubble.tsx
  constant SUBAGENT_COLORS (line 12) | const SUBAGENT_COLORS = [
  function colorForIndex (line 23) | function colorForIndex(i: number): string {
  function subagentLabel (line 27) | function subagentLabel(nodeId: string): string {
  function last (line 37) | function last<T>(arr: T[]): T | undefined {
  type SubagentGroup (line 41) | interface SubagentGroup {
  type ParallelSubagentBubbleProps (line 47) | interface ParallelSubagentBubbleProps {
  function ToolOverlay (line 60) | function ToolOverlay({
  function MuxPane (line 94) | function MuxPane({

FILE: core/frontend/src/components/QuestionWidget.tsx
  type QuestionWidgetProps (line 4) | interface QuestionWidgetProps {
  function QuestionWidget (line 15) | function QuestionWidget({ question, options, onSubmit, onDismiss }: Ques...

FILE: core/frontend/src/components/TopBar.tsx
  type TopBarTab (line 7) | interface TopBarTab {
  type TopBarProps (line 14) | interface TopBarProps {
  function TopBar (line 29) | function TopBar({ tabs: tabsProp, onTabClick, onCloseTab, canCloseTabs, ...
  function deriveTabs (line 142) | function deriveTabs(persisted: PersistedTabState | null): TopBarTab[] {

FILE: core/frontend/src/components/graph-types.ts
  type NodeStatus (line 1) | type NodeStatus = "running" | "complete" | "pending" | "error" | "looping";
  type NodeType (line 3) | type NodeType = "execution" | "trigger";
  type GraphNode (line 5) | interface GraphNode {
  type RunState (line 20) | type RunState = "idle" | "deploying" | "running";
  type RunButtonProps (line 22) | interface RunButtonProps {

FILE: core/frontend/src/hooks/use-sse.ts
  type UseSSEOptions (line 4) | interface UseSSEOptions {
  function useSSE (line 11) | function useSSE({
  type UseMultiSSEOptions (line 69) | interface UseMultiSSEOptions {
  function useMultiSSE (line 79) | function useMultiSSE({ sessions, onEvent }: UseMultiSSEOptions) {

FILE: core/frontend/src/lib/chat-helpers.test.ts
  function makeEvent (line 9) | function makeEvent(overrides: Partial<AgentEvent>): AgentEvent {

FILE: core/frontend/src/lib/chat-helpers.ts
  function formatAgentDisplayName (line 18) | function formatAgentDisplayName(raw: string): string {
  function sseEventToChatMessage (line 36) | function sseEventToChatMessage(
  type QueenPhase (line 153) | type QueenPhase = "planning" | "building" | "staging" | "running";
  constant VALID_PHASES (line 154) | const VALID_PHASES = new Set<string>(["planning", "building", "staging",...
  function extractLastPhase (line 161) | function extractLastPhase(events: AgentEvent[]): QueenPhase | null {

FILE: core/frontend/src/lib/graph-converter.test.ts
  function makeNode (line 9) | function makeNode(id: string, overrides: Partial<NodeSpec> = {}): NodeSp...

FILE: core/frontend/src/lib/graph-converter.ts
  function topologyToGraphNodes (line 14) | function topologyToGraphNodes(topology: GraphTopology): GraphNode[] {
  function mapStatus (line 176) | function mapStatus(spec: NodeSpec | undefined): NodeStatus {

FILE: core/frontend/src/lib/graphUtils.ts
  function cssVar (line 8) | function cssVar(name: string): string {
  function truncateLabel (line 13) | function truncateLabel(label: string, availablePx: number, fontSize: num...
  type TriggerColorSet (line 22) | type TriggerColorSet = { bg: string; border: string; text: string; icon:...
  function buildTriggerColors (line 24) | function buildTriggerColors(): TriggerColorSet {
  constant ACTIVE_TRIGGER_COLORS (line 37) | const ACTIVE_TRIGGER_COLORS: TriggerColorSet = {
  constant TRIGGER_ICONS (line 44) | const TRIGGER_ICONS: Record<string, string> = {
  function cronToLabel (line 52) | function cronToLabel(cron: string): string {
  function useTriggerColors (line 77) | function useTriggerColors(): TriggerColorSet {

FILE: core/frontend/src/lib/tab-persistence.ts
  constant TAB_STORAGE_KEY (line 9) | const TAB_STORAGE_KEY = "hive:workspace-tabs";
  type PersistedTabState (line 11) | interface PersistedTabState {
  function loadPersistedTabs (line 18) | function loadPersistedTabs(): PersistedTabState | null {
  constant MAX_PERSISTED_MESSAGES (line 30) | const MAX_PERSISTED_MESSAGES = 50;
  function savePersistedTabs (line 32) | function savePersistedTabs(state: PersistedTabState): void {

FILE: core/frontend/src/lib/utils.ts
  function cn (line 4) | function cn(...inputs: ClassValue[]) {

FILE: core/frontend/src/pages/home.tsx
  constant AGENT_ICONS (line 11) | const AGENT_ICONS: Record<string, LucideIcon> = {
  constant AGENT_COLORS (line 26) | const AGENT_COLORS: Record<string, string> = {
  function agentSlug (line 41) | function agentSlug(path: string): string {
  function Home (line 54) | function Home() {

FILE: core/frontend/src/pages/my-agents.tsx
  function timeAgo (line 8) | function timeAgo(iso: string): string {
  function MyAgents (line 20) | function MyAgents() {

FILE: core/frontend/src/pages/workspace.tsx
  function formatCountdown (line 33) | function formatCountdown(totalSecs: number): string {
  function TimerCountdown (line 42) | function TimerCountdown({ initialSeconds }: { initialSeconds: number }) {
  type Session (line 64) | interface Session {
  function createSession (line 82) | function createSession(agentType: string, label: string, existingCredent...
  type PopoverStep (line 94) | type PopoverStep = "root" | "new-agent-choice" | "clone-pick";
  type NewTabPopoverProps (line 96) | interface NewTabPopoverProps {
  function NewTabPopover (line 106) | function NewTabPopover({ open, onClose, anchorRef, discoverAgents, onFro...
  function fmtLogTs (line 239) | function fmtLogTs(ts: string): string {
  function truncate (line 248) | function truncate(s: string, max: number): string {
  type SessionRestoreResult (line 252) | type SessionRestoreResult = {
  function restoreSessionMessages (line 265) | async function restoreSessionMessages(
  type AgentBackendState (line 308) | interface AgentBackendState {
  function defaultAgentState (line 359) | function defaultAgentState(): AgentBackendState {
  function Workspace (line 398) | function Workspace() {

FILE: core/tests/debug_codex_stream.py
  function test_codex_stream (line 19) | async def test_codex_stream():

FILE: core/tests/debug_codex_verbose.py
  function main (line 26) | async def main():

FILE: core/tests/dummy_agents/conftest.py
  function set_llm_selection (line 26) | def set_llm_selection(
  function pytest_collection_modifyitems (line 43) | def pytest_collection_modifyitems(config, items):
  function llm_provider (line 65) | def llm_provider():
  function tool_registry (line 78) | def tool_registry():
  function runtime (line 104) | def runtime(tmp_path):
  function goal (line 110) | def goal():
  function make_executor (line 114) | def make_executor(

FILE: core/tests/dummy_agents/nodes.py
  class SuccessNode (line 13) | class SuccessNode(NodeProtocol):
    method __init__ (line 16) | def __init__(self, output: dict | None = None):
    method execute (line 21) | async def execute(self, ctx: NodeContext) -> NodeResult:
  class FailNode (line 27) | class FailNode(NodeProtocol):
    method __init__ (line 30) | def __init__(self, error: str = "node failed"):
    method execute (line 34) | async def execute(self, ctx: NodeContext) -> NodeResult:
  class FlakyNode (line 39) | class FlakyNode(NodeProtocol):
    method __init__ (line 42) | def __init__(self, fail_times: int = 2, output: dict | None = None):
    method execute (line 47) | async def execute(self, ctx: NodeContext) -> NodeResult:
  class StatefulNode (line 54) | class StatefulNode(NodeProtocol):
    method __init__ (line 57) | def __init__(self, outputs: list[NodeResult]):
    method execute (line 61) | async def execute(self, ctx: NodeContext) -> NodeResult:

FILE: core/tests/dummy_agents/run_all.py
  function _detect_claude_code_token (line 40) | def _detect_claude_code_token() -> str | None:
  function _detect_codex_token (line 50) | def _detect_codex_token() -> str | None:
  function _detect_kimi_code_token (line 60) | def _detect_kimi_code_token() -> str | None:
  function detect_available (line 70) | def detect_available() -> list[dict]:
  function prompt_provider_selection (line 130) | def prompt_provider_selection() -> dict:
  function parse_junit_xml (line 168) | def parse_junit_xml(xml_path: str) -> dict[str, dict]:
  function print_table (line 219) | def print_table(agents: dict[str, dict], total_time: float, verbose: boo...
  function main (line 302) | def main() -> int:

FILE: core/tests/dummy_agents/test_branch.py
  function _build_branch_graph (line 21) | def _build_branch_graph() -> GraphSpec:
  function test_branch_positive_path (line 95) | async def test_branch_positive_path(runtime, goal, llm_provider):
  function test_branch_negative_path (line 108) | async def test_branch_negative_path(runtime, goal, llm_provider):
  function test_branch_two_nodes_traversed (line 121) | async def test_branch_two_nodes_traversed(runtime, goal, llm_provider):

FILE: core/tests/dummy_agents/test_echo.py
  function _build_echo_graph (line 16) | def _build_echo_graph() -> GraphSpec:
  function test_echo_basic (line 46) | async def test_echo_basic(runtime, goal, llm_provider):
  function test_echo_empty_input (line 59) | async def test_echo_empty_input(runtime, goal, llm_provider):

FILE: core/tests/dummy_agents/test_feedback_loop.py
  function _build_feedback_graph (line 17) | def _build_feedback_graph(max_visits: int = 3) -> GraphSpec:
  function test_feedback_loop_terminates (line 77) | async def test_feedback_loop_terminates(runtime, goal, llm_provider):
  function test_feedback_loop_visit_counts (line 102) | async def test_feedback_loop_visit_counts(runtime, goal, llm_provider):
  function test_feedback_loop_early_exit (line 125) | async def test_feedback_loop_early_exit(runtime, goal, llm_provider):

FILE: core/tests/dummy_agents/test_gcu_subagent.py
  function _has_gcu_server (line 24) | def _has_gcu_server() -> bool:
  function _build_gcu_subagent_graph (line 34) | def _build_gcu_subagent_graph() -> GraphSpec:
  function _gcu_goal (line 86) | def _gcu_goal() -> Goal:
  function test_gcu_subagent_delegation (line 96) | async def test_gcu_subagent_delegation(runtime, llm_provider, tool_regis...
  function test_gcu_subagent_returns_data (line 137) | async def test_gcu_subagent_returns_data(runtime, llm_provider, tool_reg...

FILE: core/tests/dummy_agents/test_parallel_merge.py
  function _build_parallel_graph (line 23) | def _build_parallel_graph() -> GraphSpec:
  function test_parallel_both_succeed (line 114) | async def test_parallel_both_succeed(runtime, goal, llm_provider):
  function test_parallel_branch_failure_fail_all (line 128) | async def test_parallel_branch_failure_fail_all(runtime, goal, llm_provi...
  function test_parallel_branch_failure_continue_others (line 141) | async def test_parallel_branch_failure_continue_others(runtime, goal, ll...
  function test_parallel_disjoint_output_keys (line 155) | async def test_parallel_disjoint_output_keys(runtime, goal, llm_provider):

FILE: core/tests/dummy_agents/test_pipeline.py
  function _build_pipeline_graph (line 21) | def _build_pipeline_graph(conversation_mode: str = "continuous") -> Grap...
  function test_pipeline_linear_traversal (line 91) | async def test_pipeline_linear_traversal(runtime, goal, llm_provider):
  function test_pipeline_input_mapping (line 103) | async def test_pipeline_input_mapping(runtime, goal, llm_provider):
  function test_pipeline_continuous_conversation (line 116) | async def test_pipeline_continuous_conversation(runtime, goal, llm_provi...
  function test_pipeline_isolated_conversation (line 127) | async def test_pipeline_isolated_conversation(runtime, goal, llm_provider):

FILE: core/tests/dummy_agents/test_retry.py
  function _build_retry_graph (line 17) | def _build_retry_graph(max_retries: int = 3, with_failure_edge: bool = F...
  function test_retry_succeeds_within_limit (line 77) | async def test_retry_succeeds_within_limit(runtime, goal, llm_provider):
  function test_retry_exhaustion (line 92) | async def test_retry_exhaustion(runtime, goal, llm_provider):
  function test_retry_with_on_failure_edge (line 105) | async def test_retry_with_on_failure_edge(runtime, goal, llm_provider):
  function test_retry_tracking (line 121) | async def test_retry_tracking(runtime, goal, llm_provider):

FILE: core/tests/dummy_agents/test_worker.py
  function _build_worker_graph (line 19) | def _build_worker_graph(tools: list[str]) -> GraphSpec:
  function _worker_goal (line 49) | def _worker_goal() -> Goal:
  function test_worker_example_tool (line 58) | async def test_worker_example_tool(runtime, llm_provider, tool_registry):
  function test_worker_time_tool (line 75) | async def test_worker_time_tool(runtime, llm_provider, tool_registry):
  function test_worker_data_tools (line 95) | async def test_worker_data_tools(runtime, llm_provider, tool_registry, t...
  function test_worker_multi_tool (line 122) | async def test_worker_multi_tool(runtime, llm_provider, tool_registry):

FILE: core/tests/test_antigravity_eventloop.py
  function make_provider (line 27) | def make_provider() -> LiteLLMProvider:
  function make_context (line 46) | def make_context(
  function run_test (line 85) | async def run_test(
  function main (line 110) | async def main():

FILE: core/tests/test_check_llm_key_openrouter.py
  function _load_check_llm_key_module (line 5) | def _load_check_llm_key_module():
  function _run_openrouter_check (line 14) | def _run_openrouter_check(monkeypatch, status_code: int):
  function _run_openrouter_model_check (line 42) | def _run_openrouter_model_check(
  function test_check_openrouter_200 (line 82) | def test_check_openrouter_200(monkeypatch):
  function test_check_openrouter_401 (line 89) | def test_check_openrouter_401(monkeypatch):
  function test_check_openrouter_403 (line 94) | def test_check_openrouter_403(monkeypatch):
  function test_check_openrouter_429 (line 99) | def test_check_openrouter_429(monkeypatch):
  function test_check_openrouter_model_200 (line 104) | def test_check_openrouter_model_200(monkeypatch):
  function test_check_openrouter_model_200_matches_canonical_slug (line 126) | def test_check_openrouter_model_200_matches_canonical_slug(monkeypatch):
  function test_check_openrouter_model_200_sanitizes_pasted_unicode (line 147) | def test_check_openrouter_model_200_sanitizes_pasted_unicode(monkeypatch):
  function test_check_openrouter_model_200_not_found_with_suggestions (line 168) | def test_check_openrouter_model_200_not_found_with_suggestions(monkeypat...
  function test_check_openrouter_model_404_with_error_message (line 189) | def test_check_openrouter_model_404_with_error_message(monkeypatch):
  function test_check_openrouter_model_429 (line 204) | def test_check_openrouter_model_429(monkeypatch):

FILE: core/tests/test_cli_entry_point.py
  function project_root (line 14) | def project_root():
  class TestConfigurePaths (line 19) | class TestConfigurePaths:
    method test_adds_exports_to_sys_path (line 22) | def test_adds_exports_to_sys_path(self, project_root):
    method test_adds_core_to_sys_path (line 38) | def test_adds_core_to_sys_path(self, project_root):
    method test_does_not_duplicate_paths (line 50) | def test_does_not_duplicate_paths(self):
    method test_handles_missing_exports_gracefully (line 57) | def test_handles_missing_exports_gracefully(self):
  class TestFrameworkModule (line 62) | class TestFrameworkModule:
    method test_module_help (line 65) | def test_module_help(self, project_root):
    method test_module_list_subcommand (line 77) | def test_module_list_subcommand(self, project_root):
  class TestHiveEntryPoint (line 90) | class TestHiveEntryPoint:
    method _require_hive (line 99) | def _require_hive(self):
    method test_hive_help (line 103) | def test_hive_help(self):
    method test_hive_list_help (line 115) | def test_hive_list_help(self):
    method test_hive_run_missing_agent (line 125) | def test_hive_run_missing_agent(self):

FILE: core/tests/test_client_facing_validation.py
  class TestClientFacingFanOut (line 17) | class TestClientFacingFanOut:
    method test_fan_out_two_client_facing_fails (line 20) | def test_fan_out_two_client_facing_fails(self):
    method test_fan_out_one_client_facing_passes (line 42) | def test_fan_out_one_client_facing_passes(self):
    method test_fan_out_zero_client_facing_passes (line 63) | def test_fan_out_zero_client_facing_passes(self):
  class TestEventLoopOutputKeyOverlap (line 90) | class TestEventLoopOutputKeyOverlap:
    method test_overlapping_output_keys_event_loop_fails (line 93) | def test_overlapping_output_key
Copy disabled (too large) Download .json
Condensed preview — 1072 files, each showing path, character count, and a content snippet. Download the .json file for the full structured content (10,937K chars).
[
  {
    "path": ".claude/settings.json",
    "chars": 323,
    "preview": "{\n  \"hooks\": {\n    \"PostToolUse\": [\n      {\n        \"matcher\": \"Edit|Write|NotebookEdit\",\n        \"hooks\": [\n          {"
  },
  {
    "path": ".claude/settings.local.json.example",
    "chars": 370,
    "preview": "{\n  \"permissions\": {\n    \"allow\": [\n      \"Bash(git status:*)\",\n      \"Bash(gh run view:*)\",\n      \"Bash(uv run:*)\",\n   "
  },
  {
    "path": ".claude/skills/triage-issue/SKILL.md",
    "chars": 4322,
    "preview": "# Triage Issue Skill\n\nAnalyze a GitHub issue, verify claims against the codebase, and close invalid issues with a techni"
  },
  {
    "path": ".cursorrules",
    "chars": 732,
    "preview": "This project uses ruff for Python linting and formatting.\n\nRules:\n- Line length: 100 characters\n- Python target: 3.11+\n-"
  },
  {
    "path": ".dockerignore",
    "chars": 281,
    "preview": "# Git\n.git/\n.gitignore\n\n# Documentation\n*.md\ndocs/\nLICENSE\n\n# IDE\n.idea/\n.vscode/\n\n# Dependencies (rebuilt in container)"
  },
  {
    "path": ".editorconfig",
    "chars": 358,
    "preview": "# EditorConfig helps maintain consistent coding styles\n# https://editorconfig.org\n\nroot = true\n\n[*]\ncharset = utf-8\nend_"
  },
  {
    "path": ".gitattributes",
    "chars": 1704,
    "preview": "# Normalize line endings for all text files\n* text=auto\n\n# Source code\n*.py text diff=python\n*.js text\n*.ts text\n*.jsx t"
  },
  {
    "path": ".github/CODEOWNERS",
    "chars": 265,
    "preview": "# Default owners for everything in the repo\n* @adenhq/maintainers\n\n# Frontend\n/honeycomb/ @adenhq/maintainers\n\n# Backend"
  },
  {
    "path": ".github/ISSUE_TEMPLATE/bug_report.md",
    "chars": 858,
    "preview": "---\nname: Bug Report\nabout: Report a bug to help us improve\ntitle: \"[Bug]: \"\nlabels: bug, enhancement\nassignees: ''\n\n---"
  },
  {
    "path": ".github/ISSUE_TEMPLATE/feature_request.md",
    "chars": 652,
    "preview": "---\nname: Feature Request\nabout: Suggest a new feature or enhancement\ntitle: \"[Feature]: \"\nlabels: enhancement\nassignees"
  },
  {
    "path": ".github/ISSUE_TEMPLATE/integration-bounty.yml",
    "chars": 2597,
    "preview": "name: Integration Bounty\ndescription: A bounty task for the integration contribution program\ntitle: \"[Bounty]: \"\nlabels:"
  },
  {
    "path": ".github/ISSUE_TEMPLATE/integration-request.md",
    "chars": 6179,
    "preview": "---\nname: Integration Request\nabout: Suggest a new integration\ntitle: \"[Integration]:\"\nlabels: ''\nassignees: ''\n\n---\n\n##"
  },
  {
    "path": ".github/ISSUE_TEMPLATE/standard-bounty.yml",
    "chars": 2016,
    "preview": "name: Standard Bounty\ndescription: A bounty task for general framework contributions (not integration-specific)\ntitle: \""
  },
  {
    "path": ".github/PULL_REQUEST_TEMPLATE.md",
    "chars": 1171,
    "preview": "## Description\n\nBrief description of the changes in this PR.\n\n## Type of Change\n\n- [ ] Bug fix (non-breaking change that"
  },
  {
    "path": ".github/workflows/auto-close-duplicates.yml",
    "chars": 948,
    "preview": "name: Auto-close duplicate issues\ndescription: Auto-closes issues that are duplicates of existing issues\non:\n  schedule:"
  },
  {
    "path": ".github/workflows/bounty-completed.yml",
    "chars": 1482,
    "preview": "name: Bounty completed\ndescription: Awards points and notifies Discord when a bounty PR is merged\n\non:\n  pull_request_ta"
  },
  {
    "path": ".github/workflows/ci.yml",
    "chars": 3527,
    "preview": "name: CI\n\non:\n  push:\n    branches: [main]\n  pull_request:\n    branches: [main]\n    \nconcurrency:\n  group: ${{ github.wo"
  },
  {
    "path": ".github/workflows/claude-issue-triage.yml",
    "chars": 5023,
    "preview": "name: Issue Triage\n\non:\n  issues:\n    types: [opened]\n\njobs:\n  triage:\n    runs-on: ubuntu-latest\n    timeout-minutes: 1"
  },
  {
    "path": ".github/workflows/pr-check-command.yml",
    "chars": 7587,
    "preview": "name: PR Check Command\n\non:\n  issue_comment:\n    types: [created]\n\njobs:\n  check-pr:\n    # Only run on PR comments that "
  },
  {
    "path": ".github/workflows/pr-requirements-backfill.yml",
    "chars": 4962,
    "preview": "name: PR Requirements Backfill\n\non:\n  workflow_dispatch:\n\njobs:\n  check-all-open-prs:\n    runs-on: ubuntu-latest\n    per"
  },
  {
    "path": ".github/workflows/pr-requirements-enforce.yml",
    "chars": 2164,
    "preview": "# Closes PRs that still have the `pr-requirements-warning` label\n# after contributors were warned in pr-requirements.yml"
  },
  {
    "path": ".github/workflows/pr-requirements.yml",
    "chars": 8278,
    "preview": "name: PR Requirements Check\n\non:\n  pull_request_target:\n    types: [opened, reopened, edited, synchronize]\n\njobs:\n  chec"
  },
  {
    "path": ".github/workflows/release.yml",
    "chars": 1007,
    "preview": "name: Release\n\non:\n  push:\n    tags:\n      - 'v*'\n\npermissions:\n  contents: write\n\njobs:\n  release:\n    name: Create Rel"
  },
  {
    "path": ".github/workflows/weekly-leaderboard.yml",
    "chars": 1330,
    "preview": "name: Weekly bounty leaderboard\ndescription: Posts the integration bounty leaderboard to Discord every Monday\n\non:\n  sch"
  },
  {
    "path": ".gitignore",
    "chars": 782,
    "preview": "# Dependencies\nnode_modules/\n.pnpm-store/\n\n# Build outputs\ndist/\nbuild/\nworkdir/\n.next/\nout/\n\n# Environment files\n.env\n."
  },
  {
    "path": ".mcp.json",
    "chars": 23,
    "preview": "{\n  \"mcpServers\": {}\n}\n"
  },
  {
    "path": ".pre-commit-config.yaml",
    "chars": 436,
    "preview": "repos:\n  - repo: https://github.com/astral-sh/ruff-pre-commit\n    rev: v0.15.0\n    hooks:\n      - id: ruff\n        name:"
  },
  {
    "path": ".python-version",
    "chars": 5,
    "preview": "3.11\n"
  },
  {
    "path": "AGENTS.md",
    "chars": 1839,
    "preview": "# Repository Guidelines\n\nShared agent instructions for this workspace.\n\n## Coding Agent Notes\n\n- \n- When working on a Gi"
  },
  {
    "path": "CHANGELOG.md",
    "chars": 18479,
    "preview": "# Release Notes\n\n## v0.7.1\n\n**Release Date:** March 13, 2026\n**Tag:** v0.7.1\n\n### Chrome-Native Browser Control\n\nv0.7.1 "
  },
  {
    "path": "CONTRIBUTING.md",
    "chars": 35265,
    "preview": "# Contributing to Aden Hive\n\n> **\"The best way to predict the future is to invent it.\"** — Alan Kay\n\nWelcome to Aden Hiv"
  },
  {
    "path": "LICENSE",
    "chars": 10753,
    "preview": "                                 Apache License\n                           Version 2.0, January 2004\n                   "
  },
  {
    "path": "Makefile",
    "chars": 2090,
    "preview": ".PHONY: lint format check test test-tools test-live test-all install-hooks help frontend-install frontend-dev frontend-b"
  },
  {
    "path": "README.md",
    "chars": 20007,
    "preview": "<p align=\"center\">\n  <img width=\"100%\" alt=\"Hive Banner\" src=\"https://github.com/user-attachments/assets/a027429b-5d3c-4"
  },
  {
    "path": "SECURITY.md",
    "chars": 1943,
    "preview": "# Security Policy\n\n## Supported Versions\n\n| Version | Supported          |\n| ------- | ------------------ |\n| 0.x.x   | "
  },
  {
    "path": "core/.gitignore",
    "chars": 45,
    "preview": "exports/\ndocs/\n.pytest_cache/\n**/__pycache__/"
  },
  {
    "path": "core/.mcp.json",
    "chars": 153,
    "preview": "{\n  \"mcpServers\": {\n    \"tools\": {\n      \"command\": \"python\",\n      \"args\": [\"-m\", \"aden_tools.mcp_server\", \"--stdio\"],\n"
  },
  {
    "path": "core/MCP_BUILDER_TOOLS_GUIDE.md",
    "chars": 9828,
    "preview": "# Agent Builder MCP Tools - MCP Integration Guide\n\nThis guide explains how to use the new MCP integration tools in the a"
  },
  {
    "path": "core/MCP_INTEGRATION_GUIDE.md",
    "chars": 8241,
    "preview": "# MCP Integration Guide\n\nThis guide explains how to integrate Model Context Protocol (MCP) servers with the Hive Core Fr"
  },
  {
    "path": "core/MCP_SERVER_GUIDE.md",
    "chars": 8605,
    "preview": "# MCP Server Guide - Agent Building Tools\n\n> **Note:** The standalone `agent-builder` MCP server (`framework.mcp.agent_b"
  },
  {
    "path": "core/README.md",
    "chars": 4133,
    "preview": "# Framework\n\nA goal-driven agent runtime with Builder-friendly observability.\n\n## Overview\n\nFramework provides a runtime"
  },
  {
    "path": "core/antigravity_auth.py",
    "chars": 19579,
    "preview": "#!/usr/bin/env python3\n\"\"\"Antigravity authentication CLI.\n\nImplements OAuth2 flow for Google's Antigravity Code Assist g"
  },
  {
    "path": "core/codex_oauth.py",
    "chars": 12421,
    "preview": "\"\"\"OpenAI Codex OAuth PKCE login flow.\n\nRuns the full browser-based OAuth flow so users can authenticate with their\nChat"
  },
  {
    "path": "core/examples/manual_agent.py",
    "chars": 4080,
    "preview": "\"\"\"\nMinimal Manual Agent Example\n----------------------------\nThis example demonstrates how to build and run an agent pr"
  },
  {
    "path": "core/examples/mcp_integration_example.py",
    "chars": 3246,
    "preview": "#!/usr/bin/env python3\n\"\"\"\nExample: Integrating MCP Servers with the Core Framework\n\nThis example demonstrates how to:\n1"
  },
  {
    "path": "core/examples/mcp_servers.json",
    "chars": 561,
    "preview": "{\n  \"servers\": [\n    {\n      \"name\": \"tools\",\n      \"description\": \"Aden tools including web search, file operations, an"
  },
  {
    "path": "core/framework/__init__.py",
    "chars": 1703,
    "preview": "\"\"\"\nAden Hive Framework: A goal-driven agent runtime optimized for Builder observability.\n\nThe runtime is designed aroun"
  },
  {
    "path": "core/framework/__main__.py",
    "chars": 166,
    "preview": "\"\"\"Allow running as ``python -m framework``, which powers the ``hive`` console entry point.\"\"\"\n\nfrom framework.cli impor"
  },
  {
    "path": "core/framework/agents/__init__.py",
    "chars": 350,
    "preview": "\"\"\"Framework-provided agents.\"\"\"\n\nfrom pathlib import Path\n\nFRAMEWORK_AGENTS_DIR = Path(__file__).parent\n\n\ndef list_fram"
  },
  {
    "path": "core/framework/agents/credential_tester/__init__.py",
    "chars": 1303,
    "preview": "\"\"\"\nCredential Tester — verify credentials (Aden OAuth + local API keys) via live API calls.\n\nInteractive agent that lis"
  },
  {
    "path": "core/framework/agents/credential_tester/__main__.py",
    "chars": 3304,
    "preview": "\"\"\"CLI entry point for Credential Tester agent.\"\"\"\n\nimport asyncio\n\nimport click\n\nfrom .agent import CredentialTesterAge"
  },
  {
    "path": "core/framework/agents/credential_tester/agent.py",
    "chars": 21792,
    "preview": "\"\"\"Credential Tester agent — verify credentials via live API calls.\n\nSupports both Aden OAuth2-synced accounts AND local"
  },
  {
    "path": "core/framework/agents/credential_tester/config.py",
    "chars": 483,
    "preview": "\"\"\"Runtime configuration for Credential Tester agent.\"\"\"\n\nfrom dataclasses import dataclass\n\nfrom framework.config impor"
  },
  {
    "path": "core/framework/agents/credential_tester/mcp_servers.json",
    "chars": 236,
    "preview": "{\n  \"hive-tools\": {\n    \"transport\": \"stdio\",\n    \"command\": \"uv\",\n    \"args\": [\"run\", \"python\", \"mcp_server.py\", \"--std"
  },
  {
    "path": "core/framework/agents/credential_tester/nodes/__init__.py",
    "chars": 2957,
    "preview": "\"\"\"Node definitions for Credential Tester agent.\"\"\"\n\nfrom framework.graph import NodeSpec\n\n\ndef build_tester_node(\n    p"
  },
  {
    "path": "core/framework/agents/discovery.py",
    "chars": 7476,
    "preview": "\"\"\"Agent discovery — scan known directories and return categorised AgentEntry lists.\"\"\"\n\nfrom __future__ import annotati"
  },
  {
    "path": "core/framework/agents/queen/__init__.py",
    "chars": 522,
    "preview": "\"\"\"\nQueen — Native agent builder for the Hive framework.\n\nDeeply understands the agent framework and produces complete P"
  },
  {
    "path": "core/framework/agents/queen/agent.py",
    "chars": 1031,
    "preview": "\"\"\"Queen graph definition.\"\"\"\n\nfrom framework.graph import Goal\nfrom framework.graph.edge import GraphSpec\n\nfrom .nodes "
  },
  {
    "path": "core/framework/agents/queen/config.py",
    "chars": 1556,
    "preview": "\"\"\"Runtime configuration for Queen agent.\"\"\"\n\nimport json\nfrom dataclasses import dataclass, field\nfrom pathlib import P"
  },
  {
    "path": "core/framework/agents/queen/mcp_servers.json",
    "chars": 259,
    "preview": "{\n  \"coder-tools\": {\n    \"transport\": \"stdio\",\n    \"command\": \"uv\",\n    \"args\": [\"run\", \"python\", \"coder_tools_server.py"
  },
  {
    "path": "core/framework/agents/queen/nodes/__init__.py",
    "chars": 58670,
    "preview": "\"\"\"Node definitions for Queen agent.\"\"\"\n\nfrom pathlib import Path\n\nfrom framework.graph import NodeSpec\n\n# Load referenc"
  },
  {
    "path": "core/framework/agents/queen/nodes/thinking_hook.py",
    "chars": 3144,
    "preview": "\"\"\"Queen thinking hook — HR persona classifier.\n\nFires once when the queen enters building mode at session start.\nMakes "
  },
  {
    "path": "core/framework/agents/queen/queen_memory.py",
    "chars": 15128,
    "preview": "\"\"\"Queen global cross-session memory.\n\nThree-tier memory architecture:\n  ~/.hive/queen/MEMORY.md                        "
  },
  {
    "path": "core/framework/agents/queen/reference/anti_patterns.md",
    "chars": 3545,
    "preview": "# Common Mistakes When Building Hive Agents\n\n## Critical Errors\n1. **Using tools that don't exist** — Always verify tool"
  },
  {
    "path": "core/framework/agents/queen/reference/file_templates.md",
    "chars": 19567,
    "preview": "# Agent File Templates\n\nComplete code templates for each file in a Hive agent package.\n\n## config.py\n\n```python\n\"\"\"Runti"
  },
  {
    "path": "core/framework/agents/queen/reference/framework_guide.md",
    "chars": 11836,
    "preview": "# Hive Agent Framework — Condensed Reference\n\n## Architecture\n\nAgents are Python packages in `exports/`:\n```\nexports/my_"
  },
  {
    "path": "core/framework/agents/queen/reference/gcu_guide.md",
    "chars": 5738,
    "preview": "# GCU Browser Automation Guide\n\n## When to Use GCU Nodes\n\nUse `node_type=\"gcu\"` when:\n- The user's workflow requires **n"
  },
  {
    "path": "core/framework/agents/queen/reference/queen_memory.md",
    "chars": 2423,
    "preview": "# Queen Memory — File System Structure\n\n```\n~/.hive/\n├── queen/\n│   ├── MEMORY.md                          ← Semantic me"
  },
  {
    "path": "core/framework/agents/queen/tests/__init__.py",
    "chars": 0,
    "preview": ""
  },
  {
    "path": "core/framework/agents/queen/tests/conftest.py",
    "chars": 745,
    "preview": "\"\"\"Test fixtures for Queen agent.\"\"\"\n\nimport sys\nfrom pathlib import Path\n\nimport pytest\nimport pytest_asyncio\n\n_repo_ro"
  },
  {
    "path": "core/framework/agents/queen/ticket_receiver.py",
    "chars": 969,
    "preview": "\"\"\"Queen's ticket receiver entry point.\n\nWhen a WORKER_ESCALATION_TICKET event is emitted on the shared EventBus,\nthis e"
  },
  {
    "path": "core/framework/agents/worker_memory.py",
    "chars": 10299,
    "preview": "\"\"\"Worker per-run digest (run diary).\n\nStorage layout:\n    ~/.hive/agents/{agent_name}/runs/{run_id}/digest.md\n\nEach com"
  },
  {
    "path": "core/framework/cli.py",
    "chars": 3633,
    "preview": "\"\"\"\nCommand-line interface for Aden Hive.\n\nUsage:\n    hive run exports/my-agent --input '{\"key\": \"value\"}'\n    hive info"
  },
  {
    "path": "core/framework/config.py",
    "chars": 16373,
    "preview": "\"\"\"Shared Hive configuration utilities.\n\nCentralises reading of ~/.hive/configuration.json so that the runner\nand every "
  },
  {
    "path": "core/framework/credentials/__init__.py",
    "chars": 4570,
    "preview": "\"\"\"\nCredential Store - Production-ready credential management for Hive.\n\nThis module provides secure credential storage "
  },
  {
    "path": "core/framework/credentials/aden/__init__.py",
    "chars": 1976,
    "preview": "\"\"\"\nAden Credential Sync.\n\nComponents for synchronizing credentials with the Aden authentication server.\n\nThe Aden serve"
  },
  {
    "path": "core/framework/credentials/aden/client.py",
    "chars": 13955,
    "preview": "\"\"\"\nAden Credential Client.\n\nHTTP client for the Aden authentication server.\nAden holds all OAuth secrets; agents receiv"
  },
  {
    "path": "core/framework/credentials/aden/provider.py",
    "chars": 14611,
    "preview": "\"\"\"\nAden Sync Provider.\n\nProvider that synchronizes credentials with the Aden authentication server.\nThe Aden server is "
  },
  {
    "path": "core/framework/credentials/aden/storage.py",
    "chars": 15550,
    "preview": "\"\"\"\nAden Cached Storage.\n\nStorage backend that combines local cache with Aden server fallback.\nProvides offline resilien"
  },
  {
    "path": "core/framework/credentials/aden/tests/__init__.py",
    "chars": 49,
    "preview": "\"\"\"Tests for Aden credential sync components.\"\"\"\n"
  },
  {
    "path": "core/framework/credentials/aden/tests/test_aden_sync.py",
    "chars": 29283,
    "preview": "\"\"\"\nTests for Aden credential sync components.\n\nTests cover:\n- AdenCredentialClient: HTTP client for Aden API\n- AdenSync"
  },
  {
    "path": "core/framework/credentials/key_storage.py",
    "chars": 6833,
    "preview": "\"\"\"\nDedicated file-based storage for bootstrap credentials.\n\nHIVE_CREDENTIAL_KEY -> ~/.hive/secrets/credential_key  (pla"
  },
  {
    "path": "core/framework/credentials/local/__init__.py",
    "chars": 993,
    "preview": "\"\"\"\nLocal credential registry — named API key accounts with identity metadata.\n\nProvides feature parity with Aden OAuth "
  },
  {
    "path": "core/framework/credentials/local/models.py",
    "chars": 1953,
    "preview": "\"\"\"\nData models for the local credential registry.\n\nLocalAccountInfo mirrors AdenIntegrationInfo, giving local API key c"
  },
  {
    "path": "core/framework/credentials/local/registry.py",
    "chars": 11743,
    "preview": "\"\"\"\nLocal Credential Registry.\n\nManages named local API key accounts stored in EncryptedFileStorage.\nMirrors the Aden in"
  },
  {
    "path": "core/framework/credentials/models.py",
    "chars": 10413,
    "preview": "\"\"\"\nCore data models for the credential store.\n\nThis module defines the key-vault structure where credentials are object"
  },
  {
    "path": "core/framework/credentials/oauth2/__init__.py",
    "chars": 2741,
    "preview": "\"\"\"\nOAuth2 support for the credential store.\n\nThis module provides OAuth2 credential management with:\n- Token types and "
  },
  {
    "path": "core/framework/credentials/oauth2/base_provider.py",
    "chars": 15727,
    "preview": "\"\"\"\nBase OAuth2 provider implementation.\n\nThis module provides a generic OAuth2 provider that works with standard\nOAuth2"
  },
  {
    "path": "core/framework/credentials/oauth2/hubspot_provider.py",
    "chars": 3409,
    "preview": "\"\"\"\nHubSpot-specific OAuth2 provider.\n\nPre-configured for HubSpot's OAuth2 endpoints and CRM scopes.\nExtends BaseOAuth2P"
  },
  {
    "path": "core/framework/credentials/oauth2/lifecycle.py",
    "chars": 11633,
    "preview": "\"\"\"\nToken lifecycle management for OAuth2 credentials.\n\nThis module provides the TokenLifecycleManager which coordinates"
  },
  {
    "path": "core/framework/credentials/oauth2/provider.py",
    "chars": 6885,
    "preview": "\"\"\"\nOAuth2 types and configuration.\n\nThis module defines the core OAuth2 data structures:\n- OAuth2Token: Represents an a"
  },
  {
    "path": "core/framework/credentials/oauth2/zoho_provider.py",
    "chars": 6998,
    "preview": "\"\"\"\nZoho CRM-specific OAuth2 provider.\n\nPre-configured for Zoho's OAuth2 endpoints and CRM scopes.\nExtends BaseOAuth2Pro"
  },
  {
    "path": "core/framework/credentials/provider.py",
    "chars": 8492,
    "preview": "\"\"\"\nProvider interface for credential lifecycle management.\n\nProviders handle credential lifecycle operations:\n- Refresh"
  },
  {
    "path": "core/framework/credentials/setup.py",
    "chars": 21595,
    "preview": "\"\"\"\nInteractive credential setup for CLI applications.\n\nProvides a modular, reusable credential setup flow that can be t"
  },
  {
    "path": "core/framework/credentials/storage.py",
    "chars": 17217,
    "preview": "\"\"\"\nStorage backends for the credential store.\n\nThis module provides abstract and concrete storage implementations:\n- Cr"
  },
  {
    "path": "core/framework/credentials/store.py",
    "chars": 24329,
    "preview": "\"\"\"\nMain credential store orchestrating storage, providers, and template resolution.\n\nThe CredentialStore is the primary"
  },
  {
    "path": "core/framework/credentials/template.py",
    "chars": 7362,
    "preview": "\"\"\"\nTemplate resolution system for credential injection.\n\nThis module handles {{cred.key}} patterns, enabling the bipart"
  },
  {
    "path": "core/framework/credentials/tests/__init__.py",
    "chars": 45,
    "preview": "\"\"\"Tests for the credential store module.\"\"\"\n"
  },
  {
    "path": "core/framework/credentials/tests/test_credential_store.py",
    "chars": 24098,
    "preview": "\"\"\"\nComprehensive tests for the credential store module.\n\nTests cover:\n- Core models (CredentialObject, CredentialKey, C"
  },
  {
    "path": "core/framework/credentials/validation.py",
    "chars": 21094,
    "preview": "\"\"\"Credential validation utilities.\n\nProvides reusable credential validation for agents, whether run through\nthe AgentRu"
  },
  {
    "path": "core/framework/debugger/__init__.py",
    "chars": 0,
    "preview": ""
  },
  {
    "path": "core/framework/debugger/cli.py",
    "chars": 2347,
    "preview": "\"\"\"CLI command for the LLM debug log viewer.\"\"\"\n\nimport argparse\nimport subprocess\nimport sys\nfrom pathlib import Path\n\n"
  },
  {
    "path": "core/framework/graph/__init__.py",
    "chars": 1484,
    "preview": "\"\"\"Graph structures: Goals, Nodes, Edges, and Execution.\"\"\"\n\nfrom framework.graph.client_io import (\n    ActiveNodeClien"
  },
  {
    "path": "core/framework/graph/checkpoint_config.py",
    "chars": 2402,
    "preview": "\"\"\"\nCheckpoint Configuration - Controls checkpoint behavior during execution.\n\"\"\"\n\nfrom dataclasses import dataclass\n\n\n@"
  },
  {
    "path": "core/framework/graph/client_io.py",
    "chars": 5929,
    "preview": "\"\"\"\nClient I/O gateway for graph nodes.\n\nProvides the bridge between node code and external clients:\n- ActiveNodeClientI"
  },
  {
    "path": "core/framework/graph/context_handoff.py",
    "chars": 6491,
    "preview": "\"\"\"Context handoff: summarize a completed NodeConversation for the next graph node.\"\"\"\n\nfrom __future__ import annotatio"
  },
  {
    "path": "core/framework/graph/conversation.py",
    "chars": 42178,
    "preview": "\"\"\"NodeConversation: Message history management for graph nodes.\"\"\"\n\nfrom __future__ import annotations\n\nimport json\nimp"
  },
  {
    "path": "core/framework/graph/conversation_judge.py",
    "chars": 7351,
    "preview": "\"\"\"Level 2 Conversation-Aware Judge.\n\nWhen a node has `success_criteria` set, the implicit judge upgrades:\nafter Level 0"
  },
  {
    "path": "core/framework/graph/edge.py",
    "chars": 25186,
    "preview": "\"\"\"\nEdge Protocol - How nodes connect in a graph.\n\nEdges define:\n1. Source and target nodes\n2. Conditions for traversal\n"
  },
  {
    "path": "core/framework/graph/event_loop_node.py",
    "chars": 242810,
    "preview": "\"\"\"EventLoopNode: Multi-turn LLM streaming loop with tool execution and judge evaluation.\n\nImplements NodeProtocol and r"
  },
  {
    "path": "core/framework/graph/executor.py",
    "chars": 109568,
    "preview": "\"\"\"\nGraph Executor - Runs agent graphs.\n\nThe executor:\n1. Takes a GraphSpec and Goal\n2. Initializes shared memory\n3. Exe"
  },
  {
    "path": "core/framework/graph/files.py",
    "chars": 901,
    "preview": "\"\"\"File tools MCP server constants.\n\nAnalogous to ``gcu.py`` — defines the server name and default stdio config\nso the r"
  },
  {
    "path": "core/framework/graph/gcu.py",
    "chars": 5625,
    "preview": "\"\"\"GCU (browser automation) node type constants.\n\nA ``gcu`` node is an ``event_loop`` node with two automatic enhancemen"
  },
  {
    "path": "core/framework/graph/goal.py",
    "chars": 6509,
    "preview": "\"\"\"\nGoal Schema - The source of truth for agent behavior.\n\nA Goal defines WHAT the agent should achieve, not HOW. The gr"
  },
  {
    "path": "core/framework/graph/node.py",
    "chars": 22763,
    "preview": "\"\"\"\nNode Protocol - The building block of agent graphs.\n\nA Node is a unit of work that:\n1. Receives context (goal, share"
  },
  {
    "path": "core/framework/graph/prompt_composer.py",
    "chars": 14373,
    "preview": "\"\"\"Prompt composition for continuous agent mode.\n\nComposes the three-layer system prompt (onion model) and generates\ntra"
  },
  {
    "path": "core/framework/graph/safe_eval.py",
    "chars": 9236,
    "preview": "import ast\nimport operator\nfrom typing import Any\n\n# Safe operators whitelist\nSAFE_OPERATORS = {\n    ast.Add: operator.a"
  },
  {
    "path": "core/framework/graph/validator.py",
    "chars": 10119,
    "preview": "\"\"\"Output validation for agent nodes.\n\nValidates node outputs against schemas and expected keys to prevent\ngarbage from "
  },
  {
    "path": "core/framework/llm/__init__.py",
    "chars": 1005,
    "preview": "\"\"\"LLM provider abstraction.\"\"\"\n\nfrom framework.llm.provider import LLMProvider, LLMResponse\nfrom framework.llm.stream_e"
  },
  {
    "path": "core/framework/llm/anthropic.py",
    "chars": 3255,
    "preview": "\"\"\"Anthropic Claude LLM provider - backward compatible wrapper around LiteLLM.\"\"\"\n\nimport os\nfrom typing import Any\n\nfro"
  },
  {
    "path": "core/framework/llm/antigravity.py",
    "chars": 26990,
    "preview": "\"\"\"Antigravity (Google internal Cloud Code Assist) LLM provider.\n\nAntigravity is Google's unified gateway API that route"
  },
  {
    "path": "core/framework/llm/litellm.py",
    "chars": 82790,
    "preview": "\"\"\"LiteLLM provider for pluggable multi-provider LLM support.\n\nLiteLLM provides a unified, OpenAI-compatible interface t"
  },
  {
    "path": "core/framework/llm/mock.py",
    "chars": 6399,
    "preview": "\"\"\"Mock LLM Provider for testing and structural validation without real LLM calls.\"\"\"\n\nimport json\nimport re\nfrom collec"
  },
  {
    "path": "core/framework/llm/provider.py",
    "chars": 4809,
    "preview": "\"\"\"LLM Provider abstraction for pluggable LLM backends.\"\"\"\n\nimport asyncio\nfrom abc import ABC, abstractmethod\nfrom coll"
  },
  {
    "path": "core/framework/llm/stream_events.py",
    "chars": 2292,
    "preview": "\"\"\"Stream event types for LLM streaming responses.\n\nDefines a discriminated union of frozen dataclasses representing eve"
  },
  {
    "path": "core/framework/monitoring/__init__.py",
    "chars": 49,
    "preview": "\"\"\"Framework-level worker monitoring package.\"\"\"\n"
  },
  {
    "path": "core/framework/observability/README.md",
    "chars": 6604,
    "preview": "# Observability - Structured Logging\n\n## Configuration via Environment Variables\n\nControl logging format using environme"
  },
  {
    "path": "core/framework/observability/__init__.py",
    "chars": 563,
    "preview": "\"\"\"\nObservability module for automatic trace correlation and structured logging.\n\nThis module provides zero-friction obs"
  },
  {
    "path": "core/framework/observability/logging.py",
    "chars": 10530,
    "preview": "\"\"\"\nStructured logging with automatic trace context propagation.\n\nKey Features:\n- Zero developer friction: Standard logg"
  },
  {
    "path": "core/framework/runner/__init__.py",
    "chars": 680,
    "preview": "\"\"\"Agent Runner - load and run exported agents.\"\"\"\n\nfrom framework.runner.orchestrator import AgentOrchestrator\nfrom fra"
  },
  {
    "path": "core/framework/runner/cli.py",
    "chars": 58457,
    "preview": "\"\"\"CLI commands for agent runner.\"\"\"\n\nimport argparse\nimport asyncio\nimport json\nimport sys\nfrom pathlib import Path\n\n\nd"
  },
  {
    "path": "core/framework/runner/mcp_client.py",
    "chars": 27118,
    "preview": "\"\"\"MCP Client for connecting to Model Context Protocol servers.\n\nThis module provides a client for connecting to MCP ser"
  },
  {
    "path": "core/framework/runner/mcp_connection_manager.py",
    "chars": 9611,
    "preview": "\"\"\"Shared MCP client connection management.\"\"\"\n\nimport logging\nimport threading\nfrom typing import Any\n\nimport httpx\n\nfr"
  },
  {
    "path": "core/framework/runner/orchestrator.py",
    "chars": 16500,
    "preview": "\"\"\"Agent Orchestrator - routes requests and relays messages between agents.\"\"\"\n\nfrom __future__ import annotations\n\nimpo"
  },
  {
    "path": "core/framework/runner/preload_validation.py",
    "chars": 6037,
    "preview": "\"\"\"Pre-load validation for agent graphs.\n\nRuns structural, credential, and skill-trust checks before MCP servers are spa"
  },
  {
    "path": "core/framework/runner/protocol.py",
    "chars": 3268,
    "preview": "\"\"\"Message protocol for multi-agent communication.\"\"\"\n\nimport uuid\nfrom dataclasses import dataclass, field\nfrom datetim"
  },
  {
    "path": "core/framework/runner/runner.py",
    "chars": 94729,
    "preview": "\"\"\"Agent Runner - loads and runs exported agents.\"\"\"\n\nimport json\nimport logging\nimport os\nfrom collections.abc import C"
  },
  {
    "path": "core/framework/runner/tool_registry.py",
    "chars": 31305,
    "preview": "\"\"\"Tool discovery and registration for agent runner.\"\"\"\n\nimport asyncio\nimport contextvars\nimport importlib.util\nimport "
  },
  {
    "path": "core/framework/runtime/EVENT_TYPES.md",
    "chars": 19251,
    "preview": "# Event Types and Schema Reference\n\nThe Hive runtime uses a pub/sub `EventBus` for inter-component communication and obs"
  },
  {
    "path": "core/framework/runtime/README.md",
    "chars": 6179,
    "preview": "# Agent Runtime\n\nUnified execution system for all Hive agents. Every agent — single-entry or multi-entry, headless or TU"
  },
  {
    "path": "core/framework/runtime/RESUMABLE_SESSIONS_DESIGN.md",
    "chars": 25490,
    "preview": "# Resumable Sessions Design\n\n## Problem Statement\n\nCurrently, when an agent encounters a failure during execution (e.g.,"
  },
  {
    "path": "core/framework/runtime/RUNTIME_LOGGING.md",
    "chars": 19753,
    "preview": "# Runtime Logging System\n\n## Overview\n\nThe Hive framework uses a **three-level observability system** for tracking agent"
  },
  {
    "path": "core/framework/runtime/__init__.py",
    "chars": 107,
    "preview": "\"\"\"Runtime core for agent execution.\"\"\"\n\nfrom framework.runtime.core import Runtime\n\n__all__ = [\"Runtime\"]\n"
  },
  {
    "path": "core/framework/runtime/agent_runtime.py",
    "chars": 78581,
    "preview": "\"\"\"\nAgent Runtime - Top-level orchestrator for multi-entry-point agents.\n\nManages agent lifecycle and coordinates multip"
  },
  {
    "path": "core/framework/runtime/core.py",
    "chars": 12983,
    "preview": "\"\"\"\nRuntime Core - The interface agents use to record their behavior.\n\nThis is designed to make it EASY for agents to re"
  },
  {
    "path": "core/framework/runtime/escalation_ticket.py",
    "chars": 1442,
    "preview": "\"\"\"EscalationTicket — structured schema for worker health escalations.\"\"\"\n\nfrom __future__ import annotations\n\nfrom date"
  },
  {
    "path": "core/framework/runtime/event_bus.py",
    "chars": 42976,
    "preview": "\"\"\"\nEvent Bus - Pub/sub event system for inter-stream communication.\n\nAllows streams to:\n- Publish events about their ex"
  },
  {
    "path": "core/framework/runtime/execution_stream.py",
    "chars": 50353,
    "preview": "\"\"\"\nExecution Stream - Manages concurrent executions for a single entry point.\n\nEach stream has:\n- Its own StreamRuntime"
  },
  {
    "path": "core/framework/runtime/llm_debug_logger.py",
    "chars": 2413,
    "preview": "\"\"\"Write every LLM turn to ~/.hive/llm_logs/<ts>.jsonl for replay/debugging.\n\nEach line is a JSON object with the full L"
  },
  {
    "path": "core/framework/runtime/outcome_aggregator.py",
    "chars": 15564,
    "preview": "\"\"\"\nOutcome Aggregator - Aggregates outcomes across streams for goal evaluation.\n\nThe goal-driven nature of Hive means w"
  },
  {
    "path": "core/framework/runtime/runtime_log_schemas.py",
    "chars": 5100,
    "preview": "\"\"\"Pydantic models for the three-level runtime logging system.\n\nLevel 1 - SUMMARY:    Per graph run pass/fail, token cou"
  },
  {
    "path": "core/framework/runtime/runtime_log_store.py",
    "chars": 12089,
    "preview": "\"\"\"File-based storage for runtime logs.\n\nEach run gets its own directory under ``runs/``. No shared mutable index —\n``li"
  },
  {
    "path": "core/framework/runtime/runtime_logger.py",
    "chars": 11301,
    "preview": "\"\"\"RuntimeLogger: captures runtime data during graph execution.\n\nInjected into GraphExecutor as an optional parameter. E"
  },
  {
    "path": "core/framework/runtime/shared_state.py",
    "chars": 15985,
    "preview": "\"\"\"\nShared State Manager - Manages state across concurrent executions.\n\nProvides different isolation levels:\n- ISOLATED:"
  },
  {
    "path": "core/framework/runtime/stream_runtime.py",
    "chars": 17327,
    "preview": "\"\"\"\nStream Runtime - Thread-safe runtime for concurrent executions.\n\nUnlike the original Runtime which has a single _cur"
  },
  {
    "path": "core/framework/runtime/tests/__init__.py",
    "chars": 36,
    "preview": "\"\"\"Tests for runtime components.\"\"\"\n"
  },
  {
    "path": "core/framework/runtime/tests/test_agent_runtime.py",
    "chars": 26043,
    "preview": "\"\"\"\nTests for AgentRuntime and multi-entry-point execution.\n\nTests:\n1. AgentRuntime creation and lifecycle\n2. Entry poin"
  },
  {
    "path": "core/framework/runtime/tests/test_runtime_logging_paths.py",
    "chars": 1044,
    "preview": "\"\"\"Tests for custom session-backed runtime logging paths.\"\"\"\n\nfrom pathlib import Path\nfrom unittest.mock import MagicMo"
  },
  {
    "path": "core/framework/runtime/tests/test_webhook_server.py",
    "chars": 22587,
    "preview": "\"\"\"\nTests for WebhookServer and event-driven entry points.\n\"\"\"\n\nimport asyncio\nimport hashlib\nimport hmac as hmac_mod\nim"
  },
  {
    "path": "core/framework/runtime/triggers.py",
    "chars": 639,
    "preview": "\"\"\"Trigger definitions for queen-level heartbeats (timers, webhooks).\"\"\"\n\nfrom __future__ import annotations\n\nfrom datac"
  },
  {
    "path": "core/framework/runtime/webhook_server.py",
    "chars": 5467,
    "preview": "\"\"\"\nWebhook HTTP Server - Receives HTTP requests and publishes them as EventBus events.\n\nOnly starts if webhook-type ent"
  },
  {
    "path": "core/framework/schemas/__init__.py",
    "chars": 318,
    "preview": "\"\"\"Schema definitions for runtime data.\"\"\"\n\nfrom framework.schemas.decision import Decision, DecisionEvaluation, Option,"
  },
  {
    "path": "core/framework/schemas/checkpoint.py",
    "chars": 6311,
    "preview": "\"\"\"\nCheckpoint Schema - Execution state snapshots for resumability.\n\nCheckpoints capture the execution state at strategi"
  },
  {
    "path": "core/framework/schemas/decision.py",
    "chars": 5601,
    "preview": "\"\"\"\nDecision Schema - The atomic unit of agent behavior that Builder cares about.\n\nA Decision captures a moment where th"
  },
  {
    "path": "core/framework/schemas/run.py",
    "chars": 8027,
    "preview": "\"\"\"\nRun Schema - A complete execution of an agent graph.\n\nA Run contains all the decisions made during execution, along "
  },
  {
    "path": "core/framework/schemas/session_state.py",
    "chars": 11070,
    "preview": "\"\"\"\nSession State Schema - Unified state for session execution.\n\nThis schema consolidates data from Run, ExecutionResult"
  },
  {
    "path": "core/framework/server/README.md",
    "chars": 12421,
    "preview": "# Hive Server\n\nHTTP API backend for the Hive agent framework. Built on **aiohttp**, fully async, serving the frontend wo"
  },
  {
    "path": "core/framework/server/__init__.py",
    "chars": 52,
    "preview": "\"\"\"HTTP API server for the Hive agent framework.\"\"\"\n"
  },
  {
    "path": "core/framework/server/app.py",
    "chars": 10534,
    "preview": "\"\"\"aiohttp Application factory for the Hive HTTP API server.\"\"\"\n\nimport logging\nimport os\nfrom pathlib import Path\n\nfrom"
  },
  {
    "path": "core/framework/server/queen_orchestrator.py",
    "chars": 14448,
    "preview": "\"\"\"Queen orchestrator — builds and runs the queen executor.\n\nExtracted from SessionManager._start_queen() to keep sessio"
  },
  {
    "path": "core/framework/server/routes_credentials.py",
    "chars": 8378,
    "preview": "\"\"\"Credential CRUD routes.\"\"\"\n\nimport asyncio\nimport logging\n\nfrom aiohttp import web\nfrom pydantic import SecretStr\n\nfr"
  },
  {
    "path": "core/framework/server/routes_events.py",
    "chars": 10095,
    "preview": "\"\"\"SSE event streaming route.\"\"\"\n\nimport asyncio\nimport logging\n\nfrom aiohttp import web\nfrom aiohttp.client_exceptions "
  },
  {
    "path": "core/framework/server/routes_execution.py",
    "chars": 19224,
    "preview": "\"\"\"Execution control routes — trigger, inject, chat, resume, stop, replay.\"\"\"\n\nimport asyncio\nimport json\nimport logging"
  },
  {
    "path": "core/framework/server/routes_graphs.py",
    "chars": 11562,
    "preview": "\"\"\"Graph and node inspection routes — node list, node detail, node criteria.\"\"\"\n\nimport json\nimport logging\nimport time\n"
  },
  {
    "path": "core/framework/server/routes_logs.py",
    "chars": 4236,
    "preview": "\"\"\"Log and observability routes — agent logs, node-scoped logs.\"\"\"\n\nimport json\nimport logging\n\nfrom aiohttp import web\n"
  },
  {
    "path": "core/framework/server/routes_sessions.py",
    "chars": 39164,
    "preview": "\"\"\"Session lifecycle, info, and worker-session browsing routes.\n\nSession-primary routes:\n- POST   /api/sessions         "
  },
  {
    "path": "core/framework/server/session_manager.py",
    "chars": 59137,
    "preview": "\"\"\"Session-primary lifecycle manager for the HTTP API server.\n\nSessions (queen) are the primary entity. Workers are opti"
  },
  {
    "path": "core/framework/server/sse.py",
    "chars": 2242,
    "preview": "\"\"\"Server-Sent Events helper wrapping aiohttp StreamResponse.\"\"\"\n\nimport json\nimport logging\n\nfrom aiohttp import web\n\nl"
  },
  {
    "path": "core/framework/server/tests/__init__.py",
    "chars": 0,
    "preview": ""
  },
  {
    "path": "core/framework/server/tests/test_api.py",
    "chars": 69775,
    "preview": "\"\"\"\nComprehensive tests for the Hive HTTP API server.\n\nUses aiohttp TestClient with mocked sessions to test all endpoint"
  },
  {
    "path": "core/framework/skills/__init__.py",
    "chars": 1263,
    "preview": "\"\"\"Hive Agent Skills — discovery, parsing, trust gating, and injection of SKILL.md packages.\n\nImplements the open Agent "
  },
  {
    "path": "core/framework/skills/_default_skills/batch-ledger/SKILL.md",
    "chars": 784,
    "preview": "---\nname: hive.batch-ledger\ndescription: Track per-item status when processing collections to prevent skipped or duplica"
  },
  {
    "path": "core/framework/skills/_default_skills/context-preservation/SKILL.md",
    "chars": 826,
    "preview": "---\nname: hive.context-preservation\ndescription: Proactively preserve critical information before automatic context prun"
  },
  {
    "path": "core/framework/skills/_default_skills/error-recovery/SKILL.md",
    "chars": 656,
    "preview": "---\nname: hive.error-recovery\ndescription: Follow a structured recovery protocol when tool calls fail instead of blindly"
  },
  {
    "path": "core/framework/skills/_default_skills/note-taking/SKILL.md",
    "chars": 879,
    "preview": "---\nname: hive.note-taking\ndescription: Maintain structured working notes throughout execution to prevent information lo"
  },
  {
    "path": "core/framework/skills/_default_skills/quality-monitor/SKILL.md",
    "chars": 690,
    "preview": "---\nname: hive.quality-monitor\ndescription: Periodically self-assess output quality to catch degradation before the judg"
  },
  {
    "path": "core/framework/skills/_default_skills/task-decomposition/SKILL.md",
    "chars": 596,
    "preview": "---\nname: hive.task-decomposition\ndescription: Decompose complex tasks into explicit subtasks before diving in.\nmetadata"
  },
  {
    "path": "core/framework/skills/catalog.py",
    "chars": 4380,
    "preview": "\"\"\"Skill catalog — in-memory index with system prompt generation.\n\nBuilds the XML catalog injected into the system promp"
  },
  {
    "path": "core/framework/skills/cli.py",
    "chars": 3905,
    "preview": "\"\"\"CLI commands for the Hive skill system.\n\nPhase 1 commands (AS-13):\n  hive skill list             — list discovered sk"
  },
  {
    "path": "core/framework/skills/config.py",
    "chars": 3393,
    "preview": "\"\"\"Skill configuration dataclasses.\n\nHandles agent-level skill configuration from module-level variables\n(``default_skil"
  },
  {
    "path": "core/framework/skills/defaults.py",
    "chars": 6937,
    "preview": "\"\"\"DefaultSkillManager — load, configure, and inject built-in default skills.\n\nDefault skills are SKILL.md packages ship"
  },
  {
    "path": "core/framework/skills/discovery.py",
    "chars": 6063,
    "preview": "\"\"\"Skill discovery — scan standard directories for SKILL.md files.\n\nImplements the Agent Skills standard discovery paths"
  },
  {
    "path": "core/framework/skills/manager.py",
    "chars": 7316,
    "preview": "\"\"\"Unified skill lifecycle manager.\n\n``SkillsManager`` is the single facade that owns skill discovery, loading,\nand prom"
  },
  {
    "path": "core/framework/skills/models.py",
    "chars": 1304,
    "preview": "\"\"\"Data models for the Hive skill system (Agent Skills standard).\"\"\"\n\nfrom __future__ import annotations\n\nfrom dataclass"
  },
  {
    "path": "core/framework/skills/parser.py",
    "chars": 7793,
    "preview": "\"\"\"SKILL.md parser — extracts YAML frontmatter and markdown body.\n\nParses SKILL.md files per the Agent Skills standard ("
  },
  {
    "path": "core/framework/skills/skill_errors.py",
    "chars": 2035,
    "preview": "\"\"\"Structured error codes and diagnostics for the Hive skill system.\n\nImplements DX-1 (structured error codes) and DX-2 "
  },
  {
    "path": "core/framework/skills/trust.py",
    "chars": 16961,
    "preview": "\"\"\"Trust gating for project-level skills (PRD AS-13).\n\nProject-level skills from untrusted repositories require explicit"
  },
  {
    "path": "core/framework/storage/__init__.py",
    "chars": 215,
    "preview": "\"\"\"Storage backends for runtime data.\"\"\"\n\nfrom framework.storage.backend import FileStorage\nfrom framework.storage.conve"
  },
  {
    "path": "core/framework/storage/backend.py",
    "chars": 9648,
    "preview": "\"\"\"\nFile-based storage backend for runtime data.\n\nDEPRECATED: This storage backend is deprecated for new sessions.\nNew s"
  },
  {
    "path": "core/framework/storage/checkpoint_store.py",
    "chars": 10151,
    "preview": "\"\"\"\nCheckpoint Store - Manages checkpoint storage with atomic writes.\n\nHandles saving, loading, listing, and pruning of "
  }
]

// ... and 872 more files (download for full content)

About this extraction

This page contains the full source code of the aden-hive/hive GitHub repository, extracted and formatted as plain text for AI agents and large language models (LLMs). The extraction includes 1072 files (9.8 MB), approximately 2.6M tokens, and a symbol index with 9257 extracted functions, classes, methods, constants, and types. Use this with OpenClaw, Claude, ChatGPT, Cursor, Windsurf, or any other AI tool that accepts text input. You can copy the full output to your clipboard or download it as a .txt file.

Extracted by GitExtract — free GitHub repo to text converter for AI. Built by Nikandr Surkov.

Copied to clipboard!