emdash-core 0.1.53__tar.gz → 0.1.68__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 (198) hide show
  1. {emdash_core-0.1.53 → emdash_core-0.1.68}/PKG-INFO +4 -4
  2. {emdash_core-0.1.53 → emdash_core-0.1.68}/emdash_core/agent/providers/models.py +1 -1
  3. {emdash_core-0.1.53 → emdash_core-0.1.68}/emdash_core/agent/providers/openai_provider.py +10 -0
  4. {emdash_core-0.1.53 → emdash_core-0.1.68}/emdash_core/agent/runner/agent_runner.py +28 -12
  5. {emdash_core-0.1.53 → emdash_core-0.1.68}/emdash_core/agent/runner/sdk_runner.py +29 -2
  6. {emdash_core-0.1.53 → emdash_core-0.1.68}/emdash_core/api/agent.py +16 -2
  7. {emdash_core-0.1.53 → emdash_core-0.1.68}/pyproject.toml +6 -6
  8. {emdash_core-0.1.53 → emdash_core-0.1.68}/emdash_core/__init__.py +0 -0
  9. {emdash_core-0.1.53 → emdash_core-0.1.68}/emdash_core/agent/__init__.py +0 -0
  10. {emdash_core-0.1.53 → emdash_core-0.1.68}/emdash_core/agent/agents.py +0 -0
  11. {emdash_core-0.1.53 → emdash_core-0.1.68}/emdash_core/agent/background.py +0 -0
  12. {emdash_core-0.1.53 → emdash_core-0.1.68}/emdash_core/agent/code_reviewer.py +0 -0
  13. {emdash_core-0.1.53 → emdash_core-0.1.68}/emdash_core/agent/compaction.py +0 -0
  14. {emdash_core-0.1.53 → emdash_core-0.1.68}/emdash_core/agent/context_manager.py +0 -0
  15. {emdash_core-0.1.53 → emdash_core-0.1.68}/emdash_core/agent/events.py +0 -0
  16. {emdash_core-0.1.53 → emdash_core-0.1.68}/emdash_core/agent/handlers.py +0 -0
  17. {emdash_core-0.1.53 → emdash_core-0.1.68}/emdash_core/agent/hooks.py +0 -0
  18. {emdash_core-0.1.53 → emdash_core-0.1.68}/emdash_core/agent/inprocess_subagent.py +0 -0
  19. {emdash_core-0.1.53 → emdash_core-0.1.68}/emdash_core/agent/mcp/__init__.py +0 -0
  20. {emdash_core-0.1.53 → emdash_core-0.1.68}/emdash_core/agent/mcp/client.py +0 -0
  21. {emdash_core-0.1.53 → emdash_core-0.1.68}/emdash_core/agent/mcp/config.py +0 -0
  22. {emdash_core-0.1.53 → emdash_core-0.1.68}/emdash_core/agent/mcp/manager.py +0 -0
  23. {emdash_core-0.1.53 → emdash_core-0.1.68}/emdash_core/agent/mcp/tool_factory.py +0 -0
  24. {emdash_core-0.1.53 → emdash_core-0.1.68}/emdash_core/agent/prompts/__init__.py +0 -0
  25. {emdash_core-0.1.53 → emdash_core-0.1.68}/emdash_core/agent/prompts/main_agent.py +0 -0
  26. {emdash_core-0.1.53 → emdash_core-0.1.68}/emdash_core/agent/prompts/plan_mode.py +0 -0
  27. {emdash_core-0.1.53 → emdash_core-0.1.68}/emdash_core/agent/prompts/subagents.py +0 -0
  28. {emdash_core-0.1.53 → emdash_core-0.1.68}/emdash_core/agent/prompts/workflow.py +0 -0
  29. {emdash_core-0.1.53 → emdash_core-0.1.68}/emdash_core/agent/providers/__init__.py +0 -0
  30. {emdash_core-0.1.53 → emdash_core-0.1.68}/emdash_core/agent/providers/base.py +0 -0
  31. {emdash_core-0.1.53 → emdash_core-0.1.68}/emdash_core/agent/providers/factory.py +0 -0
  32. {emdash_core-0.1.53 → emdash_core-0.1.68}/emdash_core/agent/providers/transformers_provider.py +0 -0
  33. {emdash_core-0.1.53 → emdash_core-0.1.68}/emdash_core/agent/research/__init__.py +0 -0
  34. {emdash_core-0.1.53 → emdash_core-0.1.68}/emdash_core/agent/research/agent.py +0 -0
  35. {emdash_core-0.1.53 → emdash_core-0.1.68}/emdash_core/agent/research/controller.py +0 -0
  36. {emdash_core-0.1.53 → emdash_core-0.1.68}/emdash_core/agent/research/critic.py +0 -0
  37. {emdash_core-0.1.53 → emdash_core-0.1.68}/emdash_core/agent/research/macros.py +0 -0
  38. {emdash_core-0.1.53 → emdash_core-0.1.68}/emdash_core/agent/research/planner.py +0 -0
  39. {emdash_core-0.1.53 → emdash_core-0.1.68}/emdash_core/agent/research/researcher.py +0 -0
  40. {emdash_core-0.1.53 → emdash_core-0.1.68}/emdash_core/agent/research/state.py +0 -0
  41. {emdash_core-0.1.53 → emdash_core-0.1.68}/emdash_core/agent/research/synthesizer.py +0 -0
  42. {emdash_core-0.1.53 → emdash_core-0.1.68}/emdash_core/agent/reviewer_profile.py +0 -0
  43. {emdash_core-0.1.53 → emdash_core-0.1.68}/emdash_core/agent/rules.py +0 -0
  44. {emdash_core-0.1.53 → emdash_core-0.1.68}/emdash_core/agent/runner/__init__.py +0 -0
  45. {emdash_core-0.1.53 → emdash_core-0.1.68}/emdash_core/agent/runner/context.py +0 -0
  46. {emdash_core-0.1.53 → emdash_core-0.1.68}/emdash_core/agent/runner/factory.py +0 -0
  47. {emdash_core-0.1.53 → emdash_core-0.1.68}/emdash_core/agent/runner/plan.py +0 -0
  48. {emdash_core-0.1.53 → emdash_core-0.1.68}/emdash_core/agent/runner/utils.py +0 -0
  49. {emdash_core-0.1.53 → emdash_core-0.1.68}/emdash_core/agent/session.py +0 -0
  50. {emdash_core-0.1.53 → emdash_core-0.1.68}/emdash_core/agent/skills.py +0 -0
  51. {emdash_core-0.1.53 → emdash_core-0.1.68}/emdash_core/agent/spec_schema.py +0 -0
  52. {emdash_core-0.1.53 → emdash_core-0.1.68}/emdash_core/agent/specification.py +0 -0
  53. {emdash_core-0.1.53 → emdash_core-0.1.68}/emdash_core/agent/subagent.py +0 -0
  54. {emdash_core-0.1.53 → emdash_core-0.1.68}/emdash_core/agent/subagent_prompts.py +0 -0
  55. {emdash_core-0.1.53 → emdash_core-0.1.68}/emdash_core/agent/toolkit.py +0 -0
  56. {emdash_core-0.1.53 → emdash_core-0.1.68}/emdash_core/agent/toolkits/__init__.py +0 -0
  57. {emdash_core-0.1.53 → emdash_core-0.1.68}/emdash_core/agent/toolkits/base.py +0 -0
  58. {emdash_core-0.1.53 → emdash_core-0.1.68}/emdash_core/agent/toolkits/explore.py +0 -0
  59. {emdash_core-0.1.53 → emdash_core-0.1.68}/emdash_core/agent/toolkits/plan.py +0 -0
  60. {emdash_core-0.1.53 → emdash_core-0.1.68}/emdash_core/agent/tools/__init__.py +0 -0
  61. {emdash_core-0.1.53 → emdash_core-0.1.68}/emdash_core/agent/tools/analytics.py +0 -0
  62. {emdash_core-0.1.53 → emdash_core-0.1.68}/emdash_core/agent/tools/base.py +0 -0
  63. {emdash_core-0.1.53 → emdash_core-0.1.68}/emdash_core/agent/tools/coding.py +0 -0
  64. {emdash_core-0.1.53 → emdash_core-0.1.68}/emdash_core/agent/tools/github_mcp.py +0 -0
  65. {emdash_core-0.1.53 → emdash_core-0.1.68}/emdash_core/agent/tools/history.py +0 -0
  66. {emdash_core-0.1.53 → emdash_core-0.1.68}/emdash_core/agent/tools/lsp.py +0 -0
  67. {emdash_core-0.1.53 → emdash_core-0.1.68}/emdash_core/agent/tools/modes.py +0 -0
  68. {emdash_core-0.1.53 → emdash_core-0.1.68}/emdash_core/agent/tools/plan.py +0 -0
  69. {emdash_core-0.1.53 → emdash_core-0.1.68}/emdash_core/agent/tools/plan_write.py +0 -0
  70. {emdash_core-0.1.53 → emdash_core-0.1.68}/emdash_core/agent/tools/search.py +0 -0
  71. {emdash_core-0.1.53 → emdash_core-0.1.68}/emdash_core/agent/tools/skill.py +0 -0
  72. {emdash_core-0.1.53 → emdash_core-0.1.68}/emdash_core/agent/tools/spec.py +0 -0
  73. {emdash_core-0.1.53 → emdash_core-0.1.68}/emdash_core/agent/tools/task.py +0 -0
  74. {emdash_core-0.1.53 → emdash_core-0.1.68}/emdash_core/agent/tools/task_output.py +0 -0
  75. {emdash_core-0.1.53 → emdash_core-0.1.68}/emdash_core/agent/tools/tasks.py +0 -0
  76. {emdash_core-0.1.53 → emdash_core-0.1.68}/emdash_core/agent/tools/traversal.py +0 -0
  77. {emdash_core-0.1.53 → emdash_core-0.1.68}/emdash_core/agent/tools/web.py +0 -0
  78. {emdash_core-0.1.53 → emdash_core-0.1.68}/emdash_core/agent/verifier/__init__.py +0 -0
  79. {emdash_core-0.1.53 → emdash_core-0.1.68}/emdash_core/agent/verifier/manager.py +0 -0
  80. {emdash_core-0.1.53 → emdash_core-0.1.68}/emdash_core/agent/verifier/models.py +0 -0
  81. {emdash_core-0.1.53 → emdash_core-0.1.68}/emdash_core/agent/worktree.py +0 -0
  82. {emdash_core-0.1.53 → emdash_core-0.1.68}/emdash_core/analytics/__init__.py +0 -0
  83. {emdash_core-0.1.53 → emdash_core-0.1.68}/emdash_core/analytics/engine.py +0 -0
  84. {emdash_core-0.1.53 → emdash_core-0.1.68}/emdash_core/api/__init__.py +0 -0
  85. {emdash_core-0.1.53 → emdash_core-0.1.68}/emdash_core/api/agents.py +0 -0
  86. {emdash_core-0.1.53 → emdash_core-0.1.68}/emdash_core/api/analyze.py +0 -0
  87. {emdash_core-0.1.53 → emdash_core-0.1.68}/emdash_core/api/auth.py +0 -0
  88. {emdash_core-0.1.53 → emdash_core-0.1.68}/emdash_core/api/context.py +0 -0
  89. {emdash_core-0.1.53 → emdash_core-0.1.68}/emdash_core/api/db.py +0 -0
  90. {emdash_core-0.1.53 → emdash_core-0.1.68}/emdash_core/api/embed.py +0 -0
  91. {emdash_core-0.1.53 → emdash_core-0.1.68}/emdash_core/api/feature.py +0 -0
  92. {emdash_core-0.1.53 → emdash_core-0.1.68}/emdash_core/api/health.py +0 -0
  93. {emdash_core-0.1.53 → emdash_core-0.1.68}/emdash_core/api/index.py +0 -0
  94. {emdash_core-0.1.53 → emdash_core-0.1.68}/emdash_core/api/plan.py +0 -0
  95. {emdash_core-0.1.53 → emdash_core-0.1.68}/emdash_core/api/projectmd.py +0 -0
  96. {emdash_core-0.1.53 → emdash_core-0.1.68}/emdash_core/api/query.py +0 -0
  97. {emdash_core-0.1.53 → emdash_core-0.1.68}/emdash_core/api/research.py +0 -0
  98. {emdash_core-0.1.53 → emdash_core-0.1.68}/emdash_core/api/review.py +0 -0
  99. {emdash_core-0.1.53 → emdash_core-0.1.68}/emdash_core/api/router.py +0 -0
  100. {emdash_core-0.1.53 → emdash_core-0.1.68}/emdash_core/api/rules.py +0 -0
  101. {emdash_core-0.1.53 → emdash_core-0.1.68}/emdash_core/api/search.py +0 -0
  102. {emdash_core-0.1.53 → emdash_core-0.1.68}/emdash_core/api/skills.py +0 -0
  103. {emdash_core-0.1.53 → emdash_core-0.1.68}/emdash_core/api/spec.py +0 -0
  104. {emdash_core-0.1.53 → emdash_core-0.1.68}/emdash_core/api/tasks.py +0 -0
  105. {emdash_core-0.1.53 → emdash_core-0.1.68}/emdash_core/api/team.py +0 -0
  106. {emdash_core-0.1.53 → emdash_core-0.1.68}/emdash_core/auth/__init__.py +0 -0
  107. {emdash_core-0.1.53 → emdash_core-0.1.68}/emdash_core/auth/github.py +0 -0
  108. {emdash_core-0.1.53 → emdash_core-0.1.68}/emdash_core/checkpoint/__init__.py +0 -0
  109. {emdash_core-0.1.53 → emdash_core-0.1.68}/emdash_core/checkpoint/cli.py +0 -0
  110. {emdash_core-0.1.53 → emdash_core-0.1.68}/emdash_core/checkpoint/git_operations.py +0 -0
  111. {emdash_core-0.1.53 → emdash_core-0.1.68}/emdash_core/checkpoint/manager.py +0 -0
  112. {emdash_core-0.1.53 → emdash_core-0.1.68}/emdash_core/checkpoint/models.py +0 -0
  113. {emdash_core-0.1.53 → emdash_core-0.1.68}/emdash_core/checkpoint/storage.py +0 -0
  114. {emdash_core-0.1.53 → emdash_core-0.1.68}/emdash_core/config.py +0 -0
  115. {emdash_core-0.1.53 → emdash_core-0.1.68}/emdash_core/context/__init__.py +0 -0
  116. {emdash_core-0.1.53 → emdash_core-0.1.68}/emdash_core/context/longevity.py +0 -0
  117. {emdash_core-0.1.53 → emdash_core-0.1.68}/emdash_core/context/models.py +0 -0
  118. {emdash_core-0.1.53 → emdash_core-0.1.68}/emdash_core/context/providers/__init__.py +0 -0
  119. {emdash_core-0.1.53 → emdash_core-0.1.68}/emdash_core/context/providers/base.py +0 -0
  120. {emdash_core-0.1.53 → emdash_core-0.1.68}/emdash_core/context/providers/explored_areas.py +0 -0
  121. {emdash_core-0.1.53 → emdash_core-0.1.68}/emdash_core/context/providers/touched_areas.py +0 -0
  122. {emdash_core-0.1.53 → emdash_core-0.1.68}/emdash_core/context/registry.py +0 -0
  123. {emdash_core-0.1.53 → emdash_core-0.1.68}/emdash_core/context/reranker.py +0 -0
  124. {emdash_core-0.1.53 → emdash_core-0.1.68}/emdash_core/context/service.py +0 -0
  125. {emdash_core-0.1.53 → emdash_core-0.1.68}/emdash_core/context/session.py +0 -0
  126. {emdash_core-0.1.53 → emdash_core-0.1.68}/emdash_core/context/simple_reranker.py +0 -0
  127. {emdash_core-0.1.53 → emdash_core-0.1.68}/emdash_core/context/tool_relevance.py +0 -0
  128. {emdash_core-0.1.53 → emdash_core-0.1.68}/emdash_core/core/__init__.py +0 -0
  129. {emdash_core-0.1.53 → emdash_core-0.1.68}/emdash_core/core/config.py +0 -0
  130. {emdash_core-0.1.53 → emdash_core-0.1.68}/emdash_core/core/exceptions.py +0 -0
  131. {emdash_core-0.1.53 → emdash_core-0.1.68}/emdash_core/core/models.py +0 -0
  132. {emdash_core-0.1.53 → emdash_core-0.1.68}/emdash_core/core/review_config.py +0 -0
  133. {emdash_core-0.1.53 → emdash_core-0.1.68}/emdash_core/embeddings/__init__.py +0 -0
  134. {emdash_core-0.1.53 → emdash_core-0.1.68}/emdash_core/embeddings/indexer.py +0 -0
  135. {emdash_core-0.1.53 → emdash_core-0.1.68}/emdash_core/embeddings/models.py +0 -0
  136. {emdash_core-0.1.53 → emdash_core-0.1.68}/emdash_core/embeddings/providers/__init__.py +0 -0
  137. {emdash_core-0.1.53 → emdash_core-0.1.68}/emdash_core/embeddings/providers/base.py +0 -0
  138. {emdash_core-0.1.53 → emdash_core-0.1.68}/emdash_core/embeddings/providers/fireworks.py +0 -0
  139. {emdash_core-0.1.53 → emdash_core-0.1.68}/emdash_core/embeddings/providers/openai.py +0 -0
  140. {emdash_core-0.1.53 → emdash_core-0.1.68}/emdash_core/embeddings/registry.py +0 -0
  141. {emdash_core-0.1.53 → emdash_core-0.1.68}/emdash_core/embeddings/service.py +0 -0
  142. {emdash_core-0.1.53 → emdash_core-0.1.68}/emdash_core/graph/__init__.py +0 -0
  143. {emdash_core-0.1.53 → emdash_core-0.1.68}/emdash_core/graph/builder.py +0 -0
  144. {emdash_core-0.1.53 → emdash_core-0.1.68}/emdash_core/graph/connection.py +0 -0
  145. {emdash_core-0.1.53 → emdash_core-0.1.68}/emdash_core/graph/schema.py +0 -0
  146. {emdash_core-0.1.53 → emdash_core-0.1.68}/emdash_core/graph/writer.py +0 -0
  147. {emdash_core-0.1.53 → emdash_core-0.1.68}/emdash_core/ingestion/__init__.py +0 -0
  148. {emdash_core-0.1.53 → emdash_core-0.1.68}/emdash_core/ingestion/change_detector.py +0 -0
  149. {emdash_core-0.1.53 → emdash_core-0.1.68}/emdash_core/ingestion/git/__init__.py +0 -0
  150. {emdash_core-0.1.53 → emdash_core-0.1.68}/emdash_core/ingestion/git/commit_analyzer.py +0 -0
  151. {emdash_core-0.1.53 → emdash_core-0.1.68}/emdash_core/ingestion/github/__init__.py +0 -0
  152. {emdash_core-0.1.53 → emdash_core-0.1.68}/emdash_core/ingestion/github/pr_fetcher.py +0 -0
  153. {emdash_core-0.1.53 → emdash_core-0.1.68}/emdash_core/ingestion/github/task_extractor.py +0 -0
  154. {emdash_core-0.1.53 → emdash_core-0.1.68}/emdash_core/ingestion/orchestrator.py +0 -0
  155. {emdash_core-0.1.53 → emdash_core-0.1.68}/emdash_core/ingestion/parsers/__init__.py +0 -0
  156. {emdash_core-0.1.53 → emdash_core-0.1.68}/emdash_core/ingestion/parsers/base_parser.py +0 -0
  157. {emdash_core-0.1.53 → emdash_core-0.1.68}/emdash_core/ingestion/parsers/call_graph_builder.py +0 -0
  158. {emdash_core-0.1.53 → emdash_core-0.1.68}/emdash_core/ingestion/parsers/class_extractor.py +0 -0
  159. {emdash_core-0.1.53 → emdash_core-0.1.68}/emdash_core/ingestion/parsers/function_extractor.py +0 -0
  160. {emdash_core-0.1.53 → emdash_core-0.1.68}/emdash_core/ingestion/parsers/import_analyzer.py +0 -0
  161. {emdash_core-0.1.53 → emdash_core-0.1.68}/emdash_core/ingestion/parsers/python_parser.py +0 -0
  162. {emdash_core-0.1.53 → emdash_core-0.1.68}/emdash_core/ingestion/parsers/registry.py +0 -0
  163. {emdash_core-0.1.53 → emdash_core-0.1.68}/emdash_core/ingestion/parsers/ts_ast_parser.js +0 -0
  164. {emdash_core-0.1.53 → emdash_core-0.1.68}/emdash_core/ingestion/parsers/typescript_parser.py +0 -0
  165. {emdash_core-0.1.53 → emdash_core-0.1.68}/emdash_core/ingestion/repository.py +0 -0
  166. {emdash_core-0.1.53 → emdash_core-0.1.68}/emdash_core/models/__init__.py +0 -0
  167. {emdash_core-0.1.53 → emdash_core-0.1.68}/emdash_core/models/agent.py +0 -0
  168. {emdash_core-0.1.53 → emdash_core-0.1.68}/emdash_core/models/index.py +0 -0
  169. {emdash_core-0.1.53 → emdash_core-0.1.68}/emdash_core/models/query.py +0 -0
  170. {emdash_core-0.1.53 → emdash_core-0.1.68}/emdash_core/planning/__init__.py +0 -0
  171. {emdash_core-0.1.53 → emdash_core-0.1.68}/emdash_core/planning/agent_api.py +0 -0
  172. {emdash_core-0.1.53 → emdash_core-0.1.68}/emdash_core/planning/context_builder.py +0 -0
  173. {emdash_core-0.1.53 → emdash_core-0.1.68}/emdash_core/planning/feature_context.py +0 -0
  174. {emdash_core-0.1.53 → emdash_core-0.1.68}/emdash_core/planning/feature_expander.py +0 -0
  175. {emdash_core-0.1.53 → emdash_core-0.1.68}/emdash_core/planning/llm_explainer.py +0 -0
  176. {emdash_core-0.1.53 → emdash_core-0.1.68}/emdash_core/planning/similarity.py +0 -0
  177. {emdash_core-0.1.53 → emdash_core-0.1.68}/emdash_core/planning/team_focus.py +0 -0
  178. {emdash_core-0.1.53 → emdash_core-0.1.68}/emdash_core/server.py +0 -0
  179. {emdash_core-0.1.53 → emdash_core-0.1.68}/emdash_core/skills/frontend-design/SKILL.md +0 -0
  180. {emdash_core-0.1.53 → emdash_core-0.1.68}/emdash_core/sse/__init__.py +0 -0
  181. {emdash_core-0.1.53 → emdash_core-0.1.68}/emdash_core/sse/stream.py +0 -0
  182. {emdash_core-0.1.53 → emdash_core-0.1.68}/emdash_core/templates/__init__.py +0 -0
  183. {emdash_core-0.1.53 → emdash_core-0.1.68}/emdash_core/templates/defaults/agent-builder.md.template +0 -0
  184. {emdash_core-0.1.53 → emdash_core-0.1.68}/emdash_core/templates/defaults/focus.md.template +0 -0
  185. {emdash_core-0.1.53 → emdash_core-0.1.68}/emdash_core/templates/defaults/pr-review-enhanced.md.template +0 -0
  186. {emdash_core-0.1.53 → emdash_core-0.1.68}/emdash_core/templates/defaults/pr-review.md.template +0 -0
  187. {emdash_core-0.1.53 → emdash_core-0.1.68}/emdash_core/templates/defaults/project.md.template +0 -0
  188. {emdash_core-0.1.53 → emdash_core-0.1.68}/emdash_core/templates/defaults/research_critic.md.template +0 -0
  189. {emdash_core-0.1.53 → emdash_core-0.1.68}/emdash_core/templates/defaults/research_planner.md.template +0 -0
  190. {emdash_core-0.1.53 → emdash_core-0.1.68}/emdash_core/templates/defaults/research_synthesizer.md.template +0 -0
  191. {emdash_core-0.1.53 → emdash_core-0.1.68}/emdash_core/templates/defaults/reviewer.md.template +0 -0
  192. {emdash_core-0.1.53 → emdash_core-0.1.68}/emdash_core/templates/defaults/spec.md.template +0 -0
  193. {emdash_core-0.1.53 → emdash_core-0.1.68}/emdash_core/templates/defaults/tasks.md.template +0 -0
  194. {emdash_core-0.1.53 → emdash_core-0.1.68}/emdash_core/templates/loader.py +0 -0
  195. {emdash_core-0.1.53 → emdash_core-0.1.68}/emdash_core/utils/__init__.py +0 -0
  196. {emdash_core-0.1.53 → emdash_core-0.1.68}/emdash_core/utils/git.py +0 -0
  197. {emdash_core-0.1.53 → emdash_core-0.1.68}/emdash_core/utils/image.py +0 -0
  198. {emdash_core-0.1.53 → emdash_core-0.1.68}/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.53
3
+ Version: 0.1.68
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,16 +10,15 @@ 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
14
13
  Requires-Dist: astroid (>=3.0.1,<4.0.0)
15
14
  Requires-Dist: beautifulsoup4 (>=4.12.0)
16
15
  Requires-Dist: claude-agent-sdk (>=0.1.19)
17
- Requires-Dist: cmake (>=3.25.0) ; extra == "graph"
16
+ Requires-Dist: cmake (>=3.25.0)
18
17
  Requires-Dist: duckduckgo-search (>=6.0.0)
19
18
  Requires-Dist: fastapi (>=0.109.0)
20
19
  Requires-Dist: gitpython (>=3.1.40,<4.0.0)
21
20
  Requires-Dist: httpx (>=0.25.0)
22
- Requires-Dist: kuzu (>=0.4.0) ; extra == "graph"
21
+ Requires-Dist: kuzu (>=0.4.0)
23
22
  Requires-Dist: loguru (>=0.7.2,<0.8.0)
24
23
  Requires-Dist: networkx (>=3.2.1,<4.0.0)
25
24
  Requires-Dist: numpy (>=1.26.0)
@@ -27,6 +26,7 @@ Requires-Dist: openai (>=1.0.0)
27
26
  Requires-Dist: pydantic (>=2.5.0,<3.0.0)
28
27
  Requires-Dist: pydantic-settings (>=2.0.0,<3.0.0)
29
28
  Requires-Dist: pygithub (>=2.1.1,<3.0.0)
29
+ Requires-Dist: pyobjc-framework-Cocoa (>=9.0) ; sys_platform == "darwin"
30
30
  Requires-Dist: pypng (>=0.0.21,<0.0.22)
31
31
  Requires-Dist: python-dotenv (>=1.0.0,<2.0.0)
32
32
  Requires-Dist: python-louvain (>=0.16,<0.17)
@@ -111,7 +111,7 @@ class ChatModel(Enum):
111
111
  context_window=1000000,
112
112
  max_output_tokens=16384,
113
113
  supports_tools=True,
114
- supports_vision=False,
114
+ supports_vision=False, # Fireworks deployment doesn't expose vision
115
115
  supports_thinking=False,
116
116
  description="MiniMax M2P1 - Long context model",
117
117
  )
@@ -139,6 +139,8 @@ class OpenAIProvider(LLMProvider):
139
139
  self._thinking_budget = int(os.environ.get("EMDASH_THINKING_BUDGET", "10000"))
140
140
  # Reasoning effort for Fireworks thinking models: none, low, medium, high
141
141
  self._reasoning_effort = os.environ.get("EMDASH_REASONING_EFFORT", "medium")
142
+ # Parallel tool calls for OpenAI-compatible APIs (Fireworks supports this)
143
+ self._parallel_tool_calls = self._parse_bool_env("EMDASH_PARALLEL_TOOL_CALLS")
142
144
 
143
145
  # Use OPENAI_BASE_URL env var only for OpenAI provider, otherwise use provider config
144
146
  if self._provider == "openai":
@@ -244,6 +246,14 @@ class OpenAIProvider(LLMProvider):
244
246
  if tools:
245
247
  kwargs["tools"] = tools
246
248
  kwargs["tool_choice"] = "auto"
249
+ # Add parallel_tool_calls if enabled (Fireworks and OpenAI support this)
250
+ if self._parallel_tool_calls is True:
251
+ kwargs["parallel_tool_calls"] = True
252
+ log.debug(
253
+ "Parallel tool calls enabled provider={} model={}",
254
+ self._provider,
255
+ self.model,
256
+ )
247
257
 
248
258
  # Add reasoning support via extra_body for providers that support it
249
259
  # Skip reasoning for custom base URLs (they may not support it)
@@ -310,24 +310,27 @@ class AgentRunner(PlanMixin):
310
310
  from ..tools.modes import ModeState
311
311
  ModeState.get_instance().reset_cycle()
312
312
 
313
- # Build user message
313
+ # Build user message content
314
314
  if context:
315
- user_message = {
316
- "role": "user",
317
- "content": f"Context:\n{context}\n\nQuestion: {query}",
318
- }
315
+ text_content = f"Context:\n{context}\n\nQuestion: {query}"
319
316
  else:
320
- user_message = {
321
- "role": "user",
322
- "content": query,
323
- }
317
+ text_content = query
318
+
319
+ # Format content with images if provided
320
+ if images:
321
+ content = self.provider.format_content_with_images(text_content, images)
322
+ else:
323
+ content = text_content
324
+
325
+ user_message = {
326
+ "role": "user",
327
+ "content": content,
328
+ }
324
329
 
325
330
  # Save user message to history BEFORE running (so it's preserved even if interrupted)
326
331
  self._messages.append(user_message)
327
332
  messages = list(self._messages) # Copy for the loop
328
333
 
329
- # TODO: Handle images if provided
330
-
331
334
  # Get tool schemas
332
335
  tools = self.toolkit.get_all_schemas()
333
336
 
@@ -790,13 +793,26 @@ DO NOT output more text. Use a tool NOW.""",
790
793
  # No history, just run fresh
791
794
  return self.run(message, images=images)
792
795
 
796
+ # Reset per-cycle mode state (allows exit_plan to be called again)
797
+ # This is critical for plan mode - without this reset, if a clarification
798
+ # response comes in after exit_plan was called, plan_submitted would remain
799
+ # True and block subsequent exit_plan calls.
800
+ from ..tools.modes import ModeState
801
+ ModeState.get_instance().reset_cycle()
802
+
793
803
  # Store query for reranking context frame
794
804
  self._current_query = message
795
805
 
806
+ # Format content with images if provided
807
+ if images:
808
+ content = self.provider.format_content_with_images(message, images)
809
+ else:
810
+ content = message
811
+
796
812
  # Add new user message to history
797
813
  self._messages.append({
798
814
  "role": "user",
799
- "content": message,
815
+ "content": content,
800
816
  })
801
817
 
802
818
  # Get tool schemas
@@ -184,11 +184,12 @@ class SDKAgentRunner:
184
184
  from ..events import EventType
185
185
  self.emitter.emit(getattr(EventType, event_type), data)
186
186
 
187
- async def run(self, prompt: str) -> AsyncIterator[dict]:
187
+ async def run(self, prompt: str, images: list = None) -> AsyncIterator[dict]:
188
188
  """Execute agent with SDK.
189
189
 
190
190
  Args:
191
191
  prompt: User prompt/task
192
+ images: Optional list of image dicts with 'data' (bytes) and 'format' keys
192
193
 
193
194
  Yields:
194
195
  Event dicts for UI streaming
@@ -201,6 +202,7 @@ class SDKAgentRunner:
201
202
  ToolResultBlock,
202
203
  ResultMessage,
203
204
  )
205
+ import base64
204
206
 
205
207
  options = self._get_options()
206
208
 
@@ -210,9 +212,34 @@ class SDKAgentRunner:
210
212
  "agent_name": "Emdash Code (SDK)",
211
213
  })
212
214
 
215
+ # Format prompt with images if provided
216
+ if images:
217
+ # Build content blocks for Claude SDK
218
+ content_blocks = []
219
+ for img in images:
220
+ img_data = img.get("data")
221
+ img_format = img.get("format", "png")
222
+ if isinstance(img_data, bytes):
223
+ encoded = base64.b64encode(img_data).decode("utf-8")
224
+ else:
225
+ encoded = img_data # Already base64 encoded
226
+ content_blocks.append({
227
+ "type": "image",
228
+ "source": {
229
+ "type": "base64",
230
+ "media_type": f"image/{img_format}",
231
+ "data": encoded,
232
+ }
233
+ })
234
+ content_blocks.append({"type": "text", "text": prompt})
235
+ query_content = content_blocks
236
+ log.info(f"SDK agent: sending {len(images)} images with prompt")
237
+ else:
238
+ query_content = prompt
239
+
213
240
  try:
214
241
  async with ClaudeSDKClient(options=options) as client:
215
- await client.query(prompt)
242
+ await client.query(query_content)
216
243
 
217
244
  async for message in client.receive_response():
218
245
  # Process message and yield events
@@ -38,6 +38,7 @@ def _run_sdk_agent(
38
38
  session_id: str,
39
39
  emitter,
40
40
  plan_mode: bool = False,
41
+ images: list = None,
41
42
  ):
42
43
  """Run the agent using Anthropic Agent SDK.
43
44
 
@@ -72,7 +73,7 @@ def _run_sdk_agent(
72
73
  # Run async agent in sync context
73
74
  async def run_async():
74
75
  response_text = ""
75
- async for event in runner.run(message):
76
+ async for event in runner.run(message, images=images):
76
77
  if event.get("type") == "text":
77
78
  response_text += event.get("content", "")
78
79
  return response_text
@@ -154,6 +155,14 @@ def _run_agent_sync(
154
155
 
155
156
  # Use SDK for Claude models if enabled
156
157
  if use_sdk and is_claude_model(model):
158
+ # Convert images for SDK if provided
159
+ sdk_images = None
160
+ if images:
161
+ import base64
162
+ sdk_images = [
163
+ {"data": base64.b64decode(img.data), "format": img.format}
164
+ for img in images
165
+ ]
157
166
  return _run_sdk_agent(
158
167
  message=message,
159
168
  model=model,
@@ -161,6 +170,7 @@ def _run_agent_sync(
161
170
  session_id=session_id,
162
171
  emitter=emitter,
163
172
  plan_mode=plan_mode,
173
+ images=sdk_images,
164
174
  )
165
175
 
166
176
  # Standard path: use AgentRunner with OpenAI-compatible API
@@ -251,9 +261,13 @@ def _run_agent_sync(
251
261
  # Convert image data if provided
252
262
  agent_images = None
253
263
  if images:
264
+ import base64
254
265
  from ..agent.providers.base import ImageContent
255
266
  agent_images = [
256
- ImageContent(data=img.data, format=img.format)
267
+ ImageContent(
268
+ image_data=base64.b64decode(img.data),
269
+ format=img.format
270
+ )
257
271
  for img in images
258
272
  ]
259
273
 
@@ -1,6 +1,6 @@
1
1
  [tool.poetry]
2
2
  name = "emdash-core"
3
- version = "0.1.53"
3
+ version = "0.1.68"
4
4
  description = "EmDash Core - FastAPI server for code intelligence"
5
5
  authors = ["Em Dash Team"]
6
6
  packages = [{include = "emdash_core"}]
@@ -16,9 +16,9 @@ fastapi = ">=0.109.0"
16
16
  uvicorn = {extras = ["standard"], version = ">=0.27.0"}
17
17
  sse-starlette = ">=2.0.0"
18
18
 
19
- # Graph database (optional - requires C++ compilation on some platforms)
20
- cmake = {version = ">=3.25.0", optional = true}
21
- kuzu = {version = ">=0.4.0", optional = true}
19
+ # Graph database
20
+ cmake = ">=3.25.0"
21
+ kuzu = ">=0.4.0"
22
22
 
23
23
  # LLM
24
24
  openai = ">=1.0.0"
@@ -54,8 +54,8 @@ tqdm = "^4.66.1"
54
54
  pypng = "^0.0.21"
55
55
  pyyaml = "^6.0"
56
56
 
57
- [tool.poetry.extras]
58
- graph = ["kuzu", "cmake"]
57
+ # Clipboard (macOS only)
58
+ pyobjc-framework-Cocoa = {version = ">=9.0", markers = "sys_platform == 'darwin'"}
59
59
 
60
60
  [tool.poetry.group.dev.dependencies]
61
61
  pytest = "^7.4.3"