@ladderkitlab/hub-kb 0.3.0 → 1.0.0
This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
- package/dist/main.js +82 -43
- package/package.json +1 -1
- package/snapshot/index.json +1 -1
- package/snapshot/projection.json +1 -1
- package/snapshot/release-manifest.json +9 -9
- package/snapshot/t2s-min.json +1 -1
package/dist/main.js
CHANGED
|
@@ -297,6 +297,7 @@ function continuationStarts(t, n, pos) {
|
|
|
297
297
|
if (isWs(c) || CJK_STOPS.includes(c) || c === "&" || c === "#" || c === ";") return false;
|
|
298
298
|
return !isCloser(c) || isAsciiAlnum(t[pos + 1]);
|
|
299
299
|
}
|
|
300
|
+
var isWrapQuote = (c) => c === '"' || c === "'";
|
|
300
301
|
function readWrapped(s, open) {
|
|
301
302
|
const t = s.text;
|
|
302
303
|
const close = t[open] === "<" ? ">" : t[open];
|
|
@@ -352,19 +353,19 @@ function readAdjacent(s, pos, continuation = false) {
|
|
|
352
353
|
}
|
|
353
354
|
function readSegmentAt(s, pos, continuation = false) {
|
|
354
355
|
const c = s.text[pos];
|
|
355
|
-
return c
|
|
356
|
+
return isWrapQuote(c) || c === "<" ? readWrapped(s, pos) : readAdjacent(s, pos, continuation);
|
|
356
357
|
}
|
|
357
|
-
function isContent(s, raw) {
|
|
358
|
+
function isContent(s, raw, depth = 1) {
|
|
358
359
|
s.budget.tick(raw.length + 1);
|
|
359
|
-
let decoded;
|
|
360
|
+
let decoded = raw.replace(/\+/g, " ");
|
|
360
361
|
try {
|
|
361
|
-
decoded = decodeURIComponent(
|
|
362
|
+
for (let d = 0; d < depth; d++) decoded = decodeURIComponent(decoded);
|
|
362
363
|
} catch {
|
|
363
364
|
return true;
|
|
364
365
|
}
|
|
365
366
|
return decoded.trim() !== "";
|
|
366
367
|
}
|
|
367
|
-
function hasRawValueContent(s, start, end) {
|
|
368
|
+
function hasRawValueContent(s, start, end, depth = 1) {
|
|
368
369
|
let raw = "";
|
|
369
370
|
for (let k = start; k < end; ) {
|
|
370
371
|
s.budget.tick();
|
|
@@ -372,7 +373,7 @@ function hasRawValueContent(s, start, end) {
|
|
|
372
373
|
if (a > 0 && k + a <= end) k += a;
|
|
373
374
|
else raw += s.text[k++];
|
|
374
375
|
}
|
|
375
|
-
return s.budget.exhausted || isContent(s, raw);
|
|
376
|
+
return s.budget.exhausted || isContent(s, raw, depth);
|
|
376
377
|
}
|
|
377
378
|
function interpretUrlValue(s, start) {
|
|
378
379
|
const cached = s.values.get(start);
|
|
@@ -387,7 +388,7 @@ function interpretUrlValue(s, start) {
|
|
|
387
388
|
let j = start;
|
|
388
389
|
while (j < n && isInlineWs(t[j])) j++;
|
|
389
390
|
s.budget.tick(j - start + 1);
|
|
390
|
-
if (j < n && (t[j]
|
|
391
|
+
if (j < n && isWrapQuote(t[j])) {
|
|
391
392
|
seg = readWrapped(s, j);
|
|
392
393
|
wide = true;
|
|
393
394
|
} else if (t[start] === "<") seg = readWrapped(s, start);
|
|
@@ -506,6 +507,30 @@ function compoundNameStart(text, nameStart, s) {
|
|
|
506
507
|
}
|
|
507
508
|
return start;
|
|
508
509
|
}
|
|
510
|
+
function compoundNameEnd(text, from, s) {
|
|
511
|
+
let end = from;
|
|
512
|
+
for (; ; ) {
|
|
513
|
+
let j = end;
|
|
514
|
+
while (j < text.length && isConnector(text[j])) j++;
|
|
515
|
+
let k = j;
|
|
516
|
+
while (k < text.length && isAlnumAt(text, k)) k++;
|
|
517
|
+
s?.budget.tick(k - end + 1);
|
|
518
|
+
if (k === j) return end;
|
|
519
|
+
end = k;
|
|
520
|
+
}
|
|
521
|
+
}
|
|
522
|
+
function separatorEndAfterName(s, nameEnd) {
|
|
523
|
+
const t = s.text;
|
|
524
|
+
const n = s.n;
|
|
525
|
+
let j = nameEnd;
|
|
526
|
+
while (j < n && isWs(t[j])) j++;
|
|
527
|
+
if (j < n && (t[j] === '"' || t[j] === "'")) {
|
|
528
|
+
j++;
|
|
529
|
+
while (j < n && isWs(t[j])) j++;
|
|
530
|
+
}
|
|
531
|
+
s.budget.tick(j - nameEnd + 1);
|
|
532
|
+
return j < n && SEPARATORS.includes(t[j]) ? j + 1 : -1;
|
|
533
|
+
}
|
|
509
534
|
var URL_NAME_SET = new Set(URL_CREDENTIAL_NAMES);
|
|
510
535
|
var COMPOUND_URL_NAME = new RegExp(`^_*(?:[a-z0-9]+[_.\\-]+)*(${[...PROSE_CREDENTIAL_NAMES, PROSE_KEY_NAME].join("|")})$`);
|
|
511
536
|
function decodeOnce(s) {
|
|
@@ -593,18 +618,11 @@ function proseNamedHits(s) {
|
|
|
593
618
|
i = end2;
|
|
594
619
|
continue;
|
|
595
620
|
}
|
|
596
|
-
|
|
597
|
-
|
|
598
|
-
if (j < n && (t[j] === '"' || t[j] === "'")) {
|
|
599
|
-
j++;
|
|
600
|
-
while (j < n && isWs(t[j])) j++;
|
|
601
|
-
}
|
|
602
|
-
s.budget.tick(j - nameEnd + 1);
|
|
603
|
-
if (j >= n || !SEPARATORS.includes(t[j])) {
|
|
621
|
+
const sepEnd = separatorEndAfterName(s, nameEnd);
|
|
622
|
+
if (sepEnd < 0) {
|
|
604
623
|
i++;
|
|
605
624
|
continue;
|
|
606
625
|
}
|
|
607
|
-
const sepEnd = j + 1;
|
|
608
626
|
let headEnd;
|
|
609
627
|
if (name === PROSE_KEY_NAME) {
|
|
610
628
|
headEnd = keyThresholdEnd(s, sepEnd);
|
|
@@ -659,7 +677,7 @@ function proseNamedHits(s) {
|
|
|
659
677
|
}
|
|
660
678
|
const start = compoundNameStart(t, runStart, s);
|
|
661
679
|
let urlEnd = -1;
|
|
662
|
-
if (t[
|
|
680
|
+
if (sepEnd === nameEnd + 1 && t[nameEnd] === "=" && inUrlParamName(s, start)) {
|
|
663
681
|
const v = interpretUrlValue(s, sepEnd);
|
|
664
682
|
if (!hasCredentialValue(v) && v.state !== "none") {
|
|
665
683
|
i = nameEnd;
|
|
@@ -691,6 +709,13 @@ function paramNameEnd(t, at) {
|
|
|
691
709
|
}
|
|
692
710
|
return j > at && t[j] === "=" ? j : -1;
|
|
693
711
|
}
|
|
712
|
+
function encodedSep(t, i) {
|
|
713
|
+
if (t[i] !== "%") return null;
|
|
714
|
+
const dbl = t[i + 1] === "2" && t[i + 2] === "5";
|
|
715
|
+
const code = t.slice(dbl ? i + 3 : i + 1, dbl ? i + 5 : i + 3).toUpperCase();
|
|
716
|
+
const ch = code === "3F" ? "?" : code === "26" ? "&" : code === "23" ? "#" : code === "3D" ? "=" : "";
|
|
717
|
+
return ch ? { ch, len: dbl ? 5 : 3 } : null;
|
|
718
|
+
}
|
|
694
719
|
function urlCredentialSpans(s) {
|
|
695
720
|
if (s.urlcred) return s.urlcred;
|
|
696
721
|
const t = s.text;
|
|
@@ -704,33 +729,34 @@ function urlCredentialSpans(s) {
|
|
|
704
729
|
}
|
|
705
730
|
const c = t[i];
|
|
706
731
|
if (c === "%" && i + 2 < n) {
|
|
707
|
-
const head = t
|
|
708
|
-
if (head
|
|
709
|
-
let j = i +
|
|
732
|
+
const head = encodedSep(t, i);
|
|
733
|
+
if (head && head.ch !== "=") {
|
|
734
|
+
let j = i + head.len;
|
|
710
735
|
while (j < n) {
|
|
711
736
|
if (PARAM_NAME_CHAR(t, j)) {
|
|
712
737
|
j++;
|
|
713
738
|
continue;
|
|
714
739
|
}
|
|
715
|
-
if (t[j] === "%" && isHex(t[j + 1]) && isHex(t[j + 2]) &&
|
|
740
|
+
if (t[j] === "%" && isHex(t[j + 1]) && isHex(t[j + 2]) && encodedSep(t, j)?.len !== head.len) {
|
|
716
741
|
j += 3;
|
|
717
742
|
continue;
|
|
718
743
|
}
|
|
719
744
|
break;
|
|
720
745
|
}
|
|
721
746
|
s.budget.tick(j - i + 1);
|
|
722
|
-
|
|
723
|
-
|
|
747
|
+
const eq2 = encodedSep(t, j);
|
|
748
|
+
if (j > i + head.len && eq2?.ch === "=") {
|
|
749
|
+
const cls2 = urlNameClass(t.slice(i + head.len, j).replace(/%25/gi, "%"));
|
|
724
750
|
if (!cls2) {
|
|
725
751
|
i = j;
|
|
726
752
|
continue;
|
|
727
753
|
}
|
|
728
|
-
const vStart = j +
|
|
754
|
+
const vStart = j + eq2.len;
|
|
729
755
|
let k = vStart;
|
|
730
|
-
while (k < n && t[k] !== "&" && t[k] !== "#" && !isWs(t[k]) && !(t
|
|
756
|
+
while (k < n && t[k] !== "&" && t[k] !== "#" && !isWs(t[k]) && !(encodedSep(t, k)?.ch === "&" && encodedSep(t, k).len === head.len)) k++;
|
|
731
757
|
s.budget.tick(k - vStart + 1);
|
|
732
|
-
if (k > vStart && hasRawValueContent(s, vStart, k)) {
|
|
733
|
-
out.push({ index: cls2 === "url" ? vStart : i +
|
|
758
|
+
if (k > vStart && hasRawValueContent(s, vStart, k, eq2.len === 5 ? 2 : 1)) {
|
|
759
|
+
out.push({ index: cls2 === "url" ? vStart : i + head.len, end: k });
|
|
734
760
|
i = k;
|
|
735
761
|
continue;
|
|
736
762
|
}
|
|
@@ -783,7 +809,8 @@ function httpHeadAt(t, i) {
|
|
|
783
809
|
const head = t.slice(i, i + 8).toLowerCase();
|
|
784
810
|
return head.startsWith("https://") ? 8 : head.startsWith("http://") ? 7 : 0;
|
|
785
811
|
}
|
|
786
|
-
var
|
|
812
|
+
var SCHEME_SEPARATOR_SRC = String.raw`(?::|%(?:25)?3a)(?:\/|%(?:25)?2f)(?:\/|%(?:25)?2f)`;
|
|
813
|
+
var ENCODED_HEAD = new RegExp(`https?${SCHEME_SEPARATOR_SRC}`, "iy");
|
|
787
814
|
function encodedHeadAt(t, i) {
|
|
788
815
|
if (t[i] !== "h" && t[i] !== "H") return 0;
|
|
789
816
|
ENCODED_HEAD.lastIndex = i;
|
|
@@ -798,8 +825,9 @@ function socksHeadAt(t, i) {
|
|
|
798
825
|
for (const p of SOCKS_HEADS) if (head.startsWith(p)) return p.length;
|
|
799
826
|
return 0;
|
|
800
827
|
}
|
|
828
|
+
var SCHEME_SEPARATOR = new RegExp(SCHEME_SEPARATOR_SRC, "i");
|
|
801
829
|
function hasSchemeSeparator(text) {
|
|
802
|
-
return
|
|
830
|
+
return SCHEME_SEPARATOR.test(text);
|
|
803
831
|
}
|
|
804
832
|
var ENCODED_UNIT = { "3A": ":", "2F": "/", "3F": "?", "23": "#", "40": "@", "5B": "[", "5D": "]", "28": "(", "29": ")" };
|
|
805
833
|
var ONCE = 1;
|
|
@@ -1165,17 +1193,17 @@ function subscriptionSpans(s) {
|
|
|
1165
1193
|
continue;
|
|
1166
1194
|
}
|
|
1167
1195
|
const end = endAt(i);
|
|
1168
|
-
|
|
1196
|
+
const sep = separatorEndAfterName(s, compoundNameEnd(t, kw, s));
|
|
1197
|
+
let q = sep >= 0 ? sep : kw;
|
|
1169
1198
|
while (q < end && isInlineWs(t[q])) q++;
|
|
1170
|
-
|
|
1171
|
-
q++;
|
|
1172
|
-
while (q < end && isInlineWs(t[q])) q++;
|
|
1173
|
-
}
|
|
1199
|
+
const open = q < end && isWrapQuote(t[q]) ? q : -1;
|
|
1174
1200
|
s.budget.tick(q - kw + 1);
|
|
1175
|
-
const link = linkStartingAt(s, q);
|
|
1201
|
+
const link = linkStartingAt(s, open >= 0 ? q + 1 : q);
|
|
1176
1202
|
let j;
|
|
1177
|
-
if (link)
|
|
1178
|
-
|
|
1203
|
+
if (link) {
|
|
1204
|
+
j = Math.min(link.displayEnd, end);
|
|
1205
|
+
if (open >= 0 && j < end && t[j] === t[open]) j++;
|
|
1206
|
+
} else {
|
|
1179
1207
|
j = kw;
|
|
1180
1208
|
while (j < end && !KEYWORD_VALUE_END(t[j]) && !stops.has(j)) j++;
|
|
1181
1209
|
s.budget.tick(j - kw + 1);
|
|
@@ -1270,7 +1298,7 @@ function regexInRuns(isClass, re, minLen) {
|
|
|
1270
1298
|
}
|
|
1271
1299
|
var EMAIL = regexInRuns((x) => isAlnumCode2(x) || x === 46 || x === 95 || x === 37 || x === 43 || x === 45 || x === 64, /(?<![A-Za-z0-9._%+-])[A-Za-z0-9._%+-]+@[A-Za-z0-9.-]+\.[A-Za-z]+/g, 5);
|
|
1272
1300
|
var UUID = regexInRuns((x) => isHexCode2(x) || x === 45, /\b[0-9a-f]{8}-[0-9a-f]{4}-[0-9a-f]{4}-[0-9a-f]{4}-[0-9a-f]{12}\b/gi, 36);
|
|
1273
|
-
var IPV6 = regexInRuns((x) => isHexCode2(x) || x === 58 || x === 46, /(?<![0-9a-f:])(?:[0-9a-f]{0,4}:){2,}(?:\d{1,3}\.){3}\d{1,3}|(?<![0-9a-f:])(?!(?<=[a-z])::[0-9a-f:]*[g-z])(?:[0-9a-f]{0,4}:){2,7}[0-9a-f]{0,4}(?![0-9a-f:])/gi, 2);
|
|
1301
|
+
var IPV6 = regexInRuns((x) => isHexCode2(x) || x === 58 || x === 46, /(?<![0-9a-f:])(?:[0-9a-f]{0,4}:){2,}(?:\d{1,3}\.){3}\d{1,3}|(?<![0-9a-f:])(?!(?<=[a-z])::[0-9a-f:]*[g-z])(?:(?=[0-9a-f:]*::)(?:[0-9a-f]{0,4}:){2,7}[0-9a-f]{0,4}|::(?:[0-9a-f]{1,4}:){6}[0-9a-f]{1,4}|(?:[0-9a-f]{1,4}:){7}:|(?:[0-9a-f]{1,4}:){7}[0-9a-f]{1,4})(?![0-9a-f:])/gi, 2);
|
|
1274
1302
|
var IPV4 = regexInRuns((x) => x >= 48 && x <= 57 || x === 46, /(?<!\d)(?:\d{1,3}\.){3}\d{1,3}(?!\d)/g, 7);
|
|
1275
1303
|
function inviteSpans(s) {
|
|
1276
1304
|
if (s.invites) return s.invites;
|
|
@@ -1406,8 +1434,8 @@ function isKnownFalsePositive(m) {
|
|
|
1406
1434
|
function credentialRules(text) {
|
|
1407
1435
|
return [...new Set(sensitiveMatches(text).filter((m) => SECRET_RULES.has(m.rule) && !isKnownFalsePositive(m)).map((m) => m.rule))];
|
|
1408
1436
|
}
|
|
1409
|
-
function maskSensitive(text, policy, opts = {}) {
|
|
1410
|
-
const ms = sensitiveMatches(text, opts).filter((m) => policy === "exception" || SECRET_RULES.has(m.rule) && !isKnownFalsePositive(m));
|
|
1437
|
+
function maskSensitive(text, policy, opts = {}, keep) {
|
|
1438
|
+
const ms = sensitiveMatches(text, opts).filter((m) => policy === "exception" || SECRET_RULES.has(m.rule) && !isKnownFalsePositive(m) && !keep?.(m));
|
|
1411
1439
|
return render(text, ms, () => CREDENTIAL_MASK);
|
|
1412
1440
|
}
|
|
1413
1441
|
|
|
@@ -1425,7 +1453,7 @@ var USAGE_RULES = [
|
|
|
1425
1453
|
"3. \u7528 `get_entry` \u9010\u6761\u8BFB\u6B63\u6587\uFF1B\u8FD4\u56DE\u91CC\u6CE8\u660E\u6761\u76EE\u5206\u4E86\u51E0\u6BB5\u65F6\uFF0C\u6309\u6BB5\u6807\u9898\u7528 `part` \u53C2\u6570\u518D\u8BFB\u4E0E\u95EE\u9898\u6709\u5173\u7684\u6BB5\u3002\u8FD4\u56DE\u300C\u6761\u76EE\u4E0D\u5B58\u5728\u300D\u65F6\uFF0C\u91CD\u65B0\u8C03\u4E00\u6B21 `list_entries` \u53D6\u5F53\u524D\u76EE\u5F55\uFF0C\u4ECD\u6CA1\u6709\u5C31\u6309\u7B2C 4 \u6B65\u300C\u6CA1\u6709\u6761\u76EE\u80FD\u56DE\u7B54\u300D\u5904\u7406\u3002",
|
|
1426
1454
|
"4. \u56DE\u7B54\uFF08\u56DE\u7B54\u6B63\u6587\u4E0D\u5199\u6761\u76EE id\uFF0C\u4F9D\u636E\u653E\u5728\u672B\u5C3E\u7684\u6761\u76EE\u9875\u9762\u94FE\u63A5\u91CC\uFF1B\u5F15\u7528\u6761\u76EE\u65F6\uFF0C\u4F5C\u4E3A\u4F9D\u636E\u7684\u53EA\u80FD\u662F\u8BFB\u8FC7\u6B63\u6587\u7684\u6761\u76EE\uFF1B\u6761\u76EE\u6B63\u6587\u91CC\u63D0\u5230\u7684\u5176\u4ED6\u6761\u76EE\u53EF\u4EE5\u70B9\u540D\u4F9B\u7528\u6237\u5EF6\u4F38\u9605\u8BFB\uFF0C\u4F46\u4E0D\u5F53\u4F5C\u4F9D\u636E\uFF1B\u76EE\u5F55\u91CC\u770B\u5230\u4F46\u6CA1\u8BFB\u8FC7\u6B63\u6587\u7684\u6761\u76EE\u4E0D\u70B9\u540D\u3002\u8BFB\u8FC7\u6B63\u6587\u540E\u8FD8\u9700\u8981\u8FFD\u95EE\u7684\uFF0C\u4E5F\u5148\u6309\u4E0B\u9762\u7684\u4E09\u79CD\u56DE\u7B54\u4E4B\u4E00\u4F5C\u7B54\uFF0C\u518D\u8FFD\u95EE\uFF09\u3002\u56DE\u7B54\u8981\u77ED\uFF0C\u7EC6\u8282\u7B49\u7528\u6237\u8FFD\u95EE\u518D\u7ED9\u3002\u7B2C\u4E00\u6B21\u56DE\u7B54\u8981\u80FD\u4E00\u773C\u770B\u5B8C\uFF1A\u4E0D\u8D85\u8FC7 8 \u884C\u3001300 \u5B57\uFF08\u672B\u5C3E\u7684\u6761\u76EE\u94FE\u63A5\u4E0D\u7B97\uFF09\uFF0C\u6BCF\u884C\u53EA\u5199\u4E00\u53E5\u8BDD\uFF1B\u653E\u4E0D\u4E0B\u7684\u7559\u7ED9\u8FFD\u95EE\u3002\u5199\u6CD5\uFF1A\u7528\u81EA\u7136\u7684\u51E0\u6BB5\u8BDD\uFF0C\u4E0D\u52A0\u300C\u7ED3\u8BBA\u300D\u300C\u786E\u8BA4\u300D\u300C\u4F9D\u636E\u300D\u8FD9\u7C7B\u5C0F\u6807\u9898\u6216\u6807\u7B7E\uFF0C\u4E0D\u7528\u8868\u683C\u3001\u5D4C\u5957\u5217\u8868\u548C\u7C97\u4F53\uFF1B\u4E00\u53E5\u53EA\u8BF4\u4E00\u4EF6\u4E8B\uFF1B\u7528\u7948\u4F7F\u53E5\uFF1B\u540C\u4E00\u4E2A\u4E1C\u897F\u59CB\u7EC8\u7528\u540C\u4E00\u4E2A\u8BCD\uFF1B\u4E0D\u7528\u300C\u5927\u6982\u300D\u300C\u4E00\u4E9B\u300D\u8FD9\u7C7B\u542B\u7CCA\u7684\u8BCD\uFF1B\u6309\u94AE\u540D\u3001\u83DC\u5355\u540D\u3001\u62A5\u9519\u539F\u6587\u548C\u547D\u4EE4\u7167\u539F\u6837\u5199\uFF1B\u4E0D\u4E3B\u52A8\u8BB2\u539F\u7406\uFF0C\u7528\u6237\u95EE\u4E3A\u4EC0\u4E48\u518D\u8BB2\u3002\u7528\u4E86\u6761\u76EE\u5185\u5BB9\u7684\u56DE\u7B54\uFF08\u80FD\u5B8C\u6574\u56DE\u7B54\u3001\u53EA\u80FD\u90E8\u5206\u56DE\u7B54\uFF09\uFF0C`get_entry` \u8FD4\u56DE\u7684\u6B63\u6587\u7B2C\u4E00\u884C\u5199\u7740\u300C\u6761\u76EE\u9875\u9762\uFF1A\u300D\u5730\u5740\u65F6\uFF0C\u5FC5\u987B\u5728\u672B\u5C3E\u5355\u72EC\u4E00\u884C\u7ED9\u51FA\u7528\u5230\u7684\u6761\u76EE\u9875\u9762\u94FE\u63A5\uFF0C\u7167\u6284\u90A3\u4E2A\u5730\u5740\uFF1B\u6CA1\u6709\u8FD9\u4E00\u884C\u800C\u672C skill \u7684\u300C\u56DE\u9000\u300D\u4E00\u8282\u7ED9\u4E86\u4E3B\u7AD9\u5730\u5740\u65F6\uFF0C\u6309 `<\u4E3B\u7AD9>/<type>/<id>/` \u62FC\u51FA\uFF0C`<type>` \u53D6\u76EE\u5F55\u91CC\u7684\u6761\u76EE\u7C7B\u578B\uFF1B\u4E24\u6837\u90FD\u6CA1\u6709\u5C31\u4E0D\u7ED9\u3002\u7528\u6237\u8FFD\u95EE\u7EC6\u8282\u65F6\uFF0C\u6309\u6761\u76EE\u7ED9\u51FA\u5B8C\u6574\u6B65\u9AA4\uFF0C\u4E0D\u53D7\u4E0B\u9762\u7684\u957F\u5EA6\u9650\u5236\uFF1A",
|
|
1427
1455
|
" - \u80FD\u5B8C\u6574\u56DE\u7B54\uFF1A\u8981\u52A8\u624B\u64CD\u4F5C\u7684\u95EE\u9898\uFF0C\u5148\u7528\u4E00\u53E5\u8BDD\u8BF4\u662F\u4EC0\u4E48\u60C5\u51B5\u3001\u8BE5\u505A\u4EC0\u4E48\uFF0C\u518D\u5217\u6700\u591A 3 \u6B65\uFF0C\u6BCF\u6B65\u4E00\u4E2A\u52A8\u4F5C\uFF0C\u7136\u540E\u7528\u4E00\u53E5\u8BDD\u8BF4\u505A\u5B8C\u540E\u770B\u5230\u4EC0\u4E48\u5C31\u8BF4\u660E\u597D\u4E86\uFF08\u53D6\u81EA\u6761\u76EE\u7684\u300C\u9A8C\u8BC1\u300D\uFF09\uFF1B\u95EE\u300C\u80FD\u4E0D\u80FD\u300D\u300C\u662F\u4E0D\u662F\u300D\u300C\u662F\u4EC0\u4E48\u300D\u7684\u95EE\u9898\uFF0C\u76F4\u63A5\u7528 2\u20133 \u53E5\u8BDD\u56DE\u7B54\uFF0C\u4E0D\u5217\u6B65\u9AA4\uFF0C\u4E5F\u4E0D\u5199\u600E\u4E48\u786E\u8BA4\u3002\u6761\u76EE\u6709\u591A\u4E2A\u5206\u652F\u65F6\uFF0C\u6309\u7528\u6237\u8BF4\u7684\u73B0\u8C61\u6311\u4E00\u652F\uFF1B\u7528\u6237\u6CA1\u8BF4\u73B0\u8C61\uFF0C\u6311\u6700\u5E38\u89C1\u7684\u4E00\u652F\uFF1B\u5176\u4F59\u5206\u652F\u4E0D\u5C55\u5F00\uFF0C\u53EA\u5728\u6700\u540E\u4E00\u884C\u70B9\u540D 2\u20133 \u79CD\u522B\u7684\u60C5\u51B5\u8BA9\u7528\u6237\u9009\uFF08\u4F8B\u5982\u300C\u5982\u679C\u4F60\u770B\u5230\u7684\u662F A \u6216 B\uFF0C\u544A\u8BC9\u6211\u662F\u54EA\u4E2A\u300D\uFF09\uFF1B\u6CA1\u6709\u522B\u7684\u5206\u652F\u65F6\uFF0C\u6700\u540E\u4E00\u53E5\u544A\u8BC9\u7528\u6237\u8FD8\u80FD\u600E\u4E48\u7EE7\u7EED\u3002\u4E0D\u5199\u7528\u6237\u6CA1\u95EE\u7684\u63D0\u9192\u548C\u6CE8\u610F\u4E8B\u9879\uFF1B",
|
|
1428
|
-
` - \u53EA\u80FD\u90E8\u5206\u56DE\u7B54\uFF1A\u6761\u76EE\u5BF9\u8FD9\u4E2A\u95EE\u9898\u6709\u5B9E\u8D28\u5E2E\u52A9\uFF08\u7B54\u6848\u6216\u6392\u67E5\u6B65\u9AA4\u7684\u4E00\u90E8\u5206\uFF09\u3001\u4F46\u7B54\u4E0D\u5168\u2014\u2014\u56DE\u7B54\u91CC\u7528\u4E86\u6761\u76EE\u91CC\u7684\u6392\u67E5\u6B65\u9AA4\uFF0C\u5C31\u6309\u8FD9\u4E00\u79CD\u4F5C\u7B54\uFF1B\u6761\u76EE\u8986\u76D6\u7684\u90E8\u5206\u6309\u4E0A\u9762\u7684\u77ED\u7B54\u5199\uFF0C\u5E76\u4EE5\u56FA\u5B9A\u524D\u7F00\u300C${PARTIAL_PREFIX}\u300D\u7528\u4E00\u53E5\u8BDD\u5199\u51FA\u7F3A\u7684\u90E8\u5206\uFF08\u524D\u7F00\u5355\u72EC\u8D77\u4E00\u884C\u5199\u5728\u884C\u9996\uFF0C\u4E0D\u5199\u6210\u6807\u9898\uFF09\uFF1B\u7F3A\u7684\u90E8\u5206\u8981\u7528\u81EA\u5DF1\u7684\u77E5\u8BC6\u8865\uFF0C\u5C31\u5728\u524D\u7F00\u540E\u5148\u5199\u56FA\u5B9A\u6807\u6CE8\u300C${NOT_KB_LABEL}\u300D\u518D\u8865\uFF0C\u81EA\u5DF1\u8865\u7684\u53EA\u5199 1\u20132 \u53E5\uFF1B`,
|
|
1456
|
+
` - \u53EA\u80FD\u90E8\u5206\u56DE\u7B54\uFF1A\u6761\u76EE\u5BF9\u8FD9\u4E2A\u95EE\u9898\u6709\u5B9E\u8D28\u5E2E\u52A9\uFF08\u7B54\u6848\u6216\u6392\u67E5\u6B65\u9AA4\u7684\u4E00\u90E8\u5206\uFF09\u3001\u4F46\u7B54\u4E0D\u5168\u2014\u2014\u56DE\u7B54\u91CC\u7528\u4E86\u6761\u76EE\u91CC\u7684\u6392\u67E5\u6B65\u9AA4\uFF0C\u5C31\u6309\u8FD9\u4E00\u79CD\u4F5C\u7B54\uFF1B\u6761\u76EE\u8986\u76D6\u7684\u90E8\u5206\u6309\u4E0A\u9762\u7684\u77ED\u7B54\u5199\uFF0C\u5E76\u4EE5\u56FA\u5B9A\u524D\u7F00\u300C${PARTIAL_PREFIX}\u300D\u7528\u4E00\u53E5\u8BDD\u5199\u51FA\u7F3A\u7684\u90E8\u5206\uFF08\u524D\u7F00\u5355\u72EC\u8D77\u4E00\u884C\u5199\u5728\u884C\u9996\uFF0C\u4E0D\u5199\u6210\u6807\u9898\uFF09\uFF1B\u6761\u76EE\u6CA1\u5199\u6216\u6CA1\u6838\u5B9E\u7684\u5185\u5BB9\u53EA\u5728\u8FD9\u4E00\u884C\u8BF4\uFF0C\u4E0D\u5728\u522B\u5904\u6362\u6210\u81EA\u5DF1\u7684\u8BDD\uFF08\u4F8B\u5982\u300C\u77E5\u8BC6\u5E93\u91CC\u6CA1\u6709\u8BF4\u2026\u300D\u300C\u77E5\u8BC6\u5E93\u6CA1\u6709\u6838\u5B9E\u2026\u300D\uFF09\uFF1B\u7F3A\u7684\u90E8\u5206\u8981\u7528\u81EA\u5DF1\u7684\u77E5\u8BC6\u8865\uFF0C\u5C31\u5728\u524D\u7F00\u540E\u5148\u5199\u56FA\u5B9A\u6807\u6CE8\u300C${NOT_KB_LABEL}\u300D\u518D\u8865\uFF0C\u300C${NOT_KB_LABEL}\u300D\u4E0D\u80FD\u4EE3\u66FF\u524D\u7F00\uFF0C\u81EA\u5DF1\u8865\u7684\u53EA\u5199 1\u20132 \u53E5\uFF1B`,
|
|
1429
1457
|
` - \u6CA1\u6709\u6761\u76EE\u80FD\u56DE\u7B54\uFF08\u4E3B\u9898\u76F8\u8FD1\u3001\u5374\u7B54\u4E0D\u4E86\u7528\u6237\u5177\u4F53\u95EE\u9898\u7684\u6761\u76EE\u4E5F\u7B97\u6CA1\u6709\uFF09\uFF1A\u56DE\u7B54\u4EE5\u56FA\u5B9A\u6807\u6CE8\u300C${NOT_KB_LABEL}\u300D\u5F00\u5934\u2014\u2014\u8981\u81EA\u7B54\uFF0C\u5C31\u5728\u6807\u6CE8\u540E\u7528\u81EA\u5DF1\u7684\u77E5\u8BC6\u56DE\u7B54\uFF0C\u53EA\u5199 1\u20132 \u53E5\uFF0C\u5E76\u4E0E\u6761\u76EE\u5185\u5BB9\u5206\u5F00\uFF1B\u4E0D\u81EA\u7B54\uFF0C\u5C31\u5728\u6807\u6CE8\u540E\u8BF4\u660E\u77E5\u8BC6\u5E93\u6CA1\u6709\u8986\u76D6\uFF1B`,
|
|
1430
1458
|
` - \u4E0E\u77E5\u8BC6\u5E93\u76F8\u90BB\u4F46\u523B\u610F\u4E0D\u505A\u2014\u2014${ADJACENT_SCOPE.join("\uFF1B")}\u2014\u2014\u4E0D\u4F5C\u7B54\uFF0C\u4E5F\u4E0D\u7528\u81EA\u5DF1\u7684\u77E5\u8BC6\u8865\uFF0C\u53EA\u56DE\u7B54\u300C${OUT_OF_SCOPE_REPLY}\u300D\u3002\u8FD9\u6761\u4F18\u5148\u4E8E\u524D\u9762\u4E09\u79CD\u56DE\u7B54\uFF1A\u5373\u4F7F\u76EE\u5F55\u91CC\u6709\u770B\u8D77\u6765\u76F8\u5173\u7684\u6761\u76EE\uFF0C\u4E5F\u4E0D\u6309\u6761\u76EE\u4F5C\u7B54\u3001\u4E0D\u90E8\u5206\u4F5C\u7B54\u3001\u4E0D\u81EA\u7B54\uFF1B\u76F8\u90BB\u95EE\u9898\u4E0D\u8D70\u300C\u6CA1\u6709\u6761\u76EE\u80FD\u56DE\u7B54\u300D\u90A3\u6761\u8DEF\uFF0C\u5E26\u4E0A\u300C${NOT_KB_LABEL}\u300D\u6807\u6CE8\u81EA\u7B54\u540C\u6837\u4E0D\u884C\u3002`,
|
|
1431
1459
|
"5. \u4E0D\u56DE\u663E\u8BA2\u9605\u94FE\u63A5\u3001\u5BC6\u94A5\u3001\u8282\u70B9 IP\uFF0C\u622A\u56FE\u91CC\u7684\u4E5F\u4E00\u6837\uFF1B\u53EA\u94FE\u63A5\u6761\u76EE\u91CC\u5217\u51FA\u7684\u5B98\u65B9\u6765\u6E90\u548C\u672C\u77E5\u8BC6\u5E93\u4E3B\u7AD9\u4E0A\u7684\u6761\u76EE\u9875\u9762\uFF1B\u6807\u4E3A\u300C\u4FE1\u606F\u8BF4\u660E\u300D\u7684\u6761\u76EE\u4E0D\u7ED9\u64CD\u4F5C\u6B65\u9AA4\u3002"
|
|
@@ -1588,6 +1616,7 @@ function partHeadings(segs) {
|
|
|
1588
1616
|
starts.push(off);
|
|
1589
1617
|
off += l.line.length;
|
|
1590
1618
|
}
|
|
1619
|
+
let lastH1 = "";
|
|
1591
1620
|
let lastH2 = "";
|
|
1592
1621
|
let segStart = 0;
|
|
1593
1622
|
let i = 0;
|
|
@@ -1600,8 +1629,18 @@ function partHeadings(segs) {
|
|
|
1600
1629
|
while (k < lines.length && starts[k] < segEnd && lines[k].line.trim() === "") k++;
|
|
1601
1630
|
if (k < lines.length && starts[k] < segEnd && !lines[k].inFence && /^#{1,2} /.test(lines[k].line)) heading = lines[k].line.trim();
|
|
1602
1631
|
}
|
|
1603
|
-
const
|
|
1604
|
-
|
|
1632
|
+
const firstLine = () => {
|
|
1633
|
+
for (let k = i; k < lines.length && starts[k] < segEnd; k++) {
|
|
1634
|
+
const t = lines[k].line.slice(Math.max(0, segStart - starts[k]), segEnd - starts[k]).trim();
|
|
1635
|
+
if (!lines[k].inFence && !FENCE_OPEN.test(lines[k].line) && t !== "") return t;
|
|
1636
|
+
}
|
|
1637
|
+
return "";
|
|
1638
|
+
};
|
|
1639
|
+
const label = heading ?? (lastH2 ? `${lastH2}\uFF08\u7EED\uFF09` : lastH1 ? `${lastH1}\uFF08\u7EED\uFF09` : firstLine());
|
|
1640
|
+
for (let k = i; k < lines.length && starts[k] < segEnd; k++) if (starts[k] >= segStart && !lines[k].inFence) {
|
|
1641
|
+
if (lines[k].line.startsWith("## ")) lastH2 = lines[k].line.trim();
|
|
1642
|
+
else if (lines[k].line.startsWith("# ")) lastH1 = lines[k].line.trim();
|
|
1643
|
+
}
|
|
1605
1644
|
segStart = segEnd;
|
|
1606
1645
|
return clip(label);
|
|
1607
1646
|
});
|
package/package.json
CHANGED
|
@@ -1,5 +1,5 @@
|
|
|
1
1
|
{
|
|
2
|
-
"name": "@ladderkitlab/hub-kb", "version": "0.
|
|
2
|
+
"name": "@ladderkitlab/hub-kb", "version": "1.0.0", "type": "module",
|
|
3
3
|
"license": "(MIT AND CC-BY-NC-SA-4.0)", "engines": { "node": ">=22" },
|
|
4
4
|
"publishConfig": { "access": "public" },
|
|
5
5
|
"bin": { "hub-kb": "./dist/main.js" }, "files": ["dist/", "snapshot/", "README.md", "LICENSE", "LICENSE-CONTENT"],
|