For the complete documentation index, see llms.txt. This page is also available as Markdown.

JavaScript SDK 17.6.0

Released on September 17, 2026

Breaking changes

cachingPostFunction removed (Node): Replaced by createCachingFunction(storage, options?). If you called cachingPostFunction directly, switch to the new function and delete the old plaintext cache file in your working directory.

Updates

  • KSM-1209: Added a bounded, configurable request timeout to all network calls (queries, file upload, file download). Set requestTimeoutMs on SecretManagerOptions (default 30s); downloadFile, downloadThumbnail, and uploadFile each also accept an optional per-call timeoutMs that overrides it. On timeout, the call rejects with a KeeperError naming the applied value.

  • KSM-1073: Fixed pamSettings.connection missing the dbConnectionMethod field on pamDatabase records.

  • KSM-1079: Fixed getFolders() crashing when a folder in the response has a corrupted or missing key; undecryptable folders are now skipped instead.

  • KSM-1084: Fixed deleteSecret() and deleteFolder() silently reporting success when the server rejected some UIDs; per-item server error messages now surface to the caller.

  • KSM-748: Fixed getSecrets() silently dropping records created by Commander or the Vault UI inside shared folders.

  • KSM-1035: Throttle retry jitter is now one-sided (0 to +25%) instead of two-sided, and a server-supplied retry_after is capped at 176s.

  • KSM-1128: Bounded the server key-rotation retry in postQuery to 3 attempts instead of retrying forever; a server-suggested key ID is now validated before being persisted.

  • KSM-1254: Fixed the Node platform's hash() ignoring its tag parameter.

  • KSM-1332: Fixed browser IndexedDB storage hanging forever on a storage failure instead of rejecting.

  • KSM-1251: Fixed throttle and key-rotation detection failing to parse a response body over 1000 bytes, which silently disabled the retry for that response.

  • KSM-1297: Fixed getSharedFolderUid() hanging forever, and blocking the whole event loop or browser tab, on a cycle in server-supplied folder parent data. It now throws a descriptive error naming the folder where the cycle closes.

  • KSM-1342: Fixed large file downloads (roughly 75MB and up) failing with a spurious timeout, caused by the new request-timeout tracking re-copying the entire response buffer on every network chunk. Chunks are now concatenated once, when the response ends.

  • KSM-1351: Fixed hasEncryptedData() and hasReadableData() misclassifying real encrypted data as unencrypted roughly 1 in 128 times. Both now require an actual JSON parse instead of checking only the first decoded character.

  • KSM-1395: Fixed throttle retry never firing against the live backend: the retry gate checked only for HTTP 403, but the backend has returned 429 for a throttled Secrets Manager request since 2026-06-15. The gate now accepts both.

  • KSM-1265: BREAKING (Node only): Replaced cachingPostFunction, which stored its cache key in plaintext beside the data it protected, with createCachingFunction(storage, options?). The cache is now encrypted with a key derived from the app key, authenticated against tampering, and stored at ~/.keeper/ksm-cache.dat by default. See Breaking Changes.

  • KSM-1266: Fixed localConfigStorage silently treating a corrupt, unreadable, or malformed config file as "no config yet." These cases now throw a typed KeeperStorageError (carrying the filesystem error code when available), and config writes are now atomic.

  • KSM-1267: getFolders() now classifies why an undecryptable folder was skipped and logs a summary line naming the affected folders. A new optional onDecryptionError callback on SecretManagerOptions lets callers react to, or fail closed on, a partial result.

  • KSM-1263: Config and cache file permissions are now re-applied on every write, not just on file creation.

  • KSM-1256, KSM-1255: Fixed a stored serverPublicKeyId outside the bundled key table permanently blocking every future request; it now self-heals to the default key. Stopped re-saving serverPublicKey/serverPublicKeyId on every call when unchanged, and closed a race where concurrent requests could leave a mismatched key/id pair in storage. A custom serverPublicKey now always requires its serverPublicKeyId in the same call.

Resources

Last updated