Canvas: Gemini API key validator

Change-Id: If185b7600c3fdd153345ab6f80c1b89f6504ddeb
diff --git a/apps/canvas/front/src/lib/config.ts b/apps/canvas/front/src/lib/config.ts
index f6dee32..e2ad19d 100644
--- a/apps/canvas/front/src/lib/config.ts
+++ b/apps/canvas/front/src/lib/config.ts
@@ -1,12 +1,12 @@
-import { AppNode, NodeType } from "config";
+import { AppNode, Env, NodeType, ServiceNode } from "config";
 import { Message, MessageType } from "./state";
 
 export interface Validator {
-	(nodes: AppNode[]): Message[];
+	(nodes: AppNode[], env: Env): Message[];
 }
 
 function CombineValidators(...v: Validator[]): Validator {
-	return (n) => v.flatMap((v) => v(n));
+	return (n, env) => v.flatMap((v) => v(n, env));
 }
 
 function MessageTypeToNumber(t: MessageType) {
@@ -44,9 +44,9 @@
 }
 
 function SortingValidator(v: Validator): Validator {
-	return (n) => {
-		const nt = new Map(n.map((n) => [n.id, NodeTypeToNumber(n.type)]));
-		return v(n).sort((a, b) => {
+	return (nodes, env) => {
+		const nt = new Map(nodes.map((n) => [n.id, NodeTypeToNumber(n.type)]));
+		return v(nodes, env).sort((a, b) => {
 			const at = MessageTypeToNumber(a.type);
 			const bt = MessageTypeToNumber(b.type);
 			if (a.nodeId === undefined && b.nodeId === undefined) {
@@ -86,6 +86,7 @@
 			ServiceAnalyzisValidator,
 			GatewayHTTPSValidator,
 			GatewayTCPValidator,
+			AgentApiKeyValidator,
 		),
 	);
 }
@@ -391,3 +392,15 @@
 		}));
 	return noNetwork.concat(notConnected);
 }
+
+function AgentApiKeyValidator(nodes: AppNode[], env: Env): Message[] {
+	return nodes
+		.filter((n): n is ServiceNode => n.type === "app" && n.data.type === "sketch:latest")
+		.filter((n) => n.data.agent?.geminiApiKey == null && !env.integrations.gemini)
+		.map((n) => ({
+			id: `${n.id}-no-agent-api-key`,
+			type: "FATAL",
+			nodeId: n.id,
+			message: "Configure Gemini API key either on the service or in the project integrations",
+		}));
+}
diff --git a/apps/canvas/front/src/lib/state.ts b/apps/canvas/front/src/lib/state.ts
index b5eac42..8f21c26 100644
--- a/apps/canvas/front/src/lib/state.ts
+++ b/apps/canvas/front/src/lib/state.ts
@@ -322,9 +322,11 @@
 		setOg(state);
 	};
 	const setN = (nodes: AppNode[]) => {
+		const env = get().env;
+		console.log("---env", env);
 		set({
 			nodes,
-			messages: v(nodes),
+			messages: v(nodes, env),
 		});
 	};
 
@@ -624,7 +626,7 @@
 		nodes: [],
 		edges: [],
 		categories: defaultCategories,
-		messages: v([]),
+		messages: [],
 		env: defaultEnv,
 		viewport: {
 			transformX: 0,