webui: add go2ts go:generate line

This way I'm way more likely to actually run it.
And I think it means CI will check it too.
diff --git a/webui/esbuild.go b/webui/esbuild.go
index 8f1fcfe..fd8a459 100644
--- a/webui/esbuild.go
+++ b/webui/esbuild.go
@@ -23,6 +23,8 @@
 //go:embed package.json package-lock.json src tsconfig.json
 var embedded embed.FS
 
+//go:generate go run ../cmd/go2ts -o src/types.ts
+
 func embeddedHash() (string, error) {
 	h := sha256.New()
 	err := fs.WalkDir(embedded, ".", func(path string, d fs.DirEntry, err error) error {
diff --git a/webui/src/types.ts b/webui/src/types.ts
index 6eb32fc..e8bb746 100644
--- a/webui/src/types.ts
+++ b/webui/src/types.ts
@@ -62,24 +62,24 @@
 export interface State {
 	message_count: number;
 	total_usage?: CumulativeUsage | null;
-	hostname: string;
-	working_dir: string;
 	initial_commit: string;
 	title: string;
 	branch_name?: string;
+	hostname: string;
+	working_dir: string;
 	os: string;
+	git_origin?: string;
+	outstanding_llm_calls: number;
+	outstanding_tool_calls: string[] | null;
+	session_id: string;
+	ssh_available: boolean;
+	ssh_error?: string;
 	outside_hostname?: string;
 	inside_hostname?: string;
 	outside_os?: string;
 	inside_os?: string;
 	outside_working_dir?: string;
 	inside_working_dir?: string;
-	git_origin?: string;
-	outstanding_llm_calls: number;
-	outstanding_tool_calls: string[];
-	session_id: string;
-	ssh_available: boolean;
-	ssh_error?: string;
 }
 
 export type CodingAgentMessageType = 'user' | 'agent' | 'error' | 'budget' | 'tool' | 'commit' | 'auto';