@skrr-ai/auth-core 0.1.2
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/README.md +21 -0
- package/dist/cjs/aead.d.ts +24 -0
- package/dist/cjs/aead.js +65 -0
- package/dist/cjs/authExpiredDetector.d.ts +65 -0
- package/dist/cjs/authExpiredDetector.js +89 -0
- package/dist/cjs/authHelper.d.ts +51 -0
- package/dist/cjs/authHelper.js +321 -0
- package/dist/cjs/credentialEnvelope.d.ts +85 -0
- package/dist/cjs/credentialEnvelope.js +230 -0
- package/dist/cjs/credentialEnvelopeBridge.d.ts +116 -0
- package/dist/cjs/credentialEnvelopeBridge.js +637 -0
- package/dist/cjs/credentialResolver.d.ts +278 -0
- package/dist/cjs/credentialResolver.js +423 -0
- package/dist/cjs/daemonPair.d.ts +172 -0
- package/dist/cjs/daemonPair.js +495 -0
- package/dist/cjs/daemonScopes.d.ts +74 -0
- package/dist/cjs/daemonScopes.js +84 -0
- package/dist/cjs/deviceIdentityBridge.d.ts +113 -0
- package/dist/cjs/deviceIdentityBridge.js +591 -0
- package/dist/cjs/deviceKey.d.ts +167 -0
- package/dist/cjs/deviceKey.js +332 -0
- package/dist/cjs/fdToken.d.ts +17 -0
- package/dist/cjs/fdToken.js +238 -0
- package/dist/cjs/harnessTrust.d.ts +72 -0
- package/dist/cjs/harnessTrust.js +103 -0
- package/dist/cjs/headers-helper.d.ts +25 -0
- package/dist/cjs/headers-helper.js +323 -0
- package/dist/cjs/index.d.ts +37 -0
- package/dist/cjs/index.js +305 -0
- package/dist/cjs/jwtUtils.d.ts +35 -0
- package/dist/cjs/jwtUtils.js +61 -0
- package/dist/cjs/kek/index.d.ts +89 -0
- package/dist/cjs/kek/index.js +208 -0
- package/dist/cjs/kek/linux.d.ts +92 -0
- package/dist/cjs/kek/linux.js +596 -0
- package/dist/cjs/kek/macos.d.ts +112 -0
- package/dist/cjs/kek/macos.js +599 -0
- package/dist/cjs/kek/types.d.ts +111 -0
- package/dist/cjs/kek/types.js +43 -0
- package/dist/cjs/kek/windows.d.ts +71 -0
- package/dist/cjs/kek/windows.js +350 -0
- package/dist/cjs/kek/zeroize-registry.d.ts +44 -0
- package/dist/cjs/kek/zeroize-registry.js +63 -0
- package/dist/cjs/legacyStatePreflight.d.ts +67 -0
- package/dist/cjs/legacyStatePreflight.js +78 -0
- package/dist/cjs/localIdentity.d.ts +54 -0
- package/dist/cjs/localIdentity.js +57 -0
- package/dist/cjs/loginLocalhost.d.ts +115 -0
- package/dist/cjs/loginLocalhost.js +368 -0
- package/dist/cjs/loginWithLocalhost.d.ts +131 -0
- package/dist/cjs/loginWithLocalhost.js +359 -0
- package/dist/cjs/machineId.d.ts +35 -0
- package/dist/cjs/machineId.js +239 -0
- package/dist/cjs/messages.d.ts +9 -0
- package/dist/cjs/messages.js +44 -0
- package/dist/cjs/package.json +3 -0
- package/dist/cjs/pkce.d.ts +62 -0
- package/dist/cjs/pkce.js +158 -0
- package/dist/cjs/recoveryCode.d.ts +61 -0
- package/dist/cjs/recoveryCode.js +213 -0
- package/dist/cjs/refresh.d.ts +215 -0
- package/dist/cjs/refresh.js +877 -0
- package/dist/cjs/refreshClassification.d.ts +53 -0
- package/dist/cjs/refreshClassification.js +105 -0
- package/dist/cjs/refreshScheduler.d.ts +53 -0
- package/dist/cjs/refreshScheduler.js +332 -0
- package/dist/cjs/runtime.d.ts +149 -0
- package/dist/cjs/runtime.js +136 -0
- package/dist/cjs/spawnEnv.d.ts +76 -0
- package/dist/cjs/spawnEnv.js +153 -0
- package/dist/cjs/ttlParser.d.ts +54 -0
- package/dist/cjs/ttlParser.js +87 -0
- package/dist/cjs/types.d.ts +91 -0
- package/dist/cjs/types.js +26 -0
- package/dist/esm/aead.d.ts +24 -0
- package/dist/esm/aead.js +57 -0
- package/dist/esm/authExpiredDetector.d.ts +65 -0
- package/dist/esm/authExpiredDetector.js +85 -0
- package/dist/esm/authHelper.d.ts +51 -0
- package/dist/esm/authHelper.js +311 -0
- package/dist/esm/credentialEnvelope.d.ts +85 -0
- package/dist/esm/credentialEnvelope.js +213 -0
- package/dist/esm/credentialEnvelopeBridge.d.ts +116 -0
- package/dist/esm/credentialEnvelopeBridge.js +620 -0
- package/dist/esm/credentialResolver.d.ts +278 -0
- package/dist/esm/credentialResolver.js +414 -0
- package/dist/esm/daemonPair.d.ts +172 -0
- package/dist/esm/daemonPair.js +476 -0
- package/dist/esm/daemonScopes.d.ts +74 -0
- package/dist/esm/daemonScopes.js +80 -0
- package/dist/esm/deviceIdentityBridge.d.ts +113 -0
- package/dist/esm/deviceIdentityBridge.js +572 -0
- package/dist/esm/deviceKey.d.ts +167 -0
- package/dist/esm/deviceKey.js +320 -0
- package/dist/esm/fdToken.d.ts +17 -0
- package/dist/esm/fdToken.js +231 -0
- package/dist/esm/harnessTrust.d.ts +72 -0
- package/dist/esm/harnessTrust.js +97 -0
- package/dist/esm/headers-helper.d.ts +25 -0
- package/dist/esm/headers-helper.js +316 -0
- package/dist/esm/index.d.ts +37 -0
- package/dist/esm/index.js +144 -0
- package/dist/esm/jwtUtils.d.ts +35 -0
- package/dist/esm/jwtUtils.js +57 -0
- package/dist/esm/kek/index.d.ts +89 -0
- package/dist/esm/kek/index.js +162 -0
- package/dist/esm/kek/linux.d.ts +92 -0
- package/dist/esm/kek/linux.js +585 -0
- package/dist/esm/kek/macos.d.ts +112 -0
- package/dist/esm/kek/macos.js +586 -0
- package/dist/esm/kek/types.d.ts +111 -0
- package/dist/esm/kek/types.js +39 -0
- package/dist/esm/kek/windows.d.ts +71 -0
- package/dist/esm/kek/windows.js +344 -0
- package/dist/esm/kek/zeroize-registry.d.ts +44 -0
- package/dist/esm/kek/zeroize-registry.js +58 -0
- package/dist/esm/legacyStatePreflight.d.ts +67 -0
- package/dist/esm/legacyStatePreflight.js +71 -0
- package/dist/esm/localIdentity.d.ts +54 -0
- package/dist/esm/localIdentity.js +54 -0
- package/dist/esm/loginLocalhost.d.ts +115 -0
- package/dist/esm/loginLocalhost.js +355 -0
- package/dist/esm/loginWithLocalhost.d.ts +131 -0
- package/dist/esm/loginWithLocalhost.js +353 -0
- package/dist/esm/machineId.d.ts +35 -0
- package/dist/esm/machineId.js +231 -0
- package/dist/esm/messages.d.ts +9 -0
- package/dist/esm/messages.js +40 -0
- package/dist/esm/pkce.d.ts +62 -0
- package/dist/esm/pkce.js +148 -0
- package/dist/esm/recoveryCode.d.ts +61 -0
- package/dist/esm/recoveryCode.js +207 -0
- package/dist/esm/refresh.d.ts +215 -0
- package/dist/esm/refresh.js +863 -0
- package/dist/esm/refreshClassification.d.ts +53 -0
- package/dist/esm/refreshClassification.js +106 -0
- package/dist/esm/refreshScheduler.d.ts +53 -0
- package/dist/esm/refreshScheduler.js +329 -0
- package/dist/esm/runtime.d.ts +149 -0
- package/dist/esm/runtime.js +121 -0
- package/dist/esm/spawnEnv.d.ts +76 -0
- package/dist/esm/spawnEnv.js +149 -0
- package/dist/esm/ttlParser.d.ts +54 -0
- package/dist/esm/ttlParser.js +83 -0
- package/dist/esm/types.d.ts +91 -0
- package/dist/esm/types.js +21 -0
- package/package.json +82 -0
|
@@ -0,0 +1,305 @@
|
|
|
1
|
+
"use strict";
|
|
2
|
+
/**
|
|
3
|
+
* @skrr-ai/auth-core — shared auth substrate.
|
|
4
|
+
*
|
|
5
|
+
* Public surface for the OverSky daemon, Sky CLI, and Electron main
|
|
6
|
+
* process. Each consumer calls `configureAuthCore()` once at startup to
|
|
7
|
+
* wire up its logger, config dir, kill switches, and binary name — then
|
|
8
|
+
* uses the rest of the API uniformly.
|
|
9
|
+
*/
|
|
10
|
+
Object.defineProperty(exports, "__esModule", { value: true });
|
|
11
|
+
exports.challenge = exports.generateVerifier = exports.invalidateHeadersHelperCache = exports.runHeadersHelper = exports.SENTINEL_TRIGGERING_FAILURES = exports.__resetAuthHelperFailureReasonForTest = exports.getLastAuthHelperFailureReason = exports.getDefaultHelperTtlMs = exports.invokeAuthHelper = exports.AuthHelperUnavailableError = exports.AuthHelperUntrustedError = exports.CI_TOKEN_PREFIX = exports.classifyTokenKind = exports.invalidateAuthHelperCache = exports.__resetCredentialResolverForTest = exports.CREDENTIAL_PRECEDENCE = exports.CredentialResolver = exports.__setFdReaderForTest = exports.readAuthFromFd = exports.createRefreshScheduler = exports.UNKNOWN_401_BUDGET = exports.__resetUnknown401StreaksForTest = exports.__refreshDiagnostics = exports.installLockExitHandlers = exports.clearReauthState = exports.needsReauthState = exports.persistReauthState = exports.withAuthLock = exports.revokeDaemonRefreshSession = exports.refreshDaemonToken = exports.classifyRefreshResponse = exports.EXIT_NEEDS_REAUTH = exports.formatReauthMessage = exports.handleMidStreamAuthExpiry = exports.isAuthExpiredSseEvent = exports.decodeJwtPayload = exports.decodeJwtExpiry = exports.TransientAuthFailure = exports.PermanentAuthFailure = exports.emitAuthTelemetry = exports.getAuthBinaryName = exports.getAuthKillSwitches = exports.getAuthConfigDir = exports.getAuthLogger = exports.configureAuthCore = exports.OAUTH_CLI_SCOPE = exports.isDaemonScope = exports.VALID_DAEMON_SCOPE_SET = exports.ALL_DAEMON_SCOPES = exports.SCOPES = void 0;
|
|
12
|
+
exports.tokenHash = exports.publicJwkFromX = exports.normalizeHtu = exports.jwkThumbprint = exports.generateDeviceKeyPair = exports.buildDeviceProof = exports.zeroizeKekCaches = exports.WindowsKek = exports.registerZeroizeHook = exports.MacosKek = exports.LinuxKek = exports.KekUnavailableError = exports.UnavailableKek = exports.InMemoryKek = exports.getKekStrategy = exports.__setKekStrategyForTest = exports.credEnvelopeWrap = exports.credEnvelopeUnwrap = exports.credEnvelopeSerialize = exports.credSealBuffer = exports.credOpenBuffer = exports.CRED_KEY_LEN = exports.isCredEnvelopeString = exports.generateDek = exports.CRED_ENVELOPE_MAGIC = exports.credEnvelopeEncrypt = exports.credEnvelopeDeserialize = exports.credEnvelopeDecrypt = exports.buildCredentialAad = exports.isValidRecoveryCode = exports.normalizeRecoveryCode = exports.parseRecoveryCode = exports.formatRecoveryCode = exports.MAX_TTL_DAYS = exports.MIN_TTL_DAYS = exports.parseTtlDays = exports.LoginExchangeError = exports.LoginInitError = exports.loginWithLocalhost = exports.LocalCallbackMalformedError = exports.LocalCallbackDeniedError = exports.LocalCallbackStateMismatchError = exports.LocalCallbackTimeoutError = exports.LocalCallbackBindError = exports.LocalCallbackError = exports.DEFAULT_LOGIN_TIMEOUT_MS = exports.startLocalCallback = exports.verifyChallenge = exports.safeEqual = exports.generateState = void 0;
|
|
13
|
+
exports.getHarnessTier = exports.HARNESS_TIERS = exports.pairUint8ArrayToBase64Url = exports.pairUint8ArrayToBase64 = exports.parsePairUrl = exports.parsePairPlaintext = exports.parsePairBundle = exports.openPairBundleBase64 = exports.generatePairKeyPair = exports.buildPairUrl = exports.buildPairAad = exports.pairBase64UrlToUint8Array = exports.pairBase64ToUint8Array = exports.assemblePairBundleBase64 = exports.PairBundleError = exports.PAIR_SECRET_LEN = exports.PAIR_PUBKEY_LEN = exports.PAIR_NONCE_LEN = exports.PAIR_BUNDLE_MAX_BASE64_LEN = exports.PAIR_AAD_MAX_LEN = exports.PAIR_AAD_PREFIX = exports.__resetCachedDaemonIdForTest = exports.legacyDaemonUuids = exports.ensureMachineDaemonId = exports.__getDeviceIdentityStateForTest = exports.__setDeviceIdentityStateForTest = exports.__enrollmentBackoffPathForTest = exports.__enrollmentMarkerPathForTest = exports.__privateKeyPathForTest = exports.__publicKeyPathForTest = exports.describeDeviceIdentityState = exports.getDevicePublicKey = exports.isDeviceIdentityActive = exports.clearEnrollmentMarker = exports.enrollWithServer = exports.signServerRequest = exports.resetDeviceIdentity = exports.initDeviceIdentity = exports.__resetShutdownGuardForTest = exports.__getCredEnvelopeStateForTest = exports.__setCredEnvelopeStateForTest = exports.__wrappedDekFilePathForTest = exports.maybeDecryptOnRead = exports.maybeEncryptForWrite = exports.describeCredEnvelopeState = exports.isCredEnvelopeActive = exports.shutdownCredEnvelope = exports.resetCredEnvelope = exports.initCredEnvelope = exports.verifyDeviceProof = void 0;
|
|
14
|
+
exports.describeLegacyState = exports.findLegacyLocalState = exports.DEFAULT_BINARY_NAME = exports.LEGACY_NATIVE_ID_PREFIXES = exports.NATIVE_ID_PREFIX = exports.LEGACY_CONFIG_DIR_NAMES = exports.CONFIG_DIR_NAME = exports.SENSITIVE_ENV_PREFIX_EXCEPTIONS = exports.SENSITIVE_ENV_SUFFIXES = exports.SENSITIVE_ENV_PREFIXES = exports.SENSITIVE_ENV_VARS = exports.sanitizeSpawnEnv = exports.tierPermitsConfiguredAutoMode = exports.credentialPolicyForTier = void 0;
|
|
15
|
+
// Daemon scope vocabulary — single source of truth for non-Mongoose tiers
|
|
16
|
+
// (daemon, desktop, cli). Schema-bound canonical lives in
|
|
17
|
+
// `@skrr-ai/data-schemas/common/daemonScopes`; the two are kept byte-equal
|
|
18
|
+
// by the api-side parity test. See daemonScopes.ts header for details.
|
|
19
|
+
var daemonScopes_js_1 = require("./daemonScopes.js");
|
|
20
|
+
Object.defineProperty(exports, "SCOPES", { enumerable: true, get: function () { return daemonScopes_js_1.SCOPES; } });
|
|
21
|
+
Object.defineProperty(exports, "ALL_DAEMON_SCOPES", { enumerable: true, get: function () { return daemonScopes_js_1.ALL_DAEMON_SCOPES; } });
|
|
22
|
+
Object.defineProperty(exports, "VALID_DAEMON_SCOPE_SET", { enumerable: true, get: function () { return daemonScopes_js_1.VALID_DAEMON_SCOPE_SET; } });
|
|
23
|
+
Object.defineProperty(exports, "isDaemonScope", { enumerable: true, get: function () { return daemonScopes_js_1.isDaemonScope; } });
|
|
24
|
+
Object.defineProperty(exports, "OAUTH_CLI_SCOPE", { enumerable: true, get: function () { return daemonScopes_js_1.OAUTH_CLI_SCOPE; } });
|
|
25
|
+
// Runtime / DI
|
|
26
|
+
var runtime_js_1 = require("./runtime.js");
|
|
27
|
+
Object.defineProperty(exports, "configureAuthCore", { enumerable: true, get: function () { return runtime_js_1.configureAuthCore; } });
|
|
28
|
+
Object.defineProperty(exports, "getAuthLogger", { enumerable: true, get: function () { return runtime_js_1.getAuthLogger; } });
|
|
29
|
+
Object.defineProperty(exports, "getAuthConfigDir", { enumerable: true, get: function () { return runtime_js_1.getAuthConfigDir; } });
|
|
30
|
+
Object.defineProperty(exports, "getAuthKillSwitches", { enumerable: true, get: function () { return runtime_js_1.getAuthKillSwitches; } });
|
|
31
|
+
Object.defineProperty(exports, "getAuthBinaryName", { enumerable: true, get: function () { return runtime_js_1.getAuthBinaryName; } });
|
|
32
|
+
Object.defineProperty(exports, "emitAuthTelemetry", { enumerable: true, get: function () { return runtime_js_1.emitAuthTelemetry; } });
|
|
33
|
+
// Types
|
|
34
|
+
var types_js_1 = require("./types.js");
|
|
35
|
+
Object.defineProperty(exports, "PermanentAuthFailure", { enumerable: true, get: function () { return types_js_1.PermanentAuthFailure; } });
|
|
36
|
+
Object.defineProperty(exports, "TransientAuthFailure", { enumerable: true, get: function () { return types_js_1.TransientAuthFailure; } });
|
|
37
|
+
// JWT helpers
|
|
38
|
+
var jwtUtils_js_1 = require("./jwtUtils.js");
|
|
39
|
+
Object.defineProperty(exports, "decodeJwtExpiry", { enumerable: true, get: function () { return jwtUtils_js_1.decodeJwtExpiry; } });
|
|
40
|
+
Object.defineProperty(exports, "decodeJwtPayload", { enumerable: true, get: function () { return jwtUtils_js_1.decodeJwtPayload; } });
|
|
41
|
+
// Mid-stream auth-expired SSE detector — recognises terminal "auth_expired"
|
|
42
|
+
// events from long-lived SSE / Socket.IO streams and orchestrates a
|
|
43
|
+
// refresher-driven recovery. Mobile RN keeps a byte-equal mirror; see file
|
|
44
|
+
// header.
|
|
45
|
+
var authExpiredDetector_js_1 = require("./authExpiredDetector.js");
|
|
46
|
+
Object.defineProperty(exports, "isAuthExpiredSseEvent", { enumerable: true, get: function () { return authExpiredDetector_js_1.isAuthExpiredSseEvent; } });
|
|
47
|
+
Object.defineProperty(exports, "handleMidStreamAuthExpiry", { enumerable: true, get: function () { return authExpiredDetector_js_1.handleMidStreamAuthExpiry; } });
|
|
48
|
+
// Reauth messaging
|
|
49
|
+
var messages_js_1 = require("./messages.js");
|
|
50
|
+
Object.defineProperty(exports, "formatReauthMessage", { enumerable: true, get: function () { return messages_js_1.formatReauthMessage; } });
|
|
51
|
+
Object.defineProperty(exports, "EXIT_NEEDS_REAUTH", { enumerable: true, get: function () { return messages_js_1.EXIT_NEEDS_REAUTH; } });
|
|
52
|
+
// Pure HTTP→{Permanent, Transient, Success} response classification —
|
|
53
|
+
// exposed so RN-side clients can apply the same mapping daemon uses.
|
|
54
|
+
var refreshClassification_js_1 = require("./refreshClassification.js");
|
|
55
|
+
Object.defineProperty(exports, "classifyRefreshResponse", { enumerable: true, get: function () { return refreshClassification_js_1.classifyRefreshResponse; } });
|
|
56
|
+
// Refresh
|
|
57
|
+
var refresh_js_1 = require("./refresh.js");
|
|
58
|
+
Object.defineProperty(exports, "refreshDaemonToken", { enumerable: true, get: function () { return refresh_js_1.refreshDaemonToken; } });
|
|
59
|
+
Object.defineProperty(exports, "revokeDaemonRefreshSession", { enumerable: true, get: function () { return refresh_js_1.revokeDaemonRefreshSession; } });
|
|
60
|
+
Object.defineProperty(exports, "withAuthLock", { enumerable: true, get: function () { return refresh_js_1.withAuthLock; } });
|
|
61
|
+
Object.defineProperty(exports, "persistReauthState", { enumerable: true, get: function () { return refresh_js_1.persistReauthState; } });
|
|
62
|
+
Object.defineProperty(exports, "needsReauthState", { enumerable: true, get: function () { return refresh_js_1.needsReauthState; } });
|
|
63
|
+
Object.defineProperty(exports, "clearReauthState", { enumerable: true, get: function () { return refresh_js_1.clearReauthState; } });
|
|
64
|
+
Object.defineProperty(exports, "installLockExitHandlers", { enumerable: true, get: function () { return refresh_js_1.installLockExitHandlers; } });
|
|
65
|
+
// H1 — Test-only diagnostic counters that prove every outgoing
|
|
66
|
+
// refresh request mints a fresh proof. Production code never reads
|
|
67
|
+
// this; tests use it to assert the per-attempt invariant.
|
|
68
|
+
Object.defineProperty(exports, "__refreshDiagnostics", { enumerable: true, get: function () { return refresh_js_1.__refreshDiagnostics; } });
|
|
69
|
+
// Finding 4 — Test-only reset for the per-daemonId unknown-shape-401
|
|
70
|
+
// retry budget. Lets tests start each case with a clean streak.
|
|
71
|
+
Object.defineProperty(exports, "__resetUnknown401StreaksForTest", { enumerable: true, get: function () { return refresh_js_1.__resetUnknown401StreaksForTest; } });
|
|
72
|
+
// Finding 4 follow-up (BOOT-BUDGET COUPLING) — consumed by the daemon's
|
|
73
|
+
// startup-recovery loop to statically assert
|
|
74
|
+
// `STARTUP_RECOVERY_MAX_ATTEMPTS >= UNKNOWN_401_BUDGET` so the in-process
|
|
75
|
+
// unknown-401 latch always fires before the boot loop yields to the
|
|
76
|
+
// supervisor. See daemon/src/auth.ts.
|
|
77
|
+
Object.defineProperty(exports, "UNKNOWN_401_BUDGET", { enumerable: true, get: function () { return refresh_js_1.UNKNOWN_401_BUDGET; } });
|
|
78
|
+
// Refresh scheduler
|
|
79
|
+
var refreshScheduler_js_1 = require("./refreshScheduler.js");
|
|
80
|
+
Object.defineProperty(exports, "createRefreshScheduler", { enumerable: true, get: function () { return refreshScheduler_js_1.createRefreshScheduler; } });
|
|
81
|
+
// Fd handoff
|
|
82
|
+
var fdToken_js_1 = require("./fdToken.js");
|
|
83
|
+
Object.defineProperty(exports, "readAuthFromFd", { enumerable: true, get: function () { return fdToken_js_1.readAuthFromFd; } });
|
|
84
|
+
Object.defineProperty(exports, "__setFdReaderForTest", { enumerable: true, get: function () { return fdToken_js_1.__setFdReaderForTest; } });
|
|
85
|
+
// Credential resolver — Phase H precedence chain + Phase I tokenKind
|
|
86
|
+
var credentialResolver_js_1 = require("./credentialResolver.js");
|
|
87
|
+
Object.defineProperty(exports, "CredentialResolver", { enumerable: true, get: function () { return credentialResolver_js_1.CredentialResolver; } });
|
|
88
|
+
Object.defineProperty(exports, "CREDENTIAL_PRECEDENCE", { enumerable: true, get: function () { return credentialResolver_js_1.CREDENTIAL_PRECEDENCE; } });
|
|
89
|
+
Object.defineProperty(exports, "__resetCredentialResolverForTest", { enumerable: true, get: function () { return credentialResolver_js_1.__resetCredentialResolverForTest; } });
|
|
90
|
+
// H3-6 — public seam 401 handlers call to bust the helper cache so
|
|
91
|
+
// the next resolve re-invokes OVERSKY_AUTH_HELPER immediately
|
|
92
|
+
// instead of serving the stale cached token for up to its TTL.
|
|
93
|
+
Object.defineProperty(exports, "invalidateAuthHelperCache", { enumerable: true, get: function () { return credentialResolver_js_1.invalidateAuthHelperCache; } });
|
|
94
|
+
Object.defineProperty(exports, "classifyTokenKind", { enumerable: true, get: function () { return credentialResolver_js_1.classifyTokenKind; } });
|
|
95
|
+
Object.defineProperty(exports, "CI_TOKEN_PREFIX", { enumerable: true, get: function () { return credentialResolver_js_1.CI_TOKEN_PREFIX; } });
|
|
96
|
+
// L6.1 / L6.3 — fail-closed errors thrown by the auth-helper slot.
|
|
97
|
+
Object.defineProperty(exports, "AuthHelperUntrustedError", { enumerable: true, get: function () { return credentialResolver_js_1.AuthHelperUntrustedError; } });
|
|
98
|
+
Object.defineProperty(exports, "AuthHelperUnavailableError", { enumerable: true, get: function () { return credentialResolver_js_1.AuthHelperUnavailableError; } });
|
|
99
|
+
// Auth helper — invocation contract for OVERSKY_AUTH_HELPER
|
|
100
|
+
var authHelper_js_1 = require("./authHelper.js");
|
|
101
|
+
Object.defineProperty(exports, "invokeAuthHelper", { enumerable: true, get: function () { return authHelper_js_1.invokeAuthHelper; } });
|
|
102
|
+
Object.defineProperty(exports, "getDefaultHelperTtlMs", { enumerable: true, get: function () { return authHelper_js_1.getDefaultHelperTtlMs; } });
|
|
103
|
+
Object.defineProperty(exports, "getLastAuthHelperFailureReason", { enumerable: true, get: function () { return authHelper_js_1.getLastAuthHelperFailureReason; } });
|
|
104
|
+
Object.defineProperty(exports, "__resetAuthHelperFailureReasonForTest", { enumerable: true, get: function () { return authHelper_js_1.__resetAuthHelperFailureReasonForTest; } });
|
|
105
|
+
Object.defineProperty(exports, "SENTINEL_TRIGGERING_FAILURES", { enumerable: true, get: function () { return authHelper_js_1.SENTINEL_TRIGGERING_FAILURES; } });
|
|
106
|
+
// Headers helper — invocation contract for OVERSKY_HEADERS_HELPER
|
|
107
|
+
// (authenticates OverSky to outbound MCP servers)
|
|
108
|
+
var headers_helper_js_1 = require("./headers-helper.js");
|
|
109
|
+
Object.defineProperty(exports, "runHeadersHelper", { enumerable: true, get: function () { return headers_helper_js_1.runHeadersHelper; } });
|
|
110
|
+
Object.defineProperty(exports, "invalidateHeadersHelperCache", { enumerable: true, get: function () { return headers_helper_js_1.invalidateHeadersHelperCache; } });
|
|
111
|
+
// PKCE — RFC 7636 primitives for the Phase H.0 localhost-callback login.
|
|
112
|
+
// Keep `safeEqual` and `verifyChallenge` exported even though they are
|
|
113
|
+
// server-side concerns: server code consumes auth-core via the same
|
|
114
|
+
// public surface and the alternative (a separate server-only module)
|
|
115
|
+
// fragments the spec implementation across two locations.
|
|
116
|
+
var pkce_js_1 = require("./pkce.js");
|
|
117
|
+
Object.defineProperty(exports, "generateVerifier", { enumerable: true, get: function () { return pkce_js_1.generateVerifier; } });
|
|
118
|
+
Object.defineProperty(exports, "challenge", { enumerable: true, get: function () { return pkce_js_1.challenge; } });
|
|
119
|
+
Object.defineProperty(exports, "generateState", { enumerable: true, get: function () { return pkce_js_1.generateState; } });
|
|
120
|
+
Object.defineProperty(exports, "safeEqual", { enumerable: true, get: function () { return pkce_js_1.safeEqual; } });
|
|
121
|
+
Object.defineProperty(exports, "verifyChallenge", { enumerable: true, get: function () { return pkce_js_1.verifyChallenge; } });
|
|
122
|
+
// Local 127.0.0.1 callback server — Phase H.0.2.
|
|
123
|
+
// Keep error classes exported; callers branch on them to decide
|
|
124
|
+
// fallback behavior (BindError → retry on different port; TimeoutError
|
|
125
|
+
// → fall back to device-code; StateMismatchError → fail loudly).
|
|
126
|
+
var loginLocalhost_js_1 = require("./loginLocalhost.js");
|
|
127
|
+
Object.defineProperty(exports, "startLocalCallback", { enumerable: true, get: function () { return loginLocalhost_js_1.startLocalCallback; } });
|
|
128
|
+
Object.defineProperty(exports, "DEFAULT_LOGIN_TIMEOUT_MS", { enumerable: true, get: function () { return loginLocalhost_js_1.DEFAULT_LOGIN_TIMEOUT_MS; } });
|
|
129
|
+
Object.defineProperty(exports, "LocalCallbackError", { enumerable: true, get: function () { return loginLocalhost_js_1.LocalCallbackError; } });
|
|
130
|
+
Object.defineProperty(exports, "LocalCallbackBindError", { enumerable: true, get: function () { return loginLocalhost_js_1.LocalCallbackBindError; } });
|
|
131
|
+
Object.defineProperty(exports, "LocalCallbackTimeoutError", { enumerable: true, get: function () { return loginLocalhost_js_1.LocalCallbackTimeoutError; } });
|
|
132
|
+
Object.defineProperty(exports, "LocalCallbackStateMismatchError", { enumerable: true, get: function () { return loginLocalhost_js_1.LocalCallbackStateMismatchError; } });
|
|
133
|
+
Object.defineProperty(exports, "LocalCallbackDeniedError", { enumerable: true, get: function () { return loginLocalhost_js_1.LocalCallbackDeniedError; } });
|
|
134
|
+
Object.defineProperty(exports, "LocalCallbackMalformedError", { enumerable: true, get: function () { return loginLocalhost_js_1.LocalCallbackMalformedError; } });
|
|
135
|
+
// Phase H.0.2.b — single-call orchestrator that ties PKCE + local
|
|
136
|
+
// callback + server endpoints into the daemon-style token bundle.
|
|
137
|
+
// Daemon/CLI consume this; auth-core is platform-agnostic via the
|
|
138
|
+
// caller-injected `openBrowser` and `fetchImpl`.
|
|
139
|
+
var loginWithLocalhost_js_1 = require("./loginWithLocalhost.js");
|
|
140
|
+
Object.defineProperty(exports, "loginWithLocalhost", { enumerable: true, get: function () { return loginWithLocalhost_js_1.loginWithLocalhost; } });
|
|
141
|
+
Object.defineProperty(exports, "LoginInitError", { enumerable: true, get: function () { return loginWithLocalhost_js_1.LoginInitError; } });
|
|
142
|
+
Object.defineProperty(exports, "LoginExchangeError", { enumerable: true, get: function () { return loginWithLocalhost_js_1.LoginExchangeError; } });
|
|
143
|
+
// ADD-CLI1 — shared `--ttl` parser for `create-token`. Both the
|
|
144
|
+
// daemon CLI (`oversky create-token`) and the oclif CLI (`sky
|
|
145
|
+
// create-token`) import from here to prevent grammar drift.
|
|
146
|
+
var ttlParser_js_1 = require("./ttlParser.js");
|
|
147
|
+
Object.defineProperty(exports, "parseTtlDays", { enumerable: true, get: function () { return ttlParser_js_1.parseTtlDays; } });
|
|
148
|
+
Object.defineProperty(exports, "MIN_TTL_DAYS", { enumerable: true, get: function () { return ttlParser_js_1.MIN_TTL_DAYS; } });
|
|
149
|
+
Object.defineProperty(exports, "MAX_TTL_DAYS", { enumerable: true, get: function () { return ttlParser_js_1.MAX_TTL_DAYS; } });
|
|
150
|
+
// Tier 1 #3 — printable account-recovery code format (1Password-style
|
|
151
|
+
// 11-group base32). Server, CLI, and daemon-side helper all import from here.
|
|
152
|
+
var recoveryCode_js_1 = require("./recoveryCode.js");
|
|
153
|
+
Object.defineProperty(exports, "formatRecoveryCode", { enumerable: true, get: function () { return recoveryCode_js_1.formatRecoveryCode; } });
|
|
154
|
+
Object.defineProperty(exports, "parseRecoveryCode", { enumerable: true, get: function () { return recoveryCode_js_1.parseRecoveryCode; } });
|
|
155
|
+
Object.defineProperty(exports, "normalizeRecoveryCode", { enumerable: true, get: function () { return recoveryCode_js_1.normalizeRecoveryCode; } });
|
|
156
|
+
Object.defineProperty(exports, "isValidRecoveryCode", { enumerable: true, get: function () { return recoveryCode_js_1.isValidRecoveryCode; } });
|
|
157
|
+
// L12 Layer 0 — at-rest credential envelope encryption primitives.
|
|
158
|
+
// Pure crypto, no platform code. Daemon and CLI both consume.
|
|
159
|
+
var credentialEnvelope_js_1 = require("./credentialEnvelope.js");
|
|
160
|
+
Object.defineProperty(exports, "buildCredentialAad", { enumerable: true, get: function () { return credentialEnvelope_js_1.buildCredentialAad; } });
|
|
161
|
+
Object.defineProperty(exports, "credEnvelopeDecrypt", { enumerable: true, get: function () { return credentialEnvelope_js_1.decrypt; } });
|
|
162
|
+
Object.defineProperty(exports, "credEnvelopeDeserialize", { enumerable: true, get: function () { return credentialEnvelope_js_1.deserialize; } });
|
|
163
|
+
Object.defineProperty(exports, "credEnvelopeEncrypt", { enumerable: true, get: function () { return credentialEnvelope_js_1.encrypt; } });
|
|
164
|
+
Object.defineProperty(exports, "CRED_ENVELOPE_MAGIC", { enumerable: true, get: function () { return credentialEnvelope_js_1.ENVELOPE_MAGIC; } });
|
|
165
|
+
Object.defineProperty(exports, "generateDek", { enumerable: true, get: function () { return credentialEnvelope_js_1.generateDek; } });
|
|
166
|
+
Object.defineProperty(exports, "isCredEnvelopeString", { enumerable: true, get: function () { return credentialEnvelope_js_1.isEnvelopeString; } });
|
|
167
|
+
Object.defineProperty(exports, "CRED_KEY_LEN", { enumerable: true, get: function () { return credentialEnvelope_js_1.KEY_LEN; } });
|
|
168
|
+
Object.defineProperty(exports, "credOpenBuffer", { enumerable: true, get: function () { return credentialEnvelope_js_1.openBuffer; } });
|
|
169
|
+
Object.defineProperty(exports, "credSealBuffer", { enumerable: true, get: function () { return credentialEnvelope_js_1.sealBuffer; } });
|
|
170
|
+
Object.defineProperty(exports, "credEnvelopeSerialize", { enumerable: true, get: function () { return credentialEnvelope_js_1.serialize; } });
|
|
171
|
+
Object.defineProperty(exports, "credEnvelopeUnwrap", { enumerable: true, get: function () { return credentialEnvelope_js_1.unwrap; } });
|
|
172
|
+
Object.defineProperty(exports, "credEnvelopeWrap", { enumerable: true, get: function () { return credentialEnvelope_js_1.wrap; } });
|
|
173
|
+
// L12 Layer 1 — KEK platform-strategy interface and implementations.
|
|
174
|
+
//
|
|
175
|
+
// This block used to claim "today every strategy reports available=false so
|
|
176
|
+
// the daemon falls through to legacy plaintext". That has not been true since
|
|
177
|
+
// the macOS `security(1)` backend (C5) and the Linux tier-3 machine-id HKDF
|
|
178
|
+
// fallback shipped: on Linux `available()` is now essentially always true, and
|
|
179
|
+
// on macOS it is true whenever a login keychain resolves. The stale note is
|
|
180
|
+
// worth calling out rather than deleting, because four daemon suites were
|
|
181
|
+
// written against it and only failed once CI first ran them on Linux.
|
|
182
|
+
//
|
|
183
|
+
// Tests that need the unavailable branch must inject `UnavailableKek`;
|
|
184
|
+
// `__setKekStrategyForTest(null)` restores the PLATFORM default, which is not
|
|
185
|
+
// the same thing and differs per OS.
|
|
186
|
+
var index_js_1 = require("./kek/index.js");
|
|
187
|
+
Object.defineProperty(exports, "__setKekStrategyForTest", { enumerable: true, get: function () { return index_js_1.__setKekStrategyForTest; } });
|
|
188
|
+
Object.defineProperty(exports, "getKekStrategy", { enumerable: true, get: function () { return index_js_1.getKekStrategy; } });
|
|
189
|
+
Object.defineProperty(exports, "InMemoryKek", { enumerable: true, get: function () { return index_js_1.InMemoryKek; } });
|
|
190
|
+
Object.defineProperty(exports, "UnavailableKek", { enumerable: true, get: function () { return index_js_1.UnavailableKek; } });
|
|
191
|
+
Object.defineProperty(exports, "KekUnavailableError", { enumerable: true, get: function () { return index_js_1.KekUnavailableError; } });
|
|
192
|
+
Object.defineProperty(exports, "LinuxKek", { enumerable: true, get: function () { return index_js_1.LinuxKek; } });
|
|
193
|
+
Object.defineProperty(exports, "MacosKek", { enumerable: true, get: function () { return index_js_1.MacosKek; } });
|
|
194
|
+
Object.defineProperty(exports, "registerZeroizeHook", { enumerable: true, get: function () { return index_js_1.registerZeroizeHook; } });
|
|
195
|
+
Object.defineProperty(exports, "WindowsKek", { enumerable: true, get: function () { return index_js_1.WindowsKek; } });
|
|
196
|
+
Object.defineProperty(exports, "zeroizeKekCaches", { enumerable: true, get: function () { return index_js_1.zeroizeKekCaches; } });
|
|
197
|
+
// L11 Phase 1 — Device identity (Ed25519) + DPoP-shaped proof JWS.
|
|
198
|
+
// The crypto half of the two-axis identity story; daemon-side
|
|
199
|
+
// persistence + signing lives in `daemon/src/deviceIdentity.ts`.
|
|
200
|
+
// Server-side verification middleware is a later PR.
|
|
201
|
+
var deviceKey_js_1 = require("./deviceKey.js");
|
|
202
|
+
Object.defineProperty(exports, "buildDeviceProof", { enumerable: true, get: function () { return deviceKey_js_1.buildProof; } });
|
|
203
|
+
Object.defineProperty(exports, "generateDeviceKeyPair", { enumerable: true, get: function () { return deviceKey_js_1.generateDeviceKeyPair; } });
|
|
204
|
+
Object.defineProperty(exports, "jwkThumbprint", { enumerable: true, get: function () { return deviceKey_js_1.jwkThumbprint; } });
|
|
205
|
+
Object.defineProperty(exports, "normalizeHtu", { enumerable: true, get: function () { return deviceKey_js_1.normalizeHtu; } });
|
|
206
|
+
Object.defineProperty(exports, "publicJwkFromX", { enumerable: true, get: function () { return deviceKey_js_1.publicJwkFromX; } });
|
|
207
|
+
Object.defineProperty(exports, "tokenHash", { enumerable: true, get: function () { return deviceKey_js_1.tokenHash; } });
|
|
208
|
+
Object.defineProperty(exports, "verifyDeviceProof", { enumerable: true, get: function () { return deviceKey_js_1.verifyProof; } });
|
|
209
|
+
// L11/L12 — composed runtime: init, transforms, sign, enroll, locks.
|
|
210
|
+
// Daemon and CLI consume these; the underlying primitives live above.
|
|
211
|
+
var credentialEnvelopeBridge_js_1 = require("./credentialEnvelopeBridge.js");
|
|
212
|
+
// credEnvelope bridge
|
|
213
|
+
Object.defineProperty(exports, "initCredEnvelope", { enumerable: true, get: function () { return credentialEnvelopeBridge_js_1.initCredEnvelope; } });
|
|
214
|
+
Object.defineProperty(exports, "resetCredEnvelope", { enumerable: true, get: function () { return credentialEnvelopeBridge_js_1.resetCredEnvelope; } });
|
|
215
|
+
Object.defineProperty(exports, "shutdownCredEnvelope", { enumerable: true, get: function () { return credentialEnvelopeBridge_js_1.shutdownCredEnvelope; } });
|
|
216
|
+
Object.defineProperty(exports, "isCredEnvelopeActive", { enumerable: true, get: function () { return credentialEnvelopeBridge_js_1.isCredEnvelopeActive; } });
|
|
217
|
+
Object.defineProperty(exports, "describeCredEnvelopeState", { enumerable: true, get: function () { return credentialEnvelopeBridge_js_1.describeCredEnvelopeState; } });
|
|
218
|
+
Object.defineProperty(exports, "maybeEncryptForWrite", { enumerable: true, get: function () { return credentialEnvelopeBridge_js_1.maybeEncryptForWrite; } });
|
|
219
|
+
Object.defineProperty(exports, "maybeDecryptOnRead", { enumerable: true, get: function () { return credentialEnvelopeBridge_js_1.maybeDecryptOnRead; } });
|
|
220
|
+
// Test seams — `__`-prefixed so consumers don't import them in
|
|
221
|
+
// production code paths. Re-exported here so CLI/daemon spec files
|
|
222
|
+
// can resolve the wrapped-DEK path against the same module instance.
|
|
223
|
+
Object.defineProperty(exports, "__wrappedDekFilePathForTest", { enumerable: true, get: function () { return credentialEnvelopeBridge_js_1.__wrappedDekFilePathForTest; } });
|
|
224
|
+
Object.defineProperty(exports, "__setCredEnvelopeStateForTest", { enumerable: true, get: function () { return credentialEnvelopeBridge_js_1.__setStateForTest; } });
|
|
225
|
+
Object.defineProperty(exports, "__getCredEnvelopeStateForTest", { enumerable: true, get: function () { return credentialEnvelopeBridge_js_1.__getStateForTest; } });
|
|
226
|
+
Object.defineProperty(exports, "__resetShutdownGuardForTest", { enumerable: true, get: function () { return credentialEnvelopeBridge_js_1.__resetShutdownGuardForTest; } });
|
|
227
|
+
var deviceIdentityBridge_js_1 = require("./deviceIdentityBridge.js");
|
|
228
|
+
// deviceIdentity bridge
|
|
229
|
+
Object.defineProperty(exports, "initDeviceIdentity", { enumerable: true, get: function () { return deviceIdentityBridge_js_1.initDeviceIdentity; } });
|
|
230
|
+
Object.defineProperty(exports, "resetDeviceIdentity", { enumerable: true, get: function () { return deviceIdentityBridge_js_1.resetDeviceIdentity; } });
|
|
231
|
+
Object.defineProperty(exports, "signServerRequest", { enumerable: true, get: function () { return deviceIdentityBridge_js_1.signServerRequest; } });
|
|
232
|
+
Object.defineProperty(exports, "enrollWithServer", { enumerable: true, get: function () { return deviceIdentityBridge_js_1.enrollWithServer; } });
|
|
233
|
+
Object.defineProperty(exports, "clearEnrollmentMarker", { enumerable: true, get: function () { return deviceIdentityBridge_js_1.clearEnrollmentMarker; } });
|
|
234
|
+
Object.defineProperty(exports, "isDeviceIdentityActive", { enumerable: true, get: function () { return deviceIdentityBridge_js_1.isDeviceIdentityActive; } });
|
|
235
|
+
Object.defineProperty(exports, "getDevicePublicKey", { enumerable: true, get: function () { return deviceIdentityBridge_js_1.getDevicePublicKey; } });
|
|
236
|
+
Object.defineProperty(exports, "describeDeviceIdentityState", { enumerable: true, get: function () { return deviceIdentityBridge_js_1.describeDeviceIdentityState; } });
|
|
237
|
+
// Test seams — file path resolvers + state setters for spec files.
|
|
238
|
+
Object.defineProperty(exports, "__publicKeyPathForTest", { enumerable: true, get: function () { return deviceIdentityBridge_js_1.__publicKeyPathForTest; } });
|
|
239
|
+
Object.defineProperty(exports, "__privateKeyPathForTest", { enumerable: true, get: function () { return deviceIdentityBridge_js_1.__privateKeyPathForTest; } });
|
|
240
|
+
Object.defineProperty(exports, "__enrollmentMarkerPathForTest", { enumerable: true, get: function () { return deviceIdentityBridge_js_1.__enrollmentMarkerPathForTest; } });
|
|
241
|
+
Object.defineProperty(exports, "__enrollmentBackoffPathForTest", { enumerable: true, get: function () { return deviceIdentityBridge_js_1.__enrollmentBackoffPathForTest; } });
|
|
242
|
+
Object.defineProperty(exports, "__setDeviceIdentityStateForTest", { enumerable: true, get: function () { return deviceIdentityBridge_js_1.__setStateForTest; } });
|
|
243
|
+
Object.defineProperty(exports, "__getDeviceIdentityStateForTest", { enumerable: true, get: function () { return deviceIdentityBridge_js_1.__getStateForTest; } });
|
|
244
|
+
// Stable per-machine UUIDv7 identity persisted at <configDir>/daemon.id.
|
|
245
|
+
var machineId_js_1 = require("./machineId.js");
|
|
246
|
+
Object.defineProperty(exports, "ensureMachineDaemonId", { enumerable: true, get: function () { return machineId_js_1.ensureMachineDaemonId; } });
|
|
247
|
+
Object.defineProperty(exports, "legacyDaemonUuids", { enumerable: true, get: function () { return machineId_js_1.legacyDaemonUuids; } });
|
|
248
|
+
Object.defineProperty(exports, "__resetCachedDaemonIdForTest", { enumerable: true, get: function () { return machineId_js_1.__resetCachedDaemonIdForTest; } });
|
|
249
|
+
// Tier 1 #2 — daemon QR pairing primitives. Pure crypto + AAD framing,
|
|
250
|
+
// shared between the daemon CLI orchestrator (`daemon/src/pair.ts`) and
|
|
251
|
+
// any future native-app callers. The mobile RN client mirrors the same
|
|
252
|
+
// shapes locally because it can't pull a Node-shaped package.
|
|
253
|
+
var daemonPair_js_1 = require("./daemonPair.js");
|
|
254
|
+
Object.defineProperty(exports, "PAIR_AAD_PREFIX", { enumerable: true, get: function () { return daemonPair_js_1.PAIR_AAD_PREFIX; } });
|
|
255
|
+
Object.defineProperty(exports, "PAIR_AAD_MAX_LEN", { enumerable: true, get: function () { return daemonPair_js_1.PAIR_AAD_MAX_LEN; } });
|
|
256
|
+
Object.defineProperty(exports, "PAIR_BUNDLE_MAX_BASE64_LEN", { enumerable: true, get: function () { return daemonPair_js_1.PAIR_BUNDLE_MAX_BASE64_LEN; } });
|
|
257
|
+
Object.defineProperty(exports, "PAIR_NONCE_LEN", { enumerable: true, get: function () { return daemonPair_js_1.PAIR_NONCE_LEN; } });
|
|
258
|
+
Object.defineProperty(exports, "PAIR_PUBKEY_LEN", { enumerable: true, get: function () { return daemonPair_js_1.PAIR_PUBKEY_LEN; } });
|
|
259
|
+
Object.defineProperty(exports, "PAIR_SECRET_LEN", { enumerable: true, get: function () { return daemonPair_js_1.PAIR_SECRET_LEN; } });
|
|
260
|
+
Object.defineProperty(exports, "PairBundleError", { enumerable: true, get: function () { return daemonPair_js_1.PairBundleError; } });
|
|
261
|
+
Object.defineProperty(exports, "assemblePairBundleBase64", { enumerable: true, get: function () { return daemonPair_js_1.assemblePairBundleBase64; } });
|
|
262
|
+
Object.defineProperty(exports, "pairBase64ToUint8Array", { enumerable: true, get: function () { return daemonPair_js_1.base64ToUint8Array; } });
|
|
263
|
+
Object.defineProperty(exports, "pairBase64UrlToUint8Array", { enumerable: true, get: function () { return daemonPair_js_1.base64UrlToUint8Array; } });
|
|
264
|
+
Object.defineProperty(exports, "buildPairAad", { enumerable: true, get: function () { return daemonPair_js_1.buildPairAad; } });
|
|
265
|
+
Object.defineProperty(exports, "buildPairUrl", { enumerable: true, get: function () { return daemonPair_js_1.buildPairUrl; } });
|
|
266
|
+
Object.defineProperty(exports, "generatePairKeyPair", { enumerable: true, get: function () { return daemonPair_js_1.generatePairKeyPair; } });
|
|
267
|
+
Object.defineProperty(exports, "openPairBundleBase64", { enumerable: true, get: function () { return daemonPair_js_1.openPairBundleBase64; } });
|
|
268
|
+
Object.defineProperty(exports, "parsePairBundle", { enumerable: true, get: function () { return daemonPair_js_1.parsePairBundle; } });
|
|
269
|
+
Object.defineProperty(exports, "parsePairPlaintext", { enumerable: true, get: function () { return daemonPair_js_1.parsePairPlaintext; } });
|
|
270
|
+
Object.defineProperty(exports, "parsePairUrl", { enumerable: true, get: function () { return daemonPair_js_1.parsePairUrl; } });
|
|
271
|
+
Object.defineProperty(exports, "pairUint8ArrayToBase64", { enumerable: true, get: function () { return daemonPair_js_1.uint8ArrayToBase64; } });
|
|
272
|
+
Object.defineProperty(exports, "pairUint8ArrayToBase64Url", { enumerable: true, get: function () { return daemonPair_js_1.uint8ArrayToBase64Url; } });
|
|
273
|
+
// OSK-3897 — harness trust tiers, shared by the daemon (the authority) and the
|
|
274
|
+
// CLI (which publishes the fact in `sky code doctor`). The PROVENANCE half stays
|
|
275
|
+
// in the daemon on purpose: a tier is a published fact, provenance is evidence
|
|
276
|
+
// about bytes on disk that only the spawning process can gather.
|
|
277
|
+
var harnessTrust_js_1 = require("./harnessTrust.js");
|
|
278
|
+
Object.defineProperty(exports, "HARNESS_TIERS", { enumerable: true, get: function () { return harnessTrust_js_1.HARNESS_TIERS; } });
|
|
279
|
+
Object.defineProperty(exports, "getHarnessTier", { enumerable: true, get: function () { return harnessTrust_js_1.getHarnessTier; } });
|
|
280
|
+
Object.defineProperty(exports, "credentialPolicyForTier", { enumerable: true, get: function () { return harnessTrust_js_1.credentialPolicyForTier; } });
|
|
281
|
+
Object.defineProperty(exports, "tierPermitsConfiguredAutoMode", { enumerable: true, get: function () { return harnessTrust_js_1.tierPermitsConfiguredAutoMode; } });
|
|
282
|
+
// OSK-3892 — spawn-env sanitization, shared by the daemon (which has stripped
|
|
283
|
+
// its own credentials before every harness spawn all along) and the CLI (which
|
|
284
|
+
// spawns the SAME engine and did not). `daemon/src/env-sanitize.ts` re-exports
|
|
285
|
+
// these so its own importers are unchanged, and keeps `filterCustomEnv` — that
|
|
286
|
+
// governs SERVER-PROVIDED env, which no other process is handed.
|
|
287
|
+
var spawnEnv_js_1 = require("./spawnEnv.js");
|
|
288
|
+
Object.defineProperty(exports, "sanitizeSpawnEnv", { enumerable: true, get: function () { return spawnEnv_js_1.sanitizeSpawnEnv; } });
|
|
289
|
+
Object.defineProperty(exports, "SENSITIVE_ENV_VARS", { enumerable: true, get: function () { return spawnEnv_js_1.SENSITIVE_ENV_VARS; } });
|
|
290
|
+
Object.defineProperty(exports, "SENSITIVE_ENV_PREFIXES", { enumerable: true, get: function () { return spawnEnv_js_1.SENSITIVE_ENV_PREFIXES; } });
|
|
291
|
+
Object.defineProperty(exports, "SENSITIVE_ENV_SUFFIXES", { enumerable: true, get: function () { return spawnEnv_js_1.SENSITIVE_ENV_SUFFIXES; } });
|
|
292
|
+
Object.defineProperty(exports, "SENSITIVE_ENV_PREFIX_EXCEPTIONS", { enumerable: true, get: function () { return spawnEnv_js_1.SENSITIVE_ENV_PREFIX_EXCEPTIONS; } });
|
|
293
|
+
/* Local-machine identity — the names this product leaves on a disk. Exported so
|
|
294
|
+
the CLI, daemon and Desktop share one definition instead of 47 literals. */
|
|
295
|
+
var localIdentity_js_1 = require("./localIdentity.js");
|
|
296
|
+
Object.defineProperty(exports, "CONFIG_DIR_NAME", { enumerable: true, get: function () { return localIdentity_js_1.CONFIG_DIR_NAME; } });
|
|
297
|
+
Object.defineProperty(exports, "LEGACY_CONFIG_DIR_NAMES", { enumerable: true, get: function () { return localIdentity_js_1.LEGACY_CONFIG_DIR_NAMES; } });
|
|
298
|
+
Object.defineProperty(exports, "NATIVE_ID_PREFIX", { enumerable: true, get: function () { return localIdentity_js_1.NATIVE_ID_PREFIX; } });
|
|
299
|
+
Object.defineProperty(exports, "LEGACY_NATIVE_ID_PREFIXES", { enumerable: true, get: function () { return localIdentity_js_1.LEGACY_NATIVE_ID_PREFIXES; } });
|
|
300
|
+
Object.defineProperty(exports, "DEFAULT_BINARY_NAME", { enumerable: true, get: function () { return localIdentity_js_1.DEFAULT_BINARY_NAME; } });
|
|
301
|
+
/* Pre-rename state detection. Callers REFUSE on a positive result; nothing here
|
|
302
|
+
reads, copies or removes what it finds (§7.2, §8.4). */
|
|
303
|
+
var legacyStatePreflight_js_1 = require("./legacyStatePreflight.js");
|
|
304
|
+
Object.defineProperty(exports, "findLegacyLocalState", { enumerable: true, get: function () { return legacyStatePreflight_js_1.findLegacyLocalState; } });
|
|
305
|
+
Object.defineProperty(exports, "describeLegacyState", { enumerable: true, get: function () { return legacyStatePreflight_js_1.describeLegacyState; } });
|
|
@@ -0,0 +1,35 @@
|
|
|
1
|
+
/**
|
|
2
|
+
* jwtUtils.ts — signature-less JWT payload inspection.
|
|
3
|
+
*
|
|
4
|
+
* Used by the proactive refresh scheduler to read the `exp` claim off an
|
|
5
|
+
* access token without round-tripping to the server. We do NOT verify the
|
|
6
|
+
* signature here — the token is one the server just issued to us, and any
|
|
7
|
+
* tampering would surface as a 401 on the next API call anyway.
|
|
8
|
+
*
|
|
9
|
+
* THEREFORE: NOTHING THESE FUNCTIONS RETURN MAY DECIDE WHAT THE HOLDER IS
|
|
10
|
+
* ALLOWED TO DO.
|
|
11
|
+
*
|
|
12
|
+
* The reasoning above is only sound because the decoded values are used to
|
|
13
|
+
* schedule work (when to refresh) and to pick a local code path — never to
|
|
14
|
+
* grant anything. A claim read here is attacker-controlled input in the exact
|
|
15
|
+
* case that matters: anyone who can write the credential file, set the env var,
|
|
16
|
+
* or hand us a token over an fd can put any `scope`, `role`, `exp` or `sub` in
|
|
17
|
+
* it, because forging a payload requires no key when nobody checks the
|
|
18
|
+
* signature. "It would 401 later" is not a control if the decision was already
|
|
19
|
+
* made locally before any call went out.
|
|
20
|
+
*
|
|
21
|
+
* Safe: refresh timing, telemetry, diagnostics, choosing which resolver branch
|
|
22
|
+
* to take. Unsafe: gating a capability, trusting an identity, skipping a check,
|
|
23
|
+
* widening a scope. If you need a claim you can trust, verify the signature or
|
|
24
|
+
* ask the server.
|
|
25
|
+
*
|
|
26
|
+
* `credentialResolver.classifyTokenKind` is the one non-`exp` reader today; see
|
|
27
|
+
* the note there for why routing on `scope` is not an authorization decision.
|
|
28
|
+
*/
|
|
29
|
+
/** Base64url-decode the middle segment of a JWT and JSON-parse it. */
|
|
30
|
+
export declare function decodeJwtPayload(token: string): unknown | null;
|
|
31
|
+
/**
|
|
32
|
+
* Decode the `exp` (expiry) claim from a JWT without verifying the signature.
|
|
33
|
+
* @returns The `exp` value in Unix seconds, or `null` if unparseable / missing.
|
|
34
|
+
*/
|
|
35
|
+
export declare function decodeJwtExpiry(token: string): number | null;
|
|
@@ -0,0 +1,61 @@
|
|
|
1
|
+
"use strict";
|
|
2
|
+
/**
|
|
3
|
+
* jwtUtils.ts — signature-less JWT payload inspection.
|
|
4
|
+
*
|
|
5
|
+
* Used by the proactive refresh scheduler to read the `exp` claim off an
|
|
6
|
+
* access token without round-tripping to the server. We do NOT verify the
|
|
7
|
+
* signature here — the token is one the server just issued to us, and any
|
|
8
|
+
* tampering would surface as a 401 on the next API call anyway.
|
|
9
|
+
*
|
|
10
|
+
* THEREFORE: NOTHING THESE FUNCTIONS RETURN MAY DECIDE WHAT THE HOLDER IS
|
|
11
|
+
* ALLOWED TO DO.
|
|
12
|
+
*
|
|
13
|
+
* The reasoning above is only sound because the decoded values are used to
|
|
14
|
+
* schedule work (when to refresh) and to pick a local code path — never to
|
|
15
|
+
* grant anything. A claim read here is attacker-controlled input in the exact
|
|
16
|
+
* case that matters: anyone who can write the credential file, set the env var,
|
|
17
|
+
* or hand us a token over an fd can put any `scope`, `role`, `exp` or `sub` in
|
|
18
|
+
* it, because forging a payload requires no key when nobody checks the
|
|
19
|
+
* signature. "It would 401 later" is not a control if the decision was already
|
|
20
|
+
* made locally before any call went out.
|
|
21
|
+
*
|
|
22
|
+
* Safe: refresh timing, telemetry, diagnostics, choosing which resolver branch
|
|
23
|
+
* to take. Unsafe: gating a capability, trusting an identity, skipping a check,
|
|
24
|
+
* widening a scope. If you need a claim you can trust, verify the signature or
|
|
25
|
+
* ask the server.
|
|
26
|
+
*
|
|
27
|
+
* `credentialResolver.classifyTokenKind` is the one non-`exp` reader today; see
|
|
28
|
+
* the note there for why routing on `scope` is not an authorization decision.
|
|
29
|
+
*/
|
|
30
|
+
Object.defineProperty(exports, "__esModule", { value: true });
|
|
31
|
+
exports.decodeJwtPayload = decodeJwtPayload;
|
|
32
|
+
exports.decodeJwtExpiry = decodeJwtExpiry;
|
|
33
|
+
/** Base64url-decode the middle segment of a JWT and JSON-parse it. */
|
|
34
|
+
function decodeJwtPayload(token) {
|
|
35
|
+
if (typeof token !== 'string' || token.length === 0)
|
|
36
|
+
return null;
|
|
37
|
+
const parts = token.split('.');
|
|
38
|
+
if (parts.length !== 3 || !parts[1])
|
|
39
|
+
return null;
|
|
40
|
+
try {
|
|
41
|
+
const json = Buffer.from(parts[1], 'base64url').toString('utf8');
|
|
42
|
+
return JSON.parse(json);
|
|
43
|
+
}
|
|
44
|
+
catch {
|
|
45
|
+
return null;
|
|
46
|
+
}
|
|
47
|
+
}
|
|
48
|
+
/**
|
|
49
|
+
* Decode the `exp` (expiry) claim from a JWT without verifying the signature.
|
|
50
|
+
* @returns The `exp` value in Unix seconds, or `null` if unparseable / missing.
|
|
51
|
+
*/
|
|
52
|
+
function decodeJwtExpiry(token) {
|
|
53
|
+
const payload = decodeJwtPayload(token);
|
|
54
|
+
if (payload !== null &&
|
|
55
|
+
typeof payload === 'object' &&
|
|
56
|
+
'exp' in payload &&
|
|
57
|
+
typeof payload.exp === 'number') {
|
|
58
|
+
return payload.exp;
|
|
59
|
+
}
|
|
60
|
+
return null;
|
|
61
|
+
}
|
|
@@ -0,0 +1,89 @@
|
|
|
1
|
+
/**
|
|
2
|
+
* kek/index.ts — platform selector for the Key Encryption Key strategy.
|
|
3
|
+
*
|
|
4
|
+
* Resolves a single KEK implementation based on `process.platform` at
|
|
5
|
+
* call time. The returned strategy may report `available=false` (e.g.,
|
|
6
|
+
* the native binding hasn't shipped on the current platform yet) — the
|
|
7
|
+
* daemon's integration code MUST honor that and fall through to the
|
|
8
|
+
* legacy plaintext path with a `cred_envelope.kek_unavailable` event.
|
|
9
|
+
*
|
|
10
|
+
* Test seam: `__setKekStrategyForTest()` lets unit tests inject a
|
|
11
|
+
* synthetic strategy with a deterministic in-memory KEK so the
|
|
12
|
+
* dual-read / re-encrypt-on-migration paths can be exercised without a
|
|
13
|
+
* real platform binding.
|
|
14
|
+
*/
|
|
15
|
+
import type { KekStrategy } from './types.js';
|
|
16
|
+
export type { KekStrategy } from './types.js';
|
|
17
|
+
export { KekUnavailableError } from './types.js';
|
|
18
|
+
export { MacosKek } from './macos.js';
|
|
19
|
+
export { LinuxKek } from './linux.js';
|
|
20
|
+
export { WindowsKek } from './windows.js';
|
|
21
|
+
export { zeroizeKekCaches, registerZeroizeHook } from './zeroize-registry.js';
|
|
22
|
+
/**
|
|
23
|
+
* @internal Test-only seam — inject a synthetic KEK strategy that wraps
|
|
24
|
+
* with a fixed in-memory key. Resets to platform default when called
|
|
25
|
+
* with `null`.
|
|
26
|
+
*/
|
|
27
|
+
export declare function __setKekStrategyForTest(strategy: KekStrategy | null): void;
|
|
28
|
+
/**
|
|
29
|
+
* Resolve the KEK strategy for the current process. Returns the test
|
|
30
|
+
* override when set; otherwise selects by `process.platform`.
|
|
31
|
+
*
|
|
32
|
+
* Idempotent and side-effect-free — the strategy is constructed fresh
|
|
33
|
+
* on each call. Implementations must keep their own caches if probing
|
|
34
|
+
* is expensive (none of the current stubs do).
|
|
35
|
+
*/
|
|
36
|
+
export declare function getKekStrategy(): KekStrategy;
|
|
37
|
+
/**
|
|
38
|
+
* In-memory KEK strategy backed by a fixed buffer. Useful for tests and
|
|
39
|
+
* for a future `--kek=file:<path>` opt-in for users who explicitly
|
|
40
|
+
* waive platform-native protection (e.g., headless CI on a hardened
|
|
41
|
+
* VM where DPAPI isn't reachable). Do NOT default to this in production
|
|
42
|
+
* paths — it provides no protection beyond filesystem permissions on
|
|
43
|
+
* whatever holds the buffer.
|
|
44
|
+
*/
|
|
45
|
+
export declare class InMemoryKek implements KekStrategy {
|
|
46
|
+
readonly id = "in-memory-test";
|
|
47
|
+
private readonly key;
|
|
48
|
+
constructor(key: Buffer);
|
|
49
|
+
/**
|
|
50
|
+
* Stable backend identifier surfaced via `KekStrategy.kind`. Distinct
|
|
51
|
+
* from the MacosKek shellout / NAPI kinds so telemetry filters can
|
|
52
|
+
* exclude in-memory test traffic from fleet dashboards.
|
|
53
|
+
*/
|
|
54
|
+
get kind(): string;
|
|
55
|
+
available(): Promise<boolean>;
|
|
56
|
+
wrap(dek: Buffer, aad?: Buffer): Promise<Buffer>;
|
|
57
|
+
unwrap(wrapped: Buffer, aad?: Buffer): Promise<Buffer>;
|
|
58
|
+
unwrapExisting(wrapped: Buffer, aad?: Buffer): Promise<Buffer>;
|
|
59
|
+
describe(): string;
|
|
60
|
+
}
|
|
61
|
+
/**
|
|
62
|
+
* Test double for the KEK-UNAVAILABLE branch — the twin of `InMemoryKek`.
|
|
63
|
+
*
|
|
64
|
+
* It exists because "no KEK on this platform" cannot be expressed by passing
|
|
65
|
+
* `null` to `__setKekStrategyForTest`. `null` means "use the platform
|
|
66
|
+
* default", and the platform defaults do not agree: `LinuxKek` essentially
|
|
67
|
+
* always resolves (tier-3 derives a KEK from machine identity when libsecret
|
|
68
|
+
* is absent), `MacosKek` resolves only when a login keychain can be found —
|
|
69
|
+
* which a test that sandboxes `HOME` accidentally prevents — and `WindowsKek`
|
|
70
|
+
* is still a stub. A suite that wants the unavailable branch and passes `null`
|
|
71
|
+
* is therefore not testing that branch; it is testing which machine it landed
|
|
72
|
+
* on, and it flips from green to red when the machine changes.
|
|
73
|
+
*
|
|
74
|
+
* That is not hypothetical: four daemon suites asserting fail-closed behaviour
|
|
75
|
+
* passed on macOS purely because their temp `HOME` hid the keychain, and went
|
|
76
|
+
* red the first time CI ever executed them on Linux.
|
|
77
|
+
*
|
|
78
|
+
* `wrap`/`unwrap` throw rather than returning junk, matching the contract in
|
|
79
|
+
* `types.ts`: a strategy that reports unavailable must never silently produce
|
|
80
|
+
* ciphertext a caller could mistake for protected material.
|
|
81
|
+
*/
|
|
82
|
+
export declare class UnavailableKek implements KekStrategy {
|
|
83
|
+
readonly id = "unavailable-test";
|
|
84
|
+
get kind(): string;
|
|
85
|
+
available(): Promise<boolean>;
|
|
86
|
+
wrap(): Promise<Buffer>;
|
|
87
|
+
unwrap(): Promise<Buffer>;
|
|
88
|
+
describe(): string;
|
|
89
|
+
}
|