Skip to content

Commit ff3a8aa

Browse files
committed
Add team-based plan retrieval and refactor endpoints
Introduces get_all_plans_by_team_id to database interfaces and updates plan retrieval to be team-specific in the backend. Refactors several API endpoint function names for consistency. Removes step approval/rejection buttons from TaskDetails component and streamlines team initialization logic in HomePage, improving fallback handling and user feedback.
1 parent e8132d9 commit ff3a8aa

File tree

6 files changed

+129
-239
lines changed

6 files changed

+129
-239
lines changed

src/backend/app_kernel.py

Lines changed: 5 additions & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -697,7 +697,11 @@ async def get_plans(
697697

698698
return [plan_with_steps, formatted_messages]
699699

700-
all_plans = await memory_store.get_all_plans()
700+
current_team = await memory_store.get_current_team(user_id=user_id)
701+
if not current_team:
702+
return []
703+
704+
all_plans = await memory_store.get_all_plans_by_team_id(team_id=current_team.id)
701705
# Fetch steps for all plans concurrently
702706
steps_for_all_plans = await asyncio.gather(
703707
*[memory_store.get_steps_by_plan(plan_id=plan.id) for plan in all_plans]

src/backend/common/database/cosmosdb.py

Lines changed: 10 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -259,6 +259,16 @@ async def get_all_plans(self) -> List[Plan]:
259259
]
260260
return await self.query_items(query, parameters, Plan)
261261

262+
async def get_all_plans_by_team_id(self, team_id: str) -> List[Plan]:
263+
"""Retrieve all plans for a specific team."""
264+
query = "SELECT * FROM c WHERE c.team_id=@team_id AND c.data_type=@data_type and c.user_id=@user_id"
265+
parameters = [
266+
{"name": "@user_id", "value": self.user_id},
267+
{"name": "@team_id", "value": team_id},
268+
{"name": "@data_type", "value": "plan"},
269+
]
270+
return await self.query_items(query, parameters, Plan)
271+
262272
# Step Operations
263273
async def add_step(self, step: Step) -> None:
264274
"""Add a step to CosmosDB."""

src/backend/common/database/database_base.py

Lines changed: 4 additions & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -106,7 +106,10 @@ async def get_plan(self, plan_id: str) -> Optional[Plan]:
106106
async def get_all_plans(self) -> List[Plan]:
107107
"""Retrieve all plans for the user."""
108108
pass
109-
109+
@abstractmethod
110+
async def get_all_plans_by_team_id(self, team_id: str) -> List[Plan]:
111+
"""Retrieve all plans for a specific team."""
112+
pass
110113
@abstractmethod
111114
async def get_data_by_type_and_session_id(
112115
self, data_type: str, session_id: str

src/backend/v3/api/router.py

Lines changed: 31 additions & 31 deletions
Original file line numberDiff line numberDiff line change
@@ -189,30 +189,30 @@ async def process_request(background_tasks: BackgroundTasks, input_task: InputTa
189189
"""
190190

191191

192-
# if not await rai_success(input_task.description, False):
193-
# track_event_if_configured(
194-
# "RAI failed",
195-
# {
196-
# "status": "Plan not created - RAI check failed",
197-
# "description": input_task.description,
198-
# "session_id": input_task.session_id,
199-
# },
200-
# )
201-
# raise HTTPException(
202-
# status_code=400,
203-
# detail={
204-
# "error_type": "RAI_VALIDATION_FAILED",
205-
# "message": "Content Safety Check Failed",
206-
# "description": "Your request contains content that doesn't meet our safety guidelines. Please modify your request to ensure it's appropriate and try again.",
207-
# "suggestions": [
208-
# "Remove any potentially harmful, inappropriate, or unsafe content",
209-
# "Use more professional and constructive language",
210-
# "Focus on legitimate business or educational objectives",
211-
# "Ensure your request complies with content policies",
212-
# ],
213-
# "user_action": "Please revise your request and try again",
214-
# },
215-
# )
192+
if not await rai_success(input_task.description, False):
193+
track_event_if_configured(
194+
"RAI failed",
195+
{
196+
"status": "Plan not created - RAI check failed",
197+
"description": input_task.description,
198+
"session_id": input_task.session_id,
199+
},
200+
)
201+
raise HTTPException(
202+
status_code=400,
203+
detail={
204+
"error_type": "RAI_VALIDATION_FAILED",
205+
"message": "Content Safety Check Failed",
206+
"description": "Your request contains content that doesn't meet our safety guidelines. Please modify your request to ensure it's appropriate and try again.",
207+
"suggestions": [
208+
"Remove any potentially harmful, inappropriate, or unsafe content",
209+
"Use more professional and constructive language",
210+
"Focus on legitimate business or educational objectives",
211+
"Ensure your request complies with content policies",
212+
],
213+
"user_action": "Please revise your request and try again",
214+
},
215+
)
216216

217217
authenticated_user = get_authenticated_user_details(request_headers=request.headers)
218218
user_id = authenticated_user["user_principal_id"]
@@ -360,7 +360,7 @@ async def user_clarification(human_feedback: messages.UserClarificationResponse,
360360

361361

362362
@app_v3.post("/upload_team_config")
363-
async def upload_team_config_endpoint(request: Request, file: UploadFile = File(...), team_id: Optional[str] = Query(None),):
363+
async def upload_team_config(request: Request, file: UploadFile = File(...), team_id: Optional[str] = Query(None),):
364364
"""
365365
Upload and save a team configuration JSON file.
366366
@@ -534,7 +534,7 @@ async def upload_team_config_endpoint(request: Request, file: UploadFile = File(
534534

535535

536536
@app_v3.get("/team_configs")
537-
async def get_team_configs_endpoint(request: Request):
537+
async def get_team_configs(request: Request):
538538
"""
539539
Retrieve all team configurations for the current user.
540540
@@ -607,7 +607,7 @@ async def get_team_configs_endpoint(request: Request):
607607

608608

609609
@app_v3.get("/team_configs/{team_id}")
610-
async def get_team_config_by_id_endpoint(team_id: str, request: Request):
610+
async def get_team_config_by_id(team_id: str, request: Request):
611611
"""
612612
Retrieve a specific team configuration by ID.
613613
@@ -689,7 +689,7 @@ async def get_team_config_by_id_endpoint(team_id: str, request: Request):
689689

690690

691691
@app_v3.delete("/team_configs/{team_id}")
692-
async def delete_team_config_endpoint(team_id: str, request: Request):
692+
async def delete_team_config(team_id: str, request: Request):
693693
"""
694694
Delete a team configuration by ID.
695695
@@ -767,7 +767,7 @@ async def delete_team_config_endpoint(team_id: str, request: Request):
767767

768768

769769
@app_v3.get("/model_deployments")
770-
async def get_model_deployments_endpoint(request: Request):
770+
async def get_model_deployments(request: Request):
771771
"""
772772
Get information about available model deployments for debugging/validation.
773773
@@ -799,7 +799,7 @@ async def get_model_deployments_endpoint(request: Request):
799799

800800

801801
@app_v3.post("/select_team")
802-
async def select_team_endpoint(selection: TeamSelectionRequest, request: Request):
802+
async def select_team(selection: TeamSelectionRequest, request: Request):
803803
"""
804804
Select the current team for the user session.
805805
"""
@@ -883,7 +883,7 @@ async def select_team_endpoint(selection: TeamSelectionRequest, request: Request
883883

884884

885885
@app_v3.get("/search_indexes")
886-
async def get_search_indexes_endpoint(request: Request):
886+
async def get_search_indexes(request: Request):
887887
"""
888888
Get information about available search indexes for debugging/validation.
889889

src/frontend/src/components/content/TaskDetails.tsx

Lines changed: 0 additions & 88 deletions
Original file line numberDiff line numberDiff line change
@@ -149,94 +149,6 @@ const TaskDetails: React.FC<TaskDetailsProps> = ({
149149
<Caption1>{functionOrDetails}</Caption1>
150150
)}
151151
</Body1>
152-
<div className="task-details-action-buttons">
153-
{step.human_approval_status !== "accepted" &&
154-
step.human_approval_status !== "rejected" && (
155-
<>
156-
<Tooltip relationship="label" content={canInteract ? "Approve" : "You must first provide feedback to the planner"}>
157-
<Button
158-
icon={<Checkmark20Regular />}
159-
appearance="subtle"
160-
onClick={
161-
canInteract
162-
? async (e) => {
163-
// Disable buttons for this step
164-
setSteps((prev) =>
165-
prev.map((s) =>
166-
s.id === step.id
167-
? { ...s, _isActionLoading: true }
168-
: s
169-
)
170-
);
171-
try {
172-
await preOnApproved(step);
173-
} finally {
174-
// Remove loading state after API call
175-
setSteps((prev) =>
176-
prev.map((s) =>
177-
s.id === step.id
178-
? { ...s, _isActionLoading: false }
179-
: s
180-
)
181-
);
182-
}
183-
}
184-
: undefined
185-
}
186-
disabled={
187-
!canInteract ||
188-
!!step._isActionLoading
189-
}
190-
className={
191-
canInteract
192-
? "task-details-action-button"
193-
: "task-details-action-button-disabled"
194-
}
195-
/>
196-
</Tooltip>
197-
198-
<Tooltip relationship="label" content={canInteract ? "Reject" : "You must first provide feedback to the planner"}>
199-
<Button
200-
icon={<Dismiss20Regular />}
201-
appearance="subtle"
202-
onClick={
203-
canInteract
204-
? async (e) => {
205-
setSteps((prev) =>
206-
prev.map((s) =>
207-
s.id === step.id
208-
? { ...s, _isActionLoading: true }
209-
: s
210-
)
211-
);
212-
try {
213-
await preOnRejected(step);
214-
} finally {
215-
setSteps((prev) =>
216-
prev.map((s) =>
217-
s.id === step.id
218-
? { ...s, _isActionLoading: false }
219-
: s
220-
)
221-
);
222-
}
223-
}
224-
: undefined
225-
}
226-
disabled={
227-
!canInteract ||
228-
!!step._isActionLoading
229-
}
230-
className={
231-
canInteract
232-
? "task-details-action-button"
233-
: "task-details-action-button-disabled"
234-
}
235-
/>
236-
</Tooltip>
237-
</>
238-
)}
239-
</div>
240152
</div>
241153
</div>
242154
);

0 commit comments

Comments
 (0)