Canvas: Render AI agents in tabs

Implements AI Agent chat bubble, but is disabled for now.

Change-Id: If915691a22f376f347b76a5d24333dbe76492ca9
diff --git a/apps/canvas/back/package-lock.json b/apps/canvas/back/package-lock.json
index 03f0e80..25d7214 100644
--- a/apps/canvas/back/package-lock.json
+++ b/apps/canvas/back/package-lock.json
@@ -50,8 +50,11 @@
         "zod": "^3.24.4"
       },
       "devDependencies": {
+        "@types/jest": "^30.0.0",
         "eslint": "^9.13.0",
+        "jest": "^29.7.0",
         "prettier": "3.5.3",
+        "ts-jest": "^29.4.0",
         "typescript": "^5.8.3",
         "typescript-eslint": "^8.11.0"
       }
diff --git a/apps/canvas/back/src/app_manager.ts b/apps/canvas/back/src/app_manager.ts
index faf64e2..34bdd5e 100644
--- a/apps/canvas/back/src/app_manager.ts
+++ b/apps/canvas/back/src/app_manager.ts
@@ -1,11 +1,12 @@
 import axios from "axios";
 import { z } from "zod";
 
-const accessSchema = z.discriminatedUnion("type", [
+export const accessSchema = z.discriminatedUnion("type", [
 	z.object({
 		type: z.literal("https"),
 		name: z.string(),
 		address: z.string(),
+		agentName: z.string().optional(),
 	}),
 	z.object({
 		type: z.literal("ssh"),