{
  "version": 3,
  "sources": ["../src/context-management.ts", "../src/context-tools.ts", "../src/context-window.ts", "../src/fingerprint.ts", "../src/notes-state.ts", "../src/recall-context.ts", "../src/settings.ts", "../src/pi-context-management.ts"],
  "sourcesContent": ["import { randomUUID } from \"node:crypto\";\nimport { realpathSync } from \"node:fs\";\nimport { join } from \"node:path\";\nimport { fileURLToPath } from \"node:url\";\nimport type { AgentMessage } from \"@earendil-works/pi-agent-core\";\nimport {\n  type AgentEndEvent,\n  type ExtensionAPI,\n  type ExtensionContext,\n  type SessionBeforeCompactEvent,\n  type SessionCompactEvent,\n  type SessionEntry,\n  sessionEntryToContextMessages,\n} from \"@earendil-works/pi-coding-agent\";\nimport {\n  CONTEXT_MANAGEMENT_TOOL_NAMES,\n  type ContextToolRuntime,\n  registerContextManagementTools,\n} from \"./context-tools.js\";\nimport {\n  activeContextManagementCompaction,\n  CONTEXT_CONTRACT_MESSAGE_TYPE,\n  CONTEXT_DEACTIVATION_MESSAGE_TYPE,\n  CONTEXT_DETAILS_KIND,\n  CONTEXT_STATE_ENTRY_TYPE,\n  CONTEXT_VERSION,\n  type ContextBranchScanBudget,\n  type ContextLineage,\n  compactionRetainedContext,\n  contextContract,\n  contextDeactivation,\n  createContextBranchScanBudget,\n  createContextContractMessage,\n  createContextManagementDetails,\n  createInitialContextState,\n  hasContextContract,\n  latestContextMode,\n  loadContextLineage,\n  parseContextManagementCompaction,\n  projectContextManagementContext,\n  reconcileContextContract,\n  visitContextBranchEntry,\n} from \"./context-window.js\";\nimport { createFingerprintBudget } from \"./fingerprint.js\";\nimport type { ContextManagementSettingsRuntime } from \"./settings.js\";\nimport { terminalText } from \"./terminal.js\";\n\nconst CONTINUATION_MESSAGE_TYPE = \"pi-context-management-continuation\";\nconst ROLLOVER_STATE_ENTRY_TYPE = \"pi-context-management-rollover\";\nconst START_NEW_CONTEXT_TOOL_NAME = \"context_management_start_new_context\";\nconst EXTENSION_ENTRY_PATH = realpathSync(join(fileURLToPath(new URL(\".\", import.meta.url)), \"index.ts\"));\n\ntype PendingRollover = {\n  requestId: string;\n  nextWindowId: string;\n  sessionId: string;\n  generation: number;\n  status: \"requested\" | \"compacting\" | \"completed\" | \"failed\";\n  turnStartedAfterRequest: boolean;\n  successfulTurnAfterRequest: boolean;\n  reason?: string;\n  errorMessage?: string;\n};\n\ntype SessionKey = ExtensionContext[\"sessionManager\"];\n\ninterface SessionState {\n  key: SessionKey;\n  generation: number;\n  sessionId: string;\n  lineage?: ContextLineage;\n  lineageFailed: boolean;\n  pending?: PendingRollover;\n  warned: boolean;\n  warnedUnavailableTools: boolean;\n  warnedProjectionFailure: boolean;\n  toolsAvailable: boolean;\n  removeToolsAtSettlement: boolean;\n  fallbackDeactivationPending: boolean;\n  fallbackActivationPending: boolean;\n  agentRunActive: boolean;\n  controller: AbortController;\n}\n\nfunction sameNames(left: readonly string[], right: readonly string[]): boolean {\n  return left.length === right.length && left.every((name, index) => name === right[index]);\n}\n\nfunction isOwnedToolSource(tool: { sourceInfo: { path: string } } | undefined): boolean {\n  if (!tool || tool.sourceInfo.path.startsWith(\"<\")) return false;\n  try {\n    return realpathSync(tool.sourceInfo.path) === EXTENSION_ENTRY_PATH;\n  } catch {\n    return false;\n  }\n}\n\nfunction isRecord(value: unknown): value is Record<string, unknown> {\n  return typeof value === \"object\" && value !== null && !Array.isArray(value);\n}\n\nfunction isIdentifier(value: unknown): value is string {\n  return typeof value === \"string\" && value.length >= 8 && value.length <= 128;\n}\n\nfunction contractMessage(lineage: ContextLineage) {\n  return {\n    customType: CONTEXT_CONTRACT_MESSAGE_TYPE,\n    content: contextContract(lineage),\n    display: false,\n    details: {\n      kind: CONTEXT_DETAILS_KIND,\n      version: CONTEXT_VERSION,\n      currentWindowId: lineage.currentWindowId,\n    },\n  };\n}\n\nfunction deactivationMessage() {\n  return {\n    customType: CONTEXT_DEACTIVATION_MESSAGE_TYPE,\n    content: contextDeactivation(),\n    display: false,\n    details: { kind: CONTEXT_DETAILS_KIND, version: CONTEXT_VERSION },\n  };\n}\n\nfunction deactivationAgentMessage(): AgentMessage {\n  return {\n    role: \"custom\",\n    ...deactivationMessage(),\n    timestamp: 0,\n  };\n}\n\ninterface CompactFailedEvent {\n  errorMessage?: string;\n  aborted: boolean;\n}\n\nfunction latestAssistantStopReason(messages: readonly AgentMessage[]): string | undefined {\n  for (let index = messages.length - 1; index >= 0; index -= 1) {\n    const message = messages[index];\n    if (message.role === \"assistant\") return message.stopReason;\n  }\n  return undefined;\n}\n\nfunction terminalRolloverRequestId(entry: SessionEntry): string | undefined {\n  if (entry.type === \"custom\" && entry.customType === ROLLOVER_STATE_ENTRY_TYPE) {\n    const data = entry.data;\n    return isRecord(data) &&\n      data.kind === CONTEXT_DETAILS_KIND &&\n      data.version === CONTEXT_VERSION &&\n      (data.status === \"cancelled\" || data.status === \"suppressed\") &&\n      isIdentifier(data.requestId)\n      ? data.requestId\n      : undefined;\n  }\n  const message = entry.type === \"message\" && entry.message.role === \"custom\" ? entry.message : undefined;\n  const customMessage = entry.type === \"custom_message\" ? entry : message;\n  if (\n    customMessage?.customType === CONTINUATION_MESSAGE_TYPE &&\n    isRecord(customMessage.details) &&\n    customMessage.details.kind === CONTEXT_DETAILS_KIND &&\n    customMessage.details.version === CONTEXT_VERSION &&\n    isIdentifier(customMessage.details.requestId)\n  ) {\n    return customMessage.details.requestId;\n  }\n  return undefined;\n}\n\nfunction restoredRollover(\n  entries: readonly SessionEntry[],\n  sessionId: string,\n  generation: number,\n  budget: ContextBranchScanBudget = createContextBranchScanBudget(),\n): PendingRollover | undefined {\n  const terminalRequests = new Set<string>();\n  const completedRequests = new Map<string, string>();\n  for (let index = entries.length - 1; index >= 0; index -= 1) {\n    visitContextBranchEntry(budget);\n    const entry = entries[index];\n    const terminalRequestId = terminalRolloverRequestId(entry);\n    if (terminalRequestId) terminalRequests.add(terminalRequestId);\n    if (entry.type === \"compaction\") {\n      const details = parseContextManagementCompaction(entry, budget);\n      if (details?.requestId) completedRequests.set(details.requestId, details.currentWindowId);\n      continue;\n    }\n    if (entry.type !== \"message\") continue;\n    const message = entry.message;\n    if (message.role !== \"toolResult\" || message.toolName !== START_NEW_CONTEXT_TOOL_NAME) continue;\n    const details = message.details;\n    if (\n      !isRecord(details) ||\n      details.kind !== CONTEXT_DETAILS_KIND ||\n      details.version !== CONTEXT_VERSION ||\n      details.status !== \"scheduled\" ||\n      !isIdentifier(details.requestId) ||\n      !isIdentifier(details.currentWindowId) ||\n      !isIdentifier(details.nextWindowId) ||\n      (details.reason !== undefined && (typeof details.reason !== \"string\" || details.reason.length > 512))\n    ) {\n      continue;\n    }\n    if (terminalRequests.has(details.requestId)) return undefined;\n    const completedWindowId = completedRequests.get(details.requestId);\n    return {\n      requestId: details.requestId,\n      nextWindowId: completedWindowId ?? details.nextWindowId,\n      sessionId,\n      generation,\n      status: completedWindowId ? \"completed\" : \"requested\",\n      turnStartedAfterRequest: false,\n      successfulTurnAfterRequest: false,\n      ...(typeof details.reason === \"string\" ? { reason: details.reason } : {}),\n    };\n  }\n  return undefined;\n}\n\nfunction boundedContextMessages(entries: readonly SessionEntry[]): AgentMessage[] {\n  const budget = createContextBranchScanBudget();\n  const messages: AgentMessage[] = [];\n  for (const entry of entries) {\n    visitContextBranchEntry(budget);\n    messages.push(...sessionEntryToContextMessages(entry));\n  }\n  return messages;\n}\n\nfunction branchContainsEntry(entries: readonly SessionEntry[], entryId: string): boolean {\n  const budget = createContextBranchScanBudget();\n  for (let index = entries.length - 1; index >= 0; index -= 1) {\n    visitContextBranchEntry(budget);\n    if (entries[index].id === entryId) return true;\n  }\n  return false;\n}\n\ntype BeforeCompactResult =\n  | { cancel: true }\n  | {\n      compaction: {\n        summary: string;\n        firstKeptEntryId: string;\n        tokensBefore: number;\n        details: unknown;\n      };\n    };\n\nexport interface ContextManager {\n  isEnabled(ctx: ExtensionContext): boolean;\n  startSession(ctx: ExtensionContext): void;\n  onSessionTree(ctx: ExtensionContext): void;\n  applySettings(ctx: ExtensionContext): void;\n  onInput(ctx: ExtensionContext): void;\n  beforeCompact(event: SessionBeforeCompactEvent, ctx: ExtensionContext): BeforeCompactResult | undefined;\n  projectContext(messages: readonly AgentMessage[], ctx: ExtensionContext): AgentMessage[] | undefined;\n  onCompact(event: SessionCompactEvent, ctx: ExtensionContext): void;\n  onCompactFailed(event: CompactFailedEvent, ctx: ExtensionContext): void;\n  onAgentStart(ctx: ExtensionContext): void;\n  onAgentEnd(event: AgentEndEvent, ctx: ExtensionContext): void;\n  onTurnStart(ctx: ExtensionContext): void;\n  onAgentSettled(ctx: ExtensionContext): void;\n  shutdown(ctx: ExtensionContext): void;\n}\n\nexport function createContextManager(\n  pi: ExtensionAPI,\n  settingsRuntime: ContextManagementSettingsRuntime,\n): ContextManager {\n  const states = new Map<SessionKey, SessionState>();\n  let nextGeneration = 0;\n  const isConfigured = () => settingsRuntime.get().settings.enabled;\n\n  const stateFor = (ctx: ExtensionContext): SessionState | undefined => {\n    const state = states.get(ctx.sessionManager);\n    return state && !state.controller.signal.aborted && state.sessionId === ctx.sessionManager.getSessionId()\n      ? state\n      : undefined;\n  };\n\n  const inspectToolUnit = () => {\n    const available = new Map(pi.getAllTools().map((tool) => [tool.name, tool]));\n    const ownedNames = new Set<string>(\n      CONTEXT_MANAGEMENT_TOOL_NAMES.filter((name) => isOwnedToolSource(available.get(name))),\n    );\n    const activeNames = new Set(pi.getActiveTools());\n    const unavailableNames = CONTEXT_MANAGEMENT_TOOL_NAMES.filter((name) => !ownedNames.has(name));\n    const inactiveNames = CONTEXT_MANAGEMENT_TOOL_NAMES.filter(\n      (name) => ownedNames.has(name) && !activeNames.has(name),\n    );\n    return {\n      ownedNames,\n      unavailableNames,\n      inactiveNames,\n      complete: unavailableNames.length === 0 && inactiveNames.length === 0,\n    };\n  };\n\n  const enabledFor = (state: SessionState) =>\n    (isConfigured() || state.removeToolsAtSettlement) && state.toolsAvailable && inspectToolUnit().complete;\n\n  const isOwned = (state: SessionState, ctx: ExtensionContext, request?: PendingRollover) =>\n    stateFor(ctx) === state &&\n    (!request ||\n      (request.sessionId === state.sessionId &&\n        request.generation === state.generation &&\n        state.pending?.requestId === request.requestId));\n\n  const removeOwnedTools = (ownedNames: ReadonlySet<string>) => {\n    const current = pi.getActiveTools();\n    const next = current.filter((name) => !ownedNames.has(name));\n    if (!sameNames(current, next)) pi.setActiveTools(next);\n    for (const state of states.values()) state.toolsAvailable = false;\n  };\n\n  const warnToolUnitUnavailable = (\n    state: SessionState,\n    ctx: ExtensionContext,\n    unavailableNames: readonly string[],\n    inactiveNames: readonly string[],\n  ) => {\n    if (state.warnedUnavailableTools || !ctx.hasUI) return;\n    state.warnedUnavailableTools = true;\n    const names = [...unavailableNames, ...inactiveNames];\n    ctx.ui.notify(\n      `Experimental context management could not activate because these tool names are unavailable, inactive, or owned by another extension: ${names.join(\", \")}. Pi-native compaction remains active.`,\n      \"warning\",\n    );\n  };\n\n  const hasDeferredToolRemoval = () => [...states.values()].some((state) => state.removeToolsAtSettlement);\n\n  const reconcileTools = (state: SessionState, activate: boolean, ctx: ExtensionContext): boolean => {\n    const inspection = inspectToolUnit();\n    const available = activate && inspection.unavailableNames.length === 0;\n    const current = pi.getActiveTools();\n    const next = available\n      ? [...current, ...inspection.inactiveNames]\n      : current.filter((name) => !inspection.ownedNames.has(name));\n    if (!sameNames(current, next)) pi.setActiveTools(next);\n    for (const candidate of states.values()) {\n      candidate.toolsAvailable =\n        available && !candidate.lineageFailed && (candidate === state || candidate.lineage !== undefined);\n    }\n    if (activate && !available) {\n      warnToolUnitUnavailable(state, ctx, inspection.unavailableNames, inspection.inactiveNames);\n    }\n    return available;\n  };\n\n  const deactivateIncompleteToolUnit = (\n    state: SessionState,\n    ctx: ExtensionContext,\n    publishCurrentDeactivation = true,\n  ): boolean => {\n    const inspection = inspectToolUnit();\n    if (inspection.complete) return false;\n    let branchIsActive = false;\n    for (const candidate of states.values()) {\n      if (candidate.controller.signal.aborted || candidate.sessionId !== candidate.key.getSessionId()) continue;\n      const candidateBranchIsActive = latestContextMode(candidate.key.getBranch()) === \"active\";\n      if (candidate === state) branchIsActive = candidateBranchIsActive;\n      candidate.fallbackDeactivationPending = candidateBranchIsActive;\n      candidate.fallbackActivationPending = false;\n      candidate.removeToolsAtSettlement = false;\n      if (candidate.pending?.status === \"requested\" || candidate.pending?.status === \"compacting\") {\n        candidate.pending.status = \"failed\";\n        candidate.pending.errorMessage = \"Experimental context management tool unit became incomplete during rollover.\";\n      }\n    }\n    if (branchIsActive && publishCurrentDeactivation) {\n      pi.sendMessage(deactivationMessage(), { triggerTurn: false });\n    }\n    removeOwnedTools(inspection.ownedNames);\n    warnToolUnitUnavailable(state, ctx, inspection.unavailableNames, inspection.inactiveNames);\n    return branchIsActive;\n  };\n\n  const ensureLineage = (state: SessionState, ctx: ExtensionContext): ContextLineage => {\n    let lineage: ContextLineage;\n    try {\n      const persisted = state.lineage ?? loadContextLineage(ctx.sessionManager.getBranch());\n      if (persisted) {\n        lineage = persisted;\n      } else {\n        const initial = createInitialContextState();\n        pi.appendEntry(CONTEXT_STATE_ENTRY_TYPE, initial);\n        lineage = initial;\n      }\n    } catch (error) {\n      state.lineageFailed = true;\n      state.toolsAvailable = false;\n      throw error;\n    }\n    state.lineage = lineage;\n    state.lineageFailed = false;\n    state.toolsAvailable = (isConfigured() || state.removeToolsAtSettlement) && inspectToolUnit().complete;\n    return lineage;\n  };\n\n  const warnEnabled = (state: SessionState, ctx: ExtensionContext) => {\n    if (state.warned || !ctx.hasUI) return;\n    state.warned = true;\n    ctx.ui.notify(\n      \"Experimental context management is active. Context rollover does not create a summary; preserve important information with context_management_update_notes.\",\n      \"warning\",\n    );\n  };\n\n  const applySettings = (ctx: ExtensionContext) => {\n    const state = stateFor(ctx);\n    if (!state) return;\n    const branch = ctx.sessionManager.getBranch();\n    const runIsActive = state.agentRunActive || ctx.signal !== undefined;\n    state.agentRunActive = runIsActive;\n    if (!isConfigured()) {\n      const inspection = inspectToolUnit();\n      for (const candidate of states.values()) {\n        candidate.fallbackActivationPending = false;\n        const candidateRunIsActive = candidate === state ? runIsActive : candidate.agentRunActive;\n        if (candidateRunIsActive && candidate.toolsAvailable && inspection.complete) {\n          candidate.removeToolsAtSettlement = true;\n          candidate.fallbackDeactivationPending = false;\n          continue;\n        }\n        candidate.removeToolsAtSettlement = false;\n        const branchIsActive =\n          !candidate.controller.signal.aborted &&\n          candidate.sessionId === candidate.key.getSessionId() &&\n          latestContextMode(candidate.key.getBranch()) === \"active\";\n        candidate.fallbackDeactivationPending = branchIsActive && (candidate !== state || candidateRunIsActive);\n        if (branchIsActive && candidate === state && !candidateRunIsActive) {\n          pi.sendMessage(deactivationMessage(), { triggerTurn: false });\n        }\n      }\n      reconcileTools(state, hasDeferredToolRemoval(), ctx);\n      return;\n    }\n    const contractAlreadyActiveOrQueued = state.removeToolsAtSettlement && !state.fallbackDeactivationPending;\n    const deactivationAlreadyPending = state.fallbackDeactivationPending;\n    const toolsWereAvailable = state.toolsAvailable;\n    for (const candidate of states.values()) {\n      candidate.removeToolsAtSettlement = false;\n      candidate.fallbackDeactivationPending = false;\n      candidate.fallbackActivationPending = false;\n    }\n    if (!reconcileTools(state, true, ctx)) {\n      deactivateIncompleteToolUnit(state, ctx);\n      if (runIsActive && (toolsWereAvailable || contractAlreadyActiveOrQueued || deactivationAlreadyPending)) {\n        state.fallbackDeactivationPending = true;\n      }\n      return;\n    }\n    let activeLineage: ContextLineage;\n    try {\n      activeLineage = ensureLineage(state, ctx);\n    } catch (error) {\n      state.toolsAvailable = false;\n      const healthySessionRemains = [...states.values()].some(\n        (candidate) =>\n          candidate !== state &&\n          candidate.toolsAvailable &&\n          !candidate.controller.signal.aborted &&\n          candidate.sessionId === candidate.key.getSessionId(),\n      );\n      if (!healthySessionRemains) reconcileTools(state, false, ctx);\n      throw error;\n    }\n    for (const candidate of states.values()) {\n      if (\n        candidate !== state &&\n        candidate.lineage !== undefined &&\n        !candidate.controller.signal.aborted &&\n        candidate.sessionId === candidate.key.getSessionId() &&\n        latestContextMode(candidate.key.getBranch()) !== \"active\"\n      ) {\n        candidate.fallbackActivationPending = true;\n      }\n    }\n    const messages = boundedContextMessages(branch);\n    if (\n      deactivationAlreadyPending ||\n      (!contractAlreadyActiveOrQueued &&\n        (latestContextMode(branch) !== \"active\" || !hasContextContract(messages, activeLineage)))\n    ) {\n      pi.sendMessage(contractMessage(activeLineage), { triggerTurn: false });\n    }\n    state.fallbackActivationPending = false;\n    warnEnabled(state, ctx);\n  };\n\n  const requestNewContext: ContextToolRuntime[\"requestNewContext\"] = (ctx, input) => {\n    const state = stateFor(ctx);\n    if (!state) throw new Error(\"The context session was replaced; retry in the active session\");\n    if (!isConfigured()) {\n      throw new Error(\"Experimental context management is deactivating; retry after enabling it\");\n    }\n    if (state.pending) throw new Error(\"A context rollover is already pending\");\n    const activeLineage = ensureLineage(state, ctx);\n    state.pending = {\n      requestId: randomUUID(),\n      nextWindowId: randomUUID(),\n      sessionId: state.sessionId,\n      generation: state.generation,\n      status: \"requested\",\n      turnStartedAfterRequest: false,\n      successfulTurnAfterRequest: false,\n      ...(input.reason ? { reason: input.reason } : {}),\n    };\n    return {\n      requestId: state.pending.requestId,\n      currentWindowId: activeLineage.currentWindowId,\n      nextWindowId: state.pending.nextWindowId,\n      ...(state.pending.reason ? { reason: state.pending.reason } : {}),\n    };\n  };\n\n  registerContextManagementTools(pi, {\n    isEnabled(ctx) {\n      const state = stateFor(ctx);\n      return state ? enabledFor(state) : false;\n    },\n    firstWindowId(ctx) {\n      return stateFor(ctx)?.lineage?.firstWindowId;\n    },\n    requestNewContext,\n  });\n\n  const continueAfterRollover = (state: SessionState, ctx: ExtensionContext, request: PendingRollover) => {\n    if (!isOwned(state, ctx, request) || request.status !== \"completed\") return;\n    const current = state.lineage;\n    const contextToolsAvailable = enabledFor(state);\n    state.pending = undefined;\n    if (!current) return;\n    pi.sendMessage(\n      {\n        customType: CONTINUATION_MESSAGE_TYPE,\n        content: [\n          `Context window ${current.currentWindowId} is now active.`,\n          request.reason ? `Rollover reason: ${request.reason}` : undefined,\n          contextToolsAvailable\n            ? \"Continue the interrupted task. Use context_management_recall_context for older details and do not assume an automatic summary exists.\"\n            : \"Continue the interrupted task. The experimental context tools became unavailable; do not assume an automatic summary or local recall is available.\",\n        ]\n          .filter((line): line is string => Boolean(line))\n          .join(\"\\n\"),\n        display: false,\n        details: {\n          kind: CONTEXT_DETAILS_KIND,\n          version: CONTEXT_VERSION,\n          requestId: request.requestId,\n          currentWindowId: current.currentWindowId,\n        },\n      },\n      { triggerTurn: true },\n    );\n  };\n\n  const failRollover = (state: SessionState, ctx: ExtensionContext, request: PendingRollover, message: string) => {\n    if (!isOwned(state, ctx, request)) return;\n    state.pending = undefined;\n    const safeMessage = terminalText(message).slice(0, 2_000);\n    if (ctx.hasUI) ctx.ui.notify(safeMessage, \"warning\");\n    pi.sendMessage(\n      {\n        customType: CONTINUATION_MESSAGE_TYPE,\n        content: `The requested experimental context rollover failed. Continue with Pi's active fallback context. ${safeMessage}`,\n        display: false,\n        details: {\n          kind: CONTEXT_DETAILS_KIND,\n          version: CONTEXT_VERSION,\n          requestId: request.requestId,\n          failed: true,\n        },\n      },\n      request.successfulTurnAfterRequest\n        ? { triggerTurn: false }\n        : ctx.isIdle()\n          ? { triggerTurn: true }\n          : { triggerTurn: true, deliverAs: \"followUp\" },\n    );\n  };\n\n  const finishRolloverWithoutContinuation = (\n    state: SessionState,\n    ctx: ExtensionContext,\n    request: PendingRollover,\n    status: \"cancelled\" | \"suppressed\",\n  ) => {\n    if (!isOwned(state, ctx, request)) return;\n    pi.appendEntry(ROLLOVER_STATE_ENTRY_TYPE, {\n      kind: CONTEXT_DETAILS_KIND,\n      version: CONTEXT_VERSION,\n      requestId: request.requestId,\n      status,\n    });\n    if (isOwned(state, ctx, request)) state.pending = undefined;\n  };\n\n  const settle = (state: SessionState, ctx: ExtensionContext) => {\n    if (!isOwned(state, ctx)) return;\n    state.agentRunActive = ctx.signal !== undefined;\n    if (state.agentRunActive) return;\n    if (state.removeToolsAtSettlement || state.fallbackDeactivationPending) {\n      state.removeToolsAtSettlement = false;\n      state.fallbackDeactivationPending = false;\n      if (!isConfigured()) {\n        if (latestContextMode(ctx.sessionManager.getBranch()) !== \"inactive\") {\n          pi.sendMessage(deactivationMessage(), { triggerTurn: false });\n        }\n        reconcileTools(state, hasDeferredToolRemoval(), ctx);\n      }\n    }\n    const request = state.pending;\n    if (!request || !isOwned(state, ctx, request)) return;\n    if (!isConfigured() && (request.status === \"requested\" || request.status === \"compacting\")) {\n      request.status = \"failed\";\n      request.errorMessage = \"Experimental context management was disabled before rollover completed.\";\n    }\n    if (request.status === \"completed\") {\n      if (request.successfulTurnAfterRequest) {\n        finishRolloverWithoutContinuation(state, ctx, request, \"suppressed\");\n      } else {\n        continueAfterRollover(state, ctx, request);\n      }\n      return;\n    }\n    if (request.status === \"failed\") {\n      failRollover(state, ctx, request, request.errorMessage ?? \"Compaction failed.\");\n      return;\n    }\n    if (request.status !== \"requested\") return;\n    request.status = \"compacting\";\n    ctx.compact({\n      onComplete: (result) => {\n        if (!isOwned(state, ctx, request)) return;\n        if (request.status === \"failed\") {\n          failRollover(\n            state,\n            ctx,\n            request,\n            request.errorMessage ?? \"Compaction completed without the requested context marker.\",\n          );\n          return;\n        }\n        const details = parseContextManagementCompaction(result);\n        if (request.status !== \"completed\" || !details || details.requestId !== request.requestId) {\n          failRollover(state, ctx, request, \"Compaction completed without the requested context marker.\");\n          return;\n        }\n        state.lineage = details;\n        if (request.successfulTurnAfterRequest) {\n          finishRolloverWithoutContinuation(state, ctx, request, \"suppressed\");\n        } else {\n          continueAfterRollover(state, ctx, request);\n        }\n      },\n      onError: (error) => failRollover(state, ctx, request, error.message),\n    });\n  };\n\n  return {\n    isEnabled(ctx) {\n      const state = stateFor(ctx);\n      return state ? enabledFor(state) : false;\n    },\n    startSession(ctx) {\n      const previous = states.get(ctx.sessionManager);\n      previous?.controller.abort();\n      const generation = ++nextGeneration;\n      const branch = ctx.sessionManager.getBranch();\n      const sessionId = ctx.sessionManager.getSessionId();\n      const recoveryBudget = createContextBranchScanBudget();\n      const state: SessionState = {\n        key: ctx.sessionManager,\n        generation,\n        sessionId,\n        lineage: loadContextLineage(branch, recoveryBudget),\n        lineageFailed: false,\n        pending: restoredRollover(branch, sessionId, generation, recoveryBudget),\n        warned: false,\n        warnedUnavailableTools: false,\n        warnedProjectionFailure: false,\n        toolsAvailable: false,\n        removeToolsAtSettlement: false,\n        fallbackDeactivationPending: false,\n        fallbackActivationPending: false,\n        agentRunActive: false,\n        controller: new AbortController(),\n      };\n      states.set(ctx.sessionManager, state);\n      applySettings(ctx);\n      if (state.pending && ctx.isIdle()) settle(state, ctx);\n    },\n    onSessionTree(ctx) {\n      const previous = stateFor(ctx);\n      if (!previous) return;\n      previous.controller.abort();\n      const generation = ++nextGeneration;\n      const branch = ctx.sessionManager.getBranch();\n      const recoveryBudget = createContextBranchScanBudget();\n      const state: SessionState = {\n        ...previous,\n        generation,\n        lineage: loadContextLineage(branch, recoveryBudget),\n        lineageFailed: false,\n        pending: restoredRollover(branch, previous.sessionId, generation, recoveryBudget),\n        removeToolsAtSettlement: false,\n        fallbackDeactivationPending: false,\n        fallbackActivationPending: false,\n        agentRunActive: false,\n        controller: new AbortController(),\n      };\n      states.set(ctx.sessionManager, state);\n      applySettings(ctx);\n      if (state.pending && ctx.isIdle()) settle(state, ctx);\n    },\n    applySettings,\n    onInput(ctx) {\n      const state = stateFor(ctx);\n      if (!state || !ctx.isIdle()) return;\n      if (isConfigured() && state.fallbackActivationPending && enabledFor(state)) {\n        const activeLineage = ensureLineage(state, ctx);\n        if (latestContextMode(ctx.sessionManager.getBranch()) !== \"active\") {\n          pi.sendMessage(contractMessage(activeLineage), { triggerTurn: false });\n        }\n        state.fallbackActivationPending = false;\n        return;\n      }\n      if (isConfigured() || !state.fallbackDeactivationPending) return;\n      if (latestContextMode(ctx.sessionManager.getBranch()) !== \"inactive\") {\n        pi.sendMessage(deactivationMessage(), { triggerTurn: false });\n      }\n      state.fallbackDeactivationPending = false;\n    },\n    beforeCompact(event, ctx) {\n      const state = stateFor(ctx);\n      if (!state || event.signal.aborted) return undefined;\n      if (state.toolsAvailable && !inspectToolUnit().complete) deactivateIncompleteToolUnit(state, ctx);\n      if (!enabledFor(state)) return undefined;\n      const request =\n        state.pending?.status === \"requested\" || state.pending?.status === \"compacting\" ? state.pending : undefined;\n      try {\n        const activeLineage = ensureLineage(state, ctx);\n        const fingerprintBudget = createFingerprintBudget();\n        const details = createContextManagementDetails(\n          {\n            lineage: activeLineage,\n            ...compactionRetainedContext(event, fingerprintBudget),\n            reason: event.reason,\n            ...(request ? { requestId: request.requestId, windowId: request.nextWindowId } : {}),\n          },\n          fingerprintBudget,\n        );\n        if (request) request.status = \"compacting\";\n        return {\n          compaction: {\n            summary: contextContract(details),\n            firstKeptEntryId: event.preparation.firstKeptEntryId,\n            tokensBefore: event.preparation.tokensBefore,\n            details,\n          },\n        };\n      } catch (error) {\n        const message = terminalText(error instanceof Error ? error.message : String(error)).slice(0, 2_000);\n        if (request && isOwned(state, ctx, request)) {\n          request.status = \"failed\";\n          request.errorMessage = message;\n        }\n        if (ctx.hasUI) ctx.ui.notify(`Experimental context compaction was cancelled. ${message}`, \"warning\");\n        return { cancel: true };\n      }\n    },\n    projectContext(messages, ctx) {\n      const state = stateFor(ctx);\n      if (!state) return undefined;\n      if (state.toolsAvailable && !inspectToolUnit().complete) {\n        deactivateIncompleteToolUnit(state, ctx, false);\n      }\n      if (!enabledFor(state)) {\n        if (state.fallbackDeactivationPending) {\n          if (latestContextMode(ctx.sessionManager.getBranch()) !== \"inactive\") {\n            pi.sendMessage(deactivationMessage(), { triggerTurn: false });\n            state.fallbackDeactivationPending = false;\n            return [...messages, deactivationAgentMessage()];\n          }\n          state.fallbackDeactivationPending = false;\n        }\n        return undefined;\n      }\n      const branch = ctx.sessionManager.getBranch();\n      try {\n        const activationPending = state.fallbackActivationPending && latestContextMode(branch) !== \"active\";\n        const activeLineage = state.lineage ?? loadContextLineage(branch);\n        if (!activeLineage) return undefined;\n        const compaction = activeContextManagementCompaction(branch);\n        if (compaction) {\n          const projected = projectContextManagementContext(messages, compaction.entry, compaction.details);\n          if (!projected) return undefined;\n          state.fallbackActivationPending = false;\n          if (activationPending) {\n            pi.sendMessage(contractMessage(compaction.details), { triggerTurn: false });\n            return [...projected, createContextContractMessage(compaction.details)];\n          }\n          return reconcileContextContract(projected, compaction.details);\n        }\n        state.fallbackActivationPending = false;\n        if (activationPending) {\n          pi.sendMessage(contractMessage(activeLineage), { triggerTurn: false });\n          return [...messages, createContextContractMessage(activeLineage)];\n        }\n        return hasContextContract(messages, activeLineage)\n          ? undefined\n          : reconcileContextContract(messages, activeLineage);\n      } catch (error) {\n        if (!state.warnedProjectionFailure && ctx.hasUI) {\n          state.warnedProjectionFailure = true;\n          ctx.ui.notify(\n            `Experimental context projection kept Pi's persisted context unchanged. ${terminalText(error instanceof Error ? error.message : String(error))}`,\n            \"warning\",\n          );\n        }\n        return undefined;\n      }\n    },\n    onCompact(event, ctx) {\n      const state = stateFor(ctx);\n      if (!state || !branchContainsEntry(ctx.sessionManager.getBranch(), event.compactionEntry.id)) {\n        return;\n      }\n      const details = parseContextManagementCompaction(event.compactionEntry);\n      const request = state.pending;\n      if (request?.status !== \"compacting\" || !isOwned(state, ctx, request)) {\n        if (details) state.lineage = details;\n        return;\n      }\n      if (!details || details.requestId !== request.requestId) {\n        request.status = \"failed\";\n        request.errorMessage = \"Compaction completed without the requested context marker.\";\n        return;\n      }\n      state.lineage = details;\n      request.status = \"completed\";\n    },\n    onCompactFailed(event, ctx) {\n      const state = stateFor(ctx);\n      const request = state?.pending;\n      if (!state || request?.status !== \"compacting\" || !isOwned(state, ctx, request)) return;\n      if (event.aborted) {\n        finishRolloverWithoutContinuation(state, ctx, request, \"cancelled\");\n        return;\n      }\n      request.status = \"failed\";\n      request.errorMessage = event.errorMessage ?? \"Compaction failed.\";\n    },\n    onAgentStart(ctx) {\n      const state = stateFor(ctx);\n      if (state) state.agentRunActive = true;\n    },\n    onAgentEnd(event, ctx) {\n      const state = stateFor(ctx);\n      const request = state?.pending;\n      if (!state || !request || !isOwned(state, ctx, request)) return;\n      const stopReason = latestAssistantStopReason(event.messages);\n      if (ctx.signal?.aborted || stopReason === \"aborted\") {\n        finishRolloverWithoutContinuation(state, ctx, request, \"cancelled\");\n        return;\n      }\n      if (request.turnStartedAfterRequest && (stopReason === \"stop\" || stopReason === \"toolUse\")) {\n        request.successfulTurnAfterRequest = true;\n      }\n    },\n    onTurnStart(ctx) {\n      const state = stateFor(ctx);\n      const request = state?.pending;\n      if (state && request && isOwned(state, ctx, request)) request.turnStartedAfterRequest = true;\n    },\n    onAgentSettled(ctx) {\n      const state = stateFor(ctx);\n      if (state) settle(state, ctx);\n    },\n    shutdown(ctx) {\n      const state = states.get(ctx.sessionManager);\n      if (!state) return;\n      state.controller.abort();\n      states.delete(ctx.sessionManager);\n      if (!isConfigured()) reconcileTools(state, hasDeferredToolRemoval(), ctx);\n    },\n  };\n}\n", "import { StringEnum } from \"@earendil-works/pi-ai\";\nimport type { ExtensionAPI, ExtensionContext } from \"@earendil-works/pi-coding-agent\";\nimport { Type } from \"typebox\";\nimport { CONTEXT_DETAILS_KIND, CONTEXT_VERSION, loadContextLineage } from \"./context-window.js\";\nimport { createNoteMutation, NOTES_ENTRY_TYPE } from \"./notes-state.js\";\nimport { recallContext } from \"./recall-context.js\";\nimport { terminalText } from \"./terminal.js\";\n\nexport const CONTEXT_MANAGEMENT_TOOL_NAMES = [\n  \"context_management_start_new_context\",\n  \"context_management_get_context_remaining\",\n  \"context_management_recall_context\",\n  \"context_management_update_notes\",\n] as const;\n\nexport const CONTEXT_MANAGEMENT_TOOL_DESCRIPTIONS = {\n  context_management_start_new_context:\n    \"Request a fresh summary-free context window after the current agent run settles. Save important durable information with context_management_update_notes first. This tool changes context state but does not read or write memory itself.\",\n  context_management_get_context_remaining:\n    \"Inspect the active model context window and estimated remaining tokens without changing context state.\",\n  context_management_recall_context:\n    \"Read-only access to branch-local conversation history or context notes. List items, read one stable item ID, or search text. Use the returned cursor to continue bounded results.\",\n  context_management_update_notes:\n    \"Write or append one branch-local context note. This tool changes notes only; use context_management_recall_context with source notes to read them.\",\n} as const satisfies Record<(typeof CONTEXT_MANAGEMENT_TOOL_NAMES)[number], string>;\n\nconst RECALL_SOURCES = [\"history\", \"notes\"] as const;\nconst RECALL_ACTIONS = [\"list\", \"read\", \"search\"] as const;\nconst NOTE_ACTIONS = [\"write\", \"append\"] as const;\n\nexport interface ContextToolRuntime {\n  isEnabled(ctx: ExtensionContext): boolean;\n  firstWindowId(ctx: ExtensionContext): string | undefined;\n  requestNewContext(\n    ctx: ExtensionContext,\n    input: { toolCallId: string; reason?: string },\n  ): { requestId: string; currentWindowId: string; nextWindowId: string; reason?: string };\n}\n\nfunction requireEnabled(runtime: ContextToolRuntime, ctx: ExtensionContext): void {\n  if (!runtime.isEnabled(ctx)) {\n    throw new Error(\"Experimental context management is disabled; enable it in pi-context-management settings first\");\n  }\n}\n\nfunction throwIfAborted(signal?: AbortSignal): void {\n  if (signal?.aborted) throw new DOMException(\"Context tool operation aborted\", \"AbortError\");\n}\n\nfunction result(value: unknown, details?: unknown) {\n  return {\n    content: [{ type: \"text\" as const, text: terminalText(JSON.stringify(value, null, 2)) }],\n    details,\n  };\n}\n\nexport function registerContextManagementTools(pi: ExtensionAPI, runtime: ContextToolRuntime): void {\n  pi.registerTool({\n    name: \"context_management_start_new_context\",\n    label: \"Start New Context\",\n    description: CONTEXT_MANAGEMENT_TOOL_DESCRIPTIONS.context_management_start_new_context,\n    parameters: Type.Object(\n      {\n        reason: Type.Optional(\n          Type.String({\n            description: \"Short reason for starting a fresh context window\",\n            maxLength: 512,\n          }),\n        ),\n      },\n      { additionalProperties: false },\n    ),\n    executionMode: \"sequential\",\n    async execute(toolCallId, params, signal, _onUpdate, ctx) {\n      requireEnabled(runtime, ctx);\n      throwIfAborted(signal);\n      const requested = runtime.requestNewContext(ctx, {\n        toolCallId,\n        ...(params.reason ? { reason: params.reason } : {}),\n      });\n      throwIfAborted(signal);\n      return {\n        ...result(\n          {\n            status: \"scheduled\",\n            requestId: requested.requestId,\n            currentWindowId: requested.currentWindowId,\n            message:\n              \"The current run will end before rollover. A hidden continuation follows the compaction attempt unless a later successful turn already continued the work.\",\n          },\n          {\n            kind: CONTEXT_DETAILS_KIND,\n            version: CONTEXT_VERSION,\n            ...requested,\n            status: \"scheduled\",\n          },\n        ),\n        terminate: true,\n      };\n    },\n  });\n\n  pi.registerTool({\n    name: \"context_management_get_context_remaining\",\n    label: \"Get Context Remaining\",\n    description: CONTEXT_MANAGEMENT_TOOL_DESCRIPTIONS.context_management_get_context_remaining,\n    parameters: Type.Object({}, { additionalProperties: false }),\n    async execute(_toolCallId, _params, signal, _onUpdate, ctx) {\n      requireEnabled(runtime, ctx);\n      throwIfAborted(signal);\n      const usage = ctx.getContextUsage();\n      const lineage = loadContextLineage(ctx.sessionManager.getBranch());\n      if (!usage) {\n        return result({\n          available: false,\n          ...(lineage ? { currentWindowId: lineage.currentWindowId } : {}),\n        });\n      }\n      const remainingTokens = usage.tokens === null ? null : Math.max(0, usage.contextWindow - usage.tokens);\n      return result({\n        available: usage.tokens !== null,\n        ...(lineage ? { currentWindowId: lineage.currentWindowId } : {}),\n        contextWindow: usage.contextWindow,\n        usedTokens: usage.tokens,\n        remainingTokens,\n        remainingPercent: usage.percent === null ? null : Math.max(0, 100 - usage.percent),\n      });\n    },\n  });\n\n  pi.registerTool({\n    name: \"context_management_recall_context\",\n    label: \"Recall Context\",\n    description: CONTEXT_MANAGEMENT_TOOL_DESCRIPTIONS.context_management_recall_context,\n    parameters: Type.Object(\n      {\n        source: StringEnum(RECALL_SOURCES, {\n          description: \"Read conversation history or context notes\",\n        }),\n        action: StringEnum(RECALL_ACTIONS, {\n          description: \"List items, read one ID, or search text\",\n        }),\n        id: Type.Optional(Type.String({ description: \"Stable history item ID or note name\", maxLength: 256 })),\n        query: Type.Optional(Type.String({ description: \"Case-insensitive search text\", maxLength: 512 })),\n        cursor: Type.Optional(Type.String({ description: \"Cursor returned by an earlier result\", maxLength: 12 })),\n      },\n      { additionalProperties: false },\n    ),\n    async execute(toolCallId, params, signal, _onUpdate, ctx) {\n      requireEnabled(runtime, ctx);\n      throwIfAborted(signal);\n      const recalled = recallContext(ctx.sessionManager.getBranch(), params, toolCallId, {\n        firstWindowId: runtime.firstWindowId(ctx),\n      });\n      throwIfAborted(signal);\n      return {\n        content: [{ type: \"text\", text: recalled.text }],\n        details: recalled.details,\n      };\n    },\n  });\n\n  pi.registerTool({\n    name: \"context_management_update_notes\",\n    label: \"Update Context Notes\",\n    description: CONTEXT_MANAGEMENT_TOOL_DESCRIPTIONS.context_management_update_notes,\n    parameters: Type.Object(\n      {\n        action: StringEnum(NOTE_ACTIONS, {\n          description: \"Replace a note or append content exactly as supplied\",\n        }),\n        note: Type.String({ description: \"Note name\", minLength: 1, maxLength: 128 }),\n        content: Type.String({\n          description: \"Note content written or appended exactly as supplied\",\n          minLength: 1,\n          maxLength: 16_384,\n        }),\n      },\n      { additionalProperties: false },\n    ),\n    executionMode: \"sequential\",\n    async execute(_toolCallId, params, signal, _onUpdate, ctx) {\n      requireEnabled(runtime, ctx);\n      throwIfAborted(signal);\n      const updated = createNoteMutation(ctx.sessionManager.getBranch(), params);\n      throwIfAborted(signal);\n      pi.appendEntry(NOTES_ENTRY_TYPE, updated.mutation);\n      return result(\n        {\n          status: \"updated\",\n          action: updated.mutation.action,\n          note: updated.mutation.note,\n          bytes: Buffer.byteLength(updated.notes.get(updated.mutation.note) ?? \"\", \"utf8\"),\n        },\n        {\n          version: updated.mutation.version,\n          action: updated.mutation.action,\n          note: updated.mutation.note,\n        },\n      );\n    },\n  });\n}\n", "import { randomUUID } from \"node:crypto\";\nimport type { AgentMessage } from \"@earendil-works/pi-agent-core\";\nimport type { CompactionEntry, SessionBeforeCompactEvent, SessionEntry } from \"@earendil-works/pi-coding-agent\";\nimport { buildContextEntries, sessionEntryToContextMessages } from \"@earendil-works/pi-coding-agent\";\nimport { createFingerprintBudget, type FingerprintBudget, fingerprintMessage } from \"./fingerprint.js\";\n\nexport const CONTEXT_STATE_ENTRY_TYPE = \"pi-context-management-state\";\nexport const CONTEXT_CONTRACT_MESSAGE_TYPE = \"pi-context-management-contract\";\nexport const CONTEXT_DEACTIVATION_MESSAGE_TYPE = \"pi-context-management-deactivation\";\nexport const CONTEXT_DETAILS_KIND = \"pi-context-management-window\";\nexport const CONTEXT_VERSION = 1;\nconst MAX_DETAILS_BYTES = 8 * 1024 * 1024;\nconst MAX_FINGERPRINTS = 100_000;\nexport const MAX_CONTEXT_BRANCH_ENTRY_VISITS = 100_000;\nexport const MAX_CONTEXT_BRANCH_SCAN_UNITS = 8 * 1024 * 1024;\n\nexport interface ContextBranchScanBudget {\n  remainingVisits: number;\n  remainingScanUnits: number;\n}\n\nexport function createContextBranchScanBudget(): ContextBranchScanBudget {\n  return {\n    remainingVisits: MAX_CONTEXT_BRANCH_ENTRY_VISITS,\n    remainingScanUnits: MAX_CONTEXT_BRANCH_SCAN_UNITS,\n  };\n}\n\nexport function visitContextBranchEntry(budget: ContextBranchScanBudget): void {\n  if (budget.remainingVisits <= 0) {\n    throw new Error(\"context_management context branch traversal exceeded its entry limit\");\n  }\n  budget.remainingVisits -= 1;\n}\n\nfunction consumeContextBranchScan(budget: ContextBranchScanBudget, units: number): void {\n  if (!Number.isSafeInteger(units) || units < 0 || units > budget.remainingScanUnits) {\n    throw new Error(\"context_management context branch traversal exceeded its scan limit\");\n  }\n  budget.remainingScanUnits -= units;\n}\n\nexport interface ContextLineage {\n  firstWindowId: string;\n  previousWindowId?: string;\n  currentWindowId: string;\n}\n\nexport interface ContextStateEntryData extends ContextLineage {\n  kind: typeof CONTEXT_DETAILS_KIND;\n  version: typeof CONTEXT_VERSION;\n}\n\nexport interface ContextManagementDetails extends ContextLineage {\n  kind: typeof CONTEXT_DETAILS_KIND;\n  version: typeof CONTEXT_VERSION;\n  reason: SessionBeforeCompactEvent[\"reason\"];\n  requestId?: string;\n  keptMessageFingerprints: string[];\n  retryResponseFingerprint?: string;\n  createdAt: string;\n}\n\nfunction isRecord(value: unknown): value is Record<string, unknown> {\n  return typeof value === \"object\" && value !== null && !Array.isArray(value);\n}\n\nfunction isIdentifier(value: unknown): value is string {\n  return typeof value === \"string\" && value.length >= 8 && value.length <= 128;\n}\n\nfunction parseLineage(value: Record<string, unknown>): ContextLineage | undefined {\n  if (!isIdentifier(value.firstWindowId) || !isIdentifier(value.currentWindowId)) return undefined;\n  if (value.previousWindowId !== undefined && !isIdentifier(value.previousWindowId)) return undefined;\n  return {\n    firstWindowId: value.firstWindowId,\n    ...(typeof value.previousWindowId === \"string\" ? { previousWindowId: value.previousWindowId } : {}),\n    currentWindowId: value.currentWindowId,\n  };\n}\n\nexport function parseContextState(value: unknown): ContextStateEntryData | undefined {\n  if (!isRecord(value)) return undefined;\n  const lineage = parseLineage(value);\n  if (\n    !lineage ||\n    value.kind !== CONTEXT_DETAILS_KIND ||\n    value.version !== CONTEXT_VERSION ||\n    value.previousWindowId !== undefined ||\n    lineage.firstWindowId !== lineage.currentWindowId\n  ) {\n    return undefined;\n  }\n  return { kind: CONTEXT_DETAILS_KIND, version: CONTEXT_VERSION, ...lineage };\n}\n\nexport function parseContextManagementDetails(\n  value: unknown,\n  budget?: ContextBranchScanBudget,\n): ContextManagementDetails | undefined {\n  if (!isRecord(value) || value.kind !== CONTEXT_DETAILS_KIND || value.version !== CONTEXT_VERSION) return undefined;\n  const lineage = parseLineage(value);\n  if (\n    !lineage?.previousWindowId ||\n    lineage.currentWindowId === lineage.previousWindowId ||\n    (value.reason !== \"manual\" && value.reason !== \"threshold\" && value.reason !== \"overflow\") ||\n    (value.requestId !== undefined && !isIdentifier(value.requestId)) ||\n    !Array.isArray(value.keptMessageFingerprints) ||\n    value.keptMessageFingerprints.length > MAX_FINGERPRINTS ||\n    (value.retryResponseFingerprint !== undefined &&\n      (typeof value.retryResponseFingerprint !== \"string\" || value.retryResponseFingerprint.length !== 64)) ||\n    typeof value.createdAt !== \"string\" ||\n    value.createdAt.length > 64\n  ) {\n    return undefined;\n  }\n  const scanUnits =\n    1 +\n    lineage.firstWindowId.length +\n    lineage.previousWindowId.length +\n    lineage.currentWindowId.length +\n    value.createdAt.length +\n    (typeof value.requestId === \"string\" ? value.requestId.length : 0) +\n    (typeof value.retryResponseFingerprint === \"string\" ? value.retryResponseFingerprint.length : 0) +\n    value.keptMessageFingerprints.length +\n    value.keptMessageFingerprints.reduce(\n      (total, fingerprint) => total + (typeof fingerprint === \"string\" ? fingerprint.length : 1),\n      0,\n    );\n  const scanBudget = budget ?? createContextBranchScanBudget();\n  try {\n    consumeContextBranchScan(scanBudget, scanUnits);\n  } catch (error) {\n    if (budget) throw error;\n    return undefined;\n  }\n  if (\n    !value.keptMessageFingerprints.every(\n      (fingerprint) => typeof fingerprint === \"string\" && /^[a-f0-9]{64}$/.test(fingerprint),\n    ) ||\n    (typeof value.retryResponseFingerprint === \"string\" && !/^[a-f0-9]{64}$/.test(value.retryResponseFingerprint))\n  ) {\n    return undefined;\n  }\n  const details: ContextManagementDetails = {\n    kind: CONTEXT_DETAILS_KIND,\n    version: CONTEXT_VERSION,\n    ...lineage,\n    reason: value.reason,\n    ...(typeof value.requestId === \"string\" ? { requestId: value.requestId } : {}),\n    keptMessageFingerprints: [...value.keptMessageFingerprints],\n    ...(typeof value.retryResponseFingerprint === \"string\"\n      ? { retryResponseFingerprint: value.retryResponseFingerprint }\n      : {}),\n    createdAt: value.createdAt,\n  };\n  return Buffer.byteLength(JSON.stringify(details), \"utf8\") <= MAX_DETAILS_BYTES ? details : undefined;\n}\n\nexport function parseContextManagementCompaction(\n  entry: Pick<CompactionEntry, \"summary\" | \"details\">,\n  budget?: ContextBranchScanBudget,\n): ContextManagementDetails | undefined {\n  const details = parseContextManagementDetails(entry.details, budget);\n  return details && entry.summary === contextContract(details) ? details : undefined;\n}\n\nexport function createInitialContextState(windowId = randomUUID()): ContextStateEntryData {\n  return {\n    kind: CONTEXT_DETAILS_KIND,\n    version: CONTEXT_VERSION,\n    firstWindowId: windowId,\n    currentWindowId: windowId,\n  };\n}\n\nexport function loadContextLineage(\n  entries: readonly SessionEntry[],\n  budget: ContextBranchScanBudget = createContextBranchScanBudget(),\n): ContextLineage | undefined {\n  for (let index = entries.length - 1; index >= 0; index -= 1) {\n    visitContextBranchEntry(budget);\n    const entry = entries[index];\n    if (entry.type === \"compaction\") {\n      const details = parseContextManagementCompaction(entry, budget);\n      if (details) return details;\n      continue;\n    }\n    if (entry.type === \"custom\" && entry.customType === CONTEXT_STATE_ENTRY_TYPE) {\n      const state = parseContextState(entry.data);\n      if (state) return state;\n    }\n  }\n  return undefined;\n}\n\nexport function activeContextManagementCompaction(\n  entries: readonly SessionEntry[],\n  budget: ContextBranchScanBudget = createContextBranchScanBudget(),\n):\n  | {\n      entry: CompactionEntry<ContextManagementDetails>;\n      details: ContextManagementDetails;\n    }\n  | undefined {\n  for (let index = entries.length - 1; index >= 0; index -= 1) {\n    visitContextBranchEntry(budget);\n    const entry = entries[index];\n    if (entry.type !== \"compaction\") continue;\n    const details = parseContextManagementCompaction(entry, budget);\n    return details ? { entry: entry as CompactionEntry<ContextManagementDetails>, details } : undefined;\n  }\n  return undefined;\n}\n\nexport function contextContract(lineage: ContextLineage): string {\n  return [\n    `[PI_CONTEXT_MANAGEMENT_WINDOW:${lineage.currentWindowId}]`,\n    \"Experimental Pi-native context management is active.\",\n    lineage.previousWindowId\n      ? `The previous context window was ${lineage.previousWindowId}.`\n      : \"This is the first context window in this session.\",\n    \"Use context_management_get_context_remaining to inspect capacity, context_management_recall_context to retrieve older history or notes, and context_management_update_notes to preserve durable working memory.\",\n    \"Call context_management_start_new_context when a fresh context is needed. Important information is not summarized automatically.\",\n  ].join(\"\\n\");\n}\n\nexport function contextDeactivation(): string {\n  return [\n    \"Experimental Pi-native context management is no longer active.\",\n    \"Its context tools are unavailable. Continue with Pi's active compaction strategy and do not call context_management_start_new_context, context_management_get_context_remaining, context_management_recall_context, or context_management_update_notes.\",\n  ].join(\"\\n\");\n}\n\nexport function latestContextMode(\n  entries: readonly SessionEntry[],\n  budget: ContextBranchScanBudget = createContextBranchScanBudget(),\n): \"active\" | \"inactive\" | undefined {\n  let mode: \"active\" | \"inactive\" | undefined;\n  for (const _entry of entries) visitContextBranchEntry(budget);\n  const leafId = entries.at(-1)?.id ?? null;\n  for (const entry of buildContextEntries([...entries], leafId)) {\n    if (entry.type === \"compaction\" && parseContextManagementCompaction(entry, budget)) mode = \"active\";\n    for (const message of sessionEntryToContextMessages(entry)) {\n      if (message.role !== \"custom\") continue;\n      if (message.customType === CONTEXT_CONTRACT_MESSAGE_TYPE) mode = \"active\";\n      if (message.customType === CONTEXT_DEACTIVATION_MESSAGE_TYPE && message.content === contextDeactivation()) {\n        mode = \"inactive\";\n      }\n    }\n  }\n  return mode;\n}\n\nexport function createContextContractMessage(lineage: ContextLineage): AgentMessage {\n  return {\n    role: \"custom\",\n    customType: CONTEXT_CONTRACT_MESSAGE_TYPE,\n    content: contextContract(lineage),\n    display: false,\n    details: {\n      kind: CONTEXT_DETAILS_KIND,\n      version: CONTEXT_VERSION,\n      currentWindowId: lineage.currentWindowId,\n    },\n    timestamp: 0,\n  };\n}\n\nexport function hasContextContract(messages: readonly AgentMessage[], lineage: ContextLineage): boolean {\n  const expected = contextContract(lineage);\n  return messages.some(\n    (message) =>\n      (message.role === \"custom\" &&\n        message.customType === CONTEXT_CONTRACT_MESSAGE_TYPE &&\n        message.content === expected) ||\n      (message.role === \"compactionSummary\" && message.summary === expected),\n  );\n}\n\nexport function reconcileContextContract(messages: readonly AgentMessage[], lineage: ContextLineage): AgentMessage[] {\n  if (hasContextContract(messages, lineage)) return [...messages];\n  return [...messages, createContextContractMessage(lineage)];\n}\n\nexport function compactionRetainedContext(\n  event: SessionBeforeCompactEvent,\n  fingerprintBudget: FingerprintBudget = createFingerprintBudget(),\n): {\n  keptMessages: AgentMessage[];\n  retryResponseFingerprint?: string;\n} {\n  const leafId = event.branchEntries.at(-1)?.id ?? null;\n  const contextEntries = buildContextEntries(event.branchEntries, leafId);\n  const keptIndex = contextEntries.findIndex((entry) => entry.id === event.preparation.firstKeptEntryId);\n  if (keptIndex < 0) {\n    throw new Error(\"Pi compaction cut point is not present in the active context\");\n  }\n  const keptMessages = contextEntries.slice(keptIndex).flatMap(sessionEntryToContextMessages);\n  const lastMessage = keptMessages.at(-1);\n  if (\n    event.willRetry &&\n    lastMessage?.role === \"assistant\" &&\n    (lastMessage.stopReason === \"error\" || lastMessage.stopReason === \"length\")\n  ) {\n    return {\n      keptMessages: keptMessages.slice(0, -1),\n      retryResponseFingerprint: fingerprintMessage(lastMessage, fingerprintBudget),\n    };\n  }\n  return { keptMessages };\n}\n\nexport function createContextManagementDetails(\n  input: {\n    lineage: ContextLineage;\n    keptMessages: readonly AgentMessage[];\n    retryResponseFingerprint?: string;\n    reason: SessionBeforeCompactEvent[\"reason\"];\n    requestId?: string;\n    windowId?: string;\n    createdAt?: string;\n  },\n  fingerprintBudget: FingerprintBudget = createFingerprintBudget(),\n): ContextManagementDetails {\n  const currentWindowId = input.windowId ?? randomUUID();\n  const details: ContextManagementDetails = {\n    kind: CONTEXT_DETAILS_KIND,\n    version: CONTEXT_VERSION,\n    firstWindowId: input.lineage.firstWindowId,\n    previousWindowId: input.lineage.currentWindowId,\n    currentWindowId,\n    reason: input.reason,\n    ...(input.requestId ? { requestId: input.requestId } : {}),\n    keptMessageFingerprints: input.keptMessages.map((message) => fingerprintMessage(message, fingerprintBudget)),\n    ...(input.retryResponseFingerprint ? { retryResponseFingerprint: input.retryResponseFingerprint } : {}),\n    createdAt: input.createdAt ?? new Date().toISOString(),\n  };\n  const parsed = parseContextManagementDetails(details);\n  if (!parsed) throw new Error(\"Created invalid context-management details\");\n  return parsed;\n}\n\nfunction isOlderCompactionSummary(message: AgentMessage, timestamp: number): boolean {\n  return (\n    message.role === \"compactionSummary\" &&\n    Number.isFinite(message.timestamp) &&\n    Number.isFinite(timestamp) &&\n    message.timestamp < timestamp\n  );\n}\n\nexport function projectContextManagementContext(\n  messages: readonly AgentMessage[],\n  entry: CompactionEntry<ContextManagementDetails>,\n  details: ContextManagementDetails,\n): AgentMessage[] | undefined {\n  const fingerprintBudget = createFingerprintBudget();\n  const expectedSummary = contextContract(details);\n  if (entry.summary !== expectedSummary) return undefined;\n  const summaryIndex = messages.findIndex(\n    (message) => message.role === \"compactionSummary\" && message.summary === expectedSummary,\n  );\n  if (summaryIndex < 0) return undefined;\n  const timestamp = messages[summaryIndex].timestamp;\n  let messageIndex = summaryIndex + 1;\n  let fingerprintIndex = 0;\n  while (fingerprintIndex < details.keptMessageFingerprints.length) {\n    if (messageIndex >= messages.length) return undefined;\n    const message = messages[messageIndex];\n    if (fingerprintMessage(message, fingerprintBudget) === details.keptMessageFingerprints[fingerprintIndex]) {\n      messageIndex += 1;\n      fingerprintIndex += 1;\n      continue;\n    }\n    if (isOlderCompactionSummary(message, timestamp)) {\n      messageIndex += 1;\n      continue;\n    }\n    return undefined;\n  }\n  while (messageIndex < messages.length && isOlderCompactionSummary(messages[messageIndex], timestamp)) {\n    messageIndex += 1;\n  }\n  if (\n    details.retryResponseFingerprint &&\n    messageIndex < messages.length &&\n    fingerprintMessage(messages[messageIndex], fingerprintBudget) === details.retryResponseFingerprint\n  ) {\n    messageIndex += 1;\n  }\n  return [...messages.slice(0, summaryIndex + 1), ...messages.slice(messageIndex)];\n}\n", "import { createHash } from \"node:crypto\";\nimport type { AgentMessage } from \"@earendil-works/pi-agent-core\";\n\nconst MAX_FINGERPRINT_DEPTH = 512;\nexport const MAX_FINGERPRINT_OPERATION_UNITS = 4 * 1024 * 1024;\nexport const MAX_FINGERPRINT_OPERATION_BYTES = 8 * 1024 * 1024;\n\nexport interface FingerprintBudget {\n  remainingUnits: number;\n  remainingBytes: number;\n}\n\nexport function createFingerprintBudget(): FingerprintBudget {\n  return {\n    remainingUnits: MAX_FINGERPRINT_OPERATION_UNITS,\n    remainingBytes: MAX_FINGERPRINT_OPERATION_BYTES,\n  };\n}\n\ntype JsonContainer = unknown[] | Record<string, unknown>;\n\ninterface CloneTask {\n  source: unknown;\n  parent: JsonContainer;\n  key: string | number;\n  depth: number;\n}\n\nfunction failLimit(): never {\n  throw new Error(\"Context message fingerprint exceeded its traversal limit\");\n}\n\nfunction assign(parent: JsonContainer, key: string | number, value: unknown): void {\n  if (Array.isArray(parent)) parent[key as number] = value;\n  else parent[String(key)] = value;\n}\n\nfunction stableValue(value: unknown, operationBudget: FingerprintBudget): unknown {\n  const root: Record<string, unknown> = {};\n  const tasks: CloneTask[] = [{ source: value, parent: root, key: \"value\", depth: 0 }];\n  let remainingUnits = MAX_FINGERPRINT_OPERATION_UNITS;\n  const consume = (units: number) => {\n    if (!Number.isSafeInteger(units) || units < 0 || units > remainingUnits || units > operationBudget.remainingUnits) {\n      failLimit();\n    }\n    remainingUnits -= units;\n    operationBudget.remainingUnits -= units;\n  };\n\n  while (tasks.length > 0) {\n    const task = tasks.pop();\n    if (!task) break;\n    consume(1);\n    const source = task.source;\n    if (typeof source === \"string\") consume(source.length);\n    if (typeof source !== \"object\" || source === null) {\n      if (typeof source === \"bigint\") throw new Error(\"Context message fingerprint cannot serialize bigint values\");\n      assign(task.parent, task.key, source);\n      continue;\n    }\n    if (task.depth >= MAX_FINGERPRINT_DEPTH) failLimit();\n    if (Array.isArray(source)) {\n      consume(source.length);\n      const target = new Array<unknown>(source.length);\n      assign(task.parent, task.key, target);\n      for (let index = source.length - 1; index >= 0; index -= 1) {\n        tasks.push({ source: source[index], parent: target, key: index, depth: task.depth + 1 });\n      }\n      continue;\n    }\n\n    const keys: string[] = [];\n    for (const key in source) {\n      if (!Object.hasOwn(source, key)) continue;\n      consume(1 + key.length);\n      keys.push(key);\n    }\n    keys.sort((left, right) => (left < right ? -1 : left > right ? 1 : 0));\n    const target: Record<string, unknown> = {};\n    assign(task.parent, task.key, target);\n    for (let index = keys.length - 1; index >= 0; index -= 1) {\n      const key = keys[index];\n      tasks.push({\n        source: (source as Record<string, unknown>)[key],\n        parent: target,\n        key,\n        depth: task.depth + 1,\n      });\n    }\n  }\n  return root.value;\n}\n\nexport function fingerprintMessage(\n  message: AgentMessage,\n  operationBudget: FingerprintBudget = createFingerprintBudget(),\n): string {\n  const serialized = JSON.stringify(stableValue(message, operationBudget));\n  if (serialized === undefined) failLimit();\n  const bytes = Buffer.byteLength(serialized, \"utf8\");\n  if (bytes > MAX_FINGERPRINT_OPERATION_BYTES || bytes > operationBudget.remainingBytes) failLimit();\n  operationBudget.remainingBytes -= bytes;\n  return createHash(\"sha256\").update(serialized).digest(\"hex\");\n}\n", "import { stripVTControlCharacters } from \"node:util\";\nimport type { SessionEntry } from \"@earendil-works/pi-coding-agent\";\n\nexport const NOTES_ENTRY_TYPE = \"pi-context-management-note\";\nexport const NOTES_VERSION = 1;\nexport const MAX_NOTE_NAME_LENGTH = 128;\nexport const MAX_NOTE_MUTATION_BYTES = 16 * 1024;\nexport const MAX_NOTE_COUNT = 64;\nexport const MAX_NOTES_BYTES = 256 * 1024;\nexport const MAX_NOTE_BRANCH_ENTRY_VISITS = 100_000;\nexport const MAX_NOTE_REPLAY_SCAN_UNITS = 4 * 1024 * 1024;\n\nexport type NoteAction = \"write\" | \"append\";\n\nexport interface NoteMutation {\n  version: typeof NOTES_VERSION;\n  action: NoteAction;\n  note: string;\n  content: string;\n}\n\nexport interface ContextNote {\n  name: string;\n  content: string;\n}\n\nfunction isRecord(value: unknown): value is Record<string, unknown> {\n  return typeof value === \"object\" && value !== null && !Array.isArray(value);\n}\n\nfunction bytes(value: string): number {\n  return Buffer.byteLength(value, \"utf8\");\n}\n\nfunction validNoteName(value: unknown): value is string {\n  return (\n    typeof value === \"string\" &&\n    value.length > 0 &&\n    value.length <= MAX_NOTE_NAME_LENGTH &&\n    value.trim() === value &&\n    stripVTControlCharacters(value) === value &&\n    !Array.from(value).some((character) => {\n      const codePoint = character.codePointAt(0) ?? 0;\n      return codePoint < 32 || (codePoint >= 127 && codePoint <= 159);\n    })\n  );\n}\n\nexport function parseNoteMutation(value: unknown): NoteMutation | undefined {\n  if (!isRecord(value)) return undefined;\n  if (\n    value.version !== NOTES_VERSION ||\n    (value.action !== \"write\" && value.action !== \"append\") ||\n    !validNoteName(value.note) ||\n    typeof value.content !== \"string\" ||\n    value.content.length === 0 ||\n    value.content.length > MAX_NOTE_MUTATION_BYTES ||\n    bytes(value.content) > MAX_NOTE_MUTATION_BYTES\n  ) {\n    return undefined;\n  }\n  return {\n    version: NOTES_VERSION,\n    action: value.action,\n    note: value.note,\n    content: value.content,\n  };\n}\n\nexport function loadNotes(entries: readonly SessionEntry[]): Map<string, string> {\n  const notes = new Map<string, string>();\n  const noteContentBytes = new Map<string, number>();\n  let totalBytes = 0;\n  let remainingEntries = MAX_NOTE_BRANCH_ENTRY_VISITS;\n  let remainingScanUnits = MAX_NOTE_REPLAY_SCAN_UNITS;\n  for (const entry of entries) {\n    if (remainingEntries <= 0) {\n      throw new Error(\"context_management notes branch traversal exceeded its entry limit\");\n    }\n    remainingEntries -= 1;\n    if (entry.type !== \"custom\" || entry.customType !== NOTES_ENTRY_TYPE) continue;\n    const data = entry.data;\n    const scanUnits =\n      1 +\n      (isRecord(data) && typeof data.note === \"string\" ? data.note.length : 0) +\n      (isRecord(data) && typeof data.content === \"string\" ? data.content.length : 0);\n    if (scanUnits > remainingScanUnits) {\n      throw new Error(\"context_management notes replay exceeded its scan limit\");\n    }\n    remainingScanUnits -= scanUnits;\n    const mutation = parseNoteMutation(data);\n    if (!mutation) continue;\n\n    const previous = notes.get(mutation.note);\n    const previousContentBytes = noteContentBytes.get(mutation.note) ?? 0;\n    const nameBytes = bytes(mutation.note);\n    const mutationContentBytes = bytes(mutation.content);\n    const nextContentBytes =\n      mutation.action === \"append\" ? previousContentBytes + mutationContentBytes : mutationContentBytes;\n    const nextTotalBytes =\n      totalBytes - (previous === undefined ? 0 : nameBytes + previousContentBytes) + nameBytes + nextContentBytes;\n    if ((previous === undefined && notes.size >= MAX_NOTE_COUNT) || nextTotalBytes > MAX_NOTES_BYTES) continue;\n\n    notes.set(mutation.note, mutation.action === \"append\" ? `${previous ?? \"\"}${mutation.content}` : mutation.content);\n    noteContentBytes.set(mutation.note, nextContentBytes);\n    totalBytes = nextTotalBytes;\n  }\n  return notes;\n}\n\nfunction totalNotesBytes(notes: ReadonlyMap<string, string>): number {\n  let total = 0;\n  for (const [name, content] of notes) total += bytes(name) + bytes(content);\n  return total;\n}\n\nexport function createNoteMutation(\n  entries: readonly SessionEntry[],\n  input: { action: NoteAction; note: string; content: string },\n): { mutation: NoteMutation; notes: Map<string, string> } {\n  const mutation = parseNoteMutation({ version: NOTES_VERSION, ...input });\n  if (!mutation) {\n    throw new Error(\n      `Invalid note mutation; names must be 1-${MAX_NOTE_NAME_LENGTH} characters without terminal controls and content must be 1-${MAX_NOTE_MUTATION_BYTES} UTF-8 bytes`,\n    );\n  }\n  const notes = loadNotes(entries);\n  const exists = notes.has(mutation.note);\n  const next = mutation.action === \"append\" ? `${notes.get(mutation.note) ?? \"\"}${mutation.content}` : mutation.content;\n  if (!exists && notes.size >= MAX_NOTE_COUNT) {\n    throw new Error(`Context notes are limited to ${MAX_NOTE_COUNT} names`);\n  }\n  notes.set(mutation.note, next);\n  if (totalNotesBytes(notes) > MAX_NOTES_BYTES) {\n    throw new Error(`Context notes exceed the ${MAX_NOTES_BYTES}-byte active-state limit`);\n  }\n  return { mutation, notes };\n}\n\nexport function sortedNotes(entries: readonly SessionEntry[]): ContextNote[] {\n  return [...loadNotes(entries)]\n    .map(([name, content]) => ({ name, content }))\n    .sort((left, right) => left.name.localeCompare(right.name));\n}\n", "import { stripVTControlCharacters } from \"node:util\";\nimport type { AgentMessage } from \"@earendil-works/pi-agent-core\";\nimport { type SessionEntry, sessionEntryToContextMessages } from \"@earendil-works/pi-coding-agent\";\nimport { createContextBranchScanBudget, parseContextManagementCompaction } from \"./context-window.js\";\nimport { sortedNotes } from \"./notes-state.js\";\n\nexport const MAX_RECALL_QUERY_LENGTH = 512;\nexport const MAX_RECALL_RESULT_BYTES = 32 * 1024;\nexport const MAX_RECALL_MATCHES = 20;\nexport const MAX_HISTORY_BRANCH_ENTRY_VISITS = 100_000;\nconst MAX_INDEXED_MESSAGE_CHARS = 256 * 1024;\n// Bound source work separately so empty structures and removable terminal controls cannot bypass the limit.\nconst MAX_SCANNED_MESSAGE_UNITS = 4 * MAX_INDEXED_MESSAGE_CHARS;\nconst MAX_HISTORY_SEARCH_SCAN_UNITS = 4 * MAX_SCANNED_MESSAGE_UNITS;\nconst MAX_HISTORY_READ_SCAN_UNITS = MAX_HISTORY_SEARCH_SCAN_UNITS;\nconst MAX_HISTORY_READ_DEPTH = 512;\nconst READ_CHUNK_BYTES = 12 * 1024;\n\nexport type RecallSource = \"history\" | \"notes\";\nexport type RecallAction = \"list\" | \"read\" | \"search\";\n\nexport interface RecallContextInput {\n  source: RecallSource;\n  action: RecallAction;\n  id?: string;\n  query?: string;\n  cursor?: string;\n}\n\nexport interface RecallContextLimits {\n  firstWindowId?: string;\n  historyDetailScanUnits?: number;\n  historySearchScanUnits?: number;\n}\n\ninterface HistoryMessageItem {\n  id: string;\n  windowId?: string;\n  role: string;\n  message: AgentMessage;\n}\n\ninterface HistoryTraversalBudget {\n  remainingVisits: number;\n}\n\nfunction visitHistoryEntry(budget: HistoryTraversalBudget): void {\n  if (budget.remainingVisits <= 0) {\n    throw new Error(\"context_management_recall_context history branch traversal exceeded its entry limit\");\n  }\n  budget.remainingVisits -= 1;\n}\n\nfunction parseCursor(cursor: string | undefined): number {\n  if (cursor === undefined) return 0;\n  if (!/^\\d{1,12}$/.test(cursor)) throw new Error(\"context_management_recall_context cursor is invalid\");\n  return Number.parseInt(cursor, 10);\n}\n\nfunction messagePayload(message: AgentMessage): unknown {\n  switch (message.role) {\n    case \"compactionSummary\":\n      return { summary: message.summary };\n    case \"branchSummary\":\n      return { summary: message.summary };\n    case \"custom\":\n      return { customType: message.customType, content: message.content };\n    case \"toolResult\":\n      return {\n        toolName: message.toolName,\n        toolCallId: message.toolCallId,\n        content: message.content,\n        isError: message.isError,\n      };\n    default: {\n      const candidate = message as unknown as Record<string, unknown>;\n      return Object.hasOwn(candidate, \"content\")\n        ? { content: candidate.content }\n        : {\n            command: candidate.command,\n            output: candidate.output,\n            exitCode: candidate.exitCode,\n          };\n    }\n  }\n}\n\nfunction serializeMessage(message: AgentMessage): string {\n  let remainingUnits = MAX_HISTORY_READ_SCAN_UNITS;\n  const depths = new WeakMap<object, number>();\n  const serialized = JSON.stringify(\n    messagePayload(message),\n    function boundedReplacer(this: unknown, key, value: unknown) {\n      const holderDepth = typeof this === \"object\" && this !== null ? depths.get(this) : undefined;\n      const depth = key === \"\" && holderDepth === undefined ? 0 : (holderDepth ?? -1) + 1;\n      const units = 1 + key.length + (typeof value === \"string\" ? value.length : 0);\n      if (depth > MAX_HISTORY_READ_DEPTH || units > remainingUnits) {\n        throw new Error(\"context_management_recall_context history read exceeded its scan limit\");\n      }\n      remainingUnits -= units;\n      if (typeof value === \"object\" && value !== null) depths.set(value, depth);\n      return value;\n    },\n  );\n  if (serialized === undefined) {\n    throw new Error(\"context_management_recall_context selected history payload is not serializable\");\n  }\n  return JSON.stringify(sanitizeJsonValue(JSON.parse(serialized)));\n}\n\nfunction isRecord(value: unknown): value is Record<string, unknown> {\n  return typeof value === \"object\" && value !== null && !Array.isArray(value);\n}\n\nconst INDEXED_CONTENT = Symbol(\"pi-context-management-indexed-content\");\n\ninterface IndexedContent {\n  [INDEXED_CONTENT]: true;\n  value: unknown;\n}\n\nfunction indexedContent(value: unknown): IndexedContent {\n  return { [INDEXED_CONTENT]: true, value };\n}\n\nfunction isIndexedContent(value: unknown): value is IndexedContent {\n  return typeof value === \"object\" && value !== null && (value as IndexedContent)[INDEXED_CONTENT] === true;\n}\n\nfunction indexedBlock(block: unknown): unknown {\n  if (!isRecord(block)) return block;\n  switch (block.type) {\n    case \"text\":\n      return { type: block.type, text: block.text };\n    case \"image\":\n      return { type: block.type, mimeType: block.mimeType };\n    case \"thinking\":\n      return {\n        type: block.type,\n        thinking: block.thinking,\n        ...(typeof block.redacted === \"boolean\" ? { redacted: block.redacted } : {}),\n      };\n    case \"toolCall\":\n      return {\n        type: block.type,\n        id: block.id,\n        name: block.name,\n        ...(block.name === \"context_management_recall_context\" ? {} : { arguments: block.arguments }),\n        ...(typeof block.namespace === \"string\" ? { namespace: block.namespace } : {}),\n      };\n    default:\n      return block;\n  }\n}\n\nfunction messageIndexPayload(message: AgentMessage): unknown {\n  if (message.role === \"toolResult\" && message.toolName === \"context_management_recall_context\") {\n    return {\n      toolName: message.toolName,\n      toolCallId: message.toolCallId,\n      isError: message.isError,\n    };\n  }\n  const payload = messagePayload(message);\n  if (!isRecord(payload) || !Object.hasOwn(payload, \"content\")) return payload;\n  return { ...payload, content: indexedContent(payload.content) };\n}\n\nfunction isExcludedFromModelContext(message: AgentMessage): boolean {\n  return message.role === \"bashExecution\" && message.excludeFromContext === true;\n}\n\nfunction* historyMessageItems(\n  entries: readonly SessionEntry[],\n  budget: HistoryTraversalBudget,\n  firstWindowId: string | undefined,\n  detailScanBudget: ReturnType<typeof createContextBranchScanBudget>,\n): Generator<HistoryMessageItem> {\n  let windowId = firstWindowId;\n  for (const entry of entries) {\n    visitHistoryEntry(budget);\n    if (entry.type === \"compaction\") {\n      const details = parseContextManagementCompaction(entry, detailScanBudget);\n      if (details) windowId = details.currentWindowId;\n    }\n    const messages = sessionEntryToContextMessages(entry);\n    for (let index = 0; index < messages.length; index += 1) {\n      const message = messages[index];\n      if (isExcludedFromModelContext(message)) continue;\n      yield {\n        id: messages.length === 1 ? entry.id : `${entry.id}:${index}`,\n        ...(windowId ? { windowId } : {}),\n        role: message.role,\n        message,\n      };\n    }\n  }\n}\n\nfunction isActiveToolCallMessage(message: AgentMessage, toolCallId: string | undefined): boolean {\n  return (\n    toolCallId !== undefined &&\n    message.role === \"assistant\" &&\n    message.content.some((block) => block.type === \"toolCall\" && block.id === toolCallId)\n  );\n}\n\nfunction displayText(value: string): string {\n  return Array.from(stripVTControlCharacters(value), (character) => {\n    const codePoint = character.codePointAt(0) ?? 0;\n    if (codePoint === 9 || codePoint === 10 || codePoint === 13) return character;\n    return codePoint < 32 || (codePoint >= 127 && codePoint <= 159) ? \" \" : character;\n  }).join(\"\");\n}\n\nfunction normalizedSearchQuery(input: RecallContextInput): string {\n  if (!input.query || input.query.length > MAX_RECALL_QUERY_LENGTH || input.id !== undefined) {\n    throw new Error(\n      `context_management_recall_context search requires a query of 1-${MAX_RECALL_QUERY_LENGTH} characters and does not accept id`,\n    );\n  }\n  const query = displayText(input.query).trim().toLowerCase();\n  if (!query) throw new Error(\"context_management_recall_context search query contains no visible text\");\n  return query;\n}\n\nfunction preview(value: string): string {\n  const compact = displayText(value).replace(/\\s+/g, \" \").trim();\n  const characters = Array.from(compact);\n  return characters.length > 240 ? `${characters.slice(0, 239).join(\"\")}\u2026` : compact;\n}\n\ninterface SearchScanBudget {\n  remainingUnits: number;\n  exceeded: boolean;\n}\n\ntype PayloadFrame =\n  | { kind: \"value\"; value: unknown }\n  | { kind: \"array\"; value: unknown[]; index: number }\n  | { kind: \"indexed-content\"; value: unknown[]; index: number }\n  | { kind: \"object\"; entries: Iterator<[string, unknown]> }\n  | { kind: \"text\"; value: string };\n\nfunction* ownEntries(value: object): Generator<[string, unknown]> {\n  for (const key in value) {\n    if (Object.hasOwn(value, key)) yield [key, (value as Record<string, unknown>)[key]];\n  }\n}\n\nfunction boundedPayloadText(value: unknown, searchBudget?: SearchScanBudget): string {\n  let scannedUnits = 0;\n  let text = \"\";\n  const consume = (requestedUnits: number): number => {\n    const allowedByMessage = Math.min(requestedUnits, MAX_SCANNED_MESSAGE_UNITS - scannedUnits);\n    const consumedUnits = Math.min(allowedByMessage, searchBudget?.remainingUnits ?? allowedByMessage);\n    scannedUnits += consumedUnits;\n    if (searchBudget) {\n      searchBudget.remainingUnits -= consumedUnits;\n      if (consumedUnits < allowedByMessage) searchBudget.exceeded = true;\n    }\n    return consumedUnits;\n  };\n  const append = (value: string) => {\n    const part = value.slice(0, consume(value.length));\n    text += displayText(part).slice(0, MAX_INDEXED_MESSAGE_CHARS - text.length);\n  };\n  const frames: PayloadFrame[] = [{ kind: \"value\", value }];\n  while (\n    frames.length > 0 &&\n    scannedUnits < MAX_SCANNED_MESSAGE_UNITS &&\n    text.length < MAX_INDEXED_MESSAGE_CHARS &&\n    !searchBudget?.exceeded\n  ) {\n    const frame = frames.pop();\n    if (!frame) break;\n    if (frame.kind === \"text\") {\n      append(frame.value);\n      continue;\n    }\n    if (frame.kind === \"array\") {\n      if (frame.index < frame.value.length) {\n        frames.push(\n          { kind: \"array\", value: frame.value, index: frame.index + 1 },\n          { kind: \"value\", value: frame.value[frame.index] },\n        );\n      }\n      continue;\n    }\n    if (frame.kind === \"indexed-content\") {\n      if (frame.index < frame.value.length && consume(1) === 1) {\n        frames.push(\n          { kind: \"indexed-content\", value: frame.value, index: frame.index + 1 },\n          { kind: \"value\", value: indexedBlock(frame.value[frame.index]) },\n        );\n      }\n      continue;\n    }\n    if (frame.kind === \"object\") {\n      const next = frame.entries.next();\n      if (!next.done) {\n        const [key, item] = next.value;\n        frames.push(\n          frame,\n          { kind: \"text\", value: \"\\n\" },\n          { kind: \"value\", value: item },\n          { kind: \"text\", value: `${key} ` },\n        );\n      }\n      continue;\n    }\n    if (consume(1) < 1) continue;\n    const item = frame.value;\n    if (typeof item === \"string\") {\n      append(item);\n    } else if (typeof item !== \"object\" || item === null) {\n      if (item !== undefined && typeof item !== \"function\" && typeof item !== \"symbol\") {\n        append(String(item));\n      }\n    } else if (isIndexedContent(item)) {\n      if (Array.isArray(item.value)) frames.push({ kind: \"indexed-content\", value: item.value, index: 0 });\n      else frames.push({ kind: \"value\", value: item.value });\n    } else if (Array.isArray(item)) {\n      frames.push({ kind: \"array\", value: item, index: 0 });\n    } else {\n      frames.push({ kind: \"object\", entries: ownEntries(item) });\n    }\n  }\n  return text;\n}\n\nfunction boundedMessageText(message: AgentMessage, searchBudget?: SearchScanBudget): string {\n  return boundedPayloadText(messageIndexPayload(message), searchBudget);\n}\n\nfunction paged<T>(values: readonly T[], offset: number) {\n  const items = values.slice(offset, offset + MAX_RECALL_MATCHES);\n  const next = offset + items.length;\n  return {\n    items,\n    ...(next < values.length ? { nextCursor: String(next) } : {}),\n  };\n}\n\nfunction searchPage<T>(values: Iterable<T>, offset: number, matches: (value: T) => boolean) {\n  const items: T[] = [];\n  let matchIndex = 0;\n  for (const value of values) {\n    if (!matches(value)) continue;\n    if (matchIndex >= offset) items.push(value);\n    matchIndex += 1;\n    if (items.length > MAX_RECALL_MATCHES) break;\n  }\n  const hasMore = items.length > MAX_RECALL_MATCHES;\n  return {\n    items: items.slice(0, MAX_RECALL_MATCHES),\n    ...(hasMore ? { nextCursor: String(offset + MAX_RECALL_MATCHES) } : {}),\n  };\n}\n\nfunction readChunk(value: string, offset: number) {\n  if (offset > value.length) throw new Error(\"context_management_recall_context cursor exceeds the selected item\");\n  if (\n    offset > 0 &&\n    offset < value.length &&\n    /[\\uDC00-\\uDFFF]/.test(value[offset]) &&\n    /[\\uD800-\\uDBFF]/.test(value[offset - 1])\n  ) {\n    throw new Error(\"context_management_recall_context cursor splits a Unicode code point\");\n  }\n  let bytes = 0;\n  let next = offset;\n  for (const character of value.slice(offset)) {\n    const characterBytes = Buffer.byteLength(character, \"utf8\");\n    if (bytes + characterBytes > READ_CHUNK_BYTES) break;\n    bytes += characterBytes;\n    next += character.length;\n  }\n  const chunk = value.slice(offset, next);\n  return {\n    chunk,\n    ...(next < value.length ? { nextCursor: String(next) } : {}),\n  };\n}\n\nfunction sanitizeJsonValue(value: unknown): unknown {\n  if (typeof value === \"string\") return displayText(value);\n  if (Array.isArray(value)) return value.map(sanitizeJsonValue);\n  if (typeof value !== \"object\" || value === null) return value;\n  return Object.fromEntries(Object.entries(value).map(([key, item]) => [displayText(key), sanitizeJsonValue(item)]));\n}\n\nfunction safeJson(value: unknown): string {\n  const text = JSON.stringify(sanitizeJsonValue(value), null, 2);\n  if (Buffer.byteLength(text, \"utf8\") > MAX_RECALL_RESULT_BYTES) {\n    throw new Error(\"context_management_recall_context result exceeded its output limit\");\n  }\n  if (text.split(\"\\n\").length > 1_000) {\n    throw new Error(\"context_management_recall_context result exceeded its line limit\");\n  }\n  return text;\n}\n\nexport function recallContext(\n  entries: readonly SessionEntry[],\n  input: RecallContextInput,\n  activeToolCallId?: string,\n  limits: RecallContextLimits = {},\n): { text: string; details: Record<string, unknown> } {\n  if (input.source !== \"history\" && input.source !== \"notes\") {\n    throw new Error(\"context_management_recall_context source must be history or notes\");\n  }\n  if (input.action !== \"list\" && input.action !== \"read\" && input.action !== \"search\") {\n    throw new Error(\"context_management_recall_context action must be list, read, or search\");\n  }\n  const offset = parseCursor(input.cursor);\n  if (input.action === \"read\" && (!input.id || input.query !== undefined)) {\n    throw new Error(\"context_management_recall_context read requires id and does not accept query\");\n  }\n  const searchQuery = input.action === \"search\" ? normalizedSearchQuery(input) : \"\";\n  if (input.action === \"list\" && (input.id !== undefined || input.query !== undefined)) {\n    throw new Error(\"context_management_recall_context list does not accept id or query\");\n  }\n\n  if (input.source === \"notes\") {\n    const notes = sortedNotes(entries);\n    if (input.action === \"list\") {\n      const page = paged(\n        notes.map((note) => ({ id: note.name, bytes: Buffer.byteLength(note.content, \"utf8\") })),\n        offset,\n      );\n      return { text: safeJson({ source: \"notes\", action: \"list\", ...page }), details: page };\n    }\n    if (input.action === \"read\") {\n      const note = notes.find((candidate) => candidate.name === input.id);\n      if (!note) throw new Error(`Context note ${JSON.stringify(displayText(input.id ?? \"\"))} was not found`);\n      const page = readChunk(displayText(note.content), offset);\n      return {\n        text: safeJson({ source: \"notes\", action: \"read\", id: note.name, ...page }),\n        details: { source: \"notes\", id: note.name, ...page },\n      };\n    }\n    const matches = searchPage(notes, offset, (note) =>\n      displayText(`${note.name}\\n${note.content.slice(0, MAX_INDEXED_MESSAGE_CHARS)}`)\n        .toLowerCase()\n        .includes(searchQuery),\n    );\n    const page = {\n      ...matches,\n      items: matches.items.map((note) => ({ id: note.name, preview: preview(note.content) })),\n    };\n    return { text: safeJson({ source: \"notes\", action: \"search\", ...page }), details: page };\n  }\n\n  const detailScanBudget = createContextBranchScanBudget();\n  if (limits.historyDetailScanUnits !== undefined) {\n    detailScanBudget.remainingScanUnits = limits.historyDetailScanUnits;\n  }\n  const history = historyMessageItems(\n    entries,\n    { remainingVisits: MAX_HISTORY_BRANCH_ENTRY_VISITS },\n    limits.firstWindowId,\n    detailScanBudget,\n  );\n  if (input.action === \"list\") {\n    const selected = searchPage(history, offset, () => true);\n    const page = {\n      ...selected,\n      items: selected.items.map((item) => ({\n        id: item.id,\n        ...(item.windowId ? { windowId: item.windowId } : {}),\n        role: item.role,\n        preview: preview(boundedMessageText(item.message)),\n      })),\n    };\n    return { text: safeJson({ source: \"history\", action: \"list\", ...page }), details: page };\n  }\n  if (input.action === \"read\") {\n    let item: HistoryMessageItem | undefined;\n    for (const candidate of history) {\n      if (candidate.id !== input.id) continue;\n      item = candidate;\n      break;\n    }\n    if (!item) throw new Error(`History item ${JSON.stringify(displayText(input.id ?? \"\"))} was not found`);\n    const content = serializeMessage(item.message);\n    const page = readChunk(content, offset);\n    return {\n      text: safeJson({\n        source: \"history\",\n        action: \"read\",\n        id: item.id,\n        ...(item.windowId ? { windowId: item.windowId } : {}),\n        role: item.role,\n        ...page,\n      }),\n      details: { source: \"history\", id: item.id, ...page },\n    };\n  }\n  const searchBudget: SearchScanBudget = {\n    remainingUnits: limits.historySearchScanUnits ?? MAX_HISTORY_SEARCH_SCAN_UNITS,\n    exceeded: false,\n  };\n  const indexedText = new Map<string, string>();\n  const matches = searchPage(history, offset, (item) => {\n    if (isActiveToolCallMessage(item.message, activeToolCallId)) return false;\n    const text = boundedMessageText(item.message, searchBudget);\n    if (searchBudget.exceeded) {\n      throw new Error(\"context_management_recall_context history search exceeded its scan limit\");\n    }\n    indexedText.set(item.id, text);\n    return text.toLowerCase().includes(searchQuery);\n  });\n  const page = {\n    ...matches,\n    items: matches.items.map((item) => ({\n      id: item.id,\n      ...(item.windowId ? { windowId: item.windowId } : {}),\n      role: item.role,\n      preview: preview(indexedText.get(item.id) ?? \"\"),\n    })),\n  };\n  return { text: safeJson({ source: \"history\", action: \"search\", ...page }), details: page };\n}\n", "import { randomUUID } from \"node:crypto\";\nimport { constants } from \"node:fs\";\nimport { mkdir, open, rename, rm, writeFile } from \"node:fs/promises\";\nimport { basename, dirname, join } from \"node:path\";\nimport { getAgentDir } from \"@earendil-works/pi-coding-agent\";\n\nexport const CONTEXT_MANAGEMENT_SETTINGS_FILE = \"pi-context-management.json\";\nexport const MAX_SETTINGS_BYTES = 64 * 1024;\n\nexport interface ContextManagementSettings {\n  enabled: boolean;\n}\n\nexport const DEFAULT_CONTEXT_MANAGEMENT_SETTINGS: Readonly<ContextManagementSettings> = Object.freeze({\n  enabled: false,\n});\n\nexport interface ContextManagementSettingsState {\n  kind: \"missing\" | \"loaded\" | \"invalid\";\n  path: string;\n  settings: ContextManagementSettings;\n  document?: Record<string, unknown>;\n  issue?: string;\n}\n\nexport interface ContextManagementSettingsRuntime {\n  get(): Readonly<ContextManagementSettingsState>;\n  reload(signal?: AbortSignal): Promise<Readonly<ContextManagementSettingsState>>;\n  update(\n    patch: Partial<ContextManagementSettings>,\n    signal?: AbortSignal,\n  ): Promise<Readonly<ContextManagementSettingsState>>;\n  flush(): Promise<void>;\n}\n\nfunction isRecord(value: unknown): value is Record<string, unknown> {\n  return typeof value === \"object\" && value !== null && !Array.isArray(value);\n}\n\nexport function normalizeContextManagementSettings(value: unknown): ContextManagementSettings | undefined {\n  if (!isRecord(value)) return undefined;\n  if (Object.hasOwn(value, \"enabled\") && typeof value.enabled !== \"boolean\") return undefined;\n  return {\n    enabled: typeof value.enabled === \"boolean\" ? value.enabled : DEFAULT_CONTEXT_MANAGEMENT_SETTINGS.enabled,\n  };\n}\n\nexport function contextManagementSettingsPath(): string {\n  return join(getAgentDir(), CONTEXT_MANAGEMENT_SETTINGS_FILE);\n}\n\nfunction aborted(signal?: AbortSignal): void {\n  if (signal?.aborted) throw new DOMException(\"Settings operation aborted\", \"AbortError\");\n}\n\nexport async function loadContextManagementSettings(\n  path = contextManagementSettingsPath(),\n  signal?: AbortSignal,\n): Promise<ContextManagementSettingsState> {\n  aborted(signal);\n  try {\n    const handle = await open(path, constants.O_RDONLY | constants.O_NOFOLLOW);\n    let text: string;\n    try {\n      const stats = await handle.stat();\n      aborted(signal);\n      if (!stats.isFile()) throw new Error(\"settings path is not a regular file\");\n      if (stats.size > MAX_SETTINGS_BYTES) throw new Error(\"settings file exceeds 64 KiB\");\n      text = await handle.readFile(\"utf8\");\n    } finally {\n      await handle.close();\n    }\n    aborted(signal);\n    const document = JSON.parse(text) as unknown;\n    const settings = normalizeContextManagementSettings(document);\n    if (!settings || !isRecord(document)) throw new Error(\"invalid settings shape\");\n    return { kind: \"loaded\", path, settings, document };\n  } catch (error) {\n    if (signal?.aborted) throw error;\n    if (isNodeError(error) && error.code === \"ENOENT\") {\n      return {\n        kind: \"missing\",\n        path,\n        settings: { ...DEFAULT_CONTEXT_MANAGEMENT_SETTINGS },\n        document: {},\n      };\n    }\n    return {\n      kind: \"invalid\",\n      path,\n      settings: { ...DEFAULT_CONTEXT_MANAGEMENT_SETTINGS },\n      issue:\n        isNodeError(error) && error.code === \"ELOOP\"\n          ? \"symbolic links are not accepted\"\n          : error instanceof Error\n            ? error.message\n            : String(error),\n    };\n  }\n}\n\nasync function savePatch(\n  path: string,\n  patch: Partial<ContextManagementSettings>,\n  signal?: AbortSignal,\n): Promise<ContextManagementSettingsState> {\n  const latest = await loadContextManagementSettings(path, signal);\n  if (latest.kind === \"invalid\") {\n    throw new Error(\"Cannot overwrite an invalid pi-context-management.json; repair it and reload first\");\n  }\n  const document = { ...latest.document, ...patch };\n  const settings = normalizeContextManagementSettings(document);\n  if (!settings) throw new Error(\"Refusing to save invalid context management settings\");\n  const temporaryPath = join(dirname(path), `.${basename(path)}.${randomUUID()}.tmp`);\n  await mkdir(dirname(path), { recursive: true });\n  aborted(signal);\n  try {\n    await writeFile(temporaryPath, `${JSON.stringify(document, null, 2)}\\n`, {\n      encoding: \"utf8\",\n      flag: \"wx\",\n      mode: 0o600,\n    });\n    aborted(signal);\n    const current = await loadContextManagementSettings(path, signal);\n    if (\n      current.kind === \"invalid\" ||\n      current.kind !== latest.kind ||\n      JSON.stringify(current.document) !== JSON.stringify(latest.document)\n    ) {\n      throw new Error(\"pi-context-management.json changed while saving; reopen settings and retry\");\n    }\n    await rename(temporaryPath, path);\n  } finally {\n    await rm(temporaryPath, { force: true }).catch(() => undefined);\n  }\n  return { kind: \"loaded\", path, settings, document };\n}\n\nexport function createContextManagementSettingsRuntime(\n  path = contextManagementSettingsPath(),\n): ContextManagementSettingsRuntime {\n  let state: ContextManagementSettingsState = {\n    kind: \"missing\",\n    path,\n    settings: { ...DEFAULT_CONTEXT_MANAGEMENT_SETTINGS },\n    document: {},\n  };\n  let queue = Promise.resolve();\n  const enqueue = <T>(operation: () => Promise<T>): Promise<T> => {\n    const result = queue.then(operation, operation);\n    queue = result.then(\n      () => undefined,\n      () => undefined,\n    );\n    return result;\n  };\n  return {\n    get: () => structuredClone(state),\n    reload: (signal) =>\n      enqueue(async () => {\n        state = await loadContextManagementSettings(path, signal);\n        return structuredClone(state);\n      }),\n    update: (patch, signal) =>\n      enqueue(async () => {\n        state = await savePatch(path, patch, signal);\n        return structuredClone(state);\n      }),\n    flush: () => queue,\n  };\n}\n\nfunction isNodeError(error: unknown): error is NodeJS.ErrnoException {\n  return error instanceof Error && \"code\" in error;\n}\n", "import type { ExtensionAPI, ExtensionContext } from \"@earendil-works/pi-coding-agent\";\nimport { createContextManager } from \"./context-management.js\";\nimport {\n  type ContextManagementSettingsRuntime,\n  type ContextManagementSettingsState,\n  createContextManagementSettingsRuntime,\n} from \"./settings.js\";\nimport { terminalText } from \"./terminal.js\";\n\ninterface SessionRuntime {\n  controller: AbortController;\n  generation: number;\n}\n\nexport function createContextManagementExtension(\n  options: { settingsRuntime?: ContextManagementSettingsRuntime } = {},\n): (pi: ExtensionAPI) => void {\n  return (pi) => {\n    const settingsRuntime = options.settingsRuntime ?? createContextManagementSettingsRuntime();\n    const manager = createContextManager(pi, settingsRuntime);\n    const sessions = new Map<ExtensionContext[\"sessionManager\"], SessionRuntime>();\n    let nextGeneration = 0;\n\n    pi.registerCommand(\"context-management\", {\n      description: \"Configure experimental summary-free context management\",\n      handler: async (args, ctx) => {\n        if (args.trim()) throw new Error(\"Usage: /context-management\");\n        const owner = sessions.get(ctx.sessionManager);\n        const controller = owner?.controller ?? new AbortController();\n        const { showContextManagementMenu } = await import(\"./settings-menu.js\");\n        if (owner && (sessions.get(ctx.sessionManager) !== owner || controller.signal.aborted)) return;\n        await showContextManagementMenu(settingsRuntime, ctx, {\n          signal: controller.signal,\n          isCurrent: () =>\n            owner\n              ? sessions.get(ctx.sessionManager) === owner && !controller.signal.aborted\n              : !controller.signal.aborted,\n          isActive: () => manager.isEnabled(ctx),\n          onSettingsChanged: () => manager.applySettings(ctx),\n        });\n      },\n    });\n\n    pi.on(\"session_start\", async (_event, ctx) => {\n      sessions.get(ctx.sessionManager)?.controller.abort();\n      const owner: SessionRuntime = {\n        controller: new AbortController(),\n        generation: ++nextGeneration,\n      };\n      sessions.set(ctx.sessionManager, owner);\n      const sessionId = ctx.sessionManager.getSessionId();\n      let state: Readonly<ContextManagementSettingsState>;\n      try {\n        state = await settingsRuntime.reload(owner.controller.signal);\n      } catch (error) {\n        if (owner.controller.signal.aborted || sessions.get(ctx.sessionManager) !== owner) return;\n        state = settingsRuntime.get();\n        if (ctx.hasUI) {\n          ctx.ui.notify(\n            `Could not load pi-context-management.json; using defaults. ${terminalText(error instanceof Error ? error.message : String(error))}`,\n            \"warning\",\n          );\n        }\n      }\n      if (\n        owner.controller.signal.aborted ||\n        sessions.get(ctx.sessionManager) !== owner ||\n        ctx.sessionManager.getSessionId() !== sessionId\n      ) {\n        return;\n      }\n      if (ctx.hasUI && state.kind === \"invalid\") {\n        ctx.ui.notify(\n          `Invalid pi-context-management.json; using defaults without overwriting it. ${terminalText(state.issue ?? \"unknown validation error\")}`,\n          \"warning\",\n        );\n      }\n      manager.startSession(ctx);\n    });\n\n    pi.on(\"input\", (_event, ctx) => manager.onInput(ctx));\n    pi.on(\"session_before_compact\", (event, ctx) => manager.beforeCompact(event, ctx));\n    pi.on(\"context\", (event, ctx) => {\n      const messages = manager.projectContext(event.messages, ctx);\n      return messages ? { messages } : undefined;\n    });\n    pi.on(\"session_tree\", (_event, ctx) => manager.onSessionTree(ctx));\n    pi.on(\"session_compact\", (event, ctx) => manager.onCompact(event, ctx));\n    pi.on(\"session_compact_failed\", (event, ctx) => manager.onCompactFailed(event, ctx));\n    pi.on(\"agent_start\", (_event, ctx) => manager.onAgentStart(ctx));\n    pi.on(\"agent_end\", (event, ctx) => manager.onAgentEnd(event, ctx));\n    pi.on(\"turn_start\", (_event, ctx) => manager.onTurnStart(ctx));\n    pi.on(\"agent_settled\", (_event, ctx) => manager.onAgentSettled(ctx));\n\n    pi.on(\"session_shutdown\", async (_event, ctx) => {\n      const owner = sessions.get(ctx.sessionManager);\n      owner?.controller.abort();\n      if (sessions.get(ctx.sessionManager) === owner) sessions.delete(ctx.sessionManager);\n      manager.shutdown(ctx);\n      await settingsRuntime.flush();\n    });\n  };\n}\n\nexport default createContextManagementExtension();\n"],
  "mappings": "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",
  "names": ["randomUUID", "sessionEntryToContextMessages", "target", "bytes", "isRecord", "stripVTControlCharacters", "sessionEntryToContextMessages", "isRecord", "sessionEntryToContextMessages", "stripVTControlCharacters", "value", "item", "bytes", "page", "matches", "isRecord", "isIdentifier", "details", "sessionEntryToContextMessages", "randomUUID", "result", "randomUUID", "join", "isRecord", "result"]
}
