Repository: sirji-ai/sirji (language: python)

Issue:
Tokens modal UI



Discussion / hints:

Fix patch:
diff --git a/README.md b/README.md
index 64827d69..7db1b958 100644
--- a/README.md
+++ b/README.md
@@ -3,7 +3,7 @@
 </p>
 
 <p align="center">
-  <em>Sirji is an agentic AI framework for software development.</em>
+  <em>Sirji is a framework to build & run custom AI agents for your everyday dev tasks.</em>
 </p>
 
 <p align="center">
@@ -13,7 +13,8 @@
 <p align="center">
   <img alt="GitHub License" src="https://img.shields.io/github/license/sirji-ai/sirji">
   <img alt="GitHub commit activity" src="https://img.shields.io/github/commit-activity/m/sirji-ai/sirji">
-  <img alt="GitHub Issues or Pull Requests" src="https://img.shields.io/github/issues/sirji-ai/sirji">
+  <img alt="GitHub Open Issues" src="https://img.shields.io/github/issues/sirji-ai/sirji">
+  <img alt="GitHub Closed Issues" src="https://img.shields.io/github/issues-closed/sirji-ai/sirji">
 </p>
 
 <p align="center">
@@ -24,22 +25,33 @@
 
 ## Sirji
 
-Sirji as an open-source framework where various AI agents collaborate via a messaging protocol to solve a given software problem. Problems range from building greenfield web apps to solving GitHub issues, writing test cases, and generating documentation.
+Sirji is a framework designed to build and run custom AI agents for your everyday development tasks.
 
-Sirji uses either the standard or user-generated recipe, that lists prescribed tasks and tips for solving a particular problem. Recipe also indicates which agent should perform each task.
+Sirji has two main product components: Sirji Studio and Sirji VS Code Extension.
 
-An Agent in the Sirji framework is a modular AI component that performs a specific task based on a custom pseudo code. The community can create a custom agent either by modifying an already existing agent or write entirely new agent with entirely different pseudo code.
+### Sirji Studio
 
-Sirji is currently implemented as a Visual Studio Code extension. This extension provides an interactive chat interface right within your IDE through which you can submit your problem statement and give feedback to Sirji.
+We have built the framework that allows the developer community to build custom agents simply by writing pseudocode in plain English.
 
-The extension leverages the capabilities of VS Code, including the Editor, Terminal, and Project Explorer.
+Custom agents help capture and convey the developer's code writing style and domain knowledge to Sirji. They performs a specific task based on a custom pseudocode. The community can create a custom agent either by modifying an existing agent or by writing an entirely new agent with a different pseudocode.
 
-Additionally, Sirji sets up your local or remote development environment by installing system-level packages and programming language-specific dependencies. It executes the generated code in your local or remote development environment.
+### Sirji VS Code Extension
 
-## Prerequisites
+We have build and released the [VS Code Extension](https://marketplace.visualstudio.com/items?itemName=TrueSparrow.sirji) on the Visual Studio Marketplace.
 
-Make sure you have installed all of the following prerequisites on your machine:
+This extension has the following features implemented:
+- Interactive chat interface allows user to submit their problem statements and give feedback to Sirji.
+- Messaging protocol implements the allowed response templates for messages exchanged between various agents.
+- Orchestrator enables requirement gathering, recipe selection, recipe execution by invoking agents
+- Executor makes these functionalities accessible to the agents: file system access, search, find & replace, insert text in project files, install packages, execute commands, run code, run test cases.
+- Agent Sessions provide the ability to invoke an agent with a fresh LLM conversation or continue on an existing LLM conversation.
+- Logs and Token Usage Summary are displayed alongside the interactive chat interface.
+
+## Installation
+
+You can start using Sirji by installing this [extension](https://marketplace.visualstudio.com/items?itemName=TrueSparrow.sirji) from the Visual Studio Marketplace.
 
+Make sure you have installed all of the following prerequisites on your machine:
 - Visual Studio Code (>= 1.80.2)
 - Node.js (>= 18) and npm (>= 8.19)
 - Python (>= 3.10) - Make sure `python --version` runs without error.
@@ -49,15 +61,14 @@ Also, you will need an OpenAI API key to access the GPT-4o model.
 
 ## Demo Video
 
-Here's a three-minute demo showing the five-second Sirji installation, followed by a quick walkthrough of Sirji's attempt to solve a given problem statement (building an interactive Tic-Tac-Toe game website).
-
-Watch on YouTube: <a href="https://www.youtube.com/watch?v=r1wJHLUDVTo" target="_blank">https://www.youtube.com/watch?v=r1wJHLUDVTo</a>
+Here's a three-minute demo. We tasked Sirji with creating a new API and its test cases in an existing Node.js repository. Sirji uses these custom agents we developed:
+- **Code Planner**: Generates an implementation guide with steps and code snippets based on domain knowledge.
+- **Test Planner**: Generates an implementation guide for test cases, following the existing framework and conventions.
+- **Code Writer**: Implements the code changes specified in the guides.
 
-<a href="https://www.youtube.com/watch?v=r1wJHLUDVTo" target="_blank"><img src="https://github.com/sirji-ai/sirji/assets/7627517/a21804a7-06d5-4974-ae94-bb72870b93fd" alt="Tic Tac Toe game by Sirji"></a>
+Watch on YouTube: <a href="https://www.youtube.com/watch?v=NA7uPIvcvmg" target="_blank">https://www.youtube.com/watch?v=NA7uPIvcvmg</a>
 
-## Installation
-
-You can start using Sirji by installing this [extension](https://marketplace.visualstudio.com/items?itemName=TrueSparrow.sirji) from the Visual Studio Marketplace.
+<a href="https://www.youtube.com/watch?v=NA7uPIvcvmg" target="_blank"><img src="https://github.com/sirji-ai/sirji/assets/7627517/8156bdd5-7324-47e4-a375-df0d29e095c9" alt="Custom Agents for Creating a New API and Test Cases in an Existing Node.js Repository"></a>
 
 ## Architecture
 
@@ -75,7 +86,10 @@ A Recipe is a file that lists prescribed tasks and tips for solving a particular
 
 ### Orchestrator
 
-The Orchestrator is the central component in the Sirji framework, responsible for managing the flow and execution of tasks across different agents as per the recipe.
+The Orchestrator is the central component in the Sirji framework, responsible for following:
+- Gathering requirement from the user.
+- Showing list of available recipes to the user and asking for their choice.
+- Reading the selected recipe and managing the flow & execution of prescribed tasks from the selected recipe.
 
 ### Agent Sessions
 An agent can be invoked in either a fresh session or asked to continue an existing session. When invoked in a new session, it starts with a new system prompt and does not retain the context from the previous session. Sessions help keep the context focused on specific tasks.
@@ -120,7 +134,7 @@ We have published following 3 PyPI packages, implementing different responsibili
 - Custom Logging
 
 ### Architecture Diagram
-![Sirji - Architecture Diagram](https://github.com/sirji-ai/sirji/assets/7627517/9068c6d1-a11b-4589-b09e-ad494334fd6b)
+![Sirji - Architecture Diagram](https://github.com/sirji-ai/sirji/assets/7627517/0edd8cfe-1d49-4119-8960-1a3f2bf1f73f)
 
 ## Roadmap
 We are calling our next release the ‘Core’ Release (ONGOING).
diff --git a/agents/README.md b/agents/README.md
index b66f1a8c..78702504 100644
--- a/agents/README.md
+++ b/agents/README.md
@@ -80,34 +80,24 @@ export SIRJI_MODEL_PROVIDER_API_KEY='API key to be used for LLM inference.'
 The Orchestrator is the central component in the Sirji framework, responsible for managing the flow and execution of tasks across different agents.
 
 ```python
-# Following is a sample recipe
-recipe = {
-  "prescribed_tasks": [
-    {
-      "task": "Write epics and user stories.",
-      "agent": "PRODUCT_MANAGER"
-    },
-    {
-      "task": "Write architecture components.",
-      "agent": "ARCHITECT"
-    },
-    {
-      "task": "Implement the epic & user stories using the architecture components.",
-      "agent": "CODER"
-    }
-  ],
-  "tips": [
-    {
-      "deviation": "Architecture components are not in sync with the epics and user stories.",
-      "agent": "PRODUCT_MANAGER",
-      "task": "Make the epics and user stories consistent with the architecture components."
-    }
-  ]
-}
-
 from sirji_agents import Orchestrator
 
-agent = Orchestrator(recipe)
+agent_output_folder_index = {
+  "SIRJI/problem.txt": {
+    "description": "Problem statement from the user.",
+    "created_by": "SIRJI"
+  },
+  "PRODUCT_MANAGER/finalized_epics_user_stories.txt": {
+    "description": "Finalized Epics and User Stories for the Tic-Tac-Toe game with AI opponent.",
+    "created_by": "PRODUCT_MANAGER"
+  },
+  "ARCHITECT/finalized_architecture_components.txt": {
+    "description": "Finalized architecture components for the Tic-Tac-Toe game with AI opponent.",
+    "created_by": "ARCHITECT"
+  }
+}
+
+agent = Orchestrator(agent_output_folder_index)
 
 # History is the array of LLM conversations till now
 history = []
diff --git a/agents/requirements.txt b/agents/requirements.txt
index ef0f2ce9..a4c7ff84 100644
--- a/agents/requirements.txt
+++ b/agents/requirements.txt
@@ -1,3 +1,3 @@
-sirji-messages==0.0.18
+sirji-messages==0.0.20
 sirji-tools==0.0.12
 openai==1.14.1
diff --git a/agents/setup.py b/agents/setup.py
index 15eeb459..d5553cae 100644
--- a/agents/setup.py
+++ b/agents/setup.py
@@ -2,7 +2,7 @@
 
 setup(
     name='sirji-agents',
-    version='0.0.26',
+    version='0.0.28',
     author='Sirji',
     description='Orchestrator, Generic Agent, and Research Agent components of the Sirji AI agentic framework.',
     license='MIT',
diff --git a/agents/sirji_agents/llm/generic.py b/agents/sirji_agents/llm/generic.py
index 5ed13637..3c241db4 100644
--- a/agents/sirji_agents/llm/generic.py
+++ b/agents/sirji_agents/llm/generic.py
@@ -5,7 +5,7 @@
 # TODO - log file should be dynamically created based on agent ID
 from sirji_tools.logger import p_logger as logger
 
-from sirji_messages import message_parse, MessageParsingError, MessageValidationError, ActionEnum, AgentEnum, allowed_response_templates
+from sirji_messages import message_parse, MessageParsingError, MessageValidationError, ActionEnum, AgentEnum, allowed_response_templates, permissions_dict, ActionEnum
 from .model_providers.factory import LLMProviderFactory
 
 class GenericAgent():
@@ -36,6 +36,8 @@ def __prepare_conversation(self, input_message, history):
             conversation.append(
                 {"role": "system", "content": self.system_prompt()})
         else:
+            if history[0]['role'] == "system":
+                history[0]['content'] = self.system_prompt()
             conversation = history
         
         parsed_input_message = message_parse(input_message)
@@ -98,7 +100,7 @@ def system_prompt(self):
             - Not conforming above rules will lead to response processing errors.""")
 
         # Todo: Use action names from ActionEnum
-        understanding_the_folders = textwrap.dedent(f"""
+        understanding_the_folders = textwrap.dedent("""
             Project Folder:
             - The Project Folder is your primary directory for accessing all user-specific project files, including code files, documentation, and other relevant resources.
             - When initializing Sirji, the SIRJI_USER selects this folder as the primary workspace for the project. You should refer to this folder exclusively for accessing and modifying project-specific files.
@@ -109,7 +111,14 @@ def system_prompt(self):
             - This folder is different from the project folder and this ensures that operational data is kept separate from project files.
             
             Agent Output Index:
-            - The Agent Output Index is an index file for the Agent Output Folder that keeps track of all files written by agents in that folder along with the a brief description of the file contents.""")
+            - The Agent Output Index is an index file for the Agent Output Folder that keeps track of all files written by agents in that folder along with the a brief description of the file contents.
+            - The Agent Output Index will look as follows:
+              {
+                  'agent_id/file_name': {
+                        'description': 'description of the file contents'
+                        'created_by': 'agent_id'
+                  }
+              }""")
 
         instructions = textwrap.dedent(f"""
             Instructions:
@@ -155,18 +164,26 @@ def system_prompt(self):
                     BODY:
                     {{Purpose of invocation.}}
                     ***""") + '\n'
+            
+        allowed_response_templates_str += '\n' + allowed_response_templates(AgentEnum.ANY, AgentEnum.SIRJI_USER, permissions_dict[(AgentEnum.ANY, AgentEnum.SIRJI_USER)]) + '\n'
+
+        action_list = permissions_dict[(AgentEnum.ANY, AgentEnum.EXECUTOR)]
+        accessible_actions = self.config.get("accessible_actions", [])
+        if accessible_actions:
+            for action in accessible_actions:
+                action_list.add(ActionEnum[action])
+        allowed_response_templates_str += '\n' +  allowed_response_templates(AgentEnum.ANY, AgentEnum.EXECUTOR, action_list) + '\n'
 
-        allowed_response_templates_str += '\n' + allowed_response_templates(AgentEnum.ANY, AgentEnum.SIRJI_USER) + '\n'
-        allowed_response_templates_str += '\n' +  allowed_response_templates(AgentEnum.ANY, AgentEnum.EXECUTOR) + '\n'
-        allowed_response_templates_str += '\n' + allowed_response_templates(AgentEnum.ANY, AgentEnum.CALLER) + '\n'
+        allowed_response_templates_str += '\n' + allowed_response_templates(AgentEnum.ANY, AgentEnum.CALLER, permissions_dict[(AgentEnum.ANY, AgentEnum.CALLER)]) + '\n'
     
         current_agent_output_index = f"Current contents of Agent Output Index:\n{json.dumps(self.agent_output_folder_index, indent=4)}"
 
         current_project_folder_structure = f"Recursive structure of the project folder:\n{os.environ.get('SIRJI_PROJECT_STRUCTURE')}"
-
-        file_summaries = 'Here are the concise summaries of the responsibilities and functionalities for each file currently present in the project folder:\n'
-        if self.file_summaries is not None:
+        file_summaries = ""
+        if self.file_summaries:
+            file_summaries = 'Here are the concise summaries of the responsibilities and functionalities for each file currently present in the project folder:\n'
             file_summaries += f"File Summaries:\n{self.file_summaries}"
+        
 
         return f"{initial_intro}\n{response_specifications}{understanding_the_folders}\n{instructions}\n{formatted_skills}\n{allowed_response_templates_str}\n\n{current_agent_output_index}\n\n{current_project_folder_structure}\n\n{file_summaries}".strip()
     
diff --git a/agents/sirji_agents/llm/orchestrator.py b/agents/sirji_agents/llm/orchestrator.py
index 3036ab70..1747c486 100644
--- a/agents/sirji_agents/llm/orchestrator.py
+++ b/agents/sirji_agents/llm/orchestrator.py
@@ -1,16 +1,16 @@
 import textwrap
 import os
+import json
 
 # TODO - log file should be dynamically created based on agent ID
 from sirji_tools.logger import p_logger as logger
 
-from sirji_messages import message_parse, MessageParsingError, MessageValidationError, ActionEnum, AgentEnum, allowed_response_templates
+from sirji_messages import message_parse, MessageParsingError, MessageValidationError, ActionEnum, AgentEnum, allowed_response_templates, permissions_dict
 from .model_providers.factory import LLMProviderFactory
 
 class Orchestrator():
-    def __init__(self, recipe):
-        
-        self.recipe = recipe
+    def __init__(self, agent_output_folder_index):
+        self.agent_output_folder_index = agent_output_folder_index
 
     def message(self, input_message, history=[]):
         conversation = self.__prepare_conversation(input_message, history)
@@ -31,6 +31,9 @@ def __prepare_conversation(self, input_message, history):
             conversation.append(
                 {"role": "system", "content": self.system_prompt()})
         else:
+            if history[0]['role'] == "system":
+                history[0]['content'] = self.system_prompt()
+                
             conversation = history
             parsed_input_message = message_parse(input_message)
             conversation.append({"role": "user", "content": input_message, "parsed_content": parsed_input_message})
@@ -84,36 +87,58 @@ def system_prompt(self):
             You are an agent named "Orchestration Agent", a component of the Sirji AI agentic framework.
             Your Agent ID: ORCHESTRATOR
             Your OS (refered as SIRJI_OS later): {os.name}""")
+                
+        response_specifications = textwrap.dedent(f"""
+            Your Response:
+            - Your response must conform strictly to one of the allowed Response Templates, as it will be processed programmatically and only these templates are recognized.
+            - Your response must be enclosed within '***' at the beginning and end, without any additional text above or below these markers.
+            - Do not respond with two actions in the same response. Respond with one action at a time.                                                  
+            - Not conforming above rules will lead to response processing errors.""")
+        
+        understanding_the_folders = textwrap.dedent("""
+            Project Folder:
+            - The Project Folder is your primary directory for accessing all user-specific project files, including code files, documentation, and other relevant resources.
+            - When initializing Sirji, the SIRJI_USER selects this folder as the primary workspace for the project. You should refer to this folder exclusively for accessing and modifying project-specific files.
+            
+            Agent Output Folder:
+            - The Agent Output Folder is designated for storing the results and data outputs generated by the agents (like you) of Sirji.
+            - Ensure you do not confuse this folder with the Project Folder; remember, no project source files are stored here.
+            - This folder is different from the project folder and this ensures that operational data is kept separate from project files.
+            
+            Agent Output Index:
+            - The Agent Output Index is an index file for the Agent Output Folder that keeps track of all files written by agents in that folder along with the a brief description of the file contents.
+            - The Agent Output Index will look as follows:
+              {
+                  'agent_id/file_name': {
+                        'description': 'description of the file contents'
+                        'created_by': 'agent_id'
+                  }
+              }""")
+        
+        pseudo_code = textwrap.dedent(f"""
+            Pseudo code which you must follow:
+                1. INVOKE_AGENT REQUIREMENT_GATHERER to QUESTION SIRJI_USER to provide the problem statement and then store it in Agent Output folder.
+                2. INVOKE_AGENT RECIPE_SELECTOR to Get the recipe selected from the available recipes by SIRJI_USER and then store it in Agent Output Folder.
+                3. READ_AGENT_OUTPUT_FILES the selected recipe from the Agent Output Folder using EXECUTOR.
+                4. Follow the below instructions:
+            """)
 
         instructions = textwrap.dedent(f"""
             Instructions:
             - Manage the task workflow by interpreting the "recipe", which outlines a series of prescribed tasks.
             - Proceed sequentially over the prescribed tasks.
-            - For each task, invoke the agent specified in the recipe alogside the task, explaining the task in the BODY of the invocation.
+            - For each task, invoke the agent specified in the recipe alongside the task, explaining the task in the BODY of the invocation.
             """)
 
-        formatted_recipe = self.__format_recipe()
-
         allowed_response_templates_str = textwrap.dedent(f"""
             Allowed Response Templates:""")
         
-        allowed_response_templates_str += '\n' + allowed_response_templates(AgentEnum.ORCHESTRATOR, AgentEnum.SIRJI_USER) + '\n'
-        allowed_response_templates_str += '\n' +  allowed_response_templates(AgentEnum.ORCHESTRATOR, AgentEnum.ANY) + '\n'
-
-        return f"{initial_intro}\n{instructions}\n{formatted_recipe}{allowed_response_templates_str}".strip()
-    def __format_recipe(self):
-        formatted = "Recipe:\n"
-        # Adding prescribed tasks with enumeration
-        formatted += "- Prescribed tasks\n"
-        for index, task in enumerate(self.recipe["prescribed_tasks"], start=1):
-            formatted += f"   {index}. {task['task']}\n"
-            formatted += f"      Agent to invoke: {task['agent']}\n"
-        
-        # Adding tips
-        if "tips" in self.recipe and self.recipe["tips"]:
-            formatted += "- Tips:\n"
-            for tip in self.recipe["tips"]:
-                formatted += f"   - {tip['tip']}\n"
-                formatted += f"      Agent to invoke: {tip['agent']}\n"
-        
-        return formatted
+        allowed_response_templates_str += '\n' + allowed_response_templates(AgentEnum.ORCHESTRATOR, AgentEnum.SIRJI_USER, permissions_dict[(AgentEnum.ORCHESTRATOR, AgentEnum.SIRJI_USER)]) + '\n'
+        allowed_response_templates_str += '\n' +  allowed_response_templates(AgentEnum.ORCHESTRATOR, AgentEnum.ANY, permissions_dict[(AgentEnum.ORCHESTRATOR, AgentEnum.ANY)]) + '\n'
+
+        action_list = permissions_dict[(AgentEnum.ANY, AgentEnum.EXECUTOR)]
+        allowed_response_templates_str += '\n' +  allowed_response_templates(AgentEnum.ANY, AgentEnum.EXECUTOR, action_list) + '\n'
+
+        current_agent_output_index = f"Current contents of Agent Output Index:\n{json.dumps(self.agent_output_folder_index, indent=4)}"
+
+        return f"{initial_intro}\n{response_specifications}\n{understanding_the_folders}\n{pseudo_code}\n{instructions}\n{allowed_response_templates_str}\n{current_agent_output_index}".strip()
diff --git a/messages/setup.py b/messages/setup.py
index 351f14bd..a98ef51f 100644
--- a/messages/setup.py
+++ b/messages/setup.py
@@ -2,7 +2,7 @@
 
 setup(
     name='sirji-messages',
-    version='0.0.18',
+    version='0.0.20',
     author='Sirji',
     description='Sirji messaging protocol implementation to create, validate and parse messages.',
     license='MIT',
diff --git a/messages/sirji_messages/action_enum.py b/messages/sirji_messages/action_enum.py
index 3c2ce0f5..575645e8 100644
--- a/messages/sirji_messages/action_enum.py
+++ b/messages/sirji_messages/action_enum.py
@@ -8,6 +8,8 @@ class ActionEnum(Enum):
     EXECUTE_COMMAND = auto()
     APPEND_TO_AGENT_OUTPUT_INDEX = auto()
     READ_AGENT_OUTPUT_INDEX = auto()
+    FETCH_RECIPE = auto()
+    FETCH_RECIPE_INDEX = auto()
     RUN_SERVER = auto()
     CREATE_PROJECT_FILE = auto()
     CREATE_AGENT_OUTPUT_FILE = auto()
@@ -31,3 +33,4 @@ class ActionEnum(Enum):
     EXTRACT_DEPENDENCIES = auto()
     FIND_AND_REPLACE_IN_PROJECT = auto()
     SEARCH_FILE_IN_PROJECT = auto()
+    SEARCH_CODE_IN_PROJECT = auto()
diff --git a/messages/sirji_messages/helper.py b/messages/sirji_messages/helper.py
index caddab3b..2fd1b244 100644
--- a/messages/sirji_messages/helper.py
+++ b/messages/sirji_messages/helper.py
@@ -1,6 +1,6 @@
 from sirji_messages import permissions_dict, AgentEnum, MessageFactory
 
-def allowed_response_templates(from_agent, to_agent):
+def allowed_response_templates(from_agent, to_agent, action_list):
     response_template = ''
 
     if from_agent != AgentEnum.ORCHESTRATOR and from_agent != AgentEnum.CALLER:
@@ -13,8 +13,6 @@ def allowed_response_templates(from_agent, to_agent):
     else:
         response_template += f'Invoke the {to_agent.name} for the following functions. Please respond with the following, including the starting and ending \'***\', with no commentary above or below.'
 
-    action_list = permissions_dict[(from_agent, to_agent)]
-
     for index, action in enumerate(action_list):
         message_class = MessageFactory[action.name]
         response_template += f'\n\nFunction {index + 1}. {message_class().description()}\n'
diff --git a/messages/sirji_messages/messages/actions/fetch_recipe.py b/messages/sirji_messages/messages/actions/fetch_recipe.py
new file mode 100644
index 00000000..2a7a4c1a
--- /dev/null
+++ b/messages/sirji_messages/messages/actions/fetch_recipe.py
@@ -0,0 +1,26 @@
+import textwrap
+
+from sirji_messages import AgentEnum, ActionEnum
+from .base import BaseMessages
+
+
+class FetchRecipeMessage(BaseMessages):
+
+    def __init__(self):
+        self.action = ActionEnum.FETCH_RECIPE.name
+        self.to_agent = AgentEnum.EXECUTOR.name
+
+        super().__init__()
+
+    def sample(self):
+        return self.generate({
+            "from_agent_id": "{{Your Agent ID}}",
+            "summary": "{{Display a concise summary to the user, describing the action using the present continuous tense.}}",
+            "body": textwrap.dedent("""
+            File path: {{File path}}""")})
+    
+    def description(self):
+        return "Fetch Recipe"
+
+    def instructions(self):
+        return [ "The body must be in the following format: File path: file_path"]
\ No newline at end of file
diff --git a/messages/sirji_messages/messages/actions/fetch_recipe_index.py b/messages/sirji_messages/messages/actions/fetch_recipe_index.py
new file mode 100644
index 00000000..7d48e303
--- /dev/null
+++ b/messages/sirji_messages/messages/actions/fetch_recipe_index.py
@@ -0,0 +1,25 @@
+import textwrap
+
+from sirji_messages import AgentEnum, ActionEnum
+from .base import BaseMessages
+
+
+class FetchRecipeIndexMessage(BaseMessages):
+    def __init__(self):
+        self.action = ActionEnum.FETCH_RECIPE_INDEX.name
+        self.to_agent = AgentEnum.EXECUTOR.name
+
+        super().__init__()
+
+    def sample(self):
+        return self.generate({
+            "from_agent_id": "{{Your Agent ID}}",
+            "summary": "{{Display a concise summary to the user, describing the action using the present continuous tense.}}",
+            "body": textwrap.dedent("""
+            EMPTY""")})
+    
+    def description(self):
+        return "Fetch Recipe Index"
+
+    def instructions(self):
+        return []
\ No newline at end of file
diff --git a/messages/sirji_messages/messages/actions/insert_text.py b/messages/sirji_messages/messages/actions/insert_text.py
index 2b7988ce..417a62d2 100644
--- a/messages/sirji_messages/messages/actions/insert_text.py
+++ b/messages/sirji_messages/messages/actions/insert_text.py
@@ -17,13 +17,17 @@ def sample(self):
             "from_agent_id": "{{Your Agent ID}}",
             "summary": "{{Display a concise summary to the user, describing the action using the present continuous tense.}}",
             "body": textwrap.dedent("""
-            FILE_PATH: {{File path}}
+            FILE_PATH: 
+            {{File path}}
             ---
-            FIND: {{Text to find}}
+            FIND: 
+            {{Code to Find}}
             ---
-            INSERT_POSITION: {{'above' or 'below'}}
+            CODE_TO_INSERT: 
+            {{Code to insert}}
             ---
-            TEXT_TO_INSERT: {{Text to insert}}
+            INSERT_POSITION_RELATIVE_TO_FIND:
+            {{above or below}}
             ---
             """)})
     
@@ -31,4 +35,11 @@ def description(self):
         return "Insert text into a file at a specific line number"
     
     def instructions(self):
-        return []
+        return [
+            "The FILE_PATH must be a valid path to the file where you want to insert the code. Ensure that the file path is correct and that the file exists. If the file does not exist, the action will fail.",
+            "The FIND must be a valid, uniquely identifiable code in the file. Ensure that you provide the FIND considering that new code will be inserted above or below this code. After insertion, it should not disturb the scope of the existing code in the file or create any syntax errors."
+            "The CODE_TO_INSERT must be a valid code that you want to insert into the file. Ensure that the code is correctly formatted and does not create any syntax errors in the file."
+            "The INSERT_POSITION_RELATIVE_TO_FIND must be either above or below. If you want to insert the code above the FIND, provide above. If you want to insert the code below the FIND, provide below. We will use this as follows: if above, we will replace the FIND with (CODE_TO_INSERT)(FIND); if below, we will replace the FIND with (FIND)(CODE_TO_INSERT). Please make sure that the code is correctly formatted and does not create any syntax errors in the file."
+            "For all the keys present in the BODY, make sure you don't enclose them in any special characters. Just provide the values."
+            "Make sure the CODE_TO_INSERT is correctly formatted and has the proper indentation in place. If the indentation is not correct, it may create syntax errors in the file."
+        ]
diff --git a/messages/sirji_messages/messages/actions/invoke_agent.py b/messages/sirji_messages/messages/actions/invoke_agent.py
index 42fc1417..a99e93e9 100644
--- a/messages/sirji_messages/messages/actions/invoke_agent.py
+++ b/messages/sirji_messages/messages/actions/invoke_agent.py
@@ -23,4 +23,6 @@ def description(self):
         return "Invoke an agent in a fresh session"
     
     def instructions(self):
-        return []
+        return [
+            "For first time invoking an agent, always use this action.",
+            ]
diff --git a/messages/sirji_messages/messages/actions/invoke_agent_existing_session.py b/messages/sirji_messages/messages/actions/invoke_agent_existing_session.py
index 42532428..df1a9ad4 100644
--- a/messages/sirji_messages/messages/actions/invoke_agent_existing_session.py
+++ b/messages/sirji_messages/messages/actions/invoke_agent_existing_session.py
@@ -23,4 +23,6 @@ def description(self):
         return "Invoke an agent continuing on the existing session"
     
     def instructions(self):
-        return []
+        return [
+            "Never use this action while invoking an agent for the first time."
+        ]
diff --git a/messages/sirji_messages/messages/actions/read_agent_output_files.py b/messages/sirji_messages/messages/actions/read_agent_output_files.py
index c8419603..78039f3a 100644
--- a/messages/sirji_messages/messages/actions/read_agent_output_files.py
+++ b/messages/sirji_messages/messages/actions/read_agent_output_files.py
@@ -23,4 +23,5 @@ def description(self):
         return "Read Multiple Files From Agent Output Folder"
     
     def instructions(self):
-        return [ "The file paths must be in the following format: '{{Your Agent ID}}/{{file name}}'."]
+        return [ "The body must be in the following format: File paths: [\"{{Your_agent_id}}/{{file_name}}\"]"]
+    
diff --git a/messages/sirji_messages/messages/actions/search_code_in_project.py b/messages/sirji_messages/messages/actions/search_code_in_project.py
new file mode 100644
index 00000000..f7be5321
--- /dev/null
+++ b/messages/sirji_messages/messages/actions/search_code_in_project.py
@@ -0,0 +1,26 @@
+import textwrap
+
+from sirji_messages import AgentEnum, ActionEnum
+from .base import BaseMessages
+
+
+class SearchCodeInProject(BaseMessages):
+    def __init__(self):
+        self.action = ActionEnum.SEARCH_CODE_IN_PROJECT.name
+        self.to_agent = AgentEnum.EXECUTOR.name
+
+        super().__init__()
+
+    def sample(self):
+        return self.generate({
+            "from_agent_id": "{{Your Agent ID}}",
+            "summary": "{{Display a concise summary to the user, describing the action using the present continuous tense.}}",
+            "body": textwrap.dedent("""
+            Search Term: {{Search term}}
+            ---""")})
+
+    def description(self):
+        return "Search for code in a directory and all its subdirectories"
+
+    def instructions(self):
+        return []
diff --git a/messages/sirji_messages/messages/factory.py b/messages/sirji_messages/messages/factory.py
index d40db320..d898e9f5 100644
--- a/messages/sirji_messages/messages/factory.py
+++ b/messages/sirji_messages/messages/factory.py
@@ -20,6 +20,9 @@
 from .actions.find_and_replace import FindAndReplace
 from .actions.insert_text import InsertText
 from .actions.extract_dependencies import ExtractDependenciesMessage
+from .actions.search_code_in_project import SearchCodeInProject
+from .actions.fetch_recipe import FetchRecipeMessage
+from .actions.fetch_recipe_index import FetchRecipeIndexMessage
 
 
 class MetaMessageFactory(type):
@@ -56,6 +59,9 @@ class MessageFactory(metaclass=MetaMessageFactory):
         ActionEnum.READ_AGENT_OUTPUT_INDEX: ReadAgentOutputIndexMessage,
         ActionEnum.FIND_AND_REPLACE: FindAndReplace,
         ActionEnum.INSERT_TEXT: InsertText,
-        ActionEnum.EXTRACT_DEPENDENCIES: ExtractDependenciesMessage
+        ActionEnum.EXTRACT_DEPENDENCIES: ExtractDependenciesMessage,
+        ActionEnum.SEARCH_CODE_IN_PROJECT: SearchCodeInProject,
+        ActionEnum.FETCH_RECIPE: FetchRecipeMessage,
+        ActionEnum.FETCH_RECIPE_INDEX: FetchRecipeIndexMessage
     }
 
diff --git a/sirji/vscode-extension/src/defaults/agents/CODE_PLANNER.yml b/sirji/vscode-extension/src/defaults/agents/CODE_PLANNER.yml
deleted file mode 100644
index d658bce4..00000000
--- a/sirji/vscode-extension/src/defaults/agents/CODE_PLANNER.yml
+++ /dev/null
@@ -1,50 +0,0 @@
-id: CODE_PLANNER
-name: Code Planner
-llm:
-  provider: openai
-  model: gpt-4o
-
-skills:
-  - skill: Analyze problem statements, identify relevant files, thoroughly review their contents, identify relevant dependencies, thoroughly review their contents too, and create a detailed implementation guide.
-    pseudo_code: |
-        1. Initialize:
-            - Read the problem statement from the AGENT OUTPUT FOLDER.
-            - Access the project folder structure and concise file summaries.
-
-        2. Identify and Note Relevant Files:
-            - Create a list to hold file paths and their relevance scores.
-            - For each file path in the file summaries:
-                - Score each file based on the necessity to review its content in relation to the problem statement. This can involve criteria such as:
-                    a) Direct references to features, modules, or components mentioned in the problem statement.
-                    b) Relevance of the file's functionality to the problem being solved.
-                    c) Frequency of key terms from the problem statement appearing in the file summary.
-                    d) Historical modification patterns that suggest the file has been central to similar issues.
-                - Add the file path and its relevance score to the list.
-            - Sort the list by relevance scores in descending order.
-            - Keep only the top 20 most relevant file paths.
-            - Send these top 20 file paths to the ongoing conversation notes in the AGENT OUTPUT FOLDER (Note: These notes are ongoing and not to be indexed in the AGENT OUTPUT INDEX).
-
-        3. Deep Dive into Identified Files:
-            - Repeat until all necessary changes are fully understood:
-                - For each file listed in the ongoing conversation notes:
-                    - Read the file content thoroughly.
-                    - Identify specific parts of the content that directly relate to solving the problem statement.
-                    - Send these identified parts to the ongoing conversation notes in the AGENT OUTPUT FOLDER (Note: Continually update these notes, and they are not to be indexed).
-                    - Determine if further reading of other files is needed based on references or dependencies found.
-                    - Update the ongoing conversation notes with any additional files that need detailed review.
-
-        4. Create and Finalize Implementation Guide:
-            - Construct and review a detailed, standalone implementation guide:
-                - List all the technical instructions for necessary changes, specifying exact file paths and descriptions of changes.
-                - Provide specifics on coding requirements, such as function signatures, data structures, and algorithms to be used or modified.
-                - Outline the creation of new files, including their paths, the specific logic to be implemented, and detailed function signatures and class definitions.
-                - Explain how these new functionalities will interact with existing components, including dependency and integration points.
-                - Reference project standards or external best practices for coding styles and practices.
-                - Ensure that the guide follows a bottom-up approach in implementation order, starting from the most foundational changes to the higher-level ones.
-                - Review the guide for completeness, clarity, and technical accuracy.
-                - Ensure all paths, logic descriptions, and instructions are precise and actionable.
-            - Store the implementation guide in the AGENT OUTPUT FOLDER.
-            - Register the implementation guide to the AGENT OUTPUT INDEX.
-
-
-
diff --git a/sirji/vscode-extension/src/defaults/agents/CODE_WRITER.yml b/sirji/vscode-extension/src/defaults/agents/CODE_WRITER.yml
deleted file mode 100644
index a7a55b91..00000000
--- a/sirji/vscode-extension/src/defaults/agents/CODE_WRITER.yml
+++ /dev/null
@@ -1,27 +0,0 @@
-id: CODE_WRITER
-
-name: Code writer
-
-llm:
-  provider: openai
-  model: gpt-4o
-
-skills:
-  - skill: "Read implementation guide, extract necessary file changes, and apply these modifications to the project files."
-    pseudo_code: |
-      1. Initialize:
-          - Read the implementation guide from the AGENT OUTPUT FOLDER.
-
-      2. Process Implementation Guide:
-          - Extract a list of project files and the specific changes detailed in the implementation guide.
-          - Write the extracted list to the ongoing conversation notes in the AGENT OUTPUT FOLDER (Note: These notes are ongoing and not to be indexed in the AGENT OUTPUT INDEX).
-
-      3. Implement Changes:
-          - For each entry in the extracted list of project files from the ongoing conversation notes:
-              - If changes are needed in an existing file:
-                  - Read the existing file content.
-                  - Apply the necessary changes using FIND_AND_REPLACE and INSERT_TEXT actions.
-              - Use CREATE_PROJECT_FILE action when a new file is indicated.
-
-      4. Finalize:
-          - Respond back to the agent who invoked you, detailing your actions in the BODY.
diff --git a/sirji/vscode-extension/src/defaults/agents/FILE_SHORTLISTER.yml b/sirji/vscode-extension/src/defaults/agents/FILE_SHORTLISTER.yml
deleted file mode 100644
index 3467b61a..00000000
--- a/sirji/vscode-extension/src/defaults/agents/FILE_SHORTLISTER.yml
+++ /dev/null
@@ -1,22 +0,0 @@
-id: FILE_SHORTLISTER
-name: File Shortlister
-llm:
-  provider: openai
-  model: gpt-4o
-skills:
-  - skill: "Shortlist Essential Files, identifying primary files based on provided summaries and extracting dependencies, creating a comprehensive set of files that may require modifications or can serve as references to address the problem statement."
-    pseudo_code: |
-      - Read the problem statement from Agent Output Folder to understand the requirements.
-      - Utilize the following definitions and subroutine to confirm the list of file paths:
-        DEFINITIONS:
-        - "Target for Modification" file paths are those that might require modifications to meet the requirements.
-        - "Reference for New Development" file paths are those that might contain well-written source code that will serve as a template or guide for the coding style, patterns, and practices expected in new files.
-        SUBROUTINE:
-          REPEAT
-              i. EXTRACT_DEPENDENCIES by sending the "Target for Modification" and "Reference for New Development" file paths to the EXECUTOR.
-              ii. Sanitize the dependency file paths by adding file extensions, for the files without the extension, referencing the project folder structure. Failure to do so will cause errors in further steps. Use these sanitized file paths henceforth. 
-              iii. QUESTION SIRJI_USER requesting confirmation or feedback on the combined list of "Target for Modification", "Reference for New Development" files, and fetched dependencies of those files, presented without individual category headings.
-              iv. IF SIRJI_USER provides feedback for changes THEN MODIFY the appropriate list of file categories based on feedback, referencing the project folder structure. Continue to the next iteration, as feedback was given in the current iteration.
-          UNTIL SIRJI_USER confirms the list of file paths or does not want to do any further chnages in the list
-      - Store the confirmed list of essential file paths in Agent Output Folder, clearly grouped under the categories: "Target for Modification", "Reference for New Development", and "Dependency".
-      - Respond back to the agent who invoked you, detailing your actions in the BODY.
diff --git a/sirji/vscode-extension/src/defaults/agents/IMPLEMENTATION_GUIDE_CODE_WRITER.yml b/sirji/vscode-extension/src/defaults/agents/IMPLEMENTATION_GUIDE_CODE_WRITER.yml
new file mode 100644
index 00000000..7cf3dc83
--- /dev/null
+++ b/sirji/vscode-extension/src/defaults/agents/IMPLEMENTATION_GUIDE_CODE_WRITER.yml
@@ -0,0 +1,20 @@
+id: IMPLEMENTATION_GUIDE_CODE_WRITER
+
+name: Implementation guide code writer
+
+llm:
+  provider: openai
+  model: gpt-4o
+
+skills:
+  - skill: Read implementation guide, extract necessary file changes, and apply these modifications to the project files.
+    pseudo_code: |
+      1. Read the implementation guide from the Agent Output Folder.
+
+      2. Interpret the steps mentioned in the BODY of the message which invoked you. Fully understand the necessary changes using the implementation guide and make the required modifications:
+          - If changes are needed in an existing file:
+              - READ_PROJECT_FILES the existing file using file path.
+              - Apply the necessary changes using either FIND_AND_REPLACE or INSERT_TEXT actions.
+          - Use CREATE_PROJECT_FILE action when a new file is indicated.
+
+      3. Respond back to the agent who invoked you, detailing your actions in the BODY.
diff --git a/sirji/vscode-extension/src/defaults/agents/NODE_JS_API_CODER.yml b/sirji/vscode-extension/src/defaults/agents/NODE_JS_API_CODER.yml
deleted file mode 100644
index 5d281652..00000000
--- a/sirji/vscode-extension/src/defaults/agents/NODE_JS_API_CODER.yml
+++ /dev/null
@@ -1,18 +0,0 @@
-id: NODE_JS_API_CODER
-
-name: Node JS API Coder
-
-llm:
-  provider: openai
-  model: gpt-4o
-
-sub_agents:
-    - id: CODE_PLANNER
-    - id: CODE_WRITER
-
-skills:
-  - skill: "Developing robust backend REST APIs using Node.js and Express, integrating Sequelize ORM with PostgreSQL databases, and implementing Redis for efficient caching solutions."
-    pseudo_code: |
-      1. INVOKE_AGENT CODE_PLANNER to analyze problem statements, identify relevant files, thoroughly review their contents, identify relevant dependencies, thoroughly review their contents too, and create a detailed implementation guide.
-      2. INVOKE_AGENT CODE_WRITER to read the implementation guide, extract necessary file changes, apply these modifications to the project files.
-      3. Respond back to the agent who invoked you, detailing your actions in the BODY.
\ No newline at end of file
diff --git a/sirji/vscode-extension/src/defaults/agents/NODE_JS_API_TESTER.yml b/sirji/vscode-extension/src/defaults/agents/NODE_JS_API_TESTER.yml
new file mode 100644
index 00000000..a30beb90
--- /dev/null
+++ b/sirji/vscode-extension/src/defaults/agents/NODE_JS_API_TESTER.yml
@@ -0,0 +1,19 @@
+id: NODE_JS_API_TESTER
+
+name: Node.js API tester
+
+llm:
+  provider: openai
+  model: gpt-4o
+
+sub_agents:
+    - id: NODE_JS_API_TEST_PLANNER
+    - id: IMPLEMENTATION_GUIDE_CODE_WRITER
+
+skills:
+  - skill: Coordinate the invocation of agents to create an implementation guide for writing test cases and execute each step of the guide.
+    pseudo_code: |
+      1. INVOKE_AGENT NODE_JS_API_TEST_PLANNER to analyze the problem statement, identify necessary files and APIs, understand their logic, and create a detailed implementation guide for writing test cases for a specified API.
+      2. Read the implementation guide created by NODE_JS_API_TEST_PLANNER from the Agent Output Folder.
+      3. Loop over the steps in the implementation guide and INVOKE_AGENT IMPLEMENTATION_GUIDE_CODE_WRITER, passing a request to perform the current step in the BODY of the invocation during each iteration.
+      4. Respond back to the agent who invoked you, detailing your actions in the BODY.
\ No newline at end of file
diff --git a/sirji/vscode-extension/src/defaults/agents/NODE_JS_API_TEST_PLANNER.yml b/sirji/vscode-extension/src/defaults/agents/NODE_JS_API_TEST_PLANNER.yml
new file mode 100644
index 00000000..f55dd78a
--- /dev/null
+++ b/sirji/vscode-extension/src/defaults/agents/NODE_JS_API_TEST_PLANNER.yml
@@ -0,0 +1,119 @@
+id: NODE_JS_API_TEST_PLANNER
+name: Node.js API test planner
+llm:
+  provider: openai
+  model: gpt-4o
+
+skills:
+  - skill: Analyze the problem statement, identify necessary files and APIs, understand their logic, and create a detailed implementation guide for writing test cases for a specified API.
+    pseudo_code: |
+        1. Read the problem statement from the Agent Output Folder. Identify the "Target API" for which the test cases are to be written.
+
+        2. If the problem statement does not specify the route of an API with existing test cases for reference, QUESTION SIRJI_USER to provide it. Refer to this API as the "Inspiration API."
+
+        3. Using the api routes for the "Target API" & the "Inspiration API" and the project folder structure, identify the file path to the relevant OpenAPI specs file. Read the OpenAPI specs file using the file path.
+
+        4. Using the project folder structure, locate the DBML file. Read this file using the file path.
+
+        5. Read the `package.json` file.
+
+        6. Using the file path specified as the value of the "main" key in the package.json (referred to as the "Main Index File"), read the file. A brief about the "Main Index File": The project uses a modular routing structure, which divides routing logic into multiple files and folders. The "Main Index File" acts as the primary routing file that includes all other sub-routers. It defines top-level routes and joins sub-routes (like `/consumer` and `/admin`) to the main application.
+
+        7. The folder structure under the routes folder matches the route. In each folder, there is an `index.js` which links to the sub-routes. The last `index.js` file implements the routes. Identify all the file paths under the routes folder that are relevant to the "Target API" and the "Inspiration API". READ_PROJECT_FILES for all these relevant file paths. These are referred to as "Relevant Route File Paths".
+
+        8. From the contents of the "Relevant Route File Paths", understand the path to the service files for both the "Target API" and the "Inspiration API". Read these service files.
+
+        9. Understand the logic implemented in both the above read service file. Store your understanding as conversation notes (in a file named something like relevant service files understanding) in the AGENT OUTPUT FOLDER (Note: These conversation notes must not be indexed in the AGENT OUTPUT INDEX).
+
+        10. From the contents of the "Relevant Route File Paths", identify the api name constant getters for both the "Target API" and the "Inspiration API". Store your understanding as conversation notes (in a file named something like api names understanding) in the AGENT OUTPUT FOLDER (Note: These conversation notes must not be indexed in the AGENT OUTPUT INDEX).
+
+        11. Using the api routes for the "Target API" & the "Inspiration API" and the project folder structure, identify the relevant signature.js files. Read these signature files using their file paths and understand what are the mandatory and optional parameters of the "Target API" and the "Inspiration API". Also understand what all validation methods are called for each of these parameters. Store your understanding as conversation notes (in a file named something like parameter and validation understanding) in the AGENT OUTPUT FOLDER (Note: These conversation notes must not be indexed in the AGENT OUTPUT INDEX).
+
+        12. Using the api routes for the "Target API" & the "Inspiration API" and the project folder structure, identify the relevant response.js files. Read these response files using their file paths and understand what all entities are present for the "Target API" and the "Inspiration API".
+
+        13. Understand the following from the contents of the "Target API" & the "Inspiration API" response files and store your understanding as conversation notes (in a file named something like target api response file understanding) in the AGENT OUTPUT FOLDER (Note: These conversation notes must not be indexed in the AGENT OUTPUT INDEX):
+        - The response file is structured into a mapping of entity types to their respective response key entities.
+
+        14. Using the project folder structure, read the contents of the `entityType.js` file. Store your understanding as conversation notes (in a file named something like entity type understanding) in the AGENT OUTPUT FOLDER (Note: These conversation notes must not be indexed in the AGENT OUTPUT INDEX).
+
+        15. Using the project folder structure, read the `responseKeyEntity.js` file to understand the response keys in the "Target API" & "Inspiration API" response. Store your understanding as conversation notes (in a file named something like response key entity understanding) in the AGENT OUTPUT FOLDER (Note: These conversation notes must not be indexed in the AGENT OUTPUT INDEX).
+          - The response key entity file is a mapping of response key entity to it's snake case.
+          - The API responses will have the response key entity as keys.
+
+        16. Using the project folder structure, read the `Common.js` file to understand the required entity formatting file paths and store your understanding as conversation notes (in a file named something like common formatter composer file understanding) in the AGENT OUTPUT FOLDER (Note: These conversation notes must not be indexed in the AGENT OUTPUT INDEX).
+          - The `Common.js` file is a mapping of entity type to the class performing entity formatting.
+          - Understand what all entity types are present in the `Common.js` file respective to "Target API" & "Inspiration API".
+          - Store the entity formatting class file paths for the "Target API" and the "Inspiration API".
+
+        17. Using the project folder structure, read required entity formatting files identified in the previous step. Store your understanding as conversation notes (in a file named something like entity formatting file understanding) in the AGENT OUTPUT FOLDER (Note: These conversation notes must not be indexed in the AGENT OUTPUT INDEX).
+          - The entity formatting class is responsible for adding/removing fields from the entity object.
+          - The entity formatting class is used to format the response object before sending it back to the client.
+          - The entity formatting class is used to convert the fields from camel case to snake case.
+
+        18. Read the common validator file. This file defines the methods whose names are used in the signature file to specify what all validations need to be done for each parameter.
+
+        19. Using the project folder structure, identify the corresponding test file from test/functional folder, corresponding to the "Inspiration API". Read this file using the file path. Let's call this test file as Inspiration API test file.
+
+        20. Understand the following from the Inspiration API test file contents and store your understanding as conversation notes (in a file named something like inspiration api test file understanding) in the AGENT OUTPUT FOLDER (Note: These conversation notes must not be indexed in the AGENT OUTPUT INDEX):
+          - Understand what all files from the test folder are required in the file.
+          - Understand what steps are performed beforeEach and afterEach of each test.
+          - Understand how external API calls are stubbed using Sinon package.
+          - Understand how the jwt token / authentication is managed and an API request is made.
+        
+        21. From the list of files from the test folder that are required in the Inspiration API test file, identify the scenario data file path. Read the scenarios file using the file path, identified using the require path and the project folder structure.
+
+        22. Understand the following from the Inspiration API scenario data file contents and store your understanding as conversation notes (in a file named something like inspiration api scenario data file understanding) in the AGENT OUTPUT FOLDER (Note: These conversation notes must not be indexed in the AGENT OUTPUT INDEX):
+          - Each scenario object must have the description, input and output keys.
+          - Array of scenario objects forms a value to a key used in one test. This key is called the scenario group.
+          - A scenario object can optionally have information of stubbing, if external APIs are involved and there is a need to stub their responses.
+          - Value of the output key in a scenario object, must match with the respective entity formatting class response. Note that the value of the output key does not need to be inline with the DB objects.
+          - Value of the input key in a scenarios object must match with the respective values from the responseKeyEntity.
+          - Understand how the scenarios in a scenario group are iterated and the output is asserted for input in each iteration.
+          - Note the folder structure of this scenario data file, which aligns with the route file location with the final filename coming from the final route part.
+          - Understand how placeholders are avoided in the scenarios file and the actual values are used for both input and output.
+
+        23. From the list of files from the test folder that are required in the Inspiration API test file, identify the fixtures file. Read the fixtures file using the file path, identified using the require path and the project folder structure.
+
+        24. Understand the following from the Inspiration API fixtures file contents and store your understanding as conversation notes (in a file named something like inspiration api fixtures file understanding) in the AGENT OUTPUT FOLDER (Note: These conversation notes must not be indexed in the AGENT OUTPUT INDEX):
+          - All the db rows needed for the functioning of the API are needed to be listed in the fixtures file.
+          - Before each test case, the data from the fixtures is inserted into a clean slate database, having the table schema created using db migrations.
+          - The fixture file is structured into arrays of rows from different tables grouped by their models.
+          - Make sure to understand all the necessary fixtures required for the "Target API".
+          - Make sure to understand the casing of the keys in the fixtures file.
+          - Each fixture file contains data for only one model. For multiple models, multiple fixture files should be created.
+          - modelNameConstants.js file is used to get the model name constants for the models used in the fixtures file. Make sure to add/update getters for the models used in the fixtures file if not already present.
+
+        25. From the contents of the target API service file, list down all the files used in the implementation. Read the contents of these project files, if not already read.
+
+        26. Identify the scenarios which are needed for the test cases for target API following the below listed rules and store your understanding as conversation notes (in a file named something like target api scenario data file understanding) in the AGENT OUTPUT FOLDER (Note: These conversation notes must not be indexed in the AGENT OUTPUT INDEX):
+          - Each scenario object must have the description, input and output keys.
+          - Array of scenario objects forms a value to a key used in one test. This key is called the scenario group.
+          - A scenario object can optionally have information of stubbing, if external APIs are involved and there is a need to stub their responses.
+          - Value of the output key in a scenario object, must match with the respective entity formatting class response. Note that the value of the output key does not need to be inline with the DB objects.
+          - Value of the input key in a scenarios object must match with the respective values from the responseKeyEntity.
+          - Ensure to have multiple scenarios in a single scenario group covering different combinations of inputs and and thus different resulting outputs.
+          - Ensure to consider error scenarios (success = false) taking hints from the rejections made in the service file.
+          - Ensure to consider param validation error scenarios too (success = false) by passing parameters which will fail the validations written in the signature file.
+          - Ensure to use stubbing for external API calls.
+          - Ensure to have concrete values in the input and output, either using the example values from the openAPI specs or create appropriate dummy values.
+
+        27. Create and Finalize Implementation Guide for writing tests for the target API:
+            - Construct and review a detailed, standalone implementation guide by following these rules:
+                - The implementation guide must be in markdown format.
+                - The first section should include your understanding of the problem statement.
+                - Next section of the implementation guide should be for listing down the steps, following these rules:
+                    - Each step must be standalone, so that different developers can work on different steps in parallel.
+                    - List all the technical instructions for necessary changes, specifying exact file paths and descriptions of changes.
+                    - Each step must specify a file path.
+                    - Provide specifics on coding requirements, such as function signatures, data structures, and algorithms to be used or modified.
+                    - Outline the creation of new files, including their paths, the specific logic to be implemented, and detailed function signatures and class definitions.
+                    - Explain how these new functionalities will interact with existing components, including dependency and integration points.
+                    - Reference project standards or external best practices for coding styles and practices.
+                    - Ensure that the guide follows a bottom-up approach in order of the steps, starting from the most foundational changes to the higher-level ones.
+                    - Review the guide for completeness, clarity, and technical accuracy.
+                    - Ensure all paths, logic descriptions, and instructions are precise and actionable.
+                    - Ensure to list only the steps which are needed to be done. Do not list steps which are already in place in the code.
+                    - Make sure that the guide clearly defines any new methods or classes that got introduced and used in the updated code.
+            - Store the implementation guide in the AGENT OUTPUT FOLDER.
+            - QUESTION SIRJI_USER to have a look at the implementation guide, make modifications, and let you know when to proceed.
+            - Register the implementation guide to the AGENT OUTPUT INDEX.
diff --git a/sirji/vscode-extension/src/defaults/agents/NODE_JS_CREATE_API_CODER.yml b/sirji/vscode-extension/src/defaults/agents/NODE_JS_CREATE_API_CODER.yml
new file mode 100644
index 00000000..f3f1bd77
--- /dev/null
+++ b/sirji/vscode-extension/src/defaults/agents/NODE_JS_CREATE_API_CODER.yml
@@ -0,0 +1,19 @@
+id: NODE_JS_CREATE_API_CODER
+
+name: Node.js create API coder
+
+llm:
+  provider: openai
+  model: gpt-4o
+
+sub_agents:
+    - id: NODE_JS_CREATE_API_PLANNER
+    - id: IMPLEMENTATION_GUIDE_CODE_WRITER
+
+skills:
+  - skill: Coordinate the invocation of agents to create an implementation guide for creating new Node.js API and execute each step of the guide.
+    pseudo_code: |
+      1. INVOKE_AGENT NODE_JS_CREATE_API_PLANNER to manage the development process for a new API by handling all related project files, obtaining user inputs for unspecified paths, and creating a comprehensive implementation guide.
+      2. Read the implementation guide created by NODE_JS_CREATE_API_PLANNER from the Agent Output Folder.
+      3. Loop over the steps in the implementation guide and INVOKE_AGENT IMPLEMENTATION_GUIDE_CODE_WRITER, passing a request to perform the current step in the BODY of the invocation during each iteration.
+      4. Respond back to the agent who invoked you, detailing your actions in the BODY.
\ No newline at end of file
diff --git a/sirji/vscode-extension/src/defaults/agents/NODE_JS_CREATE_API_PLANNER.yml b/sirji/vscode-extension/src/defaults/agents/NODE_JS_CREATE_API_PLANNER.yml
new file mode 100644
index 00000000..b4c4ce27
--- /dev/null
+++ b/sirji/vscode-extension/src/defaults/agents/NODE_JS_CREATE_API_PLANNER.yml
@@ -0,0 +1,75 @@
+id: NODE_JS_CREATE_API_PLANNER
+name: Node.js create API planner
+llm:
+  provider: openai
+  model: gpt-4o
+
+skills:
+  - skill: Manage the development process for a new API by handling all related project files, obtaining user inputs for unspecified paths, and creating a comprehensive implementation guide.
+    pseudo_code: |
+        1. Read the problem statement from the Agent Output Folder.
+
+        2. Using the project folder structure, determine the file path to the DBML file. Read the DBML file using the file path.
+
+        3. Using the project folder structure, determine the file path to the OpenAPI specs file. Read the OpenAPI specs file using the file path.
+
+        4. Using the project folder structure, determine the file path to the sequence diagram file for the new API. Read the sequence diagram file using the file path.
+        
+        5. Using the project folder structure, determine the file path to the apiName.js file. This file is used to manage API name constants, centralizing their definition to facilitate easier maintenance and reduce error potential. Each API must have a name constant defined in this file. Read the apiName.js file using the file path.
+
+        6. Using the project folder structure, identify the paths for the API params validator and the common validator. Read both files using the respective file paths.
+
+        7. Using the project folder structure, locate the relevant signature.js file. There may be multiple files named signature.js; select the relevant one based on the new API route. The signature file contains configurations of parameters categorized into mandatory and optional parameters. It also specifies the validations to be applied to the parameters, providing a map of validation method names to error details. Read the relevant signature file using the file path.
+
+        8. To understand more about how signature validation, service class calling, and formatter class calling are performed, read all files matching the pattern `routes/helper/*`, using paths obtained from the project folder structure.
+
+        9. Understand the contents of the sequence diagram along the following lines and store your understanding as conversation notes (in a file named something like sequence diagram understanding) in the AGENT OUTPUT FOLDER (Note: These conversation notes must not be indexed in the AGENT OUTPUT INDEX):
+            - Internal parameters are those set by middleware, such as authentication. These parameters are listed in the sequence diagram.
+            - External parameters are those sent by the API caller. These are listed in both the sequence diagram and the OpenAPI specifications.
+            - Construct the part that will go inside the signature.js file, using 'kind' as internal for internal parameters.
+            - Both internal and external parameters are available as parameters to the service class constructor.
+            - Determine which models are relevant to the new API requirement and what DB queries will be needed for those models.
+
+        10. Using the project folder structure, locate the file paths of the relevant models identified from the sequence diagram. Read the model files using the file paths. Models are implemented using Sequelize ORM. Store your understanding as conversation notes (in a file named something like models understanding) in the AGENT OUTPUT FOLDER (Note: These conversation notes must not be indexed in the AGENT OUTPUT INDEX).
+
+        11. Using the project folder structure, identify the top three most relevant service file paths related to the new API requirement. Read these service files and understand the conventions used in the service files, the return value from the `perform` method, etc. Store your understanding as conversation notes (in a file named something like relevant service file reference understanding) in the AGENT OUTPUT FOLDER (Note: These conversation notes must not be indexed in the AGENT OUTPUT INDEX).
+
+        12. Using the project folder structure, identify the top three most relevant formatter file paths related to the new API requirement. Read these formatter files and understand the conventions used in the formatter files, how the service response is fomatted to a response which is returned to the API called, etc. Formatters are used in route files to convert the service response to a formatted response. Store your understanding as conversation notes (in a file named something like relevant formatter file reference understanding) in the AGENT OUTPUT FOLDER (Note: These conversation notes must not be indexed in the AGENT OUTPUT INDEX).
+
+        13. Using the project folder structure, identify the path to messageStringsHelper.js, en_us.json and validateJWTClaims.js. Read these files and understand how a message is localized by first adding a key in en_us.json and then using this key path (keys joined by '.') in argument to messageStringsHelper.getMessageString to get the localized message. Never directly use a message copy anywhere. Use it via this localization process. Store your understanding as conversation notes (in a file named something like localization understanding) in the AGENT OUTPUT FOLDER (Note: These conversation notes must not be indexed in the AGENT OUTPUT INDEX).
+
+        14. Read the `package.json` file.
+
+        15. Using the file path specified as the value of the "main" key in the package.json (referred to as the "Main Index File"), read the file. A brief about the "Main Index File": The project uses a modular routing structure, which divides routing logic into multiple files and folders. The "Main Index File" acts as the primary routing file that includes all other sub-routers. It defines top-level routes and joins sub-routes (like `/consumer` and `/admin`) to the main application.
+
+        16. The folder structure under the routes folder matches the route. In each folder, there is an `index.js` which links to the sub-routes. The last `index.js` file implements the routes. Identify all the file paths under the routes folder that are relevant to the new API to be developed. READ_PROJECT_FILES for all these relevant file paths. These are referred to as "Relevant Route File Paths".
+
+        17. For writing the route for the new API, understand the folders and files you will need to create. Store your understanding as conversation notes (in a file named something like folders and files to create understanding) in the AGENT OUTPUT FOLDER (Note: These conversation notes must not be indexed in the AGENT OUTPUT INDEX).
+
+        18. Using your understanding of the sequence diagram contents and the folder structure, identify relevant file paths which you have not yet read (referred to as "other relevant files"). Document why you feel these files are relevant in conversation notes (in a file named something like other relevant files understanding) in the AGENT OUTPUT FOLDER (Note: These conversation notes must not be indexed in the AGENT OUTPUT INDEX).
+
+        19. Read files out of the "other relevant files" which you have not yet read.
+
+        20. Create and Finalize Implementation Guide:
+            - Construct and review a detailed, standalone implementation guide by following these rules:
+                - The implementation guide must be in markdown format.
+                - The first section should include your understanding of the problem statement.
+                - Next section of the implementation guide should be for listing down the steps, following these rules:
+                    - Each step must be standalone, so that different developers can work on different steps in parallel.
+                    - List all the technical instructions for necessary changes, specifying exact file paths and descriptions of changes.
+                    - Provide specifics on coding requirements, such as function signatures, data structures, and algorithms to be used or modified.
+                    - Outline the creation of new files, including their paths, the specific logic to be implemented, and detailed function signatures and class definitions.
+                    - Explain how these new functionalities will interact with existing components, including dependency and integration points.
+                    - Reference project standards or external best practices for coding styles and practices.
+                    - Ensure that the guide follows a bottom-up approach in order of the steps, starting from the most foundational changes to the higher-level ones.
+                    - Review the guide for completeness, clarity, and technical accuracy.
+                    - Ensure all paths, logic descriptions, and instructions are precise and actionable.
+                    - Never include steps for tests.
+                    - Ensure to list only the steps which are needed to be done. Do not list steps which are already in place in the code.
+                    - Make sure that the guide clearly defines any new methods or classes that got introduced and used in the updated code.
+            - Store the implementation guide in the AGENT OUTPUT FOLDER.
+            - QUESTION SIRJI_USER to have a look at the implementation guide, make modifications, and let you know when to proceed.
+            - Register the implementation guide to the AGENT OUTPUT INDEX.
+
+
+
diff --git a/sirji/vscode-extension/src/defaults/agents/ORCHESTRATOR.yml b/sirji/vscode-extension/src/defaults/agents/ORCHESTRATOR.yml
index 9de74d9a..0dfb4440 100644
--- a/sirji/vscode-extension/src/defaults/agents/ORCHESTRATOR.yml
+++ b/sirji/vscode-extension/src/defaults/agents/ORCHESTRATOR.yml
@@ -2,4 +2,4 @@ id: ORCHESTRATOR
 name: Orchestrator
 llm:
   provider: openai
-  model: gpt-3.5-turbo
\ No newline at end of file
+  model: gpt-3.5-turbo
diff --git a/sirji/vscode-extension/src/defaults/agents/PRODUCT_MANAGER.yml b/sirji/vscode-extension/src/defaults/agents/PRODUCT_MANAGER.yml
index ad72b933..afa588c0 100644
--- a/sirji/vscode-extension/src/defaults/agents/PRODUCT_MANAGER.yml
+++ b/sirji/vscode-extension/src/defaults/agents/PRODUCT_MANAGER.yml
@@ -3,16 +3,16 @@ name: Product Manager Agent
 llm:
   provider: openai
   model: gpt-3.5-turbo
-definitions:
-  Proposal: "The QUESTION asked to SIRJI_USER showing the initial or revised Epics and User Stories. Typical Question Asked: \"Here are the detailed epics and user stories based on your problem statement:\n\n <<detailed epics and user stories>> \n\n<<confirmation question for the SIRJI_USER>>\""
-  Finalization: "Finalization involves discussion with SIRJI_USER by sending 'Proposal', getting feedback, adjusting according to the feedback and again sending the revised 'Proposal'. Keep on doing it till SIRJI_USER agrees."
-  Finalized epics and user stories: "The 'Proposal' on which the SIRJI_USER agrees."
 rules:
-  - "Elaboration must include detailed screen elements and interactions, without leaving anything abstract."
-  - "UI created for any user story must me modern and neat."
+  - 'Elaboration must include detailed screen elements and interactions, without leaving anything abstract.'
+  - 'UI created for any user story must me modern and neat.'
 skills:
-  - skill: "Finalize Epics and User Story"
-    sub_tasks:
-      - "Read problem statement from Agent Output Folder."
-      - "Elaborate the problem statement into epics & then send the 'Proposal' to SIRJI_USER to get 'Finalization'."
-      - "Write the finalized epics and user stories by saving it to Agent Output Folder."
+  - skill: Read the problem statement, generate and confirm epics and user stories, store them, and register them.
+    pseudo_code: |
+      1. READ_AGENT_OUTPUT_FILES the problem statement from Agent Output Folder.
+      2. Generate epics and user stories for problem statement and get it finalized from SIRJI_USER by asking QUESTION as below:
+        REPEAT:
+        - Ask QUESTION: "Here are the detailed epics and user stories based on your problem statement:\n\n <<detailed epics and user stories>> \n\n<<confirmation question for the SIRJI_USER>>"
+        UNTIL SIRJI_USER confirms the epics and user stories.
+      3. Store the finalized epics and user stories in AGENT OUTPUT FOLDER.
+      4. Register the finalized epics and user stories to the AGENT OUTPUT INDEX.
diff --git a/sirji/vscode-extension/src/defaults/agents/RECIPE_SELECTOR.yml b/sirji/vscode-extension/src/defaults/agents/RECIPE_SELECTOR.yml
new file mode 100644
index 00000000..2cbaa8ff
--- /dev/null
+++ b/sirji/vscode-extension/src/defaults/agents/RECIPE_SELECTOR.yml
@@ -0,0 +1,15 @@
+id: RECIPE_SELECTOR
+name: Recipe Selector Agent
+llm:
+  provider: openai
+  model: gpt-4o
+accessible_actions: ["FETCH_RECIPE_INDEX", "FETCH_RECIPE"]
+skills:
+  - skill: Manage recipe selection and storage by fetching a recipe index, questioning the user to select a recipe, retrieving the chosen recipe, saving it to a designated folder, and updating the index.
+    pseudo_code: |
+      1. FETCH_RECIPE_INDEX using EXECUTOR
+      2. QUESTION SIRJI_USER by showing the recipe index, and ask them to select one recipe from the available recipes in the index.
+      3. FETCH_RECIPE using EXECUTOR by providing the file path of selected recipe.
+      4. Store the selected recipe in AGENT OUTPUT FOLDER.
+      5. Register the selected recipe to the AGENT OUTPUT INDEX.
+      6. Respond back to the agent who invoked you, detailing your actions in the BODY.
\ No newline at end of file
diff --git a/sirji/vscode-extension/src/defaults/agents/REQUIREMENT_GATHERER.yml b/sirji/vscode-extension/src/defaults/agents/REQUIREMENT_GATHERER.yml
new file mode 100644
index 00000000..5dcc767f
--- /dev/null
+++ b/sirji/vscode-extension/src/defaults/agents/REQUIREMENT_GATHERER.yml
@@ -0,0 +1,12 @@
+id: REQUIREMENT_GATHERER
+name: Requirement Gatherer Agent
+llm:
+  provider: openai
+  model: gpt-4o
+skills:
+  - skill: Gather, store, and register the problem statement provided by the user.
+    pseudo_code: |
+      1. QUESTION SIRJI_USER to provide the problem statement they want you to work on.
+      2. Store the problem statement in AGENT OUTPUT FOLDER.
+      3. Register the problem statement to the AGENT OUTPUT INDEX.
+      4. Respond back to the agent who invoked you, detailing your actions in the BODY.
\ No newline at end of file
diff --git a/sirji/vscode-extension/src/defaults/recipe.json b/sirji/vscode-extension/src/defaults/recipe.json
deleted file mode 100644
index 1b3bbff9..00000000
--- a/sirji/vscode-extension/src/defaults/recipe.json
+++ /dev/null
@@ -1,13 +0,0 @@
-{
-  "llm": {
-    "provider": "openai",
-    "model": "gpt-3.5-turbo"
-  },
-  "prescribed_tasks": [
-    {
-      "task": "Develop robust backend REST APIs using Node.js and Express, integrating Sequelize ORM with PostgreSQL databases, and implementing Redis for efficient caching solutions.",
-      "agent": "NODE_JS_API_CODER"
-    }
-  ],
-  "tips": []
-}
diff --git a/sirji/vscode-extension/src/defaults/recipes/index.json b/sirji/vscode-extension/src/defaults/recipes/index.json
new file mode 100644
index 00000000..545a647a
--- /dev/null
+++ b/sirji/vscode-extension/src/defaults/recipes/index.json
@@ -0,0 +1,14 @@
+{
+  "new_project.json": {
+    "name": "Start New Project",
+    "description": "Recipe for creating a new project from scratch."
+  },
+  "node_js_create_api_and_test_cases.json": {
+    "name": "Write New API and Test Cases",
+    "description": "Recipe for writing a new API and test cases in an existing Node.js Project."
+  },
+  "node_js_existing_api_test_cases.json": {
+    "name": "Write Test Cases for Existing API",
+    "description": "Recipe for writing test cases for an existing API in a Node.js Project."
+  }
+}
\ No newline at end of file
diff --git a/sirji/vscode-extension/src/defaults/recipes/new_project.json b/sirji/vscode-extension/src/defaults/recipes/new_project.json
new file mode 100644
index 00000000..dba869b2
--- /dev/null
+++ b/sirji/vscode-extension/src/defaults/recipes/new_project.json
@@ -0,0 +1,23 @@
+{
+  "prescribed_tasks": [
+    {
+      "task": "Read the problem statement, generate and confirm epics and user stories, store them, and register them.",
+      "agent": "PRODUCT_MANAGER"
+    },
+    {
+      "task": "Write architecture components.",
+      "agent": "ARCHITECT"
+    },
+    {
+      "task": "Implement the epic & user stories using the architecture components.",
+      "agent": "CODER"
+    }
+  ],
+  "tips": [
+    {
+      "deviation": "Architecture components are not in sync with the epics and user stories.",
+      "agent": "PRODUCT_MANAGER",
+      "task": "Make the epics and user stories consistent with the architecture components."
+    }
+  ]
+}
\ No newline at end of file
diff --git a/sirji/vscode-extension/src/py_scripts/agents/invoke_agent.py b/sirji/vscode-extension/src/py_scripts/agents/invoke_agent.py
index eb3af450..bc31f0e6 100644
--- a/sirji/vscode-extension/src/py_scripts/agents/invoke_agent.py
+++ b/sirji/vscode-extension/src/py_scripts/agents/invoke_agent.py
@@ -24,9 +24,9 @@ def read_or_initialize_conversation_file(self, file_path):
                 contents = json.load(file)
                 return contents["conversations"], contents["prompt_tokens"], contents["completion_tokens"]
 
-    def write_conversations_to_file(self, file_path, conversations, prompt_tokens, completion_tokens):
+    def write_conversations_to_file(self, file_path, conversations, prompt_tokens, completion_tokens, llm_model):
         with open(file_path, 'w') as file:
-            json.dump({"conversations": conversations, "prompt_tokens": prompt_tokens, "completion_tokens": completion_tokens}, file, indent=4)
+            json.dump({"conversations": conversations, "prompt_tokens": prompt_tokens, "completion_tokens": completion_tokens,"llm_model": llm_model }, file, indent=4)
 
     def read_file(self, file_path):
         print('---------')
@@ -69,19 +69,23 @@ def main(self, agent_id, agent_session_id, agent_callstack):
         conversation_file_path = os.path.join(sirji_run_path, 'conversations', f'{agent_callstack}.{agent_session_id}.json')
         agent_output_index_path = os.path.join(sirji_run_path, 'agent_output', 'index.json')
         
-        agent_config_path = os.path.join(sirji_installation_dir, 'active_recipe', 'agents', f'{agent_id}.yml')
+        agent_config_path = os.path.join(sirji_installation_dir, 'studio', 'agents', f'{agent_id}.yml')
 
         file_summaries_folder_path = os.path.join(sirji_installation_dir, 'file_summaries')
         file_summaries_file_path = os.path.join(file_summaries_folder_path, 'index.json')
 
         with open(file_summaries_file_path, 'r') as file:
             file_summaries_index = json.load(file)
-            relative_path = file_summaries_index.get(sirji_project_folder, '')
-            file_summaries_path = os.path.join(file_summaries_folder_path, relative_path)
 
-        with open(file_summaries_path, 'r') as file:
-            file_summaries = file.read()
+        relative_path = file_summaries_index.get(sirji_project_folder, '')
+
+        file_summaries = ""
 
+        if relative_path:
+            file_summaries_path = os.path.join(file_summaries_folder_path, relative_path)
+            if os.path.exists(file_summaries_path):
+                with open(file_summaries_path, 'r') as file:
+                    file_summaries = file.read()
 
         conversations, prompt_tokens, completion_tokens = self.read_or_initialize_conversation_file(conversation_file_path)
         message_str = self.process_input_file(input_file_path, conversations)
@@ -104,7 +108,7 @@ def main(self, agent_id, agent_session_id, agent_callstack):
         
         prompt_tokens += prompt_tokens_consumed
         completion_tokens += completion_tokens_consumed
-        self.write_conversations_to_file(conversation_file_path, conversations, prompt_tokens, completion_tokens)
+        self.write_conversations_to_file(conversation_file_path, conversations, prompt_tokens, completion_tokens, llm['model'])
 
 if __name__ == "__main__":
     parser = argparse.ArgumentParser(description="Process interactions.")
diff --git a/sirji/vscode-extension/src/py_scripts/agents/invoke_orchestator.py b/sirji/vscode-extension/src/py_scripts/agents/invoke_orchestator.py
index f583388a..70a4727a 100644
--- a/sirji/vscode-extension/src/py_scripts/agents/invoke_orchestator.py
+++ b/sirji/vscode-extension/src/py_scripts/agents/invoke_orchestator.py
@@ -1,6 +1,7 @@
 import argparse
 import os
 import json
+import yaml
 from sirji_agents import Orchestrator
 
 class AgentRunner:
@@ -21,13 +22,13 @@ def read_or_initialize_conversation_file(self, file_path):
                 contents = json.load(file)
                 return contents["conversations"], contents["prompt_tokens"], contents["completion_tokens"]
 
-    def write_conversations_to_file(self, file_path, conversations, prompt_tokens, completion_tokens):
+    def write_conversations_to_file(self, file_path, conversations, prompt_tokens, completion_tokens, llm_model):
         with open(file_path, 'w') as file:
-            json.dump({"conversations": conversations, "prompt_tokens": prompt_tokens, "completion_tokens": completion_tokens}, file, indent=4)
+            json.dump({"conversations": conversations, "prompt_tokens": prompt_tokens, "completion_tokens": completion_tokens, "llm_model": llm_model}, file, indent=4)
             file.flush()
             os.fsync(file.fileno())  # Ensure all internal buffers associated with the file are written to disk
 
-    def read_input_file(self, input_file_path):
+    def read_file(self, input_file_path):
         with open(input_file_path, 'r') as file:
             contents = file.read()
         return contents
@@ -44,8 +45,8 @@ def process_input_file(self, input_file_path, conversations):
 
         return message_str
 
-    def process_message(self, message_str, conversations, recipe, installed_agents): 
-        agent = Orchestrator(recipe)
+    def process_message(self, message_str, conversations, agent_output_index): 
+        agent = Orchestrator(agent_output_index)
         return agent.message(message_str, conversations)
     
     def read_agents_from_files(self, directory):
@@ -81,29 +82,30 @@ def main(self, agent_id):
         conversation_file_path = os.path.join(sirji_run_path, 'conversations', f'{agent_id}.json')
         agent_output_index_path = os.path.join(sirji_run_path, 'agent_output', 'index.json')
 
-        recipe_file_path = os.path.join(sirji_installation_dir, 'active_recipe', 'recipe.json')
-        installed_agent_folder = os.path.join(sirji_installation_dir, 'active_recipe', 'agents')
-
-        installed_agents = self.read_agents_from_files(installed_agent_folder)
+        installed_agent_folder = os.path.join(sirji_installation_dir, 'studio', 'agents')
+        orchestrator_config_path = os.path.join(installed_agent_folder, f'{agent_id}.yml')
+        config_file_contents = self.read_file(orchestrator_config_path)
+        config = yaml.safe_load(config_file_contents)
 
         conversations, prompt_tokens, completion_tokens = self.read_or_initialize_conversation_file(conversation_file_path)
         message_str = self.process_input_file(input_file_path, conversations)
 
-        recipe_file_contents = self.read_input_file(recipe_file_path)
-        recipe = json.loads(recipe_file_contents)
+        agent_output_index_contents = self.read_file(agent_output_index_path)
+        agent_output_index = json.loads(agent_output_index_contents)
+
+        llm = config['llm']    
 
-        llm = recipe['llm']
-        
         # Set SIRJI_MODEL_PROVIDER env var to llm.provider
         os.environ['SIRJI_MODEL_PROVIDER'] = llm['provider']
         # Set SIRJI_MODEL env var to llm.model
         os.environ['SIRJI_MODEL'] = llm['model']
         
-        response, conversations, prompt_tokens_consumed, completion_tokens_consumed = self.process_message(message_str, conversations, recipe, installed_agents)
+        response, conversations, prompt_tokens_consumed, completion_tokens_consumed = self.process_message(message_str, conversations, agent_output_index)
         
         prompt_tokens += prompt_tokens_consumed
         completion_tokens += completion_tokens_consumed
-        self.write_conversations_to_file(conversation_file_path, conversations, prompt_tokens, completion_tokens)
+
+        self.write_conversations_to_file(conversation_file_path, conversations, prompt_tokens, completion_tokens, llm['model'])
 
 if __name__ == "__main__":
     agent_runner = AgentRunner()
diff --git a/sirji/vscode-extension/src/py_scripts/requirements-windows.txt b/sirji/vscode-extension/src/py_scripts/requirements-windows.txt
index 7fde7fd9..836b0dfe 100644
--- a/sirji/vscode-extension/src/py_scripts/requirements-windows.txt
+++ b/sirji/vscode-extension/src/py_scripts/requirements-windows.txt
@@ -1,4 +1,4 @@
 urllib3==2.2.1
 pyyaml==6.0.1
-sirji-messages==0.0.18
-sirji-agents==0.0.26
+sirji-messages==0.0.20
+sirji-agents==0.0.28
diff --git a/sirji/vscode-extension/src/py_scripts/requirements.txt b/sirji/vscode-extension/src/py_scripts/requirements.txt
index 4094bcfa..f82665a2 100644
--- a/sirji/vscode-extension/src/py_scripts/requirements.txt
+++ b/sirji/vscode-extension/src/py_scripts/requirements.txt
@@ -1,4 +1,4 @@
 urllib3==1.25.11
 pyyaml==6.0.1
-sirji-messages==0.0.18
-sirji-agents==0.0.26
+sirji-messages==0.0.20
+sirji-agents==0.0.28
diff --git a/sirji/vscode-extension/src/utils/constants.ts b/sirji/vscode-extension/src/utils/constants.ts
index bb90428b..ae54022f 100644
--- a/sirji/vscode-extension/src/utils/constants.ts
+++ b/sirji/vscode-extension/src/utils/constants.ts
@@ -11,6 +11,24 @@ export const Constants = {
   SESSIONS: 'sessions'
 };
 
+interface LlmModelPricing {
+  [key: string]: {
+    PROMPT_TOKEN_PRICE_PER_MILLION_TOKENS: number;
+    COMPLETION_TOKEN_PRICE_PER_MILLION_TOKENS: number;
+  };
+}
+
+export const LLM_MODEL_PRICING: LlmModelPricing = {
+  'gpt-3.5-turbo': {
+    PROMPT_TOKEN_PRICE_PER_MILLION_TOKENS: 0.5,
+    COMPLETION_TOKEN_PRICE_PER_MILLION_TOKENS: 1.5
+  },
+  'gpt-4o': {
+    PROMPT_TOKEN_PRICE_PER_MILLION_TOKENS: 5,
+    COMPLETION_TOKEN_PRICE_PER_MILLION_TOKENS: 15
+  }
+};
+
 export const ACTION_ENUM = {
   //user and coder conversations
   PROBLEM_STATEMENT: 'PROBLEM_STATEMENT',
@@ -42,10 +60,13 @@ export const ACTION_ENUM = {
   READ_AGENT_OUTPUT_FILES: 'READ_AGENT_OUTPUT_FILES',
   APPEND_TO_AGENT_OUTPUT_INDEX: 'APPEND_TO_AGENT_OUTPUT_INDEX',
   READ_AGENT_OUTPUT_INDEX: 'READ_AGENT_OUTPUT_INDEX',
+  FETCH_RECIPE: 'FETCH_RECIPE',
+  FETCH_RECIPE_INDEX: 'FETCH_RECIPE_INDEX',
   SEARCH_FILE_IN_PROJECT: 'SEARCH_FILE_IN_PROJECT',
   FIND_AND_REPLACE: 'FIND_AND_REPLACE',
   INSERT_TEXT: 'INSERT_TEXT',
-  EXTRACT_DEPENDENCIES: 'EXTRACT_DEPENDENCIES'
+  EXTRACT_DEPENDENCIES: 'EXTRACT_DEPENDENCIES',
+  SEARCH_CODE_IN_PROJECT: 'SEARCH_CODE_IN_PROJECT'
 };
 
 export const ACTOR_ENUM = {
diff --git a/sirji/vscode-extension/src/utils/executor/append_to_agent_output_index.ts b/sirji/vscode-extension/src/utils/executor/append_to_agent_output_index.ts
index 2d7d9e64..ab5e6979 100644
--- a/sirji/vscode-extension/src/utils/executor/append_to_agent_output_index.ts
+++ b/sirji/vscode-extension/src/utils/executor/append_to_agent_output_index.ts
@@ -44,7 +44,7 @@ export async function appendToAgentOutputsIndex(agentOutputFolderPath: string, m
 
     return 'Updated agent output index file.';
   } catch (e) {
-    const errorMessage = `Failed to create or write to the file. Error: ${e}`;
+    const errorMessage = `Failed to create or write to the file. Make sure you provided the body with correct structure as mentioned in the Allowed response template. Error: ${e}`;
     return errorMessage;
   }
 }
diff --git a/sirji/vscode-extension/src/utils/executor/create_file.ts b/sirji/vscode-extension/src/utils/executor/create_file.ts
index ac665b09..a1648f35 100644
--- a/sirji/vscode-extension/src/utils/executor/create_file.ts
+++ b/sirji/vscode-extension/src/utils/executor/create_file.ts
@@ -32,7 +32,7 @@ export async function createFile(rootPath: string, isProjectRoot: boolean, body:
 
     return 'Done';
   } catch (e) {
-    const errorMessage = `Failed to create or write to the file. Error: ${e}`;
+    const errorMessage = `Failed to create or write to the file. Make sure you provided the body with correct structure as mentioned in the Allowed response template. Error: ${e}`;
     return errorMessage;
   }
 }
diff --git a/sirji/vscode-extension/src/utils/executor/executor.ts b/sirji/vscode-extension/src/utils/executor/executor.ts
index b9b77c18..d37d797b 100644
--- a/sirji/vscode-extension/src/utils/executor/executor.ts
+++ b/sirji/vscode-extension/src/utils/executor/executor.ts
@@ -5,26 +5,31 @@ import { openBrowser } from './open_browser';
 import { readContent } from './read_content';
 import { appendToAgentOutputsIndex } from './append_to_agent_output_index';
 import { readAgentOutputsIndex } from './read_agent_output_index';
+import { fetchRecipe } from './fetch_recipe';
 
 import { ACTION_ENUM } from '../constants';
 import { searchFileInProject } from './search_file_in_project';
 import { findAndReplaceInProjectFile } from './find_and_replace_in_project_file';
 import { insertText } from './insert_text';
 import { readDependencies } from './extract_file_dependencies';
+import { searchCodeInProject } from './search_code_in_project';
+import { fetchRecipeIndex } from './fetch_recipe_index';
 
 export class Executor {
   private parsedMessage: any;
   private projectRootPath: any;
   private agentOutputFolderPath: any;
   private sirjiRunFolderPath: any;
+  private sirjiInstallationFolderPath: any;
 
-  public constructor(parsedMessage: any, projectRootPath: any, agentOutputFolderPath: any, sirjiRunFolderPath: any) {
+  public constructor(parsedMessage: any, projectRootPath: any, agentOutputFolderPath: any, sirjiRunFolderPath: any, sirjiInstallationFolderPath: any) {
     const oThis = this;
 
     oThis.parsedMessage = parsedMessage;
     oThis.projectRootPath = projectRootPath;
     oThis.agentOutputFolderPath = agentOutputFolderPath;
     oThis.sirjiRunFolderPath = sirjiRunFolderPath;
+    oThis.sirjiInstallationFolderPath = sirjiInstallationFolderPath;
   }
 
   public async perform() {
@@ -57,6 +62,10 @@ export class Executor {
         return await appendToAgentOutputsIndex(oThis.agentOutputFolderPath, oThis.parsedMessage.BODY, oThis.parsedMessage.FROM);
       case ACTION_ENUM.READ_AGENT_OUTPUT_INDEX:
         return await readAgentOutputsIndex(oThis.agentOutputFolderPath);
+      case ACTION_ENUM.FETCH_RECIPE:
+        return await fetchRecipe(oThis.sirjiInstallationFolderPath + '/studio/recipes', oThis.parsedMessage.BODY);
+      case ACTION_ENUM.FETCH_RECIPE_INDEX:
+        return await fetchRecipeIndex(oThis.sirjiInstallationFolderPath + '/studio/recipes');
       case ACTION_ENUM.SEARCH_FILE_IN_PROJECT:
         return await searchFileInProject(oThis.parsedMessage.BODY);
       case ACTION_ENUM.FIND_AND_REPLACE:
@@ -65,8 +74,10 @@ export class Executor {
         return await insertText(oThis.parsedMessage.BODY, oThis.projectRootPath);
       case ACTION_ENUM.EXTRACT_DEPENDENCIES:
         return await readDependencies(oThis.parsedMessage.BODY, oThis.projectRootPath);
+      case ACTION_ENUM.SEARCH_CODE_IN_PROJECT:
+        return await searchCodeInProject(oThis.parsedMessage.BODY, oThis.projectRootPath);
       default:
-        throw `Invalid message ACTION: ${action} sent to executor.`;
+        return `Invalid message ACTION: ${action} sent to executor. Your response must conform strictly to one of the allowed Response Templates, as it will be processed programmatically and only these templates are recognized. Your response must be enclosed within '***' at the beginning and end, without any additional text above or below these markers. Not conforming above rules will lead to response processing errors.`;
     }
   }
 
diff --git a/sirji/vscode-extension/src/utils/executor/fetch_recipe.ts b/sirji/vscode-extension/src/utils/executor/fetch_recipe.ts
new file mode 100644
index 00000000..2f03a0ef
--- /dev/null
+++ b/sirji/vscode-extension/src/utils/executor/fetch_recipe.ts
@@ -0,0 +1,24 @@
+import * as vscode from 'vscode';
+import * as path from 'path';
+import * as fs from 'fs';
+
+export async function fetchRecipe(FolderPath: string, body: string): Promise<string> {
+  try {
+    const filePath = body.split('File path:')[1].trim();
+
+    const uri = vscode.Uri.file(path.join(FolderPath, filePath));
+
+    if (!fs.existsSync(uri.fsPath)) {
+      return 'Index not found';
+    }
+
+    const content = await vscode.workspace.fs.readFile(uri);
+
+    const recipeContent = JSON.parse(Buffer.from(content).toString('utf-8'));
+
+    return `${JSON.stringify(recipeContent, null, 2)}`;
+  } catch (e) {
+    const errorMessage = `Failed to read the file. Error: ${e}`;
+    return errorMessage;
+  }
+}
diff --git a/sirji/vscode-extension/src/utils/executor/fetch_recipe_index.ts b/sirji/vscode-extension/src/utils/executor/fetch_recipe_index.ts
new file mode 100644
index 00000000..1b8bde53
--- /dev/null
+++ b/sirji/vscode-extension/src/utils/executor/fetch_recipe_index.ts
@@ -0,0 +1,24 @@
+import * as vscode from 'vscode';
+import * as path from 'path';
+import * as fs from 'fs';
+
+export async function fetchRecipeIndex(FolderPath: string): Promise<string> {
+  try {
+    const fileName = 'index.json';
+
+    const uri = vscode.Uri.file(path.join(FolderPath, fileName));
+
+    if (!fs.existsSync(uri.fsPath)) {
+      return 'Index not found';
+    }
+
+    const content = await vscode.workspace.fs.readFile(uri);
+
+    const index = JSON.parse(Buffer.from(content).toString('utf-8'));
+
+    return `The recipe index has following content: ${JSON.stringify(index, null, 2)}`;
+  } catch (e) {
+    const errorMessage = `Failed to read the file. Error: ${e}`;
+    return errorMessage;
+  }
+}
diff --git a/sirji/vscode-extension/src/utils/executor/insert_text.ts b/sirji/vscode-extension/src/utils/executor/insert_text.ts
index 4a08d325..353e6468 100644
--- a/sirji/vscode-extension/src/utils/executor/insert_text.ts
+++ b/sirji/vscode-extension/src/utils/executor/insert_text.ts
@@ -7,13 +7,32 @@ export const insertText = async (body: string, projectRootPath: string, globPatt
 
   try {
     searchText = body.split('FIND:')[1].split('---')[0].trim();
-    textToInsert = body.split('TEXT_TO_INSERT:')[1].split('---')[0].trim();
+  } catch (error) {
+    console.error('Error parsing body:', error);
+    return `The error in parsing the BODY: ${error}. Either the FIND key is missing from the BODY or it's not in the correct format. The correct format is FIND: {{Text to find without any special characters}} ---. Your response must conform strictly to the INSERT_TEXT Response Template with all the keys present in the BODY.`;
+  }
+
+  try {
+    textToInsert = body.split('CODE_TO_INSERT:')[1].split('---')[0];
+  } catch (error) {
+    console.error('Error parsing body:', error);
+    return `The error in parsing the BODY: ${error}. Either the CODE_TO_INSERT key is missing or not in the correct format. The correct format is CODE_TO_INSERT: {{Code to insert without any special characaters}} ---. Your response must conform strictly to INSERT_TEXT Response Template with all the keys present in the BODY`;
+  }
+
+  try {
     filePath = body.split('FILE_PATH:')[1].split('---')[0].trim();
-    insertPosition = body.split('INSERT_POSITION:')[1].split('---')[0].trim();
   } catch (error) {
     console.error('Error parsing body:', error);
-    return 'Error in processing your last response. Your response must conform strictly to one of the allowed Response Templates, as it will be processed programmatically and only these templates are recognized. Your response for the INSERT_TEXT action must conform this response template: FILE_PATH: {{File path}} ---FIND: {{Text to find}} ---INSERT_POSITION: {{above or below}}---TEXT_TO_INSERT: {{Text to insert}}--- ';
+    return `The error in parsing the BODY: ${error}. Either the FILE_PATH key is missing or not in the correct format. The correct format is FILE_PATH: {{File path without any special characaters}} ---. Your response must conform strictly to INSERT_TEXT Response Template with all the keys present in the BODY`;
+  }
+
+  try {
+    insertPosition = body.split('INSERT_POSITION_RELATIVE_TO_FIND:')[1].split('---')[0].trim();
+  } catch (error) {
+    console.error('Error parsing body:', error);
+    return `The error in parsing the BODY: ${error}. Either the INSERT_POSITION_RELATIVE_TO_FIND key is missing or not in the correct format. The correct format is INSERT_POSITION_RELATIVE_TO_FIND: {{above or below}} ---. Your response must conform strictly to INSERT_TEXT Response Template with all the keys present in the BODY`;
   }
+
   filePath = path.join(projectRootPath, filePath);
 
   console.log(`Inserting text in file: ${filePath} based on search text: '${searchText}' with replacement: '${textToInsert}' and insert position: '${insertPosition}'`);
@@ -33,7 +52,7 @@ export const insertText = async (body: string, projectRootPath: string, globPatt
     const index = text.indexOf(searchText);
     if (index === -1) {
       console.error('Search text not found in the document.');
-      return 'ERROR: The specified string to find was not found in the document. Please re-read the content of the file and ensure you have provided the correct string to search for, then try again';
+      return `ERROR: The provided FIND: ${searchText} was not found in the file. Please make sure to provided FIND exists in the file without any special characters or newlines. The FIND is case-sensitive`;
     }
 
     const position = document.positionAt(index);
diff --git a/sirji/vscode-extension/src/utils/executor/read_content.ts b/sirji/vscode-extension/src/utils/executor/read_content.ts
index ade2ee9c..b961556f 100644
--- a/sirji/vscode-extension/src/utils/executor/read_content.ts
+++ b/sirji/vscode-extension/src/utils/executor/read_content.ts
@@ -88,12 +88,17 @@ export async function readContent(projectRootPath: string, body: string, isDirec
   let result = '';
   let inputPaths = [];
 
-  if (isDirectory) {
-    const directoryPath = body.split('Directory:')[1].trim();
-    inputPaths.push(directoryPath);
-  } else {
-    const filePaths = body.split('File paths:')[1];
-    inputPaths = JSON.parse(filePaths);
+  try {
+    if (isDirectory) {
+      const directoryPath = body.split('Directory:')[1].trim();
+      inputPaths.push(directoryPath);
+    } else {
+      const filePaths = body.split('File paths:')[1];
+      inputPaths = JSON.parse(filePaths);
+    }
+  } catch (error) {
+    console.error('Error parsing the file paths from body:', error);
+    return `Error parsing the file paths from body: ${error}`;
   }
 
   console.log('-------inputPaths', inputPaths);
diff --git a/sirji/vscode-extension/src/utils/executor/search_code_in_project.ts b/sirji/vscode-extension/src/utils/executor/search_code_in_project.ts
new file mode 100644
index 00000000..e2e9d5f4
--- /dev/null
+++ b/sirji/vscode-extension/src/utils/executor/search_code_in_project.ts
@@ -0,0 +1,68 @@
+import * as vscode from 'vscode';
+import * as fs from 'fs';
+import * as path from 'path'; // Added path module
+
+const sanitizeFolderPath = (folderPath: string) => {
+  return folderPath.endsWith('/') ? folderPath.slice(0, -1) : folderPath;
+};
+
+const extractSearchTerm = (body: string): string | null => {
+  const match = body.match(/Search Term:\s*(.*)/);
+  return match ? match[1].trim() : null;
+};
+
+export const searchCodeInProject = async (body: string, projectPath: string, globPattern: string = '**/*.*', exclude: string = '**/node_modules/**'): Promise<string[]> => {
+  try {
+    console.log(`Base path: ${projectPath}`);
+    const searchTerm = extractSearchTerm(body);
+
+    if (!searchTerm) {
+      console.error('No search term found in body. Ensure "Search Term:" is specified.');
+      return [];
+    }
+
+    console.log(`Search term extracted: "${searchTerm}"`);
+
+    const basePath = sanitizeFolderPath(projectPath);
+
+    const workspaceFolders = vscode.workspace.workspaceFolders;
+    if (!workspaceFolders) {
+      console.error('No workspace folders found. Make sure the project is opened in VS Code.');
+      return [];
+    }
+
+    // Check if the projectPath is part of the workspace
+    const isBasePathInWorkspace = workspaceFolders.some((folder) => basePath.startsWith(folder.uri.fsPath));
+    if (!isBasePathInWorkspace) {
+      console.error(`The path provided (${basePath}) is not part of the opened workspace.`);
+      return [];
+    }
+
+    const pattern = new vscode.RelativePattern(basePath, globPattern);
+
+    console.log(`Searching for files with pattern: ${pattern} excluding: ${exclude}`);
+
+    const files = await vscode.workspace.findFiles(pattern, new vscode.RelativePattern(basePath, exclude));
+    console.log(`Found ${files.length} files with pattern: ${pattern.pattern}`);
+    const foundFiles: string[] = [];
+
+    for (const file of files) {
+      console.log(`Reading file: ${file.fsPath}`);
+      try {
+        const content = fs.readFileSync(file.fsPath, 'utf-8');
+        if (content.includes(searchTerm)) {
+          console.log(`Search term found in file: ${file.fsPath}`);
+          foundFiles.push(file.fsPath);
+        }
+      } catch (readError) {
+        console.error(`Error reading file ${file.fsPath}: ${readError}`);
+      }
+    }
+
+    console.log(`Found ${foundFiles.length} files containing the search term: ${searchTerm}`);
+    return foundFiles;
+  } catch (error) {
+    console.error(`Error searching for code in project: ${error}`);
+    throw new Error('Error while searching for code in project: ' + error);
+  }
+};
diff --git a/sirji/vscode-extension/src/utils/facilitator.ts b/sirji/vscode-extension/src/utils/facilitator.ts
index 3724b272..84ac0b40 100644
--- a/sirji/vscode-extension/src/utils/facilitator.ts
+++ b/sirji/vscode-extension/src/utils/facilitator.ts
@@ -15,6 +15,7 @@ import { readDependencies } from './executor/extract_file_dependencies';
 
 import { AgentStackManager } from './agent_stack_manager';
 import { SessionManager } from './session_manager';
+import { TokenManager } from './token_manager';
 
 export class Facilitator {
   private context: vscode.ExtensionContext | undefined;
@@ -36,6 +37,8 @@ export class Facilitator {
   private sirjiInstallationFolderPath: string = '';
   private sirjiRunFolderPath: string = '';
   private inputFilePath: string = '';
+  private tokenManager: TokenManager | undefined;
+  private isDebugging: Boolean = false;
 
   public constructor(context: vscode.ExtensionContext) {
     const oThis = this;
@@ -56,7 +59,7 @@ export class Facilitator {
     await oThis.setupSecretManager();
 
     // Open Chat Panel
-    oThis.openChatViewPanel();
+    await oThis.openChatViewPanel();
 
     return oThis.chatPanel;
   }
@@ -97,44 +100,75 @@ export class Facilitator {
 
     let conversationFolderPath = path.join(runFolderPath, 'conversations');
     oThis.agentOutputFolderPath = path.join(runFolderPath, 'agent_output');
-    let activeRecipeFolderPath = path.join(sirjiInstallationFolderPath, 'active_recipe');
+    let studioFolderPath = path.join(sirjiInstallationFolderPath, 'studio');
 
     let agentSessionsFilePath = path.join(runFolderPath, 'agent_sessions.json');
     let constantsFilePath = path.join(runFolderPath, 'constants.json');
-    let recipeFilePath = path.join(activeRecipeFolderPath, 'recipe.json');
-    let installedAgentsFolderPath = path.join(activeRecipeFolderPath, 'agents');
+    let recipeFilePath = path.join(studioFolderPath, 'recipes');
+    let installedAgentsFolderPath = path.join(studioFolderPath, 'agents');
     let fileSummariesFolderPath = path.join(sirjiInstallationFolderPath, 'file_summaries');
+    let agentOutputIndexFilePath = path.join(oThis.agentOutputFolderPath, 'index.json');
 
     fs.mkdirSync(runFolderPath, { recursive: true });
     fs.mkdirSync(conversationFolderPath, { recursive: true });
     fs.mkdirSync(oThis.agentOutputFolderPath, { recursive: true });
-    fs.mkdirSync(activeRecipeFolderPath, { recursive: true });
+    fs.mkdirSync(studioFolderPath, { recursive: true });
     fs.mkdirSync(fileSummariesFolderPath, { recursive: true });
 
+    fs.writeFileSync(agentOutputIndexFilePath, JSON.stringify({}), 'utf-8');
     fs.writeFileSync(constantsFilePath, JSON.stringify({ project_folder: oThis.projectRootPath }, null, 4), 'utf-8');
 
     fs.writeFileSync(agentSessionsFilePath, JSON.stringify({ sessions: [] }, null, 4), 'utf-8');
     oThis.sessionManager = new SessionManager(agentSessionsFilePath);
+    oThis.tokenManager = new TokenManager(agentSessionsFilePath, conversationFolderPath, path.join(runFolderPath, 'aggregate_tokens.json'));
 
     if (!fs.existsSync(recipeFilePath)) {
-      fs.copyFileSync(path.join(__dirname, '..', 'defaults', 'recipe.json'), recipeFilePath);
-      await oThis.copyDirectory(path.join(__dirname, '..', 'defaults', 'agents'), installedAgentsFolderPath);
-      fs.writeFileSync(path.join(sirjiInstallationFolderPath, 'active_recipe', 'config.json'), '{}', 'utf-8');
+      // Copy all the files from defaults folder to the studio folder
+      await oThis.copyDirectory(path.join(__dirname, '..', 'defaults'), studioFolderPath);
+
+      // fs.copyFileSync(path.join(__dirname, '..', 'defaults', 'recipe.json'), recipeFilePath);
+      // await oThis.copyDirectory(path.join(__dirname, '..', 'defaults', 'agents'), installedAgentsFolderPath);
+      // fs.writeFileSync(path.join(sirjiInstallationFolderPath, 'studio', 'config.json'), '{}', 'utf-8');
     }
   }
 
+  // private async copyDirectory(source: string, destination: string) {
+  //   if (!fs.existsSync(destination)) {
+  //     fs.mkdirSync(destination, { recursive: true });
+  //   }
+
+  //   let items = fs.readdirSync(source);
+
+  //   items.forEach((item) => {
+  //     let srcPath = path.join(source, item);
+  //     let destPath = path.join(destination, item);
+  //     fs.copyFileSync(srcPath, destPath);
+  //   });
+  // }
+
   private async copyDirectory(source: string, destination: string) {
-    if (!fs.existsSync(destination)) {
-      fs.mkdirSync(destination, { recursive: true });
-    }
+    try {
+      if (!fs.existsSync(destination)) {
+        fs.mkdirSync(destination, { recursive: true });
+      }
 
-    let items = fs.readdirSync(source);
+      let items = fs.readdirSync(source);
 
-    items.forEach((item) => {
-      let srcPath = path.join(source, item);
-      let destPath = path.join(destination, item);
-      fs.copyFileSync(srcPath, destPath);
-    });
+      for (const item of items) {
+        let srcPath = path.join(source, item);
+        let destPath = path.join(destination, item);
+        let stats = fs.statSync(srcPath);
+
+        if (stats.isDirectory()) {
+          await this.copyDirectory(srcPath, destPath);
+        } else {
+          fs.copyFileSync(srcPath, destPath);
+        }
+      }
+    } catch (error) {
+      console.error(`Error copying directory from ${source} to ${destination}:`, error);
+      throw error;
+    }
   }
 
   private async setupSecretManager() {
@@ -144,7 +178,7 @@ export class Facilitator {
     await oThis.retrieveSecret();
   }
 
-  private openChatViewPanel() {
+  private async openChatViewPanel() {
     const oThis = this;
 
     oThis.chatPanel = renderView(oThis.context, 'chat', oThis.projectRootUri, oThis.projectRootPath, oThis.sirjiRunId);
@@ -244,6 +278,22 @@ export class Facilitator {
     });
   }
 
+  private async getTokenUsedAgentWise() {
+    const oThis = this;
+
+    const tokenUsedInTheConversation = await oThis.tokenManager?.getTokenUsedInConversation();
+
+    console.log('tokenUsedInTheConversation------', tokenUsedInTheConversation);
+
+    oThis.chatPanel?.webview.postMessage({
+      type: 'tokenUsesByAgent',
+      content: {
+        message: tokenUsedInTheConversation,
+        allowUserMessage: false
+      }
+    });
+  }
+
   private async sendWelcomeMessage() {
     const oThis = this;
 
@@ -277,7 +327,7 @@ export class Facilitator {
     } else {
       oThis.chatPanel?.webview.postMessage({
         type: 'botMessage',
-        content: { message: 'I am all setup! What would you like me to build today?', allowUserMessage: true }
+        content: { message: 'I am all setup!', allowUserMessage: false }
       });
     }
   }
@@ -305,6 +355,10 @@ export class Facilitator {
     switch (message.type) {
       case 'webViewReady':
         await oThis.sendWelcomeMessage();
+        console.log('Starting Facilitation...');
+        await oThis.initFacilitation('', {
+          TO: ACTOR_ENUM.ORCHESTRATOR
+        });
         break;
 
       case 'saveSettings':
@@ -322,49 +376,19 @@ export class Facilitator {
       case 'requestCoderLogs':
         await oThis.readCoderLogs();
         break;
+      case 'requestTokenUsage':
+        await oThis.getTokenUsedAgentWise();
 
       case 'userMessage':
-        if (oThis.isFirstUserMessage) {
-          const agentOutputIndexFilePath = path.join(oThis.agentOutputFolderPath, 'index.json');
+        console.log('message.content--------', message.content);
 
-          let creatorAgent = 'SIRJI';
-          let creatorForlderPath = path.join(oThis.agentOutputFolderPath, creatorAgent);
-          let problemStatementFilePath = path.join(creatorForlderPath, 'problem.txt');
+        oThis.inputFilePath = path.join(oThis.sirjiRunFolderPath, 'input.txt');
+        fs.writeFileSync(oThis.inputFilePath, message.content, 'utf-8');
 
-          let problemStatementFilePathKey = path.join(creatorAgent, 'problem.txt');
-
-          fs.mkdirSync(creatorForlderPath, { recursive: true });
-          fs.writeFileSync(problemStatementFilePath, message.content, 'utf-8');
-
-          oThis.writeToFile(problemStatementFilePath, message.content);
-
-          fs.writeFileSync(
-            agentOutputIndexFilePath,
-            JSON.stringify({
-              [problemStatementFilePathKey]: {
-                description: 'Problem statement from the SIRJI_USER.',
-                created_by: creatorAgent
-              }
-            }),
-            'utf-8'
-          );
-
-          oThis.isFirstUserMessage = false;
-
-          await oThis.initFacilitation(message.content, {
-            TO: ACTOR_ENUM.ORCHESTRATOR
-          });
-        } else {
-          console.log('message.content--------', message.content);
-
-          oThis.inputFilePath = path.join(oThis.sirjiRunFolderPath, 'input.txt');
-          fs.writeFileSync(oThis.inputFilePath, message.content, 'utf-8');
-
-          await oThis.initFacilitation(message.content, {
-            TO: oThis.lastMessageFrom,
-            FROM: ACTOR_ENUM.USER
-          });
-        }
+        await oThis.initFacilitation(message.content, {
+          TO: oThis.lastMessageFrom,
+          FROM: ACTOR_ENUM.USER
+        });
 
         break;
 
@@ -428,6 +452,7 @@ export class Facilitator {
       } else {
         switch (parsedMessage.TO) {
           case ACTOR_ENUM.ORCHESTRATOR:
+            console.log('Orchestrator message', parsedMessage);
             try {
               await spawnAdapter(
                 oThis.context,
@@ -455,6 +480,7 @@ export class Facilitator {
             parsedMessage = lastOrchestratorMessage?.parsed_content;
 
             oThis.writeToFile(inputFilePath, rawMessage);
+            await oThis.tokenManager?.generateAggregateTokenForOrchestrator();
             break;
 
           case ACTOR_ENUM.USER:
@@ -478,7 +504,7 @@ export class Facilitator {
 
           case ACTOR_ENUM.EXECUTOR:
             try {
-              const executor = new Executor(parsedMessage, oThis.projectRootPath, oThis.agentOutputFolderPath, oThis.sirjiRunFolderPath);
+              const executor = new Executor(parsedMessage, oThis.projectRootPath, oThis.agentOutputFolderPath, oThis.sirjiRunFolderPath, oThis.sirjiInstallationFolderPath);
               const executorResp = await executor.perform();
 
               rawMessage = executorResp.rawMessage;
@@ -534,8 +560,12 @@ export class Facilitator {
         }
       }
 
+      await oThis.tokenManager?.generateAggregateTokens();
+
       const totalTokensUsed = await oThis.calculateTotalTokensUsed();
 
+      console.log('totalTokensUsed------', totalTokensUsed);
+
       oThis.chatPanel?.webview.postMessage({
         type: 'tokenUsed',
         content: {
@@ -549,6 +579,18 @@ export class Facilitator {
   private displayParsedMessageSummaryToChatPanel(parsedMessage: any) {
     const oThis = this;
 
+    if (!oThis.isDebugging) {
+      if (
+        parsedMessage.ACTION === 'INVOKE_AGENT' ||
+        parsedMessage.ACTION === 'APPEND_TO_AGENT_OUTPUT_INDEX' ||
+        parsedMessage.ACTION === 'FETCH_RECIPE_INDEX' ||
+        parsedMessage.ACTION === 'FETCH_RECIPE' ||
+        parsedMessage.ACTION === 'READ_AGENT_OUTPUT_FILES'
+      ) {
+        return;
+      }
+    }
+
     let contentMessage = null;
 
     if (!parsedMessage || !parsedMessage.ACTION || parsedMessage.TO == ACTOR_ENUM.USER || !parsedMessage.SUMMARY.trim() || parsedMessage.SUMMARY.trim().toLowerCase() === 'empty') {
@@ -597,37 +639,7 @@ export class Facilitator {
 
   private async calculateTotalTokensUsed() {
     const oThis = this;
-
-    // TODO - we need to read the conversation files of all the agents
-
-    // const coderConversationFilePath = path.join(oThis.sirjiRunId, Constants.CODER_JSON_FILE);
-    // const researcherConversationFilePath = path.join(oThis.sirjiRunId, Constants.RESEARCHER_JSON_FILE);
-    // const plannerConversationFilePath = path.join(oThis.sirjiRunId, Constants.PLANNER_JSON_FILE);
-
-    // const coderTokensUsed = await oThis.getTokensUsed(coderConversationFilePath);
-    // const researcherTokensUsed = await oThis.getTokensUsed(researcherConversationFilePath);
-    // const plannerTokensUsed = await oThis.getTokensUsed(plannerConversationFilePath);
-
-    // const totalPromptTokens = coderTokensUsed.prompt_tokens + researcherTokensUsed.prompt_tokens + plannerTokensUsed.prompt_tokens;
-
-    // const totalCompletionTokens = coderTokensUsed.completion_tokens + researcherTokensUsed.completion_tokens + plannerTokensUsed.completion_tokens;
-
-    // const totalPromptTokensValueInDollar = (totalPromptTokens * Constants.PROMPT_TOKEN_PRICE_PER_MILLION_TOKENS) / 1000000.0;
-    // const totalCompletionTokensValueInDollar = (totalCompletionTokens * Constants.COMPLETION_TOKEN_PRICE_PER_MILLION_TOKENS) / 1000000.0;
-
-    // return {
-    //   total_prompt_tokens: totalPromptTokens,
-    //   total_completion_tokens: totalCompletionTokens,
-    //   total_prompt_tokens_value: totalPromptTokensValueInDollar,
-    //   total_completion_tokens_value: totalCompletionTokensValueInDollar
-    // };
-
-    return {
-      total_prompt_tokens: 0,
-      total_completion_tokens: 0,
-      total_prompt_tokens_value: 0,
-      total_completion_tokens_value: 0
-    };
+    return await oThis.tokenManager?.getAggregateTokensUsedInConversation();
   }
 
   private async getTokensUsed(conversationFilePath: string): Promise<any> {
diff --git a/sirji/vscode-extension/src/utils/session_manager.ts b/sirji/vscode-extension/src/utils/session_manager.ts
index da66d67f..3a4c1d8a 100644
--- a/sirji/vscode-extension/src/utils/session_manager.ts
+++ b/sirji/vscode-extension/src/utils/session_manager.ts
@@ -1,67 +1,67 @@
 import { v4 as uuidv4 } from 'uuid';
 import fs from 'fs';
 
-interface Session {
-    sessionId: string;
-    callStack: string;
-    timestamp: string;
+export interface Session {
+  sessionId: string;
+  callStack: string;
+  timestamp: string;
 }
 
 export class SessionManager {
-    private filePath: string;
+  private filePath: string;
 
-    constructor(filePath: string) {
-        this.filePath = filePath;
-    }
+  constructor(filePath: string) {
+    this.filePath = filePath;
+  }
 
-    public startNewSession(callStack: string): string {
-        const newSession: Session = {
-            sessionId: uuidv4(),
-            callStack: callStack,
-            timestamp: new Date().toISOString()
-        };
-        const data = this.readSessionsFile();
-        data.sessions.push(newSession);
-        this.writeSessionsFile(data);
+  public startNewSession(callStack: string): string {
+    const newSession: Session = {
+      sessionId: uuidv4(),
+      callStack: callStack,
+      timestamp: new Date().toISOString()
+    };
+    const data = this.readSessionsFile();
+    data.sessions.push(newSession);
+    this.writeSessionsFile(data);
 
-        return newSession.sessionId;
-    }
+    return newSession.sessionId;
+  }
 
-    public reuseSession(callStack: string): string | null {
-        const data = this.readSessionsFile();
-        const filteredSessions: Session[] = data.sessions.filter((session: Session) => session.callStack === callStack);
-        if (filteredSessions.length > 0) {
-            filteredSessions.sort((a: Session, b: Session) => new Date(b.timestamp).getTime() - new Date(a.timestamp).getTime());
-            return filteredSessions[0].sessionId;
-        }
-        
-        return null;
+  public reuseSession(callStack: string): string | null {
+    const data = this.readSessionsFile();
+    const filteredSessions: Session[] = data.sessions.filter((session: Session) => session.callStack === callStack);
+    if (filteredSessions.length > 0) {
+      filteredSessions.sort((a: Session, b: Session) => new Date(b.timestamp).getTime() - new Date(a.timestamp).getTime());
+      return filteredSessions[0].sessionId;
     }
 
-    public getSessionTimestampMillis(sessionId: string): number | null {
-        const data = this.readSessionsFile();
-        const session = data.sessions.find((session: Session) => session.sessionId === sessionId);
-        if (session) {
-            return new Date(session.timestamp).getTime();
-        }
-        return null;
+    return null;
+  }
+
+  public getSessionTimestampMillis(sessionId: string): number | null {
+    const data = this.readSessionsFile();
+    const session = data.sessions.find((session: Session) => session.sessionId === sessionId);
+    if (session) {
+      return new Date(session.timestamp).getTime();
     }
+    return null;
+  }
 
-    private readSessionsFile(): { sessions: Session[] } {
-        try {
-            const fileContents = fs.readFileSync(this.filePath, 'utf8');
-            return JSON.parse(fileContents) as { sessions: Session[] };
-        } catch (error) {
-            console.error("Error reading the sessions file:", error);
-            return { sessions: [] };
-        }
+  private readSessionsFile(): { sessions: Session[] } {
+    try {
+      const fileContents = fs.readFileSync(this.filePath, 'utf8');
+      return JSON.parse(fileContents) as { sessions: Session[] };
+    } catch (error) {
+      console.error('Error reading the sessions file:', error);
+      return { sessions: [] };
     }
+  }
 
-    private writeSessionsFile(data: { sessions: Session[] }): void {
-        try {
-            fs.writeFileSync(this.filePath, JSON.stringify(data, null, 4));
-        } catch (error) {
-            console.error("Error writing to the sessions file:", error);
-        }
+  private writeSessionsFile(data: { sessions: Session[] }): void {
+    try {
+      fs.writeFileSync(this.filePath, JSON.stringify(data, null, 4));
+    } catch (error) {
+      console.error('Error writing to the sessions file:', error);
     }
-}
\ No newline at end of file
+  }
+}
diff --git a/sirji/vscode-extension/src/utils/token_manager.ts b/sirji/vscode-extension/src/utils/token_manager.ts
new file mode 100644
index 00000000..c906c194
--- /dev/null
+++ b/sirji/vscode-extension/src/utils/token_manager.ts
@@ -0,0 +1,187 @@
+import fs from 'fs';
+import path from 'path';
+import { Session } from './session_manager';
+import { LLM_MODEL_PRICING } from './constants';
+
+export class TokenManager {
+  private filePath: string;
+  private conversationFolderPath: string;
+  private aggregateTokenFilePath: string;
+  private aggregateTokens: {
+    [key: string]: { prompt_tokens: number; completion_tokens: number; prompt_token_valuation_in_dollar: number; completion_token_valuation_in_dollar: number; llm_model: string };
+  } = {};
+  private finalAggregateTokens: {
+    [key: string]: { prompt_tokens: number; completion_tokens: number; prompt_token_valuation_in_dollar: number; completion_token_valuation_in_dollar: number; llm_model: string };
+  } = {};
+
+  constructor(filePath: string, conversationFolderPath: string, aggregateTokenFilePath: string) {
+    this.filePath = filePath;
+    this.conversationFolderPath = conversationFolderPath;
+    this.aggregateTokenFilePath = aggregateTokenFilePath;
+
+    console.log('TokenManager: filePath:', this.filePath);
+    console.log('TokenManager: conversationFolderPath:', this.conversationFolderPath);
+    console.log('TokenManager: aggregateTokenFilePath:', this.aggregateTokenFilePath);
+  }
+
+  private readFile(orchestratorFilePath: string) {
+    try {
+      if (!fs.existsSync(orchestratorFilePath)) {
+        return {};
+      }
+      const fileContents = fs.readFileSync(orchestratorFilePath, 'utf8');
+      return JSON.parse(fileContents);
+    } catch (error) {
+      console.error('Error reading the orchestrator file:', error);
+      return {};
+    }
+  }
+
+  public generateAggregateTokenForOrchestrator() {
+    const orchestratorFilePath = path.join(this.conversationFolderPath, 'ORCHESTRATOR.json');
+    const orchestratorFileContent = this.readFile(orchestratorFilePath);
+    if (!Object.keys(orchestratorFileContent).length) {
+      return;
+    }
+    const { prompt_tokens, completion_tokens, llm_model } = orchestratorFileContent;
+    this.addTokensToAggregateTokens('ORCHESTRATOR', prompt_tokens, completion_tokens, llm_model);
+  }
+
+  public async addTokensToAggregateTokens(key: string, prompt_tokens: number, completion_tokens: number, llm_model: string) {
+    console.log('TokenManager: addTokensToAggregateTokens:', { key, prompt_tokens, completion_tokens, llm_model });
+
+    if (!this.aggregateTokens[key]) {
+      this.aggregateTokens[key] = {
+        prompt_tokens: 0,
+        completion_tokens: 0,
+        prompt_token_valuation_in_dollar: 0,
+        completion_token_valuation_in_dollar: 0,
+        llm_model: ''
+      };
+    }
+
+    this.aggregateTokens[key].prompt_tokens = prompt_tokens;
+    this.aggregateTokens[key].completion_tokens = completion_tokens;
+    this.aggregateTokens[key].llm_model = llm_model;
+
+    const llmModelPricing = LLM_MODEL_PRICING[llm_model];
+    if (!llmModelPricing) {
+      console.error('Error: llm_model not found in LLM_MODEL_PRICING:', llm_model);
+      return;
+    }
+    this.aggregateTokens[key].prompt_token_valuation_in_dollar = (this.aggregateTokens[key].prompt_tokens * LLM_MODEL_PRICING[llm_model].PROMPT_TOKEN_PRICE_PER_MILLION_TOKENS) / 1000000.0;
+    this.aggregateTokens[key].completion_token_valuation_in_dollar = (this.aggregateTokens[key].completion_tokens * LLM_MODEL_PRICING[llm_model].COMPLETION_TOKEN_PRICE_PER_MILLION_TOKENS) / 1000000.0;
+
+    console.log('TokenManager: aggregateTokens:', this.aggregateTokens);
+
+    this.writeAggregateTokensFile(this.aggregateTokens);
+  }
+
+  public generateAggregateTokens(): void {
+    const data = this.readSessionsFile();
+    data.sessions.forEach((session: Session) => {
+      console.log('TokenManager: session:', session);
+      const fileName = `${session.callStack}.${session.sessionId}.json`;
+      const filePath = path.join(this.conversationFolderPath, fileName);
+      console.log('TokenManager: filePath:', filePath);
+
+      if (fs.existsSync(filePath)) {
+        const fileContents = fs.readFileSync(filePath, 'utf8');
+        const parsedContent = JSON.parse(fileContents);
+        const { prompt_tokens, completion_tokens, llm_model } = parsedContent;
+
+        if (typeof prompt_tokens !== 'number' || typeof completion_tokens !== 'number') {
+          console.error('Error: prompt_tokens and completion_tokens should be numbers.', { prompt_tokens, completion_tokens });
+          return;
+        }
+
+        console.log('TokenManager: prompt_tokens:', prompt_tokens);
+        console.log('TokenManager: completion_tokens:', completion_tokens);
+
+        // const splittedCallStack = session.callStack.split('.');
+        const key = session.callStack;
+
+        this.addTokensToAggregateTokens(key, prompt_tokens, completion_tokens, llm_model);
+      }
+    });
+
+    console.log('TokenManager: aggregateTokens:', this.aggregateTokens);
+  }
+
+  private readSessionsFile(): { sessions: Session[] } {
+    try {
+      const fileContents = fs.readFileSync(this.filePath, 'utf8');
+      return JSON.parse(fileContents) as { sessions: Session[] };
+    } catch (error) {
+      console.error('Error reading the sessions file:', error);
+      return { sessions: [] };
+    }
+  }
+
+  private writeAggregateTokensFile(data: {
+    [key: string]: { prompt_tokens: number; completion_tokens: number; prompt_token_valuation_in_dollar: number; completion_token_valuation_in_dollar: number; llm_model: string };
+  }): void {
+    try {
+      this.finalAggregateTokens = {};
+      Object.keys(data).forEach((key) => {
+        const splittedKey = key.split('.');
+        const newKey = splittedKey[0];
+        if (!this.finalAggregateTokens[newKey]) {
+          this.finalAggregateTokens[newKey] = {
+            prompt_tokens: 0,
+            completion_tokens: 0,
+            prompt_token_valuation_in_dollar: 0,
+            completion_token_valuation_in_dollar: 0,
+            llm_model: ''
+          };
+        }
+
+        this.finalAggregateTokens[newKey].prompt_tokens += data[key].prompt_tokens;
+        this.finalAggregateTokens[newKey].completion_tokens += data[key].completion_tokens;
+        this.finalAggregateTokens[newKey].prompt_token_valuation_in_dollar += data[key].prompt_token_valuation_in_dollar;
+        this.finalAggregateTokens[newKey].completion_token_valuation_in_dollar += data[key].completion_token_valuation_in_dollar;
+        this.finalAggregateTokens[newKey].llm_model = data[key].llm_model;
+      });
+
+      fs.writeFileSync(this.aggregateTokenFilePath, JSON.stringify(this.finalAggregateTokens, null, 4), 'utf8');
+    } catch (error) {
+      console.error('Error writing the aggregate tokens file:', error);
+    }
+  }
+
+  public async getTokenUsedInConversation() {
+    try {
+      if (!fs.existsSync(this.aggregateTokenFilePath)) {
+        return {};
+      }
+      const fileContents = fs.readFileSync(this.aggregateTokenFilePath, 'utf8');
+      return JSON.parse(fileContents);
+    } catch (error) {
+      console.error('Error reading the aggregate token file:', error);
+      return {};
+    }
+  }
+
+  public async getAggregateTokensUsedInConversation() {
+    const aggregateTokens = await this.getTokenUsedInConversation();
+
+    let prompt_tokens = 0;
+    let completion_tokens = 0;
+    let total_prompt_tokens_value = 0;
+    let completion_tokens_value = 0;
+
+    Object.keys(aggregateTokens).forEach((key) => {
+      prompt_tokens += aggregateTokens[key].prompt_tokens;
+      completion_tokens += aggregateTokens[key].completion_tokens;
+      total_prompt_tokens_value += aggregateTokens[key].prompt_token_valuation_in_dollar;
+      completion_tokens_value += aggregateTokens[key].completion_token_valuation_in_dollar;
+    });
+
+    return {
+      total_prompt_tokens: prompt_tokens,
+      total_completion_tokens: completion_tokens,
+      total_prompt_tokens_value: total_prompt_tokens_value,
+      total_completion_tokens_value: completion_tokens_value
+    };
+  }
+}
diff --git a/sirji/vscode-extension/src/views/chat/chat.css b/sirji/vscode-extension/src/views/chat/chat.css
index 797d3348..b7ff6e66 100644
--- a/sirji/vscode-extension/src/views/chat/chat.css
+++ b/sirji/vscode-extension/src/views/chat/chat.css
@@ -462,13 +462,14 @@ label {
   }
 }
 
-.tokensContainer {
-  display: none;  
+.tokens-container {
+  display: flex;  
   justify-content: center;
   align-items: center;
   position: relative;
   gap: 5px;
   cursor: pointer;
+  z-index: 1;
 }
 
 .tooltip {
@@ -488,6 +489,8 @@ label {
   top: 25px;
   bottom: 0;
   height: fit-content;
+  /* visibility: visible;
+  opacity: 1; */
 }
 
 .tooltip-text {
@@ -512,12 +515,12 @@ label {
   transform: translateX(-50%);
 }
 
-.tokensContainer:hover .tooltip {
+.tokens-container:hover .tooltip {
   visibility: visible;
   opacity: 1;
 }
   
-.tokensContainer:hover .text {
+.tokens-container:hover .text {
   color: var(--vscode-list-hoverForeground);
 }
 
@@ -858,3 +861,78 @@ label {
   box-sizing: inherit;
   -webkit-tap-highlight-color: transparent;
 }
+
+.backdrop {
+  height: 100vh;
+  width: 100%;
+  position: absolute;
+  top: 0;
+  display: none;
+}
+
+.modal-container {
+  display: none;
+  width: 350px;
+  background-color: var(--vscode-sideBar-background);
+  margin: 50px 15px auto auto;
+}
+
+.tokens-modal {
+  display: flex;
+  padding: 24px;
+  flex-direction: column;
+  justify-content: center;
+  align-items: center;
+  width: 100%;
+  color: var(--vscode-titleBar-activeForeground);
+}
+
+.tokens-modal-header {
+  display: flex;
+  justify-content: space-between;
+  align-items: center;
+  width: 100%;
+  color: var(--vscode-titleBar-activeForeground);
+}
+
+.tokens-modal-body {
+  width: -webkit-fill-available;
+  padding: 24px 24px 0px 24px;
+  color: var(--vscode-titleBar-activeForeground);
+}
+
+.tokens-table {
+  width: 100%;
+  display: flex;
+  flex-direction: column;
+  gap: 3px;
+}
+
+.tokens-table-row {
+  display: flex;
+  justify-content: space-between;
+  align-items: flex-start;
+  width: 100%;
+  color: var(--vscode-titleBar-activeForeground);
+  gap: 32px;
+}
+
+.tokens-table-footer-row {
+  display: flex;
+  justify-content: space-between;
+  align-items: flex-start;
+  width: 100%;
+  margin-top: 20px;
+  gap: 32px;
+}
+
+.flex-shrink{
+  flex-shrink: 0;
+}
+
+.close-button {
+  background: transparent;
+  outline: none;
+  border: none;
+  cursor: pointer;
+}
\ No newline at end of file
diff --git a/sirji/vscode-extension/src/views/chat/chat.html b/sirji/vscode-extension/src/views/chat/chat.html
index ad3851f1..0b91b35d 100644
--- a/sirji/vscode-extension/src/views/chat/chat.html
+++ b/sirji/vscode-extension/src/views/chat/chat.html
@@ -1,166 +1,197 @@
 <!DOCTYPE html>
 <html lang="en">
+  <head>
+    <title>Sirji Chat</title>
+    <meta charset="UTF-8" />
+    <meta name="viewport" content="width=device-width, initial-scale=1.0" />
+    <!-- Use a meta tag to enforce Content Security Policy -->
+    <meta http-equiv="Content-Security-Policy" content="default-src 'none'; style-src-elem  'nonce-${nonce}'; script-src 'nonce-${nonce}';" />
+    <link nonce="${nonce}" rel="stylesheet" type="text/css" href="${chatStyleUri}" />
+  </head>
 
-<head>
-  <title>Sirji Chat</title>
-  <meta charset="UTF-8" />
-  <meta name="viewport" content="width=device-width, initial-scale=1.0" />
-  <!-- Use a meta tag to enforce Content Security Policy -->
-  <meta http-equiv="Content-Security-Policy"
-    content="default-src 'none'; style-src-elem  'nonce-${nonce}'; script-src 'nonce-${nonce}';" />
-  <link nonce="${nonce}" rel="stylesheet" type="text/css" href="${chatStyleUri}" />
-</head>
+  <body>
+    <main>
+      <div class="column-view" id="jWrap">
+        <!--  chat terminal  -->
+        <div class="chat-termianl-container" id="jLeft">
+          <!-- header -->
+          <div class="header" id="jHeader">
+            <div class="left">
+              <div class="chat-tab-button">CHAT</div>
+            </div>
+            <div class="right">
+              <div class="tokens-container toolbar-icon" id="jTokensButton">
+                <svg width="22" height="6" viewBox="0 0 22 6" fill="none" xmlns="http://www.w3.org/2000/svg">
+                  <path
+                    fill-rule="evenodd"
+                    clip-rule="evenodd"
+                    d="M1 0C0.447715 0 0 0.447715 0 1V5C0 5.55228 0.447715 6 1 6H6H11H21C21.5523 6 22 5.55228 22 5V1C22 0.447715 21.5523 0 21 0H11H6H1ZM5 1H2H1V2V4V5H2H5V1ZM6 5H7H10H11V4V2V1H10H7H6V2V4V5ZM12 1V5H20H21V4V2V1H20H12Z"
+                    fill="white"
+                  />
+                </svg>
+                <div class="tokens text" id="jTokensUsed">0 tokens</div>
+              </div>
+              <div id="openSettings" class="toolbar-icon">
+                <svg xmlns="http://www.w3.org/2000/svg" width="24" height="24" viewBox="0 0 256 256">
+                  <path
+                    d="M128 80a48 48 0 1 0 48 48 48.05 48.05 0 0 0-48-48m0 80a32 32 0 1 1 32-32 32 32 0 0 1-32 32m88-29.84q.06-2.16 0-4.32l14.92-18.64a8 8 0 0 0 1.48-7.06 107.2 107.2 0 0 0-10.88-26.25 8 8 0 0 0-6-3.93l-23.72-2.64q-1.48-1.56-3-3L186 40.54a8 8 0 0 0-3.94-6 107.7 107.7 0 0 0-26.25-10.87 8 8 0 0 0-7.06 1.49L130.16 40h-4.32L107.2 25.11a8 8 0 0 0-7.06-1.48 107.6 107.6 0 0 0-26.25 10.88 8 8 0 0 0-3.93 6l-2.64 23.76q-1.56 1.49-3 3L40.54 70a8 8 0 0 0-6 3.94 107.7 107.7 0 0 0-10.87 26.25 8 8 0 0 0 1.49 7.06L40 125.84v4.32L25.11 148.8a8 8 0 0 0-1.48 7.06 107.2 107.2 0 0 0 10.88 26.25 8 8 0 0 0 6 3.93l23.72 2.64q1.49 1.56 3 3L70 215.46a8 8 0 0 0 3.94 6 107.7 107.7 0 0 0 26.25 10.87 8 8 0 0 0 7.06-1.49L125.84 216q2.16.06 4.32 0l18.64 14.92a8 8 0 0 0 7.06 1.48 107.2 107.2 0 0 0 26.25-10.88 8 8 0 0 0 3.93-6l2.64-23.72q1.56-1.48 3-3l23.78-2.8a8 8 0 0 0 6-3.94 107.7 107.7 0 0 0 10.87-26.25 8 8 0 0 0-1.49-7.06Zm-16.1-6.5a74 74 0 0 1 0 8.68 8 8 0 0 0 1.74 5.48l14.19 17.73a91.6 91.6 0 0 1-6.23 15l-22.6 2.56a8 8 0 0 0-5.1 2.64 74 74 0 0 1-6.14 6.14 8 8 0 0 0-2.64 5.1l-2.51 22.58a91.3 91.3 0 0 1-15 6.23l-17.74-14.19a8 8 0 0 0-5-1.75h-.48a74 74 0 0 1-8.68 0 8 8 0 0 0-5.48 1.74l-17.78 14.2a91.6 91.6 0 0 1-15-6.23L82.89 187a8 8 0 0 0-2.64-5.1 74 74 0 0 1-6.14-6.14 8 8 0 0 0-5.1-2.64l-22.58-2.52a91.3 91.3 0 0 1-6.23-15l14.19-17.74a8 8 0 0 0 1.74-5.48 74 74 0 0 1 0-8.68 8 8 0 0 0-1.74-5.48L40.2 100.45a91.6 91.6 0 0 1 6.23-15L69 82.89a8 8 0 0 0 5.1-2.64 74 74 0 0 1 6.14-6.14A8 8 0 0 0 82.89 69l2.51-22.57a91.3 91.3 0 0 1 15-6.23l17.74 14.19a8 8 0 0 0 5.48 1.74 74 74 0 0 1 8.68 0 8 8 0 0 0 5.48-1.74l17.77-14.19a91.6 91.6 0 0 1 15 6.23L173.11 69a8 8 0 0 0 2.64 5.1 74 74 0 0 1 6.14 6.14 8 8 0 0 0 5.1 2.64l22.58 2.51a91.3 91.3 0 0 1 6.23 15l-14.19 17.74a8 8 0 0 0-1.74 5.53Z"
+                    fill="white"
+                  />
+                </svg>
+              </div>
+            </div>
+          </div>
 
-<body>
-  <main>
-    <div class="column-view" id="jWrap">
-      <!--  chat terminal  -->
-      <div class="chat-termianl-container" id="jLeft">
-        <!-- header -->
-        <div class="header" id="jHeader">
-          <div class="left">
-            <div class="chat-tab-button">CHAT</div>
+          <!-- chat messages container -->
+          <div id="chatContainer">
+            <div id="messageContainer"></div>
           </div>
-          <div class="right">
-            <div class="tokensContainer toolbar-icon" id="jTokensContainer">
-              <svg width="22" height="6" viewBox="0 0 22 6" fill="none" xmlns="http://www.w3.org/2000/svg">
-                <path fill-rule="evenodd" clip-rule="evenodd"
-                  d="M1 0C0.447715 0 0 0.447715 0 1V5C0 5.55228 0.447715 6 1 6H6H11H21C21.5523 6 22 5.55228 22 5V1C22 0.447715 21.5523 0 21 0H11H6H1ZM5 1H2H1V2V4V5H2H5V1ZM6 5H7H10H11V4V2V1H10H7H6V2V4V5ZM12 1V5H20H21V4V2V1H20H12Z"
-                  fill="white" />
-              </svg>
-              <div class="tokens text" id="jTokensUsed">0 tokens</div>
-              <div class="tooltip">
-                <div class="tooltip-body">
-                  <div class="tooltip-text" id="jPromptTokensUsed">Prompt Tokens - 0 | $0</div>
-                  <div class="hr"></div>
-                  <div class="tooltip-text" id="jCompletionTokensUsed">Completion Tokens - 0 | $0</div>
+
+          <!-- input container -->
+          <div id="inputContainer">
+            <textarea id="userInput" placeholder="Type a message..."></textarea>
+            <button id="sendBtn">Send</button>
+          </div>
+
+          <div class="backdrop" id="jBackdrop">
+            <div class="modal-container" id="jTokensModal">
+              <div class="tokens-modal">
+                <div class="tokens-modal-header">
+                  <div class="">Token Usage</div>
+                  <button class="close-button toolbar-icon" id="jCloseTokensModalButton">
+                    <svg width="10" height="10" viewBox="0 0 10 10" fill="none" xmlns="http://www.w3.org/2000/svg">
+                      <path
+                        d="M5 5.69333L8.62667 9.37333L9.37333 8.62667L5.69333 5L9.37333 1.37333L8.62667 0.626666L5 4.30667L1.37333 0.626666L0.626667 1.37333L4.30667 5L0.626667 8.62667L1.37333 9.37333L5 5.69333Z"
+                        fill="#CCCCCC"
+                      />
+                    </svg>
+                  </button>
+                </div>
+                <div class="tokens-modal-body">
+                  <div class="tokens-table" id="tokensTable">
+                    <!-- Rows will be populated by JS -->
+                    <div class="tokens-table-footer-row">
+                      <div class="">Total</div>
+                      <div class="flex-shrink" id="totalRow"></div>
+                    </div>
+                  </div>
                 </div>
-                <div class="tooltip-arrow"></div>
               </div>
             </div>
-            <div id="openSettings" class="toolbar-icon">
-              <svg xmlns="http://www.w3.org/2000/svg" width="24" height="24" viewBox="0 0 256 256">
-                <path
-                  d="M128 80a48 48 0 1 0 48 48 48.05 48.05 0 0 0-48-48m0 80a32 32 0 1 1 32-32 32 32 0 0 1-32 32m88-29.84q.06-2.16 0-4.32l14.92-18.64a8 8 0 0 0 1.48-7.06 107.2 107.2 0 0 0-10.88-26.25 8 8 0 0 0-6-3.93l-23.72-2.64q-1.48-1.56-3-3L186 40.54a8 8 0 0 0-3.94-6 107.7 107.7 0 0 0-26.25-10.87 8 8 0 0 0-7.06 1.49L130.16 40h-4.32L107.2 25.11a8 8 0 0 0-7.06-1.48 107.6 107.6 0 0 0-26.25 10.88 8 8 0 0 0-3.93 6l-2.64 23.76q-1.56 1.49-3 3L40.54 70a8 8 0 0 0-6 3.94 107.7 107.7 0 0 0-10.87 26.25 8 8 0 0 0 1.49 7.06L40 125.84v4.32L25.11 148.8a8 8 0 0 0-1.48 7.06 107.2 107.2 0 0 0 10.88 26.25 8 8 0 0 0 6 3.93l23.72 2.64q1.49 1.56 3 3L70 215.46a8 8 0 0 0 3.94 6 107.7 107.7 0 0 0 26.25 10.87 8 8 0 0 0 7.06-1.49L125.84 216q2.16.06 4.32 0l18.64 14.92a8 8 0 0 0 7.06 1.48 107.2 107.2 0 0 0 26.25-10.88 8 8 0 0 0 3.93-6l2.64-23.72q1.56-1.48 3-3l23.78-2.8a8 8 0 0 0 6-3.94 107.7 107.7 0 0 0 10.87-26.25 8 8 0 0 0-1.49-7.06Zm-16.1-6.5a74 74 0 0 1 0 8.68 8 8 0 0 0 1.74 5.48l14.19 17.73a91.6 91.6 0 0 1-6.23 15l-22.6 2.56a8 8 0 0 0-5.1 2.64 74 74 0 0 1-6.14 6.14 8 8 0 0 0-2.64 5.1l-2.51 22.58a91.3 91.3 0 0 1-15 6.23l-17.74-14.19a8 8 0 0 0-5-1.75h-.48a74 74 0 0 1-8.68 0 8 8 0 0 0-5.48 1.74l-17.78 14.2a91.6 91.6 0 0 1-15-6.23L82.89 187a8 8 0 0 0-2.64-5.1 74 74 0 0 1-6.14-6.14 8 8 0 0 0-5.1-2.64l-22.58-2.52a91.3 91.3 0 0 1-6.23-15l14.19-17.74a8 8 0 0 0 1.74-5.48 74 74 0 0 1 0-8.68 8 8 0 0 0-1.74-5.48L40.2 100.45a91.6 91.6 0 0 1 6.23-15L69 82.89a8 8 0 0 0 5.1-2.64 74 74 0 0 1 6.14-6.14A8 8 0 0 0 82.89 69l2.51-22.57a91.3 91.3 0 0 1 15-6.23l17.74 14.19a8 8 0 0 0 5.48 1.74 74 74 0 0 1 8.68 0 8 8 0 0 0 5.48-1.74l17.77-14.19a91.6 91.6 0 0 1 15 6.23L173.11 69a8 8 0 0 0 2.64 5.1 74 74 0 0 1 6.14 6.14 8 8 0 0 0 5.1 2.64l22.58 2.51a91.3 91.3 0 0 1 6.23 15l-14.19 17.74a8 8 0 0 0-1.74 5.53Z"
-                  fill="white" />
-              </svg>
-            </div>
           </div>
         </div>
-    
-        <!-- chat messages container -->
-        <div id="chatContainer">
-          <div id="messageContainer"></div>
-        </div>
-    
-        <!-- input container -->
-        <div id="inputContainer">
-          <textarea id="userInput" placeholder="Type a message..."></textarea>
-          <button id="sendBtn">Send</button>
-        </div>
-      </div>
 
-      <!--  tasks and log panels  -->
-      <div class="tabs-container" id="jRight">
-        <div class="resize-handle" id="jResizeHandle"></div>
-        <div class="header" id="jHeader">
-          <div class="left">
-            <div class="tab-button active" data-tab="steps"><span id="progressText">STEPS</span></div>
-            <div class="tab-button" data-tab="logs">LOGS</div>
+        <!--  tasks and log panels  -->
+        <div class="tabs-container" id="jRight">
+          <div class="resize-handle" id="jResizeHandle"></div>
+          <div class="header" id="jHeader">
+            <div class="left">
+              <div class="tab-button active" data-tab="steps"><span id="progressText">STEPS</span></div>
+              <div class="tab-button" data-tab="logs">LOGS</div>
+            </div>
           </div>
-        </div>
-    
-        <div id="stepsTab" class="tab active pl-10">
-          <div id="stepsList" class="steps-panel-view">
-            <div class="text-inactive">This is where the steps for the solution will be displayed.</div>
+
+          <div id="stepsTab" class="tab active pl-10">
+            <div id="stepsList" class="steps-panel-view">
+              <div class="text-inactive">This is where the steps for the solution will be displayed.</div>
+            </div>
           </div>
-        </div>
-    
-        <div id="logsTab" class="tab">
-          <div class="nested-tabs-container">
-            <div class="nested-header" id="jHeader">
-              <div class="tab-buttons-container" id="jTabsButtonsContainer">
-                <div class="tab-buttons" id="jTabButtons">
-                  <div class="log-tab-button active" data-tab="coder">CODER</div>
-                  <div class="log-tab-button" data-tab="planner">PLANNER</div>
-                  <div class="log-tab-button" data-tab="researcher">RESEARCHER</div>
+
+          <div id="logsTab" class="tab">
+            <div class="nested-tabs-container">
+              <div class="nested-header" id="jHeader">
+                <div class="tab-buttons-container" id="jTabsButtonsContainer">
+                  <div class="tab-buttons" id="jTabButtons">
+                    <div class="log-tab-button active" data-tab="coder">CODER</div>
+                    <div class="log-tab-button" data-tab="planner">PLANNER</div>
+                    <div class="log-tab-button" data-tab="researcher">RESEARCHER</div>
+                  </div>
+                  <div id="jArrowSvg" class="arrow-svg toolbar-icon">
+                    <svg width="13" height="10" viewBox="0 0 13 10" fill="none" xmlns="http://www.w3.org/2000/svg">
+                      <path
+                        d="M5.708 4.293a1 1 0 0 1 0 1.415l-4 4A1 1 0 1 1 .293 8.293l3.294-3.292L.293 1.708A1 1 0 0 1 1.708.293zm7 0a1 1 0 0 1 0 1.415l-4 4a1 1 0 0 1-1.415-1.415l3.294-3.292-3.294-3.293A1 1 0 1 1 8.708.293z"
+                        fill="#979797"
+                      />
+                    </svg>
+                  </div>
                 </div>
-                <div id="jArrowSvg" class="arrow-svg toolbar-icon">
-                  <svg width="13" height="10" viewBox="0 0 13 10" fill="none" xmlns="http://www.w3.org/2000/svg">
-                    <path d="M5.708 4.293a1 1 0 0 1 0 1.415l-4 4A1 1 0 1 1 .293 8.293l3.294-3.292L.293 1.708A1 1 0 0 1 1.708.293zm7 0a1 1 0 0 1 0 1.415l-4 4a1 1 0 0 1-1.415-1.415l3.294-3.292-3.294-3.293A1 1 0 1 1 8.708.293z" fill="#979797" />
-                  </svg>
+              </div>
+
+              <div id="plannerTab" class="log-tab">
+                <div id="plannerLogs" class="panel-view">
+                  <div class="text-inactive">This is where the logs from the planner will be displayed.</div>
                 </div>
               </div>
-            </div>
-        
-            <div id="plannerTab" class="log-tab">
-              <div id="plannerLogs" class="panel-view">
-                <div class="text-inactive">This is where the logs from the planner will be displayed.</div>
+
+              <div id="coderTab" class="log-tab active">
+                <div id="coderLogs" class="panel-view">
+                  <div class="text-inactive">This is where the logs from the coder will be displayed.</div>
+                </div>
               </div>
-            </div>
-        
-            <div id="coderTab" class="log-tab active">
-              <div id="coderLogs" class="panel-view">
-                <div class="text-inactive">This is where the logs from the coder will be displayed.</div>
+
+              <div id="researcherTab" class="log-tab">
+                <div id="researcherLogs" class="panel-view">
+                  <div class="text-inactive">This is where the logs from the researcher will be displayed.</div>
+                </div>
               </div>
             </div>
-        
-            <div id="researcherTab" class="log-tab">
-              <div id="researcherLogs" class="panel-view">
-                <div class="text-inactive">This is where the logs from the researcher will be displayed.</div>
-              </div>
+          </div>
+
+          <div class="backdrop" id="jTabsBackdrop"></div>
+        </div>
+      </div>
+
+      <div id="plannerModal" class="modal">
+        <div class="modal-body">
+          <div class="modal-header">
+            <div class="planner-modal-header">
+              <span id="closePlanner">
+                <svg width="26" height="26" viewBox="0 0 26 26" fill="none" xmlns="http://www.w3.org/2000/svg">
+                  <path
+                    d="M16.8249 10.3248L14.1487 13L16.8249 15.6752C16.9003 15.7506 16.9602 15.8403 17.0011 15.9389C17.0419 16.0375 17.063 16.1432 17.063 16.25C17.063 16.3568 17.0419 16.4625 17.0011 16.5611C16.9602 16.6597 16.9003 16.7494 16.8249 16.8248C16.7494 16.9003 16.6597 16.9602 16.5611 17.0011C16.4625 17.0419 16.3568 17.063 16.25 17.063C16.1432 17.063 16.0375 17.0419 15.9389 17.0011C15.8403 16.9602 15.7507 16.9003 15.6752 16.8248L13 14.1487L10.3248 16.8248C10.2494 16.9003 10.1597 16.9602 10.0611 17.0011C9.96248 17.0419 9.85676 17.063 9.75001 17.063C9.64325 17.063 9.53753 17.0419 9.4389 17.0011C9.34027 16.9602 9.25065 16.9003 9.17516 16.8248C9.09967 16.7494 9.03979 16.6597 8.99894 16.5611C8.95808 16.4625 8.93705 16.3568 8.93705 16.25C8.93705 16.1432 8.95808 16.0375 8.99894 15.9389C9.03979 15.8403 9.09967 15.7506 9.17516 15.6752L11.8513 13L9.17516 10.3248C9.0227 10.1724 8.93705 9.96561 8.93705 9.75C8.93705 9.53439 9.0227 9.32761 9.17516 9.17516C9.32762 9.0227 9.5344 8.93705 9.75001 8.93705C9.96561 8.93705 10.1724 9.0227 10.3248 9.17516L13 11.8513L15.6752 9.17516C15.7507 9.09967 15.8403 9.03979 15.9389 8.99893C16.0375 8.95808 16.1432 8.93705 16.25 8.93705C16.3568 8.93705 16.4625 8.95808 16.5611 8.99893C16.6597 9.03979 16.7494 9.09967 16.8249 9.17516C16.9003 9.25065 16.9602 9.34027 17.0011 9.4389C17.0419 9.53753 17.063 9.64324 17.063 9.75C17.063 9.85676 17.0419 9.96247 17.0011 10.0611C16.9602 10.1597 16.9003 10.2494 16.8249 10.3248ZM23.5625 13C23.5625 15.0891 22.943 17.1312 21.7824 18.8682C20.6218 20.6052 18.9721 21.959 17.0421 22.7585C15.1121 23.5579 12.9883 23.7671 10.9394 23.3595C8.89044 22.952 7.00838 21.946 5.53119 20.4688C4.054 18.9916 3.04802 17.1096 2.64046 15.0606C2.2329 13.0117 2.44208 10.888 3.24153 8.95791C4.04098 7.02786 5.3948 5.37822 7.13179 4.2176C8.86879 3.05698 10.9109 2.4375 13 2.4375C15.8004 2.44046 18.4853 3.55424 20.4656 5.53445C22.4458 7.51466 23.5595 10.1996 23.5625 13ZM21.9375 13C21.9375 11.2323 21.4133 9.50436 20.4313 8.03459C19.4492 6.56483 18.0534 5.41929 16.4202 4.74283C14.7871 4.06637 12.9901 3.88938 11.2564 4.23423C9.52268 4.57909 7.93017 5.4303 6.68024 6.68023C5.43031 7.93017 4.57909 9.52268 4.23424 11.2564C3.88938 12.9901 4.06637 14.7871 4.74283 16.4202C5.41929 18.0533 6.56483 19.4492 8.0346 20.4313C9.50436 21.4133 11.2323 21.9375 13 21.9375C15.3696 21.9348 17.6413 20.9923 19.3168 19.3168C20.9923 17.6413 21.9348 15.3695 21.9375 13Z"
+                    fill="white"
+                  />
+                </svg>
+              </span>
+              <div class="modal-heading">Planner</div>
+              <div class="modal-subheading" id="progressTextInsideModal">2 of 5 tasks done</div>
             </div>
           </div>
-        </div>    
+          <div class="modal-content">
+            <ul class="planner-modal-container" id="plannerStepsList"></ul>
+          </div>
+        </div>
       </div>
-    </div>
 
-    <div id="plannerModal" class="modal">
-      <div class="modal-body">
-        <div class="modal-header">
-          <div class="planner-modal-header">
-            <span id="closePlanner">
+      <div id="settingsModal" class="modal">
+        <div class="modal-body setting-modal-body">
+          <div class="modal-header">
+            <span id="closeSettings">
               <svg width="26" height="26" viewBox="0 0 26 26" fill="none" xmlns="http://www.w3.org/2000/svg">
-                <path d="M16.8249 10.3248L14.1487 13L16.8249 15.6752C16.9003 15.7506 16.9602 15.8403 17.0011 15.9389C17.0419 16.0375 17.063 16.1432 17.063 16.25C17.063 16.3568 17.0419 16.4625 17.0011 16.5611C16.9602 16.6597 16.9003 16.7494 16.8249 16.8248C16.7494 16.9003 16.6597 16.9602 16.5611 17.0011C16.4625 17.0419 16.3568 17.063 16.25 17.063C16.1432 17.063 16.0375 17.0419 15.9389 17.0011C15.8403 16.9602 15.7507 16.9003 15.6752 16.8248L13 14.1487L10.3248 16.8248C10.2494 16.9003 10.1597 16.9602 10.0611 17.0011C9.96248 17.0419 9.85676 17.063 9.75001 17.063C9.64325 17.063 9.53753 17.0419 9.4389 17.0011C9.34027 16.9602 9.25065 16.9003 9.17516 16.8248C9.09967 16.7494 9.03979 16.6597 8.99894 16.5611C8.95808 16.4625 8.93705 16.3568 8.93705 16.25C8.93705 16.1432 8.95808 16.0375 8.99894 15.9389C9.03979 15.8403 9.09967 15.7506 9.17516 15.6752L11.8513 13L9.17516 10.3248C9.0227 10.1724 8.93705 9.96561 8.93705 9.75C8.93705 9.53439 9.0227 9.32761 9.17516 9.17516C9.32762 9.0227 9.5344 8.93705 9.75001 8.93705C9.96561 8.93705 10.1724 9.0227 10.3248 9.17516L13 11.8513L15.6752 9.17516C15.7507 9.09967 15.8403 9.03979 15.9389 8.99893C16.0375 8.95808 16.1432 8.93705 16.25 8.93705C16.3568 8.93705 16.4625 8.95808 16.5611 8.99893C16.6597 9.03979 16.7494 9.09967 16.8249 9.17516C16.9003 9.25065 16.9602 9.34027 17.0011 9.4389C17.0419 9.53753 17.063 9.64324 17.063 9.75C17.063 9.85676 17.0419 9.96247 17.0011 10.0611C16.9602 10.1597 16.9003 10.2494 16.8249 10.3248ZM23.5625 13C23.5625 15.0891 22.943 17.1312 21.7824 18.8682C20.6218 20.6052 18.9721 21.959 17.0421 22.7585C15.1121 23.5579 12.9883 23.7671 10.9394 23.3595C8.89044 22.952 7.00838 21.946 5.53119 20.4688C4.054 18.9916 3.04802 17.1096 2.64046 15.0606C2.2329 13.0117 2.44208 10.888 3.24153 8.95791C4.04098 7.02786 5.3948 5.37822 7.13179 4.2176C8.86879 3.05698 10.9109 2.4375 13 2.4375C15.8004 2.44046 18.4853 3.55424 20.4656 5.53445C22.4458 7.51466 23.5595 10.1996 23.5625 13ZM21.9375 13C21.9375 11.2323 21.4133 9.50436 20.4313 8.03459C19.4492 6.56483 18.0534 5.41929 16.4202 4.74283C14.7871 4.06637 12.9901 3.88938 11.2564 4.23423C9.52268 4.57909 7.93017 5.4303 6.68024 6.68023C5.43031 7.93017 4.57909 9.52268 4.23424 11.2564C3.88938 12.9901 4.06637 14.7871 4.74283 16.4202C5.41929 18.0533 6.56483 19.4492 8.0346 20.4313C9.50436 21.4133 11.2323 21.9375 13 21.9375C15.3696 21.9348 17.6413 20.9923 19.3168 19.3168C20.9923 17.6413 21.9348 15.3695 21.9375 13Z" fill="white" />
+                <path
+                  d="M16.8249 10.3248L14.1487 13L16.8249 15.6752C16.9003 15.7506 16.9602 15.8403 17.0011 15.9389C17.0419 16.0375 17.063 16.1432 17.063 16.25C17.063 16.3568 17.0419 16.4625 17.0011 16.5611C16.9602 16.6597 16.9003 16.7494 16.8249 16.8248C16.7494 16.9003 16.6597 16.9602 16.5611 17.0011C16.4625 17.0419 16.3568 17.063 16.25 17.063C16.1432 17.063 16.0375 17.0419 15.9389 17.0011C15.8403 16.9602 15.7507 16.9003 15.6752 16.8248L13 14.1487L10.3248 16.8248C10.2494 16.9003 10.1597 16.9602 10.0611 17.0011C9.96248 17.0419 9.85676 17.063 9.75001 17.063C9.64325 17.063 9.53753 17.0419 9.4389 17.0011C9.34027 16.9602 9.25065 16.9003 9.17516 16.8248C9.09967 16.7494 9.03979 16.6597 8.99894 16.5611C8.95808 16.4625 8.93705 16.3568 8.93705 16.25C8.93705 16.1432 8.95808 16.0375 8.99894 15.9389C9.03979 15.8403 9.09967 15.7506 9.17516 15.6752L11.8513 13L9.17516 10.3248C9.0227 10.1724 8.93705 9.96561 8.93705 9.75C8.93705 9.53439 9.0227 9.32761 9.17516 9.17516C9.32762 9.0227 9.5344 8.93705 9.75001 8.93705C9.96561 8.93705 10.1724 9.0227 10.3248 9.17516L13 11.8513L15.6752 9.17516C15.7507 9.09967 15.8403 9.03979 15.9389 8.99893C16.0375 8.95808 16.1432 8.93705 16.25 8.93705C16.3568 8.93705 16.4625 8.95808 16.5611 8.99893C16.6597 9.03979 16.7494 9.09967 16.8249 9.17516C16.9003 9.25065 16.9602 9.34027 17.0011 9.4389C17.0419 9.53753 17.063 9.64324 17.063 9.75C17.063 9.85676 17.0419 9.96247 17.0011 10.0611C16.9602 10.1597 16.9003 10.2494 16.8249 10.3248ZM23.5625 13C23.5625 15.0891 22.943 17.1312 21.7824 18.8682C20.6218 20.6052 18.9721 21.959 17.0421 22.7585C15.1121 23.5579 12.9883 23.7671 10.9394 23.3595C8.89044 22.952 7.00838 21.946 5.53119 20.4688C4.054 18.9916 3.04802 17.1096 2.64046 15.0606C2.2329 13.0117 2.44208 10.888 3.24153 8.95791C4.04098 7.02786 5.3948 5.37822 7.13179 4.2176C8.86879 3.05698 10.9109 2.4375 13 2.4375C15.8004 2.44046 18.4853 3.55424 20.4656 5.53445C22.4458 7.51466 23.5595 10.1996 23.5625 13ZM21.9375 13C21.9375 11.2323 21.4133 9.50436 20.4313 8.03459C19.4492 6.56483 18.0534 5.41929 16.4202 4.74283C14.7871 4.06637 12.9901 3.88938 11.2564 4.23423C9.52268 4.57909 7.93017 5.4303 6.68024 6.68023C5.43031 7.93017 4.57909 9.52268 4.23424 11.2564C3.88938 12.9901 4.06637 14.7871 4.74283 16.4202C5.41929 18.0533 6.56483 19.4492 8.0346 20.4313C9.50436 21.4133 11.2323 21.9375 13 21.9375C15.3696 21.9348 17.6413 20.9923 19.3168 19.3168C20.9923 17.6413 21.9348 15.3695 21.9375 13Z"
+                  fill="white"
+                />
               </svg>
             </span>
-            <div class="modal-heading">Planner</div>
-            <div class="modal-subheading" id="progressTextInsideModal">2 of 5 tasks done</div>
+            <div class="settings-modal-heading">Environment Variables Configuration</div>
           </div>
-        </div>
-        <div class="modal-content">
-          <ul class="planner-modal-container" id="plannerStepsList"></ul>
-        </div>
-      </div>
-    </div>
-
-    <div id="settingsModal" class="modal">
-      <div class="modal-body setting-modal-body">
-        <div class="modal-header">
-          <span id="closeSettings">
-            <svg width="26" height="26" viewBox="0 0 26 26" fill="none" xmlns="http://www.w3.org/2000/svg">
-              <path d="M16.8249 10.3248L14.1487 13L16.8249 15.6752C16.9003 15.7506 16.9602 15.8403 17.0011 15.9389C17.0419 16.0375 17.063 16.1432 17.063 16.25C17.063 16.3568 17.0419 16.4625 17.0011 16.5611C16.9602 16.6597 16.9003 16.7494 16.8249 16.8248C16.7494 16.9003 16.6597 16.9602 16.5611 17.0011C16.4625 17.0419 16.3568 17.063 16.25 17.063C16.1432 17.063 16.0375 17.0419 15.9389 17.0011C15.8403 16.9602 15.7507 16.9003 15.6752 16.8248L13 14.1487L10.3248 16.8248C10.2494 16.9003 10.1597 16.9602 10.0611 17.0011C9.96248 17.0419 9.85676 17.063 9.75001 17.063C9.64325 17.063 9.53753 17.0419 9.4389 17.0011C9.34027 16.9602 9.25065 16.9003 9.17516 16.8248C9.09967 16.7494 9.03979 16.6597 8.99894 16.5611C8.95808 16.4625 8.93705 16.3568 8.93705 16.25C8.93705 16.1432 8.95808 16.0375 8.99894 15.9389C9.03979 15.8403 9.09967 15.7506 9.17516 15.6752L11.8513 13L9.17516 10.3248C9.0227 10.1724 8.93705 9.96561 8.93705 9.75C8.93705 9.53439 9.0227 9.32761 9.17516 9.17516C9.32762 9.0227 9.5344 8.93705 9.75001 8.93705C9.96561 8.93705 10.1724 9.0227 10.3248 9.17516L13 11.8513L15.6752 9.17516C15.7507 9.09967 15.8403 9.03979 15.9389 8.99893C16.0375 8.95808 16.1432 8.93705 16.25 8.93705C16.3568 8.93705 16.4625 8.95808 16.5611 8.99893C16.6597 9.03979 16.7494 9.09967 16.8249 9.17516C16.9003 9.25065 16.9602 9.34027 17.0011 9.4389C17.0419 9.53753 17.063 9.64324 17.063 9.75C17.063 9.85676 17.0419 9.96247 17.0011 10.0611C16.9602 10.1597 16.9003 10.2494 16.8249 10.3248ZM23.5625 13C23.5625 15.0891 22.943 17.1312 21.7824 18.8682C20.6218 20.6052 18.9721 21.959 17.0421 22.7585C15.1121 23.5579 12.9883 23.7671 10.9394 23.3595C8.89044 22.952 7.00838 21.946 5.53119 20.4688C4.054 18.9916 3.04802 17.1096 2.64046 15.0606C2.2329 13.0117 2.44208 10.888 3.24153 8.95791C4.04098 7.02786 5.3948 5.37822 7.13179 4.2176C8.86879 3.05698 10.9109 2.4375 13 2.4375C15.8004 2.44046 18.4853 3.55424 20.4656 5.53445C22.4458 7.51466 23.5595 10.1996 23.5625 13ZM21.9375 13C21.9375 11.2323 21.4133 9.50436 20.4313 8.03459C19.4492 6.56483 18.0534 5.41929 16.4202 4.74283C14.7871 4.06637 12.9901 3.88938 11.2564 4.23423C9.52268 4.57909 7.93017 5.4303 6.68024 6.68023C5.43031 7.93017 4.57909 9.52268 4.23424 11.2564C3.88938 12.9901 4.06637 14.7871 4.74283 16.4202C5.41929 18.0533 6.56483 19.4492 8.0346 20.4313C9.50436 21.4133 11.2323 21.9375 13 21.9375C15.3696 21.9348 17.6413 20.9923 19.3168 19.3168C20.9923 17.6413 21.9348 15.3695 21.9375 13Z" fill="white" />
-            </svg>
-          </span>
-          <div class="settings-modal-heading">Environment Variables Configuration</div>
-        </div>
-        <div class="modal-content">
-          <div class="settings-modal-container">
-            <div class="input-wrapper">
-              <label for="SIRJI_OPENAI_API_KEY">OpenAI API Key</label>
-              <input type="text" id="SIRJI_OPENAI_API_KEY" placeholder="Enter here" />
-              <span class="error-message" id="SIRJI_OPENAI_API_KEY_ERROR"></span>
-            </div>
-            <div>
-              <span class="error-message" id="save_settings_error"></span>
+          <div class="modal-content">
+            <div class="settings-modal-container">
+              <div class="input-wrapper">
+                <label for="SIRJI_OPENAI_API_KEY">OpenAI API Key</label>
+                <input type="text" id="SIRJI_OPENAI_API_KEY" placeholder="Enter here" />
+                <span class="error-message" id="SIRJI_OPENAI_API_KEY_ERROR"></span>
+              </div>
+              <div>
+                <span class="error-message" id="save_settings_error"></span>
+              </div>
             </div>
+            <button class="save-settings-button" id="saveSettings">Save</button>
           </div>
-          <button class="save-settings-button" id="saveSettings">Save</button>
         </div>
       </div>
-    </div>
-  </main>
-  <script type="module" nonce="${nonce}" src="${chatScriptUri}"></script>
-</body>
-
-</html>
\ No newline at end of file
+    </main>
+    <script type="module" nonce="${nonce}" src="${chatScriptUri}"></script>
+  </body>
+</html>
diff --git a/sirji/vscode-extension/src/views/chat/chat.js b/sirji/vscode-extension/src/views/chat/chat.js
index dcb71f2b..97bb0e7c 100644
--- a/sirji/vscode-extension/src/views/chat/chat.js
+++ b/sirji/vscode-extension/src/views/chat/chat.js
@@ -118,6 +118,10 @@ window.addEventListener('message', (event) => {
       displayCoderLogs(event.data.content);
       break;
 
+    case 'tokenUsesByAgent':
+      displayTokenUsesByAgent(event.data.content.message);
+      break;
+
     default:
       sendBotMessage(`Unknown message received from facilitator: ${event.data}`, false);
   }
@@ -155,7 +159,7 @@ function sendBotMessage(message, allowUserInput) {
 function onInputChange(event) {
   removRecentUserLoader();
   adjustTextAreaHeight();
-  
+
   // Check if "Command" key (Mac) or "Ctrl" key (Windows/Linux) and "Enter" key are pressed
   if ((event.metaKey || event.ctrlKey) && event.key === 'Enter') {
     sendUserMessage();
@@ -175,12 +179,12 @@ function adjustTextAreaHeight() {
 
 function updateMessageContainerHeight() {
   const chatContainer = document.getElementById('chatContainer');
-  
-  const inputontainerHeight = document.getElementById("inputContainer").offsetHeight;
-  const headerHeight = document.getElementById("jHeader").offsetHeight;
 
-  const totalHeight = inputontainerHeight + headerHeight; 
-  
+  const inputontainerHeight = document.getElementById('inputContainer').offsetHeight;
+  const headerHeight = document.getElementById('jHeader').offsetHeight;
+
+  const totalHeight = inputontainerHeight + headerHeight;
+
   chatContainer.style.height = `calc(100vh - ${totalHeight}px)`;
 }
 
@@ -194,15 +198,15 @@ function displayMessage(msg, sender, allowUserInput) {
   // Defer the scrolling a bit to ensure layout updates
   chatListContainerElement.appendChild(messageElement);
 
-  if (sender === "bot" && allowUserInput) {
-    displayMessage("Waiting for your input", "user", true); 
+  if (sender === 'bot' && allowUserInput) {
+    displayMessage('Waiting for your input', 'user', true);
   }
 
   chatListContainerElement.scrollTop = chatListContainerElement.scrollHeight + 10;
 }
 
 function removRecentUserLoader() {
-  const userMessages = document.querySelectorAll(".user-input-waiting");
+  const userMessages = document.querySelectorAll('.user-input-waiting');
 
   if (userMessages.length <= 0) {
     return;
@@ -214,10 +218,9 @@ function removRecentUserLoader() {
 }
 
 function createMessageElement(msg, sender, allowUserInput) {
-  removeAllLoaderInstanceFromDOM("message-loader");
-  
-  const chatElement = document.createElement('div');
+  removeAllLoaderInstanceFromDOM('message-loader');
 
+  const chatElement = document.createElement('div');
 
   // Construct user message HTML format
   if (sender === 'user') {
@@ -271,7 +274,7 @@ function createMessageElement(msg, sender, allowUserInput) {
       chatElement.appendChild(loaderElement);
     }
   }
-  
+
   return chatElement;
 }
 
@@ -458,17 +461,22 @@ function toggleProgressTextColor() {
 
 function convertNumber(number) {
   if (number >= 1000000) {
-      return (Math.ceil(number / 100000) / 10).toFixed(1).replace('.0', '') + 'M';
+    return (Math.ceil(number / 100000) / 10).toFixed(1).replace('.0', '') + 'M';
   } else if (number >= 100000) {
-      return (Math.ceil(number / 10000) / 100).toFixed(1).replace('.0', '') + 'M';
+    return (Math.ceil(number / 10000) / 100).toFixed(1).replace('.0', '') + 'M';
   } else if (number >= 1000) {
-      return (Math.ceil(number / 1000)).toFixed(1).replace('.0', '') + 'K';
+    return (
+      Math.ceil(number / 1000)
+        .toFixed(1)
+        .replace('.0', '') + 'K'
+    );
   } else {
-      return ""; // Don't show tokens less than 1K
+    return ''; // Don't show tokens less than 1K
   }
 }
 
 function displayTokenUsed(data = {}) {
+  console.log('display token used', data);
   const { total_completion_tokens = 0, total_completion_tokens_value = 0, total_prompt_tokens = 0, total_prompt_tokens_value = 0 } = data;
 
   const totalTokensUsed = total_completion_tokens + total_prompt_tokens;
@@ -492,6 +500,7 @@ function updateTokensUsed(totalTokensUsed) {
 }
 
 function updateTooltipTokenValues(tokenValues) {
+  console.log('updateTooltipTokenValues values:', tokenValues);
   const { total_completion_tokens = 0, total_completion_tokens_value = 0, total_prompt_tokens = 0, total_prompt_tokens_value = 0 } = tokenValues;
 
   const jPromptTokensUsed = document.getElementById('jPromptTokensUsed');
@@ -505,21 +514,21 @@ function displayPlannerLogs(data) {
   const plannerLogs = document.getElementById('plannerLogs');
   plannerLogs.innerText = data;
   // scroll to bottom
-  scrollToBottom("plannerLogs");
+  scrollToBottom('plannerLogs');
 }
 
 function displayResearcherLogs(data) {
   const researcherLogs = document.getElementById('researcherLogs');
   researcherLogs.innerText = data;
   // scroll to bottom
-  scrollToBottom("researcherLogs");
+  scrollToBottom('researcherLogs');
 }
 
 function displayCoderLogs(data) {
   const coderLogs = document.getElementById('coderLogs');
   coderLogs.innerText = data;
   // scroll to bottom
-  scrollToBottom("coderLogs");
+  scrollToBottom('coderLogs');
 }
 
 function displayCoderTab(data) {
@@ -575,12 +584,11 @@ const logTabButtons = document.querySelectorAll('.log-tab-button');
 logTabButtons.forEach(function (button) {
   button.addEventListener('click', function () {
     const tabName = this.getAttribute('data-tab');
-    showTab(tabName, "log-tab", "log-tab-button");
+    showTab(tabName, 'log-tab', 'log-tab-button');
   });
 });
 
-
-function showTab(tabName, tabClassName = "tab", tabButtonClassName = "tab-button") {
+function showTab(tabName, tabClassName = 'tab', tabButtonClassName = 'tab-button') {
   let i, tabcontent, tablinks;
 
   // Get all elements with class="tab" and hide them
@@ -602,7 +610,7 @@ function showTab(tabName, tabClassName = "tab", tabButtonClassName = "tab-button
   // scroll to bottom
   scrollToBottom(`${tabName}Logs`);
 
-  // adjust the tabs 
+  // adjust the tabs
   toggleTabsArrowOnResize();
 }
 
@@ -611,13 +619,11 @@ function scrollToBottom(elementId) {
 
   if (!domElement) {
     return;
-  };
-  
-  domElement.scrollTop = domElement.scrollHeight + 25;
+  }
 
+  domElement.scrollTop = domElement.scrollHeight + 25;
 }
 
-
 updateIconColors();
 
 vscode.postMessage({
@@ -668,11 +674,11 @@ function setup(event) {
 function drag(event) {
   event.preventDefault();
 
-  jWrap.style.gridTemplateAreas = (lStartWidth + event.clientX - StartX) + 'px',(rStartWidth - event.clientX + StartX) + 'px';
-	jRight.style.width = (rStartWidth - event.clientX + StartX) + 'px';
-  jLeft.style.width = (lStartWidth + event.clientX - StartX) + 'px';
-  
-  jResizeHandle.style.right = (rStartWidth - event.clientX + StartX - 4) + 'px';
+  (jWrap.style.gridTemplateAreas = lStartWidth + event.clientX - StartX + 'px'), rStartWidth - event.clientX + StartX + 'px';
+  jRight.style.width = rStartWidth - event.clientX + StartX + 'px';
+  jLeft.style.width = lStartWidth + event.clientX - StartX + 'px';
+
+  jResizeHandle.style.right = rStartWidth - event.clientX + StartX - 4 + 'px';
 
   toggleTabsArrowOnResize();
 }
@@ -696,20 +702,94 @@ function toggleTabsArrowOnResize() {
   }
 }
 
-window.addEventListener("resize", function () {
+window.addEventListener('resize', function () {
   setup();
 });
 
-jTabsButtonsContainerEl.addEventListener("scroll", function () {
+jTabsButtonsContainerEl.addEventListener('scroll', function () {
   const totalScrolledWidth = jTabsButtonsContainerEl.offsetWidth + jTabsButtonsContainerEl.scrollLeft;
 
   if (totalScrolledWidth >= jTabButtonsEl.offsetWidth) {
-    jArrowSvg.style.display = "none";
+    jArrowSvg.style.display = 'none';
   } else {
-    jArrowSvg.style.display = "flex";
+    jArrowSvg.style.display = 'flex';
   }
 });
 
 jArrowSvg.onclick = function () {
   jTabsButtonsContainerEl.scrollLeft = 999999;
-};
\ No newline at end of file
+};
+
+// Tokens modal
+const jTokensButton = document.getElementById('jTokensButton');
+const jTokensModal = document.getElementById('jTokensModal');
+const jCloseTokensModalButton = document.getElementById('jCloseTokensModalButton');
+const jTabsBackdrop = document.getElementById('jTabsBackdrop');
+const jBackdrop = document.getElementById('jBackdrop');
+let isOpen = false;
+
+function tokensButtonClickhandler(e) {
+  if (isOpen) {
+    closeTokensModal();
+  } else {
+    openTokensModal();
+  }
+}
+
+function displayTokenUsesByAgent(data) {
+  console.log('Token uses by agent:', data);
+  const agents = Object.keys(data);
+
+  let totalTokens = 0;
+
+  let totalTokenValuationInDollar = 0;
+
+  const tokensTable = document.getElementById('tokensTable');
+
+  tokensTable.querySelectorAll('.tokens-table-row').forEach((row) => row.remove());
+
+  agents.forEach((agent) => {
+    const agentData = data[agent];
+    const completionTokens = agentData.completion_tokens;
+    const completionTokenValuationInDollar = agentData.completion_token_valuation_in_dollar;
+    const promptTokens = agentData.prompt_tokens;
+    const promptTokenValuationInDollar = agentData.prompt_token_valuation_in_dollar;
+    totalTokens += completionTokens + promptTokens;
+    totalTokenValuationInDollar += completionTokenValuationInDollar + promptTokenValuationInDollar;
+    const row = document.createElement('div');
+    row.className = 'tokens-table-row';
+    row.innerHTML = `<div>${agent}</div><div class="flex-shrink">${convertNumber(completionTokens + promptTokens)} | $${(completionTokenValuationInDollar + promptTokenValuationInDollar).toFixed(
+      2,
+    )}</div>`;
+    tokensTable.insertBefore(row, tokensTable.querySelector('.tokens-table-footer-row'));
+  });
+
+  document.getElementById('totalRow').innerHTML = `${convertNumber(totalTokens)} | $${totalTokenValuationInDollar.toFixed(2)}`;
+
+  jTokensModal.style.display = 'flex';
+  jTabsBackdrop.style.display = 'flex';
+  jBackdrop.style.display = 'flex';
+  document.body.addEventListener('click', modalClickHandler);
+  isOpen = !isOpen;
+}
+
+function openTokensModal() {
+  vscode.postMessage({ type: 'requestTokenUsage' });
+}
+
+function closeTokensModal() {
+  jTokensModal.style.display = 'none';
+  jTabsBackdrop.style.display = 'none';
+  jBackdrop.style.display = 'none';
+  document.body.removeEventListener('click', modalClickHandler);
+  isOpen = !isOpen;
+}
+
+function modalClickHandler(event) {
+  if (event.target.classList.contains('backdrop')) {
+    closeTokensModal();
+  }
+}
+
+jCloseTokensModalButton.addEventListener('click', closeTokensModal);
+jTokensButton.addEventListener('click', tokensButtonClickhandler);


Test patch:
diff --git a/messages/tests/test_action_enum.py b/messages/tests/test_action_enum.py
index a74872e9..40afb434 100644
--- a/messages/tests/test_action_enum.py
+++ b/messages/tests/test_action_enum.py
@@ -7,6 +7,8 @@ def test_action_enum_membership():
     assert ActionEnum['EXECUTE_COMMAND'] == ActionEnum.EXECUTE_COMMAND
     assert ActionEnum['APPEND_TO_AGENT_OUTPUT_INDEX'] == ActionEnum.APPEND_TO_AGENT_OUTPUT_INDEX
     assert ActionEnum['READ_AGENT_OUTPUT_INDEX'] == ActionEnum.READ_AGENT_OUTPUT_INDEX
+    assert ActionEnum['FETCH_RECIPE'] == ActionEnum.FETCH_RECIPE
+    assert ActionEnum['FETCH_RECIPE_INDEX'] == ActionEnum.FETCH_RECIPE_INDEX
     assert ActionEnum['RUN_SERVER'] == ActionEnum.RUN_SERVER
     assert ActionEnum['CREATE_PROJECT_FILE'] == ActionEnum.CREATE_PROJECT_FILE
     assert ActionEnum['CREATE_AGENT_OUTPUT_FILE'] == ActionEnum.CREATE_AGENT_OUTPUT_FILE
diff --git a/messages/tests/test_helper.py b/messages/tests/test_helper.py
index dab0d074..0ac1f18f 100644
--- a/messages/tests/test_helper.py
+++ b/messages/tests/test_helper.py
@@ -6,7 +6,9 @@
 def test_allowed_response_templates():
     from_agent = AgentEnum.ANY
     to_agent = AgentEnum.EXECUTOR
-    response_template = allowed_response_templates(from_agent, to_agent)
+    action_list = permissions_dict[(from_agent, to_agent)]
+    print("action_list", action_list)
+    response_template = allowed_response_templates(from_agent, to_agent, action_list)
     
     assert "Allowed Response Templates TO EXECUTOR:" in response_template
     assert "Function 1. " in response_template
@@ -15,7 +17,8 @@ def test_allowed_response_templates():
 def test_allowed_response_templates_orchestrator_to_any():
     from_agent = AgentEnum.ORCHESTRATOR
     to_agent = AgentEnum.ANY
-    response_template = allowed_response_templates(from_agent, to_agent)
+    action_list = permissions_dict[(from_agent, to_agent)]
+    response_template = allowed_response_templates(from_agent, to_agent, action_list)
     
     assert "To invoke an agent, please respond with the text below" in response_template
     assert "Function 1. " in response_template
@@ -24,7 +27,8 @@ def test_allowed_response_templates_orchestrator_to_any():
 def test_allowed_response_templates_any_to_caller():
     from_agent = AgentEnum.ANY
     to_agent = AgentEnum.CALLER
-    response_template = allowed_response_templates(from_agent, to_agent)
+    action_list = permissions_dict[(from_agent, to_agent)]
+    response_template = allowed_response_templates(from_agent, to_agent, action_list)
     
     assert "Respond to the agent which invoked you" in response_template
     assert "Function 1. " in response_template
@@ -34,4 +38,5 @@ def test_allowed_response_templates_invalid_agents():
     from_agent = 'INVALID_AGENT'
     to_agent = AgentEnum.EXECUTOR
     with pytest.raises(KeyError):
-        allowed_response_templates(from_agent, to_agent)
\ No newline at end of file
+        action_list = permissions_dict[(from_agent, to_agent)]
+        allowed_response_templates(from_agent, to_agent, action_list)
\ No newline at end of file
diff --git a/messages/tests/test_init.py b/messages/tests/test_init.py
index 7d5b6595..72fb106a 100644
--- a/messages/tests/test_init.py
+++ b/messages/tests/test_init.py
@@ -46,6 +46,8 @@ def test_allowed_response_templates():
     # Test if allowed_response_templates function works as expected
     from_agent = AgentEnum.ANY
     to_agent = AgentEnum.EXECUTOR
-    response_template = allowed_response_templates(from_agent, to_agent)
+    action_list = permissions_dict[(from_agent, to_agent)]
+
+    response_template = allowed_response_templates(from_agent, to_agent, action_list)
     
     assert "Allowed Response Templates TO EXECUTOR:" in response_template
\ No newline at end of file
diff --git a/messages/tests/test_invoke_agent.py b/messages/tests/test_invoke_agent.py
index 89fb4eed..dbace7ce 100644
--- a/messages/tests/test_invoke_agent.py
+++ b/messages/tests/test_invoke_agent.py
@@ -26,5 +26,4 @@ def test_invoke_agent_message_description():
 def test_invoke_agent_message_instructions():
     message = InvokeAgentMessage()
     instructions = message.instructions()
-    
-    assert instructions == []
\ No newline at end of file
+    assert instructions == ["For first time invoking an agent, always use this action."]
\ No newline at end of file
diff --git a/messages/tests/test_invoke_agent_existing_session.py b/messages/tests/test_invoke_agent_existing_session.py
index 0003c2a1..c2ecd52e 100644
--- a/messages/tests/test_invoke_agent_existing_session.py
+++ b/messages/tests/test_invoke_agent_existing_session.py
@@ -26,4 +26,4 @@ def test_invoke_agent_existing_session_message_instructions():
     message = InvokeAgentExistingSessionMessage()
     instructions = message.instructions()
     
-    assert instructions == []
\ No newline at end of file
+    assert instructions == ["Never use this action while invoking an agent for the first time."]
\ No newline at end of file
diff --git a/messages/tests/test_read_agent_output_files.py b/messages/tests/test_read_agent_output_files.py
index edde7bf0..4f0b8222 100644
--- a/messages/tests/test_read_agent_output_files.py
+++ b/messages/tests/test_read_agent_output_files.py
@@ -25,5 +25,4 @@ def test_read_agent_output_files_message_description():
 def test_read_agent_output_files_message_instructions():
     message = ReadAgentOutputFilesMessage()
     instructions = message.instructions()
-    
-    assert instructions == ["The file paths must be in the following format: '{{Your Agent ID}}/{{file name}}'."]
\ No newline at end of file
+    assert instructions == ["The body must be in the following format: File paths: [\"{{Your_agent_id}}/{{file_name}}\"]"]
\ No newline at end of file
diff --git a/messages/tests/test_search_code_in_project.py b/messages/tests/test_search_code_in_project.py
new file mode 100644
index 00000000..f7bc32f1
--- /dev/null
+++ b/messages/tests/test_search_code_in_project.py
@@ -0,0 +1,36 @@
+import pytest
+import textwrap
+from sirji_messages.messages.actions.search_code_in_project import SearchCodeInProject
+
+def test_search_code_in_project_message_sample():
+    message = SearchCodeInProject()
+    sample_message = message.sample()
+
+    print(sample_message)
+    
+    expected_output = textwrap.dedent("""
+    ***
+    FROM: {{Your Agent ID}}
+    TO: EXECUTOR
+    ACTION: SEARCH_CODE_IN_PROJECT
+    SUMMARY: {{Display a concise summary to the user, describing the action using the present continuous tense.}}
+    BODY: 
+    Search Term: {{Search term}}
+    ---
+    ***
+    """)
+
+    print(expected_output)
+    
+    assert sample_message.strip() == expected_output.strip()
+
+def test_search_code_in_project_message_description():
+    message = SearchCodeInProject()
+    assert message.description() == "Search for code in a directory and all its subdirectories"
+
+def test_search_code_in_project_message_instructions():
+    message = SearchCodeInProject()
+    instructions = message.instructions()
+    
+    assert instructions == []
+
diff --git a/sirji/vscode-extension/src/defaults/recipes/node_js_create_api_and_test_cases.json b/sirji/vscode-extension/src/defaults/recipes/node_js_create_api_and_test_cases.json
new file mode 100644
index 00000000..32019213
--- /dev/null
+++ b/sirji/vscode-extension/src/defaults/recipes/node_js_create_api_and_test_cases.json
@@ -0,0 +1,13 @@
+{
+    "prescribed_tasks": [
+      {
+        "task": "Coordinate the invocation of agents to create an implementation guide for creating new Node.js API and execute each step of the guide.",
+        "agent": "NODE_JS_CREATE_API_CODER"
+      },
+      {
+        "task": "Coordinate the invocation of agents to create an implementation guide for writing test cases and execute each step of the guide.",
+        "agent": "NODE_JS_API_TESTER"
+      }
+    ],
+    "tips": []
+  }
\ No newline at end of file
diff --git a/sirji/vscode-extension/src/defaults/recipes/node_js_existing_api_test_cases.json b/sirji/vscode-extension/src/defaults/recipes/node_js_existing_api_test_cases.json
new file mode 100644
index 00000000..e2fb5c02
--- /dev/null
+++ b/sirji/vscode-extension/src/defaults/recipes/node_js_existing_api_test_cases.json
@@ -0,0 +1,9 @@
+{
+    "prescribed_tasks": [
+      {
+        "task": "Coordinate the invocation of agents to create an implementation guide for writing test cases and execute each step of the guide.",
+        "agent": "NODE_JS_API_TESTER"
+      }
+    ],
+    "tips": []
+  }
\ No newline at end of file