@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.
- package/README.md +3 -39
- package/bin/cli-output.js +0 -16
- package/bin/cli.js +3 -66
- package/bin/cli.test.js +4 -81
- package/bin/lib/DOCUMENTATION.md +5 -19
- package/bin/lib/cli-args.js +3 -327
- package/bin/lib/cli-http.js +0 -16
- package/bin/lib/cli-lifecycle.js +2 -111
- package/bin/lib/cli-paths.js +0 -57
- package/dist/assets/{AgentAvatar-htFrIvQx.js → AgentAvatar-C6Hxu5_o.js} +1 -1
- package/dist/assets/{AssistantView-BZiJsNuI.js → AssistantView-ZlXc0xFT.js} +1 -1
- package/dist/assets/{ChatContainer-CdmcMnL3.js → ChatContainer-BXFy3Uu2.js} +5 -5
- package/dist/assets/{DiagramView-B7sq74V-.js → DiagramView-CgotrQyK.js} +1 -1
- package/dist/assets/{FadeInOnReveal-8fY7XL23.js → FadeInOnReveal-CvNA_aGD.js} +1 -1
- package/dist/assets/{Icon-B7eLbnyj.js → Icon-BPJ_quEe.js} +1 -1
- package/dist/assets/{MarkdownRendererImpl-DICju9ve.js → MarkdownRendererImpl-Cj4y0P0S.js} +1 -1
- package/dist/assets/{MobileDetailNavigation-CuxWU1yf.js → MobileDetailNavigation-5tAL5d_M.js} +1 -1
- package/dist/assets/{MobileShareBridge-CPg9Eyro.js → MobileShareBridge-BL7Ehxhd.js} +1 -1
- package/dist/assets/{MobileSurface-D7sDH_tx.js → MobileSurface-ByMnQ5rD.js} +1 -1
- package/dist/assets/{MultiRunWindow-MSO0Equt.js → MultiRunWindow-Che7L3TX.js} +1 -1
- package/dist/assets/{OnboardingScreen-C87u_MLg.js → OnboardingScreen-CdvaEBtt.js} +1 -1
- package/dist/assets/{OverlayScrollbar-Kmmybw-z.js → OverlayScrollbar-C2pEDFq-.js} +1 -1
- package/dist/assets/SettingsView-D0p-e8Px.js +25 -0
- package/dist/assets/{SettingsWindow-Bl25cfXX.js → SettingsWindow-KYhsFUrb.js} +1 -1
- package/dist/assets/{TerminalView-jR5jP1b0.js → TerminalView-Da5aLqHR.js} +1 -1
- package/dist/assets/{ToolOutputDialog-DCEZb2DZ.js → ToolOutputDialog-DZI4uxx3.js} +1 -1
- package/dist/assets/{appThemeRegistry-aiRF-s3c.js → appThemeRegistry-DAgBeFsZ.js} +2 -2
- package/dist/assets/{button-bYWkDtDI.js → button-BmNJBT13.js} +1 -1
- package/dist/assets/{clipboard-CzpzN4Um.js → clipboard-CXWbHCAk.js} +1 -1
- package/dist/assets/{collapsible-A1PFvMRp.js → collapsible-68IqWBM1.js} +1 -1
- package/dist/assets/{context-menu-CkpHn-Bm.js → context-menu-BXH0AcOc.js} +1 -1
- package/dist/assets/desktopHosts-BpjUSDz4.js +1 -0
- package/dist/assets/{desktopRelayRestore-C5vYnSTd.js → desktopRelayRestore-BzUEk1i7.js} +1 -1
- package/dist/assets/{diagram-BkwKWaTO.js → diagram-YN0GZ1Q0.js} +1 -1
- package/dist/assets/{dialog-DW7-_iqo.js → dialog-BV1ENlLf.js} +1 -1
- package/dist/assets/es-EXZUX1sB.js +15 -0
- package/dist/assets/{fileQueries-P9SX4YwC.js → fileQueries-i4oziMnC.js} +1 -1
- package/dist/assets/fr-jWNPO91J.js +13 -0
- package/dist/assets/{gitApi-CMsZ2v08.js → gitApi-BW5AFgD1.js} +1 -1
- package/dist/assets/{gitApiHttp-DvIIcDAO.js → gitApiHttp-C1DaEMKR.js} +1 -1
- package/dist/assets/{input-B9aNttqV.js → input-BLVhPvhN.js} +1 -1
- package/dist/assets/{insertionBoundaries-Di3rCXgN.js → insertionBoundaries-D4KbXFFj.js} +1 -1
- package/dist/assets/ja-Dcb0VtDE.js +15 -0
- package/dist/assets/ko-CX71xNDX.js +15 -0
- package/dist/assets/{main-DY27kMV5.js → main-CcyyPAib.js} +2 -2
- package/dist/assets/{main-Chtf300b.js → main-DzxdsF_k.js} +5 -5
- package/dist/assets/{markdown-worker-BoB1_DPo.js → markdown-worker-Cq3Twp1A.js} +1 -1
- package/dist/assets/{markdownTheme-om5XcPqq.js → markdownTheme-CCnvI6L0.js} +1 -1
- package/dist/assets/{miniChat-BWbpl5SN.js → miniChat-BsNf9y48.js} +2 -2
- package/dist/assets/mobile-CsJg2IAq.js +2 -0
- package/dist/assets/{multirun-BfPcVktg.js → multirun-qs5hZkwM.js} +1 -1
- package/dist/assets/persistence-C_KCiMcY.js +3 -0
- package/dist/assets/{pl-BSjLn4dm.js → pl-mR_3Sqr8.js} +2 -2
- package/dist/assets/{projectMeta-CiAR7MRG.js → projectMeta-1SSTNg8w.js} +1 -1
- package/dist/assets/pt-BR-D1RpVOvC.js +15 -0
- package/dist/assets/radio-DBJG9Dd1.js +1 -0
- package/dist/assets/{renderElectronMiniChatApp-CiEXAVSt.js → renderElectronMiniChatApp-DOWE0jSA.js} +2 -2
- package/dist/assets/{renderMobileApp-BHvgSVPk.js → renderMobileApp-bklJJSZi.js} +3 -3
- package/dist/assets/{runtimeConfig-49YbZaqI.js → runtimeConfig-JSaYFA5x.js} +1 -1
- package/dist/assets/{runtimeEndpointReset-CdhtjuPe.js → runtimeEndpointReset-ix1NxqYw.js} +1 -1
- package/dist/assets/{sortable-tabs-strip-XeYica3j.js → sortable-tabs-strip-DncWjNx4.js} +1 -1
- package/dist/assets/src-B8mzksNL.css +2 -0
- package/dist/assets/store-oojlrF4d.js +15 -0
- package/dist/assets/{terminalApi-DAu7xKli.js → terminalApi-BYTA045F.js} +1 -1
- package/dist/assets/{tooltip-BSlxaNrR.js → tooltip-BYGBBTc2.js} +1 -1
- package/dist/assets/uk-UvnVqWv-.js +15 -0
- package/dist/assets/{url-DjkTDrad.js → url-CGHw6D-E.js} +1 -1
- package/dist/assets/useAppFontEffects-B1EhZNex.js +7 -0
- package/dist/assets/{useDesktopWindowControlsLayout-BwYnhrEy.js → useDesktopWindowControlsLayout-Dc69l-pm.js} +1 -1
- package/dist/assets/{useEffectiveDirectory-CEmsrrEs.js → useEffectiveDirectory-dCGvvYRh.js} +1 -1
- package/dist/assets/{useFontPreferences-BxMT_kty.js → useFontPreferences-Bu4ME5hk.js} +1 -1
- package/dist/assets/{useMobileNavigationStore-DryW-QdG.js → useMobileNavigationStore-DhkIZBJw.js} +4 -4
- package/dist/assets/useSessionAutoCleanup-D-r9oDye.js +1 -0
- package/dist/assets/{useWorkerHighlightedLines-CFW2AoPL.js → useWorkerHighlightedLines-05dLFgTI.js} +1 -1
- package/dist/assets/{utils-RUACCsOs.js → utils-DyUyiLje.js} +1 -1
- package/dist/assets/zh-CN-9v-RC966.js +15 -0
- package/dist/assets/zh-TW-BZ_wZdC-.js +15 -0
- package/dist/index.html +8 -8
- package/dist/mini-chat.html +8 -8
- package/dist/mobile.html +8 -8
- package/package.json +1 -1
- package/server/index.d.ts +0 -6
- package/server/index.js +5 -153
- package/server/lib/opencode/DOCUMENTATION.md +6 -10
- package/server/lib/opencode/cli-entry-runtime.js +0 -10
- package/server/lib/opencode/cli-options.js +0 -65
- package/server/lib/opencode/core-routes.js +2 -4
- package/server/lib/opencode/routes.test.js +0 -1
- package/server/lib/opencode/server-startup-runtime.js +0 -55
- package/server/lib/opencode/settings-helpers.js +0 -55
- package/server/lib/opencode/settings-helpers.test.js +0 -20
- package/server/lib/opencode/settings-normalization-runtime.js +0 -87
- package/server/lib/opencode/settings-normalization-runtime.test.js +0 -3
- package/server/lib/opencode/settings-runtime.js +9 -102
- package/server/lib/opencode/settings-runtime.test.js +0 -10
- package/server/lib/opencode/shutdown-runtime.js +1 -9
- package/server/lib/opencode/shutdown-runtime.test.js +0 -2
- package/server/lib/opencode/startup-pipeline-runtime.js +0 -20
- package/server/lib/opencode/startup-pipeline-runtime.test.js +2 -3
- package/server/lib/opencode/tunnel-wiring-runtime.js +2 -80
- package/server/lib/relay/DOCUMENTATION.md +1 -1
- package/bin/lib/cli-tunnel-capabilities.js +0 -9
- package/bin/lib/cli-tunnel-profiles.js +0 -366
- package/bin/lib/cli-tunnel-utils.js +0 -300
- package/bin/lib/commands-tunnel.js +0 -1761
- package/dist/assets/SettingsView-5YNu54KI.js +0 -25
- package/dist/assets/desktopHosts-D5m_ggY1.js +0 -1
- package/dist/assets/es-Cei_75Jt.js +0 -15
- package/dist/assets/fr-Dn7WSHh2.js +0 -13
- package/dist/assets/ja-DFARVqVj.js +0 -15
- package/dist/assets/ko-pyLnIyDY.js +0 -15
- package/dist/assets/mobile-DEQeGskq.js +0 -2
- package/dist/assets/persistence-CHA81Od7.js +0 -3
- package/dist/assets/pt-BR-DaWvr_0A.js +0 -15
- package/dist/assets/radio-BnF4XhCC.js +0 -1
- package/dist/assets/src-BtkWqMFu.css +0 -2
- package/dist/assets/store-DIpqFVjs.js +0 -15
- package/dist/assets/uk-CHCRqRKf.js +0 -15
- package/dist/assets/useAppFontEffects-BRNICZS2.js +0 -7
- package/dist/assets/useSessionAutoCleanup-DMJ1LiW_.js +0 -1
- package/dist/assets/zh-CN-BWEQZKXk.js +0 -15
- package/dist/assets/zh-TW-BbO-gJq3.js +0 -15
- package/server/lib/cloudflare-tunnel.js +0 -618
- package/server/lib/ngrok-tunnel.js +0 -343
- package/server/lib/ngrok-tunnel.test.js +0 -50
- package/server/lib/tunnels/DOCUMENTATION.md +0 -21
- package/server/lib/tunnels/executable-search.js +0 -140
- package/server/lib/tunnels/executable-search.test.js +0 -96
- package/server/lib/tunnels/index.js +0 -179
- package/server/lib/tunnels/index.test.js +0 -93
- package/server/lib/tunnels/install-help.js +0 -56
- package/server/lib/tunnels/install-help.test.js +0 -31
- package/server/lib/tunnels/managed-config.js +0 -201
- package/server/lib/tunnels/providers/cloudflare.js +0 -266
- package/server/lib/tunnels/providers/ngrok.js +0 -123
- package/server/lib/tunnels/registry.js +0 -51
- package/server/lib/tunnels/routes.js +0 -610
- package/server/lib/tunnels/types.js +0 -245
- 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-
|
|
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-
|
|
564
|
-
<link rel="modulepreload" crossorigin href="/assets/desktopHosts-
|
|
565
|
-
<link rel="modulepreload" crossorigin href="/assets/desktopRelayRestore-
|
|
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-
|
|
569
|
-
<link rel="modulepreload" crossorigin href="/assets/terminalApi-
|
|
570
|
-
<link rel="modulepreload" crossorigin href="/assets/runtimeConfig-
|
|
571
|
-
<link rel="stylesheet" crossorigin href="/assets/src-
|
|
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
|
package/dist/mini-chat.html
CHANGED
|
@@ -74,7 +74,7 @@
|
|
|
74
74
|
}
|
|
75
75
|
</style>
|
|
76
76
|
|
|
77
|
-
<script type="module" crossorigin src="/assets/miniChat-
|
|
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-
|
|
86
|
-
<link rel="modulepreload" crossorigin href="/assets/desktopHosts-
|
|
87
|
-
<link rel="modulepreload" crossorigin href="/assets/desktopRelayRestore-
|
|
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-
|
|
91
|
-
<link rel="modulepreload" crossorigin href="/assets/terminalApi-
|
|
92
|
-
<link rel="modulepreload" crossorigin href="/assets/runtimeConfig-
|
|
93
|
-
<link rel="stylesheet" crossorigin href="/assets/src-
|
|
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-
|
|
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-
|
|
75
|
-
<link rel="modulepreload" crossorigin href="/assets/desktopHosts-
|
|
76
|
-
<link rel="modulepreload" crossorigin href="/assets/desktopRelayRestore-
|
|
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-
|
|
80
|
-
<link rel="modulepreload" crossorigin href="/assets/terminalApi-
|
|
81
|
-
<link rel="modulepreload" crossorigin href="/assets/runtimeConfig-
|
|
82
|
-
<link rel="stylesheet" crossorigin href="/assets/src-
|
|
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
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
|
|
1494
|
-
//
|
|
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
|
|
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
|
|
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`:
|
|
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
|
|
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
|
|
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/
|
|
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(
|
|
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
|
|
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);
|