{"version":3,"file":"pi.mjs","names":["contribution","contribution","contribution","contribution","contribution","contribution","rootSession","commandTasks","hookSessionCompact","hookSessionStart","hookSessionTree","hookToolExecutionEnd","messageDoomTaskNotify","toolTask","renderTask"],"sources":["../../src/services/taskNarration/index.ts","../../src/extensions/workspaces/sessions/(backend)/_lib/root.cli.ts","../../src/extensions/workspaces/sessions/(backend)/root.cli.ts","../../src/extensions/workspaces/sessions/(backend)/command/tasks.cli.ts","../../src/extensions/workspaces/sessions/(backend)/hook/_lib/session-compact.cli.ts","../../src/extensions/workspaces/sessions/(backend)/hook/session-compact.cli.ts","../../src/extensions/workspaces/sessions/(backend)/hook/_lib/session-start.cli.ts","../../src/extensions/workspaces/sessions/(backend)/hook/session-start.cli.ts","../../src/extensions/workspaces/sessions/(backend)/hook/_lib/session-tree.cli.ts","../../src/extensions/workspaces/sessions/(backend)/hook/session-tree.cli.ts","../../src/extensions/workspaces/sessions/(backend)/hook/_lib/tool-execution-end.cli.ts","../../src/extensions/workspaces/sessions/(backend)/hook/tool-execution-end.cli.ts","../../src/extensions/workspaces/sessions/(backend)/tool/task.cli.ts","../../src/extensions/workspaces/sessions/(frontend)/tool/_lib/task.cli.ts","../../src/extensions/workspaces/sessions/(frontend)/tool/task.cli.ts","../../src/extensions/workspaces/sessions/(frontend)/message/doom-task-notify.cli.ts","../../generated/pi.ts"],"sourcesContent":["import type { Task, TaskDocument } from '../../models/task';\n\n/** Package-local narration sink; the Pi adapter binds it to the injected Cordis service. */\nexport interface TaskNarrationSink {\n  narrate(text: string): void;\n}\n\nconst COMPLETED_STATUS = 'completed';\nconst CANCELLED_STATE = 'cancelled';\nconst DELETED_STATUS = 'deleted';\n\nfunction visibleTasks(document: TaskDocument): Task[] {\n  return document.tasks.filter((task) => task.status !== DELETED_STATUS);\n}\n\nfunction formatTasks(prefix: string, tasks: Task[]): string {\n  const entries = tasks.map((task) => `Task ${task.id}: ${task.subject}`);\n  return `${prefix} ${entries.join('. ')}.`;\n}\n\n/**\n * Translate committed task-domain transitions into generic speech requests.\n * Voice remains unaware of tasks; this service owns all task-specific wording.\n */\nexport function narrateTaskCommit(requester: TaskNarrationSink, previous: TaskDocument, committed: TaskDocument): void {\n  const previousById = new Map(previous.tasks.map((task) => [task.id, task]));\n  const created = visibleTasks(committed).filter((task) => !previousById.has(task.id));\n  if (created.length > 0) {\n    const prefix = visibleTasks(previous).length === 0 ? 'Task list created.' : 'Task list updated.';\n    requester.narrate(formatTasks(prefix, created));\n  }\n\n  for (const task of committed.tasks) {\n    const prior = previousById.get(task.id);\n    if (!prior) continue;\n    if (prior.status !== COMPLETED_STATUS && task.status === COMPLETED_STATUS) {\n      requester.narrate(`Task completed: ${task.subject}.`);\n    }\n    if (prior.delegation?.state !== CANCELLED_STATE && task.delegation?.state === CANCELLED_STATE) {\n      requester.narrate(`Task cancelled: ${task.subject}.`);\n    }\n  }\n}\n","import {\n  DOOM_BACKGROUND_WORK_SERVICE,\n  type BackgroundWorkProviderHandle,\n  readDoomBackgroundWorkService,\n} from '@agimon-ai/doompi-core/backgroundWork';\nimport {\n  DOOM_CONTEXT_CONTRIBUTIONS_SERVICE,\n  requireDoomContextContributions,\n} from '@agimon-ai/doompi-core/contextContributions';\nimport { DOOM_DELEGATION_SERVICE, readDoomDelegationService } from '@agimon-ai/doompi-core/delegation';\nimport { defineRoot } from '@agimon-ai/doompi-core/extensionFile';\nimport {\n  createNarrationRequest,\n  DOOM_NARRATION_SERVICE,\n  type DoomNarrationService,\n  requireDoomNarrationService,\n} from '@agimon-ai/doompi-core/narration';\nimport type { PiPluginContext } from '@agimon-ai/doompi-core/piExtension';\nimport { readDoomReadinessCoordinator } from '@agimon-ai/doompi-core/readiness';\nimport { DOOM_UI_HUB_SERVICE, requireDoomUiHub } from '@agimon-ai/doompi-core/uiHub';\nimport type { Context } from '@deepseek-ai/cordis';\nimport type { ExtensionAPI, ExtensionContext, ExtensionUIContext } from '@earendil-works/pi-coding-agent';\n\nimport type { Task } from '../../../../../models/task';\nimport { COMMAND_NAME, TOOL_NAME } from '../../../../../schemas/task';\nimport { getDelegationTimeoutMs, getMaxTasks, getStoreTtlMs } from '../../../../../services/config';\nimport {\n  createTaskContextContribution,\n  TASK_CONTEXT_CONTRIBUTION_SOURCE,\n} from '../../../../../services/contextContribution';\nimport { BACKGROUND_WORK_PROVIDER, DelegationManager } from '../../../../../services/delegation';\nimport { createNodeDelegationPlatform } from '../../../../../services/delegationPlatform';\nimport { createTaskErrorReporter, TASK_EVENT, toFailureReporter } from '../../../../../services/logSinkTelemetry';\nimport {\n  hasStorePathOverride,\n  removeLegacyStoreDirectoryAsync,\n  resolveSessionKey,\n  sweepStoreFilesAsync,\n} from '../../../../../services/paths';\nimport { narrateTaskCommit, type TaskNarrationSink } from '../../../../../services/taskNarration';\nimport { TaskStore } from '../../../../../services/taskStore';\nimport type { TaskToolDependencies } from '../tool/_lib/task.cli';\n\nexport interface TaskOverlayContract {\n  setUICtx(context: ExtensionUIContext): void;\n  update(): void;\n  dispose(): void;\n  toggleCollapse(): void;\n  isRegistered(): boolean;\n}\n\nexport interface TaskRootPresentation {\n  createOverlay(options: { getTasks: () => readonly Task[]; delegation: DelegationManager }): TaskOverlayContract;\n  registerCollapseShortcut(\n    pi: Pick<ExtensionAPI, 'registerShortcut'>,\n    overlay: TaskOverlayContract,\n    waitUntilReady: (context: ExtensionContext) => Promise<void>,\n    isActive: () => boolean,\n  ): void;\n}\n\ninterface SessionContextLike {\n  hasUI: boolean;\n  ui: ExtensionUIContext;\n  sessionManager?: { getSessionId(): string };\n}\n\nconst LEADER_SOURCE = TASK_CONTEXT_CONTRIBUTION_SOURCE;\nconst NARRATION_FAILED_EVENT = 'doom_task.narration_failed';\n/** Between doom-plan's 60 and the core help group's 70, so `t` sits after `p`. */\nconst LEADER_GROUP_ORDER = 65;\nconst ERROR_TYPE_ATTRIBUTE = 'error.type';\n/**\n * Which part of session start ran. The telemetry sanitizer drops free text, so\n * the failing branch has to travel as a stable low-cardinality token.\n */\nconst SESSION_START_STAGE_ATTRIBUTE = 'task.stage';\nconst SESSION_START_STAGE = {\n  sessionId: 'session_id',\n  storeCleanup: 'store_cleanup',\n  storeSweep: 'store_sweep',\n  storeRead: 'store_read',\n  reconcile: 'reconcile',\n  refresh: 'refresh',\n} as const;\ntype SessionStartStage = (typeof SESSION_START_STAGE)[keyof typeof SESSION_START_STAGE];\n\n/**\n * Mirror of the telemetry sink's own `error.type` token. The sink overwrites it\n * for any defined error, so this only guarantees the attribute exists when the\n * thrown value is `undefined`.\n */\nfunction errorTypeToken(error: unknown): string {\n  if (error instanceof Error) return error.name || 'Error';\n  if (typeof error === 'string') return 'StringError';\n  if (error && typeof error === 'object') return 'ObjectError';\n  return 'UnknownError';\n}\n/** Install Task state and external resources into its host-owned Cordis plugin fiber. */\nconst createTaskRootExtension =\n  (presentation: TaskRootPresentation) =>\n  ({ context: cordis, pi, signal: pluginSignal }: PiPluginContext) => {\n    const errorReporter = createTaskErrorReporter();\n    const report = toFailureReporter(errorReporter);\n    let active = true;\n    let sessionGeneration = 0;\n    let narrationService: DoomNarrationService | undefined;\n    let store: TaskStore | undefined;\n    let delegation: DelegationManager | undefined;\n    let overlay: TaskOverlayContract | undefined;\n    let unwatch: (() => void) | undefined;\n    let backgroundWork: BackgroundWorkProviderHandle | undefined;\n    let disposeLeader: (() => void) | undefined;\n    let sessionId: string | undefined;\n    let sessionInitialization:\n      | {\n          readonly sessionManager: object;\n          readonly operation: Promise<void>;\n        }\n      | undefined;\n\n    const reportNarrationFailure = (error: unknown): void => {\n      void errorReporter.recordWarning(NARRATION_FAILED_EVENT, error).catch((telemetryError: unknown) => {\n        process.emitWarning(`Doom-task could not record a narration failure: ${String(telemetryError)}`);\n      });\n    };\n    const narrationSink: TaskNarrationSink = {\n      narrate(text) {\n        const service = narrationService;\n        const request = createNarrationRequest(text);\n        if (!service || !request) return;\n        try {\n          void Promise.resolve(service.request(request)).catch(reportNarrationFailure);\n        } catch (error) {\n          reportNarrationFailure(error);\n        }\n      },\n    };\n\n    const waitForSessionReadiness = async (\n      context: { readonly sessionManager: object },\n      signal?: AbortSignal,\n    ): Promise<void> => {\n      signal?.throwIfAborted();\n      const current = sessionInitialization;\n      if (!current) throw new Error('doom-task session initialization has not started');\n      if (current.sessionManager !== context.sessionManager) {\n        throw new Error('doom-task readiness belongs to a stale Pi session');\n      }\n      await current.operation;\n      signal?.throwIfAborted();\n      if (!active || pluginSignal.aborted || current !== sessionInitialization || !sessionId) {\n        throw new Error('doom-task readiness belongs to a stale extension generation');\n      }\n    };\n\n    const clearSessionResources = (): void => {\n      unwatch?.();\n      unwatch = undefined;\n      delegation?.reset();\n      overlay?.dispose();\n      sessionId = undefined;\n    };\n\n    const taskStore = new TaskStore({\n      report,\n      onCommitted: (previous, committed) => narrateTaskCommit(narrationSink, previous, committed),\n    });\n    store = taskStore;\n\n    const refresh = (): void => {\n      if (!active || pluginSignal.aborted) return;\n      overlay?.update();\n      backgroundWork?.update();\n    };\n\n    const delegationManager = new DelegationManager({\n      store: taskStore,\n      cwd: '',\n      platform: createNodeDelegationPlatform(),\n      notify: (message, options) => pi.sendMessage(message, options),\n      getSessionId: () => sessionId,\n      onChange: refresh,\n      runTimeoutMs: getDelegationTimeoutMs(),\n      report,\n      onNotifyError: (error, taskId) => {\n        void errorReporter.recordNotificationError(error, taskId);\n      },\n    });\n    delegation = delegationManager;\n\n    const taskOverlay = presentation.createOverlay({\n      getTasks: () => taskStore.snapshot.tasks,\n      delegation: delegationManager,\n    });\n    overlay = taskOverlay;\n\n    const toolDependencies: TaskToolDependencies = {\n      store: taskStore,\n      delegation: delegationManager,\n      maxTasks: getMaxTasks(),\n      onChange: refresh,\n      report,\n      waitUntilReady: waitForSessionReadiness,\n    };\n\n    const sessionStart = async (_event: unknown, ctx: ExtensionContext) => {\n      if (!active || pluginSignal.aborted) return;\n      const ownGeneration = ++sessionGeneration;\n      if (sessionId !== undefined) clearSessionResources();\n      const context = ctx as unknown as SessionContextLike;\n      const initialize = async (signal?: AbortSignal): Promise<void> => {\n        const isCurrent = (): boolean =>\n          !signal?.aborted && active && !pluginSignal.aborted && ownGeneration === sessionGeneration;\n        let stage: SessionStartStage = SESSION_START_STAGE.sessionId;\n        /**\n         * Run a stage whose failure only degrades task visibility. The session\n         * still starts, and the warning keeps the degraded state from being silent.\n         */\n        const degrade = async (next: SessionStartStage, operation: () => Promise<void>): Promise<void> => {\n          stage = next;\n          try {\n            await operation();\n          } catch (error) {\n            report.warn(TASK_EVENT.sessionStartDegraded, error, {\n              [SESSION_START_STAGE_ATTRIBUTE]: next,\n              [ERROR_TYPE_ATTRIBUTE]: errorTypeToken(error),\n            });\n          }\n        };\n        try {\n          const currentSessionId = context.sessionManager?.getSessionId();\n          if (!currentSessionId) throw new Error('doom-task requires a session id');\n          sessionId = currentSessionId;\n          delegationManager.setCwd(ctx.cwd);\n          taskStore.configureSession(resolveSessionKey(currentSessionId));\n          stage = SESSION_START_STAGE.storeCleanup;\n          const cleanup = await removeLegacyStoreDirectoryAsync(taskStore.storePath);\n          if (!isCurrent()) return;\n          stage = SESSION_START_STAGE.storeSweep;\n          const sweep = hasStorePathOverride()\n            ? { removed: [], errors: [] }\n            : await sweepStoreFilesAsync(taskStore.storePath, getStoreTtlMs());\n          if (!isCurrent()) return;\n          const storeErrors = [...cleanup.errors, ...sweep.errors];\n          for (const failure of storeErrors) report.warn(TASK_EVENT.storeSweepFailed, new Error(failure));\n          if (storeErrors.length > 0 && context.hasUI) context.ui.notify(storeErrors.join('\\n'), 'warning');\n          if (context.hasUI) taskOverlay.setUICtx(context.ui);\n          await degrade(SESSION_START_STAGE.storeRead, async () => {\n            await taskStore.readAsync(isCurrent);\n          });\n          if (!isCurrent()) return;\n          unwatch = taskStore.onExternalChange(refresh);\n          await degrade(SESSION_START_STAGE.reconcile, async () => {\n            await delegationManager.reconcile(isCurrent);\n          });\n          if (!isCurrent()) return;\n          stage = SESSION_START_STAGE.refresh;\n          refresh();\n        } catch (error) {\n          if (!isCurrent()) return;\n          clearSessionResources();\n          report.error(TASK_EVENT.sessionStartFailed, error, {\n            [SESSION_START_STAGE_ATTRIBUTE]: stage,\n            [ERROR_TYPE_ATTRIBUTE]: errorTypeToken(error),\n          });\n          throw error;\n        }\n      };\n\n      const coordinator = readDoomReadinessCoordinator(cordis);\n      if (!coordinator) {\n        const operation = initialize();\n        sessionInitialization = { sessionManager: ctx.sessionManager, operation };\n        return operation;\n      }\n\n      const previous = sessionInitialization?.operation;\n      const operation = (async (): Promise<void> => {\n        if (previous) await Promise.allSettled([previous]);\n        if (!active || pluginSignal.aborted || ownGeneration !== sessionGeneration) return;\n        const handle = coordinator.start(\n          LEADER_SOURCE,\n          `${ctx.sessionManager.getSessionId()}:${ownGeneration}`,\n          async (signal) => {\n            await initialize(signal);\n            return { value: undefined };\n          },\n        );\n        await handle.wait();\n      })();\n      sessionInitialization = { sessionManager: ctx.sessionManager, operation };\n      // Config's coordinator owns the single failure notification. This detached\n      // observer only keeps a failed background generation from going unhandled.\n      void Promise.allSettled([operation]);\n      return undefined;\n    };\n\n    const toolExecutionEnd = (event: { toolName: string }) => {\n      if (active && !pluginSignal.aborted && event.toolName === TOOL_NAME) refresh();\n    };\n    const dispose = async () => {\n      if (!active) return;\n      active = false;\n      sessionGeneration += 1;\n      const pendingInitialization = sessionInitialization?.operation;\n      sessionInitialization = undefined;\n      try {\n        if (pendingInitialization) await Promise.allSettled([pendingInitialization]);\n        clearSessionResources();\n        delegation?.dispose();\n        disposeLeader?.();\n        disposeLeader = undefined;\n        store?.dispose();\n      } finally {\n        await errorReporter.shutdown();\n      }\n    };\n    return {\n      value: {\n        taskStore,\n        delegationManager,\n        taskOverlay,\n        toolDependencies,\n        waitForSessionReadiness,\n        refresh,\n        sessionStart,\n        toolExecutionEnd,\n        isActive: () => active && !pluginSignal.aborted,\n      },\n      services: [\n        (cordis: Context) => {\n          cordis.inject([DOOM_NARRATION_SERVICE], (serviceContext) => {\n            const service = requireDoomNarrationService(serviceContext);\n            narrationService = service;\n            return () => {\n              if (narrationService === service) narrationService = undefined;\n            };\n          });\n          cordis.inject([DOOM_CONTEXT_CONTRIBUTIONS_SERVICE], (contextContributionsContext) => {\n            const registration = requireDoomContextContributions(contextContributionsContext).register(\n              createTaskContextContribution(() => taskStore.snapshot.tasks),\n            );\n            return () => registration.dispose();\n          });\n          cordis.inject([DOOM_DELEGATION_SERVICE], (serviceContext) => {\n            const service = readDoomDelegationService(serviceContext);\n            if (!service) return undefined;\n            return delegationManager.bind(serviceContext, service);\n          });\n          cordis.inject([DOOM_BACKGROUND_WORK_SERVICE], (serviceContext) => {\n            const service = readDoomBackgroundWorkService(serviceContext);\n            if (!service) return undefined;\n            const handle = service.register({\n              provider: BACKGROUND_WORK_PROVIDER,\n              listActiveWork: () => delegationManager.listActiveWork(),\n            });\n            backgroundWork = handle;\n            return () => {\n              handle.dispose();\n              if (backgroundWork === handle) backgroundWork = undefined;\n            };\n          });\n          cordis.inject([DOOM_UI_HUB_SERVICE], (uiContext) => {\n            const contribution = requireDoomUiHub(uiContext).registerLeader({\n              source: LEADER_SOURCE,\n              bindings: [\n                {\n                  id: 'tasks.open',\n                  path: [\n                    { key: 't', label: 'tasks', detail: 'session task list', order: LEADER_GROUP_ORDER },\n                    { key: 'l', label: 'list', detail: 'tasks in this session' },\n                  ],\n                  command: { name: COMMAND_NAME },\n                },\n              ],\n            });\n            const dispose = (): void => contribution.dispose();\n            disposeLeader = dispose;\n            return () => {\n              dispose();\n              if (disposeLeader === dispose) disposeLeader = undefined;\n            };\n          });\n        },\n      ],\n      onStop: dispose,\n      onDispose: dispose,\n      onStart() {\n        presentation.registerCollapseShortcut(\n          pi,\n          taskOverlay,\n          waitForSessionReadiness,\n          () => active && !pluginSignal.aborted,\n        );\n      },\n    };\n  };\nexport const createTaskRoot = (presentation: TaskRootPresentation) => defineRoot(createTaskRootExtension(presentation));\nexport type TaskPiScope = Awaited<ReturnType<ReturnType<typeof createTaskRoot>>>['value'];\n","import { defineRoot } from '@agimon-ai/doompi-core/extensionFile';\n\nimport { registerTaskCollapseShortcut, TaskOverlay } from '../(frontend)/overlay/_lib/taskOverlay';\nimport { createTaskRoot } from './_lib/root.cli';\n\nexport default defineRoot(\n  createTaskRoot({\n    createOverlay: (options) => new TaskOverlay(options),\n    registerCollapseShortcut: registerTaskCollapseShortcut,\n  }),\n);\n","import { defineCliCommand } from '@agimon-ai/doompi-core/extensionFile';\n\nimport { openTaskSpace } from '../../(frontend)/overlay/_lib/task-space.cli';\nimport { createTasksContribution } from './_lib/tasks.cli';\n\nexport default defineCliCommand(createTasksContribution(openTaskSpace));\n","import type { WithRoot } from '@agimon-ai/doompi-core/extensionFile';\nimport type { PiPluginContext } from '@agimon-ai/doompi-core/piExtension';\n\nimport type { TaskPiScope } from '../../_lib/root.cli';\n\nexport default (context: WithRoot<PiPluginContext, TaskPiScope>) => context.root.refresh;\n","import { defineCliHook } from '@agimon-ai/doompi-core/extensionFile';\n\nimport contribution from './_lib/session-compact.cli';\n\nexport default defineCliHook(contribution);\n","import type { WithRoot } from '@agimon-ai/doompi-core/extensionFile';\nimport type { PiPluginContext } from '@agimon-ai/doompi-core/piExtension';\n\nimport type { TaskPiScope } from '../../_lib/root.cli';\n\nexport default (context: WithRoot<PiPluginContext, TaskPiScope>) => context.root.sessionStart;\n","import { defineCliHook } from '@agimon-ai/doompi-core/extensionFile';\n\nimport contribution from './_lib/session-start.cli';\n\nexport default defineCliHook(contribution);\n","import type { WithRoot } from '@agimon-ai/doompi-core/extensionFile';\nimport type { PiPluginContext } from '@agimon-ai/doompi-core/piExtension';\n\nimport type { TaskPiScope } from '../../_lib/root.cli';\n\nexport default (context: WithRoot<PiPluginContext, TaskPiScope>) => context.root.refresh;\n","import { defineCliHook } from '@agimon-ai/doompi-core/extensionFile';\n\nimport contribution from './_lib/session-tree.cli';\n\nexport default defineCliHook(contribution);\n","import type { WithRoot } from '@agimon-ai/doompi-core/extensionFile';\nimport type { PiPluginContext } from '@agimon-ai/doompi-core/piExtension';\n\nimport type { TaskPiScope } from '../../_lib/root.cli';\n\nexport default (context: WithRoot<PiPluginContext, TaskPiScope>) => context.root.toolExecutionEnd;\n","import { defineCliHook } from '@agimon-ai/doompi-core/extensionFile';\n\nimport contribution from './_lib/tool-execution-end.cli';\n\nexport default defineCliHook(contribution);\n","import { defineCliTool } from '@agimon-ai/doompi-core/extensionFile';\n\nimport contribution from './_lib/task.cli';\n\nexport default defineCliTool(contribution);\n","import type { WithRoot } from '@agimon-ai/doompi-core/extensionFile';\nimport { definePiToolRenderer, type PiPluginContext } from '@agimon-ai/doompi-core/piExtension';\n\nimport type { TaskStore } from '../../../../../../services/taskStore';\nimport { renderTaskCall, renderTaskResult } from '../../_shared/format.cli';\n\n/** Pair the tool presentation with the same session store used by execution. */\nexport default (context: WithRoot<PiPluginContext, { taskStore: TaskStore }>) =>\n  definePiToolRenderer({\n    renderShell: 'self',\n    renderCall: (params, theme) => renderTaskCall(params as never, theme, context.root.taskStore.snapshot.tasks),\n    renderResult: renderTaskResult,\n  });\n","import { defineCliToolRenderer } from '@agimon-ai/doompi-core/piExtension';\n\nimport contribution from './_lib/task.cli';\n\nexport default defineCliToolRenderer(contribution);\n","import { defineMessageRenderer } from '@agimon-ai/doompi-core/piExtension';\nimport { Text } from '@earendil-works/pi-tui';\n\nimport { NOTIFY_CUSTOM_TYPE } from '../../../../../services/delegation';\n\nexport default defineMessageRenderer(\n  NOTIFY_CUSTOM_TYPE,\n  (message, _options, theme) =>\n    new Text(theme.fg('muted', typeof message.content === 'string' ? message.content : ''), 0, 0),\n);\n","// Generated by @agimon-ai/doompi-build. Do not edit by hand.\nimport { definePiExtension, piToolContributions, withPiRenderers, 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 commandTasks from '../src/extensions/workspaces/sessions/(backend)/command/tasks.cli';\nimport hookSessionCompact from '../src/extensions/workspaces/sessions/(backend)/hook/session-compact.cli';\nimport hookSessionStart from '../src/extensions/workspaces/sessions/(backend)/hook/session-start.cli';\nimport hookSessionTree from '../src/extensions/workspaces/sessions/(backend)/hook/session-tree.cli';\nimport hookToolExecutionEnd from '../src/extensions/workspaces/sessions/(backend)/hook/tool-execution-end.cli';\nimport toolTask from '../src/extensions/workspaces/sessions/(backend)/tool/task.cli';\nimport renderTask from '../src/extensions/workspaces/sessions/(frontend)/tool/task.cli';\nimport messageDoomTaskNotify from '../src/extensions/workspaces/sessions/(frontend)/message/doom-task-notify.cli';\n\ntype OptionsOf<T> = T extends (context: PiPluginContext<infer Options>) => unknown ? Options : never;\ntype InferredOptions = Exclude<OptionsOf<typeof rootSession> | OptionsOf<typeof commandTasks> | OptionsOf<typeof hookSessionCompact> | OptionsOf<typeof hookSessionStart> | OptionsOf<typeof hookSessionTree> | OptionsOf<typeof hookToolExecutionEnd> | OptionsOf<typeof toolTask> | OptionsOf<typeof messageDoomTaskNotify>, 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;\nconst via = <T>(identity: Record<string, unknown>, value: unknown): T =>\n  (value === undefined ? undefined : { ...identity, ...(value as object) }) as T;\n\nexport const extension = definePiExtension<ExtensionOptions>('@agimon-ai/doompi-task', async (context) => {\n  const scopeSession = await rootSession(context);\n  const contextSession = { ...context, root: scopeSession.value };\n  return {\n    ...composeRootHooks(scopeSession),\n    get commands(): PiPluginContributions['commands'] { return [at(commandTasks, contextSession)]; },\n    events: {\n      session_compact: at(hookSessionCompact, contextSession) as NonNullable<PiPluginContributions['events']>['session_compact'],\n      session_start: at(hookSessionStart, contextSession) as NonNullable<PiPluginContributions['events']>['session_start'],\n      session_tree: at(hookSessionTree, contextSession) as NonNullable<PiPluginContributions['events']>['session_tree'],\n      tool_execution_end: at(hookToolExecutionEnd, contextSession) as NonNullable<PiPluginContributions['events']>['tool_execution_end'],\n    },\n    get messageRenderers(): PiPluginContributions['messageRenderers'] { return [at(messageDoomTaskNotify, contextSession)]; },\n    ...piToolContributions('@agimon-ai/doompi-task', [via({ name: 'task' }, withPiRenderers(at(toolTask, contextSession), at(renderTask, contextSession)))]),\n    services: [...(scopeSession.services ?? [])],\n  };\n});\n\nexport default extension;\n"],"mappings":"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"}