@deepseek-insight/dsi 0.5.38 → 0.6.1

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 (43) hide show
  1. package/.agents/skills/dsi-plugin-rack/SKILL.md +27 -0
  2. package/.agents/skills/dsi-plugin-rack/rack.mjs +237 -0
  3. package/README.md +27 -3
  4. package/bin/dsi.mjs +89 -2
  5. package/bin/lib/plugin-chain.mjs +86 -0
  6. package/build/client/_app/immutable/assets/{2.B3K-kE1m.css → 2.DEBHmc3y.css} +1 -1
  7. package/build/client/_app/immutable/chunks/BVBc9rJx.js +2 -0
  8. package/build/client/_app/immutable/chunks/BdHmBwz-.js +1 -0
  9. package/build/client/_app/immutable/chunks/{8isMKkmK.js → DNY2-FaC.js} +1 -1
  10. package/build/client/_app/immutable/chunks/oLHjdJ-M.js +1 -0
  11. package/build/client/_app/immutable/entry/{app.CpbSsqDG.js → app.C1j_PXOJ.js} +2 -2
  12. package/build/client/_app/immutable/entry/start.Dyarj9we.js +1 -0
  13. package/build/client/_app/immutable/nodes/{1.C4SBbU1i.js → 1.DB7DKw94.js} +1 -1
  14. package/build/client/_app/immutable/nodes/{2.C1u8HG5a.js → 2.D9qSqOKy.js} +195 -195
  15. package/build/client/_app/version.json +1 -1
  16. package/build/handler.js +4 -4
  17. package/build/index.js +4 -4
  18. package/build/server/chunks/chunks/engine.js-CrdWRSwf.js +97 -0
  19. package/build/server/chunks/chunks/{engine.js-BRoFbCnL.js → engine2.js-BRoFbCnL.js} +1 -1
  20. package/build/server/chunks/chunks/{internal.js-D0IzcQru.js → internal.js-Ca_6TJ1k.js} +2 -2
  21. package/build/server/chunks/chunks/{state.js-BeFSJ3AU.js → state.js-BrbF5k84.js} +2 -2
  22. package/build/server/chunks/entries/endpoints/api/plugins/apply/_server.ts.js-CpO--Jwf.js +125 -0
  23. package/build/server/chunks/entries/endpoints/api/plugins/reload/_server.ts.js-U8vRgx7E.js +34 -0
  24. package/build/server/chunks/entries/endpoints/api/plugins/snapshot/_server.ts.js-9Ezy2OeQ.js +36 -0
  25. package/build/server/chunks/entries/endpoints/api/skills/install/{_server.ts.js-DijnCqgt.js → _server.ts.js-DyzPF_Z5.js} +2 -2
  26. package/build/server/chunks/entries/endpoints/api/skills/reload/{_server.ts.js-Cqig6BdK.js → _server.ts.js-BUnCt45D.js} +2 -2
  27. package/build/server/chunks/entries/endpoints/api/skills/reload/cancel/{_server.ts.js-CGlFnmuI.js → _server.ts.js-DT52g6_a.js} +2 -2
  28. package/build/server/chunks/entries/endpoints/api/skills/snapshot/{_server.ts.js-p7P1CFjG.js → _server.ts.js-CaBD0w0v.js} +2 -2
  29. package/build/server/chunks/entries/endpoints/api/skills/uninstall/{_server.ts.js-h5IfIfov.js → _server.ts.js-D_NXkZEr.js} +2 -2
  30. package/build/server/chunks/entries/pages/{_error.svelte.js-C5-GtTAX.js → _error.svelte.js-C9GhKb8G.js} +3 -3
  31. package/build/server/chunks/entries/pages/{_page.svelte.js-DoOQ17mk.js → _page.svelte.js-6A1VYbL2.js} +1114 -104
  32. package/build/server/chunks/{handler-UO5maDaQ.js → handler-ChXGVK9Y.js} +3 -3
  33. package/build/server/chunks/{index.js-sK5zTj9E.js → index.js-5P_bGLRx.js} +2 -2
  34. package/build/server/chunks/{manifest.js-DdUlckhQ.js → manifest.js-B3ooI-FL.js} +30 -9
  35. package/build/server/chunks/nodes/1.js-Dcb4_Gzq.js +9 -0
  36. package/build/server/chunks/nodes/{2.js-ClaC6DDN.js → 2.js-C4WQL8rj.js} +4 -4
  37. package/package.json +1 -1
  38. package/template/.dsi/resources/plugins-reff.md +4 -0
  39. package/build/client/_app/immutable/chunks/DaJQaZs4.js +0 -1
  40. package/build/client/_app/immutable/chunks/vqHvFU33.js +0 -2
  41. package/build/client/_app/immutable/chunks/y7n0suOs.js +0 -1
  42. package/build/client/_app/immutable/entry/start.CNrTX-th.js +0 -1
  43. package/build/server/chunks/nodes/1.js-CKpJoUo-.js +0 -9
@@ -1,4 +1,4 @@
1
- import { c as onDestroy, d as __exportAll } from '../../chunks/internal.js-D0IzcQru.js';
1
+ import { c as onDestroy, d as __exportAll } from '../../chunks/internal.js-Ca_6TJ1k.js';
2
2
  import { V as head, y as derived, X as bind_props, W as escape_html, Y as attr, Z as attr_style, _ as attr_class, x as setContext, $ as spread_props, a0 as attributes, a1 as clsx, a2 as ensure_array_like, a3 as element, J as getContext, a4 as stringify, a5 as html, F as run, a6 as props_id } from '../../chunks/server.js-11-pxAWV.js';
3
3
  import { U as UI_LOCALES } from '../../chunks/config.js-B0w1-uCA.js';
4
4
  import { m as mergeEntries, c as collapseSystemPromptEntries, t as truncate } from '../../chunks/dsh-events.js-CyvSb4O3.js';
@@ -7,7 +7,7 @@ import { b as applyKnobEvent, E as EMPTY_KNOBS, r as resolvePermission, l as loc
7
7
  import { D as DEFAULT_IMAGE_LIMITS } from '../../chunks/image-limits.js-CUdJ0f7r.js';
8
8
  import { a as appConfig, t as triggerMode, g as getTrigger, p as previewSegments, i as isValidTagWord, b as textPreviewOf, s as searchKey, c as shouldRecordPrompt, d as parseTagWords } from '../../chunks/app-config.svelte.js-BBPHOX4N.js';
9
9
  import { c as getLocale } from '../../chunks/runtime.js-CCJi3XaY.js';
10
- import { p as page, a as afterNavigate, t, c as replaceState, e as currentLocale, u as unexpectederror1, s as sessionnotfound2, r as reapednote1, d as dshunreachable1, b as backtoworkspace2 } from '../../chunks/state.js-BeFSJ3AU.js';
10
+ import { p as page, a as afterNavigate, t, c as replaceState, e as currentLocale, u as unexpectederror1, s as sessionnotfound2, r as reapednote1, d as dshunreachable1, b as backtoworkspace2 } from '../../chunks/state.js-BrbF5k84.js';
11
11
  import 'yaml';
12
12
  import 'html-to-image';
13
13
  import hljs from 'highlight.js/lib/core';
@@ -1750,6 +1750,166 @@ var commandhelp1 = ((inputs = {}, options = {}) => {
1750
1750
  return en_commandhelp1();
1751
1751
  });
1752
1752
  //#endregion
1753
+ //#region src/lib/paraglide/messages/commandhelppluginrackexamplebare4.js
1754
+ /** @typedef {import('../runtime.js').LocalizedString} LocalizedString */
1755
+ /** @typedef {{}} Commandhelppluginrackexamplebare4Inputs */
1756
+ var en_commandhelppluginrackexamplebare4 = () => {
1757
+ return `Opens the rack - install or uninstall with one click per row.`;
1758
+ };
1759
+ var zh_commandhelppluginrackexamplebare4 = () => {
1760
+ return `打开插件架 - 每行一键安装或卸载。`;
1761
+ };
1762
+ var id_commandhelppluginrackexamplebare4 = () => {
1763
+ return `Membuka rak - instal atau copot dengan satu klik per baris.`;
1764
+ };
1765
+ var es_commandhelppluginrackexamplebare4 = () => {
1766
+ return `Abre el rack: instala o desinstala con un clic por fila.`;
1767
+ };
1768
+ /**
1769
+ * | output |
1770
+ * | --- |
1771
+ * | "Opens the rack - install or uninstall with one click per row." |
1772
+ *
1773
+ * @param {Commandhelppluginrackexamplebare4Inputs} inputs
1774
+ * @param {{ locale?: "en" | "zh" | "id" | "es" }} options
1775
+ * @returns {LocalizedString}
1776
+ */
1777
+ var commandhelppluginrackexamplebare4 = ((inputs = {}, options = {}) => {
1778
+ const locale = options.locale ?? getLocale();
1779
+ if (locale === "zh") return zh_commandhelppluginrackexamplebare4();
1780
+ if (locale === "id") return id_commandhelppluginrackexamplebare4();
1781
+ if (locale === "es") return es_commandhelppluginrackexamplebare4();
1782
+ return en_commandhelppluginrackexamplebare4();
1783
+ });
1784
+ //#endregion
1785
+ //#region src/lib/paraglide/messages/commandhelppluginrackexamplehelp4.js
1786
+ /** @typedef {import('../runtime.js').LocalizedString} LocalizedString */
1787
+ /** @typedef {{}} Commandhelppluginrackexamplehelp4Inputs */
1788
+ var en_commandhelppluginrackexamplehelp4 = () => {
1789
+ return `Prints this help card.`;
1790
+ };
1791
+ var zh_commandhelppluginrackexamplehelp4 = () => {
1792
+ return `打印此帮助卡片。`;
1793
+ };
1794
+ var id_commandhelppluginrackexamplehelp4 = () => {
1795
+ return `Mencetak kartu bantuan ini.`;
1796
+ };
1797
+ var es_commandhelppluginrackexamplehelp4 = () => {
1798
+ return `Imprime esta tarjeta de ayuda.`;
1799
+ };
1800
+ /**
1801
+ * | output |
1802
+ * | --- |
1803
+ * | "Prints this help card." |
1804
+ *
1805
+ * @param {Commandhelppluginrackexamplehelp4Inputs} inputs
1806
+ * @param {{ locale?: "en" | "zh" | "id" | "es" }} options
1807
+ * @returns {LocalizedString}
1808
+ */
1809
+ var commandhelppluginrackexamplehelp4 = ((inputs = {}, options = {}) => {
1810
+ const locale = options.locale ?? getLocale();
1811
+ if (locale === "zh") return zh_commandhelppluginrackexamplehelp4();
1812
+ if (locale === "id") return id_commandhelppluginrackexamplehelp4();
1813
+ if (locale === "es") return es_commandhelppluginrackexamplehelp4();
1814
+ return en_commandhelppluginrackexamplehelp4();
1815
+ });
1816
+ //#endregion
1817
+ //#region src/lib/paraglide/messages/commandhelppluginrackexamplereload4.js
1818
+ /** @typedef {import('../runtime.js').LocalizedString} LocalizedString */
1819
+ /** @typedef {{}} Commandhelppluginrackexamplereload4Inputs */
1820
+ var en_commandhelppluginrackexamplereload4 = () => {
1821
+ return `Rebuilds the rack snapshot first (fresh numbering, fresh installed flags).`;
1822
+ };
1823
+ var zh_commandhelppluginrackexamplereload4 = () => {
1824
+ return `先重建插件架快照(全新编号、全新安装状态)。`;
1825
+ };
1826
+ var id_commandhelppluginrackexamplereload4 = () => {
1827
+ return `Membangun ulang snapshot rak lebih dulu (penomoran baru, status terpasang baru).`;
1828
+ };
1829
+ var es_commandhelppluginrackexamplereload4 = () => {
1830
+ return `Reconstruye primero el snapshot del rack (numeración y estados de instalación recientes).`;
1831
+ };
1832
+ /**
1833
+ * | output |
1834
+ * | --- |
1835
+ * | "Rebuilds the rack snapshot first (fresh numbering, fresh installed flags)." |
1836
+ *
1837
+ * @param {Commandhelppluginrackexamplereload4Inputs} inputs
1838
+ * @param {{ locale?: "en" | "zh" | "id" | "es" }} options
1839
+ * @returns {LocalizedString}
1840
+ */
1841
+ var commandhelppluginrackexamplereload4 = ((inputs = {}, options = {}) => {
1842
+ const locale = options.locale ?? getLocale();
1843
+ if (locale === "zh") return zh_commandhelppluginrackexamplereload4();
1844
+ if (locale === "id") return id_commandhelppluginrackexamplereload4();
1845
+ if (locale === "es") return es_commandhelppluginrackexamplereload4();
1846
+ return en_commandhelppluginrackexamplereload4();
1847
+ });
1848
+ //#endregion
1849
+ //#region src/lib/paraglide/messages/commandhelppluginrackparamreload4.js
1850
+ /** @typedef {import('../runtime.js').LocalizedString} LocalizedString */
1851
+ /** @typedef {{}} Commandhelppluginrackparamreload4Inputs */
1852
+ var en_commandhelppluginrackparamreload4 = () => {
1853
+ return `Force a snapshot rebuild from plugins-reff.md before the panel opens. Without it the cached rack snapshot is used as-is.`;
1854
+ };
1855
+ var zh_commandhelppluginrackparamreload4 = () => {
1856
+ return `在面板打开前从 plugins-reff.md 重建快照。不带它时按原样使用缓存的插件架快照。`;
1857
+ };
1858
+ var id_commandhelppluginrackparamreload4 = () => {
1859
+ return `Bangun ulang snapshot dari plugins-reff.md sebelum panel terbuka. Tanpa itu, snapshot rak yang tersimpan dipakai apa adanya.`;
1860
+ };
1861
+ var es_commandhelppluginrackparamreload4 = () => {
1862
+ return `Fuerza a reconstruir el snapshot desde plugins-reff.md antes de abrir el panel. Sin ella se usa el snapshot en caché tal cual.`;
1863
+ };
1864
+ /**
1865
+ * | output |
1866
+ * | --- |
1867
+ * | "Force a snapshot rebuild from plugins-reff.md before the panel opens. Without it the cached rack snapshot is used as-is." |
1868
+ *
1869
+ * @param {Commandhelppluginrackparamreload4Inputs} inputs
1870
+ * @param {{ locale?: "en" | "zh" | "id" | "es" }} options
1871
+ * @returns {LocalizedString}
1872
+ */
1873
+ var commandhelppluginrackparamreload4 = ((inputs = {}, options = {}) => {
1874
+ const locale = options.locale ?? getLocale();
1875
+ if (locale === "zh") return zh_commandhelppluginrackparamreload4();
1876
+ if (locale === "id") return id_commandhelppluginrackparamreload4();
1877
+ if (locale === "es") return es_commandhelppluginrackparamreload4();
1878
+ return en_commandhelppluginrackparamreload4();
1879
+ });
1880
+ //#endregion
1881
+ //#region src/lib/paraglide/messages/commandhelppluginracksummary3.js
1882
+ /** @typedef {import('../runtime.js').LocalizedString} LocalizedString */
1883
+ /** @typedef {{}} Commandhelppluginracksummary3Inputs */
1884
+ var en_commandhelppluginracksummary3 = () => {
1885
+ return `Opens the Plugin Rack panel (The Plugin Rack ADR, 2026-09-27): install and uninstall dsh plugins from the plugins reference. Every apply ends with the DSH restart chain - the floor bounces and the page re-attaches.`;
1886
+ };
1887
+ var zh_commandhelppluginracksummary3 = () => {
1888
+ return `打开插件架面板(The Plugin Rack ADR,2026-09-27):从插件参考安装/卸载 dsh 插件。每次应用都会触发 DSH 重启链 - 页面会短暂离开并自动恢复。`;
1889
+ };
1890
+ var id_commandhelppluginracksummary3 = () => {
1891
+ return `Membuka panel Rak Plugin (ADR The Plugin Rack, 2026-09-27): instal dan copot plugin dsh dari referensi plugin. Setiap penerapan diakhiri rantai restart DSH - lantai turun sejenak lalu halaman pulih sendiri.`;
1892
+ };
1893
+ var es_commandhelppluginracksummary3 = () => {
1894
+ return `Abre el panel Rack de plugins (ADR The Plugin Rack, 2026-09-27): instala y desinstala plugins de dsh desde la referencia de plugins. Cada aplicación termina con la cadena de reinicio de DSH: la página se va un momento y vuelve sola.`;
1895
+ };
1896
+ /**
1897
+ * | output |
1898
+ * | --- |
1899
+ * | "Opens the Plugin Rack panel (The Plugin Rack ADR, 2026-09-27): install and uninstall dsh plugins from the plugins reference. Every apply ends with the DSH re..." |
1900
+ *
1901
+ * @param {Commandhelppluginracksummary3Inputs} inputs
1902
+ * @param {{ locale?: "en" | "zh" | "id" | "es" }} options
1903
+ * @returns {LocalizedString}
1904
+ */
1905
+ var commandhelppluginracksummary3 = ((inputs = {}, options = {}) => {
1906
+ const locale = options.locale ?? getLocale();
1907
+ if (locale === "zh") return zh_commandhelppluginracksummary3();
1908
+ if (locale === "id") return id_commandhelppluginracksummary3();
1909
+ if (locale === "es") return es_commandhelppluginracksummary3();
1910
+ return en_commandhelppluginracksummary3();
1911
+ });
1912
+ //#endregion
1753
1913
  //#region src/lib/paraglide/messages/commandhelpskillshelfexamplebare4.js
1754
1914
  /** @typedef {import('../runtime.js').LocalizedString} LocalizedString */
1755
1915
  /** @typedef {{}} Commandhelpskillshelfexamplebare4Inputs */
@@ -7466,48 +7626,528 @@ var es_picksession1 = () => {
7466
7626
  * | --- |
7467
7627
  * | "Pick a session from the sidebar, or start one with + New chat." |
7468
7628
  *
7469
- * @param {Picksession1Inputs} inputs
7629
+ * @param {Picksession1Inputs} inputs
7630
+ * @param {{ locale?: "en" | "zh" | "id" | "es" }} options
7631
+ * @returns {LocalizedString}
7632
+ */
7633
+ var picksession1 = ((inputs = {}, options = {}) => {
7634
+ const locale = options.locale ?? getLocale();
7635
+ if (locale === "zh") return zh_picksession1();
7636
+ if (locale === "id") return id_picksession1();
7637
+ if (locale === "es") return es_picksession1();
7638
+ return en_picksession1();
7639
+ });
7640
+ //#endregion
7641
+ //#region src/lib/paraglide/messages/planmode1.js
7642
+ /** @typedef {import('../runtime.js').LocalizedString} LocalizedString */
7643
+ /** @typedef {{}} Planmode1Inputs */
7644
+ var en_planmode1 = () => {
7645
+ return `plan mode`;
7646
+ };
7647
+ var zh_planmode1 = () => {
7648
+ return `计划模式`;
7649
+ };
7650
+ var id_planmode1 = () => {
7651
+ return `mode rencana`;
7652
+ };
7653
+ var es_planmode1 = () => {
7654
+ return `modo plan`;
7655
+ };
7656
+ /**
7657
+ * | output |
7658
+ * | --- |
7659
+ * | "plan mode" |
7660
+ *
7661
+ * @param {Planmode1Inputs} inputs
7662
+ * @param {{ locale?: "en" | "zh" | "id" | "es" }} options
7663
+ * @returns {LocalizedString}
7664
+ */
7665
+ var planmode1 = ((inputs = {}, options = {}) => {
7666
+ const locale = options.locale ?? getLocale();
7667
+ if (locale === "zh") return zh_planmode1();
7668
+ if (locale === "id") return id_planmode1();
7669
+ if (locale === "es") return es_planmode1();
7670
+ return en_planmode1();
7671
+ });
7672
+ //#endregion
7673
+ //#region src/lib/paraglide/messages/pluginrackapplying2.js
7674
+ /** @typedef {import('../runtime.js').LocalizedString} LocalizedString */
7675
+ /** @typedef {{}} Pluginrackapplying2Inputs */
7676
+ var en_pluginrackapplying2 = () => {
7677
+ return `Applying — the floor will come back shortly.`;
7678
+ };
7679
+ var zh_pluginrackapplying2 = () => {
7680
+ return `正在应用 — 页面稍后会自动恢复。`;
7681
+ };
7682
+ var id_pluginrackapplying2 = () => {
7683
+ return `Menerapkan — lantai akan kembali sebentar lagi.`;
7684
+ };
7685
+ var es_pluginrackapplying2 = () => {
7686
+ return `Aplicando — la página volverá enseguida.`;
7687
+ };
7688
+ /**
7689
+ * | output |
7690
+ * | --- |
7691
+ * | "Applying — the floor will come back shortly." |
7692
+ *
7693
+ * @param {Pluginrackapplying2Inputs} inputs
7694
+ * @param {{ locale?: "en" | "zh" | "id" | "es" }} options
7695
+ * @returns {LocalizedString}
7696
+ */
7697
+ var pluginrackapplying2 = ((inputs = {}, options = {}) => {
7698
+ const locale = options.locale ?? getLocale();
7699
+ if (locale === "zh") return zh_pluginrackapplying2();
7700
+ if (locale === "id") return id_pluginrackapplying2();
7701
+ if (locale === "es") return es_pluginrackapplying2();
7702
+ return en_pluginrackapplying2();
7703
+ });
7704
+ //#endregion
7705
+ //#region src/lib/paraglide/messages/pluginrackby2.js
7706
+ /** @typedef {import('../runtime.js').LocalizedString} LocalizedString */
7707
+ /** @typedef {{}} Pluginrackby2Inputs */
7708
+ var en_pluginrackby2 = () => {
7709
+ return `by`;
7710
+ };
7711
+ var zh_pluginrackby2 = () => {
7712
+ return `作者:`;
7713
+ };
7714
+ var id_pluginrackby2 = () => {
7715
+ return `oleh`;
7716
+ };
7717
+ var es_pluginrackby2 = () => {
7718
+ return `por`;
7719
+ };
7720
+ /**
7721
+ * | output |
7722
+ * | --- |
7723
+ * | "by" |
7724
+ *
7725
+ * @param {Pluginrackby2Inputs} inputs
7726
+ * @param {{ locale?: "en" | "zh" | "id" | "es" }} options
7727
+ * @returns {LocalizedString}
7728
+ */
7729
+ var pluginrackby2 = ((inputs = {}, options = {}) => {
7730
+ const locale = options.locale ?? getLocale();
7731
+ if (locale === "zh") return zh_pluginrackby2();
7732
+ if (locale === "id") return id_pluginrackby2();
7733
+ if (locale === "es") return es_pluginrackby2();
7734
+ return en_pluginrackby2();
7735
+ });
7736
+ //#endregion
7737
+ //#region src/lib/paraglide/messages/pluginrackempty2.js
7738
+ /** @typedef {import('../runtime.js').LocalizedString} LocalizedString */
7739
+ /** @typedef {{}} Pluginrackempty2Inputs */
7740
+ var en_pluginrackempty2 = () => {
7741
+ return `No plugins on the rack yet — add a line to plugins-reff.md.`;
7742
+ };
7743
+ var zh_pluginrackempty2 = () => {
7744
+ return `插件架暂无插件 — 在 plugins-reff.md 中添加一行。`;
7745
+ };
7746
+ var id_pluginrackempty2 = () => {
7747
+ return `Belum ada plugin di rak — tambahkan satu baris di plugins-reff.md.`;
7748
+ };
7749
+ var es_pluginrackempty2 = () => {
7750
+ return `Aún no hay plugins en el rack — añade una línea a plugins-reff.md.`;
7751
+ };
7752
+ /**
7753
+ * | output |
7754
+ * | --- |
7755
+ * | "No plugins on the rack yet — add a line to plugins-reff.md." |
7756
+ *
7757
+ * @param {Pluginrackempty2Inputs} inputs
7758
+ * @param {{ locale?: "en" | "zh" | "id" | "es" }} options
7759
+ * @returns {LocalizedString}
7760
+ */
7761
+ var pluginrackempty2 = ((inputs = {}, options = {}) => {
7762
+ const locale = options.locale ?? getLocale();
7763
+ if (locale === "zh") return zh_pluginrackempty2();
7764
+ if (locale === "id") return id_pluginrackempty2();
7765
+ if (locale === "es") return es_pluginrackempty2();
7766
+ return en_pluginrackempty2();
7767
+ });
7768
+ //#endregion
7769
+ //#region src/lib/paraglide/messages/pluginrackinstall2.js
7770
+ /** @typedef {import('../runtime.js').LocalizedString} LocalizedString */
7771
+ /** @typedef {{}} Pluginrackinstall2Inputs */
7772
+ var en_pluginrackinstall2 = () => {
7773
+ return `Install`;
7774
+ };
7775
+ var zh_pluginrackinstall2 = () => {
7776
+ return `安装`;
7777
+ };
7778
+ var id_pluginrackinstall2 = () => {
7779
+ return `Instal`;
7780
+ };
7781
+ var es_pluginrackinstall2 = () => {
7782
+ return `Instalar`;
7783
+ };
7784
+ /**
7785
+ * | output |
7786
+ * | --- |
7787
+ * | "Install" |
7788
+ *
7789
+ * @param {Pluginrackinstall2Inputs} inputs
7790
+ * @param {{ locale?: "en" | "zh" | "id" | "es" }} options
7791
+ * @returns {LocalizedString}
7792
+ */
7793
+ var pluginrackinstall2 = ((inputs = {}, options = {}) => {
7794
+ const locale = options.locale ?? getLocale();
7795
+ if (locale === "zh") return zh_pluginrackinstall2();
7796
+ if (locale === "id") return id_pluginrackinstall2();
7797
+ if (locale === "es") return es_pluginrackinstall2();
7798
+ return en_pluginrackinstall2();
7799
+ });
7800
+ //#endregion
7801
+ //#region src/lib/paraglide/messages/pluginrackinstallempty3.js
7802
+ /** @typedef {import('../runtime.js').LocalizedString} LocalizedString */
7803
+ /** @typedef {{}} Pluginrackinstallempty3Inputs */
7804
+ var en_pluginrackinstallempty3 = () => {
7805
+ return `Everything on the rack is installed.`;
7806
+ };
7807
+ var zh_pluginrackinstallempty3 = () => {
7808
+ return `插件架上的插件都已安装。`;
7809
+ };
7810
+ var id_pluginrackinstallempty3 = () => {
7811
+ return `Semua plugin di rak sudah terpasang.`;
7812
+ };
7813
+ var es_pluginrackinstallempty3 = () => {
7814
+ return `Todo en el rack está instalado.`;
7815
+ };
7816
+ /**
7817
+ * | output |
7818
+ * | --- |
7819
+ * | "Everything on the rack is installed." |
7820
+ *
7821
+ * @param {Pluginrackinstallempty3Inputs} inputs
7822
+ * @param {{ locale?: "en" | "zh" | "id" | "es" }} options
7823
+ * @returns {LocalizedString}
7824
+ */
7825
+ var pluginrackinstallempty3 = ((inputs = {}, options = {}) => {
7826
+ const locale = options.locale ?? getLocale();
7827
+ if (locale === "zh") return zh_pluginrackinstallempty3();
7828
+ if (locale === "id") return id_pluginrackinstallempty3();
7829
+ if (locale === "es") return es_pluginrackinstallempty3();
7830
+ return en_pluginrackinstallempty3();
7831
+ });
7832
+ //#endregion
7833
+ //#region src/lib/paraglide/messages/pluginrackinstalled2.js
7834
+ /** @typedef {import('../runtime.js').LocalizedString} LocalizedString */
7835
+ /** @typedef {{}} Pluginrackinstalled2Inputs */
7836
+ var en_pluginrackinstalled2 = () => {
7837
+ return `Installed`;
7838
+ };
7839
+ var zh_pluginrackinstalled2 = () => {
7840
+ return `已安装`;
7841
+ };
7842
+ var id_pluginrackinstalled2 = () => {
7843
+ return `Terpasang`;
7844
+ };
7845
+ var es_pluginrackinstalled2 = () => {
7846
+ return `Instalado`;
7847
+ };
7848
+ /**
7849
+ * | output |
7850
+ * | --- |
7851
+ * | "Installed" |
7852
+ *
7853
+ * @param {Pluginrackinstalled2Inputs} inputs
7854
+ * @param {{ locale?: "en" | "zh" | "id" | "es" }} options
7855
+ * @returns {LocalizedString}
7856
+ */
7857
+ var pluginrackinstalled2 = ((inputs = {}, options = {}) => {
7858
+ const locale = options.locale ?? getLocale();
7859
+ if (locale === "zh") return zh_pluginrackinstalled2();
7860
+ if (locale === "id") return id_pluginrackinstalled2();
7861
+ if (locale === "es") return es_pluginrackinstalled2();
7862
+ return en_pluginrackinstalled2();
7863
+ });
7864
+ //#endregion
7865
+ //#region src/lib/paraglide/messages/pluginrackloadfailed3.js
7866
+ /** @typedef {import('../runtime.js').LocalizedString} LocalizedString */
7867
+ /** @typedef {{}} Pluginrackloadfailed3Inputs */
7868
+ var en_pluginrackloadfailed3 = () => {
7869
+ return `Could not load the rack.`;
7870
+ };
7871
+ var zh_pluginrackloadfailed3 = () => {
7872
+ return `无法加载插件架。`;
7873
+ };
7874
+ var id_pluginrackloadfailed3 = () => {
7875
+ return `Tidak dapat memuat rak plugin.`;
7876
+ };
7877
+ var es_pluginrackloadfailed3 = () => {
7878
+ return `No se pudo cargar el rack de plugins.`;
7879
+ };
7880
+ /**
7881
+ * | output |
7882
+ * | --- |
7883
+ * | "Could not load the rack." |
7884
+ *
7885
+ * @param {Pluginrackloadfailed3Inputs} inputs
7886
+ * @param {{ locale?: "en" | "zh" | "id" | "es" }} options
7887
+ * @returns {LocalizedString}
7888
+ */
7889
+ var pluginrackloadfailed3 = ((inputs = {}, options = {}) => {
7890
+ const locale = options.locale ?? getLocale();
7891
+ if (locale === "zh") return zh_pluginrackloadfailed3();
7892
+ if (locale === "id") return id_pluginrackloadfailed3();
7893
+ if (locale === "es") return es_pluginrackloadfailed3();
7894
+ return en_pluginrackloadfailed3();
7895
+ });
7896
+ //#endregion
7897
+ //#region src/lib/paraglide/messages/pluginrackopenauthor3.js
7898
+ /** @typedef {import('../runtime.js').LocalizedString} LocalizedString */
7899
+ /** @typedef {{}} Pluginrackopenauthor3Inputs */
7900
+ var en_pluginrackopenauthor3 = () => {
7901
+ return `Open the creator's profile`;
7902
+ };
7903
+ var zh_pluginrackopenauthor3 = () => {
7904
+ return `打开作者主页`;
7905
+ };
7906
+ var id_pluginrackopenauthor3 = () => {
7907
+ return `Buka profil pembuat`;
7908
+ };
7909
+ var es_pluginrackopenauthor3 = () => {
7910
+ return `Abrir el perfil del creador`;
7911
+ };
7912
+ /**
7913
+ * | output |
7914
+ * | --- |
7915
+ * | "Open the creator's profile" |
7916
+ *
7917
+ * @param {Pluginrackopenauthor3Inputs} inputs
7918
+ * @param {{ locale?: "en" | "zh" | "id" | "es" }} options
7919
+ * @returns {LocalizedString}
7920
+ */
7921
+ var pluginrackopenauthor3 = ((inputs = {}, options = {}) => {
7922
+ const locale = options.locale ?? getLocale();
7923
+ if (locale === "zh") return zh_pluginrackopenauthor3();
7924
+ if (locale === "id") return id_pluginrackopenauthor3();
7925
+ if (locale === "es") return es_pluginrackopenauthor3();
7926
+ return en_pluginrackopenauthor3();
7927
+ });
7928
+ //#endregion
7929
+ //#region src/lib/paraglide/messages/pluginrackopenrepo3.js
7930
+ /** @typedef {import('../runtime.js').LocalizedString} LocalizedString */
7931
+ /** @typedef {{}} Pluginrackopenrepo3Inputs */
7932
+ var en_pluginrackopenrepo3 = () => {
7933
+ return `Open the plugin repo`;
7934
+ };
7935
+ var zh_pluginrackopenrepo3 = () => {
7936
+ return `打开插件仓库`;
7937
+ };
7938
+ var id_pluginrackopenrepo3 = () => {
7939
+ return `Buka repo plugin`;
7940
+ };
7941
+ var es_pluginrackopenrepo3 = () => {
7942
+ return `Abrir el repositorio del plugin`;
7943
+ };
7944
+ /**
7945
+ * | output |
7946
+ * | --- |
7947
+ * | "Open the plugin repo" |
7948
+ *
7949
+ * @param {Pluginrackopenrepo3Inputs} inputs
7950
+ * @param {{ locale?: "en" | "zh" | "id" | "es" }} options
7951
+ * @returns {LocalizedString}
7952
+ */
7953
+ var pluginrackopenrepo3 = ((inputs = {}, options = {}) => {
7954
+ const locale = options.locale ?? getLocale();
7955
+ if (locale === "zh") return zh_pluginrackopenrepo3();
7956
+ if (locale === "id") return id_pluginrackopenrepo3();
7957
+ if (locale === "es") return es_pluginrackopenrepo3();
7958
+ return en_pluginrackopenrepo3();
7959
+ });
7960
+ //#endregion
7961
+ //#region src/lib/paraglide/messages/pluginrackreload2.js
7962
+ /** @typedef {import('../runtime.js').LocalizedString} LocalizedString */
7963
+ /** @typedef {{}} Pluginrackreload2Inputs */
7964
+ var en_pluginrackreload2 = () => {
7965
+ return `Reload`;
7966
+ };
7967
+ var zh_pluginrackreload2 = () => {
7968
+ return `重新加载`;
7969
+ };
7970
+ var id_pluginrackreload2 = () => {
7971
+ return `Muat ulang`;
7972
+ };
7973
+ var es_pluginrackreload2 = () => {
7974
+ return `Recargar`;
7975
+ };
7976
+ /**
7977
+ * | output |
7978
+ * | --- |
7979
+ * | "Reload" |
7980
+ *
7981
+ * @param {Pluginrackreload2Inputs} inputs
7982
+ * @param {{ locale?: "en" | "zh" | "id" | "es" }} options
7983
+ * @returns {LocalizedString}
7984
+ */
7985
+ var pluginrackreload2 = ((inputs = {}, options = {}) => {
7986
+ const locale = options.locale ?? getLocale();
7987
+ if (locale === "zh") return zh_pluginrackreload2();
7988
+ if (locale === "id") return id_pluginrackreload2();
7989
+ if (locale === "es") return es_pluginrackreload2();
7990
+ return en_pluginrackreload2();
7991
+ });
7992
+ //#endregion
7993
+ //#region src/lib/paraglide/messages/pluginrackretry2.js
7994
+ /** @typedef {import('../runtime.js').LocalizedString} LocalizedString */
7995
+ /** @typedef {{}} Pluginrackretry2Inputs */
7996
+ var en_pluginrackretry2 = () => {
7997
+ return `Retry`;
7998
+ };
7999
+ var zh_pluginrackretry2 = () => {
8000
+ return `重试`;
8001
+ };
8002
+ var id_pluginrackretry2 = () => {
8003
+ return `Coba lagi`;
8004
+ };
8005
+ var es_pluginrackretry2 = () => {
8006
+ return `Reintentar`;
8007
+ };
8008
+ /**
8009
+ * | output |
8010
+ * | --- |
8011
+ * | "Retry" |
8012
+ *
8013
+ * @param {Pluginrackretry2Inputs} inputs
8014
+ * @param {{ locale?: "en" | "zh" | "id" | "es" }} options
8015
+ * @returns {LocalizedString}
8016
+ */
8017
+ var pluginrackretry2 = ((inputs = {}, options = {}) => {
8018
+ const locale = options.locale ?? getLocale();
8019
+ if (locale === "zh") return zh_pluginrackretry2();
8020
+ if (locale === "id") return id_pluginrackretry2();
8021
+ if (locale === "es") return es_pluginrackretry2();
8022
+ return en_pluginrackretry2();
8023
+ });
8024
+ //#endregion
8025
+ //#region src/lib/paraglide/messages/pluginracksearch2.js
8026
+ /** @typedef {import('../runtime.js').LocalizedString} LocalizedString */
8027
+ /** @typedef {{}} Pluginracksearch2Inputs */
8028
+ var en_pluginracksearch2 = () => {
8029
+ return `Search plugins`;
8030
+ };
8031
+ var zh_pluginracksearch2 = () => {
8032
+ return `搜索插件`;
8033
+ };
8034
+ var id_pluginracksearch2 = () => {
8035
+ return `Cari plugin`;
8036
+ };
8037
+ var es_pluginracksearch2 = () => {
8038
+ return `Buscar plugins`;
8039
+ };
8040
+ /**
8041
+ * | output |
8042
+ * | --- |
8043
+ * | "Search plugins" |
8044
+ *
8045
+ * @param {Pluginracksearch2Inputs} inputs
8046
+ * @param {{ locale?: "en" | "zh" | "id" | "es" }} options
8047
+ * @returns {LocalizedString}
8048
+ */
8049
+ var pluginracksearch2 = ((inputs = {}, options = {}) => {
8050
+ const locale = options.locale ?? getLocale();
8051
+ if (locale === "zh") return zh_pluginracksearch2();
8052
+ if (locale === "id") return id_pluginracksearch2();
8053
+ if (locale === "es") return es_pluginracksearch2();
8054
+ return en_pluginracksearch2();
8055
+ });
8056
+ //#endregion
8057
+ //#region src/lib/paraglide/messages/pluginracktitle2.js
8058
+ /** @typedef {import('../runtime.js').LocalizedString} LocalizedString */
8059
+ /** @typedef {{}} Pluginracktitle2Inputs */
8060
+ var en_pluginracktitle2 = () => {
8061
+ return `Plugin Rack`;
8062
+ };
8063
+ var zh_pluginracktitle2 = () => {
8064
+ return `插件架`;
8065
+ };
8066
+ var id_pluginracktitle2 = () => {
8067
+ return `Rak Plugin`;
8068
+ };
8069
+ var es_pluginracktitle2 = () => {
8070
+ return `Rack de plugins`;
8071
+ };
8072
+ /**
8073
+ * | output |
8074
+ * | --- |
8075
+ * | "Plugin Rack" |
8076
+ *
8077
+ * @param {Pluginracktitle2Inputs} inputs
8078
+ * @param {{ locale?: "en" | "zh" | "id" | "es" }} options
8079
+ * @returns {LocalizedString}
8080
+ */
8081
+ var pluginracktitle2 = ((inputs = {}, options = {}) => {
8082
+ const locale = options.locale ?? getLocale();
8083
+ if (locale === "zh") return zh_pluginracktitle2();
8084
+ if (locale === "id") return id_pluginracktitle2();
8085
+ if (locale === "es") return es_pluginracktitle2();
8086
+ return en_pluginracktitle2();
8087
+ });
8088
+ //#endregion
8089
+ //#region src/lib/paraglide/messages/pluginrackuninstall2.js
8090
+ /** @typedef {import('../runtime.js').LocalizedString} LocalizedString */
8091
+ /** @typedef {{}} Pluginrackuninstall2Inputs */
8092
+ var en_pluginrackuninstall2 = () => {
8093
+ return `Uninstall`;
8094
+ };
8095
+ var zh_pluginrackuninstall2 = () => {
8096
+ return `卸载`;
8097
+ };
8098
+ var id_pluginrackuninstall2 = () => {
8099
+ return `Copot`;
8100
+ };
8101
+ var es_pluginrackuninstall2 = () => {
8102
+ return `Desinstalar`;
8103
+ };
8104
+ /**
8105
+ * | output |
8106
+ * | --- |
8107
+ * | "Uninstall" |
8108
+ *
8109
+ * @param {Pluginrackuninstall2Inputs} inputs
7470
8110
  * @param {{ locale?: "en" | "zh" | "id" | "es" }} options
7471
8111
  * @returns {LocalizedString}
7472
8112
  */
7473
- var picksession1 = ((inputs = {}, options = {}) => {
8113
+ var pluginrackuninstall2 = ((inputs = {}, options = {}) => {
7474
8114
  const locale = options.locale ?? getLocale();
7475
- if (locale === "zh") return zh_picksession1();
7476
- if (locale === "id") return id_picksession1();
7477
- if (locale === "es") return es_picksession1();
7478
- return en_picksession1();
8115
+ if (locale === "zh") return zh_pluginrackuninstall2();
8116
+ if (locale === "id") return id_pluginrackuninstall2();
8117
+ if (locale === "es") return es_pluginrackuninstall2();
8118
+ return en_pluginrackuninstall2();
7479
8119
  });
7480
8120
  //#endregion
7481
- //#region src/lib/paraglide/messages/planmode1.js
8121
+ //#region src/lib/paraglide/messages/pluginrackuninstallempty3.js
7482
8122
  /** @typedef {import('../runtime.js').LocalizedString} LocalizedString */
7483
- /** @typedef {{}} Planmode1Inputs */
7484
- var en_planmode1 = () => {
7485
- return `plan mode`;
8123
+ /** @typedef {{}} Pluginrackuninstallempty3Inputs */
8124
+ var en_pluginrackuninstallempty3 = () => {
8125
+ return `Nothing installed yet - install a plugin from the install tab.`;
7486
8126
  };
7487
- var zh_planmode1 = () => {
7488
- return `计划模式`;
8127
+ var zh_pluginrackuninstallempty3 = () => {
8128
+ return `尚未安装任何插件 - 请在安装标签页中安装。`;
7489
8129
  };
7490
- var id_planmode1 = () => {
7491
- return `mode rencana`;
8130
+ var id_pluginrackuninstallempty3 = () => {
8131
+ return `Belum ada yang terpasang - instal plugin dari tab instal.`;
7492
8132
  };
7493
- var es_planmode1 = () => {
7494
- return `modo plan`;
8133
+ var es_pluginrackuninstallempty3 = () => {
8134
+ return `Nada instalado todavía: instala un plugin desde la pestaña de instalación.`;
7495
8135
  };
7496
8136
  /**
7497
8137
  * | output |
7498
8138
  * | --- |
7499
- * | "plan mode" |
8139
+ * | "Nothing installed yet - install a plugin from the install tab." |
7500
8140
  *
7501
- * @param {Planmode1Inputs} inputs
8141
+ * @param {Pluginrackuninstallempty3Inputs} inputs
7502
8142
  * @param {{ locale?: "en" | "zh" | "id" | "es" }} options
7503
8143
  * @returns {LocalizedString}
7504
8144
  */
7505
- var planmode1 = ((inputs = {}, options = {}) => {
8145
+ var pluginrackuninstallempty3 = ((inputs = {}, options = {}) => {
7506
8146
  const locale = options.locale ?? getLocale();
7507
- if (locale === "zh") return zh_planmode1();
7508
- if (locale === "id") return id_planmode1();
7509
- if (locale === "es") return es_planmode1();
7510
- return en_planmode1();
8147
+ if (locale === "zh") return zh_pluginrackuninstallempty3();
8148
+ if (locale === "id") return id_pluginrackuninstallempty3();
8149
+ if (locale === "es") return es_pluginrackuninstallempty3();
8150
+ return en_pluginrackuninstallempty3();
7511
8151
  });
7512
8152
  //#endregion
7513
8153
  //#region src/lib/paraglide/messages/plusadd1.js
@@ -12623,6 +13263,11 @@ var _index_exports = /* @__PURE__ */ __exportAll({
12623
13263
  collapseLineage: () => collapselineage1,
12624
13264
  collapseSidebar: () => collapsesidebar1,
12625
13265
  commandHelp: () => commandhelp1,
13266
+ commandHelpPluginrackExampleBare: () => commandhelppluginrackexamplebare4,
13267
+ commandHelpPluginrackExampleHelp: () => commandhelppluginrackexamplehelp4,
13268
+ commandHelpPluginrackExampleReload: () => commandhelppluginrackexamplereload4,
13269
+ commandHelpPluginrackParamReload: () => commandhelppluginrackparamreload4,
13270
+ commandHelpPluginrackSummary: () => commandhelppluginracksummary3,
12626
13271
  commandHelpSkillshelfExampleBare: () => commandhelpskillshelfexamplebare4,
12627
13272
  commandHelpSkillshelfExampleHelp: () => commandhelpskillshelfexamplehelp4,
12628
13273
  commandHelpSkillshelfExampleReload: () => commandhelpskillshelfexamplereload4,
@@ -12804,6 +13449,21 @@ var _index_exports = /* @__PURE__ */ __exportAll({
12804
13449
  pendingAttachments: () => pendingattachments1,
12805
13450
  pickSession: () => picksession1,
12806
13451
  planMode: () => planmode1,
13452
+ pluginRackApplying: () => pluginrackapplying2,
13453
+ pluginRackBy: () => pluginrackby2,
13454
+ pluginRackEmpty: () => pluginrackempty2,
13455
+ pluginRackInstall: () => pluginrackinstall2,
13456
+ pluginRackInstallEmpty: () => pluginrackinstallempty3,
13457
+ pluginRackInstalled: () => pluginrackinstalled2,
13458
+ pluginRackLoadFailed: () => pluginrackloadfailed3,
13459
+ pluginRackOpenAuthor: () => pluginrackopenauthor3,
13460
+ pluginRackOpenRepo: () => pluginrackopenrepo3,
13461
+ pluginRackReload: () => pluginrackreload2,
13462
+ pluginRackRetry: () => pluginrackretry2,
13463
+ pluginRackSearch: () => pluginracksearch2,
13464
+ pluginRackTitle: () => pluginracktitle2,
13465
+ pluginRackUninstall: () => pluginrackuninstall2,
13466
+ pluginRackUninstallEmpty: () => pluginrackuninstallempty3,
12807
13467
  plusAdd: () => plusadd1,
12808
13468
  presetCustom: () => presetcustom1,
12809
13469
  presetFullAccess: () => presetfullaccess2,
@@ -13024,6 +13684,11 @@ var messages_exports = /* @__PURE__ */ __exportAll({
13024
13684
  collapseLineage: () => collapselineage1,
13025
13685
  collapseSidebar: () => collapsesidebar1,
13026
13686
  commandHelp: () => commandhelp1,
13687
+ commandHelpPluginrackExampleBare: () => commandhelppluginrackexamplebare4,
13688
+ commandHelpPluginrackExampleHelp: () => commandhelppluginrackexamplehelp4,
13689
+ commandHelpPluginrackExampleReload: () => commandhelppluginrackexamplereload4,
13690
+ commandHelpPluginrackParamReload: () => commandhelppluginrackparamreload4,
13691
+ commandHelpPluginrackSummary: () => commandhelppluginracksummary3,
13027
13692
  commandHelpSkillshelfExampleBare: () => commandhelpskillshelfexamplebare4,
13028
13693
  commandHelpSkillshelfExampleHelp: () => commandhelpskillshelfexamplehelp4,
13029
13694
  commandHelpSkillshelfExampleReload: () => commandhelpskillshelfexamplereload4,
@@ -13206,6 +13871,21 @@ var messages_exports = /* @__PURE__ */ __exportAll({
13206
13871
  pendingAttachments: () => pendingattachments1,
13207
13872
  pickSession: () => picksession1,
13208
13873
  planMode: () => planmode1,
13874
+ pluginRackApplying: () => pluginrackapplying2,
13875
+ pluginRackBy: () => pluginrackby2,
13876
+ pluginRackEmpty: () => pluginrackempty2,
13877
+ pluginRackInstall: () => pluginrackinstall2,
13878
+ pluginRackInstallEmpty: () => pluginrackinstallempty3,
13879
+ pluginRackInstalled: () => pluginrackinstalled2,
13880
+ pluginRackLoadFailed: () => pluginrackloadfailed3,
13881
+ pluginRackOpenAuthor: () => pluginrackopenauthor3,
13882
+ pluginRackOpenRepo: () => pluginrackopenrepo3,
13883
+ pluginRackReload: () => pluginrackreload2,
13884
+ pluginRackRetry: () => pluginrackretry2,
13885
+ pluginRackSearch: () => pluginracksearch2,
13886
+ pluginRackTitle: () => pluginracktitle2,
13887
+ pluginRackUninstall: () => pluginrackuninstall2,
13888
+ pluginRackUninstallEmpty: () => pluginrackuninstallempty3,
13209
13889
  plusAdd: () => plusadd1,
13210
13890
  presetCustom: () => presetcustom1,
13211
13891
  presetFullAccess: () => presetfullaccess2,
@@ -15163,13 +15843,46 @@ function renderMarkdown(text) {
15163
15843
  function renderInline(text) {
15164
15844
  const codeSpans = [];
15165
15845
  let rest = text.replace(/`([^`\n]+)`/g, (_m, body) => {
15166
- codeSpans.push(`<code>${body}</code>`);
15846
+ const raw = unescapeEntities(body);
15847
+ if (/^https?:\/\/\S+$/i.test(raw)) codeSpans.push(externalAnchor(raw));
15848
+ else codeSpans.push(`<code>${body}</code>`);
15167
15849
  return `\u0000${codeSpans.length - 1}\u0000`;
15168
15850
  });
15169
15851
  rest = emphasis(rest);
15170
15852
  rest = links(rest);
15853
+ rest = autolinkBareUrls(rest);
15171
15854
  return rest.replace(/\u0000(\d+)\u0000/g, (_m, idx) => codeSpans[Number(idx)] ?? "");
15172
15855
  }
15856
+ /** One hardened external anchor from a RAW url — display is origin+path
15857
+ * (query/fragment stripped), href keeps everything (BC-12 attributes). */
15858
+ function externalAnchor(rawUrl) {
15859
+ let cut = rawUrl.length;
15860
+ for (const c of ["?", "#"]) {
15861
+ const i = rawUrl.indexOf(c);
15862
+ if (i !== -1 && i < cut) cut = i;
15863
+ }
15864
+ return `<a href="${rawUrl.replaceAll("\"", "&quot;")}" rel="noopener noreferrer" target="_blank">${rawUrl.slice(0, cut)}</a>`;
15865
+ }
15866
+ /**
15867
+ * Bare-URL autolink (2026-09-27): an http(s) URL in plain text becomes an
15868
+ * anchor whose DISPLAY TEXT is the origin+path with the query/hash stripped
15869
+ * (transcript URLs like …new?merge_request[source_branch]=… render short)
15870
+ * while the HREF keeps the FULL URL. Runs after [label](href) parsing and
15871
+ * skips text inside existing anchors/code placeholders (\u0000N\u0000 markers).
15872
+ * Trailing punctuation ),.,;:!?'"] and matching surrounding parens stay
15873
+ * outside the link (CommonMark's autolink tail rule).
15874
+ */
15875
+ function autolinkBareUrls(text) {
15876
+ return text.replace(/https?:\/\/[^\s<>"'\u0000]+/gi, (whole, offset, full) => {
15877
+ const before = full.slice(Math.max(0, offset - 2e3), offset);
15878
+ if (/<a\s[^>]*$/i.test(before) || /<code>[^<]*$/i.test(before)) return whole;
15879
+ let url = whole;
15880
+ while (url.endsWith(")") && (url.match(/\(/g)?.length ?? 0) < (url.match(/\)/g)?.length ?? 0)) url = url.slice(0, -1);
15881
+ url = url.replace(/[.,;:!?]+$/, "");
15882
+ const tail = whole.slice(url.length);
15883
+ return `${externalAnchor(url)}${tail}`;
15884
+ });
15885
+ }
15173
15886
  /** ***bold-italic***, **bold**, *italic*, _italic_, ~~strike~~. */
15174
15887
  function emphasis(text) {
15175
15888
  return text.replace(/\*\*\*(.+?)\*\*\*/g, "<strong><em>$1</em></strong>").replace(/\*\*(.+?)\*\*/g, "<strong>$1</strong>").replace(/\*(.+?)\*/g, "<em>$1</em>").replace(/(?<![\w])_(.+?)_(?![\w])/g, "<em>$1</em>").replace(/~~(.+?)~~/g, "<del>$1</del>");
@@ -15182,10 +15895,10 @@ function emphasis(text) {
15182
15895
  */
15183
15896
  function links(text) {
15184
15897
  return text.replace(/\[([^\]]+)\]\(([^)\s]+)\)/g, (whole, label, href) => {
15185
- const unescaped = href.replaceAll("&amp;", "&").replaceAll("&lt;", "<").replaceAll("&gt;", ">").replaceAll("&quot;", "\"").replaceAll("&#39;", "'");
15186
- if (/^https?:\/\//i.test(unescaped)) return `<a href="${href}" rel="noopener noreferrer" target="_blank">${label}</a>`;
15187
- if (/^[a-zA-Z][a-zA-Z0-9+.-]*:/.test(unescaped) || unescaped.startsWith("//")) return whole;
15188
- return `<a href="${href}">${label}</a>`;
15898
+ const bare = href.replaceAll("&amp;", "&").replaceAll("&lt;", "<").replaceAll("&gt;", ">").replaceAll("&quot;", "\"").replaceAll("&#39;", "'").replace(/^<(.+)>$/, "$1");
15899
+ if (/^https?:\/\//i.test(bare)) return `<a href="${bare.replaceAll("\"", "&quot;")}" rel="noopener noreferrer" target="_blank">${label}</a>`;
15900
+ if (/^[a-zA-Z][a-zA-Z0-9+.-]*:/.test(bare) || bare.startsWith("//")) return whole;
15901
+ return `<a href="${bare.replaceAll("\"", "&quot;")}">${label}</a>`;
15189
15902
  });
15190
15903
  }
15191
15904
  //#endregion
@@ -18108,6 +18821,7 @@ function panelHeaderLabel(panel) {
18108
18821
  if (panel.kind === "terminal") return "Terminal";
18109
18822
  if (panel.kind === "prompt-manager") return MANAGER_ROW_TITLE;
18110
18823
  if (panel.kind === "skill-shelf") return "Skill Shelf";
18824
+ if (panel.kind === "plugin-rack") return "Plugin Rack";
18111
18825
  if (panel.kind === "settings-editor") return SETTINGS_ROW_TITLE[panel.target];
18112
18826
  if (panel.kind === "injected-doc") return injectedDocTitle(panel.displayPath);
18113
18827
  if (panel.kind === "workspace-explorer") return panel.title ?? workspaceExplorerTitle(panel.root);
@@ -18133,9 +18847,9 @@ function panelRowsFor(input) {
18133
18847
  const { panels, spineRows, coldCache, deadSessions, edgeCache, lineageFacts, moveFacts } = input;
18134
18848
  const openSessionIds = openSessionIdsOf(panels);
18135
18849
  return panels.map((p, index) => {
18136
- if (p.kind === "terminal" || p.kind === "prompt-manager" || p.kind === "settings-editor" || p.kind === "skill-shelf") return {
18850
+ if (p.kind === "terminal" || p.kind === "prompt-manager" || p.kind === "settings-editor" || p.kind === "skill-shelf" || p.kind === "plugin-rack") return {
18137
18851
  panel: p,
18138
- title: p.kind === "terminal" ? "Terminal" : p.kind === "prompt-manager" ? MANAGER_ROW_TITLE : p.kind === "skill-shelf" ? "Skill Shelf" : SETTINGS_ROW_TITLE[p.target],
18852
+ title: p.kind === "terminal" ? "Terminal" : p.kind === "prompt-manager" ? MANAGER_ROW_TITLE : p.kind === "skill-shelf" ? "Skill Shelf" : p.kind === "plugin-rack" ? "Plugin Rack" : SETTINGS_ROW_TITLE[p.target],
18139
18853
  workspace: null,
18140
18854
  dead: false,
18141
18855
  running: false,
@@ -18355,6 +19069,20 @@ function parseCommand(text) {
18355
19069
  }[token],
18356
19070
  args
18357
19071
  };
19072
+ case "/dsi-plugins":
19073
+ if (args === "") return {
19074
+ type: "pluginrack",
19075
+ args
19076
+ };
19077
+ if (args === "--reload") return {
19078
+ type: "pluginrack",
19079
+ args: "",
19080
+ reload: true
19081
+ };
19082
+ return {
19083
+ type: "pluginrack",
19084
+ args
19085
+ };
18358
19086
  case "/dsi-skills":
18359
19087
  if (args === "") return {
18360
19088
  type: "skillshelf",
@@ -18551,6 +19279,38 @@ var COMMAND_HELP = {
18551
19279
  }
18552
19280
  ]
18553
19281
  },
19282
+ pluginrack: {
19283
+ usage: "/dsi-plugins [--reload]",
19284
+ get summary() {
19285
+ return t(commandhelppluginracksummary3);
19286
+ },
19287
+ params: [{
19288
+ name: "--reload",
19289
+ get description() {
19290
+ return t(commandhelppluginrackparamreload4);
19291
+ }
19292
+ }],
19293
+ examples: [
19294
+ {
19295
+ line: "/dsi-plugins",
19296
+ get description() {
19297
+ return t(commandhelppluginrackexamplebare4);
19298
+ }
19299
+ },
19300
+ {
19301
+ line: "/dsi-plugins --reload",
19302
+ get description() {
19303
+ return t(commandhelppluginrackexamplereload4);
19304
+ }
19305
+ },
19306
+ {
19307
+ line: "/dsi-plugins ?",
19308
+ get description() {
19309
+ return t(commandhelppluginrackexamplehelp4);
19310
+ }
19311
+ }
19312
+ ]
19313
+ },
18554
19314
  dshsettings: {
18555
19315
  usage: "/dsh-settings",
18556
19316
  summary: "Aims the harness settings home explorer (~/.dsh, titled “DSH - Settings”): the open explorer takes the focus; otherwise a NEW explorer opens to the right of this conversation, selected. settings.yaml opens as a tab and stays editable; the running harness picks edits up through its own file watcher.",
@@ -18634,6 +19394,14 @@ var MENU_GESTURES = [
18634
19394
  return t(commandhelpskillshelfsummary3);
18635
19395
  }
18636
19396
  },
19397
+ {
19398
+ name: "pluginrack",
19399
+ display: "/dsi-plugins",
19400
+ seed: "/dsi-plugins ",
19401
+ get description() {
19402
+ return t(commandhelppluginracksummary3);
19403
+ }
19404
+ },
18637
19405
  {
18638
19406
  name: "dsisettings",
18639
19407
  display: "/dsi-settings",
@@ -20054,7 +20822,7 @@ function hasDotDotSegment(path) {
20054
20822
  * it never breaks the open).
20055
20823
  */
20056
20824
  function parseFileLinkHref(href) {
20057
- const value = href.trim();
20825
+ const value = stripAngleWrapper(href.trim());
20058
20826
  const hash = value.indexOf("#");
20059
20827
  const raw = hash === -1 ? value : value.slice(0, hash);
20060
20828
  const anchor = hash === -1 ? "" : value.slice(hash + 1);
@@ -20080,8 +20848,14 @@ function parseFileLinkHref(href) {
20080
20848
  lines
20081
20849
  };
20082
20850
  }
20851
+ /** CommonMark angle-bracket destinations (<path> and their %3C/%3E
20852
+ * encodings) are destination syntax, never path bytes - renderers that
20853
+ * hand the wrapper through must not have it reach the host read. */
20854
+ function stripAngleWrapper(value) {
20855
+ return value.replace(/^(?:%3C|<)/i, "").replace(/(?:%3E|>)$/i, "");
20856
+ }
20083
20857
  function normalizeFileLinkPath(href) {
20084
- let value = href.trim().replace(/^\.\//, "").replace(/\/{2,}/g, "/");
20858
+ let value = stripAngleWrapper(href.trim()).replace(/^\.\//, "").replace(/\/{2,}/g, "/");
20085
20859
  const hash = value.indexOf("#");
20086
20860
  if (hash !== -1) value = value.slice(0, hash);
20087
20861
  if (value.startsWith("/")) value = value.slice(1);
@@ -24594,6 +25368,7 @@ async function executeCommand(command, ctx, onNote) {
24594
25368
  if (command.type === "promptmanager") return runPromptManager(command.args, ctx, onNote);
24595
25369
  if (command.type === "terminal") return runTerminal(command.args, command.terminalAction, ctx, onNote);
24596
25370
  if (command.type === "skillshelf") return runSkillShelf(command.args, command.reload === true, ctx, onNote);
25371
+ if (command.type === "pluginrack") return runPluginRack(command.args, command.reload === true, ctx, onNote);
24597
25372
  if (command.type === "dsisettings" || command.type === "dshsettings") return runSettingsEditor(command.type === "dsisettings" ? "dsi" : "dsh", command.type === "dsisettings" ? "/dsi-settings" : "/dsh-settings", command.args, ctx, onNote);
24598
25373
  if (command.type === "loadinjected") return runLoadInjected(command.filename, command.addPanel === true, ctx, onNote);
24599
25374
  if (command.args !== "") {
@@ -24801,6 +25576,61 @@ async function runPromptManager(args, ctx, onNote) {
24801
25576
  * forces the rebuild HERE so the panel's first fetch already carries the
24802
25577
  * fresh snapshot. No note on success — the focused panel IS the feedback.
24803
25578
  */
25579
+ /**
25580
+ * /dsi-plugins (The Plugin Rack ADR, 2026-09-27, D1): aim the
25581
+ * PluginManagerPanel — the floor dedupes and FOCUSES the open rack (the
25582
+ * manager-request grammar). Snapshot-first is the ROUTE's contract
25583
+ * (GET /api/plugins/snapshot builds when absent, D2); the '--reload' flag
25584
+ * forces the rebuild HERE so the panel's first fetch already carries the
25585
+ * fresh snapshot. No note on success — the focused panel IS the feedback.
25586
+ */
25587
+ async function runPluginRack(args, reload, ctx, onNote) {
25588
+ if (args !== "") {
25589
+ const usage = "usage: /dsi-plugins [--reload]";
25590
+ onNote?.(false, usage);
25591
+ return {
25592
+ ok: false,
25593
+ note: usage
25594
+ };
25595
+ }
25596
+ if (ctx.panelId == null) {
25597
+ const note = "/dsi-plugins needs a panel floor (open this session on the floor first)";
25598
+ onNote?.(false, note);
25599
+ return {
25600
+ ok: false,
25601
+ note
25602
+ };
25603
+ }
25604
+ if (reload) try {
25605
+ const res = await fetch("/api/plugins/reload", { method: "POST" });
25606
+ if (!res.ok) {
25607
+ const note = "/dsi-plugins: snapshot rebuild failed (" + res.status + ")";
25608
+ onNote?.(false, note);
25609
+ return {
25610
+ ok: false,
25611
+ note
25612
+ };
25613
+ }
25614
+ } catch {
25615
+ const note = "/dsi-plugins: snapshot rebuild failed (network)";
25616
+ onNote?.(false, note);
25617
+ return {
25618
+ ok: false,
25619
+ note
25620
+ };
25621
+ }
25622
+ if (!addPanel({
25623
+ afterSessionId: ctx.sessionId
25624
+ })) {
25625
+ const note = "/dsi-plugins: the floor is not mounted";
25626
+ onNote?.(false, note);
25627
+ return {
25628
+ ok: false,
25629
+ note
25630
+ };
25631
+ }
25632
+ return { ok: true };
25633
+ }
24804
25634
  async function runSkillShelf(args, reload, ctx, onNote) {
24805
25635
  if (args !== "") {
24806
25636
  const usage = "usage: /dsi-skills [--reload]";
@@ -27126,11 +27956,11 @@ function SettingsSkillsToolbar($$renderer, $$props) {
27126
27956
  });
27127
27957
  }
27128
27958
  //#endregion
27129
- //#region src/lib/components/settings-skills/SettingsSkillsTabgroup.svelte
27130
- function SettingsSkillsTabgroup($$renderer, $$props) {
27959
+ //#region src/lib/components/settings-skills/SettingsSkillsHeaderTabs.svelte
27960
+ function SettingsSkillsHeaderTabs($$renderer, $$props) {
27131
27961
  $$renderer.component(($$renderer) => {
27132
27962
  /**
27133
- * SettingsSkillsTabgroup — the shelf's own tab pill (The Shelf
27963
+ * SettingsSkillsHeaderTabs — the shelf's own tab pill (The Shelf
27134
27964
  * Chrome, D3): the joined-pill segmented grammar (class:on,
27135
27965
  * aria-pressed) speaking the shelf's native tab names directly —
27136
27966
  * install / uninstall, plain labels, no counts. Install is the
@@ -27138,11 +27968,95 @@ function SettingsSkillsTabgroup($$renderer, $$props) {
27138
27968
  * renders the two segments and reports picks.
27139
27969
  */
27140
27970
  let { tab = "install"} = $$props;
27141
- $$renderer.push(`<div data-svelte="SettingsSkillsTabgroup" class="seg-group svelte-8kewue" role="group"${attr("aria-label", t(skillsshelftitle2))} data-testid="shelf-tab-group"><button type="button"${attr_class("seg left svelte-8kewue", void 0, { "on": tab === "install" })}${attr("aria-pressed", tab === "install")} data-testid="shelf-tab-install">${escape_html(t(skillsshelftabinstall3))}</button> <button type="button"${attr_class("seg right svelte-8kewue", void 0, { "on": tab === "uninstall" })}${attr("aria-pressed", tab === "uninstall")} data-testid="shelf-tab-uninstall">${escape_html(t(skillsshelftabuninstall3))}</button></div>`);
27971
+ $$renderer.push(`<div data-svelte="SettingsSkillsHeaderTabs" class="seg-group svelte-34npwv" role="group"${attr("aria-label", t(skillsshelftitle2))} data-testid="shelf-tab-group"><button type="button"${attr_class("seg left svelte-34npwv", void 0, { "on": tab === "install" })}${attr("aria-pressed", tab === "install")} data-testid="shelf-tab-install">${escape_html(t(skillsshelftabinstall3))}</button> <button type="button"${attr_class("seg right svelte-34npwv", void 0, { "on": tab === "uninstall" })}${attr("aria-pressed", tab === "uninstall")} data-testid="shelf-tab-uninstall">${escape_html(t(skillsshelftabuninstall3))}</button></div>`);
27972
+ });
27973
+ }
27974
+ //#endregion
27975
+ //#region src/lib/components/settings-skills/SettingsSkillsHeaderActions.svelte
27976
+ function SettingsSkillsHeaderActions($$renderer, $$props) {
27977
+ $$renderer.component(($$renderer) => {
27978
+ /**
27979
+ * SettingsSkillsHeaderActions - the shelf header's action cluster
27980
+ * (The Shelf Chrome ADR): the reload verb + progress/cancel
27981
+ * (install tab only) and the lineage-fold pill (cross-tab by
27982
+ * contract, ADR D2). Presentational: every verb and all state are
27983
+ * owned by SettingsSkillsPanel.
27984
+ */
27985
+ let { tab, reloadState, busy} = $$props;
27986
+ $$renderer.push(`<div data-svelte="SettingsSkillsHeaderActions" class="shelf-header-actions svelte-1c0ydto">`);
27987
+ if (tab === "install") {
27988
+ $$renderer.push("<!--[0-->");
27989
+ $$renderer.push(`<button type="button"${attr_class("shelf-reload svelte-1c0ydto", void 0, {
27990
+ "reloading": reloadState === "loading",
27991
+ "reloaded": reloadState === "done"
27992
+ })} data-testid="shelf-reload"${attr("data-reload-state", reloadState)}${attr("title", reloadState === "loading" ? t(skillsshelfreloading2) : reloadState === "done" ? t(skillsshelfreloaded2) : t(skillsshelfreload2))}${attr("aria-label", reloadState === "loading" ? t(skillsshelfreloading2) : reloadState === "done" ? t(skillsshelfreloaded2) : t(skillsshelfreload2))}${attr("disabled", busy, true)}>`);
27993
+ if (reloadState === "loading") {
27994
+ $$renderer.push("<!--[0-->");
27995
+ Loader_circle($$renderer, {
27996
+ size: 13,
27997
+ "aria-hidden": "true"
27998
+ });
27999
+ } else if (reloadState === "done") {
28000
+ $$renderer.push("<!--[1-->");
28001
+ Check($$renderer, {
28002
+ size: 13,
28003
+ "aria-hidden": "true"
28004
+ });
28005
+ } else {
28006
+ $$renderer.push("<!--[-1-->");
28007
+ Rotate_cw($$renderer, {
28008
+ size: 13,
28009
+ "aria-hidden": "true"
28010
+ });
28011
+ }
28012
+ $$renderer.push(`<!--]--> `);
28013
+ $$renderer.push("<!--[-1-->");
28014
+ $$renderer.push(`<!--]--></button> `);
28015
+ if (tab === "install" && reloadState === "loading") {
28016
+ $$renderer.push("<!--[0-->");
28017
+ $$renderer.push(`<button type="button" class="shelf-reload-cancel svelte-1c0ydto" data-testid="shelf-reload-cancel"${attr("title", t(skillsshelfreloadcancel3))}${attr("aria-label", t(skillsshelfreloadcancel3))}>`);
28018
+ X($$renderer, {
28019
+ size: 13,
28020
+ "aria-hidden": "true"
28021
+ });
28022
+ $$renderer.push(`<!----></button>`);
28023
+ } else $$renderer.push("<!--[-1-->");
28024
+ $$renderer.push(`<!--]-->`);
28025
+ } else $$renderer.push("<!--[-1-->");
28026
+ $$renderer.push(`<!--]--> <div class="seg-group svelte-1c0ydto" role="group"${attr("aria-label", t(skillsshelftitle2))} data-testid="shelf-fold-toggle"><button type="button" class="seg left svelte-1c0ydto"${attr("aria-label", t(skillsshelfcollapseall3))}${attr("title", t(skillsshelfcollapseall3))} data-testid="shelf-collapse-all">`);
28027
+ Chevrons_down_up($$renderer, {
28028
+ size: 12,
28029
+ "aria-hidden": "true"
28030
+ });
28031
+ $$renderer.push(`<!----></button> <button type="button" class="seg right svelte-1c0ydto"${attr("aria-label", t(skillsshelfexpandall3))}${attr("title", t(skillsshelfexpandall3))} data-testid="shelf-expand-all">`);
28032
+ Chevrons_up_down($$renderer, {
28033
+ size: 12,
28034
+ "aria-hidden": "true"
28035
+ });
28036
+ $$renderer.push(`<!----></button></div></div>`);
27142
28037
  });
27143
28038
  }
27144
28039
  //#endregion
27145
- //#region src/lib/utils/skill-shelf-reload-machine.ts
28040
+ //#region src/lib/components/settings-skills/SettingsSkillsHeader.svelte
28041
+ function SettingsSkillsHeader($$renderer, $$props) {
28042
+ /**
28043
+ * SettingsSkillsHeader - the shelf chrome's header row (The Shelf
28044
+ * Chrome ADR): tab group on the left, action cluster on the right —
28045
+ * the reload verb + progress/cancel (install tab only) and the
28046
+ * lineage-fold pill (cross-tab by contract, ADR D2). Presentational:
28047
+ * every verb and all state are owned by SettingsSkillsPanel.
28048
+ */
28049
+ let { tab, reloadState, busy} = $$props;
28050
+ $$renderer.push(`<div data-svelte="SettingsSkillsHeader" class="shelf-header svelte-17gmpcz" data-testid="shelf-header">`);
28051
+ SettingsSkillsHeaderTabs($$renderer, {
28052
+ tab});
28053
+ $$renderer.push(`<!----> `);
28054
+ SettingsSkillsHeaderActions($$renderer, {
28055
+ tab,
28056
+ reloadState,
28057
+ busy});
28058
+ $$renderer.push(`<!----></div>`);
28059
+ }
27146
28060
  /**
27147
28061
  * What the button should show RIGHT NOW. The deadline, not the mount moment,
27148
28062
  * is the contract: a done blob past its doneAt reads idle even before the
@@ -27156,7 +28070,6 @@ function visiblePhase(state, now) {
27156
28070
  function SettingsSkillsPanel($$renderer, $$props) {
27157
28071
  $$renderer.component(($$renderer) => {
27158
28072
  let busy = false;
27159
- let progress = null;
27160
28073
  const reloadState = derived(() => visiblePhase());
27161
28074
  /** Persisted reload feedback (hard-reload survival): a restored
27162
28075
  * 'done' lives out its remaining 5s window; a restored 'loading'
@@ -27181,64 +28094,149 @@ function SettingsSkillsPanel($$renderer, $$props) {
27181
28094
  $$settled = false;
27182
28095
  }
27183
28096
  });
27184
- $$renderer.push(`<!----> <div class="shelf-header svelte-lnunga" data-testid="shelf-header">`);
27185
- SettingsSkillsTabgroup($$renderer, {
27186
- tab});
27187
- $$renderer.push(`<!----> <div class="shelf-header-actions svelte-lnunga">`);
27188
- if (tab === "install") {
28097
+ $$renderer.push(`<!----> `);
28098
+ SettingsSkillsHeader($$renderer, {
28099
+ tab,
28100
+ reloadState: reloadState(),
28101
+ busy});
28102
+ $$renderer.push(`<!----> `);
28103
+ {
27189
28104
  $$renderer.push("<!--[0-->");
27190
- $$renderer.push(`<button type="button"${attr_class("shelf-reload svelte-lnunga", void 0, {
27191
- "reloading": reloadState() === "loading",
27192
- "reloaded": reloadState() === "done"
27193
- })} data-testid="shelf-reload"${attr("data-reload-state", reloadState())}${attr("title", reloadState() === "loading" ? t(skillsshelfreloading2) : reloadState() === "done" ? t(skillsshelfreloaded2) : t(skillsshelfreload2))}${attr("aria-label", reloadState() === "loading" ? t(skillsshelfreloading2) : reloadState() === "done" ? t(skillsshelfreloaded2) : t(skillsshelfreload2))}${attr("disabled", busy, true)}>`);
27194
- if (reloadState() === "loading") {
27195
- $$renderer.push("<!--[0-->");
27196
- Loader_circle($$renderer, {
27197
- size: 13,
27198
- "aria-hidden": "true"
27199
- });
27200
- } else if (reloadState() === "done") {
27201
- $$renderer.push("<!--[1-->");
27202
- Check($$renderer, {
27203
- size: 13,
27204
- "aria-hidden": "true"
27205
- });
27206
- } else {
27207
- $$renderer.push("<!--[-1-->");
27208
- Rotate_cw($$renderer, {
27209
- size: 13,
27210
- "aria-hidden": "true"
27211
- });
28105
+ $$renderer.push(`<p class="shelf-note svelte-lnunga" data-testid="shelf-loading">${escape_html(t(skillsshelfloading2))}</p>`);
28106
+ }
28107
+ $$renderer.push(`<!--]--></div>`);
28108
+ }
28109
+ do {
28110
+ $$settled = true;
28111
+ $$inner_renderer = $$renderer.copy();
28112
+ $$render_inner($$inner_renderer);
28113
+ } while (!$$settled);
28114
+ $$renderer.subsume($$inner_renderer);
28115
+ });
28116
+ }
28117
+ //#endregion
28118
+ //#region src/lib/components/settings-plugins/PluginManagerHeaderTabs.svelte
28119
+ function PluginManagerHeaderTabs($$renderer, $$props) {
28120
+ $$renderer.component(($$renderer) => {
28121
+ /**
28122
+ * PluginManagerHeaderTabs - the rack's install/uninstall tab pill
28123
+ * (The Plugin Rack ADR, 2026-09-27, D1), the shelf HeaderTabs'
28124
+ * joined-pill segmented grammar (SettingsSkillsHeaderTabs, D3):
28125
+ * presentational - tab state lives in PluginManagerPanel, this only
28126
+ * renders the two segments and reports picks.
28127
+ */
28128
+ let { tab} = $$props;
28129
+ $$renderer.push(`<div data-svelte="PluginManagerHeaderTabs" class="seg-group svelte-srf628" role="group"${attr("aria-label", t(pluginracktitle2))} data-testid="rack-tabs"><button type="button"${attr_class("seg left svelte-srf628", void 0, { "on": tab === "install" })}${attr("aria-pressed", tab === "install")} data-testid="rack-tab-install">${escape_html(t(pluginrackinstall2))}</button> <button type="button"${attr_class("seg right svelte-srf628", void 0, { "on": tab === "uninstall" })}${attr("aria-pressed", tab === "uninstall")} data-testid="rack-tab-uninstall">${escape_html(t(pluginrackuninstall2))}</button></div>`);
28130
+ });
28131
+ }
28132
+ //#endregion
28133
+ //#region src/lib/components/settings-plugins/PluginManagerHeaderActions.svelte
28134
+ function PluginManagerHeaderActions($$renderer, $$props) {
28135
+ $$renderer.component(($$renderer) => {
28136
+ /**
28137
+ * PluginManagerHeaderActions - the rack header's action cluster,
28138
+ * the shelf HeaderActions' grammar (SettingsSkillsHeaderActions,
28139
+ * The Shelf Chrome ADR): the reload verb. Presentational: every
28140
+ * verb and all state are owned by PluginManagerPanel.
28141
+ */
28142
+ let { loading, floorBounce} = $$props;
28143
+ $$renderer.push(`<div data-svelte="PluginManagerHeaderActions" class="rack-header-actions svelte-1g0idp7"><button class="rack-reload svelte-1g0idp7" type="button"${attr("title", t(pluginrackreload2))}${attr("aria-label", t(pluginrackreload2))} data-testid="rack-reload"${attr("disabled", loading || floorBounce, true)}>`);
28144
+ Rotate_cw($$renderer, { size: 14 });
28145
+ $$renderer.push(`<!----></button></div>`);
28146
+ });
28147
+ }
28148
+ //#endregion
28149
+ //#region src/lib/components/settings-plugins/PluginManagerHeader.svelte
28150
+ function PluginManagerHeader($$renderer, $$props) {
28151
+ /**
28152
+ * PluginManagerHeader - the rack chrome's header row (The Plugin Rack
28153
+ * ADR, 2026-09-27, D1), the shelf Header's grammar: the tab group on
28154
+ * the left, the action cluster on the right.
28155
+ * Presentational: every verb and all state are owned by
28156
+ * PluginManagerPanel.
28157
+ */
28158
+ let { tab, loading, floorBounce} = $$props;
28159
+ $$renderer.push(`<div data-svelte="PluginManagerHeader" class="rack-head svelte-1lc924" data-testid="rack-header">`);
28160
+ PluginManagerHeaderTabs($$renderer, {
28161
+ tab});
28162
+ $$renderer.push(`<!----> `);
28163
+ PluginManagerHeaderActions($$renderer, {
28164
+ loading,
28165
+ floorBounce});
28166
+ $$renderer.push(`<!----></div>`);
28167
+ }
28168
+ //#endregion
28169
+ //#region src/lib/components/settings-plugins/PluginManagerToolbar.svelte
28170
+ function PluginManagerToolbar($$renderer, $$props) {
28171
+ $$renderer.component(($$renderer) => {
28172
+ /**
28173
+ * PluginManagerToolbar — the rack's first chrome row, the shelf
28174
+ * Toolbar's grammar (SettingsSkillsToolbar, The Shelf Chrome ADR D2):
28175
+ * LEFT the snapshot timestamp; RIGHT the search input and the panel
28176
+ * capture. Presentational: the panel owns searchQ ($bindable — the
28177
+ * box owns keystrokes, the panel owns the value); this renders the row.
28178
+ */
28179
+ let { generatedAt, searchQ = "", container } = $$props;
28180
+ $$renderer.push(`<div data-svelte="PluginManagerToolbar" class="rack-toolbar svelte-m789m0" data-testid="rack-toolbar"><span class="rack-generated-label svelte-m789m0" data-testid="rack-generated">${escape_html(t(skillsshelfgeneratedat3))}: ${escape_html(generatedAt)}</span> <div class="rack-toolbar-actions svelte-m789m0"><input class="rack-search svelte-m789m0" type="search"${attr("placeholder", t(pluginracksearch2))}${attr("aria-label", t(pluginracksearch2))}${attr("value", searchQ)} data-testid="rack-search"/> <span class="copy-slot svelte-m789m0">`);
28181
+ CanvasCopyButton($$renderer, {
28182
+ container,
28183
+ mode: "visible",
28184
+ title: t(copypanelasimage3),
28185
+ size: 12
28186
+ });
28187
+ $$renderer.push(`<!----></span></div></div>`);
28188
+ bind_props($$props, { searchQ });
28189
+ });
28190
+ }
28191
+ //#endregion
28192
+ //#region src/lib/components/settings-plugins/PluginManagerPanel.svelte
28193
+ function PluginManagerPanel($$renderer, $$props) {
28194
+ $$renderer.component(($$renderer) => {
28195
+ /**
28196
+ * PluginManagerPanel — The Plugin Rack (ADR 2026-09-27, D1): the
28197
+ * panel is the STATE OWNER and owns its fetches (/api/plugins/*);
28198
+ * it never touches the engine or dsh. One list, per-row verb: an
28199
+ * uninstalled row offers install, an installed row offers uninstall
28200
+ * (the manifest is the uninstall authority, D4 — the snapshot's
28201
+ * installed flag is the API's derived copy). A successful apply ends
28202
+ * with the DSH restart chain: the floor goes down and re-attaches on
28203
+ * the same URL (D5) — the banner says so BEFORE the fetch storms.
28204
+ */
28205
+ /** Persisted chrome (the explorer-tab pattern): the active pill tab.
28206
+ * Junk sanitizes to 'install'. */
28207
+ /** Reports the active tab up to the panel entry (hard-reload survival). */
28208
+ let { initialTab = "install"} = $$props;
28209
+ let loading = true;
28210
+ let floorBounce = false;
28211
+ let tab = initialTab === "uninstall" ? "uninstall" : "install";
28212
+ let searchQ = "";
28213
+ let rootEl = null;
28214
+ let $$settled = true;
28215
+ let $$inner_renderer;
28216
+ function $$render_inner($$renderer) {
28217
+ $$renderer.push(`<div data-svelte="PluginManagerPanel" class="rack svelte-z3jis1" data-testid="rack-body">`);
28218
+ PluginManagerToolbar($$renderer, {
28219
+ generatedAt: "",
28220
+ container: rootEl,
28221
+ get searchQ() {
28222
+ return searchQ;
28223
+ },
28224
+ set searchQ($$value) {
28225
+ searchQ = $$value;
28226
+ $$settled = false;
27212
28227
  }
27213
- $$renderer.push(`<!--]--> `);
27214
- if (reloadState() === "loading" && progress);
27215
- else $$renderer.push("<!--[-1-->");
27216
- $$renderer.push(`<!--]--></button> `);
27217
- if (tab === "install" && reloadState() === "loading") {
27218
- $$renderer.push("<!--[0-->");
27219
- $$renderer.push(`<button type="button" class="shelf-reload-cancel svelte-lnunga" data-testid="shelf-reload-cancel"${attr("title", t(skillsshelfreloadcancel3))}${attr("aria-label", t(skillsshelfreloadcancel3))}>`);
27220
- X($$renderer, {
27221
- size: 13,
27222
- "aria-hidden": "true"
27223
- });
27224
- $$renderer.push(`<!----></button>`);
27225
- } else $$renderer.push("<!--[-1-->");
27226
- $$renderer.push(`<!--]-->`);
27227
- } else $$renderer.push("<!--[-1-->");
27228
- $$renderer.push(`<!--]--> <div class="seg-group svelte-lnunga" role="group"${attr("aria-label", t(skillsshelftitle2))} data-testid="shelf-fold-toggle"><button type="button" class="seg left svelte-lnunga"${attr("aria-label", t(skillsshelfcollapseall3))}${attr("title", t(skillsshelfcollapseall3))} data-testid="shelf-collapse-all">`);
27229
- Chevrons_down_up($$renderer, {
27230
- size: 12,
27231
- "aria-hidden": "true"
27232
- });
27233
- $$renderer.push(`<!----></button> <button type="button" class="seg right svelte-lnunga"${attr("aria-label", t(skillsshelfexpandall3))}${attr("title", t(skillsshelfexpandall3))} data-testid="shelf-expand-all">`);
27234
- Chevrons_up_down($$renderer, {
27235
- size: 12,
27236
- "aria-hidden": "true"
27237
28228
  });
27238
- $$renderer.push(`<!----></button></div></div></div> `);
28229
+ $$renderer.push(`<!----> `);
28230
+ PluginManagerHeader($$renderer, {
28231
+ tab,
28232
+ loading,
28233
+ floorBounce});
28234
+ $$renderer.push(`<!----> `);
27239
28235
  {
27240
- $$renderer.push("<!--[0-->");
27241
- $$renderer.push(`<p class="shelf-note svelte-lnunga" data-testid="shelf-loading">${escape_html(t(skillsshelfloading2))}</p>`);
28236
+ $$renderer.push("<!--[1-->");
28237
+ $$renderer.push(`<div class="rack-note svelte-z3jis1"><span class="spin svelte-z3jis1">`);
28238
+ Loader_circle($$renderer, { size: 14 });
28239
+ $$renderer.push(`<!----></span></div>`);
27242
28240
  }
27243
28241
  $$renderer.push(`<!--]--></div>`);
27244
28242
  }
@@ -28330,7 +29328,7 @@ function isPanelEntry(value) {
28330
29328
  if (value === null || typeof value !== "object") return false;
28331
29329
  const entry = value;
28332
29330
  if (typeof entry.id !== "string" || entry.id.length === 0) return false;
28333
- if (entry.kind !== void 0 && entry.kind !== "conversation" && entry.kind !== "prompt-manager" && entry.kind !== "settings-editor" && entry.kind !== "injected-doc" && entry.kind !== "skill-shelf" && entry.kind !== "workspace-explorer" && entry.kind !== "workspace-file" && entry.kind !== "terminal") return false;
29331
+ if (entry.kind !== void 0 && entry.kind !== "conversation" && entry.kind !== "prompt-manager" && entry.kind !== "settings-editor" && entry.kind !== "injected-doc" && entry.kind !== "skill-shelf" && entry.kind !== "plugin-rack" && entry.kind !== "workspace-explorer" && entry.kind !== "workspace-file" && entry.kind !== "terminal") return false;
28334
29332
  if (entry.kind === "settings-editor" && entry.target !== "dsi" && entry.target !== "dsh") return false;
28335
29333
  if (entry.kind === "workspace-explorer") {
28336
29334
  if (entry.sessionId !== null && (typeof entry.sessionId !== "string" || entry.sessionId.length === 0)) return false;
@@ -28347,7 +29345,7 @@ function isPanelEntry(value) {
28347
29345
  if (typeof entry.sourceSessionId !== "string" || entry.sourceSessionId.length === 0) return false;
28348
29346
  if (typeof entry.displayPath !== "string" || entry.displayPath.length === 0) return false;
28349
29347
  }
28350
- if (entry.kind !== "prompt-manager" && entry.kind !== "settings-editor" && entry.kind !== "skill-shelf" && entry.kind !== "injected-doc" && entry.kind !== "workspace-explorer" && entry.kind !== "workspace-file" && entry.kind !== "terminal") {
29348
+ if (entry.kind !== "prompt-manager" && entry.kind !== "settings-editor" && entry.kind !== "skill-shelf" && entry.kind !== "plugin-rack" && entry.kind !== "injected-doc" && entry.kind !== "workspace-explorer" && entry.kind !== "workspace-file" && entry.kind !== "terminal") {
28351
29349
  if (typeof entry.sessionId !== "string" || entry.sessionId.length === 0) return false;
28352
29350
  if (entry.agentPreset !== void 0 && typeof entry.agentPreset !== "string" && entry.agentPreset !== null) return false;
28353
29351
  }
@@ -28367,7 +29365,7 @@ function sanitizePanels(raw) {
28367
29365
  if (!Array.isArray(raw)) return [];
28368
29366
  const seen = /* @__PURE__ */ new Set();
28369
29367
  return raw.filter((entry) => isPanelEntry(entry)).map((entry) => {
28370
- const kindDefault = entry.kind === "skill-shelf" ? shelfPanelWidth() : entry.kind === "workspace-explorer" ? 850 : entry.kind === "workspace-file" ? 850 : defaultPanelWidth();
29368
+ const kindDefault = entry.kind === "skill-shelf" ? shelfPanelWidth() : entry.kind === "plugin-rack" ? shelfPanelWidth() : entry.kind === "workspace-explorer" ? 850 : entry.kind === "workspace-file" ? 850 : defaultPanelWidth();
28371
29369
  const width = clampPanelWidth(typeof entry.width === "number" && Number.isFinite(entry.width) ? entry.width : kindDefault, entry.kind);
28372
29370
  if (entry.kind === "prompt-manager") return {
28373
29371
  id: entry.id,
@@ -28411,6 +29409,12 @@ function sanitizePanels(raw) {
28411
29409
  width
28412
29410
  };
28413
29411
  }
29412
+ if (entry.kind === "plugin-rack") return {
29413
+ id: entry.id,
29414
+ kind: "plugin-rack",
29415
+ tab: entry.tab === "uninstall" ? "uninstall" : "install",
29416
+ width
29417
+ };
28414
29418
  if (entry.kind === "injected-doc") return {
28415
29419
  id: entry.id,
28416
29420
  kind: "injected-doc",
@@ -29671,8 +30675,14 @@ function _page($$renderer, $$props) {
29671
30675
  host: "panel"
29672
30676
  });
29673
30677
  $$renderer.push(`<!----></div>`);
29674
- } else if (panel.kind === "skill-shelf") {
30678
+ } else if (panel.kind === "plugin-rack") {
29675
30679
  $$renderer.push("<!--[2-->");
30680
+ $$renderer.push(`<div class="panel-manager-body svelte-1uha8ag" data-testid="panel-plugins">`);
30681
+ PluginManagerPanel($$renderer, {
30682
+ initialTab: panel.tab ?? "install"});
30683
+ $$renderer.push(`<!----></div>`);
30684
+ } else if (panel.kind === "skill-shelf") {
30685
+ $$renderer.push("<!--[3-->");
29676
30686
  $$renderer.push(`<div class="panel-manager-body svelte-1uha8ag" data-testid="panel-skills">`);
29677
30687
  SettingsSkillsPanel($$renderer, {
29678
30688
  initialTab: panel.tab ?? "install",
@@ -29681,13 +30691,13 @@ function _page($$renderer, $$props) {
29681
30691
  initialReload: panel.reload ?? null});
29682
30692
  $$renderer.push(`<!----></div>`);
29683
30693
  } else if (panel.kind === "settings-editor") {
29684
- $$renderer.push("<!--[3-->");
30694
+ $$renderer.push("<!--[4-->");
29685
30695
  $$renderer.push(`<div class="panel-manager-body svelte-1uha8ag" data-testid="panel-settings">`);
29686
30696
  SettingsEditorPanel($$renderer, {
29687
30697
  target: panel.target});
29688
30698
  $$renderer.push(`<!----></div>`);
29689
30699
  } else if (panel.kind === "injected-doc") {
29690
- $$renderer.push("<!--[4-->");
30700
+ $$renderer.push("<!--[5-->");
29691
30701
  $$renderer.push(`<div class="panel-manager-body svelte-1uha8ag">`);
29692
30702
  InjectedDocPanel($$renderer, {
29693
30703
  sourceSessionId: panel.sourceSessionId,
@@ -29695,7 +30705,7 @@ function _page($$renderer, $$props) {
29695
30705
  entries: coldCache[panel.sourceSessionId]?.entries ?? []});
29696
30706
  $$renderer.push(`<!----></div>`);
29697
30707
  } else if (panel.kind === "workspace-explorer") {
29698
- $$renderer.push("<!--[5-->");
30708
+ $$renderer.push("<!--[6-->");
29699
30709
  WorkspaceExplorerPanel($$renderer, {
29700
30710
  sessionId: panel.sessionId,
29701
30711
  root: panel.root,
@@ -29726,7 +30736,7 @@ function _page($$renderer, $$props) {
29726
30736
  onActivateTab: (path) => activateExplorerTab(panel.id, path)
29727
30737
  });
29728
30738
  } else if (panel.kind === "workspace-file") {
29729
- $$renderer.push("<!--[6-->");
30739
+ $$renderer.push("<!--[7-->");
29730
30740
  WorkspaceFilePanel($$renderer, {
29731
30741
  sessionId: panel.sessionId,
29732
30742
  path: panel.path,
@@ -29736,7 +30746,7 @@ function _page($$renderer, $$props) {
29736
30746
  onclose: () => removePanel(panel.id)
29737
30747
  });
29738
30748
  } else if (panel.kind === "conversation") {
29739
- $$renderer.push("<!--[7-->");
30749
+ $$renderer.push("<!--[8-->");
29740
30750
  const p = panel;
29741
30751
  $$renderer.push(`<!---->`);
29742
30752
  if (deadSessions[p.sessionId]) {
@@ -29898,4 +30908,4 @@ function _page($$renderer, $$props) {
29898
30908
  }
29899
30909
 
29900
30910
  export { _page as default };
29901
- //# sourceMappingURL=_page.svelte.js-DoOQ17mk.js.map
30911
+ //# sourceMappingURL=_page.svelte.js-6A1VYbL2.js.map