emdash-core 0.1.16__tar.gz → 0.1.53__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.
Files changed (224) hide show
  1. {emdash_core-0.1.16 → emdash_core-0.1.53}/PKG-INFO +7 -6
  2. {emdash_core-0.1.16 → emdash_core-0.1.53}/emdash_core/agent/__init__.py +4 -0
  3. {emdash_core-0.1.16 → emdash_core-0.1.53}/emdash_core/agent/agents.py +93 -23
  4. emdash_core-0.1.53/emdash_core/agent/background.py +481 -0
  5. {emdash_core-0.1.16 → emdash_core-0.1.53}/emdash_core/agent/events.py +52 -1
  6. emdash_core-0.1.53/emdash_core/agent/hooks.py +419 -0
  7. {emdash_core-0.1.16 → emdash_core-0.1.53}/emdash_core/agent/inprocess_subagent.py +236 -19
  8. {emdash_core-0.1.16 → emdash_core-0.1.53}/emdash_core/agent/mcp/config.py +78 -2
  9. {emdash_core-0.1.16 → emdash_core-0.1.53}/emdash_core/agent/prompts/__init__.py +6 -0
  10. emdash_core-0.1.53/emdash_core/agent/prompts/main_agent.py +241 -0
  11. emdash_core-0.1.53/emdash_core/agent/prompts/plan_mode.py +276 -0
  12. emdash_core-0.1.53/emdash_core/agent/prompts/subagents.py +287 -0
  13. emdash_core-0.1.53/emdash_core/agent/prompts/workflow.py +515 -0
  14. {emdash_core-0.1.16 → emdash_core-0.1.53}/emdash_core/agent/providers/base.py +4 -0
  15. {emdash_core-0.1.16 → emdash_core-0.1.53}/emdash_core/agent/providers/factory.py +2 -2
  16. {emdash_core-0.1.16 → emdash_core-0.1.53}/emdash_core/agent/providers/models.py +7 -0
  17. {emdash_core-0.1.16 → emdash_core-0.1.53}/emdash_core/agent/providers/openai_provider.py +137 -13
  18. {emdash_core-0.1.16 → emdash_core-0.1.53}/emdash_core/agent/research/researcher.py +154 -45
  19. emdash_core-0.1.53/emdash_core/agent/runner/__init__.py +49 -0
  20. emdash_core-0.1.53/emdash_core/agent/runner/agent_runner.py +882 -0
  21. emdash_core-0.1.53/emdash_core/agent/runner/context.py +470 -0
  22. emdash_core-0.1.53/emdash_core/agent/runner/factory.py +108 -0
  23. emdash_core-0.1.53/emdash_core/agent/runner/plan.py +217 -0
  24. emdash_core-0.1.53/emdash_core/agent/runner/sdk_runner.py +324 -0
  25. emdash_core-0.1.53/emdash_core/agent/runner/utils.py +67 -0
  26. emdash_core-0.1.53/emdash_core/agent/skills.py +438 -0
  27. {emdash_core-0.1.16 → emdash_core-0.1.53}/emdash_core/agent/toolkit.py +172 -16
  28. emdash_core-0.1.53/emdash_core/agent/toolkits/__init__.py +163 -0
  29. emdash_core-0.1.53/emdash_core/agent/toolkits/base.py +181 -0
  30. {emdash_core-0.1.16 → emdash_core-0.1.53}/emdash_core/agent/toolkits/explore.py +18 -0
  31. {emdash_core-0.1.16 → emdash_core-0.1.53}/emdash_core/agent/toolkits/plan.py +27 -11
  32. {emdash_core-0.1.16 → emdash_core-0.1.53}/emdash_core/agent/tools/__init__.py +5 -2
  33. emdash_core-0.1.53/emdash_core/agent/tools/coding.py +820 -0
  34. emdash_core-0.1.53/emdash_core/agent/tools/lsp.py +361 -0
  35. emdash_core-0.1.53/emdash_core/agent/tools/modes.py +305 -0
  36. {emdash_core-0.1.16 → emdash_core-0.1.53}/emdash_core/agent/tools/search.py +4 -0
  37. emdash_core-0.1.53/emdash_core/agent/tools/skill.py +213 -0
  38. {emdash_core-0.1.16 → emdash_core-0.1.53}/emdash_core/agent/tools/spec.py +61 -94
  39. {emdash_core-0.1.16 → emdash_core-0.1.53}/emdash_core/agent/tools/task.py +67 -24
  40. emdash_core-0.1.53/emdash_core/agent/tools/task_output.py +434 -0
  41. {emdash_core-0.1.16 → emdash_core-0.1.53}/emdash_core/agent/tools/tasks.py +15 -78
  42. emdash_core-0.1.53/emdash_core/agent/verifier/__init__.py +11 -0
  43. emdash_core-0.1.53/emdash_core/agent/verifier/manager.py +295 -0
  44. emdash_core-0.1.53/emdash_core/agent/verifier/models.py +97 -0
  45. emdash_core-0.1.16/emdash_core/swarm/worktree_manager.py → emdash_core-0.1.53/emdash_core/agent/worktree.py +19 -1
  46. emdash_core-0.1.53/emdash_core/api/agent.py +1294 -0
  47. {emdash_core-0.1.16 → emdash_core-0.1.53}/emdash_core/api/research.py +3 -3
  48. {emdash_core-0.1.16 → emdash_core-0.1.53}/emdash_core/api/router.py +2 -4
  49. emdash_core-0.1.53/emdash_core/api/skills.py +241 -0
  50. emdash_core-0.1.53/emdash_core/checkpoint/__init__.py +40 -0
  51. emdash_core-0.1.53/emdash_core/checkpoint/cli.py +175 -0
  52. emdash_core-0.1.53/emdash_core/checkpoint/git_operations.py +250 -0
  53. emdash_core-0.1.53/emdash_core/checkpoint/manager.py +231 -0
  54. emdash_core-0.1.53/emdash_core/checkpoint/models.py +107 -0
  55. emdash_core-0.1.53/emdash_core/checkpoint/storage.py +201 -0
  56. {emdash_core-0.1.16 → emdash_core-0.1.53}/emdash_core/config.py +1 -1
  57. emdash_core-0.1.53/emdash_core/context/longevity.py +197 -0
  58. {emdash_core-0.1.16 → emdash_core-0.1.53}/emdash_core/context/providers/explored_areas.py +83 -39
  59. emdash_core-0.1.53/emdash_core/context/reranker.py +90 -0
  60. emdash_core-0.1.53/emdash_core/context/simple_reranker.py +500 -0
  61. emdash_core-0.1.53/emdash_core/context/tool_relevance.py +84 -0
  62. {emdash_core-0.1.16 → emdash_core-0.1.53}/emdash_core/core/config.py +10 -2
  63. {emdash_core-0.1.16 → emdash_core-0.1.53}/emdash_core/graph/__init__.py +8 -1
  64. {emdash_core-0.1.16 → emdash_core-0.1.53}/emdash_core/graph/connection.py +24 -3
  65. {emdash_core-0.1.16 → emdash_core-0.1.53}/emdash_core/graph/writer.py +7 -1
  66. emdash_core-0.1.53/emdash_core/ingestion/repository.py +165 -0
  67. {emdash_core-0.1.16 → emdash_core-0.1.53}/emdash_core/models/agent.py +15 -1
  68. {emdash_core-0.1.16 → emdash_core-0.1.53}/emdash_core/server.py +1 -6
  69. emdash_core-0.1.53/emdash_core/skills/frontend-design/SKILL.md +56 -0
  70. {emdash_core-0.1.16 → emdash_core-0.1.53}/emdash_core/sse/stream.py +21 -1
  71. {emdash_core-0.1.16 → emdash_core-0.1.53}/emdash_core/utils/__init__.py +0 -2
  72. emdash_core-0.1.53/emdash_core/utils/git.py +187 -0
  73. {emdash_core-0.1.16 → emdash_core-0.1.53}/emdash_core/utils/image.py +147 -160
  74. {emdash_core-0.1.16 → emdash_core-0.1.53}/pyproject.toml +14 -7
  75. emdash_core-0.1.16/emdash_core/agent/prompts/main_agent.py +0 -104
  76. emdash_core-0.1.16/emdash_core/agent/prompts/subagents.py +0 -131
  77. emdash_core-0.1.16/emdash_core/agent/prompts/workflow.py +0 -136
  78. emdash_core-0.1.16/emdash_core/agent/runner.py +0 -775
  79. emdash_core-0.1.16/emdash_core/agent/toolkits/__init__.py +0 -64
  80. emdash_core-0.1.16/emdash_core/agent/toolkits/base.py +0 -96
  81. emdash_core-0.1.16/emdash_core/agent/tools/coding.py +0 -484
  82. emdash_core-0.1.16/emdash_core/agent/tools/modes.py +0 -153
  83. emdash_core-0.1.16/emdash_core/agent/tools/task_output.py +0 -204
  84. emdash_core-0.1.16/emdash_core/api/agent.py +0 -308
  85. emdash_core-0.1.16/emdash_core/api/swarm.py +0 -223
  86. emdash_core-0.1.16/emdash_core/context/reranker.py +0 -199
  87. emdash_core-0.1.16/emdash_core/db/__init__.py +0 -67
  88. emdash_core-0.1.16/emdash_core/db/auth.py +0 -134
  89. emdash_core-0.1.16/emdash_core/db/models.py +0 -91
  90. emdash_core-0.1.16/emdash_core/db/provider.py +0 -222
  91. emdash_core-0.1.16/emdash_core/db/providers/__init__.py +0 -5
  92. emdash_core-0.1.16/emdash_core/db/providers/supabase.py +0 -452
  93. emdash_core-0.1.16/emdash_core/ingestion/repository.py +0 -346
  94. emdash_core-0.1.16/emdash_core/swarm/__init__.py +0 -17
  95. emdash_core-0.1.16/emdash_core/swarm/merge_agent.py +0 -383
  96. emdash_core-0.1.16/emdash_core/swarm/session_manager.py +0 -274
  97. emdash_core-0.1.16/emdash_core/swarm/swarm_runner.py +0 -226
  98. emdash_core-0.1.16/emdash_core/swarm/task_definition.py +0 -137
  99. emdash_core-0.1.16/emdash_core/swarm/worker_spawner.py +0 -319
  100. emdash_core-0.1.16/emdash_core/utils/git.py +0 -84
  101. {emdash_core-0.1.16 → emdash_core-0.1.53}/emdash_core/__init__.py +0 -0
  102. {emdash_core-0.1.16 → emdash_core-0.1.53}/emdash_core/agent/code_reviewer.py +0 -0
  103. {emdash_core-0.1.16 → emdash_core-0.1.53}/emdash_core/agent/compaction.py +0 -0
  104. {emdash_core-0.1.16 → emdash_core-0.1.53}/emdash_core/agent/context_manager.py +0 -0
  105. {emdash_core-0.1.16 → emdash_core-0.1.53}/emdash_core/agent/handlers.py +0 -0
  106. {emdash_core-0.1.16 → emdash_core-0.1.53}/emdash_core/agent/mcp/__init__.py +0 -0
  107. {emdash_core-0.1.16 → emdash_core-0.1.53}/emdash_core/agent/mcp/client.py +0 -0
  108. {emdash_core-0.1.16 → emdash_core-0.1.53}/emdash_core/agent/mcp/manager.py +0 -0
  109. {emdash_core-0.1.16 → emdash_core-0.1.53}/emdash_core/agent/mcp/tool_factory.py +0 -0
  110. {emdash_core-0.1.16 → emdash_core-0.1.53}/emdash_core/agent/providers/__init__.py +0 -0
  111. {emdash_core-0.1.16 → emdash_core-0.1.53}/emdash_core/agent/providers/transformers_provider.py +0 -0
  112. {emdash_core-0.1.16 → emdash_core-0.1.53}/emdash_core/agent/research/__init__.py +0 -0
  113. {emdash_core-0.1.16 → emdash_core-0.1.53}/emdash_core/agent/research/agent.py +0 -0
  114. {emdash_core-0.1.16 → emdash_core-0.1.53}/emdash_core/agent/research/controller.py +0 -0
  115. {emdash_core-0.1.16 → emdash_core-0.1.53}/emdash_core/agent/research/critic.py +0 -0
  116. {emdash_core-0.1.16 → emdash_core-0.1.53}/emdash_core/agent/research/macros.py +0 -0
  117. {emdash_core-0.1.16 → emdash_core-0.1.53}/emdash_core/agent/research/planner.py +0 -0
  118. {emdash_core-0.1.16 → emdash_core-0.1.53}/emdash_core/agent/research/state.py +0 -0
  119. {emdash_core-0.1.16 → emdash_core-0.1.53}/emdash_core/agent/research/synthesizer.py +0 -0
  120. {emdash_core-0.1.16 → emdash_core-0.1.53}/emdash_core/agent/reviewer_profile.py +0 -0
  121. {emdash_core-0.1.16 → emdash_core-0.1.53}/emdash_core/agent/rules.py +0 -0
  122. {emdash_core-0.1.16 → emdash_core-0.1.53}/emdash_core/agent/session.py +0 -0
  123. {emdash_core-0.1.16 → emdash_core-0.1.53}/emdash_core/agent/spec_schema.py +0 -0
  124. {emdash_core-0.1.16 → emdash_core-0.1.53}/emdash_core/agent/specification.py +0 -0
  125. {emdash_core-0.1.16 → emdash_core-0.1.53}/emdash_core/agent/subagent.py +0 -0
  126. {emdash_core-0.1.16 → emdash_core-0.1.53}/emdash_core/agent/subagent_prompts.py +0 -0
  127. {emdash_core-0.1.16 → emdash_core-0.1.53}/emdash_core/agent/tools/analytics.py +0 -0
  128. {emdash_core-0.1.16 → emdash_core-0.1.53}/emdash_core/agent/tools/base.py +0 -0
  129. {emdash_core-0.1.16 → emdash_core-0.1.53}/emdash_core/agent/tools/github_mcp.py +0 -0
  130. {emdash_core-0.1.16 → emdash_core-0.1.53}/emdash_core/agent/tools/history.py +0 -0
  131. {emdash_core-0.1.16 → emdash_core-0.1.53}/emdash_core/agent/tools/plan.py +0 -0
  132. {emdash_core-0.1.16 → emdash_core-0.1.53}/emdash_core/agent/tools/plan_write.py +0 -0
  133. {emdash_core-0.1.16 → emdash_core-0.1.53}/emdash_core/agent/tools/traversal.py +0 -0
  134. {emdash_core-0.1.16 → emdash_core-0.1.53}/emdash_core/agent/tools/web.py +0 -0
  135. {emdash_core-0.1.16 → emdash_core-0.1.53}/emdash_core/analytics/__init__.py +0 -0
  136. {emdash_core-0.1.16 → emdash_core-0.1.53}/emdash_core/analytics/engine.py +0 -0
  137. {emdash_core-0.1.16 → emdash_core-0.1.53}/emdash_core/api/__init__.py +0 -0
  138. {emdash_core-0.1.16 → emdash_core-0.1.53}/emdash_core/api/agents.py +0 -0
  139. {emdash_core-0.1.16 → emdash_core-0.1.53}/emdash_core/api/analyze.py +0 -0
  140. {emdash_core-0.1.16 → emdash_core-0.1.53}/emdash_core/api/auth.py +0 -0
  141. {emdash_core-0.1.16 → emdash_core-0.1.53}/emdash_core/api/context.py +0 -0
  142. {emdash_core-0.1.16 → emdash_core-0.1.53}/emdash_core/api/db.py +0 -0
  143. {emdash_core-0.1.16 → emdash_core-0.1.53}/emdash_core/api/embed.py +0 -0
  144. {emdash_core-0.1.16 → emdash_core-0.1.53}/emdash_core/api/feature.py +0 -0
  145. {emdash_core-0.1.16 → emdash_core-0.1.53}/emdash_core/api/health.py +0 -0
  146. {emdash_core-0.1.16 → emdash_core-0.1.53}/emdash_core/api/index.py +0 -0
  147. {emdash_core-0.1.16 → emdash_core-0.1.53}/emdash_core/api/plan.py +0 -0
  148. {emdash_core-0.1.16 → emdash_core-0.1.53}/emdash_core/api/projectmd.py +0 -0
  149. {emdash_core-0.1.16 → emdash_core-0.1.53}/emdash_core/api/query.py +0 -0
  150. {emdash_core-0.1.16 → emdash_core-0.1.53}/emdash_core/api/review.py +0 -0
  151. {emdash_core-0.1.16 → emdash_core-0.1.53}/emdash_core/api/rules.py +0 -0
  152. {emdash_core-0.1.16 → emdash_core-0.1.53}/emdash_core/api/search.py +0 -0
  153. {emdash_core-0.1.16 → emdash_core-0.1.53}/emdash_core/api/spec.py +0 -0
  154. {emdash_core-0.1.16 → emdash_core-0.1.53}/emdash_core/api/tasks.py +0 -0
  155. {emdash_core-0.1.16 → emdash_core-0.1.53}/emdash_core/api/team.py +0 -0
  156. {emdash_core-0.1.16 → emdash_core-0.1.53}/emdash_core/auth/__init__.py +0 -0
  157. {emdash_core-0.1.16 → emdash_core-0.1.53}/emdash_core/auth/github.py +0 -0
  158. {emdash_core-0.1.16 → emdash_core-0.1.53}/emdash_core/context/__init__.py +0 -0
  159. {emdash_core-0.1.16 → emdash_core-0.1.53}/emdash_core/context/models.py +0 -0
  160. {emdash_core-0.1.16 → emdash_core-0.1.53}/emdash_core/context/providers/__init__.py +0 -0
  161. {emdash_core-0.1.16 → emdash_core-0.1.53}/emdash_core/context/providers/base.py +0 -0
  162. {emdash_core-0.1.16 → emdash_core-0.1.53}/emdash_core/context/providers/touched_areas.py +0 -0
  163. {emdash_core-0.1.16 → emdash_core-0.1.53}/emdash_core/context/registry.py +0 -0
  164. {emdash_core-0.1.16 → emdash_core-0.1.53}/emdash_core/context/service.py +0 -0
  165. {emdash_core-0.1.16 → emdash_core-0.1.53}/emdash_core/context/session.py +0 -0
  166. {emdash_core-0.1.16 → emdash_core-0.1.53}/emdash_core/core/__init__.py +0 -0
  167. {emdash_core-0.1.16 → emdash_core-0.1.53}/emdash_core/core/exceptions.py +0 -0
  168. {emdash_core-0.1.16 → emdash_core-0.1.53}/emdash_core/core/models.py +0 -0
  169. {emdash_core-0.1.16 → emdash_core-0.1.53}/emdash_core/core/review_config.py +0 -0
  170. {emdash_core-0.1.16 → emdash_core-0.1.53}/emdash_core/embeddings/__init__.py +0 -0
  171. {emdash_core-0.1.16 → emdash_core-0.1.53}/emdash_core/embeddings/indexer.py +0 -0
  172. {emdash_core-0.1.16 → emdash_core-0.1.53}/emdash_core/embeddings/models.py +0 -0
  173. {emdash_core-0.1.16 → emdash_core-0.1.53}/emdash_core/embeddings/providers/__init__.py +0 -0
  174. {emdash_core-0.1.16 → emdash_core-0.1.53}/emdash_core/embeddings/providers/base.py +0 -0
  175. {emdash_core-0.1.16 → emdash_core-0.1.53}/emdash_core/embeddings/providers/fireworks.py +0 -0
  176. {emdash_core-0.1.16 → emdash_core-0.1.53}/emdash_core/embeddings/providers/openai.py +0 -0
  177. {emdash_core-0.1.16 → emdash_core-0.1.53}/emdash_core/embeddings/registry.py +0 -0
  178. {emdash_core-0.1.16 → emdash_core-0.1.53}/emdash_core/embeddings/service.py +0 -0
  179. {emdash_core-0.1.16 → emdash_core-0.1.53}/emdash_core/graph/builder.py +0 -0
  180. {emdash_core-0.1.16 → emdash_core-0.1.53}/emdash_core/graph/schema.py +0 -0
  181. {emdash_core-0.1.16 → emdash_core-0.1.53}/emdash_core/ingestion/__init__.py +0 -0
  182. {emdash_core-0.1.16 → emdash_core-0.1.53}/emdash_core/ingestion/change_detector.py +0 -0
  183. {emdash_core-0.1.16 → emdash_core-0.1.53}/emdash_core/ingestion/git/__init__.py +0 -0
  184. {emdash_core-0.1.16 → emdash_core-0.1.53}/emdash_core/ingestion/git/commit_analyzer.py +0 -0
  185. {emdash_core-0.1.16 → emdash_core-0.1.53}/emdash_core/ingestion/github/__init__.py +0 -0
  186. {emdash_core-0.1.16 → emdash_core-0.1.53}/emdash_core/ingestion/github/pr_fetcher.py +0 -0
  187. {emdash_core-0.1.16 → emdash_core-0.1.53}/emdash_core/ingestion/github/task_extractor.py +0 -0
  188. {emdash_core-0.1.16 → emdash_core-0.1.53}/emdash_core/ingestion/orchestrator.py +0 -0
  189. {emdash_core-0.1.16 → emdash_core-0.1.53}/emdash_core/ingestion/parsers/__init__.py +0 -0
  190. {emdash_core-0.1.16 → emdash_core-0.1.53}/emdash_core/ingestion/parsers/base_parser.py +0 -0
  191. {emdash_core-0.1.16 → emdash_core-0.1.53}/emdash_core/ingestion/parsers/call_graph_builder.py +0 -0
  192. {emdash_core-0.1.16 → emdash_core-0.1.53}/emdash_core/ingestion/parsers/class_extractor.py +0 -0
  193. {emdash_core-0.1.16 → emdash_core-0.1.53}/emdash_core/ingestion/parsers/function_extractor.py +0 -0
  194. {emdash_core-0.1.16 → emdash_core-0.1.53}/emdash_core/ingestion/parsers/import_analyzer.py +0 -0
  195. {emdash_core-0.1.16 → emdash_core-0.1.53}/emdash_core/ingestion/parsers/python_parser.py +0 -0
  196. {emdash_core-0.1.16 → emdash_core-0.1.53}/emdash_core/ingestion/parsers/registry.py +0 -0
  197. {emdash_core-0.1.16 → emdash_core-0.1.53}/emdash_core/ingestion/parsers/ts_ast_parser.js +0 -0
  198. {emdash_core-0.1.16 → emdash_core-0.1.53}/emdash_core/ingestion/parsers/typescript_parser.py +0 -0
  199. {emdash_core-0.1.16 → emdash_core-0.1.53}/emdash_core/models/__init__.py +0 -0
  200. {emdash_core-0.1.16 → emdash_core-0.1.53}/emdash_core/models/index.py +0 -0
  201. {emdash_core-0.1.16 → emdash_core-0.1.53}/emdash_core/models/query.py +0 -0
  202. {emdash_core-0.1.16 → emdash_core-0.1.53}/emdash_core/planning/__init__.py +0 -0
  203. {emdash_core-0.1.16 → emdash_core-0.1.53}/emdash_core/planning/agent_api.py +0 -0
  204. {emdash_core-0.1.16 → emdash_core-0.1.53}/emdash_core/planning/context_builder.py +0 -0
  205. {emdash_core-0.1.16 → emdash_core-0.1.53}/emdash_core/planning/feature_context.py +0 -0
  206. {emdash_core-0.1.16 → emdash_core-0.1.53}/emdash_core/planning/feature_expander.py +0 -0
  207. {emdash_core-0.1.16 → emdash_core-0.1.53}/emdash_core/planning/llm_explainer.py +0 -0
  208. {emdash_core-0.1.16 → emdash_core-0.1.53}/emdash_core/planning/similarity.py +0 -0
  209. {emdash_core-0.1.16 → emdash_core-0.1.53}/emdash_core/planning/team_focus.py +0 -0
  210. {emdash_core-0.1.16 → emdash_core-0.1.53}/emdash_core/sse/__init__.py +0 -0
  211. {emdash_core-0.1.16 → emdash_core-0.1.53}/emdash_core/templates/__init__.py +0 -0
  212. {emdash_core-0.1.16 → emdash_core-0.1.53}/emdash_core/templates/defaults/agent-builder.md.template +0 -0
  213. {emdash_core-0.1.16 → emdash_core-0.1.53}/emdash_core/templates/defaults/focus.md.template +0 -0
  214. {emdash_core-0.1.16 → emdash_core-0.1.53}/emdash_core/templates/defaults/pr-review-enhanced.md.template +0 -0
  215. {emdash_core-0.1.16 → emdash_core-0.1.53}/emdash_core/templates/defaults/pr-review.md.template +0 -0
  216. {emdash_core-0.1.16 → emdash_core-0.1.53}/emdash_core/templates/defaults/project.md.template +0 -0
  217. {emdash_core-0.1.16 → emdash_core-0.1.53}/emdash_core/templates/defaults/research_critic.md.template +0 -0
  218. {emdash_core-0.1.16 → emdash_core-0.1.53}/emdash_core/templates/defaults/research_planner.md.template +0 -0
  219. {emdash_core-0.1.16 → emdash_core-0.1.53}/emdash_core/templates/defaults/research_synthesizer.md.template +0 -0
  220. {emdash_core-0.1.16 → emdash_core-0.1.53}/emdash_core/templates/defaults/reviewer.md.template +0 -0
  221. {emdash_core-0.1.16 → emdash_core-0.1.53}/emdash_core/templates/defaults/spec.md.template +0 -0
  222. {emdash_core-0.1.16 → emdash_core-0.1.53}/emdash_core/templates/defaults/tasks.md.template +0 -0
  223. {emdash_core-0.1.16 → emdash_core-0.1.53}/emdash_core/templates/loader.py +0 -0
  224. {emdash_core-0.1.16 → emdash_core-0.1.53}/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.16
3
+ Version: 0.1.53
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: scipy (>=1.11.4,<2.0.0)
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-like frontmatter.
218
+ """Parse YAML frontmatter.
136
219
 
137
- Simple parser for key: value pairs.
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
- result = {}
146
-
147
- for line in frontmatter_str.strip().split("\n"):
148
- if ":" not in line:
149
- continue
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]: