@@ -1418,6 +1418,74 @@ const docTemplate = `{
14181418 }
14191419 }
14201420 },
1421+ "/workspaces/{id}/mcp/docker/disable": {
1422+ "post": {
1423+ "tags": [
1424+ "mcp"
1425+ ],
1426+ "summary": "Disable Docker MCP",
1427+ "parameters": [
1428+ {
1429+ "type": "string",
1430+ "description": "Workspace ID",
1431+ "name": "id",
1432+ "in": "path",
1433+ "required": true
1434+ }
1435+ ],
1436+ "responses": {
1437+ "200": {
1438+ "description": "OK"
1439+ },
1440+ "404": {
1441+ "description": "Not Found",
1442+ "schema": {
1443+ "$ref": "#/definitions/proto.Error"
1444+ }
1445+ },
1446+ "500": {
1447+ "description": "Internal Server Error",
1448+ "schema": {
1449+ "$ref": "#/definitions/proto.Error"
1450+ }
1451+ }
1452+ }
1453+ }
1454+ },
1455+ "/workspaces/{id}/mcp/docker/enable": {
1456+ "post": {
1457+ "tags": [
1458+ "mcp"
1459+ ],
1460+ "summary": "Enable Docker MCP",
1461+ "parameters": [
1462+ {
1463+ "type": "string",
1464+ "description": "Workspace ID",
1465+ "name": "id",
1466+ "in": "path",
1467+ "required": true
1468+ }
1469+ ],
1470+ "responses": {
1471+ "200": {
1472+ "description": "OK"
1473+ },
1474+ "404": {
1475+ "description": "Not Found",
1476+ "schema": {
1477+ "$ref": "#/definitions/proto.Error"
1478+ }
1479+ },
1480+ "500": {
1481+ "description": "Internal Server Error",
1482+ "schema": {
1483+ "$ref": "#/definitions/proto.Error"
1484+ }
1485+ }
1486+ }
1487+ }
1488+ },
14211489 "/workspaces/{id}/mcp/get-prompt": {
14221490 "post": {
14231491 "consumes": [
@@ -2618,6 +2686,23 @@ const docTemplate = `{
26182686 }
26192687 }
26202688 },
2689+ "config.HookConfig": {
2690+ "type": "object",
2691+ "properties": {
2692+ "command": {
2693+ "description": "Shell command to execute.",
2694+ "type": "string"
2695+ },
2696+ "matcher": {
2697+ "description": "Regex pattern tested against the tool name. Empty means match all.",
2698+ "type": "string"
2699+ },
2700+ "timeout": {
2701+ "description": "Timeout in seconds. Default 30.",
2702+ "type": "integer"
2703+ }
2704+ }
2705+ },
26212706 "config.LSPConfig": {
26222707 "type": "object",
26232708 "properties": {
@@ -2691,6 +2776,12 @@ const docTemplate = `{
26912776 "type": "string"
26922777 }
26932778 },
2779+ "enabled_tools": {
2780+ "type": "array",
2781+ "items": {
2782+ "type": "string"
2783+ }
2784+ },
26942785 "env": {
26952786 "type": "object",
26962787 "additionalProperties": {
@@ -2698,7 +2789,7 @@ const docTemplate = `{
26982789 }
26992790 },
27002791 "headers": {
2701− "description": "TODO: maybe make it possible to get the value from the env",
2792+ "description": "Headers are HTTP headers for HTTP/SSE MCP servers. Values run\nthrough shell expansion at MCP startup, so $VAR and $(cmd)\nwork. A header whose value resolves to the empty string (unset\nbare $VAR under lenient nounset, $(echo), or literal \"\") is\nomitted from the outgoing request rather than sent as\n\"Header:\".",
27022793 "type": "object",
27032794 "additionalProperties": {
27042795 "type": "string"
@@ -2881,6 +2972,15 @@ const docTemplate = `{
28812972 "$schema": {
28822973 "type": "string"
28832974 },
2975+ "hooks": {
2976+ "type": "object",
2977+ "additionalProperties": {
2978+ "type": "array",
2979+ "items": {
2980+ "$ref": "#/definitions/config.HookConfig"
2981+ }
2982+ }
2983+ },
28842984 "lsp": {
28852985 "$ref": "#/definitions/config.LSPs"
28862986 },
@@ -2939,7 +3039,7 @@ const docTemplate = `{
29393039 }
29403040 },
29413041 "data_directory": {
2942− "description": "DataDirectory is where Crush keeps per-project state such as the SQLite database and workspace overrides. Relative paths are resolved against the working directory; absolute paths are used verbatim. After defaulting the stored value is always absolute.",
3042+ "description": "DataDirectory is where Crush keeps per-project state such as\nthe SQLite database and workspace overrides. Relative paths are\nresolved against the working directory; absolute paths are used\nverbatim. After defaulting the stored value is always absolute.",
29433043 "type": "string"
29443044 },
29453045 "debug": {
@@ -2963,6 +3063,12 @@ const docTemplate = `{
29633063 "disable_provider_auto_update": {
29643064 "type": "boolean"
29653065 },
3066+ "disabled_skills": {
3067+ "type": "array",
3068+ "items": {
3069+ "type": "string"
3070+ }
3071+ },
29663072 "disabled_tools": {
29673073 "type": "array",
29683074 "items": {
@@ -3035,6 +3141,17 @@ const docTemplate = `{
30353141 "StateDisabled"
30363142 ]
30373143 },
3144+ "proto.APIKeyKind": {
3145+ "type": "string",
3146+ "enum": [
3147+ "string",
3148+ "oauth"
3149+ ],
3150+ "x-enum-varnames": [
3151+ "APIKeyKindString",
3152+ "APIKeyKindOAuth"
3153+ ]
3154+ },
30383155 "proto.AgentInfo": {
30393156 "type": "object",
30403157 "properties": {
@@ -3155,7 +3272,15 @@ const docTemplate = `{
31553272 "proto.ConfigProviderKeyRequest": {
31563273 "type": "object",
31573274 "properties": {
3158− "api_key": {},
3275+ "api_key": {
3276+ "type": "array",
3277+ "items": {
3278+ "type": "integer"
3279+ }
3280+ },
3281+ "kind": {
3282+ "$ref": "#/definitions/proto.APIKeyKind"
3283+ },
31593284 "provider_id": {
31603285 "type": "string"
31613286 },
@@ -3497,6 +3622,9 @@ const docTemplate = `{
34973622 "proto.VersionInfo": {
34983623 "type": "object",
34993624 "properties": {
3625+ "build_id": {
3626+ "type": "string"
3627+ },
35003628 "commit": {
35013629 "type": "string"
35023630 },