superskill 0.2.6 → 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/CHANGELOG.md +40 -0
- package/LICENSE +0 -4
- package/README.md +118 -134
- package/dist/cli.js +5 -1
- package/dist/cli.js.map +1 -1
- package/dist/commands/init.js +1 -1
- package/dist/commands/init.js.map +1 -1
- package/dist/commands/skill/activate.d.ts +28 -0
- package/dist/commands/skill/activate.js +207 -0
- package/dist/commands/skill/activate.js.map +1 -0
- package/dist/commands/skill/catalog.d.ts +38 -3
- package/dist/commands/skill/catalog.js +125 -178
- package/dist/commands/skill/catalog.js.map +1 -1
- package/dist/commands/skill/generate.d.ts +28 -0
- package/dist/commands/skill/generate.js +180 -0
- package/dist/commands/skill/generate.js.map +1 -0
- package/dist/commands/skill/helpers.d.ts +14 -0
- package/dist/commands/skill/helpers.js +82 -0
- package/dist/commands/skill/helpers.js.map +1 -0
- package/dist/commands/skill/install.js +1 -1
- package/dist/commands/skill/install.js.map +1 -1
- package/dist/commands/skill/manifest.d.ts +26 -0
- package/dist/commands/skill/manifest.js +90 -0
- package/dist/commands/skill/manifest.js.map +1 -0
- package/dist/commands/skill/marketplace.d.ts +8 -122
- package/dist/commands/skill/marketplace.js +13 -591
- package/dist/commands/skill/marketplace.js.map +1 -1
- package/dist/commands/skill/resolve.d.ts +47 -0
- package/dist/commands/skill/resolve.js +101 -0
- package/dist/commands/skill/resolve.js.map +1 -0
- package/dist/commands/skill/validate.js +1 -1
- package/dist/commands/skill/validate.js.map +1 -1
- package/dist/commands/skill/web-discovery.d.ts +19 -15
- package/dist/commands/skill/web-discovery.js +107 -158
- package/dist/commands/skill/web-discovery.js.map +1 -1
- package/dist/config.js +1 -1
- package/dist/config.js.map +1 -1
- package/dist/core/registry.js +3 -5
- package/dist/core/registry.js.map +1 -1
- package/dist/lib/analytics.d.ts +55 -0
- package/dist/lib/analytics.js +167 -0
- package/dist/lib/analytics.js.map +1 -0
- package/dist/lib/auto-profile.js +1 -1
- package/dist/lib/auto-profile.js.map +1 -1
- package/dist/lib/escape-regex.js +1 -1
- package/dist/lib/escape-regex.js.map +1 -1
- package/dist/lib/frontmatter.js +1 -1
- package/dist/lib/frontmatter.js.map +1 -1
- package/dist/lib/github-client.d.ts +19 -0
- package/dist/lib/github-client.js +68 -0
- package/dist/lib/github-client.js.map +1 -0
- package/dist/lib/project-detector.js +1 -1
- package/dist/lib/project-detector.js.map +1 -1
- package/dist/lib/registry-loader.d.ts +64 -0
- package/dist/lib/registry-loader.js +115 -0
- package/dist/lib/registry-loader.js.map +1 -0
- package/dist/lib/safe-external-path.js +1 -1
- package/dist/lib/safe-external-path.js.map +1 -1
- package/dist/lib/search-engine.js +1 -1
- package/dist/lib/search-engine.js.map +1 -1
- package/dist/lib/security-scanner.d.ts +16 -0
- package/dist/lib/security-scanner.js +44 -0
- package/dist/lib/security-scanner.js.map +1 -0
- package/dist/lib/session-registry.js +1 -1
- package/dist/lib/session-registry.js.map +1 -1
- package/dist/lib/skill-cache.d.ts +34 -0
- package/dist/lib/skill-cache.js +150 -0
- package/dist/lib/skill-cache.js.map +1 -0
- package/dist/lib/skill-registry.js +1 -1
- package/dist/lib/skill-registry.js.map +1 -1
- package/dist/lib/skill-session.d.ts +37 -0
- package/dist/lib/skill-session.js +62 -0
- package/dist/lib/skill-session.js.map +1 -0
- package/dist/lib/stack-detector.js +1 -1
- package/dist/lib/stack-detector.js.map +1 -1
- package/dist/lib/text-utils.d.ts +14 -0
- package/dist/lib/text-utils.js +45 -0
- package/dist/lib/text-utils.js.map +1 -0
- package/dist/lib/token-estimator.js +1 -1
- package/dist/lib/token-estimator.js.map +1 -1
- package/dist/lib/trigger-matcher.d.ts +45 -0
- package/dist/lib/trigger-matcher.js +129 -0
- package/dist/lib/trigger-matcher.js.map +1 -0
- package/dist/lib/url-utils.d.ts +17 -0
- package/dist/lib/url-utils.js +45 -0
- package/dist/lib/url-utils.js.map +1 -0
- package/dist/lib/vault-fs.js +1 -1
- package/dist/lib/vault-fs.js.map +1 -1
- package/dist/mcp-server.js +11 -1
- package/dist/mcp-server.js.map +1 -1
- package/dist/setup/configure.js +1 -1
- package/dist/setup/configure.js.map +1 -1
- package/dist/setup/detect.js +1 -1
- package/dist/setup/detect.js.map +1 -1
- package/dist/setup/instructions.js +1 -1
- package/dist/setup/instructions.js.map +1 -1
- package/dist/setup/json-config.js +1 -1
- package/dist/setup/json-config.js.map +1 -1
- package/dist/setup/postinstall.js +22 -1
- package/dist/setup/postinstall.js.map +1 -1
- package/dist/setup/preuninstall.js +1 -1
- package/dist/setup/preuninstall.js.map +1 -1
- package/dist/setup/teardown.js +1 -1
- package/dist/setup/teardown.js.map +1 -1
- package/dist/setup/toml-config.js +1 -1
- package/dist/setup/toml-config.js.map +1 -1
- package/dist/setup/types.js +1 -1
- package/dist/setup/types.js.map +1 -1
- package/dist/test-helpers.js +1 -1
- package/dist/test-helpers.js.map +1 -1
- package/package.json +3 -3
- package/registry/index.json +1162 -0
- package/LICENSE-COMMERCIAL.md +0 -46
|
@@ -0,0 +1,115 @@
|
|
|
1
|
+
// SPDX-License-Identifier: AGPL-3.0-or-later
|
|
2
|
+
/**
|
|
3
|
+
* Registry Loader — loads the skill registry from disk or bundled fallback.
|
|
4
|
+
*
|
|
5
|
+
* Resolution order:
|
|
6
|
+
* 1. User override (~/.superskill/registry/index.json) — if newer than bundled
|
|
7
|
+
* 2. Bundled registry (registry/index.json in the npm package)
|
|
8
|
+
*
|
|
9
|
+
* The registry is loaded once and cached in memory for the process lifetime.
|
|
10
|
+
*/
|
|
11
|
+
import { readFile } from "fs/promises";
|
|
12
|
+
import { resolve, dirname } from "path";
|
|
13
|
+
import { fileURLToPath } from "url";
|
|
14
|
+
import { homedir } from "os";
|
|
15
|
+
// ── Registry State ─────────────────────────────────
|
|
16
|
+
let _registry = null;
|
|
17
|
+
let _bundledPath = null;
|
|
18
|
+
/**
|
|
19
|
+
* Resolve the path to the bundled registry file.
|
|
20
|
+
* Works in both ESM and CJS contexts.
|
|
21
|
+
*/
|
|
22
|
+
function getBundledRegistryPath() {
|
|
23
|
+
if (_bundledPath)
|
|
24
|
+
return _bundledPath;
|
|
25
|
+
// This file is at src/lib/registry-loader.ts → compiled to dist/lib/registry-loader.js
|
|
26
|
+
// Registry is at registry/index.json (project root)
|
|
27
|
+
const thisDir = dirname(fileURLToPath(import.meta.url));
|
|
28
|
+
_bundledPath = resolve(thisDir, "..", "..", "registry", "index.json");
|
|
29
|
+
return _bundledPath;
|
|
30
|
+
}
|
|
31
|
+
const USER_REGISTRY_PATH = resolve(homedir(), ".superskill", "registry", "index.json");
|
|
32
|
+
// Allow tests to override paths
|
|
33
|
+
let _userRegistryPath = USER_REGISTRY_PATH;
|
|
34
|
+
export function _setUserRegistryPath(p) { _userRegistryPath = p; }
|
|
35
|
+
export function _resetUserRegistryPath() { _userRegistryPath = USER_REGISTRY_PATH; }
|
|
36
|
+
export function _setBundledRegistryPath(p) { _bundledPath = p; }
|
|
37
|
+
export function _resetBundledRegistryPath() { _bundledPath = null; }
|
|
38
|
+
/**
|
|
39
|
+
* Clear the cached registry. Used for testing.
|
|
40
|
+
*/
|
|
41
|
+
export function _clearRegistry() {
|
|
42
|
+
_registry = null;
|
|
43
|
+
}
|
|
44
|
+
// ── Validation ─────────────────────────────────────
|
|
45
|
+
function isValidRegistry(data) {
|
|
46
|
+
if (!data || typeof data !== "object")
|
|
47
|
+
return false;
|
|
48
|
+
const d = data;
|
|
49
|
+
return (typeof d.registry_version === "string" &&
|
|
50
|
+
Array.isArray(d.domains) &&
|
|
51
|
+
Array.isArray(d.skills) &&
|
|
52
|
+
Array.isArray(d.profiles) &&
|
|
53
|
+
d.domains.length > 0 &&
|
|
54
|
+
d.skills.length > 0);
|
|
55
|
+
}
|
|
56
|
+
// ── Loading ────────────────────────────────────────
|
|
57
|
+
async function loadFromFile(path) {
|
|
58
|
+
try {
|
|
59
|
+
const raw = await readFile(path, "utf-8");
|
|
60
|
+
const parsed = JSON.parse(raw);
|
|
61
|
+
if (isValidRegistry(parsed))
|
|
62
|
+
return parsed;
|
|
63
|
+
return null;
|
|
64
|
+
}
|
|
65
|
+
catch {
|
|
66
|
+
return null;
|
|
67
|
+
}
|
|
68
|
+
}
|
|
69
|
+
/**
|
|
70
|
+
* Load the registry. Tries user override first, falls back to bundled.
|
|
71
|
+
* The result is cached in memory — call _clearRegistry() in tests.
|
|
72
|
+
*/
|
|
73
|
+
export async function loadRegistry() {
|
|
74
|
+
if (_registry)
|
|
75
|
+
return _registry;
|
|
76
|
+
// Try user override first
|
|
77
|
+
const userRegistry = await loadFromFile(_userRegistryPath);
|
|
78
|
+
if (userRegistry) {
|
|
79
|
+
_registry = userRegistry;
|
|
80
|
+
return _registry;
|
|
81
|
+
}
|
|
82
|
+
// Fall back to bundled
|
|
83
|
+
const bundledRegistry = await loadFromFile(getBundledRegistryPath());
|
|
84
|
+
if (bundledRegistry) {
|
|
85
|
+
_registry = bundledRegistry;
|
|
86
|
+
return _registry;
|
|
87
|
+
}
|
|
88
|
+
throw new Error("Failed to load skill registry: no valid registry found");
|
|
89
|
+
}
|
|
90
|
+
/**
|
|
91
|
+
* Get the cached registry. Throws if not yet loaded.
|
|
92
|
+
* For synchronous access after loadRegistry() has been called.
|
|
93
|
+
*/
|
|
94
|
+
export function getRegistry() {
|
|
95
|
+
if (!_registry) {
|
|
96
|
+
throw new Error("Registry not loaded. Call loadRegistry() first.");
|
|
97
|
+
}
|
|
98
|
+
return _registry;
|
|
99
|
+
}
|
|
100
|
+
/**
|
|
101
|
+
* Get the full source URL for a skill.
|
|
102
|
+
*/
|
|
103
|
+
export function getSkillSourceUrl(skill, registry) {
|
|
104
|
+
const source = registry.sources[skill.source];
|
|
105
|
+
if (!source)
|
|
106
|
+
throw new Error(`Unknown source "${skill.source}" for skill "${skill.id}"`);
|
|
107
|
+
return `${source.base_url}/${skill.path}`;
|
|
108
|
+
}
|
|
109
|
+
/**
|
|
110
|
+
* Get all domain names as a formatted string for tool descriptions.
|
|
111
|
+
*/
|
|
112
|
+
export function getDomainSummary(registry) {
|
|
113
|
+
return registry.domains.map((d) => d.name).join(", ");
|
|
114
|
+
}
|
|
115
|
+
//# sourceMappingURL=registry-loader.js.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"registry-loader.js","sourceRoot":"","sources":["../../src/lib/registry-loader.ts"],"names":[],"mappings":"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"}
|
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"safe-external-path.js","sourceRoot":"","sources":["../../src/lib/safe-external-path.ts"],"names":[],"mappings":"AAAA,
|
|
1
|
+
{"version":3,"file":"safe-external-path.js","sourceRoot":"","sources":["../../src/lib/safe-external-path.ts"],"names":[],"mappings":"AAAA,6CAA6C;AAC7C,OAAO,EAAE,OAAO,EAAE,MAAM,IAAI,CAAC;AAC7B,OAAO,EAAE,OAAO,EAAE,MAAM,MAAM,CAAC;AAC/B,OAAO,EAAE,QAAQ,EAAE,MAAM,aAAa,CAAC;AACvC,OAAO,EAAE,QAAQ,EAAE,MAAM,eAAe,CAAC;AACzC,OAAO,EAAE,SAAS,EAAE,MAAM,MAAM,CAAC;AAEjC,MAAM,aAAa,GAAG,SAAS,CAAC,QAAQ,CAAC,CAAC;AAE1C;;;;;;;;GAQG;AACH,MAAM,CAAC,KAAK,UAAU,gBAAgB,CAAC,OAAe;IACpD,MAAM,IAAI,GAAG,OAAO,EAAE,CAAC;IACvB,MAAM,QAAQ,GAAG,OAAO,CAAC,OAAO,CAAC,UAAU,CAAC,GAAG,CAAC,CAAC,CAAC,CAAC,OAAO,CAAC,OAAO,CAAC,GAAG,EAAE,IAAI,CAAC,CAAC,CAAC,CAAC,OAAO,CAAC,CAAC;IAEzF,kFAAkF;IAClF,IAAI,QAAQ,KAAK,IAAI,IAAI,CAAC,QAAQ,CAAC,UAAU,CAAC,IAAI,GAAG,GAAG,CAAC,EAAE,CAAC;QAC1D,MAAM,IAAI,KAAK,CAAC,2CAA2C,QAAQ,EAAE,CAAC,CAAC;IACzE,CAAC;IAED,uDAAuD;IACvD,IAAI,CAAC;QACH,MAAM,IAAI,GAAG,MAAM,QAAQ,CAAC,QAAQ,CAAC,CAAC;QACtC,IAAI,IAAI,KAAK,IAAI,IAAI,CAAC,IAAI,CAAC,UAAU,CAAC,IAAI,GAAG,GAAG,CAAC,EAAE,CAAC;YAClD,MAAM,IAAI,KAAK,CAAC,mCAAmC,OAAO,EAAE,CAAC,CAAC;QAChE,CAAC;IACH,CAAC;IAAC,OAAO,CAAM,EAAE,CAAC;QAChB,IAAI,CAAC,CAAC,IAAI,KAAK,QAAQ;YAAE,MAAM,IAAI,KAAK,CAAC,wBAAwB,OAAO,EAAE,CAAC,CAAC;QAC5E,IAAI,CAAC,CAAC,OAAO,EAAE,QAAQ,CAAC,SAAS,CAAC;YAAE,MAAM,CAAC,CAAC;QAC5C,MAAM,CAAC,CAAC;IACV,CAAC;IAED,qBAAqB;IACrB,IAAI,CAAC;QACH,MAAM,aAAa,CAAC,KAAK,EAAE,CAAC,WAAW,EAAE,WAAW,CAAC,EAAE,EAAE,GAAG,EAAE,QAAQ,EAAE,OAAO,EAAE,IAAI,EAAE,CAAC,CAAC;IAC3F,CAAC;IAAC,MAAM,CAAC;QACP,MAAM,IAAI,KAAK,CAAC,yBAAyB,OAAO,EAAE,CAAC,CAAC;IACtD,CAAC;IAED,OAAO,QAAQ,CAAC;AAClB,CAAC"}
|
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"search-engine.js","sourceRoot":"","sources":["../../src/lib/search-engine.ts"],"names":[],"mappings":"AAAA,
|
|
1
|
+
{"version":3,"file":"search-engine.js","sourceRoot":"","sources":["../../src/lib/search-engine.ts"],"names":[],"mappings":"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"}
|
|
@@ -0,0 +1,16 @@
|
|
|
1
|
+
/**
|
|
2
|
+
* Security scanner for skill content.
|
|
3
|
+
* Detects prompt injection patterns in markdown files destined for LLM context.
|
|
4
|
+
* Extracted from web-discovery.ts for reuse in registry validation.
|
|
5
|
+
*/
|
|
6
|
+
export interface ScanResult {
|
|
7
|
+
blocked: boolean;
|
|
8
|
+
reason?: string;
|
|
9
|
+
warnings: string[];
|
|
10
|
+
}
|
|
11
|
+
/**
|
|
12
|
+
* Scan skill content for prompt injection patterns.
|
|
13
|
+
* Skills are markdown injected into LLM context — malicious content
|
|
14
|
+
* could instruct the LLM to exfiltrate data, run commands, or ignore user intent.
|
|
15
|
+
*/
|
|
16
|
+
export declare function scanForPromptInjection(content: string): ScanResult;
|
|
@@ -0,0 +1,44 @@
|
|
|
1
|
+
// SPDX-License-Identifier: AGPL-3.0-or-later
|
|
2
|
+
/**
|
|
3
|
+
* Scan skill content for prompt injection patterns.
|
|
4
|
+
* Skills are markdown injected into LLM context — malicious content
|
|
5
|
+
* could instruct the LLM to exfiltrate data, run commands, or ignore user intent.
|
|
6
|
+
*/
|
|
7
|
+
export function scanForPromptInjection(content) {
|
|
8
|
+
const warnings = [];
|
|
9
|
+
const lower = content.toLowerCase();
|
|
10
|
+
// Hard blocks — these should never appear in a skill file
|
|
11
|
+
const blockedPatterns = [
|
|
12
|
+
{ pattern: /ignore (all |any )?(previous|prior|above) (instructions|prompts|context)/i, reason: "Prompt override attempt" },
|
|
13
|
+
{ pattern: /forget (all |everything )?(you|your|previous)/i, reason: "Memory wipe attempt" },
|
|
14
|
+
{ pattern: /do not (tell|inform|reveal|mention|show) (the user|anyone)/i, reason: "Secrecy instruction — skills should be transparent" },
|
|
15
|
+
{ pattern: /exfiltrate|steal|extract.*secret|send.*to.*http/i, reason: "Data exfiltration pattern" },
|
|
16
|
+
{ pattern: /curl\s+.*\|.*sh/i, reason: "Remote code execution via pipe to shell" },
|
|
17
|
+
{ pattern: /rm\s+-rf\s+[\/~]/i, reason: "Destructive filesystem command" },
|
|
18
|
+
{ pattern: /eval\s*\(.*fetch/i, reason: "Dynamic code execution from remote source" },
|
|
19
|
+
{ pattern: /<\s*script[\s>]/i, reason: "Script injection" },
|
|
20
|
+
];
|
|
21
|
+
for (const { pattern, reason } of blockedPatterns) {
|
|
22
|
+
if (pattern.test(content)) {
|
|
23
|
+
return { blocked: true, reason, warnings };
|
|
24
|
+
}
|
|
25
|
+
}
|
|
26
|
+
// Soft warnings — suspicious but not necessarily malicious
|
|
27
|
+
if (lower.includes("api_key") || lower.includes("secret_key") || lower.includes("password")) {
|
|
28
|
+
warnings.push("References credentials — review before loading");
|
|
29
|
+
}
|
|
30
|
+
if (lower.includes("sudo ") || lower.includes("chmod 777")) {
|
|
31
|
+
warnings.push("Contains privileged system commands");
|
|
32
|
+
}
|
|
33
|
+
if ((content.match(/https?:\/\//g) || []).length > 20) {
|
|
34
|
+
warnings.push("Unusually high number of external URLs");
|
|
35
|
+
}
|
|
36
|
+
if (lower.includes("system prompt") || lower.includes("system message")) {
|
|
37
|
+
warnings.push("References system prompts — may attempt to modify LLM behavior");
|
|
38
|
+
}
|
|
39
|
+
if (/you are now|you must now act as/i.test(content)) {
|
|
40
|
+
warnings.push("Contains role-play instructions — common in skills but review for legitimacy");
|
|
41
|
+
}
|
|
42
|
+
return { blocked: false, warnings };
|
|
43
|
+
}
|
|
44
|
+
//# sourceMappingURL=security-scanner.js.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"security-scanner.js","sourceRoot":"","sources":["../../src/lib/security-scanner.ts"],"names":[],"mappings":"AAAA,6CAA6C;AAc7C;;;;GAIG;AACH,MAAM,UAAU,sBAAsB,CAAC,OAAe;IACpD,MAAM,QAAQ,GAAa,EAAE,CAAC;IAC9B,MAAM,KAAK,GAAG,OAAO,CAAC,WAAW,EAAE,CAAC;IAEpC,0DAA0D;IAC1D,MAAM,eAAe,GAA+C;QAClE,EAAE,OAAO,EAAE,2EAA2E,EAAE,MAAM,EAAE,yBAAyB,EAAE;QAC3H,EAAE,OAAO,EAAE,gDAAgD,EAAE,MAAM,EAAE,qBAAqB,EAAE;QAC5F,EAAE,OAAO,EAAE,6DAA6D,EAAE,MAAM,EAAE,oDAAoD,EAAE;QACxI,EAAE,OAAO,EAAE,kDAAkD,EAAE,MAAM,EAAE,2BAA2B,EAAE;QACpG,EAAE,OAAO,EAAE,kBAAkB,EAAE,MAAM,EAAE,yCAAyC,EAAE;QAClF,EAAE,OAAO,EAAE,mBAAmB,EAAE,MAAM,EAAE,gCAAgC,EAAE;QAC1E,EAAE,OAAO,EAAE,mBAAmB,EAAE,MAAM,EAAE,2CAA2C,EAAE;QACrF,EAAE,OAAO,EAAE,kBAAkB,EAAE,MAAM,EAAE,kBAAkB,EAAE;KAC5D,CAAC;IAEF,KAAK,MAAM,EAAE,OAAO,EAAE,MAAM,EAAE,IAAI,eAAe,EAAE,CAAC;QAClD,IAAI,OAAO,CAAC,IAAI,CAAC,OAAO,CAAC,EAAE,CAAC;YAC1B,OAAO,EAAE,OAAO,EAAE,IAAI,EAAE,MAAM,EAAE,QAAQ,EAAE,CAAC;QAC7C,CAAC;IACH,CAAC;IAED,2DAA2D;IAC3D,IAAI,KAAK,CAAC,QAAQ,CAAC,SAAS,CAAC,IAAI,KAAK,CAAC,QAAQ,CAAC,YAAY,CAAC,IAAI,KAAK,CAAC,QAAQ,CAAC,UAAU,CAAC,EAAE,CAAC;QAC5F,QAAQ,CAAC,IAAI,CAAC,gDAAgD,CAAC,CAAC;IAClE,CAAC;IACD,IAAI,KAAK,CAAC,QAAQ,CAAC,OAAO,CAAC,IAAI,KAAK,CAAC,QAAQ,CAAC,WAAW,CAAC,EAAE,CAAC;QAC3D,QAAQ,CAAC,IAAI,CAAC,qCAAqC,CAAC,CAAC;IACvD,CAAC;IACD,IAAI,CAAC,OAAO,CAAC,KAAK,CAAC,cAAc,CAAC,IAAI,EAAE,CAAC,CAAC,MAAM,GAAG,EAAE,EAAE,CAAC;QACtD,QAAQ,CAAC,IAAI,CAAC,wCAAwC,CAAC,CAAC;IAC1D,CAAC;IACD,IAAI,KAAK,CAAC,QAAQ,CAAC,eAAe,CAAC,IAAI,KAAK,CAAC,QAAQ,CAAC,gBAAgB,CAAC,EAAE,CAAC;QACxE,QAAQ,CAAC,IAAI,CAAC,gEAAgE,CAAC,CAAC;IAClF,CAAC;IACD,IAAI,kCAAkC,CAAC,IAAI,CAAC,OAAO,CAAC,EAAE,CAAC;QACrD,QAAQ,CAAC,IAAI,CAAC,8EAA8E,CAAC,CAAC;IAChG,CAAC;IAED,OAAO,EAAE,OAAO,EAAE,KAAK,EAAE,QAAQ,EAAE,CAAC;AACtC,CAAC"}
|
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"session-registry.js","sourceRoot":"","sources":["../../src/lib/session-registry.ts"],"names":[],"mappings":"AAAA,
|
|
1
|
+
{"version":3,"file":"session-registry.js","sourceRoot":"","sources":["../../src/lib/session-registry.ts"],"names":[],"mappings":"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"}
|
|
@@ -0,0 +1,34 @@
|
|
|
1
|
+
/** The 8 core skills that are prefetched on install */
|
|
2
|
+
export declare const PREFETCH_SKILL_IDS: string[];
|
|
3
|
+
export declare function setCacheDir(dir: string): void;
|
|
4
|
+
export declare function getCacheDir(): string;
|
|
5
|
+
/**
|
|
6
|
+
* Get cached skill content. Returns null if not cached.
|
|
7
|
+
*/
|
|
8
|
+
export declare function getCachedSkill(skillId: string): Promise<string | null>;
|
|
9
|
+
/**
|
|
10
|
+
* Write skill content to cache. Uses atomic write (temp + rename).
|
|
11
|
+
*/
|
|
12
|
+
export declare function cacheSkill(skillId: string, content: string): Promise<void>;
|
|
13
|
+
/**
|
|
14
|
+
* Check if a skill is cached.
|
|
15
|
+
*/
|
|
16
|
+
export declare function isSkillCached(skillId: string): Promise<boolean>;
|
|
17
|
+
/**
|
|
18
|
+
* Prefetch core skills from their source repos.
|
|
19
|
+
* Called during postinstall. Non-fatal — warns on failure, never blocks install.
|
|
20
|
+
* Returns count of successfully cached skills.
|
|
21
|
+
*/
|
|
22
|
+
export declare function prefetchCoreSkills(options?: {
|
|
23
|
+
concurrency?: number;
|
|
24
|
+
onProgress?: (skill: string, status: "cached" | "fetched" | "failed") => void;
|
|
25
|
+
}): Promise<{
|
|
26
|
+
fetched: number;
|
|
27
|
+
cached: number;
|
|
28
|
+
failed: number;
|
|
29
|
+
errors: string[];
|
|
30
|
+
}>;
|
|
31
|
+
/**
|
|
32
|
+
* List all cached skills.
|
|
33
|
+
*/
|
|
34
|
+
export declare function listCachedSkills(): Promise<string[]>;
|
|
@@ -0,0 +1,150 @@
|
|
|
1
|
+
// SPDX-License-Identifier: AGPL-3.0-or-later
|
|
2
|
+
/**
|
|
3
|
+
* Skill cache — local disk cache for fetched skill content.
|
|
4
|
+
* Skills are cached at ~/.superskill/cache/{source}/{name}@{version}.md
|
|
5
|
+
* Prefetched skills are downloaded on install for offline availability.
|
|
6
|
+
*/
|
|
7
|
+
import { readFile, writeFile, mkdir, rename, readdir } from "fs/promises";
|
|
8
|
+
import { resolve, dirname, join } from "path";
|
|
9
|
+
import { homedir, tmpdir } from "os";
|
|
10
|
+
import { randomBytes } from "crypto";
|
|
11
|
+
import { getCatalog } from "../commands/skill/catalog.js";
|
|
12
|
+
// ── Configuration ────────────────────────────────────
|
|
13
|
+
const CACHE_DIR = resolve(homedir(), ".superskill", "cache");
|
|
14
|
+
/** The 8 core skills that are prefetched on install */
|
|
15
|
+
export const PREFETCH_SKILL_IDS = [
|
|
16
|
+
"superpowers/brainstorming",
|
|
17
|
+
"ecc/plan",
|
|
18
|
+
"ecc/tdd-workflow",
|
|
19
|
+
"ecc/go-review",
|
|
20
|
+
"superpowers/systematic-debugging",
|
|
21
|
+
"ecc/security-review",
|
|
22
|
+
"ecc/verification-loop",
|
|
23
|
+
"ecc/deployment-patterns",
|
|
24
|
+
];
|
|
25
|
+
// Allow tests to override the cache dir
|
|
26
|
+
let cacheDir = CACHE_DIR;
|
|
27
|
+
export function setCacheDir(dir) { cacheDir = dir; }
|
|
28
|
+
export function getCacheDir() { return cacheDir; }
|
|
29
|
+
// ── Cache Operations ─────────────────────────────────
|
|
30
|
+
/**
|
|
31
|
+
* Get cached skill content. Returns null if not cached.
|
|
32
|
+
*/
|
|
33
|
+
export async function getCachedSkill(skillId) {
|
|
34
|
+
try {
|
|
35
|
+
const path = skillCachePath(skillId);
|
|
36
|
+
return await readFile(path, "utf-8");
|
|
37
|
+
}
|
|
38
|
+
catch {
|
|
39
|
+
return null;
|
|
40
|
+
}
|
|
41
|
+
}
|
|
42
|
+
/**
|
|
43
|
+
* Write skill content to cache. Uses atomic write (temp + rename).
|
|
44
|
+
*/
|
|
45
|
+
export async function cacheSkill(skillId, content) {
|
|
46
|
+
try {
|
|
47
|
+
const path = skillCachePath(skillId);
|
|
48
|
+
await mkdir(dirname(path), { recursive: true });
|
|
49
|
+
const tmp = join(tmpdir(), `superskill-cache-${randomBytes(8).toString("hex")}`);
|
|
50
|
+
await writeFile(tmp, content, "utf-8");
|
|
51
|
+
await rename(tmp, path);
|
|
52
|
+
}
|
|
53
|
+
catch {
|
|
54
|
+
// Cache write failure is non-fatal
|
|
55
|
+
}
|
|
56
|
+
}
|
|
57
|
+
/**
|
|
58
|
+
* Check if a skill is cached.
|
|
59
|
+
*/
|
|
60
|
+
export async function isSkillCached(skillId) {
|
|
61
|
+
try {
|
|
62
|
+
await readFile(skillCachePath(skillId), "utf-8");
|
|
63
|
+
return true;
|
|
64
|
+
}
|
|
65
|
+
catch {
|
|
66
|
+
return false;
|
|
67
|
+
}
|
|
68
|
+
}
|
|
69
|
+
/**
|
|
70
|
+
* Prefetch core skills from their source repos.
|
|
71
|
+
* Called during postinstall. Non-fatal — warns on failure, never blocks install.
|
|
72
|
+
* Returns count of successfully cached skills.
|
|
73
|
+
*/
|
|
74
|
+
export async function prefetchCoreSkills(options) {
|
|
75
|
+
const concurrency = options?.concurrency ?? 4;
|
|
76
|
+
const onProgress = options?.onProgress;
|
|
77
|
+
const results = { fetched: 0, cached: 0, failed: 0, errors: [] };
|
|
78
|
+
// Resolve skill IDs to catalog entries
|
|
79
|
+
const skills = PREFETCH_SKILL_IDS
|
|
80
|
+
.map((id) => getCatalog().find((s) => s.id === id))
|
|
81
|
+
.filter((s) => s !== undefined);
|
|
82
|
+
// Process in batches for bounded concurrency
|
|
83
|
+
for (let i = 0; i < skills.length; i += concurrency) {
|
|
84
|
+
const batch = skills.slice(i, i + concurrency);
|
|
85
|
+
const batchResults = await Promise.allSettled(batch.map(async (skill) => {
|
|
86
|
+
// Check if already cached
|
|
87
|
+
if (await isSkillCached(skill.id)) {
|
|
88
|
+
onProgress?.(skill.id, "cached");
|
|
89
|
+
results.cached++;
|
|
90
|
+
return;
|
|
91
|
+
}
|
|
92
|
+
// Fetch from source
|
|
93
|
+
const content = await fetchSkillFromSource(skill.source);
|
|
94
|
+
await cacheSkill(skill.id, content);
|
|
95
|
+
onProgress?.(skill.id, "fetched");
|
|
96
|
+
results.fetched++;
|
|
97
|
+
}));
|
|
98
|
+
for (let j = 0; j < batchResults.length; j++) {
|
|
99
|
+
const result = batchResults[j];
|
|
100
|
+
if (result.status === "rejected") {
|
|
101
|
+
const skillId = batch[j].id;
|
|
102
|
+
const error = result.reason instanceof Error ? result.reason.message : String(result.reason);
|
|
103
|
+
results.errors.push(`${skillId}: ${error}`);
|
|
104
|
+
results.failed++;
|
|
105
|
+
onProgress?.(skillId, "failed");
|
|
106
|
+
}
|
|
107
|
+
}
|
|
108
|
+
}
|
|
109
|
+
return results;
|
|
110
|
+
}
|
|
111
|
+
/**
|
|
112
|
+
* List all cached skills.
|
|
113
|
+
*/
|
|
114
|
+
export async function listCachedSkills() {
|
|
115
|
+
try {
|
|
116
|
+
const cached = [];
|
|
117
|
+
const repos = await readdir(cacheDir).catch(() => []);
|
|
118
|
+
for (const repo of repos) {
|
|
119
|
+
const repoDir = join(cacheDir, repo);
|
|
120
|
+
const files = await readdir(repoDir).catch(() => []);
|
|
121
|
+
for (const file of files) {
|
|
122
|
+
if (file.endsWith(".md")) {
|
|
123
|
+
const name = file.replace(".md", "");
|
|
124
|
+
cached.push(`${repo}/${name}`);
|
|
125
|
+
}
|
|
126
|
+
}
|
|
127
|
+
}
|
|
128
|
+
return cached;
|
|
129
|
+
}
|
|
130
|
+
catch {
|
|
131
|
+
return [];
|
|
132
|
+
}
|
|
133
|
+
}
|
|
134
|
+
// ── Helpers ──────────────────────────────────────────
|
|
135
|
+
function skillCachePath(skillId) {
|
|
136
|
+
// "ecc/tdd-workflow" → ~/.superskill/cache/ecc/tdd-workflow.md
|
|
137
|
+
const [repo, ...rest] = skillId.split("/");
|
|
138
|
+
const name = rest.join("/");
|
|
139
|
+
return resolve(cacheDir, repo, `${name}.md`);
|
|
140
|
+
}
|
|
141
|
+
async function fetchSkillFromSource(source) {
|
|
142
|
+
if (source.startsWith("http://") || source.startsWith("https://")) {
|
|
143
|
+
const res = await fetch(source);
|
|
144
|
+
if (!res.ok)
|
|
145
|
+
throw new Error(`HTTP ${res.status} ${res.statusText}`);
|
|
146
|
+
return res.text();
|
|
147
|
+
}
|
|
148
|
+
return readFile(source, "utf-8");
|
|
149
|
+
}
|
|
150
|
+
//# sourceMappingURL=skill-cache.js.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"skill-cache.js","sourceRoot":"","sources":["../../src/lib/skill-cache.ts"],"names":[],"mappings":"AAAA,6CAA6C;AAE7C;;;;GAIG;AAEH,OAAO,EAAE,QAAQ,EAAE,SAAS,EAAE,KAAK,EAAE,MAAM,EAAE,OAAO,EAAE,MAAM,aAAa,CAAC;AAC1E,OAAO,EAAE,OAAO,EAAE,OAAO,EAAE,IAAI,EAAE,MAAM,MAAM,CAAC;AAC9C,OAAO,EAAE,OAAO,EAAE,MAAM,EAAE,MAAM,IAAI,CAAC;AACrC,OAAO,EAAE,WAAW,EAAE,MAAM,QAAQ,CAAC;AACrC,OAAO,EAAE,UAAU,EAAE,MAAM,8BAA8B,CAAC;AAG1D,wDAAwD;AAExD,MAAM,SAAS,GAAG,OAAO,CAAC,OAAO,EAAE,EAAE,aAAa,EAAE,OAAO,CAAC,CAAC;AAE7D,uDAAuD;AACvD,MAAM,CAAC,MAAM,kBAAkB,GAAa;IAC1C,2BAA2B;IAC3B,UAAU;IACV,kBAAkB;IAClB,eAAe;IACf,kCAAkC;IAClC,qBAAqB;IACrB,uBAAuB;IACvB,yBAAyB;CAC1B,CAAC;AAEF,wCAAwC;AACxC,IAAI,QAAQ,GAAG,SAAS,CAAC;AACzB,MAAM,UAAU,WAAW,CAAC,GAAW,IAAU,QAAQ,GAAG,GAAG,CAAC,CAAC,CAAC;AAClE,MAAM,UAAU,WAAW,KAAa,OAAO,QAAQ,CAAC,CAAC,CAAC;AAE1D,wDAAwD;AAExD;;GAEG;AACH,MAAM,CAAC,KAAK,UAAU,cAAc,CAAC,OAAe;IAClD,IAAI,CAAC;QACH,MAAM,IAAI,GAAG,cAAc,CAAC,OAAO,CAAC,CAAC;QACrC,OAAO,MAAM,QAAQ,CAAC,IAAI,EAAE,OAAO,CAAC,CAAC;IACvC,CAAC;IAAC,MAAM,CAAC;QACP,OAAO,IAAI,CAAC;IACd,CAAC;AACH,CAAC;AAED;;GAEG;AACH,MAAM,CAAC,KAAK,UAAU,UAAU,CAAC,OAAe,EAAE,OAAe;IAC/D,IAAI,CAAC;QACH,MAAM,IAAI,GAAG,cAAc,CAAC,OAAO,CAAC,CAAC;QACrC,MAAM,KAAK,CAAC,OAAO,CAAC,IAAI,CAAC,EAAE,EAAE,SAAS,EAAE,IAAI,EAAE,CAAC,CAAC;QAChD,MAAM,GAAG,GAAG,IAAI,CAAC,MAAM,EAAE,EAAE,oBAAoB,WAAW,CAAC,CAAC,CAAC,CAAC,QAAQ,CAAC,KAAK,CAAC,EAAE,CAAC,CAAC;QACjF,MAAM,SAAS,CAAC,GAAG,EAAE,OAAO,EAAE,OAAO,CAAC,CAAC;QACvC,MAAM,MAAM,CAAC,GAAG,EAAE,IAAI,CAAC,CAAC;IAC1B,CAAC;IAAC,MAAM,CAAC;QACP,mCAAmC;IACrC,CAAC;AACH,CAAC;AAED;;GAEG;AACH,MAAM,CAAC,KAAK,UAAU,aAAa,CAAC,OAAe;IACjD,IAAI,CAAC;QACH,MAAM,QAAQ,CAAC,cAAc,CAAC,OAAO,CAAC,EAAE,OAAO,CAAC,CAAC;QACjD,OAAO,IAAI,CAAC;IACd,CAAC;IAAC,MAAM,CAAC;QACP,OAAO,KAAK,CAAC;IACf,CAAC;AACH,CAAC;AAED;;;;GAIG;AACH,MAAM,CAAC,KAAK,UAAU,kBAAkB,CAAC,OAGxC;IACC,MAAM,WAAW,GAAG,OAAO,EAAE,WAAW,IAAI,CAAC,CAAC;IAC9C,MAAM,UAAU,GAAG,OAAO,EAAE,UAAU,CAAC;IAEvC,MAAM,OAAO,GAAG,EAAE,OAAO,EAAE,CAAC,EAAE,MAAM,EAAE,CAAC,EAAE,MAAM,EAAE,CAAC,EAAE,MAAM,EAAE,EAAc,EAAE,CAAC;IAE7E,uCAAuC;IACvC,MAAM,MAAM,GAAG,kBAAkB;SAC9B,GAAG,CAAC,CAAC,EAAE,EAAE,EAAE,CAAC,UAAU,EAAE,CAAC,IAAI,CAAC,CAAC,CAAC,EAAE,EAAE,CAAC,CAAC,CAAC,EAAE,KAAK,EAAE,CAAC,CAAC;SAClD,MAAM,CAAC,CAAC,CAAC,EAAqB,EAAE,CAAC,CAAC,KAAK,SAAS,CAAC,CAAC;IAErD,6CAA6C;IAC7C,KAAK,IAAI,CAAC,GAAG,CAAC,EAAE,CAAC,GAAG,MAAM,CAAC,MAAM,EAAE,CAAC,IAAI,WAAW,EAAE,CAAC;QACpD,MAAM,KAAK,GAAG,MAAM,CAAC,KAAK,CAAC,CAAC,EAAE,CAAC,GAAG,WAAW,CAAC,CAAC;QAC/C,MAAM,YAAY,GAAG,MAAM,OAAO,CAAC,UAAU,CAC3C,KAAK,CAAC,GAAG,CAAC,KAAK,EAAE,KAAK,EAAE,EAAE;YACxB,0BAA0B;YAC1B,IAAI,MAAM,aAAa,CAAC,KAAK,CAAC,EAAE,CAAC,EAAE,CAAC;gBAClC,UAAU,EAAE,CAAC,KAAK,CAAC,EAAE,EAAE,QAAQ,CAAC,CAAC;gBACjC,OAAO,CAAC,MAAM,EAAE,CAAC;gBACjB,OAAO;YACT,CAAC;YAED,oBAAoB;YACpB,MAAM,OAAO,GAAG,MAAM,oBAAoB,CAAC,KAAK,CAAC,MAAM,CAAC,CAAC;YACzD,MAAM,UAAU,CAAC,KAAK,CAAC,EAAE,EAAE,OAAO,CAAC,CAAC;YACpC,UAAU,EAAE,CAAC,KAAK,CAAC,EAAE,EAAE,SAAS,CAAC,CAAC;YAClC,OAAO,CAAC,OAAO,EAAE,CAAC;QACpB,CAAC,CAAC,CACH,CAAC;QAEF,KAAK,IAAI,CAAC,GAAG,CAAC,EAAE,CAAC,GAAG,YAAY,CAAC,MAAM,EAAE,CAAC,EAAE,EAAE,CAAC;YAC7C,MAAM,MAAM,GAAG,YAAY,CAAC,CAAC,CAAC,CAAC;YAC/B,IAAI,MAAM,CAAC,MAAM,KAAK,UAAU,EAAE,CAAC;gBACjC,MAAM,OAAO,GAAG,KAAK,CAAC,CAAC,CAAC,CAAC,EAAE,CAAC;gBAC5B,MAAM,KAAK,GAAG,MAAM,CAAC,MAAM,YAAY,KAAK,CAAC,CAAC,CAAC,MAAM,CAAC,MAAM,CAAC,OAAO,CAAC,CAAC,CAAC,MAAM,CAAC,MAAM,CAAC,MAAM,CAAC,CAAC;gBAC7F,OAAO,CAAC,MAAM,CAAC,IAAI,CAAC,GAAG,OAAO,KAAK,KAAK,EAAE,CAAC,CAAC;gBAC5C,OAAO,CAAC,MAAM,EAAE,CAAC;gBACjB,UAAU,EAAE,CAAC,OAAO,EAAE,QAAQ,CAAC,CAAC;YAClC,CAAC;QACH,CAAC;IACH,CAAC;IAED,OAAO,OAAO,CAAC;AACjB,CAAC;AAED;;GAEG;AACH,MAAM,CAAC,KAAK,UAAU,gBAAgB;IACpC,IAAI,CAAC;QACH,MAAM,MAAM,GAAa,EAAE,CAAC;QAC5B,MAAM,KAAK,GAAG,MAAM,OAAO,CAAC,QAAQ,CAAC,CAAC,KAAK,CAAC,GAAG,EAAE,CAAC,EAAc,CAAC,CAAC;QAClE,KAAK,MAAM,IAAI,IAAI,KAAK,EAAE,CAAC;YACzB,MAAM,OAAO,GAAG,IAAI,CAAC,QAAQ,EAAE,IAAI,CAAC,CAAC;YACrC,MAAM,KAAK,GAAG,MAAM,OAAO,CAAC,OAAO,CAAC,CAAC,KAAK,CAAC,GAAG,EAAE,CAAC,EAAc,CAAC,CAAC;YACjE,KAAK,MAAM,IAAI,IAAI,KAAK,EAAE,CAAC;gBACzB,IAAI,IAAI,CAAC,QAAQ,CAAC,KAAK,CAAC,EAAE,CAAC;oBACzB,MAAM,IAAI,GAAG,IAAI,CAAC,OAAO,CAAC,KAAK,EAAE,EAAE,CAAC,CAAC;oBACrC,MAAM,CAAC,IAAI,CAAC,GAAG,IAAI,IAAI,IAAI,EAAE,CAAC,CAAC;gBACjC,CAAC;YACH,CAAC;QACH,CAAC;QACD,OAAO,MAAM,CAAC;IAChB,CAAC;IAAC,MAAM,CAAC;QACP,OAAO,EAAE,CAAC;IACZ,CAAC;AACH,CAAC;AAED,wDAAwD;AAExD,SAAS,cAAc,CAAC,OAAe;IACrC,+DAA+D;IAC/D,MAAM,CAAC,IAAI,EAAE,GAAG,IAAI,CAAC,GAAG,OAAO,CAAC,KAAK,CAAC,GAAG,CAAC,CAAC;IAC3C,MAAM,IAAI,GAAG,IAAI,CAAC,IAAI,CAAC,GAAG,CAAC,CAAC;IAC5B,OAAO,OAAO,CAAC,QAAQ,EAAE,IAAI,EAAE,GAAG,IAAI,KAAK,CAAC,CAAC;AAC/C,CAAC;AAED,KAAK,UAAU,oBAAoB,CAAC,MAAc;IAChD,IAAI,MAAM,CAAC,UAAU,CAAC,SAAS,CAAC,IAAI,MAAM,CAAC,UAAU,CAAC,UAAU,CAAC,EAAE,CAAC;QAClE,MAAM,GAAG,GAAG,MAAM,KAAK,CAAC,MAAM,CAAC,CAAC;QAChC,IAAI,CAAC,GAAG,CAAC,EAAE;YAAE,MAAM,IAAI,KAAK,CAAC,QAAQ,GAAG,CAAC,MAAM,IAAI,GAAG,CAAC,UAAU,EAAE,CAAC,CAAC;QACrE,OAAO,GAAG,CAAC,IAAI,EAAE,CAAC;IACpB,CAAC;IACD,OAAO,QAAQ,CAAC,MAAM,EAAE,OAAO,CAAC,CAAC;AACnC,CAAC"}
|
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"skill-registry.js","sourceRoot":"","sources":["../../src/lib/skill-registry.ts"],"names":[],"mappings":"AAAA,
|
|
1
|
+
{"version":3,"file":"skill-registry.js","sourceRoot":"","sources":["../../src/lib/skill-registry.ts"],"names":[],"mappings":"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"}
|
|
@@ -0,0 +1,37 @@
|
|
|
1
|
+
export interface SessionEntry {
|
|
2
|
+
task: string;
|
|
3
|
+
domains: string[];
|
|
4
|
+
skill_ids: string[];
|
|
5
|
+
timestamp: number;
|
|
6
|
+
}
|
|
7
|
+
/**
|
|
8
|
+
* In-process skill session memory.
|
|
9
|
+
* Tracks activated skills by normalized task key so repeat calls
|
|
10
|
+
* with the same intent return cached results.
|
|
11
|
+
*/
|
|
12
|
+
export declare class SkillSession {
|
|
13
|
+
private entries;
|
|
14
|
+
/**
|
|
15
|
+
* Remember a skill activation result.
|
|
16
|
+
*/
|
|
17
|
+
remember(task: string, domains: string[], skillIds: string[]): void;
|
|
18
|
+
/**
|
|
19
|
+
* Recall a previous activation for a similar task.
|
|
20
|
+
* Returns null if no matching entry exists.
|
|
21
|
+
*/
|
|
22
|
+
recall(task: string): SessionEntry | null;
|
|
23
|
+
/**
|
|
24
|
+
* Check if a task has been activated before.
|
|
25
|
+
*/
|
|
26
|
+
has(task: string): boolean;
|
|
27
|
+
/**
|
|
28
|
+
* Clear all session memory.
|
|
29
|
+
*/
|
|
30
|
+
clear(): void;
|
|
31
|
+
/**
|
|
32
|
+
* Get the number of remembered activations.
|
|
33
|
+
*/
|
|
34
|
+
get size(): number;
|
|
35
|
+
}
|
|
36
|
+
/** Global session instance — persists for the process lifetime. */
|
|
37
|
+
export declare const globalSkillSession: SkillSession;
|
|
@@ -0,0 +1,62 @@
|
|
|
1
|
+
// SPDX-License-Identifier: AGPL-3.0-or-later
|
|
2
|
+
/**
|
|
3
|
+
* Session-aware skill memory — remembers activated skills within a session
|
|
4
|
+
* to avoid redundant fetches for the same or similar tasks.
|
|
5
|
+
*/
|
|
6
|
+
import { normalizeCacheKey } from "./text-utils.js";
|
|
7
|
+
/**
|
|
8
|
+
* In-process skill session memory.
|
|
9
|
+
* Tracks activated skills by normalized task key so repeat calls
|
|
10
|
+
* with the same intent return cached results.
|
|
11
|
+
*/
|
|
12
|
+
export class SkillSession {
|
|
13
|
+
entries = new Map();
|
|
14
|
+
/**
|
|
15
|
+
* Remember a skill activation result.
|
|
16
|
+
*/
|
|
17
|
+
remember(task, domains, skillIds) {
|
|
18
|
+
const key = normalizeCacheKey(task);
|
|
19
|
+
if (!key)
|
|
20
|
+
return;
|
|
21
|
+
this.entries.set(key, {
|
|
22
|
+
task,
|
|
23
|
+
domains,
|
|
24
|
+
skill_ids: skillIds,
|
|
25
|
+
timestamp: Date.now(),
|
|
26
|
+
});
|
|
27
|
+
}
|
|
28
|
+
/**
|
|
29
|
+
* Recall a previous activation for a similar task.
|
|
30
|
+
* Returns null if no matching entry exists.
|
|
31
|
+
*/
|
|
32
|
+
recall(task) {
|
|
33
|
+
const key = normalizeCacheKey(task);
|
|
34
|
+
if (!key)
|
|
35
|
+
return null;
|
|
36
|
+
return this.entries.get(key) ?? null;
|
|
37
|
+
}
|
|
38
|
+
/**
|
|
39
|
+
* Check if a task has been activated before.
|
|
40
|
+
*/
|
|
41
|
+
has(task) {
|
|
42
|
+
const key = normalizeCacheKey(task);
|
|
43
|
+
if (!key)
|
|
44
|
+
return false;
|
|
45
|
+
return this.entries.has(key);
|
|
46
|
+
}
|
|
47
|
+
/**
|
|
48
|
+
* Clear all session memory.
|
|
49
|
+
*/
|
|
50
|
+
clear() {
|
|
51
|
+
this.entries.clear();
|
|
52
|
+
}
|
|
53
|
+
/**
|
|
54
|
+
* Get the number of remembered activations.
|
|
55
|
+
*/
|
|
56
|
+
get size() {
|
|
57
|
+
return this.entries.size;
|
|
58
|
+
}
|
|
59
|
+
}
|
|
60
|
+
/** Global session instance — persists for the process lifetime. */
|
|
61
|
+
export const globalSkillSession = new SkillSession();
|
|
62
|
+
//# sourceMappingURL=skill-session.js.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"skill-session.js","sourceRoot":"","sources":["../../src/lib/skill-session.ts"],"names":[],"mappings":"AAAA,6CAA6C;AAE7C;;;GAGG;AAEH,OAAO,EAAE,iBAAiB,EAAE,MAAM,iBAAiB,CAAC;AASpD;;;;GAIG;AACH,MAAM,OAAO,YAAY;IACf,OAAO,GAAG,IAAI,GAAG,EAAwB,CAAC;IAElD;;OAEG;IACH,QAAQ,CAAC,IAAY,EAAE,OAAiB,EAAE,QAAkB;QAC1D,MAAM,GAAG,GAAG,iBAAiB,CAAC,IAAI,CAAC,CAAC;QACpC,IAAI,CAAC,GAAG;YAAE,OAAO;QACjB,IAAI,CAAC,OAAO,CAAC,GAAG,CAAC,GAAG,EAAE;YACpB,IAAI;YACJ,OAAO;YACP,SAAS,EAAE,QAAQ;YACnB,SAAS,EAAE,IAAI,CAAC,GAAG,EAAE;SACtB,CAAC,CAAC;IACL,CAAC;IAED;;;OAGG;IACH,MAAM,CAAC,IAAY;QACjB,MAAM,GAAG,GAAG,iBAAiB,CAAC,IAAI,CAAC,CAAC;QACpC,IAAI,CAAC,GAAG;YAAE,OAAO,IAAI,CAAC;QACtB,OAAO,IAAI,CAAC,OAAO,CAAC,GAAG,CAAC,GAAG,CAAC,IAAI,IAAI,CAAC;IACvC,CAAC;IAED;;OAEG;IACH,GAAG,CAAC,IAAY;QACd,MAAM,GAAG,GAAG,iBAAiB,CAAC,IAAI,CAAC,CAAC;QACpC,IAAI,CAAC,GAAG;YAAE,OAAO,KAAK,CAAC;QACvB,OAAO,IAAI,CAAC,OAAO,CAAC,GAAG,CAAC,GAAG,CAAC,CAAC;IAC/B,CAAC;IAED;;OAEG;IACH,KAAK;QACH,IAAI,CAAC,OAAO,CAAC,KAAK,EAAE,CAAC;IACvB,CAAC;IAED;;OAEG;IACH,IAAI,IAAI;QACN,OAAO,IAAI,CAAC,OAAO,CAAC,IAAI,CAAC;IAC3B,CAAC;CACF;AAED,mEAAmE;AACnE,MAAM,CAAC,MAAM,kBAAkB,GAAG,IAAI,YAAY,EAAE,CAAC"}
|