emdash-core 0.1.25__py3-none-any.whl → 0.1.37__py3-none-any.whl

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 (39) hide show
  1. emdash_core/agent/__init__.py +4 -0
  2. emdash_core/agent/agents.py +84 -23
  3. emdash_core/agent/events.py +42 -20
  4. emdash_core/agent/hooks.py +419 -0
  5. emdash_core/agent/inprocess_subagent.py +166 -18
  6. emdash_core/agent/prompts/__init__.py +4 -3
  7. emdash_core/agent/prompts/main_agent.py +67 -2
  8. emdash_core/agent/prompts/plan_mode.py +236 -107
  9. emdash_core/agent/prompts/subagents.py +103 -23
  10. emdash_core/agent/prompts/workflow.py +159 -26
  11. emdash_core/agent/providers/factory.py +2 -2
  12. emdash_core/agent/providers/openai_provider.py +67 -15
  13. emdash_core/agent/runner/__init__.py +49 -0
  14. emdash_core/agent/runner/agent_runner.py +765 -0
  15. emdash_core/agent/runner/context.py +470 -0
  16. emdash_core/agent/runner/factory.py +108 -0
  17. emdash_core/agent/runner/plan.py +217 -0
  18. emdash_core/agent/runner/sdk_runner.py +324 -0
  19. emdash_core/agent/runner/utils.py +67 -0
  20. emdash_core/agent/skills.py +47 -8
  21. emdash_core/agent/toolkit.py +46 -14
  22. emdash_core/agent/toolkits/__init__.py +117 -18
  23. emdash_core/agent/toolkits/base.py +87 -2
  24. emdash_core/agent/toolkits/explore.py +18 -0
  25. emdash_core/agent/toolkits/plan.py +27 -11
  26. emdash_core/agent/tools/__init__.py +2 -2
  27. emdash_core/agent/tools/coding.py +48 -4
  28. emdash_core/agent/tools/modes.py +151 -143
  29. emdash_core/agent/tools/task.py +52 -6
  30. emdash_core/api/agent.py +706 -1
  31. emdash_core/ingestion/repository.py +17 -198
  32. emdash_core/models/agent.py +4 -0
  33. emdash_core/skills/frontend-design/SKILL.md +56 -0
  34. emdash_core/sse/stream.py +4 -0
  35. {emdash_core-0.1.25.dist-info → emdash_core-0.1.37.dist-info}/METADATA +4 -1
  36. {emdash_core-0.1.25.dist-info → emdash_core-0.1.37.dist-info}/RECORD +38 -30
  37. emdash_core/agent/runner.py +0 -1123
  38. {emdash_core-0.1.25.dist-info → emdash_core-0.1.37.dist-info}/WHEEL +0 -0
  39. {emdash_core-0.1.25.dist-info → emdash_core-0.1.37.dist-info}/entry_points.txt +0 -0
@@ -1,15 +1,9 @@
1
- """Repository management - clone, fetch, and track Git repositories."""
1
+ """Repository management for local Git repositories."""
2
2
 
3
- import hashlib
4
- import os
5
- import shutil
6
- from datetime import datetime
7
3
  from pathlib import Path
8
4
  from typing import Optional
9
- from urllib.parse import urlparse
10
5
 
11
- import git
12
- from git import Repo, GitCommandError
6
+ from git import Repo
13
7
 
14
8
  from ..core.exceptions import RepositoryError
15
9
  from ..core.models import RepositoryEntity
@@ -17,44 +11,37 @@ from ..utils.logger import log
17
11
 
18
12
 
19
13
  class RepositoryManager:
20
- """Manages Git repository operations (clone, fetch, status)."""
14
+ """Manages local Git repository operations."""
21
15
 
22
- def __init__(self, cache_dir: Optional[Path] = None):
23
- """Initialize repository manager.
24
-
25
- Args:
26
- cache_dir: Directory to cache cloned repositories.
27
- Defaults to ~/.emdash/repos
28
- """
29
- if cache_dir is None:
30
- cache_dir = Path.home() / ".emdash" / "repos"
31
-
32
- self.cache_dir = cache_dir
33
- self.cache_dir.mkdir(parents=True, exist_ok=True)
16
+ def __init__(self):
17
+ """Initialize repository manager."""
18
+ pass
34
19
 
35
20
  def get_or_clone(
36
21
  self,
37
22
  repo_path: str,
38
23
  skip_commit_count: bool = False
39
24
  ) -> tuple[Repo, RepositoryEntity]:
40
- """Get a repository from cache or clone it.
25
+ """Get a local repository.
41
26
 
42
27
  Args:
43
- repo_path: URL or local path to repository
44
- skip_commit_count: Whether to skip counting commits
28
+ repo_path: Local path to repository
29
+ skip_commit_count: Whether to skip counting commits (unused, kept for API compatibility)
45
30
 
46
31
  Returns:
47
32
  Tuple of (git.Repo, RepositoryEntity)
48
33
 
49
34
  Raises:
50
- RepositoryError: If repository cannot be accessed
35
+ RepositoryError: If repository cannot be accessed or path doesn't exist
51
36
  """
52
- # Check if it's a local path
53
- if Path(repo_path).exists():
54
- return self._open_local_repo(repo_path)
37
+ # Only support local paths
38
+ if not Path(repo_path).exists():
39
+ raise RepositoryError(
40
+ f"Repository path does not exist: {repo_path}. "
41
+ "Remote repository URLs are not supported - please provide a local path."
42
+ )
55
43
 
56
- # It's a URL - clone or fetch
57
- return self._clone_or_fetch(repo_path, skip_commit_count)
44
+ return self._open_local_repo(repo_path)
58
45
 
59
46
  def _open_local_repo(self, path: str) -> tuple[Repo, RepositoryEntity]:
60
47
  """Open a local repository.
@@ -88,164 +75,6 @@ class RepositoryManager:
88
75
  except Exception as e:
89
76
  raise RepositoryError(f"Failed to open local repository {path}: {e}")
90
77
 
91
- def _clone_or_fetch(
92
- self,
93
- url: str,
94
- skip_commit_count: bool
95
- ) -> tuple[Repo, RepositoryEntity]:
96
- """Clone a repository or fetch updates if already cloned.
97
-
98
- Args:
99
- url: Repository URL
100
- skip_commit_count: Whether to skip counting commits
101
-
102
- Returns:
103
- Tuple of (git.Repo, RepositoryEntity)
104
- """
105
- # Generate cache path from URL
106
- cache_path = self._get_cache_path(url)
107
-
108
- if cache_path.exists():
109
- log.info(f"Repository already cached at {cache_path}")
110
- return self._fetch_updates(cache_path, url, skip_commit_count)
111
- else:
112
- log.info(f"Cloning repository: {url}")
113
- return self._clone_repo(url, cache_path, skip_commit_count)
114
-
115
- def _clone_repo(
116
- self,
117
- url: str,
118
- cache_path: Path,
119
- skip_commit_count: bool
120
- ) -> tuple[Repo, RepositoryEntity]:
121
- """Clone a repository.
122
-
123
- Args:
124
- url: Repository URL
125
- cache_path: Path to clone into
126
- skip_commit_count: Whether to skip counting commits
127
-
128
- Returns:
129
- Tuple of (git.Repo, RepositoryEntity)
130
- """
131
- try:
132
- repo = Repo.clone_from(url, cache_path, depth=None)
133
- log.info(f"Successfully cloned {url}")
134
-
135
- entity = self._create_repository_entity(
136
- repo,
137
- url,
138
- skip_commit_count=skip_commit_count
139
- )
140
- return repo, entity
141
-
142
- except GitCommandError as e:
143
- raise RepositoryError(f"Failed to clone repository {url}: {e}")
144
- except Exception as e:
145
- raise RepositoryError(f"Unexpected error cloning {url}: {e}")
146
-
147
- def _fetch_updates(
148
- self,
149
- cache_path: Path,
150
- url: str,
151
- skip_commit_count: bool
152
- ) -> tuple[Repo, RepositoryEntity]:
153
- """Fetch updates for an existing repository.
154
-
155
- Args:
156
- cache_path: Path to cached repository
157
- url: Repository URL
158
- skip_commit_count: Whether to skip counting commits
159
-
160
- Returns:
161
- Tuple of (git.Repo, RepositoryEntity)
162
- """
163
- try:
164
- repo = Repo(cache_path)
165
-
166
- log.info("Fetching updates from remote...")
167
- repo.remotes.origin.fetch()
168
-
169
- # Pull latest changes
170
- repo.remotes.origin.pull()
171
-
172
- log.info("Repository updated successfully")
173
-
174
- entity = self._create_repository_entity(
175
- repo,
176
- url,
177
- skip_commit_count=skip_commit_count
178
- )
179
- return repo, entity
180
-
181
- except GitCommandError as e:
182
- raise RepositoryError(f"Failed to fetch updates for {url}: {e}")
183
- except Exception as e:
184
- raise RepositoryError(f"Unexpected error fetching updates: {e}")
185
-
186
- def _create_repository_entity(
187
- self,
188
- repo: Repo,
189
- url: str,
190
- skip_commit_count: bool = False
191
- ) -> RepositoryEntity:
192
- """Create a RepositoryEntity from a git.Repo.
193
-
194
- Args:
195
- repo: Git repository
196
- url: Repository URL
197
- skip_commit_count: Whether to skip counting commits
198
-
199
- Returns:
200
- RepositoryEntity
201
- """
202
- # Parse URL to extract owner and name
203
- parsed = urlparse(url)
204
- path_parts = parsed.path.strip("/").split("/")
205
-
206
- if len(path_parts) >= 2:
207
- owner = path_parts[-2]
208
- repo_name = path_parts[-1].replace(".git", "")
209
- else:
210
- owner = None
211
- repo_name = path_parts[-1].replace(".git", "") if path_parts else "unknown"
212
-
213
- commit_count = 0
214
- if not skip_commit_count:
215
- try:
216
- commit_count = sum(1 for _ in repo.iter_commits())
217
- except Exception:
218
- commit_count = 0
219
-
220
- return RepositoryEntity(
221
- url=url,
222
- name=repo_name,
223
- owner=owner,
224
- default_branch=repo.active_branch.name if repo.active_branch else "main",
225
- last_ingested=None,
226
- ingestion_status="pending",
227
- commit_count=commit_count,
228
- )
229
-
230
- def _get_cache_path(self, url: str) -> Path:
231
- """Get the cache path for a repository URL.
232
-
233
- Args:
234
- url: Repository URL
235
-
236
- Returns:
237
- Path to cache directory
238
- """
239
- # Create a unique directory name from URL
240
- url_hash = hashlib.md5(url.encode()).hexdigest()[:12]
241
-
242
- # Extract repo name from URL
243
- parsed = urlparse(url)
244
- path_parts = parsed.path.strip("/").split("/")
245
- repo_name = path_parts[-1].replace(".git", "")
246
-
247
- return self.cache_dir / f"{repo_name}_{url_hash}"
248
-
249
78
  def _get_origin_url(self, repo: Repo) -> Optional[str]:
250
79
  """Get the origin URL of a repository.
251
80
 
@@ -334,13 +163,3 @@ class RepositoryManager:
334
163
  This is a convenience wrapper around get_source_files() for backward compatibility.
335
164
  """
336
165
  return self.get_source_files(repo, ['.py'], ignore_patterns)
337
-
338
- def clear_cache(self):
339
- """Clear all cached repositories."""
340
- log.warning("Clearing repository cache...")
341
-
342
- if self.cache_dir.exists():
343
- shutil.rmtree(self.cache_dir)
344
- self.cache_dir.mkdir(parents=True, exist_ok=True)
345
-
346
- log.info("Cache cleared successfully")
@@ -51,6 +51,10 @@ class AgentChatRequest(BaseModel):
51
51
  default_factory=list,
52
52
  description="Images for vision-capable models"
53
53
  )
54
+ history: list[dict] = Field(
55
+ default_factory=list,
56
+ description="Pre-loaded conversation history from saved session"
57
+ )
54
58
  options: AgentChatOptions = Field(
55
59
  default_factory=AgentChatOptions,
56
60
  description="Agent options"
@@ -0,0 +1,56 @@
1
+ ---
2
+ name: frontend-design
3
+ description: Create distinctive, production-grade frontend interfaces with high design quality. Use this skill when the user asks to build web components, pages, or applications. Generates creative, polished code that avoids generic AI aesthetics.
4
+ user_invocable: true
5
+ tools: []
6
+ ---
7
+
8
+ # Frontend Design
9
+
10
+ This skill guides creation of distinctive, production-grade frontend interfaces that avoid generic "AI slop" aesthetics. Implement real working code with exceptional attention to aesthetic details and creative choices.
11
+
12
+ The user provides frontend requirements: a component, page, application, or interface to build. They may include context about the purpose, audience, or technical constraints.
13
+
14
+ ## Design Thinking
15
+
16
+ Before coding, understand the context and commit to a BOLD aesthetic direction:
17
+
18
+ - **Purpose**: What problem does this interface solve? Who uses it?
19
+ - **Tone**: Pick an extreme: brutally minimal, maximalist chaos, retro-futuristic, organic/natural, luxury/refined, playful/toy-like, editorial/magazine, brutalist/raw, art deco/geometric, soft/pastel, industrial/utilitarian, etc. There are so many flavors to choose from. Use these for inspiration but design one that is true to the aesthetic direction.
20
+ - **Constraints**: Technical requirements (framework, performance, accessibility).
21
+ - **Differentiation**: What makes this UNFORGETTABLE? What's the one thing someone will remember?
22
+
23
+ **CRITICAL**: Choose a clear conceptual direction and execute it with precision. Bold maximalism and refined minimalism both work - the key is intentionality, not intensity.
24
+
25
+ Then implement working code (HTML/CSS/JS, React, Vue, etc.) that is:
26
+
27
+ - Production-grade and functional
28
+ - Visually striking and memorable
29
+ - Cohesive with a clear aesthetic point-of-view
30
+ - Meticulously refined in every detail
31
+
32
+ ## Frontend Aesthetics Guidelines
33
+
34
+ Focus on:
35
+
36
+ - **Typography**: Choose fonts that are beautiful, unique, and interesting. Avoid generic fonts like Arial and Inter; opt instead for distinctive choices that elevate the frontend's aesthetics; unexpected, characterful font choices. Pair a distinctive display font with a refined body font.
37
+ - **Color & Theme**: Commit to a cohesive aesthetic. Use CSS variables for consistency. Dominant colors with sharp accents outperform timid, evenly-distributed palettes.
38
+ - **Motion**: Use animations for effects and micro-interactions. Prioritize CSS-only solutions for HTML. Use Motion library for React when available. Focus on high-impact moments: one well-orchestrated page load with staggered reveals (animation-delay) creates more delight than scattered micro-interactions. Use scroll-triggering and hover states that surprise.
39
+ - **Spatial Composition**: Unexpected layouts. Asymmetry. Overlap. Diagonal flow. Grid-breaking elements. Generous negative space OR controlled density.
40
+ - **Backgrounds & Visual Details**: Create atmosphere and depth rather than defaulting to solid colors. Add contextual effects and textures that match the overall aesthetic. Apply creative forms like gradient meshes, noise textures, geometric patterns, layered transparencies, dramatic shadows, decorative borders, custom cursors, and grain overlays.
41
+
42
+ ## What to Avoid
43
+
44
+ NEVER use generic AI-generated aesthetics like:
45
+ - Overused font families (Inter, Roboto, Arial, system fonts)
46
+ - Cliched color schemes (particularly purple gradients on white backgrounds)
47
+ - Predictable layouts and component patterns
48
+ - Cookie-cutter design that lacks context-specific character
49
+
50
+ Interpret creatively and make unexpected choices that feel genuinely designed for the context. No design should be the same. Vary between light and dark themes, different fonts, different aesthetics. NEVER converge on common choices (Space Grotesk, for example) across generations.
51
+
52
+ ## Implementation Complexity
53
+
54
+ **IMPORTANT**: Match implementation complexity to the aesthetic vision. Maximalist designs need elaborate code with extensive animations and effects. Minimalist or refined designs need restraint, precision, and careful attention to spacing, typography, and subtle details. Elegance comes from executing the vision well.
55
+
56
+ Remember: Claude is capable of extraordinary creative work. Don't hold back, show what can truly be created when thinking outside the box and committing fully to a distinctive vision.
emdash_core/sse/stream.py CHANGED
@@ -16,6 +16,10 @@ class EventType(str, Enum):
16
16
  TOOL_START = "tool_start"
17
17
  TOOL_RESULT = "tool_result"
18
18
 
19
+ # Sub-agent lifecycle
20
+ SUBAGENT_START = "subagent_start"
21
+ SUBAGENT_END = "subagent_end"
22
+
19
23
  # Agent thinking/progress
20
24
  THINKING = "thinking"
21
25
  PROGRESS = "progress"
@@ -1,6 +1,6 @@
1
1
  Metadata-Version: 2.4
2
2
  Name: emdash-core
3
- Version: 0.1.25
3
+ Version: 0.1.37
4
4
  Summary: EmDash Core - FastAPI server for code intelligence
5
5
  Author: Em Dash Team
6
6
  Requires-Python: >=3.10,<4.0
@@ -12,6 +12,8 @@ Classifier: Programming Language :: Python :: 3.13
12
12
  Classifier: Programming Language :: Python :: 3.14
13
13
  Requires-Dist: astroid (>=3.0.1,<4.0.0)
14
14
  Requires-Dist: beautifulsoup4 (>=4.12.0)
15
+ Requires-Dist: claude-agent-sdk (>=0.1.19)
16
+ Requires-Dist: cmake (>=3.25.0)
15
17
  Requires-Dist: duckduckgo-search (>=6.0.0)
16
18
  Requires-Dist: fastapi (>=0.109.0)
17
19
  Requires-Dist: gitpython (>=3.1.40,<4.0.0)
@@ -27,6 +29,7 @@ Requires-Dist: pydantic-settings (>=2.0.0,<3.0.0)
27
29
  Requires-Dist: pygithub (>=2.1.1,<3.0.0)
28
30
  Requires-Dist: python-dotenv (>=1.0.0,<2.0.0)
29
31
  Requires-Dist: python-louvain (>=0.16,<0.17)
32
+ Requires-Dist: pyyaml (>=6.0,<7.0)
30
33
  Requires-Dist: sentence-transformers (>=2.2.0)
31
34
  Requires-Dist: sse-starlette (>=2.0.0)
32
35
  Requires-Dist: supabase (>=2.0.0)
@@ -1,27 +1,28 @@
1
1
  emdash_core/__init__.py,sha256=2VnFDN5zmKekKBa5rHZY9nz2Dhv2lB_O6dTcz-wyF8s,226
2
- emdash_core/agent/__init__.py,sha256=78P3l8dMA9Qepg0b8WMOWobrhmIpzn4Y0TXtgfndQ8E,1061
3
- emdash_core/agent/agents.py,sha256=CCsDJSl9Vwhitc71L9oQ6SO_qhhyumI7L07Osmgugcg,5825
2
+ emdash_core/agent/__init__.py,sha256=rGY5MXggrv6TLHqNMp3v1oDldL_KErvLIoHARimlNbk,1195
3
+ emdash_core/agent/agents.py,sha256=LW4IIrC1VlKM5MjBButHiln7ffDDdkB2xg4xgaQQvMg,7799
4
4
  emdash_core/agent/code_reviewer.py,sha256=oUXcDbk773kwYtcCsUNEjb_ipS9rLeCKIv_IEUiUA9k,16467
5
5
  emdash_core/agent/compaction.py,sha256=_smuIjmzaiblr6viRFByQCekRzoZDTetcaXRLQol8CI,4102
6
6
  emdash_core/agent/context_manager.py,sha256=3HBQFRwsq1bBx6R7FQp7xFsiW0zPLPnOF-8Ox4Y6K44,3676
7
- emdash_core/agent/events.py,sha256=hIl_w1gUH9kSpA5pGHD30eSdX0BiXYYwIg4Q6vtKRps,11336
7
+ emdash_core/agent/events.py,sha256=Qw6s6jzBFXIlsDNpPBiIwNB72tnjbAJNt6hhcblOslg,11930
8
8
  emdash_core/agent/handlers.py,sha256=3zo76GT3cTfYayK1qvP2NFo14AXHfA36X-yaa7Xm3T0,7135
9
- emdash_core/agent/inprocess_subagent.py,sha256=PJ6ItCT9fdT8klIQ0dCZ4g_xPoKrAjT3Ui4z8Mvu6V8,11159
9
+ emdash_core/agent/hooks.py,sha256=zpKsbcR5X0iZo65VULMsoE84nfdArwDz1uULlgbZATM,13635
10
+ emdash_core/agent/inprocess_subagent.py,sha256=Td6OPZpIGNC_ctVNUTyS88BHcHlUgOcxtowx4qBa0jE,17703
10
11
  emdash_core/agent/mcp/__init__.py,sha256=qzQMJJOgOYVb6X2uyJxTIGgV5x35Dn7H3IglZxToX_c,1081
11
12
  emdash_core/agent/mcp/client.py,sha256=_ae6CWRnJfG_mcCcIYZJYbWjajpZC-WmZgsZsRaahco,9753
12
13
  emdash_core/agent/mcp/config.py,sha256=JrO7xIC3oSiFlxeTVynKm1pq2CrYdqzTsIJj9neSJLQ,9220
13
14
  emdash_core/agent/mcp/manager.py,sha256=i4OIJyAwfBAw0E8fe6NIOvT-UTf1_hmDbEtIjtAhRjc,15382
14
15
  emdash_core/agent/mcp/tool_factory.py,sha256=jtQJ2TW7KdGVSg3fUp9-rm7MbHjiwWmy0yLfwr0H4qc,6410
15
- emdash_core/agent/prompts/__init__.py,sha256=S1_zixYnt_jYbh_5B-fKRxlBjeHf0GrFp8pqjWoq6J4,975
16
- emdash_core/agent/prompts/main_agent.py,sha256=4olhwAN0z6Ctq5PLQB9wStv9UQFlHCDpPlprw5KneWI,3941
17
- emdash_core/agent/prompts/plan_mode.py,sha256=pfkkEqH-FBhIj_e9aJwtBHven35rtAQgFmo070d-R-w,4302
18
- emdash_core/agent/prompts/subagents.py,sha256=qqjzob4_7gOy8sui04dOymo8yLxyLbaUaqILakkgqO4,4063
19
- emdash_core/agent/prompts/workflow.py,sha256=ZSEycPrHshG1ItiGIGfRusWti6PRgD82MZqVHl1XQrU,7799
16
+ emdash_core/agent/prompts/__init__.py,sha256=BuCvF0XLJdhXSWNz0NoJI6dBnomLzRcfZxdBWmkh8tg,987
17
+ emdash_core/agent/prompts/main_agent.py,sha256=_FufhbMKheY0jP7DFZqJog2ufeXrKN8DW1s4p1frc8A,5767
18
+ emdash_core/agent/prompts/plan_mode.py,sha256=xGtYv8rvdhQhFKSqZpG4byawEPjQGSFuqO14cZcGThI,8070
19
+ emdash_core/agent/prompts/subagents.py,sha256=UN8IUEpBKE24aCExQUgeCx-qubvu5RrghuWfyZ6BiLY,7544
20
+ emdash_core/agent/prompts/workflow.py,sha256=3Eh6KB76a-oskKTrvlXcJIUCsBFS16va4b9dPJACDS8,13572
20
21
  emdash_core/agent/providers/__init__.py,sha256=q58ektAl1zwuS3z36ctHfLB8XruYghT97aq_oj1T_G0,776
21
22
  emdash_core/agent/providers/base.py,sha256=m1Vuac2Gtr191YDkefG_3qD64iIT9Ps2WoZC1LWmfJU,4351
22
- emdash_core/agent/providers/factory.py,sha256=F3bKXvZuLOJn--m5eTblUf3_xdzzbnW97YNDDbQBgJQ,3143
23
+ emdash_core/agent/providers/factory.py,sha256=UgPVNQupa73dKugyG_JqFgVdj4y5YJIGbcGXEbzx_1c,3213
23
24
  emdash_core/agent/providers/models.py,sha256=0mkkqiXOQKV25GbqJvm-85mPiJx3Cb3jbn3KTV4NbU0,8710
24
- emdash_core/agent/providers/openai_provider.py,sha256=2LfRj2H46IDfCb_PAFfRjGHItDF_5ZlgPGuef8WYLfo,18670
25
+ emdash_core/agent/providers/openai_provider.py,sha256=URUv4g7P_87yOuWNYPd9pZNlw3SuCdPe5bvX-I_2EW0,21037
25
26
  emdash_core/agent/providers/transformers_provider.py,sha256=USSzYIcZrcTAKDKwiNobYUDS024ZVZ34WAuYWGbs9Nk,7167
26
27
  emdash_core/agent/research/__init__.py,sha256=4LU9Skk3sxsDy8GzfOxCjNxxqaxOm94hV5cH-Nyqn7g,1992
27
28
  emdash_core/agent/research/agent.py,sha256=dGjSZL2rsuJmSRpa8060R5gIvX8rIj57Zs21LsBJ-1U,3819
@@ -34,31 +35,37 @@ emdash_core/agent/research/state.py,sha256=P44YUTUhMrAmt--xsj8Hi0SzbDmrLXKPEf83H
34
35
  emdash_core/agent/research/synthesizer.py,sha256=j4UvH8JxUjo7RF-h69tpRERgN6pHSb8qNBOoKrH2Qro,19016
35
36
  emdash_core/agent/reviewer_profile.py,sha256=RkJ_Mk5vbp2U-e0UBWB-k59cHsTzLj0aro22KJVCbss,16075
36
37
  emdash_core/agent/rules.py,sha256=GVwfM6YlRxrPXLZ0h2cZFOx4l_mPPl0Bdwt8oxfMBLI,3014
37
- emdash_core/agent/runner.py,sha256=2z7v-8XS0ADOGXgAYEqBoLOHaEDlP-dSKDwqeD2EJkU,42811
38
+ emdash_core/agent/runner/__init__.py,sha256=FK3FUSsdKImso-QATYam5OnQhpCCHyXnXYRtmoLdQ80,1384
39
+ emdash_core/agent/runner/agent_runner.py,sha256=3IyjKVRtI-rrgZiurWiVfRL9T8yCx7MGn9ZE3yV6R-Y,32256
40
+ emdash_core/agent/runner/context.py,sha256=U8tLUtBWgU1yD3j8XDquDEQNEM70HcxkIMRAOsfJP8c,15099
41
+ emdash_core/agent/runner/factory.py,sha256=SXtfgD4F8R8cUDR4Tt-3LPHSDjyJwkyEAbxflXgjkqc,3288
42
+ emdash_core/agent/runner/plan.py,sha256=WMra-xpWeNJ0YtdnQMsd2aak5BhryrzUP_OtZMhlzeA,7336
43
+ emdash_core/agent/runner/sdk_runner.py,sha256=KrlWLagZc_01jqYBHioqz2WIJqXmb3INyFnYuTQnBZA,10587
44
+ emdash_core/agent/runner/utils.py,sha256=1feF3-rYA9x3Inh7pKdtPSGpMzNM5bBV5s6CJVCqqJQ,1826
38
45
  emdash_core/agent/session.py,sha256=Zr7m8IK4-J6CDIMmN2QiSqpDT_O2S-SXu3Qmy9w6dk8,8517
39
- emdash_core/agent/skills.py,sha256=s62vZgcsI4dt3FlBz7501NV_EbPoHqHGScoRHvCZBGs,8776
46
+ emdash_core/agent/skills.py,sha256=0DPDmcSjG8J4LrUID90qH8MFBJ9OIFHS9CKH3jUl0Oc,10516
40
47
  emdash_core/agent/spec_schema.py,sha256=tmTCrO4zKXkOblW6gRyrQ3_ZdYU-ehnLE8YmZbhPHWQ,1429
41
48
  emdash_core/agent/specification.py,sha256=b1nUQiGT4NiRv42hDkYAXVX_RtsKcHrf4Ae1dx0UVnc,19105
42
49
  emdash_core/agent/subagent.py,sha256=zIlhbHOCUEgYtYLYwiQ7dkSleqI60emyBA-5XLPaH_k,12150
43
50
  emdash_core/agent/subagent_prompts.py,sha256=pJJPXh4FlnE8bt9d-Ruquz6j8W-BS9pMCbXRqpgwq4g,407
44
- emdash_core/agent/toolkit.py,sha256=iQk9R57h8UInQ0czM41YvXcl63KyyKOLpo4RV7OZTqI,18493
45
- emdash_core/agent/toolkits/__init__.py,sha256=HrWyA1M666V0UZ6P7YISnnQg4rblWbIFW_HcMKlHfK4,1814
46
- emdash_core/agent/toolkits/base.py,sha256=Z4IMrli7UMi7K3rWhqfph_5vv9Tdnc0M8iCQDgE_3lM,2587
47
- emdash_core/agent/toolkits/explore.py,sha256=ymyvLjIXy80h3lb4y_DZ06T0vADCal976qMW19J6N8A,1395
48
- emdash_core/agent/toolkits/plan.py,sha256=S5VnewUpSHOgpieiph3EuA_qPOUS7EpG198EuqNVG3o,1820
49
- emdash_core/agent/tools/__init__.py,sha256=7OyqgSkyKOrR8YOPb82g6vcngpc5Yf3yrzkJ3sZslzc,2958
51
+ emdash_core/agent/toolkit.py,sha256=bNDBNlxYEKwD5KkIsrZ4505ITKrlxt-W99H9pS_12BY,19897
52
+ emdash_core/agent/toolkits/__init__.py,sha256=HPU7krOJ2zIdKT7ykH-k9h3CBH2YOizxkMCIU8r-kNs,5050
53
+ emdash_core/agent/toolkits/base.py,sha256=rQNKsrIMvtyfa_8YprZ-Vo8Khmkl5TgHXapol1UXCp8,5634
54
+ emdash_core/agent/toolkits/explore.py,sha256=5_f6q7x_nf7SkHb1osqQTrss4V-aFmmwR-gBtbCKhO0,1937
55
+ emdash_core/agent/toolkits/plan.py,sha256=ExDlf4dEN_eu41G40pABAvghPUxCnVF35j6lGN7bjIE,2205
56
+ emdash_core/agent/tools/__init__.py,sha256=gJ8mAi4yg-jAYjq0UidDt1x8thkfxybX8RbOCoN6ZHc,2966
50
57
  emdash_core/agent/tools/analytics.py,sha256=tEP_RWFpKGfFW_Yc5inMMjAkDFzpDQ77Ui_Ca7LQu60,14837
51
58
  emdash_core/agent/tools/base.py,sha256=3clLKgR7Og5eDijZJLEcpJS1YV8u1rW_pXr_iwHdxTo,3349
52
- emdash_core/agent/tools/coding.py,sha256=plz_prz_lg6JEUzF_yvbADoHSyZ_3i6wdEh7GiS5YOE,14343
59
+ emdash_core/agent/tools/coding.py,sha256=tGGfDzjQySkIhMWMcGxDbC_c2p_hJSOLAyUJ-FCJzxo,16573
53
60
  emdash_core/agent/tools/github_mcp.py,sha256=D4fu_z9j-rL8SHD8TA2tO-ED-8Q4QB_RHQoqsh7Bjy8,16870
54
61
  emdash_core/agent/tools/history.py,sha256=Zaers4Aul9-hrlMaGRcQHwfU2xb7yCjHFHSDtfMe3c4,423
55
- emdash_core/agent/tools/modes.py,sha256=4E7qGEooiGy46NoInUrnec_6V52jWTr0Br99bu5nyMA,10334
62
+ emdash_core/agent/tools/modes.py,sha256=g82igKjpBeC23HgYRgULCNbjCRZQ6C-rmMMbNEGNbEk,10587
56
63
  emdash_core/agent/tools/plan.py,sha256=RRvZsDHcvvDv6uyDSGhTYIoImZmI_7CCxCarkeSZjbQ,7922
57
64
  emdash_core/agent/tools/plan_write.py,sha256=o4EEHTUr1hRfH3WSjrh3-QTfaJuUhjsQ5bJNBPD_j5Q,4417
58
65
  emdash_core/agent/tools/search.py,sha256=aq5_jc8YT3R3oZtulgvKwmz1oljJom20NfF_q60o60Q,14353
59
66
  emdash_core/agent/tools/skill.py,sha256=B7IefgH2DndHXFOaozSnJkhLQj9VQHNJH7-0ovgVmS0,6124
60
67
  emdash_core/agent/tools/spec.py,sha256=R9Ib-1epCVrgbOB6C9qYkwvgut94x3P2g4_FM_tMd2M,10022
61
- emdash_core/agent/tools/task.py,sha256=-xM2GFdBnchrVNiOHgxa0hWQyvum4sC4QgBf3y5N_64,8906
68
+ emdash_core/agent/tools/task.py,sha256=__jcclmmWKqoTffMuyCSF46F3T0SRLR5CyyNebz6lSg,11113
62
69
  emdash_core/agent/tools/task_output.py,sha256=30EI8JAKBDw6gLmjF8bXAq00yMr-Qk14J7fv2kDVX1c,6421
63
70
  emdash_core/agent/tools/tasks.py,sha256=VT-oLFKzswmKu02H1hc_ercJ1blbseCo0Q0qRBh0DjM,11844
64
71
  emdash_core/agent/tools/traversal.py,sha256=qQvHkledo_rT9q9kxk07pijY8XqkR4WWB5pFWVmG01I,20249
@@ -66,7 +73,7 @@ emdash_core/agent/tools/web.py,sha256=cqm4eiiBzeGCOmQE---uT9zlgsQUX9WY_YYz7wQbK1
66
73
  emdash_core/analytics/__init__.py,sha256=5ky2djAly3-3lbQmUuNJlJTmBDaXjN2lOUw-OP2F1Zk,98
67
74
  emdash_core/analytics/engine.py,sha256=f1go7SNnSlM_sFUEvmHrD4PTY9G39REBC7w01xdh3as,47738
68
75
  emdash_core/api/__init__.py,sha256=L11AeV6gaCJjlZ8DU_q-lcuZYH9WV3BV4GYq8JF8BuI,92
69
- emdash_core/api/agent.py,sha256=WWIozSfElbwQYJs5bvB6KLMAqZwGkQZJQjD8sHiL7G4,8706
76
+ emdash_core/api/agent.py,sha256=8AWFAu8nV6qNi6aPsMoQiDrfJar3Fm4oB9Ik1h3_r10,31504
70
77
  emdash_core/api/agents.py,sha256=kInkI6iGnQuRxz5wS9w_Owq-4iceUJgugIOrWGDLkGA,3673
71
78
  emdash_core/api/analyze.py,sha256=cR6wWzqSvp_5cNyUg0qACNF7DYdrcNkzhmRqgaqnd78,7593
72
79
  emdash_core/api/auth.py,sha256=vnhH_xcsoTDYrCDBDytlm0LOV9yDoar04NL5FZKI8JU,4832
@@ -151,9 +158,9 @@ emdash_core/ingestion/parsers/python_parser.py,sha256=n4yc9FwE91DCjqI_BOM4EK2NR_
151
158
  emdash_core/ingestion/parsers/registry.py,sha256=fgq-dWfEUpACuWFCPxbcQYH4gQSYqDYJnvJXFNAwb8M,2074
152
159
  emdash_core/ingestion/parsers/ts_ast_parser.js,sha256=bvFEl97bzI-UItTvYkyT5D0rxXWqSGYlCF-Ph5FdMoI,9744
153
160
  emdash_core/ingestion/parsers/typescript_parser.py,sha256=UHEuKUwaEkrscZ7NEisBWcZxJ1Ltn7pUvsdTdccqMGY,10928
154
- emdash_core/ingestion/repository.py,sha256=ZyKw4NYTIgw35LbkYSsqwNmQoGkpVq06q0qm6lFMGGM,10287
161
+ emdash_core/ingestion/repository.py,sha256=oeHbIHhkomONtLKJWgqba7FKd_dYZHv2nT_JnYaP6dk,4828
155
162
  emdash_core/models/__init__.py,sha256=zTsIg4Sy2o2eTWGIpYP9rb_yFdR-DFZ1BSWF9DcrHqU,625
156
- emdash_core/models/agent.py,sha256=W0-5lVM7YxuMznWw90QkMs3vhkH-OZb22sBedbWMMwc,1817
163
+ emdash_core/models/agent.py,sha256=3w97R0AAl7lgUymcRJn6k-Kt5Rak7VT_w39SBkAGeMA,1959
157
164
  emdash_core/models/index.py,sha256=1dohTHOYvtOLmphGUELwgGH7DkMbhK_ykFn2_YmOtag,2207
158
165
  emdash_core/models/query.py,sha256=3ZRTUzZoBr9IRrniXNLq2egUkg3k5tb9BXyu4xPB2DY,3480
159
166
  emdash_core/planning/__init__.py,sha256=6db3V1maLCicMlRuG3JfGCnH84MxcdRrwBsGddlxVCg,267
@@ -165,8 +172,9 @@ emdash_core/planning/llm_explainer.py,sha256=jJlgO5_u5_7TCl_6F-0qoJWtpeY3FTXnR5v
165
172
  emdash_core/planning/similarity.py,sha256=j3jiSWoTqlakHZGa-TxVJYknru7DzRaWlIOow2NG02o,18876
166
173
  emdash_core/planning/team_focus.py,sha256=fv3rCyh_8sHk4w_yjzuw36KlKPAJLPZPgVOo762aneU,32405
167
174
  emdash_core/server.py,sha256=W6x217nJcYLFaybatMiVxDtqkNH-HejZEBn5PLXGryc,5169
175
+ emdash_core/skills/frontend-design/SKILL.md,sha256=fdqIqRS8J_pTH_9h5D-ZUdvYAqor9-xTl2FEYrDAOKA,4338
168
176
  emdash_core/sse/__init__.py,sha256=q6nfbsqvEX7uYTuLwRMb4E73hW-o_Cuv63APod_Kluw,129
169
- emdash_core/sse/stream.py,sha256=V5f76WHGldT4TBT51rUMelivlrIc41z3yr_QKoEe_ao,5255
177
+ emdash_core/sse/stream.py,sha256=CNiXTrTBMNDV6ZMml5Q7XkrXD8-4EqV6kSSIsbcazJ4,5354
170
178
  emdash_core/swarm/__init__.py,sha256=EyL9U64ByQCCcL19ntwu2OU7labME3i3dSpSF25X6Mo,448
171
179
  emdash_core/swarm/merge_agent.py,sha256=Fp0rqdHsd0m0swoAApq46QuBNDw5ejDk4dRddc1cD-E,13038
172
180
  emdash_core/swarm/session_manager.py,sha256=RyLGpfXw-qFXJuQBP3Acw4w7LC_ZIhlPaDDkqjm-ycU,8999
@@ -191,7 +199,7 @@ emdash_core/utils/__init__.py,sha256=tQj81F7ZW61jsNg_R2bA9tDLdk0dc5kQswYWwZSqigU
191
199
  emdash_core/utils/git.py,sha256=j5kppemwAOWe4Bc5a9qUmYYfKqxyi9WLk5U9HgwkgO4,2336
192
200
  emdash_core/utils/image.py,sha256=K8uKDuhZqsJXwNDQ57Q3w2j0PQPyid_aEbiq66zy3p0,14607
193
201
  emdash_core/utils/logger.py,sha256=iLaMA5vkUvxCfWsvZ7WZSDQWv4Gh5gJHeYbAB6urDio,1473
194
- emdash_core-0.1.25.dist-info/METADATA,sha256=HEpSLGk-Q363otD9EdAUYRWm8T7oXqwa48ZcZkidIWs,1343
195
- emdash_core-0.1.25.dist-info/WHEEL,sha256=zp0Cn7JsFoX2ATtOhtaFYIiE2rmFAD4OcMhtUki8W3U,88
196
- emdash_core-0.1.25.dist-info/entry_points.txt,sha256=WgC9h0Bcsh0VaLfDv4hAKaY5krcT2Ati4UyoIJNavdk,105
197
- emdash_core-0.1.25.dist-info/RECORD,,
202
+ emdash_core-0.1.37.dist-info/METADATA,sha256=E7LNPes70TcO2zhqwJLx3y9YmdCHTZ14NCr55088pyE,1453
203
+ emdash_core-0.1.37.dist-info/WHEEL,sha256=zp0Cn7JsFoX2ATtOhtaFYIiE2rmFAD4OcMhtUki8W3U,88
204
+ emdash_core-0.1.37.dist-info/entry_points.txt,sha256=WgC9h0Bcsh0VaLfDv4hAKaY5krcT2Ati4UyoIJNavdk,105
205
+ emdash_core-0.1.37.dist-info/RECORD,,