@fased/fased 0.1.30 → 0.1.31
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/CHANGELOG.md +7 -0
- package/dist/{agents-BU4NqZkn.js → agents-B7oe96FC.js} +8 -8
- package/dist/{attachment-normalize-D3LvGnxE.js → attachment-normalize-B-UXOsKN.js} +1 -1
- package/dist/{attachment-normalize-3_V1yb6a.js → attachment-normalize-Ch3m3gW7.js} +1 -1
- package/dist/{audio-preflight-B4hZi0X5.js → audio-preflight-BLnXSrbe.js} +1 -1
- package/dist/{audio-preflight-YPQKo93v.js → audio-preflight-DWAgAnFF.js} +1 -1
- package/dist/{audio-preflight-r8PHFHTe.js → audio-preflight-DWXq2U0B.js} +2 -2
- package/dist/{audio-preflight-DcQrkXYr.js → audio-preflight-JeAEvjmi.js} +2 -2
- package/dist/{audio-preflight-MUfVeIPT.js → audio-preflight-UFD3iTyT.js} +2 -2
- package/dist/{audit-ChF16w3M.js → audit-C11zzpna.js} +1 -1
- package/dist/{audit-BNmzld5I.js → audit-uEYwrVh1.js} +1 -1
- package/dist/{auth-choice-BJGGTOYU.js → auth-choice-CvM0GCEt.js} +1 -1
- package/dist/{auth-choice-UvbBnRhr.js → auth-choice-fxfJkTWE.js} +1 -1
- package/dist/{auth-choice-prompt-9uH2hSjM.js → auth-choice-prompt-CZWGTWFF.js} +1 -1
- package/dist/{auth-choice-prompt-CPoTg_-G.js → auth-choice-prompt-DgZ_-DFR.js} +1 -1
- package/dist/{auth-DGXGqcN7.js → auth-miYdUxcO.js} +5 -5
- package/dist/build-info.json +3 -3
- package/dist/bundled/boot-md/handler.js +2 -2
- package/dist/bundled/session-memory/handler.js +2 -2
- package/dist/canvas-host/a2ui/.bundle.hash +1 -1
- package/dist/{channel-web-DLD1undh.js → channel-web-CEpBiX-Q.js} +1 -1
- package/dist/{channel-web-0wKGD4yD.js → channel-web-DRFSKnVi.js} +1 -1
- package/dist/{channels-B9bvlD7y.js → channels-Bzj2_yUj.js} +6 -6
- package/dist/{channels-CBT56Ap7.js → channels-CY1sX0bz.js} +6 -6
- package/dist/{channels-cli-D6ioLe8o.js → channels-cli-BruuPCkp.js} +5 -5
- package/dist/{channels-cli-CK1qojpR.js → channels-cli-CRfpkLwo.js} +5 -5
- package/dist/cli/daemon-cli.js +1 -1
- package/dist/{cli-ByaZFcQl.js → cli-BXBAZCT8.js} +2 -2
- package/dist/{cli-DgHb9Vld.js → cli-BgodEMPl.js} +2 -2
- package/dist/{command-registry-mptWJW8S.js → command-registry-CU64eZmw.js} +9 -9
- package/dist/{completion-cli-DyJbXhbh.js → completion-cli-CWke3Y2I.js} +1 -1
- package/dist/{completion-cli-BRvgVQzN.js → completion-cli-DNlt3cBf.js} +2 -2
- package/dist/{config-cli-BrzPOli4.js → config-cli-BugbkifH.js} +1 -1
- package/dist/{config-cli-R0TQZDi7.js → config-cli-DTLNqY4I.js} +1 -1
- package/dist/{configure-Bt3nH-_I.js → configure-BYcI4db_.js} +12 -12
- package/dist/{configure-pREf12zB.js → configure-XZxBL9XF.js} +12 -12
- package/dist/control-ui/assets/app-DXYMrRJ9.js.map +1 -1
- package/dist/{cron-cli-BIYfBpRP.js → cron-cli-BAT3nsi8.js} +2 -2
- package/dist/{cron-cli-zdoRLQ0m.js → cron-cli-BzceMqJm.js} +2 -2
- package/dist/{daemon-cli-LLGP6g2r.js → daemon-cli-5_eqnI7H.js} +77 -38
- package/dist/{daemon-cli-Cj4_RgEM.js → daemon-cli-JvoxFHRy.js} +77 -38
- package/dist/daemon-cli.js +76 -37
- package/dist/{deps-sd-SQKYn.js → deps-BWahcXVa.js} +1 -1
- package/dist/{deps-QnUngXA3.js → deps-CkOczIqw.js} +1 -1
- package/dist/entry.js +1 -1
- package/dist/extensionAPI.js +1 -1
- package/dist/{gateway-cli-Cn3STpYX.js → gateway-cli-D0rc9BQT.js} +27 -27
- package/dist/{gateway-cli-yfNsUzH6.js → gateway-cli-DZwQlnd-.js} +27 -27
- package/dist/{health-BfGnSyOV.js → health-CtFbngOI.js} +2 -2
- package/dist/{health-DcurJYny.js → health-Dx0abJui.js} +2 -2
- package/dist/{heartbeat-runner-CY41VFZE.js → heartbeat-runner-CnzA9MCj.js} +1 -1
- package/dist/{heartbeat-runner-CJZStXhx.js → heartbeat-runner-DBcCEPYX.js} +1 -1
- package/dist/{hooks-cli-WtC65axA.js → hooks-cli-C4nrKQB8.js} +3 -3
- package/dist/{hooks-cli-DpkFISKR.js → hooks-cli-ED4F4hgZ.js} +3 -3
- package/dist/index.js +7 -7
- package/dist/{ipv4-CdRPraPM.js → ipv4-BiVsHcPZ.js} +2 -2
- package/dist/{ipv4-BkY__Z0A.js → ipv4-p6oBdL3i.js} +2 -2
- package/dist/{lifecycle-DUPuKIvd.js → lifecycle-DN1VLZsk.js} +1 -1
- package/dist/{lifecycle-Dd-6tFQk.js → lifecycle-DXPbWOOF.js} +1 -1
- package/dist/{list.auth-overview-DcdJySBi.js → list.auth-overview-SGV043-s.js} +1 -1
- package/dist/{list.auth-overview-CE2_GQ-8.js → list.auth-overview-qQ-PSQWI.js} +1 -1
- package/dist/llm-slug-generator.js +2 -2
- package/dist/{model-catalog-DOuyqwFa.js → model-catalog-DTeRSOlM.js} +6 -6
- package/dist/{models-ItVo4_FF.js → models-DNWCoAr6.js} +4 -4
- package/dist/{models-cli-DKEzhF9X.js → models-cli-6JDQwXLP.js} +4 -4
- package/dist/{models-cli-YznPWFUE.js → models-cli-8Ogt1Nai.js} +5 -5
- package/dist/{node-cli-CZaJUGYu.js → node-cli-B5XUZW_F.js} +2 -2
- package/dist/{node-cli-qkHTKDmW.js → node-cli-BPQ4Bj27.js} +2 -2
- package/dist/{onboard-Cpw2fP2S.js → onboard-Bkmx2_JM.js} +6 -6
- package/dist/{onboard--COJdfXc.js → onboard-CoIQYNfB.js} +6 -6
- package/dist/{onboard-channels-BH6atgy1.js → onboard-channels-6l52GEWY.js} +2 -2
- package/dist/{onboard-channels-CbQgdo3k.js → onboard-channels-B-CHfy-_.js} +2 -2
- package/dist/{onboard-search-BxaAdq5U.js → onboard-search-CXl_FBtA.js} +5 -5
- package/dist/{onboard-search-Bg8qvHBV.js → onboard-search-DitZYPTM.js} +5 -5
- package/dist/{onboarding-B-_4gKpN.js → onboarding-BAdN-hFD.js} +7 -7
- package/dist/{onboarding-DiuUZg9l.js → onboarding-DnPBiIlf.js} +7 -7
- package/dist/{openresponses-http-BVdja8Nj.js → openresponses-http-C4uMHFQG.js} +2 -2
- package/dist/{openresponses-http-svQwMBaq.js → openresponses-http-CWOcu9i9.js} +2 -2
- package/dist/{openresponses-http-BNIAyGrH.js → openresponses-http-CdFdfFbo.js} +1 -1
- package/dist/{openresponses-http-DGAqU5K9.js → openresponses-http-CgJamjpH.js} +1 -1
- package/dist/{openresponses-http-DhBER2sI.js → openresponses-http-cj2oimfW.js} +2 -2
- package/dist/{parent-default-help-DUqMyqko.js → parent-default-help-BT7FBzs-.js} +1 -1
- package/dist/{parent-default-help-B2mCEhav.js → parent-default-help-ecMFlg2S.js} +1 -1
- package/dist/{paths-zdeD1PNp.js → paths-BrYFwmxy.js} +9 -9
- package/dist/{pi-embedded-CrKlYvWM.js → pi-embedded-BMW4AO0b.js} +14 -14
- package/dist/{pi-embedded-DPl5Aqw4.js → pi-embedded-YWZsPSdf.js} +5 -5
- package/dist/{plugin-registry-BBzitaxQ.js → plugin-registry-CwfvRSs4.js} +1 -1
- package/dist/{plugin-registry-CIiRwpQv.js → plugin-registry-DA_1IBe0.js} +1 -1
- package/dist/plugin-sdk/{audio-preflight-DcJUk03P.js → audio-preflight-B-GNQeK0.js} +1 -1
- package/dist/plugin-sdk/{audio-preflight-B-__-RfZ.js → audio-preflight-DeP8VHC6.js} +1 -1
- package/dist/plugin-sdk/{channel-web-DoGtD0PQ.js → channel-web-QaRgsb6f.js} +1 -1
- package/dist/plugin-sdk/command-status.js +1 -1
- package/dist/plugin-sdk/index.js +2 -2
- package/dist/plugin-sdk/{openresponses-http-VFgg_bR4.js → openresponses-http-BISP9-A6.js} +1 -1
- package/dist/plugin-sdk/{openresponses-http-DQWJE95u.js → openresponses-http-DenlQldm.js} +1 -1
- package/dist/plugin-sdk/{reply-D4WNXysa.js → reply-DQSn23Jt.js} +5 -5
- package/dist/plugin-sdk/src/brand.d.ts +2 -2
- package/dist/plugin-sdk/{status-BlX9jStp.js → status-CkAJPulJ.js} +5 -5
- package/dist/plugin-sdk/{web-Cr8AJx43.js → web-0HkZCM7O.js} +2 -2
- package/dist/plugin-sdk/{web-CEucw6Dl.js → web-Cav7vEAd.js} +1 -1
- package/dist/{plugins-cli-B9w9SKYa.js → plugins-cli-CIumz1mA.js} +5 -5
- package/dist/{plugins-cli-CdRa6xYi.js → plugins-cli-NtgUFN5F.js} +5 -5
- package/dist/{program-C9wZbb_-.js → program-CSz1D1dG.js} +7 -7
- package/dist/{program-context-Dc8hoANx.js → program-context-DI-GvkMR.js} +24 -24
- package/dist/{prompt-select-styled-oUCALY2N.js → prompt-select-styled-n_A35tSP.js} +4 -4
- package/dist/{prompt-select-styled-9E7HlPjk.js → prompt-select-styled-vQMrGEwY.js} +4 -4
- package/dist/{pw-ai-5b6U6vNE.js → pw-ai-AEM6NhZt.js} +1 -1
- package/dist/{register.agent-BhoMAqJe.js → register.agent-CpHR4A6v.js} +8 -8
- package/dist/{register.agent-Dty2GQos.js → register.agent-DD-U7oGb.js} +9 -9
- package/dist/{register.configure-CjQhBudl.js → register.configure-C3qRt8Z2.js} +12 -12
- package/dist/{register.configure-DZl7w5Se.js → register.configure-CsmE4__F.js} +12 -12
- package/dist/{register.maintenance-CGFQEESj.js → register.maintenance-C1pTDCfr.js} +9 -9
- package/dist/{register.maintenance-C9_UzTyI.js → register.maintenance-Dw9XWs6B.js} +8 -8
- package/dist/{register.message-DnrC31ZC.js → register.message-C5H4BaZR.js} +3 -3
- package/dist/{register.message-C3BTjmhg.js → register.message-D1vEgAqq.js} +3 -3
- package/dist/{register.onboard-DzO2dNpB.js → register.onboard-C2ZqqRHb.js} +14 -14
- package/dist/{register.onboard-DIxJ1bFs.js → register.onboard-Dd5wooum.js} +14 -14
- package/dist/{register.setup-B5Ji_Smo.js → register.setup-S47GDXlI.js} +14 -14
- package/dist/{register.setup-Cd8rXata.js → register.setup-wdsoq3BF.js} +14 -14
- package/dist/{register.status-health-sessions-CUw6awJ6.js → register.status-health-sessions-BoN2hOA8.js} +6 -6
- package/dist/{register.status-health-sessions-CYpKmq3y.js → register.status-health-sessions-C876VSZh.js} +6 -6
- package/dist/{register.subclis-DEnba1hq.js → register.subclis-BT84Bn-_.js} +16 -16
- package/dist/{reply-DVGmtLPq.js → reply-jrONH9Y7.js} +6 -6
- package/dist/{run-main-BqiU1shU.js → run-main-C6XcZlLi.js} +14 -14
- package/dist/{runtime-helper-grants-BQl2Y_KJ.js → runtime-helper-grants-Jas30vI5.js} +1 -1
- package/dist/{runtime-helper-grants-CHz5azhO.js → runtime-helper-grants-kih7jkmx.js} +1 -1
- package/dist/{sandbox-cli-C7tRjHGl.js → sandbox-cli-Bfj6NbE1.js} +2 -2
- package/dist/{sandbox-cli-BLWfhZh2.js → sandbox-cli-C9wECeaH.js} +2 -2
- package/dist/{security-cli-DGCfCHzM.js → security-cli-B1c376KU.js} +3 -3
- package/dist/{security-cli-0-5Vgk1A.js → security-cli-Dz7uvFDt.js} +3 -3
- package/dist/{server-DamsmTjm.js → server-B2nRkZJD.js} +2 -2
- package/dist/{server-BMZYE37o.js → server-DYUU_xzp.js} +2 -2
- package/dist/{server-cron-BUWyjpTV.js → server-cron-BgVg0Xr0.js} +2 -2
- package/dist/{server-cron-DC9t05LU.js → server-cron-DiMWX26M.js} +2 -2
- package/dist/{server-node-events-C3IOxSF_.js → server-node-events-BTIgBj-Y.js} +3 -3
- package/dist/{server-node-events-cusaGrcY.js → server-node-events-CD7PjM02.js} +3 -3
- package/dist/{status-CrL7Hp3R.js → status-C1h5Ta_q.js} +4 -4
- package/dist/{status-Dlt3xwcf.js → status-CnhP8fx7.js} +4 -4
- package/dist/{status-Doqt5wXN.js → status-DkMo6n1P.js} +1 -1
- package/dist/{status-B39ZJFhD.js → status-aMuRqtjs.js} +1 -1
- package/dist/{tui-DdPEVWjR.js → tui-BuCSCKXc.js} +1 -1
- package/dist/{tui-R-P_OV8J.js → tui-DM671Mke.js} +1 -1
- package/dist/{tui-cli-ChpP9FsL.js → tui-cli-Cfw5R0S8.js} +3 -3
- package/dist/{tui-cli-BgihXvs7.js → tui-cli-DjI4QOzV.js} +3 -3
- package/dist/{update-cli-DVCjSLYw.js → update-cli-BL1PUycr.js} +10 -10
- package/dist/{update-cli-DPdSuHZT.js → update-cli-Bl5opT2O.js} +9 -9
- package/dist/{update-runner-DNPfs265.js → update-runner-BNiDZKyO.js} +1 -1
- package/dist/{update-runner-COs-YDhT.js → update-runner-Col2sOeF.js} +1 -1
- package/dist/{web-BHp_2XHP.js → web-0I3YFoDZ.js} +1 -1
- package/dist/{web-DQuQBwMr.js → web-Blq5sWxH.js} +2 -2
- package/dist/{web-vGE7qeF-.js → web-C7I6HVNX.js} +1 -1
- package/dist/{web-D8bq1XRX.js → web-D-gMdQkD.js} +3 -3
- package/dist/{web-B2SWpLdC.js → web-_igiL4AE.js} +3 -3
- package/dist/{web-search-providers.runtime-CiOoq6G3.js → web-search-providers.runtime-CzUamtQl.js} +1 -1
- package/dist/{web-search-providers.runtime-BD9Vp8eD.js → web-search-providers.runtime-pv7Jv2d6.js} +1 -1
- package/extensions/acpx/package.json +1 -1
- package/extensions/bluebubbles/package.json +1 -1
- package/extensions/copilot-proxy/package.json +1 -1
- package/extensions/diagnostics-otel/package.json +1 -1
- package/extensions/discord/package.json +1 -1
- package/extensions/fased-federation/package.json +1 -1
- package/extensions/feishu/package.json +1 -1
- package/extensions/google-gemini-cli-auth/package.json +1 -1
- package/extensions/googlechat/package.json +1 -1
- package/extensions/imessage/package.json +1 -1
- package/extensions/irc/package.json +1 -1
- package/extensions/line/package.json +1 -1
- package/extensions/llm-task/package.json +1 -1
- package/extensions/lobster/package.json +1 -1
- package/extensions/matrix/CHANGELOG.md +6 -0
- package/extensions/matrix/package.json +1 -1
- package/extensions/mattermost/package.json +1 -1
- package/extensions/memory-core/package.json +1 -1
- package/extensions/memory-lancedb/package.json +1 -1
- package/extensions/minimax-portal-auth/package.json +1 -1
- package/extensions/msteams/CHANGELOG.md +6 -0
- package/extensions/msteams/package.json +1 -1
- package/extensions/nextcloud-talk/package.json +1 -1
- package/extensions/nostr/CHANGELOG.md +6 -0
- package/extensions/nostr/package.json +1 -1
- package/extensions/open-prose/package.json +1 -1
- package/extensions/sat-mining/package.json +1 -1
- package/extensions/signal/package.json +1 -1
- package/extensions/slack/package.json +1 -1
- package/extensions/synology-chat/package.json +1 -1
- package/extensions/telegram/package.json +1 -1
- package/extensions/tlon/package.json +1 -1
- package/extensions/twitch/CHANGELOG.md +6 -0
- package/extensions/twitch/package.json +1 -1
- package/extensions/voice-call/CHANGELOG.md +6 -0
- package/extensions/voice-call/package.json +1 -1
- package/extensions/whatsapp/package.json +1 -1
- package/extensions/zalo/CHANGELOG.md +6 -0
- package/extensions/zalo/package.json +1 -1
- package/extensions/zalouser/CHANGELOG.md +6 -0
- package/extensions/zalouser/package.json +1 -1
- package/package.json +1 -1
- package/src/brand.ts +1 -1
- package/src/canvas-host/a2ui/.bundle.hash +1 -1
- package/src/cli/daemon-cli/lifecycle.ts +23 -0
- package/src/cli/daemon-cli/restart-health.ts +37 -1
- package/src/cli/daemon-cli/status.gather.ts +37 -3
|
@@ -1 +1 @@
|
|
|
1
|
-
|
|
1
|
+
24e7a81f8ec190d5c9f255805c2c41d611c27cfe776316cef88d5e3019985050
|
|
@@ -1,5 +1,7 @@
|
|
|
1
1
|
import { loadConfig, resolveGatewayPort } from "../../config/config.js";
|
|
2
2
|
import { resolveGatewayService } from "../../daemon/service.js";
|
|
3
|
+
import { resolveGatewayCredentialsFromConfig } from "../../gateway/credentials.js";
|
|
4
|
+
import { loadGatewayTlsRuntime } from "../../infra/tls/gateway.js";
|
|
3
5
|
import { defaultRuntime } from "../../runtime.js";
|
|
4
6
|
import { theme } from "../../terminal/theme.js";
|
|
5
7
|
import { formatCliCommand } from "../command-format.js";
|
|
@@ -35,6 +37,25 @@ async function resolveGatewayRestartPort() {
|
|
|
35
37
|
return portFromArgs ?? resolveGatewayPort(loadConfig(), mergedEnv);
|
|
36
38
|
}
|
|
37
39
|
|
|
40
|
+
async function resolveGatewayRestartRpc(port: number) {
|
|
41
|
+
const cfg = loadConfig();
|
|
42
|
+
const tlsRuntime =
|
|
43
|
+
cfg.gateway?.tls?.enabled === true ? await loadGatewayTlsRuntime(cfg.gateway.tls) : undefined;
|
|
44
|
+
const scheme = tlsRuntime?.enabled ? "wss" : "ws";
|
|
45
|
+
const auth = resolveGatewayCredentialsFromConfig({
|
|
46
|
+
cfg,
|
|
47
|
+
env: process.env,
|
|
48
|
+
modeOverride: "local",
|
|
49
|
+
});
|
|
50
|
+
return {
|
|
51
|
+
url: `${scheme}://127.0.0.1:${port}`,
|
|
52
|
+
token: auth.token,
|
|
53
|
+
password: auth.password,
|
|
54
|
+
tlsFingerprint: tlsRuntime?.enabled ? tlsRuntime.fingerprintSha256 : undefined,
|
|
55
|
+
timeoutMs: 1_500,
|
|
56
|
+
};
|
|
57
|
+
}
|
|
58
|
+
|
|
38
59
|
export async function runDaemonUninstall(opts: DaemonLifecycleOptions = {}) {
|
|
39
60
|
return await runServiceUninstall({
|
|
40
61
|
serviceNoun: "Gateway",
|
|
@@ -88,6 +109,7 @@ export async function runDaemonRestart(opts: DaemonLifecycleOptions = {}): Promi
|
|
|
88
109
|
port: restartPort,
|
|
89
110
|
attempts: POST_RESTART_HEALTH_ATTEMPTS,
|
|
90
111
|
delayMs: POST_RESTART_HEALTH_DELAY_MS,
|
|
112
|
+
rpc: await resolveGatewayRestartRpc(restartPort),
|
|
91
113
|
});
|
|
92
114
|
|
|
93
115
|
if (!health.healthy && health.staleGatewayPids.length > 0) {
|
|
@@ -105,6 +127,7 @@ export async function runDaemonRestart(opts: DaemonLifecycleOptions = {}): Promi
|
|
|
105
127
|
port: restartPort,
|
|
106
128
|
attempts: POST_RESTART_HEALTH_ATTEMPTS,
|
|
107
129
|
delayMs: POST_RESTART_HEALTH_DELAY_MS,
|
|
130
|
+
rpc: await resolveGatewayRestartRpc(restartPort),
|
|
108
131
|
});
|
|
109
132
|
}
|
|
110
133
|
|
|
@@ -7,6 +7,7 @@ import {
|
|
|
7
7
|
type PortUsage,
|
|
8
8
|
} from "../../infra/ports.js";
|
|
9
9
|
import { sleep } from "../../utils.js";
|
|
10
|
+
import { probeGatewayStatus } from "./probe.js";
|
|
10
11
|
|
|
11
12
|
export const DEFAULT_RESTART_HEALTH_TIMEOUT_MS = 60_000;
|
|
12
13
|
export const DEFAULT_RESTART_HEALTH_DELAY_MS = 500;
|
|
@@ -18,6 +19,10 @@ export type GatewayRestartSnapshot = {
|
|
|
18
19
|
runtime: GatewayServiceRuntime;
|
|
19
20
|
portUsage: PortUsage;
|
|
20
21
|
healthy: boolean;
|
|
22
|
+
rpc?: {
|
|
23
|
+
ok: boolean;
|
|
24
|
+
error?: string;
|
|
25
|
+
};
|
|
21
26
|
staleGatewayPids: number[];
|
|
22
27
|
};
|
|
23
28
|
|
|
@@ -32,6 +37,13 @@ export async function inspectGatewayRestart(params: {
|
|
|
32
37
|
service: GatewayService;
|
|
33
38
|
port: number;
|
|
34
39
|
env?: NodeJS.ProcessEnv;
|
|
40
|
+
rpc?: {
|
|
41
|
+
url: string;
|
|
42
|
+
token?: string;
|
|
43
|
+
password?: string;
|
|
44
|
+
tlsFingerprint?: string;
|
|
45
|
+
timeoutMs: number;
|
|
46
|
+
};
|
|
35
47
|
}): Promise<GatewayRestartSnapshot> {
|
|
36
48
|
const env = params.env ?? process.env;
|
|
37
49
|
let runtime: GatewayServiceRuntime = { status: "unknown" };
|
|
@@ -67,7 +79,18 @@ export async function inspectGatewayRestart(params: {
|
|
|
67
79
|
? portUsage.listeners.some((listener) => listenerOwnedByRuntimePid({ listener, runtimePid }))
|
|
68
80
|
: gatewayListeners.length > 0 ||
|
|
69
81
|
(portUsage.status === "busy" && portUsage.listeners.length === 0);
|
|
70
|
-
const
|
|
82
|
+
const shouldProbeRpc = running && ownsPort && params.rpc;
|
|
83
|
+
const rpc = shouldProbeRpc
|
|
84
|
+
? await probeGatewayStatus({
|
|
85
|
+
url: params.rpc.url,
|
|
86
|
+
token: params.rpc.token,
|
|
87
|
+
password: params.rpc.password,
|
|
88
|
+
tlsFingerprint: params.rpc.tlsFingerprint,
|
|
89
|
+
timeoutMs: params.rpc.timeoutMs,
|
|
90
|
+
json: true,
|
|
91
|
+
})
|
|
92
|
+
: undefined;
|
|
93
|
+
const healthy = running && ownsPort && (rpc ? rpc.ok : true);
|
|
71
94
|
const staleGatewayPids = Array.from(
|
|
72
95
|
new Set(
|
|
73
96
|
gatewayListeners
|
|
@@ -89,6 +112,7 @@ export async function inspectGatewayRestart(params: {
|
|
|
89
112
|
runtime,
|
|
90
113
|
portUsage,
|
|
91
114
|
healthy,
|
|
115
|
+
...(rpc ? { rpc } : {}),
|
|
92
116
|
staleGatewayPids,
|
|
93
117
|
};
|
|
94
118
|
}
|
|
@@ -99,6 +123,13 @@ export async function waitForGatewayHealthyRestart(params: {
|
|
|
99
123
|
attempts?: number;
|
|
100
124
|
delayMs?: number;
|
|
101
125
|
env?: NodeJS.ProcessEnv;
|
|
126
|
+
rpc?: {
|
|
127
|
+
url: string;
|
|
128
|
+
token?: string;
|
|
129
|
+
password?: string;
|
|
130
|
+
tlsFingerprint?: string;
|
|
131
|
+
timeoutMs: number;
|
|
132
|
+
};
|
|
102
133
|
}): Promise<GatewayRestartSnapshot> {
|
|
103
134
|
const attempts = params.attempts ?? DEFAULT_RESTART_HEALTH_ATTEMPTS;
|
|
104
135
|
const delayMs = params.delayMs ?? DEFAULT_RESTART_HEALTH_DELAY_MS;
|
|
@@ -107,6 +138,7 @@ export async function waitForGatewayHealthyRestart(params: {
|
|
|
107
138
|
service: params.service,
|
|
108
139
|
port: params.port,
|
|
109
140
|
env: params.env,
|
|
141
|
+
rpc: params.rpc,
|
|
110
142
|
});
|
|
111
143
|
|
|
112
144
|
for (let attempt = 0; attempt < attempts; attempt += 1) {
|
|
@@ -121,6 +153,7 @@ export async function waitForGatewayHealthyRestart(params: {
|
|
|
121
153
|
service: params.service,
|
|
122
154
|
port: params.port,
|
|
123
155
|
env: params.env,
|
|
156
|
+
rpc: params.rpc,
|
|
124
157
|
});
|
|
125
158
|
}
|
|
126
159
|
|
|
@@ -151,6 +184,9 @@ export function renderRestartDiagnostics(snapshot: GatewayRestartSnapshot): stri
|
|
|
151
184
|
if (snapshot.portUsage.errors?.length) {
|
|
152
185
|
lines.push(`Port diagnostics errors: ${snapshot.portUsage.errors.join("; ")}`);
|
|
153
186
|
}
|
|
187
|
+
if (snapshot.rpc && !snapshot.rpc.ok) {
|
|
188
|
+
lines.push(`Gateway RPC probe: failed${snapshot.rpc.error ? ` (${snapshot.rpc.error})` : ""}.`);
|
|
189
|
+
}
|
|
154
190
|
|
|
155
191
|
return lines;
|
|
156
192
|
}
|
|
@@ -13,6 +13,7 @@ import { auditGatewayServiceConfig } from "../../daemon/service-audit.js";
|
|
|
13
13
|
import { resolveGatewayService } from "../../daemon/service.js";
|
|
14
14
|
import { resolveGatewayBindHost } from "../../gateway/net.js";
|
|
15
15
|
import {
|
|
16
|
+
classifyPortListener,
|
|
16
17
|
formatPortDiagnostics,
|
|
17
18
|
inspectPortUsage,
|
|
18
19
|
type PortListener,
|
|
@@ -96,16 +97,49 @@ export type DaemonStatus = {
|
|
|
96
97
|
extraServices: Array<{ label: string; detail: string; scope: string }>;
|
|
97
98
|
};
|
|
98
99
|
|
|
99
|
-
function shouldReportPortUsage(
|
|
100
|
-
|
|
100
|
+
function shouldReportPortUsage(
|
|
101
|
+
port: DaemonStatus["port"] | undefined,
|
|
102
|
+
rpcOk?: boolean,
|
|
103
|
+
runtime?: DaemonStatus["service"]["runtime"],
|
|
104
|
+
) {
|
|
105
|
+
if (!port || port.status !== "busy") {
|
|
101
106
|
return false;
|
|
102
107
|
}
|
|
103
108
|
if (rpcOk === true) {
|
|
104
109
|
return false;
|
|
105
110
|
}
|
|
111
|
+
if (isExpectedSingleGatewayListener(port, runtime)) {
|
|
112
|
+
return false;
|
|
113
|
+
}
|
|
106
114
|
return true;
|
|
107
115
|
}
|
|
108
116
|
|
|
117
|
+
function isExpectedSingleGatewayListener(
|
|
118
|
+
port: DaemonStatus["port"],
|
|
119
|
+
runtime?: DaemonStatus["service"]["runtime"],
|
|
120
|
+
): boolean {
|
|
121
|
+
if (!port || port.status !== "busy" || runtime?.status !== "running") {
|
|
122
|
+
return false;
|
|
123
|
+
}
|
|
124
|
+
if (port.listeners.length === 0) {
|
|
125
|
+
return false;
|
|
126
|
+
}
|
|
127
|
+
const gatewayListeners = port.listeners.filter(
|
|
128
|
+
(listener) => classifyPortListener(listener, port.port) === "gateway",
|
|
129
|
+
);
|
|
130
|
+
if (gatewayListeners.length !== port.listeners.length) {
|
|
131
|
+
return false;
|
|
132
|
+
}
|
|
133
|
+
const pids = Array.from(
|
|
134
|
+
new Set(
|
|
135
|
+
gatewayListeners
|
|
136
|
+
.map((listener) => listener.pid)
|
|
137
|
+
.filter((pid): pid is number => typeof pid === "number" && Number.isFinite(pid)),
|
|
138
|
+
),
|
|
139
|
+
);
|
|
140
|
+
return pids.length <= 1;
|
|
141
|
+
}
|
|
142
|
+
|
|
109
143
|
export async function gatherDaemonStatus(
|
|
110
144
|
opts: {
|
|
111
145
|
rpc: GatewayRpcOpts;
|
|
@@ -285,7 +319,7 @@ export async function gatherDaemonStatus(
|
|
|
285
319
|
}
|
|
286
320
|
|
|
287
321
|
export function renderPortDiagnosticsForCli(status: DaemonStatus, rpcOk?: boolean): string[] {
|
|
288
|
-
if (!status.port
|
|
322
|
+
if (!shouldReportPortUsage(status.port, rpcOk, status.service.runtime)) {
|
|
289
323
|
return [];
|
|
290
324
|
}
|
|
291
325
|
return formatPortDiagnostics({
|