dsh-cliworker-now 0.0.0-stage → 0.7.7
This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
- package/LICENSE +21 -0
- package/README.en.md +364 -0
- package/README.md +368 -2
- package/cordis.patch.yml +3 -0
- package/lib/account-models.mjs +262 -0
- package/lib/client.js +22139 -0
- package/lib/client.js.map +1 -0
- package/lib/grok-catalog.mjs +145 -0
- package/lib/hermes-native-entry.py +96 -0
- package/lib/hermes-nous-refresh.py +331 -0
- package/lib/index.js +14544 -0
- package/lib/index.js.map +1 -0
- package/lib/native-launch.mjs +234 -0
- package/lib/native-spawn.mjs +32 -0
- package/lib/own-account-lease.mjs +105 -0
- package/lib/pi-installation.mjs +87 -0
- package/lib/pi-login.mjs +80 -0
- package/lib/pi-native-catalog.mjs +417 -0
- package/lib/pi-omp-bridge.mjs +602 -0
- package/lib/pi-omp-environment.mjs +15 -0
- package/lib/pi-omp-refresh.mjs +324 -0
- package/lib/private-launch.mjs +23 -0
- package/lib/terminal-bridge.mjs +18 -0
- package/lib/typert.host.d.ts +3 -0
- package/lib/typert.host.js +1430 -0
- package/lib/typert.remote-client.d.ts +72 -0
- package/lib/typert.remote-client.d.ts.map +1 -0
- package/lib/typert.remote-client.js +1256 -0
- package/lib/types/client/account-query-queue.d.ts +16 -0
- package/lib/types/client/account-query-queue.js +61 -0
- package/lib/types/client/account-query-queue.js.map +1 -0
- package/lib/types/client/account-terminal-css.d.ts +1 -0
- package/lib/types/client/account-terminal-css.js +3 -0
- package/lib/types/client/account-terminal-css.js.map +1 -0
- package/lib/types/client/account-terminal.d.ts +17 -0
- package/lib/types/client/account-terminal.js +525 -0
- package/lib/types/client/account-terminal.js.map +1 -0
- package/lib/types/client/assets/antigravity.png +0 -0
- package/lib/types/client/assets/claude-code.png +0 -0
- package/lib/types/client/assets/cliworker-now-logo.png +0 -0
- package/lib/types/client/assets/codex.png +0 -0
- package/lib/types/client/assets/grok.png +0 -0
- package/lib/types/client/assets/hermes.png +0 -0
- package/lib/types/client/assets/kimi-dark.png +0 -0
- package/lib/types/client/assets/kimi-light.png +0 -0
- package/lib/types/client/assets/mimo-code.png +0 -0
- package/lib/types/client/assets/omp.png +0 -0
- package/lib/types/client/assets/opencode.png +0 -0
- package/lib/types/client/assets/pi.png +0 -0
- package/lib/types/client/assets/zcode.png +0 -0
- package/lib/types/client/composer-keymap.d.ts +18 -0
- package/lib/types/client/composer-keymap.js +49 -0
- package/lib/types/client/composer-keymap.js.map +1 -0
- package/lib/types/client/conversation-timeline.d.ts +6 -0
- package/lib/types/client/conversation-timeline.js +65 -0
- package/lib/types/client/conversation-timeline.js.map +1 -0
- package/lib/types/client/copy-text.d.ts +5 -0
- package/lib/types/client/copy-text.js +45 -0
- package/lib/types/client/copy-text.js.map +1 -0
- package/lib/types/client/icons.d.ts +21 -0
- package/lib/types/client/icons.js +68 -0
- package/lib/types/client/icons.js.map +1 -0
- package/lib/types/client/index.d.ts +3 -0
- package/lib/types/client/index.js +124 -0
- package/lib/types/client/index.js.map +1 -0
- package/lib/types/client/management-styles.d.ts +1 -0
- package/lib/types/client/management-styles.js +17 -0
- package/lib/types/client/management-styles.js.map +1 -0
- package/lib/types/client/name-copy.d.ts +5 -0
- package/lib/types/client/name-copy.js +107 -0
- package/lib/types/client/name-copy.js.map +1 -0
- package/lib/types/client/native-job-overlay.d.ts +11 -0
- package/lib/types/client/native-job-overlay.js +129 -0
- package/lib/types/client/native-job-overlay.js.map +1 -0
- package/lib/types/client/operation-error.d.ts +2 -0
- package/lib/types/client/operation-error.js +12 -0
- package/lib/types/client/operation-error.js.map +1 -0
- package/lib/types/client/panel.d.ts +8 -0
- package/lib/types/client/panel.js +310 -0
- package/lib/types/client/panel.js.map +1 -0
- package/lib/types/client/rename-copy-styles.d.ts +1 -0
- package/lib/types/client/rename-copy-styles.js +21 -0
- package/lib/types/client/rename-copy-styles.js.map +1 -0
- package/lib/types/client/rename-worker.d.ts +9 -0
- package/lib/types/client/rename-worker.js +53 -0
- package/lib/types/client/rename-worker.js.map +1 -0
- package/lib/types/client/role-presets.d.ts +6 -0
- package/lib/types/client/role-presets.js +111 -0
- package/lib/types/client/role-presets.js.map +1 -0
- package/lib/types/client/settings-dialog.d.ts +13 -0
- package/lib/types/client/settings-dialog.js +442 -0
- package/lib/types/client/settings-dialog.js.map +1 -0
- package/lib/types/client/stat-popover.d.ts +10 -0
- package/lib/types/client/stat-popover.js +32 -0
- package/lib/types/client/stat-popover.js.map +1 -0
- package/lib/types/client/styles.d.ts +9 -0
- package/lib/types/client/styles.js +221 -0
- package/lib/types/client/styles.js.map +1 -0
- package/lib/types/client/telemetry.d.ts +11 -0
- package/lib/types/client/telemetry.js +24 -0
- package/lib/types/client/telemetry.js.map +1 -0
- package/lib/types/client/worker-card.d.ts +10 -0
- package/lib/types/client/worker-card.js +75 -0
- package/lib/types/client/worker-card.js.map +1 -0
- package/lib/types/client/worker-model-menu.d.ts +9 -0
- package/lib/types/client/worker-model-menu.js +136 -0
- package/lib/types/client/worker-model-menu.js.map +1 -0
- package/lib/types/client/workers.d.ts +21 -0
- package/lib/types/client/workers.js +59 -0
- package/lib/types/client/workers.js.map +1 -0
- package/lib/types/client/zcode-login-link-provider.d.ts +9 -0
- package/lib/types/client/zcode-login-link-provider.js +105 -0
- package/lib/types/client/zcode-login-link-provider.js.map +1 -0
- package/lib/types/client/zcode-login-link.d.ts +16 -0
- package/lib/types/client/zcode-login-link.js +194 -0
- package/lib/types/client/zcode-login-link.js.map +1 -0
- package/lib/types/host/account-identity.d.ts +16 -0
- package/lib/types/host/account-identity.js +126 -0
- package/lib/types/host/account-identity.js.map +1 -0
- package/lib/types/host/account-login.d.ts +10 -0
- package/lib/types/host/account-login.js +126 -0
- package/lib/types/host/account-login.js.map +1 -0
- package/lib/types/host/account-models.d.mts +21 -0
- package/lib/types/host/account-models.mjs +262 -0
- package/lib/types/host/accounts.d.ts +42 -0
- package/lib/types/host/accounts.js +945 -0
- package/lib/types/host/accounts.js.map +1 -0
- package/lib/types/host/adapters.d.ts +24 -0
- package/lib/types/host/adapters.js +380 -0
- package/lib/types/host/adapters.js.map +1 -0
- package/lib/types/host/agy-context.d.ts +8 -0
- package/lib/types/host/agy-context.js +122 -0
- package/lib/types/host/agy-context.js.map +1 -0
- package/lib/types/host/agy-models.d.ts +5 -0
- package/lib/types/host/agy-models.js +37 -0
- package/lib/types/host/agy-models.js.map +1 -0
- package/lib/types/host/agy-windows-account.d.ts +14 -0
- package/lib/types/host/agy-windows-account.js +104 -0
- package/lib/types/host/agy-windows-account.js.map +1 -0
- package/lib/types/host/authorized-catalog.d.ts +14 -0
- package/lib/types/host/authorized-catalog.js +35 -0
- package/lib/types/host/authorized-catalog.js.map +1 -0
- package/lib/types/host/bridge-protocol.d.ts +15 -0
- package/lib/types/host/bridge-protocol.js +80 -0
- package/lib/types/host/bridge-protocol.js.map +1 -0
- package/lib/types/host/claude-native-oauth.d.ts +17 -0
- package/lib/types/host/claude-native-oauth.js +272 -0
- package/lib/types/host/claude-native-oauth.js.map +1 -0
- package/lib/types/host/claude-own-route.d.ts +33 -0
- package/lib/types/host/claude-own-route.js +250 -0
- package/lib/types/host/claude-own-route.js.map +1 -0
- package/lib/types/host/cli-account-binding.d.ts +33 -0
- package/lib/types/host/cli-account-binding.js +540 -0
- package/lib/types/host/cli-account-binding.js.map +1 -0
- package/lib/types/host/cli-protocol.d.ts +27 -0
- package/lib/types/host/cli-protocol.js +212 -0
- package/lib/types/host/cli-protocol.js.map +1 -0
- package/lib/types/host/codex-account.d.ts +8 -0
- package/lib/types/host/codex-account.js +143 -0
- package/lib/types/host/codex-account.js.map +1 -0
- package/lib/types/host/codex-models.d.ts +6 -0
- package/lib/types/host/codex-models.js +169 -0
- package/lib/types/host/codex-models.js.map +1 -0
- package/lib/types/host/extended-adapters.d.ts +44 -0
- package/lib/types/host/extended-adapters.js +207 -0
- package/lib/types/host/extended-adapters.js.map +1 -0
- package/lib/types/host/first-party-account-context.d.ts +26 -0
- package/lib/types/host/first-party-account-context.js +55 -0
- package/lib/types/host/first-party-account-context.js.map +1 -0
- package/lib/types/host/first-party-models.d.ts +29 -0
- package/lib/types/host/first-party-models.js +459 -0
- package/lib/types/host/first-party-models.js.map +1 -0
- package/lib/types/host/grok-adapter.d.ts +44 -0
- package/lib/types/host/grok-adapter.js +293 -0
- package/lib/types/host/grok-adapter.js.map +1 -0
- package/lib/types/host/grok-models.d.ts +47 -0
- package/lib/types/host/grok-models.js +320 -0
- package/lib/types/host/grok-models.js.map +1 -0
- package/lib/types/host/harness-opencode-accounts.d.ts +17 -0
- package/lib/types/host/harness-opencode-accounts.js +80 -0
- package/lib/types/host/harness-opencode-accounts.js.map +1 -0
- package/lib/types/host/hermes-account-context.d.ts +8 -0
- package/lib/types/host/hermes-account-context.js +99 -0
- package/lib/types/host/hermes-account-context.js.map +1 -0
- package/lib/types/host/hermes-accounts.d.ts +19 -0
- package/lib/types/host/hermes-accounts.js +356 -0
- package/lib/types/host/hermes-accounts.js.map +1 -0
- package/lib/types/host/hermes-adapter.d.ts +93 -0
- package/lib/types/host/hermes-adapter.js +455 -0
- package/lib/types/host/hermes-adapter.js.map +1 -0
- package/lib/types/host/hermes-env.d.ts +4 -0
- package/lib/types/host/hermes-env.js +22 -0
- package/lib/types/host/hermes-env.js.map +1 -0
- package/lib/types/host/hermes-installation.d.ts +10 -0
- package/lib/types/host/hermes-installation.js +181 -0
- package/lib/types/host/hermes-installation.js.map +1 -0
- package/lib/types/host/hermes-models.d.ts +26 -0
- package/lib/types/host/hermes-models.js +328 -0
- package/lib/types/host/hermes-models.js.map +1 -0
- package/lib/types/host/hermes-native-entry.py +96 -0
- package/lib/types/host/hermes-nous-refresh.py +331 -0
- package/lib/types/host/hermes-nous.d.ts +53 -0
- package/lib/types/host/hermes-nous.js +343 -0
- package/lib/types/host/hermes-nous.js.map +1 -0
- package/lib/types/host/hermes-renewal.d.ts +27 -0
- package/lib/types/host/hermes-renewal.js +292 -0
- package/lib/types/host/hermes-renewal.js.map +1 -0
- package/lib/types/host/hermes-suppression.d.ts +7 -0
- package/lib/types/host/hermes-suppression.js +69 -0
- package/lib/types/host/hermes-suppression.js.map +1 -0
- package/lib/types/host/hermes-windows-installation.d.ts +5 -0
- package/lib/types/host/hermes-windows-installation.js +91 -0
- package/lib/types/host/hermes-windows-installation.js.map +1 -0
- package/lib/types/host/index.d.ts +140 -0
- package/lib/types/host/index.js +947 -0
- package/lib/types/host/index.js.map +1 -0
- package/lib/types/host/kimi-accounts.d.ts +17 -0
- package/lib/types/host/kimi-accounts.js +220 -0
- package/lib/types/host/kimi-accounts.js.map +1 -0
- package/lib/types/host/kimi-oauth-models.d.ts +14 -0
- package/lib/types/host/kimi-oauth-models.js +246 -0
- package/lib/types/host/kimi-oauth-models.js.map +1 -0
- package/lib/types/host/managed-agent.d.ts +4 -0
- package/lib/types/host/managed-agent.js +127 -0
- package/lib/types/host/managed-agent.js.map +1 -0
- package/lib/types/host/mimo-configuration.d.ts +22 -0
- package/lib/types/host/mimo-configuration.js +258 -0
- package/lib/types/host/mimo-configuration.js.map +1 -0
- package/lib/types/host/mimo-metadata-cache.d.ts +22 -0
- package/lib/types/host/mimo-metadata-cache.js +121 -0
- package/lib/types/host/mimo-metadata-cache.js.map +1 -0
- package/lib/types/host/native-capability-cache.d.ts +11 -0
- package/lib/types/host/native-capability-cache.js +94 -0
- package/lib/types/host/native-capability-cache.js.map +1 -0
- package/lib/types/host/native-launch.d.mts +2 -0
- package/lib/types/host/native-launch.mjs +234 -0
- package/lib/types/host/native-process.d.ts +5 -0
- package/lib/types/host/native-process.js +41 -0
- package/lib/types/host/native-process.js.map +1 -0
- package/lib/types/host/native-spawn.mjs +32 -0
- package/lib/types/host/opencode-adapter.d.ts +94 -0
- package/lib/types/host/opencode-adapter.js +507 -0
- package/lib/types/host/opencode-adapter.js.map +1 -0
- package/lib/types/host/opencode-native.d.ts +27 -0
- package/lib/types/host/opencode-native.js +403 -0
- package/lib/types/host/opencode-native.js.map +1 -0
- package/lib/types/host/own-account-lease.d.mts +5 -0
- package/lib/types/host/own-account-lease.mjs +105 -0
- package/lib/types/host/pi-installation.d.mts +7 -0
- package/lib/types/host/pi-installation.mjs +87 -0
- package/lib/types/host/pi-omp-accounts.d.ts +28 -0
- package/lib/types/host/pi-omp-accounts.js +175 -0
- package/lib/types/host/pi-omp-accounts.js.map +1 -0
- package/lib/types/host/pi-omp-adapter.d.ts +32 -0
- package/lib/types/host/pi-omp-adapter.js +190 -0
- package/lib/types/host/pi-omp-adapter.js.map +1 -0
- package/lib/types/host/pi-omp-environment.d.mts +1 -0
- package/lib/types/host/pi-omp-environment.mjs +15 -0
- package/lib/types/host/pi-omp-identity.d.ts +2 -0
- package/lib/types/host/pi-omp-identity.js +142 -0
- package/lib/types/host/pi-omp-identity.js.map +1 -0
- package/lib/types/host/pi-omp-logout.d.ts +3 -0
- package/lib/types/host/pi-omp-logout.js +152 -0
- package/lib/types/host/pi-omp-logout.js.map +1 -0
- package/lib/types/host/pi-omp-native.d.ts +71 -0
- package/lib/types/host/pi-omp-native.js +753 -0
- package/lib/types/host/pi-omp-native.js.map +1 -0
- package/lib/types/host/pi-omp-refresh.d.mts +7 -0
- package/lib/types/host/pi-omp-refresh.mjs +324 -0
- package/lib/types/host/private-launch.mjs +23 -0
- package/lib/types/host/process.d.ts +43 -0
- package/lib/types/host/process.js +134 -0
- package/lib/types/host/process.js.map +1 -0
- package/lib/types/host/protocol.d.ts +23 -0
- package/lib/types/host/protocol.js +112 -0
- package/lib/types/host/protocol.js.map +1 -0
- package/lib/types/host/roles.d.ts +34 -0
- package/lib/types/host/roles.js +80 -0
- package/lib/types/host/roles.js.map +1 -0
- package/lib/types/host/routing.d.ts +31 -0
- package/lib/types/host/routing.js +248 -0
- package/lib/types/host/routing.js.map +1 -0
- package/lib/types/host/runtime.d.ts +60 -0
- package/lib/types/host/runtime.js +598 -0
- package/lib/types/host/runtime.js.map +1 -0
- package/lib/types/host/storage.d.ts +48 -0
- package/lib/types/host/storage.js +449 -0
- package/lib/types/host/storage.js.map +1 -0
- package/lib/types/host/telemetry.d.ts +17 -0
- package/lib/types/host/telemetry.js +158 -0
- package/lib/types/host/telemetry.js.map +1 -0
- package/lib/types/host/windows-account-bootstrap.ps1 +44 -0
- package/lib/types/host/windows-account-launch.mjs +47 -0
- package/lib/types/host/windows-account-owner.ps1 +137 -0
- package/lib/types/host/windows-account-stdio.mjs +19 -0
- package/lib/types/host/windows-account-terminal.d.ts +17 -0
- package/lib/types/host/windows-account-terminal.js +208 -0
- package/lib/types/host/windows-account-terminal.js.map +1 -0
- package/lib/types/host/windows-agy-account.ps1 +81 -0
- package/lib/types/host/windows-cli-installation.d.ts +31 -0
- package/lib/types/host/windows-cli-installation.js +157 -0
- package/lib/types/host/windows-cli-installation.js.map +1 -0
- package/lib/types/host/windows-hidden-launch.mjs +49 -0
- package/lib/types/host/windows-hidden-process.d.ts +12 -0
- package/lib/types/host/windows-hidden-process.js +116 -0
- package/lib/types/host/windows-hidden-process.js.map +1 -0
- package/lib/types/host/zcode-account-models.d.ts +16 -0
- package/lib/types/host/zcode-account-models.js +114 -0
- package/lib/types/host/zcode-account-models.js.map +1 -0
- package/lib/types/host/zcode-adapter.d.ts +93 -0
- package/lib/types/host/zcode-adapter.js +808 -0
- package/lib/types/host/zcode-adapter.js.map +1 -0
- package/lib/types/host/zcode-grok-accounts.d.ts +30 -0
- package/lib/types/host/zcode-grok-accounts.js +408 -0
- package/lib/types/host/zcode-grok-accounts.js.map +1 -0
- package/lib/types/shared/accounts.d.ts +47 -0
- package/lib/types/shared/accounts.js +2 -0
- package/lib/types/shared/accounts.js.map +1 -0
- package/lib/types/shared/builtin-presets.d.ts +2 -0
- package/lib/types/shared/builtin-presets.js +231 -0
- package/lib/types/shared/builtin-presets.js.map +1 -0
- package/lib/types/shared/cli-settings.d.ts +5 -0
- package/lib/types/shared/cli-settings.js +2 -0
- package/lib/types/shared/cli-settings.js.map +1 -0
- package/lib/types/shared/model-presentation.d.ts +10 -0
- package/lib/types/shared/model-presentation.js +95 -0
- package/lib/types/shared/model-presentation.js.map +1 -0
- package/lib/types/shared/models.d.ts +7 -0
- package/lib/types/shared/models.js +35 -0
- package/lib/types/shared/models.js.map +1 -0
- package/lib/types/shared/telemetry.d.ts +18 -0
- package/lib/types/shared/telemetry.js +16 -0
- package/lib/types/shared/telemetry.js.map +1 -0
- package/lib/types/shared/types.d.ts +127 -0
- package/lib/types/shared/types.js +147 -0
- package/lib/types/shared/types.js.map +1 -0
- package/lib/windows-account-bootstrap.ps1 +44 -0
- package/lib/windows-account-launch.mjs +47 -0
- package/lib/windows-account-owner.ps1 +137 -0
- package/lib/windows-account-stdio.mjs +19 -0
- package/lib/windows-agy-account.ps1 +81 -0
- package/lib/windows-hidden-launch.mjs +49 -0
- package/lib/zcode-resume.mjs +423 -0
- package/package.json +109 -4
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"windows-account-terminal.js","sourceRoot":"","sources":["../../../src/host/windows-account-terminal.ts"],"names":[],"mappings":"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"}
|
|
@@ -0,0 +1,81 @@
|
|
|
1
|
+
# Read only Antigravity's own native Windows credential. Never emit its blob.
|
|
2
|
+
$ErrorActionPreference = 'Stop'
|
|
3
|
+
[Console]::OutputEncoding = [System.Text.UTF8Encoding]::new($false)
|
|
4
|
+
try {
|
|
5
|
+
Add-Type @'
|
|
6
|
+
using System;
|
|
7
|
+
using System.Runtime.InteropServices;
|
|
8
|
+
using System.Text;
|
|
9
|
+
public static class CwnAgyCredential {
|
|
10
|
+
[StructLayout(LayoutKind.Sequential, CharSet=CharSet.Unicode)] struct Credential {
|
|
11
|
+
public uint Flags, Type;
|
|
12
|
+
public string TargetName, Comment;
|
|
13
|
+
public System.Runtime.InteropServices.ComTypes.FILETIME LastWritten;
|
|
14
|
+
public uint CredentialBlobSize;
|
|
15
|
+
public IntPtr CredentialBlob;
|
|
16
|
+
public uint Persist, AttributeCount;
|
|
17
|
+
public IntPtr Attributes;
|
|
18
|
+
public string TargetAlias, UserName;
|
|
19
|
+
}
|
|
20
|
+
[DllImport("advapi32.dll", CharSet=CharSet.Unicode, SetLastError=true)]
|
|
21
|
+
static extern bool CredRead(string target, uint type, uint flags, out IntPtr value);
|
|
22
|
+
[DllImport("advapi32.dll")] static extern void CredFree(IntPtr value);
|
|
23
|
+
public static string Read() {
|
|
24
|
+
IntPtr value;
|
|
25
|
+
if (!CredRead("gemini:antigravity", 1, 0, out value)) {
|
|
26
|
+
if (Marshal.GetLastWin32Error() == 1168) return null;
|
|
27
|
+
throw new Exception("Credential store unavailable");
|
|
28
|
+
}
|
|
29
|
+
byte[] bytes = null;
|
|
30
|
+
try {
|
|
31
|
+
var credential = (Credential)Marshal.PtrToStructure(value, typeof(Credential));
|
|
32
|
+
if (credential.CredentialBlobSize > 65536) throw new Exception("Invalid credential");
|
|
33
|
+
bytes = new byte[credential.CredentialBlobSize];
|
|
34
|
+
Marshal.Copy(credential.CredentialBlob, bytes, 0, bytes.Length);
|
|
35
|
+
return bytes.Length > 1 && bytes[1] == 0
|
|
36
|
+
? new UnicodeEncoding(false, false, true).GetString(bytes)
|
|
37
|
+
: new UTF8Encoding(false, true).GetString(bytes);
|
|
38
|
+
} finally {
|
|
39
|
+
if (bytes != null) Array.Clear(bytes, 0, bytes.Length);
|
|
40
|
+
CredFree(value);
|
|
41
|
+
}
|
|
42
|
+
}
|
|
43
|
+
}
|
|
44
|
+
'@
|
|
45
|
+
$raw = [CwnAgyCredential]::Read()
|
|
46
|
+
if ($null -eq $raw) { @{ state = 'unconfigured' } | ConvertTo-Json -Compress; exit 0 }
|
|
47
|
+
$account = $raw | ConvertFrom-Json
|
|
48
|
+
$raw = $null
|
|
49
|
+
if ($account.auth_method -ne 'consumer' -or -not $account.token) {
|
|
50
|
+
@{ state = 'unknown' } | ConvertTo-Json -Compress; exit 0
|
|
51
|
+
}
|
|
52
|
+
$active = $false
|
|
53
|
+
if ($account.token.access_token -is [string] -and $account.token.access_token.Trim()) {
|
|
54
|
+
try { $active = [DateTimeOffset]::Parse($account.token.expiry) -gt [DateTimeOffset]::UtcNow } catch {}
|
|
55
|
+
}
|
|
56
|
+
$refreshable = $account.token.refresh_token -is [string] -and $account.token.refresh_token.Trim().Length -gt 0
|
|
57
|
+
if (-not $active -and -not $refreshable) {
|
|
58
|
+
@{ state = 'unauthenticated' } | ConvertTo-Json -Compress; exit 0
|
|
59
|
+
}
|
|
60
|
+
$result = @{ state = 'authenticated' }
|
|
61
|
+
if ($account.id_token -is [string] -and $account.id_token.Length -le 32768 -and $account.id_token -match '^[A-Za-z0-9_-]+\.[A-Za-z0-9_-]+\.[A-Za-z0-9_-]+$') {
|
|
62
|
+
$encoded = $account.id_token.Split('.')[1].Replace('-','+').Replace('_','/')
|
|
63
|
+
$encoded = $encoded.PadRight($encoded.Length + ((4 - $encoded.Length % 4) % 4), '=')
|
|
64
|
+
$bytes = [Convert]::FromBase64String($encoded)
|
|
65
|
+
try { $claims = [Text.Encoding]::UTF8.GetString($bytes) | ConvertFrom-Json }
|
|
66
|
+
finally { [Array]::Clear($bytes, 0, $bytes.Length) }
|
|
67
|
+
if ($claims.iss -in @('accounts.google.com', 'https://accounts.google.com') -and $claims.sub -is [string] -and $claims.sub -match '^[A-Za-z0-9_-]{6,128}$') {
|
|
68
|
+
$hash = [Security.Cryptography.SHA256]::Create()
|
|
69
|
+
$principal = [Text.Encoding]::UTF8.GetBytes('google:' + $claims.sub)
|
|
70
|
+
try { $result.principalHash = ([BitConverter]::ToString($hash.ComputeHash($principal))).Replace('-','').ToLowerInvariant() }
|
|
71
|
+
finally { [Array]::Clear($principal, 0, $principal.Length); $hash.Dispose() }
|
|
72
|
+
if ($claims.email -is [string] -and $claims.email.Length -le 254 -and $claims.email -match '^[^\s<>@]+@[^\s<>@]+\.[^\s<>@]+$') { $result.email = $claims.email }
|
|
73
|
+
}
|
|
74
|
+
}
|
|
75
|
+
$account = $null; $claims = $null
|
|
76
|
+
$result | ConvertTo-Json -Compress
|
|
77
|
+
} catch {
|
|
78
|
+
# Neither exception strings nor credential fragments cross the process boundary.
|
|
79
|
+
@{ state = 'unavailable' } | ConvertTo-Json -Compress
|
|
80
|
+
exit 1
|
|
81
|
+
}
|
|
@@ -0,0 +1,31 @@
|
|
|
1
|
+
export declare class WindowsCliInstallationError extends Error {
|
|
2
|
+
readonly installed: boolean;
|
|
3
|
+
readonly code = "CLI_INSTALLATION_UNAVAILABLE";
|
|
4
|
+
constructor(message: string, installed?: boolean);
|
|
5
|
+
}
|
|
6
|
+
type WindowsEnvironment = {
|
|
7
|
+
home?: string;
|
|
8
|
+
env?: NodeJS.ProcessEnv;
|
|
9
|
+
};
|
|
10
|
+
/** Fixed installer locations only; never scan arbitrary drives or select a venv by recency. */
|
|
11
|
+
export declare function windowsCliCandidates(cli: 'codex' | 'hermes', options?: WindowsEnvironment): string[];
|
|
12
|
+
/** A residue is not a runnable installation and is not evidence of an account. */
|
|
13
|
+
export declare function hasWindowsHermesInstallDirectory(options?: WindowsEnvironment): boolean;
|
|
14
|
+
/** Validate an automatically discovered npm shim against Codex's own package, not just its name. */
|
|
15
|
+
export declare function validateWindowsCodexNpmEntry(path: string): string;
|
|
16
|
+
export declare function presentWindowsCliCandidate(cli: 'codex' | 'hermes', options?: WindowsEnvironment): string | undefined;
|
|
17
|
+
/** Query current-user registered packages, never guess the newest WindowsApps directory. */
|
|
18
|
+
export declare const CODEX_APPX_QUERY = "$ErrorActionPreference='Stop'; [Console]::OutputEncoding=[Text.UTF8Encoding]::new($false); $p=@(Get-AppxPackage -Name 'OpenAI.Codex'); if($p.Count -eq 0){'null';exit 0}; if($p.Count -ne 1){throw 'Ambiguous Codex package'}; $v=$p[0]; [ordered]@{name=$v.Name;family=$v.PackageFamilyName;fullName=$v.PackageFullName;publisher=$v.Publisher;signature=[string]$v.SignatureKind;status=[string]$v.Status;location=$v.InstallLocation}|ConvertTo-Json -Compress";
|
|
19
|
+
export interface CodexAppxRecord {
|
|
20
|
+
name: string;
|
|
21
|
+
family: string;
|
|
22
|
+
fullName: string;
|
|
23
|
+
publisher: string;
|
|
24
|
+
signature: string;
|
|
25
|
+
status: string;
|
|
26
|
+
location: string;
|
|
27
|
+
}
|
|
28
|
+
/** Exported separately for synthetic identity/relocation tests; no process or account access. */
|
|
29
|
+
export declare function codexAppxExecutable(raw: string, validateFile?: (path: string) => string): string | undefined;
|
|
30
|
+
export declare function findWindowsCodexAppx(capture: (argv: string[], cwd: string) => Promise<string>, signal: AbortSignal, env?: NodeJS.ProcessEnv): Promise<string | undefined>;
|
|
31
|
+
export {};
|
|
@@ -0,0 +1,157 @@
|
|
|
1
|
+
import { closeSync, existsSync, fstatSync, lstatSync, openSync, readFileSync, readSync, realpathSync, statSync, } from 'node:fs';
|
|
2
|
+
import { homedir } from 'node:os';
|
|
3
|
+
import { dirname, isAbsolute, join, resolve, win32 } from 'node:path';
|
|
4
|
+
import { resolveNativeEntry } from './native-launch.mjs';
|
|
5
|
+
export class WindowsCliInstallationError extends Error {
|
|
6
|
+
installed;
|
|
7
|
+
code = 'CLI_INSTALLATION_UNAVAILABLE';
|
|
8
|
+
constructor(message, installed = false) {
|
|
9
|
+
super(message);
|
|
10
|
+
this.installed = installed;
|
|
11
|
+
this.name = 'WindowsCliInstallationError';
|
|
12
|
+
}
|
|
13
|
+
}
|
|
14
|
+
const unavailableCodex = () => new WindowsCliInstallationError('Codex Windows 应用包入口无法确认,请检查安装', true);
|
|
15
|
+
function directory(env, name, fallback) {
|
|
16
|
+
const value = env[name]?.trim() || fallback;
|
|
17
|
+
if (!isAbsolute(value))
|
|
18
|
+
throw new WindowsCliInstallationError('Windows CLI 安装目录配置无效');
|
|
19
|
+
return value;
|
|
20
|
+
}
|
|
21
|
+
/** Fixed installer locations only; never scan arbitrary drives or select a venv by recency. */
|
|
22
|
+
export function windowsCliCandidates(cli, options = {}) {
|
|
23
|
+
const env = options.env ?? process.env, home = options.home ?? homedir();
|
|
24
|
+
if (cli === 'codex') {
|
|
25
|
+
const npm = join(directory(env, 'APPDATA', join(home, 'AppData', 'Roaming')), 'npm');
|
|
26
|
+
return [join(npm, 'codex.cmd')];
|
|
27
|
+
}
|
|
28
|
+
const root = join(directory(env, 'LOCALAPPDATA', join(home, 'AppData', 'Local')), 'hermes');
|
|
29
|
+
return [
|
|
30
|
+
join(root, 'bin', 'hermes.exe'),
|
|
31
|
+
join(root, 'bin', 'hermes.cmd'),
|
|
32
|
+
join(root, 'hermes-agent', 'venv', 'Scripts', 'hermes.exe'),
|
|
33
|
+
];
|
|
34
|
+
}
|
|
35
|
+
/** A residue is not a runnable installation and is not evidence of an account. */
|
|
36
|
+
export function hasWindowsHermesInstallDirectory(options = {}) {
|
|
37
|
+
const env = options.env ?? process.env, home = options.home ?? homedir();
|
|
38
|
+
return existsSync(join(directory(env, 'LOCALAPPDATA', join(home, 'AppData', 'Local')), 'hermes'));
|
|
39
|
+
}
|
|
40
|
+
function nativePe(path) {
|
|
41
|
+
const canonical = realpathSync(path), fd = openSync(canonical, 'r');
|
|
42
|
+
try {
|
|
43
|
+
const info = fstatSync(fd), head = Buffer.alloc(64), signature = Buffer.alloc(4);
|
|
44
|
+
if (!info.isFile() || readSync(fd, head, 0, 64, 0) !== 64 || head.toString('ascii', 0, 2) !== 'MZ')
|
|
45
|
+
throw new Error('Not a native PE file');
|
|
46
|
+
const offset = head.readUInt32LE(0x3c);
|
|
47
|
+
if (offset < 64 ||
|
|
48
|
+
offset + 4 > info.size ||
|
|
49
|
+
readSync(fd, signature, 0, 4, offset) !== 4 ||
|
|
50
|
+
signature.toString('hex') !== '50450000')
|
|
51
|
+
throw new Error('Invalid PE signature');
|
|
52
|
+
return canonical;
|
|
53
|
+
}
|
|
54
|
+
finally {
|
|
55
|
+
closeSync(fd);
|
|
56
|
+
}
|
|
57
|
+
}
|
|
58
|
+
/** Validate an automatically discovered npm shim against Codex's own package, not just its name. */
|
|
59
|
+
export function validateWindowsCodexNpmEntry(path) {
|
|
60
|
+
try {
|
|
61
|
+
const root = join(dirname(path), 'node_modules', '@openai', 'codex');
|
|
62
|
+
const manifestPath = join(root, 'package.json');
|
|
63
|
+
if (statSync(manifestPath).size > 128 * 1024)
|
|
64
|
+
throw new Error('Oversized package metadata');
|
|
65
|
+
const data = JSON.parse(readFileSync(manifestPath, 'utf8'));
|
|
66
|
+
const bin = typeof data.bin === 'string' ? data.bin : data.bin?.codex;
|
|
67
|
+
if (data.name !== '@openai/codex' ||
|
|
68
|
+
typeof bin !== 'string' ||
|
|
69
|
+
isAbsolute(bin) ||
|
|
70
|
+
bin.split(/[\\/]/).includes('..'))
|
|
71
|
+
throw new Error('Mismatched package identity');
|
|
72
|
+
const entry = resolveNativeEntry(path, 'win32');
|
|
73
|
+
if (realpathSync(entry) !== realpathSync(resolve(root, bin)))
|
|
74
|
+
throw new Error('Mismatched package entry');
|
|
75
|
+
return path;
|
|
76
|
+
}
|
|
77
|
+
catch {
|
|
78
|
+
throw new WindowsCliInstallationError('Codex npm 安装入口无法确认,请检查安装', true);
|
|
79
|
+
}
|
|
80
|
+
}
|
|
81
|
+
export function presentWindowsCliCandidate(cli, options = {}) {
|
|
82
|
+
for (const path of windowsCliCandidates(cli, options)) {
|
|
83
|
+
try {
|
|
84
|
+
lstatSync(path);
|
|
85
|
+
}
|
|
86
|
+
catch (error) {
|
|
87
|
+
if (['ENOENT', 'ENOTDIR'].includes(error.code ?? ''))
|
|
88
|
+
continue;
|
|
89
|
+
throw new WindowsCliInstallationError('Windows CLI 安装入口无法读取,请检查安装', true);
|
|
90
|
+
}
|
|
91
|
+
if (cli === 'codex')
|
|
92
|
+
return validateWindowsCodexNpmEntry(path);
|
|
93
|
+
try {
|
|
94
|
+
const entry = resolveNativeEntry(path, 'win32');
|
|
95
|
+
if (/\.exe$/i.test(entry))
|
|
96
|
+
nativePe(entry);
|
|
97
|
+
else if (entry !== path || !/\.cmd$/i.test(entry))
|
|
98
|
+
throw new Error('Unsupported Hermes entry');
|
|
99
|
+
// Fixed Python cmd launchers are statically checked by resolveNativeEntry;
|
|
100
|
+
// the existing Hermes verifier preserves the installer's own interpreter.
|
|
101
|
+
return path;
|
|
102
|
+
}
|
|
103
|
+
catch {
|
|
104
|
+
throw new WindowsCliInstallationError('Hermes Windows 安装入口无法确认,请检查安装', true);
|
|
105
|
+
}
|
|
106
|
+
}
|
|
107
|
+
return undefined;
|
|
108
|
+
}
|
|
109
|
+
const codexFamily = 'OpenAI.Codex_2p2nqsd0c76g0';
|
|
110
|
+
const codexPublisher = 'CN=50BDFD77-8903-4850-9FFE-6E8522F64D5B';
|
|
111
|
+
/** Query current-user registered packages, never guess the newest WindowsApps directory. */
|
|
112
|
+
export const CODEX_APPX_QUERY = `$ErrorActionPreference='Stop'; [Console]::OutputEncoding=[Text.UTF8Encoding]::new($false); $p=@(Get-AppxPackage -Name 'OpenAI.Codex'); if($p.Count -eq 0){'null';exit 0}; if($p.Count -ne 1){throw 'Ambiguous Codex package'}; $v=$p[0]; [ordered]@{name=$v.Name;family=$v.PackageFamilyName;fullName=$v.PackageFullName;publisher=$v.Publisher;signature=[string]$v.SignatureKind;status=[string]$v.Status;location=$v.InstallLocation}|ConvertTo-Json -Compress`;
|
|
113
|
+
/** Exported separately for synthetic identity/relocation tests; no process or account access. */
|
|
114
|
+
export function codexAppxExecutable(raw, validateFile = nativePe) {
|
|
115
|
+
try {
|
|
116
|
+
const value = JSON.parse(raw.trim());
|
|
117
|
+
if (value === null)
|
|
118
|
+
return undefined;
|
|
119
|
+
if (!value || typeof value !== 'object' || Array.isArray(value))
|
|
120
|
+
throw new Error('Invalid package record');
|
|
121
|
+
const p = value;
|
|
122
|
+
if (p.name !== 'OpenAI.Codex' ||
|
|
123
|
+
p.family !== codexFamily ||
|
|
124
|
+
p.publisher !== codexPublisher ||
|
|
125
|
+
p.signature !== 'Store' ||
|
|
126
|
+
p.status !== 'Ok' ||
|
|
127
|
+
typeof p.fullName !== 'string' ||
|
|
128
|
+
!/^OpenAI\.Codex_\d+(?:\.\d+){3}_(?:x64|arm64|x86)__2p2nqsd0c76g0$/.test(p.fullName) ||
|
|
129
|
+
typeof p.location !== 'string' ||
|
|
130
|
+
!win32.isAbsolute(p.location) ||
|
|
131
|
+
p.location.includes('\0') ||
|
|
132
|
+
p.location.startsWith('\\\\') ||
|
|
133
|
+
win32.basename(p.location).toLowerCase() !== p.fullName.toLowerCase())
|
|
134
|
+
throw new Error('Unverified package identity');
|
|
135
|
+
const candidate = win32.join(p.location, 'app', 'resources', 'codex.exe');
|
|
136
|
+
const canonical = validateFile(candidate);
|
|
137
|
+
// A registered package's CLI must stay in that package; never follow a swapped link elsewhere.
|
|
138
|
+
if (win32.normalize(canonical).toLowerCase() !== win32.normalize(candidate).toLowerCase())
|
|
139
|
+
throw new Error('Redirected package entry');
|
|
140
|
+
return canonical;
|
|
141
|
+
}
|
|
142
|
+
catch {
|
|
143
|
+
throw unavailableCodex();
|
|
144
|
+
}
|
|
145
|
+
}
|
|
146
|
+
export async function findWindowsCodexAppx(capture, signal, env = process.env) {
|
|
147
|
+
signal.throwIfAborted();
|
|
148
|
+
const windows = env.SystemRoot || env.WINDIR || 'C:\\Windows';
|
|
149
|
+
if (!win32.isAbsolute(windows))
|
|
150
|
+
throw new WindowsCliInstallationError('Windows 系统目录配置无效');
|
|
151
|
+
const command = win32.join(windows, 'System32', 'WindowsPowerShell', 'v1.0', 'powershell.exe');
|
|
152
|
+
const encoded = Buffer.from(CODEX_APPX_QUERY, 'utf16le').toString('base64');
|
|
153
|
+
const raw = await capture([command, '-NoLogo', '-NoProfile', '-NonInteractive', '-EncodedCommand', encoded], homedir());
|
|
154
|
+
signal.throwIfAborted();
|
|
155
|
+
return codexAppxExecutable(raw);
|
|
156
|
+
}
|
|
157
|
+
//# sourceMappingURL=windows-cli-installation.js.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"windows-cli-installation.js","sourceRoot":"","sources":["../../../src/host/windows-cli-installation.ts"],"names":[],"mappings":"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"}
|
|
@@ -0,0 +1,49 @@
|
|
|
1
|
+
// A GUI-subsystem Electron root avoids Windows Terminal's console delegation.
|
|
2
|
+
// The enclosing Harness Job still owns this root and every native descendant.
|
|
3
|
+
import { Socket } from 'node:net'
|
|
4
|
+
import { forwardNativeStdio, spawnNativeProcess } from './native-spawn.mjs'
|
|
5
|
+
|
|
6
|
+
// Pinned Harness 0.2.0-rc.2 public control contract. This helper must remain
|
|
7
|
+
// self-contained: an ordinary child does not use the Host's SDK module loader.
|
|
8
|
+
const marker = process.env.DSH_SUBPROCESS_CONTROL
|
|
9
|
+
delete process.env.DSH_SUBPROCESS_CONTROL
|
|
10
|
+
if (marker !== 'pipe') throw new Error('Windows background control channel is unavailable')
|
|
11
|
+
const control = new Socket({ fd: 7, readable: true, writable: true, allowHalfOpen: true })
|
|
12
|
+
let child, sent = false
|
|
13
|
+
function receipt(value) {
|
|
14
|
+
if (sent) return
|
|
15
|
+
sent = true
|
|
16
|
+
control.end(JSON.stringify(value) + '\n', () => control.destroy())
|
|
17
|
+
}
|
|
18
|
+
control.on('error', () => {
|
|
19
|
+
child?.kill('SIGTERM')
|
|
20
|
+
process.exitCode = 1
|
|
21
|
+
})
|
|
22
|
+
try {
|
|
23
|
+
const [encoded, executable, ...argv] = process.argv.slice(2)
|
|
24
|
+
const restore = JSON.parse(encoded)
|
|
25
|
+
if (!restore || !Object.hasOwn(restore, 'nodeEnv') ||
|
|
26
|
+
(restore.nodeEnv !== null && typeof restore.nodeEnv !== 'string') || !executable)
|
|
27
|
+
throw new Error('Invalid fixed bootstrap arguments')
|
|
28
|
+
if (restore.privateUmask === true) process.umask(0o077)
|
|
29
|
+
// ELECTRON_RUN_AS_NODE belongs only to this GUI bootstrap. Preserve the
|
|
30
|
+
// original target environment, including an explicit deletion of that value.
|
|
31
|
+
const env = { ...process.env }
|
|
32
|
+
for (const key of Object.keys(env))
|
|
33
|
+
if (key.toUpperCase() === 'ELECTRON_RUN_AS_NODE') delete env[key]
|
|
34
|
+
if (restore.nodeEnv !== null) env.ELECTRON_RUN_AS_NODE = restore.nodeEnv
|
|
35
|
+
child = spawnNativeProcess(executable, argv, { env, stdio: ['pipe', 'pipe', 'pipe'], detached: false })
|
|
36
|
+
forwardNativeStdio(child)
|
|
37
|
+
child.once('error', error => receipt({
|
|
38
|
+
kind: 'spawn-error',
|
|
39
|
+
code: ['ENOENT', 'EACCES', 'ENOEXEC', 'EINVAL'].includes(error.code) ? error.code : 'UNKNOWN',
|
|
40
|
+
}))
|
|
41
|
+
// A descendant may keep these pipes open after the native parent exits.
|
|
42
|
+
// Report its actual exit now; keep forwarding bytes until the pipes close.
|
|
43
|
+
// The Host's original Job remains responsible for the entire process range.
|
|
44
|
+
child.once('exit', (exitCode, signal) => receipt({ kind: 'exit', exitCode, signal }))
|
|
45
|
+
for (const signal of ['SIGTERM', 'SIGINT'])
|
|
46
|
+
process.on(signal, () => child.kill(signal))
|
|
47
|
+
} catch {
|
|
48
|
+
receipt({ kind: 'spawn-error', code: 'UNKNOWN' })
|
|
49
|
+
}
|
|
@@ -0,0 +1,12 @@
|
|
|
1
|
+
import type { SubprocessHandle, SubprocessSpawnSpec } from '@deepseek-ai/dsh-subprocess';
|
|
2
|
+
import type { ProcessBackend } from './process.ts';
|
|
3
|
+
export declare const isCurrentWindowsRuntime: (value: string) => boolean;
|
|
4
|
+
/** Only console-subsystem targets need a GUI bootstrap. Existing Node helpers
|
|
5
|
+
* already use Electron's GUI executable; terminal allocation stays untouched. */
|
|
6
|
+
export declare function needsWindowsHiddenLaunch(argv: readonly string[], platform: NodeJS.Platform, electron: boolean): boolean;
|
|
7
|
+
/** Window presentation only: all byte streams, collection and process-range
|
|
8
|
+
* ownership remain the SDK's. Native exit facts travel over a private channel,
|
|
9
|
+
* never stdout/stderr and never the native CLI's credential/session protocol. */
|
|
10
|
+
export declare function spawnWindowsHidden(backend: ProcessBackend, spec: SubprocessSpawnSpec, options?: {
|
|
11
|
+
privateUmask?: true;
|
|
12
|
+
}): SubprocessHandle;
|
|
@@ -0,0 +1,116 @@
|
|
|
1
|
+
import { win32 } from 'node:path';
|
|
2
|
+
import { fileURLToPath } from 'node:url';
|
|
3
|
+
const failure = () => new Error('Windows 后台 CLI 启动回执异常');
|
|
4
|
+
const bootstrap = fileURLToPath(new URL('./windows-hidden-launch.mjs', import.meta.url));
|
|
5
|
+
export const isCurrentWindowsRuntime = (value) => win32.normalize(value).toLowerCase() === win32.normalize(process.execPath).toLowerCase();
|
|
6
|
+
/** Only console-subsystem targets need a GUI bootstrap. Existing Node helpers
|
|
7
|
+
* already use Electron's GUI executable; terminal allocation stays untouched. */
|
|
8
|
+
export function needsWindowsHiddenLaunch(argv, platform, electron) {
|
|
9
|
+
return platform === 'win32' && electron && !isCurrentWindowsRuntime(argv[0]);
|
|
10
|
+
}
|
|
11
|
+
function nodeEnvironment(env) {
|
|
12
|
+
let value;
|
|
13
|
+
for (const [key, entry] of Object.entries(process.env))
|
|
14
|
+
if (key.toUpperCase() === 'ELECTRON_RUN_AS_NODE')
|
|
15
|
+
value = entry;
|
|
16
|
+
for (const [key, entry] of Object.entries(env ?? {}))
|
|
17
|
+
if (key.toUpperCase() === 'ELECTRON_RUN_AS_NODE')
|
|
18
|
+
value = entry;
|
|
19
|
+
return value ?? null;
|
|
20
|
+
}
|
|
21
|
+
/** Window presentation only: all byte streams, collection and process-range
|
|
22
|
+
* ownership remain the SDK's. Native exit facts travel over a private channel,
|
|
23
|
+
* never stdout/stderr and never the native CLI's credential/session protocol. */
|
|
24
|
+
export function spawnWindowsHidden(backend, spec, options = {}) {
|
|
25
|
+
// Current plugin calls do not use this channel. Never silently take a future
|
|
26
|
+
// consumer's control protocol or downgrade to an unhidden spawn.
|
|
27
|
+
if (spec.stdio.control)
|
|
28
|
+
throw new Error('Windows 后台 CLI 启动不能复用已占用的控制通道');
|
|
29
|
+
const inner = backend.spawn({
|
|
30
|
+
...spec,
|
|
31
|
+
argv: [process.execPath, bootstrap, JSON.stringify({ nodeEnv: nodeEnvironment(spec.env), ...options }), ...spec.argv],
|
|
32
|
+
env: { ...spec.env, ELECTRON_RUN_AS_NODE: '1' },
|
|
33
|
+
stdio: { ...spec.stdio, control: 'pipe' },
|
|
34
|
+
});
|
|
35
|
+
let cancelled = false, bytes = 0, raw = '', invalid = false;
|
|
36
|
+
const channel = inner.control;
|
|
37
|
+
if (!channel)
|
|
38
|
+
inner.terminate();
|
|
39
|
+
// Attach readers immediately so a fast metadata process cannot fill a pipe.
|
|
40
|
+
const reading = channel ? new Promise((resolve) => {
|
|
41
|
+
channel.on('data', (chunk) => {
|
|
42
|
+
bytes += Buffer.byteLength(chunk);
|
|
43
|
+
if (bytes > 1024) {
|
|
44
|
+
invalid = true;
|
|
45
|
+
channel.destroy();
|
|
46
|
+
inner.terminate();
|
|
47
|
+
}
|
|
48
|
+
else
|
|
49
|
+
raw += String(chunk);
|
|
50
|
+
});
|
|
51
|
+
channel.once('error', () => { invalid = true; inner.terminate(); resolve(); });
|
|
52
|
+
channel.once('end', resolve);
|
|
53
|
+
channel.once('close', resolve);
|
|
54
|
+
}) : Promise.resolve();
|
|
55
|
+
// A native parent can exit while its descendants retain stdout/stderr. The
|
|
56
|
+
// GUI relay must remain alive to forward those bytes, so its exit cannot be
|
|
57
|
+
// used as the native process's completion signal. Keep range exit on the SDK.
|
|
58
|
+
const outerDone = inner.done.then(async (outer) => {
|
|
59
|
+
let timer;
|
|
60
|
+
try {
|
|
61
|
+
await Promise.race([reading, new Promise((_, reject) => {
|
|
62
|
+
timer = setTimeout(() => reject(failure()), 1000);
|
|
63
|
+
})]);
|
|
64
|
+
}
|
|
65
|
+
finally {
|
|
66
|
+
clearTimeout(timer);
|
|
67
|
+
}
|
|
68
|
+
return outer;
|
|
69
|
+
});
|
|
70
|
+
void outerDone.catch(() => inner.terminate());
|
|
71
|
+
const done = (async () => {
|
|
72
|
+
try {
|
|
73
|
+
if (!channel) {
|
|
74
|
+
await inner.done;
|
|
75
|
+
throw failure();
|
|
76
|
+
}
|
|
77
|
+
const outer = await Promise.race([reading.then(() => undefined), outerDone]);
|
|
78
|
+
if (cancelled || spec.signal?.aborted)
|
|
79
|
+
return await inner.done;
|
|
80
|
+
if (invalid || (outer && (outer.exitCode !== 0 || outer.signal)))
|
|
81
|
+
throw failure();
|
|
82
|
+
const value = JSON.parse(raw);
|
|
83
|
+
if (!value || typeof value !== 'object' || Array.isArray(value))
|
|
84
|
+
throw failure();
|
|
85
|
+
if (value.kind === 'spawn-error' && ['ENOENT', 'EACCES', 'ENOEXEC', 'EINVAL', 'UNKNOWN'].includes(value.code))
|
|
86
|
+
throw Object.assign(new Error('Windows 后台 CLI 无法启动'), { code: value.code });
|
|
87
|
+
if (value.kind !== 'exit' ||
|
|
88
|
+
!(value.exitCode === null || (Number.isInteger(value.exitCode) && value.exitCode >= -2147483648 && value.exitCode <= 4294967295)) ||
|
|
89
|
+
!(value.signal === null || (typeof value.signal === 'string' && /^SIG[A-Z0-9]+$/.test(value.signal))) ||
|
|
90
|
+
(value.exitCode === null) === (value.signal === null))
|
|
91
|
+
throw failure();
|
|
92
|
+
return { exitCode: value.exitCode, signal: value.signal };
|
|
93
|
+
}
|
|
94
|
+
catch (error) {
|
|
95
|
+
inner.terminate();
|
|
96
|
+
if (error instanceof SyntaxError)
|
|
97
|
+
throw failure();
|
|
98
|
+
throw error;
|
|
99
|
+
}
|
|
100
|
+
finally {
|
|
101
|
+
channel?.destroy();
|
|
102
|
+
}
|
|
103
|
+
})();
|
|
104
|
+
void done.catch(() => undefined);
|
|
105
|
+
return {
|
|
106
|
+
stdin: inner.stdin,
|
|
107
|
+
stdout: inner.stdout,
|
|
108
|
+
stderr: inner.stderr,
|
|
109
|
+
collected: inner.collected,
|
|
110
|
+
control: undefined,
|
|
111
|
+
done,
|
|
112
|
+
terminate: () => { cancelled = true; channel?.destroy(); inner.terminate(); },
|
|
113
|
+
waitForExit: (signal) => inner.waitForExit(signal),
|
|
114
|
+
};
|
|
115
|
+
}
|
|
116
|
+
//# sourceMappingURL=windows-hidden-process.js.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"windows-hidden-process.js","sourceRoot":"","sources":["../../../src/host/windows-hidden-process.ts"],"names":[],"mappings":"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"}
|
|
@@ -0,0 +1,16 @@
|
|
|
1
|
+
/** Native standalone-account-provider-runtime.js identity binding (ZCode 0.16.9).
|
|
2
|
+
* Keys remain in the Host and are used only for the corresponding native route.
|
|
3
|
+
* OAuth access/refresh tokens and old identities are deliberately not fallbacks.
|
|
4
|
+
*/
|
|
5
|
+
export declare function readZCodeAccountBindings(authDirectory: string, providerIds: string[], options?: {
|
|
6
|
+
signal?: AbortSignal;
|
|
7
|
+
credentialSecret?: string;
|
|
8
|
+
}): Promise<Map<string, {
|
|
9
|
+
identity: string;
|
|
10
|
+
key: string;
|
|
11
|
+
}>>;
|
|
12
|
+
/** Key-only view retained for account-scoped metadata queries. */
|
|
13
|
+
export declare function readZCodeAccountApiKeys(authDirectory: string, providerIds: string[], options?: {
|
|
14
|
+
signal?: AbortSignal;
|
|
15
|
+
credentialSecret?: string;
|
|
16
|
+
}): Promise<Map<string, string>>;
|
|
@@ -0,0 +1,114 @@
|
|
|
1
|
+
import { constants } from 'node:fs';
|
|
2
|
+
import { lstat, open } from 'node:fs/promises';
|
|
3
|
+
import { createHash, createDecipheriv } from 'node:crypto';
|
|
4
|
+
import { homedir, platform, userInfo } from 'node:os';
|
|
5
|
+
import { join } from 'node:path';
|
|
6
|
+
/** Native standalone-account-provider-runtime.js identity binding (ZCode 0.16.9).
|
|
7
|
+
* Keys remain in the Host and are used only for the corresponding native route.
|
|
8
|
+
* OAuth access/refresh tokens and old identities are deliberately not fallbacks.
|
|
9
|
+
*/
|
|
10
|
+
export async function readZCodeAccountBindings(authDirectory, providerIds, options = {}) {
|
|
11
|
+
const result = new Map();
|
|
12
|
+
if (!providerIds.length)
|
|
13
|
+
return result;
|
|
14
|
+
options.signal?.throwIfAborted();
|
|
15
|
+
let file;
|
|
16
|
+
const buffer = Buffer.alloc(64 * 1024 + 1);
|
|
17
|
+
let key;
|
|
18
|
+
try {
|
|
19
|
+
for (const directory of [
|
|
20
|
+
authDirectory,
|
|
21
|
+
join(authDirectory, '.zcode'),
|
|
22
|
+
join(authDirectory, '.zcode/v2'),
|
|
23
|
+
]) {
|
|
24
|
+
const info = await lstat(directory);
|
|
25
|
+
if (!info.isDirectory() || info.isSymbolicLink())
|
|
26
|
+
throw new Error('Unsafe ZCode credential directory');
|
|
27
|
+
}
|
|
28
|
+
file = await open(join(authDirectory, '.zcode/v2/credentials.json'), constants.O_RDONLY | constants.O_NOFOLLOW | constants.O_NONBLOCK);
|
|
29
|
+
const info = await file.stat();
|
|
30
|
+
if (!info.isFile() || info.nlink !== 1 || info.size > 64 * 1024 || !info.size)
|
|
31
|
+
throw new Error('Unsafe ZCode credential file');
|
|
32
|
+
let length = 0;
|
|
33
|
+
while (length < buffer.length) {
|
|
34
|
+
options.signal?.throwIfAborted();
|
|
35
|
+
const { bytesRead } = await file.read(buffer, length, buffer.length - length, null);
|
|
36
|
+
if (!bytesRead)
|
|
37
|
+
break;
|
|
38
|
+
length += bytesRead;
|
|
39
|
+
}
|
|
40
|
+
const after = await file.stat();
|
|
41
|
+
if (length > 64 * 1024 ||
|
|
42
|
+
length !== info.size ||
|
|
43
|
+
info.size !== after.size ||
|
|
44
|
+
info.mtimeMs !== after.mtimeMs)
|
|
45
|
+
throw new Error('ZCode credentials changed during read');
|
|
46
|
+
const raw = JSON.parse(buffer.subarray(0, length).toString('utf8'));
|
|
47
|
+
if (!raw || typeof raw !== 'object' || Array.isArray(raw))
|
|
48
|
+
throw new Error('Invalid ZCode credentials');
|
|
49
|
+
const values = raw;
|
|
50
|
+
let username = 'unknown';
|
|
51
|
+
try {
|
|
52
|
+
username = userInfo().username;
|
|
53
|
+
}
|
|
54
|
+
catch {
|
|
55
|
+
/* native fallback */
|
|
56
|
+
}
|
|
57
|
+
const secret = (options.credentialSecret ?? process.env.ZCODE_CREDENTIAL_SECRET?.trim()) ||
|
|
58
|
+
`zcode-credential-fallback:${platform()}:${homedir()}:${username}`;
|
|
59
|
+
key = createHash('sha256').update(secret).digest();
|
|
60
|
+
const decode = (id) => {
|
|
61
|
+
const value = values[id];
|
|
62
|
+
if (value == null)
|
|
63
|
+
return;
|
|
64
|
+
if (typeof value !== 'string')
|
|
65
|
+
throw new Error('Invalid ZCode credential value');
|
|
66
|
+
if (!value.startsWith('enc:v1:'))
|
|
67
|
+
return value.trim() || undefined;
|
|
68
|
+
const parts = value.slice(7).split('.');
|
|
69
|
+
if (parts.length !== 3 || parts.some((part) => !/^[A-Za-z0-9_-]+$/.test(part)))
|
|
70
|
+
throw new Error('Invalid ZCode cipher');
|
|
71
|
+
const [iv, tag, body] = parts.map((part) => Buffer.from(part, 'base64url'));
|
|
72
|
+
if (iv.length !== 12 || tag.length !== 16)
|
|
73
|
+
throw new Error('Invalid ZCode cipher');
|
|
74
|
+
const cipher = createDecipheriv('aes-256-gcm', key, iv);
|
|
75
|
+
cipher.setAuthTag(tag);
|
|
76
|
+
const plain = Buffer.concat([cipher.update(body), cipher.final()]);
|
|
77
|
+
try {
|
|
78
|
+
return plain.toString('utf8').trim() || undefined;
|
|
79
|
+
}
|
|
80
|
+
finally {
|
|
81
|
+
plain.fill(0);
|
|
82
|
+
}
|
|
83
|
+
};
|
|
84
|
+
for (const providerId of new Set(providerIds)) {
|
|
85
|
+
options.signal?.throwIfAborted();
|
|
86
|
+
const identity = decode(`account-provider:${providerId}:identity`);
|
|
87
|
+
if (!identity)
|
|
88
|
+
continue;
|
|
89
|
+
const apiKey = decode(`account-provider:coding-plan:${providerId}:account:${encodeURIComponent(identity)}:api-key`);
|
|
90
|
+
if (apiKey)
|
|
91
|
+
result.set(providerId, { identity, key: apiKey });
|
|
92
|
+
}
|
|
93
|
+
return result;
|
|
94
|
+
}
|
|
95
|
+
catch (error) {
|
|
96
|
+
options.signal?.throwIfAborted();
|
|
97
|
+
if (error.code === 'ENOENT')
|
|
98
|
+
return result;
|
|
99
|
+
throw new Error('无法安全读取 ZCode 当前账号的 Worker 凭据,请在原生登录设置中检查');
|
|
100
|
+
}
|
|
101
|
+
finally {
|
|
102
|
+
key?.fill(0);
|
|
103
|
+
buffer.fill(0);
|
|
104
|
+
await file?.close();
|
|
105
|
+
}
|
|
106
|
+
}
|
|
107
|
+
/** Key-only view retained for account-scoped metadata queries. */
|
|
108
|
+
export async function readZCodeAccountApiKeys(authDirectory, providerIds, options = {}) {
|
|
109
|
+
return new Map([...(await readZCodeAccountBindings(authDirectory, providerIds, options))].map(([provider, value]) => [
|
|
110
|
+
provider,
|
|
111
|
+
value.key,
|
|
112
|
+
]));
|
|
113
|
+
}
|
|
114
|
+
//# sourceMappingURL=zcode-account-models.js.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"zcode-account-models.js","sourceRoot":"","sources":["../../../src/host/zcode-account-models.ts"],"names":[],"mappings":"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"}
|