Canvas: Makefile

Change-Id: I448a36bf60ee33fb4691d5312ac69b32ec38ec14
diff --git a/apps/canvas/config/src/config.ts b/apps/canvas/config/src/config.ts
index 6793bf7..0eb185c 100644
--- a/apps/canvas/config/src/config.ts
+++ b/apps/canvas/config/src/config.ts
@@ -69,7 +69,7 @@
 					ports: (n.data.ports || [])
 						.filter((p) => !n.data.dev?.enabled || (p.value != 22 && p.value != 9090))
 						.map((p) => ({
-							name: p.name.toLowerCase(),
+							name: p.name.toUpperCase(),
 							value: p.value,
 							protocol: "TCP", // TODO(gio)
 						})),
@@ -105,29 +105,35 @@
 					preBuildCommands: n.data.preBuildCommands
 						? n.data.preBuildCommands.split("\n").map((cmd) => ({ bin: cmd }))
 						: [],
-					dev: {
-						enabled: n.data.dev ? n.data.dev.enabled : false,
-						username: n.data.dev && n.data.dev.enabled ? env.user.username : undefined,
-						codeServer:
-							n.data.dev?.enabled && n.data.dev.expose != null
-								? {
-										network: networkMap.get(n.data.dev.expose.network)!,
-										subdomain: n.data.dev.expose.subdomain,
-									}
-								: undefined,
-						ssh:
-							n.data.dev?.enabled && n.data.dev.expose != null
-								? {
-										network: networkMap.get(n.data.dev.expose.network)!,
-										subdomain: n.data.dev.expose.subdomain,
-									}
-								: undefined,
-					},
-					agent: n.data.agent
+					dev: n.data.dev?.enabled
 						? {
-								geminiApiKey: n.data.agent.geminiApiKey,
+								enabled: true,
+								username: env.user.username,
+								codeServer:
+									n.data.dev.expose != null
+										? {
+												network: networkMap.get(n.data.dev.expose.network)!,
+												subdomain: n.data.dev.expose.subdomain,
+											}
+										: undefined,
+								ssh:
+									n.data.dev.expose != null
+										? {
+												network: networkMap.get(n.data.dev.expose.network)!,
+												subdomain: n.data.dev.expose.subdomain,
+											}
+										: undefined,
 							}
-						: undefined,
+						: {
+								enabled: false,
+							},
+					...(n.data.agent != null
+						? {
+								agent: {
+									geminiApiKey: n.data.agent.geminiApiKey,
+								},
+							}
+						: {}),
 				};
 			});
 		return {