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.
Files changed (47) hide show
  1. package/README.md +1 -1
  2. package/bin/livedesk.js +13 -13
  3. package/bootstrap/client-process-identity.js +2 -2
  4. package/client/package.json +1 -1
  5. package/diagnostics/{livedesk-mac-physical-gate-core.mjs → vuvodesk-mac-physical-gate-core.mjs} +3 -3
  6. package/diagnostics/{livedesk-mode3-capture-smoke.mjs → vuvodesk-mode3-capture-smoke.mjs} +2 -2
  7. package/diagnostics/{livedesk-transport-physical.mjs → vuvodesk-transport-physical.mjs} +1 -1
  8. package/electron/before-pack.cjs +1 -1
  9. package/electron/electron-builder.e2e.yml +1 -1
  10. package/electron/electron-builder.linux-x64-dev.yml +1 -1
  11. package/electron/electron-builder.linux-x64.yml +3 -3
  12. package/electron/electron-builder.mac-arm64-dev.yml +1 -1
  13. package/electron/electron-builder.mac-arm64.yml +4 -4
  14. package/electron/electron-builder.mac-x64-dev.yml +1 -1
  15. package/electron/electron-builder.mac-x64.yml +4 -4
  16. package/electron/electron-builder.win-dev.yml +1 -1
  17. package/electron/electron-builder.win.yml +3 -3
  18. package/electron/electron-builder.yml +2 -2
  19. package/electron/installer.nsh +53 -8
  20. package/hub/package.json +1 -1
  21. package/hub/src/captures/capture-store.js +2 -2
  22. package/hub/src/server.js +2 -2
  23. package/hub/src/{live-desk-update.js → vuvodesk-update.js} +1 -1
  24. package/package.json +5 -3
  25. package/runtime-core/package.json +1 -1
  26. package/scripts/sync-web-dist.js +11 -11
  27. package/web/dist/app.html +3 -3
  28. package/web/dist/app.webmanifest +1 -1
  29. package/web/dist/assets/{AgentSettingsTab-iFp0drPg.js → AgentSettingsTab-CmoOFOcl.js} +1 -1
  30. package/web/dist/assets/{AgentsPage-j2-12UiH.js → AgentsPage-0p2Fa7hh.js} +1 -1
  31. package/web/dist/assets/{App-ClWrRZny.js → App-iw6HSNbk.js} +3 -3
  32. package/web/dist/assets/{CaptureGallery-DqFrxb4z.js → CaptureGallery-DlsfaKXP.js} +1 -1
  33. package/web/dist/assets/{DesktopUpdatePanel-KTNBQapz.js → DesktopUpdatePanel-D5sguo6U.js} +1 -1
  34. package/web/dist/assets/{SettingsPage-B9EuLki2.js → SettingsPage-BbO24wOs.js} +1 -1
  35. package/web/dist/assets/{SettingsTabs-D5-tAmxZ.js → SettingsTabs-DG1Q2KY3.js} +1 -1
  36. package/web/dist/assets/{ShareFilesPage-CeABxzoG.js → ShareFilesPage-0PiU0oYj.js} +1 -1
  37. package/web/dist/assets/{SupportPage-BghgDQeI.js → SupportPage-DcQ5yK4j.js} +1 -1
  38. package/web/dist/assets/{LiveDeskApp-C_nh3psi.js → VuvoDeskApp-CeYs_j7-.js} +1 -1
  39. package/web/dist/assets/{app-CTK6L71p.js → app-BSxy34W0.js} +1 -1
  40. package/web/dist/assets/{main-u3H5g7g9.js → main-D5ioXAGK.js} +2 -2
  41. package/web/dist/assets/{styles-BPIskmg3.js → styles-BriraxLg.js} +1 -1
  42. package/web/dist/index.html +2 -2
  43. package/web/dist/sw.js +1 -1
  44. package/web/dist/{livedesk-build-evidence.json → vuvodesk-build-evidence.json} +55 -55
  45. /package/diagnostics/{livedesk-mac-physical-isolation.mjs → vuvodesk-mac-physical-isolation.mjs} +0 -0
  46. /package/diagnostics/{livedesk-transport-physical-core.mjs → vuvodesk-transport-physical-core.mjs} +0 -0
  47. /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/livedesk/scripts/sync-web-dist.js` to synchronize the product.
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/livedesk-mac-physical-isolation.mjs';
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
- 'livedesk-transport-physical.mjs'
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
- 'livedesk-mode3-capture-smoke.mjs'
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\/(?:livedesk\/)?hub|node_modules\/@?livedesk\/hub)\/src\/server\.js/i.test(normalizedCommandLine);
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[\\\\/](?:livedesk[\\\\/])?hub|node_modules[\\\\/]@?livedesk[\\\\/]hub)[\\\\/]src[\\\\/]server\\.js";',
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[\\\\/](?:livedesk[\\\\/])?hub|node_modules[\\\\/]@?livedesk[\\\\/]hub)[\\\\/]src[\\\\/]server\\.js";',
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/(?:livedesk/client|client))/fast/[^/\\s]+';
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\/(?:livedesk\/client|client))\/bin\/livedesk-client-node\.js(?:\s|["']|$)/i.test(normalizedCommandLine);
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'
@@ -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/livedesk-release-git-gate.mjs"
23
+ "prepublishOnly": "node ../../scripts/vuvodesk-release-git-gate.mjs"
24
24
  },
25
25
  "keywords": [
26
26
  "livedesk",
@@ -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\/(?:livedesk\/client|client))\/bin\/livedesk-client(?:-node)?\.js(?:\s|$|["'])/i
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\/(?:livedesk\/hub|hub))\/src\/server\.js(?:\s|$|["'])/i
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 './livedesk-mac-physical-gate-core.mjs';
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 './livedesk-mac-physical-isolation.mjs';
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 './livedesk-transport-physical-core.mjs';
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;
@@ -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 = 'livedesk-build-evidence.json';
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,4 +1,4 @@
1
- extends: file:packages/livedesk/electron/electron-builder.win.yml
1
+ extends: file:packages/vuvodesk/electron/electron-builder.win.yml
2
2
  artifactName: VuvoDesk-${version}-${arch}-e2e.${ext}
3
3
  directories:
4
4
  output: dist/desktop-e2e
@@ -1,4 +1,4 @@
1
- extends: file:packages/livedesk/electron/electron-builder.linux-x64.yml
1
+ extends: file:packages/vuvodesk/electron/electron-builder.linux-x64.yml
2
2
  artifactName: VuvoDesk-${version}-dev-${arch}.${ext}
3
3
  directories:
4
4
  output: dist/desktop-dev
@@ -1,5 +1,5 @@
1
- extends: file:packages/livedesk/electron/electron-builder.yml
2
- afterPack: packages/livedesk/electron/after-pack.cjs
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/livedesk/electron/icon.png
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/livedesk/electron/electron-builder.mac-arm64.yml
1
+ extends: file:packages/vuvodesk/electron/electron-builder.mac-arm64.yml
2
2
  artifactName: VuvoDesk-${version}-dev-${arch}.${ext}
3
3
  directories:
4
4
  output: dist/desktop-dev
@@ -1,4 +1,4 @@
1
- extends: file:packages/livedesk/electron/electron-builder.yml
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/livedesk/electron/icon.icns
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/livedesk/electron/entitlements.mac.plist
34
- entitlementsInherit: packages/livedesk/electron/entitlements.mac.plist
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/livedesk/electron/electron-builder.mac-x64.yml
1
+ extends: file:packages/vuvodesk/electron/electron-builder.mac-x64.yml
2
2
  artifactName: VuvoDesk-${version}-dev-${arch}.${ext}
3
3
  directories:
4
4
  output: dist/desktop-dev
@@ -1,4 +1,4 @@
1
- extends: file:packages/livedesk/electron/electron-builder.yml
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/livedesk/electron/icon.icns
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/livedesk/electron/entitlements.mac.plist
34
- entitlementsInherit: packages/livedesk/electron/entitlements.mac.plist
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/livedesk/electron/electron-builder.win.yml
1
+ extends: file:packages/vuvodesk/electron/electron-builder.win.yml
2
2
  artifactName: VuvoDesk-${version}-dev-${arch}.${ext}
3
3
  directories:
4
4
  output: dist/desktop-dev
@@ -1,4 +1,4 @@
1
- extends: file:packages/livedesk/electron/electron-builder.yml
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/livedesk/electron/icon.ico
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/livedesk/electron/installer.nsh
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/livedesk/electron/before-pack.cjs
5
+ beforePack: packages/vuvodesk/electron/before-pack.cjs
6
6
  directories:
7
- app: packages/livedesk
7
+ app: packages/vuvodesk
8
8
  output: dist/desktop
@@ -1,13 +1,6 @@
1
1
  !include "LogicLib.nsh"
2
2
 
3
- !macro customPageAfterChangeDir
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/livedesk-release-git-gate.mjs"
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, `LiveDesk_${kind}`);
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, `LiveDesk_${kind}`);
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 { createLiveDeskUpdateManager } from './live-desk-update.js';
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 = createLiveDeskUpdateManager({
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 createLiveDeskUpdateManager({
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.649",
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/livedesk-mode3-capture-smoke.mjs && node --check diagnostics/livedesk-mac-physical-gate-core.mjs && node --check diagnostics/livedesk-mac-physical-isolation.mjs && node --check diagnostics/livedesk-transport-physical-core.mjs && node --check diagnostics/livedesk-transport-physical.mjs && node --check scripts/sync-web-dist.js",
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/livedesk-release-git-gate.mjs"
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/livedesk-release-git-gate.mjs"
12
+ "prepublishOnly": "node ../../scripts/vuvodesk-release-git-gate.mjs"
13
13
  },
14
14
  "engines": {
15
15
  "node": ">=20"
@@ -80,14 +80,14 @@ function missingAssets(assets) {
80
80
  return assets.filter(([, assetPath]) => !existsSync(assetPath)).map(([label]) => label);
81
81
  }
82
82
 
83
- function isLiveDeskMonorepo() {
84
- try {
85
- const manifest = JSON.parse(readFileSync(resolve(repoRoot, 'package.json'), 'utf8'));
86
- return manifest?.name === 'livedesk-react';
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 liveDeskMonorepo = isLiveDeskMonorepo();
105
- const missingMonorepoSources = missingAssets(monorepoSourceAssets);
106
- if (!liveDeskMonorepo) {
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-CTK6L71p.js" data-vuvodesk-entry></script>
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-BPIskmg3.js">
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-ClWrRZny.js">
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>
@@ -4,7 +4,7 @@
4
4
  "short_name": "VuvoDesk",
5
5
  "description": "Monitor and control your VuvoDesk computers from your phone.",
6
6
  "lang": "en",
7
- "start_url": "/app?pwa=0.1.649",
7
+ "start_url": "/app?pwa=0.1.651",
8
8
  "scope": "/",
9
9
  "display": "standalone",
10
10
  "orientation": "any",
@@ -1 +1 @@
1
- import{h as x,j as t}from"./styles-BPIskmg3.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};
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};