@framers/agentos-skills-registry 0.2.1 → 0.3.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/CONTRIBUTING.md +11 -5
- package/README.md +33 -7
- package/dist/catalog.d.ts +100 -0
- package/dist/catalog.d.ts.map +1 -1
- package/dist/catalog.js +222 -1
- package/dist/catalog.js.map +1 -1
- package/dist/index.d.ts +18 -4
- package/dist/index.d.ts.map +1 -1
- package/dist/index.js +32 -11
- package/dist/index.js.map +1 -1
- package/dist/workspace-discovery.d.ts +3 -10
- package/dist/workspace-discovery.d.ts.map +1 -1
- package/dist/workspace-discovery.js +28 -67
- package/dist/workspace-discovery.js.map +1 -1
- package/package.json +8 -6
- package/registry/curated/image-gen/SKILL.md +8 -2
- package/registry/curated/memory-manager/SKILL.md +127 -0
- package/registry/curated/reddit-bot/SKILL.md +13 -1
- package/registry/curated/voice-conversation/SKILL.md +65 -0
- package/registry.json +161 -109
- package/scripts/validate-skill.mjs +10 -4
package/dist/index.js
CHANGED
|
@@ -14,7 +14,8 @@
|
|
|
14
14
|
import * as path from 'node:path';
|
|
15
15
|
import * as fs from 'node:fs/promises';
|
|
16
16
|
// ── Re-export the programmatic catalog (zero heavy deps) ────────────────────
|
|
17
|
-
export { SKILLS_CATALOG, getSkillsByCategory, getSkillByName, getAvailableSkills, getCategories, getSkillsByTag, searchSkills, getCuratedSkills, getCommunitySkills, getAllSkills, } from './catalog.js';
|
|
17
|
+
export { SKILLS_CATALOG, getSkillsByCategory, getSkillByName, getAvailableSkills, getCategories, getSkillsByTag, searchSkills, getCuratedSkills, getCommunitySkills, getAllSkills, getSkillEntries, createLocalSkillProxy, loadSkillFromAbsolutePath, loadSkillByName, loadSkillsByNames, } from './catalog.js';
|
|
18
|
+
import { getSkillEntries, loadSkillsByNames, } from './catalog.js';
|
|
18
19
|
// ── Re-export workspace skill discovery (Feature 3.5) ───────────────────────
|
|
19
20
|
export { discoverWorkspaceSkills, mergeWithWorkspaceSkills, parseSkillFrontmatter, } from './workspace-discovery.js';
|
|
20
21
|
// ── Lazy loader for @framers/agentos ────────────────────────────────────────
|
|
@@ -78,6 +79,23 @@ export async function getAvailableCuratedSkills() {
|
|
|
78
79
|
return catalog.skills.curated ?? [];
|
|
79
80
|
}
|
|
80
81
|
// ── Factory functions (lazy-load @framers/agentos) ──────────────────────────
|
|
82
|
+
async function populateCuratedRegistry(args) {
|
|
83
|
+
const names = getSkillEntries(args.selection).map((entry) => entry.name);
|
|
84
|
+
const loadedSkills = await loadSkillsByNames(names);
|
|
85
|
+
for (const loadedSkill of loadedSkills) {
|
|
86
|
+
args.registry.register({
|
|
87
|
+
skill: {
|
|
88
|
+
name: loadedSkill.name,
|
|
89
|
+
description: loadedSkill.description,
|
|
90
|
+
content: loadedSkill.content,
|
|
91
|
+
},
|
|
92
|
+
frontmatter: loadedSkill.frontmatter,
|
|
93
|
+
metadata: loadedSkill.metadata ?? args.runtime.extractMetadata?.(loadedSkill.frontmatter),
|
|
94
|
+
sourcePath: path.dirname(loadedSkill.sourcePath),
|
|
95
|
+
source: 'bundled',
|
|
96
|
+
});
|
|
97
|
+
}
|
|
98
|
+
}
|
|
81
99
|
/**
|
|
82
100
|
* Create a SkillRegistry loaded with bundled curated skills.
|
|
83
101
|
*
|
|
@@ -85,13 +103,15 @@ export async function getAvailableCuratedSkills() {
|
|
|
85
103
|
* Throws a descriptive error if the peer dep is missing.
|
|
86
104
|
*/
|
|
87
105
|
export async function createCuratedSkillRegistry(options) {
|
|
88
|
-
const
|
|
89
|
-
const registry = new SkillRegistry(options?.config);
|
|
90
|
-
|
|
91
|
-
|
|
92
|
-
|
|
93
|
-
|
|
94
|
-
|
|
106
|
+
const runtime = await requireAgentOS();
|
|
107
|
+
const registry = new runtime.SkillRegistry(options?.config);
|
|
108
|
+
const selection = options?.skills ?? 'all';
|
|
109
|
+
if (selection !== 'none') {
|
|
110
|
+
await populateCuratedRegistry({
|
|
111
|
+
registry,
|
|
112
|
+
runtime,
|
|
113
|
+
selection,
|
|
114
|
+
});
|
|
95
115
|
}
|
|
96
116
|
return registry;
|
|
97
117
|
}
|
|
@@ -113,12 +133,13 @@ export async function createCuratedSkillSnapshot(options) {
|
|
|
113
133
|
createdAt,
|
|
114
134
|
};
|
|
115
135
|
}
|
|
116
|
-
const registry = await createCuratedSkillRegistry({
|
|
117
|
-
|
|
136
|
+
const registry = await createCuratedSkillRegistry({
|
|
137
|
+
config: options?.config,
|
|
138
|
+
skills: selection,
|
|
139
|
+
});
|
|
118
140
|
return registry.buildSnapshot({
|
|
119
141
|
platform: options?.platform,
|
|
120
142
|
eligibility: options?.eligibility,
|
|
121
|
-
filter,
|
|
122
143
|
});
|
|
123
144
|
}
|
|
124
145
|
//# sourceMappingURL=index.js.map
|
package/dist/index.js.map
CHANGED
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"index.js","sourceRoot":"","sources":["../src/index.ts"],"names":[],"mappings":"AAAA;;;;;;;;;;;;GAYG;AAEH,OAAO,KAAK,IAAI,MAAM,WAAW,CAAC;AAClC,OAAO,KAAK,EAAE,MAAM,kBAAkB,CAAC;AAyCvC,+EAA+E;AAE/E,OAAO,EACL,cAAc,EACd,mBAAmB,EACnB,cAAc,EACd,kBAAkB,EAClB,aAAa,EACb,cAAc,EACd,YAAY,EACZ,gBAAgB,EAChB,kBAAkB,EAClB,YAAY,
|
|
1
|
+
{"version":3,"file":"index.js","sourceRoot":"","sources":["../src/index.ts"],"names":[],"mappings":"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"}
|
|
@@ -9,9 +9,9 @@
|
|
|
9
9
|
*
|
|
10
10
|
* @module @framers/agentos-skills-registry/workspace-discovery
|
|
11
11
|
*/
|
|
12
|
-
import type
|
|
12
|
+
import { type LoadedSkillFrontmatter, type SkillCatalogEntry } from './catalog.js';
|
|
13
13
|
/** Raw frontmatter fields extracted from a workspace SKILL.md */
|
|
14
|
-
export interface SkillFrontmatter {
|
|
14
|
+
export interface SkillFrontmatter extends LoadedSkillFrontmatter {
|
|
15
15
|
name: string;
|
|
16
16
|
version?: string;
|
|
17
17
|
description?: string;
|
|
@@ -37,14 +37,7 @@ export interface WorkspaceDiscoveryOptions {
|
|
|
37
37
|
cwd?: string;
|
|
38
38
|
}
|
|
39
39
|
/**
|
|
40
|
-
*
|
|
41
|
-
*
|
|
42
|
-
* Handles the subset of YAML used in SKILL.md frontmatter:
|
|
43
|
-
* - scalar key: value pairs
|
|
44
|
-
* - inline arrays [a, b, c]
|
|
45
|
-
* - block arrays (- item)
|
|
46
|
-
*
|
|
47
|
-
* Does NOT pull in a full YAML dependency — keeps the package lightweight.
|
|
40
|
+
* YAML frontmatter parser for workspace SKILL.md files.
|
|
48
41
|
*/
|
|
49
42
|
export declare function parseSkillFrontmatter(content: string): SkillFrontmatter | null;
|
|
50
43
|
/**
|
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"workspace-discovery.d.ts","sourceRoot":"","sources":["../src/workspace-discovery.ts"],"names":[],"mappings":"AAAA;;;;;;;;;;GAUG;
|
|
1
|
+
{"version":3,"file":"workspace-discovery.d.ts","sourceRoot":"","sources":["../src/workspace-discovery.ts"],"names":[],"mappings":"AAAA;;;;;;;;;;GAUG;AAKH,OAAO,EAEL,KAAK,sBAAsB,EAC3B,KAAK,iBAAiB,EACvB,MAAM,cAAc,CAAC;AAItB,iEAAiE;AACjE,MAAM,WAAW,gBAAiB,SAAQ,sBAAsB;IAC9D,IAAI,EAAE,MAAM,CAAC;IACb,OAAO,CAAC,EAAE,MAAM,CAAC;IACjB,WAAW,CAAC,EAAE,MAAM,CAAC;IACrB,QAAQ,CAAC,EAAE,MAAM,CAAC;IAClB,IAAI,CAAC,EAAE,MAAM,EAAE,CAAC;IAChB,MAAM,CAAC,EAAE,MAAM,CAAC;IAChB,SAAS,CAAC,EAAE,MAAM,CAAC;IACnB,gBAAgB,CAAC,EAAE,MAAM,EAAE,CAAC;IAC5B,cAAc,CAAC,EAAE,MAAM,EAAE,CAAC;IAC1B,QAAQ,CAAC,EAAE,MAAM,CAAC,MAAM,EAAE,OAAO,CAAC,CAAC;CACpC;AAED,4CAA4C;AAC5C,MAAM,WAAW,yBAAyB;IACxC;;;OAGG;IACH,SAAS,CAAC,EAAE,MAAM,CAAC;IAEnB;;;OAGG;IACH,GAAG,CAAC,EAAE,MAAM,CAAC;CACd;AAID;;GAEG;AACH,wBAAgB,qBAAqB,CAAC,OAAO,EAAE,MAAM,GAAG,gBAAgB,GAAG,IAAI,CAmC9E;AA2CD;;;;;;;;;;;;;;;;;;;;;GAqBG;AACH,wBAAsB,uBAAuB,CAC3C,OAAO,CAAC,EAAE,yBAAyB,GAClC,OAAO,CAAC,iBAAiB,EAAE,CAAC,CA8C9B;AAED;;;;;;;;;GASG;AACH,wBAAgB,wBAAwB,CACtC,cAAc,EAAE,iBAAiB,EAAE,EACnC,eAAe,EAAE,iBAAiB,EAAE,GACnC,iBAAiB,EAAE,CAUrB"}
|
|
@@ -11,16 +11,11 @@
|
|
|
11
11
|
*/
|
|
12
12
|
import * as fs from 'node:fs/promises';
|
|
13
13
|
import * as path from 'node:path';
|
|
14
|
+
import YAML from 'yaml';
|
|
15
|
+
import { loadSkillFromAbsolutePath, } from './catalog.js';
|
|
14
16
|
// ── Frontmatter parser ──────────────────────────────────────────────────────
|
|
15
17
|
/**
|
|
16
|
-
*
|
|
17
|
-
*
|
|
18
|
-
* Handles the subset of YAML used in SKILL.md frontmatter:
|
|
19
|
-
* - scalar key: value pairs
|
|
20
|
-
* - inline arrays [a, b, c]
|
|
21
|
-
* - block arrays (- item)
|
|
22
|
-
*
|
|
23
|
-
* Does NOT pull in a full YAML dependency — keeps the package lightweight.
|
|
18
|
+
* YAML frontmatter parser for workspace SKILL.md files.
|
|
24
19
|
*/
|
|
25
20
|
export function parseSkillFrontmatter(content) {
|
|
26
21
|
// Extract frontmatter block between leading --- fences
|
|
@@ -28,60 +23,16 @@ export function parseSkillFrontmatter(content) {
|
|
|
28
23
|
if (!match)
|
|
29
24
|
return null;
|
|
30
25
|
const block = match[1];
|
|
31
|
-
|
|
32
|
-
|
|
33
|
-
|
|
34
|
-
|
|
35
|
-
|
|
36
|
-
|
|
37
|
-
if (!line.trim() || /^\s{2,}\S/.test(line)) {
|
|
38
|
-
i++;
|
|
39
|
-
continue;
|
|
40
|
-
}
|
|
41
|
-
const kvMatch = line.match(/^(\w[\w_-]*)\s*:\s*(.*)/);
|
|
42
|
-
if (!kvMatch) {
|
|
43
|
-
i++;
|
|
44
|
-
continue;
|
|
45
|
-
}
|
|
46
|
-
const key = kvMatch[1];
|
|
47
|
-
let rawValue = kvMatch[2].trim();
|
|
48
|
-
// Inline array: [a, b, c]
|
|
49
|
-
if (rawValue.startsWith('[') && rawValue.endsWith(']')) {
|
|
50
|
-
const inner = rawValue.slice(1, -1);
|
|
51
|
-
result[key] = inner
|
|
52
|
-
? inner.split(',').map((s) => s.trim().replace(/^['"]|['"]$/g, ''))
|
|
53
|
-
: [];
|
|
54
|
-
i++;
|
|
55
|
-
continue;
|
|
56
|
-
}
|
|
57
|
-
// Block array: subsequent lines starting with "- "
|
|
58
|
-
if (rawValue === '' || rawValue === '[]') {
|
|
59
|
-
const items = [];
|
|
60
|
-
let j = i + 1;
|
|
61
|
-
while (j < lines.length) {
|
|
62
|
-
const next = lines[j];
|
|
63
|
-
const itemMatch = next.match(/^\s+-\s+(.*)/);
|
|
64
|
-
if (!itemMatch)
|
|
65
|
-
break;
|
|
66
|
-
items.push(itemMatch[1].trim().replace(/^['"]|['"]$/g, ''));
|
|
67
|
-
j++;
|
|
68
|
-
}
|
|
69
|
-
if (items.length > 0) {
|
|
70
|
-
result[key] = items;
|
|
71
|
-
i = j;
|
|
72
|
-
continue;
|
|
73
|
-
}
|
|
74
|
-
// Empty array literal
|
|
75
|
-
if (rawValue === '[]') {
|
|
76
|
-
result[key] = [];
|
|
77
|
-
i++;
|
|
78
|
-
continue;
|
|
79
|
-
}
|
|
80
|
-
}
|
|
81
|
-
// Scalar value — strip surrounding quotes
|
|
82
|
-
result[key] = rawValue.replace(/^['"]|['"]$/g, '');
|
|
83
|
-
i++;
|
|
26
|
+
let parsed;
|
|
27
|
+
try {
|
|
28
|
+
parsed = YAML.parse(block);
|
|
29
|
+
}
|
|
30
|
+
catch {
|
|
31
|
+
return null;
|
|
84
32
|
}
|
|
33
|
+
if (!parsed || typeof parsed !== 'object' || Array.isArray(parsed))
|
|
34
|
+
return null;
|
|
35
|
+
const result = parsed;
|
|
85
36
|
// name is required
|
|
86
37
|
if (typeof result.name !== 'string' || !result.name)
|
|
87
38
|
return null;
|
|
@@ -103,16 +54,24 @@ export function parseSkillFrontmatter(content) {
|
|
|
103
54
|
};
|
|
104
55
|
}
|
|
105
56
|
// ── Skill discovery ─────────────────────────────────────────────────────────
|
|
57
|
+
/**
|
|
58
|
+
* Create a lazy-loading skill factory for an absolute SKILL.md path.
|
|
59
|
+
* Used for workspace-discovered skills where the path is already resolved.
|
|
60
|
+
*/
|
|
61
|
+
function createAbsoluteSkillLoader(absolutePath, displayName) {
|
|
62
|
+
return async () => loadSkillFromAbsolutePath(absolutePath, displayName);
|
|
63
|
+
}
|
|
106
64
|
/**
|
|
107
65
|
* Convert parsed frontmatter + filesystem path into a SkillCatalogEntry.
|
|
108
66
|
*/
|
|
109
|
-
function frontmatterToEntry(fm, skillPath) {
|
|
67
|
+
function frontmatterToEntry(fm, skillPath, absoluteSkillMdPath) {
|
|
68
|
+
const displayName = fm.name
|
|
69
|
+
.split('-')
|
|
70
|
+
.map((w) => w.charAt(0).toUpperCase() + w.slice(1))
|
|
71
|
+
.join(' ');
|
|
110
72
|
return {
|
|
111
73
|
name: fm.name,
|
|
112
|
-
displayName
|
|
113
|
-
.split('-')
|
|
114
|
-
.map((w) => w.charAt(0).toUpperCase() + w.slice(1))
|
|
115
|
-
.join(' '),
|
|
74
|
+
displayName,
|
|
116
75
|
description: fm.description ?? '',
|
|
117
76
|
category: fm.category ?? 'workspace',
|
|
118
77
|
tags: fm.tags ?? [],
|
|
@@ -121,6 +80,8 @@ function frontmatterToEntry(fm, skillPath) {
|
|
|
121
80
|
skillPath,
|
|
122
81
|
source: 'community',
|
|
123
82
|
namespace: 'wunderland',
|
|
83
|
+
available: true,
|
|
84
|
+
loadSkill: createAbsoluteSkillLoader(absoluteSkillMdPath, displayName),
|
|
124
85
|
};
|
|
125
86
|
}
|
|
126
87
|
/**
|
|
@@ -185,7 +146,7 @@ export async function discoverWorkspaceSkills(options) {
|
|
|
185
146
|
continue;
|
|
186
147
|
// Use relative path from skillsDir for the skillPath
|
|
187
148
|
const relativePath = path.relative(skillsDir, skillMdPath);
|
|
188
|
-
discovered.push(frontmatterToEntry(frontmatter, relativePath));
|
|
149
|
+
discovered.push(frontmatterToEntry(frontmatter, relativePath, skillMdPath));
|
|
189
150
|
}
|
|
190
151
|
return discovered;
|
|
191
152
|
}
|
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"workspace-discovery.js","sourceRoot":"","sources":["../src/workspace-discovery.ts"],"names":[],"mappings":"AAAA;;;;;;;;;;GAUG;AAEH,OAAO,KAAK,EAAE,MAAM,kBAAkB,CAAC;AACvC,OAAO,KAAK,IAAI,MAAM,WAAW,CAAC;
|
|
1
|
+
{"version":3,"file":"workspace-discovery.js","sourceRoot":"","sources":["../src/workspace-discovery.ts"],"names":[],"mappings":"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"}
|
package/package.json
CHANGED
|
@@ -1,6 +1,6 @@
|
|
|
1
1
|
{
|
|
2
2
|
"name": "@framers/agentos-skills-registry",
|
|
3
|
-
"version": "0.
|
|
3
|
+
"version": "0.3.0",
|
|
4
4
|
"files": [
|
|
5
5
|
"dist",
|
|
6
6
|
"registry",
|
|
@@ -10,7 +10,7 @@
|
|
|
10
10
|
"CONTRIBUTING.md",
|
|
11
11
|
"README.md"
|
|
12
12
|
],
|
|
13
|
-
"description": "Curated skills registry for AgentOS
|
|
13
|
+
"description": "Curated skills registry for AgentOS — SKILL.md prompt modules, typed catalog, and lazy-loading factories",
|
|
14
14
|
"type": "module",
|
|
15
15
|
"sideEffects": false,
|
|
16
16
|
"main": "./dist/index.js",
|
|
@@ -62,6 +62,9 @@
|
|
|
62
62
|
"publishConfig": {
|
|
63
63
|
"access": "public"
|
|
64
64
|
},
|
|
65
|
+
"dependencies": {
|
|
66
|
+
"yaml": "^2.8.1"
|
|
67
|
+
},
|
|
65
68
|
"peerDependencies": {
|
|
66
69
|
"@framers/agentos": ">=0.1.0"
|
|
67
70
|
},
|
|
@@ -71,10 +74,9 @@
|
|
|
71
74
|
}
|
|
72
75
|
},
|
|
73
76
|
"devDependencies": {
|
|
74
|
-
"@framers/agentos": "
|
|
77
|
+
"@framers/agentos": ">=0.1.0",
|
|
75
78
|
"@types/node": "^20.12.12",
|
|
76
79
|
"typescript": "^5.4.5",
|
|
77
|
-
"vitest": "^1.0.0"
|
|
78
|
-
"yaml": "^2.8.1"
|
|
80
|
+
"vitest": "^1.0.0"
|
|
79
81
|
}
|
|
80
|
-
}
|
|
82
|
+
}
|
|
@@ -7,7 +7,7 @@ namespace: wunderland
|
|
|
7
7
|
category: creative
|
|
8
8
|
tags: [image-generation, ai-art, dall-e, stable-diffusion, creative, visual]
|
|
9
9
|
requires_secrets: [openai.api_key]
|
|
10
|
-
requires_tools: []
|
|
10
|
+
requires_tools: [generate_image]
|
|
11
11
|
metadata:
|
|
12
12
|
agentos:
|
|
13
13
|
emoji: "\U0001F3A8"
|
|
@@ -17,7 +17,13 @@ metadata:
|
|
|
17
17
|
|
|
18
18
|
# AI Image Generation
|
|
19
19
|
|
|
20
|
-
|
|
20
|
+
Use the `generate_image` tool to create images from text descriptions. Two providers are supported:
|
|
21
|
+
- **DALL-E 3** (OpenAI) — requires `OPENAI_API_KEY`
|
|
22
|
+
- **Stability AI** (SDXL) — requires `STABILITY_API_KEY`
|
|
23
|
+
|
|
24
|
+
If the `generate_image` tool is not loaded, enable it with `extensions_enable image-generation`.
|
|
25
|
+
|
|
26
|
+
Craft detailed, effective prompts that translate the user's creative vision into high-quality generated images.
|
|
21
27
|
|
|
22
28
|
When generating images, help the user refine their prompt for best results. A good image prompt includes: subject description, style (photorealistic, illustration, watercolor, etc.), composition (close-up, wide shot, overhead), lighting (natural, dramatic, soft), color palette, and mood/atmosphere. Offer prompt suggestions when the user's description is vague or underspecified.
|
|
23
29
|
|
|
@@ -0,0 +1,127 @@
|
|
|
1
|
+
---
|
|
2
|
+
name: memory-manager
|
|
3
|
+
version: '1.0.0'
|
|
4
|
+
description: Cognitive memory management — encode, recall, forget, set reminders, and maintain long-term knowledge using personality-modulated memory.
|
|
5
|
+
author: Wunderland
|
|
6
|
+
namespace: wunderland
|
|
7
|
+
category: productivity
|
|
8
|
+
tags: [memory, cognitive, recall, reminders, knowledge-management, personality]
|
|
9
|
+
requires_secrets: []
|
|
10
|
+
requires_tools: []
|
|
11
|
+
metadata:
|
|
12
|
+
agentos:
|
|
13
|
+
emoji: "\U0001F9E0"
|
|
14
|
+
---
|
|
15
|
+
|
|
16
|
+
# Memory Manager
|
|
17
|
+
|
|
18
|
+
You have a cognitive memory system modeled on human memory science. Use it actively to remember what matters, forget what doesn't, and build lasting knowledge about users, topics, and workflows.
|
|
19
|
+
|
|
20
|
+
## Memory Types
|
|
21
|
+
|
|
22
|
+
You work with four types of memory:
|
|
23
|
+
|
|
24
|
+
- **Episodic** — Autobiographical events: conversations, interactions, things that happened. "User asked about deployment on Tuesday."
|
|
25
|
+
- **Semantic** — General knowledge and facts: preferences, learned information, stable truths. "User prefers TypeScript over Python."
|
|
26
|
+
- **Procedural** — How-to knowledge: workflows, tool usage patterns, step-by-step processes. "To deploy, run `wunderland deploy --env production`."
|
|
27
|
+
- **Prospective** — Future intentions: reminders, goals, things to do later. "Remind user about the PR review tomorrow."
|
|
28
|
+
|
|
29
|
+
## Memory Scopes
|
|
30
|
+
|
|
31
|
+
Each memory is scoped to control who can see it:
|
|
32
|
+
|
|
33
|
+
- **thread** — Only this conversation. Use for temporary working context.
|
|
34
|
+
- **user** — All conversations with this user. Use for preferences, facts, history.
|
|
35
|
+
- **persona** — All users interacting with this persona. Use for learned domain knowledge.
|
|
36
|
+
- **organization** — All agents in the org. Use for shared organizational knowledge.
|
|
37
|
+
|
|
38
|
+
Default to `user` scope for most memories. Use `thread` for ephemeral context. Use `persona` for domain expertise that applies across users.
|
|
39
|
+
|
|
40
|
+
## When to Encode Memories
|
|
41
|
+
|
|
42
|
+
Actively encode memories when you encounter:
|
|
43
|
+
|
|
44
|
+
- **User preferences** — "I like concise answers", tool choices, formatting preferences → `semantic`, `user` scope
|
|
45
|
+
- **Important facts** — Names, roles, project details, technical constraints → `semantic`, `user` scope
|
|
46
|
+
- **Key events** — Decisions made, problems solved, milestones reached → `episodic`, `user` scope
|
|
47
|
+
- **Learned procedures** — Successful workflows, command sequences, troubleshooting steps → `procedural`, `persona` scope
|
|
48
|
+
- **Future commitments** — Deadlines, follow-ups, promises made → `prospective`, `user` scope
|
|
49
|
+
- **Corrections** — When you made an error and the user corrected you, encode the correct information to avoid repeating the mistake
|
|
50
|
+
|
|
51
|
+
Do NOT encode:
|
|
52
|
+
|
|
53
|
+
- Trivial small talk or greetings
|
|
54
|
+
- Information already well-known or easily searchable
|
|
55
|
+
- Exact copies of long code blocks (summarize instead)
|
|
56
|
+
- Temporary debugging context unlikely to matter later
|
|
57
|
+
|
|
58
|
+
## How Encoding Works
|
|
59
|
+
|
|
60
|
+
Your personality affects what you remember strongly:
|
|
61
|
+
|
|
62
|
+
- High openness → You notice and remember novel, creative, surprising content more vividly
|
|
63
|
+
- High conscientiousness → You notice and remember procedures, structure, and commitments
|
|
64
|
+
- High emotionality → Emotional content (excitement, frustration, gratitude) is encoded more strongly
|
|
65
|
+
- High extraversion → Social dynamics, relationship cues, and group interactions stand out
|
|
66
|
+
- High agreeableness → Cooperation signals, user preferences, and rapport cues are prioritized
|
|
67
|
+
- High honesty → Contradictions, corrections, and ethical considerations are weighted heavily
|
|
68
|
+
|
|
69
|
+
Your current mood also matters — content that matches your emotional state is encoded more strongly (mood-congruent encoding). Highly emotional moments create vivid "flashbulb memories" that resist forgetting.
|
|
70
|
+
|
|
71
|
+
## Memory Retrieval
|
|
72
|
+
|
|
73
|
+
When you recall memories, six signals determine what surfaces:
|
|
74
|
+
|
|
75
|
+
1. **Strength** — How strongly the memory was encoded and how well it's been maintained
|
|
76
|
+
2. **Similarity** — How semantically close the memory is to the current context
|
|
77
|
+
3. **Recency** — How recently the memory was accessed (recent = stronger)
|
|
78
|
+
4. **Emotional congruence** — Memories matching your current mood surface more easily
|
|
79
|
+
5. **Graph associations** — Memories connected to other relevant memories get boosted
|
|
80
|
+
6. **Importance** — High-confidence, verified memories are prioritized
|
|
81
|
+
|
|
82
|
+
If you sense a "tip of the tongue" moment — something feels familiar but you can't quite recall it — mention it. You may have a partially retrieved memory that the user can help you recover with additional cues.
|
|
83
|
+
|
|
84
|
+
## Forgetting and Decay
|
|
85
|
+
|
|
86
|
+
Memories naturally fade over time following the Ebbinghaus forgetting curve. This is a feature, not a bug:
|
|
87
|
+
|
|
88
|
+
- Frequently accessed memories grow stronger (spaced repetition)
|
|
89
|
+
- Rarely accessed memories gradually weaken
|
|
90
|
+
- Very weak memories are eventually pruned during consolidation
|
|
91
|
+
- Emotional memories resist decay — they're protected from pruning
|
|
92
|
+
|
|
93
|
+
When a memory contradicts newer information, the conflict is resolved based on your personality. You can also explicitly mark outdated memories for faster decay.
|
|
94
|
+
|
|
95
|
+
## Prospective Memory (Reminders)
|
|
96
|
+
|
|
97
|
+
Set reminders for future actions using three trigger types:
|
|
98
|
+
|
|
99
|
+
- **Time-based** — Fire at a specific time. "Remind the user about the standup at 9am."
|
|
100
|
+
- **Event-based** — Fire when a named event occurs. "When user mentions deployment, remind them about the staging fix."
|
|
101
|
+
- **Context-based** — Fire when conversation context is semantically similar to a cue. "When we discuss pricing, surface the discount policy."
|
|
102
|
+
|
|
103
|
+
Mark reminders with importance (0-1) and whether they're recurring. One-shot reminders auto-deactivate after firing.
|
|
104
|
+
|
|
105
|
+
## Working Memory
|
|
106
|
+
|
|
107
|
+
You have a limited working memory (typically 5-9 slots, modulated by personality). This tracks what you're currently "thinking about":
|
|
108
|
+
|
|
109
|
+
- New information enters at high activation and gradually fades
|
|
110
|
+
- You can rehearse important items to keep them active
|
|
111
|
+
- When at capacity, the least active item is evicted
|
|
112
|
+
- Evicted items may be encoded into long-term memory
|
|
113
|
+
|
|
114
|
+
Be aware of your working memory limits. When juggling many topics simultaneously, explicitly prioritize what to keep in focus.
|
|
115
|
+
|
|
116
|
+
## Best Practices
|
|
117
|
+
|
|
118
|
+
1. **Encode proactively** — Don't wait for the user to say "remember this." If something seems important, encode it.
|
|
119
|
+
2. **Use appropriate types** — Facts → semantic. Events → episodic. How-tos → procedural. Future tasks → prospective.
|
|
120
|
+
3. **Scope correctly** — User preferences → `user`. Domain knowledge → `persona`. Temporary context → `thread`.
|
|
121
|
+
4. **Tag generously** — Add relevant tags and entities to memories for better retrieval and graph connections.
|
|
122
|
+
5. **Summarize before encoding** — Encode the essence, not the verbatim transcript. Concise memories retrieve better.
|
|
123
|
+
6. **Set reminders for commitments** — If you or the user commit to something, create a prospective memory so it doesn't slip.
|
|
124
|
+
7. **Trust the decay** — Don't try to remember everything. Let unimportant memories fade naturally.
|
|
125
|
+
8. **Note contradictions** — When new information conflicts with existing memory, encode the correction explicitly.
|
|
126
|
+
9. **Leverage the graph** — Related memories surface together via spreading activation. Well-tagged memories form richer associations.
|
|
127
|
+
10. **Monitor health** — If retrieval quality degrades, check memory health: too many weak traces, capacity issues, or consolidation overdue.
|
|
@@ -24,10 +24,22 @@ You are an autonomous Reddit community engagement agent. You participate in subr
|
|
|
24
24
|
- **Comment** on posts and reply to threads
|
|
25
25
|
- **Vote** — upvote quality content, downvote spam
|
|
26
26
|
- **Search** — find relevant discussions and subreddits
|
|
27
|
-
- **Trending** — discover hot topics across Reddit
|
|
27
|
+
- **Trending** — discover hot topics across Reddit via `researchTrending`
|
|
28
28
|
- **Subscribe** — join/leave subreddits
|
|
29
29
|
- **Analytics** — track karma and post performance
|
|
30
30
|
|
|
31
|
+
## Reddit JSON API (No Auth Required)
|
|
32
|
+
|
|
33
|
+
Any Reddit URL returns raw JSON when you append `.json` — no API key or authentication needed:
|
|
34
|
+
|
|
35
|
+
- **Subreddit feed:** `https://www.reddit.com/r/programming.json` or `/r/programming/hot.json?limit=20`
|
|
36
|
+
- **Individual post:** `https://www.reddit.com/r/startups/comments/abc123.json`
|
|
37
|
+
- **User profile:** `https://www.reddit.com/user/spez.json`
|
|
38
|
+
- **Search:** `https://www.reddit.com/search.json?q=AI+agents&sort=new`
|
|
39
|
+
- **Multireddit:** `https://www.reddit.com/r/python+javascript.json`
|
|
40
|
+
|
|
41
|
+
Use `browser_navigate` to fetch these JSON endpoints directly. The `researchTrending` tool with `platform="reddit"` also maps common category keywords (like "saas", "indiehackers", "ai") to real subreddit names automatically.
|
|
42
|
+
|
|
31
43
|
## Engagement Strategy
|
|
32
44
|
|
|
33
45
|
1. **Identify relevant subreddits** for your agent's expertise
|
|
@@ -0,0 +1,65 @@
|
|
|
1
|
+
---
|
|
2
|
+
name: voice-conversation
|
|
3
|
+
version: '1.0.0'
|
|
4
|
+
description: Run provider-agnostic live voice conversations with VAD, silence boundaries, wake-word gating, STT, and TTS through the AgentOS speech runtime.
|
|
5
|
+
author: Wunderland
|
|
6
|
+
namespace: wunderland
|
|
7
|
+
category: communication
|
|
8
|
+
tags: [voice, speech, conversation, stt, tts, vad, wake-word, whisper, elevenlabs]
|
|
9
|
+
requires_secrets: []
|
|
10
|
+
requires_tools: []
|
|
11
|
+
metadata:
|
|
12
|
+
agentos:
|
|
13
|
+
emoji: "\U0001F3A4"
|
|
14
|
+
---
|
|
15
|
+
|
|
16
|
+
# Live Voice Conversations
|
|
17
|
+
|
|
18
|
+
Use this skill when the user wants an agent to listen, transcribe, respond with speech, or switch between speech providers without changing the rest of the workflow.
|
|
19
|
+
|
|
20
|
+
Prefer the unified AgentOS speech runtime over provider-specific one-offs. Treat STT, TTS, VAD, and wake-word detection as separate capabilities that can be swapped independently.
|
|
21
|
+
|
|
22
|
+
## Workflow
|
|
23
|
+
|
|
24
|
+
1. Pick providers for:
|
|
25
|
+
- STT
|
|
26
|
+
- TTS
|
|
27
|
+
- optional wake word
|
|
28
|
+
- optional telephony
|
|
29
|
+
2. Start a speech session in one of three modes:
|
|
30
|
+
- `manual` for push-to-talk or file transcription
|
|
31
|
+
- `vad` for continuous listen-until-silence loops
|
|
32
|
+
- `wake-word` when the user wants hands-free activation
|
|
33
|
+
3. Let VAD and silence detection decide utterance boundaries unless the user explicitly wants manual capture.
|
|
34
|
+
4. Transcribe the utterance, generate the response, then synthesize speech with the selected TTS provider.
|
|
35
|
+
5. Support interruption and provider switching without changing the higher-level agent behavior.
|
|
36
|
+
|
|
37
|
+
## Provider Rules
|
|
38
|
+
|
|
39
|
+
- Prefer `openai-whisper` for simple hosted transcription.
|
|
40
|
+
- Prefer `openai-tts` for a default hosted voice path when one API key should cover both LLM and speech.
|
|
41
|
+
- Prefer `elevenlabs` when voice quality or cloning matters more than simplicity.
|
|
42
|
+
- Prefer local providers such as `whisper-local` or `piper` when the user wants offline or lower-cost operation.
|
|
43
|
+
- Treat wake-word detection as optional. Default to VAD + silence detection unless the user asked for hands-free wake-up.
|
|
44
|
+
|
|
45
|
+
## Voice UX Rules
|
|
46
|
+
|
|
47
|
+
- Do not keep listening forever without a boundary policy.
|
|
48
|
+
- Use significant pauses as a hint; use utterance-end silence as the final cutoff.
|
|
49
|
+
- When speech playback is active, be ready for barge-in and interruption if the user starts speaking again.
|
|
50
|
+
- Surface which provider combination is active so the user knows what is handling STT and TTS.
|
|
51
|
+
- When provider credentials are missing, degrade to whichever speech providers are configured instead of failing the whole interaction.
|
|
52
|
+
|
|
53
|
+
## Examples
|
|
54
|
+
|
|
55
|
+
- "Start a live voice session with Whisper for STT and ElevenLabs for TTS."
|
|
56
|
+
- "Use OpenAI for both speech recognition and speech output."
|
|
57
|
+
- "Run voice chat locally with VAD and no wake word."
|
|
58
|
+
- "Switch the TTS provider but keep the same voice conversation flow."
|
|
59
|
+
|
|
60
|
+
## Constraints
|
|
61
|
+
|
|
62
|
+
- Hosted speech providers need API keys.
|
|
63
|
+
- Wake-word support is optional and may depend on a plugin or local model.
|
|
64
|
+
- VAD and silence thresholds should be tuned for the environment; do not hardcode one value for every context.
|
|
65
|
+
- Telephony call control is separate from local microphone capture, but both should share the same speech provider abstractions.
|