loop-agent-cli 0.1.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.
- app/__init__.py +0 -0
- app/agents/__init__.py +0 -0
- app/agents/graph.py +40 -0
- app/agents/nodes.py +245 -0
- app/agents/state.py +19 -0
- app/api/__init__.py +0 -0
- app/api/candidates.py +49 -0
- app/api/dashboard.py +7 -0
- app/api/outreach.py +7 -0
- app/api/pipelines.py +58 -0
- app/api/positions.py +76 -0
- app/api/router.py +14 -0
- app/api/scheduler.py +7 -0
- app/api/skills.py +7 -0
- app/api/system.py +7 -0
- app/core/__init__.py +0 -0
- app/core/config.py +18 -0
- app/core/exception_handler.py +91 -0
- app/core/exceptions.py +33 -0
- app/core/logging.py +19 -0
- app/database/__init__.py +0 -0
- app/database/base.py +4 -0
- app/database/session.py +20 -0
- app/main.py +72 -0
- app/models/__init__.py +0 -0
- app/models/agent_run.py +18 -0
- app/models/candidate.py +28 -0
- app/models/node_log.py +18 -0
- app/models/outreach_log.py +16 -0
- app/models/pipeline.py +21 -0
- app/models/position.py +22 -0
- app/models/scheduler_job.py +16 -0
- app/models/skill.py +13 -0
- app/models/system_config.py +12 -0
- app/repositories/__init__.py +0 -0
- app/repositories/agent_run.py +74 -0
- app/repositories/candidate.py +84 -0
- app/repositories/node_log.py +57 -0
- app/repositories/outreach_log.py +60 -0
- app/repositories/pipeline.py +80 -0
- app/repositories/position.py +67 -0
- app/repositories/scheduler_job.py +74 -0
- app/schemas/__init__.py +0 -0
- app/schemas/agent_run.py +32 -0
- app/schemas/candidate.py +58 -0
- app/schemas/node_log.py +31 -0
- app/schemas/outreach_log.py +28 -0
- app/schemas/pipeline.py +34 -0
- app/schemas/position.py +49 -0
- app/schemas/scheduler_job.py +29 -0
- app/services/__init__.py +0 -0
- app/services/candidate.py +58 -0
- app/services/dashboard.py +230 -0
- app/services/email.py +116 -0
- app/services/health.py +105 -0
- app/services/pipeline.py +75 -0
- app/services/position.py +36 -0
- app/services/runner.py +292 -0
- app/services/scheduler.py +174 -0
- app/services/score.py +155 -0
- app/services/search.py +92 -0
- app/skills/base.py +30 -0
- app/skills/github.py +106 -0
- app/skills/registry.py +51 -0
- app/tests/__init__.py +3 -0
- app/tests/conftest.py +96 -0
- app/tests/generate_report.py +144 -0
- app/tests/test_candidates.py +158 -0
- app/tests/test_dashboard.py +27 -0
- app/tests/test_outreach.py +15 -0
- app/tests/test_pipelines.py +249 -0
- app/tests/test_positions.py +183 -0
- app/tests/test_scheduler.py +15 -0
- app/tests/test_skills.py +15 -0
- app/tests/test_system.py +35 -0
- app/utils/__init__.py +0 -0
- loop_agent_cli/__init__.py +5 -0
- loop_agent_cli/cli.py +728 -0
- loop_agent_cli/container.py +191 -0
- loop_agent_cli-0.1.0.dist-info/METADATA +202 -0
- loop_agent_cli-0.1.0.dist-info/RECORD +84 -0
- loop_agent_cli-0.1.0.dist-info/WHEEL +5 -0
- loop_agent_cli-0.1.0.dist-info/entry_points.txt +2 -0
- loop_agent_cli-0.1.0.dist-info/top_level.txt +2 -0
|
@@ -0,0 +1,191 @@
|
|
|
1
|
+
"""
|
|
2
|
+
DI Container — builds and owns all Repository / Service instances.
|
|
3
|
+
|
|
4
|
+
Usage::
|
|
5
|
+
|
|
6
|
+
async with Container(db_url) as c:
|
|
7
|
+
positions = await c.position_repo.get_all()
|
|
8
|
+
"""
|
|
9
|
+
|
|
10
|
+
from __future__ import annotations
|
|
11
|
+
|
|
12
|
+
import sys
|
|
13
|
+
import os
|
|
14
|
+
from pathlib import Path
|
|
15
|
+
from typing import Optional, Any
|
|
16
|
+
|
|
17
|
+
# ---------------------------------------------------------------------------
|
|
18
|
+
# Ensure the project root (parent of *this* package's parent) is on sys.path
|
|
19
|
+
# so that ``import app.…`` works even when the CLI is installed via pip
|
|
20
|
+
# without the project root being the cwd.
|
|
21
|
+
# ---------------------------------------------------------------------------
|
|
22
|
+
_PROJECT_ROOT = str(Path(__file__).resolve().parent.parent)
|
|
23
|
+
if _PROJECT_ROOT not in sys.path:
|
|
24
|
+
sys.path.insert(0, _PROJECT_ROOT)
|
|
25
|
+
|
|
26
|
+
from sqlalchemy.ext.asyncio import create_async_engine, AsyncSession # noqa: E402
|
|
27
|
+
from sqlalchemy.orm import sessionmaker # noqa: E402
|
|
28
|
+
|
|
29
|
+
from app.core.config import settings # noqa: E402
|
|
30
|
+
from app.database.base import Base # noqa: E402
|
|
31
|
+
|
|
32
|
+
# Repositories # noqa: E402
|
|
33
|
+
from app.repositories.position import PositionRepository # noqa: E402
|
|
34
|
+
from app.repositories.candidate import CandidateRepository # noqa: E402
|
|
35
|
+
from app.repositories.pipeline import PipelineRepository # noqa: E402
|
|
36
|
+
from app.repositories.outreach_log import OutreachLogRepository # noqa: E402
|
|
37
|
+
from app.repositories.agent_run import AgentRunRepository # noqa: E402
|
|
38
|
+
from app.repositories.node_log import NodeLogRepository # noqa: E402
|
|
39
|
+
from app.repositories.scheduler_job import SchedulerJobRepository # noqa: E402
|
|
40
|
+
|
|
41
|
+
# Services # noqa: E402
|
|
42
|
+
from app.services.candidate import CandidateService # noqa: E402
|
|
43
|
+
from app.services.search import SearchService # noqa: E402
|
|
44
|
+
from app.services.score import ScoreService # noqa: E402
|
|
45
|
+
from app.services.pipeline import PipelineService # noqa: E402
|
|
46
|
+
from app.services.email import EmailService # noqa: E402
|
|
47
|
+
from app.services.position import PositionService # noqa: E402
|
|
48
|
+
from app.services.dashboard import DashboardService # noqa: E402
|
|
49
|
+
from app.services.runner import RunnerService # noqa: E402
|
|
50
|
+
from app.services.scheduler import SchedulerService # noqa: E402
|
|
51
|
+
|
|
52
|
+
|
|
53
|
+
class Container:
|
|
54
|
+
"""Async context-manager that provides repositories and services."""
|
|
55
|
+
|
|
56
|
+
def __init__(self, db_url: Optional[str] = None) -> None:
|
|
57
|
+
self._db_url: str = db_url or settings.database_url
|
|
58
|
+
self._engine: Any = None
|
|
59
|
+
self._session_factory: Any = None
|
|
60
|
+
self._db: Optional[AsyncSession] = None
|
|
61
|
+
|
|
62
|
+
# ------------------------------------------------------------------
|
|
63
|
+
# Lifecycle
|
|
64
|
+
# ------------------------------------------------------------------
|
|
65
|
+
|
|
66
|
+
async def __aenter__(self) -> "Container":
|
|
67
|
+
self._engine = create_async_engine(
|
|
68
|
+
self._db_url,
|
|
69
|
+
echo=False,
|
|
70
|
+
pool_pre_ping=True,
|
|
71
|
+
pool_recycle=300,
|
|
72
|
+
)
|
|
73
|
+
self._session_factory = sessionmaker(
|
|
74
|
+
self._engine, class_=AsyncSession, expire_on_commit=False,
|
|
75
|
+
)
|
|
76
|
+
# Ensure tables exist
|
|
77
|
+
async with self._engine.begin() as conn:
|
|
78
|
+
await conn.run_sync(Base.metadata.create_all)
|
|
79
|
+
self._db = self._session_factory()
|
|
80
|
+
return self
|
|
81
|
+
|
|
82
|
+
async def __aexit__(
|
|
83
|
+
self,
|
|
84
|
+
exc_type: Optional[type],
|
|
85
|
+
exc_val: Optional[BaseException],
|
|
86
|
+
exc_tb: Any,
|
|
87
|
+
) -> None:
|
|
88
|
+
if self._db is not None:
|
|
89
|
+
await self._db.close()
|
|
90
|
+
if self._engine is not None:
|
|
91
|
+
await self._engine.dispose()
|
|
92
|
+
|
|
93
|
+
# ------------------------------------------------------------------
|
|
94
|
+
# Repositories (7)
|
|
95
|
+
# ------------------------------------------------------------------
|
|
96
|
+
|
|
97
|
+
@property
|
|
98
|
+
def position_repo(self) -> PositionRepository:
|
|
99
|
+
assert self._db is not None
|
|
100
|
+
return PositionRepository(self._db)
|
|
101
|
+
|
|
102
|
+
@property
|
|
103
|
+
def candidate_repo(self) -> CandidateRepository:
|
|
104
|
+
assert self._db is not None
|
|
105
|
+
return CandidateRepository(self._db)
|
|
106
|
+
|
|
107
|
+
@property
|
|
108
|
+
def pipeline_repo(self) -> PipelineRepository:
|
|
109
|
+
assert self._db is not None
|
|
110
|
+
return PipelineRepository(self._db)
|
|
111
|
+
|
|
112
|
+
@property
|
|
113
|
+
def outreach_log_repo(self) -> OutreachLogRepository:
|
|
114
|
+
assert self._db is not None
|
|
115
|
+
return OutreachLogRepository(self._db)
|
|
116
|
+
|
|
117
|
+
@property
|
|
118
|
+
def agent_run_repo(self) -> AgentRunRepository:
|
|
119
|
+
assert self._db is not None
|
|
120
|
+
return AgentRunRepository(self._db)
|
|
121
|
+
|
|
122
|
+
@property
|
|
123
|
+
def node_log_repo(self) -> NodeLogRepository:
|
|
124
|
+
assert self._db is not None
|
|
125
|
+
return NodeLogRepository(self._db)
|
|
126
|
+
|
|
127
|
+
@property
|
|
128
|
+
def scheduler_job_repo(self) -> SchedulerJobRepository:
|
|
129
|
+
assert self._db is not None
|
|
130
|
+
return SchedulerJobRepository(self._db)
|
|
131
|
+
|
|
132
|
+
# ------------------------------------------------------------------
|
|
133
|
+
# Services (7 + 2 composite)
|
|
134
|
+
# ------------------------------------------------------------------
|
|
135
|
+
|
|
136
|
+
@property
|
|
137
|
+
def candidate_service(self) -> CandidateService:
|
|
138
|
+
return CandidateService(self.candidate_repo)
|
|
139
|
+
|
|
140
|
+
@property
|
|
141
|
+
def search_service(self) -> SearchService:
|
|
142
|
+
return SearchService(self.candidate_service)
|
|
143
|
+
|
|
144
|
+
@property
|
|
145
|
+
def score_service(self) -> ScoreService:
|
|
146
|
+
return ScoreService()
|
|
147
|
+
|
|
148
|
+
@property
|
|
149
|
+
def pipeline_service(self) -> PipelineService:
|
|
150
|
+
return PipelineService(self.pipeline_repo)
|
|
151
|
+
|
|
152
|
+
@property
|
|
153
|
+
def email_service(self) -> EmailService:
|
|
154
|
+
return EmailService(self.outreach_log_repo)
|
|
155
|
+
|
|
156
|
+
@property
|
|
157
|
+
def position_service(self) -> PositionService:
|
|
158
|
+
return PositionService(self.position_repo)
|
|
159
|
+
|
|
160
|
+
@property
|
|
161
|
+
def dashboard_service(self) -> DashboardService:
|
|
162
|
+
return DashboardService(
|
|
163
|
+
position_repo=self.position_repo,
|
|
164
|
+
agent_run_repo=self.agent_run_repo,
|
|
165
|
+
pipeline_repo=self.pipeline_repo,
|
|
166
|
+
candidate_repo=self.candidate_repo,
|
|
167
|
+
node_log_repo=self.node_log_repo,
|
|
168
|
+
)
|
|
169
|
+
|
|
170
|
+
@property
|
|
171
|
+
def runner(self) -> RunnerService:
|
|
172
|
+
return RunnerService(
|
|
173
|
+
search_service=self.search_service,
|
|
174
|
+
score_service=self.score_service,
|
|
175
|
+
pipeline_service=self.pipeline_service,
|
|
176
|
+
email_service=self.email_service,
|
|
177
|
+
candidate_repo=self.candidate_repo,
|
|
178
|
+
position_repo=self.position_repo,
|
|
179
|
+
pipeline_repo=self.pipeline_repo,
|
|
180
|
+
outreach_log_repo=self.outreach_log_repo,
|
|
181
|
+
agent_run_repo=self.agent_run_repo,
|
|
182
|
+
node_log_repo=self.node_log_repo,
|
|
183
|
+
)
|
|
184
|
+
|
|
185
|
+
@property
|
|
186
|
+
def scheduler(self) -> SchedulerService:
|
|
187
|
+
return SchedulerService(
|
|
188
|
+
position_repo=self.position_repo,
|
|
189
|
+
job_repo=self.scheduler_job_repo,
|
|
190
|
+
runner_service=self.runner,
|
|
191
|
+
)
|
|
@@ -0,0 +1,202 @@
|
|
|
1
|
+
Metadata-Version: 2.4
|
|
2
|
+
Name: loop-agent-cli
|
|
3
|
+
Version: 0.1.0
|
|
4
|
+
Summary: Typer + Rich CLI for recruit-loop-agent — run recruiting loops from the terminal
|
|
5
|
+
Author-email: Chandler Song <275737875@qq.com>
|
|
6
|
+
License: MIT
|
|
7
|
+
Project-URL: Homepage, https://github.com/Chandler-Song/recruit-loop-agent
|
|
8
|
+
Project-URL: Repository, https://github.com/Chandler-Song/recruit-loop-agent
|
|
9
|
+
Project-URL: Issues, https://github.com/Chandler-Song/recruit-loop-agent/issues
|
|
10
|
+
Keywords: recruiting,agent,cli,typer,langgraph
|
|
11
|
+
Classifier: Development Status :: 3 - Alpha
|
|
12
|
+
Classifier: Intended Audience :: Developers
|
|
13
|
+
Classifier: License :: OSI Approved :: MIT License
|
|
14
|
+
Classifier: Programming Language :: Python :: 3
|
|
15
|
+
Classifier: Programming Language :: Python :: 3.9
|
|
16
|
+
Classifier: Programming Language :: Python :: 3.10
|
|
17
|
+
Classifier: Programming Language :: Python :: 3.11
|
|
18
|
+
Classifier: Programming Language :: Python :: 3.12
|
|
19
|
+
Classifier: Programming Language :: Python :: 3.13
|
|
20
|
+
Classifier: Topic :: Software Development :: Libraries :: Application Frameworks
|
|
21
|
+
Requires-Python: >=3.9
|
|
22
|
+
Description-Content-Type: text/markdown
|
|
23
|
+
Requires-Dist: typer>=0.9.0
|
|
24
|
+
Requires-Dist: rich>=13.0.0
|
|
25
|
+
Requires-Dist: fastapi>=0.104.0
|
|
26
|
+
Requires-Dist: sqlalchemy[asyncio]>=2.0.23
|
|
27
|
+
Requires-Dist: aiosqlite>=0.19.0
|
|
28
|
+
Requires-Dist: pydantic>=2.5.0
|
|
29
|
+
Requires-Dist: pydantic-settings>=2.1.0
|
|
30
|
+
Requires-Dist: httpx>=0.25.0
|
|
31
|
+
Requires-Dist: langgraph>=0.0.40
|
|
32
|
+
Requires-Dist: apscheduler>=3.10.0
|
|
33
|
+
Requires-Dist: python-dotenv>=1.0.0
|
|
34
|
+
Requires-Dist: cryptography>=41.0.0
|
|
35
|
+
|
|
36
|
+
# loop-agent-cli
|
|
37
|
+
|
|
38
|
+
> Typer + Rich CLI for [recruit-loop-agent](https://github.com/Chandler-Song/recruit-loop-agent) — 在终端中完成招聘循环的全部操作,无需启动 FastAPI Web 服务。
|
|
39
|
+
|
|
40
|
+
## 功能特性
|
|
41
|
+
|
|
42
|
+
- **零服务依赖**:不启动 uvicorn,直接在进程内调用核心引擎
|
|
43
|
+
- **完整功能覆盖**:职位管理、候选人查看、管道操作、循环执行、调度控制、仪表盘
|
|
44
|
+
- **终端友好**:Rich 彩色表格/面板,结构化输出
|
|
45
|
+
|
|
46
|
+
## 安装
|
|
47
|
+
|
|
48
|
+
```bash
|
|
49
|
+
# 从 PyPI 安装(正式发布后)
|
|
50
|
+
pip install loop-agent-cli
|
|
51
|
+
|
|
52
|
+
# 开发模式安装(从项目根目录)
|
|
53
|
+
cd recruit-loop-agent
|
|
54
|
+
pip install -e .
|
|
55
|
+
```
|
|
56
|
+
|
|
57
|
+
## 前置条件
|
|
58
|
+
|
|
59
|
+
- Python >= 3.11
|
|
60
|
+
- `.env` 文件需存在于项目根目录(配置 `GITHUB_TOKEN`、`SMTP_*` 等)
|
|
61
|
+
- 项目根目录需包含 `app/` 核心引擎包
|
|
62
|
+
|
|
63
|
+
## 使用示例
|
|
64
|
+
|
|
65
|
+
### 查看帮助
|
|
66
|
+
|
|
67
|
+
```bash
|
|
68
|
+
loop-agent --help
|
|
69
|
+
```
|
|
70
|
+
|
|
71
|
+
### 职位管理
|
|
72
|
+
|
|
73
|
+
```bash
|
|
74
|
+
# 列出所有职位
|
|
75
|
+
loop-agent position list
|
|
76
|
+
|
|
77
|
+
# 创建新职位
|
|
78
|
+
loop-agent position create -t "Senior Backend Engineer" -c "Tech Corp" \
|
|
79
|
+
-s "Python,FastAPI,PostgreSQL" -k "backend,python,remote"
|
|
80
|
+
|
|
81
|
+
# 查看职位详情
|
|
82
|
+
loop-agent position show <position_id>
|
|
83
|
+
|
|
84
|
+
# 关闭职位
|
|
85
|
+
loop-agent position close <position_id>
|
|
86
|
+
```
|
|
87
|
+
|
|
88
|
+
### 执行招聘循环
|
|
89
|
+
|
|
90
|
+
```bash
|
|
91
|
+
# 对已有职位执行一次循环
|
|
92
|
+
loop-agent run position <position_id>
|
|
93
|
+
|
|
94
|
+
# 创建职位并立即执行循环
|
|
95
|
+
loop-agent run create-and-run -t "Python Developer" -c "Startup Inc" \
|
|
96
|
+
-s "Python,Django" -i 30
|
|
97
|
+
```
|
|
98
|
+
|
|
99
|
+
### 候选人管理
|
|
100
|
+
|
|
101
|
+
```bash
|
|
102
|
+
# 列出候选人(默认 20 条)
|
|
103
|
+
loop-agent candidate list -n 10
|
|
104
|
+
|
|
105
|
+
# 查看候选人详情
|
|
106
|
+
loop-agent candidate show <candidate_id>
|
|
107
|
+
```
|
|
108
|
+
|
|
109
|
+
### 管道管理
|
|
110
|
+
|
|
111
|
+
```bash
|
|
112
|
+
# 列出所有管道
|
|
113
|
+
loop-agent pipeline list
|
|
114
|
+
|
|
115
|
+
# 按职位过滤
|
|
116
|
+
loop-agent pipeline list -p <position_id>
|
|
117
|
+
|
|
118
|
+
# 更新管道状态
|
|
119
|
+
loop-agent pipeline update-status <pipeline_id> contacted
|
|
120
|
+
```
|
|
121
|
+
|
|
122
|
+
### 调度管理
|
|
123
|
+
|
|
124
|
+
```bash
|
|
125
|
+
# 启动后台调度器(Ctrl+C 退出)
|
|
126
|
+
loop-agent schedule start
|
|
127
|
+
|
|
128
|
+
# 列出调度任务
|
|
129
|
+
loop-agent schedule list
|
|
130
|
+
```
|
|
131
|
+
|
|
132
|
+
### 仪表盘
|
|
133
|
+
|
|
134
|
+
```bash
|
|
135
|
+
# 查看仪表盘摘要
|
|
136
|
+
loop-agent dashboard
|
|
137
|
+
```
|
|
138
|
+
|
|
139
|
+
### 其他
|
|
140
|
+
|
|
141
|
+
```bash
|
|
142
|
+
# 显示 LangGraph 图结构
|
|
143
|
+
loop-agent graph
|
|
144
|
+
|
|
145
|
+
# 显示版本信息
|
|
146
|
+
loop-agent version
|
|
147
|
+
```
|
|
148
|
+
|
|
149
|
+
### 全局选项
|
|
150
|
+
|
|
151
|
+
```bash
|
|
152
|
+
# 覆盖数据库路径
|
|
153
|
+
loop-agent --db sqlite+aiosqlite:///./custom.db position list
|
|
154
|
+
```
|
|
155
|
+
|
|
156
|
+
## 命令树
|
|
157
|
+
|
|
158
|
+
```
|
|
159
|
+
loop-agent
|
|
160
|
+
├── run 执行招聘循环
|
|
161
|
+
│ ├── position <position_id> 对已有职位执行一次循环
|
|
162
|
+
│ └── create-and-run 创建职位并立即执行循环
|
|
163
|
+
├── position 职位管理
|
|
164
|
+
│ ├── list 列出所有职位
|
|
165
|
+
│ ├── create 创建新职位
|
|
166
|
+
│ ├── show <position_id> 查看职位详情
|
|
167
|
+
│ └── close <position_id> 关闭职位
|
|
168
|
+
├── candidate 候选人管理
|
|
169
|
+
│ ├── list 列出候选人
|
|
170
|
+
│ └── show <candidate_id> 查看候选人详情
|
|
171
|
+
├── pipeline 招聘管道管理
|
|
172
|
+
│ ├── list 列出管道
|
|
173
|
+
│ └── update-status 更新管道状态
|
|
174
|
+
├── schedule 调度管理
|
|
175
|
+
│ ├── start 启动后台调度器
|
|
176
|
+
│ └── list 列出调度任务
|
|
177
|
+
├── dashboard 查看仪表盘摘要
|
|
178
|
+
├── graph 显示 LangGraph 图结构
|
|
179
|
+
└── version 显示版本信息
|
|
180
|
+
```
|
|
181
|
+
|
|
182
|
+
## 开发
|
|
183
|
+
|
|
184
|
+
```bash
|
|
185
|
+
# 克隆项目
|
|
186
|
+
git clone git@github.com:Chandler-Song/recruit-loop-agent.git
|
|
187
|
+
cd recruit-loop-agent
|
|
188
|
+
|
|
189
|
+
# 创建虚拟环境
|
|
190
|
+
python -m venv venv
|
|
191
|
+
source venv/bin/activate
|
|
192
|
+
|
|
193
|
+
# 安装依赖
|
|
194
|
+
pip install -e .
|
|
195
|
+
|
|
196
|
+
# 运行测试
|
|
197
|
+
pytest app/tests/ -v
|
|
198
|
+
```
|
|
199
|
+
|
|
200
|
+
## 许可证
|
|
201
|
+
|
|
202
|
+
MIT License
|
|
@@ -0,0 +1,84 @@
|
|
|
1
|
+
app/__init__.py,sha256=47DEQpj8HBSa-_TImW-5JCeuQeRkm5NMpJWZG3hSuFU,0
|
|
2
|
+
app/main.py,sha256=CdxBr0zFatyfFwOEGbTb1qTIXVlRfLg6uugMFb99q14,2380
|
|
3
|
+
app/agents/__init__.py,sha256=47DEQpj8HBSa-_TImW-5JCeuQeRkm5NMpJWZG3hSuFU,0
|
|
4
|
+
app/agents/graph.py,sha256=ZtAct2zCGWCwtxT0XUj6SyjCDWCbxVO9u6lnWxOKfnM,1425
|
|
5
|
+
app/agents/nodes.py,sha256=TXFkuhc2VAhGxlV6DNcigFwdgv1yStVWOfldvnHr9EI,8180
|
|
6
|
+
app/agents/state.py,sha256=VeqYvikCyichr0wP1FqfuLtaWMgvYh55gKJ4lTDYse0,515
|
|
7
|
+
app/api/__init__.py,sha256=47DEQpj8HBSa-_TImW-5JCeuQeRkm5NMpJWZG3hSuFU,0
|
|
8
|
+
app/api/candidates.py,sha256=-JZClE2oOq78sA47-JjmNm5b-NKG4xPmxbXB5i4Jjw4,2228
|
|
9
|
+
app/api/dashboard.py,sha256=LEY5AVDBrKoJGGB9VK3n02qONpiX4NWfWSJKhejpZ8Q,246
|
|
10
|
+
app/api/outreach.py,sha256=K68ubU2T3gAmRHuCtcH9Cba8oFboLW4r703IFB_NEbQ,118
|
|
11
|
+
app/api/pipelines.py,sha256=tYe2I6cg4m7WvDVi6oqTGr5Cs78edNK0C3SKcA-cAoc,2571
|
|
12
|
+
app/api/positions.py,sha256=EilTUSGxcYsgSqhtc2T4a001-ftc-098C421I9DbcaE,3348
|
|
13
|
+
app/api/router.py,sha256=k8-I98aBPOk6kzVrSQ1aPpYb1ES7Es_CrQWad9byx_4,809
|
|
14
|
+
app/api/scheduler.py,sha256=SGzGQMX1NH4bYW2-cnlUaSur9JpRNJcFxEbjUPYLsyo,119
|
|
15
|
+
app/api/skills.py,sha256=U1CRBsXF7oVscBkDi29fjDG-w8R0C-4ugBAcWt-9gQU,106
|
|
16
|
+
app/api/system.py,sha256=FQTM0haTEL1Ri2Oc3tkK_vygYN9nHN7CXCjQ0R32mT8,120
|
|
17
|
+
app/core/__init__.py,sha256=47DEQpj8HBSa-_TImW-5JCeuQeRkm5NMpJWZG3hSuFU,0
|
|
18
|
+
app/core/config.py,sha256=KHmA84cH1aGfzckIgqoLspuuoZ6ZOsH2oVTIj05SVbk,484
|
|
19
|
+
app/core/exception_handler.py,sha256=I5AhP7nKGyGH_ZMo-yHsoDUmrwDUyobcjNeqsZAD-QQ,2655
|
|
20
|
+
app/core/exceptions.py,sha256=hcIIDU1gY-EiwE7wxN7mx-qhP9MuHt7j695dYGDEy8o,775
|
|
21
|
+
app/core/logging.py,sha256=-Jw8sM35hbNHpMn5A1rwmBroz_b4T0xNW11vsAGrZdY,442
|
|
22
|
+
app/database/__init__.py,sha256=47DEQpj8HBSa-_TImW-5JCeuQeRkm5NMpJWZG3hSuFU,0
|
|
23
|
+
app/database/base.py,sha256=gqCYPI0VeLxY1XXi1SaejOAaGvchYTuYz7mbvAK6ON8,142
|
|
24
|
+
app/database/session.py,sha256=sRe9i6lt0FUns2XKz2GELXGmX03JIeik2H39hsGfWh0,605
|
|
25
|
+
app/models/__init__.py,sha256=47DEQpj8HBSa-_TImW-5JCeuQeRkm5NMpJWZG3hSuFU,0
|
|
26
|
+
app/models/agent_run.py,sha256=119csqBVoG2N-aIVWOVCeiyHP_On54mni9h0VcU8E40,768
|
|
27
|
+
app/models/candidate.py,sha256=ErMg7WtKRsGfSwndjs4swKGmMebRRnEf3cs2taJQVEw,1186
|
|
28
|
+
app/models/node_log.py,sha256=-rdvUeAtHnsV9q_AeqpyBKeJTCjOb1DwRbK7zSxcveo,774
|
|
29
|
+
app/models/outreach_log.py,sha256=dJTbb0Fuu7upBsvljmQMpt3WWS8Tnb7EbLYnbXwCkkQ,613
|
|
30
|
+
app/models/pipeline.py,sha256=efspi7pb3Jqef2L3YnZja8UOPlErnmnyH5VgjYx3Je8,1019
|
|
31
|
+
app/models/position.py,sha256=2Z7GyxDSU6Mth07sd4Es-CbGjV99V0v5RZ2CF3VsFLw,946
|
|
32
|
+
app/models/scheduler_job.py,sha256=Au-_V0g9Euv3gT8Guv5GSH_UkHEFkSCcXkxCX0EN0g0,635
|
|
33
|
+
app/models/skill.py,sha256=X93eaMCkf4bIo8qzLQGHnoDJ9L6hg7fXS_g-ZoatFU0,481
|
|
34
|
+
app/models/system_config.py,sha256=VhShfAK4GOPyxz7JH1kG_c7FyVqEVFZ4j4hmo4z2Eh4,478
|
|
35
|
+
app/repositories/__init__.py,sha256=47DEQpj8HBSa-_TImW-5JCeuQeRkm5NMpJWZG3hSuFU,0
|
|
36
|
+
app/repositories/agent_run.py,sha256=iw2ip0p4M-z6H3pX5l6hPjP8ctt20WktUXr6VYGO-qY,3068
|
|
37
|
+
app/repositories/candidate.py,sha256=IJwlvruFvMVAPddv8nN-LrA_nC2NA0XVszMvSk7GLDQ,3663
|
|
38
|
+
app/repositories/node_log.py,sha256=18Hm-VY9fdBCi4KaxYPS37dKoKtmgH7-ZR3mPgBpuc4,2479
|
|
39
|
+
app/repositories/outreach_log.py,sha256=BXNQ87N5W_SlAFgSDRDewNTTeBhtJIdII7re-myfTyk,2752
|
|
40
|
+
app/repositories/pipeline.py,sha256=0idCsV50oTGZZAuoGs9e_SSFqifgEnAYFkX2bRTAMCM,3506
|
|
41
|
+
app/repositories/position.py,sha256=Eotb57Ynq0xeZiTrL4qIO64Rj8QLktsCbVixt9N7Uag,2793
|
|
42
|
+
app/repositories/scheduler_job.py,sha256=ic7kvOZQGW84dqDb5huvixqs8I7rCaYPvmbhILzEe1g,3015
|
|
43
|
+
app/schemas/__init__.py,sha256=47DEQpj8HBSa-_TImW-5JCeuQeRkm5NMpJWZG3hSuFU,0
|
|
44
|
+
app/schemas/agent_run.py,sha256=BQChNh33QEgXAeHv-4kim2XiKVx9P6Q1m5IG8vnBcyE,889
|
|
45
|
+
app/schemas/candidate.py,sha256=jqbHzsENyTqox1jd3Hr59PJkEREfetTWlRK5hDlCUTk,1650
|
|
46
|
+
app/schemas/node_log.py,sha256=Xaz4Q19mo1qU1OU-fw5wC_Zs2a2h5Gb4DwsEQ1tF84s,866
|
|
47
|
+
app/schemas/outreach_log.py,sha256=bOBnjCeLFSD2zraEBzD0NbaCVw1f5ybkyxdSso8q8QU,694
|
|
48
|
+
app/schemas/pipeline.py,sha256=KiBf0MWUaIaSKSPdPPYGlpDd1LbWEejyiOIJt5ZqjR4,924
|
|
49
|
+
app/schemas/position.py,sha256=uKwfhFNuh5ELY-VB86Y7HF-OkWgSHwMaVmRa5nDYhNw,1409
|
|
50
|
+
app/schemas/scheduler_job.py,sha256=FFbjZ5O6uy8y--1BGEnAodFQqkAUSkwRw-G6TxB8IhU,794
|
|
51
|
+
app/services/__init__.py,sha256=47DEQpj8HBSa-_TImW-5JCeuQeRkm5NMpJWZG3hSuFU,0
|
|
52
|
+
app/services/candidate.py,sha256=4mDwzJ9gq0tm_aTdfF8f9ed_cexA_zqxaKAObh-Pg2E,2714
|
|
53
|
+
app/services/dashboard.py,sha256=93FI8uzEJn4p3ErN7gi3catDa-Z1uDuMnT4aZ1nXF1o,8950
|
|
54
|
+
app/services/email.py,sha256=YRZ4H9w-pK0vlluVMrou6uOW7whu-ZPJwuCRYun0dvE,4280
|
|
55
|
+
app/services/health.py,sha256=yNEAZtYxueCD9oGvlvMyio7eA00UJn90b05M3IE3CZI,4346
|
|
56
|
+
app/services/pipeline.py,sha256=zd5oo-MipFWgwJjV0G4euRG0Mt_cV9dKO8WAMYCtBy4,3504
|
|
57
|
+
app/services/position.py,sha256=Kk9KRw8HAYrf-7B4npzVpGw0RSWrV9YhiJXpD50H3h8,1776
|
|
58
|
+
app/services/runner.py,sha256=Gx8gSYICDPJL-z2O2_yMGtal9w2icquvjDQ2_GHxlVg,12148
|
|
59
|
+
app/services/scheduler.py,sha256=xCFkxvAeHBQP5EzB5HuSSSiAKe4dh3X-ApEmlfgiNvY,6447
|
|
60
|
+
app/services/score.py,sha256=3pl3z51Dn3dx5-aKVZDV_q7nY6ToRJ-bMAdUcNEKacs,5545
|
|
61
|
+
app/services/search.py,sha256=5HiOs2VdBZjwjpyHm9s1wCuB_6U3RLY-0SCCCwIrhOY,3900
|
|
62
|
+
app/skills/base.py,sha256=qqDPcD8EGHbsZvc8J0KO30dBgwtEz2xYGhSREFkHQMA,660
|
|
63
|
+
app/skills/github.py,sha256=hsmcRu1BRjf43Bw1JmRPbuOuxB0steOpOyJvd6_ENhs,4729
|
|
64
|
+
app/skills/registry.py,sha256=2pEVYKwVyeYFigRIG1qEUgAadCE6y40sBr5b0VlcIfg,1590
|
|
65
|
+
app/tests/__init__.py,sha256=XZdDcRoijUtjI4P5D_LNh7BHknDTqlCxRVCmmhd3TGY,37
|
|
66
|
+
app/tests/conftest.py,sha256=PqTuWqNNq4tnZA17KibPTDCE009xJ3JtJGa0XqbMbyA,2867
|
|
67
|
+
app/tests/generate_report.py,sha256=JOWpJ4d4tbnA9qI6LODO9qmjzkR4V6gwSh_HcrEXpto,4878
|
|
68
|
+
app/tests/test_candidates.py,sha256=QODuOgkNjX9TKNyGuVdMVKJTCddTt37ldw5U5hCJ3kI,5337
|
|
69
|
+
app/tests/test_dashboard.py,sha256=fV0mDRu4bp57z5Ay8ITjnxcjLPttJu2nn3YR68B1foQ,810
|
|
70
|
+
app/tests/test_outreach.py,sha256=zVUoUKRA9UruThVkzavHd5MDyCCDaBPn7U0t0XvMrh8,310
|
|
71
|
+
app/tests/test_pipelines.py,sha256=uNZ2dWcZX9HWPhx2cKCR4ktnvh0nrqyPEREo__JOS8c,8572
|
|
72
|
+
app/tests/test_positions.py,sha256=LiWKqxZCtsAelubjvWQSK8R89i6v1r5j5Wrcmb3CFlU,6006
|
|
73
|
+
app/tests/test_scheduler.py,sha256=aH8jaGIGlOBYzlAGD2ojEhw949f2yD1gPwSyQXvgnj0,314
|
|
74
|
+
app/tests/test_skills.py,sha256=XC162fbUoU_azb3KGXoGJtPFX6-zL8xb1GpumdagyrY,287
|
|
75
|
+
app/tests/test_system.py,sha256=LtQ0--3A0zkVH4tT0dkgXDvyGO9SrKEUeLgaVIHea3s,824
|
|
76
|
+
app/utils/__init__.py,sha256=47DEQpj8HBSa-_TImW-5JCeuQeRkm5NMpJWZG3hSuFU,0
|
|
77
|
+
loop_agent_cli/__init__.py,sha256=8FgOwsyL0WCZZgFiy88I4PiBK0rLCTRZSNbAQoehoZI,91
|
|
78
|
+
loop_agent_cli/cli.py,sha256=zN_dwp6mjMJiC0W5nlU_bEXWFs7r28fAX5Yj9MOoO6I,25880
|
|
79
|
+
loop_agent_cli/container.py,sha256=LQo_o8LGj_RrTrfPTHKpBj0VIf4cXPFQ6UpZlh5hMrk,6711
|
|
80
|
+
loop_agent_cli-0.1.0.dist-info/METADATA,sha256=buHoKSflUKnoQasIput68AKvgS7udrDDOn-0jKBU9qE,5317
|
|
81
|
+
loop_agent_cli-0.1.0.dist-info/WHEEL,sha256=aeYiig01lYGDzBgS8HxWXOg3uV61G9ijOsup-k9o1sk,91
|
|
82
|
+
loop_agent_cli-0.1.0.dist-info/entry_points.txt,sha256=HdcMes63KqnBLR1TNP59R_OOSA-jczSSMcQGfd_4UAc,54
|
|
83
|
+
loop_agent_cli-0.1.0.dist-info/top_level.txt,sha256=WWfM2gyq1LszIMW7_HbgceB5IBvdRy6EcAVWq8-GEUo,19
|
|
84
|
+
loop_agent_cli-0.1.0.dist-info/RECORD,,
|