@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.
- package/build/client/_app/immutable/assets/0.uhYTRapi.css +2 -0
- package/build/client/_app/immutable/chunks/0Uk2rkmL.js +1 -0
- package/build/client/_app/immutable/chunks/BaH6C3xD.js +2 -0
- package/build/client/_app/immutable/chunks/{DXD_Wzp9.js → Bu2owQS4.js} +1 -1
- package/build/client/_app/immutable/chunks/DXba8Dom.js +1 -0
- package/build/client/_app/immutable/entry/{app.C_yn4m6w.js → app.DjLAWmJH.js} +2 -2
- package/build/client/_app/immutable/entry/start.D-t6KuoK.js +1 -0
- package/build/client/_app/immutable/nodes/{1.DZxzqrcK.js → 1.w6Hz6-dJ.js} +1 -1
- package/build/client/_app/immutable/nodes/{2.ckwEPlsL.js → 2.CFmqEODJ.js} +107 -107
- package/build/client/_app/version.json +1 -1
- package/build/handler.js +4 -4
- package/build/index.js +4 -4
- package/build/server/chunks/chunks/{internal2.js-zTmbne6n.js → internal2.js-DRFhzPda.js} +2 -2
- package/build/server/chunks/chunks/{state.js-CPIukTkD.js → state.js-kZHonU4N.js} +2 -2
- package/build/server/chunks/entries/pages/{_error.svelte.js-Dss5_PtG.js → _error.svelte.js-BKhpJygh.js} +3 -3
- package/build/server/chunks/entries/pages/{_page.svelte.js-CJboFEGf.js → _page.svelte.js-BlbGdGej.js} +70 -10
- package/build/server/chunks/{handler-Bn-Z9bWE.js → handler-BtG6aVza.js} +3 -3
- package/build/server/chunks/{index.js-NQAT8Awn.js → index.js-rGfUdWOY.js} +2 -2
- package/build/server/chunks/{manifest.js-hlUhRW1X.js → manifest.js-DwQ7BEt1.js} +5 -5
- package/build/server/chunks/nodes/{0.js-CuV3dXVD.js → 0.js-Cum-Y-us.js} +3 -3
- package/build/server/chunks/nodes/1.js-D0EwPqp_.js +9 -0
- package/build/server/chunks/nodes/{2.js-_lM-D6Dt.js → 2.js-ButkUErW.js} +3 -3
- package/package.json +2 -2
- package/skills/dsi-drive-terminal/SKILL.md +219 -0
- package/skills/dsi-publish/SKILL.md +67 -0
- package/template/.dsi/prompts.sqlite-shm +0 -0
- package/template/.dsi/prompts.sqlite-wal +0 -0
- package/template/.dsi/settings.yaml +1 -2
- package/build/client/_app/immutable/assets/0.Ch5VtsKp.css +0 -2
- package/build/client/_app/immutable/chunks/BFNQKoqg.js +0 -2
- package/build/client/_app/immutable/chunks/Be-_M64M.js +0 -1
- package/build/client/_app/immutable/chunks/Ds3NY1WI.js +0 -1
- package/build/client/_app/immutable/entry/start.Cvx_lhm5.js +0 -1
- package/build/server/chunks/nodes/1.js-CxcLyijV.js +0 -9
- /package/build/client/_app/immutable/nodes/{0.fsrqKU9i.js → 0.DeDuCaDD.js} +0 -0
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":"
|
|
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-
|
|
6
|
-
import './server/chunks/index.js-
|
|
7
|
-
import './server/chunks/manifest.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-
|
|
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-
|
|
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-
|
|
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-
|
|
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-
|
|
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: "
|
|
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-
|
|
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-
|
|
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-
|
|
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-
|
|
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-
|
|
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-
|
|
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-
|
|
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-
|
|
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.
|
|
18738
|
-
var dsh = { "webVersion": "0.2.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-
|
|
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-
|
|
13
|
-
import { m as manifest } from './manifest.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-
|
|
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-
|
|
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-
|
|
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.
|
|
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-
|
|
16
|
-
__memo(() => import('./nodes/1.js-
|
|
17
|
-
__memo(() => import('./nodes/2.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-
|
|
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.
|
|
8
|
-
const stylesheets = ["_app/immutable/assets/0.
|
|
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-
|
|
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-
|
|
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.
|
|
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-
|
|
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.
|
|
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-
|
|
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 -->
|