superskill 0.2.5 → 0.2.7

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.
@@ -0,0 +1,47 @@
1
+ export interface CatalogResult {
2
+ total: number;
3
+ repos: {
4
+ repo: string;
5
+ count: number;
6
+ }[];
7
+ domains: {
8
+ id: string;
9
+ name: string;
10
+ skill_count: number;
11
+ }[];
12
+ skills: import("./catalog.js").CatalogSkill[];
13
+ }
14
+ export interface CollisionResult {
15
+ collisions: Array<{
16
+ domain_id: string;
17
+ domain_name: string;
18
+ skills: Array<{
19
+ id: string;
20
+ name: string;
21
+ repo: string;
22
+ description: string;
23
+ }>;
24
+ }>;
25
+ total_collision_domains: number;
26
+ total_affected_skills: number;
27
+ }
28
+ export interface ResolveResult {
29
+ success: boolean;
30
+ profile_name: string;
31
+ resolutions: Array<{
32
+ domain: string;
33
+ chosen: string;
34
+ alternatives: string[];
35
+ }>;
36
+ active_skills: string[];
37
+ error?: string;
38
+ }
39
+ export declare function catalogCommand(options: {
40
+ domain?: string;
41
+ repo?: string;
42
+ search?: string;
43
+ }): Promise<CatalogResult>;
44
+ export declare function collisionsCommand(): Promise<CollisionResult>;
45
+ export declare function resolveCommand(options: {
46
+ profile?: string;
47
+ }): Promise<ResolveResult>;
@@ -0,0 +1,101 @@
1
+ // SPDX-License-Identifier: AGPL-3.0-or-later OR Commercial
2
+ import { CATALOG, DOMAINS, detectCollisions, searchCatalog, getProfile, BUILT_IN_PROFILES, } from "./catalog.js";
3
+ // ── Commands ─────────────────────────────────────────
4
+ export async function catalogCommand(options) {
5
+ const filtered = searchCatalog({
6
+ domain: options.domain,
7
+ repo: options.repo,
8
+ text: options.search,
9
+ });
10
+ const repoCount = new Map();
11
+ const domainSkills = new Map();
12
+ for (const skill of filtered) {
13
+ repoCount.set(skill.repo, (repoCount.get(skill.repo) ?? 0) + 1);
14
+ for (const d of skill.domains) {
15
+ const set = domainSkills.get(d) ?? new Set();
16
+ set.add(skill.id);
17
+ domainSkills.set(d, set);
18
+ }
19
+ }
20
+ return {
21
+ total: filtered.length,
22
+ repos: Array.from(repoCount.entries())
23
+ .map(([repo, count]) => ({ repo, count }))
24
+ .sort((a, b) => b.count - a.count),
25
+ domains: Array.from(domainSkills.entries())
26
+ .map(([id, skills]) => ({
27
+ id,
28
+ name: DOMAINS.find((d) => d.id === id)?.name ?? id,
29
+ skill_count: skills.size,
30
+ }))
31
+ .sort((a, b) => b.skill_count - a.skill_count),
32
+ skills: filtered,
33
+ };
34
+ }
35
+ export async function collisionsCommand() {
36
+ const collisions = detectCollisions();
37
+ const affected = new Set();
38
+ const mapped = collisions.map((c) => {
39
+ const skills = c.skills.map((s) => {
40
+ affected.add(s.id);
41
+ return { id: s.id, name: s.name, repo: s.repo, description: s.description };
42
+ });
43
+ return {
44
+ domain_id: c.domain.id,
45
+ domain_name: c.domain.name,
46
+ skills,
47
+ };
48
+ });
49
+ return {
50
+ collisions: mapped,
51
+ total_collision_domains: mapped.length,
52
+ total_affected_skills: affected.size,
53
+ };
54
+ }
55
+ export async function resolveCommand(options) {
56
+ const profileName = options.profile ?? "ecc-first";
57
+ const profile = getProfile(profileName);
58
+ if (!profile) {
59
+ const available = BUILT_IN_PROFILES.map((p) => p.name).join(", ");
60
+ return {
61
+ success: false,
62
+ profile_name: profileName,
63
+ resolutions: [],
64
+ active_skills: [],
65
+ error: `Unknown profile: "${profileName}". Available: ${available}`,
66
+ };
67
+ }
68
+ const collisions = detectCollisions();
69
+ const collisionDomainIds = new Set(collisions.map((c) => c.domain.id));
70
+ // Build resolution report
71
+ const resolutions = profile.resolutions.map((r) => {
72
+ const collision = collisions.find((c) => c.domain.id === r.domain_id);
73
+ return {
74
+ domain: r.domain_id,
75
+ chosen: r.chosen_skill_id,
76
+ alternatives: collision
77
+ ? collision.skills.filter((s) => s.id !== r.chosen_skill_id).map((s) => s.id)
78
+ : [],
79
+ };
80
+ });
81
+ // Collect active skill IDs: chosen winners + all non-colliding skills
82
+ const activeSkillIds = new Set();
83
+ // Add collision winners
84
+ for (const r of profile.resolutions) {
85
+ activeSkillIds.add(r.chosen_skill_id);
86
+ }
87
+ // Add non-colliding skills (domains with only one repo)
88
+ for (const skill of CATALOG) {
89
+ const allDomainsNonColliding = skill.domains.every((d) => !collisionDomainIds.has(d));
90
+ if (allDomainsNonColliding) {
91
+ activeSkillIds.add(skill.id);
92
+ }
93
+ }
94
+ return {
95
+ success: true,
96
+ profile_name: profileName,
97
+ resolutions,
98
+ active_skills: [...activeSkillIds].sort(),
99
+ };
100
+ }
101
+ //# sourceMappingURL=resolve.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"resolve.js","sourceRoot":"","sources":["../../../src/commands/skill/resolve.ts"],"names":[],"mappings":"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"}
@@ -1,7 +1,15 @@
1
- /**
2
- * Web Discovery — search GitHub for skills not in the local catalog.
3
- * Called as a fallback when activateSkills() finds zero matches.
4
- */
1
+ export interface DiscoveryCacheEntry {
2
+ results: DiscoveredSkill[];
3
+ timestamp: string;
4
+ ttl_hours: number;
5
+ }
6
+ export interface DiscoveryCache {
7
+ entries: Record<string, DiscoveryCacheEntry>;
8
+ }
9
+ /** Visible for testing — override cache file path. */
10
+ export declare let _cacheFilePath: string;
11
+ export declare function _setCacheFilePath(p: string): void;
12
+ export declare function _resetCacheFilePath(): void;
5
13
  export interface DiscoveredSkill {
6
14
  name: string;
7
15
  description: string;
@@ -16,20 +24,44 @@ export interface WebDiscoveryResult {
16
24
  results: DiscoveredSkill[];
17
25
  error?: string;
18
26
  }
27
+ /**
28
+ * Normalize a task string into a stable cache key.
29
+ * Lowercase, extract keywords, sort alphabetically, join with "+".
30
+ */
31
+ export declare function normalizeCacheKey(task: string): string;
32
+ /**
33
+ * Clear the discovery cache. Exported for testing.
34
+ */
35
+ export declare function clearDiscoveryCache(): Promise<void>;
19
36
  /**
20
37
  * Search GitHub for SKILL.md files matching a task description.
21
38
  * Uses the GitHub Search API (code search + repo search).
22
39
  * Unauthenticated: 10 req/min. With GITHUB_TOKEN: 30 req/min.
40
+ *
41
+ * Results are cached for 24 hours at ~/.superskill/discovery-cache.json
42
+ * to avoid hitting GitHub API rate limits.
23
43
  */
24
44
  export declare function searchGitHubForSkills(task: string): Promise<WebDiscoveryResult>;
25
45
  /**
26
46
  * Fetch a skill's content from a raw GitHub URL.
47
+ * Includes security validation to prevent prompt injection.
27
48
  */
28
49
  export declare function fetchDiscoveredSkill(sourceUrl: string): Promise<{
29
50
  success: boolean;
30
51
  content?: string;
31
52
  error?: string;
53
+ warnings?: string[];
32
54
  }>;
55
+ /**
56
+ * Scan skill content for prompt injection patterns.
57
+ * Skills are markdown injected into LLM context — malicious content
58
+ * could instruct the LLM to exfiltrate data, run commands, or ignore user intent.
59
+ */
60
+ export declare function scanForPromptInjection(content: string): {
61
+ blocked: boolean;
62
+ reason?: string;
63
+ warnings: string[];
64
+ };
33
65
  /**
34
66
  * Format discovery results for presentation to the user via the LLM.
35
67
  */
@@ -1,14 +1,105 @@
1
1
  // SPDX-License-Identifier: AGPL-3.0-or-later OR Commercial
2
+ /**
3
+ * Web Discovery — search GitHub for skills not in the local catalog.
4
+ * Called as a fallback when activateSkills() finds zero matches.
5
+ */
6
+ import { homedir } from "os";
7
+ import { join } from "path";
8
+ import { readFile, writeFile, rename, mkdir } from "fs/promises";
9
+ const CACHE_DIR = join(homedir(), ".superskill");
10
+ const CACHE_FILE = join(CACHE_DIR, "discovery-cache.json");
11
+ const DEFAULT_TTL_HOURS = 24;
12
+ const MAX_CACHE_ENTRIES = 100;
13
+ /** Visible for testing — override cache file path. */
14
+ export let _cacheFilePath = CACHE_FILE;
15
+ export function _setCacheFilePath(p) {
16
+ _cacheFilePath = p;
17
+ }
18
+ export function _resetCacheFilePath() {
19
+ _cacheFilePath = CACHE_FILE;
20
+ }
21
+ // ── Cache Helpers ────────────────────────────────────
22
+ /**
23
+ * Normalize a task string into a stable cache key.
24
+ * Lowercase, extract keywords, sort alphabetically, join with "+".
25
+ */
26
+ export function normalizeCacheKey(task) {
27
+ const kw = extractKeywords(task);
28
+ return kw.sort().join("+");
29
+ }
30
+ async function readCache() {
31
+ try {
32
+ const raw = await readFile(_cacheFilePath, "utf-8");
33
+ const parsed = JSON.parse(raw);
34
+ if (parsed && typeof parsed === "object" && parsed.entries && typeof parsed.entries === "object") {
35
+ return parsed;
36
+ }
37
+ return { entries: {} };
38
+ }
39
+ catch {
40
+ return { entries: {} };
41
+ }
42
+ }
43
+ async function writeCache(cache) {
44
+ try {
45
+ const dir = _cacheFilePath.substring(0, _cacheFilePath.lastIndexOf("/"));
46
+ await mkdir(dir, { recursive: true });
47
+ const tmp = _cacheFilePath + ".tmp." + process.pid;
48
+ await writeFile(tmp, JSON.stringify(cache, null, 2), "utf-8");
49
+ await rename(tmp, _cacheFilePath);
50
+ }
51
+ catch {
52
+ // Never crash on cache write failure
53
+ }
54
+ }
55
+ function isCacheEntryValid(entry) {
56
+ const age = Date.now() - new Date(entry.timestamp).getTime();
57
+ const ttlMs = (entry.ttl_hours || DEFAULT_TTL_HOURS) * 60 * 60 * 1000;
58
+ return age < ttlMs;
59
+ }
60
+ function evictOldest(cache) {
61
+ const keys = Object.keys(cache.entries);
62
+ if (keys.length <= MAX_CACHE_ENTRIES)
63
+ return;
64
+ // Sort by timestamp ascending (oldest first), evict extras
65
+ const sorted = keys.sort((a, b) => {
66
+ const ta = new Date(cache.entries[a].timestamp).getTime();
67
+ const tb = new Date(cache.entries[b].timestamp).getTime();
68
+ return ta - tb;
69
+ });
70
+ const toRemove = sorted.slice(0, keys.length - MAX_CACHE_ENTRIES);
71
+ for (const key of toRemove) {
72
+ delete cache.entries[key];
73
+ }
74
+ }
75
+ /**
76
+ * Clear the discovery cache. Exported for testing.
77
+ */
78
+ export async function clearDiscoveryCache() {
79
+ await writeCache({ entries: {} });
80
+ }
2
81
  /**
3
82
  * Search GitHub for SKILL.md files matching a task description.
4
83
  * Uses the GitHub Search API (code search + repo search).
5
84
  * Unauthenticated: 10 req/min. With GITHUB_TOKEN: 30 req/min.
85
+ *
86
+ * Results are cached for 24 hours at ~/.superskill/discovery-cache.json
87
+ * to avoid hitting GitHub API rate limits.
6
88
  */
7
89
  export async function searchGitHubForSkills(task) {
8
90
  const keywords = extractKeywords(task);
9
91
  if (keywords.length === 0) {
10
92
  return { success: false, results: [], error: "Could not extract search keywords from task" };
11
93
  }
94
+ const cacheKey = normalizeCacheKey(task);
95
+ // Check cache
96
+ if (cacheKey) {
97
+ const cache = await readCache();
98
+ const entry = cache.entries[cacheKey];
99
+ if (entry && isCacheEntryValid(entry)) {
100
+ return { success: true, results: entry.results };
101
+ }
102
+ }
12
103
  const query = buildSearchQuery(keywords);
13
104
  try {
14
105
  // Search for repos with SKILL.md files matching keywords
@@ -31,7 +122,19 @@ export async function searchGitHubForSkills(task) {
31
122
  // Sort by stars descending (trust signal)
32
123
  skills.sort((a, b) => b.stars - a.stars);
33
124
  // Cap at 5 results
34
- return { success: true, results: skills.slice(0, 5) };
125
+ const capped = skills.slice(0, 5);
126
+ // Store in cache
127
+ if (cacheKey) {
128
+ const cache = await readCache();
129
+ cache.entries[cacheKey] = {
130
+ results: capped,
131
+ timestamp: new Date().toISOString(),
132
+ ttl_hours: DEFAULT_TTL_HOURS,
133
+ };
134
+ evictOldest(cache);
135
+ await writeCache(cache);
136
+ }
137
+ return { success: true, results: capped };
35
138
  }
36
139
  catch (err) {
37
140
  return { success: false, results: [], error: `GitHub search failed: ${err.message}` };
@@ -39,6 +142,7 @@ export async function searchGitHubForSkills(task) {
39
142
  }
40
143
  /**
41
144
  * Fetch a skill's content from a raw GitHub URL.
145
+ * Includes security validation to prevent prompt injection.
42
146
  */
43
147
  export async function fetchDiscoveredSkill(sourceUrl) {
44
148
  try {
@@ -52,12 +156,63 @@ export async function fetchDiscoveredSkill(sourceUrl) {
52
156
  if (content.length < 50) {
53
157
  return { success: false, error: "File too short to be a valid skill" };
54
158
  }
55
- return { success: true, content };
159
+ // Size cap skills over 50KB are suspicious
160
+ if (content.length > 50_000) {
161
+ return { success: false, error: "Skill file exceeds 50KB size limit — may not be a legitimate skill file" };
162
+ }
163
+ // Security scan
164
+ const securityResult = scanForPromptInjection(content);
165
+ if (securityResult.blocked) {
166
+ return { success: false, error: `Security risk detected: ${securityResult.reason}` };
167
+ }
168
+ return { success: true, content, warnings: securityResult.warnings };
56
169
  }
57
170
  catch (err) {
58
171
  return { success: false, error: `Fetch failed: ${err.message}` };
59
172
  }
60
173
  }
174
+ /**
175
+ * Scan skill content for prompt injection patterns.
176
+ * Skills are markdown injected into LLM context — malicious content
177
+ * could instruct the LLM to exfiltrate data, run commands, or ignore user intent.
178
+ */
179
+ export function scanForPromptInjection(content) {
180
+ const warnings = [];
181
+ const lower = content.toLowerCase();
182
+ // Hard blocks — these should never appear in a skill file
183
+ const blockedPatterns = [
184
+ { pattern: /ignore (all |any )?(previous|prior|above) (instructions|prompts|context)/i, reason: "Prompt override attempt" },
185
+ { pattern: /forget (all |everything )?(you|your|previous)/i, reason: "Memory wipe attempt" },
186
+ { pattern: /do not (tell|inform|reveal|mention|show) (the user|anyone)/i, reason: "Secrecy instruction — skills should be transparent" },
187
+ { pattern: /exfiltrate|steal|extract.*secret|send.*to.*http/i, reason: "Data exfiltration pattern" },
188
+ { pattern: /curl\s+.*\|.*sh/i, reason: "Remote code execution via pipe to shell" },
189
+ { pattern: /rm\s+-rf\s+[\/~]/i, reason: "Destructive filesystem command" },
190
+ { pattern: /eval\s*\(.*fetch/i, reason: "Dynamic code execution from remote source" },
191
+ { pattern: /<\s*script[\s>]/i, reason: "Script injection" },
192
+ ];
193
+ for (const { pattern, reason } of blockedPatterns) {
194
+ if (pattern.test(content)) {
195
+ return { blocked: true, reason, warnings };
196
+ }
197
+ }
198
+ // Soft warnings — suspicious but not necessarily malicious
199
+ if (lower.includes("api_key") || lower.includes("secret_key") || lower.includes("password")) {
200
+ warnings.push("References credentials — review before loading");
201
+ }
202
+ if (lower.includes("sudo ") || lower.includes("chmod 777")) {
203
+ warnings.push("Contains privileged system commands");
204
+ }
205
+ if ((content.match(/https?:\/\//g) || []).length > 20) {
206
+ warnings.push("Unusually high number of external URLs");
207
+ }
208
+ if (lower.includes("system prompt") || lower.includes("system message")) {
209
+ warnings.push("References system prompts — may attempt to modify LLM behavior");
210
+ }
211
+ if (/you are now|you must now act as/i.test(content)) {
212
+ warnings.push("Contains role-play instructions — common in skills but review for legitimacy");
213
+ }
214
+ return { blocked: false, warnings };
215
+ }
61
216
  /**
62
217
  * Format discovery results for presentation to the user via the LLM.
63
218
  */
@@ -104,8 +259,8 @@ function extractKeywords(task) {
104
259
  .filter((w) => w.length > 2 && !stopwords.has(w));
105
260
  }
106
261
  function buildSearchQuery(keywords) {
107
- // Combine keywords with SKILL.md to find skill files
108
- return `${keywords.join(" ")} SKILL.md language:markdown`;
262
+ // Search for SKILL.md files matching keywords
263
+ return `${keywords.join(" ")} filename:SKILL`;
109
264
  }
110
265
  async function searchGitHubCode(query) {
111
266
  const headers = {
@@ -143,7 +298,7 @@ async function searchGitHubRepos(keywords) {
143
298
  const token = process.env.GITHUB_TOKEN;
144
299
  if (token)
145
300
  headers.Authorization = `Bearer ${token}`;
146
- const query = `${keywords.join(" ")} skill claude-code topic:mcp-skill OR topic:claude-code-skill OR topic:ai-skill`;
301
+ const query = `${keywords.join(" ")} skill claude in:name,description,readme`;
147
302
  const url = `https://api.github.com/search/repositories?q=${encodeURIComponent(query)}&sort=stars&per_page=5`;
148
303
  const res = await fetch(url, { headers });
149
304
  if (!res.ok) {
@@ -1 +1 @@
1
- {"version":3,"file":"web-discovery.js","sourceRoot":"","sources":["../../../src/commands/skill/web-discovery.ts"],"names":[],"mappings":"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"}
1
+ {"version":3,"file":"web-discovery.js","sourceRoot":"","sources":["../../../src/commands/skill/web-discovery.ts"],"names":[],"mappings":"AAAA,2DAA2D;AAE3D;;;GAGG;AAEH,OAAO,EAAE,OAAO,EAAE,MAAM,IAAI,CAAC;AAC7B,OAAO,EAAE,IAAI,EAAE,MAAM,MAAM,CAAC;AAC5B,OAAO,EAAE,QAAQ,EAAE,SAAS,EAAE,MAAM,EAAE,KAAK,EAAE,MAAM,aAAa,CAAC;AAcjE,MAAM,SAAS,GAAG,IAAI,CAAC,OAAO,EAAE,EAAE,aAAa,CAAC,CAAC;AACjD,MAAM,UAAU,GAAG,IAAI,CAAC,SAAS,EAAE,sBAAsB,CAAC,CAAC;AAC3D,MAAM,iBAAiB,GAAG,EAAE,CAAC;AAC7B,MAAM,iBAAiB,GAAG,GAAG,CAAC;AAE9B,sDAAsD;AACtD,MAAM,CAAC,IAAI,cAAc,GAAG,UAAU,CAAC;AACvC,MAAM,UAAU,iBAAiB,CAAC,CAAS;IACzC,cAAc,GAAG,CAAC,CAAC;AACrB,CAAC;AACD,MAAM,UAAU,mBAAmB;IACjC,cAAc,GAAG,UAAU,CAAC;AAC9B,CAAC;AAkBD,wDAAwD;AAExD;;;GAGG;AACH,MAAM,UAAU,iBAAiB,CAAC,IAAY;IAC5C,MAAM,EAAE,GAAG,eAAe,CAAC,IAAI,CAAC,CAAC;IACjC,OAAO,EAAE,CAAC,IAAI,EAAE,CAAC,IAAI,CAAC,GAAG,CAAC,CAAC;AAC7B,CAAC;AAED,KAAK,UAAU,SAAS;IACtB,IAAI,CAAC;QACH,MAAM,GAAG,GAAG,MAAM,QAAQ,CAAC,cAAc,EAAE,OAAO,CAAC,CAAC;QACpD,MAAM,MAAM,GAAG,IAAI,CAAC,KAAK,CAAC,GAAG,CAAC,CAAC;QAC/B,IAAI,MAAM,IAAI,OAAO,MAAM,KAAK,QAAQ,IAAI,MAAM,CAAC,OAAO,IAAI,OAAO,MAAM,CAAC,OAAO,KAAK,QAAQ,EAAE,CAAC;YACjG,OAAO,MAAwB,CAAC;QAClC,CAAC;QACD,OAAO,EAAE,OAAO,EAAE,EAAE,EAAE,CAAC;IACzB,CAAC;IAAC,MAAM,CAAC;QACP,OAAO,EAAE,OAAO,EAAE,EAAE,EAAE,CAAC;IACzB,CAAC;AACH,CAAC;AAED,KAAK,UAAU,UAAU,CAAC,KAAqB;IAC7C,IAAI,CAAC;QACH,MAAM,GAAG,GAAG,cAAc,CAAC,SAAS,CAAC,CAAC,EAAE,cAAc,CAAC,WAAW,CAAC,GAAG,CAAC,CAAC,CAAC;QACzE,MAAM,KAAK,CAAC,GAAG,EAAE,EAAE,SAAS,EAAE,IAAI,EAAE,CAAC,CAAC;QACtC,MAAM,GAAG,GAAG,cAAc,GAAG,OAAO,GAAG,OAAO,CAAC,GAAG,CAAC;QACnD,MAAM,SAAS,CAAC,GAAG,EAAE,IAAI,CAAC,SAAS,CAAC,KAAK,EAAE,IAAI,EAAE,CAAC,CAAC,EAAE,OAAO,CAAC,CAAC;QAC9D,MAAM,MAAM,CAAC,GAAG,EAAE,cAAc,CAAC,CAAC;IACpC,CAAC;IAAC,MAAM,CAAC;QACP,qCAAqC;IACvC,CAAC;AACH,CAAC;AAED,SAAS,iBAAiB,CAAC,KAA0B;IACnD,MAAM,GAAG,GAAG,IAAI,CAAC,GAAG,EAAE,GAAG,IAAI,IAAI,CAAC,KAAK,CAAC,SAAS,CAAC,CAAC,OAAO,EAAE,CAAC;IAC7D,MAAM,KAAK,GAAG,CAAC,KAAK,CAAC,SAAS,IAAI,iBAAiB,CAAC,GAAG,EAAE,GAAG,EAAE,GAAG,IAAI,CAAC;IACtE,OAAO,GAAG,GAAG,KAAK,CAAC;AACrB,CAAC;AAED,SAAS,WAAW,CAAC,KAAqB;IACxC,MAAM,IAAI,GAAG,MAAM,CAAC,IAAI,CAAC,KAAK,CAAC,OAAO,CAAC,CAAC;IACxC,IAAI,IAAI,CAAC,MAAM,IAAI,iBAAiB;QAAE,OAAO;IAE7C,2DAA2D;IAC3D,MAAM,MAAM,GAAG,IAAI,CAAC,IAAI,CAAC,CAAC,CAAC,EAAE,CAAC,EAAE,EAAE;QAChC,MAAM,EAAE,GAAG,IAAI,IAAI,CAAC,KAAK,CAAC,OAAO,CAAC,CAAC,CAAC,CAAC,SAAS,CAAC,CAAC,OAAO,EAAE,CAAC;QAC1D,MAAM,EAAE,GAAG,IAAI,IAAI,CAAC,KAAK,CAAC,OAAO,CAAC,CAAC,CAAC,CAAC,SAAS,CAAC,CAAC,OAAO,EAAE,CAAC;QAC1D,OAAO,EAAE,GAAG,EAAE,CAAC;IACjB,CAAC,CAAC,CAAC;IAEH,MAAM,QAAQ,GAAG,MAAM,CAAC,KAAK,CAAC,CAAC,EAAE,IAAI,CAAC,MAAM,GAAG,iBAAiB,CAAC,CAAC;IAClE,KAAK,MAAM,GAAG,IAAI,QAAQ,EAAE,CAAC;QAC3B,OAAO,KAAK,CAAC,OAAO,CAAC,GAAG,CAAC,CAAC;IAC5B,CAAC;AACH,CAAC;AAED;;GAEG;AACH,MAAM,CAAC,KAAK,UAAU,mBAAmB;IACvC,MAAM,UAAU,CAAC,EAAE,OAAO,EAAE,EAAE,EAAE,CAAC,CAAC;AACpC,CAAC;AAED;;;;;;;GAOG;AACH,MAAM,CAAC,KAAK,UAAU,qBAAqB,CAAC,IAAY;IACtD,MAAM,QAAQ,GAAG,eAAe,CAAC,IAAI,CAAC,CAAC;IACvC,IAAI,QAAQ,CAAC,MAAM,KAAK,CAAC,EAAE,CAAC;QAC1B,OAAO,EAAE,OAAO,EAAE,KAAK,EAAE,OAAO,EAAE,EAAE,EAAE,KAAK,EAAE,6CAA6C,EAAE,CAAC;IAC/F,CAAC;IAED,MAAM,QAAQ,GAAG,iBAAiB,CAAC,IAAI,CAAC,CAAC;IAEzC,cAAc;IACd,IAAI,QAAQ,EAAE,CAAC;QACb,MAAM,KAAK,GAAG,MAAM,SAAS,EAAE,CAAC;QAChC,MAAM,KAAK,GAAG,KAAK,CAAC,OAAO,CAAC,QAAQ,CAAC,CAAC;QACtC,IAAI,KAAK,IAAI,iBAAiB,CAAC,KAAK,CAAC,EAAE,CAAC;YACtC,OAAO,EAAE,OAAO,EAAE,IAAI,EAAE,OAAO,EAAE,KAAK,CAAC,OAAO,EAAE,CAAC;QACnD,CAAC;IACH,CAAC;IAED,MAAM,KAAK,GAAG,gBAAgB,CAAC,QAAQ,CAAC,CAAC;IAEzC,IAAI,CAAC;QACH,yDAAyD;QACzD,MAAM,OAAO,GAAG,MAAM,OAAO,CAAC,UAAU,CAAC;YACvC,gBAAgB,CAAC,KAAK,CAAC;YACvB,iBAAiB,CAAC,QAAQ,CAAC;SAC5B,CAAC,CAAC;QAEH,MAAM,MAAM,GAAsB,EAAE,CAAC;QACrC,MAAM,SAAS,GAAG,IAAI,GAAG,EAAU,CAAC;QAEpC,KAAK,MAAM,MAAM,IAAI,OAAO,EAAE,CAAC;YAC7B,IAAI,MAAM,CAAC,MAAM,KAAK,WAAW,EAAE,CAAC;gBAClC,KAAK,MAAM,KAAK,IAAI,MAAM,CAAC,KAAK,EAAE,CAAC;oBACjC,IAAI,CAAC,SAAS,CAAC,GAAG,CAAC,KAAK,CAAC,IAAI,CAAC,EAAE,CAAC;wBAC/B,MAAM,CAAC,IAAI,CAAC,KAAK,CAAC,CAAC;wBACnB,SAAS,CAAC,GAAG,CAAC,KAAK,CAAC,IAAI,CAAC,CAAC;oBAC5B,CAAC;gBACH,CAAC;YACH,CAAC;QACH,CAAC;QAED,0CAA0C;QAC1C,MAAM,CAAC,IAAI,CAAC,CAAC,CAAC,EAAE,CAAC,EAAE,EAAE,CAAC,CAAC,CAAC,KAAK,GAAG,CAAC,CAAC,KAAK,CAAC,CAAC;QAEzC,mBAAmB;QACnB,MAAM,MAAM,GAAG,MAAM,CAAC,KAAK,CAAC,CAAC,EAAE,CAAC,CAAC,CAAC;QAElC,iBAAiB;QACjB,IAAI,QAAQ,EAAE,CAAC;YACb,MAAM,KAAK,GAAG,MAAM,SAAS,EAAE,CAAC;YAChC,KAAK,CAAC,OAAO,CAAC,QAAQ,CAAC,GAAG;gBACxB,OAAO,EAAE,MAAM;gBACf,SAAS,EAAE,IAAI,IAAI,EAAE,CAAC,WAAW,EAAE;gBACnC,SAAS,EAAE,iBAAiB;aAC7B,CAAC;YACF,WAAW,CAAC,KAAK,CAAC,CAAC;YACnB,MAAM,UAAU,CAAC,KAAK,CAAC,CAAC;QAC1B,CAAC;QAED,OAAO,EAAE,OAAO,EAAE,IAAI,EAAE,OAAO,EAAE,MAAM,EAAE,CAAC;IAC5C,CAAC;IAAC,OAAO,GAAG,EAAE,CAAC;QACb,OAAO,EAAE,OAAO,EAAE,KAAK,EAAE,OAAO,EAAE,EAAE,EAAE,KAAK,EAAE,yBAA0B,GAAa,CAAC,OAAO,EAAE,EAAE,CAAC;IACnG,CAAC;AACH,CAAC;AAED;;;GAGG;AACH,MAAM,CAAC,KAAK,UAAU,oBAAoB,CAAC,SAAiB;IAC1D,IAAI,CAAC;QACH,MAAM,MAAM,GAAG,QAAQ,CAAC,SAAS,CAAC,CAAC;QACnC,MAAM,GAAG,GAAG,MAAM,KAAK,CAAC,MAAM,CAAC,CAAC;QAChC,IAAI,CAAC,GAAG,CAAC,EAAE,EAAE,CAAC;YACZ,OAAO,EAAE,OAAO,EAAE,KAAK,EAAE,KAAK,EAAE,QAAQ,GAAG,CAAC,MAAM,IAAI,GAAG,CAAC,UAAU,EAAE,EAAE,CAAC;QAC3E,CAAC;QACD,MAAM,OAAO,GAAG,MAAM,GAAG,CAAC,IAAI,EAAE,CAAC;QACjC,iDAAiD;QACjD,IAAI,OAAO,CAAC,MAAM,GAAG,EAAE,EAAE,CAAC;YACxB,OAAO,EAAE,OAAO,EAAE,KAAK,EAAE,KAAK,EAAE,oCAAoC,EAAE,CAAC;QACzE,CAAC;QACD,6CAA6C;QAC7C,IAAI,OAAO,CAAC,MAAM,GAAG,MAAM,EAAE,CAAC;YAC5B,OAAO,EAAE,OAAO,EAAE,KAAK,EAAE,KAAK,EAAE,yEAAyE,EAAE,CAAC;QAC9G,CAAC;QACD,gBAAgB;QAChB,MAAM,cAAc,GAAG,sBAAsB,CAAC,OAAO,CAAC,CAAC;QACvD,IAAI,cAAc,CAAC,OAAO,EAAE,CAAC;YAC3B,OAAO,EAAE,OAAO,EAAE,KAAK,EAAE,KAAK,EAAE,2BAA2B,cAAc,CAAC,MAAM,EAAE,EAAE,CAAC;QACvF,CAAC;QACD,OAAO,EAAE,OAAO,EAAE,IAAI,EAAE,OAAO,EAAE,QAAQ,EAAE,cAAc,CAAC,QAAQ,EAAE,CAAC;IACvE,CAAC;IAAC,OAAO,GAAG,EAAE,CAAC;QACb,OAAO,EAAE,OAAO,EAAE,KAAK,EAAE,KAAK,EAAE,iBAAkB,GAAa,CAAC,OAAO,EAAE,EAAE,CAAC;IAC9E,CAAC;AACH,CAAC;AAED;;;;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;AAED;;GAEG;AACH,MAAM,UAAU,sBAAsB,CAAC,IAAY,EAAE,OAA0B;IAC7E,IAAI,OAAO,CAAC,MAAM,KAAK,CAAC,EAAE,CAAC;QACzB,OAAO,qDAAqD,IAAI,oCAAoC,CAAC;IACvG,CAAC;IAED,MAAM,KAAK,GAAG;QACZ,0CAA0C,IAAI,YAAY,OAAO,CAAC,MAAM,mBAAmB,OAAO,CAAC,MAAM,GAAG,CAAC,CAAC,CAAC,CAAC,GAAG,CAAC,CAAC,CAAC,EAAE,aAAa;QACrI,EAAE;KACH,CAAC;IAEF,KAAK,IAAI,CAAC,GAAG,CAAC,EAAE,CAAC,GAAG,OAAO,CAAC,MAAM,EAAE,CAAC,EAAE,EAAE,CAAC;QACxC,MAAM,CAAC,GAAG,OAAO,CAAC,CAAC,CAAC,CAAC;QACrB,MAAM,GAAG,GAAG,cAAc,CAAC,CAAC,CAAC,UAAU,CAAC,CAAC;QACzC,KAAK,CAAC,IAAI,CAAC,GAAG,CAAC,GAAG,CAAC,OAAO,CAAC,CAAC,IAAI,QAAQ,CAAC,CAAC,WAAW,EAAE,CAAC,CAAC;QACzD,KAAK,CAAC,IAAI,CAAC,gBAAgB,CAAC,CAAC,IAAI,QAAQ,CAAC,CAAC,KAAK,oBAAoB,GAAG,EAAE,CAAC,CAAC;QAC3E,KAAK,CAAC,IAAI,CAAC,kCAAkC,CAAC,CAAC;QAC/C,KAAK,CAAC,IAAI,CAAC,EAAE,CAAC,CAAC;IACjB,CAAC;IAED,KAAK,CAAC,IAAI,CAAC,sEAAsE,CAAC,CAAC;IACnF,KAAK,CAAC,IAAI,CAAC,kEAAkE,CAAC,CAAC;IAE/E,OAAO,KAAK,CAAC,IAAI,CAAC,IAAI,CAAC,CAAC;AAC1B,CAAC;AAED,yDAAyD;AAEzD,SAAS,eAAe,CAAC,IAAY;IACnC,MAAM,SAAS,GAAG,IAAI,GAAG,CAAC;QACxB,GAAG,EAAE,IAAI,EAAE,KAAK,EAAE,IAAI,EAAE,KAAK,EAAE,KAAK,EAAE,MAAM,EAAE,IAAI,EAAE,MAAM,EAAE,OAAO;QACnE,MAAM,EAAE,KAAK,EAAE,KAAK,EAAE,IAAI,EAAE,MAAM,EAAE,KAAK,EAAE,MAAM,EAAE,OAAO,EAAE,OAAO;QACnE,QAAQ,EAAE,KAAK,EAAE,OAAO,EAAE,OAAO,EAAE,KAAK,EAAE,MAAM,EAAE,MAAM,EAAE,OAAO;QACjE,MAAM,EAAE,IAAI,EAAE,IAAI,EAAE,IAAI,EAAE,KAAK,EAAE,IAAI,EAAE,MAAM,EAAE,IAAI,EAAE,IAAI,EAAE,MAAM;QACjE,IAAI,EAAE,MAAM,EAAE,SAAS,EAAE,QAAQ,EAAE,QAAQ,EAAE,OAAO,EAAE,OAAO,EAAE,OAAO;QACtE,SAAS,EAAE,KAAK,EAAE,KAAK,EAAE,MAAM,EAAE,OAAO,EAAE,OAAO,EAAE,SAAS,EAAE,MAAM;QACpE,MAAM,EAAE,MAAM,EAAE,OAAO,EAAE,MAAM,EAAE,OAAO,EAAE,KAAK,EAAE,KAAK,EAAE,KAAK,EAAE,MAAM;QACrE,MAAM,EAAE,KAAK,EAAE,MAAM,EAAE,MAAM,EAAE,OAAO,EAAE,MAAM,EAAE,MAAM,EAAE,IAAI,EAAE,KAAK;QACnE,MAAM,EAAE,KAAK,EAAE,MAAM,EAAE,IAAI,EAAE,MAAM,EAAE,KAAK,EAAE,MAAM,EAAE,MAAM,EAAE,SAAS;QACrE,KAAK,EAAE,KAAK,EAAE,IAAI,EAAE,IAAI,EAAE,OAAO,EAAE,OAAO,EAAE,IAAI,EAAE,MAAM,EAAE,MAAM;QAChE,IAAI,EAAE,KAAK,EAAE,IAAI,EAAE,IAAI,EAAE,GAAG,EAAE,IAAI,EAAE,KAAK,EAAE,KAAK,EAAE,MAAM,EAAE,MAAM;QAChE,KAAK,EAAE,MAAM,EAAE,MAAM,EAAE,KAAK,EAAE,MAAM,EAAE,KAAK,EAAE,KAAK,EAAE,MAAM,EAAE,MAAM;KACnE,CAAC,CAAC;IAEH,OAAO,IAAI;SACR,WAAW,EAAE;SACb,OAAO,CAAC,eAAe,EAAE,EAAE,CAAC;SAC5B,KAAK,CAAC,KAAK,CAAC;SACZ,MAAM,CAAC,CAAC,CAAC,EAAE,EAAE,CAAC,CAAC,CAAC,MAAM,GAAG,CAAC,IAAI,CAAC,SAAS,CAAC,GAAG,CAAC,CAAC,CAAC,CAAC,CAAC;AACtD,CAAC;AAED,SAAS,gBAAgB,CAAC,QAAkB;IAC1C,8CAA8C;IAC9C,OAAO,GAAG,QAAQ,CAAC,IAAI,CAAC,GAAG,CAAC,iBAAiB,CAAC;AAChD,CAAC;AAED,KAAK,UAAU,gBAAgB,CAAC,KAAa;IAC3C,MAAM,OAAO,GAA2B;QACtC,MAAM,EAAE,gCAAgC;QACxC,YAAY,EAAE,YAAY;KAC3B,CAAC;IACF,MAAM,KAAK,GAAG,OAAO,CAAC,GAAG,CAAC,YAAY,CAAC;IACvC,IAAI,KAAK;QAAE,OAAO,CAAC,aAAa,GAAG,UAAU,KAAK,EAAE,CAAC;IAErD,MAAM,GAAG,GAAG,wCAAwC,kBAAkB,CAAC,KAAK,CAAC,cAAc,CAAC;IAC5F,MAAM,GAAG,GAAG,MAAM,KAAK,CAAC,GAAG,EAAE,EAAE,OAAO,EAAE,CAAC,CAAC;IAE1C,IAAI,CAAC,GAAG,CAAC,EAAE,EAAE,CAAC;QACZ,IAAI,GAAG,CAAC,MAAM,KAAK,GAAG;YAAE,OAAO,EAAE,CAAC,CAAC,gCAAgC;QACnE,MAAM,IAAI,KAAK,CAAC,uBAAuB,GAAG,CAAC,MAAM,IAAI,GAAG,CAAC,UAAU,EAAE,CAAC,CAAC;IACzE,CAAC;IAED,MAAM,IAAI,GAAG,MAAM,GAAG,CAAC,IAAI,EAY1B,CAAC;IAEF,OAAO,CAAC,IAAI,CAAC,KAAK,IAAI,EAAE,CAAC;SACtB,MAAM,CAAC,CAAC,IAAI,EAAE,EAAE,CAAC,IAAI,CAAC,IAAI,CAAC,WAAW,EAAE,CAAC,QAAQ,CAAC,OAAO,CAAC,CAAC;SAC3D,GAAG,CAAC,CAAC,IAAI,EAAE,EAAE,CAAC,CAAC;QACd,IAAI,EAAE,cAAc,CAAC,IAAI,CAAC,IAAI,EAAE,IAAI,CAAC,UAAU,CAAC,SAAS,CAAC;QAC1D,WAAW,EAAE,IAAI,CAAC,UAAU,CAAC,WAAW,IAAI,gBAAgB;QAC5D,UAAU,EAAE,IAAI,CAAC,QAAQ;QACzB,IAAI,EAAE,IAAI,CAAC,UAAU,CAAC,SAAS;QAC/B,KAAK,EAAE,IAAI,CAAC,UAAU,CAAC,gBAAgB;QACvC,UAAU,EAAE,IAAI,CAAC,UAAU,CAAC,UAAU;QACtC,IAAI,EAAE,IAAI,CAAC,IAAI;KAChB,CAAC,CAAC,CAAC;AACR,CAAC;AAED,KAAK,UAAU,iBAAiB,CAAC,QAAkB;IACjD,MAAM,OAAO,GAA2B;QACtC,MAAM,EAAE,gCAAgC;QACxC,YAAY,EAAE,YAAY;KAC3B,CAAC;IACF,MAAM,KAAK,GAAG,OAAO,CAAC,GAAG,CAAC,YAAY,CAAC;IACvC,IAAI,KAAK;QAAE,OAAO,CAAC,aAAa,GAAG,UAAU,KAAK,EAAE,CAAC;IAErD,MAAM,KAAK,GAAG,GAAG,QAAQ,CAAC,IAAI,CAAC,GAAG,CAAC,0CAA0C,CAAC;IAC9E,MAAM,GAAG,GAAG,gDAAgD,kBAAkB,CAAC,KAAK,CAAC,wBAAwB,CAAC;IAC9G,MAAM,GAAG,GAAG,MAAM,KAAK,CAAC,GAAG,EAAE,EAAE,OAAO,EAAE,CAAC,CAAC;IAE1C,IAAI,CAAC,GAAG,CAAC,EAAE,EAAE,CAAC;QACZ,IAAI,GAAG,CAAC,MAAM,KAAK,GAAG;YAAE,OAAO,EAAE,CAAC;QAClC,MAAM,IAAI,KAAK,CAAC,uBAAuB,GAAG,CAAC,MAAM,IAAI,GAAG,CAAC,UAAU,EAAE,CAAC,CAAC;IACzE,CAAC;IAED,MAAM,IAAI,GAAG,MAAM,GAAG,CAAC,IAAI,EAQ1B,CAAC;IAEF,OAAO,CAAC,IAAI,CAAC,KAAK,IAAI,EAAE,CAAC,CAAC,GAAG,CAAC,CAAC,IAAI,EAAE,EAAE,CAAC,CAAC;QACvC,IAAI,EAAE,IAAI,CAAC,SAAS,CAAC,KAAK,CAAC,GAAG,CAAC,CAAC,CAAC,CAAC,IAAI,IAAI,CAAC,SAAS;QACpD,WAAW,EAAE,IAAI,CAAC,WAAW,IAAI,gBAAgB;QACjD,UAAU,EAAE,GAAG,IAAI,CAAC,QAAQ,qBAAqB;QACjD,IAAI,EAAE,IAAI,CAAC,SAAS;QACpB,KAAK,EAAE,IAAI,CAAC,gBAAgB;QAC5B,UAAU,EAAE,IAAI,CAAC,UAAU;QAC3B,IAAI,EAAE,UAAU;KACjB,CAAC,CAAC,CAAC;AACN,CAAC;AAED,SAAS,cAAc,CAAC,IAAY,EAAE,IAAY;IAChD,wEAAwE;IACxE,MAAM,KAAK,GAAG,IAAI,CAAC,KAAK,CAAC,GAAG,CAAC,CAAC;IAC9B,IAAI,KAAK,CAAC,MAAM,IAAI,CAAC,EAAE,CAAC;QACtB,MAAM,GAAG,GAAG,KAAK,CAAC,KAAK,CAAC,MAAM,GAAG,CAAC,CAAC,CAAC;QACpC,IAAI,GAAG,KAAK,QAAQ,IAAI,GAAG,KAAK,SAAS,EAAE,CAAC;YAC1C,OAAO,GAAG,CAAC,OAAO,CAAC,IAAI,EAAE,GAAG,CAAC,CAAC,OAAO,CAAC,OAAO,EAAE,CAAC,CAAC,EAAE,EAAE,CAAC,CAAC,CAAC,WAAW,EAAE,CAAC,CAAC;QACzE,CAAC;IACH,CAAC;IACD,OAAO,IAAI,CAAC,KAAK,CAAC,GAAG,CAAC,CAAC,CAAC,CAAC,EAAE,OAAO,CAAC,IAAI,EAAE,GAAG,CAAC,CAAC,OAAO,CAAC,OAAO,EAAE,CAAC,CAAC,EAAE,EAAE,CAAC,CAAC,CAAC,WAAW,EAAE,CAAC,IAAI,IAAI,CAAC;AACjG,CAAC;AAED,SAAS,QAAQ,CAAC,OAAe;IAC/B,2DAA2D;IAC3D,OAAO,OAAO;SACX,OAAO,CAAC,YAAY,EAAE,2BAA2B,CAAC;SAClD,OAAO,CAAC,QAAQ,EAAE,GAAG,CAAC,CAAC;AAC5B,CAAC;AAED,SAAS,cAAc,CAAC,OAAe;IACrC,MAAM,GAAG,GAAG,IAAI,CAAC,GAAG,EAAE,CAAC;IACvB,MAAM,IAAI,GAAG,IAAI,IAAI,CAAC,OAAO,CAAC,CAAC,OAAO,EAAE,CAAC;IACzC,MAAM,IAAI,GAAG,IAAI,CAAC,KAAK,CAAC,CAAC,GAAG,GAAG,IAAI,CAAC,GAAG,CAAC,IAAI,GAAG,EAAE,GAAG,EAAE,GAAG,EAAE,CAAC,CAAC,CAAC;IAC9D,IAAI,IAAI,GAAG,CAAC;QAAE,OAAO,OAAO,CAAC;IAC7B,IAAI,IAAI,KAAK,CAAC;QAAE,OAAO,WAAW,CAAC;IACnC,IAAI,IAAI,GAAG,EAAE;QAAE,OAAO,GAAG,IAAI,WAAW,CAAC;IACzC,IAAI,IAAI,GAAG,GAAG;QAAE,OAAO,GAAG,IAAI,CAAC,KAAK,CAAC,IAAI,GAAG,EAAE,CAAC,aAAa,CAAC;IAC7D,OAAO,GAAG,IAAI,CAAC,KAAK,CAAC,IAAI,GAAG,GAAG,CAAC,YAAY,CAAC;AAC/C,CAAC"}
@@ -0,0 +1,55 @@
1
+ export type MatchMethod = "trigger" | "skill_id" | "domain" | "web_discovery";
2
+ export interface Activation {
3
+ skill_id: string;
4
+ match_method: MatchMethod;
5
+ timestamp: string;
6
+ task_query: string;
7
+ matched: boolean;
8
+ }
9
+ export interface FailedSearch {
10
+ query: string;
11
+ timestamp: string;
12
+ result_count: number;
13
+ }
14
+ export interface SkillUsageCount {
15
+ id: string;
16
+ count: number;
17
+ }
18
+ export interface AnalyticsSummary {
19
+ total_activations: number;
20
+ total_failed_searches: number;
21
+ most_used_skills: SkillUsageCount[];
22
+ first_seen: string | null;
23
+ last_seen: string | null;
24
+ }
25
+ export interface AnalyticsData {
26
+ activations: Activation[];
27
+ failed_searches: FailedSearch[];
28
+ summary: AnalyticsSummary;
29
+ }
30
+ export declare function setAnalyticsPath(path: string | null): void;
31
+ /**
32
+ * Track a skill activation event.
33
+ * Never throws — analytics failures must not block skill activation.
34
+ */
35
+ export declare function trackActivation(activation: Omit<Activation, "timestamp">): Promise<void>;
36
+ /**
37
+ * Track a failed search event.
38
+ * Never throws — analytics failures must not block skill activation.
39
+ */
40
+ export declare function trackFailedSearch(query: string, resultCount?: number): Promise<void>;
41
+ /**
42
+ * Track a web discovery activation (convenience wrapper).
43
+ * Never throws.
44
+ */
45
+ export declare function trackWebDiscovery(taskQuery: string, matched: boolean): Promise<void>;
46
+ /**
47
+ * Get the current analytics summary.
48
+ * Never throws — returns empty summary on failure.
49
+ */
50
+ export declare function getAnalyticsSummary(): Promise<AnalyticsSummary>;
51
+ /**
52
+ * Get the full analytics data (for debugging / display).
53
+ * Never throws — returns empty data on failure.
54
+ */
55
+ export declare function getAnalyticsData(): Promise<AnalyticsData>;