@blink-authority-com/claude-code-plugin 1.0.0

This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
Files changed (135) hide show
  1. package/LICENSE +21 -0
  2. package/README.md +146 -0
  3. package/dist/bsec-client.d.ts +35 -0
  4. package/dist/bsec-client.d.ts.map +1 -0
  5. package/dist/bsec-client.js +122 -0
  6. package/dist/bsec-client.js.map +1 -0
  7. package/dist/docs/cache.d.ts +19 -0
  8. package/dist/docs/cache.d.ts.map +1 -0
  9. package/dist/docs/cache.js +92 -0
  10. package/dist/docs/cache.js.map +1 -0
  11. package/dist/docs/fetcher.d.ts +19 -0
  12. package/dist/docs/fetcher.d.ts.map +1 -0
  13. package/dist/docs/fetcher.js +81 -0
  14. package/dist/docs/fetcher.js.map +1 -0
  15. package/dist/docs/parser.d.ts +33 -0
  16. package/dist/docs/parser.d.ts.map +1 -0
  17. package/dist/docs/parser.js +145 -0
  18. package/dist/docs/parser.js.map +1 -0
  19. package/dist/docs/search.d.ts +38 -0
  20. package/dist/docs/search.d.ts.map +1 -0
  21. package/dist/docs/search.js +180 -0
  22. package/dist/docs/search.js.map +1 -0
  23. package/dist/docs/tools/api.d.ts +12 -0
  24. package/dist/docs/tools/api.d.ts.map +1 -0
  25. package/dist/docs/tools/api.js +58 -0
  26. package/dist/docs/tools/api.js.map +1 -0
  27. package/dist/docs/tools/cli.d.ts +12 -0
  28. package/dist/docs/tools/cli.d.ts.map +1 -0
  29. package/dist/docs/tools/cli.js +56 -0
  30. package/dist/docs/tools/cli.js.map +1 -0
  31. package/dist/docs/tools/concepts.d.ts +18 -0
  32. package/dist/docs/tools/concepts.d.ts.map +1 -0
  33. package/dist/docs/tools/concepts.js +136 -0
  34. package/dist/docs/tools/concepts.js.map +1 -0
  35. package/dist/docs/tools/sdk.d.ts +12 -0
  36. package/dist/docs/tools/sdk.d.ts.map +1 -0
  37. package/dist/docs/tools/sdk.js +72 -0
  38. package/dist/docs/tools/sdk.js.map +1 -0
  39. package/dist/docs/tools/search.d.ts +11 -0
  40. package/dist/docs/tools/search.d.ts.map +1 -0
  41. package/dist/docs/tools/search.js +36 -0
  42. package/dist/docs/tools/search.js.map +1 -0
  43. package/dist/docs/types.d.ts +70 -0
  44. package/dist/docs/types.d.ts.map +1 -0
  45. package/dist/docs/types.js +8 -0
  46. package/dist/docs/types.js.map +1 -0
  47. package/dist/index.d.ts +9 -0
  48. package/dist/index.d.ts.map +1 -0
  49. package/dist/index.js +622 -0
  50. package/dist/index.js.map +1 -0
  51. package/dist/prompts/debug.d.ts +16 -0
  52. package/dist/prompts/debug.d.ts.map +1 -0
  53. package/dist/prompts/debug.js +34 -0
  54. package/dist/prompts/debug.js.map +1 -0
  55. package/dist/prompts/integrate.d.ts +16 -0
  56. package/dist/prompts/integrate.d.ts.map +1 -0
  57. package/dist/prompts/integrate.js +30 -0
  58. package/dist/prompts/integrate.js.map +1 -0
  59. package/dist/prompts/review.d.ts +16 -0
  60. package/dist/prompts/review.d.ts.map +1 -0
  61. package/dist/prompts/review.js +28 -0
  62. package/dist/prompts/review.js.map +1 -0
  63. package/dist/resources/changelog.d.ts +22 -0
  64. package/dist/resources/changelog.d.ts.map +1 -0
  65. package/dist/resources/changelog.js +55 -0
  66. package/dist/resources/changelog.js.map +1 -0
  67. package/dist/resources/errors.d.ts +16 -0
  68. package/dist/resources/errors.d.ts.map +1 -0
  69. package/dist/resources/errors.js +103 -0
  70. package/dist/resources/errors.js.map +1 -0
  71. package/dist/resources/patterns.d.ts +16 -0
  72. package/dist/resources/patterns.d.ts.map +1 -0
  73. package/dist/resources/patterns.js +151 -0
  74. package/dist/resources/patterns.js.map +1 -0
  75. package/dist/templates/approval-workflow.d.ts +6 -0
  76. package/dist/templates/approval-workflow.d.ts.map +1 -0
  77. package/dist/templates/approval-workflow.js +467 -0
  78. package/dist/templates/approval-workflow.js.map +1 -0
  79. package/dist/templates/audit-trail.d.ts +6 -0
  80. package/dist/templates/audit-trail.d.ts.map +1 -0
  81. package/dist/templates/audit-trail.js +396 -0
  82. package/dist/templates/audit-trail.js.map +1 -0
  83. package/dist/templates/cli-tool.d.ts +6 -0
  84. package/dist/templates/cli-tool.d.ts.map +1 -0
  85. package/dist/templates/cli-tool.js +346 -0
  86. package/dist/templates/cli-tool.js.map +1 -0
  87. package/dist/templates/express-api.d.ts +6 -0
  88. package/dist/templates/express-api.d.ts.map +1 -0
  89. package/dist/templates/express-api.js +314 -0
  90. package/dist/templates/express-api.js.map +1 -0
  91. package/dist/templates/notary.d.ts +6 -0
  92. package/dist/templates/notary.d.ts.map +1 -0
  93. package/dist/templates/notary.js +360 -0
  94. package/dist/templates/notary.js.map +1 -0
  95. package/dist/test.d.ts +8 -0
  96. package/dist/test.d.ts.map +1 -0
  97. package/dist/test.js +140 -0
  98. package/dist/test.js.map +1 -0
  99. package/dist/tools/add-signing.d.ts +19 -0
  100. package/dist/tools/add-signing.d.ts.map +1 -0
  101. package/dist/tools/add-signing.js +317 -0
  102. package/dist/tools/add-signing.js.map +1 -0
  103. package/dist/tools/decode.d.ts +13 -0
  104. package/dist/tools/decode.d.ts.map +1 -0
  105. package/dist/tools/decode.js +262 -0
  106. package/dist/tools/decode.js.map +1 -0
  107. package/dist/tools/hierarchy.d.ts +13 -0
  108. package/dist/tools/hierarchy.d.ts.map +1 -0
  109. package/dist/tools/hierarchy.js +319 -0
  110. package/dist/tools/hierarchy.js.map +1 -0
  111. package/dist/tools/lint.d.ts +13 -0
  112. package/dist/tools/lint.d.ts.map +1 -0
  113. package/dist/tools/lint.js +323 -0
  114. package/dist/tools/lint.js.map +1 -0
  115. package/dist/tools/scaffold.d.ts +11 -0
  116. package/dist/tools/scaffold.d.ts.map +1 -0
  117. package/dist/tools/scaffold.js +84 -0
  118. package/dist/tools/scaffold.js.map +1 -0
  119. package/dist/tools/sign-test.d.ts +17 -0
  120. package/dist/tools/sign-test.d.ts.map +1 -0
  121. package/dist/tools/sign-test.js +126 -0
  122. package/dist/tools/sign-test.js.map +1 -0
  123. package/dist/tools/test-vectors.d.ts +13 -0
  124. package/dist/tools/test-vectors.d.ts.map +1 -0
  125. package/dist/tools/test-vectors.js +169 -0
  126. package/dist/tools/test-vectors.js.map +1 -0
  127. package/dist/tools/verify-local.d.ts +17 -0
  128. package/dist/tools/verify-local.d.ts.map +1 -0
  129. package/dist/tools/verify-local.js +233 -0
  130. package/dist/tools/verify-local.js.map +1 -0
  131. package/dist/tools/verify-test.d.ts +17 -0
  132. package/dist/tools/verify-test.d.ts.map +1 -0
  133. package/dist/tools/verify-test.js +107 -0
  134. package/dist/tools/verify-test.js.map +1 -0
  135. package/package.json +54 -0
@@ -0,0 +1,145 @@
1
+ /**
2
+ * BLINK Authority MCP Server — Markdown Parser
3
+ */
4
+ /**
5
+ * Parse a markdown document into structured sections split by headings.
6
+ */
7
+ export function parseDocument(markdown, path) {
8
+ // Strip AI-instruction comments: <!-- ... -->
9
+ const cleaned = markdown
10
+ .replace(/<!--\s*internal\s*-->[\s\S]*?(?=<!--|$)/gi, '')
11
+ .replace(/<!--\s*private\s*-->[\s\S]*?<!--\s*\/private\s*-->/gi, '')
12
+ .replace(/<!--[\s\S]*?-->/g, '');
13
+ const lines = cleaned.split('\n');
14
+ const sections = [];
15
+ let currentTitle = path;
16
+ let currentLevel = 1;
17
+ let currentLines = [];
18
+ let currentCodeBlocks = [];
19
+ let inCodeBlock = false;
20
+ let codeBlockContent = '';
21
+ function flushSection() {
22
+ const content = currentLines.join('\n').trim();
23
+ if (content) {
24
+ sections.push({
25
+ title: currentTitle,
26
+ path,
27
+ content,
28
+ codeBlocks: [...currentCodeBlocks],
29
+ headingLevel: currentLevel,
30
+ });
31
+ }
32
+ currentLines = [];
33
+ currentCodeBlocks = [];
34
+ }
35
+ for (const line of lines) {
36
+ // Track code blocks
37
+ if (line.startsWith('```')) {
38
+ if (inCodeBlock) {
39
+ // End of code block
40
+ codeBlockContent += line + '\n';
41
+ currentCodeBlocks.push(codeBlockContent.trim());
42
+ currentLines.push(line);
43
+ inCodeBlock = false;
44
+ codeBlockContent = '';
45
+ continue;
46
+ }
47
+ else {
48
+ // Start of code block
49
+ inCodeBlock = true;
50
+ codeBlockContent = line + '\n';
51
+ currentLines.push(line);
52
+ continue;
53
+ }
54
+ }
55
+ if (inCodeBlock) {
56
+ codeBlockContent += line + '\n';
57
+ currentLines.push(line);
58
+ continue;
59
+ }
60
+ // Check for heading
61
+ const headingMatch = line.match(/^(#{1,6})\s+(.+)$/);
62
+ if (headingMatch) {
63
+ flushSection();
64
+ currentLevel = headingMatch[1].length;
65
+ currentTitle = headingMatch[2].trim();
66
+ currentLines.push(line);
67
+ continue;
68
+ }
69
+ currentLines.push(line);
70
+ }
71
+ // Flush remaining content
72
+ flushSection();
73
+ return sections;
74
+ }
75
+ /**
76
+ * Extract structured API endpoint info from a parsed doc section.
77
+ */
78
+ export function extractApiInfo(sections) {
79
+ let method = 'POST';
80
+ let apiPath = '';
81
+ let description = '';
82
+ let requestFormat = '';
83
+ let responseFormat = '';
84
+ let codeExample = '';
85
+ for (const section of sections) {
86
+ const content = section.content;
87
+ // Extract method and path from patterns like "POST /api/v1/sign"
88
+ const methodMatch = content.match(/\b(GET|POST|PUT|PATCH|DELETE)\s+(\/[^\s]+)/);
89
+ if (methodMatch) {
90
+ method = methodMatch[1];
91
+ apiPath = methodMatch[2];
92
+ }
93
+ const lower = section.title.toLowerCase();
94
+ if (lower.includes('request') || lower.includes('input')) {
95
+ requestFormat = content;
96
+ }
97
+ else if (lower.includes('response') || lower.includes('output')) {
98
+ responseFormat = content;
99
+ }
100
+ else if (lower.includes('example') || lower.includes('usage')) {
101
+ codeExample = section.codeBlocks[0] ?? content;
102
+ }
103
+ else if (!description && section.headingLevel <= 2) {
104
+ description = content.slice(0, 500);
105
+ }
106
+ }
107
+ return { method, apiPath, description, requestFormat, responseFormat, codeExample };
108
+ }
109
+ /**
110
+ * Extract CLI command info from parsed doc sections.
111
+ */
112
+ export function extractCliInfo(sections) {
113
+ let description = '';
114
+ let usage = '';
115
+ const flags = [];
116
+ const examples = [];
117
+ for (const section of sections) {
118
+ const lower = section.title.toLowerCase();
119
+ if (lower.includes('flag') || lower.includes('option')) {
120
+ // Parse flags from content lines like "--flag description"
121
+ const flagLines = section.content.split('\n');
122
+ for (const fl of flagLines) {
123
+ const flagMatch = fl.match(/^\s*[|`]*\s*(--?\w[\w-]*)\s*[|`]*\s+(.+)/);
124
+ if (flagMatch) {
125
+ flags.push({
126
+ flag: flagMatch[1],
127
+ description: flagMatch[2].replace(/\|/g, '').trim(),
128
+ required: fl.toLowerCase().includes('required'),
129
+ });
130
+ }
131
+ }
132
+ }
133
+ else if (lower.includes('usage') || lower.includes('synopsis')) {
134
+ usage = section.codeBlocks[0] ?? section.content;
135
+ }
136
+ else if (lower.includes('example')) {
137
+ examples.push(...section.codeBlocks);
138
+ }
139
+ else if (!description && section.headingLevel <= 2) {
140
+ description = section.content.slice(0, 500);
141
+ }
142
+ }
143
+ return { description, usage, flags, examples };
144
+ }
145
+ //# sourceMappingURL=parser.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"parser.js","sourceRoot":"","sources":["../../src/docs/parser.ts"],"names":[],"mappings":"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"}
@@ -0,0 +1,38 @@
1
+ /**
2
+ * BLINK Authority MCP Server — TF-IDF Search Index
3
+ */
4
+ import type { SearchResult } from './types.js';
5
+ export declare class SearchIndex {
6
+ private documents;
7
+ private idf;
8
+ private dirty;
9
+ /**
10
+ * Tokenise text into searchable terms.
11
+ */
12
+ private tokenize;
13
+ /**
14
+ * Add a document to the index.
15
+ */
16
+ addDocument(id: string, title: string, content: string): void;
17
+ /**
18
+ * Rebuild the IDF table. Called lazily before search.
19
+ */
20
+ private buildIdf;
21
+ /**
22
+ * Compute TF-IDF score for a term in a document.
23
+ */
24
+ private tfidf;
25
+ /**
26
+ * Search the index using cosine similarity.
27
+ */
28
+ search(query: string, limit?: number): SearchResult[];
29
+ /**
30
+ * Extract the most relevant ~200 chars around matching terms.
31
+ */
32
+ private extractSnippet;
33
+ /**
34
+ * Get total number of indexed documents.
35
+ */
36
+ get size(): number;
37
+ }
38
+ //# sourceMappingURL=search.d.ts.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"search.d.ts","sourceRoot":"","sources":["../../src/docs/search.ts"],"names":[],"mappings":"AAAA;;GAEG;AAEH,OAAO,KAAK,EAAE,YAAY,EAAE,MAAM,YAAY,CAAC;AA0B/C,qBAAa,WAAW;IACtB,OAAO,CAAC,SAAS,CAAoB;IACrC,OAAO,CAAC,GAAG,CAAkC;IAC7C,OAAO,CAAC,KAAK,CAAQ;IAErB;;OAEG;IACH,OAAO,CAAC,QAAQ;IAOhB;;OAEG;IACH,WAAW,CAAC,EAAE,EAAE,MAAM,EAAE,KAAK,EAAE,MAAM,EAAE,OAAO,EAAE,MAAM,GAAG,IAAI;IAsB7D;;OAEG;IACH,OAAO,CAAC,QAAQ;IAuBhB;;OAEG;IACH,OAAO,CAAC,KAAK;IAMb;;OAEG;IACH,MAAM,CAAC,KAAK,EAAE,MAAM,EAAE,KAAK,SAAI,GAAG,YAAY,EAAE;IA8DhD;;OAEG;IACH,OAAO,CAAC,cAAc;IAuCtB;;OAEG;IACH,IAAI,IAAI,IAAI,MAAM,CAEjB;CACF"}
@@ -0,0 +1,180 @@
1
+ /**
2
+ * BLINK Authority MCP Server — TF-IDF Search Index
3
+ */
4
+ const STOP_WORDS = new Set([
5
+ 'a', 'an', 'the', 'is', 'are', 'was', 'were', 'be', 'been', 'being',
6
+ 'have', 'has', 'had', 'do', 'does', 'did', 'will', 'would', 'could',
7
+ 'should', 'may', 'might', 'shall', 'can', 'to', 'of', 'in', 'for',
8
+ 'on', 'with', 'at', 'by', 'from', 'as', 'into', 'through', 'during',
9
+ 'before', 'after', 'above', 'below', 'between', 'out', 'off', 'over',
10
+ 'under', 'again', 'further', 'then', 'once', 'here', 'there', 'when',
11
+ 'where', 'why', 'how', 'all', 'each', 'every', 'both', 'few', 'more',
12
+ 'most', 'other', 'some', 'such', 'no', 'nor', 'not', 'only', 'own',
13
+ 'same', 'so', 'than', 'too', 'very', 'and', 'but', 'or', 'if', 'it',
14
+ 'its', 'this', 'that', 'these', 'those', 'i', 'me', 'my', 'we', 'our',
15
+ 'you', 'your', 'he', 'him', 'his', 'she', 'her', 'they', 'them', 'their',
16
+ 'what', 'which', 'who', 'whom',
17
+ ]);
18
+ export class SearchIndex {
19
+ documents = [];
20
+ idf = new Map();
21
+ dirty = true;
22
+ /**
23
+ * Tokenise text into searchable terms.
24
+ */
25
+ tokenize(text) {
26
+ return text
27
+ .toLowerCase()
28
+ .split(/[\s\p{P}]+/u)
29
+ .filter((t) => t.length > 1 && !STOP_WORDS.has(t));
30
+ }
31
+ /**
32
+ * Add a document to the index.
33
+ */
34
+ addDocument(id, title, content) {
35
+ const tokens = this.tokenize(`${title} ${content}`);
36
+ const termFreqs = new Map();
37
+ for (const token of tokens) {
38
+ termFreqs.set(token, (termFreqs.get(token) ?? 0) + 1);
39
+ }
40
+ // Derive path from id
41
+ const path = id;
42
+ this.documents.push({
43
+ id,
44
+ title,
45
+ path,
46
+ content,
47
+ termFreqs,
48
+ totalTerms: tokens.length,
49
+ });
50
+ this.dirty = true;
51
+ }
52
+ /**
53
+ * Rebuild the IDF table. Called lazily before search.
54
+ */
55
+ buildIdf() {
56
+ if (!this.dirty)
57
+ return;
58
+ this.idf.clear();
59
+ const N = this.documents.length;
60
+ if (N === 0)
61
+ return;
62
+ // Collect document frequencies
63
+ const df = new Map();
64
+ for (const doc of this.documents) {
65
+ for (const term of doc.termFreqs.keys()) {
66
+ df.set(term, (df.get(term) ?? 0) + 1);
67
+ }
68
+ }
69
+ // Compute IDF: log(N / df)
70
+ for (const [term, freq] of df) {
71
+ this.idf.set(term, Math.log(N / freq));
72
+ }
73
+ this.dirty = false;
74
+ }
75
+ /**
76
+ * Compute TF-IDF score for a term in a document.
77
+ */
78
+ tfidf(term, doc) {
79
+ const tf = (doc.termFreqs.get(term) ?? 0) / Math.max(doc.totalTerms, 1);
80
+ const idfVal = this.idf.get(term) ?? 0;
81
+ return tf * idfVal;
82
+ }
83
+ /**
84
+ * Search the index using cosine similarity.
85
+ */
86
+ search(query, limit = 5) {
87
+ this.buildIdf();
88
+ if (this.documents.length === 0) {
89
+ return [];
90
+ }
91
+ const queryTokens = this.tokenize(query);
92
+ if (queryTokens.length === 0)
93
+ return [];
94
+ // Build query TF-IDF vector
95
+ const queryFreqs = new Map();
96
+ for (const t of queryTokens) {
97
+ queryFreqs.set(t, (queryFreqs.get(t) ?? 0) + 1);
98
+ }
99
+ const queryVec = new Map();
100
+ for (const [term, freq] of queryFreqs) {
101
+ const tf = freq / queryTokens.length;
102
+ const idfVal = this.idf.get(term) ?? 0;
103
+ queryVec.set(term, tf * idfVal);
104
+ }
105
+ // Score each document using cosine similarity
106
+ const scored = [];
107
+ for (const doc of this.documents) {
108
+ let dotProduct = 0;
109
+ let docMag = 0;
110
+ let queryMag = 0;
111
+ const allTerms = new Set([...queryVec.keys(), ...doc.termFreqs.keys()]);
112
+ for (const term of allTerms) {
113
+ const qVal = queryVec.get(term) ?? 0;
114
+ const dVal = this.tfidf(term, doc);
115
+ dotProduct += qVal * dVal;
116
+ docMag += dVal * dVal;
117
+ queryMag += qVal * qVal;
118
+ }
119
+ const magnitude = Math.sqrt(docMag) * Math.sqrt(queryMag);
120
+ const score = magnitude > 0 ? dotProduct / magnitude : 0;
121
+ if (score > 0) {
122
+ scored.push({ doc, score });
123
+ }
124
+ }
125
+ // Sort by score descending, take top N
126
+ scored.sort((a, b) => b.score - a.score);
127
+ const topResults = scored.slice(0, limit);
128
+ return topResults.map(({ doc, score }) => ({
129
+ id: doc.id,
130
+ title: doc.title,
131
+ path: doc.path,
132
+ snippet: this.extractSnippet(doc.content, queryTokens),
133
+ score: Math.round(score * 1000) / 1000,
134
+ }));
135
+ }
136
+ /**
137
+ * Extract the most relevant ~200 chars around matching terms.
138
+ */
139
+ extractSnippet(content, queryTokens) {
140
+ const lowerContent = content.toLowerCase();
141
+ let bestStart = 0;
142
+ let bestScore = 0;
143
+ // Slide a 200-char window and score by term matches
144
+ const windowSize = 200;
145
+ for (let i = 0; i <= Math.max(0, lowerContent.length - windowSize); i += 20) {
146
+ const window = lowerContent.slice(i, i + windowSize);
147
+ let score = 0;
148
+ for (const token of queryTokens) {
149
+ if (window.includes(token))
150
+ score++;
151
+ }
152
+ if (score > bestScore) {
153
+ bestScore = score;
154
+ bestStart = i;
155
+ }
156
+ }
157
+ let snippet = content.slice(bestStart, bestStart + windowSize).trim();
158
+ // Clean up: start at a word boundary if possible
159
+ if (bestStart > 0) {
160
+ const firstSpace = snippet.indexOf(' ');
161
+ if (firstSpace > 0 && firstSpace < 20) {
162
+ snippet = '...' + snippet.slice(firstSpace + 1);
163
+ }
164
+ }
165
+ if (bestStart + windowSize < content.length) {
166
+ const lastSpace = snippet.lastIndexOf(' ');
167
+ if (lastSpace > snippet.length - 20) {
168
+ snippet = snippet.slice(0, lastSpace) + '...';
169
+ }
170
+ }
171
+ return snippet;
172
+ }
173
+ /**
174
+ * Get total number of indexed documents.
175
+ */
176
+ get size() {
177
+ return this.documents.length;
178
+ }
179
+ }
180
+ //# sourceMappingURL=search.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"search.js","sourceRoot":"","sources":["../../src/docs/search.ts"],"names":[],"mappings":"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"}
@@ -0,0 +1,12 @@
1
+ /**
2
+ * get_api_endpoint tool handler
3
+ */
4
+ import type { CacheManager } from '../cache.js';
5
+ import type { ServerConfig } from '../types.js';
6
+ export declare function handleGetApiEndpoint(cache: CacheManager, config: ServerConfig, args: Record<string, unknown>): Promise<{
7
+ content: Array<{
8
+ type: string;
9
+ text: string;
10
+ }>;
11
+ }>;
12
+ //# sourceMappingURL=api.d.ts.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"api.d.ts","sourceRoot":"","sources":["../../../src/docs/tools/api.ts"],"names":[],"mappings":"AAAA;;GAEG;AAEH,OAAO,KAAK,EAAE,YAAY,EAAE,MAAM,aAAa,CAAC;AAGhD,OAAO,KAAK,EAAE,YAAY,EAAE,MAAM,aAAa,CAAC;AAIhD,wBAAsB,oBAAoB,CACxC,KAAK,EAAE,YAAY,EACnB,MAAM,EAAE,YAAY,EACpB,IAAI,EAAE,MAAM,CAAC,MAAM,EAAE,OAAO,CAAC,GAC5B,OAAO,CAAC;IAAE,OAAO,EAAE,KAAK,CAAC;QAAE,IAAI,EAAE,MAAM,CAAC;QAAC,IAAI,EAAE,MAAM,CAAA;KAAE,CAAC,CAAA;CAAE,CAAC,CAuD7D"}
@@ -0,0 +1,58 @@
1
+ /**
2
+ * get_api_endpoint tool handler
3
+ */
4
+ import { fetchDoc } from '../fetcher.js';
5
+ import { parseDocument, extractApiInfo } from '../parser.js';
6
+ const VALID_ENDPOINTS = ['signing', 'verification', 'sessions', 'identity', 'hash', 'health'];
7
+ export async function handleGetApiEndpoint(cache, config, args) {
8
+ const endpoint = String(args.endpoint ?? '');
9
+ if (!VALID_ENDPOINTS.includes(endpoint)) {
10
+ return {
11
+ content: [{
12
+ type: 'text',
13
+ text: JSON.stringify({
14
+ error: `Invalid endpoint. Valid options: ${VALID_ENDPOINTS.join(', ')}`,
15
+ }),
16
+ }],
17
+ };
18
+ }
19
+ const cacheKey = `api/${endpoint}`;
20
+ let markdown = cache.get(cacheKey);
21
+ if (!markdown || cache.isStale(cacheKey, config.cacheTtlMs)) {
22
+ try {
23
+ const url = `${config.docsUrl}/ai-assist/api/${endpoint}.md`;
24
+ markdown = await fetchDoc(url);
25
+ cache.set(cacheKey, markdown);
26
+ }
27
+ catch (err) {
28
+ if (markdown) {
29
+ process.stderr.write(`[blink-mcp] Using stale cache for ${cacheKey}: ${err}\n`);
30
+ }
31
+ else {
32
+ return {
33
+ content: [{
34
+ type: 'text',
35
+ text: JSON.stringify({ error: `Failed to fetch documentation for ${endpoint}: ${err}` }),
36
+ }],
37
+ };
38
+ }
39
+ }
40
+ }
41
+ const sections = parseDocument(markdown, cacheKey);
42
+ const info = extractApiInfo(sections);
43
+ const response = {
44
+ endpoint,
45
+ method: info.method,
46
+ path: info.apiPath || `/api/v1/${endpoint}`,
47
+ description: info.description.slice(0, 500),
48
+ request_format: info.requestFormat.slice(0, 500),
49
+ response_format: info.responseFormat.slice(0, 500),
50
+ code_example: info.codeExample.slice(0, 500),
51
+ };
52
+ let text = JSON.stringify(response, null, 2);
53
+ if (text.length > 2000) {
54
+ text = text.slice(0, 1950) + '\n[truncated — use search_blink_docs for more specific queries]';
55
+ }
56
+ return { content: [{ type: 'text', text }] };
57
+ }
58
+ //# sourceMappingURL=api.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"api.js","sourceRoot":"","sources":["../../../src/docs/tools/api.ts"],"names":[],"mappings":"AAAA;;GAEG;AAGH,OAAO,EAAE,QAAQ,EAAE,MAAM,eAAe,CAAC;AACzC,OAAO,EAAE,aAAa,EAAE,cAAc,EAAE,MAAM,cAAc,CAAC;AAG7D,MAAM,eAAe,GAAG,CAAC,SAAS,EAAE,cAAc,EAAE,UAAU,EAAE,UAAU,EAAE,MAAM,EAAE,QAAQ,CAAU,CAAC;AAEvG,MAAM,CAAC,KAAK,UAAU,oBAAoB,CACxC,KAAmB,EACnB,MAAoB,EACpB,IAA6B;IAE7B,MAAM,QAAQ,GAAG,MAAM,CAAC,IAAI,CAAC,QAAQ,IAAI,EAAE,CAAC,CAAC;IAE7C,IAAI,CAAC,eAAe,CAAC,QAAQ,CAAC,QAA0C,CAAC,EAAE,CAAC;QAC1E,OAAO;YACL,OAAO,EAAE,CAAC;oBACR,IAAI,EAAE,MAAM;oBACZ,IAAI,EAAE,IAAI,CAAC,SAAS,CAAC;wBACnB,KAAK,EAAE,oCAAoC,eAAe,CAAC,IAAI,CAAC,IAAI,CAAC,EAAE;qBACxE,CAAC;iBACH,CAAC;SACH,CAAC;IACJ,CAAC;IAED,MAAM,QAAQ,GAAG,OAAO,QAAQ,EAAE,CAAC;IACnC,IAAI,QAAQ,GAAG,KAAK,CAAC,GAAG,CAAC,QAAQ,CAAC,CAAC;IAEnC,IAAI,CAAC,QAAQ,IAAI,KAAK,CAAC,OAAO,CAAC,QAAQ,EAAE,MAAM,CAAC,UAAU,CAAC,EAAE,CAAC;QAC5D,IAAI,CAAC;YACH,MAAM,GAAG,GAAG,GAAG,MAAM,CAAC,OAAO,kBAAkB,QAAQ,KAAK,CAAC;YAC7D,QAAQ,GAAG,MAAM,QAAQ,CAAC,GAAG,CAAC,CAAC;YAC/B,KAAK,CAAC,GAAG,CAAC,QAAQ,EAAE,QAAQ,CAAC,CAAC;QAChC,CAAC;QAAC,OAAO,GAAG,EAAE,CAAC;YACb,IAAI,QAAQ,EAAE,CAAC;gBACb,OAAO,CAAC,MAAM,CAAC,KAAK,CAAC,qCAAqC,QAAQ,KAAK,GAAG,IAAI,CAAC,CAAC;YAClF,CAAC;iBAAM,CAAC;gBACN,OAAO;oBACL,OAAO,EAAE,CAAC;4BACR,IAAI,EAAE,MAAM;4BACZ,IAAI,EAAE,IAAI,CAAC,SAAS,CAAC,EAAE,KAAK,EAAE,qCAAqC,QAAQ,KAAK,GAAG,EAAE,EAAE,CAAC;yBACzF,CAAC;iBACH,CAAC;YACJ,CAAC;QACH,CAAC;IACH,CAAC;IAED,MAAM,QAAQ,GAAG,aAAa,CAAC,QAAS,EAAE,QAAQ,CAAC,CAAC;IACpD,MAAM,IAAI,GAAG,cAAc,CAAC,QAAQ,CAAC,CAAC;IAEtC,MAAM,QAAQ,GAAG;QACf,QAAQ;QACR,MAAM,EAAE,IAAI,CAAC,MAAM;QACnB,IAAI,EAAE,IAAI,CAAC,OAAO,IAAI,WAAW,QAAQ,EAAE;QAC3C,WAAW,EAAE,IAAI,CAAC,WAAW,CAAC,KAAK,CAAC,CAAC,EAAE,GAAG,CAAC;QAC3C,cAAc,EAAE,IAAI,CAAC,aAAa,CAAC,KAAK,CAAC,CAAC,EAAE,GAAG,CAAC;QAChD,eAAe,EAAE,IAAI,CAAC,cAAc,CAAC,KAAK,CAAC,CAAC,EAAE,GAAG,CAAC;QAClD,YAAY,EAAE,IAAI,CAAC,WAAW,CAAC,KAAK,CAAC,CAAC,EAAE,GAAG,CAAC;KAC7C,CAAC;IAEF,IAAI,IAAI,GAAG,IAAI,CAAC,SAAS,CAAC,QAAQ,EAAE,IAAI,EAAE,CAAC,CAAC,CAAC;IAC7C,IAAI,IAAI,CAAC,MAAM,GAAG,IAAI,EAAE,CAAC;QACvB,IAAI,GAAG,IAAI,CAAC,KAAK,CAAC,CAAC,EAAE,IAAI,CAAC,GAAG,iEAAiE,CAAC;IACjG,CAAC;IAED,OAAO,EAAE,OAAO,EAAE,CAAC,EAAE,IAAI,EAAE,MAAM,EAAE,IAAI,EAAE,CAAC,EAAE,CAAC;AAC/C,CAAC"}
@@ -0,0 +1,12 @@
1
+ /**
2
+ * get_cli_command tool handler
3
+ */
4
+ import type { CacheManager } from '../cache.js';
5
+ import type { ServerConfig } from '../types.js';
6
+ export declare function handleGetCliCommand(cache: CacheManager, config: ServerConfig, args: Record<string, unknown>): Promise<{
7
+ content: Array<{
8
+ type: string;
9
+ text: string;
10
+ }>;
11
+ }>;
12
+ //# sourceMappingURL=cli.d.ts.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"cli.d.ts","sourceRoot":"","sources":["../../../src/docs/tools/cli.ts"],"names":[],"mappings":"AAAA;;GAEG;AAEH,OAAO,KAAK,EAAE,YAAY,EAAE,MAAM,aAAa,CAAC;AAGhD,OAAO,KAAK,EAAE,YAAY,EAAE,MAAM,aAAa,CAAC;AAIhD,wBAAsB,mBAAmB,CACvC,KAAK,EAAE,YAAY,EACnB,MAAM,EAAE,YAAY,EACpB,IAAI,EAAE,MAAM,CAAC,MAAM,EAAE,OAAO,CAAC,GAC5B,OAAO,CAAC;IAAE,OAAO,EAAE,KAAK,CAAC;QAAE,IAAI,EAAE,MAAM,CAAC;QAAC,IAAI,EAAE,MAAM,CAAA;KAAE,CAAC,CAAA;CAAE,CAAC,CAqD7D"}
@@ -0,0 +1,56 @@
1
+ /**
2
+ * get_cli_command tool handler
3
+ */
4
+ import { fetchDoc } from '../fetcher.js';
5
+ import { parseDocument, extractCliInfo } from '../parser.js';
6
+ const VALID_COMMANDS = ['sign', 'verify', 'hash', 'keygen', 'inspect', 'config'];
7
+ export async function handleGetCliCommand(cache, config, args) {
8
+ const command = String(args.command ?? '');
9
+ if (!VALID_COMMANDS.includes(command)) {
10
+ return {
11
+ content: [{
12
+ type: 'text',
13
+ text: JSON.stringify({
14
+ error: `Invalid command. Valid options: ${VALID_COMMANDS.join(', ')}`,
15
+ }),
16
+ }],
17
+ };
18
+ }
19
+ const cacheKey = `cli/${command}`;
20
+ let markdown = cache.get(cacheKey);
21
+ if (!markdown || cache.isStale(cacheKey, config.cacheTtlMs)) {
22
+ try {
23
+ const url = `${config.docsUrl}/ai-assist/cli/${command}.md`;
24
+ markdown = await fetchDoc(url);
25
+ cache.set(cacheKey, markdown);
26
+ }
27
+ catch (err) {
28
+ if (markdown) {
29
+ process.stderr.write(`[blink-mcp] Using stale cache for ${cacheKey}: ${err}\n`);
30
+ }
31
+ else {
32
+ return {
33
+ content: [{
34
+ type: 'text',
35
+ text: JSON.stringify({ error: `Failed to fetch documentation for ${command}: ${err}` }),
36
+ }],
37
+ };
38
+ }
39
+ }
40
+ }
41
+ const sections = parseDocument(markdown, cacheKey);
42
+ const info = extractCliInfo(sections);
43
+ const response = {
44
+ command: `blink ${command}`,
45
+ description: info.description.slice(0, 500),
46
+ usage: info.usage.slice(0, 300),
47
+ flags: info.flags.slice(0, 10),
48
+ examples: info.examples.slice(0, 3).map((e) => e.slice(0, 300)),
49
+ };
50
+ let text = JSON.stringify(response, null, 2);
51
+ if (text.length > 2000) {
52
+ text = text.slice(0, 1950) + '\n[truncated — use search_blink_docs for more specific queries]';
53
+ }
54
+ return { content: [{ type: 'text', text }] };
55
+ }
56
+ //# sourceMappingURL=cli.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"cli.js","sourceRoot":"","sources":["../../../src/docs/tools/cli.ts"],"names":[],"mappings":"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"}
@@ -0,0 +1,18 @@
1
+ /**
2
+ * get_concept + list_available_docs tool handlers
3
+ */
4
+ import type { CacheManager } from '../cache.js';
5
+ import type { ServerConfig } from '../types.js';
6
+ export declare function handleGetConcept(cache: CacheManager, config: ServerConfig, args: Record<string, unknown>): Promise<{
7
+ content: Array<{
8
+ type: string;
9
+ text: string;
10
+ }>;
11
+ }>;
12
+ export declare function handleListAvailableDocs(cache: CacheManager, config: ServerConfig): Promise<{
13
+ content: Array<{
14
+ type: string;
15
+ text: string;
16
+ }>;
17
+ }>;
18
+ //# sourceMappingURL=concepts.d.ts.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"concepts.d.ts","sourceRoot":"","sources":["../../../src/docs/tools/concepts.ts"],"names":[],"mappings":"AAAA;;GAEG;AAEH,OAAO,KAAK,EAAE,YAAY,EAAE,MAAM,aAAa,CAAC;AAGhD,OAAO,KAAK,EAAE,YAAY,EAAE,MAAM,aAAa,CAAC;AAOhD,wBAAsB,gBAAgB,CACpC,KAAK,EAAE,YAAY,EACnB,MAAM,EAAE,YAAY,EACpB,IAAI,EAAE,MAAM,CAAC,MAAM,EAAE,OAAO,CAAC,GAC5B,OAAO,CAAC;IAAE,OAAO,EAAE,KAAK,CAAC;QAAE,IAAI,EAAE,MAAM,CAAC;QAAC,IAAI,EAAE,MAAM,CAAA;KAAE,CAAC,CAAA;CAAE,CAAC,CA8D7D;AAED,wBAAsB,uBAAuB,CAC3C,KAAK,EAAE,YAAY,EACnB,MAAM,EAAE,YAAY,GACnB,OAAO,CAAC;IAAE,OAAO,EAAE,KAAK,CAAC;QAAE,IAAI,EAAE,MAAM,CAAC;QAAC,IAAI,EAAE,MAAM,CAAA;KAAE,CAAC,CAAA;CAAE,CAAC,CAgF7D"}