livedesk 0.1.649 → 0.1.651
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 +1 -1
- package/bin/livedesk.js +13 -13
- package/bootstrap/client-process-identity.js +2 -2
- package/client/package.json +1 -1
- package/diagnostics/{livedesk-mac-physical-gate-core.mjs → vuvodesk-mac-physical-gate-core.mjs} +3 -3
- package/diagnostics/{livedesk-mode3-capture-smoke.mjs → vuvodesk-mode3-capture-smoke.mjs} +2 -2
- package/diagnostics/{livedesk-transport-physical.mjs → vuvodesk-transport-physical.mjs} +1 -1
- package/electron/before-pack.cjs +1 -1
- package/electron/electron-builder.e2e.yml +1 -1
- package/electron/electron-builder.linux-x64-dev.yml +1 -1
- package/electron/electron-builder.linux-x64.yml +3 -3
- package/electron/electron-builder.mac-arm64-dev.yml +1 -1
- package/electron/electron-builder.mac-arm64.yml +4 -4
- package/electron/electron-builder.mac-x64-dev.yml +1 -1
- package/electron/electron-builder.mac-x64.yml +4 -4
- package/electron/electron-builder.win-dev.yml +1 -1
- package/electron/electron-builder.win.yml +3 -3
- package/electron/electron-builder.yml +2 -2
- package/electron/installer.nsh +53 -8
- package/hub/package.json +1 -1
- package/hub/src/captures/capture-store.js +2 -2
- package/hub/src/server.js +2 -2
- package/hub/src/{live-desk-update.js → vuvodesk-update.js} +1 -1
- package/package.json +5 -3
- package/runtime-core/package.json +1 -1
- package/scripts/sync-web-dist.js +11 -11
- package/web/dist/app.html +3 -3
- package/web/dist/app.webmanifest +1 -1
- package/web/dist/assets/{AgentSettingsTab-iFp0drPg.js → AgentSettingsTab-CmoOFOcl.js} +1 -1
- package/web/dist/assets/{AgentsPage-j2-12UiH.js → AgentsPage-0p2Fa7hh.js} +1 -1
- package/web/dist/assets/{App-ClWrRZny.js → App-iw6HSNbk.js} +3 -3
- package/web/dist/assets/{CaptureGallery-DqFrxb4z.js → CaptureGallery-DlsfaKXP.js} +1 -1
- package/web/dist/assets/{DesktopUpdatePanel-KTNBQapz.js → DesktopUpdatePanel-D5sguo6U.js} +1 -1
- package/web/dist/assets/{SettingsPage-B9EuLki2.js → SettingsPage-BbO24wOs.js} +1 -1
- package/web/dist/assets/{SettingsTabs-D5-tAmxZ.js → SettingsTabs-DG1Q2KY3.js} +1 -1
- package/web/dist/assets/{ShareFilesPage-CeABxzoG.js → ShareFilesPage-0PiU0oYj.js} +1 -1
- package/web/dist/assets/{SupportPage-BghgDQeI.js → SupportPage-DcQ5yK4j.js} +1 -1
- package/web/dist/assets/{LiveDeskApp-C_nh3psi.js → VuvoDeskApp-CeYs_j7-.js} +1 -1
- package/web/dist/assets/{app-CTK6L71p.js → app-BSxy34W0.js} +1 -1
- package/web/dist/assets/{main-u3H5g7g9.js → main-D5ioXAGK.js} +2 -2
- package/web/dist/assets/{styles-BPIskmg3.js → styles-BriraxLg.js} +1 -1
- package/web/dist/index.html +2 -2
- package/web/dist/sw.js +1 -1
- package/web/dist/{livedesk-build-evidence.json → vuvodesk-build-evidence.json} +55 -55
- /package/diagnostics/{livedesk-mac-physical-isolation.mjs → vuvodesk-mac-physical-isolation.mjs} +0 -0
- /package/diagnostics/{livedesk-transport-physical-core.mjs → vuvodesk-transport-physical-core.mjs} +0 -0
- /package/web/dist/assets/{LiveDeskApp-ao5vkK6F.css → VuvoDeskApp-ao5vkK6F.css} +0 -0
package/README.md
CHANGED
|
@@ -12,7 +12,7 @@ wall and can be controlled like the other computers.
|
|
|
12
12
|
The `hub/`, `client/`, `runtime-core/`, and `web/` folders in this package are
|
|
13
13
|
generated copies. Edit the source packages rather than those copies. Before
|
|
14
14
|
packaging, `npm pack` rebuilds the production web workspace and then runs
|
|
15
|
-
`node packages/
|
|
15
|
+
`node packages/vuvodesk/scripts/sync-web-dist.js` to synchronize the product.
|
|
16
16
|
The published `livedesk` package owns both runtime roles; the
|
|
17
17
|
source-only `@livedesk/client` workspace is not a runtime dependency.
|
|
18
18
|
|
package/bin/livedesk.js
CHANGED
|
@@ -47,7 +47,7 @@ import {
|
|
|
47
47
|
readDeadWindowsOwnedProcessManifest,
|
|
48
48
|
readWindowsOwnedProcessManifest
|
|
49
49
|
} from '../client/src/runtime/windows-owned-process-manifest.js';
|
|
50
|
-
import { inspectMacDiagnosticLease } from '../diagnostics/
|
|
50
|
+
import { inspectMacDiagnosticLease } from '../diagnostics/vuvodesk-mac-physical-isolation.mjs';
|
|
51
51
|
import {
|
|
52
52
|
buildHubSelfAgentLaunchSpec,
|
|
53
53
|
createHubSelfAgentSupervisor
|
|
@@ -423,7 +423,7 @@ async function runDiagnosticCommand(args) {
|
|
|
423
423
|
const diagnosticEntry = resolve(
|
|
424
424
|
packageRoot,
|
|
425
425
|
'diagnostics',
|
|
426
|
-
'
|
|
426
|
+
'vuvodesk-transport-physical.mjs'
|
|
427
427
|
);
|
|
428
428
|
if (!existsSync(diagnosticEntry)) {
|
|
429
429
|
throw new Error(`VuvoDesk transport-physical diagnostic is missing from this package: ${diagnosticEntry}`);
|
|
@@ -442,7 +442,7 @@ async function runDiagnosticCommand(args) {
|
|
|
442
442
|
const diagnosticEntry = resolve(
|
|
443
443
|
packageRoot,
|
|
444
444
|
'diagnostics',
|
|
445
|
-
'
|
|
445
|
+
'vuvodesk-mode3-capture-smoke.mjs'
|
|
446
446
|
);
|
|
447
447
|
if (!existsSync(diagnosticEntry)) {
|
|
448
448
|
throw new Error(`VuvoDesk mac-physical diagnostic is missing from this package: ${diagnosticEntry}`);
|
|
@@ -707,7 +707,7 @@ function isKnownLiveDeskLauncherProcess(processName, commandLine) {
|
|
|
707
707
|
const normalizedName = String(processName || '').trim().replaceAll('\\', '/').split('/').pop() || '';
|
|
708
708
|
const normalizedCommandLine = String(commandLine || '').replaceAll('\\', '/');
|
|
709
709
|
return /^(?:node|node\.exe)$/i.test(normalizedName)
|
|
710
|
-
&& /(?:^|\/)(?:node_modules\/livedesk\/bin\/livedesk\.js|packages\/livedesk\/bin\/livedesk\.js|node_modules\/\.bin\/livedesk)(?:\s|["']|$)/i
|
|
710
|
+
&& /(?:^|\/)(?:node_modules\/livedesk\/bin\/livedesk\.js|packages\/(?:livedesk|vuvodesk)\/bin\/livedesk\.js|node_modules\/\.bin\/livedesk)(?:\s|["']|$)/i
|
|
711
711
|
.test(normalizedCommandLine);
|
|
712
712
|
}
|
|
713
713
|
|
|
@@ -1619,9 +1619,9 @@ function isKnownLiveDeskProcess(processName, commandLine) {
|
|
|
1619
1619
|
return false;
|
|
1620
1620
|
}
|
|
1621
1621
|
|
|
1622
|
-
const isKnownHubServer = /(?:packages\/(?:
|
|
1623
|
-
const isUnifiedLauncher = /(?:node_modules\/livedesk|packages\/livedesk)\/bin\/livedesk\.js/i.test(normalizedCommandLine);
|
|
1624
|
-
const isLegacyClient = /(?:node_modules\/@livedesk\/client|packages\/client|packages\/livedesk\/client)\/bin\/livedesk-client\.js/i.test(normalizedCommandLine);
|
|
1622
|
+
const isKnownHubServer = /(?:packages\/(?:(?:live|vuvo)desk\/)?hub|node_modules\/@?livedesk\/hub)\/src\/server\.js/i.test(normalizedCommandLine);
|
|
1623
|
+
const isUnifiedLauncher = /(?:node_modules\/livedesk|packages\/(?:livedesk|vuvodesk))\/bin\/livedesk\.js/i.test(normalizedCommandLine);
|
|
1624
|
+
const isLegacyClient = /(?:node_modules\/@livedesk\/client|packages\/client|packages\/(?:livedesk|vuvodesk)\/client)\/bin\/livedesk-client\.js/i.test(normalizedCommandLine);
|
|
1625
1625
|
return isKnownHubServer || isUnifiedLauncher || isLegacyClient;
|
|
1626
1626
|
}
|
|
1627
1627
|
|
|
@@ -1674,9 +1674,9 @@ async function collectWindowsPortRecords(ports) {
|
|
|
1674
1674
|
' $commandLine = if ($proc) { [string]$proc.CommandLine } else { "" };',
|
|
1675
1675
|
' $creationUtcTicks = if ($proc -and $proc.CreationDate) { [string]$proc.CreationDate.ToUniversalTime().Ticks } else { "" };',
|
|
1676
1676
|
' $isNodeProcess = $processName -match "(?i)^node(?:\\.exe)?$";',
|
|
1677
|
-
' $hasKnownLiveDeskHubPath = $commandLine -match "(?i)(?:packages[\\\\/](?:
|
|
1678
|
-
' $hasUnifiedLauncherPath = $commandLine -match "(?i)(?:node_modules[\\\\/]livedesk|packages[\\\\/]livedesk)[\\\\/]bin[\\\\/]livedesk\\.js";',
|
|
1679
|
-
' $hasLegacyClientPath = $commandLine -match "(?i)(?:node_modules[\\\\/]@livedesk[\\\\/]client|packages[\\\\/]client|packages[\\\\/]livedesk[\\\\/]client)[\\\\/]bin[\\\\/]livedesk-client\\.js";',
|
|
1677
|
+
' $hasKnownLiveDeskHubPath = $commandLine -match "(?i)(?:packages[\\\\/](?:(?:live|vuvo)desk[\\\\/])?hub|node_modules[\\\\/]@?livedesk[\\\\/]hub)[\\\\/]src[\\\\/]server\\.js";',
|
|
1678
|
+
' $hasUnifiedLauncherPath = $commandLine -match "(?i)(?:node_modules[\\\\/]livedesk|packages[\\\\/](?:livedesk|vuvodesk))[\\\\/]bin[\\\\/]livedesk\\.js";',
|
|
1679
|
+
' $hasLegacyClientPath = $commandLine -match "(?i)(?:node_modules[\\\\/]@livedesk[\\\\/]client|packages[\\\\/]client|packages[\\\\/](?:livedesk|vuvodesk)[\\\\/]client)[\\\\/]bin[\\\\/]livedesk-client\\.js";',
|
|
1680
1680
|
' $knownLiveDesk = [bool]($isNodeProcess -and ($hasKnownLiveDeskHubPath -or $hasUnifiedLauncherPath -or $hasLegacyClientPath));',
|
|
1681
1681
|
' $state = [string]$connection.State;',
|
|
1682
1682
|
' $isListener = $state -match "^(?i:Listen|Listening)$";',
|
|
@@ -1744,9 +1744,9 @@ async function terminateExactWindowsPortOwners(records) {
|
|
|
1744
1744
|
' $processName = [string]$proc.Name;',
|
|
1745
1745
|
' $commandLine = [string]$proc.CommandLine;',
|
|
1746
1746
|
' $isNodeProcess = $processName -match "(?i)^node(?:\\.exe)?$";',
|
|
1747
|
-
' $hasKnownLiveDeskHubPath = $commandLine -match "(?i)(?:packages[\\\\/](?:
|
|
1748
|
-
' $hasUnifiedLauncherPath = $commandLine -match "(?i)(?:node_modules[\\\\/]livedesk|packages[\\\\/]livedesk)[\\\\/]bin[\\\\/]livedesk\\.js";',
|
|
1749
|
-
' $hasLegacyClientPath = $commandLine -match "(?i)(?:node_modules[\\\\/]@livedesk[\\\\/]client|packages[\\\\/]client|packages[\\\\/]livedesk[\\\\/]client)[\\\\/]bin[\\\\/]livedesk-client\\.js";',
|
|
1747
|
+
' $hasKnownLiveDeskHubPath = $commandLine -match "(?i)(?:packages[\\\\/](?:(?:live|vuvo)desk[\\\\/])?hub|node_modules[\\\\/]@?livedesk[\\\\/]hub)[\\\\/]src[\\\\/]server\\.js";',
|
|
1748
|
+
' $hasUnifiedLauncherPath = $commandLine -match "(?i)(?:node_modules[\\\\/]livedesk|packages[\\\\/](?:livedesk|vuvodesk))[\\\\/]bin[\\\\/]livedesk\\.js";',
|
|
1749
|
+
' $hasLegacyClientPath = $commandLine -match "(?i)(?:node_modules[\\\\/]@livedesk[\\\\/]client|packages[\\\\/]client|packages[\\\\/](?:livedesk|vuvodesk)[\\\\/]client)[\\\\/]bin[\\\\/]livedesk-client\\.js";',
|
|
1750
1750
|
' if ($actualStartTicks -ne $expectedStartTicks -or -not $isNodeProcess -or -not ($hasKnownLiveDeskHubPath -or $hasUnifiedLauncherPath -or $hasLegacyClientPath)) { continue };',
|
|
1751
1751
|
' $validatedRoots.Add([pscustomobject]@{ ProcessId = [int]$proc.ProcessId; ParentProcessId = [int]$proc.ParentProcessId; CreationUtcTicks = $actualStartTicks; Depth = 0 });',
|
|
1752
1752
|
'}',
|
|
@@ -11,7 +11,7 @@ function normalizeExecutablePath(value) {
|
|
|
11
11
|
return String(value || '').trim().replaceAll('\\', '/').replace(/\s+\(deleted\)$/i, '');
|
|
12
12
|
}
|
|
13
13
|
|
|
14
|
-
const BUNDLED_FAST_ROOT = '(?:node_modules/(?:livedesk/client|@livedesk/client)|packages/(?:
|
|
14
|
+
const BUNDLED_FAST_ROOT = '(?:node_modules/(?:livedesk/client|@livedesk/client)|packages/(?:(?:live|vuvo)desk/client|client))/fast/[^/\\s]+';
|
|
15
15
|
const OPTIONAL_FAST_ROOT = 'node_modules/@livedesk/fast-(?:linux-x64|osx-arm64|osx-x64|win-x64)/fast';
|
|
16
16
|
const FAST_ROOT = `(?:${BUNDLED_FAST_ROOT}|${OPTIONAL_FAST_ROOT})`;
|
|
17
17
|
const KNOWN_FAST_EXECUTABLE_PATH = new RegExp(`${FAST_ROOT}/livedesk-client-fast(?:\\.exe)?$`, 'i');
|
|
@@ -28,7 +28,7 @@ export function isKnownLiveDeskClientAgentProcess(processName, commandLine, exec
|
|
|
28
28
|
// packaged VuvoDesk Fast binary. A matching path elsewhere in argv is not
|
|
29
29
|
// sufficient.
|
|
30
30
|
const isTruncatedLinuxFast = /^livedesk-client$/i.test(normalizedName);
|
|
31
|
-
const isKnownNodeAgent = /(?:node_modules\/(?:livedesk\/client|@livedesk\/client)|packages\/(?:
|
|
31
|
+
const isKnownNodeAgent = /(?:node_modules\/(?:livedesk\/client|@livedesk\/client)|packages\/(?:(?:live|vuvo)desk\/client|client))\/bin\/livedesk-client-node\.js(?:\s|["']|$)/i.test(normalizedCommandLine);
|
|
32
32
|
const isKnownFastExecutable = new RegExp(
|
|
33
33
|
`${FAST_ROOT}/livedesk-client-fast(?:\\.exe)?(?:\\s|["']|$)`,
|
|
34
34
|
'i'
|
package/client/package.json
CHANGED
|
@@ -20,7 +20,7 @@
|
|
|
20
20
|
"check": "node --check bin/client-version.js && node --check bin/livedesk-client.js && node --check bin/livedesk-client-node.js && node --check bin/livedesk-client-update-bootstrap.cjs && node --check bin/livedesk-client-fast.js",
|
|
21
21
|
"test:version": "node --test tests/client-version.test.mjs",
|
|
22
22
|
"pack:dry": "npm pack --dry-run",
|
|
23
|
-
"prepublishOnly": "node ../../scripts/
|
|
23
|
+
"prepublishOnly": "node ../../scripts/vuvodesk-release-git-gate.mjs"
|
|
24
24
|
},
|
|
25
25
|
"keywords": [
|
|
26
26
|
"livedesk",
|
package/diagnostics/{livedesk-mac-physical-gate-core.mjs → vuvodesk-mac-physical-gate-core.mjs}
RENAMED
|
@@ -375,13 +375,13 @@ function classifyMacLiveDeskRuntimeRecord(record) {
|
|
|
375
375
|
return 'client-agent';
|
|
376
376
|
}
|
|
377
377
|
if (
|
|
378
|
-
/(?:node_modules\/(?:livedesk\/client|@livedesk\/client)|packages\/(?:
|
|
378
|
+
/(?:node_modules\/(?:livedesk\/client|@livedesk\/client)|packages\/(?:(?:live|vuvo)desk\/client|client))\/bin\/livedesk-client(?:-node)?\.js(?:\s|$|["'])/i
|
|
379
379
|
.test(commandLine)
|
|
380
380
|
) {
|
|
381
381
|
return 'client-runtime';
|
|
382
382
|
}
|
|
383
383
|
if (
|
|
384
|
-
/(?:node_modules\/livedesk|packages\/livedesk)\/bin\/livedesk\.js(?:\s|$|["'])/i
|
|
384
|
+
/(?:node_modules\/livedesk|packages\/(?:livedesk|vuvodesk))\/bin\/livedesk\.js(?:\s|$|["'])/i
|
|
385
385
|
.test(commandLine)
|
|
386
386
|
|| /(?:^|[\s"'])[^"'\s]*node_modules\/\.bin\/livedesk(?:\s|$|["'])/i
|
|
387
387
|
.test(commandLine)
|
|
@@ -389,7 +389,7 @@ function classifyMacLiveDeskRuntimeRecord(record) {
|
|
|
389
389
|
return 'unified-runtime';
|
|
390
390
|
}
|
|
391
391
|
if (
|
|
392
|
-
/(?:node_modules\/(?:livedesk\/hub|@livedesk\/hub)|packages\/(?:
|
|
392
|
+
/(?:node_modules\/(?:livedesk\/hub|@livedesk\/hub)|packages\/(?:(?:live|vuvo)desk\/hub|hub))\/src\/server\.js(?:\s|$|["'])/i
|
|
393
393
|
.test(commandLine)
|
|
394
394
|
) {
|
|
395
395
|
return 'hub-runtime';
|
|
@@ -25,7 +25,7 @@ import {
|
|
|
25
25
|
noteMacModifierBeforeSend,
|
|
26
26
|
parseMacLiveDeskRuntimeProcesses,
|
|
27
27
|
summarizeMacDiagnosticResourceSamples
|
|
28
|
-
} from './
|
|
28
|
+
} from './vuvodesk-mac-physical-gate-core.mjs';
|
|
29
29
|
import {
|
|
30
30
|
acquireMacDiagnosticLease,
|
|
31
31
|
buildMacDiagnosticTeardownPlan,
|
|
@@ -34,7 +34,7 @@ import {
|
|
|
34
34
|
runMacDiagnosticAbortableAttempt,
|
|
35
35
|
runMacDiagnosticStateTeardown,
|
|
36
36
|
stopOwnedProcess
|
|
37
|
-
} from './
|
|
37
|
+
} from './vuvodesk-mac-physical-isolation.mjs';
|
|
38
38
|
|
|
39
39
|
const rawArguments = process.argv.slice(2);
|
|
40
40
|
const publicMacPhysicalDiagnostic = String(rawArguments[0] || '').toLowerCase() === 'diagnose'
|
|
@@ -9,7 +9,7 @@ import {
|
|
|
9
9
|
buildTransportPhysicalReport,
|
|
10
10
|
genericTransportPhysicalError,
|
|
11
11
|
isTransportPhysicalPhaseEvidence
|
|
12
|
-
} from './
|
|
12
|
+
} from './vuvodesk-transport-physical-core.mjs';
|
|
13
13
|
|
|
14
14
|
const DEFAULT_HUB_URL = 'http://127.0.0.1:5179';
|
|
15
15
|
const DEFAULT_PHASE_TIMEOUT_MS = 15_000;
|
package/electron/before-pack.cjs
CHANGED
|
@@ -2,7 +2,7 @@ const { createHash } = require('node:crypto');
|
|
|
2
2
|
const { existsSync, readFileSync, readdirSync, statSync } = require('node:fs');
|
|
3
3
|
const { isAbsolute, join, posix, relative, resolve, sep } = require('node:path');
|
|
4
4
|
|
|
5
|
-
const EVIDENCE_FILE = '
|
|
5
|
+
const EVIDENCE_FILE = 'vuvodesk-build-evidence.json';
|
|
6
6
|
const EVIDENCE_KIND = 'livedesk-production-web-source-evidence';
|
|
7
7
|
|
|
8
8
|
function fail(code, detail = '') {
|
|
@@ -1,5 +1,5 @@
|
|
|
1
|
-
extends: file:packages/
|
|
2
|
-
afterPack: packages/
|
|
1
|
+
extends: file:packages/vuvodesk/electron/electron-builder.yml
|
|
2
|
+
afterPack: packages/vuvodesk/electron/after-pack.cjs
|
|
3
3
|
files:
|
|
4
4
|
- bin/**
|
|
5
5
|
- bootstrap/**
|
|
@@ -27,7 +27,7 @@ asarUnpack:
|
|
|
27
27
|
- node_modules/node-datachannel/**
|
|
28
28
|
- node_modules/@node-datachannel/linux-x64-gnu/**
|
|
29
29
|
linux:
|
|
30
|
-
icon: packages/
|
|
30
|
+
icon: packages/vuvodesk/electron/icon.png
|
|
31
31
|
category: Utility
|
|
32
32
|
executableName: livedesk
|
|
33
33
|
maintainer: "lovecrdm <lovecrdm@gmail.com>"
|
|
@@ -1,4 +1,4 @@
|
|
|
1
|
-
extends: file:packages/
|
|
1
|
+
extends: file:packages/vuvodesk/electron/electron-builder.yml
|
|
2
2
|
files:
|
|
3
3
|
- bin/**
|
|
4
4
|
- bootstrap/**
|
|
@@ -26,12 +26,12 @@ asarUnpack:
|
|
|
26
26
|
- node_modules/node-datachannel/**
|
|
27
27
|
- node_modules/@node-datachannel/darwin-arm64/**
|
|
28
28
|
mac:
|
|
29
|
-
icon: packages/
|
|
29
|
+
icon: packages/vuvodesk/electron/icon.icns
|
|
30
30
|
category: public.app-category.utilities
|
|
31
31
|
hardenedRuntime: true
|
|
32
32
|
notarize: true
|
|
33
|
-
entitlements: packages/
|
|
34
|
-
entitlementsInherit: packages/
|
|
33
|
+
entitlements: packages/vuvodesk/electron/entitlements.mac.plist
|
|
34
|
+
entitlementsInherit: packages/vuvodesk/electron/entitlements.mac.plist
|
|
35
35
|
target:
|
|
36
36
|
- target: dmg
|
|
37
37
|
arch:
|
|
@@ -1,4 +1,4 @@
|
|
|
1
|
-
extends: file:packages/
|
|
1
|
+
extends: file:packages/vuvodesk/electron/electron-builder.yml
|
|
2
2
|
files:
|
|
3
3
|
- bin/**
|
|
4
4
|
- bootstrap/**
|
|
@@ -26,12 +26,12 @@ asarUnpack:
|
|
|
26
26
|
- node_modules/node-datachannel/**
|
|
27
27
|
- node_modules/@node-datachannel/darwin-x64/**
|
|
28
28
|
mac:
|
|
29
|
-
icon: packages/
|
|
29
|
+
icon: packages/vuvodesk/electron/icon.icns
|
|
30
30
|
category: public.app-category.utilities
|
|
31
31
|
hardenedRuntime: true
|
|
32
32
|
notarize: true
|
|
33
|
-
entitlements: packages/
|
|
34
|
-
entitlementsInherit: packages/
|
|
33
|
+
entitlements: packages/vuvodesk/electron/entitlements.mac.plist
|
|
34
|
+
entitlementsInherit: packages/vuvodesk/electron/entitlements.mac.plist
|
|
35
35
|
target:
|
|
36
36
|
- target: dmg
|
|
37
37
|
arch:
|
|
@@ -1,4 +1,4 @@
|
|
|
1
|
-
extends: file:packages/
|
|
1
|
+
extends: file:packages/vuvodesk/electron/electron-builder.yml
|
|
2
2
|
files:
|
|
3
3
|
- bin/**
|
|
4
4
|
- bootstrap/**
|
|
@@ -26,7 +26,7 @@ asarUnpack:
|
|
|
26
26
|
- node_modules/node-datachannel/**
|
|
27
27
|
- node_modules/@node-datachannel/win32-x64-msvc/**
|
|
28
28
|
win:
|
|
29
|
-
icon: packages/
|
|
29
|
+
icon: packages/vuvodesk/electron/icon.ico
|
|
30
30
|
target:
|
|
31
31
|
- target: nsis
|
|
32
32
|
arch:
|
|
@@ -35,7 +35,7 @@ win:
|
|
|
35
35
|
nsis:
|
|
36
36
|
oneClick: false
|
|
37
37
|
perMachine: false
|
|
38
|
-
include: packages/
|
|
38
|
+
include: packages/vuvodesk/electron/installer.nsh
|
|
39
39
|
createDesktopShortcut: true
|
|
40
40
|
createStartMenuShortcut: true
|
|
41
41
|
shortcutName: VuvoDesk
|
|
@@ -2,7 +2,7 @@ appId: com.livedesk.desktop
|
|
|
2
2
|
productName: VuvoDesk
|
|
3
3
|
artifactName: VuvoDesk-${version}-${arch}.${ext}
|
|
4
4
|
asar: true
|
|
5
|
-
beforePack: packages/
|
|
5
|
+
beforePack: packages/vuvodesk/electron/before-pack.cjs
|
|
6
6
|
directories:
|
|
7
|
-
app: packages/
|
|
7
|
+
app: packages/vuvodesk
|
|
8
8
|
output: dist/desktop
|
package/electron/installer.nsh
CHANGED
|
@@ -1,13 +1,6 @@
|
|
|
1
1
|
!include "LogicLib.nsh"
|
|
2
2
|
|
|
3
|
-
!macro
|
|
4
|
-
# Keep the assisted installer's directory picker without electron-builder's
|
|
5
|
-
# suffix sanitizer. The selected or /D directory is the exact destination.
|
|
6
|
-
!insertmacro skipPageIfUpdated
|
|
7
|
-
!insertmacro MUI_PAGE_DIRECTORY
|
|
8
|
-
!macroend
|
|
9
|
-
|
|
10
|
-
!macro customInit
|
|
3
|
+
!macro verifyAndMigrateLegacyDefault
|
|
11
4
|
# Keep an explicit command-line directory and every user-chosen custom path.
|
|
12
5
|
# Only a registered installation in one of the three historical default roots
|
|
13
6
|
# is a product-owned migration input. An occupied destination is never mixed.
|
|
@@ -21,6 +14,31 @@
|
|
|
21
14
|
Pop $R2
|
|
22
15
|
${EndIf}
|
|
23
16
|
|
|
17
|
+
# An all-users replacement also asks electron-builder to remove a same-GUID
|
|
18
|
+
# per-user installation. Validate that second owner before any extraction;
|
|
19
|
+
# electron-builder otherwise treats a missing HKCU UninstallString as absent.
|
|
20
|
+
${If} $installMode == "all"
|
|
21
|
+
ReadRegStr $R4 HKEY_CURRENT_USER "${UNINSTALL_REGISTRY_KEY}" UninstallString
|
|
22
|
+
ReadRegStr $R5 HKEY_CURRENT_USER "${INSTALL_REGISTRY_KEY}" InstallLocation
|
|
23
|
+
StrCpy $R6 ""
|
|
24
|
+
${If} $R4 != ""
|
|
25
|
+
Push $R4
|
|
26
|
+
Call GetInQuotes
|
|
27
|
+
Pop $R6
|
|
28
|
+
${EndIf}
|
|
29
|
+
${If} $R5 != ""
|
|
30
|
+
${AndIf} ${FileExists} "$R5\${APP_EXECUTABLE_FILENAME}"
|
|
31
|
+
${If} $R4 == ""
|
|
32
|
+
${OrIf} $R6 != "$R5\${UNINSTALL_FILENAME}"
|
|
33
|
+
${OrIfNot} ${FileExists} "$R6"
|
|
34
|
+
DetailPrint "Registered per-user VuvoDesk uninstaller is missing or does not own the installed directory."
|
|
35
|
+
MessageBox MB_OK|MB_ICONSTOP "$(uninstallFailed)" /SD IDOK
|
|
36
|
+
SetErrorLevel 2
|
|
37
|
+
Quit
|
|
38
|
+
${EndIf}
|
|
39
|
+
${EndIf}
|
|
40
|
+
${EndIf}
|
|
41
|
+
|
|
24
42
|
# A claimed current VuvoDesk installation must have its exact usable remover.
|
|
25
43
|
# Never overlay or clone an installation whose removal ownership is damaged.
|
|
26
44
|
${If} $R3 != ""
|
|
@@ -54,6 +72,27 @@
|
|
|
54
72
|
ClearErrors
|
|
55
73
|
!macroend
|
|
56
74
|
|
|
75
|
+
!macro customInit
|
|
76
|
+
# Silent installation and the initial assisted-install context use this path.
|
|
77
|
+
!insertmacro verifyAndMigrateLegacyDefault
|
|
78
|
+
!macroend
|
|
79
|
+
|
|
80
|
+
!macro customPageAfterChangeDir
|
|
81
|
+
# Keep the assisted installer's exact directory picker without
|
|
82
|
+
# electron-builder's product-name suffix sanitizer.
|
|
83
|
+
Function vuvodeskDirectoryPagePre
|
|
84
|
+
# The assisted install-mode page reloads its selected registry context after
|
|
85
|
+
# customInit. Reapply the same guarded policy before the exact directory page.
|
|
86
|
+
!insertmacro verifyAndMigrateLegacyDefault
|
|
87
|
+
${If} ${isUpdated}
|
|
88
|
+
Abort
|
|
89
|
+
${EndIf}
|
|
90
|
+
FunctionEnd
|
|
91
|
+
|
|
92
|
+
!define MUI_PAGE_CUSTOMFUNCTION_PRE vuvodeskDirectoryPagePre
|
|
93
|
+
!insertmacro MUI_PAGE_DIRECTORY
|
|
94
|
+
!macroend
|
|
95
|
+
|
|
57
96
|
!macro customUnInstallCheck
|
|
58
97
|
${If} ${Errors}
|
|
59
98
|
DetailPrint "Uninstall was not successful. The registered uninstaller could not be launched."
|
|
@@ -68,3 +107,9 @@
|
|
|
68
107
|
Quit
|
|
69
108
|
${EndIf}
|
|
70
109
|
!macroend
|
|
110
|
+
|
|
111
|
+
!macro customUnInstallCheckCurrentUser
|
|
112
|
+
# The all-users path removes a second HKCU installation after the selected
|
|
113
|
+
# SHELL_CONTEXT owner. It must use the same fail-closed result policy.
|
|
114
|
+
!insertmacro customUnInstallCheck
|
|
115
|
+
!macroend
|
package/hub/package.json
CHANGED
|
@@ -12,7 +12,7 @@
|
|
|
12
12
|
"dev": "node src/server.js",
|
|
13
13
|
"start": "node src/server.js",
|
|
14
14
|
"check": "node --check src/server.js && node --check src/remote-hub.js && node --check src/remote-clipboard-contract.mjs && node --check src/console-direct.js",
|
|
15
|
-
"prepublishOnly": "node ../../scripts/
|
|
15
|
+
"prepublishOnly": "node ../../scripts/vuvodesk-release-git-gate.mjs"
|
|
16
16
|
},
|
|
17
17
|
"dependencies": {
|
|
18
18
|
"@ffmpeg-installer/ffmpeg": "^1.1.0",
|
|
@@ -86,7 +86,7 @@ export class CaptureStore {
|
|
|
86
86
|
throw Object.assign(new Error('capture-mime-type-unsupported'), { status: 415 });
|
|
87
87
|
}
|
|
88
88
|
const extension = MIME_EXTENSIONS.get(mimeType) || (kind === 'screenshot' ? '.png' : '.webm');
|
|
89
|
-
const fileNameBase = safeName(metadata.fileName, `
|
|
89
|
+
const fileNameBase = safeName(metadata.fileName, `VuvoDesk_${kind}`);
|
|
90
90
|
const fileName = fileNameBase.toLowerCase().endsWith(extension) ? fileNameBase : `${fileNameBase}${extension}`;
|
|
91
91
|
const id = randomUUID();
|
|
92
92
|
const folder = kind === 'screenshot' ? 'images' : kind === 'timelapse' ? 'timelapses' : 'recordings';
|
|
@@ -122,7 +122,7 @@ export class CaptureStore {
|
|
|
122
122
|
const sessionId = randomUUID();
|
|
123
123
|
const tempPath = path.join(this.root, '.tmp', `${sessionId}.webm.part`);
|
|
124
124
|
await writeFile(tempPath, Buffer.alloc(0), { mode: 0o600 });
|
|
125
|
-
const fileNameBase = safeName(metadata.fileName, `
|
|
125
|
+
const fileNameBase = safeName(metadata.fileName, `VuvoDesk_${kind}`);
|
|
126
126
|
const session = {
|
|
127
127
|
sessionId,
|
|
128
128
|
kind,
|
package/hub/src/server.js
CHANGED
|
@@ -61,7 +61,7 @@ import { LiveDeskSettingsStore, SettingsConflictError } from './settings/setting
|
|
|
61
61
|
import { effectiveDevicePolicy } from './settings/settings-schema.js';
|
|
62
62
|
import { buildEffectiveDevicePolicy } from './settings/effective-device-policy.js';
|
|
63
63
|
import { CaptureStore } from './captures/capture-store.js';
|
|
64
|
-
import {
|
|
64
|
+
import { createVuvoDeskUpdateManager } from './vuvodesk-update.js';
|
|
65
65
|
import { createHubUdpTransport } from './transport/udp-hub-transport.js';
|
|
66
66
|
import { normalizeRuntimeAuthSession, runtimeRoleError } from '../../runtime-core/src/index.js';
|
|
67
67
|
import { fetchAuthResponse, AUTH_REQUEST_TIMEOUT_MS } from '../../runtime-core/src/auth-http.js';
|
|
@@ -1256,7 +1256,7 @@ function getLiveDeskUpdateStatus() {
|
|
|
1256
1256
|
}
|
|
1257
1257
|
|
|
1258
1258
|
const electronDesktopOwnsSelfUpdate = process.env.LIVEDESK_DESKTOP_HOST === '1';
|
|
1259
|
-
liveDeskUpdateManager =
|
|
1259
|
+
liveDeskUpdateManager = createVuvoDeskUpdateManager({
|
|
1260
1260
|
remoteHub,
|
|
1261
1261
|
currentManagerVersion: process.env.LIVEDESK_MANAGER_VERSION || packageInfo.version,
|
|
1262
1262
|
currentClientVersion: process.env.LIVEDESK_CLIENT_PACKAGE_VERSION || '',
|
|
@@ -259,7 +259,7 @@ function resetReconnectCandidate(target) {
|
|
|
259
259
|
target.stabilityDeadlineAt = '';
|
|
260
260
|
}
|
|
261
261
|
|
|
262
|
-
export function
|
|
262
|
+
export function createVuvoDeskUpdateManager({
|
|
263
263
|
remoteHub,
|
|
264
264
|
currentManagerVersion,
|
|
265
265
|
currentClientVersion,
|
package/package.json
CHANGED
|
@@ -1,12 +1,13 @@
|
|
|
1
1
|
{
|
|
2
2
|
"name": "livedesk",
|
|
3
|
-
"version": "0.1.
|
|
3
|
+
"version": "0.1.651",
|
|
4
4
|
"livedeskClientVersion": "0.1.271",
|
|
5
5
|
"buildFlavor": "production",
|
|
6
6
|
"description": "VuvoDesk Hub and client launcher",
|
|
7
7
|
"type": "module",
|
|
8
8
|
"main": "electron/main.mjs",
|
|
9
9
|
"bin": {
|
|
10
|
+
"vuvodesk": "bin/livedesk.js",
|
|
10
11
|
"livedesk": "bin/livedesk.js"
|
|
11
12
|
},
|
|
12
13
|
"files": [
|
|
@@ -22,13 +23,14 @@
|
|
|
22
23
|
"README.md"
|
|
23
24
|
],
|
|
24
25
|
"scripts": {
|
|
25
|
-
"check": "node --check bin/livedesk.js && node --check bootstrap/npm-update-cache.mjs && node --check bootstrap/update-host-client.mjs && node --check bootstrap/update-host.mjs && node --check diagnostics/
|
|
26
|
+
"check": "node --check bin/livedesk.js && node --check bootstrap/npm-update-cache.mjs && node --check bootstrap/update-host-client.mjs && node --check bootstrap/update-host.mjs && node --check diagnostics/vuvodesk-mode3-capture-smoke.mjs && node --check diagnostics/vuvodesk-mac-physical-gate-core.mjs && node --check diagnostics/vuvodesk-mac-physical-isolation.mjs && node --check diagnostics/vuvodesk-transport-physical-core.mjs && node --check diagnostics/vuvodesk-transport-physical.mjs && node --check scripts/sync-web-dist.js",
|
|
26
27
|
"build": "node scripts/sync-web-dist.js",
|
|
27
28
|
"prepack": "npm --prefix ../.. run build -w @livedesk/web && node scripts/sync-web-dist.js",
|
|
28
29
|
"pack:dry": "npm pack --dry-run",
|
|
29
|
-
"prepublishOnly": "node ../../scripts/
|
|
30
|
+
"prepublishOnly": "node ../../scripts/vuvodesk-release-git-gate.mjs"
|
|
30
31
|
},
|
|
31
32
|
"keywords": [
|
|
33
|
+
"vuvodesk",
|
|
32
34
|
"livedesk",
|
|
33
35
|
"remote",
|
|
34
36
|
"screen-wall",
|
|
@@ -9,7 +9,7 @@
|
|
|
9
9
|
],
|
|
10
10
|
"scripts": {
|
|
11
11
|
"check": "node --check src/index.js && node --check src/direct-secure-transport.js && node --check src/console-direct-wire.js",
|
|
12
|
-
"prepublishOnly": "node ../../scripts/
|
|
12
|
+
"prepublishOnly": "node ../../scripts/vuvodesk-release-git-gate.mjs"
|
|
13
13
|
},
|
|
14
14
|
"engines": {
|
|
15
15
|
"node": ">=20"
|
package/scripts/sync-web-dist.js
CHANGED
|
@@ -80,14 +80,14 @@ function missingAssets(assets) {
|
|
|
80
80
|
return assets.filter(([, assetPath]) => !existsSync(assetPath)).map(([label]) => label);
|
|
81
81
|
}
|
|
82
82
|
|
|
83
|
-
function
|
|
84
|
-
try {
|
|
85
|
-
const manifest = JSON.parse(readFileSync(resolve(repoRoot, 'package.json'), 'utf8'));
|
|
86
|
-
return manifest?.name === '
|
|
87
|
-
} catch {
|
|
88
|
-
return false;
|
|
89
|
-
}
|
|
90
|
-
}
|
|
83
|
+
function isVuvoDeskMonorepo() {
|
|
84
|
+
try {
|
|
85
|
+
const manifest = JSON.parse(readFileSync(resolve(repoRoot, 'package.json'), 'utf8'));
|
|
86
|
+
return manifest?.name === 'vuvodesk-react';
|
|
87
|
+
} catch {
|
|
88
|
+
return false;
|
|
89
|
+
}
|
|
90
|
+
}
|
|
91
91
|
|
|
92
92
|
function validateInstalledPackage() {
|
|
93
93
|
const missing = missingAssets(packagedRuntimeAssets);
|
|
@@ -101,9 +101,9 @@ function validateInstalledPackage() {
|
|
|
101
101
|
}
|
|
102
102
|
}
|
|
103
103
|
|
|
104
|
-
const
|
|
105
|
-
const missingMonorepoSources = missingAssets(monorepoSourceAssets);
|
|
106
|
-
if (!
|
|
104
|
+
const vuvodeskMonorepo = isVuvoDeskMonorepo();
|
|
105
|
+
const missingMonorepoSources = missingAssets(monorepoSourceAssets);
|
|
106
|
+
if (!vuvodeskMonorepo) {
|
|
107
107
|
validateInstalledPackage();
|
|
108
108
|
console.log('Validated existing VuvoDesk packaged assets; monorepo synchronization is not required.');
|
|
109
109
|
} else {
|
package/web/dist/app.html
CHANGED
|
@@ -52,13 +52,13 @@
|
|
|
52
52
|
.vuvodesk-static-boot [hidden] { display: none; }
|
|
53
53
|
@keyframes vuvodesk-static-boot-spin { to { transform: rotate(360deg); } }
|
|
54
54
|
</style>
|
|
55
|
-
<script type="module" crossorigin src="/assets/app-
|
|
55
|
+
<script type="module" crossorigin src="/assets/app-BSxy34W0.js" data-vuvodesk-entry></script>
|
|
56
56
|
<link rel="modulepreload" crossorigin href="/assets/icons-CacEbnZu.js">
|
|
57
57
|
<link rel="modulepreload" crossorigin href="/assets/react-Cfedt3N5.js">
|
|
58
|
-
<link rel="modulepreload" crossorigin href="/assets/styles-
|
|
58
|
+
<link rel="modulepreload" crossorigin href="/assets/styles-BriraxLg.js">
|
|
59
59
|
<link rel="modulepreload" crossorigin href="/assets/supabase-C7qjtLN3.js">
|
|
60
60
|
<link rel="modulepreload" crossorigin href="/assets/frame-lifecycle-esOdP-EY.js">
|
|
61
|
-
<link rel="modulepreload" crossorigin href="/assets/App-
|
|
61
|
+
<link rel="modulepreload" crossorigin href="/assets/App-iw6HSNbk.js">
|
|
62
62
|
<link rel="stylesheet" crossorigin href="/assets/styles-BbMJwyw_.css">
|
|
63
63
|
<link rel="stylesheet" crossorigin href="/assets/App-DFLBNvIi.css">
|
|
64
64
|
</head>
|
package/web/dist/app.webmanifest
CHANGED
|
@@ -1 +1 @@
|
|
|
1
|
-
import{h as x,j as t}from"./styles-
|
|
1
|
+
import{h as x,j as t}from"./styles-BriraxLg.js";import{a as c,a5 as A,k as q,a6 as I,a7 as z}from"./icons-CacEbnZu.js";import"./react-Cfedt3N5.js";const E={enabled:!0};function w(a){return{enabled:a?.enabled===!0}}async function L(a,p,f){let l=null;for(let s=0;s<2;s+=1){const g=await x("/api/settings",{signal:f},p);if(g.settings.agent?.enabled===a)return;try{await x("/api/settings",{method:"PATCH",signal:f,body:JSON.stringify({revision:g.revision,agent:{enabled:a}})},p);return}catch(i){if(l=i,s!==0||!String(i instanceof Error?i.message:i).startsWith("409 "))throw i}}throw l}function F({hubUrl:a,showToast:p}){const[f,l]=c.useState(E),[s,g]=c.useState(null),[i,m]=c.useState(""),[j,v]=c.useState(""),[y,d]=c.useState(""),b=c.useRef(0),u=c.useRef(null);c.useEffect(()=>{let e=!0;u.current?.abort();const n=new AbortController;u.current=n;const h=++b.current;return g(null),l(E),m(""),d(""),v(""),x("/api/settings/agent",{signal:n.signal},a).then(o=>{!e||n.signal.aborted||h!==b.current||(g(o.settings),l(w(o.settings)))}).catch(o=>{e&&!n.signal.aborted&&h===b.current&&d(o instanceof Error?o.message:String(o))}),()=>{e=!1,n.abort(),u.current===n&&(u.current=null)}},[a]);const k=(e,n)=>l(h=>({...h,[e]:n})),C=e=>{g(e),l(w(e))},S=()=>({generation:b.current,controller:u.current}),r=e=>e.generation===b.current&&e.controller!==null&&e.controller===u.current&&!e.controller.signal.aborted,R=async()=>{if(!s){d("Agent settings are not available yet.");return}const e=S();if(r(e)){m("save"),d(""),v("");try{if(await L(f.enabled,a,e.controller.signal),!r(e))return;const n=await x("/api/settings/agent",{signal:e.controller.signal},a);if(!r(e))return;C(n.settings),v("Codex Agent settings saved.")}catch(n){r(e)&&d(n instanceof Error?n.message:String(n))}finally{r(e)&&m("")}}},D=async()=>{const e=S();if(r(e)){m("test"),d(""),v("");try{const n=await x("/api/settings/agent/test",{method:"POST",signal:e.controller.signal,body:JSON.stringify({})},a);if(!r(e))return;const h=await x("/api/settings/agent",{signal:e.controller.signal},a);if(!r(e))return;C(h.settings);const o=Number.isFinite(n.connection?.latencyMs)?Math.max(0,Math.round(n.connection.latencyMs)):null;p(`Codex Agent connection verified${o!==null?` in ${o} ms.`:"."}`,"success")}catch(n){r(e)&&d(n instanceof Error?n.message:String(n))}finally{r(e)&&m("")}}},T=s?.codexInstallation==="installed"&&s.codexAuth==="signed-in",N=s!==null;return t.jsxs("div",{className:"settings-tab-content agent-settings-content",children:[t.jsxs("section",{className:"settings-section-card agent-enable-card",children:[t.jsxs("label",{className:"settings-toggle agent-enable-toggle",children:[t.jsx("input",{type:"checkbox",checked:f.enabled,onChange:e=>k("enabled",e.target.checked),disabled:!N||i!==""}),t.jsx("span",{children:"Enable Codex Agent"})]}),t.jsxs("p",{className:"settings-help",children:[t.jsx(A,{size:12})," Enabled by default. Agent commands use only the Codex account signed in on this Hub."]})]}),y&&t.jsx("div",{className:"agent-settings-alert error",role:"alert",children:y}),j&&t.jsx("div",{className:"agent-settings-alert success",role:"status",children:j}),t.jsxs("section",{className:"settings-section-card",children:[t.jsxs("div",{className:"settings-section-heading",children:[t.jsxs("div",{children:[t.jsx("span",{children:"Connection"}),t.jsx("h3",{children:"Codex SDK / CLI"})]}),t.jsx(q,{size:20})]}),t.jsxs("div",{className:"agent-connection-row",children:[t.jsx("span",{className:`agent-connection-dot ${T?"connected":s?.codexAuth==="not-signed-in"?"unavailable":""}`}),t.jsx("span",{children:s?.codexInstallation==="not-installed"?"Codex SDK not installed":s?.codexAuth==="signed-in"?"Codex CLI signed in":s?.codexAuth==="not-signed-in"?"Codex CLI sign-in required":"Codex status not tested"}),t.jsxs("button",{className:"settings-reset",onClick:()=>{D()},disabled:i!=="",type:"button",children:[t.jsx(I,{size:15})," ",i==="test"?"Testing":"Test connection"]})]}),t.jsxs("p",{className:"settings-help",children:[t.jsx(A,{size:12})," The Hub uses the installed Codex SDK / CLI to plan approved commands and run them through VuvoDesk Agent tools on selected computers. VuvoDesk never asks for separate credentials."]})]}),t.jsx("div",{className:"settings-action-row agent-settings-actions",children:t.jsxs("button",{className:"text-button primary",onClick:()=>{R()},disabled:!N||i!=="",type:"button",children:[t.jsx(z,{size:15})," ",i==="save"?"Saving":"Save Agent settings"]})})]})}export{F as AgentSettingsTab};
|