@leanspec/ui 0.2.28 → 0.3.0

This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
Files changed (194) hide show
  1. package/dist/{_baseUniq-BtJuknnJ.js → _baseUniq-Cfpafgc0.js} +1 -1
  2. package/dist/{arc-O-rE7YCB.js → arc-Ch9WDeqx.js} +1 -1
  3. package/dist/{architecture-U656AL7Q-BeYqAAo7.js → architecture-U656AL7Q-BMkAcamw.js} +1 -1
  4. package/dist/{architectureDiagram-VXUJARFQ-DlDB9-tN.js → architectureDiagram-VXUJARFQ-B2kiuB6l.js} +3 -3
  5. package/dist/assets/ChatSettingsPage-BNkUWXD7.js +1 -0
  6. package/dist/assets/ContextPage-BXFBa390.js +14 -0
  7. package/dist/assets/{DashboardPage-DQH28Es5.js → DashboardPage-DG3o4y5K.js} +1 -1
  8. package/dist/assets/DependenciesPage-CAJX6zmQ.js +2 -0
  9. package/dist/assets/{FilesPage-BBVU37eW.js → FilesPage-E9VTXi3O.js} +3 -3
  10. package/dist/assets/SessionDetailPage-DsFv3UaN.js +4 -0
  11. package/dist/assets/SessionsPage-BJQkApgV.js +1 -0
  12. package/dist/assets/SpecDetailPage-NxlrFJ3X.js +3 -0
  13. package/dist/assets/SpecsPage-D7dH4bxd.js +1 -0
  14. package/dist/assets/StatsPage-DcDN3p4C.js +36 -0
  15. package/dist/assets/{_baseUniq-Dacov6Rp.js → _baseUniq-BLwGRN9T.js} +1 -1
  16. package/dist/assets/{arc-C1vHYpyW.js → arc-D46jVWXL.js} +1 -1
  17. package/dist/assets/architectureDiagram-VXUJARFQ-GKb1fnPC.js +36 -0
  18. package/dist/assets/blockDiagram-VD42YOAC-BAeW8TcZ.js +122 -0
  19. package/dist/assets/c4Diagram-YG6GDRKO-DsCDxNEY.js +10 -0
  20. package/dist/assets/channel-BCohFlQD.js +1 -0
  21. package/dist/assets/chunk-4BX2VUAB--jRtR2Gx.js +1 -0
  22. package/dist/assets/{chunk-55IACEB6-CEO6q7uK.js → chunk-55IACEB6-CK4VujpY.js} +1 -1
  23. package/dist/assets/{chunk-B4BG7PRW-DeXdKUh1.js → chunk-B4BG7PRW-CpmnmzRV.js} +6 -6
  24. package/dist/assets/chunk-DI55MBZ5-g0bpnDBm.js +220 -0
  25. package/dist/assets/{chunk-FMBD7UC4-D6UFHN61.js → chunk-FMBD7UC4-DrlucdFf.js} +1 -1
  26. package/dist/assets/chunk-QN33PNHL-Di9WxIWk.js +1 -0
  27. package/dist/assets/{chunk-QZHKN3VN-XfElTSSy.js → chunk-QZHKN3VN-DQ-Hq4Ek.js} +1 -1
  28. package/dist/assets/{chunk-TZMSLE5B-DAIUJ9YL.js → chunk-TZMSLE5B-Cdg6dOwb.js} +1 -1
  29. package/dist/assets/classDiagram-2ON5EDUG-BB3bs3WS.js +1 -0
  30. package/dist/assets/classDiagram-v2-WZHVMYZB-BB3bs3WS.js +1 -0
  31. package/dist/assets/clone-BFGeeEUV.js +1 -0
  32. package/dist/assets/{code-block-37QAKDTI-B3a0lz6t.js → code-block-37QAKDTI-B_yBCn5T.js} +1 -1
  33. package/dist/assets/cose-bilkent-S5V4N54A-BMhRWD7P.js +1 -0
  34. package/dist/assets/cytoscape.esm-Boq4YasU.js +321 -0
  35. package/dist/assets/dagre-6UL2VRFP-BI8xXpYB.js +4 -0
  36. package/dist/assets/diagram-PSM6KHXK-DqSGGlhJ.js +24 -0
  37. package/dist/assets/diagram-QEK2KX5R-CIjtZbdl.js +43 -0
  38. package/dist/assets/diagram-S2PKOQOG-CKt9XoCU.js +24 -0
  39. package/dist/assets/{erDiagram-Q2GNP2WA-BqqB9yVU.js → erDiagram-Q2GNP2WA-BRSo0yH7.js} +4 -4
  40. package/dist/assets/flowDiagram-NV44I4VS-BthSoz_o.js +162 -0
  41. package/dist/assets/{funnel-x-DD5BpUpW.js → funnel-x-B9PkB_Ch.js} +1 -1
  42. package/dist/assets/{ganttDiagram-JELNMOA3-DXHyY80Y.js → ganttDiagram-JELNMOA3-CNwbRK5k.js} +1 -1
  43. package/dist/assets/gitGraphDiagram-NY62KEGX-BNGeVHTR.js +65 -0
  44. package/dist/assets/{graph-0GUv5NSb.js → graph-DadEESFe.js} +1 -1
  45. package/dist/assets/index-CENAb10b.js +2187 -0
  46. package/dist/assets/index-Dw2Hz3j4.css +1 -0
  47. package/dist/assets/{info-BoE52mzX.js → info-DW259gfi.js} +1 -1
  48. package/dist/assets/{infoDiagram-WHAUD3N6-C_TEtQdE.js → infoDiagram-WHAUD3N6-CeJF3upx.js} +1 -1
  49. package/dist/assets/{journeyDiagram-XKPGCS4Q-JFcsNaoS.js → journeyDiagram-XKPGCS4Q-Dr67Preg.js} +1 -1
  50. package/dist/assets/kanban-definition-3W4ZIXB7-DpwQotp4.js +89 -0
  51. package/dist/assets/{layout-DlGkdPxn.js → layout-4MguctiF.js} +1 -1
  52. package/dist/assets/{linear-DMzKEHWt.js → linear-IgIsApJd.js} +1 -1
  53. package/dist/assets/{min-D9GrKucE.js → min-s8C1gLFb.js} +1 -1
  54. package/dist/assets/mindmap-definition-VGOIOE7T-DFKUH7eJ.js +68 -0
  55. package/dist/assets/{page-transition-BMYHE1EG.js → page-transition-2ToPXqzU.js} +1 -1
  56. package/dist/assets/pieDiagram-ADFJNKIX-BpyrOtAX.js +30 -0
  57. package/dist/assets/quadrantDiagram-AYHSOK5B-CAuPRVrk.js +7 -0
  58. package/dist/assets/{refresh-ccw-CqpLwlfM.js → refresh-ccw-A4xr5yc-.js} +1 -1
  59. package/dist/assets/{requirementDiagram-UZGBJVZJ-DQ1RBDeF.js → requirementDiagram-UZGBJVZJ-eokL0bzi.js} +7 -7
  60. package/dist/assets/sankeyDiagram-TZEHDZUN-B2hHsE_f.js +10 -0
  61. package/dist/assets/{sequenceDiagram-WL72ISMW-ClnYRNdC.js → sequenceDiagram-WL72ISMW-Clj8c0qS.js} +16 -16
  62. package/dist/assets/{session-mode-badge-auIgZbxq.js → session-mode-badge-C89NgahF.js} +1 -1
  63. package/dist/assets/{stat-card-BdyKZs20.js → stat-card-DV-CrlHv.js} +1 -1
  64. package/dist/assets/{stateDiagram-FKZM4ZOC-xdSWJeM-.js → stateDiagram-FKZM4ZOC-B4OFkmnx.js} +1 -1
  65. package/dist/assets/stateDiagram-v2-4FDKWEC3-XElvWSPn.js +1 -0
  66. package/dist/assets/{table-of-contents-B56zI3O0.js → table-of-contents-DXTiOsyr.js} +1 -1
  67. package/dist/assets/{time-BvMRJTpu.js → time-D3zosL_G.js} +1 -1
  68. package/dist/assets/timeline-definition-IT6M3QCI-Y7w9Ot5X.js +61 -0
  69. package/dist/assets/treemap-KMMF4GRG-DS1ewDz-.js +128 -0
  70. package/dist/assets/{trending-up-qrMVjIzR.js → trending-up-D4zFB2hx.js} +1 -1
  71. package/dist/assets/{validation-badge-DKLDRlSe.js → validation-badge-BPbTJ9B4.js} +1 -1
  72. package/dist/assets/{xychartDiagram-PRI3JC2R-LmjJ6LwN.js → xychartDiagram-PRI3JC2R-DTRIkv2x.js} +1 -1
  73. package/dist/{blockDiagram-VD42YOAC-Cvqa8noV.js → blockDiagram-VD42YOAC-BJR0FCnk.js} +5 -5
  74. package/dist/{c4Diagram-YG6GDRKO-D4hwame5.js → c4Diagram-YG6GDRKO-Bt0Epxwp.js} +2 -2
  75. package/dist/{channel-C59vLj3i.js → channel-Dk7mWM0A.js} +1 -1
  76. package/dist/{chunk-4BX2VUAB-BwnJRlDR.js → chunk-4BX2VUAB-ByHqqe_a.js} +1 -1
  77. package/dist/{chunk-55IACEB6-CUvZDifa.js → chunk-55IACEB6-C6Rm-yNH.js} +1 -1
  78. package/dist/{chunk-B4BG7PRW-0lyBGfGe.js → chunk-B4BG7PRW-B7fIUqxs.js} +4 -4
  79. package/dist/{chunk-DI55MBZ5-DzuHPqVn.js → chunk-DI55MBZ5-qLuPk8Gl.js} +3 -3
  80. package/dist/{chunk-FMBD7UC4-CXI1mAvv.js → chunk-FMBD7UC4-Bgxdan8l.js} +1 -1
  81. package/dist/{chunk-QN33PNHL-BX4buhkI.js → chunk-QN33PNHL-BkO_Xn3V.js} +1 -1
  82. package/dist/{chunk-QZHKN3VN-p7skz8XQ.js → chunk-QZHKN3VN-m08GnZpm.js} +1 -1
  83. package/dist/{chunk-TZMSLE5B-BaJuPr6J.js → chunk-TZMSLE5B-DvK9Nkqp.js} +1 -1
  84. package/dist/{classDiagram-v2-WZHVMYZB-Be0dkyy-.js → classDiagram-2ON5EDUG-DCzOVBP6.js} +2 -2
  85. package/dist/{classDiagram-2ON5EDUG-Be0dkyy-.js → classDiagram-v2-WZHVMYZB-DCzOVBP6.js} +2 -2
  86. package/dist/{clone-DDo6Ol2x.js → clone-BpfNWUZj.js} +1 -1
  87. package/dist/{cose-bilkent-S5V4N54A-Bt2GyPMu.js → cose-bilkent-S5V4N54A-BpjQClp_.js} +1 -1
  88. package/dist/{dagre-6UL2VRFP-B4GNvmUo.js → dagre-6UL2VRFP-Br_w0Y4b.js} +5 -5
  89. package/dist/{diagram-PSM6KHXK-CXpX_sN2.js → diagram-PSM6KHXK-reYm7V8l.js} +4 -4
  90. package/dist/{diagram-QEK2KX5R-BTpahbEj.js → diagram-QEK2KX5R-DrEPfuxO.js} +3 -3
  91. package/dist/{diagram-S2PKOQOG-BAp1IJGB.js → diagram-S2PKOQOG-vRL82AgB.js} +3 -3
  92. package/dist/{erDiagram-Q2GNP2WA-RpXtWNOz.js → erDiagram-Q2GNP2WA-DrANUeXv.js} +4 -4
  93. package/dist/{flowDiagram-NV44I4VS-DVAeihFU.js → flowDiagram-NV44I4VS-lzqrgi2-.js} +5 -5
  94. package/dist/{ganttDiagram-JELNMOA3-NnFNN967.js → ganttDiagram-JELNMOA3-Box6Sn7f.js} +2 -2
  95. package/dist/{gitGraph-F6HP7TQM-BA0p69BL.js → gitGraph-F6HP7TQM-ww-U1ysL.js} +1 -1
  96. package/dist/{gitGraphDiagram-NY62KEGX-STAanBwe.js → gitGraphDiagram-NY62KEGX-CtgGW6L9.js} +4 -4
  97. package/dist/{graph-Cl7g8mJo.js → graph-Csrlu3OG.js} +2 -2
  98. package/dist/{index-OMQgmcXQ.js → index-DSZdQoC5.js} +34 -34
  99. package/dist/index.html +13 -3
  100. package/dist/info-NVLQJR56-DdSoNNwK.js +5 -0
  101. package/dist/{infoDiagram-WHAUD3N6-Ch5c_x3A.js → infoDiagram-WHAUD3N6-B4cHYKqw.js} +2 -2
  102. package/dist/{journeyDiagram-XKPGCS4Q-BT3WQmRa.js → journeyDiagram-XKPGCS4Q-CNZRK4ng.js} +4 -4
  103. package/dist/{kanban-definition-3W4ZIXB7-CiJoVHr_.js → kanban-definition-3W4ZIXB7-DVYPrMkR.js} +2 -2
  104. package/dist/{layout-BsDPuqRL.js → layout-qhjDJGCt.js} +4 -4
  105. package/dist/lib/components/projects/create-project-dialog.d.ts +2 -1
  106. package/dist/lib/components/projects/git-import-dialog.d.ts +6 -0
  107. package/dist/lib/components/projects/git-import-form.d.ts +6 -0
  108. package/dist/lib/components/root-redirect.d.ts +1 -1
  109. package/dist/lib/hooks/useCapabilities.d.ts +180 -0
  110. package/dist/lib/index.js +1 -1
  111. package/dist/lib/lib/api.d.ts +4 -6
  112. package/dist/lib/lib/backend-adapter/core.d.ts +6 -8
  113. package/dist/lib/lib/backend-adapter/http.d.ts +5 -7
  114. package/dist/lib/lib/backend-adapter/tauri.d.ts +5 -7
  115. package/dist/lib/locales/en/common.json.d.ts +2 -2
  116. package/dist/lib/locales/zh-CN/common.json.d.ts +2 -2
  117. package/dist/lib/types/api.d.ts +7 -15
  118. package/dist/lib/types/generated/AdapterCapabilities.d.ts +18 -0
  119. package/dist/lib/types/generated/CompletableItem.d.ts +15 -0
  120. package/dist/lib/types/generated/EnumOption.d.ts +16 -0
  121. package/dist/lib/types/generated/FieldDef.d.ts +28 -0
  122. package/dist/lib/types/generated/FieldDisplay.d.ts +4 -0
  123. package/dist/lib/types/generated/FieldKind.d.ts +46 -0
  124. package/dist/lib/types/generated/FieldValue.d.ts +32 -0
  125. package/dist/lib/types/generated/ItemLink.d.ts +17 -0
  126. package/dist/lib/types/generated/LinkTypeDef.d.ts +11 -0
  127. package/dist/lib/types/generated/MetadataFieldSpec.d.ts +28 -0
  128. package/dist/lib/types/generated/MetadataKind.d.ts +17 -0
  129. package/dist/lib/types/generated/MetadataValue.d.ts +26 -0
  130. package/dist/lib/types/generated/Reference.d.ts +8 -0
  131. package/dist/lib/types/generated/SearchHit.d.ts +8 -0
  132. package/dist/lib/types/generated/SemanticHint.d.ts +4 -0
  133. package/dist/lib/types/generated/SpecDoc.d.ts +30 -0
  134. package/dist/lib/types/generated/SpecItem.d.ts +48 -0
  135. package/dist/lib/types/generated/SpecSchema.d.ts +25 -0
  136. package/dist/{linear-mOFrDt-p.js → linear-BEsG2XDl.js} +1 -1
  137. package/dist/{mermaid-parser.core-BKozsbnK.js → mermaid-parser.core-DI0P4xje.js} +10 -10
  138. package/dist/{min-BiKl7Djw.js → min-BrWJCoG9.js} +2 -2
  139. package/dist/{mindmap-definition-VGOIOE7T-BD-DdVQV.js → mindmap-definition-VGOIOE7T-BG1ZbSXN.js} +3 -3
  140. package/dist/{packet-BFZMPI3H-BCwLzQdp.js → packet-BFZMPI3H-0R4cyXFa.js} +1 -1
  141. package/dist/pie-7BOR55EZ-CBC6Vnp9.js +5 -0
  142. package/dist/{pieDiagram-ADFJNKIX-Bu8RN200.js → pieDiagram-ADFJNKIX-Bq3pEiUt.js} +4 -4
  143. package/dist/{quadrantDiagram-AYHSOK5B-DI1Je7Nn.js → quadrantDiagram-AYHSOK5B-CJCCPwac.js} +2 -2
  144. package/dist/radar-NHE76QYJ-R7FbU2R0.js +5 -0
  145. package/dist/{requirementDiagram-UZGBJVZJ-Ddx_vMRb.js → requirementDiagram-UZGBJVZJ-CEFnCGpg.js} +3 -3
  146. package/dist/{sankeyDiagram-TZEHDZUN-iAFyjtkY.js → sankeyDiagram-TZEHDZUN-vRgejrr7.js} +1 -1
  147. package/dist/{sequenceDiagram-WL72ISMW-NRQcqxnw.js → sequenceDiagram-WL72ISMW-Bn_-xqGS.js} +3 -3
  148. package/dist/{stateDiagram-FKZM4ZOC-3S1hbbmf.js → stateDiagram-FKZM4ZOC-D1wpTHL-.js} +4 -4
  149. package/dist/{stateDiagram-v2-4FDKWEC3-E5a40kZz.js → stateDiagram-v2-4FDKWEC3-DZ6_hPx3.js} +2 -2
  150. package/dist/{timeline-definition-IT6M3QCI-BCFa3ZrF.js → timeline-definition-IT6M3QCI-sxhKRCeY.js} +2 -2
  151. package/dist/{treemap-KMMF4GRG-BGlzeb2l.js → treemap-KMMF4GRG-BAGKypyB.js} +1 -1
  152. package/dist/ui.css +1 -1
  153. package/dist/{xychartDiagram-PRI3JC2R-CopvajdE.js → xychartDiagram-PRI3JC2R-BvZs2fIv.js} +2 -2
  154. package/package.json +2 -2
  155. package/dist/assets/ChatSettingsPage-DftRMMtU.js +0 -1
  156. package/dist/assets/ContextPage-CbK7ew6E.js +0 -14
  157. package/dist/assets/DependenciesPage-E93gHx4A.js +0 -2
  158. package/dist/assets/SessionDetailPage-7Nyk2Vvu.js +0 -4
  159. package/dist/assets/SessionsPage-aHydkWMy.js +0 -1
  160. package/dist/assets/SpecDetailPage-C2P-OlXI.js +0 -3
  161. package/dist/assets/SpecsPage-CYIBmjhJ.js +0 -1
  162. package/dist/assets/StatsPage-BE2SnGB_.js +0 -36
  163. package/dist/assets/architectureDiagram-VXUJARFQ-CJuppwvY.js +0 -36
  164. package/dist/assets/blockDiagram-VD42YOAC-JKuFC2tB.js +0 -122
  165. package/dist/assets/c4Diagram-YG6GDRKO-BGNHTjgV.js +0 -10
  166. package/dist/assets/channel-BBhsr-rR.js +0 -1
  167. package/dist/assets/chunk-4BX2VUAB-Dn9K_Ir6.js +0 -1
  168. package/dist/assets/chunk-DI55MBZ5-CoaAvDwo.js +0 -220
  169. package/dist/assets/chunk-QN33PNHL-BhFNOvzX.js +0 -1
  170. package/dist/assets/classDiagram-2ON5EDUG-DWsZgeAJ.js +0 -1
  171. package/dist/assets/classDiagram-v2-WZHVMYZB-DWsZgeAJ.js +0 -1
  172. package/dist/assets/clone-C2afIJUs.js +0 -1
  173. package/dist/assets/cose-bilkent-S5V4N54A-BMI_fEV7.js +0 -1
  174. package/dist/assets/cytoscape.esm-5J0xJHOV.js +0 -321
  175. package/dist/assets/dagre-6UL2VRFP-Llr-yTYV.js +0 -4
  176. package/dist/assets/diagram-PSM6KHXK-DwgNF44T.js +0 -24
  177. package/dist/assets/diagram-QEK2KX5R-ITZ8Vmt3.js +0 -43
  178. package/dist/assets/diagram-S2PKOQOG-BIRpYLio.js +0 -24
  179. package/dist/assets/flowDiagram-NV44I4VS-BNAcE_z4.js +0 -162
  180. package/dist/assets/gitGraphDiagram-NY62KEGX-BgdesX0s.js +0 -65
  181. package/dist/assets/index-C5tD8lpO.css +0 -1
  182. package/dist/assets/index-DSWQaVP_.js +0 -2187
  183. package/dist/assets/kanban-definition-3W4ZIXB7-D74EewjL.js +0 -89
  184. package/dist/assets/mindmap-definition-VGOIOE7T-bEmI6QdX.js +0 -68
  185. package/dist/assets/pieDiagram-ADFJNKIX-LrgsuoFm.js +0 -30
  186. package/dist/assets/quadrantDiagram-AYHSOK5B-XAEnrTcF.js +0 -7
  187. package/dist/assets/sankeyDiagram-TZEHDZUN-4LprtsUC.js +0 -10
  188. package/dist/assets/stateDiagram-v2-4FDKWEC3-DyupCcgD.js +0 -1
  189. package/dist/assets/timeline-definition-IT6M3QCI-BMCplyxv.js +0 -61
  190. package/dist/assets/treemap-KMMF4GRG-DXswoz8b.js +0 -128
  191. package/dist/info-NVLQJR56-iVvUDnHs.js +0 -5
  192. package/dist/lib/components/projects/github-import-dialog.d.ts +0 -6
  193. package/dist/pie-7BOR55EZ-0JoXf6-u.js +0 -5
  194. package/dist/radar-NHE76QYJ-FdQK6UPP.js +0 -5
@@ -50650,11 +50650,11 @@ var qle = /* @__PURE__ */ w((e, t, n, r) => {
50650
50650
  HF([
50651
50651
  {
50652
50652
  name: "dagre",
50653
- loader: /* @__PURE__ */ w(async () => await import("./dagre-6UL2VRFP-B4GNvmUo.js"), "loader")
50653
+ loader: /* @__PURE__ */ w(async () => await import("./dagre-6UL2VRFP-Br_w0Y4b.js"), "loader")
50654
50654
  },
50655
50655
  {
50656
50656
  name: "cose-bilkent",
50657
- loader: /* @__PURE__ */ w(async () => await import("./cose-bilkent-S5V4N54A-Bt2GyPMu.js"), "loader")
50657
+ loader: /* @__PURE__ */ w(async () => await import("./cose-bilkent-S5V4N54A-BpjQClp_.js"), "loader")
50658
50658
  }
50659
50659
  ]);
50660
50660
  }, "registerDefaultLayoutLoaders");
@@ -51001,119 +51001,119 @@ function pS(e) {
51001
51001
  return !0;
51002
51002
  }
51003
51003
  var YF = "c4", Hce = /* @__PURE__ */ w((e) => /^\s*C4Context|C4Container|C4Component|C4Dynamic|C4Deployment/.test(e), "detector"), Vce = /* @__PURE__ */ w(async () => {
51004
- const { diagram: e } = await import("./c4Diagram-YG6GDRKO-D4hwame5.js");
51004
+ const { diagram: e } = await import("./c4Diagram-YG6GDRKO-Bt0Epxwp.js");
51005
51005
  return { id: YF, diagram: e };
51006
51006
  }, "loader"), Wce = {
51007
51007
  id: YF,
51008
51008
  detector: Hce,
51009
51009
  loader: Vce
51010
51010
  }, qce = Wce, XF = "flowchart", jce = /* @__PURE__ */ w((e, t) => t?.flowchart?.defaultRenderer === "dagre-wrapper" || t?.flowchart?.defaultRenderer === "elk" ? !1 : /^\s*graph/.test(e), "detector"), Gce = /* @__PURE__ */ w(async () => {
51011
- const { diagram: e } = await import("./flowDiagram-NV44I4VS-DVAeihFU.js");
51011
+ const { diagram: e } = await import("./flowDiagram-NV44I4VS-lzqrgi2-.js");
51012
51012
  return { id: XF, diagram: e };
51013
51013
  }, "loader"), Kce = {
51014
51014
  id: XF,
51015
51015
  detector: jce,
51016
51016
  loader: Gce
51017
51017
  }, Yce = Kce, ZF = "flowchart-v2", Xce = /* @__PURE__ */ w((e, t) => t?.flowchart?.defaultRenderer === "dagre-d3" ? !1 : (t?.flowchart?.defaultRenderer === "elk" && (t.layout = "elk"), /^\s*graph/.test(e) && t?.flowchart?.defaultRenderer === "dagre-wrapper" ? !0 : /^\s*flowchart/.test(e)), "detector"), Zce = /* @__PURE__ */ w(async () => {
51018
- const { diagram: e } = await import("./flowDiagram-NV44I4VS-DVAeihFU.js");
51018
+ const { diagram: e } = await import("./flowDiagram-NV44I4VS-lzqrgi2-.js");
51019
51019
  return { id: ZF, diagram: e };
51020
51020
  }, "loader"), Qce = {
51021
51021
  id: ZF,
51022
51022
  detector: Xce,
51023
51023
  loader: Zce
51024
51024
  }, Jce = Qce, QF = "er", eue = /* @__PURE__ */ w((e) => /^\s*erDiagram/.test(e), "detector"), tue = /* @__PURE__ */ w(async () => {
51025
- const { diagram: e } = await import("./erDiagram-Q2GNP2WA-RpXtWNOz.js");
51025
+ const { diagram: e } = await import("./erDiagram-Q2GNP2WA-DrANUeXv.js");
51026
51026
  return { id: QF, diagram: e };
51027
51027
  }, "loader"), nue = {
51028
51028
  id: QF,
51029
51029
  detector: eue,
51030
51030
  loader: tue
51031
51031
  }, rue = nue, JF = "gitGraph", iue = /* @__PURE__ */ w((e) => /^\s*gitGraph/.test(e), "detector"), aue = /* @__PURE__ */ w(async () => {
51032
- const { diagram: e } = await import("./gitGraphDiagram-NY62KEGX-STAanBwe.js");
51032
+ const { diagram: e } = await import("./gitGraphDiagram-NY62KEGX-CtgGW6L9.js");
51033
51033
  return { id: JF, diagram: e };
51034
51034
  }, "loader"), sue = {
51035
51035
  id: JF,
51036
51036
  detector: iue,
51037
51037
  loader: aue
51038
51038
  }, oue = sue, eB = "gantt", lue = /* @__PURE__ */ w((e) => /^\s*gantt/.test(e), "detector"), cue = /* @__PURE__ */ w(async () => {
51039
- const { diagram: e } = await import("./ganttDiagram-JELNMOA3-NnFNN967.js");
51039
+ const { diagram: e } = await import("./ganttDiagram-JELNMOA3-Box6Sn7f.js");
51040
51040
  return { id: eB, diagram: e };
51041
51041
  }, "loader"), uue = {
51042
51042
  id: eB,
51043
51043
  detector: lue,
51044
51044
  loader: cue
51045
51045
  }, due = uue, tB = "info", hue = /* @__PURE__ */ w((e) => /^\s*info/.test(e), "detector"), pue = /* @__PURE__ */ w(async () => {
51046
- const { diagram: e } = await import("./infoDiagram-WHAUD3N6-Ch5c_x3A.js");
51046
+ const { diagram: e } = await import("./infoDiagram-WHAUD3N6-B4cHYKqw.js");
51047
51047
  return { id: tB, diagram: e };
51048
51048
  }, "loader"), fue = {
51049
51049
  id: tB,
51050
51050
  detector: hue,
51051
51051
  loader: pue
51052
51052
  }, nB = "pie", mue = /* @__PURE__ */ w((e) => /^\s*pie/.test(e), "detector"), gue = /* @__PURE__ */ w(async () => {
51053
- const { diagram: e } = await import("./pieDiagram-ADFJNKIX-Bu8RN200.js");
51053
+ const { diagram: e } = await import("./pieDiagram-ADFJNKIX-Bq3pEiUt.js");
51054
51054
  return { id: nB, diagram: e };
51055
51055
  }, "loader"), bue = {
51056
51056
  id: nB,
51057
51057
  detector: mue,
51058
51058
  loader: gue
51059
51059
  }, rB = "quadrantChart", yue = /* @__PURE__ */ w((e) => /^\s*quadrantChart/.test(e), "detector"), vue = /* @__PURE__ */ w(async () => {
51060
- const { diagram: e } = await import("./quadrantDiagram-AYHSOK5B-DI1Je7Nn.js");
51060
+ const { diagram: e } = await import("./quadrantDiagram-AYHSOK5B-CJCCPwac.js");
51061
51061
  return { id: rB, diagram: e };
51062
51062
  }, "loader"), xue = {
51063
51063
  id: rB,
51064
51064
  detector: yue,
51065
51065
  loader: vue
51066
51066
  }, wue = xue, iB = "xychart", Eue = /* @__PURE__ */ w((e) => /^\s*xychart(-beta)?/.test(e), "detector"), _ue = /* @__PURE__ */ w(async () => {
51067
- const { diagram: e } = await import("./xychartDiagram-PRI3JC2R-CopvajdE.js");
51067
+ const { diagram: e } = await import("./xychartDiagram-PRI3JC2R-BvZs2fIv.js");
51068
51068
  return { id: iB, diagram: e };
51069
51069
  }, "loader"), kue = {
51070
51070
  id: iB,
51071
51071
  detector: Eue,
51072
51072
  loader: _ue
51073
51073
  }, Cue = kue, aB = "requirement", Sue = /* @__PURE__ */ w((e) => /^\s*requirement(Diagram)?/.test(e), "detector"), Tue = /* @__PURE__ */ w(async () => {
51074
- const { diagram: e } = await import("./requirementDiagram-UZGBJVZJ-Ddx_vMRb.js");
51074
+ const { diagram: e } = await import("./requirementDiagram-UZGBJVZJ-CEFnCGpg.js");
51075
51075
  return { id: aB, diagram: e };
51076
51076
  }, "loader"), Aue = {
51077
51077
  id: aB,
51078
51078
  detector: Sue,
51079
51079
  loader: Tue
51080
51080
  }, Nue = Aue, sB = "sequence", Due = /* @__PURE__ */ w((e) => /^\s*sequenceDiagram/.test(e), "detector"), Lue = /* @__PURE__ */ w(async () => {
51081
- const { diagram: e } = await import("./sequenceDiagram-WL72ISMW-NRQcqxnw.js");
51081
+ const { diagram: e } = await import("./sequenceDiagram-WL72ISMW-Bn_-xqGS.js");
51082
51082
  return { id: sB, diagram: e };
51083
51083
  }, "loader"), Iue = {
51084
51084
  id: sB,
51085
51085
  detector: Due,
51086
51086
  loader: Lue
51087
51087
  }, Mue = Iue, oB = "class", Rue = /* @__PURE__ */ w((e, t) => t?.class?.defaultRenderer === "dagre-wrapper" ? !1 : /^\s*classDiagram/.test(e), "detector"), Pue = /* @__PURE__ */ w(async () => {
51088
- const { diagram: e } = await import("./classDiagram-2ON5EDUG-Be0dkyy-.js");
51088
+ const { diagram: e } = await import("./classDiagram-2ON5EDUG-DCzOVBP6.js");
51089
51089
  return { id: oB, diagram: e };
51090
51090
  }, "loader"), Oue = {
51091
51091
  id: oB,
51092
51092
  detector: Rue,
51093
51093
  loader: Pue
51094
51094
  }, Fue = Oue, lB = "classDiagram", Bue = /* @__PURE__ */ w((e, t) => /^\s*classDiagram/.test(e) && t?.class?.defaultRenderer === "dagre-wrapper" ? !0 : /^\s*classDiagram-v2/.test(e), "detector"), $ue = /* @__PURE__ */ w(async () => {
51095
- const { diagram: e } = await import("./classDiagram-v2-WZHVMYZB-Be0dkyy-.js");
51095
+ const { diagram: e } = await import("./classDiagram-v2-WZHVMYZB-DCzOVBP6.js");
51096
51096
  return { id: lB, diagram: e };
51097
51097
  }, "loader"), Uue = {
51098
51098
  id: lB,
51099
51099
  detector: Bue,
51100
51100
  loader: $ue
51101
51101
  }, zue = Uue, cB = "state", Hue = /* @__PURE__ */ w((e, t) => t?.state?.defaultRenderer === "dagre-wrapper" ? !1 : /^\s*stateDiagram/.test(e), "detector"), Vue = /* @__PURE__ */ w(async () => {
51102
- const { diagram: e } = await import("./stateDiagram-FKZM4ZOC-3S1hbbmf.js");
51102
+ const { diagram: e } = await import("./stateDiagram-FKZM4ZOC-D1wpTHL-.js");
51103
51103
  return { id: cB, diagram: e };
51104
51104
  }, "loader"), Wue = {
51105
51105
  id: cB,
51106
51106
  detector: Hue,
51107
51107
  loader: Vue
51108
51108
  }, que = Wue, uB = "stateDiagram", jue = /* @__PURE__ */ w((e, t) => !!(/^\s*stateDiagram-v2/.test(e) || /^\s*stateDiagram/.test(e) && t?.state?.defaultRenderer === "dagre-wrapper"), "detector"), Gue = /* @__PURE__ */ w(async () => {
51109
- const { diagram: e } = await import("./stateDiagram-v2-4FDKWEC3-E5a40kZz.js");
51109
+ const { diagram: e } = await import("./stateDiagram-v2-4FDKWEC3-DZ6_hPx3.js");
51110
51110
  return { id: uB, diagram: e };
51111
51111
  }, "loader"), Kue = {
51112
51112
  id: uB,
51113
51113
  detector: jue,
51114
51114
  loader: Gue
51115
51115
  }, Yue = Kue, dB = "journey", Xue = /* @__PURE__ */ w((e) => /^\s*journey/.test(e), "detector"), Zue = /* @__PURE__ */ w(async () => {
51116
- const { diagram: e } = await import("./journeyDiagram-XKPGCS4Q-BT3WQmRa.js");
51116
+ const { diagram: e } = await import("./journeyDiagram-XKPGCS4Q-CNZRK4ng.js");
51117
51117
  return { id: dB, diagram: e };
51118
51118
  }, "loader"), Que = {
51119
51119
  id: dB,
@@ -51154,70 +51154,70 @@ var YF = "c4", Hce = /* @__PURE__ */ w((e) => /^\s*C4Context|C4Container|C4Compo
51154
51154
  /^\s*flowchart-elk/.test(e) || // If a flowchart/graph diagram has their default renderer set to elk
51155
51155
  /^\s*(flowchart|graph)/.test(e) && t?.flowchart?.defaultRenderer === "elk" ? (t.layout = "elk", !0) : !1
51156
51156
  ), "detector"), ade = /* @__PURE__ */ w(async () => {
51157
- const { diagram: e } = await import("./flowDiagram-NV44I4VS-DVAeihFU.js");
51157
+ const { diagram: e } = await import("./flowDiagram-NV44I4VS-lzqrgi2-.js");
51158
51158
  return { id: pB, diagram: e };
51159
51159
  }, "loader"), sde = {
51160
51160
  id: pB,
51161
51161
  detector: ide,
51162
51162
  loader: ade
51163
51163
  }, ode = sde, fB = "timeline", lde = /* @__PURE__ */ w((e) => /^\s*timeline/.test(e), "detector"), cde = /* @__PURE__ */ w(async () => {
51164
- const { diagram: e } = await import("./timeline-definition-IT6M3QCI-BCFa3ZrF.js");
51164
+ const { diagram: e } = await import("./timeline-definition-IT6M3QCI-sxhKRCeY.js");
51165
51165
  return { id: fB, diagram: e };
51166
51166
  }, "loader"), ude = {
51167
51167
  id: fB,
51168
51168
  detector: lde,
51169
51169
  loader: cde
51170
51170
  }, dde = ude, mB = "mindmap", hde = /* @__PURE__ */ w((e) => /^\s*mindmap/.test(e), "detector"), pde = /* @__PURE__ */ w(async () => {
51171
- const { diagram: e } = await import("./mindmap-definition-VGOIOE7T-BD-DdVQV.js");
51171
+ const { diagram: e } = await import("./mindmap-definition-VGOIOE7T-BG1ZbSXN.js");
51172
51172
  return { id: mB, diagram: e };
51173
51173
  }, "loader"), fde = {
51174
51174
  id: mB,
51175
51175
  detector: hde,
51176
51176
  loader: pde
51177
51177
  }, mde = fde, gB = "kanban", gde = /* @__PURE__ */ w((e) => /^\s*kanban/.test(e), "detector"), bde = /* @__PURE__ */ w(async () => {
51178
- const { diagram: e } = await import("./kanban-definition-3W4ZIXB7-CiJoVHr_.js");
51178
+ const { diagram: e } = await import("./kanban-definition-3W4ZIXB7-DVYPrMkR.js");
51179
51179
  return { id: gB, diagram: e };
51180
51180
  }, "loader"), yde = {
51181
51181
  id: gB,
51182
51182
  detector: gde,
51183
51183
  loader: bde
51184
51184
  }, vde = yde, bB = "sankey", xde = /* @__PURE__ */ w((e) => /^\s*sankey(-beta)?/.test(e), "detector"), wde = /* @__PURE__ */ w(async () => {
51185
- const { diagram: e } = await import("./sankeyDiagram-TZEHDZUN-iAFyjtkY.js");
51185
+ const { diagram: e } = await import("./sankeyDiagram-TZEHDZUN-vRgejrr7.js");
51186
51186
  return { id: bB, diagram: e };
51187
51187
  }, "loader"), Ede = {
51188
51188
  id: bB,
51189
51189
  detector: xde,
51190
51190
  loader: wde
51191
51191
  }, _de = Ede, yB = "packet", kde = /* @__PURE__ */ w((e) => /^\s*packet(-beta)?/.test(e), "detector"), Cde = /* @__PURE__ */ w(async () => {
51192
- const { diagram: e } = await import("./diagram-S2PKOQOG-BAp1IJGB.js");
51192
+ const { diagram: e } = await import("./diagram-S2PKOQOG-vRL82AgB.js");
51193
51193
  return { id: yB, diagram: e };
51194
51194
  }, "loader"), Sde = {
51195
51195
  id: yB,
51196
51196
  detector: kde,
51197
51197
  loader: Cde
51198
51198
  }, vB = "radar", Tde = /* @__PURE__ */ w((e) => /^\s*radar-beta/.test(e), "detector"), Ade = /* @__PURE__ */ w(async () => {
51199
- const { diagram: e } = await import("./diagram-QEK2KX5R-BTpahbEj.js");
51199
+ const { diagram: e } = await import("./diagram-QEK2KX5R-DrEPfuxO.js");
51200
51200
  return { id: vB, diagram: e };
51201
51201
  }, "loader"), Nde = {
51202
51202
  id: vB,
51203
51203
  detector: Tde,
51204
51204
  loader: Ade
51205
51205
  }, xB = "block", Dde = /* @__PURE__ */ w((e) => /^\s*block(-beta)?/.test(e), "detector"), Lde = /* @__PURE__ */ w(async () => {
51206
- const { diagram: e } = await import("./blockDiagram-VD42YOAC-Cvqa8noV.js");
51206
+ const { diagram: e } = await import("./blockDiagram-VD42YOAC-BJR0FCnk.js");
51207
51207
  return { id: xB, diagram: e };
51208
51208
  }, "loader"), Ide = {
51209
51209
  id: xB,
51210
51210
  detector: Dde,
51211
51211
  loader: Lde
51212
51212
  }, Mde = Ide, wB = "architecture", Rde = /* @__PURE__ */ w((e) => /^\s*architecture/.test(e), "detector"), Pde = /* @__PURE__ */ w(async () => {
51213
- const { diagram: e } = await import("./architectureDiagram-VXUJARFQ-DlDB9-tN.js");
51213
+ const { diagram: e } = await import("./architectureDiagram-VXUJARFQ-B2kiuB6l.js");
51214
51214
  return { id: wB, diagram: e };
51215
51215
  }, "loader"), Ode = {
51216
51216
  id: wB,
51217
51217
  detector: Rde,
51218
51218
  loader: Pde
51219
51219
  }, Fde = Ode, EB = "treemap", Bde = /* @__PURE__ */ w((e) => /^\s*treemap/.test(e), "detector"), $de = /* @__PURE__ */ w(async () => {
51220
- const { diagram: e } = await import("./diagram-PSM6KHXK-CXpX_sN2.js");
51220
+ const { diagram: e } = await import("./diagram-PSM6KHXK-reYm7V8l.js");
51221
51221
  return { id: EB, diagram: e };
51222
51222
  }, "loader"), Ude = {
51223
51223
  id: EB,
@@ -61979,7 +61979,7 @@ function lAe() {
61979
61979
  ] });
61980
61980
  }
61981
61981
  function cAe() {
61982
- return /* @__PURE__ */ A("div", { className: "flex h-[calc(100vh-4rem)]", children: [
61982
+ return /* @__PURE__ */ A("div", { className: "flex h-[calc(100dvh-4rem)]", children: [
61983
61983
  /* @__PURE__ */ A("div", { className: "w-64 border-r bg-muted/10 flex-shrink-0 flex flex-col", children: [
61984
61984
  /* @__PURE__ */ f("div", { className: "p-3 border-b", children: /* @__PURE__ */ f(X, { className: "h-9 w-full" }) }),
61985
61985
  /* @__PURE__ */ f("div", { className: "flex-1 p-2 space-y-1", children: [...Array(8)].map((e, t) => /* @__PURE__ */ f(X, { className: "h-9 w-full" }, t)) })
@@ -62017,7 +62017,7 @@ function cAe() {
62017
62017
  ] });
62018
62018
  }
62019
62019
  function uAe() {
62020
- return /* @__PURE__ */ f("div", { className: "mx-auto w-full p-6 h-[calc(100vh-7rem)] max-w-7xl", children: /* @__PURE__ */ A("div", { className: "flex h-full flex-col gap-4", children: [
62020
+ return /* @__PURE__ */ f("div", { className: "mx-auto w-full p-6 h-[calc(100dvh-7rem)] max-w-7xl", children: /* @__PURE__ */ A("div", { className: "flex h-full flex-col gap-4", children: [
62021
62021
  /* @__PURE__ */ A("div", { className: "space-y-2", children: [
62022
62022
  /* @__PURE__ */ f(X, { className: "h-8 w-48" }),
62023
62023
  /* @__PURE__ */ f(X, { className: "h-4 w-96" })
@@ -62116,7 +62116,7 @@ function pAe() {
62116
62116
  ] });
62117
62117
  }
62118
62118
  function fAe() {
62119
- return /* @__PURE__ */ A("div", { className: "flex h-[calc(100vh-3.5rem)] flex-col bg-background", children: [
62119
+ return /* @__PURE__ */ A("div", { className: "flex h-[calc(100dvh-3.5rem)] flex-col bg-background", children: [
62120
62120
  /* @__PURE__ */ f("div", { className: "border-b p-6 flex-none", children: /* @__PURE__ */ A("div", { className: "flex items-center gap-3", children: [
62121
62121
  /* @__PURE__ */ f(X, { className: "h-8 w-8 rounded" }),
62122
62122
  /* @__PURE__ */ A("div", { className: "space-y-2", children: [
@@ -66265,7 +66265,7 @@ const vve = { unknownError: "Unknown error" }, xve = { home: "Home", specs: "Spe
66265
66265
 
66266
66266
  {specs}`, promptPreview: "Effective prompt preview", promptPreviewEmpty: "Attach specs or enter a custom prompt to preview what will be sent.", attachSpec: "@ spec", noSpec: "No spec", tokens: "Tokens", cost: "Estimated cost", costUnknown: "Unknown", costApprox: "≈${{value}}", unknownTime: "Unknown", autoScroll: "Auto-scroll", logs: "Logs", plan: "Plan", protocolAcp: "ACP", protocolCli: "CLI", activeTool: "Tool: {{tool}}", planProgress: "Plan: {{completed}}/{{total}}", completed: "Completed" }, modes: { autonomous: "Autonomous", guided: "Guided" }, runners: { claude: "Claude", copilot: "GitHub Copilot", codex: "Codex", opencode: "OpenCode", aider: "Aider", cline: "Cline", gemini: "Gemini", cursor: "Cursor", windsurf: "Windsurf", droid: "Droid", kiro: "Kiro", kimi: "Kimi", qodo: "Qodo", amp: "Amp", trae: "Trae", "qwen-code": "Qwen Code", goose: "Goose", openhands: "OpenHands", continue: "Continue", crush: "Crush", roo: "Roo", codebuddy: "CodeBuddy", kilo: "Kilo", augment: "Augment", antigravity: "Antigravity" }, select: { placeholder: "Select...", search: "Search...", empty: "No results found." }, export: { fallbackName: "logs" }, dialogs: { createTitle: "Create AI Session", createDescription: "Choose the runner and mode, then start the session.", logsTitle: "Session Logs" }, errors: { load: "Failed to load sessions.", create: "Failed to create session.", noProjectPath: "Project path missing for this workspace." }, permissions: { allow_once: "Allow once", allow_always: "Always allow", reject: "Reject", responding: "Sending response..." } }, Sve = { title: "Sessions", description: "Monitor AI coding sessions across specs.", count: "{{count}} sessions", filters: { search: "Search by session, spec, or runner", status: "Status", runner: "Runner", mode: "Mode", spec: "Spec" }, sort: { startedDesc: "Started (newest)", startedAsc: "Started (oldest)", durationDesc: "Duration (longest)", status: "Status" }, buttons: { loadMore: "Load more", refresh: "Refresh list" }, state: { errorTitle: "Unable to load sessions", emptyTitle: "No sessions yet", emptyDescription: "Create a new session to start tracking AI runs.", noResultsTitle: "No matching sessions", noResultsDescription: "Try adjusting your filters or search." }, groups: { active: "Active", today: "Today", yesterday: "Yesterday", older: "Older" }, labels: { noSpecs: "No specs" } }, Tve = { title: "Session {{id}}", description: "Live logs and session details.", eventsTitle: "Session Timeline", eventsDescription: "Lifecycle events captured for this session.", eventsEmpty: "No events recorded yet.", archiveSuccess: "Archived to {{path}}", archiveError: "Failed to archive session logs.", logsTitle: "Live Logs", logsDescription: "Streaming output from this session.", filters: { search: "Search logs", autoScroll: "Auto-scroll", acp: { messages: "Messages", thoughts: "Thoughts", tools: "Tool Calls", plan: "Plan" } }, displayMode: { messages: "Messages", verbose: "Verbose" }, actions: { download: "Download logs as file", copyLogs: "Copy logs to clipboard" }, state: { notFoundTitle: "Session unavailable", notFoundDescription: "The session could not be loaded." } }, Ave = { title: "LeanSpec AI Chat", subtitle: "Manage specs conversationally without leaving the browser.", modelLabel: "Model", clear: "Clear", empty: "Ask me to list, create, update, or validate specs.", placeholder: "Ask LeanSpec to manage your specs...", helper: "Tips: “List all specs”, “Create a spec for rate limiting”, “Mark 082 complete”.", send: "Send", thinking: "Thinking...", error: "An error occurred. Please try again.", modelError: "Model error", searchModels: "Search models...", noModelsFound: "No models found", noKey: "No Key", providersSummary: "{{total}} providers, {{configured}} configured", availableProvidersSummary: "{{count}} available providers", modelsLoadError: "Failed to load models", autoTitle: { generating: "Generating title..." }, newChat: "New Chat", expandSidebar: "Expand sidebar", collapseSidebar: "Collapse sidebar", searchPlaceholder: "Search conversations...", history: { searchPlaceholder: "Search history...", empty: "No conversations found" }, shortcuts: { newChat: "New Chat (Cmd+Shift+N)", history: "History (Cmd+Shift+H)", closeSidebar: "Close (Cmd+Shift+I)" }, emptyState: { prompt: "Select a conversation or start a new one." }, noSearchResults: "No conversations found", noConversations: "No conversations yet", startConversation: "Click 'New Chat' to start a conversation", noMessagesYet: "No messages yet", modelSelector: { selectPlaceholder: "Select model...", badges: { tool: "Tool", reasoning: "Reasoning", vision: "Vision" }, metrics: { contextWindow: "Context Window", maxOutput: "Max Output", inputCost: "Input Cost", outputCost: "Output Cost", vision: "Vision" }, hiddenItem: "Hidden" }, today: "Today", yesterday: "Yesterday", previous7Days: "Previous 7 Days", older: "Older", storageUsage: "Storage used: {{size}}", storageLocation: "Location: {{path}}", storageUnavailable: "Storage info unavailable", storageUnits: { zero: "0 B", byte: "B", kilobyte: "KB", megabyte: "MB", gigabyte: "GB", terabyte: "TB" }, deleteConversation: "Delete conversation", renameConversation: "Rename conversation", disabledTitle: "AI chat is disabled", disabledDescription: "Set VITE_ENABLE_AI=true to enable the chat experience.", toggleModelSettings: "Toggle model settings", openChat: "Open AI Chat", openFullChat: "Full Chat", attachSpec: "@ spec", specContextPrefix: "Use the following specs as context:", toolExecution: { status: { failed: "Failed", completed: "Completed", running: "Running...", success: "Success", error: "Error" }, labels: { input: "Input", output: "Output", error: "Error" }, actions: { showAll: "Show all", showLess: "Show less", copy: "Copy" }, tabs: { input: "Input", output: "Output" }, viewToggle: { ui: "UI", json: "JSON" } }, settings: { title: "Chat Configuration", description: "Configure AI providers, models, and chat behavior", provider: "Provider", model: "Model", providers: "AI Providers", providersDescription: "Manage OpenAI, Anthropic, Deepseek, and other AI providers", models: "Models", addProvider: "Add Provider", editProvider: "Edit Provider", addModel: "Add Model", editModel: "Edit Model", default: "Default", keyConfigured: "API Key Set", noKey: "No API Key", defaults: "Default Settings", defaultsDescription: "Configure default provider, model, and behavior", defaultProvider: "Default Provider", defaultModel: "Default Model", maxSteps: "Max Steps", maxStepsHelp: "Maximum number of tool execution steps (1-50)", confirmDeleteProvider: "Are you sure you want to delete this provider?", confirmDeleteModel: "Are you sure you want to delete this model?", providerDialogDescription: "Configure provider details and API credentials", modelDialogDescription: "Add or edit model information", providerId: "Provider ID", providerIdHelp: "Lowercase identifier (e.g., openai, anthropic)", providerName: "Display Name", baseURL: "Base URL", baseURLHelp: "Optional custom API endpoint (for OpenRouter, etc.)", apiKey: "API Key", apiKeyHelp: "Use ${ENV_VAR} for environment variables or paste directly", modelId: "Model ID", modelName: "Display Name", maxTokens: "Max Tokens", maxTokensHelp: "Context window size (optional)", deleteProviderTitle: "Delete Provider", deleteModelTitle: "Delete Model", placeholders: { providerId: "openai", providerName: "OpenAI", baseUrl: "https://api.openai.com/v1", apiKeyMasked: "••••••••", apiKeyEnv: "${OPENAI_API_KEY}", modelId: "gpt-4o", modelName: "GPT-4o", maxTokens: "128000" }, errors: { loadConfig: "Failed to load config", saveConfig: "Failed to save config", loadConfiguration: "Failed to load configuration", idRequired: "ID is required", idExists: "This ID already exists", idInvalid: "ID must be lowercase letters, numbers, and hyphens only", nameRequired: "Name is required", urlInvalid: "URL must start with http:// or https://", modelIdRequired: "Model ID is required", modelIdExists: "This model ID already exists", modelNameRequired: "Model name is required", maxTokensInvalid: "Max tokens must be a number" } } }, Nve = { spec: "Spec", specs: "Specs", specification: "Specification", specifications: "Specifications", title: "Title", description: "Description", tags: "Tags", createdAt: "Created", updatedAt: "Updated", completedAt: "Completed" }, Dve = { hierarchy: { umbrella: "Umbrella Spec", inParent: "In: {{parent}}" } }, Lve = { title: "Relationships", description: "Manage hierarchy and dependencies for this spec.", button: "Relationships", sections: { hierarchy: "Hierarchy", dependencies: "Dependencies" }, parent: "Parent", children: "Children", dependsOn: "Depends On", requiredBy: "Required By", actions: { setParent: "Set parent", addChild: "Add child", addDependsOn: "Add dependency", addRequiredBy: "Add dependent", viewHierarchy: "View in hierarchy", viewDependencies: "View dependency graph" }, empty: { parent: "No parent set", children: "No children", dependsOn: "No dependencies", requiredBy: "No dependents", noSpecs: "No specs found" }, confirmRemove: "Remove relationship to {{label}}?" }, Ive = { title: "Settings", description: "Manage your preferences and configuration", collapseSidebar: "Collapse sidebar", expandSidebar: "Expand sidebar", tabs: { models: "Models", runners: "Runners", appearance: "Appearance" }, ai: { providers: "AI Providers", providersDescription: "Configure API keys for AI providers from the models.dev registry", searchPlaceholder: "Search providers or models...", models: "Models", addProvider: "Add Provider", editProvider: "Edit Provider", addModel: "Add Model", editModel: "Edit Model", default: "Default", keyConfigured: "Configured", noKey: "No Key", builtIn: "Built-in", configure: "Configure", setUp: "Set Up", setDefault: "Set default", discoverModels: "Discover models", saveAndSetDefault: "Save & Set Default", defaults: "Default Settings", defaultsDescription: "Configure default provider, model, and behavior", defaultProvider: "Default Provider", defaultModel: "Default Model", selectProvider: "Select a provider", selectModel: "Select a model", maxSteps: "Max Steps", maxStepsHelp: "Maximum number of tool execution steps (1-50)", providerId: "Provider ID", providerIdHelp: "Lowercase identifier (e.g., openai, anthropic)", providerName: "Display Name", baseURL: "Base URL", baseURLHelp: "Optional custom API endpoint (for OpenRouter, etc.)", apiKey: "API Key", apiKeyHelp: "Use ${ENV_VAR} for environment variables or paste directly", modelId: "Model ID", modelName: "Display Name", maxTokens: "Max Tokens", maxTokensHelp: "Context window size (optional)", providerDialogDescription: "Configure provider details and API credentials", modelDialogDescription: "Add or edit model information", refreshRegistry: "Refresh", configuredProviders: "Configured Providers", availableProviders: "Available Providers", agenticModels: "agentic models", total: "total", updateKey: "Update Key", configureKey: "Configure", hideModels: "Hide models", showModels: "Show models", moreModels: "more models", modelsAvailable: "models available", capabilities: { toolCall: "Tool calling", reasoning: "Reasoning", vision: "Vision" }, customProviders: "Custom Providers", customProvidersDescription: "Add providers not in the models.dev registry", addCustomProvider: "Add Custom", noCustomProviders: "No custom providers configured", custom: "Custom", configureApiKey: "Configure API Key", clearApiKey: "Clear API key", configureModels: "Configure {{provider}} Models", configureModelsDescription: "Select which models to enable for this provider", apiKeyDialogDescription: "Enter your API key for {{provider}}", azureApiKeyDialogDescription: "Configure Azure OpenAI with your resource name and API key", azureResourceName: "Azure Resource Name", azureResourceNameHelp: "The name of your Azure OpenAI resource (e.g., 'my-openai-resource')", apiKeyStorageNote: "API key will be stored locally in your config file", configureProvider: "Configure {{provider}}", configureProviderDescription: "Configure provider details and model access", restrictModels: "Restrict available models", allModelsEnabled: "All models enabled", allModelsEnabledDesc: "All models from this provider are currently available in the chat.", enableRestriction: "Enable restriction", selectedOf: "selected of", selectAll: "Select all", deselectAll: "Deselect all", restricted: "Restricted", outOfTotal: "of {{total}} total", placeholders: { azureResourceName: "my-openai-resource", apiKeyEnv: "{{provider}}_API_KEY", apiKeyPrefix: "sk-...", customProviderId: "my-provider", customProviderName: "My Provider", customProviderBaseUrl: "https://api.example.com/v1" }, editCustomProvider: "Edit Custom Provider", customProviderDialogDescription: "Configure a custom provider with API endpoint and models", leaveEmptyToKeep: "Leave empty to keep existing", noModelsAdded: "No models added yet", confirmDeleteProvider: "Are you sure you want to delete this provider?", validation: { revalidateAll: "Re-validate all", checking: "Checking", valid: "Valid", invalid: "Invalid", lastChecked: "Last checked: {{time}}" }, details: { title: "Details", providerId: "Provider ID", baseUrl: "Base URL", modelCount: "{{count}} models ({{agentic}} agentic)" }, sort: { name: "Name", models: "Model Count", configured: "Configured First" }, modelSort: { sortBy: "Sort by", name: "Name", tokens: "Tokens" }, filters: { status: "Status", all: "All", configured: "Configured", unconfigured: "Not Configured", showConfiguredOnly: "Show configured only", showUnconfiguredOnly: "Show unconfigured only" }, filteredCount: "{{filtered}} of {{total}} providers", toasts: { defaultProvider: "Default provider set to {{provider}}", apiKeySaved: "API key saved", apiKeyCleared: "API key cleared", modelsSaved: "Model preferences saved" }, errors: { loadConfig: "Failed to load config", refreshFailed: "Failed to refresh", setApiKeyFailed: "Failed to set API key", saveConfigFailed: "Failed to save config", saveFailed: "Failed to save", idRequired: "ID is required", idExists: "This ID already exists", idInvalid: "ID must be lowercase letters, numbers, and hyphens only", nameRequired: "Name is required", urlInvalid: "URL must start with http:// or https://", modelIdRequired: "Model ID is required", modelIdExists: "This model ID already exists", modelNameRequired: "Model name is required", maxTokensInvalid: "Max tokens must be a number", apiKeyRequired: "API key is required", azureResourceNameRequired: "Azure resource name is required", modelsRequired: "At least one model is required" } }, runners: { title: "AI Runners", description: "Manage local runner commands used for AI sessions", addRunner: "Add Runner", editRunner: "Edit Runner", default: "Default", available: "Available", unavailable: "Not found", ideOnly: "IDE-only", ideOnlyCommand: "IDE-only (not runnable from CLI)", setDefault: "Set default", empty: "No runners configured yet.", dialogDescription: "Configure runner command, args, and environment overrides", confirmDelete: 'Delete runner "{{id}}"?', validation: { revalidateAll: "Re-validate all", checking: "Checking", valid: "Valid", invalid: "Invalid", lastChecked: "Last checked: {{time}}" }, details: { title: "Details", id: "Runner ID", source: "Source: {{source}}", version: "Version", notFound: "Command not found in PATH" }, toasts: { defaultRunner: "Default runner set to {{runner}}" }, fields: { id: "Runner ID", idHelp: "Lowercase identifier (e.g., claude, copilot)", name: "Display Name", command: "Command", args: "Arguments", argsHelp: "One argument per line", defaultModel: "Default Model", modelProviders: "Model Providers", modelProvidersHelp: "One models.dev provider ID per line (e.g. openai, anthropic, google)", env: "Environment Variables", envHelp: "One KEY=VALUE per line" }, placeholders: { id: "claude", name: "Claude Code", command: "claude", args: `--dangerously-skip-permissions
66267
66267
  --print`, defaultModel: "claude-3-7-sonnet", searchOrTypeModel: "Search or type a model...", modelProviders: `anthropic
66268
- openai`, env: "ANTHROPIC_API_KEY=${ANTHROPIC_API_KEY}" }, errors: { noProject: "Project path is required to manage runners.", loadFailed: "Failed to load runners.", saveFailed: "Failed to save runner.", deleteFailed: "Failed to delete runner.", validateFailed: "Failed to validate runner.", defaultFailed: "Failed to set default runner.", idRequired: "ID is required", idExists: "This ID already exists", idInvalid: "ID must be lowercase letters, numbers, and hyphens only", commandRequired: "Command is required", envInvalid: "Each environment line must be KEY=VALUE" }, customModel: "Custom", useCustomModel: 'Use "{{model}}"', clearModel: "Clear model", noModelsFound: "Type a model name", searchPlaceholder: "Search runners...", noResults: "No runners match your filters", sort: { name: "Name", available: "Available First" }, filters: { status: "Status", showUnavailable: "Show unavailable", showIdeRunners: "Show IDE runners", source: "Source", allSources: "All Sources", builtin: "Built-in", custom: "Custom" }, filteredCount: "{{filtered}} of {{total}} runners" }, appearance: { theme: "Theme", themeDescription: "Choose how LeanSpec looks to you", light: "Light", lightDescription: "Classic light theme", dark: "Dark", darkDescription: "Easy on the eyes", system: "System", systemDescription: "Match system preference", displayMode: "Display Mode", displayModeDescription: "Choose the layout width", normal: "Normal", normalDescription: "Centered with max width", wide: "Wide", wideDescription: "Full width content", language: "Language", languageDescription: "Choose your preferred language", selectLanguage: "Select Language" } }, Mve = { light: "Light", dark: "Dark", system: "System", toggleTheme: "Toggle theme" }, Rve = { toggle: "Toggle layout mode", normal: "Normal", wide: "Wide" }, Pve = { english: "English", chinese: "中文", changeLanguage: "Change language" }, Ove = { project: "Project", projects: "Projects", switchProject: "Switch Project", createProject: "Create Project", manageProjects: "Manage Projects", selectProject: "Select Project", description: "Manage your LeanSpec workspaces.", colorLabel: "Color", validationFailed: "Validation failed", newProject: "New Project", backTo: "Back to {{projectName}}", rename: "Rename", projectColor: "Project Color", favorite: "Favorite", unfavorite: "Unfavorite", validatePath: "Validate Path", specs: "Specs", completion: "Completion", local: "Local", noProjectsFound: "No projects found", getStarted: "Get started by creating your first LeanSpec project.", searchPlaceholder: "Search projects...", errors: { load: "Failed to load projects", switch: "Failed to switch project", noProjectSelected: "No project selected. Please select a project first." } }, Fve = { title: "Projects", machineDescription: "Projects synced from {{machine}}.", description: "Manage your LeanSpec projects and workspaces." }, Bve = { title: "Machines", description: "Manage connected Sync Bridge devices.", available: "Available Machines", empty: "No machines connected yet.", switcherLabel: "Select machine", noSelection: "Select a machine", projectsCount: "{{count}} projects", requestExecution: "Request execution", revoke: "Revoke", unavailable: "Machine unavailable. Connect the bridge to edit metadata.", status: { online: "Online", offline: "Offline" } }, $ve = { button: "Quick search...", placeholder: "Search specs by title, number, or tags...", recentSearches: "Recent Searches", filterHeading: "Filter by Tag", filterPrefix: "Filter by:", open: "Open quick search", noResults: "No results found", shortcut: { modifier: "⌘", key: "K" } }, Uve = { switching: "Switching...", placeholder: "Select project...", searchPlaceholder: "Search projects...", noProject: "No project found." }, zve = { title: "Keyboard Shortcuts", items: { dashboard: "Go to dashboard (home)", specs: "Go to specs list", stats: "Go to stats", dependencies: "Go to dependencies", settings: "Go to settings", search: "Focus search", quickSearch: "Open quick search", toggleChat: "Toggle AI chat", toggleChatSidebar: "Toggle AI chat sidebar", toggleSessionsPopover: "Toggle sessions popover", newSession: "Start new session", focusChatInput: "Focus chat input", newConversation: "New conversation", viewHistory: "View history", closeChatSidebar: "Close chat sidebar" } }, Hve = { title: "Table of Contents", open: "Open table of contents", onThisPage: "On this page" }, Vve = { multiSectionTitle: "This spec has multiple sections", multiSectionDescription: "Use the tabs below to navigate between the main overview and detailed sections." }, Wve = { pickColor: "Pick color", selectColor: "Select color {{color}}" }, qve = { title: "Add Project", descriptionPicker: "Browse and select the project directory.", descriptionManual: "Enter the absolute path to your local project directory.", enterManually: "Enter path manually", pathLabel: "Project Path", pathPlaceholder: "/path/to/your/project", pathHelp: "Select the root directory of your project.", pathRequired: "Project path is required", browseFolders: "Browse folders", action: "Add Project", adding: "Adding...", toastSuccess: "Project added successfully", toastError: "Failed to add project" }, jve = { action: "Select This Folder", parent: "Go to parent directory", rootAction: "Go to root", root: "Root", empty: "Empty directory", error: "Failed to list directory" }, Gve = { title: "All Specs", searchPlaceholder: "Search specs...", empty: "No specs found", collapse: "Collapse sidebar", expand: "Expand sidebar" }, Kve = { searchPlaceholder: "Search sessions...", noResults: "No sessions found", collapse: "Collapse sidebar", expand: "Expand sidebar" }, Yve = { title: "Specifications", searchPlaceholder: "Search specs...", clearSearch: "Clear search", noResults: "No specs found", filtersLabel: "Filters", toggleFilters: { show: "Show filters", hide: "Hide filters" }, clearFilters: "Clear", status: "Status", priority: "Priority", tags: "Tags", selected: "selected", select: { status: { label: "Status", all: "All Status" }, priority: { label: "Priority", all: "All Priority" }, tag: { label: "Tag", all: "All Tags" } }, badges: { subSpecs: "+{{count}} files" }, switchToTree: "Switch to Tree", switchToList: "Switch to List", showArchived: "Show archived", hideArchived: "Hide archived", sort: { label: "Sort By", newest: "Newest First", oldest: "Oldest First", updated: "Recently Updated", titleAsc: "Title (A-Z)", titleDesc: "Title (Z-A)", priorityHigh: "Priority (High-Low)", priorityLow: "Priority (Low-High)" }, expandAll: "Expand", collapseAll: "Collapse", searchTags: "Search tags...", noTagsFound: "No tags found" }, Xve = { title: "Specifications", description: "Browse and organize all specifications in your project.", count: "{{count}} specs", views: { list: "List", board: "Board", listTooltip: "List view", boardTooltip: "Board view" }, wideMode: { enter: "Enter wide mode", exit: "Exit wide mode" }, searchPlaceholder: "Search titles, content, tags...", searchHint: "Searches across spec titles, content, and tags", filters: { status: "Status", priority: "Priority", sort: "Sort by", statusAll: "All Status", priorityAll: "All Priority", groupByParent: "Group by Parent", withErrors: "With Errors", showArchived: "Show archived", hideArchived: "Hide archived", settings: "Settings", filteredCount: "{{filtered}} of {{total}} specs", showingAll: "Showing all {{count}} sessions", showingFiltered: "Showing {{count}} of {{total}} sessions", sortOptions: { "id-desc": "Newest First", "id-asc": "Oldest First", "updated-desc": "Recently Updated", "title-asc": "Title (A-Z)", "priority-desc": "Priority (Critical → Low)", "priority-asc": "Priority (Low → Critical)" } }, metadata: { updated: "Updated {{time}}", files: "+{{count}} files", dependencies: "{{count}} deps", none: "No metadata" }, list: { empty: "No specs found" }, board: { dropHere: "Drop here to move specs", updating: "Updating...", archivedCollapsed: "Archived" }, toasts: { statusUpdated: "Moved {{spec}} to {{status}}", statusError: "Unable to update status. Please try again." }, state: { errorTitle: "Unable to load specs", errorDescription: "Please try again or refresh your project.", noSpecsTitle: "No specs yet", noSpecsDescription: "We could not find any specs for this project. Add a spec in your LeanSpec workspace, then refresh to see it here.", noFiltersTitle: "No specs match your filters", noFiltersDescription: "Try clearing filters or adjusting your search to see more specs." }, buttons: { refreshList: "Refresh list", reloadData: "Reload data" } }, Zve = { toggleSidebar: "Toggle specs list", codeBlock: { label: "Code", copy: "Copy code", copyToClipboard: "Copy to clipboard" }, table: { copyTsv: "Copy as TSV (Excel)", exportCsv: "Export as CSV", defaultFileName: "table-export.csv" }, metadata: { created: "Created", updated: "Updated", name: "Name", assignee: "Assignee", notAvailable: "Not available", source: "Source", viewOnGitHub: "View on GitHub" }, buttons: { viewTimeline: "View Timeline", viewDependencies: "View Dependencies", viewHierarchy: "View Hierarchy", focus: "Focus", exitFocus: "Exit focus mode" }, dialogs: { timelineTitle: "Spec Timeline", timelineDescription: "Created, updated, and completion milestones.", dependenciesTitle: "Dependency Graph", dependenciesDescription: "Precedence requirements and connected specs rendered with automatic layout.", dependenciesLink: "View in full dependencies page", hierarchyTitle: "Spec Hierarchy", hierarchyDescription: "Parent and child specification relationships." }, hierarchy: { parent: "Parent Spec", current: "Current Spec", children: "Child Specs", noRelationships: "This spec has no parent or child relationships." }, tabs: { overview: "Overview" }, state: { loading: "Loading...", error: "Error loading spec", unavailableTitle: "Spec unavailable", unavailableDescription: "This spec could not be found. It may have been moved or deleted." }, dependencies: { dependsOn: "Depends on", requiredBy: "Required by" }, children: "Child Specs", links: { backToSpecs: "Back to specs", reportIssue: "Report issue" } }, Qve = { title: "Project Statistics", description: "Comprehensive metrics and insights", tokenDistribution: { title: "Token Distribution", empty: "No token data available yet.", unknown: "{{count}} specs missing token data", buckets: { optimal: "Optimal", good: "Good", warning: "Warning", critical: "Critical" } }, cards: { total: { title: "Total Specs", subtitle: "All specifications" }, completed: { title: "Completed", subtitle: "completion rate" }, inProgress: { title: "In Progress", subtitle: "Active work" }, planned: { title: "Planned", subtitle: "Upcoming work" } }, charts: { status: { title: "Status Distribution", description: "Breakdown of specs by status" }, priority: { title: "Priority Distribution", description: "Breakdown of specs by priority" }, creation: { title: "Creation Trend", description: "Specs created over time" }, topTags: { title: "Top Tags", description: "Most frequently used tags" }, label: "{{name}}: {{value}}" }, state: { errorTitle: "Unable to load statistics", errorDescription: "Please try again or refresh your project.", unknownError: "Unknown error" } }, Jve = { title: "Dashboard", subtitle: "Project overview and recent activity", subtitleWithProject: "{{projectName}} — overview and recent activity", cards: { total: "Total Specs", planned: "Planned", inProgress: "In Progress", completed: "Completed", completionRate: "{{rate}}% completion rate" }, recentlyAdded: "Recently Added", plannedSection: "Planned ({{count}})", inProgressSection: "In Progress ({{count}})", noPlanned: "No planned specs", noInProgress: "No specs in progress", recentActivity: "Recent Activity", quickActions: "Quick Actions", viewAllSpecs: "View All Specs", viewStats: "View Stats", actionUpdated: "updated", state: { errorTitle: "Unable to load dashboard", errorDescription: "Please refresh or try again." } }, exe = { title: "Project Context", description: "View project-level context files that inform AI agents and development workflows", copyAll: "Copy All", copyAllSuccess: "Copied!", searchPlaceholder: "Search within context files...", searchNoMatches: 'No matches found for "{{query}}"', summary: { totalTokens: "{{formattedCount}} total tokens", contextBudget: "Context budget for AI agents" }, badges: { matchesSingular: "{{count}} match", matchesPlural: "{{count}} matches", matchesFoundSingular: "{{count}} match found", matchesFoundPlural: "{{count}} matches found", filesSingular: "{{count}} file", filesPlural: "{{count}} files", filesFiltered: "{{count}}/{{total}} files", tokens: "{{formattedCount}} tokens" }, sections: { agents: { title: "Agent Instructions", description: "System prompts and guidelines for AI agents", empty: "No agent instructions found", suggestion: "Create an AGENTS.md file in your project root" }, config: { title: "Configuration", description: "LeanSpec project configuration and settings", empty: "No configuration found", suggestion: "Run 'lean-spec init' to create a config file" }, docs: { title: "Project Documentation", description: "README, contributing guidelines, and changelog", empty: "No project docs found", suggestion: "Create a README.md file in your project root" } }, emptyState: { title: "No project context found", description: "This project doesn't have any context files yet. Context files help AI agents understand your project better.", suggestion: "Start by creating AGENTS.md or running 'lean-spec init'" }, search: { noMatchesTitle: "No matches found", noMatchesDescription: "Try a different search term", noFilesDescription: "No files found in this category" }, viewer: { modified: "Modified {{date}}", lines: "{{count}} lines", viewFull: "View full page", openInEditor: "Open in VS Code", copyContent: "Copy content", tokenStatus: { optimal: "Optimal", good: "Good", large: "Large", veryLarge: "Very Large" } }, detail: { back: "Back", openInEditor: "Open in Editor", copy: "Copy", copySuccess: "Copied!", defaultFileType: "text", lines: "{{count}} lines", modified: "Modified {{date}}", size: "{{size}} KB", selectFile: "Select a file to view its content" }, errors: { list: "Failed to load context files", file: "Failed to load file", loadFailed: "Unable to load project context", noProject: "No project selected", noProjectDescription: "Please select or create a project to view its context files." } }, txe = { events: { created: "Created", inProgress: "In Progress", complete: "Complete", archived: "Archived" }, state: { awaiting: "Awaiting start", queued: "Queued", pending: "Pending update" } }, nxe = { clickToEnlarge: "Click to enlarge diagram" }, rxe = { header: { title: "Dependency Map", subtitle: "Explore precedence and connected work", badge: "React Flow DAG" }, badges: { current: "Current Spec", currentSubtitle: "This spec", dependsOn: "Depends On", dependsOnSubtitle: "Must complete first", requiredBy: "Required By", requiredBySubtitle: "Blocked by this spec" }, statusSubtitles: { completed: "Completed", inProgress: "In progress", plannedBlocking: "Must complete first", plannedCanProceed: "Can proceed", archived: "Archived" } }, ixe = { title: "Dependencies", description: "Visualize how specs connect across your project.", header: { title: "Dependency Graph", specTitle: "Dependencies for {{specName}}", allTitle: "All Dependencies", countSummary: "{{specs}} specs, {{relationships}} relationships", summary: { connected: "{{count}} specs with dependencies", standalone: "{{count}} standalone", none: "No dependencies defined" } }, selector: { placeholder: "Select spec to highlight...", filterPlaceholder: "Type to filter...", clearSelection: "Clear selection", empty: "No specs found" }, filters: { showStandalone: "Show Standalone ({{count}})", compact: "Compact", focusMode: "Focus Mode", clear: "Clear", count: "({{count}})" }, view: { graph: "Graph", list: "List" }, state: { loading: "Loading dependencies...", errorTitle: "Unable to load dependencies", errorDescription: "Please check your connection and try again." }, empty: { title: "No dependencies to display", filters: "No specs match the current filters", standaloneHint: 'Enable "Show Standalone" to see specs without dependencies', noDependencies: "No dependencies yet", noDependenciesDescription: "Specs are present but no dependency relationships were found. Add depends_on links to see the graph." }, legend: { dependsOn: "Depends On (arrow shows direction)", instructions: "Click: select • Double-click: open • Drag to rearrange" }, graph: { levelTitle: "Level {{depth}}", levelBadge: "L{{depth}}", instructions: "Click on a node to view spec details. Use mouse wheel to zoom, drag to pan." }, list: { specsTitle: "Specs ({{count}})", relationshipsTitle: "Relationships ({{count}})", noRelationships: "No relationships yet. Add depends_on or required_by references in your specs to visualize them here.", dependsOn: "↓ depends on", requiredBy: "↑ required by" }, actions: { goToSpecs: "Go to specs" }, sidebar: { emptyTitle: "Select a spec", emptyDescription: "Click on a spec to see its dependencies", openSpec: "Open Spec →", dependsOnHeading: "Depends On ({{count}})", requiredByHeading: "Required By ({{count}})", emptyUpstream: "No upstream dependencies", emptyDownstream: "No specs depend on this", depth: { direct: "Direct", level: "L{{depth}}" } } }, axe = { changeStatus: "Change spec status", statusSuccess: "Status updated", statusError: "Failed to update status", draftSkipTitle: "Skip planned stage?", draftSkipDescription: "This spec is still in draft. Move it to Planned before starting work, or skip planning with force.", draftSkipPlanned: "Go to Planned", draftSkipForce: "Skip Anyway", changePriority: "Change spec priority", prioritySuccess: "Priority updated", priorityError: "Failed to update priority", addTag: "Add new tag", tagExists: "Tag already exists", tagsSuccess: "Tags updated", tagsError: "Failed to update tags", searchTag: "Search or create tag...", noTagResults: "No tags found.", existingTags: "Existing tags", createSection: "Create new", createTag: 'Create "{{tag}}"', removeTag: "Remove {{tag}} tag" }, sxe = { tokens: "tokens", status: "Status: {{status}}", statusLabels: { optimal: "Optimal", good: "Good", warning: "Warning", critical: "Critical" }, clickForDetails: "Click for details", contextEconomy: "Context Economy", detailedBreakdown: "Detailed breakdown of token usage for this spec.", composition: "Composition", proseContent: "Prose & Content", frontmatter: "Frontmatter", prose: "Prose", codeBlocks: "Code Blocks", checklists: "Checklists", sectionBreakdown: "Section Breakdown", performance: { optimal: "Excellent! This spec is highly efficient for AI context.", good: "Good size. Well within comfortable limits for most models.", warning: "Getting large. Consider splitting if functionality grows.", critical: "Too large. This spec consumes significant context and may degrade AI performance." }, progressThresholds: { optimal: "Optimal Limit (2k)", good: "Good Limit (3.5k)" }, progressTicks: { zero: "0", twoK: "2k", threePointFiveK: "3.5k", fiveKPlus: "5k+" } }, oxe = { status: { pass: "Validation Passed", warn: "Validation Warnings", fail: "Validation Failed" }, passLabel: "Pass", error: "error", errors: "errors", errorsFound: "{{count}} errors found", validationLabel: "Validation: {{label}}", clickForDetails: "Click for details", dialog: { title: "Validation: {{specName}}", passTitle: "Spec Validated", passBody: "This spec meets all LeanSpec quality standards and structure requirements.", passDescription: "All quality checks passed successfully.", errorDescription: "Found {{count}} errors that require attention.", suggestion: "Suggestion:", line: "Line {{line}}", loading: "Loading validation details..." } }, lxe = { close: "Close", newSpec: { title: "Create New Spec", description: "Generate a new spec inside the active project with the LeanSpec CLI.", slugLabel: "Spec slug", slugPlaceholder: "e.g. desktop-native-menu", titleLabel: "Display title (optional)", titlePlaceholder: "Human-friendly title", commandLabel: "CLI command", commandPlaceholder: "Enter a spec slug to preview the command…", hint: "Run this command inside {{project}} (or your project root) to scaffold the spec files.", projectFallback: "your project", copyButton: "Copy command", copied: "Copied!" }, shortcuts: { title: "Keyboard Shortcuts", description: "Native menu entries mirror these shortcuts.", sections: { global: "Desktop shell", view: "View", help: "Help" }, items: { toggleWindow: "Toggle desktop window", quickSwitch: "Open project switcher", newSpec: "Create new spec", refreshProjects: "Refresh projects", toggleSidebar: "Toggle sidebar", quickFind: "Find in specs", shortcuts: "Show shortcuts", docs: "Open documentation" } }, logs: { title: "Desktop Logs", description: "Logs stay on your machine. Share them when reporting an issue.", pathLabel: "Log directory", pathPlaceholder: "Waiting for the desktop app to provide the log path…", hint: "You can also choose Help → View Logs from the native menu.", copyPath: "Copy path", openButton: "Open log folder" }, about: { title: "About LeanSpec Desktop", description: "LeanSpec UI with native integrations for local projects and automation.", version: "Version", website: "Website", support: "Support" } }, cxe = { title: "Files", description: "Browse source code files in your project.", loading: "Loading files...", loadingFile: "Loading file...", emptyDirectory: "This directory is empty.", selectFile: "Select a file to view its contents.", binaryFile: "Binary files cannot be displayed.", fileTooLarge: "File is too large to display (max 1 MB).", lines: "{{count}} lines", bytes: "{{size}} bytes", copyPath: "Copy path", pathCopied: "Path copied!", searchPlaceholder: "Search files...", clearSearch: "Clear search", noSearchResults: "No files match your search.", closeTab: "Close tab", errors: { loadFailed: "Failed to load directory.", fileFailed: "Failed to load file." } }, uxe = {
66268
+ openai`, env: "ANTHROPIC_API_KEY=${ANTHROPIC_API_KEY}" }, errors: { noProject: "Project path is required to manage runners.", loadFailed: "Failed to load runners.", saveFailed: "Failed to save runner.", deleteFailed: "Failed to delete runner.", validateFailed: "Failed to validate runner.", defaultFailed: "Failed to set default runner.", idRequired: "ID is required", idExists: "This ID already exists", idInvalid: "ID must be lowercase letters, numbers, and hyphens only", commandRequired: "Command is required", envInvalid: "Each environment line must be KEY=VALUE" }, customModel: "Custom", useCustomModel: 'Use "{{model}}"', clearModel: "Clear model", noModelsFound: "Type a model name", searchPlaceholder: "Search runners...", noResults: "No runners match your filters", sort: { name: "Name", available: "Available First" }, filters: { status: "Status", showUnavailable: "Show unavailable", showIdeRunners: "Show IDE runners", source: "Source", allSources: "All Sources", builtin: "Built-in", custom: "Custom" }, filteredCount: "{{filtered}} of {{total}} runners" }, appearance: { theme: "Theme", themeDescription: "Choose how LeanSpec looks to you", light: "Light", lightDescription: "Classic light theme", dark: "Dark", darkDescription: "Easy on the eyes", system: "System", systemDescription: "Match system preference", displayMode: "Display Mode", displayModeDescription: "Choose the layout width", normal: "Normal", normalDescription: "Centered with max width", wide: "Wide", wideDescription: "Full width content", language: "Language", languageDescription: "Choose your preferred language", selectLanguage: "Select Language" } }, Mve = { light: "Light", dark: "Dark", system: "System", toggleTheme: "Toggle theme" }, Rve = { toggle: "Toggle layout mode", normal: "Normal", wide: "Wide" }, Pve = { english: "English", chinese: "中文", changeLanguage: "Change language" }, Ove = { project: "Project", projects: "Projects", switchProject: "Switch Project", createProject: "Create Project", manageProjects: "Manage Projects", selectProject: "Select Project", description: "Manage your LeanSpec workspaces.", colorLabel: "Color", validationFailed: "Validation failed", newProject: "New Project", backTo: "Back to {{projectName}}", rename: "Rename", projectColor: "Project Color", favorite: "Favorite", unfavorite: "Unfavorite", validatePath: "Validate Path", specs: "Specs", completion: "Completion", local: "Local", noProjectsFound: "No projects found", getStarted: "Get started by creating your first LeanSpec project.", searchPlaceholder: "Search projects...", errors: { load: "Failed to load projects", switch: "Failed to switch project", noProjectSelected: "No project selected. Please select a project first." } }, Fve = { title: "Projects", machineDescription: "Projects synced from {{machine}}.", description: "Manage your LeanSpec projects and workspaces." }, Bve = { title: "Machines", description: "Manage connected Sync Bridge devices.", available: "Available Machines", empty: "No machines connected yet.", switcherLabel: "Select machine", noSelection: "Select a machine", projectsCount: "{{count}} projects", requestExecution: "Request execution", revoke: "Revoke", unavailable: "Machine unavailable. Connect the bridge to edit metadata.", status: { online: "Online", offline: "Offline" } }, $ve = { button: "Quick search...", placeholder: "Search specs by title, number, or tags...", recentSearches: "Recent Searches", filterHeading: "Filter by Tag", filterPrefix: "Filter by:", open: "Open quick search", noResults: "No results found", shortcut: { modifier: "⌘", key: "K" } }, Uve = { switching: "Switching...", placeholder: "Select project...", searchPlaceholder: "Search projects...", noProject: "No project found." }, zve = { title: "Keyboard Shortcuts", items: { dashboard: "Go to dashboard (home)", specs: "Go to specs list", stats: "Go to stats", dependencies: "Go to dependencies", settings: "Go to settings", search: "Focus search", quickSearch: "Open quick search", toggleChat: "Toggle AI chat", toggleChatSidebar: "Toggle AI chat sidebar", toggleSessionsPopover: "Toggle sessions popover", newSession: "Start new session", focusChatInput: "Focus chat input", newConversation: "New conversation", viewHistory: "View history", closeChatSidebar: "Close chat sidebar" } }, Hve = { title: "Table of Contents", open: "Open table of contents", onThisPage: "On this page" }, Vve = { multiSectionTitle: "This spec has multiple sections", multiSectionDescription: "Use the tabs below to navigate between the main overview and detailed sections." }, Wve = { pickColor: "Pick color", selectColor: "Select color {{color}}" }, qve = { title: "Add Project", descriptionPicker: "Browse and select the project directory.", descriptionManual: "Enter the absolute path to your local project directory.", enterManually: "Enter path manually", pathLabel: "Project Path", pathPlaceholder: "/path/to/your/project", pathHelp: "Select the root directory of your project.", pathRequired: "Project path is required", browseFolders: "Browse folders", action: "Add Project", adding: "Adding...", toastSuccess: "Project added successfully", toastError: "Failed to add project" }, jve = { action: "Select This Folder", parent: "Go to parent directory", rootAction: "Go to root", root: "Root", empty: "Empty directory", error: "Failed to list directory" }, Gve = { title: "All Specs", searchPlaceholder: "Search specs...", empty: "No specs found", collapse: "Collapse sidebar", expand: "Expand sidebar" }, Kve = { searchPlaceholder: "Search sessions...", noResults: "No sessions found", collapse: "Collapse sidebar", expand: "Expand sidebar" }, Yve = { title: "Specifications", searchPlaceholder: "Search specs...", clearSearch: "Clear search", noResults: "No specs found", filtersLabel: "Filters", toggleFilters: { show: "Show filters", hide: "Hide filters" }, clearFilters: "Clear", status: "Status", priority: "Priority", tags: "Tags", selected: "selected", select: { status: { label: "Status", all: "All Status" }, priority: { label: "Priority", all: "All Priority" }, tag: { label: "Tag", all: "All Tags" } }, badges: { subSpecs: "+{{count}} files" }, switchToTree: "Switch to Tree", switchToList: "Switch to List", showArchived: "Show archived", hideArchived: "Hide archived", sort: { label: "Sort By", newest: "Newest First", oldest: "Oldest First", updated: "Recently Updated", titleAsc: "Title (A-Z)", titleDesc: "Title (Z-A)", priorityHigh: "Priority (High-Low)", priorityLow: "Priority (Low-High)" }, expandAll: "Expand", collapseAll: "Collapse", searchTags: "Search tags...", noTagsFound: "No tags found" }, Xve = { title: "Specifications", description: "Browse and organize all specifications in your project.", count: "{{count}} specs", views: { list: "List", board: "Board", listTooltip: "List view", boardTooltip: "Board view" }, wideMode: { enter: "Enter wide mode", exit: "Exit wide mode" }, searchPlaceholder: "Search titles, content, tags...", searchHint: "Searches across spec titles, content, and tags", filters: { status: "Status", priority: "Priority", sort: "Sort by", statusAll: "All Status", priorityAll: "All Priority", groupByParent: "Group by Parent", withErrors: "With Errors", showArchived: "Show archived", hideArchived: "Hide archived", settings: "Settings", filteredCount: "{{filtered}} of {{total}} specs", showingAll: "Showing all {{count}} sessions", showingFiltered: "Showing {{count}} of {{total}} sessions", sortOptions: { "id-desc": "Newest First", "id-asc": "Oldest First", "updated-desc": "Recently Updated", "title-asc": "Title (A-Z)", "priority-desc": "Priority (Critical → Low)", "priority-asc": "Priority (Low → Critical)" } }, metadata: { updated: "Updated {{time}}", files: "+{{count}} files", dependencies: "{{count}} deps", none: "No metadata" }, list: { empty: "No specs found" }, board: { dropHere: "Drop here to move specs", updating: "Updating...", archivedCollapsed: "Archived" }, toasts: { statusUpdated: "Moved {{spec}} to {{status}}", statusError: "Unable to update status. Please try again." }, state: { errorTitle: "Unable to load specs", errorDescription: "Please try again or refresh your project.", noSpecsTitle: "No specs yet", noSpecsDescription: "We could not find any specs for this project. Add a spec in your LeanSpec workspace, then refresh to see it here.", noFiltersTitle: "No specs match your filters", noFiltersDescription: "Try clearing filters or adjusting your search to see more specs." }, buttons: { refreshList: "Refresh list", reloadData: "Reload data" } }, Zve = { toggleSidebar: "Toggle specs list", codeBlock: { label: "Code", copy: "Copy code", copyToClipboard: "Copy to clipboard" }, table: { copyTsv: "Copy as TSV (Excel)", exportCsv: "Export as CSV", defaultFileName: "table-export.csv" }, metadata: { created: "Created", updated: "Updated", name: "Name", assignee: "Assignee", notAvailable: "Not available", source: "Source", viewOnGitHub: "View on GitHub" }, buttons: { viewTimeline: "View Timeline", viewDependencies: "View Dependencies", viewHierarchy: "View Hierarchy", focus: "Focus", exitFocus: "Exit focus mode" }, dialogs: { timelineTitle: "Spec Timeline", timelineDescription: "Created, updated, and completion milestones.", dependenciesTitle: "Dependency Graph", dependenciesDescription: "Precedence requirements and connected specs rendered with automatic layout.", dependenciesLink: "View in full dependencies page", hierarchyTitle: "Spec Hierarchy", hierarchyDescription: "Parent and child specification relationships." }, hierarchy: { parent: "Parent Spec", current: "Current Spec", children: "Child Specs", noRelationships: "This spec has no parent or child relationships." }, tabs: { overview: "Overview" }, state: { loading: "Loading...", error: "Error loading spec", unavailableTitle: "Spec unavailable", unavailableDescription: "This spec could not be found. It may have been moved or deleted." }, dependencies: { dependsOn: "Depends on", requiredBy: "Required by" }, children: "Child Specs", links: { backToSpecs: "Back to specs", reportIssue: "Report issue" } }, Qve = { title: "Project Statistics", description: "Comprehensive metrics and insights", tokenDistribution: { title: "Token Distribution", empty: "No token data available yet.", unknown: "{{count}} specs missing token data", buckets: { optimal: "Optimal", good: "Good", warning: "Warning", critical: "Critical" } }, cards: { total: { title: "Total Specs", subtitle: "All specifications" }, completed: { title: "Completed", subtitle: "completion rate" }, inProgress: { title: "In Progress", subtitle: "Active work" }, planned: { title: "Planned", subtitle: "Upcoming work" } }, charts: { status: { title: "Status Distribution", description: "Breakdown of specs by status" }, priority: { title: "Priority Distribution", description: "Breakdown of specs by priority" }, creation: { title: "Creation Trend", description: "Specs created over time" }, topTags: { title: "Top Tags", description: "Most frequently used tags" }, label: "{{name}}: {{value}}" }, state: { errorTitle: "Unable to load statistics", errorDescription: "Please try again or refresh your project.", unknownError: "Unknown error" } }, Jve = { title: "Dashboard", subtitle: "Project overview and recent activity", subtitleWithProject: "{{projectName}} — overview and recent activity", cards: { total: "Total Specs", planned: "Planned", inProgress: "In Progress", completed: "Completed", completionRate: "{{rate}}% completion rate" }, recentlyAdded: "Recently Added", plannedSection: "Planned ({{count}})", inProgressSection: "In Progress ({{count}})", noPlanned: "No planned specs", noInProgress: "No specs in progress", recentActivity: "Recent Activity", quickActions: "Quick Actions", viewAllSpecs: "View All Specs", viewStats: "View Stats", actionUpdated: "updated", state: { errorTitle: "Unable to load dashboard", errorDescription: "Please refresh or try again." } }, exe = { title: "Project Context", description: "View project-level context files that inform AI agents and development workflows", copyAll: "Copy All", copyAllSuccess: "Copied!", searchPlaceholder: "Search within context files...", searchNoMatches: 'No matches found for "{{query}}"', summary: { totalTokens: "{{formattedCount}} total tokens", contextBudget: "Context budget for AI agents" }, badges: { matchesSingular: "{{count}} match", matchesPlural: "{{count}} matches", matchesFoundSingular: "{{count}} match found", matchesFoundPlural: "{{count}} matches found", filesSingular: "{{count}} file", filesPlural: "{{count}} files", filesFiltered: "{{count}}/{{total}} files", tokens: "{{formattedCount}} tokens" }, sections: { agents: { title: "Agent Instructions", description: "System prompts and guidelines for AI agents", empty: "No agent instructions found", suggestion: "Create an AGENTS.md file in your project root" }, config: { title: "Configuration", description: "LeanSpec project configuration and settings", empty: "No configuration found", suggestion: "Run 'leanspec init' to create a config file" }, docs: { title: "Project Documentation", description: "README, contributing guidelines, and changelog", empty: "No project docs found", suggestion: "Create a README.md file in your project root" } }, emptyState: { title: "No project context found", description: "This project doesn't have any context files yet. Context files help AI agents understand your project better.", suggestion: "Start by creating AGENTS.md or running 'leanspec init'" }, search: { noMatchesTitle: "No matches found", noMatchesDescription: "Try a different search term", noFilesDescription: "No files found in this category" }, viewer: { modified: "Modified {{date}}", lines: "{{count}} lines", viewFull: "View full page", openInEditor: "Open in VS Code", copyContent: "Copy content", tokenStatus: { optimal: "Optimal", good: "Good", large: "Large", veryLarge: "Very Large" } }, detail: { back: "Back", openInEditor: "Open in Editor", copy: "Copy", copySuccess: "Copied!", defaultFileType: "text", lines: "{{count}} lines", modified: "Modified {{date}}", size: "{{size}} KB", selectFile: "Select a file to view its content" }, errors: { list: "Failed to load context files", file: "Failed to load file", loadFailed: "Unable to load project context", noProject: "No project selected", noProjectDescription: "Please select or create a project to view its context files." } }, txe = { events: { created: "Created", inProgress: "In Progress", complete: "Complete", archived: "Archived" }, state: { awaiting: "Awaiting start", queued: "Queued", pending: "Pending update" } }, nxe = { clickToEnlarge: "Click to enlarge diagram" }, rxe = { header: { title: "Dependency Map", subtitle: "Explore precedence and connected work", badge: "React Flow DAG" }, badges: { current: "Current Spec", currentSubtitle: "This spec", dependsOn: "Depends On", dependsOnSubtitle: "Must complete first", requiredBy: "Required By", requiredBySubtitle: "Blocked by this spec" }, statusSubtitles: { completed: "Completed", inProgress: "In progress", plannedBlocking: "Must complete first", plannedCanProceed: "Can proceed", archived: "Archived" } }, ixe = { title: "Dependencies", description: "Visualize how specs connect across your project.", header: { title: "Dependency Graph", specTitle: "Dependencies for {{specName}}", allTitle: "All Dependencies", countSummary: "{{specs}} specs, {{relationships}} relationships", summary: { connected: "{{count}} specs with dependencies", standalone: "{{count}} standalone", none: "No dependencies defined" } }, selector: { placeholder: "Select spec to highlight...", filterPlaceholder: "Type to filter...", clearSelection: "Clear selection", empty: "No specs found" }, filters: { showStandalone: "Show Standalone ({{count}})", compact: "Compact", focusMode: "Focus Mode", clear: "Clear", count: "({{count}})" }, view: { graph: "Graph", list: "List" }, state: { loading: "Loading dependencies...", errorTitle: "Unable to load dependencies", errorDescription: "Please check your connection and try again." }, empty: { title: "No dependencies to display", filters: "No specs match the current filters", standaloneHint: 'Enable "Show Standalone" to see specs without dependencies', noDependencies: "No dependencies yet", noDependenciesDescription: "Specs are present but no dependency relationships were found. Add depends_on links to see the graph." }, legend: { dependsOn: "Depends On (arrow shows direction)", instructions: "Click: select • Double-click: open • Drag to rearrange" }, graph: { levelTitle: "Level {{depth}}", levelBadge: "L{{depth}}", instructions: "Click on a node to view spec details. Use mouse wheel to zoom, drag to pan." }, list: { specsTitle: "Specs ({{count}})", relationshipsTitle: "Relationships ({{count}})", noRelationships: "No relationships yet. Add depends_on or required_by references in your specs to visualize them here.", dependsOn: "↓ depends on", requiredBy: "↑ required by" }, actions: { goToSpecs: "Go to specs" }, sidebar: { emptyTitle: "Select a spec", emptyDescription: "Click on a spec to see its dependencies", openSpec: "Open Spec →", dependsOnHeading: "Depends On ({{count}})", requiredByHeading: "Required By ({{count}})", emptyUpstream: "No upstream dependencies", emptyDownstream: "No specs depend on this", depth: { direct: "Direct", level: "L{{depth}}" } } }, axe = { changeStatus: "Change spec status", statusSuccess: "Status updated", statusError: "Failed to update status", draftSkipTitle: "Skip planned stage?", draftSkipDescription: "This spec is still in draft. Move it to Planned before starting work, or skip planning with force.", draftSkipPlanned: "Go to Planned", draftSkipForce: "Skip Anyway", changePriority: "Change spec priority", prioritySuccess: "Priority updated", priorityError: "Failed to update priority", addTag: "Add new tag", tagExists: "Tag already exists", tagsSuccess: "Tags updated", tagsError: "Failed to update tags", searchTag: "Search or create tag...", noTagResults: "No tags found.", existingTags: "Existing tags", createSection: "Create new", createTag: 'Create "{{tag}}"', removeTag: "Remove {{tag}} tag" }, sxe = { tokens: "tokens", status: "Status: {{status}}", statusLabels: { optimal: "Optimal", good: "Good", warning: "Warning", critical: "Critical" }, clickForDetails: "Click for details", contextEconomy: "Context Economy", detailedBreakdown: "Detailed breakdown of token usage for this spec.", composition: "Composition", proseContent: "Prose & Content", frontmatter: "Frontmatter", prose: "Prose", codeBlocks: "Code Blocks", checklists: "Checklists", sectionBreakdown: "Section Breakdown", performance: { optimal: "Excellent! This spec is highly efficient for AI context.", good: "Good size. Well within comfortable limits for most models.", warning: "Getting large. Consider splitting if functionality grows.", critical: "Too large. This spec consumes significant context and may degrade AI performance." }, progressThresholds: { optimal: "Optimal Limit (2k)", good: "Good Limit (3.5k)" }, progressTicks: { zero: "0", twoK: "2k", threePointFiveK: "3.5k", fiveKPlus: "5k+" } }, oxe = { status: { pass: "Validation Passed", warn: "Validation Warnings", fail: "Validation Failed" }, passLabel: "Pass", error: "error", errors: "errors", errorsFound: "{{count}} errors found", validationLabel: "Validation: {{label}}", clickForDetails: "Click for details", dialog: { title: "Validation: {{specName}}", passTitle: "Spec Validated", passBody: "This spec meets all LeanSpec quality standards and structure requirements.", passDescription: "All quality checks passed successfully.", errorDescription: "Found {{count}} errors that require attention.", suggestion: "Suggestion:", line: "Line {{line}}", loading: "Loading validation details..." } }, lxe = { close: "Close", newSpec: { title: "Create New Spec", description: "Generate a new spec inside the active project with the LeanSpec CLI.", slugLabel: "Spec slug", slugPlaceholder: "e.g. desktop-native-menu", titleLabel: "Display title (optional)", titlePlaceholder: "Human-friendly title", commandLabel: "CLI command", commandPlaceholder: "Enter a spec slug to preview the command…", hint: "Run this command inside {{project}} (or your project root) to scaffold the spec files.", projectFallback: "your project", copyButton: "Copy command", copied: "Copied!" }, shortcuts: { title: "Keyboard Shortcuts", description: "Native menu entries mirror these shortcuts.", sections: { global: "Desktop shell", view: "View", help: "Help" }, items: { toggleWindow: "Toggle desktop window", quickSwitch: "Open project switcher", newSpec: "Create new spec", refreshProjects: "Refresh projects", toggleSidebar: "Toggle sidebar", quickFind: "Find in specs", shortcuts: "Show shortcuts", docs: "Open documentation" } }, logs: { title: "Desktop Logs", description: "Logs stay on your machine. Share them when reporting an issue.", pathLabel: "Log directory", pathPlaceholder: "Waiting for the desktop app to provide the log path…", hint: "You can also choose Help → View Logs from the native menu.", copyPath: "Copy path", openButton: "Open log folder" }, about: { title: "About LeanSpec Desktop", description: "LeanSpec UI with native integrations for local projects and automation.", version: "Version", website: "Website", support: "Support" } }, cxe = { title: "Files", description: "Browse source code files in your project.", loading: "Loading files...", loadingFile: "Loading file...", emptyDirectory: "This directory is empty.", selectFile: "Select a file to view its contents.", binaryFile: "Binary files cannot be displayed.", fileTooLarge: "File is too large to display (max 1 MB).", lines: "{{count}} lines", bytes: "{{size}} bytes", copyPath: "Copy path", pathCopied: "Path copied!", searchPlaceholder: "Search files...", clearSearch: "Clear search", noSearchResults: "No files match your search.", closeTab: "Close tab", errors: { loadFailed: "Failed to load directory.", fileFailed: "Failed to load file." } }, uxe = {
66269
66269
  errors: vve,
66270
66270
  navigation: xve,
66271
66271
  search: wve,
@@ -66335,7 +66335,7 @@ openai`, env: "ANTHROPIC_API_KEY=${ANTHROPIC_API_KEY}" }, errors: { noProject: "
66335
66335
 
66336
66336
  {specs}`, promptPreview: "实际发送提示预览", promptPreviewEmpty: "添加规范或输入自定义提示后可预览发送内容。", attachSpec: "@ 规范", noSpec: "未关联规范", tokens: "令牌", cost: "预估费用", costUnknown: "未知", costApprox: "约 ${{value}}", unknownTime: "未知", autoScroll: "自动滚动", logs: "日志", plan: "计划", protocolAcp: "ACP", protocolCli: "CLI", activeTool: "工具:{{tool}}", planProgress: "计划:{{completed}}/{{total}}", completed: "已完成" }, modes: { autonomous: "自主", guided: "引导" }, runners: { claude: "Claude", copilot: "GitHub Copilot", codex: "Codex", opencode: "OpenCode", aider: "Aider", cline: "Cline", gemini: "Gemini", cursor: "Cursor", windsurf: "Windsurf", droid: "Droid", kiro: "Kiro", kimi: "Kimi", qodo: "Qodo", amp: "Amp", trae: "Trae", "qwen-code": "Qwen Code", goose: "Goose", openhands: "OpenHands", continue: "Continue", crush: "Crush", roo: "Roo", codebuddy: "CodeBuddy", kilo: "Kilo", augment: "Augment", antigravity: "Antigravity" }, select: { placeholder: "选择...", search: "搜索...", empty: "未找到结果。" }, export: { fallbackName: "logs" }, dialogs: { createTitle: "创建 AI 会话", createDescription: "选择运行器和模式,然后启动会话。", logsTitle: "会话日志" }, errors: { load: "加载会话失败。", create: "创建会话失败。", noProjectPath: "当前工作区缺少项目路径。" }, permissions: { allow_once: "允许一次", allow_always: "始终允许", reject: "拒绝", responding: "正在发送响应..." } }, Fxe = { title: "会话", description: "跨规范监控 AI 编码会话。", count: "{{count}} 个会话", filters: { search: "按会话、规范或运行器搜索", status: "状态", runner: "运行器", mode: "模式", spec: "规范" }, sort: { startedDesc: "开始时间(最新)", startedAsc: "开始时间(最早)", durationDesc: "持续时间(最长)", status: "状态" }, buttons: { loadMore: "加载更多", refresh: "刷新列表" }, state: { errorTitle: "无法加载会话", emptyTitle: "暂无会话", emptyDescription: "创建新会话以开始跟踪 AI 运行情况。", noResultsTitle: "没有匹配的会话", noResultsDescription: "尝试调整筛选条件或搜索关键词。" }, groups: { active: "运行中", today: "今天", yesterday: "昨天", older: "更早" }, labels: { noSpecs: "无 Specs" } }, Bxe = { title: "会话 {{id}}", description: "实时日志与会话详情。", eventsTitle: "会话时间线", eventsDescription: "记录该会话的生命周期事件。", eventsEmpty: "暂无事件记录。", archiveSuccess: "已归档到 {{path}}", archiveError: "归档会话日志失败。", logsTitle: "实时日志", logsDescription: "来自该会话的实时输出。", filters: { search: "搜索日志", autoScroll: "自动滚动", acp: { messages: "消息", thoughts: "思考", tools: "工具调用", plan: "计划" } }, displayMode: { messages: "消息", verbose: "详细" }, actions: { download: "下载日志文件", copyLogs: "复制日志到剪贴板" }, state: { notFoundTitle: "会话不可用", notFoundDescription: "无法加载该会话。" } }, $xe = { title: "LeanSpec AI 聊天", subtitle: "在浏览器内用对话管理规范。", modelLabel: "模型", clear: "清空", empty: "可以请求列出、创建、更新或校验规范。", placeholder: "向 LeanSpec 发出管理规范的请求...", helper: "示例:“列出所有规范”、“创建限流规范”、“将 082 标记为完成”。", send: "发送", thinking: "思考中...", error: "发生错误,请重试。", modelError: "模型错误", searchModels: "搜索模型...", noModelsFound: "未找到模型", noKey: "无密钥", providersSummary: "{{total}} 个提供商,已配置 {{configured}} 个", availableProvidersSummary: "{{count}} 个可用提供商", modelsLoadError: "加载模型失败", autoTitle: { generating: "正在生成标题..." }, newChat: "新对话", expandSidebar: "展开侧边栏", collapseSidebar: "收起侧边栏", searchPlaceholder: "搜索对话...", history: { searchPlaceholder: "搜索历史...", empty: "未找到对话" }, shortcuts: { newChat: "新对话 (Cmd+Shift+N)", history: "历史记录 (Cmd+Shift+H)", closeSidebar: "关闭 (Cmd+Shift+I)" }, emptyState: { prompt: "选择一个对话或开始新的对话。" }, noSearchResults: "未找到对话", noConversations: "暂无对话", startConversation: "点击“新对话”开始聊天", noMessagesYet: "暂无消息", modelSelector: { selectPlaceholder: "选择模型...", badges: { tool: "工具", reasoning: "推理", vision: "视觉" }, metrics: { contextWindow: "上下文窗口", maxOutput: "最大输出", inputCost: "输入成本", outputCost: "输出成本", vision: "视觉" }, hiddenItem: "隐藏" }, today: "今天", yesterday: "昨天", previous7Days: "过去 7 天", older: "更早", storageUsage: "已用存储:{{size}}", storageLocation: "位置:{{path}}", storageUnavailable: "无法获取存储信息", storageUnits: { zero: "0 B", byte: "B", kilobyte: "KB", megabyte: "MB", gigabyte: "GB", terabyte: "TB" }, deleteConversation: "删除对话", renameConversation: "重命名对话", disabledTitle: "AI 聊天已禁用", disabledDescription: "设置 VITE_ENABLE_AI=true 以启用聊天功能。", toggleModelSettings: "切换模型设置", openChat: "打开 AI 聊天", openFullChat: "完整聊天", attachSpec: "@ 规范", specContextPrefix: "请将以下规范作为上下文:", toolExecution: { status: { failed: "失败", completed: "已完成", running: "运行中...", success: "成功", error: "错误" }, labels: { input: "输入", output: "输出", error: "错误" }, actions: { showAll: "显示全部", showLess: "收起", copy: "复制" }, tabs: { input: "输入", output: "输出" }, viewToggle: { ui: "界面", json: "JSON" } }, settings: { title: "聊天配置", description: "配置 AI 提供商、模型和聊天行为", provider: "提供商", model: "模型", providers: "AI 提供商", providersDescription: "管理 OpenAI、Anthropic、Deepseek 和其他 AI 提供商", models: "模型", addProvider: "添加提供商", editProvider: "编辑提供商", addModel: "添加模型", editModel: "编辑模型", default: "默认", keyConfigured: "已设置 API 密钥", noKey: "无 API 密钥", defaults: "默认设置", defaultsDescription: "配置默认提供商、模型和行为", defaultProvider: "默认提供商", defaultModel: "默认模型", maxSteps: "最大步数", maxStepsHelp: "工具执行的最大步数 (1-50)", confirmDeleteProvider: "确定要删除此提供商吗?", confirmDeleteModel: "确定要删除此模型吗?", providerDialogDescription: "配置提供商详情和 API 凭证", modelDialogDescription: "添加或编辑模型信息", providerId: "提供商 ID", providerIdHelp: "小写标识符(例如:openai、anthropic)", providerName: "显示名称", baseURL: "基础 URL", baseURLHelp: "可选的自定义 API 端点(用于 OpenRouter 等)", apiKey: "API 密钥", apiKeyHelp: "使用 ${ENV_VAR} 表示环境变量或直接粘贴", modelId: "模型 ID", modelName: "显示名称", maxTokens: "最大令牌数", maxTokensHelp: "上下文窗口大小(可选)", deleteProviderTitle: "删除提供商", deleteModelTitle: "删除模型", placeholders: { providerId: "openai", providerName: "OpenAI", baseUrl: "https://api.openai.com/v1", apiKeyMasked: "••••••••", apiKeyEnv: "${OPENAI_API_KEY}", modelId: "gpt-4o", modelName: "GPT-4o", maxTokens: "128000" }, errors: { loadConfig: "加载配置失败", saveConfig: "保存配置失败", loadConfiguration: "加载配置失败", idRequired: "ID 为必填项", idExists: "此 ID 已存在", idInvalid: "ID 只能包含小写字母、数字和连字符", nameRequired: "名称为必填项", urlInvalid: "URL 必须以 http:// 或 https:// 开头", modelIdRequired: "模型 ID 为必填项", modelIdExists: "此模型 ID 已存在", modelNameRequired: "模型名称为必填项", maxTokensInvalid: "最大令牌数必须是数字" } } }, Uxe = { spec: "规范", specs: "规范", specification: "规范", specifications: "规范", title: "标题", description: "描述", tags: "标签", createdAt: "创建时间", updatedAt: "更新时间", completedAt: "完成时间" }, zxe = { hierarchy: { umbrella: "伞形规范", inParent: "所属:{{parent}}" } }, Hxe = { title: "关系", description: "管理当前规范的层级与依赖关系。", button: "关系", sections: { hierarchy: "层级", dependencies: "依赖" }, parent: "父规范", children: "子规范", dependsOn: "依赖", requiredBy: "被依赖", actions: { setParent: "设置父规范", addChild: "添加子规范", addDependsOn: "添加依赖", addRequiredBy: "添加被依赖", viewHierarchy: "在层级中查看", viewDependencies: "查看依赖图" }, empty: { parent: "未设置父规范", children: "暂无子规范", dependsOn: "暂无依赖", requiredBy: "暂无被依赖", noSpecs: "暂无规范" }, confirmRemove: "移除与 {{label}} 的关系?" }, Vxe = { unknownError: "未知错误" }, Wxe = { title: "设置", description: "管理你的偏好和配置", collapseSidebar: "收起侧边栏", expandSidebar: "展开侧边栏", tabs: { models: "模型", runners: "运行器", appearance: "外观" }, ai: { providers: "AI 提供商", providersDescription: "为 models.dev 注册表中的 AI 提供商配置 API 密钥", searchPlaceholder: "搜索提供商或模型...", models: "模型", addProvider: "添加提供商", editProvider: "编辑提供商", addModel: "添加模型", editModel: "编辑模型", default: "默认", keyConfigured: "已配置", noKey: "无密钥", defaults: "默认设置", defaultsDescription: "配置默认提供商、模型和行为", defaultProvider: "默认提供商", defaultModel: "默认模型", selectProvider: "选择提供商", selectModel: "选择模型", maxSteps: "最大步数", maxStepsHelp: "工具执行的最大步数 (1-50)", providerId: "提供商 ID", providerIdHelp: "小写标识符(例如:openai、anthropic)", providerName: "显示名称", baseURL: "基础 URL", baseURLHelp: "可选的自定义 API 端点(用于 OpenRouter 等)", apiKey: "API 密钥", apiKeyHelp: "使用 ${ENV_VAR} 表示环境变量或直接粘贴", modelId: "模型 ID", modelName: "显示名称", maxTokens: "最大 Token 数", maxTokensHelp: "上下文窗口大小(可选)", providerDialogDescription: "配置提供商详情和 API 凭据", modelDialogDescription: "添加或编辑模型信息", refreshRegistry: "刷新", configuredProviders: "已配置的提供商", availableProviders: "可用的提供商", agenticModels: "代理模型", total: "总计", updateKey: "更新密钥", configureKey: "配置", hideModels: "隐藏模型", showModels: "显示模型", moreModels: "更多模型", modelsAvailable: "个可用模型", capabilities: { toolCall: "工具调用", reasoning: "推理", vision: "视觉" }, customProviders: "自定义提供商", customProvidersDescription: "添加不在 models.dev 注册表中的提供商", addCustomProvider: "添加自定义", noCustomProviders: "无自定义提供商", custom: "自定义", configureApiKey: "配置 API 密钥", clearApiKey: "清除 API 密钥", configureModels: "配置 {{provider}} 模型", configureModelsDescription: "选择为此提供商启用的模型", apiKeyDialogDescription: "输入 {{provider}} 的 API 密钥", azureApiKeyDialogDescription: "配置 Azure OpenAI 的资源名称和 API 密钥", azureResourceName: "Azure 资源名称", azureResourceNameHelp: "您的 Azure OpenAI 资源名称(例如 'my-openai-resource')", apiKeyStorageNote: "API 密钥将本地存储在配置文件中", configureProvider: "配置 {{provider}}", configureProviderDescription: "配置提供商详情和模型访问权限", restrictModels: "限制可用模型", allModelsEnabled: "所有模型均已启用", allModelsEnabledDesc: "此提供商的所有模型目前均可在聊天中使用。", enableRestriction: "启用限制", selectedOf: "已选择,共", selectAll: "全选", deselectAll: "取消全选", restricted: "已限制", outOfTotal: ",共 {{total}} 个", placeholders: { azureResourceName: "my-openai-resource", apiKeyEnv: "{{provider}}_API_KEY", apiKeyPrefix: "sk-...", customProviderId: "my-provider", customProviderName: "My Provider", customProviderBaseUrl: "https://api.example.com/v1" }, editCustomProvider: "编辑自定义提供商", customProviderDialogDescription: "配置自定义提供商的 API 端点和模型", leaveEmptyToKeep: "留空以保留现有值", noModelsAdded: "尚未添加模型", confirmDeleteProvider: "确定要删除此提供商吗?", builtIn: "内置", configure: "配置", setUp: "设置", setDefault: "设为默认", discoverModels: "发现模型", saveAndSetDefault: "保存并设为默认", sort: { name: "名称", models: "模型数量", configured: "已配置优先" }, modelSort: { sortBy: "排序方式", name: "名称", tokens: "令牌数" }, filters: { status: "状态", all: "全部", configured: "已配置", unconfigured: "未配置", showConfiguredOnly: "仅显示已配置", showUnconfiguredOnly: "仅显示未配置" }, filteredCount: "{{filtered}} / {{total}} 个提供商", validation: { revalidateAll: "重新校验全部", checking: "校验中", valid: "有效", invalid: "无效", lastChecked: "上次校验:{{time}}" }, details: { title: "详情", providerId: "提供商 ID", baseUrl: "基础 URL", modelCount: "{{count}} 个模型({{agentic}} 个代理)" }, toasts: { defaultProvider: "默认提供商已设置为 {{provider}}", apiKeySaved: "API 密钥已保存", apiKeyCleared: "API 密钥已清除", modelsSaved: "模型偏好已保存" }, errors: { loadConfig: "加载配置失败", refreshFailed: "刷新失败", setApiKeyFailed: "设置 API 密钥失败", saveConfigFailed: "保存配置失败", saveFailed: "保存失败", idRequired: "ID 是必需的", idExists: "此 ID 已存在", idInvalid: "ID 只能包含小写字母、数字和连字符", nameRequired: "名称是必需的", urlInvalid: "URL 必须以 http:// 或 https:// 开头", modelIdRequired: "模型 ID 是必需的", modelIdExists: "此模型 ID 已存在", modelNameRequired: "模型名称是必需的", maxTokensInvalid: "最大 Token 数必须是数字", apiKeyRequired: "API 密钥是必需的", azureResourceNameRequired: "Azure 资源名称是必需的", modelsRequired: "至少需要一个模型" } }, runners: { title: "AI 运行器", description: "管理 AI 会话使用的本地运行器命令", addRunner: "添加运行器", editRunner: "编辑运行器", default: "默认", available: "可用", unavailable: "未找到", ideOnly: "仅 IDE", ideOnlyCommand: "仅 IDE(无法从 CLI 运行)", setDefault: "设为默认", empty: "暂无配置的运行器。", dialogDescription: "配置运行器命令、参数与环境变量", confirmDelete: '删除运行器 "{{id}}"?', validation: { revalidateAll: "重新校验全部", checking: "校验中", valid: "有效", invalid: "无效", lastChecked: "上次校验:{{time}}" }, details: { title: "详情", id: "运行器 ID", source: "来源:{{source}}", version: "版本", notFound: "在 PATH 中未找到命令" }, toasts: { defaultRunner: "默认运行器已设置为 {{runner}}" }, fields: { id: "运行器 ID", idHelp: "小写标识符(例如:claude、copilot)", name: "显示名称", command: "命令", args: "参数", argsHelp: "每行一个参数", defaultModel: "默认模型", modelProviders: "模型提供商", modelProvidersHelp: "每行一个 models.dev 提供商 ID(例如 openai、anthropic、google)", env: "环境变量", envHelp: "每行一个 KEY=VALUE" }, placeholders: { id: "claude", name: "Claude Code", command: "claude", args: `--dangerously-skip-permissions
66337
66337
  --print`, defaultModel: "claude-3-7-sonnet", searchOrTypeModel: "搜索或输入模型...", modelProviders: `anthropic
66338
- openai`, env: "ANTHROPIC_API_KEY=${ANTHROPIC_API_KEY}" }, errors: { noProject: "需要项目路径才能管理运行器。", loadFailed: "加载运行器失败。", saveFailed: "保存运行器失败。", deleteFailed: "删除运行器失败。", validateFailed: "校验运行器失败。", defaultFailed: "设置默认运行器失败。", idRequired: "ID 为必填项", idExists: "此 ID 已存在", idInvalid: "ID 只能包含小写字母、数字和连字符", commandRequired: "命令为必填项", envInvalid: "每行环境变量必须为 KEY=VALUE" }, customModel: "自定义", useCustomModel: '使用 "{{model}}"', clearModel: "清除模型", noModelsFound: "输入模型名称", searchPlaceholder: "搜索运行器...", noResults: "没有符合筛选条件的运行器", sort: { name: "名称", available: "可用优先" }, filters: { status: "状态", showUnavailable: "显示不可用", showIdeRunners: "显示 IDE 运行器", source: "来源", allSources: "全部来源", builtin: "内置", custom: "自定义" }, filteredCount: "{{filtered}} / {{total}} 个运行器" }, appearance: { theme: "主题", themeDescription: "选择 LeanSpec 的外观", light: "浅色", lightDescription: "经典浅色主题", dark: "深色", darkDescription: "柔和护眼", system: "跟随系统", systemDescription: "匹配系统偏好", displayMode: "显示模式", displayModeDescription: "选择布局宽度", normal: "标准", normalDescription: "居中最大宽度", wide: "宽屏", wideDescription: "全宽显示", language: "语言", languageDescription: "选择你的首选语言", selectLanguage: "选择语言" } }, qxe = { light: "浅色", dark: "深色", system: "跟随系统", toggleTheme: "切换主题" }, jxe = { toggle: "切换布局模式", normal: "标准", wide: "宽屏" }, Gxe = { english: "English", chinese: "中文", changeLanguage: "切换语言" }, Kxe = { project: "项目", projects: "项目", switchProject: "切换项目", createProject: "创建项目", manageProjects: "管理项目", selectProject: "选择项目", description: "管理你的 LeanSpec 工作区。", colorLabel: "颜色", validationFailed: "校验失败", newProject: "新建项目", backTo: "返回 {{projectName}}", rename: "重命名", projectColor: "项目颜色", favorite: "收藏", unfavorite: "取消收藏", validatePath: "校验路径", specs: "规范数", completion: "完成度", local: "本地", noProjectsFound: "未找到项目", getStarted: "开始创建您的第一个 LeanSpec 项目。", searchPlaceholder: "搜索项目...", errors: { load: "无法加载项目", switch: "无法切换项目", noProjectSelected: "未选择项目,请先选择或创建一个项目。" } }, Yxe = { title: "项目", machineDescription: "来自 {{machine}} 的同步项目。", description: "管理你的 LeanSpec 工作区。" }, Xxe = { title: "设备", description: "管理已连接的 Sync Bridge 设备。", available: "可用设备", empty: "暂时没有已连接的设备。", switcherLabel: "选择设备", noSelection: "请选择设备", projectsCount: "{{count}} 个项目", requestExecution: "请求执行", revoke: "撤销", unavailable: "设备不可用。请连接 Sync Bridge 后再编辑元数据。", status: { online: "在线", offline: "离线" } }, Zxe = { button: "快速搜索...", placeholder: "按标题、编号或标签搜索规范...", recentSearches: "最近搜索", filterHeading: "按标签筛选", filterPrefix: "筛选:", open: "打开快速搜索", noResults: "未找到结果", shortcut: { modifier: "⌘", key: "K" } }, Qxe = { switching: "正在切换...", placeholder: "选择项目...", searchPlaceholder: "搜索项目...", noProject: "未找到项目。" }, Jxe = { title: "键盘快捷键", items: { dashboard: "跳转到仪表板(首页)", specs: "跳转到规范列表", stats: "跳转到统计", dependencies: "跳转到依赖", settings: "跳转到设置", search: "聚焦搜索框", quickSearch: "打开快速搜索", toggleChat: "切换 AI 聊天", toggleChatSidebar: "切换 AI 聊天侧边栏", toggleSessionsPopover: "切换会话弹出层", newSession: "新建会话", focusChatInput: "聚焦聊天输入框", newConversation: "新建对话", viewHistory: "查看历史记录", closeChatSidebar: "关闭聊天侧边栏" } }, ewe = { title: "目录", open: "打开目录", onThisPage: "页面导航" }, twe = { multiSectionTitle: "此规范包含多个章节", multiSectionDescription: "使用下方标签切换概览和详细章节。" }, nwe = { pickColor: "选择颜色", selectColor: "选择颜色 {{color}}" }, rwe = { title: "添加项目", descriptionPicker: "浏览并选择项目目录。", descriptionManual: "请输入本地项目目录的绝对路径。", enterManually: "手动输入路径", pathLabel: "项目路径", pathPlaceholder: "/path/to/your/project", pathHelp: "选择项目根目录。", pathRequired: "项目路径为必填项", browseFolders: "浏览文件夹", action: "添加项目", adding: "正在添加...", toastSuccess: "项目添加成功", toastError: "无法添加项目" }, iwe = { action: "选择此文件夹", parent: "返回上级目录", rootAction: "返回根目录", root: "根目录", empty: "空目录", error: "无法列出目录" }, awe = { title: "全部规范", searchPlaceholder: "搜索规范...", empty: "没有匹配的规范", collapse: "收起侧边栏", expand: "展开侧边栏" }, swe = { searchPlaceholder: "搜索会话...", noResults: "没有匹配的会话", collapse: "收起侧边栏", expand: "展开侧边栏" }, owe = { title: "规范列表", searchPlaceholder: "搜索规范...", clearSearch: "清除搜索", noResults: "没有匹配的规范", filtersLabel: "筛选", toggleFilters: { show: "展开筛选", hide: "收起筛选" }, clearFilters: "重置", status: "状态", priority: "优先级", tags: "标签", selected: "已选", select: { status: { label: "状态", all: "全部状态" }, priority: { label: "优先级", all: "全部优先级" }, tag: { label: "标签", all: "全部标签" } }, badges: { subSpecs: "+{{count}} 个文件" }, switchToTree: "切换到树形视图", switchToList: "切换到列表视图", showArchived: "显示已归档", hideArchived: "隐藏已归档", sort: { label: "排序", newest: "最新优先", oldest: "最早优先", updated: "最近更新", titleAsc: "标题 (A-Z)", titleDesc: "标题 (Z-A)", priorityHigh: "优先级(高→低)", priorityLow: "优先级(低→高)" }, expandAll: "展开全部", collapseAll: "折叠全部", searchTags: "搜索标签...", noTagsFound: "未找到标签" }, lwe = { title: "规范列表", description: "浏览并管理项目中的所有规范。", count: "共 {{count}} 个规范", views: { list: "列表", board: "看板", listTooltip: "列表视图", boardTooltip: "看板视图" }, wideMode: { enter: "进入宽屏模式", exit: "退出宽屏模式" }, searchPlaceholder: "搜索标题、内容、标签...", searchHint: "在规范标题、内容和标签中搜索", filters: { status: "状态", priority: "优先级", sort: "排序", statusAll: "全部状态", priorityAll: "全部优先级", groupByParent: "按父级分组", withErrors: "有校验错误", showArchived: "显示已归档", hideArchived: "隐藏已归档", settings: "设置", filteredCount: "{{filtered}} / {{total}} 个规范", showingAll: "显示全部 {{count}} 个会话", showingFiltered: "显示 {{count}} / {{total}} 个会话", sortOptions: { "id-desc": "最新优先", "id-asc": "最早优先", "updated-desc": "最近更新", "title-asc": "标题 (A-Z)", "priority-desc": "优先级(紧急 → 低)", "priority-asc": "优先级(低 → 紧急)" } }, metadata: { updated: "更新于 {{time}}", files: "+{{count}} 个文件", dependencies: "{{count}} 个依赖", none: "暂无元信息" }, list: { empty: "没有匹配的规范" }, board: { dropHere: "拖放到此移动规范", updating: "正在更新...", archivedCollapsed: "已归档" }, toasts: { statusUpdated: "已将 {{spec}} 移动到 {{status}}", statusError: "无法更新状态,请稍后重试。" }, state: { errorTitle: "无法加载规范", errorDescription: "请重试或刷新项目。", noSpecsTitle: "暂无规范", noSpecsDescription: "未找到任何规范。请在 LeanSpec 工作区添加后刷新。", noFiltersTitle: "没有匹配当前筛选条件的规范", noFiltersDescription: "尝试清除筛选条件或调整搜索。" }, buttons: { refreshList: "刷新列表", reloadData: "重新加载" } }, cwe = { toggleSidebar: "展开或收起规范列表", codeBlock: { label: "代码", copy: "复制代码", copyToClipboard: "复制到剪贴板" }, table: { copyTsv: "复制为 TSV(Excel)", exportCsv: "导出为 CSV", defaultFileName: "table-export.csv" }, metadata: { created: "创建时间", updated: "更新时间", name: "名称", assignee: "责任人", notAvailable: "暂无", source: "来源", viewOnGitHub: "在 GitHub 查看" }, buttons: { viewTimeline: "查看时间线", viewDependencies: "查看依赖", viewHierarchy: "查看层级", focus: "专注模式", exitFocus: "退出专注模式" }, dialogs: { timelineTitle: "规范时间线", timelineDescription: "查看创建、更新和完成节点。", dependenciesTitle: "依赖关系图", dependenciesDescription: "展示前置关系与关联规范。", dependenciesLink: "在依赖页面中查看", hierarchyTitle: "规范层级", hierarchyDescription: "父子规范的层级关系。" }, hierarchy: { parent: "父规范", current: "当前规范", children: "子规范", noRelationships: "此规范没有父子层级关系。" }, tabs: { overview: "概览" }, state: { loading: "正在加载...", error: "无法加载规范", unavailableTitle: "规范无法访问", unavailableDescription: "无法找到该规范,可能已被移动或删除。" }, dependencies: { dependsOn: "依赖", requiredBy: "被依赖" }, links: { backToSpecs: "返回规范列表", reportIssue: "报告问题" } }, uwe = { title: "项目统计", description: "查看项目的整体指标与洞察", tokenDistribution: { title: "Token 分布", empty: "暂无 Token 数据。", unknown: "{{count}} 个规范缺少 Token 数据", buckets: { optimal: "最佳", good: "良好", warning: "偏大", critical: "严重" } }, cards: { total: { title: "规范总数", subtitle: "全部规范" }, completed: { title: "已完成", subtitle: "完成率" }, inProgress: { title: "进行中", subtitle: "活跃中的工作" }, planned: { title: "已计划", subtitle: "即将开始的工作" } }, charts: { status: { title: "状态分布", description: "按状态划分的规范数量" }, priority: { title: "优先级分布", description: "按优先级划分的规范数量" }, creation: { title: "创建趋势", description: "最近新建的规范数量走势" }, topTags: { title: "热门标签", description: "使用最频繁的标签" }, label: "{{name}}:{{value}}" }, state: { errorTitle: "无法加载统计数据", errorDescription: "请重试或刷新项目。", unknownError: "未知错误" } }, dwe = { title: "仪表板", subtitle: "项目概览与近期活动", subtitleWithProject: "{{projectName}} — 概览与近期活动", cards: { total: "规范总数", planned: "已计划", inProgress: "进行中", completed: "已完成", completionRate: "{{rate}}% 完成率" }, recentlyAdded: "最近添加", plannedSection: "已计划 ({{count}})", inProgressSection: "进行中 ({{count}})", noPlanned: "暂无已计划的规范", noInProgress: "暂无进行中的规范", recentActivity: "最近活动", quickActions: "快捷操作", viewAllSpecs: "查看所有规范", viewStats: "查看统计", actionUpdated: "已更新", state: { errorTitle: "无法加载仪表板", errorDescription: "请刷新页面或稍后再试。" } }, hwe = { title: "项目上下文", description: "查看驱动 AI 工具与开发流程的项目级上下文文件", copyAll: "复制全部", copyAllSuccess: "已复制!", searchPlaceholder: "在上下文文件中搜索...", searchNoMatches: "没有找到包含「{{query}}」的内容", summary: { totalTokens: "共 {{formattedCount}} 个 Token", contextBudget: "用于 AI 工具的上下文预算" }, badges: { matchesSingular: "{{count}} 个匹配", matchesPlural: "{{count}} 个匹配", matchesFoundSingular: "找到 {{count}} 个匹配", matchesFoundPlural: "找到 {{count}} 个匹配", filesSingular: "{{count}} 个文件", filesPlural: "{{count}} 个文件", filesFiltered: "{{count}}/{{total}} 个文件", tokens: "{{formattedCount}} 个 Token" }, sections: { agents: { title: "Agent 指令", description: "提供给 AI Agent 的系统提示与使用指南", empty: "当前没有 Agent 指令", suggestion: "在项目根目录创建 AGENTS.md" }, config: { title: "配置", description: "LeanSpec 项目配置与设置", empty: "没有找到配置文件", suggestion: "运行 'lean-spec init' 生成配置文件" }, docs: { title: "项目文档", description: "README、贡献指南与变更日志", empty: "没有找到项目文档", suggestion: "在项目根目录创建 README.md" } }, emptyState: { title: "未检测到项目上下文", description: "该项目暂未配置任何上下文文件,AI Agent 无法了解项目背景。", suggestion: "先创建 AGENTS.md 或执行 'lean-spec init'" }, search: { noMatchesTitle: "未找到匹配项", noMatchesDescription: "试试其他关键词", noFilesDescription: "该分类下没有文件" }, viewer: { modified: "更新于 {{date}}", lines: "{{count}} 行", viewFull: "查看全页", openInEditor: "在 VS Code 中打开", copyContent: "复制内容", tokenStatus: { optimal: "最佳", good: "良好", large: "偏大", veryLarge: "非常大" } }, detail: { back: "返回", openInEditor: "在编辑器中打开", copy: "复制", copySuccess: "已复制!", defaultFileType: "文本", lines: "{{count}} 行", modified: "更新于 {{date}}", size: "大小 {{size}} KB", selectFile: "选择文件以查看内容" }, errors: { list: "无法加载上下文文件", file: "无法加载文件", loadFailed: "无法加载项目上下文", noProject: "未选择项目", noProjectDescription: "请选择或创建一个项目以查看其上下文文件。" } }, pwe = { events: { created: "创建", inProgress: "进行中", complete: "已完成", archived: "已归档" }, state: { awaiting: "等待开始", queued: "排队中", pending: "等待更新" } }, fwe = { clickToEnlarge: "点击放大图表" }, mwe = { header: { title: "依赖地图", subtitle: "探索前置工作与关联项", badge: "React Flow DAG" }, badges: { current: "当前规范", currentSubtitle: "本规范", dependsOn: "依赖", dependsOnSubtitle: "必须先完成", requiredBy: "被依赖", requiredBySubtitle: "受此规范阻塞" }, statusSubtitles: { completed: "已完成", inProgress: "进行中", plannedBlocking: "必须先完成", plannedCanProceed: "可以继续", archived: "已归档" } }, gwe = { title: "依赖关系", description: "可视化项目内规范的关联关系。", header: { title: "依赖关系图", specTitle: "{{specName}} 的依赖", allTitle: "所有依赖", countSummary: "{{specs}} 个规范,{{relationships}} 条关系", summary: { connected: "{{count}} 个规范存在依赖", standalone: "{{count}} 个独立项", none: "暂未配置依赖关系" } }, selector: { placeholder: "选择要高亮的规范...", filterPlaceholder: "输入以筛选...", clearSelection: "清除选择", empty: "没有匹配的规范" }, filters: { showStandalone: "显示独立项 ({{count}})", compact: "紧凑视图", focusMode: "焦点模式", clear: "重置", count: "({{count}})" }, view: { graph: "图", list: "列表" }, state: { loading: "正在加载依赖...", errorTitle: "无法加载依赖", errorDescription: "请检查网络后重试。" }, empty: { title: "暂无依赖可显示", filters: "没有规范满足当前筛选条件", standaloneHint: "开启「显示独立项」即可查看未建立依赖的规范", noDependencies: "暂无依赖", noDependenciesDescription: "找到了规范,但尚未设置依赖关系。添加 depends_on 以查看依赖图。" }, legend: { dependsOn: "依赖方向(箭头表示指向)", instructions: "点击:选中 • 双击:打开 • 拖动:重新布局" }, graph: { levelTitle: "第 {{depth}} 层", levelBadge: "L{{depth}}", instructions: "单击节点查看详情;滚轮缩放,拖拽平移。" }, list: { specsTitle: "规范列表 ({{count}})", relationshipsTitle: "关系 ({{count}})", noRelationships: "尚无依赖或被依赖关系。添加 depends_on 或 required_by 来可视化。", dependsOn: "↓ 依赖", requiredBy: "↑ 被依赖" }, actions: { goToSpecs: "前往规范列表" }, sidebar: { emptyTitle: "请选择一个规范", emptyDescription: "点击节点即可查看它的依赖关系", openSpec: "打开规范 →", dependsOnHeading: "上游依赖 ({{count}})", requiredByHeading: "下游被依赖 ({{count}})", emptyUpstream: "没有上游依赖", emptyDownstream: "没有下游依赖此规范", depth: { direct: "直接关系", level: "第 {{depth}} 层" } } }, bwe = { changeStatus: "修改规范状态", statusSuccess: "状态已更新", statusError: "无法更新状态", draftSkipTitle: "跳过已计划阶段?", draftSkipDescription: "该规范仍处于草稿阶段。建议先移至已计划再开始工作,或强制跳过规划。", draftSkipPlanned: "先移至已计划", draftSkipForce: "仍然跳过", changePriority: "修改规范优先级", prioritySuccess: "优先级已更新", priorityError: "无法更新优先级", addTag: "新增标签", tagExists: "该标签已存在", tagsSuccess: "标签已更新", tagsError: "无法更新标签", searchTag: "搜索或创建标签...", noTagResults: "没有可用的标签。", existingTags: "已有标签", createSection: "创建新标签", createTag: "创建「{{tag}}」", removeTag: "移除 {{tag}} 标签" }, ywe = { tokens: "个令牌", status: "状态: {{status}}", statusLabels: { optimal: "最佳", good: "良好", warning: "警告", critical: "严重" }, clickForDetails: "点击查看详情", contextEconomy: "上下文效率", detailedBreakdown: "该规范的令牌使用详情。", composition: "组成结构", proseContent: "正文内容", frontmatter: "元数据", prose: "正文", codeBlocks: "代码块", checklists: "清单项", sectionBreakdown: "分区详情", performance: { optimal: "非常好!该规范对 AI 上下文非常高效。", good: "良好大小。在大多数模型的舒适范围内。", warning: "偏大。如果功能继续增长,建议考虑拆分。", critical: "过大。该规范消耗大量上下文,可能影响 AI 性能。" }, progressThresholds: { optimal: "最佳限制 (2k)", good: "良好限制 (3.5k)" }, progressTicks: { zero: "0", twoK: "2k", threePointFiveK: "3.5k", fiveKPlus: "5k+" } }, vwe = { status: { pass: "校验通过", warn: "校验警告", fail: "校验失败" }, passLabel: "通过", error: "个错误", errors: "个错误", errorsFound: "发现 {{count}} 个错误", validationLabel: "校验: {{label}}", clickForDetails: "点击查看详情", dialog: { title: "校验: {{specName}}", passTitle: "规范已通过校验", passBody: "该规范符合 LeanSpec 质量标准与结构要求。", passDescription: "所有质量检查均已通过。", errorDescription: "发现 {{count}} 个需要关注的错误。", suggestion: "建议:", line: "第 {{line}} 行", loading: "正在加载校验详情..." } }, xwe = { close: "关闭", newSpec: { title: "创建新规范", description: "通过 LeanSpec CLI 在当前项目中生成新的规范。", slugLabel: "Spec slug", slugPlaceholder: "例如 desktop-native-menu", titleLabel: "显示标题(可选)", titlePlaceholder: "便于识别的标题", commandLabel: "CLI 命令", commandPlaceholder: "输入 Spec slug 即可预览命令…", hint: "在 {{project}}(或项目根目录)执行该命令即可生成规范文件。", projectFallback: "项目根目录", copyButton: "复制命令", copied: "已复制" }, shortcuts: { title: "键盘快捷键", description: "原生菜单与这些快捷键保持同步。", sections: { global: "桌面外壳", view: "视图", help: "帮助" }, items: { toggleWindow: "显示/隐藏桌面窗口", quickSwitch: "打开项目切换器", newSpec: "创建新规范", refreshProjects: "刷新项目", toggleSidebar: "切换侧边栏", quickFind: "查找规范", shortcuts: "显示快捷键", docs: "打开文档" } }, logs: { title: "桌面日志", description: "日志仅保存在本机,报告问题时可以分享。", pathLabel: "日志目录", pathPlaceholder: "正在等待桌面应用返回日志路径…", hint: "也可以在原生菜单中选择 Help → View Logs。", copyPath: "复制路径", openButton: "打开日志文件夹" }, about: { title: "关于 LeanSpec Desktop", description: "LeanSpec UI + 原生集成,专为多项目与自动化场景打造。", version: "版本", website: "网站", support: "支持" } }, wwe = { title: "文件", description: "浏览项目源代码文件。", loading: "加载文件中...", loadingFile: "加载文件内容...", emptyDirectory: "此目录为空。", selectFile: "选择文件以查看其内容。", binaryFile: "无法显示二进制文件。", fileTooLarge: "文件过大,无法显示(最大 1 MB)。", lines: "{{count}} 行", bytes: "{{size}} 字节", copyPath: "复制路径", pathCopied: "路径已复制!", searchPlaceholder: "搜索文件...", clearSearch: "清除搜索", noSearchResults: "没有匹配的文件。", closeTab: "关闭标签", errors: { loadFailed: "加载目录失败。", fileFailed: "加载文件失败。" } }, Ewe = {
66338
+ openai`, env: "ANTHROPIC_API_KEY=${ANTHROPIC_API_KEY}" }, errors: { noProject: "需要项目路径才能管理运行器。", loadFailed: "加载运行器失败。", saveFailed: "保存运行器失败。", deleteFailed: "删除运行器失败。", validateFailed: "校验运行器失败。", defaultFailed: "设置默认运行器失败。", idRequired: "ID 为必填项", idExists: "此 ID 已存在", idInvalid: "ID 只能包含小写字母、数字和连字符", commandRequired: "命令为必填项", envInvalid: "每行环境变量必须为 KEY=VALUE" }, customModel: "自定义", useCustomModel: '使用 "{{model}}"', clearModel: "清除模型", noModelsFound: "输入模型名称", searchPlaceholder: "搜索运行器...", noResults: "没有符合筛选条件的运行器", sort: { name: "名称", available: "可用优先" }, filters: { status: "状态", showUnavailable: "显示不可用", showIdeRunners: "显示 IDE 运行器", source: "来源", allSources: "全部来源", builtin: "内置", custom: "自定义" }, filteredCount: "{{filtered}} / {{total}} 个运行器" }, appearance: { theme: "主题", themeDescription: "选择 LeanSpec 的外观", light: "浅色", lightDescription: "经典浅色主题", dark: "深色", darkDescription: "柔和护眼", system: "跟随系统", systemDescription: "匹配系统偏好", displayMode: "显示模式", displayModeDescription: "选择布局宽度", normal: "标准", normalDescription: "居中最大宽度", wide: "宽屏", wideDescription: "全宽显示", language: "语言", languageDescription: "选择你的首选语言", selectLanguage: "选择语言" } }, qxe = { light: "浅色", dark: "深色", system: "跟随系统", toggleTheme: "切换主题" }, jxe = { toggle: "切换布局模式", normal: "标准", wide: "宽屏" }, Gxe = { english: "English", chinese: "中文", changeLanguage: "切换语言" }, Kxe = { project: "项目", projects: "项目", switchProject: "切换项目", createProject: "创建项目", manageProjects: "管理项目", selectProject: "选择项目", description: "管理你的 LeanSpec 工作区。", colorLabel: "颜色", validationFailed: "校验失败", newProject: "新建项目", backTo: "返回 {{projectName}}", rename: "重命名", projectColor: "项目颜色", favorite: "收藏", unfavorite: "取消收藏", validatePath: "校验路径", specs: "规范数", completion: "完成度", local: "本地", noProjectsFound: "未找到项目", getStarted: "开始创建您的第一个 LeanSpec 项目。", searchPlaceholder: "搜索项目...", errors: { load: "无法加载项目", switch: "无法切换项目", noProjectSelected: "未选择项目,请先选择或创建一个项目。" } }, Yxe = { title: "项目", machineDescription: "来自 {{machine}} 的同步项目。", description: "管理你的 LeanSpec 工作区。" }, Xxe = { title: "设备", description: "管理已连接的 Sync Bridge 设备。", available: "可用设备", empty: "暂时没有已连接的设备。", switcherLabel: "选择设备", noSelection: "请选择设备", projectsCount: "{{count}} 个项目", requestExecution: "请求执行", revoke: "撤销", unavailable: "设备不可用。请连接 Sync Bridge 后再编辑元数据。", status: { online: "在线", offline: "离线" } }, Zxe = { button: "快速搜索...", placeholder: "按标题、编号或标签搜索规范...", recentSearches: "最近搜索", filterHeading: "按标签筛选", filterPrefix: "筛选:", open: "打开快速搜索", noResults: "未找到结果", shortcut: { modifier: "⌘", key: "K" } }, Qxe = { switching: "正在切换...", placeholder: "选择项目...", searchPlaceholder: "搜索项目...", noProject: "未找到项目。" }, Jxe = { title: "键盘快捷键", items: { dashboard: "跳转到仪表板(首页)", specs: "跳转到规范列表", stats: "跳转到统计", dependencies: "跳转到依赖", settings: "跳转到设置", search: "聚焦搜索框", quickSearch: "打开快速搜索", toggleChat: "切换 AI 聊天", toggleChatSidebar: "切换 AI 聊天侧边栏", toggleSessionsPopover: "切换会话弹出层", newSession: "新建会话", focusChatInput: "聚焦聊天输入框", newConversation: "新建对话", viewHistory: "查看历史记录", closeChatSidebar: "关闭聊天侧边栏" } }, ewe = { title: "目录", open: "打开目录", onThisPage: "页面导航" }, twe = { multiSectionTitle: "此规范包含多个章节", multiSectionDescription: "使用下方标签切换概览和详细章节。" }, nwe = { pickColor: "选择颜色", selectColor: "选择颜色 {{color}}" }, rwe = { title: "添加项目", descriptionPicker: "浏览并选择项目目录。", descriptionManual: "请输入本地项目目录的绝对路径。", enterManually: "手动输入路径", pathLabel: "项目路径", pathPlaceholder: "/path/to/your/project", pathHelp: "选择项目根目录。", pathRequired: "项目路径为必填项", browseFolders: "浏览文件夹", action: "添加项目", adding: "正在添加...", toastSuccess: "项目添加成功", toastError: "无法添加项目" }, iwe = { action: "选择此文件夹", parent: "返回上级目录", rootAction: "返回根目录", root: "根目录", empty: "空目录", error: "无法列出目录" }, awe = { title: "全部规范", searchPlaceholder: "搜索规范...", empty: "没有匹配的规范", collapse: "收起侧边栏", expand: "展开侧边栏" }, swe = { searchPlaceholder: "搜索会话...", noResults: "没有匹配的会话", collapse: "收起侧边栏", expand: "展开侧边栏" }, owe = { title: "规范列表", searchPlaceholder: "搜索规范...", clearSearch: "清除搜索", noResults: "没有匹配的规范", filtersLabel: "筛选", toggleFilters: { show: "展开筛选", hide: "收起筛选" }, clearFilters: "重置", status: "状态", priority: "优先级", tags: "标签", selected: "已选", select: { status: { label: "状态", all: "全部状态" }, priority: { label: "优先级", all: "全部优先级" }, tag: { label: "标签", all: "全部标签" } }, badges: { subSpecs: "+{{count}} 个文件" }, switchToTree: "切换到树形视图", switchToList: "切换到列表视图", showArchived: "显示已归档", hideArchived: "隐藏已归档", sort: { label: "排序", newest: "最新优先", oldest: "最早优先", updated: "最近更新", titleAsc: "标题 (A-Z)", titleDesc: "标题 (Z-A)", priorityHigh: "优先级(高→低)", priorityLow: "优先级(低→高)" }, expandAll: "展开全部", collapseAll: "折叠全部", searchTags: "搜索标签...", noTagsFound: "未找到标签" }, lwe = { title: "规范列表", description: "浏览并管理项目中的所有规范。", count: "共 {{count}} 个规范", views: { list: "列表", board: "看板", listTooltip: "列表视图", boardTooltip: "看板视图" }, wideMode: { enter: "进入宽屏模式", exit: "退出宽屏模式" }, searchPlaceholder: "搜索标题、内容、标签...", searchHint: "在规范标题、内容和标签中搜索", filters: { status: "状态", priority: "优先级", sort: "排序", statusAll: "全部状态", priorityAll: "全部优先级", groupByParent: "按父级分组", withErrors: "有校验错误", showArchived: "显示已归档", hideArchived: "隐藏已归档", settings: "设置", filteredCount: "{{filtered}} / {{total}} 个规范", showingAll: "显示全部 {{count}} 个会话", showingFiltered: "显示 {{count}} / {{total}} 个会话", sortOptions: { "id-desc": "最新优先", "id-asc": "最早优先", "updated-desc": "最近更新", "title-asc": "标题 (A-Z)", "priority-desc": "优先级(紧急 → 低)", "priority-asc": "优先级(低 → 紧急)" } }, metadata: { updated: "更新于 {{time}}", files: "+{{count}} 个文件", dependencies: "{{count}} 个依赖", none: "暂无元信息" }, list: { empty: "没有匹配的规范" }, board: { dropHere: "拖放到此移动规范", updating: "正在更新...", archivedCollapsed: "已归档" }, toasts: { statusUpdated: "已将 {{spec}} 移动到 {{status}}", statusError: "无法更新状态,请稍后重试。" }, state: { errorTitle: "无法加载规范", errorDescription: "请重试或刷新项目。", noSpecsTitle: "暂无规范", noSpecsDescription: "未找到任何规范。请在 LeanSpec 工作区添加后刷新。", noFiltersTitle: "没有匹配当前筛选条件的规范", noFiltersDescription: "尝试清除筛选条件或调整搜索。" }, buttons: { refreshList: "刷新列表", reloadData: "重新加载" } }, cwe = { toggleSidebar: "展开或收起规范列表", codeBlock: { label: "代码", copy: "复制代码", copyToClipboard: "复制到剪贴板" }, table: { copyTsv: "复制为 TSV(Excel)", exportCsv: "导出为 CSV", defaultFileName: "table-export.csv" }, metadata: { created: "创建时间", updated: "更新时间", name: "名称", assignee: "责任人", notAvailable: "暂无", source: "来源", viewOnGitHub: "在 GitHub 查看" }, buttons: { viewTimeline: "查看时间线", viewDependencies: "查看依赖", viewHierarchy: "查看层级", focus: "专注模式", exitFocus: "退出专注模式" }, dialogs: { timelineTitle: "规范时间线", timelineDescription: "查看创建、更新和完成节点。", dependenciesTitle: "依赖关系图", dependenciesDescription: "展示前置关系与关联规范。", dependenciesLink: "在依赖页面中查看", hierarchyTitle: "规范层级", hierarchyDescription: "父子规范的层级关系。" }, hierarchy: { parent: "父规范", current: "当前规范", children: "子规范", noRelationships: "此规范没有父子层级关系。" }, tabs: { overview: "概览" }, state: { loading: "正在加载...", error: "无法加载规范", unavailableTitle: "规范无法访问", unavailableDescription: "无法找到该规范,可能已被移动或删除。" }, dependencies: { dependsOn: "依赖", requiredBy: "被依赖" }, links: { backToSpecs: "返回规范列表", reportIssue: "报告问题" } }, uwe = { title: "项目统计", description: "查看项目的整体指标与洞察", tokenDistribution: { title: "Token 分布", empty: "暂无 Token 数据。", unknown: "{{count}} 个规范缺少 Token 数据", buckets: { optimal: "最佳", good: "良好", warning: "偏大", critical: "严重" } }, cards: { total: { title: "规范总数", subtitle: "全部规范" }, completed: { title: "已完成", subtitle: "完成率" }, inProgress: { title: "进行中", subtitle: "活跃中的工作" }, planned: { title: "已计划", subtitle: "即将开始的工作" } }, charts: { status: { title: "状态分布", description: "按状态划分的规范数量" }, priority: { title: "优先级分布", description: "按优先级划分的规范数量" }, creation: { title: "创建趋势", description: "最近新建的规范数量走势" }, topTags: { title: "热门标签", description: "使用最频繁的标签" }, label: "{{name}}:{{value}}" }, state: { errorTitle: "无法加载统计数据", errorDescription: "请重试或刷新项目。", unknownError: "未知错误" } }, dwe = { title: "仪表板", subtitle: "项目概览与近期活动", subtitleWithProject: "{{projectName}} — 概览与近期活动", cards: { total: "规范总数", planned: "已计划", inProgress: "进行中", completed: "已完成", completionRate: "{{rate}}% 完成率" }, recentlyAdded: "最近添加", plannedSection: "已计划 ({{count}})", inProgressSection: "进行中 ({{count}})", noPlanned: "暂无已计划的规范", noInProgress: "暂无进行中的规范", recentActivity: "最近活动", quickActions: "快捷操作", viewAllSpecs: "查看所有规范", viewStats: "查看统计", actionUpdated: "已更新", state: { errorTitle: "无法加载仪表板", errorDescription: "请刷新页面或稍后再试。" } }, hwe = { title: "项目上下文", description: "查看驱动 AI 工具与开发流程的项目级上下文文件", copyAll: "复制全部", copyAllSuccess: "已复制!", searchPlaceholder: "在上下文文件中搜索...", searchNoMatches: "没有找到包含「{{query}}」的内容", summary: { totalTokens: "共 {{formattedCount}} 个 Token", contextBudget: "用于 AI 工具的上下文预算" }, badges: { matchesSingular: "{{count}} 个匹配", matchesPlural: "{{count}} 个匹配", matchesFoundSingular: "找到 {{count}} 个匹配", matchesFoundPlural: "找到 {{count}} 个匹配", filesSingular: "{{count}} 个文件", filesPlural: "{{count}} 个文件", filesFiltered: "{{count}}/{{total}} 个文件", tokens: "{{formattedCount}} 个 Token" }, sections: { agents: { title: "Agent 指令", description: "提供给 AI Agent 的系统提示与使用指南", empty: "当前没有 Agent 指令", suggestion: "在项目根目录创建 AGENTS.md" }, config: { title: "配置", description: "LeanSpec 项目配置与设置", empty: "没有找到配置文件", suggestion: "运行 'leanspec init' 生成配置文件" }, docs: { title: "项目文档", description: "README、贡献指南与变更日志", empty: "没有找到项目文档", suggestion: "在项目根目录创建 README.md" } }, emptyState: { title: "未检测到项目上下文", description: "该项目暂未配置任何上下文文件,AI Agent 无法了解项目背景。", suggestion: "先创建 AGENTS.md 或执行 'leanspec init'" }, search: { noMatchesTitle: "未找到匹配项", noMatchesDescription: "试试其他关键词", noFilesDescription: "该分类下没有文件" }, viewer: { modified: "更新于 {{date}}", lines: "{{count}} 行", viewFull: "查看全页", openInEditor: "在 VS Code 中打开", copyContent: "复制内容", tokenStatus: { optimal: "最佳", good: "良好", large: "偏大", veryLarge: "非常大" } }, detail: { back: "返回", openInEditor: "在编辑器中打开", copy: "复制", copySuccess: "已复制!", defaultFileType: "文本", lines: "{{count}} 行", modified: "更新于 {{date}}", size: "大小 {{size}} KB", selectFile: "选择文件以查看内容" }, errors: { list: "无法加载上下文文件", file: "无法加载文件", loadFailed: "无法加载项目上下文", noProject: "未选择项目", noProjectDescription: "请选择或创建一个项目以查看其上下文文件。" } }, pwe = { events: { created: "创建", inProgress: "进行中", complete: "已完成", archived: "已归档" }, state: { awaiting: "等待开始", queued: "排队中", pending: "等待更新" } }, fwe = { clickToEnlarge: "点击放大图表" }, mwe = { header: { title: "依赖地图", subtitle: "探索前置工作与关联项", badge: "React Flow DAG" }, badges: { current: "当前规范", currentSubtitle: "本规范", dependsOn: "依赖", dependsOnSubtitle: "必须先完成", requiredBy: "被依赖", requiredBySubtitle: "受此规范阻塞" }, statusSubtitles: { completed: "已完成", inProgress: "进行中", plannedBlocking: "必须先完成", plannedCanProceed: "可以继续", archived: "已归档" } }, gwe = { title: "依赖关系", description: "可视化项目内规范的关联关系。", header: { title: "依赖关系图", specTitle: "{{specName}} 的依赖", allTitle: "所有依赖", countSummary: "{{specs}} 个规范,{{relationships}} 条关系", summary: { connected: "{{count}} 个规范存在依赖", standalone: "{{count}} 个独立项", none: "暂未配置依赖关系" } }, selector: { placeholder: "选择要高亮的规范...", filterPlaceholder: "输入以筛选...", clearSelection: "清除选择", empty: "没有匹配的规范" }, filters: { showStandalone: "显示独立项 ({{count}})", compact: "紧凑视图", focusMode: "焦点模式", clear: "重置", count: "({{count}})" }, view: { graph: "图", list: "列表" }, state: { loading: "正在加载依赖...", errorTitle: "无法加载依赖", errorDescription: "请检查网络后重试。" }, empty: { title: "暂无依赖可显示", filters: "没有规范满足当前筛选条件", standaloneHint: "开启「显示独立项」即可查看未建立依赖的规范", noDependencies: "暂无依赖", noDependenciesDescription: "找到了规范,但尚未设置依赖关系。添加 depends_on 以查看依赖图。" }, legend: { dependsOn: "依赖方向(箭头表示指向)", instructions: "点击:选中 • 双击:打开 • 拖动:重新布局" }, graph: { levelTitle: "第 {{depth}} 层", levelBadge: "L{{depth}}", instructions: "单击节点查看详情;滚轮缩放,拖拽平移。" }, list: { specsTitle: "规范列表 ({{count}})", relationshipsTitle: "关系 ({{count}})", noRelationships: "尚无依赖或被依赖关系。添加 depends_on 或 required_by 来可视化。", dependsOn: "↓ 依赖", requiredBy: "↑ 被依赖" }, actions: { goToSpecs: "前往规范列表" }, sidebar: { emptyTitle: "请选择一个规范", emptyDescription: "点击节点即可查看它的依赖关系", openSpec: "打开规范 →", dependsOnHeading: "上游依赖 ({{count}})", requiredByHeading: "下游被依赖 ({{count}})", emptyUpstream: "没有上游依赖", emptyDownstream: "没有下游依赖此规范", depth: { direct: "直接关系", level: "第 {{depth}} 层" } } }, bwe = { changeStatus: "修改规范状态", statusSuccess: "状态已更新", statusError: "无法更新状态", draftSkipTitle: "跳过已计划阶段?", draftSkipDescription: "该规范仍处于草稿阶段。建议先移至已计划再开始工作,或强制跳过规划。", draftSkipPlanned: "先移至已计划", draftSkipForce: "仍然跳过", changePriority: "修改规范优先级", prioritySuccess: "优先级已更新", priorityError: "无法更新优先级", addTag: "新增标签", tagExists: "该标签已存在", tagsSuccess: "标签已更新", tagsError: "无法更新标签", searchTag: "搜索或创建标签...", noTagResults: "没有可用的标签。", existingTags: "已有标签", createSection: "创建新标签", createTag: "创建「{{tag}}」", removeTag: "移除 {{tag}} 标签" }, ywe = { tokens: "个令牌", status: "状态: {{status}}", statusLabels: { optimal: "最佳", good: "良好", warning: "警告", critical: "严重" }, clickForDetails: "点击查看详情", contextEconomy: "上下文效率", detailedBreakdown: "该规范的令牌使用详情。", composition: "组成结构", proseContent: "正文内容", frontmatter: "元数据", prose: "正文", codeBlocks: "代码块", checklists: "清单项", sectionBreakdown: "分区详情", performance: { optimal: "非常好!该规范对 AI 上下文非常高效。", good: "良好大小。在大多数模型的舒适范围内。", warning: "偏大。如果功能继续增长,建议考虑拆分。", critical: "过大。该规范消耗大量上下文,可能影响 AI 性能。" }, progressThresholds: { optimal: "最佳限制 (2k)", good: "良好限制 (3.5k)" }, progressTicks: { zero: "0", twoK: "2k", threePointFiveK: "3.5k", fiveKPlus: "5k+" } }, vwe = { status: { pass: "校验通过", warn: "校验警告", fail: "校验失败" }, passLabel: "通过", error: "个错误", errors: "个错误", errorsFound: "发现 {{count}} 个错误", validationLabel: "校验: {{label}}", clickForDetails: "点击查看详情", dialog: { title: "校验: {{specName}}", passTitle: "规范已通过校验", passBody: "该规范符合 LeanSpec 质量标准与结构要求。", passDescription: "所有质量检查均已通过。", errorDescription: "发现 {{count}} 个需要关注的错误。", suggestion: "建议:", line: "第 {{line}} 行", loading: "正在加载校验详情..." } }, xwe = { close: "关闭", newSpec: { title: "创建新规范", description: "通过 LeanSpec CLI 在当前项目中生成新的规范。", slugLabel: "Spec slug", slugPlaceholder: "例如 desktop-native-menu", titleLabel: "显示标题(可选)", titlePlaceholder: "便于识别的标题", commandLabel: "CLI 命令", commandPlaceholder: "输入 Spec slug 即可预览命令…", hint: "在 {{project}}(或项目根目录)执行该命令即可生成规范文件。", projectFallback: "项目根目录", copyButton: "复制命令", copied: "已复制" }, shortcuts: { title: "键盘快捷键", description: "原生菜单与这些快捷键保持同步。", sections: { global: "桌面外壳", view: "视图", help: "帮助" }, items: { toggleWindow: "显示/隐藏桌面窗口", quickSwitch: "打开项目切换器", newSpec: "创建新规范", refreshProjects: "刷新项目", toggleSidebar: "切换侧边栏", quickFind: "查找规范", shortcuts: "显示快捷键", docs: "打开文档" } }, logs: { title: "桌面日志", description: "日志仅保存在本机,报告问题时可以分享。", pathLabel: "日志目录", pathPlaceholder: "正在等待桌面应用返回日志路径…", hint: "也可以在原生菜单中选择 Help → View Logs。", copyPath: "复制路径", openButton: "打开日志文件夹" }, about: { title: "关于 LeanSpec Desktop", description: "LeanSpec UI + 原生集成,专为多项目与自动化场景打造。", version: "版本", website: "网站", support: "支持" } }, wwe = { title: "文件", description: "浏览项目源代码文件。", loading: "加载文件中...", loadingFile: "加载文件内容...", emptyDirectory: "此目录为空。", selectFile: "选择文件以查看其内容。", binaryFile: "无法显示二进制文件。", fileTooLarge: "文件过大,无法显示(最大 1 MB)。", lines: "{{count}} 行", bytes: "{{size}} 字节", copyPath: "复制路径", pathCopied: "路径已复制!", searchPlaceholder: "搜索文件...", clearSearch: "清除搜索", noSearchResults: "没有匹配的文件。", closeTab: "关闭标签", errors: { loadFailed: "加载目录失败。", fileFailed: "加载文件失败。" } }, Ewe = {
66339
66339
  navigation: Lxe,
66340
66340
  search: Ixe,
66341
66341
  status: Mxe,