@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.
Files changed (147) hide show
  1. package/README.md +21 -0
  2. package/dist/cjs/aead.d.ts +24 -0
  3. package/dist/cjs/aead.js +65 -0
  4. package/dist/cjs/authExpiredDetector.d.ts +65 -0
  5. package/dist/cjs/authExpiredDetector.js +89 -0
  6. package/dist/cjs/authHelper.d.ts +51 -0
  7. package/dist/cjs/authHelper.js +321 -0
  8. package/dist/cjs/credentialEnvelope.d.ts +85 -0
  9. package/dist/cjs/credentialEnvelope.js +230 -0
  10. package/dist/cjs/credentialEnvelopeBridge.d.ts +116 -0
  11. package/dist/cjs/credentialEnvelopeBridge.js +637 -0
  12. package/dist/cjs/credentialResolver.d.ts +278 -0
  13. package/dist/cjs/credentialResolver.js +423 -0
  14. package/dist/cjs/daemonPair.d.ts +172 -0
  15. package/dist/cjs/daemonPair.js +495 -0
  16. package/dist/cjs/daemonScopes.d.ts +74 -0
  17. package/dist/cjs/daemonScopes.js +84 -0
  18. package/dist/cjs/deviceIdentityBridge.d.ts +113 -0
  19. package/dist/cjs/deviceIdentityBridge.js +591 -0
  20. package/dist/cjs/deviceKey.d.ts +167 -0
  21. package/dist/cjs/deviceKey.js +332 -0
  22. package/dist/cjs/fdToken.d.ts +17 -0
  23. package/dist/cjs/fdToken.js +238 -0
  24. package/dist/cjs/harnessTrust.d.ts +72 -0
  25. package/dist/cjs/harnessTrust.js +103 -0
  26. package/dist/cjs/headers-helper.d.ts +25 -0
  27. package/dist/cjs/headers-helper.js +323 -0
  28. package/dist/cjs/index.d.ts +37 -0
  29. package/dist/cjs/index.js +305 -0
  30. package/dist/cjs/jwtUtils.d.ts +35 -0
  31. package/dist/cjs/jwtUtils.js +61 -0
  32. package/dist/cjs/kek/index.d.ts +89 -0
  33. package/dist/cjs/kek/index.js +208 -0
  34. package/dist/cjs/kek/linux.d.ts +92 -0
  35. package/dist/cjs/kek/linux.js +596 -0
  36. package/dist/cjs/kek/macos.d.ts +112 -0
  37. package/dist/cjs/kek/macos.js +599 -0
  38. package/dist/cjs/kek/types.d.ts +111 -0
  39. package/dist/cjs/kek/types.js +43 -0
  40. package/dist/cjs/kek/windows.d.ts +71 -0
  41. package/dist/cjs/kek/windows.js +350 -0
  42. package/dist/cjs/kek/zeroize-registry.d.ts +44 -0
  43. package/dist/cjs/kek/zeroize-registry.js +63 -0
  44. package/dist/cjs/legacyStatePreflight.d.ts +67 -0
  45. package/dist/cjs/legacyStatePreflight.js +78 -0
  46. package/dist/cjs/localIdentity.d.ts +54 -0
  47. package/dist/cjs/localIdentity.js +57 -0
  48. package/dist/cjs/loginLocalhost.d.ts +115 -0
  49. package/dist/cjs/loginLocalhost.js +368 -0
  50. package/dist/cjs/loginWithLocalhost.d.ts +131 -0
  51. package/dist/cjs/loginWithLocalhost.js +359 -0
  52. package/dist/cjs/machineId.d.ts +35 -0
  53. package/dist/cjs/machineId.js +239 -0
  54. package/dist/cjs/messages.d.ts +9 -0
  55. package/dist/cjs/messages.js +44 -0
  56. package/dist/cjs/package.json +3 -0
  57. package/dist/cjs/pkce.d.ts +62 -0
  58. package/dist/cjs/pkce.js +158 -0
  59. package/dist/cjs/recoveryCode.d.ts +61 -0
  60. package/dist/cjs/recoveryCode.js +213 -0
  61. package/dist/cjs/refresh.d.ts +215 -0
  62. package/dist/cjs/refresh.js +877 -0
  63. package/dist/cjs/refreshClassification.d.ts +53 -0
  64. package/dist/cjs/refreshClassification.js +105 -0
  65. package/dist/cjs/refreshScheduler.d.ts +53 -0
  66. package/dist/cjs/refreshScheduler.js +332 -0
  67. package/dist/cjs/runtime.d.ts +149 -0
  68. package/dist/cjs/runtime.js +136 -0
  69. package/dist/cjs/spawnEnv.d.ts +76 -0
  70. package/dist/cjs/spawnEnv.js +153 -0
  71. package/dist/cjs/ttlParser.d.ts +54 -0
  72. package/dist/cjs/ttlParser.js +87 -0
  73. package/dist/cjs/types.d.ts +91 -0
  74. package/dist/cjs/types.js +26 -0
  75. package/dist/esm/aead.d.ts +24 -0
  76. package/dist/esm/aead.js +57 -0
  77. package/dist/esm/authExpiredDetector.d.ts +65 -0
  78. package/dist/esm/authExpiredDetector.js +85 -0
  79. package/dist/esm/authHelper.d.ts +51 -0
  80. package/dist/esm/authHelper.js +311 -0
  81. package/dist/esm/credentialEnvelope.d.ts +85 -0
  82. package/dist/esm/credentialEnvelope.js +213 -0
  83. package/dist/esm/credentialEnvelopeBridge.d.ts +116 -0
  84. package/dist/esm/credentialEnvelopeBridge.js +620 -0
  85. package/dist/esm/credentialResolver.d.ts +278 -0
  86. package/dist/esm/credentialResolver.js +414 -0
  87. package/dist/esm/daemonPair.d.ts +172 -0
  88. package/dist/esm/daemonPair.js +476 -0
  89. package/dist/esm/daemonScopes.d.ts +74 -0
  90. package/dist/esm/daemonScopes.js +80 -0
  91. package/dist/esm/deviceIdentityBridge.d.ts +113 -0
  92. package/dist/esm/deviceIdentityBridge.js +572 -0
  93. package/dist/esm/deviceKey.d.ts +167 -0
  94. package/dist/esm/deviceKey.js +320 -0
  95. package/dist/esm/fdToken.d.ts +17 -0
  96. package/dist/esm/fdToken.js +231 -0
  97. package/dist/esm/harnessTrust.d.ts +72 -0
  98. package/dist/esm/harnessTrust.js +97 -0
  99. package/dist/esm/headers-helper.d.ts +25 -0
  100. package/dist/esm/headers-helper.js +316 -0
  101. package/dist/esm/index.d.ts +37 -0
  102. package/dist/esm/index.js +144 -0
  103. package/dist/esm/jwtUtils.d.ts +35 -0
  104. package/dist/esm/jwtUtils.js +57 -0
  105. package/dist/esm/kek/index.d.ts +89 -0
  106. package/dist/esm/kek/index.js +162 -0
  107. package/dist/esm/kek/linux.d.ts +92 -0
  108. package/dist/esm/kek/linux.js +585 -0
  109. package/dist/esm/kek/macos.d.ts +112 -0
  110. package/dist/esm/kek/macos.js +586 -0
  111. package/dist/esm/kek/types.d.ts +111 -0
  112. package/dist/esm/kek/types.js +39 -0
  113. package/dist/esm/kek/windows.d.ts +71 -0
  114. package/dist/esm/kek/windows.js +344 -0
  115. package/dist/esm/kek/zeroize-registry.d.ts +44 -0
  116. package/dist/esm/kek/zeroize-registry.js +58 -0
  117. package/dist/esm/legacyStatePreflight.d.ts +67 -0
  118. package/dist/esm/legacyStatePreflight.js +71 -0
  119. package/dist/esm/localIdentity.d.ts +54 -0
  120. package/dist/esm/localIdentity.js +54 -0
  121. package/dist/esm/loginLocalhost.d.ts +115 -0
  122. package/dist/esm/loginLocalhost.js +355 -0
  123. package/dist/esm/loginWithLocalhost.d.ts +131 -0
  124. package/dist/esm/loginWithLocalhost.js +353 -0
  125. package/dist/esm/machineId.d.ts +35 -0
  126. package/dist/esm/machineId.js +231 -0
  127. package/dist/esm/messages.d.ts +9 -0
  128. package/dist/esm/messages.js +40 -0
  129. package/dist/esm/pkce.d.ts +62 -0
  130. package/dist/esm/pkce.js +148 -0
  131. package/dist/esm/recoveryCode.d.ts +61 -0
  132. package/dist/esm/recoveryCode.js +207 -0
  133. package/dist/esm/refresh.d.ts +215 -0
  134. package/dist/esm/refresh.js +863 -0
  135. package/dist/esm/refreshClassification.d.ts +53 -0
  136. package/dist/esm/refreshClassification.js +106 -0
  137. package/dist/esm/refreshScheduler.d.ts +53 -0
  138. package/dist/esm/refreshScheduler.js +329 -0
  139. package/dist/esm/runtime.d.ts +149 -0
  140. package/dist/esm/runtime.js +121 -0
  141. package/dist/esm/spawnEnv.d.ts +76 -0
  142. package/dist/esm/spawnEnv.js +149 -0
  143. package/dist/esm/ttlParser.d.ts +54 -0
  144. package/dist/esm/ttlParser.js +83 -0
  145. package/dist/esm/types.d.ts +91 -0
  146. package/dist/esm/types.js +21 -0
  147. 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
+ }