@deepseek-insight/dsi 0.10.1 → 0.11.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 (122) hide show
  1. package/.agents/skills/glass-dsi/scripts/_connect.mjs +21 -2
  2. package/.agents/skills/glass-url/scripts/_connect.mjs +4 -2
  3. package/README.md +34 -26
  4. package/bin/dsi.mjs +23 -12
  5. package/bin/lib/glass-browser-bootstrap.mjs +19 -2
  6. package/bin/lib/plugin-chain.mjs +6 -5
  7. package/bin/lib/zai-patch.mjs +3 -1
  8. package/build/client/_app/immutable/assets/0.Bjw4vcZl.css +2 -0
  9. package/build/client/_app/immutable/assets/2.glyfXGzi.css +1 -0
  10. package/build/client/_app/immutable/chunks/Dj8AK3pr.js +1 -0
  11. package/build/client/_app/immutable/chunks/UPlr67N1.js +2 -0
  12. package/build/client/_app/immutable/chunks/WySTHi46.js +1 -0
  13. package/build/client/_app/immutable/chunks/{UcxQDPMg.js → e-3PBXxJ.js} +1 -1
  14. package/build/client/_app/immutable/entry/{app.GxH1nznH.js → app.ezxtVZch.js} +2 -2
  15. package/build/client/_app/immutable/entry/start.DdPLwPDt.js +1 -0
  16. package/build/client/_app/immutable/nodes/{1.BVvBJtMj.js → 1.CGppLUrN.js} +1 -1
  17. package/build/client/_app/immutable/nodes/{2.D0JzdegJ.js → 2.9BE7-E5x.js} +197 -199
  18. package/build/client/_app/version.json +1 -1
  19. package/build/handler.js +5 -5
  20. package/build/index.js +5 -5
  21. package/build/server/chunks/chunks/{db.js-f2PmBjyD.js → db.js-BGSxIVb3.js} +2 -2
  22. package/build/server/chunks/chunks/{db2.js-DkwY64WO.js → db2.js-vQNFcVO7.js} +2 -2
  23. package/build/server/chunks/chunks/{dsh-connection.js-BW07Aicl.js → dsh-connection.js-Dcdxqp52.js} +27 -7
  24. package/build/server/chunks/chunks/{exports.js-DH_tjtdv.js → exports.js-D5zA1U7A.js} +42 -4
  25. package/build/server/chunks/chunks/{git-probe.js-CQqTV7XX.js → git-probe.js-BIieYqLU.js} +2 -2
  26. package/build/server/chunks/chunks/{insight-config.js-C5-Rhh5A.js → insight-config.js-ylYA2CXm.js} +2 -2
  27. package/build/server/chunks/chunks/{internal2.js-BRzR_ZGp.js → internal2.js-Cu5N8_4R.js} +3 -3
  28. package/build/server/chunks/chunks/{registry.js-6St5Biiy.js → registry.js-Bwc2MNSZ.js} +53 -50
  29. package/build/server/chunks/chunks/{registry2.js-CFzpvj9c.js → registry2.js-BZfrwsOy.js} +20 -1
  30. package/build/server/chunks/chunks/{settings-document.js-DxKURfc_.js → settings-document.js-BIxaivJ1.js} +23 -8
  31. package/build/server/chunks/chunks/{state.js-Ct6h8rMl.js → state.js-CRPhnJJH.js} +3 -3
  32. package/build/server/chunks/chunks/{watcher.js-DvlNn8X0.js → watcher.js-Bcm29AuA.js} +4 -4
  33. package/build/server/chunks/entries/endpoints/api/a2a/_id_/{_server.ts.js-DItDXV23.js → _server.ts.js-BbIEpZB5.js} +4 -4
  34. package/build/server/chunks/entries/endpoints/api/a2a/{_server.ts.js-Hor8QZb1.js → _server.ts.js-Daho1I-l.js} +6 -6
  35. package/build/server/chunks/entries/endpoints/api/a2a/register/{_server.ts.js-CEvvsa8B.js → _server.ts.js-C5X77Uef.js} +6 -6
  36. package/build/server/chunks/entries/endpoints/api/browser/_id_/activate/{_server.ts.js-DYvCel9L.js → _server.ts.js-BxfB-QXT.js} +4 -4
  37. package/build/server/chunks/entries/endpoints/api/browser/_id_/close/{_server.ts.js-CDNbpOqu.js → _server.ts.js-DT6rU-EU.js} +4 -4
  38. package/build/server/chunks/entries/endpoints/api/browser/_id_/closetab/{_server.ts.js-C8UZMTcb.js → _server.ts.js-Cwu4C98Y.js} +4 -4
  39. package/build/server/chunks/entries/endpoints/api/browser/_id_/element/{_server.ts.js-CERwttQS.js → _server.ts.js-B55tx3-S.js} +4 -4
  40. package/build/server/chunks/entries/endpoints/api/browser/_id_/history/{_server.ts.js-DtVkS-mH.js → _server.ts.js-D2ft7u0s.js} +4 -4
  41. package/build/server/chunks/entries/endpoints/api/browser/_id_/input/{_server.ts.js-C85umKKr.js → _server.ts.js-BO1uO6i3.js} +4 -4
  42. package/build/server/chunks/entries/endpoints/api/browser/_id_/mcp/{_server.ts.js-CrTtygPQ.js → _server.ts.js-zOccgfJZ.js} +4 -4
  43. package/build/server/chunks/entries/endpoints/api/browser/_id_/navigate/{_server.ts.js-DgJ6DXVr.js → _server.ts.js-DgyR0sLf.js} +4 -4
  44. package/build/server/chunks/entries/endpoints/api/browser/_id_/opentab/{_server.ts.js-Bj9bKEEv.js → _server.ts.js-CPCIL2MG.js} +4 -4
  45. package/build/server/chunks/entries/endpoints/api/browser/_id_/page/{_server.ts.js--1WTGEfT.js → _server.ts.js-Cjvr5nEt.js} +4 -4
  46. package/build/server/chunks/entries/endpoints/api/browser/_id_/stream/{_server.ts.js-D8hQe810.js → _server.ts.js-Bb3DkB-H.js} +4 -4
  47. package/build/server/chunks/entries/endpoints/api/browser/_id_/tabs/{_server.ts.js-CSYYFlm2.js → _server.ts.js-DVcq1pYf.js} +4 -4
  48. package/build/server/chunks/entries/endpoints/api/browser/_id_/viewport/{_server.ts.js-KJjT8zXH.js → _server.ts.js-D1xgkwTO.js} +4 -4
  49. package/build/server/chunks/entries/endpoints/api/browser/_id_/zoom/{_server.ts.js-DQtzgPeG.js → _server.ts.js-DFo94fTq.js} +4 -4
  50. package/build/server/chunks/entries/endpoints/api/browser/{_server.ts.js-DSkCBGRA.js → _server.ts.js-0Gye8oLN.js} +4 -4
  51. package/build/server/chunks/entries/endpoints/api/config/{_server.ts.js-C_9kwANR.js → _server.ts.js-DqPIv-gn.js} +4 -4
  52. package/build/server/chunks/entries/endpoints/api/dsh/directory/{_server.ts.js-h1OTHcL4.js → _server.ts.js-DzFVVhO_.js} +4 -4
  53. package/build/server/chunks/entries/endpoints/api/dsh/jobs/{_server.ts.js-B6nih9Sd.js → _server.ts.js-DvuZUgbK.js} +4 -4
  54. package/build/server/chunks/entries/endpoints/api/dsh/jobs/follow/{_server.ts.js-Cf17SVmD.js → _server.ts.js-D6brRlYZ.js} +4 -4
  55. package/build/server/chunks/entries/endpoints/api/dsh/pick-directory/{_server.ts.js-DjNwMbdS.js → _server.ts.js-8nNlcikK.js} +4 -4
  56. package/build/server/chunks/entries/endpoints/api/dsh/presets/{_server.ts.js-Cz5aaEhC.js → _server.ts.js-C8AZBt63.js} +4 -4
  57. package/build/server/chunks/entries/endpoints/api/dsh/session/_sessionId_/attachment/{_server.ts.js-BFBy5O9Y.js → _server.ts.js-BFfr6uJh.js} +4 -4
  58. package/build/server/chunks/entries/endpoints/api/dsh/session/_sessionId_/cancel/{_server.ts.js-CgEdCo3T.js → _server.ts.js-DSSgbD87.js} +4 -4
  59. package/build/server/chunks/entries/endpoints/api/dsh/session/_sessionId_/catalog/{_server.ts.js-Bo_aEnHh.js → _server.ts.js-DYtrYC2P.js} +4 -4
  60. package/build/server/chunks/entries/endpoints/api/dsh/session/_sessionId_/changes/{_server.ts.js-Bd2G_GaH.js → _server.ts.js-HxI5M4jg.js} +4 -4
  61. package/build/server/chunks/entries/endpoints/api/dsh/session/_sessionId_/command/{_server.ts.js-DL64FyRw.js → _server.ts.js-Ch0dMm33.js} +4 -4
  62. package/build/server/chunks/entries/endpoints/api/dsh/session/_sessionId_/events/{_server.ts.js-MhOGB66D.js → _server.ts.js-BG5C--Ok.js} +4 -4
  63. package/build/server/chunks/entries/endpoints/api/dsh/session/_sessionId_/fork/{_server.ts.js-MjPgXgGO.js → _server.ts.js-B64YyaFI.js} +4 -4
  64. package/build/server/chunks/entries/endpoints/api/dsh/session/_sessionId_/goal/{_server.ts.js-BUjDae5H.js → _server.ts.js-0RtL-9Zr.js} +4 -4
  65. package/build/server/chunks/entries/endpoints/api/dsh/session/_sessionId_/history/{_server.ts.js-dTKd7Hsv.js → _server.ts.js-C4k-RTIw.js} +4 -4
  66. package/build/server/chunks/entries/endpoints/api/dsh/session/_sessionId_/models/{_server.ts.js-B82rvKoI.js → _server.ts.js-CU38DxMt.js} +4 -4
  67. package/build/server/chunks/entries/endpoints/api/dsh/session/_sessionId_/path/{_server.ts.js-Cqijsi-c.js → _server.ts.js-BXphf5ux.js} +3 -3
  68. package/build/server/chunks/entries/endpoints/api/dsh/session/_sessionId_/permission/{_server.ts.js-CL_vVv2p.js → _server.ts.js-DQ5FG9Pc.js} +4 -4
  69. package/build/server/chunks/entries/endpoints/api/dsh/session/_sessionId_/prompt/{_server.ts.js-WS4W9Ly4.js → _server.ts.js-In3bXhUO.js} +4 -4
  70. package/build/server/chunks/entries/endpoints/api/dsh/session/_sessionId_/rename/{_server.ts.js-B72KGRGh.js → _server.ts.js-Bd0KF8Qm.js} +4 -4
  71. package/build/server/chunks/entries/endpoints/api/dsh/session/_sessionId_/respond/{_server.ts.js-DK5xb2b5.js → _server.ts.js-4Y-KAw2r.js} +4 -4
  72. package/build/server/chunks/entries/endpoints/api/dsh/session/_sessionId_/select-model/{_server.ts.js-lhT87EQu.js → _server.ts.js-zXYA1AJD.js} +4 -4
  73. package/build/server/chunks/entries/endpoints/api/dsh/sessions/{_server.ts.js-CMhfhbkN.js → _server.ts.js-vh7lFV0n.js} +4 -4
  74. package/build/server/chunks/entries/endpoints/api/dsh/subagents/{_server.ts.js-BLvcFsg6.js → _server.ts.js-DH7OEWm0.js} +4 -4
  75. package/build/server/chunks/entries/endpoints/api/dsh/workspace-file/{_server.ts.js-D_rw2Uq6.js → _server.ts.js-CDwgBp7D.js} +4 -4
  76. package/build/server/chunks/entries/endpoints/api/dsh/workspace-tree/{_server.ts.js-DfXpMMpw.js → _server.ts.js-CtFxC_yV.js} +4 -4
  77. package/build/server/chunks/entries/endpoints/api/dsh/workspaces/{_server.ts.js-2mJCJVxk.js → _server.ts.js-DRNzGdAj.js} +4 -4
  78. package/build/server/chunks/entries/endpoints/api/dsh/workspaces/_workspaceId_/delete/{_server.ts.js-BCx0Lzjf.js → _server.ts.js-DIjNfN0d.js} +4 -4
  79. package/build/server/chunks/entries/endpoints/api/dsh/workspaces/_workspaceId_/rename/{_server.ts.js-DECaSjwp.js → _server.ts.js-CtV7JhrK.js} +4 -4
  80. package/build/server/chunks/entries/endpoints/api/prompts/_id_/{_server.ts.js-i_ciJzlb.js → _server.ts.js-Cg9zHbUP.js} +4 -4
  81. package/build/server/chunks/entries/endpoints/api/prompts/{_server.ts.js-BO1pScn7.js → _server.ts.js-DOHmlKvl.js} +4 -4
  82. package/build/server/chunks/entries/endpoints/api/prompts/use/{_server.ts.js-Buhpf7WE.js → _server.ts.js-COVyy224.js} +4 -4
  83. package/build/server/chunks/entries/endpoints/api/settings/{_server.ts.js-DngUQzcT.js → _server.ts.js-HjpfRAaT.js} +3 -3
  84. package/build/server/chunks/entries/endpoints/api/terminal/_id_/delete/_server.ts.js-D9UU6xR6.js +42 -0
  85. package/build/server/chunks/entries/endpoints/api/terminal/_id_/output/{_server.ts.js-DLETP4yQ.js → _server.ts.js-BqJRMRsb.js} +2 -2
  86. package/build/server/chunks/entries/endpoints/api/terminal/_id_/reattach/{_server.ts.js-uWl6oxPS.js → _server.ts.js-D6bMXeOk.js} +2 -2
  87. package/build/server/chunks/entries/endpoints/api/terminal/_id_/send/{_server.ts.js-DYNmXaAd.js → _server.ts.js-BRgsqPFM.js} +2 -2
  88. package/build/server/chunks/entries/endpoints/api/terminal/_id_/stream/{_server.ts.js-C5m3Ktho.js → _server.ts.js-EWo4sSmg.js} +2 -2
  89. package/build/server/chunks/entries/endpoints/api/terminal/{_server.ts.js-DoTNvcOa.js → _server.ts.js-v1ixRdpN.js} +4 -4
  90. package/build/server/chunks/entries/endpoints/api/terminal/stream/_server.ts.js-BQOQyT7o.js +185 -0
  91. package/build/server/chunks/entries/endpoints/api/workspace/file-write/{_server.ts.js-BzYOJSkI.js → _server.ts.js-CjU6bLOf.js} +5 -5
  92. package/build/server/chunks/entries/endpoints/api/workspace/git-events/{_server.ts.js-xcNesei9.js → _server.ts.js-CYU0btiH.js} +5 -5
  93. package/build/server/chunks/entries/endpoints/api/workspace/git-file-head/{_server.ts.js-DsJWYdxt.js → _server.ts.js-Du9YcwLw.js} +5 -5
  94. package/build/server/chunks/entries/endpoints/api/workspace/git-map/{_server.ts.js-CNCku9BR.js → _server.ts.js-BdV_KDjb.js} +5 -5
  95. package/build/server/chunks/entries/endpoints/api/workspace/git-status/{_server.ts.js-nLsNjOxj.js → _server.ts.js-C-C84Yzu.js} +5 -5
  96. package/build/server/chunks/entries/endpoints/api/workspace/write-gate/{_server.ts.js-urQk2-ds.js → _server.ts.js-D9uFvZya.js} +5 -5
  97. package/build/server/chunks/entries/{hooks.server.js-CU2RE5vs.js → hooks.server.js-YJQlamhk.js} +2 -2
  98. package/build/server/chunks/entries/pages/{_error.svelte.js-BXD7Pthk.js → _error.svelte.js-CJ9RHd_3.js} +4 -4
  99. package/build/server/chunks/entries/pages/{_page.server.ts.js-BK3Y6eff.js → _page.server.ts.js-BFDPRDEm.js} +2 -2
  100. package/build/server/chunks/entries/pages/{_page.svelte.js-DaZfwP76.js → _page.svelte.js-DlLAziUY.js} +477 -139
  101. package/build/server/chunks/{handler-C5_-AjlT.js → handler-BRlzTcii.js} +3 -3
  102. package/build/server/chunks/{index.js-BECscw6k.js → index.js-D2umW-Cg.js} +3 -44
  103. package/build/server/chunks/{manifest.js-aksIjogg.js → manifest.js-CaT4HRXz.js} +81 -67
  104. package/build/server/chunks/nodes/{0.js-xX4GZsu5.js → 0.js-B8ciwPSu.js} +3 -3
  105. package/build/server/chunks/nodes/1.js-cXTCbvze.js +9 -0
  106. package/build/server/chunks/nodes/{2.js-CBdFoBFK.js → 2.js-CF_m1q-z.js} +8 -8
  107. package/package.json +1 -1
  108. package/skills/dsi-drive-terminal/SKILL.md +23 -1
  109. package/skills/dsi-spec/SKILL.md +8 -0
  110. package/skills/dsi-task/SKILL.md +34 -0
  111. package/skills/dsi-token-spent/SKILL.md +122 -0
  112. package/template/.dsi/prompts.sqlite +0 -0
  113. package/template/.dsi/prompts.sqlite-shm +0 -0
  114. package/template/.dsi/prompts.sqlite-wal +0 -0
  115. package/build/client/_app/immutable/assets/0.CxUWwepa.css +0 -2
  116. package/build/client/_app/immutable/assets/2.CSFboNRO.css +0 -1
  117. package/build/client/_app/immutable/chunks/C4M9oU_3.js +0 -1
  118. package/build/client/_app/immutable/chunks/CNT-CapI.js +0 -1
  119. package/build/client/_app/immutable/chunks/DttyJZuo.js +0 -2
  120. package/build/client/_app/immutable/entry/start.P-LmBYpD.js +0 -1
  121. package/build/server/chunks/nodes/1.js-BaNGyV1A.js +0 -9
  122. /package/build/client/_app/immutable/nodes/{0.CfpMgVS-.js → 0.DopnsZUT.js} +0 -0
@@ -1,5 +1,5 @@
1
1
  import { a as __exportAll, o as onDestroy } from '../../chunks/index-server.js-CPkVoRxB.js';
2
- import '../../chunks/exports.js-DH_tjtdv.js';
2
+ import '../../chunks/exports.js-D5zA1U7A.js';
3
3
  import { M as derived, V as head, T as writable, X as attr, W as escape_html, Y as ensure_array_like, Z as attr_class, _ as attr_style, $ as stringify, a0 as bind_props, a as setContext, a1 as store_get, a2 as spread_props, a3 as attributes, a4 as clsx, a5 as element, g as getContext, a6 as unsubscribe_stores, a7 as html, r as run, a8 as props_id } from '../../chunks/server.js-Dijo7DtV.js';
4
4
  import { U as UI_LOCALES } from '../../chunks/config.js-r_jw_bQQ.js';
5
5
  import { m as mergeEntries, c as collapseSystemPromptEntries, t as truncate } from '../../chunks/merge.js-yMwW440S.js';
@@ -9,7 +9,7 @@ import { D as DEFAULT_IMAGE_LIMITS } from '../../chunks/image-limits.js-CUdJ0f7r
9
9
  import { s as sanitizeWorkspaceProfile, d as dsiKey, t as themePrefs } from '../../chunks/theme-prefs.svelte.js-8CaWz46g.js';
10
10
  import { a as appConfig, p as previewSegments, b as parseTagWords, i as isValidTagWord, s as shouldRecordPrompt, g as getTrigger, t as triggerMode, c as searchKey, d as textPreviewOf } from '../../chunks/app-config.svelte.js-BXjvTmJu.js';
11
11
  import { c as getLocale } from '../../chunks/runtime.js-CCJi3XaY.js';
12
- import { p as page, a as afterNavigate, t, c as currentLocale, e as replaceState, u as unexpectederror1, s as sessionnotfound2, r as reapednote1, d as dshunreachable1, b as backtoworkspace2 } from '../../chunks/state.js-Ct6h8rMl.js';
12
+ import { p as page, a as afterNavigate, t, c as currentLocale, e as replaceState, u as unexpectederror1, s as sessionnotfound2, r as reapednote1, d as dshunreachable1, b as backtoworkspace2 } from '../../chunks/state.js-CRPhnJJH.js';
13
13
  import 'yaml';
14
14
  import 'html-to-image';
15
15
  import hljs from 'highlight.js/lib/core';
@@ -21,7 +21,7 @@ import xml from 'highlight.js/lib/languages/xml';
21
21
  import css from 'highlight.js/lib/languages/css';
22
22
  import '../../chunks/uneval.js-BJ9Qq2SF.js';
23
23
  import '../../chunks/shared.js-HQ0rfhm4.js';
24
- import '../../chunks/internal2.js-BRzR_ZGp.js';
24
+ import '../../chunks/internal2.js-Cu5N8_4R.js';
25
25
  import '../../chunks/utils.js-CAdNO8Tu.js';
26
26
 
27
27
  //#region src/lib/paraglide/messages/abort.js
@@ -952,6 +952,70 @@ var browserchiplabel2 = ((inputs = {}, options = {}) => {
952
952
  return en_browserchiplabel2();
953
953
  });
954
954
  //#endregion
955
+ //#region src/lib/paraglide/messages/browserclonefallback2.js
956
+ /** @typedef {import('../runtime.js').LocalizedString} LocalizedString */
957
+ /** @typedef {{}} Browserclonefallback2Inputs */
958
+ var en_browserclonefallback2 = () => {
959
+ return `Couldn't clone your profile — opening a clean glass instead`;
960
+ };
961
+ var zh_browserclonefallback2 = () => {
962
+ return `无法克隆你的配置 — 改用干净的 glass 打开`;
963
+ };
964
+ var id_browserclonefallback2 = () => {
965
+ return `Gagal mengkloning profil — membuka glass bersih sebagai gantinya`;
966
+ };
967
+ var es_browserclonefallback2 = () => {
968
+ return `No se pudo clonar tu perfil — se abre un glass limpio en su lugar`;
969
+ };
970
+ /**
971
+ * | output |
972
+ * | --- |
973
+ * | "Couldn't clone your profile — opening a clean glass instead" |
974
+ *
975
+ * @param {Browserclonefallback2Inputs} inputs
976
+ * @param {{ locale?: "en" | "zh" | "id" | "es" }} options
977
+ * @returns {LocalizedString}
978
+ */
979
+ var browserclonefallback2 = ((inputs = {}, options = {}) => {
980
+ const locale = options.locale ?? getLocale();
981
+ if (locale === "zh") return zh_browserclonefallback2();
982
+ if (locale === "id") return id_browserclonefallback2();
983
+ if (locale === "es") return es_browserclonefallback2();
984
+ return en_browserclonefallback2();
985
+ });
986
+ //#endregion
987
+ //#region src/lib/paraglide/messages/browserclonehint2.js
988
+ /** @typedef {import('../runtime.js').LocalizedString} LocalizedString */
989
+ /** @typedef {{}} Browserclonehint2Inputs */
990
+ var en_browserclonehint2 = () => {
991
+ return `Cloning your last-used Chrome profile…`;
992
+ };
993
+ var zh_browserclonehint2 = () => {
994
+ return `正在克隆你最近使用的 Chrome 配置…`;
995
+ };
996
+ var id_browserclonehint2 = () => {
997
+ return `Mengkloning profil Chrome yang terakhir dipakai…`;
998
+ };
999
+ var es_browserclonehint2 = () => {
1000
+ return `Clonando tu perfil de Chrome más reciente…`;
1001
+ };
1002
+ /**
1003
+ * | output |
1004
+ * | --- |
1005
+ * | "Cloning your last-used Chrome profile…" |
1006
+ *
1007
+ * @param {Browserclonehint2Inputs} inputs
1008
+ * @param {{ locale?: "en" | "zh" | "id" | "es" }} options
1009
+ * @returns {LocalizedString}
1010
+ */
1011
+ var browserclonehint2 = ((inputs = {}, options = {}) => {
1012
+ const locale = options.locale ?? getLocale();
1013
+ if (locale === "zh") return zh_browserclonehint2();
1014
+ if (locale === "id") return id_browserclonehint2();
1015
+ if (locale === "es") return es_browserclonehint2();
1016
+ return en_browserclonehint2();
1017
+ });
1018
+ //#endregion
955
1019
  //#region src/lib/paraglide/messages/browserclosedelete2.js
956
1020
  /** @typedef {import('../runtime.js').LocalizedString} LocalizedString */
957
1021
  /** @typedef {{}} Browserclosedelete2Inputs */
@@ -1850,66 +1914,162 @@ var choosefolder1 = ((inputs = {}, options = {}) => {
1850
1914
  //#endregion
1851
1915
  //#region src/lib/paraglide/messages/chordarmedlabel2.js
1852
1916
  /** @typedef {import('../runtime.js').LocalizedString} LocalizedString */
1853
- /** @typedef {{}} Chordarmedlabel2Inputs */
1854
- var en_chordarmedlabel2 = () => {
1855
- return `Alt+S chord armed — next key`;
1917
+ /** @typedef {{ prefix: NonNullable<unknown> }} Chordarmedlabel2Inputs */
1918
+ var en_chordarmedlabel2 = (i) => {
1919
+ return `Alt+${i?.prefix} chord armed — next key`;
1856
1920
  };
1857
- var zh_chordarmedlabel2 = () => {
1858
- return `Alt+S 组合键已就绪 — 下一个按键`;
1921
+ var zh_chordarmedlabel2 = (i) => {
1922
+ return `Alt+${i?.prefix} 组合键已就绪 — 下一个按键`;
1859
1923
  };
1860
- var id_chordarmedlabel2 = () => {
1861
- return `Kord Alt+S armed — tombol berikutnya`;
1924
+ var id_chordarmedlabel2 = (i) => {
1925
+ return `Kord Alt+${i?.prefix} armed — tombol berikutnya`;
1862
1926
  };
1863
- var es_chordarmedlabel2 = () => {
1864
- return `Acordo Alt+S armado — siguiente tecla`;
1927
+ var es_chordarmedlabel2 = (i) => {
1928
+ return `Acordo Alt+${i?.prefix} armado — siguiente tecla`;
1865
1929
  };
1866
1930
  /**
1867
1931
  * | output |
1868
1932
  * | --- |
1869
- * | "Alt+S chord armed — next key" |
1933
+ * | "Alt+{prefix} chord armed — next key" |
1870
1934
  *
1871
1935
  * @param {Chordarmedlabel2Inputs} inputs
1872
1936
  * @param {{ locale?: "en" | "zh" | "id" | "es" }} options
1873
1937
  * @returns {LocalizedString}
1874
1938
  */
1875
- var chordarmedlabel2 = ((inputs = {}, options = {}) => {
1939
+ var chordarmedlabel2 = ((inputs, options = {}) => {
1876
1940
  const locale = options.locale ?? getLocale();
1877
- if (locale === "zh") return zh_chordarmedlabel2();
1878
- if (locale === "id") return id_chordarmedlabel2();
1879
- if (locale === "es") return es_chordarmedlabel2();
1880
- return en_chordarmedlabel2();
1941
+ if (locale === "zh") return zh_chordarmedlabel2(inputs);
1942
+ if (locale === "id") return id_chordarmedlabel2(inputs);
1943
+ if (locale === "es") return es_chordarmedlabel2(inputs);
1944
+ return en_chordarmedlabel2(inputs);
1881
1945
  });
1882
1946
  //#endregion
1883
1947
  //#region src/lib/paraglide/messages/chordarmedtitle2.js
1884
1948
  /** @typedef {import('../runtime.js').LocalizedString} LocalizedString */
1885
- /** @typedef {{}} Chordarmedtitle2Inputs */
1886
- var en_chordarmedtitle2 = () => {
1887
- return `Alt+S armed`;
1949
+ /** @typedef {{ prefix: NonNullable<unknown> }} Chordarmedtitle2Inputs */
1950
+ var en_chordarmedtitle2 = (i) => {
1951
+ return `Alt+${i?.prefix} armed`;
1888
1952
  };
1889
- var zh_chordarmedtitle2 = () => {
1890
- return `Alt+S 已就绪`;
1953
+ var zh_chordarmedtitle2 = (i) => {
1954
+ return `Alt+${i?.prefix} 已就绪`;
1891
1955
  };
1892
- var id_chordarmedtitle2 = () => {
1893
- return `Alt+S diarmed`;
1956
+ var id_chordarmedtitle2 = (i) => {
1957
+ return `Alt+${i?.prefix} diarmed`;
1894
1958
  };
1895
- var es_chordarmedtitle2 = () => {
1896
- return `Alt+S armado`;
1959
+ var es_chordarmedtitle2 = (i) => {
1960
+ return `Alt+${i?.prefix} armado`;
1897
1961
  };
1898
1962
  /**
1899
1963
  * | output |
1900
1964
  * | --- |
1901
- * | "Alt+S armed" |
1965
+ * | "Alt+{prefix} armed" |
1902
1966
  *
1903
1967
  * @param {Chordarmedtitle2Inputs} inputs
1904
1968
  * @param {{ locale?: "en" | "zh" | "id" | "es" }} options
1905
1969
  * @returns {LocalizedString}
1906
1970
  */
1907
- var chordarmedtitle2 = ((inputs = {}, options = {}) => {
1971
+ var chordarmedtitle2 = ((inputs, options = {}) => {
1972
+ const locale = options.locale ?? getLocale();
1973
+ if (locale === "zh") return zh_chordarmedtitle2(inputs);
1974
+ if (locale === "id") return id_chordarmedtitle2(inputs);
1975
+ if (locale === "es") return es_chordarmedtitle2(inputs);
1976
+ return en_chordarmedtitle2(inputs);
1977
+ });
1978
+ //#endregion
1979
+ //#region src/lib/paraglide/messages/chordterminalclear2.js
1980
+ /** @typedef {import('../runtime.js').LocalizedString} LocalizedString */
1981
+ /** @typedef {{}} Chordterminalclear2Inputs */
1982
+ var en_chordterminalclear2 = () => {
1983
+ return `Clear current terminal tab (kill + prune)`;
1984
+ };
1985
+ var zh_chordterminalclear2 = () => {
1986
+ return `清除当前终端标签页(终止并修剪)`;
1987
+ };
1988
+ var id_chordterminalclear2 = () => {
1989
+ return `Bersihkan tab terminal saat ini (matikan + pangkas)`;
1990
+ };
1991
+ var es_chordterminalclear2 = () => {
1992
+ return `Limpiar la pestaña de terminal actual (matar y podar)`;
1993
+ };
1994
+ /**
1995
+ * | output |
1996
+ * | --- |
1997
+ * | "Clear current terminal tab (kill + prune)" |
1998
+ *
1999
+ * @param {Chordterminalclear2Inputs} inputs
2000
+ * @param {{ locale?: "en" | "zh" | "id" | "es" }} options
2001
+ * @returns {LocalizedString}
2002
+ */
2003
+ var chordterminalclear2 = ((inputs = {}, options = {}) => {
2004
+ const locale = options.locale ?? getLocale();
2005
+ if (locale === "zh") return zh_chordterminalclear2();
2006
+ if (locale === "id") return id_chordterminalclear2();
2007
+ if (locale === "es") return es_chordterminalclear2();
2008
+ return en_chordterminalclear2();
2009
+ });
2010
+ //#endregion
2011
+ //#region src/lib/paraglide/messages/chordterminalnewtab3.js
2012
+ /** @typedef {import('../runtime.js').LocalizedString} LocalizedString */
2013
+ /** @typedef {{}} Chordterminalnewtab3Inputs */
2014
+ var en_chordterminalnewtab3 = () => {
2015
+ return `New terminal tab`;
2016
+ };
2017
+ var zh_chordterminalnewtab3 = () => {
2018
+ return `新建终端标签页`;
2019
+ };
2020
+ var id_chordterminalnewtab3 = () => {
2021
+ return `Tab terminal baru`;
2022
+ };
2023
+ var es_chordterminalnewtab3 = () => {
2024
+ return `Nueva pestaña de terminal`;
2025
+ };
2026
+ /**
2027
+ * | output |
2028
+ * | --- |
2029
+ * | "New terminal tab" |
2030
+ *
2031
+ * @param {Chordterminalnewtab3Inputs} inputs
2032
+ * @param {{ locale?: "en" | "zh" | "id" | "es" }} options
2033
+ * @returns {LocalizedString}
2034
+ */
2035
+ var chordterminalnewtab3 = ((inputs = {}, options = {}) => {
1908
2036
  const locale = options.locale ?? getLocale();
1909
- if (locale === "zh") return zh_chordarmedtitle2();
1910
- if (locale === "id") return id_chordarmedtitle2();
1911
- if (locale === "es") return es_chordarmedtitle2();
1912
- return en_chordarmedtitle2();
2037
+ if (locale === "zh") return zh_chordterminalnewtab3();
2038
+ if (locale === "id") return id_chordterminalnewtab3();
2039
+ if (locale === "es") return es_chordterminalnewtab3();
2040
+ return en_chordterminalnewtab3();
2041
+ });
2042
+ //#endregion
2043
+ //#region src/lib/paraglide/messages/chordterminalsplitdown3.js
2044
+ /** @typedef {import('../runtime.js').LocalizedString} LocalizedString */
2045
+ /** @typedef {{}} Chordterminalsplitdown3Inputs */
2046
+ var en_chordterminalsplitdown3 = () => {
2047
+ return `Split down current terminal tab`;
2048
+ };
2049
+ var zh_chordterminalsplitdown3 = () => {
2050
+ return `向下拆分当前终端标签页`;
2051
+ };
2052
+ var id_chordterminalsplitdown3 = () => {
2053
+ return `Pisahkan ke bawah tab terminal saat ini`;
2054
+ };
2055
+ var es_chordterminalsplitdown3 = () => {
2056
+ return `Dividir hacia abajo la pestaña de terminal actual`;
2057
+ };
2058
+ /**
2059
+ * | output |
2060
+ * | --- |
2061
+ * | "Split down current terminal tab" |
2062
+ *
2063
+ * @param {Chordterminalsplitdown3Inputs} inputs
2064
+ * @param {{ locale?: "en" | "zh" | "id" | "es" }} options
2065
+ * @returns {LocalizedString}
2066
+ */
2067
+ var chordterminalsplitdown3 = ((inputs = {}, options = {}) => {
2068
+ const locale = options.locale ?? getLocale();
2069
+ if (locale === "zh") return zh_chordterminalsplitdown3();
2070
+ if (locale === "id") return id_chordterminalsplitdown3();
2071
+ if (locale === "es") return es_chordterminalsplitdown3();
2072
+ return en_chordterminalsplitdown3();
1913
2073
  });
1914
2074
  //#endregion
1915
2075
  //#region src/lib/paraglide/messages/clearbtn1.js
@@ -7708,21 +7868,21 @@ var movepanelup2 = ((inputs = {}, options = {}) => {
7708
7868
  /** @typedef {import('../runtime.js').LocalizedString} LocalizedString */
7709
7869
  /** @typedef {{}} Needagent1Inputs */
7710
7870
  var en_needagent1 = () => {
7711
- return `You cannot chat unless you select an Agent (+ Workspace)`;
7871
+ return `You cannot chat unless you select an Agent`;
7712
7872
  };
7713
7873
  var zh_needagent1 = () => {
7714
- return `必须先选择代理(+ 工作区)才能聊天`;
7874
+ return `必须先选择代理才能聊天`;
7715
7875
  };
7716
7876
  var id_needagent1 = () => {
7717
- return `Anda tidak bisa chat kecuali memilih Agent (+ Workspace)`;
7877
+ return `Anda tidak bisa chat kecuali memilih Agent`;
7718
7878
  };
7719
7879
  var es_needagent1 = () => {
7720
- return `No puedes chatear sin seleccionar un Agente (+ Workspace)`;
7880
+ return `No puedes chatear sin seleccionar un Agente`;
7721
7881
  };
7722
7882
  /**
7723
7883
  * | output |
7724
7884
  * | --- |
7725
- * | "You cannot chat unless you select an Agent (+ Workspace)" |
7885
+ * | "You cannot chat unless you select an Agent" |
7726
7886
  *
7727
7887
  * @param {Needagent1Inputs} inputs
7728
7888
  * @param {{ locale?: "en" | "zh" | "id" | "es" }} options
@@ -9688,6 +9848,38 @@ var plusadd1 = ((inputs = {}, options = {}) => {
9688
9848
  return en_plusadd1();
9689
9849
  });
9690
9850
  //#endregion
9851
+ //#region src/lib/paraglide/messages/plusworkspace1.js
9852
+ /** @typedef {import('../runtime.js').LocalizedString} LocalizedString */
9853
+ /** @typedef {{}} Plusworkspace1Inputs */
9854
+ var en_plusworkspace1 = () => {
9855
+ return `(+ Workspace)`;
9856
+ };
9857
+ var zh_plusworkspace1 = () => {
9858
+ return `(+ 工作区)`;
9859
+ };
9860
+ var id_plusworkspace1 = () => {
9861
+ return `(+ Workspace)`;
9862
+ };
9863
+ var es_plusworkspace1 = () => {
9864
+ return `(+ Workspace)`;
9865
+ };
9866
+ /**
9867
+ * | output |
9868
+ * | --- |
9869
+ * | "(+ Workspace)" |
9870
+ *
9871
+ * @param {Plusworkspace1Inputs} inputs
9872
+ * @param {{ locale?: "en" | "zh" | "id" | "es" }} options
9873
+ * @returns {LocalizedString}
9874
+ */
9875
+ var plusworkspace1 = ((inputs = {}, options = {}) => {
9876
+ const locale = options.locale ?? getLocale();
9877
+ if (locale === "zh") return zh_plusworkspace1();
9878
+ if (locale === "id") return id_plusworkspace1();
9879
+ if (locale === "es") return es_plusworkspace1();
9880
+ return en_plusworkspace1();
9881
+ });
9882
+ //#endregion
9691
9883
  //#region src/lib/paraglide/messages/presetcustom1.js
9692
9884
  /** @typedef {import('../runtime.js').LocalizedString} LocalizedString */
9693
9885
  /** @typedef {{}} Presetcustom1Inputs */
@@ -15992,6 +16184,8 @@ var _index_exports = /* @__PURE__ */ __exportAll({
15992
16184
  broadcastSyncedTo: () => broadcastsyncedto2,
15993
16185
  browserBack: () => browserback1,
15994
16186
  browserChipLabel: () => browserchiplabel2,
16187
+ browserCloneFallback: () => browserclonefallback2,
16188
+ browserCloneHint: () => browserclonehint2,
15995
16189
  browserCloseDelete: () => browserclosedelete2,
15996
16190
  browserCopied: () => browsercopied1,
15997
16191
  browserCopyUrl: () => browsercopyurl2,
@@ -16022,6 +16216,9 @@ var _index_exports = /* @__PURE__ */ __exportAll({
16022
16216
  chooseFolder: () => choosefolder1,
16023
16217
  chordArmedLabel: () => chordarmedlabel2,
16024
16218
  chordArmedTitle: () => chordarmedtitle2,
16219
+ chordTerminalClear: () => chordterminalclear2,
16220
+ chordTerminalNewTab: () => chordterminalnewtab3,
16221
+ chordTerminalSplitDown: () => chordterminalsplitdown3,
16025
16222
  clearBtn: () => clearbtn1,
16026
16223
  clearDateFilter: () => cleardatefilter2,
16027
16224
  clearFilter: () => clearfilter1,
@@ -16266,6 +16463,7 @@ var _index_exports = /* @__PURE__ */ __exportAll({
16266
16463
  pluginRackUninstall: () => pluginrackuninstall2,
16267
16464
  pluginRackUninstallEmpty: () => pluginrackuninstallempty3,
16268
16465
  plusAdd: () => plusadd1,
16466
+ plusWorkspace: () => plusworkspace1,
16269
16467
  presetCustom: () => presetcustom1,
16270
16468
  presetFullAccess: () => presetfullaccess2,
16271
16469
  presetFullAccessDesc: () => presetfullaccessdesc3,
@@ -16499,6 +16697,8 @@ var messages_exports = /* @__PURE__ */ __exportAll({
16499
16697
  broadcastSyncedTo: () => broadcastsyncedto2,
16500
16698
  browserBack: () => browserback1,
16501
16699
  browserChipLabel: () => browserchiplabel2,
16700
+ browserCloneFallback: () => browserclonefallback2,
16701
+ browserCloneHint: () => browserclonehint2,
16502
16702
  browserCloseDelete: () => browserclosedelete2,
16503
16703
  browserCopied: () => browsercopied1,
16504
16704
  browserCopyUrl: () => browsercopyurl2,
@@ -16529,6 +16729,9 @@ var messages_exports = /* @__PURE__ */ __exportAll({
16529
16729
  chooseFolder: () => choosefolder1,
16530
16730
  chordArmedLabel: () => chordarmedlabel2,
16531
16731
  chordArmedTitle: () => chordarmedtitle2,
16732
+ chordTerminalClear: () => chordterminalclear2,
16733
+ chordTerminalNewTab: () => chordterminalnewtab3,
16734
+ chordTerminalSplitDown: () => chordterminalsplitdown3,
16532
16735
  clearBtn: () => clearbtn1,
16533
16736
  clearDateFilter: () => cleardatefilter2,
16534
16737
  clearFilter: () => clearfilter1,
@@ -16774,6 +16977,7 @@ var messages_exports = /* @__PURE__ */ __exportAll({
16774
16977
  pluginRackUninstall: () => pluginrackuninstall2,
16775
16978
  pluginRackUninstallEmpty: () => pluginrackuninstallempty3,
16776
16979
  plusAdd: () => plusadd1,
16980
+ plusWorkspace: () => plusworkspace1,
16777
16981
  presetCustom: () => presetcustom1,
16778
16982
  presetFullAccess: () => presetfullaccess2,
16779
16983
  presetFullAccessDesc: () => presetfullaccessdesc3,
@@ -18576,6 +18780,54 @@ function WorkspaceChip($$renderer, $$props) {
18576
18780
  $$renderer.push(`<!--]--></span>`);
18577
18781
  }
18578
18782
  //#endregion
18783
+ //#region src/lib/components/common/buttons/AgentChip.svelte
18784
+ function AgentChip($$renderer, $$props) {
18785
+ $$renderer.component(($$renderer) => {
18786
+ /**
18787
+ * AgentChip — ONE owner of the agent-pill identity (ADR, 2026-11-06):
18788
+ * the Bot/purple pill that means "this is agent X" on every surface.
18789
+ * Shape, the AA-tuned color-mixes (rest 5.25:1, selected white
18790
+ * 5.34:1), icon-never-shrinks and label-ellipsis-only live HERE,
18791
+ * exactly once — previously re-declared in SessionFilterHeader,
18792
+ * ToolsAndStatusHeader and Agents.svelte.
18793
+ *
18794
+ * Span mode (default) is display-only — the filter summary chip and
18795
+ * the conversation header chip; it must stay a span when nested in
18796
+ * a button (no button-in-button). interactive renders a real
18797
+ * <button> with aria-pressed — the Agents filter pill; hover/on
18798
+ * states carry the 2026-08-23 :not(.on) guards so rest and selected
18799
+ * rule sets stay disjoint.
18800
+ *
18801
+ * Call sites keep their own testids, titles and layout; only the
18802
+ * identity is owned here.
18803
+ */
18804
+ let { label, count = null, interactive = false, selected = false, title, testid, size = "chip", maxWidth } = $$props;
18805
+ if (interactive) {
18806
+ $$renderer.push("<!--[0-->");
18807
+ $$renderer.push(`<button data-svelte="AgentChip" type="button"${attr_class(`agent-chip ${stringify(size)}`, "svelte-whh0kl", { "on": selected })}${attr("aria-pressed", selected)}${attr("title", title)}${attr("data-testid", testid)}${attr_style("", { "max-width": maxWidth })}>`);
18808
+ Bot($$renderer, {
18809
+ size: 12,
18810
+ "aria-hidden": "true"
18811
+ });
18812
+ $$renderer.push(`<!----> <span class="label svelte-whh0kl">${escape_html(label)}</span>`);
18813
+ if (count !== null) {
18814
+ $$renderer.push("<!--[0-->");
18815
+ $$renderer.push(`<span class="count svelte-whh0kl">${escape_html(count)}</span>`);
18816
+ } else $$renderer.push("<!--[-1-->");
18817
+ $$renderer.push(`<!--]--></button>`);
18818
+ } else {
18819
+ $$renderer.push("<!--[-1-->");
18820
+ $$renderer.push(`<span data-svelte="AgentChip"${attr_class(`agent-chip ${stringify(size)}`, "svelte-whh0kl")}${attr("title", title)}${attr("data-testid", testid)}${attr_style("", { "max-width": maxWidth })}>`);
18821
+ Bot($$renderer, {
18822
+ size: size === "compact" ? 10 : 12,
18823
+ "aria-hidden": "true"
18824
+ });
18825
+ $$renderer.push(`<!----> <span class="label svelte-whh0kl">${escape_html(label)}</span></span>`);
18826
+ }
18827
+ $$renderer.push(`<!--]-->`);
18828
+ });
18829
+ }
18830
+ //#endregion
18579
18831
  //#region src/lib/services/jobs/roster-store.svelte.ts
18580
18832
  function isLiveJob(job) {
18581
18833
  return job.status === "running" || job.status === "stopping";
@@ -18822,6 +19074,39 @@ function JobRosterList($$renderer, $$props) {
18822
19074
  });
18823
19075
  }
18824
19076
  //#endregion
19077
+ //#region src/lib/components/composer/SelectionAlert.svelte
19078
+ function SelectionAlert($$renderer, $$props) {
19079
+ $$renderer.component(($$renderer) => {
19080
+ /**
19081
+ * SelectionAlert — the shared missing-selection alert (2026-11-08
19082
+ * refactor): one component serves both hosts of the NewChatButton
19083
+ * alert (inline in NewChatButton, hosted in SidebarFooter). The
19084
+ * message renders as TWO sibling spans — the i18n sentence
19085
+ * (m.needAgent) and the parenthetical (m.plusWorkspace) — with the
19086
+ * parenthetical non-breaking (whitespace-nowrap), so narrow widths
19087
+ * wrap BETWEEN the spans and never cut inside "(+ Workspace)".
19088
+ *
19089
+ * Carries its own × dismiss (the PanelHeader close grammar): closing
19090
+ * only hides the message — the next unarmed click re-raises it.
19091
+ * Call sites keep their testids via `testid`; `inset` drops the
19092
+ * bottom margin for hosts that space the alert row themselves
19093
+ * (the footer's .footer-create gap).
19094
+ */
19095
+ let { alert = false, testid = "new-chat-selection-alert", inset = false } = $$props;
19096
+ if (alert) {
19097
+ $$renderer.push("<!--[0-->");
19098
+ $$renderer.push(`<p data-svelte="SelectionAlert"${attr("data-testid", testid)}${attr_class("flex w-full items-start justify-between gap-2 text-xs text-status-pending", void 0, { "mb-1": !inset })} role="alert"><span class="min-w-0 flex-1"><span>${escape_html(t(needagent1))}</span> <span class="whitespace-nowrap">${escape_html(t(plusworkspace1))}</span></span> <button type="button" class="shrink-0 rounded p-0.5 leading-none text-status-pending hover:bg-status-pending/20 hover:text-status-pending"${attr("data-testid", `${testid}-close`)}${attr("aria-label", t(dismissalert1))}${attr("title", t(dismiss))}>`);
19099
+ X($$renderer, {
19100
+ size: 11,
19101
+ "aria-hidden": "true"
19102
+ });
19103
+ $$renderer.push(`<!----></button></p>`);
19104
+ } else $$renderer.push("<!--[-1-->");
19105
+ $$renderer.push(`<!--]-->`);
19106
+ bind_props($$props, { alert });
19107
+ });
19108
+ }
19109
+ //#endregion
18825
19110
  //#region src/lib/components/composer/NewChatButton.svelte
18826
19111
  function NewChatButton($$renderer, $$props) {
18827
19112
  $$renderer.component(($$renderer) => {
@@ -18856,34 +19141,47 @@ function NewChatButton($$renderer, $$props) {
18856
19141
  /** Verb mode (2026-08-31): false = Add (default, never persisted),
18857
19142
  * true = Replace. Session-local by design — every load starts Add. */
18858
19143
  let replaceMode = false;
18859
- $$renderer.push(`<div data-svelte="NewChatButton" class="flex w-full flex-col items-start">`);
18860
- if (alert && alertInline) {
18861
- $$renderer.push("<!--[0-->");
18862
- $$renderer.push(`<p data-testid="new-chat-selection-alert" class="mb-1 flex w-full items-center justify-between gap-2 text-xs text-status-pending" role="alert"><span>${escape_html(t(needagent1))}</span> <button type="button" class="shrink-0 rounded p-0.5 leading-none text-status-pending hover:bg-status-pending/20 hover:text-status-pending" data-testid="new-chat-selection-alert-close"${attr("aria-label", t(dismissalert1))}${attr("title", t(dismiss))}>`);
18863
- X($$renderer, {
18864
- size: 11,
18865
- "aria-hidden": "true"
18866
- });
18867
- $$renderer.push(`<!----></button></p>`);
18868
- } else $$renderer.push("<!--[-1-->");
18869
- $$renderer.push(`<!--]--> `);
18870
- $$renderer.push("<!--[-1-->");
18871
- $$renderer.push(`<!--]--> <div${attr_class(clsx(compact ? "flex w-full items-stretch gap-2" : "inline-flex items-stretch gap-2"))}><button type="button" data-testid="new-chat-button"${attr_class(clsx(compact ? "new-chat min-w-0 flex-1 px-3 py-1.5 text-xs font-medium" : "new-chat px-3 py-1.5 text-sm font-medium"), "svelte-kdd6rb")}${attr("disabled", creating, true)}>${escape_html(t(newchat1))}</button> `);
18872
- if (onreplace !== null) {
18873
- $$renderer.push("<!--[0-->");
18874
- $$renderer.push(`<div class="seg-group svelte-kdd6rb" role="group"${attr("aria-label", t(chatbuttonmode2))} data-testid="chat-mode-toggle"><button type="button"${attr_class("seg left svelte-kdd6rb", void 0, { "on": true })}${attr("disabled", creating, true)}${attr("aria-pressed", true)}${attr("title", t(addnextchataspanel4))} data-testid="chat-mode-add">`);
18875
- Plus($$renderer, {
18876
- size: 12,
18877
- "aria-hidden": "true"
18878
- });
18879
- $$renderer.push(`<!----></button> <button type="button"${attr_class("seg right svelte-kdd6rb", void 0, { "on": replaceMode })}${attr("disabled", creating, true)}${attr("aria-pressed", replaceMode)}${attr("title", t(replacefocusedpanel2))} data-testid="chat-mode-replace">`);
18880
- Replace($$renderer, {
18881
- size: 12,
18882
- "aria-hidden": "true"
18883
- });
18884
- $$renderer.push(`<!----></button></div>`);
18885
- } else $$renderer.push("<!--[-1-->");
18886
- $$renderer.push(`<!--]--></div></div>`);
19144
+ let $$settled = true;
19145
+ let $$inner_renderer;
19146
+ function $$render_inner($$renderer) {
19147
+ $$renderer.push(`<div data-svelte="NewChatButton" class="flex w-full flex-col items-start">`);
19148
+ if (alertInline) {
19149
+ $$renderer.push("<!--[0-->");
19150
+ SelectionAlert($$renderer, {
19151
+ get alert() {
19152
+ return alert;
19153
+ },
19154
+ set alert($$value) {
19155
+ alert = $$value;
19156
+ $$settled = false;
19157
+ }
19158
+ });
19159
+ } else $$renderer.push("<!--[-1-->");
19160
+ $$renderer.push(`<!--]--> `);
19161
+ $$renderer.push("<!--[-1-->");
19162
+ $$renderer.push(`<!--]--> <div${attr_class(clsx(compact ? "flex w-full items-stretch gap-2" : "inline-flex items-stretch gap-2"))}><button type="button" data-testid="new-chat-button"${attr_class(clsx(compact ? "new-chat min-w-0 flex-1 px-3 py-1.5 text-xs font-medium" : "new-chat px-3 py-1.5 text-sm font-medium"), "svelte-kdd6rb")}${attr("disabled", creating, true)}>${escape_html(t(newchat1))}</button> `);
19163
+ if (onreplace !== null) {
19164
+ $$renderer.push("<!--[0-->");
19165
+ $$renderer.push(`<div class="seg-group svelte-kdd6rb" role="group"${attr("aria-label", t(chatbuttonmode2))} data-testid="chat-mode-toggle"><button type="button"${attr_class("seg left svelte-kdd6rb", void 0, { "on": true })}${attr("disabled", creating, true)}${attr("aria-pressed", true)}${attr("title", t(addnextchataspanel4))} data-testid="chat-mode-add">`);
19166
+ Plus($$renderer, {
19167
+ size: 12,
19168
+ "aria-hidden": "true"
19169
+ });
19170
+ $$renderer.push(`<!----></button> <button type="button"${attr_class("seg right svelte-kdd6rb", void 0, { "on": replaceMode })}${attr("disabled", creating, true)}${attr("aria-pressed", replaceMode)}${attr("title", t(replacefocusedpanel2))} data-testid="chat-mode-replace">`);
19171
+ Replace($$renderer, {
19172
+ size: 12,
19173
+ "aria-hidden": "true"
19174
+ });
19175
+ $$renderer.push(`<!----></button></div>`);
19176
+ } else $$renderer.push("<!--[-1-->");
19177
+ $$renderer.push(`<!--]--></div></div>`);
19178
+ }
19179
+ do {
19180
+ $$settled = true;
19181
+ $$inner_renderer = $$renderer.copy();
19182
+ $$render_inner($$inner_renderer);
19183
+ } while (!$$settled);
19184
+ $$renderer.subsume($$inner_renderer);
18887
19185
  bind_props($$props, { alert });
18888
19186
  });
18889
19187
  }
@@ -18922,7 +19220,7 @@ function ThemeToggle($$renderer, $$props) {
18922
19220
  }
18923
19221
  //#endregion
18924
19222
  //#region package.json
18925
- var version = "0.10.1";
19223
+ var version = "0.11.0";
18926
19224
  var dsh = { "webVersion": "0.2.2-rc.1" };
18927
19225
  //#endregion
18928
19226
  //#region src/lib/version.ts
@@ -19935,53 +20233,39 @@ function SidebarPromptSync($$renderer, $$props) {
19935
20233
  //#endregion
19936
20234
  //#region src/lib/components/sessions/SidebarFooter.svelte
19937
20235
  function SidebarFooter($$renderer, $$props) {
19938
- $$renderer.component(($$renderer) => {
19939
- /**
19940
- * SidebarFooter — the sidebar's bottom strip under the session spine
19941
- * (extracted from SessionsList, 2026-09-04): the broadcast box
19942
- * (SidebarPromptSync, ADR "The Prompt Sync" — owns its own visibility,
19943
- * renders nothing unchecked) above the "+ New chat" button, armed with
19944
- * the filter pills' selection so a create rides the armed dimensions.
19945
- * The create row opens with the version chip (v{APP_VERSION},
19946
- * 2026-09-07) — the running edition reads where new chats start —
19947
- * (The circled-A About trigger moved to AppSidebarHeader's prefix,
19948
- * 2026-09 — its dialog still portals to document.body, BC-7.)
19949
- * Purely presentational: create logic, the creating lock, the
19950
- * Add/Replace verb toggle, and the alerts stay in NewChatButton; this
19951
- * shell carries the resolved selection and reports writes upward
19952
- * (oncreated / onreplace). Styles are self-contained — the parent's
19953
- * scoped rules cannot reach this component's DOM, so the border-top
19954
- * frame travels with it.
19955
- */
19956
- /** The NewChatButton's missing-selection alert, HOSTED here: rendered
19957
- * as footer-create's FIRST child so it spans the full row (version +
19958
- * button + language menu wrap beneath) instead of squeezing into the
19959
- * button's slot between the version chip and the language menu. */
19960
- let createAlert = false;
19961
- let { preset, workspace, oncreated, onreplace } = $$props;
19962
- let $$settled = true;
19963
- let $$inner_renderer;
19964
- function $$render_inner($$renderer) {
19965
- $$renderer.push(`<div data-svelte="SidebarFooter" class="footer svelte-x4ykdr">`);
19966
- SidebarPromptSync($$renderer);
19967
- $$renderer.push(`<!----> <div class="footer-create svelte-x4ykdr">`);
19968
- if (createAlert) {
19969
- $$renderer.push("<!--[0-->");
19970
- $$renderer.push(`<p data-testid="new-chat-selection-alert" class="footer-create-alert svelte-x4ykdr" role="alert"><span>${escape_html(t(needagent1))}</span> <button type="button" class="footer-create-alert-close svelte-x4ykdr" data-testid="new-chat-selection-alert-close"${attr("aria-label", t(dismissalert1))}${attr("title", t(dismiss))}>`);
19971
- X($$renderer, {
19972
- size: 11,
19973
- "aria-hidden": "true"
19974
- });
19975
- $$renderer.push(`<!----></button></p>`);
19976
- } else $$renderer.push("<!--[-1-->");
19977
- $$renderer.push(`<!--]--> <div class="footer-create-strip svelte-x4ykdr"><span class="footer-version svelte-x4ykdr" data-testid="sidebar-footer-version"><span>v${escape_html(APP_VERSION)}</span> <span>v${escape_html(DSH_VERSION)}</span></span> `);
19978
- NewChatButton($$renderer, {
19979
- compact: true,
19980
- agent: preset,
19981
- workspace,
19982
- oncreated,
19983
- onreplace,
19984
- alertInline: false,
20236
+ /**
20237
+ * SidebarFooter — the sidebar's bottom strip under the session spine
20238
+ * (extracted from SessionsList, 2026-09-04): the broadcast box
20239
+ * (SidebarPromptSync, ADR "The Prompt Sync" — owns its own visibility,
20240
+ * renders nothing unchecked) above the "+ New chat" button, armed with
20241
+ * the filter pills' selection so a create rides the armed dimensions.
20242
+ * The create row opens with the version chip (v{APP_VERSION},
20243
+ * 2026-09-07) — the running edition reads where new chats start —
20244
+ * (The circled-A About trigger moved to AppSidebarHeader's prefix,
20245
+ * 2026-09 — its dialog still portals to document.body, BC-7.)
20246
+ * Purely presentational: create logic, the creating lock, the
20247
+ * Add/Replace verb toggle, and the alerts stay in NewChatButton; this
20248
+ * shell carries the resolved selection and reports writes upward
20249
+ * (oncreated / onreplace). Styles are self-contained — the parent's
20250
+ * scoped rules cannot reach this component's DOM, so the border-top
20251
+ * frame travels with it.
20252
+ */
20253
+ /** The NewChatButton's missing-selection alert, HOSTED here: rendered
20254
+ * as footer-create's FIRST child so it spans the full row (version +
20255
+ * button + language menu wrap beneath) instead of squeezing into the
20256
+ * button's slot between the version chip and the language menu. */
20257
+ let createAlert = false;
20258
+ let { preset, workspace, oncreated, onreplace } = $$props;
20259
+ let $$settled = true;
20260
+ let $$inner_renderer;
20261
+ function $$render_inner($$renderer) {
20262
+ $$renderer.push(`<div data-svelte="SidebarFooter" class="footer svelte-x4ykdr">`);
20263
+ SidebarPromptSync($$renderer);
20264
+ $$renderer.push(`<!----> <div class="footer-create svelte-x4ykdr">`);
20265
+ if (createAlert) {
20266
+ $$renderer.push("<!--[0-->");
20267
+ SelectionAlert($$renderer, {
20268
+ inset: true,
19985
20269
  get alert() {
19986
20270
  return createAlert;
19987
20271
  },
@@ -19990,19 +20274,35 @@ function SidebarFooter($$renderer, $$props) {
19990
20274
  $$settled = false;
19991
20275
  }
19992
20276
  });
19993
- $$renderer.push(`<!----> `);
19994
- ThemeToggle($$renderer);
19995
- $$renderer.push(`<!----> `);
19996
- LanguageMenu($$renderer);
19997
- $$renderer.push(`<!----></div></div></div>`);
19998
- }
19999
- do {
20000
- $$settled = true;
20001
- $$inner_renderer = $$renderer.copy();
20002
- $$render_inner($$inner_renderer);
20003
- } while (!$$settled);
20004
- $$renderer.subsume($$inner_renderer);
20005
- });
20277
+ } else $$renderer.push("<!--[-1-->");
20278
+ $$renderer.push(`<!--]--> <div class="footer-create-strip svelte-x4ykdr"><span class="footer-version svelte-x4ykdr" data-testid="sidebar-footer-version"><span>v${escape_html(APP_VERSION)}</span> <span>v${escape_html(DSH_VERSION)}</span></span> `);
20279
+ NewChatButton($$renderer, {
20280
+ compact: true,
20281
+ agent: preset,
20282
+ workspace,
20283
+ oncreated,
20284
+ onreplace,
20285
+ alertInline: false,
20286
+ get alert() {
20287
+ return createAlert;
20288
+ },
20289
+ set alert($$value) {
20290
+ createAlert = $$value;
20291
+ $$settled = false;
20292
+ }
20293
+ });
20294
+ $$renderer.push(`<!----> `);
20295
+ ThemeToggle($$renderer);
20296
+ $$renderer.push(`<!----> `);
20297
+ LanguageMenu($$renderer);
20298
+ $$renderer.push(`<!----></div></div></div>`);
20299
+ }
20300
+ do {
20301
+ $$settled = true;
20302
+ $$inner_renderer = $$renderer.copy();
20303
+ $$render_inner($$inner_renderer);
20304
+ } while (!$$settled);
20305
+ $$renderer.subsume($$inner_renderer);
20006
20306
  }
20007
20307
  //#endregion
20008
20308
  //#region src/lib/components/sessions/SessionsList.svelte
@@ -25865,13 +26165,11 @@ function ToolsAndStatusHeader($$renderer, $$props) {
25865
26165
  $$renderer.push(`<!--]--> `);
25866
26166
  if (agent) {
25867
26167
  $$renderer.push("<!--[0-->");
25868
- $$renderer.push(`<span class="agent-chip svelte-2kgu2r" data-testid="agent-chip"${attr("title", agentId ? `agent preset — ${agentId}` : void 0)}>`);
25869
- Bot($$renderer, {
25870
- size: 12,
25871
- class: "shrink-0",
25872
- "aria-hidden": "true"
26168
+ AgentChip($$renderer, {
26169
+ label: agent,
26170
+ testid: "agent-chip",
26171
+ title: agentId ? `agent preset — ${agentId}` : void 0
25873
26172
  });
25874
- $$renderer.push(`<!----> ${escape_html(agent)}</span>`);
25875
26173
  } else $$renderer.push("<!--[-1-->");
25876
26174
  $$renderer.push(`<!--]--> `);
25877
26175
  PlanModeChip($$renderer, { plan });
@@ -25899,7 +26197,7 @@ function ToolsAndStatusHeader($$renderer, $$props) {
25899
26197
  //#region src/lib/components/conversation/header/BrowserButton.svelte
25900
26198
  function BrowserButton($$renderer, $$props) {
25901
26199
  $$renderer.component(($$renderer) => {
25902
- $$renderer.push(`<button data-svelte="BrowserButton" type="button" class="inline-flex items-center gap-1 rounded border border-surface-border px-1.5 py-0.5 text-xs hover:bg-surface-active" data-testid="open-browser"${attr("title", browseropentitle2() + " · " + browserheadedhint2())}>`);
26200
+ $$renderer.push(`<button data-svelte="BrowserButton" type="button" class="inline-flex items-center gap-1 rounded border border-surface-border px-1.5 py-0.5 text-xs hover:bg-surface-active svelte-sxu2u" data-testid="open-browser"${attr("title", browseropentitle2() + " · " + browserheadedhint2())}>`);
25903
26201
  Globe($$renderer, {
25904
26202
  size: 12,
25905
26203
  class: "shrink-0",
@@ -34767,7 +35065,9 @@ function ConversationPanel($$renderer, $$props) {
34767
35065
  */
34768
35066
  var CHORD_WINDOW_MS = 2e3;
34769
35067
  var IDLE_CHORD = {
34770
- armed: false};
35068
+ armed: false,
35069
+ prefix: "s"
35070
+ };
34771
35071
  /** Verb → label (the palette renders these; D16). */
34772
35072
  var CHORD_VERB_LABELS = {
34773
35073
  a: "Close agent extras (terminals + sub-agents + explorers)",
@@ -34856,7 +35156,7 @@ function ChordPalette($$renderer, $$props) {
34856
35156
  */
34857
35157
  /** The 10s idle window before the palette closes itself (D18). */
34858
35158
  const IDLE_CLOSE_MS = 1e4;
34859
- let { open, rows} = $$props;
35159
+ let { open, rows, prefix} = $$props;
34860
35160
  let now = Date.now();
34861
35161
  const elapsed = derived(() => open ? Math.max(0, Math.min(now - (Date.now()), IDLE_CLOSE_MS)) : 0);
34862
35162
  const pct = derived(() => Math.round(elapsed() / IDLE_CLOSE_MS * 100));
@@ -34864,7 +35164,7 @@ function ChordPalette($$renderer, $$props) {
34864
35164
  const barColor = derived(() => inActionWindow() ? "bg-green-300" : "bg-yellow-200");
34865
35165
  if (open) {
34866
35166
  $$renderer.push("<!--[0-->");
34867
- $$renderer.push(`<div data-svelte="ChordPalette" class="fixed top-1/2 left-1/2 z-50 w-72 -translate-x-1/2 -translate-y-1/2 rounded-lg border border-black/10 bg-white/95 px-3 py-2 shadow-lg backdrop-blur dark:border-white/15 dark:bg-neutral-900/95" data-testid="chord-palette"${attr("data-chord-elapsed", elapsed())} aria-live="polite"${attr("aria-label", t(() => chordarmedlabel2()))}><div class="mb-1 text-[10px] font-semibold tracking-wide text-neutral-400 uppercase">${escape_html(t(() => chordarmedtitle2()))}</div> <ul class="m-0 list-none space-y-0.5 p-0"><!--[-->`);
35167
+ $$renderer.push(`<div data-svelte="ChordPalette" class="fixed top-1/2 left-1/2 z-50 w-72 -translate-x-1/2 -translate-y-1/2 rounded-lg border border-black/10 bg-white/95 px-3 py-2 shadow-lg backdrop-blur dark:border-white/15 dark:bg-neutral-900/95" data-testid="chord-palette"${attr("data-chord-elapsed", elapsed())} aria-live="polite"${attr("aria-label", t(() => chordarmedlabel2({ prefix })))}><div class="mb-1 text-[10px] font-semibold tracking-wide text-neutral-400 uppercase">${escape_html(t(() => chordarmedtitle2({ prefix })))}</div> <ul class="m-0 list-none space-y-0.5 p-0"><!--[-->`);
34868
35168
  const each_array = ensure_array_like(rows);
34869
35169
  for (let $$index = 0, $$length = each_array.length; $$index < $$length; $$index++) {
34870
35170
  let row = each_array[$$index];
@@ -35294,6 +35594,39 @@ function TerminalDesk($$renderer, $$props) {
35294
35594
  if (select) selectedTab = jobCount() - 1;
35295
35595
  }
35296
35596
  registerJobTabOpener((owner, jobId, label) => openJobTab(owner, jobId, label));
35597
+ /** Destroy ONE session through the prune verb, healing once on a stale
35598
+ * token (reattach → retry the SAME DELETE). Pruned records never come
35599
+ * back to list() — the corpse pile is the thing this chord removes. */
35600
+ async function destroyRowSession(assigned) {
35601
+ const destroy = (token) => fetch("/api/terminal/" + assigned.sessionId + "/delete", {
35602
+ method: "DELETE",
35603
+ headers: { "content-type": "application/json" },
35604
+ body: JSON.stringify({ token })
35605
+ });
35606
+ let res = await destroy(assigned.token).catch(() => void 0);
35607
+ if (res && res.status === 403) {
35608
+ const re = await fetch("/api/terminal/" + assigned.sessionId + "/reattach", { method: "POST" }).catch(() => void 0);
35609
+ const body = re && re.ok ? await re.json().catch(() => null) : null;
35610
+ if (body?.token) res = await destroy(body.token).catch(() => void 0);
35611
+ }
35612
+ }
35613
+ /** The chord's action (D6): destroy every session of the SELECTED tab
35614
+ * (split included, live or exited — the server kills, no shell
35615
+ * cooperation required), then remove the tab WITHOUT re-killing (the
35616
+ * entries are already pruned; closeTab's send-close would only 404).
35617
+ * Last tab ⇒ onShellExit removes the desk slot (the panel close). */
35618
+ async function clearTabChord() {
35619
+ const tabIndex = selectedTab;
35620
+ const tab = tabs[tabIndex];
35621
+ if (!tab) return;
35622
+ for (const row of tab.rows) if (row.assigned) await destroyRowSession(row.assigned);
35623
+ tabs.splice(tabIndex, 1);
35624
+ if (tabs.length === 0) {
35625
+ onShellExit?.();
35626
+ return;
35627
+ }
35628
+ selectedTab = Math.min(tabIndex, tabs.length - 1);
35629
+ }
35297
35630
  /** The truthful badge grammar (2026-11-04 amendment, ADR D5e/D5f):
35298
35631
  * the shell-tab badge pairs the strip position with the session id —
35299
35632
  * single row assigned → 'T1:7' (registry id t-7 → 7); split →
@@ -35342,6 +35675,10 @@ function TerminalDesk($$renderer, $$props) {
35342
35675
  * tab and selects it; --split-down stacks a row on the SELECTED tab.
35343
35676
  * Both open a fresh session (never re-attach). */
35344
35677
  function applyAction(action) {
35678
+ if (action === "clear-tab") {
35679
+ clearTabChord();
35680
+ return;
35681
+ }
35345
35682
  (async () => {
35346
35683
  const row = await mintSession();
35347
35684
  if (!row) return;
@@ -38986,7 +39323,8 @@ function _page($$renderer, $$props) {
38986
39323
  });
38987
39324
  ChordPalette($$renderer, {
38988
39325
  open: chord.armed,
38989
- rows: chordPaletteRows()});
39326
+ rows: chordPaletteRows(),
39327
+ prefix: chord.prefix});
38990
39328
  $$renderer.push(`<!----> <div data-svelte="ConversationPage" class="flex h-dvh conversation-page svelte-1uha8ag">`);
38991
39329
  if (!sidebarInZoom()) {
38992
39330
  $$renderer.push("<!--[0-->");
@@ -39056,4 +39394,4 @@ function _page($$renderer, $$props) {
39056
39394
  }
39057
39395
 
39058
39396
  export { _page as default };
39059
- //# sourceMappingURL=_page.svelte.js-DaZfwP76.js.map
39397
+ //# sourceMappingURL=_page.svelte.js-DlLAziUY.js.map