texlite 0.9.1 → 0.9.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 (95) hide show
  1. package/DESIGN.md +36 -6
  2. package/OPERATIONS.md +70 -3
  3. package/README.md +11 -3
  4. package/README.zh-CN.md +11 -2
  5. package/THIRD_PARTY_NOTICES.md +29 -0
  6. package/dist/client/assets/AdminUsers-huwQK7Ly.js +1 -0
  7. package/dist/client/assets/CitationLibraryDialog-C5C3sPdw.js +1 -0
  8. package/dist/client/assets/Dashboard-DtHSc55D.js +2 -0
  9. package/dist/client/assets/{GitDialog-C9Loz4Al.js → GitDialog-BI7QIMsh.js} +1 -1
  10. package/dist/client/assets/{HistoryDialog-3UNN_jhU.js → HistoryDialog-DA7O9aF2.js} +1 -1
  11. package/dist/client/assets/LatexEditor-BYWWx5Km.js +138 -0
  12. package/dist/client/assets/{PdfPreview-BKhcS-2c.js → PdfPreview-mO9WS01q.js} +1 -1
  13. package/dist/client/assets/ProjectIconPickerDialog-B0q_r5dX.js +1 -0
  14. package/dist/client/assets/{ProjectNavigationDialogs-CZKTnxrl.js → ProjectNavigationDialogs-DwWYbB1A.js} +1 -1
  15. package/dist/client/assets/ProjectSettings-BpPFgdoj.js +1 -0
  16. package/dist/client/assets/ProjectWorkspace-CI2zKon5.js +32 -0
  17. package/dist/client/assets/{SelectionHistoryDialog-D3dO83lg.js → SelectionHistoryDialog-pWMI5izu.js} +2 -2
  18. package/dist/client/assets/SystemMetricsDialog-BmlO7oNg.js +1 -0
  19. package/dist/client/assets/TagManagementDialog-h4Ves4FR.js +1 -0
  20. package/dist/client/assets/{WordCountDialog-TwpyAP3m.js → WordCountDialog-DlBSP4y7.js} +1 -1
  21. package/dist/client/assets/check-BAdi_Lxq.js +1 -0
  22. package/dist/client/assets/editor-DZS7-wrd.js +14 -0
  23. package/dist/client/assets/{hard-drive-XHSiS_A7.js → hard-drive-DP2OHKMC.js} +1 -1
  24. package/dist/client/assets/index-CBrIrzgg.css +1 -0
  25. package/dist/client/assets/{index-Cd6-F29b.js → index-i5IY_PMw.js} +1 -1
  26. package/dist/client/assets/index-teah8iB2.js +12 -0
  27. package/dist/client/assets/katex-D9PXdmFF.css +1 -0
  28. package/dist/client/assets/{key-round-C-CXCWnz.js → key-round-D8sCqL2b.js} +1 -1
  29. package/dist/client/assets/{latexFormatterWorker-DYkYtcFy.js → latexFormatterWorker-BRmsns8a.js} +2 -2
  30. package/dist/client/assets/{minimize-2-BMDPVaF-.js → minimize-2-6tf519Ts.js} +1 -1
  31. package/dist/client/assets/{minus-BIa7-KuM.js → minus-CqvESp9M.js} +1 -1
  32. package/dist/client/assets/{pdf-BB1XvBIF.js → pdf-DUYcbPMK.js} +1 -1
  33. package/dist/client/assets/{plus-BKDWy4Ui.js → plus-DIrweesj.js} +1 -1
  34. package/dist/client/assets/{refresh-cw-Bo7-a7-I.js → refresh-cw-BDcwKu_d.js} +1 -1
  35. package/dist/client/assets/{search-Bz9Ob5mT.js → search-C9_Jyrnx.js} +1 -1
  36. package/dist/client/assets/{sigma-DxlHf9gv.js → sigma-p9-fBP0d.js} +1 -1
  37. package/dist/client/assets/spellCheck-Y0RlmXbl.js +1 -0
  38. package/dist/client/assets/{tags-IMZehjzE.js → tags-DjF3z21M.js} +1 -1
  39. package/dist/client/assets/{type-DTWpFQNQ.js → type-CNrDJnzR.js} +1 -1
  40. package/dist/client/assets/{user-plus--aVpd8K6.js → user-plus-C7exNawX.js} +1 -1
  41. package/dist/client/assets/x-BEVz0wdw.js +1 -0
  42. package/dist/client/index.html +6 -4
  43. package/dist/server/app.js +130 -83
  44. package/dist/server/cli.js +4 -2
  45. package/dist/server/collaboration.js +6 -19
  46. package/dist/server/compileArtifacts.js +3 -2
  47. package/dist/server/config.js +27 -0
  48. package/dist/server/db.js +91 -10
  49. package/dist/server/index.js +4 -2
  50. package/dist/server/instanceLock.js +4 -2
  51. package/dist/server/latexCompletion.js +126 -63
  52. package/dist/server/latexDocumentGraph.js +217 -0
  53. package/dist/server/latexSpellMask.js +3 -4
  54. package/dist/server/pm2.js +3 -2
  55. package/dist/server/projectOutline.js +103 -91
  56. package/dist/server/projectReferences.js +109 -0
  57. package/dist/server/routes/auth.js +5 -2
  58. package/dist/server/routes/comments.js +10 -4
  59. package/dist/server/routes/compile.js +2 -2
  60. package/dist/server/routes/projectFiles.js +12 -3
  61. package/dist/server/routes/projectReferences.js +36 -0
  62. package/dist/server/routes/projectShared.js +33 -12
  63. package/dist/server/routes/projects.js +5 -0
  64. package/dist/server/routes/system.js +1 -0
  65. package/dist/server/zip.js +2 -16
  66. package/dist/shared/basePath.js +44 -0
  67. package/dist/shared/bibtexReferences.js +135 -0
  68. package/dist/shared/collaborationProtocol.js +31 -0
  69. package/dist/shared/latexCommandSnippets.js +91 -0
  70. package/dist/shared/latexDependencies.js +131 -0
  71. package/dist/shared/latexLiterals.js +215 -0
  72. package/dist/shared/latexReferenceCommands.js +75 -0
  73. package/dist/shared/latexReferences.js +193 -0
  74. package/dist/shared/latexRoot.js +21 -0
  75. package/dist/shared/latexScanner.js +183 -0
  76. package/dist/shared/writingChecks.js +4 -0
  77. package/package.json +11 -4
  78. package/texlite.config.example.json +2 -4
  79. package/dist/client/assets/AdminUsers-Dazar9cj.js +0 -1
  80. package/dist/client/assets/CitationLibraryDialog-VSUiSPgG.js +0 -1
  81. package/dist/client/assets/Dashboard-CoE5ESfb.js +0 -2
  82. package/dist/client/assets/LatexEditor-Bq76v8sO.js +0 -65
  83. package/dist/client/assets/ProjectIconPickerDialog-BoWMjQVm.js +0 -1
  84. package/dist/client/assets/ProjectSettings-DiOQVJ40.js +0 -1
  85. package/dist/client/assets/ProjectWorkspace-DqLwkGpT.js +0 -27
  86. package/dist/client/assets/SystemMetricsDialog-0zCwLtH_.js +0 -1
  87. package/dist/client/assets/TagManagementDialog-C6KDwtvd.js +0 -1
  88. package/dist/client/assets/check-sZxOOKtS.js +0 -1
  89. package/dist/client/assets/chevron-left-32SrOwa5.js +0 -1
  90. package/dist/client/assets/editor-CiK7TK0p.js +0 -14
  91. package/dist/client/assets/index-BRr3Kuxh.css +0 -1
  92. package/dist/client/assets/index-BjzELSQ-.js +0 -12
  93. package/dist/client/assets/katex-CEK31ho9.css +0 -1
  94. package/dist/client/assets/spellCheck-BfZEnpwY.js +0 -1
  95. package/dist/client/assets/x-Tbo3aA0J.js +0 -1
@@ -1 +0,0 @@
1
- import{u as f,r as n,j as e}from"./react-BVUjbTTn.js";import{f as y,M as b}from"./index-BjzELSQ-.js";import{A as M}from"./Dashboard-CoE5ESfb.js";import{R as $}from"./refresh-cw-Bo7-a7-I.js";import"./hard-drive-XHSiS_A7.js";import"./x-Tbo3aA0J.js";import"./sigma-DxlHf9gv.js";import"./tags-IMZehjzE.js";import"./chevron-left-32SrOwa5.js";function R({open:t,onOpenChange:c}){const{t:s}=f(),[r,p]=n.useState(null),[u,x]=n.useState(!1),[d,j]=n.useState(""),a=n.useCallback(async()=>{x(!0);try{p(await y("/api/health/metrics")),j("")}catch(i){j(i instanceof Error?i.message:s("errors.generic"))}finally{x(!1)}},[s]);return n.useEffect(()=>{if(!t)return;a();const i=window.setInterval(()=>{a()},5e3);return()=>window.clearInterval(i)},[t,a]),e.jsxs(b,{open:t,onOpenChange:c,wide:!0,title:s("metrics.title"),description:s("metrics.description"),footer:e.jsxs("button",{onClick:()=>{a()},disabled:u,children:[e.jsx($,{size:14,className:u?"spin":""}),s("metrics.refresh")]}),children:[d&&e.jsx("p",{className:"error",children:d}),!r&&!d&&e.jsx("p",{className:"muted",children:s("common.loading")}),r&&e.jsxs("div",{className:"system-metrics",children:[e.jsxs("div",{className:"metric-summary-grid",children:[e.jsx(l,{label:s("metrics.uptime"),value:v(r.uptimeSeconds)}),e.jsx(l,{label:s("metrics.memory"),value:`${h(r.memory.rssBytes)} RSS`,detail:`${h(r.memory.heapUsedBytes)} / ${h(r.memory.heapTotalBytes)} ${s("metrics.heap")}`}),e.jsx(l,{label:s("metrics.compileQueue"),value:`${r.compileQueue.running} / ${r.compileQueue.concurrency}`,detail:s("metrics.pending",{count:r.compileQueue.pending})}),e.jsx(l,{label:s("metrics.collaboration"),value:s("metrics.sessions",{count:r.collaboration.sessions}),detail:s("metrics.roomsAndDirty",{rooms:r.collaboration.rooms,dirty:r.collaboration.dirtyFiles})})]}),e.jsxs("section",{className:"metric-section",children:[e.jsxs("h3",{children:[e.jsx(M,{size:15}),s("metrics.eventLoop")]}),e.jsx("p",{children:s("metrics.latencySummary",r.eventLoopDelay)})]}),e.jsxs("section",{className:"metric-section",children:[e.jsx("h3",{children:s("metrics.operationDurations")}),Object.keys(r.durationsMs).length===0?e.jsx("p",{className:"muted",children:s("metrics.noSamples")}):e.jsx("div",{className:"metric-table-wrap",children:e.jsxs("table",{className:"metric-table",children:[e.jsx("thead",{children:e.jsxs("tr",{children:[e.jsx("th",{children:s("metrics.operation")}),e.jsx("th",{children:s("metrics.samples")}),e.jsx("th",{children:s("metrics.last")}),e.jsx("th",{children:"P50"}),e.jsx("th",{children:"P95"}),e.jsx("th",{children:s("metrics.max")})]})}),e.jsx("tbody",{children:Object.entries(r.durationsMs).sort(([i],[o])=>i.localeCompare(o)).map(([i,o])=>e.jsxs("tr",{children:[e.jsx("td",{children:g(i,s)}),e.jsx("td",{children:o.count}),e.jsx("td",{children:m(o.last)}),e.jsx("td",{children:m(o.p50)}),e.jsx("td",{children:m(o.p95)}),e.jsx("td",{children:m(o.max)})]},i))})]})})]})]})]})}function l({label:t,value:c,detail:s}){return e.jsxs("article",{className:"metric-card",children:[e.jsx("span",{children:t}),e.jsx("strong",{children:c}),s&&e.jsx("small",{children:s})]})}function h(t){return`${Math.round(t/1024/1024*10)/10} MB`}function v(t){const c=Math.floor(t/86400),s=Math.floor(t%86400/3600),r=Math.floor(t%3600/60);return c?`${c}d ${s}h`:s?`${s}h ${r}m`:`${r}m`}function m(t){return t>=1e3?`${Math.round(t/100)/10}s`:`${Math.round(t*10)/10}ms`}function g(t,c){return c(`metrics.operations.${t}`,{defaultValue:t})}export{R as SystemMetricsDialog};
@@ -1 +0,0 @@
1
- import{u as W,r as s,j as a}from"./react-BVUjbTTn.js";import{f,g as b,M as Y,b as E,C as Z}from"./index-BjzELSQ-.js";import{P as _}from"./plus-BKDWy4Ui.js";import{P as ee,T as ae,X as te}from"./x-Tbo3aA0J.js";import{C as ne}from"./check-sZxOOKtS.js";const H=["red","orange","yellow","green","blue","purple","gray"];function S(l){return[...l].sort((C,y)=>C.name.localeCompare(y.name))}function se(l){return l instanceof Error&&l.name==="AbortError"}function de({open:l,onOpenChange:C,onTagCreated:y,onTagUpdated:R,onTagDeleted:X}){const{t}=W(),[T,h]=s.useState([]),[G,w]=s.useState(!1),[D,i]=s.useState(""),[p,k]=s.useState(""),[z,L]=s.useState("blue"),[d,P]=s.useState(!1),[$,m]=s.useState(null),[j,I]=s.useState(""),[M,A]=s.useState("blue"),[N,O]=s.useState(null),[o,v]=s.useState(null),[Q,g]=s.useState(""),[u,q]=s.useState(!1);s.useEffect(()=>{if(!l)return;const e=new AbortController;return w(!0),i(""),f("/api/tags/management",{signal:e.signal}).then(n=>h(S(n.tags))).catch(n=>{se(n)||i(b(n))}).finally(()=>{e.signal.aborted||w(!1)}),()=>e.abort()},[l]);const F=async()=>{if(!(!p.trim()||d)){P(!0),i("");try{const e=await f("/api/tags",{method:"POST",body:JSON.stringify({name:p,color:z})});h(n=>S([...n,{...e.tag,projectCount:0}])),y(e.tag),k(""),L("blue")}catch(e){i(b(e))}finally{P(!1)}}},U=e=>{m(e.id),I(e.name),A(e.color),i("")},J=async e=>{if(!(!j.trim()||N)){O(e.id),i("");try{const n=await f(`/api/tags/${e.id}`,{method:"PATCH",body:JSON.stringify({name:j,color:M})}),c={...n.tag,projectCount:e.projectCount};h(r=>S(r.map(B=>B.id===e.id?c:B))),R(n.tag),m(null)}catch(n){i(b(n))}finally{O(null)}}},V=async()=>{if(!(!o||u)){q(!0),g("");try{await f(`/api/tags/${o.id}`,{method:"DELETE"}),h(e=>e.filter(n=>n.id!==o.id)),X(o.id),v(null),$===o.id&&m(null)}catch(e){g(b(e))}finally{q(!1)}}},x=d||N!==null||u,K=e=>{!e&&x||(e||(i(""),g(""),m(null)),C(e))};return a.jsxs(a.Fragment,{children:[a.jsx(Y,{open:l,title:t("tags.manage"),description:t("tags.manageDescription"),wide:!0,className:"tag-management-modal",onOpenChange:K,footer:a.jsx("button",{onClick:()=>K(!1),disabled:x,children:t("common.close")}),children:a.jsxs("div",{className:"tag-management",children:[D&&a.jsx("p",{className:"error dialog-error",role:"alert",children:D}),a.jsxs("div",{className:"tag-management-create",children:[a.jsxs("label",{className:"tag-management-field",children:[a.jsx("span",{children:t("tags.name")}),a.jsx("input",{autoFocus:!0,value:p,maxLength:32,placeholder:t("tags.name"),onChange:e=>{k(e.target.value),i("")},onKeyDown:e=>{e.key==="Enter"&&(e.preventDefault(),F())}})]}),a.jsxs("label",{className:"tag-management-field tag-management-color",children:[a.jsx("span",{children:t("tags.color")}),a.jsx("select",{value:z,onChange:e=>L(e.target.value),children:H.map(e=>a.jsx("option",{value:e,children:t(`tags.${e}`)},e))})]}),a.jsxs("button",{type:"button",className:"primary",disabled:!p.trim()||d,"aria-busy":d,onClick:()=>{F()},children:[d?a.jsx(E,{className:"spin",size:14}):a.jsx(_,{"aria-hidden":!0,size:14}),t("tags.createInManager")]})]}),G?a.jsxs("div",{className:"tag-management-loading",children:[a.jsx(E,{className:"spin",size:16}),t("common.loading")]}):T.length===0?a.jsx("p",{className:"tag-management-empty",children:t("tags.noTags")}):a.jsx("div",{className:"tag-management-list",children:T.map(e=>{const n=$===e.id,c=N===e.id;return a.jsxs("article",{className:`tag-management-item${n?" editing":""}`,children:[a.jsxs("div",{className:"tag-management-item-main",children:[a.jsx("span",{className:`tag-dot tag-${e.color}`,"aria-hidden":"true"}),a.jsxs("div",{children:[a.jsx("strong",{title:e.name,children:e.name}),a.jsx("small",{children:t("tags.projectCount",{count:e.projectCount})})]})]}),a.jsxs("div",{className:"tag-management-item-actions",children:[a.jsx("button",{type:"button",title:t("tags.edit"),"aria-label":t("tags.edit"),disabled:x&&!n,onClick:()=>U(e),children:a.jsx(ee,{"aria-hidden":!0,size:14})}),a.jsx("button",{type:"button",className:"danger-text",title:t("common.delete"),"aria-label":t("common.delete"),disabled:x,onClick:()=>{v(e),g("")},children:a.jsx(ae,{"aria-hidden":!0,size:14})})]}),n&&a.jsxs("div",{className:"tag-management-edit",children:[a.jsxs("label",{className:"tag-management-field",children:[a.jsx("span",{children:t("tags.rename")}),a.jsx("input",{value:j,maxLength:32,onChange:r=>{I(r.target.value),i("")},onKeyDown:r=>{r.key==="Enter"&&(r.preventDefault(),J(e))}})]}),a.jsxs("label",{className:"tag-management-field tag-management-color",children:[a.jsx("span",{children:t("tags.color")}),a.jsx("select",{value:M,onChange:r=>{A(r.target.value),i("")},children:H.map(r=>a.jsx("option",{value:r,children:t(`tags.${r}`)},r))})]}),a.jsxs("div",{className:"tag-management-edit-actions",children:[a.jsxs("button",{type:"button",disabled:c,onClick:()=>{m(null),i("")},children:[a.jsx(te,{"aria-hidden":!0,size:14}),t("common.cancel")]}),a.jsxs("button",{type:"button",className:"primary",disabled:!j.trim()||c,"aria-busy":c,onClick:()=>{J(e)},children:[c?a.jsx(E,{className:"spin",size:14}):a.jsx(ne,{"aria-hidden":!0,size:14}),t("common.save")]})]})]})]},e.id)})})]})}),a.jsx(Z,{open:!!o,title:t("tags.deleteTitle"),description:t("tags.deleteDescription",{tag:o?.name??"",count:o?.projectCount??0}),confirmLabel:t(u?"common.loading":"common.delete"),danger:!0,busy:u,error:Q,onCancel:()=>{u||(v(null),g(""))},onConfirm:()=>{V()}})]})}export{de as TagManagementDialog};
@@ -1 +0,0 @@
1
- import{c}from"./index-BjzELSQ-.js";const o=c("Check",[["path",{d:"M20 6 9 17l-5-5",key:"1gmf2c"}]]);export{o as C};
@@ -1 +0,0 @@
1
- import{c as e}from"./index-BjzELSQ-.js";const t=e("ChevronLeft",[["path",{d:"m15 18-6-6 6-6",key:"1wnfg3"}]]);export{t as C};