{"version":3,"file":"pi.cjs","names":["selectRegistryHooks","selectPluginHooks","failuresFrom","hookFailureMessage","HOOK_EVENT","sessionHookPayload","additionalContextsFrom","decisionsFrom","toolHookPayload","isDenied","decisionReason","toolResultMessages","createHookTelemetry","requireDoomConfigContext","createBashHookRunner","createHookDocumentReader","readDoomReadinessCoordinator","DOOM_CONFIG_SERVICE","defineRoot","defineCliHook","defineCliHook","defineCliHook","defineCliHook","defineCliHook","defineCliHook","defineResource","definePiExtension","rootSession","composeRootHooks","hookAgentSettled","hookBeforeAgentStart","hookSessionShutdown","hookSessionStart","hookToolCall","hookToolResult","resourceDoompiUseHook"],"sources":["../../src/constants/hookHandlers.ts","../../src/services/hookHandlers/index.ts","../../src/constants/hook.ts","../../src/services/hookRuntime/index.ts","../../src/extensions/workspaces/sessions/(backend)/_lib/piRoot.ts","../../src/extensions/workspaces/sessions/(backend)/root.cli.ts","../../src/extensions/workspaces/sessions/(backend)/hook/agent-settled.cli.ts","../../src/extensions/workspaces/sessions/(backend)/hook/before-agent-start.cli.ts","../../src/extensions/workspaces/sessions/(backend)/hook/session-shutdown.cli.ts","../../src/extensions/workspaces/sessions/(backend)/hook/session-start.cli.ts","../../src/extensions/workspaces/sessions/(backend)/hook/tool-call.cli.ts","../../src/extensions/workspaces/sessions/(backend)/hook/tool-result.cli.ts","../../src/extensions/workspaces/sessions/(backend)/resource/doompi-use-hook.cli.ts","../../generated/pi.ts"],"sourcesContent":["export const STATUS_PREFIX = 'repository-hooks';\nexport const FAILURE_MESSAGE_TYPE = 'repository-hook-failure';\nexport const CONTEXT_MESSAGE_TYPE = 'repository-hook-context';\nexport const STEER = { deliverAs: 'steer' } as const;\nexport const BLOCKED_BY_HOOK = 'Blocked by repository hook';\nexport const SUBAGENT_ENVIRONMENT_FLAG = 'PI_SUBAGENT_CHILD';\nexport const CONTEXT_SEPARATOR = '\\n\\n';\n","import type { PiEventHandlers } from '@agimon-ai/doompi-core/piExtension';\nimport type { ExtensionAPI, ExtensionContext } from '@earendil-works/pi-coding-agent';\n\nimport {\n  STATUS_PREFIX,\n  FAILURE_MESSAGE_TYPE,\n  CONTEXT_MESSAGE_TYPE,\n  STEER,\n  BLOCKED_BY_HOOK,\n  SUBAGENT_ENVIRONMENT_FLAG,\n  CONTEXT_SEPARATOR,\n} from '../../constants/hookHandlers';\nimport { HOOK_EVENT } from '../../constants/hooks';\nimport {\n  additionalContextsFrom,\n  decisionReason,\n  decisionsFrom,\n  failuresFrom,\n  hookFailureMessage,\n  isDenied,\n  toolResultMessages,\n} from '../../services/hookDecisions';\nimport { sessionHookPayload, toolHookPayload } from '../../services/hookPayload';\nimport { selectRegistryHooks } from '../../services/hookRegistry';\nimport type { HookRuntimeResolver, HookSession } from '../../services/hookRuntime/type';\nimport { selectPluginHooks } from '../../services/pluginHooks';\nimport {\n  type HookFailure,\n  type HookOutcome,\n  type HookPayload,\n  type HookToolEvent,\n  type ResolvedHook,\n} from '../../types/hooks';\n\n/** Everything one dispatch resolved before it ran anything. */\ninterface HookDispatch {\n  repoRoot: string;\n  sessionId: string;\n  hooks: ResolvedHook[];\n  failures: HookFailure[];\n}\n\n/**\n * Registry rows plus plugin hooks for one event, in that order.\n *\n * Both sources are read on every dispatch because either can change mid-session:\n * /mode switches the selected groups and a plugin can rewrite its own config.\n */\nasync function resolveHooks(\n  session: HookSession,\n  ctx: ExtensionContext,\n  eventName: string,\n  toolName?: string,\n): Promise<HookDispatch> {\n  const harness = session.config().harness;\n  const repoRoot = harness.root ?? ctx.cwd;\n  const [registry, plugins] = await Promise.all([\n    session.documents.registry(repoRoot),\n    session.documents.plugins(harness.pluginHooks),\n  ]);\n  const hooks = [\n    ...selectRegistryHooks(registry.entries, {\n      event: eventName,\n      toolName,\n      allowedGroups: harness.hookGroups,\n      inSubagent: Boolean(process.env[SUBAGENT_ENVIRONMENT_FLAG]),\n    }),\n    ...selectPluginHooks(plugins.documents, eventName, toolName),\n  ];\n  return {\n    repoRoot,\n    sessionId: ctx.sessionManager.getSessionId(),\n    hooks,\n    failures: [...(registry.failure ? [registry.failure] : []), ...plugins.failures],\n  };\n}\n\n/** Session end is plugin-only: the registry has no binding for it. */\nasync function resolvePluginHooks(\n  session: HookSession,\n  ctx: ExtensionContext,\n  eventName: string,\n): Promise<HookDispatch> {\n  const harness = session.config().harness;\n  const plugins = await session.documents.plugins(harness.pluginHooks);\n  return {\n    repoRoot: harness.root ?? ctx.cwd,\n    sessionId: ctx.sessionManager.getSessionId(),\n    hooks: selectPluginHooks(plugins.documents, eventName),\n    failures: plugins.failures,\n  };\n}\n\nasync function runHooks(\n  session: HookSession,\n  ctx: ExtensionContext,\n  dispatch: HookDispatch,\n  payload: HookPayload,\n  statusKey: string,\n  statusLabel: string,\n): Promise<HookOutcome[]> {\n  const outcomes: HookOutcome[] = [];\n  try {\n    for (const [index, resolved] of dispatch.hooks.entries()) {\n      if (ctx.hasUI) ctx.ui.setStatus(statusKey, `${statusLabel} (${index + 1}/${dispatch.hooks.length})...`);\n      outcomes.push(\n        await session.runner.run(resolved.hook, payload, { repoRoot: dispatch.repoRoot, pluginRoot: resolved.root }),\n      );\n    }\n  } finally {\n    if (ctx.hasUI) ctx.ui.setStatus(statusKey, undefined);\n  }\n  return outcomes;\n}\n\nfunction allFailures(dispatch: HookDispatch, outcomes: ReadonlyArray<HookOutcome>): HookFailure[] {\n  return [...dispatch.failures, ...failuresFrom(outcomes)];\n}\n\nfunction steerHookFailures(pi: ExtensionAPI, failures: ReadonlyArray<HookFailure>): void {\n  if (failures.length === 0) return;\n  pi.sendMessage({ customType: FAILURE_MESSAGE_TYPE, content: hookFailureMessage(failures), display: true }, STEER);\n}\n\nasync function runSessionStartHooks(\n  pi: ExtensionAPI,\n  session: HookSession,\n  ctx: ExtensionContext,\n  signal?: AbortSignal,\n  isCurrent: () => boolean = () => true,\n): Promise<void> {\n  signal?.throwIfAborted();\n  const dispatch = await resolveHooks(session, ctx, HOOK_EVENT.sessionStart);\n  signal?.throwIfAborted();\n  const outcomes = await runHooks(\n    session,\n    ctx,\n    dispatch,\n    sessionHookPayload(dispatch.sessionId, dispatch.repoRoot),\n    `${STATUS_PREFIX}:${dispatch.sessionId}:start`,\n    'Running session-start hooks',\n  );\n  signal?.throwIfAborted();\n  if (!isCurrent()) return;\n  steerHookFailures(pi, allFailures(dispatch, outcomes));\n  const context = additionalContextsFrom(decisionsFrom(outcomes)).join(CONTEXT_SEPARATOR);\n  if (context) pi.sendMessage({ customType: CONTEXT_MESSAGE_TYPE, content: context, display: true }, STEER);\n}\n\nfunction createSessionStart(pi: ExtensionAPI, resolveRuntime: HookRuntimeResolver): PiEventHandlers['session_start'] {\n  return (_event, ctx) => {\n    const runtime = resolveRuntime();\n    if (!runtime?.isCurrent()) return undefined;\n    const { readiness, session } = runtime;\n    if (readiness) {\n      return readiness.start(ctx, (signal, isReady) =>\n        runSessionStartHooks(pi, session, ctx, signal, () => runtime.isCurrent() && isReady()),\n      );\n    }\n    return runSessionStartHooks(pi, session, ctx);\n  };\n}\n\nfunction createBeforeAgentStart(\n  _pi: ExtensionAPI,\n  resolveRuntime: HookRuntimeResolver,\n): PiEventHandlers['before_agent_start'] {\n  return async (_event, ctx) => {\n    const runtime = resolveRuntime();\n    if (!runtime?.isCurrent()) return;\n    await runtime.readiness?.wait(ctx);\n  };\n}\n\nfunction createToolCall(pi: ExtensionAPI, resolveRuntime: HookRuntimeResolver): PiEventHandlers['tool_call'] {\n  return async (event, ctx) => {\n    const runtime = resolveRuntime();\n    if (!runtime?.isCurrent()) return undefined;\n    await runtime.readiness?.wait(ctx);\n    if (!runtime.isCurrent()) return undefined;\n    const dispatch = await resolveHooks(runtime.session, ctx, HOOK_EVENT.preToolUse, event.toolName);\n    if (!runtime.isCurrent()) return undefined;\n    const payload = toolHookPayload(\n      event as HookToolEvent,\n      HOOK_EVENT.preToolUse,\n      dispatch.repoRoot,\n      dispatch.sessionId,\n    );\n    const outcomes = await runHooks(\n      runtime.session,\n      ctx,\n      dispatch,\n      payload,\n      `${STATUS_PREFIX}:${event.toolCallId}:pre`,\n      `Running pre-tool hooks for ${event.toolName}`,\n    );\n    if (!runtime.isCurrent()) return undefined;\n    const decisions = decisionsFrom(outcomes);\n    steerHookFailures(pi, allFailures(dispatch, outcomes));\n    const denied = decisions.find(isDenied);\n    if (denied) return { block: true, reason: decisionReason(denied) ?? BLOCKED_BY_HOOK };\n    const context = additionalContextsFrom(decisions).join(CONTEXT_SEPARATOR);\n    return context ? { block: true, reason: context } : undefined;\n  };\n}\n\nfunction createToolResult(_pi: ExtensionAPI, resolveRuntime: HookRuntimeResolver): PiEventHandlers['tool_result'] {\n  return async (event, ctx) => {\n    const runtime = resolveRuntime();\n    if (!runtime?.isCurrent()) return undefined;\n    await runtime.readiness?.wait(ctx);\n    if (!runtime.isCurrent()) return undefined;\n    const dispatch = await resolveHooks(runtime.session, ctx, HOOK_EVENT.postToolUse, event.toolName);\n    if (!runtime.isCurrent()) return undefined;\n    const payload = toolHookPayload(\n      event as HookToolEvent,\n      HOOK_EVENT.postToolUse,\n      dispatch.repoRoot,\n      dispatch.sessionId,\n    );\n    const outcomes = await runHooks(\n      runtime.session,\n      ctx,\n      dispatch,\n      payload,\n      `${STATUS_PREFIX}:${event.toolCallId}:post`,\n      `Running post-tool hooks for ${event.toolName}`,\n    );\n    if (!runtime.isCurrent()) return undefined;\n    const decisions = decisionsFrom(outcomes);\n    const failures = allFailures(dispatch, outcomes);\n    const messages = toolResultMessages(decisions);\n    if (failures.length > 0) messages.push(hookFailureMessage(failures));\n    if (messages.length === 0) return undefined;\n    // The result is appended to rather than replaced, so the tool's own output\n    // still reaches the model alongside whatever the hook had to say.\n    return {\n      content: [...event.content, { type: 'text' as const, text: messages.join(CONTEXT_SEPARATOR) }],\n      isError: event.isError || decisions.some(isDenied),\n    };\n  };\n}\n\nfunction createAgentSettled(_pi: ExtensionAPI, resolveRuntime: HookRuntimeResolver): PiEventHandlers['agent_settled'] {\n  return async (_event, ctx) => {\n    const runtime = resolveRuntime();\n    if (!runtime?.isCurrent()) return;\n    await runtime.readiness?.wait(ctx);\n    if (!runtime.isCurrent()) return;\n    const dispatch = await resolveHooks(runtime.session, ctx, HOOK_EVENT.stop);\n    if (!runtime.isCurrent()) return;\n    // skipInSubagent on the workflow-stop binding keeps subagents from closing\n    // the parent's workflow step.\n    await runHooks(\n      runtime.session,\n      ctx,\n      dispatch,\n      sessionHookPayload(dispatch.sessionId, dispatch.repoRoot),\n      `${STATUS_PREFIX}:${dispatch.sessionId}:stop`,\n      'Running stop hooks',\n    );\n  };\n}\n\nexport function createHookHandlers(pi: ExtensionAPI, resolveRuntime: HookRuntimeResolver): PiEventHandlers {\n  let shutdown: Promise<void> | undefined;\n  return {\n    session_start: createSessionStart(pi, resolveRuntime),\n    before_agent_start: createBeforeAgentStart(pi, resolveRuntime),\n    tool_call: createToolCall(pi, resolveRuntime),\n    tool_result: createToolResult(pi, resolveRuntime),\n    agent_settled: createAgentSettled(pi, resolveRuntime),\n    session_shutdown: (_event, ctx) => {\n      const current = resolveRuntime();\n      if (!current?.isCurrent()) return undefined;\n      shutdown ??= runSessionEndHooks(current.session, ctx);\n      return shutdown;\n    },\n  };\n}\n\n/** Runs the plugin SessionEnd hooks while the session is still usable. */\nexport async function runSessionEndHooks(session: HookSession, ctx: ExtensionContext): Promise<void> {\n  const dispatch = await resolvePluginHooks(session, ctx, HOOK_EVENT.sessionEnd);\n  await runHooks(\n    session,\n    ctx,\n    dispatch,\n    sessionHookPayload(dispatch.sessionId, dispatch.repoRoot),\n    `${STATUS_PREFIX}:${dispatch.sessionId}:end`,\n    'Running session-end hooks',\n  );\n}\n","export const PACKAGE_SOURCE = '@agimon-ai/doompi-hook';\nexport const HOOK_HELP_SKILL = {\n  name: 'doompi-author-hook',\n  description:\n    'Author DoomPi repository or plugin hooks. Use when creating or changing .doom/hooks.yaml, selecting hook groups from modes.yaml, writing hook commands, or adapting Claude Code hook payloads and decisions to DoomPi.',\n};\n","import { requireDoomConfigContext } from '@agimon-ai/doompi-config/piContext';\nimport { DOOM_CONFIG_SERVICE } from '@agimon-ai/doompi-core/config';\nimport { type DoomReadinessCoordinator, readDoomReadinessCoordinator } from '@agimon-ai/doompi-core/readiness';\nimport type { Context } from '@deepseek-ai/cordis';\nimport type { ExtensionContext } from '@earendil-works/pi-coding-agent';\n\nimport { PACKAGE_SOURCE } from '../../constants/hook';\nimport type { HookTelemetry } from '../../types/telemetry';\nimport { createHookDocumentReader } from '../hookDocuments';\nimport { createBashHookRunner } from '../hookRunner';\nimport { createHookTelemetry } from '../hookTelemetry';\nimport { type HookReadinessGate, type HookSession } from './type';\nimport type { HookBinding, HookExtensionOptions, HookRuntimeBinding } from './type';\n\nfunction hookSession(cordis: Context, options: HookExtensionOptions): HookSession {\n  // The log sink is only built if something actually reports to it, so a fully\n  // stubbed session never touches the telemetry backend.\n  let telemetry = options.telemetry;\n  const requireTelemetry = (): HookTelemetry => (telemetry ??= createHookTelemetry());\n  return {\n    config: () => requireDoomConfigContext(cordis),\n    runner: options.runner ?? createBashHookRunner({ telemetry: requireTelemetry() }),\n    documents: options.documents ?? createHookDocumentReader({ telemetry: requireTelemetry() }),\n  };\n}\n\nfunction createHookRuntime(cordis: Context, options: HookExtensionOptions): HookRuntimeBinding {\n  const session = hookSession(cordis, options);\n  let active = true;\n  let generation = 0;\n  let readiness:\n    | {\n        readonly sessionManager: object;\n        readonly coordinator: DoomReadinessCoordinator;\n        readonly operation: Promise<void>;\n      }\n    | undefined;\n  const readinessGate: HookReadinessGate = {\n    start(context, operation) {\n      const ownGeneration = ++generation;\n      const isCurrent = (): boolean => active && ownGeneration === generation;\n      const coordinator = readDoomReadinessCoordinator(cordis);\n      if (!coordinator) return operation(new AbortController().signal, isCurrent);\n\n      const previous = readiness;\n      const readinessOperation = (async (): Promise<void> => {\n        if (previous?.coordinator === coordinator) await previous.operation.catch(() => undefined);\n        if (!isCurrent()) return;\n        const handle = coordinator.start(\n          PACKAGE_SOURCE,\n          `${context.sessionManager.getSessionId()}:${ownGeneration}`,\n          async (signal) => {\n            await operation(signal, isCurrent);\n            return { value: undefined };\n          },\n        );\n        await handle.wait();\n      })();\n      // Config's coordinator owns the single user-facing failure notification.\n      void readinessOperation.catch(() => undefined);\n      readiness = {\n        sessionManager: context.sessionManager,\n        coordinator,\n        operation: readinessOperation,\n      };\n      return undefined;\n    },\n    async wait(context: ExtensionContext): Promise<void> {\n      const current = readiness;\n      if (!current) return;\n      if (current.sessionManager !== context.sessionManager) {\n        throw new Error('Hook readiness belongs to a stale Pi session.');\n      }\n      await current.operation;\n      if (!active || current !== readiness) {\n        throw new Error('Hook readiness belongs to a stale extension generation.');\n      }\n    },\n  };\n  return {\n    session,\n    readiness: readinessGate,\n    isCurrent: () => active,\n    dispose() {\n      active = false;\n      generation += 1;\n      readiness = undefined;\n    },\n  };\n}\n\nexport function createHookBinding(options: HookExtensionOptions): HookBinding {\n  let runtime: HookRuntimeBinding | undefined;\n  return {\n    plugin(cordis) {\n      cordis.inject([DOOM_CONFIG_SERVICE], (configContext) => {\n        const binding = createHookRuntime(configContext, options);\n        runtime = binding;\n        return () => {\n          binding.dispose();\n          if (runtime === binding) runtime = undefined;\n        };\n      });\n    },\n    runtime: () => runtime,\n  };\n}\n","import type { PiPluginContext } from '@agimon-ai/doompi-core/piExtension';\n\nimport { createHookHandlers } from '../../../../../services/hookHandlers';\nimport { createHookBinding } from '../../../../../services/hookRuntime';\nimport type { HookExtensionOptions } from '../../../../../services/hookRuntime/type';\n\nexport const createHookPiRoot = ({ pi, options }: PiPluginContext<HookExtensionOptions>) => {\n  const binding = createHookBinding(options ?? {});\n  return { value: createHookHandlers(pi, binding.runtime), services: [binding.plugin] };\n};\nexport type HookPiScope = Awaited<ReturnType<typeof createHookPiRoot>>['value'];\n","import { defineRoot } from '@agimon-ai/doompi-core/extensionFile';\n\nimport { createHookPiRoot } from './_lib/piRoot';\n\nexport default defineRoot(createHookPiRoot);\n","import { defineCliHook, type WithRoot } from '@agimon-ai/doompi-core/extensionFile';\nimport type { PiEventHandlers, PiPluginContext } from '@agimon-ai/doompi-core/piExtension';\n\nimport type { HookPiScope } from '../_lib/piRoot';\nexport default defineCliHook(\n  (context: WithRoot<PiPluginContext<unknown>, HookPiScope>): PiEventHandlers['agent_settled'] =>\n    context.root.agent_settled,\n);\n","import { defineCliHook, type WithRoot } from '@agimon-ai/doompi-core/extensionFile';\nimport type { PiEventHandlers, PiPluginContext } from '@agimon-ai/doompi-core/piExtension';\n\nimport type { HookPiScope } from '../_lib/piRoot';\nexport default defineCliHook(\n  (context: WithRoot<PiPluginContext<unknown>, HookPiScope>): PiEventHandlers['before_agent_start'] =>\n    context.root.before_agent_start,\n);\n","import { defineCliHook, type WithRoot } from '@agimon-ai/doompi-core/extensionFile';\nimport type { PiEventHandlers, PiPluginContext } from '@agimon-ai/doompi-core/piExtension';\n\nimport type { HookPiScope } from '../_lib/piRoot';\nexport default defineCliHook(\n  (context: WithRoot<PiPluginContext<unknown>, HookPiScope>): PiEventHandlers['session_shutdown'] =>\n    context.root.session_shutdown,\n);\n","import { defineCliHook, type WithRoot } from '@agimon-ai/doompi-core/extensionFile';\nimport type { PiEventHandlers, PiPluginContext } from '@agimon-ai/doompi-core/piExtension';\n\nimport type { HookPiScope } from '../_lib/piRoot';\nexport default defineCliHook(\n  (context: WithRoot<PiPluginContext<unknown>, HookPiScope>): PiEventHandlers['session_start'] =>\n    context.root.session_start,\n);\n","import { defineCliHook, type WithRoot } from '@agimon-ai/doompi-core/extensionFile';\nimport type { PiEventHandlers, PiPluginContext } from '@agimon-ai/doompi-core/piExtension';\n\nimport type { HookPiScope } from '../_lib/piRoot';\nexport default defineCliHook(\n  (context: WithRoot<PiPluginContext<unknown>, HookPiScope>): PiEventHandlers['tool_call'] => context.root.tool_call,\n);\n","import { defineCliHook, type WithRoot } from '@agimon-ai/doompi-core/extensionFile';\nimport type { PiEventHandlers, PiPluginContext } from '@agimon-ai/doompi-core/piExtension';\n\nimport type { HookPiScope } from '../_lib/piRoot';\nexport default defineCliHook(\n  (context: WithRoot<PiPluginContext<unknown>, HookPiScope>): PiEventHandlers['tool_result'] =>\n    context.root.tool_result,\n);\n","import { defineResource } from '@agimon-ai/doompi-core/extensionFile';\n\nimport { HOOK_HELP_SKILL, PACKAGE_SOURCE } from '../../../../../constants/hook';\nexport default defineResource({ source: PACKAGE_SOURCE, moduleUrl: import.meta.url, skills: [HOOK_HELP_SKILL] });\n","// Generated by @agimon-ai/doompi-build. Do not edit by hand.\nimport { definePiExtension, type PiPluginContext, type PiPluginContributions } from '@agimon-ai/doompi-core/piExtension';\nimport { composeRootHooks } from '@agimon-ai/doompi-core/extensionFile';\n\nimport rootSession from '../src/extensions/workspaces/sessions/(backend)/root.cli';\nimport hookAgentSettled from '../src/extensions/workspaces/sessions/(backend)/hook/agent-settled.cli';\nimport hookBeforeAgentStart from '../src/extensions/workspaces/sessions/(backend)/hook/before-agent-start.cli';\nimport hookSessionShutdown from '../src/extensions/workspaces/sessions/(backend)/hook/session-shutdown.cli';\nimport hookSessionStart from '../src/extensions/workspaces/sessions/(backend)/hook/session-start.cli';\nimport hookToolCall from '../src/extensions/workspaces/sessions/(backend)/hook/tool-call.cli';\nimport hookToolResult from '../src/extensions/workspaces/sessions/(backend)/hook/tool-result.cli';\nimport resourceDoompiUseHook from '../src/extensions/workspaces/sessions/(backend)/resource/doompi-use-hook.cli';\n\ntype OptionsOf<T> = T extends (context: PiPluginContext<infer Options>) => unknown ? Options : never;\ntype InferredOptions = Exclude<OptionsOf<typeof rootSession> | OptionsOf<typeof hookAgentSettled> | OptionsOf<typeof hookBeforeAgentStart> | OptionsOf<typeof hookSessionShutdown> | OptionsOf<typeof hookSessionStart> | OptionsOf<typeof hookToolCall> | OptionsOf<typeof hookToolResult> | OptionsOf<typeof resourceDoompiUseHook>, undefined>;\ntype Intersect<Union> =\n  (Union extends unknown ? (value: Union) => void : never) extends (value: infer Value) => void ? Value : never;\ntype ExtensionOptions = [InferredOptions] extends [never] ? undefined : Intersect<InferredOptions>;\n\ntype Factory<T, C> = (context: C) => T;\nconst at = <T, C>(value: T | Factory<T, C>, context: C): T =>\n  typeof value === 'function' ? (value as Factory<T, C>)(context) : value;\n\nexport const extension = definePiExtension<ExtensionOptions>('@agimon-ai/doompi-hook', async (context) => {\n  const scopeSession = await rootSession(context);\n  const contextSession = { ...context, root: scopeSession.value };\n  return {\n    ...composeRootHooks(scopeSession),\n    events: {\n      agent_settled: at(hookAgentSettled, contextSession) as NonNullable<PiPluginContributions['events']>['agent_settled'],\n      before_agent_start: at(hookBeforeAgentStart, contextSession) as NonNullable<PiPluginContributions['events']>['before_agent_start'],\n      session_shutdown: at(hookSessionShutdown, contextSession) as NonNullable<PiPluginContributions['events']>['session_shutdown'],\n      session_start: at(hookSessionStart, contextSession) as NonNullable<PiPluginContributions['events']>['session_start'],\n      tool_call: at(hookToolCall, contextSession) as NonNullable<PiPluginContributions['events']>['tool_call'],\n      tool_result: at(hookToolResult, contextSession) as NonNullable<PiPluginContributions['events']>['tool_result'],\n    },\n    get resources(): PiPluginContributions['resources'] { return [at(resourceDoompiUseHook, contextSession)]; },\n    services: [...(scopeSession.services ?? [])],\n  };\n});\n\nexport default extension;\n"],"mappings":"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"}