@get-technology-inc/jamf-docs-mcp-server 1.0.0 → 1.2.0
This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
- package/README.md +61 -139
- package/dist/completions.d.ts +13 -0
- package/dist/completions.d.ts.map +1 -0
- package/dist/completions.js +31 -0
- package/dist/completions.js.map +1 -0
- package/dist/constants.d.ts +123 -1
- package/dist/constants.d.ts.map +1 -1
- package/dist/constants.js +187 -17
- package/dist/constants.js.map +1 -1
- package/dist/index.js +46 -6
- package/dist/index.js.map +1 -1
- package/dist/prompts/compare-versions.d.ts +7 -0
- package/dist/prompts/compare-versions.d.ts.map +1 -0
- package/dist/prompts/compare-versions.js +56 -0
- package/dist/prompts/compare-versions.js.map +1 -0
- package/dist/prompts/index.d.ts +6 -0
- package/dist/prompts/index.d.ts.map +1 -0
- package/dist/prompts/index.js +12 -0
- package/dist/prompts/index.js.map +1 -0
- package/dist/prompts/setup-guide.d.ts +7 -0
- package/dist/prompts/setup-guide.d.ts.map +1 -0
- package/dist/prompts/setup-guide.js +53 -0
- package/dist/prompts/setup-guide.js.map +1 -0
- package/dist/prompts/troubleshoot.d.ts +7 -0
- package/dist/prompts/troubleshoot.d.ts.map +1 -0
- package/dist/prompts/troubleshoot.js +52 -0
- package/dist/prompts/troubleshoot.js.map +1 -0
- package/dist/resources/index.d.ts +13 -0
- package/dist/resources/index.d.ts.map +1 -0
- package/dist/resources/index.js +121 -0
- package/dist/resources/index.js.map +1 -0
- package/dist/schemas/index.d.ts +29 -63
- package/dist/schemas/index.d.ts.map +1 -1
- package/dist/schemas/index.js +35 -16
- package/dist/schemas/index.js.map +1 -1
- package/dist/schemas/output.d.ts +63 -0
- package/dist/schemas/output.d.ts.map +1 -0
- package/dist/schemas/output.js +63 -0
- package/dist/schemas/output.js.map +1 -0
- package/dist/services/cache.d.ts +37 -12
- package/dist/services/cache.d.ts.map +1 -1
- package/dist/services/cache.js +141 -41
- package/dist/services/cache.js.map +1 -1
- package/dist/services/metadata.d.ts +78 -0
- package/dist/services/metadata.d.ts.map +1 -0
- package/dist/services/metadata.js +362 -0
- package/dist/services/metadata.js.map +1 -0
- package/dist/services/scraper.d.ts +3 -2
- package/dist/services/scraper.d.ts.map +1 -1
- package/dist/services/scraper.js +170 -145
- package/dist/services/scraper.js.map +1 -1
- package/dist/services/search-suggestions.d.ts +27 -0
- package/dist/services/search-suggestions.d.ts.map +1 -0
- package/dist/services/search-suggestions.js +193 -0
- package/dist/services/search-suggestions.js.map +1 -0
- package/dist/services/tokenizer.d.ts +17 -1
- package/dist/services/tokenizer.d.ts.map +1 -1
- package/dist/services/tokenizer.js +122 -66
- package/dist/services/tokenizer.js.map +1 -1
- package/dist/tools/get-article.d.ts +1 -1
- package/dist/tools/get-article.d.ts.map +1 -1
- package/dist/tools/get-article.js +145 -70
- package/dist/tools/get-article.js.map +1 -1
- package/dist/tools/get-toc.d.ts +1 -1
- package/dist/tools/get-toc.d.ts.map +1 -1
- package/dist/tools/get-toc.js +107 -47
- package/dist/tools/get-toc.js.map +1 -1
- package/dist/tools/list-products.d.ts +1 -1
- package/dist/tools/list-products.d.ts.map +1 -1
- package/dist/tools/list-products.js +42 -13
- package/dist/tools/list-products.js.map +1 -1
- package/dist/tools/search.d.ts +1 -1
- package/dist/tools/search.d.ts.map +1 -1
- package/dist/tools/search.js +142 -69
- package/dist/tools/search.js.map +1 -1
- package/dist/transport/http.d.ts +12 -0
- package/dist/transport/http.d.ts.map +1 -0
- package/dist/transport/http.js +297 -0
- package/dist/transport/http.js.map +1 -0
- package/dist/transport/index.d.ts +13 -0
- package/dist/transport/index.d.ts.map +1 -0
- package/dist/transport/index.js +40 -0
- package/dist/transport/index.js.map +1 -0
- package/dist/types.d.ts +12 -18
- package/dist/types.d.ts.map +1 -1
- package/dist/types.js.map +1 -1
- package/dist/utils/doc-type.d.ts +9 -0
- package/dist/utils/doc-type.d.ts.map +1 -0
- package/dist/utils/doc-type.js +16 -0
- package/dist/utils/doc-type.js.map +1 -0
- package/dist/utils/progress.d.ts +13 -0
- package/dist/utils/progress.d.ts.map +1 -0
- package/dist/utils/progress.js +18 -0
- package/dist/utils/progress.js.map +1 -0
- package/dist/utils/sanitize.d.ts +30 -0
- package/dist/utils/sanitize.d.ts.map +1 -0
- package/dist/utils/sanitize.js +57 -0
- package/dist/utils/sanitize.js.map +1 -0
- package/dist/utils/url.d.ts +11 -0
- package/dist/utils/url.d.ts.map +1 -0
- package/dist/utils/url.js +23 -0
- package/dist/utils/url.js.map +1 -0
- package/package.json +8 -5
|
@@ -0,0 +1,27 @@
|
|
|
1
|
+
/**
|
|
2
|
+
* Search suggestions service
|
|
3
|
+
*
|
|
4
|
+
* Generates helpful suggestions when a search returns no results.
|
|
5
|
+
*/
|
|
6
|
+
import { type TopicId } from '../constants.js';
|
|
7
|
+
/**
|
|
8
|
+
* Search suggestion result
|
|
9
|
+
*/
|
|
10
|
+
export interface SearchSuggestions {
|
|
11
|
+
simplifiedQuery: string | null;
|
|
12
|
+
alternativeKeywords: string[];
|
|
13
|
+
suggestedTopics: {
|
|
14
|
+
id: TopicId;
|
|
15
|
+
name: string;
|
|
16
|
+
}[];
|
|
17
|
+
tips: string[];
|
|
18
|
+
}
|
|
19
|
+
/**
|
|
20
|
+
* Generate search suggestions for a query that returned no results
|
|
21
|
+
*/
|
|
22
|
+
export declare function generateSearchSuggestions(query: string, hasProductFilter?: boolean, hasTopicFilter?: boolean): SearchSuggestions;
|
|
23
|
+
/**
|
|
24
|
+
* Format search suggestions as markdown
|
|
25
|
+
*/
|
|
26
|
+
export declare function formatSearchSuggestions(query: string, suggestions: SearchSuggestions): string;
|
|
27
|
+
//# sourceMappingURL=search-suggestions.d.ts.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"search-suggestions.d.ts","sourceRoot":"","sources":["../../src/services/search-suggestions.ts"],"names":[],"mappings":"AAAA;;;;GAIG;AAEH,OAAO,EAAe,KAAK,OAAO,EAAE,MAAM,iBAAiB,CAAC;AAE5D;;GAEG;AACH,MAAM,WAAW,iBAAiB;IAChC,eAAe,EAAE,MAAM,GAAG,IAAI,CAAC;IAC/B,mBAAmB,EAAE,MAAM,EAAE,CAAC;IAC9B,eAAe,EAAE;QAAE,EAAE,EAAE,OAAO,CAAC;QAAC,IAAI,EAAE,MAAM,CAAA;KAAE,EAAE,CAAC;IACjD,IAAI,EAAE,MAAM,EAAE,CAAC;CAChB;AA6KD;;GAEG;AACH,wBAAgB,yBAAyB,CACvC,KAAK,EAAE,MAAM,EACb,gBAAgB,UAAQ,EACxB,cAAc,UAAQ,GACrB,iBAAiB,CASnB;AAED;;GAEG;AACH,wBAAgB,uBAAuB,CAAC,KAAK,EAAE,MAAM,EAAE,WAAW,EAAE,iBAAiB,GAAG,MAAM,CA4B7F"}
|
|
@@ -0,0 +1,193 @@
|
|
|
1
|
+
/**
|
|
2
|
+
* Search suggestions service
|
|
3
|
+
*
|
|
4
|
+
* Generates helpful suggestions when a search returns no results.
|
|
5
|
+
*/
|
|
6
|
+
import { JAMF_TOPICS } from '../constants.js';
|
|
7
|
+
/**
|
|
8
|
+
* Common word mappings for synonyms
|
|
9
|
+
*/
|
|
10
|
+
const KEYWORD_SYNONYMS = {
|
|
11
|
+
'sso': ['single sign-on', 'authentication', 'identity', 'login'],
|
|
12
|
+
'login': ['sign-in', 'authentication', 'sso', 'connect'],
|
|
13
|
+
'mdm': ['mobile device management', 'device management', 'enrollment'],
|
|
14
|
+
'deploy': ['deployment', 'install', 'distribute', 'push'],
|
|
15
|
+
'config': ['configuration', 'settings', 'setup', 'configure'],
|
|
16
|
+
'policy': ['policies', 'rule', 'rules', 'enforcement'],
|
|
17
|
+
'profile': ['profiles', 'configuration profile', 'payload'],
|
|
18
|
+
'app': ['application', 'apps', 'software'],
|
|
19
|
+
'update': ['upgrade', 'patch', 'software update'],
|
|
20
|
+
'security': ['protection', 'secure', 'compliance'],
|
|
21
|
+
'user': ['users', 'account', 'accounts', 'identity'],
|
|
22
|
+
'group': ['groups', 'smart group', 'static group'],
|
|
23
|
+
'script': ['scripts', 'bash', 'shell', 'automation'],
|
|
24
|
+
'api': ['rest api', 'classic api', 'jamf pro api'],
|
|
25
|
+
'certificate': ['certificates', 'cert', 'ssl', 'tls'],
|
|
26
|
+
'network': ['wifi', 'vpn', 'networking', 'proxy'],
|
|
27
|
+
'filevault': ['encryption', 'disk encryption', 'recovery key'],
|
|
28
|
+
'inventory': ['hardware', 'software', 'collection', 'attributes'],
|
|
29
|
+
'remote': ['remote management', 'vnc', 'screen sharing'],
|
|
30
|
+
'protect': ['protection', 'threat', 'malware', 'security']
|
|
31
|
+
};
|
|
32
|
+
/**
|
|
33
|
+
* Stop words to filter out from queries
|
|
34
|
+
*/
|
|
35
|
+
const STOP_WORDS = new Set([
|
|
36
|
+
'the', 'a', 'an', 'is', 'are', 'was', 'were', 'be', 'been', 'being',
|
|
37
|
+
'have', 'has', 'had', 'do', 'does', 'did', 'will', 'would', 'could',
|
|
38
|
+
'should', 'may', 'might', 'must', 'shall', 'can', 'need', 'to', 'of',
|
|
39
|
+
'in', 'for', 'on', 'with', 'at', 'by', 'from', 'as', 'into', 'through',
|
|
40
|
+
'during', 'before', 'after', 'above', 'below', 'between', 'under',
|
|
41
|
+
'and', 'or', 'but', 'if', 'then', 'else', 'when', 'up', 'down', 'out',
|
|
42
|
+
'how', 'what', 'where', 'why', 'who', 'which', 'this', 'that', 'these',
|
|
43
|
+
'those', 'it', 'its', 'my', 'your', 'our', 'their', 'i', 'you', 'we',
|
|
44
|
+
'they', 'me', 'him', 'her', 'us', 'them', 'jamf'
|
|
45
|
+
]);
|
|
46
|
+
/**
|
|
47
|
+
* Extract meaningful keywords from a query
|
|
48
|
+
*/
|
|
49
|
+
function extractKeywords(query) {
|
|
50
|
+
return query
|
|
51
|
+
.toLowerCase()
|
|
52
|
+
.replace(/[^\w\s-]/g, ' ')
|
|
53
|
+
.split(/\s+/)
|
|
54
|
+
.filter(word => word.length > 1 && !STOP_WORDS.has(word));
|
|
55
|
+
}
|
|
56
|
+
/**
|
|
57
|
+
* Simplify a query by removing stop words and keeping key terms
|
|
58
|
+
*/
|
|
59
|
+
function simplifyQuery(query) {
|
|
60
|
+
const keywords = extractKeywords(query);
|
|
61
|
+
if (keywords.length === 0) {
|
|
62
|
+
return null;
|
|
63
|
+
}
|
|
64
|
+
// If query is already simple (2 words or less), no simplification needed
|
|
65
|
+
if (keywords.length <= 2) {
|
|
66
|
+
return null;
|
|
67
|
+
}
|
|
68
|
+
// Keep the most important 2-3 keywords
|
|
69
|
+
return keywords.slice(0, 3).join(' ');
|
|
70
|
+
}
|
|
71
|
+
/**
|
|
72
|
+
* Find alternative keywords based on synonyms
|
|
73
|
+
*/
|
|
74
|
+
function findAlternativeKeywords(query) {
|
|
75
|
+
const keywords = extractKeywords(query);
|
|
76
|
+
const alternatives = new Set();
|
|
77
|
+
for (const keyword of keywords) {
|
|
78
|
+
// Check if keyword has synonyms
|
|
79
|
+
const synonyms = KEYWORD_SYNONYMS[keyword];
|
|
80
|
+
if (synonyms !== undefined) {
|
|
81
|
+
for (const syn of synonyms) {
|
|
82
|
+
alternatives.add(syn);
|
|
83
|
+
}
|
|
84
|
+
}
|
|
85
|
+
// Check if keyword is a synonym of another word
|
|
86
|
+
for (const [key, syns] of Object.entries(KEYWORD_SYNONYMS)) {
|
|
87
|
+
if (syns.includes(keyword)) {
|
|
88
|
+
alternatives.add(key);
|
|
89
|
+
}
|
|
90
|
+
}
|
|
91
|
+
}
|
|
92
|
+
// Remove original keywords from alternatives
|
|
93
|
+
for (const keyword of keywords) {
|
|
94
|
+
alternatives.delete(keyword);
|
|
95
|
+
}
|
|
96
|
+
return Array.from(alternatives).slice(0, 5);
|
|
97
|
+
}
|
|
98
|
+
/**
|
|
99
|
+
* Find relevant topics based on query keywords
|
|
100
|
+
*/
|
|
101
|
+
function findRelevantTopics(query) {
|
|
102
|
+
const keywords = extractKeywords(query);
|
|
103
|
+
const scoredTopics = [];
|
|
104
|
+
for (const [topicId, topic] of Object.entries(JAMF_TOPICS)) {
|
|
105
|
+
let score = 0;
|
|
106
|
+
// Check topic name
|
|
107
|
+
const topicNameLower = topic.name.toLowerCase();
|
|
108
|
+
for (const keyword of keywords) {
|
|
109
|
+
if (topicNameLower.includes(keyword)) {
|
|
110
|
+
score += 3;
|
|
111
|
+
}
|
|
112
|
+
}
|
|
113
|
+
// Check topic keywords
|
|
114
|
+
for (const topicKeyword of topic.keywords) {
|
|
115
|
+
const tkLower = topicKeyword.toLowerCase();
|
|
116
|
+
for (const keyword of keywords) {
|
|
117
|
+
if (tkLower.includes(keyword) || keyword.includes(tkLower)) {
|
|
118
|
+
score += 1;
|
|
119
|
+
}
|
|
120
|
+
}
|
|
121
|
+
}
|
|
122
|
+
if (score > 0) {
|
|
123
|
+
scoredTopics.push({
|
|
124
|
+
id: topicId,
|
|
125
|
+
name: topic.name,
|
|
126
|
+
score
|
|
127
|
+
});
|
|
128
|
+
}
|
|
129
|
+
}
|
|
130
|
+
// Sort by score and return top 3
|
|
131
|
+
return scoredTopics
|
|
132
|
+
.sort((a, b) => b.score - a.score)
|
|
133
|
+
.slice(0, 3)
|
|
134
|
+
.map(({ id, name }) => ({ id, name }));
|
|
135
|
+
}
|
|
136
|
+
/**
|
|
137
|
+
* Generate tips based on query characteristics
|
|
138
|
+
*/
|
|
139
|
+
function generateTips(query, hasFilters) {
|
|
140
|
+
const tips = [];
|
|
141
|
+
const keywords = extractKeywords(query);
|
|
142
|
+
if (keywords.length > 4) {
|
|
143
|
+
tips.push('Try using fewer, more specific keywords');
|
|
144
|
+
}
|
|
145
|
+
if (hasFilters) {
|
|
146
|
+
tips.push('Try removing filters to broaden your search');
|
|
147
|
+
}
|
|
148
|
+
if (query.includes('"')) {
|
|
149
|
+
tips.push('Try removing quotes for a broader search');
|
|
150
|
+
}
|
|
151
|
+
tips.push('Browse the table of contents with `jamf_docs_get_toc`');
|
|
152
|
+
return tips;
|
|
153
|
+
}
|
|
154
|
+
/**
|
|
155
|
+
* Generate search suggestions for a query that returned no results
|
|
156
|
+
*/
|
|
157
|
+
export function generateSearchSuggestions(query, hasProductFilter = false, hasTopicFilter = false) {
|
|
158
|
+
const hasFilters = hasProductFilter || hasTopicFilter;
|
|
159
|
+
return {
|
|
160
|
+
simplifiedQuery: simplifyQuery(query),
|
|
161
|
+
alternativeKeywords: findAlternativeKeywords(query),
|
|
162
|
+
suggestedTopics: findRelevantTopics(query),
|
|
163
|
+
tips: generateTips(query, hasFilters)
|
|
164
|
+
};
|
|
165
|
+
}
|
|
166
|
+
/**
|
|
167
|
+
* Format search suggestions as markdown
|
|
168
|
+
*/
|
|
169
|
+
export function formatSearchSuggestions(query, suggestions) {
|
|
170
|
+
let output = `No results found for "${query}"\n\n`;
|
|
171
|
+
output += '## Search Suggestions\n\n';
|
|
172
|
+
if (suggestions.simplifiedQuery !== null) {
|
|
173
|
+
output += `**Try simpler query**: \`${suggestions.simplifiedQuery}\`\n\n`;
|
|
174
|
+
}
|
|
175
|
+
if (suggestions.alternativeKeywords.length > 0) {
|
|
176
|
+
output += `**Alternative keywords**: ${suggestions.alternativeKeywords.map(k => `\`${k}\``).join(', ')}\n\n`;
|
|
177
|
+
}
|
|
178
|
+
if (suggestions.suggestedTopics.length > 0) {
|
|
179
|
+
output += '**Try filtering by topic**:\n';
|
|
180
|
+
for (const topic of suggestions.suggestedTopics) {
|
|
181
|
+
output += `- \`topic="${topic.id}"\` - ${topic.name}\n`;
|
|
182
|
+
}
|
|
183
|
+
output += '\n';
|
|
184
|
+
}
|
|
185
|
+
if (suggestions.tips.length > 0) {
|
|
186
|
+
output += '**Tips**:\n';
|
|
187
|
+
for (const tip of suggestions.tips) {
|
|
188
|
+
output += `- ${tip}\n`;
|
|
189
|
+
}
|
|
190
|
+
}
|
|
191
|
+
return output;
|
|
192
|
+
}
|
|
193
|
+
//# sourceMappingURL=search-suggestions.js.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"search-suggestions.js","sourceRoot":"","sources":["../../src/services/search-suggestions.ts"],"names":[],"mappings":"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"}
|
|
@@ -13,6 +13,17 @@ export interface TruncateResult {
|
|
|
13
13
|
tokenInfo: TokenInfo;
|
|
14
14
|
remainingSections?: ArticleSection[];
|
|
15
15
|
}
|
|
16
|
+
/**
|
|
17
|
+
* Result of summary extraction
|
|
18
|
+
*/
|
|
19
|
+
export interface SummaryResult {
|
|
20
|
+
title: string;
|
|
21
|
+
summary: string;
|
|
22
|
+
outline: ArticleSection[];
|
|
23
|
+
totalTokens: number;
|
|
24
|
+
estimatedReadTime: number;
|
|
25
|
+
tokenInfo: TokenInfo;
|
|
26
|
+
}
|
|
16
27
|
/**
|
|
17
28
|
* Result of section extraction
|
|
18
29
|
*/
|
|
@@ -25,7 +36,7 @@ export interface ExtractSectionResult {
|
|
|
25
36
|
* Estimate token count for a text string
|
|
26
37
|
* Uses different ratios for code blocks vs normal text
|
|
27
38
|
*/
|
|
28
|
-
export declare function estimateTokens(text: string): number;
|
|
39
|
+
export declare function estimateTokens(text: string | null | undefined): number;
|
|
29
40
|
/**
|
|
30
41
|
* Create a TokenInfo object
|
|
31
42
|
*/
|
|
@@ -45,6 +56,11 @@ export declare function extractSection(content: string, sectionIdentifier: strin
|
|
|
45
56
|
* - Lists remaining sections when truncated
|
|
46
57
|
*/
|
|
47
58
|
export declare function truncateToTokenLimit(content: string, maxTokens?: number): TruncateResult;
|
|
59
|
+
/**
|
|
60
|
+
* Extract summary from Markdown content
|
|
61
|
+
* Returns the first paragraph and an outline of sections with token estimates
|
|
62
|
+
*/
|
|
63
|
+
export declare function extractSummary(content: string, title: string, maxTokens?: number): SummaryResult;
|
|
48
64
|
/**
|
|
49
65
|
* Calculate pagination info
|
|
50
66
|
*/
|
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"tokenizer.d.ts","sourceRoot":"","sources":["../../src/services/tokenizer.ts"],"names":[],"mappings":"AAAA;;;;;GAKG;AAGH,OAAO,KAAK,EAAE,SAAS,EAAE,cAAc,EAAE,MAAM,aAAa,CAAC;AAE7D;;GAEG;AACH,MAAM,WAAW,cAAc;IAC7B,OAAO,EAAE,MAAM,CAAC;IAChB,SAAS,EAAE,SAAS,CAAC;IACrB,iBAAiB,CAAC,EAAE,cAAc,EAAE,CAAC;CACtC;AAED;;GAEG;AACH,MAAM,WAAW,oBAAoB;IACnC,OAAO,EAAE,MAAM,CAAC;IAChB,OAAO,EAAE,cAAc,GAAG,IAAI,CAAC;IAC/B,SAAS,EAAE,SAAS,CAAC;CACtB;AAED;;;GAGG;AACH,wBAAgB,cAAc,CAAC,IAAI,EAAE,MAAM,GAAG,MAAM,
|
|
1
|
+
{"version":3,"file":"tokenizer.d.ts","sourceRoot":"","sources":["../../src/services/tokenizer.ts"],"names":[],"mappings":"AAAA;;;;;GAKG;AAGH,OAAO,KAAK,EAAE,SAAS,EAAE,cAAc,EAAE,MAAM,aAAa,CAAC;AAE7D;;GAEG;AACH,MAAM,WAAW,cAAc;IAC7B,OAAO,EAAE,MAAM,CAAC;IAChB,SAAS,EAAE,SAAS,CAAC;IACrB,iBAAiB,CAAC,EAAE,cAAc,EAAE,CAAC;CACtC;AAED;;GAEG;AACH,MAAM,WAAW,aAAa;IAC5B,KAAK,EAAE,MAAM,CAAC;IACd,OAAO,EAAE,MAAM,CAAC;IAChB,OAAO,EAAE,cAAc,EAAE,CAAC;IAC1B,WAAW,EAAE,MAAM,CAAC;IACpB,iBAAiB,EAAE,MAAM,CAAC;IAC1B,SAAS,EAAE,SAAS,CAAC;CACtB;AAED;;GAEG;AACH,MAAM,WAAW,oBAAoB;IACnC,OAAO,EAAE,MAAM,CAAC;IAChB,OAAO,EAAE,cAAc,GAAG,IAAI,CAAC;IAC/B,SAAS,EAAE,SAAS,CAAC;CACtB;AAED;;;GAGG;AACH,wBAAgB,cAAc,CAAC,IAAI,EAAE,MAAM,GAAG,IAAI,GAAG,SAAS,GAAG,MAAM,CAgBtE;AAED;;GAEG;AACH,wBAAgB,eAAe,CAC7B,OAAO,EAAE,MAAM,EACf,SAAS,EAAE,MAAM,EACjB,SAAS,UAAQ,GAChB,SAAS,CAMX;AAED;;GAEG;AACH,wBAAgB,eAAe,CAAC,OAAO,EAAE,MAAM,GAAG,cAAc,EAAE,CAkCjE;AAYD;;GAEG;AACH,wBAAgB,cAAc,CAC5B,OAAO,EAAE,MAAM,EACf,iBAAiB,EAAE,MAAM,EACzB,SAAS,GAAE,MAAwC,GAClD,oBAAoB,CAyCtB;AAED;;;;;GAKG;AACH,wBAAgB,oBAAoB,CAClC,OAAO,EAAE,MAAM,EACf,SAAS,GAAE,MAAwC,GAClD,cAAc,CAiFhB;AAED;;;GAGG;AACH,wBAAgB,cAAc,CAC5B,OAAO,EAAE,MAAM,EACf,KAAK,EAAE,MAAM,EACb,SAAS,GAAE,MAAwC,GAClD,aAAa,CAwFf;AAED;;GAEG;AACH,wBAAgB,mBAAmB,CACjC,UAAU,EAAE,MAAM,EAClB,IAAI,EAAE,MAAM,EACZ,QAAQ,EAAE,MAAM,GACf;IACD,IAAI,EAAE,MAAM,CAAC;IACb,QAAQ,EAAE,MAAM,CAAC;IACjB,UAAU,EAAE,MAAM,CAAC;IACnB,UAAU,EAAE,MAAM,CAAC;IACnB,OAAO,EAAE,OAAO,CAAC;IACjB,OAAO,EAAE,OAAO,CAAC;IACjB,UAAU,EAAE,MAAM,CAAC;IACnB,QAAQ,EAAE,MAAM,CAAC;CAClB,CAcA;AAED;;;GAGG;AACH,wBAAgB,yBAAyB,CAAC,CAAC,EACzC,KAAK,EAAE,CAAC,EAAE,EACV,SAAS,EAAE,MAAM,EACjB,YAAY,EAAE,CAAC,IAAI,EAAE,CAAC,KAAK,MAAM,EACjC,IAAI,SAAI,EACR,QAAQ,SAAK,GACZ;IACD,KAAK,EAAE,CAAC,EAAE,CAAC;IACX,SAAS,EAAE,SAAS,CAAC;IACrB,UAAU,EAAE;QACV,IAAI,EAAE,MAAM,CAAC;QACb,QAAQ,EAAE,MAAM,CAAC;QACjB,UAAU,EAAE,MAAM,CAAC;QACnB,UAAU,EAAE,MAAM,CAAC;QACnB,OAAO,EAAE,OAAO,CAAC;QACjB,OAAO,EAAE,OAAO,CAAC;KAClB,CAAC;CACH,CAsCA"}
|
|
@@ -10,17 +10,13 @@ import { TOKEN_CONFIG } from '../constants.js';
|
|
|
10
10
|
* Uses different ratios for code blocks vs normal text
|
|
11
11
|
*/
|
|
12
12
|
export function estimateTokens(text) {
|
|
13
|
-
if (
|
|
13
|
+
if (text === null || text === undefined || text === '') {
|
|
14
14
|
return 0;
|
|
15
15
|
}
|
|
16
|
-
// Split content into code blocks and regular text
|
|
17
16
|
const codeBlockRegex = /```[\s\S]*?```/g;
|
|
18
|
-
const codeBlocks = text.match(codeBlockRegex)
|
|
17
|
+
const codeBlocks = text.match(codeBlockRegex) ?? [];
|
|
19
18
|
const regularText = text.replace(codeBlockRegex, '');
|
|
20
|
-
|
|
21
|
-
const codeTokens = codeBlocks.reduce((sum, block) => {
|
|
22
|
-
return sum + Math.ceil(block.length / TOKEN_CONFIG.CODE_CHARS_PER_TOKEN);
|
|
23
|
-
}, 0);
|
|
19
|
+
const codeTokens = codeBlocks.reduce((sum, block) => sum + Math.ceil(block.length / TOKEN_CONFIG.CODE_CHARS_PER_TOKEN), 0);
|
|
24
20
|
const textTokens = Math.ceil(regularText.length / TOKEN_CONFIG.CHARS_PER_TOKEN);
|
|
25
21
|
return codeTokens + textTokens;
|
|
26
22
|
}
|
|
@@ -42,44 +38,31 @@ export function extractSections(content) {
|
|
|
42
38
|
const lines = content.split('\n');
|
|
43
39
|
let currentSection = null;
|
|
44
40
|
let sectionContent = '';
|
|
45
|
-
|
|
46
|
-
|
|
47
|
-
|
|
48
|
-
|
|
49
|
-
|
|
50
|
-
|
|
51
|
-
|
|
52
|
-
|
|
53
|
-
|
|
54
|
-
|
|
55
|
-
|
|
56
|
-
|
|
57
|
-
|
|
58
|
-
|
|
59
|
-
// Start new section
|
|
60
|
-
const title = headingMatch[2]?.trim() ?? '';
|
|
61
|
-
const level = headingMatch[1]?.length ?? 1;
|
|
41
|
+
function saveCurrentSection() {
|
|
42
|
+
if (currentSection !== null) {
|
|
43
|
+
sections.push({
|
|
44
|
+
id: generateSectionId(currentSection.title),
|
|
45
|
+
title: currentSection.title,
|
|
46
|
+
level: currentSection.level,
|
|
47
|
+
tokenCount: estimateTokens(sectionContent)
|
|
48
|
+
});
|
|
49
|
+
}
|
|
50
|
+
}
|
|
51
|
+
for (const line of lines) {
|
|
52
|
+
const headingMatch = /^(#{1,6})\s+(.+)$/.exec(line);
|
|
53
|
+
if (headingMatch !== null) {
|
|
54
|
+
saveCurrentSection();
|
|
62
55
|
currentSection = {
|
|
63
|
-
title,
|
|
64
|
-
level
|
|
65
|
-
startLine: i
|
|
56
|
+
title: headingMatch[2]?.trim() ?? '',
|
|
57
|
+
level: headingMatch[1]?.length ?? 1
|
|
66
58
|
};
|
|
67
|
-
sectionContent = line
|
|
59
|
+
sectionContent = `${line}\n`;
|
|
68
60
|
}
|
|
69
|
-
else if (currentSection) {
|
|
70
|
-
sectionContent += line
|
|
61
|
+
else if (currentSection !== null) {
|
|
62
|
+
sectionContent += `${line}\n`;
|
|
71
63
|
}
|
|
72
64
|
}
|
|
73
|
-
|
|
74
|
-
if (currentSection) {
|
|
75
|
-
const id = generateSectionId(currentSection.title);
|
|
76
|
-
sections.push({
|
|
77
|
-
id,
|
|
78
|
-
title: currentSection.title,
|
|
79
|
-
level: currentSection.level,
|
|
80
|
-
tokenCount: estimateTokens(sectionContent)
|
|
81
|
-
});
|
|
82
|
-
}
|
|
65
|
+
saveCurrentSection();
|
|
83
66
|
return sections;
|
|
84
67
|
}
|
|
85
68
|
/**
|
|
@@ -97,43 +80,31 @@ function generateSectionId(title) {
|
|
|
97
80
|
export function extractSection(content, sectionIdentifier, maxTokens = TOKEN_CONFIG.DEFAULT_MAX_TOKENS) {
|
|
98
81
|
const lines = content.split('\n');
|
|
99
82
|
const normalizedId = generateSectionId(sectionIdentifier);
|
|
100
|
-
let inTargetSection = false;
|
|
101
|
-
let targetLevel = 0;
|
|
102
83
|
const sectionLines = [];
|
|
103
84
|
let foundSection = null;
|
|
104
|
-
|
|
105
|
-
|
|
106
|
-
const headingMatch =
|
|
107
|
-
if (headingMatch) {
|
|
85
|
+
let targetLevel = 0;
|
|
86
|
+
for (const line of lines) {
|
|
87
|
+
const headingMatch = /^(#{1,6})\s+(.+)$/.exec(line);
|
|
88
|
+
if (headingMatch !== null) {
|
|
108
89
|
const level = headingMatch[1]?.length ?? 1;
|
|
109
90
|
const title = headingMatch[2]?.trim() ?? '';
|
|
110
91
|
const id = generateSectionId(title);
|
|
111
|
-
if
|
|
112
|
-
|
|
113
|
-
|
|
114
|
-
break; // End of target section
|
|
115
|
-
}
|
|
92
|
+
// End section if we hit same or higher level heading
|
|
93
|
+
if (foundSection !== null && level <= targetLevel) {
|
|
94
|
+
break;
|
|
116
95
|
}
|
|
117
96
|
// Check if this is the target section
|
|
118
|
-
if (id === normalizedId || title.toLowerCase().includes(sectionIdentifier.toLowerCase())) {
|
|
119
|
-
inTargetSection = true;
|
|
97
|
+
if (foundSection === null && (id === normalizedId || title.toLowerCase().includes(sectionIdentifier.toLowerCase()))) {
|
|
120
98
|
targetLevel = level;
|
|
121
|
-
foundSection = {
|
|
122
|
-
id,
|
|
123
|
-
title,
|
|
124
|
-
level,
|
|
125
|
-
tokenCount: 0 // Will be calculated later
|
|
126
|
-
};
|
|
99
|
+
foundSection = { id, title, level, tokenCount: 0 };
|
|
127
100
|
}
|
|
128
101
|
}
|
|
129
|
-
if (
|
|
102
|
+
if (foundSection !== null) {
|
|
130
103
|
sectionLines.push(line);
|
|
131
104
|
}
|
|
132
105
|
}
|
|
133
|
-
const
|
|
134
|
-
|
|
135
|
-
const truncateResult = truncateToTokenLimit(sectionContent, maxTokens);
|
|
136
|
-
if (foundSection) {
|
|
106
|
+
const truncateResult = truncateToTokenLimit(sectionLines.join('\n'), maxTokens);
|
|
107
|
+
if (foundSection !== null) {
|
|
137
108
|
foundSection.tokenCount = truncateResult.tokenInfo.tokenCount;
|
|
138
109
|
}
|
|
139
110
|
return {
|
|
@@ -176,7 +147,7 @@ export function truncateToTokenLimit(content, maxTokens = TOKEN_CONFIG.DEFAULT_M
|
|
|
176
147
|
if (line.startsWith('```')) {
|
|
177
148
|
inCodeBlock = !inCodeBlock;
|
|
178
149
|
}
|
|
179
|
-
const lineTokens = estimateTokens(line
|
|
150
|
+
const lineTokens = estimateTokens(`${line}\n`);
|
|
180
151
|
if (runningTokens + lineTokens > effectiveMax) {
|
|
181
152
|
// Close any open code block
|
|
182
153
|
if (inCodeBlock) {
|
|
@@ -216,12 +187,97 @@ export function truncateToTokenLimit(content, maxTokens = TOKEN_CONFIG.DEFAULT_M
|
|
|
216
187
|
remainingSections
|
|
217
188
|
};
|
|
218
189
|
}
|
|
190
|
+
/**
|
|
191
|
+
* Extract summary from Markdown content
|
|
192
|
+
* Returns the first paragraph and an outline of sections with token estimates
|
|
193
|
+
*/
|
|
194
|
+
export function extractSummary(content, title, maxTokens = TOKEN_CONFIG.DEFAULT_MAX_TOKENS) {
|
|
195
|
+
const lines = content.split('\n');
|
|
196
|
+
const sections = extractSections(content);
|
|
197
|
+
const totalTokens = estimateTokens(content);
|
|
198
|
+
// Extract first meaningful paragraph (skip headings, code blocks, and empty lines)
|
|
199
|
+
let summary = '';
|
|
200
|
+
let inParagraph = false;
|
|
201
|
+
let inCodeBlock = false;
|
|
202
|
+
for (const line of lines) {
|
|
203
|
+
// Track code blocks
|
|
204
|
+
if (line.startsWith('```')) {
|
|
205
|
+
inCodeBlock = !inCodeBlock;
|
|
206
|
+
if (inParagraph) {
|
|
207
|
+
break;
|
|
208
|
+
}
|
|
209
|
+
continue;
|
|
210
|
+
}
|
|
211
|
+
// Skip content inside code blocks
|
|
212
|
+
if (inCodeBlock) {
|
|
213
|
+
continue;
|
|
214
|
+
}
|
|
215
|
+
// Skip headings
|
|
216
|
+
if (line.startsWith('#')) {
|
|
217
|
+
if (inParagraph) {
|
|
218
|
+
break;
|
|
219
|
+
}
|
|
220
|
+
continue;
|
|
221
|
+
}
|
|
222
|
+
// Skip empty lines at the start
|
|
223
|
+
if (line.trim() === '' && !inParagraph) {
|
|
224
|
+
continue;
|
|
225
|
+
}
|
|
226
|
+
// Skip list items and other non-paragraph content
|
|
227
|
+
if (line.trim().startsWith('-') || line.trim().startsWith('*') || line.trim().startsWith('|')) {
|
|
228
|
+
if (inParagraph) {
|
|
229
|
+
break;
|
|
230
|
+
}
|
|
231
|
+
continue;
|
|
232
|
+
}
|
|
233
|
+
// Found content
|
|
234
|
+
if (line.trim() !== '') {
|
|
235
|
+
inParagraph = true;
|
|
236
|
+
summary += `${line} `;
|
|
237
|
+
}
|
|
238
|
+
else if (inParagraph) {
|
|
239
|
+
// End of paragraph
|
|
240
|
+
break;
|
|
241
|
+
}
|
|
242
|
+
}
|
|
243
|
+
summary = summary.trim();
|
|
244
|
+
// If no paragraph found, use first 200 chars of content
|
|
245
|
+
if (summary === '') {
|
|
246
|
+
const plainText = content.replace(/^#+\s+.+$/gm, '').replace(/\n+/g, ' ').trim();
|
|
247
|
+
summary = plainText.slice(0, 200) + (plainText.length > 200 ? '...' : '');
|
|
248
|
+
}
|
|
249
|
+
// Estimate read time (assuming 200 words per minute, ~5 chars per word)
|
|
250
|
+
const wordCount = Math.ceil(content.length / 5);
|
|
251
|
+
const estimatedReadTime = Math.max(1, Math.ceil(wordCount / 200));
|
|
252
|
+
// Build the summary output
|
|
253
|
+
let output = `# ${title}\n\n`;
|
|
254
|
+
output += `## Summary\n\n${summary}\n\n`;
|
|
255
|
+
output += `## Article Outline (${sections.length} sections)\n\n`;
|
|
256
|
+
for (const section of sections) {
|
|
257
|
+
const indent = ' '.repeat(Math.max(0, section.level - 1));
|
|
258
|
+
output += `${indent}- ${section.title} (~${section.tokenCount} tokens)\n`;
|
|
259
|
+
}
|
|
260
|
+
output += `\n*Estimated read time: ${estimatedReadTime} min | Total: ${totalTokens.toLocaleString()} tokens*\n`;
|
|
261
|
+
const outputTokens = estimateTokens(output);
|
|
262
|
+
return {
|
|
263
|
+
title,
|
|
264
|
+
summary,
|
|
265
|
+
outline: sections,
|
|
266
|
+
totalTokens,
|
|
267
|
+
estimatedReadTime,
|
|
268
|
+
tokenInfo: {
|
|
269
|
+
tokenCount: outputTokens,
|
|
270
|
+
truncated: false,
|
|
271
|
+
maxTokens
|
|
272
|
+
}
|
|
273
|
+
};
|
|
274
|
+
}
|
|
219
275
|
/**
|
|
220
276
|
* Calculate pagination info
|
|
221
277
|
*/
|
|
222
278
|
export function calculatePagination(totalItems, page, pageSize) {
|
|
223
279
|
const totalPages = Math.ceil(totalItems / pageSize);
|
|
224
|
-
const normalizedPage = Math.min(Math.max(1, page), totalPages
|
|
280
|
+
const normalizedPage = Math.min(Math.max(1, page), Math.max(totalPages, 1));
|
|
225
281
|
return {
|
|
226
282
|
page: normalizedPage,
|
|
227
283
|
pageSize,
|
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"tokenizer.js","sourceRoot":"","sources":["../../src/services/tokenizer.ts"],"names":[],"mappings":"AAAA;;;;;GAKG;AAEH,OAAO,EAAE,YAAY,EAAE,MAAM,iBAAiB,CAAC;
|
|
1
|
+
{"version":3,"file":"tokenizer.js","sourceRoot":"","sources":["../../src/services/tokenizer.ts"],"names":[],"mappings":"AAAA;;;;;GAKG;AAEH,OAAO,EAAE,YAAY,EAAE,MAAM,iBAAiB,CAAC;AAiC/C;;;GAGG;AACH,MAAM,UAAU,cAAc,CAAC,IAA+B;IAC5D,IAAI,IAAI,KAAK,IAAI,IAAI,IAAI,KAAK,SAAS,IAAI,IAAI,KAAK,EAAE,EAAE,CAAC;QACvD,OAAO,CAAC,CAAC;IACX,CAAC;IAED,MAAM,cAAc,GAAG,iBAAiB,CAAC;IACzC,MAAM,UAAU,GAAG,IAAI,CAAC,KAAK,CAAC,cAAc,CAAC,IAAI,EAAE,CAAC;IACpD,MAAM,WAAW,GAAG,IAAI,CAAC,OAAO,CAAC,cAAc,EAAE,EAAE,CAAC,CAAC;IAErD,MAAM,UAAU,GAAG,UAAU,CAAC,MAAM,CAClC,CAAC,GAAG,EAAE,KAAK,EAAE,EAAE,CAAC,GAAG,GAAG,IAAI,CAAC,IAAI,CAAC,KAAK,CAAC,MAAM,GAAG,YAAY,CAAC,oBAAoB,CAAC,EACjF,CAAC,CACF,CAAC;IACF,MAAM,UAAU,GAAG,IAAI,CAAC,IAAI,CAAC,WAAW,CAAC,MAAM,GAAG,YAAY,CAAC,eAAe,CAAC,CAAC;IAEhF,OAAO,UAAU,GAAG,UAAU,CAAC;AACjC,CAAC;AAED;;GAEG;AACH,MAAM,UAAU,eAAe,CAC7B,OAAe,EACf,SAAiB,EACjB,SAAS,GAAG,KAAK;IAEjB,OAAO;QACL,UAAU,EAAE,cAAc,CAAC,OAAO,CAAC;QACnC,SAAS;QACT,SAAS;KACV,CAAC;AACJ,CAAC;AAED;;GAEG;AACH,MAAM,UAAU,eAAe,CAAC,OAAe;IAC7C,MAAM,QAAQ,GAAqB,EAAE,CAAC;IACtC,MAAM,KAAK,GAAG,OAAO,CAAC,KAAK,CAAC,IAAI,CAAC,CAAC;IAClC,IAAI,cAAc,GAA4C,IAAI,CAAC;IACnE,IAAI,cAAc,GAAG,EAAE,CAAC;IAExB,SAAS,kBAAkB;QACzB,IAAI,cAAc,KAAK,IAAI,EAAE,CAAC;YAC5B,QAAQ,CAAC,IAAI,CAAC;gBACZ,EAAE,EAAE,iBAAiB,CAAC,cAAc,CAAC,KAAK,CAAC;gBAC3C,KAAK,EAAE,cAAc,CAAC,KAAK;gBAC3B,KAAK,EAAE,cAAc,CAAC,KAAK;gBAC3B,UAAU,EAAE,cAAc,CAAC,cAAc,CAAC;aAC3C,CAAC,CAAC;QACL,CAAC;IACH,CAAC;IAED,KAAK,MAAM,IAAI,IAAI,KAAK,EAAE,CAAC;QACzB,MAAM,YAAY,GAAG,mBAAmB,CAAC,IAAI,CAAC,IAAI,CAAC,CAAC;QAEpD,IAAI,YAAY,KAAK,IAAI,EAAE,CAAC;YAC1B,kBAAkB,EAAE,CAAC;YACrB,cAAc,GAAG;gBACf,KAAK,EAAE,YAAY,CAAC,CAAC,CAAC,EAAE,IAAI,EAAE,IAAI,EAAE;gBACpC,KAAK,EAAE,YAAY,CAAC,CAAC,CAAC,EAAE,MAAM,IAAI,CAAC;aACpC,CAAC;YACF,cAAc,GAAG,GAAG,IAAI,IAAI,CAAC;QAC/B,CAAC;aAAM,IAAI,cAAc,KAAK,IAAI,EAAE,CAAC;YACnC,cAAc,IAAI,GAAG,IAAI,IAAI,CAAC;QAChC,CAAC;IACH,CAAC;IAED,kBAAkB,EAAE,CAAC;IACrB,OAAO,QAAQ,CAAC;AAClB,CAAC;AAED;;GAEG;AACH,SAAS,iBAAiB,CAAC,KAAa;IACtC,OAAO,KAAK;SACT,WAAW,EAAE;SACb,OAAO,CAAC,aAAa,EAAE,GAAG,CAAC;SAC3B,OAAO,CAAC,QAAQ,EAAE,EAAE,CAAC,CAAC;AAC3B,CAAC;AAED;;GAEG;AACH,MAAM,UAAU,cAAc,CAC5B,OAAe,EACf,iBAAyB,EACzB,YAAoB,YAAY,CAAC,kBAAkB;IAEnD,MAAM,KAAK,GAAG,OAAO,CAAC,KAAK,CAAC,IAAI,CAAC,CAAC;IAClC,MAAM,YAAY,GAAG,iBAAiB,CAAC,iBAAiB,CAAC,CAAC;IAC1D,MAAM,YAAY,GAAa,EAAE,CAAC;IAClC,IAAI,YAAY,GAA0B,IAAI,CAAC;IAC/C,IAAI,WAAW,GAAG,CAAC,CAAC;IAEpB,KAAK,MAAM,IAAI,IAAI,KAAK,EAAE,CAAC;QACzB,MAAM,YAAY,GAAG,mBAAmB,CAAC,IAAI,CAAC,IAAI,CAAC,CAAC;QAEpD,IAAI,YAAY,KAAK,IAAI,EAAE,CAAC;YAC1B,MAAM,KAAK,GAAG,YAAY,CAAC,CAAC,CAAC,EAAE,MAAM,IAAI,CAAC,CAAC;YAC3C,MAAM,KAAK,GAAG,YAAY,CAAC,CAAC,CAAC,EAAE,IAAI,EAAE,IAAI,EAAE,CAAC;YAC5C,MAAM,EAAE,GAAG,iBAAiB,CAAC,KAAK,CAAC,CAAC;YAEpC,qDAAqD;YACrD,IAAI,YAAY,KAAK,IAAI,IAAI,KAAK,IAAI,WAAW,EAAE,CAAC;gBAAA,MAAM;YAAA,CAAC;YAE3D,sCAAsC;YACtC,IAAI,YAAY,KAAK,IAAI,IAAI,CAAC,EAAE,KAAK,YAAY,IAAI,KAAK,CAAC,WAAW,EAAE,CAAC,QAAQ,CAAC,iBAAiB,CAAC,WAAW,EAAE,CAAC,CAAC,EAAE,CAAC;gBACpH,WAAW,GAAG,KAAK,CAAC;gBACpB,YAAY,GAAG,EAAE,EAAE,EAAE,KAAK,EAAE,KAAK,EAAE,UAAU,EAAE,CAAC,EAAE,CAAC;YACrD,CAAC;QACH,CAAC;QAED,IAAI,YAAY,KAAK,IAAI,EAAE,CAAC;YAC1B,YAAY,CAAC,IAAI,CAAC,IAAI,CAAC,CAAC;QAC1B,CAAC;IACH,CAAC;IAED,MAAM,cAAc,GAAG,oBAAoB,CAAC,YAAY,CAAC,IAAI,CAAC,IAAI,CAAC,EAAE,SAAS,CAAC,CAAC;IAEhF,IAAI,YAAY,KAAK,IAAI,EAAE,CAAC;QAC1B,YAAY,CAAC,UAAU,GAAG,cAAc,CAAC,SAAS,CAAC,UAAU,CAAC;IAChE,CAAC;IAED,OAAO;QACL,OAAO,EAAE,cAAc,CAAC,OAAO;QAC/B,OAAO,EAAE,YAAY;QACrB,SAAS,EAAE,cAAc,CAAC,SAAS;KACpC,CAAC;AACJ,CAAC;AAED;;;;;GAKG;AACH,MAAM,UAAU,oBAAoB,CAClC,OAAe,EACf,YAAoB,YAAY,CAAC,kBAAkB;IAEnD,MAAM,aAAa,GAAG,cAAc,CAAC,OAAO,CAAC,CAAC;IAE9C,gCAAgC;IAChC,IAAI,aAAa,IAAI,SAAS,EAAE,CAAC;QAC/B,OAAO;YACL,OAAO;YACP,SAAS,EAAE;gBACT,UAAU,EAAE,aAAa;gBACzB,SAAS,EAAE,KAAK;gBAChB,SAAS;aACV;SACF,CAAC;IACJ,CAAC;IAED,yCAAyC;IACzC,MAAM,WAAW,GAAG,eAAe,CAAC,OAAO,CAAC,CAAC;IAE7C,mBAAmB;IACnB,MAAM,KAAK,GAAG,OAAO,CAAC,KAAK,CAAC,IAAI,CAAC,CAAC;IAClC,MAAM,cAAc,GAAa,EAAE,CAAC;IACpC,IAAI,aAAa,GAAG,CAAC,CAAC;IACtB,IAAI,WAAW,GAAG,KAAK,CAAC;IAExB,mEAAmE;IACnE,MAAM,cAAc,GAAG,IAAI,CAAC,GAAG,CAAC,GAAG,EAAE,IAAI,CAAC,KAAK,CAAC,SAAS,GAAG,GAAG,CAAC,CAAC,CAAC;IAClE,MAAM,YAAY,GAAG,SAAS,GAAG,cAAc,CAAC;IAEhD,KAAK,MAAM,IAAI,IAAI,KAAK,EAAE,CAAC;QACzB,oBAAoB;QACpB,IAAI,IAAI,CAAC,UAAU,CAAC,KAAK,CAAC,EAAE,CAAC;YAC3B,WAAW,GAAG,CAAC,WAAW,CAAC;QAC7B,CAAC;QAED,MAAM,UAAU,GAAG,cAAc,CAAC,GAAG,IAAI,IAAI,CAAC,CAAC;QAE/C,IAAI,aAAa,GAAG,UAAU,GAAG,YAAY,EAAE,CAAC;YAC9C,4BAA4B;YAC5B,IAAI,WAAW,EAAE,CAAC;gBAChB,cAAc,CAAC,IAAI,CAAC,KAAK,CAAC,CAAC;YAC7B,CAAC;YACD,MAAM;QACR,CAAC;QAED,cAAc,CAAC,IAAI,CAAC,IAAI,CAAC,CAAC;QAC1B,aAAa,IAAI,UAAU,CAAC;IAC9B,CAAC;IAED,wDAAwD;IACxD,MAAM,gBAAgB,GAAG,cAAc,CAAC,IAAI,CAAC,IAAI,CAAC,CAAC;IACnD,MAAM,gBAAgB,GAAG,eAAe,CAAC,gBAAgB,CAAC,CAAC;IAC3D,MAAM,WAAW,GAAG,IAAI,GAAG,CAAC,gBAAgB,CAAC,GAAG,CAAC,CAAC,CAAC,EAAE,CAAC,CAAC,CAAC,EAAE,CAAC,CAAC,CAAC;IAE7D,MAAM,iBAAiB,GAAG,WAAW,CAAC,MAAM,CAAC,CAAC,CAAC,EAAE,CAAC,CAAC,WAAW,CAAC,GAAG,CAAC,CAAC,CAAC,EAAE,CAAC,CAAC,CAAC;IAE1E,0BAA0B;IAC1B,IAAI,MAAM,GAAG,uDAAuD,CAAC;IAErE,IAAI,iBAAiB,CAAC,MAAM,GAAG,CAAC,EAAE,CAAC;QACjC,MAAM,IAAI,6BAA6B,CAAC;QACxC,KAAK,MAAM,OAAO,IAAI,iBAAiB,CAAC,KAAK,CAAC,CAAC,EAAE,EAAE,CAAC,EAAE,CAAC;YACrD,MAAM,MAAM,GAAG,IAAI,CAAC,MAAM,CAAC,IAAI,CAAC,GAAG,CAAC,CAAC,EAAE,OAAO,CAAC,KAAK,GAAG,CAAC,CAAC,CAAC,CAAC;YAC3D,MAAM,IAAI,GAAG,MAAM,KAAK,OAAO,CAAC,KAAK,MAAM,OAAO,CAAC,UAAU,YAAY,CAAC;QAC5E,CAAC;QACD,IAAI,iBAAiB,CAAC,MAAM,GAAG,EAAE,EAAE,CAAC;YAClC,MAAM,IAAI,aAAa,iBAAiB,CAAC,MAAM,GAAG,EAAE,mBAAmB,CAAC;QAC1E,CAAC;QACD,MAAM,IAAI,gEAAgE,CAAC;IAC7E,CAAC;IAED,MAAM,YAAY,GAAG,gBAAgB,GAAG,MAAM,CAAC;IAE/C,OAAO;QACL,OAAO,EAAE,YAAY;QACrB,SAAS,EAAE;YACT,UAAU,EAAE,cAAc,CAAC,YAAY,CAAC;YACxC,SAAS,EAAE,IAAI;YACf,SAAS;SACV;QACD,iBAAiB;KAClB,CAAC;AACJ,CAAC;AAED;;;GAGG;AACH,MAAM,UAAU,cAAc,CAC5B,OAAe,EACf,KAAa,EACb,YAAoB,YAAY,CAAC,kBAAkB;IAEnD,MAAM,KAAK,GAAG,OAAO,CAAC,KAAK,CAAC,IAAI,CAAC,CAAC;IAClC,MAAM,QAAQ,GAAG,eAAe,CAAC,OAAO,CAAC,CAAC;IAC1C,MAAM,WAAW,GAAG,cAAc,CAAC,OAAO,CAAC,CAAC;IAE5C,mFAAmF;IACnF,IAAI,OAAO,GAAG,EAAE,CAAC;IACjB,IAAI,WAAW,GAAG,KAAK,CAAC;IACxB,IAAI,WAAW,GAAG,KAAK,CAAC;IAExB,KAAK,MAAM,IAAI,IAAI,KAAK,EAAE,CAAC;QACzB,oBAAoB;QACpB,IAAI,IAAI,CAAC,UAAU,CAAC,KAAK,CAAC,EAAE,CAAC;YAC3B,WAAW,GAAG,CAAC,WAAW,CAAC;YAC3B,IAAI,WAAW,EAAE,CAAC;gBAAA,MAAM;YAAA,CAAC;YACzB,SAAS;QACX,CAAC;QAED,kCAAkC;QAClC,IAAI,WAAW,EAAE,CAAC;YAChB,SAAS;QACX,CAAC;QAED,gBAAgB;QAChB,IAAI,IAAI,CAAC,UAAU,CAAC,GAAG,CAAC,EAAE,CAAC;YACzB,IAAI,WAAW,EAAE,CAAC;gBAAA,MAAM;YAAA,CAAC;YACzB,SAAS;QACX,CAAC;QAED,gCAAgC;QAChC,IAAI,IAAI,CAAC,IAAI,EAAE,KAAK,EAAE,IAAI,CAAC,WAAW,EAAE,CAAC;YACvC,SAAS;QACX,CAAC;QAED,kDAAkD;QAClD,IAAI,IAAI,CAAC,IAAI,EAAE,CAAC,UAAU,CAAC,GAAG,CAAC,IAAI,IAAI,CAAC,IAAI,EAAE,CAAC,UAAU,CAAC,GAAG,CAAC,IAAI,IAAI,CAAC,IAAI,EAAE,CAAC,UAAU,CAAC,GAAG,CAAC,EAAE,CAAC;YAC9F,IAAI,WAAW,EAAE,CAAC;gBAAA,MAAM;YAAA,CAAC;YACzB,SAAS;QACX,CAAC;QAED,gBAAgB;QAChB,IAAI,IAAI,CAAC,IAAI,EAAE,KAAK,EAAE,EAAE,CAAC;YACvB,WAAW,GAAG,IAAI,CAAC;YACnB,OAAO,IAAI,GAAG,IAAI,GAAG,CAAC;QACxB,CAAC;aAAM,IAAI,WAAW,EAAE,CAAC;YACvB,mBAAmB;YACnB,MAAM;QACR,CAAC;IACH,CAAC;IAED,OAAO,GAAG,OAAO,CAAC,IAAI,EAAE,CAAC;IAEzB,wDAAwD;IACxD,IAAI,OAAO,KAAK,EAAE,EAAE,CAAC;QACnB,MAAM,SAAS,GAAG,OAAO,CAAC,OAAO,CAAC,aAAa,EAAE,EAAE,CAAC,CAAC,OAAO,CAAC,MAAM,EAAE,GAAG,CAAC,CAAC,IAAI,EAAE,CAAC;QACjF,OAAO,GAAG,SAAS,CAAC,KAAK,CAAC,CAAC,EAAE,GAAG,CAAC,GAAG,CAAC,SAAS,CAAC,MAAM,GAAG,GAAG,CAAC,CAAC,CAAC,KAAK,CAAC,CAAC,CAAC,EAAE,CAAC,CAAC;IAC5E,CAAC;IAED,wEAAwE;IACxE,MAAM,SAAS,GAAG,IAAI,CAAC,IAAI,CAAC,OAAO,CAAC,MAAM,GAAG,CAAC,CAAC,CAAC;IAChD,MAAM,iBAAiB,GAAG,IAAI,CAAC,GAAG,CAAC,CAAC,EAAE,IAAI,CAAC,IAAI,CAAC,SAAS,GAAG,GAAG,CAAC,CAAC,CAAC;IAElE,2BAA2B;IAC3B,IAAI,MAAM,GAAG,KAAK,KAAK,MAAM,CAAC;IAC9B,MAAM,IAAI,iBAAiB,OAAO,MAAM,CAAC;IACzC,MAAM,IAAI,uBAAuB,QAAQ,CAAC,MAAM,gBAAgB,CAAC;IAEjE,KAAK,MAAM,OAAO,IAAI,QAAQ,EAAE,CAAC;QAC/B,MAAM,MAAM,GAAG,IAAI,CAAC,MAAM,CAAC,IAAI,CAAC,GAAG,CAAC,CAAC,EAAE,OAAO,CAAC,KAAK,GAAG,CAAC,CAAC,CAAC,CAAC;QAC3D,MAAM,IAAI,GAAG,MAAM,KAAK,OAAO,CAAC,KAAK,MAAM,OAAO,CAAC,UAAU,YAAY,CAAC;IAC5E,CAAC;IAED,MAAM,IAAI,2BAA2B,iBAAiB,iBAAiB,WAAW,CAAC,cAAc,EAAE,YAAY,CAAC;IAEhH,MAAM,YAAY,GAAG,cAAc,CAAC,MAAM,CAAC,CAAC;IAE5C,OAAO;QACL,KAAK;QACL,OAAO;QACP,OAAO,EAAE,QAAQ;QACjB,WAAW;QACX,iBAAiB;QACjB,SAAS,EAAE;YACT,UAAU,EAAE,YAAY;YACxB,SAAS,EAAE,KAAK;YAChB,SAAS;SACV;KACF,CAAC;AACJ,CAAC;AAED;;GAEG;AACH,MAAM,UAAU,mBAAmB,CACjC,UAAkB,EAClB,IAAY,EACZ,QAAgB;IAWhB,MAAM,UAAU,GAAG,IAAI,CAAC,IAAI,CAAC,UAAU,GAAG,QAAQ,CAAC,CAAC;IACpD,MAAM,cAAc,GAAG,IAAI,CAAC,GAAG,CAAC,IAAI,CAAC,GAAG,CAAC,CAAC,EAAE,IAAI,CAAC,EAAE,IAAI,CAAC,GAAG,CAAC,UAAU,EAAE,CAAC,CAAC,CAAC,CAAC;IAE5E,OAAO;QACL,IAAI,EAAE,cAAc;QACpB,QAAQ;QACR,UAAU;QACV,UAAU;QACV,OAAO,EAAE,cAAc,GAAG,UAAU;QACpC,OAAO,EAAE,cAAc,GAAG,CAAC;QAC3B,UAAU,EAAE,CAAC,cAAc,GAAG,CAAC,CAAC,GAAG,QAAQ;QAC3C,QAAQ,EAAE,IAAI,CAAC,GAAG,CAAC,cAAc,GAAG,QAAQ,EAAE,UAAU,CAAC;KAC1D,CAAC;AACJ,CAAC;AAED;;;GAGG;AACH,MAAM,UAAU,yBAAyB,CACvC,KAAU,EACV,SAAiB,EACjB,YAAiC,EACjC,IAAI,GAAG,CAAC,EACR,QAAQ,GAAG,EAAE;IAab,MAAM,UAAU,GAAG,mBAAmB,CAAC,KAAK,CAAC,MAAM,EAAE,IAAI,EAAE,QAAQ,CAAC,CAAC;IACrE,MAAM,SAAS,GAAG,KAAK,CAAC,KAAK,CAAC,UAAU,CAAC,UAAU,EAAE,UAAU,CAAC,QAAQ,CAAC,CAAC;IAE1E,yCAAyC;IACzC,MAAM,aAAa,GAAQ,EAAE,CAAC;IAC9B,IAAI,aAAa,GAAG,CAAC,CAAC;IACtB,IAAI,SAAS,GAAG,KAAK,CAAC;IAEtB,KAAK,MAAM,IAAI,IAAI,SAAS,EAAE,CAAC;QAC7B,MAAM,UAAU,GAAG,YAAY,CAAC,IAAI,CAAC,CAAC;QACtC,MAAM,UAAU,GAAG,cAAc,CAAC,UAAU,CAAC,CAAC;QAE9C,IAAI,aAAa,GAAG,UAAU,GAAG,SAAS,EAAE,CAAC;YAC3C,SAAS,GAAG,IAAI,CAAC;YACjB,MAAM;QACR,CAAC;QAED,aAAa,CAAC,IAAI,CAAC,IAAI,CAAC,CAAC;QACzB,aAAa,IAAI,UAAU,CAAC;IAC9B,CAAC;IAED,OAAO;QACL,KAAK,EAAE,aAAa;QACpB,SAAS,EAAE;YACT,UAAU,EAAE,aAAa;YACzB,SAAS;YACT,SAAS;SACV;QACD,UAAU,EAAE;YACV,IAAI,EAAE,UAAU,CAAC,IAAI;YACrB,QAAQ,EAAE,UAAU,CAAC,QAAQ;YAC7B,UAAU,EAAE,UAAU,CAAC,UAAU;YACjC,UAAU,EAAE,UAAU,CAAC,UAAU;YACjC,OAAO,EAAE,UAAU,CAAC,OAAO,IAAI,SAAS;YACxC,OAAO,EAAE,UAAU,CAAC,OAAO;SAC5B;KACF,CAAC;AACJ,CAAC"}
|
|
@@ -2,6 +2,6 @@
|
|
|
2
2
|
* jamf_docs_get_article tool
|
|
3
3
|
* Retrieve the full content of a specific Jamf documentation article.
|
|
4
4
|
*/
|
|
5
|
-
import { McpServer } from '@modelcontextprotocol/sdk/server/mcp.js';
|
|
5
|
+
import type { McpServer } from '@modelcontextprotocol/sdk/server/mcp.js';
|
|
6
6
|
export declare function registerGetArticleTool(server: McpServer): void;
|
|
7
7
|
//# sourceMappingURL=get-article.d.ts.map
|
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"get-article.d.ts","sourceRoot":"","sources":["../../src/tools/get-article.ts"],"names":[],"mappings":"AAAA;;;GAGG;AAEH,OAAO,EAAE,SAAS,EAAE,MAAM,yCAAyC,CAAC;
|
|
1
|
+
{"version":3,"file":"get-article.d.ts","sourceRoot":"","sources":["../../src/tools/get-article.ts"],"names":[],"mappings":"AAAA;;;GAGG;AAEH,OAAO,KAAK,EAAE,SAAS,EAAE,MAAM,yCAAyC,CAAC;AAsNzE,wBAAgB,sBAAsB,CAAC,MAAM,EAAE,SAAS,GAAG,IAAI,CAiH9D"}
|