@deepseek-insight/dsi 0.8.1 → 0.8.2

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 (89) hide show
  1. package/build/client/_app/immutable/assets/2.BPprd30B.css +1 -0
  2. package/build/client/_app/immutable/chunks/BHodvdRc.js +1 -0
  3. package/build/client/_app/immutable/chunks/{CJ1fzlPC.js → CAoCg_fG.js} +1 -1
  4. package/build/client/_app/immutable/chunks/D-jXFTzB.js +1 -0
  5. package/build/client/_app/immutable/chunks/{C0tWPpc3.js → TTdBFs3C.js} +2 -2
  6. package/build/client/_app/immutable/entry/{app.DP0oSUf-.js → app.DIq2Q3OX.js} +2 -2
  7. package/build/client/_app/immutable/entry/start.E6P3Z7tx.js +1 -0
  8. package/build/client/_app/immutable/nodes/{1.UuScj-IS.js → 1.DKIIO5Pq.js} +1 -1
  9. package/build/client/_app/immutable/nodes/{2.CJRPZhbe.js → 2.CpOJSq6u.js} +223 -223
  10. package/build/client/_app/version.json +1 -1
  11. package/build/handler.js +4 -4
  12. package/build/index.js +4 -4
  13. package/build/server/chunks/chunks/{db.js-B8BUpxGM.js → db.js-DQm6CZ_r.js} +2 -2
  14. package/build/server/chunks/chunks/{db2.js-CNe3I_g2.js → db2.js-DUhFxA3a.js} +2 -2
  15. package/build/server/chunks/chunks/{dsh-connection.js-xltcocWy.js → dsh-connection.js-BgeraFA2.js} +2 -2
  16. package/build/server/chunks/chunks/{git-probe.js-CUsTmhmV.js → git-probe.js-Cn_ugqcH.js} +2 -2
  17. package/build/server/chunks/chunks/{insight-config.js-CaHHJpFK.js → insight-config.js-Dp_2gB5J.js} +5 -3
  18. package/build/server/chunks/chunks/{internal2.js-Pv5iygVN.js → internal2.js-DFG0wDsP.js} +2 -2
  19. package/build/server/chunks/chunks/{registry.js-BTiJ1Kaj.js → registry.js-BC-TNdmn.js} +47 -8
  20. package/build/server/chunks/chunks/{state.js-BCaKzPy6.js → state.js-Dki_Bq11.js} +2 -2
  21. package/build/server/chunks/chunks/{watcher.js-DcT3cS4v.js → watcher.js-f54CFvdI.js} +4 -4
  22. package/build/server/chunks/entries/endpoints/api/a2a/_id_/{_server.ts.js-19pFOjH8.js → _server.ts.js-BjzdVwdY.js} +3 -3
  23. package/build/server/chunks/entries/endpoints/api/a2a/{_server.ts.js-BcUn6axe.js → _server.ts.js-DN0zl7cz.js} +5 -5
  24. package/build/server/chunks/entries/endpoints/api/a2a/register/{_server.ts.js-oMpzLZoy.js → _server.ts.js-C3byr74D.js} +5 -5
  25. package/build/server/chunks/entries/endpoints/api/browser/_id_/close/{_server.ts.js-DC3qPMQS.js → _server.ts.js-BKChU9D7.js} +3 -3
  26. package/build/server/chunks/entries/endpoints/api/browser/_id_/input/{_server.ts.js-CHNcK7BH.js → _server.ts.js-CUFYX5kg.js} +3 -3
  27. package/build/server/chunks/entries/endpoints/api/browser/_id_/mcp/{_server.ts.js-CYkOJL2O.js → _server.ts.js-fg2eb_ZY.js} +3 -3
  28. package/build/server/chunks/entries/endpoints/api/browser/_id_/navigate/{_server.ts.js-DHTDi8KR.js → _server.ts.js-Dt1n31IP.js} +3 -3
  29. package/build/server/chunks/entries/endpoints/api/browser/_id_/page/{_server.ts.js-Y5khEC2l.js → _server.ts.js-DIF8juwJ.js} +3 -3
  30. package/build/server/chunks/entries/endpoints/api/browser/_id_/stream/{_server.ts.js-BmjgfZD2.js → _server.ts.js-BFdXJdhd.js} +3 -3
  31. package/build/server/chunks/entries/endpoints/api/browser/_id_/viewport/{_server.ts.js-IxS-goi1.js → _server.ts.js-BIF_7OHe.js} +3 -3
  32. package/build/server/chunks/entries/endpoints/api/browser/{_server.ts.js-6STmJ7FD.js → _server.ts.js-B7yjEF1N.js} +3 -3
  33. package/build/server/chunks/entries/endpoints/api/config/{_server.ts.js-BVyx8gPc.js → _server.ts.js-C8XDnDwe.js} +3 -3
  34. package/build/server/chunks/entries/endpoints/api/dsh/directory/{_server.ts.js-CNJbv6CC.js → _server.ts.js-BFmWshpv.js} +3 -3
  35. package/build/server/chunks/entries/endpoints/api/dsh/jobs/{_server.ts.js-CDWmXDJX.js → _server.ts.js-DATWy5mQ.js} +3 -3
  36. package/build/server/chunks/entries/endpoints/api/dsh/jobs/follow/{_server.ts.js-BDXQcQSL.js → _server.ts.js-CugOD1Zd.js} +3 -3
  37. package/build/server/chunks/entries/endpoints/api/dsh/pick-directory/{_server.ts.js-CgedtzOg.js → _server.ts.js-DCupM4da.js} +3 -3
  38. package/build/server/chunks/entries/endpoints/api/dsh/presets/{_server.ts.js-ut2pK15B.js → _server.ts.js-Bh1btvr9.js} +3 -3
  39. package/build/server/chunks/entries/endpoints/api/dsh/session/_sessionId_/attachment/{_server.ts.js-Ct2W7g4c.js → _server.ts.js-Cb8SBWVw.js} +3 -3
  40. package/build/server/chunks/entries/endpoints/api/dsh/session/_sessionId_/cancel/{_server.ts.js-Rke3V_qh.js → _server.ts.js-WI9yH2iG.js} +3 -3
  41. package/build/server/chunks/entries/endpoints/api/dsh/session/_sessionId_/catalog/{_server.ts.js-BYHm5WBA.js → _server.ts.js-bN9adUqz.js} +3 -3
  42. package/build/server/chunks/entries/endpoints/api/dsh/session/_sessionId_/changes/{_server.ts.js-B_bEUKkt.js → _server.ts.js-Bxlm966G.js} +3 -3
  43. package/build/server/chunks/entries/endpoints/api/dsh/session/_sessionId_/command/{_server.ts.js-D78fGUQk.js → _server.ts.js-CM-raN_Q.js} +3 -3
  44. package/build/server/chunks/entries/endpoints/api/dsh/session/_sessionId_/events/{_server.ts.js-CgB_c7zG.js → _server.ts.js-lBsxHSo6.js} +3 -3
  45. package/build/server/chunks/entries/endpoints/api/dsh/session/_sessionId_/fork/{_server.ts.js-dVaW22_K.js → _server.ts.js-DvNkrTaY.js} +3 -3
  46. package/build/server/chunks/entries/endpoints/api/dsh/session/_sessionId_/goal/{_server.ts.js-Dl8SBXdH.js → _server.ts.js-DXbCrefw.js} +3 -3
  47. package/build/server/chunks/entries/endpoints/api/dsh/session/_sessionId_/history/{_server.ts.js-BKDiwMIE.js → _server.ts.js-BrEgFdCF.js} +3 -3
  48. package/build/server/chunks/entries/endpoints/api/dsh/session/_sessionId_/models/{_server.ts.js-D3FY2Wxt.js → _server.ts.js-C_AEaLLJ.js} +3 -3
  49. package/build/server/chunks/entries/endpoints/api/dsh/session/_sessionId_/path/{_server.ts.js-BWuIEdjl.js → _server.ts.js-Dj-pF5ik.js} +2 -2
  50. package/build/server/chunks/entries/endpoints/api/dsh/session/_sessionId_/permission/{_server.ts.js-CeiQFOGP.js → _server.ts.js-BX9FWJ6g.js} +3 -3
  51. package/build/server/chunks/entries/endpoints/api/dsh/session/_sessionId_/prompt/{_server.ts.js-lMofZOns.js → _server.ts.js-CQ2Bmtu4.js} +3 -3
  52. package/build/server/chunks/entries/endpoints/api/dsh/session/_sessionId_/rename/{_server.ts.js-CNalVHrK.js → _server.ts.js-Ha7xjnKW.js} +3 -3
  53. package/build/server/chunks/entries/endpoints/api/dsh/session/_sessionId_/respond/{_server.ts.js-I2s8qvcV.js → _server.ts.js-BOg6llHk.js} +3 -3
  54. package/build/server/chunks/entries/endpoints/api/dsh/session/_sessionId_/select-model/{_server.ts.js-DTKELD7v.js → _server.ts.js-DBqGALzZ.js} +3 -3
  55. package/build/server/chunks/entries/endpoints/api/dsh/sessions/{_server.ts.js-BXSD__Gg.js → _server.ts.js-CvA8WDDb.js} +3 -3
  56. package/build/server/chunks/entries/endpoints/api/dsh/workspace-file/{_server.ts.js-C9IZl2Qh.js → _server.ts.js-BfjNH40j.js} +3 -3
  57. package/build/server/chunks/entries/endpoints/api/dsh/workspace-tree/{_server.ts.js-BRXu3UtL.js → _server.ts.js-De_qumyr.js} +3 -3
  58. package/build/server/chunks/entries/endpoints/api/dsh/workspaces/{_server.ts.js-DmnpiaD2.js → _server.ts.js-tFpJJHCb.js} +3 -3
  59. package/build/server/chunks/entries/endpoints/api/dsh/workspaces/_workspaceId_/delete/{_server.ts.js-C5qCdsdm.js → _server.ts.js-DVx5GGA_.js} +3 -3
  60. package/build/server/chunks/entries/endpoints/api/dsh/workspaces/_workspaceId_/rename/{_server.ts.js-BVUn49yf.js → _server.ts.js-DuKT-aZp.js} +3 -3
  61. package/build/server/chunks/entries/endpoints/api/prompts/_id_/{_server.ts.js-DuCOsoF0.js → _server.ts.js-DsWFidFY.js} +3 -3
  62. package/build/server/chunks/entries/endpoints/api/prompts/{_server.ts.js-2mcRY7IP.js → _server.ts.js-C6j0adQs.js} +3 -3
  63. package/build/server/chunks/entries/endpoints/api/prompts/use/{_server.ts.js-DZjaHZxU.js → _server.ts.js-BChAg4hm.js} +3 -3
  64. package/build/server/chunks/entries/endpoints/api/settings/{_server.ts.js-DTVmsohJ.js → _server.ts.js-BPSHqbZN.js} +2 -2
  65. package/build/server/chunks/entries/endpoints/api/terminal/{_server.ts.js-DZXTArj7.js → _server.ts.js-D5CbUe5k.js} +2 -2
  66. package/build/server/chunks/entries/endpoints/api/workspace/file-write/{_server.ts.js-LSc5EKH7.js → _server.ts.js-BRhlbYEe.js} +4 -4
  67. package/build/server/chunks/entries/endpoints/api/workspace/git-events/{_server.ts.js-DNjiScBe.js → _server.ts.js-B9YI66ZL.js} +4 -4
  68. package/build/server/chunks/entries/endpoints/api/workspace/git-file-head/{_server.ts.js-CHMbLoSn.js → _server.ts.js-DSvXRZQL.js} +4 -4
  69. package/build/server/chunks/entries/endpoints/api/workspace/git-map/{_server.ts.js-BgM4JEAm.js → _server.ts.js-8A0skdlM.js} +4 -4
  70. package/build/server/chunks/entries/endpoints/api/workspace/git-status/{_server.ts.js-BH0cLS8o.js → _server.ts.js-Bc6J3t3m.js} +4 -4
  71. package/build/server/chunks/entries/endpoints/api/workspace/write-gate/{_server.ts.js-BzlV3cVT.js → _server.ts.js-CfL8Por5.js} +4 -4
  72. package/build/server/chunks/entries/pages/{_error.svelte.js-BRyCyR0c.js → _error.svelte.js-EnDLC3Jj.js} +3 -3
  73. package/build/server/chunks/entries/pages/{_page.server.ts.js-DttLUwdf.js → _page.server.ts.js-ar1DbW1v.js} +2 -2
  74. package/build/server/chunks/entries/pages/{_page.svelte.js-CKY8hz9T.js → _page.svelte.js-CQUo8VGL.js} +125 -61
  75. package/build/server/chunks/{handler-D1oqmwyy.js → handler-BBp0LoYK.js} +3 -3
  76. package/build/server/chunks/{index.js-BZ8zP9wS.js → index.js-S4257Wcs.js} +2 -2
  77. package/build/server/chunks/{manifest.js-CA6PuZTD.js → manifest.js-DajiWH1H.js} +54 -54
  78. package/build/server/chunks/nodes/1.js-OAvYMTzU.js +9 -0
  79. package/build/server/chunks/nodes/{2.js-P1boc94A.js → 2.js-BORDEffk.js} +7 -7
  80. package/package.json +1 -1
  81. package/skills/dsi-kb-scenario/SKILL.md +67 -0
  82. package/template/.dsi/prompts.sqlite-shm +0 -0
  83. package/template/.dsi/prompts.sqlite-wal +0 -0
  84. package/template/.dsi/settings.yaml +8 -1
  85. package/build/client/_app/immutable/assets/2.BhBfHqja.css +0 -1
  86. package/build/client/_app/immutable/chunks/gZFoJ-NI.js +0 -1
  87. package/build/client/_app/immutable/chunks/xkjLeSzJ.js +0 -1
  88. package/build/client/_app/immutable/entry/start.mBp3LB6J.js +0 -1
  89. package/build/server/chunks/nodes/1.js-Q6zZupRG.js +0 -9
@@ -9,7 +9,7 @@ import { D as DEFAULT_IMAGE_LIMITS } from '../../chunks/image-limits.js-CUdJ0f7r
9
9
  import { s as sanitizeWorkspaceProfile, d as dsiKey, t as themePrefs } from '../../chunks/theme-prefs.svelte.js-8CaWz46g.js';
10
10
  import { a as appConfig, p as previewSegments, b as parseTagWords, i as isValidTagWord, s as shouldRecordPrompt, g as getTrigger, t as triggerMode, c as searchKey, d as textPreviewOf } from '../../chunks/app-config.svelte.js-BM4WbMFB.js';
11
11
  import { c as getLocale } from '../../chunks/runtime.js-CCJi3XaY.js';
12
- import { p as page, a as afterNavigate, t, c as currentLocale, e as replaceState, u as unexpectederror1, s as sessionnotfound2, r as reapednote1, d as dshunreachable1, b as backtoworkspace2 } from '../../chunks/state.js-BCaKzPy6.js';
12
+ import { p as page, a as afterNavigate, t, c as currentLocale, e as replaceState, u as unexpectederror1, s as sessionnotfound2, r as reapednote1, d as dshunreachable1, b as backtoworkspace2 } from '../../chunks/state.js-Dki_Bq11.js';
13
13
  import 'yaml';
14
14
  import 'html-to-image';
15
15
  import hljs from 'highlight.js/lib/core';
@@ -21,7 +21,7 @@ import xml from 'highlight.js/lib/languages/xml';
21
21
  import css from 'highlight.js/lib/languages/css';
22
22
  import '../../chunks/uneval.js-BJ9Qq2SF.js';
23
23
  import '../../chunks/shared.js-HQ0rfhm4.js';
24
- import '../../chunks/internal2.js-Pv5iygVN.js';
24
+ import '../../chunks/internal2.js-DFG0wDsP.js';
25
25
  import '../../chunks/utils.js-CAdNO8Tu.js';
26
26
 
27
27
  //#region src/lib/paraglide/messages/abort.js
@@ -952,6 +952,38 @@ var browserchiplabel2 = ((inputs = {}, options = {}) => {
952
952
  return en_browserchiplabel2();
953
953
  });
954
954
  //#endregion
955
+ //#region src/lib/paraglide/messages/browserclosedelete2.js
956
+ /** @typedef {import('../runtime.js').LocalizedString} LocalizedString */
957
+ /** @typedef {{}} Browserclosedelete2Inputs */
958
+ var en_browserclosedelete2 = () => {
959
+ return `Delete the glass browser — kills the session and removes the panel`;
960
+ };
961
+ var zh_browserclosedelete2 = () => {
962
+ return `删除玻璃浏览器 — 终止会话并移除面板`;
963
+ };
964
+ var id_browserclosedelete2 = () => {
965
+ return `Hapus browser kaca — matikan sesi dan hapus panel`;
966
+ };
967
+ var es_browserclosedelete2 = () => {
968
+ return `Eliminar el navegador de vidrio — mata la sesión y quita el panel`;
969
+ };
970
+ /**
971
+ * | output |
972
+ * | --- |
973
+ * | "Delete the glass browser — kills the session and removes the panel" |
974
+ *
975
+ * @param {Browserclosedelete2Inputs} inputs
976
+ * @param {{ locale?: "en" | "zh" | "id" | "es" }} options
977
+ * @returns {LocalizedString}
978
+ */
979
+ var browserclosedelete2 = ((inputs = {}, options = {}) => {
980
+ const locale = options.locale ?? getLocale();
981
+ if (locale === "zh") return zh_browserclosedelete2();
982
+ if (locale === "id") return id_browserclosedelete2();
983
+ if (locale === "es") return es_browserclosedelete2();
984
+ return en_browserclosedelete2();
985
+ });
986
+ //#endregion
955
987
  //#region src/lib/paraglide/messages/browserforward1.js
956
988
  /** @typedef {import('../runtime.js').LocalizedString} LocalizedString */
957
989
  /** @typedef {{}} Browserforward1Inputs */
@@ -14840,6 +14872,7 @@ var _index_exports = /* @__PURE__ */ __exportAll({
14840
14872
  broadcastSyncedTo: () => broadcastsyncedto2,
14841
14873
  browserBack: () => browserback1,
14842
14874
  browserChipLabel: () => browserchiplabel2,
14875
+ browserCloseDelete: () => browserclosedelete2,
14843
14876
  browserForward: () => browserforward1,
14844
14877
  browserLaunching: () => browserlaunching1,
14845
14878
  browserOpenTitle: () => browseropentitle2,
@@ -15311,6 +15344,7 @@ var messages_exports = /* @__PURE__ */ __exportAll({
15311
15344
  broadcastSyncedTo: () => broadcastsyncedto2,
15312
15345
  browserBack: () => browserback1,
15313
15346
  browserChipLabel: () => browserchiplabel2,
15347
+ browserCloseDelete: () => browserclosedelete2,
15314
15348
  browserForward: () => browserforward1,
15315
15349
  browserLaunching: () => browserlaunching1,
15316
15350
  browserOpenTitle: () => browseropentitle2,
@@ -17585,7 +17619,7 @@ function ThemeToggle($$renderer, $$props) {
17585
17619
  }
17586
17620
  //#endregion
17587
17621
  //#region package.json
17588
- var version = "0.8.1";
17622
+ var version = "0.8.2";
17589
17623
  var dsh = { "webVersion": "0.2.1-rc.2" };
17590
17624
  //#endregion
17591
17625
  //#region src/lib/version.ts
@@ -23324,6 +23358,32 @@ function panelRowsFor(input) {
23324
23358
  function rowFactsByPanelId(rows) {
23325
23359
  return new Map(rows.map((r) => [r.panel.id, r]));
23326
23360
  }
23361
+ /**
23362
+ * The folded-glass ghost rows (ADR-0037 D4, extracted 2026-10-24 — the
23363
+ * Glass Close Ladder task 2.2): the ONE derivation the route renders.
23364
+ * Pure over the slot mirror — a removeBrowserSlot prune drops the ghost
23365
+ * (roster) and the spine nest in the same stroke (Ladder ADR D4).
23366
+ */
23367
+ function foldedGlassRowsFor(slots, depthOf, titleFor) {
23368
+ return slots.filter((s) => s.folded && s.sessionId && s.openedBy).map((s) => ({
23369
+ panel: {
23370
+ id: "glass-" + s.sessionId,
23371
+ kind: "conversation",
23372
+ sessionId: s.sessionId,
23373
+ agentPreset: null,
23374
+ width: 0
23375
+ },
23376
+ title: "Browser — " + (titleFor(s.openedBy) ?? s.openedBy),
23377
+ workspace: null,
23378
+ dead: false,
23379
+ running: true,
23380
+ depth: depthOf(s.openedBy) + 1,
23381
+ runningDescendants: 0,
23382
+ kind: "ghost",
23383
+ parentSessionId: s.openedBy,
23384
+ siblingIndex: -1
23385
+ }));
23386
+ }
23327
23387
  //#endregion
23328
23388
  //#region src/lib/components/prompt-manager/PromptsManagerDialogHeader.svelte
23329
23389
  function PromptsManagerDialogHeader($$renderer, $$props) {
@@ -32836,6 +32896,19 @@ function persistBrowserSlots(slots, storage = defaultStorage()) {
32836
32896
  * plain .ts module stays rune-free). Rows and the route derive the
32837
32897
  * folded set from it; persistBrowserSlots is the only writer. */
32838
32898
  var browserSlotStore = writable([]);
32899
+ /**
32900
+ * Drop the slot entry whose glass session died (The Glass Close Ladder
32901
+ * ADR 2026-10-24 D4): the live prune — a dead glass's entry is REMOVED,
32902
+ * never folded, so the roster ghost and the spine nest drop with it in
32903
+ * the same mirror stroke, no reload. Unknown id = quiet no-op (false).
32904
+ */
32905
+ function removeBrowserSlot(sessionId, storage = defaultStorage()) {
32906
+ const slots = readBrowserSlots(storage);
32907
+ const next = slots.filter((s) => s.sessionId !== sessionId);
32908
+ if (next.length === slots.length) return false;
32909
+ persistBrowserSlots(next, storage);
32910
+ return true;
32911
+ }
32839
32912
  /** Seed the mirror from storage (boot). */
32840
32913
  function primeBrowserSlotStore(storage = defaultStorage()) {
32841
32914
  browserSlotStore.set(readBrowserSlots(storage));
@@ -32845,7 +32918,7 @@ function primeBrowserSlotStore(storage = defaultStorage()) {
32845
32918
  function BrowserClosed($$renderer, $$props) {
32846
32919
  $$renderer.component(($$renderer) => {
32847
32920
  let { closing = false} = $$props;
32848
- $$renderer.push(`<button data-svelte="BrowserClosed" class="rounded px-1 hover:bg-surface-active" data-testid="browse-close"${attr("disabled", closing, true)}>✕</button>`);
32921
+ $$renderer.push(`<button data-svelte="BrowserClosed" class="rounded hover:bg-surface-active svelte-18cg1lj" data-testid="browse-close"${attr("aria-label", browserclosedelete2())}${attr("title", browserclosedelete2())}${attr("disabled", closing, true)}><svg width="14" height="14" viewBox="0 0 24 24" fill="none" stroke="red" stroke-width="2" stroke-linecap="round" stroke-linejoin="round" aria-hidden="true"><path d="M3 6h18"></path><path d="M8 6V4a2 2 0 0 1 2-2h4a2 2 0 0 1 2 2v2"></path><path d="M19 6l-1 14a2 2 0 0 1-2 2H8a2 2 0 0 1-2-2L5 6"></path><path d="M10 11v6"></path><path d="M14 11v6"></path></svg></button>`);
32849
32922
  });
32850
32923
  }
32851
32924
  //#endregion
@@ -34911,6 +34984,18 @@ function workspaceExplorerSlot(panels, selectedIndex, facts) {
34911
34984
  return focusedInsertionSlot(panels, selectedIndex, facts.parentOf);
34912
34985
  }
34913
34986
  /**
34987
+ * The glass FIRST slot under its opener (operator ruling 2026-10-24):
34988
+ * a summoned/spawned glass lands DIRECTLY below its opener - past the
34989
+ * opener document tail, BEFORE every adopted child - matching the
34990
+ * spine tree wire order -1 (the ghost always reads as the first
34991
+ * child). Supersedes the region-end placement for the glass only.
34992
+ */
34993
+ function glassFirstSlot(panels, openedBy) {
34994
+ const openerIdx = panels.findIndex((p) => p.kind === "conversation" && p.sessionId === openedBy);
34995
+ if (openerIdx === -1) return panels.length;
34996
+ return docTailEnd(panels, openerIdx, openedBy) + 1;
34997
+ }
34998
+ /**
34914
34999
  * Insert-before-focused slot (operator spec, 2026-08-31): a fresh panel
34915
35000
  * lands at the FOCUSED panel's index — immediately before it — and takes
34916
35001
  * focus (the route selects it). 0 when nothing is focused (empty floor,
@@ -34938,7 +35023,7 @@ function focusedInsertionSlot(panels, selectedIndex, parentOf) {
34938
35023
  const focus = Math.max(0, selectedIndex);
34939
35024
  const focused = panels[focus];
34940
35025
  if (focused === void 0) return 0;
34941
- if (focused.kind === "workspace-explorer" || focused.kind === "workspace-file") {
35026
+ if (focused.kind === "workspace-explorer" || focused.kind === "workspace-file" || focused.kind === "browser") {
34942
35027
  const block = blockBounds(panels, focus, { parentOf });
34943
35028
  return block === null ? focus : block[0];
34944
35029
  }
@@ -34953,34 +35038,6 @@ function focusedInsertionSlot(panels, selectedIndex, parentOf) {
34953
35038
  const headIndex = panels.findIndex((p) => p.kind === "conversation" && p.sessionId === head);
34954
35039
  return headIndex >= 0 ? Math.min(headIndex, focus) : focus;
34955
35040
  }
34956
- /**
34957
- * Lineage-order slot below an OPEN spawner (operator spec, 2026-08-28):
34958
- * after the spawner AND after every already-adopted sibling that PRECEDES
34959
- * the child in wire order — plus those siblings' own panels (an adopted
34960
- * subtree travels whole). Ghost clicks and sub-agent replacements keep the
34961
- * family region in the ghost list's order regardless of arrival sequence:
34962
- * adopting sub2 then sub3 lands |A|sub2|sub3|, a late sub1 slots back to
34963
- * |A|sub1|sub2|sub3|.
34964
- */
34965
- function lineagePinnedSlot(panels, childrenByParent, parentSessionId, childSessionId) {
34966
- let base = panels.findIndex((p) => p.kind === "conversation" && p.sessionId === parentSessionId) + 1;
34967
- base = docTailEnd(panels, base - 1, parentSessionId) + 1;
34968
- const siblings = childrenByParent.get(parentSessionId) ?? [];
34969
- const mine = siblings.findIndex((s) => s.sessionId === childSessionId);
34970
- const closure = new Set(siblings.slice(0, mine < 0 ? siblings.length : mine).map((s) => s.sessionId));
34971
- const stack = [...closure];
34972
- while (stack.length > 0) for (const k of childrenByParent.get(stack.pop()) ?? []) if (!closure.has(k.sessionId)) {
34973
- closure.add(k.sessionId);
34974
- stack.push(k.sessionId);
34975
- }
34976
- let index = base;
34977
- while (index < panels.length) {
34978
- const at = panels[index];
34979
- if (at.kind !== "conversation" || !closure.has(at.sessionId)) break;
34980
- index++;
34981
- }
34982
- return index;
34983
- }
34984
35041
  //#endregion
34985
35042
  //#region src/lib/services/panels/floor-registry/chrome.ts
34986
35043
  /**
@@ -35021,7 +35078,7 @@ function openBrowserPanel(index, keepSelection = false, width, openedBy, session
35021
35078
  return;
35022
35079
  }
35023
35080
  const prevSelected = st.selectedPanelId;
35024
- const slot = index !== void 0 ? Math.max(0, Math.min(index, st.panels.length)) : openedBy !== void 0 && d$4().getLineageFacts().childrenByParent ? pinnedSlotIndex(openedBy, "browser") : insertionSlot();
35081
+ const slot = index !== void 0 ? Math.max(0, Math.min(index, st.panels.length)) : openedBy !== void 0 ? glassFirstSlot(st.panels, openedBy) : insertionSlot();
35025
35082
  insertPanel(makeBrowserPanel(width, openedBy, sessionId), slot);
35026
35083
  if (keepSelection && prevSelected !== null && prevSelected !== void 0) {
35027
35084
  if (st.panels.some((p) => p.id === prevSelected)) st.selectedPanelId = prevSelected;
@@ -35325,9 +35382,6 @@ function insertPanel(entry, index) {
35325
35382
  function insertionSlot() {
35326
35383
  return focusedInsertionSlot(st.panels, selectedIndex_(), d$1().getMoveFacts().parentOf);
35327
35384
  }
35328
- function pinnedSlotIndex(parentSessionId, childSessionId) {
35329
- return lineagePinnedSlot(st.panels, d$1().getLineageFacts().childrenByParent, parentSessionId, childSessionId);
35330
- }
35331
35385
  //#endregion
35332
35386
  //#region src/lib/services/panels/floor-registry.svelte.ts
35333
35387
  var deps = null;
@@ -35430,6 +35484,27 @@ function selectedIndex_() {
35430
35484
  return st.panels.findIndex((p) => p.id === st.selectedPanelId);
35431
35485
  }
35432
35486
  //#endregion
35487
+ //#region src/lib/services/panels/glass-release.ts
35488
+ /**
35489
+ * glass-release — the Glass Close Ladder executor (ADR 2026-10-24 D1/D3):
35490
+ * the ONE wire-kill caller. The registry stays the only teardown authority;
35491
+ * this module merely knocks on its door — fire-and-forget POST close per
35492
+ * doomed glass id, an ok answer pruning the slot entry LIVE (D4). A network
35493
+ * failure swallows (the reaper stays the net); a refusal never prunes.
35494
+ * Pure seam shape: fetch and the prune are injectable for tests.
35495
+ */
35496
+ async function releaseGlasses(sessionIds, deps = {}) {
35497
+ if (sessionIds.length === 0) return;
35498
+ const doFetch = deps.fetchImpl ?? fetch;
35499
+ const apiBase = deps.apiBase ?? "";
35500
+ await Promise.all(sessionIds.map(async (id) => {
35501
+ try {
35502
+ if (!(await doFetch(apiBase + "/api/browser/" + id + "/close", { method: "POST" })).ok) return;
35503
+ (deps.prune ?? ((sid) => removeBrowserSlot(sid)))(id);
35504
+ } catch {}
35505
+ }));
35506
+ }
35507
+ //#endregion
35433
35508
  //#region src/lib/services/panels/floor-reads.svelte.ts
35434
35509
  var floorReads = {
35435
35510
  get spineRows() {
@@ -35573,7 +35648,8 @@ function _page($$renderer, $$props) {
35573
35648
  setPanelWidthPreset: (w) => pagePrefs.panelWidth = w,
35574
35649
  setTreePct: (pct) => pagePrefs.treePct = pct,
35575
35650
  getSettingsHomes: () => appConfig().settingsHomes,
35576
- applyTerminalDeskAction: (a) => void 0
35651
+ applyTerminalDeskAction: (a) => void 0,
35652
+ releaseGlasses: (ids) => void releaseGlasses(ids)
35577
35653
  });
35578
35654
  initFloor(seededInitially ? [makePanel(seedSessionId(), seedCold?.agentPreset ?? null)] : initialPrefs.panels, seededInitially ? null : initialPrefs.selectedPanelId);
35579
35655
  if (seededInitially) selectPanel(floor.panels[0]?.id ?? null);
@@ -35596,9 +35672,11 @@ function _page($$renderer, $$props) {
35596
35672
  } catch {}
35597
35673
  }
35598
35674
  /** Bring ONE folded glass back (the summon; the replace verb is the
35599
- * same re-bind — the glass owns its slot identity, D4). */
35600
- function summonGlass(glass) {
35601
- openBrowserPanel(glass.index, true, glass.width, glass.openedBy, glass.sessionId);
35675
+ * same re-bind — the glass owns its slot identity, D4). keepSelection:
35676
+ * boot restore keeps the operator's focus (true, the default); the
35677
+ * ghost-click summon focuses the GLASS (false, Ladder focus contract). */
35678
+ function summonGlass(glass, opts = {}) {
35679
+ openBrowserPanel(glass.index, opts.keepSelection ?? true, glass.width, glass.openedBy, glass.sessionId);
35602
35680
  }
35603
35681
  primeBrowserSlotStore();
35604
35682
  restoreBrowserGlasses();
@@ -35614,24 +35692,7 @@ function _page($$renderer, $$props) {
35614
35692
  const spineWorkspaces = derived(() => floorReads.spineWorkspaces);
35615
35693
  const lineageFacts = derived(() => floorReads.lineageFacts);
35616
35694
  const conversationPanels = derived(() => floorReads.conversationPanels);
35617
- const allFoldedGlassRows = derived(() => store_get($$store_subs ??= {}, "$browserSlotStore", browserSlotStore).filter((s) => s.folded && s.sessionId && s.openedBy).map((s) => ({
35618
- panel: {
35619
- id: "glass-" + s.sessionId,
35620
- kind: "conversation",
35621
- sessionId: s.sessionId,
35622
- agentPreset: null,
35623
- width: 0
35624
- },
35625
- title: "Browser — " + (panelTitleFor(s.openedBy) ?? s.openedBy),
35626
- workspace: null,
35627
- dead: false,
35628
- running: true,
35629
- depth: (lineageFacts().depthById.get(s.openedBy) ?? 0) + 1,
35630
- runningDescendants: 0,
35631
- kind: "ghost",
35632
- parentSessionId: s.openedBy,
35633
- siblingIndex: -1
35634
- })));
35695
+ const allFoldedGlassRows = derived(() => foldedGlassRowsFor(store_get($$store_subs ??= {}, "$browserSlotStore", browserSlotStore), (id) => lineageFacts().depthById.get(id) ?? 0, (id) => panelTitleFor(id)));
35635
35696
  const spineGlassRows = derived(() => allFoldedGlassRows().filter((g) => !conversationPanels().some((p) => p.sessionId === g.parentSessionId)).map((g) => ({
35636
35697
  sessionId: g.panel.sessionId,
35637
35698
  openedBy: g.parentSessionId,
@@ -35704,7 +35765,10 @@ function _page($$renderer, $$props) {
35704
35765
  $$renderer.push("<!--[1-->");
35705
35766
  BrowserManager($$renderer, {
35706
35767
  browserSessionId: "browserSessionId" in panel ? panel.browserSessionId : void 0,
35707
- onclose: () => removePanel(panel.id),
35768
+ onclose: () => {
35769
+ if ("browserSessionId" in panel && panel.browserSessionId) releaseGlasses([panel.browserSessionId]);
35770
+ removePanel(panel.id);
35771
+ },
35708
35772
  openedBy: panel.openedBy,
35709
35773
  parentTitle: panel.openedBy ? panelTitleFor(panel.openedBy) ?? panel.openedBy : null,
35710
35774
  depth: panel.openedBy ? lineageFacts().depthById.get(panel.openedBy) ?? 0 : 0});
@@ -35942,4 +36006,4 @@ function _page($$renderer, $$props) {
35942
36006
  }
35943
36007
 
35944
36008
  export { _page as default };
35945
- //# sourceMappingURL=_page.svelte.js-CKY8hz9T.js.map
36009
+ //# sourceMappingURL=_page.svelte.js-CQUo8VGL.js.map
@@ -9,8 +9,8 @@ import * as qs from 'node:querystring';
9
9
  import { Readable } from 'node:stream';
10
10
  import { S as SvelteKitError } from './chunks/shared.js-HQ0rfhm4.js';
11
11
  import './chunks/utils.js-CAdNO8Tu.js';
12
- import { S as Server } from './index.js-BZ8zP9wS.js';
13
- import { m as manifest } from './manifest.js-CA6PuZTD.js';
12
+ import { S as Server } from './index.js-S4257Wcs.js';
13
+ import { m as manifest } from './manifest.js-DajiWH1H.js';
14
14
  import { env, dir, env_prefix } from '../../env.js';
15
15
  import { format } from 'node:url';
16
16
 
@@ -1732,4 +1732,4 @@ const handler = sequence(
1732
1732
  );
1733
1733
 
1734
1734
  export { format_listening_address as f, handler as h, polka as p };
1735
- //# sourceMappingURL=handler-D1oqmwyy.js.map
1735
+ //# sourceMappingURL=handler-BBp0LoYK.js.map
@@ -3,7 +3,7 @@ import { n as noop, T as TRAILING_SLASH_PARAM, I as INVALIDATED_PARAM, R as Redi
3
3
  import { b as base, o as override, a as assets, r as reset, c as app_dir } from './chunks/internal.js-BcS47nI-.js';
4
4
  import { f as format_server_error, j as json, i as is_form_content_type, t as text, h as has_prerendered_path, a as handle_fatal_error, r as redirect_response, g as get_set_cookies, n as negotiate, w as with_request_store, p as parseString, m as merge_tracing, b as method_not_allowed, s as static_error_page, c as handle_error_and_jsonify, d as get_global_name, e as create_replacer, k as serialize_uses, l as clarify_devalue_error, E as ENDPOINT_METHODS, P as PAGE_METHODS, o as get_node_type, q as isRedirect, u as escape_html, v as error, x as deserialize_binary_form } from './chunks/utils.js-CAdNO8Tu.js';
5
5
  import { u as uneval } from './chunks/uneval.js-BJ9Qq2SF.js';
6
- import { o as options, s as set_private_env, a as set_public_env, g as get_hooks, p as public_env, r as read_implementation, b as set_read_implementation } from './chunks/internal2.js-Pv5iygVN.js';
6
+ import { o as options, s as set_private_env, a as set_public_env, g as get_hooks, p as public_env, r as read_implementation, b as set_read_implementation } from './chunks/internal2.js-DFG0wDsP.js';
7
7
  import { d as decode_pathname, f as find_route, n as normalize_path, a as disable_search, v as validate_layout_server_exports, b as validate_layout_exports, c as validate_page_server_exports, e as validate_page_exports, r as resolve, h as hash, m as make_trackable } from './chunks/exports.js-DH_tjtdv.js';
8
8
  import { S as readable, T as writable } from './chunks/server.js-B1bDXhHu.js';
9
9
 
@@ -3862,4 +3862,4 @@ var Server = class {
3862
3862
  };
3863
3863
 
3864
3864
  export { Server as S };
3865
- //# sourceMappingURL=index.js-BZ8zP9wS.js.map
3865
+ //# sourceMappingURL=index.js-S4257Wcs.js.map