Cavnas: Implement basic service discovery logic

Change-Id: I71b25076dba94d6491ad4db748b259870991c526
diff --git a/apps/canvas/back/src/lib/analyze.ts b/apps/canvas/back/src/lib/analyze.ts
new file mode 100644
index 0000000..e1fa699
--- /dev/null
+++ b/apps/canvas/back/src/lib/analyze.ts
@@ -0,0 +1,58 @@
+import { FileSystem } from "./fs";
+
+export interface ServiceAnalyzer {
+	detect: (fs: FileSystem, root: string) => boolean;
+	analyze: (fs: FileSystem, root: string) => Promise<ServiceInfo>;
+}
+
+export interface ConfigVar {
+	name: string;
+	category: ConfigVarCategory;
+	type?: ConfigVarType;
+	semanticType?: ConfigVarSemanticType;
+	// eslint-disable-next-line @typescript-eslint/no-explicit-any
+	defaultValue?: any;
+	description?: string;
+	required?: boolean;
+	sensitive?: boolean;
+}
+
+export enum ConfigVarCategory {
+	CommandLineFlag = "CommandLineFlag",
+	EnvironmentVariable = "EnvironmentVariable",
+}
+
+export enum ConfigVarType {
+	String = "String",
+	Number = "Number",
+	Boolean = "Boolean",
+}
+
+export enum ConfigVarSemanticType {
+	EXPANDED_ENV_VAR = "EXPANDED_ENV_VAR",
+	PORT = "PORT",
+	FILESYSTEM_PATH = "FILESYSTEM_PATH",
+	DATABASE_URL = "DATABASE_URL",
+	SQLITE_PATH = "SQLITE_PATH",
+	POSTGRES_URL = "POSTGRES_URL",
+	POSTGRES_PASSWORD = "POSTGRES_PASSWORD",
+	POSTGRES_USER = "POSTGRES_USER",
+	POSTGRES_DB = "POSTGRES_DB",
+	POSTGRES_PORT = "POSTGRES_PORT",
+	POSTGRES_HOST = "POSTGRES_HOST",
+	POSTGRES_SSL = "POSTGRES_SSL",
+	MONGO_URL = "MONGO_URL",
+	MONGO_PASSWORD = "MONGO_PASSWORD",
+	MONGO_USER = "MONGO_USER",
+	MONGO_DB = "MONGO_DB",
+	MONGO_PORT = "MONGO_PORT",
+	MONGO_HOST = "MONGO_HOST",
+	MONGO_SSL = "MONGO_SSL",
+}
+
+export interface ServiceInfo {
+	name: string;
+	location: string;
+	configVars: Array<ConfigVar>;
+	commands: Array<string>;
+}