@soulcraft/sdk 3.4.2 → 3.6.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/dist/modules/ai/index.d.ts +14 -8
- package/dist/modules/ai/index.d.ts.map +1 -1
- package/dist/modules/ai/index.js +64 -11
- package/dist/modules/ai/index.js.map +1 -1
- package/dist/modules/ai/ollama.d.ts +27 -0
- package/dist/modules/ai/ollama.d.ts.map +1 -0
- package/dist/modules/ai/ollama.js +231 -0
- package/dist/modules/ai/ollama.js.map +1 -0
- package/dist/modules/ai/types.d.ts +34 -0
- package/dist/modules/ai/types.d.ts.map +1 -1
- package/dist/modules/ai/types.js +13 -0
- package/dist/modules/ai/types.js.map +1 -1
- package/dist/modules/auth/sveltekit.d.ts +11 -0
- package/dist/modules/auth/sveltekit.d.ts.map +1 -1
- package/dist/modules/auth/sveltekit.js +53 -2
- package/dist/modules/auth/sveltekit.js.map +1 -1
- package/dist/modules/skills/index.d.ts +19 -29
- package/dist/modules/skills/index.d.ts.map +1 -1
- package/dist/modules/skills/index.js +54 -171
- package/dist/modules/skills/index.js.map +1 -1
- package/dist/modules/skills/types.d.ts +39 -62
- package/dist/modules/skills/types.d.ts.map +1 -1
- package/dist/modules/skills/types.js +12 -9
- package/dist/modules/skills/types.js.map +1 -1
- package/package.json +1 -1
|
@@ -48,6 +48,7 @@
|
|
|
48
48
|
* ```
|
|
49
49
|
*/
|
|
50
50
|
import { createRemoteSessionVerifier, createDevCookieVerifier, createRequestDevLoginHandler } from './request-middleware.js';
|
|
51
|
+
import { computeEmailHash } from './config.js';
|
|
51
52
|
// ─────────────────────────────────────────────────────────────────────────────
|
|
52
53
|
// Constants
|
|
53
54
|
// ─────────────────────────────────────────────────────────────────────────────
|
|
@@ -142,13 +143,24 @@ async function verifyHS256JWT(token, secret) {
|
|
|
142
143
|
* ```
|
|
143
144
|
*/
|
|
144
145
|
export function createSoulcraftAuth(options) {
|
|
145
|
-
const { product, enrichUser, devCookieName = 'soulcraft_dev_session', backchannelPath = '/api/auth/backchannel-logout', } = options;
|
|
146
|
+
const { product, enrichUser, devCookieName = 'soulcraft_dev_session', backchannelPath = '/api/auth/backchannel-logout', defaultDevRole = 'owner', } = options;
|
|
146
147
|
// ── Session verifier selection ──────────────────────────────────────────
|
|
147
148
|
const idpUrl = process.env['SOULCRAFT_IDP_URL'];
|
|
149
|
+
const isDevMode = !idpUrl;
|
|
148
150
|
const verifySession = options.verifier
|
|
149
151
|
?? (idpUrl
|
|
150
152
|
? createRemoteSessionVerifier({ idpUrl })
|
|
151
153
|
: createDevCookieVerifier(devCookieName));
|
|
154
|
+
// ── Dev mode startup banner ─────────────────────────────────────────────
|
|
155
|
+
if (isDevMode && defaultDevRole !== false) {
|
|
156
|
+
const roles = ['owner', 'staff', 'manager', 'creator', 'customer'];
|
|
157
|
+
console.log(`\n ⚡ DEV MODE — ${product} (auto-login: ${defaultDevRole})`);
|
|
158
|
+
console.log(` Switch roles:`);
|
|
159
|
+
for (const role of roles) {
|
|
160
|
+
console.log(` ▸ ${role.padEnd(10)} /api/dev/login?role=${role}`);
|
|
161
|
+
}
|
|
162
|
+
console.log();
|
|
163
|
+
}
|
|
152
164
|
// ── Handle hook ─────────────────────────────────────────────────────────
|
|
153
165
|
const handle = async ({ event, resolve }) => {
|
|
154
166
|
// CSRF bypass for backchannel-logout — the IdP sends server-to-server
|
|
@@ -162,7 +174,7 @@ export function createSoulcraftAuth(options) {
|
|
|
162
174
|
}
|
|
163
175
|
// Resolve session
|
|
164
176
|
const cookieHeader = event.request.headers.get('cookie') ?? '';
|
|
165
|
-
|
|
177
|
+
let session = await verifySession(cookieHeader);
|
|
166
178
|
// Stale cookie recovery — if cookie present but session null, clear it
|
|
167
179
|
const hasSessionCookie = cookieHeader.includes(SESSION_COOKIE);
|
|
168
180
|
if (hasSessionCookie && !session) {
|
|
@@ -170,6 +182,45 @@ export function createSoulcraftAuth(options) {
|
|
|
170
182
|
response.headers.append('Set-Cookie', CLEAR_SESSION_COOKIE);
|
|
171
183
|
return response;
|
|
172
184
|
}
|
|
185
|
+
// ── Dev auto-login ──────────────────────────────────────────────────
|
|
186
|
+
// In dev mode, if no session exists and auto-login is enabled, create
|
|
187
|
+
// a dev session automatically. The developer is logged in the moment
|
|
188
|
+
// the first page loads — no manual /api/dev/login call needed.
|
|
189
|
+
if (isDevMode && !session && defaultDevRole !== false) {
|
|
190
|
+
const role = defaultDevRole;
|
|
191
|
+
const email = `dev-${role}@soulcraft.com`;
|
|
192
|
+
const autoSession = {
|
|
193
|
+
user: {
|
|
194
|
+
id: `dev-user-${role}`,
|
|
195
|
+
email,
|
|
196
|
+
name: `Dev ${role.charAt(0).toUpperCase() + role.slice(1)}`,
|
|
197
|
+
image: null,
|
|
198
|
+
platformRole: role,
|
|
199
|
+
emailHash: computeEmailHash(email),
|
|
200
|
+
},
|
|
201
|
+
sessionId: `dev-session-auto-${Date.now()}`,
|
|
202
|
+
expiresAt: Date.now() + 86_400_000,
|
|
203
|
+
};
|
|
204
|
+
session = autoSession;
|
|
205
|
+
// Set the cookie so subsequent requests don't re-create the session
|
|
206
|
+
const cookieValue = Buffer.from(JSON.stringify(autoSession)).toString('base64url');
|
|
207
|
+
const setCookie = [
|
|
208
|
+
`${devCookieName}=${cookieValue}`,
|
|
209
|
+
`Path=/`,
|
|
210
|
+
`HttpOnly`,
|
|
211
|
+
`SameSite=Lax`,
|
|
212
|
+
`Max-Age=86400`,
|
|
213
|
+
].join('; ');
|
|
214
|
+
// Attach session, resolve, then append the cookie to the response
|
|
215
|
+
event.locals['session'] = { sessionId: autoSession.sessionId, expiresAt: autoSession.expiresAt };
|
|
216
|
+
const user = enrichUser
|
|
217
|
+
? await enrichUser(autoSession.user, event)
|
|
218
|
+
: autoSession.user;
|
|
219
|
+
event.locals['user'] = user;
|
|
220
|
+
const response = await resolve(event);
|
|
221
|
+
response.headers.append('Set-Cookie', setCookie);
|
|
222
|
+
return response;
|
|
223
|
+
}
|
|
173
224
|
// Attach session and user to locals
|
|
174
225
|
event.locals['session'] = session
|
|
175
226
|
? { sessionId: session.sessionId, expiresAt: session.expiresAt }
|
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"sveltekit.js","sourceRoot":"","sources":["../../../src/modules/auth/sveltekit.ts"],"names":[],"mappings":"AAAA;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;GAgDG;AAEH,OAAO,EAAE,2BAA2B,EAAE,uBAAuB,EAAE,4BAA4B,EAAE,MAAM,yBAAyB,CAAA;
|
|
1
|
+
{"version":3,"file":"sveltekit.js","sourceRoot":"","sources":["../../../src/modules/auth/sveltekit.ts"],"names":[],"mappings":"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"}
|
|
@@ -2,54 +2,44 @@
|
|
|
2
2
|
* @module modules/skills
|
|
3
3
|
* @description Skill loading and registry for @soulcraft/sdk.
|
|
4
4
|
*
|
|
5
|
-
* Skills are SKILL.md files
|
|
6
|
-
*
|
|
7
|
-
*
|
|
5
|
+
* Skills are SKILL.md files stored in the Brainy VFS at `/.soulcraft/skills/{id}/SKILL.md`.
|
|
6
|
+
* Each skill is a directory containing a SKILL.md with YAML frontmatter (name, description,
|
|
7
|
+
* type, etc.) and markdown instructions.
|
|
8
8
|
*
|
|
9
|
-
*
|
|
10
|
-
*
|
|
11
|
-
* the Forge Kit Registry during kit provisioning.
|
|
12
|
-
*
|
|
13
|
-
* For tests, pass `bundledRegistry` to inject an in-memory skill map without
|
|
14
|
-
* any VFS or filesystem access.
|
|
9
|
+
* Skills are seeded from the kit at workspace creation time and can be customized per workspace.
|
|
10
|
+
* All products (Workshop, Venue, Academy, Pulse) read from the same path.
|
|
15
11
|
*
|
|
16
12
|
* ## VFS path convention
|
|
17
13
|
* ```
|
|
18
|
-
* /skills/{
|
|
14
|
+
* /.soulcraft/skills/{skill-id}/SKILL.md
|
|
19
15
|
* ```
|
|
20
|
-
* Example:
|
|
16
|
+
* Example: `/.soulcraft/skills/candle-expertise/SKILL.md`
|
|
21
17
|
*/
|
|
22
18
|
import type { Brainy } from '@soulcraft/brainy';
|
|
23
19
|
import type { SkillsModule } from './types.js';
|
|
20
|
+
/** Standard path for skills in every Brainy instance. */
|
|
21
|
+
export declare const SKILLS_DIR = "/.soulcraft/skills";
|
|
24
22
|
/**
|
|
25
|
-
*
|
|
26
|
-
*/
|
|
27
|
-
export interface CreateSkillsModuleOptions {
|
|
28
|
-
/**
|
|
29
|
-
* Inject an in-memory skill registry for tests. When provided, these skills
|
|
30
|
-
* serve as the fallback when VFS lookup misses.
|
|
31
|
-
*/
|
|
32
|
-
bundledRegistry?: Record<string, Record<string, string>> | null;
|
|
33
|
-
}
|
|
34
|
-
/**
|
|
35
|
-
* Creates a `SkillsModule` backed by a Brainy VFS instance.
|
|
23
|
+
* @description Creates a `SkillsModule` backed by a Brainy VFS instance.
|
|
36
24
|
*
|
|
37
|
-
* Skills are loaded from
|
|
38
|
-
*
|
|
25
|
+
* Skills are loaded from `/.soulcraft/skills/{id}/SKILL.md`. Each skill directory
|
|
26
|
+
* contains a SKILL.md file with YAML frontmatter and markdown instructions.
|
|
39
27
|
*
|
|
40
|
-
* @param brain - An initialized Brainy instance
|
|
41
|
-
* Pass `null` to disable VFS skill loading (test registry only).
|
|
28
|
+
* @param brain - An initialized Brainy instance (or null for test-only mode).
|
|
42
29
|
* @param options - Optional configuration including a registry override for tests.
|
|
43
30
|
* @returns A configured {@link SkillsModule}.
|
|
44
31
|
*
|
|
45
32
|
* @example
|
|
46
33
|
* ```typescript
|
|
47
|
-
* const brain = await pool.forUser(user.emailHash, workspaceId)
|
|
48
34
|
* const skills = createSkillsModule(brain)
|
|
49
|
-
*
|
|
50
|
-
* const skill = await skills.load('
|
|
35
|
+
* const all = await skills.list()
|
|
36
|
+
* const skill = await skills.load('candle-expertise')
|
|
51
37
|
* ```
|
|
52
38
|
*/
|
|
39
|
+
export interface CreateSkillsModuleOptions {
|
|
40
|
+
/** In-memory skill registry for tests. */
|
|
41
|
+
bundledRegistry?: Record<string, string> | null;
|
|
42
|
+
}
|
|
53
43
|
export declare function createSkillsModule(brain: Brainy | null, options?: CreateSkillsModuleOptions): SkillsModule;
|
|
54
44
|
export type { SkillsModule, Skill, SkillListOptions, SkillInstallOptions, } from './types.js';
|
|
55
45
|
//# sourceMappingURL=index.d.ts.map
|
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"index.d.ts","sourceRoot":"","sources":["../../../src/modules/skills/index.ts"],"names":[],"mappings":"AAAA
|
|
1
|
+
{"version":3,"file":"index.d.ts","sourceRoot":"","sources":["../../../src/modules/skills/index.ts"],"names":[],"mappings":"AAAA;;;;;;;;;;;;;;;;GAgBG;AAEH,OAAO,KAAK,EAAE,MAAM,EAAE,MAAM,mBAAmB,CAAA;AAC/C,OAAO,KAAK,EAAE,YAAY,EAAgD,MAAM,YAAY,CAAA;AAE5F,yDAAyD;AACzD,eAAO,MAAM,UAAU,uBAAuB,CAAA;AAE9C;;;;;;;;;;;;;;;;GAgBG;AACH,MAAM,WAAW,yBAAyB;IACxC,0CAA0C;IAC1C,eAAe,CAAC,EAAE,MAAM,CAAC,MAAM,EAAE,MAAM,CAAC,GAAG,IAAI,CAAA;CAChD;AAED,wBAAgB,kBAAkB,CAChC,KAAK,EAAE,MAAM,GAAG,IAAI,EACpB,OAAO,GAAE,yBAA8B,GACtC,YAAY,CA6Cd;AAgDD,YAAY,EACV,YAAY,EACZ,KAAK,EACL,gBAAgB,EAChB,mBAAmB,GACpB,MAAM,YAAY,CAAA"}
|
|
@@ -2,220 +2,103 @@
|
|
|
2
2
|
* @module modules/skills
|
|
3
3
|
* @description Skill loading and registry for @soulcraft/sdk.
|
|
4
4
|
*
|
|
5
|
-
* Skills are SKILL.md files
|
|
6
|
-
*
|
|
7
|
-
*
|
|
5
|
+
* Skills are SKILL.md files stored in the Brainy VFS at `/.soulcraft/skills/{id}/SKILL.md`.
|
|
6
|
+
* Each skill is a directory containing a SKILL.md with YAML frontmatter (name, description,
|
|
7
|
+
* type, etc.) and markdown instructions.
|
|
8
8
|
*
|
|
9
|
-
*
|
|
10
|
-
*
|
|
11
|
-
* the Forge Kit Registry during kit provisioning.
|
|
12
|
-
*
|
|
13
|
-
* For tests, pass `bundledRegistry` to inject an in-memory skill map without
|
|
14
|
-
* any VFS or filesystem access.
|
|
9
|
+
* Skills are seeded from the kit at workspace creation time and can be customized per workspace.
|
|
10
|
+
* All products (Workshop, Venue, Academy, Pulse) read from the same path.
|
|
15
11
|
*
|
|
16
12
|
* ## VFS path convention
|
|
17
13
|
* ```
|
|
18
|
-
* /skills/{
|
|
19
|
-
* ```
|
|
20
|
-
* Example: `/skills/wicks-and-whiskers/inventory-health.md`
|
|
21
|
-
*/
|
|
22
|
-
/**
|
|
23
|
-
* Creates a `SkillsModule` backed by a Brainy VFS instance.
|
|
24
|
-
*
|
|
25
|
-
* Skills are loaded from the VFS at `/skills/{kitId}/{skillId}.md`. For tests,
|
|
26
|
-
* pass `bundledRegistry` in options to provide an in-memory fallback.
|
|
27
|
-
*
|
|
28
|
-
* @param brain - An initialized Brainy instance. Required for VFS operations.
|
|
29
|
-
* Pass `null` to disable VFS skill loading (test registry only).
|
|
30
|
-
* @param options - Optional configuration including a registry override for tests.
|
|
31
|
-
* @returns A configured {@link SkillsModule}.
|
|
32
|
-
*
|
|
33
|
-
* @example
|
|
34
|
-
* ```typescript
|
|
35
|
-
* const brain = await pool.forUser(user.emailHash, workspaceId)
|
|
36
|
-
* const skills = createSkillsModule(brain)
|
|
37
|
-
*
|
|
38
|
-
* const skill = await skills.load('inventory-health', 'wicks-and-whiskers')
|
|
14
|
+
* /.soulcraft/skills/{skill-id}/SKILL.md
|
|
39
15
|
* ```
|
|
16
|
+
* Example: `/.soulcraft/skills/candle-expertise/SKILL.md`
|
|
40
17
|
*/
|
|
18
|
+
/** Standard path for skills in every Brainy instance. */
|
|
19
|
+
export const SKILLS_DIR = '/.soulcraft/skills';
|
|
41
20
|
export function createSkillsModule(brain, options = {}) {
|
|
42
|
-
const
|
|
43
|
-
? () => options.bundledRegistry ?? null
|
|
44
|
-
: () => null;
|
|
21
|
+
const testRegistry = options.bundledRegistry ?? null;
|
|
45
22
|
return {
|
|
46
|
-
async load(id
|
|
47
|
-
// 1. Try VFS first
|
|
23
|
+
async load(id) {
|
|
48
24
|
if (brain) {
|
|
49
|
-
const
|
|
50
|
-
if (
|
|
51
|
-
return
|
|
25
|
+
const skill = await _loadFromVfs(brain, id);
|
|
26
|
+
if (skill)
|
|
27
|
+
return skill;
|
|
52
28
|
}
|
|
53
|
-
|
|
54
|
-
|
|
29
|
+
if (testRegistry && testRegistry[id]) {
|
|
30
|
+
return { id, content: testRegistry[id], source: 'bundled' };
|
|
31
|
+
}
|
|
32
|
+
return null;
|
|
55
33
|
},
|
|
56
|
-
async list(
|
|
57
|
-
const { kitId, includeVfs = true, includeBundled = true } = options;
|
|
34
|
+
async list(opts = {}) {
|
|
58
35
|
const results = [];
|
|
59
|
-
|
|
60
|
-
|
|
61
|
-
const vfsSkills = await _listFromVfs(brain, kitId);
|
|
36
|
+
if (brain) {
|
|
37
|
+
const vfsSkills = await _listFromVfs(brain);
|
|
62
38
|
results.push(...vfsSkills);
|
|
63
39
|
}
|
|
64
|
-
|
|
65
|
-
|
|
66
|
-
|
|
67
|
-
|
|
40
|
+
if (testRegistry) {
|
|
41
|
+
for (const [id, content] of Object.entries(testRegistry)) {
|
|
42
|
+
if (!results.some(s => s.id === id)) {
|
|
43
|
+
results.push({ id, content, source: 'bundled' });
|
|
44
|
+
}
|
|
45
|
+
}
|
|
68
46
|
}
|
|
69
47
|
return results;
|
|
70
48
|
},
|
|
71
49
|
async install(options) {
|
|
72
50
|
if (!brain) {
|
|
73
|
-
throw new Error('sdk.skills.install() requires a Brainy instance with VFS support.
|
|
74
|
-
'Ensure the SDK was created with a valid brain parameter.');
|
|
51
|
+
throw new Error('sdk.skills.install() requires a Brainy instance with VFS support.');
|
|
75
52
|
}
|
|
76
|
-
const { id,
|
|
77
|
-
const
|
|
78
|
-
|
|
53
|
+
const { id, content } = options;
|
|
54
|
+
const dirPath = `${SKILLS_DIR}/${id}`;
|
|
55
|
+
const filePath = `${dirPath}/SKILL.md`;
|
|
56
|
+
await brain.vfs.mkdir(dirPath, { recursive: true });
|
|
57
|
+
await brain.vfs.writeFile(filePath, content);
|
|
79
58
|
},
|
|
80
59
|
};
|
|
81
60
|
}
|
|
82
|
-
// ─────────────────────────────────────────────────────────────────────────────
|
|
83
|
-
// VFS helpers
|
|
84
|
-
// ─────────────────────────────────────────────────────────────────────────────
|
|
85
61
|
/**
|
|
86
|
-
* Load a skill from
|
|
87
|
-
*
|
|
88
|
-
* @param brain - Initialized Brainy instance.
|
|
89
|
-
* @param id - Skill ID.
|
|
90
|
-
* @param kitId - Kit ID.
|
|
91
|
-
* @returns The skill if found, or `null`.
|
|
62
|
+
* @description Load a skill from VFS at `/.soulcraft/skills/{id}/SKILL.md`.
|
|
92
63
|
*/
|
|
93
|
-
async function _loadFromVfs(brain, id
|
|
94
|
-
const
|
|
64
|
+
async function _loadFromVfs(brain, id) {
|
|
65
|
+
const filePath = `${SKILLS_DIR}/${id}/SKILL.md`;
|
|
95
66
|
try {
|
|
96
|
-
const raw = await brain.vfs.readFile(
|
|
67
|
+
const raw = await brain.vfs.readFile(filePath);
|
|
97
68
|
const content = Buffer.isBuffer(raw) ? raw.toString('utf-8') : String(raw);
|
|
98
|
-
return { id,
|
|
69
|
+
return { id, content, source: 'vfs' };
|
|
99
70
|
}
|
|
100
71
|
catch {
|
|
101
|
-
// File not found in VFS — normal, fall through to bundled
|
|
102
72
|
return null;
|
|
103
73
|
}
|
|
104
74
|
}
|
|
105
75
|
/**
|
|
106
|
-
* List all skills
|
|
107
|
-
*
|
|
108
|
-
* @param brain - Initialized Brainy instance.
|
|
109
|
-
* @param kitId - Optional kit filter. If omitted, all skills are returned.
|
|
110
|
-
* @returns Array of VFS-sourced skills.
|
|
76
|
+
* @description List all skills from VFS at `/.soulcraft/skills/`.
|
|
111
77
|
*/
|
|
112
|
-
async function _listFromVfs(brain
|
|
78
|
+
async function _listFromVfs(brain) {
|
|
113
79
|
const results = [];
|
|
114
80
|
try {
|
|
115
|
-
|
|
116
|
-
|
|
117
|
-
const
|
|
118
|
-
|
|
119
|
-
|
|
120
|
-
|
|
121
|
-
|
|
122
|
-
|
|
123
|
-
|
|
124
|
-
const raw = await brain.vfs.readFile(vfsPath);
|
|
125
|
-
const content = Buffer.isBuffer(raw) ? raw.toString('utf-8') : String(raw);
|
|
126
|
-
results.push({ id, kitId, content, source: 'vfs' });
|
|
127
|
-
}
|
|
128
|
-
catch {
|
|
129
|
-
// Skip unreadable files
|
|
130
|
-
}
|
|
131
|
-
}
|
|
132
|
-
else if (typeof entry === 'object' && 'name' in entry) {
|
|
133
|
-
const name = entry.name;
|
|
134
|
-
if (name.endsWith('.md')) {
|
|
135
|
-
const id = name.slice(0, -3);
|
|
136
|
-
const vfsPath = `${dir}/${name}`;
|
|
137
|
-
try {
|
|
138
|
-
const raw = await brain.vfs.readFile(vfsPath);
|
|
139
|
-
const content = Buffer.isBuffer(raw) ? raw.toString('utf-8') : String(raw);
|
|
140
|
-
results.push({ id, kitId, content, source: 'vfs' });
|
|
141
|
-
}
|
|
142
|
-
catch {
|
|
143
|
-
// Skip unreadable files
|
|
144
|
-
}
|
|
145
|
-
}
|
|
146
|
-
}
|
|
147
|
-
}
|
|
148
|
-
}
|
|
149
|
-
else {
|
|
150
|
-
// List all kits then list skills per kit
|
|
151
|
-
const skillsDir = '/skills';
|
|
152
|
-
let kitEntries;
|
|
81
|
+
const entries = await brain.vfs.readdir(SKILLS_DIR);
|
|
82
|
+
for (const entry of entries) {
|
|
83
|
+
const name = typeof entry === 'string' ? entry
|
|
84
|
+
: typeof entry === 'object' && entry !== null && 'name' in entry
|
|
85
|
+
? entry.name
|
|
86
|
+
: null;
|
|
87
|
+
if (!name)
|
|
88
|
+
continue;
|
|
89
|
+
const filePath = `${SKILLS_DIR}/${name}/SKILL.md`;
|
|
153
90
|
try {
|
|
154
|
-
|
|
91
|
+
const raw = await brain.vfs.readFile(filePath);
|
|
92
|
+
const content = Buffer.isBuffer(raw) ? raw.toString('utf-8') : String(raw);
|
|
93
|
+
results.push({ id: name, content, source: 'vfs' });
|
|
155
94
|
}
|
|
156
95
|
catch {
|
|
157
|
-
|
|
158
|
-
}
|
|
159
|
-
for (const kitEntry of kitEntries) {
|
|
160
|
-
const kitName = typeof kitEntry === 'string' ? kitEntry
|
|
161
|
-
: typeof kitEntry === 'object' && kitEntry !== null && 'name' in kitEntry
|
|
162
|
-
? kitEntry.name
|
|
163
|
-
: null;
|
|
164
|
-
if (!kitName)
|
|
165
|
-
continue;
|
|
166
|
-
const kitSkills = await _listFromVfs(brain, kitName);
|
|
167
|
-
results.push(...kitSkills);
|
|
96
|
+
// Subdirectory without SKILL.md — skip
|
|
168
97
|
}
|
|
169
98
|
}
|
|
170
99
|
}
|
|
171
100
|
catch {
|
|
172
|
-
//
|
|
173
|
-
}
|
|
174
|
-
return results;
|
|
175
|
-
}
|
|
176
|
-
// ─────────────────────────────────────────────────────────────────────────────
|
|
177
|
-
// Bundled registry helpers
|
|
178
|
-
// ─────────────────────────────────────────────────────────────────────────────
|
|
179
|
-
/**
|
|
180
|
-
* Load a single skill from the in-memory test registry.
|
|
181
|
-
*
|
|
182
|
-
* @param id - Skill ID.
|
|
183
|
-
* @param kitId - Kit ID.
|
|
184
|
-
* @param getRegistry - Function that returns the test registry (or null).
|
|
185
|
-
* @returns The skill if found, or `null`.
|
|
186
|
-
*/
|
|
187
|
-
function _loadBundled(id, kitId, getRegistry) {
|
|
188
|
-
const registry = getRegistry();
|
|
189
|
-
if (!registry)
|
|
190
|
-
return null;
|
|
191
|
-
const kitSkills = registry[kitId];
|
|
192
|
-
if (!kitSkills)
|
|
193
|
-
return null;
|
|
194
|
-
const content = kitSkills[id];
|
|
195
|
-
if (!content)
|
|
196
|
-
return null;
|
|
197
|
-
return { id, kitId, content, source: 'bundled' };
|
|
198
|
-
}
|
|
199
|
-
/**
|
|
200
|
-
* List skills from the in-memory test registry, optionally filtered by kit ID.
|
|
201
|
-
*
|
|
202
|
-
* @param kitId - Optional kit filter.
|
|
203
|
-
* @param getRegistry - Function that returns the test registry (or null).
|
|
204
|
-
* @returns Array of skills from the registry.
|
|
205
|
-
*/
|
|
206
|
-
function _listBundled(kitId, getRegistry) {
|
|
207
|
-
const registry = getRegistry();
|
|
208
|
-
if (!registry)
|
|
209
|
-
return [];
|
|
210
|
-
const results = [];
|
|
211
|
-
const kitsToList = kitId ? [kitId] : Object.keys(registry);
|
|
212
|
-
for (const kit of kitsToList) {
|
|
213
|
-
const kitSkills = registry[kit];
|
|
214
|
-
if (!kitSkills)
|
|
215
|
-
continue;
|
|
216
|
-
for (const [skillId, content] of Object.entries(kitSkills)) {
|
|
217
|
-
results.push({ id: skillId, kitId: kit, content, source: 'bundled' });
|
|
218
|
-
}
|
|
101
|
+
// /.soulcraft/skills doesn't exist yet — return empty
|
|
219
102
|
}
|
|
220
103
|
return results;
|
|
221
104
|
}
|
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"index.js","sourceRoot":"","sources":["../../../src/modules/skills/index.ts"],"names":[],"mappings":"AAAA
|
|
1
|
+
{"version":3,"file":"index.js","sourceRoot":"","sources":["../../../src/modules/skills/index.ts"],"names":[],"mappings":"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"}
|