@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.
- package/build/client/_app/immutable/assets/0.cswkTiBk.css +2 -0
- package/build/client/_app/immutable/chunks/C7Sg_49n.js +1 -0
- package/build/client/_app/immutable/chunks/{CAoCg_fG.js → CnzmIbjr.js} +1 -1
- package/build/client/_app/immutable/chunks/DY0MQ1mO.js +1 -0
- package/build/client/_app/immutable/chunks/GKkjunMm.js +2 -0
- package/build/client/_app/immutable/entry/{app.DIq2Q3OX.js → app.DYNedUxy.js} +2 -2
- package/build/client/_app/immutable/entry/start.BzyrBssE.js +1 -0
- package/build/client/_app/immutable/nodes/{1.DKIIO5Pq.js → 1.CHB5qqQ9.js} +1 -1
- package/build/client/_app/immutable/nodes/{2.CpOJSq6u.js → 2.C6No1310.js} +222 -222
- package/build/client/_app/version.json +1 -1
- package/build/handler.js +4 -4
- package/build/index.js +4 -4
- package/build/server/chunks/chunks/{dsh-events.js-CGuF_had.js → dsh-events.js-BUkLR6ZV.js} +13 -1
- package/build/server/chunks/chunks/{git-probe.js-Cn_ugqcH.js → git-probe.js-CLF37SRh.js} +2 -2
- package/build/server/chunks/chunks/{internal2.js-DFG0wDsP.js → internal2.js-J3h-US64.js} +2 -2
- package/build/server/chunks/chunks/registry.js-CZNJZ0C-.js +1003 -0
- package/build/server/chunks/chunks/{state.js-Dki_Bq11.js → state.js-8RBD56dL.js} +2 -2
- package/build/server/chunks/chunks/{watcher.js-f54CFvdI.js → watcher.js-BVKnoQUw.js} +2 -2
- package/build/server/chunks/entries/endpoints/api/a2a/{_server.ts.js-DN0zl7cz.js → _server.ts.js-3kQCQuHT.js} +3 -3
- package/build/server/chunks/entries/endpoints/api/a2a/register/{_server.ts.js-C3byr74D.js → _server.ts.js-BUBTCLFn.js} +3 -3
- package/build/server/chunks/entries/endpoints/api/browser/_id_/activate/_server.ts.js-BdMJzENm.js +45 -0
- package/build/server/chunks/entries/endpoints/api/browser/_id_/close/{_server.ts.js-BKChU9D7.js → _server.ts.js-B5z9-N8Y.js} +2 -2
- package/build/server/chunks/entries/endpoints/api/browser/_id_/closetab/_server.ts.js-CnZHun5r.js +44 -0
- package/build/server/chunks/entries/endpoints/api/browser/_id_/element/_server.ts.js-C1oM2Ihf.js +43 -0
- package/build/server/chunks/entries/endpoints/api/browser/_id_/input/{_server.ts.js-CUFYX5kg.js → _server.ts.js-DmbqGRMg.js} +5 -4
- package/build/server/chunks/entries/endpoints/api/browser/_id_/mcp/{_server.ts.js-fg2eb_ZY.js → _server.ts.js-Cj80T1yH.js} +2 -2
- package/build/server/chunks/entries/endpoints/api/browser/_id_/navigate/{_server.ts.js-Dt1n31IP.js → _server.ts.js-6gi1UYTJ.js} +11 -7
- package/build/server/chunks/entries/endpoints/api/browser/_id_/opentab/_server.ts.js-Bhx_J7ot.js +47 -0
- package/build/server/chunks/entries/endpoints/api/browser/_id_/page/{_server.ts.js-DIF8juwJ.js → _server.ts.js-DvQXNnX9.js} +4 -3
- package/build/server/chunks/entries/endpoints/api/browser/_id_/stream/{_server.ts.js-BFdXJdhd.js → _server.ts.js-MflkVWUn.js} +2 -2
- package/build/server/chunks/entries/endpoints/api/browser/_id_/tabs/_server.ts.js-CoUSlLcP.js +34 -0
- package/build/server/chunks/entries/endpoints/api/browser/_id_/viewport/{_server.ts.js-BIF_7OHe.js → _server.ts.js-DNk4EgjJ.js} +6 -4
- package/build/server/chunks/entries/endpoints/api/browser/{_server.ts.js-B7yjEF1N.js → _server.ts.js-CECKap7O.js} +14 -4
- package/build/server/chunks/entries/endpoints/api/dsh/session/_sessionId_/events/{_server.ts.js-lBsxHSo6.js → _server.ts.js-BzP30TXW.js} +2 -2
- package/build/server/chunks/entries/endpoints/api/dsh/session/_sessionId_/history/{_server.ts.js-BrEgFdCF.js → _server.ts.js-B7YRQhuJ.js} +2 -2
- package/build/server/chunks/entries/endpoints/api/workspace/file-write/{_server.ts.js-BRhlbYEe.js → _server.ts.js-B-5YihUA.js} +3 -3
- package/build/server/chunks/entries/endpoints/api/workspace/git-events/{_server.ts.js-B9YI66ZL.js → _server.ts.js-DT5jRZFE.js} +3 -3
- package/build/server/chunks/entries/endpoints/api/workspace/git-file-head/{_server.ts.js-DSvXRZQL.js → _server.ts.js-DtW-utrd.js} +3 -3
- package/build/server/chunks/entries/endpoints/api/workspace/git-map/{_server.ts.js-8A0skdlM.js → _server.ts.js-8AIAo9jX.js} +3 -3
- package/build/server/chunks/entries/endpoints/api/workspace/git-status/{_server.ts.js-Bc6J3t3m.js → _server.ts.js-CMw96vjY.js} +3 -3
- package/build/server/chunks/entries/endpoints/api/workspace/write-gate/{_server.ts.js-CfL8Por5.js → _server.ts.js-DKufa14_.js} +3 -3
- package/build/server/chunks/entries/pages/{_error.svelte.js-EnDLC3Jj.js → _error.svelte.js-DRPduJdP.js} +3 -3
- package/build/server/chunks/entries/pages/{_page.server.ts.js-ar1DbW1v.js → _page.server.ts.js-7x6ZfGoB.js} +2 -2
- package/build/server/chunks/entries/pages/{_page.svelte.js-CQUo8VGL.js → _page.svelte.js-Dek8Q1_v.js} +430 -101
- package/build/server/chunks/{handler-BBp0LoYK.js → handler-DUyvzXsb.js} +3 -3
- package/build/server/chunks/{index.js-S4257Wcs.js → index.js-BrP1SRzN.js} +2 -2
- package/build/server/chunks/{manifest.js-DajiWH1H.js → manifest.js-C4z6aoYx.js} +58 -23
- package/build/server/chunks/nodes/{0.js-DtkNHIFx.js → 0.js-BuB3t8Br.js} +3 -3
- package/build/server/chunks/nodes/1.js-CW4V8ni8.js +9 -0
- package/build/server/chunks/nodes/{2.js-BORDEffk.js → 2.js-C-o9KF10.js} +5 -5
- package/package.json +2 -7
- package/template/.dsi/prompts.sqlite-shm +0 -0
- package/template/.dsi/prompts.sqlite-wal +0 -0
- package/template/.dsi/settings.yaml +2 -2
- package/build/client/_app/immutable/assets/0.DBVVEjy9.css +0 -2
- package/build/client/_app/immutable/chunks/BHodvdRc.js +0 -1
- package/build/client/_app/immutable/chunks/D-jXFTzB.js +0 -1
- package/build/client/_app/immutable/chunks/TTdBFs3C.js +0 -2
- package/build/client/_app/immutable/entry/start.E6P3Z7tx.js +0 -1
- package/build/server/chunks/chunks/registry.js-BC-TNdmn.js +0 -616
- package/build/server/chunks/nodes/1.js-OAvYMTzU.js +0 -9
- /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-
|
|
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-
|
|
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.
|
|
17623
|
-
var dsh = { "webVersion": "0.2.1-rc.
|
|
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 === "
|
|
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-
|
|
36338
|
+
//# sourceMappingURL=_page.svelte.js-Dek8Q1_v.js.map
|