{"version":3,"file":"index.mjs","names":[],"sources":["../../../../src/services/taskTool/index.ts"],"sourcesContent":["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  manager: DelegationManager,\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') {\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"],"mappings":"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"}