@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
package/dist/services/cache.js
CHANGED
|
@@ -1,43 +1,111 @@
|
|
|
1
1
|
/**
|
|
2
2
|
* Caching service for Jamf documentation
|
|
3
3
|
*
|
|
4
|
-
* Provides file-based caching with TTL support
|
|
4
|
+
* Provides file-based caching with TTL support and LRU memory eviction
|
|
5
5
|
*/
|
|
6
6
|
import * as fs from 'fs/promises';
|
|
7
7
|
import * as path from 'path';
|
|
8
8
|
import * as crypto from 'crypto';
|
|
9
|
-
import {
|
|
9
|
+
import { z } from 'zod';
|
|
10
|
+
import { CACHE_TTL, CACHE_DIR, CACHE_MAX_ENTRIES } from '../constants.js';
|
|
10
11
|
/**
|
|
11
|
-
*
|
|
12
|
+
* Zod schema for validating cache entries read from disk
|
|
13
|
+
*/
|
|
14
|
+
export const CacheEntrySchema = z.object({
|
|
15
|
+
data: z.unknown(),
|
|
16
|
+
timestamp: z.number(),
|
|
17
|
+
ttl: z.number()
|
|
18
|
+
});
|
|
19
|
+
/**
|
|
20
|
+
* File-based cache implementation with LRU-bounded memory cache
|
|
12
21
|
*/
|
|
13
22
|
class FileCache {
|
|
14
23
|
cacheDir;
|
|
24
|
+
maxEntries;
|
|
15
25
|
memoryCache = new Map();
|
|
16
|
-
|
|
26
|
+
lruMap = new Map();
|
|
27
|
+
lruHead = { key: '__head__', prev: null, next: null };
|
|
28
|
+
lruTail = { key: '__tail__', prev: null, next: null };
|
|
29
|
+
dirCreated = false;
|
|
30
|
+
constructor(cacheDir = CACHE_DIR, maxEntries = CACHE_MAX_ENTRIES) {
|
|
17
31
|
this.cacheDir = cacheDir;
|
|
32
|
+
this.maxEntries = maxEntries;
|
|
33
|
+
this.lruHead.next = this.lruTail;
|
|
34
|
+
this.lruTail.prev = this.lruHead;
|
|
35
|
+
}
|
|
36
|
+
static getCacheKey(key) {
|
|
37
|
+
return crypto.createHash('sha256').update(key).digest('hex');
|
|
38
|
+
}
|
|
39
|
+
getCachePath(key) {
|
|
40
|
+
return path.join(this.cacheDir, `${FileCache.getCacheKey(key)}.json`);
|
|
41
|
+
}
|
|
42
|
+
async ensureCacheDir() {
|
|
43
|
+
if (this.dirCreated) {
|
|
44
|
+
return;
|
|
45
|
+
}
|
|
46
|
+
await fs.mkdir(this.cacheDir, { recursive: true }).catch(() => { });
|
|
47
|
+
this.dirCreated = true;
|
|
18
48
|
}
|
|
19
49
|
/**
|
|
20
|
-
*
|
|
50
|
+
* Move a node to the front of the LRU list (most recently used)
|
|
21
51
|
*/
|
|
22
|
-
|
|
23
|
-
|
|
52
|
+
lruMoveToFront(node) {
|
|
53
|
+
// Remove from current position
|
|
54
|
+
if (node.prev !== null) {
|
|
55
|
+
node.prev.next = node.next;
|
|
56
|
+
}
|
|
57
|
+
if (node.next !== null) {
|
|
58
|
+
node.next.prev = node.prev;
|
|
59
|
+
}
|
|
60
|
+
// Insert after head
|
|
61
|
+
node.next = this.lruHead.next;
|
|
62
|
+
node.prev = this.lruHead;
|
|
63
|
+
if (this.lruHead.next !== null) {
|
|
64
|
+
this.lruHead.next.prev = node;
|
|
65
|
+
}
|
|
66
|
+
this.lruHead.next = node;
|
|
24
67
|
}
|
|
25
68
|
/**
|
|
26
|
-
*
|
|
69
|
+
* Add a key to the LRU list (at front)
|
|
27
70
|
*/
|
|
28
|
-
|
|
29
|
-
|
|
71
|
+
lruAdd(key) {
|
|
72
|
+
const existing = this.lruMap.get(key);
|
|
73
|
+
if (existing !== undefined) {
|
|
74
|
+
this.lruMoveToFront(existing);
|
|
75
|
+
return;
|
|
76
|
+
}
|
|
77
|
+
const node = { key, prev: null, next: null };
|
|
78
|
+
this.lruMap.set(key, node);
|
|
79
|
+
this.lruMoveToFront(node);
|
|
30
80
|
}
|
|
31
81
|
/**
|
|
32
|
-
*
|
|
82
|
+
* Remove a key from the LRU list
|
|
33
83
|
*/
|
|
34
|
-
|
|
35
|
-
|
|
36
|
-
|
|
84
|
+
lruRemove(key) {
|
|
85
|
+
const node = this.lruMap.get(key);
|
|
86
|
+
if (node === undefined) {
|
|
87
|
+
return;
|
|
37
88
|
}
|
|
38
|
-
|
|
39
|
-
|
|
89
|
+
if (node.prev !== null) {
|
|
90
|
+
node.prev.next = node.next;
|
|
91
|
+
}
|
|
92
|
+
if (node.next !== null) {
|
|
93
|
+
node.next.prev = node.prev;
|
|
94
|
+
}
|
|
95
|
+
node.prev = null;
|
|
96
|
+
node.next = null;
|
|
97
|
+
this.lruMap.delete(key);
|
|
98
|
+
}
|
|
99
|
+
/**
|
|
100
|
+
* Evict the least recently used entry from memory cache
|
|
101
|
+
*/
|
|
102
|
+
lruEvictLeast() {
|
|
103
|
+
const leastNode = this.lruTail.prev;
|
|
104
|
+
if (leastNode === null || leastNode === this.lruHead) {
|
|
105
|
+
return;
|
|
40
106
|
}
|
|
107
|
+
this.memoryCache.delete(leastNode.key);
|
|
108
|
+
this.lruRemove(leastNode.key);
|
|
41
109
|
}
|
|
42
110
|
/**
|
|
43
111
|
* Get a value from cache
|
|
@@ -45,25 +113,34 @@ class FileCache {
|
|
|
45
113
|
async get(key) {
|
|
46
114
|
// Check memory cache first
|
|
47
115
|
const memCached = this.memoryCache.get(key);
|
|
48
|
-
if (memCached) {
|
|
116
|
+
if (memCached !== undefined) {
|
|
49
117
|
if (Date.now() - memCached.timestamp < memCached.ttl) {
|
|
118
|
+
this.lruAdd(key); // Promote in LRU
|
|
50
119
|
return memCached.data;
|
|
51
120
|
}
|
|
52
121
|
// Expired, remove from memory
|
|
53
122
|
this.memoryCache.delete(key);
|
|
123
|
+
this.lruRemove(key);
|
|
54
124
|
}
|
|
55
125
|
// Check file cache
|
|
56
126
|
try {
|
|
57
127
|
const cachePath = this.getCachePath(key);
|
|
58
128
|
const content = await fs.readFile(cachePath, 'utf-8');
|
|
59
|
-
const
|
|
129
|
+
const raw = JSON.parse(content);
|
|
130
|
+
// Validate cache entry structure
|
|
131
|
+
const parsed = CacheEntrySchema.safeParse(raw);
|
|
132
|
+
if (!parsed.success) {
|
|
133
|
+
await this.delete(key);
|
|
134
|
+
return null;
|
|
135
|
+
}
|
|
136
|
+
const entry = parsed.data;
|
|
60
137
|
// Check if expired
|
|
61
138
|
if (Date.now() - entry.timestamp > entry.ttl) {
|
|
62
139
|
await this.delete(key);
|
|
63
140
|
return null;
|
|
64
141
|
}
|
|
65
|
-
// Store in memory cache
|
|
66
|
-
this.
|
|
142
|
+
// Store in memory cache with LRU eviction
|
|
143
|
+
this.memoryCacheSet(key, entry);
|
|
67
144
|
return entry.data;
|
|
68
145
|
}
|
|
69
146
|
catch {
|
|
@@ -71,6 +148,16 @@ class FileCache {
|
|
|
71
148
|
return null;
|
|
72
149
|
}
|
|
73
150
|
}
|
|
151
|
+
/**
|
|
152
|
+
* Store in memory cache, evicting LRU entry if at capacity
|
|
153
|
+
*/
|
|
154
|
+
memoryCacheSet(key, entry) {
|
|
155
|
+
if (!this.memoryCache.has(key) && this.memoryCache.size >= this.maxEntries) {
|
|
156
|
+
this.lruEvictLeast();
|
|
157
|
+
}
|
|
158
|
+
this.memoryCache.set(key, entry);
|
|
159
|
+
this.lruAdd(key);
|
|
160
|
+
}
|
|
74
161
|
/**
|
|
75
162
|
* Set a value in cache
|
|
76
163
|
*/
|
|
@@ -81,44 +168,40 @@ class FileCache {
|
|
|
81
168
|
timestamp: Date.now(),
|
|
82
169
|
ttl
|
|
83
170
|
};
|
|
84
|
-
// Store in memory
|
|
85
|
-
this.
|
|
86
|
-
// Store in file
|
|
171
|
+
// Store in memory with LRU
|
|
172
|
+
this.memoryCacheSet(key, entry);
|
|
173
|
+
// Store in file atomically (write to .tmp then rename)
|
|
87
174
|
try {
|
|
88
175
|
const cachePath = this.getCachePath(key);
|
|
89
|
-
|
|
176
|
+
const tmpPath = `${cachePath}.tmp.${process.pid}`;
|
|
177
|
+
await fs.writeFile(tmpPath, JSON.stringify(entry), 'utf-8');
|
|
178
|
+
await fs.rename(tmpPath, cachePath);
|
|
90
179
|
}
|
|
91
180
|
catch (error) {
|
|
92
181
|
// Log but don't fail
|
|
93
|
-
console.error(`[CACHE] Failed to write cache: ${error}`);
|
|
182
|
+
console.error(`[CACHE] Failed to write cache: ${String(error)}`);
|
|
94
183
|
}
|
|
95
184
|
}
|
|
96
185
|
/**
|
|
97
186
|
* Delete a cache entry
|
|
98
187
|
*/
|
|
99
188
|
async delete(key) {
|
|
100
|
-
// Remove from memory
|
|
101
189
|
this.memoryCache.delete(key);
|
|
102
|
-
|
|
103
|
-
|
|
104
|
-
await fs.unlink(this.getCachePath(key));
|
|
105
|
-
}
|
|
106
|
-
catch {
|
|
107
|
-
// File may not exist
|
|
108
|
-
}
|
|
190
|
+
this.lruRemove(key);
|
|
191
|
+
await fs.unlink(this.getCachePath(key)).catch(() => { });
|
|
109
192
|
}
|
|
110
193
|
/**
|
|
111
194
|
* Clear all cache entries
|
|
112
195
|
*/
|
|
113
196
|
async clear() {
|
|
114
|
-
// Clear memory
|
|
115
197
|
this.memoryCache.clear();
|
|
116
|
-
|
|
198
|
+
this.lruMap.clear();
|
|
199
|
+
this.lruHead.next = this.lruTail;
|
|
200
|
+
this.lruTail.prev = this.lruHead;
|
|
117
201
|
try {
|
|
118
202
|
const files = await fs.readdir(this.cacheDir);
|
|
119
|
-
|
|
120
|
-
|
|
121
|
-
.map(f => fs.unlink(path.join(this.cacheDir, f))));
|
|
203
|
+
const jsonFiles = files.filter(f => f.endsWith('.json'));
|
|
204
|
+
await Promise.all(jsonFiles.map(async (f) => { await fs.unlink(path.join(this.cacheDir, f)); }));
|
|
122
205
|
}
|
|
123
206
|
catch {
|
|
124
207
|
// Directory may not exist
|
|
@@ -157,6 +240,7 @@ class FileCache {
|
|
|
157
240
|
for (const [key, entry] of this.memoryCache.entries()) {
|
|
158
241
|
if (Date.now() - entry.timestamp > entry.ttl) {
|
|
159
242
|
this.memoryCache.delete(key);
|
|
243
|
+
this.lruRemove(key);
|
|
160
244
|
pruned++;
|
|
161
245
|
}
|
|
162
246
|
}
|
|
@@ -164,17 +248,33 @@ class FileCache {
|
|
|
164
248
|
try {
|
|
165
249
|
const files = await fs.readdir(this.cacheDir);
|
|
166
250
|
for (const file of files.filter(f => f.endsWith('.json'))) {
|
|
251
|
+
const filePath = path.join(this.cacheDir, file);
|
|
167
252
|
try {
|
|
168
|
-
const filePath = path.join(this.cacheDir, file);
|
|
169
253
|
const content = await fs.readFile(filePath, 'utf-8');
|
|
170
|
-
|
|
254
|
+
let raw;
|
|
255
|
+
try {
|
|
256
|
+
raw = JSON.parse(content);
|
|
257
|
+
}
|
|
258
|
+
catch {
|
|
259
|
+
// Corrupt JSON — delete the file
|
|
260
|
+
await fs.unlink(filePath);
|
|
261
|
+
pruned++;
|
|
262
|
+
continue;
|
|
263
|
+
}
|
|
264
|
+
const parsed = CacheEntrySchema.safeParse(raw);
|
|
265
|
+
if (!parsed.success) {
|
|
266
|
+
await fs.unlink(filePath);
|
|
267
|
+
pruned++;
|
|
268
|
+
continue;
|
|
269
|
+
}
|
|
270
|
+
const entry = parsed.data;
|
|
171
271
|
if (Date.now() - entry.timestamp > entry.ttl) {
|
|
172
272
|
await fs.unlink(filePath);
|
|
173
273
|
pruned++;
|
|
174
274
|
}
|
|
175
275
|
}
|
|
176
276
|
catch {
|
|
177
|
-
// Skip
|
|
277
|
+
// Skip files that cannot be read or unlinked
|
|
178
278
|
}
|
|
179
279
|
}
|
|
180
280
|
}
|
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"cache.js","sourceRoot":"","sources":["../../src/services/cache.ts"],"names":[],"mappings":"AAAA;;;;GAIG;AAEH,OAAO,KAAK,EAAE,MAAM,aAAa,CAAC;AAClC,OAAO,KAAK,IAAI,MAAM,MAAM,CAAC;AAC7B,OAAO,KAAK,MAAM,MAAM,QAAQ,CAAC;AAEjC,OAAO,EAAE,SAAS,EAAE,SAAS,EAAE,MAAM,iBAAiB,CAAC;
|
|
1
|
+
{"version":3,"file":"cache.js","sourceRoot":"","sources":["../../src/services/cache.ts"],"names":[],"mappings":"AAAA;;;;GAIG;AAEH,OAAO,KAAK,EAAE,MAAM,aAAa,CAAC;AAClC,OAAO,KAAK,IAAI,MAAM,MAAM,CAAC;AAC7B,OAAO,KAAK,MAAM,MAAM,QAAQ,CAAC;AAEjC,OAAO,EAAE,CAAC,EAAE,MAAM,KAAK,CAAC;AACxB,OAAO,EAAE,SAAS,EAAE,SAAS,EAAE,iBAAiB,EAAE,MAAM,iBAAiB,CAAC;AAG1E;;GAEG;AACH,MAAM,CAAC,MAAM,gBAAgB,GAAG,CAAC,CAAC,MAAM,CAAC;IACvC,IAAI,EAAE,CAAC,CAAC,OAAO,EAAE;IACjB,SAAS,EAAE,CAAC,CAAC,MAAM,EAAE;IACrB,GAAG,EAAE,CAAC,CAAC,MAAM,EAAE;CAChB,CAAC,CAAC;AAWH;;GAEG;AACH,MAAM,SAAS;IACI,QAAQ,CAAS;IACjB,UAAU,CAAS;IACnB,WAAW,GAAG,IAAI,GAAG,EAA+B,CAAC;IACrD,MAAM,GAAG,IAAI,GAAG,EAAmB,CAAC;IACpC,OAAO,GAAY,EAAE,GAAG,EAAE,UAAU,EAAE,IAAI,EAAE,IAAI,EAAE,IAAI,EAAE,IAAI,EAAE,CAAC;IAC/D,OAAO,GAAY,EAAE,GAAG,EAAE,UAAU,EAAE,IAAI,EAAE,IAAI,EAAE,IAAI,EAAE,IAAI,EAAE,CAAC;IACxE,UAAU,GAAG,KAAK,CAAC;IAE3B,YAAY,WAAmB,SAAS,EAAE,aAAqB,iBAAiB;QAC9E,IAAI,CAAC,QAAQ,GAAG,QAAQ,CAAC;QACzB,IAAI,CAAC,UAAU,GAAG,UAAU,CAAC;QAC7B,IAAI,CAAC,OAAO,CAAC,IAAI,GAAG,IAAI,CAAC,OAAO,CAAC;QACjC,IAAI,CAAC,OAAO,CAAC,IAAI,GAAG,IAAI,CAAC,OAAO,CAAC;IACnC,CAAC;IAEO,MAAM,CAAC,WAAW,CAAC,GAAW;QACpC,OAAO,MAAM,CAAC,UAAU,CAAC,QAAQ,CAAC,CAAC,MAAM,CAAC,GAAG,CAAC,CAAC,MAAM,CAAC,KAAK,CAAC,CAAC;IAC/D,CAAC;IAEO,YAAY,CAAC,GAAW;QAC9B,OAAO,IAAI,CAAC,IAAI,CAAC,IAAI,CAAC,QAAQ,EAAE,GAAG,SAAS,CAAC,WAAW,CAAC,GAAG,CAAC,OAAO,CAAC,CAAC;IACxE,CAAC;IAEO,KAAK,CAAC,cAAc;QAC1B,IAAI,IAAI,CAAC,UAAU,EAAE,CAAC;YAAC,OAAO;QAAC,CAAC;QAChC,MAAM,EAAE,CAAC,KAAK,CAAC,IAAI,CAAC,QAAQ,EAAE,EAAE,SAAS,EAAE,IAAI,EAAE,CAAC,CAAC,KAAK,CAAC,GAAG,EAAE,GAA0B,CAAC,CAAC,CAAC;QAC3F,IAAI,CAAC,UAAU,GAAG,IAAI,CAAC;IACzB,CAAC;IAED;;OAEG;IACK,cAAc,CAAC,IAAa;QAClC,+BAA+B;QAC/B,IAAI,IAAI,CAAC,IAAI,KAAK,IAAI,EAAE,CAAC;YAAC,IAAI,CAAC,IAAI,CAAC,IAAI,GAAG,IAAI,CAAC,IAAI,CAAC;QAAC,CAAC;QACvD,IAAI,IAAI,CAAC,IAAI,KAAK,IAAI,EAAE,CAAC;YAAC,IAAI,CAAC,IAAI,CAAC,IAAI,GAAG,IAAI,CAAC,IAAI,CAAC;QAAC,CAAC;QACvD,oBAAoB;QACpB,IAAI,CAAC,IAAI,GAAG,IAAI,CAAC,OAAO,CAAC,IAAI,CAAC;QAC9B,IAAI,CAAC,IAAI,GAAG,IAAI,CAAC,OAAO,CAAC;QACzB,IAAI,IAAI,CAAC,OAAO,CAAC,IAAI,KAAK,IAAI,EAAE,CAAC;YAAC,IAAI,CAAC,OAAO,CAAC,IAAI,CAAC,IAAI,GAAG,IAAI,CAAC;QAAC,CAAC;QAClE,IAAI,CAAC,OAAO,CAAC,IAAI,GAAG,IAAI,CAAC;IAC3B,CAAC;IAED;;OAEG;IACK,MAAM,CAAC,GAAW;QACxB,MAAM,QAAQ,GAAG,IAAI,CAAC,MAAM,CAAC,GAAG,CAAC,GAAG,CAAC,CAAC;QACtC,IAAI,QAAQ,KAAK,SAAS,EAAE,CAAC;YAC3B,IAAI,CAAC,cAAc,CAAC,QAAQ,CAAC,CAAC;YAC9B,OAAO;QACT,CAAC;QACD,MAAM,IAAI,GAAY,EAAE,GAAG,EAAE,IAAI,EAAE,IAAI,EAAE,IAAI,EAAE,IAAI,EAAE,CAAC;QACtD,IAAI,CAAC,MAAM,CAAC,GAAG,CAAC,GAAG,EAAE,IAAI,CAAC,CAAC;QAC3B,IAAI,CAAC,cAAc,CAAC,IAAI,CAAC,CAAC;IAC5B,CAAC;IAED;;OAEG;IACK,SAAS,CAAC,GAAW;QAC3B,MAAM,IAAI,GAAG,IAAI,CAAC,MAAM,CAAC,GAAG,CAAC,GAAG,CAAC,CAAC;QAClC,IAAI,IAAI,KAAK,SAAS,EAAE,CAAC;YAAC,OAAO;QAAC,CAAC;QACnC,IAAI,IAAI,CAAC,IAAI,KAAK,IAAI,EAAE,CAAC;YAAC,IAAI,CAAC,IAAI,CAAC,IAAI,GAAG,IAAI,CAAC,IAAI,CAAC;QAAC,CAAC;QACvD,IAAI,IAAI,CAAC,IAAI,KAAK,IAAI,EAAE,CAAC;YAAC,IAAI,CAAC,IAAI,CAAC,IAAI,GAAG,IAAI,CAAC,IAAI,CAAC;QAAC,CAAC;QACvD,IAAI,CAAC,IAAI,GAAG,IAAI,CAAC;QACjB,IAAI,CAAC,IAAI,GAAG,IAAI,CAAC;QACjB,IAAI,CAAC,MAAM,CAAC,MAAM,CAAC,GAAG,CAAC,CAAC;IAC1B,CAAC;IAED;;OAEG;IACK,aAAa;QACnB,MAAM,SAAS,GAAG,IAAI,CAAC,OAAO,CAAC,IAAI,CAAC;QACpC,IAAI,SAAS,KAAK,IAAI,IAAI,SAAS,KAAK,IAAI,CAAC,OAAO,EAAE,CAAC;YAAC,OAAO;QAAC,CAAC;QACjE,IAAI,CAAC,WAAW,CAAC,MAAM,CAAC,SAAS,CAAC,GAAG,CAAC,CAAC;QACvC,IAAI,CAAC,SAAS,CAAC,SAAS,CAAC,GAAG,CAAC,CAAC;IAChC,CAAC;IAED;;OAEG;IACH,KAAK,CAAC,GAAG,CAAI,GAAW;QACtB,2BAA2B;QAC3B,MAAM,SAAS,GAAG,IAAI,CAAC,WAAW,CAAC,GAAG,CAAC,GAAG,CAA8B,CAAC;QACzE,IAAI,SAAS,KAAK,SAAS,EAAE,CAAC;YAC5B,IAAI,IAAI,CAAC,GAAG,EAAE,GAAG,SAAS,CAAC,SAAS,GAAG,SAAS,CAAC,GAAG,EAAE,CAAC;gBACrD,IAAI,CAAC,MAAM,CAAC,GAAG,CAAC,CAAC,CAAC,iBAAiB;gBACnC,OAAO,SAAS,CAAC,IAAI,CAAC;YACxB,CAAC;YACD,8BAA8B;YAC9B,IAAI,CAAC,WAAW,CAAC,MAAM,CAAC,GAAG,CAAC,CAAC;YAC7B,IAAI,CAAC,SAAS,CAAC,GAAG,CAAC,CAAC;QACtB,CAAC;QAED,mBAAmB;QACnB,IAAI,CAAC;YACH,MAAM,SAAS,GAAG,IAAI,CAAC,YAAY,CAAC,GAAG,CAAC,CAAC;YACzC,MAAM,OAAO,GAAG,MAAM,EAAE,CAAC,QAAQ,CAAC,SAAS,EAAE,OAAO,CAAC,CAAC;YACtD,MAAM,GAAG,GAAY,IAAI,CAAC,KAAK,CAAC,OAAO,CAAC,CAAC;YAEzC,iCAAiC;YACjC,MAAM,MAAM,GAAG,gBAAgB,CAAC,SAAS,CAAC,GAAG,CAAC,CAAC;YAC/C,IAAI,CAAC,MAAM,CAAC,OAAO,EAAE,CAAC;gBACpB,MAAM,IAAI,CAAC,MAAM,CAAC,GAAG,CAAC,CAAC;gBACvB,OAAO,IAAI,CAAC;YACd,CAAC;YAED,MAAM,KAAK,GAAG,MAAM,CAAC,IAAqB,CAAC;YAE3C,mBAAmB;YACnB,IAAI,IAAI,CAAC,GAAG,EAAE,GAAG,KAAK,CAAC,SAAS,GAAG,KAAK,CAAC,GAAG,EAAE,CAAC;gBAC7C,MAAM,IAAI,CAAC,MAAM,CAAC,GAAG,CAAC,CAAC;gBACvB,OAAO,IAAI,CAAC;YACd,CAAC;YAED,0CAA0C;YAC1C,IAAI,CAAC,cAAc,CAAC,GAAG,EAAE,KAAK,CAAC,CAAC;YAEhC,OAAO,KAAK,CAAC,IAAI,CAAC;QACpB,CAAC;QAAC,MAAM,CAAC;YACP,mCAAmC;YACnC,OAAO,IAAI,CAAC;QACd,CAAC;IACH,CAAC;IAED;;OAEG;IACK,cAAc,CAAC,GAAW,EAAE,KAA0B;QAC5D,IAAI,CAAC,IAAI,CAAC,WAAW,CAAC,GAAG,CAAC,GAAG,CAAC,IAAI,IAAI,CAAC,WAAW,CAAC,IAAI,IAAI,IAAI,CAAC,UAAU,EAAE,CAAC;YAC3E,IAAI,CAAC,aAAa,EAAE,CAAC;QACvB,CAAC;QACD,IAAI,CAAC,WAAW,CAAC,GAAG,CAAC,GAAG,EAAE,KAAK,CAAC,CAAC;QACjC,IAAI,CAAC,MAAM,CAAC,GAAG,CAAC,CAAC;IACnB,CAAC;IAED;;OAEG;IACH,KAAK,CAAC,GAAG,CAAC,GAAW,EAAE,IAAa,EAAE,MAAc,SAAS,CAAC,eAAe;QAC3E,MAAM,IAAI,CAAC,cAAc,EAAE,CAAC;QAE5B,MAAM,KAAK,GAAwB;YACjC,IAAI;YACJ,SAAS,EAAE,IAAI,CAAC,GAAG,EAAE;YACrB,GAAG;SACJ,CAAC;QAEF,2BAA2B;QAC3B,IAAI,CAAC,cAAc,CAAC,GAAG,EAAE,KAAK,CAAC,CAAC;QAEhC,uDAAuD;QACvD,IAAI,CAAC;YACH,MAAM,SAAS,GAAG,IAAI,CAAC,YAAY,CAAC,GAAG,CAAC,CAAC;YACzC,MAAM,OAAO,GAAG,GAAG,SAAS,QAAQ,OAAO,CAAC,GAAG,EAAE,CAAC;YAClD,MAAM,EAAE,CAAC,SAAS,CAAC,OAAO,EAAE,IAAI,CAAC,SAAS,CAAC,KAAK,CAAC,EAAE,OAAO,CAAC,CAAC;YAC5D,MAAM,EAAE,CAAC,MAAM,CAAC,OAAO,EAAE,SAAS,CAAC,CAAC;QACtC,CAAC;QAAC,OAAO,KAAK,EAAE,CAAC;YACf,qBAAqB;YACrB,OAAO,CAAC,KAAK,CAAC,kCAAkC,MAAM,CAAC,KAAK,CAAC,EAAE,CAAC,CAAC;QACnE,CAAC;IACH,CAAC;IAED;;OAEG;IACH,KAAK,CAAC,MAAM,CAAC,GAAW;QACtB,IAAI,CAAC,WAAW,CAAC,MAAM,CAAC,GAAG,CAAC,CAAC;QAC7B,IAAI,CAAC,SAAS,CAAC,GAAG,CAAC,CAAC;QACpB,MAAM,EAAE,CAAC,MAAM,CAAC,IAAI,CAAC,YAAY,CAAC,GAAG,CAAC,CAAC,CAAC,KAAK,CAAC,GAAG,EAAE,GAA8B,CAAC,CAAC,CAAC;IACtF,CAAC;IAED;;OAEG;IACH,KAAK,CAAC,KAAK;QACT,IAAI,CAAC,WAAW,CAAC,KAAK,EAAE,CAAC;QACzB,IAAI,CAAC,MAAM,CAAC,KAAK,EAAE,CAAC;QACpB,IAAI,CAAC,OAAO,CAAC,IAAI,GAAG,IAAI,CAAC,OAAO,CAAC;QACjC,IAAI,CAAC,OAAO,CAAC,IAAI,GAAG,IAAI,CAAC,OAAO,CAAC;QACjC,IAAI,CAAC;YACH,MAAM,KAAK,GAAG,MAAM,EAAE,CAAC,OAAO,CAAC,IAAI,CAAC,QAAQ,CAAC,CAAC;YAC9C,MAAM,SAAS,GAAG,KAAK,CAAC,MAAM,CAAC,CAAC,CAAC,EAAE,CAAC,CAAC,CAAC,QAAQ,CAAC,OAAO,CAAC,CAAC,CAAC;YACzD,MAAM,OAAO,CAAC,GAAG,CACf,SAAS,CAAC,GAAG,CAAC,KAAK,EAAC,CAAC,EAAC,EAAE,GAAG,MAAM,EAAE,CAAC,MAAM,CAAC,IAAI,CAAC,IAAI,CAAC,IAAI,CAAC,QAAQ,EAAE,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAC5E,CAAC;QACJ,CAAC;QAAC,MAAM,CAAC;YACP,0BAA0B;QAC5B,CAAC;IACH,CAAC;IAED;;OAEG;IACH,KAAK,CAAC,KAAK;QACT,IAAI,WAAW,GAAG,CAAC,CAAC;QACpB,IAAI,SAAS,GAAG,CAAC,CAAC;QAElB,IAAI,CAAC;YACH,MAAM,KAAK,GAAG,MAAM,EAAE,CAAC,OAAO,CAAC,IAAI,CAAC,QAAQ,CAAC,CAAC;YAC9C,MAAM,SAAS,GAAG,KAAK,CAAC,MAAM,CAAC,CAAC,CAAC,EAAE,CAAC,CAAC,CAAC,QAAQ,CAAC,OAAO,CAAC,CAAC,CAAC;YACzD,WAAW,GAAG,SAAS,CAAC,MAAM,CAAC;YAE/B,KAAK,MAAM,IAAI,IAAI,SAAS,EAAE,CAAC;gBAC7B,MAAM,IAAI,GAAG,MAAM,EAAE,CAAC,IAAI,CAAC,IAAI,CAAC,IAAI,CAAC,IAAI,CAAC,QAAQ,EAAE,IAAI,CAAC,CAAC,CAAC;gBAC3D,SAAS,IAAI,IAAI,CAAC,IAAI,CAAC;YACzB,CAAC;QACH,CAAC;QAAC,MAAM,CAAC;YACP,0BAA0B;QAC5B,CAAC;QAED,OAAO;YACL,aAAa,EAAE,IAAI,CAAC,WAAW,CAAC,IAAI;YACpC,WAAW;YACX,SAAS;SACV,CAAC;IACJ,CAAC;IAED;;OAEG;IACH,KAAK,CAAC,KAAK;QACT,IAAI,MAAM,GAAG,CAAC,CAAC;QAEf,qBAAqB;QACrB,KAAK,MAAM,CAAC,GAAG,EAAE,KAAK,CAAC,IAAI,IAAI,CAAC,WAAW,CAAC,OAAO,EAAE,EAAE,CAAC;YACtD,IAAI,IAAI,CAAC,GAAG,EAAE,GAAG,KAAK,CAAC,SAAS,GAAG,KAAK,CAAC,GAAG,EAAE,CAAC;gBAC7C,IAAI,CAAC,WAAW,CAAC,MAAM,CAAC,GAAG,CAAC,CAAC;gBAC7B,IAAI,CAAC,SAAS,CAAC,GAAG,CAAC,CAAC;gBACpB,MAAM,EAAE,CAAC;YACX,CAAC;QACH,CAAC;QAED,mBAAmB;QACnB,IAAI,CAAC;YACH,MAAM,KAAK,GAAG,MAAM,EAAE,CAAC,OAAO,CAAC,IAAI,CAAC,QAAQ,CAAC,CAAC;YAE9C,KAAK,MAAM,IAAI,IAAI,KAAK,CAAC,MAAM,CAAC,CAAC,CAAC,EAAE,CAAC,CAAC,CAAC,QAAQ,CAAC,OAAO,CAAC,CAAC,EAAE,CAAC;gBAC1D,MAAM,QAAQ,GAAG,IAAI,CAAC,IAAI,CAAC,IAAI,CAAC,QAAQ,EAAE,IAAI,CAAC,CAAC;gBAChD,IAAI,CAAC;oBACH,MAAM,OAAO,GAAG,MAAM,EAAE,CAAC,QAAQ,CAAC,QAAQ,EAAE,OAAO,CAAC,CAAC;oBACrD,IAAI,GAAY,CAAC;oBACjB,IAAI,CAAC;wBACH,GAAG,GAAG,IAAI,CAAC,KAAK,CAAC,OAAO,CAAC,CAAC;oBAC5B,CAAC;oBAAC,MAAM,CAAC;wBACP,iCAAiC;wBACjC,MAAM,EAAE,CAAC,MAAM,CAAC,QAAQ,CAAC,CAAC;wBAC1B,MAAM,EAAE,CAAC;wBACT,SAAS;oBACX,CAAC;oBAED,MAAM,MAAM,GAAG,gBAAgB,CAAC,SAAS,CAAC,GAAG,CAAC,CAAC;oBAC/C,IAAI,CAAC,MAAM,CAAC,OAAO,EAAE,CAAC;wBACpB,MAAM,EAAE,CAAC,MAAM,CAAC,QAAQ,CAAC,CAAC;wBAC1B,MAAM,EAAE,CAAC;wBACT,SAAS;oBACX,CAAC;oBAED,MAAM,KAAK,GAAG,MAAM,CAAC,IAAI,CAAC;oBAC1B,IAAI,IAAI,CAAC,GAAG,EAAE,GAAG,KAAK,CAAC,SAAS,GAAG,KAAK,CAAC,GAAG,EAAE,CAAC;wBAC7C,MAAM,EAAE,CAAC,MAAM,CAAC,QAAQ,CAAC,CAAC;wBAC1B,MAAM,EAAE,CAAC;oBACX,CAAC;gBACH,CAAC;gBAAC,MAAM,CAAC;oBACP,6CAA6C;gBAC/C,CAAC;YACH,CAAC;QACH,CAAC;QAAC,MAAM,CAAC;YACP,0BAA0B;QAC5B,CAAC;QAED,OAAO,MAAM,CAAC;IAChB,CAAC;CACF;AAED,4BAA4B;AAC5B,MAAM,CAAC,MAAM,KAAK,GAAG,IAAI,SAAS,EAAE,CAAC"}
|
|
@@ -0,0 +1,78 @@
|
|
|
1
|
+
/**
|
|
2
|
+
* Metadata service for Jamf documentation
|
|
3
|
+
*
|
|
4
|
+
* Dynamically fetches product versions and topic categories from the API
|
|
5
|
+
* with fallback to static constants.
|
|
6
|
+
*/
|
|
7
|
+
import { type ProductId } from '../constants.js';
|
|
8
|
+
export interface ProductMetadata {
|
|
9
|
+
id: string;
|
|
10
|
+
name: string;
|
|
11
|
+
description: string;
|
|
12
|
+
bundleId: string;
|
|
13
|
+
latestVersion: string;
|
|
14
|
+
availableVersions: string[];
|
|
15
|
+
labelKey: string;
|
|
16
|
+
}
|
|
17
|
+
export interface TopicMetadata {
|
|
18
|
+
id: string;
|
|
19
|
+
name: string;
|
|
20
|
+
source: 'toc' | 'manual';
|
|
21
|
+
articleCount?: number;
|
|
22
|
+
}
|
|
23
|
+
export interface TocCategory {
|
|
24
|
+
navId: string;
|
|
25
|
+
title: string;
|
|
26
|
+
articleCount: number;
|
|
27
|
+
children: string[];
|
|
28
|
+
}
|
|
29
|
+
/**
|
|
30
|
+
* Get all products with their latest metadata
|
|
31
|
+
* Uses cache with fallback to static constants
|
|
32
|
+
*/
|
|
33
|
+
export declare function getProductsMetadata(): Promise<ProductMetadata[]>;
|
|
34
|
+
/**
|
|
35
|
+
* Get the bundle ID for a specific product and version
|
|
36
|
+
* Returns the latest bundle ID if version is undefined or 'current'
|
|
37
|
+
*/
|
|
38
|
+
export declare function getBundleIdForVersion(productId: ProductId, version?: string): Promise<string | null>;
|
|
39
|
+
/**
|
|
40
|
+
* Get available versions for a product
|
|
41
|
+
*/
|
|
42
|
+
export declare function getAvailableVersions(productId: ProductId): Promise<string[]>;
|
|
43
|
+
/**
|
|
44
|
+
* Get all topics, combining TOC-derived from all products and manual topics
|
|
45
|
+
*/
|
|
46
|
+
export declare function getTopicsMetadata(): Promise<TopicMetadata[]>;
|
|
47
|
+
/**
|
|
48
|
+
* Get products data formatted for resource response
|
|
49
|
+
*/
|
|
50
|
+
export declare function getProductsResourceData(): Promise<{
|
|
51
|
+
description: string;
|
|
52
|
+
products: {
|
|
53
|
+
id: string;
|
|
54
|
+
name: string;
|
|
55
|
+
description: string;
|
|
56
|
+
latestVersion: string;
|
|
57
|
+
availableVersions: string[];
|
|
58
|
+
bundleId: string;
|
|
59
|
+
}[];
|
|
60
|
+
lastUpdated: string;
|
|
61
|
+
usage: string;
|
|
62
|
+
}>;
|
|
63
|
+
/**
|
|
64
|
+
* Get topics data formatted for resource response
|
|
65
|
+
*/
|
|
66
|
+
export declare function getTopicsResourceData(): Promise<{
|
|
67
|
+
description: string;
|
|
68
|
+
totalTopics: number;
|
|
69
|
+
topics: {
|
|
70
|
+
id: string;
|
|
71
|
+
name: string;
|
|
72
|
+
source: string;
|
|
73
|
+
articleCount?: number;
|
|
74
|
+
}[];
|
|
75
|
+
lastUpdated: string;
|
|
76
|
+
usage: string;
|
|
77
|
+
}>;
|
|
78
|
+
//# sourceMappingURL=metadata.d.ts.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"metadata.d.ts","sourceRoot":"","sources":["../../src/services/metadata.ts"],"names":[],"mappings":"AAAA;;;;;GAKG;AAKH,OAAO,EAML,KAAK,SAAS,EACf,MAAM,iBAAiB,CAAC;AAOzB,MAAM,WAAW,eAAe;IAC9B,EAAE,EAAE,MAAM,CAAC;IACX,IAAI,EAAE,MAAM,CAAC;IACb,WAAW,EAAE,MAAM,CAAC;IACpB,QAAQ,EAAE,MAAM,CAAC;IACjB,aAAa,EAAE,MAAM,CAAC;IACtB,iBAAiB,EAAE,MAAM,EAAE,CAAC;IAC5B,QAAQ,EAAE,MAAM,CAAC;CAClB;AAED,MAAM,WAAW,aAAa;IAC5B,EAAE,EAAE,MAAM,CAAC;IACX,IAAI,EAAE,MAAM,CAAC;IACb,MAAM,EAAE,KAAK,GAAG,QAAQ,CAAC;IACzB,YAAY,CAAC,EAAE,MAAM,CAAC;CACvB;AAED,MAAM,WAAW,WAAW;IAC1B,KAAK,EAAE,MAAM,CAAC;IACd,KAAK,EAAE,MAAM,CAAC;IACd,YAAY,EAAE,MAAM,CAAC;IACrB,QAAQ,EAAE,MAAM,EAAE,CAAC;CACpB;AAmID;;;GAGG;AACH,wBAAsB,mBAAmB,IAAI,OAAO,CAAC,eAAe,EAAE,CAAC,CA+CtE;AAED;;;GAGG;AACH,wBAAsB,qBAAqB,CACzC,SAAS,EAAE,SAAS,EACpB,OAAO,CAAC,EAAE,MAAM,GACf,OAAO,CAAC,MAAM,GAAG,IAAI,CAAC,CAsBxB;AAED;;GAEG;AACH,wBAAsB,oBAAoB,CAAC,SAAS,EAAE,SAAS,GAAG,OAAO,CAAC,MAAM,EAAE,CAAC,CAIlF;AAmHD;;GAEG;AACH,wBAAsB,iBAAiB,IAAI,OAAO,CAAC,aAAa,EAAE,CAAC,CA8ClE;AAMD;;GAEG;AACH,wBAAsB,uBAAuB,IAAI,OAAO,CAAC;IACvD,WAAW,EAAE,MAAM,CAAC;IACpB,QAAQ,EAAE;QACR,EAAE,EAAE,MAAM,CAAC;QACX,IAAI,EAAE,MAAM,CAAC;QACb,WAAW,EAAE,MAAM,CAAC;QACpB,aAAa,EAAE,MAAM,CAAC;QACtB,iBAAiB,EAAE,MAAM,EAAE,CAAC;QAC5B,QAAQ,EAAE,MAAM,CAAC;KAClB,EAAE,CAAC;IACJ,WAAW,EAAE,MAAM,CAAC;IACpB,KAAK,EAAE,MAAM,CAAC;CACf,CAAC,CAgBD;AAED;;GAEG;AACH,wBAAsB,qBAAqB,IAAI,OAAO,CAAC;IACrD,WAAW,EAAE,MAAM,CAAC;IACpB,WAAW,EAAE,MAAM,CAAC;IACpB,MAAM,EAAE;QACN,EAAE,EAAE,MAAM,CAAC;QACX,IAAI,EAAE,MAAM,CAAC;QACb,MAAM,EAAE,MAAM,CAAC;QACf,YAAY,CAAC,EAAE,MAAM,CAAC;KACvB,EAAE,CAAC;IACJ,WAAW,EAAE,MAAM,CAAC;IACpB,KAAK,EAAE,MAAM,CAAC;CACf,CAAC,CAeD"}
|