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,320 @@
|
|
|
1
|
+
import { constants } from 'node:fs';
|
|
2
|
+
import { lstat, open, realpath } from 'node:fs/promises';
|
|
3
|
+
import { createHash } from 'node:crypto';
|
|
4
|
+
import { homedir } from 'node:os';
|
|
5
|
+
import { join, resolve } from 'node:path';
|
|
6
|
+
import { accountEmail, localTokenExpired } from "./account-identity.js";
|
|
7
|
+
import { EFFORTS } from "../shared/types.js";
|
|
8
|
+
export const GROK_MODELS_URL = 'https://cli-chat-proxy.grok.com/v1/models';
|
|
9
|
+
export const GROK_SETTINGS_URL = 'https://cli-chat-proxy.grok.com/v1/settings';
|
|
10
|
+
const object = (v) => !!v && typeof v === 'object' && !Array.isArray(v);
|
|
11
|
+
const text = (v) => typeof v === 'string' && !!v && v.length <= 32768 && !/[\x00-\x20\x7f]/.test(v);
|
|
12
|
+
export class GrokModelsError extends Error {
|
|
13
|
+
}
|
|
14
|
+
/** This adapter supports the fixed first-party route, not ambient provider overrides. */
|
|
15
|
+
export function assertGrokNativeEnvironment(home = homedir()) {
|
|
16
|
+
if (process.env.GROK_HOME?.trim() && resolve(process.env.GROK_HOME) !== resolve(home, '.grok'))
|
|
17
|
+
throw new GrokModelsError('当前 Grok 认证配置不受支持');
|
|
18
|
+
if ([
|
|
19
|
+
'GROK_AUTH_PROVIDER_COMMAND',
|
|
20
|
+
'GROK_OIDC_ISSUER',
|
|
21
|
+
'GROK_OIDC_CLIENT_ID',
|
|
22
|
+
'GROK_CLI_CHAT_PROXY_BASE_URL',
|
|
23
|
+
'GROK_MODELS_BASE_URL',
|
|
24
|
+
'GROK_MODELS_LIST_URL',
|
|
25
|
+
'GROK_XAI_API_BASE_URL',
|
|
26
|
+
'GROK_DEPLOYMENT_KEY',
|
|
27
|
+
'GROK_AUTH_PATH',
|
|
28
|
+
'GROK_CONFIG_PATH',
|
|
29
|
+
].some((key) => process.env[key]?.trim()))
|
|
30
|
+
throw new GrokModelsError('当前 Grok 认证配置不受支持');
|
|
31
|
+
}
|
|
32
|
+
/** Official native OIDC slot and its own identity, not arbitrary configured keys. */
|
|
33
|
+
export function selectGrokOwnAccount(raw, now = Date.now()) {
|
|
34
|
+
if (!object(raw))
|
|
35
|
+
return undefined;
|
|
36
|
+
const entries = Object.entries(raw).filter(([slot, value]) => slot.startsWith('https://auth.x.ai::') && object(value) && value.auth_mode === 'oidc');
|
|
37
|
+
if (entries.length !== 1)
|
|
38
|
+
return undefined;
|
|
39
|
+
const [slot, value] = entries[0];
|
|
40
|
+
if (!object(value) ||
|
|
41
|
+
value.oidc_issuer !== 'https://auth.x.ai' ||
|
|
42
|
+
!text(value.oidc_client_id) ||
|
|
43
|
+
slot !== `https://auth.x.ai::${value.oidc_client_id}` ||
|
|
44
|
+
!text(value.user_id))
|
|
45
|
+
return undefined;
|
|
46
|
+
if (!text(value.key))
|
|
47
|
+
return undefined;
|
|
48
|
+
const access = value.key;
|
|
49
|
+
const created = typeof value.create_time === 'string' ? Date.parse(value.create_time) : NaN;
|
|
50
|
+
const expires = typeof value.expires_at === 'string' ? Date.parse(value.expires_at) : created + 30 * 86400_000;
|
|
51
|
+
return {
|
|
52
|
+
access,
|
|
53
|
+
expires,
|
|
54
|
+
refresh: text(value.refresh_token),
|
|
55
|
+
userId: value.user_id,
|
|
56
|
+
clientId: value.oidc_client_id,
|
|
57
|
+
active: !!access && Number.isFinite(expires) && expires > now && !localTokenExpired(access, now),
|
|
58
|
+
...(accountEmail(value.email) ? { email: accountEmail(value.email) } : {}),
|
|
59
|
+
};
|
|
60
|
+
}
|
|
61
|
+
export async function readGrokOwnAccount(options = {}) {
|
|
62
|
+
options.signal?.throwIfAborted();
|
|
63
|
+
assertGrokNativeEnvironment(options.home);
|
|
64
|
+
const buffer = Buffer.alloc(65537);
|
|
65
|
+
let file;
|
|
66
|
+
try {
|
|
67
|
+
const root = join(await realpath(options.home ?? homedir()), '.grok');
|
|
68
|
+
const directory = await lstat(root);
|
|
69
|
+
if (!directory.isDirectory() || directory.isSymbolicLink() || (await realpath(root)) !== root)
|
|
70
|
+
throw new Error();
|
|
71
|
+
const path = join(root, 'auth.json');
|
|
72
|
+
const location = await lstat(path);
|
|
73
|
+
if (location.isSymbolicLink() || !location.isFile())
|
|
74
|
+
throw new Error();
|
|
75
|
+
file = await open(path, constants.O_RDONLY | constants.O_NOFOLLOW | constants.O_NONBLOCK);
|
|
76
|
+
const stat = await file.stat();
|
|
77
|
+
if (!stat.isFile() || stat.dev !== location.dev || stat.ino !== location.ino || stat.nlink !== 1 || stat.size > 65536)
|
|
78
|
+
throw new Error();
|
|
79
|
+
let size = 0;
|
|
80
|
+
while (size < buffer.length) {
|
|
81
|
+
options.signal?.throwIfAborted();
|
|
82
|
+
const { bytesRead } = await file.read(buffer, size, buffer.length - size, null);
|
|
83
|
+
if (!bytesRead)
|
|
84
|
+
break;
|
|
85
|
+
size += bytesRead;
|
|
86
|
+
}
|
|
87
|
+
if (!size || size > 65536)
|
|
88
|
+
throw new Error();
|
|
89
|
+
const current = await lstat(path);
|
|
90
|
+
const after = await file.stat();
|
|
91
|
+
if (current.isSymbolicLink() || current.dev !== stat.dev || current.ino !== stat.ino || after.size !== stat.size || after.mtimeMs !== stat.mtimeMs)
|
|
92
|
+
throw new Error();
|
|
93
|
+
const bytes = buffer.subarray(0, size);
|
|
94
|
+
const account = selectGrokOwnAccount(JSON.parse(bytes.toString('utf8')));
|
|
95
|
+
if (!account || (!account.active && !account.refresh))
|
|
96
|
+
throw new Error();
|
|
97
|
+
options.signal?.throwIfAborted();
|
|
98
|
+
const currentDirectory = await lstat(root);
|
|
99
|
+
if (currentDirectory.isSymbolicLink() ||
|
|
100
|
+
currentDirectory.dev !== directory.dev ||
|
|
101
|
+
currentDirectory.ino !== directory.ino)
|
|
102
|
+
throw new Error();
|
|
103
|
+
return { ...account, fingerprint: createHash('sha256').update(bytes).digest('hex') };
|
|
104
|
+
}
|
|
105
|
+
catch {
|
|
106
|
+
options.signal?.throwIfAborted();
|
|
107
|
+
throw new GrokModelsError('请先登录 Grok');
|
|
108
|
+
}
|
|
109
|
+
finally {
|
|
110
|
+
buffer.fill(0);
|
|
111
|
+
await file?.close();
|
|
112
|
+
}
|
|
113
|
+
}
|
|
114
|
+
/** Only metadata IDs pass out; a successful empty list differs from a failed query. */
|
|
115
|
+
export function grokAccountModels(payload, forbidden = []) {
|
|
116
|
+
if (!object(payload) || !Array.isArray(payload.data))
|
|
117
|
+
throw new GrokModelsError('模型目录格式无效');
|
|
118
|
+
const result = new Map();
|
|
119
|
+
for (const value of payload.data) {
|
|
120
|
+
if (!object(value))
|
|
121
|
+
throw new GrokModelsError('模型目录格式无效');
|
|
122
|
+
const meta = object(value._meta) ? value._meta : {};
|
|
123
|
+
// supported_in_api=false denotes a session-only model; this is a session request.
|
|
124
|
+
if (value.hidden === true ||
|
|
125
|
+
meta.hidden === true ||
|
|
126
|
+
value.allowed === false ||
|
|
127
|
+
value.available === false ||
|
|
128
|
+
value.entitled === false ||
|
|
129
|
+
value.enabled === false ||
|
|
130
|
+
value.disabled === true ||
|
|
131
|
+
value.upgrade_required === true)
|
|
132
|
+
continue;
|
|
133
|
+
const id = value.model ?? value.modelId ?? value.id ?? meta.model ?? meta.modelId;
|
|
134
|
+
if (typeof id !== 'string' ||
|
|
135
|
+
!/^[A-Za-z0-9][A-Za-z0-9._:/-]{0,255}$/.test(id) ||
|
|
136
|
+
forbidden.some((secret) => secret && id.includes(secret)))
|
|
137
|
+
throw new GrokModelsError('模型目录格式无效');
|
|
138
|
+
if (result.has(id))
|
|
139
|
+
throw new GrokModelsError('模型目录格式无效');
|
|
140
|
+
const supports = value.supportsReasoningEffort ?? value.supports_reasoning_effort ?? meta.supportsReasoningEffort;
|
|
141
|
+
const rawEfforts = value.reasoningEfforts ?? value.reasoning_efforts ?? meta.reasoningEfforts;
|
|
142
|
+
let efforts;
|
|
143
|
+
if (supports === false)
|
|
144
|
+
efforts = ['default'];
|
|
145
|
+
else if (rawEfforts !== undefined) {
|
|
146
|
+
if (!Array.isArray(rawEfforts))
|
|
147
|
+
throw new GrokModelsError('模型目录格式无效');
|
|
148
|
+
efforts = [
|
|
149
|
+
...new Set(rawEfforts.flatMap((item) => {
|
|
150
|
+
const id = object(item) ? item.id : item;
|
|
151
|
+
return typeof id === 'string' && EFFORTS.includes(id) ? [id] : [];
|
|
152
|
+
})),
|
|
153
|
+
];
|
|
154
|
+
}
|
|
155
|
+
result.set(id, efforts);
|
|
156
|
+
}
|
|
157
|
+
return result;
|
|
158
|
+
}
|
|
159
|
+
export function grokAccountModelIds(payload, forbidden = []) {
|
|
160
|
+
return new Set(grokAccountModels(payload, forbidden).keys());
|
|
161
|
+
}
|
|
162
|
+
/** Installed grok 1.0.0 (3cd0d0cbcebe) consumes these dynamic /models fields.
|
|
163
|
+
* Verified against its actual ACP response using an isolated loopback fixture;
|
|
164
|
+
* the built-in grok-4.5 fallback is not a limit on dynamic model IDs or xhigh.
|
|
165
|
+
*/
|
|
166
|
+
export function grokDynamicNativeModels(payload, forbidden = []) {
|
|
167
|
+
const scoped = grokAccountModels(payload, forbidden);
|
|
168
|
+
if (!object(payload) || !Array.isArray(payload.data))
|
|
169
|
+
return [];
|
|
170
|
+
return payload.data.flatMap((value) => {
|
|
171
|
+
if (!object(value))
|
|
172
|
+
return [];
|
|
173
|
+
const meta = object(value._meta) ? value._meta : {};
|
|
174
|
+
const id = value.model ?? value.modelId ?? value.id ?? meta.model ?? meta.modelId;
|
|
175
|
+
if (typeof id !== 'string' || !scoped.has(id))
|
|
176
|
+
return [];
|
|
177
|
+
// Never import a remote BYOK route or credential into this session adapter.
|
|
178
|
+
for (const key of ['baseUrl', 'base_url', 'apiBaseUrl', 'api_base_url']) {
|
|
179
|
+
const route = value[key];
|
|
180
|
+
if (route !== undefined && route !== 'https://cli-chat-proxy.grok.com/v1')
|
|
181
|
+
throw new GrokModelsError('模型目录地址不受支持');
|
|
182
|
+
}
|
|
183
|
+
if (['api_key', 'apiKey', 'env_key', 'envKey', 'auth_provider', 'authProvider'].some((key) => value[key] !== undefined))
|
|
184
|
+
throw new GrokModelsError('模型认证配置不受支持');
|
|
185
|
+
const supports = value.supportsReasoningEffort ?? value.supports_reasoning_effort ?? meta.supportsReasoningEffort;
|
|
186
|
+
const efforts = supports === false
|
|
187
|
+
? ['default']
|
|
188
|
+
: supports === true
|
|
189
|
+
? scoped.get(id)?.filter((effort) => ['low', 'medium', 'high', 'xhigh'].includes(effort))
|
|
190
|
+
: [];
|
|
191
|
+
if (!efforts?.length)
|
|
192
|
+
return [];
|
|
193
|
+
const label = typeof value.name === 'string' &&
|
|
194
|
+
value.name.length <= 256 &&
|
|
195
|
+
!/\p{C}/u.test(value.name) &&
|
|
196
|
+
!forbidden.some((secret) => secret && value.name.toString().includes(secret))
|
|
197
|
+
? value.name
|
|
198
|
+
: id;
|
|
199
|
+
return [{ id, label, efforts }];
|
|
200
|
+
});
|
|
201
|
+
}
|
|
202
|
+
async function readPayload(response, signal) {
|
|
203
|
+
const reader = response.body?.getReader();
|
|
204
|
+
if (!reader)
|
|
205
|
+
throw new GrokModelsError('模型目录格式无效');
|
|
206
|
+
let length = 0;
|
|
207
|
+
const chunks = [];
|
|
208
|
+
const abort = () => {
|
|
209
|
+
void reader.cancel().catch(() => undefined);
|
|
210
|
+
};
|
|
211
|
+
signal.addEventListener('abort', abort, { once: true });
|
|
212
|
+
try {
|
|
213
|
+
while (true) {
|
|
214
|
+
signal.throwIfAborted();
|
|
215
|
+
const { done, value } = await reader.read();
|
|
216
|
+
if (done)
|
|
217
|
+
break;
|
|
218
|
+
length += value.length;
|
|
219
|
+
if (length > 2097152)
|
|
220
|
+
throw new GrokModelsError('模型目录过大');
|
|
221
|
+
chunks.push(value);
|
|
222
|
+
}
|
|
223
|
+
return JSON.parse(Buffer.concat(chunks).toString('utf8'));
|
|
224
|
+
}
|
|
225
|
+
finally {
|
|
226
|
+
signal.removeEventListener('abort', abort);
|
|
227
|
+
await reader.cancel().catch(() => undefined);
|
|
228
|
+
reader.releaseLock();
|
|
229
|
+
}
|
|
230
|
+
}
|
|
231
|
+
/** Fixed official Build endpoint; no redirect, OAuth refresh, fallback, or generation. */
|
|
232
|
+
export async function discoverGrokAccountModels(native, options = {}) {
|
|
233
|
+
options.signal?.throwIfAborted();
|
|
234
|
+
const source = await readGrokOwnAccount(options);
|
|
235
|
+
if (!source.active || source.expires <= Date.now() + 30000)
|
|
236
|
+
throw new GrokModelsError('登录需要续期,请打开 Grok');
|
|
237
|
+
const controller = new AbortController();
|
|
238
|
+
const signal = options.signal ? AbortSignal.any([options.signal, controller.signal]) : controller.signal;
|
|
239
|
+
const timer = setTimeout(() => controller.abort(), Math.max(50, Math.min(options.timeoutMs ?? 8000, 10000)));
|
|
240
|
+
try {
|
|
241
|
+
// Native 1.0.0-era remote/client.rs:715-787, xai-grok-http/src/lib.rs:247-261.
|
|
242
|
+
const request = async (target) => {
|
|
243
|
+
const response = await (options.fetch ?? fetch)(target, {
|
|
244
|
+
method: 'GET',
|
|
245
|
+
redirect: 'error',
|
|
246
|
+
signal,
|
|
247
|
+
headers: {
|
|
248
|
+
accept: 'application/json',
|
|
249
|
+
Authorization: `Bearer ${source.access}`,
|
|
250
|
+
'X-XAI-Token-Auth': 'xai-grok-cli',
|
|
251
|
+
'x-userid': source.userId,
|
|
252
|
+
'x-grok-client-version': '1.0.0',
|
|
253
|
+
'x-grok-client-mode': 'headless',
|
|
254
|
+
...(source.email ? { 'x-email': source.email } : {}),
|
|
255
|
+
},
|
|
256
|
+
});
|
|
257
|
+
if (response.redirected || (response.url && response.url !== target)) {
|
|
258
|
+
await response.body?.cancel();
|
|
259
|
+
throw new GrokModelsError('模型目录地址不受支持');
|
|
260
|
+
}
|
|
261
|
+
if (!response.ok) {
|
|
262
|
+
await response.body?.cancel();
|
|
263
|
+
throw new GrokModelsError(response.status === 401
|
|
264
|
+
? '登录已失效,请重新登录'
|
|
265
|
+
: response.status === 403
|
|
266
|
+
? '模型目录访问被拒绝'
|
|
267
|
+
: '模型目录查询失败,请刷新');
|
|
268
|
+
}
|
|
269
|
+
return readPayload(response, signal);
|
|
270
|
+
};
|
|
271
|
+
const unchanged = async () => {
|
|
272
|
+
signal.throwIfAborted();
|
|
273
|
+
const current = await readGrokOwnAccount(options);
|
|
274
|
+
if (source.fingerprint !== current.fingerprint)
|
|
275
|
+
throw new GrokModelsError('账号已改变,请刷新');
|
|
276
|
+
signal.throwIfAborted();
|
|
277
|
+
};
|
|
278
|
+
// The Build access gate permits free allowlisted accounts too. A model list
|
|
279
|
+
// or a paid-tier claim alone is not the native access decision.
|
|
280
|
+
const settings = await request(GROK_SETTINGS_URL);
|
|
281
|
+
await unchanged();
|
|
282
|
+
if (!object(settings) || typeof settings.allow_access !== 'boolean')
|
|
283
|
+
throw new GrokModelsError('模型使用权限尚未确认');
|
|
284
|
+
if (!settings.allow_access)
|
|
285
|
+
throw new GrokModelsError('当前账号未获 Grok Build 使用权限');
|
|
286
|
+
const payload = await request(GROK_MODELS_URL);
|
|
287
|
+
const models = grokAccountModels(payload, [source.access, source.userId]);
|
|
288
|
+
signal.throwIfAborted();
|
|
289
|
+
await unchanged();
|
|
290
|
+
signal.throwIfAborted();
|
|
291
|
+
if (!models.size)
|
|
292
|
+
throw new GrokModelsError('账号目录未返回模型');
|
|
293
|
+
const capabilities = options.nativeDynamicSchema
|
|
294
|
+
? grokDynamicNativeModels(payload, [source.access, source.userId])
|
|
295
|
+
: native;
|
|
296
|
+
const result = capabilities.flatMap((model) => {
|
|
297
|
+
if (!models.has(model.id))
|
|
298
|
+
return [];
|
|
299
|
+
const allowed = models.get(model.id);
|
|
300
|
+
const efforts = allowed
|
|
301
|
+
? (model.efforts ?? []).filter((effort) => allowed.includes(effort))
|
|
302
|
+
: (model.efforts ?? []);
|
|
303
|
+
return efforts.length ? [{ ...model, efforts }] : [];
|
|
304
|
+
});
|
|
305
|
+
if (!result.length)
|
|
306
|
+
throw new GrokModelsError('当前 CLI 未支持账号模型');
|
|
307
|
+
return result;
|
|
308
|
+
}
|
|
309
|
+
catch (error) {
|
|
310
|
+
options.signal?.throwIfAborted();
|
|
311
|
+
if (error instanceof GrokModelsError)
|
|
312
|
+
throw error;
|
|
313
|
+
throw new GrokModelsError(controller.signal.aborted ? '模型目录查询超时' : '模型目录查询失败,请刷新');
|
|
314
|
+
}
|
|
315
|
+
finally {
|
|
316
|
+
clearTimeout(timer);
|
|
317
|
+
controller.abort();
|
|
318
|
+
}
|
|
319
|
+
}
|
|
320
|
+
//# sourceMappingURL=grok-models.js.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"grok-models.js","sourceRoot":"","sources":["../../../src/host/grok-models.ts"],"names":[],"mappings":"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"}
|
|
@@ -0,0 +1,17 @@
|
|
|
1
|
+
import type { AccountAction } from '../shared/accounts.ts';
|
|
2
|
+
import type { AccountIdentity } from './account-identity.ts';
|
|
3
|
+
import type { RuntimeConfig } from './process.ts';
|
|
4
|
+
import { type OpenCodeNativeOptions } from './opencode-native.ts';
|
|
5
|
+
export declare function readPiOmpAccount(cli: 'pi' | 'omp', config: RuntimeConfig, signal: AbortSignal, options?: {
|
|
6
|
+
nativeHome?: string;
|
|
7
|
+
}): Promise<AccountIdentity>;
|
|
8
|
+
/** Project only capability metadata, never keys, arbitrary provider metadata or token claims. */
|
|
9
|
+
export declare function readOpenCodeAccount(config: RuntimeConfig, signal: AbortSignal, options?: OpenCodeNativeOptions): Promise<AccountIdentity>;
|
|
10
|
+
/** User-operated native terminal. No task prompt, slash command, login or logout is injected. */
|
|
11
|
+
export declare function prepareOpenCodeAccount(executable: string, action: AccountAction, config: RuntimeConfig, signal: AbortSignal): Promise<{
|
|
12
|
+
argv: string[];
|
|
13
|
+
env: Record<string, string>;
|
|
14
|
+
cwd: string;
|
|
15
|
+
cleanup: () => void;
|
|
16
|
+
instruction: string;
|
|
17
|
+
}>;
|
|
@@ -0,0 +1,80 @@
|
|
|
1
|
+
import { lstatSync, rmSync } from 'node:fs';
|
|
2
|
+
import { mkdtemp } from 'node:fs/promises';
|
|
3
|
+
import { dirname, join } from 'node:path';
|
|
4
|
+
import { fileURLToPath } from 'node:url';
|
|
5
|
+
import { openCodeAuthDirectory, openCodeEnvironment } from "./opencode-adapter.js";
|
|
6
|
+
import { privateDirectory } from "./extended-adapters.js";
|
|
7
|
+
import { inspectPiOmpNativeAccount } from "./pi-omp-native.js";
|
|
8
|
+
import { assertOpenCodeManagedAuth, inspectOpenCodeProfile, } from "./opencode-native.js";
|
|
9
|
+
export async function readPiOmpAccount(cli, config, signal, options = {}) {
|
|
10
|
+
const native = await inspectPiOmpNativeAccount(cli, config.stateDirectory, signal, options);
|
|
11
|
+
return native;
|
|
12
|
+
}
|
|
13
|
+
/** Project only capability metadata, never keys, arbitrary provider metadata or token claims. */
|
|
14
|
+
export async function readOpenCodeAccount(config, signal, options = {}) {
|
|
15
|
+
signal.throwIfAborted();
|
|
16
|
+
const native = await inspectOpenCodeProfile(openCodeAuthDirectory(config.stateDirectory), {
|
|
17
|
+
...options,
|
|
18
|
+
signal,
|
|
19
|
+
});
|
|
20
|
+
return native;
|
|
21
|
+
}
|
|
22
|
+
/** User-operated native terminal. No task prompt, slash command, login or logout is injected. */
|
|
23
|
+
export async function prepareOpenCodeAccount(executable, action, config, signal) {
|
|
24
|
+
signal.throwIfAborted();
|
|
25
|
+
if (!['login', 'logout', 'manage'].includes(action))
|
|
26
|
+
throw new Error('不支持的 OpenCode 账号操作');
|
|
27
|
+
const data = openCodeAuthDirectory(config.stateDirectory);
|
|
28
|
+
const accountRoot = privateDirectory(dirname(data));
|
|
29
|
+
const terminals = privateDirectory(join(accountRoot, 'terminals'));
|
|
30
|
+
const state = privateDirectory(await mkdtemp(join(terminals, 'terminal-')));
|
|
31
|
+
const identity = lstatSync(state);
|
|
32
|
+
const parentIdentity = lstatSync(terminals);
|
|
33
|
+
let removed = false;
|
|
34
|
+
const cleanup = () => {
|
|
35
|
+
if (removed)
|
|
36
|
+
return;
|
|
37
|
+
const parent = lstatSync(terminals);
|
|
38
|
+
if (parent.isSymbolicLink() || parent.dev !== parentIdentity.dev || parent.ino !== parentIdentity.ino)
|
|
39
|
+
throw new Error('OpenCode account runtime parent changed before cleanup');
|
|
40
|
+
let current;
|
|
41
|
+
try {
|
|
42
|
+
current = lstatSync(state);
|
|
43
|
+
}
|
|
44
|
+
catch (error) {
|
|
45
|
+
if (error.code === 'ENOENT') {
|
|
46
|
+
removed = true;
|
|
47
|
+
return;
|
|
48
|
+
}
|
|
49
|
+
throw error;
|
|
50
|
+
}
|
|
51
|
+
if (current.isSymbolicLink() || current.dev !== identity.dev || current.ino !== identity.ino)
|
|
52
|
+
throw new Error('OpenCode account runtime changed before cleanup');
|
|
53
|
+
// rm does not follow nested links. Never seal/chmod or remove the shared auth tree.
|
|
54
|
+
rmSync(state, { recursive: true, force: true });
|
|
55
|
+
removed = true;
|
|
56
|
+
};
|
|
57
|
+
try {
|
|
58
|
+
signal.throwIfAborted();
|
|
59
|
+
await assertOpenCodeManagedAuth(data, signal);
|
|
60
|
+
const env = await openCodeEnvironment(state, {
|
|
61
|
+
permission: { '*': 'deny' },
|
|
62
|
+
}, data, false);
|
|
63
|
+
signal.throwIfAborted();
|
|
64
|
+
const argv = [executable, ...(action === 'manage' ? [] : ['auth', action])];
|
|
65
|
+
return {
|
|
66
|
+
argv: [process.execPath, fileURLToPath(new URL('./private-launch.mjs', import.meta.url)), ...argv],
|
|
67
|
+
env: { ...env, ELECTRON_RUN_AS_NODE: '1' },
|
|
68
|
+
cwd: state,
|
|
69
|
+
cleanup,
|
|
70
|
+
instruction: action === 'manage'
|
|
71
|
+
? '在 OpenCode 原生终端使用 /connect 管理登录;凭据与插件任务共用,工作数据保持独立。'
|
|
72
|
+
: '按 OpenCode 原生账号流程操作;凭据与插件任务共用,关闭终端不会撤销已完成的账号操作。',
|
|
73
|
+
};
|
|
74
|
+
}
|
|
75
|
+
catch (error) {
|
|
76
|
+
cleanup();
|
|
77
|
+
throw error;
|
|
78
|
+
}
|
|
79
|
+
}
|
|
80
|
+
//# sourceMappingURL=harness-opencode-accounts.js.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"harness-opencode-accounts.js","sourceRoot":"","sources":["../../../src/host/harness-opencode-accounts.ts"],"names":[],"mappings":"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"}
|
|
@@ -0,0 +1,8 @@
|
|
|
1
|
+
import type { RuntimeConfig } from './process.ts';
|
|
2
|
+
/** Once explicitly selected, this home remains authoritative even after logout/deletion.
|
|
3
|
+
* The marker is outside native writable account storage and contains no credentials. */
|
|
4
|
+
export declare function effectiveHermesHome(config: Pick<RuntimeConfig, 'stateDirectory' | 'hermesHome'>): string;
|
|
5
|
+
/** Only an explicit account action establishes this source. Never copy global auth/config. */
|
|
6
|
+
export declare function prepareHermesAccountHome(config: Pick<RuntimeConfig, 'stateDirectory' | 'hermesHome'>): string;
|
|
7
|
+
/** Native account selectors must not inherit a Host-managed overlay or secret helper. */
|
|
8
|
+
export declare function hermesAccountEnvironment(home: string): Record<string, string>;
|
|
@@ -0,0 +1,99 @@
|
|
|
1
|
+
import { chmodSync, closeSync, constants, fstatSync, lstatSync, mkdirSync, openSync, readFileSync, writeFileSync, } from 'node:fs';
|
|
2
|
+
import { homedir } from 'node:os';
|
|
3
|
+
import { join, resolve } from 'node:path';
|
|
4
|
+
import { hermesHomeDirectory, validateHermesHomeDirectory } from "./hermes-adapter.js";
|
|
5
|
+
const markerText = '{"version":1,"source":"plugin-native"}\n';
|
|
6
|
+
function paths(config) {
|
|
7
|
+
const root = validateHermesHomeDirectory(resolve(config.stateDirectory ?? join(process.env.DSH_HOME ?? join(homedir(), '.dsh'), 'cliworker-now')));
|
|
8
|
+
return {
|
|
9
|
+
root,
|
|
10
|
+
parent: join(root, 'accounts'),
|
|
11
|
+
home: join(root, 'accounts', 'hermes'),
|
|
12
|
+
marker: join(root, 'accounts', 'hermes-source.json'),
|
|
13
|
+
};
|
|
14
|
+
}
|
|
15
|
+
function selected(marker) {
|
|
16
|
+
let fd;
|
|
17
|
+
try {
|
|
18
|
+
fd = openSync(marker, constants.O_RDONLY | constants.O_NOFOLLOW | constants.O_NONBLOCK);
|
|
19
|
+
const info = fstatSync(fd);
|
|
20
|
+
if (!info.isFile() || info.nlink !== 1 || info.size > 256 || readFileSync(fd, 'utf8') !== markerText)
|
|
21
|
+
throw new Error('Hermes 账号来源记录无效,请检查插件目录');
|
|
22
|
+
return true;
|
|
23
|
+
}
|
|
24
|
+
catch (error) {
|
|
25
|
+
if (error.code === 'ENOENT')
|
|
26
|
+
return false;
|
|
27
|
+
throw error;
|
|
28
|
+
}
|
|
29
|
+
finally {
|
|
30
|
+
if (fd !== undefined)
|
|
31
|
+
closeSync(fd);
|
|
32
|
+
}
|
|
33
|
+
}
|
|
34
|
+
/** Once explicitly selected, this home remains authoritative even after logout/deletion.
|
|
35
|
+
* The marker is outside native writable account storage and contains no credentials. */
|
|
36
|
+
export function effectiveHermesHome(config) {
|
|
37
|
+
const own = paths(config);
|
|
38
|
+
for (const path of [own.parent, own.home]) {
|
|
39
|
+
try {
|
|
40
|
+
if (lstatSync(path).isSymbolicLink())
|
|
41
|
+
throw new Error('Unsafe Hermes account directory');
|
|
42
|
+
}
|
|
43
|
+
catch (error) {
|
|
44
|
+
if (error.code !== 'ENOENT')
|
|
45
|
+
throw error;
|
|
46
|
+
}
|
|
47
|
+
}
|
|
48
|
+
return selected(own.marker) ? validateHermesHomeDirectory(own.home) : hermesHomeDirectory(config.hermesHome);
|
|
49
|
+
}
|
|
50
|
+
/** Only an explicit account action establishes this source. Never copy global auth/config. */
|
|
51
|
+
export function prepareHermesAccountHome(config) {
|
|
52
|
+
// Validate the previous source as well; a misconfigured root must not widen a sandbox grant.
|
|
53
|
+
hermesHomeDirectory(config.hermesHome);
|
|
54
|
+
const own = paths(config);
|
|
55
|
+
for (const path of [own.root, own.parent, own.home]) {
|
|
56
|
+
mkdirSync(path, { recursive: true, mode: 0o700 });
|
|
57
|
+
const info = lstatSync(path);
|
|
58
|
+
if (!info.isDirectory() || info.isSymbolicLink())
|
|
59
|
+
throw new Error('Unsafe Hermes account directory');
|
|
60
|
+
chmodSync(path, 0o700);
|
|
61
|
+
}
|
|
62
|
+
// Native setup merges its defaults and writes its own model/account choices later.
|
|
63
|
+
try {
|
|
64
|
+
writeFileSync(join(own.home, 'config.yaml'), 'auth:\n adopt_external_logins: false\n', {
|
|
65
|
+
flag: 'wx',
|
|
66
|
+
mode: 0o600,
|
|
67
|
+
});
|
|
68
|
+
}
|
|
69
|
+
catch (error) {
|
|
70
|
+
if (error.code !== 'EEXIST')
|
|
71
|
+
throw error;
|
|
72
|
+
}
|
|
73
|
+
if (!selected(own.marker)) {
|
|
74
|
+
try {
|
|
75
|
+
writeFileSync(own.marker, markerText, { flag: 'wx', mode: 0o600 });
|
|
76
|
+
}
|
|
77
|
+
catch (error) {
|
|
78
|
+
if (error.code !== 'EEXIST')
|
|
79
|
+
throw error;
|
|
80
|
+
}
|
|
81
|
+
}
|
|
82
|
+
if (!selected(own.marker))
|
|
83
|
+
throw new Error('Hermes 账号来源记录无法保存');
|
|
84
|
+
return validateHermesHomeDirectory(own.home);
|
|
85
|
+
}
|
|
86
|
+
/** Native account selectors must not inherit a Host-managed overlay or secret helper. */
|
|
87
|
+
export function hermesAccountEnvironment(home) {
|
|
88
|
+
return {
|
|
89
|
+
HERMES_HOME: home,
|
|
90
|
+
HERMES_MANAGED_DIR: join(home, '.cliworker-managed'),
|
|
91
|
+
HERMES_PROFILE: '',
|
|
92
|
+
HERMES_SAFE_MODE: '1',
|
|
93
|
+
HERMES_IGNORE_RULES: '1',
|
|
94
|
+
HERMES_YOLO_MODE: '0',
|
|
95
|
+
HERMES_ACCEPT_HOOKS: '0',
|
|
96
|
+
HERMES_DISABLE_LAZY_INSTALLS: '1',
|
|
97
|
+
};
|
|
98
|
+
}
|
|
99
|
+
//# sourceMappingURL=hermes-account-context.js.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"hermes-account-context.js","sourceRoot":"","sources":["../../../src/host/hermes-account-context.ts"],"names":[],"mappings":"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"}
|
|
@@ -0,0 +1,19 @@
|
|
|
1
|
+
import type { AccountAction, AccountSource } from '../shared/accounts.ts';
|
|
2
|
+
import { type AccountIdentity } from './account-identity.ts';
|
|
3
|
+
import { type RuntimeConfig } from './process.ts';
|
|
4
|
+
/** Native shapes from auth_codex.py/auth_xai.py and NousResearch/hermes-agent@6c80c327 auth_nous.py.
|
|
5
|
+
* Explicit own credentials project local login; provider declarations and unknown schemas do not.
|
|
6
|
+
*/
|
|
7
|
+
export declare function projectHermesIdentity(raw: unknown): AccountIdentity | undefined;
|
|
8
|
+
export declare function readHermesAccount(config: RuntimeConfig, signal: AbortSignal): Promise<AccountIdentity>;
|
|
9
|
+
export declare function listHermesAccountSources(config: RuntimeConfig, signal: AbortSignal): Promise<{
|
|
10
|
+
id: AccountSource;
|
|
11
|
+
label: string;
|
|
12
|
+
}[]>;
|
|
13
|
+
export declare function prepareHermesAccount(action: AccountAction, executable: string, project: string, config: RuntimeConfig, signal: AbortSignal, source?: AccountSource): Promise<{
|
|
14
|
+
argv: string[];
|
|
15
|
+
cwd: string;
|
|
16
|
+
env: Record<string, string>;
|
|
17
|
+
instruction: string;
|
|
18
|
+
cleanup: () => Promise<void>;
|
|
19
|
+
}>;
|