useSwarmInitialization.ts
hooks/useSwarmInitialization.ts
No strong subsystem tag
82
Lines
3151
Bytes
1
Exports
9
Imports
10
Keywords
What this is
This page documents one file from the repository and includes its full source so you can read it without leaving the docs site.
Beginner explanation
This file is one piece of the larger system. Its name, directory, imports, and exports show where it fits. Start by reading the exports and related files first.
How it is used
Start from the exports list and related files. Those are the easiest clues for where this file fits into the system.
Expert explanation
Architecturally, this file intersects with general runtime concerns. It contains 82 lines, 9 detected imports, and 1 detected exports.
Important relationships
Detected exports
useSwarmInitialization
Keywords
teamnameagentnamecontextsetappstatefirstmessageswarmagentidresumedutilshook
Detected imports
react../bootstrap/state.js../state/AppState.js../types/message.js../utils/agentSwarmsEnabled.js../utils/swarm/reconnection.js../utils/swarm/teamHelpers.js../utils/swarm/teammateInit.js../utils/teammate.js
Source notes
This page embeds the full file contents. Small or leaf files are still indexed honestly instead of being over-explained.
Full source
/**
* Swarm Initialization Hook
*
* Initializes swarm features: teammate hooks and context.
* Handles both fresh spawns and resumed teammate sessions.
*
* This hook is conditionally loaded to allow dead code elimination when swarms are disabled.
*/
import { useEffect } from 'react'
import { getSessionId } from '../bootstrap/state.js'
import type { AppState } from '../state/AppState.js'
import type { Message } from '../types/message.js'
import { isAgentSwarmsEnabled } from '../utils/agentSwarmsEnabled.js'
import { initializeTeammateContextFromSession } from '../utils/swarm/reconnection.js'
import { readTeamFile } from '../utils/swarm/teamHelpers.js'
import { initializeTeammateHooks } from '../utils/swarm/teammateInit.js'
import { getDynamicTeamContext } from '../utils/teammate.js'
type SetAppState = (f: (prevState: AppState) => AppState) => void
/**
* Hook that initializes swarm features when ENABLE_AGENT_SWARMS is true.
*
* Handles both:
* - Resumed teammate sessions (from --resume or /resume) where teamName/agentName
* are stored in transcript messages
* - Fresh spawns where context is read from environment variables
*/
export function useSwarmInitialization(
setAppState: SetAppState,
initialMessages: Message[] | undefined,
{ enabled = true }: { enabled?: boolean } = {},
): void {
useEffect(() => {
if (!enabled) return
if (isAgentSwarmsEnabled()) {
// Check if this is a resumed agent session (from --resume or /resume)
// Resumed sessions have teamName/agentName stored in transcript messages
const firstMessage = initialMessages?.[0]
const teamName =
firstMessage && 'teamName' in firstMessage
? (firstMessage.teamName as string | undefined)
: undefined
const agentName =
firstMessage && 'agentName' in firstMessage
? (firstMessage.agentName as string | undefined)
: undefined
if (teamName && agentName) {
// Resumed agent session - set up team context from stored info
initializeTeammateContextFromSession(setAppState, teamName, agentName)
// Get agentId from team file for hook initialization
const teamFile = readTeamFile(teamName)
const member = teamFile?.members.find(
(m: { name: string }) => m.name === agentName,
)
if (member) {
initializeTeammateHooks(setAppState, getSessionId(), {
teamName,
agentId: member.agentId,
agentName,
})
}
} else {
// Fresh spawn or standalone session
// teamContext is already computed in main.tsx via computeInitialTeamContext()
// and included in initialState, so we only need to initialize hooks here
const context = getDynamicTeamContext?.()
if (context?.teamName && context?.agentId && context?.agentName) {
initializeTeammateHooks(setAppState, getSessionId(), {
teamName: context.teamName,
agentId: context.agentId,
agentName: context.agentName,
})
}
}
}
}, [setAppState, initialMessages, enabled])
}