emdash-core 0.1.16__tar.gz → 0.1.50__tar.gz
This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
- {emdash_core-0.1.16 → emdash_core-0.1.50}/PKG-INFO +7 -6
- {emdash_core-0.1.16 → emdash_core-0.1.50}/emdash_core/agent/__init__.py +4 -0
- {emdash_core-0.1.16 → emdash_core-0.1.50}/emdash_core/agent/agents.py +93 -23
- emdash_core-0.1.50/emdash_core/agent/background.py +481 -0
- {emdash_core-0.1.16 → emdash_core-0.1.50}/emdash_core/agent/events.py +52 -1
- emdash_core-0.1.50/emdash_core/agent/hooks.py +419 -0
- {emdash_core-0.1.16 → emdash_core-0.1.50}/emdash_core/agent/inprocess_subagent.py +236 -19
- {emdash_core-0.1.16 → emdash_core-0.1.50}/emdash_core/agent/mcp/config.py +78 -2
- {emdash_core-0.1.16 → emdash_core-0.1.50}/emdash_core/agent/prompts/__init__.py +6 -0
- emdash_core-0.1.50/emdash_core/agent/prompts/main_agent.py +241 -0
- emdash_core-0.1.50/emdash_core/agent/prompts/plan_mode.py +276 -0
- emdash_core-0.1.50/emdash_core/agent/prompts/subagents.py +287 -0
- emdash_core-0.1.50/emdash_core/agent/prompts/workflow.py +501 -0
- {emdash_core-0.1.16 → emdash_core-0.1.50}/emdash_core/agent/providers/base.py +4 -0
- {emdash_core-0.1.16 → emdash_core-0.1.50}/emdash_core/agent/providers/factory.py +2 -2
- {emdash_core-0.1.16 → emdash_core-0.1.50}/emdash_core/agent/providers/models.py +7 -0
- {emdash_core-0.1.16 → emdash_core-0.1.50}/emdash_core/agent/providers/openai_provider.py +137 -13
- {emdash_core-0.1.16 → emdash_core-0.1.50}/emdash_core/agent/research/researcher.py +154 -45
- emdash_core-0.1.50/emdash_core/agent/runner/__init__.py +49 -0
- emdash_core-0.1.50/emdash_core/agent/runner/agent_runner.py +882 -0
- emdash_core-0.1.50/emdash_core/agent/runner/context.py +470 -0
- emdash_core-0.1.50/emdash_core/agent/runner/factory.py +108 -0
- emdash_core-0.1.50/emdash_core/agent/runner/plan.py +217 -0
- emdash_core-0.1.50/emdash_core/agent/runner/sdk_runner.py +324 -0
- emdash_core-0.1.50/emdash_core/agent/runner/utils.py +67 -0
- emdash_core-0.1.50/emdash_core/agent/skills.py +438 -0
- {emdash_core-0.1.16 → emdash_core-0.1.50}/emdash_core/agent/toolkit.py +172 -16
- emdash_core-0.1.50/emdash_core/agent/toolkits/__init__.py +163 -0
- emdash_core-0.1.50/emdash_core/agent/toolkits/base.py +181 -0
- {emdash_core-0.1.16 → emdash_core-0.1.50}/emdash_core/agent/toolkits/explore.py +18 -0
- {emdash_core-0.1.16 → emdash_core-0.1.50}/emdash_core/agent/toolkits/plan.py +27 -11
- {emdash_core-0.1.16 → emdash_core-0.1.50}/emdash_core/agent/tools/__init__.py +5 -2
- emdash_core-0.1.50/emdash_core/agent/tools/coding.py +820 -0
- emdash_core-0.1.50/emdash_core/agent/tools/lsp.py +361 -0
- emdash_core-0.1.50/emdash_core/agent/tools/modes.py +305 -0
- {emdash_core-0.1.16 → emdash_core-0.1.50}/emdash_core/agent/tools/search.py +4 -0
- emdash_core-0.1.50/emdash_core/agent/tools/skill.py +213 -0
- {emdash_core-0.1.16 → emdash_core-0.1.50}/emdash_core/agent/tools/spec.py +61 -94
- {emdash_core-0.1.16 → emdash_core-0.1.50}/emdash_core/agent/tools/task.py +67 -24
- emdash_core-0.1.50/emdash_core/agent/tools/task_output.py +434 -0
- {emdash_core-0.1.16 → emdash_core-0.1.50}/emdash_core/agent/tools/tasks.py +15 -78
- emdash_core-0.1.50/emdash_core/agent/verifier/__init__.py +11 -0
- emdash_core-0.1.50/emdash_core/agent/verifier/manager.py +295 -0
- emdash_core-0.1.50/emdash_core/agent/verifier/models.py +97 -0
- emdash_core-0.1.16/emdash_core/swarm/worktree_manager.py → emdash_core-0.1.50/emdash_core/agent/worktree.py +19 -1
- emdash_core-0.1.50/emdash_core/api/agent.py +1294 -0
- {emdash_core-0.1.16 → emdash_core-0.1.50}/emdash_core/api/research.py +3 -3
- {emdash_core-0.1.16 → emdash_core-0.1.50}/emdash_core/api/router.py +2 -4
- emdash_core-0.1.50/emdash_core/api/skills.py +241 -0
- emdash_core-0.1.50/emdash_core/checkpoint/__init__.py +40 -0
- emdash_core-0.1.50/emdash_core/checkpoint/cli.py +175 -0
- emdash_core-0.1.50/emdash_core/checkpoint/git_operations.py +250 -0
- emdash_core-0.1.50/emdash_core/checkpoint/manager.py +231 -0
- emdash_core-0.1.50/emdash_core/checkpoint/models.py +107 -0
- emdash_core-0.1.50/emdash_core/checkpoint/storage.py +201 -0
- {emdash_core-0.1.16 → emdash_core-0.1.50}/emdash_core/config.py +1 -1
- emdash_core-0.1.50/emdash_core/context/longevity.py +197 -0
- {emdash_core-0.1.16 → emdash_core-0.1.50}/emdash_core/context/providers/explored_areas.py +83 -39
- emdash_core-0.1.50/emdash_core/context/reranker.py +90 -0
- emdash_core-0.1.50/emdash_core/context/simple_reranker.py +500 -0
- emdash_core-0.1.50/emdash_core/context/tool_relevance.py +84 -0
- {emdash_core-0.1.16 → emdash_core-0.1.50}/emdash_core/core/config.py +10 -2
- {emdash_core-0.1.16 → emdash_core-0.1.50}/emdash_core/graph/__init__.py +8 -1
- {emdash_core-0.1.16 → emdash_core-0.1.50}/emdash_core/graph/connection.py +24 -3
- {emdash_core-0.1.16 → emdash_core-0.1.50}/emdash_core/graph/writer.py +7 -1
- emdash_core-0.1.50/emdash_core/ingestion/repository.py +165 -0
- {emdash_core-0.1.16 → emdash_core-0.1.50}/emdash_core/models/agent.py +15 -1
- {emdash_core-0.1.16 → emdash_core-0.1.50}/emdash_core/server.py +1 -6
- emdash_core-0.1.50/emdash_core/skills/frontend-design/SKILL.md +56 -0
- {emdash_core-0.1.16 → emdash_core-0.1.50}/emdash_core/sse/stream.py +21 -1
- {emdash_core-0.1.16 → emdash_core-0.1.50}/emdash_core/utils/__init__.py +0 -2
- emdash_core-0.1.50/emdash_core/utils/git.py +187 -0
- {emdash_core-0.1.16 → emdash_core-0.1.50}/emdash_core/utils/image.py +124 -159
- {emdash_core-0.1.16 → emdash_core-0.1.50}/pyproject.toml +14 -7
- emdash_core-0.1.16/emdash_core/agent/prompts/main_agent.py +0 -104
- emdash_core-0.1.16/emdash_core/agent/prompts/subagents.py +0 -131
- emdash_core-0.1.16/emdash_core/agent/prompts/workflow.py +0 -136
- emdash_core-0.1.16/emdash_core/agent/runner.py +0 -775
- emdash_core-0.1.16/emdash_core/agent/toolkits/__init__.py +0 -64
- emdash_core-0.1.16/emdash_core/agent/toolkits/base.py +0 -96
- emdash_core-0.1.16/emdash_core/agent/tools/coding.py +0 -484
- emdash_core-0.1.16/emdash_core/agent/tools/modes.py +0 -153
- emdash_core-0.1.16/emdash_core/agent/tools/task_output.py +0 -204
- emdash_core-0.1.16/emdash_core/api/agent.py +0 -308
- emdash_core-0.1.16/emdash_core/api/swarm.py +0 -223
- emdash_core-0.1.16/emdash_core/context/reranker.py +0 -199
- emdash_core-0.1.16/emdash_core/db/__init__.py +0 -67
- emdash_core-0.1.16/emdash_core/db/auth.py +0 -134
- emdash_core-0.1.16/emdash_core/db/models.py +0 -91
- emdash_core-0.1.16/emdash_core/db/provider.py +0 -222
- emdash_core-0.1.16/emdash_core/db/providers/__init__.py +0 -5
- emdash_core-0.1.16/emdash_core/db/providers/supabase.py +0 -452
- emdash_core-0.1.16/emdash_core/ingestion/repository.py +0 -346
- emdash_core-0.1.16/emdash_core/swarm/__init__.py +0 -17
- emdash_core-0.1.16/emdash_core/swarm/merge_agent.py +0 -383
- emdash_core-0.1.16/emdash_core/swarm/session_manager.py +0 -274
- emdash_core-0.1.16/emdash_core/swarm/swarm_runner.py +0 -226
- emdash_core-0.1.16/emdash_core/swarm/task_definition.py +0 -137
- emdash_core-0.1.16/emdash_core/swarm/worker_spawner.py +0 -319
- emdash_core-0.1.16/emdash_core/utils/git.py +0 -84
- {emdash_core-0.1.16 → emdash_core-0.1.50}/emdash_core/__init__.py +0 -0
- {emdash_core-0.1.16 → emdash_core-0.1.50}/emdash_core/agent/code_reviewer.py +0 -0
- {emdash_core-0.1.16 → emdash_core-0.1.50}/emdash_core/agent/compaction.py +0 -0
- {emdash_core-0.1.16 → emdash_core-0.1.50}/emdash_core/agent/context_manager.py +0 -0
- {emdash_core-0.1.16 → emdash_core-0.1.50}/emdash_core/agent/handlers.py +0 -0
- {emdash_core-0.1.16 → emdash_core-0.1.50}/emdash_core/agent/mcp/__init__.py +0 -0
- {emdash_core-0.1.16 → emdash_core-0.1.50}/emdash_core/agent/mcp/client.py +0 -0
- {emdash_core-0.1.16 → emdash_core-0.1.50}/emdash_core/agent/mcp/manager.py +0 -0
- {emdash_core-0.1.16 → emdash_core-0.1.50}/emdash_core/agent/mcp/tool_factory.py +0 -0
- {emdash_core-0.1.16 → emdash_core-0.1.50}/emdash_core/agent/providers/__init__.py +0 -0
- {emdash_core-0.1.16 → emdash_core-0.1.50}/emdash_core/agent/providers/transformers_provider.py +0 -0
- {emdash_core-0.1.16 → emdash_core-0.1.50}/emdash_core/agent/research/__init__.py +0 -0
- {emdash_core-0.1.16 → emdash_core-0.1.50}/emdash_core/agent/research/agent.py +0 -0
- {emdash_core-0.1.16 → emdash_core-0.1.50}/emdash_core/agent/research/controller.py +0 -0
- {emdash_core-0.1.16 → emdash_core-0.1.50}/emdash_core/agent/research/critic.py +0 -0
- {emdash_core-0.1.16 → emdash_core-0.1.50}/emdash_core/agent/research/macros.py +0 -0
- {emdash_core-0.1.16 → emdash_core-0.1.50}/emdash_core/agent/research/planner.py +0 -0
- {emdash_core-0.1.16 → emdash_core-0.1.50}/emdash_core/agent/research/state.py +0 -0
- {emdash_core-0.1.16 → emdash_core-0.1.50}/emdash_core/agent/research/synthesizer.py +0 -0
- {emdash_core-0.1.16 → emdash_core-0.1.50}/emdash_core/agent/reviewer_profile.py +0 -0
- {emdash_core-0.1.16 → emdash_core-0.1.50}/emdash_core/agent/rules.py +0 -0
- {emdash_core-0.1.16 → emdash_core-0.1.50}/emdash_core/agent/session.py +0 -0
- {emdash_core-0.1.16 → emdash_core-0.1.50}/emdash_core/agent/spec_schema.py +0 -0
- {emdash_core-0.1.16 → emdash_core-0.1.50}/emdash_core/agent/specification.py +0 -0
- {emdash_core-0.1.16 → emdash_core-0.1.50}/emdash_core/agent/subagent.py +0 -0
- {emdash_core-0.1.16 → emdash_core-0.1.50}/emdash_core/agent/subagent_prompts.py +0 -0
- {emdash_core-0.1.16 → emdash_core-0.1.50}/emdash_core/agent/tools/analytics.py +0 -0
- {emdash_core-0.1.16 → emdash_core-0.1.50}/emdash_core/agent/tools/base.py +0 -0
- {emdash_core-0.1.16 → emdash_core-0.1.50}/emdash_core/agent/tools/github_mcp.py +0 -0
- {emdash_core-0.1.16 → emdash_core-0.1.50}/emdash_core/agent/tools/history.py +0 -0
- {emdash_core-0.1.16 → emdash_core-0.1.50}/emdash_core/agent/tools/plan.py +0 -0
- {emdash_core-0.1.16 → emdash_core-0.1.50}/emdash_core/agent/tools/plan_write.py +0 -0
- {emdash_core-0.1.16 → emdash_core-0.1.50}/emdash_core/agent/tools/traversal.py +0 -0
- {emdash_core-0.1.16 → emdash_core-0.1.50}/emdash_core/agent/tools/web.py +0 -0
- {emdash_core-0.1.16 → emdash_core-0.1.50}/emdash_core/analytics/__init__.py +0 -0
- {emdash_core-0.1.16 → emdash_core-0.1.50}/emdash_core/analytics/engine.py +0 -0
- {emdash_core-0.1.16 → emdash_core-0.1.50}/emdash_core/api/__init__.py +0 -0
- {emdash_core-0.1.16 → emdash_core-0.1.50}/emdash_core/api/agents.py +0 -0
- {emdash_core-0.1.16 → emdash_core-0.1.50}/emdash_core/api/analyze.py +0 -0
- {emdash_core-0.1.16 → emdash_core-0.1.50}/emdash_core/api/auth.py +0 -0
- {emdash_core-0.1.16 → emdash_core-0.1.50}/emdash_core/api/context.py +0 -0
- {emdash_core-0.1.16 → emdash_core-0.1.50}/emdash_core/api/db.py +0 -0
- {emdash_core-0.1.16 → emdash_core-0.1.50}/emdash_core/api/embed.py +0 -0
- {emdash_core-0.1.16 → emdash_core-0.1.50}/emdash_core/api/feature.py +0 -0
- {emdash_core-0.1.16 → emdash_core-0.1.50}/emdash_core/api/health.py +0 -0
- {emdash_core-0.1.16 → emdash_core-0.1.50}/emdash_core/api/index.py +0 -0
- {emdash_core-0.1.16 → emdash_core-0.1.50}/emdash_core/api/plan.py +0 -0
- {emdash_core-0.1.16 → emdash_core-0.1.50}/emdash_core/api/projectmd.py +0 -0
- {emdash_core-0.1.16 → emdash_core-0.1.50}/emdash_core/api/query.py +0 -0
- {emdash_core-0.1.16 → emdash_core-0.1.50}/emdash_core/api/review.py +0 -0
- {emdash_core-0.1.16 → emdash_core-0.1.50}/emdash_core/api/rules.py +0 -0
- {emdash_core-0.1.16 → emdash_core-0.1.50}/emdash_core/api/search.py +0 -0
- {emdash_core-0.1.16 → emdash_core-0.1.50}/emdash_core/api/spec.py +0 -0
- {emdash_core-0.1.16 → emdash_core-0.1.50}/emdash_core/api/tasks.py +0 -0
- {emdash_core-0.1.16 → emdash_core-0.1.50}/emdash_core/api/team.py +0 -0
- {emdash_core-0.1.16 → emdash_core-0.1.50}/emdash_core/auth/__init__.py +0 -0
- {emdash_core-0.1.16 → emdash_core-0.1.50}/emdash_core/auth/github.py +0 -0
- {emdash_core-0.1.16 → emdash_core-0.1.50}/emdash_core/context/__init__.py +0 -0
- {emdash_core-0.1.16 → emdash_core-0.1.50}/emdash_core/context/models.py +0 -0
- {emdash_core-0.1.16 → emdash_core-0.1.50}/emdash_core/context/providers/__init__.py +0 -0
- {emdash_core-0.1.16 → emdash_core-0.1.50}/emdash_core/context/providers/base.py +0 -0
- {emdash_core-0.1.16 → emdash_core-0.1.50}/emdash_core/context/providers/touched_areas.py +0 -0
- {emdash_core-0.1.16 → emdash_core-0.1.50}/emdash_core/context/registry.py +0 -0
- {emdash_core-0.1.16 → emdash_core-0.1.50}/emdash_core/context/service.py +0 -0
- {emdash_core-0.1.16 → emdash_core-0.1.50}/emdash_core/context/session.py +0 -0
- {emdash_core-0.1.16 → emdash_core-0.1.50}/emdash_core/core/__init__.py +0 -0
- {emdash_core-0.1.16 → emdash_core-0.1.50}/emdash_core/core/exceptions.py +0 -0
- {emdash_core-0.1.16 → emdash_core-0.1.50}/emdash_core/core/models.py +0 -0
- {emdash_core-0.1.16 → emdash_core-0.1.50}/emdash_core/core/review_config.py +0 -0
- {emdash_core-0.1.16 → emdash_core-0.1.50}/emdash_core/embeddings/__init__.py +0 -0
- {emdash_core-0.1.16 → emdash_core-0.1.50}/emdash_core/embeddings/indexer.py +0 -0
- {emdash_core-0.1.16 → emdash_core-0.1.50}/emdash_core/embeddings/models.py +0 -0
- {emdash_core-0.1.16 → emdash_core-0.1.50}/emdash_core/embeddings/providers/__init__.py +0 -0
- {emdash_core-0.1.16 → emdash_core-0.1.50}/emdash_core/embeddings/providers/base.py +0 -0
- {emdash_core-0.1.16 → emdash_core-0.1.50}/emdash_core/embeddings/providers/fireworks.py +0 -0
- {emdash_core-0.1.16 → emdash_core-0.1.50}/emdash_core/embeddings/providers/openai.py +0 -0
- {emdash_core-0.1.16 → emdash_core-0.1.50}/emdash_core/embeddings/registry.py +0 -0
- {emdash_core-0.1.16 → emdash_core-0.1.50}/emdash_core/embeddings/service.py +0 -0
- {emdash_core-0.1.16 → emdash_core-0.1.50}/emdash_core/graph/builder.py +0 -0
- {emdash_core-0.1.16 → emdash_core-0.1.50}/emdash_core/graph/schema.py +0 -0
- {emdash_core-0.1.16 → emdash_core-0.1.50}/emdash_core/ingestion/__init__.py +0 -0
- {emdash_core-0.1.16 → emdash_core-0.1.50}/emdash_core/ingestion/change_detector.py +0 -0
- {emdash_core-0.1.16 → emdash_core-0.1.50}/emdash_core/ingestion/git/__init__.py +0 -0
- {emdash_core-0.1.16 → emdash_core-0.1.50}/emdash_core/ingestion/git/commit_analyzer.py +0 -0
- {emdash_core-0.1.16 → emdash_core-0.1.50}/emdash_core/ingestion/github/__init__.py +0 -0
- {emdash_core-0.1.16 → emdash_core-0.1.50}/emdash_core/ingestion/github/pr_fetcher.py +0 -0
- {emdash_core-0.1.16 → emdash_core-0.1.50}/emdash_core/ingestion/github/task_extractor.py +0 -0
- {emdash_core-0.1.16 → emdash_core-0.1.50}/emdash_core/ingestion/orchestrator.py +0 -0
- {emdash_core-0.1.16 → emdash_core-0.1.50}/emdash_core/ingestion/parsers/__init__.py +0 -0
- {emdash_core-0.1.16 → emdash_core-0.1.50}/emdash_core/ingestion/parsers/base_parser.py +0 -0
- {emdash_core-0.1.16 → emdash_core-0.1.50}/emdash_core/ingestion/parsers/call_graph_builder.py +0 -0
- {emdash_core-0.1.16 → emdash_core-0.1.50}/emdash_core/ingestion/parsers/class_extractor.py +0 -0
- {emdash_core-0.1.16 → emdash_core-0.1.50}/emdash_core/ingestion/parsers/function_extractor.py +0 -0
- {emdash_core-0.1.16 → emdash_core-0.1.50}/emdash_core/ingestion/parsers/import_analyzer.py +0 -0
- {emdash_core-0.1.16 → emdash_core-0.1.50}/emdash_core/ingestion/parsers/python_parser.py +0 -0
- {emdash_core-0.1.16 → emdash_core-0.1.50}/emdash_core/ingestion/parsers/registry.py +0 -0
- {emdash_core-0.1.16 → emdash_core-0.1.50}/emdash_core/ingestion/parsers/ts_ast_parser.js +0 -0
- {emdash_core-0.1.16 → emdash_core-0.1.50}/emdash_core/ingestion/parsers/typescript_parser.py +0 -0
- {emdash_core-0.1.16 → emdash_core-0.1.50}/emdash_core/models/__init__.py +0 -0
- {emdash_core-0.1.16 → emdash_core-0.1.50}/emdash_core/models/index.py +0 -0
- {emdash_core-0.1.16 → emdash_core-0.1.50}/emdash_core/models/query.py +0 -0
- {emdash_core-0.1.16 → emdash_core-0.1.50}/emdash_core/planning/__init__.py +0 -0
- {emdash_core-0.1.16 → emdash_core-0.1.50}/emdash_core/planning/agent_api.py +0 -0
- {emdash_core-0.1.16 → emdash_core-0.1.50}/emdash_core/planning/context_builder.py +0 -0
- {emdash_core-0.1.16 → emdash_core-0.1.50}/emdash_core/planning/feature_context.py +0 -0
- {emdash_core-0.1.16 → emdash_core-0.1.50}/emdash_core/planning/feature_expander.py +0 -0
- {emdash_core-0.1.16 → emdash_core-0.1.50}/emdash_core/planning/llm_explainer.py +0 -0
- {emdash_core-0.1.16 → emdash_core-0.1.50}/emdash_core/planning/similarity.py +0 -0
- {emdash_core-0.1.16 → emdash_core-0.1.50}/emdash_core/planning/team_focus.py +0 -0
- {emdash_core-0.1.16 → emdash_core-0.1.50}/emdash_core/sse/__init__.py +0 -0
- {emdash_core-0.1.16 → emdash_core-0.1.50}/emdash_core/templates/__init__.py +0 -0
- {emdash_core-0.1.16 → emdash_core-0.1.50}/emdash_core/templates/defaults/agent-builder.md.template +0 -0
- {emdash_core-0.1.16 → emdash_core-0.1.50}/emdash_core/templates/defaults/focus.md.template +0 -0
- {emdash_core-0.1.16 → emdash_core-0.1.50}/emdash_core/templates/defaults/pr-review-enhanced.md.template +0 -0
- {emdash_core-0.1.16 → emdash_core-0.1.50}/emdash_core/templates/defaults/pr-review.md.template +0 -0
- {emdash_core-0.1.16 → emdash_core-0.1.50}/emdash_core/templates/defaults/project.md.template +0 -0
- {emdash_core-0.1.16 → emdash_core-0.1.50}/emdash_core/templates/defaults/research_critic.md.template +0 -0
- {emdash_core-0.1.16 → emdash_core-0.1.50}/emdash_core/templates/defaults/research_planner.md.template +0 -0
- {emdash_core-0.1.16 → emdash_core-0.1.50}/emdash_core/templates/defaults/research_synthesizer.md.template +0 -0
- {emdash_core-0.1.16 → emdash_core-0.1.50}/emdash_core/templates/defaults/reviewer.md.template +0 -0
- {emdash_core-0.1.16 → emdash_core-0.1.50}/emdash_core/templates/defaults/spec.md.template +0 -0
- {emdash_core-0.1.16 → emdash_core-0.1.50}/emdash_core/templates/defaults/tasks.md.template +0 -0
- {emdash_core-0.1.16 → emdash_core-0.1.50}/emdash_core/templates/loader.py +0 -0
- {emdash_core-0.1.16 → emdash_core-0.1.50}/emdash_core/utils/logger.py +0 -0
|
@@ -1,6 +1,6 @@
|
|
|
1
1
|
Metadata-Version: 2.4
|
|
2
2
|
Name: emdash-core
|
|
3
|
-
Version: 0.1.
|
|
3
|
+
Version: 0.1.50
|
|
4
4
|
Summary: EmDash Core - FastAPI server for code intelligence
|
|
5
5
|
Author: Em Dash Team
|
|
6
6
|
Requires-Python: >=3.10,<4.0
|
|
@@ -10,26 +10,27 @@ Classifier: Programming Language :: Python :: 3.11
|
|
|
10
10
|
Classifier: Programming Language :: Python :: 3.12
|
|
11
11
|
Classifier: Programming Language :: Python :: 3.13
|
|
12
12
|
Classifier: Programming Language :: Python :: 3.14
|
|
13
|
+
Provides-Extra: graph
|
|
13
14
|
Requires-Dist: astroid (>=3.0.1,<4.0.0)
|
|
14
15
|
Requires-Dist: beautifulsoup4 (>=4.12.0)
|
|
16
|
+
Requires-Dist: claude-agent-sdk (>=0.1.19)
|
|
17
|
+
Requires-Dist: cmake (>=3.25.0) ; extra == "graph"
|
|
15
18
|
Requires-Dist: duckduckgo-search (>=6.0.0)
|
|
16
19
|
Requires-Dist: fastapi (>=0.109.0)
|
|
17
20
|
Requires-Dist: gitpython (>=3.1.40,<4.0.0)
|
|
18
21
|
Requires-Dist: httpx (>=0.25.0)
|
|
19
|
-
Requires-Dist: kuzu (>=0.4.0)
|
|
22
|
+
Requires-Dist: kuzu (>=0.4.0) ; extra == "graph"
|
|
20
23
|
Requires-Dist: loguru (>=0.7.2,<0.8.0)
|
|
21
24
|
Requires-Dist: networkx (>=3.2.1,<4.0.0)
|
|
22
25
|
Requires-Dist: numpy (>=1.26.0)
|
|
23
26
|
Requires-Dist: openai (>=1.0.0)
|
|
24
|
-
Requires-Dist: pillow (>=10.0.0,<11.0.0)
|
|
25
27
|
Requires-Dist: pydantic (>=2.5.0,<3.0.0)
|
|
26
28
|
Requires-Dist: pydantic-settings (>=2.0.0,<3.0.0)
|
|
27
29
|
Requires-Dist: pygithub (>=2.1.1,<3.0.0)
|
|
30
|
+
Requires-Dist: pypng (>=0.0.21,<0.0.22)
|
|
28
31
|
Requires-Dist: python-dotenv (>=1.0.0,<2.0.0)
|
|
29
32
|
Requires-Dist: python-louvain (>=0.16,<0.17)
|
|
30
|
-
Requires-Dist:
|
|
31
|
-
Requires-Dist: sentence-transformers (>=2.2.0)
|
|
33
|
+
Requires-Dist: pyyaml (>=6.0,<7.0)
|
|
32
34
|
Requires-Dist: sse-starlette (>=2.0.0)
|
|
33
|
-
Requires-Dist: supabase (>=2.0.0)
|
|
34
35
|
Requires-Dist: tqdm (>=4.66.1,<5.0.0)
|
|
35
36
|
Requires-Dist: uvicorn[standard] (>=0.27.0)
|
|
@@ -19,6 +19,9 @@ def __getattr__(name: str):
|
|
|
19
19
|
elif name == "AgentRunner":
|
|
20
20
|
from .runner import AgentRunner
|
|
21
21
|
return AgentRunner
|
|
22
|
+
elif name == "SafeJSONEncoder":
|
|
23
|
+
from .runner import SafeJSONEncoder
|
|
24
|
+
return SafeJSONEncoder
|
|
22
25
|
elif name == "ToolResult":
|
|
23
26
|
from .tools.base import ToolResult
|
|
24
27
|
return ToolResult
|
|
@@ -32,6 +35,7 @@ __all__ = [
|
|
|
32
35
|
"AgentToolkit",
|
|
33
36
|
"AgentSession",
|
|
34
37
|
"AgentRunner",
|
|
38
|
+
"SafeJSONEncoder",
|
|
35
39
|
"ToolResult",
|
|
36
40
|
"ToolCategory",
|
|
37
41
|
]
|
|
@@ -2,16 +2,74 @@
|
|
|
2
2
|
|
|
3
3
|
Allows users to define custom agent configurations with
|
|
4
4
|
specialized system prompts and tool selections.
|
|
5
|
+
|
|
6
|
+
Example agent file:
|
|
7
|
+
```markdown
|
|
8
|
+
---
|
|
9
|
+
description: GitHub integration agent
|
|
10
|
+
model: claude-sonnet-4-20250514
|
|
11
|
+
tools: [grep, glob, read_file]
|
|
12
|
+
mcp_servers:
|
|
13
|
+
github:
|
|
14
|
+
command: github-mcp-server
|
|
15
|
+
args: []
|
|
16
|
+
env:
|
|
17
|
+
GITHUB_TOKEN: ${GITHUB_TOKEN}
|
|
18
|
+
enabled: true
|
|
19
|
+
filesystem:
|
|
20
|
+
command: npx
|
|
21
|
+
args: [-y, "@anthropic/mcp-server-filesystem", "/tmp"]
|
|
22
|
+
enabled: false # Disabled - won't be started
|
|
23
|
+
---
|
|
24
|
+
|
|
25
|
+
# System Prompt
|
|
26
|
+
|
|
27
|
+
You are a GitHub integration specialist...
|
|
28
|
+
```
|
|
5
29
|
"""
|
|
6
30
|
|
|
7
31
|
from dataclasses import dataclass, field
|
|
8
32
|
from pathlib import Path
|
|
9
|
-
from typing import Optional
|
|
33
|
+
from typing import Any, Optional
|
|
10
34
|
import re
|
|
11
35
|
|
|
36
|
+
import yaml
|
|
37
|
+
|
|
12
38
|
from ..utils.logger import log
|
|
13
39
|
|
|
14
40
|
|
|
41
|
+
@dataclass
|
|
42
|
+
class AgentMCPServerConfig:
|
|
43
|
+
"""MCP server configuration for a custom agent.
|
|
44
|
+
|
|
45
|
+
Attributes:
|
|
46
|
+
name: Server name (key in mcp_servers dict)
|
|
47
|
+
command: Command to run the server
|
|
48
|
+
args: Arguments to pass to the command
|
|
49
|
+
env: Environment variables (supports ${VAR} syntax)
|
|
50
|
+
enabled: Whether this server is enabled (default: True)
|
|
51
|
+
timeout: Timeout in seconds for tool calls
|
|
52
|
+
"""
|
|
53
|
+
name: str
|
|
54
|
+
command: str
|
|
55
|
+
args: list[str] = field(default_factory=list)
|
|
56
|
+
env: dict[str, str] = field(default_factory=dict)
|
|
57
|
+
enabled: bool = True
|
|
58
|
+
timeout: int = 30
|
|
59
|
+
|
|
60
|
+
@classmethod
|
|
61
|
+
def from_dict(cls, name: str, data: dict[str, Any]) -> "AgentMCPServerConfig":
|
|
62
|
+
"""Create from dictionary parsed from YAML."""
|
|
63
|
+
return cls(
|
|
64
|
+
name=name,
|
|
65
|
+
command=data.get("command", ""),
|
|
66
|
+
args=data.get("args", []),
|
|
67
|
+
env=data.get("env", {}),
|
|
68
|
+
enabled=data.get("enabled", True),
|
|
69
|
+
timeout=data.get("timeout", 30),
|
|
70
|
+
)
|
|
71
|
+
|
|
72
|
+
|
|
15
73
|
@dataclass
|
|
16
74
|
class CustomAgent:
|
|
17
75
|
"""A custom agent configuration loaded from markdown.
|
|
@@ -19,16 +77,26 @@ class CustomAgent:
|
|
|
19
77
|
Attributes:
|
|
20
78
|
name: Agent name (from filename)
|
|
21
79
|
description: Brief description
|
|
80
|
+
model: Model to use for this agent (optional, uses default if not set)
|
|
22
81
|
system_prompt: Custom system prompt
|
|
23
82
|
tools: List of tools to enable
|
|
83
|
+
mcp_servers: MCP server configurations for this agent
|
|
84
|
+
rules: List of rule names to apply (references .emdash/rules/)
|
|
85
|
+
skills: List of skill names to enable (references .emdash/skills/)
|
|
86
|
+
verifiers: List of verifier names to use (references .emdash/verifiers.json)
|
|
24
87
|
examples: Example interactions
|
|
25
88
|
file_path: Source file path
|
|
26
89
|
"""
|
|
27
90
|
|
|
28
91
|
name: str
|
|
29
92
|
description: str = ""
|
|
93
|
+
model: Optional[str] = None
|
|
30
94
|
system_prompt: str = ""
|
|
31
95
|
tools: list[str] = field(default_factory=list)
|
|
96
|
+
mcp_servers: list[AgentMCPServerConfig] = field(default_factory=list)
|
|
97
|
+
rules: list[str] = field(default_factory=list)
|
|
98
|
+
skills: list[str] = field(default_factory=list)
|
|
99
|
+
verifiers: list[str] = field(default_factory=list)
|
|
32
100
|
examples: list[dict] = field(default_factory=list)
|
|
33
101
|
file_path: Optional[Path] = None
|
|
34
102
|
|
|
@@ -121,46 +189,48 @@ def _parse_agent_file(file_path: Path) -> Optional[CustomAgent]:
|
|
|
121
189
|
if system_prompt.startswith("# System Prompt"):
|
|
122
190
|
system_prompt = system_prompt[len("# System Prompt") :].strip()
|
|
123
191
|
|
|
192
|
+
# Parse MCP servers from frontmatter
|
|
193
|
+
mcp_servers = []
|
|
194
|
+
mcp_servers_data = frontmatter.get("mcp_servers", {})
|
|
195
|
+
if isinstance(mcp_servers_data, dict):
|
|
196
|
+
for server_name, server_config in mcp_servers_data.items():
|
|
197
|
+
if isinstance(server_config, dict):
|
|
198
|
+
mcp_servers.append(
|
|
199
|
+
AgentMCPServerConfig.from_dict(server_name, server_config)
|
|
200
|
+
)
|
|
201
|
+
|
|
124
202
|
return CustomAgent(
|
|
125
203
|
name=file_path.stem,
|
|
126
204
|
description=frontmatter.get("description", ""),
|
|
205
|
+
model=frontmatter.get("model"),
|
|
127
206
|
system_prompt=system_prompt,
|
|
128
207
|
tools=frontmatter.get("tools", []),
|
|
208
|
+
mcp_servers=mcp_servers,
|
|
209
|
+
rules=frontmatter.get("rules", []),
|
|
210
|
+
skills=frontmatter.get("skills", []),
|
|
211
|
+
verifiers=frontmatter.get("verifiers", []),
|
|
129
212
|
examples=examples,
|
|
130
213
|
file_path=file_path,
|
|
131
214
|
)
|
|
132
215
|
|
|
133
216
|
|
|
134
217
|
def _parse_frontmatter(frontmatter_str: str) -> dict:
|
|
135
|
-
"""Parse YAML
|
|
218
|
+
"""Parse YAML frontmatter.
|
|
136
219
|
|
|
137
|
-
|
|
220
|
+
Uses PyYAML for proper nested structure parsing.
|
|
138
221
|
|
|
139
222
|
Args:
|
|
140
|
-
frontmatter_str: Frontmatter string
|
|
223
|
+
frontmatter_str: Frontmatter string (YAML format)
|
|
141
224
|
|
|
142
225
|
Returns:
|
|
143
226
|
Dict of parsed values
|
|
144
227
|
"""
|
|
145
|
-
|
|
146
|
-
|
|
147
|
-
|
|
148
|
-
|
|
149
|
-
|
|
150
|
-
|
|
151
|
-
key, value = line.split(":", 1)
|
|
152
|
-
key = key.strip()
|
|
153
|
-
value = value.strip()
|
|
154
|
-
|
|
155
|
-
# Parse list values
|
|
156
|
-
if value.startswith("[") and value.endswith("]"):
|
|
157
|
-
# Simple list parsing
|
|
158
|
-
items = value[1:-1].split(",")
|
|
159
|
-
result[key] = [item.strip().strip("'\"") for item in items if item.strip()]
|
|
160
|
-
else:
|
|
161
|
-
result[key] = value.strip("'\"")
|
|
162
|
-
|
|
163
|
-
return result
|
|
228
|
+
try:
|
|
229
|
+
result = yaml.safe_load(frontmatter_str)
|
|
230
|
+
return result if isinstance(result, dict) else {}
|
|
231
|
+
except yaml.YAMLError as e:
|
|
232
|
+
log.warning(f"Failed to parse frontmatter as YAML: {e}")
|
|
233
|
+
return {}
|
|
164
234
|
|
|
165
235
|
|
|
166
236
|
def _parse_examples(examples_str: str) -> list[dict]:
|