livedesk 0.1.650 → 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 (46) 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/hub/package.json +1 -1
  20. package/hub/src/captures/capture-store.js +2 -2
  21. package/hub/src/server.js +2 -2
  22. package/hub/src/{live-desk-update.js → vuvodesk-update.js} +1 -1
  23. package/package.json +5 -3
  24. package/runtime-core/package.json +1 -1
  25. package/scripts/sync-web-dist.js +11 -11
  26. package/web/dist/app.html +3 -3
  27. package/web/dist/app.webmanifest +1 -1
  28. package/web/dist/assets/{AgentSettingsTab-1QVVyDM0.js → AgentSettingsTab-CmoOFOcl.js} +1 -1
  29. package/web/dist/assets/{AgentsPage-PXaoor6-.js → AgentsPage-0p2Fa7hh.js} +1 -1
  30. package/web/dist/assets/{App-C0pLhnrj.js → App-iw6HSNbk.js} +3 -3
  31. package/web/dist/assets/{CaptureGallery-RoIgqppm.js → CaptureGallery-DlsfaKXP.js} +1 -1
  32. package/web/dist/assets/{DesktopUpdatePanel-CSORoxhi.js → DesktopUpdatePanel-D5sguo6U.js} +1 -1
  33. package/web/dist/assets/{SettingsPage-56oq8v6l.js → SettingsPage-BbO24wOs.js} +1 -1
  34. package/web/dist/assets/{SettingsTabs-CZ388qM0.js → SettingsTabs-DG1Q2KY3.js} +1 -1
  35. package/web/dist/assets/{ShareFilesPage-CxsFwtMy.js → ShareFilesPage-0PiU0oYj.js} +1 -1
  36. package/web/dist/assets/{SupportPage-D5pCkJTU.js → SupportPage-DcQ5yK4j.js} +1 -1
  37. package/web/dist/assets/{LiveDeskApp-BEyIPIAd.js → VuvoDeskApp-CeYs_j7-.js} +1 -1
  38. package/web/dist/assets/{app-Cf4_lX6I.js → app-BSxy34W0.js} +1 -1
  39. package/web/dist/assets/{main-BBDlfRlO.js → main-D5ioXAGK.js} +2 -2
  40. package/web/dist/assets/{styles-B5DEnner.js → styles-BriraxLg.js} +1 -1
  41. package/web/dist/index.html +2 -2
  42. package/web/dist/sw.js +1 -1
  43. package/web/dist/{livedesk-build-evidence.json → vuvodesk-build-evidence.json} +58 -58
  44. /package/diagnostics/{livedesk-mac-physical-isolation.mjs → vuvodesk-mac-physical-isolation.mjs} +0 -0
  45. /package/diagnostics/{livedesk-transport-physical-core.mjs → vuvodesk-transport-physical-core.mjs} +0 -0
  46. /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
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.650",
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-Cf4_lX6I.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-B5DEnner.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-C0pLhnrj.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.650",
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-B5DEnner.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};
@@ -1,4 +1,4 @@
1
- import{j as t,e as ht,h as F}from"./styles-B5DEnner.js";import{a as d,m as yt,n as Ce,o as vt,l as ee,X as xe,p as wt,q as kt,s as Je,B as bt,t as Ct,u as Se,S as H,v as xt,w as St,x as _e,b as jt,y as At,k as Ze,z as Rt,N as Nt,F as Pt,H as It,I as Tt,J as Et,U as ue,c as Xe}from"./icons-CacEbnZu.js";import"./react-Cfedt3N5.js";const Ot=d.forwardRef(function({value:s,onChange:n,onSubmit:r,onOpenSuggestedTasks:i,suggestedOpen:f=!1,suggestedTaskCount:c,disabled:v=!1,placeholder:S="Ask VuvoDesk to work across your machines...",compact:g=!1},x){return t.jsxs("form",{className:"agents-composer",onSubmit:w=>{w.preventDefault(),r()},children:[t.jsx("button",{className:`agents-suggested-trigger ${f?"active":""}`,type:"button","aria-label":c===void 0?"Open Suggested tasks":`Open Suggested tasks (${c} available)`,"aria-expanded":f,onClick:i,disabled:v,children:t.jsx(yt,{size:17})}),t.jsx("textarea",{ref:x,value:s,onChange:w=>n(w.target.value.slice(0,4e3)),placeholder:S,"aria-label":"Ask VuvoDesk",rows:g?1:2,disabled:v}),t.jsxs("button",{className:"agents-run-button",type:"submit",disabled:v||!s.trim(),children:[v?t.jsx(Ce,{className:"spin",size:16}):t.jsx(vt,{size:16}),v?"Running":"Run"]})]})}),$t=["read","processControl","serviceControl","applicationControl","fileRead","fileWrite","fileDelete","shell","script","softwareInstall","network","systemPower","systemConfiguration","userAccount"];function de(e){return e.deviceName?.trim()||e.hostname?.trim()||e.deviceId}function pe(e){return e.connected!==!0?!1:e.synthetic===!0?!0:!e.channels||e.channels.control===!0}function Dt(e){return e==="running"||e==="completed"||e==="failed"||e==="cancelled"?e:"queued"}function _t(e){switch(e){case"process.list":return"Process list";case"system.health":return"System health";case"gpu.status":return"GPU status";case"disk.status":return"Disk status";case"service.status":return"Service status";case"diagnostics.collect":return"Diagnostics";case"process.control":return"Process control";case"service.control":return"Service control";case"application.launch":return"Launch application";case"application.close":return"Close application";case"file.read":return"Read file";case"file.write":return"Write file";case"file.delete":return"Delete file";case"file.list":return"List directory";case"command.run":return"Run command";case"script.run":return"Run script";case"software.install":return"Install software";case"network.status":return"Network status";case"system.power":return"Power action";case"system.configure":return"System configuration";case"logs.collect":return"Collect logs"}}const zt=64*1024,ze="[Earlier log output hidden by PWA display limit.]",Qe=new TextEncoder,Mt=new TextDecoder("utf-8",{fatal:!0}),Me=16*1024,Lt=200,Le="(?:access[_-]?(?:token|key)|refresh[_-]?token|id[_-]?token|pair[_-]?(?:token|key)|authorization|api[_-]?key|private[_-]?key|connection[_-]?string|credential|password|passwd|secret|cookie|set-cookie)",Ft="(?:access[_-]?(?:token|key)|refresh[_-]?token|id[_-]?token|pair[_-]?(?:token|key)|token|authorization|api[_-]?key|private[_-]?key|connection[_-]?string|credential|password|passwd|secret|cookie|set-cookie)",Bt="(?:access[_-]?(?:token|key)|refresh[_-]?token|id[_-]?token|pair[_-]?(?:token|key)|token|authorization|api[_-]?key|credential|password|secret|cookie)",Ut=/\b(?:sk-(?:proj-|ant-)?[A-Za-z0-9_-]{8,}|gh[pousr]_[A-Za-z0-9]{8,}|github_pat_[A-Za-z0-9_]{8,}|(?:AKIA|ASIA)[A-Z0-9]{16}|AIza[A-Za-z0-9_-]{35}|npm_[A-Za-z0-9]{8,}|xox[a-z]-[A-Za-z0-9-]{8,}|(?:sk|rk)_(?:live|test)_[A-Za-z0-9]{8,})\b/g;function qt(e){return e&&typeof e=="object"&&!Array.isArray(e)?e:null}function Fe(e){return Qe.encode(e).byteLength}function Be(e,s){const n=Qe.encode(e);if(n.byteLength<=s)return{value:e,truncated:!1};let r=n.byteLength-s;for(;r<n.byteLength&&(n[r]&192)===128;)r+=1;let i=Mt.decode(n.subarray(r));const f=i.indexOf(`
1
+ import{j as t,e as ht,h as F}from"./styles-BriraxLg.js";import{a as d,m as yt,n as Ce,o as vt,l as ee,X as xe,p as wt,q as kt,s as Je,B as bt,t as Ct,u as Se,S as H,v as xt,w as St,x as _e,b as jt,y as At,k as Ze,z as Rt,N as Nt,F as Pt,H as It,I as Tt,J as Et,U as ue,c as Xe}from"./icons-CacEbnZu.js";import"./react-Cfedt3N5.js";const Ot=d.forwardRef(function({value:s,onChange:n,onSubmit:r,onOpenSuggestedTasks:i,suggestedOpen:f=!1,suggestedTaskCount:c,disabled:v=!1,placeholder:S="Ask VuvoDesk to work across your machines...",compact:g=!1},x){return t.jsxs("form",{className:"agents-composer",onSubmit:w=>{w.preventDefault(),r()},children:[t.jsx("button",{className:`agents-suggested-trigger ${f?"active":""}`,type:"button","aria-label":c===void 0?"Open Suggested tasks":`Open Suggested tasks (${c} available)`,"aria-expanded":f,onClick:i,disabled:v,children:t.jsx(yt,{size:17})}),t.jsx("textarea",{ref:x,value:s,onChange:w=>n(w.target.value.slice(0,4e3)),placeholder:S,"aria-label":"Ask VuvoDesk",rows:g?1:2,disabled:v}),t.jsxs("button",{className:"agents-run-button",type:"submit",disabled:v||!s.trim(),children:[v?t.jsx(Ce,{className:"spin",size:16}):t.jsx(vt,{size:16}),v?"Running":"Run"]})]})}),$t=["read","processControl","serviceControl","applicationControl","fileRead","fileWrite","fileDelete","shell","script","softwareInstall","network","systemPower","systemConfiguration","userAccount"];function de(e){return e.deviceName?.trim()||e.hostname?.trim()||e.deviceId}function pe(e){return e.connected!==!0?!1:e.synthetic===!0?!0:!e.channels||e.channels.control===!0}function Dt(e){return e==="running"||e==="completed"||e==="failed"||e==="cancelled"?e:"queued"}function _t(e){switch(e){case"process.list":return"Process list";case"system.health":return"System health";case"gpu.status":return"GPU status";case"disk.status":return"Disk status";case"service.status":return"Service status";case"diagnostics.collect":return"Diagnostics";case"process.control":return"Process control";case"service.control":return"Service control";case"application.launch":return"Launch application";case"application.close":return"Close application";case"file.read":return"Read file";case"file.write":return"Write file";case"file.delete":return"Delete file";case"file.list":return"List directory";case"command.run":return"Run command";case"script.run":return"Run script";case"software.install":return"Install software";case"network.status":return"Network status";case"system.power":return"Power action";case"system.configure":return"System configuration";case"logs.collect":return"Collect logs"}}const zt=64*1024,ze="[Earlier log output hidden by PWA display limit.]",Qe=new TextEncoder,Mt=new TextDecoder("utf-8",{fatal:!0}),Me=16*1024,Lt=200,Le="(?:access[_-]?(?:token|key)|refresh[_-]?token|id[_-]?token|pair[_-]?(?:token|key)|authorization|api[_-]?key|private[_-]?key|connection[_-]?string|credential|password|passwd|secret|cookie|set-cookie)",Ft="(?:access[_-]?(?:token|key)|refresh[_-]?token|id[_-]?token|pair[_-]?(?:token|key)|token|authorization|api[_-]?key|private[_-]?key|connection[_-]?string|credential|password|passwd|secret|cookie|set-cookie)",Bt="(?:access[_-]?(?:token|key)|refresh[_-]?token|id[_-]?token|pair[_-]?(?:token|key)|token|authorization|api[_-]?key|credential|password|secret|cookie)",Ut=/\b(?:sk-(?:proj-|ant-)?[A-Za-z0-9_-]{8,}|gh[pousr]_[A-Za-z0-9]{8,}|github_pat_[A-Za-z0-9_]{8,}|(?:AKIA|ASIA)[A-Z0-9]{16}|AIza[A-Za-z0-9_-]{35}|npm_[A-Za-z0-9]{8,}|xox[a-z]-[A-Za-z0-9-]{8,}|(?:sk|rk)_(?:live|test)_[A-Za-z0-9]{8,})\b/g;function qt(e){return e&&typeof e=="object"&&!Array.isArray(e)?e:null}function Fe(e){return Qe.encode(e).byteLength}function Be(e,s){const n=Qe.encode(e);if(n.byteLength<=s)return{value:e,truncated:!1};let r=n.byteLength-s;for(;r<n.byteLength&&(n[r]&192)===128;)r+=1;let i=Mt.decode(n.subarray(r));const f=i.indexOf(`
2
2
  `);return f>=0&&f<i.length-1&&(i=i.slice(f+1)),{value:i,truncated:!0}}function et(e){return e.replace(/-----BEGIN [^-\r\n]*PRIVATE KEY-----[\s\S]*?-----END [^-\r\n]*PRIVATE KEY-----/gi,"[REDACTED PRIVATE KEY]").replace(/\b(?:proxy-)?authorization\s*[:=]\s*[^\r\n]*|\b(?:set-)?cookie\s*[:=]\s*[^\r\n]*/gi,"credential-header=[REDACTED]").replace(/\bBearer\s+(?:"[^"]*"|'[^']*'|[^\s,;]+)/gi,"Bearer [REDACTED]").replace(new RegExp(`("${Le}"\\s*:\\s*")[^"\\r\\n]*(")`,"gi"),"$1[REDACTED]$2").replace(new RegExp(`('${Le}'\\s*:\\s*')[^'\\r\\n]*(')`,"gi"),"$1[REDACTED]$2").replace(new RegExp(`((?:[A-Za-z0-9.-]+[_-])?${Ft}\\s*[:=]\\s*)(?!\\[REDACTED\\])[^\\s,;&]+`,"gi"),"$1[REDACTED]").replace(new RegExp(`([?&]${Bt}=)[^&\\s]+`,"gi"),"$1[REDACTED]").replace(/\b(?:eyJ|[A-Za-z0-9_-]{8,}\.)[A-Za-z0-9_-]{8,}\.[A-Za-z0-9_-]{8,}\b/g,"[REDACTED TOKEN]").replace(Ut,"[REDACTED KEY]")}function Gt(e){return typeof e!="string"?"source unknown":et(e).replace(/[\u0000-\u001f\u007f]/g," ").trim().slice(0,64)||"source unknown"}function Ue(e){return typeof e=="number"&&Number.isSafeInteger(e)&&e>=0?Math.floor(e):null}function Vt(e){if(typeof e!="string"||e.length===0)return{output:"",displayTruncated:!1};const s=Be(e.replace(/\r\n?/g,`
3
3
  `),zt);let n=et(s.value).replace(/[\u0000-\u0008\u000b\u000c\u000e-\u001f\u007f]/g," ").trim(),r=s.truncated;const i=n?n.split(`
4
4
  `):[];if(i.length>Lt-1&&(n=i.slice(-199).join(`