MCPcopy
hub / github.com/codeaashu/claude-code / createSubagentContext

Function createSubagentContext

src/utils/forkedAgent.ts:345–462  ·  view source on GitHub ↗
(
  parentContext: ToolUseContext,
  overrides?: SubagentContextOverrides,
)

Source from the content-addressed store, hash-verified

343 * })
344 */
345export function createSubagentContext(
346 parentContext: ToolUseContext,
347 overrides?: SubagentContextOverrides,
348): ToolUseContext {
349 // Determine abortController: explicit override > share parent's > new child
350 const abortController =
351 overrides?.abortController ??
352 (overrides?.shareAbortController
353 ? parentContext.abortController
354 : createChildAbortController(parentContext.abortController))
355
356 // Determine getAppState - wrap to set shouldAvoidPermissionPrompts unless sharing abortController
357 // (if sharing abortController, it's an interactive agent that CAN show UI)
358 const getAppState: ToolUseContext['getAppState'] = overrides?.getAppState
359 ? overrides.getAppState
360 : overrides?.shareAbortController
361 ? parentContext.getAppState
362 : () => {
363 const state = parentContext.getAppState()
364 if (state.toolPermissionContext.shouldAvoidPermissionPrompts) {
365 return state
366 }
367 return {
368 ...state,
369 toolPermissionContext: {
370 ...state.toolPermissionContext,
371 shouldAvoidPermissionPrompts: true,
372 },
373 }
374 }
375
376 return {
377 // Mutable state - cloned by default to maintain isolation
378 // Clone overrides.readFileState if provided, otherwise clone from parent
379 readFileState: cloneFileStateCache(
380 overrides?.readFileState ?? parentContext.readFileState,
381 ),
382 nestedMemoryAttachmentTriggers: new Set<string>(),
383 loadedNestedMemoryPaths: new Set<string>(),
384 dynamicSkillDirTriggers: new Set<string>(),
385 // Per-subagent: tracks skills surfaced by discovery for was_discovered telemetry (SkillTool.ts:116)
386 discoveredSkillNames: new Set<string>(),
387 toolDecisions: undefined,
388 // Budget decisions: override > clone of parent > undefined (feature off).
389 //
390 // Clone by default (not fresh): cache-sharing forks process parent
391 // messages containing parent tool_use_ids. A fresh state would see
392 // them as unseen and make divergent replacement decisions → wire
393 // prefix differs → cache miss. A clone makes identical decisions →
394 // cache hit. For non-forking subagents the parent UUIDs never match
395 // — clone is a harmless no-op.
396 //
397 // Override: AgentTool resume (reconstructed from sidechain records)
398 // and inProcessRunner (per-teammate persistent loop state).
399 contentReplacementState:
400 overrides?.contentReplacementState ??
401 (parentContext.contentReplacementState
402 ? cloneContentReplacementState(parentContext.contentReplacementState)

Callers 4

runAgentFunction · 0.85
runForkedAgentFunction · 0.85
sessionMemory.tsFile · 0.85

Calls 5

cloneFileStateCacheFunction · 0.85
createAgentIdFunction · 0.85

Tested by

no test coverage detected