fuli-context 0.7.4-beta.3 → 0.7.6
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.
- package/README.md +77 -6
- package/README.zh-CN.md +69 -6
- package/compose.graphiti.yml +6 -6
- package/dist/web/assets/AboutPage-sLV9WChi.js +1 -0
- package/dist/web/assets/ConnectionsPage-BWn4ywGJ.js +1 -0
- package/dist/web/assets/KnowledgeEditDialog-CZ5ziPrD.js +1 -0
- package/dist/web/assets/KnowledgeInspector-CRQWOaos.js +1 -0
- package/dist/web/assets/KnowledgeOrganizerPage-Dfj3vIpU.js +1 -0
- package/dist/web/assets/KnowledgePage-BRYC9S5Y.js +1 -0
- package/dist/web/assets/KnowledgeWorkspace-ChEB5Bwk.js +4 -0
- package/dist/web/assets/OverviewPage-Cd66M0RT.js +1 -0
- package/dist/web/assets/PersonalProfilePage-RCFHL0Wz.js +1 -0
- package/dist/web/assets/PersonalProjectsPage-DEh8XWby.js +1 -0
- package/dist/web/assets/ProjectAgentsPage-Crh7PrXa.css +1 -0
- package/dist/web/assets/ProjectAgentsPage-DPnaH-TR.js +11 -0
- package/dist/web/assets/PublicProjectsPage-mstPEjHe.js +1 -0
- package/dist/web/assets/ReviewPage-6Y1SmfZy.js +1 -0
- package/dist/web/assets/SearchableSelect-D3HM8YF8.js +1 -0
- package/dist/web/assets/SettingsPage--LdTMUm7.js +1 -0
- package/dist/web/assets/SettingsPage-CwZp2ka4.css +1 -0
- package/dist/web/assets/WritingTastePage-CIpKswvs.js +1 -0
- package/dist/web/assets/{console-D_2zC4lm.js → console-BT1P2Db4.js} +1 -1
- package/dist/web/assets/{conversation-launcher-settings-DQmMH2j7.js → conversation-launcher-settings-DrJEotdf.js} +1 -1
- package/dist/web/assets/i18n-js6gfc7j.js +9 -0
- package/dist/web/assets/{identity-DmGcY3Y6.js → identity-CfDfanpa.js} +1 -1
- package/dist/web/assets/index-BnH5mcZx.css +1 -0
- package/dist/web/assets/index-GqJf1xqg.js +2 -0
- package/dist/web/assets/{model-CVoOdRsL.js → model-DJkLAJsg.js} +1 -1
- package/dist/web/assets/{useApi-CROJJdhE-CBNg4CdH.js → useApi-CROJJdhE-BdSti7Y2.js} +1 -1
- package/dist/web/assets/vue-router-Kk67EaCP.js +1 -0
- package/dist/web/index.html +6 -6
- package/graph-provider/fuli_graph/app.py +8 -0
- package/graph-provider/fuli_graph/collaboration_context.py +69 -6
- package/graph-provider/fuli_graph/knowledge_search.py +84 -5
- package/graph-provider/fuli_graph/model_validation.py +130 -0
- package/graph-provider/fuli_graph/models.py +24 -5
- package/graph-provider/fuli_graph/project_agent_access.py +54 -0
- package/graph-provider/fuli_graph/project_agent_coordination_models.py +22 -0
- package/graph-provider/fuli_graph/project_agent_executor_models.py +635 -0
- package/graph-provider/fuli_graph/project_agent_models.py +278 -0
- package/graph-provider/fuli_graph/project_agent_routes.py +626 -0
- package/graph-provider/fuli_graph/project_agent_task_models.py +545 -0
- package/graph-provider/fuli_graph/runtime.py +259 -0
- package/graph-provider/fuli_graph/search_projection.py +3 -0
- package/graph-provider/fuli_graph/store.py +6 -0
- package/graph-provider/fuli_graph/store_knowledge.py +62 -9
- package/graph-provider/fuli_graph/store_project_agent_coordination_policy.py +122 -0
- package/graph-provider/fuli_graph/store_project_agent_executor_learning.py +756 -0
- package/graph-provider/fuli_graph/store_project_agent_executor_routing.py +601 -0
- package/graph-provider/fuli_graph/store_project_agent_executors.py +1087 -0
- package/graph-provider/fuli_graph/store_project_agent_task_reads.py +458 -0
- package/graph-provider/fuli_graph/store_project_agent_task_recruitment.py +705 -0
- package/graph-provider/fuli_graph/store_project_agent_task_staffing.py +586 -0
- package/graph-provider/fuli_graph/store_project_agent_tasks.py +1151 -0
- package/graph-provider/fuli_graph/store_project_agents.py +965 -0
- package/graph-provider/pyproject.toml +2 -1
- package/npm-shrinkwrap.json +2 -2
- package/package.json +1 -1
- package/skills/capturing-session-knowledge/SKILL.md +39 -0
- package/src/adaptive-runtime/executor-pool.js +127 -0
- package/src/adaptive-runtime/graph-services.js +166 -0
- package/src/adaptive-runtime/lease-client.js +335 -0
- package/src/adaptive-runtime/runtime-broker.js +318 -0
- package/src/adaptive-runtime/settings.js +111 -0
- package/src/adaptive-runtime/state.js +74 -0
- package/src/agent-tools/graph-definitions.js +419 -0
- package/src/agent-tools/graph-handlers.js +65 -0
- package/src/agent-tools/project-agent-definitions.js +307 -0
- package/src/backup/graph-backup.js +289 -0
- package/src/backup/identity-reconciliation.js +208 -0
- package/src/backup/runtime-adapters.js +269 -0
- package/src/cli/command-registry.js +6 -2
- package/src/cli/graph-data-command.js +112 -0
- package/src/cli/local-runtime-command.js +16 -2
- package/src/cli/setup-command.js +19 -3
- package/src/cli/update-command.js +4 -0
- package/src/cli.js +6 -0
- package/src/graphiti/collaboration-preference-projection.js +29 -1
- package/src/graphiti/collaboration-preference-workflow.js +121 -0
- package/src/graphiti/federated-application.js +53 -90
- package/src/graphiti/project-agent-control-plane.js +275 -0
- package/src/graphiti/project-agent-mapping.js +1024 -0
- package/src/graphiti/project-agent-workflows.js +576 -0
- package/src/graphiti/provider-client.js +282 -1
- package/src/http/api-router.js +63 -9
- package/src/http/graph-api-router.js +290 -0
- package/src/local-runtime/lifecycle.js +46 -10
- package/src/mcp/context-resources.js +15 -6
- package/src/mcp/create-mcp-server.js +51 -16
- package/src/mcp/instructions.js +7 -5
- package/src/mcp/runtime.js +17 -5
- package/src/mcp/session-id.js +38 -1
- package/src/mcp/tool-annotations.js +71 -0
- package/src/mcp-server.js +23 -6
- package/src/native-runtime/runtime.js +717 -0
- package/src/server.js +6 -2
- package/src/setup/agent-installation-status.js +7 -1
- package/src/setup/agents.js +3 -1
- package/src/setup/claude-code-config.js +3 -1
- package/src/setup/codex-bootstrap.js +11 -10
- package/src/setup/codex-config.js +7 -1
- package/src/setup/cursor-config.js +3 -1
- package/src/setup/graph-runtime.js +158 -13
- package/src/setup/neo4j-memory-profile.js +43 -0
- package/src/setup/options.js +38 -2
- package/src/setup/paths.js +14 -0
- package/src/setup/setup.js +37 -1
- package/src/system/resource-monitor.js +181 -16
- package/src/system/runtime-settings.js +10 -1
- package/src/system/system-service.js +27 -2
- package/dist/web/assets/AboutPage-Dpf5fRWv.js +0 -1
- package/dist/web/assets/ConnectionsPage-D21aUDCP.js +0 -1
- package/dist/web/assets/KnowledgeEditDialog-u7lpfN3j.js +0 -1
- package/dist/web/assets/KnowledgeInspector-k4xnHtXd.js +0 -1
- package/dist/web/assets/KnowledgeOrganizerPage-Bdj7Rn84.js +0 -1
- package/dist/web/assets/KnowledgePage-UHVAbC1W.js +0 -1
- package/dist/web/assets/KnowledgeWorkspace-Lq3d-MeC.js +0 -4
- package/dist/web/assets/OverviewPage-CycAgA1V.js +0 -1
- package/dist/web/assets/PersonalProfilePage-U9oIV5FT.js +0 -1
- package/dist/web/assets/PersonalProjectsPage-C5RpXKcA.js +0 -1
- package/dist/web/assets/PublicProjectsPage-DiWxm35E.js +0 -1
- package/dist/web/assets/ReviewPage-jxRfGSJK.js +0 -1
- package/dist/web/assets/SearchableSelect-B3-5IPup.js +0 -1
- package/dist/web/assets/SettingsPage-BqfGDOho.js +0 -1
- package/dist/web/assets/SettingsPage-CAfz4qiV.css +0 -1
- package/dist/web/assets/WritingTastePage-BJxhMqJR.js +0 -1
- package/dist/web/assets/i18n-CwqXDI1C.js +0 -5
- package/dist/web/assets/index-IUGLt4lG.js +0 -2
- package/dist/web/assets/index-X2j29j8i.css +0 -1
- package/dist/web/assets/vue-router-CWSsUUio.js +0 -1
|
@@ -0,0 +1,626 @@
|
|
|
1
|
+
"""HTTP route registration for the Project Agent collaboration control plane."""
|
|
2
|
+
|
|
3
|
+
from datetime import date
|
|
4
|
+
from typing import Annotated, Any
|
|
5
|
+
|
|
6
|
+
from fastapi import FastAPI, HTTPException, Query
|
|
7
|
+
|
|
8
|
+
from .project_agent_models import (
|
|
9
|
+
ProjectAgentAssignmentCreate,
|
|
10
|
+
ProjectAgentAssignmentEnd,
|
|
11
|
+
ProjectAgentAssignmentRecord,
|
|
12
|
+
ProjectAgentAssignmentReplace,
|
|
13
|
+
ProjectAgentAssignmentReplaceResult,
|
|
14
|
+
ProjectAgentRecord,
|
|
15
|
+
ProjectAgentStatus,
|
|
16
|
+
ProjectAgentUpsert,
|
|
17
|
+
)
|
|
18
|
+
from .project_agent_executor_models import (
|
|
19
|
+
ProjectAgentExecutorActualReport,
|
|
20
|
+
ProjectAgentExecutorAuthorization,
|
|
21
|
+
ProjectAgentExecutorEvidenceIgnore,
|
|
22
|
+
ProjectAgentExecutorHealthReport,
|
|
23
|
+
ProjectAgentExecutorOutcomeAggregate,
|
|
24
|
+
ProjectAgentExecutorOutcomeEvidenceCreate,
|
|
25
|
+
ProjectAgentExecutorOutcomeEvidenceRecord,
|
|
26
|
+
ProjectAgentExecutorOutcomeReset,
|
|
27
|
+
ProjectAgentExecutorPreflightReport,
|
|
28
|
+
ProjectAgentExecutorPriorityUpdate,
|
|
29
|
+
ProjectAgentExecutorRecord,
|
|
30
|
+
ProjectAgentExecutorRegistration,
|
|
31
|
+
ProjectAgentExecutorRoutingRuleCreate,
|
|
32
|
+
ProjectAgentExecutorRoutingRuleRecord,
|
|
33
|
+
ProjectAgentExecutorRoutingRuleUpdate,
|
|
34
|
+
ProjectAgentExecutorScope,
|
|
35
|
+
)
|
|
36
|
+
from .project_agent_coordination_models import (
|
|
37
|
+
ProjectAgentCoordinationPolicyRecord,
|
|
38
|
+
ProjectAgentCoordinationPolicyUpdate,
|
|
39
|
+
)
|
|
40
|
+
from .project_agent_task_models import (
|
|
41
|
+
ProjectAgentActivityResult,
|
|
42
|
+
ProjectAgentRecruitmentDecision,
|
|
43
|
+
ProjectAgentRecruitmentPolicyRecord,
|
|
44
|
+
ProjectAgentRecruitmentPolicyUpdate,
|
|
45
|
+
ProjectAgentRecruitmentRecord,
|
|
46
|
+
ProjectAgentTaskActivityCreate,
|
|
47
|
+
ProjectAgentTaskRecord,
|
|
48
|
+
ProjectAgentTaskRouteResult,
|
|
49
|
+
ProjectAgentTaskSubmit,
|
|
50
|
+
)
|
|
51
|
+
|
|
52
|
+
|
|
53
|
+
def register_project_agent_routes(
|
|
54
|
+
application: FastAPI,
|
|
55
|
+
store: Any,
|
|
56
|
+
Actor: Any,
|
|
57
|
+
) -> None:
|
|
58
|
+
"""Attach Project Agent routes while keeping ``create_app`` orchestration small."""
|
|
59
|
+
|
|
60
|
+
@application.put('/v1/project-agents', response_model=ProjectAgentRecord)
|
|
61
|
+
async def upsert_project_agent(
|
|
62
|
+
request: ProjectAgentUpsert,
|
|
63
|
+
actor: Actor,
|
|
64
|
+
) -> ProjectAgentRecord:
|
|
65
|
+
return await store.upsert_project_agent(actor, request)
|
|
66
|
+
|
|
67
|
+
@application.get('/v1/project-agents', response_model=list[ProjectAgentRecord])
|
|
68
|
+
async def list_project_agents(
|
|
69
|
+
actor: Actor,
|
|
70
|
+
personal_space_id: Annotated[str, Query(min_length=1, max_length=128)],
|
|
71
|
+
personal_project_id: Annotated[
|
|
72
|
+
str | None,
|
|
73
|
+
Query(min_length=1, max_length=128),
|
|
74
|
+
] = None,
|
|
75
|
+
status: Annotated[ProjectAgentStatus | None, Query()] = None,
|
|
76
|
+
capability: Annotated[
|
|
77
|
+
str | None,
|
|
78
|
+
Query(min_length=1, max_length=512),
|
|
79
|
+
] = None,
|
|
80
|
+
) -> list[ProjectAgentRecord]:
|
|
81
|
+
return await store.list_project_agents(
|
|
82
|
+
actor,
|
|
83
|
+
personal_space_id,
|
|
84
|
+
personal_project_id,
|
|
85
|
+
status=status,
|
|
86
|
+
capability=capability,
|
|
87
|
+
)
|
|
88
|
+
|
|
89
|
+
@application.get(
|
|
90
|
+
'/v1/project-agents/{agent_id}',
|
|
91
|
+
response_model=ProjectAgentRecord,
|
|
92
|
+
)
|
|
93
|
+
async def get_project_agent(
|
|
94
|
+
agent_id: str,
|
|
95
|
+
actor: Actor,
|
|
96
|
+
personal_space_id: Annotated[str, Query(min_length=1, max_length=128)],
|
|
97
|
+
personal_project_id: Annotated[
|
|
98
|
+
str | None,
|
|
99
|
+
Query(min_length=1, max_length=128),
|
|
100
|
+
] = None,
|
|
101
|
+
) -> ProjectAgentRecord:
|
|
102
|
+
return await store.get_project_agent(
|
|
103
|
+
actor,
|
|
104
|
+
personal_space_id,
|
|
105
|
+
personal_project_id,
|
|
106
|
+
agent_id,
|
|
107
|
+
)
|
|
108
|
+
|
|
109
|
+
@application.delete(
|
|
110
|
+
'/v1/project-agents/{agent_id}',
|
|
111
|
+
response_model=ProjectAgentRecord,
|
|
112
|
+
)
|
|
113
|
+
async def archive_project_agent(
|
|
114
|
+
agent_id: str,
|
|
115
|
+
actor: Actor,
|
|
116
|
+
personal_space_id: Annotated[str, Query(min_length=1, max_length=128)],
|
|
117
|
+
reason: Annotated[str, Query(min_length=1, max_length=2048)] = 'archived by user',
|
|
118
|
+
) -> ProjectAgentRecord:
|
|
119
|
+
return await store.archive_project_agent(
|
|
120
|
+
actor,
|
|
121
|
+
personal_space_id,
|
|
122
|
+
agent_id,
|
|
123
|
+
reason=reason,
|
|
124
|
+
)
|
|
125
|
+
|
|
126
|
+
@application.post(
|
|
127
|
+
'/v1/project-agents/system-coordinator',
|
|
128
|
+
response_model=ProjectAgentRecord,
|
|
129
|
+
)
|
|
130
|
+
async def ensure_project_agent_coordinator(
|
|
131
|
+
actor: Actor,
|
|
132
|
+
personal_space_id: Annotated[str, Query(min_length=1, max_length=128)],
|
|
133
|
+
) -> ProjectAgentRecord:
|
|
134
|
+
return await store.ensure_system_project_coordinator(actor, personal_space_id)
|
|
135
|
+
|
|
136
|
+
@application.post(
|
|
137
|
+
'/v1/project-agent-assignments',
|
|
138
|
+
response_model=ProjectAgentAssignmentRecord,
|
|
139
|
+
)
|
|
140
|
+
async def create_project_agent_assignment(
|
|
141
|
+
request: ProjectAgentAssignmentCreate,
|
|
142
|
+
actor: Actor,
|
|
143
|
+
) -> ProjectAgentAssignmentRecord:
|
|
144
|
+
return await store.create_project_agent_assignment(actor, request)
|
|
145
|
+
|
|
146
|
+
@application.get(
|
|
147
|
+
'/v1/project-agent-assignments',
|
|
148
|
+
response_model=list[ProjectAgentAssignmentRecord],
|
|
149
|
+
)
|
|
150
|
+
async def list_project_agent_assignments(
|
|
151
|
+
actor: Actor,
|
|
152
|
+
personal_space_id: Annotated[str, Query(min_length=1, max_length=128)],
|
|
153
|
+
personal_project_id: Annotated[
|
|
154
|
+
str | None,
|
|
155
|
+
Query(min_length=1, max_length=128),
|
|
156
|
+
] = None,
|
|
157
|
+
agent_id: Annotated[
|
|
158
|
+
str | None,
|
|
159
|
+
Query(min_length=1, max_length=128),
|
|
160
|
+
] = None,
|
|
161
|
+
status: Annotated[str | None, Query()] = None,
|
|
162
|
+
) -> list[ProjectAgentAssignmentRecord]:
|
|
163
|
+
return await store.list_project_agent_assignments(
|
|
164
|
+
actor,
|
|
165
|
+
personal_space_id,
|
|
166
|
+
personal_project_id=personal_project_id,
|
|
167
|
+
agent_id=agent_id,
|
|
168
|
+
status=status,
|
|
169
|
+
)
|
|
170
|
+
|
|
171
|
+
@application.post(
|
|
172
|
+
'/v1/project-agent-assignments/end',
|
|
173
|
+
response_model=ProjectAgentAssignmentRecord,
|
|
174
|
+
)
|
|
175
|
+
async def end_project_agent_assignment(
|
|
176
|
+
request: ProjectAgentAssignmentEnd,
|
|
177
|
+
actor: Actor,
|
|
178
|
+
) -> ProjectAgentAssignmentRecord:
|
|
179
|
+
return await store.end_project_agent_assignment(actor, request)
|
|
180
|
+
|
|
181
|
+
@application.post(
|
|
182
|
+
'/v1/project-agent-assignments/replace',
|
|
183
|
+
response_model=ProjectAgentAssignmentReplaceResult,
|
|
184
|
+
)
|
|
185
|
+
async def replace_project_agent_assignment(
|
|
186
|
+
request: ProjectAgentAssignmentReplace,
|
|
187
|
+
actor: Actor,
|
|
188
|
+
) -> ProjectAgentAssignmentReplaceResult:
|
|
189
|
+
return await store.replace_project_agent_assignment(actor, request)
|
|
190
|
+
|
|
191
|
+
@application.post(
|
|
192
|
+
'/v1/project-agent-tasks',
|
|
193
|
+
response_model=ProjectAgentTaskRouteResult,
|
|
194
|
+
)
|
|
195
|
+
async def submit_project_agent_task(
|
|
196
|
+
request: ProjectAgentTaskSubmit,
|
|
197
|
+
actor: Actor,
|
|
198
|
+
) -> ProjectAgentTaskRouteResult:
|
|
199
|
+
return await store.submit_project_agent_task(actor, request)
|
|
200
|
+
|
|
201
|
+
@application.get(
|
|
202
|
+
'/v1/project-agent-tasks',
|
|
203
|
+
response_model=list[ProjectAgentTaskRecord],
|
|
204
|
+
)
|
|
205
|
+
async def list_project_agent_tasks(
|
|
206
|
+
actor: Actor,
|
|
207
|
+
personal_space_id: Annotated[str, Query(min_length=1, max_length=128)],
|
|
208
|
+
personal_project_id: Annotated[
|
|
209
|
+
str | None,
|
|
210
|
+
Query(min_length=1, max_length=128),
|
|
211
|
+
] = None,
|
|
212
|
+
agent_id: Annotated[
|
|
213
|
+
str | None,
|
|
214
|
+
Query(min_length=1, max_length=128),
|
|
215
|
+
] = None,
|
|
216
|
+
status: Annotated[str | None, Query()] = None,
|
|
217
|
+
limit: Annotated[int, Query(ge=1, le=200)] = 100,
|
|
218
|
+
) -> list[ProjectAgentTaskRecord]:
|
|
219
|
+
return await store.list_project_agent_tasks(
|
|
220
|
+
actor,
|
|
221
|
+
personal_space_id,
|
|
222
|
+
personal_project_id=personal_project_id,
|
|
223
|
+
agent_id=agent_id,
|
|
224
|
+
status=status,
|
|
225
|
+
limit=limit,
|
|
226
|
+
)
|
|
227
|
+
|
|
228
|
+
@application.get(
|
|
229
|
+
'/v1/project-agent-tasks/{task_id}',
|
|
230
|
+
response_model=ProjectAgentTaskRecord,
|
|
231
|
+
)
|
|
232
|
+
async def get_project_agent_task(
|
|
233
|
+
task_id: str,
|
|
234
|
+
actor: Actor,
|
|
235
|
+
personal_space_id: Annotated[str, Query(min_length=1, max_length=128)],
|
|
236
|
+
) -> ProjectAgentTaskRecord:
|
|
237
|
+
return await store.get_project_agent_task(actor, personal_space_id, task_id)
|
|
238
|
+
|
|
239
|
+
@application.post(
|
|
240
|
+
'/v1/project-agent-tasks/{task_id}/events',
|
|
241
|
+
response_model=ProjectAgentTaskRecord,
|
|
242
|
+
)
|
|
243
|
+
async def record_project_agent_task_activity(
|
|
244
|
+
task_id: str,
|
|
245
|
+
request: ProjectAgentTaskActivityCreate,
|
|
246
|
+
actor: Actor,
|
|
247
|
+
) -> ProjectAgentTaskRecord:
|
|
248
|
+
if task_id != request.task_id:
|
|
249
|
+
raise HTTPException(status_code=422, detail='task ID does not match path')
|
|
250
|
+
return await store.record_project_agent_task_activity(actor, request)
|
|
251
|
+
|
|
252
|
+
@application.get(
|
|
253
|
+
'/v1/project-agents/{agent_id}/activity',
|
|
254
|
+
response_model=ProjectAgentActivityResult,
|
|
255
|
+
)
|
|
256
|
+
async def get_project_agent_activity(
|
|
257
|
+
agent_id: str,
|
|
258
|
+
actor: Actor,
|
|
259
|
+
personal_space_id: Annotated[str, Query(min_length=1, max_length=128)],
|
|
260
|
+
from_date: Annotated[date, Query(alias='from')],
|
|
261
|
+
to_date: Annotated[date, Query(alias='to')],
|
|
262
|
+
) -> ProjectAgentActivityResult:
|
|
263
|
+
return await store.get_project_agent_activity(
|
|
264
|
+
actor,
|
|
265
|
+
personal_space_id,
|
|
266
|
+
agent_id,
|
|
267
|
+
from_date,
|
|
268
|
+
to_date,
|
|
269
|
+
)
|
|
270
|
+
|
|
271
|
+
@application.get(
|
|
272
|
+
'/v1/project-agent-coordination-policy',
|
|
273
|
+
response_model=ProjectAgentCoordinationPolicyRecord,
|
|
274
|
+
)
|
|
275
|
+
async def get_project_agent_coordination_policy(
|
|
276
|
+
actor: Actor,
|
|
277
|
+
personal_space_id: Annotated[str, Query(min_length=1, max_length=128)],
|
|
278
|
+
personal_project_id: Annotated[str, Query(min_length=1, max_length=128)],
|
|
279
|
+
) -> ProjectAgentCoordinationPolicyRecord:
|
|
280
|
+
return await store.get_project_agent_coordination_policy(
|
|
281
|
+
actor,
|
|
282
|
+
personal_space_id,
|
|
283
|
+
personal_project_id,
|
|
284
|
+
)
|
|
285
|
+
|
|
286
|
+
@application.put(
|
|
287
|
+
'/v1/project-agent-coordination-policy',
|
|
288
|
+
response_model=ProjectAgentCoordinationPolicyRecord,
|
|
289
|
+
)
|
|
290
|
+
async def update_project_agent_coordination_policy(
|
|
291
|
+
request: ProjectAgentCoordinationPolicyUpdate,
|
|
292
|
+
actor: Actor,
|
|
293
|
+
) -> ProjectAgentCoordinationPolicyRecord:
|
|
294
|
+
return await store.update_project_agent_coordination_policy(actor, request)
|
|
295
|
+
|
|
296
|
+
@application.get(
|
|
297
|
+
'/v1/project-agent-recruitment-policy',
|
|
298
|
+
response_model=ProjectAgentRecruitmentPolicyRecord,
|
|
299
|
+
)
|
|
300
|
+
async def get_project_agent_recruitment_policy(
|
|
301
|
+
actor: Actor,
|
|
302
|
+
personal_space_id: Annotated[str, Query(min_length=1, max_length=128)],
|
|
303
|
+
) -> ProjectAgentRecruitmentPolicyRecord:
|
|
304
|
+
return await store.get_project_agent_recruitment_policy(
|
|
305
|
+
actor,
|
|
306
|
+
personal_space_id,
|
|
307
|
+
)
|
|
308
|
+
|
|
309
|
+
@application.put(
|
|
310
|
+
'/v1/project-agent-recruitment-policy',
|
|
311
|
+
response_model=ProjectAgentRecruitmentPolicyRecord,
|
|
312
|
+
)
|
|
313
|
+
async def update_project_agent_recruitment_policy(
|
|
314
|
+
request: ProjectAgentRecruitmentPolicyUpdate,
|
|
315
|
+
actor: Actor,
|
|
316
|
+
) -> ProjectAgentRecruitmentPolicyRecord:
|
|
317
|
+
return await store.update_project_agent_recruitment_policy(actor, request)
|
|
318
|
+
|
|
319
|
+
@application.get(
|
|
320
|
+
'/v1/project-agent-recruitments',
|
|
321
|
+
response_model=list[ProjectAgentRecruitmentRecord],
|
|
322
|
+
)
|
|
323
|
+
async def list_project_agent_recruitments(
|
|
324
|
+
actor: Actor,
|
|
325
|
+
personal_space_id: Annotated[str, Query(min_length=1, max_length=128)],
|
|
326
|
+
personal_project_id: Annotated[
|
|
327
|
+
str | None,
|
|
328
|
+
Query(min_length=1, max_length=128),
|
|
329
|
+
] = None,
|
|
330
|
+
task_id: Annotated[
|
|
331
|
+
str | None,
|
|
332
|
+
Query(min_length=1, max_length=128),
|
|
333
|
+
] = None,
|
|
334
|
+
status: Annotated[str | None, Query()] = None,
|
|
335
|
+
) -> list[ProjectAgentRecruitmentRecord]:
|
|
336
|
+
return await store.list_project_agent_recruitments(
|
|
337
|
+
actor,
|
|
338
|
+
personal_space_id,
|
|
339
|
+
personal_project_id=personal_project_id,
|
|
340
|
+
task_id=task_id,
|
|
341
|
+
status=status,
|
|
342
|
+
)
|
|
343
|
+
|
|
344
|
+
@application.post(
|
|
345
|
+
'/v1/project-agent-recruitments/{recruitment_id}/decision',
|
|
346
|
+
response_model=ProjectAgentRecruitmentRecord,
|
|
347
|
+
)
|
|
348
|
+
async def decide_project_agent_recruitment(
|
|
349
|
+
recruitment_id: str,
|
|
350
|
+
request: ProjectAgentRecruitmentDecision,
|
|
351
|
+
actor: Actor,
|
|
352
|
+
) -> ProjectAgentRecruitmentRecord:
|
|
353
|
+
if recruitment_id != request.recruitment_id:
|
|
354
|
+
raise HTTPException(
|
|
355
|
+
status_code=422,
|
|
356
|
+
detail='recruitment ID does not match path',
|
|
357
|
+
)
|
|
358
|
+
return await store.decide_project_agent_recruitment(actor, request)
|
|
359
|
+
|
|
360
|
+
@application.put('/v1/executors', response_model=ProjectAgentExecutorRecord)
|
|
361
|
+
async def upsert_project_agent_executor(
|
|
362
|
+
request: ProjectAgentExecutorRegistration,
|
|
363
|
+
actor: Actor,
|
|
364
|
+
) -> ProjectAgentExecutorRecord:
|
|
365
|
+
return await store.upsert_project_agent_executor(actor, request)
|
|
366
|
+
|
|
367
|
+
@application.get('/v1/executors', response_model=list[ProjectAgentExecutorRecord])
|
|
368
|
+
async def list_project_agent_executors(
|
|
369
|
+
actor: Actor,
|
|
370
|
+
personal_space_id: Annotated[str, Query(min_length=1, max_length=128)],
|
|
371
|
+
capability: Annotated[
|
|
372
|
+
str | None,
|
|
373
|
+
Query(min_length=1, max_length=512),
|
|
374
|
+
] = None,
|
|
375
|
+
available_only: Annotated[bool, Query()] = False,
|
|
376
|
+
) -> list[ProjectAgentExecutorRecord]:
|
|
377
|
+
return await store.list_project_agent_executors(
|
|
378
|
+
actor,
|
|
379
|
+
personal_space_id,
|
|
380
|
+
capability=capability,
|
|
381
|
+
available_only=available_only,
|
|
382
|
+
)
|
|
383
|
+
|
|
384
|
+
@application.post(
|
|
385
|
+
'/v1/executors/authorization',
|
|
386
|
+
response_model=ProjectAgentExecutorRecord,
|
|
387
|
+
)
|
|
388
|
+
async def authorize_project_agent_executor(
|
|
389
|
+
request: ProjectAgentExecutorAuthorization,
|
|
390
|
+
actor: Actor,
|
|
391
|
+
) -> ProjectAgentExecutorRecord:
|
|
392
|
+
return await store.authorize_project_agent_executor(actor, request)
|
|
393
|
+
|
|
394
|
+
@application.post(
|
|
395
|
+
'/v1/executors/preflight',
|
|
396
|
+
response_model=ProjectAgentExecutorRecord,
|
|
397
|
+
)
|
|
398
|
+
async def record_project_agent_executor_preflight(
|
|
399
|
+
request: ProjectAgentExecutorPreflightReport,
|
|
400
|
+
actor: Actor,
|
|
401
|
+
) -> ProjectAgentExecutorRecord:
|
|
402
|
+
return await store.record_project_agent_executor_preflight(actor, request)
|
|
403
|
+
|
|
404
|
+
@application.post(
|
|
405
|
+
'/v1/executors/health',
|
|
406
|
+
response_model=ProjectAgentExecutorRecord,
|
|
407
|
+
)
|
|
408
|
+
async def record_project_agent_executor_health(
|
|
409
|
+
request: ProjectAgentExecutorHealthReport,
|
|
410
|
+
actor: Actor,
|
|
411
|
+
) -> ProjectAgentExecutorRecord:
|
|
412
|
+
return await store.record_project_agent_executor_health(actor, request)
|
|
413
|
+
|
|
414
|
+
@application.patch(
|
|
415
|
+
'/v1/executors/priority',
|
|
416
|
+
response_model=ProjectAgentExecutorRecord,
|
|
417
|
+
)
|
|
418
|
+
async def update_project_agent_executor_priority(
|
|
419
|
+
request: ProjectAgentExecutorPriorityUpdate,
|
|
420
|
+
actor: Actor,
|
|
421
|
+
) -> ProjectAgentExecutorRecord:
|
|
422
|
+
return await store.update_project_agent_executor_priority(actor, request)
|
|
423
|
+
|
|
424
|
+
@application.get(
|
|
425
|
+
'/v1/executors/{executor_id}',
|
|
426
|
+
response_model=ProjectAgentExecutorRecord,
|
|
427
|
+
)
|
|
428
|
+
async def get_project_agent_executor(
|
|
429
|
+
executor_id: str,
|
|
430
|
+
actor: Actor,
|
|
431
|
+
personal_space_id: Annotated[str, Query(min_length=1, max_length=128)],
|
|
432
|
+
) -> ProjectAgentExecutorRecord:
|
|
433
|
+
return await store.get_project_agent_executor(
|
|
434
|
+
actor,
|
|
435
|
+
personal_space_id,
|
|
436
|
+
executor_id,
|
|
437
|
+
)
|
|
438
|
+
|
|
439
|
+
@application.delete(
|
|
440
|
+
'/v1/executors/{executor_id}',
|
|
441
|
+
response_model=ProjectAgentExecutorRecord,
|
|
442
|
+
)
|
|
443
|
+
async def archive_project_agent_executor(
|
|
444
|
+
executor_id: str,
|
|
445
|
+
actor: Actor,
|
|
446
|
+
personal_space_id: Annotated[str, Query(min_length=1, max_length=128)],
|
|
447
|
+
reason: Annotated[str, Query(min_length=1, max_length=2048)] = 'archived by user',
|
|
448
|
+
) -> ProjectAgentExecutorRecord:
|
|
449
|
+
return await store.archive_project_agent_executor(
|
|
450
|
+
actor,
|
|
451
|
+
personal_space_id,
|
|
452
|
+
executor_id,
|
|
453
|
+
reason=reason,
|
|
454
|
+
)
|
|
455
|
+
|
|
456
|
+
@application.put(
|
|
457
|
+
'/v1/executor-routing-rules',
|
|
458
|
+
response_model=ProjectAgentExecutorRoutingRuleRecord,
|
|
459
|
+
)
|
|
460
|
+
async def create_project_agent_executor_routing_rule(
|
|
461
|
+
request: ProjectAgentExecutorRoutingRuleCreate,
|
|
462
|
+
actor: Actor,
|
|
463
|
+
) -> ProjectAgentExecutorRoutingRuleRecord:
|
|
464
|
+
return await store.create_project_agent_executor_routing_rule(actor, request)
|
|
465
|
+
|
|
466
|
+
@application.get(
|
|
467
|
+
'/v1/executor-routing-rules',
|
|
468
|
+
response_model=list[ProjectAgentExecutorRoutingRuleRecord],
|
|
469
|
+
)
|
|
470
|
+
async def list_project_agent_executor_routing_rules(
|
|
471
|
+
actor: Actor,
|
|
472
|
+
personal_space_id: Annotated[
|
|
473
|
+
str | None,
|
|
474
|
+
Query(min_length=1, max_length=128),
|
|
475
|
+
] = None,
|
|
476
|
+
personal_project_id: Annotated[
|
|
477
|
+
str | None,
|
|
478
|
+
Query(min_length=1, max_length=128),
|
|
479
|
+
] = None,
|
|
480
|
+
task_id: Annotated[
|
|
481
|
+
str | None,
|
|
482
|
+
Query(min_length=1, max_length=128),
|
|
483
|
+
] = None,
|
|
484
|
+
scope: Annotated[ProjectAgentExecutorScope | None, Query()] = None,
|
|
485
|
+
status: Annotated[str | None, Query()] = None,
|
|
486
|
+
) -> list[ProjectAgentExecutorRoutingRuleRecord]:
|
|
487
|
+
return await store.list_project_agent_executor_routing_rules(
|
|
488
|
+
actor,
|
|
489
|
+
personal_space_id=personal_space_id,
|
|
490
|
+
personal_project_id=personal_project_id,
|
|
491
|
+
task_id=task_id,
|
|
492
|
+
scope=scope,
|
|
493
|
+
status=status,
|
|
494
|
+
)
|
|
495
|
+
|
|
496
|
+
@application.patch(
|
|
497
|
+
'/v1/executor-routing-rules/{rule_id}',
|
|
498
|
+
response_model=ProjectAgentExecutorRoutingRuleRecord,
|
|
499
|
+
)
|
|
500
|
+
async def update_project_agent_executor_routing_rule(
|
|
501
|
+
rule_id: str,
|
|
502
|
+
request: ProjectAgentExecutorRoutingRuleUpdate,
|
|
503
|
+
actor: Actor,
|
|
504
|
+
) -> ProjectAgentExecutorRoutingRuleRecord:
|
|
505
|
+
if rule_id != request.rule_id:
|
|
506
|
+
raise HTTPException(status_code=422, detail='routing rule ID does not match path')
|
|
507
|
+
return await store.update_project_agent_executor_routing_rule(actor, request)
|
|
508
|
+
|
|
509
|
+
@application.get(
|
|
510
|
+
'/v1/executor-routing-rules/{rule_id}',
|
|
511
|
+
response_model=ProjectAgentExecutorRoutingRuleRecord,
|
|
512
|
+
)
|
|
513
|
+
async def get_project_agent_executor_routing_rule(
|
|
514
|
+
rule_id: str,
|
|
515
|
+
actor: Actor,
|
|
516
|
+
personal_space_id: Annotated[str, Query(min_length=1, max_length=128)],
|
|
517
|
+
) -> ProjectAgentExecutorRoutingRuleRecord:
|
|
518
|
+
return await store.get_project_agent_executor_routing_rule(
|
|
519
|
+
actor,
|
|
520
|
+
personal_space_id,
|
|
521
|
+
rule_id,
|
|
522
|
+
)
|
|
523
|
+
|
|
524
|
+
@application.delete(
|
|
525
|
+
'/v1/executor-routing-rules/{rule_id}',
|
|
526
|
+
response_model=ProjectAgentExecutorRoutingRuleRecord,
|
|
527
|
+
)
|
|
528
|
+
async def archive_project_agent_executor_routing_rule(
|
|
529
|
+
rule_id: str,
|
|
530
|
+
actor: Actor,
|
|
531
|
+
personal_space_id: Annotated[str, Query(min_length=1, max_length=128)],
|
|
532
|
+
reason: Annotated[str, Query(min_length=1, max_length=2048)] = 'archived by user',
|
|
533
|
+
) -> ProjectAgentExecutorRoutingRuleRecord:
|
|
534
|
+
return await store.archive_project_agent_executor_routing_rule(
|
|
535
|
+
actor,
|
|
536
|
+
personal_space_id,
|
|
537
|
+
rule_id,
|
|
538
|
+
reason=reason,
|
|
539
|
+
)
|
|
540
|
+
|
|
541
|
+
@application.post(
|
|
542
|
+
'/v1/project-agent-executor-actuals',
|
|
543
|
+
response_model=ProjectAgentExecutorActualReport,
|
|
544
|
+
)
|
|
545
|
+
async def record_project_agent_executor_actual(
|
|
546
|
+
request: ProjectAgentExecutorActualReport,
|
|
547
|
+
actor: Actor,
|
|
548
|
+
) -> ProjectAgentExecutorActualReport:
|
|
549
|
+
return await store.record_project_agent_executor_actual(actor, request)
|
|
550
|
+
|
|
551
|
+
@application.post(
|
|
552
|
+
'/v1/project-agent-routing-outcomes',
|
|
553
|
+
response_model=ProjectAgentExecutorOutcomeEvidenceRecord,
|
|
554
|
+
)
|
|
555
|
+
async def record_project_agent_executor_outcome(
|
|
556
|
+
request: ProjectAgentExecutorOutcomeEvidenceCreate,
|
|
557
|
+
actor: Actor,
|
|
558
|
+
) -> ProjectAgentExecutorOutcomeEvidenceRecord:
|
|
559
|
+
return await store.record_project_agent_executor_outcome_evidence(actor, request)
|
|
560
|
+
|
|
561
|
+
@application.get(
|
|
562
|
+
'/v1/project-agent-routing-learning',
|
|
563
|
+
response_model=list[ProjectAgentExecutorOutcomeAggregate],
|
|
564
|
+
)
|
|
565
|
+
async def list_project_agent_executor_learning(
|
|
566
|
+
actor: Actor,
|
|
567
|
+
personal_space_id: Annotated[str, Query(min_length=1, max_length=128)],
|
|
568
|
+
personal_project_id: Annotated[
|
|
569
|
+
str | None,
|
|
570
|
+
Query(min_length=1, max_length=128),
|
|
571
|
+
] = None,
|
|
572
|
+
agent_id: Annotated[
|
|
573
|
+
str | None,
|
|
574
|
+
Query(min_length=1, max_length=128),
|
|
575
|
+
] = None,
|
|
576
|
+
executor_id: Annotated[
|
|
577
|
+
str | None,
|
|
578
|
+
Query(min_length=1, max_length=128),
|
|
579
|
+
] = None,
|
|
580
|
+
work_kind: Annotated[
|
|
581
|
+
str | None,
|
|
582
|
+
Query(min_length=1, max_length=128),
|
|
583
|
+
] = None,
|
|
584
|
+
) -> list[ProjectAgentExecutorOutcomeAggregate]:
|
|
585
|
+
return await store.list_project_agent_executor_outcome_aggregates(
|
|
586
|
+
actor,
|
|
587
|
+
personal_space_id,
|
|
588
|
+
personal_project_id=personal_project_id,
|
|
589
|
+
work_kind=work_kind,
|
|
590
|
+
agent_id=agent_id,
|
|
591
|
+
executor_id=executor_id,
|
|
592
|
+
)
|
|
593
|
+
|
|
594
|
+
@application.post(
|
|
595
|
+
'/v1/project-agent-routing-learning/ignore',
|
|
596
|
+
response_model=ProjectAgentExecutorOutcomeEvidenceRecord,
|
|
597
|
+
)
|
|
598
|
+
async def ignore_project_agent_executor_learning(
|
|
599
|
+
request: ProjectAgentExecutorEvidenceIgnore,
|
|
600
|
+
actor: Actor,
|
|
601
|
+
) -> ProjectAgentExecutorOutcomeEvidenceRecord:
|
|
602
|
+
return await store.ignore_project_agent_executor_outcome_evidence(actor, request)
|
|
603
|
+
|
|
604
|
+
@application.post(
|
|
605
|
+
'/v1/project-agent-routing-learning/reset',
|
|
606
|
+
response_model=ProjectAgentExecutorOutcomeAggregate,
|
|
607
|
+
)
|
|
608
|
+
async def reset_project_agent_executor_learning(
|
|
609
|
+
request: ProjectAgentExecutorOutcomeReset,
|
|
610
|
+
actor: Actor,
|
|
611
|
+
) -> ProjectAgentExecutorOutcomeAggregate:
|
|
612
|
+
return await store.reset_project_agent_executor_outcomes(actor, request)
|
|
613
|
+
|
|
614
|
+
@application.post('/v1/project-agents/test-cleanup')
|
|
615
|
+
async def cleanup_test_project_agents(
|
|
616
|
+
actor: Actor,
|
|
617
|
+
personal_space_id: Annotated[str, Query(min_length=1, max_length=128)],
|
|
618
|
+
test_source: Annotated[str, Query(min_length=1, max_length=256)],
|
|
619
|
+
) -> dict[str, int]:
|
|
620
|
+
return {
|
|
621
|
+
'archived_count': await store.archive_test_project_agents(
|
|
622
|
+
actor,
|
|
623
|
+
personal_space_id,
|
|
624
|
+
test_source=test_source,
|
|
625
|
+
)
|
|
626
|
+
}
|