@deepseek-insight/dsi 0.6.20 → 0.7.0

This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
Files changed (100) hide show
  1. package/bin/dsi.mjs +16 -8
  2. package/bin/lib/dev-mode.mjs +6 -2
  3. package/build/client/_app/immutable/assets/0.CrT3Lf0L.css +2 -0
  4. package/build/client/_app/immutable/assets/{2.BqRWIIgD.css → 2.ByYVysCj.css} +1 -1
  5. package/build/client/_app/immutable/chunks/{BbvYWcEs.js → CFofWD1C.js} +1 -1
  6. package/build/client/_app/immutable/chunks/CW7JStOk.js +1 -0
  7. package/build/client/_app/immutable/chunks/CzXb6qus.js +2 -0
  8. package/build/client/_app/immutable/chunks/DwWy6K0V.js +1 -0
  9. package/build/client/_app/immutable/entry/{app.BAD3jsui.js → app.DID8VW1I.js} +2 -2
  10. package/build/client/_app/immutable/entry/start.CkxDcwJy.js +1 -0
  11. package/build/client/_app/immutable/nodes/{1.COHJn6QL.js → 1.2U7ECroT.js} +1 -1
  12. package/build/client/_app/immutable/nodes/2.D1lz0hMu.js +337 -0
  13. package/build/client/_app/version.json +1 -1
  14. package/build/handler.js +4 -4
  15. package/build/index.js +4 -4
  16. package/build/server/chunks/chunks/{db.js-DRhjT6xK.js → db.js-BmnKaIBo.js} +2 -2
  17. package/build/server/chunks/chunks/{db2.js-DUta2B-n.js → db2.js-CpSDQEUB.js} +2 -2
  18. package/build/server/chunks/chunks/deliverables.js-Dg6XzNkW.js +46 -0
  19. package/build/server/chunks/chunks/{dsh-connection.js-DL5qjlq2.js → dsh-connection.js-CE6s1mIM.js} +2 -2
  20. package/build/server/chunks/chunks/{dsh-events.js-35seDLwL.js → dsh-events.js-CGuF_had.js} +2 -1
  21. package/build/server/chunks/chunks/{git-probe.js-D4DjBXSY.js → git-probe.js-DBbLffkp.js} +3 -3
  22. package/build/server/chunks/chunks/{insight-config.js-CA-iT3lB.js → insight-config.js-DZBwKFH9.js} +31 -2
  23. package/build/server/chunks/chunks/{internal2.js-BDzd2OUR.js → internal2.js-DgxNmZhS.js} +2 -2
  24. package/build/server/chunks/chunks/registry.js-D0ldrcNB.js +577 -0
  25. package/build/server/chunks/chunks/{registry.js-G1hzOje_.js → registry2.js-D3Pr1Rv9.js} +2 -2
  26. package/build/server/chunks/chunks/{state.js-Cb31UwpL.js → state.js-DPoVCoAg.js} +2 -2
  27. package/build/server/chunks/chunks/{watcher.js-CACduBB9.js → watcher.js-Ck2BsXQf.js} +5 -5
  28. package/build/server/chunks/entries/endpoints/api/a2a/_id_/{_server.ts.js-CpeC2QLb.js → _server.ts.js-B7qOvtA5.js} +3 -3
  29. package/build/server/chunks/entries/endpoints/api/a2a/{_server.ts.js-DHFHuGSm.js → _server.ts.js-DBLFNFXT.js} +6 -6
  30. package/build/server/chunks/entries/endpoints/api/a2a/register/{_server.ts.js-CUUfDBcc.js → _server.ts.js-COyQSOOR.js} +6 -6
  31. package/build/server/chunks/entries/endpoints/api/browser/_id_/close/_server.ts.js-CJjvHo1Z.js +32 -0
  32. package/build/server/chunks/entries/endpoints/api/browser/_id_/input/_server.ts.js-_XEUfVid.js +78 -0
  33. package/build/server/chunks/entries/endpoints/api/browser/_id_/mcp/_server.ts.js-e7j-kKSK.js +50 -0
  34. package/build/server/chunks/entries/endpoints/api/browser/_id_/navigate/_server.ts.js-BYiU0Wvv.js +62 -0
  35. package/build/server/chunks/entries/endpoints/api/browser/_id_/page/_server.ts.js-RL1-uaVR.js +33 -0
  36. package/build/server/chunks/entries/endpoints/api/browser/_id_/stream/_server.ts.js-Cxc2r0BD.js +74 -0
  37. package/build/server/chunks/entries/endpoints/api/browser/_id_/viewport/_server.ts.js-DQ1jgFuc.js +42 -0
  38. package/build/server/chunks/entries/endpoints/api/browser/_server.ts.js-DfbmPmUH.js +37 -0
  39. package/build/server/chunks/entries/endpoints/api/config/{_server.ts.js-BG78X__J.js → _server.ts.js-CfcgdS1G.js} +3 -3
  40. package/build/server/chunks/entries/endpoints/api/dsh/directory/{_server.ts.js-Cae4x1c7.js → _server.ts.js-BOgNWE9k.js} +3 -3
  41. package/build/server/chunks/entries/endpoints/api/dsh/jobs/{_server.ts.js-hGmoSsDv.js → _server.ts.js-DExfzwju.js} +3 -3
  42. package/build/server/chunks/entries/endpoints/api/dsh/pick-directory/{_server.ts.js-BLb8o1cY.js → _server.ts.js-vuxSBOKD.js} +3 -3
  43. package/build/server/chunks/entries/endpoints/api/dsh/presets/{_server.ts.js-BFeDKrPz.js → _server.ts.js-DYh0lUVR.js} +3 -3
  44. package/build/server/chunks/entries/endpoints/api/dsh/session/_sessionId_/attachment/{_server.ts.js-DmSTTfI5.js → _server.ts.js-CzmMoP9-.js} +3 -3
  45. package/build/server/chunks/entries/endpoints/api/dsh/session/_sessionId_/cancel/{_server.ts.js-Cus9XrC9.js → _server.ts.js-CXnfYfR4.js} +3 -3
  46. package/build/server/chunks/entries/endpoints/api/dsh/session/_sessionId_/catalog/{_server.ts.js-DcrNU0_y.js → _server.ts.js-CF2s7GwI.js} +3 -3
  47. package/build/server/chunks/entries/endpoints/api/dsh/session/_sessionId_/changes/{_server.ts.js-CpuEcp6p.js → _server.ts.js-DKw9ktIO.js} +3 -3
  48. package/build/server/chunks/entries/endpoints/api/dsh/session/_sessionId_/command/{_server.ts.js-CU9o8Tho.js → _server.ts.js-pT2AO2S0.js} +3 -3
  49. package/build/server/chunks/entries/endpoints/api/dsh/session/_sessionId_/events/{_server.ts.js-BiAJcPpb.js → _server.ts.js-D4H2h6fc.js} +9 -5
  50. package/build/server/chunks/entries/endpoints/api/dsh/session/_sessionId_/fork/{_server.ts.js-BMMZlvr7.js → _server.ts.js-iwuADbdv.js} +3 -3
  51. package/build/server/chunks/entries/endpoints/api/dsh/session/_sessionId_/goal/{_server.ts.js-DZ6qFrfm.js → _server.ts.js-C36DpiRX.js} +3 -3
  52. package/build/server/chunks/entries/endpoints/api/dsh/session/_sessionId_/history/{_server.ts.js-ecbtat_C.js → _server.ts.js-WApWfRu-.js} +4 -4
  53. package/build/server/chunks/entries/endpoints/api/dsh/session/_sessionId_/models/{_server.ts.js-CPZuvN-_.js → _server.ts.js-B8DQEsx6.js} +3 -3
  54. package/build/server/chunks/entries/endpoints/api/dsh/session/_sessionId_/path/{_server.ts.js-_SIiC8sn.js → _server.ts.js-B0ACEjPX.js} +2 -2
  55. package/build/server/chunks/entries/endpoints/api/dsh/session/_sessionId_/permission/{_server.ts.js-Dcfp7gSm.js → _server.ts.js-CmYfLvHD.js} +3 -3
  56. package/build/server/chunks/entries/endpoints/api/dsh/session/_sessionId_/prompt/{_server.ts.js-CmxqUwLT.js → _server.ts.js-DrZveeFq.js} +3 -3
  57. package/build/server/chunks/entries/endpoints/api/dsh/session/_sessionId_/rename/{_server.ts.js-DCNKXRwy.js → _server.ts.js-C-nVpTN7.js} +3 -3
  58. package/build/server/chunks/entries/endpoints/api/dsh/session/_sessionId_/respond/{_server.ts.js-AURyR2ll.js → _server.ts.js-C-cuYV40.js} +3 -3
  59. package/build/server/chunks/entries/endpoints/api/dsh/session/_sessionId_/select-model/{_server.ts.js-BVF36vTO.js → _server.ts.js-BoiybbwX.js} +3 -3
  60. package/build/server/chunks/entries/endpoints/api/dsh/sessions/{_server.ts.js-LX3JZbRr.js → _server.ts.js-DDqjDxoc.js} +3 -3
  61. package/build/server/chunks/entries/endpoints/api/dsh/workspace-file/{_server.ts.js-BJ0d199o.js → _server.ts.js-DG0MHUkj.js} +3 -3
  62. package/build/server/chunks/entries/endpoints/api/dsh/workspace-tree/{_server.ts.js-BDy9jQXv.js → _server.ts.js-Cz4XSEfb.js} +3 -3
  63. package/build/server/chunks/entries/endpoints/api/dsh/workspaces/{_server.ts.js-DoTpSXIc.js → _server.ts.js-DV4wF7XG.js} +3 -3
  64. package/build/server/chunks/entries/endpoints/api/dsh/workspaces/_workspaceId_/delete/{_server.ts.js-BnfIobo7.js → _server.ts.js-X0mwkV_4.js} +3 -3
  65. package/build/server/chunks/entries/endpoints/api/dsh/workspaces/_workspaceId_/rename/{_server.ts.js-KRyjIODB.js → _server.ts.js-D_AEj6qx.js} +3 -3
  66. package/build/server/chunks/entries/endpoints/api/prompts/_id_/{_server.ts.js-bRLZ5TWI.js → _server.ts.js-Cj3S-2MC.js} +3 -3
  67. package/build/server/chunks/entries/endpoints/api/prompts/{_server.ts.js-ChzWZoFk.js → _server.ts.js-DuuhbcTE.js} +3 -3
  68. package/build/server/chunks/entries/endpoints/api/prompts/use/{_server.ts.js-DdH5QmPS.js → _server.ts.js-C72akYlH.js} +3 -3
  69. package/build/server/chunks/entries/endpoints/api/settings/{_server.ts.js-DwGQj520.js → _server.ts.js-CEO2aw-C.js} +2 -2
  70. package/build/server/chunks/entries/endpoints/api/terminal/_id_/output/{_server.ts.js-m6Cug5hN.js → _server.ts.js-BNBxebgG.js} +3 -3
  71. package/build/server/chunks/entries/endpoints/api/terminal/_id_/reattach/{_server.ts.js-wSsMKLiw.js → _server.ts.js-DDRJBGIr.js} +3 -3
  72. package/build/server/chunks/entries/endpoints/api/terminal/_id_/send/{_server.ts.js-CTc5xP72.js → _server.ts.js-CA0vc_Cm.js} +3 -3
  73. package/build/server/chunks/entries/endpoints/api/terminal/_id_/stream/{_server.ts.js-C8PLMU0Y.js → _server.ts.js-D6L8Gd_f.js} +3 -3
  74. package/build/server/chunks/entries/endpoints/api/terminal/{_server.ts.js-CwXC6Stk.js → _server.ts.js-BhR4Cblt.js} +4 -4
  75. package/build/server/chunks/entries/endpoints/api/workspace/file-write/{_server.ts.js-Cb7X2G82.js → _server.ts.js-BFdpm_he.js} +5 -5
  76. package/build/server/chunks/entries/endpoints/api/workspace/git-events/{_server.ts.js-DZ67v729.js → _server.ts.js-D5eW-2fL.js} +5 -5
  77. package/build/server/chunks/entries/endpoints/api/workspace/git-file-head/{_server.ts.js-BuO5Stmm.js → _server.ts.js-iax8K9x8.js} +5 -5
  78. package/build/server/chunks/entries/endpoints/api/workspace/git-map/{_server.ts.js-Bb_I5Ze7.js → _server.ts.js-CdfiRwgl.js} +5 -5
  79. package/build/server/chunks/entries/endpoints/api/workspace/git-status/{_server.ts.js-cHWxh5VB.js → _server.ts.js-CBU0ug30.js} +5 -5
  80. package/build/server/chunks/entries/endpoints/api/workspace/write-gate/{_server.ts.js-Blcfn0zm.js → _server.ts.js-CLozZQT3.js} +5 -5
  81. package/build/server/chunks/entries/pages/{_error.svelte.js-BqHQUTpg.js → _error.svelte.js-B9CGiiZy.js} +3 -3
  82. package/build/server/chunks/entries/pages/{_page.server.ts.js-C_ydvzuE.js → _page.server.ts.js-yB-zbLkm.js} +8 -3
  83. package/build/server/chunks/entries/pages/{_page.svelte.js-CWiGV7R5.js → _page.svelte.js-D3F2fiR4.js} +1047 -98
  84. package/build/server/chunks/{handler-CPdXYlKK.js → handler-CF16q5dY.js} +3 -3
  85. package/build/server/chunks/{index.js-CNYTOWSB.js → index.js-DsT3Sxoa.js} +2 -2
  86. package/build/server/chunks/{manifest.js-CQRa1JdF.js → manifest.js-CW2r9Rb1.js} +106 -50
  87. package/build/server/chunks/nodes/{0.js-zSkx80Fq.js → 0.js-gr8Z-ETs.js} +3 -3
  88. package/build/server/chunks/nodes/1.js-BrruRgxj.js +9 -0
  89. package/build/server/chunks/nodes/{2.js-CL8x9-EN.js → 2.js-Cif5vNvc.js} +9 -8
  90. package/package.json +4 -1
  91. package/template/.dsi/prompts.sqlite-shm +0 -0
  92. package/template/.dsi/prompts.sqlite-wal +0 -0
  93. package/build/client/_app/immutable/assets/0.KhAZv9mf.css +0 -2
  94. package/build/client/_app/immutable/chunks/BNsgelmQ.js +0 -1
  95. package/build/client/_app/immutable/chunks/C9uc32GW.js +0 -1
  96. package/build/client/_app/immutable/chunks/tw7vR7yM.js +0 -2
  97. package/build/client/_app/immutable/entry/start.CFzOCQr3.js +0 -1
  98. package/build/client/_app/immutable/nodes/2.CpHpu496.js +0 -337
  99. package/build/server/chunks/nodes/1.js-BQXeCZbQ.js +0 -9
  100. /package/build/client/_app/immutable/nodes/{0.Jl8y_yU6.js → 0.oyzYR3-4.js} +0 -0
@@ -8,7 +8,7 @@ import { D as DEFAULT_IMAGE_LIMITS } from '../../chunks/image-limits.js-CUdJ0f7r
8
8
  import { s as sanitizeWorkspaceProfile, d as dsiKey, t as themePrefs } from '../../chunks/theme-prefs.svelte.js-8CaWz46g.js';
9
9
  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-D7wkLUkK.js';
10
10
  import { c as getLocale } from '../../chunks/runtime.js-CCJi3XaY.js';
11
- 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-Cb31UwpL.js';
11
+ 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-DPoVCoAg.js';
12
12
  import 'yaml';
13
13
  import 'html-to-image';
14
14
  import hljs from 'highlight.js/lib/core';
@@ -20,7 +20,7 @@ import xml from 'highlight.js/lib/languages/xml';
20
20
  import css from 'highlight.js/lib/languages/css';
21
21
  import '../../chunks/uneval.js-BJ9Qq2SF.js';
22
22
  import '../../chunks/shared.js-HQ0rfhm4.js';
23
- import '../../chunks/internal2.js-BDzd2OUR.js';
23
+ import '../../chunks/internal2.js-DgxNmZhS.js';
24
24
  import '../../chunks/exports.js-DH_tjtdv.js';
25
25
  import '../../chunks/utils.js-CAdNO8Tu.js';
26
26
 
@@ -888,6 +888,326 @@ var broadcastsyncedto2 = ((inputs, options = {}) => {
888
888
  return en_broadcastsyncedto2(inputs);
889
889
  });
890
890
  //#endregion
891
+ //#region src/lib/paraglide/messages/browserback1.js
892
+ /** @typedef {import('../runtime.js').LocalizedString} LocalizedString */
893
+ /** @typedef {{}} Browserback1Inputs */
894
+ var en_browserback1 = () => {
895
+ return `Back`;
896
+ };
897
+ var zh_browserback1 = () => {
898
+ return `后退`;
899
+ };
900
+ var id_browserback1 = () => {
901
+ return `Kembali`;
902
+ };
903
+ var es_browserback1 = () => {
904
+ return `Atrás`;
905
+ };
906
+ /**
907
+ * | output |
908
+ * | --- |
909
+ * | "Back" |
910
+ *
911
+ * @param {Browserback1Inputs} inputs
912
+ * @param {{ locale?: "en" | "zh" | "id" | "es" }} options
913
+ * @returns {LocalizedString}
914
+ */
915
+ var browserback1 = ((inputs = {}, options = {}) => {
916
+ const locale = options.locale ?? getLocale();
917
+ if (locale === "zh") return zh_browserback1();
918
+ if (locale === "id") return id_browserback1();
919
+ if (locale === "es") return es_browserback1();
920
+ return en_browserback1();
921
+ });
922
+ //#endregion
923
+ //#region src/lib/paraglide/messages/browserchiplabel2.js
924
+ /** @typedef {import('../runtime.js').LocalizedString} LocalizedString */
925
+ /** @typedef {{}} Browserchiplabel2Inputs */
926
+ var en_browserchiplabel2 = () => {
927
+ return `⌖ Browser`;
928
+ };
929
+ var zh_browserchiplabel2 = () => {
930
+ return `⌖ 浏览器`;
931
+ };
932
+ var id_browserchiplabel2 = () => {
933
+ return `⌖ Peramban`;
934
+ };
935
+ var es_browserchiplabel2 = () => {
936
+ return `⌖ Navegador`;
937
+ };
938
+ /**
939
+ * | output |
940
+ * | --- |
941
+ * | "⌖ Browser" |
942
+ *
943
+ * @param {Browserchiplabel2Inputs} inputs
944
+ * @param {{ locale?: "en" | "zh" | "id" | "es" }} options
945
+ * @returns {LocalizedString}
946
+ */
947
+ var browserchiplabel2 = ((inputs = {}, options = {}) => {
948
+ const locale = options.locale ?? getLocale();
949
+ if (locale === "zh") return zh_browserchiplabel2();
950
+ if (locale === "id") return id_browserchiplabel2();
951
+ if (locale === "es") return es_browserchiplabel2();
952
+ return en_browserchiplabel2();
953
+ });
954
+ //#endregion
955
+ //#region src/lib/paraglide/messages/browserforward1.js
956
+ /** @typedef {import('../runtime.js').LocalizedString} LocalizedString */
957
+ /** @typedef {{}} Browserforward1Inputs */
958
+ var en_browserforward1 = () => {
959
+ return `Forward`;
960
+ };
961
+ var zh_browserforward1 = () => {
962
+ return `前进`;
963
+ };
964
+ var id_browserforward1 = () => {
965
+ return `Maju`;
966
+ };
967
+ var es_browserforward1 = () => {
968
+ return `Adelante`;
969
+ };
970
+ /**
971
+ * | output |
972
+ * | --- |
973
+ * | "Forward" |
974
+ *
975
+ * @param {Browserforward1Inputs} inputs
976
+ * @param {{ locale?: "en" | "zh" | "id" | "es" }} options
977
+ * @returns {LocalizedString}
978
+ */
979
+ var browserforward1 = ((inputs = {}, options = {}) => {
980
+ const locale = options.locale ?? getLocale();
981
+ if (locale === "zh") return zh_browserforward1();
982
+ if (locale === "id") return id_browserforward1();
983
+ if (locale === "es") return es_browserforward1();
984
+ return en_browserforward1();
985
+ });
986
+ //#endregion
987
+ //#region src/lib/paraglide/messages/browserlaunching1.js
988
+ /** @typedef {import('../runtime.js').LocalizedString} LocalizedString */
989
+ /** @typedef {{}} Browserlaunching1Inputs */
990
+ var en_browserlaunching1 = () => {
991
+ return `launching browser…`;
992
+ };
993
+ var zh_browserlaunching1 = () => {
994
+ return `正在启动浏览器…`;
995
+ };
996
+ var id_browserlaunching1 = () => {
997
+ return `meluncurkan peramban…`;
998
+ };
999
+ var es_browserlaunching1 = () => {
1000
+ return `iniciando navegador…`;
1001
+ };
1002
+ /**
1003
+ * | output |
1004
+ * | --- |
1005
+ * | "launching browser…" |
1006
+ *
1007
+ * @param {Browserlaunching1Inputs} inputs
1008
+ * @param {{ locale?: "en" | "zh" | "id" | "es" }} options
1009
+ * @returns {LocalizedString}
1010
+ */
1011
+ var browserlaunching1 = ((inputs = {}, options = {}) => {
1012
+ const locale = options.locale ?? getLocale();
1013
+ if (locale === "zh") return zh_browserlaunching1();
1014
+ if (locale === "id") return id_browserlaunching1();
1015
+ if (locale === "es") return es_browserlaunching1();
1016
+ return en_browserlaunching1();
1017
+ });
1018
+ //#endregion
1019
+ //#region src/lib/paraglide/messages/browseropentitle2.js
1020
+ /** @typedef {import('../runtime.js').LocalizedString} LocalizedString */
1021
+ /** @typedef {{}} Browseropentitle2Inputs */
1022
+ var en_browseropentitle2 = () => {
1023
+ return `Open the glass browser`;
1024
+ };
1025
+ var zh_browseropentitle2 = () => {
1026
+ return `打开玻璃浏览器`;
1027
+ };
1028
+ var id_browseropentitle2 = () => {
1029
+ return `Buka peramban kaca`;
1030
+ };
1031
+ var es_browseropentitle2 = () => {
1032
+ return `Abrir el navegador de cristal`;
1033
+ };
1034
+ /**
1035
+ * | output |
1036
+ * | --- |
1037
+ * | "Open the glass browser" |
1038
+ *
1039
+ * @param {Browseropentitle2Inputs} inputs
1040
+ * @param {{ locale?: "en" | "zh" | "id" | "es" }} options
1041
+ * @returns {LocalizedString}
1042
+ */
1043
+ var browseropentitle2 = ((inputs = {}, options = {}) => {
1044
+ const locale = options.locale ?? getLocale();
1045
+ if (locale === "zh") return zh_browseropentitle2();
1046
+ if (locale === "id") return id_browseropentitle2();
1047
+ if (locale === "es") return es_browseropentitle2();
1048
+ return en_browseropentitle2();
1049
+ });
1050
+ //#endregion
1051
+ //#region src/lib/paraglide/messages/browserpaneltitle2.js
1052
+ /** @typedef {import('../runtime.js').LocalizedString} LocalizedString */
1053
+ /** @typedef {{}} Browserpaneltitle2Inputs */
1054
+ var en_browserpaneltitle2 = () => {
1055
+ return `Browser`;
1056
+ };
1057
+ var zh_browserpaneltitle2 = () => {
1058
+ return `浏览器`;
1059
+ };
1060
+ var id_browserpaneltitle2 = () => {
1061
+ return `Peramban`;
1062
+ };
1063
+ var es_browserpaneltitle2 = () => {
1064
+ return `Navegador`;
1065
+ };
1066
+ /**
1067
+ * | output |
1068
+ * | --- |
1069
+ * | "Browser" |
1070
+ *
1071
+ * @param {Browserpaneltitle2Inputs} inputs
1072
+ * @param {{ locale?: "en" | "zh" | "id" | "es" }} options
1073
+ * @returns {LocalizedString}
1074
+ */
1075
+ var browserpaneltitle2 = ((inputs = {}, options = {}) => {
1076
+ const locale = options.locale ?? getLocale();
1077
+ if (locale === "zh") return zh_browserpaneltitle2();
1078
+ if (locale === "id") return id_browserpaneltitle2();
1079
+ if (locale === "es") return es_browserpaneltitle2();
1080
+ return en_browserpaneltitle2();
1081
+ });
1082
+ //#endregion
1083
+ //#region src/lib/paraglide/messages/browserreload1.js
1084
+ /** @typedef {import('../runtime.js').LocalizedString} LocalizedString */
1085
+ /** @typedef {{}} Browserreload1Inputs */
1086
+ var en_browserreload1 = () => {
1087
+ return `Reload`;
1088
+ };
1089
+ var zh_browserreload1 = () => {
1090
+ return `重新加载`;
1091
+ };
1092
+ var id_browserreload1 = () => {
1093
+ return `Muat ulang`;
1094
+ };
1095
+ var es_browserreload1 = () => {
1096
+ return `Recargar`;
1097
+ };
1098
+ /**
1099
+ * | output |
1100
+ * | --- |
1101
+ * | "Reload" |
1102
+ *
1103
+ * @param {Browserreload1Inputs} inputs
1104
+ * @param {{ locale?: "en" | "zh" | "id" | "es" }} options
1105
+ * @returns {LocalizedString}
1106
+ */
1107
+ var browserreload1 = ((inputs = {}, options = {}) => {
1108
+ const locale = options.locale ?? getLocale();
1109
+ if (locale === "zh") return zh_browserreload1();
1110
+ if (locale === "id") return id_browserreload1();
1111
+ if (locale === "es") return es_browserreload1();
1112
+ return en_browserreload1();
1113
+ });
1114
+ //#endregion
1115
+ //#region src/lib/paraglide/messages/browsersessionfailed2.js
1116
+ /** @typedef {import('../runtime.js').LocalizedString} LocalizedString */
1117
+ /** @typedef {{ reason: NonNullable<unknown> }} Browsersessionfailed2Inputs */
1118
+ var en_browsersessionfailed2 = (i) => {
1119
+ return `browser session failed ${i?.reason} — close and reopen the panel`;
1120
+ };
1121
+ var zh_browsersessionfailed2 = (i) => {
1122
+ return `浏览器会话失败${i?.reason} — 请关闭并重新打开面板`;
1123
+ };
1124
+ var id_browsersessionfailed2 = (i) => {
1125
+ return `sesi peramban gagal ${i?.reason} — tutup dan buka kembali panel`;
1126
+ };
1127
+ var es_browsersessionfailed2 = (i) => {
1128
+ return `la sesión del navegador falló ${i?.reason} — cierra y reabre el panel`;
1129
+ };
1130
+ /**
1131
+ * | output |
1132
+ * | --- |
1133
+ * | "browser session failed {reason} — close and reopen the panel" |
1134
+ *
1135
+ * @param {Browsersessionfailed2Inputs} inputs
1136
+ * @param {{ locale?: "en" | "zh" | "id" | "es" }} options
1137
+ * @returns {LocalizedString}
1138
+ */
1139
+ var browsersessionfailed2 = ((inputs, options = {}) => {
1140
+ const locale = options.locale ?? getLocale();
1141
+ if (locale === "zh") return zh_browsersessionfailed2(inputs);
1142
+ if (locale === "id") return id_browsersessionfailed2(inputs);
1143
+ if (locale === "es") return es_browsersessionfailed2(inputs);
1144
+ return en_browsersessionfailed2(inputs);
1145
+ });
1146
+ //#endregion
1147
+ //#region src/lib/paraglide/messages/browserurlplaceholder2.js
1148
+ /** @typedef {import('../runtime.js').LocalizedString} LocalizedString */
1149
+ /** @typedef {{}} Browserurlplaceholder2Inputs */
1150
+ var en_browserurlplaceholder2 = () => {
1151
+ return `Search or type a URL`;
1152
+ };
1153
+ var zh_browserurlplaceholder2 = () => {
1154
+ return `搜索或输入网址`;
1155
+ };
1156
+ var id_browserurlplaceholder2 = () => {
1157
+ return `Cari atau ketik URL`;
1158
+ };
1159
+ var es_browserurlplaceholder2 = () => {
1160
+ return `Buscar o escribir una URL`;
1161
+ };
1162
+ /**
1163
+ * | output |
1164
+ * | --- |
1165
+ * | "Search or type a URL" |
1166
+ *
1167
+ * @param {Browserurlplaceholder2Inputs} inputs
1168
+ * @param {{ locale?: "en" | "zh" | "id" | "es" }} options
1169
+ * @returns {LocalizedString}
1170
+ */
1171
+ var browserurlplaceholder2 = ((inputs = {}, options = {}) => {
1172
+ const locale = options.locale ?? getLocale();
1173
+ if (locale === "zh") return zh_browserurlplaceholder2();
1174
+ if (locale === "id") return id_browserurlplaceholder2();
1175
+ if (locale === "es") return es_browserurlplaceholder2();
1176
+ return en_browserurlplaceholder2();
1177
+ });
1178
+ //#endregion
1179
+ //#region src/lib/paraglide/messages/browserwaitingframes2.js
1180
+ /** @typedef {import('../runtime.js').LocalizedString} LocalizedString */
1181
+ /** @typedef {{}} Browserwaitingframes2Inputs */
1182
+ var en_browserwaitingframes2 = () => {
1183
+ return `waiting for frames…`;
1184
+ };
1185
+ var zh_browserwaitingframes2 = () => {
1186
+ return `等待画面帧…`;
1187
+ };
1188
+ var id_browserwaitingframes2 = () => {
1189
+ return `menunggu frame…`;
1190
+ };
1191
+ var es_browserwaitingframes2 = () => {
1192
+ return `esperando fotogramas…`;
1193
+ };
1194
+ /**
1195
+ * | output |
1196
+ * | --- |
1197
+ * | "waiting for frames…" |
1198
+ *
1199
+ * @param {Browserwaitingframes2Inputs} inputs
1200
+ * @param {{ locale?: "en" | "zh" | "id" | "es" }} options
1201
+ * @returns {LocalizedString}
1202
+ */
1203
+ var browserwaitingframes2 = ((inputs = {}, options = {}) => {
1204
+ const locale = options.locale ?? getLocale();
1205
+ if (locale === "zh") return zh_browserwaitingframes2();
1206
+ if (locale === "id") return id_browserwaitingframes2();
1207
+ if (locale === "es") return es_browserwaitingframes2();
1208
+ return en_browserwaitingframes2();
1209
+ });
1210
+ //#endregion
891
1211
  //#region src/lib/paraglide/messages/cachehit1.js
892
1212
  /** @typedef {import('../runtime.js').LocalizedString} LocalizedString */
893
1213
  /** @typedef {{}} Cachehit1Inputs */
@@ -3224,6 +3544,70 @@ var deleting = ((inputs = {}, options = {}) => {
3224
3544
  return en_deleting();
3225
3545
  });
3226
3546
  //#endregion
3547
+ //#region src/lib/paraglide/messages/deliverablesfiles1.js
3548
+ /** @typedef {import('../runtime.js').LocalizedString} LocalizedString */
3549
+ /** @typedef {{}} Deliverablesfiles1Inputs */
3550
+ var en_deliverablesfiles1 = () => {
3551
+ return ` files)`;
3552
+ };
3553
+ var zh_deliverablesfiles1 = () => {
3554
+ return ` 个文件)`;
3555
+ };
3556
+ var id_deliverablesfiles1 = () => {
3557
+ return ` berkas)`;
3558
+ };
3559
+ var es_deliverablesfiles1 = () => {
3560
+ return ` archivos)`;
3561
+ };
3562
+ /**
3563
+ * | output |
3564
+ * | --- |
3565
+ * | "files)" |
3566
+ *
3567
+ * @param {Deliverablesfiles1Inputs} inputs
3568
+ * @param {{ locale?: "en" | "zh" | "id" | "es" }} options
3569
+ * @returns {LocalizedString}
3570
+ */
3571
+ var deliverablesfiles1 = ((inputs = {}, options = {}) => {
3572
+ const locale = options.locale ?? getLocale();
3573
+ if (locale === "zh") return zh_deliverablesfiles1();
3574
+ if (locale === "id") return id_deliverablesfiles1();
3575
+ if (locale === "es") return es_deliverablesfiles1();
3576
+ return en_deliverablesfiles1();
3577
+ });
3578
+ //#endregion
3579
+ //#region src/lib/paraglide/messages/deliverablestitle1.js
3580
+ /** @typedef {import('../runtime.js').LocalizedString} LocalizedString */
3581
+ /** @typedef {{}} Deliverablestitle1Inputs */
3582
+ var en_deliverablestitle1 = () => {
3583
+ return `Deliverables (`;
3584
+ };
3585
+ var zh_deliverablestitle1 = () => {
3586
+ return `交付文件(`;
3587
+ };
3588
+ var id_deliverablestitle1 = () => {
3589
+ return `Hasil kerja (`;
3590
+ };
3591
+ var es_deliverablestitle1 = () => {
3592
+ return `Entregables (`;
3593
+ };
3594
+ /**
3595
+ * | output |
3596
+ * | --- |
3597
+ * | "Deliverables (" |
3598
+ *
3599
+ * @param {Deliverablestitle1Inputs} inputs
3600
+ * @param {{ locale?: "en" | "zh" | "id" | "es" }} options
3601
+ * @returns {LocalizedString}
3602
+ */
3603
+ var deliverablestitle1 = ((inputs = {}, options = {}) => {
3604
+ const locale = options.locale ?? getLocale();
3605
+ if (locale === "zh") return zh_deliverablestitle1();
3606
+ if (locale === "id") return id_deliverablestitle1();
3607
+ if (locale === "es") return es_deliverablestitle1();
3608
+ return en_deliverablestitle1();
3609
+ });
3610
+ //#endregion
3227
3611
  //#region src/lib/paraglide/messages/dirbreadcrumbs1.js
3228
3612
  /** @typedef {import('../runtime.js').LocalizedString} LocalizedString */
3229
3613
  /** @typedef {{}} Dirbreadcrumbs1Inputs */
@@ -14422,6 +14806,16 @@ var _index_exports = /* @__PURE__ */ __exportAll({
14422
14806
  backToWorkspace: () => backtoworkspace2,
14423
14807
  broadcast: () => broadcast,
14424
14808
  broadcastSyncedTo: () => broadcastsyncedto2,
14809
+ browserBack: () => browserback1,
14810
+ browserChipLabel: () => browserchiplabel2,
14811
+ browserForward: () => browserforward1,
14812
+ browserLaunching: () => browserlaunching1,
14813
+ browserOpenTitle: () => browseropentitle2,
14814
+ browserPanelTitle: () => browserpaneltitle2,
14815
+ browserReload: () => browserreload1,
14816
+ browserSessionFailed: () => browsersessionfailed2,
14817
+ browserUrlPlaceholder: () => browserurlplaceholder2,
14818
+ browserWaitingFrames: () => browserwaitingframes2,
14425
14819
  cacheHit: () => cachehit1,
14426
14820
  cachedInput: () => cachedinput1,
14427
14821
  cancel: () => cancel,
@@ -14495,6 +14889,8 @@ var _index_exports = /* @__PURE__ */ __exportAll({
14495
14889
  del: () => del,
14496
14890
  delete: () => _delete,
14497
14891
  deleting: () => deleting,
14892
+ deliverablesFiles: () => deliverablesfiles1,
14893
+ deliverablesTitle: () => deliverablestitle1,
14498
14894
  dirBreadcrumbs: () => dirbreadcrumbs1,
14499
14895
  discardBroadcast: () => discardbroadcast1,
14500
14896
  discardBroadcastTitle: () => discardbroadcasttitle2,
@@ -14880,6 +15276,16 @@ var messages_exports = /* @__PURE__ */ __exportAll({
14880
15276
  backToWorkspace: () => backtoworkspace2,
14881
15277
  broadcast: () => broadcast,
14882
15278
  broadcastSyncedTo: () => broadcastsyncedto2,
15279
+ browserBack: () => browserback1,
15280
+ browserChipLabel: () => browserchiplabel2,
15281
+ browserForward: () => browserforward1,
15282
+ browserLaunching: () => browserlaunching1,
15283
+ browserOpenTitle: () => browseropentitle2,
15284
+ browserPanelTitle: () => browserpaneltitle2,
15285
+ browserReload: () => browserreload1,
15286
+ browserSessionFailed: () => browsersessionfailed2,
15287
+ browserUrlPlaceholder: () => browserurlplaceholder2,
15288
+ browserWaitingFrames: () => browserwaitingframes2,
14883
15289
  cacheHit: () => cachehit1,
14884
15290
  cachedInput: () => cachedinput1,
14885
15291
  cancel: () => cancel,
@@ -14953,6 +15359,8 @@ var messages_exports = /* @__PURE__ */ __exportAll({
14953
15359
  del: () => del,
14954
15360
  delete: () => _delete,
14955
15361
  deleting: () => deleting,
15362
+ deliverablesFiles: () => deliverablesfiles1,
15363
+ deliverablesTitle: () => deliverablestitle1,
14956
15364
  dirBreadcrumbs: () => dirbreadcrumbs1,
14957
15365
  discardBroadcast: () => discardbroadcast1,
14958
15366
  discardBroadcastTitle: () => discardbroadcasttitle2,
@@ -15461,6 +15869,29 @@ function Bookmark_plus($$renderer, $$props) {
15461
15869
  ]));
15462
15870
  }
15463
15871
  //#endregion
15872
+ //#region node_modules/.pnpm/@lucide+svelte@1.35.0_svelte@5.56.10/node_modules/@lucide/svelte/dist/icons/bot.svelte
15873
+ function Bot($$renderer, $$props) {
15874
+ let { $$slots, $$events, ...props } = $$props;
15875
+ Icon($$renderer, spread_props([
15876
+ { name: "bot" },
15877
+ props,
15878
+ { iconNode: [
15879
+ ["path", { "d": "M12 8V4H8" }],
15880
+ ["rect", {
15881
+ "width": "16",
15882
+ "height": "12",
15883
+ "x": "4",
15884
+ "y": "8",
15885
+ "rx": "2"
15886
+ }],
15887
+ ["path", { "d": "M2 14h2" }],
15888
+ ["path", { "d": "M20 14h2" }],
15889
+ ["path", { "d": "M15 13v2" }],
15890
+ ["path", { "d": "M9 13v2" }]
15891
+ ] }
15892
+ ]));
15893
+ }
15894
+ //#endregion
15464
15895
  //#region node_modules/.pnpm/@lucide+svelte@1.35.0_svelte@5.56.10/node_modules/@lucide/svelte/dist/icons/camera.svelte
15465
15896
  function Camera($$renderer, $$props) {
15466
15897
  let { $$slots, $$events, ...props } = $$props;
@@ -15853,6 +16284,21 @@ function Moon($$renderer, $$props) {
15853
16284
  ]));
15854
16285
  }
15855
16286
  //#endregion
16287
+ //#region node_modules/.pnpm/@lucide+svelte@1.35.0_svelte@5.56.10/node_modules/@lucide/svelte/dist/icons/package.svelte
16288
+ function Package($$renderer, $$props) {
16289
+ let { $$slots, $$events, ...props } = $$props;
16290
+ Icon($$renderer, spread_props([
16291
+ { name: "package" },
16292
+ props,
16293
+ { iconNode: [
16294
+ ["path", { "d": "M11 21.73a2 2 0 0 0 2 0l7-4A2 2 0 0 0 21 16V8a2 2 0 0 0-1-1.73l-7-4a2 2 0 0 0-2 0l-7 4A2 2 0 0 0 3 8v8a2 2 0 0 0 1 1.73z" }],
16295
+ ["path", { "d": "M12 22V12" }],
16296
+ ["polyline", { "points": "3.29 7 12 12 20.71 7" }],
16297
+ ["path", { "d": "m7.5 4.27 9 5.15" }]
16298
+ ] }
16299
+ ]));
16300
+ }
16301
+ //#endregion
15856
16302
  //#region node_modules/.pnpm/@lucide+svelte@1.35.0_svelte@5.56.10/node_modules/@lucide/svelte/dist/icons/panel-left-close.svelte
15857
16303
  function Panel_left_close($$renderer, $$props) {
15858
16304
  let { $$slots, $$events, ...props } = $$props;
@@ -18337,7 +18783,7 @@ function ThemeToggle($$renderer, $$props) {
18337
18783
  }
18338
18784
  //#endregion
18339
18785
  //#region package.json
18340
- var version = "0.6.20";
18786
+ var version = "0.7.0";
18341
18787
  var dsh = { "webVersion": "0.2.1-rc.2" };
18342
18788
  //#endregion
18343
18789
  //#region src/lib/version.ts
@@ -19031,6 +19477,11 @@ function createConversationStore(sessionId) {
19031
19477
  * server first delivers the pair (older host / projections not
19032
19478
  * composed); the panel keeps its partial fold then. */
19033
19479
  let ledgerStats = null;
19480
+ /** The session's presented-file inventory (ADR-0027f D1): raw-lane
19481
+ * deliveries, cold-seeded/resync-replaced wholesale, delta-appended by
19482
+ * callId (idempotent — at-least-once polls never duplicate). Empty =
19483
+ * no presents yet (the anchor button's render gate). */
19484
+ let deliverables = [];
19034
19485
  /**
19035
19486
  * Cold/resync seed (authoritative replace, the entries semantics): the
19036
19487
  * projections baseline (null = the host ships none) and the window's
@@ -19146,6 +19597,25 @@ function createConversationStore(sessionId) {
19146
19597
  if (poll.plan !== void 0) planMode = poll.plan;
19147
19598
  if (poll.goal !== void 0) goal = poll.goal;
19148
19599
  if (poll.ledgerStats !== void 0) ledgerStats = poll.ledgerStats;
19600
+ if (poll.deliverables !== void 0) applyDeliverables(poll.deliverables);
19601
+ }
19602
+ /**
19603
+ * Fold raw-lane deliveries in (ADR-0027f D1): append by callId — an
19604
+ * already-known callId is a re-delivered poll delta, skipped whole.
19605
+ */
19606
+ function applyDeliverables(delta) {
19607
+ if (delta.length === 0) return;
19608
+ const known = new Set(deliverables.map((d) => d.callId));
19609
+ const fresh = delta.filter((d) => !known.has(d.callId));
19610
+ if (fresh.length === 0) return;
19611
+ deliverables = [...deliverables, ...fresh];
19612
+ }
19613
+ /**
19614
+ * Seed the inventory (cold load + resync — authoritative replace, the
19615
+ * ledger's append-only truth re-read whole; ADR-0027f D1).
19616
+ */
19617
+ function seedDeliverables(next) {
19618
+ deliverables = [...next];
19149
19619
  }
19150
19620
  /**
19151
19621
  * Seed the live imageLimits projection (resync path — the delta seed
@@ -19198,13 +19668,14 @@ function createConversationStore(sessionId) {
19198
19668
  * SAME replace-by-rpcId rules as the delta path, so a page stuck
19199
19669
  * resyncing still renders pending/settled cards.
19200
19670
  */
19201
- function resyncFromLedgerEntries(next, lastSeq, running, permissionSeed, answers) {
19671
+ function resyncFromLedgerEntries(next, lastSeq, running, permissionSeed, answers, deliverablesSeed) {
19202
19672
  const pendingOptimistic = entries.filter((e) => e.kind === "user-message" && "local" in e && e.local === true);
19203
19673
  replaceAll(next);
19204
19674
  if (pendingOptimistic.length > 0) entries = mergeEntries(entries, pendingOptimistic);
19205
19675
  applyStatus(running, lastSeq);
19206
19676
  dedupeOptimistic();
19207
19677
  if (permissionSeed !== void 0) seedPermission(permissionSeed.permission, permissionSeed.knobEvents);
19678
+ if (deliverablesSeed !== void 0) seedDeliverables(deliverablesSeed);
19208
19679
  applyAnswers(answers?.pendingAnswers, answers?.settledAnswers);
19209
19680
  }
19210
19681
  /** Acquire the per-rpcId in-flight lock (false = already locked). */
@@ -19312,7 +19783,13 @@ function createConversationStore(sessionId) {
19312
19783
  get ledgerStats() {
19313
19784
  return ledgerStats;
19314
19785
  },
19786
+ /** The session's presented-file inventory (ADR-0027f); empty =
19787
+ * no presents (the DeliverablesButton gate). */
19788
+ get deliverables() {
19789
+ return deliverables;
19790
+ },
19315
19791
  seedImageLimits,
19792
+ seedDeliverables,
19316
19793
  seedTodos,
19317
19794
  seedPlanMode,
19318
19795
  seedGoal,
@@ -19427,7 +19904,7 @@ function createPollingOrchestrator(store, deps = {}) {
19427
19904
  }, {
19428
19905
  pendingAnswers: body.pendingAnswers,
19429
19906
  settledAnswers: body.settledAnswers
19430
- });
19907
+ }, body.deliverables ?? []);
19431
19908
  store.applyLiveStream(body.liveStream);
19432
19909
  store.seedImageLimits(body.imageLimits ?? null);
19433
19910
  store.seedTodos(body.todos ?? null);
@@ -21371,6 +21848,7 @@ function workspaceFileTitle(path) {
21371
21848
  */
21372
21849
  function panelHeaderLabel(panel) {
21373
21850
  if (panel.kind === "terminal") return "Terminal";
21851
+ if (panel.kind === "browser") return "Browser";
21374
21852
  if (panel.kind === "prompt-manager") return MANAGER_ROW_TITLE;
21375
21853
  if (panel.kind === "skill-shelf") return "Skill Shelf";
21376
21854
  if (panel.kind === "plugin-rack") return "Plugin Rack";
@@ -21399,9 +21877,9 @@ function panelRowsFor(input) {
21399
21877
  const { panels, spineRows, coldCache, deadSessions, edgeCache, lineageFacts, moveFacts } = input;
21400
21878
  const openSessionIds = openSessionIdsOf(panels);
21401
21879
  return panels.map((p, index) => {
21402
- if (p.kind === "terminal" || p.kind === "prompt-manager" || p.kind === "settings-editor" || p.kind === "skill-shelf" || p.kind === "plugin-rack") return {
21880
+ if (p.kind === "terminal" || p.kind === "browser" || p.kind === "prompt-manager" || p.kind === "settings-editor" || p.kind === "skill-shelf" || p.kind === "plugin-rack") return {
21403
21881
  panel: p,
21404
- title: p.kind === "terminal" ? "Terminal" : p.kind === "prompt-manager" ? MANAGER_ROW_TITLE : p.kind === "skill-shelf" ? "Skill Shelf" : p.kind === "plugin-rack" ? "Plugin Rack" : SETTINGS_ROW_TITLE[p.target],
21882
+ title: p.kind === "terminal" ? "Terminal" : p.kind === "browser" ? "Browser" : p.kind === "prompt-manager" ? MANAGER_ROW_TITLE : p.kind === "skill-shelf" ? "Skill Shelf" : p.kind === "plugin-rack" ? "Plugin Rack" : p.kind === "settings-editor" ? SETTINGS_ROW_TITLE[p.target] : "",
21405
21883
  workspace: null,
21406
21884
  dead: false,
21407
21885
  running: false,
@@ -23457,20 +23935,26 @@ function ToolsAndStatusHeader($$renderer, $$props) {
23457
23935
  $$renderer.push(`<div data-svelte="ToolsAndStatusHeader" class="ml-auto flex items-center gap-1">`);
23458
23936
  OpenParentButton($$renderer, { parentSessionId });
23459
23937
  $$renderer.push(`<!----> `);
23938
+ if (agentId) {
23939
+ $$renderer.push("<!--[0-->");
23940
+ $$renderer.push(`<button type="button" class="shrink-0 rounded-md p-1 text-text-muted hover:bg-surface-alt hover:text-text-secondary" data-testid="agent-chip-copy-id"${attr("aria-label", t(copyagentpresetid3))}${attr("title", agentId)}>`);
23941
+ $$renderer.push("<!--[-1-->");
23942
+ Copy($$renderer, {
23943
+ size: 12,
23944
+ "aria-hidden": "true"
23945
+ });
23946
+ $$renderer.push(`<!--]--></button>`);
23947
+ } else $$renderer.push("<!--[-1-->");
23948
+ $$renderer.push(`<!--]--> `);
23460
23949
  if (agent) {
23461
23950
  $$renderer.push("<!--[0-->");
23462
23951
  $$renderer.push(`<span class="agent-chip svelte-1uiman" data-testid="agent-chip"${attr("title", agentId ? `agent preset — ${agentId}` : void 0)}>`);
23463
- if (agentId) {
23464
- $$renderer.push("<!--[0-->");
23465
- $$renderer.push(`<button type="button" class="shrink-0" data-testid="agent-chip-copy-id"${attr("aria-label", t(copyagentpresetid3))}${attr("title", agentId)}>`);
23466
- $$renderer.push("<!--[-1-->");
23467
- Copy($$renderer, {
23468
- size: 10,
23469
- "aria-hidden": "true"
23470
- });
23471
- $$renderer.push(`<!--]--></button>`);
23472
- } else $$renderer.push("<!--[-1-->");
23473
- $$renderer.push(`<!--]--> ${escape_html(agent)}</span>`);
23952
+ Bot($$renderer, {
23953
+ size: 12,
23954
+ class: "shrink-0",
23955
+ "aria-hidden": "true"
23956
+ });
23957
+ $$renderer.push(`<!----> ${escape_html(agent)}</span>`);
23474
23958
  } else $$renderer.push("<!--[-1-->");
23475
23959
  $$renderer.push(`<!--]--> `);
23476
23960
  PlanModeChip($$renderer, { plan });
@@ -23497,38 +23981,45 @@ function ToolsAndStatusHeader($$renderer, $$props) {
23497
23981
  //#endregion
23498
23982
  //#region src/lib/components/conversation/ConversationHeader.svelte
23499
23983
  function ConversationHeader($$renderer, $$props) {
23500
- /**
23501
- * ConversationHeader — the conversation page's top bar (extracted
23502
- * from the page, 2026-08-24): the identity cluster (SessionIdAndName:
23503
- * copy-id prefix, workspace chip, title display, inline rename) on
23504
- * the left; the agent chip, the running/idle status, the session
23505
- * fork (2026-09-01), and the conversation capture on the right
23506
- * (ToolsAndStatusHeader, extracted 2026-08-24). Purely presentational
23507
- * — title state and the streaming flag arrive as props; writes report
23508
- * upward.
23509
- */
23510
- let { sessionId, title, workspace = null, workspaces = [], access = null, agent, agentId = null, isStreaming, transcript = null, subagent = false, plan = null, parentSessionId = null, focused = false, onOpenExplorer = void 0 } = $$props;
23511
- $$renderer.push(`<header data-svelte="ConversationHeader"${attr_class(`flex items-center gap-3 border-b border-surface-border px-2 py-1 ${focused ? "bg-header-wash" : "bg-surface-elevated"}`)} data-testid="conversation-header"${attr("data-focused", focused ? "true" : "false")}>`);
23512
- SessionIdAndName($$renderer, {
23513
- sessionId,
23514
- title,
23515
- workspace,
23516
- workspaces,
23517
- access,
23518
- subagent,
23519
- onOpenExplorer
23520
- });
23521
- $$renderer.push(`<!----> `);
23522
- ToolsAndStatusHeader($$renderer, {
23523
- agent,
23524
- agentId,
23525
- isStreaming,
23526
- transcript,
23527
- plan,
23528
- parentSessionId,
23529
- subagent
23984
+ $$renderer.component(($$renderer) => {
23985
+ /**
23986
+ * ConversationHeader — the conversation page's top bar (extracted
23987
+ * from the page, 2026-08-24): the identity cluster (SessionIdAndName:
23988
+ * copy-id prefix, workspace chip, title display, inline rename) on
23989
+ * the left; the agent chip, the running/idle status, the session
23990
+ * fork (2026-09-01), and the conversation capture on the right
23991
+ * (ToolsAndStatusHeader, extracted 2026-08-24). Purely presentational
23992
+ * — title state and the streaming flag arrive as props; writes report
23993
+ * upward.
23994
+ */
23995
+ let { sessionId, title, workspace = null, workspaces = [], access = null, agent, agentId = null, isStreaming, transcript = null, subagent = false, plan = null, parentSessionId = null, focused = false, onOpenExplorer = void 0, onOpenBrowser = void 0 } = $$props;
23996
+ $$renderer.push(`<header data-svelte="ConversationHeader"${attr_class(`flex items-center gap-3 border-b border-surface-border px-2 py-1 ${focused ? "bg-header-wash" : "bg-surface-elevated"}`)} data-testid="conversation-header"${attr("data-focused", focused ? "true" : "false")}>`);
23997
+ SessionIdAndName($$renderer, {
23998
+ sessionId,
23999
+ title,
24000
+ workspace,
24001
+ workspaces,
24002
+ access,
24003
+ subagent,
24004
+ onOpenExplorer
24005
+ });
24006
+ $$renderer.push(`<!----> `);
24007
+ if (onOpenBrowser) {
24008
+ $$renderer.push("<!--[0-->");
24009
+ $$renderer.push(`<button class="rounded border border-surface-border px-1.5 py-0.5 text-xs hover:bg-surface-active" data-testid="open-browser"${attr("title", browseropentitle2())}>${escape_html(browserchiplabel2())}</button>`);
24010
+ } else $$renderer.push("<!--[-1-->");
24011
+ $$renderer.push(`<!--]--> `);
24012
+ ToolsAndStatusHeader($$renderer, {
24013
+ agent,
24014
+ agentId,
24015
+ isStreaming,
24016
+ transcript,
24017
+ plan,
24018
+ parentSessionId,
24019
+ subagent
24020
+ });
24021
+ $$renderer.push(`<!----></header>`);
23530
24022
  });
23531
- $$renderer.push(`<!----></header>`);
23532
24023
  }
23533
24024
  //#endregion
23534
24025
  //#region src/lib/components/message/LoadOlderSentinel.svelte
@@ -27935,13 +28426,13 @@ function FloatingAnchorContainerPopup($$renderer, $$props) {
27935
28426
  * `titleTestId` exists because the header's data-testid is part of
27936
28427
  * each leaf's pinned surface (plan-popup-header, user-message-jumper-header).
27937
28428
  */
27938
- let { open = false, triggerEl = void 0, title = void 0, titleTestId = void 0, popupTestId = "floating-anchor-popup", children } = $$props;
28429
+ let { open = false, triggerEl = void 0, title = void 0, titleTestId = void 0, popupTestId = "floating-anchor-popup", fitWidth = false, children } = $$props;
27939
28430
  /** Focus the box — leaves call it through bind:this when an action
27940
28431
  * must hand focus back (the jumper's stay-open jump). */
27941
28432
  function focus() {}
27942
28433
  if (open) {
27943
28434
  $$renderer.push("<!--[0-->");
27944
- $$renderer.push(`<div data-svelte="FloatingAnchorContainerPopup" tabindex="-1" class="pointer-events-auto absolute right-full top-1/2 z-50 mr-2 max-h-[60vh] w-96 max-w-[80vw] -translate-y-1/2 overflow-y-auto rounded-lg border border-surface-border bg-surface-elevated py-1 shadow-xl outline-none focus:outline-none"${attr("data-testid", popupTestId)}>`);
28435
+ $$renderer.push(`<div data-svelte="FloatingAnchorContainerPopup" tabindex="-1"${attr_class(`pointer-events-auto absolute right-full top-1/2 z-50 mr-2 max-h-[60vh] max-w-[80vw] -translate-y-1/2 overflow-y-auto rounded-lg border border-surface-border bg-surface-elevated py-1 shadow-xl outline-none focus:outline-none ${fitWidth ? "w-fit" : "w-96"}`)}${attr("data-testid", popupTestId)}>`);
27945
28436
  if (title !== void 0) {
27946
28437
  $$renderer.push("<!--[0-->");
27947
28438
  $$renderer.push(`<div class="border-b border-surface-border px-2.5 py-1.5 text-[10px] font-medium uppercase tracking-wider text-text-muted"${attr("data-testid", titleTestId)}>${escape_html(title)}</div>`);
@@ -27958,7 +28449,7 @@ function FloatingAnchorContainerPopup($$renderer, $$props) {
27958
28449
  });
27959
28450
  }
27960
28451
  //#endregion
27961
- //#region src/lib/components/anchor/user-messages/UserMessageJumper.svelte
28452
+ //#region src/lib/components/anchor/user-msg-anchor/UserMessageJumper.svelte
27962
28453
  function UserMessageJumper($$renderer, $$props) {
27963
28454
  $$renderer.component(($$renderer) => {
27964
28455
  /**
@@ -28013,7 +28504,7 @@ function UserMessageJumper($$renderer, $$props) {
28013
28504
  });
28014
28505
  }
28015
28506
  //#endregion
28016
- //#region src/lib/components/anchor/user-messages/UserMessagesButton.svelte
28507
+ //#region src/lib/components/anchor/user-msg-anchor/UserMessagesButton.svelte
28017
28508
  function UserMessagesButton($$renderer, $$props) {
28018
28509
  $$renderer.component(($$renderer) => {
28019
28510
  /**
@@ -28045,7 +28536,7 @@ function UserMessagesButton($$renderer, $$props) {
28045
28536
  function $$render_inner($$renderer) {
28046
28537
  if (container !== void 0 && groups.some((g) => g.kind === "prompt")) {
28047
28538
  $$renderer.push("<!--[0-->");
28048
- $$renderer.push(`<div data-svelte="UserMessagesButton" class="relative"><button type="button"${attr_class("floating-anchor-btn tone-cyan svelte-onysyu", void 0, { "active": open })}${attr("title", t(usermessagestitle2))} data-testid="user-messages-button">`);
28539
+ $$renderer.push(`<div data-svelte="UserMessagesButton" class="relative"><button type="button"${attr_class("floating-anchor-btn tone-cyan svelte-7ykxqh", void 0, { "active": open })}${attr("title", t(usermessagestitle2))} data-testid="user-messages-button">`);
28049
28540
  Message_square_text($$renderer, { size: 14 });
28050
28541
  $$renderer.push(`<!----></button> `);
28051
28542
  UserMessageJumper($$renderer, {
@@ -28081,7 +28572,7 @@ function BackToTheEdgeButton($$renderer, $$props) {
28081
28572
  });
28082
28573
  }
28083
28574
  //#endregion
28084
- //#region src/lib/components/anchor/plan/PlanPopup.svelte
28575
+ //#region src/lib/components/anchor/plan-anchor/PlanPopup.svelte
28085
28576
  function PlanPopup($$renderer, $$props) {
28086
28577
  $$renderer.component(($$renderer) => {
28087
28578
  /**
@@ -28130,7 +28621,7 @@ function PlanPopup($$renderer, $$props) {
28130
28621
  });
28131
28622
  }
28132
28623
  //#endregion
28133
- //#region src/lib/components/anchor/plan/PlanButton.svelte
28624
+ //#region src/lib/components/anchor/plan-anchor/PlanButton.svelte
28134
28625
  function PlanButton($$renderer, $$props) {
28135
28626
  $$renderer.component(($$renderer) => {
28136
28627
  /**
@@ -28164,7 +28655,7 @@ function PlanButton($$renderer, $$props) {
28164
28655
  function $$render_inner($$renderer) {
28165
28656
  if (items().length > 0) {
28166
28657
  $$renderer.push("<!--[0-->");
28167
- $$renderer.push(`<div data-svelte="PlanButton" class="relative"><button type="button"${attr_class("floating-anchor-btn tone-purple svelte-d0p77f", void 0, { "active": open })}${attr("title", t(currentplan1) + done() + "/" + items().length + t(donepart1))} data-testid="plan-button">`);
28658
+ $$renderer.push(`<div data-svelte="PlanButton" class="relative"><button type="button"${attr_class("floating-anchor-btn tone-purple svelte-65h8xp", void 0, { "active": open })}${attr("title", t(currentplan1) + done() + "/" + items().length + t(donepart1))} data-testid="plan-button">`);
28168
28659
  List_checks($$renderer, { size: 14 });
28169
28660
  $$renderer.push(`<!----></button> `);
28170
28661
  PlanPopup($$renderer, {
@@ -28191,7 +28682,127 @@ function PlanButton($$renderer, $$props) {
28191
28682
  });
28192
28683
  }
28193
28684
  //#endregion
28194
- //#region src/lib/components/anchor/job/JobsPopup.svelte
28685
+ //#region src/lib/components/anchor/deliverables-anchor/DeliverablesPopup.svelte
28686
+ function DeliverablesPopup($$renderer, $$props) {
28687
+ $$renderer.component(($$renderer) => {
28688
+ /**
28689
+ * DeliverablesPopup — the session's presented-file inventory
28690
+ * (ADR-0027f, D3, row format amended 2026-10-19): ONE line per file
28691
+ * across every present event, newest turn last — the description is
28692
+ * the label (active foreground), falling back to the bare filename
28693
+ * when the model supplied none; the full path rides the hover title
28694
+ * and the row's CopyButton, never the visible line. Extracted from
28695
+ * DeliverablesButton on
28696
+ * the PlanPopup pattern (content vs chrome): hosting lives in
28697
+ * FloatingAnchorContainerPopup (placement, width cap, close
28698
+ * contract); this leaf renders ONLY the rows. A row click opens the
28699
+ * file through the transcript's file-open seat — the popup is an
28700
+ * inventory with a jump, never a copy (the ledger's path is truth).
28701
+ */
28702
+ let { deliveries, triggerEl, open = false, onopen } = $$props;
28703
+ const fileCount = derived(() => deliveries.reduce((n, d) => n + d.files.length, 0));
28704
+ /** The row's label: bare filename, extension stripped (ADR-0027f
28705
+ * D3 amendment 2026-10-19 — the full path rides the hover title
28706
+ * and the row's CopyButton, never the visible line). */
28707
+ function displayName(path) {
28708
+ const base = path.split("/").pop() ?? path;
28709
+ const dot = base.lastIndexOf(".");
28710
+ return dot > 0 ? base.slice(0, dot) : base;
28711
+ }
28712
+ FloatingAnchorContainerPopup($$renderer, {
28713
+ open,
28714
+ triggerEl,
28715
+ fitWidth: true,
28716
+ title: `${stringify(t(deliverablestitle1))}${stringify(fileCount())}${stringify(t(deliverablesfiles1))}`,
28717
+ titleTestId: "deliverables-popup-header",
28718
+ popupTestId: "deliverables-popup",
28719
+ children: ($$renderer) => {
28720
+ $$renderer.push(`<!--[-->`);
28721
+ const each_array = ensure_array_like(deliveries);
28722
+ for (let $$index_1 = 0, $$length = each_array.length; $$index_1 < $$length; $$index_1++) {
28723
+ let delivery = each_array[$$index_1];
28724
+ $$renderer.push(`<!--[-->`);
28725
+ const each_array_1 = ensure_array_like(delivery.files);
28726
+ for (let $$index = 0, $$length = each_array_1.length; $$index < $$length; $$index++) {
28727
+ let file = each_array_1[$$index];
28728
+ $$renderer.push(`<button type="button" class="flex w-full items-center gap-1.5 border-b border-surface-border/30 px-2 py-1 text-left text-xs last:border-b-0 hover:bg-surface-border/20" data-testid="deliverables-popup-row"${attr("data-turn", delivery.turn)}${attr("title", file.path)}>`);
28729
+ CopyButton($$renderer, {
28730
+ value: file.path,
28731
+ title: t(copyfullpath2),
28732
+ size: 10,
28733
+ class: "shrink-0 rounded p-0.5 text-text-muted hover:bg-surface-hover hover:text-text-secondary"
28734
+ });
28735
+ $$renderer.push(`<!----> <span class="min-w-0 flex-1 truncate text-text-primary">${escape_html(file.description ?? displayName(file.path))}</span></button>`);
28736
+ }
28737
+ $$renderer.push(`<!--]-->`);
28738
+ }
28739
+ $$renderer.push(`<!--]-->`);
28740
+ },
28741
+ $$slots: { default: true }
28742
+ });
28743
+ bind_props($$props, { open });
28744
+ });
28745
+ }
28746
+ //#endregion
28747
+ //#region src/lib/components/anchor/deliverables-anchor/DeliverablesButton.svelte
28748
+ function DeliverablesButton($$renderer, $$props) {
28749
+ $$renderer.component(($$renderer) => {
28750
+ /**
28751
+ * DeliverablesButton — the Deliverables leaf of the floating anchor
28752
+ * stack (ADR-0027f, D2): the session's presented-file inventory as
28753
+ * one click, beside the transcript. Behaves like PlanButton: the
28754
+ * button owns its popup's open state and the trigger element while
28755
+ * DeliverablesPopup renders the rows — the wrapper div is the
28756
+ * popup's triggerEl, and the opening click bubbles to the window
28757
+ * outside-click handler without closing what it just opened.
28758
+ *
28759
+ * Renders NOTHING while the inventory is empty (null/[] — no present
28760
+ * ever landed; omit, never approximate). Tone CSS is OCI's verbatim
28761
+ * pattern (scoped style, var + fallback) — teal marks the hand-off
28762
+ * family (files the agent gave you).
28763
+ */
28764
+ let { deliveries, onfileopen } = $$props;
28765
+ /** Popup open state — the active tone mirrors it on the button. */
28766
+ let open = false;
28767
+ /** The popup's trigger exclusion element (the wrapper div). */
28768
+ let triggerEl = void 0;
28769
+ /** Null-safe list — the render gate reads this, never the raw prop. */
28770
+ const items = derived(() => deliveries ?? []);
28771
+ const fileCount = derived(() => items().reduce((n, d) => n + d.files.length, 0));
28772
+ let $$settled = true;
28773
+ let $$inner_renderer;
28774
+ function $$render_inner($$renderer) {
28775
+ if (items().length > 0) {
28776
+ $$renderer.push("<!--[0-->");
28777
+ $$renderer.push(`<div data-svelte="DeliverablesButton" class="relative"><button type="button"${attr_class("floating-anchor-btn tone-teal svelte-1mhticx", void 0, { "active": open })}${attr("title", t(deliverablestitle1) + fileCount() + t(deliverablesfiles1))} data-testid="deliverables-button">`);
28778
+ Package($$renderer, { size: 14 });
28779
+ $$renderer.push(`<!----></button> `);
28780
+ DeliverablesPopup($$renderer, {
28781
+ deliveries: items(),
28782
+ triggerEl,
28783
+ onopen: onfileopen,
28784
+ get open() {
28785
+ return open;
28786
+ },
28787
+ set open($$value) {
28788
+ open = $$value;
28789
+ $$settled = false;
28790
+ }
28791
+ });
28792
+ $$renderer.push(`<!----></div>`);
28793
+ } else $$renderer.push("<!--[-1-->");
28794
+ $$renderer.push(`<!--]-->`);
28795
+ }
28796
+ do {
28797
+ $$settled = true;
28798
+ $$inner_renderer = $$renderer.copy();
28799
+ $$render_inner($$inner_renderer);
28800
+ } while (!$$settled);
28801
+ $$renderer.subsume($$inner_renderer);
28802
+ });
28803
+ }
28804
+ //#endregion
28805
+ //#region src/lib/components/anchor/job-anchor/JobsPopup.svelte
28195
28806
  function JobsPopup($$renderer, $$props) {
28196
28807
  $$renderer.component(($$renderer) => {
28197
28808
  /**
@@ -28233,7 +28844,7 @@ function JobsPopup($$renderer, $$props) {
28233
28844
  });
28234
28845
  }
28235
28846
  //#endregion
28236
- //#region src/lib/components/anchor/job/JobsButton.svelte
28847
+ //#region src/lib/components/anchor/job-anchor/JobsButton.svelte
28237
28848
  function JobsButton($$renderer, $$props) {
28238
28849
  $$renderer.component(($$renderer) => {
28239
28850
  /**
@@ -28263,7 +28874,7 @@ function JobsButton($$renderer, $$props) {
28263
28874
  function $$render_inner($$renderer) {
28264
28875
  if (liveCount() > 0) {
28265
28876
  $$renderer.push("<!--[0-->");
28266
- $$renderer.push(`<div data-svelte="JobsButton" class="relative" data-testid="jobs-button"><button type="button"${attr_class("floating-anchor-btn tone-amber svelte-bs4s7e", void 0, { "active": open })}${attr("title", t(() => liveCount() === 1 ? jobslivetitle_one2({ n: liveCount() }) : jobslivetitle_other2({ n: liveCount() })))} data-testid="jobs-button-trigger"><span class="dot svelte-bs4s7e"></span>${escape_html(liveCount())}</button> `);
28877
+ $$renderer.push(`<div data-svelte="JobsButton" class="relative" data-testid="jobs-button"><button type="button"${attr_class("floating-anchor-btn tone-amber svelte-1jfxn7m", void 0, { "active": open })}${attr("title", t(() => liveCount() === 1 ? jobslivetitle_one2({ n: liveCount() }) : jobslivetitle_other2({ n: liveCount() })))} data-testid="jobs-button-trigger"><span class="dot svelte-1jfxn7m"></span>${escape_html(liveCount())}</button> `);
28267
28878
  JobsPopup($$renderer, {
28268
28879
  triggerEl,
28269
28880
  jobs: jobs(),
@@ -28289,7 +28900,7 @@ function JobsButton($$renderer, $$props) {
28289
28900
  });
28290
28901
  }
28291
28902
  //#endregion
28292
- //#region src/lib/components/anchor/inject/InjectedShelfPopup.svelte
28903
+ //#region src/lib/components/anchor/inject-anchor/InjectedShelfPopup.svelte
28293
28904
  function InjectedShelfPopup($$renderer, $$props) {
28294
28905
  $$renderer.component(($$renderer) => {
28295
28906
  /**
@@ -28312,6 +28923,7 @@ function InjectedShelfPopup($$renderer, $$props) {
28312
28923
  function $$render_inner($$renderer) {
28313
28924
  FloatingAnchorContainerPopup($$renderer, {
28314
28925
  triggerEl,
28926
+ fitWidth: true,
28315
28927
  title: t(() => injectedfiles1({ n: members.length })),
28316
28928
  titleTestId: "injected-shelf-popup-header",
28317
28929
  popupTestId: "injected-shelf-popup",
@@ -28329,15 +28941,15 @@ function InjectedShelfPopup($$renderer, $$props) {
28329
28941
  let m = each_array[i];
28330
28942
  if (i > 0 && members[i - 1].firstLoad === true && m.firstLoad === false) {
28331
28943
  $$renderer.push("<!--[0-->");
28332
- $$renderer.push(`<hr class="shelf-divider svelte-vu3jcu" data-testid="shelf-first-load-divider"/>`);
28944
+ $$renderer.push(`<hr class="shelf-divider svelte-f316d6" data-testid="shelf-first-load-divider"/>`);
28333
28945
  } else $$renderer.push("<!--[-1-->");
28334
- $$renderer.push(`<!--]--> <div class="shelf-item svelte-vu3jcu" data-testid="injected-shelf-item"${attr("data-display-path", m.displayPath)}>`);
28946
+ $$renderer.push(`<!--]--> <div class="shelf-item svelte-f316d6" data-testid="injected-shelf-item"${attr("data-display-path", m.displayPath)}>`);
28335
28947
  CopyButton($$renderer, {
28336
28948
  value: m.origin === "system-prompt" ? injectedRecordFor(entries, m.displayPath)?.text ?? m.displayPath : injectedFullPath(workspace, m.displayPath),
28337
28949
  title: m.origin === "system-prompt" ? "Copy prompt text — a shelf name, not a file" : "Copy full path",
28338
28950
  class: "shelf-copy"
28339
28951
  });
28340
- $$renderer.push(`<!----> <button type="button" role="menuitem" class="shelf-pick svelte-vu3jcu" data-testid="injected-shelf-pick"${attr("title", m.displayPath)}><span class="shelf-pick-path svelte-vu3jcu">${escape_html(m.displayPath)}</span></button></div>`);
28952
+ $$renderer.push(`<!----> <button type="button" role="menuitem" class="shelf-pick svelte-f316d6" data-testid="injected-shelf-pick"${attr("title", m.displayPath)}><span class="shelf-pick-path svelte-f316d6">${escape_html(m.displayPath)}</span></button></div>`);
28341
28953
  }
28342
28954
  $$renderer.push(`<!--]-->`);
28343
28955
  },
@@ -29204,7 +29816,7 @@ async function executeHostCommand(line, ctx, onNote) {
29204
29816
  }
29205
29817
  }
29206
29818
  //#endregion
29207
- //#region src/lib/components/anchor/inject/InjectedShelfButton.svelte
29819
+ //#region src/lib/components/anchor/inject-anchor/InjectedShelfButton.svelte
29208
29820
  function InjectedShelfButton($$renderer, $$props) {
29209
29821
  $$renderer.component(($$renderer) => {
29210
29822
  /**
@@ -29251,7 +29863,7 @@ function InjectedShelfButton($$renderer, $$props) {
29251
29863
  function $$render_inner($$renderer) {
29252
29864
  if (members().length > 0) {
29253
29865
  $$renderer.push("<!--[0-->");
29254
- $$renderer.push(`<div data-svelte="InjectedShelfButton" class="relative svelte-1nrpld0"><button type="button"${attr_class("floating-anchor-btn tone-maroon svelte-1nrpld0", void 0, { "active": open })}${attr("title", t(injectedtitle1))} data-testid="injected-shelf-button">`);
29866
+ $$renderer.push(`<div data-svelte="InjectedShelfButton" class="relative svelte-145ip4c"><button type="button"${attr_class("floating-anchor-btn tone-maroon svelte-145ip4c", void 0, { "active": open })}${attr("title", t(injectedtitle1))} data-testid="injected-shelf-button">`);
29255
29867
  File_text($$renderer, { size: 14 });
29256
29868
  $$renderer.push(`<!----></button> `);
29257
29869
  InjectedShelfPopup($$renderer, {
@@ -29292,13 +29904,18 @@ function ConversationFloatingAnchor($$renderer, $$props) {
29292
29904
  * far-edge jump. Purely presentational — the viewport and turn groups
29293
29905
  * arrive as props.
29294
29906
  */
29295
- let { groups, container, todos = null, jobsessionid = "", shelfentries = void 0, shelfsessionid = "", shelfworkspace = null, shelfpanelid = null, onshelfnote } = $$props;
29907
+ let { groups, container, todos = null, deliverables = null, onfileopen = void 0, jobsessionid = "", shelfentries = void 0, shelfsessionid = "", shelfworkspace = null, shelfpanelid = null, onshelfnote } = $$props;
29296
29908
  if (container !== void 0) {
29297
29909
  $$renderer.push("<!--[0-->");
29298
29910
  FloatingAnchor($$renderer, {
29299
29911
  children: ($$renderer) => {
29300
29912
  PlanButton($$renderer, { todos: todos ?? [] });
29301
29913
  $$renderer.push(`<!----> `);
29914
+ DeliverablesButton($$renderer, {
29915
+ deliveries: deliverables,
29916
+ onfileopen
29917
+ });
29918
+ $$renderer.push(`<!----> `);
29302
29919
  JobsButton($$renderer, { sessionId: jobsessionid });
29303
29920
  $$renderer.push(`<!----> `);
29304
29921
  if (shelfentries !== void 0) {
@@ -30204,7 +30821,7 @@ var Paging = class {
30204
30821
  }
30205
30822
  };
30206
30823
  //#endregion
30207
- //#region src/lib/components/anchor/macro/MacroChip.svelte
30824
+ //#region src/lib/components/bar/macro-bar/MacroChip.svelte
30208
30825
  function MacroChip($$renderer, $$props) {
30209
30826
  $$renderer.component(($$renderer) => {
30210
30827
  /**
@@ -30255,21 +30872,21 @@ function MacroChip($$renderer, $$props) {
30255
30872
  if (run.phase === "stopped") return `macro ⏹ stopped · ${run.note ?? ""}`;
30256
30873
  return `macro ✕ failed · ${run.note ?? ""}`;
30257
30874
  });
30258
- $$renderer.push(`<div data-svelte="MacroChip" class="macro-chip svelte-1hixpzx"${attr("data-phase", run.phase)} data-testid="macro-chip"><button type="button" class="macro-chip-label svelte-1hixpzx"${attr("aria-expanded", expanded)}${attr("title", run.note ?? "Macro run")}><span class="macro-chip-text svelte-1hixpzx">${escape_html(chipLabel())}</span> <span class="macro-chip-caret svelte-1hixpzx">${escape_html(expanded ? "▾" : "▸")}</span></button> `);
30875
+ $$renderer.push(`<div data-svelte="MacroChip" class="macro-chip svelte-8fijc3"${attr("data-phase", run.phase)} data-testid="macro-chip"><button type="button" class="macro-chip-label svelte-8fijc3"${attr("aria-expanded", expanded)}${attr("title", run.note ?? "Macro run")}><span class="macro-chip-text svelte-8fijc3">${escape_html(chipLabel())}</span> <span class="macro-chip-caret svelte-8fijc3">${escape_html(expanded ? "▾" : "▸")}</span></button> `);
30259
30876
  if (canAbort() && onabort) {
30260
30877
  $$renderer.push("<!--[0-->");
30261
- $$renderer.push(`<button type="button" class="macro-stop svelte-1hixpzx" data-testid="macro-stop"${attr("title", t(dropunsubmittedtitle2))}>${escape_html(t(stop))}</button>`);
30878
+ $$renderer.push(`<button type="button" class="macro-stop svelte-8fijc3" data-testid="macro-stop"${attr("title", t(dropunsubmittedtitle2))}>${escape_html(t(stop))}</button>`);
30262
30879
  } else $$renderer.push("<!--[-1-->");
30263
30880
  $$renderer.push(`<!--]--> `);
30264
30881
  if (ended() && onclose) {
30265
30882
  $$renderer.push("<!--[0-->");
30266
- $$renderer.push(`<button type="button" class="macro-close svelte-1hixpzx" data-testid="macro-close"${attr("aria-label", t(dismissrunsheet2))}${attr("title", t(dismiss))}>✕</button>`);
30883
+ $$renderer.push(`<button type="button" class="macro-close svelte-8fijc3" data-testid="macro-close"${attr("aria-label", t(dismissrunsheet2))}${attr("title", t(dismiss))}>✕</button>`);
30267
30884
  } else $$renderer.push("<!--[-1-->");
30268
30885
  $$renderer.push(`<!--]--></div>`);
30269
30886
  });
30270
30887
  }
30271
30888
  //#endregion
30272
- //#region src/lib/components/anchor/macro/MacroBar.svelte
30889
+ //#region src/lib/components/bar/macro-bar/MacroBar.svelte
30273
30890
  function MacroBar($$renderer, $$props) {
30274
30891
  $$renderer.component(($$renderer) => {
30275
30892
  /**
@@ -30291,7 +30908,7 @@ function MacroBar($$renderer, $$props) {
30291
30908
  let expanded = false;
30292
30909
  if (run.phase !== "idle") {
30293
30910
  $$renderer.push("<!--[0-->");
30294
- $$renderer.push(`<div data-svelte="MacroBar" class="macro-run svelte-2yo6ia" data-testid="macro-run">`);
30911
+ $$renderer.push(`<div data-svelte="MacroBar" class="macro-run svelte-1xpxh82" data-testid="macro-run">`);
30295
30912
  MacroChip($$renderer, {
30296
30913
  run,
30297
30914
  running,
@@ -30308,7 +30925,7 @@ function MacroBar($$renderer, $$props) {
30308
30925
  });
30309
30926
  }
30310
30927
  //#endregion
30311
- //#region src/lib/components/anchor/goal/GoalChip.svelte
30928
+ //#region src/lib/components/bar/goal-bar/GoalChip.svelte
30312
30929
  function GoalChip($$renderer, $$props) {
30313
30930
  $$renderer.component(($$renderer) => {
30314
30931
  /**
@@ -30331,31 +30948,31 @@ function GoalChip($$renderer, $$props) {
30331
30948
  /** Which phase action the chip offers: Pause on active, Resume on
30332
30949
  * paused, none on blocked (the host demands a reason fix first). */
30333
30950
  const phaseAction = derived(() => goal.phase === "active" ? "pause" : goal.phase === "paused" ? "resume" : void 0);
30334
- $$renderer.push(`<div data-svelte="GoalChip" class="goal-chip svelte-bjt90x"${attr("data-phase", goal.phase)} data-testid="goal-chip"${attr("title", blockedTitle)}><button type="button" class="goal-chip-label svelte-bjt90x"${attr("aria-expanded", expanded)}${attr("title", blockedTitle ?? goal.objective)}><span class="goal-chip-glyph svelte-bjt90x" aria-hidden="true">${escape_html(glyph())}</span> <span class="goal-chip-text svelte-bjt90x">goal ${escape_html(goal.phase)} · ${escape_html(shortObjective())}</span> <span class="goal-chip-caret svelte-bjt90x">${escape_html(expanded ? "▾" : "▸")}</span></button> `);
30951
+ $$renderer.push(`<div data-svelte="GoalChip" class="goal-chip svelte-ffx44v"${attr("data-phase", goal.phase)} data-testid="goal-chip"${attr("title", blockedTitle)}><button type="button" class="goal-chip-label svelte-ffx44v"${attr("aria-expanded", expanded)}${attr("title", blockedTitle ?? goal.objective)}><span class="goal-chip-glyph svelte-ffx44v" aria-hidden="true">${escape_html(glyph())}</span> <span class="goal-chip-text svelte-ffx44v">goal ${escape_html(goal.phase)} · ${escape_html(shortObjective())}</span> <span class="goal-chip-caret svelte-ffx44v">${escape_html(expanded ? "▾" : "▸")}</span></button> `);
30335
30952
  if (phaseAction() === "pause" && onpause) {
30336
30953
  $$renderer.push("<!--[0-->");
30337
- $$renderer.push(`<button type="button" class="goal-action svelte-bjt90x" data-testid="goal-pause"${attr("title", t(pausegoal1))}>${escape_html(t(pause))}</button>`);
30954
+ $$renderer.push(`<button type="button" class="goal-action svelte-ffx44v" data-testid="goal-pause"${attr("title", t(pausegoal1))}>${escape_html(t(pause))}</button>`);
30338
30955
  } else $$renderer.push("<!--[-1-->");
30339
30956
  $$renderer.push(`<!--]--> `);
30340
30957
  if (phaseAction() === "resume" && onresume) {
30341
30958
  $$renderer.push("<!--[0-->");
30342
- $$renderer.push(`<button type="button" class="goal-action svelte-bjt90x" data-testid="goal-resume"${attr("title", t(resumegoal1))}>${escape_html(t(resume))}</button>`);
30959
+ $$renderer.push(`<button type="button" class="goal-action svelte-ffx44v" data-testid="goal-resume"${attr("title", t(resumegoal1))}>${escape_html(t(resume))}</button>`);
30343
30960
  } else $$renderer.push("<!--[-1-->");
30344
30961
  $$renderer.push(`<!--]--> `);
30345
30962
  if (onedit) {
30346
30963
  $$renderer.push("<!--[0-->");
30347
- $$renderer.push(`<button type="button" class="goal-action svelte-bjt90x" data-testid="goal-edit"${attr("title", t(editobjectivetitle2))}>${escape_html(t(edit))}</button>`);
30964
+ $$renderer.push(`<button type="button" class="goal-action svelte-ffx44v" data-testid="goal-edit"${attr("title", t(editobjectivetitle2))}>${escape_html(t(edit))}</button>`);
30348
30965
  } else $$renderer.push("<!--[-1-->");
30349
30966
  $$renderer.push(`<!--]--> `);
30350
30967
  if (onclear) {
30351
30968
  $$renderer.push("<!--[0-->");
30352
- $$renderer.push(`<button type="button" class="goal-action goal-clear svelte-bjt90x" data-testid="goal-clear"${attr("aria-label", t(clearthegoal2))}${attr("title", t(clearbtn1))}>✕</button>`);
30969
+ $$renderer.push(`<button type="button" class="goal-action goal-clear svelte-ffx44v" data-testid="goal-clear"${attr("aria-label", t(clearthegoal2))}${attr("title", t(clearbtn1))}>✕</button>`);
30353
30970
  } else $$renderer.push("<!--[-1-->");
30354
30971
  $$renderer.push(`<!--]--></div>`);
30355
30972
  });
30356
30973
  }
30357
30974
  //#endregion
30358
- //#region src/lib/components/anchor/goal/GoalEditor.svelte
30975
+ //#region src/lib/components/bar/goal-bar/GoalEditor.svelte
30359
30976
  function GoalEditor($$renderer, $$props) {
30360
30977
  $$renderer.component(($$renderer) => {
30361
30978
  /**
@@ -30366,14 +30983,14 @@ function GoalEditor($$renderer, $$props) {
30366
30983
  * fields and emits callbacks only.
30367
30984
  */
30368
30985
  let { editor} = $$props;
30369
- $$renderer.push(`<div data-svelte="GoalEditor" class="goal-edit-form svelte-yo08sk" data-testid="goal-edit-form"><label class="goal-edit-label svelte-yo08sk"><span>objective</span> <textarea data-testid="goal-edit-objective" rows="2" class="svelte-yo08sk">`);
30986
+ $$renderer.push(`<div data-svelte="GoalEditor" class="goal-edit-form svelte-c4750g" data-testid="goal-edit-form"><label class="goal-edit-label svelte-c4750g"><span>objective</span> <textarea data-testid="goal-edit-objective" rows="2" class="svelte-c4750g">`);
30370
30987
  const $$body = escape_html(editor.objective);
30371
30988
  if ($$body) $$renderer.push(`${$$body}`);
30372
- $$renderer.push(`</textarea></label> <label class="goal-edit-label svelte-yo08sk"><span>${escape_html(t(maxrounds1))}</span> <input type="number" min="1" step="1" data-testid="goal-edit-rounds"${attr("value", editor.maxGoalRounds)} class="svelte-yo08sk"/></label> <div class="goal-controls svelte-yo08sk"><button type="button" data-testid="goal-edit-submit" class="svelte-yo08sk">${escape_html(t(save))}</button> <button type="button" data-testid="goal-edit-cancel" class="svelte-yo08sk">${escape_html(t(cancel))}</button></div></div>`);
30989
+ $$renderer.push(`</textarea></label> <label class="goal-edit-label svelte-c4750g"><span>${escape_html(t(maxrounds1))}</span> <input type="number" min="1" step="1" data-testid="goal-edit-rounds"${attr("value", editor.maxGoalRounds)} class="svelte-c4750g"/></label> <div class="goal-controls svelte-c4750g"><button type="button" data-testid="goal-edit-submit" class="svelte-c4750g">${escape_html(t(save))}</button> <button type="button" data-testid="goal-edit-cancel" class="svelte-c4750g">${escape_html(t(cancel))}</button></div></div>`);
30373
30990
  });
30374
30991
  }
30375
30992
  //#endregion
30376
- //#region src/lib/components/anchor/goal/GoalBar.svelte
30993
+ //#region src/lib/components/bar/goal-bar/GoalBar.svelte
30377
30994
  function GoalBar($$renderer, $$props) {
30378
30995
  $$renderer.component(($$renderer) => {
30379
30996
  /**
@@ -30402,7 +31019,7 @@ function GoalBar($$renderer, $$props) {
30402
31019
  const blockedTitle = derived(() => goal?.phase === "blocked" && goal.blockedReason ? "blocked: " + goal.blockedReason.code + " — " + goal.blockedReason.message : void 0);
30403
31020
  if (goal && goal.phase !== "complete") {
30404
31021
  $$renderer.push("<!--[0-->");
30405
- $$renderer.push(`<div data-svelte="GoalBar" class="goal-bar svelte-reiy" data-testid="goal-bar">`);
31022
+ $$renderer.push(`<div data-svelte="GoalBar" class="goal-bar svelte-fcoddu" data-testid="goal-bar">`);
30406
31023
  GoalChip($$renderer, {
30407
31024
  goal,
30408
31025
  blockedTitle: blockedTitle(),
@@ -30541,7 +31158,7 @@ function ConversationPanel($$renderer, $$props) {
30541
31158
  * existing command banner. Catalog reads fire on first menu open,
30542
31159
  * never at mount (cold sessions stay cold).
30543
31160
  */
30544
- 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, onFileOpen = void 0 } = $$props;
31161
+ 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, deliverables = void 0, a2aRows = [], a2aTitles = {}, onNeedCold = void 0, onClose = void 0, focusComposer = false, oncomposerfocus = void 0, focused = false, onOpenExplorer = void 0, onOpenBrowser = void 0, onFileLink = void 0, onFileOpen = void 0 } = $$props;
30545
31162
  setPanelMode(true);
30546
31163
  setConversationSession(sessionId);
30547
31164
  const store = createConversationStore(sessionId);
@@ -30550,6 +31167,7 @@ function ConversationPanel($$renderer, $$props) {
30550
31167
  store.applyStatus(running, lastSeq);
30551
31168
  store.applyAnswers(pendingAnswers, settledAnswers);
30552
31169
  store.seedPermission(permission, knobEvents);
31170
+ if (deliverables !== void 0) store.seedDeliverables(deliverables);
30553
31171
  /** Chip popup state (2026-08-22, OCI pattern): ONE open chip at a time —
30554
31172
  * the id of the expanded entry; detail renders AFTER the chip row.
30555
31173
  * Per-panel by construction (moved here with the block). */
@@ -30769,7 +31387,8 @@ function ConversationPanel($$renderer, $$props) {
30769
31387
  plan: store.planMode,
30770
31388
  parentSessionId,
30771
31389
  focused,
30772
- onOpenExplorer
31390
+ onOpenExplorer,
31391
+ onOpenBrowser
30773
31392
  });
30774
31393
  $$renderer.push(`<!----> `);
30775
31394
  ConversationError($$renderer, { error: topError() });
@@ -30817,6 +31436,8 @@ function ConversationPanel($$renderer, $$props) {
30817
31436
  groups: groups(),
30818
31437
  container: viewport,
30819
31438
  todos: store.todos ?? null,
31439
+ deliverables: store.deliverables,
31440
+ onfileopen: onFileOpen,
30820
31441
  jobsessionid: sessionId,
30821
31442
  shelfentries: store.entries,
30822
31443
  shelfsessionid: sessionId,
@@ -31186,6 +31807,262 @@ function TerminalDesk($$renderer, $$props) {
31186
31807
  });
31187
31808
  }
31188
31809
  //#endregion
31810
+ //#region src/lib/components/browser/BrowserHeader.svelte
31811
+ function BrowserHeader($$renderer, $$props) {
31812
+ $$renderer.component(($$renderer) => {
31813
+ let { status, reBound = false, sessionId = null, closing = false, busy = false, canBack = false, canForward = false, onclose, onnavigate, onreload, onhistory } = $$props;
31814
+ /** Ephemeral intent, never state (D2): the panel clears it on the
31815
+ * route ANSWER via clearInput() — success or refusal both answer. */
31816
+ let urlText = "";
31817
+ /** The panel's handle: clears the box when the navigate route answers. */
31818
+ function clearInput() {
31819
+ urlText = "";
31820
+ }
31821
+ $$renderer.push(`<div data-svelte="BrowserHeader" class="flex items-center gap-2 border-b border-surface-border px-2 py-1 text-xs"><span class="flex min-w-0 flex-1 items-center gap-2"><button class="rounded px-1 hover:bg-surface-active disabled:opacity-40" data-testid="browser-back"${attr("aria-label", browserback1())}${attr("disabled", busy || !canBack, true)}>←</button> <button class="rounded px-1 hover:bg-surface-active disabled:opacity-40" data-testid="browser-forward"${attr("aria-label", browserforward1())}${attr("disabled", busy || !canForward, true)}>→</button> <button class="rounded px-1 hover:bg-surface-active disabled:opacity-40" data-testid="browser-reload"${attr("aria-label", browserreload1())}${attr("disabled", status !== "live" || busy, true)}>⟳</button> <input class="min-w-0 flex-1 rounded border border-surface-border bg-surface px-2 py-0.5" type="text" data-testid="browser-url-input"${attr("placeholder", browserurlplaceholder2())}${attr("disabled", status !== "live" || busy, true)}${attr("value", urlText)}/></span> <span class="flex items-center gap-2" data-testid="browser-status"${attr("data-status", status)}${attr("data-rebound", reBound)}><span${attr_class(`inline-block h-2 w-2 rounded-full ${status === "live" ? "bg-emerald-500" : status === "failed" || status === "closed" ? "bg-red-500" : "bg-amber-400"}`)}></span> `);
31822
+ if (sessionId) {
31823
+ $$renderer.push("<!--[0-->");
31824
+ $$renderer.push(`<span class="rounded-t-md border border-b-0 border-surface-border bg-surface-elevated px-2 py-0.5 font-mono text-[10px] opacity-80" data-testid="browser-session-tab">${escape_html(sessionId.slice(0, 8))}</span>`);
31825
+ } else $$renderer.push("<!--[-1-->");
31826
+ $$renderer.push(`<!--]--> <button class="rounded px-1 hover:bg-surface-active" data-testid="panel-close"${attr("disabled", closing, true)}>✕</button></span></div>`);
31827
+ bind_props($$props, { clearInput });
31828
+ });
31829
+ }
31830
+ //#endregion
31831
+ //#region src/lib/components/browser/BrowserContent.svelte
31832
+ function BrowserContent($$renderer, $$props) {
31833
+ $$renderer.component(($$renderer) => {
31834
+ let { status, failReason = null, wrap = null, canvas = null, ondown, onup, onmove, onwheel, onkey } = $$props;
31835
+ if (status === "failed") {
31836
+ $$renderer.push("<!--[0-->");
31837
+ $$renderer.push(`<div data-svelte="BrowserContent" class="p-3 text-xs text-red-500" data-testid="browser-failed">${escape_html(browsersessionfailed2({ reason: failReason ?? "" }))}</div>`);
31838
+ } else {
31839
+ $$renderer.push("<!--[-1-->");
31840
+ $$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> `);
31841
+ if (status !== "live") {
31842
+ $$renderer.push("<!--[0-->");
31843
+ $$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>`);
31844
+ } else $$renderer.push("<!--[-1-->");
31845
+ $$renderer.push(`<!--]--></div>`);
31846
+ }
31847
+ $$renderer.push(`<!--]-->`);
31848
+ bind_props($$props, {
31849
+ wrap,
31850
+ canvas
31851
+ });
31852
+ });
31853
+ }
31854
+ //#endregion
31855
+ //#region src/lib/components/browser/mirror-input.ts
31856
+ /** The on-screen rect of the PAGE image inside its wrapper. The frame is
31857
+ * drawn aspect-true (canvas object-contain): when the frame is wider or
31858
+ * taller than the panel the image LETTERBOXES — clicks must map against
31859
+ * this contained rect, not the wrapper (bug 2026-10-19: width-only
31860
+ * scaling zoomed the cursor whenever the frame aspect ≠ panel aspect). */
31861
+ function containedRect(boundsLeft, boundsTop, boundsWidth, boundsHeight, viewportWidth, viewportHeight) {
31862
+ return null;
31863
+ }
31864
+ /** Map a click on the GLASS to viewport CSS pixels. Coordinates outside the
31865
+ * contained image return null — the panel must not dispatch clicks that
31866
+ * land on letterbox bars (they would miss the page). */
31867
+ function scalePoint(clientX, clientY, boundsLeft, boundsTop, boundsWidth, boundsHeight, viewportWidth, viewportHeight) {
31868
+ const rect = containedRect();
31869
+ if (rect === null) return null;
31870
+ if (clientX < rect.left || clientX > rect.left + rect.width) return null;
31871
+ if (clientY < rect.top || clientY > rect.top + rect.height) return null;
31872
+ return {
31873
+ x: Math.round((clientX - rect.left) / rect.scale),
31874
+ y: Math.round((clientY - rect.top) / rect.scale)
31875
+ };
31876
+ }
31877
+ /** At most ONE mouseMoved dispatch per animation frame — the flood guard.
31878
+ * The LAST move in a frame wins (the pointer's true position). */
31879
+ function createMoveCoalescer(raf, fire) {
31880
+ let pending = null;
31881
+ let scheduled = false;
31882
+ return { push(x, y) {
31883
+ pending = {
31884
+ x,
31885
+ y
31886
+ };
31887
+ if (scheduled) return;
31888
+ scheduled = true;
31889
+ raf(() => {
31890
+ scheduled = false;
31891
+ const m = pending;
31892
+ pending = null;
31893
+ if (m) fire(m.x, m.y);
31894
+ });
31895
+ } };
31896
+ }
31897
+ //#endregion
31898
+ //#region src/lib/services/panels/browser-session-resolver.ts
31899
+ /**
31900
+ * browser-session-resolver — the ONE re-bind-or-open seam (The Sticky Glass
31901
+ * spec Wave 2 task 2.1; ADR-0030 D1/D4). The chip, the floor placement, and
31902
+ * the panel's remount all ask here; none of them POSTs /api/browser open
31903
+ * directly. Policy: the persisted localStorage id wins if the registry still
31904
+ * lists it live (RE-BIND — reload survival); a dead id falls through to a
31905
+ * fresh open, never an error surface. The resolved id is persisted so the
31906
+ * NEXT reload re-binds too.
31907
+ */
31908
+ var LS_KEY = "dsi.browser.sessionId";
31909
+ /** localStorage guarded — SSR and privacy modes have no window.localStorage. */
31910
+ function defaultStorage() {
31911
+ try {
31912
+ return typeof localStorage !== "undefined" ? localStorage : null;
31913
+ } catch {
31914
+ return null;
31915
+ }
31916
+ }
31917
+ function readPersistedId(storage = defaultStorage()) {
31918
+ try {
31919
+ return storage?.getItem(LS_KEY) ?? null;
31920
+ } catch {
31921
+ return null;
31922
+ }
31923
+ }
31924
+ var IDX_KEY = "dsi.browser.panelIndex";
31925
+ function readPersistedIndex(storage = defaultStorage()) {
31926
+ try {
31927
+ const raw = storage?.getItem(IDX_KEY);
31928
+ const n = raw === null || raw === void 0 ? NaN : Number(raw);
31929
+ return Number.isInteger(n) && n >= 0 ? n : null;
31930
+ } catch {
31931
+ return null;
31932
+ }
31933
+ }
31934
+ //#endregion
31935
+ //#region src/lib/components/browser/BrowserPanel.svelte
31936
+ function BrowserPanel($$renderer, $$props) {
31937
+ $$renderer.component(($$renderer) => {
31938
+ let sessionId = null;
31939
+ /** True when mount re-bound to a surviving session (ADR-0030 D1) —
31940
+ * surfaced in the status strip for the operator. */
31941
+ let reBound = false;
31942
+ let status = "opening";
31943
+ let failReason = null;
31944
+ let canvas = null;
31945
+ let wrap = null;
31946
+ let closing = false;
31947
+ /** Proxy verbs (ADR-0031 D1/D2): the panel ACTS on the header's
31948
+ * intent — one in-flight guard for the whole proxy row, history
31949
+ * bounds from the last navigate answer (the documented give-up). */
31950
+ let proxyBusy = false;
31951
+ let canBack = false;
31952
+ let canForward = false;
31953
+ const moves = createMoveCoalescer((cb) => requestAnimationFrame(cb), (x, y) => void post());
31954
+ async function post(input) {}
31955
+ function toViewportCx(e) {
31956
+ if (!wrap) return null;
31957
+ const r = wrap.getBoundingClientRect();
31958
+ return scalePoint(e.clientX, e.clientY, r.left, r.top, r.width, r.height);
31959
+ }
31960
+ function onPointerDown(e) {
31961
+ if (e.button !== 0) return;
31962
+ const p = toViewportCx(e);
31963
+ if (p) post({
31964
+ x: p.x,
31965
+ y: p.y});
31966
+ }
31967
+ function onPointerUp(e) {
31968
+ if (e.button !== 0) return;
31969
+ const p = toViewportCx(e);
31970
+ if (p) post({
31971
+ x: p.x,
31972
+ y: p.y});
31973
+ }
31974
+ function onPointerMove(e) {
31975
+ const p = toViewportCx(e);
31976
+ if (p) moves.push(p.x, p.y);
31977
+ }
31978
+ function onWheel(e) {
31979
+ const p = toViewportCx(e);
31980
+ if (!p) return;
31981
+ e.preventDefault();
31982
+ post({
31983
+ x: p.x,
31984
+ y: p.y,
31985
+ deltaX: e.deltaX,
31986
+ deltaY: e.deltaY
31987
+ });
31988
+ }
31989
+ function onKey(e) {
31990
+ post({
31991
+ type: e.type === "keydown" ? "keyDown" : "keyUp",
31992
+ key: e.key,
31993
+ code: e.code,
31994
+ windowsVirtualKeyCode: e.keyCode,
31995
+ text: e.type === "keydown" && e.key.length === 1 ? e.key : void 0
31996
+ });
31997
+ }
31998
+ /** One POST for every proxy verb; the ANSWER (success or refusal)
31999
+ * clears the input and refreshes the history bounds. A dead session
32000
+ * surfaces as the closed status, never a crash (404/409). */
32001
+ async function proxy(body) {}
32002
+ function submitUrl(text) {
32003
+ proxy();
32004
+ }
32005
+ function goHistory(dir) {
32006
+ proxy();
32007
+ }
32008
+ /** D8 owner-release: close the SERVER session first (kills the browser),
32009
+ * then report upward so the floor removes the panel. Exactly once —
32010
+ * the closing flag guards double-invocations (the single-close-post
32011
+ * unit contract). */
32012
+ async function closePanel() {}
32013
+ onDestroy(() => {});
32014
+ let $$settled = true;
32015
+ let $$inner_renderer;
32016
+ function $$render_inner($$renderer) {
32017
+ $$renderer.push(`<div data-svelte="BrowserPanel" class="flex h-full flex-col bg-surface-elevated" data-testid="panel-browser">`);
32018
+ BrowserHeader($$renderer, {
32019
+ status,
32020
+ reBound,
32021
+ sessionId,
32022
+ closing,
32023
+ busy: proxyBusy,
32024
+ canBack,
32025
+ canForward,
32026
+ onclose: () => void closePanel(),
32027
+ onnavigate: submitUrl,
32028
+ onreload: () => void proxy(),
32029
+ onhistory: goHistory
32030
+ });
32031
+ $$renderer.push(`<!----> `);
32032
+ BrowserContent($$renderer, {
32033
+ status,
32034
+ failReason,
32035
+ ondown: onPointerDown,
32036
+ onup: onPointerUp,
32037
+ onmove: onPointerMove,
32038
+ onwheel: onWheel,
32039
+ onkey: onKey,
32040
+ get wrap() {
32041
+ return wrap;
32042
+ },
32043
+ set wrap($$value) {
32044
+ wrap = $$value;
32045
+ $$settled = false;
32046
+ },
32047
+ get canvas() {
32048
+ return canvas;
32049
+ },
32050
+ set canvas($$value) {
32051
+ canvas = $$value;
32052
+ $$settled = false;
32053
+ }
32054
+ });
32055
+ $$renderer.push(`<!----></div>`);
32056
+ }
32057
+ do {
32058
+ $$settled = true;
32059
+ $$inner_renderer = $$renderer.copy();
32060
+ $$render_inner($$inner_renderer);
32061
+ } while (!$$settled);
32062
+ $$renderer.subsume($$inner_renderer);
32063
+ });
32064
+ }
32065
+ //#endregion
31189
32066
  //#region src/lib/components/settings-skills/SettingsSkillsToolbar.svelte
31190
32067
  function SettingsSkillsToolbar($$renderer, $$props) {
31191
32068
  $$renderer.component(($$renderer) => {
@@ -33406,6 +34283,22 @@ function openWorkspaceExplorer(sessionId, workspace) {
33406
34283
  }
33407
34284
  insertPanel(makeWorkspaceExplorerPanel(sessionId, workspace), workspaceExplorerSlot(st.panels, selectedIndex_(), d$4().getMoveFacts()));
33408
34285
  }
34286
+ /** Chip click action (The Glass Browser spec W2, ADR-0029 D4): ONE live
34287
+ * browser panel across the floor — the terminal singleton rule (Terminal
34288
+ * Desk ADR D2). A click on an open browser FOCUSES it; a miss inserts at
34289
+ * the focused slot. */
34290
+ function openBrowserPanel(index, keepSelection = false) {
34291
+ const open = st.panels.find((p) => p.kind === "browser");
34292
+ if (open) {
34293
+ st.selectedPanelId = open.id;
34294
+ return;
34295
+ }
34296
+ const prevSelected = st.selectedPanelId;
34297
+ insertPanel(makeBrowserPanel(), index === void 0 ? insertionSlot() : Math.max(0, Math.min(index, st.panels.length)));
34298
+ if (keepSelection && prevSelected !== null && prevSelected !== void 0) {
34299
+ if (st.panels.some((p) => p.id === prevSelected)) st.selectedPanelId = prevSelected;
34300
+ }
34301
+ }
33409
34302
  /** The open explorer for a session's workspace (The Shared Tree D1):
33410
34303
  * matched by ROOT across sessions — the panel's provenance sessionId
33411
34304
  * is not the key. */
@@ -33642,7 +34535,8 @@ async function fetchColdFromWire(sessionId) {
33642
34535
  settledAnswers: events.settledAnswers ?? [],
33643
34536
  permission: events.permission ?? null,
33644
34537
  imageLimits: events.imageLimits ?? null,
33645
- knobEvents: events.knobEvents ?? []
34538
+ knobEvents: events.knobEvents ?? [],
34539
+ deliverables: events.deliverables ?? []
33646
34540
  };
33647
34541
  }
33648
34542
  //#endregion
@@ -33667,6 +34561,13 @@ function makePanel(sessionId, agentPreset) {
33667
34561
  width: clampPanelWidth(d$1().getPanelWidth())
33668
34562
  };
33669
34563
  }
34564
+ function makeBrowserPanel() {
34565
+ return {
34566
+ id: nextPanelId(),
34567
+ kind: "browser",
34568
+ width: clampPanelWidth(d$1().getPanelWidth())
34569
+ };
34570
+ }
33670
34571
  function makeWorkspaceExplorerPanel(sessionId, root) {
33671
34572
  return {
33672
34573
  id: nextPanelId(),
@@ -33683,6 +34584,9 @@ function insertPanel(entry, index) {
33683
34584
  st.panels = next;
33684
34585
  st.selectedPanelId = entry.id;
33685
34586
  }
34587
+ function insertionSlot() {
34588
+ return focusedInsertionSlot(st.panels, selectedIndex_(), d$1().getMoveFacts().parentOf);
34589
+ }
33686
34590
  //#endregion
33687
34591
  //#region src/lib/services/panels/floor-registry.svelte.ts
33688
34592
  var deps = null;
@@ -33704,8 +34608,18 @@ var st = {
33704
34608
  loupePanelId: null,
33705
34609
  focusComposerId: null,
33706
34610
  panelIdSeq: 0,
34611
+ terminalDeskMirrors: {},
33707
34612
  pendingFileIntents: {},
33708
- fileIntentSeq: 0};
34613
+ fileIntentSeq: 0,
34614
+ drag: null,
34615
+ widthBadgeFading: false
34616
+ };
34617
+ /** Non-reactive gesture refs (drag start index, fade timer, badge ids) —
34618
+ * written by floor-registry/drag.svelte.ts; the ids set is a live
34619
+ * SvelteSet so badge visibility stays reactive. */
34620
+ var dragRefs = {
34621
+ ids: new SvelteSet()
34622
+ };
33709
34623
  var floor = {
33710
34624
  get panels() {
33711
34625
  return st.panels;
@@ -33713,12 +34627,27 @@ var floor = {
33713
34627
  get selectedPanelId() {
33714
34628
  return st.selectedPanelId;
33715
34629
  },
34630
+ get loupePanelId() {
34631
+ return st.loupePanelId;
34632
+ },
33716
34633
  get focusComposerId() {
33717
34634
  return st.focusComposerId;
33718
34635
  },
34636
+ get terminalDeskMirrors() {
34637
+ return st.terminalDeskMirrors;
34638
+ },
33719
34639
  get pendingFileIntents() {
33720
34640
  return st.pendingFileIntents;
33721
34641
  },
34642
+ get drag() {
34643
+ return st.drag;
34644
+ },
34645
+ get widthBadgeFading() {
34646
+ return st.widthBadgeFading;
34647
+ },
34648
+ get widthBadgeIds() {
34649
+ return dragRefs.ids;
34650
+ },
33722
34651
  get selected() {
33723
34652
  return st.panels.find((p) => p.id === st.selectedPanelId) ?? null;
33724
34653
  },
@@ -33866,7 +34795,8 @@ function seedColdOf(data) {
33866
34795
  settledAnswers: d.settledAnswers ?? [],
33867
34796
  permission: d.permission ?? null,
33868
34797
  imageLimits: d.imageLimits ?? null,
33869
- knobEvents: d.knobEvents ?? []
34798
+ knobEvents: d.knobEvents ?? [],
34799
+ deliverables: d.deliverables ?? []
33870
34800
  } : void 0;
33871
34801
  }
33872
34802
  //#endregion
@@ -33906,6 +34836,16 @@ function _page($$renderer, $$props) {
33906
34836
  initFloor(seededInitially ? [makePanel(seedSessionId(), seedCold?.agentPreset ?? null)] : initialPrefs.panels, seededInitially ? null : initialPrefs.selectedPanelId);
33907
34837
  if (seededInitially) selectPanel(floor.panels[0]?.id ?? null);
33908
34838
  if (seededInitially && seedCold !== void 0) pageFeeds.primeSeed(seedSessionId(), seedCold);
34839
+ (async () => {
34840
+ try {
34841
+ const persisted = readPersistedId();
34842
+ if (!persisted) return;
34843
+ if (floor.panels.some((panel) => panel.kind === "browser")) return;
34844
+ const res = await fetch("/api/browser");
34845
+ if (!res.ok) return;
34846
+ if ((await res.json()).sessions?.some((s) => s.id === persisted)) openBrowserPanel(readPersistedIndex() ?? void 0, true);
34847
+ } catch {}
34848
+ })();
33909
34849
  const panels = derived(() => floor.panels);
33910
34850
  const selectedPanelId = derived(() => floor.selectedPanelId);
33911
34851
  const selected = derived(() => floor.selected);
@@ -33958,8 +34898,14 @@ function _page($$renderer, $$props) {
33958
34898
  onShellExit: () => removePanel(panel.id)
33959
34899
  });
33960
34900
  $$renderer.push(`<!----></div>`);
33961
- } else if (panel.kind === "prompt-manager") {
34901
+ } else if (panel.kind === "browser") {
33962
34902
  $$renderer.push("<!--[1-->");
34903
+ $$renderer.push(`<div class="panel-manager-body svelte-1uha8ag" data-testid="panel-browser-slot">`);
34904
+ BrowserPanel($$renderer, {
34905
+ browserSessionId: "browserSessionId" in panel ? panel.browserSessionId : void 0});
34906
+ $$renderer.push(`<!----></div>`);
34907
+ } else if (panel.kind === "prompt-manager") {
34908
+ $$renderer.push("<!--[2-->");
33963
34909
  $$renderer.push(`<div class="panel-manager-body svelte-1uha8ag" data-testid="panel-manager">`);
33964
34910
  PromptManagerPanel($$renderer, {
33965
34911
  onclose: hostClose ?? (() => removePanel(panel.id)),
@@ -33968,14 +34914,14 @@ function _page($$renderer, $$props) {
33968
34914
  });
33969
34915
  $$renderer.push(`<!----></div>`);
33970
34916
  } else if (panel.kind === "plugin-rack") {
33971
- $$renderer.push("<!--[2-->");
34917
+ $$renderer.push("<!--[3-->");
33972
34918
  $$renderer.push(`<div class="panel-manager-body svelte-1uha8ag" data-testid="panel-plugins">`);
33973
34919
  PluginManagerPanel($$renderer, {
33974
34920
  refreshToken: panel.refresh ?? 0,
33975
34921
  initialTab: panel.tab ?? "install"});
33976
34922
  $$renderer.push(`<!----></div>`);
33977
34923
  } else if (panel.kind === "skill-shelf") {
33978
- $$renderer.push("<!--[3-->");
34924
+ $$renderer.push("<!--[4-->");
33979
34925
  $$renderer.push(`<div class="panel-manager-body svelte-1uha8ag" data-testid="panel-skills">`);
33980
34926
  SettingsSkillsPanel($$renderer, {
33981
34927
  refreshToken: panel.refresh ?? 0,
@@ -33985,13 +34931,13 @@ function _page($$renderer, $$props) {
33985
34931
  initialReload: panel.reload ?? null});
33986
34932
  $$renderer.push(`<!----></div>`);
33987
34933
  } else if (panel.kind === "settings-editor") {
33988
- $$renderer.push("<!--[4-->");
34934
+ $$renderer.push("<!--[5-->");
33989
34935
  $$renderer.push(`<div class="panel-manager-body svelte-1uha8ag" data-testid="panel-settings">`);
33990
34936
  SettingsEditorPanel($$renderer, {
33991
34937
  target: panel.target});
33992
34938
  $$renderer.push(`<!----></div>`);
33993
34939
  } else if (panel.kind === "injected-doc") {
33994
- $$renderer.push("<!--[5-->");
34940
+ $$renderer.push("<!--[6-->");
33995
34941
  $$renderer.push(`<div class="panel-manager-body svelte-1uha8ag">`);
33996
34942
  InjectedDocPanel($$renderer, {
33997
34943
  sourceSessionId: panel.sourceSessionId,
@@ -33999,7 +34945,7 @@ function _page($$renderer, $$props) {
33999
34945
  entries: pageFeeds.coldCache[panel.sourceSessionId]?.entries ?? []});
34000
34946
  $$renderer.push(`<!----></div>`);
34001
34947
  } else if (panel.kind === "workspace-explorer") {
34002
- $$renderer.push("<!--[6-->");
34948
+ $$renderer.push("<!--[7-->");
34003
34949
  WorkspaceExplorerPanel($$renderer, {
34004
34950
  sessionId: panel.sessionId,
34005
34951
  root: panel.root,
@@ -34030,7 +34976,7 @@ function _page($$renderer, $$props) {
34030
34976
  onActivateTab: (path) => activateExplorerTab(panel.id, path)
34031
34977
  });
34032
34978
  } else if (panel.kind === "workspace-file") {
34033
- $$renderer.push("<!--[7-->");
34979
+ $$renderer.push("<!--[8-->");
34034
34980
  WorkspaceFilePanel($$renderer, {
34035
34981
  sessionId: panel.sessionId,
34036
34982
  path: panel.path,
@@ -34040,7 +34986,7 @@ function _page($$renderer, $$props) {
34040
34986
  onclose: () => removePanel(panel.id)
34041
34987
  });
34042
34988
  } else if (panel.kind === "conversation") {
34043
- $$renderer.push("<!--[8-->");
34989
+ $$renderer.push("<!--[9-->");
34044
34990
  const p = panel;
34045
34991
  $$renderer.push(`<!---->`);
34046
34992
  if (pageFeeds.deadSessions[p.sessionId]) {
@@ -34071,9 +35017,11 @@ function _page($$renderer, $$props) {
34071
35017
  permission: cold.permission,
34072
35018
  imageLimits: cold.imageLimits ?? void 0,
34073
35019
  knobEvents: cold.knobEvents,
35020
+ deliverables: cold.deliverables,
34074
35021
  a2aRows: a2aRowsFor(p.sessionId),
34075
35022
  a2aTitles: spineTitles(),
34076
35023
  onOpenExplorer: openWorkspaceExplorer,
35024
+ onOpenBrowser: lineageFacts().subagentIds.has(p.sessionId) ? void 0 : () => openBrowserPanel(),
34077
35025
  focusComposer: p.id === focusComposerId(),
34078
35026
  oncomposerfocus: () => clearFocusComposer(),
34079
35027
  focused: p.id === selectedPanelId()
@@ -34102,6 +35050,7 @@ function _page($$renderer, $$props) {
34102
35050
  a2aTitles: spineTitles(),
34103
35051
  onNeedCold: (sid) => void ensureCold(sid),
34104
35052
  onOpenExplorer: openWorkspaceExplorer,
35053
+ onOpenBrowser: lineageFacts().subagentIds.has(p.sessionId) ? void 0 : () => openBrowserPanel(),
34105
35054
  focusComposer: p.id === focusComposerId(),
34106
35055
  oncomposerfocus: () => clearFocusComposer(),
34107
35056
  focused: p.id === selectedPanelId()
@@ -34207,4 +35156,4 @@ function _page($$renderer, $$props) {
34207
35156
  }
34208
35157
 
34209
35158
  export { _page as default };
34210
- //# sourceMappingURL=_page.svelte.js-CWiGV7R5.js.map
35159
+ //# sourceMappingURL=_page.svelte.js-D3F2fiR4.js.map