@musnows/scriverse 0.5.1 → 0.5.3

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.
@@ -8,6 +8,7 @@
8
8
  --accent: #8b3d2c;
9
9
  --accent-dark: #6e2e21;
10
10
  --green: #5e765c;
11
+ --task-running: #356f94;
11
12
  --shadow: 0 18px 50px rgba(49, 42, 32, 0.12);
12
13
  --surface: #fffefa;
13
14
  --surface-soft: rgba(255,255,255,.48);
@@ -234,6 +235,7 @@
234
235
  --accent: #bd6550;
235
236
  --accent-dark: #e08a72;
236
237
  --green: #89a985;
238
+ --task-running: #7fb8d8;
237
239
  --shadow: 0 18px 50px rgba(0,0,0,.38);
238
240
  --surface: #24221e;
239
241
  --surface-soft: rgba(48,45,39,.74);
@@ -519,6 +521,9 @@ body.is-panel-resizing { cursor: col-resize; user-select: none; }
519
521
  .shelf-header { display: flex; align-items: flex-end; justify-content: space-between; gap: 30px; width: 100%; max-width: 1400px; margin: 0 auto 38px; }
520
522
  .shelf-header h1 { margin: 0 0 10px; font-size: clamp(30px, 4vw, 52px); font-weight: 560; letter-spacing: -.04em; }
521
523
  .shelf-header p { margin: 0; color: var(--muted); }
524
+ .settings-detail-actions, .settings-dialog-header-actions { display: flex; align-items: center; gap: 10px; }
525
+ .settings-detail-actions { flex: 0 0 auto; }
526
+ .settings-parent-button { white-space: nowrap; }
522
527
  .settings-hub-header { align-items: center; }
523
528
  .settings-hub-header h1 { font-size: clamp(26px, 3vw, 36px); line-height: 1.15; letter-spacing: -.02em; }
524
529
  .settings-hub-grid { display: grid; grid-template-columns: repeat(2, minmax(0, 1fr)); gap: 14px; max-width: 1000px; margin: 0 auto; }
@@ -618,6 +623,17 @@ body.is-panel-resizing { cursor: col-resize; user-select: none; }
618
623
  .member-permission-row select { min-height: 34px; padding-block: 6px; font-size: 11px; }
619
624
  .member-permission-form .primary-button { justify-self: end; min-height: 38px; white-space: nowrap; }
620
625
  .permission-hidden { display: none !important; }
626
+ :is(#users-dialog, #platform-ui-settings-dialog, #members-dialog, #appearance-dialog) select:not([multiple]) {
627
+ appearance: none;
628
+ -webkit-appearance: none;
629
+ padding-inline-end: 40px;
630
+ background-image:
631
+ linear-gradient(45deg, transparent 50%, var(--muted) 50%),
632
+ linear-gradient(135deg, var(--muted) 50%, transparent 50%);
633
+ background-position: right 21px center, right 16px center;
634
+ background-repeat: no-repeat;
635
+ background-size: 5px 5px, 5px 5px;
636
+ }
621
637
  .app-shell.ai-hidden-mode:not(.shelf-mode) { grid-template-columns: var(--left-panel-width) minmax(480px, 1fr); }
622
638
  .app-shell.prose-hidden-mode:not(.shelf-mode) .left-actions,
623
639
  .app-shell.prose-hidden-mode:not(.shelf-mode) .panel-heading,
@@ -1197,7 +1213,7 @@ select:focus, input:focus, textarea:focus { border-color: #a77768; box-shadow: 0
1197
1213
  .task-auto-run-progress-ring-track { stroke: color-mix(in srgb, var(--line) 72%, transparent); }
1198
1214
  .task-auto-run-progress-ring-value { stroke: var(--accent); stroke-linecap: round; transition: stroke-dasharray .25s ease; }
1199
1215
  .task-auto-run-progress-ring.is-running svg { animation: task-auto-run-active 1.8s ease-in-out infinite; }
1200
- .task-auto-run-progress-ring.is-running .task-auto-run-progress-ring-value { stroke: var(--green); }
1216
+ .task-auto-run-progress-ring.is-running .task-auto-run-progress-ring-value { stroke: var(--task-running); }
1201
1217
  .task-auto-run-progress-ring-label { position: absolute; inset: 22px; display: grid; align-content: center; justify-items: center; gap: 3px; text-align: center; }
1202
1218
  .task-auto-run-progress-ring-label strong { color: var(--ink); font-family: var(--font-latin), monospace; font-size: 22px; font-weight: 600; line-height: 1; }
1203
1219
  .task-auto-run-progress-ring-label span { color: var(--muted); font-size: 9px; line-height: 1.35; }
@@ -1209,8 +1225,8 @@ select:focus, input:focus, textarea:focus { border-color: #a77768; box-shadow: 0
1209
1225
  .task-auto-run-progress-bar::-webkit-progress-value { border-radius: inherit; background: var(--accent); transition: width .25s ease; }
1210
1226
  .task-auto-run-progress-bar::-moz-progress-bar { border-radius: inherit; background: var(--accent); transition: width .25s ease; }
1211
1227
  .task-auto-run-progress-bar.is-running { animation: task-auto-run-active 1.8s ease-in-out infinite; }
1212
- .task-auto-run-progress-bar.is-running::-webkit-progress-value { background: var(--green); }
1213
- .task-auto-run-progress-bar.is-running::-moz-progress-bar { background: var(--green); }
1228
+ .task-auto-run-progress-bar.is-running::-webkit-progress-value { background: var(--task-running); }
1229
+ .task-auto-run-progress-bar.is-running::-moz-progress-bar { background: var(--task-running); }
1214
1230
  .task-status-cell { width: 116px; white-space: nowrap; }
1215
1231
  .task-status-badge {
1216
1232
  --task-status-color: var(--muted);
@@ -1246,7 +1262,7 @@ select:focus, input:focus, textarea:focus { border-color: #a77768; box-shadow: 0
1246
1262
  .task-status-badge.is-pending { --task-status-color: color-mix(in srgb, var(--accent) 48%, #b69043); }
1247
1263
  .task-status-badge.is-pending .task-status-indicator { background: transparent; border: 1px solid currentColor; animation: task-status-waiting 1.7s ease-in-out infinite; }
1248
1264
  .task-status-badge.is-running {
1249
- --task-status-color: var(--green);
1265
+ --task-status-color: var(--task-running);
1250
1266
  animation: task-status-running-breathe 1.8s ease-in-out infinite;
1251
1267
  }
1252
1268
  .task-status-badge.is-running .task-status-indicator::after { animation: task-status-running-ripple 1.8s ease-out infinite; }
@@ -1263,7 +1279,8 @@ select:focus, input:focus, textarea:focus { border-color: #a77768; box-shadow: 0
1263
1279
  .task-progress-value { color: var(--ink); font-family: var(--font-latin), monospace; font-size: 11px; font-variant-numeric: tabular-nums; font-weight: 600; }
1264
1280
  .task-progress-track { position: relative; display: block; height: 5px; overflow: hidden; border-radius: 999px; background: color-mix(in srgb, var(--line) 72%, transparent); }
1265
1281
  .task-progress-fill { position: relative; display: block; width: var(--task-progress); height: 100%; overflow: hidden; border-radius: inherit; background: var(--muted); transition: width .35s ease; }
1266
- .task-progress.is-running .task-progress-fill, .task-progress.is-review .task-progress-fill, .task-progress.is-completed .task-progress-fill { background: var(--green); }
1282
+ .task-progress.is-running .task-progress-fill { background: var(--task-running); }
1283
+ .task-progress.is-review .task-progress-fill, .task-progress.is-completed .task-progress-fill { background: var(--green); }
1267
1284
  .task-progress.is-partial .task-progress-fill { background: var(--accent); }
1268
1285
  .task-progress.is-running .task-progress-fill::after {
1269
1286
  content: "";
@@ -1308,6 +1325,50 @@ select:focus, input:focus, textarea:focus { border-color: #a77768; box-shadow: 0
1308
1325
  font-size: 10px;
1309
1326
  white-space: pre-wrap;
1310
1327
  }
1328
+ .task-result-readable { display: grid; gap: 10px; margin-top: 7px !important; }
1329
+ .task-result-section { display: grid; gap: 7px; min-width: 0; padding: 12px; border: 1px solid var(--line); border-radius: 6px; background: var(--surface); }
1330
+ .task-result-section h4 { margin: 0 0 2px; color: var(--ink); font-size: 13px; }
1331
+ .task-result-section code { overflow-wrap: anywhere; }
1332
+ .task-result-summary { white-space: pre-wrap; }
1333
+ .task-result-storage-list { display: grid; gap: 6px; }
1334
+ .task-result-storage-list article { display: grid; gap: 3px; min-width: 0; padding: 9px 10px; border: 1px solid var(--line); border-radius: 5px; background: var(--surface-soft); }
1335
+ .task-result-storage-list article strong, .task-result-storage-list article span, .task-result-storage-list article small { overflow-wrap: anywhere; }
1336
+ .task-result-storage-list article span { color: var(--muted); }
1337
+ .task-result-storage-list article small { color: var(--muted); }
1338
+ .task-result-metrics { display: grid; grid-template-columns: repeat(4, minmax(0, 1fr)); gap: 1px; overflow: hidden; margin-top: 3px !important; border: 1px solid var(--line); border-radius: 5px; background: var(--line); }
1339
+ .task-result-metrics span { display: flex; gap: 5px; align-items: baseline; padding: 8px 10px; background: var(--surface-soft); color: var(--muted); }
1340
+ .task-result-metrics strong { color: var(--accent-dark); font-family: var(--font-latin), ui-monospace, SFMono-Regular, Menlo, Monaco, Consolas, monospace; font-size: 15px; }
1341
+ .task-result-item { display: grid; gap: 9px; padding: 11px; border: 1px solid var(--line); border-radius: 6px; background: var(--surface-soft); }
1342
+ .task-result-item + .task-result-item { margin-top: 3px; }
1343
+ .task-result-item > header { display: grid; gap: 2px; min-width: 0; }
1344
+ .task-result-item > header > div { display: flex; flex-wrap: wrap; align-items: baseline; gap: 2px 8px; min-width: 0; }
1345
+ .task-result-item > header strong { min-width: 0; overflow-wrap: anywhere; font-size: 13px; }
1346
+ .task-result-item > header small { color: var(--muted); }
1347
+ .task-result-item-description { white-space: pre-wrap; }
1348
+ .task-result-item-details { display: grid; grid-template-columns: repeat(2, minmax(0, 1fr)); gap: 6px; margin: 0; }
1349
+ .task-result-item-details > div { display: grid; grid-template-columns: max-content minmax(0, 1fr); gap: 7px; min-width: 0; padding: 6px 8px; border-radius: 4px; background: var(--surface); }
1350
+ .task-result-item-details dt { color: var(--muted); font-size: 10px; }
1351
+ .task-result-item-details dd { min-width: 0; margin: 0; overflow-wrap: anywhere; color: var(--ink); font-size: 10px; }
1352
+ .task-result-tags { display: flex; flex-wrap: wrap; gap: 5px; }
1353
+ .task-result-tags span { padding: 2px 7px; border: 1px solid color-mix(in srgb, var(--accent) 30%, var(--line)); border-radius: 999px; color: var(--accent-dark); font-size: 9px; }
1354
+ .task-result-item details, .task-result-technical { border-top: 1px solid var(--line); padding-top: 7px; }
1355
+ .task-result-item summary, .task-result-technical > summary { width: fit-content; cursor: pointer; color: var(--accent-dark); font-size: 10px; }
1356
+ .task-result-evidence { display: grid; gap: 7px; margin-top: 8px !important; padding-left: 17px !important; }
1357
+ .task-result-evidence li { padding-left: 2px; }
1358
+ .task-result-evidence li strong, .task-result-evidence li q, .task-result-evidence li small { display: block; }
1359
+ .task-result-evidence li strong { font-size: 10px; }
1360
+ .task-result-evidence li q { margin-top: 2px; color: var(--ink); }
1361
+ .task-result-evidence li small, .task-result-muted { color: var(--muted); }
1362
+ .task-result-empty, .task-result-warning { padding: 9px; border-radius: 5px; background: var(--surface-soft); color: var(--muted); }
1363
+ .task-result-warning { border: 1px solid color-mix(in srgb, var(--accent) 34%, var(--line)); color: var(--ink); }
1364
+ .task-result-technical { margin-top: 2px; }
1365
+ .task-result-json-loader { display: grid; grid-template-columns: minmax(0, 1fr) max-content; gap: 10px 14px; align-items: center; padding: 12px; border: 1px solid var(--line); border-radius: 6px; background: var(--surface); }
1366
+ .task-result-json-loader > div:first-child { display: grid; gap: 3px; }
1367
+ .task-result-json-loader p { color: var(--muted); }
1368
+ .task-result-json-loader button { align-self: center; }
1369
+ .task-result-json-content { grid-column: 1 / -1; min-width: 0; }
1370
+ .task-result-json-content:empty { display: none; }
1371
+ .task-result-json-content textarea { width: 100%; min-height: 360px; max-height: 52vh; resize: vertical; overflow: auto; margin: 0; padding: 10px; border: 1px solid var(--line); border-radius: 4px; background: var(--surface-soft); color: var(--ink); font-family: var(--font-latin), ui-monospace, SFMono-Regular, Menlo, Monaco, Consolas, monospace; font-size: 10px; line-height: 1.55; tab-size: 2; white-space: pre; }
1311
1372
  .task-trace-section { display: grid; gap: 16px; min-width: 0; margin-top: 6px; }
1312
1373
  .task-trace-heading { display: flex; align-items: end; justify-content: space-between; gap: 20px; padding-top: 8px; }
1313
1374
  .task-trace-heading h3 { margin: 3px 0 0; font-size: 19px; font-weight: 600; }
@@ -1324,9 +1385,11 @@ select:focus, input:focus, textarea:focus { border-color: #a77768; box-shadow: 0
1324
1385
  .task-trace-call > summary:hover, .task-trace-call > summary:focus-visible { background: var(--surface-soft); outline: none; }
1325
1386
  .task-trace-call > summary > span:nth-child(2) { display: grid; min-width: 0; gap: 2px; }
1326
1387
  .task-trace-call > summary small { overflow: hidden; color: var(--muted); font-size: 9px; text-overflow: ellipsis; white-space: nowrap; }
1388
+ .task-trace-call > summary .task-trace-call-sources { overflow: visible; color: var(--ink-soft); line-height: 1.45; text-overflow: clip; white-space: normal; }
1327
1389
  .task-trace-call-index, .task-trace-round-index { display: grid; place-items: center; width: 28px; height: 28px; border: 1px solid color-mix(in srgb, var(--accent) 42%, var(--line)); border-radius: 50%; background: color-mix(in srgb, var(--accent) 9%, var(--surface)); color: var(--accent-dark); font-family: var(--font-latin), ui-monospace, SFMono-Regular, Menlo, Monaco, Consolas, monospace; font-size: 10px; font-weight: 700; }
1328
1390
  .task-trace-status { padding: 3px 8px; border: 1px solid var(--line); border-radius: 999px; color: var(--muted); font-size: 9px; }
1329
1391
  .task-trace-call.is-completed .task-trace-status { border-color: color-mix(in srgb, var(--green) 42%, var(--line)); color: var(--green); }
1392
+ .task-trace-call.is-failed .task-trace-status { border-color: color-mix(in srgb, var(--accent) 72%, var(--line)); background: color-mix(in srgb, var(--accent) 14%, var(--surface)); color: var(--accent-dark); font-weight: 700; }
1330
1393
  .task-trace-call-body { display: grid; gap: 13px; padding: 0 15px 16px 54px; border-top: 1px solid var(--line); }
1331
1394
  .task-trace-call-meta { display: flex; flex-wrap: wrap; justify-content: space-between; gap: 8px; padding-top: 12px; color: var(--muted); font-size: 9px !important; }
1332
1395
  .task-trace-call-meta code { overflow-wrap: anywhere; }
@@ -1334,7 +1397,6 @@ select:focus, input:focus, textarea:focus { border-color: #a77768; box-shadow: 0
1334
1397
  .task-trace-load-state.is-loaded { display: grid; align-items: stretch; }
1335
1398
  .task-trace-load-state > div:first-child { display: grid; gap: 4px; }
1336
1399
  .task-trace-load-state p { margin: 0; color: var(--muted); font-size: 9px; }
1337
- .task-trace-round-summary > p { margin: 0 0 0 38px; color: var(--muted); font-size: 9px; }
1338
1400
  .task-trace-initial, .task-trace-prompt, .task-trace-response, .task-trace-tools > details, .task-trace-request-meta { border: 1px solid var(--line); border-radius: 5px; background: var(--surface-soft); }
1339
1401
  .task-trace-initial > summary, .task-trace-prompt > summary, .task-trace-response > summary, .task-trace-tools > details > summary, .task-trace-request-meta > summary { padding: 9px 11px; color: var(--muted); cursor: pointer; font-size: 10px; font-weight: 600; }
1340
1402
  .task-trace-initial[open] > summary, .task-trace-prompt[open] > summary, .task-trace-response[open] > summary, .task-trace-tools > details[open] > summary, .task-trace-request-meta[open] > summary { border-bottom: 1px solid var(--line); color: var(--ink); }
@@ -2539,6 +2601,8 @@ select:focus, input:focus, textarea:focus { border-color: #a77768; box-shadow: 0
2539
2601
  .shelf-header, .module-header { align-items: stretch; flex-direction: column; gap: 14px; margin-bottom: 20px; }
2540
2602
  .shelf-header h1 { font-size: clamp(24px, 7.5vw, 32px); }
2541
2603
  .shelf-header .primary-button { align-self: flex-start; min-width: 150px; min-height: 40px; padding: 10px 18px; }
2604
+ .settings-detail-actions { align-items: stretch; flex-direction: column; }
2605
+ .settings-detail-actions .primary-button, .settings-detail-actions .settings-parent-button { align-self: stretch; width: 100%; }
2542
2606
  .module-header-actions { width: 100%; }
2543
2607
  .book-shelf { grid-template-columns: repeat(2, minmax(0, 1fr)); gap: 20px 14px; }
2544
2608
  .book-info { padding-top: 10px; padding-right: 0; }
@@ -2584,9 +2648,13 @@ select:focus, input:focus, textarea:focus { border-color: #a77768; box-shadow: 0
2584
2648
  }
2585
2649
  .dialog-header { padding: 14px 16px 12px; }
2586
2650
  .dialog-header h2 { font-size: 20px; }
2651
+ .settings-dialog-header-actions { gap: 6px; }
2587
2652
  .dialog-fields, .appearance-grid, .access-dialog-body, .account-settings-body, .versions-list, .entity-history-list { padding-inline: 16px; }
2588
2653
  .task-detail-overview { grid-template-columns: minmax(0, 1fr); padding: 12px; }
2589
2654
  .task-detail-overview > * { grid-column: 1 !important; }
2655
+ .task-result-metrics { grid-template-columns: repeat(2, minmax(0, 1fr)); }
2656
+ .task-result-item-details, .task-result-json-loader { grid-template-columns: minmax(0, 1fr); }
2657
+ .task-result-json-loader button { justify-self: start; }
2590
2658
  .task-trace-heading { align-items: start; flex-direction: column; gap: 5px; }
2591
2659
  .task-trace-heading p { text-align: left; }
2592
2660
  .task-trace-metrics { grid-template-columns: repeat(2, minmax(0, 1fr)); }
@@ -0,0 +1,196 @@
1
+ import { pinyin } from "pinyin-pro";
2
+ export const RELATIONSHIP_SEARCH_POLICY_VERSION = 1;
3
+ export function normalizeRelationshipSearchText(value) {
4
+ return value.normalize("NFKC").toLocaleLowerCase("zh-CN");
5
+ }
6
+ function encodedCodePoint(value) {
7
+ return [...value].map((character) => character.codePointAt(0).toString(16)).join("x");
8
+ }
9
+ function safePinyinToken(value) {
10
+ const normalized = value.normalize("NFKC").toLocaleLowerCase("zh-CN").replaceAll("ü", "v");
11
+ return /^[a-z0-9]+$/u.test(normalized) ? `p${normalized}` : `u${encodedCodePoint(normalized)}`;
12
+ }
13
+ export function relationshipCharacterTokens(value) {
14
+ return [...normalizeRelationshipSearchText(value)].map((character) => `u${encodedCodePoint(character)}`);
15
+ }
16
+ export function relationshipPinyinSyllables(value) {
17
+ const normalized = normalizeRelationshipSearchText(value);
18
+ return pinyin(normalized, { toneType: "none", type: "array" })
19
+ .map((item) => item.normalize("NFKC").toLocaleLowerCase("zh-CN").replaceAll("ü", "v"));
20
+ }
21
+ export function relationshipPinyinTokens(value) {
22
+ return relationshipPinyinSyllables(value).map(safePinyinToken);
23
+ }
24
+ export function relationshipCharacterTokenText(value) {
25
+ return relationshipCharacterTokens(value).join(" ");
26
+ }
27
+ export function relationshipPinyinTokenText(value) {
28
+ return relationshipPinyinTokens(value).join(" ");
29
+ }
30
+ export function ftsPhrase(tokens) {
31
+ return `"${tokens.join(" ").replaceAll('"', '""')}"`;
32
+ }
33
+ export function damerauLevenshteinDistance(left, right, maximum = Number.POSITIVE_INFINITY) {
34
+ if (Math.abs(left.length - right.length) > maximum)
35
+ return maximum + 1;
36
+ const previousPrevious = new Array(right.length + 1).fill(0);
37
+ let previous = Array.from({ length: right.length + 1 }, (_, index) => index);
38
+ for (let leftIndex = 1; leftIndex <= left.length; leftIndex += 1) {
39
+ const current = new Array(right.length + 1).fill(0);
40
+ current[0] = leftIndex;
41
+ let rowMinimum = current[0];
42
+ for (let rightIndex = 1; rightIndex <= right.length; rightIndex += 1) {
43
+ const substitutionCost = left[leftIndex - 1] === right[rightIndex - 1] ? 0 : 1;
44
+ current[rightIndex] = Math.min(previous[rightIndex] + 1, current[rightIndex - 1] + 1, previous[rightIndex - 1] + substitutionCost);
45
+ if (leftIndex > 1 && rightIndex > 1
46
+ && left[leftIndex - 1] === right[rightIndex - 2]
47
+ && left[leftIndex - 2] === right[rightIndex - 1]) {
48
+ current[rightIndex] = Math.min(current[rightIndex], previousPrevious[rightIndex - 2] + 1);
49
+ }
50
+ rowMinimum = Math.min(rowMinimum, current[rightIndex]);
51
+ }
52
+ if (rowMinimum > maximum)
53
+ return maximum + 1;
54
+ for (let index = 0; index < previous.length; index += 1)
55
+ previousPrevious[index] = previous[index];
56
+ previous = current;
57
+ }
58
+ return previous[right.length];
59
+ }
60
+ export class RelationshipApproximateMatchLimitError extends Error {
61
+ maximumCandidates;
62
+ constructor(maximumCandidates) {
63
+ super(`Approximate relationship match candidates exceeded ${maximumCandidates}`);
64
+ this.maximumCandidates = maximumCandidates;
65
+ this.name = "RelationshipApproximateMatchLimitError";
66
+ }
67
+ }
68
+ function selectApproximateNameMatches(matches, referenceLength, limit) {
69
+ const ranked = matches.sort((left, right) => Math.min(left.characterDistance, left.pinyinDistance) - Math.min(right.characterDistance, right.pinyinDistance)
70
+ || Math.abs([...left.observed].length - referenceLength) - Math.abs([...right.observed].length - referenceLength)
71
+ || left.start - right.start);
72
+ const selected = [];
73
+ for (const match of ranked) {
74
+ if (selected.some((item) => match.start < item.end && match.end > item.start))
75
+ continue;
76
+ selected.push(match);
77
+ if (selected.length >= limit)
78
+ break;
79
+ }
80
+ return selected.sort((left, right) => left.start - right.start);
81
+ }
82
+ export function findApproximateNameMatches(content, reference, limit = 3, excludedObserved = new Set(), maximumCandidates = 256) {
83
+ const normalizedContent = normalizeRelationshipSearchText(content);
84
+ const normalizedReference = normalizeRelationshipSearchText(reference).trim();
85
+ const sourceCharacters = [...normalizedContent];
86
+ const utf16Offsets = new Array(sourceCharacters.length + 1).fill(0);
87
+ for (let index = 0; index < sourceCharacters.length; index += 1) {
88
+ utf16Offsets[index + 1] = utf16Offsets[index] + sourceCharacters[index].length;
89
+ }
90
+ const referenceCharacters = [...normalizedReference];
91
+ if (referenceCharacters.length < 2 || sourceCharacters.length === 0)
92
+ return [];
93
+ const hanReference = referenceCharacters.every((character) => /\p{Script=Han}/u.test(character));
94
+ const normalizedExcluded = new Set([...excludedObserved].map((item) => normalizeRelationshipSearchText(item).trim()));
95
+ const referencePinyin = relationshipPinyinSyllables(normalizedReference);
96
+ const sourcePinyin = relationshipPinyinSyllables(normalizedContent);
97
+ const exactCoverage = new Uint8Array(sourceCharacters.length);
98
+ for (let start = 0; start + referenceCharacters.length <= sourceCharacters.length; start += 1) {
99
+ if (!referenceCharacters.every((character, index) => sourceCharacters[start + index] === character))
100
+ continue;
101
+ exactCoverage.fill(1, start, start + referenceCharacters.length);
102
+ }
103
+ const matches = [];
104
+ const seen = new Set();
105
+ for (const windowLength of [referenceCharacters.length, referenceCharacters.length - 1, referenceCharacters.length + 1]) {
106
+ if (windowLength < 1)
107
+ continue;
108
+ for (let start = 0; start + windowLength <= sourceCharacters.length; start += 1) {
109
+ const observedCharacters = sourceCharacters.slice(start, start + windowLength);
110
+ if (observedCharacters.length < 2)
111
+ continue;
112
+ if (hanReference && !observedCharacters.every((character) => /\p{Script=Han}/u.test(character)))
113
+ continue;
114
+ const observed = observedCharacters.join("");
115
+ if (!observed.trim() || observed === normalizedReference || normalizedExcluded.has(observed))
116
+ continue;
117
+ if (exactCoverage.subarray(start, start + windowLength).some((value) => value === 1))
118
+ continue;
119
+ const characterDistance = damerauLevenshteinDistance(referenceCharacters, observedCharacters, 1);
120
+ const observedPinyin = sourcePinyin.slice(start, start + windowLength);
121
+ const pinyinDistance = damerauLevenshteinDistance(referencePinyin, observedPinyin, 1);
122
+ if (characterDistance > 1 && pinyinDistance > 1)
123
+ continue;
124
+ const key = `${start}:${observed}`;
125
+ if (seen.has(key))
126
+ continue;
127
+ seen.add(key);
128
+ matches.push({
129
+ observed,
130
+ start,
131
+ end: start + windowLength,
132
+ utf16Start: utf16Offsets[start],
133
+ utf16End: utf16Offsets[start + windowLength],
134
+ characterDistance,
135
+ pinyinDistance
136
+ });
137
+ if (matches.length > maximumCandidates)
138
+ throw new RelationshipApproximateMatchLimitError(maximumCandidates);
139
+ }
140
+ }
141
+ return selectApproximateNameMatches(matches, referenceCharacters.length, limit);
142
+ }
143
+ export async function findApproximateNameMatchesChunked(content, reference, limit = 3, excludedObserved = new Set(), maximumCandidates = 256, chunkSize = 16_384) {
144
+ const normalizedContent = normalizeRelationshipSearchText(content);
145
+ const referenceLength = [...normalizeRelationshipSearchText(reference).trim()].length;
146
+ if (referenceLength < 2 || !normalizedContent || chunkSize < 1)
147
+ return [];
148
+ const overlapSize = referenceLength + 1;
149
+ const matches = [];
150
+ const seen = new Set();
151
+ let processedCharacters = 0;
152
+ let processedCodeUnits = 0;
153
+ let tail = [];
154
+ let chunk = [];
155
+ const processChunk = async () => {
156
+ if (chunk.length === 0)
157
+ return;
158
+ const prefixLength = tail.length;
159
+ const prefixCodeUnits = tail.reduce((total, character) => total + character.length, 0);
160
+ const combined = [...tail, ...chunk];
161
+ const baseOffset = processedCharacters - prefixLength;
162
+ const baseCodeUnitOffset = processedCodeUnits - prefixCodeUnits;
163
+ const chunkMatches = findApproximateNameMatches(combined.join(""), reference, maximumCandidates + 1, excludedObserved, maximumCandidates);
164
+ for (const match of chunkMatches) {
165
+ if (match.end <= prefixLength)
166
+ continue;
167
+ const adjusted = {
168
+ ...match,
169
+ start: match.start + baseOffset,
170
+ end: match.end + baseOffset,
171
+ utf16Start: match.utf16Start + baseCodeUnitOffset,
172
+ utf16End: match.utf16End + baseCodeUnitOffset
173
+ };
174
+ const key = `${adjusted.start}:${adjusted.observed}`;
175
+ if (seen.has(key))
176
+ continue;
177
+ seen.add(key);
178
+ matches.push(adjusted);
179
+ if (matches.length > maximumCandidates)
180
+ throw new RelationshipApproximateMatchLimitError(maximumCandidates);
181
+ }
182
+ processedCharacters += chunk.length;
183
+ processedCodeUnits += chunk.reduce((total, character) => total + character.length, 0);
184
+ tail = combined.slice(-overlapSize);
185
+ chunk = [];
186
+ await new Promise((resolve) => setImmediate(resolve));
187
+ };
188
+ for (const character of normalizedContent) {
189
+ chunk.push(character);
190
+ if (chunk.length >= chunkSize)
191
+ await processChunk();
192
+ }
193
+ await processChunk();
194
+ return selectApproximateNameMatches(matches, referenceLength, limit);
195
+ }
196
+ //# sourceMappingURL=relationship-search.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"relationship-search.js","sourceRoot":"","sources":["../src/relationship-search.ts"],"names":[],"mappings":"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"}