@deepseek-insight/dsi 0.5.33 → 0.5.35

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 (149) hide show
  1. package/build/client/_app/immutable/assets/0.9KCWnpRq.css +2 -0
  2. package/build/client/_app/immutable/assets/2.B2TMGoNC.css +1 -0
  3. package/build/client/_app/immutable/chunks/-BV4MEqr.js +1 -0
  4. package/build/client/_app/immutable/chunks/{BO15_-NJ.js → B2hm1w7K.js} +1 -1
  5. package/build/client/_app/immutable/chunks/{B3Lta-Nn.js → B52Khb6E.js} +1 -1
  6. package/build/client/_app/immutable/chunks/{Da0rl5Rb.js → B9fOkvHb.js} +1 -1
  7. package/build/client/_app/immutable/chunks/{CIZRvqf3.js → BC5nqwvj.js} +1 -1
  8. package/build/client/_app/immutable/chunks/{CVJBb63S.js → BFsDYOFz.js} +1 -1
  9. package/build/client/_app/immutable/chunks/{BOGXkyy3.js → BGQXNvll.js} +1 -1
  10. package/build/client/_app/immutable/chunks/{1KjP5PPV.js → BIUi504d.js} +1 -1
  11. package/build/client/_app/immutable/chunks/{wRPKccfz.js → BIvFR1xA.js} +1 -1
  12. package/build/client/_app/immutable/chunks/{BS84xqUl.js → BKYpDGvC.js} +1 -1
  13. package/build/client/_app/immutable/chunks/{DzNl4lTU.js → BNx4_m7U.js} +1 -1
  14. package/build/client/_app/immutable/chunks/{BhMqa9V0.js → BOKyldQm.js} +1 -1
  15. package/build/client/_app/immutable/chunks/{BFYiBR8b.js → BRNBFqQ_.js} +1 -1
  16. package/build/client/_app/immutable/chunks/{B5bIZjCh.js → B_6pr4k2.js} +1 -1
  17. package/build/client/_app/immutable/chunks/{BoJ5ww2X.js → BfChGCnE.js} +1 -1
  18. package/build/client/_app/immutable/chunks/{BK9wQfnJ.js → Bi25XSWW.js} +1 -1
  19. package/build/client/_app/immutable/chunks/{CXDjw6BI.js → Bi5NvDds.js} +1 -1
  20. package/build/client/_app/immutable/chunks/{CjMviqoD.js → Bl78Sc72.js} +1 -1
  21. package/build/client/_app/immutable/chunks/{DGget9Lk.js → BlD_VX1s.js} +1 -1
  22. package/build/client/_app/immutable/chunks/{D2Punuji.js → Bn64J6A-.js} +1 -1
  23. package/build/client/_app/immutable/chunks/{BQFPW2iU.js → Bp4vT1Ke.js} +1 -1
  24. package/build/client/_app/immutable/chunks/BqX4FuMJ.js +1 -0
  25. package/build/client/_app/immutable/chunks/{DnA33f7e.js → C-58cZAk.js} +1 -1
  26. package/build/client/_app/immutable/chunks/{FDKaBHdO.js → C1rk31qs.js} +1 -1
  27. package/build/client/_app/immutable/chunks/{eNqKaSDb.js → C2vkjTiv.js} +1 -1
  28. package/build/client/_app/immutable/chunks/{C7xeaPF2.js → C48u-2qp.js} +1 -1
  29. package/build/client/_app/immutable/chunks/{D9XozwcM.js → C7a8i7sD.js} +1 -1
  30. package/build/client/_app/immutable/chunks/{tziyL5EM.js → C7iYNw8X.js} +1 -1
  31. package/build/client/_app/immutable/chunks/{CA7VtFsM.js → C8wGq5T2.js} +1 -1
  32. package/build/client/_app/immutable/chunks/{DVsJyQaB.js → CDTTZjYW.js} +1 -1
  33. package/build/client/_app/immutable/chunks/{CQNMOuVz.js → CEj_BGCY.js} +1 -1
  34. package/build/client/_app/immutable/chunks/{dg-Ik0Xp.js → CG77uzLI.js} +1 -1
  35. package/build/client/_app/immutable/chunks/{DfxnqpU2.js → CI1tkkzb.js} +1 -1
  36. package/build/client/_app/immutable/chunks/{DTVIMflS.js → CItDRTlN.js} +1 -1
  37. package/build/client/_app/immutable/chunks/{BKMUCRSB.js → CLvIgAhR.js} +1 -1
  38. package/build/client/_app/immutable/chunks/{7Qwz4TD3.js → CPbUcKPc.js} +1 -1
  39. package/build/client/_app/immutable/chunks/CPhcxli7.js +1 -0
  40. package/build/client/_app/immutable/chunks/{BtWgux0k.js → CRe9IZg0.js} +1 -1
  41. package/build/client/_app/immutable/chunks/CT1m72HM.js +1 -0
  42. package/build/client/_app/immutable/chunks/{C6qkDvEg.js → CXG3xpeH.js} +2 -2
  43. package/build/client/_app/immutable/chunks/{DHChdxxK.js → CaAId7nh.js} +1 -1
  44. package/build/client/_app/immutable/chunks/{5W1abxrJ.js → CdFbOrCf.js} +1 -1
  45. package/build/client/_app/immutable/chunks/{Dufckt0T.js → Cdn_bzx2.js} +1 -1
  46. package/build/client/_app/immutable/chunks/{D_4vyw9k.js → CmNEu9LM.js} +1 -1
  47. package/build/client/_app/immutable/chunks/{BNCXVe_Y.js → CnAA0dO8.js} +1 -1
  48. package/build/client/_app/immutable/chunks/{_OxPZn8v.js → CpX84bXa.js} +1 -1
  49. package/build/client/_app/immutable/chunks/{D-p2gaJO.js → CvWnUnS1.js} +1 -1
  50. package/build/client/_app/immutable/chunks/{qDr7l6ST.js → CvjdFV1E.js} +1 -1
  51. package/build/client/_app/immutable/chunks/{XM-sjL-p.js → Cx__ttXF.js} +1 -1
  52. package/build/client/_app/immutable/chunks/CxnI-Htc.js +8 -0
  53. package/build/client/_app/immutable/chunks/D0uZseUH.js +1 -0
  54. package/build/client/_app/immutable/chunks/{T453H1uG.js → D3bC95qg.js} +1 -1
  55. package/build/client/_app/immutable/chunks/{DtdNJetN.js → D4Ogpdhb.js} +1 -1
  56. package/build/client/_app/immutable/chunks/{DrLWFO8Z.js → D4xFb7_b.js} +1 -1
  57. package/build/client/_app/immutable/chunks/{CfqeI44h.js → D5ecapQY.js} +1 -1
  58. package/build/client/_app/immutable/chunks/{NxBjh70M.js → DJ36HFmi.js} +1 -1
  59. package/build/client/_app/immutable/chunks/{CfKp2keY.js → Dea0pTfN.js} +4 -4
  60. package/build/client/_app/immutable/chunks/DlKysbhw.js +1 -0
  61. package/build/client/_app/immutable/chunks/{CWRt23V2.js → Dn4fSUjR.js} +1 -1
  62. package/build/client/_app/immutable/chunks/{BnEcDyty.js → DqRXQwgi.js} +1 -1
  63. package/build/client/_app/immutable/chunks/{CT33sMmw.js → DsZdPfqt.js} +1 -1
  64. package/build/client/_app/immutable/chunks/{CKk3hDrH.js → DypDva7F.js} +1 -1
  65. package/build/client/_app/immutable/chunks/{CwpTIVX4.js → GNZHLVjs.js} +1 -1
  66. package/build/client/_app/immutable/chunks/{KCYBrblk.js → GhVfcgWW.js} +4 -4
  67. package/build/client/_app/immutable/chunks/HwuqC1sa.js +1 -0
  68. package/build/client/_app/immutable/chunks/{hFCLiR2C.js → J3KpJGd_.js} +1 -1
  69. package/build/client/_app/immutable/chunks/{pRzztTzl.js → OVDjSnH6.js} +1 -1
  70. package/build/client/_app/immutable/chunks/{BDws8KMN.js → RIIj2qfU.js} +1 -1
  71. package/build/client/_app/immutable/chunks/{CbmGLQlS.js → ZwJo3zrp.js} +1 -1
  72. package/build/client/_app/immutable/chunks/{CWJVj28H.js → a1Hqq5w-.js} +1 -1
  73. package/build/client/_app/immutable/chunks/{BP1EDRMh.js → iK_uzrhN.js} +1 -1
  74. package/build/client/_app/immutable/chunks/{4BUyCMHs.js → l5GiMY16.js} +1 -1
  75. package/build/client/_app/immutable/chunks/{5BuKkouu.js → qkxAgKjo.js} +1 -1
  76. package/build/client/_app/immutable/chunks/{CfPrYC2A.js → xRO38jd8.js} +1 -1
  77. package/build/client/_app/immutable/entry/app.CxHLxiFb.js +2 -0
  78. package/build/client/_app/immutable/entry/start.Bq_MhvgR.js +1 -0
  79. package/build/client/_app/immutable/nodes/0.Ba4j9lPa.js +1 -0
  80. package/build/client/_app/immutable/nodes/1.BaBbDjYU.js +1 -0
  81. package/build/client/_app/immutable/nodes/2.23fwI1xO.js +331 -0
  82. package/build/client/_app/version.json +1 -1
  83. package/build/handler.js +4 -4
  84. package/build/index.js +4 -4
  85. package/build/server/chunks/chunks/{dsh-connection.js-BSzUs8-n.js → dsh-connection.js-Lnv7PlHw.js} +23 -1
  86. package/build/server/chunks/chunks/{dsh-events.js-DEZgATm-.js → dsh-events.js-CyvSb4O3.js} +40 -3
  87. package/build/server/chunks/chunks/{git-probe.js-DoWgYcXG.js → git-probe.js-dOJ4Z5Hb.js} +3 -3
  88. package/build/server/chunks/chunks/{internal.js-L3lTruRr.js → internal.js-B-_-EpeQ.js} +2 -2
  89. package/build/server/chunks/chunks/{state.js-YbeUlJBc.js → state.js-Bq7piv9H.js} +2 -2
  90. package/build/server/chunks/chunks/{watcher.js-ZBFDj7d0.js → watcher.js-bCH9-ZiR.js} +3 -3
  91. package/build/server/chunks/entries/endpoints/api/a2a/{_server.ts.js-C12q5Acf.js → _server.ts.js-CqAXkMAm.js} +4 -4
  92. package/build/server/chunks/entries/endpoints/api/a2a/register/{_server.ts.js-CdMcLL0n.js → _server.ts.js-FBi0PplP.js} +4 -4
  93. package/build/server/chunks/entries/endpoints/api/dsh/directory/{_server.ts.js-BJMlDa_R.js → _server.ts.js-BAfRDeE_.js} +2 -2
  94. package/build/server/chunks/entries/endpoints/api/dsh/pick-directory/{_server.ts.js-C5xgupWg.js → _server.ts.js-N21TnqYh.js} +2 -2
  95. package/build/server/chunks/entries/endpoints/api/dsh/presets/{_server.ts.js-DG0cxf9Y.js → _server.ts.js-C5ckDTov.js} +2 -2
  96. package/build/server/chunks/entries/endpoints/api/dsh/session/_sessionId_/attachment/{_server.ts.js-CjIzvUMY.js → _server.ts.js-CEPz4kVZ.js} +2 -2
  97. package/build/server/chunks/entries/endpoints/api/dsh/session/_sessionId_/cancel/{_server.ts.js-DqvT86T0.js → _server.ts.js-CUB5TKnW.js} +2 -2
  98. package/build/server/chunks/entries/endpoints/api/dsh/session/_sessionId_/catalog/{_server.ts.js-BzBZnI3P.js → _server.ts.js-BfDAa0Vb.js} +2 -2
  99. package/build/server/chunks/entries/endpoints/api/dsh/session/_sessionId_/changes/_server.ts.js-QiLS5yAj.js +142 -0
  100. package/build/server/chunks/entries/endpoints/api/dsh/session/_sessionId_/command/{_server.ts.js-DHWvuiKn.js → _server.ts.js-C5kJrRx-.js} +2 -2
  101. package/build/server/chunks/entries/endpoints/api/dsh/session/_sessionId_/events/{_server.ts.js-ARtFWpnE.js → _server.ts.js-CYZUxBob.js} +3 -3
  102. package/build/server/chunks/entries/endpoints/api/dsh/session/_sessionId_/fork/{_server.ts.js-rH3qhAct.js → _server.ts.js-y5sqH_UC.js} +2 -2
  103. package/build/server/chunks/entries/endpoints/api/dsh/session/_sessionId_/goal/{_server.ts.js-D_fm0cJY.js → _server.ts.js-BoYIpj-f.js} +2 -2
  104. package/build/server/chunks/entries/endpoints/api/dsh/session/_sessionId_/history/{_server.ts.js-BqpeQTZq.js → _server.ts.js-DGGCIii3.js} +3 -3
  105. package/build/server/chunks/entries/endpoints/api/dsh/session/_sessionId_/models/{_server.ts.js-CHKAkZEq.js → _server.ts.js-B8bmQCwT.js} +2 -2
  106. package/build/server/chunks/entries/endpoints/api/dsh/session/_sessionId_/permission/{_server.ts.js-DmjKvFqc.js → _server.ts.js-BBexDstc.js} +2 -2
  107. package/build/server/chunks/entries/endpoints/api/dsh/session/_sessionId_/prompt/{_server.ts.js-N1651orW.js → _server.ts.js-fd9StFXw.js} +2 -2
  108. package/build/server/chunks/entries/endpoints/api/dsh/session/_sessionId_/rename/{_server.ts.js-w1dYBirS.js → _server.ts.js-98HaDusY.js} +2 -2
  109. package/build/server/chunks/entries/endpoints/api/dsh/session/_sessionId_/respond/{_server.ts.js-Bwb62OTc.js → _server.ts.js-DN9APffn.js} +2 -2
  110. package/build/server/chunks/entries/endpoints/api/dsh/session/_sessionId_/select-model/{_server.ts.js-D2BCSITG.js → _server.ts.js-CeROEmUY.js} +2 -2
  111. package/build/server/chunks/entries/endpoints/api/dsh/sessions/{_server.ts.js-t_DpnCyJ.js → _server.ts.js-DKHmiqIs.js} +2 -2
  112. package/build/server/chunks/entries/endpoints/api/dsh/workspace-file/{_server.ts.js-BddU8qpx.js → _server.ts.js-S6XZDJmC.js} +2 -2
  113. package/build/server/chunks/entries/endpoints/api/dsh/workspace-file-bytes/{_server.ts.js-Di_7wqCI.js → _server.ts.js-Boxbod_L.js} +2 -2
  114. package/build/server/chunks/entries/endpoints/api/dsh/workspace-tree/{_server.ts.js-DPz9GQJJ.js → _server.ts.js-CA4PUERZ.js} +2 -2
  115. package/build/server/chunks/entries/endpoints/api/dsh/workspaces/{_server.ts.js-C1jO88hY.js → _server.ts.js-BObM3Axz.js} +2 -2
  116. package/build/server/chunks/entries/endpoints/api/dsh/workspaces/_workspaceId_/delete/{_server.ts.js-C1akVoP3.js → _server.ts.js-CA34p4GV.js} +2 -2
  117. package/build/server/chunks/entries/endpoints/api/dsh/workspaces/_workspaceId_/rename/{_server.ts.js-C4RkBuGZ.js → _server.ts.js-DPoRM_7u.js} +2 -2
  118. package/build/server/chunks/entries/endpoints/api/workspace/file-write/{_server.ts.js-D1gyOGEM.js → _server.ts.js-BIOHsnn2.js} +4 -4
  119. package/build/server/chunks/entries/endpoints/api/workspace/git-events/{_server.ts.js-D5XlAzdL.js → _server.ts.js-Ci5XitWP.js} +4 -4
  120. package/build/server/chunks/entries/endpoints/api/workspace/git-file-head/{_server.ts.js-BKJbQR9z.js → _server.ts.js-p-potXo3.js} +4 -4
  121. package/build/server/chunks/entries/endpoints/api/workspace/git-map/{_server.ts.js-CehoxXA_.js → _server.ts.js-DYFs7MEO.js} +4 -4
  122. package/build/server/chunks/entries/endpoints/api/workspace/git-status/{_server.ts.js-DMhaSADa.js → _server.ts.js-BB2bcMwC.js} +4 -4
  123. package/build/server/chunks/entries/endpoints/api/workspace/write-gate/{_server.ts.js-BQRvPo9G.js → _server.ts.js-DFnO84k1.js} +4 -4
  124. package/build/server/chunks/entries/pages/{_error.svelte.js-CYWDZLI7.js → _error.svelte.js-4nC1WwZs.js} +3 -3
  125. package/build/server/chunks/entries/pages/{_page.server.ts.js-C3_-EdaG.js → _page.server.ts.js-Cqf2xfOc.js} +3 -3
  126. package/build/server/chunks/entries/pages/{_page.svelte.js-D-nbMlOD.js → _page.svelte.js-Bk7bKW1n.js} +661 -97
  127. package/build/server/chunks/{handler-Dtl9b654.js → handler-D30w2kLV.js} +3 -3
  128. package/build/server/chunks/{index.js-Dm6-G-_6.js → index.js-x--iEW4O.js} +2 -2
  129. package/build/server/chunks/{manifest.js-CqSIh_aQ.js → manifest.js-DwCadGtJ.js} +44 -37
  130. package/build/server/chunks/nodes/{0.js-CWZQcgo6.js → 0.js-D1vjUdTF.js} +3 -3
  131. package/build/server/chunks/nodes/1.js-CITNCeN6.js +9 -0
  132. package/build/server/chunks/nodes/{2.js-BUXLNNKI.js → 2.js-BfGjyziD.js} +7 -7
  133. package/package.json +3 -2
  134. package/build/client/_app/immutable/assets/0.BU1D48E8.css +0 -2
  135. package/build/client/_app/immutable/assets/2.PKDcj4V6.css +0 -1
  136. package/build/client/_app/immutable/chunks/CCeZTRyg.js +0 -1
  137. package/build/client/_app/immutable/chunks/CM2YlsBZ.js +0 -1
  138. package/build/client/_app/immutable/chunks/CWCyOfZL.js +0 -1
  139. package/build/client/_app/immutable/chunks/DB0_Ut01.js +0 -1
  140. package/build/client/_app/immutable/chunks/DFZg0vdm.js +0 -8
  141. package/build/client/_app/immutable/chunks/DKLs56Hm.js +0 -1
  142. package/build/client/_app/immutable/chunks/E-1cXrsM.js +0 -1
  143. package/build/client/_app/immutable/chunks/N_z8g1dA.js +0 -1
  144. package/build/client/_app/immutable/entry/app.CivPp_F8.js +0 -2
  145. package/build/client/_app/immutable/entry/start.BS5ewb9B.js +0 -1
  146. package/build/client/_app/immutable/nodes/0.ze9O6tWo.js +0 -1
  147. package/build/client/_app/immutable/nodes/1.DLvBQOBf.js +0 -1
  148. package/build/client/_app/immutable/nodes/2.BCq5Ttag.js +0 -174
  149. package/build/server/chunks/nodes/1.js-BXDgJSsl.js +0 -9
@@ -1,13 +1,13 @@
1
- import { c as onDestroy, d as __exportAll } from '../../chunks/internal.js-L3lTruRr.js';
1
+ import { c as onDestroy, d as __exportAll } from '../../chunks/internal.js-B-_-EpeQ.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
- import { m as mergeEntries, c as collapseSystemPromptEntries, t as truncate } from '../../chunks/dsh-events.js-DEZgATm-.js';
4
+ import { m as mergeEntries, c as collapseSystemPromptEntries, t as truncate } from '../../chunks/dsh-events.js-CyvSb4O3.js';
5
5
  import { p as parseA2aSignature, m as mintA2aId, b as buildDeliveredText } from '../../chunks/a2a-protocol.js-C77mVg2Q.js';
6
6
  import { b as applyKnobEvent, E as EMPTY_KNOBS, r as resolvePermission, l as localPermission, c as presetLabel, d as presetDescription, C as CUSTOM_PRESET, F as FULL_ACCESS_PRESET } from '../../chunks/permission-state.js-B7UpAHBv.js';
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-YbeUlJBc.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-Bq7piv9H.js';
11
11
  import 'yaml';
12
12
  import 'html-to-image';
13
13
  import hljs from 'highlight.js/lib/core';
@@ -1302,38 +1302,6 @@ var clearsearch1 = ((inputs = {}, options = {}) => {
1302
1302
  return en_clearsearch1();
1303
1303
  });
1304
1304
  //#endregion
1305
- //#region src/lib/paraglide/messages/clearsessionnamefilter3.js
1306
- /** @typedef {import('../runtime.js').LocalizedString} LocalizedString */
1307
- /** @typedef {{}} Clearsessionnamefilter3Inputs */
1308
- var en_clearsessionnamefilter3 = () => {
1309
- return `Clear session name filter`;
1310
- };
1311
- var zh_clearsessionnamefilter3 = () => {
1312
- return `清除会话名筛选`;
1313
- };
1314
- var id_clearsessionnamefilter3 = () => {
1315
- return `Hapus filter nama sesi`;
1316
- };
1317
- var es_clearsessionnamefilter3 = () => {
1318
- return `Limpiar filtro de nombre de sesión`;
1319
- };
1320
- /**
1321
- * | output |
1322
- * | --- |
1323
- * | "Clear session name filter" |
1324
- *
1325
- * @param {Clearsessionnamefilter3Inputs} inputs
1326
- * @param {{ locale?: "en" | "zh" | "id" | "es" }} options
1327
- * @returns {LocalizedString}
1328
- */
1329
- var clearsessionnamefilter3 = ((inputs = {}, options = {}) => {
1330
- const locale = options.locale ?? getLocale();
1331
- if (locale === "zh") return zh_clearsessionnamefilter3();
1332
- if (locale === "id") return id_clearsessionnamefilter3();
1333
- if (locale === "es") return es_clearsessionnamefilter3();
1334
- return en_clearsessionnamefilter3();
1335
- });
1336
- //#endregion
1337
1305
  //#region src/lib/paraglide/messages/clearthegoal2.js
1338
1306
  /** @typedef {import('../runtime.js').LocalizedString} LocalizedString */
1339
1307
  /** @typedef {{}} Clearthegoal2Inputs */
@@ -3510,6 +3478,294 @@ var editprompt1 = ((inputs = {}, options = {}) => {
3510
3478
  return en_editprompt1();
3511
3479
  });
3512
3480
  //#endregion
3481
+ //#region src/lib/paraglide/messages/editedfilesadded2.js
3482
+ /** @typedef {import('../runtime.js').LocalizedString} LocalizedString */
3483
+ /** @typedef {{ count: NonNullable<unknown> }} Editedfilesadded2Inputs */
3484
+ var en_editedfilesadded2 = (i) => {
3485
+ return `+${i?.count}`;
3486
+ };
3487
+ var zh_editedfilesadded2 = (i) => {
3488
+ return `+${i?.count}`;
3489
+ };
3490
+ var id_editedfilesadded2 = (i) => {
3491
+ return `+${i?.count}`;
3492
+ };
3493
+ var es_editedfilesadded2 = (i) => {
3494
+ return `+${i?.count}`;
3495
+ };
3496
+ /**
3497
+ * | output |
3498
+ * | --- |
3499
+ * | "+{count}" |
3500
+ *
3501
+ * @param {Editedfilesadded2Inputs} inputs
3502
+ * @param {{ locale?: "en" | "zh" | "id" | "es" }} options
3503
+ * @returns {LocalizedString}
3504
+ */
3505
+ var editedfilesadded2 = ((inputs, options = {}) => {
3506
+ const locale = options.locale ?? getLocale();
3507
+ if (locale === "zh") return zh_editedfilesadded2(inputs);
3508
+ if (locale === "id") return id_editedfilesadded2(inputs);
3509
+ if (locale === "es") return es_editedfilesadded2(inputs);
3510
+ return en_editedfilesadded2(inputs);
3511
+ });
3512
+ //#endregion
3513
+ //#region src/lib/paraglide/messages/editedfilesbinary2.js
3514
+ /** @typedef {import('../runtime.js').LocalizedString} LocalizedString */
3515
+ /** @typedef {{}} Editedfilesbinary2Inputs */
3516
+ var en_editedfilesbinary2 = () => {
3517
+ return `binary`;
3518
+ };
3519
+ var zh_editedfilesbinary2 = () => {
3520
+ return `二进制`;
3521
+ };
3522
+ var id_editedfilesbinary2 = () => {
3523
+ return `biner`;
3524
+ };
3525
+ var es_editedfilesbinary2 = () => {
3526
+ return `binario`;
3527
+ };
3528
+ /**
3529
+ * | output |
3530
+ * | --- |
3531
+ * | "binary" |
3532
+ *
3533
+ * @param {Editedfilesbinary2Inputs} inputs
3534
+ * @param {{ locale?: "en" | "zh" | "id" | "es" }} options
3535
+ * @returns {LocalizedString}
3536
+ */
3537
+ var editedfilesbinary2 = ((inputs = {}, options = {}) => {
3538
+ const locale = options.locale ?? getLocale();
3539
+ if (locale === "zh") return zh_editedfilesbinary2();
3540
+ if (locale === "id") return id_editedfilesbinary2();
3541
+ if (locale === "es") return es_editedfilesbinary2();
3542
+ return en_editedfilesbinary2();
3543
+ });
3544
+ //#endregion
3545
+ //#region src/lib/paraglide/messages/editedfilescaphint3.js
3546
+ /** @typedef {import('../runtime.js').LocalizedString} LocalizedString */
3547
+ /** @typedef {{ count: NonNullable<unknown> }} Editedfilescaphint3Inputs */
3548
+ var en_editedfilescaphint3 = (i) => {
3549
+ return `and ${i?.count} more`;
3550
+ };
3551
+ var zh_editedfilescaphint3 = (i) => {
3552
+ return `还有 ${i?.count} 个`;
3553
+ };
3554
+ var id_editedfilescaphint3 = (i) => {
3555
+ return `dan ${i?.count} lagi`;
3556
+ };
3557
+ var es_editedfilescaphint3 = (i) => {
3558
+ return `y ${i?.count} más`;
3559
+ };
3560
+ /**
3561
+ * | output |
3562
+ * | --- |
3563
+ * | "and {count} more" |
3564
+ *
3565
+ * @param {Editedfilescaphint3Inputs} inputs
3566
+ * @param {{ locale?: "en" | "zh" | "id" | "es" }} options
3567
+ * @returns {LocalizedString}
3568
+ */
3569
+ var editedfilescaphint3 = ((inputs, options = {}) => {
3570
+ const locale = options.locale ?? getLocale();
3571
+ if (locale === "zh") return zh_editedfilescaphint3(inputs);
3572
+ if (locale === "id") return id_editedfilescaphint3(inputs);
3573
+ if (locale === "es") return es_editedfilescaphint3(inputs);
3574
+ return en_editedfilescaphint3(inputs);
3575
+ });
3576
+ //#endregion
3577
+ //#region src/lib/paraglide/messages/editedfileschip2.js
3578
+ /** @typedef {import('../runtime.js').LocalizedString} LocalizedString */
3579
+ /** @typedef {{}} Editedfileschip2Inputs */
3580
+ var en_editedfileschip2 = () => {
3581
+ return `edited files`;
3582
+ };
3583
+ var zh_editedfileschip2 = () => {
3584
+ return `已编辑文件`;
3585
+ };
3586
+ var id_editedfileschip2 = () => {
3587
+ return `berkas diedit`;
3588
+ };
3589
+ var es_editedfileschip2 = () => {
3590
+ return `archivos editados`;
3591
+ };
3592
+ /**
3593
+ * | output |
3594
+ * | --- |
3595
+ * | "edited files" |
3596
+ *
3597
+ * @param {Editedfileschip2Inputs} inputs
3598
+ * @param {{ locale?: "en" | "zh" | "id" | "es" }} options
3599
+ * @returns {LocalizedString}
3600
+ */
3601
+ var editedfileschip2 = ((inputs = {}, options = {}) => {
3602
+ const locale = options.locale ?? getLocale();
3603
+ if (locale === "zh") return zh_editedfileschip2();
3604
+ if (locale === "id") return id_editedfileschip2();
3605
+ if (locale === "es") return es_editedfileschip2();
3606
+ return en_editedfileschip2();
3607
+ });
3608
+ //#endregion
3609
+ //#region src/lib/paraglide/messages/editedfilesdeleted2.js
3610
+ /** @typedef {import('../runtime.js').LocalizedString} LocalizedString */
3611
+ /** @typedef {{ count: NonNullable<unknown> }} Editedfilesdeleted2Inputs */
3612
+ var en_editedfilesdeleted2 = (i) => {
3613
+ return `-${i?.count}`;
3614
+ };
3615
+ var zh_editedfilesdeleted2 = (i) => {
3616
+ return `-${i?.count}`;
3617
+ };
3618
+ var id_editedfilesdeleted2 = (i) => {
3619
+ return `-${i?.count}`;
3620
+ };
3621
+ var es_editedfilesdeleted2 = (i) => {
3622
+ return `-${i?.count}`;
3623
+ };
3624
+ /**
3625
+ * | output |
3626
+ * | --- |
3627
+ * | "-{count}" |
3628
+ *
3629
+ * @param {Editedfilesdeleted2Inputs} inputs
3630
+ * @param {{ locale?: "en" | "zh" | "id" | "es" }} options
3631
+ * @returns {LocalizedString}
3632
+ */
3633
+ var editedfilesdeleted2 = ((inputs, options = {}) => {
3634
+ const locale = options.locale ?? getLocale();
3635
+ if (locale === "zh") return zh_editedfilesdeleted2(inputs);
3636
+ if (locale === "id") return id_editedfilesdeleted2(inputs);
3637
+ if (locale === "es") return es_editedfilesdeleted2(inputs);
3638
+ return en_editedfilesdeleted2(inputs);
3639
+ });
3640
+ //#endregion
3641
+ //#region src/lib/paraglide/messages/editedfilesgone2.js
3642
+ /** @typedef {import('../runtime.js').LocalizedString} LocalizedString */
3643
+ /** @typedef {{}} Editedfilesgone2Inputs */
3644
+ var en_editedfilesgone2 = () => {
3645
+ return `Files were edited this turn — counts are no longer available`;
3646
+ };
3647
+ var zh_editedfilesgone2 = () => {
3648
+ return `本轮编辑了文件 — 计数已不可用`;
3649
+ };
3650
+ var id_editedfilesgone2 = () => {
3651
+ return `Berkas diedit giliran ini — hitungan sudah tidak tersedia`;
3652
+ };
3653
+ var es_editedfilesgone2 = () => {
3654
+ return `Se editaron archivos en este turno — los conteos ya no están disponibles`;
3655
+ };
3656
+ /**
3657
+ * | output |
3658
+ * | --- |
3659
+ * | "Files were edited this turn — counts are no longer available" |
3660
+ *
3661
+ * @param {Editedfilesgone2Inputs} inputs
3662
+ * @param {{ locale?: "en" | "zh" | "id" | "es" }} options
3663
+ * @returns {LocalizedString}
3664
+ */
3665
+ var editedfilesgone2 = ((inputs = {}, options = {}) => {
3666
+ const locale = options.locale ?? getLocale();
3667
+ if (locale === "zh") return zh_editedfilesgone2();
3668
+ if (locale === "id") return id_editedfilesgone2();
3669
+ if (locale === "es") return es_editedfilesgone2();
3670
+ return en_editedfilesgone2();
3671
+ });
3672
+ //#endregion
3673
+ //#region src/lib/paraglide/messages/editedfilesoversized2.js
3674
+ /** @typedef {import('../runtime.js').LocalizedString} LocalizedString */
3675
+ /** @typedef {{}} Editedfilesoversized2Inputs */
3676
+ var en_editedfilesoversized2 = () => {
3677
+ return `too large`;
3678
+ };
3679
+ var zh_editedfilesoversized2 = () => {
3680
+ return `文件过大`;
3681
+ };
3682
+ var id_editedfilesoversized2 = () => {
3683
+ return `terlalu besar`;
3684
+ };
3685
+ var es_editedfilesoversized2 = () => {
3686
+ return `demasiado grande`;
3687
+ };
3688
+ /**
3689
+ * | output |
3690
+ * | --- |
3691
+ * | "too large" |
3692
+ *
3693
+ * @param {Editedfilesoversized2Inputs} inputs
3694
+ * @param {{ locale?: "en" | "zh" | "id" | "es" }} options
3695
+ * @returns {LocalizedString}
3696
+ */
3697
+ var editedfilesoversized2 = ((inputs = {}, options = {}) => {
3698
+ const locale = options.locale ?? getLocale();
3699
+ if (locale === "zh") return zh_editedfilesoversized2();
3700
+ if (locale === "id") return id_editedfilesoversized2();
3701
+ if (locale === "es") return es_editedfilesoversized2();
3702
+ return en_editedfilesoversized2();
3703
+ });
3704
+ //#endregion
3705
+ //#region src/lib/paraglide/messages/editedfilestitle2.js
3706
+ /** @typedef {import('../runtime.js').LocalizedString} LocalizedString */
3707
+ /** @typedef {{ count: NonNullable<unknown> }} Editedfilestitle2Inputs */
3708
+ var en_editedfilestitle2 = (i) => {
3709
+ return `Edited ${i?.count} files`;
3710
+ };
3711
+ var zh_editedfilestitle2 = (i) => {
3712
+ return `编辑了 ${i?.count} 个文件`;
3713
+ };
3714
+ var id_editedfilestitle2 = (i) => {
3715
+ return `Mengedit ${i?.count} berkas`;
3716
+ };
3717
+ var es_editedfilestitle2 = (i) => {
3718
+ return `Se editaron ${i?.count} archivos`;
3719
+ };
3720
+ /**
3721
+ * | output |
3722
+ * | --- |
3723
+ * | "Edited {count} files" |
3724
+ *
3725
+ * @param {Editedfilestitle2Inputs} inputs
3726
+ * @param {{ locale?: "en" | "zh" | "id" | "es" }} options
3727
+ * @returns {LocalizedString}
3728
+ */
3729
+ var editedfilestitle2 = ((inputs, options = {}) => {
3730
+ const locale = options.locale ?? getLocale();
3731
+ if (locale === "zh") return zh_editedfilestitle2(inputs);
3732
+ if (locale === "id") return id_editedfilestitle2(inputs);
3733
+ if (locale === "es") return es_editedfilestitle2(inputs);
3734
+ return en_editedfilestitle2(inputs);
3735
+ });
3736
+ //#endregion
3737
+ //#region src/lib/paraglide/messages/editedfilestitleone3.js
3738
+ /** @typedef {import('../runtime.js').LocalizedString} LocalizedString */
3739
+ /** @typedef {{}} Editedfilestitleone3Inputs */
3740
+ var en_editedfilestitleone3 = () => {
3741
+ return `Edited 1 file`;
3742
+ };
3743
+ var zh_editedfilestitleone3 = () => {
3744
+ return `编辑了 1 个文件`;
3745
+ };
3746
+ var id_editedfilestitleone3 = () => {
3747
+ return `Mengedit 1 berkas`;
3748
+ };
3749
+ var es_editedfilestitleone3 = () => {
3750
+ return `Se editó 1 archivo`;
3751
+ };
3752
+ /**
3753
+ * | output |
3754
+ * | --- |
3755
+ * | "Edited 1 file" |
3756
+ *
3757
+ * @param {Editedfilestitleone3Inputs} inputs
3758
+ * @param {{ locale?: "en" | "zh" | "id" | "es" }} options
3759
+ * @returns {LocalizedString}
3760
+ */
3761
+ var editedfilestitleone3 = ((inputs = {}, options = {}) => {
3762
+ const locale = options.locale ?? getLocale();
3763
+ if (locale === "zh") return zh_editedfilestitleone3();
3764
+ if (locale === "id") return id_editedfilestitleone3();
3765
+ if (locale === "es") return es_editedfilestitleone3();
3766
+ return en_editedfilestitleone3();
3767
+ });
3768
+ //#endregion
3513
3769
  //#region src/lib/paraglide/messages/enablefullaccess2.js
3514
3770
  /** @typedef {import('../runtime.js').LocalizedString} LocalizedString */
3515
3771
  /** @typedef {{}} Enablefullaccess2Inputs */
@@ -11574,6 +11830,38 @@ var turnfailed1 = ((inputs = {}, options = {}) => {
11574
11830
  return en_turnfailed1();
11575
11831
  });
11576
11832
  //#endregion
11833
+ //#region src/lib/paraglide/messages/turnstopped1.js
11834
+ /** @typedef {import('../runtime.js').LocalizedString} LocalizedString */
11835
+ /** @typedef {{}} Turnstopped1Inputs */
11836
+ var en_turnstopped1 = () => {
11837
+ return `stopped`;
11838
+ };
11839
+ var zh_turnstopped1 = () => {
11840
+ return `已停止`;
11841
+ };
11842
+ var id_turnstopped1 = () => {
11843
+ return `dihentikan`;
11844
+ };
11845
+ var es_turnstopped1 = () => {
11846
+ return `detenido`;
11847
+ };
11848
+ /**
11849
+ * | output |
11850
+ * | --- |
11851
+ * | "stopped" |
11852
+ *
11853
+ * @param {Turnstopped1Inputs} inputs
11854
+ * @param {{ locale?: "en" | "zh" | "id" | "es" }} options
11855
+ * @returns {LocalizedString}
11856
+ */
11857
+ var turnstopped1 = ((inputs = {}, options = {}) => {
11858
+ const locale = options.locale ?? getLocale();
11859
+ if (locale === "zh") return zh_turnstopped1();
11860
+ if (locale === "id") return id_turnstopped1();
11861
+ if (locale === "es") return es_turnstopped1();
11862
+ return en_turnstopped1();
11863
+ });
11864
+ //#endregion
11577
11865
  //#region src/lib/paraglide/messages/turntokenusage2.js
11578
11866
  /** @typedef {import('../runtime.js').LocalizedString} LocalizedString */
11579
11867
  /** @typedef {{}} Turntokenusage2Inputs */
@@ -12321,7 +12609,6 @@ var _index_exports = /* @__PURE__ */ __exportAll({
12321
12609
  clearFilters: () => clearfilters1,
12322
12610
  clearGoal: () => cleargoal1,
12323
12611
  clearSearch: () => clearsearch1,
12324
- clearSessionNameFilter: () => clearsessionnamefilter3,
12325
12612
  clearTheGoal: () => clearthegoal2,
12326
12613
  clearTitle: () => cleartitle1,
12327
12614
  close: () => close,
@@ -12391,6 +12678,15 @@ var _index_exports = /* @__PURE__ */ __exportAll({
12391
12678
  editObjective: () => editobjective1,
12392
12679
  editObjectiveTitle: () => editobjectivetitle2,
12393
12680
  editPrompt: () => editprompt1,
12681
+ editedFilesAdded: () => editedfilesadded2,
12682
+ editedFilesBinary: () => editedfilesbinary2,
12683
+ editedFilesCapHint: () => editedfilescaphint3,
12684
+ editedFilesChip: () => editedfileschip2,
12685
+ editedFilesDeleted: () => editedfilesdeleted2,
12686
+ editedFilesGone: () => editedfilesgone2,
12687
+ editedFilesOversized: () => editedfilesoversized2,
12688
+ editedFilesTitle: () => editedfilestitle2,
12689
+ editedFilesTitleOne: () => editedfilestitleone3,
12394
12690
  enableFullAccess: () => enablefullaccess2,
12395
12691
  enableFullAccessQ: () => enablefullaccessq3,
12396
12692
  escHidesA: () => eschidesa2,
@@ -12645,6 +12941,7 @@ var _index_exports = /* @__PURE__ */ __exportAll({
12645
12941
  toolTitleToolCall: () => tooltitletoolcall3,
12646
12942
  toolTitleWrite: () => tooltitlewrite2,
12647
12943
  turnFailed: () => turnfailed1,
12944
+ turnStopped: () => turnstopped1,
12648
12945
  turnTokenUsage: () => turntokenusage2,
12649
12946
  turnUsage: () => turnusage1,
12650
12947
  uncachedInput: () => uncachedinput1,
@@ -12713,7 +13010,6 @@ var messages_exports = /* @__PURE__ */ __exportAll({
12713
13010
  clearFilters: () => clearfilters1,
12714
13011
  clearGoal: () => cleargoal1,
12715
13012
  clearSearch: () => clearsearch1,
12716
- clearSessionNameFilter: () => clearsessionnamefilter3,
12717
13013
  clearTheGoal: () => clearthegoal2,
12718
13014
  clearTitle: () => cleartitle1,
12719
13015
  close: () => close,
@@ -12783,6 +13079,15 @@ var messages_exports = /* @__PURE__ */ __exportAll({
12783
13079
  editObjective: () => editobjective1,
12784
13080
  editObjectiveTitle: () => editobjectivetitle2,
12785
13081
  editPrompt: () => editprompt1,
13082
+ editedFilesAdded: () => editedfilesadded2,
13083
+ editedFilesBinary: () => editedfilesbinary2,
13084
+ editedFilesCapHint: () => editedfilescaphint3,
13085
+ editedFilesChip: () => editedfileschip2,
13086
+ editedFilesDeleted: () => editedfilesdeleted2,
13087
+ editedFilesGone: () => editedfilesgone2,
13088
+ editedFilesOversized: () => editedfilesoversized2,
13089
+ editedFilesTitle: () => editedfilestitle2,
13090
+ editedFilesTitleOne: () => editedfilestitleone3,
12786
13091
  enableFullAccess: () => enablefullaccess2,
12787
13092
  enableFullAccessQ: () => enablefullaccessq3,
12788
13093
  escHidesA: () => eschidesa2,
@@ -13038,6 +13343,7 @@ var messages_exports = /* @__PURE__ */ __exportAll({
13038
13343
  toolTitleToolCall: () => tooltitletoolcall3,
13039
13344
  toolTitleWrite: () => tooltitlewrite2,
13040
13345
  turnFailed: () => turnfailed1,
13346
+ turnStopped: () => turnstopped1,
13041
13347
  turnTokenUsage: () => turntokenusage2,
13042
13348
  turnUsage: () => turnusage1,
13043
13349
  uncachedInput: () => uncachedinput1,
@@ -14868,12 +15174,18 @@ function renderInline(text) {
14868
15174
  function emphasis(text) {
14869
15175
  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>");
14870
15176
  }
14871
- /** [label](href) — only http(s) hrefs become anchors; everything else is text. */
15177
+ /**
15178
+ * [label](href) — http(s) hrefs become hardened external anchors; SCHEME-FREE
15179
+ * relative hrefs (assistant file links like [card](src/lib/…)) become same-
15180
+ * origin anchors; anything carrying a scheme (javascript:, data:, mailto:,
15181
+ * //evil.com protocol-relative, …) stays inert text (BC-12).
15182
+ */
14872
15183
  function links(text) {
14873
15184
  return text.replace(/\[([^\]]+)\]\(([^)\s]+)\)/g, (whole, label, href) => {
14874
15185
  const unescaped = href.replaceAll("&amp;", "&").replaceAll("&lt;", "<").replaceAll("&gt;", ">").replaceAll("&quot;", "\"").replaceAll("&#39;", "'");
14875
- if (!/^https?:\/\//i.test(unescaped)) return whole;
14876
- return `<a href="${href}" rel="noopener noreferrer" target="_blank">${label}</a>`;
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>`;
14877
15189
  });
14878
15190
  }
14879
15191
  //#endregion
@@ -16299,7 +16611,7 @@ function TokenCounter($$renderer, $$props) {
16299
16611
  */
16300
16612
  let { text } = $$props;
16301
16613
  const count = derived(() => estimateTokens(text));
16302
- $$renderer.push(`<span data-svelte="TokenCounter" class="shrink-0 font-mono text-[11px] tabular-nums text-text-muted" data-testid="token-counter"${attr("title", t(tokencountertitle2))}>~${escape_html(count())} tokens</span>`);
16614
+ $$renderer.push(`<span data-svelte="TokenCounter" class="shrink-0 font-mono text-[11px] tabular-nums text-[#7c3aed]" data-testid="token-counter"${attr("title", t(tokencountertitle2))}>~${escape_html(count())} tokens</span>`);
16303
16615
  });
16304
16616
  }
16305
16617
  //#endregion
@@ -16336,10 +16648,10 @@ function ContextConsumption($$renderer, $$props) {
16336
16648
  $$renderer.push(`<div data-svelte="ContextConsumption" class="flex items-center gap-1"${attr("title", t(() => ctxwindowtitle2({
16337
16649
  used,
16338
16650
  limit
16339
- })))} data-testid="context-consumption"><div class="h-1 w-15 overflow-hidden rounded-sm bg-surface-border"><div${attr_class(`h-full rounded-sm transition-[width] duration-300 ${percent() < 60 ? "bg-emerald-500" : percent() < 85 ? "bg-amber-500" : "bg-red-500"}`)}${attr_style(`width: ${stringify(Math.min(percent(), 100))}%`)}></div></div> <span class="text-[11px] tabular-nums text-text-muted">${escape_html(percent())}%</span></div>`);
16651
+ })))} data-testid="context-consumption"><div class="h-1 w-15 overflow-hidden rounded-sm bg-surface-border"><div class="h-full rounded-sm transition-[width] duration-300 bg-[#7c3aed]"${attr_style(`width: ${stringify(Math.min(percent(), 100))}%`)}></div></div> <span class="text-[11px] tabular-nums text-[#7c3aed]">${escape_html(percent())}%</span></div>`);
16340
16652
  } else if (used !== void 0) {
16341
16653
  $$renderer.push("<!--[1-->");
16342
- $$renderer.push(`<span data-svelte="ContextConsumption" class="text-[11px] tabular-nums text-text-muted"${attr("title", t(ctxwindowunknown2))} data-testid="context-consumption">≈${escape_html(formatK(used))} ctx</span>`);
16654
+ $$renderer.push(`<span data-svelte="ContextConsumption" class="text-[11px] tabular-nums text-[#7c3aed]"${attr("title", t(ctxwindowunknown2))} data-testid="context-consumption">≈${escape_html(formatK(used))} ctx</span>`);
16343
16655
  } else $$renderer.push("<!--[-1-->");
16344
16656
  $$renderer.push(`<!--]-->`);
16345
16657
  });
@@ -16364,7 +16676,7 @@ function ModelSelector($$renderer, $$props) {
16364
16676
  const currentLabel = derived(() => {
16365
16677
  return "model —";
16366
16678
  });
16367
- $$renderer.push(`<div data-svelte="ModelSelector" class="relative"><button type="button" class="inline-flex items-center gap-1 rounded-md border border-slate-300 px-2 py-1 text-xs font-medium text-slate-600 hover:bg-slate-100 disabled:opacity-50"${attr("disabled", disabled, true)} aria-haspopup="listbox"${attr("aria-expanded", open)} data-testid="model-selector-button">${escape_html(currentLabel())} <span class="text-slate-400" aria-hidden="true">▾</span></button> `);
16679
+ $$renderer.push(`<div data-svelte="ModelSelector" class="relative"><button type="button" class="inline-flex items-center gap-1 rounded-md border border-[#7c3aed] px-2 py-1 text-xs font-medium text-[#7c3aed] hover:bg-slate-100 disabled:opacity-50"${attr("disabled", disabled, true)} aria-haspopup="listbox"${attr("aria-expanded", open)} data-testid="model-selector-button">${escape_html(currentLabel())} <span class="text-[#7c3aed]" aria-hidden="true"><svg width="12" height="12" viewBox="0 0 16 16" fill="none" aria-hidden="true"><path d="M4 6l4 4 4-4" stroke="currentColor" stroke-width="1.5" stroke-linecap="round" stroke-linejoin="round"></path></svg></span></button> `);
16368
16680
  $$renderer.push("<!--[-1-->");
16369
16681
  $$renderer.push(`<!--]--></div>`);
16370
16682
  });
@@ -16431,7 +16743,7 @@ function AccessModeChip($$renderer, $$props) {
16431
16743
  });
16432
16744
  if (permission !== null) {
16433
16745
  $$renderer.push("<!--[0-->");
16434
- $$renderer.push(`<div data-svelte="AccessModeChip" class="relative"><button type="button" class="inline-flex items-center gap-1 rounded-md border border-slate-300 px-2 py-1 text-xs font-medium text-slate-600 hover:bg-slate-100 disabled:opacity-50"${attr("disabled", disabled || false, true)} aria-haspopup="listbox"${attr("aria-expanded", open)}${attr("aria-label", t(() => accessmodecurrent2({ label: currentLabel() })))}${attr("title", currentDescription())} data-testid="access-mode-chip"><span class="text-slate-500" aria-hidden="true">`);
16746
+ $$renderer.push(`<div data-svelte="AccessModeChip" class="relative"><button type="button" class="inline-flex items-center gap-1 rounded-md border border-[#7c3aed] px-2 py-1 text-xs font-medium text-[#7c3aed] hover:bg-slate-100 disabled:opacity-50"${attr("disabled", disabled || false, true)} aria-haspopup="listbox"${attr("aria-expanded", open)}${attr("aria-label", t(() => accessmodecurrent2({ label: currentLabel() })))}${attr("title", currentDescription())} data-testid="access-mode-chip"><span class="text-[#7c3aed]" aria-hidden="true">`);
16435
16747
  if (permission.current === "read-only") {
16436
16748
  $$renderer.push("<!--[0-->");
16437
16749
  $$renderer.push(`<svg width="14" height="14" viewBox="0 0 16 16" fill="none"><path d="M8.20554 0.899994L14.7901 3.36857V7.01026C14.7901 12 11.0466 14.2103 8.20554 15.3C5.36446 14.2103 1.62012 12 1.62012 7.01026V3.36857L8.20554 0.899994Z" stroke="currentColor" stroke-width="1.31831" stroke-linejoin="round"></path><path d="M12.1654 5.7552L8.9447 9.41475C8.73044 9.65816 8.53628 9.8804 8.35774 10.0423C8.1713 10.2114 7.94235 10.3717 7.64016 10.4254C7.48207 10.4535 7.32 10.4552 7.16151 10.4294C6.85843 10.3801 6.62728 10.2223 6.43836 10.0559C6.25752 9.89653 6.06037 9.67732 5.84264 9.43705L4.72925 8.20897L5.63557 7.38707L6.74897 8.61594C6.98603 8.87755 7.12974 9.03533 7.24673 9.13839C7.31033 9.19443 7.34485 9.21476 7.35823 9.22122C7.38068 9.22484 7.40352 9.22515 7.42593 9.22122C7.40522 9.22502 7.42893 9.23294 7.53583 9.136C7.65132 9.03126 7.79316 8.87139 8.02643 8.60638L11.2479 4.94763L12.1654 5.7552Z" fill="currentColor"></path></svg>`);
@@ -16442,7 +16754,7 @@ function AccessModeChip($$renderer, $$props) {
16442
16754
  $$renderer.push("<!--[-1-->");
16443
16755
  $$renderer.push(`<svg width="14" height="14" viewBox="0 0 16 16" fill="none"><path d="M8.08887 0.251709C8.20479 0.23085 8.32486 0.241168 8.43652 0.282959L15.0215 2.75171C15.2787 2.84819 15.4492 3.09414 15.4492 3.3689V7.0105C15.4492 7.10986 15.4441 7.2081 15.4414 7.30542C15.0285 7.07175 14.5905 6.87695 14.1309 6.73022V3.82495L8.20508 1.60327L2.2793 3.82495V7.0105C2.27936 9.7171 3.4745 11.5379 5.02734 12.7947C5.01025 12.9942 5 13.1962 5 13.4001C5.00001 13.7617 5.02722 14.1169 5.08008 14.4636C2.91555 13.0393 0.961014 10.752 0.960938 7.0105V3.3689C0.960938 3.09417 1.13146 2.84821 1.38867 2.75171L7.97461 0.282959L8.08887 0.251709Z" fill="currentColor"></path><path d="M11.3525 5.64688V6.85688H5V5.64688H11.3525Z" fill="currentColor"></path><path d="M9.5824 8.29376V9.50376H5V8.29376H9.5824Z" fill="currentColor"></path><path d="M14.6647 15.6852H10.0338C10.3878 15.3751 10.7567 15.0517 11.0772 14.7706C11.2531 14.6164 11.4144 14.4746 11.5511 14.3547H14.6647V15.6852Z" fill="currentColor"></path><path d="M8.14852 14.1308L7.33925 15.4976C7.22458 15.6912 7.42245 15.9194 7.63037 15.8333L9.09785 15.2254L15.0399 10.0719L14.0905 8.97733L8.14852 14.1308Z" fill="currentColor"></path></svg>`);
16444
16756
  }
16445
- $$renderer.push(`<!--]--></span> ${escape_html(currentLabel())} <span class="text-slate-400" aria-hidden="true">▾</span></button> `);
16757
+ $$renderer.push(`<!--]--></span> ${escape_html(currentLabel())} <span class="text-[#7c3aed]" aria-hidden="true"><svg width="12" height="12" viewBox="0 0 16 16" fill="none" aria-hidden="true"><path d="M4 6l4 4 4-4" stroke="currentColor" stroke-width="1.5" stroke-linecap="round" stroke-linejoin="round"></path></svg></span></button> `);
16446
16758
  $$renderer.push("<!--[-1-->");
16447
16759
  $$renderer.push(`<!--]--></div> `);
16448
16760
  $$renderer.push("<!--[-1-->");
@@ -18300,12 +18612,26 @@ var MENU_GESTURES = [
18300
18612
  seed: "/workspace ",
18301
18613
  description: COMMAND_HELP.workspace.summary
18302
18614
  },
18615
+ {
18616
+ name: "terminal",
18617
+ display: "/dsi-terminal",
18618
+ seed: "/dsi-terminal ",
18619
+ description: COMMAND_HELP.terminal.summary
18620
+ },
18303
18621
  {
18304
18622
  name: "promptmanager",
18305
18623
  display: "/dsi-prompts",
18306
18624
  seed: "/dsi-prompts ",
18307
18625
  description: COMMAND_HELP.promptmanager.summary
18308
18626
  },
18627
+ {
18628
+ name: "skillshelf",
18629
+ display: "/dsi-skills",
18630
+ seed: "/dsi-skills ",
18631
+ get description() {
18632
+ return t(commandhelpskillshelfsummary3);
18633
+ }
18634
+ },
18309
18635
  {
18310
18636
  name: "dsisettings",
18311
18637
  display: "/dsi-settings",
@@ -18318,20 +18644,6 @@ var MENU_GESTURES = [
18318
18644
  seed: "/dsh-settings ",
18319
18645
  description: COMMAND_HELP.dshsettings.summary
18320
18646
  },
18321
- {
18322
- name: "terminal",
18323
- display: "/dsi-terminal",
18324
- seed: "/dsi-terminal ",
18325
- description: COMMAND_HELP.terminal.summary
18326
- },
18327
- {
18328
- name: "skillshelf",
18329
- display: "/dsi-skills",
18330
- seed: "/dsi-skills ",
18331
- get description() {
18332
- return t(commandhelpskillshelfsummary3);
18333
- }
18334
- },
18335
18647
  {
18336
18648
  name: "@mention",
18337
18649
  display: "@mention",
@@ -19710,6 +20022,56 @@ function LoadOlderSentinel($$renderer, $$props) {
19710
20022
  });
19711
20023
  }
19712
20024
  //#endregion
20025
+ //#region src/lib/utils/file-link.ts
20026
+ /**
20027
+ * file-link — pure predicates for transcript file links (File Link Intent
20028
+ * spec, 2026-09-25; ADR The File Link Intent D2/D4). No DOM, no I/O: the
20029
+ * sanitizer (markdown.ts) stays pure and the transcript handler stays
20030
+ * testable — this module is the shared layer both import.
20031
+ *
20032
+ * The CONFINEMENT authority is the host (workspace-tree/workspace-file
20033
+ * routes refuse outside-workspace reads); these predicates are a client
20034
+ * fast-fail, not a security boundary.
20035
+ */
20036
+ /** True when the segment escapes the workspace — never a real file. */
20037
+ function hasDotDotSegment(path) {
20038
+ return path.split("/").some((segment) => segment === "..");
20039
+ }
20040
+ /**
20041
+ * Normalize a file-link href to a workspace-relative path: strip a
20042
+ * leading './', collapse duplicate slashes, strip a single leading slash.
20043
+ * Returns null when the path escapes the workspace ('..' anywhere) or
20044
+ * normalizes to empty.
20045
+ */
20046
+ function normalizeFileLinkPath(href) {
20047
+ let value = href.trim().replace(/^\.\//, "").replace(/\/{2,}/g, "/");
20048
+ if (value.startsWith("/")) value = value.slice(1);
20049
+ if (value === "" || hasDotDotSegment(value)) return null;
20050
+ return value;
20051
+ }
20052
+ /**
20053
+ * The existence gate (ADR D3): probe the dirname via the confined tree
20054
+ * route and require the basename in the listing. Any refusal (404
20055
+ * missing/outside, 415, 502, transport) resolves false — the click
20056
+ * drops. Uses the injected fetch so tests mount the double.
20057
+ */
20058
+ async function workspaceFileExists(sessionId, path, fetchImpl = fetch) {
20059
+ const clean = path.split("#")[0];
20060
+ if (clean === "") return false;
20061
+ const slash = clean.lastIndexOf("/");
20062
+ const dir = slash === -1 ? "" : clean.slice(0, slash);
20063
+ const base = slash === -1 ? clean : clean.slice(slash + 1);
20064
+ try {
20065
+ const res = await fetchImpl(`/api/dsh/workspace-tree?sessionId=${encodeURIComponent(sessionId)}&path=${encodeURIComponent(dir)}`);
20066
+ if (!res.ok) return false;
20067
+ const body = await res.json();
20068
+ if (body?.ok !== true || !Array.isArray(body.listing?.entries)) return false;
20069
+ return body.listing.entries.some((entry) => entry.name === base);
20070
+ } catch {
20071
+ return false;
20072
+ }
20073
+ }
20074
+ //#endregion
19713
20075
  //#region src/lib/components/common/buttons/CopyButton.svelte
19714
20076
  function CopyButton($$renderer, $$props) {
19715
20077
  $$renderer.component(($$renderer) => {
@@ -19741,7 +20103,7 @@ function RawPreviewToggle($$renderer, $$props) {
19741
20103
  //#region src/lib/components/common/viewers/MarkdownContent.svelte
19742
20104
  function MarkdownContent($$renderer, $$props) {
19743
20105
  $$renderer.component(($$renderer) => {
19744
- let { content, small = false, hideToggle = false, searchTerm = "" } = $$props;
20106
+ let { content, small = false, hideToggle = false, searchTerm = "", onFileLink = void 0 } = $$props;
19745
20107
  let showRaw = false;
19746
20108
  let containerEl = null;
19747
20109
  /** Sanitized HTML — BC-12: allow-listed tags only (never raw input). */
@@ -20455,7 +20817,16 @@ function AssistantTurn($$renderer, $$props) {
20455
20817
  * members through the existing components (reasoning section, markdown
20456
20818
  * body, tool chips); this component owns the grouping visual contract.
20457
20819
  */
20458
- let { time, start = void 0, usage = void 0, text, children, fork = null } = $$props;
20820
+ let { time, start = void 0, usage = void 0, text, children, fork = null, lifecycle = void 0 } = $$props;
20821
+ /** Operator-stopped turn (ADR D2): chip + duration-prefix suppression. */
20822
+ const stoppedByUser = derived(() => lifecycle?.reasonKind === "aborted" && lifecycle?.abortKind === "user");
20823
+ /** Completed turns read elapsed from the WIRE pair (ADR D3); the
20824
+ * entry-time reconstruction stays only as fallback. */
20825
+ const ranPrefix = derived(() => {
20826
+ if (stoppedByUser()) return void 0;
20827
+ if (lifecycle?.reasonKind === "completed" && lifecycle.endMs !== void 0 && lifecycle.endMs >= lifecycle.startMs) return `Ran for ${formatRunDuration(lifecycle.endMs - lifecycle.startMs)}`;
20828
+ return start !== void 0 && time !== void 0 ? `Ran for ${formatRunDuration(time - start)}` : void 0;
20829
+ });
20459
20830
  /** Raw ⇄ rendered flip state — owned here, wired to ToolsMessage. */
20460
20831
  let showRaw = false;
20461
20832
  /** Bubble element ref — capture target for the canvas copy button. */
@@ -20508,11 +20879,16 @@ function AssistantTurn($$renderer, $$props) {
20508
20879
  RelativeTime($$renderer, {
20509
20880
  time,
20510
20881
  role: "assistant",
20511
- prefix: start !== void 0 ? `Ran for ${formatRunDuration(time - start)}` : void 0,
20882
+ prefix: ranPrefix(),
20512
20883
  class: "absolute bottom-0.5 right-3 text-[10px] leading-none text-text-muted/60 group-hover/bubble:text-[#7c3aed]"
20513
20884
  });
20514
20885
  } else $$renderer.push("<!--[-1-->");
20515
20886
  $$renderer.push(`<!--]--> `);
20887
+ if (stoppedByUser()) {
20888
+ $$renderer.push("<!--[0-->");
20889
+ $$renderer.push(`<span class="absolute bottom-0.5 left-1/2 -translate-x-1/2 rounded-full border border-amber-500/30 bg-amber-500/10 px-1.5 py-0.5 text-[10px] leading-none text-amber-600" data-testid="turn-stopped-chip"${attr("title", t(turnstopped1))}>${escape_html(t(turnstopped1))}</span>`);
20890
+ } else $$renderer.push("<!--[-1-->");
20891
+ $$renderer.push(`<!--]--> `);
20516
20892
  if (usage !== void 0) {
20517
20893
  $$renderer.push("<!--[0-->");
20518
20894
  TurnUsagePanel($$renderer, {
@@ -22089,6 +22465,32 @@ function TodoCard($$renderer, $$props) {
22089
22465
  });
22090
22466
  }
22091
22467
  //#endregion
22468
+ //#region src/lib/services/conversation/session-context.svelte.ts
22469
+ var SESSION_KEY = Symbol("dsi-conversation-session");
22470
+ function setConversationSession(sessionId) {
22471
+ setContext(SESSION_KEY, sessionId);
22472
+ }
22473
+ /** The owning sessionId, or null when no provider is present (standalone
22474
+ * mode, tests, non-panel contexts). */
22475
+ function getConversationSession() {
22476
+ return getContext(SESSION_KEY) ?? null;
22477
+ }
22478
+ //#endregion
22479
+ //#region src/lib/components/message/cards/FilesEditedCard.svelte
22480
+ function FilesEditedCard($$renderer, $$props) {
22481
+ $$renderer.component(($$renderer) => {
22482
+ /** Wire: the file's real path — drives language pickup. */
22483
+ let open = false;
22484
+ getConversationSession();
22485
+ $$renderer.push(`<div data-svelte="FilesEditedCard" class="self-start text-xs" data-testid="files-edited-section"${attr("data-open", open)}><button type="button"${attr("aria-expanded", open)} data-testid="files-edited-toggle"${attr_class(`chip-button inline-flex items-center gap-1 px-1.5 py-0.5 rounded-md text-xs font-mono font-medium mx-0.5 my-0.5 align-middle shrink-0 transition-colors select-none cursor-pointer bg-surface-alt text-text-secondary border border-surface-border hover:bg-surface-hover hover:text-text-primary`)}>`);
22486
+ $$renderer.push("<!--[-1-->");
22487
+ Chevron_right($$renderer, { size: 10 });
22488
+ $$renderer.push(`<!--]--> <span class="text-[10px]">${escape_html(t(() => editedfileschip2()))}</span></button> `);
22489
+ $$renderer.push("<!--[-1-->");
22490
+ $$renderer.push(`<!--]--></div>`);
22491
+ });
22492
+ }
22493
+ //#endregion
22092
22494
  //#region src/lib/components/common/viewers/ReasoningContentViewer.svelte
22093
22495
  function ReasoningContentViewer($$renderer, $$props) {
22094
22496
  $$renderer.component(($$renderer) => {
@@ -22276,6 +22678,13 @@ function InlineToolCalls($$renderer, $$props) {
22276
22678
  function chipToolTitle(name) {
22277
22679
  return t(TOOL_TITLE_MESSAGES[classifyTool(name)]);
22278
22680
  }
22681
+ /** Peek-list membership (2026-09-25 bug fix): every chip EXCEPT the
22682
+ * self-rendering kinds — a files-edited entry IS its own card
22683
+ * (FilesEditedCard), so counting it as a chip made the peek button
22684
+ * claim a tool call the row did not show. */
22685
+ function isPeekMember(entry) {
22686
+ return entry.kind !== "assistant-message" && entry.kind !== "files-edited";
22687
+ }
22279
22688
  /** Peek-list row label (ToolPeekButton port): match the chip skins. */
22280
22689
  function peekLabel(entry) {
22281
22690
  if (entry.kind === "tool-call") return chipToolTitle(entry.toolName);
@@ -22305,9 +22714,9 @@ function InlineToolCalls($$renderer, $$props) {
22305
22714
  let $$inner_renderer;
22306
22715
  function $$render_inner($$renderer) {
22307
22716
  $$renderer.push(`<div data-svelte="InlineToolCalls" class="flex flex-wrap items-center">`);
22308
- if (entries.some((e) => e.kind !== "assistant-message")) {
22717
+ if (entries.some(isPeekMember)) {
22309
22718
  $$renderer.push("<!--[0-->");
22310
- const chipCount = entries.filter((e) => e.kind !== "assistant-message").length;
22719
+ const chipCount = entries.filter(isPeekMember).length;
22311
22720
  ToolPeekButton($$renderer, {
22312
22721
  count: chipCount,
22313
22722
  active: peekOpen});
@@ -22359,8 +22768,14 @@ function InlineToolCalls($$renderer, $$props) {
22359
22768
  open: openChipId === entry.id,
22360
22769
  ontoggle: () => ontoggleChip(entry.id)
22361
22770
  });
22362
- } else if (entry.kind === "unknown-event") {
22771
+ } else if (entry.kind === "files-edited") {
22363
22772
  $$renderer.push("<!--[5-->");
22773
+ FilesEditedCard($$renderer, {
22774
+ turn: entry.turn,
22775
+ seq: entry.seq
22776
+ });
22777
+ } else if (entry.kind === "unknown-event") {
22778
+ $$renderer.push("<!--[6-->");
22364
22779
  ToolCallChip($$renderer, {
22365
22780
  kind: "unknown",
22366
22781
  toolName: entry.eventType,
@@ -22368,7 +22783,7 @@ function InlineToolCalls($$renderer, $$props) {
22368
22783
  ontoggle: () => ontoggleChip(entry.id)
22369
22784
  });
22370
22785
  } else if (entry.kind === "user-message") {
22371
- $$renderer.push("<!--[6-->");
22786
+ $$renderer.push("<!--[7-->");
22372
22787
  ContextInjection($$renderer, {
22373
22788
  producer: entry.meta,
22374
22789
  text: entry.text,
@@ -22378,7 +22793,7 @@ function InlineToolCalls($$renderer, $$props) {
22378
22793
  onopen: subagentOpenOf(entry.meta, entry.metaSource)
22379
22794
  });
22380
22795
  } else if (entry.kind === "turn-error") {
22381
- $$renderer.push("<!--[7-->");
22796
+ $$renderer.push("<!--[8-->");
22382
22797
  TurnErrorChip($$renderer, {
22383
22798
  message: entry.message,
22384
22799
  code: entry.code,
@@ -22395,7 +22810,7 @@ function InlineToolCalls($$renderer, $$props) {
22395
22810
  const each_array_1 = ensure_array_like(entries);
22396
22811
  for (let $$index_1 = 0, $$length = each_array_1.length; $$index_1 < $$length; $$index_1++) {
22397
22812
  let entry = each_array_1[$$index_1];
22398
- if (entry.kind !== "assistant-message") {
22813
+ if (isPeekMember(entry)) {
22399
22814
  $$renderer.push("<!--[0-->");
22400
22815
  const preview = peekPreview(entry);
22401
22816
  $$renderer.push(`<li class="px-3 py-1 text-xs flex items-center gap-2"><span${attr_class(`w-1.5 h-1.5 rounded-full shrink-0 ${stringify(peekDotClass(entry))}`)}></span> <span class="font-mono font-medium text-text-primary shrink-0">${escape_html(peekLabel(entry))}</span> `);
@@ -22734,6 +23149,7 @@ function groupTurns(entries) {
22734
23149
  });
22735
23150
  continue;
22736
23151
  }
23152
+ if (entry.kind === "turn-lifecycle") continue;
22737
23153
  const side = entry;
22738
23154
  const last = groups[groups.length - 1];
22739
23155
  if (last?.kind === "assistant-turn") last.entries.push(side);
@@ -22893,6 +23309,58 @@ function turnProcess(entries, opts) {
22893
23309
  };
22894
23310
  }
22895
23311
  //#endregion
23312
+ //#region src/lib/services/conversation/turn-projection.ts
23313
+ function isLifecycleEntry(entry) {
23314
+ return entry.kind === "turn-lifecycle";
23315
+ }
23316
+ /**
23317
+ * Fold all turn-lifecycle markers into per-turn records keyed by the
23318
+ * harness's turn number. Pure; last-write-wins per phase (ledger replays
23319
+ * may re-serve a bracket).
23320
+ */
23321
+ function projectTurnLifecycle(entries) {
23322
+ const map = /* @__PURE__ */ new Map();
23323
+ for (const entry of entries) {
23324
+ if (!isLifecycleEntry(entry)) continue;
23325
+ const prev = map.get(entry.turn);
23326
+ if (entry.phase === "start") {
23327
+ const keepEnd = prev?.endSeq !== void 0 && prev.endSeq > entry.seq;
23328
+ map.set(entry.turn, {
23329
+ startSeq: entry.seq,
23330
+ startMs: entry.time,
23331
+ ...keepEnd ? {
23332
+ endSeq: prev?.endSeq,
23333
+ endMs: prev?.endMs,
23334
+ reasonKind: prev?.reasonKind,
23335
+ abortKind: prev?.abortKind
23336
+ } : {}
23337
+ });
23338
+ } else {
23339
+ const base = prev ?? {
23340
+ startSeq: Number.MAX_SAFE_INTEGER,
23341
+ startMs: entry.time
23342
+ };
23343
+ map.set(entry.turn, {
23344
+ ...base,
23345
+ endSeq: entry.seq,
23346
+ endMs: entry.time,
23347
+ reasonKind: entry.reasonKind,
23348
+ ...entry.abortKind !== void 0 ? { abortKind: entry.abortKind } : {}
23349
+ });
23350
+ }
23351
+ }
23352
+ return map;
23353
+ }
23354
+ /**
23355
+ * Join a turn group to its lifecycle record: the record must BRACKET the
23356
+ * group — start seq strictly before the group's first entry seq, end seq
23357
+ * strictly after the group's last entry seq. Unpaired (in-flight or
23358
+ * start-less) records never join, so an open turn renders nothing.
23359
+ */
23360
+ function lifecycleForGroup(map, firstSeq, lastSeq) {
23361
+ for (const record of map.values()) if (record.startSeq < firstSeq && record.endSeq !== void 0 && record.endSeq > lastSeq) return record;
23362
+ }
23363
+ //#endregion
22896
23364
  //#region src/lib/components/conversation/ConversationScrollArea.svelte
22897
23365
  function ConversationScrollArea($$renderer, $$props) {
22898
23366
  $$renderer.component(($$renderer) => {
@@ -22914,7 +23382,7 @@ function ConversationScrollArea($$renderer, $$props) {
22914
23382
  * The viewport element is $bindable: the page keeps it for the
22915
23383
  * floating anchor stack (jumper + back-to-top act on this scroller).
22916
23384
  */
22917
- let { viewport = void 0, stick = true, entries, groups, hasMore, loadingOlder, olderError, onloadolder, openChipId, ontogglechip, autoThinkId = null, autoPlanId = null, peekOpenRunKey, ontogglepeek, pendingCards, settledCards, onanswer, sessionId, title = null, agentPreset = null, subagent = false, depth = 0 } = $$props;
23385
+ let { viewport = void 0, stick = true, entries, groups, hasMore, loadingOlder, olderError, onloadolder, openChipId, ontogglechip, autoThinkId = null, autoPlanId = null, peekOpenRunKey, ontogglepeek, pendingCards, settledCards, onanswer, onFileLink = void 0, sessionId, title = null, agentPreset = null, subagent = false, depth = 0 } = $$props;
22918
23386
  /** Depth-graded sub-agent tints: beige at depth 1, one step darker
22919
23387
  * per nesting level, darkest from depth 3 on (the cap). */
22920
23388
  const SUBAGENT_TINTS = [
@@ -23052,6 +23520,7 @@ function ConversationScrollArea($$renderer, $$props) {
23052
23520
  start: turnStartTime(group.entries),
23053
23521
  usage: turnUsage(group.entries),
23054
23522
  text: turnText(group.entries),
23523
+ lifecycle: lifecycleForGroup(projectTurnLifecycle(entries), group.entries[0].seq, group.entries[group.entries.length - 1].seq),
23055
23524
  fork: subagent ? null : {
23056
23525
  sessionId,
23057
23526
  atSeq: turnAnchorSeq(group.entries),
@@ -23094,7 +23563,8 @@ function ConversationScrollArea($$renderer, $$props) {
23094
23563
  $$renderer.push("<!--[0-->");
23095
23564
  MarkdownContent($$renderer, {
23096
23565
  content: run.entry.text,
23097
- hideToggle: true
23566
+ hideToggle: true,
23567
+ onFileLink
23098
23568
  });
23099
23569
  } else {
23100
23570
  $$renderer.push("<!--[-1-->");
@@ -23122,7 +23592,8 @@ function ConversationScrollArea($$renderer, $$props) {
23122
23592
  $$renderer.push("<!--[0-->");
23123
23593
  MarkdownContent($$renderer, {
23124
23594
  content: run.entry.text,
23125
- hideToggle: true
23595
+ hideToggle: true,
23596
+ onFileLink
23126
23597
  });
23127
23598
  } else {
23128
23599
  $$renderer.push("<!--[-1-->");
@@ -23151,7 +23622,8 @@ function ConversationScrollArea($$renderer, $$props) {
23151
23622
  $$renderer.push("<!--[0-->");
23152
23623
  MarkdownContent($$renderer, {
23153
23624
  content: run.entry.text,
23154
- hideToggle: true
23625
+ hideToggle: true,
23626
+ onFileLink
23155
23627
  });
23156
23628
  } else {
23157
23629
  $$renderer.push("<!--[-1-->");
@@ -25322,8 +25794,9 @@ function ConversationPanel($$renderer, $$props) {
25322
25794
  * existing command banner. Catalog reads fire on first menu open,
25323
25795
  * never at mount (cold sessions stay cold).
25324
25796
  */
25325
- let { panelId = null, sessionId, title: initialTitleProp = null, workspace = null, workspaces = [], agent, agentDisplay = null, subagent = false, depth = 0, parentSessionId = null, entries, lastSeq, running, hasMore = void 0, pendingAnswers = [], settledAnswers = [], permission = null, imageLimits = void 0, knobEvents = void 0, a2aRows = [], a2aTitles = {}, onNeedCold = void 0, onClose = void 0, focusComposer = false, oncomposerfocus = void 0, focused = false, onOpenExplorer = void 0 } = $$props;
25797
+ let { panelId = null, sessionId, title: initialTitleProp = null, workspace = null, workspaces = [], agent, agentDisplay = null, subagent = false, depth = 0, parentSessionId = null, entries, lastSeq, running, hasMore = void 0, pendingAnswers = [], settledAnswers = [], permission = null, imageLimits = void 0, knobEvents = void 0, a2aRows = [], a2aTitles = {}, onNeedCold = void 0, onClose = void 0, focusComposer = false, oncomposerfocus = void 0, focused = false, onOpenExplorer = void 0, onFileLink = void 0 } = $$props;
25326
25798
  setPanelMode(true);
25799
+ setConversationSession(sessionId);
25327
25800
  const store = createConversationStore(sessionId);
25328
25801
  const orchestrator = createPollingOrchestrator(store);
25329
25802
  if (entries !== void 0) store.replaceAll(entries);
@@ -25727,6 +26200,7 @@ function ConversationPanel($$renderer, $$props) {
25727
26200
  pendingCards: pendingCards(),
25728
26201
  settledCards: settledCards(),
25729
26202
  onanswer: (rpcId, payload) => void onanswer(rpcId, payload),
26203
+ onFileLink,
25730
26204
  sessionId: store.sessionId,
25731
26205
  title,
25732
26206
  agentPreset: agent,
@@ -25859,8 +26333,13 @@ var initialTerminalPanelState = {
25859
26333
  //#region src/lib/components/terminal/TerminalPanel.svelte
25860
26334
  function TerminalPanel($$renderer, $$props) {
25861
26335
  $$renderer.component(($$renderer) => {
26336
+ let { onShellExit, assigned = null, onAssigned } = $$props;
25862
26337
  let panelState = { ...initialTerminalPanelState };
25863
26338
  Promise.resolve();
26339
+ /** Focus the live xterm surface (the desk's ⌥+N tab shortcut,
26340
+ * 2026-09-25): the real terminal when attached, the fallback
26341
+ * input's textarea otherwise. */
26342
+ function focusTerminal() {}
25864
26343
  function settleText(reason) {
25865
26344
  if (reason === "stdin_read") return t(terminalsettlestdinread3);
25866
26345
  if (reason === "inferred_idle") return t(terminalsettleinferredidle3);
@@ -25868,7 +26347,7 @@ function TerminalPanel($$renderer, $$props) {
25868
26347
  if (reason === "session_exit") return t(terminalsettlesessionexit3);
25869
26348
  return "";
25870
26349
  }
25871
- $$renderer.push(`<div data-svelte="TerminalPanel" class="terminal-panel flex h-full min-h-80 flex-col rounded-lg bg-slate-900 p-1" data-testid="terminal-panel"><div class="mb-1 flex items-center gap-2 px-1 text-[10px] text-slate-400"><span class="font-medium text-slate-300">${escape_html(t(terminalpaneltitle2))}</span> `);
26350
+ $$renderer.push(`<div data-svelte="TerminalPanel" class="terminal-panel flex h-full min-h-80 flex-col rounded-lg bg-slate-900 p-1" data-testid="terminal-panel"><div class="mb-1 flex items-center gap-2 px-1 text-[10px] text-slate-400">`);
25872
26351
  if (panelState.lastSettle) {
25873
26352
  $$renderer.push("<!--[0-->");
25874
26353
  $$renderer.push(`<span data-testid="terminal-settle-badge" class="rounded bg-slate-700 px-1.5 py-0.5">${escape_html(settleText(panelState.lastSettle))}</span>`);
@@ -25886,15 +26365,23 @@ function TerminalPanel($$renderer, $$props) {
25886
26365
  $$renderer.push(`<div class="px-2 pb-1 text-[10px] text-slate-500" data-testid="terminal-closed">${escape_html(t(terminalclosed1))}${escape_html(panelState.quiescent === false ? " (lingering)" : "")}</div>`);
25887
26366
  } else $$renderer.push("<!--[-1-->");
25888
26367
  $$renderer.push(`<!--]--></div>`);
26368
+ bind_props($$props, { focusTerminal });
25889
26369
  });
25890
26370
  }
25891
26371
  //#endregion
25892
26372
  //#region src/lib/components/terminal/TerminalTabHeader.svelte
25893
26373
  function TerminalTabHeader($$renderer, $$props) {
25894
- let { children } = $$props;
26374
+ let { children, actions } = $$props;
25895
26375
  $$renderer.push(`<div data-svelte="TerminalTabHeader" role="tablist" class="flex items-center gap-1 border-b border-slate-800 px-1 py-0.5" data-testid="terminal-tab-header">`);
25896
26376
  children($$renderer);
25897
- $$renderer.push(`<!----></div>`);
26377
+ $$renderer.push(`<!----> `);
26378
+ if (actions) {
26379
+ $$renderer.push("<!--[0-->");
26380
+ $$renderer.push(`<div class="ml-auto flex items-center" data-testid="terminal-tab-header-actions">`);
26381
+ actions($$renderer);
26382
+ $$renderer.push(`<!----></div>`);
26383
+ } else $$renderer.push("<!--[-1-->");
26384
+ $$renderer.push(`<!--]--></div>`);
25898
26385
  }
25899
26386
  //#endregion
25900
26387
  //#region src/lib/components/terminal/TerminalTabButton.svelte
@@ -25939,6 +26426,7 @@ function TerminalDesk($$renderer, $$props) {
25939
26426
  /** Null = self-open (the panel runs its own ladder and reports back
25940
26427
  * via onAssigned); set = the desk holds this session's lease. */
25941
26428
  let { onShellExit, restored = null, onMirror } = $$props;
26429
+ const captureEl = derived(() => null);
25942
26430
  let nextKey = 1;
25943
26431
  const mkKey = () => nextKey++;
25944
26432
  const defaultTab = () => ({
@@ -25996,25 +26484,74 @@ function TerminalDesk($$renderer, $$props) {
25996
26484
  } else tabs[selectedTab].rows.push(row);
25997
26485
  })();
25998
26486
  }
26487
+ /** Tab close (D5): ladder-close every row's session, remove the tab,
26488
+ * move selection to the right neighbor (or left if last); the last
26489
+ * tab's close removes the desk slot via onShellExit (the floor's
26490
+ * removePanel path — the same mutation as the column close). */
26491
+ function closeTab(tabIndex) {
26492
+ const tab = tabs[tabIndex];
26493
+ for (const row of tab.rows) if (row.assigned) fetch("/api/terminal/" + row.assigned.sessionId + "/send", {
26494
+ method: "POST",
26495
+ headers: { "content-type": "application/json" },
26496
+ body: JSON.stringify({
26497
+ token: row.assigned.token,
26498
+ action: "close"
26499
+ }),
26500
+ keepalive: true
26501
+ }).catch(() => void 0);
26502
+ tabs.splice(tabIndex, 1);
26503
+ if (tabs.length === 0) {
26504
+ onShellExit?.();
26505
+ return;
26506
+ }
26507
+ selectedTab = Math.min(tabIndex, tabs.length - 1);
26508
+ }
26509
+ /** Shell exit in a row (D5): the session is already dead — shrink the
26510
+ * tab; an empty tab closes (selection rules as closeTab); the desk's
26511
+ * last shell dying removes the slot (if only one terminal overall, it
26512
+ * means closing the PanelColumn). */
26513
+ function removeRow(tabIndex, row) {
26514
+ const tab = tabs[tabIndex];
26515
+ const i = tab.rows.indexOf(row);
26516
+ if (i >= 0) tab.rows.splice(i, 1);
26517
+ if (tab.rows.length === 0) closeTab(tabIndex);
26518
+ }
26519
+ function recordAssigned(row, sessionId, token) {
26520
+ row.assigned = {
26521
+ sessionId,
26522
+ token
26523
+ };
26524
+ }
25999
26525
  $$renderer.push(`<div data-svelte="TerminalDesk" class="flex h-full min-h-0 flex-col rounded-lg bg-slate-900" data-testid="terminal-desk">`);
26000
26526
  if (restoring) {
26001
26527
  $$renderer.push("<!--[0-->");
26002
26528
  $$renderer.push(`<div class="p-3 text-xs text-slate-500" data-testid="terminal-desk-restoring">...</div>`);
26003
26529
  } else {
26004
26530
  $$renderer.push("<!--[-1-->");
26005
- TerminalTabHeader($$renderer, {
26006
- children: ($$renderer) => {
26007
- $$renderer.push(`<!--[-->`);
26008
- const each_array = ensure_array_like(tabs);
26009
- for (let i = 0, $$length = each_array.length; i < $$length; i++) {
26010
- each_array[i];
26011
- TerminalTabButton($$renderer, {
26012
- index: i,
26013
- label: "T" + (i + 1),
26014
- selected: i === selectedTab});
26015
- }
26016
- $$renderer.push(`<!--]-->`);
26017
- }});
26531
+ {
26532
+ function actions($$renderer) {
26533
+ CanvasCopyButton($$renderer, {
26534
+ container: captureEl(),
26535
+ mode: "visible",
26536
+ title: t(copypanelasimage3),
26537
+ size: 12
26538
+ });
26539
+ }
26540
+ TerminalTabHeader($$renderer, {
26541
+ actions,
26542
+ children: ($$renderer) => {
26543
+ $$renderer.push(`<!--[-->`);
26544
+ const each_array = ensure_array_like(tabs);
26545
+ for (let i = 0, $$length = each_array.length; i < $$length; i++) {
26546
+ each_array[i];
26547
+ TerminalTabButton($$renderer, {
26548
+ index: i,
26549
+ label: "T" + (i + 1),
26550
+ selected: i === selectedTab});
26551
+ }
26552
+ $$renderer.push(`<!--]-->`);
26553
+ }});
26554
+ }
26018
26555
  $$renderer.push(`<!----> <!--[-->`);
26019
26556
  const each_array_1 = ensure_array_like(tabs);
26020
26557
  for (let i = 0, $$length = each_array_1.length; i < $$length; i++) {
@@ -26032,7 +26569,10 @@ function TerminalDesk($$renderer, $$props) {
26032
26569
  let row = each_array_2[$$index_1];
26033
26570
  $$renderer.push(`<div class="min-h-0" style="flex: 1 1 0; min-height: 10rem;">`);
26034
26571
  TerminalPanel($$renderer, {
26035
- assigned: row.assigned});
26572
+ assigned: row.assigned,
26573
+ onAssigned: (sessionId, token) => recordAssigned(row, sessionId, token),
26574
+ onShellExit: () => removeRow(i, row)
26575
+ });
26036
26576
  $$renderer.push(`<!----></div>`);
26037
26577
  }
26038
26578
  $$renderer.push(`<!--]-->`);
@@ -26877,7 +27417,7 @@ function WorkspaceExplorerTree($$renderer, $$props) {
26877
27417
  */
26878
27418
  /** One listing row (workspaceFiles/list WorkspaceDirectoryEntry). */
26879
27419
  /** Viewing state for one fetched level (owner-held, never persisted). */
26880
- let { root, levels, expanded, repoMaps, changedPaths, changedDirs} = $$props;
27420
+ let { root, levels, expanded, repoMaps, changedPaths, changedDirs, activeFile = null } = $$props;
26881
27421
  /** The row's child rel path (the listing's names are basenames). */
26882
27422
  function childRel(rel, name) {
26883
27423
  return rel === "" ? name : rel + "/" + name;
@@ -26897,7 +27437,8 @@ function WorkspaceExplorerTree($$renderer, $$props) {
26897
27437
  const isRepoChild = dir && repoMaps[rel]?.repos?.[entry.name] === true;
26898
27438
  const isChanged = !dir && changedPaths.has(childRel(rel, entry.name));
26899
27439
  const isHotDir = dir && changedDirs.has(childRel(rel, entry.name));
26900
- $$renderer.push(`<li role="treeitem" aria-selected="false"${attr("aria-expanded", dir ? isOpen : void 0)} class="row-line svelte-hbtlo6">`);
27440
+ const isActive = activeFile !== null && activeFile === child;
27441
+ $$renderer.push(`<li role="treeitem"${attr("aria-selected", isActive)}${attr("aria-expanded", dir ? isOpen : void 0)}${attr_class("row-line svelte-hbtlo6", void 0, { "active": isActive })}>`);
26901
27442
  if (dir) {
26902
27443
  $$renderer.push("<!--[0-->");
26903
27444
  $$renderer.push(`<button${attr_class("row dir svelte-hbtlo6", void 0, {
@@ -26971,7 +27512,7 @@ function WorkspaceExplorerTree($$renderer, $$props) {
26971
27512
  } else $$renderer.push("<!--[-1-->");
26972
27513
  $$renderer.push(`<!--]--></li>`);
26973
27514
  }
26974
- $$renderer.push(`<ul data-svelte="WorkspaceExplorerTree" class="tree svelte-hbtlo6" role="tree"${attr("aria-label", workspacePanelCopy.explorer.title + ": " + root)}><!--[-->`);
27515
+ $$renderer.push(`<ul data-svelte="WorkspaceExplorerTree" class="tree svelte-hbtlo6" role="tree"${attr("aria-label", workspacePanelCopy.explorer.title + ": " + root)}${attr("data-active-file", activeFile ?? "")}><!--[-->`);
26975
27516
  const each_array_1 = ensure_array_like(sorted(levels[""]?.kind === "ready" ? levels[""].entries : []));
26976
27517
  for (let $$index = 0, $$length = each_array_1.length; $$index < $$length; $$index++) {
26977
27518
  let entry = each_array_1[$$index];
@@ -27096,7 +27637,7 @@ function WorkspaceExplorer($$renderer, $$props) {
27096
27637
  * never scroll itself; the scroll lives on .tree-scroll so the toolbar
27097
27638
  * stays pinned (the toolbar-scrolls-away bug).
27098
27639
  */
27099
- let { root, activeTab, levels, expanded, repoMaps, changedPaths, changedDirs, changesRepos, changesStatuses, collapsedRepos} = $$props;
27640
+ let { root, activeTab, levels, expanded, repoMaps, changedPaths, changedDirs, activeFile = null, changesRepos, changesStatuses, collapsedRepos} = $$props;
27100
27641
  $$renderer.push(`<div data-svelte="WorkspaceExplorer" class="explorer svelte-1l3v1je">`);
27101
27642
  WorkspaceExplorerToolbar($$renderer, {
27102
27643
  activeTab});
@@ -27119,7 +27660,9 @@ function WorkspaceExplorer($$renderer, $$props) {
27119
27660
  expanded,
27120
27661
  repoMaps,
27121
27662
  changedPaths,
27122
- changedDirs});
27663
+ changedDirs,
27664
+ activeFile
27665
+ });
27123
27666
  $$renderer.push(`<!----></div>`);
27124
27667
  }
27125
27668
  $$renderer.push(`<!--]--></div>`);
@@ -27917,6 +28460,7 @@ function WorkspaceExplorerPanel($$renderer, $$props) {
27917
28460
  const splitPct = derived(() => clampTreePct(treePct));
27918
28461
  $$renderer.push(`<div data-svelte="WorkspaceExplorerPanel" data-testid="workspace-explorer" class="split svelte-v4uero"${attr_style(`--tree-basis: ${stringify(splitPct())}%; --file-basis: ${stringify(100 - splitPct())}%`)}>`);
27919
28462
  WorkspaceExplorer($$renderer, {
28463
+ activeFile,
27920
28464
  root,
27921
28465
  activeTab: activeTab(),
27922
28466
  levels,
@@ -28666,6 +29210,24 @@ function _page($$renderer, $$props) {
28666
29210
  const host = sessionWorkspaceExplorer(sessionId);
28667
29211
  if (host) publishFileIntent(host.id, path);
28668
29212
  }
29213
+ /** File Link Intent (ADR 2026-09-25 D3): a transcript file link publishes
29214
+ * ONLY after the tree route proves the file exists inside the session's
29215
+ * workspace — the gate lives in the shared util; anything else drops the
29216
+ * click. No navigation ever happens. */
29217
+ async function openFileLinkFromMarkdown(sessionId, rawHref) {
29218
+ const path = normalizeFileLinkPath(rawHref);
29219
+ console.log("[FLINK] click", sessionId, rawHref, "->", path);
29220
+ if (path === null) return;
29221
+ const exists = await workspaceFileExists(sessionId, path);
29222
+ console.log("[FLINK] exists:", exists);
29223
+ if (!exists) return;
29224
+ if (!sessionWorkspaceExplorer(sessionId)) {
29225
+ const root = panelWorkspaceFor(sessionId);
29226
+ if (!root) return;
29227
+ openWorkspaceExplorer(sessionId, root);
29228
+ }
29229
+ openWorkspaceFile(sessionId, path);
29230
+ }
28669
29231
  const seedData = page.data;
28670
29232
  const seedCold = seedData && typeof seedData.sessionId === "string" && Array.isArray(seedData.entries) ? {
28671
29233
  title: seedData.title ?? null,
@@ -29097,6 +29659,7 @@ function _page($$renderer, $$props) {
29097
29659
  ConversationPanel($$renderer, {
29098
29660
  panelId: floorPanelId,
29099
29661
  sessionId: p.sessionId,
29662
+ onFileLink: (href) => void openFileLinkFromMarkdown(p.sessionId, href),
29100
29663
  title: panelTitleFor(p.sessionId),
29101
29664
  workspace: panelWorkspaceFor(p.sessionId),
29102
29665
  workspaces: spineWorkspaces(),
@@ -29129,6 +29692,7 @@ function _page($$renderer, $$props) {
29129
29692
  ConversationPanel($$renderer, {
29130
29693
  panelId: floorPanelId,
29131
29694
  sessionId: p.sessionId,
29695
+ onFileLink: (href) => void openFileLinkFromMarkdown(p.sessionId, href),
29132
29696
  title: panelTitleFor(p.sessionId),
29133
29697
  workspace: panelWorkspaceFor(p.sessionId),
29134
29698
  workspaces: spineWorkspaces(),
@@ -29245,4 +29809,4 @@ function _page($$renderer, $$props) {
29245
29809
  }
29246
29810
 
29247
29811
  export { _page as default };
29248
- //# sourceMappingURL=_page.svelte.js-D-nbMlOD.js.map
29812
+ //# sourceMappingURL=_page.svelte.js-Bk7bKW1n.js.map