{"version":3,"file":"server.cjs","names":["defineRoot","getMaxTasks","TaskStore","resolveSessionKey","DelegationManager","createNodeDelegationPlatform","getDelegationTimeoutMs","DOOM_DELEGATION_SERVICE","readDoomDelegationService","removeLegacyStoreDirectoryAsync","sweepStoreFilesAsync","getStoreTtlMs","defineRoot","contribution","TaskStore","resolveStorePath","defineChannel","contribution","applyTaskMutation","isCommittingOp","buildToolResult","TaskParamsSchema","Check","formatAssignmentResults","buildAssignmentResult","buildTextResult","COMMAND_NAME","defineServerCommand","contribution","formatTaskSnapshots","activeTaskSnapshots","defineResource","contribution","defineServerTool","defineServerTool","contribution","defineServerPlugin","channelTaskGraph","rootSession","composeRootHooks","commandTasks","resourceTaskBoard","toolTask"],"sources":["../../src/types/webTasks.ts","../../src/extensions/workspaces/sessions/(backend)/_lib/root.server.ts","../../src/extensions/workspaces/sessions/(backend)/root.server.ts","../../src/extensions/(backend)/channel/_lib/task-graph.ts","../../src/extensions/(backend)/channel/task-graph.server.ts","../../src/services/taskTool/index.ts","../../src/extensions/workspaces/sessions/(backend)/command/_lib/tasks.server.ts","../../src/extensions/workspaces/sessions/(backend)/command/tasks.server.ts","../../src/extensions/workspaces/sessions/(backend)/resource/_lib/task-board.server.ts","../../src/extensions/workspaces/sessions/(backend)/resource/task-board.server.ts","../../src/extensions/workspaces/sessions/(backend)/tool/_lib/task.server.ts","../../src/extensions/workspaces/sessions/(backend)/tool/task.server.ts","../../generated/server.ts"],"sourcesContent":["/** Browser-safe task view published by the cockpit hub channel. */\nexport const TASKS_CHANNEL_TYPE = 'task_graph';\n\nexport type WebTaskStatus = 'pending' | 'in_progress' | 'completed' | 'failed' | 'deleted';\n\nexport interface WebTask {\n  id: number;\n  subject: string;\n  description?: string;\n  activeForm?: string;\n  status: WebTaskStatus;\n  blockedBy: number[];\n  owner?: string;\n  updatedAt?: string;\n  delegation?: {\n    agent?: string;\n    state?: string;\n  };\n}\n\nexport interface WebTasksPayload {\n  tasks: WebTask[];\n  rev: number;\n}\n","import { DOOM_DELEGATION_SERVICE, readDoomDelegationService } from '@agimon-ai/doompi-core/delegation';\nimport { defineRoot } from '@agimon-ai/doompi-core/extensionFile';\nimport type { DoomServerPluginContext } from '@agimon-ai/doompi-core/serverFacet';\nimport type { Context } from '@deepseek-ai/cordis';\n\nimport { getDelegationTimeoutMs, getMaxTasks, getStoreTtlMs } from '../../../../../services/config';\nimport { DelegationManager } from '../../../../../services/delegation';\nimport { createNodeDelegationPlatform } from '../../../../../services/delegationPlatform';\nimport {\n  removeLegacyStoreDirectoryAsync,\n  resolveSessionKey,\n  sweepStoreFilesAsync,\n} from '../../../../../services/paths';\nimport { TaskStore } from '../../../../../services/taskStore';\nimport { TASKS_CHANNEL_TYPE } from '../../../../../types/webTasks';\n\nconst SOURCE = '@agimon-ai/doompi-task';\n\n/** The notification body: one line, since `client.notify` collapses the rest anyway. */\nfunction headlineOf(content: string): string {\n  return content.split('\\n').find((line) => line.trim().length > 0) ?? content;\n}\n\nconst root = defineRoot(({ host: serverHost, agent: host }: DoomServerPluginContext) => {\n  if (!host) throw new Error('Task session requires the headless host.');\n  const execution = host.context;\n  if (serverHost.context.directEvents === undefined)\n    throw new Error('Task headless facet requires the session direct event bus.');\n  const directEvents = serverHost.context.directEvents;\n  const maxTasks = getMaxTasks(execution.environment);\n  const store = new TaskStore({\n    env: execution.environment,\n    onCommitted: (_previous, committed) => {\n      execution.client.setStatus(SOURCE, `tasks: ${committed.tasks.length}`);\n      directEvents.publish(TASKS_CHANNEL_TYPE, execution.sessionId, committed);\n    },\n  });\n  store.configureSession(resolveSessionKey(execution.sessionId, execution.environment));\n  let notifications: Promise<void> = Promise.resolve();\n  const manager = new DelegationManager({\n    store,\n    cwd: execution.cwd,\n    platform: createNodeDelegationPlatform(execution.environment),\n    getSessionId: () => execution.sessionId,\n    notify: (message, options) => {\n      // `DelegationNotifier` is Pi's `sendMessage` shape, and the Pi facet\n      // forwards it verbatim (`root.cli.ts`). A headless session has no such\n      // single call, so the three jobs are done by hand:\n      //\n      //   toast      `client.notify` - operator-facing only, flattened to one\n      //              line and capped at 4096 chars, and the model never sees a\n      //              custom entry. It gets the headline, not the whole result.\n      //   transcript `session.appendCustomEntry` under the same custom type,\n      //              carrying the full multi-line content.\n      //   wake       `session.admitPrompt(content, 'steer')` - the only call\n      //              that puts the completion in front of the model.\n      //              `session.prompt(_, 'steer')` is enqueue-only and parks the\n      //              message on an idle lane, which is why a finished subagent\n      //              used to leave the agent sitting idle.\n      //\n      // Sequenced so two delegations settling in the same tick each observe\n      // settled lane state rather than racing.\n      notifications = notifications\n        .then(async () => {\n          await execution.client.notify({ body: headlineOf(message.content), level: 'info' });\n          await execution.session.appendCustomEntry(message.customType, { content: message.content });\n          // `triggerTurn: false` has no faithful headless mapping - there is no\n          // way to reach model context without starting or joining a turn - so\n          // it stays a toast, as it is today. `DelegationManager` always sends\n          // `true`, so this is defensive rather than live.\n          if (options?.triggerTurn === false) return;\n          // Matching the voice facet, which also refuses rather than degrading:\n          // `session.prompt(_, 'steer')` is NOT a fallback here, because it is\n          // enqueue-only and would park the message on an idle lane - the\n          // original bug.\n          if (!execution.session.admitPrompt) throw new Error('The session cannot admit a task notification.');\n          await execution.session.admitPrompt(message.content, 'steer');\n        })\n        .catch((error: unknown) => {\n          // Mirrors `onNotifyError` below. The delegation is already committed,\n          // so a failed notification costs the model its wake-up, not the\n          // result, and must not stall later notifications.\n          void execution.client.notify({ body: String(error), level: 'warning' });\n        });\n    },\n    onChange: () => execution.client.setStatus(SOURCE, `tasks: ${store.snapshot.tasks.length}`),\n    runTimeoutMs: getDelegationTimeoutMs(execution.environment),\n    onNotifyError: (error) => void execution.client.notify({ body: String(error), level: 'warning' }),\n  });\n  return {\n    value: { store, manager, maxTasks },\n    services: [\n      (serviceContextOwner: Context) => {\n        serviceContextOwner.inject([DOOM_DELEGATION_SERVICE], (serviceContext) => {\n          const service = readDoomDelegationService(serviceContext);\n          if (service) manager.bind(serviceContext, service);\n        });\n      },\n    ],\n    activities: [\n      {\n        name: SOURCE,\n        async start(activityContext) {\n          store.configureSession(resolveSessionKey(activityContext.sessionId, activityContext.environment));\n          await removeLegacyStoreDirectoryAsync(store.storePath, activityContext.cwd);\n          if (!activityContext.environment.DOOM_TASK_STORE_PATH)\n            await sweepStoreFilesAsync(store.storePath, getStoreTtlMs(activityContext.environment));\n          await store.readAsync();\n          await manager.reconcile();\n          execution.client.setStatus(SOURCE, `tasks: ${store.snapshot.tasks.length}`);\n          return () => {\n            manager.reset();\n            execution.client.setStatus(SOURCE, undefined);\n          };\n        },\n      },\n    ],\n    onDispose() {\n      manager.dispose();\n      store.dispose();\n    },\n  };\n});\n\nexport type TaskServerScope = Awaited<ReturnType<typeof root>>['value'];\nexport default root;\n","import { defineRoot } from '@agimon-ai/doompi-core/extensionFile';\n\nimport contribution from './_lib/root.server';\n\nexport default defineRoot(contribution);\n","import type { DoomHubChannelSource, DoomHubSessionScope, DoomHubChannel } from '@agimon-ai/doompi-core/hubChannel';\n\nimport type { TaskDocument } from '../../../../models/task';\nimport { resolveStorePath } from '../../../../services/paths';\nimport { TaskStore } from '../../../../services/taskStore';\nimport { TASKS_CHANNEL_TYPE, type WebTask, type WebTasksPayload } from '../../../../types/webTasks';\n\ninterface TaskStoreSource {\n  readonly snapshot: TaskDocument;\n  read(): TaskDocument;\n  dispose(): void;\n}\n\nfunction isTaskDocument(value: unknown): value is TaskDocument {\n  return (\n    typeof value === 'object' &&\n    value !== null &&\n    typeof (value as TaskDocument).rev === 'number' &&\n    Array.isArray((value as TaskDocument).tasks)\n  );\n}\n\nexport interface TasksChannelOptions {\n  /** Injectable for tests. The default opens the session tree's durable task store. */\n  storeFor?: (scope: DoomHubSessionScope) => TaskStoreSource;\n}\n\nfunction present(document: TaskDocument): WebTasksPayload {\n  const tasks: WebTask[] = document.tasks.flatMap((task) => {\n    if (task.status === 'deleted') return [];\n    const view: WebTask = {\n      id: task.id,\n      subject: task.subject,\n      status: task.status,\n      blockedBy: task.blockedBy ?? [],\n    };\n    if (task.description) view.description = task.description;\n    if (task.activeForm) view.activeForm = task.activeForm;\n    if (task.owner) view.owner = task.owner;\n    if (task.updatedAt) view.updatedAt = task.updatedAt;\n    if (task.delegation) {\n      view.delegation = {\n        ...(task.delegation.agent === undefined ? {} : { agent: task.delegation.agent }),\n        ...(task.delegation.state === undefined ? {} : { state: task.delegation.state }),\n      };\n    }\n    return [view];\n  });\n  return { tasks, rev: document.rev };\n}\n\n/** Publishes each managed session's durable task graph and follows direct session commits. */\nexport function createTasksChannel(options: TasksChannelOptions = {}): DoomHubChannel {\n  return {\n    frameType: TASKS_CHANNEL_TYPE,\n    start(host) {\n      const stores = new Map<string, { store: TaskStoreSource; unsubscribe: () => void; latest?: TaskDocument }>();\n      const open = (scope: DoomHubSessionScope): void => {\n        if (stores.has(scope.sessionId)) return;\n        let store = options.storeFor?.(scope);\n        if (store === undefined) {\n          if (scope.environment === undefined)\n            throw new Error(`Task channel requires an admitted environment for session '${scope.sessionId}'.`);\n          store = new TaskStore({\n            cwd: scope.cwd,\n            env: scope.environment,\n            storePath: resolveStorePath(scope.cwd, scope.environment, scope.sessionId),\n          });\n        }\n        store.read();\n        const source = { store, unsubscribe: () => undefined as void };\n        stores.set(scope.sessionId, source);\n        source.unsubscribe = host.directEvents.subscribe(\n          TASKS_CHANNEL_TYPE,\n          scope.sessionId,\n          (payload) => {\n            if (!isTaskDocument(payload)) return;\n            const current = stores.get(scope.sessionId);\n            if (current === undefined) return;\n            current.latest = payload;\n            host.publish(scope.sessionId, present(payload));\n          },\n          { replayLatest: true },\n        );\n      };\n      const close = (sessionId: string): void => {\n        const source = stores.get(sessionId);\n        if (!source) return;\n        source.unsubscribe();\n        source.store.dispose();\n        stores.delete(sessionId);\n      };\n      for (const scope of host.sessions()) open(scope);\n\n      const source: DoomHubChannelSource = {\n        payloadFor(scope) {\n          open(scope);\n          const source = stores.get(scope.sessionId);\n          const document = source?.latest ?? source?.store.snapshot;\n          return document === undefined ? undefined : present(document);\n        },\n        sessionAdded: open,\n        sessionRemoved: close,\n        close() {\n          for (const sessionId of stores.keys()) close(sessionId);\n        },\n      };\n      return source;\n    },\n  };\n}\n\nexport default createTasksChannel;\n","import { defineChannel } from '@agimon-ai/doompi-core/extensionFile';\n\nimport contribution from './_lib/task-graph';\n\nexport default defineChannel(contribution);\n","import type { DoomHeadlessTool, DoomHeadlessToolResult } from '@agimon-ai/doompi-core/headless';\nimport { Check } from 'typebox/value';\n\nimport type { TaskMutationParams } from '../../models/task';\nimport { TaskParamsSchema, type TaskParams, type TaskAssignmentParams } from '../../schemas/task';\nimport type { DelegationManager } from '../delegation';\nimport { applyTaskMutation, isCommittingOp, type ReducerAction } from '../reducer';\nimport { buildAssignmentResult, buildTextResult, buildToolResult, formatAssignmentResults } from '../taskResult';\nimport type { TaskStore } from '../taskStore';\n\nfunction output(value: unknown): DoomHeadlessToolResult {\n  if (typeof value === 'object' && value !== null && 'content' in value) return value as DoomHeadlessToolResult;\n  const text = typeof value === 'string' ? value : JSON.stringify(value, null, 2);\n  return { content: [{ type: 'text', text }], details: value };\n}\n\nfunction failure(error: unknown): DoomHeadlessToolResult {\n  return { content: [{ type: 'text', text: error instanceof Error ? error.message : String(error) }], isError: true };\n}\n\nexport async function reducerAction(\n  store: TaskStore,\n  action: ReducerAction,\n  params: TaskMutationParams,\n  maxTasks: number,\n): Promise<DoomHeadlessToolResult> {\n  const { document, value } = await store.mutate((current) => {\n    const result = applyTaskMutation(current, action, params, undefined, maxTasks);\n    return { ...(isCommittingOp(result.op) ? { document: result.document } : {}), value: result };\n  });\n  if (value.op.kind === 'error') throw new Error(value.op.message);\n  return buildToolResult(action, params, document, value.op);\n}\n\ninterface AssignmentItemResult {\n  index: number;\n  id: number;\n  agent: string;\n  ok: boolean;\n  message: string;\n}\n\nasync function assignmentBatch(\n  manager: DelegationManager,\n  assignments: readonly TaskAssignmentParams[],\n  signal?: AbortSignal,\n): Promise<AssignmentItemResult[]> {\n  const result: AssignmentItemResult[] = [];\n  for (const [index, assignment] of assignments.entries()) {\n    try {\n      const outcome = await manager.assign(assignment.id, {\n        agent: assignment.agent,\n        inlineAgent: assignment.inlineAgent,\n        instructions: assignment.instructions,\n        relevantFiles: assignment.relevantFiles,\n        priorFindings: assignment.priorFindings,\n        model: assignment.model,\n        ...(assignment.context === 'fork' || assignment.context === 'fresh' ? { context: assignment.context } : {}),\n        signal,\n      });\n      result.push({ index, id: assignment.id, agent: assignment.agent, ...outcome });\n    } catch (error) {\n      result.push({ index, id: assignment.id, agent: assignment.agent, ok: false, message: String(error) });\n    }\n  }\n  return result;\n}\n\nexport function createHeadlessTaskTool(\n  store: TaskStore,\n  /** Absent on remote MCP connections, which track tasks but never delegate. */\n  manager: DelegationManager | undefined,\n  maxTasks: number,\n): DoomHeadlessTool<typeof TaskParamsSchema> {\n  return {\n    name: 'task',\n    label: 'Task',\n    description: 'Maintain a persistent task graph and delegate ready tasks to background agents.',\n    parameters: TaskParamsSchema,\n    promptSnippet: 'Track complex work persistently and delegate ready tasks',\n    executionMode: 'serial',\n    async execute(_toolCallId, rawParams, signal, onUpdate) {\n      if (!Check(TaskParamsSchema, rawParams)) return failure('Invalid task parameters.');\n      const params = rawParams as TaskParams;\n      try {\n        if ((params.action === 'assign' || params.action === 'cancel') && !manager)\n          throw new Error('Delegation is not available on this connection.');\n        if (params.action === 'assign') {\n          if (!params.assignments?.length) throw new Error('assign requires a non-empty assignments[] array');\n          onUpdate?.(\n            output(`Delegating ${params.assignments.length} task${params.assignments.length === 1 ? '' : 's'}...`),\n          );\n          const items = await assignmentBatch(manager!, params.assignments, signal);\n          const assigned = items.filter((item) => item.ok).map((item) => item.id);\n          const text = formatAssignmentResults(items);\n          if (assigned.length === 0) throw new Error(text);\n          return buildAssignmentResult(params as TaskMutationParams, store.snapshot, text, {\n            assigned,\n            failed: items.length - assigned.length,\n          });\n        }\n        if (params.action === 'cancel') {\n          const outcome = await manager!.cancel(params.id ?? Number.NaN);\n          if (!outcome.ok) throw new Error(outcome.message);\n          return buildTextResult('cancel', params as TaskMutationParams, store.snapshot, outcome.message);\n        }\n        return reducerAction(store, params.action as ReducerAction, params as TaskMutationParams, maxTasks);\n      } catch (error) {\n        return failure(error);\n      }\n    },\n  };\n}\n","import type { WithRoot } from '@agimon-ai/doompi-core/extensionFile';\nimport type { DoomHeadlessExecutionContext } from '@agimon-ai/doompi-core/headless';\nimport type { DoomServerPluginContext } from '@agimon-ai/doompi-core/serverFacet';\n\nimport { COMMAND_NAME } from '../../../../../../constants/task';\nimport { reducerAction } from '../../../../../../services/taskTool';\nimport type { TaskServerScope } from '../../_lib/root.server';\n\nexport default (context: WithRoot<DoomServerPluginContext, TaskServerScope>) => ({\n  name: COMMAND_NAME,\n  description: 'List or clear the persistent task graph.',\n  async execute(args: string, commandContext: DoomHeadlessExecutionContext) {\n    const action = args.trim() === 'clear' ? 'clear' : 'list';\n    const response = await reducerAction(context.root.store, action, { action }, context.root.maxTasks);\n    const content = response.content[0];\n    await commandContext.client.notify({\n      body: content?.type === 'text' ? content.text : 'No tasks',\n      level: 'info',\n    });\n  },\n});\n","import { defineServerCommand } from '@agimon-ai/doompi-core/extensionFile';\n\nimport contribution from './_lib/tasks.server';\n\nexport default defineServerCommand(contribution);\n","import type { WithRoot } from '@agimon-ai/doompi-core/extensionFile';\nimport type { DoomServerPluginContext } from '@agimon-ai/doompi-core/serverFacet';\n\nimport { activeTaskSnapshots, formatTaskSnapshots } from '../../../../../../services/contextContribution';\nimport type { TaskServerScope } from '../../_lib/root.server';\n\nexport default (context: WithRoot<DoomServerPluginContext, TaskServerScope>) => ({\n  name: 'doompi/task-board',\n  kind: 'context' as const,\n  /**\n   * The same bounded projection the Pi facet renders: open work only, one line each.\n   * Dumping the whole TaskDocument put every completed task plus the store's own\n   * version/rev/nextId bookkeeping in the prompt, and an idle board still cost a\n   * paragraph. '' is dropped by the prompt composer.\n   */\n  read: () => {\n    const rendered = formatTaskSnapshots(activeTaskSnapshots(context.root.store.snapshot.tasks));\n    return rendered === '(no active tasks)' ? '' : rendered;\n  },\n});\n","import { defineResource } from '@agimon-ai/doompi-core/extensionFile';\n\nimport contribution from './_lib/task-board.server';\n\nexport default defineResource(contribution);\n","import { defineServerTool, type WithRoot } from '@agimon-ai/doompi-core/extensionFile';\nimport type { DoomServerPluginContext } from '@agimon-ai/doompi-core/serverFacet';\n\nimport { createHeadlessTaskTool } from '../../../../../../services/taskTool';\nimport type { TaskServerScope } from '../../_lib/root.server';\n\nexport default defineServerTool((context: WithRoot<DoomServerPluginContext, TaskServerScope>) =>\n  createHeadlessTaskTool(context.root.store, context.root.manager, context.root.maxTasks),\n);\n","import { defineServerTool } from '@agimon-ai/doompi-core/extensionFile';\n\nimport contribution from './_lib/task.server';\n\nexport default defineServerTool(contribution);\n","// Generated by @agimon-ai/doompi-build. Do not edit by hand.\nimport { defineServerPlugin, type DoomServerSessionPlugin } from '@agimon-ai/doompi-core/serverFacet';\nimport { composeRootHooks } from '@agimon-ai/doompi-core/extensionFile';\n\nimport rootSession from '../src/extensions/workspaces/sessions/(backend)/root.server';\nimport channelTaskGraph from '../src/extensions/(backend)/channel/task-graph.server';\nimport commandTasks from '../src/extensions/workspaces/sessions/(backend)/command/tasks.server';\nimport resourceTaskBoard from '../src/extensions/workspaces/sessions/(backend)/resource/task-board.server';\nimport toolTask from '../src/extensions/workspaces/sessions/(backend)/tool/task.server';\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 facet = defineServerPlugin({\n  name: '@agimon-ai/doompi-task',\n  global: () => ({\n    get channels(): DoomServerSessionPlugin['channels'] { return [() => via({ frameType: 'task_graph' }, channelTaskGraph())]; },\n  }),\n  workspace: () => ({\n    get channels(): DoomServerSessionPlugin['channels'] { return [() => via({ frameType: 'task_graph' }, channelTaskGraph())]; },\n  }),\n  session: async (context) => {\n    const scopeSession = await rootSession(context);\n    const contextSession = { ...context, root: scopeSession.value };\n    return {\n      ...composeRootHooks(scopeSession),\n      get channels(): DoomServerSessionPlugin['channels'] { return [() => via({ frameType: 'task_graph' }, channelTaskGraph())]; },\n      get commands(): DoomServerSessionPlugin['commands'] { return [via({ name: 'tasks' }, at(commandTasks, contextSession))]; },\n      get resources(): DoomServerSessionPlugin['resources'] { return [at(resourceTaskBoard, contextSession)]; },\n      get tools(): DoomServerSessionPlugin['tools'] { return [via({ name: 'task' }, at(toolTask, contextSession))]; },\n      services: [...(scopeSession.services ?? [])],\n      get activities(): DoomServerSessionPlugin['activities'] { return [...(scopeSession.activities ?? [])]; },\n    };\n  },\n});\n\nexport default facet;\n"],"mappings":"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"}