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.
- emdash_core/agent/__init__.py +4 -0
- emdash_core/agent/agents.py +84 -23
- emdash_core/agent/events.py +42 -20
- emdash_core/agent/hooks.py +419 -0
- emdash_core/agent/inprocess_subagent.py +166 -18
- emdash_core/agent/prompts/__init__.py +4 -3
- emdash_core/agent/prompts/main_agent.py +67 -2
- emdash_core/agent/prompts/plan_mode.py +236 -107
- emdash_core/agent/prompts/subagents.py +103 -23
- emdash_core/agent/prompts/workflow.py +159 -26
- emdash_core/agent/providers/factory.py +2 -2
- emdash_core/agent/providers/openai_provider.py +67 -15
- emdash_core/agent/runner/__init__.py +49 -0
- emdash_core/agent/runner/agent_runner.py +765 -0
- emdash_core/agent/runner/context.py +470 -0
- emdash_core/agent/runner/factory.py +108 -0
- emdash_core/agent/runner/plan.py +217 -0
- emdash_core/agent/runner/sdk_runner.py +324 -0
- emdash_core/agent/runner/utils.py +67 -0
- emdash_core/agent/skills.py +47 -8
- emdash_core/agent/toolkit.py +46 -14
- emdash_core/agent/toolkits/__init__.py +117 -18
- emdash_core/agent/toolkits/base.py +87 -2
- emdash_core/agent/toolkits/explore.py +18 -0
- emdash_core/agent/toolkits/plan.py +27 -11
- emdash_core/agent/tools/__init__.py +2 -2
- emdash_core/agent/tools/coding.py +48 -4
- emdash_core/agent/tools/modes.py +151 -143
- emdash_core/agent/tools/task.py +52 -6
- emdash_core/api/agent.py +706 -1
- emdash_core/ingestion/repository.py +17 -198
- emdash_core/models/agent.py +4 -0
- emdash_core/skills/frontend-design/SKILL.md +56 -0
- emdash_core/sse/stream.py +4 -0
- {emdash_core-0.1.25.dist-info → emdash_core-0.1.37.dist-info}/METADATA +4 -1
- {emdash_core-0.1.25.dist-info → emdash_core-0.1.37.dist-info}/RECORD +38 -30
- emdash_core/agent/runner.py +0 -1123
- {emdash_core-0.1.25.dist-info → emdash_core-0.1.37.dist-info}/WHEEL +0 -0
- {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
|
|
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
|
|
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
|
|
14
|
+
"""Manages local Git repository operations."""
|
|
21
15
|
|
|
22
|
-
def __init__(self
|
|
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
|
|
25
|
+
"""Get a local repository.
|
|
41
26
|
|
|
42
27
|
Args:
|
|
43
|
-
repo_path:
|
|
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
|
-
#
|
|
53
|
-
if Path(repo_path).exists():
|
|
54
|
-
|
|
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
|
-
|
|
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")
|
emdash_core/models/agent.py
CHANGED
|
@@ -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.
|
|
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=
|
|
3
|
-
emdash_core/agent/agents.py,sha256=
|
|
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=
|
|
7
|
+
emdash_core/agent/events.py,sha256=Qw6s6jzBFXIlsDNpPBiIwNB72tnjbAJNt6hhcblOslg,11930
|
|
8
8
|
emdash_core/agent/handlers.py,sha256=3zo76GT3cTfYayK1qvP2NFo14AXHfA36X-yaa7Xm3T0,7135
|
|
9
|
-
emdash_core/agent/
|
|
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=
|
|
16
|
-
emdash_core/agent/prompts/main_agent.py,sha256=
|
|
17
|
-
emdash_core/agent/prompts/plan_mode.py,sha256=
|
|
18
|
-
emdash_core/agent/prompts/subagents.py,sha256=
|
|
19
|
-
emdash_core/agent/prompts/workflow.py,sha256=
|
|
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=
|
|
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=
|
|
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=
|
|
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=
|
|
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=
|
|
45
|
-
emdash_core/agent/toolkits/__init__.py,sha256=
|
|
46
|
-
emdash_core/agent/toolkits/base.py,sha256=
|
|
47
|
-
emdash_core/agent/toolkits/explore.py,sha256=
|
|
48
|
-
emdash_core/agent/toolkits/plan.py,sha256=
|
|
49
|
-
emdash_core/agent/tools/__init__.py,sha256=
|
|
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=
|
|
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=
|
|
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
|
|
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=
|
|
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=
|
|
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=
|
|
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=
|
|
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.
|
|
195
|
-
emdash_core-0.1.
|
|
196
|
-
emdash_core-0.1.
|
|
197
|
-
emdash_core-0.1.
|
|
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,,
|