{"version":3,"file":"compound-action.mjs","names":[],"sources":["../../../src/tools/compound-action.ts"],"sourcesContent":["/**\n * Compound Action Tool — the user-facing entry point for multi-step operations.\n *\n * This is the tool the LLM calls to create, validate, schedule, and manage\n * compound operations. It sits on top of the plan engine (compiler, validator,\n * scheduler, executor) and exposes a clean action-based API.\n *\n * ─── Actions ────────────────────────────────────────────────────────────\n *\n *   create    — Compile an intent into a plan, validate it, return for review\n *   execute   — Run a validated plan immediately\n *   schedule  — Schedule a plan for future execution (time/condition/interval)\n *   list      — List all plans for the current user\n *   status    — Get status of a specific plan\n *   cancel    — Cancel a scheduled/running plan\n *   pause     — Pause a scheduled plan\n *   resume    — Resume a paused plan\n *   history   — Get execution history for a plan\n *\n * ─── Usage Flow ─────────────────────────────────────────────────────────\n *\n * 1. User says \"when ETH hits $4000, sell half for USDC then bridge to Arbitrum\"\n * 2. LLM calls compound_action with action=\"create\" and an intent object\n * 3. Tool compiles → validates → returns the plan with any issues\n * 4. LLM reviews validation, presents plan to user\n * 5. User confirms → LLM calls compound_action with action=\"schedule\" and the plan ID\n * 6. Scheduler watches the condition, fires when ETH >= $4000\n * 7. Executor runs the steps, reports results\n */\n\nimport { Type } from '@sinclair/typebox';\nimport { stringEnum, jsonResult, errorResult, readStringParam } from '../lib/tool-helpers.js';\nimport { PlanCompiler, type Intent, type IntentStep, type IntentStepType, type IntentTrigger } from '../services/plan-compiler.js';\nimport type { CompareOp, Plan, PlanNode, PlanTemplate, Trigger } from '../services/plan-types.js';\nimport { PlanValidator } from '../services/plan-validator.js';\nimport { getScheduler } from '../services/plan-scheduler.js';\nimport { formatExecutionSummary } from '../services/plan-executor.js';\n\n// ─── Raw Input Types (from LLM tool args, snake_case) ──────────────────\n// These type the raw JSON the LLM sends, before normalizeIntent() converts\n// to camelCase. Having explicit types avoids 18+ `as any` casts.\n\ninterface RawCondition {\n  token?: string;\n  field?: string;\n  op?: string;\n  value?: number;\n}\n\ninterface RawTrigger {\n  type?: string;\n  time?: string;\n  interval?: string;\n  max_runs?: number;\n  maxRuns?: number;\n  token?: string;\n  op?: string;\n  value?: number;\n  logic?: string;\n  conditions?: RawCondition[];\n  expires?: string;\n}\n\ninterface RawStep {\n  /** Step type: 'action' (default), 'parallel', 'wait', 'loop'. */\n  type?: string;\n  action?: string;\n  token_in?: string;\n  tokenIn?: string;\n  token_out?: string;\n  tokenOut?: string;\n  amount?: string;\n  amount_pct?: number;\n  amountPct?: number;\n  slippage_bps?: number;\n  slippageBps?: number;\n  chain_id?: number;\n  chainId?: number;\n  to?: string;\n  token?: string;\n  to_chain?: number;\n  toChain?: number;\n  from_chain?: number;\n  fromChain?: number;\n  order_type?: string;\n  orderType?: string;\n  trigger_price?: number;\n  triggerPrice?: number;\n  tool?: string;\n  params?: Record<string, unknown>;\n  condition?: RawCondition;\n  confirm?: boolean;\n  on_failure?: string;\n  onFailure?: string;\n  retry_count?: number;\n  retryCount?: number;\n  label?: string;\n  // Step-output data flow\n  output_ref?: string;\n  outputRef?: string;\n  input_refs?: Record<string, string>;\n  inputRefs?: Record<string, string>;\n  // Parallel/loop nested steps\n  steps?: RawStep[];\n  allow_partial_failure?: boolean;\n  allowPartialFailure?: boolean;\n  // Wait params\n  duration?: string;\n  until_time?: string;\n  untilTime?: string;\n  until?: RawCondition;\n  max_wait?: string;\n  maxWait?: string;\n  poll_interval?: string;\n  pollInterval?: string;\n  // Loop params\n  exit_when?: RawCondition;\n  exitWhen?: RawCondition;\n  max_iterations?: number;\n  maxIterations?: number;\n  delay_between?: string;\n  delayBetween?: string;\n}\n\nconst ACTIONS = [\n  'create', 'execute', 'schedule', 'list', 'status',\n  'cancel', 'pause', 'resume', 'history',\n  'update', 'save_template', 'from_template', 'list_templates',\n  'dead_letter',\n] as const;\n\nconst CompoundActionSchema = Type.Object({\n  action: stringEnum(ACTIONS, {\n    description:\n      'create: compile intent into plan + validate. ' +\n      'execute: run a validated plan now. ' +\n      'schedule: schedule for future trigger. ' +\n      'list: all plans. ' +\n      'status: plan details. ' +\n      'cancel/pause/resume: manage scheduled plans. ' +\n      'history: execution records. ' +\n      'update: modify a draft/paused plan. ' +\n      'save_template: save plan as reusable template. ' +\n      'from_template: create plan from template. ' +\n      'list_templates: list saved templates. ' +\n      'dead_letter: view/clear terminal failures (pass plan_id to filter, clear=true to purge).',\n  }),\n\n  // ── create action: the intent object\n  intent: Type.Optional(Type.Object({\n    name: Type.Optional(Type.String({ description: 'Human-readable plan name' })),\n    natural_language: Type.String({ description: 'The original user request' }),\n    trigger: Type.Optional(Type.Object({\n      type: stringEnum(['immediate', 'at_time', 'every', 'when_condition']),\n      time: Type.Optional(Type.String({ description: 'ISO 8601 time for at_time' })),\n      interval: Type.Optional(Type.String({ description: 'e.g., \"4h\", \"30m\", \"1d\"' })),\n      max_runs: Type.Optional(Type.Number({ description: 'Max runs for recurring' })),\n      token: Type.Optional(Type.String({ description: 'Token for condition (e.g., ETH)' })),\n      op: Type.Optional(stringEnum(['gt', 'gte', 'lt', 'lte', 'eq', 'neq'])),\n      value: Type.Optional(Type.Number({ description: 'Price/value threshold' })),\n      logic: Type.Optional(stringEnum(['and', 'or'])),\n      conditions: Type.Optional(Type.Array(Type.Object({\n        token: Type.String(),\n        op: stringEnum(['gt', 'gte', 'lt', 'lte', 'eq', 'neq']),\n        value: Type.Number(),\n      }))),\n      expires: Type.Optional(Type.String({ description: 'Expiry for condition watch, e.g., \"24h\"' })),\n    })),\n    steps: Type.Array(Type.Object({\n      type: Type.Optional(stringEnum(['action', 'parallel', 'wait', 'loop'], {\n        description: 'Step type. Defaults to \"action\". Use \"parallel\" for concurrent steps, \"wait\" to pause, \"loop\" to repeat.',\n      })),\n      action: Type.Optional(stringEnum([\n        'swap', 'transfer', 'bridge', 'check_price', 'check_balance',\n        'set_order', 'approve', 'launch', 'claim', 'custom',\n      ], { description: 'Action to perform (required when type is \"action\" or omitted).' })),\n      token_in: Type.Optional(Type.String()),\n      token_out: Type.Optional(Type.String()),\n      amount: Type.Optional(Type.String()),\n      amount_pct: Type.Optional(Type.Number()),\n      slippage_bps: Type.Optional(Type.Number()),\n      chain_id: Type.Optional(Type.Number()),\n      to: Type.Optional(Type.String()),\n      token: Type.Optional(Type.String()),\n      to_chain: Type.Optional(Type.Number()),\n      from_chain: Type.Optional(Type.Number()),\n      order_type: Type.Optional(Type.String()),\n      trigger_price: Type.Optional(Type.Number()),\n      tool: Type.Optional(Type.String()),\n      params: Type.Optional(Type.Object({})),\n      condition: Type.Optional(Type.Object({\n        token: Type.Optional(Type.String()),\n        field: Type.Optional(stringEnum(['price', 'balance', 'gas_price'])),\n        op: stringEnum(['gt', 'gte', 'lt', 'lte', 'eq', 'neq']),\n        value: Type.Number(),\n      })),\n      confirm: Type.Optional(Type.Boolean()),\n      on_failure: Type.Optional(stringEnum(['abort', 'skip', 'retry'])),\n      retry_count: Type.Optional(Type.Number()),\n      label: Type.Optional(Type.String()),\n      // Step-output data flow\n      output_ref: Type.Optional(Type.String({ description: 'Assign a ref name so downstream steps can use this step\\'s output.' })),\n      input_refs: Type.Optional(Type.Record(Type.String(), Type.String(), { description: 'Map param names to \"refName.path\" (e.g., {\"amount\": \"swap1.amountOut\"}).' })),\n      // Nested steps for parallel/loop\n      steps: Type.Optional(Type.Array(Type.Object({}, { additionalProperties: true }), { description: 'Nested steps for parallel or loop types.' })),\n      allow_partial_failure: Type.Optional(Type.Boolean({ description: 'For parallel: continue if some steps fail.' })),\n      // Wait params\n      duration: Type.Optional(Type.String({ description: 'Wait duration (e.g., \"30s\", \"5m\").' })),\n      until_time: Type.Optional(Type.String({ description: 'Wait until ISO 8601 time.' })),\n      until: Type.Optional(Type.Object({\n        token: Type.Optional(Type.String()),\n        field: Type.Optional(stringEnum(['price', 'balance', 'gas_price'])),\n        op: stringEnum(['gt', 'gte', 'lt', 'lte', 'eq', 'neq']),\n        value: Type.Number(),\n      }, { description: 'Wait until condition is met.' })),\n      max_wait: Type.Optional(Type.String({ description: 'Max wait time (e.g., \"24h\").' })),\n      poll_interval: Type.Optional(Type.String({ description: 'Poll interval for condition waits (e.g., \"1m\").' })),\n      // Loop params\n      exit_when: Type.Optional(Type.Object({\n        token: Type.Optional(Type.String()),\n        field: Type.Optional(stringEnum(['price', 'balance', 'gas_price'])),\n        op: stringEnum(['gt', 'gte', 'lt', 'lte', 'eq', 'neq']),\n        value: Type.Number(),\n      }, { description: 'Exit condition for loop.' })),\n      max_iterations: Type.Optional(Type.Number({ description: 'Max loop iterations (default 10).' })),\n      delay_between: Type.Optional(Type.String({ description: 'Delay between iterations (e.g., \"5s\").' })),\n    })),\n    tags: Type.Optional(Type.Array(Type.String())),\n  })),\n\n  // ── plan_id for status/cancel/pause/resume/execute/schedule/history/update/save_template\n  plan_id: Type.Optional(Type.String({ description: 'Plan ID for status/cancel/execute/etc.' })),\n\n  // ── template fields\n  template_id: Type.Optional(Type.String({ description: 'Template ID for from_template.' })),\n  template_name: Type.Optional(Type.String({ description: 'Name for saved template.' })),\n  template_description: Type.Optional(Type.String({ description: 'Description for saved template.' })),\n  template_params: Type.Optional(Type.Record(Type.String(), Type.Unknown(), {\n    description: 'Parameters to substitute when instantiating from_template.',\n  })),\n\n  // ── update fields\n  update_steps: Type.Optional(Type.Array(Type.Object({}, { additionalProperties: true }), {\n    description: 'Replacement steps for update action.',\n  })),\n  update_trigger: Type.Optional(Type.Object({}, {\n    additionalProperties: true,\n    description: 'Replacement trigger for update action.',\n  })),\n});\n\nexport function createCompoundActionTool() {\n  return {\n    name: 'compound_action',\n    label: 'Compound Action',\n    ownerOnly: true,\n    description:\n      'Create and manage multi-step DeFi operations with scheduling, conditions, and sequencing. ' +\n      'Use this tool when the user wants to chain multiple operations together, schedule future actions, ' +\n      'or set up conditional triggers (e.g., \"when ETH hits $4000, sell half and bridge to Arbitrum\"). ' +\n      'Actions: create, execute, schedule, list, status, cancel, pause, resume, history, ' +\n      'update (modify draft/paused plan), save_template (save as reusable template), ' +\n      'from_template (instantiate template), list_templates, dead_letter (view/clear terminal failures).',\n    parameters: CompoundActionSchema,\n\n    async execute(_toolCallId: string, rawArgs: unknown, ctx?: Record<string, unknown>) {\n      const args = rawArgs as Record<string, unknown>;\n      const action = readStringParam(args, 'action', { required: true })!;\n\n      // Extract userId from execution context.\n      // When called via PlanExecutor, ctx = { senderId: userId }.\n      // When called directly by LLM (no ctx), fall back to 'owner'.\n      const userId = (ctx?.senderId as string) ?? 'owner';\n\n      try {\n        switch (action) {\n          case 'create':   return handleCreate(args, userId);\n          case 'execute':  return handleExecute(args, userId);\n          case 'schedule': return handleSchedule(args, userId);\n          case 'list':     return handleList(args, userId);\n          case 'status':   return handleStatus(args);\n          case 'cancel':   return handleCancel(args, userId);\n          case 'pause':    return handlePause(args, userId);\n          case 'resume':   return handleResume(args, userId);\n          case 'history':  return handleHistory(args);\n          case 'update':   return handleUpdate(args, userId);\n          case 'save_template':   return handleSaveTemplate(args, userId);\n          case 'from_template':   return handleFromTemplate(args, userId);\n          case 'list_templates':  return handleListTemplates(args, userId);\n          case 'dead_letter':     return handleDeadLetter(args, userId);\n          default:\n            return errorResult(`Unknown action: \"${action}\". Use: ${ACTIONS.join(', ')}`);\n        }\n      } catch (err: any) {\n        return errorResult(err.message ?? String(err));\n      }\n    },\n  };\n}\n\n// ─── Ownership ──────────────────────────────────────────────────────────\n\n/** Returns an error result if the user doesn't own the plan, or undefined if OK. */\nfunction checkOwnership(plan: Plan, userId: string) {\n  // In single-agent mode ('owner'), skip the check — backward compatible.\n  if (userId === 'owner' || plan.userId === 'owner') return undefined;\n  if (plan.userId !== userId) {\n    return errorResult(`Access denied: plan \"${plan.id}\" belongs to a different user.`);\n  }\n  return undefined;\n}\n\n// ─── Action Handlers ────────────────────────────────────────────────────\n\nfunction handleCreate(args: Record<string, unknown>, userId: string) {\n  const intentRaw = args.intent as Record<string, unknown> | undefined;\n  if (!intentRaw) return errorResult('Missing \"intent\" for create action.');\n\n  const intent = normalizeIntent(intentRaw);\n  const compiler = new PlanCompiler();\n\n  // Security: userId comes from execution context (ctx.senderId), never from tool args.\n  const plan = compiler.compile(intent, userId);\n\n  // Validate\n  const validator = new PlanValidator();\n  const validation = validator.validate(plan);\n  plan.validation = validation;\n  plan.status = validation.valid ? 'validated' : 'draft';\n\n  // Persist the plan (even if invalid — user might fix and retry)\n  const scheduler = getScheduler();\n  scheduler.addPlan(plan);\n\n  return jsonResult({\n    plan_id: plan.id,\n    name: plan.name,\n    status: plan.status,\n    validation: {\n      valid: validation.valid,\n      errors: validation.issues.filter(i => i.severity === 'error').map(i => i.message),\n      warnings: validation.issues.filter(i => i.severity === 'warning').map(i => i.message),\n      info: validation.issues.filter(i => i.severity === 'info').map(i => i.message),\n      estimated_gas_eth: validation.estimatedGasEth,\n      estimated_duration_s: validation.estimatedDurationMs ? Math.round(validation.estimatedDurationMs / 1000) : undefined,\n      tools_used: validation.toolsUsed,\n      chains_used: validation.chainsUsed,\n    },\n    trigger: plan.trigger ? describeTrigger(plan.trigger) : 'immediate',\n    steps: describeSteps(plan.root),\n    natural_language: plan.naturalLanguage,\n  });\n}\n\nfunction handleExecute(args: Record<string, unknown>, userId: string) {\n  const planId = readStringParam(args, 'plan_id');\n  if (!planId) return errorResult('Missing \"plan_id\" for execute action.');\n\n  const scheduler = getScheduler();\n  const plan = scheduler.getPlan(planId);\n  if (!plan) return errorResult(`Plan \"${planId}\" not found.`);\n\n  const ownerErr = checkOwnership(plan, userId);\n  if (ownerErr) return ownerErr;\n\n  if (plan.status === 'cancelled') return errorResult('This plan was cancelled.');\n  if (plan.status === 'running') return errorResult('This plan is already running.');\n  if (plan.status === 'completed') return errorResult('This plan already completed.');\n\n  // For immediate execution, we update the trigger and add to scheduler\n  plan.trigger = { type: 'immediate' };\n  plan.status = 'scheduled';\n  scheduler.addPlan(plan);\n\n  return jsonResult({\n    plan_id: plan.id,\n    status: 'scheduled',\n    message: 'Plan queued for immediate execution. The scheduler will fire it on the next tick.',\n    note: 'You will receive updates as each step completes.',\n  });\n}\n\nfunction handleSchedule(args: Record<string, unknown>, userId: string) {\n  const planId = readStringParam(args, 'plan_id');\n  if (!planId) return errorResult('Missing \"plan_id\" for schedule action.');\n\n  const scheduler = getScheduler();\n  const plan = scheduler.getPlan(planId);\n  if (!plan) return errorResult(`Plan \"${planId}\" not found.`);\n\n  const ownerErr = checkOwnership(plan, userId);\n  if (ownerErr) return ownerErr;\n\n  if (plan.status === 'cancelled') return errorResult('This plan was cancelled.');\n  if (!plan.trigger || plan.trigger.type === 'immediate') {\n    return errorResult('This plan has no scheduled trigger. Use action=\"execute\" to run immediately, or create a new plan with a trigger.');\n  }\n\n  if (plan.validation && !plan.validation.valid) {\n    return errorResult(\n      'This plan has validation errors that must be fixed first:\\n' +\n      plan.validation.issues.filter(i => i.severity === 'error').map(i => `- ${i.message}`).join('\\n'),\n    );\n  }\n\n  plan.status = 'scheduled';\n  scheduler.addPlan(plan);\n\n  return jsonResult({\n    plan_id: plan.id,\n    status: 'scheduled',\n    trigger: describeTrigger(plan.trigger),\n    message: 'Plan is now scheduled. The scheduler is watching for the trigger condition.',\n  });\n}\n\nfunction handleList(_args: Record<string, unknown>, userId: string) {\n  const scheduler = getScheduler();\n  // Filter plans to those owned by the requesting user (or show all for 'owner' in single-agent mode).\n  const allPlans = scheduler.listPlans();\n  const plans = userId === 'owner' ? allPlans : allPlans.filter(p => p.userId === userId || p.userId === 'owner');\n\n  if (plans.length === 0) {\n    return jsonResult({ plans: [], message: 'No plans found. Use action=\"create\" to create one.' });\n  }\n\n  return jsonResult({\n    total: plans.length,\n    plans: plans.map(p => ({\n      plan_id: p.id,\n      name: p.name,\n      status: p.status,\n      trigger: p.trigger ? describeTrigger(p.trigger) : 'immediate',\n      created: new Date(p.createdAt).toISOString(),\n      tags: p.tags,\n    })),\n  });\n}\n\nfunction handleStatus(args: Record<string, unknown>) {\n  const planId = readStringParam(args, 'plan_id');\n  if (!planId) return errorResult('Missing \"plan_id\" for status action.');\n\n  const scheduler = getScheduler();\n  const plan = scheduler.getPlan(planId);\n  if (!plan) return errorResult(`Plan \"${planId}\" not found.`);\n\n  const executions = scheduler.getExecutions(planId);\n\n  return jsonResult({\n    plan_id: plan.id,\n    name: plan.name,\n    status: plan.status,\n    trigger: plan.trigger ? describeTrigger(plan.trigger) : 'immediate',\n    validation: plan.validation ? {\n      valid: plan.validation.valid,\n      error_count: plan.validation.issues.filter(i => i.severity === 'error').length,\n      warning_count: plan.validation.issues.filter(i => i.severity === 'warning').length,\n    } : undefined,\n    steps: describeSteps(plan.root),\n    executions: executions.map(e => ({\n      execution_id: e.executionId,\n      status: e.status,\n      started: new Date(e.startedAt).toISOString(),\n      completed: e.completedAt ? new Date(e.completedAt).toISOString() : undefined,\n      step_count: e.steps.length,\n      failed_steps: e.steps.filter(s => s.status === 'failed').map(s => s.nodeId),\n    })),\n    natural_language: plan.naturalLanguage,\n    created: new Date(plan.createdAt).toISOString(),\n  });\n}\n\nfunction handleCancel(args: Record<string, unknown>, userId: string) {\n  const planId = readStringParam(args, 'plan_id');\n  if (!planId) return errorResult('Missing \"plan_id\" for cancel action.');\n\n  const scheduler = getScheduler();\n  const plan = scheduler.getPlan(planId);\n  if (!plan) return errorResult(`Plan \"${planId}\" not found.`);\n\n  const ownerErr = checkOwnership(plan, userId);\n  if (ownerErr) return ownerErr;\n\n  const success = scheduler.cancelPlan(planId);\n  if (!success) return errorResult(`Plan \"${planId}\" not found or already completed.`);\n\n  return jsonResult({ plan_id: planId, status: 'cancelled', message: 'Plan cancelled.' });\n}\n\nfunction handlePause(args: Record<string, unknown>, userId: string) {\n  const planId = readStringParam(args, 'plan_id');\n  if (!planId) return errorResult('Missing \"plan_id\" for pause action.');\n\n  const scheduler = getScheduler();\n  const plan = scheduler.getPlan(planId);\n  if (!plan) return errorResult(`Plan \"${planId}\" not found.`);\n\n  const ownerErr = checkOwnership(plan, userId);\n  if (ownerErr) return ownerErr;\n\n  const success = scheduler.pausePlan(planId);\n  if (!success) return errorResult(`Plan \"${planId}\" not found or not in scheduled state.`);\n\n  return jsonResult({ plan_id: planId, status: 'paused', message: 'Plan paused. Use resume to continue.' });\n}\n\nfunction handleResume(args: Record<string, unknown>, userId: string) {\n  const planId = readStringParam(args, 'plan_id');\n  if (!planId) return errorResult('Missing \"plan_id\" for resume action.');\n\n  const scheduler = getScheduler();\n  const plan = scheduler.getPlan(planId);\n  if (!plan) return errorResult(`Plan \"${planId}\" not found.`);\n\n  const ownerErr = checkOwnership(plan, userId);\n  if (ownerErr) return ownerErr;\n\n  const success = scheduler.resumePlan(planId);\n  if (!success) return errorResult(`Plan \"${planId}\" not found or not paused.`);\n\n  return jsonResult({ plan_id: planId, status: 'scheduled', message: 'Plan resumed.' });\n}\n\nfunction handleHistory(args: Record<string, unknown>) {\n  const planId = readStringParam(args, 'plan_id');\n  if (!planId) return errorResult('Missing \"plan_id\" for history action.');\n\n  const scheduler = getScheduler();\n  const plan = scheduler.getPlan(planId);\n  if (!plan) return errorResult(`Plan \"${planId}\" not found.`);\n\n  const executions = scheduler.getExecutions(planId);\n  if (executions.length === 0) {\n    return jsonResult({ plan_id: planId, executions: [], message: 'No executions yet.' });\n  }\n\n  return jsonResult({\n    plan_id: planId,\n    name: plan.name,\n    executions: executions.map(e => ({\n      execution_id: e.executionId,\n      status: e.status,\n      started: new Date(e.startedAt).toISOString(),\n      completed: e.completedAt ? new Date(e.completedAt).toISOString() : undefined,\n      duration_s: e.completedAt ? Math.round((e.completedAt - e.startedAt) / 1000) : undefined,\n      steps: e.steps.map(s => ({\n        node_id: s.nodeId,\n        status: s.status,\n        error: s.error,\n        retries: s.retryCount,\n      })),\n    })),\n  });\n}\n\n// ─── Update ─────────────────────────────────────────────────────────────\n\nfunction handleUpdate(args: Record<string, unknown>, userId: string) {\n  const planId = readStringParam(args, 'plan_id');\n  if (!planId) return errorResult('Missing \"plan_id\" for update action.');\n\n  const scheduler = getScheduler();\n  const plan = scheduler.getPlan(planId);\n  if (!plan) return errorResult(`Plan \"${planId}\" not found.`);\n\n  const ownerErr = checkOwnership(plan, userId);\n  if (ownerErr) return ownerErr;\n\n  if (plan.status !== 'draft' && plan.status !== 'paused' && plan.status !== 'validated') {\n    return errorResult(`Can only update plans in draft, validated, or paused state. Current: \"${plan.status}\".`);\n  }\n\n  const updateSteps = args.update_steps as Record<string, unknown>[] | undefined;\n  const updateTrigger = args.update_trigger as Record<string, unknown> | undefined;\n  const intentRaw = args.intent as Record<string, unknown> | undefined;\n\n  if (!updateSteps && !updateTrigger && !intentRaw) {\n    return errorResult('Provide \"update_steps\", \"update_trigger\", or a new \"intent\" to update.');\n  }\n\n  // If a full new intent is provided, recompile the entire plan\n  if (intentRaw) {\n    const intent = normalizeIntent(intentRaw);\n    const compiler = new PlanCompiler();\n    const newPlan = compiler.compile(intent, plan.userId);\n\n    // Preserve plan identity\n    plan.root = newPlan.root;\n    plan.trigger = newPlan.trigger;\n    plan.naturalLanguage = newPlan.naturalLanguage;\n    plan.tags = newPlan.tags ?? plan.tags;\n    plan.name = newPlan.name;\n  } else {\n    // Partial update: replace steps and/or trigger\n    if (updateSteps) {\n      const rawIntent = {\n        naturalLanguage: plan.naturalLanguage ?? 'updated plan',\n        steps: updateSteps as unknown as RawStep[],\n        tags: plan.tags,\n      };\n      const intent = normalizeIntent(rawIntent as Record<string, unknown>);\n      const compiler = new PlanCompiler();\n      const tempPlan = compiler.compile(intent, plan.userId);\n      plan.root = tempPlan.root;\n    }\n    if (updateTrigger) {\n      const rawIntent = {\n        naturalLanguage: plan.naturalLanguage ?? 'updated plan',\n        steps: [{ action: 'check_price', token: 'ETH' }], // dummy step for trigger compilation\n        trigger: updateTrigger,\n      };\n      const intent = normalizeIntent(rawIntent as Record<string, unknown>);\n      const compiler = new PlanCompiler();\n      const tempPlan = compiler.compile(intent, plan.userId);\n      plan.trigger = tempPlan.trigger;\n    }\n  }\n\n  // Re-validate\n  const validator = new PlanValidator();\n  const validation = validator.validate(plan);\n  plan.validation = validation;\n  plan.status = validation.valid ? 'validated' : 'draft';\n\n  scheduler.addPlan(plan);\n\n  return jsonResult({\n    plan_id: plan.id,\n    name: plan.name,\n    status: plan.status,\n    validation: {\n      valid: validation.valid,\n      errors: validation.issues.filter(i => i.severity === 'error').map(i => i.message),\n      warnings: validation.issues.filter(i => i.severity === 'warning').map(i => i.message),\n    },\n    message: 'Plan updated and re-validated.',\n  });\n}\n\n// ─── Templates ──────────────────────────────────────────────────────────\n\nfunction handleSaveTemplate(args: Record<string, unknown>, userId: string) {\n  const planId = readStringParam(args, 'plan_id');\n  if (!planId) return errorResult('Missing \"plan_id\" for save_template action.');\n\n  const scheduler = getScheduler();\n  const plan = scheduler.getPlan(planId);\n  if (!plan) return errorResult(`Plan \"${planId}\" not found.`);\n\n  const ownerErr = checkOwnership(plan, userId);\n  if (ownerErr) return ownerErr;\n\n  const templateName = readStringParam(args, 'template_name') ?? plan.name;\n  const templateDesc = readStringParam(args, 'template_description');\n\n  const template: PlanTemplate = {\n    id: `tpl_${Date.now()}_${Math.random().toString(36).slice(2, 8)}`,\n    name: templateName,\n    description: templateDesc ?? undefined,\n    createdBy: userId,\n    createdAt: Date.now(),\n    tags: plan.tags,\n    intent: {\n      naturalLanguage: plan.naturalLanguage ?? templateName,\n      steps: extractStepsFromRoot(plan.root),\n      trigger: plan.trigger ? extractTriggerAsRaw(plan.trigger) : undefined,\n      tags: plan.tags,\n    },\n    params: (args.template_params as Record<string, { description?: string; default?: string | number; required?: boolean }>) ?? undefined,\n  };\n\n  scheduler.saveTemplate(template);\n\n  return jsonResult({\n    template_id: template.id,\n    name: template.name,\n    description: template.description,\n    message: 'Template saved. Use action=\"from_template\" with this template_id to create new plans.',\n  });\n}\n\nfunction handleFromTemplate(args: Record<string, unknown>, userId: string) {\n  const templateId = readStringParam(args, 'template_id');\n  if (!templateId) return errorResult('Missing \"template_id\" for from_template action.');\n\n  const scheduler = getScheduler();\n  const template = scheduler.loadTemplate(templateId);\n  if (!template) return errorResult(`Template \"${templateId}\" not found.`);\n\n  // Merge user-supplied params into the template intent\n  const params = args.template_params as Record<string, unknown> | undefined;\n  let intentRaw: Record<string, unknown> = { ...template.intent };\n\n  if (params) {\n    // Simple parameter substitution: replace $param references in step fields\n    const stepsJson = JSON.stringify(template.intent.steps);\n    let substituted = stepsJson;\n    for (const [key, value] of Object.entries(params)) {\n      substituted = substituted.replaceAll(`$${key}`, String(value));\n    }\n    intentRaw = {\n      ...intentRaw,\n      steps: JSON.parse(substituted),\n      natural_language: template.intent.naturalLanguage,\n    };\n  }\n\n  // Compile as a new plan\n  const intent = normalizeIntent(intentRaw);\n  const compiler = new PlanCompiler();\n  const plan = compiler.compile(intent, userId);\n\n  // Validate\n  const validator = new PlanValidator();\n  const validation = validator.validate(plan);\n  plan.validation = validation;\n  plan.status = validation.valid ? 'validated' : 'draft';\n  plan.tags = [...(template.tags ?? []), `from:${template.id}`];\n\n  scheduler.addPlan(plan);\n\n  return jsonResult({\n    plan_id: plan.id,\n    name: plan.name,\n    status: plan.status,\n    from_template: template.id,\n    validation: {\n      valid: validation.valid,\n      errors: validation.issues.filter(i => i.severity === 'error').map(i => i.message),\n    },\n    message: `Plan created from template \"${template.name}\".`,\n  });\n}\n\nfunction handleListTemplates(_args: Record<string, unknown>, userId: string) {\n  const scheduler = getScheduler();\n  const templates = scheduler.listTemplates();\n\n  if (templates.length === 0) {\n    return jsonResult({ templates: [], message: 'No templates found. Use action=\"save_template\" to save a plan as a template.' });\n  }\n\n  return jsonResult({\n    total: templates.length,\n    templates: templates.map(t => ({\n      template_id: t.id,\n      name: t.name,\n      description: t.description,\n      created_by: t.createdBy,\n      created: new Date(t.createdAt).toISOString(),\n      tags: t.tags,\n      params: t.params ? Object.keys(t.params) : [],\n    })),\n  });\n}\n\n// ─── Dead-Letter Handler ─────────────────────────────────────────────────\n\nfunction handleDeadLetter(args: Record<string, unknown>, _userId: string) {\n  const scheduler = getScheduler();\n  const planId = args.plan_id as string | undefined;\n  const clear = args.clear === true || args.clear === 'true';\n\n  if (clear) {\n    const removed = scheduler.clearDeadLetters(planId);\n    return jsonResult({\n      cleared: removed,\n      message: planId\n        ? `Cleared ${removed} dead-letter entries for plan ${planId}.`\n        : `Cleared ${removed} dead-letter entries.`,\n    });\n  }\n\n  const entries = scheduler.loadDeadLetters(planId);\n\n  if (entries.length === 0) {\n    return jsonResult({\n      entries: [],\n      message: planId\n        ? `No dead-letter entries for plan ${planId}.`\n        : 'No dead-letter entries. All plans completed successfully or are still running.',\n    });\n  }\n\n  return jsonResult({\n    total: entries.length,\n    entries: entries.map(e => ({\n      plan_id: e.planId,\n      node_id: e.nodeId,\n      execution_id: e.executionId,\n      user_id: e.userId,\n      error: e.error,\n      retry_count: e.retryCount,\n      tool: e.tool,\n      params: e.params,\n      timestamp: new Date(e.timestamp).toISOString(),\n    })),\n  });\n}\n\n// ─── Template Extraction Helpers ────────────────────────────────────────\n\n/** Extract raw step descriptions from a compiled plan root node. */\nfunction extractStepsFromRoot(node: PlanNode): Record<string, unknown>[] {\n  switch (node.type) {\n    case 'action': {\n      // Exclude 'action' from params to avoid overriding the step action name\n      const { action: _discardAction, ...cleanParams } = node.params as Record<string, unknown>;\n      return [{ action: inferAction(node.tool), tool: node.tool, ...cleanParams }];\n    }\n    case 'sequence':\n      return node.steps.flatMap(extractStepsFromRoot);\n    case 'parallel':\n      return [{ type: 'parallel', steps: node.steps.flatMap(extractStepsFromRoot) }];\n    case 'wait':\n      return [{ type: 'wait', duration: node.durationMs ? `${Math.round(node.durationMs / 1000)}s` : undefined }];\n    case 'loop':\n      return [{ type: 'loop', steps: extractStepsFromRoot(node.body), max_iterations: node.maxIterations }];\n    case 'if':\n      return [...extractStepsFromRoot(node.then), ...(node.else ? extractStepsFromRoot(node.else) : [])];\n    default:\n      return [];\n  }\n}\n\n/** Map tool names back to intent action names. */\nfunction inferAction(tool: string): string {\n  const map: Record<string, string> = {\n    defi_swap: 'swap',\n    transfer_token: 'transfer',\n    bridge_assets: 'bridge',\n    check_price: 'check_price',\n    check_balance: 'check_balance',\n    manage_orders: 'set_order',\n    manage_approvals: 'approve',\n    airdrop_tool: 'claim',\n  };\n  return map[tool] ?? 'custom';\n}\n\n/** Convert compiled Trigger back to raw format for template storage. */\nfunction extractTriggerAsRaw(trigger: Trigger): Record<string, unknown> {\n  switch (trigger.type) {\n    case 'immediate':\n      return { type: 'immediate' };\n    case 'time':\n      return { type: 'at_time', time: trigger.at };\n    case 'interval':\n      return {\n        type: 'every',\n        interval: `${Math.round(trigger.everyMs / 1000)}s`,\n        max_runs: trigger.maxRuns,\n      };\n    case 'condition':\n      return { type: 'when_condition' }; // Conditions are complex; simplified\n    default:\n      return { type: 'immediate' };\n  }\n}\n\n// ─── Helpers ────────────────────────────────────────────────────────────\n\n/**\n * Normalize the intent from snake_case params to camelCase for the compiler.\n */\nfunction normalizeStep(s: RawStep): IntentStep {\n  const condition = s.condition ? {\n    token: s.condition.token,\n    field: s.condition.field as 'price' | 'balance' | 'gas_price' | undefined,\n    op: s.condition.op as CompareOp,\n    value: s.condition.value as number,\n  } : undefined;\n\n  const until = s.until ? {\n    token: s.until.token,\n    field: s.until.field as 'price' | 'balance' | 'gas_price' | undefined,\n    op: s.until.op as CompareOp,\n    value: s.until.value as number,\n  } : undefined;\n\n  const exitWhen = (s.exit_when ?? s.exitWhen) ? {\n    token: (s.exit_when ?? s.exitWhen)!.token,\n    field: (s.exit_when ?? s.exitWhen)!.field as 'price' | 'balance' | 'gas_price' | undefined,\n    op: (s.exit_when ?? s.exitWhen)!.op as CompareOp,\n    value: (s.exit_when ?? s.exitWhen)!.value as number,\n  } : undefined;\n\n  return {\n    type: (s.type as IntentStep['type']) ?? undefined,\n    action: s.action as IntentStep['action'],\n    tokenIn: s.token_in ?? s.tokenIn,\n    tokenOut: s.token_out ?? s.tokenOut,\n    amount: s.amount,\n    amountPct: s.amount_pct ?? s.amountPct,\n    slippageBps: s.slippage_bps ?? s.slippageBps,\n    chainId: s.chain_id ?? s.chainId,\n    to: s.to,\n    token: s.token,\n    toChain: s.to_chain ?? s.toChain,\n    fromChain: s.from_chain ?? s.fromChain,\n    orderType: s.order_type ?? s.orderType,\n    triggerPrice: s.trigger_price ?? s.triggerPrice,\n    tool: s.tool,\n    params: s.params,\n    condition,\n    confirm: s.confirm,\n    onFailure: (s.on_failure ?? s.onFailure) as IntentStep['onFailure'],\n    retryCount: s.retry_count ?? s.retryCount,\n    label: s.label,\n    // Step-output data flow\n    outputRef: s.output_ref ?? s.outputRef,\n    inputRefs: s.input_refs ?? s.inputRefs,\n    // Nested steps (recurse)\n    steps: s.steps ? s.steps.map(normalizeStep) : undefined,\n    allowPartialFailure: s.allow_partial_failure ?? s.allowPartialFailure,\n    // Wait params\n    duration: s.duration,\n    untilTime: s.until_time ?? s.untilTime,\n    until,\n    maxWait: s.max_wait ?? s.maxWait,\n    pollInterval: s.poll_interval ?? s.pollInterval,\n    // Loop params\n    exitWhen,\n    maxIterations: s.max_iterations ?? s.maxIterations,\n    delayBetween: s.delay_between ?? s.delayBetween,\n  };\n}\n\nfunction normalizeIntent(raw: Record<string, unknown>): Intent {\n  const rawSteps = (raw.steps ?? []) as RawStep[];\n  const steps: IntentStep[] = rawSteps.map(normalizeStep);\n\n  const rawTrigger = raw.trigger as RawTrigger | undefined;\n  const trigger: IntentTrigger | undefined = rawTrigger ? {\n    type: rawTrigger.type as IntentTrigger['type'],\n    time: rawTrigger.time,\n    interval: rawTrigger.interval,\n    maxRuns: rawTrigger.max_runs ?? rawTrigger.maxRuns,\n    token: rawTrigger.token,\n    op: rawTrigger.op as IntentTrigger['op'],\n    value: rawTrigger.value,\n    logic: rawTrigger.logic as IntentTrigger['logic'],\n    conditions: rawTrigger.conditions as IntentTrigger['conditions'],\n    expires: rawTrigger.expires,\n  } : undefined;\n\n  return {\n    name: raw.name as string | undefined,\n    naturalLanguage: ((raw.natural_language ?? raw.naturalLanguage ?? '') as string),\n    trigger,\n    steps,\n    tags: raw.tags as string[] | undefined,\n  };\n}\n\nfunction describeTrigger(t: Trigger): string {\n  switch (t.type) {\n    case 'immediate': return 'Run immediately';\n    case 'time': return `At ${t.at}`;\n    case 'interval': {\n      const interval = formatMs(t.everyMs);\n      const runs = t.maxRuns ? ` (max ${t.maxRuns} runs)` : '';\n      return `Every ${interval}${runs}`;\n    }\n    case 'condition': return `When condition met (polling every ${formatMs(t.pollIntervalMs ?? 60_000)})`;\n    case 'cron': {\n      const tz = t.timezone ? ` (${t.timezone})` : '';\n      const runs = t.maxRuns ? ` (max ${t.maxRuns} runs)` : '';\n      return `Cron: ${t.expression}${tz}${runs}`;\n    }\n    case 'price': {\n      const recur = t.recurring ? ' (recurring)' : ' (once)';\n      return `When ${t.token} ${t.condition} $${t.threshold}${recur}`;\n    }\n    case 'onchain_event': {\n      const recur = t.recurring ? ' (recurring)' : ' (once)';\n      return `On-chain: ${t.eventSignature} on ${t.contractAddress.slice(0, 10)}... (chain ${t.chainId})${recur}`;\n    }\n    case 'balance': {\n      const recur = t.recurring ? ' (recurring)' : ' (once)';\n      const chain = t.chainId ? ` (chain ${t.chainId})` : '';\n      return `When ${t.token} balance ${t.condition} ${t.threshold}${chain}${recur}`;\n    }\n  }\n}\n\nfunction describeSteps(node: PlanNode, depth = 0): Array<{ id: string; type: string; label: string; tool?: string; depth: number }> {\n  const indent = depth;\n  const result: Array<{ id: string; type: string; label: string; tool?: string; depth: number }> = [];\n\n  result.push({\n    id: node.id,\n    type: node.type,\n    label: node.label,\n    tool: node.type === 'action' ? (node as any).tool : undefined,\n    depth: indent,\n  });\n\n  if (node.type === 'sequence' || node.type === 'parallel') {\n    for (const s of (node as any).steps) {\n      result.push(...describeSteps(s, depth + 1));\n    }\n  } else if (node.type === 'if') {\n    result.push(...describeSteps((node as any).then, depth + 1));\n    if ((node as any).else) {\n      result.push({ id: `${node.id}_else`, type: 'else', label: 'Else', depth: indent + 1 });\n      result.push(...describeSteps((node as any).else, depth + 2));\n    }\n  } else if (node.type === 'loop') {\n    result.push(...describeSteps((node as any).body, depth + 1));\n  }\n\n  return result;\n}\n\nfunction formatMs(ms: number): string {\n  if (ms >= 86_400_000) return `${(ms / 86_400_000).toFixed(1)}d`;\n  if (ms >= 3_600_000) return `${(ms / 3_600_000).toFixed(1)}h`;\n  if (ms >= 60_000) return `${(ms / 60_000).toFixed(1)}m`;\n  return `${(ms / 1000).toFixed(0)}s`;\n}\n"],"mappings":"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"}