Overview
The@tinyclaw/secrets package provides encrypted secrets management for Tiny Claw, powered by @wgtechlabs/secrets-engine. It stores API keys and other secrets with machine-bound AES-256-GCM encryption.
Features
- Machine-bound encryption — Secrets are tied to the host machine
- AES-256-GCM — Industry-standard authenticated encryption
- Zero external dependencies — Self-contained storage
- Dot-notation keys — Organized namespace (e.g.,
provider.ollama.apiKey) - Pattern-based listing — Glob support for key discovery
Storage Location
Secrets are stored in the user’s home directory at~/.secrets-engine/ by default (configurable via SecretsConfig.path).
Installation
Usage
Basic Setup
Provider API Keys
Check Before Retrieve
List Secrets
Custom Storage Path
Agent Tools
API Reference
SecretsManager
SecretsManager.create(config?)
Create and initialize a secrets manager instance.
Configuration options.
Custom storage path. Defaults to
~/.secrets-engine/.Promise<SecretsManager>
store(key, value)
Store or overwrite an encrypted secret.
Dot-notation key (e.g.,
"provider.ollama.apiKey").The secret value to encrypt and store.
Promise<void>
check(key)
Check if a secret exists without decrypting it.
The key to check.
Promise<boolean> - true if the secret exists.
retrieve(key)
Retrieve and decrypt a stored secret.
The key to retrieve.
Promise<string | null> - The decrypted value, or null if not found.
list(pattern?)
List all secret key names matching an optional glob pattern.
Optional glob pattern to filter keys (e.g.,
"provider.*.*"). Note: * matches within a single dot-segment only.Promise<string[]> - Array of matching key names (never secret values).
resolveProviderKey(providerName)
Retrieve a provider API key using the standard naming convention.
The provider name (e.g.,
"openai", "anthropic").Promise<string | null> - The API key, or null if not found.
This is a convenience method that constructs the key as provider.<providerName>.apiKey.
close()
Close the secrets engine and flush any pending writes.
Returns: Promise<void>
Properties
Number of secrets currently stored.
Absolute path to the secrets storage directory.
createSecretsTools(manager)
Create agent tools for secrets management.
The secrets manager instance.
Tool[] - Array containing 4 tools:
store_secret— Store or update a secretcheck_secret— Check if a secret existsretrieve_secret— Retrieve and decrypt a secretlist_secrets— List secret key names
Naming Conventions
Provider API Keys
API keys for LLM providers should follow this convention:provider.openai.apiKeyprovider.anthropic.apiKeyprovider.ollama.apiKeyprovider.google.apiKey
Channel Secrets
Secrets for channel plugins (e.g., Discord bot tokens) should follow:channel.discord.tokenchannel.telegram.botTokenchannel.slack.webhookUrl
Custom Secrets
For custom secrets, use descriptive dot-notation:Helper Functions
buildProviderKeyName(providerName)
Construct a provider API key name.
buildChannelKeyName(channelName, keyType)
Construct a channel secret key name.
Security Notes
- Secrets are encrypted using AES-256-GCM with machine-bound keys
- Encryption keys are derived from machine-specific identifiers
- Secrets cannot be transferred between machines (by design)
- Storage is local to the user’s home directory (not in project repos)
- No secrets are ever logged or exposed in error messages
Error Handling
Best Practices
-
Always close the manager when done to ensure writes are flushed:
-
Check before retrieve to avoid null handling:
-
Use consistent naming to make secrets discoverable:
-
Never commit secrets to version control: