@agimon-ai/doompi-task 0.0.1-alpha.87 → 0.0.1-alpha.89

This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
Files changed (53) hide show
  1. package/dist/commands.d.mts +1 -1
  2. package/dist/{delegation-BtzyLnYM.cjs → delegation-3hMdTFXF.cjs} +4 -1
  3. package/dist/delegation-3hMdTFXF.cjs.map +1 -0
  4. package/dist/{delegation-CTFGZtwp.mjs → delegation-CkGbRaOl.mjs} +4 -1
  5. package/dist/delegation-CkGbRaOl.mjs.map +1 -0
  6. package/dist/delegationManager.cjs +1 -1
  7. package/dist/delegationManager.d.mts +1 -1
  8. package/dist/delegationManager.mjs +1 -1
  9. package/dist/extensions/mcp-ui.mjs +23 -0
  10. package/dist/extensions/mcp-ui.mjs.map +1 -0
  11. package/dist/extensions/mcp.cjs +11 -1
  12. package/dist/extensions/mcp.cjs.map +1 -1
  13. package/dist/extensions/mcp.d.mts.map +1 -1
  14. package/dist/extensions/mcp.mjs +11 -1
  15. package/dist/extensions/mcp.mjs.map +1 -1
  16. package/dist/extensions/pi.cjs +6 -5
  17. package/dist/extensions/pi.cjs.map +1 -1
  18. package/dist/extensions/pi.mjs +6 -5
  19. package/dist/extensions/pi.mjs.map +1 -1
  20. package/dist/extensions/server.cjs +1 -1
  21. package/dist/extensions/server.mjs +1 -1
  22. package/dist/{format.cli-CKxfl-lR.cjs → format.cli-ChQsP1MQ.cjs} +2 -2
  23. package/dist/{format.cli-CKxfl-lR.cjs.map → format.cli-ChQsP1MQ.cjs.map} +1 -1
  24. package/dist/{format.cli-CuTlvk8J.mjs → format.cli-Cnc591eb.mjs} +2 -2
  25. package/dist/{format.cli-CuTlvk8J.mjs.map → format.cli-Cnc591eb.mjs.map} +1 -1
  26. package/dist/{index-BUmf786V.d.mts → index-3-3ZJlaH.d.mts} +2 -1
  27. package/dist/index-3-3ZJlaH.d.mts.map +1 -0
  28. package/dist/index.cjs +1 -1
  29. package/dist/index.d.mts +2 -2
  30. package/dist/index.mjs +1 -1
  31. package/dist/{root.cli-BfEKqt8s.d.mts → root.cli-swHZqusx.d.mts} +2 -2
  32. package/dist/{root.cli-BfEKqt8s.d.mts.map → root.cli-swHZqusx.d.mts.map} +1 -1
  33. package/dist/{task-space.cli-BdDqn-_h.cjs → task-space.cli-BH4Iy_7m.cjs} +2 -2
  34. package/dist/{task-space.cli-BdDqn-_h.cjs.map → task-space.cli-BH4Iy_7m.cjs.map} +1 -1
  35. package/dist/{task-space.cli-DowNll0k.mjs → task-space.cli-CMYNjgOW.mjs} +2 -2
  36. package/dist/{task-space.cli-DowNll0k.mjs.map → task-space.cli-CMYNjgOW.mjs.map} +1 -1
  37. package/dist/{taskOverlay-BKiu4cVj.cjs → taskOverlay-B5wJHiml.cjs} +2 -2
  38. package/dist/{taskOverlay-BKiu4cVj.cjs.map → taskOverlay-B5wJHiml.cjs.map} +1 -1
  39. package/dist/{taskOverlay-DVvLdTtf.mjs → taskOverlay-CljDoTj_.mjs} +2 -2
  40. package/dist/{taskOverlay-DVvLdTtf.mjs.map → taskOverlay-CljDoTj_.mjs.map} +1 -1
  41. package/dist/toolTaskTool.d.mts +1 -1
  42. package/dist/tuiFormat.cjs +1 -1
  43. package/dist/tuiFormat.d.mts +1 -1
  44. package/dist/tuiFormat.mjs +1 -1
  45. package/dist/tuiTaskOverlay.cjs +1 -1
  46. package/dist/tuiTaskOverlay.d.mts +1 -1
  47. package/dist/tuiTaskOverlay.mjs +1 -1
  48. package/dist/tuiTaskSpace.cjs +1 -1
  49. package/dist/tuiTaskSpace.mjs +1 -1
  50. package/package.json +15 -8
  51. package/dist/delegation-BtzyLnYM.cjs.map +0 -1
  52. package/dist/delegation-CTFGZtwp.mjs.map +0 -1
  53. package/dist/index-BUmf786V.d.mts.map +0 -1
@@ -8,13 +8,13 @@ require("../task-Dqy88_rr.cjs");
8
8
  const require_tasks_cli = require("../tasks.cli-8VvuN9YQ.cjs");
9
9
  const require_config = require("../config-BPNE_wEU.cjs");
10
10
  const require_telemetry = require("../telemetry-I4md7Xzz.cjs");
11
- const require_delegation = require("../delegation-BtzyLnYM.cjs");
11
+ const require_delegation = require("../delegation-3hMdTFXF.cjs");
12
12
  const require_task_cli = require("../task.cli-CiTkjUaX.cjs");
13
13
  const require_taskStore = require("../taskStore-T1pPy-UJ.cjs");
14
14
  const require_logSinkTelemetry = require("../logSinkTelemetry-CqiTuh3a.cjs");
15
- const require_format_cli = require("../format.cli-CKxfl-lR.cjs");
16
- const require_taskOverlay = require("../taskOverlay-BKiu4cVj.cjs");
17
- const require_task_space_cli = require("../task-space.cli-BdDqn-_h.cjs");
15
+ const require_format_cli = require("../format.cli-ChQsP1MQ.cjs");
16
+ const require_taskOverlay = require("../taskOverlay-B5wJHiml.cjs");
17
+ const require_task_space_cli = require("../task-space.cli-BH4Iy_7m.cjs");
18
18
  const require_delegationPlatform = require("../delegationPlatform-Cfn-Lqew.cjs");
19
19
  let _agimon_ai_doompi_core_delegation = require("@agimon-ai/doompi-core/delegation");
20
20
  let _agimon_ai_doompi_core_extensionFile = require("@agimon-ai/doompi-core/extensionFile");
@@ -142,7 +142,7 @@ const createTaskRootExtension = (presentation) => ({ context: cordis, pi, signal
142
142
  };
143
143
  const delegationManager = new require_delegation.DelegationManager({
144
144
  store: taskStore,
145
- cwd: process.cwd(),
145
+ cwd: "",
146
146
  platform: require_delegationPlatform.createNodeDelegationPlatform(),
147
147
  notify: (message, options) => pi.sendMessage(message, options),
148
148
  getSessionId: () => sessionId,
@@ -194,6 +194,7 @@ const createTaskRootExtension = (presentation) => ({ context: cordis, pi, signal
194
194
  const currentSessionId = context.sessionManager?.getSessionId();
195
195
  if (!currentSessionId) throw new Error("doom-task requires a session id");
196
196
  sessionId = currentSessionId;
197
+ delegationManager.setCwd(ctx.cwd);
197
198
  taskStore.configureSession(require_paths.resolveSessionKey(currentSessionId));
198
199
  stage = SESSION_START_STAGE.storeCleanup;
199
200
  const cleanup = await require_paths.removeLegacyStoreDirectoryAsync(taskStore.storePath);
@@ -1 +1 @@
1
- {"version":3,"file":"pi.cjs","names":["TASK_CONTEXT_CONTRIBUTION_SOURCE","createTaskErrorReporter","toFailureReporter","createNarrationRequest","TaskStore","DelegationManager","createNodeDelegationPlatform","getDelegationTimeoutMs","getMaxTasks","TASK_EVENT","resolveSessionKey","removeLegacyStoreDirectoryAsync","hasStorePathOverride","sweepStoreFilesAsync","getStoreTtlMs","readDoomReadinessCoordinator","DOOM_NARRATION_SERVICE","requireDoomNarrationService","DOOM_CONTEXT_CONTRIBUTIONS_SERVICE","requireDoomContextContributions","createTaskContextContribution","DOOM_DELEGATION_SERVICE","readDoomDelegationService","DOOM_BACKGROUND_WORK_SERVICE","readDoomBackgroundWorkService","BACKGROUND_WORK_PROVIDER","DOOM_UI_HUB_SERVICE","requireDoomUiHub","COMMAND_NAME","defineRoot","defineRoot","TaskOverlay","registerTaskCollapseShortcut","defineCliCommand","createTasksContribution","openTaskSpace","defineCliHook","contribution","defineCliHook","contribution","defineCliHook","contribution","defineCliHook","contribution","defineCliTool","contribution","definePiToolRenderer","renderTaskCall","renderTaskResult","defineCliToolRenderer","contribution","defineMessageRenderer","NOTIFY_CUSTOM_TYPE","Text","definePiExtension","rootSession","composeRootHooks","commandTasks","hookSessionCompact","hookSessionStart","hookSessionTree","hookToolExecutionEnd","messageDoomTaskNotify","piToolContributions","withPiRenderers","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: process.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 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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"}
1
+ {"version":3,"file":"pi.cjs","names":["TASK_CONTEXT_CONTRIBUTION_SOURCE","createTaskErrorReporter","toFailureReporter","createNarrationRequest","TaskStore","DelegationManager","createNodeDelegationPlatform","getDelegationTimeoutMs","getMaxTasks","TASK_EVENT","resolveSessionKey","removeLegacyStoreDirectoryAsync","hasStorePathOverride","sweepStoreFilesAsync","getStoreTtlMs","readDoomReadinessCoordinator","DOOM_NARRATION_SERVICE","requireDoomNarrationService","DOOM_CONTEXT_CONTRIBUTIONS_SERVICE","requireDoomContextContributions","createTaskContextContribution","DOOM_DELEGATION_SERVICE","readDoomDelegationService","DOOM_BACKGROUND_WORK_SERVICE","readDoomBackgroundWorkService","BACKGROUND_WORK_PROVIDER","DOOM_UI_HUB_SERVICE","requireDoomUiHub","COMMAND_NAME","defineRoot","defineRoot","TaskOverlay","registerTaskCollapseShortcut","defineCliCommand","createTasksContribution","openTaskSpace","defineCliHook","contribution","defineCliHook","contribution","defineCliHook","contribution","defineCliHook","contribution","defineCliTool","contribution","definePiToolRenderer","renderTaskCall","renderTaskResult","defineCliToolRenderer","contribution","defineMessageRenderer","NOTIFY_CUSTOM_TYPE","Text","definePiExtension","rootSession","composeRootHooks","commandTasks","hookSessionCompact","hookSessionStart","hookSessionTree","hookToolExecutionEnd","messageDoomTaskNotify","piToolContributions","withPiRenderers","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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"}
@@ -3,14 +3,14 @@ import "../task-DKHKuems.mjs";
3
3
  import { n as createTasksContribution } from "../tasks.cli-BZj83YD_.mjs";
4
4
  import { f as getDelegationTimeoutMs, h as getStoreTtlMs, p as getMaxTasks } from "../config-DmsCPDuF.mjs";
5
5
  import { t as TASK_EVENT } from "../telemetry-PmX_1Y8a.mjs";
6
- import { n as DelegationManager, o as NOTIFY_CUSTOM_TYPE, t as BACKGROUND_WORK_PROVIDER } from "../delegation-CTFGZtwp.mjs";
6
+ import { n as DelegationManager, o as NOTIFY_CUSTOM_TYPE, t as BACKGROUND_WORK_PROVIDER } from "../delegation-CkGbRaOl.mjs";
7
7
  import { r as task_cli_default$3 } from "../task.cli-BM34E7GG.mjs";
8
8
  import { a as removeLegacyStoreDirectoryAsync, c as resolveSessionKey, d as sweepStoreFilesAsync, n as hasStorePathOverride } from "../paths-Bg8EEbk1.mjs";
9
9
  import { t as TaskStore } from "../taskStore-CFx12KJk.mjs";
10
10
  import { n as toFailureReporter, t as createTaskErrorReporter } from "../logSinkTelemetry-C5QjZipw.mjs";
11
- import { d as renderTaskCall, f as renderTaskResult } from "../format.cli-CuTlvk8J.mjs";
12
- import { n as registerTaskCollapseShortcut, t as TaskOverlay } from "../taskOverlay-DVvLdTtf.mjs";
13
- import { r as openTaskSpace } from "../task-space.cli-DowNll0k.mjs";
11
+ import { d as renderTaskCall, f as renderTaskResult } from "../format.cli-Cnc591eb.mjs";
12
+ import { n as registerTaskCollapseShortcut, t as TaskOverlay } from "../taskOverlay-CljDoTj_.mjs";
13
+ import { r as openTaskSpace } from "../task-space.cli-CMYNjgOW.mjs";
14
14
  import { i as createTaskContextContribution, n as TASK_CONTEXT_CONTRIBUTION_SOURCE, t as createNodeDelegationPlatform } from "../delegationPlatform-DZ4SZ8a5.mjs";
15
15
  import { DOOM_DELEGATION_SERVICE, readDoomDelegationService } from "@agimon-ai/doompi-core/delegation";
16
16
  import { composeRootHooks, defineCliCommand, defineCliHook, defineCliTool, defineRoot } from "@agimon-ai/doompi-core/extensionFile";
@@ -138,7 +138,7 @@ const createTaskRootExtension = (presentation) => ({ context: cordis, pi, signal
138
138
  };
139
139
  const delegationManager = new DelegationManager({
140
140
  store: taskStore,
141
- cwd: process.cwd(),
141
+ cwd: "",
142
142
  platform: createNodeDelegationPlatform(),
143
143
  notify: (message, options) => pi.sendMessage(message, options),
144
144
  getSessionId: () => sessionId,
@@ -190,6 +190,7 @@ const createTaskRootExtension = (presentation) => ({ context: cordis, pi, signal
190
190
  const currentSessionId = context.sessionManager?.getSessionId();
191
191
  if (!currentSessionId) throw new Error("doom-task requires a session id");
192
192
  sessionId = currentSessionId;
193
+ delegationManager.setCwd(ctx.cwd);
193
194
  taskStore.configureSession(resolveSessionKey(currentSessionId));
194
195
  stage = SESSION_START_STAGE.storeCleanup;
195
196
  const cleanup = await removeLegacyStoreDirectoryAsync(taskStore.storePath);
@@ -1 +1 @@
1
- {"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: process.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 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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"}
1
+ {"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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"}
@@ -6,7 +6,7 @@ const require_paths = require("../paths-BsFVRulr.cjs");
6
6
  const require_task = require("../task-DaagqdPK.cjs");
7
7
  const require_task$1 = require("../task-Dqy88_rr.cjs");
8
8
  const require_config = require("../config-BPNE_wEU.cjs");
9
- const require_delegation = require("../delegation-BtzyLnYM.cjs");
9
+ const require_delegation = require("../delegation-3hMdTFXF.cjs");
10
10
  const require_taskResult = require("../taskResult-D2G7b4w-.cjs");
11
11
  const require_reducer = require("../reducer-BV0YIZ2o.cjs");
12
12
  const require_taskStore = require("../taskStore-T1pPy-UJ.cjs");
@@ -1,7 +1,7 @@
1
1
  import { t as COMMAND_NAME } from "../task-B4aF5J9s.mjs";
2
2
  import { f as TaskParamsSchema } from "../task-DKHKuems.mjs";
3
3
  import { f as getDelegationTimeoutMs, h as getStoreTtlMs, p as getMaxTasks } from "../config-DmsCPDuF.mjs";
4
- import { n as DelegationManager } from "../delegation-CTFGZtwp.mjs";
4
+ import { n as DelegationManager } from "../delegation-CkGbRaOl.mjs";
5
5
  import { a as buildAssignmentResult, c as formatAssignmentResults, o as buildTextResult, s as buildToolResult } from "../taskResult-edBAAKSH.mjs";
6
6
  import { a as isCommittingOp, r as applyTaskMutation } from "../reducer-BEfJFM5L.mjs";
7
7
  import { a as removeLegacyStoreDirectoryAsync, c as resolveSessionKey, d as sweepStoreFilesAsync, l as resolveStorePath } from "../paths-Bg8EEbk1.mjs";
@@ -1,4 +1,4 @@
1
- const require_delegation = require("./delegation-BtzyLnYM.cjs");
1
+ const require_delegation = require("./delegation-3hMdTFXF.cjs");
2
2
  let _agimon_ai_doompi_ui_theme = require("@agimon-ai/doompi-ui/theme");
3
3
  let _agimon_ai_doompi_ui_toolChrome = require("@agimon-ai/doompi-ui/toolChrome");
4
4
  let _earendil_works_pi_tui = require("@earendil-works/pi-tui");
@@ -390,4 +390,4 @@ Object.defineProperty(exports, "renderTaskResult", {
390
390
  }
391
391
  });
392
392
 
393
- //# sourceMappingURL=format.cli-CKxfl-lR.cjs.map
393
+ //# sourceMappingURL=format.cli-ChQsP1MQ.cjs.map