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,127 @@
|
|
|
1
|
+
import { PassThrough } from 'node:stream';
|
|
2
|
+
import { fileURLToPath } from 'node:url';
|
|
3
|
+
/** Preserve pipes while using Harness's stronger terminal descendant ownership. */
|
|
4
|
+
export async function spawnManagedAgent(backend, spec) {
|
|
5
|
+
// Unit-test backends can implement only pipe spawning. The production Host
|
|
6
|
+
// always provides the native terminal primitive.
|
|
7
|
+
// On Windows ordinary spawning owns a native Job. ConPTY does not have that
|
|
8
|
+
// owner in the pinned Host, so a terminal bridge would weaken descendant cleanup.
|
|
9
|
+
if (process.platform === 'win32' || !backend.spawnTerminal)
|
|
10
|
+
return backend.spawn(spec);
|
|
11
|
+
spec.signal?.throwIfAborted();
|
|
12
|
+
const terminal = await backend.spawnTerminal({
|
|
13
|
+
argv: [process.execPath, fileURLToPath(new URL('./terminal-bridge.mjs', import.meta.url)), ...spec.argv],
|
|
14
|
+
cwd: spec.cwd,
|
|
15
|
+
env: { ...spec.env, ELECTRON_RUN_AS_NODE: '1' },
|
|
16
|
+
rows: 24,
|
|
17
|
+
cols: 240,
|
|
18
|
+
terminalType: 'dumb',
|
|
19
|
+
graceMs: spec.graceMs ?? 5000,
|
|
20
|
+
signal: spec.signal,
|
|
21
|
+
});
|
|
22
|
+
const stdout = new PassThrough(), stderr = new PassThrough();
|
|
23
|
+
let resolve, reject;
|
|
24
|
+
const done = new Promise((yes, no) => {
|
|
25
|
+
resolve = yes;
|
|
26
|
+
reject = no;
|
|
27
|
+
});
|
|
28
|
+
void done.catch(() => undefined);
|
|
29
|
+
let cleanup, exited = false, pending = '';
|
|
30
|
+
const terminate = () => {
|
|
31
|
+
if (!cleanup) {
|
|
32
|
+
clearInterval(observe);
|
|
33
|
+
cleanup = terminal.terminate();
|
|
34
|
+
void cleanup.catch((error) => reject(error));
|
|
35
|
+
}
|
|
36
|
+
};
|
|
37
|
+
// Retain PID + start identities before agy can detach a background child.
|
|
38
|
+
let inspecting = false;
|
|
39
|
+
const observe = setInterval(() => {
|
|
40
|
+
if (inspecting || cleanup)
|
|
41
|
+
return;
|
|
42
|
+
inspecting = true;
|
|
43
|
+
void terminal
|
|
44
|
+
.inspectForeground()
|
|
45
|
+
.catch((error) => {
|
|
46
|
+
reject(error);
|
|
47
|
+
terminate();
|
|
48
|
+
})
|
|
49
|
+
.finally(() => {
|
|
50
|
+
inspecting = false;
|
|
51
|
+
});
|
|
52
|
+
}, 200);
|
|
53
|
+
const abort = () => terminate();
|
|
54
|
+
spec.signal?.addEventListener('abort', abort, { once: true });
|
|
55
|
+
if (spec.signal?.aborted)
|
|
56
|
+
terminate();
|
|
57
|
+
void (async () => {
|
|
58
|
+
try {
|
|
59
|
+
for await (const chunk of terminal.output) {
|
|
60
|
+
pending += String(chunk);
|
|
61
|
+
let end;
|
|
62
|
+
while ((end = pending.indexOf('\n')) >= 0) {
|
|
63
|
+
const text = pending.slice(0, end).trim();
|
|
64
|
+
pending = pending.slice(end + 1);
|
|
65
|
+
if (!text)
|
|
66
|
+
continue;
|
|
67
|
+
const frame = JSON.parse(text);
|
|
68
|
+
if (frame.channel === 'stdout' || frame.channel === 'stderr') {
|
|
69
|
+
if (typeof frame.bytes !== 'string')
|
|
70
|
+
throw new Error('Invalid CLI bridge bytes');
|
|
71
|
+
(frame.channel === 'stdout' ? stdout : stderr).write(Buffer.from(frame.bytes, 'base64'));
|
|
72
|
+
}
|
|
73
|
+
else if (frame.channel === 'exit') {
|
|
74
|
+
exited = true;
|
|
75
|
+
stdout.end();
|
|
76
|
+
stderr.end();
|
|
77
|
+
resolve({ exitCode: frame.exitCode, signal: frame.signal });
|
|
78
|
+
}
|
|
79
|
+
else if (frame.channel === 'error')
|
|
80
|
+
throw new Error(frame.message);
|
|
81
|
+
else
|
|
82
|
+
throw new Error('Invalid CLI bridge frame');
|
|
83
|
+
}
|
|
84
|
+
if (pending.length > 2_097_152)
|
|
85
|
+
throw new Error('CLI bridge frame too large');
|
|
86
|
+
}
|
|
87
|
+
if (!exited) {
|
|
88
|
+
stdout.end();
|
|
89
|
+
stderr.end();
|
|
90
|
+
reject(new Error('CLI bridge ended before exit receipt'));
|
|
91
|
+
}
|
|
92
|
+
}
|
|
93
|
+
catch (error) {
|
|
94
|
+
stdout.destroy(error);
|
|
95
|
+
stderr.destroy(error);
|
|
96
|
+
reject(error);
|
|
97
|
+
terminate();
|
|
98
|
+
}
|
|
99
|
+
})();
|
|
100
|
+
void terminal.done.catch((error) => {
|
|
101
|
+
stdout.destroy(error);
|
|
102
|
+
stderr.destroy(error);
|
|
103
|
+
reject(error);
|
|
104
|
+
});
|
|
105
|
+
return {
|
|
106
|
+
stdin: undefined,
|
|
107
|
+
stdout,
|
|
108
|
+
stderr,
|
|
109
|
+
control: undefined,
|
|
110
|
+
collected: {},
|
|
111
|
+
done,
|
|
112
|
+
terminate,
|
|
113
|
+
waitForExit: async () => {
|
|
114
|
+
terminate();
|
|
115
|
+
try {
|
|
116
|
+
await cleanup;
|
|
117
|
+
await terminal.done;
|
|
118
|
+
return true;
|
|
119
|
+
}
|
|
120
|
+
finally {
|
|
121
|
+
spec.signal?.removeEventListener('abort', abort);
|
|
122
|
+
clearInterval(observe);
|
|
123
|
+
}
|
|
124
|
+
},
|
|
125
|
+
};
|
|
126
|
+
}
|
|
127
|
+
//# sourceMappingURL=managed-agent.js.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"managed-agent.js","sourceRoot":"","sources":["../../../src/host/managed-agent.ts"],"names":[],"mappings":"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"}
|
|
@@ -0,0 +1,22 @@
|
|
|
1
|
+
import type { AccountIdentity } from './account-identity.ts';
|
|
2
|
+
export declare class MimoConfigurationError extends Error {
|
|
3
|
+
constructor(message: string);
|
|
4
|
+
}
|
|
5
|
+
/** Mirrors native Global.Path; arbitrary config/content/DB selectors are cleared in the child. */
|
|
6
|
+
export declare function mimoConfigurationPaths(options?: {
|
|
7
|
+
env?: NodeJS.ProcessEnv;
|
|
8
|
+
osHome?: string;
|
|
9
|
+
paths?: Pick<typeof import('node:path'), 'join' | 'isAbsolute'>;
|
|
10
|
+
}): {
|
|
11
|
+
home: string;
|
|
12
|
+
config: string;
|
|
13
|
+
data: string;
|
|
14
|
+
};
|
|
15
|
+
export declare function mimoConfigurationFiles(project: string): Promise<string[]>;
|
|
16
|
+
/** Auth.Service reads this file independently of model/project configuration. */
|
|
17
|
+
export declare function readMimoOwnAuth(signal: AbortSignal): Promise<Record<string, any>>;
|
|
18
|
+
export declare function readMimoAccount(signal: AbortSignal): Promise<AccountIdentity>;
|
|
19
|
+
/** Only unavoidable external inputs remain relevant in an isolated account terminal. */
|
|
20
|
+
export declare function assertMimoAccountConfiguration(signal: AbortSignal): Promise<void>;
|
|
21
|
+
/** Native Config.Service expands references before returning metadata, so inspect before spawning it. */
|
|
22
|
+
export declare function assertMimoConfiguration(project: string, signal: AbortSignal): Promise<void>;
|
|
@@ -0,0 +1,258 @@
|
|
|
1
|
+
import { constants } from 'node:fs';
|
|
2
|
+
import { lstat, open, readdir, realpath } from 'node:fs/promises';
|
|
3
|
+
import { homedir, userInfo } from 'node:os';
|
|
4
|
+
import { basename, dirname, isAbsolute, join, resolve } from 'node:path';
|
|
5
|
+
import { safePiOmpAncestors } from "./pi-omp-native.js";
|
|
6
|
+
export class MimoConfigurationError extends Error {
|
|
7
|
+
constructor(message) {
|
|
8
|
+
super(message);
|
|
9
|
+
this.name = 'MimoConfigurationError';
|
|
10
|
+
}
|
|
11
|
+
}
|
|
12
|
+
const unavailable = () => new MimoConfigurationError('MiMo 配置来源无法确认,请检查配置');
|
|
13
|
+
const interpolation = () => new MimoConfigurationError('MiMo 配置含外部引用,请改为本 CLI 配置');
|
|
14
|
+
const remote = () => new MimoConfigurationError('MiMo 远程配置无法核验,请使用本地配置');
|
|
15
|
+
/** Mirrors native Global.Path; arbitrary config/content/DB selectors are cleared in the child. */
|
|
16
|
+
export function mimoConfigurationPaths(options = {}) {
|
|
17
|
+
const env = options.env ?? process.env;
|
|
18
|
+
const osHome = options.osHome ?? homedir();
|
|
19
|
+
const paths = options.paths ?? { join, isAbsolute };
|
|
20
|
+
const home = env.HOME || env.USERPROFILE || osHome;
|
|
21
|
+
const root = env.MIMOCODE_HOME;
|
|
22
|
+
const config = root
|
|
23
|
+
? paths.join(root, 'config')
|
|
24
|
+
: paths.join(env.XDG_CONFIG_HOME || paths.join(osHome, '.config'), 'mimocode');
|
|
25
|
+
const data = root
|
|
26
|
+
? paths.join(root, 'data')
|
|
27
|
+
: paths.join(env.XDG_DATA_HOME || paths.join(osHome, '.local/share'), 'mimocode');
|
|
28
|
+
if (![home, config, data, ...(root ? [root] : [])].every(paths.isAbsolute))
|
|
29
|
+
throw unavailable();
|
|
30
|
+
return { home, config, data };
|
|
31
|
+
}
|
|
32
|
+
export async function mimoConfigurationFiles(project) {
|
|
33
|
+
if (!isAbsolute(project))
|
|
34
|
+
throw unavailable();
|
|
35
|
+
const { home, config } = mimoConfigurationPaths();
|
|
36
|
+
const files = new Set([join(config, 'config.json')]);
|
|
37
|
+
const add = (directory) => {
|
|
38
|
+
files.add(join(directory, 'mimocode.json'));
|
|
39
|
+
files.add(join(directory, 'mimocode.jsonc'));
|
|
40
|
+
};
|
|
41
|
+
add(config);
|
|
42
|
+
add(join(home, '.mimocode'));
|
|
43
|
+
// Native stops at the worktree; checking every ancestor also covers unversioned projects.
|
|
44
|
+
let physical;
|
|
45
|
+
try {
|
|
46
|
+
physical = await realpath(project);
|
|
47
|
+
}
|
|
48
|
+
catch {
|
|
49
|
+
throw unavailable();
|
|
50
|
+
}
|
|
51
|
+
for (const start of new Set([resolve(project), physical])) {
|
|
52
|
+
for (let directory = start;; directory = dirname(directory)) {
|
|
53
|
+
add(directory);
|
|
54
|
+
add(join(directory, '.mimocode'));
|
|
55
|
+
if (dirname(directory) === directory)
|
|
56
|
+
break;
|
|
57
|
+
}
|
|
58
|
+
}
|
|
59
|
+
return [...files];
|
|
60
|
+
}
|
|
61
|
+
async function exists(path) {
|
|
62
|
+
try {
|
|
63
|
+
await lstat(path);
|
|
64
|
+
return true;
|
|
65
|
+
}
|
|
66
|
+
catch (error) {
|
|
67
|
+
if (error.code === 'ENOENT' || error.code === 'ENOTDIR')
|
|
68
|
+
return false;
|
|
69
|
+
throw unavailable();
|
|
70
|
+
}
|
|
71
|
+
}
|
|
72
|
+
async function ownDirectory(path) {
|
|
73
|
+
try {
|
|
74
|
+
const stat = await lstat(path);
|
|
75
|
+
if (!stat.isDirectory() || stat.isSymbolicLink())
|
|
76
|
+
throw unavailable();
|
|
77
|
+
}
|
|
78
|
+
catch (error) {
|
|
79
|
+
if (error.code !== 'ENOENT' && error.code !== 'ENOTDIR')
|
|
80
|
+
throw unavailable();
|
|
81
|
+
}
|
|
82
|
+
}
|
|
83
|
+
async function readConfiguration(path, signal) {
|
|
84
|
+
signal.throwIfAborted();
|
|
85
|
+
let file, bytes;
|
|
86
|
+
try {
|
|
87
|
+
// A selected project may be an alias; check its physical ancestor chain and
|
|
88
|
+
// keep the named file identity stable instead of rejecting the project itself.
|
|
89
|
+
await safePiOmpAncestors(await realpath(dirname(path)));
|
|
90
|
+
const entry = await lstat(path);
|
|
91
|
+
if (entry.isSymbolicLink() || !entry.isFile() || entry.nlink !== 1)
|
|
92
|
+
throw unavailable();
|
|
93
|
+
file = await open(path, constants.O_RDONLY | constants.O_NOFOLLOW | constants.O_NONBLOCK);
|
|
94
|
+
const before = await file.stat();
|
|
95
|
+
if (!before.isFile() ||
|
|
96
|
+
before.nlink !== 1 ||
|
|
97
|
+
before.dev !== entry.dev ||
|
|
98
|
+
before.ino !== entry.ino ||
|
|
99
|
+
before.size > 1_048_576)
|
|
100
|
+
throw unavailable();
|
|
101
|
+
bytes = Buffer.alloc(before.size + 1);
|
|
102
|
+
let offset = 0;
|
|
103
|
+
while (offset < bytes.length) {
|
|
104
|
+
signal.throwIfAborted();
|
|
105
|
+
const { bytesRead } = await file.read(bytes, offset, bytes.length - offset, offset);
|
|
106
|
+
if (!bytesRead)
|
|
107
|
+
break;
|
|
108
|
+
offset += bytesRead;
|
|
109
|
+
}
|
|
110
|
+
const after = await file.stat();
|
|
111
|
+
const current = await lstat(path);
|
|
112
|
+
if (current.isSymbolicLink() ||
|
|
113
|
+
current.dev !== before.dev ||
|
|
114
|
+
current.ino !== before.ino ||
|
|
115
|
+
current.nlink !== 1 ||
|
|
116
|
+
offset !== before.size ||
|
|
117
|
+
after.size !== before.size ||
|
|
118
|
+
after.mtimeMs !== before.mtimeMs ||
|
|
119
|
+
current.size !== after.size ||
|
|
120
|
+
current.mtimeMs !== after.mtimeMs)
|
|
121
|
+
throw unavailable();
|
|
122
|
+
return bytes.subarray(0, before.size).toString('utf8');
|
|
123
|
+
}
|
|
124
|
+
catch (error) {
|
|
125
|
+
signal.throwIfAborted();
|
|
126
|
+
if (error.code === 'ENOENT' || error.code === 'ENOTDIR')
|
|
127
|
+
return undefined;
|
|
128
|
+
throw unavailable();
|
|
129
|
+
}
|
|
130
|
+
finally {
|
|
131
|
+
bytes?.fill(0);
|
|
132
|
+
await file?.close();
|
|
133
|
+
}
|
|
134
|
+
}
|
|
135
|
+
/** Auth.Service reads this file independently of model/project configuration. */
|
|
136
|
+
export async function readMimoOwnAuth(signal) {
|
|
137
|
+
const { data } = mimoConfigurationPaths();
|
|
138
|
+
await safePiOmpAncestors(data);
|
|
139
|
+
for (const directory of [process.env.MIMOCODE_HOME, data])
|
|
140
|
+
if (directory)
|
|
141
|
+
await ownDirectory(directory);
|
|
142
|
+
const text = await readConfiguration(join(data, 'auth.json'), signal);
|
|
143
|
+
if (!text)
|
|
144
|
+
return {};
|
|
145
|
+
try {
|
|
146
|
+
const auth = JSON.parse(text);
|
|
147
|
+
if (!auth || typeof auth !== 'object' || Array.isArray(auth))
|
|
148
|
+
throw unavailable();
|
|
149
|
+
return auth;
|
|
150
|
+
}
|
|
151
|
+
catch {
|
|
152
|
+
throw unavailable();
|
|
153
|
+
}
|
|
154
|
+
}
|
|
155
|
+
export async function readMimoAccount(signal) {
|
|
156
|
+
const auth = (await readMimoOwnAuth(signal)).xiaomi;
|
|
157
|
+
signal.throwIfAborted();
|
|
158
|
+
if (!auth)
|
|
159
|
+
return { state: 'unconfigured', summary: '尚未登录 MiMo', verification: 'local' };
|
|
160
|
+
// The built-in browser login persists ApiAuth, including optional uid/base_url metadata.
|
|
161
|
+
if (auth.type === 'api' && typeof auth.key === 'string' && auth.key.trim())
|
|
162
|
+
return { state: 'authenticated', summary: 'MiMo 登录', authMethod: 'api', verification: 'local' };
|
|
163
|
+
return { state: 'configured', summary: '已配置 MiMo 账号,请检查登录', verification: 'local' };
|
|
164
|
+
}
|
|
165
|
+
/** Only unavoidable external inputs remain relevant in an isolated account terminal. */
|
|
166
|
+
export async function assertMimoAccountConfiguration(signal) {
|
|
167
|
+
if (Object.values(await readMimoOwnAuth(signal)).some((value) => value?.type === 'wellknown'))
|
|
168
|
+
throw remote();
|
|
169
|
+
if (process.platform === 'darwin')
|
|
170
|
+
for (const path of [
|
|
171
|
+
join('/Library/Managed Preferences', userInfo().username, 'ai.opencode.managed.plist'),
|
|
172
|
+
'/Library/Managed Preferences/ai.opencode.managed.plist',
|
|
173
|
+
])
|
|
174
|
+
if (await exists(path))
|
|
175
|
+
throw unavailable();
|
|
176
|
+
signal.throwIfAborted();
|
|
177
|
+
}
|
|
178
|
+
/** Native Config.Service expands references before returning metadata, so inspect before spawning it. */
|
|
179
|
+
export async function assertMimoConfiguration(project, signal) {
|
|
180
|
+
signal.throwIfAborted();
|
|
181
|
+
const { home, config, data } = mimoConfigurationPaths();
|
|
182
|
+
for (const directory of [process.env.MIMOCODE_HOME, config, data, join(home, '.mimocode')])
|
|
183
|
+
if (directory)
|
|
184
|
+
await ownDirectory(directory);
|
|
185
|
+
for (const path of await mimoConfigurationFiles(project)) {
|
|
186
|
+
if (basename(dirname(path)) === '.mimocode')
|
|
187
|
+
await ownDirectory(dirname(path));
|
|
188
|
+
const text = await readConfiguration(path, signal);
|
|
189
|
+
// Native substitution happens on raw JSON/JSONC before parsing, including non-auth fields.
|
|
190
|
+
if (text && /\{(?:file|env):/.test(text))
|
|
191
|
+
throw interpolation();
|
|
192
|
+
}
|
|
193
|
+
// Legacy TOML is imported by native code; managed OpenCode sources do not belong to this CLI.
|
|
194
|
+
const unsupported = [join(config, 'config')];
|
|
195
|
+
const managed = process.platform === 'darwin'
|
|
196
|
+
? '/Library/Application Support/opencode'
|
|
197
|
+
: process.platform === 'win32'
|
|
198
|
+
? join(process.env.ProgramData || 'C:\\ProgramData', 'opencode')
|
|
199
|
+
: '/etc/opencode';
|
|
200
|
+
unsupported.push(join(managed, 'mimocode.json'), join(managed, 'mimocode.jsonc'));
|
|
201
|
+
if (process.platform === 'darwin')
|
|
202
|
+
unsupported.push(join('/Library/Managed Preferences', userInfo().username, 'ai.opencode.managed.plist'), '/Library/Managed Preferences/ai.opencode.managed.plist');
|
|
203
|
+
for (const path of unsupported)
|
|
204
|
+
if (await exists(path))
|
|
205
|
+
throw unavailable();
|
|
206
|
+
const authText = await readConfiguration(join(data, 'auth.json'), signal);
|
|
207
|
+
if (authText) {
|
|
208
|
+
let auth;
|
|
209
|
+
try {
|
|
210
|
+
auth = JSON.parse(authText);
|
|
211
|
+
}
|
|
212
|
+
catch {
|
|
213
|
+
throw unavailable();
|
|
214
|
+
}
|
|
215
|
+
if (!auth || typeof auth !== 'object' || Array.isArray(auth))
|
|
216
|
+
throw unavailable();
|
|
217
|
+
if (Object.values(auth).some((value) => value?.type === 'wellknown'))
|
|
218
|
+
throw remote();
|
|
219
|
+
}
|
|
220
|
+
// An active console org supplies remote JSON that native then interpolates. Only inspect its
|
|
221
|
+
// presence; no tokens, account details, or remote config are read or requested here.
|
|
222
|
+
let names;
|
|
223
|
+
try {
|
|
224
|
+
names = await readdir(data);
|
|
225
|
+
}
|
|
226
|
+
catch (error) {
|
|
227
|
+
if (error.code !== 'ENOENT')
|
|
228
|
+
throw unavailable();
|
|
229
|
+
names = [];
|
|
230
|
+
}
|
|
231
|
+
for (const name of names.filter((name) => /^mimocode(?:-[A-Za-z0-9._-]+)?\.db$/.test(name))) {
|
|
232
|
+
signal.throwIfAborted();
|
|
233
|
+
const path = join(data, name);
|
|
234
|
+
const stat = await lstat(path);
|
|
235
|
+
if (!stat.isFile() || stat.isSymbolicLink() || stat.nlink !== 1)
|
|
236
|
+
throw unavailable();
|
|
237
|
+
const { DatabaseSync } = await import('node:sqlite');
|
|
238
|
+
signal.throwIfAborted();
|
|
239
|
+
let db;
|
|
240
|
+
let active = false;
|
|
241
|
+
try {
|
|
242
|
+
db = new DatabaseSync(path, { readOnly: true, allowExtension: false });
|
|
243
|
+
db.exec('PRAGMA query_only = ON; PRAGMA trusted_schema = OFF');
|
|
244
|
+
if (db.prepare("SELECT 1 FROM sqlite_master WHERE type = 'table' AND name = 'account_state'").get())
|
|
245
|
+
active = !!db.prepare('SELECT 1 FROM account_state WHERE active_org_id IS NOT NULL LIMIT 1').get();
|
|
246
|
+
}
|
|
247
|
+
catch {
|
|
248
|
+
throw unavailable();
|
|
249
|
+
}
|
|
250
|
+
finally {
|
|
251
|
+
db?.close();
|
|
252
|
+
}
|
|
253
|
+
if (active)
|
|
254
|
+
throw remote();
|
|
255
|
+
}
|
|
256
|
+
signal.throwIfAborted();
|
|
257
|
+
}
|
|
258
|
+
//# sourceMappingURL=mimo-configuration.js.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"mimo-configuration.js","sourceRoot":"","sources":["../../../src/host/mimo-configuration.ts"],"names":[],"mappings":"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"}
|
|
@@ -0,0 +1,22 @@
|
|
|
1
|
+
import type { FirstPartyModelSource } from './first-party-models.ts';
|
|
2
|
+
export interface MimoOwnSnapshot {
|
|
3
|
+
authPath: string;
|
|
4
|
+
auth: Record<string, any>;
|
|
5
|
+
configurations: {
|
|
6
|
+
path: string;
|
|
7
|
+
value: Record<string, any>;
|
|
8
|
+
}[];
|
|
9
|
+
}
|
|
10
|
+
/** No raw environment, configuration or account material is retained in the cache key. */
|
|
11
|
+
export declare function nativeMetadataKey(executable: string, project: string, snapshot: unknown, signal: AbortSignal): Promise<string | undefined>;
|
|
12
|
+
export declare const mimoMetadataKey: typeof nativeMetadataKey;
|
|
13
|
+
/** Only native capabilities are reused. Remote entitlement discovery must still run on every call. */
|
|
14
|
+
export declare class MimoMetadataCache {
|
|
15
|
+
private readonly ttlMs;
|
|
16
|
+
private readonly limit;
|
|
17
|
+
private readonly entries;
|
|
18
|
+
constructor(ttlMs?: number, limit?: number);
|
|
19
|
+
get(key: string | undefined, own: MimoOwnSnapshot): FirstPartyModelSource[] | undefined;
|
|
20
|
+
set(key: string | undefined, sources: FirstPartyModelSource[], own: MimoOwnSnapshot): void;
|
|
21
|
+
}
|
|
22
|
+
export declare const mimoMetadataCache: MimoMetadataCache;
|
|
@@ -0,0 +1,121 @@
|
|
|
1
|
+
import { createHash } from 'node:crypto';
|
|
2
|
+
import { realpath, stat } from 'node:fs/promises';
|
|
3
|
+
import { isAbsolute } from 'node:path';
|
|
4
|
+
import { nativeLaunchArgv } from './native-launch.mjs';
|
|
5
|
+
const digest = (value) => createHash('sha256').update(JSON.stringify(value)).digest('hex');
|
|
6
|
+
/** No raw environment, configuration or account material is retained in the cache key. */
|
|
7
|
+
export async function nativeMetadataKey(executable, project, snapshot, signal) {
|
|
8
|
+
signal.throwIfAborted();
|
|
9
|
+
try {
|
|
10
|
+
// Use the same static launch plan as the process boundary. A fixed Bun shim
|
|
11
|
+
// can stay unchanged while its actual runtime or script is upgraded.
|
|
12
|
+
const launch = nativeLaunchArgv([executable]);
|
|
13
|
+
const identities = [];
|
|
14
|
+
for (const path of new Set([executable, ...launch.filter(isAbsolute)])) {
|
|
15
|
+
const entry = await realpath(path), identity = await stat(entry);
|
|
16
|
+
signal.throwIfAborted();
|
|
17
|
+
if (!identity.isFile())
|
|
18
|
+
return;
|
|
19
|
+
identities.push([entry, identity.dev, identity.ino, identity.size, identity.mtimeMs, identity.ctimeMs]);
|
|
20
|
+
}
|
|
21
|
+
const physicalProject = await realpath(project);
|
|
22
|
+
signal.throwIfAborted();
|
|
23
|
+
return digest({
|
|
24
|
+
launch,
|
|
25
|
+
project,
|
|
26
|
+
physicalProject,
|
|
27
|
+
identities,
|
|
28
|
+
environment: Object.entries(process.env).sort(([a], [b]) => a.localeCompare(b)),
|
|
29
|
+
snapshot,
|
|
30
|
+
});
|
|
31
|
+
}
|
|
32
|
+
catch {
|
|
33
|
+
signal.throwIfAborted();
|
|
34
|
+
// An unverifiable executable still follows the uncached native validation path.
|
|
35
|
+
return;
|
|
36
|
+
}
|
|
37
|
+
}
|
|
38
|
+
export const mimoMetadataKey = nativeMetadataKey;
|
|
39
|
+
function currentCredential(source, own) {
|
|
40
|
+
for (const path of source.sourceIds) {
|
|
41
|
+
const value = path === own.authPath
|
|
42
|
+
? own.auth[source.provider]
|
|
43
|
+
: {
|
|
44
|
+
type: 'api',
|
|
45
|
+
key: own.configurations.find((item) => item.path === path)?.value.provider?.[source.provider]
|
|
46
|
+
?.options?.apiKey,
|
|
47
|
+
};
|
|
48
|
+
if (value?.type !== 'api' || typeof value.key !== 'string' || !value.key)
|
|
49
|
+
continue;
|
|
50
|
+
const credential = { type: 'api', key: value.key };
|
|
51
|
+
if (digest(credential) === source.credentialHash)
|
|
52
|
+
return credential;
|
|
53
|
+
}
|
|
54
|
+
}
|
|
55
|
+
/** Only native capabilities are reused. Remote entitlement discovery must still run on every call. */
|
|
56
|
+
export class MimoMetadataCache {
|
|
57
|
+
ttlMs;
|
|
58
|
+
limit;
|
|
59
|
+
entries = new Map();
|
|
60
|
+
constructor(ttlMs = 30_000, limit = 16) {
|
|
61
|
+
this.ttlMs = ttlMs;
|
|
62
|
+
this.limit = limit;
|
|
63
|
+
}
|
|
64
|
+
get(key, own) {
|
|
65
|
+
if (!key)
|
|
66
|
+
return;
|
|
67
|
+
const entry = this.entries.get(key), now = Date.now();
|
|
68
|
+
if (!entry)
|
|
69
|
+
return;
|
|
70
|
+
if (now < entry.created || now - entry.created >= this.ttlMs) {
|
|
71
|
+
this.entries.delete(key);
|
|
72
|
+
return;
|
|
73
|
+
}
|
|
74
|
+
const sources = [];
|
|
75
|
+
for (const metadata of entry.sources) {
|
|
76
|
+
const credential = currentCredential(metadata, own);
|
|
77
|
+
if (!credential) {
|
|
78
|
+
this.entries.delete(key);
|
|
79
|
+
return;
|
|
80
|
+
}
|
|
81
|
+
const { credentialHash: _, ...source } = metadata;
|
|
82
|
+
sources.push({ ...structuredClone(source), credential });
|
|
83
|
+
}
|
|
84
|
+
return sources;
|
|
85
|
+
}
|
|
86
|
+
set(key, sources, own) {
|
|
87
|
+
if (!key || !sources.length)
|
|
88
|
+
return;
|
|
89
|
+
const metadata = [];
|
|
90
|
+
for (const source of sources) {
|
|
91
|
+
if (source.credential.type !== 'api')
|
|
92
|
+
return;
|
|
93
|
+
// A user-defined URL may itself carry a credential; such sources stay uncached.
|
|
94
|
+
try {
|
|
95
|
+
const url = new URL(source.baseUrl || '');
|
|
96
|
+
if (url.username || url.password || url.search || url.hash)
|
|
97
|
+
return;
|
|
98
|
+
}
|
|
99
|
+
catch {
|
|
100
|
+
return;
|
|
101
|
+
}
|
|
102
|
+
const { credential, ...capabilities } = source;
|
|
103
|
+
if (credential.key && JSON.stringify(capabilities).includes(credential.key))
|
|
104
|
+
return;
|
|
105
|
+
const entry = { ...structuredClone(capabilities), credentialHash: digest(credential) };
|
|
106
|
+
if (!currentCredential(entry, own))
|
|
107
|
+
return;
|
|
108
|
+
metadata.push(entry);
|
|
109
|
+
}
|
|
110
|
+
const now = Date.now();
|
|
111
|
+
for (const [id, entry] of this.entries)
|
|
112
|
+
if (now < entry.created || now - entry.created >= this.ttlMs)
|
|
113
|
+
this.entries.delete(id);
|
|
114
|
+
this.entries.delete(key);
|
|
115
|
+
this.entries.set(key, { created: now, sources: metadata });
|
|
116
|
+
while (this.entries.size > this.limit)
|
|
117
|
+
this.entries.delete(this.entries.keys().next().value);
|
|
118
|
+
}
|
|
119
|
+
}
|
|
120
|
+
export const mimoMetadataCache = new MimoMetadataCache();
|
|
121
|
+
//# sourceMappingURL=mimo-metadata-cache.js.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"mimo-metadata-cache.js","sourceRoot":"","sources":["../../../src/host/mimo-metadata-cache.ts"],"names":[],"mappings":"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"}
|
|
@@ -0,0 +1,11 @@
|
|
|
1
|
+
/** Hash current bounded own files without retaining file content or following links. */
|
|
2
|
+
export declare function metadataFileFingerprint(path: string, signal: AbortSignal): Promise<string | undefined>;
|
|
3
|
+
/** Callers admit only validated public capabilities, never account status or raw CLI output. */
|
|
4
|
+
export declare class NativeCapabilityCache<T> {
|
|
5
|
+
private readonly ttlMs;
|
|
6
|
+
private readonly limit;
|
|
7
|
+
private readonly entries;
|
|
8
|
+
constructor(ttlMs?: number, limit?: number);
|
|
9
|
+
get(key: string | undefined): T | undefined;
|
|
10
|
+
set(key: string | undefined, value: T): void;
|
|
11
|
+
}
|