vskill 1.2.0 → 1.2.2

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.
Files changed (106) hide show
  1. package/agents.json +1 -1
  2. package/dist/api/client.js +7 -6
  3. package/dist/api/client.js.map +1 -1
  4. package/dist/blocklist/blocklist.d.ts +12 -0
  5. package/dist/blocklist/blocklist.js +19 -0
  6. package/dist/blocklist/blocklist.js.map +1 -1
  7. package/dist/commands/add.js +71 -43
  8. package/dist/commands/add.js.map +1 -1
  9. package/dist/commands/auth.js +32 -1
  10. package/dist/commands/auth.js.map +1 -1
  11. package/dist/commands/diff.js +8 -0
  12. package/dist/commands/diff.js.map +1 -1
  13. package/dist/commands/eval/run.js +5 -0
  14. package/dist/commands/eval/run.js.map +1 -1
  15. package/dist/commands/info.js +7 -0
  16. package/dist/commands/info.js.map +1 -1
  17. package/dist/commands/outdated.js +24 -7
  18. package/dist/commands/outdated.js.map +1 -1
  19. package/dist/commands/pin.js +7 -2
  20. package/dist/commands/pin.js.map +1 -1
  21. package/dist/commands/submit.js +8 -0
  22. package/dist/commands/submit.js.map +1 -1
  23. package/dist/commands/update.js +14 -5
  24. package/dist/commands/update.js.map +1 -1
  25. package/dist/commands/versions.js +11 -0
  26. package/dist/commands/versions.js.map +1 -1
  27. package/dist/discovery/github-tree.js +14 -2
  28. package/dist/discovery/github-tree.js.map +1 -1
  29. package/dist/eval/anthropic-catalog.d.ts +7 -1
  30. package/dist/eval/anthropic-catalog.js +81 -8
  31. package/dist/eval/anthropic-catalog.js.map +1 -1
  32. package/dist/eval/credential-resolver.js +5 -3
  33. package/dist/eval/credential-resolver.js.map +1 -1
  34. package/dist/eval/integration-runner.js +4 -4
  35. package/dist/eval/integration-runner.js.map +1 -1
  36. package/dist/eval/llm.d.ts +2 -0
  37. package/dist/eval/llm.js +39 -8
  38. package/dist/eval/llm.js.map +1 -1
  39. package/dist/eval/model-catalog.d.ts +27 -0
  40. package/dist/eval/model-catalog.js +101 -0
  41. package/dist/eval/model-catalog.js.map +1 -0
  42. package/dist/eval/pricing.d.ts +5 -0
  43. package/dist/eval/pricing.js +16 -2
  44. package/dist/eval/pricing.js.map +1 -1
  45. package/dist/eval/test-case-parser.js +35 -16
  46. package/dist/eval/test-case-parser.js.map +1 -1
  47. package/dist/eval-server/api-routes.d.ts +2 -10
  48. package/dist/eval-server/api-routes.js +35 -85
  49. package/dist/eval-server/api-routes.js.map +1 -1
  50. package/dist/eval-server/install-skill-routes.d.ts +2 -0
  51. package/dist/eval-server/install-skill-routes.js +7 -0
  52. package/dist/eval-server/install-skill-routes.js.map +1 -1
  53. package/dist/eval-server/model-compare-routes.js +4 -2
  54. package/dist/eval-server/model-compare-routes.js.map +1 -1
  55. package/dist/eval-server/oauth-github-routes.js +32 -2
  56. package/dist/eval-server/oauth-github-routes.js.map +1 -1
  57. package/dist/eval-server/origin-resolver.d.ts +6 -0
  58. package/dist/eval-server/origin-resolver.js +35 -5
  59. package/dist/eval-server/origin-resolver.js.map +1 -1
  60. package/dist/eval-server/platform-proxy.d.ts +3 -3
  61. package/dist/eval-server/platform-proxy.js +10 -25
  62. package/dist/eval-server/platform-proxy.js.map +1 -1
  63. package/dist/eval-server/skill-create-routes.d.ts +1 -1
  64. package/dist/eval-server/skill-create-routes.js +1 -71
  65. package/dist/eval-server/skill-create-routes.js.map +1 -1
  66. package/dist/eval-server/skill-md-emitter.d.ts +17 -0
  67. package/dist/eval-server/skill-md-emitter.js +70 -0
  68. package/dist/eval-server/skill-md-emitter.js.map +1 -0
  69. package/dist/eval-server/studio-privacy.d.ts +26 -0
  70. package/dist/eval-server/studio-privacy.js +129 -0
  71. package/dist/eval-server/studio-privacy.js.map +1 -0
  72. package/dist/eval-ui/assets/{AdvancedTab-DOgbx7u0.js → AdvancedTab-CSWhj_MZ.js} +1 -1
  73. package/dist/eval-ui/assets/{CreateSkillPage-ENMve2K8.js → CreateSkillPage-BJzNKgad.js} +1 -1
  74. package/dist/eval-ui/assets/{FindSkillsPalette-BMVKCk6E.js → FindSkillsPalette-XckIggJi.js} +2 -2
  75. package/dist/eval-ui/assets/{GeneralTab-AwK9sIkP.js → GeneralTab-Gbc-K6UI.js} +1 -1
  76. package/dist/eval-ui/assets/{PrivacyTab-BtNrxpVV.js → PrivacyTab-BXCIX8cQ.js} +1 -1
  77. package/dist/eval-ui/assets/SearchPaletteCore-CTZ8CI14.js +14 -0
  78. package/dist/eval-ui/assets/SkillDetailPanel-NPnDnA3H.js +1 -0
  79. package/dist/eval-ui/assets/{UpdateDropdown-C4BH7W_M.js → UpdateDropdown-CPP1t9LD.js} +1 -1
  80. package/dist/eval-ui/assets/{UpdatesTab-DTmo-vVb.js → UpdatesTab-BFGUaUtu.js} +1 -1
  81. package/dist/eval-ui/assets/{main-tzMA8J07.js → main-jiMosYzo.js} +40 -41
  82. package/dist/eval-ui/assets/{preferences-DCdw0Kvu.js → preferences-D2BPT0OT.js} +2 -2
  83. package/dist/eval-ui/assets/useDesktopBridge-BKz-gcRg.js +2 -0
  84. package/dist/eval-ui/index.html +2 -2
  85. package/dist/eval-ui/preferences.html +2 -2
  86. package/dist/lib/frontmatter.d.ts +2 -5
  87. package/dist/lib/frontmatter.js +15 -40
  88. package/dist/lib/frontmatter.js.map +1 -1
  89. package/dist/lib/github-fetch.d.ts +2 -0
  90. package/dist/lib/github-fetch.js +27 -1
  91. package/dist/lib/github-fetch.js.map +1 -1
  92. package/dist/lib/keychain.js +8 -1
  93. package/dist/lib/keychain.js.map +1 -1
  94. package/dist/lib/private-source.d.ts +77 -0
  95. package/dist/lib/private-source.js +392 -0
  96. package/dist/lib/private-source.js.map +1 -0
  97. package/dist/lib/repo-visibility.d.ts +16 -0
  98. package/dist/lib/repo-visibility.js +43 -3
  99. package/dist/lib/repo-visibility.js.map +1 -1
  100. package/dist/utils/version.d.ts +5 -10
  101. package/dist/utils/version.js +82 -40
  102. package/dist/utils/version.js.map +1 -1
  103. package/package.json +1 -1
  104. package/dist/eval-ui/assets/SearchPaletteCore-C9G-ySXc.js +0 -14
  105. package/dist/eval-ui/assets/SkillDetailPanel-BCJj8p79.js +0 -1
  106. package/dist/eval-ui/assets/useDesktopBridge-9oZFQsrw.js +0 -2
@@ -6,6 +6,8 @@
6
6
  // (getDefaultBranch), so it costs no extra requests.
7
7
  // ---------------------------------------------------------------------------
8
8
  const privateRepos = new Set();
9
+ const publicRepos = new Set();
10
+ const failures = new Map();
9
11
  function keyOf(ref) {
10
12
  const m = ref
11
13
  .trim()
@@ -20,11 +22,47 @@ export function recordRepoVisibility(owner, repo, data) {
20
22
  const key = keyOf(`${owner}/${repo}`);
21
23
  if (!key)
22
24
  return;
25
+ failures.delete(key);
23
26
  const isPrivate = data.private === true || data.visibility === "private" || data.visibility === "internal";
24
- if (isPrivate)
27
+ if (isPrivate) {
25
28
  privateRepos.add(key);
26
- else
27
- privateRepos.delete(key);
29
+ publicRepos.delete(key);
30
+ return;
31
+ }
32
+ privateRepos.delete(key);
33
+ // Only an explicit "public" answer confirms a repo is public; anything
34
+ // else stays unknown, which every caller treats as private.
35
+ if (data.private === false || data.visibility === "public")
36
+ publicRepos.add(key);
37
+ }
38
+ /**
39
+ * What this process has learned about a repo's visibility. Callers must treat
40
+ * "unknown" as private (see lib/private-source.ts).
41
+ */
42
+ export function getRepoVisibility(ref) {
43
+ if (!ref)
44
+ return "unknown";
45
+ const key = keyOf(ref);
46
+ if (!key)
47
+ return "unknown";
48
+ if (privateRepos.has(key))
49
+ return "private";
50
+ if (publicRepos.has(key))
51
+ return "public";
52
+ return "unknown";
53
+ }
54
+ /** Record that GitHub could not answer the visibility lookup for a repo. */
55
+ export function recordRepoVisibilityFailure(owner, repo, reason) {
56
+ const key = keyOf(`${owner}/${repo}`);
57
+ if (key)
58
+ failures.set(key, reason);
59
+ }
60
+ /** Why the last visibility lookup for `ref` failed, if it did. */
61
+ export function getRepoVisibilityFailure(ref) {
62
+ if (!ref)
63
+ return undefined;
64
+ const key = keyOf(ref);
65
+ return key ? failures.get(key) : undefined;
28
66
  }
29
67
  /** True when `ref` ("owner/repo" or a github.com URL) was seen as private. */
30
68
  export function isKnownPrivateRepo(ref) {
@@ -36,5 +74,7 @@ export function isKnownPrivateRepo(ref) {
36
74
  /** @internal test-only */
37
75
  export function _resetRepoVisibilityForTests() {
38
76
  privateRepos.clear();
77
+ publicRepos.clear();
78
+ failures.clear();
39
79
  }
40
80
  //# sourceMappingURL=repo-visibility.js.map
@@ -1 +1 @@
1
- {"version":3,"file":"repo-visibility.js","sourceRoot":"","sources":["../../src/lib/repo-visibility.ts"],"names":[],"mappings":"AAAA,8EAA8E;AAC9E,6EAA6E;AAC7E,uEAAuE;AACvE,6EAA6E;AAC7E,4EAA4E;AAC5E,qDAAqD;AACrD,8EAA8E;AAE9E,MAAM,YAAY,GAAG,IAAI,GAAG,EAAU,CAAC;AAEvC,SAAS,KAAK,CAAC,GAAW;IACxB,MAAM,CAAC,GAAG,GAAG;SACV,IAAI,EAAE;SACN,OAAO,CAAC,4BAA4B,EAAE,EAAE,CAAC;SACzC,KAAK,CAAC,yBAAyB,CAAC,CAAC;IACpC,IAAI,CAAC,CAAC;QAAE,OAAO,IAAI,CAAC;IACpB,OAAO,GAAG,CAAC,CAAC,CAAC,CAAC,IAAI,CAAC,CAAC,CAAC,CAAC,CAAC,OAAO,CAAC,SAAS,EAAE,EAAE,CAAC,EAAE,CAAC,WAAW,EAAE,CAAC;AAChE,CAAC;AAED,2DAA2D;AAC3D,MAAM,UAAU,oBAAoB,CAClC,KAAa,EACb,IAAY,EACZ,IAAiD;IAEjD,MAAM,GAAG,GAAG,KAAK,CAAC,GAAG,KAAK,IAAI,IAAI,EAAE,CAAC,CAAC;IACtC,IAAI,CAAC,GAAG;QAAE,OAAO;IACjB,MAAM,SAAS,GACb,IAAI,CAAC,OAAO,KAAK,IAAI,IAAI,IAAI,CAAC,UAAU,KAAK,SAAS,IAAI,IAAI,CAAC,UAAU,KAAK,UAAU,CAAC;IAC3F,IAAI,SAAS;QAAE,YAAY,CAAC,GAAG,CAAC,GAAG,CAAC,CAAC;;QAChC,YAAY,CAAC,MAAM,CAAC,GAAG,CAAC,CAAC;AAChC,CAAC;AAED,8EAA8E;AAC9E,MAAM,UAAU,kBAAkB,CAAC,GAA8B;IAC/D,IAAI,CAAC,GAAG;QAAE,OAAO,KAAK,CAAC;IACvB,MAAM,GAAG,GAAG,KAAK,CAAC,GAAG,CAAC,CAAC;IACvB,OAAO,GAAG,CAAC,CAAC,CAAC,YAAY,CAAC,GAAG,CAAC,GAAG,CAAC,CAAC,CAAC,CAAC,KAAK,CAAC;AAC7C,CAAC;AAED,0BAA0B;AAC1B,MAAM,UAAU,4BAA4B;IAC1C,YAAY,CAAC,KAAK,EAAE,CAAC;AACvB,CAAC"}
1
+ {"version":3,"file":"repo-visibility.js","sourceRoot":"","sources":["../../src/lib/repo-visibility.ts"],"names":[],"mappings":"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"}
@@ -1,3 +1,5 @@
1
+ /** Read metadata.version while accepting the legacy root-level field. */
2
+ export declare function readFrontmatterVersion(content: string): string | undefined;
1
3
  /**
2
4
  * Extract the `version` field from YAML frontmatter in SKILL.md content.
3
5
  * Returns the version string if it is valid semver, otherwise undefined.
@@ -21,15 +23,8 @@ export declare function resolveVersion(opts: {
21
23
  isFirstInstall: boolean;
22
24
  }): string;
23
25
  /**
24
- * Set or insert the `version:` field inside SKILL.md frontmatter.
25
- *
26
- * Behavior:
27
- * - If frontmatter exists and contains `version:` → replace its value.
28
- * - If frontmatter exists but has no `version:` → insert as the first field.
29
- * - If no frontmatter at all → prepend a minimal `---\nversion: "X"\n---` block.
30
- *
31
- * The version is always emitted quoted to match the convention used by
32
- * skill-create-routes' buildSkillMd emitter and to keep YAML parsers happy
33
- * for non-numeric semver strings.
26
+ * Update a skill version in place. Existing legacy root versions retain their
27
+ * shape; new fields use portable metadata.version. Other metadata and body
28
+ * content are preserved, including CRLF and literal replacement characters.
34
29
  */
35
30
  export declare function setFrontmatterVersion(content: string, version: string): string;
@@ -2,32 +2,45 @@
2
2
  // Version utilities for skill versioning
3
3
  // ---------------------------------------------------------------------------
4
4
  const SEMVER_RE = /^\d+\.\d+\.\d+$/;
5
+ const FRONTMATTER_RE = /^(---[ \t]*\r?\n)([\s\S]*?)(\r?\n---[ \t]*(?=\r?\n|$))/;
6
+ /** Locate only direct children of a block-style metadata mapping. */
7
+ function versionFields(lines) {
8
+ const root = lines.findIndex((line) => /^version[ \t]*:/.test(line));
9
+ const metadata = lines.findIndex((line) => /^metadata[ \t]*:[ \t]*(?:#.*)?$/.test(line));
10
+ let end = metadata + 1;
11
+ while (end < lines.length && (!lines[end].trim() || /^\s|^#/.test(lines[end])))
12
+ end++;
13
+ const children = metadata < 0 ? [] : lines.slice(metadata + 1, end);
14
+ const indents = children.filter((line) => /^ +[^ #]/.test(line))
15
+ .map((line) => line.length - line.trimStart().length);
16
+ const indent = indents.length ? Math.min(...indents) : 2;
17
+ const childPattern = new RegExp(`^ {${indent}}version[ \\t]*:`);
18
+ const nestedOffset = children.findIndex((line) => childPattern.test(line));
19
+ return { root, metadata, nested: nestedOffset < 0 ? -1 : metadata + 1 + nestedOffset, indent };
20
+ }
21
+ function versionCandidates(content) {
22
+ const fm = content.match(FRONTMATTER_RE);
23
+ if (!fm)
24
+ return [];
25
+ const lines = fm[2].split(/\r?\n/);
26
+ const { root, nested } = versionFields(lines);
27
+ return [root, nested].filter((index) => index >= 0).map((index) => {
28
+ const raw = lines[index].slice(lines[index].indexOf(":") + 1).trim();
29
+ const value = raw.match(/^(?:"([^"]*)"|'([^']*)'|([^#]*))/);
30
+ return (value?.[1] ?? value?.[2] ?? value?.[3])?.trim() || undefined;
31
+ });
32
+ }
33
+ /** Read metadata.version while accepting the legacy root-level field. */
34
+ export function readFrontmatterVersion(content) {
35
+ // Preserve precedence for existing files containing both forms.
36
+ return versionCandidates(content).find((version) => version !== undefined);
37
+ }
5
38
  /**
6
39
  * Extract the `version` field from YAML frontmatter in SKILL.md content.
7
40
  * Returns the version string if it is valid semver, otherwise undefined.
8
41
  */
9
42
  export function extractFrontmatterVersion(content) {
10
- const fmMatch = content.match(/^---\s*\n([\s\S]*?)\n---/);
11
- if (!fmMatch)
12
- return undefined;
13
- const frontmatter = fmMatch[1];
14
- // 1. Top-level `version:` wins when present (existing behavior).
15
- const topLevel = frontmatter.match(/^version:\s*"?(\S+?)"?\s*$/m);
16
- if (topLevel && SEMVER_RE.test(topLevel[1]))
17
- return topLevel[1];
18
- // 2. Fall back to nested `metadata.version`. The skill-builder family of
19
- // skills uses this format (publish flow stores semver under metadata),
20
- // and without this branch resolveVersion() in the update path would
21
- // miss the upstream version and synthetically bumpPatch(currentVersion)
22
- // instead — installing 1.0.1 when upstream actually shipped 1.0.3.
23
- const metaIdx = frontmatter.search(/^metadata\s*:\s*$/m);
24
- if (metaIdx >= 0) {
25
- const after = frontmatter.slice(metaIdx);
26
- const nested = after.match(/^[ \t]+version\s*:\s*"?(\S+?)"?\s*$/m);
27
- if (nested && SEMVER_RE.test(nested[1]))
28
- return nested[1];
29
- }
30
- return undefined;
43
+ return versionCandidates(content).find((version) => version !== undefined && SEMVER_RE.test(version));
31
44
  }
32
45
  /**
33
46
  * Increment the patch component of a semver string.
@@ -59,32 +72,61 @@ export function resolveVersion(opts) {
59
72
  return "1.0.0";
60
73
  }
61
74
  /**
62
- * Set or insert the `version:` field inside SKILL.md frontmatter.
63
- *
64
- * Behavior:
65
- * - If frontmatter exists and contains `version:` → replace its value.
66
- * - If frontmatter exists but has no `version:` → insert as the first field.
67
- * - If no frontmatter at all → prepend a minimal `---\nversion: "X"\n---` block.
68
- *
69
- * The version is always emitted quoted to match the convention used by
70
- * skill-create-routes' buildSkillMd emitter and to keep YAML parsers happy
71
- * for non-numeric semver strings.
75
+ * Update a skill version in place. Existing legacy root versions retain their
76
+ * shape; new fields use portable metadata.version. Other metadata and body
77
+ * content are preserved, including CRLF and literal replacement characters.
72
78
  */
73
79
  export function setFrontmatterVersion(content, version) {
74
- const fmMatch = content.match(/^(---\s*\n)([\s\S]*?)(\n---)/);
80
+ const fmMatch = content.match(FRONTMATTER_RE);
81
+ const quoted = JSON.stringify(version);
75
82
  if (!fmMatch) {
76
- return `---\nversion: "${version}"\n---\n\n${content}`;
83
+ return `---\nmetadata:\n version: ${quoted}\n---\n${content}`;
77
84
  }
78
85
  const [, openFence, body, closeFence] = fmMatch;
79
- const versionLineRe = /^version:\s*"?[^\n]*"?\s*$/m;
80
- let newBody;
81
- if (versionLineRe.test(body)) {
82
- newBody = body.replace(versionLineRe, `version: "${version}"`);
86
+ const newline = openFence.includes("\r\n") ? "\r\n" : "\n";
87
+ const lines = body.split(/\r?\n/);
88
+ // This narrow writer does not parse quoted YAML mapping keys (including
89
+ // escaped spellings). Refuse them rather than append a duplicate metadata
90
+ // or version key and lose fields in permissive downstream parsers.
91
+ if (lines.some((line) => /^[ \t]*["'][^\r\n]*["'][ \t]*:/.test(line))) {
92
+ throw new Error("Cannot update version: quoted keys need a YAML-aware edit");
93
+ }
94
+ const { root, metadata, nested, indent } = versionFields(lines);
95
+ const existing = root >= 0 ? root : nested;
96
+ if (existing >= 0) {
97
+ const value = lines[existing].slice(lines[existing].indexOf(":") + 1).trim();
98
+ const existingIndent = root >= 0 ? 0 : indent;
99
+ // A one-line replacement would leave block/folded or quoted-scalar
100
+ // continuation lines orphaned. Detect before changing any line.
101
+ if (/^[|>]/.test(value)) {
102
+ throw new Error("Cannot update version: multiline version needs a YAML-aware edit");
103
+ }
104
+ for (let next = existing + 1; next < lines.length; next++) {
105
+ if (!lines[next].trim() || /^[ \t]*#/.test(lines[next]))
106
+ continue;
107
+ if (lines[next].length - lines[next].trimStart().length > existingIndent) {
108
+ throw new Error("Cannot update version: multiline version needs a YAML-aware edit");
109
+ }
110
+ break;
111
+ }
112
+ }
113
+ if (root >= 0) {
114
+ lines[root] = `version: ${quoted}`;
115
+ }
116
+ else if (nested >= 0) {
117
+ lines[nested] = `${" ".repeat(indent)}version: ${quoted}`;
118
+ }
119
+ else if (metadata >= 0) {
120
+ lines.splice(metadata + 1, 0, `${" ".repeat(indent)}version: ${quoted}`);
83
121
  }
84
122
  else {
85
- // Insert version as the first frontmatter line so it's stable + obvious.
86
- newBody = `version: "${version}"\n${body}`;
123
+ // Never turn an inline/scalar metadata declaration into duplicate keys.
124
+ // Studio emits block mappings; other shapes need a YAML-aware edit first.
125
+ if (lines.some((line) => /^metadata[ \t]*:/.test(line))) {
126
+ throw new Error("Cannot update version: metadata must use a block mapping");
127
+ }
128
+ lines.push("metadata:", ` version: ${quoted}`);
87
129
  }
88
- return content.replace(fmMatch[0], `${openFence}${newBody}${closeFence}`);
130
+ return `${openFence}${lines.join(newline)}${closeFence}${content.slice(fmMatch[0].length)}`;
89
131
  }
90
132
  //# sourceMappingURL=version.js.map
@@ -1 +1 @@
1
- {"version":3,"file":"version.js","sourceRoot":"","sources":["../../src/utils/version.ts"],"names":[],"mappings":"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"}
1
+ {"version":3,"file":"version.js","sourceRoot":"","sources":["../../src/utils/version.ts"],"names":[],"mappings":"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"}
package/package.json CHANGED
@@ -1,6 +1,6 @@
1
1
  {
2
2
  "name": "vskill",
3
- "version": "1.2.0",
3
+ "version": "1.2.2",
4
4
  "type": "module",
5
5
  "description": "Secure multi-platform AI skill installer — scan before you install",
6
6
  "bin": {
@@ -1,14 +0,0 @@
1
- import{r as i,j as t}from"./globals-hm1COkXX.js";import{a as xe}from"./skill-url-C4ekwoGs.js";import{h as ye}from"./main-tzMA8J07.js";import"./useDesktopBridge-9oZFQsrw.js";/* empty css */function me(a){return a?a.replace(/<(?!\/?b>)[^>]+>/gi,""):""}function be(a){return a.replace(/&/g,"&amp;").replace(/</g,"&lt;").replace(/>/g,"&gt;").replace(/"/g,"&quot;")}function Me(a,p){if(!a)return"";const d=be(a);if(!p)return d;const u=p.trim().split(/\s+/).filter(Boolean);if(u.length===0)return d;const T=u.map(W=>W.replace(/[.*+?^${}()|[\]\\]/g,"\\$&")).join("|"),b=new RegExp(`(${T})`,"gi");return d.replace(b,"<b>$1</b>")}function ve(a){return a?a<1e3?String(a):`${(a/1e3).toFixed(1)}k`:""}const ke=[{label:"Security",href:"/skills?category=security"},{label:"Coding",href:"/skills?category=development"},{label:"DevOps",href:"/skills?category=devops"},{label:"Testing",href:"/skills?category=testing"},{label:"Data",href:"/skills?category=data"},{label:"Design",href:"/skills?category=design"}],Se=[{label:"Submit a skill",href:"/submit"},{label:"Browse all skills",href:"/skills"}],J="var(--font-sans, -apple-system, BlinkMacSystemFont, 'Segoe UI', sans-serif)",c="var(--font-mono, 'JetBrains Mono', 'SF Mono', Menlo, Consolas, monospace)";function Ee({tier:a,isTainted:p,isBlocked:d}){const u={display:"inline-flex",alignItems:"center",padding:"1px 6px",height:16,borderRadius:3,fontFamily:c,fontSize:9.5,fontWeight:600,letterSpacing:"0.04em",whiteSpace:"nowrap",lineHeight:1,textTransform:"uppercase"};if(d)return t.jsx("span",{"data-testid":"mini-tier-badge","data-tier":"BLOCKED",style:{...u,color:"#7A1F1F",background:"#FBE8E5",border:"1px solid #E8B7B0"},children:"BLOCKED"});if(p)return t.jsx("span",{"data-testid":"mini-tier-badge","data-tier":"TAINTED",style:{...u,color:"#7A4A00",background:"#FBEFD3",border:"1px solid #E8C885"},children:"Tainted"});const b={CERTIFIED:{color:"var(--color-installed, #2F6A4A)",bg:"rgba(47,106,74,0.08)",border:"rgba(47,106,74,0.25)"},VERIFIED:{color:"var(--color-focus, #3B6EA8)",bg:"rgba(59,110,168,0.08)",border:"rgba(59,110,168,0.25)"},REJECTED:{color:"#7A1F1F",bg:"#FBE8E5",border:"#E8B7B0"},BLOCKED:{color:"#7A1F1F",bg:"#FBE8E5",border:"#E8B7B0"}}[a];return b?t.jsx("span",{"data-testid":"mini-tier-badge","data-tier":a,style:{...u,color:b.color,background:b.bg,border:`1px solid ${b.border}`},children:ye(a)}):null}function O(){return t.jsxs("div",{"data-testid":"skeleton-row",style:{padding:"10px 18px",display:"flex",alignItems:"center",gap:10},children:[t.jsxs("div",{style:{flex:1,display:"flex",flexDirection:"column",gap:6},children:[t.jsx("div",{style:{height:12,width:"32%",borderRadius:3,background:"var(--color-rule, #E8E1D6)",animation:"fsp-pulse 1.4s ease-in-out infinite"}}),t.jsx("div",{style:{height:9,width:"55%",borderRadius:3,background:"var(--color-rule, #E8E1D6)",animation:"fsp-pulse 1.4s ease-in-out infinite",animationDelay:"0.18s"}})]}),t.jsx("div",{style:{height:14,width:52,borderRadius:3,background:"var(--color-rule, #E8E1D6)",animation:"fsp-pulse 1.4s ease-in-out infinite",animationDelay:"0.36s"}})]})}function Fe(a){var d,u;const p=(d=a.target)==null?void 0:d.tagName;return!!(p==="INPUT"||p==="TEXTAREA"||p==="SELECT"||(u=a.target)!=null&&u.isContentEditable)}const je="/api/v1/studio/search",we="/api/v1/stats",Ae="/api/v1/studio/telemetry/search-select",Re=10,Q=20,Ce=150;function $e({onSelect:a,onNavigate:p,searchUrl:d=je,trendingUrl:u=we,telemetrySelectUrl:T=Ae,maxPages:b=Re,initialOpen:W=!1}={}){const[L,E]=i.useState(W),[o,F]=i.useState(""),[I,h]=i.useState([]),[U,v]=i.useState(0),[j,B]=i.useState(!1),[_,w]=i.useState(1),[H,x]=i.useState(!1),[M,V]=i.useState(!1),[$,k]=i.useState(null),[A,R]=i.useState(!1),Z=i.useRef(null),N=i.useRef(null),z=i.useRef(!1),ee=i.useRef(null),te=i.useRef(null),q=i.useRef(new Map),S=i.useRef(null),[,ue]=i.useState(!1),re=i.useMemo(()=>typeof navigator<"u"&&/Mac|iPod|iPhone|iPad/.test(navigator.platform||""),[]),K=i.useRef(o);i.useEffect(()=>{K.current=o},[o]),i.useEffect(()=>{S.current||fetch(u).then(e=>e.json()).then(e=>{S.current=e.trendingSkills??[],ue(!0)}).catch(()=>{})},[u]),i.useEffect(()=>{const e=r=>{if(r.key==="Escape"){E(!1);return}if(L&&(r.metaKey||r.ctrlKey)&&/^[1-9]$/.test(r.key)){r.preventDefault();const s=Number(r.key)-1;v(s),window.dispatchEvent(new CustomEvent("findSkillsActivateAt",{detail:{index:s}}));return}!r.metaKey&&!r.ctrlKey&&!r.altKey&&r.key.length===1&&!Fe(r)&&(z.current=!0,F(r.key),E(!0))},n=r=>{var y;const l=(y=r.detail)==null?void 0:y.query;l&&(z.current=!0,F(l)),E(!0)};return window.addEventListener("keydown",e),window.addEventListener("openFindSkills",n),()=>{window.removeEventListener("keydown",e),window.removeEventListener("openFindSkills",n)}},[L]),i.useLayoutEffect(()=>{var n;if(!L){(n=N.current)==null||n.abort();return}if(z.current)z.current=!1,h([]),v(0),w(1),x(!1),B(!1),k(null),R(!1);else{const r=(()=>{var s;try{return((s=window.sessionStorage)==null?void 0:s.getItem("find-skills:last-query"))??""}catch{return""}})();F(r),h([]),v(0),w(1),x(!1),B(!1),k(null),R(!1)}const e=Z.current;if(e){e.focus({preventScroll:!0});const r=e.value.length;e.setSelectionRange(r,r)}},[L]),i.useEffect(()=>{if(!o.trim()||o.trim().length<2){h([]),x(!1),w(1),k(null);return}const e=6e4,n=o.trim().toLowerCase(),r=q.current.get(n);if(r&&Date.now()-r.timestamp<e){h(r.results),x(r.hasMore),w(1),B(!1),k(null),fetch(`${d}?q=${encodeURIComponent(o)}&limit=${Q}&page=1`).then(m=>m.ok?m.json():null).then(m=>{var g;m&&q.current.set(n,{results:m.results||[],hasMore:((g=m.pagination)==null?void 0:g.hasMore)??!1,timestamp:Date.now()})}).catch(()=>{});return}B(!0),k(null);const l=new AbortController,y=setTimeout(async()=>{var m;try{const g=await fetch(`${d}?q=${encodeURIComponent(o)}&limit=${Q}&page=1`,{signal:l.signal});if(g.status>=500){R(!0),h([]),x(!1),k(null);return}if(!g.ok){h([]),x(!1),k(`search failed (${g.status})`);return}const ce=await g.json(),de=ce.results||[],pe=((m=ce.pagination)==null?void 0:m.hasMore)??!1;h(de),x(pe),w(1),R(!1),q.current.set(n,{results:de,hasMore:pe,timestamp:Date.now()})}catch(g){if(g instanceof DOMException&&g.name==="AbortError")return;R(!0),h([]),x(!1),k(null)}finally{l.signal.aborted||B(!1)}},Ce);return()=>{clearTimeout(y),l.abort()}},[o,d]);const C=_>=b,ne=i.useCallback(async()=>{var n,r;if(M||C)return;const e=_+1;V(!0),N.current=new AbortController;try{const s=await fetch(`${d}?q=${encodeURIComponent(o)}&limit=${Q}&page=${e}`,{signal:N.current.signal});if(!s.ok)return;const l=await s.json();h(y=>[...y,...l.results||[]]),x(((n=l.pagination)==null?void 0:n.hasMore)??!1),w(e)}catch(s){if(s instanceof DOMException&&s.name==="AbortError")return}finally{(r=N.current)!=null&&r.signal.aborted||V(!1)}},[_,o,M,C,d]);i.useEffect(()=>{const e=ee.current,n=te.current;if(!e||!n||typeof IntersectionObserver>"u")return;const r=new IntersectionObserver(s=>{s[0].isIntersecting&&H&&!j&&!M&&!C&&ne()},{root:n,rootMargin:"100px"});return r.observe(e),()=>r.disconnect()},[H,j,M,C,ne]);const P=e=>({name:e.name,displayName:e.displayName,author:e.author,repoUrl:e.repoUrl,certTier:e.certTier,githubStars:0,highlight:"",category:"",ownerSlug:e.ownerSlug,repoSlug:e.repoSlug,skillSlug:e.skillSlug}),G=(()=>{const e=o.trim();if(A&&e.length>=1&&S.current){const n=e.toLowerCase();return S.current.filter(r=>r.name.toLowerCase().includes(n)||(r.displayName??"").toLowerCase().includes(n)).slice(0,30).map(P)}if(e.length>=2)return I;if(e.length===1&&S.current){const n=e.toLowerCase();return S.current.filter(r=>r.name.toLowerCase().startsWith(n)||r.displayName.toLowerCase().startsWith(n)).slice(0,10).map(P)}return e.length===0&&S.current?S.current.slice(0,10).map(P):[]})(),f=[...G.map(e=>{const n=e.skillSlug||e.name.split("/").pop()||e.name,r=e.ownerSlug&&e.repoSlug?`${e.ownerSlug}/${e.repoSlug}`:e.author;return{type:"skill",label:n,publisher:r,name:e.name,command:e.command?e.pluginName?`${e.pluginName}:${e.command}`:e.command:void 0,pluginName:e.pluginName||void 0,meta:e.category||"",certTier:e.certTier,isTainted:e.isTainted,isBlocked:e.isBlocked,repoUrl:e.repoUrl,highlight:e.highlight,githubStars:e.githubStars,category:e.category,href:xe(e.name),sourceResult:e}}),...!o&&G.length===0?ke.map(e=>({type:"category",label:e.label,publisher:"",name:"",meta:"",certTier:"",repoUrl:"",href:e.href})):[],...!o&&G.length===0?Se.map(e=>({type:"action",label:e.label,publisher:"",name:"",meta:"",certTier:"",repoUrl:"",href:e.href})):[]],ie=i.useCallback(e=>{try{fetch(T,{method:"POST",headers:{"Content-Type":"application/json"},body:JSON.stringify({skillName:e,q:K.current.trim(),ts:Date.now()}),keepalive:!0}).catch(()=>{})}catch{}},[T]),D=i.useCallback((e,n)=>{if(n&&(ie(n.name),a))try{a(n,K.current.trim())}catch{}if(E(!1),p)try{p(e)}catch{}},[a,p,ie]);i.useEffect(()=>{function e(n){var l;const r=((l=n.detail)==null?void 0:l.index)??-1,s=f[r];s&&D(s.href,s.type==="skill"?s.sourceResult:void 0)}return window.addEventListener("findSkillsActivateAt",e),()=>window.removeEventListener("findSkillsActivateAt",e)},[f,D]);const fe=e=>{if(e.key==="ArrowDown")e.preventDefault(),v(n=>Math.min(n+1,f.length-1));else if(e.key==="ArrowUp")e.preventDefault(),v(n=>Math.max(n-1,0));else if(e.key==="Enter"&&f[U]){const n=f[U];D(n.href,n.type==="skill"?n.sourceResult:void 0)}};if(!L)return null;let ae="";const se=!j&&!$&&!A&&o.trim().length>=2&&I.length===0,Y=j&&I.length===0&&o.trim().length>=2&&!A,oe=o.trim(),le=()=>{R(!1);const e=o;F(""),setTimeout(()=>F(e),0)},ge={position:"fixed",inset:0,background:"color-mix(in srgb, var(--color-ink, #191919) 35%, transparent)",backdropFilter:"blur(6px) saturate(1.1)",WebkitBackdropFilter:"blur(6px) saturate(1.1)"},he={position:"relative",width:"100%",maxWidth:640,margin:"0 16px",background:"var(--bg-surface, #FFFFFF)",color:"var(--text-primary, #191919)",borderRadius:12,border:"1px solid var(--color-rule, #E8E1D6)",boxShadow:"0 1px 0 rgba(255,255,255,0.6) inset,0 24px 60px -12px rgba(25,20,15,0.28),0 12px 24px -8px rgba(25,20,15,0.18)",overflow:"hidden",fontFamily:J};return t.jsxs("div",{"data-testid":"find-skills-palette",role:"dialog","aria-modal":"true","aria-label":"Find verified skills",style:{position:"fixed",inset:0,zIndex:9999,display:"flex",alignItems:"flex-start",justifyContent:"center",paddingTop:"min(18vh, 144px)"},onClick:()=>E(!1),children:[t.jsx("div",{style:ge}),t.jsx("style",{children:`
2
- @keyframes fsp-pulse {
3
- 0%, 100% { opacity: 1; }
4
- 50% { opacity: 0.45; }
5
- }
6
- @keyframes fsp-rise {
7
- from { opacity: 0; transform: translateY(-6px); }
8
- to { opacity: 1; transform: translateY(0); }
9
- }
10
- @media (prefers-reduced-motion: reduce) {
11
- .fsp-rise { animation: none !important; }
12
- [data-testid="skeleton-row"] > div { animation: none !important; }
13
- }
14
- `}),t.jsxs("div",{className:"fsp-rise",style:{...he,animation:"fsp-rise 180ms cubic-bezier(0.2, 0, 0, 1)"},onClick:e=>e.stopPropagation(),children:[t.jsxs("div",{style:{display:"flex",alignItems:"center",padding:"0 18px",borderBottom:"1px solid var(--color-rule, #E8E1D6)",background:"linear-gradient(180deg, var(--bg-surface, #FFFFFF) 0%, color-mix(in srgb, var(--bg-surface, #FFFFFF) 96%, var(--color-accent, #D4A27F) 4%) 100%)"},children:[t.jsx("span",{"aria-hidden":"true",style:{display:"inline-flex",alignItems:"center",justifyContent:"center",width:18,height:18,marginRight:10,color:"var(--color-accent-ink, #7A4A24)"},children:t.jsxs("svg",{width:"16",height:"16",viewBox:"0 0 16 16",fill:"none",stroke:"currentColor",strokeWidth:"1.6",strokeLinecap:"round",strokeLinejoin:"round","aria-hidden":"true",children:[t.jsx("circle",{cx:"7",cy:"7",r:"4.5"}),t.jsx("path",{d:"m13.5 13.5-3.2-3.2"})]})}),t.jsx("input",{ref:Z,value:o,onChange:e=>{F(e.target.value),v(0)},onKeyDown:fe,placeholder:"Search verified skills…",role:"combobox","aria-expanded":"true","aria-controls":"find-skills-listbox","aria-autocomplete":"list",autoFocus:!0,spellCheck:!1,autoCorrect:"off",autoCapitalize:"off",style:{flex:1,border:"none",outline:"none",padding:"16px 0",fontFamily:J,fontSize:16,fontWeight:400,letterSpacing:"-0.005em",background:"transparent",color:"var(--text-primary, #191919)",minWidth:0}}),j&&t.jsx("span",{"aria-hidden":"true",style:{display:"inline-flex",marginRight:10,color:"var(--text-secondary, #5A5651)"},children:t.jsxs("svg",{width:"14",height:"14",viewBox:"0 0 14 14","aria-hidden":"true",children:[t.jsx("circle",{cx:"7",cy:"7",r:"5.5",stroke:"currentColor",strokeWidth:"1.4",fill:"none",opacity:"0.25"}),t.jsx("path",{d:"M12.5 7a5.5 5.5 0 0 0-5.5-5.5",stroke:"currentColor",strokeWidth:"1.4",fill:"none",strokeLinecap:"round",children:t.jsx("animateTransform",{attributeName:"transform",type:"rotate",from:"0 7 7",to:"360 7 7",dur:"0.7s",repeatCount:"indefinite"})})]})}),t.jsx("kbd",{style:{fontFamily:c,fontSize:10.5,fontWeight:500,color:"var(--text-secondary, #5A5651)",border:"1px solid var(--color-rule, #E8E1D6)",borderRadius:4,padding:"2px 6px",background:"var(--bg-canvas, #FBF8F3)"},children:"Esc"})]}),A&&t.jsxs("div",{"data-testid":"search-degraded-banner",role:"status",style:{display:"flex",alignItems:"center",gap:10,padding:"8px 18px",fontFamily:c,fontSize:11.5,color:"var(--color-accent-ink, #7A4A24)",background:"color-mix(in srgb, var(--color-accent, #D4A27F) 12%, transparent)",borderBottom:"1px solid color-mix(in srgb, var(--color-accent, #D4A27F) 30%, transparent)"},children:[t.jsx("span",{"aria-hidden":"true",children:"◐"}),t.jsx("span",{style:{flex:1},children:"Live search is offline — showing trending matches"}),t.jsx("button",{"data-testid":"search-retry",onClick:le,style:{fontFamily:c,fontSize:10.5,padding:"3px 8px",borderRadius:3,border:"1px solid var(--color-accent, #D4A27F)",background:"transparent",color:"var(--color-accent-ink, #7A4A24)",cursor:"pointer"},children:"Retry"})]}),t.jsxs("div",{ref:te,role:"listbox",id:"find-skills-listbox",style:{maxHeight:"min(56vh, 432px)",overflowY:"auto",padding:"6px 0"},children:[Y&&t.jsxs(t.Fragment,{children:[t.jsx(O,{}),t.jsx(O,{}),t.jsx(O,{}),t.jsx(O,{})]}),$&&!A&&t.jsxs("div",{"data-testid":"search-error",style:{padding:"20px 18px",textAlign:"center",fontFamily:c,fontSize:12.5,color:"var(--color-ink-muted, #5A5651)"},children:[t.jsx("div",{style:{marginBottom:8},children:$}),t.jsx("button",{"data-testid":"search-retry",onClick:le,style:{fontFamily:c,fontSize:11,padding:"4px 10px",borderRadius:4,border:"1px solid var(--color-rule, #E8E1D6)",background:"transparent",color:"var(--text-primary, #191919)",cursor:"pointer"},children:"Retry"})]}),se&&t.jsxs("div",{style:{padding:"28px 18px",textAlign:"center"},children:[t.jsxs("div",{style:{fontFamily:J,fontSize:13,color:"var(--text-secondary, #5A5651)",marginBottom:6},children:["No matches for ",t.jsxs("span",{style:{color:"var(--text-primary, #191919)",fontFamily:c},children:['"',oe,'"']})]}),t.jsx("a",{href:"/skills",style:{fontFamily:c,fontSize:12,color:"var(--color-action, #2F5B8E)",textDecoration:"none",borderBottom:"1px solid currentColor",paddingBottom:1},onClick:e=>{e.preventDefault(),D("/skills")},children:"Browse by category →"})]}),!Y&&f.length===0&&!se&&!$&&t.jsx("div",{style:{padding:"20px 18px",textAlign:"center",fontFamily:c,fontSize:11.5,color:"var(--text-secondary, #5A5651)"},children:"Loading trending…"}),!Y&&f.map((e,n)=>{const r=e.type==="skill"?A?"TRENDING (FILTERED)":oe.length>=2?"RESULTS":"TRENDING":e.type==="category"?"CATEGORIES":"ACTIONS",s=r!==ae;s&&(ae=r);const l=n===U,y=n<9?`${re?"⌘":"Ctrl"} ${n+1}`:"";return t.jsxs("div",{children:[s&&t.jsx("div",{style:{padding:"10px 18px 4px",fontFamily:c,fontSize:9.5,fontWeight:600,color:"var(--text-secondary, #5A5651)",letterSpacing:"0.12em",textTransform:"uppercase"},children:r}),e.type==="skill"?t.jsxs("div",{role:"option","aria-selected":l,onClick:()=>D(e.href,e.sourceResult),onMouseEnter:()=>v(n),style:{position:"relative",padding:"8px 18px 8px 22px",cursor:"pointer",display:"flex",alignItems:"center",gap:12,background:l?"color-mix(in srgb, var(--color-accent, #D4A27F) 8%, transparent)":"transparent",transition:"background 120ms ease"},children:[l&&t.jsx("span",{"aria-hidden":"true",style:{position:"absolute",left:0,top:6,bottom:6,width:3,background:"var(--color-accent, #D4A27F)",borderRadius:"0 2px 2px 0"}}),t.jsxs("div",{style:{flex:1,minWidth:0,display:"flex",flexDirection:"column",gap:2},children:[t.jsxs("div",{style:{display:"flex",alignItems:"baseline",gap:8},children:[t.jsx("span",{style:{fontFamily:c,fontSize:13,fontWeight:600,color:"var(--text-primary, #191919)",overflow:"hidden",textOverflow:"ellipsis",whiteSpace:"nowrap",maxWidth:"100%"},children:e.label}),e.pluginName&&t.jsx("span",{style:{fontSize:9.5,padding:"1px 5px",borderRadius:3,color:"var(--color-action, #2F5B8E)",background:"rgba(47,91,142,0.08)",border:"1px solid rgba(47,91,142,0.22)",whiteSpace:"nowrap",flexShrink:0,fontFamily:c},children:e.pluginName})]}),t.jsxs("div",{style:{fontSize:11,color:"var(--text-secondary, #5A5651)",fontFamily:c,overflow:"hidden",textOverflow:"ellipsis",whiteSpace:"nowrap",opacity:.85},children:[e.publisher,e.highlight&&t.jsxs(t.Fragment,{children:[t.jsx("span",{style:{margin:"0 6px",opacity:.5},children:"·"}),t.jsx("span",{"data-testid":"search-highlight",dangerouslySetInnerHTML:{__html:me(e.highlight)}})]})]})]}),t.jsxs("div",{style:{display:"flex",alignItems:"center",gap:8,flexShrink:0},children:[e.githubStars!=null&&e.githubStars>0&&t.jsxs("span",{"data-testid":"star-count",style:{display:"inline-flex",alignItems:"center",gap:3,fontSize:10.5,fontFamily:c,color:"var(--text-secondary, #5A5651)",whiteSpace:"nowrap"},children:[t.jsx("svg",{width:10,height:10,viewBox:"0 0 16 16",fill:"currentColor","aria-hidden":"true",children:t.jsx("path",{d:"M8 .25a.75.75 0 01.673.418l1.882 3.815 4.21.612a.75.75 0 01.416 1.279l-3.046 2.97.719 4.192a.75.75 0 01-1.088.791L8 12.347l-3.766 1.98a.75.75 0 01-1.088-.79l.72-4.194L.818 6.374a.75.75 0 01.416-1.28l4.21-.611L7.327.668A.75.75 0 018 .25z"})}),ve(e.githubStars)]}),t.jsx(Ee,{tier:e.certTier,isTainted:e.isTainted,isBlocked:e.isBlocked}),l&&y&&t.jsx("span",{"aria-hidden":"true",style:{fontFamily:c,fontSize:9.5,color:"var(--text-secondary, #5A5651)",padding:"1px 5px",borderRadius:3,border:"1px solid var(--color-rule, #E8E1D6)",whiteSpace:"nowrap"},children:y})]})]}):t.jsxs("div",{role:"option","aria-selected":l,onClick:()=>D(e.href),onMouseEnter:()=>v(n),style:{position:"relative",padding:"7px 18px 7px 22px",cursor:"pointer",background:l?"color-mix(in srgb, var(--color-accent, #D4A27F) 8%, transparent)":"transparent",fontFamily:c,fontSize:12.5,color:"var(--text-primary, #191919)"},children:[l&&t.jsx("span",{"aria-hidden":"true",style:{position:"absolute",left:0,top:4,bottom:4,width:3,background:"var(--color-accent, #D4A27F)",borderRadius:"0 2px 2px 0"}}),e.label]})]},`${e.type}-${e.name||e.label}`)}),H&&!j&&I.length>0&&!C&&t.jsx("div",{ref:ee,"data-testid":"scroll-sentinel",style:{padding:"8px 18px",textAlign:"center"},children:M&&t.jsx("span",{style:{fontFamily:c,fontSize:11,color:"var(--text-secondary, #5A5651)"},children:"Loading…"})}),C&&I.length>0&&t.jsx("div",{"data-testid":"hard-cap-link",style:{padding:"12px 18px",textAlign:"center",fontFamily:c,fontSize:11.5},children:t.jsx("a",{href:`https://verified-skill.com/skills?q=${encodeURIComponent(o.trim())}`,target:"_blank",rel:"noopener noreferrer",style:{color:"var(--color-action, #2F5B8E)",textDecoration:"none"},children:"See all results on verified-skill.com →"})})]}),t.jsxs("div",{"data-testid":"palette-footer",style:{display:"flex",alignItems:"center",justifyContent:"space-between",padding:"8px 18px",borderTop:"1px solid var(--color-rule, #E8E1D6)",background:"var(--bg-canvas, #FBF8F3)",fontFamily:c,fontSize:10.5,color:"var(--text-secondary, #5A5651)"},children:[t.jsxs("div",{style:{display:"flex",alignItems:"center",gap:14},children:[t.jsx(X,{keys:["↑","↓"],label:"navigate"}),t.jsx(X,{keys:["↵"],label:"open"}),t.jsx(X,{keys:[re?"⌘":"Ctrl","1-9"],label:"jump"})]}),t.jsx("div",{style:{display:"flex",alignItems:"center",gap:6},children:t.jsx("span",{style:{opacity:.7},children:f.length>0?`${f.length} ${f.length===1?"result":"results"}`:""})})]})]})]})}function X({keys:a,label:p}){return t.jsxs("span",{style:{display:"inline-flex",alignItems:"center",gap:6},children:[t.jsx("span",{style:{display:"inline-flex",alignItems:"center",gap:2},children:a.map((d,u)=>t.jsx("kbd",{style:{display:"inline-flex",alignItems:"center",justifyContent:"center",minWidth:16,height:16,padding:"0 4px",fontFamily:c,fontSize:10,fontWeight:500,color:"var(--text-secondary, #5A5651)",background:"var(--bg-surface, #FFFFFF)",border:"1px solid var(--color-rule, #E8E1D6)",borderRadius:3,lineHeight:1},children:d},u))}),t.jsx("span",{children:p})]})}export{$e as default,ve as formatStarCount,Me as highlightMatches};
@@ -1 +0,0 @@
1
- import{j as t,r as c}from"./globals-hm1COkXX.js";import{g as pe,a as G,T as me,I as ge}from"./main-tzMA8J07.js";import{s as N}from"./skill-url-C4ekwoGs.js";import"./useDesktopBridge-9oZFQsrw.js";/* empty css */const X={T0:{label:"BLOCKED",cssVar:"var(--trust-t0)"},T1:{label:"UNSCANNED",cssVar:"var(--trust-t1)"},T2:{label:"BASIC",cssVar:"var(--trust-t2)"},T3:{label:"VERIFIED",cssVar:"var(--trust-t3)"},T4:{label:"CERTIFIED",cssVar:"var(--trust-t4)"}};function he({tier:r}){const o=X[r]??X.T1;return t.jsxs("span",{"data-testid":"trust-badge","data-tier":r,style:{display:"inline-flex",alignItems:"center",gap:"0.3rem",padding:"0.15rem 0.5rem",borderRadius:"4px",fontFamily:"var(--font-geist-mono)",fontSize:"0.6875rem",fontWeight:600,letterSpacing:"0.03em",textTransform:"uppercase",whiteSpace:"nowrap",color:o.cssVar,backgroundColor:`color-mix(in srgb, ${o.cssVar} 10%, transparent)`,border:`1px solid color-mix(in srgb, ${o.cssVar} 25%, transparent)`,lineHeight:1,height:"22px"},children:[r," ",o.label]})}const ye=/^https?:\/\/github\.com\/([a-zA-Z0-9_.-]+)\/([a-zA-Z0-9_.-]+?)(\.git)?(\/.*)?$/;function xe(r){var y,v;const a=r.trim().match(ye);if(!a)return null;const p=(y=a[1])==null?void 0:y.toLowerCase();let u=(v=a[2])==null?void 0:v.toLowerCase();if(!p||!u)return null;u=u.replace(/\.git$/,"");const s=`https://github.com/${p}/${u}`;return{owner:p,name:u,url:s}}function ve(r){return r?r.trim().split("/").map(a=>a.trim()).filter(Boolean).at(-1)??null:null}function be(r,o,a){const p=ve(a);return p?`https://verified-skill.com/skills/${[r,o,p].map(encodeURIComponent).join("/")}`:null}function ke({repoUrl:r,skillName:o,mono:a="var(--font-geist-mono)",fontSize:p="0.75rem",showPlaceholder:u=!0}){if(!r)return u?t.jsx("span",{style:{color:"var(--text-faint)",fontSize:p},children:"--"}):null;const s=xe(r);return s?t.jsxs("a",{"data-testid":"repo-link",href:be(s.owner,s.name,o)??s.url,target:"_blank",rel:"noopener noreferrer",onClick:y=>y.stopPropagation(),style:{color:"#0D9488",textDecoration:"none",fontSize:p,fontFamily:a},children:[s.owner,"/",s.name]}):t.jsx("span",{style:{color:"var(--text-faint)",fontSize:p,fontFamily:a},children:r})}const Ee="var(--font-geist-mono)",je={ONLINE:"var(--status-success-text)",OFFLINE:"var(--status-danger-text)",STALE:"var(--status-neutral-text)"},Se={ONLINE:"var(--status-success-bg)",OFFLINE:"var(--status-danger-bg)",STALE:"var(--status-neutral-bg)"};function we({skillName:r,repoUrl:o}){const[a,p]=c.useState(null),[u,s]=c.useState(!1);if(c.useEffect(()=>{o&&(s(!0),fetch(N(r,"repo-health")).then(S=>{if(!S.ok)throw new Error("fetch failed");return S.json()}).then(S=>{p(S.status),s(!1)}).catch(()=>{p(null),s(!1)}))},[r,o]),!o)return null;if(u)return t.jsx("span",{"data-testid":"repo-health-loading",style:{display:"inline-block",width:56,height:20,borderRadius:"4px",backgroundColor:"color-mix(in srgb, var(--text-faint) 20%, transparent)",animation:"pulse 1.5s ease-in-out infinite"}});if(!a||a==="UNKNOWN")return null;const y=je[a]??"var(--status-neutral-text)",v=Se[a]??"var(--status-neutral-bg)";return t.jsx("span",{"data-testid":"repo-health-badge",style:{fontFamily:Ee,fontSize:"0.75rem",fontWeight:600,textTransform:"uppercase",letterSpacing:"0.03em",padding:"0.2rem 0.6rem",borderRadius:"999px",backgroundColor:v,color:y,whiteSpace:"nowrap"},children:a})}function $e({children:r,compact:o}){return t.jsx("pre",{"data-testid":"terminal-block",style:{background:"var(--bg-code, #161B22)",color:"#E6EDF3",fontFamily:"var(--font-geist-mono)",fontSize:o?"0.8rem":"0.875rem",lineHeight:1.6,padding:o?"1rem 1.25rem":"1.5rem 2rem",borderRadius:"6px",overflowX:"auto",margin:0},children:r})}const Fe="/api/v1/studio/telemetry/install-copy",Ie=/^[a-zA-Z0-9._@/-]+$/,Te=/^[a-zA-Z0-9._-]+$/,Ae="https://verified-skill.com";function Ce(r){return`${r.owner}/${r.repo}/${r.slug}`}function Re(r,o){return r!=null&&r.ownerSlug&&(r!=null&&r.repoSlug)?`${r.ownerSlug}/${r.repoSlug}`:r!=null&&r.publisher?r.publisher:`${o.owner}/${o.repo}`}function De(r){return r==="user"?" --global":` --scope ${r}`}function Le(r){return r==="user"?"User":"Project"}function Be(r,o,a,p){const u=a?`${r}/${o}@${a}`:`${r}/${o}`;if(!Ie.test(`${r}/${o}`))return{ok:!1,reason:"Invalid skill identifier"};if(a&&!Te.test(a))return{ok:!1,reason:"Invalid version identifier"};const s=De(p),y=`npx vskill@latest install ${u}${s}`,v=[{label:"npm",comment:"# npm",command:y},{label:"bun",comment:"# bun",command:`bunx vskill@latest install ${u}${s}`},{label:"pnpm",comment:"# pnpm",command:`pnpx vskill@latest install ${u}${s}`},{label:"yarn",comment:"# yarn",command:`yarn dlx vskill@latest install ${u}${s}`},{label:"alternative",comment:"# alternative (publisher + --skill flag)",command:a?`npx vskill@latest install ${r}@${a} --skill ${o}${s}`:`npx vskill@latest install ${r} --skill ${o}${s}`}];return{ok:!0,command:y,variants:v}}function I(r,o,a){typeof window>"u"||window.dispatchEvent(new CustomEvent("studio:toast",{detail:{message:r,kind:o,durationMs:a,severity:o==="error"?"error":"info"}}))}async function Y(r){var o;if(typeof navigator<"u"&&((o=navigator.clipboard)!=null&&o.writeText))try{return await navigator.clipboard.writeText(r),!0}catch{}if(typeof document>"u")return!1;try{const a=document.createElement("textarea");a.value=r,a.setAttribute("readonly",""),a.style.position="fixed",a.style.left="-9999px",document.body.appendChild(a),a.select();const p=document.execCommand("copy");return document.body.removeChild(a),p}catch{return!1}}function Z(r,o){try{fetch(r,{method:"POST",headers:{"Content-Type":"application/json"},body:JSON.stringify(o),keepalive:!0}).catch(()=>{})}catch{}}function _e({selectedSkill:r,onClose:o,activeAgentId:a,telemetryInstallCopyUrl:p=Fe,onToast:u}){const[s,y]=c.useState(null),[v,S]=c.useState([]),[J,Q]=c.useState(!1),[ee,te]=c.useState(null),[T,A]=c.useState(!0),[C,V]=c.useState(null),[x,O]=c.useState(null),[k,re]=c.useState("project"),[b,R]=c.useState(null),[U,ne]=c.useState(0),[D,_]=c.useState(!1),M=c.useRef(null),P=c.useRef(null),W=c.useRef(null),K=c.useRef(!1),g=Ce(r),se=a===void 0?pe("activeAgent",null):a;c.useEffect(()=>{K.current=D},[D]),c.useEffect(()=>(W.current=document.activeElement??null,()=>{const e=W.current;if(e&&typeof e.focus=="function")try{e.focus()}catch{}}),[]),c.useEffect(()=>{const e=setTimeout(()=>{var n;return(n=P.current)==null?void 0:n.focus()},50);return()=>clearTimeout(e)},[]),c.useEffect(()=>{let e=!1;A(!0),V(null);const n=N(g),d=N(g,"versions");return Promise.all([fetch(n).then(async l=>{if(!l.ok)throw new Error(`metadata ${l.status}`);return l.json()}),fetch(d).then(async l=>{if(!l.ok)throw new Error(`versions ${l.status}`);const i=await l.json(),f=Array.isArray(i)?i:(i==null?void 0:i.versions)??[],h=!Array.isArray(i)&&(i==null?void 0:i.unversioned)===!0,j=!Array.isArray(i)&&typeof(i==null?void 0:i.currentVersion)=="string"?i.currentVersion:null;return{list:f,unversioned:h,currentVersion:j}})]).then(([l,i])=>{if(e)return;y(l),S(i.list),Q(i.unversioned),te(i.currentVersion);const f=i.list.find(h=>h.isLatest)??i.list[0]??null;O(f?f.version:null),A(!1)}).catch(l=>{e||(V(l instanceof Error?l.message:String(l)),A(!1))}),()=>{e=!0}},[g,U]),c.useEffect(()=>{let e=!1;return G.getSkillInstallState(g).then(n=>{e||R(n)},()=>{if(!e){try{const n="vskill:installState:warned";typeof sessionStorage<"u"&&!sessionStorage.getItem(n)&&(sessionStorage.setItem(n,"1"),console.warn("[SkillDetailPanel] install-state fetch failed; falling back to optimistic not-installed UX"))}catch{}R(null)}}),()=>{e=!0}},[g,U]),c.useEffect(()=>{if(typeof window>"u")return;let e=null;const n=d=>{const l=d.detail;!(l!=null&&l.skill)||l.skill!==g||(e&&clearTimeout(e),e=setTimeout(()=>{G.getSkillInstallState(g).then(i=>R(i),()=>{})},50))};return window.addEventListener("studio:skill-installed",n),()=>{e&&clearTimeout(e),window.removeEventListener("studio:skill-installed",n)}},[g]),c.useEffect(()=>{function e(n){if(!(K.current||typeof document<"u"&&document.querySelector("[data-testid='settings-modal'], [data-testid='install-targets-modal'], [data-testid='clipboard-export-dialog']"))){if(n.key==="Escape")n.stopPropagation(),L();else if(n.key==="Tab"){const l=M.current;if(!l)return;const i=l.querySelectorAll('a[href], button:not([disabled]), input:not([disabled]), [tabindex]:not([tabindex="-1"])');if(i.length===0)return;const f=i[0],h=i[i.length-1],j=document.activeElement;n.shiftKey&&j===f?(n.preventDefault(),h.focus()):!n.shiftKey&&j===h&&(n.preventDefault(),f.focus())}}}return window.addEventListener("keydown",e,!0),()=>window.removeEventListener("keydown",e,!0)},[]);const L=c.useCallback(()=>{o();let e="";try{typeof window<"u"&&window.sessionStorage&&(e=window.sessionStorage.getItem("find-skills:last-query")??"")}catch{}typeof window<"u"&&window.dispatchEvent(new CustomEvent("openFindSkills",{detail:{query:e}}))},[o]),w=Re(s,r),E=(s==null?void 0:s.skillSlug)??r.slug,$=(s==null?void 0:s.displayName)??r.displayName??E,le=(s==null?void 0:s.isBlocked)===!0,F=c.useMemo(()=>v.length===0?[]:[...v].sort((n,d)=>{const l=n.publishedAt?Date.parse(n.publishedAt):0;return(d.publishedAt?Date.parse(d.publishedAt):0)-l}).slice(0,5),[v]),B=c.useMemo(()=>!x||F.length===0?!0:F[0].version===x,[x,F]),m=c.useMemo(()=>x?Be(w,E,B?null:x,k):null,[w,E,x,B,k]);c.useCallback(async()=>{if(!m||!m.ok)return;const e=await Y(m.command);Z(p,{skillName:g,version:x??"",q:"",ts:Date.now()});const n=e?`Run ${m.command} in your terminal`:"Copy failed — please copy the command manually.";if(u)try{u(n,e?"success":"error")}catch{}else I(n,e?"success":"error",3500)},[m,p,g,x,w,E,B,u]);const oe=c.useCallback(()=>{!m||!m.ok||_(!0)},[m]),ie=c.useCallback(e=>{const n=e.filter(f=>f.status==="error");if(n.length>0){const f=n[0],h=`Install finished with ${n.length} error${n.length===1?"":"s"}: ${f.detail??f.agentId}`;if(u)try{u(h,"error")}catch{}else I(h,"error",0);return}const d=e.filter(f=>f.status==="installed").length,l=e.filter(f=>f.status==="exported").length;if(d===0&&l===0){const f="Install finished without writing any selected target. Check the selected tool and try again.";if(u)try{u(f,"error")}catch{}else I(f,"error",0);return}if(typeof window<"u")try{window.dispatchEvent(new CustomEvent("studio:skill-installed",{detail:{skill:`${w}/${E}`,scope:k}}))}catch{}const i=l>0?`Installed ${$}; ${l} target${l===1?"":"s"} need paste.`:`Installed ${$} to ${d} target${d===1?"":"s"}.`;if(u)try{u(i,"success")}catch{}else I(i,"success",5e3)},[w,E,k,$,u]),ae=(s==null?void 0:s.trustTier)??"T1",de=(s==null?void 0:s.certTier)==="CERTIFIED"||(s==null?void 0:s.certTier)==="VERIFIED"?s.certTier:"VERIFIED";return t.jsxs(t.Fragment,{children:[t.jsxs("div",{ref:M,"data-testid":"skill-detail-panel",role:"dialog","aria-modal":"true","aria-label":`Skill detail — ${$}`,style:{position:"fixed",inset:0,zIndex:9998,display:"flex",alignItems:"flex-start",justifyContent:"center",paddingTop:"min(10vh, 80px)"},onClick:e=>{e.target===e.currentTarget&&L()},children:[t.jsx("div",{style:{position:"fixed",inset:0,background:"rgba(0,0,0,0.4)",backdropFilter:"blur(4px)"}}),t.jsxs("div",{onClick:e=>e.stopPropagation(),style:{position:"relative",width:"100%",maxWidth:720,margin:"0 1rem",background:"var(--bg-surface, #FFFFFF)",color:"var(--text-primary, #191919)",borderRadius:"8px",border:"1px solid var(--color-rule, #E8E1D6)",boxShadow:"0 20px 60px rgba(0,0,0,0.15)",overflow:"hidden",maxHeight:"80vh",display:"flex",flexDirection:"column"},children:[t.jsxs("div",{style:{padding:"0.75rem 1rem",borderBottom:"1px solid var(--color-rule, #E8E1D6)",display:"flex",alignItems:"center",justifyContent:"space-between",flexShrink:0},children:[t.jsx("button",{ref:P,type:"button",onClick:L,"data-testid":"skill-detail-back",style:{background:"transparent",border:"none",padding:"4px 8px",borderRadius:4,cursor:"pointer",fontFamily:"var(--font-mono, monospace)",fontSize:12,color:"var(--text-secondary, #5A5651)"},children:"← Back to results"}),t.jsx("kbd",{style:{fontFamily:"var(--font-mono, monospace)",fontSize:11,color:"var(--text-secondary, #5A5651)",border:"1px solid var(--color-rule, #E8E1D6)",borderRadius:4,padding:"1px 5px"},children:"Esc"})]}),t.jsxs("div",{style:{overflowY:"auto",padding:"1rem",flex:1},children:[T&&t.jsx("div",{"data-testid":"skill-detail-loading",style:{padding:"2rem",textAlign:"center",color:"var(--text-secondary, #5A5651)"},children:"Loading…"}),C&&!T&&t.jsxs("div",{"data-testid":"skill-detail-error",style:{padding:"1.5rem",textAlign:"center",fontFamily:"var(--font-mono, monospace)",fontSize:"0.875rem",color:"var(--red, #b54444)"},children:[t.jsxs("div",{style:{marginBottom:"0.75rem"},children:["Failed to load skill: ",C]}),t.jsx("button",{"data-testid":"skill-detail-retry",onClick:()=>ne(e=>e+1),style:{fontFamily:"var(--font-mono, monospace)",fontSize:"0.8125rem",padding:"0.4rem 1rem",borderRadius:4,border:"1px solid var(--color-rule, #E8E1D6)",background:"transparent",color:"var(--text-primary, #191919)",cursor:"pointer"},children:"Retry"})]}),!T&&!C&&t.jsxs(t.Fragment,{children:[t.jsxs("section",{"data-testid":"skill-detail-hero",style:{marginBottom:"1.25rem"},children:[t.jsx("h2",{style:{margin:"0 0 0.5rem",fontSize:"1.25rem",fontWeight:600},children:$}),(s==null?void 0:s.description)&&t.jsx("p",{style:{margin:"0 0 0.75rem",color:"var(--text-secondary, #5A5651)",fontSize:"0.875rem",lineHeight:1.5},children:s.description}),t.jsxs("div",{style:{display:"flex",flexWrap:"wrap",gap:"0.5rem",alignItems:"center"},children:[t.jsx(he,{tier:ae}),t.jsx(me,{tier:de,isTainted:s==null?void 0:s.isTainted}),t.jsx(ke,{repoUrl:(s==null?void 0:s.repoUrl)??null,skillName:E}),t.jsx(we,{skillName:g,repoUrl:s==null?void 0:s.repoUrl})]})]}),t.jsxs("section",{"data-testid":"skill-detail-versions",style:{marginBottom:"1.25rem"},children:[t.jsx("h3",{style:{margin:"0 0 0.5rem",fontSize:"0.8125rem",textTransform:"uppercase",letterSpacing:"0.06em",color:"var(--text-secondary, #5A5651)"},children:"Versions"}),F.length===0?J?t.jsxs("div",{"data-testid":"skill-detail-unversioned",style:{color:"var(--text-secondary, #5A5651)",fontSize:"0.8125rem"},children:["Discovered — no published version yet (currentVersion: ",ee??"unknown",")."]}):t.jsx("div",{"data-testid":"skill-detail-no-versions",style:{color:"var(--text-secondary, #5A5651)",fontSize:"0.8125rem"},children:"No versions found."}):t.jsx("ul",{style:{listStyle:"none",margin:0,padding:0,display:"flex",flexDirection:"column",gap:4},children:F.map(e=>{const n=e.version===x,d=e.publishedAt?e.publishedAt.slice(0,10):"",l=e.authorEmail??e.author??"";return t.jsx("li",{children:t.jsxs("button",{type:"button","data-testid":"skill-detail-version-row","data-version":e.version,"data-selected":n?"true":"false","aria-pressed":n,onClick:()=>O(e.version),style:{width:"100%",textAlign:"left",padding:"0.5rem 0.75rem",borderRadius:4,border:n?"1px solid var(--color-action, #2F5B8E)":"1px solid var(--color-rule, #E8E1D6)",background:n?"color-mix(in srgb, var(--color-action, #2F5B8E) 8%, transparent)":"transparent",cursor:"pointer",fontFamily:"var(--font-mono, monospace)",fontSize:"0.8125rem",color:"var(--text-primary, #191919)",display:"flex",alignItems:"center",gap:"0.5rem"},children:[t.jsx("span",{"aria-hidden":"true",style:{width:14,display:"inline-flex",justifyContent:"center"},children:n?"●":"○"}),t.jsxs("span",{style:{fontWeight:600},children:["v",e.version]}),d&&t.jsxs("span",{style:{color:"var(--text-secondary, #5A5651)"},children:["· ",d]}),l&&t.jsxs("span",{style:{color:"var(--text-secondary, #5A5651)"},children:["· ",l]}),n&&t.jsx("span",{"data-testid":"skill-detail-version-selected-tag",style:{marginLeft:"auto",fontSize:"0.6875rem",color:"var(--color-action, #2F5B8E)"},children:"Selected"})]})},e.version)})}),t.jsx("div",{style:{marginTop:"0.5rem",textAlign:"right"},children:t.jsx("a",{"data-testid":"skill-detail-see-all-versions",href:`${Ae}/skills/${r.owner}/${r.repo}/${r.slug}/versions`,target:"_blank",rel:"noopener noreferrer",style:{fontFamily:"var(--font-mono, monospace)",fontSize:"0.75rem",color:"var(--color-action, #2F5B8E)",textDecoration:"none"},children:"see all versions →"})})]}),le?t.jsxs("section",{"data-testid":"skill-detail-blocked",style:{marginBottom:"0.5rem"},children:[t.jsx("h3",{style:{margin:"0 0 0.5rem",fontSize:"0.8125rem",textTransform:"uppercase",letterSpacing:"0.06em",color:"var(--red, #b54444)"},children:"This skill is blocked"}),t.jsx("div",{style:{padding:"1rem",borderRadius:6,border:"1px solid var(--red, #b54444)",background:"var(--red-muted, color-mix(in srgb, #b54444 18%, transparent))",color:"var(--red, #b54444)",fontSize:"0.875rem"},children:(s==null?void 0:s.blockReason)??"This skill has been blocked by platform moderators and cannot be installed."})]}):m&&!m.ok?t.jsxs("section",{"data-testid":"skill-detail-install-error",style:{marginBottom:"0.5rem"},children:[t.jsx("h3",{style:{margin:"0 0 0.5rem",fontSize:"0.8125rem",textTransform:"uppercase",letterSpacing:"0.06em",color:"var(--red, #b54444)"},children:"Install command unavailable"}),t.jsxs("div",{style:{padding:"1rem",borderRadius:6,border:"1px solid var(--red, #b54444)",background:"var(--red-muted, color-mix(in srgb, #b54444 18%, transparent))",color:"var(--red, #b54444)",fontSize:"0.875rem"},children:[m.reason," — refusing to render the install panel for safety."]})]}):m&&m.ok?t.jsxs("section",{"data-testid":"skill-detail-install",style:{marginBottom:"0.5rem"},children:[t.jsx("h3",{style:{margin:"0 0 0.5rem",fontSize:"0.8125rem",textTransform:"uppercase",letterSpacing:"0.06em",color:"var(--text-secondary, #5A5651)"},children:"Install"}),t.jsxs("div",{role:"radiogroup","aria-label":"Install scope","data-testid":"skill-detail-install-scope",style:{display:"flex",gap:"0.5rem",alignItems:"center",marginBottom:"0.75rem",fontFamily:"var(--font-mono, monospace)",fontSize:"0.75rem",color:"var(--text-secondary, #5A5651)"},children:[t.jsx("span",{children:"Scope:"}),["project","user"].map(e=>{var H;const n=k===e,d=(H=b==null?void 0:b.scopes)==null?void 0:H[e],l=(d==null?void 0:d.installed)===!0,i=(b==null?void 0:b.detectedAgentTools)??[],f=i.map(z=>`./${z.localDir}`).join(", "),h=i.map(z=>z.globalDir).join(", "),j=(d==null?void 0:d.installedAgentTools)??[],ce=d!=null&&d.version?`Installed v${d.version} · ${j.join(", ")}`:`Installed · ${j.join(", ")}`,ue=e==="project"?f?`Will install to: ${f}`:"Install with --scope project":h?`Will install to: ${h}`:"Install with --global",fe=l?ce:ue,q=Le(e);return t.jsx("button",{type:"button",role:"radio","aria-checked":n,"aria-disabled":l,disabled:l,"data-testid":`skill-detail-install-scope-${e}`,"data-installed":l?"true":"false",title:fe,onClick:()=>{l||re(e)},style:{padding:"0.25rem 0.6rem",borderRadius:4,border:`1px solid ${n?"var(--text-primary, #191919)":"var(--color-rule, #E8E1D6)"}`,background:n?"var(--text-primary, #191919)":"transparent",color:n?"var(--bg-surface, #FFFFFF)":"var(--text-secondary, #5A5651)",cursor:l?"not-allowed":"pointer",opacity:l?.55:1,fontFamily:"var(--font-mono, monospace)",fontSize:"0.75rem",fontWeight:n?600:400},children:l?`Installed ✓ ${q}`:q},e)})]}),(()=>{var i;const e=(i=b==null?void 0:b.scopes)==null?void 0:i[k],n=(e==null?void 0:e.installed)===!0,d=e!=null&&e.version?` (v${e.version})`:"",l=`Already installed at ${k} — re-run via CLI to force`;return t.jsx("button",{type:"button",onClick:oe,disabled:n,"aria-disabled":n,"data-testid":"skill-detail-install-primary","data-installed":n?"true":"false","aria-label":n?"Already installed at the selected scope":"Install skill",title:n?l:void 0,style:{display:"inline-flex",alignItems:"center",marginBottom:"0.75rem",padding:"0.5rem 1rem",borderRadius:6,border:"1px solid var(--text-primary, #191919)",background:n?"var(--bg-surface, #FFFFFF)":"var(--text-primary, #191919)",color:n?"var(--text-secondary, #5A5651)":"var(--bg-surface, #FFFFFF)",cursor:n?"not-allowed":"pointer",opacity:n?.7:1,fontFamily:"var(--font-mono, monospace)",fontSize:"0.875rem",fontWeight:600},children:n?`✓ Installed${d}`:"Install"})})(),t.jsx("div",{"data-testid":"skill-detail-install-command",style:{display:"block"},children:t.jsx($e,{compact:!0,children:m.variants.map((e,n)=>t.jsxs("div",{"data-testid":`skill-detail-install-variant-${e.label}`,style:{display:"flex",gap:"0.75rem",alignItems:"flex-start",marginTop:n===0?0:"0.75rem"},children:[t.jsxs("div",{style:{flex:1,minWidth:0},children:[t.jsx("div",{style:{color:"#8B949E",marginBottom:"0.125rem"},children:e.comment}),t.jsxs("div",{children:[t.jsx("span",{style:{color:"#8B949E",marginRight:"0.5rem"},children:"$"}),t.jsx("span",{"data-testid":`skill-detail-install-variant-cmd-${e.label}`,children:e.command})]})]}),t.jsx("button",{type:"button",onClick:async()=>{const d=await Y(e.command),l=d?`Run ${e.command} in your terminal`:"Copy failed — please copy the command manually.";if(u)try{u(l,d?"success":"error")}catch{}else I(l,d?"success":"error",3500);d&&Z(p,{skillName:g,version:x??"",q:"",ts:Date.now()})},"data-testid":`skill-detail-copy-${e.label}`,"aria-label":`Copy ${e.label} install command`,style:{flexShrink:0,padding:"0.25rem 0.6rem",borderRadius:4,border:"1px solid color-mix(in srgb, #E6EDF3 25%, transparent)",background:"color-mix(in srgb, #E6EDF3 8%, transparent)",color:"#E6EDF3",cursor:"pointer",fontFamily:"var(--font-mono, monospace)",fontSize:"0.7rem",alignSelf:"flex-end"},children:"Copy"})]},e.label))})})]}):null]})]})]})]}),D&&t.jsx(ge,{skill:`${w}/${E}`,skillDisplayName:$,scope:k,targetVersion:x,activeAgentId:se,onClose:()=>_(!1),onSuccess:ie})]})}export{_e as SkillDetailPanel,_e as default};
@@ -1,2 +0,0 @@
1
- const __vite__mapDeps=(i,m=__vite__mapDeps,d=(m.f||(m.f=["assets/index-CUEYzTVL.js","assets/core-DZjBCfjp.js","assets/event-QtOCMXAv.js"])))=>i.map(i=>d[i]);
2
- import{r as v}from"./globals-hm1COkXX.js";const V="modulepreload",B=function(e){return"/"+e},U={},C=function(a,t,c){let s=Promise.resolve();if(t&&t.length>0){let o=function(d){return Promise.all(d.map(g=>Promise.resolve(g).then(y=>({status:"fulfilled",value:y}),y=>({status:"rejected",reason:y}))))};document.getElementsByTagName("link");const i=document.querySelector("meta[property=csp-nonce]"),l=(i==null?void 0:i.nonce)||(i==null?void 0:i.getAttribute("nonce"));s=o(t.map(d=>{if(d=B(d),d in U)return;U[d]=!0;const g=d.endsWith(".css"),y=g?'[rel="stylesheet"]':"";if(document.querySelector(`link[href="${d}"]${y}`))return;const w=document.createElement("link");if(w.rel=g?"stylesheet":V,g||(w.as="script"),w.crossOrigin="",w.href=d,l&&w.setAttribute("nonce",l),document.head.appendChild(w),g)return new Promise((k,S)=>{w.addEventListener("load",k),w.addEventListener("error",()=>S(new Error(`Unable to preload CSS for ${d}`)))})}))}function f(o){const i=new Event("vite:preloadError",{cancelable:!0});if(i.payload=o,window.dispatchEvent(i),!i.defaultPrevented)throw o}return s.then(o=>{for(const i of o||[])i.status==="rejected"&&f(i.reason);return a().catch(f)})};class _ extends Error{constructor(a){super(`${a} is not available in browser mode — install the Skill Studio desktop app.`),this.name="BrowserModeError"}}function $(){return typeof window>"u"?"browser":"__TAURI_INTERNALS__"in window?"desktop":"browser"}const h={version:1,general:{theme:"system",language:"auto",defaultProjectFolder:null,launchAtLogin:!1},updates:{channel:"stable",autoCheck:!0,lastCheckedAt:null,lastKnownVersion:null,skippedVersion:null,snoozedUntil:null},privacy:{telemetryEnabled:!1,crashReportingEnabled:!1},advanced:{logLevel:"info"},studio:{lifecycleDefault:"ask"}},A="vskill:preferences:browser-shadow";function R(e){const a=(e==null?void 0:e.general)??{},t=(e==null?void 0:e.updates)??{},c=(e==null?void 0:e.privacy)??{},s=(e==null?void 0:e.advanced)??{},f=(e==null?void 0:e.studio)??{};return{version:(e==null?void 0:e.version)??h.version,general:{theme:a.theme??h.general.theme,language:a.language??h.general.language,defaultProjectFolder:a.defaultProjectFolder??a.default_project_folder??null,launchAtLogin:a.launchAtLogin??a.launch_at_login??h.general.launchAtLogin},updates:{channel:t.channel??h.updates.channel,autoCheck:t.autoCheck??t.auto_check??h.updates.autoCheck,lastCheckedAt:t.lastCheckedAt??t.last_checked_at??null,lastKnownVersion:t.lastKnownVersion??t.last_known_version??null,skippedVersion:t.skippedVersion??t.skipped_version??null,snoozedUntil:t.snoozedUntil??t.snoozed_until??null},privacy:{telemetryEnabled:c.telemetryEnabled??c.telemetry_enabled??h.privacy.telemetryEnabled,crashReportingEnabled:c.crashReportingEnabled??c.crash_reporting_enabled??h.privacy.crashReportingEnabled},advanced:{logLevel:s.logLevel??s.log_level??h.advanced.logLevel},studio:{lifecycleDefault:f.lifecycleDefault??f.lifecycle_default??h.studio.lifecycleDefault}}}function z(e,a){return{available:e.available===!0,currentVersion:e.currentVersion??a,latestVersion:e.latestVersion??e.version??void 0,releaseNotes:e.releaseNotes??e.notes??void 0,releaseDate:e.releaseDate??e.pub_date??void 0}}function b(e){if(!e||typeof e.login!="string"||e.login.trim()==="")return null;const a=e.login.trim(),t=e.avatar_url??e.avatarUrl??`https://github.com/${encodeURIComponent(a)}.png?size=40`;return{login:a,avatar_url:t,email:e.email??null,cached_at:e.cached_at??null}}async function G(e){var c,s,f;if(typeof window>"u")return;const a=window,t=(c=a.__TAURI_INTERNALS__)==null?void 0:c.invoke;if(t)try{await t("open_external_url",{url:e});return}catch(o){console.warn("open_external_url command failed; falling back to shell open:",o)}try{const o=await fetch("/api/desktop/open-url",{method:"POST",headers:{"Content-Type":"application/json"},body:JSON.stringify({url:e})});if(o.ok)return;console.warn(`sidecar open-url failed: HTTP ${o.status}`)}catch(o){console.warn("sidecar open-url failed; falling back to shell open:",o)}try{const o=(f=(s=a.__TAURI__)==null?void 0:s.shell)==null?void 0:f.open;if(typeof o=="function"){await o(e);return}const{open:i}=await C(async()=>{const{open:l}=await import("./index-CUEYzTVL.js");return{open:l}},__vite__mapDeps([0,1]));await i(e);return}catch(o){console.warn("tauri shell open failed; falling back to window.open:",o)}window.open(e,"_blank","noopener,noreferrer")}async function H(e,a){if(typeof window>"u"||!("__TAURI_INTERNALS__"in window))return null;try{return await(await C(()=>import("./event-QtOCMXAv.js"),__vite__mapDeps([2,1]))).listen(e,a)}catch{return null}}function T(){try{const e=localStorage.getItem(A);return e?R(JSON.parse(e)):structuredClone(h)}catch{return structuredClone(h)}}function K(e){try{localStorage.setItem(A,JSON.stringify(e))}catch{}}function M(e,a,t){const c=a.split(".");let s=e;for(let f=0;f<c.length-1;f++){const o=c[f];(typeof s[o]!="object"||s[o]===null)&&(s[o]={}),s=s[o]}s[c[c.length-1]]=t}async function u(e,a){var s;const c=(s=window.__TAURI_INTERNALS__)==null?void 0:s.invoke;if(!c)throw new _(e);return c(e,a)}function te(){const[e]=v.useState(()=>$());return v.useMemo(()=>{const t=e==="desktop",c=async()=>{if(!t)return T();const n=await u("get_settings");return R(n)},s=async(n,r)=>{if(!t){const p=T();M(p,n,r),K(p),window.dispatchEvent(new CustomEvent("preferences-shadow-updated",{detail:{path:n,value:r}}));return}await u("set_setting",{key:n,value:r})},f=async()=>{if(!t){try{localStorage.removeItem(A)}catch{}window.dispatchEvent(new CustomEvent("preferences-shadow-reset"));return}await u("reset_settings")},o=async()=>{if(!t)throw new _("checkForUpdates");const[n,r]=await Promise.all([u("check_for_updates"),y().catch(()=>({version:"unknown",build:"n/a",commit:"n/a",target:"unknown",arch:"unknown"}))]);return z(n,r.version)},i=async n=>{if(!t)throw new _("downloadAndInstallUpdate");const r=n?await H("updater://progress",p=>{const m=p.payload??{},D=m.downloadedBytes??m.bytes??m.chunkBytes??0,N=m.totalBytes??m.total??null;n(D,N)}):null;try{await u("download_and_install_update")}finally{await(r==null?void 0:r())}},l=async()=>{if(!t)throw new _("cancelUpdate");await u("cancel_update")},d=async()=>{if(!t)throw new _("restartApp");await u("restart_app")},g=async n=>{if(!t){n&&(window.location.hash=`#${n}`);return}await u("open_preferences",{tab:n??null})},y=async()=>t?u("get_app_metadata"):{version:"browser",build:"n/a",commit:"n/a",target:navigator.platform||"browser",arch:"n/a"},w=async n=>{if(!t)throw new _("setAutostart");await u("set_autostart",{enabled:n})},k=async()=>{if(!t)throw new _("pickFolder");const n=await u("pick_default_project_folder");return(n==null?void 0:n.path)??null},S=async()=>{if(!t)throw new _("openLogsFolder");await u("open_logs_folder")},I=async()=>{if(!t)throw new _("revealSettingsFile");await u("reveal_settings_file")},L=async n=>{try{await navigator.clipboard.writeText(n)}catch{}},P=async()=>{const n=await fetch("/api/oauth/github/start",{method:"POST",headers:{"Content-Type":"application/json"},body:"{}"});if(!n.ok){const p=await n.text().catch(()=>"");throw new Error(`OAuth start failed: HTTP ${n.status}: ${p.slice(0,200)}`)}const r=await n.json();return{userCode:r.state,verificationUri:r.authUrl,interval:2,expiresIn:Math.max(60,Math.floor((r.expiresAt-Date.now())/1e3))}},F=async()=>{const n=window.__vskillOauthState;if(!n)return{status:"error",message:"no OAuth flow in progress"};try{const r=await fetch(`/api/oauth/github/status?state=${encodeURIComponent(n)}`);if(!r.ok)return{status:"error",message:`HTTP ${r.status}`};const p=await r.json(),m=b(p.user);return p.status==="ready"&&m?{status:"granted",user:m}:p.status==="pending"?{status:"pending"}:p.status==="expired"?{status:"expired"}:p.status==="error"?{status:"error",message:p.error??"unknown"}:{status:"pending"}}catch(r){return{status:"error",message:r instanceof Error?r.message:String(r)}}},O=async()=>{try{const n=await fetch("/api/auth/me");if(!n.ok)return null;const r=await n.json();return r.signedIn?b(r.user):null}catch{return null}},x=async()=>{await fetch("/api/auth/sign-out",{method:"POST"})},j=async()=>{if(!t)throw new _("pickProjectFolder");return await u("pick_default_project_folder")??null},q=async n=>t?u("get_repo_info",{folder:n}):{name:null,branch:null,is_private:null,sync_state:{kind:"no_remote"}},E={cache:null,localSkillCount:0,isFresh:!1,daysRemaining:0};return{mode:e,available:t,getSettings:c,setSetting:s,resetSettings:f,checkForUpdates:o,downloadAndInstallUpdate:i,cancelUpdate:l,restartApp:d,openPreferences:g,getAppMetadata:y,setAutostart:w,pickFolder:k,openLogsFolder:S,revealSettingsFile:I,copyToClipboard:L,startGithubDeviceFlow:P,pollGithubDeviceFlow:F,getSignedInUser:O,signOut:x,pickProjectFolder:j,getRepoInfo:q,quotaGet:async n=>t?await u("quota_get",{projectRoots:n}):{...E},quotaForceSync:async(n,r)=>t?await u("quota_force_sync",{projectRoots:n,fresh:r}):{...E},quotaCanCreateSkill:async n=>t?u("quota_can_create_skill",{projectRoots:n}):{blocked:!1,reason:"browser-mode",snapshot:{...E}},quotaReportCount:async n=>{if(t)try{await u("quota_report_count",{skillCount:n})}catch(r){console.warn("quotaReportCount failed:",r)}},openExternalUrl:async n=>{if(!t){typeof window<"u"&&window.open(n,"_blank","noopener,noreferrer");return}await G(n)},refreshUserIdentity:async()=>{if(!t)return null;const n=await u("refresh_user_identity");return b(n)}}},[e])}function ne(e){const[a,t]=v.useState(null),[c,s]=v.useState(null),[f,o]=v.useState(!0),i=v.useCallback(async()=>{o(!0),s(null);try{const l=await e.getSettings();t(l)}catch(l){s(l instanceof Error?l.message:String(l))}finally{o(!1)}},[e]);return v.useEffect(()=>{let l=!1;return(async()=>{try{const d=await e.getSettings();l||(t(d),o(!1))}catch(d){l||(s(d instanceof Error?d.message:String(d)),o(!1))}})(),()=>{l=!0}},[e]),v.useEffect(()=>{const l=()=>i();return window.addEventListener("preferences-shadow-updated",l),window.addEventListener("preferences-shadow-reset",l),()=>{window.removeEventListener("preferences-shadow-updated",l),window.removeEventListener("preferences-shadow-reset",l)}},[i]),{snapshot:a,error:c,loading:f,refresh:i}}export{C as _,ne as a,H as l,z as n,G as o,te as u};