emdash-core 0.1.7__py3-none-any.whl → 0.1.33__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 (55) hide show
  1. emdash_core/__init__.py +6 -1
  2. emdash_core/agent/__init__.py +4 -0
  3. emdash_core/agent/events.py +52 -1
  4. emdash_core/agent/inprocess_subagent.py +123 -10
  5. emdash_core/agent/prompts/__init__.py +6 -0
  6. emdash_core/agent/prompts/main_agent.py +53 -3
  7. emdash_core/agent/prompts/plan_mode.py +255 -0
  8. emdash_core/agent/prompts/subagents.py +84 -16
  9. emdash_core/agent/prompts/workflow.py +270 -56
  10. emdash_core/agent/providers/base.py +4 -0
  11. emdash_core/agent/providers/factory.py +2 -2
  12. emdash_core/agent/providers/models.py +7 -0
  13. emdash_core/agent/providers/openai_provider.py +137 -13
  14. emdash_core/agent/runner/__init__.py +49 -0
  15. emdash_core/agent/runner/agent_runner.py +753 -0
  16. emdash_core/agent/runner/context.py +451 -0
  17. emdash_core/agent/runner/factory.py +108 -0
  18. emdash_core/agent/runner/plan.py +217 -0
  19. emdash_core/agent/runner/sdk_runner.py +324 -0
  20. emdash_core/agent/runner/utils.py +67 -0
  21. emdash_core/agent/skills.py +358 -0
  22. emdash_core/agent/toolkit.py +85 -5
  23. emdash_core/agent/toolkits/plan.py +9 -11
  24. emdash_core/agent/tools/__init__.py +3 -2
  25. emdash_core/agent/tools/coding.py +48 -4
  26. emdash_core/agent/tools/modes.py +207 -55
  27. emdash_core/agent/tools/search.py +4 -0
  28. emdash_core/agent/tools/skill.py +193 -0
  29. emdash_core/agent/tools/spec.py +61 -94
  30. emdash_core/agent/tools/task.py +41 -2
  31. emdash_core/agent/tools/tasks.py +15 -78
  32. emdash_core/api/agent.py +562 -8
  33. emdash_core/api/index.py +1 -1
  34. emdash_core/api/projectmd.py +4 -2
  35. emdash_core/api/router.py +2 -0
  36. emdash_core/api/skills.py +241 -0
  37. emdash_core/checkpoint/__init__.py +40 -0
  38. emdash_core/checkpoint/cli.py +175 -0
  39. emdash_core/checkpoint/git_operations.py +250 -0
  40. emdash_core/checkpoint/manager.py +231 -0
  41. emdash_core/checkpoint/models.py +107 -0
  42. emdash_core/checkpoint/storage.py +201 -0
  43. emdash_core/config.py +1 -1
  44. emdash_core/core/config.py +18 -2
  45. emdash_core/graph/schema.py +5 -5
  46. emdash_core/ingestion/orchestrator.py +19 -10
  47. emdash_core/models/agent.py +1 -1
  48. emdash_core/server.py +42 -0
  49. emdash_core/skills/frontend-design/SKILL.md +56 -0
  50. emdash_core/sse/stream.py +5 -0
  51. {emdash_core-0.1.7.dist-info → emdash_core-0.1.33.dist-info}/METADATA +2 -2
  52. {emdash_core-0.1.7.dist-info → emdash_core-0.1.33.dist-info}/RECORD +54 -37
  53. {emdash_core-0.1.7.dist-info → emdash_core-0.1.33.dist-info}/entry_points.txt +1 -0
  54. emdash_core/agent/runner.py +0 -601
  55. {emdash_core-0.1.7.dist-info → emdash_core-0.1.33.dist-info}/WHEEL +0 -0
@@ -1,6 +1,6 @@
1
1
  """Orchestrates the complete ingestion pipeline."""
2
2
 
3
- from concurrent.futures import ProcessPoolExecutor, as_completed
3
+ from concurrent.futures import ThreadPoolExecutor, as_completed
4
4
  from pathlib import Path
5
5
  from typing import Callable, Optional
6
6
 
@@ -25,8 +25,6 @@ from ..utils.logger import log
25
25
  def _parse_file_worker(file_path: Path, repo_root: Path) -> FileEntities:
26
26
  """Worker function for parallel file parsing.
27
27
 
28
- This is a module-level function so it can be pickled for ProcessPoolExecutor.
29
-
30
28
  Args:
31
29
  file_path: Path to source file
32
30
  repo_root: Repository root path
@@ -94,7 +92,7 @@ class IngestionOrchestrator:
94
92
 
95
93
  # Acquire write lock for the entire indexing operation
96
94
  with write_lock_context("indexing", timeout=120):
97
- self._run_index(repo_path, incremental, changed_only, skip_git, pr_limit)
95
+ return self._run_index(repo_path, incremental, changed_only, skip_git, pr_limit)
98
96
 
99
97
  def _run_index(
100
98
  self,
@@ -133,7 +131,7 @@ class IngestionOrchestrator:
133
131
  changed_only = False
134
132
  elif last_indexed_commit == current_commit:
135
133
  log.info("No changes since last index - nothing to do")
136
- return
134
+ return {"files": 0, "functions": 0, "classes": 0, "modules": 0, "commits": 0, "authors": 0, "prs": 0, "message": "No changes since last index"}
137
135
  else:
138
136
  extensions = ParserRegistry.get_all_extensions()
139
137
  detector = ChangeDetector(repo, last_indexed_commit)
@@ -141,7 +139,7 @@ class IngestionOrchestrator:
141
139
 
142
140
  if not changed_files:
143
141
  log.info("No relevant file changes detected - nothing to do")
144
- return
142
+ return {"files": 0, "functions": 0, "classes": 0, "modules": 0, "commits": 0, "authors": 0, "prs": 0, "message": "No relevant file changes"}
145
143
 
146
144
  log.info(f"Changes detected: {changed_files.total_changes} files")
147
145
 
@@ -157,7 +155,7 @@ class IngestionOrchestrator:
157
155
  # Parse only added and modified files
158
156
  entities = self._parse_codebase(repo, file_filter=changed_files.all_to_index)
159
157
  else:
160
- log.info("Step 2: Parsing codebase (Layer A)...")
158
+ log.info("Step 2: Indexing codebase (Layer A)...")
161
159
  entities = self._parse_codebase(repo)
162
160
 
163
161
  # Step 3: Extract git history (Layer B)
@@ -201,6 +199,17 @@ class IngestionOrchestrator:
201
199
  log.info("✓ Indexing complete!")
202
200
  self._print_summary(entities, git_data, prs)
203
201
 
202
+ # Return stats for API response
203
+ return {
204
+ "files": len(entities.files),
205
+ "functions": len(entities.functions),
206
+ "classes": len(entities.classes),
207
+ "modules": len(entities.modules),
208
+ "commits": len(git_data.commits) if git_data else 0,
209
+ "authors": len(git_data.authors) if git_data else 0,
210
+ "prs": len(prs) if prs else 0,
211
+ }
212
+
204
213
  def _ensure_database_ready(self):
205
214
  """Ensure database connection and schema are ready."""
206
215
  log.info("Connecting to Kuzu and ensuring schema...")
@@ -350,7 +359,7 @@ class IngestionOrchestrator:
350
359
  last_reported_percent = (current_percent // 10) * 10
351
360
  # Map parsing progress (0-100) to overall progress (10-70)
352
361
  overall_percent = 10 + (last_reported_percent * 0.6)
353
- self._progress_callback(f"Parsing files ({last_reported_percent}%)", overall_percent)
362
+ self._progress_callback("Parsing files", overall_percent)
354
363
 
355
364
  return CodebaseEntities.merge(results)
356
365
 
@@ -373,7 +382,7 @@ class IngestionOrchestrator:
373
382
  last_reported_percent = 0
374
383
  completed = 0
375
384
 
376
- with ProcessPoolExecutor(max_workers=self.config.ingestion.max_workers) as executor:
385
+ with ThreadPoolExecutor(max_workers=self.config.ingestion.max_workers) as executor:
377
386
  # Submit all tasks
378
387
  futures = {
379
388
  executor.submit(_parse_file_worker, file_path, repo_root): file_path
@@ -401,7 +410,7 @@ class IngestionOrchestrator:
401
410
  if current_percent >= last_reported_percent + 10:
402
411
  last_reported_percent = (current_percent // 10) * 10
403
412
  overall_percent = 10 + (last_reported_percent * 0.6)
404
- self._progress_callback(f"Parsing files ({last_reported_percent}%)", overall_percent)
413
+ self._progress_callback("Parsing files", overall_percent)
405
414
 
406
415
  return CodebaseEntities.merge(results)
407
416
 
@@ -26,7 +26,7 @@ class ImageData(BaseModel):
26
26
  class AgentChatOptions(BaseModel):
27
27
  """Options for agent chat."""
28
28
 
29
- max_iterations: int = Field(default=50, description="Maximum agent iterations")
29
+ max_iterations: int = Field(default=100, description="Maximum agent iterations")
30
30
  verbose: bool = Field(default=True, description="Enable verbose output")
31
31
  mode: AgentMode = Field(default=AgentMode.CODE, description="Agent mode")
32
32
  context_threshold: float = Field(
emdash_core/server.py CHANGED
@@ -38,6 +38,47 @@ def _load_env_files(repo_root: Optional[str] = None):
38
38
  load_dotenv(env_path, override=True)
39
39
 
40
40
 
41
+ def _shutdown_executors():
42
+ """Shutdown all module-level thread pool executors and database connections."""
43
+ from concurrent.futures import ThreadPoolExecutor
44
+
45
+ # Import all modules with executors and shut them down
46
+ executor_modules = [
47
+ "emdash_core.api.index",
48
+ "emdash_core.api.auth",
49
+ "emdash_core.api.swarm",
50
+ "emdash_core.api.tasks",
51
+ "emdash_core.api.research",
52
+ "emdash_core.api.spec",
53
+ "emdash_core.api.team",
54
+ "emdash_core.api.review",
55
+ "emdash_core.api.agent",
56
+ "emdash_core.api.projectmd",
57
+ "emdash_core.agent.inprocess_subagent",
58
+ ]
59
+
60
+ for module_name in executor_modules:
61
+ try:
62
+ module = sys.modules.get(module_name)
63
+ if module and hasattr(module, "_executor"):
64
+ executor = getattr(module, "_executor")
65
+ if executor and isinstance(executor, ThreadPoolExecutor):
66
+ executor.shutdown(wait=False)
67
+ except Exception:
68
+ pass # Ignore errors during shutdown
69
+
70
+ # Close database connections
71
+ try:
72
+ from .graph.connection import get_connection, _read_connection
73
+ conn = get_connection()
74
+ if conn:
75
+ conn.close()
76
+ if _read_connection:
77
+ _read_connection.close()
78
+ except Exception:
79
+ pass # Ignore errors during shutdown
80
+
81
+
41
82
  @asynccontextmanager
42
83
  async def lifespan(app: FastAPI):
43
84
  """Application lifespan handler."""
@@ -57,6 +98,7 @@ async def lifespan(app: FastAPI):
57
98
 
58
99
  # Shutdown
59
100
  print("EmDash Core shutting down...")
101
+ _shutdown_executors()
60
102
  if port_file.exists():
61
103
  port_file.unlink()
62
104
 
@@ -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"
@@ -27,6 +31,7 @@ class EventType(str, Enum):
27
31
  # Interaction
28
32
  CLARIFICATION = "clarification"
29
33
  CLARIFICATION_RESPONSE = "clarification_response"
34
+ PLAN_SUBMITTED = "plan_submitted"
30
35
 
31
36
  # Errors
32
37
  ERROR = "error"
@@ -1,6 +1,6 @@
1
1
  Metadata-Version: 2.4
2
2
  Name: emdash-core
3
- Version: 0.1.7
3
+ Version: 0.1.33
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,7 @@ 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)
15
16
  Requires-Dist: duckduckgo-search (>=6.0.0)
16
17
  Requires-Dist: fastapi (>=0.109.0)
17
18
  Requires-Dist: gitpython (>=3.1.40,<4.0.0)
@@ -27,7 +28,6 @@ Requires-Dist: pydantic-settings (>=2.0.0,<3.0.0)
27
28
  Requires-Dist: pygithub (>=2.1.1,<3.0.0)
28
29
  Requires-Dist: python-dotenv (>=1.0.0,<2.0.0)
29
30
  Requires-Dist: python-louvain (>=0.16,<0.17)
30
- Requires-Dist: scipy (>=1.11.4,<2.0.0)
31
31
  Requires-Dist: sentence-transformers (>=2.2.0)
32
32
  Requires-Dist: sse-starlette (>=2.0.0)
33
33
  Requires-Dist: supabase (>=2.0.0)
@@ -1,26 +1,27 @@
1
- emdash_core/__init__.py,sha256=0dZxdypWrXjxbpwqqe2GVhmjTPgy4HkMJfialtlf3Zk,81
2
- emdash_core/agent/__init__.py,sha256=78P3l8dMA9Qepg0b8WMOWobrhmIpzn4Y0TXtgfndQ8E,1061
1
+ emdash_core/__init__.py,sha256=2VnFDN5zmKekKBa5rHZY9nz2Dhv2lB_O6dTcz-wyF8s,226
2
+ emdash_core/agent/__init__.py,sha256=rGY5MXggrv6TLHqNMp3v1oDldL_KErvLIoHARimlNbk,1195
3
3
  emdash_core/agent/agents.py,sha256=CCsDJSl9Vwhitc71L9oQ6SO_qhhyumI7L07Osmgugcg,5825
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=6B31P2peEmvDzJJtC1J6SnBWgtSJ8b29xQSANUzUTko,10272
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/inprocess_subagent.py,sha256=spYScY2T2ej_XCuNkQE1CDoyb5cutbLseC8PbX2gpwA,15877
10
10
  emdash_core/agent/mcp/__init__.py,sha256=qzQMJJOgOYVb6X2uyJxTIGgV5x35Dn7H3IglZxToX_c,1081
11
11
  emdash_core/agent/mcp/client.py,sha256=_ae6CWRnJfG_mcCcIYZJYbWjajpZC-WmZgsZsRaahco,9753
12
12
  emdash_core/agent/mcp/config.py,sha256=JrO7xIC3oSiFlxeTVynKm1pq2CrYdqzTsIJj9neSJLQ,9220
13
13
  emdash_core/agent/mcp/manager.py,sha256=i4OIJyAwfBAw0E8fe6NIOvT-UTf1_hmDbEtIjtAhRjc,15382
14
14
  emdash_core/agent/mcp/tool_factory.py,sha256=jtQJ2TW7KdGVSg3fUp9-rm7MbHjiwWmy0yLfwr0H4qc,6410
15
- emdash_core/agent/prompts/__init__.py,sha256=EMLIp-YC5CL02W4Pk3DPTxMxVM2fE4qM9hX3abDiadE,845
16
- emdash_core/agent/prompts/main_agent.py,sha256=3BTmdRI706yw4j5AASvBKqTY6gIZSFKRytWfPPVd4dg,3399
17
- emdash_core/agent/prompts/subagents.py,sha256=OExWESyPEy7O9kMEiIzuDkKeIPvHX2miieQSPEVG0uc,3863
18
- emdash_core/agent/prompts/workflow.py,sha256=EpLSg8DZaMbOHBpQtmsE94yMkMId-Y0NL6wFnsfCiRI,4112
15
+ emdash_core/agent/prompts/__init__.py,sha256=BuCvF0XLJdhXSWNz0NoJI6dBnomLzRcfZxdBWmkh8tg,987
16
+ emdash_core/agent/prompts/main_agent.py,sha256=d-OB18Kdw6H2CF8AUSvmFGDdI6-k_8P7nobyik37fQk,4828
17
+ emdash_core/agent/prompts/plan_mode.py,sha256=xGtYv8rvdhQhFKSqZpG4byawEPjQGSFuqO14cZcGThI,8070
18
+ emdash_core/agent/prompts/subagents.py,sha256=-hVDu465Rg_042YIr6Dkdy_rM-qzzjfrjQB9GqCoNv8,6946
19
+ emdash_core/agent/prompts/workflow.py,sha256=ou5ilg7eg3E7A0AgvT70u4trO_enKzkUpgNc74qKbOE,12898
19
20
  emdash_core/agent/providers/__init__.py,sha256=q58ektAl1zwuS3z36ctHfLB8XruYghT97aq_oj1T_G0,776
20
- emdash_core/agent/providers/base.py,sha256=qRHuLOXt5p0v0ewbcKpIANVy46KAG1rsDDyBdSr2NUM,4098
21
- emdash_core/agent/providers/factory.py,sha256=F3bKXvZuLOJn--m5eTblUf3_xdzzbnW97YNDDbQBgJQ,3143
22
- emdash_core/agent/providers/models.py,sha256=3klv592DjNgMtR0EZ45-G2ylQNOCC_II_2Ki5POpbFs,8442
23
- emdash_core/agent/providers/openai_provider.py,sha256=2zuTaUFvq3Zkp6cG_r6zFcYpdjLw_SLkOM_gIPNGZGw,15481
21
+ emdash_core/agent/providers/base.py,sha256=m1Vuac2Gtr191YDkefG_3qD64iIT9Ps2WoZC1LWmfJU,4351
22
+ emdash_core/agent/providers/factory.py,sha256=UgPVNQupa73dKugyG_JqFgVdj4y5YJIGbcGXEbzx_1c,3213
23
+ emdash_core/agent/providers/models.py,sha256=0mkkqiXOQKV25GbqJvm-85mPiJx3Cb3jbn3KTV4NbU0,8710
24
+ emdash_core/agent/providers/openai_provider.py,sha256=URUv4g7P_87yOuWNYPd9pZNlw3SuCdPe5bvX-I_2EW0,21037
24
25
  emdash_core/agent/providers/transformers_provider.py,sha256=USSzYIcZrcTAKDKwiNobYUDS024ZVZ34WAuYWGbs9Nk,7167
25
26
  emdash_core/agent/research/__init__.py,sha256=4LU9Skk3sxsDy8GzfOxCjNxxqaxOm94hV5cH-Nyqn7g,1992
26
27
  emdash_core/agent/research/agent.py,sha256=dGjSZL2rsuJmSRpa8060R5gIvX8rIj57Zs21LsBJ-1U,3819
@@ -33,37 +34,45 @@ emdash_core/agent/research/state.py,sha256=P44YUTUhMrAmt--xsj8Hi0SzbDmrLXKPEf83H
33
34
  emdash_core/agent/research/synthesizer.py,sha256=j4UvH8JxUjo7RF-h69tpRERgN6pHSb8qNBOoKrH2Qro,19016
34
35
  emdash_core/agent/reviewer_profile.py,sha256=RkJ_Mk5vbp2U-e0UBWB-k59cHsTzLj0aro22KJVCbss,16075
35
36
  emdash_core/agent/rules.py,sha256=GVwfM6YlRxrPXLZ0h2cZFOx4l_mPPl0Bdwt8oxfMBLI,3014
36
- emdash_core/agent/runner.py,sha256=tb0ILSOYwBEFFLpYmwWyMbNE7N64bKNdFO7wO9i60IM,21787
37
+ emdash_core/agent/runner/__init__.py,sha256=FK3FUSsdKImso-QATYam5OnQhpCCHyXnXYRtmoLdQ80,1384
38
+ emdash_core/agent/runner/agent_runner.py,sha256=kDpiF7i5nxBMtJG9Y_ki0gfWBkS_eJzwEswZJr6zZFs,31706
39
+ emdash_core/agent/runner/context.py,sha256=Yw2A2q1Uisgpye3n1rqYQFSmZRidvbxWnUJdvm_EgpI,14124
40
+ emdash_core/agent/runner/factory.py,sha256=SXtfgD4F8R8cUDR4Tt-3LPHSDjyJwkyEAbxflXgjkqc,3288
41
+ emdash_core/agent/runner/plan.py,sha256=WMra-xpWeNJ0YtdnQMsd2aak5BhryrzUP_OtZMhlzeA,7336
42
+ emdash_core/agent/runner/sdk_runner.py,sha256=KrlWLagZc_01jqYBHioqz2WIJqXmb3INyFnYuTQnBZA,10587
43
+ emdash_core/agent/runner/utils.py,sha256=1feF3-rYA9x3Inh7pKdtPSGpMzNM5bBV5s6CJVCqqJQ,1826
37
44
  emdash_core/agent/session.py,sha256=Zr7m8IK4-J6CDIMmN2QiSqpDT_O2S-SXu3Qmy9w6dk8,8517
45
+ emdash_core/agent/skills.py,sha256=0DPDmcSjG8J4LrUID90qH8MFBJ9OIFHS9CKH3jUl0Oc,10516
38
46
  emdash_core/agent/spec_schema.py,sha256=tmTCrO4zKXkOblW6gRyrQ3_ZdYU-ehnLE8YmZbhPHWQ,1429
39
47
  emdash_core/agent/specification.py,sha256=b1nUQiGT4NiRv42hDkYAXVX_RtsKcHrf4Ae1dx0UVnc,19105
40
48
  emdash_core/agent/subagent.py,sha256=zIlhbHOCUEgYtYLYwiQ7dkSleqI60emyBA-5XLPaH_k,12150
41
49
  emdash_core/agent/subagent_prompts.py,sha256=pJJPXh4FlnE8bt9d-Ruquz6j8W-BS9pMCbXRqpgwq4g,407
42
- emdash_core/agent/toolkit.py,sha256=qEXCvxpd_sJAWJLeU9Qvza3x6GH3NtqEWPmuj11vtOk,16706
50
+ emdash_core/agent/toolkit.py,sha256=bNDBNlxYEKwD5KkIsrZ4505ITKrlxt-W99H9pS_12BY,19897
43
51
  emdash_core/agent/toolkits/__init__.py,sha256=HrWyA1M666V0UZ6P7YISnnQg4rblWbIFW_HcMKlHfK4,1814
44
52
  emdash_core/agent/toolkits/base.py,sha256=Z4IMrli7UMi7K3rWhqfph_5vv9Tdnc0M8iCQDgE_3lM,2587
45
53
  emdash_core/agent/toolkits/explore.py,sha256=ymyvLjIXy80h3lb4y_DZ06T0vADCal976qMW19J6N8A,1395
46
- emdash_core/agent/toolkits/plan.py,sha256=S5VnewUpSHOgpieiph3EuA_qPOUS7EpG198EuqNVG3o,1820
47
- emdash_core/agent/tools/__init__.py,sha256=r2gI_DjudTku7pIKwcndRxxpawvp5EDm2AuWhL31NPo,2918
54
+ emdash_core/agent/toolkits/plan.py,sha256=wUj98JI6l7TjWLgXnPfAsmqXDqe02EdQ1akJVMgC9vc,1666
55
+ emdash_core/agent/tools/__init__.py,sha256=gJ8mAi4yg-jAYjq0UidDt1x8thkfxybX8RbOCoN6ZHc,2966
48
56
  emdash_core/agent/tools/analytics.py,sha256=tEP_RWFpKGfFW_Yc5inMMjAkDFzpDQ77Ui_Ca7LQu60,14837
49
57
  emdash_core/agent/tools/base.py,sha256=3clLKgR7Og5eDijZJLEcpJS1YV8u1rW_pXr_iwHdxTo,3349
50
- emdash_core/agent/tools/coding.py,sha256=plz_prz_lg6JEUzF_yvbADoHSyZ_3i6wdEh7GiS5YOE,14343
58
+ emdash_core/agent/tools/coding.py,sha256=tGGfDzjQySkIhMWMcGxDbC_c2p_hJSOLAyUJ-FCJzxo,16573
51
59
  emdash_core/agent/tools/github_mcp.py,sha256=D4fu_z9j-rL8SHD8TA2tO-ED-8Q4QB_RHQoqsh7Bjy8,16870
52
60
  emdash_core/agent/tools/history.py,sha256=Zaers4Aul9-hrlMaGRcQHwfU2xb7yCjHFHSDtfMe3c4,423
53
- emdash_core/agent/tools/modes.py,sha256=l9xOdG1R13WRCSJnegCh4PUmZLltSPgd144Z0byB0L0,4239
61
+ emdash_core/agent/tools/modes.py,sha256=g82igKjpBeC23HgYRgULCNbjCRZQ6C-rmMMbNEGNbEk,10587
54
62
  emdash_core/agent/tools/plan.py,sha256=RRvZsDHcvvDv6uyDSGhTYIoImZmI_7CCxCarkeSZjbQ,7922
55
63
  emdash_core/agent/tools/plan_write.py,sha256=o4EEHTUr1hRfH3WSjrh3-QTfaJuUhjsQ5bJNBPD_j5Q,4417
56
- emdash_core/agent/tools/search.py,sha256=8687DLMI1qi5Ld1ZpQl5hZG_PcKVQ7iwOoAIEU6Pkbw,14133
57
- emdash_core/agent/tools/spec.py,sha256=QmDbhLfXkYmFhBFNrgPoADmcPWjT5-_wXOwZgjqZeDg,11585
58
- emdash_core/agent/tools/task.py,sha256=-xM2GFdBnchrVNiOHgxa0hWQyvum4sC4QgBf3y5N_64,8906
64
+ emdash_core/agent/tools/search.py,sha256=aq5_jc8YT3R3oZtulgvKwmz1oljJom20NfF_q60o60Q,14353
65
+ emdash_core/agent/tools/skill.py,sha256=B7IefgH2DndHXFOaozSnJkhLQj9VQHNJH7-0ovgVmS0,6124
66
+ emdash_core/agent/tools/spec.py,sha256=R9Ib-1epCVrgbOB6C9qYkwvgut94x3P2g4_FM_tMd2M,10022
67
+ emdash_core/agent/tools/task.py,sha256=BQLqSXULtQPRw5BFix6MdiNvfMFo0TqAa4momN_wQys,10719
59
68
  emdash_core/agent/tools/task_output.py,sha256=30EI8JAKBDw6gLmjF8bXAq00yMr-Qk14J7fv2kDVX1c,6421
60
- emdash_core/agent/tools/tasks.py,sha256=VS6VWgJtZiBdC16UigN90GTvKbPCm_PYLuC0r9vLl5w,14764
69
+ emdash_core/agent/tools/tasks.py,sha256=VT-oLFKzswmKu02H1hc_ercJ1blbseCo0Q0qRBh0DjM,11844
61
70
  emdash_core/agent/tools/traversal.py,sha256=qQvHkledo_rT9q9kxk07pijY8XqkR4WWB5pFWVmG01I,20249
62
71
  emdash_core/agent/tools/web.py,sha256=cqm4eiiBzeGCOmQE---uT9zlgsQUX9WY_YYz7wQbK1U,5521
63
72
  emdash_core/analytics/__init__.py,sha256=5ky2djAly3-3lbQmUuNJlJTmBDaXjN2lOUw-OP2F1Zk,98
64
73
  emdash_core/analytics/engine.py,sha256=f1go7SNnSlM_sFUEvmHrD4PTY9G39REBC7w01xdh3as,47738
65
74
  emdash_core/api/__init__.py,sha256=L11AeV6gaCJjlZ8DU_q-lcuZYH9WV3BV4GYq8JF8BuI,92
66
- emdash_core/api/agent.py,sha256=kjNNG2LdISjzOiP9Bdbo4FFxh9GjyA1upQESVQrKhOk,8656
75
+ emdash_core/api/agent.py,sha256=nLkdqaJvgKyKQTg8EpMvMdbK23rbWgDdZROeyCC_v6k,26207
67
76
  emdash_core/api/agents.py,sha256=kInkI6iGnQuRxz5wS9w_Owq-4iceUJgugIOrWGDLkGA,3673
68
77
  emdash_core/api/analyze.py,sha256=cR6wWzqSvp_5cNyUg0qACNF7DYdrcNkzhmRqgaqnd78,7593
69
78
  emdash_core/api/auth.py,sha256=vnhH_xcsoTDYrCDBDytlm0LOV9yDoar04NL5FZKI8JU,4832
@@ -72,22 +81,29 @@ emdash_core/api/db.py,sha256=3Y702OOO-RTMRQxvKaaNW3x2f74agTSdyEKserPjyg4,3162
72
81
  emdash_core/api/embed.py,sha256=fi7bvXRaYJg-lR7dMF6czYgyMi1Hcu4undoCEO6VqEM,4065
73
82
  emdash_core/api/feature.py,sha256=DFqYMAjtmo4jzjdI1u1vWDBU-heCsUl_bziKW7qjheQ,4759
74
83
  emdash_core/api/health.py,sha256=MBFvhauwjoY75omSO-X0jyh1Rr9WSLVy_DkSLpDbFn0,2370
75
- emdash_core/api/index.py,sha256=1rBD496N0sa3rkuiNFzkbeqPWS8XJXtxMIZzdnBsctI,5268
84
+ emdash_core/api/index.py,sha256=7FtyfTvB6K5Yh1mQZ3qlYWQ492QqCA4aTBbdeZBdfb4,5269
76
85
  emdash_core/api/plan.py,sha256=k5b-nhSpo18Y-HI4RAqmabJWvLXTx9tt0cR3PNj9ewQ,3350
77
- emdash_core/api/projectmd.py,sha256=KC0T_8TpKdASWdUGd3SytjuH8YH3cJEMkZgFU2tDg68,5966
86
+ emdash_core/api/projectmd.py,sha256=KJmLpiTNwXK75_ADdUIWl2OfPLZU-WQaffsV1I5F8ZY,6105
78
87
  emdash_core/api/query.py,sha256=90HuhYGRiPtolYMBdlYcgW8DV_SvYo0H2xZ_YUWVPRw,10188
79
88
  emdash_core/api/research.py,sha256=_r0BDkvzLRE2sF4yMQye9IqSeu9yBGlXAYdr-LAlnm8,3511
80
89
  emdash_core/api/review.py,sha256=zOGrwwThZP_himnFyBKCl4mo4gjniuEaWGNWqcKajb0,4766
81
- emdash_core/api/router.py,sha256=f0_80x8HbDC3rvAteSgfjMfq4lmCF7CrK1FAdR0S1uY,1476
90
+ emdash_core/api/router.py,sha256=7dVshcIe4m_T-FlRTRvw1RB8U9-bLPef9GdI42ONMvI,1529
82
91
  emdash_core/api/rules.py,sha256=BbIE_RKX8VGlUqxny0OK-tKoTK58bDBFXBf_1x3yN7g,3242
83
92
  emdash_core/api/search.py,sha256=qPVVTNRExbyG4Ri3X3F5uGpILhlvtH99dHBv7ZVkRIw,3696
93
+ emdash_core/api/skills.py,sha256=8hF7IkM--aMMaNEaa16DoHl-8fBVx8oYCBnnqgsFkuE,6422
84
94
  emdash_core/api/spec.py,sha256=ub09u1mkqpcF-z0Q1YU9FAkJb0LDyV_eG0_KXYLFmuk,2912
85
95
  emdash_core/api/swarm.py,sha256=-CNY-NCVnwes0MlHV5yq_ZUie8pJxt0Fdg4g5R94dKo,6561
86
96
  emdash_core/api/tasks.py,sha256=kyrhSc46wfwM3csOT26Gsx9SNjKSTwC9BQ5qMqe1uaY,3160
87
97
  emdash_core/api/team.py,sha256=nHdsTIQ-ZDlpByNIVpSl4Ahf4q51A_HwQTnnmBq6agA,3308
88
98
  emdash_core/auth/__init__.py,sha256=NpcoEyqtqYwUTKKFwNGKgroPOGtXS5rUpH2D9t2_4TY,290
89
99
  emdash_core/auth/github.py,sha256=__qpcWbi9dWC4W9FQfyJ6KEg7N1gXQW9k9Aub45EQ_o,11269
90
- emdash_core/config.py,sha256=2avAiSrmKRj1kPE3EVQFkrXuBch-SFWAAaVdkTAMR1g,2215
100
+ emdash_core/checkpoint/__init__.py,sha256=hN3CaoH2hqTb-KquSmdQlSyKb_3oFS10UbTgHSQRC5w,1184
101
+ emdash_core/checkpoint/cli.py,sha256=acq2qO6Ea5_a8GSJefPMOP0v8xv5a_afeY8c48z0bXE,5778
102
+ emdash_core/checkpoint/git_operations.py,sha256=cBn7fElPvr_11jmzvnw4ZMSVKBOwKIHuSJ4sSq71n2o,7652
103
+ emdash_core/checkpoint/manager.py,sha256=XHzZxaSw-rOguULtuddPeumhPRlxMJAzSAqFFS-KMgE,7420
104
+ emdash_core/checkpoint/models.py,sha256=0xfpeNHmLgVVzMzSo-C1dm-1bEWBAZvFED_1Du-RptI,3390
105
+ emdash_core/checkpoint/storage.py,sha256=AKUwxeMA05hmxwdRPFivwqv0GWGYgCBlV4m9auzlxpk,5970
106
+ emdash_core/config.py,sha256=i2M9iRxiZQiKlkc1I0goXwI7ac6ABEdku58u_mGbWbA,2216
91
107
  emdash_core/context/__init__.py,sha256=_6hqH8FtCi4Q3OpuC9zDPDEXuBitLxrY20CdookRTsY,1496
92
108
  emdash_core/context/models.py,sha256=eQdjaea5M6iQ-9ZxJ5IVQgiQEPbZz81Xe2B186GuSYI,1304
93
109
  emdash_core/context/providers/__init__.py,sha256=cWokJwYatvihXoyhqM6BHbG4JQeImgWzyjLdj60BqS4,261
@@ -99,7 +115,7 @@ emdash_core/context/reranker.py,sha256=xoajICW7yhxBtq6yJnFDzQXRl0_G8W-ACQyalZ72U
99
115
  emdash_core/context/service.py,sha256=vTSCUoXdNGTTs0ZtMHInX3uG5Wbol-lpCXEn4ICNCDo,9438
100
116
  emdash_core/context/session.py,sha256=XqDELflx7TGosraTU3mBJcZLwD1Ihv2DtuFjeoxjF7A,12424
101
117
  emdash_core/core/__init__.py,sha256=KW97frnmqf5PWHIvYpdZN7aaAPaUXWfsLEEicdZ3g80,1987
102
- emdash_core/core/config.py,sha256=ApiKr5kKwSKWhr08dosZ1EvTMcfZ5PVMo4FsBlP9cac,15474
118
+ emdash_core/core/config.py,sha256=OLI-tbeI8KGzX9GzpL0YcjRJbN1TgCxlaVXSCfkfesU,16044
103
119
  emdash_core/core/exceptions.py,sha256=LA4bsgEmPJUKQiBmrMpbPT6Iatu4xQLdenGMceMD2Yk,1186
104
120
  emdash_core/core/models.py,sha256=U2achHuaaP9Qr2qZEqBvdzpbxNN2z-SJWjjGpBBiCu4,7810
105
121
  emdash_core/core/review_config.py,sha256=pP8d_0D6mzKg2iYLjrbF9XcI8FIPLwZa0onUDUTvgkM,1455
@@ -121,7 +137,7 @@ emdash_core/embeddings/service.py,sha256=nvSpMsqzoEnZA7iwLHwTWMqR3YzeFnbGFrL1RmN
121
137
  emdash_core/graph/__init__.py,sha256=H8Ib_jH6Tu8EGKYw8pAaiFrmMMOvty7AMiOiypbKA4M,530
122
138
  emdash_core/graph/builder.py,sha256=INh81gubFgmow25eNm2Z139p9VAmZhRx9pyylOhJxgw,4531
123
139
  emdash_core/graph/connection.py,sha256=ZhMPQpPv_oQOUzdObfwswnuTivsYs90Mawi6DejbYI8,22113
124
- emdash_core/graph/schema.py,sha256=FqKn-fFF9lcv6MhqcnjNjxcPoLji1gy-UspfInTOHaE,13296
140
+ emdash_core/graph/schema.py,sha256=sKjW1GS3tutpFNeXF7TVMA17iOMEdnyfLGG3hbEigXA,13281
125
141
  emdash_core/graph/writer.py,sha256=QleDLLB2PTj2cd3vFMrgZXZWk9-_sC1MZMFzFZHjFnE,26191
126
142
  emdash_core/ingestion/__init__.py,sha256=hyGLUPT04C9RXj7zaJF_389-8KA6xQN8zCX8l2v_NZ0,276
127
143
  emdash_core/ingestion/change_detector.py,sha256=LOAODz_apk4ZRfAINz4lf2gCEq1zqQk0bkRnfRrn9oM,5312
@@ -130,7 +146,7 @@ emdash_core/ingestion/git/commit_analyzer.py,sha256=4DftTUgycv6u695RxaVAIL4VzsTA
130
146
  emdash_core/ingestion/github/__init__.py,sha256=G5SR95r5heXPfcgNUpvN241x8zXs0IuyOQjmbPIDOGM,156
131
147
  emdash_core/ingestion/github/pr_fetcher.py,sha256=zs2xijWTkHEEYdHpNVVzq1W2V8hmBelS39H5b3Ei77c,9539
132
148
  emdash_core/ingestion/github/task_extractor.py,sha256=PNkm8xEAlss3MWDY_iRdLlxmyJBca3jRjNCVYoRVp0E,2679
133
- emdash_core/ingestion/orchestrator.py,sha256=qToPFJOnnQrGfp7FeizxOU3sdCJhMZtj4bZ7scpiZ5k,19740
149
+ emdash_core/ingestion/orchestrator.py,sha256=8Cq-WHJmu2fUPOBfBT0wExFysS7aKtln-wcjjjHE_V0,20303
134
150
  emdash_core/ingestion/parsers/__init__.py,sha256=_zathXaXCNKL-Qiezvi3UCxxRnBHCTUOXYOcpoteExU,347
135
151
  emdash_core/ingestion/parsers/base_parser.py,sha256=rlNsMLfZ4nOp7ufqTbfd-7vXP9oPoqumgt5gW72efU4,2072
136
152
  emdash_core/ingestion/parsers/call_graph_builder.py,sha256=GUqvKAOIM1gnGTph4risf-E6hJnXJhFpPbBsYPyxLu4,3703
@@ -143,7 +159,7 @@ emdash_core/ingestion/parsers/ts_ast_parser.js,sha256=bvFEl97bzI-UItTvYkyT5D0rxX
143
159
  emdash_core/ingestion/parsers/typescript_parser.py,sha256=UHEuKUwaEkrscZ7NEisBWcZxJ1Ltn7pUvsdTdccqMGY,10928
144
160
  emdash_core/ingestion/repository.py,sha256=ZyKw4NYTIgw35LbkYSsqwNmQoGkpVq06q0qm6lFMGGM,10287
145
161
  emdash_core/models/__init__.py,sha256=zTsIg4Sy2o2eTWGIpYP9rb_yFdR-DFZ1BSWF9DcrHqU,625
146
- emdash_core/models/agent.py,sha256=MgqLjBTGKrPQ5coxu0HmoyvpPDhLaUB7r62JnQE4NCw,1816
162
+ emdash_core/models/agent.py,sha256=W0-5lVM7YxuMznWw90QkMs3vhkH-OZb22sBedbWMMwc,1817
147
163
  emdash_core/models/index.py,sha256=1dohTHOYvtOLmphGUELwgGH7DkMbhK_ykFn2_YmOtag,2207
148
164
  emdash_core/models/query.py,sha256=3ZRTUzZoBr9IRrniXNLq2egUkg3k5tb9BXyu4xPB2DY,3480
149
165
  emdash_core/planning/__init__.py,sha256=6db3V1maLCicMlRuG3JfGCnH84MxcdRrwBsGddlxVCg,267
@@ -154,9 +170,10 @@ emdash_core/planning/feature_expander.py,sha256=ADNv3qsbRqPtXKRVDSZIf4lcaf_hxdGc
154
170
  emdash_core/planning/llm_explainer.py,sha256=jJlgO5_u5_7TCl_6F-0qoJWtpeY3FTXnR5vvHcqa0Dc,7150
155
171
  emdash_core/planning/similarity.py,sha256=j3jiSWoTqlakHZGa-TxVJYknru7DzRaWlIOow2NG02o,18876
156
172
  emdash_core/planning/team_focus.py,sha256=fv3rCyh_8sHk4w_yjzuw36KlKPAJLPZPgVOo762aneU,32405
157
- emdash_core/server.py,sha256=HEOEffYTnScGEaBfO-sg6YGl5TorxHyt-_r0Krt_mRY,3763
173
+ emdash_core/server.py,sha256=W6x217nJcYLFaybatMiVxDtqkNH-HejZEBn5PLXGryc,5169
174
+ emdash_core/skills/frontend-design/SKILL.md,sha256=fdqIqRS8J_pTH_9h5D-ZUdvYAqor9-xTl2FEYrDAOKA,4338
158
175
  emdash_core/sse/__init__.py,sha256=q6nfbsqvEX7uYTuLwRMb4E73hW-o_Cuv63APod_Kluw,129
159
- emdash_core/sse/stream.py,sha256=WNBiNpiA-uM8KAuUGLz5fjWdurQsGwv2fcDoxvOTVJw,5217
176
+ emdash_core/sse/stream.py,sha256=CNiXTrTBMNDV6ZMml5Q7XkrXD8-4EqV6kSSIsbcazJ4,5354
160
177
  emdash_core/swarm/__init__.py,sha256=EyL9U64ByQCCcL19ntwu2OU7labME3i3dSpSF25X6Mo,448
161
178
  emdash_core/swarm/merge_agent.py,sha256=Fp0rqdHsd0m0swoAApq46QuBNDw5ejDk4dRddc1cD-E,13038
162
179
  emdash_core/swarm/session_manager.py,sha256=RyLGpfXw-qFXJuQBP3Acw4w7LC_ZIhlPaDDkqjm-ycU,8999
@@ -181,7 +198,7 @@ emdash_core/utils/__init__.py,sha256=tQj81F7ZW61jsNg_R2bA9tDLdk0dc5kQswYWwZSqigU
181
198
  emdash_core/utils/git.py,sha256=j5kppemwAOWe4Bc5a9qUmYYfKqxyi9WLk5U9HgwkgO4,2336
182
199
  emdash_core/utils/image.py,sha256=K8uKDuhZqsJXwNDQ57Q3w2j0PQPyid_aEbiq66zy3p0,14607
183
200
  emdash_core/utils/logger.py,sha256=iLaMA5vkUvxCfWsvZ7WZSDQWv4Gh5gJHeYbAB6urDio,1473
184
- emdash_core-0.1.7.dist-info/METADATA,sha256=7v6Mw8RNSpX_tcZ_iSPJEDSj7y7K16KtIUDisJ8iZBc,1381
185
- emdash_core-0.1.7.dist-info/WHEEL,sha256=zp0Cn7JsFoX2ATtOhtaFYIiE2rmFAD4OcMhtUki8W3U,88
186
- emdash_core-0.1.7.dist-info/entry_points.txt,sha256=4lEFv-LTTPVSF3IcGns017yAQPgY7Y8pHeO6QGDf0jA,55
187
- emdash_core-0.1.7.dist-info/RECORD,,
201
+ emdash_core-0.1.33.dist-info/METADATA,sha256=DzKymxf8EVFNST9WBtIHeLDIxbRaWWqXtRNgf2181kU,1386
202
+ emdash_core-0.1.33.dist-info/WHEEL,sha256=zp0Cn7JsFoX2ATtOhtaFYIiE2rmFAD4OcMhtUki8W3U,88
203
+ emdash_core-0.1.33.dist-info/entry_points.txt,sha256=WgC9h0Bcsh0VaLfDv4hAKaY5krcT2Ati4UyoIJNavdk,105
204
+ emdash_core-0.1.33.dist-info/RECORD,,
@@ -1,3 +1,4 @@
1
1
  [console_scripts]
2
+ emdash-checkpoint=emdash_core.checkpoint.cli:main
2
3
  emdash-core=emdash_core.server:main
3
4