@deepseek-insight/dsi 0.8.2 → 0.8.4

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 (62) hide show
  1. package/build/client/_app/immutable/assets/0.cswkTiBk.css +2 -0
  2. package/build/client/_app/immutable/chunks/C7Sg_49n.js +1 -0
  3. package/build/client/_app/immutable/chunks/{CAoCg_fG.js → CnzmIbjr.js} +1 -1
  4. package/build/client/_app/immutable/chunks/DY0MQ1mO.js +1 -0
  5. package/build/client/_app/immutable/chunks/GKkjunMm.js +2 -0
  6. package/build/client/_app/immutable/entry/{app.DIq2Q3OX.js → app.DYNedUxy.js} +2 -2
  7. package/build/client/_app/immutable/entry/start.BzyrBssE.js +1 -0
  8. package/build/client/_app/immutable/nodes/{1.DKIIO5Pq.js → 1.CHB5qqQ9.js} +1 -1
  9. package/build/client/_app/immutable/nodes/{2.CpOJSq6u.js → 2.C6No1310.js} +222 -222
  10. package/build/client/_app/version.json +1 -1
  11. package/build/handler.js +4 -4
  12. package/build/index.js +4 -4
  13. package/build/server/chunks/chunks/{dsh-events.js-CGuF_had.js → dsh-events.js-BUkLR6ZV.js} +13 -1
  14. package/build/server/chunks/chunks/{git-probe.js-Cn_ugqcH.js → git-probe.js-CLF37SRh.js} +2 -2
  15. package/build/server/chunks/chunks/{internal2.js-DFG0wDsP.js → internal2.js-J3h-US64.js} +2 -2
  16. package/build/server/chunks/chunks/registry.js-CZNJZ0C-.js +1003 -0
  17. package/build/server/chunks/chunks/{state.js-Dki_Bq11.js → state.js-8RBD56dL.js} +2 -2
  18. package/build/server/chunks/chunks/{watcher.js-f54CFvdI.js → watcher.js-BVKnoQUw.js} +2 -2
  19. package/build/server/chunks/entries/endpoints/api/a2a/{_server.ts.js-DN0zl7cz.js → _server.ts.js-3kQCQuHT.js} +3 -3
  20. package/build/server/chunks/entries/endpoints/api/a2a/register/{_server.ts.js-C3byr74D.js → _server.ts.js-BUBTCLFn.js} +3 -3
  21. package/build/server/chunks/entries/endpoints/api/browser/_id_/activate/_server.ts.js-BdMJzENm.js +45 -0
  22. package/build/server/chunks/entries/endpoints/api/browser/_id_/close/{_server.ts.js-BKChU9D7.js → _server.ts.js-B5z9-N8Y.js} +2 -2
  23. package/build/server/chunks/entries/endpoints/api/browser/_id_/closetab/_server.ts.js-CnZHun5r.js +44 -0
  24. package/build/server/chunks/entries/endpoints/api/browser/_id_/element/_server.ts.js-C1oM2Ihf.js +43 -0
  25. package/build/server/chunks/entries/endpoints/api/browser/_id_/input/{_server.ts.js-CUFYX5kg.js → _server.ts.js-DmbqGRMg.js} +5 -4
  26. package/build/server/chunks/entries/endpoints/api/browser/_id_/mcp/{_server.ts.js-fg2eb_ZY.js → _server.ts.js-Cj80T1yH.js} +2 -2
  27. package/build/server/chunks/entries/endpoints/api/browser/_id_/navigate/{_server.ts.js-Dt1n31IP.js → _server.ts.js-6gi1UYTJ.js} +11 -7
  28. package/build/server/chunks/entries/endpoints/api/browser/_id_/opentab/_server.ts.js-Bhx_J7ot.js +47 -0
  29. package/build/server/chunks/entries/endpoints/api/browser/_id_/page/{_server.ts.js-DIF8juwJ.js → _server.ts.js-DvQXNnX9.js} +4 -3
  30. package/build/server/chunks/entries/endpoints/api/browser/_id_/stream/{_server.ts.js-BFdXJdhd.js → _server.ts.js-MflkVWUn.js} +2 -2
  31. package/build/server/chunks/entries/endpoints/api/browser/_id_/tabs/_server.ts.js-CoUSlLcP.js +34 -0
  32. package/build/server/chunks/entries/endpoints/api/browser/_id_/viewport/{_server.ts.js-BIF_7OHe.js → _server.ts.js-DNk4EgjJ.js} +6 -4
  33. package/build/server/chunks/entries/endpoints/api/browser/{_server.ts.js-B7yjEF1N.js → _server.ts.js-CECKap7O.js} +14 -4
  34. package/build/server/chunks/entries/endpoints/api/dsh/session/_sessionId_/events/{_server.ts.js-lBsxHSo6.js → _server.ts.js-BzP30TXW.js} +2 -2
  35. package/build/server/chunks/entries/endpoints/api/dsh/session/_sessionId_/history/{_server.ts.js-BrEgFdCF.js → _server.ts.js-B7YRQhuJ.js} +2 -2
  36. package/build/server/chunks/entries/endpoints/api/workspace/file-write/{_server.ts.js-BRhlbYEe.js → _server.ts.js-B-5YihUA.js} +3 -3
  37. package/build/server/chunks/entries/endpoints/api/workspace/git-events/{_server.ts.js-B9YI66ZL.js → _server.ts.js-DT5jRZFE.js} +3 -3
  38. package/build/server/chunks/entries/endpoints/api/workspace/git-file-head/{_server.ts.js-DSvXRZQL.js → _server.ts.js-DtW-utrd.js} +3 -3
  39. package/build/server/chunks/entries/endpoints/api/workspace/git-map/{_server.ts.js-8A0skdlM.js → _server.ts.js-8AIAo9jX.js} +3 -3
  40. package/build/server/chunks/entries/endpoints/api/workspace/git-status/{_server.ts.js-Bc6J3t3m.js → _server.ts.js-CMw96vjY.js} +3 -3
  41. package/build/server/chunks/entries/endpoints/api/workspace/write-gate/{_server.ts.js-CfL8Por5.js → _server.ts.js-DKufa14_.js} +3 -3
  42. package/build/server/chunks/entries/pages/{_error.svelte.js-EnDLC3Jj.js → _error.svelte.js-DRPduJdP.js} +3 -3
  43. package/build/server/chunks/entries/pages/{_page.server.ts.js-ar1DbW1v.js → _page.server.ts.js-7x6ZfGoB.js} +2 -2
  44. package/build/server/chunks/entries/pages/{_page.svelte.js-CQUo8VGL.js → _page.svelte.js-Dek8Q1_v.js} +430 -101
  45. package/build/server/chunks/{handler-BBp0LoYK.js → handler-DUyvzXsb.js} +3 -3
  46. package/build/server/chunks/{index.js-S4257Wcs.js → index.js-BrP1SRzN.js} +2 -2
  47. package/build/server/chunks/{manifest.js-DajiWH1H.js → manifest.js-C4z6aoYx.js} +58 -23
  48. package/build/server/chunks/nodes/{0.js-DtkNHIFx.js → 0.js-BuB3t8Br.js} +3 -3
  49. package/build/server/chunks/nodes/1.js-CW4V8ni8.js +9 -0
  50. package/build/server/chunks/nodes/{2.js-BORDEffk.js → 2.js-C-o9KF10.js} +5 -5
  51. package/package.json +2 -7
  52. package/template/.dsi/prompts.sqlite-shm +0 -0
  53. package/template/.dsi/prompts.sqlite-wal +0 -0
  54. package/template/.dsi/settings.yaml +2 -2
  55. package/build/client/_app/immutable/assets/0.DBVVEjy9.css +0 -2
  56. package/build/client/_app/immutable/chunks/BHodvdRc.js +0 -1
  57. package/build/client/_app/immutable/chunks/D-jXFTzB.js +0 -1
  58. package/build/client/_app/immutable/chunks/TTdBFs3C.js +0 -2
  59. package/build/client/_app/immutable/entry/start.E6P3Z7tx.js +0 -1
  60. package/build/server/chunks/chunks/registry.js-BC-TNdmn.js +0 -616
  61. package/build/server/chunks/nodes/1.js-OAvYMTzU.js +0 -9
  62. /package/build/client/_app/immutable/nodes/{0.Dm_ry-Pr.js → 0.DQYP6BCS.js} +0 -0
@@ -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-BM4WbMFB.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-Dki_Bq11.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-8RBD56dL.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-DFG0wDsP.js';
24
+ import '../../chunks/internal2.js-J3h-US64.js';
25
25
  import '../../chunks/utils.js-CAdNO8Tu.js';
26
26
 
27
27
  //#region src/lib/paraglide/messages/abort.js
@@ -984,6 +984,166 @@ var browserclosedelete2 = ((inputs = {}, options = {}) => {
984
984
  return en_browserclosedelete2();
985
985
  });
986
986
  //#endregion
987
+ //#region src/lib/paraglide/messages/browserctxcopyimage3.js
988
+ /** @typedef {import('../runtime.js').LocalizedString} LocalizedString */
989
+ /** @typedef {{}} Browserctxcopyimage3Inputs */
990
+ var en_browserctxcopyimage3 = () => {
991
+ return `Copy image address`;
992
+ };
993
+ var zh_browserctxcopyimage3 = () => {
994
+ return `复制图片地址`;
995
+ };
996
+ var id_browserctxcopyimage3 = () => {
997
+ return `Salin alamat gambar`;
998
+ };
999
+ var es_browserctxcopyimage3 = () => {
1000
+ return `Copiar la dirección de la imagen`;
1001
+ };
1002
+ /**
1003
+ * | output |
1004
+ * | --- |
1005
+ * | "Copy image address" |
1006
+ *
1007
+ * @param {Browserctxcopyimage3Inputs} inputs
1008
+ * @param {{ locale?: "en" | "zh" | "id" | "es" }} options
1009
+ * @returns {LocalizedString}
1010
+ */
1011
+ var browserctxcopyimage3 = ((inputs = {}, options = {}) => {
1012
+ const locale = options.locale ?? getLocale();
1013
+ if (locale === "zh") return zh_browserctxcopyimage3();
1014
+ if (locale === "id") return id_browserctxcopyimage3();
1015
+ if (locale === "es") return es_browserctxcopyimage3();
1016
+ return en_browserctxcopyimage3();
1017
+ });
1018
+ //#endregion
1019
+ //#region src/lib/paraglide/messages/browserctxcopylink3.js
1020
+ /** @typedef {import('../runtime.js').LocalizedString} LocalizedString */
1021
+ /** @typedef {{}} Browserctxcopylink3Inputs */
1022
+ var en_browserctxcopylink3 = () => {
1023
+ return `Copy link address`;
1024
+ };
1025
+ var zh_browserctxcopylink3 = () => {
1026
+ return `复制链接地址`;
1027
+ };
1028
+ var id_browserctxcopylink3 = () => {
1029
+ return `Salin alamat tautan`;
1030
+ };
1031
+ var es_browserctxcopylink3 = () => {
1032
+ return `Copiar la dirección del enlace`;
1033
+ };
1034
+ /**
1035
+ * | output |
1036
+ * | --- |
1037
+ * | "Copy link address" |
1038
+ *
1039
+ * @param {Browserctxcopylink3Inputs} inputs
1040
+ * @param {{ locale?: "en" | "zh" | "id" | "es" }} options
1041
+ * @returns {LocalizedString}
1042
+ */
1043
+ var browserctxcopylink3 = ((inputs = {}, options = {}) => {
1044
+ const locale = options.locale ?? getLocale();
1045
+ if (locale === "zh") return zh_browserctxcopylink3();
1046
+ if (locale === "id") return id_browserctxcopylink3();
1047
+ if (locale === "es") return es_browserctxcopylink3();
1048
+ return en_browserctxcopylink3();
1049
+ });
1050
+ //#endregion
1051
+ //#region src/lib/paraglide/messages/browserctxopenimage3.js
1052
+ /** @typedef {import('../runtime.js').LocalizedString} LocalizedString */
1053
+ /** @typedef {{}} Browserctxopenimage3Inputs */
1054
+ var en_browserctxopenimage3 = () => {
1055
+ return `Open image in new tab`;
1056
+ };
1057
+ var zh_browserctxopenimage3 = () => {
1058
+ return `在新标签页中打开图片`;
1059
+ };
1060
+ var id_browserctxopenimage3 = () => {
1061
+ return `Buka gambar di tab baru`;
1062
+ };
1063
+ var es_browserctxopenimage3 = () => {
1064
+ return `Abrir imagen en una pestaña nueva`;
1065
+ };
1066
+ /**
1067
+ * | output |
1068
+ * | --- |
1069
+ * | "Open image in new tab" |
1070
+ *
1071
+ * @param {Browserctxopenimage3Inputs} inputs
1072
+ * @param {{ locale?: "en" | "zh" | "id" | "es" }} options
1073
+ * @returns {LocalizedString}
1074
+ */
1075
+ var browserctxopenimage3 = ((inputs = {}, options = {}) => {
1076
+ const locale = options.locale ?? getLocale();
1077
+ if (locale === "zh") return zh_browserctxopenimage3();
1078
+ if (locale === "id") return id_browserctxopenimage3();
1079
+ if (locale === "es") return es_browserctxopenimage3();
1080
+ return en_browserctxopenimage3();
1081
+ });
1082
+ //#endregion
1083
+ //#region src/lib/paraglide/messages/browserctxopenlink3.js
1084
+ /** @typedef {import('../runtime.js').LocalizedString} LocalizedString */
1085
+ /** @typedef {{}} Browserctxopenlink3Inputs */
1086
+ var en_browserctxopenlink3 = () => {
1087
+ return `Open link in new tab`;
1088
+ };
1089
+ var zh_browserctxopenlink3 = () => {
1090
+ return `在新标签页中打开链接`;
1091
+ };
1092
+ var id_browserctxopenlink3 = () => {
1093
+ return `Buka tautan di tab baru`;
1094
+ };
1095
+ var es_browserctxopenlink3 = () => {
1096
+ return `Abrir enlace en una pestaña nueva`;
1097
+ };
1098
+ /**
1099
+ * | output |
1100
+ * | --- |
1101
+ * | "Open link in new tab" |
1102
+ *
1103
+ * @param {Browserctxopenlink3Inputs} inputs
1104
+ * @param {{ locale?: "en" | "zh" | "id" | "es" }} options
1105
+ * @returns {LocalizedString}
1106
+ */
1107
+ var browserctxopenlink3 = ((inputs = {}, options = {}) => {
1108
+ const locale = options.locale ?? getLocale();
1109
+ if (locale === "zh") return zh_browserctxopenlink3();
1110
+ if (locale === "id") return id_browserctxopenlink3();
1111
+ if (locale === "es") return es_browserctxopenlink3();
1112
+ return en_browserctxopenlink3();
1113
+ });
1114
+ //#endregion
1115
+ //#region src/lib/paraglide/messages/browserctxsendrightclick4.js
1116
+ /** @typedef {import('../runtime.js').LocalizedString} LocalizedString */
1117
+ /** @typedef {{}} Browserctxsendrightclick4Inputs */
1118
+ var en_browserctxsendrightclick4 = () => {
1119
+ return `Send right-click to the page`;
1120
+ };
1121
+ var zh_browserctxsendrightclick4 = () => {
1122
+ return `向页面发送右键点击`;
1123
+ };
1124
+ var id_browserctxsendrightclick4 = () => {
1125
+ return `Kirim klik kanan ke halaman`;
1126
+ };
1127
+ var es_browserctxsendrightclick4 = () => {
1128
+ return `Enviar clic derecho a la página`;
1129
+ };
1130
+ /**
1131
+ * | output |
1132
+ * | --- |
1133
+ * | "Send right-click to the page" |
1134
+ *
1135
+ * @param {Browserctxsendrightclick4Inputs} inputs
1136
+ * @param {{ locale?: "en" | "zh" | "id" | "es" }} options
1137
+ * @returns {LocalizedString}
1138
+ */
1139
+ var browserctxsendrightclick4 = ((inputs = {}, options = {}) => {
1140
+ const locale = options.locale ?? getLocale();
1141
+ if (locale === "zh") return zh_browserctxsendrightclick4();
1142
+ if (locale === "id") return id_browserctxsendrightclick4();
1143
+ if (locale === "es") return es_browserctxsendrightclick4();
1144
+ return en_browserctxsendrightclick4();
1145
+ });
1146
+ //#endregion
987
1147
  //#region src/lib/paraglide/messages/browserforward1.js
988
1148
  /** @typedef {import('../runtime.js').LocalizedString} LocalizedString */
989
1149
  /** @typedef {{}} Browserforward1Inputs */
@@ -1176,6 +1336,38 @@ var browsersessionfailed2 = ((inputs, options = {}) => {
1176
1336
  return en_browsersessionfailed2(inputs);
1177
1337
  });
1178
1338
  //#endregion
1339
+ //#region src/lib/paraglide/messages/browsertabclosetitle3.js
1340
+ /** @typedef {import('../runtime.js').LocalizedString} LocalizedString */
1341
+ /** @typedef {{}} Browsertabclosetitle3Inputs */
1342
+ var en_browsertabclosetitle3 = () => {
1343
+ return `Close tab`;
1344
+ };
1345
+ var zh_browsertabclosetitle3 = () => {
1346
+ return `关闭标签页`;
1347
+ };
1348
+ var id_browsertabclosetitle3 = () => {
1349
+ return `Tutup tab`;
1350
+ };
1351
+ var es_browsertabclosetitle3 = () => {
1352
+ return `Cerrar pestaña`;
1353
+ };
1354
+ /**
1355
+ * | output |
1356
+ * | --- |
1357
+ * | "Close tab" |
1358
+ *
1359
+ * @param {Browsertabclosetitle3Inputs} inputs
1360
+ * @param {{ locale?: "en" | "zh" | "id" | "es" }} options
1361
+ * @returns {LocalizedString}
1362
+ */
1363
+ var browsertabclosetitle3 = ((inputs = {}, options = {}) => {
1364
+ const locale = options.locale ?? getLocale();
1365
+ if (locale === "zh") return zh_browsertabclosetitle3();
1366
+ if (locale === "id") return id_browsertabclosetitle3();
1367
+ if (locale === "es") return es_browsertabclosetitle3();
1368
+ return en_browsertabclosetitle3();
1369
+ });
1370
+ //#endregion
1179
1371
  //#region src/lib/paraglide/messages/browserurlplaceholder2.js
1180
1372
  /** @typedef {import('../runtime.js').LocalizedString} LocalizedString */
1181
1373
  /** @typedef {{}} Browserurlplaceholder2Inputs */
@@ -14873,12 +15065,18 @@ var _index_exports = /* @__PURE__ */ __exportAll({
14873
15065
  browserBack: () => browserback1,
14874
15066
  browserChipLabel: () => browserchiplabel2,
14875
15067
  browserCloseDelete: () => browserclosedelete2,
15068
+ browserCtxCopyImage: () => browserctxcopyimage3,
15069
+ browserCtxCopyLink: () => browserctxcopylink3,
15070
+ browserCtxOpenImage: () => browserctxopenimage3,
15071
+ browserCtxOpenLink: () => browserctxopenlink3,
15072
+ browserCtxSendRightClick: () => browserctxsendrightclick4,
14876
15073
  browserForward: () => browserforward1,
14877
15074
  browserLaunching: () => browserlaunching1,
14878
15075
  browserOpenTitle: () => browseropentitle2,
14879
15076
  browserPanelTitle: () => browserpaneltitle2,
14880
15077
  browserReload: () => browserreload1,
14881
15078
  browserSessionFailed: () => browsersessionfailed2,
15079
+ browserTabCloseTitle: () => browsertabclosetitle3,
14882
15080
  browserUrlPlaceholder: () => browserurlplaceholder2,
14883
15081
  browserWaitingFrames: () => browserwaitingframes2,
14884
15082
  cacheHit: () => cachehit1,
@@ -15345,12 +15543,18 @@ var messages_exports = /* @__PURE__ */ __exportAll({
15345
15543
  browserBack: () => browserback1,
15346
15544
  browserChipLabel: () => browserchiplabel2,
15347
15545
  browserCloseDelete: () => browserclosedelete2,
15546
+ browserCtxCopyImage: () => browserctxcopyimage3,
15547
+ browserCtxCopyLink: () => browserctxcopylink3,
15548
+ browserCtxOpenImage: () => browserctxopenimage3,
15549
+ browserCtxOpenLink: () => browserctxopenlink3,
15550
+ browserCtxSendRightClick: () => browserctxsendrightclick4,
15348
15551
  browserForward: () => browserforward1,
15349
15552
  browserLaunching: () => browserlaunching1,
15350
15553
  browserOpenTitle: () => browseropentitle2,
15351
15554
  browserPanelTitle: () => browserpaneltitle2,
15352
15555
  browserReload: () => browserreload1,
15353
15556
  browserSessionFailed: () => browsersessionfailed2,
15557
+ browserTabCloseTitle: () => browsertabclosetitle3,
15354
15558
  browserUrlPlaceholder: () => browserurlplaceholder2,
15355
15559
  browserWaitingFrames: () => browserwaitingframes2,
15356
15560
  cacheHit: () => cachehit1,
@@ -17619,8 +17823,8 @@ function ThemeToggle($$renderer, $$props) {
17619
17823
  }
17620
17824
  //#endregion
17621
17825
  //#region package.json
17622
- var version = "0.8.2";
17623
- var dsh = { "webVersion": "0.2.1-rc.2" };
17826
+ var version = "0.8.4";
17827
+ var dsh = { "webVersion": "0.2.1-rc.3" };
17624
17828
  //#endregion
17625
17829
  //#region src/lib/version.ts
17626
17830
  /**
@@ -26429,6 +26633,14 @@ function groupTurns(entries) {
26429
26633
  continue;
26430
26634
  }
26431
26635
  if (entry.kind === "turn-lifecycle") continue;
26636
+ if (entry.kind === "developer-message") {
26637
+ groups.push({
26638
+ kind: "developer",
26639
+ key: entry.id,
26640
+ entry
26641
+ });
26642
+ continue;
26643
+ }
26432
26644
  const side = entry;
26433
26645
  const last = groups[groups.length - 1];
26434
26646
  if (last?.kind === "assistant-turn") last.entries.push(side);
@@ -30458,8 +30670,11 @@ function ConversationScrollArea($$renderer, $$props) {
30458
30670
  open: openChipId === group.entry.id});
30459
30671
  $$renderer.push(`<!----></div>`);
30460
30672
  }});
30461
- } else if (group.kind === "prompt" || group.kind === "context") {
30673
+ } else if (group.kind === "developer") {
30462
30674
  $$renderer.push("<!--[1-->");
30675
+ $$renderer.push(`<div data-testid="developer-message-row"${attr("data-seq", group.entry.seq)} class="mx-auto max-w-2xl rounded-md border border-text-muted/20 bg-surface0/5 px-3 py-1.5 text-xs text-text-muted"><span class="mr-1.5 font-medium uppercase tracking-wide opacity-70">developer</span> <span data-testid="developer-message-text">${escape_html(group.entry.text)}</span></div>`);
30676
+ } else if (group.kind === "prompt" || group.kind === "context") {
30677
+ $$renderer.push("<!--[2-->");
30463
30678
  PromptBubble($$renderer, {
30464
30679
  text: group.kind === "prompt" ? group.entry.text : void 0,
30465
30680
  time: group.kind === "prompt" ? group.entry.time : group.entries[0]?.time,
@@ -32949,13 +33164,28 @@ function BrowserHeader($$renderer, $$props) {
32949
33164
  //#region src/lib/components/browser/BrowserContent.svelte
32950
33165
  function BrowserContent($$renderer, $$props) {
32951
33166
  $$renderer.component(($$renderer) => {
32952
- let { status, failReason = null, wrap = null, canvas = null, ondown, onup, onmove, onwheel, onkey } = $$props;
33167
+ let { status, failReason = null, wrap = null, canvas = null, ondown, onup, onmove, onwheel, onkey, oncontextmenu, ctxMenu = null, onctxaction, onctxclose } = $$props;
32953
33168
  if (status === "failed") {
32954
33169
  $$renderer.push("<!--[0-->");
32955
33170
  $$renderer.push(`<div data-svelte="BrowserContent" class="p-3 text-xs text-red-500" data-testid="browser-failed">${escape_html(browsersessionfailed2({ reason: failReason ?? "" }))}</div>`);
32956
33171
  } else {
32957
33172
  $$renderer.push("<!--[-1-->");
32958
33173
  $$renderer.push(`<div data-svelte="BrowserContent" class="relative min-h-0 flex-1 overflow-hidden" data-testid="browser-glass"><canvas class="h-full w-full object-contain" tabindex="0"></canvas> `);
33174
+ if (ctxMenu) {
33175
+ $$renderer.push("<!--[0-->");
33176
+ $$renderer.push(`<div class="absolute z-50 min-w-44 rounded-md border border-zinc-700 bg-white py-1 text-xs shadow-xl"${attr_style(`left:${stringify(ctxMenu.px)}px; top:${stringify(ctxMenu.py)}px`)} data-testid="browser-ctxmenu">`);
33177
+ if (ctxMenu.src) {
33178
+ $$renderer.push("<!--[0-->");
33179
+ $$renderer.push(`<button type="button" class="block w-full px-3 py-1.5 text-left text-zinc-900 hover:bg-zinc-200" data-testid="browser-ctxmenu-item">${escape_html(browserctxopenimage3())}</button> <button type="button" class="block w-full px-3 py-1.5 text-left text-zinc-900 hover:bg-zinc-200" data-testid="browser-ctxmenu-item">${escape_html(browserctxcopyimage3())}</button>`);
33180
+ } else $$renderer.push("<!--[-1-->");
33181
+ $$renderer.push(`<!--]--> `);
33182
+ if (ctxMenu.href) {
33183
+ $$renderer.push("<!--[0-->");
33184
+ $$renderer.push(`<button type="button" class="block w-full px-3 py-1.5 text-left text-zinc-900 hover:bg-zinc-200" data-testid="browser-ctxmenu-item">${escape_html(browserctxopenlink3())}</button> <button type="button" class="block w-full px-3 py-1.5 text-left text-zinc-900 hover:bg-zinc-200" data-testid="browser-ctxmenu-item">${escape_html(browserctxcopylink3())}</button>`);
33185
+ } else $$renderer.push("<!--[-1-->");
33186
+ $$renderer.push(`<!--]--> <button type="button" class="block w-full px-3 py-1.5 text-left text-zinc-900 hover:bg-zinc-200" data-testid="browser-ctxmenu-item">${escape_html(browserreload1())}</button> <div class="my-1 border-t border-zinc-300"></div> <button type="button" class="block w-full px-3 py-1.5 text-left text-zinc-900 hover:bg-zinc-200" data-testid="browser-ctxmenu-item">${escape_html(browserctxsendrightclick4())}</button></div>`);
33187
+ } else $$renderer.push("<!--[-1-->");
33188
+ $$renderer.push(`<!--]--> `);
32959
33189
  if (status !== "live") {
32960
33190
  $$renderer.push("<!--[0-->");
32961
33191
  $$renderer.push(`<div class="absolute inset-0 grid place-items-center text-xs opacity-60" data-testid="browser-placeholder">${escape_html(status === "opening" ? browserlaunching1() : browserwaitingframes2())}</div>`);
@@ -32970,6 +33200,20 @@ function BrowserContent($$renderer, $$props) {
32970
33200
  });
32971
33201
  }
32972
33202
  //#endregion
33203
+ //#region src/lib/components/browser/BrowserTab.svelte
33204
+ function BrowserTab($$renderer, $$props) {
33205
+ $$renderer.component(($$renderer) => {
33206
+ let { tab, disabled = false} = $$props;
33207
+ $$renderer.push(`<div data-svelte="BrowserTab" class="relative shrink-0"><button type="button"${attr_class("w-32 truncate rounded px-1.5 py-0.5 pr-4 text-left whitespace-nowrap", void 0, {
33208
+ "bg-blue-200": tab.active,
33209
+ "text-blue-900": tab.active,
33210
+ "text-zinc-600": !tab.active,
33211
+ "hover:bg-zinc-100": !tab.active,
33212
+ "font-medium": tab.active
33213
+ })}${attr("disabled", disabled || tab.active, true)} data-testid="browser-tab"${attr("data-active", tab.active)}${attr("title", tab.url)}>${escape_html(tab.title || tab.url || "tab")}</button> <button type="button" class="absolute right-0.5 top-1/2 -translate-y-1/2 rounded text-[10px] leading-none text-red-500 hover:bg-red-500 hover:text-white"${attr("title", browsertabclosetitle3())} data-testid="browser-tab-close">✕</button></div>`);
33214
+ });
33215
+ }
33216
+ //#endregion
32973
33217
  //#region src/lib/components/browser/mirror-input.ts
32974
33218
  /** The on-screen rect of the PAGE image inside its wrapper. The frame is
32975
33219
  * drawn aspect-true (canvas object-contain): when the frame is wider or
@@ -33013,6 +33257,99 @@ function createMoveCoalescer(raf, fire) {
33013
33257
  } };
33014
33258
  }
33015
33259
  //#endregion
33260
+ //#region src/lib/utils/sidebar-prefs.ts
33261
+ /**
33262
+ * Sidebar preferences — persisted layout state for the conversation page's
33263
+ * app sidebar (OCI ControlRail pattern, 2026-08-23).
33264
+ *
33265
+ * Pure localStorage round-trip: SSR-safe (no localStorage → defaults), junk
33266
+ * payloads and out-of-range widths fall back instead of throwing into the
33267
+ * page, and writes are best-effort (a full or blocked store must not break
33268
+ * the layout — it only loses persistence for that session).
33269
+ *
33270
+ * Workspace profiles (storage-profile.ts): `?profile=widi` moves the key
33271
+ * to `dsi-sidebar_widi` — each desk remembers its own rail layout.
33272
+ */
33273
+ /** localStorage base key — one JSON blob `{ collapsed, width }`. */
33274
+ var STORAGE_KEY = "dsi-sidebar";
33275
+ /** The single width bound site — load-side sanitizing and drag clamping
33276
+ * both route through here so the bounds exist in exactly one place.
33277
+ * Bounds read the config store (layout load has landed them before any
33278
+ * mount; constants are the fallback defaults). */
33279
+ function clampSidebarWidth(width) {
33280
+ const { minWidth, maxWidth } = appConfig().sidebar;
33281
+ return Math.max(minWidth, Math.min(maxWidth, width));
33282
+ }
33283
+ /** Config-driven default width (clamped through the single bound site). */
33284
+ function defaultSidebarWidth() {
33285
+ return clampSidebarWidth(appConfig().sidebar.defaultWidth);
33286
+ }
33287
+ /** Persisted defaults when nothing (usable) is stored. */
33288
+ function defaultSidebarPrefs() {
33289
+ return {
33290
+ collapsed: false,
33291
+ width: defaultSidebarWidth()
33292
+ };
33293
+ }
33294
+ /**
33295
+ * Read prefs from localStorage.
33296
+ * @param profile sanitized workspace profile (null/omitted = default desk).
33297
+ * @returns stored prefs when parseable, defaults when absent, junk, or SSR.
33298
+ */
33299
+ function loadSidebarPrefs(profile) {
33300
+ if (typeof localStorage === "undefined") return defaultSidebarPrefs();
33301
+ try {
33302
+ const raw = localStorage.getItem(dsiKey(STORAGE_KEY, profile));
33303
+ if (!raw) return defaultSidebarPrefs();
33304
+ const parsed = JSON.parse(raw);
33305
+ if (parsed === null || typeof parsed !== "object") return defaultSidebarPrefs();
33306
+ return {
33307
+ collapsed: parsed.collapsed === true,
33308
+ width: clampSidebarWidth(typeof parsed.width === "number" && Number.isFinite(parsed.width) ? parsed.width : defaultSidebarWidth())
33309
+ };
33310
+ } catch {
33311
+ return defaultSidebarPrefs();
33312
+ }
33313
+ }
33314
+ //#endregion
33315
+ //#region src/lib/services/workspace/page-prefs.svelte.ts
33316
+ var PagePrefs = class {
33317
+ /** Width preset for the next conversation panel (clamped). */
33318
+ panelWidth = 0;
33319
+ /** Floor zoom (clamped). */
33320
+ zoom = 1;
33321
+ /** Explorer Layout split (clamped). */
33322
+ treePct = 0;
33323
+ /** Sidebar rail state (OCI ControlRail port). */
33324
+ sidebarCollapsed = false;
33325
+ sidebarWidth = 0;
33326
+ #profile = null;
33327
+ #initialised = false;
33328
+ /** Seed every field from the persisted blobs — exactly once, BEFORE
33329
+ * the route reads any field (makePanel reads panelWidth during the
33330
+ * seed reset). Intentional initial capture per the route's old
33331
+ * "svelte-ignore state_referenced_locally" comments: prefs seed the
33332
+ * layout once; later writes go through the save effects. */
33333
+ init(profile) {
33334
+ this.#initialised = true;
33335
+ this.#profile = profile;
33336
+ const floor = loadPanelPrefs(profile);
33337
+ this.panelWidth = clampPanelWidth(floor.panelWidth);
33338
+ this.zoom = clampPanelZoom(floor.zoom);
33339
+ this.treePct = clampTreePct(floor.treePct);
33340
+ const sidebar = loadSidebarPrefs(profile);
33341
+ this.sidebarCollapsed = sidebar.collapsed;
33342
+ this.sidebarWidth = sidebar.width;
33343
+ }
33344
+ get profile() {
33345
+ return this.#profile;
33346
+ }
33347
+ /** Sidebar persistence (the route's old sidebar save effect). Call
33348
+ * during component initialisation — `$effect` needs an owner. */
33349
+ installSidebarAutoSave() {}
33350
+ };
33351
+ var pagePrefs = new PagePrefs();
33352
+ //#endregion
33016
33353
  //#region src/lib/components/browser/BrowserPanel.svelte
33017
33354
  function BrowserPanel($$renderer, $$props) {
33018
33355
  $$renderer.component(($$renderer) => {
@@ -33032,6 +33369,10 @@ function BrowserPanel($$renderer, $$props) {
33032
33369
  let proxyBusy = false;
33033
33370
  let canBack = false;
33034
33371
  let canForward = false;
33372
+ /** ADR-0040 D5: the tab strip — the registry's tab list mirrored here;
33373
+ * the SERVER stays the authority (activeTargetId), this is a view. */
33374
+ let tabs = [];
33375
+ let switching = false;
33035
33376
  const moves = createMoveCoalescer((cb) => requestAnimationFrame(cb), (x, y) => void post());
33036
33377
  async function post(input) {}
33037
33378
  function toViewportCx(e) {
@@ -33057,6 +33398,70 @@ function BrowserPanel($$renderer, $$props) {
33057
33398
  const p = toViewportCx(e);
33058
33399
  if (p) moves.push(p.x, p.y);
33059
33400
  }
33401
+ /** BUGFIX 2026-10-25 (operator: YouTube's right-click menu never appears
33402
+ * in the glass): only the LEFT button was dispatched. Right-click must
33403
+ * reach the page as a right mousePressed/Released pair — Chrome paints
33404
+ * its OWN context menu and the screencast mirrors it. preventDefault
33405
+ * stops the DSI page's menu from covering the glass. */
33406
+ /** BUGFIX 2026-10-25 round 2: Chrome's NATIVE right-click menu is browser
33407
+ * UI — it never renders in the page, so the screencast can never show it
33408
+ * (only in-page custom menus like YouTube's player menu can mirror). So
33409
+ * DSI supplies its OWN menu: what the right-click landed on comes from
33410
+ * the /element data pass; actions ride the wire (opentab/clipboard/the
33411
+ * page's own menu via a dispatched right-click). */
33412
+ let ctxMenu = null;
33413
+ let ctxPoint = null;
33414
+ function onContextMenu(e) {
33415
+ e.preventDefault();
33416
+ ctxPoint = toViewportCx(e);
33417
+ const rect = wrap?.getBoundingClientRect();
33418
+ const menuW = 190, menuH = 210;
33419
+ const px = rect ? Math.min(e.clientX - rect.left, rect.width - menuW - 6) : e.clientX;
33420
+ const py = rect ? Math.min(e.clientY - rect.top, rect.height - menuH - 6) : e.clientY;
33421
+ ctxMenu = {
33422
+ px: Math.max(6, px),
33423
+ py: Math.max(6, py),
33424
+ href: null,
33425
+ src: null
33426
+ };
33427
+ }
33428
+ function ctxClose() {
33429
+ ctxMenu = null;
33430
+ }
33431
+ function ctxSendRightClick() {
33432
+ const p = ctxPoint;
33433
+ ctxClose();
33434
+ if (!p) return;
33435
+ post({
33436
+ x: p.x,
33437
+ y: p.y});
33438
+ post({
33439
+ x: p.x,
33440
+ y: p.y});
33441
+ }
33442
+ /** ADR-0042 D3: ONE client choreography for tab creation — the context
33443
+ * menu's open-link/image (url present) and the strip's + chip (url
33444
+ * empty = BLANK, the birth state again). Empty body per D1: absence is
33445
+ * the blank signal, never a literal about:blank. Callers own their own
33446
+ * ctxClose(). */
33447
+ async function openTab(url) {}
33448
+ function ctxAct(action) {
33449
+ const m = ctxMenu;
33450
+ ctxClose();
33451
+ if (!m) return;
33452
+ if (action === "open-image" && m.src) return void openTab(m.src);
33453
+ if (action === "copy-image" && m.src) return void ctxCopy(m.src);
33454
+ if (action === "open-link" && m.href) return void openTab(m.href);
33455
+ if (action === "copy-link" && m.href) return void ctxCopy(m.href);
33456
+ if (action === "reload") return void proxy();
33457
+ if (action === "send-right-click") return ctxSendRightClick();
33458
+ }
33459
+ async function ctxCopy(text) {
33460
+ ctxClose();
33461
+ try {
33462
+ await navigator.clipboard.writeText(text);
33463
+ } catch {}
33464
+ }
33060
33465
  function onWheel(e) {
33061
33466
  const p = toViewportCx(e);
33062
33467
  if (!p) return;
@@ -33101,7 +33506,7 @@ function BrowserPanel($$renderer, $$props) {
33101
33506
  let $$settled = true;
33102
33507
  let $$inner_renderer;
33103
33508
  function $$render_inner($$renderer) {
33104
- $$renderer.push(`<div data-svelte="BrowserPanel" class="flex h-full flex-col bg-surface-elevated" data-testid="panel-browser">`);
33509
+ $$renderer.push(`<div data-svelte="BrowserPanel" class="relative flex h-full flex-col bg-surface-elevated" data-testid="panel-browser">`);
33105
33510
  BrowserHeader($$renderer, {
33106
33511
  status,
33107
33512
  reBound,
@@ -33126,6 +33531,19 @@ function BrowserPanel($$renderer, $$props) {
33126
33531
  $$renderer.push(`<!--]--></div>`);
33127
33532
  } else $$renderer.push("<!--[-1-->");
33128
33533
  $$renderer.push(`<!--]--> `);
33534
+ if (tabs.length >= 1) {
33535
+ $$renderer.push("<!--[0-->");
33536
+ $$renderer.push(`<div class="flex items-center gap-1 overflow-x-auto border-b border-surface-border px-1 py-0.5 text-[11px]" data-testid="browser-tab-strip"><!--[-->`);
33537
+ const each_array = ensure_array_like(tabs);
33538
+ for (let $$index = 0, $$length = each_array.length; $$index < $$length; $$index++) {
33539
+ let t = each_array[$$index];
33540
+ BrowserTab($$renderer, {
33541
+ tab: t,
33542
+ disabled: switching});
33543
+ }
33544
+ $$renderer.push(`<!--]--> <button type="button" class="shrink-0 rounded px-1.5 leading-none text-zinc-500 hover:bg-zinc-100 disabled:opacity-40" title="New tab" aria-label="New tab" data-testid="browser-tab-new"${attr("disabled", true, true)}>+</button></div>`);
33545
+ } else $$renderer.push("<!--[-1-->");
33546
+ $$renderer.push(`<!--]--> `);
33129
33547
  BrowserContent($$renderer, {
33130
33548
  status,
33131
33549
  failReason,
@@ -33134,6 +33552,10 @@ function BrowserPanel($$renderer, $$props) {
33134
33552
  onmove: onPointerMove,
33135
33553
  onwheel: onWheel,
33136
33554
  onkey: onKey,
33555
+ ctxMenu,
33556
+ onctxaction: ctxAct,
33557
+ onctxclose: ctxClose,
33558
+ oncontextmenu: onContextMenu,
33137
33559
  get wrap() {
33138
33560
  return wrap;
33139
33561
  },
@@ -34802,99 +35224,6 @@ function EmptyFloor($$renderer, $$props) {
34802
35224
  });
34803
35225
  }
34804
35226
  //#endregion
34805
- //#region src/lib/utils/sidebar-prefs.ts
34806
- /**
34807
- * Sidebar preferences — persisted layout state for the conversation page's
34808
- * app sidebar (OCI ControlRail pattern, 2026-08-23).
34809
- *
34810
- * Pure localStorage round-trip: SSR-safe (no localStorage → defaults), junk
34811
- * payloads and out-of-range widths fall back instead of throwing into the
34812
- * page, and writes are best-effort (a full or blocked store must not break
34813
- * the layout — it only loses persistence for that session).
34814
- *
34815
- * Workspace profiles (storage-profile.ts): `?profile=widi` moves the key
34816
- * to `dsi-sidebar_widi` — each desk remembers its own rail layout.
34817
- */
34818
- /** localStorage base key — one JSON blob `{ collapsed, width }`. */
34819
- var STORAGE_KEY = "dsi-sidebar";
34820
- /** The single width bound site — load-side sanitizing and drag clamping
34821
- * both route through here so the bounds exist in exactly one place.
34822
- * Bounds read the config store (layout load has landed them before any
34823
- * mount; constants are the fallback defaults). */
34824
- function clampSidebarWidth(width) {
34825
- const { minWidth, maxWidth } = appConfig().sidebar;
34826
- return Math.max(minWidth, Math.min(maxWidth, width));
34827
- }
34828
- /** Config-driven default width (clamped through the single bound site). */
34829
- function defaultSidebarWidth() {
34830
- return clampSidebarWidth(appConfig().sidebar.defaultWidth);
34831
- }
34832
- /** Persisted defaults when nothing (usable) is stored. */
34833
- function defaultSidebarPrefs() {
34834
- return {
34835
- collapsed: false,
34836
- width: defaultSidebarWidth()
34837
- };
34838
- }
34839
- /**
34840
- * Read prefs from localStorage.
34841
- * @param profile sanitized workspace profile (null/omitted = default desk).
34842
- * @returns stored prefs when parseable, defaults when absent, junk, or SSR.
34843
- */
34844
- function loadSidebarPrefs(profile) {
34845
- if (typeof localStorage === "undefined") return defaultSidebarPrefs();
34846
- try {
34847
- const raw = localStorage.getItem(dsiKey(STORAGE_KEY, profile));
34848
- if (!raw) return defaultSidebarPrefs();
34849
- const parsed = JSON.parse(raw);
34850
- if (parsed === null || typeof parsed !== "object") return defaultSidebarPrefs();
34851
- return {
34852
- collapsed: parsed.collapsed === true,
34853
- width: clampSidebarWidth(typeof parsed.width === "number" && Number.isFinite(parsed.width) ? parsed.width : defaultSidebarWidth())
34854
- };
34855
- } catch {
34856
- return defaultSidebarPrefs();
34857
- }
34858
- }
34859
- //#endregion
34860
- //#region src/lib/services/workspace/page-prefs.svelte.ts
34861
- var PagePrefs = class {
34862
- /** Width preset for the next conversation panel (clamped). */
34863
- panelWidth = 0;
34864
- /** Floor zoom (clamped). */
34865
- zoom = 1;
34866
- /** Explorer Layout split (clamped). */
34867
- treePct = 0;
34868
- /** Sidebar rail state (OCI ControlRail port). */
34869
- sidebarCollapsed = false;
34870
- sidebarWidth = 0;
34871
- #profile = null;
34872
- #initialised = false;
34873
- /** Seed every field from the persisted blobs — exactly once, BEFORE
34874
- * the route reads any field (makePanel reads panelWidth during the
34875
- * seed reset). Intentional initial capture per the route's old
34876
- * "svelte-ignore state_referenced_locally" comments: prefs seed the
34877
- * layout once; later writes go through the save effects. */
34878
- init(profile) {
34879
- this.#initialised = true;
34880
- this.#profile = profile;
34881
- const floor = loadPanelPrefs(profile);
34882
- this.panelWidth = clampPanelWidth(floor.panelWidth);
34883
- this.zoom = clampPanelZoom(floor.zoom);
34884
- this.treePct = clampTreePct(floor.treePct);
34885
- const sidebar = loadSidebarPrefs(profile);
34886
- this.sidebarCollapsed = sidebar.collapsed;
34887
- this.sidebarWidth = sidebar.width;
34888
- }
34889
- get profile() {
34890
- return this.#profile;
34891
- }
34892
- /** Sidebar persistence (the route's old sidebar save effect). Call
34893
- * during component initialisation — `$effect` needs an owner. */
34894
- installSidebarAutoSave() {}
34895
- };
34896
- var pagePrefs = new PagePrefs();
34897
- //#endregion
34898
35227
  //#region src/lib/services/conversation/spine-feed.svelte.ts
34899
35228
  var spineFeed = {
34900
35229
  rows: [],
@@ -36006,4 +36335,4 @@ function _page($$renderer, $$props) {
36006
36335
  }
36007
36336
 
36008
36337
  export { _page as default };
36009
- //# sourceMappingURL=_page.svelte.js-CQUo8VGL.js.map
36338
+ //# sourceMappingURL=_page.svelte.js-Dek8Q1_v.js.map