@kyma-api/agent 0.1.0 → 0.1.2
This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
- package/dist/main.js +133 -3136
- package/package.json +8 -5
package/dist/main.js
CHANGED
|
@@ -1,3081 +1,65 @@
|
|
|
1
1
|
// src/sdk/main.ts
|
|
2
2
|
import { readFileSync as readFileSync5 } from "fs";
|
|
3
|
-
import { join as
|
|
4
|
-
import { fileURLToPath as fileURLToPath4 } from "url";
|
|
5
|
-
import { execSync } from "child_process";
|
|
6
|
-
|
|
7
|
-
// src/sdk/kyma-interactive-mode.ts
|
|
8
|
-
import {
|
|
9
|
-
InteractiveMode
|
|
10
|
-
} from "@mariozechner/pi-coding-agent";
|
|
11
|
-
|
|
12
|
-
|
|
13
|
-
|
|
14
|
-
import {
|
|
15
|
-
|
|
16
|
-
|
|
17
|
-
|
|
18
|
-
|
|
19
|
-
|
|
20
|
-
|
|
21
|
-
|
|
22
|
-
|
|
23
|
-
|
|
24
|
-
|
|
25
|
-
|
|
26
|
-
if (normalizedQuery.length > textLower.length) {
|
|
27
|
-
return { matches: false, score: 0 };
|
|
28
|
-
}
|
|
29
|
-
let queryIndex = 0;
|
|
30
|
-
let score = 0;
|
|
31
|
-
let lastMatchIndex = -1;
|
|
32
|
-
let consecutiveMatches = 0;
|
|
33
|
-
for (let i = 0; i < textLower.length && queryIndex < normalizedQuery.length; i++) {
|
|
34
|
-
if (textLower[i] === normalizedQuery[queryIndex]) {
|
|
35
|
-
const isWordBoundary = i === 0 || /[\s\-_./:]/.test(textLower[i - 1]);
|
|
36
|
-
if (lastMatchIndex === i - 1) {
|
|
37
|
-
consecutiveMatches++;
|
|
38
|
-
score -= consecutiveMatches * 5;
|
|
39
|
-
} else {
|
|
40
|
-
consecutiveMatches = 0;
|
|
41
|
-
if (lastMatchIndex >= 0) {
|
|
42
|
-
score += (i - lastMatchIndex - 1) * 2;
|
|
43
|
-
}
|
|
44
|
-
}
|
|
45
|
-
if (isWordBoundary) {
|
|
46
|
-
score -= 10;
|
|
47
|
-
}
|
|
48
|
-
score += i * 0.1;
|
|
49
|
-
lastMatchIndex = i;
|
|
50
|
-
queryIndex++;
|
|
51
|
-
}
|
|
52
|
-
}
|
|
53
|
-
if (queryIndex < normalizedQuery.length) {
|
|
54
|
-
return { matches: false, score: 0 };
|
|
55
|
-
}
|
|
56
|
-
return { matches: true, score };
|
|
57
|
-
};
|
|
58
|
-
const primaryMatch = matchQuery(queryLower);
|
|
59
|
-
if (primaryMatch.matches) {
|
|
60
|
-
return primaryMatch;
|
|
61
|
-
}
|
|
62
|
-
const alphaNumericMatch = queryLower.match(/^(?<letters>[a-z]+)(?<digits>[0-9]+)$/);
|
|
63
|
-
const numericAlphaMatch = queryLower.match(/^(?<digits>[0-9]+)(?<letters>[a-z]+)$/);
|
|
64
|
-
const swappedQuery = alphaNumericMatch ? `${alphaNumericMatch.groups?.digits ?? ""}${alphaNumericMatch.groups?.letters ?? ""}` : numericAlphaMatch ? `${numericAlphaMatch.groups?.letters ?? ""}${numericAlphaMatch.groups?.digits ?? ""}` : "";
|
|
65
|
-
if (!swappedQuery) {
|
|
66
|
-
return primaryMatch;
|
|
67
|
-
}
|
|
68
|
-
const swappedMatch = matchQuery(swappedQuery);
|
|
69
|
-
if (!swappedMatch.matches) {
|
|
70
|
-
return primaryMatch;
|
|
71
|
-
}
|
|
72
|
-
return { matches: true, score: swappedMatch.score + 5 };
|
|
73
|
-
}
|
|
74
|
-
function fuzzyFilter(items, query, getText) {
|
|
75
|
-
if (!query.trim()) {
|
|
76
|
-
return items;
|
|
77
|
-
}
|
|
78
|
-
const tokens = query.trim().split(/\s+/).filter((t) => t.length > 0);
|
|
79
|
-
if (tokens.length === 0) {
|
|
80
|
-
return items;
|
|
81
|
-
}
|
|
82
|
-
const results = [];
|
|
83
|
-
for (const item of items) {
|
|
84
|
-
const text = getText(item);
|
|
85
|
-
let totalScore = 0;
|
|
86
|
-
let allMatch = true;
|
|
87
|
-
for (const token of tokens) {
|
|
88
|
-
const match = fuzzyMatch(token, text);
|
|
89
|
-
if (match.matches) {
|
|
90
|
-
totalScore += match.score;
|
|
91
|
-
} else {
|
|
92
|
-
allMatch = false;
|
|
93
|
-
break;
|
|
94
|
-
}
|
|
95
|
-
}
|
|
96
|
-
if (allMatch) {
|
|
97
|
-
results.push({ item, totalScore });
|
|
98
|
-
}
|
|
99
|
-
}
|
|
100
|
-
results.sort((a, b) => a.totalScore - b.totalScore);
|
|
101
|
-
return results.map((r) => r.item);
|
|
102
|
-
}
|
|
103
|
-
|
|
104
|
-
// node_modules/@mariozechner/pi-tui/dist/autocomplete.js
|
|
105
|
-
var PATH_DELIMITERS = /* @__PURE__ */ new Set([" ", " ", '"', "'", "="]);
|
|
106
|
-
function toDisplayPath(value) {
|
|
107
|
-
return value.replace(/\\/g, "/");
|
|
108
|
-
}
|
|
109
|
-
function escapeRegex(value) {
|
|
110
|
-
return value.replace(/[.*+?^${}()|[\]\\]/g, "\\$&");
|
|
111
|
-
}
|
|
112
|
-
function buildFdPathQuery(query) {
|
|
113
|
-
const normalized = toDisplayPath(query);
|
|
114
|
-
if (!normalized.includes("/")) {
|
|
115
|
-
return normalized;
|
|
116
|
-
}
|
|
117
|
-
const hasTrailingSeparator = normalized.endsWith("/");
|
|
118
|
-
const trimmed = normalized.replace(/^\/+|\/+$/g, "");
|
|
119
|
-
if (!trimmed) {
|
|
120
|
-
return normalized;
|
|
121
|
-
}
|
|
122
|
-
const separatorPattern = "[\\\\/]";
|
|
123
|
-
const segments = trimmed.split("/").filter(Boolean).map((segment) => escapeRegex(segment));
|
|
124
|
-
if (segments.length === 0) {
|
|
125
|
-
return normalized;
|
|
126
|
-
}
|
|
127
|
-
let pattern = segments.join(separatorPattern);
|
|
128
|
-
if (hasTrailingSeparator) {
|
|
129
|
-
pattern += separatorPattern;
|
|
130
|
-
}
|
|
131
|
-
return pattern;
|
|
132
|
-
}
|
|
133
|
-
function findLastDelimiter(text) {
|
|
134
|
-
for (let i = text.length - 1; i >= 0; i -= 1) {
|
|
135
|
-
if (PATH_DELIMITERS.has(text[i] ?? "")) {
|
|
136
|
-
return i;
|
|
137
|
-
}
|
|
138
|
-
}
|
|
139
|
-
return -1;
|
|
140
|
-
}
|
|
141
|
-
function findUnclosedQuoteStart(text) {
|
|
142
|
-
let inQuotes = false;
|
|
143
|
-
let quoteStart = -1;
|
|
144
|
-
for (let i = 0; i < text.length; i += 1) {
|
|
145
|
-
if (text[i] === '"') {
|
|
146
|
-
inQuotes = !inQuotes;
|
|
147
|
-
if (inQuotes) {
|
|
148
|
-
quoteStart = i;
|
|
149
|
-
}
|
|
150
|
-
}
|
|
151
|
-
}
|
|
152
|
-
return inQuotes ? quoteStart : null;
|
|
153
|
-
}
|
|
154
|
-
function isTokenStart(text, index) {
|
|
155
|
-
return index === 0 || PATH_DELIMITERS.has(text[index - 1] ?? "");
|
|
156
|
-
}
|
|
157
|
-
function extractQuotedPrefix(text) {
|
|
158
|
-
const quoteStart = findUnclosedQuoteStart(text);
|
|
159
|
-
if (quoteStart === null) {
|
|
160
|
-
return null;
|
|
161
|
-
}
|
|
162
|
-
if (quoteStart > 0 && text[quoteStart - 1] === "@") {
|
|
163
|
-
if (!isTokenStart(text, quoteStart - 1)) {
|
|
164
|
-
return null;
|
|
165
|
-
}
|
|
166
|
-
return text.slice(quoteStart - 1);
|
|
167
|
-
}
|
|
168
|
-
if (!isTokenStart(text, quoteStart)) {
|
|
169
|
-
return null;
|
|
170
|
-
}
|
|
171
|
-
return text.slice(quoteStart);
|
|
172
|
-
}
|
|
173
|
-
function parsePathPrefix(prefix) {
|
|
174
|
-
if (prefix.startsWith('@"')) {
|
|
175
|
-
return { rawPrefix: prefix.slice(2), isAtPrefix: true, isQuotedPrefix: true };
|
|
176
|
-
}
|
|
177
|
-
if (prefix.startsWith('"')) {
|
|
178
|
-
return { rawPrefix: prefix.slice(1), isAtPrefix: false, isQuotedPrefix: true };
|
|
179
|
-
}
|
|
180
|
-
if (prefix.startsWith("@")) {
|
|
181
|
-
return { rawPrefix: prefix.slice(1), isAtPrefix: true, isQuotedPrefix: false };
|
|
182
|
-
}
|
|
183
|
-
return { rawPrefix: prefix, isAtPrefix: false, isQuotedPrefix: false };
|
|
184
|
-
}
|
|
185
|
-
function buildCompletionValue(path3, options2) {
|
|
186
|
-
const needsQuotes = options2.isQuotedPrefix || path3.includes(" ");
|
|
187
|
-
const prefix = options2.isAtPrefix ? "@" : "";
|
|
188
|
-
if (!needsQuotes) {
|
|
189
|
-
return `${prefix}${path3}`;
|
|
190
|
-
}
|
|
191
|
-
const openQuote = `${prefix}"`;
|
|
192
|
-
const closeQuote = '"';
|
|
193
|
-
return `${openQuote}${path3}${closeQuote}`;
|
|
194
|
-
}
|
|
195
|
-
async function walkDirectoryWithFd(baseDir, fdPath, query, maxResults, signal) {
|
|
196
|
-
const args = [
|
|
197
|
-
"--base-directory",
|
|
198
|
-
baseDir,
|
|
199
|
-
"--max-results",
|
|
200
|
-
String(maxResults),
|
|
201
|
-
"--type",
|
|
202
|
-
"f",
|
|
203
|
-
"--type",
|
|
204
|
-
"d",
|
|
205
|
-
"--full-path",
|
|
206
|
-
"--hidden",
|
|
207
|
-
"--exclude",
|
|
208
|
-
".git",
|
|
209
|
-
"--exclude",
|
|
210
|
-
".git/*",
|
|
211
|
-
"--exclude",
|
|
212
|
-
".git/**"
|
|
213
|
-
];
|
|
214
|
-
if (query) {
|
|
215
|
-
args.push(buildFdPathQuery(query));
|
|
216
|
-
}
|
|
217
|
-
return await new Promise((resolve) => {
|
|
218
|
-
if (signal.aborted) {
|
|
219
|
-
resolve([]);
|
|
220
|
-
return;
|
|
221
|
-
}
|
|
222
|
-
const child = spawn(fdPath, args, {
|
|
223
|
-
stdio: ["ignore", "pipe", "pipe"]
|
|
224
|
-
});
|
|
225
|
-
let stdout = "";
|
|
226
|
-
let resolved = false;
|
|
227
|
-
const finish = (results) => {
|
|
228
|
-
if (resolved)
|
|
229
|
-
return;
|
|
230
|
-
resolved = true;
|
|
231
|
-
signal.removeEventListener("abort", onAbort);
|
|
232
|
-
resolve(results);
|
|
233
|
-
};
|
|
234
|
-
const onAbort = () => {
|
|
235
|
-
if (child.exitCode === null) {
|
|
236
|
-
child.kill("SIGKILL");
|
|
237
|
-
}
|
|
238
|
-
};
|
|
239
|
-
signal.addEventListener("abort", onAbort, { once: true });
|
|
240
|
-
child.stdout.setEncoding("utf-8");
|
|
241
|
-
child.stdout.on("data", (chunk) => {
|
|
242
|
-
stdout += chunk;
|
|
243
|
-
});
|
|
244
|
-
child.on("error", () => {
|
|
245
|
-
finish([]);
|
|
246
|
-
});
|
|
247
|
-
child.on("close", (code) => {
|
|
248
|
-
if (signal.aborted || code !== 0 || !stdout) {
|
|
249
|
-
finish([]);
|
|
250
|
-
return;
|
|
251
|
-
}
|
|
252
|
-
const lines = stdout.trim().split("\n").filter(Boolean);
|
|
253
|
-
const results = [];
|
|
254
|
-
for (const line of lines) {
|
|
255
|
-
const displayLine = toDisplayPath(line);
|
|
256
|
-
const hasTrailingSeparator = displayLine.endsWith("/");
|
|
257
|
-
const normalizedPath = hasTrailingSeparator ? displayLine.slice(0, -1) : displayLine;
|
|
258
|
-
if (normalizedPath === ".git" || normalizedPath.startsWith(".git/") || normalizedPath.includes("/.git/")) {
|
|
259
|
-
continue;
|
|
260
|
-
}
|
|
261
|
-
results.push({
|
|
262
|
-
path: displayLine,
|
|
263
|
-
isDirectory: hasTrailingSeparator
|
|
264
|
-
});
|
|
265
|
-
}
|
|
266
|
-
finish(results);
|
|
267
|
-
});
|
|
268
|
-
});
|
|
269
|
-
}
|
|
270
|
-
var CombinedAutocompleteProvider = class {
|
|
271
|
-
commands;
|
|
272
|
-
basePath;
|
|
273
|
-
fdPath;
|
|
274
|
-
constructor(commands = [], basePath = process.cwd(), fdPath = null) {
|
|
275
|
-
this.commands = commands;
|
|
276
|
-
this.basePath = basePath;
|
|
277
|
-
this.fdPath = fdPath;
|
|
278
|
-
}
|
|
279
|
-
async getSuggestions(lines, cursorLine, cursorCol, options2) {
|
|
280
|
-
const currentLine = lines[cursorLine] || "";
|
|
281
|
-
const textBeforeCursor = currentLine.slice(0, cursorCol);
|
|
282
|
-
const atPrefix = this.extractAtPrefix(textBeforeCursor);
|
|
283
|
-
if (atPrefix) {
|
|
284
|
-
const { rawPrefix, isQuotedPrefix } = parsePathPrefix(atPrefix);
|
|
285
|
-
const suggestions2 = await this.getFuzzyFileSuggestions(rawPrefix, {
|
|
286
|
-
isQuotedPrefix,
|
|
287
|
-
signal: options2.signal
|
|
288
|
-
});
|
|
289
|
-
if (suggestions2.length === 0)
|
|
290
|
-
return null;
|
|
291
|
-
return {
|
|
292
|
-
items: suggestions2,
|
|
293
|
-
prefix: atPrefix
|
|
294
|
-
};
|
|
295
|
-
}
|
|
296
|
-
if (!options2.force && textBeforeCursor.startsWith("/")) {
|
|
297
|
-
const spaceIndex = textBeforeCursor.indexOf(" ");
|
|
298
|
-
if (spaceIndex === -1) {
|
|
299
|
-
const prefix = textBeforeCursor.slice(1);
|
|
300
|
-
const commandItems = this.commands.map((cmd) => ({
|
|
301
|
-
name: "name" in cmd ? cmd.name : cmd.value,
|
|
302
|
-
label: "name" in cmd ? cmd.name : cmd.label,
|
|
303
|
-
description: cmd.description
|
|
304
|
-
}));
|
|
305
|
-
const filtered = fuzzyFilter(commandItems, prefix, (item) => item.name).map((item) => ({
|
|
306
|
-
value: item.name,
|
|
307
|
-
label: item.label,
|
|
308
|
-
...item.description && { description: item.description }
|
|
309
|
-
}));
|
|
310
|
-
if (filtered.length === 0)
|
|
311
|
-
return null;
|
|
312
|
-
return {
|
|
313
|
-
items: filtered,
|
|
314
|
-
prefix: textBeforeCursor
|
|
315
|
-
};
|
|
316
|
-
}
|
|
317
|
-
const commandName = textBeforeCursor.slice(1, spaceIndex);
|
|
318
|
-
const argumentText = textBeforeCursor.slice(spaceIndex + 1);
|
|
319
|
-
const command = this.commands.find((cmd) => {
|
|
320
|
-
const name = "name" in cmd ? cmd.name : cmd.value;
|
|
321
|
-
return name === commandName;
|
|
322
|
-
});
|
|
323
|
-
if (!command || !("getArgumentCompletions" in command) || !command.getArgumentCompletions) {
|
|
324
|
-
return null;
|
|
325
|
-
}
|
|
326
|
-
const argumentSuggestions = await command.getArgumentCompletions(argumentText);
|
|
327
|
-
if (!Array.isArray(argumentSuggestions) || argumentSuggestions.length === 0) {
|
|
328
|
-
return null;
|
|
329
|
-
}
|
|
330
|
-
return {
|
|
331
|
-
items: argumentSuggestions,
|
|
332
|
-
prefix: argumentText
|
|
333
|
-
};
|
|
334
|
-
}
|
|
335
|
-
const pathMatch = this.extractPathPrefix(textBeforeCursor, options2.force ?? false);
|
|
336
|
-
if (pathMatch === null) {
|
|
337
|
-
return null;
|
|
338
|
-
}
|
|
339
|
-
const suggestions = this.getFileSuggestions(pathMatch);
|
|
340
|
-
if (suggestions.length === 0)
|
|
341
|
-
return null;
|
|
342
|
-
return {
|
|
343
|
-
items: suggestions,
|
|
344
|
-
prefix: pathMatch
|
|
345
|
-
};
|
|
346
|
-
}
|
|
347
|
-
applyCompletion(lines, cursorLine, cursorCol, item, prefix) {
|
|
348
|
-
const currentLine = lines[cursorLine] || "";
|
|
349
|
-
const beforePrefix = currentLine.slice(0, cursorCol - prefix.length);
|
|
350
|
-
const afterCursor = currentLine.slice(cursorCol);
|
|
351
|
-
const isQuotedPrefix = prefix.startsWith('"') || prefix.startsWith('@"');
|
|
352
|
-
const hasLeadingQuoteAfterCursor = afterCursor.startsWith('"');
|
|
353
|
-
const hasTrailingQuoteInItem = item.value.endsWith('"');
|
|
354
|
-
const adjustedAfterCursor = isQuotedPrefix && hasTrailingQuoteInItem && hasLeadingQuoteAfterCursor ? afterCursor.slice(1) : afterCursor;
|
|
355
|
-
const isSlashCommand = prefix.startsWith("/") && beforePrefix.trim() === "" && !prefix.slice(1).includes("/");
|
|
356
|
-
if (isSlashCommand) {
|
|
357
|
-
const newLine2 = `${beforePrefix}/${item.value} ${adjustedAfterCursor}`;
|
|
358
|
-
const newLines2 = [...lines];
|
|
359
|
-
newLines2[cursorLine] = newLine2;
|
|
360
|
-
return {
|
|
361
|
-
lines: newLines2,
|
|
362
|
-
cursorLine,
|
|
363
|
-
cursorCol: beforePrefix.length + item.value.length + 2
|
|
364
|
-
// +2 for "/" and space
|
|
365
|
-
};
|
|
366
|
-
}
|
|
367
|
-
if (prefix.startsWith("@")) {
|
|
368
|
-
const isDirectory2 = item.label.endsWith("/");
|
|
369
|
-
const suffix = isDirectory2 ? "" : " ";
|
|
370
|
-
const newLine2 = `${beforePrefix + item.value}${suffix}${adjustedAfterCursor}`;
|
|
371
|
-
const newLines2 = [...lines];
|
|
372
|
-
newLines2[cursorLine] = newLine2;
|
|
373
|
-
const hasTrailingQuote2 = item.value.endsWith('"');
|
|
374
|
-
const cursorOffset2 = isDirectory2 && hasTrailingQuote2 ? item.value.length - 1 : item.value.length;
|
|
375
|
-
return {
|
|
376
|
-
lines: newLines2,
|
|
377
|
-
cursorLine,
|
|
378
|
-
cursorCol: beforePrefix.length + cursorOffset2 + suffix.length
|
|
379
|
-
};
|
|
380
|
-
}
|
|
381
|
-
const textBeforeCursor = currentLine.slice(0, cursorCol);
|
|
382
|
-
if (textBeforeCursor.includes("/") && textBeforeCursor.includes(" ")) {
|
|
383
|
-
const newLine2 = beforePrefix + item.value + adjustedAfterCursor;
|
|
384
|
-
const newLines2 = [...lines];
|
|
385
|
-
newLines2[cursorLine] = newLine2;
|
|
386
|
-
const isDirectory2 = item.label.endsWith("/");
|
|
387
|
-
const hasTrailingQuote2 = item.value.endsWith('"');
|
|
388
|
-
const cursorOffset2 = isDirectory2 && hasTrailingQuote2 ? item.value.length - 1 : item.value.length;
|
|
389
|
-
return {
|
|
390
|
-
lines: newLines2,
|
|
391
|
-
cursorLine,
|
|
392
|
-
cursorCol: beforePrefix.length + cursorOffset2
|
|
393
|
-
};
|
|
394
|
-
}
|
|
395
|
-
const newLine = beforePrefix + item.value + adjustedAfterCursor;
|
|
396
|
-
const newLines = [...lines];
|
|
397
|
-
newLines[cursorLine] = newLine;
|
|
398
|
-
const isDirectory = item.label.endsWith("/");
|
|
399
|
-
const hasTrailingQuote = item.value.endsWith('"');
|
|
400
|
-
const cursorOffset = isDirectory && hasTrailingQuote ? item.value.length - 1 : item.value.length;
|
|
401
|
-
return {
|
|
402
|
-
lines: newLines,
|
|
403
|
-
cursorLine,
|
|
404
|
-
cursorCol: beforePrefix.length + cursorOffset
|
|
405
|
-
};
|
|
406
|
-
}
|
|
407
|
-
// Extract @ prefix for fuzzy file suggestions
|
|
408
|
-
extractAtPrefix(text) {
|
|
409
|
-
const quotedPrefix = extractQuotedPrefix(text);
|
|
410
|
-
if (quotedPrefix?.startsWith('@"')) {
|
|
411
|
-
return quotedPrefix;
|
|
412
|
-
}
|
|
413
|
-
const lastDelimiterIndex = findLastDelimiter(text);
|
|
414
|
-
const tokenStart = lastDelimiterIndex === -1 ? 0 : lastDelimiterIndex + 1;
|
|
415
|
-
if (text[tokenStart] === "@") {
|
|
416
|
-
return text.slice(tokenStart);
|
|
417
|
-
}
|
|
418
|
-
return null;
|
|
419
|
-
}
|
|
420
|
-
// Extract a path-like prefix from the text before cursor
|
|
421
|
-
extractPathPrefix(text, forceExtract = false) {
|
|
422
|
-
const quotedPrefix = extractQuotedPrefix(text);
|
|
423
|
-
if (quotedPrefix) {
|
|
424
|
-
return quotedPrefix;
|
|
425
|
-
}
|
|
426
|
-
const lastDelimiterIndex = findLastDelimiter(text);
|
|
427
|
-
const pathPrefix = lastDelimiterIndex === -1 ? text : text.slice(lastDelimiterIndex + 1);
|
|
428
|
-
if (forceExtract) {
|
|
429
|
-
return pathPrefix;
|
|
430
|
-
}
|
|
431
|
-
if (pathPrefix.includes("/") || pathPrefix.startsWith(".") || pathPrefix.startsWith("~/")) {
|
|
432
|
-
return pathPrefix;
|
|
433
|
-
}
|
|
434
|
-
if (pathPrefix === "" && text.endsWith(" ")) {
|
|
435
|
-
return pathPrefix;
|
|
436
|
-
}
|
|
437
|
-
return null;
|
|
438
|
-
}
|
|
439
|
-
// Expand home directory (~/) to actual home path
|
|
440
|
-
expandHomePath(path3) {
|
|
441
|
-
if (path3.startsWith("~/")) {
|
|
442
|
-
const expandedPath = join(homedir(), path3.slice(2));
|
|
443
|
-
return path3.endsWith("/") && !expandedPath.endsWith("/") ? `${expandedPath}/` : expandedPath;
|
|
444
|
-
} else if (path3 === "~") {
|
|
445
|
-
return homedir();
|
|
446
|
-
}
|
|
447
|
-
return path3;
|
|
448
|
-
}
|
|
449
|
-
resolveScopedFuzzyQuery(rawQuery) {
|
|
450
|
-
const normalizedQuery = toDisplayPath(rawQuery);
|
|
451
|
-
const slashIndex = normalizedQuery.lastIndexOf("/");
|
|
452
|
-
if (slashIndex === -1) {
|
|
453
|
-
return null;
|
|
454
|
-
}
|
|
455
|
-
const displayBase = normalizedQuery.slice(0, slashIndex + 1);
|
|
456
|
-
const query = normalizedQuery.slice(slashIndex + 1);
|
|
457
|
-
let baseDir;
|
|
458
|
-
if (displayBase.startsWith("~/")) {
|
|
459
|
-
baseDir = this.expandHomePath(displayBase);
|
|
460
|
-
} else if (displayBase.startsWith("/")) {
|
|
461
|
-
baseDir = displayBase;
|
|
462
|
-
} else {
|
|
463
|
-
baseDir = join(this.basePath, displayBase);
|
|
464
|
-
}
|
|
465
|
-
try {
|
|
466
|
-
if (!statSync(baseDir).isDirectory()) {
|
|
467
|
-
return null;
|
|
468
|
-
}
|
|
469
|
-
} catch {
|
|
470
|
-
return null;
|
|
471
|
-
}
|
|
472
|
-
return { baseDir, query, displayBase };
|
|
473
|
-
}
|
|
474
|
-
scopedPathForDisplay(displayBase, relativePath) {
|
|
475
|
-
const normalizedRelativePath = toDisplayPath(relativePath);
|
|
476
|
-
if (displayBase === "/") {
|
|
477
|
-
return `/${normalizedRelativePath}`;
|
|
478
|
-
}
|
|
479
|
-
return `${toDisplayPath(displayBase)}${normalizedRelativePath}`;
|
|
480
|
-
}
|
|
481
|
-
// Get file/directory suggestions for a given path prefix
|
|
482
|
-
getFileSuggestions(prefix) {
|
|
483
|
-
try {
|
|
484
|
-
let searchDir;
|
|
485
|
-
let searchPrefix;
|
|
486
|
-
const { rawPrefix, isAtPrefix, isQuotedPrefix } = parsePathPrefix(prefix);
|
|
487
|
-
let expandedPrefix = rawPrefix;
|
|
488
|
-
if (expandedPrefix.startsWith("~")) {
|
|
489
|
-
expandedPrefix = this.expandHomePath(expandedPrefix);
|
|
490
|
-
}
|
|
491
|
-
const isRootPrefix = rawPrefix === "" || rawPrefix === "./" || rawPrefix === "../" || rawPrefix === "~" || rawPrefix === "~/" || rawPrefix === "/" || isAtPrefix && rawPrefix === "";
|
|
492
|
-
if (isRootPrefix) {
|
|
493
|
-
if (rawPrefix.startsWith("~") || expandedPrefix.startsWith("/")) {
|
|
494
|
-
searchDir = expandedPrefix;
|
|
495
|
-
} else {
|
|
496
|
-
searchDir = join(this.basePath, expandedPrefix);
|
|
497
|
-
}
|
|
498
|
-
searchPrefix = "";
|
|
499
|
-
} else if (rawPrefix.endsWith("/")) {
|
|
500
|
-
if (rawPrefix.startsWith("~") || expandedPrefix.startsWith("/")) {
|
|
501
|
-
searchDir = expandedPrefix;
|
|
502
|
-
} else {
|
|
503
|
-
searchDir = join(this.basePath, expandedPrefix);
|
|
504
|
-
}
|
|
505
|
-
searchPrefix = "";
|
|
506
|
-
} else {
|
|
507
|
-
const dir = dirname(expandedPrefix);
|
|
508
|
-
const file = basename(expandedPrefix);
|
|
509
|
-
if (rawPrefix.startsWith("~") || expandedPrefix.startsWith("/")) {
|
|
510
|
-
searchDir = dir;
|
|
511
|
-
} else {
|
|
512
|
-
searchDir = join(this.basePath, dir);
|
|
513
|
-
}
|
|
514
|
-
searchPrefix = file;
|
|
515
|
-
}
|
|
516
|
-
const entries = readdirSync(searchDir, { withFileTypes: true });
|
|
517
|
-
const suggestions = [];
|
|
518
|
-
for (const entry of entries) {
|
|
519
|
-
if (!entry.name.toLowerCase().startsWith(searchPrefix.toLowerCase())) {
|
|
520
|
-
continue;
|
|
521
|
-
}
|
|
522
|
-
let isDirectory = entry.isDirectory();
|
|
523
|
-
if (!isDirectory && entry.isSymbolicLink()) {
|
|
524
|
-
try {
|
|
525
|
-
const fullPath = join(searchDir, entry.name);
|
|
526
|
-
isDirectory = statSync(fullPath).isDirectory();
|
|
527
|
-
} catch {
|
|
528
|
-
}
|
|
529
|
-
}
|
|
530
|
-
let relativePath;
|
|
531
|
-
const name = entry.name;
|
|
532
|
-
const displayPrefix = rawPrefix;
|
|
533
|
-
if (displayPrefix.endsWith("/")) {
|
|
534
|
-
relativePath = displayPrefix + name;
|
|
535
|
-
} else if (displayPrefix.includes("/") || displayPrefix.includes("\\")) {
|
|
536
|
-
if (displayPrefix.startsWith("~/")) {
|
|
537
|
-
const homeRelativeDir = displayPrefix.slice(2);
|
|
538
|
-
const dir = dirname(homeRelativeDir);
|
|
539
|
-
relativePath = `~/${dir === "." ? name : join(dir, name)}`;
|
|
540
|
-
} else if (displayPrefix.startsWith("/")) {
|
|
541
|
-
const dir = dirname(displayPrefix);
|
|
542
|
-
if (dir === "/") {
|
|
543
|
-
relativePath = `/${name}`;
|
|
544
|
-
} else {
|
|
545
|
-
relativePath = `${dir}/${name}`;
|
|
546
|
-
}
|
|
547
|
-
} else {
|
|
548
|
-
relativePath = join(dirname(displayPrefix), name);
|
|
549
|
-
if (displayPrefix.startsWith("./") && !relativePath.startsWith("./")) {
|
|
550
|
-
relativePath = `./${relativePath}`;
|
|
551
|
-
}
|
|
552
|
-
}
|
|
553
|
-
} else {
|
|
554
|
-
if (displayPrefix.startsWith("~")) {
|
|
555
|
-
relativePath = `~/${name}`;
|
|
556
|
-
} else {
|
|
557
|
-
relativePath = name;
|
|
558
|
-
}
|
|
559
|
-
}
|
|
560
|
-
relativePath = toDisplayPath(relativePath);
|
|
561
|
-
const pathValue = isDirectory ? `${relativePath}/` : relativePath;
|
|
562
|
-
const value = buildCompletionValue(pathValue, {
|
|
563
|
-
isDirectory,
|
|
564
|
-
isAtPrefix,
|
|
565
|
-
isQuotedPrefix
|
|
566
|
-
});
|
|
567
|
-
suggestions.push({
|
|
568
|
-
value,
|
|
569
|
-
label: name + (isDirectory ? "/" : "")
|
|
570
|
-
});
|
|
571
|
-
}
|
|
572
|
-
suggestions.sort((a, b) => {
|
|
573
|
-
const aIsDir = a.value.endsWith("/");
|
|
574
|
-
const bIsDir = b.value.endsWith("/");
|
|
575
|
-
if (aIsDir && !bIsDir)
|
|
576
|
-
return -1;
|
|
577
|
-
if (!aIsDir && bIsDir)
|
|
578
|
-
return 1;
|
|
579
|
-
return a.label.localeCompare(b.label);
|
|
580
|
-
});
|
|
581
|
-
return suggestions;
|
|
582
|
-
} catch (_e) {
|
|
583
|
-
return [];
|
|
584
|
-
}
|
|
585
|
-
}
|
|
586
|
-
// Score an entry against the query (higher = better match)
|
|
587
|
-
// isDirectory adds bonus to prioritize folders
|
|
588
|
-
scoreEntry(filePath, query, isDirectory) {
|
|
589
|
-
const fileName = basename(filePath);
|
|
590
|
-
const lowerFileName = fileName.toLowerCase();
|
|
591
|
-
const lowerQuery = query.toLowerCase();
|
|
592
|
-
let score = 0;
|
|
593
|
-
if (lowerFileName === lowerQuery)
|
|
594
|
-
score = 100;
|
|
595
|
-
else if (lowerFileName.startsWith(lowerQuery))
|
|
596
|
-
score = 80;
|
|
597
|
-
else if (lowerFileName.includes(lowerQuery))
|
|
598
|
-
score = 50;
|
|
599
|
-
else if (filePath.toLowerCase().includes(lowerQuery))
|
|
600
|
-
score = 30;
|
|
601
|
-
if (isDirectory && score > 0)
|
|
602
|
-
score += 10;
|
|
603
|
-
return score;
|
|
604
|
-
}
|
|
605
|
-
// Fuzzy file search using fd (fast, respects .gitignore)
|
|
606
|
-
async getFuzzyFileSuggestions(query, options2) {
|
|
607
|
-
if (!this.fdPath || options2.signal.aborted) {
|
|
608
|
-
return [];
|
|
609
|
-
}
|
|
610
|
-
try {
|
|
611
|
-
const scopedQuery = this.resolveScopedFuzzyQuery(query);
|
|
612
|
-
const fdBaseDir = scopedQuery?.baseDir ?? this.basePath;
|
|
613
|
-
const fdQuery = scopedQuery?.query ?? query;
|
|
614
|
-
const entries = await walkDirectoryWithFd(fdBaseDir, this.fdPath, fdQuery, 100, options2.signal);
|
|
615
|
-
if (options2.signal.aborted) {
|
|
616
|
-
return [];
|
|
617
|
-
}
|
|
618
|
-
const scoredEntries = entries.map((entry) => ({
|
|
619
|
-
...entry,
|
|
620
|
-
score: fdQuery ? this.scoreEntry(entry.path, fdQuery, entry.isDirectory) : 1
|
|
621
|
-
})).filter((entry) => entry.score > 0);
|
|
622
|
-
scoredEntries.sort((a, b) => b.score - a.score);
|
|
623
|
-
const topEntries = scoredEntries.slice(0, 20);
|
|
624
|
-
const suggestions = [];
|
|
625
|
-
for (const { path: entryPath, isDirectory } of topEntries) {
|
|
626
|
-
const pathWithoutSlash = isDirectory ? entryPath.slice(0, -1) : entryPath;
|
|
627
|
-
const displayPath = scopedQuery ? this.scopedPathForDisplay(scopedQuery.displayBase, pathWithoutSlash) : pathWithoutSlash;
|
|
628
|
-
const entryName = basename(pathWithoutSlash);
|
|
629
|
-
const completionPath = isDirectory ? `${displayPath}/` : displayPath;
|
|
630
|
-
const value = buildCompletionValue(completionPath, {
|
|
631
|
-
isDirectory,
|
|
632
|
-
isAtPrefix: true,
|
|
633
|
-
isQuotedPrefix: options2.isQuotedPrefix
|
|
634
|
-
});
|
|
635
|
-
suggestions.push({
|
|
636
|
-
value,
|
|
637
|
-
label: entryName + (isDirectory ? "/" : ""),
|
|
638
|
-
description: displayPath
|
|
639
|
-
});
|
|
640
|
-
}
|
|
641
|
-
return suggestions;
|
|
642
|
-
} catch {
|
|
643
|
-
return [];
|
|
644
|
-
}
|
|
645
|
-
}
|
|
646
|
-
// Check if we should trigger file completion (called on Tab key)
|
|
647
|
-
shouldTriggerFileCompletion(lines, cursorLine, cursorCol) {
|
|
648
|
-
const currentLine = lines[cursorLine] || "";
|
|
649
|
-
const textBeforeCursor = currentLine.slice(0, cursorCol);
|
|
650
|
-
if (textBeforeCursor.trim().startsWith("/") && !textBeforeCursor.trim().includes(" ")) {
|
|
651
|
-
return false;
|
|
652
|
-
}
|
|
653
|
-
return true;
|
|
654
|
-
}
|
|
655
|
-
};
|
|
656
|
-
|
|
657
|
-
// node_modules/@mariozechner/pi-tui/dist/utils.js
|
|
658
|
-
var segmenter = new Intl.Segmenter(void 0, { granularity: "grapheme" });
|
|
659
|
-
function getSegmenter() {
|
|
660
|
-
return segmenter;
|
|
661
|
-
}
|
|
662
|
-
var zeroWidthRegex = new RegExp("^(?:\\p{Default_Ignorable_Code_Point}|\\p{Control}|\\p{Mark}|\\p{Surrogate})+$", "v");
|
|
663
|
-
var leadingNonPrintingRegex = new RegExp("^[\\p{Default_Ignorable_Code_Point}\\p{Control}\\p{Format}\\p{Mark}\\p{Surrogate}]+", "v");
|
|
664
|
-
var rgiEmojiRegex = new RegExp("^\\p{RGI_Emoji}$", "v");
|
|
665
|
-
var AnsiCodeTracker = class {
|
|
666
|
-
// Track individual attributes separately so we can reset them specifically
|
|
667
|
-
bold = false;
|
|
668
|
-
dim = false;
|
|
669
|
-
italic = false;
|
|
670
|
-
underline = false;
|
|
671
|
-
blink = false;
|
|
672
|
-
inverse = false;
|
|
673
|
-
hidden = false;
|
|
674
|
-
strikethrough = false;
|
|
675
|
-
fgColor = null;
|
|
676
|
-
// Stores the full code like "31" or "38;5;240"
|
|
677
|
-
bgColor = null;
|
|
678
|
-
// Stores the full code like "41" or "48;5;240"
|
|
679
|
-
process(ansiCode) {
|
|
680
|
-
if (!ansiCode.endsWith("m")) {
|
|
681
|
-
return;
|
|
682
|
-
}
|
|
683
|
-
const match = ansiCode.match(/\x1b\[([\d;]*)m/);
|
|
684
|
-
if (!match)
|
|
685
|
-
return;
|
|
686
|
-
const params = match[1];
|
|
687
|
-
if (params === "" || params === "0") {
|
|
688
|
-
this.reset();
|
|
689
|
-
return;
|
|
690
|
-
}
|
|
691
|
-
const parts = params.split(";");
|
|
692
|
-
let i = 0;
|
|
693
|
-
while (i < parts.length) {
|
|
694
|
-
const code = Number.parseInt(parts[i], 10);
|
|
695
|
-
if (code === 38 || code === 48) {
|
|
696
|
-
if (parts[i + 1] === "5" && parts[i + 2] !== void 0) {
|
|
697
|
-
const colorCode = `${parts[i]};${parts[i + 1]};${parts[i + 2]}`;
|
|
698
|
-
if (code === 38) {
|
|
699
|
-
this.fgColor = colorCode;
|
|
700
|
-
} else {
|
|
701
|
-
this.bgColor = colorCode;
|
|
702
|
-
}
|
|
703
|
-
i += 3;
|
|
704
|
-
continue;
|
|
705
|
-
} else if (parts[i + 1] === "2" && parts[i + 4] !== void 0) {
|
|
706
|
-
const colorCode = `${parts[i]};${parts[i + 1]};${parts[i + 2]};${parts[i + 3]};${parts[i + 4]}`;
|
|
707
|
-
if (code === 38) {
|
|
708
|
-
this.fgColor = colorCode;
|
|
709
|
-
} else {
|
|
710
|
-
this.bgColor = colorCode;
|
|
711
|
-
}
|
|
712
|
-
i += 5;
|
|
713
|
-
continue;
|
|
714
|
-
}
|
|
715
|
-
}
|
|
716
|
-
switch (code) {
|
|
717
|
-
case 0:
|
|
718
|
-
this.reset();
|
|
719
|
-
break;
|
|
720
|
-
case 1:
|
|
721
|
-
this.bold = true;
|
|
722
|
-
break;
|
|
723
|
-
case 2:
|
|
724
|
-
this.dim = true;
|
|
725
|
-
break;
|
|
726
|
-
case 3:
|
|
727
|
-
this.italic = true;
|
|
728
|
-
break;
|
|
729
|
-
case 4:
|
|
730
|
-
this.underline = true;
|
|
731
|
-
break;
|
|
732
|
-
case 5:
|
|
733
|
-
this.blink = true;
|
|
734
|
-
break;
|
|
735
|
-
case 7:
|
|
736
|
-
this.inverse = true;
|
|
737
|
-
break;
|
|
738
|
-
case 8:
|
|
739
|
-
this.hidden = true;
|
|
740
|
-
break;
|
|
741
|
-
case 9:
|
|
742
|
-
this.strikethrough = true;
|
|
743
|
-
break;
|
|
744
|
-
case 21:
|
|
745
|
-
this.bold = false;
|
|
746
|
-
break;
|
|
747
|
-
// Some terminals
|
|
748
|
-
case 22:
|
|
749
|
-
this.bold = false;
|
|
750
|
-
this.dim = false;
|
|
751
|
-
break;
|
|
752
|
-
case 23:
|
|
753
|
-
this.italic = false;
|
|
754
|
-
break;
|
|
755
|
-
case 24:
|
|
756
|
-
this.underline = false;
|
|
757
|
-
break;
|
|
758
|
-
case 25:
|
|
759
|
-
this.blink = false;
|
|
760
|
-
break;
|
|
761
|
-
case 27:
|
|
762
|
-
this.inverse = false;
|
|
763
|
-
break;
|
|
764
|
-
case 28:
|
|
765
|
-
this.hidden = false;
|
|
766
|
-
break;
|
|
767
|
-
case 29:
|
|
768
|
-
this.strikethrough = false;
|
|
769
|
-
break;
|
|
770
|
-
case 39:
|
|
771
|
-
this.fgColor = null;
|
|
772
|
-
break;
|
|
773
|
-
// Default fg
|
|
774
|
-
case 49:
|
|
775
|
-
this.bgColor = null;
|
|
776
|
-
break;
|
|
777
|
-
// Default bg
|
|
778
|
-
default:
|
|
779
|
-
if (code >= 30 && code <= 37 || code >= 90 && code <= 97) {
|
|
780
|
-
this.fgColor = String(code);
|
|
781
|
-
} else if (code >= 40 && code <= 47 || code >= 100 && code <= 107) {
|
|
782
|
-
this.bgColor = String(code);
|
|
783
|
-
}
|
|
784
|
-
break;
|
|
785
|
-
}
|
|
786
|
-
i++;
|
|
787
|
-
}
|
|
788
|
-
}
|
|
789
|
-
reset() {
|
|
790
|
-
this.bold = false;
|
|
791
|
-
this.dim = false;
|
|
792
|
-
this.italic = false;
|
|
793
|
-
this.underline = false;
|
|
794
|
-
this.blink = false;
|
|
795
|
-
this.inverse = false;
|
|
796
|
-
this.hidden = false;
|
|
797
|
-
this.strikethrough = false;
|
|
798
|
-
this.fgColor = null;
|
|
799
|
-
this.bgColor = null;
|
|
800
|
-
}
|
|
801
|
-
/** Clear all state for reuse. */
|
|
802
|
-
clear() {
|
|
803
|
-
this.reset();
|
|
804
|
-
}
|
|
805
|
-
getActiveCodes() {
|
|
806
|
-
const codes = [];
|
|
807
|
-
if (this.bold)
|
|
808
|
-
codes.push("1");
|
|
809
|
-
if (this.dim)
|
|
810
|
-
codes.push("2");
|
|
811
|
-
if (this.italic)
|
|
812
|
-
codes.push("3");
|
|
813
|
-
if (this.underline)
|
|
814
|
-
codes.push("4");
|
|
815
|
-
if (this.blink)
|
|
816
|
-
codes.push("5");
|
|
817
|
-
if (this.inverse)
|
|
818
|
-
codes.push("7");
|
|
819
|
-
if (this.hidden)
|
|
820
|
-
codes.push("8");
|
|
821
|
-
if (this.strikethrough)
|
|
822
|
-
codes.push("9");
|
|
823
|
-
if (this.fgColor)
|
|
824
|
-
codes.push(this.fgColor);
|
|
825
|
-
if (this.bgColor)
|
|
826
|
-
codes.push(this.bgColor);
|
|
827
|
-
if (codes.length === 0)
|
|
828
|
-
return "";
|
|
829
|
-
return `\x1B[${codes.join(";")}m`;
|
|
830
|
-
}
|
|
831
|
-
hasActiveCodes() {
|
|
832
|
-
return this.bold || this.dim || this.italic || this.underline || this.blink || this.inverse || this.hidden || this.strikethrough || this.fgColor !== null || this.bgColor !== null;
|
|
833
|
-
}
|
|
834
|
-
/**
|
|
835
|
-
* Get reset codes for attributes that need to be turned off at line end,
|
|
836
|
-
* specifically underline which bleeds into padding.
|
|
837
|
-
* Returns empty string if no problematic attributes are active.
|
|
838
|
-
*/
|
|
839
|
-
getLineEndReset() {
|
|
840
|
-
if (this.underline) {
|
|
841
|
-
return "\x1B[24m";
|
|
842
|
-
}
|
|
843
|
-
return "";
|
|
844
|
-
}
|
|
845
|
-
};
|
|
846
|
-
var pooledStyleTracker = new AnsiCodeTracker();
|
|
847
|
-
|
|
848
|
-
// node_modules/@mariozechner/pi-tui/dist/keys.js
|
|
849
|
-
var MODIFIERS = {
|
|
850
|
-
shift: 1,
|
|
851
|
-
alt: 2,
|
|
852
|
-
ctrl: 4
|
|
853
|
-
};
|
|
854
|
-
var LOCK_MASK = 64 + 128;
|
|
855
|
-
var ARROW_CODEPOINTS = {
|
|
856
|
-
up: -1,
|
|
857
|
-
down: -2,
|
|
858
|
-
right: -3,
|
|
859
|
-
left: -4
|
|
860
|
-
};
|
|
861
|
-
var FUNCTIONAL_CODEPOINTS = {
|
|
862
|
-
delete: -10,
|
|
863
|
-
insert: -11,
|
|
864
|
-
pageUp: -12,
|
|
865
|
-
pageDown: -13,
|
|
866
|
-
home: -14,
|
|
867
|
-
end: -15
|
|
868
|
-
};
|
|
869
|
-
var KITTY_FUNCTIONAL_KEY_EQUIVALENTS = /* @__PURE__ */ new Map([
|
|
870
|
-
[57399, 48],
|
|
871
|
-
// KP_0 -> 0
|
|
872
|
-
[57400, 49],
|
|
873
|
-
// KP_1 -> 1
|
|
874
|
-
[57401, 50],
|
|
875
|
-
// KP_2 -> 2
|
|
876
|
-
[57402, 51],
|
|
877
|
-
// KP_3 -> 3
|
|
878
|
-
[57403, 52],
|
|
879
|
-
// KP_4 -> 4
|
|
880
|
-
[57404, 53],
|
|
881
|
-
// KP_5 -> 5
|
|
882
|
-
[57405, 54],
|
|
883
|
-
// KP_6 -> 6
|
|
884
|
-
[57406, 55],
|
|
885
|
-
// KP_7 -> 7
|
|
886
|
-
[57407, 56],
|
|
887
|
-
// KP_8 -> 8
|
|
888
|
-
[57408, 57],
|
|
889
|
-
// KP_9 -> 9
|
|
890
|
-
[57409, 46],
|
|
891
|
-
// KP_DECIMAL -> .
|
|
892
|
-
[57410, 47],
|
|
893
|
-
// KP_DIVIDE -> /
|
|
894
|
-
[57411, 42],
|
|
895
|
-
// KP_MULTIPLY -> *
|
|
896
|
-
[57412, 45],
|
|
897
|
-
// KP_SUBTRACT -> -
|
|
898
|
-
[57413, 43],
|
|
899
|
-
// KP_ADD -> +
|
|
900
|
-
[57415, 61],
|
|
901
|
-
// KP_EQUAL -> =
|
|
902
|
-
[57416, 44],
|
|
903
|
-
// KP_SEPARATOR -> ,
|
|
904
|
-
[57417, ARROW_CODEPOINTS.left],
|
|
905
|
-
[57418, ARROW_CODEPOINTS.right],
|
|
906
|
-
[57419, ARROW_CODEPOINTS.up],
|
|
907
|
-
[57420, ARROW_CODEPOINTS.down],
|
|
908
|
-
[57421, FUNCTIONAL_CODEPOINTS.pageUp],
|
|
909
|
-
[57422, FUNCTIONAL_CODEPOINTS.pageDown],
|
|
910
|
-
[57423, FUNCTIONAL_CODEPOINTS.home],
|
|
911
|
-
[57424, FUNCTIONAL_CODEPOINTS.end],
|
|
912
|
-
[57425, FUNCTIONAL_CODEPOINTS.insert],
|
|
913
|
-
[57426, FUNCTIONAL_CODEPOINTS.delete]
|
|
914
|
-
]);
|
|
915
|
-
var KITTY_PRINTABLE_ALLOWED_MODIFIERS = MODIFIERS.shift | LOCK_MASK;
|
|
916
|
-
|
|
917
|
-
// node_modules/@mariozechner/pi-tui/dist/tui.js
|
|
918
|
-
import * as fs from "fs";
|
|
919
|
-
import * as os from "os";
|
|
920
|
-
import * as path from "path";
|
|
921
|
-
import { performance } from "perf_hooks";
|
|
922
|
-
|
|
923
|
-
// node_modules/@mariozechner/pi-tui/dist/components/editor.js
|
|
924
|
-
var baseSegmenter = getSegmenter();
|
|
925
|
-
|
|
926
|
-
// node_modules/@mariozechner/pi-tui/dist/components/input.js
|
|
927
|
-
var segmenter2 = getSegmenter();
|
|
928
|
-
|
|
929
|
-
// node_modules/marked/lib/marked.esm.js
|
|
930
|
-
function _getDefaults() {
|
|
931
|
-
return {
|
|
932
|
-
async: false,
|
|
933
|
-
breaks: false,
|
|
934
|
-
extensions: null,
|
|
935
|
-
gfm: true,
|
|
936
|
-
hooks: null,
|
|
937
|
-
pedantic: false,
|
|
938
|
-
renderer: null,
|
|
939
|
-
silent: false,
|
|
940
|
-
tokenizer: null,
|
|
941
|
-
walkTokens: null
|
|
942
|
-
};
|
|
943
|
-
}
|
|
944
|
-
var _defaults = _getDefaults();
|
|
945
|
-
function changeDefaults(newDefaults) {
|
|
946
|
-
_defaults = newDefaults;
|
|
947
|
-
}
|
|
948
|
-
var noopTest = { exec: () => null };
|
|
949
|
-
function edit(regex, opt = "") {
|
|
950
|
-
let source = typeof regex === "string" ? regex : regex.source;
|
|
951
|
-
const obj = {
|
|
952
|
-
replace: (name, val) => {
|
|
953
|
-
let valSource = typeof val === "string" ? val : val.source;
|
|
954
|
-
valSource = valSource.replace(other.caret, "$1");
|
|
955
|
-
source = source.replace(name, valSource);
|
|
956
|
-
return obj;
|
|
957
|
-
},
|
|
958
|
-
getRegex: () => {
|
|
959
|
-
return new RegExp(source, opt);
|
|
960
|
-
}
|
|
961
|
-
};
|
|
962
|
-
return obj;
|
|
963
|
-
}
|
|
964
|
-
var other = {
|
|
965
|
-
codeRemoveIndent: /^(?: {1,4}| {0,3}\t)/gm,
|
|
966
|
-
outputLinkReplace: /\\([\[\]])/g,
|
|
967
|
-
indentCodeCompensation: /^(\s+)(?:```)/,
|
|
968
|
-
beginningSpace: /^\s+/,
|
|
969
|
-
endingHash: /#$/,
|
|
970
|
-
startingSpaceChar: /^ /,
|
|
971
|
-
endingSpaceChar: / $/,
|
|
972
|
-
nonSpaceChar: /[^ ]/,
|
|
973
|
-
newLineCharGlobal: /\n/g,
|
|
974
|
-
tabCharGlobal: /\t/g,
|
|
975
|
-
multipleSpaceGlobal: /\s+/g,
|
|
976
|
-
blankLine: /^[ \t]*$/,
|
|
977
|
-
doubleBlankLine: /\n[ \t]*\n[ \t]*$/,
|
|
978
|
-
blockquoteStart: /^ {0,3}>/,
|
|
979
|
-
blockquoteSetextReplace: /\n {0,3}((?:=+|-+) *)(?=\n|$)/g,
|
|
980
|
-
blockquoteSetextReplace2: /^ {0,3}>[ \t]?/gm,
|
|
981
|
-
listReplaceTabs: /^\t+/,
|
|
982
|
-
listReplaceNesting: /^ {1,4}(?=( {4})*[^ ])/g,
|
|
983
|
-
listIsTask: /^\[[ xX]\] /,
|
|
984
|
-
listReplaceTask: /^\[[ xX]\] +/,
|
|
985
|
-
anyLine: /\n.*\n/,
|
|
986
|
-
hrefBrackets: /^<(.*)>$/,
|
|
987
|
-
tableDelimiter: /[:|]/,
|
|
988
|
-
tableAlignChars: /^\||\| *$/g,
|
|
989
|
-
tableRowBlankLine: /\n[ \t]*$/,
|
|
990
|
-
tableAlignRight: /^ *-+: *$/,
|
|
991
|
-
tableAlignCenter: /^ *:-+: *$/,
|
|
992
|
-
tableAlignLeft: /^ *:-+ *$/,
|
|
993
|
-
startATag: /^<a /i,
|
|
994
|
-
endATag: /^<\/a>/i,
|
|
995
|
-
startPreScriptTag: /^<(pre|code|kbd|script)(\s|>)/i,
|
|
996
|
-
endPreScriptTag: /^<\/(pre|code|kbd|script)(\s|>)/i,
|
|
997
|
-
startAngleBracket: /^</,
|
|
998
|
-
endAngleBracket: />$/,
|
|
999
|
-
pedanticHrefTitle: /^([^'"]*[^\s])\s+(['"])(.*)\2/,
|
|
1000
|
-
unicodeAlphaNumeric: /[\p{L}\p{N}]/u,
|
|
1001
|
-
escapeTest: /[&<>"']/,
|
|
1002
|
-
escapeReplace: /[&<>"']/g,
|
|
1003
|
-
escapeTestNoEncode: /[<>"']|&(?!(#\d{1,7}|#[Xx][a-fA-F0-9]{1,6}|\w+);)/,
|
|
1004
|
-
escapeReplaceNoEncode: /[<>"']|&(?!(#\d{1,7}|#[Xx][a-fA-F0-9]{1,6}|\w+);)/g,
|
|
1005
|
-
unescapeTest: /&(#(?:\d+)|(?:#x[0-9A-Fa-f]+)|(?:\w+));?/ig,
|
|
1006
|
-
caret: /(^|[^\[])\^/g,
|
|
1007
|
-
percentDecode: /%25/g,
|
|
1008
|
-
findPipe: /\|/g,
|
|
1009
|
-
splitPipe: / \|/,
|
|
1010
|
-
slashPipe: /\\\|/g,
|
|
1011
|
-
carriageReturn: /\r\n|\r/g,
|
|
1012
|
-
spaceLine: /^ +$/gm,
|
|
1013
|
-
notSpaceStart: /^\S*/,
|
|
1014
|
-
endingNewline: /\n$/,
|
|
1015
|
-
listItemRegex: (bull) => new RegExp(`^( {0,3}${bull})((?:[ ][^\\n]*)?(?:\\n|$))`),
|
|
1016
|
-
nextBulletRegex: (indent) => new RegExp(`^ {0,${Math.min(3, indent - 1)}}(?:[*+-]|\\d{1,9}[.)])((?:[ ][^\\n]*)?(?:\\n|$))`),
|
|
1017
|
-
hrRegex: (indent) => new RegExp(`^ {0,${Math.min(3, indent - 1)}}((?:- *){3,}|(?:_ *){3,}|(?:\\* *){3,})(?:\\n+|$)`),
|
|
1018
|
-
fencesBeginRegex: (indent) => new RegExp(`^ {0,${Math.min(3, indent - 1)}}(?:\`\`\`|~~~)`),
|
|
1019
|
-
headingBeginRegex: (indent) => new RegExp(`^ {0,${Math.min(3, indent - 1)}}#`),
|
|
1020
|
-
htmlBeginRegex: (indent) => new RegExp(`^ {0,${Math.min(3, indent - 1)}}<(?:[a-z].*>|!--)`, "i")
|
|
1021
|
-
};
|
|
1022
|
-
var newline = /^(?:[ \t]*(?:\n|$))+/;
|
|
1023
|
-
var blockCode = /^((?: {4}| {0,3}\t)[^\n]+(?:\n(?:[ \t]*(?:\n|$))*)?)+/;
|
|
1024
|
-
var fences = /^ {0,3}(`{3,}(?=[^`\n]*(?:\n|$))|~{3,})([^\n]*)(?:\n|$)(?:|([\s\S]*?)(?:\n|$))(?: {0,3}\1[~`]* *(?=\n|$)|$)/;
|
|
1025
|
-
var hr = /^ {0,3}((?:-[\t ]*){3,}|(?:_[ \t]*){3,}|(?:\*[ \t]*){3,})(?:\n+|$)/;
|
|
1026
|
-
var heading = /^ {0,3}(#{1,6})(?=\s|$)(.*)(?:\n+|$)/;
|
|
1027
|
-
var bullet = /(?:[*+-]|\d{1,9}[.)])/;
|
|
1028
|
-
var lheadingCore = /^(?!bull |blockCode|fences|blockquote|heading|html|table)((?:.|\n(?!\s*?\n|bull |blockCode|fences|blockquote|heading|html|table))+?)\n {0,3}(=+|-+) *(?:\n+|$)/;
|
|
1029
|
-
var lheading = edit(lheadingCore).replace(/bull/g, bullet).replace(/blockCode/g, /(?: {4}| {0,3}\t)/).replace(/fences/g, / {0,3}(?:`{3,}|~{3,})/).replace(/blockquote/g, / {0,3}>/).replace(/heading/g, / {0,3}#{1,6}/).replace(/html/g, / {0,3}<[^\n>]+>\n/).replace(/\|table/g, "").getRegex();
|
|
1030
|
-
var lheadingGfm = edit(lheadingCore).replace(/bull/g, bullet).replace(/blockCode/g, /(?: {4}| {0,3}\t)/).replace(/fences/g, / {0,3}(?:`{3,}|~{3,})/).replace(/blockquote/g, / {0,3}>/).replace(/heading/g, / {0,3}#{1,6}/).replace(/html/g, / {0,3}<[^\n>]+>\n/).replace(/table/g, / {0,3}\|?(?:[:\- ]*\|)+[\:\- ]*\n/).getRegex();
|
|
1031
|
-
var _paragraph = /^([^\n]+(?:\n(?!hr|heading|lheading|blockquote|fences|list|html|table| +\n)[^\n]+)*)/;
|
|
1032
|
-
var blockText = /^[^\n]+/;
|
|
1033
|
-
var _blockLabel = /(?!\s*\])(?:\\.|[^\[\]\\])+/;
|
|
1034
|
-
var def = edit(/^ {0,3}\[(label)\]: *(?:\n[ \t]*)?([^<\s][^\s]*|<.*?>)(?:(?: +(?:\n[ \t]*)?| *\n[ \t]*)(title))? *(?:\n+|$)/).replace("label", _blockLabel).replace("title", /(?:"(?:\\"?|[^"\\])*"|'[^'\n]*(?:\n[^'\n]+)*\n?'|\([^()]*\))/).getRegex();
|
|
1035
|
-
var list = edit(/^( {0,3}bull)([ \t][^\n]+?)?(?:\n|$)/).replace(/bull/g, bullet).getRegex();
|
|
1036
|
-
var _tag = "address|article|aside|base|basefont|blockquote|body|caption|center|col|colgroup|dd|details|dialog|dir|div|dl|dt|fieldset|figcaption|figure|footer|form|frame|frameset|h[1-6]|head|header|hr|html|iframe|legend|li|link|main|menu|menuitem|meta|nav|noframes|ol|optgroup|option|p|param|search|section|summary|table|tbody|td|tfoot|th|thead|title|tr|track|ul";
|
|
1037
|
-
var _comment = /<!--(?:-?>|[\s\S]*?(?:-->|$))/;
|
|
1038
|
-
var html = edit(
|
|
1039
|
-
"^ {0,3}(?:<(script|pre|style|textarea)[\\s>][\\s\\S]*?(?:</\\1>[^\\n]*\\n+|$)|comment[^\\n]*(\\n+|$)|<\\?[\\s\\S]*?(?:\\?>\\n*|$)|<![A-Z][\\s\\S]*?(?:>\\n*|$)|<!\\[CDATA\\[[\\s\\S]*?(?:\\]\\]>\\n*|$)|</?(tag)(?: +|\\n|/?>)[\\s\\S]*?(?:(?:\\n[ ]*)+\\n|$)|<(?!script|pre|style|textarea)([a-z][\\w-]*)(?:attribute)*? */?>(?=[ \\t]*(?:\\n|$))[\\s\\S]*?(?:(?:\\n[ ]*)+\\n|$)|</(?!script|pre|style|textarea)[a-z][\\w-]*\\s*>(?=[ \\t]*(?:\\n|$))[\\s\\S]*?(?:(?:\\n[ ]*)+\\n|$))",
|
|
1040
|
-
"i"
|
|
1041
|
-
).replace("comment", _comment).replace("tag", _tag).replace("attribute", / +[a-zA-Z:_][\w.:-]*(?: *= *"[^"\n]*"| *= *'[^'\n]*'| *= *[^\s"'=<>`]+)?/).getRegex();
|
|
1042
|
-
var paragraph = edit(_paragraph).replace("hr", hr).replace("heading", " {0,3}#{1,6}(?:\\s|$)").replace("|lheading", "").replace("|table", "").replace("blockquote", " {0,3}>").replace("fences", " {0,3}(?:`{3,}(?=[^`\\n]*\\n)|~{3,})[^\\n]*\\n").replace("list", " {0,3}(?:[*+-]|1[.)]) ").replace("html", "</?(?:tag)(?: +|\\n|/?>)|<(?:script|pre|style|textarea|!--)").replace("tag", _tag).getRegex();
|
|
1043
|
-
var blockquote = edit(/^( {0,3}> ?(paragraph|[^\n]*)(?:\n|$))+/).replace("paragraph", paragraph).getRegex();
|
|
1044
|
-
var blockNormal = {
|
|
1045
|
-
blockquote,
|
|
1046
|
-
code: blockCode,
|
|
1047
|
-
def,
|
|
1048
|
-
fences,
|
|
1049
|
-
heading,
|
|
1050
|
-
hr,
|
|
1051
|
-
html,
|
|
1052
|
-
lheading,
|
|
1053
|
-
list,
|
|
1054
|
-
newline,
|
|
1055
|
-
paragraph,
|
|
1056
|
-
table: noopTest,
|
|
1057
|
-
text: blockText
|
|
1058
|
-
};
|
|
1059
|
-
var gfmTable = edit(
|
|
1060
|
-
"^ *([^\\n ].*)\\n {0,3}((?:\\| *)?:?-+:? *(?:\\| *:?-+:? *)*(?:\\| *)?)(?:\\n((?:(?! *\\n|hr|heading|blockquote|code|fences|list|html).*(?:\\n|$))*)\\n*|$)"
|
|
1061
|
-
).replace("hr", hr).replace("heading", " {0,3}#{1,6}(?:\\s|$)").replace("blockquote", " {0,3}>").replace("code", "(?: {4}| {0,3} )[^\\n]").replace("fences", " {0,3}(?:`{3,}(?=[^`\\n]*\\n)|~{3,})[^\\n]*\\n").replace("list", " {0,3}(?:[*+-]|1[.)]) ").replace("html", "</?(?:tag)(?: +|\\n|/?>)|<(?:script|pre|style|textarea|!--)").replace("tag", _tag).getRegex();
|
|
1062
|
-
var blockGfm = {
|
|
1063
|
-
...blockNormal,
|
|
1064
|
-
lheading: lheadingGfm,
|
|
1065
|
-
table: gfmTable,
|
|
1066
|
-
paragraph: edit(_paragraph).replace("hr", hr).replace("heading", " {0,3}#{1,6}(?:\\s|$)").replace("|lheading", "").replace("table", gfmTable).replace("blockquote", " {0,3}>").replace("fences", " {0,3}(?:`{3,}(?=[^`\\n]*\\n)|~{3,})[^\\n]*\\n").replace("list", " {0,3}(?:[*+-]|1[.)]) ").replace("html", "</?(?:tag)(?: +|\\n|/?>)|<(?:script|pre|style|textarea|!--)").replace("tag", _tag).getRegex()
|
|
1067
|
-
};
|
|
1068
|
-
var blockPedantic = {
|
|
1069
|
-
...blockNormal,
|
|
1070
|
-
html: edit(
|
|
1071
|
-
`^ *(?:comment *(?:\\n|\\s*$)|<(tag)[\\s\\S]+?</\\1> *(?:\\n{2,}|\\s*$)|<tag(?:"[^"]*"|'[^']*'|\\s[^'"/>\\s]*)*?/?> *(?:\\n{2,}|\\s*$))`
|
|
1072
|
-
).replace("comment", _comment).replace(/tag/g, "(?!(?:a|em|strong|small|s|cite|q|dfn|abbr|data|time|code|var|samp|kbd|sub|sup|i|b|u|mark|ruby|rt|rp|bdi|bdo|span|br|wbr|ins|del|img)\\b)\\w+(?!:|[^\\w\\s@]*@)\\b").getRegex(),
|
|
1073
|
-
def: /^ *\[([^\]]+)\]: *<?([^\s>]+)>?(?: +(["(][^\n]+[")]))? *(?:\n+|$)/,
|
|
1074
|
-
heading: /^(#{1,6})(.*)(?:\n+|$)/,
|
|
1075
|
-
fences: noopTest,
|
|
1076
|
-
// fences not supported
|
|
1077
|
-
lheading: /^(.+?)\n {0,3}(=+|-+) *(?:\n+|$)/,
|
|
1078
|
-
paragraph: edit(_paragraph).replace("hr", hr).replace("heading", " *#{1,6} *[^\n]").replace("lheading", lheading).replace("|table", "").replace("blockquote", " {0,3}>").replace("|fences", "").replace("|list", "").replace("|html", "").replace("|tag", "").getRegex()
|
|
1079
|
-
};
|
|
1080
|
-
var escape = /^\\([!"#$%&'()*+,\-./:;<=>?@\[\]\\^_`{|}~])/;
|
|
1081
|
-
var inlineCode = /^(`+)([^`]|[^`][\s\S]*?[^`])\1(?!`)/;
|
|
1082
|
-
var br = /^( {2,}|\\)\n(?!\s*$)/;
|
|
1083
|
-
var inlineText = /^(`+|[^`])(?:(?= {2,}\n)|[\s\S]*?(?:(?=[\\<!\[`*_]|\b_|$)|[^ ](?= {2,}\n)))/;
|
|
1084
|
-
var _punctuation = /[\p{P}\p{S}]/u;
|
|
1085
|
-
var _punctuationOrSpace = /[\s\p{P}\p{S}]/u;
|
|
1086
|
-
var _notPunctuationOrSpace = /[^\s\p{P}\p{S}]/u;
|
|
1087
|
-
var punctuation = edit(/^((?![*_])punctSpace)/, "u").replace(/punctSpace/g, _punctuationOrSpace).getRegex();
|
|
1088
|
-
var _punctuationGfmStrongEm = /(?!~)[\p{P}\p{S}]/u;
|
|
1089
|
-
var _punctuationOrSpaceGfmStrongEm = /(?!~)[\s\p{P}\p{S}]/u;
|
|
1090
|
-
var _notPunctuationOrSpaceGfmStrongEm = /(?:[^\s\p{P}\p{S}]|~)/u;
|
|
1091
|
-
var blockSkip = /\[[^[\]]*?\]\((?:\\.|[^\\\(\)]|\((?:\\.|[^\\\(\)])*\))*\)|`[^`]*?`|<[^<>]*?>/g;
|
|
1092
|
-
var emStrongLDelimCore = /^(?:\*+(?:((?!\*)punct)|[^\s*]))|^_+(?:((?!_)punct)|([^\s_]))/;
|
|
1093
|
-
var emStrongLDelim = edit(emStrongLDelimCore, "u").replace(/punct/g, _punctuation).getRegex();
|
|
1094
|
-
var emStrongLDelimGfm = edit(emStrongLDelimCore, "u").replace(/punct/g, _punctuationGfmStrongEm).getRegex();
|
|
1095
|
-
var emStrongRDelimAstCore = "^[^_*]*?__[^_*]*?\\*[^_*]*?(?=__)|[^*]+(?=[^*])|(?!\\*)punct(\\*+)(?=[\\s]|$)|notPunctSpace(\\*+)(?!\\*)(?=punctSpace|$)|(?!\\*)punctSpace(\\*+)(?=notPunctSpace)|[\\s](\\*+)(?!\\*)(?=punct)|(?!\\*)punct(\\*+)(?!\\*)(?=punct)|notPunctSpace(\\*+)(?=notPunctSpace)";
|
|
1096
|
-
var emStrongRDelimAst = edit(emStrongRDelimAstCore, "gu").replace(/notPunctSpace/g, _notPunctuationOrSpace).replace(/punctSpace/g, _punctuationOrSpace).replace(/punct/g, _punctuation).getRegex();
|
|
1097
|
-
var emStrongRDelimAstGfm = edit(emStrongRDelimAstCore, "gu").replace(/notPunctSpace/g, _notPunctuationOrSpaceGfmStrongEm).replace(/punctSpace/g, _punctuationOrSpaceGfmStrongEm).replace(/punct/g, _punctuationGfmStrongEm).getRegex();
|
|
1098
|
-
var emStrongRDelimUnd = edit(
|
|
1099
|
-
"^[^_*]*?\\*\\*[^_*]*?_[^_*]*?(?=\\*\\*)|[^_]+(?=[^_])|(?!_)punct(_+)(?=[\\s]|$)|notPunctSpace(_+)(?!_)(?=punctSpace|$)|(?!_)punctSpace(_+)(?=notPunctSpace)|[\\s](_+)(?!_)(?=punct)|(?!_)punct(_+)(?!_)(?=punct)",
|
|
1100
|
-
"gu"
|
|
1101
|
-
).replace(/notPunctSpace/g, _notPunctuationOrSpace).replace(/punctSpace/g, _punctuationOrSpace).replace(/punct/g, _punctuation).getRegex();
|
|
1102
|
-
var anyPunctuation = edit(/\\(punct)/, "gu").replace(/punct/g, _punctuation).getRegex();
|
|
1103
|
-
var autolink = edit(/^<(scheme:[^\s\x00-\x1f<>]*|email)>/).replace("scheme", /[a-zA-Z][a-zA-Z0-9+.-]{1,31}/).replace("email", /[a-zA-Z0-9.!#$%&'*+/=?^_`{|}~-]+(@)[a-zA-Z0-9](?:[a-zA-Z0-9-]{0,61}[a-zA-Z0-9])?(?:\.[a-zA-Z0-9](?:[a-zA-Z0-9-]{0,61}[a-zA-Z0-9])?)+(?![-_])/).getRegex();
|
|
1104
|
-
var _inlineComment = edit(_comment).replace("(?:-->|$)", "-->").getRegex();
|
|
1105
|
-
var tag = edit(
|
|
1106
|
-
"^comment|^</[a-zA-Z][\\w:-]*\\s*>|^<[a-zA-Z][\\w-]*(?:attribute)*?\\s*/?>|^<\\?[\\s\\S]*?\\?>|^<![a-zA-Z]+\\s[\\s\\S]*?>|^<!\\[CDATA\\[[\\s\\S]*?\\]\\]>"
|
|
1107
|
-
).replace("comment", _inlineComment).replace("attribute", /\s+[a-zA-Z:_][\w.:-]*(?:\s*=\s*"[^"]*"|\s*=\s*'[^']*'|\s*=\s*[^\s"'=<>`]+)?/).getRegex();
|
|
1108
|
-
var _inlineLabel = /(?:\[(?:\\.|[^\[\]\\])*\]|\\.|`[^`]*`|[^\[\]\\`])*?/;
|
|
1109
|
-
var link = edit(/^!?\[(label)\]\(\s*(href)(?:(?:[ \t]*(?:\n[ \t]*)?)(title))?\s*\)/).replace("label", _inlineLabel).replace("href", /<(?:\\.|[^\n<>\\])+>|[^ \t\n\x00-\x1f]*/).replace("title", /"(?:\\"?|[^"\\])*"|'(?:\\'?|[^'\\])*'|\((?:\\\)?|[^)\\])*\)/).getRegex();
|
|
1110
|
-
var reflink = edit(/^!?\[(label)\]\[(ref)\]/).replace("label", _inlineLabel).replace("ref", _blockLabel).getRegex();
|
|
1111
|
-
var nolink = edit(/^!?\[(ref)\](?:\[\])?/).replace("ref", _blockLabel).getRegex();
|
|
1112
|
-
var reflinkSearch = edit("reflink|nolink(?!\\()", "g").replace("reflink", reflink).replace("nolink", nolink).getRegex();
|
|
1113
|
-
var inlineNormal = {
|
|
1114
|
-
_backpedal: noopTest,
|
|
1115
|
-
// only used for GFM url
|
|
1116
|
-
anyPunctuation,
|
|
1117
|
-
autolink,
|
|
1118
|
-
blockSkip,
|
|
1119
|
-
br,
|
|
1120
|
-
code: inlineCode,
|
|
1121
|
-
del: noopTest,
|
|
1122
|
-
emStrongLDelim,
|
|
1123
|
-
emStrongRDelimAst,
|
|
1124
|
-
emStrongRDelimUnd,
|
|
1125
|
-
escape,
|
|
1126
|
-
link,
|
|
1127
|
-
nolink,
|
|
1128
|
-
punctuation,
|
|
1129
|
-
reflink,
|
|
1130
|
-
reflinkSearch,
|
|
1131
|
-
tag,
|
|
1132
|
-
text: inlineText,
|
|
1133
|
-
url: noopTest
|
|
1134
|
-
};
|
|
1135
|
-
var inlinePedantic = {
|
|
1136
|
-
...inlineNormal,
|
|
1137
|
-
link: edit(/^!?\[(label)\]\((.*?)\)/).replace("label", _inlineLabel).getRegex(),
|
|
1138
|
-
reflink: edit(/^!?\[(label)\]\s*\[([^\]]*)\]/).replace("label", _inlineLabel).getRegex()
|
|
1139
|
-
};
|
|
1140
|
-
var inlineGfm = {
|
|
1141
|
-
...inlineNormal,
|
|
1142
|
-
emStrongRDelimAst: emStrongRDelimAstGfm,
|
|
1143
|
-
emStrongLDelim: emStrongLDelimGfm,
|
|
1144
|
-
url: edit(/^((?:ftp|https?):\/\/|www\.)(?:[a-zA-Z0-9\-]+\.?)+[^\s<]*|^email/, "i").replace("email", /[A-Za-z0-9._+-]+(@)[a-zA-Z0-9-_]+(?:\.[a-zA-Z0-9-_]*[a-zA-Z0-9])+(?![-_])/).getRegex(),
|
|
1145
|
-
_backpedal: /(?:[^?!.,:;*_'"~()&]+|\([^)]*\)|&(?![a-zA-Z0-9]+;$)|[?!.,:;*_'"~)]+(?!$))+/,
|
|
1146
|
-
del: /^(~~?)(?=[^\s~])((?:\\.|[^\\])*?(?:\\.|[^\s~\\]))\1(?=[^~]|$)/,
|
|
1147
|
-
text: /^([`~]+|[^`~])(?:(?= {2,}\n)|(?=[a-zA-Z0-9.!#$%&'*+\/=?_`{\|}~-]+@)|[\s\S]*?(?:(?=[\\<!\[`*~_]|\b_|https?:\/\/|ftp:\/\/|www\.|$)|[^ ](?= {2,}\n)|[^a-zA-Z0-9.!#$%&'*+\/=?_`{\|}~-](?=[a-zA-Z0-9.!#$%&'*+\/=?_`{\|}~-]+@)))/
|
|
1148
|
-
};
|
|
1149
|
-
var inlineBreaks = {
|
|
1150
|
-
...inlineGfm,
|
|
1151
|
-
br: edit(br).replace("{2,}", "*").getRegex(),
|
|
1152
|
-
text: edit(inlineGfm.text).replace("\\b_", "\\b_| {2,}\\n").replace(/\{2,\}/g, "*").getRegex()
|
|
1153
|
-
};
|
|
1154
|
-
var block = {
|
|
1155
|
-
normal: blockNormal,
|
|
1156
|
-
gfm: blockGfm,
|
|
1157
|
-
pedantic: blockPedantic
|
|
1158
|
-
};
|
|
1159
|
-
var inline = {
|
|
1160
|
-
normal: inlineNormal,
|
|
1161
|
-
gfm: inlineGfm,
|
|
1162
|
-
breaks: inlineBreaks,
|
|
1163
|
-
pedantic: inlinePedantic
|
|
1164
|
-
};
|
|
1165
|
-
var escapeReplacements = {
|
|
1166
|
-
"&": "&",
|
|
1167
|
-
"<": "<",
|
|
1168
|
-
">": ">",
|
|
1169
|
-
'"': """,
|
|
1170
|
-
"'": "'"
|
|
1171
|
-
};
|
|
1172
|
-
var getEscapeReplacement = (ch) => escapeReplacements[ch];
|
|
1173
|
-
function escape2(html2, encode) {
|
|
1174
|
-
if (encode) {
|
|
1175
|
-
if (other.escapeTest.test(html2)) {
|
|
1176
|
-
return html2.replace(other.escapeReplace, getEscapeReplacement);
|
|
1177
|
-
}
|
|
1178
|
-
} else {
|
|
1179
|
-
if (other.escapeTestNoEncode.test(html2)) {
|
|
1180
|
-
return html2.replace(other.escapeReplaceNoEncode, getEscapeReplacement);
|
|
1181
|
-
}
|
|
1182
|
-
}
|
|
1183
|
-
return html2;
|
|
1184
|
-
}
|
|
1185
|
-
function cleanUrl(href) {
|
|
1186
|
-
try {
|
|
1187
|
-
href = encodeURI(href).replace(other.percentDecode, "%");
|
|
1188
|
-
} catch {
|
|
1189
|
-
return null;
|
|
1190
|
-
}
|
|
1191
|
-
return href;
|
|
1192
|
-
}
|
|
1193
|
-
function splitCells(tableRow, count) {
|
|
1194
|
-
const row = tableRow.replace(other.findPipe, (match, offset, str) => {
|
|
1195
|
-
let escaped = false;
|
|
1196
|
-
let curr = offset;
|
|
1197
|
-
while (--curr >= 0 && str[curr] === "\\") escaped = !escaped;
|
|
1198
|
-
if (escaped) {
|
|
1199
|
-
return "|";
|
|
1200
|
-
} else {
|
|
1201
|
-
return " |";
|
|
1202
|
-
}
|
|
1203
|
-
}), cells = row.split(other.splitPipe);
|
|
1204
|
-
let i = 0;
|
|
1205
|
-
if (!cells[0].trim()) {
|
|
1206
|
-
cells.shift();
|
|
1207
|
-
}
|
|
1208
|
-
if (cells.length > 0 && !cells.at(-1)?.trim()) {
|
|
1209
|
-
cells.pop();
|
|
1210
|
-
}
|
|
1211
|
-
if (count) {
|
|
1212
|
-
if (cells.length > count) {
|
|
1213
|
-
cells.splice(count);
|
|
1214
|
-
} else {
|
|
1215
|
-
while (cells.length < count) cells.push("");
|
|
1216
|
-
}
|
|
1217
|
-
}
|
|
1218
|
-
for (; i < cells.length; i++) {
|
|
1219
|
-
cells[i] = cells[i].trim().replace(other.slashPipe, "|");
|
|
1220
|
-
}
|
|
1221
|
-
return cells;
|
|
1222
|
-
}
|
|
1223
|
-
function rtrim(str, c, invert) {
|
|
1224
|
-
const l = str.length;
|
|
1225
|
-
if (l === 0) {
|
|
1226
|
-
return "";
|
|
1227
|
-
}
|
|
1228
|
-
let suffLen = 0;
|
|
1229
|
-
while (suffLen < l) {
|
|
1230
|
-
const currChar = str.charAt(l - suffLen - 1);
|
|
1231
|
-
if (currChar === c && !invert) {
|
|
1232
|
-
suffLen++;
|
|
1233
|
-
} else if (currChar !== c && invert) {
|
|
1234
|
-
suffLen++;
|
|
1235
|
-
} else {
|
|
1236
|
-
break;
|
|
1237
|
-
}
|
|
1238
|
-
}
|
|
1239
|
-
return str.slice(0, l - suffLen);
|
|
1240
|
-
}
|
|
1241
|
-
function findClosingBracket(str, b) {
|
|
1242
|
-
if (str.indexOf(b[1]) === -1) {
|
|
1243
|
-
return -1;
|
|
1244
|
-
}
|
|
1245
|
-
let level = 0;
|
|
1246
|
-
for (let i = 0; i < str.length; i++) {
|
|
1247
|
-
if (str[i] === "\\") {
|
|
1248
|
-
i++;
|
|
1249
|
-
} else if (str[i] === b[0]) {
|
|
1250
|
-
level++;
|
|
1251
|
-
} else if (str[i] === b[1]) {
|
|
1252
|
-
level--;
|
|
1253
|
-
if (level < 0) {
|
|
1254
|
-
return i;
|
|
1255
|
-
}
|
|
1256
|
-
}
|
|
1257
|
-
}
|
|
1258
|
-
if (level > 0) {
|
|
1259
|
-
return -2;
|
|
1260
|
-
}
|
|
1261
|
-
return -1;
|
|
1262
|
-
}
|
|
1263
|
-
function outputLink(cap, link2, raw, lexer2, rules) {
|
|
1264
|
-
const href = link2.href;
|
|
1265
|
-
const title = link2.title || null;
|
|
1266
|
-
const text = cap[1].replace(rules.other.outputLinkReplace, "$1");
|
|
1267
|
-
lexer2.state.inLink = true;
|
|
1268
|
-
const token = {
|
|
1269
|
-
type: cap[0].charAt(0) === "!" ? "image" : "link",
|
|
1270
|
-
raw,
|
|
1271
|
-
href,
|
|
1272
|
-
title,
|
|
1273
|
-
text,
|
|
1274
|
-
tokens: lexer2.inlineTokens(text)
|
|
1275
|
-
};
|
|
1276
|
-
lexer2.state.inLink = false;
|
|
1277
|
-
return token;
|
|
1278
|
-
}
|
|
1279
|
-
function indentCodeCompensation(raw, text, rules) {
|
|
1280
|
-
const matchIndentToCode = raw.match(rules.other.indentCodeCompensation);
|
|
1281
|
-
if (matchIndentToCode === null) {
|
|
1282
|
-
return text;
|
|
1283
|
-
}
|
|
1284
|
-
const indentToCode = matchIndentToCode[1];
|
|
1285
|
-
return text.split("\n").map((node) => {
|
|
1286
|
-
const matchIndentInNode = node.match(rules.other.beginningSpace);
|
|
1287
|
-
if (matchIndentInNode === null) {
|
|
1288
|
-
return node;
|
|
1289
|
-
}
|
|
1290
|
-
const [indentInNode] = matchIndentInNode;
|
|
1291
|
-
if (indentInNode.length >= indentToCode.length) {
|
|
1292
|
-
return node.slice(indentToCode.length);
|
|
1293
|
-
}
|
|
1294
|
-
return node;
|
|
1295
|
-
}).join("\n");
|
|
1296
|
-
}
|
|
1297
|
-
var _Tokenizer = class {
|
|
1298
|
-
options;
|
|
1299
|
-
rules;
|
|
1300
|
-
// set by the lexer
|
|
1301
|
-
lexer;
|
|
1302
|
-
// set by the lexer
|
|
1303
|
-
constructor(options2) {
|
|
1304
|
-
this.options = options2 || _defaults;
|
|
1305
|
-
}
|
|
1306
|
-
space(src) {
|
|
1307
|
-
const cap = this.rules.block.newline.exec(src);
|
|
1308
|
-
if (cap && cap[0].length > 0) {
|
|
1309
|
-
return {
|
|
1310
|
-
type: "space",
|
|
1311
|
-
raw: cap[0]
|
|
1312
|
-
};
|
|
1313
|
-
}
|
|
1314
|
-
}
|
|
1315
|
-
code(src) {
|
|
1316
|
-
const cap = this.rules.block.code.exec(src);
|
|
1317
|
-
if (cap) {
|
|
1318
|
-
const text = cap[0].replace(this.rules.other.codeRemoveIndent, "");
|
|
1319
|
-
return {
|
|
1320
|
-
type: "code",
|
|
1321
|
-
raw: cap[0],
|
|
1322
|
-
codeBlockStyle: "indented",
|
|
1323
|
-
text: !this.options.pedantic ? rtrim(text, "\n") : text
|
|
1324
|
-
};
|
|
1325
|
-
}
|
|
1326
|
-
}
|
|
1327
|
-
fences(src) {
|
|
1328
|
-
const cap = this.rules.block.fences.exec(src);
|
|
1329
|
-
if (cap) {
|
|
1330
|
-
const raw = cap[0];
|
|
1331
|
-
const text = indentCodeCompensation(raw, cap[3] || "", this.rules);
|
|
1332
|
-
return {
|
|
1333
|
-
type: "code",
|
|
1334
|
-
raw,
|
|
1335
|
-
lang: cap[2] ? cap[2].trim().replace(this.rules.inline.anyPunctuation, "$1") : cap[2],
|
|
1336
|
-
text
|
|
1337
|
-
};
|
|
1338
|
-
}
|
|
1339
|
-
}
|
|
1340
|
-
heading(src) {
|
|
1341
|
-
const cap = this.rules.block.heading.exec(src);
|
|
1342
|
-
if (cap) {
|
|
1343
|
-
let text = cap[2].trim();
|
|
1344
|
-
if (this.rules.other.endingHash.test(text)) {
|
|
1345
|
-
const trimmed = rtrim(text, "#");
|
|
1346
|
-
if (this.options.pedantic) {
|
|
1347
|
-
text = trimmed.trim();
|
|
1348
|
-
} else if (!trimmed || this.rules.other.endingSpaceChar.test(trimmed)) {
|
|
1349
|
-
text = trimmed.trim();
|
|
1350
|
-
}
|
|
1351
|
-
}
|
|
1352
|
-
return {
|
|
1353
|
-
type: "heading",
|
|
1354
|
-
raw: cap[0],
|
|
1355
|
-
depth: cap[1].length,
|
|
1356
|
-
text,
|
|
1357
|
-
tokens: this.lexer.inline(text)
|
|
1358
|
-
};
|
|
1359
|
-
}
|
|
1360
|
-
}
|
|
1361
|
-
hr(src) {
|
|
1362
|
-
const cap = this.rules.block.hr.exec(src);
|
|
1363
|
-
if (cap) {
|
|
1364
|
-
return {
|
|
1365
|
-
type: "hr",
|
|
1366
|
-
raw: rtrim(cap[0], "\n")
|
|
1367
|
-
};
|
|
1368
|
-
}
|
|
1369
|
-
}
|
|
1370
|
-
blockquote(src) {
|
|
1371
|
-
const cap = this.rules.block.blockquote.exec(src);
|
|
1372
|
-
if (cap) {
|
|
1373
|
-
let lines = rtrim(cap[0], "\n").split("\n");
|
|
1374
|
-
let raw = "";
|
|
1375
|
-
let text = "";
|
|
1376
|
-
const tokens = [];
|
|
1377
|
-
while (lines.length > 0) {
|
|
1378
|
-
let inBlockquote = false;
|
|
1379
|
-
const currentLines = [];
|
|
1380
|
-
let i;
|
|
1381
|
-
for (i = 0; i < lines.length; i++) {
|
|
1382
|
-
if (this.rules.other.blockquoteStart.test(lines[i])) {
|
|
1383
|
-
currentLines.push(lines[i]);
|
|
1384
|
-
inBlockquote = true;
|
|
1385
|
-
} else if (!inBlockquote) {
|
|
1386
|
-
currentLines.push(lines[i]);
|
|
1387
|
-
} else {
|
|
1388
|
-
break;
|
|
1389
|
-
}
|
|
1390
|
-
}
|
|
1391
|
-
lines = lines.slice(i);
|
|
1392
|
-
const currentRaw = currentLines.join("\n");
|
|
1393
|
-
const currentText = currentRaw.replace(this.rules.other.blockquoteSetextReplace, "\n $1").replace(this.rules.other.blockquoteSetextReplace2, "");
|
|
1394
|
-
raw = raw ? `${raw}
|
|
1395
|
-
${currentRaw}` : currentRaw;
|
|
1396
|
-
text = text ? `${text}
|
|
1397
|
-
${currentText}` : currentText;
|
|
1398
|
-
const top = this.lexer.state.top;
|
|
1399
|
-
this.lexer.state.top = true;
|
|
1400
|
-
this.lexer.blockTokens(currentText, tokens, true);
|
|
1401
|
-
this.lexer.state.top = top;
|
|
1402
|
-
if (lines.length === 0) {
|
|
1403
|
-
break;
|
|
1404
|
-
}
|
|
1405
|
-
const lastToken = tokens.at(-1);
|
|
1406
|
-
if (lastToken?.type === "code") {
|
|
1407
|
-
break;
|
|
1408
|
-
} else if (lastToken?.type === "blockquote") {
|
|
1409
|
-
const oldToken = lastToken;
|
|
1410
|
-
const newText = oldToken.raw + "\n" + lines.join("\n");
|
|
1411
|
-
const newToken = this.blockquote(newText);
|
|
1412
|
-
tokens[tokens.length - 1] = newToken;
|
|
1413
|
-
raw = raw.substring(0, raw.length - oldToken.raw.length) + newToken.raw;
|
|
1414
|
-
text = text.substring(0, text.length - oldToken.text.length) + newToken.text;
|
|
1415
|
-
break;
|
|
1416
|
-
} else if (lastToken?.type === "list") {
|
|
1417
|
-
const oldToken = lastToken;
|
|
1418
|
-
const newText = oldToken.raw + "\n" + lines.join("\n");
|
|
1419
|
-
const newToken = this.list(newText);
|
|
1420
|
-
tokens[tokens.length - 1] = newToken;
|
|
1421
|
-
raw = raw.substring(0, raw.length - lastToken.raw.length) + newToken.raw;
|
|
1422
|
-
text = text.substring(0, text.length - oldToken.raw.length) + newToken.raw;
|
|
1423
|
-
lines = newText.substring(tokens.at(-1).raw.length).split("\n");
|
|
1424
|
-
continue;
|
|
1425
|
-
}
|
|
1426
|
-
}
|
|
1427
|
-
return {
|
|
1428
|
-
type: "blockquote",
|
|
1429
|
-
raw,
|
|
1430
|
-
tokens,
|
|
1431
|
-
text
|
|
1432
|
-
};
|
|
1433
|
-
}
|
|
1434
|
-
}
|
|
1435
|
-
list(src) {
|
|
1436
|
-
let cap = this.rules.block.list.exec(src);
|
|
1437
|
-
if (cap) {
|
|
1438
|
-
let bull = cap[1].trim();
|
|
1439
|
-
const isordered = bull.length > 1;
|
|
1440
|
-
const list2 = {
|
|
1441
|
-
type: "list",
|
|
1442
|
-
raw: "",
|
|
1443
|
-
ordered: isordered,
|
|
1444
|
-
start: isordered ? +bull.slice(0, -1) : "",
|
|
1445
|
-
loose: false,
|
|
1446
|
-
items: []
|
|
1447
|
-
};
|
|
1448
|
-
bull = isordered ? `\\d{1,9}\\${bull.slice(-1)}` : `\\${bull}`;
|
|
1449
|
-
if (this.options.pedantic) {
|
|
1450
|
-
bull = isordered ? bull : "[*+-]";
|
|
1451
|
-
}
|
|
1452
|
-
const itemRegex = this.rules.other.listItemRegex(bull);
|
|
1453
|
-
let endsWithBlankLine = false;
|
|
1454
|
-
while (src) {
|
|
1455
|
-
let endEarly = false;
|
|
1456
|
-
let raw = "";
|
|
1457
|
-
let itemContents = "";
|
|
1458
|
-
if (!(cap = itemRegex.exec(src))) {
|
|
1459
|
-
break;
|
|
1460
|
-
}
|
|
1461
|
-
if (this.rules.block.hr.test(src)) {
|
|
1462
|
-
break;
|
|
1463
|
-
}
|
|
1464
|
-
raw = cap[0];
|
|
1465
|
-
src = src.substring(raw.length);
|
|
1466
|
-
let line = cap[2].split("\n", 1)[0].replace(this.rules.other.listReplaceTabs, (t) => " ".repeat(3 * t.length));
|
|
1467
|
-
let nextLine = src.split("\n", 1)[0];
|
|
1468
|
-
let blankLine = !line.trim();
|
|
1469
|
-
let indent = 0;
|
|
1470
|
-
if (this.options.pedantic) {
|
|
1471
|
-
indent = 2;
|
|
1472
|
-
itemContents = line.trimStart();
|
|
1473
|
-
} else if (blankLine) {
|
|
1474
|
-
indent = cap[1].length + 1;
|
|
1475
|
-
} else {
|
|
1476
|
-
indent = cap[2].search(this.rules.other.nonSpaceChar);
|
|
1477
|
-
indent = indent > 4 ? 1 : indent;
|
|
1478
|
-
itemContents = line.slice(indent);
|
|
1479
|
-
indent += cap[1].length;
|
|
1480
|
-
}
|
|
1481
|
-
if (blankLine && this.rules.other.blankLine.test(nextLine)) {
|
|
1482
|
-
raw += nextLine + "\n";
|
|
1483
|
-
src = src.substring(nextLine.length + 1);
|
|
1484
|
-
endEarly = true;
|
|
1485
|
-
}
|
|
1486
|
-
if (!endEarly) {
|
|
1487
|
-
const nextBulletRegex = this.rules.other.nextBulletRegex(indent);
|
|
1488
|
-
const hrRegex = this.rules.other.hrRegex(indent);
|
|
1489
|
-
const fencesBeginRegex = this.rules.other.fencesBeginRegex(indent);
|
|
1490
|
-
const headingBeginRegex = this.rules.other.headingBeginRegex(indent);
|
|
1491
|
-
const htmlBeginRegex = this.rules.other.htmlBeginRegex(indent);
|
|
1492
|
-
while (src) {
|
|
1493
|
-
const rawLine = src.split("\n", 1)[0];
|
|
1494
|
-
let nextLineWithoutTabs;
|
|
1495
|
-
nextLine = rawLine;
|
|
1496
|
-
if (this.options.pedantic) {
|
|
1497
|
-
nextLine = nextLine.replace(this.rules.other.listReplaceNesting, " ");
|
|
1498
|
-
nextLineWithoutTabs = nextLine;
|
|
1499
|
-
} else {
|
|
1500
|
-
nextLineWithoutTabs = nextLine.replace(this.rules.other.tabCharGlobal, " ");
|
|
1501
|
-
}
|
|
1502
|
-
if (fencesBeginRegex.test(nextLine)) {
|
|
1503
|
-
break;
|
|
1504
|
-
}
|
|
1505
|
-
if (headingBeginRegex.test(nextLine)) {
|
|
1506
|
-
break;
|
|
1507
|
-
}
|
|
1508
|
-
if (htmlBeginRegex.test(nextLine)) {
|
|
1509
|
-
break;
|
|
1510
|
-
}
|
|
1511
|
-
if (nextBulletRegex.test(nextLine)) {
|
|
1512
|
-
break;
|
|
1513
|
-
}
|
|
1514
|
-
if (hrRegex.test(nextLine)) {
|
|
1515
|
-
break;
|
|
1516
|
-
}
|
|
1517
|
-
if (nextLineWithoutTabs.search(this.rules.other.nonSpaceChar) >= indent || !nextLine.trim()) {
|
|
1518
|
-
itemContents += "\n" + nextLineWithoutTabs.slice(indent);
|
|
1519
|
-
} else {
|
|
1520
|
-
if (blankLine) {
|
|
1521
|
-
break;
|
|
1522
|
-
}
|
|
1523
|
-
if (line.replace(this.rules.other.tabCharGlobal, " ").search(this.rules.other.nonSpaceChar) >= 4) {
|
|
1524
|
-
break;
|
|
1525
|
-
}
|
|
1526
|
-
if (fencesBeginRegex.test(line)) {
|
|
1527
|
-
break;
|
|
1528
|
-
}
|
|
1529
|
-
if (headingBeginRegex.test(line)) {
|
|
1530
|
-
break;
|
|
1531
|
-
}
|
|
1532
|
-
if (hrRegex.test(line)) {
|
|
1533
|
-
break;
|
|
1534
|
-
}
|
|
1535
|
-
itemContents += "\n" + nextLine;
|
|
1536
|
-
}
|
|
1537
|
-
if (!blankLine && !nextLine.trim()) {
|
|
1538
|
-
blankLine = true;
|
|
1539
|
-
}
|
|
1540
|
-
raw += rawLine + "\n";
|
|
1541
|
-
src = src.substring(rawLine.length + 1);
|
|
1542
|
-
line = nextLineWithoutTabs.slice(indent);
|
|
1543
|
-
}
|
|
1544
|
-
}
|
|
1545
|
-
if (!list2.loose) {
|
|
1546
|
-
if (endsWithBlankLine) {
|
|
1547
|
-
list2.loose = true;
|
|
1548
|
-
} else if (this.rules.other.doubleBlankLine.test(raw)) {
|
|
1549
|
-
endsWithBlankLine = true;
|
|
1550
|
-
}
|
|
1551
|
-
}
|
|
1552
|
-
let istask = null;
|
|
1553
|
-
let ischecked;
|
|
1554
|
-
if (this.options.gfm) {
|
|
1555
|
-
istask = this.rules.other.listIsTask.exec(itemContents);
|
|
1556
|
-
if (istask) {
|
|
1557
|
-
ischecked = istask[0] !== "[ ] ";
|
|
1558
|
-
itemContents = itemContents.replace(this.rules.other.listReplaceTask, "");
|
|
1559
|
-
}
|
|
1560
|
-
}
|
|
1561
|
-
list2.items.push({
|
|
1562
|
-
type: "list_item",
|
|
1563
|
-
raw,
|
|
1564
|
-
task: !!istask,
|
|
1565
|
-
checked: ischecked,
|
|
1566
|
-
loose: false,
|
|
1567
|
-
text: itemContents,
|
|
1568
|
-
tokens: []
|
|
1569
|
-
});
|
|
1570
|
-
list2.raw += raw;
|
|
1571
|
-
}
|
|
1572
|
-
const lastItem = list2.items.at(-1);
|
|
1573
|
-
if (lastItem) {
|
|
1574
|
-
lastItem.raw = lastItem.raw.trimEnd();
|
|
1575
|
-
lastItem.text = lastItem.text.trimEnd();
|
|
1576
|
-
} else {
|
|
1577
|
-
return;
|
|
1578
|
-
}
|
|
1579
|
-
list2.raw = list2.raw.trimEnd();
|
|
1580
|
-
for (let i = 0; i < list2.items.length; i++) {
|
|
1581
|
-
this.lexer.state.top = false;
|
|
1582
|
-
list2.items[i].tokens = this.lexer.blockTokens(list2.items[i].text, []);
|
|
1583
|
-
if (!list2.loose) {
|
|
1584
|
-
const spacers = list2.items[i].tokens.filter((t) => t.type === "space");
|
|
1585
|
-
const hasMultipleLineBreaks = spacers.length > 0 && spacers.some((t) => this.rules.other.anyLine.test(t.raw));
|
|
1586
|
-
list2.loose = hasMultipleLineBreaks;
|
|
1587
|
-
}
|
|
1588
|
-
}
|
|
1589
|
-
if (list2.loose) {
|
|
1590
|
-
for (let i = 0; i < list2.items.length; i++) {
|
|
1591
|
-
list2.items[i].loose = true;
|
|
1592
|
-
}
|
|
1593
|
-
}
|
|
1594
|
-
return list2;
|
|
1595
|
-
}
|
|
1596
|
-
}
|
|
1597
|
-
html(src) {
|
|
1598
|
-
const cap = this.rules.block.html.exec(src);
|
|
1599
|
-
if (cap) {
|
|
1600
|
-
const token = {
|
|
1601
|
-
type: "html",
|
|
1602
|
-
block: true,
|
|
1603
|
-
raw: cap[0],
|
|
1604
|
-
pre: cap[1] === "pre" || cap[1] === "script" || cap[1] === "style",
|
|
1605
|
-
text: cap[0]
|
|
1606
|
-
};
|
|
1607
|
-
return token;
|
|
1608
|
-
}
|
|
1609
|
-
}
|
|
1610
|
-
def(src) {
|
|
1611
|
-
const cap = this.rules.block.def.exec(src);
|
|
1612
|
-
if (cap) {
|
|
1613
|
-
const tag2 = cap[1].toLowerCase().replace(this.rules.other.multipleSpaceGlobal, " ");
|
|
1614
|
-
const href = cap[2] ? cap[2].replace(this.rules.other.hrefBrackets, "$1").replace(this.rules.inline.anyPunctuation, "$1") : "";
|
|
1615
|
-
const title = cap[3] ? cap[3].substring(1, cap[3].length - 1).replace(this.rules.inline.anyPunctuation, "$1") : cap[3];
|
|
1616
|
-
return {
|
|
1617
|
-
type: "def",
|
|
1618
|
-
tag: tag2,
|
|
1619
|
-
raw: cap[0],
|
|
1620
|
-
href,
|
|
1621
|
-
title
|
|
1622
|
-
};
|
|
1623
|
-
}
|
|
1624
|
-
}
|
|
1625
|
-
table(src) {
|
|
1626
|
-
const cap = this.rules.block.table.exec(src);
|
|
1627
|
-
if (!cap) {
|
|
1628
|
-
return;
|
|
1629
|
-
}
|
|
1630
|
-
if (!this.rules.other.tableDelimiter.test(cap[2])) {
|
|
1631
|
-
return;
|
|
1632
|
-
}
|
|
1633
|
-
const headers = splitCells(cap[1]);
|
|
1634
|
-
const aligns = cap[2].replace(this.rules.other.tableAlignChars, "").split("|");
|
|
1635
|
-
const rows = cap[3]?.trim() ? cap[3].replace(this.rules.other.tableRowBlankLine, "").split("\n") : [];
|
|
1636
|
-
const item = {
|
|
1637
|
-
type: "table",
|
|
1638
|
-
raw: cap[0],
|
|
1639
|
-
header: [],
|
|
1640
|
-
align: [],
|
|
1641
|
-
rows: []
|
|
1642
|
-
};
|
|
1643
|
-
if (headers.length !== aligns.length) {
|
|
1644
|
-
return;
|
|
1645
|
-
}
|
|
1646
|
-
for (const align of aligns) {
|
|
1647
|
-
if (this.rules.other.tableAlignRight.test(align)) {
|
|
1648
|
-
item.align.push("right");
|
|
1649
|
-
} else if (this.rules.other.tableAlignCenter.test(align)) {
|
|
1650
|
-
item.align.push("center");
|
|
1651
|
-
} else if (this.rules.other.tableAlignLeft.test(align)) {
|
|
1652
|
-
item.align.push("left");
|
|
1653
|
-
} else {
|
|
1654
|
-
item.align.push(null);
|
|
1655
|
-
}
|
|
1656
|
-
}
|
|
1657
|
-
for (let i = 0; i < headers.length; i++) {
|
|
1658
|
-
item.header.push({
|
|
1659
|
-
text: headers[i],
|
|
1660
|
-
tokens: this.lexer.inline(headers[i]),
|
|
1661
|
-
header: true,
|
|
1662
|
-
align: item.align[i]
|
|
1663
|
-
});
|
|
1664
|
-
}
|
|
1665
|
-
for (const row of rows) {
|
|
1666
|
-
item.rows.push(splitCells(row, item.header.length).map((cell, i) => {
|
|
1667
|
-
return {
|
|
1668
|
-
text: cell,
|
|
1669
|
-
tokens: this.lexer.inline(cell),
|
|
1670
|
-
header: false,
|
|
1671
|
-
align: item.align[i]
|
|
1672
|
-
};
|
|
1673
|
-
}));
|
|
1674
|
-
}
|
|
1675
|
-
return item;
|
|
1676
|
-
}
|
|
1677
|
-
lheading(src) {
|
|
1678
|
-
const cap = this.rules.block.lheading.exec(src);
|
|
1679
|
-
if (cap) {
|
|
1680
|
-
return {
|
|
1681
|
-
type: "heading",
|
|
1682
|
-
raw: cap[0],
|
|
1683
|
-
depth: cap[2].charAt(0) === "=" ? 1 : 2,
|
|
1684
|
-
text: cap[1],
|
|
1685
|
-
tokens: this.lexer.inline(cap[1])
|
|
1686
|
-
};
|
|
1687
|
-
}
|
|
1688
|
-
}
|
|
1689
|
-
paragraph(src) {
|
|
1690
|
-
const cap = this.rules.block.paragraph.exec(src);
|
|
1691
|
-
if (cap) {
|
|
1692
|
-
const text = cap[1].charAt(cap[1].length - 1) === "\n" ? cap[1].slice(0, -1) : cap[1];
|
|
1693
|
-
return {
|
|
1694
|
-
type: "paragraph",
|
|
1695
|
-
raw: cap[0],
|
|
1696
|
-
text,
|
|
1697
|
-
tokens: this.lexer.inline(text)
|
|
1698
|
-
};
|
|
1699
|
-
}
|
|
1700
|
-
}
|
|
1701
|
-
text(src) {
|
|
1702
|
-
const cap = this.rules.block.text.exec(src);
|
|
1703
|
-
if (cap) {
|
|
1704
|
-
return {
|
|
1705
|
-
type: "text",
|
|
1706
|
-
raw: cap[0],
|
|
1707
|
-
text: cap[0],
|
|
1708
|
-
tokens: this.lexer.inline(cap[0])
|
|
1709
|
-
};
|
|
1710
|
-
}
|
|
1711
|
-
}
|
|
1712
|
-
escape(src) {
|
|
1713
|
-
const cap = this.rules.inline.escape.exec(src);
|
|
1714
|
-
if (cap) {
|
|
1715
|
-
return {
|
|
1716
|
-
type: "escape",
|
|
1717
|
-
raw: cap[0],
|
|
1718
|
-
text: cap[1]
|
|
1719
|
-
};
|
|
1720
|
-
}
|
|
1721
|
-
}
|
|
1722
|
-
tag(src) {
|
|
1723
|
-
const cap = this.rules.inline.tag.exec(src);
|
|
1724
|
-
if (cap) {
|
|
1725
|
-
if (!this.lexer.state.inLink && this.rules.other.startATag.test(cap[0])) {
|
|
1726
|
-
this.lexer.state.inLink = true;
|
|
1727
|
-
} else if (this.lexer.state.inLink && this.rules.other.endATag.test(cap[0])) {
|
|
1728
|
-
this.lexer.state.inLink = false;
|
|
1729
|
-
}
|
|
1730
|
-
if (!this.lexer.state.inRawBlock && this.rules.other.startPreScriptTag.test(cap[0])) {
|
|
1731
|
-
this.lexer.state.inRawBlock = true;
|
|
1732
|
-
} else if (this.lexer.state.inRawBlock && this.rules.other.endPreScriptTag.test(cap[0])) {
|
|
1733
|
-
this.lexer.state.inRawBlock = false;
|
|
1734
|
-
}
|
|
1735
|
-
return {
|
|
1736
|
-
type: "html",
|
|
1737
|
-
raw: cap[0],
|
|
1738
|
-
inLink: this.lexer.state.inLink,
|
|
1739
|
-
inRawBlock: this.lexer.state.inRawBlock,
|
|
1740
|
-
block: false,
|
|
1741
|
-
text: cap[0]
|
|
1742
|
-
};
|
|
1743
|
-
}
|
|
1744
|
-
}
|
|
1745
|
-
link(src) {
|
|
1746
|
-
const cap = this.rules.inline.link.exec(src);
|
|
1747
|
-
if (cap) {
|
|
1748
|
-
const trimmedUrl = cap[2].trim();
|
|
1749
|
-
if (!this.options.pedantic && this.rules.other.startAngleBracket.test(trimmedUrl)) {
|
|
1750
|
-
if (!this.rules.other.endAngleBracket.test(trimmedUrl)) {
|
|
1751
|
-
return;
|
|
1752
|
-
}
|
|
1753
|
-
const rtrimSlash = rtrim(trimmedUrl.slice(0, -1), "\\");
|
|
1754
|
-
if ((trimmedUrl.length - rtrimSlash.length) % 2 === 0) {
|
|
1755
|
-
return;
|
|
1756
|
-
}
|
|
1757
|
-
} else {
|
|
1758
|
-
const lastParenIndex = findClosingBracket(cap[2], "()");
|
|
1759
|
-
if (lastParenIndex === -2) {
|
|
1760
|
-
return;
|
|
1761
|
-
}
|
|
1762
|
-
if (lastParenIndex > -1) {
|
|
1763
|
-
const start = cap[0].indexOf("!") === 0 ? 5 : 4;
|
|
1764
|
-
const linkLen = start + cap[1].length + lastParenIndex;
|
|
1765
|
-
cap[2] = cap[2].substring(0, lastParenIndex);
|
|
1766
|
-
cap[0] = cap[0].substring(0, linkLen).trim();
|
|
1767
|
-
cap[3] = "";
|
|
1768
|
-
}
|
|
1769
|
-
}
|
|
1770
|
-
let href = cap[2];
|
|
1771
|
-
let title = "";
|
|
1772
|
-
if (this.options.pedantic) {
|
|
1773
|
-
const link2 = this.rules.other.pedanticHrefTitle.exec(href);
|
|
1774
|
-
if (link2) {
|
|
1775
|
-
href = link2[1];
|
|
1776
|
-
title = link2[3];
|
|
1777
|
-
}
|
|
1778
|
-
} else {
|
|
1779
|
-
title = cap[3] ? cap[3].slice(1, -1) : "";
|
|
1780
|
-
}
|
|
1781
|
-
href = href.trim();
|
|
1782
|
-
if (this.rules.other.startAngleBracket.test(href)) {
|
|
1783
|
-
if (this.options.pedantic && !this.rules.other.endAngleBracket.test(trimmedUrl)) {
|
|
1784
|
-
href = href.slice(1);
|
|
1785
|
-
} else {
|
|
1786
|
-
href = href.slice(1, -1);
|
|
1787
|
-
}
|
|
1788
|
-
}
|
|
1789
|
-
return outputLink(cap, {
|
|
1790
|
-
href: href ? href.replace(this.rules.inline.anyPunctuation, "$1") : href,
|
|
1791
|
-
title: title ? title.replace(this.rules.inline.anyPunctuation, "$1") : title
|
|
1792
|
-
}, cap[0], this.lexer, this.rules);
|
|
1793
|
-
}
|
|
1794
|
-
}
|
|
1795
|
-
reflink(src, links) {
|
|
1796
|
-
let cap;
|
|
1797
|
-
if ((cap = this.rules.inline.reflink.exec(src)) || (cap = this.rules.inline.nolink.exec(src))) {
|
|
1798
|
-
const linkString = (cap[2] || cap[1]).replace(this.rules.other.multipleSpaceGlobal, " ");
|
|
1799
|
-
const link2 = links[linkString.toLowerCase()];
|
|
1800
|
-
if (!link2) {
|
|
1801
|
-
const text = cap[0].charAt(0);
|
|
1802
|
-
return {
|
|
1803
|
-
type: "text",
|
|
1804
|
-
raw: text,
|
|
1805
|
-
text
|
|
1806
|
-
};
|
|
1807
|
-
}
|
|
1808
|
-
return outputLink(cap, link2, cap[0], this.lexer, this.rules);
|
|
1809
|
-
}
|
|
1810
|
-
}
|
|
1811
|
-
emStrong(src, maskedSrc, prevChar = "") {
|
|
1812
|
-
let match = this.rules.inline.emStrongLDelim.exec(src);
|
|
1813
|
-
if (!match) return;
|
|
1814
|
-
if (match[3] && prevChar.match(this.rules.other.unicodeAlphaNumeric)) return;
|
|
1815
|
-
const nextChar = match[1] || match[2] || "";
|
|
1816
|
-
if (!nextChar || !prevChar || this.rules.inline.punctuation.exec(prevChar)) {
|
|
1817
|
-
const lLength = [...match[0]].length - 1;
|
|
1818
|
-
let rDelim, rLength, delimTotal = lLength, midDelimTotal = 0;
|
|
1819
|
-
const endReg = match[0][0] === "*" ? this.rules.inline.emStrongRDelimAst : this.rules.inline.emStrongRDelimUnd;
|
|
1820
|
-
endReg.lastIndex = 0;
|
|
1821
|
-
maskedSrc = maskedSrc.slice(-1 * src.length + lLength);
|
|
1822
|
-
while ((match = endReg.exec(maskedSrc)) != null) {
|
|
1823
|
-
rDelim = match[1] || match[2] || match[3] || match[4] || match[5] || match[6];
|
|
1824
|
-
if (!rDelim) continue;
|
|
1825
|
-
rLength = [...rDelim].length;
|
|
1826
|
-
if (match[3] || match[4]) {
|
|
1827
|
-
delimTotal += rLength;
|
|
1828
|
-
continue;
|
|
1829
|
-
} else if (match[5] || match[6]) {
|
|
1830
|
-
if (lLength % 3 && !((lLength + rLength) % 3)) {
|
|
1831
|
-
midDelimTotal += rLength;
|
|
1832
|
-
continue;
|
|
1833
|
-
}
|
|
1834
|
-
}
|
|
1835
|
-
delimTotal -= rLength;
|
|
1836
|
-
if (delimTotal > 0) continue;
|
|
1837
|
-
rLength = Math.min(rLength, rLength + delimTotal + midDelimTotal);
|
|
1838
|
-
const lastCharLength = [...match[0]][0].length;
|
|
1839
|
-
const raw = src.slice(0, lLength + match.index + lastCharLength + rLength);
|
|
1840
|
-
if (Math.min(lLength, rLength) % 2) {
|
|
1841
|
-
const text2 = raw.slice(1, -1);
|
|
1842
|
-
return {
|
|
1843
|
-
type: "em",
|
|
1844
|
-
raw,
|
|
1845
|
-
text: text2,
|
|
1846
|
-
tokens: this.lexer.inlineTokens(text2)
|
|
1847
|
-
};
|
|
1848
|
-
}
|
|
1849
|
-
const text = raw.slice(2, -2);
|
|
1850
|
-
return {
|
|
1851
|
-
type: "strong",
|
|
1852
|
-
raw,
|
|
1853
|
-
text,
|
|
1854
|
-
tokens: this.lexer.inlineTokens(text)
|
|
1855
|
-
};
|
|
1856
|
-
}
|
|
1857
|
-
}
|
|
1858
|
-
}
|
|
1859
|
-
codespan(src) {
|
|
1860
|
-
const cap = this.rules.inline.code.exec(src);
|
|
1861
|
-
if (cap) {
|
|
1862
|
-
let text = cap[2].replace(this.rules.other.newLineCharGlobal, " ");
|
|
1863
|
-
const hasNonSpaceChars = this.rules.other.nonSpaceChar.test(text);
|
|
1864
|
-
const hasSpaceCharsOnBothEnds = this.rules.other.startingSpaceChar.test(text) && this.rules.other.endingSpaceChar.test(text);
|
|
1865
|
-
if (hasNonSpaceChars && hasSpaceCharsOnBothEnds) {
|
|
1866
|
-
text = text.substring(1, text.length - 1);
|
|
1867
|
-
}
|
|
1868
|
-
return {
|
|
1869
|
-
type: "codespan",
|
|
1870
|
-
raw: cap[0],
|
|
1871
|
-
text
|
|
1872
|
-
};
|
|
1873
|
-
}
|
|
1874
|
-
}
|
|
1875
|
-
br(src) {
|
|
1876
|
-
const cap = this.rules.inline.br.exec(src);
|
|
1877
|
-
if (cap) {
|
|
1878
|
-
return {
|
|
1879
|
-
type: "br",
|
|
1880
|
-
raw: cap[0]
|
|
1881
|
-
};
|
|
1882
|
-
}
|
|
1883
|
-
}
|
|
1884
|
-
del(src) {
|
|
1885
|
-
const cap = this.rules.inline.del.exec(src);
|
|
1886
|
-
if (cap) {
|
|
1887
|
-
return {
|
|
1888
|
-
type: "del",
|
|
1889
|
-
raw: cap[0],
|
|
1890
|
-
text: cap[2],
|
|
1891
|
-
tokens: this.lexer.inlineTokens(cap[2])
|
|
1892
|
-
};
|
|
1893
|
-
}
|
|
1894
|
-
}
|
|
1895
|
-
autolink(src) {
|
|
1896
|
-
const cap = this.rules.inline.autolink.exec(src);
|
|
1897
|
-
if (cap) {
|
|
1898
|
-
let text, href;
|
|
1899
|
-
if (cap[2] === "@") {
|
|
1900
|
-
text = cap[1];
|
|
1901
|
-
href = "mailto:" + text;
|
|
1902
|
-
} else {
|
|
1903
|
-
text = cap[1];
|
|
1904
|
-
href = text;
|
|
1905
|
-
}
|
|
1906
|
-
return {
|
|
1907
|
-
type: "link",
|
|
1908
|
-
raw: cap[0],
|
|
1909
|
-
text,
|
|
1910
|
-
href,
|
|
1911
|
-
tokens: [
|
|
1912
|
-
{
|
|
1913
|
-
type: "text",
|
|
1914
|
-
raw: text,
|
|
1915
|
-
text
|
|
1916
|
-
}
|
|
1917
|
-
]
|
|
1918
|
-
};
|
|
1919
|
-
}
|
|
1920
|
-
}
|
|
1921
|
-
url(src) {
|
|
1922
|
-
let cap;
|
|
1923
|
-
if (cap = this.rules.inline.url.exec(src)) {
|
|
1924
|
-
let text, href;
|
|
1925
|
-
if (cap[2] === "@") {
|
|
1926
|
-
text = cap[0];
|
|
1927
|
-
href = "mailto:" + text;
|
|
1928
|
-
} else {
|
|
1929
|
-
let prevCapZero;
|
|
1930
|
-
do {
|
|
1931
|
-
prevCapZero = cap[0];
|
|
1932
|
-
cap[0] = this.rules.inline._backpedal.exec(cap[0])?.[0] ?? "";
|
|
1933
|
-
} while (prevCapZero !== cap[0]);
|
|
1934
|
-
text = cap[0];
|
|
1935
|
-
if (cap[1] === "www.") {
|
|
1936
|
-
href = "http://" + cap[0];
|
|
1937
|
-
} else {
|
|
1938
|
-
href = cap[0];
|
|
1939
|
-
}
|
|
1940
|
-
}
|
|
1941
|
-
return {
|
|
1942
|
-
type: "link",
|
|
1943
|
-
raw: cap[0],
|
|
1944
|
-
text,
|
|
1945
|
-
href,
|
|
1946
|
-
tokens: [
|
|
1947
|
-
{
|
|
1948
|
-
type: "text",
|
|
1949
|
-
raw: text,
|
|
1950
|
-
text
|
|
1951
|
-
}
|
|
1952
|
-
]
|
|
1953
|
-
};
|
|
1954
|
-
}
|
|
1955
|
-
}
|
|
1956
|
-
inlineText(src) {
|
|
1957
|
-
const cap = this.rules.inline.text.exec(src);
|
|
1958
|
-
if (cap) {
|
|
1959
|
-
const escaped = this.lexer.state.inRawBlock;
|
|
1960
|
-
return {
|
|
1961
|
-
type: "text",
|
|
1962
|
-
raw: cap[0],
|
|
1963
|
-
text: cap[0],
|
|
1964
|
-
escaped
|
|
1965
|
-
};
|
|
1966
|
-
}
|
|
1967
|
-
}
|
|
1968
|
-
};
|
|
1969
|
-
var _Lexer = class __Lexer {
|
|
1970
|
-
tokens;
|
|
1971
|
-
options;
|
|
1972
|
-
state;
|
|
1973
|
-
tokenizer;
|
|
1974
|
-
inlineQueue;
|
|
1975
|
-
constructor(options2) {
|
|
1976
|
-
this.tokens = [];
|
|
1977
|
-
this.tokens.links = /* @__PURE__ */ Object.create(null);
|
|
1978
|
-
this.options = options2 || _defaults;
|
|
1979
|
-
this.options.tokenizer = this.options.tokenizer || new _Tokenizer();
|
|
1980
|
-
this.tokenizer = this.options.tokenizer;
|
|
1981
|
-
this.tokenizer.options = this.options;
|
|
1982
|
-
this.tokenizer.lexer = this;
|
|
1983
|
-
this.inlineQueue = [];
|
|
1984
|
-
this.state = {
|
|
1985
|
-
inLink: false,
|
|
1986
|
-
inRawBlock: false,
|
|
1987
|
-
top: true
|
|
1988
|
-
};
|
|
1989
|
-
const rules = {
|
|
1990
|
-
other,
|
|
1991
|
-
block: block.normal,
|
|
1992
|
-
inline: inline.normal
|
|
1993
|
-
};
|
|
1994
|
-
if (this.options.pedantic) {
|
|
1995
|
-
rules.block = block.pedantic;
|
|
1996
|
-
rules.inline = inline.pedantic;
|
|
1997
|
-
} else if (this.options.gfm) {
|
|
1998
|
-
rules.block = block.gfm;
|
|
1999
|
-
if (this.options.breaks) {
|
|
2000
|
-
rules.inline = inline.breaks;
|
|
2001
|
-
} else {
|
|
2002
|
-
rules.inline = inline.gfm;
|
|
2003
|
-
}
|
|
2004
|
-
}
|
|
2005
|
-
this.tokenizer.rules = rules;
|
|
2006
|
-
}
|
|
2007
|
-
/**
|
|
2008
|
-
* Expose Rules
|
|
2009
|
-
*/
|
|
2010
|
-
static get rules() {
|
|
2011
|
-
return {
|
|
2012
|
-
block,
|
|
2013
|
-
inline
|
|
2014
|
-
};
|
|
2015
|
-
}
|
|
2016
|
-
/**
|
|
2017
|
-
* Static Lex Method
|
|
2018
|
-
*/
|
|
2019
|
-
static lex(src, options2) {
|
|
2020
|
-
const lexer2 = new __Lexer(options2);
|
|
2021
|
-
return lexer2.lex(src);
|
|
2022
|
-
}
|
|
2023
|
-
/**
|
|
2024
|
-
* Static Lex Inline Method
|
|
2025
|
-
*/
|
|
2026
|
-
static lexInline(src, options2) {
|
|
2027
|
-
const lexer2 = new __Lexer(options2);
|
|
2028
|
-
return lexer2.inlineTokens(src);
|
|
2029
|
-
}
|
|
2030
|
-
/**
|
|
2031
|
-
* Preprocessing
|
|
2032
|
-
*/
|
|
2033
|
-
lex(src) {
|
|
2034
|
-
src = src.replace(other.carriageReturn, "\n");
|
|
2035
|
-
this.blockTokens(src, this.tokens);
|
|
2036
|
-
for (let i = 0; i < this.inlineQueue.length; i++) {
|
|
2037
|
-
const next = this.inlineQueue[i];
|
|
2038
|
-
this.inlineTokens(next.src, next.tokens);
|
|
2039
|
-
}
|
|
2040
|
-
this.inlineQueue = [];
|
|
2041
|
-
return this.tokens;
|
|
2042
|
-
}
|
|
2043
|
-
blockTokens(src, tokens = [], lastParagraphClipped = false) {
|
|
2044
|
-
if (this.options.pedantic) {
|
|
2045
|
-
src = src.replace(other.tabCharGlobal, " ").replace(other.spaceLine, "");
|
|
2046
|
-
}
|
|
2047
|
-
while (src) {
|
|
2048
|
-
let token;
|
|
2049
|
-
if (this.options.extensions?.block?.some((extTokenizer) => {
|
|
2050
|
-
if (token = extTokenizer.call({ lexer: this }, src, tokens)) {
|
|
2051
|
-
src = src.substring(token.raw.length);
|
|
2052
|
-
tokens.push(token);
|
|
2053
|
-
return true;
|
|
2054
|
-
}
|
|
2055
|
-
return false;
|
|
2056
|
-
})) {
|
|
2057
|
-
continue;
|
|
2058
|
-
}
|
|
2059
|
-
if (token = this.tokenizer.space(src)) {
|
|
2060
|
-
src = src.substring(token.raw.length);
|
|
2061
|
-
const lastToken = tokens.at(-1);
|
|
2062
|
-
if (token.raw.length === 1 && lastToken !== void 0) {
|
|
2063
|
-
lastToken.raw += "\n";
|
|
2064
|
-
} else {
|
|
2065
|
-
tokens.push(token);
|
|
2066
|
-
}
|
|
2067
|
-
continue;
|
|
2068
|
-
}
|
|
2069
|
-
if (token = this.tokenizer.code(src)) {
|
|
2070
|
-
src = src.substring(token.raw.length);
|
|
2071
|
-
const lastToken = tokens.at(-1);
|
|
2072
|
-
if (lastToken?.type === "paragraph" || lastToken?.type === "text") {
|
|
2073
|
-
lastToken.raw += "\n" + token.raw;
|
|
2074
|
-
lastToken.text += "\n" + token.text;
|
|
2075
|
-
this.inlineQueue.at(-1).src = lastToken.text;
|
|
2076
|
-
} else {
|
|
2077
|
-
tokens.push(token);
|
|
2078
|
-
}
|
|
2079
|
-
continue;
|
|
2080
|
-
}
|
|
2081
|
-
if (token = this.tokenizer.fences(src)) {
|
|
2082
|
-
src = src.substring(token.raw.length);
|
|
2083
|
-
tokens.push(token);
|
|
2084
|
-
continue;
|
|
2085
|
-
}
|
|
2086
|
-
if (token = this.tokenizer.heading(src)) {
|
|
2087
|
-
src = src.substring(token.raw.length);
|
|
2088
|
-
tokens.push(token);
|
|
2089
|
-
continue;
|
|
2090
|
-
}
|
|
2091
|
-
if (token = this.tokenizer.hr(src)) {
|
|
2092
|
-
src = src.substring(token.raw.length);
|
|
2093
|
-
tokens.push(token);
|
|
2094
|
-
continue;
|
|
2095
|
-
}
|
|
2096
|
-
if (token = this.tokenizer.blockquote(src)) {
|
|
2097
|
-
src = src.substring(token.raw.length);
|
|
2098
|
-
tokens.push(token);
|
|
2099
|
-
continue;
|
|
2100
|
-
}
|
|
2101
|
-
if (token = this.tokenizer.list(src)) {
|
|
2102
|
-
src = src.substring(token.raw.length);
|
|
2103
|
-
tokens.push(token);
|
|
2104
|
-
continue;
|
|
2105
|
-
}
|
|
2106
|
-
if (token = this.tokenizer.html(src)) {
|
|
2107
|
-
src = src.substring(token.raw.length);
|
|
2108
|
-
tokens.push(token);
|
|
2109
|
-
continue;
|
|
2110
|
-
}
|
|
2111
|
-
if (token = this.tokenizer.def(src)) {
|
|
2112
|
-
src = src.substring(token.raw.length);
|
|
2113
|
-
const lastToken = tokens.at(-1);
|
|
2114
|
-
if (lastToken?.type === "paragraph" || lastToken?.type === "text") {
|
|
2115
|
-
lastToken.raw += "\n" + token.raw;
|
|
2116
|
-
lastToken.text += "\n" + token.raw;
|
|
2117
|
-
this.inlineQueue.at(-1).src = lastToken.text;
|
|
2118
|
-
} else if (!this.tokens.links[token.tag]) {
|
|
2119
|
-
this.tokens.links[token.tag] = {
|
|
2120
|
-
href: token.href,
|
|
2121
|
-
title: token.title
|
|
2122
|
-
};
|
|
2123
|
-
}
|
|
2124
|
-
continue;
|
|
2125
|
-
}
|
|
2126
|
-
if (token = this.tokenizer.table(src)) {
|
|
2127
|
-
src = src.substring(token.raw.length);
|
|
2128
|
-
tokens.push(token);
|
|
2129
|
-
continue;
|
|
2130
|
-
}
|
|
2131
|
-
if (token = this.tokenizer.lheading(src)) {
|
|
2132
|
-
src = src.substring(token.raw.length);
|
|
2133
|
-
tokens.push(token);
|
|
2134
|
-
continue;
|
|
2135
|
-
}
|
|
2136
|
-
let cutSrc = src;
|
|
2137
|
-
if (this.options.extensions?.startBlock) {
|
|
2138
|
-
let startIndex = Infinity;
|
|
2139
|
-
const tempSrc = src.slice(1);
|
|
2140
|
-
let tempStart;
|
|
2141
|
-
this.options.extensions.startBlock.forEach((getStartIndex) => {
|
|
2142
|
-
tempStart = getStartIndex.call({ lexer: this }, tempSrc);
|
|
2143
|
-
if (typeof tempStart === "number" && tempStart >= 0) {
|
|
2144
|
-
startIndex = Math.min(startIndex, tempStart);
|
|
2145
|
-
}
|
|
2146
|
-
});
|
|
2147
|
-
if (startIndex < Infinity && startIndex >= 0) {
|
|
2148
|
-
cutSrc = src.substring(0, startIndex + 1);
|
|
2149
|
-
}
|
|
2150
|
-
}
|
|
2151
|
-
if (this.state.top && (token = this.tokenizer.paragraph(cutSrc))) {
|
|
2152
|
-
const lastToken = tokens.at(-1);
|
|
2153
|
-
if (lastParagraphClipped && lastToken?.type === "paragraph") {
|
|
2154
|
-
lastToken.raw += "\n" + token.raw;
|
|
2155
|
-
lastToken.text += "\n" + token.text;
|
|
2156
|
-
this.inlineQueue.pop();
|
|
2157
|
-
this.inlineQueue.at(-1).src = lastToken.text;
|
|
2158
|
-
} else {
|
|
2159
|
-
tokens.push(token);
|
|
2160
|
-
}
|
|
2161
|
-
lastParagraphClipped = cutSrc.length !== src.length;
|
|
2162
|
-
src = src.substring(token.raw.length);
|
|
2163
|
-
continue;
|
|
2164
|
-
}
|
|
2165
|
-
if (token = this.tokenizer.text(src)) {
|
|
2166
|
-
src = src.substring(token.raw.length);
|
|
2167
|
-
const lastToken = tokens.at(-1);
|
|
2168
|
-
if (lastToken?.type === "text") {
|
|
2169
|
-
lastToken.raw += "\n" + token.raw;
|
|
2170
|
-
lastToken.text += "\n" + token.text;
|
|
2171
|
-
this.inlineQueue.pop();
|
|
2172
|
-
this.inlineQueue.at(-1).src = lastToken.text;
|
|
2173
|
-
} else {
|
|
2174
|
-
tokens.push(token);
|
|
2175
|
-
}
|
|
2176
|
-
continue;
|
|
2177
|
-
}
|
|
2178
|
-
if (src) {
|
|
2179
|
-
const errMsg = "Infinite loop on byte: " + src.charCodeAt(0);
|
|
2180
|
-
if (this.options.silent) {
|
|
2181
|
-
console.error(errMsg);
|
|
2182
|
-
break;
|
|
2183
|
-
} else {
|
|
2184
|
-
throw new Error(errMsg);
|
|
2185
|
-
}
|
|
2186
|
-
}
|
|
2187
|
-
}
|
|
2188
|
-
this.state.top = true;
|
|
2189
|
-
return tokens;
|
|
2190
|
-
}
|
|
2191
|
-
inline(src, tokens = []) {
|
|
2192
|
-
this.inlineQueue.push({ src, tokens });
|
|
2193
|
-
return tokens;
|
|
2194
|
-
}
|
|
2195
|
-
/**
|
|
2196
|
-
* Lexing/Compiling
|
|
2197
|
-
*/
|
|
2198
|
-
inlineTokens(src, tokens = []) {
|
|
2199
|
-
let maskedSrc = src;
|
|
2200
|
-
let match = null;
|
|
2201
|
-
if (this.tokens.links) {
|
|
2202
|
-
const links = Object.keys(this.tokens.links);
|
|
2203
|
-
if (links.length > 0) {
|
|
2204
|
-
while ((match = this.tokenizer.rules.inline.reflinkSearch.exec(maskedSrc)) != null) {
|
|
2205
|
-
if (links.includes(match[0].slice(match[0].lastIndexOf("[") + 1, -1))) {
|
|
2206
|
-
maskedSrc = maskedSrc.slice(0, match.index) + "[" + "a".repeat(match[0].length - 2) + "]" + maskedSrc.slice(this.tokenizer.rules.inline.reflinkSearch.lastIndex);
|
|
2207
|
-
}
|
|
2208
|
-
}
|
|
2209
|
-
}
|
|
2210
|
-
}
|
|
2211
|
-
while ((match = this.tokenizer.rules.inline.anyPunctuation.exec(maskedSrc)) != null) {
|
|
2212
|
-
maskedSrc = maskedSrc.slice(0, match.index) + "++" + maskedSrc.slice(this.tokenizer.rules.inline.anyPunctuation.lastIndex);
|
|
2213
|
-
}
|
|
2214
|
-
while ((match = this.tokenizer.rules.inline.blockSkip.exec(maskedSrc)) != null) {
|
|
2215
|
-
maskedSrc = maskedSrc.slice(0, match.index) + "[" + "a".repeat(match[0].length - 2) + "]" + maskedSrc.slice(this.tokenizer.rules.inline.blockSkip.lastIndex);
|
|
2216
|
-
}
|
|
2217
|
-
let keepPrevChar = false;
|
|
2218
|
-
let prevChar = "";
|
|
2219
|
-
while (src) {
|
|
2220
|
-
if (!keepPrevChar) {
|
|
2221
|
-
prevChar = "";
|
|
2222
|
-
}
|
|
2223
|
-
keepPrevChar = false;
|
|
2224
|
-
let token;
|
|
2225
|
-
if (this.options.extensions?.inline?.some((extTokenizer) => {
|
|
2226
|
-
if (token = extTokenizer.call({ lexer: this }, src, tokens)) {
|
|
2227
|
-
src = src.substring(token.raw.length);
|
|
2228
|
-
tokens.push(token);
|
|
2229
|
-
return true;
|
|
2230
|
-
}
|
|
2231
|
-
return false;
|
|
2232
|
-
})) {
|
|
2233
|
-
continue;
|
|
2234
|
-
}
|
|
2235
|
-
if (token = this.tokenizer.escape(src)) {
|
|
2236
|
-
src = src.substring(token.raw.length);
|
|
2237
|
-
tokens.push(token);
|
|
2238
|
-
continue;
|
|
2239
|
-
}
|
|
2240
|
-
if (token = this.tokenizer.tag(src)) {
|
|
2241
|
-
src = src.substring(token.raw.length);
|
|
2242
|
-
tokens.push(token);
|
|
2243
|
-
continue;
|
|
2244
|
-
}
|
|
2245
|
-
if (token = this.tokenizer.link(src)) {
|
|
2246
|
-
src = src.substring(token.raw.length);
|
|
2247
|
-
tokens.push(token);
|
|
2248
|
-
continue;
|
|
2249
|
-
}
|
|
2250
|
-
if (token = this.tokenizer.reflink(src, this.tokens.links)) {
|
|
2251
|
-
src = src.substring(token.raw.length);
|
|
2252
|
-
const lastToken = tokens.at(-1);
|
|
2253
|
-
if (token.type === "text" && lastToken?.type === "text") {
|
|
2254
|
-
lastToken.raw += token.raw;
|
|
2255
|
-
lastToken.text += token.text;
|
|
2256
|
-
} else {
|
|
2257
|
-
tokens.push(token);
|
|
2258
|
-
}
|
|
2259
|
-
continue;
|
|
2260
|
-
}
|
|
2261
|
-
if (token = this.tokenizer.emStrong(src, maskedSrc, prevChar)) {
|
|
2262
|
-
src = src.substring(token.raw.length);
|
|
2263
|
-
tokens.push(token);
|
|
2264
|
-
continue;
|
|
2265
|
-
}
|
|
2266
|
-
if (token = this.tokenizer.codespan(src)) {
|
|
2267
|
-
src = src.substring(token.raw.length);
|
|
2268
|
-
tokens.push(token);
|
|
2269
|
-
continue;
|
|
2270
|
-
}
|
|
2271
|
-
if (token = this.tokenizer.br(src)) {
|
|
2272
|
-
src = src.substring(token.raw.length);
|
|
2273
|
-
tokens.push(token);
|
|
2274
|
-
continue;
|
|
2275
|
-
}
|
|
2276
|
-
if (token = this.tokenizer.del(src)) {
|
|
2277
|
-
src = src.substring(token.raw.length);
|
|
2278
|
-
tokens.push(token);
|
|
2279
|
-
continue;
|
|
2280
|
-
}
|
|
2281
|
-
if (token = this.tokenizer.autolink(src)) {
|
|
2282
|
-
src = src.substring(token.raw.length);
|
|
2283
|
-
tokens.push(token);
|
|
2284
|
-
continue;
|
|
2285
|
-
}
|
|
2286
|
-
if (!this.state.inLink && (token = this.tokenizer.url(src))) {
|
|
2287
|
-
src = src.substring(token.raw.length);
|
|
2288
|
-
tokens.push(token);
|
|
2289
|
-
continue;
|
|
2290
|
-
}
|
|
2291
|
-
let cutSrc = src;
|
|
2292
|
-
if (this.options.extensions?.startInline) {
|
|
2293
|
-
let startIndex = Infinity;
|
|
2294
|
-
const tempSrc = src.slice(1);
|
|
2295
|
-
let tempStart;
|
|
2296
|
-
this.options.extensions.startInline.forEach((getStartIndex) => {
|
|
2297
|
-
tempStart = getStartIndex.call({ lexer: this }, tempSrc);
|
|
2298
|
-
if (typeof tempStart === "number" && tempStart >= 0) {
|
|
2299
|
-
startIndex = Math.min(startIndex, tempStart);
|
|
2300
|
-
}
|
|
2301
|
-
});
|
|
2302
|
-
if (startIndex < Infinity && startIndex >= 0) {
|
|
2303
|
-
cutSrc = src.substring(0, startIndex + 1);
|
|
2304
|
-
}
|
|
2305
|
-
}
|
|
2306
|
-
if (token = this.tokenizer.inlineText(cutSrc)) {
|
|
2307
|
-
src = src.substring(token.raw.length);
|
|
2308
|
-
if (token.raw.slice(-1) !== "_") {
|
|
2309
|
-
prevChar = token.raw.slice(-1);
|
|
2310
|
-
}
|
|
2311
|
-
keepPrevChar = true;
|
|
2312
|
-
const lastToken = tokens.at(-1);
|
|
2313
|
-
if (lastToken?.type === "text") {
|
|
2314
|
-
lastToken.raw += token.raw;
|
|
2315
|
-
lastToken.text += token.text;
|
|
2316
|
-
} else {
|
|
2317
|
-
tokens.push(token);
|
|
2318
|
-
}
|
|
2319
|
-
continue;
|
|
2320
|
-
}
|
|
2321
|
-
if (src) {
|
|
2322
|
-
const errMsg = "Infinite loop on byte: " + src.charCodeAt(0);
|
|
2323
|
-
if (this.options.silent) {
|
|
2324
|
-
console.error(errMsg);
|
|
2325
|
-
break;
|
|
2326
|
-
} else {
|
|
2327
|
-
throw new Error(errMsg);
|
|
2328
|
-
}
|
|
2329
|
-
}
|
|
2330
|
-
}
|
|
2331
|
-
return tokens;
|
|
2332
|
-
}
|
|
2333
|
-
};
|
|
2334
|
-
var _Renderer = class {
|
|
2335
|
-
options;
|
|
2336
|
-
parser;
|
|
2337
|
-
// set by the parser
|
|
2338
|
-
constructor(options2) {
|
|
2339
|
-
this.options = options2 || _defaults;
|
|
2340
|
-
}
|
|
2341
|
-
space(token) {
|
|
2342
|
-
return "";
|
|
2343
|
-
}
|
|
2344
|
-
code({ text, lang, escaped }) {
|
|
2345
|
-
const langString = (lang || "").match(other.notSpaceStart)?.[0];
|
|
2346
|
-
const code = text.replace(other.endingNewline, "") + "\n";
|
|
2347
|
-
if (!langString) {
|
|
2348
|
-
return "<pre><code>" + (escaped ? code : escape2(code, true)) + "</code></pre>\n";
|
|
2349
|
-
}
|
|
2350
|
-
return '<pre><code class="language-' + escape2(langString) + '">' + (escaped ? code : escape2(code, true)) + "</code></pre>\n";
|
|
2351
|
-
}
|
|
2352
|
-
blockquote({ tokens }) {
|
|
2353
|
-
const body = this.parser.parse(tokens);
|
|
2354
|
-
return `<blockquote>
|
|
2355
|
-
${body}</blockquote>
|
|
2356
|
-
`;
|
|
2357
|
-
}
|
|
2358
|
-
html({ text }) {
|
|
2359
|
-
return text;
|
|
2360
|
-
}
|
|
2361
|
-
heading({ tokens, depth }) {
|
|
2362
|
-
return `<h${depth}>${this.parser.parseInline(tokens)}</h${depth}>
|
|
2363
|
-
`;
|
|
2364
|
-
}
|
|
2365
|
-
hr(token) {
|
|
2366
|
-
return "<hr>\n";
|
|
2367
|
-
}
|
|
2368
|
-
list(token) {
|
|
2369
|
-
const ordered = token.ordered;
|
|
2370
|
-
const start = token.start;
|
|
2371
|
-
let body = "";
|
|
2372
|
-
for (let j = 0; j < token.items.length; j++) {
|
|
2373
|
-
const item = token.items[j];
|
|
2374
|
-
body += this.listitem(item);
|
|
2375
|
-
}
|
|
2376
|
-
const type = ordered ? "ol" : "ul";
|
|
2377
|
-
const startAttr = ordered && start !== 1 ? ' start="' + start + '"' : "";
|
|
2378
|
-
return "<" + type + startAttr + ">\n" + body + "</" + type + ">\n";
|
|
2379
|
-
}
|
|
2380
|
-
listitem(item) {
|
|
2381
|
-
let itemBody = "";
|
|
2382
|
-
if (item.task) {
|
|
2383
|
-
const checkbox = this.checkbox({ checked: !!item.checked });
|
|
2384
|
-
if (item.loose) {
|
|
2385
|
-
if (item.tokens[0]?.type === "paragraph") {
|
|
2386
|
-
item.tokens[0].text = checkbox + " " + item.tokens[0].text;
|
|
2387
|
-
if (item.tokens[0].tokens && item.tokens[0].tokens.length > 0 && item.tokens[0].tokens[0].type === "text") {
|
|
2388
|
-
item.tokens[0].tokens[0].text = checkbox + " " + escape2(item.tokens[0].tokens[0].text);
|
|
2389
|
-
item.tokens[0].tokens[0].escaped = true;
|
|
2390
|
-
}
|
|
2391
|
-
} else {
|
|
2392
|
-
item.tokens.unshift({
|
|
2393
|
-
type: "text",
|
|
2394
|
-
raw: checkbox + " ",
|
|
2395
|
-
text: checkbox + " ",
|
|
2396
|
-
escaped: true
|
|
2397
|
-
});
|
|
2398
|
-
}
|
|
2399
|
-
} else {
|
|
2400
|
-
itemBody += checkbox + " ";
|
|
2401
|
-
}
|
|
2402
|
-
}
|
|
2403
|
-
itemBody += this.parser.parse(item.tokens, !!item.loose);
|
|
2404
|
-
return `<li>${itemBody}</li>
|
|
2405
|
-
`;
|
|
2406
|
-
}
|
|
2407
|
-
checkbox({ checked }) {
|
|
2408
|
-
return "<input " + (checked ? 'checked="" ' : "") + 'disabled="" type="checkbox">';
|
|
2409
|
-
}
|
|
2410
|
-
paragraph({ tokens }) {
|
|
2411
|
-
return `<p>${this.parser.parseInline(tokens)}</p>
|
|
2412
|
-
`;
|
|
2413
|
-
}
|
|
2414
|
-
table(token) {
|
|
2415
|
-
let header = "";
|
|
2416
|
-
let cell = "";
|
|
2417
|
-
for (let j = 0; j < token.header.length; j++) {
|
|
2418
|
-
cell += this.tablecell(token.header[j]);
|
|
2419
|
-
}
|
|
2420
|
-
header += this.tablerow({ text: cell });
|
|
2421
|
-
let body = "";
|
|
2422
|
-
for (let j = 0; j < token.rows.length; j++) {
|
|
2423
|
-
const row = token.rows[j];
|
|
2424
|
-
cell = "";
|
|
2425
|
-
for (let k = 0; k < row.length; k++) {
|
|
2426
|
-
cell += this.tablecell(row[k]);
|
|
2427
|
-
}
|
|
2428
|
-
body += this.tablerow({ text: cell });
|
|
2429
|
-
}
|
|
2430
|
-
if (body) body = `<tbody>${body}</tbody>`;
|
|
2431
|
-
return "<table>\n<thead>\n" + header + "</thead>\n" + body + "</table>\n";
|
|
2432
|
-
}
|
|
2433
|
-
tablerow({ text }) {
|
|
2434
|
-
return `<tr>
|
|
2435
|
-
${text}</tr>
|
|
2436
|
-
`;
|
|
2437
|
-
}
|
|
2438
|
-
tablecell(token) {
|
|
2439
|
-
const content = this.parser.parseInline(token.tokens);
|
|
2440
|
-
const type = token.header ? "th" : "td";
|
|
2441
|
-
const tag2 = token.align ? `<${type} align="${token.align}">` : `<${type}>`;
|
|
2442
|
-
return tag2 + content + `</${type}>
|
|
2443
|
-
`;
|
|
2444
|
-
}
|
|
2445
|
-
/**
|
|
2446
|
-
* span level renderer
|
|
2447
|
-
*/
|
|
2448
|
-
strong({ tokens }) {
|
|
2449
|
-
return `<strong>${this.parser.parseInline(tokens)}</strong>`;
|
|
2450
|
-
}
|
|
2451
|
-
em({ tokens }) {
|
|
2452
|
-
return `<em>${this.parser.parseInline(tokens)}</em>`;
|
|
2453
|
-
}
|
|
2454
|
-
codespan({ text }) {
|
|
2455
|
-
return `<code>${escape2(text, true)}</code>`;
|
|
2456
|
-
}
|
|
2457
|
-
br(token) {
|
|
2458
|
-
return "<br>";
|
|
2459
|
-
}
|
|
2460
|
-
del({ tokens }) {
|
|
2461
|
-
return `<del>${this.parser.parseInline(tokens)}</del>`;
|
|
2462
|
-
}
|
|
2463
|
-
link({ href, title, tokens }) {
|
|
2464
|
-
const text = this.parser.parseInline(tokens);
|
|
2465
|
-
const cleanHref = cleanUrl(href);
|
|
2466
|
-
if (cleanHref === null) {
|
|
2467
|
-
return text;
|
|
2468
|
-
}
|
|
2469
|
-
href = cleanHref;
|
|
2470
|
-
let out = '<a href="' + href + '"';
|
|
2471
|
-
if (title) {
|
|
2472
|
-
out += ' title="' + escape2(title) + '"';
|
|
2473
|
-
}
|
|
2474
|
-
out += ">" + text + "</a>";
|
|
2475
|
-
return out;
|
|
2476
|
-
}
|
|
2477
|
-
image({ href, title, text, tokens }) {
|
|
2478
|
-
if (tokens) {
|
|
2479
|
-
text = this.parser.parseInline(tokens, this.parser.textRenderer);
|
|
2480
|
-
}
|
|
2481
|
-
const cleanHref = cleanUrl(href);
|
|
2482
|
-
if (cleanHref === null) {
|
|
2483
|
-
return escape2(text);
|
|
2484
|
-
}
|
|
2485
|
-
href = cleanHref;
|
|
2486
|
-
let out = `<img src="${href}" alt="${text}"`;
|
|
2487
|
-
if (title) {
|
|
2488
|
-
out += ` title="${escape2(title)}"`;
|
|
2489
|
-
}
|
|
2490
|
-
out += ">";
|
|
2491
|
-
return out;
|
|
2492
|
-
}
|
|
2493
|
-
text(token) {
|
|
2494
|
-
return "tokens" in token && token.tokens ? this.parser.parseInline(token.tokens) : "escaped" in token && token.escaped ? token.text : escape2(token.text);
|
|
2495
|
-
}
|
|
2496
|
-
};
|
|
2497
|
-
var _TextRenderer = class {
|
|
2498
|
-
// no need for block level renderers
|
|
2499
|
-
strong({ text }) {
|
|
2500
|
-
return text;
|
|
2501
|
-
}
|
|
2502
|
-
em({ text }) {
|
|
2503
|
-
return text;
|
|
2504
|
-
}
|
|
2505
|
-
codespan({ text }) {
|
|
2506
|
-
return text;
|
|
2507
|
-
}
|
|
2508
|
-
del({ text }) {
|
|
2509
|
-
return text;
|
|
2510
|
-
}
|
|
2511
|
-
html({ text }) {
|
|
2512
|
-
return text;
|
|
2513
|
-
}
|
|
2514
|
-
text({ text }) {
|
|
2515
|
-
return text;
|
|
2516
|
-
}
|
|
2517
|
-
link({ text }) {
|
|
2518
|
-
return "" + text;
|
|
2519
|
-
}
|
|
2520
|
-
image({ text }) {
|
|
2521
|
-
return "" + text;
|
|
2522
|
-
}
|
|
2523
|
-
br() {
|
|
2524
|
-
return "";
|
|
2525
|
-
}
|
|
2526
|
-
};
|
|
2527
|
-
var _Parser = class __Parser {
|
|
2528
|
-
options;
|
|
2529
|
-
renderer;
|
|
2530
|
-
textRenderer;
|
|
2531
|
-
constructor(options2) {
|
|
2532
|
-
this.options = options2 || _defaults;
|
|
2533
|
-
this.options.renderer = this.options.renderer || new _Renderer();
|
|
2534
|
-
this.renderer = this.options.renderer;
|
|
2535
|
-
this.renderer.options = this.options;
|
|
2536
|
-
this.renderer.parser = this;
|
|
2537
|
-
this.textRenderer = new _TextRenderer();
|
|
2538
|
-
}
|
|
2539
|
-
/**
|
|
2540
|
-
* Static Parse Method
|
|
2541
|
-
*/
|
|
2542
|
-
static parse(tokens, options2) {
|
|
2543
|
-
const parser2 = new __Parser(options2);
|
|
2544
|
-
return parser2.parse(tokens);
|
|
2545
|
-
}
|
|
2546
|
-
/**
|
|
2547
|
-
* Static Parse Inline Method
|
|
2548
|
-
*/
|
|
2549
|
-
static parseInline(tokens, options2) {
|
|
2550
|
-
const parser2 = new __Parser(options2);
|
|
2551
|
-
return parser2.parseInline(tokens);
|
|
2552
|
-
}
|
|
2553
|
-
/**
|
|
2554
|
-
* Parse Loop
|
|
2555
|
-
*/
|
|
2556
|
-
parse(tokens, top = true) {
|
|
2557
|
-
let out = "";
|
|
2558
|
-
for (let i = 0; i < tokens.length; i++) {
|
|
2559
|
-
const anyToken = tokens[i];
|
|
2560
|
-
if (this.options.extensions?.renderers?.[anyToken.type]) {
|
|
2561
|
-
const genericToken = anyToken;
|
|
2562
|
-
const ret = this.options.extensions.renderers[genericToken.type].call({ parser: this }, genericToken);
|
|
2563
|
-
if (ret !== false || !["space", "hr", "heading", "code", "table", "blockquote", "list", "html", "paragraph", "text"].includes(genericToken.type)) {
|
|
2564
|
-
out += ret || "";
|
|
2565
|
-
continue;
|
|
2566
|
-
}
|
|
2567
|
-
}
|
|
2568
|
-
const token = anyToken;
|
|
2569
|
-
switch (token.type) {
|
|
2570
|
-
case "space": {
|
|
2571
|
-
out += this.renderer.space(token);
|
|
2572
|
-
continue;
|
|
2573
|
-
}
|
|
2574
|
-
case "hr": {
|
|
2575
|
-
out += this.renderer.hr(token);
|
|
2576
|
-
continue;
|
|
2577
|
-
}
|
|
2578
|
-
case "heading": {
|
|
2579
|
-
out += this.renderer.heading(token);
|
|
2580
|
-
continue;
|
|
2581
|
-
}
|
|
2582
|
-
case "code": {
|
|
2583
|
-
out += this.renderer.code(token);
|
|
2584
|
-
continue;
|
|
2585
|
-
}
|
|
2586
|
-
case "table": {
|
|
2587
|
-
out += this.renderer.table(token);
|
|
2588
|
-
continue;
|
|
2589
|
-
}
|
|
2590
|
-
case "blockquote": {
|
|
2591
|
-
out += this.renderer.blockquote(token);
|
|
2592
|
-
continue;
|
|
2593
|
-
}
|
|
2594
|
-
case "list": {
|
|
2595
|
-
out += this.renderer.list(token);
|
|
2596
|
-
continue;
|
|
2597
|
-
}
|
|
2598
|
-
case "html": {
|
|
2599
|
-
out += this.renderer.html(token);
|
|
2600
|
-
continue;
|
|
2601
|
-
}
|
|
2602
|
-
case "paragraph": {
|
|
2603
|
-
out += this.renderer.paragraph(token);
|
|
2604
|
-
continue;
|
|
2605
|
-
}
|
|
2606
|
-
case "text": {
|
|
2607
|
-
let textToken = token;
|
|
2608
|
-
let body = this.renderer.text(textToken);
|
|
2609
|
-
while (i + 1 < tokens.length && tokens[i + 1].type === "text") {
|
|
2610
|
-
textToken = tokens[++i];
|
|
2611
|
-
body += "\n" + this.renderer.text(textToken);
|
|
2612
|
-
}
|
|
2613
|
-
if (top) {
|
|
2614
|
-
out += this.renderer.paragraph({
|
|
2615
|
-
type: "paragraph",
|
|
2616
|
-
raw: body,
|
|
2617
|
-
text: body,
|
|
2618
|
-
tokens: [{ type: "text", raw: body, text: body, escaped: true }]
|
|
2619
|
-
});
|
|
2620
|
-
} else {
|
|
2621
|
-
out += body;
|
|
2622
|
-
}
|
|
2623
|
-
continue;
|
|
2624
|
-
}
|
|
2625
|
-
default: {
|
|
2626
|
-
const errMsg = 'Token with "' + token.type + '" type was not found.';
|
|
2627
|
-
if (this.options.silent) {
|
|
2628
|
-
console.error(errMsg);
|
|
2629
|
-
return "";
|
|
2630
|
-
} else {
|
|
2631
|
-
throw new Error(errMsg);
|
|
2632
|
-
}
|
|
2633
|
-
}
|
|
2634
|
-
}
|
|
2635
|
-
}
|
|
2636
|
-
return out;
|
|
2637
|
-
}
|
|
2638
|
-
/**
|
|
2639
|
-
* Parse Inline Tokens
|
|
2640
|
-
*/
|
|
2641
|
-
parseInline(tokens, renderer = this.renderer) {
|
|
2642
|
-
let out = "";
|
|
2643
|
-
for (let i = 0; i < tokens.length; i++) {
|
|
2644
|
-
const anyToken = tokens[i];
|
|
2645
|
-
if (this.options.extensions?.renderers?.[anyToken.type]) {
|
|
2646
|
-
const ret = this.options.extensions.renderers[anyToken.type].call({ parser: this }, anyToken);
|
|
2647
|
-
if (ret !== false || !["escape", "html", "link", "image", "strong", "em", "codespan", "br", "del", "text"].includes(anyToken.type)) {
|
|
2648
|
-
out += ret || "";
|
|
2649
|
-
continue;
|
|
2650
|
-
}
|
|
2651
|
-
}
|
|
2652
|
-
const token = anyToken;
|
|
2653
|
-
switch (token.type) {
|
|
2654
|
-
case "escape": {
|
|
2655
|
-
out += renderer.text(token);
|
|
2656
|
-
break;
|
|
2657
|
-
}
|
|
2658
|
-
case "html": {
|
|
2659
|
-
out += renderer.html(token);
|
|
2660
|
-
break;
|
|
2661
|
-
}
|
|
2662
|
-
case "link": {
|
|
2663
|
-
out += renderer.link(token);
|
|
2664
|
-
break;
|
|
2665
|
-
}
|
|
2666
|
-
case "image": {
|
|
2667
|
-
out += renderer.image(token);
|
|
2668
|
-
break;
|
|
2669
|
-
}
|
|
2670
|
-
case "strong": {
|
|
2671
|
-
out += renderer.strong(token);
|
|
2672
|
-
break;
|
|
2673
|
-
}
|
|
2674
|
-
case "em": {
|
|
2675
|
-
out += renderer.em(token);
|
|
2676
|
-
break;
|
|
2677
|
-
}
|
|
2678
|
-
case "codespan": {
|
|
2679
|
-
out += renderer.codespan(token);
|
|
2680
|
-
break;
|
|
2681
|
-
}
|
|
2682
|
-
case "br": {
|
|
2683
|
-
out += renderer.br(token);
|
|
2684
|
-
break;
|
|
2685
|
-
}
|
|
2686
|
-
case "del": {
|
|
2687
|
-
out += renderer.del(token);
|
|
2688
|
-
break;
|
|
2689
|
-
}
|
|
2690
|
-
case "text": {
|
|
2691
|
-
out += renderer.text(token);
|
|
2692
|
-
break;
|
|
2693
|
-
}
|
|
2694
|
-
default: {
|
|
2695
|
-
const errMsg = 'Token with "' + token.type + '" type was not found.';
|
|
2696
|
-
if (this.options.silent) {
|
|
2697
|
-
console.error(errMsg);
|
|
2698
|
-
return "";
|
|
2699
|
-
} else {
|
|
2700
|
-
throw new Error(errMsg);
|
|
2701
|
-
}
|
|
2702
|
-
}
|
|
2703
|
-
}
|
|
2704
|
-
}
|
|
2705
|
-
return out;
|
|
2706
|
-
}
|
|
2707
|
-
};
|
|
2708
|
-
var _Hooks = class {
|
|
2709
|
-
options;
|
|
2710
|
-
block;
|
|
2711
|
-
constructor(options2) {
|
|
2712
|
-
this.options = options2 || _defaults;
|
|
2713
|
-
}
|
|
2714
|
-
static passThroughHooks = /* @__PURE__ */ new Set([
|
|
2715
|
-
"preprocess",
|
|
2716
|
-
"postprocess",
|
|
2717
|
-
"processAllTokens"
|
|
2718
|
-
]);
|
|
2719
|
-
/**
|
|
2720
|
-
* Process markdown before marked
|
|
2721
|
-
*/
|
|
2722
|
-
preprocess(markdown) {
|
|
2723
|
-
return markdown;
|
|
2724
|
-
}
|
|
2725
|
-
/**
|
|
2726
|
-
* Process HTML after marked is finished
|
|
2727
|
-
*/
|
|
2728
|
-
postprocess(html2) {
|
|
2729
|
-
return html2;
|
|
2730
|
-
}
|
|
2731
|
-
/**
|
|
2732
|
-
* Process all tokens before walk tokens
|
|
2733
|
-
*/
|
|
2734
|
-
processAllTokens(tokens) {
|
|
2735
|
-
return tokens;
|
|
2736
|
-
}
|
|
2737
|
-
/**
|
|
2738
|
-
* Provide function to tokenize markdown
|
|
2739
|
-
*/
|
|
2740
|
-
provideLexer() {
|
|
2741
|
-
return this.block ? _Lexer.lex : _Lexer.lexInline;
|
|
2742
|
-
}
|
|
2743
|
-
/**
|
|
2744
|
-
* Provide function to parse tokens
|
|
2745
|
-
*/
|
|
2746
|
-
provideParser() {
|
|
2747
|
-
return this.block ? _Parser.parse : _Parser.parseInline;
|
|
2748
|
-
}
|
|
2749
|
-
};
|
|
2750
|
-
var Marked = class {
|
|
2751
|
-
defaults = _getDefaults();
|
|
2752
|
-
options = this.setOptions;
|
|
2753
|
-
parse = this.parseMarkdown(true);
|
|
2754
|
-
parseInline = this.parseMarkdown(false);
|
|
2755
|
-
Parser = _Parser;
|
|
2756
|
-
Renderer = _Renderer;
|
|
2757
|
-
TextRenderer = _TextRenderer;
|
|
2758
|
-
Lexer = _Lexer;
|
|
2759
|
-
Tokenizer = _Tokenizer;
|
|
2760
|
-
Hooks = _Hooks;
|
|
2761
|
-
constructor(...args) {
|
|
2762
|
-
this.use(...args);
|
|
2763
|
-
}
|
|
2764
|
-
/**
|
|
2765
|
-
* Run callback for every token
|
|
2766
|
-
*/
|
|
2767
|
-
walkTokens(tokens, callback) {
|
|
2768
|
-
let values = [];
|
|
2769
|
-
for (const token of tokens) {
|
|
2770
|
-
values = values.concat(callback.call(this, token));
|
|
2771
|
-
switch (token.type) {
|
|
2772
|
-
case "table": {
|
|
2773
|
-
const tableToken = token;
|
|
2774
|
-
for (const cell of tableToken.header) {
|
|
2775
|
-
values = values.concat(this.walkTokens(cell.tokens, callback));
|
|
2776
|
-
}
|
|
2777
|
-
for (const row of tableToken.rows) {
|
|
2778
|
-
for (const cell of row) {
|
|
2779
|
-
values = values.concat(this.walkTokens(cell.tokens, callback));
|
|
2780
|
-
}
|
|
2781
|
-
}
|
|
2782
|
-
break;
|
|
2783
|
-
}
|
|
2784
|
-
case "list": {
|
|
2785
|
-
const listToken = token;
|
|
2786
|
-
values = values.concat(this.walkTokens(listToken.items, callback));
|
|
2787
|
-
break;
|
|
2788
|
-
}
|
|
2789
|
-
default: {
|
|
2790
|
-
const genericToken = token;
|
|
2791
|
-
if (this.defaults.extensions?.childTokens?.[genericToken.type]) {
|
|
2792
|
-
this.defaults.extensions.childTokens[genericToken.type].forEach((childTokens) => {
|
|
2793
|
-
const tokens2 = genericToken[childTokens].flat(Infinity);
|
|
2794
|
-
values = values.concat(this.walkTokens(tokens2, callback));
|
|
2795
|
-
});
|
|
2796
|
-
} else if (genericToken.tokens) {
|
|
2797
|
-
values = values.concat(this.walkTokens(genericToken.tokens, callback));
|
|
2798
|
-
}
|
|
2799
|
-
}
|
|
2800
|
-
}
|
|
3
|
+
import { join as join6, dirname as dirname4 } from "path";
|
|
4
|
+
import { fileURLToPath as fileURLToPath4 } from "url";
|
|
5
|
+
import { execSync } from "child_process";
|
|
6
|
+
|
|
7
|
+
// src/sdk/kyma-interactive-mode.ts
|
|
8
|
+
import {
|
|
9
|
+
InteractiveMode
|
|
10
|
+
} from "@mariozechner/pi-coding-agent";
|
|
11
|
+
import { CombinedAutocompleteProvider } from "@mariozechner/pi-tui";
|
|
12
|
+
|
|
13
|
+
// src/sdk/pi-internals.ts
|
|
14
|
+
import { createRequire } from "module";
|
|
15
|
+
var EXPECTED_PI_MAJOR = 0;
|
|
16
|
+
var EXPECTED_PI_MINOR = 66;
|
|
17
|
+
function checkPiVersion() {
|
|
18
|
+
try {
|
|
19
|
+
const require2 = createRequire(import.meta.url);
|
|
20
|
+
const pkg = require2("@mariozechner/pi-coding-agent/package.json");
|
|
21
|
+
const [major, minor] = pkg.version.split(".").map(Number);
|
|
22
|
+
if (major !== EXPECTED_PI_MAJOR || minor !== EXPECTED_PI_MINOR) {
|
|
23
|
+
console.error(
|
|
24
|
+
`[kyma] Warning: Pi SDK ${pkg.version} detected, expected ${EXPECTED_PI_MAJOR}.${EXPECTED_PI_MINOR}.x. Autocomplete customization may not work correctly.`
|
|
25
|
+
);
|
|
2801
26
|
}
|
|
2802
|
-
|
|
2803
|
-
}
|
|
2804
|
-
use(...args) {
|
|
2805
|
-
const extensions = this.defaults.extensions || { renderers: {}, childTokens: {} };
|
|
2806
|
-
args.forEach((pack) => {
|
|
2807
|
-
const opts = { ...pack };
|
|
2808
|
-
opts.async = this.defaults.async || opts.async || false;
|
|
2809
|
-
if (pack.extensions) {
|
|
2810
|
-
pack.extensions.forEach((ext) => {
|
|
2811
|
-
if (!ext.name) {
|
|
2812
|
-
throw new Error("extension name required");
|
|
2813
|
-
}
|
|
2814
|
-
if ("renderer" in ext) {
|
|
2815
|
-
const prevRenderer = extensions.renderers[ext.name];
|
|
2816
|
-
if (prevRenderer) {
|
|
2817
|
-
extensions.renderers[ext.name] = function(...args2) {
|
|
2818
|
-
let ret = ext.renderer.apply(this, args2);
|
|
2819
|
-
if (ret === false) {
|
|
2820
|
-
ret = prevRenderer.apply(this, args2);
|
|
2821
|
-
}
|
|
2822
|
-
return ret;
|
|
2823
|
-
};
|
|
2824
|
-
} else {
|
|
2825
|
-
extensions.renderers[ext.name] = ext.renderer;
|
|
2826
|
-
}
|
|
2827
|
-
}
|
|
2828
|
-
if ("tokenizer" in ext) {
|
|
2829
|
-
if (!ext.level || ext.level !== "block" && ext.level !== "inline") {
|
|
2830
|
-
throw new Error("extension level must be 'block' or 'inline'");
|
|
2831
|
-
}
|
|
2832
|
-
const extLevel = extensions[ext.level];
|
|
2833
|
-
if (extLevel) {
|
|
2834
|
-
extLevel.unshift(ext.tokenizer);
|
|
2835
|
-
} else {
|
|
2836
|
-
extensions[ext.level] = [ext.tokenizer];
|
|
2837
|
-
}
|
|
2838
|
-
if (ext.start) {
|
|
2839
|
-
if (ext.level === "block") {
|
|
2840
|
-
if (extensions.startBlock) {
|
|
2841
|
-
extensions.startBlock.push(ext.start);
|
|
2842
|
-
} else {
|
|
2843
|
-
extensions.startBlock = [ext.start];
|
|
2844
|
-
}
|
|
2845
|
-
} else if (ext.level === "inline") {
|
|
2846
|
-
if (extensions.startInline) {
|
|
2847
|
-
extensions.startInline.push(ext.start);
|
|
2848
|
-
} else {
|
|
2849
|
-
extensions.startInline = [ext.start];
|
|
2850
|
-
}
|
|
2851
|
-
}
|
|
2852
|
-
}
|
|
2853
|
-
}
|
|
2854
|
-
if ("childTokens" in ext && ext.childTokens) {
|
|
2855
|
-
extensions.childTokens[ext.name] = ext.childTokens;
|
|
2856
|
-
}
|
|
2857
|
-
});
|
|
2858
|
-
opts.extensions = extensions;
|
|
2859
|
-
}
|
|
2860
|
-
if (pack.renderer) {
|
|
2861
|
-
const renderer = this.defaults.renderer || new _Renderer(this.defaults);
|
|
2862
|
-
for (const prop in pack.renderer) {
|
|
2863
|
-
if (!(prop in renderer)) {
|
|
2864
|
-
throw new Error(`renderer '${prop}' does not exist`);
|
|
2865
|
-
}
|
|
2866
|
-
if (["options", "parser"].includes(prop)) {
|
|
2867
|
-
continue;
|
|
2868
|
-
}
|
|
2869
|
-
const rendererProp = prop;
|
|
2870
|
-
const rendererFunc = pack.renderer[rendererProp];
|
|
2871
|
-
const prevRenderer = renderer[rendererProp];
|
|
2872
|
-
renderer[rendererProp] = (...args2) => {
|
|
2873
|
-
let ret = rendererFunc.apply(renderer, args2);
|
|
2874
|
-
if (ret === false) {
|
|
2875
|
-
ret = prevRenderer.apply(renderer, args2);
|
|
2876
|
-
}
|
|
2877
|
-
return ret || "";
|
|
2878
|
-
};
|
|
2879
|
-
}
|
|
2880
|
-
opts.renderer = renderer;
|
|
2881
|
-
}
|
|
2882
|
-
if (pack.tokenizer) {
|
|
2883
|
-
const tokenizer = this.defaults.tokenizer || new _Tokenizer(this.defaults);
|
|
2884
|
-
for (const prop in pack.tokenizer) {
|
|
2885
|
-
if (!(prop in tokenizer)) {
|
|
2886
|
-
throw new Error(`tokenizer '${prop}' does not exist`);
|
|
2887
|
-
}
|
|
2888
|
-
if (["options", "rules", "lexer"].includes(prop)) {
|
|
2889
|
-
continue;
|
|
2890
|
-
}
|
|
2891
|
-
const tokenizerProp = prop;
|
|
2892
|
-
const tokenizerFunc = pack.tokenizer[tokenizerProp];
|
|
2893
|
-
const prevTokenizer = tokenizer[tokenizerProp];
|
|
2894
|
-
tokenizer[tokenizerProp] = (...args2) => {
|
|
2895
|
-
let ret = tokenizerFunc.apply(tokenizer, args2);
|
|
2896
|
-
if (ret === false) {
|
|
2897
|
-
ret = prevTokenizer.apply(tokenizer, args2);
|
|
2898
|
-
}
|
|
2899
|
-
return ret;
|
|
2900
|
-
};
|
|
2901
|
-
}
|
|
2902
|
-
opts.tokenizer = tokenizer;
|
|
2903
|
-
}
|
|
2904
|
-
if (pack.hooks) {
|
|
2905
|
-
const hooks = this.defaults.hooks || new _Hooks();
|
|
2906
|
-
for (const prop in pack.hooks) {
|
|
2907
|
-
if (!(prop in hooks)) {
|
|
2908
|
-
throw new Error(`hook '${prop}' does not exist`);
|
|
2909
|
-
}
|
|
2910
|
-
if (["options", "block"].includes(prop)) {
|
|
2911
|
-
continue;
|
|
2912
|
-
}
|
|
2913
|
-
const hooksProp = prop;
|
|
2914
|
-
const hooksFunc = pack.hooks[hooksProp];
|
|
2915
|
-
const prevHook = hooks[hooksProp];
|
|
2916
|
-
if (_Hooks.passThroughHooks.has(prop)) {
|
|
2917
|
-
hooks[hooksProp] = (arg) => {
|
|
2918
|
-
if (this.defaults.async) {
|
|
2919
|
-
return Promise.resolve(hooksFunc.call(hooks, arg)).then((ret2) => {
|
|
2920
|
-
return prevHook.call(hooks, ret2);
|
|
2921
|
-
});
|
|
2922
|
-
}
|
|
2923
|
-
const ret = hooksFunc.call(hooks, arg);
|
|
2924
|
-
return prevHook.call(hooks, ret);
|
|
2925
|
-
};
|
|
2926
|
-
} else {
|
|
2927
|
-
hooks[hooksProp] = (...args2) => {
|
|
2928
|
-
let ret = hooksFunc.apply(hooks, args2);
|
|
2929
|
-
if (ret === false) {
|
|
2930
|
-
ret = prevHook.apply(hooks, args2);
|
|
2931
|
-
}
|
|
2932
|
-
return ret;
|
|
2933
|
-
};
|
|
2934
|
-
}
|
|
2935
|
-
}
|
|
2936
|
-
opts.hooks = hooks;
|
|
2937
|
-
}
|
|
2938
|
-
if (pack.walkTokens) {
|
|
2939
|
-
const walkTokens2 = this.defaults.walkTokens;
|
|
2940
|
-
const packWalktokens = pack.walkTokens;
|
|
2941
|
-
opts.walkTokens = function(token) {
|
|
2942
|
-
let values = [];
|
|
2943
|
-
values.push(packWalktokens.call(this, token));
|
|
2944
|
-
if (walkTokens2) {
|
|
2945
|
-
values = values.concat(walkTokens2.call(this, token));
|
|
2946
|
-
}
|
|
2947
|
-
return values;
|
|
2948
|
-
};
|
|
2949
|
-
}
|
|
2950
|
-
this.defaults = { ...this.defaults, ...opts };
|
|
2951
|
-
});
|
|
2952
|
-
return this;
|
|
2953
|
-
}
|
|
2954
|
-
setOptions(opt) {
|
|
2955
|
-
this.defaults = { ...this.defaults, ...opt };
|
|
2956
|
-
return this;
|
|
2957
|
-
}
|
|
2958
|
-
lexer(src, options2) {
|
|
2959
|
-
return _Lexer.lex(src, options2 ?? this.defaults);
|
|
2960
|
-
}
|
|
2961
|
-
parser(tokens, options2) {
|
|
2962
|
-
return _Parser.parse(tokens, options2 ?? this.defaults);
|
|
2963
|
-
}
|
|
2964
|
-
parseMarkdown(blockType) {
|
|
2965
|
-
const parse2 = (src, options2) => {
|
|
2966
|
-
const origOpt = { ...options2 };
|
|
2967
|
-
const opt = { ...this.defaults, ...origOpt };
|
|
2968
|
-
const throwError = this.onError(!!opt.silent, !!opt.async);
|
|
2969
|
-
if (this.defaults.async === true && origOpt.async === false) {
|
|
2970
|
-
return throwError(new Error("marked(): The async option was set to true by an extension. Remove async: false from the parse options object to return a Promise."));
|
|
2971
|
-
}
|
|
2972
|
-
if (typeof src === "undefined" || src === null) {
|
|
2973
|
-
return throwError(new Error("marked(): input parameter is undefined or null"));
|
|
2974
|
-
}
|
|
2975
|
-
if (typeof src !== "string") {
|
|
2976
|
-
return throwError(new Error("marked(): input parameter is of type " + Object.prototype.toString.call(src) + ", string expected"));
|
|
2977
|
-
}
|
|
2978
|
-
if (opt.hooks) {
|
|
2979
|
-
opt.hooks.options = opt;
|
|
2980
|
-
opt.hooks.block = blockType;
|
|
2981
|
-
}
|
|
2982
|
-
const lexer2 = opt.hooks ? opt.hooks.provideLexer() : blockType ? _Lexer.lex : _Lexer.lexInline;
|
|
2983
|
-
const parser2 = opt.hooks ? opt.hooks.provideParser() : blockType ? _Parser.parse : _Parser.parseInline;
|
|
2984
|
-
if (opt.async) {
|
|
2985
|
-
return Promise.resolve(opt.hooks ? opt.hooks.preprocess(src) : src).then((src2) => lexer2(src2, opt)).then((tokens) => opt.hooks ? opt.hooks.processAllTokens(tokens) : tokens).then((tokens) => opt.walkTokens ? Promise.all(this.walkTokens(tokens, opt.walkTokens)).then(() => tokens) : tokens).then((tokens) => parser2(tokens, opt)).then((html2) => opt.hooks ? opt.hooks.postprocess(html2) : html2).catch(throwError);
|
|
2986
|
-
}
|
|
2987
|
-
try {
|
|
2988
|
-
if (opt.hooks) {
|
|
2989
|
-
src = opt.hooks.preprocess(src);
|
|
2990
|
-
}
|
|
2991
|
-
let tokens = lexer2(src, opt);
|
|
2992
|
-
if (opt.hooks) {
|
|
2993
|
-
tokens = opt.hooks.processAllTokens(tokens);
|
|
2994
|
-
}
|
|
2995
|
-
if (opt.walkTokens) {
|
|
2996
|
-
this.walkTokens(tokens, opt.walkTokens);
|
|
2997
|
-
}
|
|
2998
|
-
let html2 = parser2(tokens, opt);
|
|
2999
|
-
if (opt.hooks) {
|
|
3000
|
-
html2 = opt.hooks.postprocess(html2);
|
|
3001
|
-
}
|
|
3002
|
-
return html2;
|
|
3003
|
-
} catch (e) {
|
|
3004
|
-
return throwError(e);
|
|
3005
|
-
}
|
|
3006
|
-
};
|
|
3007
|
-
return parse2;
|
|
3008
|
-
}
|
|
3009
|
-
onError(silent, async) {
|
|
3010
|
-
return (e) => {
|
|
3011
|
-
e.message += "\nPlease report this to https://github.com/markedjs/marked.";
|
|
3012
|
-
if (silent) {
|
|
3013
|
-
const msg = "<p>An error occurred:</p><pre>" + escape2(e.message + "", true) + "</pre>";
|
|
3014
|
-
if (async) {
|
|
3015
|
-
return Promise.resolve(msg);
|
|
3016
|
-
}
|
|
3017
|
-
return msg;
|
|
3018
|
-
}
|
|
3019
|
-
if (async) {
|
|
3020
|
-
return Promise.reject(e);
|
|
3021
|
-
}
|
|
3022
|
-
throw e;
|
|
3023
|
-
};
|
|
27
|
+
} catch {
|
|
3024
28
|
}
|
|
3025
|
-
};
|
|
3026
|
-
var markedInstance = new Marked();
|
|
3027
|
-
function marked(src, opt) {
|
|
3028
|
-
return markedInstance.parse(src, opt);
|
|
3029
29
|
}
|
|
3030
|
-
|
|
3031
|
-
|
|
3032
|
-
|
|
3033
|
-
|
|
3034
|
-
return
|
|
3035
|
-
}
|
|
3036
|
-
|
|
3037
|
-
|
|
3038
|
-
|
|
3039
|
-
|
|
3040
|
-
|
|
3041
|
-
|
|
3042
|
-
|
|
3043
|
-
|
|
3044
|
-
|
|
3045
|
-
|
|
3046
|
-
|
|
3047
|
-
|
|
3048
|
-
|
|
3049
|
-
|
|
3050
|
-
|
|
3051
|
-
|
|
3052
|
-
|
|
3053
|
-
|
|
3054
|
-
marked.Tokenizer = _Tokenizer;
|
|
3055
|
-
marked.Hooks = _Hooks;
|
|
3056
|
-
marked.parse = marked;
|
|
3057
|
-
var options = marked.options;
|
|
3058
|
-
var setOptions = marked.setOptions;
|
|
3059
|
-
var use = marked.use;
|
|
3060
|
-
var walkTokens = marked.walkTokens;
|
|
3061
|
-
var parseInline = marked.parseInline;
|
|
3062
|
-
var parser = _Parser.parse;
|
|
3063
|
-
var lexer = _Lexer.lex;
|
|
3064
|
-
|
|
3065
|
-
// node_modules/@mariozechner/pi-tui/dist/terminal.js
|
|
3066
|
-
import * as fs2 from "fs";
|
|
3067
|
-
import { createRequire } from "module";
|
|
3068
|
-
import * as path2 from "path";
|
|
3069
|
-
var cjsRequire = createRequire(import.meta.url);
|
|
30
|
+
function getSession(im) {
|
|
31
|
+
return im.session;
|
|
32
|
+
}
|
|
33
|
+
function getSkillCommands(im) {
|
|
34
|
+
return im.skillCommands;
|
|
35
|
+
}
|
|
36
|
+
function getSettingsManager(im) {
|
|
37
|
+
return im.settingsManager;
|
|
38
|
+
}
|
|
39
|
+
function getSessionManager(im) {
|
|
40
|
+
return im.sessionManager;
|
|
41
|
+
}
|
|
42
|
+
function getDefaultEditor(im) {
|
|
43
|
+
return im.defaultEditor;
|
|
44
|
+
}
|
|
45
|
+
function getEditor(im) {
|
|
46
|
+
return im.editor;
|
|
47
|
+
}
|
|
48
|
+
function setAutocompleteProvider(im, provider) {
|
|
49
|
+
im.autocompleteProvider = provider;
|
|
50
|
+
}
|
|
51
|
+
function overrideSetupAutocomplete(im, fn) {
|
|
52
|
+
im.setupAutocomplete = fn;
|
|
53
|
+
}
|
|
3070
54
|
|
|
3071
55
|
// src/sdk/kyma-interactive-mode.ts
|
|
3072
56
|
var KymaInteractiveMode = class extends InteractiveMode {
|
|
3073
|
-
constructor(runtimeHost,
|
|
3074
|
-
super(runtimeHost,
|
|
3075
|
-
|
|
3076
|
-
|
|
57
|
+
constructor(runtimeHost, options) {
|
|
58
|
+
super(runtimeHost, options);
|
|
59
|
+
checkPiVersion();
|
|
60
|
+
overrideSetupAutocomplete(this, (fdPath) => {
|
|
3077
61
|
this.kymaSetupAutocomplete(fdPath);
|
|
3078
|
-
};
|
|
62
|
+
});
|
|
3079
63
|
}
|
|
3080
64
|
/**
|
|
3081
65
|
* Kyma autocomplete setup — excludes Pi built-in commands.
|
|
@@ -3085,8 +69,7 @@ var KymaInteractiveMode = class extends InteractiveMode {
|
|
|
3085
69
|
* Extension commands are Kyma's /connect, /models, /mode, /status, etc.
|
|
3086
70
|
*/
|
|
3087
71
|
kymaSetupAutocomplete(fdPath) {
|
|
3088
|
-
const
|
|
3089
|
-
const session = self.session;
|
|
72
|
+
const session = getSession(this);
|
|
3090
73
|
const extensionCommands = (session.extensionRunner?.getRegisteredCommands() ?? []).map((cmd) => ({
|
|
3091
74
|
name: cmd.invocationName,
|
|
3092
75
|
description: cmd.description,
|
|
@@ -3098,60 +81,64 @@ var KymaInteractiveMode = class extends InteractiveMode {
|
|
|
3098
81
|
description: cmd.description
|
|
3099
82
|
})
|
|
3100
83
|
);
|
|
3101
|
-
|
|
84
|
+
const skillCommands = getSkillCommands(this);
|
|
85
|
+
skillCommands.clear();
|
|
3102
86
|
const skillCommandList = [];
|
|
3103
|
-
if (
|
|
87
|
+
if (getSettingsManager(this).getEnableSkillCommands()) {
|
|
3104
88
|
for (const skill of session.resourceLoader.getSkills().skills) {
|
|
3105
89
|
const commandName = `skill:${skill.name}`;
|
|
3106
|
-
|
|
90
|
+
skillCommands.set(commandName, skill.filePath);
|
|
3107
91
|
skillCommandList.push({
|
|
3108
92
|
name: commandName,
|
|
3109
93
|
description: skill.description
|
|
3110
94
|
});
|
|
3111
95
|
}
|
|
3112
96
|
}
|
|
3113
|
-
|
|
97
|
+
const provider = new CombinedAutocompleteProvider(
|
|
3114
98
|
[...extensionCommands, ...templateCommands, ...skillCommandList],
|
|
3115
|
-
|
|
99
|
+
getSessionManager(this).getCwd(),
|
|
3116
100
|
fdPath
|
|
3117
101
|
);
|
|
3118
|
-
|
|
3119
|
-
|
|
3120
|
-
|
|
102
|
+
setAutocompleteProvider(this, provider);
|
|
103
|
+
const defaultEditor = getDefaultEditor(this);
|
|
104
|
+
defaultEditor.setAutocompleteProvider(provider);
|
|
105
|
+
const editor = getEditor(this);
|
|
106
|
+
if (editor !== defaultEditor) {
|
|
107
|
+
editor.setAutocompleteProvider?.(provider);
|
|
3121
108
|
}
|
|
3122
109
|
}
|
|
3123
110
|
};
|
|
3124
111
|
|
|
3125
112
|
// src/sdk/onboarding.ts
|
|
3126
|
-
import { existsSync as existsSync2, mkdirSync
|
|
113
|
+
import { existsSync as existsSync2, mkdirSync, readFileSync as readFileSync3, writeFileSync as writeFileSync2, copyFileSync } from "fs";
|
|
3127
114
|
import { createInterface } from "readline";
|
|
3128
|
-
import { join as
|
|
115
|
+
import { join as join3, dirname as dirname2 } from "path";
|
|
3129
116
|
import { fileURLToPath as fileURLToPath2 } from "url";
|
|
3130
117
|
|
|
3131
118
|
// src/sdk/paths.ts
|
|
3132
|
-
import { join
|
|
3133
|
-
import { homedir
|
|
3134
|
-
var KYMA_DIR =
|
|
3135
|
-
var KYMA_AGENT_DIR =
|
|
3136
|
-
var KYMA_AUTH_PATH =
|
|
3137
|
-
var KYMA_SETTINGS_PATH =
|
|
3138
|
-
var KYMA_ONBOARDED_PATH =
|
|
119
|
+
import { join } from "path";
|
|
120
|
+
import { homedir } from "os";
|
|
121
|
+
var KYMA_DIR = join(homedir(), ".kyma");
|
|
122
|
+
var KYMA_AGENT_DIR = join(KYMA_DIR, "agent");
|
|
123
|
+
var KYMA_AUTH_PATH = join(KYMA_AGENT_DIR, "auth.json");
|
|
124
|
+
var KYMA_SETTINGS_PATH = join(KYMA_AGENT_DIR, "settings.json");
|
|
125
|
+
var KYMA_ONBOARDED_PATH = join(KYMA_AGENT_DIR, ".onboarded");
|
|
3139
126
|
var KYMA_BASE_URL = "https://kymaapi.com";
|
|
3140
127
|
|
|
3141
128
|
// src/sdk/auth.ts
|
|
3142
|
-
import { readFileSync as readFileSync2, writeFileSync
|
|
129
|
+
import { readFileSync as readFileSync2, writeFileSync } from "fs";
|
|
3143
130
|
import { exec as exec2 } from "child_process";
|
|
3144
131
|
|
|
3145
132
|
// src/sdk/api.ts
|
|
3146
133
|
import { readFileSync } from "fs";
|
|
3147
|
-
import { join as
|
|
134
|
+
import { join as join2, dirname } from "path";
|
|
3148
135
|
import { fileURLToPath } from "url";
|
|
3149
136
|
import { exec } from "child_process";
|
|
3150
137
|
import gradient from "gradient-string";
|
|
3151
|
-
var PKG_DIR = process.env.PI_PACKAGE_DIR ||
|
|
138
|
+
var PKG_DIR = process.env.PI_PACKAGE_DIR || dirname(dirname(dirname(fileURLToPath(import.meta.url))));
|
|
3152
139
|
var VERSION = (() => {
|
|
3153
140
|
try {
|
|
3154
|
-
return JSON.parse(readFileSync(
|
|
141
|
+
return JSON.parse(readFileSync(join2(PKG_DIR, "package.json"), "utf-8")).version;
|
|
3155
142
|
} catch {
|
|
3156
143
|
return "0.1.0";
|
|
3157
144
|
}
|
|
@@ -3172,8 +159,8 @@ function normalizeKymaError(status, body) {
|
|
|
3172
159
|
return { code: status, severity: "error", message: `Kyma API error ${status}.`, action: body };
|
|
3173
160
|
}
|
|
3174
161
|
}
|
|
3175
|
-
async function kymaApi(
|
|
3176
|
-
const res = await fetch(`${KYMA_BASE_URL}${
|
|
162
|
+
async function kymaApi(path, apiKey) {
|
|
163
|
+
const res = await fetch(`${KYMA_BASE_URL}${path}`, {
|
|
3177
164
|
headers: {
|
|
3178
165
|
Authorization: `Bearer ${apiKey}`,
|
|
3179
166
|
"X-App-Name": "kyma-agent",
|
|
@@ -3267,13 +254,13 @@ function saveKymaCredentials(credentials) {
|
|
|
3267
254
|
} catch {
|
|
3268
255
|
}
|
|
3269
256
|
auth.kyma = { type: "oauth", ...credentials };
|
|
3270
|
-
|
|
257
|
+
writeFileSync(KYMA_AUTH_PATH, JSON.stringify(auth, null, 2), { mode: 384 });
|
|
3271
258
|
}
|
|
3272
259
|
function clearKymaCredentials() {
|
|
3273
260
|
try {
|
|
3274
261
|
const auth = JSON.parse(readFileSync2(KYMA_AUTH_PATH, "utf-8"));
|
|
3275
262
|
delete auth.kyma;
|
|
3276
|
-
|
|
263
|
+
writeFileSync(KYMA_AUTH_PATH, JSON.stringify(auth, null, 2), { mode: 384 });
|
|
3277
264
|
} catch {
|
|
3278
265
|
}
|
|
3279
266
|
}
|
|
@@ -3368,25 +355,26 @@ async function loginKymaStandalone() {
|
|
|
3368
355
|
}
|
|
3369
356
|
|
|
3370
357
|
// src/sdk/onboarding.ts
|
|
3371
|
-
var KYMA_PKG_THEMES =
|
|
358
|
+
var KYMA_PKG_THEMES = join3(process.env.PI_PACKAGE_DIR || dirname2(dirname2(fileURLToPath2(import.meta.url))), "themes");
|
|
3372
359
|
function ensureAgentDir() {
|
|
3373
360
|
if (!existsSync2(KYMA_AGENT_DIR)) {
|
|
3374
|
-
|
|
361
|
+
mkdirSync(KYMA_AGENT_DIR, { recursive: true, mode: 448 });
|
|
3375
362
|
}
|
|
3376
|
-
const themesDir =
|
|
3377
|
-
if (!existsSync2(themesDir))
|
|
3378
|
-
const themeSrc =
|
|
3379
|
-
const themeDst =
|
|
363
|
+
const themesDir = join3(KYMA_AGENT_DIR, "themes");
|
|
364
|
+
if (!existsSync2(themesDir)) mkdirSync(themesDir, { recursive: true });
|
|
365
|
+
const themeSrc = join3(KYMA_PKG_THEMES, "kyma-dark.json");
|
|
366
|
+
const themeDst = join3(themesDir, "kyma-dark.json");
|
|
3380
367
|
try {
|
|
3381
368
|
copyFileSync(themeSrc, themeDst);
|
|
3382
369
|
} catch {
|
|
3383
370
|
}
|
|
3384
371
|
if (!existsSync2(KYMA_SETTINGS_PATH)) {
|
|
3385
|
-
|
|
372
|
+
writeFileSync2(KYMA_SETTINGS_PATH, JSON.stringify({
|
|
3386
373
|
defaultProvider: "kyma",
|
|
3387
374
|
defaultModel: "qwen-3-32b",
|
|
3388
375
|
quietStartup: true,
|
|
3389
|
-
theme: "kyma-dark"
|
|
376
|
+
theme: "kyma-dark",
|
|
377
|
+
thinkingLevel: "off"
|
|
3390
378
|
}, null, 2), { mode: 384 });
|
|
3391
379
|
} else {
|
|
3392
380
|
try {
|
|
@@ -3408,8 +396,12 @@ function ensureAgentDir() {
|
|
|
3408
396
|
settings.theme = "kyma-dark";
|
|
3409
397
|
changed = true;
|
|
3410
398
|
}
|
|
399
|
+
if (settings.thinkingLevel !== "off") {
|
|
400
|
+
settings.thinkingLevel = "off";
|
|
401
|
+
changed = true;
|
|
402
|
+
}
|
|
3411
403
|
if (changed) {
|
|
3412
|
-
|
|
404
|
+
writeFileSync2(KYMA_SETTINGS_PATH, JSON.stringify(settings, null, 2), { mode: 384 });
|
|
3413
405
|
}
|
|
3414
406
|
} catch {
|
|
3415
407
|
}
|
|
@@ -3479,7 +471,7 @@ async function runOnboarding() {
|
|
|
3479
471
|
}
|
|
3480
472
|
function markOnboarded() {
|
|
3481
473
|
try {
|
|
3482
|
-
|
|
474
|
+
writeFileSync2(KYMA_ONBOARDED_PATH, (/* @__PURE__ */ new Date()).toISOString(), { mode: 384 });
|
|
3483
475
|
} catch {
|
|
3484
476
|
}
|
|
3485
477
|
}
|
|
@@ -3494,17 +486,17 @@ import {
|
|
|
3494
486
|
SettingsManager,
|
|
3495
487
|
SessionManager
|
|
3496
488
|
} from "@mariozechner/pi-coding-agent";
|
|
3497
|
-
import { join as
|
|
489
|
+
import { join as join4, dirname as dirname3 } from "path";
|
|
3498
490
|
import { fileURLToPath as fileURLToPath3 } from "url";
|
|
3499
|
-
var KYMA_THEMES_DIR =
|
|
3500
|
-
var KYMA_SESSIONS_DIR =
|
|
3501
|
-
async function createKymaSession(
|
|
3502
|
-
const { cwd, extensionFactories } =
|
|
491
|
+
var KYMA_THEMES_DIR = join4(process.env.PI_PACKAGE_DIR || dirname3(dirname3(fileURLToPath3(import.meta.url))), "themes");
|
|
492
|
+
var KYMA_SESSIONS_DIR = join4(KYMA_AGENT_DIR, "sessions");
|
|
493
|
+
async function createKymaSession(options) {
|
|
494
|
+
const { cwd, extensionFactories } = options;
|
|
3503
495
|
const agentDir = KYMA_AGENT_DIR;
|
|
3504
496
|
const authStorage = AuthStorage.fromStorage(
|
|
3505
497
|
new FileAuthStorageBackend(KYMA_AUTH_PATH)
|
|
3506
498
|
);
|
|
3507
|
-
const sessionManager =
|
|
499
|
+
const sessionManager = options.continueSession ? SessionManager.continueRecent(cwd, KYMA_SESSIONS_DIR) : SessionManager.create(cwd, KYMA_SESSIONS_DIR);
|
|
3508
500
|
const createRuntime = async (factoryOpts) => {
|
|
3509
501
|
const services = await createAgentSessionServices({
|
|
3510
502
|
cwd: factoryOpts.cwd,
|
|
@@ -3535,8 +527,8 @@ async function createKymaSession(options2) {
|
|
|
3535
527
|
sessionManager
|
|
3536
528
|
});
|
|
3537
529
|
const interactiveOptions = {};
|
|
3538
|
-
if (
|
|
3539
|
-
interactiveOptions.initialMessage =
|
|
530
|
+
if (options.initialMessage) {
|
|
531
|
+
interactiveOptions.initialMessage = options.initialMessage;
|
|
3540
532
|
}
|
|
3541
533
|
if (runtime.modelFallbackMessage) {
|
|
3542
534
|
interactiveOptions.modelFallbackMessage = runtime.modelFallbackMessage;
|
|
@@ -3545,8 +537,8 @@ async function createKymaSession(options2) {
|
|
|
3545
537
|
}
|
|
3546
538
|
|
|
3547
539
|
// src/sdk/extension.ts
|
|
3548
|
-
import { existsSync as existsSync3, readFileSync as readFileSync4, writeFileSync as
|
|
3549
|
-
import { join as
|
|
540
|
+
import { existsSync as existsSync3, readFileSync as readFileSync4, writeFileSync as writeFileSync3 } from "fs";
|
|
541
|
+
import { join as join5 } from "path";
|
|
3550
542
|
|
|
3551
543
|
// src/sdk/config.ts
|
|
3552
544
|
function parseKymaConfig(raw) {
|
|
@@ -3782,6 +774,7 @@ var kymaRuntimeFactory = (pi) => {
|
|
|
3782
774
|
sessionCost = 0;
|
|
3783
775
|
sessionTokens = 0;
|
|
3784
776
|
turnCount = 0;
|
|
777
|
+
pi.setThinkingLevel?.("off");
|
|
3785
778
|
if (!ctx.hasUI) return;
|
|
3786
779
|
const email = getKymaEmail();
|
|
3787
780
|
const apiKey = getKymaApiKey();
|
|
@@ -3808,17 +801,17 @@ var kymaRuntimeFactory = (pi) => {
|
|
|
3808
801
|
const isOnboarded = existsSync3(KYMA_ONBOARDED_PATH);
|
|
3809
802
|
if (!loggedIn && !isOnboarded) {
|
|
3810
803
|
try {
|
|
3811
|
-
|
|
804
|
+
writeFileSync3(KYMA_ONBOARDED_PATH, (/* @__PURE__ */ new Date()).toISOString(), { mode: 384 });
|
|
3812
805
|
} catch {
|
|
3813
806
|
}
|
|
3814
807
|
} else if (!loggedIn) {
|
|
3815
808
|
} else if (!isOnboarded) {
|
|
3816
809
|
try {
|
|
3817
|
-
|
|
810
|
+
writeFileSync3(KYMA_ONBOARDED_PATH, (/* @__PURE__ */ new Date()).toISOString(), { mode: 384 });
|
|
3818
811
|
} catch {
|
|
3819
812
|
}
|
|
3820
813
|
}
|
|
3821
|
-
const kymaConfigPath =
|
|
814
|
+
const kymaConfigPath = join5(ctx.cwd, "KYMA.md");
|
|
3822
815
|
if (existsSync3(kymaConfigPath)) {
|
|
3823
816
|
try {
|
|
3824
817
|
const raw = readFileSync4(kymaConfigPath, "utf-8");
|
|
@@ -3923,20 +916,20 @@ var kymaRuntimeFactory = (pi) => {
|
|
|
3923
916
|
return;
|
|
3924
917
|
}
|
|
3925
918
|
}
|
|
3926
|
-
const
|
|
919
|
+
const options = filtered.map((m) => {
|
|
3927
920
|
const star = m.id === currentId ? "* " : " ";
|
|
3928
921
|
const name = m.name.padEnd(20);
|
|
3929
|
-
const
|
|
922
|
+
const tag = m.tag.padEnd(20);
|
|
3930
923
|
const price = `$${m.cost.input.toFixed(2)}/$${m.cost.output.toFixed(2)}`;
|
|
3931
924
|
const badges = [];
|
|
3932
925
|
if (m.vision) badges.push("[img]");
|
|
3933
926
|
if (m.reasoning) badges.push("[think]");
|
|
3934
927
|
const badgeStr = badges.length ? " " + badges.join(" ") : "";
|
|
3935
|
-
return `${star}${name}${
|
|
928
|
+
return `${star}${name}${tag}${price}${badgeStr}`;
|
|
3936
929
|
});
|
|
3937
|
-
const selected = await ctx.ui.select("Models available in your Kyma account",
|
|
930
|
+
const selected = await ctx.ui.select("Models available in your Kyma account", options);
|
|
3938
931
|
if (!selected) return;
|
|
3939
|
-
const idx =
|
|
932
|
+
const idx = options.indexOf(selected);
|
|
3940
933
|
const chosen = filtered[idx];
|
|
3941
934
|
if (!chosen || chosen.id === currentId) return;
|
|
3942
935
|
const ok = await pi.setModel(toRuntimeModel(chosen, `${KYMA_BASE_URL}/v1`));
|
|
@@ -4017,10 +1010,10 @@ var kymaRuntimeFactory = (pi) => {
|
|
|
4017
1010
|
}
|
|
4018
1011
|
lines.push("", DIV, "");
|
|
4019
1012
|
lines.push(` \u2713 API: reachable (${latency}ms)`);
|
|
4020
|
-
const { homedir:
|
|
4021
|
-
const configOk = existsSync3(
|
|
1013
|
+
const { homedir: homedir2 } = await import("os");
|
|
1014
|
+
const configOk = existsSync3(join5(homedir2(), ".kyma", "agent"));
|
|
4022
1015
|
lines.push(configOk ? " \u2713 Config: ~/.kyma/agent/" : " \u2717 Config dir missing");
|
|
4023
|
-
if (existsSync3(
|
|
1016
|
+
if (existsSync3(join5(ctx.cwd, "KYMA.md"))) {
|
|
4024
1017
|
lines.push(" \u2713 Workspace: KYMA.md");
|
|
4025
1018
|
}
|
|
4026
1019
|
const warnings = [];
|
|
@@ -4119,17 +1112,18 @@ var kymaRuntimeFactory = (pi) => {
|
|
|
4119
1112
|
kymaApi("/v1/credits/balance", apiKey)
|
|
4120
1113
|
]);
|
|
4121
1114
|
const tiers = [
|
|
4122
|
-
{ name: "
|
|
4123
|
-
{ name: "
|
|
4124
|
-
{ name: "
|
|
4125
|
-
{ name: "
|
|
1115
|
+
{ name: "Tier 0", rpm: 30, tpm: "200K", benefit: "Get started" },
|
|
1116
|
+
{ name: "Tier 1", rpm: 60, tpm: "500K", benefit: "Side projects" },
|
|
1117
|
+
{ name: "Tier 2", rpm: 120, tpm: "2M", benefit: "Daily coding" },
|
|
1118
|
+
{ name: "Tier 3", rpm: 200, tpm: "5M", benefit: "Production" },
|
|
1119
|
+
{ name: "Tier 4", rpm: 300, tpm: "10M", benefit: "Scale" }
|
|
4126
1120
|
];
|
|
4127
1121
|
const lines = [
|
|
4128
1122
|
"Tiers",
|
|
4129
1123
|
DIV,
|
|
4130
1124
|
"",
|
|
4131
1125
|
...tiers.map((t, i) => {
|
|
4132
|
-
const marker = i
|
|
1126
|
+
const marker = i === limits.tier ? " \u2190" : "";
|
|
4133
1127
|
return ` ${t.name.padEnd(8)} ${String(t.rpm).padEnd(4)} RPM ${t.tpm.padEnd(5)} TPM ${t.benefit}${marker}`;
|
|
4134
1128
|
}),
|
|
4135
1129
|
"",
|
|
@@ -4149,12 +1143,12 @@ var kymaRuntimeFactory = (pi) => {
|
|
|
4149
1143
|
pi.registerCommand("feedback", {
|
|
4150
1144
|
description: "Report issues or give feedback",
|
|
4151
1145
|
async handler(_args, ctx) {
|
|
4152
|
-
const
|
|
1146
|
+
const options = [
|
|
4153
1147
|
"Report a bug",
|
|
4154
1148
|
"Request a feature",
|
|
4155
1149
|
"Ask a question"
|
|
4156
1150
|
];
|
|
4157
|
-
const selected = await ctx.ui.select("Feedback",
|
|
1151
|
+
const selected = await ctx.ui.select("Feedback", options);
|
|
4158
1152
|
if (!selected) return;
|
|
4159
1153
|
const urls = {
|
|
4160
1154
|
"Report a bug": `${KYMA_BASE_URL}/feedback?type=bug`,
|
|
@@ -4253,10 +1247,10 @@ URL: ${url}`, "info");
|
|
|
4253
1247
|
};
|
|
4254
1248
|
|
|
4255
1249
|
// src/sdk/main.ts
|
|
4256
|
-
var PKG_DIR2 = process.env.PI_PACKAGE_DIR ||
|
|
1250
|
+
var PKG_DIR2 = process.env.PI_PACKAGE_DIR || dirname4(dirname4(dirname4(fileURLToPath4(import.meta.url))));
|
|
4257
1251
|
var VERSION2 = (() => {
|
|
4258
1252
|
try {
|
|
4259
|
-
return JSON.parse(readFileSync5(
|
|
1253
|
+
return JSON.parse(readFileSync5(join6(PKG_DIR2, "package.json"), "utf-8")).version || "0.1.0";
|
|
4260
1254
|
} catch {
|
|
4261
1255
|
return "0.1.0";
|
|
4262
1256
|
}
|
|
@@ -4376,6 +1370,9 @@ async function main(argv) {
|
|
|
4376
1370
|
initialMessage: parsed.initialMessage,
|
|
4377
1371
|
continueSession: parsed.continueSession
|
|
4378
1372
|
});
|
|
1373
|
+
if (process.stdout.isTTY) {
|
|
1374
|
+
process.stdout.write("\x1B[2J\x1B[H");
|
|
1375
|
+
}
|
|
4379
1376
|
const interactiveMode = new KymaInteractiveMode(runtime, interactiveOptions);
|
|
4380
1377
|
await interactiveMode.run();
|
|
4381
1378
|
}
|