@openchambery/web 1.17.1-beta.7 → 1.17.1-beta.8

This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
Files changed (139) hide show
  1. package/README.md +3 -39
  2. package/bin/cli-output.js +0 -16
  3. package/bin/cli.js +3 -66
  4. package/bin/cli.test.js +4 -81
  5. package/bin/lib/DOCUMENTATION.md +5 -19
  6. package/bin/lib/cli-args.js +3 -327
  7. package/bin/lib/cli-http.js +0 -16
  8. package/bin/lib/cli-lifecycle.js +2 -111
  9. package/bin/lib/cli-paths.js +0 -57
  10. package/dist/assets/{AgentAvatar-htFrIvQx.js → AgentAvatar-C6Hxu5_o.js} +1 -1
  11. package/dist/assets/{AssistantView-BZiJsNuI.js → AssistantView-ZlXc0xFT.js} +1 -1
  12. package/dist/assets/{ChatContainer-CdmcMnL3.js → ChatContainer-BXFy3Uu2.js} +5 -5
  13. package/dist/assets/{DiagramView-B7sq74V-.js → DiagramView-CgotrQyK.js} +1 -1
  14. package/dist/assets/{FadeInOnReveal-8fY7XL23.js → FadeInOnReveal-CvNA_aGD.js} +1 -1
  15. package/dist/assets/{Icon-B7eLbnyj.js → Icon-BPJ_quEe.js} +1 -1
  16. package/dist/assets/{MarkdownRendererImpl-DICju9ve.js → MarkdownRendererImpl-Cj4y0P0S.js} +1 -1
  17. package/dist/assets/{MobileDetailNavigation-CuxWU1yf.js → MobileDetailNavigation-5tAL5d_M.js} +1 -1
  18. package/dist/assets/{MobileShareBridge-CPg9Eyro.js → MobileShareBridge-BL7Ehxhd.js} +1 -1
  19. package/dist/assets/{MobileSurface-D7sDH_tx.js → MobileSurface-ByMnQ5rD.js} +1 -1
  20. package/dist/assets/{MultiRunWindow-MSO0Equt.js → MultiRunWindow-Che7L3TX.js} +1 -1
  21. package/dist/assets/{OnboardingScreen-C87u_MLg.js → OnboardingScreen-CdvaEBtt.js} +1 -1
  22. package/dist/assets/{OverlayScrollbar-Kmmybw-z.js → OverlayScrollbar-C2pEDFq-.js} +1 -1
  23. package/dist/assets/SettingsView-D0p-e8Px.js +25 -0
  24. package/dist/assets/{SettingsWindow-Bl25cfXX.js → SettingsWindow-KYhsFUrb.js} +1 -1
  25. package/dist/assets/{TerminalView-jR5jP1b0.js → TerminalView-Da5aLqHR.js} +1 -1
  26. package/dist/assets/{ToolOutputDialog-DCEZb2DZ.js → ToolOutputDialog-DZI4uxx3.js} +1 -1
  27. package/dist/assets/{appThemeRegistry-aiRF-s3c.js → appThemeRegistry-DAgBeFsZ.js} +2 -2
  28. package/dist/assets/{button-bYWkDtDI.js → button-BmNJBT13.js} +1 -1
  29. package/dist/assets/{clipboard-CzpzN4Um.js → clipboard-CXWbHCAk.js} +1 -1
  30. package/dist/assets/{collapsible-A1PFvMRp.js → collapsible-68IqWBM1.js} +1 -1
  31. package/dist/assets/{context-menu-CkpHn-Bm.js → context-menu-BXH0AcOc.js} +1 -1
  32. package/dist/assets/desktopHosts-BpjUSDz4.js +1 -0
  33. package/dist/assets/{desktopRelayRestore-C5vYnSTd.js → desktopRelayRestore-BzUEk1i7.js} +1 -1
  34. package/dist/assets/{diagram-BkwKWaTO.js → diagram-YN0GZ1Q0.js} +1 -1
  35. package/dist/assets/{dialog-DW7-_iqo.js → dialog-BV1ENlLf.js} +1 -1
  36. package/dist/assets/es-EXZUX1sB.js +15 -0
  37. package/dist/assets/{fileQueries-P9SX4YwC.js → fileQueries-i4oziMnC.js} +1 -1
  38. package/dist/assets/fr-jWNPO91J.js +13 -0
  39. package/dist/assets/{gitApi-CMsZ2v08.js → gitApi-BW5AFgD1.js} +1 -1
  40. package/dist/assets/{gitApiHttp-DvIIcDAO.js → gitApiHttp-C1DaEMKR.js} +1 -1
  41. package/dist/assets/{input-B9aNttqV.js → input-BLVhPvhN.js} +1 -1
  42. package/dist/assets/{insertionBoundaries-Di3rCXgN.js → insertionBoundaries-D4KbXFFj.js} +1 -1
  43. package/dist/assets/ja-Dcb0VtDE.js +15 -0
  44. package/dist/assets/ko-CX71xNDX.js +15 -0
  45. package/dist/assets/{main-DY27kMV5.js → main-CcyyPAib.js} +2 -2
  46. package/dist/assets/{main-Chtf300b.js → main-DzxdsF_k.js} +5 -5
  47. package/dist/assets/{markdown-worker-BoB1_DPo.js → markdown-worker-Cq3Twp1A.js} +1 -1
  48. package/dist/assets/{markdownTheme-om5XcPqq.js → markdownTheme-CCnvI6L0.js} +1 -1
  49. package/dist/assets/{miniChat-BWbpl5SN.js → miniChat-BsNf9y48.js} +2 -2
  50. package/dist/assets/mobile-CsJg2IAq.js +2 -0
  51. package/dist/assets/{multirun-BfPcVktg.js → multirun-qs5hZkwM.js} +1 -1
  52. package/dist/assets/persistence-C_KCiMcY.js +3 -0
  53. package/dist/assets/{pl-BSjLn4dm.js → pl-mR_3Sqr8.js} +2 -2
  54. package/dist/assets/{projectMeta-CiAR7MRG.js → projectMeta-1SSTNg8w.js} +1 -1
  55. package/dist/assets/pt-BR-D1RpVOvC.js +15 -0
  56. package/dist/assets/radio-DBJG9Dd1.js +1 -0
  57. package/dist/assets/{renderElectronMiniChatApp-CiEXAVSt.js → renderElectronMiniChatApp-DOWE0jSA.js} +2 -2
  58. package/dist/assets/{renderMobileApp-BHvgSVPk.js → renderMobileApp-bklJJSZi.js} +3 -3
  59. package/dist/assets/{runtimeConfig-49YbZaqI.js → runtimeConfig-JSaYFA5x.js} +1 -1
  60. package/dist/assets/{runtimeEndpointReset-CdhtjuPe.js → runtimeEndpointReset-ix1NxqYw.js} +1 -1
  61. package/dist/assets/{sortable-tabs-strip-XeYica3j.js → sortable-tabs-strip-DncWjNx4.js} +1 -1
  62. package/dist/assets/src-B8mzksNL.css +2 -0
  63. package/dist/assets/store-oojlrF4d.js +15 -0
  64. package/dist/assets/{terminalApi-DAu7xKli.js → terminalApi-BYTA045F.js} +1 -1
  65. package/dist/assets/{tooltip-BSlxaNrR.js → tooltip-BYGBBTc2.js} +1 -1
  66. package/dist/assets/uk-UvnVqWv-.js +15 -0
  67. package/dist/assets/{url-DjkTDrad.js → url-CGHw6D-E.js} +1 -1
  68. package/dist/assets/useAppFontEffects-B1EhZNex.js +7 -0
  69. package/dist/assets/{useDesktopWindowControlsLayout-BwYnhrEy.js → useDesktopWindowControlsLayout-Dc69l-pm.js} +1 -1
  70. package/dist/assets/{useEffectiveDirectory-CEmsrrEs.js → useEffectiveDirectory-dCGvvYRh.js} +1 -1
  71. package/dist/assets/{useFontPreferences-BxMT_kty.js → useFontPreferences-Bu4ME5hk.js} +1 -1
  72. package/dist/assets/{useMobileNavigationStore-DryW-QdG.js → useMobileNavigationStore-DhkIZBJw.js} +4 -4
  73. package/dist/assets/useSessionAutoCleanup-D-r9oDye.js +1 -0
  74. package/dist/assets/{useWorkerHighlightedLines-CFW2AoPL.js → useWorkerHighlightedLines-05dLFgTI.js} +1 -1
  75. package/dist/assets/{utils-RUACCsOs.js → utils-DyUyiLje.js} +1 -1
  76. package/dist/assets/zh-CN-9v-RC966.js +15 -0
  77. package/dist/assets/zh-TW-BZ_wZdC-.js +15 -0
  78. package/dist/index.html +8 -8
  79. package/dist/mini-chat.html +8 -8
  80. package/dist/mobile.html +8 -8
  81. package/package.json +1 -1
  82. package/server/index.d.ts +0 -6
  83. package/server/index.js +5 -153
  84. package/server/lib/opencode/DOCUMENTATION.md +6 -10
  85. package/server/lib/opencode/cli-entry-runtime.js +0 -10
  86. package/server/lib/opencode/cli-options.js +0 -65
  87. package/server/lib/opencode/core-routes.js +2 -4
  88. package/server/lib/opencode/routes.test.js +0 -1
  89. package/server/lib/opencode/server-startup-runtime.js +0 -55
  90. package/server/lib/opencode/settings-helpers.js +0 -55
  91. package/server/lib/opencode/settings-helpers.test.js +0 -20
  92. package/server/lib/opencode/settings-normalization-runtime.js +0 -87
  93. package/server/lib/opencode/settings-normalization-runtime.test.js +0 -3
  94. package/server/lib/opencode/settings-runtime.js +9 -102
  95. package/server/lib/opencode/settings-runtime.test.js +0 -10
  96. package/server/lib/opencode/shutdown-runtime.js +1 -9
  97. package/server/lib/opencode/shutdown-runtime.test.js +0 -2
  98. package/server/lib/opencode/startup-pipeline-runtime.js +0 -20
  99. package/server/lib/opencode/startup-pipeline-runtime.test.js +2 -3
  100. package/server/lib/opencode/tunnel-wiring-runtime.js +2 -80
  101. package/server/lib/relay/DOCUMENTATION.md +1 -1
  102. package/bin/lib/cli-tunnel-capabilities.js +0 -9
  103. package/bin/lib/cli-tunnel-profiles.js +0 -366
  104. package/bin/lib/cli-tunnel-utils.js +0 -300
  105. package/bin/lib/commands-tunnel.js +0 -1761
  106. package/dist/assets/SettingsView-5YNu54KI.js +0 -25
  107. package/dist/assets/desktopHosts-D5m_ggY1.js +0 -1
  108. package/dist/assets/es-Cei_75Jt.js +0 -15
  109. package/dist/assets/fr-Dn7WSHh2.js +0 -13
  110. package/dist/assets/ja-DFARVqVj.js +0 -15
  111. package/dist/assets/ko-pyLnIyDY.js +0 -15
  112. package/dist/assets/mobile-DEQeGskq.js +0 -2
  113. package/dist/assets/persistence-CHA81Od7.js +0 -3
  114. package/dist/assets/pt-BR-DaWvr_0A.js +0 -15
  115. package/dist/assets/radio-BnF4XhCC.js +0 -1
  116. package/dist/assets/src-BtkWqMFu.css +0 -2
  117. package/dist/assets/store-DIpqFVjs.js +0 -15
  118. package/dist/assets/uk-CHCRqRKf.js +0 -15
  119. package/dist/assets/useAppFontEffects-BRNICZS2.js +0 -7
  120. package/dist/assets/useSessionAutoCleanup-DMJ1LiW_.js +0 -1
  121. package/dist/assets/zh-CN-BWEQZKXk.js +0 -15
  122. package/dist/assets/zh-TW-BbO-gJq3.js +0 -15
  123. package/server/lib/cloudflare-tunnel.js +0 -618
  124. package/server/lib/ngrok-tunnel.js +0 -343
  125. package/server/lib/ngrok-tunnel.test.js +0 -50
  126. package/server/lib/tunnels/DOCUMENTATION.md +0 -21
  127. package/server/lib/tunnels/executable-search.js +0 -140
  128. package/server/lib/tunnels/executable-search.test.js +0 -96
  129. package/server/lib/tunnels/index.js +0 -179
  130. package/server/lib/tunnels/index.test.js +0 -93
  131. package/server/lib/tunnels/install-help.js +0 -56
  132. package/server/lib/tunnels/install-help.test.js +0 -31
  133. package/server/lib/tunnels/managed-config.js +0 -201
  134. package/server/lib/tunnels/providers/cloudflare.js +0 -266
  135. package/server/lib/tunnels/providers/ngrok.js +0 -123
  136. package/server/lib/tunnels/registry.js +0 -51
  137. package/server/lib/tunnels/routes.js +0 -610
  138. package/server/lib/tunnels/types.js +0 -245
  139. package/server/lib/tunnels/types.test.js +0 -34
package/dist/index.html CHANGED
@@ -552,7 +552,7 @@
552
552
  opacity: 0.72;
553
553
  }
554
554
  </style>
555
- <script type="module" crossorigin src="/assets/main-DY27kMV5.js"></script>
555
+ <script type="module" crossorigin src="/assets/main-CcyyPAib.js"></script>
556
556
  <link rel="modulepreload" crossorigin href="/assets/rolldown-runtime-C0FnF6B9.js">
557
557
  <link rel="modulepreload" crossorigin href="/assets/vendor-base-ui-CnHfUmDN.js">
558
558
  <link rel="modulepreload" crossorigin href="/assets/vendor-zustand-B4dlGEM2.js">
@@ -560,15 +560,15 @@
560
560
  <link rel="modulepreload" crossorigin href="/assets/vendor-pathe-vBmvQE8f.js">
561
561
  <link rel="modulepreload" crossorigin href="/assets/vendor-react-DLPElpoQ.js">
562
562
  <link rel="modulepreload" crossorigin href="/assets/vendor-tanstack-query-core-BWz0ose6.js">
563
- <link rel="modulepreload" crossorigin href="/assets/persistence-CHA81Od7.js">
564
- <link rel="modulepreload" crossorigin href="/assets/desktopHosts-D5m_ggY1.js">
565
- <link rel="modulepreload" crossorigin href="/assets/desktopRelayRestore-C5vYnSTd.js">
563
+ <link rel="modulepreload" crossorigin href="/assets/persistence-C_KCiMcY.js">
564
+ <link rel="modulepreload" crossorigin href="/assets/desktopHosts-BpjUSDz4.js">
565
+ <link rel="modulepreload" crossorigin href="/assets/desktopRelayRestore-BzUEk1i7.js">
566
566
  <link rel="modulepreload" crossorigin href="/assets/vendor-opencode-sdk-C07HQypa.js">
567
567
  <link rel="modulepreload" crossorigin href="/assets/vendor-aparajita-capacitor-secure-storage-CjQdwfjS.js">
568
- <link rel="modulepreload" crossorigin href="/assets/gitApiHttp-DvIIcDAO.js">
569
- <link rel="modulepreload" crossorigin href="/assets/terminalApi-DAu7xKli.js">
570
- <link rel="modulepreload" crossorigin href="/assets/runtimeConfig-49YbZaqI.js">
571
- <link rel="stylesheet" crossorigin href="/assets/src-BtkWqMFu.css">
568
+ <link rel="modulepreload" crossorigin href="/assets/gitApiHttp-C1DaEMKR.js">
569
+ <link rel="modulepreload" crossorigin href="/assets/terminalApi-BYTA045F.js">
570
+ <link rel="modulepreload" crossorigin href="/assets/runtimeConfig-JSaYFA5x.js">
571
+ <link rel="stylesheet" crossorigin href="/assets/src-B8mzksNL.css">
572
572
  </head>
573
573
  <body class="h-full bg-background text-foreground">
574
574
  <!-- Keep the startup layer outside #root. React replaces every child of
@@ -74,7 +74,7 @@
74
74
  }
75
75
  </style>
76
76
 
77
- <script type="module" crossorigin src="/assets/miniChat-BWbpl5SN.js"></script>
77
+ <script type="module" crossorigin src="/assets/miniChat-BsNf9y48.js"></script>
78
78
  <link rel="modulepreload" crossorigin href="/assets/rolldown-runtime-C0FnF6B9.js">
79
79
  <link rel="modulepreload" crossorigin href="/assets/vendor-base-ui-CnHfUmDN.js">
80
80
  <link rel="modulepreload" crossorigin href="/assets/vendor-zustand-B4dlGEM2.js">
@@ -82,15 +82,15 @@
82
82
  <link rel="modulepreload" crossorigin href="/assets/vendor-pathe-vBmvQE8f.js">
83
83
  <link rel="modulepreload" crossorigin href="/assets/vendor-react-DLPElpoQ.js">
84
84
  <link rel="modulepreload" crossorigin href="/assets/vendor-tanstack-query-core-BWz0ose6.js">
85
- <link rel="modulepreload" crossorigin href="/assets/persistence-CHA81Od7.js">
86
- <link rel="modulepreload" crossorigin href="/assets/desktopHosts-D5m_ggY1.js">
87
- <link rel="modulepreload" crossorigin href="/assets/desktopRelayRestore-C5vYnSTd.js">
85
+ <link rel="modulepreload" crossorigin href="/assets/persistence-C_KCiMcY.js">
86
+ <link rel="modulepreload" crossorigin href="/assets/desktopHosts-BpjUSDz4.js">
87
+ <link rel="modulepreload" crossorigin href="/assets/desktopRelayRestore-BzUEk1i7.js">
88
88
  <link rel="modulepreload" crossorigin href="/assets/vendor-opencode-sdk-C07HQypa.js">
89
89
  <link rel="modulepreload" crossorigin href="/assets/vendor-aparajita-capacitor-secure-storage-CjQdwfjS.js">
90
- <link rel="modulepreload" crossorigin href="/assets/gitApiHttp-DvIIcDAO.js">
91
- <link rel="modulepreload" crossorigin href="/assets/terminalApi-DAu7xKli.js">
92
- <link rel="modulepreload" crossorigin href="/assets/runtimeConfig-49YbZaqI.js">
93
- <link rel="stylesheet" crossorigin href="/assets/src-BtkWqMFu.css">
90
+ <link rel="modulepreload" crossorigin href="/assets/gitApiHttp-C1DaEMKR.js">
91
+ <link rel="modulepreload" crossorigin href="/assets/terminalApi-BYTA045F.js">
92
+ <link rel="modulepreload" crossorigin href="/assets/runtimeConfig-JSaYFA5x.js">
93
+ <link rel="stylesheet" crossorigin href="/assets/src-B8mzksNL.css">
94
94
  </head>
95
95
  <body class="h-full bg-background text-foreground">
96
96
  <div id="root" class="h-full">
package/dist/mobile.html CHANGED
@@ -63,7 +63,7 @@
63
63
  })();
64
64
  </script>
65
65
 
66
- <script type="module" crossorigin src="/assets/mobile-DEQeGskq.js"></script>
66
+ <script type="module" crossorigin src="/assets/mobile-CsJg2IAq.js"></script>
67
67
  <link rel="modulepreload" crossorigin href="/assets/rolldown-runtime-C0FnF6B9.js">
68
68
  <link rel="modulepreload" crossorigin href="/assets/vendor-base-ui-CnHfUmDN.js">
69
69
  <link rel="modulepreload" crossorigin href="/assets/vendor-zustand-B4dlGEM2.js">
@@ -71,15 +71,15 @@
71
71
  <link rel="modulepreload" crossorigin href="/assets/vendor-pathe-vBmvQE8f.js">
72
72
  <link rel="modulepreload" crossorigin href="/assets/vendor-react-DLPElpoQ.js">
73
73
  <link rel="modulepreload" crossorigin href="/assets/vendor-tanstack-query-core-BWz0ose6.js">
74
- <link rel="modulepreload" crossorigin href="/assets/persistence-CHA81Od7.js">
75
- <link rel="modulepreload" crossorigin href="/assets/desktopHosts-D5m_ggY1.js">
76
- <link rel="modulepreload" crossorigin href="/assets/desktopRelayRestore-C5vYnSTd.js">
74
+ <link rel="modulepreload" crossorigin href="/assets/persistence-C_KCiMcY.js">
75
+ <link rel="modulepreload" crossorigin href="/assets/desktopHosts-BpjUSDz4.js">
76
+ <link rel="modulepreload" crossorigin href="/assets/desktopRelayRestore-BzUEk1i7.js">
77
77
  <link rel="modulepreload" crossorigin href="/assets/vendor-opencode-sdk-C07HQypa.js">
78
78
  <link rel="modulepreload" crossorigin href="/assets/vendor-aparajita-capacitor-secure-storage-CjQdwfjS.js">
79
- <link rel="modulepreload" crossorigin href="/assets/gitApiHttp-DvIIcDAO.js">
80
- <link rel="modulepreload" crossorigin href="/assets/terminalApi-DAu7xKli.js">
81
- <link rel="modulepreload" crossorigin href="/assets/runtimeConfig-49YbZaqI.js">
82
- <link rel="stylesheet" crossorigin href="/assets/src-BtkWqMFu.css">
79
+ <link rel="modulepreload" crossorigin href="/assets/gitApiHttp-C1DaEMKR.js">
80
+ <link rel="modulepreload" crossorigin href="/assets/terminalApi-BYTA045F.js">
81
+ <link rel="modulepreload" crossorigin href="/assets/runtimeConfig-JSaYFA5x.js">
82
+ <link rel="stylesheet" crossorigin href="/assets/src-B8mzksNL.css">
83
83
  </head>
84
84
  <body class="h-full bg-background text-foreground">
85
85
  <div id="root" class="h-full"></div>
package/package.json CHANGED
@@ -1,6 +1,6 @@
1
1
  {
2
2
  "name": "@openchambery/web",
3
- "version": "1.17.1-beta.7",
3
+ "version": "1.17.1-beta.8",
4
4
  "private": false,
5
5
  "type": "module",
6
6
  "main": "./server/index.js",
package/server/index.d.ts CHANGED
@@ -34,10 +34,4 @@ export declare function parseArgs(argv?: string[]): {
34
34
  port: number;
35
35
  host?: string;
36
36
  uiPassword: string | null;
37
- tryCfTunnel: boolean;
38
- tunnelProvider?: string;
39
- tunnelMode?: string;
40
- tunnelConfigPath?: string | null;
41
- tunnelToken?: string;
42
- tunnelHostname?: string;
43
37
  };
package/server/index.js CHANGED
@@ -12,28 +12,12 @@ import crypto from 'crypto';
12
12
  import http2 from 'node:http2';
13
13
  import { createUiAuth } from './lib/ui-auth/ui-auth.js';
14
14
  import { createTunnelAuth } from './lib/opencode/tunnel-auth.js';
15
- import { createManagedTunnelConfigRuntime } from './lib/tunnels/managed-config.js';
16
- import { createTunnelProviderRegistry } from './lib/tunnels/registry.js';
17
- import { createCloudflareTunnelProvider } from './lib/tunnels/providers/cloudflare.js';
18
- import { createNgrokTunnelProvider } from './lib/tunnels/providers/ngrok.js';
19
15
  import { createRequestSecurityRuntime } from './lib/security/request-security.js';
20
16
  import {
21
17
  getUnauthenticatedLanErrorMessage,
22
18
  isNetworkExposedBindHost,
23
19
  isUnsafeUnauthenticatedLanAllowed,
24
20
  } from './lib/security/bind-host.js';
25
- import {
26
- TUNNEL_MODE_MANAGED_LOCAL,
27
- TUNNEL_MODE_MANAGED_REMOTE,
28
- TUNNEL_MODE_QUICK,
29
- TUNNEL_PROVIDER_CLOUDFLARE,
30
- TunnelServiceError,
31
- isSupportedTunnelMode,
32
- normalizeOptionalPath,
33
- normalizeTunnelStartRequest,
34
- normalizeTunnelMode,
35
- normalizeTunnelProvider,
36
- } from './lib/tunnels/types.js';
37
21
  import { prepareNotificationLastMessage } from './lib/notifications/index.js';
38
22
  import { registerTtsRoutes } from './lib/tts/routes.js';
39
23
  import { detectSayTtsCapability } from './lib/tts/capability-runtime.js';
@@ -124,9 +108,6 @@ const SHUTDOWN_TIMEOUT = 10000;
124
108
  const CLIENT_RELOAD_DELAY_MS = 800;
125
109
  const OPEN_CODE_READY_GRACE_MS = 12000;
126
110
  const LONG_REQUEST_TIMEOUT_MS = 4 * 60 * 1000;
127
- const TUNNEL_BOOTSTRAP_TTL_DEFAULT_MS = 30 * 60 * 1000;
128
- const TUNNEL_BOOTSTRAP_TTL_MIN_MS = 60 * 1000;
129
- const TUNNEL_BOOTSTRAP_TTL_MAX_MS = 24 * 60 * 60 * 1000;
130
111
  const TUNNEL_SESSION_TTL_DEFAULT_MS = 8 * 60 * 60 * 1000;
131
112
  const TUNNEL_SESSION_TTL_MIN_MS = 5 * 60 * 1000;
132
113
  const TUNNEL_SESSION_TTL_MAX_MS = 30 * 24 * 60 * 60 * 1000;
@@ -233,9 +214,6 @@ const settingsNormalizationRuntime = createSettingsNormalizationRuntime({
233
214
  path,
234
215
  processLike: process,
235
216
  realpathSync: fs.realpathSync,
236
- tunnelBootstrapTtlDefaultMs: TUNNEL_BOOTSTRAP_TTL_DEFAULT_MS,
237
- tunnelBootstrapTtlMinMs: TUNNEL_BOOTSTRAP_TTL_MIN_MS,
238
- tunnelBootstrapTtlMaxMs: TUNNEL_BOOTSTRAP_TTL_MAX_MS,
239
217
  tunnelSessionTtlDefaultMs: TUNNEL_SESSION_TTL_DEFAULT_MS,
240
218
  tunnelSessionTtlMinMs: TUNNEL_SESSION_TTL_MIN_MS,
241
219
  tunnelSessionTtlMaxMs: TUNNEL_SESSION_TTL_MAX_MS,
@@ -244,14 +222,7 @@ const settingsNormalizationRuntime = createSettingsNormalizationRuntime({
244
222
  const normalizeDirectoryPath = (...args) => settingsNormalizationRuntime.normalizeDirectoryPath(...args);
245
223
  const normalizePathForPersistence = (...args) => settingsNormalizationRuntime.normalizePathForPersistence(...args);
246
224
  const normalizeSettingsPaths = (...args) => settingsNormalizationRuntime.normalizeSettingsPaths(...args);
247
- const normalizeTunnelBootstrapTtlMs = (...args) => settingsNormalizationRuntime.normalizeTunnelBootstrapTtlMs(...args);
248
225
  const normalizeTunnelSessionTtlMs = (...args) => settingsNormalizationRuntime.normalizeTunnelSessionTtlMs(...args);
249
- const normalizeManagedRemoteTunnelHostname = (...args) =>
250
- settingsNormalizationRuntime.normalizeManagedRemoteTunnelHostname(...args);
251
- const normalizeManagedRemoteTunnelPresets = (...args) =>
252
- settingsNormalizationRuntime.normalizeManagedRemoteTunnelPresets(...args);
253
- const normalizeManagedRemoteTunnelPresetTokens = (...args) =>
254
- settingsNormalizationRuntime.normalizeManagedRemoteTunnelPresetTokens(...args);
255
226
  const isUnsafeSkillRelativePath = (...args) => settingsNormalizationRuntime.isUnsafeSkillRelativePath(...args);
256
227
  const sanitizeTypographySizesPartial = (...args) =>
257
228
  settingsNormalizationRuntime.sanitizeTypographySizesPartial(...args);
@@ -299,38 +270,10 @@ const PUSH_SUBSCRIPTIONS_FILE_PATH = path.join(OPENCHAMBER_DATA_DIR, 'push-subsc
299
270
  const APNS_TOKENS_FILE_PATH = path.join(OPENCHAMBER_DATA_DIR, 'apns-tokens.json');
300
271
  const REMOTE_CLIENTS_FILE_PATH = path.join(OPENCHAMBER_DATA_DIR, 'remote-clients.json');
301
272
  const CLIENT_PAIRING_SESSIONS_FILE_PATH = path.join(OPENCHAMBER_DATA_DIR, 'client-pairing-sessions.json');
302
- const CLOUDFLARE_MANAGED_REMOTE_TUNNELS_FILE_PATH = path.join(OPENCHAMBER_DATA_DIR, 'cloudflare-managed-remote-tunnels.json');
303
- const CLOUDFLARE_LEGACY_NAMED_TUNNELS_FILE_PATH = path.join(OPENCHAMBER_DATA_DIR, 'cloudflare-named-tunnels.json');
304
- const CLOUDFLARE_MANAGED_REMOTE_TUNNELS_VERSION = 1;
305
-
306
- const managedTunnelConfigRuntime = createManagedTunnelConfigRuntime({
307
- fsPromises,
308
- path,
309
- normalizeManagedRemoteTunnelHostname,
310
- normalizeManagedRemoteTunnelPresets,
311
- constants: {
312
- CLOUDFLARE_MANAGED_REMOTE_TUNNELS_FILE_PATH,
313
- CLOUDFLARE_LEGACY_NAMED_TUNNELS_FILE_PATH,
314
- CLOUDFLARE_MANAGED_REMOTE_TUNNELS_VERSION,
315
- },
316
- });
317
-
318
- const readManagedRemoteTunnelConfigFromDisk = (...args) => managedTunnelConfigRuntime.readManagedRemoteTunnelConfigFromDisk(...args);
319
- const syncManagedRemoteTunnelConfigWithPresets = (...args) => managedTunnelConfigRuntime.syncManagedRemoteTunnelConfigWithPresets(...args);
320
- const upsertManagedRemoteTunnelToken = (...args) => managedTunnelConfigRuntime.upsertManagedRemoteTunnelToken(...args);
321
- const resolveManagedRemoteTunnelToken = (...args) => managedTunnelConfigRuntime.resolveManagedRemoteTunnelToken(...args);
322
273
 
323
274
  const settingsHelpers = createSettingsHelpers({
324
275
  normalizePathForPersistence,
325
276
  normalizeDirectoryPath,
326
- normalizeTunnelBootstrapTtlMs,
327
- normalizeTunnelSessionTtlMs,
328
- normalizeTunnelProvider,
329
- normalizeTunnelMode,
330
- normalizeOptionalPath,
331
- normalizeManagedRemoteTunnelHostname,
332
- normalizeManagedRemoteTunnelPresets,
333
- normalizeManagedRemoteTunnelPresetTokens,
334
277
  sanitizeTypographySizesPartial,
335
278
  normalizeStringArray,
336
279
  sanitizeModelRefs,
@@ -369,11 +312,6 @@ const settingsRuntime = createSettingsRuntime({
369
312
  normalizeStringArray,
370
313
  formatSettingsResponse,
371
314
  resolveDirectoryCandidate,
372
- normalizeManagedRemoteTunnelHostname,
373
- normalizeManagedRemoteTunnelPresets,
374
- normalizeManagedRemoteTunnelPresetTokens,
375
- syncManagedRemoteTunnelConfigWithPresets,
376
- upsertManagedRemoteTunnelToken,
377
315
  });
378
316
 
379
317
  const readSettingsFromDiskMigrated = (...args) => settingsRuntime.readSettingsFromDiskMigrated(...args);
@@ -506,16 +444,8 @@ let openCodeNotReadySince = 0;
506
444
  let isExternalOpenCode = false;
507
445
  let exitOnShutdown = true;
508
446
  let uiAuthController = null;
509
- let activeTunnelController = null;
510
447
  let globalWatcherStartPromise = null;
511
- const tunnelProviderRegistry = createTunnelProviderRegistry([
512
- createCloudflareTunnelProvider(),
513
- createNgrokTunnelProvider(),
514
- ]);
515
- tunnelProviderRegistry.seal();
516
448
  const tunnelAuthController = createTunnelAuth();
517
- let runtimeManagedRemoteTunnelToken = '';
518
- let runtimeManagedRemoteTunnelHostname = '';
519
449
  let terminalRuntime = null;
520
450
  let dictationRuntime = null;
521
451
  let messageStreamRuntime = null;
@@ -996,40 +926,7 @@ const bootstrapRuntime = createBootstrapRuntime({
996
926
  registerOpenChamberRoutes,
997
927
  express,
998
928
  });
999
- const tunnelWiringRuntime = createTunnelWiringRuntime({
1000
- crypto,
1001
- URL,
1002
- tunnelProviderRegistry,
1003
- tunnelAuthController,
1004
- readSettingsFromDiskMigrated,
1005
- readManagedRemoteTunnelConfigFromDisk,
1006
- normalizeTunnelProvider,
1007
- normalizeTunnelMode,
1008
- normalizeOptionalPath,
1009
- normalizeManagedRemoteTunnelHostname,
1010
- normalizeTunnelBootstrapTtlMs,
1011
- normalizeTunnelSessionTtlMs,
1012
- isSupportedTunnelMode,
1013
- upsertManagedRemoteTunnelToken,
1014
- resolveManagedRemoteTunnelToken,
1015
- TUNNEL_MODE_QUICK,
1016
- TUNNEL_MODE_MANAGED_LOCAL,
1017
- TUNNEL_MODE_MANAGED_REMOTE,
1018
- TUNNEL_PROVIDER_CLOUDFLARE,
1019
- TunnelServiceError,
1020
- getActiveTunnelController: () => activeTunnelController,
1021
- setActiveTunnelController: (value) => {
1022
- activeTunnelController = value;
1023
- },
1024
- getRuntimeManagedRemoteTunnelHostname: () => runtimeManagedRemoteTunnelHostname,
1025
- setRuntimeManagedRemoteTunnelHostname: (value) => {
1026
- runtimeManagedRemoteTunnelHostname = value;
1027
- },
1028
- getRuntimeManagedRemoteTunnelToken: () => runtimeManagedRemoteTunnelToken,
1029
- setRuntimeManagedRemoteTunnelToken: (value) => {
1030
- runtimeManagedRemoteTunnelToken = value;
1031
- },
1032
- });
929
+ const tunnelWiringRuntime = createTunnelWiringRuntime();
1033
930
  const startupPipelineRuntime = createStartupPipelineRuntime({
1034
931
  createTerminalRuntime,
1035
932
  createDictationRuntime,
@@ -1229,10 +1126,6 @@ const gracefulShutdownRuntime = createGracefulShutdownRuntime({
1229
1126
  setUiAuthController: (value) => {
1230
1127
  uiAuthController = value;
1231
1128
  },
1232
- getActiveTunnelController: () => activeTunnelController,
1233
- setActiveTunnelController: (value) => {
1234
- activeTunnelController = value;
1235
- },
1236
1129
  tunnelAuthController,
1237
1130
  scheduledTasksRuntime,
1238
1131
  closeFeatureRoutes: () => featureRoutesRuntime.close(),
@@ -1334,33 +1227,8 @@ async function main(options = {}) {
1334
1227
  ) {
1335
1228
  throw new Error(getUnauthenticatedLanErrorMessage(effectiveBindHost));
1336
1229
  }
1337
- const tryCfTunnel = options.tryCfTunnel === true;
1338
1230
  const apiOnly = options.apiOnly === true || isEnvFlagEnabled(process.env.OPENCHAMBER_API_ONLY);
1339
- const shouldUseCanonicalTunnelConfig = typeof options.tunnelMode === 'string'
1340
- || typeof options.tunnelProvider === 'string'
1341
- || options.tunnelConfigPath === null
1342
- || typeof options.tunnelConfigPath === 'string'
1343
- || typeof options.tunnelToken === 'string'
1344
- || typeof options.tunnelHostname === 'string';
1345
- const startupTunnelRequest = shouldUseCanonicalTunnelConfig
1346
- ? normalizeTunnelStartRequest({
1347
- provider: normalizeTunnelProvider(options.tunnelProvider),
1348
- mode: options.tunnelMode,
1349
- configPath: normalizeOptionalPath(options.tunnelConfigPath),
1350
- token: typeof options.tunnelToken === 'string' ? options.tunnelToken.trim() : '',
1351
- hostname: normalizeManagedRemoteTunnelHostname(options.tunnelHostname),
1352
- })
1353
- : (tryCfTunnel
1354
- ? {
1355
- provider: TUNNEL_PROVIDER_CLOUDFLARE,
1356
- mode: TUNNEL_MODE_QUICK,
1357
- configPath: undefined,
1358
- token: '',
1359
- hostname: undefined,
1360
- }
1361
- : null);
1362
1231
  const attachSignals = options.attachSignals !== false;
1363
- const onTunnelReady = typeof options.onTunnelReady === 'function' ? options.onTunnelReady : null;
1364
1232
  if (typeof options.exitOnShutdown === 'boolean') {
1365
1233
  exitOnShutdown = options.exitOnShutdown;
1366
1234
  }
@@ -1490,8 +1358,8 @@ async function main(options = {}) {
1490
1358
  server = http.createServer(app);
1491
1359
  let realtimeProxyRuntime = { stop: () => {} };
1492
1360
 
1493
- // The relay service is constructed further below (it depends on the tunnel
1494
- // runtime's active port). The pairing routes registered here only read the
1361
+ // The relay service is constructed further below (it depends on the active
1362
+ // loopback port). The pairing routes registered here only read the
1495
1363
  // relay candidate lazily at request time, so a late-bound holder is enough.
1496
1364
  let relayServiceInstance = null;
1497
1365
 
@@ -1608,11 +1476,10 @@ async function main(options = {}) {
1608
1476
  });
1609
1477
 
1610
1478
  const tunnelRuntimeContext = tunnelWiringRuntime.initialize(app, port);
1611
- const { tunnelService, startTunnelWithNormalizedRequest } = tunnelRuntimeContext;
1612
1479
 
1613
1480
  // Private relay host service: config + management routes + host client
1614
- // lifecycle. Loopback port comes from the same source the tunnel uses so
1615
- // relay-tunneled requests hit the local Express app on 127.0.0.1.
1481
+ // lifecycle. Loopback port comes from the same active-port source used by
1482
+ // pairing/LAN URLs so relay-tunneled requests hit the local Express app on 127.0.0.1.
1616
1483
  const relayService = createRelayService({
1617
1484
  crypto,
1618
1485
  os,
@@ -1735,23 +1602,14 @@ async function main(options = {}) {
1735
1602
  staticRoutesRuntime,
1736
1603
  process,
1737
1604
  crypto,
1738
- normalizeTunnelBootstrapTtlMs,
1739
- readSettingsFromDiskMigrated,
1740
- tunnelAuthController,
1741
- startTunnelWithNormalizedRequest,
1742
1605
  gracefulShutdown,
1743
1606
  getSignalsAttached: () => signalsAttached,
1744
1607
  setSignalsAttached: (value) => {
1745
1608
  signalsAttached = value;
1746
1609
  },
1747
1610
  syncToHmrState,
1748
- TUNNEL_MODE_QUICK,
1749
- TUNNEL_MODE_MANAGED_LOCAL,
1750
- TUNNEL_MODE_MANAGED_REMOTE,
1751
1611
  host,
1752
1612
  port,
1753
- startupTunnelRequest,
1754
- onTunnelReady,
1755
1613
  tunnelRuntimeContext,
1756
1614
  attachSignals,
1757
1615
  apiOnly,
@@ -1786,11 +1644,7 @@ async function main(options = {}) {
1786
1644
  httpServer: server,
1787
1645
  getPort: () => tunnelRuntimeContext.getActivePort(),
1788
1646
  getOpenCodePort: () => openCodePort,
1789
- getTunnelUrl: () => tunnelService.getPublicUrl(),
1790
1647
  getQuitRiskStatus: () => ({
1791
- tunnel: {
1792
- active: Boolean(tunnelService.getPublicUrl()),
1793
- },
1794
1648
  scheduledTasks: scheduledTasksRuntime.getStatus(),
1795
1649
  }),
1796
1650
  isReady: () => isOpenCodeReady,
@@ -1853,8 +1707,6 @@ runCliEntryIfMain({
1853
1707
  currentFilename: __filename,
1854
1708
  parseServeCliOptions,
1855
1709
  defaultPort: DEFAULT_PORT,
1856
- cloudflareProvider: TUNNEL_PROVIDER_CLOUDFLARE,
1857
- managedLocalMode: TUNNEL_MODE_MANAGED_LOCAL,
1858
1710
  setExitOnShutdown: (value) => {
1859
1711
  exitOnShutdown = value;
1860
1712
  },
@@ -24,13 +24,13 @@ This module provides OpenCode server integration utilities for the web server ru
24
24
  - `packages/web/server/lib/opencode/cli-options.js`: CLI/environment option parsing for server startup arguments.
25
25
  - `packages/web/server/lib/opencode/core-routes.js`: server status/system routes, auth/access guard routes, and settings utility route registration.
26
26
  - `packages/web/server/lib/opencode/shutdown-runtime.js`: graceful shutdown orchestration runtime for watcher/session/terminal/process/server teardown.
27
- - `packages/web/server/lib/opencode/server-startup-runtime.js`: server listen/startup tunnel flow and process/signal handler orchestration runtime.
27
+ - `packages/web/server/lib/opencode/server-startup-runtime.js`: server listen/startup flow and process/signal handler orchestration runtime.
28
28
  - `packages/web/server/lib/opencode/static-routes-runtime.js`: static asset/SPA fallback route registration and manifest route wiring.
29
29
  - `packages/web/server/lib/opencode/feature-routes-runtime.js`: feature route composition runtime for dynamic import-backed config/skill/provider route registration.
30
30
  - `packages/web/server/lib/conversations/`: combined create-session-and-prompt orchestration (OpenChamber-owned, registered before generic proxy).
31
31
  - `packages/web/server/lib/session-turn-pages/`: turn-window session message pagination (`GET /api/openchamber/sessions/:sessionID/messages`) and anchor reconcile (`GET .../messages/reconcile`); loops official OpenCode `session.messages` for turn pages and head→anchor gap recovery with continuation/budgets/`resetRequired`; registered before generic proxy. See `session-turn-pages/DOCUMENTATION.md`.
32
32
  - `packages/web/server/lib/opencode/opencode-resolution-runtime.js`: OpenCode binary resolution snapshot runtime for settings routes and diagnostics.
33
- - `packages/web/server/lib/opencode/tunnel-wiring-runtime.js`: tunnel service/routes composition runtime and active-port wiring for main server startup.
33
+ - `packages/web/server/lib/opencode/tunnel-wiring-runtime.js`: active loopback-port wiring shared by pairing/LAN URLs and the private relay host.
34
34
  - `packages/web/server/lib/opencode/startup-pipeline-runtime.js`: server startup tail orchestration runtime for terminal/proxy/static/start-listen flow.
35
35
  - `packages/web/server/lib/opencode/server-utils-runtime.js`: shared server runtime utilities for OpenCode proxy wiring, OpenCode port/readiness helpers, and snapshot fetchers.
36
36
  - `packages/web/server/lib/opencode/openchamber-routes.js`: OpenChamber update, models metadata, session-index, and transcript-cache route registration.
@@ -40,7 +40,7 @@ This module provides OpenCode server integration utilities for the web server ru
40
40
  - `packages/web/server/lib/opencode/skill-routes.js`: route registration for skill config CRUD, supporting files, and skills catalog scan/install flows.
41
41
  - `packages/web/server/lib/opencode/settings-runtime.js`: Settings persistence runtime (disk IO, migrations, normalization, project validation, and persisted update serialization).
42
42
  - `packages/web/server/lib/opencode/settings-helpers.js`: Settings payload sanitization/format helpers runtime for response shaping and persisted merge prep.
43
- - `packages/web/server/lib/opencode/settings-normalization-runtime.js`: path/settings/tunnel normalization and sanitization helpers runtime used by settings/routes/config wiring.
43
+ - `packages/web/server/lib/opencode/settings-normalization-runtime.js`: path/settings normalization and sanitization helpers runtime used by settings/routes/config wiring.
44
44
  - `packages/web/server/lib/opencode/theme-runtime.js`: custom theme JSON validation and theme directory loading runtime for settings utility routes.
45
45
  - `packages/web/server/lib/opencode/proxy.js`: OpenCode API/SSE forwarding and readiness-gate route registration.
46
46
  - `packages/web/server/lib/opencode/instance-recovery-runtime.js`: directory-instance health recovery before turn admission (`prompt_async` / `command` / `shell`). When OpenCode's per-directory instance is poisoned (MCP probe returns 503 empty while HTTP still accepts prompts that immediately abort as `MessageAbortedError`), dispose the instance so the next admission recreates a healthy one.
@@ -202,16 +202,12 @@ This module provides OpenCode server integration utilities for the web server ru
202
202
  - `projectBootstrapSettingsResponse(response)`: projects a formatted settings response into the schema-versioned bootstrap allowlist. General strings are bounded to 512 characters, STT URLs to 4096, language to 64, and custom response-style instructions to 200000.
203
203
 
204
204
  ## Public exports (settings-normalization-runtime.js)
205
- - `createSettingsNormalizationRuntime(dependencies)`: creates normalization/sanitization runtime for shared settings and tunnel helper logic.
205
+ - `createSettingsNormalizationRuntime(dependencies)`: creates normalization/sanitization runtime for shared settings helper logic.
206
206
  - Returned API:
207
207
  - `normalizeDirectoryPath(value)`
208
208
  - `normalizePathForPersistence(value)`
209
209
  - `normalizeSettingsPaths(input)`
210
- - `normalizeTunnelBootstrapTtlMs(value)`
211
210
  - `normalizeTunnelSessionTtlMs(value)`
212
- - `normalizeManagedRemoteTunnelHostname(value)`
213
- - `normalizeManagedRemoteTunnelPresets(value)`
214
- - `normalizeManagedRemoteTunnelPresetTokens(value)`
215
211
  - `isUnsafeSkillRelativePath(value)`
216
212
  - `sanitizeTypographySizesPartial(input)`
217
213
  - `normalizeStringArray(input)`
@@ -318,7 +314,7 @@ When adding or changing Host HTTP APIs that mobile/desktop clients reach over Pr
318
314
  - `gracefulShutdown(options?)`: accepts `forceCloseConnections: true` for runtimes that close remaining HTTP connections after initiating server close.
319
315
 
320
316
  ## Public exports (server-startup-runtime.js)
321
- - `createServerStartupRuntime(dependencies)`: creates runtime for server bind/startup tunnel and process handler wiring.
317
+ - `createServerStartupRuntime(dependencies)`: creates runtime for server bind/listen and process handler wiring.
322
318
  - Returned API:
323
319
  - `resolveBindHost(host)`
324
320
  - `startListeningAndMaybeTunnel(options)`
@@ -340,7 +336,7 @@ When adding or changing Host HTTP APIs that mobile/desktop clients reach over Pr
340
336
  - `getOpenCodeResolutionSnapshot(settings)`: returns configured/resolved OpenCode binary details plus effective managed-launch fields (`launchBinary`, `launchArgs`, `launchWrapperType`) when applicable.
341
337
 
342
338
  ## Public exports (tunnel-wiring-runtime.js)
343
- - `createTunnelWiringRuntime(dependencies)`: creates runtime for tunnel service construction and tunnel route registration.
339
+ - `createTunnelWiringRuntime()`: creates runtime for tracking the active loopback listen port used by pairing/LAN URLs and the private relay host.
344
340
  - Returned API:
345
341
  - `initialize(app, initialPort)`
346
342
 
@@ -4,8 +4,6 @@ export const runCliEntryIfMain = (dependencies) => {
4
4
  currentFilename,
5
5
  parseServeCliOptions,
6
6
  defaultPort,
7
- cloudflareProvider,
8
- managedLocalMode,
9
7
  setExitOnShutdown,
10
8
  startServer,
11
9
  } = dependencies;
@@ -19,20 +17,12 @@ export const runCliEntryIfMain = (dependencies) => {
19
17
  argv: process.argv.slice(2),
20
18
  env: process.env,
21
19
  defaultPort,
22
- cloudflareProvider,
23
- managedLocalMode,
24
20
  });
25
21
 
26
22
  setExitOnShutdown(true);
27
23
  startServer({
28
24
  port: cliOptions.port,
29
25
  host: cliOptions.host,
30
- tryCfTunnel: cliOptions.tryCfTunnel,
31
- tunnelProvider: cliOptions.tunnelProvider,
32
- tunnelMode: cliOptions.tunnelMode,
33
- tunnelConfigPath: cliOptions.tunnelConfigPath,
34
- tunnelToken: cliOptions.tunnelToken,
35
- tunnelHostname: cliOptions.tunnelHostname,
36
26
  attachSignals: true,
37
27
  exitOnShutdown: true,
38
28
  uiPassword: cliOptions.uiPassword,
@@ -2,35 +2,18 @@ export const parseServeCliOptions = ({
2
2
  argv = [],
3
3
  env = {},
4
4
  defaultPort,
5
- cloudflareProvider,
6
- managedLocalMode,
7
5
  }) => {
8
6
  const args = Array.isArray(argv) ? [...argv] : [];
9
7
  const envPassword =
10
8
  env.OPENCHAMBER_UI_PASSWORD ||
11
9
  env.OPENCODE_UI_PASSWORD ||
12
10
  null;
13
- const envCfTunnel = env.OPENCHAMBER_TRY_CF_TUNNEL === 'true';
14
- const envTunnelProvider = env.OPENCHAMBER_TUNNEL_PROVIDER || undefined;
15
- const envTunnelMode = env.OPENCHAMBER_TUNNEL_MODE || undefined;
16
- const envTunnelConfigRaw = env.OPENCHAMBER_TUNNEL_CONFIG;
17
- const envTunnelConfig = typeof envTunnelConfigRaw === 'string'
18
- ? (envTunnelConfigRaw.trim().length > 0 ? envTunnelConfigRaw.trim() : null)
19
- : undefined;
20
- const envTunnelToken = env.OPENCHAMBER_TUNNEL_TOKEN || undefined;
21
- const envTunnelHostname = env.OPENCHAMBER_TUNNEL_HOSTNAME || undefined;
22
11
  const envApiOnly = env.OPENCHAMBER_API_ONLY === '1' || env.OPENCHAMBER_API_ONLY === 'true';
23
12
 
24
13
  const options = {
25
14
  port: defaultPort,
26
15
  host: undefined,
27
16
  uiPassword: envPassword,
28
- tryCfTunnel: envCfTunnel,
29
- tunnelProvider: envTunnelProvider,
30
- tunnelMode: envTunnelMode,
31
- tunnelConfigPath: envTunnelConfig,
32
- tunnelToken: envTunnelToken,
33
- tunnelHostname: envTunnelHostname,
34
17
  apiOnly: envApiOnly,
35
18
  };
36
19
 
@@ -81,54 +64,6 @@ export const parseServeCliOptions = ({
81
64
  options.apiOnly = true;
82
65
  continue;
83
66
  }
84
-
85
- if (optionName === 'try-cf-tunnel') {
86
- options.tryCfTunnel = true;
87
- continue;
88
- }
89
-
90
- if (optionName === 'tunnel-provider') {
91
- const { value, nextIndex } = consumeValue(i, inlineValue);
92
- i = nextIndex;
93
- options.tunnelProvider = typeof value === 'string' ? value : options.tunnelProvider;
94
- continue;
95
- }
96
-
97
- if (optionName === 'tunnel-mode') {
98
- const { value, nextIndex } = consumeValue(i, inlineValue);
99
- i = nextIndex;
100
- options.tunnelMode = typeof value === 'string' ? value : options.tunnelMode;
101
- continue;
102
- }
103
-
104
- if (optionName === 'tunnel-config') {
105
- const { value, nextIndex } = consumeValue(i, inlineValue);
106
- i = nextIndex;
107
- options.tunnelConfigPath = typeof value === 'string' ? value : null;
108
- continue;
109
- }
110
-
111
- if (optionName === 'tunnel-token') {
112
- const { value, nextIndex } = consumeValue(i, inlineValue);
113
- i = nextIndex;
114
- options.tunnelToken = typeof value === 'string' ? value : options.tunnelToken;
115
- continue;
116
- }
117
-
118
- if (optionName === 'tunnel-hostname') {
119
- const { value, nextIndex } = consumeValue(i, inlineValue);
120
- i = nextIndex;
121
- options.tunnelHostname = typeof value === 'string' ? value : options.tunnelHostname;
122
- continue;
123
- }
124
-
125
- if (optionName === 'tunnel') {
126
- const { value, nextIndex } = consumeValue(i, inlineValue);
127
- i = nextIndex;
128
- options.tunnelProvider = cloudflareProvider;
129
- options.tunnelMode = managedLocalMode;
130
- options.tunnelConfigPath = typeof value === 'string' ? value : null;
131
- }
132
67
  }
133
68
 
134
69
  return options;
@@ -1000,8 +1000,7 @@ export const registerAuthAndAccessRoutes = (app, dependencies) => {
1000
1000
  app.get('/connect', async (req, res) => {
1001
1001
  try {
1002
1002
  const token = typeof req.query?.t === 'string' ? req.query.t : '';
1003
- const settings = await readSettingsFromDiskMigrated();
1004
- const tunnelSessionTtlMs = normalizeTunnelSessionTtlMs(settings?.tunnelSessionTtlMs);
1003
+ const tunnelSessionTtlMs = normalizeTunnelSessionTtlMs();
1005
1004
 
1006
1005
  const exchange = tunnelAuthController.exchangeBootstrapToken({
1007
1006
  req,
@@ -1164,8 +1163,7 @@ export const registerCommonRequestMiddleware = (app, dependencies) => {
1164
1163
  req.path.startsWith('/api/goals') ||
1165
1164
  req.path.startsWith('/api/text') ||
1166
1165
  req.path.startsWith('/api/voice') ||
1167
- req.path.startsWith('/api/tts') ||
1168
- req.path.startsWith('/api/openchamber/tunnel')
1166
+ req.path.startsWith('/api/tts')
1169
1167
  ) {
1170
1168
  express.json({ limit: '50mb' })(req, res, next);
1171
1169
  } else if (req.path.startsWith('/api')) {
@@ -68,7 +68,6 @@ describe('settings route', () => {
68
68
  responseStylePreset: 'concise',
69
69
  responseStyleCustomInstructions: 'Keep it brief.',
70
70
  summaryCustomAPIToken: 'response-secret-sentinel',
71
- managedRemoteTunnelToken: 'tunnel-secret-sentinel',
72
71
  themeId: 'default',
73
72
  };
74
73
  const formatSettingsResponse = vi.fn(() => formatted);