init
This commit is contained in:
@@ -0,0 +1,102 @@
|
||||
/**
|
||||
* In-Process Teammate Helpers
|
||||
*
|
||||
* Helper functions for in-process teammate integration.
|
||||
* Provides utilities to:
|
||||
* - Find task ID by agent name
|
||||
* - Handle plan approval responses
|
||||
* - Update awaitingPlanApproval state
|
||||
* - Detect permission-related messages
|
||||
*/
|
||||
|
||||
import type { AppState } from '../state/AppState.js'
|
||||
import {
|
||||
type InProcessTeammateTaskState,
|
||||
isInProcessTeammateTask,
|
||||
} from '../tasks/InProcessTeammateTask/types.js'
|
||||
import { updateTaskState } from './task/framework.js'
|
||||
import {
|
||||
isPermissionResponse,
|
||||
isSandboxPermissionResponse,
|
||||
type PlanApprovalResponseMessage,
|
||||
} from './teammateMailbox.js'
|
||||
|
||||
type SetAppState = (updater: (prev: AppState) => AppState) => void
|
||||
|
||||
/**
|
||||
* Find the task ID for an in-process teammate by agent name.
|
||||
*
|
||||
* @param agentName - The agent name (e.g., "researcher")
|
||||
* @param appState - Current AppState
|
||||
* @returns Task ID if found, undefined otherwise
|
||||
*/
|
||||
export function findInProcessTeammateTaskId(
|
||||
agentName: string,
|
||||
appState: AppState,
|
||||
): string | undefined {
|
||||
for (const task of Object.values(appState.tasks)) {
|
||||
if (
|
||||
isInProcessTeammateTask(task) &&
|
||||
task.identity.agentName === agentName
|
||||
) {
|
||||
return task.id
|
||||
}
|
||||
}
|
||||
return undefined
|
||||
}
|
||||
|
||||
/**
|
||||
* Set awaitingPlanApproval state for an in-process teammate.
|
||||
*
|
||||
* @param taskId - Task ID of the in-process teammate
|
||||
* @param setAppState - AppState setter
|
||||
* @param awaiting - Whether teammate is awaiting plan approval
|
||||
*/
|
||||
export function setAwaitingPlanApproval(
|
||||
taskId: string,
|
||||
setAppState: SetAppState,
|
||||
awaiting: boolean,
|
||||
): void {
|
||||
updateTaskState<InProcessTeammateTaskState>(taskId, setAppState, task => ({
|
||||
...task,
|
||||
awaitingPlanApproval: awaiting,
|
||||
}))
|
||||
}
|
||||
|
||||
/**
|
||||
* Handle plan approval response for an in-process teammate.
|
||||
* Called by the message callback when a plan_approval_response arrives.
|
||||
*
|
||||
* This resets awaitingPlanApproval to false. The permissionMode from the
|
||||
* response is handled separately by the agent loop (Task #11).
|
||||
*
|
||||
* @param taskId - Task ID of the in-process teammate
|
||||
* @param _response - The plan approval response message (for future use)
|
||||
* @param setAppState - AppState setter
|
||||
*/
|
||||
export function handlePlanApprovalResponse(
|
||||
taskId: string,
|
||||
_response: PlanApprovalResponseMessage,
|
||||
setAppState: SetAppState,
|
||||
): void {
|
||||
setAwaitingPlanApproval(taskId, setAppState, false)
|
||||
}
|
||||
|
||||
// ============ Permission Delegation Helpers ============
|
||||
|
||||
/**
|
||||
* Check if a message is a permission-related response.
|
||||
* Used by in-process teammate message handlers to detect and process
|
||||
* permission responses from the team leader.
|
||||
*
|
||||
* Handles both tool permissions and sandbox (network host) permissions.
|
||||
*
|
||||
* @param messageText - The raw message text to check
|
||||
* @returns true if the message is a permission response
|
||||
*/
|
||||
export function isPermissionRelatedResponse(messageText: string): boolean {
|
||||
return (
|
||||
!!isPermissionResponse(messageText) ||
|
||||
!!isSandboxPermissionResponse(messageText)
|
||||
)
|
||||
}
|
||||
Reference in New Issue
Block a user