@sky.ui/mcp 0.0.1

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 (184) hide show
  1. package/LICENSE.md +139 -0
  2. package/README.md +182 -0
  3. package/data/chart-api-sections.json +4185 -0
  4. package/data/component-tier.json +25 -0
  5. package/data/design-guidelines/p0-guidelines.json +13381 -0
  6. package/data/reactivity-readme-snapshot.json +1 -0
  7. package/data/theme-authoring-contract.json +598 -0
  8. package/data/utils-suggestion-snapshot.json +1 -0
  9. package/dist/cache.d.ts +3 -0
  10. package/dist/cache.d.ts.map +1 -0
  11. package/dist/cache.js +15 -0
  12. package/dist/cache.js.map +1 -0
  13. package/dist/catalog.d.ts +60 -0
  14. package/dist/catalog.d.ts.map +1 -0
  15. package/dist/catalog.js +343 -0
  16. package/dist/catalog.js.map +1 -0
  17. package/dist/cem.d.ts +26 -0
  18. package/dist/cem.d.ts.map +1 -0
  19. package/dist/cem.js +348 -0
  20. package/dist/cem.js.map +1 -0
  21. package/dist/chart-usage-tool.d.ts +20 -0
  22. package/dist/chart-usage-tool.d.ts.map +1 -0
  23. package/dist/chart-usage-tool.js +153 -0
  24. package/dist/chart-usage-tool.js.map +1 -0
  25. package/dist/component-docs-tool.d.ts +45 -0
  26. package/dist/component-docs-tool.d.ts.map +1 -0
  27. package/dist/component-docs-tool.js +217 -0
  28. package/dist/component-docs-tool.js.map +1 -0
  29. package/dist/component-method-filter.d.ts +3 -0
  30. package/dist/component-method-filter.d.ts.map +1 -0
  31. package/dist/component-method-filter.js +32 -0
  32. package/dist/component-method-filter.js.map +1 -0
  33. package/dist/component-tier.d.ts +20 -0
  34. package/dist/component-tier.d.ts.map +1 -0
  35. package/dist/component-tier.js +59 -0
  36. package/dist/component-tier.js.map +1 -0
  37. package/dist/component-usage-tool.d.ts +20 -0
  38. package/dist/component-usage-tool.d.ts.map +1 -0
  39. package/dist/component-usage-tool.js +90 -0
  40. package/dist/component-usage-tool.js.map +1 -0
  41. package/dist/design-guidelines/a11y-engine.d.ts +22 -0
  42. package/dist/design-guidelines/a11y-engine.d.ts.map +1 -0
  43. package/dist/design-guidelines/a11y-engine.js +78 -0
  44. package/dist/design-guidelines/a11y-engine.js.map +1 -0
  45. package/dist/design-guidelines/compatibility-engine.d.ts +20 -0
  46. package/dist/design-guidelines/compatibility-engine.d.ts.map +1 -0
  47. package/dist/design-guidelines/compatibility-engine.js +57 -0
  48. package/dist/design-guidelines/compatibility-engine.js.map +1 -0
  49. package/dist/design-guidelines/component-guideline-engine.d.ts +19 -0
  50. package/dist/design-guidelines/component-guideline-engine.d.ts.map +1 -0
  51. package/dist/design-guidelines/component-guideline-engine.js +40 -0
  52. package/dist/design-guidelines/component-guideline-engine.js.map +1 -0
  53. package/dist/design-guidelines/composition-engine.d.ts +10 -0
  54. package/dist/design-guidelines/composition-engine.d.ts.map +1 -0
  55. package/dist/design-guidelines/composition-engine.js +29 -0
  56. package/dist/design-guidelines/composition-engine.js.map +1 -0
  57. package/dist/design-guidelines/pattern-engine.d.ts +20 -0
  58. package/dist/design-guidelines/pattern-engine.d.ts.map +1 -0
  59. package/dist/design-guidelines/pattern-engine.js +58 -0
  60. package/dist/design-guidelines/pattern-engine.js.map +1 -0
  61. package/dist/design-guidelines/recommendation-engine.d.ts +11 -0
  62. package/dist/design-guidelines/recommendation-engine.d.ts.map +1 -0
  63. package/dist/design-guidelines/recommendation-engine.js +88 -0
  64. package/dist/design-guidelines/recommendation-engine.js.map +1 -0
  65. package/dist/design-guidelines/repository.d.ts +19 -0
  66. package/dist/design-guidelines/repository.d.ts.map +1 -0
  67. package/dist/design-guidelines/repository.js +71 -0
  68. package/dist/design-guidelines/repository.js.map +1 -0
  69. package/dist/design-guidelines/review-engine.d.ts +20 -0
  70. package/dist/design-guidelines/review-engine.d.ts.map +1 -0
  71. package/dist/design-guidelines/review-engine.js +179 -0
  72. package/dist/design-guidelines/review-engine.js.map +1 -0
  73. package/dist/design-guidelines/schema.d.ts +256 -0
  74. package/dist/design-guidelines/schema.d.ts.map +1 -0
  75. package/dist/design-guidelines/schema.js +124 -0
  76. package/dist/design-guidelines/schema.js.map +1 -0
  77. package/dist/design-guidelines/token-engine.d.ts +23 -0
  78. package/dist/design-guidelines/token-engine.d.ts.map +1 -0
  79. package/dist/design-guidelines/token-engine.js +119 -0
  80. package/dist/design-guidelines/token-engine.js.map +1 -0
  81. package/dist/docs-read.d.ts +28 -0
  82. package/dist/docs-read.d.ts.map +1 -0
  83. package/dist/docs-read.js +102 -0
  84. package/dist/docs-read.js.map +1 -0
  85. package/dist/docs.d.ts +73 -0
  86. package/dist/docs.d.ts.map +1 -0
  87. package/dist/docs.js +323 -0
  88. package/dist/docs.js.map +1 -0
  89. package/dist/example-site-doc-enrichment.d.ts +27 -0
  90. package/dist/example-site-doc-enrichment.d.ts.map +1 -0
  91. package/dist/example-site-doc-enrichment.js +171 -0
  92. package/dist/example-site-doc-enrichment.js.map +1 -0
  93. package/dist/example-site-fetch.d.ts +44 -0
  94. package/dist/example-site-fetch.d.ts.map +1 -0
  95. package/dist/example-site-fetch.js +255 -0
  96. package/dist/example-site-fetch.js.map +1 -0
  97. package/dist/framework-wrappers.d.ts +46 -0
  98. package/dist/framework-wrappers.d.ts.map +1 -0
  99. package/dist/framework-wrappers.js +131 -0
  100. package/dist/framework-wrappers.js.map +1 -0
  101. package/dist/mcp-response-truth.d.ts +18 -0
  102. package/dist/mcp-response-truth.d.ts.map +1 -0
  103. package/dist/mcp-response-truth.js +45 -0
  104. package/dist/mcp-response-truth.js.map +1 -0
  105. package/dist/mcp-runtime-status.d.ts +37 -0
  106. package/dist/mcp-runtime-status.d.ts.map +1 -0
  107. package/dist/mcp-runtime-status.js +96 -0
  108. package/dist/mcp-runtime-status.js.map +1 -0
  109. package/dist/mcp-stdio-entry.d.ts +3 -0
  110. package/dist/mcp-stdio-entry.d.ts.map +1 -0
  111. package/dist/mcp-stdio-entry.js +35 -0
  112. package/dist/mcp-stdio-entry.js.map +1 -0
  113. package/dist/mcp-tool-errors.d.ts +35 -0
  114. package/dist/mcp-tool-errors.d.ts.map +1 -0
  115. package/dist/mcp-tool-errors.js +42 -0
  116. package/dist/mcp-tool-errors.js.map +1 -0
  117. package/dist/parse-component-ast.d.ts +112 -0
  118. package/dist/parse-component-ast.d.ts.map +1 -0
  119. package/dist/parse-component-ast.js +695 -0
  120. package/dist/parse-component-ast.js.map +1 -0
  121. package/dist/post-endpoint-server.d.ts +19 -0
  122. package/dist/post-endpoint-server.d.ts.map +1 -0
  123. package/dist/post-endpoint-server.js +777 -0
  124. package/dist/post-endpoint-server.js.map +1 -0
  125. package/dist/reactivity-info.d.ts +22 -0
  126. package/dist/reactivity-info.d.ts.map +1 -0
  127. package/dist/reactivity-info.js +99 -0
  128. package/dist/reactivity-info.js.map +1 -0
  129. package/dist/reactivity-layer-tool.d.ts +18 -0
  130. package/dist/reactivity-layer-tool.d.ts.map +1 -0
  131. package/dist/reactivity-layer-tool.js +58 -0
  132. package/dist/reactivity-layer-tool.js.map +1 -0
  133. package/dist/reactivity-readme-topics.d.ts +46 -0
  134. package/dist/reactivity-readme-topics.d.ts.map +1 -0
  135. package/dist/reactivity-readme-topics.js +206 -0
  136. package/dist/reactivity-readme-topics.js.map +1 -0
  137. package/dist/read-only-tool-allowlist.d.ts +7 -0
  138. package/dist/read-only-tool-allowlist.d.ts.map +1 -0
  139. package/dist/read-only-tool-allowlist.js +17 -0
  140. package/dist/read-only-tool-allowlist.js.map +1 -0
  141. package/dist/server.d.ts +7 -0
  142. package/dist/server.d.ts.map +1 -0
  143. package/dist/server.js +786 -0
  144. package/dist/server.js.map +1 -0
  145. package/dist/source-read.d.ts +31 -0
  146. package/dist/source-read.d.ts.map +1 -0
  147. package/dist/source-read.js +213 -0
  148. package/dist/source-read.js.map +1 -0
  149. package/dist/theme-authoring/contract-schema.d.ts +191 -0
  150. package/dist/theme-authoring/contract-schema.d.ts.map +1 -0
  151. package/dist/theme-authoring/contract-schema.js +49 -0
  152. package/dist/theme-authoring/contract-schema.js.map +1 -0
  153. package/dist/theme-authoring/repository.d.ts +18 -0
  154. package/dist/theme-authoring/repository.d.ts.map +1 -0
  155. package/dist/theme-authoring/repository.js +55 -0
  156. package/dist/theme-authoring/repository.js.map +1 -0
  157. package/dist/theme-tool.d.ts +26 -0
  158. package/dist/theme-tool.d.ts.map +1 -0
  159. package/dist/theme-tool.js +312 -0
  160. package/dist/theme-tool.js.map +1 -0
  161. package/dist/utils-guide-topics.d.ts +39 -0
  162. package/dist/utils-guide-topics.d.ts.map +1 -0
  163. package/dist/utils-guide-topics.js +202 -0
  164. package/dist/utils-guide-topics.js.map +1 -0
  165. package/dist/utils-info.d.ts +75 -0
  166. package/dist/utils-info.d.ts.map +1 -0
  167. package/dist/utils-info.js +219 -0
  168. package/dist/utils-info.js.map +1 -0
  169. package/dist/utils-suggestion-grounding.d.ts +59 -0
  170. package/dist/utils-suggestion-grounding.d.ts.map +1 -0
  171. package/dist/utils-suggestion-grounding.js +267 -0
  172. package/dist/utils-suggestion-grounding.js.map +1 -0
  173. package/docs/agent-recipe-example-site.md +91 -0
  174. package/docs/ai-design-mcp-blueprint.md +75 -0
  175. package/docs/cross-model-mcp-playbook.md +127 -0
  176. package/docs/example-site-and-mcp-training.md +82 -0
  177. package/docs/mcp-capability-status.md +51 -0
  178. package/docs/mcp-tooling-roadmap.md +36 -0
  179. package/docs/sky-chart-option-api.md +47 -0
  180. package/docs/starter-prompt.md +17 -0
  181. package/docs/theme-config-guide.md +178 -0
  182. package/docs/utils-usage-guide.md +110 -0
  183. package/docs/vue-wrapper-v-model.md +36 -0
  184. package/package.json +63 -0
@@ -0,0 +1,119 @@
1
+ import { loadDesignGuidelines } from './repository.js';
2
+ import { extractThemeVariableNames } from '../source-read.js';
3
+ function tokenize(input) {
4
+ return input
5
+ .toLowerCase()
6
+ .split(/[^a-z0-9-]+/g)
7
+ .map((t) => t.trim())
8
+ .filter(Boolean);
9
+ }
10
+ function scoreIntent(semanticIntent, tokens) {
11
+ const hay = semanticIntent.toLowerCase();
12
+ let score = 0;
13
+ for (const token of tokens) {
14
+ if (hay === token)
15
+ score += 5;
16
+ else if (hay.includes(token))
17
+ score += 2;
18
+ }
19
+ return score;
20
+ }
21
+ function rankThemeTokensByIntent(intent, allThemeTokens, limit) {
22
+ const words = tokenize(intent);
23
+ const weighted = allThemeTokens
24
+ .map((token) => {
25
+ let score = 0;
26
+ const hay = token.toLowerCase();
27
+ for (const word of words) {
28
+ if (hay.includes(word))
29
+ score += 3;
30
+ }
31
+ if (hay.includes('primary') && words.some((w) => ['primary', 'action', 'cta'].includes(w)))
32
+ score += 4;
33
+ if (hay.includes('danger') && words.some((w) => ['danger', 'destructive', 'error'].includes(w)))
34
+ score += 4;
35
+ if (hay.includes('surface') && words.some((w) => ['surface', 'background', 'subtle'].includes(w)))
36
+ score += 4;
37
+ if (hay.includes('text') && words.some((w) => ['text', 'label', 'content'].includes(w)))
38
+ score += 2;
39
+ return { token, score };
40
+ })
41
+ .filter((row) => row.score > 0)
42
+ .sort((a, b) => b.score - a.score || a.token.localeCompare(b.token));
43
+ return weighted.slice(0, limit).map((row) => row.token);
44
+ }
45
+ export function suggestTokensForIntent(input) {
46
+ const loaded = loadDesignGuidelines();
47
+ if (!loaded.ok)
48
+ return { ok: false, error: loaded.error };
49
+ const intent = input.intent?.trim();
50
+ if (!intent)
51
+ return { ok: false, error: 'intent must be a non-empty string.' };
52
+ const theme = input.theme ?? 'light';
53
+ const limit = input.limit ?? 5;
54
+ const tokens = tokenize(intent);
55
+ const extracted = extractThemeVariableNames(1000);
56
+ const themeTokens = extracted.ok ? extracted.variables : [];
57
+ const ranked = loaded.data.raw.tokens
58
+ .map((row) => ({ row, score: scoreIntent(row.semanticIntent, tokens) }))
59
+ .filter((row) => row.score > 0)
60
+ .sort((a, b) => b.score - a.score || a.row.semanticIntent.localeCompare(b.row.semanticIntent))
61
+ .slice(0, limit)
62
+ .map((row) => {
63
+ const fromTheme = rankThemeTokensByIntent(row.row.semanticIntent, themeTokens, Math.max(2, limit));
64
+ return {
65
+ semanticIntent: row.row.semanticIntent,
66
+ score: row.score,
67
+ suggestedTokens: fromTheme.length > 0 ? fromTheme : row.row.tokenSet[theme],
68
+ forbiddenCombos: row.row.forbiddenCombos,
69
+ minContrast: row.row.minContrast,
70
+ densityMapping: row.row.densityMapping
71
+ };
72
+ });
73
+ return {
74
+ ok: true,
75
+ body: {
76
+ schemaVersion: loaded.data.schemaVersion,
77
+ intent,
78
+ theme,
79
+ sourceOfTruth: 'sky-theme-provider',
80
+ sourceHint: extracted.ok ? extracted.sourceHint : extracted.error,
81
+ suggestions: ranked
82
+ }
83
+ };
84
+ }
85
+ export function resolveTokenUsage(input) {
86
+ const loaded = loadDesignGuidelines();
87
+ if (!loaded.ok)
88
+ return { ok: false, error: loaded.error };
89
+ const semanticIntent = input.semantic_intent?.trim();
90
+ if (!semanticIntent)
91
+ return { ok: false, error: 'semantic_intent must be a non-empty string.' };
92
+ const theme = input.theme ?? 'light';
93
+ const density = (input.density ?? 'comfortable').toLowerCase();
94
+ const target = loaded.data.raw.tokens.find((row) => row.semanticIntent.toLowerCase() === semanticIntent.toLowerCase());
95
+ if (!target) {
96
+ return { ok: false, error: `No token guideline entry found for semantic intent: ${semanticIntent}` };
97
+ }
98
+ const extracted = extractThemeVariableNames(1000);
99
+ const themeTokens = extracted.ok ? extracted.variables : [];
100
+ const resolvedFromTheme = rankThemeTokensByIntent(target.semanticIntent, themeTokens, 6);
101
+ return {
102
+ ok: true,
103
+ body: {
104
+ schemaVersion: loaded.data.schemaVersion,
105
+ semanticIntent: target.semanticIntent,
106
+ theme,
107
+ resolvedTokens: resolvedFromTheme.length > 0 ? resolvedFromTheme : target.tokenSet[theme],
108
+ forbiddenCombos: target.forbiddenCombos,
109
+ minContrast: target.minContrast,
110
+ sourceOfTruth: 'sky-theme-provider',
111
+ sourceHint: extracted.ok ? extracted.sourceHint : extracted.error,
112
+ density: {
113
+ requested: density,
114
+ mapped: target.densityMapping[density] ?? target.densityMapping.comfortable ?? null
115
+ }
116
+ }
117
+ };
118
+ }
119
+ //# sourceMappingURL=token-engine.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"token-engine.js","sourceRoot":"","sources":["../../src/design-guidelines/token-engine.ts"],"names":[],"mappings":"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"}
@@ -0,0 +1,28 @@
1
+ /** Human-readable guide for `userTheme` / `ThemeModeConfig` keys (`get_docs`). */
2
+ export declare const THEME_CONFIG_GUIDE_RELATIVE_PATH = "packages/mcp/docs/theme-config-guide.md";
3
+ /** Cross-model routing, token discipline, and improvement checklist (`get_docs`). */
4
+ export declare const CROSS_MODEL_MCP_PLAYBOOK_RELATIVE_PATH = "packages/mcp/docs/cross-model-mcp-playbook.md";
5
+ /** One-block paste prompt for new sessions (`get_docs`). */
6
+ export declare const STARTER_PROMPT_RELATIVE_PATH = "packages/mcp/docs/starter-prompt.md";
7
+ /** Unified checklist for all `/api/mcp/component/{id}` pages (`get_docs`). */
8
+ export declare const AGENT_RECIPE_EXAMPLE_SITE_RELATIVE_PATH = "packages/mcp/docs/agent-recipe-example-site.md";
9
+ /** sky-chart `type` + ECharts-shaped `option` field guide for assistants (`get_docs`). */
10
+ export declare const SKY_CHART_OPTION_API_GUIDE_RELATIVE_PATH = "packages/mcp/docs/sky-chart-option-api.md";
11
+ /** Vue `@sky.ui/vue` wrappers — v-model support and usage patterns (`get_docs`). */
12
+ export declare const VUE_WRAPPER_VMODEL_GUIDE_RELATIVE_PATH = "packages/mcp/docs/vue-wrapper-v-model.md";
13
+ /** Default `max_bytes` when omitted (keeps MCP responses smaller for agent sessions; callers can pass a higher value). */
14
+ export declare const DEFAULT_GET_DOCS_MAX_BYTES = 200000;
15
+ export declare function getDocsPage(path: string, options?: {
16
+ max_bytes?: number;
17
+ }): {
18
+ ok: true;
19
+ path: string;
20
+ mimeType: string;
21
+ content: string;
22
+ truncated: boolean;
23
+ } | {
24
+ ok: false;
25
+ error: string;
26
+ };
27
+ export declare function listDocsPaths(): string[];
28
+ //# sourceMappingURL=docs-read.d.ts.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"docs-read.d.ts","sourceRoot":"","sources":["../src/docs-read.ts"],"names":[],"mappings":"AAQA,kFAAkF;AAClF,eAAO,MAAM,gCAAgC,4CAA4C,CAAC;AAE1F,qFAAqF;AACrF,eAAO,MAAM,sCAAsC,kDAAkD,CAAC;AAEtG,4DAA4D;AAC5D,eAAO,MAAM,4BAA4B,wCAAwC,CAAC;AAElF,8EAA8E;AAC9E,eAAO,MAAM,uCAAuC,mDAAmD,CAAC;AAExG,0FAA0F;AAC1F,eAAO,MAAM,wCAAwC,8CAA8C,CAAC;AAEpG,oFAAoF;AACpF,eAAO,MAAM,sCAAsC,6CAA6C,CAAC;AAsDjG,0HAA0H;AAC1H,eAAO,MAAM,0BAA0B,SAAU,CAAC;AAElD,wBAAgB,WAAW,CACzB,IAAI,EAAE,MAAM,EACZ,OAAO,CAAC,EAAE;IAAE,SAAS,CAAC,EAAE,MAAM,CAAA;CAAE,GAC/B;IAAE,EAAE,EAAE,IAAI,CAAC;IAAC,IAAI,EAAE,MAAM,CAAC;IAAC,QAAQ,EAAE,MAAM,CAAC;IAAC,OAAO,EAAE,MAAM,CAAC;IAAC,SAAS,EAAE,OAAO,CAAA;CAAE,GAAG;IAAE,EAAE,EAAE,KAAK,CAAC;IAAC,KAAK,EAAE,MAAM,CAAA;CAAE,CA2BlH;AAED,wBAAgB,aAAa,IAAI,MAAM,EAAE,CAExC"}
@@ -0,0 +1,102 @@
1
+ import { existsSync, readFileSync, statSync } from 'node:fs';
2
+ import { normalize, relative, resolve } from 'node:path';
3
+ import { packagesDir } from './catalog.js';
4
+ function monorepoRoot() {
5
+ return resolve(packagesDir(), '..');
6
+ }
7
+ /** Human-readable guide for `userTheme` / `ThemeModeConfig` keys (`get_docs`). */
8
+ export const THEME_CONFIG_GUIDE_RELATIVE_PATH = 'packages/mcp/docs/theme-config-guide.md';
9
+ /** Cross-model routing, token discipline, and improvement checklist (`get_docs`). */
10
+ export const CROSS_MODEL_MCP_PLAYBOOK_RELATIVE_PATH = 'packages/mcp/docs/cross-model-mcp-playbook.md';
11
+ /** One-block paste prompt for new sessions (`get_docs`). */
12
+ export const STARTER_PROMPT_RELATIVE_PATH = 'packages/mcp/docs/starter-prompt.md';
13
+ /** Unified checklist for all `/api/mcp/component/{id}` pages (`get_docs`). */
14
+ export const AGENT_RECIPE_EXAMPLE_SITE_RELATIVE_PATH = 'packages/mcp/docs/agent-recipe-example-site.md';
15
+ /** sky-chart `type` + ECharts-shaped `option` field guide for assistants (`get_docs`). */
16
+ export const SKY_CHART_OPTION_API_GUIDE_RELATIVE_PATH = 'packages/mcp/docs/sky-chart-option-api.md';
17
+ /** Vue `@sky.ui/vue` wrappers — v-model support and usage patterns (`get_docs`). */
18
+ export const VUE_WRAPPER_VMODEL_GUIDE_RELATIVE_PATH = 'packages/mcp/docs/vue-wrapper-v-model.md';
19
+ /**
20
+ * Allowed doc paths relative to monorepo root (prefix match after normalization).
21
+ * Keep to markdown under known public docs / fixture READMEs only.
22
+ */
23
+ const ALLOWED_PREFIXES = [
24
+ 'README.md',
25
+ 'packages/main/README.md',
26
+ 'packages/mcp/README.md',
27
+ THEME_CONFIG_GUIDE_RELATIVE_PATH,
28
+ CROSS_MODEL_MCP_PLAYBOOK_RELATIVE_PATH,
29
+ STARTER_PROMPT_RELATIVE_PATH,
30
+ AGENT_RECIPE_EXAMPLE_SITE_RELATIVE_PATH,
31
+ SKY_CHART_OPTION_API_GUIDE_RELATIVE_PATH,
32
+ VUE_WRAPPER_VMODEL_GUIDE_RELATIVE_PATH,
33
+ 'packages/mcp/docs/example-site-and-mcp-training.md',
34
+ 'packages/mcp/docs/utils-usage-guide.md',
35
+ 'packages/react/README.md',
36
+ 'packages/reactivity/README.md',
37
+ 'packages/vue/README.md',
38
+ 'test/README.md',
39
+ 'test/mcp/README.md',
40
+ 'test/parcel/main/README.md',
41
+ 'test/parcel/react/README.md',
42
+ 'test/parcel/vue/README.md',
43
+ 'test/rolldown/main/README.md',
44
+ 'test/rolldown/react/README.md',
45
+ 'test/rolldown/vue/README.md',
46
+ 'test/rollup/main/README.md',
47
+ 'test/rollup/react/README.md',
48
+ 'test/rollup/vue/README.md',
49
+ 'test/vite/main/README.md',
50
+ 'test/vite/react/README.md',
51
+ 'test/vite/vue/README.md',
52
+ 'test/webpack/main/README.md',
53
+ 'test/webpack/react/README.md',
54
+ 'test/webpack/vue/README.md'
55
+ ];
56
+ function normalizeDocPath(input) {
57
+ let p = input.trim().replace(/^[/\\]+/, '');
58
+ p = normalize(p).replace(/\\/g, '/');
59
+ if (p.startsWith('../') || p.includes('/../')) {
60
+ return '';
61
+ }
62
+ return p;
63
+ }
64
+ function isAllowed(relativePath) {
65
+ if (!relativePath || relativePath.includes('..'))
66
+ return false;
67
+ return ALLOWED_PREFIXES.some((pre) => relativePath === pre || relativePath.startsWith(pre + '/'));
68
+ }
69
+ /** Default `max_bytes` when omitted (keeps MCP responses smaller for agent sessions; callers can pass a higher value). */
70
+ export const DEFAULT_GET_DOCS_MAX_BYTES = 200_000;
71
+ export function getDocsPage(path, options) {
72
+ const maxBytes = options?.max_bytes ?? DEFAULT_GET_DOCS_MAX_BYTES;
73
+ const root = monorepoRoot();
74
+ const rel = normalizeDocPath(path);
75
+ if (!rel) {
76
+ return { ok: false, error: 'Invalid or unsafe path.' };
77
+ }
78
+ if (!isAllowed(rel)) {
79
+ return {
80
+ ok: false,
81
+ error: `Path not allowed. Allowed paths: ${ALLOWED_PREFIXES.join(', ')}`
82
+ };
83
+ }
84
+ const abs = resolve(root, rel);
85
+ const relToRoot = relative(resolve(root), abs);
86
+ if (relToRoot.startsWith('..') || relToRoot === '..') {
87
+ return { ok: false, error: 'Path escapes repository root.' };
88
+ }
89
+ if (!existsSync(abs) || !statSync(abs).isFile()) {
90
+ return { ok: false, error: `Documentation file not found: ${rel}` };
91
+ }
92
+ const st = statSync(abs);
93
+ const raw = readFileSync(abs, 'utf8');
94
+ const truncated = st.size > maxBytes;
95
+ const content = truncated ? raw.slice(0, maxBytes) + '\n… [truncated]' : raw;
96
+ const mime = rel.endsWith('.md') ? 'text/markdown' : 'text/plain';
97
+ return { ok: true, path: rel, mimeType: mime, content, truncated };
98
+ }
99
+ export function listDocsPaths() {
100
+ return [...ALLOWED_PREFIXES];
101
+ }
102
+ //# sourceMappingURL=docs-read.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"docs-read.js","sourceRoot":"","sources":["../src/docs-read.ts"],"names":[],"mappings":"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"}
package/dist/docs.d.ts ADDED
@@ -0,0 +1,73 @@
1
+ import { type ComponentDocumentation } from './parse-component-ast.js';
2
+ export type { ComponentDocumentation };
3
+ export type SkyComponentDocsOptions = {
4
+ maxCharsPerExample?: number;
5
+ includeRawLead?: boolean;
6
+ /** When false (default), omit browser/Lit lifecycle names from `methods` (consumer API for AI). */
7
+ includeInternalLifecycleMethods?: boolean;
8
+ };
9
+ export type ComponentDocsResult = {
10
+ doc: ComponentDocumentation;
11
+ /** True when one or more @example bodies were truncated */
12
+ truncatedExamples: boolean;
13
+ /**
14
+ * `ast` when TypeScript source was parsed (authoritative); CEM may supplement members missing from AST.
15
+ * `cem` when only `custom-elements.json` was used (no source file, or AST parse failed).
16
+ */
17
+ dataSource: 'cem' | 'ast';
18
+ };
19
+ export declare function getSkyComponentDocs(nameInput: string, options?: SkyComponentDocsOptions): {
20
+ ok: true;
21
+ result: ComponentDocsResult;
22
+ } | {
23
+ ok: false;
24
+ error: string;
25
+ };
26
+ export type SearchHit = {
27
+ name: string;
28
+ npmImport: string;
29
+ summary: string | null;
30
+ };
31
+ export type ApiSearchHit = {
32
+ name: string;
33
+ npmImport: string;
34
+ summary?: string;
35
+ score?: number;
36
+ matched: {
37
+ properties: string[];
38
+ events: string[];
39
+ slots: string[];
40
+ };
41
+ };
42
+ export declare function searchSkyComponents(query: string, limit: number): {
43
+ ok: true;
44
+ hits: SearchHit[];
45
+ } | {
46
+ ok: false;
47
+ error: string;
48
+ };
49
+ export declare function searchComponentsByApi(query: string, limit: number): {
50
+ ok: true;
51
+ hits: ApiSearchHit[];
52
+ } | {
53
+ ok: false;
54
+ error: string;
55
+ };
56
+ export declare function searchComponentsByApiBatch(queries: string[], limitPerQuery: number): {
57
+ ok: true;
58
+ results: Array<{
59
+ query: string;
60
+ hits: ApiSearchHit[];
61
+ }>;
62
+ } | {
63
+ ok: false;
64
+ error: string;
65
+ };
66
+ export declare function frameworkWrapperImport(framework: 'react' | 'vue', nameInput: string): {
67
+ ok: true;
68
+ import: string;
69
+ } | {
70
+ ok: false;
71
+ error: string;
72
+ };
73
+ //# sourceMappingURL=docs.d.ts.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"docs.d.ts","sourceRoot":"","sources":["../src/docs.ts"],"names":[],"mappings":"AAYA,OAAO,EAIL,KAAK,sBAAsB,EAC5B,MAAM,0BAA0B,CAAC;AAGlC,YAAY,EAAE,sBAAsB,EAAE,CAAC;AAEvC,MAAM,MAAM,uBAAuB,GAAG;IACpC,kBAAkB,CAAC,EAAE,MAAM,CAAC;IAC5B,cAAc,CAAC,EAAE,OAAO,CAAC;IACzB,mGAAmG;IACnG,+BAA+B,CAAC,EAAE,OAAO,CAAC;CAC3C,CAAC;AAeF,MAAM,MAAM,mBAAmB,GAAG;IAChC,GAAG,EAAE,sBAAsB,CAAC;IAC5B,2DAA2D;IAC3D,iBAAiB,EAAE,OAAO,CAAC;IAC3B;;;OAGG;IACH,UAAU,EAAE,KAAK,GAAG,KAAK,CAAC;CAC3B,CAAC;AA8JF,wBAAgB,mBAAmB,CACjC,SAAS,EAAE,MAAM,EACjB,OAAO,CAAC,EAAE,uBAAuB,GAChC;IAAE,EAAE,EAAE,IAAI,CAAC;IAAC,MAAM,EAAE,mBAAmB,CAAA;CAAE,GAAG;IAAE,EAAE,EAAE,KAAK,CAAC;IAAC,KAAK,EAAE,MAAM,CAAA;CAAE,CAG1E;AAED,MAAM,MAAM,SAAS,GAAG;IACtB,IAAI,EAAE,MAAM,CAAC;IACb,SAAS,EAAE,MAAM,CAAC;IAClB,OAAO,EAAE,MAAM,GAAG,IAAI,CAAC;CACxB,CAAC;AAEF,MAAM,MAAM,YAAY,GAAG;IACzB,IAAI,EAAE,MAAM,CAAC;IACb,SAAS,EAAE,MAAM,CAAC;IAClB,OAAO,CAAC,EAAE,MAAM,CAAC;IACjB,KAAK,CAAC,EAAE,MAAM,CAAC;IACf,OAAO,EAAE;QACP,UAAU,EAAE,MAAM,EAAE,CAAC;QACrB,MAAM,EAAE,MAAM,EAAE,CAAC;QACjB,KAAK,EAAE,MAAM,EAAE,CAAC;KACjB,CAAC;CACH,CAAC;AAEF,wBAAgB,mBAAmB,CAAC,KAAK,EAAE,MAAM,EAAE,KAAK,EAAE,MAAM,GAAG;IAAE,EAAE,EAAE,IAAI,CAAC;IAAC,IAAI,EAAE,SAAS,EAAE,CAAA;CAAE,GAAG;IAAE,EAAE,EAAE,KAAK,CAAC;IAAC,KAAK,EAAE,MAAM,CAAA;CAAE,CAuChI;AAED,wBAAgB,qBAAqB,CACnC,KAAK,EAAE,MAAM,EACb,KAAK,EAAE,MAAM,GACZ;IAAE,EAAE,EAAE,IAAI,CAAC;IAAC,IAAI,EAAE,YAAY,EAAE,CAAA;CAAE,GAAG;IAAE,EAAE,EAAE,KAAK,CAAC;IAAC,KAAK,EAAE,MAAM,CAAA;CAAE,CA6CnE;AAuBD,wBAAgB,0BAA0B,CACxC,OAAO,EAAE,MAAM,EAAE,EACjB,aAAa,EAAE,MAAM,GACpB;IAAE,EAAE,EAAE,IAAI,CAAC;IAAC,OAAO,EAAE,KAAK,CAAC;QAAE,KAAK,EAAE,MAAM,CAAC;QAAC,IAAI,EAAE,YAAY,EAAE,CAAA;KAAE,CAAC,CAAA;CAAE,GAAG;IAAE,EAAE,EAAE,KAAK,CAAC;IAAC,KAAK,EAAE,MAAM,CAAA;CAAE,CAqDtG;AAED,wBAAgB,sBAAsB,CAAC,SAAS,EAAE,OAAO,GAAG,KAAK,EAAE,SAAS,EAAE,MAAM,GAAG;IAAE,EAAE,EAAE,IAAI,CAAC;IAAC,MAAM,EAAE,MAAM,CAAA;CAAE,GAAG;IAAE,EAAE,EAAE,KAAK,CAAC;IAAC,KAAK,EAAE,MAAM,CAAA;CAAE,CAUjJ"}
package/dist/docs.js ADDED
@@ -0,0 +1,323 @@
1
+ import { readFileSync, existsSync, statSync } from 'node:fs';
2
+ import { join } from 'node:path';
3
+ import * as ts from 'typescript';
4
+ import { loadSkyComponentsCached, packagesDir, resolveComponentEntry, resolveMainPackageRoot, resolveMainProPackageRoot } from './catalog.js';
5
+ import { getCached } from './cache.js';
6
+ import { declarationToComponentDocumentation, findCemDeclaration, getCemSummaryForTag, isCemManifestPresent } from './cem.js';
7
+ import { collectNamedTypeDefinitions, parseLitComponentDocumentation, parseSummaryOnly } from './parse-component-ast.js';
8
+ import { isConsumerFacingComponentMethod } from './component-method-filter.js';
9
+ function applyMethodsVisibilityFilter(doc, includeInternalLifecycleMethods) {
10
+ if (includeInternalLifecycleMethods) {
11
+ return doc;
12
+ }
13
+ return {
14
+ ...doc,
15
+ methods: doc.methods.filter((m) => isConsumerFacingComponentMethod(m.name))
16
+ };
17
+ }
18
+ function componentSrcRootCandidates(entry) {
19
+ const out = [];
20
+ if (entry.tier === 'pro') {
21
+ const proRoot = resolveMainProPackageRoot();
22
+ if (proRoot)
23
+ out.push(join(proRoot, 'src'));
24
+ out.push(join(packagesDir(), 'main-pro', 'src'));
25
+ }
26
+ else {
27
+ const mainRoot = resolveMainPackageRoot();
28
+ if (mainRoot)
29
+ out.push(join(mainRoot, 'src'));
30
+ out.push(join(packagesDir(), 'main', 'src'));
31
+ }
32
+ return out;
33
+ }
34
+ function componentMainSourcePath(entry) {
35
+ const rel = join(entry.name, `${entry.name}.ts`);
36
+ const roots = componentSrcRootCandidates(entry);
37
+ for (const root of roots) {
38
+ const p = join(root, rel);
39
+ if (existsSync(p))
40
+ return p;
41
+ }
42
+ return join(roots[0], rel);
43
+ }
44
+ /** When both AST and CEM exist, keep AST order and values; append CEM-only members (e.g. attribute-only fields). */
45
+ function supplementAstWithUniqueCemMembers(ast, cem) {
46
+ if (cem.length === 0)
47
+ return ast;
48
+ const seen = new Set(ast.map((x) => x.name));
49
+ const out = [...ast];
50
+ for (const c of cem) {
51
+ if (!seen.has(c.name)) {
52
+ seen.add(c.name);
53
+ out.push(c);
54
+ }
55
+ }
56
+ return out;
57
+ }
58
+ function getSkyComponentDocsImpl(nameInput, options) {
59
+ const loaded = loadSkyComponentsCached();
60
+ if (!loaded.ok) {
61
+ return { ok: false, error: loaded.error };
62
+ }
63
+ const resolved = resolveComponentEntry(nameInput, loaded.components);
64
+ if (!resolved) {
65
+ return { ok: false, error: `Unknown component: ${nameInput}` };
66
+ }
67
+ const hit = resolved.entry;
68
+ const sourcePath = componentMainSourcePath(hit);
69
+ const maxEx = options?.maxCharsPerExample ?? 12_000;
70
+ const cemHit = findCemDeclaration(hit.name);
71
+ let raw = null;
72
+ if (existsSync(sourcePath)) {
73
+ try {
74
+ const st = statSync(sourcePath);
75
+ if (st.size > 600_000) {
76
+ return { ok: false, error: `Source file too large (${st.size} bytes); skip docs extraction.` };
77
+ }
78
+ raw = readFileSync(sourcePath, 'utf8');
79
+ }
80
+ catch (e) {
81
+ const msg = e instanceof Error ? e.message : String(e);
82
+ return { ok: false, error: `Failed to read source: ${msg}` };
83
+ }
84
+ }
85
+ const cemDoc = cemHit == null
86
+ ? null
87
+ : declarationToComponentDocumentation(hit.name, hit.name, hit.npmImport, cemHit.modulePath, cemHit.declaration, hit.tier === 'pro' ? 'main-pro' : 'main');
88
+ if (raw) {
89
+ const parsed = parseLitComponentDocumentation(sourcePath, raw, hit.name, hit.npmImport, {
90
+ maxCharsPerExample: maxEx
91
+ });
92
+ if (parsed.ok) {
93
+ let doc = { ...parsed.doc, dataSource: 'ast' };
94
+ if (!options?.includeRawLead) {
95
+ delete doc.rawLeadTrivia;
96
+ }
97
+ if (cemDoc) {
98
+ doc = {
99
+ ...doc,
100
+ properties: supplementAstWithUniqueCemMembers(doc.properties, cemDoc.properties),
101
+ events: supplementAstWithUniqueCemMembers(doc.events, cemDoc.events),
102
+ slots: supplementAstWithUniqueCemMembers(doc.slots, cemDoc.slots),
103
+ cssParts: supplementAstWithUniqueCemMembers(doc.cssParts, cemDoc.cssParts),
104
+ methods: supplementAstWithUniqueCemMembers(doc.methods, cemDoc.methods),
105
+ examples: doc.examples.length > 0 ? doc.examples : cemDoc.examples
106
+ };
107
+ }
108
+ const sf = ts.createSourceFile(sourcePath, raw, ts.ScriptTarget.Latest, true, ts.ScriptKind.TS);
109
+ const typeDefsFromMerged = collectNamedTypeDefinitions(sf, doc);
110
+ if (typeDefsFromMerged && typeDefsFromMerged.length > 0) {
111
+ doc = { ...doc, typeDefinitions: typeDefsFromMerged };
112
+ }
113
+ else if (parsed.doc.typeDefinitions && parsed.doc.typeDefinitions.length > 0) {
114
+ doc = { ...doc, typeDefinitions: parsed.doc.typeDefinitions };
115
+ }
116
+ const filteredDoc = applyMethodsVisibilityFilter(doc, options?.includeInternalLifecycleMethods);
117
+ return {
118
+ ok: true,
119
+ result: {
120
+ doc: filteredDoc,
121
+ truncatedExamples: parsed.truncated,
122
+ dataSource: 'ast'
123
+ }
124
+ };
125
+ }
126
+ if (cemDoc) {
127
+ const filteredDoc = applyMethodsVisibilityFilter(cemDoc, options?.includeInternalLifecycleMethods);
128
+ return {
129
+ ok: true,
130
+ result: {
131
+ doc: filteredDoc,
132
+ truncatedExamples: false,
133
+ dataSource: 'cem'
134
+ }
135
+ };
136
+ }
137
+ return { ok: false, error: parsed.error };
138
+ }
139
+ if (cemDoc) {
140
+ const filteredDoc = applyMethodsVisibilityFilter(cemDoc, options?.includeInternalLifecycleMethods);
141
+ return {
142
+ ok: true,
143
+ result: {
144
+ doc: filteredDoc,
145
+ truncatedExamples: false,
146
+ dataSource: 'cem'
147
+ }
148
+ };
149
+ }
150
+ return {
151
+ ok: false,
152
+ error: `No docs source found for ${hit.name}. Needs custom-elements.json (run build:main / build:main-pro) or monorepo source under packages/${hit.tier === 'pro' ? 'main-pro' : 'main'}/src. ` +
153
+ `Set SKY_UI_CORE${hit.tier === 'pro' ? '_PRO' : ''}_PACKAGE_ROOT to a built package if MCP runs outside the monorepo.`
154
+ };
155
+ }
156
+ export function getSkyComponentDocs(nameInput, options) {
157
+ const key = `sky-doc:${nameInput}:${options?.maxCharsPerExample ?? 12_000}:${options?.includeRawLead ? 1 : 0}:${options?.includeInternalLifecycleMethods ? 1 : 0}`;
158
+ return getCached(key, 45_000, () => getSkyComponentDocsImpl(nameInput, options));
159
+ }
160
+ export function searchSkyComponents(query, limit) {
161
+ const loaded = loadSkyComponentsCached();
162
+ if (!loaded.ok) {
163
+ return { ok: false, error: loaded.error };
164
+ }
165
+ const q = query.trim().toLowerCase();
166
+ if (!q) {
167
+ return { ok: true, hits: [] };
168
+ }
169
+ const tokens = q.split(/\s+/).filter(Boolean);
170
+ const hits = [];
171
+ const cem = isCemManifestPresent();
172
+ for (const c of loaded.components) {
173
+ const p = componentMainSourcePath(c);
174
+ let summary = null;
175
+ if (existsSync(p)) {
176
+ try {
177
+ const st = statSync(p);
178
+ const maxScan = 400_000;
179
+ const slice = st.size > maxScan ? readFileSync(p, 'utf8').slice(0, maxScan) : readFileSync(p, 'utf8');
180
+ summary = parseSummaryOnly(p, slice, c.name);
181
+ }
182
+ catch {
183
+ summary = null;
184
+ }
185
+ }
186
+ if (summary == null && cem) {
187
+ summary = getCemSummaryForTag(c.name);
188
+ }
189
+ const hay = `${c.name} ${summary ?? ''}`.toLowerCase();
190
+ const ok = tokens.every((t) => hay.includes(t));
191
+ if (ok) {
192
+ hits.push({ name: c.name, npmImport: c.npmImport, summary });
193
+ }
194
+ if (hits.length >= limit) {
195
+ break;
196
+ }
197
+ }
198
+ return { ok: true, hits };
199
+ }
200
+ export function searchComponentsByApi(query, limit) {
201
+ const loaded = loadSkyComponentsCached();
202
+ if (!loaded.ok) {
203
+ return { ok: false, error: loaded.error };
204
+ }
205
+ const q = query.trim().toLowerCase();
206
+ if (!q) {
207
+ return { ok: true, hits: [] };
208
+ }
209
+ const tokens = q.split(/\s+/).filter(Boolean);
210
+ const hits = [];
211
+ for (const c of loaded.components) {
212
+ const r = getSkyComponentDocs(c.name);
213
+ if (!r.ok) {
214
+ continue;
215
+ }
216
+ const doc = r.result.doc;
217
+ const matchedProps = (doc.properties ?? [])
218
+ .map((p) => p.name)
219
+ .filter((name) => tokens.every((t) => name.toLowerCase().includes(t)));
220
+ const matchedEvents = (doc.events ?? [])
221
+ .map((e) => e.name)
222
+ .filter((name) => tokens.every((t) => name.toLowerCase().includes(t)));
223
+ const matchedSlots = (doc.slots ?? [])
224
+ .map((s) => s.name)
225
+ .filter((name) => tokens.every((t) => name.toLowerCase().includes(t)));
226
+ if (matchedProps.length || matchedEvents.length || matchedSlots.length) {
227
+ hits.push({
228
+ name: c.name,
229
+ npmImport: c.npmImport,
230
+ summary: doc.summary,
231
+ matched: {
232
+ properties: matchedProps,
233
+ events: matchedEvents,
234
+ slots: matchedSlots
235
+ }
236
+ });
237
+ }
238
+ if (hits.length >= limit) {
239
+ break;
240
+ }
241
+ }
242
+ return { ok: true, hits };
243
+ }
244
+ function tokenScore(name, token) {
245
+ const n = name.toLowerCase();
246
+ const t = token.toLowerCase();
247
+ if (n === t)
248
+ return 6;
249
+ if (n.startsWith(t))
250
+ return 4;
251
+ if (n.includes(t))
252
+ return 2;
253
+ return 0;
254
+ }
255
+ function namesScore(names, tokens) {
256
+ let score = 0;
257
+ for (const n of names) {
258
+ let local = 0;
259
+ for (const t of tokens) {
260
+ local += tokenScore(n, t);
261
+ }
262
+ score += local;
263
+ }
264
+ return score;
265
+ }
266
+ export function searchComponentsByApiBatch(queries, limitPerQuery) {
267
+ const loaded = loadSkyComponentsCached();
268
+ if (!loaded.ok) {
269
+ return { ok: false, error: loaded.error };
270
+ }
271
+ const results = [];
272
+ const normalizedQueries = queries.map((q) => q.trim()).filter(Boolean);
273
+ for (const q of normalizedQueries) {
274
+ const tokens = q.toLowerCase().split(/\s+/).filter(Boolean);
275
+ const hits = [];
276
+ for (const c of loaded.components) {
277
+ const r = getSkyComponentDocs(c.name);
278
+ if (!r.ok)
279
+ continue;
280
+ const doc = r.result.doc;
281
+ const matchedProps = (doc.properties ?? [])
282
+ .map((p) => p.name)
283
+ .filter((name) => tokens.every((t) => name.toLowerCase().includes(t)));
284
+ const matchedEvents = (doc.events ?? [])
285
+ .map((e) => e.name)
286
+ .filter((name) => tokens.every((t) => name.toLowerCase().includes(t)));
287
+ const matchedSlots = (doc.slots ?? [])
288
+ .map((s) => s.name)
289
+ .filter((name) => tokens.every((t) => name.toLowerCase().includes(t)));
290
+ if (!(matchedProps.length || matchedEvents.length || matchedSlots.length))
291
+ continue;
292
+ const score = namesScore(matchedProps, tokens) * 3 +
293
+ namesScore(matchedEvents, tokens) * 2 +
294
+ namesScore(matchedSlots, tokens);
295
+ hits.push({
296
+ name: c.name,
297
+ npmImport: c.npmImport,
298
+ summary: doc.summary,
299
+ score,
300
+ matched: {
301
+ properties: matchedProps,
302
+ events: matchedEvents,
303
+ slots: matchedSlots
304
+ }
305
+ });
306
+ }
307
+ hits.sort((a, b) => (b.score ?? 0) - (a.score ?? 0) || a.name.localeCompare(b.name));
308
+ results.push({ query: q, hits: hits.slice(0, limitPerQuery) });
309
+ }
310
+ return { ok: true, results };
311
+ }
312
+ export function frameworkWrapperImport(framework, nameInput) {
313
+ const loaded = loadSkyComponentsCached();
314
+ if (!loaded.ok) {
315
+ return { ok: false, error: loaded.error };
316
+ }
317
+ const resolved = resolveComponentEntry(nameInput, loaded.components);
318
+ if (!resolved) {
319
+ return { ok: false, error: `Unknown component: ${nameInput}` };
320
+ }
321
+ return { ok: true, import: `@sky.ui/${framework}/${resolved.entry.name}` };
322
+ }
323
+ //# sourceMappingURL=docs.js.map