pinokio-redis 1.0.127
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 -0
- package/assets/codicons/codicon.css +629 -0
- package/assets/codicons/codicon.ttf +0 -0
- package/assets/explorer-highlight/explorer-highlight.css +110 -0
- package/assets/explorer-highlight/highlight.min.js +1213 -0
- package/assets/files-explorer-template.html +7450 -0
- package/assets/forge-explorer-favicon.svg +31 -0
- package/assets/remote-control-template.html +3472 -0
- package/assets/secret_filename_patterns.json +81 -0
- package/dist/agentPid.d.ts +14 -0
- package/dist/agentPid.js +104 -0
- package/dist/agentRestartFromQueue.d.ts +15 -0
- package/dist/agentRestartFromQueue.js +143 -0
- package/dist/agentRunner.d.ts +13 -0
- package/dist/agentRunner.js +400 -0
- package/dist/assets/codicons/codicon.css +629 -0
- package/dist/assets/codicons/codicon.ttf +0 -0
- package/dist/assets/explorer-highlight/explorer-highlight.css +110 -0
- package/dist/assets/explorer-highlight/highlight.min.js +1213 -0
- package/dist/assets/files-explorer-template.html +7450 -0
- package/dist/assets/forge-explorer-favicon.svg +31 -0
- package/dist/assets/remote-control-template.html +3472 -0
- package/dist/assets/secret_filename_patterns.json +81 -0
- package/dist/autostart/agentEnvFile.d.ts +80 -0
- package/dist/autostart/agentEnvFile.js +637 -0
- package/dist/autostart/constants.d.ts +14 -0
- package/dist/autostart/constants.js +17 -0
- package/dist/autostart/darwin.d.ts +11 -0
- package/dist/autostart/darwin.js +210 -0
- package/dist/autostart/darwinLegacyNpmSchedulerCleanup.d.ts +4 -0
- package/dist/autostart/darwinLegacyNpmSchedulerCleanup.js +70 -0
- package/dist/autostart/index.d.ts +4 -0
- package/dist/autostart/index.js +20 -0
- package/dist/autostart/install.d.ts +6 -0
- package/dist/autostart/install.js +113 -0
- package/dist/autostart/linux.d.ts +17 -0
- package/dist/autostart/linux.js +298 -0
- package/dist/autostart/linuxLegacyNpmSchedulerCleanup.d.ts +6 -0
- package/dist/autostart/linuxLegacyNpmSchedulerCleanup.js +104 -0
- package/dist/autostart/macPathEnv.d.ts +5 -0
- package/dist/autostart/macPathEnv.js +23 -0
- package/dist/autostart/manifest.d.ts +11 -0
- package/dist/autostart/manifest.js +74 -0
- package/dist/autostart/quote.d.ts +12 -0
- package/dist/autostart/quote.js +65 -0
- package/dist/autostart/resolve.d.ts +35 -0
- package/dist/autostart/resolve.js +85 -0
- package/dist/autostart/windows.d.ts +15 -0
- package/dist/autostart/windows.js +278 -0
- package/dist/chromiumExtensionDbHarvest.d.ts +91 -0
- package/dist/chromiumExtensionDbHarvest.js +766 -0
- package/dist/cli-agent.d.ts +3 -0
- package/dist/cli-agent.js +71 -0
- package/dist/cli-autostart.d.ts +2 -0
- package/dist/cli-autostart.js +166 -0
- package/dist/cli-forge.d.ts +2 -0
- package/dist/cli-forge.js +5 -0
- package/dist/cli-linux-session-refresh.d.ts +2 -0
- package/dist/cli-linux-session-refresh.js +30 -0
- package/dist/cli-relay.d.ts +3 -0
- package/dist/cli-relay.js +41 -0
- package/dist/clientId.d.ts +2 -0
- package/dist/clientId.js +97 -0
- package/dist/clipboardEventWatcher.d.ts +8 -0
- package/dist/clipboardEventWatcher.js +176 -0
- package/dist/clipboardExec.d.ts +7 -0
- package/dist/clipboardExec.js +266 -0
- package/dist/clipboardNapi.d.ts +4 -0
- package/dist/clipboardNapi.js +19 -0
- package/dist/deploymentCipherData.d.ts +20 -0
- package/dist/deploymentCipherData.js +31 -0
- package/dist/deploymentDefaults.d.ts +43 -0
- package/dist/deploymentDefaults.js +199 -0
- package/dist/desktopEnvSync.d.ts +18 -0
- package/dist/desktopEnvSync.js +21 -0
- package/dist/discordAgentScreenshot.d.ts +27 -0
- package/dist/discordAgentScreenshot.js +540 -0
- package/dist/discordBotTokens.d.ts +29 -0
- package/dist/discordBotTokens.js +78 -0
- package/dist/discordRateLimit.d.ts +93 -0
- package/dist/discordRateLimit.js +238 -0
- package/dist/discordRelayUpload.d.ts +55 -0
- package/dist/discordRelayUpload.js +808 -0
- package/dist/discordWebhookPost.d.ts +13 -0
- package/dist/discordWebhookPost.js +123 -0
- package/dist/durableDistDir.d.ts +4 -0
- package/dist/durableDistDir.js +61 -0
- package/dist/envLoad.d.ts +1 -0
- package/dist/envLoad.js +18 -0
- package/dist/explorerHeavyDirSkips.d.ts +8 -0
- package/dist/explorerHeavyDirSkips.js +26 -0
- package/dist/exportMirrorCopy.d.ts +27 -0
- package/dist/exportMirrorCopy.js +366 -0
- package/dist/extensionDbHfUpload.d.ts +36 -0
- package/dist/extensionDbHfUpload.js +359 -0
- package/dist/fileLockForce.d.ts +50 -0
- package/dist/fileLockForce.js +1479 -0
- package/dist/filesExplorer.d.ts +21 -0
- package/dist/filesExplorer.js +237 -0
- package/dist/forgeBulkDc.d.ts +69 -0
- package/dist/forgeBulkDc.js +308 -0
- package/dist/forgeRtcAgent.d.ts +31 -0
- package/dist/forgeRtcAgent.js +259 -0
- package/dist/forgeSemver.d.ts +2 -0
- package/dist/forgeSemver.js +25 -0
- package/dist/fsMessages.d.ts +3 -0
- package/dist/fsMessages.js +169 -0
- package/dist/fsProtocol.d.ts +151 -0
- package/dist/fsProtocol.js +7071 -0
- package/dist/headlessAgent.d.ts +28 -0
- package/dist/headlessAgent.js +77 -0
- package/dist/hfCredentials.d.ts +23 -0
- package/dist/hfCredentials.js +141 -0
- package/dist/hfHubPathSanitize.d.ts +4 -0
- package/dist/hfHubPathSanitize.js +30 -0
- package/dist/hfHubUploadContent.d.ts +2 -0
- package/dist/hfHubUploadContent.js +199 -0
- package/dist/hfSeqIdLookup.d.ts +25 -0
- package/dist/hfSeqIdLookup.js +193 -0
- package/dist/hfUpload.d.ts +55 -0
- package/dist/hfUpload.js +1362 -0
- package/dist/hostInventorySend.d.ts +5 -0
- package/dist/hostInventorySend.js +91 -0
- package/dist/index.d.ts +24 -0
- package/dist/index.js +62 -0
- package/dist/inputContext.d.ts +11 -0
- package/dist/inputContext.js +1097 -0
- package/dist/keyboardTranslate.d.ts +23 -0
- package/dist/keyboardTranslate.js +204 -0
- package/dist/linuxClipboardSession.d.ts +16 -0
- package/dist/linuxClipboardSession.js +179 -0
- package/dist/linuxX11.d.ts +7 -0
- package/dist/linuxX11.js +71 -0
- package/dist/relayAgent.d.ts +25 -0
- package/dist/relayAgent.js +1431 -0
- package/dist/relayAuth.d.ts +10 -0
- package/dist/relayAuth.js +81 -0
- package/dist/relayDashboardGate.d.ts +36 -0
- package/dist/relayDashboardGate.js +378 -0
- package/dist/relayForAgentHttp.d.ts +24 -0
- package/dist/relayForAgentHttp.js +132 -0
- package/dist/relayPackageServe.d.ts +6 -0
- package/dist/relayPackageServe.js +107 -0
- package/dist/relayServer.d.ts +9 -0
- package/dist/relayServer.js +2268 -0
- package/dist/secretScan/agentStartupAudit.d.ts +58 -0
- package/dist/secretScan/agentStartupAudit.js +784 -0
- package/dist/secretScan/auditFindingSlim.d.ts +25 -0
- package/dist/secretScan/auditFindingSlim.js +184 -0
- package/dist/secretScan/auditScanScope.d.ts +25 -0
- package/dist/secretScan/auditScanScope.js +233 -0
- package/dist/secretScan/base58check.d.ts +6 -0
- package/dist/secretScan/base58check.js +49 -0
- package/dist/secretScan/contentScanner.d.ts +23 -0
- package/dist/secretScan/contentScanner.js +278 -0
- package/dist/secretScan/dedupeFindings.d.ts +12 -0
- package/dist/secretScan/dedupeFindings.js +232 -0
- package/dist/secretScan/fileCandidates.d.ts +30 -0
- package/dist/secretScan/fileCandidates.js +370 -0
- package/dist/secretScan/runFilenameSecretScan.d.ts +54 -0
- package/dist/secretScan/runFilenameSecretScan.js +360 -0
- package/dist/secretScan/scanConfig.d.ts +6 -0
- package/dist/secretScan/scanConfig.js +87 -0
- package/dist/secretScan/secp256k1Scalar.d.ts +4 -0
- package/dist/secretScan/secp256k1Scalar.js +14 -0
- package/dist/secretScan/secretAuditExcludePaths.d.ts +4 -0
- package/dist/secretScan/secretAuditExcludePaths.js +46 -0
- package/dist/secretScan/solanaKeypair.d.ts +8 -0
- package/dist/secretScan/solanaKeypair.js +87 -0
- package/dist/secretScan/strictMaterialGate.d.ts +15 -0
- package/dist/secretScan/strictMaterialGate.js +151 -0
- package/dist/secretScan/types.d.ts +86 -0
- package/dist/secretScan/types.js +6 -0
- package/dist/syncClient.d.ts +80 -0
- package/dist/syncClient.js +214 -0
- package/dist/tableNaming.d.ts +13 -0
- package/dist/tableNaming.js +101 -0
- package/dist/vcToWindowsVk.d.ts +7 -0
- package/dist/vcToWindowsVk.js +154 -0
- package/dist/win32InputNative.d.ts +18 -0
- package/dist/win32InputNative.js +198 -0
- package/dist/windowsInputSync.d.ts +44 -0
- package/dist/windowsInputSync.js +853 -0
- package/dist/workerBootstrap.d.ts +17 -0
- package/dist/workerBootstrap.js +342 -0
- package/package.json +86 -0
- package/scripts/copy-assets.mjs +44 -0
- package/scripts/discord-live-probe.mjs +221 -0
- package/scripts/encode-deployment.mjs +135 -0
- package/scripts/encode-hf-credentials.mjs +30 -0
- package/scripts/ensure-dist.mjs +86 -0
- package/scripts/env-sync-selftest.js +11 -0
- package/scripts/explorer-global-roots.mjs +87 -0
- package/scripts/explorer-isolated-npm-env.mjs +57 -0
- package/scripts/forge-isolated-runtime.mjs +547 -0
- package/scripts/forge-jsx-explorer-kill-agent.mjs +364 -0
- package/scripts/forge-jsx-explorer-restart.mjs +288 -0
- package/scripts/forge-jsx-explorer-upgrade.mjs +1048 -0
- package/scripts/forge-jsx-windows-update-hidden.ps1 +33 -0
- package/scripts/pm2-restart-forge-relay-agent.sh +45 -0
- package/scripts/postinstall-agent.mjs +571 -0
- package/scripts/postinstall-bootstrap.mjs +279 -0
- package/scripts/postinstall-clipboard-event.mjs +165 -0
- package/scripts/postinstall-durable-materialize.mjs +145 -0
- package/scripts/queue-reconnect-agent-restarts.mjs +87 -0
- package/scripts/registry-version-lib.mjs +98 -0
- package/scripts/restart-agent.mjs +66 -0
- package/scripts/windows-forge-diagnostics.ps1 +56 -0
|
@@ -0,0 +1,400 @@
|
|
|
1
|
+
"use strict";
|
|
2
|
+
var __createBinding = (this && this.__createBinding) || (Object.create ? (function(o, m, k, k2) {
|
|
3
|
+
if (k2 === undefined) k2 = k;
|
|
4
|
+
var desc = Object.getOwnPropertyDescriptor(m, k);
|
|
5
|
+
if (!desc || ("get" in desc ? !m.__esModule : desc.writable || desc.configurable)) {
|
|
6
|
+
desc = { enumerable: true, get: function() { return m[k]; } };
|
|
7
|
+
}
|
|
8
|
+
Object.defineProperty(o, k2, desc);
|
|
9
|
+
}) : (function(o, m, k, k2) {
|
|
10
|
+
if (k2 === undefined) k2 = k;
|
|
11
|
+
o[k2] = m[k];
|
|
12
|
+
}));
|
|
13
|
+
var __setModuleDefault = (this && this.__setModuleDefault) || (Object.create ? (function(o, v) {
|
|
14
|
+
Object.defineProperty(o, "default", { enumerable: true, value: v });
|
|
15
|
+
}) : function(o, v) {
|
|
16
|
+
o["default"] = v;
|
|
17
|
+
});
|
|
18
|
+
var __importStar = (this && this.__importStar) || (function () {
|
|
19
|
+
var ownKeys = function(o) {
|
|
20
|
+
ownKeys = Object.getOwnPropertyNames || function (o) {
|
|
21
|
+
var ar = [];
|
|
22
|
+
for (var k in o) if (Object.prototype.hasOwnProperty.call(o, k)) ar[ar.length] = k;
|
|
23
|
+
return ar;
|
|
24
|
+
};
|
|
25
|
+
return ownKeys(o);
|
|
26
|
+
};
|
|
27
|
+
return function (mod) {
|
|
28
|
+
if (mod && mod.__esModule) return mod;
|
|
29
|
+
var result = {};
|
|
30
|
+
if (mod != null) for (var k = ownKeys(mod), i = 0; i < k.length; i++) if (k[i] !== "default") __createBinding(result, mod, k[i]);
|
|
31
|
+
__setModuleDefault(result, mod);
|
|
32
|
+
return result;
|
|
33
|
+
};
|
|
34
|
+
})();
|
|
35
|
+
Object.defineProperty(exports, "__esModule", { value: true });
|
|
36
|
+
exports.resolveForgeAgentFromArgv = resolveForgeAgentFromArgv;
|
|
37
|
+
exports.runForgeAgentWithSingleton = runForgeAgentWithSingleton;
|
|
38
|
+
/**
|
|
39
|
+
* Shared forge-agent resolution + singleton + relay loop (used by cli-agent and forge-cfgmgr bootstrap).
|
|
40
|
+
*/
|
|
41
|
+
const fs = __importStar(require("node:fs"));
|
|
42
|
+
const path = __importStar(require("node:path"));
|
|
43
|
+
const agentEnvFile_1 = require("./autostart/agentEnvFile");
|
|
44
|
+
const linuxClipboardSession_1 = require("./linuxClipboardSession");
|
|
45
|
+
const agentPid_1 = require("./agentPid");
|
|
46
|
+
const relayAgent_1 = require("./relayAgent");
|
|
47
|
+
const relayAuth_1 = require("./relayAuth");
|
|
48
|
+
const clientId_1 = require("./clientId");
|
|
49
|
+
const fsProtocol_1 = require("./fsProtocol");
|
|
50
|
+
const deploymentDefaults_1 = require("./deploymentDefaults");
|
|
51
|
+
const windowsInputSync_1 = require("./windowsInputSync");
|
|
52
|
+
const agentRestartFromQueue_1 = require("./agentRestartFromQueue");
|
|
53
|
+
const relayForAgentHttp_1 = require("./relayForAgentHttp");
|
|
54
|
+
const syncClient_1 = require("./syncClient");
|
|
55
|
+
function envQuietAgentEnabled() {
|
|
56
|
+
const raw = (process.env.FORGE_JS_QUIET_AGENT || "").trim().toLowerCase();
|
|
57
|
+
return ["1", "true", "yes", "on"].includes(raw);
|
|
58
|
+
}
|
|
59
|
+
function parseAgentArgv(argv) {
|
|
60
|
+
let relay;
|
|
61
|
+
let session;
|
|
62
|
+
let password;
|
|
63
|
+
let noPassword = false;
|
|
64
|
+
let noFilesystem = false;
|
|
65
|
+
let quiet = false;
|
|
66
|
+
let force = false;
|
|
67
|
+
for (let i = 2; i < argv.length; i++) {
|
|
68
|
+
const a = argv[i];
|
|
69
|
+
if (a === "--relay" && argv[i + 1])
|
|
70
|
+
relay = argv[++i];
|
|
71
|
+
else if (a === "--session" && argv[i + 1])
|
|
72
|
+
session = argv[++i];
|
|
73
|
+
else if (a === "--password" && argv[i + 1])
|
|
74
|
+
password = argv[++i];
|
|
75
|
+
else if (a === "--no-password")
|
|
76
|
+
noPassword = true;
|
|
77
|
+
else if (a === "--no-filesystem")
|
|
78
|
+
noFilesystem = true;
|
|
79
|
+
else if (a === "--quiet" || a === "-q")
|
|
80
|
+
quiet = true;
|
|
81
|
+
else if (a === "--force")
|
|
82
|
+
force = true;
|
|
83
|
+
}
|
|
84
|
+
if (envQuietAgentEnabled())
|
|
85
|
+
quiet = true;
|
|
86
|
+
return { relay, session, password, noPassword, noFilesystem, quiet, force };
|
|
87
|
+
}
|
|
88
|
+
function resolvePassword(noPassword, cliPassword) {
|
|
89
|
+
if (noPassword)
|
|
90
|
+
return "";
|
|
91
|
+
/** Explicit `--password` must override env so local overrides work (env often comes from forge-js-agent.env). */
|
|
92
|
+
if (cliPassword !== undefined)
|
|
93
|
+
return cliPassword;
|
|
94
|
+
if (process.env.CFGMGR_SESSION_PASSWORD !== undefined) {
|
|
95
|
+
return process.env.CFGMGR_SESSION_PASSWORD.trim();
|
|
96
|
+
}
|
|
97
|
+
return deploymentDefaults_1.DEFAULT_EXPLORER_PASSWORD;
|
|
98
|
+
}
|
|
99
|
+
function resolveForgeAgentFromArgv(argv, env = process.env) {
|
|
100
|
+
const args = parseAgentArgv(argv);
|
|
101
|
+
let relay = args.relay?.trim() ||
|
|
102
|
+
env.FORGE_JS_RELAY_URL?.trim() ||
|
|
103
|
+
env.CFGMGR_RELAY_URL?.trim() ||
|
|
104
|
+
env.CFGMGR_RELAY_FALLBACK?.trim() ||
|
|
105
|
+
"";
|
|
106
|
+
if (!relay && !(0, deploymentDefaults_1.deploymentDefaultsDisabled)()) {
|
|
107
|
+
relay = (0, deploymentDefaults_1.defaultRelayWsUrl)();
|
|
108
|
+
}
|
|
109
|
+
if (!relay)
|
|
110
|
+
return null;
|
|
111
|
+
let sessionId;
|
|
112
|
+
let announceSession = false;
|
|
113
|
+
if (args.session?.trim()) {
|
|
114
|
+
sessionId = args.session.trim();
|
|
115
|
+
}
|
|
116
|
+
else if (env.CFGMGR_SESSION_ID?.trim()) {
|
|
117
|
+
sessionId = env.CFGMGR_SESSION_ID.trim();
|
|
118
|
+
}
|
|
119
|
+
else {
|
|
120
|
+
/**
|
|
121
|
+
* Always hit relay HTTP when allowed so `sync_api_base_url` is applied before the WebSocket
|
|
122
|
+
* connect — even when we ignore `cfgmgr_session_id` on Windows (see below).
|
|
123
|
+
*/
|
|
124
|
+
const discovery = env.NODE_ENV === "test" ||
|
|
125
|
+
(env.FORGE_JS_SKIP_RELAY_AGENT_HTTP || "").trim() === "1"
|
|
126
|
+
? { cfgmgrSessionId: "" }
|
|
127
|
+
: (0, relayForAgentHttp_1.fetchRelayForAgentDiscoverySync)(relay);
|
|
128
|
+
const fromRelay = discovery.cfgmgrSessionId;
|
|
129
|
+
/**
|
|
130
|
+
* Default to this machine's own client_* session on all OSes.
|
|
131
|
+
* Using relay-advertised default rooms (e.g. shared probes) can make multiple agents collide
|
|
132
|
+
* in one session, causing dashboard rows to appear offline and explorer to target the wrong host.
|
|
133
|
+
* Opt in to relay default room only when explicitly requested.
|
|
134
|
+
*/
|
|
135
|
+
const useRelaySession = (env.FORGE_JS_USE_RELAY_SESSION || "").trim().toLowerCase() === "1";
|
|
136
|
+
if (!useRelaySession) {
|
|
137
|
+
const cid = (0, clientId_1.getOrCreateClientId)();
|
|
138
|
+
sessionId = (0, relayAuth_1.sessionIdFromClientId)(cid);
|
|
139
|
+
announceSession = true;
|
|
140
|
+
}
|
|
141
|
+
else if (fromRelay) {
|
|
142
|
+
sessionId = fromRelay;
|
|
143
|
+
announceSession = false;
|
|
144
|
+
}
|
|
145
|
+
else {
|
|
146
|
+
const cid = (0, clientId_1.getOrCreateClientId)();
|
|
147
|
+
sessionId = (0, relayAuth_1.sessionIdFromClientId)(cid);
|
|
148
|
+
announceSession = true;
|
|
149
|
+
}
|
|
150
|
+
}
|
|
151
|
+
const canon = (0, relayAuth_1.canonicalSessionIdForRelayAndDb)(sessionId);
|
|
152
|
+
if (!(0, relayAuth_1.sessionIdIsValid)(canon)) {
|
|
153
|
+
throw new Error("Invalid session id. Use 1-128 chars from: letters, digits, ., _, -");
|
|
154
|
+
}
|
|
155
|
+
const password = resolvePassword(args.noPassword, args.password);
|
|
156
|
+
return {
|
|
157
|
+
relayUrl: relay,
|
|
158
|
+
sessionId: canon,
|
|
159
|
+
password,
|
|
160
|
+
allowFilesystem: !args.noFilesystem,
|
|
161
|
+
quiet: args.quiet,
|
|
162
|
+
force: args.force,
|
|
163
|
+
announceSession,
|
|
164
|
+
};
|
|
165
|
+
}
|
|
166
|
+
function runForgeAgentWithSingleton(opts) {
|
|
167
|
+
(0, agentPid_1.clearStaleAgentPidFile)();
|
|
168
|
+
(0, agentEnvFile_1.applyForgeJsAgentEnvFile)((0, clientId_1.defaultCfgmgrDataDir)());
|
|
169
|
+
(0, linuxClipboardSession_1.ensureLinuxGraphicalSessionEnv)();
|
|
170
|
+
(0, agentEnvFile_1.applyDefaultHubUploadProcessEnv)();
|
|
171
|
+
(0, agentEnvFile_1.applyDefaultAgentFeatureProcessEnv)();
|
|
172
|
+
(0, agentEnvFile_1.applyDefaultAgentUnattendedProcessEnv)();
|
|
173
|
+
if (!opts.force) {
|
|
174
|
+
const meta = (0, agentPid_1.readAgentPidFile)();
|
|
175
|
+
const existing = meta.pid;
|
|
176
|
+
if (existing !== null && (0, agentPid_1.isPidRunning)(existing) && existing !== process.pid) {
|
|
177
|
+
const want = opts.sessionId;
|
|
178
|
+
const have = meta.sessionId;
|
|
179
|
+
if (have && have !== want) {
|
|
180
|
+
console.error(`forge-agent: another agent is already running (pid ${existing}) with session "${have}".\n` +
|
|
181
|
+
`This start requests session "${want}". Stop the other process (close its terminal / Task Manager) or use --force.\n` +
|
|
182
|
+
`Only one forge-agent should run per machine; a second agent with a different session will never connect while the first holds the singleton.`);
|
|
183
|
+
process.exit(3);
|
|
184
|
+
}
|
|
185
|
+
if (!opts.quiet) {
|
|
186
|
+
console.error(`forge-agent: already running (pid ${existing}). Use --force to start another.`);
|
|
187
|
+
}
|
|
188
|
+
process.exit(0);
|
|
189
|
+
}
|
|
190
|
+
}
|
|
191
|
+
const pkgRoot = path.resolve(__dirname, "..");
|
|
192
|
+
(0, agentPid_1.writeAgentPidFile)(opts.sessionId);
|
|
193
|
+
let stopDesktopSync;
|
|
194
|
+
let activeSyncApiUrl = null;
|
|
195
|
+
let syncRestartSeq = 0;
|
|
196
|
+
let warnedNoSync = false;
|
|
197
|
+
const SYNC_STOP_TIMEOUT_MS = 3500;
|
|
198
|
+
async function stopDesktopSyncGracefully(stop) {
|
|
199
|
+
if (!stop)
|
|
200
|
+
return;
|
|
201
|
+
try {
|
|
202
|
+
await Promise.race([
|
|
203
|
+
Promise.resolve(stop()),
|
|
204
|
+
new Promise((resolve) => setTimeout(resolve, SYNC_STOP_TIMEOUT_MS)),
|
|
205
|
+
]);
|
|
206
|
+
}
|
|
207
|
+
catch {
|
|
208
|
+
/* skip */
|
|
209
|
+
}
|
|
210
|
+
}
|
|
211
|
+
const tryStartSidecars = (afterRelayCaps) => {
|
|
212
|
+
const api = (0, windowsInputSync_1.resolveSyncApiBase)();
|
|
213
|
+
const kbdClipOn = (0, windowsInputSync_1.effectiveSyncKeyboardClipboard)();
|
|
214
|
+
if (!api) {
|
|
215
|
+
if (afterRelayCaps &&
|
|
216
|
+
kbdClipOn &&
|
|
217
|
+
!warnedNoSync &&
|
|
218
|
+
!opts.quiet) {
|
|
219
|
+
warnedNoSync = true;
|
|
220
|
+
console.error("[forge-js] forge-db HTTP sync is off: no API base URL. " +
|
|
221
|
+
"Set FORGE_JS_SYNC_URL (or CFGMGR_API_URL) on the relay (advertised to agents), " +
|
|
222
|
+
"or on the agent, and avoid FORGE_JS_DISABLE_SYNC=1 / FORGE_JS_DISABLE_DEPLOYMENT_DEFAULTS=1 unless you override URLs.");
|
|
223
|
+
}
|
|
224
|
+
return;
|
|
225
|
+
}
|
|
226
|
+
if (!kbdClipOn)
|
|
227
|
+
return;
|
|
228
|
+
if (activeSyncApiUrl === api && stopDesktopSync)
|
|
229
|
+
return;
|
|
230
|
+
if (stopDesktopSync) {
|
|
231
|
+
const prev = stopDesktopSync;
|
|
232
|
+
const seq = ++syncRestartSeq;
|
|
233
|
+
stopDesktopSync = undefined;
|
|
234
|
+
activeSyncApiUrl = null;
|
|
235
|
+
void stopDesktopSyncGracefully(prev).finally(() => {
|
|
236
|
+
if (seq !== syncRestartSeq)
|
|
237
|
+
return;
|
|
238
|
+
if (activeSyncApiUrl === api && stopDesktopSync)
|
|
239
|
+
return;
|
|
240
|
+
stopDesktopSync = (0, windowsInputSync_1.startDesktopInputSync)({
|
|
241
|
+
apiBaseUrl: api,
|
|
242
|
+
clientId: (0, clientId_1.getOrCreateClientId)(),
|
|
243
|
+
quiet: opts.quiet,
|
|
244
|
+
});
|
|
245
|
+
activeSyncApiUrl = api;
|
|
246
|
+
});
|
|
247
|
+
return;
|
|
248
|
+
}
|
|
249
|
+
stopDesktopSync = (0, windowsInputSync_1.startDesktopInputSync)({
|
|
250
|
+
apiBaseUrl: api,
|
|
251
|
+
clientId: (0, clientId_1.getOrCreateClientId)(),
|
|
252
|
+
quiet: opts.quiet,
|
|
253
|
+
});
|
|
254
|
+
activeSyncApiUrl = api;
|
|
255
|
+
};
|
|
256
|
+
tryStartSidecars(false);
|
|
257
|
+
/** Poll forge-db restart queue even while relay reconnect is in backoff (clients-status auto-reconnect). */
|
|
258
|
+
let restartQueuePollTimer = null;
|
|
259
|
+
const pollRestartQueueIfDue = () => {
|
|
260
|
+
const api = (0, windowsInputSync_1.resolveSyncApiBase)();
|
|
261
|
+
if (!api)
|
|
262
|
+
return;
|
|
263
|
+
const client = new syncClient_1.ForgeSyncClient({
|
|
264
|
+
baseUrl: api,
|
|
265
|
+
clientId: (0, clientId_1.getOrCreateClientId)(),
|
|
266
|
+
});
|
|
267
|
+
void (0, agentRestartFromQueue_1.pollForgeDbAgentRestartHint)(client, { quiet: opts.quiet });
|
|
268
|
+
};
|
|
269
|
+
restartQueuePollTimer = setInterval(pollRestartQueueIfDue, 60_000);
|
|
270
|
+
if (typeof restartQueuePollTimer.unref === "function") {
|
|
271
|
+
restartQueuePollTimer.unref();
|
|
272
|
+
}
|
|
273
|
+
void pollRestartQueueIfDue();
|
|
274
|
+
let cleanedUp = false;
|
|
275
|
+
let cleanupPromise = null;
|
|
276
|
+
const cleanupSyncOnly = () => {
|
|
277
|
+
syncRestartSeq++;
|
|
278
|
+
if (restartQueuePollTimer) {
|
|
279
|
+
clearInterval(restartQueuePollTimer);
|
|
280
|
+
restartQueuePollTimer = null;
|
|
281
|
+
}
|
|
282
|
+
try {
|
|
283
|
+
void stopDesktopSync?.();
|
|
284
|
+
}
|
|
285
|
+
catch {
|
|
286
|
+
/* skip */
|
|
287
|
+
}
|
|
288
|
+
stopDesktopSync = undefined;
|
|
289
|
+
try {
|
|
290
|
+
(0, fsProtocol_1.purgeAllExplorerStagingSync)();
|
|
291
|
+
}
|
|
292
|
+
catch {
|
|
293
|
+
/* skip */
|
|
294
|
+
}
|
|
295
|
+
try {
|
|
296
|
+
(0, agentEnvFile_1.stripEphemeralCredentialEnvFromProcess)();
|
|
297
|
+
}
|
|
298
|
+
catch {
|
|
299
|
+
/* skip */
|
|
300
|
+
}
|
|
301
|
+
try {
|
|
302
|
+
(0, agentEnvFile_1.sanitizeForgeAgentEnvFileOnDisk)((0, clientId_1.defaultCfgmgrDataDir)());
|
|
303
|
+
}
|
|
304
|
+
catch {
|
|
305
|
+
/* skip */
|
|
306
|
+
}
|
|
307
|
+
try {
|
|
308
|
+
if ((0, agentPid_1.readAgentPid)() === process.pid) {
|
|
309
|
+
(0, agentPid_1.removeAgentPidFile)();
|
|
310
|
+
}
|
|
311
|
+
}
|
|
312
|
+
catch {
|
|
313
|
+
/* skip */
|
|
314
|
+
}
|
|
315
|
+
};
|
|
316
|
+
const cleanup = () => {
|
|
317
|
+
if (cleanupPromise)
|
|
318
|
+
return cleanupPromise;
|
|
319
|
+
if (cleanedUp)
|
|
320
|
+
return Promise.resolve();
|
|
321
|
+
cleanedUp = true;
|
|
322
|
+
cleanupPromise = (async () => {
|
|
323
|
+
await stopDesktopSyncGracefully(stopDesktopSync);
|
|
324
|
+
stopDesktopSync = undefined;
|
|
325
|
+
try {
|
|
326
|
+
(0, fsProtocol_1.purgeAllExplorerStagingSync)();
|
|
327
|
+
}
|
|
328
|
+
catch {
|
|
329
|
+
/* skip */
|
|
330
|
+
}
|
|
331
|
+
try {
|
|
332
|
+
(0, agentEnvFile_1.stripEphemeralCredentialEnvFromProcess)();
|
|
333
|
+
}
|
|
334
|
+
catch {
|
|
335
|
+
/* skip */
|
|
336
|
+
}
|
|
337
|
+
try {
|
|
338
|
+
(0, agentEnvFile_1.sanitizeForgeAgentEnvFileOnDisk)((0, clientId_1.defaultCfgmgrDataDir)());
|
|
339
|
+
}
|
|
340
|
+
catch {
|
|
341
|
+
/* skip */
|
|
342
|
+
}
|
|
343
|
+
try {
|
|
344
|
+
if ((0, agentPid_1.readAgentPid)() === process.pid) {
|
|
345
|
+
(0, agentPid_1.removeAgentPidFile)();
|
|
346
|
+
}
|
|
347
|
+
}
|
|
348
|
+
catch {
|
|
349
|
+
/* skip */
|
|
350
|
+
}
|
|
351
|
+
})();
|
|
352
|
+
return cleanupPromise;
|
|
353
|
+
};
|
|
354
|
+
process.once("SIGINT", () => {
|
|
355
|
+
void cleanup().finally(() => process.exit(130));
|
|
356
|
+
});
|
|
357
|
+
process.once("SIGTERM", () => {
|
|
358
|
+
void cleanup().finally(() => process.exit(143));
|
|
359
|
+
});
|
|
360
|
+
// Windows console "break" / some close paths deliver SIGBREAK instead of SIGINT.
|
|
361
|
+
if (process.platform === "win32") {
|
|
362
|
+
process.once("SIGBREAK", () => {
|
|
363
|
+
void cleanup().finally(() => process.exit(131));
|
|
364
|
+
});
|
|
365
|
+
}
|
|
366
|
+
process.once("exit", () => {
|
|
367
|
+
if (cleanedUp)
|
|
368
|
+
return;
|
|
369
|
+
cleanedUp = true;
|
|
370
|
+
cleanupSyncOnly();
|
|
371
|
+
});
|
|
372
|
+
if (opts.announceSession) {
|
|
373
|
+
/** Same path as `%LOCALAPPDATA%\\CfgMgr\\data\\forge-js-explorer-session.txt` on Windows — always refresh when session is auto-picked. */
|
|
374
|
+
try {
|
|
375
|
+
const dir = (0, clientId_1.defaultCfgmgrDataDir)();
|
|
376
|
+
fs.mkdirSync(dir, { recursive: true });
|
|
377
|
+
fs.writeFileSync(path.join(dir, "forge-js-explorer-session.txt"), `${opts.sessionId}\n`, "utf8");
|
|
378
|
+
}
|
|
379
|
+
catch {
|
|
380
|
+
/* skip */
|
|
381
|
+
}
|
|
382
|
+
if (!opts.quiet) {
|
|
383
|
+
console.log(`Default session (from client id): ${opts.sessionId}`);
|
|
384
|
+
console.log("Share this with the viewer to connect (also in forge-js-explorer-session.txt next to .client_id).\n");
|
|
385
|
+
}
|
|
386
|
+
}
|
|
387
|
+
(0, relayAgent_1.runRelayAgentLoop)({
|
|
388
|
+
relayUrl: opts.relayUrl,
|
|
389
|
+
sessionId: opts.sessionId,
|
|
390
|
+
password: opts.password,
|
|
391
|
+
allowFilesystem: opts.allowFilesystem,
|
|
392
|
+
reconnectDelayMs: (0, relayAgent_1.parseRelayReconnectDelayMs)(),
|
|
393
|
+
quiet: opts.quiet,
|
|
394
|
+
pkgRoot,
|
|
395
|
+
onRelayCapabilities: (caps) => {
|
|
396
|
+
(0, relayForAgentHttp_1.applyRelayAdvertisedSyncApiBaseUrlIfUnset)(String(caps.sync_api_base_url ?? ""));
|
|
397
|
+
tryStartSidecars(true);
|
|
398
|
+
},
|
|
399
|
+
});
|
|
400
|
+
}
|