@deepseek-insight/dsi 0.9.1 → 0.10.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 (35) hide show
  1. package/build/client/_app/immutable/assets/0.uhYTRapi.css +2 -0
  2. package/build/client/_app/immutable/chunks/0Uk2rkmL.js +1 -0
  3. package/build/client/_app/immutable/chunks/BaH6C3xD.js +2 -0
  4. package/build/client/_app/immutable/chunks/{DXD_Wzp9.js → Bu2owQS4.js} +1 -1
  5. package/build/client/_app/immutable/chunks/DXba8Dom.js +1 -0
  6. package/build/client/_app/immutable/entry/{app.C_yn4m6w.js → app.DjLAWmJH.js} +2 -2
  7. package/build/client/_app/immutable/entry/start.D-t6KuoK.js +1 -0
  8. package/build/client/_app/immutable/nodes/{1.DZxzqrcK.js → 1.w6Hz6-dJ.js} +1 -1
  9. package/build/client/_app/immutable/nodes/{2.ckwEPlsL.js → 2.CFmqEODJ.js} +107 -107
  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/{internal2.js-zTmbne6n.js → internal2.js-DRFhzPda.js} +2 -2
  14. package/build/server/chunks/chunks/{state.js-CPIukTkD.js → state.js-kZHonU4N.js} +2 -2
  15. package/build/server/chunks/entries/pages/{_error.svelte.js-Dss5_PtG.js → _error.svelte.js-BKhpJygh.js} +3 -3
  16. package/build/server/chunks/entries/pages/{_page.svelte.js-CJboFEGf.js → _page.svelte.js-BlbGdGej.js} +70 -10
  17. package/build/server/chunks/{handler-Bn-Z9bWE.js → handler-BtG6aVza.js} +3 -3
  18. package/build/server/chunks/{index.js-NQAT8Awn.js → index.js-rGfUdWOY.js} +2 -2
  19. package/build/server/chunks/{manifest.js-hlUhRW1X.js → manifest.js-DwQ7BEt1.js} +5 -5
  20. package/build/server/chunks/nodes/{0.js-CuV3dXVD.js → 0.js-Cum-Y-us.js} +3 -3
  21. package/build/server/chunks/nodes/1.js-D0EwPqp_.js +9 -0
  22. package/build/server/chunks/nodes/{2.js-_lM-D6Dt.js → 2.js-ButkUErW.js} +3 -3
  23. package/package.json +2 -2
  24. package/skills/dsi-drive-terminal/SKILL.md +219 -0
  25. package/skills/dsi-publish/SKILL.md +67 -0
  26. package/template/.dsi/prompts.sqlite-shm +0 -0
  27. package/template/.dsi/prompts.sqlite-wal +0 -0
  28. package/template/.dsi/settings.yaml +1 -2
  29. package/build/client/_app/immutable/assets/0.Ch5VtsKp.css +0 -2
  30. package/build/client/_app/immutable/chunks/BFNQKoqg.js +0 -2
  31. package/build/client/_app/immutable/chunks/Be-_M64M.js +0 -1
  32. package/build/client/_app/immutable/chunks/Ds3NY1WI.js +0 -1
  33. package/build/client/_app/immutable/entry/start.Cvx_lhm5.js +0 -1
  34. package/build/server/chunks/nodes/1.js-CxcLyijV.js +0 -9
  35. /package/build/client/_app/immutable/nodes/{0.fsrqKU9i.js → 0.DeDuCaDD.js} +0 -0
@@ -1 +1 @@
1
- {"version":"1793727584003"}
1
+ {"version":"1793848049390"}
package/build/handler.js CHANGED
@@ -2,9 +2,9 @@ import './shims.js';
2
2
  import 'node:fs';
3
3
  import 'node:path';
4
4
  import 'node:process';
5
- export { h as handler } from './server/chunks/handler-Bn-Z9bWE.js';
6
- import './server/chunks/index.js-NQAT8Awn.js';
7
- import './server/chunks/manifest.js-hlUhRW1X.js';
5
+ export { h as handler } from './server/chunks/handler-BtG6aVza.js';
6
+ import './server/chunks/index.js-rGfUdWOY.js';
7
+ import './server/chunks/manifest.js-DwQ7BEt1.js';
8
8
  import './env.js';
9
9
  import 'node:buffer';
10
10
  import 'node:crypto';
@@ -19,6 +19,6 @@ import 'node:url';
19
19
  import './server/chunks/chunks/index-server.js-CPkVoRxB.js';
20
20
  import './server/chunks/chunks/server.js-Dijo7DtV.js';
21
21
  import './server/chunks/chunks/internal.js-BcS47nI-.js';
22
- import './server/chunks/chunks/internal2.js-zTmbne6n.js';
22
+ import './server/chunks/chunks/internal2.js-DRFhzPda.js';
23
23
  import './server/chunks/chunks/exports.js-DH_tjtdv.js';
24
24
  //# sourceMappingURL=handler.js.map
package/build/index.js CHANGED
@@ -1,7 +1,7 @@
1
1
  import http from 'node:http';
2
2
  import fs__default from 'node:fs';
3
3
  import process from 'node:process';
4
- import { p as polka, h as handler, f as format_listening_address } from './server/chunks/handler-Bn-Z9bWE.js';
4
+ import { p as polka, h as handler, f as format_listening_address } from './server/chunks/handler-BtG6aVza.js';
5
5
  import { env, timeout_env } from './env.js';
6
6
  import { rm } from 'node:fs/promises';
7
7
  import './shims.js';
@@ -14,13 +14,13 @@ import 'node:stream';
14
14
  import './server/chunks/chunks/shared.js-HQ0rfhm4.js';
15
15
  import './server/chunks/chunks/uneval.js-BJ9Qq2SF.js';
16
16
  import './server/chunks/chunks/utils.js-CAdNO8Tu.js';
17
- import './server/chunks/index.js-NQAT8Awn.js';
17
+ import './server/chunks/index.js-rGfUdWOY.js';
18
18
  import './server/chunks/chunks/index-server.js-CPkVoRxB.js';
19
19
  import './server/chunks/chunks/server.js-Dijo7DtV.js';
20
20
  import './server/chunks/chunks/internal.js-BcS47nI-.js';
21
- import './server/chunks/chunks/internal2.js-zTmbne6n.js';
21
+ import './server/chunks/chunks/internal2.js-DRFhzPda.js';
22
22
  import './server/chunks/chunks/exports.js-DH_tjtdv.js';
23
- import './server/chunks/manifest.js-hlUhRW1X.js';
23
+ import './server/chunks/manifest.js-DwQ7BEt1.js';
24
24
  import 'node:url';
25
25
 
26
26
  const path = env('SOCKET_PATH', false);
@@ -580,7 +580,7 @@ var options = {
580
580
  app: ({ head, body, assets, nonce, env }) => "<!doctype html>\n<html lang=\"%paraglide.locale%\">\n <head>\n <meta charset=\"utf-8\" />\n <link rel=\"icon\" href=\"" + assets + "/favicon.svg\" />\n <meta name=\"viewport\" content=\"width=device-width, initial-scale=1\" />\n <script>\n /* The Three-State Lamp pre-paint (ADR-0023 D3, 2026-10-11): resolve\n * the choice and set html[data-theme] BEFORE the bundle paints —\n * no flash of light on a dark reload. The key 'dsi-theme' is\n * pinned identical to src/lib/utils/theme-prefs.svelte.ts by\n * tests/unit/theme-prefs.test.ts; change both together. */\n try {\n var m = location.search.match(/[?&]profile=([^&]*)/);\n var prof = m ? m[1].replace(/[^A-Za-z0-9_-]/g, '').slice(0, 40) : '';\n var k = 'dsi-theme' + (prof ? '_' + prof : '');\n var t = localStorage.getItem(k);\n if (t !== 'light' && t !== 'dark' && t !== 'system') t = 'system';\n document.documentElement.dataset.theme =\n t === 'dark' || (t === 'system' && window.matchMedia && matchMedia('(prefers-color-scheme: dark)').matches)\n ? 'dark'\n : 'light';\n } catch (e) {\n document.documentElement.dataset.theme = 'light';\n }\n <\/script>\n " + head + "\n </head>\n <body data-sveltekit-preload-data=\"tap\">\n <div style=\"display: contents\">" + body + "</div>\n </body>\n</html>\n",
581
581
  error: error_template_default
582
582
  },
583
- version_hash: "p1hp0x"
583
+ version_hash: "1gjqxay"
584
584
  };
585
585
  async function get_hooks() {
586
586
  let handle;
@@ -603,4 +603,4 @@ async function get_hooks() {
603
603
  }
604
604
 
605
605
  export { set_public_env as a, set_read_implementation as b, get_hooks as g, options as o, public_env as p, read_implementation as r, set_private_env as s };
606
- //# sourceMappingURL=internal2.js-zTmbne6n.js.map
606
+ //# sourceMappingURL=internal2.js-DRFhzPda.js.map
@@ -1,6 +1,6 @@
1
1
  import { i as index_server_exports } from './index-server.js-CPkVoRxB.js';
2
2
  import './shared.js-HQ0rfhm4.js';
3
- import './internal2.js-zTmbne6n.js';
3
+ import './internal2.js-DRFhzPda.js';
4
4
  import './exports.js-DH_tjtdv.js';
5
5
  import { U as snapshot, g as getContext, n as noop } from './server.js-Dijo7DtV.js';
6
6
  import { U as UI_LOCALES } from './config.js-r_jw_bQQ.js';
@@ -304,4 +304,4 @@ var page = {
304
304
  };
305
305
 
306
306
  export { afterNavigate as a, backtoworkspace2 as b, currentLocale as c, dshunreachable1 as d, replaceState as e, page as p, reapednote1 as r, sessionnotfound2 as s, t, unexpectederror1 as u };
307
- //# sourceMappingURL=state.js-CPIukTkD.js.map
307
+ //# sourceMappingURL=state.js-kZHonU4N.js.map
@@ -1,9 +1,9 @@
1
1
  import { V as head, W as escape_html, M as derived } from '../../chunks/server.js-Dijo7DtV.js';
2
- import { t, p as page, s as sessionnotfound2, r as reapednote1, d as dshunreachable1, u as unexpectederror1, b as backtoworkspace2 } from '../../chunks/state.js-CPIukTkD.js';
2
+ import { t, p as page, s as sessionnotfound2, r as reapednote1, d as dshunreachable1, u as unexpectederror1, b as backtoworkspace2 } from '../../chunks/state.js-kZHonU4N.js';
3
3
  import '../../chunks/uneval.js-BJ9Qq2SF.js';
4
4
  import '../../chunks/index-server.js-CPkVoRxB.js';
5
5
  import '../../chunks/shared.js-HQ0rfhm4.js';
6
- import '../../chunks/internal2.js-zTmbne6n.js';
6
+ import '../../chunks/internal2.js-DRFhzPda.js';
7
7
  import '../../chunks/exports.js-DH_tjtdv.js';
8
8
  import '../../chunks/config.js-r_jw_bQQ.js';
9
9
  import '../../chunks/runtime.js-CCJi3XaY.js';
@@ -41,4 +41,4 @@ function _error($$renderer, $$props) {
41
41
  }
42
42
 
43
43
  export { _error as default };
44
- //# sourceMappingURL=_error.svelte.js-Dss5_PtG.js.map
44
+ //# sourceMappingURL=_error.svelte.js-BKhpJygh.js.map
@@ -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-BXjvTmJu.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-CPIukTkD.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-kZHonU4N.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-zTmbne6n.js';
24
+ import '../../chunks/internal2.js-DRFhzPda.js';
25
25
  import '../../chunks/utils.js-CAdNO8Tu.js';
26
26
 
27
27
  //#region src/lib/paraglide/messages/abort.js
@@ -13592,6 +13592,38 @@ var terminaltabsclearterminals3 = ((inputs = {}, options = {}) => {
13592
13592
  return en_terminaltabsclearterminals3();
13593
13593
  });
13594
13594
  //#endregion
13595
+ //#region src/lib/paraglide/messages/terminaltokenrefreshed2.js
13596
+ /** @typedef {import('../runtime.js').LocalizedString} LocalizedString */
13597
+ /** @typedef {{}} Terminaltokenrefreshed2Inputs */
13598
+ var en_terminaltokenrefreshed2 = () => {
13599
+ return `token refreshed — your keystroke was retried`;
13600
+ };
13601
+ var zh_terminaltokenrefreshed2 = () => {
13602
+ return `令牌已刷新 — 按键已重试`;
13603
+ };
13604
+ var id_terminaltokenrefreshed2 = () => {
13605
+ return `token disegarkan — ketikan Anda dicoba ulang`;
13606
+ };
13607
+ var es_terminaltokenrefreshed2 = () => {
13608
+ return `token renovado — tu tecla se reintentó`;
13609
+ };
13610
+ /**
13611
+ * | output |
13612
+ * | --- |
13613
+ * | "token refreshed — your keystroke was retried" |
13614
+ *
13615
+ * @param {Terminaltokenrefreshed2Inputs} inputs
13616
+ * @param {{ locale?: "en" | "zh" | "id" | "es" }} options
13617
+ * @returns {LocalizedString}
13618
+ */
13619
+ var terminaltokenrefreshed2 = ((inputs = {}, options = {}) => {
13620
+ const locale = options.locale ?? getLocale();
13621
+ if (locale === "zh") return zh_terminaltokenrefreshed2();
13622
+ if (locale === "id") return id_terminaltokenrefreshed2();
13623
+ if (locale === "es") return es_terminaltokenrefreshed2();
13624
+ return en_terminaltokenrefreshed2();
13625
+ });
13626
+ //#endregion
13595
13627
  //#region src/lib/paraglide/messages/text.js
13596
13628
  /** @typedef {import('../runtime.js').LocalizedString} LocalizedString */
13597
13629
  /** @typedef {{}} TextInputs */
@@ -16230,6 +16262,7 @@ var _index_exports = /* @__PURE__ */ __exportAll({
16230
16262
  terminalTabsClearAll: () => terminaltabsclearall3,
16231
16263
  terminalTabsClearJobs: () => terminaltabsclearjobs3,
16232
16264
  terminalTabsClearTerminals: () => terminaltabsclearterminals3,
16265
+ terminalTokenRefreshed: () => terminaltokenrefreshed2,
16233
16266
  text: () => text,
16234
16267
  themeChoice_dark: () => themechoice_dark1,
16235
16268
  themeChoice_light: () => themechoice_light1,
@@ -16733,6 +16766,7 @@ var messages_exports = /* @__PURE__ */ __exportAll({
16733
16766
  terminalTabsClearAll: () => terminaltabsclearall3,
16734
16767
  terminalTabsClearJobs: () => terminaltabsclearjobs3,
16735
16768
  terminalTabsClearTerminals: () => terminaltabsclearterminals3,
16769
+ terminalTokenRefreshed: () => terminaltokenrefreshed2,
16736
16770
  text: () => text,
16737
16771
  themeChoice_dark: () => themechoice_dark1,
16738
16772
  themeChoice_light: () => themechoice_light1,
@@ -18734,8 +18768,8 @@ function ThemeToggle($$renderer, $$props) {
18734
18768
  }
18735
18769
  //#endregion
18736
18770
  //#region package.json
18737
- var version = "0.9.1";
18738
- var dsh = { "webVersion": "0.2.2-alpha.2" };
18771
+ var version = "0.10.0";
18772
+ var dsh = { "webVersion": "0.2.2-rc.1" };
18739
18773
  //#endregion
18740
18774
  //#region src/lib/version.ts
18741
18775
  /**
@@ -34678,7 +34712,9 @@ var initialTerminalPanelState = {
34678
34712
  //#region src/lib/components/terminal/TerminalPanel.svelte
34679
34713
  function TerminalPanel($$renderer, $$props) {
34680
34714
  $$renderer.component(($$renderer) => {
34681
- let { onShellExit, assigned = null, onAssigned } = $$props;
34715
+ let { onShellExit, assigned = null, onAssigned, zoom = 1 } = $$props;
34716
+ /** Coerced zoom — the pocket's single source (null-safe default 1). */
34717
+ const pocketZoom = derived(() => zoom ?? 1);
34682
34718
  let panelState = { ...initialTerminalPanelState };
34683
34719
  Promise.resolve();
34684
34720
  /** Focus the live xterm surface (the desk's ⌥+N tab shortcut,
@@ -34697,9 +34733,11 @@ function TerminalPanel($$renderer, $$props) {
34697
34733
  $$renderer.push("<!--[0-->");
34698
34734
  $$renderer.push(`<span data-testid="terminal-settle-badge" class="rounded bg-slate-700 px-1.5 py-0.5">${escape_html(settleText(panelState.lastSettle))}</span>`);
34699
34735
  } else $$renderer.push("<!--[-1-->");
34736
+ $$renderer.push(`<!--]--> `);
34737
+ $$renderer.push("<!--[-1-->");
34700
34738
  $$renderer.push(`<!--]--> <div class="grow"></div></div> `);
34701
34739
  $$renderer.push("<!--[-1-->");
34702
- $$renderer.push(`<div class="relative min-h-72 grow overflow-hidden" data-testid="terminal-host" role="presentation"><div class="absolute inset-0"></div></div> `);
34740
+ $$renderer.push(`<div class="relative min-h-72 grow overflow-hidden" data-testid="terminal-host" role="presentation"><div class="absolute inset-0 origin-top-left"${attr_style(pocketZoom() === 1 ? void 0 : `right: auto; bottom: auto; width: ${pocketZoom() * 100}%; height: ${pocketZoom() * 100}%; transform: scale(${1 / pocketZoom()});`)}><div class="absolute inset-0"></div></div></div> `);
34703
34741
  $$renderer.push("<!--[-1-->");
34704
34742
  $$renderer.push(`<!--]--> `);
34705
34743
  $$renderer.push("<!--[-1-->");
@@ -34992,7 +35030,9 @@ function TerminalDesk($$renderer, $$props) {
34992
35030
  * bare command behaves byte-identically to the pre-desk panel. */
34993
35031
  /** Null = self-open (the panel runs its own ladder and reports back
34994
35032
  * via onAssigned); set = the desk holds this session's lease. */
34995
- let { onShellExit, restored = null, onMirror } = $$props;
35033
+ let { onShellExit, restored = null, onMirror, zoom = 1 } = $$props;
35034
+ /** Coerced zoom — one pocket source for every row (null-safe default 1). */
35035
+ const deskZoom = derived(() => zoom ?? 1);
34996
35036
  let nextKey = 1;
34997
35037
  const mkKey = () => nextKey++;
34998
35038
  const defaultTab = () => ({
@@ -35049,6 +35089,23 @@ function TerminalDesk($$renderer, $$props) {
35049
35089
  if (select) selectedTab = jobCount() - 1;
35050
35090
  }
35051
35091
  registerJobTabOpener((owner, jobId, label) => openJobTab(owner, jobId, label));
35092
+ /** The truthful badge grammar (2026-11-04 amendment, ADR D5e/D5f):
35093
+ * the shell-tab badge pairs the strip position with the session id —
35094
+ * single row assigned → 'T1:7' (registry id t-7 → 7); split →
35095
+ * 'T1:7+9' (row order); unassigned → plain 'T1'. Display-only: the
35096
+ * registry and mirror stay keyed on FULL session ids; the badge is a
35097
+ * view, mirroring the Glass chip's ordinal grammar. */
35098
+ function sessionOrdinal(id) {
35099
+ return id.replace(/^t-/, "");
35100
+ }
35101
+ function badgeSuffix(tab) {
35102
+ const ids = tab.rows.map((r) => r.assigned?.sessionId ?? "").filter((id) => id !== "");
35103
+ return ids.length > 0 ? ":" + ids.map(sessionOrdinal).join("+") : "";
35104
+ }
35105
+ function badgeTitle(tab) {
35106
+ const ids = tab.rows.map((r) => r.assigned?.sessionId ?? "").filter((id) => id !== "");
35107
+ return ids.length > 0 ? "session " + ids.join(", ") : "";
35108
+ }
35052
35109
  /** Mint a fresh session server-side and hand it to a new row (row
35053
35110
  * mode). A new tab or split-down NEVER re-attaches an existing
35054
35111
  * session — the reattach ladder is reload-recovery, not a spawner. */
@@ -35181,10 +35238,11 @@ function TerminalDesk($$renderer, $$props) {
35181
35238
  $$renderer.push(`<!--[-->`);
35182
35239
  const each_array = ensure_array_like(tabs);
35183
35240
  for (let i = 0, $$length = each_array.length; i < $$length; i++) {
35184
- each_array[i];
35241
+ let tab = each_array[i];
35185
35242
  TerminalTabButton($$renderer, {
35186
35243
  index: i,
35187
- label: "T" + (i + 1),
35244
+ label: "T" + (i + 1) + badgeSuffix(tab),
35245
+ title: badgeTitle(tab),
35188
35246
  selected: i === selectedTab,
35189
35247
  onSelect: () => selectedTab = i,
35190
35248
  onClose: () => closeTab(i)
@@ -35223,6 +35281,7 @@ function TerminalDesk($$renderer, $$props) {
35223
35281
  $$renderer.push(`<div class="min-h-0" style="flex: 1 1 0; min-height: 10rem;">`);
35224
35282
  TerminalPanel($$renderer, {
35225
35283
  assigned: row.assigned,
35284
+ zoom: deskZoom(),
35226
35285
  onAssigned: (sessionId, token) => recordAssigned(row, sessionId, token),
35227
35286
  onShellExit: () => removeRow(i, row)
35228
35287
  });
@@ -38528,6 +38587,7 @@ function _page($$renderer, $$props) {
38528
38587
  $$renderer.push(`<div class="panel-manager-body svelte-1uha8ag" data-testid="panel-terminal">`);
38529
38588
  TerminalDesk($$renderer, {
38530
38589
  restored: panel.desk ?? null,
38590
+ zoom: floorPanelId ? pagePrefs.zoom : 1,
38531
38591
  onMirror: (m) => {
38532
38592
  terminalDeskMirrors[panel.id] = m;
38533
38593
  },
@@ -38786,4 +38846,4 @@ function _page($$renderer, $$props) {
38786
38846
  }
38787
38847
 
38788
38848
  export { _page as default };
38789
- //# sourceMappingURL=_page.svelte.js-CJboFEGf.js.map
38849
+ //# sourceMappingURL=_page.svelte.js-BlbGdGej.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-NQAT8Awn.js';
13
- import { m as manifest } from './manifest.js-hlUhRW1X.js';
12
+ import { S as Server } from './index.js-rGfUdWOY.js';
13
+ import { m as manifest } from './manifest.js-DwQ7BEt1.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-Bn-Z9bWE.js.map
1735
+ //# sourceMappingURL=handler-BtG6aVza.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-zTmbne6n.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-DRFhzPda.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-Dijo7DtV.js';
9
9
 
@@ -3862,4 +3862,4 @@ var Server = class {
3862
3862
  };
3863
3863
 
3864
3864
  export { Server as S };
3865
- //# sourceMappingURL=index.js-NQAT8Awn.js.map
3865
+ //# sourceMappingURL=index.js-rGfUdWOY.js.map
@@ -10,11 +10,11 @@ return {
10
10
  assets: new Set(["favicon.svg"]),
11
11
  mimeTypes: {".svg":"image/svg+xml"},
12
12
  _: {
13
- client: {start:"_app/immutable/entry/start.Cvx_lhm5.js",app:"_app/immutable/entry/app.C_yn4m6w.js",imports:["_app/immutable/entry/start.Cvx_lhm5.js","_app/immutable/chunks/BFNQKoqg.js","_app/immutable/chunks/0Tfhif1V.js","_app/immutable/entry/app.C_yn4m6w.js","_app/immutable/chunks/0Tfhif1V.js","_app/immutable/chunks/HclGiUj8.js","_app/immutable/chunks/xihTtKlq.js"],stylesheets:[],fonts:[],uses_env_dynamic_public:false},
13
+ client: {start:"_app/immutable/entry/start.D-t6KuoK.js",app:"_app/immutable/entry/app.DjLAWmJH.js",imports:["_app/immutable/entry/start.D-t6KuoK.js","_app/immutable/chunks/BaH6C3xD.js","_app/immutable/chunks/0Tfhif1V.js","_app/immutable/entry/app.DjLAWmJH.js","_app/immutable/chunks/0Tfhif1V.js","_app/immutable/chunks/HclGiUj8.js","_app/immutable/chunks/xihTtKlq.js"],stylesheets:[],fonts:[],uses_env_dynamic_public:false},
14
14
  nodes: [
15
- __memo(() => import('./nodes/0.js-CuV3dXVD.js')),
16
- __memo(() => import('./nodes/1.js-CxcLyijV.js')),
17
- __memo(() => import('./nodes/2.js-_lM-D6Dt.js'))
15
+ __memo(() => import('./nodes/0.js-Cum-Y-us.js')),
16
+ __memo(() => import('./nodes/1.js-D0EwPqp_.js')),
17
+ __memo(() => import('./nodes/2.js-ButkUErW.js'))
18
18
  ],
19
19
  remotes: {
20
20
 
@@ -592,4 +592,4 @@ return {
592
592
  })();
593
593
 
594
594
  export { manifest as m };
595
- //# sourceMappingURL=manifest.js-hlUhRW1X.js.map
595
+ //# sourceMappingURL=manifest.js-DwQ7BEt1.js.map
@@ -4,9 +4,9 @@ const index = 0;
4
4
  let component_cache;
5
5
  const component = async () => component_cache ??= (await import('../entries/pages/_layout.svelte.js-DRfiLzlz.js')).default;
6
6
  const universal_id = "src/routes/+layout.ts";
7
- const imports = ["_app/immutable/nodes/0.fsrqKU9i.js","_app/immutable/chunks/0Tfhif1V.js","_app/immutable/chunks/xihTtKlq.js","_app/immutable/chunks/CTWtsoJD.js","_app/immutable/chunks/D9jhmf3I.js"];
8
- const stylesheets = ["_app/immutable/assets/0.Ch5VtsKp.css"];
7
+ const imports = ["_app/immutable/nodes/0.DeDuCaDD.js","_app/immutable/chunks/0Tfhif1V.js","_app/immutable/chunks/xihTtKlq.js","_app/immutable/chunks/CTWtsoJD.js","_app/immutable/chunks/D9jhmf3I.js"];
8
+ const stylesheets = ["_app/immutable/assets/0.uhYTRapi.css"];
9
9
  const fonts = [];
10
10
 
11
11
  export { component, fonts, imports, index, stylesheets, universal_id };
12
- //# sourceMappingURL=0.js-CuV3dXVD.js.map
12
+ //# sourceMappingURL=0.js-Cum-Y-us.js.map
@@ -0,0 +1,9 @@
1
+ const index = 1;
2
+ let component_cache;
3
+ const component = async () => component_cache ??= (await import('../entries/pages/_error.svelte.js-BKhpJygh.js')).default;
4
+ const imports = ["_app/immutable/nodes/1.w6Hz6-dJ.js","_app/immutable/chunks/0Tfhif1V.js","_app/immutable/chunks/xihTtKlq.js","_app/immutable/chunks/Bu2owQS4.js","_app/immutable/chunks/BaH6C3xD.js","_app/immutable/chunks/D9jhmf3I.js"];
5
+ const stylesheets = [];
6
+ const fonts = [];
7
+
8
+ export { component, fonts, imports, index, stylesheets };
9
+ //# sourceMappingURL=1.js-D0EwPqp_.js.map
@@ -19,11 +19,11 @@ import '../chunks/uneval.js-BJ9Qq2SF.js';
19
19
 
20
20
  const index = 2;
21
21
  let component_cache;
22
- const component = async () => component_cache ??= (await import('../entries/pages/_page.svelte.js-CJboFEGf.js')).default;
22
+ const component = async () => component_cache ??= (await import('../entries/pages/_page.svelte.js-BlbGdGej.js')).default;
23
23
  const server_id = "src/routes/+page.server.ts";
24
- const imports = ["_app/immutable/nodes/2.ckwEPlsL.js","_app/immutable/chunks/0Tfhif1V.js","_app/immutable/chunks/BFNQKoqg.js","_app/immutable/chunks/HclGiUj8.js","_app/immutable/chunks/xihTtKlq.js","_app/immutable/chunks/D9jhmf3I.js","_app/immutable/chunks/CTWtsoJD.js","_app/immutable/chunks/DXD_Wzp9.js"];
24
+ const imports = ["_app/immutable/nodes/2.CFmqEODJ.js","_app/immutable/chunks/0Tfhif1V.js","_app/immutable/chunks/BaH6C3xD.js","_app/immutable/chunks/HclGiUj8.js","_app/immutable/chunks/xihTtKlq.js","_app/immutable/chunks/D9jhmf3I.js","_app/immutable/chunks/CTWtsoJD.js","_app/immutable/chunks/Bu2owQS4.js"];
25
25
  const stylesheets = ["_app/immutable/assets/2.D0QOh44D.css"];
26
26
  const fonts = [];
27
27
 
28
28
  export { component, fonts, imports, index, server_id, stylesheets };
29
- //# sourceMappingURL=2.js-_lM-D6Dt.js.map
29
+ //# sourceMappingURL=2.js-ButkUErW.js.map
package/package.json CHANGED
@@ -1,6 +1,6 @@
1
1
  {
2
2
  "name": "@deepseek-insight/dsi",
3
- "version": "0.9.1",
3
+ "version": "0.10.0",
4
4
  "description": "See your multiple agents run on the floor (agent, sub-agent, etc), each conversation on the floor are updated instantly.",
5
5
  "keywords": [
6
6
  "Deepseek",
@@ -38,7 +38,7 @@
38
38
  "node": ">=22.19"
39
39
  },
40
40
  "dsh": {
41
- "webVersion": "0.2.2-alpha.2"
41
+ "webVersion": "0.2.2-rc.1"
42
42
  },
43
43
  "bin": {
44
44
  "dsi": "bin/dsi.mjs"
@@ -0,0 +1,219 @@
1
+ ---
2
+ name: "dsi-drive-terminal"
3
+ description: "Drive the operator's live Terminal Desk tab (T1, T2, …) over DSI's terminal wire with curl — baton etiquette, human-pace typing, ring reads, silent-eater escapes. Reserved keyword"
4
+ ---
5
+
6
+ # Drive Terminal
7
+
8
+ One goal → a live terminal session driven over DSI's terminal wire with
9
+ curl: take the baton, type like a human, read what the shell said — while
10
+ the operator watches the same bytes paint their desk tab.
11
+
12
+ ## SYSTEM PROTOCOL: THE BATON LAW
13
+
14
+ The session's write token is a baton with ONE holder. Every rule below
15
+ instantiates it (ADR The Surviving Shell 2026-09-24 + amendments
16
+ 2026-11-04; mechanics: `dev/feature-contract-scenario/terminal-driving.md`):
17
+
18
+ ### 1. BATON ETIQUETTE (who may type)
19
+ - Take the baton (`reattach`) only when about to write; a refused write
20
+ (`403 FOREIGN_SESSION`) means heal — reattach once, retry the SAME
21
+ keystroke — never retry blind, never re-mint in a loop.
22
+ - The operator's tab heals identically (their first key after your takeover
23
+ shows the heal badge); watching is token-free, so displays never break.
24
+
25
+ ### 2. THE DESK IS THE UX (what the operator sees)
26
+ - Run commands UNPIPED — the operator watches progress paint live; `| tail`
27
+ a build they are watching and you have hidden their own terminal.
28
+ - The PTY echoes reality: no echo = the write was refused or the shell is
29
+ busy. NEVER type while a command is still running (keystrokes go into
30
+ that process's stdin, silently).
31
+
32
+ ### 3. ESCAPE THE SILENT EATER (writes say `written:true`, nothing executes)
33
+ - An interactive prompt is consuming stdin — met live: `git push` username
34
+ prompt, open commit editor, package-manager approve prompt.
35
+ - Escape: `\u0003\u0003` (Ctrl+C ×2), or ESC + `:qa!\r` (vi family), then a
36
+ marker (`echo ALIVE\r\n`) to confirm the prompt answers.
37
+
38
+ ### Enforcement Rules
39
+ - Every write response MUST be checked: `{"written":true}` or handled
40
+ (`403` → heal, `409 SEND_ACTIVE` → wait, `400` → fix the body).
41
+ - **The receipt is necessary, never sufficient**: a dead session still
42
+ answers `written:true` (known trap — `session.ts` silently no-ops an
43
+ exited target; honest refusal deferred). Completion gates on ECHO +
44
+ the exit marker in the ring, never on the receipt alone. A receipt
45
+ with no echo → check `GET /api/terminal` `exited` first, silent
46
+ eater second (RCA 2026-11-04).
47
+
48
+ ---
49
+
50
+ ## When to Use
51
+
52
+ - User says `/dsi-drive-terminal {what to run}` or "drive T1"
53
+ - User asks to install/build/run something "on the terminal" while their
54
+ desk tab is the surface they will judge
55
+ - Agent needs to execute on a remote box the operator's shell is SSH'd into
56
+
57
+ ### Step 0: No Params — Usage Guide
58
+
59
+ When the user sends `/dsi-drive-terminal` with no arguments:
60
+
61
+ 1. Ask which session and what to run:
62
+ 2. Reply with a usage guide — NOT execution
63
+
64
+ **Response format:**
65
+
66
+ ```
67
+ 📋 **Drive Terminal** — No inputs specified. I need two things:
68
+
69
+ 1. **Session** — the desk tab (T1, T2, …) or "open a new one"
70
+ 2. **Command / goal** — what to run, e.g. "pnpm install then build"
71
+
72
+ Usage: `/dsi-drive-terminal {session} {command}`
73
+ ```
74
+
75
+ **Rules:**
76
+ - If the goal spans many commands, confirm the order before typing
77
+ - Do NOT take the baton until the goal is confirmed
78
+
79
+ ## Pipeline
80
+
81
+ ```mermaid
82
+ flowchart LR
83
+ A["/dsi-drive-terminal"] --> B["Step 1<br/>floor + baton"]
84
+ B --> C["Step 2<br/>type (paced, checked)"]
85
+ C --> D["Step 3<br/>read promptly"]
86
+ D --> E{"done?"}
87
+ E -->|"no"| C
88
+ E -->|"yes"| F["report what the<br/>operator saw"]
89
+ ```
90
+
91
+ ---
92
+
93
+ ## Step 1: Floor + Baton ⛔ MANDATORY
94
+
95
+ Resolve the floor port by PROBE, never by memory of a previous session:
96
+
97
+ ```sh
98
+ PORT=5175 # only after a listener probe confirms it
99
+ curl -s http://127.0.0.1:$PORT/api/terminal # list sessions
100
+ curl -s -X POST http://127.0.0.1:$PORT/api/terminal/$ID/reattach -o /tmp/t.json
101
+ TOK=$(sed 's/.*"token":"\([^"]*\)".*/\1/' /tmp/t.json)
102
+ OFF=$(sed 's/.*"fromByte":\([0-9]*\).*/\1/' /tmp/t.json)
103
+ ```
104
+
105
+ - No live session → `POST /api/terminal` opens one (new T-tab on the desk).
106
+ - `403`/foreign responses on write → heal: reattach, retry the same write.
107
+ - **Resolve the session id from evidence, never from the tab position.**
108
+ The desk badge names its session: `T{position}:{id}` (`T1:7` = tab
109
+ index 1, session `t-7`; splits join with `+`, unassigned tabs show
110
+ plain `Tn`). Cross-check `GET /api/terminal` (`exited` flag) — the
111
+ live trap: desk tab "T1" drove session `t-7` while `t-1` was an hour
112
+ dead, and 69 keystrokes vanished (RCA 2026-11-04, "The Surface That Only
113
+ Ever Said Yes").
114
+
115
+ ---
116
+
117
+ ## Step 2: Type ⛔ MANDATORY
118
+
119
+ Build the JSON body with node — never inline-quote shell strings (one bad
120
+ escape is a silent `BAD_REQUEST`):
121
+
122
+ ```sh
123
+ node -e 'const fs=require("fs");const tok=fs.readFileSync("/tmp/t1-token","utf8").trim();
124
+ fs.writeFileSync("/tmp/t1-cmd.json",JSON.stringify({token:tok,action:"write",data:"uname -a\r\n"}))'
125
+ curl -s -X POST http://127.0.0.1:$PORT/api/terminal/$ID/send \
126
+ -H 'content-type: application/json' --data-binary @/tmp/t1-cmd.json
127
+ ```
128
+
129
+ - **Human pace when the operator watches**: one char per write, ~120 ms
130
+ apart, each response checked `{"written":true}`. Faster bursts hit the
131
+ write fence and DROP characters (live: `sudo apt update` →
132
+ `sudoaptupdate`, zsh "command not found").
133
+ - **Passwords**: same pacing; PTY echo is off — the secret never lands in
134
+ scrollback, the desk shows dots.
135
+ - **End every long command with a marker**: `; echo STEP-DONE-$?` — the
136
+ marker is the completion gate (exit code included).
137
+
138
+ ---
139
+
140
+ ## Step 3: Read ⛔ MANDATORY
141
+
142
+ ```sh
143
+ curl -s "http://127.0.0.1:$PORT/api/terminal/$ID/output?fromByte=$OFF"
144
+ ```
145
+
146
+ - `$OFF` captured BEFORE the command; read right after it finishes.
147
+ - ANSI strip: `sed 's/\\u001b\[[0-9;?]*[a-zA-Z=]//g; s/\\u0007//g; s/\\r\\n/\n/g; s/\\n/\n/g; s/\\r//g'`
148
+ - Empty/short read → the ring rotated; re-read `fromByte=0` (full retained
149
+ ring) or re-run redirecting output to a file and `cat` a slice.
150
+
151
+ ---
152
+
153
+ ## Step 4: Silent Eater ⛔ MANDATORY
154
+
155
+ Writes say `written:true` but nothing executes or echoes → an interactive
156
+ prompt is consuming stdin (credential prompt, commit editor, approve
157
+ prompt). Escape per SYSTEM PROTOCOL §3, confirm with a marker, re-send.
158
+
159
+ ---
160
+
161
+ ## Drive Checklist — MANDATORY
162
+
163
+ This is the ONLY checklist output to the user. Declared at the start,
164
+ verified at the end.
165
+
166
+ ```
167
+ 📋 drive-terminal: {session} — {goal}
168
+
169
+ [ ] 1.1 ⛔ Floor port probed (listener confirmed, not assumed)
170
+ [ ] 1.2 ⛔ Baton taken (reattach → token + offset captured)
171
+ [ ] 1.3 ⛔ Session id resolved from badge suffix / sessions list — NOT assumed from the tab position
172
+ [ ] 2.1 ⛔ Every write response checked (written / healed / refused)
173
+ [ ] 2.2 ⛔ Long commands carry an exit marker; completion gated on it
174
+ [ ] 2.4 ⛔ Receipt cross-checked by echo + marker (dead sessions answer written:true)
175
+ [ ] 2.3 ⛔ Operator-paced typing (≈120 ms/char, verified) when watched
176
+ [ ] 3.1 ⛔ Output read from pre-captured offset, promptly
177
+ [ ] 3.2 ⛔ Ring misses recovered (fromByte=0 or file+cat)
178
+ [ ] 4.1 ⛔ Any silent eater escaped (Ctrl+C / :qa!) and marker-confirmed
179
+ [ ] 4.2 ⛔ Dead-session eater ruled OUT via GET /api/terminal exited flag (RCA 2026-11-04)
180
+ [ ] 5.1 ⛔ Commands ran UNPIPED — the operator could watch everything
181
+ [ ] 5.2 ⛔ Report states what the desk showed, not just what was read
182
+
183
+ ⛔ Behavioral Commitments:
184
+ [ ] I will NOT retry a refused write blind — heal (reattach) first
185
+ [ ] I will NOT type while a command is still running
186
+ [ ] I will NOT pipe or silence output the operator is watching
187
+ [ ] I will NOT send keystrokes into an unverified prompt state
188
+ [ ] I will NOT claim success without the exit marker in the read
189
+ [ ] I will re-output this checklist at each step transition
190
+ ━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━
191
+ ```
192
+
193
+ ### Check-Off Rules
194
+
195
+ - Re-output the checklist with `[✅]` / `[🔄]` / `[ ]` at each step
196
+ transition (1→2, 2→3, 3→4).
197
+ - At completion, output the final checklist: ALL `[✅]`, any `[❌]`.
198
+ - Do NOT deliver without the final checklist.
199
+ <!-- RCA: AI-Research/LLMs Skip Mandatory Steps/001. LLMs Skip Mandatory Steps/002.The Visible checklist Pattern/2026-06-11 - The Visible Checklist Pattern - AI Research v1 - report.md -->
200
+
201
+ ---
202
+
203
+ ## How This Skill Connects to the Docs
204
+
205
+ The skill is the DO-path; the docs carry the WHY and the CONTRACT.
206
+
207
+ ```mermaid
208
+ flowchart LR
209
+ A["/dsi-drive-terminal<br/>this skill"] --> B["KB terminal-driving.md<br/>feature / contract / scenario"]
210
+ B --> C["ADR The Surviving Shell<br/>lease + auto-heal decisions"]
211
+ A --> D["Live floor<br/>the operator's desk tab"]
212
+ ```
213
+
214
+ ## Attention-Degradation Protection
215
+
216
+ This skill stays SHORT. The mechanics and contract live in the KB note
217
+ (`dev/feature-contract-scenario/terminal-driving.md`); the decisions live in
218
+ the ADR. This skill only orchestrates the drive.
219
+ <!-- RCA: AI-Research/YT-Research/2026-06-22 - Why Long Instructions Make AI Dumber - Attention Degradation Science.md -->