dodo: implement validate and deploy tools

Change-Id: I026cff45159dd1e6fa6a9bcef7c843564bcf9c8b
diff --git a/loop/agent.go b/loop/agent.go
index d1875bf..186bd1a 100644
--- a/loop/agent.go
+++ b/loop/agent.go
@@ -1416,6 +1416,9 @@
 	}()
 	browserTools = bTools
 
+	// TODO(gio): get these from the config
+	dodoTools := dodo_tools.NewDodoTools(os.Getenv("DODO_API_BASE_ADDR"), os.Getenv("DODO_PROJECT_ID"))
+
 	convo.Tools = []*llm.Tool{
 		bashTool.Tool(),
 		claudetool.Keyword,
@@ -1426,9 +1429,9 @@
 		makeDoneTool(a.codereview),
 		a.codereview.Tool(),
 		claudetool.AboutSketch,
-		dodo_tools.NewGetProjectConfigTool(),
 	}
 	convo.Tools = append(convo.Tools, browserTools...)
+	convo.Tools = append(convo.Tools, dodoTools...)
 
 	// Add MCP tools if configured
 	if len(a.config.MCPServers) > 0 {
diff --git a/loop/agent_system_prompt.txt b/loop/agent_system_prompt.txt
index c572752..99b3145 100644
--- a/loop/agent_system_prompt.txt
+++ b/loop/agent_system_prompt.txt
@@ -74,17 +74,24 @@
 
 <dodo>
 You are developing application on top of the dodo. dodo is a Platform As A Service infrastructure, allowing users to define their services and infrastructure needs.
-dodo infrastucture is configuration driven. Read <dodo-schema> section which provides JSON schema definition of the configuration.
-Use dodo tools to interact with dodo. Following two tools are implemented:
-1. dodo_get_project_config: Gets the current state of the application configuration. It requires two input fields: apiBaseAddress represents dodo API base address, and projectId which represents current dodo project ID you are working on. Use DODO_API_BASE_ADDR and DODO_PROJECT_ID env variables respectively.
-2. dodo_update_project_config: not implemented yet.
+dodo infrastucture is configuration driven, refer to <dodo-schema> section for configuration JSONSchema definition.
+Use following tools to interact with dodo:
+1. dodo_get_project_config: Gets the current state of the application configuration.
+2. dodo_validate_config: Takes dodo-app configuration and validates it. Returned result is a JSON object with boolean success field and optional errors array field.
+3. dodo_deploy_project: Takes new configuration and deployes it.
 
 You might want to use dodo tools in following scenarios:
 1. User explicitely asks to get the current configuration.
 2. User explicitely asks to add new infrastructure pieces or modify existing ones.
 3. User asks you to implement new feature which requires new infrastucture piece.
 
-When you are not sure about the modification you've made in the dodo app configuration, ask user for confirmation.
+When making changes in the dodo-app configuration, make sure it is valid before presenting your changes to user or sending it to dodo API for deployment.
+When validating inspect success and error fields and fix all errors. Use the todo_read and todo_write tools to organize and track your dodo-app configuration changes.
+
+Always pretty print dodo-app config before presenting it to the user.
+
+When you are not sure about the modification you've made in the dodo-app configuration, ask user for confirmation. When requesting confirmation, be very clear about it and formulate request as a question. Again, be very clear and terse when asking questions to the user.
+Use multiplechoice tool with Yes/No options when asking user confirmation.
 </dodo>
 
 <dodo-schema>
@@ -327,7 +334,7 @@
                         "properties": {
                             "name": {
                                 "type": "string",
-                                "description": "Name of the port (e.g., 'http', 'grpc')."
+                                "description": "Name of the port (e.g., 'http', 'grpc'). Port value will be available to the service at runtime as a DODO_PORT_<NAME> environment variable, where <NAME> is uppercased port name."
                             },
                             "value": {
                                 "type": "number",