{"version":3,"sources":["../../../../src/agents/requirement/utils/llm.ts"],"names":["RequirementsReasoner","tools","entries","context","finalAnswer","update","requirements","requirement","push","entry","emitter","child","groupId","toCamelCase","name","creator","namespace","emit","init","findToolByName","tool","find","t","Error","map","join","createRequest","state","forceTool","extraRules","hidden","allowed","allTools","reasonByTool","WeakMap","preventStop","preventStepRefs","forced","forcedLevel","rulesByTool","Map","set","filter","e","enabled","generatedRules","run","rule","target","rules","get","priority","has","length","Math","max","r","toolName","sort","a","b","maxPriority","isAllowed","isForced","isHidden","isPreventStop","ruleEntry","reason","includes","finalAnswerIndex","indexOf","splice","AgentError","JSON","stringify","toolChoice","Tool","allowedTools","hiddenTools","canStop","createSystemMessage","template","request","SystemMessage","render","Promise","all","description","inputSchema","String","finalAnswerName","finalAnswerSchema","customSchema","undefined","finalAnswerInstructions","instructions","role","notes"],"mappings":"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","file":"llm.cjs","sourcesContent":["/**\n * Copyright 2025 © BeeAI a Series of LF Projects, LLC\n * SPDX-License-Identifier: Apache-2.0\n */\n\nimport { AnyTool, Tool } from \"@/tools/base.js\";\nimport { RunContext } from \"@/context.js\";\nimport { AgentError } from \"@/agents/base.js\";\nimport { SystemMessage } from \"@/backend/message.js\";\nimport { PromptTemplate } from \"@/template.js\";\nimport {\n  RequirementAgentRequest,\n  RequirementAgentRunState,\n  RequirementAgentSystemPromptInputSchema,\n} from \"@/agents/requirement/types.js\";\nimport {\n  Requirement,\n  RequirementCallbacks,\n  Rule,\n} from \"@/agents/requirement/requirements/requirement.js\";\nimport { FinalAnswerTool } from \"./tool.js\";\nimport { ChatModelToolChoice } from \"@/backend/chat.js\";\nimport { toCamelCase } from \"remeda\";\n\ninterface RuleEntry {\n  rule: Rule;\n  requirement: Requirement | null;\n  priority: number;\n}\n\n/**\n * Manages requirements and generates requests for the agent\n */\nexport class RequirementsReasoner {\n  protected tools: AnyTool[];\n  protected entries: Requirement[] = [];\n  protected context: RunContext<any>;\n  public readonly finalAnswer: FinalAnswerTool;\n\n  constructor(tools: AnyTool[], finalAnswer: FinalAnswerTool, context: RunContext<any>) {\n    this.tools = [...tools, finalAnswer];\n    this.finalAnswer = finalAnswer;\n    this.context = context;\n  }\n\n  async update(requirements: Requirement[]): Promise<void> {\n    this.entries = [];\n\n    for (const requirement of requirements) {\n      this.entries.push(requirement);\n    }\n\n    for (const entry of this.entries) {\n      const emitter = this.context.emitter.child<RequirementCallbacks>({\n        groupId: toCamelCase(entry.name),\n        creator: entry,\n      });\n      emitter.namespace.push(\"requirement\");\n\n      const tools = [...this.tools];\n      await emitter.emit(\"init\", { tools });\n      await entry.init(tools, this.context);\n    }\n  }\n\n  protected findToolByName(name: string): AnyTool {\n    const tool = this.tools.find((t) => t.name === name);\n    if (!tool) {\n      throw new Error(`Tool '${name}' not found in (${this.tools.map((t) => t.name).join(\", \")}).`);\n    }\n    return tool;\n  }\n\n  async createRequest(\n    state: RequirementAgentRunState,\n    forceTool: boolean,\n    extraRules: Rule[] = [],\n  ): Promise<RequirementAgentRequest> {\n    const hidden: AnyTool[] = [];\n    const allowed: AnyTool[] = [];\n    const allTools: AnyTool[] = [...this.tools];\n    const reasonByTool = new WeakMap<AnyTool, string | undefined>();\n\n    let preventStop = false;\n    const preventStepRefs: RuleEntry[] = [];\n\n    let forced: AnyTool | null = null;\n    let forcedLevel = 0;\n    const rulesByTool = new Map<string, RuleEntry[]>();\n\n    // Initialize rules map\n    for (const tool of this.tools) {\n      rulesByTool.set(tool.name, []);\n    }\n\n    // Group rules from requirements\n    for (const requirement of this.entries.filter((e) => e.enabled)) {\n      const generatedRules = await requirement.run(state);\n      for (const rule of generatedRules) {\n        const tool = this.findToolByName(rule.target);\n        const rules = rulesByTool.get(tool.name) || [];\n        rules.push({\n          priority: requirement.priority,\n          rule,\n          requirement,\n        });\n        rulesByTool.set(tool.name, rules);\n      }\n    }\n\n    // Add extra rules\n    for (const rule of extraRules) {\n      if (!rulesByTool.has(rule.target)) {\n        throw new Error(`Tool '${rule.target}' not found.`);\n      }\n\n      const rules = rulesByTool.get(rule.target)!;\n      const priority = rules.length > 0 ? Math.max(...rules.map((r) => r.priority)) + 1 : 1;\n      rules.push({\n        priority,\n        rule,\n        requirement: null,\n      });\n    }\n\n    // Aggregate rules and infer required tool\n    for (const [toolName, rules] of rulesByTool.entries()) {\n      const tool = this.findToolByName(toolName);\n      rules.sort((a, b) => b.priority - a.priority); // DESC\n\n      const maxPriority = rules.length > 0 ? rules[0].priority : 1;\n      let isAllowed = true;\n      let isForced = false;\n      let isHidden = false;\n      let isPreventStop = false;\n\n      for (const ruleEntry of rules) {\n        const rule = ruleEntry.rule;\n        if (!rule.allowed) {\n          isAllowed = false;\n        }\n        if (rule.hidden) {\n          isHidden = true;\n        }\n        if (rule.forced) {\n          isForced = true;\n        }\n        if (rule.preventStop) {\n          isPreventStop = true;\n          preventStepRefs.push(ruleEntry);\n        }\n        if (rule.reason) {\n          reasonByTool.set(tool, rule.reason);\n        }\n      }\n\n      if (isAllowed && isHidden) {\n        isAllowed = false;\n      }\n\n      if (isAllowed) {\n        if (!allowed.includes(tool)) {\n          allowed.push(tool);\n        }\n        if (isForced && (!forced || forcedLevel < maxPriority)) {\n          forced = tool;\n          forcedLevel = maxPriority;\n        }\n      }\n      if (isHidden) {\n        if (!hidden.includes(tool)) {\n          hidden.push(tool);\n        }\n      }\n      if (isPreventStop) {\n        preventStop = true;\n      }\n    }\n\n    // If forced tool is set, only allow it and final answer\n    if (forced) {\n      allowed.length = 0;\n      if (!allowed.includes(forced)) {\n        allowed.push(forced);\n      }\n      if (!allowed.includes(this.finalAnswer as any)) {\n        allowed.push(this.finalAnswer as any);\n      }\n    }\n\n    // If prevent stop is set and forced is not final answer, remove final answer\n    if (preventStop && forced !== this.finalAnswer) {\n      const finalAnswerIndex = allowed.indexOf(this.finalAnswer);\n      if (finalAnswerIndex !== -1) {\n        allowed.splice(finalAnswerIndex, 1);\n      }\n    }\n\n    if (allowed.length === 0) {\n      throw new AgentError(\n        \"One of the generated rules is preventing the agent from continuing. \" +\n          \"This indicates that the provided requirements may conflict with each other. \" +\n          \"See the following rules and their attached requirements that are preventing the agent from continuing.\\n\" +\n          JSON.stringify(preventStepRefs, null, 2),\n      );\n    }\n\n    let toolChoice: ChatModelToolChoice = forced || \"required\";\n    if (allowed.length === 1) {\n      toolChoice = allowed[0];\n    }\n\n    // Override to auto if not forcing and not preventing stop\n    if (!(toolChoice instanceof Tool) && !forceTool && !preventStop) {\n      toolChoice = \"auto\";\n    }\n\n    return {\n      tools: allTools,\n      allowedTools: allowed,\n      reasonByTool,\n      toolChoice,\n      finalAnswer: this.finalAnswer,\n      hiddenTools: hidden,\n      canStop: !preventStop,\n    };\n  }\n}\n\n/**\n * Create system message from template and request\n */\nexport async function createSystemMessage(\n  template: PromptTemplate<typeof RequirementAgentSystemPromptInputSchema>,\n  request: RequirementAgentRequest,\n): Promise<SystemMessage> {\n  return new SystemMessage(\n    template.render({\n      tools: await Promise.all(\n        request.tools\n          .filter((tool) => !request.hiddenTools.includes(tool))\n          .map(async (tool) => ({\n            name: tool.name,\n            description: tool.description,\n            inputSchema: JSON.stringify(await tool.inputSchema(), null, 2),\n            allowed: String(request.allowedTools.includes(tool)),\n            reason: request.reasonByTool.get(tool),\n          })),\n      ),\n      finalAnswerName: request.finalAnswer.name,\n      finalAnswerSchema: request.finalAnswer.customSchema\n        ? JSON.stringify(request.finalAnswer.inputSchema, null, 2)\n        : undefined,\n      finalAnswerInstructions: request.finalAnswer.instructions, // default\n      role: undefined, // default\n      instructions: undefined, // default\n      notes: undefined, // default\n    }),\n  );\n}\n"]}