npm package diff

Package: @forge/tunnel

Versions: 5.3.3-next.0-experimental-10722bc - 5.5.0-next.13

Modified:package/out/services/create-tunnel-service.js

Index: package/out/services/create-tunnel-service.js
===================================================================
--- package/out/services/create-tunnel-service.js
+++ package/out/services/create-tunnel-service.js
@@ -1,68 +1,13 @@
 "use strict";
 Object.defineProperty(exports, "__esModule", { value: true });
-exports.NgrokCreateTunnelService = exports.CloudflareCreateTunnelService = exports.TunnelServiceFacade = exports.CloudflareError = exports.NgrokError = exports.USER_NGROK_ERRORS = void 0;
-const tslib_1 = require("tslib");
-const ngrok = tslib_1.__importStar(require("ngrok"));
+exports.CloudflareCreateTunnelService = exports.CloudflareError = void 0;
 const cloudflared_1 = require("cloudflared");
 const url_1 = require("url");
 const cli_shared_1 = require("@forge/cli-shared");
-const path_1 = tslib_1.__importDefault(require("path"));
-exports.USER_NGROK_ERRORS = [
-    'ERR_NGROK_105',
-    'ERR_NGROK_108',
-    'ERR_NGROK_120',
-    'ERR_NGROK_714',
-    'ERR_NGROK_715',
-    'ERR_NGROK_718',
-    'ERR_NGROK_720',
-    'ERR_NGROK_725',
-    'ERR_NGROK_726',
-    'ERR_NGROK_727',
-    'ERR_NGROK_728',
-    'ERR_NGROK_734',
-    'ERR_NGROK_1226',
-    'ERR_NGROK_3208',
-    'no such file or directory',
-    'The system cannot find the file specified',
-    'context canceled'
-];
-class NgrokError extends cli_shared_1.BaseError {
-    constructor(message) {
-        super(undefined, cli_shared_1.Text.tunnel.error.ngrok(message));
-    }
-    isUserError() {
-        return exports.USER_NGROK_ERRORS.some((err) => this.message.includes(err));
-    }
-}
-exports.NgrokError = NgrokError;
 class CloudflareError extends cli_shared_1.BaseError {
 }
 exports.CloudflareError = CloudflareError;
-class TunnelServiceFacade {
-    featureFlagService;
-    logger;
-    instance;
-    constructor(featureFlagService, logger) {
-        this.featureFlagService = featureFlagService;
-        this.logger = logger;
-    }
-    async getInstance() {
-        if (!this.instance) {
-            this.instance = (await this.featureFlagService.isCloudflareTunnelEnabled())
-                ? new CloudflareCreateTunnelService(this.logger)
-                : new NgrokCreateTunnelService(this.logger);
-        }
-        return this.instance;
-    }
-    async establishTunnel({ port, tunnelConfigPath, id, token, tunnelUrl }) {
-        return (await this.getInstance()).establishTunnel({ port, tunnelConfigPath, id, token, tunnelUrl });
-    }
-    async closeTunnel() {
-        return (await this.getInstance()).closeTunnel();
-    }
-}
-exports.TunnelServiceFacade = TunnelServiceFacade;
 class CloudflareCreateTunnelService {
     logger;
     stopFunction;
     constructor(logger) {
@@ -95,52 +40,4 @@
         }
     }
 }
 exports.CloudflareCreateTunnelService = CloudflareCreateTunnelService;
-class NgrokCreateTunnelService {
-    logger;
-    endpoint;
-    constructor(logger) {
-        this.logger = logger;
-    }
-    async establishTunnel({ port, tunnelConfigPath }) {
-        const defaultConfigPath = path_1.default.join(__dirname, '..', '..', 'config', 'ngrok.yml');
-        let ngrokErrorMessage = undefined;
-        try {
-            const options = {
-                addr: port,
-                configPath: tunnelConfigPath ?? defaultConfigPath,
-                onStatusChange: (status) => {
-                    this.logger.debug(cli_shared_1.Text.tunnel.tunnelStatusChange(status));
-                },
-                onLogEvent: (data) => {
-                    const errorMatch = /err=(".+")$/m.exec(data);
-                    if (errorMatch && !data.includes('obj=updater')) {
-                        ngrokErrorMessage = errorMatch[1];
-                        try {
-                            ngrokErrorMessage = JSON.parse(ngrokErrorMessage);
-                        }
-                        catch { }
-                    }
-                    this.logger.debug(data);
-                }
-            };
-            this.endpoint = await ngrok.connect(options);
-            this.logger.debug(cli_shared_1.Text.tunnel.startedTunnel(this.endpoint));
-            return new url_1.URL(this.endpoint);
-        }
-        catch (e) {
-            throw new NgrokError(ngrokErrorMessage);
-        }
-    }
-    async closeTunnel() {
-        if (this.endpoint) {
-            try {
-                await ngrok.disconnect();
-                await ngrok.kill();
-            }
-            catch { }
-            this.endpoint = undefined;
-        }
-    }
-}
-exports.NgrokCreateTunnelService = NgrokCreateTunnelService;

Modified:package/out/servers/csp-reporter-server.js

Index: package/out/servers/csp-reporter-server.js
===================================================================
--- package/out/servers/csp-reporter-server.js
+++ package/out/servers/csp-reporter-server.js
@@ -35,9 +35,17 @@
     }
     async start() {
         return new Promise((resolve, reject) => {
             this.server = this.app.listen(this.port, resolve);
-            this.server.on('error', reject);
+            this.server.on('error', (err) => {
+                const error = err;
+                if (error.code === 'EADDRINUSE') {
+                    reject(new cli_shared_1.UserError(`Port ${this.port} is already in use. Please select a different port by setting the CSP_REPORTER_PORT environment variable`));
+                }
+                else {
+                    reject(err);
+                }
+            });
         });
     }
     async stop() {
         return new Promise((resolve, reject) => {

Modified:package/out/servers/custom-ui-tunnel-server.js

Index: package/out/servers/custom-ui-tunnel-server.js
===================================================================
--- package/out/servers/custom-ui-tunnel-server.js
+++ package/out/servers/custom-ui-tunnel-server.js
@@ -21,10 +21,13 @@
     socket;
     constructor(tunnelArgs) {
         super(tunnelArgs);
         this.tunnelArgs = tunnelArgs;
-        const { tunnel, permissions, remotes } = tunnelArgs;
+        const { tunnel, permissions, remotes, i18nConfig } = tunnelArgs;
         this.app = (0, express_1.default)();
+        if (i18nConfig) {
+            this.app.use(this.getI18nResourcesMiddleware(i18nConfig));
+        }
         this.app.use(this.getCustomUIHtmlTransformMiddleware(permissions, remotes));
         if (tunnel) {
             net_1.default.setDefaultAutoSelectFamily?.(true);
             const { port: tunnelPort } = tunnel;

Modified:package/out/servers/native-ui-tunnel-server.js

Index: package/out/servers/native-ui-tunnel-server.js
===================================================================
--- package/out/servers/native-ui-tunnel-server.js
+++ package/out/servers/native-ui-tunnel-server.js
@@ -12,9 +12,9 @@
     server;
     constructor(tunnelArgs) {
         super(tunnelArgs);
         this.tunnelArgs = tunnelArgs;
-        const { key, path, port, permissions, remotes } = tunnelArgs;
+        const { key, path, port, permissions, remotes, i18nConfig } = tunnelArgs;
         const entrypoint = { name: key, path, functions: [] };
         const config = (0, bundler_1.getNativeUiBuildConfig)([entrypoint]);
         const compiler = (0, bundler_1.getCompiler)({
             ...config,
@@ -36,8 +36,14 @@
                 middlewares.splice(index, 0, {
                     name: 'custom-ui-scripts-middleware',
                     middleware: this.getCustomUIHtmlTransformMiddleware(permissions, remotes)
                 });
+                if (i18nConfig) {
+                    middlewares.unshift({
+                        name: 'i18n-resources-middleware',
+                        middleware: this.getI18nResourcesMiddleware(i18nConfig)
+                    });
+                }
                 middlewares.unshift({
                     name: 'logging-middleware',
                     middleware: (req, _, next) => {
                         this.logFileServed(req.url, (input) => cli_shared_1.Text.tunnel.customUI.fileServed(input, this.key));

Modified:package/out/services/register-tunnel-service.js

Index: package/out/services/register-tunnel-service.js
===================================================================
--- package/out/services/register-tunnel-service.js
+++ package/out/services/register-tunnel-service.js
@@ -3,12 +3,10 @@
 exports.RegisterTunnelServiceImpl = void 0;
 const ONE_DAY = 1000 * 60 * 60 * 24;
 class RegisterTunnelServiceImpl {
     tunnelClient;
-    featureFlagService;
-    constructor(tunnelClient, featureFlagService) {
+    constructor(tunnelClient) {
         this.tunnelClient = tunnelClient;
-        this.featureFlagService = featureFlagService;
         this.keepAliveActive = true;
     }
     keepAliveHandler;
     keepAliveActive;
@@ -19,16 +17,9 @@
         const expiry = await this.tunnelClient.createAppTunnels(appId, environmentKey, tunnelDefinitions);
         await this.keepTunnelsAlive(appId, environmentKey, tunnelDefinitions, expiry);
     }
     async setupTunnel(appId, environmentKey) {
-        if (await this.featureFlagService.isCloudflareTunnelEnabled()) {
-            return await this.tunnelClient.setupTunnel(appId, environmentKey);
-        }
-        return {
-            token: undefined,
-            id: undefined,
-            url: undefined
-        };
+        return await this.tunnelClient.setupTunnel(appId, environmentKey);
     }
     async unregisterTunnels(appId, environmentKey) {
         if (this.keepAliveHandler) {
             clearTimeout(this.keepAliveHandler);

Modified:package/out/servers/resource-tunnel-server.js

Index: package/out/servers/resource-tunnel-server.js
===================================================================
--- package/out/servers/resource-tunnel-server.js
+++ package/out/servers/resource-tunnel-server.js
@@ -34,9 +34,9 @@
     }
     getCspHeader = (existingCsp) => new csp_1.CSPInjectionService()
         .getInjectableCSP({
         existingCSPDetails: existingCsp,
-        microsEnv: (0, cli_shared_1.getEnvironment)(cli_shared_1.CDNEnvironments),
+        microsEnv: (0, cli_shared_1.getEnvironmentConfig)(cli_shared_1.CDNEnvironments),
         tunnelCSPReporterUri: `http://localhost:${this.cspReporterServerPort}`
     })
         .join('; ');
     injectGlobalBridgeScript = (htmlContent) => new cli_shared_1.BridgeScriptService().injectBridgeCore(htmlContent, () => {
@@ -55,6 +55,20 @@
         const cspDetails = new csp_1.CSPProcessingService({ info: () => { } }).getCspDetails(htmlContentWithBridgeScript, ResourceTunnelServer.transformPermissionsWithRemotes(permissions, remotes));
         res.setHeader('Content-Security-Policy', this.getCspHeader(cspDetails));
         return htmlContentWithBridgeScript;
     });
+    getI18nResourcesMiddleware = (i18nConfig) => {
+        const i18nResourcesPathRegex = /^\/__LOCALES__\/(.+)\.json$/i;
+        const i18nResourceFileAccessor = new cli_shared_1.I18nResourceBundlingService().createFileAccessor(i18nConfig);
+        return async (req, resp, next) => {
+            const locale = i18nResourcesPathRegex.exec(req.path)?.[1];
+            if (!locale)
+                return next();
+            const file = await i18nResourceFileAccessor(locale);
+            if (!file)
+                return next();
+            resp.setHeader('Content-Type', 'application/json');
+            resp.status(200).send(file);
+        };
+    };
 }
 exports.ResourceTunnelServer = ResourceTunnelServer;

Modified:package/out/command/start-tunnel-command.js

Index: package/out/command/start-tunnel-command.js
===================================================================
--- package/out/command/start-tunnel-command.js
+++ package/out/command/start-tunnel-command.js
@@ -4,8 +4,9 @@
 const tslib_1 = require("tslib");
 const cli_shared_1 = require("@forge/cli-shared");
 const runtime_1 = require("@forge/runtime");
 const node_cache_1 = tslib_1.__importDefault(require("node-cache"));
+const portfinder_1 = require("portfinder");
 const servers_1 = require("../servers");
 const index_1 = require("../index");
 class StartTunnelCommand {
     getAppConfig;
@@ -38,15 +39,14 @@
             ...Object.values(this.tunnelServers).map((server) => server.stop()),
             this.cspReporterServer?.stop()
         ]);
     };
-    startFaaSTunnelServer = async ({ port, tunnelConfigPath, appId, environmentKey }) => {
+    startFaaSTunnelServer = async ({ port, appId, environmentKey }) => {
         const { permissions = {}, remotes = [] } = await this.configFile.readConfig();
         const serverInfo = await this.devServer.start(port, permissions, remotes);
         const { id, token, url } = await this.tunnelClient.setupTunnel(appId, environmentKey);
         const faasTunnelUrl = await this.tunnelFactory.establishTunnel({
             port: serverInfo.port,
-            tunnelConfigPath,
             id,
             token,
             tunnelUrl: url
         });
@@ -56,10 +56,11 @@
         };
     };
     startResourceBasedTunnelsServers = async (resourceDetails, options) => {
         const portMap = options.resourcePortMap ?? JSON.parse(process.env.RESOURCE_PORT_MAP ?? '{}');
-        const { permissions = {}, remotes = [] } = await this.configFile.readConfig();
-        const cspReporterPort = parseInt(process.env.CSP_REPORTER_PORT ?? '4000', 10);
+        const { permissions = {}, remotes = [], translations: i18nConfig } = await this.configFile.readConfig();
+        const availablePort = await (0, portfinder_1.getPortPromise)({ port: 4000 });
+        const cspReporterPort = process.env.CSP_REPORTER_PORT ? parseInt(process.env.CSP_REPORTER_PORT, 10) : availablePort;
         if (resourceDetails.length === 0)
             return [];
         this.cspReporterServer = new servers_1.CspReporterServer(cspReporterPort, this.logger, new node_cache_1.default());
         await this.cspReporterServer.start();
@@ -73,9 +74,10 @@
                 host: options.host,
                 logger: this.logger,
                 cspReporterServerPort: cspReporterPort,
                 permissions,
-                remotes
+                remotes,
+                i18nConfig
             });
             return this.tunnelServers[key].start();
         }));
     };
@@ -85,9 +87,8 @@
         const allResources = await this.configFile.getResources();
         try {
             const faasTunnelServer = await this.startFaaSTunnelServer({
                 port,
-                tunnelConfigPath: options.ngrokConfig,
                 appId,
                 environmentKey
             });
             const customUITunnelsServers = await this.startResourceBasedTunnelsServers(allResources, options);

Modified:package/package.json

Index: package/package.json
===================================================================
--- package/package.json
+++ package/package.json
@@ -1,7 +1,7 @@
 {
   "name": "@forge/tunnel",
-  "version": "5.3.3-next.0-experimental-10722bc",
+  "version": "5.5.0-next.13",
   "description": "Tunnel functionality for Forge CLI",
   "author": "Atlassian",
   "license": "UNLICENSED",
   "main": "out/index.js",
@@ -10,27 +10,27 @@
     "clean": "rm -rf ./out && rm -f tsconfig.tsbuildinfo",
     "compile": "tsc -b -v"
   },
   "dependencies": {
-    "@forge/bundler": "4.17.4-next.0-experimental-10722bc",
-    "@forge/cli-shared": "5.3.1-next.0-experimental-10722bc",
-    "@forge/csp": "3.2.2-experimental-10722bc",
-    "@forge/runtime": "5.9.0",
+    "@forge/bundler": "4.19.0-next.13",
+    "@forge/cli-shared": "5.5.0-next.12",
+    "@forge/csp": "3.3.0",
+    "@forge/runtime": "5.10.1",
     "chokidar": "^3.6.0",
     "cloudflared": "^0.5.2",
     "express": "^4.18.3",
     "express-intercept": "^1.1.0",
     "http-proxy-middleware": "^2.0.6",
-    "ngrok": "^5.0.0-beta.2",
     "node-cache": "^5.1.2",
+    "portfinder": "^1.0.32",
     "tmp": "^0.2.3",
     "tslib": "^2.6.2",
     "uuid": "^9.0.1",
     "webpack-dev-server": "^4.15.1"
   },
   "devDependencies": {
     "@atlassian/xen-test-util": "^4.2.0",
-    "@forge/manifest": "7.5.2-next.0-experimental-10722bc",
+    "@forge/manifest": "7.7.0-next.12",
     "@types/express": "^4.17.21",
     "@types/jest": "^29.5.12",
     "@types/node": "14.18.63",
     "@types/supertest": "^2.0.16",

Modified:package/out/services/create-tunnel-service.d.ts.map

Index: package/out/services/create-tunnel-service.d.ts.map
===================================================================
--- package/out/services/create-tunnel-service.d.ts.map
+++ package/out/services/create-tunnel-service.d.ts.map
@@ -1,1 +1,1 @@
-{"version":3,"file":"create-tunnel-service.d.ts","sourceRoot":"","sources":["../../src/services/create-tunnel-service.ts"],"names":[],"mappings":";AAEA,OAAO,EAAE,GAAG,EAAE,MAAM,KAAK,CAAC;AAE1B,OAAO,EAAE,SAAS,EAAE,kBAAkB,EAAE,MAAM,EAAQ,MAAM,mBAAmB,CAAC;AAGhF,oBAAY,iBAAiB,GAAG;IAC9B,gBAAgB,EAAE,MAAM,GAAG,SAAS,CAAC;CACtC,CAAC;AAEF,oBAAY,sBAAsB,GAAG;IACnC,KAAK,EAAE,MAAM,GAAG,IAAI,GAAG,SAAS,CAAC;IACjC,EAAE,EAAE,MAAM,GAAG,IAAI,GAAG,SAAS,CAAC;IAC9B,SAAS,EAAE,MAAM,GAAG,IAAI,GAAG,SAAS,CAAC;CACtC,CAAC;AAEF,oBAAY,YAAY,GAAG;IACzB,IAAI,EAAE,MAAM,CAAC;CACd,GAAG,iBAAiB,GACnB,sBAAsB,CAAC;AAEzB,MAAM,WAAW,mBAAmB;IAClC,eAAe,CAAC,EAAE,IAAI,EAAE,gBAAgB,EAAE,KAAK,EAAE,EAAE,EAAE,SAAS,EAAE,EAAE,YAAY,GAAG,OAAO,CAAC,GAAG,CAAC,CAAC;IAC9F,WAAW,IAAI,OAAO,CAAC,IAAI,CAAC,CAAC;CAC9B;AAGD,eAAO,MAAM,iBAAiB,UAkB7B,CAAC;AACF,qBAAa,UAAW,SAAQ,SAAS;gBAC3B,OAAO,CAAC,EAAE,MAAM;IAIrB,WAAW;CAGnB;AAED,qBAAa,eAAgB,SAAQ,SAAS;CAAG;AAKjD,qBAAa,mBAAoB,YAAW,mBAAmB;IAI3D,OAAO,CAAC,QAAQ,CAAC,kBAAkB;IACnC,OAAO,CAAC,QAAQ,CAAC,MAAM;IAJzB,OAAO,CAAC,QAAQ,CAAkC;gBAG/B,kBAAkB,EAAE,kBAAkB,EACtC,MAAM,EAAE,MAAM;YAGnB,WAAW;IASZ,eAAe,CAAC,EAAE,IAAI,EAAE,gBAAgB,EAAE,EAAE,EAAE,KAAK,EAAE,SAAS,EAAE,EAAE,YAAY,GAAG,OAAO,CAAC,GAAG,CAAC;IAI7F,WAAW,IAAI,OAAO,CAAC,IAAI,CAAC;CAG1C;AAED,qBAAa,6BAA8B,YAAW,mBAAmB;IAG3D,OAAO,CAAC,QAAQ,CAAC,MAAM;IAFnC,OAAO,CAAC,YAAY,CAA0E;gBAEjE,MAAM,EAAE,MAAM;IAE9B,eAAe,CAAC,EAAE,IAAI,EAAE,EAAE,EAAE,KAAK,EAAE,SAAS,EAAE,EAAE,YAAY,GAAG,OAAO,CAAC,GAAG,CAAC;IAwB3E,WAAW,IAAI,OAAO,CAAC,IAAI,CAAC;CAQ1C;AAED,qBAAa,wBAAyB,YAAW,mBAAmB;IAGtD,OAAO,CAAC,QAAQ,CAAC,MAAM;IAFnC,OAAO,CAAC,QAAQ,CAAqB;gBAER,MAAM,EAAE,MAAM;IAE9B,eAAe,CAAC,EAAE,IAAI,EAAE,gBAAgB,EAAE,EAAE,YAAY,GAAG,OAAO,CAAC,GAAG,CAAC;IAsCvE,WAAW,IAAI,OAAO,CAAC,IAAI,CAAC;CAkB1C"}
\ No newline at end of file
+{"version":3,"file":"create-tunnel-service.d.ts","sourceRoot":"","sources":["../../src/services/create-tunnel-service.ts"],"names":[],"mappings":";AACA,OAAO,EAAE,GAAG,EAAE,MAAM,KAAK,CAAC;AAE1B,OAAO,EAAE,SAAS,EAAE,MAAM,EAAQ,MAAM,mBAAmB,CAAC;AAE5D,oBAAY,sBAAsB,GAAG;IACnC,KAAK,EAAE,MAAM,GAAG,IAAI,GAAG,SAAS,CAAC;IACjC,EAAE,EAAE,MAAM,GAAG,IAAI,GAAG,SAAS,CAAC;IAC9B,SAAS,EAAE,MAAM,GAAG,IAAI,GAAG,SAAS,CAAC;CACtC,CAAC;AAEF,oBAAY,YAAY,GAAG;IACzB,IAAI,EAAE,MAAM,CAAC;CACd,GAAG,sBAAsB,CAAC;AAE3B,MAAM,WAAW,mBAAmB;IAClC,eAAe,CAAC,EAAE,IAAI,EAAE,KAAK,EAAE,EAAE,EAAE,SAAS,EAAE,EAAE,YAAY,GAAG,OAAO,CAAC,GAAG,CAAC,CAAC;IAC5E,WAAW,IAAI,OAAO,CAAC,IAAI,CAAC,CAAC;CAC9B;AAED,qBAAa,eAAgB,SAAQ,SAAS;CAAG;AAEjD,qBAAa,6BAA8B,YAAW,mBAAmB;IAG3D,OAAO,CAAC,QAAQ,CAAC,MAAM;IAFnC,OAAO,CAAC,YAAY,CAA0E;gBAEjE,MAAM,EAAE,MAAM;IAE9B,eAAe,CAAC,EAAE,IAAI,EAAE,EAAE,EAAE,KAAK,EAAE,SAAS,EAAE,EAAE,YAAY,GAAG,OAAO,CAAC,GAAG,CAAC;IAwB3E,WAAW,IAAI,OAAO,CAAC,IAAI,CAAC;CAQ1C"}
\ No newline at end of file

Modified:package/out/servers/csp-reporter-server.d.ts.map

Index: package/out/servers/csp-reporter-server.d.ts.map
===================================================================
--- package/out/servers/csp-reporter-server.d.ts.map
+++ package/out/servers/csp-reporter-server.d.ts.map
@@ -1,1 +1,1 @@
-{"version":3,"file":"csp-reporter-server.d.ts","sourceRoot":"","sources":["../../src/servers/csp-reporter-server.ts"],"names":[],"mappings":"AAAA,OAAgB,EAAE,OAAO,EAAqB,MAAM,SAAS,CAAC;AAC9D,OAAO,EAAE,MAAM,EAAQ,MAAM,mBAAmB,CAAC;AAEjD,OAAO,SAAS,MAAM,YAAY,CAAC;AAYnC,qBAAa,iBAAiB;IAM1B,OAAO,CAAC,QAAQ,CAAC,IAAI;IACrB,OAAO,CAAC,QAAQ,CAAC,MAAM;IACvB,OAAO,CAAC,QAAQ,CAAC,KAAK;IAPxB,OAAO,CAAC,QAAQ,CAAC,GAAG,CAAU;IAC9B,OAAO,CAAC,MAAM,CAAqB;IACnC,OAAO,CAAC,MAAM,CAAC,cAAc,CAAM;gBAGhB,IAAI,EAAE,MAAM,EACZ,MAAM,EAAE,MAAM,EACd,KAAK,EAAE,SAAS;IAwBnC,MAAM,IAAI,OAAO;IAIX,KAAK,IAAI,OAAO,CAAC,IAAI,CAAC;IAOtB,IAAI,IAAI,OAAO,CAAC,IAAI,CAAC;CAK5B"}
\ No newline at end of file
+{"version":3,"file":"csp-reporter-server.d.ts","sourceRoot":"","sources":["../../src/servers/csp-reporter-server.ts"],"names":[],"mappings":"AAAA,OAAgB,EAAE,OAAO,EAAqB,MAAM,SAAS,CAAC;AAC9D,OAAO,EAAE,MAAM,EAAmB,MAAM,mBAAmB,CAAC;AAE5D,OAAO,SAAS,MAAM,YAAY,CAAC;AAYnC,qBAAa,iBAAiB;IAM1B,OAAO,CAAC,QAAQ,CAAC,IAAI;IACrB,OAAO,CAAC,QAAQ,CAAC,MAAM;IACvB,OAAO,CAAC,QAAQ,CAAC,KAAK;IAPxB,OAAO,CAAC,QAAQ,CAAC,GAAG,CAAU;IAC9B,OAAO,CAAC,MAAM,CAAqB;IACnC,OAAO,CAAC,MAAM,CAAC,cAAc,CAAM;gBAGhB,IAAI,EAAE,MAAM,EACZ,MAAM,EAAE,MAAM,EACd,KAAK,EAAE,SAAS;IAwBnC,MAAM,IAAI,OAAO;IAIX,KAAK,IAAI,OAAO,CAAC,IAAI,CAAC;IAkBtB,IAAI,IAAI,OAAO,CAAC,IAAI,CAAC;CAK5B"}
\ No newline at end of file

Modified:package/out/servers/custom-ui-tunnel-server.d.ts.map

Index: package/out/servers/custom-ui-tunnel-server.d.ts.map
===================================================================
--- package/out/servers/custom-ui-tunnel-server.d.ts.map
+++ package/out/servers/custom-ui-tunnel-server.d.ts.map
@@ -1,1 +1,1 @@
-{"version":3,"file":"custom-ui-tunnel-server.d.ts","sourceRoot":"","sources":["../../src/servers/custom-ui-tunnel-server.ts"],"names":[],"mappings":"AAGA,OAAgB,EAAE,OAAO,EAAqB,MAAM,SAAS,CAAC;AAG9D,OAAO,EAAE,oBAAoB,EAAE,wBAAwB,EAAE,MAAM,0BAA0B,CAAC;AAE1F,OAAO,EAAE,iBAAiB,EAAE,oBAAoB,EAAc,MAAM,cAAc,CAAC;AASnF,qBAAa,oBAAqB,SAAQ,oBAAqB,YAAW,iBAAiB;IAM7E,OAAO,CAAC,QAAQ,CAAC,UAAU;IALvC,OAAO,CAAC,QAAQ,CAAC,GAAG,CAAU;IAC9B,OAAO,CAAC,MAAM,CAAqB;IACnC,OAAO,CAAC,QAAQ,CAAC,KAAK,CAA6B;IACnD,OAAO,CAAC,MAAM,CAAqB;gBAEN,UAAU,EAAE,wBAAwB;IAyD3D,KAAK,IAAI,OAAO,CAAC,QAAQ,CAAC,oBAAoB,CAAC,CAAC;IAkBhD,IAAI,IAAI,OAAO,CAAC,IAAI,CAAC;IASd,eAAe,IAAI,OAAO,CAAC,GAAG,CAAC;IAK5C,MAAM,IAAI,OAAO;IAIjB,OAAO,CAAC,gCAAgC;IAoBxC,OAAO,CAAC,sBAAsB;CAO/B"}
\ No newline at end of file
+{"version":3,"file":"custom-ui-tunnel-server.d.ts","sourceRoot":"","sources":["../../src/servers/custom-ui-tunnel-server.ts"],"names":[],"mappings":"AAGA,OAAgB,EAAE,OAAO,EAAqB,MAAM,SAAS,CAAC;AAG9D,OAAO,EAAE,oBAAoB,EAAE,wBAAwB,EAAE,MAAM,0BAA0B,CAAC;AAE1F,OAAO,EAAE,iBAAiB,EAAE,oBAAoB,EAAc,MAAM,cAAc,CAAC;AASnF,qBAAa,oBAAqB,SAAQ,oBAAqB,YAAW,iBAAiB;IAM7E,OAAO,CAAC,QAAQ,CAAC,UAAU;IALvC,OAAO,CAAC,QAAQ,CAAC,GAAG,CAAU;IAC9B,OAAO,CAAC,MAAM,CAAqB;IACnC,OAAO,CAAC,QAAQ,CAAC,KAAK,CAA6B;IACnD,OAAO,CAAC,MAAM,CAAqB;gBAEN,UAAU,EAAE,wBAAwB;IA4D3D,KAAK,IAAI,OAAO,CAAC,QAAQ,CAAC,oBAAoB,CAAC,CAAC;IAkBhD,IAAI,IAAI,OAAO,CAAC,IAAI,CAAC;IASd,eAAe,IAAI,OAAO,CAAC,GAAG,CAAC;IAK5C,MAAM,IAAI,OAAO;IAIjB,OAAO,CAAC,gCAAgC;IAoBxC,OAAO,CAAC,sBAAsB;CAO/B"}
\ No newline at end of file

Modified:package/out/servers/native-ui-tunnel-server.d.ts.map

Index: package/out/servers/native-ui-tunnel-server.d.ts.map
===================================================================
--- package/out/servers/native-ui-tunnel-server.d.ts.map
+++ package/out/servers/native-ui-tunnel-server.d.ts.map
@@ -1,1 +1,1 @@
-{"version":3,"file":"native-ui-tunnel-server.d.ts","sourceRoot":"","sources":["../../src/servers/native-ui-tunnel-server.ts"],"names":[],"mappings":"AAAA,OAAO,gBAA+D,MAAM,oBAAoB,CAAC;AACjG,OAAO,EAAE,aAAa,EAAuE,MAAM,gBAAgB,CAAC;AACpH,OAAO,EAAE,oBAAoB,EAAE,wBAAwB,EAAE,MAAM,0BAA0B,CAAC;AAG1F,OAAO,EAAE,iBAAiB,EAAE,oBAAoB,EAAE,UAAU,EAAE,MAAM,cAAc,CAAC;AAEnF,qBAAa,oBAAqB,SAAQ,oBAAqB,YAAW,iBAAiB;IAG7E,OAAO,CAAC,QAAQ,CAAC,UAAU;IAFvC,SAAgB,MAAM,EAAE,gBAAgB,CAAC;gBAEZ,UAAU,EAAE,wBAAwB;IAoD3D,KAAK,IAAI,OAAO,CAAC,QAAQ,CAAC,oBAAoB,CAAC,CAAC;IAWzC,eAAe,CAAC,EAAE,gBAAgB,EAAE,eAAe,EAAE,EAAE,UAAU,GAAG,OAAO,CAAC,aAAa,CAAC;IAwCjG,IAAI,IAAI,OAAO,CAAC,IAAI,CAAC;CAG5B"}
\ No newline at end of file
+{"version":3,"file":"native-ui-tunnel-server.d.ts","sourceRoot":"","sources":["../../src/servers/native-ui-tunnel-server.ts"],"names":[],"mappings":"AAAA,OAAO,gBAA+D,MAAM,oBAAoB,CAAC;AACjG,OAAO,EAAE,aAAa,EAAuE,MAAM,gBAAgB,CAAC;AACpH,OAAO,EAAE,oBAAoB,EAAE,wBAAwB,EAAE,MAAM,0BAA0B,CAAC;AAG1F,OAAO,EAAE,iBAAiB,EAAE,oBAAoB,EAAE,UAAU,EAAE,MAAM,cAAc,CAAC;AAEnF,qBAAa,oBAAqB,SAAQ,oBAAqB,YAAW,iBAAiB;IAG7E,OAAO,CAAC,QAAQ,CAAC,UAAU;IAFvC,SAAgB,MAAM,EAAE,gBAAgB,CAAC;gBAEZ,UAAU,EAAE,wBAAwB;IA2D3D,KAAK,IAAI,OAAO,CAAC,QAAQ,CAAC,oBAAoB,CAAC,CAAC;IAWzC,eAAe,CAAC,EAAE,gBAAgB,EAAE,eAAe,EAAE,EAAE,UAAU,GAAG,OAAO,CAAC,aAAa,CAAC;IAwCjG,IAAI,IAAI,OAAO,CAAC,IAAI,CAAC;CAG5B"}
\ No newline at end of file

Modified:package/out/services/register-tunnel-service.d.ts.map

Index: package/out/services/register-tunnel-service.d.ts.map
===================================================================
--- package/out/services/register-tunnel-service.d.ts.map
+++ package/out/services/register-tunnel-service.d.ts.map
@@ -1,1 +1,1 @@
-{"version":3,"file":"register-tunnel-service.d.ts","sourceRoot":"","sources":["../../src/services/register-tunnel-service.ts"],"names":[],"mappings":"AAAA,OAAO,EAAE,YAAY,EAAE,iBAAiB,EAAE,WAAW,EAAE,MAAM,YAAY,CAAC;AAC1E,OAAO,EAAE,kBAAkB,EAAE,MAAM,mBAAmB,CAAC;AAIvD,MAAM,WAAW,qBAAqB;IACpC,WAAW,CAAC,KAAK,EAAE,MAAM,EAAE,cAAc,EAAE,MAAM,GAAG,OAAO,CAAC,WAAW,CAAC,CAAC;IACzE,eAAe,CAAC,KAAK,EAAE,MAAM,EAAE,cAAc,EAAE,MAAM,EAAE,iBAAiB,EAAE,iBAAiB,GAAG,OAAO,CAAC,IAAI,CAAC,CAAC;IAC5G,iBAAiB,CAAC,KAAK,EAAE,MAAM,EAAE,cAAc,EAAE,MAAM,GAAG,OAAO,CAAC,IAAI,CAAC,CAAC;CACzE;AAED,qBAAa,yBAA0B,YAAW,qBAAqB;IAEnE,OAAO,CAAC,QAAQ,CAAC,YAAY;IAC7B,OAAO,CAAC,QAAQ,CAAC,kBAAkB;gBADlB,YAAY,EAAE,YAAY,EAC1B,kBAAkB,EAAE,kBAAkB;IAKzD,OAAO,CAAC,gBAAgB,CAA6B;IACrD,OAAO,CAAC,eAAe,CAAU;IAEpB,eAAe,CAAC,KAAK,EAAE,MAAM,EAAE,cAAc,EAAE,MAAM,EAAE,iBAAiB,EAAE,iBAAiB;IAQ3F,WAAW,CAAC,KAAK,EAAE,MAAM,EAAE,cAAc,EAAE,MAAM;IAWjD,iBAAiB,CAAC,KAAK,EAAE,MAAM,EAAE,cAAc,EAAE,MAAM;YAQtD,gBAAgB;IAoB9B,OAAO,CAAC,MAAM;CAaf"}
\ No newline at end of file
+{"version":3,"file":"register-tunnel-service.d.ts","sourceRoot":"","sources":["../../src/services/register-tunnel-service.ts"],"names":[],"mappings":"AAAA,OAAO,EAAE,YAAY,EAAE,iBAAiB,EAAE,WAAW,EAAE,MAAM,YAAY,CAAC;AAI1E,MAAM,WAAW,qBAAqB;IACpC,WAAW,CAAC,KAAK,EAAE,MAAM,EAAE,cAAc,EAAE,MAAM,GAAG,OAAO,CAAC,WAAW,CAAC,CAAC;IACzE,eAAe,CAAC,KAAK,EAAE,MAAM,EAAE,cAAc,EAAE,MAAM,EAAE,iBAAiB,EAAE,iBAAiB,GAAG,OAAO,CAAC,IAAI,CAAC,CAAC;IAC5G,iBAAiB,CAAC,KAAK,EAAE,MAAM,EAAE,cAAc,EAAE,MAAM,GAAG,OAAO,CAAC,IAAI,CAAC,CAAC;CACzE;AAED,qBAAa,yBAA0B,YAAW,qBAAqB;IACzD,OAAO,CAAC,QAAQ,CAAC,YAAY;gBAAZ,YAAY,EAAE,YAAY;IAIvD,OAAO,CAAC,gBAAgB,CAA6B;IACrD,OAAO,CAAC,eAAe,CAAU;IAEpB,eAAe,CAAC,KAAK,EAAE,MAAM,EAAE,cAAc,EAAE,MAAM,EAAE,iBAAiB,EAAE,iBAAiB;IAQ3F,WAAW,CAAC,KAAK,EAAE,MAAM,EAAE,cAAc,EAAE,MAAM;IAIjD,iBAAiB,CAAC,KAAK,EAAE,MAAM,EAAE,cAAc,EAAE,MAAM;YAQtD,gBAAgB;IAoB9B,OAAO,CAAC,MAAM;CAaf"}
\ No newline at end of file

Modified:package/out/servers/resource-tunnel-server.d.ts.map

Index: package/out/servers/resource-tunnel-server.d.ts.map
===================================================================
--- package/out/servers/resource-tunnel-server.d.ts.map
+++ package/out/servers/resource-tunnel-server.d.ts.map
@@ -1,1 +1,1 @@
-{"version":3,"file":"resource-tunnel-server.d.ts","sourceRoot":"","sources":["../../src/servers/resource-tunnel-server.ts"],"names":[],"mappings":";AACA,OAAO,EAAE,cAAc,EAAE,MAAM,uBAAuB,CAAC;AACvD,OAAO,EACL,QAAQ,EAMR,MAAM,EAEP,MAAM,mBAAmB,CAAC;AAC3B,OAAO,EAAE,UAAU,EAA6C,MAAM,YAAY,CAAC;AACnF,OAAO,KAAK,EAAE,WAAW,EAAE,OAAO,EAAE,MAAM,iBAAiB,CAAC;AAG5D,MAAM,WAAW,wBAAyB,SAAQ,QAAQ;IACxD,IAAI,EAAE,MAAM,CAAC;IACb,IAAI,EAAE,MAAM,CAAC;IACb,MAAM,EAAE,MAAM,CAAC;IACf,WAAW,EAAE,WAAW,CAAC;IACzB,qBAAqB,EAAE,MAAM,CAAC;IAC9B,OAAO,EAAE,OAAO,CAAC;CAClB;AAED,8BAAsB,oBAAoB;IACxC,SAAS,CAAC,QAAQ,CAAC,IAAI,EAAE,MAAM,CAAC;IAChC,SAAS,CAAC,QAAQ,CAAC,GAAG,EAAE,MAAM,CAAC;IAC/B,SAAS,CAAC,QAAQ,CAAC,IAAI,EAAE,MAAM,CAAC;IAChC,SAAS,CAAC,QAAQ,CAAC,MAAM,EAAE,MAAM,CAAC;IAClC,SAAS,CAAC,qBAAqB,EAAE,MAAM,CAAC;gBAE5B,EAAE,IAAI,EAAE,GAAG,EAAE,IAAI,EAAE,qBAAqB,EAAE,MAAM,EAAE,EAAE,wBAAwB;IAQxF,MAAM,CAAC,+BAA+B,CAAC,WAAW,EAAE,WAAW,EAAE,OAAO,EAAE,OAAO;;;;;;;;;;;;;;;;;IAajF,SAAS,CAAC,aAAa,CAAC,MAAM,EAAE,MAAM,EAAE,aAAa,EAAE,CAAC,KAAK,EAAE,MAAM,KAAK,MAAM,GAAG,IAAI;IAMvF,SAAS,CAAC,YAAY,gBAAiB,UAAU,KAAG,MAAM,CAO1C;IAEhB,SAAS,CAAC,wBAAwB,gBAAiB,MAAM,YAGpD;IAEL,SAAS,CAAC,yBAAyB,gBAAiB,MAAM,YAGrD;IAEL,SAAS,CAAC,kCAAkC,gBAAiB,WAAW,uBAAqB,cAAc,CAqBpG;CACR"}
\ No newline at end of file
+{"version":3,"file":"resource-tunnel-server.d.ts","sourceRoot":"","sources":["../../src/servers/resource-tunnel-server.ts"],"names":[],"mappings":";AAAA,OAAO,EAAE,YAAY,EAAE,OAAO,EAAE,QAAQ,EAAE,MAAM,SAAS,CAAC;AAC1D,OAAO,EAAE,cAAc,EAAE,MAAM,uBAAuB,CAAC;AACvD,OAAO,EACL,QAAQ,EAMR,MAAM,EAGP,MAAM,mBAAmB,CAAC;AAC3B,OAAO,EAAE,UAAU,EAA6C,MAAM,YAAY,CAAC;AACnF,OAAO,KAAK,EAAE,WAAW,EAAE,OAAO,EAAE,YAAY,EAAE,MAAM,iBAAiB,CAAC;AAG1E,MAAM,WAAW,wBAAyB,SAAQ,QAAQ;IACxD,IAAI,EAAE,MAAM,CAAC;IACb,IAAI,EAAE,MAAM,CAAC;IACb,MAAM,EAAE,MAAM,CAAC;IACf,WAAW,EAAE,WAAW,CAAC;IACzB,qBAAqB,EAAE,MAAM,CAAC;IAC9B,OAAO,EAAE,OAAO,CAAC;IACjB,UAAU,CAAC,EAAE,YAAY,CAAC;CAC3B;AAED,8BAAsB,oBAAoB;IACxC,SAAS,CAAC,QAAQ,CAAC,IAAI,EAAE,MAAM,CAAC;IAChC,SAAS,CAAC,QAAQ,CAAC,GAAG,EAAE,MAAM,CAAC;IAC/B,SAAS,CAAC,QAAQ,CAAC,IAAI,EAAE,MAAM,CAAC;IAChC,SAAS,CAAC,QAAQ,CAAC,MAAM,EAAE,MAAM,CAAC;IAClC,SAAS,CAAC,qBAAqB,EAAE,MAAM,CAAC;gBAE5B,EAAE,IAAI,EAAE,GAAG,EAAE,IAAI,EAAE,qBAAqB,EAAE,MAAM,EAAE,EAAE,wBAAwB;IAQxF,MAAM,CAAC,+BAA+B,CAAC,WAAW,EAAE,WAAW,EAAE,OAAO,EAAE,OAAO;;;;;;;;;;;;;;;;;IAajF,SAAS,CAAC,aAAa,CAAC,MAAM,EAAE,MAAM,EAAE,aAAa,EAAE,CAAC,KAAK,EAAE,MAAM,KAAK,MAAM,GAAG,IAAI;IAMvF,SAAS,CAAC,YAAY,gBAAiB,UAAU,KAAG,MAAM,CAO1C;IAEhB,SAAS,CAAC,wBAAwB,gBAAiB,MAAM,YAGpD;IAEL,SAAS,CAAC,yBAAyB,gBAAiB,MAAM,YAGrD;IAEL,SAAS,CAAC,kCAAkC,gBAAiB,WAAW,uBAAqB,cAAc,CAqBpG;IAEP,SAAS,CAAC,0BAA0B,eAAgB,YAAY,WAI3C,OAAO,QAAQ,QAAQ,QAAQ,YAAY,mBAU9D;CACH"}
\ No newline at end of file

Modified:package/out/command/start-tunnel-command.d.ts.map

Index: package/out/command/start-tunnel-command.d.ts.map
===================================================================
--- package/out/command/start-tunnel-command.d.ts.map
+++ package/out/command/start-tunnel-command.d.ts.map
@@ -1,1 +1,1 @@
-{"version":3,"file":"start-tunnel-command.d.ts","sourceRoot":"","sources":["../../src/command/start-tunnel-command.ts"],"names":[],"mappings":"AAAA,OAAO,EAAE,aAAa,EAAE,MAAM,gBAAgB,CAAC;AAC/C,OAAO,EAAE,iBAAiB,EAAE,UAAU,EAAE,MAAM,EAAyB,aAAa,EAAE,MAAM,mBAAmB,CAAC;AAChH,OAAO,EAAE,SAAS,EAAqB,MAAM,gBAAgB,CAAC;AAG9D,OAAO,EACL,iBAAiB,EAKlB,MAAM,YAAY,CAAC;AACpB,OAAO,EAAE,qBAAqB,EAAE,MAAM,eAAe,CAAC;AACtD,OAAO,EAAsC,iBAAiB,EAAE,MAAM,UAAU,CAAC;AACjF,OAAO,EAAE,qBAAqB,EAAE,mBAAmB,EAAE,MAAM,aAAa,CAAC;AACzE,MAAM,WAAW,kBAAkB;IACjC,IAAI,CAAC,EAAE,MAAM,CAAC;IACd,IAAI,EAAE,MAAM,CAAC;IACb,cAAc,EAAE,MAAM,CAAC;IACvB,WAAW,EAAE,MAAM,GAAG,SAAS,CAAC;IAChC,eAAe,CAAC,EAAE,MAAM,CAAC,MAAM,EAAE,MAAM,CAAC,CAAC;CAC1C;AAED,MAAM,WAAW,iBAAiB;IAChC,SAAS,EAAE,MAAM,CAAC;IAClB,iBAAiB,EAAE,iBAAiB,CAAC;IACrC,gBAAgB,CAAC,EAAE,MAAM,CAAC;IAC1B,UAAU,EAAE,iBAAiB,EAAE,CAAC;IAChC,YAAY,IAAI,OAAO,CAAC,IAAI,CAAC,CAAC;IAC9B,eAAe,CAAC,WAAW,EAAE,aAAa,EAAE,aAAa,EAAE,aAAa,GAAG,OAAO,CAAC,IAAI,CAAC,CAAC;CAC1F;AAED,qBAAa,kBAAkB;IAK3B,OAAO,CAAC,QAAQ,CAAC,YAAY;IAC7B,OAAO,CAAC,QAAQ,CAAC,SAAS;IAC1B,OAAO,CAAC,QAAQ,CAAC,aAAa;IAC9B,OAAO,CAAC,QAAQ,CAAC,YAAY;IAC7B,OAAO,CAAC,QAAQ,CAAC,YAAY;IAC7B,OAAO,CAAC,QAAQ,CAAC,SAAS;IAC1B,OAAO,CAAC,QAAQ,CAAC,MAAM;IACvB,OAAO,CAAC,QAAQ,CAAC,UAAU;IAX7B,OAAO,CAAC,aAAa,CAAmE;IACxF,OAAO,CAAC,iBAAiB,CAAgC;gBAGtC,YAAY,EAAE,iBAAiB,EAC/B,SAAS,EAAE,iBAAiB,EAC5B,aAAa,EAAE,mBAAmB,EAClC,YAAY,EAAE,qBAAqB,EACnC,YAAY,EAAE,qBAAqB,EACnC,SAAS,EAAE,SAAS,EACpB,MAAM,EAAE,MAAM,EACd,UAAU,EAAE,UAAU;IAGzC,OAAO,CAAC,YAAY,CAUlB;IAEF,OAAO,CAAC,qBAAqB,CA0B3B;IAEF,OAAO,CAAC,gCAAgC,CAmCtC;IAEW,OAAO,CAAC,OAAO,EAAE,kBAAkB,GAAG,OAAO,CAAC,iBAAiB,CAAC;CAyD9E"}
\ No newline at end of file
+{"version":3,"file":"start-tunnel-command.d.ts","sourceRoot":"","sources":["../../src/command/start-tunnel-command.ts"],"names":[],"mappings":"AAAA,OAAO,EAAE,aAAa,EAAE,MAAM,gBAAgB,CAAC;AAC/C,OAAO,EAAE,iBAAiB,EAAE,UAAU,EAAE,MAAM,EAAyB,aAAa,EAAE,MAAM,mBAAmB,CAAC;AAChH,OAAO,EAAE,SAAS,EAAqB,MAAM,gBAAgB,CAAC;AAI9D,OAAO,EACL,iBAAiB,EAKlB,MAAM,YAAY,CAAC;AACpB,OAAO,EAAE,qBAAqB,EAAE,MAAM,eAAe,CAAC;AACtD,OAAO,EAAsC,iBAAiB,EAAE,MAAM,UAAU,CAAC;AACjF,OAAO,EAAE,qBAAqB,EAAE,mBAAmB,EAAE,MAAM,aAAa,CAAC;AACzE,MAAM,WAAW,kBAAkB;IACjC,IAAI,CAAC,EAAE,MAAM,CAAC;IACd,IAAI,EAAE,MAAM,CAAC;IACb,cAAc,EAAE,MAAM,CAAC;IACvB,eAAe,CAAC,EAAE,MAAM,CAAC,MAAM,EAAE,MAAM,CAAC,CAAC;CAC1C;AAED,MAAM,WAAW,iBAAiB;IAChC,SAAS,EAAE,MAAM,CAAC;IAClB,iBAAiB,EAAE,iBAAiB,CAAC;IACrC,gBAAgB,CAAC,EAAE,MAAM,CAAC;IAC1B,UAAU,EAAE,iBAAiB,EAAE,CAAC;IAChC,YAAY,IAAI,OAAO,CAAC,IAAI,CAAC,CAAC;IAC9B,eAAe,CAAC,WAAW,EAAE,aAAa,EAAE,aAAa,EAAE,aAAa,GAAG,OAAO,CAAC,IAAI,CAAC,CAAC;CAC1F;AAED,qBAAa,kBAAkB;IAK3B,OAAO,CAAC,QAAQ,CAAC,YAAY;IAC7B,OAAO,CAAC,QAAQ,CAAC,SAAS;IAC1B,OAAO,CAAC,QAAQ,CAAC,aAAa;IAC9B,OAAO,CAAC,QAAQ,CAAC,YAAY;IAC7B,OAAO,CAAC,QAAQ,CAAC,YAAY;IAC7B,OAAO,CAAC,QAAQ,CAAC,SAAS;IAC1B,OAAO,CAAC,QAAQ,CAAC,MAAM;IACvB,OAAO,CAAC,QAAQ,CAAC,UAAU;IAX7B,OAAO,CAAC,aAAa,CAAmE;IACxF,OAAO,CAAC,iBAAiB,CAAgC;gBAGtC,YAAY,EAAE,iBAAiB,EAC/B,SAAS,EAAE,iBAAiB,EAC5B,aAAa,EAAE,mBAAmB,EAClC,YAAY,EAAE,qBAAqB,EACnC,YAAY,EAAE,qBAAqB,EACnC,SAAS,EAAE,SAAS,EACpB,MAAM,EAAE,MAAM,EACd,UAAU,EAAE,UAAU;IAGzC,OAAO,CAAC,YAAY,CAUlB;IAEF,OAAO,CAAC,qBAAqB,CAuB3B;IAEF,OAAO,CAAC,gCAAgC,CAoCtC;IAEW,OAAO,CAAC,OAAO,EAAE,kBAAkB,GAAG,OAAO,CAAC,iBAAiB,CAAC;CAwD9E"}
\ No newline at end of file

Modified:package/CHANGELOG.md

too-big

Modified:package/out/services/create-tunnel-service.d.ts

Index: package/out/services/create-tunnel-service.d.ts
===================================================================
--- package/out/services/create-tunnel-service.d.ts
+++ package/out/services/create-tunnel-service.d.ts
@@ -1,49 +1,25 @@
 /// <reference types="node" resolution-mode="require"/>
 import { URL } from 'url';
-import { BaseError, FeatureFlagService, Logger } from '@forge/cli-shared';
-export declare type NgrokTunnelConfig = {
-    tunnelConfigPath: string | undefined;
-};
+import { BaseError, Logger } from '@forge/cli-shared';
 export declare type CloudflareTunnelConfig = {
     token: string | null | undefined;
     id: string | null | undefined;
     tunnelUrl: string | null | undefined;
 };
 export declare type TunnelConfig = {
     port: number;
-} & NgrokTunnelConfig & CloudflareTunnelConfig;
+} & CloudflareTunnelConfig;
 export interface CreateTunnelService {
-    establishTunnel({ port, tunnelConfigPath, token, id, tunnelUrl }: TunnelConfig): Promise<URL>;
+    establishTunnel({ port, token, id, tunnelUrl }: TunnelConfig): Promise<URL>;
     closeTunnel(): Promise<void>;
 }
-export declare const USER_NGROK_ERRORS: string[];
-export declare class NgrokError extends BaseError {
-    constructor(message?: string);
-    isUserError(): boolean;
-}
 export declare class CloudflareError extends BaseError {
 }
-export declare class TunnelServiceFacade implements CreateTunnelService {
-    private readonly featureFlagService;
-    private readonly logger;
-    private instance;
-    constructor(featureFlagService: FeatureFlagService, logger: Logger);
-    private getInstance;
-    establishTunnel({ port, tunnelConfigPath, id, token, tunnelUrl }: TunnelConfig): Promise<URL>;
-    closeTunnel(): Promise<void>;
-}
 export declare class CloudflareCreateTunnelService implements CreateTunnelService {
     private readonly logger;
     private stopFunction;
     constructor(logger: Logger);
     establishTunnel({ port, id, token, tunnelUrl }: TunnelConfig): Promise<URL>;
     closeTunnel(): Promise<void>;
 }
-export declare class NgrokCreateTunnelService implements CreateTunnelService {
-    private readonly logger;
-    private endpoint;
-    constructor(logger: Logger);
-    establishTunnel({ port, tunnelConfigPath }: TunnelConfig): Promise<URL>;
-    closeTunnel(): Promise<void>;
-}
 //# sourceMappingURL=create-tunnel-service.d.ts.map
\ No newline at end of file

Modified:package/out/services/register-tunnel-service.d.ts

Index: package/out/services/register-tunnel-service.d.ts
===================================================================
--- package/out/services/register-tunnel-service.d.ts
+++ package/out/services/register-tunnel-service.d.ts
@@ -1,15 +1,13 @@
 import { TunnelClient, TunnelDefinitions, TunnelSetup } from '../graphql';
-import { FeatureFlagService } from '@forge/cli-shared';
 export interface RegisterTunnelService {
     setupTunnel(appId: string, environmentKey: string): Promise<TunnelSetup>;
     registerTunnels(appId: string, environmentKey: string, tunnelDefinitions: TunnelDefinitions): Promise<void>;
     unregisterTunnels(appId: string, environmentKey: string): Promise<void>;
 }
 export declare class RegisterTunnelServiceImpl implements RegisterTunnelService {
     private readonly tunnelClient;
-    private readonly featureFlagService;
-    constructor(tunnelClient: TunnelClient, featureFlagService: FeatureFlagService);
+    constructor(tunnelClient: TunnelClient);
     private keepAliveHandler;
     private keepAliveActive;
     registerTunnels(appId: string, environmentKey: string, tunnelDefinitions: TunnelDefinitions): Promise<void>;
     setupTunnel(appId: string, environmentKey: string): Promise<TunnelSetup>;

Modified:package/out/servers/resource-tunnel-server.d.ts

Index: package/out/servers/resource-tunnel-server.d.ts
===================================================================
--- package/out/servers/resource-tunnel-server.d.ts
+++ package/out/servers/resource-tunnel-server.d.ts
@@ -1,16 +1,18 @@
 /// <reference types="node" resolution-mode="require"/>
+import { NextFunction, Request, Response } from 'express';
 import { RequestHandler } from 'http-proxy-middleware';
 import { Resource, Logger } from '@forge/cli-shared';
 import { CSPDetails } from '@forge/csp';
-import type { Permissions, Remotes } from '@forge/manifest';
+import type { Permissions, Remotes, Translations } from '@forge/manifest';
 export interface ResourceTunnelServerArgs extends Resource {
     port: number;
     host: string;
     logger: Logger;
     permissions: Permissions;
     cspReporterServerPort: number;
     remotes: Remotes;
+    i18nConfig?: Translations;
 }
 export declare abstract class ResourceTunnelServer {
     protected readonly port: number;
     protected readonly key: string;
@@ -39,6 +41,7 @@
     protected getCspHeader: (existingCsp: CSPDetails) => string;
     protected injectGlobalBridgeScript: (htmlContent: Buffer) => Buffer;
     protected injectIframeResizerScript: (htmlContent: Buffer) => Buffer;
     protected getCustomUIHtmlTransformMiddleware: (permissions: Permissions, remotes: Remotes) => RequestHandler;
+    protected getI18nResourcesMiddleware: (i18nConfig: Translations) => (req: Request, resp: Response, next: NextFunction) => Promise<void>;
 }
 //# sourceMappingURL=resource-tunnel-server.d.ts.map
\ No newline at end of file

Modified:package/out/command/start-tunnel-command.d.ts

Index: package/out/command/start-tunnel-command.d.ts
===================================================================
--- package/out/command/start-tunnel-command.d.ts
+++ package/out/command/start-tunnel-command.d.ts
@@ -8,9 +8,8 @@
 export interface StartTunnelOptions {
     port?: number;
     host: string;
     environmentKey: string;
-    ngrokConfig: string | undefined;
     resourcePortMap?: Record<string, number>;
 }
 export interface StartTunnelResult {
     localPort: number;