@walkhi/code-relax 0.1.0-beta.30 → 0.1.0-beta.31

This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
Files changed (185) hide show
  1. package/README.md +95 -89
  2. package/dist/bin/cleanup-accounts.mjs +63 -63
  3. package/dist/bin/codex-remote.mjs +374 -367
  4. package/dist/bin/manage-relay-admin.mjs +20 -20
  5. package/dist/bin/migrate-relay-db.mjs +109 -109
  6. package/dist/bin/publish-android-release.mjs +62 -58
  7. package/dist/bin/self-relay-admin.mjs +8 -8
  8. package/dist/bin/self-relay-demo.mjs +33 -33
  9. package/dist/bin/self-relay-server.mjs +66 -66
  10. package/dist/build-platform.json +1 -1
  11. package/dist/get-lan-networks.ps1 +40 -40
  12. package/dist/get-shared-service-url.ps1 +6 -6
  13. package/dist/shared/app-server-events.cjs +422 -412
  14. package/dist/shared/code-browser.cjs +159 -159
  15. package/dist/shared/file-changes.cjs +31 -31
  16. package/dist/shared/file-citations.cjs +117 -117
  17. package/dist/shared/file-mentions.cjs +92 -92
  18. package/dist/shared/message-delivery.cjs +54 -54
  19. package/dist/shared/p2p-data-channel.cjs +72 -72
  20. package/dist/shared/p2p-diagnostics.cjs +28 -28
  21. package/dist/shared/p2p-file-channel.cjs +74 -74
  22. package/dist/shared/plan-pricing.cjs +32 -32
  23. package/dist/shared/question-attention.cjs +40 -0
  24. package/dist/shared/server-requests.cjs +219 -219
  25. package/dist/shared/timeline-sync.cjs +173 -173
  26. package/dist/skills/code-relax/SKILL.md +22 -22
  27. package/dist/src/archived-threads.mjs +22 -0
  28. package/dist/src/background-process.mjs +18 -18
  29. package/dist/src/bounded-process-log.mjs +63 -63
  30. package/dist/src/celsius-client.mjs +107 -107
  31. package/dist/src/code-browser.mjs +100 -100
  32. package/dist/src/desktop-launcher.mjs +46 -46
  33. package/dist/src/dots-approval-timeline.mjs +99 -99
  34. package/dist/src/dots-avatar.mjs +42 -42
  35. package/dist/src/dots-chat-projection.mjs +50 -50
  36. package/dist/src/dots-chat-server.mjs +461 -461
  37. package/dist/src/dots-message-images.mjs +319 -319
  38. package/dist/src/dots-profile.mjs +77 -77
  39. package/dist/src/dots-room-activity.mjs +94 -94
  40. package/dist/src/dots-room-client.mjs +135 -135
  41. package/dist/src/dots-room-projection.mjs +94 -94
  42. package/dist/src/dots-schedules.mjs +66 -66
  43. package/dist/src/dots-summary-tasks.mjs +32 -32
  44. package/dist/src/dots-task-catalog.mjs +430 -430
  45. package/dist/src/dots-task-files.mjs +52 -52
  46. package/dist/src/execution-health.mjs +26 -26
  47. package/dist/src/file-transfer-range.mjs +22 -22
  48. package/dist/src/file-upload-session.mjs +130 -130
  49. package/dist/src/hosted-history-app-server.mjs +103 -103
  50. package/dist/src/hosted-history-cache.mjs +113 -113
  51. package/dist/src/lan-socket-server.mjs +265 -263
  52. package/dist/src/managed-app-server.mjs +244 -244
  53. package/dist/src/message-images.mjs +9 -9
  54. package/dist/src/message-upload-files.mjs +74 -74
  55. package/dist/src/onboarding.mjs +12 -12
  56. package/dist/src/plan-pricing.mjs +47 -47
  57. package/dist/src/platform/README.md +12 -12
  58. package/dist/src/platform/codex-protocol.mjs +46 -46
  59. package/dist/src/platform/codex-runtime.mjs +3 -3
  60. package/dist/src/platform/credential-store.mjs +3 -3
  61. package/dist/src/platform/desktop-host.mjs +3 -3
  62. package/dist/src/platform/desktop-project-registration.mjs +3 -3
  63. package/dist/src/platform/desktop-project-store.mjs +208 -149
  64. package/dist/src/platform/file-opener.mjs +9 -0
  65. package/dist/src/platform/linux/README.md +3 -3
  66. package/dist/src/platform/linux/codex-runtime.mjs +56 -0
  67. package/dist/src/platform/linux/credential-store.mjs +28 -0
  68. package/dist/src/platform/linux/desktop-host.mjs +83 -0
  69. package/dist/src/platform/linux/desktop-installation.mjs +36 -0
  70. package/dist/src/platform/linux/desktop-project-registration.mjs +11 -0
  71. package/dist/src/platform/linux/network-info.mjs +11 -0
  72. package/dist/src/platform/linux/process.mjs +42 -0
  73. package/dist/src/platform/linux/project-locations.mjs +17 -0
  74. package/dist/src/platform/linux/resident-startup.mjs +52 -0
  75. package/dist/src/platform/linux/retained-runtime.mjs +76 -0
  76. package/dist/src/platform/linux/service-host.mjs +18 -0
  77. package/dist/src/platform/linux/system.mjs +49 -0
  78. package/dist/src/platform/linux/user-environment.mjs +7 -0
  79. package/dist/src/platform/macos/README.md +3 -3
  80. package/dist/src/platform/macos/codex-runtime.mjs +125 -125
  81. package/dist/src/platform/macos/credential-store.mjs +10 -10
  82. package/dist/src/platform/macos/desktop-host.mjs +82 -82
  83. package/dist/src/platform/macos/desktop-project-registration.mjs +11 -10
  84. package/dist/src/platform/macos/network-info.mjs +8 -28
  85. package/dist/src/platform/macos/project-locations.mjs +8 -8
  86. package/dist/src/platform/macos/resident-startup.mjs +84 -84
  87. package/dist/src/platform/macos/retained-runtime.mjs +127 -127
  88. package/dist/src/platform/macos/service-host.mjs +18 -18
  89. package/dist/src/platform/macos/system.mjs +29 -29
  90. package/dist/src/platform/macos/user-environment.mjs +7 -7
  91. package/dist/src/platform/native-package.mjs +58 -46
  92. package/dist/src/platform/network-info.mjs +3 -3
  93. package/dist/src/platform/path-identity.mjs +5 -5
  94. package/dist/src/platform/posix/network-candidates.mjs +23 -0
  95. package/dist/src/platform/posix/runtime-paths.mjs +25 -25
  96. package/dist/src/platform/project-locations.mjs +3 -3
  97. package/dist/src/platform/runtime-paths.mjs +8 -8
  98. package/dist/src/platform/select.mjs +5 -5
  99. package/dist/src/platform/service-host.mjs +3 -3
  100. package/dist/src/platform/user-environment.mjs +3 -3
  101. package/dist/src/platform/windows/IsolatedProcess.cs +79 -79
  102. package/dist/src/platform/windows/activate-desktop.ps1 +48 -48
  103. package/dist/src/platform/windows/background-process.mjs +30 -30
  104. package/dist/src/platform/windows/codex-runtime.mjs +215 -215
  105. package/dist/src/platform/windows/credential-store.mjs +27 -27
  106. package/dist/src/platform/windows/credential-store.ps1 +49 -49
  107. package/dist/src/platform/windows/desktop-helper.mjs +179 -179
  108. package/dist/src/platform/windows/desktop-host.mjs +58 -58
  109. package/dist/src/platform/windows/desktop-info.ps1 +14 -14
  110. package/dist/src/platform/windows/desktop-project-registration.mjs +4 -4
  111. package/dist/src/platform/windows/desktop-runtime.ps1 +10 -10
  112. package/dist/src/platform/windows/desktop-shortcuts.ps1 +21 -21
  113. package/dist/src/platform/windows/dots-profile.mjs +49 -49
  114. package/dist/src/platform/windows/launch-worker.mjs +41 -41
  115. package/dist/src/platform/windows/network-info.mjs +34 -34
  116. package/dist/src/platform/windows/project-locations.mjs +16 -16
  117. package/dist/src/platform/windows/resident-start.js +20 -20
  118. package/dist/src/platform/windows/resident-start.ps1 +7 -7
  119. package/dist/src/platform/windows/resident-startup.ps1 +83 -83
  120. package/dist/src/platform/windows/resolve-state-root.ps1 +14 -14
  121. package/dist/src/platform/windows/runtime-paths.mjs +20 -20
  122. package/dist/src/platform/windows/rustdesk-video-probe.mjs +167 -167
  123. package/dist/src/platform/windows/service-host.mjs +31 -31
  124. package/dist/src/platform/windows/start-hidden-console.ps1 +49 -49
  125. package/dist/src/platform/windows/stop-desktop.ps1 +22 -22
  126. package/dist/src/platform/windows/user-environment.mjs +50 -50
  127. package/dist/src/platform/windows/user-environment.ps1 +41 -41
  128. package/dist/src/project-archive.mjs +30 -0
  129. package/dist/src/project-create.mjs +121 -119
  130. package/dist/src/project-management.mjs +59 -69
  131. package/dist/src/project-remove.mjs +55 -0
  132. package/dist/src/project-update.mjs +56 -0
  133. package/dist/src/runtime-discovery.mjs +47 -47
  134. package/dist/src/self-relay/account-cleanup.mjs +30 -30
  135. package/dist/src/self-relay/account-connections.mjs +52 -52
  136. package/dist/src/self-relay/admin-cloud.mjs +101 -101
  137. package/dist/src/self-relay/admin-page.mjs +80 -80
  138. package/dist/src/self-relay/admin-server.mjs +74 -74
  139. package/dist/src/self-relay/admin-state.mjs +127 -127
  140. package/dist/src/self-relay/admin-style.mjs +14 -14
  141. package/dist/src/self-relay/android-releases.mjs +61 -61
  142. package/dist/src/self-relay/client.mjs +61 -61
  143. package/dist/src/self-relay/connector.mjs +439 -438
  144. package/dist/src/self-relay/debug-allowlist.mjs +33 -33
  145. package/dist/src/self-relay/demo.mjs +37 -37
  146. package/dist/src/self-relay/device-info.mjs +27 -0
  147. package/dist/src/self-relay/device-store.mjs +92 -84
  148. package/dist/src/self-relay/diagnostics.mjs +54 -54
  149. package/dist/src/self-relay/email-accounts.mjs +183 -183
  150. package/dist/src/self-relay/file-wire.mjs +13 -13
  151. package/dist/src/self-relay/lan-authorizations.mjs +71 -42
  152. package/dist/src/self-relay/lifecycle.mjs +264 -250
  153. package/dist/src/self-relay/long-pairing.mjs +40 -40
  154. package/dist/src/self-relay/mysql-state.mjs +118 -105
  155. package/dist/src/self-relay/p2p-probe.mjs +159 -159
  156. package/dist/src/self-relay/privacy-page.mjs +26 -26
  157. package/dist/src/self-relay/public-releases.mjs +34 -0
  158. package/dist/src/self-relay/rtc-file-bridge.mjs +41 -41
  159. package/dist/src/self-relay/server.mjs +1006 -932
  160. package/dist/src/self-relay/usage-daily.mjs +55 -55
  161. package/dist/src/self-relay/usage-meter.mjs +141 -141
  162. package/dist/src/self-relay/windows-route-helper.mjs +75 -75
  163. package/dist/src/self-relay/wire.mjs +36 -36
  164. package/dist/src/server.mjs +1861 -1778
  165. package/dist/src/service-control.mjs +82 -82
  166. package/dist/src/service-doctor.mjs +110 -110
  167. package/dist/src/service-health.mjs +33 -33
  168. package/dist/src/service-install.mjs +91 -91
  169. package/dist/src/service-lifecycle.mjs +138 -138
  170. package/dist/src/service-restart.mjs +81 -81
  171. package/dist/src/shared-app-server.mjs +615 -611
  172. package/dist/src/shared-catalog.mjs +132 -132
  173. package/dist/src/shared-recovery.mjs +146 -146
  174. package/dist/src/shared-thread-stream.mjs +164 -164
  175. package/dist/src/skill-install.mjs +51 -51
  176. package/dist/src/thread-title-generation.mjs +150 -150
  177. package/dist/src/turn-model-history.mjs +47 -47
  178. package/dist/src/usage-reset.mjs +17 -17
  179. package/dist/src/workstation-downloads.mjs +120 -120
  180. package/dist/tools/rtc-route-helper.ps1 +99 -99
  181. package/dist/tools/start-rtc-route-helper.ps1 +15 -15
  182. package/dist/web/vendor/markdown-it.LICENSE.txt +22 -22
  183. package/dist/web/vendor/markdown-it.umd.min.js +13 -13
  184. package/package.json +7 -6
  185. package/tools/postinstall.mjs +127 -127
@@ -1,66 +1,66 @@
1
- #!/usr/bin/env node
2
- import fs from 'node:fs';
3
- import serviceEndpoints from '../shared/service-endpoints.cjs';
4
- import { deviceStore, validId } from '../src/self-relay/device-store.mjs';
5
- import { openRelayMysql } from '../src/self-relay/mysql-state.mjs';
6
- import { startSelfRelay } from '../src/self-relay/server.mjs';
7
- import { updateDebugAllowlist } from '../src/self-relay/debug-allowlist.mjs';
8
-
9
- const keyFile = process.env.RELAY_HOST_KEY_FILE;
10
- if (!keyFile) throw new Error('RELAY_HOST_KEY_FILE is required');
11
- const hostKey = fs.readFileSync(keyFile, 'utf8').trim();
12
- const port = Number(process.env.RELAY_PORT || 45850);
13
- if (!Number.isInteger(port) || port < 1024 || port > 65535) throw new Error('Invalid RELAY_PORT');
14
- const stateFile = process.env.RELAY_STATE_FILE;
15
- const mysqlConfigFile = process.env.RELAY_MYSQL_CONFIG_FILE;
16
- const accountConfigFile = process.env.RELAY_ACCOUNT_CONFIG_FILE;
17
- const longPairingFile = process.env.RELAY_LONG_PAIRING_FILE || '/var/lib/codex-relay/long-pairing.json';
18
- if (!stateFile && !mysqlConfigFile) throw new Error('RELAY_STATE_FILE or RELAY_MYSQL_CONFIG_FILE is required');
19
- const debugAllowlistFile = process.env.RELAY_DEBUG_ALLOWLIST_FILE || '/etc/codex-relay/debug-allowlist.json';
20
- const adminStateFile = process.env.RELAY_ADMIN_STATE_FILE || '/var/lib/codex-relay/admin.json';
21
- const maxRelaySessions = Number(process.env.RELAY_MAX_RELAY_SESSIONS || 8);
22
- if (!Number.isSafeInteger(maxRelaySessions) || maxRelaySessions < 1 || maxRelaySessions > 256) throw new Error('Invalid RELAY_MAX_RELAY_SESSIONS');
23
- const debugCommand = process.argv.find(value => ['--debug-list', '--debug-allow', '--debug-deny'].includes(value));
24
- if (debugCommand) {
25
- const database = mysqlConfigFile ? await openRelayMysql(mysqlConfigFile, maxRelaySessions) : null;
26
- const records = (database?.devices || deviceStore(stateFile)).entries();
27
- if (debugCommand === '--debug-list') {
28
- console.log(JSON.stringify(records.map(record => ({
29
- deviceId: record.id, status: record.status, clientCount: record.clients.length,
30
- })), null, 2));
31
- } else {
32
- const index = process.argv.indexOf(debugCommand), deviceId = process.argv[index + 1];
33
- if (!validId(deviceId)) throw new Error('Invalid device ID');
34
- const record = records.find(record => record.id === deviceId && record.status === 'active');
35
- if (!record && debugCommand === '--debug-allow') throw new Error('Active paired device not found');
36
- updateDebugAllowlist(debugAllowlistFile, deviceId, debugCommand === '--debug-allow');
37
- console.log('Debug allowlist updated; restart relay to apply.');
38
- }
39
- if (database) await database.close();
40
- process.exit(0);
41
- }
42
- if (process.argv.includes('--init-state')) { if (mysqlConfigFile) throw new Error('Use migrations for MySQL mode'); deviceStore(stateFile, { initialize: true }); console.log('Device store initialized'); process.exit(0); }
43
- const revokeIndex = process.argv.indexOf('--revoke-host');
44
- if (revokeIndex >= 0) {
45
- // Run only with the service stopped: this is an offline administrator operation.
46
- if (!process.argv.includes('--offline')) throw new Error('Stop the relay service and supply --offline');
47
- const id = process.argv[revokeIndex + 1];
48
- if (!validId(id)) throw new Error('Invalid device ID');
49
- const database = mysqlConfigFile ? await openRelayMysql(mysqlConfigFile, maxRelaySessions) : null;
50
- const store = database?.devices || deviceStore(stateFile), record = store.entries().find(item => item.id === id);
51
- if (!record) throw new Error('Device not found');
52
- await store.save({ ...record, status: 'revoked', clients: [], revision: record.revision + 1, updatedAt: new Date().toISOString() });
53
- if (database) await database.close();
54
- console.log('Computer and phone authorization revoked'); process.exit(0);
55
- }
56
- const relay = await startSelfRelay({ port, hostKey, stateFile, mysqlConfigFile, accountConfigFile, debugAllowlistFile, adminStateFile, maxRelaySessions,
57
- longPairingFile,
58
- androidReleaseConfigFile: process.env.RELAY_ANDROID_RELEASE_CONFIG_FILE,
59
- androidReleaseCredentialFile: process.env.CREDENTIALS_DIRECTORY ? `${process.env.CREDENTIALS_DIRECTORY}/tencent-monitor.json` : undefined,
60
- usageDiagnosticKeyFile: process.env.RELAY_USAGE_DIAGNOSTIC_KEY_FILE,
61
- publicRelayUrl: process.env.RELAY_PUBLIC_URL || serviceEndpoints.relayUrl, appDownloadUrl: process.env.RELAY_APP_DOWNLOAD_URL || serviceEndpoints.installUrl,
62
- log: entry => console.log(JSON.stringify({ time: new Date().toISOString(), ...entry })) });
63
- console.log(JSON.stringify({ service: 'codex-self-relay', listen: relay.url, maxConnections: 128, maxRelaySessions,
64
- maxFrameMiB: 8, encryption: 'TLS must be supplied by reverse proxy; no end-to-end encryption' }));
65
- await new Promise(resolve => { process.once('SIGTERM', resolve); process.once('SIGINT', resolve); });
66
- await relay.close();
1
+ #!/usr/bin/env node
2
+ import fs from 'node:fs';
3
+ import serviceEndpoints from '../shared/service-endpoints.cjs';
4
+ import { deviceStore, validId } from '../src/self-relay/device-store.mjs';
5
+ import { openRelayMysql } from '../src/self-relay/mysql-state.mjs';
6
+ import { startSelfRelay } from '../src/self-relay/server.mjs';
7
+ import { updateDebugAllowlist } from '../src/self-relay/debug-allowlist.mjs';
8
+
9
+ const keyFile = process.env.RELAY_HOST_KEY_FILE;
10
+ if (!keyFile) throw new Error('RELAY_HOST_KEY_FILE is required');
11
+ const hostKey = fs.readFileSync(keyFile, 'utf8').trim();
12
+ const port = Number(process.env.RELAY_PORT || 45850);
13
+ if (!Number.isInteger(port) || port < 1024 || port > 65535) throw new Error('Invalid RELAY_PORT');
14
+ const stateFile = process.env.RELAY_STATE_FILE;
15
+ const mysqlConfigFile = process.env.RELAY_MYSQL_CONFIG_FILE;
16
+ const accountConfigFile = process.env.RELAY_ACCOUNT_CONFIG_FILE;
17
+ const longPairingFile = process.env.RELAY_LONG_PAIRING_FILE || '/var/lib/codex-relay/long-pairing.json';
18
+ if (!stateFile && !mysqlConfigFile) throw new Error('RELAY_STATE_FILE or RELAY_MYSQL_CONFIG_FILE is required');
19
+ const debugAllowlistFile = process.env.RELAY_DEBUG_ALLOWLIST_FILE || '/etc/codex-relay/debug-allowlist.json';
20
+ const adminStateFile = process.env.RELAY_ADMIN_STATE_FILE || '/var/lib/codex-relay/admin.json';
21
+ const maxRelaySessions = Number(process.env.RELAY_MAX_RELAY_SESSIONS || 8);
22
+ if (!Number.isSafeInteger(maxRelaySessions) || maxRelaySessions < 1 || maxRelaySessions > 256) throw new Error('Invalid RELAY_MAX_RELAY_SESSIONS');
23
+ const debugCommand = process.argv.find(value => ['--debug-list', '--debug-allow', '--debug-deny'].includes(value));
24
+ if (debugCommand) {
25
+ const database = mysqlConfigFile ? await openRelayMysql(mysqlConfigFile, maxRelaySessions) : null;
26
+ const records = (database?.devices || deviceStore(stateFile)).entries();
27
+ if (debugCommand === '--debug-list') {
28
+ console.log(JSON.stringify(records.map(record => ({
29
+ deviceId: record.id, status: record.status, clientCount: record.clients.length,
30
+ })), null, 2));
31
+ } else {
32
+ const index = process.argv.indexOf(debugCommand), deviceId = process.argv[index + 1];
33
+ if (!validId(deviceId)) throw new Error('Invalid device ID');
34
+ const record = records.find(record => record.id === deviceId && record.status === 'active');
35
+ if (!record && debugCommand === '--debug-allow') throw new Error('Active paired device not found');
36
+ updateDebugAllowlist(debugAllowlistFile, deviceId, debugCommand === '--debug-allow');
37
+ console.log('Debug allowlist updated; restart relay to apply.');
38
+ }
39
+ if (database) await database.close();
40
+ process.exit(0);
41
+ }
42
+ if (process.argv.includes('--init-state')) { if (mysqlConfigFile) throw new Error('Use migrations for MySQL mode'); deviceStore(stateFile, { initialize: true }); console.log('Device store initialized'); process.exit(0); }
43
+ const revokeIndex = process.argv.indexOf('--revoke-host');
44
+ if (revokeIndex >= 0) {
45
+ // Run only with the service stopped: this is an offline administrator operation.
46
+ if (!process.argv.includes('--offline')) throw new Error('Stop the relay service and supply --offline');
47
+ const id = process.argv[revokeIndex + 1];
48
+ if (!validId(id)) throw new Error('Invalid device ID');
49
+ const database = mysqlConfigFile ? await openRelayMysql(mysqlConfigFile, maxRelaySessions) : null;
50
+ const store = database?.devices || deviceStore(stateFile), record = store.entries().find(item => item.id === id);
51
+ if (!record) throw new Error('Device not found');
52
+ await store.save({ ...record, status: 'revoked', clients: [], revision: record.revision + 1, updatedAt: new Date().toISOString() });
53
+ if (database) await database.close();
54
+ console.log('Computer and phone authorization revoked'); process.exit(0);
55
+ }
56
+ const relay = await startSelfRelay({ port, hostKey, stateFile, mysqlConfigFile, accountConfigFile, debugAllowlistFile, adminStateFile, maxRelaySessions,
57
+ longPairingFile,
58
+ androidReleaseConfigFile: process.env.RELAY_ANDROID_RELEASE_CONFIG_FILE,
59
+ androidReleaseCredentialFile: process.env.CREDENTIALS_DIRECTORY ? `${process.env.CREDENTIALS_DIRECTORY}/tencent-monitor.json` : undefined,
60
+ usageDiagnosticKeyFile: process.env.RELAY_USAGE_DIAGNOSTIC_KEY_FILE,
61
+ publicRelayUrl: process.env.RELAY_PUBLIC_URL || serviceEndpoints.relayUrl, appDownloadUrl: process.env.RELAY_APP_DOWNLOAD_URL || serviceEndpoints.installUrl,
62
+ log: entry => console.log(JSON.stringify({ time: new Date().toISOString(), ...entry })) });
63
+ console.log(JSON.stringify({ service: 'codex-self-relay', listen: relay.url, maxConnections: 128, maxRelaySessions,
64
+ maxFrameMiB: 8, encryption: 'TLS must be supplied by reverse proxy; no end-to-end encryption' }));
65
+ await new Promise(resolve => { process.once('SIGTERM', resolve); process.once('SIGINT', resolve); });
66
+ await relay.close();
@@ -1 +1 @@
1
- {"layout":"npm-platform-packages","version":"0.1.0-beta.30"}
1
+ {"layout":"npm-platform-packages","version":"0.1.0-beta.31"}
@@ -1,40 +1,40 @@
1
- [Console]::OutputEncoding = New-Object System.Text.UTF8Encoding($false)
2
-
3
- $profiles = @{}
4
- Get-NetConnectionProfile -ErrorAction SilentlyContinue | ForEach-Object {
5
- $profiles[[int]$_.InterfaceIndex] = [string]$_.Name
6
- }
7
-
8
- $networks = [System.Net.NetworkInformation.NetworkInterface]::GetAllNetworkInterfaces() |
9
- Where-Object {
10
- $_.OperationalStatus -eq 'Up' -and
11
- $_.NetworkInterfaceType -in @('Wireless80211', 'Ethernet') -and
12
- $_.GetIPProperties().GatewayAddresses.Count -gt 0
13
- } | ForEach-Object {
14
- $adapter = $_
15
- $properties = $adapter.GetIPProperties()
16
- $interfaceIndex = $properties.GetIPv4Properties().Index
17
- $networkType = if ($adapter.NetworkInterfaceType -eq 'Wireless80211') { 'wifi' } else { 'ethernet' }
18
- $networkName = $profiles[$interfaceIndex]
19
- if ($networkType -eq 'wifi') {
20
- $wlan = (& netsh wlan show interfaces interface="$($adapter.Name)" 2>$null) -join "`n"
21
- $ssid = [regex]::Match($wlan, '(?m)^\s*SSID\s*:\s*(.*?)\s*$')
22
- if ($ssid.Success -and -not [string]::IsNullOrWhiteSpace($ssid.Groups[1].Value)) {
23
- $networkName = $ssid.Groups[1].Value.Trim()
24
- }
25
- }
26
- if ([string]::IsNullOrWhiteSpace($networkName)) { $networkName = $adapter.Name }
27
- $properties.UnicastAddresses | Where-Object {
28
- $_.Address.AddressFamily -eq 'InterNetwork' -and
29
- $_.Address.IPAddressToString -match '^(192\.168\.|10\.|172\.(1[6-9]|2[0-9]|3[01])\.|100\.(6[4-9]|[7-9][0-9]|1[01][0-9]|12[0-7])\.)'
30
- } | ForEach-Object {
31
- [PSCustomObject]@{
32
- address = $_.Address.IPAddressToString
33
- networkType = $networkType
34
- networkName = $networkName
35
- interfaceName = [string]$adapter.Name
36
- }
37
- }
38
- }
39
-
40
- ConvertTo-Json -InputObject @($networks) -Compress
1
+ [Console]::OutputEncoding = New-Object System.Text.UTF8Encoding($false)
2
+
3
+ $profiles = @{}
4
+ Get-NetConnectionProfile -ErrorAction SilentlyContinue | ForEach-Object {
5
+ $profiles[[int]$_.InterfaceIndex] = [string]$_.Name
6
+ }
7
+
8
+ $networks = [System.Net.NetworkInformation.NetworkInterface]::GetAllNetworkInterfaces() |
9
+ Where-Object {
10
+ $_.OperationalStatus -eq 'Up' -and
11
+ $_.NetworkInterfaceType -in @('Wireless80211', 'Ethernet') -and
12
+ $_.GetIPProperties().GatewayAddresses.Count -gt 0
13
+ } | ForEach-Object {
14
+ $adapter = $_
15
+ $properties = $adapter.GetIPProperties()
16
+ $interfaceIndex = $properties.GetIPv4Properties().Index
17
+ $networkType = if ($adapter.NetworkInterfaceType -eq 'Wireless80211') { 'wifi' } else { 'ethernet' }
18
+ $networkName = $profiles[$interfaceIndex]
19
+ if ($networkType -eq 'wifi') {
20
+ $wlan = (& netsh wlan show interfaces interface="$($adapter.Name)" 2>$null) -join "`n"
21
+ $ssid = [regex]::Match($wlan, '(?m)^\s*SSID\s*:\s*(.*?)\s*$')
22
+ if ($ssid.Success -and -not [string]::IsNullOrWhiteSpace($ssid.Groups[1].Value)) {
23
+ $networkName = $ssid.Groups[1].Value.Trim()
24
+ }
25
+ }
26
+ if ([string]::IsNullOrWhiteSpace($networkName)) { $networkName = $adapter.Name }
27
+ $properties.UnicastAddresses | Where-Object {
28
+ $_.Address.AddressFamily -eq 'InterNetwork' -and
29
+ $_.Address.IPAddressToString -match '^(192\.168\.|10\.|172\.(1[6-9]|2[0-9]|3[01])\.|100\.(6[4-9]|[7-9][0-9]|1[01][0-9]|12[0-7])\.)'
30
+ } | ForEach-Object {
31
+ [PSCustomObject]@{
32
+ address = $_.Address.IPAddressToString
33
+ networkType = $networkType
34
+ networkName = $networkName
35
+ interfaceName = [string]$adapter.Name
36
+ }
37
+ }
38
+ }
39
+
40
+ ConvertTo-Json -InputObject @($networks) -Compress
@@ -1,6 +1,6 @@
1
- # Detect the Desktop connection, not merely a listening standalone server.
2
- $connections = @(Get-NetTCPConnection -RemotePort 45839 -State Established -ErrorAction SilentlyContinue | Where-Object {
3
- $_.RemoteAddress -eq '127.0.0.1' -and
4
- (Get-Process -Id $_.OwningProcess -ErrorAction SilentlyContinue).ProcessName -eq 'ChatGPT'
5
- })
6
- if ($connections.Count) { 'ws://127.0.0.1:45839' }
1
+ # Detect the Desktop connection, not merely a listening standalone server.
2
+ $connections = @(Get-NetTCPConnection -RemotePort 45839 -State Established -ErrorAction SilentlyContinue | Where-Object {
3
+ $_.RemoteAddress -eq '127.0.0.1' -and
4
+ (Get-Process -Id $_.OwningProcess -ErrorAction SilentlyContinue).ProcessName -eq 'ChatGPT'
5
+ })
6
+ if ($connections.Count) { 'ws://127.0.0.1:45839' }