{"version":3,"sources":["../../../../src/agents/experimental/streamlit/agent.ts"],"names":["StreamlitAgent","BaseAgent","emitter","constructor","input","Emitter","namespace","creator","meta","name","tools","description","memory","_run","_options","run","userMessage","runMemory","prepare","content","chunk","llm","stream","messages","signal","delta","getTextContent","emit","state","result","parse","assistantMessage","BaseMessage","of","role","Role","ASSISTANT","text","addMany","filter","isTruthy","message","systemMessage","SYSTEM","templates","system","StreamlitAgentSystemPrompt","render","prompt","isEmpty","USER","createdAt","Date","inputMessages","TokenMemory","capacityThreshold","syncThreshold","handlers","removalSelector","msgs","prevConversationMsg","find","msg","includes","last","lastMsg","length","m","AgentError","raw","blocks","i","substring","code","findFirstPair","allowOverlap","push","start","end","inner","createSnapshot"],"mappings":";;;;;;;;;;;;AAsEO,MAAMA,uBAAuBC,kBAAAA,CAAAA;EAtEpC;;;;AAuESC,EAAAA,OAAAA;AAKPC,EAAAA,WAAAA,CAA+BC,KAA4B,EAAA;AACzD,IAAA,KAAA,IAAK,IADwBA,CAAAA,KAAAA,GAAAA,OAAAA,IALxBF,CAAAA,OAAAA,GAAU,IAAIG,mBAAyB,CAAA;MAC5CC,SAAW,EAAA;AAAC,QAAA,OAAA;AAAS,QAAA,cAAA;AAAgB,QAAA;;MACrCC,OAAS,EAAA;KACX,CAAA;AAIA;AAEA,EAAA,IAAWC,IAAkB,GAAA;AAC3B,IAAO,OAAA;MACLC,IAAM,EAAA,CAAA,SAAA,CAAA;AACNC,MAAAA,KAAAA,EAAO,EAAA;MACPC,WAAa,EAAA,CAAA,iLAAA;AACf,KAAA;AACF;AAEA,EAAA,IAAIC,OAAOA,MAAoB,EAAA;AAC7B,IAAA,IAAA,CAAKR,MAAMQ,MAASA,GAAAA,MAAAA;AACtB;AAEA,EAAA,IAAWA,MAAS,GAAA;AAClB,IAAA,OAAO,KAAKR,KAAMQ,CAAAA,MAAAA;AACpB;EAEA,MAAgBC,IAAAA,CACdT,KACAU,EAAAA,QAAAA,EACAC,GAC6B,EAAA;AAC7B,IAAA,MAAM,EAAEC,WAAaC,EAAAA,SAAAA,KAAc,MAAM,IAAA,CAAKC,QAAQd,KAAAA,CAAAA;AAEtD,IAAA,IAAIe,OAAU,GAAA,EAAA;AACd,IAAA,WAAA,MAAiBC,SAAS,IAAKhB,CAAAA,KAAAA,CAAMiB,GAAIC,CAAAA,MAAAA,CAAOL,UAAUM,QAAU,EAAA;AAClEC,MAAAA,MAAAA,EAAQT,GAAIS,CAAAA;AACd,KAAA,CAAI,EAAA;AACF,MAAMC,MAAAA,KAAAA,GAAQL,MAAMM,cAAc,EAAA;AAClCP,MAAWM,OAAAA,IAAAA,KAAAA;AACX,MAAMV,MAAAA,GAAAA,CAAIb,OAAQyB,CAAAA,IAAAA,CAAK,UAAY,EAAA;AAAEF,QAAAA,KAAAA;QAAOG,KAAO,EAAA;AAAET,UAAAA;AAAQ,SAAA;AAAGC,QAAAA;OAAM,CAAA;AACxE;AACA,IAAMS,MAAAA,MAAAA,GAAS,IAAKC,CAAAA,KAAAA,CAAMX,OAAAA,CAAAA;AAE1B,IAAMY,MAAAA,gBAAAA,GAAmBC,wBAAYC,EAAG,CAAA;AACtCC,MAAAA,IAAAA,EAAMC,gBAAKC,CAAAA,SAAAA;MACXC,IAAMlB,EAAAA;KACR,CAAA;AACA,IAAM,MAAA,IAAA,CAAKP,OAAO0B,OAAQ,CAAA;AAACtB,MAAAA,WAAAA;AAAae,MAAAA;AAAkBQ,KAAAA,CAAAA,MAAAA,CAAOC,eAAAA,CAAAA,CAAAA;AAEjE,IAAO,OAAA;AACLX,MAAAA,MAAAA;MACAY,OAASV,EAAAA,gBAAAA;MACTnB,MAAQK,EAAAA;AACV,KAAA;AACF;AAEA,EAAA,MAAgBC,QAAQd,KAA0B,EAAA;AAChD,IAAMsC,MAAAA,aAAAA,GAAgBV,wBAAYC,EAAG,CAAA;AACnCC,MAAAA,IAAAA,EAAMC,gBAAKQ,CAAAA,MAAAA;AACXN,MAAAA,IAAAA,EAAAA,CAAO,KAAKjC,KAAMwC,CAAAA,SAAAA,EAAWC,UAAUC,sCAA4BC,EAAAA,MAAAA,CAAO,EAAC;KAC7E,CAAA;AAEA,IAAM/B,MAAAA,WAAAA,GACJZ,MAAM4C,MAAW,KAAA,IAAA,IAAQ,KAAKpC,MAAOqC,CAAAA,OAAAA,EACjCjB,GAAAA,uBAAAA,CAAYC,EAAG,CAAA;AACbC,MAAAA,IAAAA,EAAMC,gBAAKe,CAAAA,IAAAA;AACXb,MAAAA,IAAAA,EAAMjC,MAAM4C,MAAU,IAAA,aAAA;MACtBxC,IAAM,EAAA;AACJ2C,QAAAA,SAAAA,sBAAeC,IAAAA;AACjB;AACF,KAAA,CACA,GAAA,IAAA;AAEN,IAAA,MAAMC,aAAgB,GAAA;AAAI,MAAA,GAAA,IAAA,CAAKzC,MAAOW,CAAAA,QAAAA;AAAUP,MAAAA;AAAauB,KAAAA,CAAAA,MAAAA,CAAOC,eAAAA,CAAAA;AAEpE,IAAMvB,MAAAA,SAAAA,GAAY,IAAIqC,2BAAY,CAAA;AAChCjC,MAAAA,GAAAA,EAAK,KAAKjB,KAAMiB,CAAAA,GAAAA;MAChBkC,iBAAmB,EAAA,IAAA;MACnBC,aAAe,EAAA,GAAA;MACfC,QAAU,EAAA;AACRC,QAAAA,eAAAA,CAAgBC,IAAI,EAAA;AAElB,UAAMC,MAAAA,mBAAAA,GAAsBD,KAAKE,IAAK,CAAA,CAACC,QAAQT,aAAcU,CAAAA,QAAAA,CAASD,GAAAA,CAAAA,CAAAA;AACtE,UAAA,IAAIF,mBAAuBA,IAAAA,mBAAAA,KAAwBI,WAAKX,CAAAA,aAAAA,CAAgB,EAAA;AACtE,YAAOO,OAAAA,mBAAAA;AACT;AAEA,UAAMK,MAAAA,OAAAA,GAAUN,IAAKO,CAAAA,MAAAA,GAAS,CAAKP,IAAAA,IAAAA,CAAKE,IAAK,CAAA,CAACM,CAAMA,KAAAA,CAAAA,CAAEjC,IAASC,KAAAA,gBAAAA,CAAKC,SAAS,CAAA;AAC7E,UAAA,IAAI,CAAC6B,OAAS,EAAA;AACZ,YAAM,MAAA,IAAIG,oBAAW,8DAAA,CAAA;AACvB;AACA,UAAOH,OAAAA,OAAAA;AACT;AACF;KACF,CAAA;AACA,IAAA,MAAMhD,UAAUqB,OAAQ,CAAA;AAACI,MAAAA,aAAAA;AAAkBW,MAAAA,GAAAA;AAAed,KAAAA,CAAAA,MAAAA,CAAOC,eAAAA,CAAAA,CAAAA;AAEjE,IAAO,OAAA;AAAEvB,MAAAA,SAAAA;AAAWD,MAAAA;AAAY,KAAA;AAClC;AAEUc,EAAAA,KAAAA,CAAMuC,GAAqB,EAAA;AACnC,IAAA,MAAMC,SAAkB,EAAA;AAExB,IAAA,KAAA,IAASC,CAAI,GAAA,CAAA,EAAGA,CAAIF,GAAAA,GAAAA,CAAIH,MAAU,IAAA;AAChC,MAAM7B,MAAAA,IAAAA,GAAOgC,GAAIG,CAAAA,SAAAA,CAAUD,CAAAA,CAAAA;AAE3B,MAAME,MAAAA,IAAAA,GAAOC,yBAAcrC,IAAM,EAAA;AAAC,QAAA,iBAAA;AAAmB,QAAA;AAAU,OAAA,EAAA;QAAEsC,YAAc,EAAA;OAAK,CAAA;AACpF,MAAA,IAAI,CAACF,IAAM,EAAA;AACTH,QAAAA,MAAAA,CAAOM,IAAK,CAAA;UAAEC,KAAON,EAAAA,CAAAA;AAAGO,UAAAA,GAAAA,EAAKP,IAAIlC,IAAK6B,CAAAA,MAAAA;UAAQ/C,OAASkB,EAAAA,IAAAA;UAAM5B,IAAM,EAAA;SAAO,CAAA;AAC1E,QAAA;AACF;AAEA,MAAIgE,IAAAA,IAAAA,CAAKI,QAAQ,CAAG,EAAA;AAClBP,QAAAA,MAAAA,CAAOM,IAAK,CAAA;UACVnE,IAAM,EAAA,MAAA;UACNoE,KAAON,EAAAA,CAAAA;AACPO,UAAAA,GAAAA,EAAKP,IAAIE,IAAKI,CAAAA,KAAAA;AACd1D,UAAAA,OAAAA,EAASkB,IAAKmC,CAAAA,SAAAA,CAAU,CAAGC,EAAAA,IAAAA,CAAKI,KAAK;SACvC,CAAA;AACF;AACAP,MAAAA,MAAAA,CAAOM,IAAK,CAAA;QACVnE,IAAM,EAAA,KAAA;AACNU,QAAAA,OAAAA,EAASsD,IAAKM,CAAAA,KAAAA;AACdF,QAAAA,KAAAA,EAAON,IAAIE,IAAKI,CAAAA,KAAAA;AAChBC,QAAAA,GAAAA,EAAKP,IAAIE,IAAKK,CAAAA;OAChB,CAAA;AACAP,MAAAA,CAAAA,IAAKE,IAAKK,CAAAA,GAAAA;AACZ;AAEA,IAAO,OAAA;AACLT,MAAAA,GAAAA;AACAC,MAAAA;AACF,KAAA;AACF;EAEAU,cAAiB,GAAA;AACf,IAAO,OAAA;AACL,MAAA,GAAG,MAAMA,cAAAA,EAAAA;AACT5E,MAAAA,KAAAA,EAAO,IAAKA,CAAAA;AACd,KAAA;AACF;AACF","file":"agent.cjs","sourcesContent":["/**\n * Copyright 2025 IBM Corp.\n *\n * Licensed under the Apache License, Version 2.0 (the \"License\");\n * you may not use this file except in compliance with the License.\n * You may obtain a copy of the License at\n *\n *     http://www.apache.org/licenses/LICENSE-2.0\n *\n * Unless required by applicable law or agreed to in writing, software\n * distributed under the License is distributed on an \"AS IS\" BASIS,\n * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.\n * See the License for the specific language governing permissions and\n * limitations under the License.\n */\n\nimport { AgentError, BaseAgent, BaseAgentRunOptions } from \"@/agents/base.js\";\nimport { AgentMeta } from \"@/agents/types.js\";\nimport { GetRunContext } from \"@/context.js\";\nimport { Callback, Emitter } from \"@/emitter/emitter.js\";\nimport { BaseMemory } from \"@/memory/base.js\";\nimport { ChatLLM, ChatLLMOutput } from \"@/llms/chat.js\";\nimport { isTruthy, last } from \"remeda\";\nimport { BaseMessage, Role } from \"@/llms/primitives/message.js\";\nimport {\n  StreamlitAgentSystemPrompt,\n  StreamlitAgentTemplates,\n} from \"@/agents/experimental/streamlit/prompts.js\";\nimport { BaseLLMOutput } from \"@/llms/base.js\";\nimport { TokenMemory } from \"@/memory/tokenMemory.js\";\nimport { findFirstPair } from \"@/internals/helpers/string.js\";\n\nexport interface StreamlitAgentInput {\n  llm: ChatLLM<ChatLLMOutput>;\n  memory: BaseMemory;\n  templates?: Partial<StreamlitAgentTemplates>;\n}\n\nexport interface StreamlitRunInput {\n  prompt: string | null;\n}\n\ninterface Block {\n  name: \"text\" | \"app\";\n  content: string;\n  start: number;\n  end: number;\n}\n\ninterface Result {\n  raw: string;\n  blocks: Block[];\n}\n\nexport interface StreamlitRunOutput {\n  result: Result;\n  message: BaseMessage;\n  memory: BaseMemory;\n}\n\nexport interface StreamlitEvents {\n  newToken: Callback<{\n    delta: string;\n    state: Readonly<{\n      content: string;\n    }>;\n    chunk: BaseLLMOutput;\n  }>;\n}\n\nexport class StreamlitAgent extends BaseAgent<StreamlitRunInput, StreamlitRunOutput> {\n  public emitter = new Emitter<StreamlitEvents>({\n    namespace: [\"agent\", \"experimental\", \"streamlit\"],\n    creator: this,\n  });\n\n  constructor(protected readonly input: StreamlitAgentInput) {\n    super();\n  }\n\n  public get meta(): AgentMeta {\n    return {\n      name: `Streamlit`,\n      tools: [],\n      description: `StreamlitAgent is an experimental meta-app agent that uses \\`Meta LLaMa 3.1 70B\\` to build \\`IBM Granite 3 8B\\`-powered apps using Streamlit -- a simple UI framework for Python.`,\n    };\n  }\n\n  set memory(memory: BaseMemory) {\n    this.input.memory = memory;\n  }\n\n  public get memory() {\n    return this.input.memory;\n  }\n\n  protected async _run(\n    input: StreamlitRunInput,\n    _options: BaseAgentRunOptions,\n    run: GetRunContext<typeof this>,\n  ): Promise<StreamlitRunOutput> {\n    const { userMessage, runMemory } = await this.prepare(input);\n\n    let content = \"\";\n    for await (const chunk of this.input.llm.stream(runMemory.messages, {\n      signal: run.signal,\n    })) {\n      const delta = chunk.getTextContent();\n      content += delta;\n      await run.emitter.emit(\"newToken\", { delta, state: { content }, chunk });\n    }\n    const result = this.parse(content);\n\n    const assistantMessage = BaseMessage.of({\n      role: Role.ASSISTANT,\n      text: content,\n    });\n    await this.memory.addMany([userMessage, assistantMessage].filter(isTruthy));\n\n    return {\n      result,\n      message: assistantMessage,\n      memory: runMemory,\n    };\n  }\n\n  protected async prepare(input: StreamlitRunInput) {\n    const systemMessage = BaseMessage.of({\n      role: Role.SYSTEM,\n      text: (this.input.templates?.system ?? StreamlitAgentSystemPrompt).render({}),\n    });\n\n    const userMessage =\n      input.prompt !== null || this.memory.isEmpty()\n        ? BaseMessage.of({\n            role: Role.USER,\n            text: input.prompt ?? \"No message.\",\n            meta: {\n              createdAt: new Date(),\n            },\n          })\n        : null;\n\n    const inputMessages = [...this.memory.messages, userMessage].filter(isTruthy);\n\n    const runMemory = new TokenMemory({\n      llm: this.input.llm,\n      capacityThreshold: 0.85,\n      syncThreshold: 0.6,\n      handlers: {\n        removalSelector(msgs) {\n          // First we remove messages from the past conversations\n          const prevConversationMsg = msgs.find((msg) => inputMessages.includes(msg));\n          if (prevConversationMsg && prevConversationMsg !== last(inputMessages)) {\n            return prevConversationMsg;\n          }\n\n          const lastMsg = msgs.length > 3 && msgs.find((m) => m.role === Role.ASSISTANT);\n          if (!lastMsg) {\n            throw new AgentError(\"Cannot fit the current conversation into the context window!\");\n          }\n          return lastMsg;\n        },\n      },\n    });\n    await runMemory.addMany([systemMessage, ...inputMessages].filter(isTruthy));\n\n    return { runMemory, userMessage };\n  }\n\n  protected parse(raw: string): Result {\n    const blocks: Block[] = [];\n\n    for (let i = 0; i < raw.length; ) {\n      const text = raw.substring(i);\n\n      const code = findFirstPair(text, [\"```python-app\\n\", \"\\n```\"], { allowOverlap: true });\n      if (!code) {\n        blocks.push({ start: i, end: i + text.length, content: text, name: \"text\" });\n        break;\n      }\n\n      if (code.start > 0) {\n        blocks.push({\n          name: \"text\",\n          start: i,\n          end: i + code.start,\n          content: text.substring(0, code.start),\n        });\n      }\n      blocks.push({\n        name: \"app\",\n        content: code.inner,\n        start: i + code.start,\n        end: i + code.end,\n      });\n      i += code.end;\n    }\n\n    return {\n      raw,\n      blocks,\n    };\n  }\n\n  createSnapshot() {\n    return {\n      ...super.createSnapshot(),\n      input: this.input,\n    };\n  }\n}\n"]}