@framers/agentos-skills-registry 0.14.0 → 0.16.0

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/package.json CHANGED
@@ -1,6 +1,6 @@
1
1
  {
2
2
  "name": "@framers/agentos-skills-registry",
3
- "version": "0.14.0",
3
+ "version": "0.16.0",
4
4
  "files": [
5
5
  "dist",
6
6
  "registry",
@@ -0,0 +1,225 @@
1
+ ---
2
+ name: audio-generation
3
+ version: '1.0.0'
4
+ description: Music and sound effects generation — 8 providers with fallback chains, user-configurable preferences, local and cloud options.
5
+ author: Wunderland
6
+ namespace: wunderland
7
+ category: media
8
+ tags: [audio, music, sound-effects, sfx, generation, suno, elevenlabs, stable-audio, musicgen]
9
+ requires_secrets: []
10
+ requires_tools: []
11
+ metadata:
12
+ agentos:
13
+ emoji: "\U0001F3B5"
14
+ ---
15
+
16
+ # Audio Generation (Music & Sound Effects)
17
+
18
+ Use this skill when the user wants to generate music compositions or sound effects from text descriptions. The system supports 8 provider backends with automatic fallback chains and user-configurable provider preferences.
19
+
20
+ This skill covers two complementary APIs:
21
+
22
+ 1. **generateMusic()** — Full-length musical compositions from text prompts
23
+ 2. **generateSFX()** — Short sound effects from text descriptions
24
+
25
+ ## Music Generation
26
+
27
+ ### Basic Usage
28
+
29
+ Generate music from a text prompt. The system auto-detects the best available provider from environment variables in priority order: `SUNO_API_KEY` (highest quality) -> `UDIO_API_KEY` -> `STABILITY_API_KEY` -> `REPLICATE_API_TOKEN` -> `FAL_API_KEY` -> local MusicGen (no key required).
30
+
31
+ ```typescript
32
+ import { generateMusic } from 'agentos';
33
+
34
+ const result = await generateMusic({
35
+ prompt: 'Upbeat lo-fi hip hop beat with vinyl crackle and mellow piano',
36
+ durationSec: 60,
37
+ });
38
+ console.log(result.audio[0].url);
39
+ ```
40
+
41
+ ### Prompt Tips for Music
42
+
43
+ - **Specify genre and mood first**: "melancholic jazz ballad", "aggressive drum and bass", "peaceful ambient soundscape"
44
+ - **Include instrumentation**: "with acoustic guitar, soft brushed drums, and upright bass"
45
+ - **Mention tempo and energy**: "slow tempo, 70 BPM", "high energy, driving rhythm"
46
+ - **Add texture and production**: "lo-fi with vinyl crackle", "clean studio recording", "reverb-heavy shoegaze"
47
+ - **Reference eras or styles**: "1970s progressive rock", "modern trap production", "classical baroque harpsichord"
48
+ - **Use negative prompts** where supported: `negativePrompt: 'vocals, singing, lyrics'`
49
+
50
+ ### Music Options
51
+
52
+ | Option | Default | Description |
53
+ |--------|---------|-------------|
54
+ | `prompt` | (required) | Text description of the desired music |
55
+ | `provider` | auto-detect | Provider ID (`"suno"`, `"udio"`, `"stable-audio"`, etc.) |
56
+ | `model` | provider default | Model identifier within the provider |
57
+ | `durationSec` | provider default | Output duration in seconds (Suno: up to ~240s, Stable Audio: ~47s) |
58
+ | `negativePrompt` | — | Musical elements to avoid (not all providers support this) |
59
+ | `outputFormat` | `"mp3"` | Output format: `"mp3"`, `"wav"`, `"flac"`, `"ogg"`, `"aac"` |
60
+ | `seed` | random | Seed for reproducible output (provider-dependent) |
61
+ | `n` | `1` | Number of clips to generate |
62
+
63
+ ## Sound Effect Generation
64
+
65
+ ### Basic Usage
66
+
67
+ Generate a sound effect from a text description. The SFX detection order is: `ELEVENLABS_API_KEY` (highest quality) -> `STABILITY_API_KEY` -> `REPLICATE_API_TOKEN` -> `FAL_API_KEY` -> local AudioGen (no key required).
68
+
69
+ ```typescript
70
+ import { generateSFX } from 'agentos';
71
+
72
+ const result = await generateSFX({
73
+ prompt: 'Thunder crack followed by heavy rain on a tin roof',
74
+ durationSec: 5,
75
+ });
76
+ console.log(result.audio[0].url);
77
+ ```
78
+
79
+ ### Prompt Tips for Sound Effects
80
+
81
+ - **Be specific about the sound**: "glass bottle shattering on concrete floor" rather than just "glass breaking"
82
+ - **Describe the environment**: "footsteps on gravel in an empty parking garage with echo"
83
+ - **Layer multiple sounds**: "busy city intersection with car horns, distant sirens, and pedestrian chatter"
84
+ - **Specify duration context**: short stingers (1-3s) vs ambient loops (10-15s)
85
+ - **Include physical properties**: "heavy wooden door creaking open slowly", "small metallic click of a light switch"
86
+
87
+ ### SFX Options
88
+
89
+ | Option | Default | Description |
90
+ |--------|---------|-------------|
91
+ | `prompt` | (required) | Text description of the desired sound effect |
92
+ | `provider` | auto-detect | Provider ID (`"elevenlabs-sfx"`, `"stable-audio"`, etc.) |
93
+ | `model` | provider default | Model identifier within the provider |
94
+ | `durationSec` | provider default | Output duration in seconds (SFX is typically 1-15s) |
95
+ | `outputFormat` | `"mp3"` | Output format: `"mp3"`, `"wav"`, `"flac"`, `"ogg"`, `"aac"` |
96
+ | `seed` | random | Seed for reproducible output (provider-dependent) |
97
+ | `n` | `1` | Number of clips to generate |
98
+
99
+ ## Provider Selection Guide
100
+
101
+ ### Music Providers
102
+
103
+ | Provider | ID | Best For | Env Var | Key Required |
104
+ |----------|-----|----------|---------|-------------|
105
+ | **Suno** | `suno` | Highest quality vocals + instrumentals, full songs | `SUNO_API_KEY` | Yes |
106
+ | **Udio** | `udio` | High quality music, alternative to Suno | `UDIO_API_KEY` | Yes |
107
+ | **Stable Audio** | `stable-audio` | Instrumentals, loops, ambient, fast generation | `STABILITY_API_KEY` | Yes |
108
+ | **Replicate** | `replicate-audio` | Open-source models (MusicGen), pay-per-use | `REPLICATE_API_TOKEN` | Yes |
109
+ | **Fal** | `fal-audio` | Fast serverless GPU, cost-effective | `FAL_API_KEY` | Yes |
110
+ | **MusicGen Local** | `musicgen-local` | Offline generation, no API key needed, privacy | — | No |
111
+
112
+ ### SFX Providers
113
+
114
+ | Provider | ID | Best For | Env Var | Key Required |
115
+ |----------|-----|----------|---------|-------------|
116
+ | **ElevenLabs** | `elevenlabs-sfx` | Highest quality SFX, fast turnaround | `ELEVENLABS_API_KEY` | Yes |
117
+ | **Stable Audio** | `stable-audio` | Good SFX + music in one provider | `STABILITY_API_KEY` | Yes |
118
+ | **Replicate** | `replicate-audio` | Open-source AudioGen model, pay-per-use | `REPLICATE_API_TOKEN` | Yes |
119
+ | **Fal** | `fal-audio` | Fast serverless GPU | `FAL_API_KEY` | Yes |
120
+ | **AudioGen Local** | `audiogen-local` | Offline SFX generation, no API key needed | — | No |
121
+
122
+ ### Forcing a Specific Provider
123
+
124
+ ```typescript
125
+ const result = await generateMusic({
126
+ prompt: 'Chill synthwave with arpeggiated synths',
127
+ provider: 'stable-audio',
128
+ apiKey: 'your-stability-key',
129
+ durationSec: 30,
130
+ });
131
+ ```
132
+
133
+ ## Provider Preferences
134
+
135
+ Use `providerPreferences` to control the fallback chain ordering and filtering without hardcoding a single provider. This is useful for load balancing, cost optimization, or respecting user preferences.
136
+
137
+ ```typescript
138
+ import { generateMusic } from 'agentos';
139
+
140
+ // Prefer Suno, fall back to Stable Audio, never use Udio
141
+ const result = await generateMusic({
142
+ prompt: 'Orchestral film score with dramatic strings',
143
+ providerPreferences: {
144
+ preferred: ['suno', 'stable-audio'],
145
+ blocked: ['udio'],
146
+ },
147
+ });
148
+ ```
149
+
150
+ ### Preference Fields
151
+
152
+ | Field | Description |
153
+ |-------|-------------|
154
+ | `preferred` | Ordered list of provider IDs to try first. Providers not in this list are excluded. |
155
+ | `blocked` | Provider IDs to unconditionally exclude from the chain. |
156
+ | `weights` | Weight map for weighted random selection (useful for A/B testing or load balancing). |
157
+
158
+ Provider preferences work identically across `generateMusic()`, `generateSFX()`, `generateImage()`, and `generateVideo()`.
159
+
160
+ ## When to Use Music vs SFX vs TTS
161
+
162
+ | Need | API | Why |
163
+ |------|-----|-----|
164
+ | Background music, songs, jingles | `generateMusic()` | Optimized for musical compositions with melody, harmony, rhythm |
165
+ | Sound effects, foley, ambient sounds | `generateSFX()` | Optimized for short, non-musical audio (impacts, nature, UI sounds) |
166
+ | Speech, narration, voice cloning | TTS (speech subsystem) | Use the speech/TTS APIs instead — audio generation is for non-speech |
167
+ | Podcast intros with music + voice | Combine both | Generate music with `generateMusic()`, speech with TTS, mix externally |
168
+
169
+ ## Combining Audio
170
+
171
+ The audio generation APIs return URLs or base64 data that can be combined in downstream workflows:
172
+
173
+ 1. **Generate background music**: `generateMusic({ prompt: 'Gentle ambient pad' })`
174
+ 2. **Generate SFX stingers**: `generateSFX({ prompt: 'Notification chime' })`
175
+ 3. **Generate speech**: Use the TTS subsystem for narration
176
+ 4. **Mix**: Use ffmpeg or a Web Audio API pipeline to layer the tracks
177
+
178
+ ```typescript
179
+ import { generateMusic, generateSFX } from 'agentos';
180
+
181
+ // Generate assets in parallel
182
+ const [music, sfx] = await Promise.all([
183
+ generateMusic({ prompt: 'Calm podcast background music', durationSec: 120 }),
184
+ generateSFX({ prompt: 'Soft transition whoosh', durationSec: 2 }),
185
+ ]);
186
+
187
+ // Use the URLs/base64 data in your mixing pipeline
188
+ console.log('Music:', music.audio[0].url);
189
+ console.log('SFX:', sfx.audio[0].url);
190
+ ```
191
+
192
+ ## Local Providers (No API Key)
193
+
194
+ Both MusicGen and AudioGen can run locally without any API keys using HuggingFace Transformers.js. The models are downloaded on first use and cached locally.
195
+
196
+ **Requirements:**
197
+ - `@huggingface/transformers` must be installed as a peer dependency
198
+ - Sufficient RAM for model inference (MusicGen Small ~1GB, AudioGen Medium ~2GB)
199
+
200
+ ```typescript
201
+ // Explicitly use local generation
202
+ const result = await generateMusic({
203
+ prompt: 'Simple piano melody',
204
+ provider: 'musicgen-local',
205
+ });
206
+ ```
207
+
208
+ Local providers are automatically used as the last fallback when no cloud API keys are configured.
209
+
210
+ ## Prerequisites
211
+
212
+ - At least one audio provider API key for cloud generation, OR `@huggingface/transformers` for local generation
213
+ - For music: `SUNO_API_KEY`, `UDIO_API_KEY`, `STABILITY_API_KEY`, `REPLICATE_API_TOKEN`, or `FAL_API_KEY`
214
+ - For SFX: `ELEVENLABS_API_KEY`, `STABILITY_API_KEY`, `REPLICATE_API_TOKEN`, or `FAL_API_KEY`
215
+
216
+ ## Examples
217
+
218
+ - "Generate a 60-second lo-fi hip hop beat for a study playlist"
219
+ - "Create a thunder and rain sound effect for my podcast intro"
220
+ - "Make upbeat electronic music for a product demo video"
221
+ - "Generate a notification chime sound effect"
222
+ - "Create ambient forest sounds with birds and a gentle stream"
223
+ - "Generate a dramatic orchestral score for a trailer"
224
+ - "Make a retro 8-bit video game soundtrack"
225
+ - "Create footstep sounds on different surfaces — wood, gravel, snow"
@@ -1,13 +1,13 @@
1
1
  ---
2
2
  name: emergent-tools
3
- version: '1.0.0'
4
- description: Forge new tools at runtime via LLM sandboxed execution, LLM-as-judge validation, composable tool building, and full audit trail.
3
+ version: '2.0.0'
4
+ description: Self-improving agent toolkit forge runtime tools, adapt personality traits, manage skills dynamically, compose multi-step workflows, and self-evaluate performance with bounded autonomy.
5
5
  author: Wunderland
6
6
  namespace: wunderland
7
7
  category: productivity
8
- tags: [emergent, tools, forge, sandbox, dynamic, runtime, LLM-judge]
8
+ tags: [emergent, tools, forge, sandbox, dynamic, runtime, LLM-judge, self-improvement, personality, skills, workflow, self-evaluation]
9
9
  requires_secrets: []
10
- requires_tools: [forge_tool]
10
+ requires_tools: [forge_tool, adapt_personality, manage_skills, create_workflow, self_evaluate]
11
11
  metadata:
12
12
  agentos:
13
13
  emoji: "\U0001F527"
@@ -15,7 +15,24 @@ metadata:
15
15
 
16
16
  # Emergent Tools
17
17
 
18
- You have access to the EmergentCapabilityEngine — a system that lets you create brand-new tools at runtime when no existing tool satisfies the user's request. This is a powerful capability; use it wisely.
18
+ You have access to the EmergentCapabilityEngine — a system that lets you create brand-new tools at runtime when no existing tool satisfies the user's request, and a suite of self-improvement tools that let you adapt your personality, manage your skills, compose workflows, and evaluate your own performance. These are powerful capabilities; use them wisely.
19
+
20
+ ## Self-Improvement Overview
21
+
22
+ The self-improvement system provides **bounded autonomy**: you can modify your own behavior within configurable limits. Four tools work together to form a self-improvement loop:
23
+
24
+ 1. **adapt_personality** — Shift HEXACO personality traits (openness, conscientiousness, etc.) to better match user needs.
25
+ 2. **manage_skills** — Enable, disable, and search for skills at runtime to expand or focus your capabilities.
26
+ 3. **create_workflow** — Compose multi-step tool pipelines for repeated tasks.
27
+ 4. **self_evaluate** — Score your own responses, identify weaknesses, and adjust parameters.
28
+
29
+ All modifications are bounded:
30
+ - Personality shifts are capped by a per-session delta budget (default: ±0.15 per trait).
31
+ - Skill changes are gated by an allowlist and optional human-in-the-loop approval for new categories.
32
+ - Workflows are limited to a configurable max step count (default: 10) with no recursion.
33
+ - Self-evaluations are capped per session (default: 10) to prevent excessive LLM calls.
34
+
35
+ Mutations decay over time via Ebbinghaus-style forgetting during consolidation cycles. Only reinforced adaptations persist long-term.
19
36
 
20
37
  ## When to Forge vs. Use Existing Tools
21
38
 
@@ -52,6 +69,112 @@ The `forge_tool` meta-tool is your interface to the EmergentCapabilityEngine. In
52
69
 
53
70
  The more precise your specification, the higher the first-pass success rate.
54
71
 
72
+ ## adapt_personality
73
+
74
+ The `adapt_personality` tool lets you shift HEXACO personality dimensions at runtime. Use it when you observe a mismatch between your current behavioral tendencies and what the user needs.
75
+
76
+ **When to adjust:**
77
+ - User feedback suggests you're too formal/casual, too verbose/terse, too cautious/bold.
78
+ - A pattern of user corrections indicates a trait mismatch (e.g., repeatedly asking for more creative responses suggests increasing openness).
79
+ - Self-evaluation identifies a personality-related weakness.
80
+
81
+ **How it works:**
82
+ - Provide the `trait` name (one of the HEXACO dimensions), a signed `delta`, and a `reasoning` string explaining why.
83
+ - The delta is clamped to the per-session budget (default ±0.15) and the final value to [0, 1].
84
+ - Every mutation is recorded in the PersonalityMutationStore with an audit trail.
85
+ - Mutations start at strength 1.0 and decay by the configured rate (default 0.05) each consolidation cycle.
86
+ - Unreinforced mutations fade to zero over ~18 cycles; reinforced mutations (repeated similar adjustments) maintain effective strength.
87
+
88
+ **Always provide reasoning.** The reasoning is persisted and auditable. Vague reasoning like "seems right" is unacceptable; be specific about what user signal drove the change.
89
+
90
+ ## manage_skills
91
+
92
+ The `manage_skills` tool lets you enable, disable, and search for skills at runtime.
93
+
94
+ **Actions:**
95
+ - `search` — Find skills by keyword or description. Always search before enabling to find the best match.
96
+ - `enable` — Load a skill by ID. The skill becomes immediately active.
97
+ - `disable` — Unload a previously loaded skill. Locked skills (core skills) cannot be disabled.
98
+ - `list` — List all currently active skills.
99
+
100
+ **Allowlist patterns:**
101
+ - `['*']` — All skills are permitted (default). Use with caution in production.
102
+ - `['category:productivity', 'category:search']` — Only skills in the listed categories are permitted.
103
+ - `['com.framers.skill.web-search', 'com.framers.skill.calculator']` — Only the exact skill IDs listed are permitted.
104
+
105
+ **Category gating:** When `requireApprovalForNewCategories` is enabled (default: true), enabling a skill from a category not already represented among active skills returns a `requires_approval` status. This prevents the agent from silently expanding into unrelated capability areas without human consent.
106
+
107
+ **Workflow:** Search → review results → enable the best match. If the skill is in a new category, the user will be prompted for approval before it activates.
108
+
109
+ ## create_workflow
110
+
111
+ The `create_workflow` tool lets you compose multi-step tool pipelines and execute them as a unit.
112
+
113
+ **Reference resolution:** Steps can reference data from earlier in the pipeline:
114
+ - `$input` — The workflow's original input argument.
115
+ - `$prev` — The output of the immediately preceding step.
116
+ - `$steps[N]` — The output of the Nth step (zero-indexed).
117
+
118
+ **Example workflow:**
119
+ ```json
120
+ {
121
+ "action": "create",
122
+ "name": "research_and_summarize",
123
+ "steps": [
124
+ { "tool": "web_search", "args": { "query": "$input.topic" } },
125
+ { "tool": "extract_text", "args": { "url": "$prev.results[0].url" } },
126
+ { "tool": "summarize", "args": { "text": "$prev.content", "maxLength": 200 } }
127
+ ]
128
+ }
129
+ ```
130
+
131
+ **Constraints:**
132
+ - Maximum steps per workflow: configurable (default 10).
133
+ - Only tools from the `allowedTools` list may be used. Default is `['*']` (all tools).
134
+ - `create_workflow` itself is always excluded from workflow steps to prevent recursion.
135
+ - Each step execution has a 30-second timeout.
136
+
137
+ **Actions:**
138
+ - `create` — Define a new named workflow.
139
+ - `run` — Execute a previously created workflow with input.
140
+ - `list` — List all workflows created in this session.
141
+
142
+ ## self_evaluate
143
+
144
+ The `self_evaluate` tool lets you score your own responses and adjust operational parameters.
145
+
146
+ **When to self-evaluate:**
147
+ - After a complex multi-turn interaction to assess overall quality.
148
+ - When user feedback (explicit or implicit) suggests dissatisfaction.
149
+ - Periodically (every N turns) as a quality checkpoint.
150
+
151
+ **Evaluation criteria:** The tool scores responses across multiple dimensions (helpfulness, accuracy, clarity, safety) and produces an overall score with reasoning.
152
+
153
+ **Auto-adjustment:** When `autoAdjust` is enabled (default: true), the tool can immediately apply parameter changes based on evaluation results:
154
+ - `temperature` — Adjust LLM sampling temperature for more/less creative responses.
155
+ - `verbosity` — Shift response length preference.
156
+ - `personality` — Delegate trait adjustments to `adapt_personality`.
157
+
158
+ **Adjustable parameters** are configured via `adjustableParams` (default: `['temperature', 'verbosity', 'personality']`). Only listed parameters can be modified.
159
+
160
+ **Session cap:** Maximum evaluations per session is configurable (default: 10) to prevent excessive self-reflection loops.
161
+
162
+ ## Self-Improvement Workflow
163
+
164
+ The full self-improvement loop combines all four tools:
165
+
166
+ 1. **Evaluate** — Use `self_evaluate` to score recent performance. Identify specific weaknesses (e.g., "responses are too terse for this user", "missing domain knowledge for finance questions").
167
+
168
+ 2. **Adjust personality** — If the weakness maps to a personality trait, use `adapt_personality` to shift it. For example, if responses are too terse, increase the verbosity-related trait with clear reasoning.
169
+
170
+ 3. **Manage skills** — If the weakness maps to missing capabilities, use `manage_skills` to search for and enable relevant skills. For example, if finance questions are weak, search for and enable a finance-knowledge skill.
171
+
172
+ 4. **Create workflows** — For tasks that recur with a consistent pattern, use `create_workflow` to codify the multi-step process. This saves re-planning on every invocation.
173
+
174
+ 5. **Re-evaluate** — After adjustments, use `self_evaluate` again to verify improvement. If scores improved, the adjustments are reinforced. If not, consider reverting or trying a different approach.
175
+
176
+ This loop is not meant to run on every turn. Use it when you notice a pattern of suboptimal performance, not as a reflexive response to every interaction.
177
+
55
178
  ## ComposableToolBuilder
56
179
 
57
180
  For compositions of existing tools, use the ComposableToolBuilder pattern:
@@ -85,6 +208,8 @@ Every forged tool carries an audit record containing:
85
208
 
86
209
  This trail is immutable. If a user asks "how was this tool made?", you can retrieve and explain its provenance.
87
210
 
211
+ Personality mutations are also fully auditable: every `adapt_personality` call records the trait, delta, reasoning, baseline value, and mutated value with timestamps.
212
+
88
213
  ## Best Practices
89
214
 
90
215
  1. **Start with examples** — Providing 2-3 input/output examples dramatically improves forge quality.
@@ -95,3 +220,6 @@ This trail is immutable. If a user asks "how was this tool made?", you can retri
95
220
  6. **Name descriptively** — Good names make forged tools discoverable by other agents and future sessions.
96
221
  7. **Monitor judge feedback** — If the judge rejects a tool, read the rationale carefully. It usually pinpoints exactly what to fix.
97
222
  8. **Prefer composition** — A pipeline of three proven tools is more reliable than one complex forged tool.
223
+ 9. **Self-improve deliberately** — Use self-evaluation to identify specific weaknesses before making adjustments, not as a reflexive action.
224
+ 10. **Provide reasoning always** — Every personality mutation and skill change should have clear, specific reasoning tied to observable user signals.
225
+ 11. **Let decay work** — Don't fight the decay model. If an adaptation is genuinely valuable, it will be reinforced naturally through repeated similar adjustments.
@@ -91,6 +91,44 @@ Additional tips:
91
91
  - "Show me 3 variations of this hero image with different color palettes."
92
92
  - "Generate a 16:9 cinematic landscape of a neon-lit Tokyo street at night in the rain."
93
93
 
94
+ ## Provider Preferences
95
+
96
+ You can override the default fallback chain on a per-request basis using the `providerPreferences` field from the agent config (see `providerPreferences.image` in `agent.config.json`). This lets users pin preferred providers, weight them for probabilistic routing, or block specific providers entirely.
97
+
98
+ | Key | Type | Purpose |
99
+ |-----|------|---------|
100
+ | `preferred` | `string[]` | Ordered list of provider IDs to try first (e.g., `['stability', 'openai']`). |
101
+ | `weights` | `Record<string, number>` | Relative selection weights for probabilistic routing (e.g., `{ stability: 0.7, openai: 0.3 }`). |
102
+ | `blocked` | `string[]` | Provider IDs that must never be used (e.g., `['replicate']`). |
103
+
104
+ Example — passing preferences inline:
105
+
106
+ ```ts
107
+ generateImage({
108
+ prompt: 'A neon-lit Tokyo alley in the rain',
109
+ providerPreferences: {
110
+ preferred: ['stability', 'openai'],
111
+ blocked: ['replicate'],
112
+ },
113
+ });
114
+ ```
115
+
116
+ Example — setting in `agent.config.json` so all image calls inherit the preference:
117
+
118
+ ```jsonc
119
+ {
120
+ "providerPreferences": {
121
+ "image": {
122
+ "preferred": ["stability", "bfl"],
123
+ "weights": { "stability": 0.6, "bfl": 0.4 },
124
+ "blocked": ["replicate"]
125
+ }
126
+ }
127
+ }
128
+ ```
129
+
130
+ When `providerPreferences.image` is set in the agent config, the runtime merges it with any per-request overrides (per-request wins). Blocked providers are removed from the fallback chain before any attempt is made.
131
+
94
132
  ## Constraints
95
133
 
96
134
  - Image generation costs API credits per request; inform the user of approximate costs when possible.
package/registry.json CHANGED
@@ -1,6 +1,6 @@
1
1
  {
2
2
  "version": "1.0.0",
3
- "updated": "2026-03-27T07:00:16.599Z",
3
+ "updated": "2026-03-27T15:27:30.746Z",
4
4
  "categories": {
5
5
  "curated": [
6
6
  "1password",
@@ -9,6 +9,7 @@
9
9
  "amazon-polly",
10
10
  "apple-notes",
11
11
  "apple-reminders",
12
+ "audio-generation",
12
13
  "blog-publisher",
13
14
  "bluesky-bot",
14
15
  "cloud-ops",
@@ -85,7 +86,7 @@
85
86
  "namespace": "wunderland",
86
87
  "verified": true,
87
88
  "source": "curated",
88
- "verifiedAt": "2026-03-27T07:00:16.599Z",
89
+ "verifiedAt": "2026-03-27T15:27:30.746Z",
89
90
  "keywords": [
90
91
  "1password",
91
92
  "passwords",
@@ -130,7 +131,7 @@
130
131
  "namespace": "wunderland",
131
132
  "verified": true,
132
133
  "source": "curated",
133
- "verifiedAt": "2026-03-27T07:00:16.599Z",
134
+ "verifiedAt": "2026-03-27T15:27:30.746Z",
134
135
  "keywords": [
135
136
  "accounts",
136
137
  "credentials",
@@ -166,7 +167,7 @@
166
167
  "namespace": "wunderland",
167
168
  "verified": true,
168
169
  "source": "curated",
169
- "verifiedAt": "2026-03-27T07:00:16.599Z",
170
+ "verifiedAt": "2026-03-27T15:27:30.746Z",
170
171
  "keywords": [
171
172
  "agent",
172
173
  "config",
@@ -187,7 +188,7 @@
187
188
  "namespace": "wunderland",
188
189
  "verified": true,
189
190
  "source": "curated",
190
- "verifiedAt": "2026-03-27T07:00:16.599Z",
191
+ "verifiedAt": "2026-03-27T15:27:30.746Z",
191
192
  "keywords": [
192
193
  "voice",
193
194
  "tts",
@@ -218,7 +219,7 @@
218
219
  "namespace": "wunderland",
219
220
  "verified": true,
220
221
  "source": "curated",
221
- "verifiedAt": "2026-03-27T07:00:16.599Z",
222
+ "verifiedAt": "2026-03-27T15:27:30.746Z",
222
223
  "keywords": [
223
224
  "apple-notes",
224
225
  "macos",
@@ -252,7 +253,7 @@
252
253
  "namespace": "wunderland",
253
254
  "verified": true,
254
255
  "source": "curated",
255
- "verifiedAt": "2026-03-27T07:00:16.599Z",
256
+ "verifiedAt": "2026-03-27T15:27:30.746Z",
256
257
  "keywords": [
257
258
  "apple-reminders",
258
259
  "macos",
@@ -276,6 +277,33 @@
276
277
  }
277
278
  }
278
279
  },
280
+ {
281
+ "id": "com.framers.skill.audio-generation",
282
+ "name": "audio-generation",
283
+ "displayName": "audio-generation",
284
+ "version": "1.0.0",
285
+ "path": "registry/curated/audio-generation",
286
+ "description": "Music and sound effects generation — 8 providers with fallback chains, user-configurable preferences, local and cloud options.",
287
+ "category": "media",
288
+ "namespace": "wunderland",
289
+ "verified": true,
290
+ "source": "curated",
291
+ "verifiedAt": "2026-03-27T15:27:30.746Z",
292
+ "keywords": [
293
+ "audio",
294
+ "music",
295
+ "sound-effects",
296
+ "sfx",
297
+ "generation",
298
+ "suno",
299
+ "elevenlabs",
300
+ "stable-audio",
301
+ "musicgen"
302
+ ],
303
+ "metadata": {
304
+ "emoji": "🎵"
305
+ }
306
+ },
279
307
  {
280
308
  "id": "com.framers.skill.blog-publisher",
281
309
  "name": "blog-publisher",
@@ -287,7 +315,7 @@
287
315
  "namespace": "wunderland",
288
316
  "verified": true,
289
317
  "source": "curated",
290
- "verifiedAt": "2026-03-27T07:00:16.599Z",
318
+ "verifiedAt": "2026-03-27T15:27:30.746Z",
291
319
  "keywords": [
292
320
  "blog",
293
321
  "publishing",
@@ -331,7 +359,7 @@
331
359
  "namespace": "wunderland",
332
360
  "verified": true,
333
361
  "source": "curated",
334
- "verifiedAt": "2026-03-27T07:00:16.599Z",
362
+ "verifiedAt": "2026-03-27T15:27:30.746Z",
335
363
  "keywords": [
336
364
  "bluesky",
337
365
  "social-media",
@@ -371,7 +399,7 @@
371
399
  "namespace": "wunderland",
372
400
  "verified": true,
373
401
  "source": "curated",
374
- "verifiedAt": "2026-03-27T07:00:16.599Z",
402
+ "verifiedAt": "2026-03-27T15:27:30.746Z",
375
403
  "keywords": [
376
404
  "cloud",
377
405
  "devops",
@@ -398,7 +426,7 @@
398
426
  "namespace": "wunderland",
399
427
  "verified": true,
400
428
  "source": "curated",
401
- "verifiedAt": "2026-03-27T07:00:16.599Z",
429
+ "verifiedAt": "2026-03-27T15:27:30.746Z",
402
430
  "keywords": [
403
431
  "guardrails",
404
432
  "code-safety",
@@ -426,7 +454,7 @@
426
454
  "namespace": "wunderland",
427
455
  "verified": true,
428
456
  "source": "curated",
429
- "verifiedAt": "2026-03-27T07:00:16.599Z",
457
+ "verifiedAt": "2026-03-27T15:27:30.746Z",
430
458
  "keywords": [
431
459
  "coding",
432
460
  "programming",
@@ -453,7 +481,7 @@
453
481
  "namespace": "wunderland",
454
482
  "verified": true,
455
483
  "source": "curated",
456
- "verifiedAt": "2026-03-27T07:00:16.599Z",
484
+ "verifiedAt": "2026-03-27T15:27:30.746Z",
457
485
  "keywords": [
458
486
  "content",
459
487
  "writing",
@@ -483,7 +511,7 @@
483
511
  "namespace": "wunderland",
484
512
  "verified": true,
485
513
  "source": "curated",
486
- "verifiedAt": "2026-03-27T07:00:16.599Z",
514
+ "verifiedAt": "2026-03-27T15:27:30.746Z",
487
515
  "keywords": [
488
516
  "research",
489
517
  "investigation",
@@ -521,7 +549,7 @@
521
549
  "namespace": "wunderland",
522
550
  "verified": true,
523
551
  "source": "curated",
524
- "verifiedAt": "2026-03-27T07:00:16.599Z",
552
+ "verifiedAt": "2026-03-27T15:27:30.746Z",
525
553
  "keywords": [
526
554
  "voice",
527
555
  "diarization",
@@ -546,7 +574,7 @@
546
574
  "namespace": "wunderland",
547
575
  "verified": true,
548
576
  "source": "curated",
549
- "verifiedAt": "2026-03-27T07:00:16.599Z",
577
+ "verifiedAt": "2026-03-27T15:27:30.746Z",
550
578
  "keywords": [
551
579
  "discord",
552
580
  "messaging",
@@ -574,7 +602,7 @@
574
602
  "namespace": "wunderland",
575
603
  "verified": true,
576
604
  "source": "curated",
577
- "verifiedAt": "2026-03-27T07:00:16.599Z",
605
+ "verifiedAt": "2026-03-27T15:27:30.746Z",
578
606
  "metadata": {
579
607
  "primaryEnv": "INTERNAL_API_SECRET",
580
608
  "emoji": "📧",
@@ -608,14 +636,14 @@
608
636
  "id": "com.framers.skill.emergent-tools",
609
637
  "name": "emergent-tools",
610
638
  "displayName": "emergent-tools",
611
- "version": "1.0.0",
639
+ "version": "2.0.0",
612
640
  "path": "registry/curated/emergent-tools",
613
- "description": "Forge new tools at runtime via LLM sandboxed execution, LLM-as-judge validation, composable tool building, and full audit trail.",
641
+ "description": "Self-improving agent toolkit forge runtime tools, adapt personality traits, manage skills dynamically, compose multi-step workflows, and self-evaluate performance with bounded autonomy.",
614
642
  "category": "productivity",
615
643
  "namespace": "wunderland",
616
644
  "verified": true,
617
645
  "source": "curated",
618
- "verifiedAt": "2026-03-27T07:00:16.599Z",
646
+ "verifiedAt": "2026-03-27T15:27:30.746Z",
619
647
  "keywords": [
620
648
  "emergent",
621
649
  "tools",
@@ -623,10 +651,19 @@
623
651
  "sandbox",
624
652
  "dynamic",
625
653
  "runtime",
626
- "LLM-judge"
654
+ "LLM-judge",
655
+ "self-improvement",
656
+ "personality",
657
+ "skills",
658
+ "workflow",
659
+ "self-evaluation"
627
660
  ],
628
661
  "requiredTools": [
629
- "forge_tool"
662
+ "forge_tool",
663
+ "adapt_personality",
664
+ "manage_skills",
665
+ "create_workflow",
666
+ "self_evaluate"
630
667
  ],
631
668
  "metadata": {
632
669
  "emoji": "🔧"
@@ -643,7 +680,7 @@
643
680
  "namespace": "wunderland",
644
681
  "verified": true,
645
682
  "source": "curated",
646
- "verifiedAt": "2026-03-27T07:00:16.599Z",
683
+ "verifiedAt": "2026-03-27T15:27:30.746Z",
647
684
  "keywords": [
648
685
  "voice",
649
686
  "endpointing",
@@ -669,7 +706,7 @@
669
706
  "namespace": "wunderland",
670
707
  "verified": true,
671
708
  "source": "curated",
672
- "verifiedAt": "2026-03-27T07:00:16.599Z",
709
+ "verifiedAt": "2026-03-27T15:27:30.746Z",
673
710
  "keywords": [
674
711
  "facebook",
675
712
  "social-media",
@@ -708,7 +745,7 @@
708
745
  "namespace": "wunderland",
709
746
  "verified": true,
710
747
  "source": "curated",
711
- "verifiedAt": "2026-03-27T07:00:16.599Z",
748
+ "verifiedAt": "2026-03-27T15:27:30.746Z",
712
749
  "keywords": [
713
750
  "git",
714
751
  "version-control",
@@ -762,7 +799,7 @@
762
799
  "namespace": "wunderland",
763
800
  "verified": true,
764
801
  "source": "curated",
765
- "verifiedAt": "2026-03-27T07:00:16.599Z",
802
+ "verifiedAt": "2026-03-27T15:27:30.746Z",
766
803
  "keywords": [
767
804
  "github",
768
805
  "git",
@@ -821,7 +858,7 @@
821
858
  "namespace": "wunderland",
822
859
  "verified": true,
823
860
  "source": "curated",
824
- "verifiedAt": "2026-03-27T07:00:16.599Z",
861
+ "verifiedAt": "2026-03-27T15:27:30.746Z",
825
862
  "keywords": [
826
863
  "voice",
827
864
  "stt",
@@ -850,7 +887,7 @@
850
887
  "namespace": "wunderland",
851
888
  "verified": true,
852
889
  "source": "curated",
853
- "verifiedAt": "2026-03-27T07:00:16.599Z",
890
+ "verifiedAt": "2026-03-27T15:27:30.746Z",
854
891
  "keywords": [
855
892
  "voice",
856
893
  "tts",
@@ -879,7 +916,7 @@
879
916
  "namespace": "wunderland",
880
917
  "verified": true,
881
918
  "source": "curated",
882
- "verifiedAt": "2026-03-27T07:00:16.599Z",
919
+ "verifiedAt": "2026-03-27T15:27:30.746Z",
883
920
  "keywords": [
884
921
  "guardrails",
885
922
  "hallucination",
@@ -907,7 +944,7 @@
907
944
  "namespace": "wunderland",
908
945
  "verified": true,
909
946
  "source": "curated",
910
- "verifiedAt": "2026-03-27T07:00:16.599Z",
947
+ "verifiedAt": "2026-03-27T15:27:30.746Z",
911
948
  "keywords": [
912
949
  "monitoring",
913
950
  "health",
@@ -940,7 +977,7 @@
940
977
  "namespace": "wunderland",
941
978
  "verified": true,
942
979
  "source": "curated",
943
- "verifiedAt": "2026-03-27T07:00:16.599Z",
980
+ "verifiedAt": "2026-03-27T15:27:30.746Z",
944
981
  "keywords": [
945
982
  "image",
946
983
  "editing",
@@ -961,7 +998,7 @@
961
998
  "namespace": "wunderland",
962
999
  "verified": true,
963
1000
  "source": "curated",
964
- "verifiedAt": "2026-03-27T07:00:16.599Z",
1001
+ "verifiedAt": "2026-03-27T15:27:30.746Z",
965
1002
  "keywords": [
966
1003
  "image-generation",
967
1004
  "ai-art",
@@ -994,7 +1031,7 @@
994
1031
  "namespace": "wunderland",
995
1032
  "verified": true,
996
1033
  "source": "curated",
997
- "verifiedAt": "2026-03-27T07:00:16.599Z",
1034
+ "verifiedAt": "2026-03-27T15:27:30.746Z",
998
1035
  "keywords": [
999
1036
  "instagram",
1000
1037
  "social-media",
@@ -1032,7 +1069,7 @@
1032
1069
  "namespace": "wunderland",
1033
1070
  "verified": true,
1034
1071
  "source": "curated",
1035
- "verifiedAt": "2026-03-27T07:00:16.599Z",
1072
+ "verifiedAt": "2026-03-27T15:27:30.746Z",
1036
1073
  "keywords": [
1037
1074
  "linkedin",
1038
1075
  "social-media",
@@ -1070,7 +1107,7 @@
1070
1107
  "namespace": "wunderland",
1071
1108
  "verified": true,
1072
1109
  "source": "curated",
1073
- "verifiedAt": "2026-03-27T07:00:16.599Z",
1110
+ "verifiedAt": "2026-03-27T15:27:30.746Z",
1074
1111
  "keywords": [
1075
1112
  "mastodon",
1076
1113
  "fediverse",
@@ -1110,7 +1147,7 @@
1110
1147
  "namespace": "wunderland",
1111
1148
  "verified": true,
1112
1149
  "source": "curated",
1113
- "verifiedAt": "2026-03-27T07:00:16.599Z",
1150
+ "verifiedAt": "2026-03-27T15:27:30.746Z",
1114
1151
  "keywords": [
1115
1152
  "memory",
1116
1153
  "cognitive",
@@ -1134,7 +1171,7 @@
1134
1171
  "namespace": "wunderland",
1135
1172
  "verified": true,
1136
1173
  "source": "curated",
1137
- "verifiedAt": "2026-03-27T07:00:16.599Z",
1174
+ "verifiedAt": "2026-03-27T15:27:30.746Z",
1138
1175
  "keywords": [
1139
1176
  "guardrails",
1140
1177
  "safety",
@@ -1164,7 +1201,7 @@
1164
1201
  "namespace": "wunderland",
1165
1202
  "verified": true,
1166
1203
  "source": "curated",
1167
- "verifiedAt": "2026-03-27T07:00:16.599Z",
1204
+ "verifiedAt": "2026-03-27T15:27:30.746Z",
1168
1205
  "keywords": [
1169
1206
  "rag",
1170
1207
  "multimodal",
@@ -1194,7 +1231,7 @@
1194
1231
  "namespace": "wunderland",
1195
1232
  "verified": true,
1196
1233
  "source": "curated",
1197
- "verifiedAt": "2026-03-27T07:00:16.599Z",
1234
+ "verifiedAt": "2026-03-27T15:27:30.746Z",
1198
1235
  "keywords": [
1199
1236
  "notion",
1200
1237
  "wiki",
@@ -1223,7 +1260,7 @@
1223
1260
  "namespace": "wunderland",
1224
1261
  "verified": true,
1225
1262
  "source": "curated",
1226
- "verifiedAt": "2026-03-27T07:00:16.599Z",
1263
+ "verifiedAt": "2026-03-27T15:27:30.746Z",
1227
1264
  "keywords": [
1228
1265
  "obsidian",
1229
1266
  "markdown",
@@ -1251,7 +1288,7 @@
1251
1288
  "namespace": "wunderland",
1252
1289
  "verified": true,
1253
1290
  "source": "curated",
1254
- "verifiedAt": "2026-03-27T07:00:16.599Z",
1291
+ "verifiedAt": "2026-03-27T15:27:30.746Z",
1255
1292
  "keywords": [
1256
1293
  "voice",
1257
1294
  "wake-word",
@@ -1279,7 +1316,7 @@
1279
1316
  "namespace": "wunderland",
1280
1317
  "verified": true,
1281
1318
  "source": "curated",
1282
- "verifiedAt": "2026-03-27T07:00:16.599Z",
1319
+ "verifiedAt": "2026-03-27T15:27:30.746Z",
1283
1320
  "keywords": [
1284
1321
  "pii",
1285
1322
  "privacy",
@@ -1310,7 +1347,7 @@
1310
1347
  "namespace": "wunderland",
1311
1348
  "verified": true,
1312
1349
  "source": "curated",
1313
- "verifiedAt": "2026-03-27T07:00:16.599Z",
1350
+ "verifiedAt": "2026-03-27T15:27:30.746Z",
1314
1351
  "keywords": [
1315
1352
  "pinterest",
1316
1353
  "social-media",
@@ -1347,7 +1384,7 @@
1347
1384
  "namespace": "wunderland",
1348
1385
  "verified": true,
1349
1386
  "source": "curated",
1350
- "verifiedAt": "2026-03-27T07:00:16.599Z",
1387
+ "verifiedAt": "2026-03-27T15:27:30.746Z",
1351
1388
  "keywords": [
1352
1389
  "voice",
1353
1390
  "tts",
@@ -1374,7 +1411,7 @@
1374
1411
  "namespace": "wunderland",
1375
1412
  "verified": true,
1376
1413
  "source": "curated",
1377
- "verifiedAt": "2026-03-27T07:00:16.599Z",
1414
+ "verifiedAt": "2026-03-27T15:27:30.746Z",
1378
1415
  "keywords": [
1379
1416
  "voice",
1380
1417
  "wake-word",
@@ -1405,7 +1442,7 @@
1405
1442
  "namespace": "wunderland",
1406
1443
  "verified": true,
1407
1444
  "source": "curated",
1408
- "verifiedAt": "2026-03-27T07:00:16.599Z",
1445
+ "verifiedAt": "2026-03-27T15:27:30.746Z",
1409
1446
  "keywords": [
1410
1447
  "reddit",
1411
1448
  "social-media",
@@ -1446,7 +1483,7 @@
1446
1483
  "namespace": "wunderland",
1447
1484
  "verified": true,
1448
1485
  "source": "curated",
1449
- "verifiedAt": "2026-03-27T07:00:16.599Z",
1486
+ "verifiedAt": "2026-03-27T15:27:30.746Z",
1450
1487
  "keywords": [
1451
1488
  "seo",
1452
1489
  "link-building",
@@ -1481,7 +1518,7 @@
1481
1518
  "namespace": "wunderland",
1482
1519
  "verified": true,
1483
1520
  "source": "curated",
1484
- "verifiedAt": "2026-03-27T07:00:16.599Z",
1521
+ "verifiedAt": "2026-03-27T15:27:30.746Z",
1485
1522
  "keywords": [
1486
1523
  "deploy",
1487
1524
  "cloud",
@@ -1517,7 +1554,7 @@
1517
1554
  "namespace": "wunderland",
1518
1555
  "verified": true,
1519
1556
  "source": "curated",
1520
- "verifiedAt": "2026-03-27T07:00:16.599Z",
1557
+ "verifiedAt": "2026-03-27T15:27:30.746Z",
1521
1558
  "keywords": [
1522
1559
  "slack",
1523
1560
  "messaging",
@@ -1549,7 +1586,7 @@
1549
1586
  "namespace": "wunderland",
1550
1587
  "verified": true,
1551
1588
  "source": "curated",
1552
- "verifiedAt": "2026-03-27T07:00:16.599Z"
1589
+ "verifiedAt": "2026-03-27T15:27:30.746Z"
1553
1590
  },
1554
1591
  {
1555
1592
  "id": "com.framers.skill.spotify-player",
@@ -1562,7 +1599,7 @@
1562
1599
  "namespace": "wunderland",
1563
1600
  "verified": true,
1564
1601
  "source": "curated",
1565
- "verifiedAt": "2026-03-27T07:00:16.599Z",
1602
+ "verifiedAt": "2026-03-27T15:27:30.746Z",
1566
1603
  "keywords": [
1567
1604
  "spotify",
1568
1605
  "music",
@@ -1597,7 +1634,7 @@
1597
1634
  "namespace": "wunderland",
1598
1635
  "verified": true,
1599
1636
  "source": "curated",
1600
- "verifiedAt": "2026-03-27T07:00:16.599Z",
1637
+ "verifiedAt": "2026-03-27T15:27:30.746Z",
1601
1638
  "keywords": [
1602
1639
  "voice",
1603
1640
  "stt",
@@ -1627,7 +1664,7 @@
1627
1664
  "namespace": "wunderland",
1628
1665
  "verified": true,
1629
1666
  "source": "curated",
1630
- "verifiedAt": "2026-03-27T07:00:16.599Z",
1667
+ "verifiedAt": "2026-03-27T15:27:30.746Z",
1631
1668
  "keywords": [
1632
1669
  "voice",
1633
1670
  "stt",
@@ -1658,7 +1695,7 @@
1658
1695
  "namespace": "wunderland",
1659
1696
  "verified": true,
1660
1697
  "source": "curated",
1661
- "verifiedAt": "2026-03-27T07:00:16.599Z",
1698
+ "verifiedAt": "2026-03-27T15:27:30.746Z",
1662
1699
  "keywords": [
1663
1700
  "voice",
1664
1701
  "tts",
@@ -1688,7 +1725,7 @@
1688
1725
  "namespace": "wunderland",
1689
1726
  "verified": true,
1690
1727
  "source": "curated",
1691
- "verifiedAt": "2026-03-27T07:00:16.599Z",
1728
+ "verifiedAt": "2026-03-27T15:27:30.746Z",
1692
1729
  "keywords": [
1693
1730
  "voice",
1694
1731
  "tts",
@@ -1717,7 +1754,7 @@
1717
1754
  "namespace": "wunderland",
1718
1755
  "verified": true,
1719
1756
  "source": "curated",
1720
- "verifiedAt": "2026-03-27T07:00:16.599Z",
1757
+ "verifiedAt": "2026-03-27T15:27:30.746Z",
1721
1758
  "keywords": [
1722
1759
  "structured-output",
1723
1760
  "json",
@@ -1737,7 +1774,7 @@
1737
1774
  "namespace": "wunderland",
1738
1775
  "verified": true,
1739
1776
  "source": "curated",
1740
- "verifiedAt": "2026-03-27T07:00:16.599Z",
1777
+ "verifiedAt": "2026-03-27T15:27:30.746Z",
1741
1778
  "keywords": [
1742
1779
  "summarization",
1743
1780
  "text-processing",
@@ -1763,7 +1800,7 @@
1763
1800
  "namespace": "wunderland",
1764
1801
  "verified": true,
1765
1802
  "source": "curated",
1766
- "verifiedAt": "2026-03-27T07:00:16.599Z",
1803
+ "verifiedAt": "2026-03-27T15:27:30.746Z",
1767
1804
  "keywords": [
1768
1805
  "threads",
1769
1806
  "social-media",
@@ -1799,7 +1836,7 @@
1799
1836
  "namespace": "wunderland",
1800
1837
  "verified": true,
1801
1838
  "source": "curated",
1802
- "verifiedAt": "2026-03-27T07:00:16.599Z",
1839
+ "verifiedAt": "2026-03-27T15:27:30.746Z",
1803
1840
  "keywords": [
1804
1841
  "tiktok",
1805
1842
  "video",
@@ -1836,7 +1873,7 @@
1836
1873
  "namespace": "wunderland",
1837
1874
  "verified": true,
1838
1875
  "source": "curated",
1839
- "verifiedAt": "2026-03-27T07:00:16.599Z",
1876
+ "verifiedAt": "2026-03-27T15:27:30.746Z",
1840
1877
  "keywords": [
1841
1878
  "guardrails",
1842
1879
  "topics",
@@ -1863,7 +1900,7 @@
1863
1900
  "namespace": "wunderland",
1864
1901
  "verified": true,
1865
1902
  "source": "curated",
1866
- "verifiedAt": "2026-03-27T07:00:16.599Z",
1903
+ "verifiedAt": "2026-03-27T15:27:30.746Z",
1867
1904
  "keywords": [
1868
1905
  "trello",
1869
1906
  "kanban",
@@ -1896,7 +1933,7 @@
1896
1933
  "namespace": "wunderland",
1897
1934
  "verified": true,
1898
1935
  "source": "curated",
1899
- "verifiedAt": "2026-03-27T07:00:16.599Z",
1936
+ "verifiedAt": "2026-03-27T15:27:30.746Z",
1900
1937
  "keywords": [
1901
1938
  "twitter",
1902
1939
  "social-media",
@@ -1939,7 +1976,7 @@
1939
1976
  "namespace": "wunderland",
1940
1977
  "verified": true,
1941
1978
  "source": "curated",
1942
- "verifiedAt": "2026-03-27T07:00:16.599Z",
1979
+ "verifiedAt": "2026-03-27T15:27:30.746Z",
1943
1980
  "keywords": [
1944
1981
  "video",
1945
1982
  "generation",
@@ -1966,7 +2003,7 @@
1966
2003
  "namespace": "wunderland",
1967
2004
  "verified": true,
1968
2005
  "source": "curated",
1969
- "verifiedAt": "2026-03-27T07:00:16.599Z",
2006
+ "verifiedAt": "2026-03-27T15:27:30.746Z",
1970
2007
  "keywords": [
1971
2008
  "vision",
1972
2009
  "ocr",
@@ -1989,7 +2026,7 @@
1989
2026
  "namespace": "wunderland",
1990
2027
  "verified": true,
1991
2028
  "source": "curated",
1992
- "verifiedAt": "2026-03-27T07:00:16.599Z",
2029
+ "verifiedAt": "2026-03-27T15:27:30.746Z",
1993
2030
  "keywords": [
1994
2031
  "voice",
1995
2032
  "speech",
@@ -2016,7 +2053,7 @@
2016
2053
  "namespace": "wunderland",
2017
2054
  "verified": true,
2018
2055
  "source": "curated",
2019
- "verifiedAt": "2026-03-27T07:00:16.599Z",
2056
+ "verifiedAt": "2026-03-27T15:27:30.746Z",
2020
2057
  "keywords": [
2021
2058
  "voice",
2022
2059
  "stt",
@@ -2042,7 +2079,7 @@
2042
2079
  "namespace": "wunderland",
2043
2080
  "verified": true,
2044
2081
  "source": "curated",
2045
- "verifiedAt": "2026-03-27T07:00:16.599Z",
2082
+ "verifiedAt": "2026-03-27T15:27:30.746Z",
2046
2083
  "keywords": [
2047
2084
  "weather",
2048
2085
  "forecast",
@@ -2068,7 +2105,7 @@
2068
2105
  "namespace": "wunderland",
2069
2106
  "verified": true,
2070
2107
  "source": "curated",
2071
- "verifiedAt": "2026-03-27T07:00:16.599Z",
2108
+ "verifiedAt": "2026-03-27T15:27:30.746Z",
2072
2109
  "keywords": [
2073
2110
  "scraping",
2074
2111
  "browser",
@@ -2105,7 +2142,7 @@
2105
2142
  "namespace": "wunderland",
2106
2143
  "verified": true,
2107
2144
  "source": "curated",
2108
- "verifiedAt": "2026-03-27T07:00:16.599Z",
2145
+ "verifiedAt": "2026-03-27T15:27:30.746Z",
2109
2146
  "keywords": [
2110
2147
  "search",
2111
2148
  "web",
@@ -2132,7 +2169,7 @@
2132
2169
  "namespace": "wunderland",
2133
2170
  "verified": true,
2134
2171
  "source": "curated",
2135
- "verifiedAt": "2026-03-27T07:00:16.599Z",
2172
+ "verifiedAt": "2026-03-27T15:27:30.746Z",
2136
2173
  "keywords": [
2137
2174
  "transcription",
2138
2175
  "whisper",
@@ -2195,7 +2232,7 @@
2195
2232
  "namespace": "wunderland",
2196
2233
  "verified": true,
2197
2234
  "source": "curated",
2198
- "verifiedAt": "2026-03-27T07:00:16.599Z",
2235
+ "verifiedAt": "2026-03-27T15:27:30.746Z",
2199
2236
  "keywords": [
2200
2237
  "youtube",
2201
2238
  "video",
@@ -2228,8 +2265,8 @@
2228
2265
  "community": []
2229
2266
  },
2230
2267
  "stats": {
2231
- "totalSkills": 66,
2232
- "curatedCount": 66,
2268
+ "totalSkills": 67,
2269
+ "curatedCount": 67,
2233
2270
  "communityCount": 0
2234
2271
  }
2235
2272
  }