emdash-core 0.1.50__tar.gz → 0.1.57__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.50 → emdash_core-0.1.57}/PKG-INFO +2 -1
  2. {emdash_core-0.1.50 → emdash_core-0.1.57}/emdash_core/agent/prompts/workflow.py +41 -27
  3. {emdash_core-0.1.50 → emdash_core-0.1.57}/emdash_core/agent/runner/agent_runner.py +21 -12
  4. {emdash_core-0.1.50 → emdash_core-0.1.57}/emdash_core/api/agent.py +5 -1
  5. {emdash_core-0.1.50 → emdash_core-0.1.57}/emdash_core/utils/image.py +33 -11
  6. {emdash_core-0.1.50 → emdash_core-0.1.57}/pyproject.toml +4 -1
  7. {emdash_core-0.1.50 → emdash_core-0.1.57}/emdash_core/__init__.py +0 -0
  8. {emdash_core-0.1.50 → emdash_core-0.1.57}/emdash_core/agent/__init__.py +0 -0
  9. {emdash_core-0.1.50 → emdash_core-0.1.57}/emdash_core/agent/agents.py +0 -0
  10. {emdash_core-0.1.50 → emdash_core-0.1.57}/emdash_core/agent/background.py +0 -0
  11. {emdash_core-0.1.50 → emdash_core-0.1.57}/emdash_core/agent/code_reviewer.py +0 -0
  12. {emdash_core-0.1.50 → emdash_core-0.1.57}/emdash_core/agent/compaction.py +0 -0
  13. {emdash_core-0.1.50 → emdash_core-0.1.57}/emdash_core/agent/context_manager.py +0 -0
  14. {emdash_core-0.1.50 → emdash_core-0.1.57}/emdash_core/agent/events.py +0 -0
  15. {emdash_core-0.1.50 → emdash_core-0.1.57}/emdash_core/agent/handlers.py +0 -0
  16. {emdash_core-0.1.50 → emdash_core-0.1.57}/emdash_core/agent/hooks.py +0 -0
  17. {emdash_core-0.1.50 → emdash_core-0.1.57}/emdash_core/agent/inprocess_subagent.py +0 -0
  18. {emdash_core-0.1.50 → emdash_core-0.1.57}/emdash_core/agent/mcp/__init__.py +0 -0
  19. {emdash_core-0.1.50 → emdash_core-0.1.57}/emdash_core/agent/mcp/client.py +0 -0
  20. {emdash_core-0.1.50 → emdash_core-0.1.57}/emdash_core/agent/mcp/config.py +0 -0
  21. {emdash_core-0.1.50 → emdash_core-0.1.57}/emdash_core/agent/mcp/manager.py +0 -0
  22. {emdash_core-0.1.50 → emdash_core-0.1.57}/emdash_core/agent/mcp/tool_factory.py +0 -0
  23. {emdash_core-0.1.50 → emdash_core-0.1.57}/emdash_core/agent/prompts/__init__.py +0 -0
  24. {emdash_core-0.1.50 → emdash_core-0.1.57}/emdash_core/agent/prompts/main_agent.py +0 -0
  25. {emdash_core-0.1.50 → emdash_core-0.1.57}/emdash_core/agent/prompts/plan_mode.py +0 -0
  26. {emdash_core-0.1.50 → emdash_core-0.1.57}/emdash_core/agent/prompts/subagents.py +0 -0
  27. {emdash_core-0.1.50 → emdash_core-0.1.57}/emdash_core/agent/providers/__init__.py +0 -0
  28. {emdash_core-0.1.50 → emdash_core-0.1.57}/emdash_core/agent/providers/base.py +0 -0
  29. {emdash_core-0.1.50 → emdash_core-0.1.57}/emdash_core/agent/providers/factory.py +0 -0
  30. {emdash_core-0.1.50 → emdash_core-0.1.57}/emdash_core/agent/providers/models.py +0 -0
  31. {emdash_core-0.1.50 → emdash_core-0.1.57}/emdash_core/agent/providers/openai_provider.py +0 -0
  32. {emdash_core-0.1.50 → emdash_core-0.1.57}/emdash_core/agent/providers/transformers_provider.py +0 -0
  33. {emdash_core-0.1.50 → emdash_core-0.1.57}/emdash_core/agent/research/__init__.py +0 -0
  34. {emdash_core-0.1.50 → emdash_core-0.1.57}/emdash_core/agent/research/agent.py +0 -0
  35. {emdash_core-0.1.50 → emdash_core-0.1.57}/emdash_core/agent/research/controller.py +0 -0
  36. {emdash_core-0.1.50 → emdash_core-0.1.57}/emdash_core/agent/research/critic.py +0 -0
  37. {emdash_core-0.1.50 → emdash_core-0.1.57}/emdash_core/agent/research/macros.py +0 -0
  38. {emdash_core-0.1.50 → emdash_core-0.1.57}/emdash_core/agent/research/planner.py +0 -0
  39. {emdash_core-0.1.50 → emdash_core-0.1.57}/emdash_core/agent/research/researcher.py +0 -0
  40. {emdash_core-0.1.50 → emdash_core-0.1.57}/emdash_core/agent/research/state.py +0 -0
  41. {emdash_core-0.1.50 → emdash_core-0.1.57}/emdash_core/agent/research/synthesizer.py +0 -0
  42. {emdash_core-0.1.50 → emdash_core-0.1.57}/emdash_core/agent/reviewer_profile.py +0 -0
  43. {emdash_core-0.1.50 → emdash_core-0.1.57}/emdash_core/agent/rules.py +0 -0
  44. {emdash_core-0.1.50 → emdash_core-0.1.57}/emdash_core/agent/runner/__init__.py +0 -0
  45. {emdash_core-0.1.50 → emdash_core-0.1.57}/emdash_core/agent/runner/context.py +0 -0
  46. {emdash_core-0.1.50 → emdash_core-0.1.57}/emdash_core/agent/runner/factory.py +0 -0
  47. {emdash_core-0.1.50 → emdash_core-0.1.57}/emdash_core/agent/runner/plan.py +0 -0
  48. {emdash_core-0.1.50 → emdash_core-0.1.57}/emdash_core/agent/runner/sdk_runner.py +0 -0
  49. {emdash_core-0.1.50 → emdash_core-0.1.57}/emdash_core/agent/runner/utils.py +0 -0
  50. {emdash_core-0.1.50 → emdash_core-0.1.57}/emdash_core/agent/session.py +0 -0
  51. {emdash_core-0.1.50 → emdash_core-0.1.57}/emdash_core/agent/skills.py +0 -0
  52. {emdash_core-0.1.50 → emdash_core-0.1.57}/emdash_core/agent/spec_schema.py +0 -0
  53. {emdash_core-0.1.50 → emdash_core-0.1.57}/emdash_core/agent/specification.py +0 -0
  54. {emdash_core-0.1.50 → emdash_core-0.1.57}/emdash_core/agent/subagent.py +0 -0
  55. {emdash_core-0.1.50 → emdash_core-0.1.57}/emdash_core/agent/subagent_prompts.py +0 -0
  56. {emdash_core-0.1.50 → emdash_core-0.1.57}/emdash_core/agent/toolkit.py +0 -0
  57. {emdash_core-0.1.50 → emdash_core-0.1.57}/emdash_core/agent/toolkits/__init__.py +0 -0
  58. {emdash_core-0.1.50 → emdash_core-0.1.57}/emdash_core/agent/toolkits/base.py +0 -0
  59. {emdash_core-0.1.50 → emdash_core-0.1.57}/emdash_core/agent/toolkits/explore.py +0 -0
  60. {emdash_core-0.1.50 → emdash_core-0.1.57}/emdash_core/agent/toolkits/plan.py +0 -0
  61. {emdash_core-0.1.50 → emdash_core-0.1.57}/emdash_core/agent/tools/__init__.py +0 -0
  62. {emdash_core-0.1.50 → emdash_core-0.1.57}/emdash_core/agent/tools/analytics.py +0 -0
  63. {emdash_core-0.1.50 → emdash_core-0.1.57}/emdash_core/agent/tools/base.py +0 -0
  64. {emdash_core-0.1.50 → emdash_core-0.1.57}/emdash_core/agent/tools/coding.py +0 -0
  65. {emdash_core-0.1.50 → emdash_core-0.1.57}/emdash_core/agent/tools/github_mcp.py +0 -0
  66. {emdash_core-0.1.50 → emdash_core-0.1.57}/emdash_core/agent/tools/history.py +0 -0
  67. {emdash_core-0.1.50 → emdash_core-0.1.57}/emdash_core/agent/tools/lsp.py +0 -0
  68. {emdash_core-0.1.50 → emdash_core-0.1.57}/emdash_core/agent/tools/modes.py +0 -0
  69. {emdash_core-0.1.50 → emdash_core-0.1.57}/emdash_core/agent/tools/plan.py +0 -0
  70. {emdash_core-0.1.50 → emdash_core-0.1.57}/emdash_core/agent/tools/plan_write.py +0 -0
  71. {emdash_core-0.1.50 → emdash_core-0.1.57}/emdash_core/agent/tools/search.py +0 -0
  72. {emdash_core-0.1.50 → emdash_core-0.1.57}/emdash_core/agent/tools/skill.py +0 -0
  73. {emdash_core-0.1.50 → emdash_core-0.1.57}/emdash_core/agent/tools/spec.py +0 -0
  74. {emdash_core-0.1.50 → emdash_core-0.1.57}/emdash_core/agent/tools/task.py +0 -0
  75. {emdash_core-0.1.50 → emdash_core-0.1.57}/emdash_core/agent/tools/task_output.py +0 -0
  76. {emdash_core-0.1.50 → emdash_core-0.1.57}/emdash_core/agent/tools/tasks.py +0 -0
  77. {emdash_core-0.1.50 → emdash_core-0.1.57}/emdash_core/agent/tools/traversal.py +0 -0
  78. {emdash_core-0.1.50 → emdash_core-0.1.57}/emdash_core/agent/tools/web.py +0 -0
  79. {emdash_core-0.1.50 → emdash_core-0.1.57}/emdash_core/agent/verifier/__init__.py +0 -0
  80. {emdash_core-0.1.50 → emdash_core-0.1.57}/emdash_core/agent/verifier/manager.py +0 -0
  81. {emdash_core-0.1.50 → emdash_core-0.1.57}/emdash_core/agent/verifier/models.py +0 -0
  82. {emdash_core-0.1.50 → emdash_core-0.1.57}/emdash_core/agent/worktree.py +0 -0
  83. {emdash_core-0.1.50 → emdash_core-0.1.57}/emdash_core/analytics/__init__.py +0 -0
  84. {emdash_core-0.1.50 → emdash_core-0.1.57}/emdash_core/analytics/engine.py +0 -0
  85. {emdash_core-0.1.50 → emdash_core-0.1.57}/emdash_core/api/__init__.py +0 -0
  86. {emdash_core-0.1.50 → emdash_core-0.1.57}/emdash_core/api/agents.py +0 -0
  87. {emdash_core-0.1.50 → emdash_core-0.1.57}/emdash_core/api/analyze.py +0 -0
  88. {emdash_core-0.1.50 → emdash_core-0.1.57}/emdash_core/api/auth.py +0 -0
  89. {emdash_core-0.1.50 → emdash_core-0.1.57}/emdash_core/api/context.py +0 -0
  90. {emdash_core-0.1.50 → emdash_core-0.1.57}/emdash_core/api/db.py +0 -0
  91. {emdash_core-0.1.50 → emdash_core-0.1.57}/emdash_core/api/embed.py +0 -0
  92. {emdash_core-0.1.50 → emdash_core-0.1.57}/emdash_core/api/feature.py +0 -0
  93. {emdash_core-0.1.50 → emdash_core-0.1.57}/emdash_core/api/health.py +0 -0
  94. {emdash_core-0.1.50 → emdash_core-0.1.57}/emdash_core/api/index.py +0 -0
  95. {emdash_core-0.1.50 → emdash_core-0.1.57}/emdash_core/api/plan.py +0 -0
  96. {emdash_core-0.1.50 → emdash_core-0.1.57}/emdash_core/api/projectmd.py +0 -0
  97. {emdash_core-0.1.50 → emdash_core-0.1.57}/emdash_core/api/query.py +0 -0
  98. {emdash_core-0.1.50 → emdash_core-0.1.57}/emdash_core/api/research.py +0 -0
  99. {emdash_core-0.1.50 → emdash_core-0.1.57}/emdash_core/api/review.py +0 -0
  100. {emdash_core-0.1.50 → emdash_core-0.1.57}/emdash_core/api/router.py +0 -0
  101. {emdash_core-0.1.50 → emdash_core-0.1.57}/emdash_core/api/rules.py +0 -0
  102. {emdash_core-0.1.50 → emdash_core-0.1.57}/emdash_core/api/search.py +0 -0
  103. {emdash_core-0.1.50 → emdash_core-0.1.57}/emdash_core/api/skills.py +0 -0
  104. {emdash_core-0.1.50 → emdash_core-0.1.57}/emdash_core/api/spec.py +0 -0
  105. {emdash_core-0.1.50 → emdash_core-0.1.57}/emdash_core/api/tasks.py +0 -0
  106. {emdash_core-0.1.50 → emdash_core-0.1.57}/emdash_core/api/team.py +0 -0
  107. {emdash_core-0.1.50 → emdash_core-0.1.57}/emdash_core/auth/__init__.py +0 -0
  108. {emdash_core-0.1.50 → emdash_core-0.1.57}/emdash_core/auth/github.py +0 -0
  109. {emdash_core-0.1.50 → emdash_core-0.1.57}/emdash_core/checkpoint/__init__.py +0 -0
  110. {emdash_core-0.1.50 → emdash_core-0.1.57}/emdash_core/checkpoint/cli.py +0 -0
  111. {emdash_core-0.1.50 → emdash_core-0.1.57}/emdash_core/checkpoint/git_operations.py +0 -0
  112. {emdash_core-0.1.50 → emdash_core-0.1.57}/emdash_core/checkpoint/manager.py +0 -0
  113. {emdash_core-0.1.50 → emdash_core-0.1.57}/emdash_core/checkpoint/models.py +0 -0
  114. {emdash_core-0.1.50 → emdash_core-0.1.57}/emdash_core/checkpoint/storage.py +0 -0
  115. {emdash_core-0.1.50 → emdash_core-0.1.57}/emdash_core/config.py +0 -0
  116. {emdash_core-0.1.50 → emdash_core-0.1.57}/emdash_core/context/__init__.py +0 -0
  117. {emdash_core-0.1.50 → emdash_core-0.1.57}/emdash_core/context/longevity.py +0 -0
  118. {emdash_core-0.1.50 → emdash_core-0.1.57}/emdash_core/context/models.py +0 -0
  119. {emdash_core-0.1.50 → emdash_core-0.1.57}/emdash_core/context/providers/__init__.py +0 -0
  120. {emdash_core-0.1.50 → emdash_core-0.1.57}/emdash_core/context/providers/base.py +0 -0
  121. {emdash_core-0.1.50 → emdash_core-0.1.57}/emdash_core/context/providers/explored_areas.py +0 -0
  122. {emdash_core-0.1.50 → emdash_core-0.1.57}/emdash_core/context/providers/touched_areas.py +0 -0
  123. {emdash_core-0.1.50 → emdash_core-0.1.57}/emdash_core/context/registry.py +0 -0
  124. {emdash_core-0.1.50 → emdash_core-0.1.57}/emdash_core/context/reranker.py +0 -0
  125. {emdash_core-0.1.50 → emdash_core-0.1.57}/emdash_core/context/service.py +0 -0
  126. {emdash_core-0.1.50 → emdash_core-0.1.57}/emdash_core/context/session.py +0 -0
  127. {emdash_core-0.1.50 → emdash_core-0.1.57}/emdash_core/context/simple_reranker.py +0 -0
  128. {emdash_core-0.1.50 → emdash_core-0.1.57}/emdash_core/context/tool_relevance.py +0 -0
  129. {emdash_core-0.1.50 → emdash_core-0.1.57}/emdash_core/core/__init__.py +0 -0
  130. {emdash_core-0.1.50 → emdash_core-0.1.57}/emdash_core/core/config.py +0 -0
  131. {emdash_core-0.1.50 → emdash_core-0.1.57}/emdash_core/core/exceptions.py +0 -0
  132. {emdash_core-0.1.50 → emdash_core-0.1.57}/emdash_core/core/models.py +0 -0
  133. {emdash_core-0.1.50 → emdash_core-0.1.57}/emdash_core/core/review_config.py +0 -0
  134. {emdash_core-0.1.50 → emdash_core-0.1.57}/emdash_core/embeddings/__init__.py +0 -0
  135. {emdash_core-0.1.50 → emdash_core-0.1.57}/emdash_core/embeddings/indexer.py +0 -0
  136. {emdash_core-0.1.50 → emdash_core-0.1.57}/emdash_core/embeddings/models.py +0 -0
  137. {emdash_core-0.1.50 → emdash_core-0.1.57}/emdash_core/embeddings/providers/__init__.py +0 -0
  138. {emdash_core-0.1.50 → emdash_core-0.1.57}/emdash_core/embeddings/providers/base.py +0 -0
  139. {emdash_core-0.1.50 → emdash_core-0.1.57}/emdash_core/embeddings/providers/fireworks.py +0 -0
  140. {emdash_core-0.1.50 → emdash_core-0.1.57}/emdash_core/embeddings/providers/openai.py +0 -0
  141. {emdash_core-0.1.50 → emdash_core-0.1.57}/emdash_core/embeddings/registry.py +0 -0
  142. {emdash_core-0.1.50 → emdash_core-0.1.57}/emdash_core/embeddings/service.py +0 -0
  143. {emdash_core-0.1.50 → emdash_core-0.1.57}/emdash_core/graph/__init__.py +0 -0
  144. {emdash_core-0.1.50 → emdash_core-0.1.57}/emdash_core/graph/builder.py +0 -0
  145. {emdash_core-0.1.50 → emdash_core-0.1.57}/emdash_core/graph/connection.py +0 -0
  146. {emdash_core-0.1.50 → emdash_core-0.1.57}/emdash_core/graph/schema.py +0 -0
  147. {emdash_core-0.1.50 → emdash_core-0.1.57}/emdash_core/graph/writer.py +0 -0
  148. {emdash_core-0.1.50 → emdash_core-0.1.57}/emdash_core/ingestion/__init__.py +0 -0
  149. {emdash_core-0.1.50 → emdash_core-0.1.57}/emdash_core/ingestion/change_detector.py +0 -0
  150. {emdash_core-0.1.50 → emdash_core-0.1.57}/emdash_core/ingestion/git/__init__.py +0 -0
  151. {emdash_core-0.1.50 → emdash_core-0.1.57}/emdash_core/ingestion/git/commit_analyzer.py +0 -0
  152. {emdash_core-0.1.50 → emdash_core-0.1.57}/emdash_core/ingestion/github/__init__.py +0 -0
  153. {emdash_core-0.1.50 → emdash_core-0.1.57}/emdash_core/ingestion/github/pr_fetcher.py +0 -0
  154. {emdash_core-0.1.50 → emdash_core-0.1.57}/emdash_core/ingestion/github/task_extractor.py +0 -0
  155. {emdash_core-0.1.50 → emdash_core-0.1.57}/emdash_core/ingestion/orchestrator.py +0 -0
  156. {emdash_core-0.1.50 → emdash_core-0.1.57}/emdash_core/ingestion/parsers/__init__.py +0 -0
  157. {emdash_core-0.1.50 → emdash_core-0.1.57}/emdash_core/ingestion/parsers/base_parser.py +0 -0
  158. {emdash_core-0.1.50 → emdash_core-0.1.57}/emdash_core/ingestion/parsers/call_graph_builder.py +0 -0
  159. {emdash_core-0.1.50 → emdash_core-0.1.57}/emdash_core/ingestion/parsers/class_extractor.py +0 -0
  160. {emdash_core-0.1.50 → emdash_core-0.1.57}/emdash_core/ingestion/parsers/function_extractor.py +0 -0
  161. {emdash_core-0.1.50 → emdash_core-0.1.57}/emdash_core/ingestion/parsers/import_analyzer.py +0 -0
  162. {emdash_core-0.1.50 → emdash_core-0.1.57}/emdash_core/ingestion/parsers/python_parser.py +0 -0
  163. {emdash_core-0.1.50 → emdash_core-0.1.57}/emdash_core/ingestion/parsers/registry.py +0 -0
  164. {emdash_core-0.1.50 → emdash_core-0.1.57}/emdash_core/ingestion/parsers/ts_ast_parser.js +0 -0
  165. {emdash_core-0.1.50 → emdash_core-0.1.57}/emdash_core/ingestion/parsers/typescript_parser.py +0 -0
  166. {emdash_core-0.1.50 → emdash_core-0.1.57}/emdash_core/ingestion/repository.py +0 -0
  167. {emdash_core-0.1.50 → emdash_core-0.1.57}/emdash_core/models/__init__.py +0 -0
  168. {emdash_core-0.1.50 → emdash_core-0.1.57}/emdash_core/models/agent.py +0 -0
  169. {emdash_core-0.1.50 → emdash_core-0.1.57}/emdash_core/models/index.py +0 -0
  170. {emdash_core-0.1.50 → emdash_core-0.1.57}/emdash_core/models/query.py +0 -0
  171. {emdash_core-0.1.50 → emdash_core-0.1.57}/emdash_core/planning/__init__.py +0 -0
  172. {emdash_core-0.1.50 → emdash_core-0.1.57}/emdash_core/planning/agent_api.py +0 -0
  173. {emdash_core-0.1.50 → emdash_core-0.1.57}/emdash_core/planning/context_builder.py +0 -0
  174. {emdash_core-0.1.50 → emdash_core-0.1.57}/emdash_core/planning/feature_context.py +0 -0
  175. {emdash_core-0.1.50 → emdash_core-0.1.57}/emdash_core/planning/feature_expander.py +0 -0
  176. {emdash_core-0.1.50 → emdash_core-0.1.57}/emdash_core/planning/llm_explainer.py +0 -0
  177. {emdash_core-0.1.50 → emdash_core-0.1.57}/emdash_core/planning/similarity.py +0 -0
  178. {emdash_core-0.1.50 → emdash_core-0.1.57}/emdash_core/planning/team_focus.py +0 -0
  179. {emdash_core-0.1.50 → emdash_core-0.1.57}/emdash_core/server.py +0 -0
  180. {emdash_core-0.1.50 → emdash_core-0.1.57}/emdash_core/skills/frontend-design/SKILL.md +0 -0
  181. {emdash_core-0.1.50 → emdash_core-0.1.57}/emdash_core/sse/__init__.py +0 -0
  182. {emdash_core-0.1.50 → emdash_core-0.1.57}/emdash_core/sse/stream.py +0 -0
  183. {emdash_core-0.1.50 → emdash_core-0.1.57}/emdash_core/templates/__init__.py +0 -0
  184. {emdash_core-0.1.50 → emdash_core-0.1.57}/emdash_core/templates/defaults/agent-builder.md.template +0 -0
  185. {emdash_core-0.1.50 → emdash_core-0.1.57}/emdash_core/templates/defaults/focus.md.template +0 -0
  186. {emdash_core-0.1.50 → emdash_core-0.1.57}/emdash_core/templates/defaults/pr-review-enhanced.md.template +0 -0
  187. {emdash_core-0.1.50 → emdash_core-0.1.57}/emdash_core/templates/defaults/pr-review.md.template +0 -0
  188. {emdash_core-0.1.50 → emdash_core-0.1.57}/emdash_core/templates/defaults/project.md.template +0 -0
  189. {emdash_core-0.1.50 → emdash_core-0.1.57}/emdash_core/templates/defaults/research_critic.md.template +0 -0
  190. {emdash_core-0.1.50 → emdash_core-0.1.57}/emdash_core/templates/defaults/research_planner.md.template +0 -0
  191. {emdash_core-0.1.50 → emdash_core-0.1.57}/emdash_core/templates/defaults/research_synthesizer.md.template +0 -0
  192. {emdash_core-0.1.50 → emdash_core-0.1.57}/emdash_core/templates/defaults/reviewer.md.template +0 -0
  193. {emdash_core-0.1.50 → emdash_core-0.1.57}/emdash_core/templates/defaults/spec.md.template +0 -0
  194. {emdash_core-0.1.50 → emdash_core-0.1.57}/emdash_core/templates/defaults/tasks.md.template +0 -0
  195. {emdash_core-0.1.50 → emdash_core-0.1.57}/emdash_core/templates/loader.py +0 -0
  196. {emdash_core-0.1.50 → emdash_core-0.1.57}/emdash_core/utils/__init__.py +0 -0
  197. {emdash_core-0.1.50 → emdash_core-0.1.57}/emdash_core/utils/git.py +0 -0
  198. {emdash_core-0.1.50 → emdash_core-0.1.57}/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.50
3
+ Version: 0.1.57
4
4
  Summary: EmDash Core - FastAPI server for code intelligence
5
5
  Author: Em Dash Team
6
6
  Requires-Python: >=3.10,<4.0
@@ -27,6 +27,7 @@ Requires-Dist: openai (>=1.0.0)
27
27
  Requires-Dist: pydantic (>=2.5.0,<3.0.0)
28
28
  Requires-Dist: pydantic-settings (>=2.0.0,<3.0.0)
29
29
  Requires-Dist: pygithub (>=2.1.1,<3.0.0)
30
+ Requires-Dist: pyobjc-framework-Cocoa (>=9.0) ; sys_platform == "darwin"
30
31
  Requires-Dist: pypng (>=0.0.21,<0.0.22)
31
32
  Requires-Dist: python-dotenv (>=1.0.0,<2.0.0)
32
33
  Requires-Dist: python-louvain (>=0.16,<0.17)
@@ -48,35 +48,38 @@ After receiving the plan:
48
48
  - "Fix this typo" → just fix it
49
49
  - "Add a log statement here" → just add it
50
50
 
51
- ### 1. Understand Before Acting
52
- - Read code before modifying it
53
- - Search for similar patterns already in the codebase
54
- - When requirements are ambiguous, use `ask_followup_question` tool (not text output)
55
- - ONLY after exploring the codebase first - questions should be informed by research
56
- - ONLY one question at a time - never ask multiple questions in parallel
57
- - Ask the most critical question first, then continue based on the answer
58
- - NEVER ask generic questions like "What platform?" without first understanding the codebase
59
-
60
- ### 2. Break Down Hard Problems
61
- When facing a task you don't immediately know how to solve:
62
-
63
- a) **Spawn Plan Agent**: Call `task(subagent_type="Plan", prompt="...")` to design the approach
64
- b) **Save Plan**: Write the returned plan to the plan file (specified in plan mode approval)
65
- c) **Present for Approval**: Call `exit_plan` to show the plan to the user
66
- d) **Execute**: After approval, implement the plan step by step
67
- e) **Validate**: Check your work against requirements
68
-
69
- ### 3. Targeted vs Open-Ended Queries
70
-
71
- **Targeted queries** (you know what to look for) Use direct tools:
51
+ ### 1. Know What To Do → Plan-First, Execute
52
+
53
+ When you understand the task and know how to approach it:
54
+ 1. State a brief plan (3-5 steps)
55
+ 2. Execute directly - don't explore "just in case"
56
+ 3. Read only the files your plan requires
57
+
58
+ Examples:
59
+ - "Add logout button to settings" → You know where settings is, just do it
60
+ - "Fix the typo in README" → Just fix it
61
+ - "Update the API endpoint" Read it, update it, done
62
+
63
+ ### 2. Don't Know What To Do Explore First
64
+
65
+ When you're genuinely uncertain about the codebase or approach:
66
+ - **Spawn Explore agent** for open-ended research across multiple files
67
+ - **Ask ONE clarifying question** if you need user input (not multiple)
68
+
69
+ Examples:
70
+ - "Where are errors handled?" → Explore agent (could be many places)
71
+ - "How does authentication work?" Explore agent (multiple files)
72
+ - "What framework should I use?" → Ask user (decision needed)
73
+
74
+ ### 3. Direct Tools vs Explore Agent
75
+
76
+ **Use direct tools** when you know what to look for:
72
77
  - "Read the router" → `glob("**/router*")` then `read_file`
73
- - "What's in config.ts?" → `read_file("config.ts")`
74
- - "Find the UserService class" → `grep("class UserService")`
78
+ - "Find UserService class" → `grep("class UserService")`
75
79
 
76
- **Open-ended queries** (need to explore possibilities) → Spawn Explore agent:
77
- - "Where are errors handled?" → could be many places
78
- - "How does authentication work?" → requires understanding multiple files
79
- - "What is the codebase structure?" → broad exploration
80
+ **Spawn Explore agent** when you need broad exploration:
81
+ - "What is the codebase structure?"
82
+ - "How does X integrate with Y?"
80
83
 
81
84
  ### 4. Parallel Tool Execution
82
85
 
@@ -338,6 +341,17 @@ Do this in ONE message:
338
341
  → All three run concurrently, results return together
339
342
  """
340
343
 
344
+ # Plan-First rule to prevent over-exploration
345
+ PLAN_FIRST_RULE = """
346
+ ## Plan-First Reminder
347
+
348
+ **Know what to do?** → State a 3-5 step plan, then execute. Don't explore beyond your plan.
349
+
350
+ **Don't know?** → Spawn Explore agent or ask ONE clarifying question.
351
+
352
+ Trust user context - if they say "the file" or "this", they know which one.
353
+ """
354
+
341
355
  # Efficiency rules for sub-agents with limited turns
342
356
  EFFICIENCY_RULES = """
343
357
  ## Efficiency Rules
@@ -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
 
@@ -793,10 +796,16 @@ DO NOT output more text. Use a tool NOW.""",
793
796
  # Store query for reranking context frame
794
797
  self._current_query = message
795
798
 
799
+ # Format content with images if provided
800
+ if images:
801
+ content = self.provider.format_content_with_images(message, images)
802
+ else:
803
+ content = message
804
+
796
805
  # Add new user message to history
797
806
  self._messages.append({
798
807
  "role": "user",
799
- "content": message,
808
+ "content": content,
800
809
  })
801
810
 
802
811
  # Get tool schemas
@@ -251,9 +251,13 @@ def _run_agent_sync(
251
251
  # Convert image data if provided
252
252
  agent_images = None
253
253
  if images:
254
+ import base64
254
255
  from ..agent.providers.base import ImageContent
255
256
  agent_images = [
256
- ImageContent(data=img.data, format=img.format)
257
+ ImageContent(
258
+ image_data=base64.b64decode(img.data),
259
+ format=img.format
260
+ )
257
261
  for img in images
258
262
  ]
259
263
 
@@ -110,7 +110,11 @@ def _check_macos_clipboard() -> bool:
110
110
 
111
111
  try:
112
112
  pasteboard = AppKit.NSPasteboard.generalPasteboard()
113
- return bool(pasteboard.dataForType_("public.png"))
113
+ # Check for PNG or TIFF (macOS screenshots use TIFF)
114
+ return bool(
115
+ pasteboard.dataForType_("public.png") or
116
+ pasteboard.dataForType_("public.tiff")
117
+ )
114
118
  except Exception:
115
119
  return False
116
120
 
@@ -253,6 +257,8 @@ def _dib_to_png(dib_data: bytes) -> bytes:
253
257
 
254
258
  def _read_macos_clipboard() -> Optional[bytes]:
255
259
  """Read image from macOS clipboard."""
260
+ import tempfile
261
+
256
262
  AppKit = _import_mac_clipboard()
257
263
  if AppKit is None:
258
264
  raise ClipboardImageError(
@@ -268,19 +274,35 @@ def _read_macos_clipboard() -> Optional[bytes]:
268
274
  if data:
269
275
  return bytes(data)
270
276
 
271
- # Try TIFF and convert (macOS often uses TIFF internally)
277
+ # Try TIFF and convert (macOS screenshots use TIFF internally)
272
278
  data = pasteboard.dataForType_("public.tiff")
273
279
  if data:
274
- # Use sips command-line tool to convert TIFF to PNG
280
+ # Use sips command-line tool to convert TIFF to PNG (via temp files)
275
281
  try:
276
- proc = subprocess.run(
277
- ["sips", "-s", "format", "png", "/dev/stdin", "--out", "/dev/stdout"],
278
- input=bytes(data),
279
- capture_output=True,
280
- timeout=5
281
- )
282
- if proc.returncode == 0 and proc.stdout:
283
- return proc.stdout
282
+ with tempfile.NamedTemporaryFile(suffix='.tiff', delete=False) as tiff_file:
283
+ tiff_path = tiff_file.name
284
+ tiff_file.write(bytes(data))
285
+
286
+ png_path = tiff_path.replace('.tiff', '.png')
287
+ try:
288
+ proc = subprocess.run(
289
+ ["sips", "-s", "format", "png", tiff_path, "--out", png_path],
290
+ capture_output=True,
291
+ timeout=5
292
+ )
293
+ if proc.returncode == 0:
294
+ with open(png_path, 'rb') as f:
295
+ return f.read()
296
+ finally:
297
+ # Clean up temp files
298
+ try:
299
+ os.unlink(tiff_path)
300
+ except OSError:
301
+ pass
302
+ try:
303
+ os.unlink(png_path)
304
+ except OSError:
305
+ pass
284
306
  except (subprocess.TimeoutExpired, FileNotFoundError):
285
307
  pass
286
308
 
@@ -1,6 +1,6 @@
1
1
  [tool.poetry]
2
2
  name = "emdash-core"
3
- version = "0.1.50"
3
+ version = "0.1.57"
4
4
  description = "EmDash Core - FastAPI server for code intelligence"
5
5
  authors = ["Em Dash Team"]
6
6
  packages = [{include = "emdash_core"}]
@@ -54,6 +54,9 @@ tqdm = "^4.66.1"
54
54
  pypng = "^0.0.21"
55
55
  pyyaml = "^6.0"
56
56
 
57
+ # Clipboard (macOS only)
58
+ pyobjc-framework-Cocoa = {version = ">=9.0", markers = "sys_platform == 'darwin'"}
59
+
57
60
  [tool.poetry.extras]
58
61
  graph = ["kuzu", "cmake"]
59
62