omni-cortex 1.8.0__py3-none-any.whl → 1.10.0__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 (26) hide show
  1. {omni_cortex-1.8.0.data → omni_cortex-1.10.0.data}/data/share/omni-cortex/dashboard/backend/main.py +196 -0
  2. {omni_cortex-1.8.0.data → omni_cortex-1.10.0.data}/data/share/omni-cortex/dashboard/backend/models.py +49 -15
  3. {omni_cortex-1.8.0.dist-info → omni_cortex-1.10.0.dist-info}/METADATA +1 -1
  4. omni_cortex-1.10.0.dist-info/RECORD +25 -0
  5. omni_cortex-1.8.0.dist-info/RECORD +0 -25
  6. {omni_cortex-1.8.0.data → omni_cortex-1.10.0.data}/data/share/omni-cortex/dashboard/backend/.env.example +0 -0
  7. {omni_cortex-1.8.0.data → omni_cortex-1.10.0.data}/data/share/omni-cortex/dashboard/backend/backfill_summaries.py +0 -0
  8. {omni_cortex-1.8.0.data → omni_cortex-1.10.0.data}/data/share/omni-cortex/dashboard/backend/chat_service.py +0 -0
  9. {omni_cortex-1.8.0.data → omni_cortex-1.10.0.data}/data/share/omni-cortex/dashboard/backend/database.py +0 -0
  10. {omni_cortex-1.8.0.data → omni_cortex-1.10.0.data}/data/share/omni-cortex/dashboard/backend/image_service.py +0 -0
  11. {omni_cortex-1.8.0.data → omni_cortex-1.10.0.data}/data/share/omni-cortex/dashboard/backend/logging_config.py +0 -0
  12. {omni_cortex-1.8.0.data → omni_cortex-1.10.0.data}/data/share/omni-cortex/dashboard/backend/project_config.py +0 -0
  13. {omni_cortex-1.8.0.data → omni_cortex-1.10.0.data}/data/share/omni-cortex/dashboard/backend/project_scanner.py +0 -0
  14. {omni_cortex-1.8.0.data → omni_cortex-1.10.0.data}/data/share/omni-cortex/dashboard/backend/prompt_security.py +0 -0
  15. {omni_cortex-1.8.0.data → omni_cortex-1.10.0.data}/data/share/omni-cortex/dashboard/backend/pyproject.toml +0 -0
  16. {omni_cortex-1.8.0.data → omni_cortex-1.10.0.data}/data/share/omni-cortex/dashboard/backend/security.py +0 -0
  17. {omni_cortex-1.8.0.data → omni_cortex-1.10.0.data}/data/share/omni-cortex/dashboard/backend/uv.lock +0 -0
  18. {omni_cortex-1.8.0.data → omni_cortex-1.10.0.data}/data/share/omni-cortex/dashboard/backend/websocket_manager.py +0 -0
  19. {omni_cortex-1.8.0.data → omni_cortex-1.10.0.data}/data/share/omni-cortex/hooks/post_tool_use.py +0 -0
  20. {omni_cortex-1.8.0.data → omni_cortex-1.10.0.data}/data/share/omni-cortex/hooks/pre_tool_use.py +0 -0
  21. {omni_cortex-1.8.0.data → omni_cortex-1.10.0.data}/data/share/omni-cortex/hooks/session_utils.py +0 -0
  22. {omni_cortex-1.8.0.data → omni_cortex-1.10.0.data}/data/share/omni-cortex/hooks/stop.py +0 -0
  23. {omni_cortex-1.8.0.data → omni_cortex-1.10.0.data}/data/share/omni-cortex/hooks/subagent_stop.py +0 -0
  24. {omni_cortex-1.8.0.dist-info → omni_cortex-1.10.0.dist-info}/WHEEL +0 -0
  25. {omni_cortex-1.8.0.dist-info → omni_cortex-1.10.0.dist-info}/entry_points.txt +0 -0
  26. {omni_cortex-1.8.0.dist-info → omni_cortex-1.10.0.dist-info}/licenses/LICENSE +0 -0
@@ -58,6 +58,10 @@ from database import (
58
58
  )
59
59
  from logging_config import log_success, log_error
60
60
  from models import (
61
+ AggregateChatRequest,
62
+ AggregateMemoryRequest,
63
+ AggregateStatsRequest,
64
+ AggregateStatsResponse,
61
65
  ChatRequest,
62
66
  ChatResponse,
63
67
  ConversationSaveRequest,
@@ -348,6 +352,198 @@ async def refresh_projects():
348
352
  return {"count": len(projects)}
349
353
 
350
354
 
355
+ # --- Aggregate Multi-Project Endpoints ---
356
+
357
+
358
+ @app.post("/api/aggregate/memories")
359
+ @rate_limit("50/minute")
360
+ async def get_aggregate_memories(request: AggregateMemoryRequest):
361
+ """Get memories from multiple projects with project attribution."""
362
+ try:
363
+ all_memories = []
364
+ filters = request.filters or FilterParams()
365
+
366
+ for project_path in request.projects:
367
+ if not Path(project_path).exists():
368
+ continue
369
+
370
+ try:
371
+ memories = get_memories(project_path, filters)
372
+ # Add project attribution to each memory
373
+ for m in memories:
374
+ m_dict = m.model_dump()
375
+ m_dict['source_project'] = project_path
376
+ # Extract project name from path
377
+ project_dir = Path(project_path).parent
378
+ m_dict['source_project_name'] = project_dir.name
379
+ all_memories.append(m_dict)
380
+ except Exception as e:
381
+ log_error(f"/api/aggregate/memories (project: {project_path})", e)
382
+ continue
383
+
384
+ # Sort by last_accessed or created_at
385
+ all_memories.sort(
386
+ key=lambda x: x.get('last_accessed') or x.get('created_at') or '',
387
+ reverse=True
388
+ )
389
+
390
+ # Apply pagination
391
+ start = filters.offset
392
+ end = start + filters.limit
393
+ return all_memories[start:end]
394
+ except Exception as e:
395
+ log_error("/api/aggregate/memories", e)
396
+ raise HTTPException(status_code=500, detail=str(e))
397
+
398
+
399
+ @app.post("/api/aggregate/stats", response_model=AggregateStatsResponse)
400
+ @rate_limit("50/minute")
401
+ async def get_aggregate_stats(request: AggregateStatsRequest):
402
+ """Get combined statistics across multiple projects."""
403
+ try:
404
+ total_count = 0
405
+ total_access = 0
406
+ importance_sum = 0
407
+ by_type = {}
408
+ by_status = {}
409
+
410
+ for project_path in request.projects:
411
+ if not Path(project_path).exists():
412
+ continue
413
+
414
+ try:
415
+ stats = get_memory_stats(project_path)
416
+ total_count += stats.get('total_count', 0)
417
+ total_access += stats.get('total_access_count', 0)
418
+
419
+ # Weighted average for importance
420
+ project_count = stats.get('total_count', 0)
421
+ project_avg_importance = stats.get('avg_importance', 0)
422
+ importance_sum += project_avg_importance * project_count
423
+
424
+ # Aggregate by_type
425
+ for type_name, count in stats.get('by_type', {}).items():
426
+ by_type[type_name] = by_type.get(type_name, 0) + count
427
+
428
+ # Aggregate by_status
429
+ for status, count in stats.get('by_status', {}).items():
430
+ by_status[status] = by_status.get(status, 0) + count
431
+ except Exception as e:
432
+ log_error(f"/api/aggregate/stats (project: {project_path})", e)
433
+ continue
434
+
435
+ return AggregateStatsResponse(
436
+ total_count=total_count,
437
+ total_access_count=total_access,
438
+ avg_importance=round(importance_sum / total_count, 1) if total_count > 0 else 0,
439
+ by_type=by_type,
440
+ by_status=by_status,
441
+ project_count=len(request.projects),
442
+ )
443
+ except Exception as e:
444
+ log_error("/api/aggregate/stats", e)
445
+ raise HTTPException(status_code=500, detail=str(e))
446
+
447
+
448
+ @app.post("/api/aggregate/tags")
449
+ @rate_limit("50/minute")
450
+ async def get_aggregate_tags(request: AggregateStatsRequest):
451
+ """Get combined tags across multiple projects."""
452
+ try:
453
+ tag_counts = {}
454
+
455
+ for project_path in request.projects:
456
+ if not Path(project_path).exists():
457
+ continue
458
+
459
+ try:
460
+ tags = get_all_tags(project_path)
461
+ for tag in tags:
462
+ tag_name = tag['name']
463
+ tag_counts[tag_name] = tag_counts.get(tag_name, 0) + tag['count']
464
+ except Exception as e:
465
+ log_error(f"/api/aggregate/tags (project: {project_path})", e)
466
+ continue
467
+
468
+ # Return sorted by count
469
+ return sorted(
470
+ [{'name': k, 'count': v} for k, v in tag_counts.items()],
471
+ key=lambda x: x['count'],
472
+ reverse=True
473
+ )
474
+ except Exception as e:
475
+ log_error("/api/aggregate/tags", e)
476
+ raise HTTPException(status_code=500, detail=str(e))
477
+
478
+
479
+ @app.post("/api/aggregate/chat", response_model=ChatResponse)
480
+ @rate_limit("10/minute")
481
+ async def chat_across_projects(request: AggregateChatRequest):
482
+ """Ask AI about memories across multiple projects."""
483
+ try:
484
+ if not chat_service.is_available():
485
+ raise HTTPException(
486
+ status_code=503,
487
+ detail="Chat service not available. Set GEMINI_API_KEY environment variable."
488
+ )
489
+
490
+ all_sources = []
491
+
492
+ # Gather relevant memories from each project
493
+ for project_path in request.projects:
494
+ if not Path(project_path).exists():
495
+ continue
496
+
497
+ try:
498
+ memories = search_memories(
499
+ project_path,
500
+ request.question,
501
+ limit=request.max_memories_per_project
502
+ )
503
+
504
+ for m in memories:
505
+ project_dir = Path(project_path).parent
506
+ source = {
507
+ 'id': m.id,
508
+ 'type': m.memory_type,
509
+ 'content_preview': m.content[:200],
510
+ 'tags': m.tags,
511
+ 'project_path': project_path,
512
+ 'project_name': project_dir.name,
513
+ }
514
+ all_sources.append(source)
515
+ except Exception as e:
516
+ log_error(f"/api/aggregate/chat (project: {project_path})", e)
517
+ continue
518
+
519
+ if not all_sources:
520
+ return ChatResponse(
521
+ answer="No relevant memories found across the selected projects.",
522
+ sources=[],
523
+ )
524
+
525
+ # Build context with project attribution
526
+ context = "\n\n".join([
527
+ f"[From: {s['project_name']}] {s['content_preview']}"
528
+ for s in all_sources
529
+ ])
530
+
531
+ # Query AI with attributed context
532
+ answer = await chat_service.generate_response(request.question, context)
533
+
534
+ log_success("/api/aggregate/chat", projects=len(request.projects), sources=len(all_sources))
535
+
536
+ return ChatResponse(
537
+ answer=answer,
538
+ sources=[ChatSource(**s) for s in all_sources],
539
+ )
540
+ except HTTPException:
541
+ raise
542
+ except Exception as e:
543
+ log_error("/api/aggregate/chat", e)
544
+ raise HTTPException(status_code=500, detail=str(e))
545
+
546
+
351
547
  @app.get("/api/memories")
352
548
  @rate_limit("100/minute")
353
549
  async def list_memories(
@@ -70,6 +70,53 @@ class MemoryStats(BaseModel):
70
70
  tags: list[dict[str, int | str]]
71
71
 
72
72
 
73
+ class FilterParams(BaseModel):
74
+ """Query filter parameters."""
75
+
76
+ memory_type: Optional[str] = None
77
+ status: Optional[str] = None
78
+ tags: Optional[list[str]] = None
79
+ search: Optional[str] = None
80
+ min_importance: Optional[int] = None
81
+ max_importance: Optional[int] = None
82
+ sort_by: str = "last_accessed"
83
+ sort_order: str = "desc"
84
+ limit: int = 50
85
+ offset: int = 0
86
+
87
+
88
+ class AggregateMemoryRequest(BaseModel):
89
+ """Request for aggregate memory data across projects."""
90
+
91
+ projects: list[str] = Field(..., description="List of project db paths")
92
+ filters: Optional[FilterParams] = None
93
+
94
+
95
+ class AggregateStatsRequest(BaseModel):
96
+ """Request for aggregate statistics."""
97
+
98
+ projects: list[str] = Field(..., description="List of project db paths")
99
+
100
+
101
+ class AggregateStatsResponse(BaseModel):
102
+ """Aggregate statistics across multiple projects."""
103
+
104
+ total_count: int
105
+ total_access_count: int
106
+ avg_importance: float
107
+ by_type: dict[str, int]
108
+ by_status: dict[str, int]
109
+ project_count: int
110
+
111
+
112
+ class AggregateChatRequest(BaseModel):
113
+ """Request for chat across multiple projects."""
114
+
115
+ projects: list[str] = Field(..., description="List of project db paths")
116
+ question: str = Field(..., min_length=1, max_length=2000)
117
+ max_memories_per_project: int = Field(default=5, ge=1, le=20)
118
+
119
+
73
120
  class Activity(BaseModel):
74
121
  """Activity log record."""
75
122
 
@@ -113,21 +160,6 @@ class TimelineEntry(BaseModel):
113
160
  data: dict
114
161
 
115
162
 
116
- class FilterParams(BaseModel):
117
- """Query filter parameters."""
118
-
119
- memory_type: Optional[str] = None
120
- status: Optional[str] = None
121
- tags: Optional[list[str]] = None
122
- search: Optional[str] = None
123
- min_importance: Optional[int] = None
124
- max_importance: Optional[int] = None
125
- sort_by: str = "last_accessed"
126
- sort_order: str = "desc"
127
- limit: int = 50
128
- offset: int = 0
129
-
130
-
131
163
  class MemoryCreateRequest(BaseModel):
132
164
  """Create request for a new memory."""
133
165
 
@@ -173,6 +205,8 @@ class ChatSource(BaseModel):
173
205
  type: str
174
206
  content_preview: str
175
207
  tags: list[str]
208
+ project_path: Optional[str] = None
209
+ project_name: Optional[str] = None
176
210
 
177
211
 
178
212
  class ChatResponse(BaseModel):
@@ -1,6 +1,6 @@
1
1
  Metadata-Version: 2.4
2
2
  Name: omni-cortex
3
- Version: 1.8.0
3
+ Version: 1.10.0
4
4
  Summary: Give Claude Code a perfect memory - auto-logs everything, searches smartly, and gets smarter over time
5
5
  Project-URL: Homepage, https://github.com/AllCytes/Omni-Cortex
6
6
  Project-URL: Repository, https://github.com/AllCytes/Omni-Cortex
@@ -0,0 +1,25 @@
1
+ omni_cortex-1.10.0.data/data/share/omni-cortex/hooks/post_tool_use.py,sha256=yBLoYvEdUunbG8fclzIEWszCptworkUUcOUSKzNsvms,12271
2
+ omni_cortex-1.10.0.data/data/share/omni-cortex/hooks/pre_tool_use.py,sha256=mkZ7eeBnjWkIgNnrqfYSXIhhLNYYk4hQx_6F0pNrGoc,6395
3
+ omni_cortex-1.10.0.data/data/share/omni-cortex/hooks/session_utils.py,sha256=3SKPCytqWuRPOupWdzmwBoKBDJqtLcT1Nle_pueDQUY,5746
4
+ omni_cortex-1.10.0.data/data/share/omni-cortex/hooks/stop.py,sha256=T1bwcmbTLj0gzjrVvFBT1zB6wff4J2YkYBAY-ZxZI5g,5336
5
+ omni_cortex-1.10.0.data/data/share/omni-cortex/hooks/subagent_stop.py,sha256=V9HQSFGNOfkg8ZCstPEy4h5V8BP4AbrVr8teFzN1kNk,3314
6
+ omni_cortex-1.10.0.data/data/share/omni-cortex/dashboard/backend/.env.example,sha256=9xS7-UiWlMddRwzlyyyKNHAMlNTsgH-2sPV266guJpQ,372
7
+ omni_cortex-1.10.0.data/data/share/omni-cortex/dashboard/backend/backfill_summaries.py,sha256=ElchfcBv4pmVr2PsePCgFlCyuvf4_jDJj_C3AmMhu7U,8973
8
+ omni_cortex-1.10.0.data/data/share/omni-cortex/dashboard/backend/chat_service.py,sha256=5UCvLayZGeSdGsYAzOeupumclAhoFLusGYLdyl33ANc,9304
9
+ omni_cortex-1.10.0.data/data/share/omni-cortex/dashboard/backend/database.py,sha256=LAN7GSM2tvMcJaL0RrGJurH9-tw3cs2QtPduqCbLvj0,34974
10
+ omni_cortex-1.10.0.data/data/share/omni-cortex/dashboard/backend/image_service.py,sha256=NP6ojFpHb6iNTYRkXqYu1CL6WvooZpZ54mjLiWSWG_g,19205
11
+ omni_cortex-1.10.0.data/data/share/omni-cortex/dashboard/backend/logging_config.py,sha256=WnunFGET9zlsn9WBpVsio2zI7BiUQanE0xzAQQxIhII,3944
12
+ omni_cortex-1.10.0.data/data/share/omni-cortex/dashboard/backend/main.py,sha256=te93eB3-CBYyuEVDNXZIuAdN3KPDS2D3ijBcd6h9b04,46228
13
+ omni_cortex-1.10.0.data/data/share/omni-cortex/dashboard/backend/models.py,sha256=LkmcYq1imsyDlMYnX3Z_FOTmPsu37MQEfJSI-w5EjvM,7330
14
+ omni_cortex-1.10.0.data/data/share/omni-cortex/dashboard/backend/project_config.py,sha256=ZxGoeRpHvN5qQyf2hRxrAZiHrPSwdQp59f0di6O1LKM,4352
15
+ omni_cortex-1.10.0.data/data/share/omni-cortex/dashboard/backend/project_scanner.py,sha256=lwFXS8iJbOoxf7FAyo2TjH25neaMHiJ8B3jS57XxtDI,5713
16
+ omni_cortex-1.10.0.data/data/share/omni-cortex/dashboard/backend/prompt_security.py,sha256=LcdZhYy1CfpSq_4BPO6lMJ15phc2ZXLUSBAnAvODVCI,3423
17
+ omni_cortex-1.10.0.data/data/share/omni-cortex/dashboard/backend/pyproject.toml,sha256=9pbbGQXLe1Xd06nZAtDySCHIlfMWvPaB-C6tGZR6umc,502
18
+ omni_cortex-1.10.0.data/data/share/omni-cortex/dashboard/backend/security.py,sha256=nQsoPE0n5dtY9ive00d33W1gL48GgK7C5Ae0BK2oW2k,3479
19
+ omni_cortex-1.10.0.data/data/share/omni-cortex/dashboard/backend/uv.lock,sha256=miB9zGGSirBkjDE-OZTPCnv43Yc98xuAz_Ne8vTNFHg,186004
20
+ omni_cortex-1.10.0.data/data/share/omni-cortex/dashboard/backend/websocket_manager.py,sha256=ABXAtlhBI5vnTcwdQUS-UQcDyTn-rWZL5OKEP9YY-kU,3619
21
+ omni_cortex-1.10.0.dist-info/METADATA,sha256=LFZ8yYIQQf71mCtJ-MW76Wi81y4tGwsMLAR1qpL97mw,15712
22
+ omni_cortex-1.10.0.dist-info/WHEEL,sha256=WLgqFyCfm_KASv4WHyYy0P3pM_m7J5L9k2skdKLirC8,87
23
+ omni_cortex-1.10.0.dist-info/entry_points.txt,sha256=rohx4mFH2ffZmMb9QXPZmFf-ZGjA3jpKVDVeET-ttiM,150
24
+ omni_cortex-1.10.0.dist-info/licenses/LICENSE,sha256=oG_397owMmi-Umxp5sYocJ6RPohp9_bDNnnEu9OUphg,1072
25
+ omni_cortex-1.10.0.dist-info/RECORD,,
@@ -1,25 +0,0 @@
1
- omni_cortex-1.8.0.data/data/share/omni-cortex/hooks/post_tool_use.py,sha256=yBLoYvEdUunbG8fclzIEWszCptworkUUcOUSKzNsvms,12271
2
- omni_cortex-1.8.0.data/data/share/omni-cortex/hooks/pre_tool_use.py,sha256=mkZ7eeBnjWkIgNnrqfYSXIhhLNYYk4hQx_6F0pNrGoc,6395
3
- omni_cortex-1.8.0.data/data/share/omni-cortex/hooks/session_utils.py,sha256=3SKPCytqWuRPOupWdzmwBoKBDJqtLcT1Nle_pueDQUY,5746
4
- omni_cortex-1.8.0.data/data/share/omni-cortex/hooks/stop.py,sha256=T1bwcmbTLj0gzjrVvFBT1zB6wff4J2YkYBAY-ZxZI5g,5336
5
- omni_cortex-1.8.0.data/data/share/omni-cortex/hooks/subagent_stop.py,sha256=V9HQSFGNOfkg8ZCstPEy4h5V8BP4AbrVr8teFzN1kNk,3314
6
- omni_cortex-1.8.0.data/data/share/omni-cortex/dashboard/backend/.env.example,sha256=9xS7-UiWlMddRwzlyyyKNHAMlNTsgH-2sPV266guJpQ,372
7
- omni_cortex-1.8.0.data/data/share/omni-cortex/dashboard/backend/backfill_summaries.py,sha256=ElchfcBv4pmVr2PsePCgFlCyuvf4_jDJj_C3AmMhu7U,8973
8
- omni_cortex-1.8.0.data/data/share/omni-cortex/dashboard/backend/chat_service.py,sha256=5UCvLayZGeSdGsYAzOeupumclAhoFLusGYLdyl33ANc,9304
9
- omni_cortex-1.8.0.data/data/share/omni-cortex/dashboard/backend/database.py,sha256=LAN7GSM2tvMcJaL0RrGJurH9-tw3cs2QtPduqCbLvj0,34974
10
- omni_cortex-1.8.0.data/data/share/omni-cortex/dashboard/backend/image_service.py,sha256=NP6ojFpHb6iNTYRkXqYu1CL6WvooZpZ54mjLiWSWG_g,19205
11
- omni_cortex-1.8.0.data/data/share/omni-cortex/dashboard/backend/logging_config.py,sha256=WnunFGET9zlsn9WBpVsio2zI7BiUQanE0xzAQQxIhII,3944
12
- omni_cortex-1.8.0.data/data/share/omni-cortex/dashboard/backend/main.py,sha256=I0qNCQWOssdjlvBYDQuFpThMLWmTTl8Dk5DBoUeWpl0,39240
13
- omni_cortex-1.8.0.data/data/share/omni-cortex/dashboard/backend/models.py,sha256=W9NQki5fcbW_1fFkKq4PKbpyP650w1IRBf-wI6AZ8Iw,6306
14
- omni_cortex-1.8.0.data/data/share/omni-cortex/dashboard/backend/project_config.py,sha256=ZxGoeRpHvN5qQyf2hRxrAZiHrPSwdQp59f0di6O1LKM,4352
15
- omni_cortex-1.8.0.data/data/share/omni-cortex/dashboard/backend/project_scanner.py,sha256=lwFXS8iJbOoxf7FAyo2TjH25neaMHiJ8B3jS57XxtDI,5713
16
- omni_cortex-1.8.0.data/data/share/omni-cortex/dashboard/backend/prompt_security.py,sha256=LcdZhYy1CfpSq_4BPO6lMJ15phc2ZXLUSBAnAvODVCI,3423
17
- omni_cortex-1.8.0.data/data/share/omni-cortex/dashboard/backend/pyproject.toml,sha256=9pbbGQXLe1Xd06nZAtDySCHIlfMWvPaB-C6tGZR6umc,502
18
- omni_cortex-1.8.0.data/data/share/omni-cortex/dashboard/backend/security.py,sha256=nQsoPE0n5dtY9ive00d33W1gL48GgK7C5Ae0BK2oW2k,3479
19
- omni_cortex-1.8.0.data/data/share/omni-cortex/dashboard/backend/uv.lock,sha256=miB9zGGSirBkjDE-OZTPCnv43Yc98xuAz_Ne8vTNFHg,186004
20
- omni_cortex-1.8.0.data/data/share/omni-cortex/dashboard/backend/websocket_manager.py,sha256=ABXAtlhBI5vnTcwdQUS-UQcDyTn-rWZL5OKEP9YY-kU,3619
21
- omni_cortex-1.8.0.dist-info/METADATA,sha256=46lCMHifPAfU3ilvpKC9hygJMy4StmB2IBdNrR0x2g8,15711
22
- omni_cortex-1.8.0.dist-info/WHEEL,sha256=WLgqFyCfm_KASv4WHyYy0P3pM_m7J5L9k2skdKLirC8,87
23
- omni_cortex-1.8.0.dist-info/entry_points.txt,sha256=rohx4mFH2ffZmMb9QXPZmFf-ZGjA3jpKVDVeET-ttiM,150
24
- omni_cortex-1.8.0.dist-info/licenses/LICENSE,sha256=oG_397owMmi-Umxp5sYocJ6RPohp9_bDNnnEu9OUphg,1072
25
- omni_cortex-1.8.0.dist-info/RECORD,,