@musnows/scriverse 0.5.8 → 0.5.9

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.
@@ -2,22 +2,63 @@ const entityTargets = Object.freeze({
2
2
  setting: Object.freeze({ module: "settings", entity: "setting", resource: "settings" }),
3
3
  character: Object.freeze({ module: "characters", entity: "character", resource: "characters" }),
4
4
  race: Object.freeze({ module: "races", entity: "race", resource: "races" }),
5
- organization: Object.freeze({ module: "organizations", entity: "organization", resource: "organizations" })
5
+ organization: Object.freeze({ module: "organizations", entity: "organization", resource: "organizations" }),
6
+ "timeline-track": Object.freeze({ module: "timeline", entity: "timeline-track", resource: "timeline-tracks" }),
7
+ "timeline-event": Object.freeze({ module: "timeline", entity: "timeline-event", resource: "timeline" }),
8
+ relationship: Object.freeze({ module: "relationships", entity: "relationship", resource: "relationships" }),
9
+ "chapter-outline": Object.freeze({ module: "outlines", entity: "chapter-outline", resource: "chapters", suffix: "outline" }),
10
+ foreshadow: Object.freeze({ module: "outlines", entity: "foreshadow", resource: "foreshadows" }),
11
+ review: Object.freeze({ module: "reviews", entity: "review", resource: "reviews" })
6
12
  });
7
13
 
14
+ function positiveLine(value) {
15
+ const line = Number(value);
16
+ return Number.isInteger(line) && line > 0 ? line : null;
17
+ }
18
+
19
+ export function splitGlobalSearchHighlight(value, query) {
20
+ const text = String(value ?? "");
21
+ const needle = String(query ?? "").trim();
22
+ if (!text || !needle) return text ? [{ text, match: false }] : [];
23
+ const lowerText = text.toLocaleLowerCase("zh-CN");
24
+ const lowerNeedle = needle.toLocaleLowerCase("zh-CN");
25
+ const segments = [];
26
+ let cursor = 0;
27
+ while (cursor < text.length) {
28
+ const index = lowerText.indexOf(lowerNeedle, cursor);
29
+ if (index < 0) break;
30
+ if (index > cursor) segments.push({ text: text.slice(cursor, index), match: false });
31
+ segments.push({ text: text.slice(index, index + needle.length), match: true });
32
+ cursor = index + needle.length;
33
+ }
34
+ if (cursor < text.length) segments.push({ text: text.slice(cursor), match: false });
35
+ return segments.length ? segments : [{ text, match: false }];
36
+ }
37
+
8
38
  export function resolveGlobalSearchTarget(result = {}) {
9
39
  const type = String(result.type ?? "").trim();
10
40
  const id = String(result.id ?? "").trim();
11
41
  if (!id) return null;
12
- if (type === "chapter") return { kind: "chapter", type, id, module: "editor" };
42
+ if (type === "chapter") {
43
+ const startLine = positiveLine(result.startLine);
44
+ const endLine = positiveLine(result.endLine);
45
+ return {
46
+ kind: "chapter",
47
+ type,
48
+ id,
49
+ module: "editor",
50
+ ...(startLine ? { startLine, endLine: endLine && endLine >= startLine ? endLine : startLine } : {})
51
+ };
52
+ }
13
53
  const target = entityTargets[type];
14
54
  if (!target) return null;
55
+ const encodedId = encodeURIComponent(id);
15
56
  return {
16
57
  kind: "entity",
17
58
  type,
18
59
  id,
19
60
  module: target.module,
20
61
  entity: target.entity,
21
- apiPath: `/api/${target.resource}/${encodeURIComponent(id)}`
62
+ apiPath: `/api/${target.resource}/${encodedId}${target.suffix ? `/${target.suffix}` : ""}`
22
63
  };
23
64
  }
@@ -10,7 +10,7 @@
10
10
  <link rel="icon" href="/icon.svg?v=20260712" type="image/svg+xml">
11
11
  <link rel="manifest" href="/site.webmanifest">
12
12
  <link rel="stylesheet" href="/vendor/vditor/dist/index.css?v=3.11.2">
13
- <link rel="stylesheet" href="/styles.css?v=20260728-shelf-cover-scale-v1">
13
+ <link rel="stylesheet" href="/styles.css?v=20260729-continuous-analysis-queue-merge-v1">
14
14
  </head>
15
15
  <body class="auth-pending">
16
16
  <section id="auth-view" class="auth-view hidden" aria-labelledby="auth-title">
@@ -557,7 +557,21 @@
557
557
  </div>
558
558
  <div class="access-dialog-body">
559
559
  <form id="search-form" class="search-form">
560
- <label>关键词<input id="search-query" name="query" type="search" maxlength="100" placeholder="搜索正文、设定、角色、种族或组织" required></label>
560
+ <label>关键词<input id="search-query" name="query" type="search" maxlength="500" placeholder="搜索正文、设定、人物、时间线、关系、大纲或伏笔" required></label>
561
+ <label>资料类型<select id="search-type" name="type">
562
+ <option value="">全部资料</option>
563
+ <option value="chapter">章节</option>
564
+ <option value="setting">设定</option>
565
+ <option value="character">角色</option>
566
+ <option value="race">种族</option>
567
+ <option value="organization">组织</option>
568
+ <option value="timeline-track">独立时间轴</option>
569
+ <option value="timeline-event">时间线事件</option>
570
+ <option value="relationship">人物关系</option>
571
+ <option value="chapter-outline">章节大纲</option>
572
+ <option value="foreshadow">伏笔</option>
573
+ <option value="review">审核项</option>
574
+ </select></label>
561
575
  <button class="primary-button" type="submit">搜索</button>
562
576
  </form>
563
577
  <div id="search-results" class="search-results" aria-live="polite">
@@ -696,12 +710,11 @@
696
710
  <label>Toast 提示位置<select id="toast-position" name="toastPosition" aria-label="Toast 提示位置"><option value="bottom-right">右下角(默认)</option><option value="top-right">右上角</option></select></label>
697
711
  <small>该设置对所有用户生效,保存后的提示会立即显示在新位置。</small>
698
712
  <fieldset class="pagination-settings-fieldset">
699
- <legend>各模块单页数量</legend>
700
- <small>每个模块独立设置,允许 10–100 条;默认均为 30 条。</small>
713
+ <legend>可分页模块单页数量</legend>
714
+ <small>以下模块独立设置,允许 10–100 条;默认均为 30 条。种族层级始终完整展示。</small>
701
715
  <div class="pagination-settings-grid">
702
716
  <label>设定库<input id="page-size-settings" name="pageSizeSettings" type="number" min="10" max="100" step="1" required aria-label="设定库单页数量"></label>
703
717
  <label>角色列表<input id="page-size-characters" name="pageSizeCharacters" type="number" min="10" max="100" step="1" required aria-label="角色列表单页数量"></label>
704
- <label>种族列表<input id="page-size-races" name="pageSizeRaces" type="number" min="10" max="100" step="1" required aria-label="种族列表单页数量"></label>
705
718
  <label>组织列表<input id="page-size-organizations" name="pageSizeOrganizations" type="number" min="10" max="100" step="1" required aria-label="组织列表单页数量"></label>
706
719
  <label>时间线事件<input id="page-size-timeline" name="pageSizeTimeline" type="number" min="10" max="100" step="1" required aria-label="时间线事件单页数量"></label>
707
720
  <label>大纲与伏笔<input id="page-size-outlines" name="pageSizeOutlines" type="number" min="10" max="100" step="1" required aria-label="大纲与伏笔单页数量"></label>
@@ -739,7 +752,7 @@
739
752
  <button id="api-key-reset-button" class="primary-button" type="button">生成 API Key</button>
740
753
  <div id="api-key-result" class="api-key-result hidden">
741
754
  <label>请立即保存<input id="api-key-value" readonly spellcheck="false"></label>
742
- <button id="api-key-copy-button" type="button">复制</button>
755
+ <button id="api-key-copy-button" class="ghost-button" type="button"><svg class="message-action-icon" viewBox="0 0 24 24" aria-hidden="true"><rect x="8" y="8" width="12" height="12" rx="2"/><path d="M16 8V6a2 2 0 0 0-2-2H6a2 2 0 0 0-2 2v8a2 2 0 0 0 2 2h2"/></svg>复制</button>
743
756
  </div>
744
757
  </div>
745
758
  </section>
@@ -863,6 +876,6 @@
863
876
  <div id="auth-loading" class="auth-loading" role="status" aria-label="正在载入工作台"></div>
864
877
  <script id="vditorIconScript" src="/vendor/vditor/dist/js/icons/ant.js?v=3.11.2"></script>
865
878
  <script src="/vendor/vditor/dist/index.min.js?v=3.11.2"></script>
866
- <script type="module" src="/app.js?v=20260728-chapter-purge-v1"></script>
879
+ <script type="module" src="/app.js?v=20260729-continuous-analysis-queue-merge-v1"></script>
867
880
  </body>
868
881
  </html>
@@ -83,38 +83,3 @@ export function buildRaceForest(races) {
83
83
  };
84
84
  return sort(roots);
85
85
  }
86
-
87
- export function paginateRaceForest(races, page, limit) {
88
- const safeLimit = Math.max(1, Math.floor(Number(limit) || 1));
89
- const forest = buildRaceForest(races);
90
- const pages = [];
91
- let currentItems = [];
92
- let currentItemCount = 0;
93
- const subtreeSize = (node) => 1 + node.children.reduce((total, child) => total + subtreeSize(child), 0);
94
-
95
- for (const root of forest) {
96
- const rootItemCount = subtreeSize(root);
97
- if (currentItems.length && currentItemCount + rootItemCount > safeLimit) {
98
- pages.push({ items: currentItems, itemCount: currentItemCount });
99
- currentItems = [];
100
- currentItemCount = 0;
101
- }
102
- currentItems.push(root);
103
- currentItemCount += rootItemCount;
104
- }
105
- if (currentItems.length || !pages.length) pages.push({ items: currentItems, itemCount: currentItemCount });
106
-
107
- const pageCount = pages.length;
108
- const safePage = Math.min(Math.max(1, Number(page) || 1), pageCount);
109
- const selectedPage = pages[safePage - 1];
110
- return {
111
- items: selectedPage.items,
112
- itemCount: selectedPage.itemCount,
113
- page: safePage,
114
- limit: safeLimit,
115
- total: races.length,
116
- pageCount,
117
- hasMore: safePage < pageCount,
118
- nextPage: safePage < pageCount ? safePage + 1 : null
119
- };
120
- }
@@ -818,9 +818,9 @@ body.work-viewer-mode [data-item-list-remove],
818
818
  body.work-viewer-mode [data-structured-list-add],
819
819
  body.work-viewer-mode [data-structured-list-remove],
820
820
  body.work-viewer-mode .character-editor-actions { display: none !important; }
821
- .search-form { display: grid; grid-template-columns: minmax(0, 1fr) auto; align-items: end; gap: 10px; margin: 0; }
821
+ .search-form { display: grid; grid-template-columns: minmax(0, 1fr) minmax(150px, .36fr) auto; align-items: end; gap: 10px; margin: 0; }
822
822
  .search-form label { display: grid; gap: 6px; color: var(--muted); font-size: 11px; }
823
- .search-form input {
823
+ .search-form input, .search-form select {
824
824
  width: 100%;
825
825
  min-height: 38px;
826
826
  padding: 9px 10px;
@@ -832,6 +832,7 @@ body.work-viewer-mode .character-editor-actions { display: none !important; }
832
832
  }
833
833
  .search-form .primary-button { min-height: 38px; white-space: nowrap; }
834
834
  .search-results { display: grid; gap: 8px; max-height: min(52vh, 480px); overflow: auto; }
835
+ .search-results-summary { margin: 0; padding: 2px 2px 5px; color: var(--muted); font-size: 10px; }
835
836
  .search-results-empty, .search-results-status {
836
837
  margin: 0;
837
838
  padding: 28px 12px;
@@ -882,6 +883,17 @@ body.work-viewer-mode .character-editor-actions { display: none !important; }
882
883
  -webkit-line-clamp: 2;
883
884
  -webkit-box-orient: vertical;
884
885
  }
886
+ .search-result mark { border-radius: 2px; padding: 0 1px; background: color-mix(in srgb, var(--accent) 20%, transparent); color: var(--ink); }
887
+ .search-result-details { display: flex; min-width: 0; flex-wrap: wrap; align-items: center; gap: 5px; color: var(--muted); }
888
+ .search-result-details small { overflow: hidden; margin-right: auto; font-size: 10px; text-overflow: ellipsis; white-space: nowrap; }
889
+ .search-result-chip { padding: 2px 6px; border: 1px solid var(--line); border-radius: 999px; background: var(--surface); font-size: 9px; line-height: 1.3; }
890
+ .search-result-chip-exact { border-color: color-mix(in srgb, var(--accent) 35%, var(--line)); color: var(--accent-dark); }
891
+ .search-result-chip-phonetic { border-color: color-mix(in srgb, var(--green) 35%, var(--line)); color: var(--green); }
892
+ .search-result-preview { display: grid; gap: 0; margin: 0; }
893
+ .search-result-preview > div { display: grid; grid-template-columns: minmax(90px, .28fr) minmax(0, 1fr); gap: 14px; padding: 11px 2px; border-bottom: 1px solid var(--line); }
894
+ .search-result-preview > div:last-child { border-bottom: 0; }
895
+ .search-result-preview dt { color: var(--muted); font-size: 10px; }
896
+ .search-result-preview dd { margin: 0; color: var(--ink); font-size: 12px; line-height: 1.6; white-space: pre-wrap; }
885
897
  .work-access-field { display: flex; align-items: center; justify-content: space-between; gap: 16px; padding: 14px; border: 1px solid var(--line); border-radius: 5px; background: var(--surface-soft); }
886
898
  .work-access-field > div { display: grid; gap: 6px; min-width: 0; }
887
899
  .work-access-field strong { color: var(--ink); font-size: 12px; }
@@ -982,7 +994,7 @@ body.work-viewer-mode .character-editor-actions { display: none !important; }
982
994
  .api-key-result.hidden { display: none; }
983
995
  .api-key-result label { display: grid; gap: 6px; color: var(--muted); font-size: 11px; }
984
996
  .api-key-result input { width: 100%; min-height: 38px; padding: 9px 10px; background: var(--surface); font-family: ui-monospace, SFMono-Regular, Menlo, Monaco, Consolas, monospace; font-size: 11px; }
985
- .api-key-result button { min-height: 38px; }
997
+ .api-key-result button { display: inline-flex; align-items: center; gap: 6px; min-height: 38px; }
986
998
  .book-access-badge { display: inline-flex; width: fit-content; margin-top: 7px; padding: 2px 7px; border: 1px solid var(--line); border-radius: 10px; background: var(--surface); color: var(--accent-dark); font-size: 9px; }
987
999
  .book-shelf { display: grid; grid-template-columns: repeat(auto-fill, minmax(205px, 1fr)); gap: clamp(22px, 3vw, 38px); width: 100%; min-width: 0; max-width: 1400px; margin: 0 auto; }
988
1000
  .book-card { position: relative; min-width: 0; border: 0; background: transparent; text-align: left; }
@@ -1357,7 +1369,11 @@ select:focus, input:focus, textarea:focus { border-color: #a77768; box-shadow: 0
1357
1369
  align-self: center;
1358
1370
  margin: 0;
1359
1371
  }
1372
+ .task-auto-run-help { grid-column: 1; margin: -4px 0 0; color: var(--muted); font-size: 9px; line-height: 1.45; }
1360
1373
  .task-auto-run-meta { grid-column: 1; margin: 0; color: var(--muted); font-size: 10px; }
1374
+ .task-auto-run-alert { display: grid; grid-column: 1; gap: 3px; margin: 0; padding: 9px 10px; border: 1px solid color-mix(in srgb, var(--accent) 30%, var(--line)); border-radius: 4px; background: color-mix(in srgb, var(--accent) 8%, var(--surface)); font-size: 10px; line-height: 1.45; }
1375
+ .task-auto-run-alert strong { color: var(--ink); }
1376
+ .task-auto-run-alert span, .task-auto-run-alert small { color: var(--muted); }
1361
1377
  .task-auto-run-progress {
1362
1378
  display: grid;
1363
1379
  grid-column: 2;
@@ -1373,6 +1389,7 @@ select:focus, input:focus, textarea:focus { border-color: #a77768; box-shadow: 0
1373
1389
  .task-auto-run-progress-ring-value { stroke: var(--accent); stroke-linecap: round; transition: stroke-dasharray .25s ease; }
1374
1390
  .task-auto-run-progress-ring.is-running svg { animation: task-auto-run-active 1.8s ease-in-out infinite; }
1375
1391
  .task-auto-run-progress-ring.is-running .task-auto-run-progress-ring-value { stroke: var(--task-running); }
1392
+ .task-auto-run-progress-ring.is-paused .task-auto-run-progress-ring-value { stroke: var(--accent); }
1376
1393
  .task-auto-run-progress-ring-label { position: absolute; inset: 22px; display: grid; align-content: center; justify-items: center; gap: 3px; text-align: center; }
1377
1394
  .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; }
1378
1395
  .task-auto-run-progress-ring-label span { color: var(--muted); font-size: 9px; line-height: 1.35; }
@@ -1386,6 +1403,8 @@ select:focus, input:focus, textarea:focus { border-color: #a77768; box-shadow: 0
1386
1403
  .task-auto-run-progress-bar.is-running { animation: task-auto-run-active 1.8s ease-in-out infinite; }
1387
1404
  .task-auto-run-progress-bar.is-running::-webkit-progress-value { background: var(--task-running); }
1388
1405
  .task-auto-run-progress-bar.is-running::-moz-progress-bar { background: var(--task-running); }
1406
+ .task-auto-run-progress-bar.is-paused::-webkit-progress-value { background: var(--accent); }
1407
+ .task-auto-run-progress-bar.is-paused::-moz-progress-bar { background: var(--accent); }
1389
1408
  .task-status-cell { width: 116px; white-space: nowrap; }
1390
1409
  .task-status-badge {
1391
1410
  --task-status-color: var(--muted);
@@ -1901,7 +1920,7 @@ select:focus, input:focus, textarea:focus { border-color: #a77768; box-shadow: 0
1901
1920
  .galaxy-node.is-dragging { cursor: grabbing; z-index: 6; }
1902
1921
  .galaxy-close { position: fixed; z-index: 8; top: 22px; right: 25px; width: 42px; height: 42px; border: 1px solid rgba(255,255,255,.22); border-radius: 50%; background: rgba(5,7,13,.62); color: #fff; font-size: 25px; }
1903
1922
  .galaxy-stats { position: fixed; z-index: 7; left: 22px; bottom: 20px; color: rgba(235,245,255,.82); font-size: 11px; }
1904
- .galaxy-controls { position: fixed; z-index: 7; right: 23px; top: 50%; display: grid; width: 128px; gap: 7px; transform: translateY(-50%); padding: 10px; border: 1px solid rgba(255,255,255,.12); border-radius: 8px; background: rgba(5,7,13,.66); backdrop-filter: blur(12px); }
1923
+ .galaxy-controls { position: fixed; z-index: 7; right: 23px; top: 50%; display: grid; width: 104px; gap: 7px; transform: translateY(-50%); padding: 10px; border: 1px solid rgba(255,255,255,.12); border-radius: 8px; background: rgba(5,7,13,.66); backdrop-filter: blur(12px); }
1905
1924
  .galaxy-controls button { border: 1px solid rgba(255,255,255,.14); border-radius: 5px; padding: 7px; background: rgba(255,255,255,.05); color: #dcecff; font-size: 9px; }
1906
1925
  .galaxy-legend { position: fixed; z-index: 7; right: 22px; bottom: 18px; display: grid; grid-template-columns: 1fr 1fr; gap: 7px 12px; margin: 0; padding: 11px; list-style: none; border: 1px solid rgba(255,255,255,.12); border-radius: 7px; background: rgba(5,7,13,.66); color: rgba(235,245,255,.8); font-size: 9px; }.galaxy-legend li { display: flex; align-items: center; gap: 5px; }
1907
1926
  .galaxy-detail { position: fixed; z-index: 7; left: 22px; top: 22px; width: min(300px, 30vw); max-height: 55vh; overflow: auto; padding: 15px; border: 1px solid rgba(255,255,255,.14); border-radius: 8px; background: rgba(5,7,13,.74); backdrop-filter: blur(14px); }.galaxy-detail strong, .galaxy-detail small { display: block; }.galaxy-detail strong { font-size: 18px; }.galaxy-detail small, .galaxy-detail p { color: rgba(220,235,250,.65); font-size: 9px; }.galaxy-detail ul { display: grid; gap: 7px; padding: 0; list-style: none; font-size: 9px; }.galaxy-detail li { display: flex; align-items: center; gap: 6px; }
@@ -2706,7 +2725,7 @@ select:focus, input:focus, textarea:focus { border-color: #a77768; box-shadow: 0
2706
2725
  .top-actions .ghost-button:not(.settings-button) { display: none; }
2707
2726
  .book-shelf { grid-template-columns: repeat(3, minmax(180px, 1fr)); }
2708
2727
  .task-auto-run-panel { grid-template-columns: minmax(0, 1fr); column-gap: 0; }
2709
- .task-auto-run-copy, .task-auto-run-controls, .task-auto-run-meta { grid-column: 1; }
2728
+ .task-auto-run-copy, .task-auto-run-controls, .task-auto-run-help, .task-auto-run-meta, .task-auto-run-alert { grid-column: 1; }
2710
2729
  .task-auto-run-progress { grid-column: 1; grid-row: auto; justify-self: stretch; width: 100%; }
2711
2730
  .task-auto-run-progress-ring { display: none; }
2712
2731
  .task-auto-run-progress-bar-layout { display: grid; gap: 6px; width: 100%; }
@@ -1,5 +1,5 @@
1
1
  import { pinyin } from "pinyin-pro";
2
- export const RELATIONSHIP_SEARCH_POLICY_VERSION = 2;
2
+ export const RELATIONSHIP_SEARCH_POLICY_VERSION = 3;
3
3
  export function normalizeRelationshipSearchText(value) {
4
4
  return value.normalize("NFKC").toLocaleLowerCase("zh-CN");
5
5
  }
@@ -28,11 +28,30 @@ export function relationshipPinyinSyllables(value) {
28
28
  export function relationshipPinyinTokens(value) {
29
29
  return relationshipPinyinSyllables(value).map(safePinyinToken);
30
30
  }
31
+ export function relationshipPinyinSearchTokens(value) {
32
+ const normalized = normalizeRelationshipSearchText(value).trim();
33
+ if (/\p{Script=Han}/u.test(normalized))
34
+ return relationshipPinyinTokens(normalized);
35
+ const compact = normalized.replace(/[\p{White_Space}·・\-—']/gu, "");
36
+ return compact ? [safePinyinToken(compact)] : [];
37
+ }
38
+ export function relationshipPinyinJoinedTokens(value, maximumSyllables = 6) {
39
+ const tokens = new Set();
40
+ for (const match of value.matchAll(/[\p{Script=Han}]{2,}/gu)) {
41
+ const syllables = relationshipPinyinSyllables(match[0]);
42
+ for (let start = 0; start < syllables.length; start += 1) {
43
+ for (let length = 2; length <= maximumSyllables && start + length <= syllables.length; length += 1) {
44
+ tokens.add(safePinyinToken(syllables.slice(start, start + length).join("")));
45
+ }
46
+ }
47
+ }
48
+ return [...tokens];
49
+ }
31
50
  export function relationshipCharacterTokenText(value) {
32
51
  return relationshipCharacterTokens(value).join(" ");
33
52
  }
34
53
  export function relationshipPinyinTokenText(value) {
35
- return relationshipPinyinTokens(value).join(" ");
54
+ return [...relationshipPinyinTokens(value), ...relationshipPinyinJoinedTokens(value)].join(" ");
36
55
  }
37
56
  export function ftsPhrase(tokens) {
38
57
  return `"${tokens.join(" ").replaceAll('"', '""')}"`;
@@ -1 +1 @@
1
- {"version":3,"file":"relationship-search.js","sourceRoot":"","sources":["../src/relationship-search.ts"],"names":[],"mappings":"AAAA,OAAO,EAAE,MAAM,EAAE,MAAM,YAAY,CAAC;AAEpC,MAAM,CAAC,MAAM,kCAAkC,GAAG,CAAC,CAAC;AAEpD,MAAM,UAAU,+BAA+B,CAAC,KAAa;IAC3D,OAAO,KAAK,CAAC,SAAS,CAAC,MAAM,CAAC,CAAC,iBAAiB,CAAC,OAAO,CAAC,CAAC;AAC5D,CAAC;AAED,MAAM,UAAU,+BAA+B,CAAC,KAAa;IAC3D,MAAM,UAAU,GAAG,+BAA+B,CAAC,KAAK,CAAC,CAAC,IAAI,EAAE,CAAC;IACjE,MAAM,aAAa,GAAG,CAAC,GAAG,UAAU,CAAC,CAAC,MAAM,CAAC,CAAC,SAAS,EAAE,EAAE,CAAC,iBAAiB,CAAC,IAAI,CAAC,SAAS,CAAC,CAAC,CAAC;IAC/F,IAAI,aAAa,CAAC,MAAM,GAAG,CAAC;QAAE,OAAO,KAAK,CAAC;IAC3C,OAAO,CAAC,GAAG,UAAU,CAAC,CAAC,KAAK,CAAC,CAAC,SAAS,EAAE,EAAE,CAAC,uCAAuC,CAAC,IAAI,CAAC,SAAS,CAAC,CAAC,CAAC;AACvG,CAAC;AAED,SAAS,gBAAgB,CAAC,KAAa;IACrC,OAAO,CAAC,GAAG,KAAK,CAAC,CAAC,GAAG,CAAC,CAAC,SAAS,EAAE,EAAE,CAAC,SAAS,CAAC,WAAW,CAAC,CAAC,CAAE,CAAC,QAAQ,CAAC,EAAE,CAAC,CAAC,CAAC,IAAI,CAAC,GAAG,CAAC,CAAC;AACzF,CAAC;AAED,SAAS,eAAe,CAAC,KAAa;IACpC,MAAM,UAAU,GAAG,KAAK,CAAC,SAAS,CAAC,MAAM,CAAC,CAAC,iBAAiB,CAAC,OAAO,CAAC,CAAC,UAAU,CAAC,GAAG,EAAE,GAAG,CAAC,CAAC;IAC3F,OAAO,cAAc,CAAC,IAAI,CAAC,UAAU,CAAC,CAAC,CAAC,CAAC,IAAI,UAAU,EAAE,CAAC,CAAC,CAAC,IAAI,gBAAgB,CAAC,UAAU,CAAC,EAAE,CAAC;AACjG,CAAC;AAED,MAAM,UAAU,2BAA2B,CAAC,KAAa;IACvD,OAAO,CAAC,GAAG,+BAA+B,CAAC,KAAK,CAAC,CAAC,CAAC,GAAG,CAAC,CAAC,SAAS,EAAE,EAAE,CAAC,IAAI,gBAAgB,CAAC,SAAS,CAAC,EAAE,CAAC,CAAC;AAC3G,CAAC;AAED,MAAM,UAAU,2BAA2B,CAAC,KAAa;IACvD,MAAM,UAAU,GAAG,+BAA+B,CAAC,KAAK,CAAC,CAAC;IAC1D,OAAO,MAAM,CAAC,UAAU,EAAE,EAAE,QAAQ,EAAE,MAAM,EAAE,IAAI,EAAE,OAAO,EAAE,CAAC;SAC3D,GAAG,CAAC,CAAC,IAAI,EAAE,EAAE,CAAC,IAAI,CAAC,SAAS,CAAC,MAAM,CAAC,CAAC,iBAAiB,CAAC,OAAO,CAAC,CAAC,UAAU,CAAC,GAAG,EAAE,GAAG,CAAC,CAAC,CAAC;AAC3F,CAAC;AAED,MAAM,UAAU,wBAAwB,CAAC,KAAa;IACpD,OAAO,2BAA2B,CAAC,KAAK,CAAC,CAAC,GAAG,CAAC,eAAe,CAAC,CAAC;AACjE,CAAC;AAED,MAAM,UAAU,8BAA8B,CAAC,KAAa;IAC1D,OAAO,2BAA2B,CAAC,KAAK,CAAC,CAAC,IAAI,CAAC,GAAG,CAAC,CAAC;AACtD,CAAC;AAED,MAAM,UAAU,2BAA2B,CAAC,KAAa;IACvD,OAAO,wBAAwB,CAAC,KAAK,CAAC,CAAC,IAAI,CAAC,GAAG,CAAC,CAAC;AACnD,CAAC;AAED,MAAM,UAAU,SAAS,CAAC,MAAgB;IACxC,OAAO,IAAI,MAAM,CAAC,IAAI,CAAC,GAAG,CAAC,CAAC,UAAU,CAAC,GAAG,EAAE,IAAI,CAAC,GAAG,CAAC;AACvD,CAAC;AAED,MAAM,UAAU,0BAA0B,CAAC,IAAuB,EAAE,KAAwB,EAAE,OAAO,GAAG,MAAM,CAAC,iBAAiB;IAC9H,IAAI,IAAI,CAAC,GAAG,CAAC,IAAI,CAAC,MAAM,GAAG,KAAK,CAAC,MAAM,CAAC,GAAG,OAAO;QAAE,OAAO,OAAO,GAAG,CAAC,CAAC;IACvE,MAAM,gBAAgB,GAAG,IAAI,KAAK,CAAS,KAAK,CAAC,MAAM,GAAG,CAAC,CAAC,CAAC,IAAI,CAAC,CAAC,CAAC,CAAC;IACrE,IAAI,QAAQ,GAAG,KAAK,CAAC,IAAI,CAAC,EAAE,MAAM,EAAE,KAAK,CAAC,MAAM,GAAG,CAAC,EAAE,EAAE,CAAC,CAAC,EAAE,KAAK,EAAE,EAAE,CAAC,KAAK,CAAC,CAAC;IAC7E,KAAK,IAAI,SAAS,GAAG,CAAC,EAAE,SAAS,IAAI,IAAI,CAAC,MAAM,EAAE,SAAS,IAAI,CAAC,EAAE,CAAC;QACjE,MAAM,OAAO,GAAG,IAAI,KAAK,CAAS,KAAK,CAAC,MAAM,GAAG,CAAC,CAAC,CAAC,IAAI,CAAC,CAAC,CAAC,CAAC;QAC5D,OAAO,CAAC,CAAC,CAAC,GAAG,SAAS,CAAC;QACvB,IAAI,UAAU,GAAG,OAAO,CAAC,CAAC,CAAC,CAAC;QAC5B,KAAK,IAAI,UAAU,GAAG,CAAC,EAAE,UAAU,IAAI,KAAK,CAAC,MAAM,EAAE,UAAU,IAAI,CAAC,EAAE,CAAC;YACrE,MAAM,gBAAgB,GAAG,IAAI,CAAC,SAAS,GAAG,CAAC,CAAC,KAAK,KAAK,CAAC,UAAU,GAAG,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC;YAC/E,OAAO,CAAC,UAAU,CAAC,GAAG,IAAI,CAAC,GAAG,CAC5B,QAAQ,CAAC,UAAU,CAAE,GAAG,CAAC,EACzB,OAAO,CAAC,UAAU,GAAG,CAAC,CAAE,GAAG,CAAC,EAC5B,QAAQ,CAAC,UAAU,GAAG,CAAC,CAAE,GAAG,gBAAgB,CAC7C,CAAC;YACF,IAAI,SAAS,GAAG,CAAC,IAAI,UAAU,GAAG,CAAC;mBAC9B,IAAI,CAAC,SAAS,GAAG,CAAC,CAAC,KAAK,KAAK,CAAC,UAAU,GAAG,CAAC,CAAC;mBAC7C,IAAI,CAAC,SAAS,GAAG,CAAC,CAAC,KAAK,KAAK,CAAC,UAAU,GAAG,CAAC,CAAC,EAAE,CAAC;gBACnD,OAAO,CAAC,UAAU,CAAC,GAAG,IAAI,CAAC,GAAG,CAAC,OAAO,CAAC,UAAU,CAAE,EAAE,gBAAgB,CAAC,UAAU,GAAG,CAAC,CAAE,GAAG,CAAC,CAAC,CAAC;YAC9F,CAAC;YACD,UAAU,GAAG,IAAI,CAAC,GAAG,CAAC,UAAU,EAAE,OAAO,CAAC,UAAU,CAAE,CAAC,CAAC;QAC1D,CAAC;QACD,IAAI,UAAU,GAAG,OAAO;YAAE,OAAO,OAAO,GAAG,CAAC,CAAC;QAC7C,KAAK,IAAI,KAAK,GAAG,CAAC,EAAE,KAAK,GAAG,QAAQ,CAAC,MAAM,EAAE,KAAK,IAAI,CAAC;YAAE,gBAAgB,CAAC,KAAK,CAAC,GAAG,QAAQ,CAAC,KAAK,CAAE,CAAC;QACpG,QAAQ,GAAG,OAAO,CAAC;IACrB,CAAC;IACD,OAAO,QAAQ,CAAC,KAAK,CAAC,MAAM,CAAE,CAAC;AACjC,CAAC;AAYD,MAAM,OAAO,sCAAuC,SAAQ,KAAK;IAC1C;IAArB,YAAqB,iBAAyB;QAC5C,KAAK,CAAC,sDAAsD,iBAAiB,EAAE,CAAC,CAAC;QAD9D,sBAAiB,GAAjB,iBAAiB,CAAQ;QAE5C,IAAI,CAAC,IAAI,GAAG,wCAAwC,CAAC;IACvD,CAAC;CACF;AAED,SAAS,4BAA4B,CACnC,OAA+B,EAC/B,eAAuB,EACvB,KAAa;IAEb,MAAM,MAAM,GAAG,OAAO,CAAC,IAAI,CAAC,CAAC,IAAI,EAAE,KAAK,EAAE,EAAE,CAC1C,IAAI,CAAC,GAAG,CAAC,IAAI,CAAC,iBAAiB,EAAE,IAAI,CAAC,cAAc,CAAC,GAAG,IAAI,CAAC,GAAG,CAAC,KAAK,CAAC,iBAAiB,EAAE,KAAK,CAAC,cAAc,CAAC;WAC5G,IAAI,CAAC,GAAG,CAAC,CAAC,GAAG,IAAI,CAAC,QAAQ,CAAC,CAAC,MAAM,GAAG,eAAe,CAAC,GAAG,IAAI,CAAC,GAAG,CAAC,CAAC,GAAG,KAAK,CAAC,QAAQ,CAAC,CAAC,MAAM,GAAG,eAAe,CAAC;WAC9G,IAAI,CAAC,KAAK,GAAG,KAAK,CAAC,KAAK,CAC5B,CAAC;IACF,MAAM,QAAQ,GAA2B,EAAE,CAAC;IAC5C,KAAK,MAAM,KAAK,IAAI,MAAM,EAAE,CAAC;QAC3B,IAAI,QAAQ,CAAC,IAAI,CAAC,CAAC,IAAI,EAAE,EAAE,CAAC,KAAK,CAAC,KAAK,GAAG,IAAI,CAAC,GAAG,IAAI,KAAK,CAAC,GAAG,GAAG,IAAI,CAAC,KAAK,CAAC;YAAE,SAAS;QACxF,QAAQ,CAAC,IAAI,CAAC,KAAK,CAAC,CAAC;QACrB,IAAI,QAAQ,CAAC,MAAM,IAAI,KAAK;YAAE,MAAM;IACtC,CAAC;IACD,OAAO,QAAQ,CAAC,IAAI,CAAC,CAAC,IAAI,EAAE,KAAK,EAAE,EAAE,CAAC,IAAI,CAAC,KAAK,GAAG,KAAK,CAAC,KAAK,CAAC,CAAC;AAClE,CAAC;AAED,MAAM,UAAU,0BAA0B,CACxC,OAAe,EACf,SAAiB,EACjB,KAAK,GAAG,CAAC,EACT,mBAAwC,IAAI,GAAG,EAAE,EACjD,iBAAiB,GAAG,GAAG;IAEvB,MAAM,iBAAiB,GAAG,+BAA+B,CAAC,OAAO,CAAC,CAAC;IACnE,MAAM,mBAAmB,GAAG,+BAA+B,CAAC,SAAS,CAAC,CAAC,IAAI,EAAE,CAAC;IAC9E,MAAM,gBAAgB,GAAG,CAAC,GAAG,iBAAiB,CAAC,CAAC;IAChD,MAAM,YAAY,GAAG,IAAI,KAAK,CAAS,gBAAgB,CAAC,MAAM,GAAG,CAAC,CAAC,CAAC,IAAI,CAAC,CAAC,CAAC,CAAC;IAC5E,KAAK,IAAI,KAAK,GAAG,CAAC,EAAE,KAAK,GAAG,gBAAgB,CAAC,MAAM,EAAE,KAAK,IAAI,CAAC,EAAE,CAAC;QAChE,YAAY,CAAC,KAAK,GAAG,CAAC,CAAC,GAAG,YAAY,CAAC,KAAK,CAAE,GAAG,gBAAgB,CAAC,KAAK,CAAE,CAAC,MAAM,CAAC;IACnF,CAAC;IACD,MAAM,mBAAmB,GAAG,CAAC,GAAG,mBAAmB,CAAC,CAAC;IACrD,IAAI,mBAAmB,CAAC,MAAM,GAAG,CAAC,IAAI,gBAAgB,CAAC,MAAM,KAAK,CAAC;QAAE,OAAO,EAAE,CAAC;IAC/E,MAAM,YAAY,GAAG,mBAAmB,CAAC,KAAK,CAAC,CAAC,SAAS,EAAE,EAAE,CAAC,iBAAiB,CAAC,IAAI,CAAC,SAAS,CAAC,CAAC,CAAC;IACjG,MAAM,kBAAkB,GAAG,IAAI,GAAG,CAAC,CAAC,GAAG,gBAAgB,CAAC,CAAC,GAAG,CAAC,CAAC,IAAI,EAAE,EAAE,CAAC,+BAA+B,CAAC,IAAI,CAAC,CAAC,IAAI,EAAE,CAAC,CAAC,CAAC;IACtH,MAAM,eAAe,GAAG,2BAA2B,CAAC,mBAAmB,CAAC,CAAC;IACzE,MAAM,YAAY,GAAG,2BAA2B,CAAC,iBAAiB,CAAC,CAAC;IACpE,MAAM,aAAa,GAAG,IAAI,UAAU,CAAC,gBAAgB,CAAC,MAAM,CAAC,CAAC;IAC9D,KAAK,IAAI,KAAK,GAAG,CAAC,EAAE,KAAK,GAAG,mBAAmB,CAAC,MAAM,IAAI,gBAAgB,CAAC,MAAM,EAAE,KAAK,IAAI,CAAC,EAAE,CAAC;QAC9F,IAAI,CAAC,mBAAmB,CAAC,KAAK,CAAC,CAAC,SAAS,EAAE,KAAK,EAAE,EAAE,CAAC,gBAAgB,CAAC,KAAK,GAAG,KAAK,CAAC,KAAK,SAAS,CAAC;YAAE,SAAS;QAC9G,aAAa,CAAC,IAAI,CAAC,CAAC,EAAE,KAAK,EAAE,KAAK,GAAG,mBAAmB,CAAC,MAAM,CAAC,CAAC;IACnE,CAAC;IACD,MAAM,OAAO,GAA2B,EAAE,CAAC;IAC3C,MAAM,IAAI,GAAG,IAAI,GAAG,EAAU,CAAC;IAC/B,KAAK,MAAM,YAAY,IAAI,CAAC,mBAAmB,CAAC,MAAM,EAAE,mBAAmB,CAAC,MAAM,GAAG,CAAC,EAAE,mBAAmB,CAAC,MAAM,GAAG,CAAC,CAAC,EAAE,CAAC;QACxH,IAAI,YAAY,GAAG,CAAC;YAAE,SAAS;QAC/B,KAAK,IAAI,KAAK,GAAG,CAAC,EAAE,KAAK,GAAG,YAAY,IAAI,gBAAgB,CAAC,MAAM,EAAE,KAAK,IAAI,CAAC,EAAE,CAAC;YAChF,MAAM,kBAAkB,GAAG,gBAAgB,CAAC,KAAK,CAAC,KAAK,EAAE,KAAK,GAAG,YAAY,CAAC,CAAC;YAC/E,IAAI,kBAAkB,CAAC,MAAM,GAAG,CAAC;gBAAE,SAAS;YAC5C,IAAI,YAAY,IAAI,CAAC,kBAAkB,CAAC,KAAK,CAAC,CAAC,SAAS,EAAE,EAAE,CAAC,iBAAiB,CAAC,IAAI,CAAC,SAAS,CAAC,CAAC;gBAAE,SAAS;YAC1G,MAAM,QAAQ,GAAG,kBAAkB,CAAC,IAAI,CAAC,EAAE,CAAC,CAAC;YAC7C,IAAI,CAAC,QAAQ,CAAC,IAAI,EAAE,IAAI,QAAQ,KAAK,mBAAmB,IAAI,kBAAkB,CAAC,GAAG,CAAC,QAAQ,CAAC;gBAAE,SAAS;YACvG,IAAI,aAAa,CAAC,QAAQ,CAAC,KAAK,EAAE,KAAK,GAAG,YAAY,CAAC,CAAC,IAAI,CAAC,CAAC,KAAK,EAAE,EAAE,CAAC,KAAK,KAAK,CAAC,CAAC;gBAAE,SAAS;YAC/F,MAAM,iBAAiB,GAAG,0BAA0B,CAAC,mBAAmB,EAAE,kBAAkB,EAAE,CAAC,CAAC,CAAC;YACjG,MAAM,cAAc,GAAG,YAAY,CAAC,KAAK,CAAC,KAAK,EAAE,KAAK,GAAG,YAAY,CAAC,CAAC;YACvE,MAAM,cAAc,GAAG,0BAA0B,CAAC,eAAe,EAAE,cAAc,EAAE,CAAC,CAAC,CAAC;YACtF,IAAI,iBAAiB,GAAG,CAAC,IAAI,cAAc,GAAG,CAAC;gBAAE,SAAS;YAC1D,MAAM,GAAG,GAAG,GAAG,KAAK,IAAI,QAAQ,EAAE,CAAC;YACnC,IAAI,IAAI,CAAC,GAAG,CAAC,GAAG,CAAC;gBAAE,SAAS;YAC5B,IAAI,CAAC,GAAG,CAAC,GAAG,CAAC,CAAC;YACd,OAAO,CAAC,IAAI,CAAC;gBACX,QAAQ;gBACR,KAAK;gBACL,GAAG,EAAE,KAAK,GAAG,YAAY;gBACzB,UAAU,EAAE,YAAY,CAAC,KAAK,CAAE;gBAChC,QAAQ,EAAE,YAAY,CAAC,KAAK,GAAG,YAAY,CAAE;gBAC7C,iBAAiB;gBACjB,cAAc;aACf,CAAC,CAAC;YACH,IAAI,OAAO,CAAC,MAAM,GAAG,iBAAiB;gBAAE,MAAM,IAAI,sCAAsC,CAAC,iBAAiB,CAAC,CAAC;QAC9G,CAAC;IACH,CAAC;IACD,OAAO,4BAA4B,CAAC,OAAO,EAAE,mBAAmB,CAAC,MAAM,EAAE,KAAK,CAAC,CAAC;AAClF,CAAC;AAED,MAAM,CAAC,KAAK,UAAU,iCAAiC,CACrD,OAAe,EACf,SAAiB,EACjB,KAAK,GAAG,CAAC,EACT,mBAAwC,IAAI,GAAG,EAAE,EACjD,iBAAiB,GAAG,GAAG,EACvB,SAAS,GAAG,MAAM;IAElB,MAAM,iBAAiB,GAAG,+BAA+B,CAAC,OAAO,CAAC,CAAC;IACnE,MAAM,eAAe,GAAG,CAAC,GAAG,+BAA+B,CAAC,SAAS,CAAC,CAAC,IAAI,EAAE,CAAC,CAAC,MAAM,CAAC;IACtF,IAAI,eAAe,GAAG,CAAC,IAAI,CAAC,iBAAiB,IAAI,SAAS,GAAG,CAAC;QAAE,OAAO,EAAE,CAAC;IAC1E,MAAM,WAAW,GAAG,eAAe,GAAG,CAAC,CAAC;IACxC,MAAM,OAAO,GAA2B,EAAE,CAAC;IAC3C,MAAM,IAAI,GAAG,IAAI,GAAG,EAAU,CAAC;IAC/B,IAAI,mBAAmB,GAAG,CAAC,CAAC;IAC5B,IAAI,kBAAkB,GAAG,CAAC,CAAC;IAC3B,IAAI,IAAI,GAAa,EAAE,CAAC;IACxB,IAAI,KAAK,GAAa,EAAE,CAAC;IACzB,MAAM,YAAY,GAAG,KAAK,IAAmB,EAAE;QAC7C,IAAI,KAAK,CAAC,MAAM,KAAK,CAAC;YAAE,OAAO;QAC/B,MAAM,YAAY,GAAG,IAAI,CAAC,MAAM,CAAC;QACjC,MAAM,eAAe,GAAG,IAAI,CAAC,MAAM,CAAC,CAAC,KAAK,EAAE,SAAS,EAAE,EAAE,CAAC,KAAK,GAAG,SAAS,CAAC,MAAM,EAAE,CAAC,CAAC,CAAC;QACvF,MAAM,QAAQ,GAAG,CAAC,GAAG,IAAI,EAAE,GAAG,KAAK,CAAC,CAAC;QACrC,MAAM,UAAU,GAAG,mBAAmB,GAAG,YAAY,CAAC;QACtD,MAAM,kBAAkB,GAAG,kBAAkB,GAAG,eAAe,CAAC;QAChE,MAAM,YAAY,GAAG,0BAA0B,CAC7C,QAAQ,CAAC,IAAI,CAAC,EAAE,CAAC,EACjB,SAAS,EACT,iBAAiB,GAAG,CAAC,EACrB,gBAAgB,EAChB,iBAAiB,CAClB,CAAC;QACF,KAAK,MAAM,KAAK,IAAI,YAAY,EAAE,CAAC;YACjC,IAAI,KAAK,CAAC,GAAG,IAAI,YAAY;gBAAE,SAAS;YACxC,MAAM,QAAQ,GAAG;gBACf,GAAG,KAAK;gBACR,KAAK,EAAE,KAAK,CAAC,KAAK,GAAG,UAAU;gBAC/B,GAAG,EAAE,KAAK,CAAC,GAAG,GAAG,UAAU;gBAC3B,UAAU,EAAE,KAAK,CAAC,UAAU,GAAG,kBAAkB;gBACjD,QAAQ,EAAE,KAAK,CAAC,QAAQ,GAAG,kBAAkB;aAC9C,CAAC;YACF,MAAM,GAAG,GAAG,GAAG,QAAQ,CAAC,KAAK,IAAI,QAAQ,CAAC,QAAQ,EAAE,CAAC;YACrD,IAAI,IAAI,CAAC,GAAG,CAAC,GAAG,CAAC;gBAAE,SAAS;YAC5B,IAAI,CAAC,GAAG,CAAC,GAAG,CAAC,CAAC;YACd,OAAO,CAAC,IAAI,CAAC,QAAQ,CAAC,CAAC;YACvB,IAAI,OAAO,CAAC,MAAM,GAAG,iBAAiB;gBAAE,MAAM,IAAI,sCAAsC,CAAC,iBAAiB,CAAC,CAAC;QAC9G,CAAC;QACD,mBAAmB,IAAI,KAAK,CAAC,MAAM,CAAC;QACpC,kBAAkB,IAAI,KAAK,CAAC,MAAM,CAAC,CAAC,KAAK,EAAE,SAAS,EAAE,EAAE,CAAC,KAAK,GAAG,SAAS,CAAC,MAAM,EAAE,CAAC,CAAC,CAAC;QACtF,IAAI,GAAG,QAAQ,CAAC,KAAK,CAAC,CAAC,WAAW,CAAC,CAAC;QACpC,KAAK,GAAG,EAAE,CAAC;QACX,MAAM,IAAI,OAAO,CAAO,CAAC,OAAO,EAAE,EAAE,CAAC,YAAY,CAAC,OAAO,CAAC,CAAC,CAAC;IAC9D,CAAC,CAAC;IACF,KAAK,MAAM,SAAS,IAAI,iBAAiB,EAAE,CAAC;QAC1C,KAAK,CAAC,IAAI,CAAC,SAAS,CAAC,CAAC;QACtB,IAAI,KAAK,CAAC,MAAM,IAAI,SAAS;YAAE,MAAM,YAAY,EAAE,CAAC;IACtD,CAAC;IACD,MAAM,YAAY,EAAE,CAAC;IACrB,OAAO,4BAA4B,CAAC,OAAO,EAAE,eAAe,EAAE,KAAK,CAAC,CAAC;AACvE,CAAC"}
1
+ {"version":3,"file":"relationship-search.js","sourceRoot":"","sources":["../src/relationship-search.ts"],"names":[],"mappings":"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"}
package/dist/store.js CHANGED
@@ -660,6 +660,12 @@ export class Store {
660
660
  autoRunEnabled: Number(row?.auto_run_enabled ?? 0) === 1,
661
661
  autoRunConcurrency: Math.min(8, Math.max(1, Number(row?.auto_run_concurrency ?? 2) || 2)),
662
662
  autoRunBatchLimit: Math.min(200, Math.max(1, Number(row?.auto_run_batch_limit ?? 20) || 20)),
663
+ autoRunDailyTaskLimit: Math.min(10_000, Math.max(0, Number(row?.auto_run_daily_task_limit ?? 0) || 0)),
664
+ autoRunFailureThreshold: Math.min(10, Math.max(1, Number(row?.auto_run_failure_threshold ?? 3) || 3)),
665
+ autoRunPaused: Number(row?.auto_run_paused ?? 0) === 1,
666
+ autoRunPauseReason: String(row?.auto_run_pause_reason ?? ""),
667
+ autoRunResumeAt: row?.auto_run_resume_at === null || row?.auto_run_resume_at === undefined ? null : String(row.auto_run_resume_at),
668
+ autoRunConsecutiveFailures: Math.max(0, Number(row?.auto_run_consecutive_failures ?? 0) || 0),
663
669
  bookSummaryContextPercent: Math.min(90, Math.max(1, Number(row?.book_summary_context_percent ?? 50) || 50)),
664
670
  contextCompactThreshold: Math.min(90, Math.max(50, Number(row?.context_compact_threshold ?? 85) || 85)),
665
671
  agentTools: json(String(row?.agent_tools_json ?? '["story_index","read_chapters","search_story_entities","grep","read_character_sections"]'), ["story_index", "read_chapters", "search_story_entities", "grep", "read_character_sections"])
@@ -676,32 +682,92 @@ export class Store {
676
682
  const nextEnabled = input.autoRunEnabled ?? Boolean(current.autoRunEnabled);
677
683
  const nextConcurrency = input.autoRunConcurrency ?? Number(current.autoRunConcurrency);
678
684
  const nextBatchLimit = input.autoRunBatchLimit ?? Number(current.autoRunBatchLimit);
685
+ const nextDailyTaskLimit = input.autoRunDailyTaskLimit ?? Number(current.autoRunDailyTaskLimit);
686
+ const nextFailureThreshold = input.autoRunFailureThreshold ?? Number(current.autoRunFailureThreshold);
679
687
  const nextBookSummaryContextPercent = input.bookSummaryContextPercent ?? Number(current.bookSummaryContextPercent);
680
688
  const nextContextCompactThreshold = input.contextCompactThreshold ?? Number(current.contextCompactThreshold);
681
689
  const nextAgentTools = input.agentTools ?? current.agentTools;
682
690
  this.db.run(`INSERT INTO work_ai_settings (
683
- work_id, system_prompt, auto_run_enabled, auto_run_concurrency, auto_run_batch_limit, book_summary_context_percent, context_compact_threshold, agent_tools_json, updated_at
684
- ) VALUES (?, ?, ?, ?, ?, ?, ?, ?, ?)
691
+ work_id, system_prompt, auto_run_enabled, auto_run_concurrency, auto_run_batch_limit,
692
+ auto_run_daily_task_limit, auto_run_failure_threshold, auto_run_paused, auto_run_pause_reason,
693
+ auto_run_resume_at, auto_run_consecutive_failures, book_summary_context_percent,
694
+ context_compact_threshold, agent_tools_json, updated_at
695
+ ) VALUES (?, ?, ?, ?, ?, ?, ?, ?, ?, ?, ?, ?, ?, ?, ?)
685
696
  ON CONFLICT(work_id) DO UPDATE SET
686
697
  system_prompt = excluded.system_prompt,
687
698
  auto_run_enabled = excluded.auto_run_enabled,
688
699
  auto_run_concurrency = excluded.auto_run_concurrency,
689
700
  auto_run_batch_limit = excluded.auto_run_batch_limit,
701
+ auto_run_daily_task_limit = excluded.auto_run_daily_task_limit,
702
+ auto_run_failure_threshold = excluded.auto_run_failure_threshold,
703
+ auto_run_paused = excluded.auto_run_paused,
704
+ auto_run_pause_reason = excluded.auto_run_pause_reason,
705
+ auto_run_resume_at = excluded.auto_run_resume_at,
706
+ auto_run_consecutive_failures = excluded.auto_run_consecutive_failures,
690
707
  book_summary_context_percent = excluded.book_summary_context_percent,
691
708
  context_compact_threshold = excluded.context_compact_threshold,
692
709
  agent_tools_json = excluded.agent_tools_json,
693
- updated_at = excluded.updated_at`, workId, nextPrompt, nextEnabled ? 1 : 0, Math.min(8, Math.max(1, nextConcurrency)), Math.min(200, Math.max(1, nextBatchLimit)), Math.min(90, Math.max(1, nextBookSummaryContextPercent)), Math.min(90, Math.max(50, nextContextCompactThreshold)), JSON.stringify(nextAgentTools), timestamp);
710
+ updated_at = excluded.updated_at`, workId, nextPrompt, nextEnabled ? 1 : 0, Math.min(8, Math.max(1, nextConcurrency)), Math.min(200, Math.max(1, nextBatchLimit)), Math.min(10_000, Math.max(0, nextDailyTaskLimit)), Math.min(10, Math.max(1, nextFailureThreshold)), current.autoRunPaused ? 1 : 0, String(current.autoRunPauseReason ?? ""), current.autoRunResumeAt === null ? null : String(current.autoRunResumeAt), Math.max(0, Number(current.autoRunConsecutiveFailures) || 0), Math.min(90, Math.max(1, nextBookSummaryContextPercent)), Math.min(90, Math.max(50, nextContextCompactThreshold)), JSON.stringify(nextAgentTools), timestamp);
694
711
  this.audit(workId, "work.ai-settings.updated", "work-ai-settings", workId, {
695
712
  systemPromptChanged: input.systemPrompt !== undefined,
696
713
  autoRunEnabled: nextEnabled,
697
714
  autoRunConcurrency: Math.min(8, Math.max(1, nextConcurrency)),
698
715
  autoRunBatchLimit: Math.min(200, Math.max(1, nextBatchLimit)),
716
+ autoRunDailyTaskLimit: Math.min(10_000, Math.max(0, nextDailyTaskLimit)),
717
+ autoRunFailureThreshold: Math.min(10, Math.max(1, nextFailureThreshold)),
699
718
  bookSummaryContextPercent: Math.min(90, Math.max(1, nextBookSummaryContextPercent)),
700
719
  contextCompactThreshold: Math.min(90, Math.max(50, nextContextCompactThreshold)),
701
720
  agentTools: nextAgentTools
702
721
  });
703
722
  return this.getWorkAiSettings(workId);
704
723
  }
724
+ clearAutoRunPause(workId) {
725
+ this.getWork(workId);
726
+ const current = this.getWorkAiSettings(workId);
727
+ this.db.run(`UPDATE work_ai_settings
728
+ SET auto_run_paused = 0, auto_run_pause_reason = '', auto_run_resume_at = NULL,
729
+ auto_run_consecutive_failures = 0, updated_at = ?
730
+ WHERE work_id = ?`, now(), workId);
731
+ if (current.autoRunPaused) {
732
+ this.audit(workId, "task.auto-run.resumed", "work-ai-settings", workId, {
733
+ previousReason: current.autoRunPauseReason
734
+ });
735
+ }
736
+ return this.getWorkAiSettings(workId);
737
+ }
738
+ pauseAutoRun(workId, reason, resumeAt = null) {
739
+ this.getWork(workId);
740
+ this.db.run(`UPDATE work_ai_settings
741
+ SET auto_run_paused = 1, auto_run_pause_reason = ?, auto_run_resume_at = ?, updated_at = ?
742
+ WHERE work_id = ?`, reason.slice(0, 500), resumeAt, now(), workId);
743
+ this.audit(workId, "task.auto-run.paused", "work-ai-settings", workId, { reason, resumeAt });
744
+ return this.getWorkAiSettings(workId);
745
+ }
746
+ recordAutoRunSuccess(workId) {
747
+ this.getWork(workId);
748
+ this.db.run("UPDATE work_ai_settings SET auto_run_consecutive_failures = 0, updated_at = ? WHERE work_id = ?", now(), workId);
749
+ return this.getWorkAiSettings(workId);
750
+ }
751
+ recordAutoRunFailure(workId, message, pauseImmediately = false) {
752
+ return this.db.transaction(() => {
753
+ const current = this.getWorkAiSettings(workId);
754
+ const consecutiveFailures = Number(current.autoRunConsecutiveFailures) + 1;
755
+ const shouldPause = pauseImmediately || consecutiveFailures >= Number(current.autoRunFailureThreshold);
756
+ this.db.run(`UPDATE work_ai_settings
757
+ SET auto_run_consecutive_failures = ?, auto_run_paused = ?,
758
+ auto_run_pause_reason = CASE WHEN ? = 1 THEN ? ELSE auto_run_pause_reason END,
759
+ auto_run_resume_at = CASE WHEN ? = 1 THEN NULL ELSE auto_run_resume_at END,
760
+ updated_at = ? WHERE work_id = ?`, consecutiveFailures, shouldPause ? 1 : 0, shouldPause ? 1 : 0, `连续任务失败,自动执行已暂停:${message}`.slice(0, 500), shouldPause ? 1 : 0, now(), workId);
761
+ if (shouldPause) {
762
+ this.audit(workId, "task.auto-run.paused", "work-ai-settings", workId, {
763
+ reason: "consecutive-failures",
764
+ consecutiveFailures,
765
+ message
766
+ });
767
+ }
768
+ return this.getWorkAiSettings(workId);
769
+ });
770
+ }
705
771
  updateWork(workId, input, expectedVersionNo, source = "manual", sourceRef = null, changeNote = "") {
706
772
  this.db.transaction(() => {
707
773
  const current = this.getWork(workId);
@@ -2208,6 +2274,19 @@ export class Store {
2208
2274
  this.getWork(workId);
2209
2275
  return this.db.all("SELECT * FROM races WHERE work_id = ? ORDER BY name", workId).map((row) => this.mapRace(row, includeMarkdown));
2210
2276
  }
2277
+ listRacesByHierarchyScope(workId, scope, includeMarkdown = true) {
2278
+ this.getWork(workId);
2279
+ const hierarchyCondition = scope === "roots" ? "IS NULL" : "IS NOT NULL";
2280
+ return this.db.all(`SELECT race.*,
2281
+ (SELECT COUNT(*) FROM races child WHERE child.parent_race_id = race.id) AS child_count
2282
+ FROM races race
2283
+ WHERE race.work_id = ? AND race.parent_race_id ${hierarchyCondition}
2284
+ ORDER BY race.name`, workId).map((row) => this.mapRace(row, includeMarkdown));
2285
+ }
2286
+ countRaces(workId) {
2287
+ this.getWork(workId);
2288
+ return numberValue(this.db.get("SELECT COUNT(*) AS count FROM races WHERE work_id = ?", workId) ?? {}, "count");
2289
+ }
2211
2290
  listRacesPage(workId, pagination, includeMarkdown = true) {
2212
2291
  this.getWork(workId);
2213
2292
  const page = paginationSql(pagination);
@@ -2339,6 +2418,7 @@ export class Store {
2339
2418
  parentRaceId: optionalString(row, "parent_race_id"),
2340
2419
  name: requiredString(row, "name"),
2341
2420
  description: requiredString(row, "description"),
2421
+ ...(row.child_count === undefined ? {} : { childCount: numberValue(row, "child_count") }),
2342
2422
  ...(includeMarkdown
2343
2423
  ? { settings, settingsMarkdown: settingsMarkdownFromList(settings), settingsSections }
2344
2424
  : { settings: [], settingsCount: settingsSections.length }),
@@ -4129,7 +4209,8 @@ export class Store {
4129
4209
  FROM analysis_tasks WHERE work_id = ?`, workId) ?? {};
4130
4210
  const total = numberValue(statsRow, "total");
4131
4211
  const page = paginationSql(pagination);
4132
- const rows = this.db.all(`SELECT task.id, task.model_id, task.task_type, task.scope_json, task.status, task.progress, task.created_at, task.updated_at,
4212
+ const rows = this.db.all(`SELECT task.id, task.model_id, task.task_type, task.scope_json, task.status, task.progress,
4213
+ task.attempt_count, task.next_attempt_at, task.last_attempt_at, task.created_at, task.updated_at,
4133
4214
  model.display_name AS model_display_name, model.model_id AS model_api_id
4134
4215
  FROM analysis_tasks task
4135
4216
  LEFT JOIN models model ON model.id = task.model_id
@@ -4165,11 +4246,56 @@ export class Store {
4165
4246
  const row = this.db.get("SELECT COUNT(*) AS value FROM analysis_tasks WHERE work_id = ? AND status = 'running'", workId);
4166
4247
  return numberValue(row ?? {}, "value");
4167
4248
  }
4249
+ listAutoRunWorkIds() {
4250
+ return this.db.all("SELECT work_id FROM work_ai_settings WHERE auto_run_enabled = 1 ORDER BY work_id").map((row) => requiredString(row, "work_id"));
4251
+ }
4252
+ claimPendingTask(taskId, runningLimit) {
4253
+ return this.db.transaction(() => {
4254
+ const current = this.getTask(taskId);
4255
+ if (current.status !== "pending")
4256
+ return null;
4257
+ if (current.nextAttemptAt && String(current.nextAttemptAt) > now())
4258
+ return null;
4259
+ if (runningLimit !== undefined && this.countRunningTasks(String(current.workId)) >= runningLimit)
4260
+ return null;
4261
+ const timestamp = now();
4262
+ const claimed = this.db.run(`UPDATE analysis_tasks
4263
+ SET status = 'running', progress = 5, attempt_count = attempt_count + 1,
4264
+ next_attempt_at = NULL, last_attempt_at = ?, updated_at = ?
4265
+ WHERE id = ? AND status = 'pending' AND (next_attempt_at IS NULL OR next_attempt_at <= ?)`, timestamp, timestamp, taskId, timestamp);
4266
+ return claimed.changes === 1 ? this.getTask(taskId) : null;
4267
+ });
4268
+ }
4168
4269
  listOldestPendingTaskIds(workId, limit) {
4169
4270
  if (limit <= 0)
4170
4271
  return [];
4171
4272
  return this.db.all(`SELECT id FROM analysis_tasks WHERE work_id = ? AND status = 'pending'
4172
- ORDER BY created_at ASC, id ASC LIMIT ?`, workId, limit).map((row) => requiredString(row, "id"));
4273
+ AND (next_attempt_at IS NULL OR next_attempt_at <= ?)
4274
+ ORDER BY created_at ASC, id ASC LIMIT ?`, workId, now(), limit).map((row) => requiredString(row, "id"));
4275
+ }
4276
+ nextPendingTaskAttemptAt(workId) {
4277
+ const row = this.db.get(`SELECT MIN(next_attempt_at) AS value FROM analysis_tasks
4278
+ WHERE work_id = ? AND status = 'pending' AND next_attempt_at IS NOT NULL`, workId);
4279
+ return row?.value === null || row?.value === undefined ? null : String(row.value);
4280
+ }
4281
+ countAutoRunAttemptsToday(workId) {
4282
+ const row = this.db.get(`SELECT COUNT(*) AS value FROM analysis_tasks
4283
+ WHERE work_id = ? AND last_attempt_at >= strftime('%Y-%m-%dT00:00:00.000Z', 'now')`, workId);
4284
+ return numberValue(row ?? {}, "value");
4285
+ }
4286
+ rescheduleTask(taskId, failure, nextAttemptAt) {
4287
+ const current = this.getTask(taskId);
4288
+ if (current.status !== "running")
4289
+ return current;
4290
+ const failures = Array.isArray(current.failures) ? [...current.failures, failure].slice(-10) : [failure];
4291
+ this.db.run(`UPDATE analysis_tasks
4292
+ SET status = 'pending', progress = 0, failure_json = ?, next_attempt_at = ?, updated_at = ?
4293
+ WHERE id = ? AND status = 'running'`, JSON.stringify(failures), nextAttemptAt, now(), taskId);
4294
+ this.audit(String(current.workId), "task.retry-scheduled", "analysis-task", taskId, {
4295
+ attemptCount: current.attemptCount,
4296
+ nextAttemptAt
4297
+ });
4298
+ return this.getTask(taskId);
4173
4299
  }
4174
4300
  countPendingTasks(workId) {
4175
4301
  const row = this.db.get("SELECT COUNT(*) AS value FROM analysis_tasks WHERE work_id = ? AND status = 'pending'", workId);
@@ -5059,6 +5185,9 @@ export class Store {
5059
5185
  result: taskResult,
5060
5186
  failures: json(requiredString(row, "failure_json"), []),
5061
5187
  sourceVersions: json(requiredString(row, "source_versions_json"), {}),
5188
+ attemptCount: numberValue(row, "attempt_count"),
5189
+ nextAttemptAt: row.next_attempt_at === null || row.next_attempt_at === undefined ? null : String(row.next_attempt_at),
5190
+ lastAttemptAt: row.last_attempt_at === null || row.last_attempt_at === undefined ? null : String(row.last_attempt_at),
5062
5191
  createdAt: requiredString(row, "created_at"),
5063
5192
  updatedAt: requiredString(row, "updated_at")
5064
5193
  };
@@ -5073,6 +5202,9 @@ export class Store {
5073
5202
  scopeSummaryWithoutCharacterNames: this.taskScopeSummaryFromMaps(scope, chapterSummaries, volumeTitles, new Map(), false),
5074
5203
  status: requiredString(row, "status"),
5075
5204
  progress: numberValue(row, "progress"),
5205
+ attemptCount: numberValue(row, "attempt_count"),
5206
+ nextAttemptAt: row.next_attempt_at === null || row.next_attempt_at === undefined ? null : String(row.next_attempt_at),
5207
+ lastAttemptAt: row.last_attempt_at === null || row.last_attempt_at === undefined ? null : String(row.last_attempt_at),
5076
5208
  createdAt: requiredString(row, "created_at"),
5077
5209
  updatedAt: requiredString(row, "updated_at")
5078
5210
  };