@openspecui/web 3.11.2 → 3.11.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.
Files changed (65) hide show
  1. package/dist/assets/CanvasRenderer-DGnQw8uB.js +1 -0
  2. package/dist/assets/WebGLRenderer-DHRbteVS.js +1 -0
  3. package/dist/assets/WebGPURenderer-BnFcGKnW.js +1 -0
  4. package/dist/assets/browserAll-BB7WVzo0.js +1 -0
  5. package/dist/assets/dist-B0Que_Lt.js +1 -0
  6. package/dist/assets/dist-B8m1wxBF.js +1 -0
  7. package/dist/assets/{dist-BggZ7cyQ.js → dist-BKY1RG9s.js} +1 -1
  8. package/dist/assets/{dist-B9Ltz3Au.js → dist-BVKuVv2H.js} +1 -1
  9. package/dist/assets/{dist-wEqYYKag.js → dist-Bl4uejAA.js} +1 -1
  10. package/dist/assets/{dist-DRc-odji.js → dist-CZh2GIVt.js} +1 -1
  11. package/dist/assets/{dist-HIi-Q3U-.js → dist-Caq73PXT.js} +1 -1
  12. package/dist/assets/{dist-DHhbIMeO.js → dist-CkEGbci5.js} +1 -1
  13. package/dist/assets/{dist-Drgp5ero.js → dist-DDPVC2MF.js} +1 -1
  14. package/dist/assets/dist-DP_rT4tp.js +1 -0
  15. package/dist/assets/{dist-j6cthCRX.js → dist-YXnB8lV1.js} +1 -1
  16. package/dist/assets/{dist-B_UFDOda.js → dist-rlrlm1HB.js} +1 -1
  17. package/dist/assets/{init-D41cyy2z.js → init-sSrVfvjg.js} +1 -1
  18. package/dist/assets/{main-DpM-T-Pk.js → main-DThx1JaQ.js} +167 -167
  19. package/dist/assets/trpc-Dko2Zn9y.js +1 -0
  20. package/dist/assets/webworkerAll-Bfbn1LyG.js +1 -0
  21. package/dist/index.html +1 -1
  22. package/dist-ssg/client/.vite/ssr-manifest.json +15 -15
  23. package/dist-ssg/client/assets/CanvasRenderer-Dpr5EYjp.js +1 -0
  24. package/dist-ssg/client/assets/WebGLRenderer-DCzH263Z.js +1 -0
  25. package/dist-ssg/client/assets/WebGPURenderer-DgF_8B9g.js +1 -0
  26. package/dist-ssg/client/assets/browserAll-CPl4rDmN.js +1 -0
  27. package/dist-ssg/client/assets/{dist-CzScJNYz.js → dist-BKTT7Vdm.js} +1 -1
  28. package/dist-ssg/client/assets/{dist-lNUMJW4A.js → dist-BPUIHtZ8.js} +1 -1
  29. package/dist-ssg/client/assets/dist-BuFVGK1x.js +1 -0
  30. package/dist-ssg/client/assets/{dist-BZ35ju6s.js → dist-CLrPzzut.js} +1 -1
  31. package/dist-ssg/client/assets/{dist-CuFabXJ8.js → dist-CVizFqBj.js} +1 -1
  32. package/dist-ssg/client/assets/{dist-BJ0zzLee.js → dist-CX1-5rfl.js} +1 -1
  33. package/dist-ssg/client/assets/{dist-Bg-C799P.js → dist-Cm5Vx6W8.js} +1 -1
  34. package/dist-ssg/client/assets/{dist-CrdkjkLH.js → dist-DJkx9TIh.js} +1 -1
  35. package/dist-ssg/client/assets/dist-DlrmChto.js +1 -0
  36. package/dist-ssg/client/assets/{dist-xprslEpB.js → dist-HHQTTSi-.js} +1 -1
  37. package/dist-ssg/client/assets/dist-bnfyzoQu.js +1 -0
  38. package/dist-ssg/client/assets/{dist-nDBVtvCj.js → dist-upAmtw9_.js} +1 -1
  39. package/dist-ssg/client/assets/{ghostty-web-D9IXftv-.js → ghostty-web-BKQcHDq5.js} +1 -1
  40. package/dist-ssg/client/assets/index.ssg-DBq9_pDs.js +1624 -0
  41. package/dist-ssg/client/assets/{init-C058TQcq.js → init-brQ3KbKB.js} +1 -1
  42. package/dist-ssg/client/assets/trpc-DGapI9Ny.js +1 -0
  43. package/dist-ssg/client/assets/webworkerAll-BKMUeO96.js +1 -0
  44. package/dist-ssg/client/index.ssg.html +1 -1
  45. package/dist-ssg/server/entry-server.js +167 -102
  46. package/package.json +3 -3
  47. package/dist/assets/CanvasRenderer-C0z1_uAq.js +0 -1
  48. package/dist/assets/WebGLRenderer-BgB0b-_m.js +0 -1
  49. package/dist/assets/WebGPURenderer-DUOyTSOY.js +0 -1
  50. package/dist/assets/browserAll-DrkY7ahm.js +0 -1
  51. package/dist/assets/dist-BLzDSe4i.js +0 -1
  52. package/dist/assets/dist-C2tzK2BJ.js +0 -1
  53. package/dist/assets/dist-LSzi3-xz.js +0 -1
  54. package/dist/assets/trpc-lJhbxi32.js +0 -1
  55. package/dist/assets/webworkerAll-DXrA-UNG.js +0 -1
  56. package/dist-ssg/client/assets/CanvasRenderer-pScAgtDS.js +0 -1
  57. package/dist-ssg/client/assets/WebGLRenderer-BAJXWFrw.js +0 -1
  58. package/dist-ssg/client/assets/WebGPURenderer-BeNNGqxY.js +0 -1
  59. package/dist-ssg/client/assets/browserAll-CkiE7Jmg.js +0 -1
  60. package/dist-ssg/client/assets/dist-BJBQISim.js +0 -1
  61. package/dist-ssg/client/assets/dist-BPi1lJ-H.js +0 -1
  62. package/dist-ssg/client/assets/dist-CNPnfIVE.js +0 -1
  63. package/dist-ssg/client/assets/index.ssg-L1BBuH-7.js +0 -1624
  64. package/dist-ssg/client/assets/trpc-BTuQHFNd.js +0 -1
  65. package/dist-ssg/client/assets/webworkerAll-ByOBLjhR.js +0 -1
@@ -1 +1 @@
1
- import{it as e}from"./Geometry-DYOOLchf.js";import{E as t,T as n}from"./index.ssg-L1BBuH-7.js";e.add(n),e.add(t);
1
+ import{it as e}from"./Geometry-DYOOLchf.js";import{E as t,T as n}from"./index.ssg-DBq9_pDs.js";e.add(n),e.add(t);
@@ -0,0 +1 @@
1
+ import{F as e}from"./index.ssg-DBq9_pDs.js";export{e as trpcClient};
@@ -0,0 +1 @@
1
+ import"./Geometry-DYOOLchf.js";import"./index.ssg-DBq9_pDs.js";import"./init-brQ3KbKB.js";
@@ -35,7 +35,7 @@
35
35
  document.head.append(preconnectApi, preconnectStatic, stylesheet)
36
36
  })()
37
37
  </script>
38
- <script type="module" crossorigin src="/assets/index.ssg-L1BBuH-7.js"></script>
38
+ <script type="module" crossorigin src="/assets/index.ssg-DBq9_pDs.js"></script>
39
39
  <link rel="modulepreload" crossorigin href="/assets/chunk-DECur_0Z.js">
40
40
  <link rel="modulepreload" crossorigin href="/assets/dist-UN0VvTJo.js">
41
41
  <link rel="modulepreload" crossorigin href="/assets/dist-DK_X22KS.js">
@@ -32296,15 +32296,20 @@ var TranslationEngineIdSchema = enumType([
32296
32296
  "browser",
32297
32297
  "local",
32298
32298
  "local-ct2",
32299
+ "local-llama",
32299
32300
  "openai"
32300
32301
  ]);
32301
32302
  var DEFAULT_TRANSLATION_ENGINE_ID = "browser";
32302
32303
  function isManagedLocalTranslationEngineId(engineId) {
32304
+ return engineId === "local" || engineId === "local-ct2" || engineId === "local-llama";
32305
+ }
32306
+ function isDirectionalManagedLocalTranslationEngineId(engineId) {
32303
32307
  return engineId === "local" || engineId === "local-ct2";
32304
32308
  }
32305
32309
  enumType([
32306
32310
  "local",
32307
32311
  "local-ct2",
32312
+ "local-llama",
32308
32313
  "openai"
32309
32314
  ]);
32310
32315
  var LocalModelDownloadStatusSchema = enumType([
@@ -32419,7 +32424,11 @@ var LocalModelProfileLoadStateSchema = objectType({
32419
32424
  updatedAt: numberType().int().nonnegative().optional()
32420
32425
  });
32421
32426
  objectType({
32422
- engineId: enumType(["local", "local-ct2"]),
32427
+ engineId: enumType([
32428
+ "local",
32429
+ "local-ct2",
32430
+ "local-llama"
32431
+ ]),
32423
32432
  modelId: stringType().min(1),
32424
32433
  selectedGroupId: stringType().min(1).optional(),
32425
32434
  groupId: stringType().min(1).optional(),
@@ -32468,6 +32477,11 @@ objectType({
32468
32477
  downloadedBytes: numberType().int().nonnegative().optional()
32469
32478
  })).default([])
32470
32479
  });
32480
+ enumType([
32481
+ "local",
32482
+ "network",
32483
+ "recommended"
32484
+ ]);
32471
32485
  var TranslationEngineDependencyStateSchema = enumType([
32472
32486
  "installed",
32473
32487
  "installing",
@@ -32549,10 +32563,16 @@ var TranslationLocalCt2SettingsSchema = objectType({
32549
32563
  selectedGroupId: stringType().optional(),
32550
32564
  hfEndpoint: stringType().default("")
32551
32565
  });
32566
+ var TranslationLocalLlamaSettingsSchema = objectType({
32567
+ model: stringType().default("bartowski/Qwen2.5-0.5B-Instruct-GGUF"),
32568
+ selectedGroupId: stringType().optional(),
32569
+ hfEndpoint: stringType().default("")
32570
+ });
32552
32571
  objectType({
32553
32572
  openai: TranslationOpenAISettingsSchema.default(TranslationOpenAISettingsSchema.parse({})),
32554
32573
  local: TranslationLocalSettingsSchema.default(TranslationLocalSettingsSchema.parse({})),
32555
- localCt2: TranslationLocalCt2SettingsSchema.default(TranslationLocalCt2SettingsSchema.parse({}))
32574
+ localCt2: TranslationLocalCt2SettingsSchema.default(TranslationLocalCt2SettingsSchema.parse({})),
32575
+ localLlama: TranslationLocalLlamaSettingsSchema.default(TranslationLocalLlamaSettingsSchema.parse({}))
32556
32576
  });
32557
32577
  objectType({
32558
32578
  engineId: TranslationEngineIdSchema,
@@ -32578,6 +32598,10 @@ var TranslationEngineProjectSettingsSchema = objectType({
32578
32598
  model: stringType().min(1).optional(),
32579
32599
  selectedGroupId: stringType().min(1).optional()
32580
32600
  }).default({}),
32601
+ localLlama: objectType({
32602
+ model: stringType().min(1).optional(),
32603
+ selectedGroupId: stringType().min(1).optional()
32604
+ }).default({}),
32581
32605
  openai: objectType({ model: stringType().min(1).optional() }).default({})
32582
32606
  }).default({});
32583
32607
  var DocumentTranslationConfigSchema = objectType({
@@ -114686,85 +114710,6 @@ function navigateHashAnchor(anchorElement, hash) {
114686
114710
  return true;
114687
114711
  }
114688
114712
  //#endregion
114689
- //#region src/lib/document-translation-session-state.ts
114690
- var DOCUMENT_TRANSLATION_SESSION_STORAGE_KEY = "openspecui:document-translation:mode";
114691
- var DEFAULT_ACTIVATION = "source";
114692
- var ACTIVATION_STORAGE_EVENT = "openspecui:document-translation-session-change";
114693
- function isDocumentTranslationActivation(value) {
114694
- return value === "source" || value === "translated";
114695
- }
114696
- function readDocumentTranslationActivation() {
114697
- if (typeof window === "undefined") return DEFAULT_ACTIVATION;
114698
- try {
114699
- const value = window.sessionStorage.getItem(DOCUMENT_TRANSLATION_SESSION_STORAGE_KEY);
114700
- return isDocumentTranslationActivation(value) ? value : DEFAULT_ACTIVATION;
114701
- } catch {
114702
- return DEFAULT_ACTIVATION;
114703
- }
114704
- }
114705
- function writeDocumentTranslationActivation(value) {
114706
- if (typeof window === "undefined") return;
114707
- try {
114708
- window.sessionStorage.setItem(DOCUMENT_TRANSLATION_SESSION_STORAGE_KEY, value);
114709
- } catch {
114710
- return;
114711
- }
114712
- window.dispatchEvent(new CustomEvent(ACTIVATION_STORAGE_EVENT, { detail: value }));
114713
- }
114714
- function useDocumentTranslationActivation() {
114715
- const [activation, setActivationState] = (0, import_react.useState)(readDocumentTranslationActivation);
114716
- (0, import_react.useEffect)(() => {
114717
- const handleActivationChange = () => {
114718
- setActivationState(readDocumentTranslationActivation());
114719
- };
114720
- window.addEventListener(ACTIVATION_STORAGE_EVENT, handleActivationChange);
114721
- window.addEventListener("storage", handleActivationChange);
114722
- return () => {
114723
- window.removeEventListener(ACTIVATION_STORAGE_EVENT, handleActivationChange);
114724
- window.removeEventListener("storage", handleActivationChange);
114725
- };
114726
- }, []);
114727
- return {
114728
- activation,
114729
- setActivation: (0, import_react.useCallback)((value) => {
114730
- writeDocumentTranslationActivation(value);
114731
- setActivationState(value);
114732
- }, [])
114733
- };
114734
- }
114735
- //#endregion
114736
- //#region src/lib/resolve-document-translation-config.ts
114737
- function resolveDocumentTranslationConfig(translationConfig, globalSettings) {
114738
- if (!translationConfig) return void 0;
114739
- const local = translationConfig.engines?.local ?? {};
114740
- const localCt2 = translationConfig.engines?.localCt2 ?? {};
114741
- const openai = translationConfig.engines?.openai ?? {};
114742
- const resolvedLocalModel = local.model ?? globalSettings?.translationEngines.local?.model;
114743
- const resolvedLocalSelectedGroupId = local.selectedGroupId ?? globalSettings?.translationEngines.local?.selectedGroupId;
114744
- const resolvedLocalCt2Model = localCt2.model ?? globalSettings?.translationEngines.localCt2?.model;
114745
- const resolvedLocalCt2SelectedGroupId = localCt2.selectedGroupId ?? globalSettings?.translationEngines.localCt2?.selectedGroupId;
114746
- const resolvedOpenAIModel = openai.model ?? globalSettings?.translationEngines.openai?.model;
114747
- return {
114748
- ...translationConfig,
114749
- engines: {
114750
- local: {
114751
- ...local,
114752
- ...resolvedLocalModel ? { model: resolvedLocalModel } : {},
114753
- ...resolvedLocalSelectedGroupId ? { selectedGroupId: resolvedLocalSelectedGroupId } : {}
114754
- },
114755
- localCt2: {
114756
- ...localCt2,
114757
- ...resolvedLocalCt2Model ? { model: resolvedLocalCt2Model } : {},
114758
- ...resolvedLocalCt2SelectedGroupId ? { selectedGroupId: resolvedLocalCt2SelectedGroupId } : {}
114759
- },
114760
- openai: {
114761
- ...openai,
114762
- ...resolvedOpenAIModel ? { model: resolvedOpenAIModel } : {}
114763
- }
114764
- }
114765
- };
114766
- }
114767
- //#endregion
114768
114713
  //#region ../browser-translator/dist/index.mjs
114769
114714
  async function scanBrowserTranslationSupportTable(options) {
114770
114715
  const translator = (options.win ?? window).Translator;
@@ -136508,6 +136453,9 @@ buildSearchIndex(SUPPORTED_TRANSLATION_LANGUAGES.map((language) => ({
136508
136453
  //#endregion
136509
136454
  //#region src/lib/browser-translation.ts
136510
136455
  var browserSupportTableCache = /* @__PURE__ */ new Map();
136456
+ function isRenderableTranslationSegment(segment) {
136457
+ return typeof segment === "object" && segment !== null && !Array.isArray(segment);
136458
+ }
136511
136459
  function createBrowserTranslationExecution() {
136512
136460
  return {
136513
136461
  factory: createBrowserTranslatorFactory(),
@@ -136840,7 +136788,7 @@ async function translateMarkdownDocumentProgressively(args, onPatch) {
136840
136788
  onPatch
136841
136789
  })));
136842
136790
  return {
136843
- segments: translatedSegments,
136791
+ segments: normalizeTranslationSegments(translatedSegments),
136844
136792
  displayMode: args.displayMode,
136845
136793
  sourceLanguage: languageDetection.documentLanguage,
136846
136794
  targetLanguage: args.targetLanguage
@@ -137001,7 +136949,7 @@ async function translatePendingJobsBySourceLanguage(input) {
137001
136949
  while (workerPromises.size > 0) await Promise.race(workerPromises);
137002
136950
  }
137003
136951
  function getUnsupportedEngineLanguagePairMessage(input) {
137004
- if (!isManagedLocalTranslationEngineId(input.engine.cacheIdentity.engineId)) return null;
136952
+ if (!isDirectionalManagedLocalTranslationEngineId(input.engine.cacheIdentity.engineId)) return null;
137005
136953
  const directionCheck = checkLocalDirectionalModelLanguagePair({
137006
136954
  model: input.engine.cacheIdentity.model,
137007
136955
  sourceLanguage: input.sourceLanguage,
@@ -137010,6 +136958,9 @@ function getUnsupportedEngineLanguagePairMessage(input) {
137010
136958
  if (directionCheck.supported) return null;
137011
136959
  return directionCheck.message ?? "Selected local model does not support the detected translation direction.";
137012
136960
  }
136961
+ function normalizeTranslationSegments(segments) {
136962
+ return segments.filter(isRenderableTranslationSegment);
136963
+ }
137013
136964
  function summarizeTranslationLogThroughput(logs) {
137014
136965
  if (logs.length === 0) return 0;
137015
136966
  const totalTokens = logs.reduce((total, log) => total + log.estimatedTokens, 0);
@@ -137562,6 +137513,93 @@ function getErrorMessage(error) {
137562
137513
  return error instanceof Error ? error.message : "Unknown translation error.";
137563
137514
  }
137564
137515
  //#endregion
137516
+ //#region src/lib/document-translation-session-state.ts
137517
+ var DOCUMENT_TRANSLATION_SESSION_STORAGE_KEY = "openspecui:document-translation:mode";
137518
+ var DEFAULT_ACTIVATION = "source";
137519
+ var ACTIVATION_STORAGE_EVENT = "openspecui:document-translation-session-change";
137520
+ function isDocumentTranslationActivation(value) {
137521
+ return value === "source" || value === "translated";
137522
+ }
137523
+ function readDocumentTranslationActivation() {
137524
+ if (typeof window === "undefined") return DEFAULT_ACTIVATION;
137525
+ try {
137526
+ const value = window.sessionStorage.getItem(DOCUMENT_TRANSLATION_SESSION_STORAGE_KEY);
137527
+ return isDocumentTranslationActivation(value) ? value : DEFAULT_ACTIVATION;
137528
+ } catch {
137529
+ return DEFAULT_ACTIVATION;
137530
+ }
137531
+ }
137532
+ function writeDocumentTranslationActivation(value) {
137533
+ if (typeof window === "undefined") return;
137534
+ try {
137535
+ window.sessionStorage.setItem(DOCUMENT_TRANSLATION_SESSION_STORAGE_KEY, value);
137536
+ } catch {
137537
+ return;
137538
+ }
137539
+ window.dispatchEvent(new CustomEvent(ACTIVATION_STORAGE_EVENT, { detail: value }));
137540
+ }
137541
+ function useDocumentTranslationActivation() {
137542
+ const [activation, setActivationState] = (0, import_react.useState)(readDocumentTranslationActivation);
137543
+ (0, import_react.useEffect)(() => {
137544
+ const handleActivationChange = () => {
137545
+ setActivationState(readDocumentTranslationActivation());
137546
+ };
137547
+ window.addEventListener(ACTIVATION_STORAGE_EVENT, handleActivationChange);
137548
+ window.addEventListener("storage", handleActivationChange);
137549
+ return () => {
137550
+ window.removeEventListener(ACTIVATION_STORAGE_EVENT, handleActivationChange);
137551
+ window.removeEventListener("storage", handleActivationChange);
137552
+ };
137553
+ }, []);
137554
+ return {
137555
+ activation,
137556
+ setActivation: (0, import_react.useCallback)((value) => {
137557
+ writeDocumentTranslationActivation(value);
137558
+ setActivationState(value);
137559
+ }, [])
137560
+ };
137561
+ }
137562
+ //#endregion
137563
+ //#region src/lib/resolve-document-translation-config.ts
137564
+ function resolveDocumentTranslationConfig(translationConfig, globalSettings) {
137565
+ if (!translationConfig) return void 0;
137566
+ const local = translationConfig.engines?.local ?? {};
137567
+ const localCt2 = translationConfig.engines?.localCt2 ?? {};
137568
+ const localLlama = translationConfig.engines?.localLlama ?? {};
137569
+ const openai = translationConfig.engines?.openai ?? {};
137570
+ const resolvedLocalModel = local.model ?? globalSettings?.translationEngines.local?.model;
137571
+ const resolvedLocalSelectedGroupId = local.selectedGroupId ?? globalSettings?.translationEngines.local?.selectedGroupId;
137572
+ const resolvedLocalCt2Model = localCt2.model ?? globalSettings?.translationEngines.localCt2?.model;
137573
+ const resolvedLocalCt2SelectedGroupId = localCt2.selectedGroupId ?? globalSettings?.translationEngines.localCt2?.selectedGroupId;
137574
+ const resolvedLocalLlamaModel = localLlama.model ?? globalSettings?.translationEngines.localLlama?.model;
137575
+ const resolvedLocalLlamaSelectedGroupId = localLlama.selectedGroupId ?? globalSettings?.translationEngines.localLlama?.selectedGroupId;
137576
+ const resolvedOpenAIModel = openai.model ?? globalSettings?.translationEngines.openai?.model;
137577
+ return {
137578
+ ...translationConfig,
137579
+ engines: {
137580
+ local: {
137581
+ ...local,
137582
+ ...resolvedLocalModel ? { model: resolvedLocalModel } : {},
137583
+ ...resolvedLocalSelectedGroupId ? { selectedGroupId: resolvedLocalSelectedGroupId } : {}
137584
+ },
137585
+ localCt2: {
137586
+ ...localCt2,
137587
+ ...resolvedLocalCt2Model ? { model: resolvedLocalCt2Model } : {},
137588
+ ...resolvedLocalCt2SelectedGroupId ? { selectedGroupId: resolvedLocalCt2SelectedGroupId } : {}
137589
+ },
137590
+ localLlama: {
137591
+ ...localLlama,
137592
+ ...resolvedLocalLlamaModel ? { model: resolvedLocalLlamaModel } : {},
137593
+ ...resolvedLocalLlamaSelectedGroupId ? { selectedGroupId: resolvedLocalLlamaSelectedGroupId } : {}
137594
+ },
137595
+ openai: {
137596
+ ...openai,
137597
+ ...resolvedOpenAIModel ? { model: resolvedOpenAIModel } : {}
137598
+ }
137599
+ }
137600
+ };
137601
+ }
137602
+ //#endregion
137565
137603
  //#region ../core/src/local-download-profiles.ts
137566
137604
  function selectLocalDownloadGroup(plan, selectedGroupId) {
137567
137605
  if (!plan?.groups?.length) return null;
@@ -137719,15 +137757,17 @@ async function resolveTranslateServiceState(input) {
137719
137757
  localModel: model,
137720
137758
  localSelectedGroupId: localEngineConfig.selectedGroupId
137721
137759
  }) });
137722
- const directionCheck = checkLocalDirectionalModelLanguagePair({
137723
- model,
137724
- targetLanguage: config.targetLanguage
137725
- });
137726
- if (!directionCheck.supported) return emitTranslateServiceState(input.onUpdate, { status: {
137727
- state: "unavailable",
137728
- engineId: config.engineId,
137729
- message: directionCheck.message ?? "Selected local model does not support the configured target language."
137730
- } });
137760
+ if (isDirectionalManagedLocalTranslationEngineId(config.engineId)) {
137761
+ const directionCheck = checkLocalDirectionalModelLanguagePair({
137762
+ model,
137763
+ targetLanguage: config.targetLanguage
137764
+ });
137765
+ if (!directionCheck.supported) return emitTranslateServiceState(input.onUpdate, { status: {
137766
+ state: "unavailable",
137767
+ engineId: config.engineId,
137768
+ message: directionCheck.message ?? "Selected local model does not support the configured target language."
137769
+ } });
137770
+ }
137731
137771
  input.onUpdate?.(createTranslateServiceState({ status: projectTranslateServiceStatus({
137732
137772
  enabled: config.enabled,
137733
137773
  hasSource: input.hasSource,
@@ -137897,13 +137937,16 @@ function getManagedLocalEngineConfig(config) {
137897
137937
  return config.engineId === "local-ct2" ? {
137898
137938
  model: config.engines.localCt2.model,
137899
137939
  selectedGroupId: config.engines.localCt2.selectedGroupId
137940
+ } : config.engineId === "local-llama" ? {
137941
+ model: config.engines.localLlama.model,
137942
+ selectedGroupId: config.engines.localLlama.selectedGroupId
137900
137943
  } : {
137901
137944
  model: config.engines.local.model,
137902
137945
  selectedGroupId: config.engines.local.selectedGroupId
137903
137946
  };
137904
137947
  }
137905
137948
  async function queryManagedLocalPanelState(engineId, input) {
137906
- return engineId === "local" ? trpcClient.localModels.panelState.query(input) : trpcClient.localCt2Models.panelState.query(input);
137949
+ return engineId === "local" ? trpcClient.localModels.panelState.query(input) : engineId === "local-ct2" ? trpcClient.localCt2Models.panelState.query(input) : trpcClient.localLlamaModels.panelState.query(input);
137907
137950
  }
137908
137951
  var TrpcTranslator = class {
137909
137952
  constructor(options) {
@@ -137978,11 +138021,13 @@ function useDocumentTranslation(markdown, config) {
137978
138021
  const abortRef = (0, import_react.useRef)(null);
137979
138022
  const generationRef = (0, import_react.useRef)(0);
137980
138023
  const latestStartRef = (0, import_react.useRef)(null);
138024
+ const segmentPatchMapRef = (0, import_react.useRef)(/* @__PURE__ */ new Map());
137981
138025
  const { activation } = useDocumentTranslationActivation();
137982
138026
  const cancel = (0, import_react.useCallback)(() => {
137983
138027
  generationRef.current += 1;
137984
138028
  abortRef.current?.abort();
137985
138029
  abortRef.current = null;
138030
+ segmentPatchMapRef.current.clear();
137986
138031
  setStatus("source");
137987
138032
  setResult(null);
137988
138033
  setError(null);
@@ -137991,6 +138036,7 @@ function useDocumentTranslation(markdown, config) {
137991
138036
  generationRef.current += 1;
137992
138037
  abortRef.current?.abort();
137993
138038
  abortRef.current = null;
138039
+ segmentPatchMapRef.current.clear();
137994
138040
  setStatus("source");
137995
138041
  setResult(null);
137996
138042
  setError(null);
@@ -138000,6 +138046,7 @@ function useDocumentTranslation(markdown, config) {
138000
138046
  generationRef.current += 1;
138001
138047
  setCapability(null);
138002
138048
  setBrowserSupportTable(null);
138049
+ segmentPatchMapRef.current.clear();
138003
138050
  setResult(null);
138004
138051
  setStatus("source");
138005
138052
  setError(null);
@@ -138012,6 +138059,8 @@ function useDocumentTranslation(markdown, config) {
138012
138059
  config?.engines.local.selectedGroupId,
138013
138060
  config?.engines.localCt2.model,
138014
138061
  config?.engines.localCt2.selectedGroupId,
138062
+ config?.engines.localLlama.model,
138063
+ config?.engines.localLlama.selectedGroupId,
138015
138064
  config?.engines.openai.model,
138016
138065
  config?.targetLanguage
138017
138066
  ]);
@@ -138054,6 +138103,8 @@ function useDocumentTranslation(markdown, config) {
138054
138103
  config?.engines.local.selectedGroupId,
138055
138104
  config?.engines.localCt2.model,
138056
138105
  config?.engines.localCt2.selectedGroupId,
138106
+ config?.engines.localLlama.model,
138107
+ config?.engines.localLlama.selectedGroupId,
138057
138108
  config?.targetLanguage,
138058
138109
  markdown.length
138059
138110
  ]);
@@ -138064,6 +138115,7 @@ function useDocumentTranslation(markdown, config) {
138064
138115
  const generationId = generationRef.current + 1;
138065
138116
  generationRef.current = generationId;
138066
138117
  abortRef.current = controller;
138118
+ segmentPatchMapRef.current.clear();
138067
138119
  setError(null);
138068
138120
  setStatus("initializing");
138069
138121
  try {
@@ -138108,11 +138160,11 @@ function useDocumentTranslation(markdown, config) {
138108
138160
  setResult((current) => applyDocumentTranslationPatch(current, patch, {
138109
138161
  displayMode: config.displayMode,
138110
138162
  targetLanguage: config.targetLanguage
138111
- }));
138163
+ }, segmentPatchMapRef.current));
138112
138164
  });
138113
138165
  if (controller.signal.aborted || abortRef.current !== controller || generationRef.current !== generationId) return;
138114
138166
  const documentFailure = getDocumentTranslationFailureMessage(nextResult);
138115
- setResult(nextResult);
138167
+ setResult(normalizeDocumentTranslationResult(nextResult));
138116
138168
  if (documentFailure) {
138117
138169
  setError(documentFailure);
138118
138170
  setStatus("error");
@@ -138138,6 +138190,8 @@ function useDocumentTranslation(markdown, config) {
138138
138190
  config?.engines.local.selectedGroupId,
138139
138191
  config?.engines.localCt2.model,
138140
138192
  config?.engines.localCt2.selectedGroupId,
138193
+ config?.engines.localLlama.model,
138194
+ config?.engines.localLlama.selectedGroupId,
138141
138195
  markdown,
138142
138196
  serviceStatus
138143
138197
  ]);
@@ -138167,22 +138221,33 @@ function useDocumentTranslation(markdown, config) {
138167
138221
  reset
138168
138222
  };
138169
138223
  }
138224
+ function isDocumentTranslationSegment(segment) {
138225
+ return typeof segment === "object" && segment !== null && !Array.isArray(segment);
138226
+ }
138170
138227
  function getDocumentTranslationFailureMessage(result) {
138171
- const segments = (Array.isArray(result.segments) ? result.segments : []).filter((segment) => segment !== void 0);
138228
+ const segments = (Array.isArray(result.segments) ? result.segments : []).filter(isDocumentTranslationSegment);
138172
138229
  if (segments.length === 0) return null;
138173
138230
  if (segments.some((segment) => segment.status !== "error" && typeof segment.target === "string")) return null;
138174
138231
  const errors = segments.map((segment) => segment.status === "error" ? segment.error : void 0).filter((message) => typeof message === "string" && message.length > 0);
138175
138232
  if (errors.length === 0) return null;
138176
138233
  return errors[0] ?? "Translation failed.";
138177
138234
  }
138178
- function applyDocumentTranslationPatch(current, patch, fallback) {
138179
- const segments = current?.segments.slice() ?? [];
138180
- segments[patch.segmentIndex] = patch.segment;
138181
- return {
138235
+ function applyDocumentTranslationPatch(current, patch, fallback, patchMap) {
138236
+ patchMap.set(patch.segmentIndex, patch.segment);
138237
+ return buildPatchedDocumentTranslationResult(current, fallback, patchMap);
138238
+ }
138239
+ function buildPatchedDocumentTranslationResult(current, fallback, patchMap) {
138240
+ return normalizeDocumentTranslationResult({
138182
138241
  displayMode: current?.displayMode ?? fallback.displayMode,
138183
138242
  sourceLanguage: current?.sourceLanguage,
138184
138243
  targetLanguage: current?.targetLanguage ?? fallback.targetLanguage,
138185
- segments
138244
+ segments: [...patchMap.entries()].sort((left, right) => left[0] - right[0]).map(([, segment]) => segment)
138245
+ });
138246
+ }
138247
+ function normalizeDocumentTranslationResult(result) {
138248
+ return {
138249
+ ...result,
138250
+ segments: (Array.isArray(result.segments) ? result.segments : []).filter(isDocumentTranslationSegment)
138186
138251
  };
138187
138252
  }
138188
138253
  //#endregion
@@ -149081,7 +149146,7 @@ function createTranslationProjection(result) {
149081
149146
  };
149082
149147
  }
149083
149148
  function getRenderableTranslationSegments(result) {
149084
- return (Array.isArray(result.segments) ? result.segments : []).filter((segment) => segment !== void 0);
149149
+ return (Array.isArray(result.segments) ? result.segments : []).filter(isRenderableTranslationSegment);
149085
149150
  }
149086
149151
  function createTranslatedHeadingTransform(input, segment, displayMode) {
149087
149152
  const projectedTarget = segment.target ?? "";
package/package.json CHANGED
@@ -1,6 +1,6 @@
1
1
  {
2
2
  "name": "@openspecui/web",
3
- "version": "3.11.2",
3
+ "version": "3.11.3",
4
4
  "type": "module",
5
5
  "bin": {
6
6
  "openspecui-ssg": "./dist-ssg/ssg-cli.mjs"
@@ -39,8 +39,8 @@
39
39
  "@codemirror/view": "^6.38.8",
40
40
  "@lezer/common": "^1.4.0",
41
41
  "@lezer/highlight": "^1.2.3",
42
- "@openspecui/search": "3.11.2",
43
- "@openspecui/server": "3.11.2",
42
+ "@openspecui/search": "3.11.3",
43
+ "@openspecui/server": "3.11.3",
44
44
  "@storybook/addon-vitest": "^10.2.19",
45
45
  "@storybook/web-components": "^10.2.19",
46
46
  "@storybook/web-components-vite": "^10.2.19",
@@ -1 +0,0 @@
1
- import"./Geometry-Dr8DqqDe.js";import{w as e}from"./main-DpM-T-Pk.js";export{e as CanvasRenderer};
@@ -1 +0,0 @@
1
- import"./Geometry-Dr8DqqDe.js";import{C as e}from"./main-DpM-T-Pk.js";export{e as WebGLRenderer};
@@ -1 +0,0 @@
1
- import"./Geometry-Dr8DqqDe.js";import{S as e}from"./main-DpM-T-Pk.js";export{e as WebGPURenderer};
@@ -1 +0,0 @@
1
- import{it as e,x as t}from"./Geometry-Dr8DqqDe.js";import{A as n,D as r,O as i,k as a}from"./main-DpM-T-Pk.js";import"./init-D41cyy2z.js";e.add(n),e.mixin(t,a),e.add(i),e.mixin(t,r);
@@ -1 +0,0 @@
1
- import"./dist-vqrjFRzf.js";import{g as e}from"./main-DpM-T-Pk.js";export{e as css};
@@ -1 +0,0 @@
1
- import"./dist-vqrjFRzf.js";import{t as e}from"./main-DpM-T-Pk.js";export{e as yaml};
@@ -1 +0,0 @@
1
- import"./dist-vqrjFRzf.js";import{b as e}from"./main-DpM-T-Pk.js";export{e as json};
@@ -1 +0,0 @@
1
- import"./jsx-runtime-1jQlXmIx.js";import{F as e}from"./main-DpM-T-Pk.js";export{e as trpcClient};
@@ -1 +0,0 @@
1
- import"./Geometry-Dr8DqqDe.js";import"./main-DpM-T-Pk.js";import"./init-D41cyy2z.js";
@@ -1 +0,0 @@
1
- import"./Geometry-DYOOLchf.js";import{w as e}from"./index.ssg-L1BBuH-7.js";export{e as CanvasRenderer};
@@ -1 +0,0 @@
1
- import"./Geometry-DYOOLchf.js";import{C as e}from"./index.ssg-L1BBuH-7.js";export{e as WebGLRenderer};
@@ -1 +0,0 @@
1
- import"./Geometry-DYOOLchf.js";import{S as e}from"./index.ssg-L1BBuH-7.js";export{e as WebGPURenderer};
@@ -1 +0,0 @@
1
- import{it as e,x as t}from"./Geometry-DYOOLchf.js";import{A as n,D as r,O as i,k as a}from"./index.ssg-L1BBuH-7.js";import"./init-C058TQcq.js";e.add(n),e.mixin(t,a),e.add(i),e.mixin(t,r);
@@ -1 +0,0 @@
1
- import"./dist-UN0VvTJo.js";import{g as e}from"./index.ssg-L1BBuH-7.js";export{e as css};
@@ -1 +0,0 @@
1
- import"./dist-UN0VvTJo.js";import{t as e}from"./index.ssg-L1BBuH-7.js";export{e as yaml};
@@ -1 +0,0 @@
1
- import"./dist-UN0VvTJo.js";import{b as e}from"./index.ssg-L1BBuH-7.js";export{e as json};