{"version":3,"sources":["../../../../src/agents/requirement/requirements/conditional.ts"],"names":["ConditionalRequirement","Requirement","source","sourceTool","before","after","forceAfterSet","minInvocations","maxInvocations","forceAtStepValue","onlySuccessInvocations","consecutiveAllowedValue","customChecks","forcePreventStop","reason","target","options","name","extractTargetName","enabled","priority","undefined","extractTargets","onlyBefore","onlyAfter","forceAfter","Infinity","forceAtStep","consecutiveAllowed","checkInvariant","ValueError","sourceName","has","beforeAfterIntersection","Set","filter","x","size","Array","from","join","beforeForceAfterIntersection","init","tools","ctx","allTargets","assertAllRulesFound","tool","targetSeenIn","reset","clear","_run","state","_","RequirementError","steps","step","error","lastStepTool","at","invocations","length","resolve","allowed","currentStep","forced","Boolean","hidden","preventStop","stepsAsToolCalls","map","isTruthy","afterToolsRemaining","stepTool","matcher","delete","check","clone","instance"],"mappings":"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","file":"conditional.cjs","sourcesContent":["/**\n * Copyright 2025 © BeeAI a Series of LF Projects, LLC\n * SPDX-License-Identifier: Apache-2.0\n */\n\nimport { Requirement, RequirementError, Rule } from \"./requirement.js\";\nimport {\n  TargetType,\n  MultiTargetType,\n  extractTargets,\n  extractTargetName,\n  targetSeenIn,\n  assertAllRulesFound,\n} from \"./utils.js\";\nimport { AnyTool } from \"@/tools/base.js\";\nimport { RunContext } from \"@/context.js\";\nimport { ValueError } from \"@/errors.js\";\nimport type { RequirementAgentRunState } from \"@/agents/requirement/types.js\";\nimport { isTruthy } from \"remeda\";\n\nexport interface ConditionalRequirementOptions {\n  name?: string;\n  forceAtStep?: number;\n  onlyBefore?: MultiTargetType;\n  onlyAfter?: MultiTargetType;\n  forceAfter?: MultiTargetType;\n  forcePreventStop?: boolean;\n  minInvocations?: number;\n  maxInvocations?: number;\n  onlySuccessInvocations?: boolean;\n  consecutiveAllowed?: boolean;\n  priority?: number;\n  customChecks?: ((state: RequirementAgentRunState) => boolean)[];\n  enabled?: boolean;\n  reason?: string;\n}\n\nexport class ConditionalRequirement extends Requirement {\n  protected source: TargetType;\n  protected sourceTool?: AnyTool;\n  protected before: Set<TargetType>;\n  protected after: Set<TargetType>;\n  protected forceAfterSet: Set<TargetType>;\n  protected minInvocations: number;\n  protected maxInvocations: number;\n  protected forceAtStepValue?: number;\n  protected onlySuccessInvocations: boolean;\n  protected consecutiveAllowedValue: boolean;\n  protected customChecks: ((state: RequirementAgentRunState) => boolean)[];\n  protected forcePreventStop: boolean;\n  protected reason?: string;\n\n  constructor(target: TargetType, options: ConditionalRequirementOptions = {}) {\n    super(options.name || `Condition${extractTargetName(target)}`);\n\n    this.source = target;\n    this.enabled = options.enabled ?? true;\n\n    if (options.priority !== undefined) {\n      this.priority = options.priority;\n    }\n\n    this.before = extractTargets(options.onlyBefore);\n    this.after = extractTargets(options.onlyAfter);\n    this.forceAfterSet = extractTargets(options.forceAfter);\n    this.minInvocations = options.minInvocations ?? 0;\n    this.maxInvocations = options.maxInvocations ?? Infinity;\n    this.forceAtStepValue = options.forceAtStep;\n    this.onlySuccessInvocations = options.onlySuccessInvocations ?? true;\n    this.consecutiveAllowedValue = options.consecutiveAllowed ?? true;\n    this.customChecks = options.customChecks ?? [];\n    this.forcePreventStop = options.forcePreventStop ?? true;\n    this.reason = options.reason;\n\n    this.checkInvariant();\n  }\n\n  protected checkInvariant(): void {\n    if (this.minInvocations < 0) {\n      throw new ValueError(\"The 'minInvocations' argument must be non negative!\");\n    }\n\n    if (this.maxInvocations < 0) {\n      throw new ValueError(\"The 'maxInvocations' argument must be non negative!\");\n    }\n\n    if (this.minInvocations > this.maxInvocations) {\n      throw new ValueError(\n        \"The 'minInvocations' argument must be less than or equal to 'maxInvocations'!\",\n      );\n    }\n\n    const sourceName = extractTargetName(this.source);\n    if (this.before.has(this.source)) {\n      throw new ValueError(`Referencing self in 'before' is not allowed (${sourceName})!`);\n    }\n\n    if (this.forceAfterSet.has(this.source)) {\n      throw new ValueError(`Referencing self in 'forceAfter' is not allowed (${sourceName})!`);\n    }\n\n    const beforeAfterIntersection = new Set([...this.before].filter((x) => this.after.has(x)));\n    if (beforeAfterIntersection.size > 0) {\n      throw new ValueError(\n        `Tool specified as 'before' and 'after' at the same time: ${Array.from(beforeAfterIntersection).join(\", \")}!`,\n      );\n    }\n\n    const beforeForceAfterIntersection = new Set(\n      [...this.before].filter((x) => this.forceAfterSet.has(x)),\n    );\n    if (beforeForceAfterIntersection.size > 0) {\n      throw new ValueError(\n        `Tool specified as 'before' and 'forceAfter' at the same time: ${Array.from(beforeForceAfterIntersection).join(\", \")}!`,\n      );\n    }\n\n    if (this.forceAtStepValue !== undefined && this.forceAtStepValue < 1) {\n      throw new ValueError(\"The 'forceAtStep' argument must be >= 1!\");\n    }\n  }\n\n  async init(tools: AnyTool[], ctx: RunContext<any>): Promise<void> {\n    await super.init(tools, ctx);\n\n    const allTargets = new Set([...this.before, ...this.after, ...this.forceAfterSet, this.source]);\n    assertAllRulesFound(allTargets, tools);\n\n    for (const tool of tools) {\n      if (targetSeenIn(tool, this.source)) {\n        if (this.sourceTool && this.sourceTool !== tool) {\n          throw new ValueError(\n            `More than one occurrence of ${extractTargetName(this.source)} has been found!`,\n          );\n        }\n        this.sourceTool = tool;\n      }\n    }\n\n    if (!this.sourceTool) {\n      throw new ValueError(`Source tool ${extractTargetName(this.source)} was not found!`);\n    }\n\n    if (targetSeenIn(this.sourceTool, this.before)) {\n      throw new ValueError(`Referencing self in 'before' is not allowed: ${this.sourceTool.name}!`);\n    }\n\n    if (this.consecutiveAllowedValue && targetSeenIn(this.sourceTool, this.forceAfterSet)) {\n      throw new ValueError(\n        `Referencing self in 'forceAfter' is not allowed: ${this.sourceTool.name}. ` +\n          `It would prevent an infinite loop. Consider setting 'consecutiveAllowed' to false.`,\n      );\n    }\n  }\n\n  reset(): this {\n    this.before.clear();\n    this.after.clear();\n    this.forceAfterSet.clear();\n    return this;\n  }\n\n  async _run(state: RequirementAgentRunState, _: RunContext<typeof this>): Promise<Rule[]> {\n    const sourceTool = this.sourceTool;\n    if (!sourceTool) {\n      throw new RequirementError(\"Source was not found!\", this);\n    }\n\n    // Get steps from state (assuming state has steps property)\n    const steps = this.onlySuccessInvocations\n      ? state.steps.filter((step) => !step.error)\n      : state.steps;\n\n    const lastStepTool = steps.at(-1)?.tool;\n\n    const invocations = steps.filter((step) => step.tool === sourceTool).length;\n\n    const resolve = (allowed: boolean): Rule[] => {\n      const currentStep = steps.length + 1;\n      if (!allowed && this.forceAtStepValue === currentStep) {\n        throw new RequirementError(\n          `Tool '${sourceTool.name}' cannot be executed at step ${this.forceAtStepValue} ` +\n            `because it has not met all requirements.`,\n          this,\n        );\n      }\n\n      const forced = allowed\n        ? Boolean(\n            targetSeenIn(lastStepTool, this.forceAfterSet) || this.forceAtStepValue === currentStep,\n          )\n        : false;\n\n      return [\n        {\n          target: sourceTool.name,\n          allowed,\n          forced,\n          hidden: false,\n          preventStop: this.minInvocations > invocations || (forced && this.forcePreventStop),\n          reason: !allowed ? this.reason : undefined,\n        },\n      ];\n    };\n\n    // Check consecutive constraint\n    if (!this.consecutiveAllowedValue && sourceTool === lastStepTool) {\n      return resolve(false);\n    }\n\n    // Check max invocations\n    if (invocations >= this.maxInvocations) {\n      return resolve(false);\n    }\n\n    // Check after/before constraints\n    if (this.after.size > 0) {\n      const stepsAsToolCalls = steps.map((step) => step.tool).filter(isTruthy);\n      const afterToolsRemaining = new Set(this.after);\n\n      for (const stepTool of stepsAsToolCalls) {\n        if (targetSeenIn(stepTool, this.forceAfterSet)) {\n          return resolve(false);\n        }\n\n        const matcher = targetSeenIn(stepTool as any, this.after);\n        if (matcher) {\n          afterToolsRemaining.delete(matcher);\n        }\n      }\n\n      if (afterToolsRemaining.size > 0) {\n        return resolve(false);\n      }\n    }\n\n    // Check custom checks\n    for (const check of this.customChecks) {\n      if (!check(state)) {\n        return resolve(false);\n      }\n    }\n\n    return resolve(true);\n  }\n\n  async clone(): Promise<this> {\n    const instance = await super.clone();\n    instance.before = new Set(this.before);\n    instance.after = new Set(this.after);\n    instance.forceAfterSet = new Set(this.forceAfterSet);\n    instance.minInvocations = this.minInvocations;\n    instance.maxInvocations = this.maxInvocations;\n    instance.customChecks = [...this.customChecks];\n    instance.onlySuccessInvocations = this.onlySuccessInvocations;\n    instance.forceAtStepValue = this.forceAtStepValue;\n    instance.consecutiveAllowedValue = this.consecutiveAllowedValue;\n    instance.source = this.source;\n    instance.sourceTool = this.sourceTool;\n    instance.forcePreventStop = this.forcePreventStop;\n    instance.reason = this.reason;\n    return instance;\n  }\n}\n"]}