@deepseek-insight/dsi 0.11.0 → 0.11.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 (47) hide show
  1. package/README.md +118 -30
  2. package/bin/dsi-chassis.mjs +371 -0
  3. package/bin/dsi.mjs +22 -5
  4. package/build/client/_app/immutable/chunks/{e-3PBXxJ.js → BXbGQv0I.js} +1 -1
  5. package/build/client/_app/immutable/chunks/{UPlr67N1.js → CLf6wcwo.js} +2 -2
  6. package/build/client/_app/immutable/chunks/DXwjOJ3W.js +1 -0
  7. package/build/client/_app/immutable/chunks/FP3OKgFQ.js +1 -0
  8. package/build/client/_app/immutable/entry/{app.ezxtVZch.js → app.wTcqn7d3.js} +2 -2
  9. package/build/client/_app/immutable/entry/start.Bo2gqLX-.js +1 -0
  10. package/build/client/_app/immutable/nodes/{1.CGppLUrN.js → 1.5Yu0dCHp.js} +1 -1
  11. package/build/client/_app/immutable/nodes/{2.9BE7-E5x.js → 2.DAzLHFNq.js} +107 -107
  12. package/build/client/_app/version.json +1 -1
  13. package/build/handler.js +4 -4
  14. package/build/index.js +4 -4
  15. package/build/server/chunks/chunks/{internal2.js-Cu5N8_4R.js → internal2.js-D_dNqBcA.js} +2 -2
  16. package/build/server/chunks/chunks/{registry.js-Bwc2MNSZ.js → registry.js-Cnmd1vW3.js} +194 -19
  17. package/build/server/chunks/chunks/{state.js-CRPhnJJH.js → state.js-BIGPexgb.js} +2 -2
  18. package/build/server/chunks/entries/endpoints/api/browser/_id_/activate/{_server.ts.js-BxfB-QXT.js → _server.ts.js-DlbbO3RF.js} +2 -2
  19. package/build/server/chunks/entries/endpoints/api/browser/_id_/close/{_server.ts.js-DT6rU-EU.js → _server.ts.js-B85bLw4w.js} +2 -2
  20. package/build/server/chunks/entries/endpoints/api/browser/_id_/closetab/{_server.ts.js-Cwu4C98Y.js → _server.ts.js-Dt5Bxv2-.js} +2 -2
  21. package/build/server/chunks/entries/endpoints/api/browser/_id_/element/{_server.ts.js-B55tx3-S.js → _server.ts.js-uJ5BnGUA.js} +2 -2
  22. package/build/server/chunks/entries/endpoints/api/browser/_id_/history/{_server.ts.js-D2ft7u0s.js → _server.ts.js-CVCoWk2n.js} +2 -2
  23. package/build/server/chunks/entries/endpoints/api/browser/_id_/input/{_server.ts.js-BO1uO6i3.js → _server.ts.js-CmhQ7zGO.js} +2 -2
  24. package/build/server/chunks/entries/endpoints/api/browser/_id_/mcp/{_server.ts.js-zOccgfJZ.js → _server.ts.js-CFtpmSCd.js} +2 -2
  25. package/build/server/chunks/entries/endpoints/api/browser/_id_/navigate/{_server.ts.js-DgyR0sLf.js → _server.ts.js-BH8MNt9W.js} +2 -2
  26. package/build/server/chunks/entries/endpoints/api/browser/_id_/opentab/{_server.ts.js-CPCIL2MG.js → _server.ts.js-uIrK0T8h.js} +2 -2
  27. package/build/server/chunks/entries/endpoints/api/browser/_id_/page/{_server.ts.js-Cjvr5nEt.js → _server.ts.js-Bg5yHS9F.js} +2 -2
  28. package/build/server/chunks/entries/endpoints/api/browser/_id_/stream/{_server.ts.js-Bb3DkB-H.js → _server.ts.js-DG6xvUsm.js} +2 -2
  29. package/build/server/chunks/entries/endpoints/api/browser/_id_/tabs/{_server.ts.js-DVcq1pYf.js → _server.ts.js-RiXP45mV.js} +2 -2
  30. package/build/server/chunks/entries/endpoints/api/browser/_id_/viewport/{_server.ts.js-D1xgkwTO.js → _server.ts.js-w9MNQddQ.js} +2 -2
  31. package/build/server/chunks/entries/endpoints/api/browser/_id_/zoom/{_server.ts.js-DFo94fTq.js → _server.ts.js-BoXDoshV.js} +2 -2
  32. package/build/server/chunks/entries/endpoints/api/browser/{_server.ts.js-0Gye8oLN.js → _server.ts.js-pQmJm_Io.js} +2 -2
  33. package/build/server/chunks/entries/pages/{_error.svelte.js-CJ9RHd_3.js → _error.svelte.js-MpJVAPPn.js} +3 -3
  34. package/build/server/chunks/entries/pages/{_page.svelte.js-DlLAziUY.js → _page.svelte.js-tSeYvTqX.js} +111 -10
  35. package/build/server/chunks/{handler-BRlzTcii.js → handler-CdfDULha.js} +3 -3
  36. package/build/server/chunks/{index.js-D2umW-Cg.js → index.js-CAZuEVlJ.js} +2 -2
  37. package/build/server/chunks/{manifest.js-CaT4HRXz.js → manifest.js-Bq-QTetg.js} +19 -19
  38. package/build/server/chunks/nodes/1.js-CKR9qKW9.js +9 -0
  39. package/build/server/chunks/nodes/{2.js-CF_m1q-z.js → 2.js-BuwXpGsh.js} +3 -3
  40. package/package.json +1 -1
  41. package/skills/dsi-host-drive/SKILL.md +96 -0
  42. package/template/.dsi/prompts.sqlite-shm +0 -0
  43. package/template/.dsi/prompts.sqlite-wal +0 -0
  44. package/build/client/_app/immutable/chunks/Dj8AK3pr.js +0 -1
  45. package/build/client/_app/immutable/chunks/WySTHi46.js +0 -1
  46. package/build/client/_app/immutable/entry/start.DdPLwPDt.js +0 -1
  47. package/build/server/chunks/nodes/1.js-cXTCbvze.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-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-CRPhnJJH.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-BIGPexgb.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-Cu5N8_4R.js';
24
+ import '../../chunks/internal2.js-D_dNqBcA.js';
25
25
  import '../../chunks/utils.js-CAdNO8Tu.js';
26
26
 
27
27
  //#region src/lib/paraglide/messages/abort.js
@@ -19220,7 +19220,7 @@ function ThemeToggle($$renderer, $$props) {
19220
19220
  }
19221
19221
  //#endregion
19222
19222
  //#region package.json
19223
- var version = "0.11.0";
19223
+ var version = "0.11.2";
19224
19224
  var dsh = { "webVersion": "0.2.2-rc.1" };
19225
19225
  //#endregion
19226
19226
  //#region src/lib/version.ts
@@ -28495,6 +28495,100 @@ function autolinkBareUrls(text) {
28495
28495
  function emphasis(text) {
28496
28496
  return text.replace(/\*\*\*(.+?)\*\*\*/g, "<strong><em>$1</em></strong>").replace(/\*\*(.+?)\*\*/g, "<strong>$1</strong>").replace(/\*(.+?)\*/g, "<em>$1</em>").replace(/(?<![\w])_(.+?)_(?![\w])/g, "<em>$1</em>").replace(/~~(.+?)~~/g, "<del>$1</del>");
28497
28497
  }
28498
+ /** The tags the FILE PREVIEW path may revive from source (ADR-0055 D2;
28499
+ * strong/em added 2026-11-09 amendment — real READMEs carry them INSIDE
28500
+ * revived <p> blocks, and they take no attributes): centered banners
28501
+ * (p/div/center + img), collapsibles (details/summary), br for README line
28502
+ * breaks, bold/italic for HTML-paragraph prose. Everything else stays
28503
+ * escaped text. */
28504
+ var PREVIEW_TAGS = [
28505
+ "p",
28506
+ "div",
28507
+ "img",
28508
+ "br",
28509
+ "details",
28510
+ "summary",
28511
+ "center",
28512
+ "strong",
28513
+ "em"
28514
+ ];
28515
+ /** Attributes a revived tag may carry (ADR-0055 D2). `src` is the only URL
28516
+ * attribute and is additionally scheme-gated to http(s) below. */
28517
+ var PREVIEW_ATTRS = [
28518
+ "align",
28519
+ "src",
28520
+ "alt",
28521
+ "width",
28522
+ "height"
28523
+ ];
28524
+ var PREVIEW_TAG_RE = PREVIEW_TAGS.join("|");
28525
+ /** One raw HTML token shape the preview path may consider: an open or
28526
+ * closing tag of an allow-listed name with no `>` inside. Malformed
28527
+ * constructs (unterminated, stray `>` in attrs) never match and ride the
28528
+ * strict path as plain text. */
28529
+ var PREVIEW_TOKEN_RE = new RegExp(`</?(?:${PREVIEW_TAG_RE})(?:\\s[^>]*)?>`, "gi");
28530
+ /**
28531
+ * Validate and rebuild ONE raw source token (ADR-0055 weakest-point rule):
28532
+ * revival happens only when the tag name is allow-listed AND every
28533
+ * attribute parses as name or name="value" AND is allow-listed AND the src
28534
+ * value (the sole URL attribute) is http(s). ONE hostile attribute leaves
28535
+ * the WHOLE token escaped — no partial revival. Uppercase normalizes to
28536
+ * lowercase; attr values are re-escaped before emission.
28537
+ */
28538
+ function revivePreviewToken(token) {
28539
+ const m = /^<(\/?)([A-Za-z]+)((?:\s[^>]*)?)(\/?)>$/.exec(token);
28540
+ if (!m) return escapeHtml(token);
28541
+ const closing = m[1] === "/";
28542
+ const tag = m[2].toLowerCase();
28543
+ const attrRegion = m[3].replace(/\/$/, "").trim();
28544
+ const selfClose = m[4] === "/";
28545
+ if (closing) return attrRegion === "" ? `</${tag}>` : escapeHtml(token);
28546
+ const attrs = [];
28547
+ if (attrRegion !== "") {
28548
+ const attrRe = /(^|\s+)([A-Za-z][A-Za-z0-9-]*)(?:=("[^"]*"|[^\s"'>]+))?(?=\s|$)/g;
28549
+ let cursor = 0;
28550
+ for (const a of attrRegion.matchAll(attrRe)) {
28551
+ const starts = a.index;
28552
+ if (starts !== cursor) return escapeHtml(token);
28553
+ const name = a[2].toLowerCase();
28554
+ if (!PREVIEW_ATTRS.includes(name)) return escapeHtml(token);
28555
+ let value = "";
28556
+ if (a[3] !== void 0) {
28557
+ value = a[3];
28558
+ value = value.startsWith("\"") && value.endsWith("\"") && value.length >= 2 ? value.slice(1, -1) : value;
28559
+ if (name === "src" && !/^https?:\/\/[^\s"']+$/i.test(value)) return escapeHtml(token);
28560
+ } else if (name === "src") return escapeHtml(token);
28561
+ attrs.push(`${name}="${escapeHtml(value)}"`);
28562
+ cursor = starts + a[0].length;
28563
+ }
28564
+ if (cursor !== attrRegion.length) return escapeHtml(token);
28565
+ }
28566
+ const slash = tag === "img" || tag === "br" || selfClose ? " /" : "";
28567
+ return `<${tag}${attrs.length > 0 ? " " + attrs.join(" ") : ""}${slash}>`;
28568
+ }
28569
+ /**
28570
+ * Render markdown for the FILE PREVIEW surface (ADR-0055 D1, opt-in second
28571
+ * path). Candidate allow-listed HTML tokens are VAULTED out of the raw
28572
+ * source first (fence bodies stay in place — D3: fenced HTML is data,
28573
+ * never markup), the strict escape-first pipeline then renders the
28574
+ * remainder unchanged, and the vault is spliced back ONLY after
28575
+ * whole-token validation above. Chat surfaces must keep calling
28576
+ * renderMarkdown — they never touch this path.
28577
+ */
28578
+ function renderPreviewMarkdown(text) {
28579
+ if (text === "") return "";
28580
+ const vault = [];
28581
+ let body = "";
28582
+ let last = 0;
28583
+ for (const f of text.matchAll(/```[\s\S]*?(```|$)/g)) {
28584
+ const head = text.slice(last, f.index);
28585
+ body += head.replace(PREVIEW_TOKEN_RE, (t) => `\u0001${vault.push(t) - 1}\u0001`);
28586
+ body += f[0];
28587
+ last = f.index + f[0].length;
28588
+ }
28589
+ body += text.slice(last).replace(PREVIEW_TOKEN_RE, (t) => `\u0001${vault.push(t) - 1}\u0001`);
28590
+ return renderMarkdown(body).replace(/\u0001(\d+)\u0001/g, (_m, i) => revivePreviewToken(vault[Number(i)] ?? ""));
28591
+ }
28498
28592
  /**
28499
28593
  * [label](href) — http(s) hrefs become hardened external anchors; SCHEME-FREE
28500
28594
  * relative hrefs (assistant file links like [card](src/lib/…)) become same-
@@ -29166,11 +29260,11 @@ function RawPreviewToggle($$renderer, $$props) {
29166
29260
  //#region src/lib/components/common/viewers/MarkdownContent.svelte
29167
29261
  function MarkdownContent($$renderer, $$props) {
29168
29262
  $$renderer.component(($$renderer) => {
29169
- let { content, small = false, hideToggle = false, searchTerm = "", onFileLink = void 0 } = $$props;
29263
+ let { content, small = false, hideToggle = false, searchTerm = "", allowHtml = false, onFileLink = void 0 } = $$props;
29170
29264
  let showRaw = false;
29171
29265
  let containerEl = null;
29172
29266
  /** Sanitized HTML — BC-12: allow-listed tags only (never raw input). */
29173
- let renderedHtml = derived(() => renderMarkdown(content));
29267
+ let renderedHtml = derived(() => allowHtml ? renderPreviewMarkdown(content) : renderMarkdown(content));
29174
29268
  /** Highlight search term in rendered HTML — AFTER markdown rendering. */
29175
29269
  let highlightedHtml = derived(() => {
29176
29270
  if (!searchTerm.trim()) return renderedHtml();
@@ -30244,7 +30338,8 @@ function FileContentViewer($$renderer, $$props) {
30244
30338
  $$renderer.push(`<div class="[padding:0_10px]" data-testid="file-viewer-markdown">`);
30245
30339
  MarkdownContent($$renderer, {
30246
30340
  content: body(),
30247
- small: true
30341
+ small: true,
30342
+ allowHtml: true
30248
30343
  });
30249
30344
  $$renderer.push(`<!----></div>`);
30250
30345
  } else if (view.lang !== void 0 && isKnownCodeLang(view.lang)) {
@@ -37329,9 +37424,12 @@ function MarkdownPanel($$renderer, $$props) {
37329
37424
  * byte-exact surface stays the transcript's chips; here prose may
37330
37425
  * reflow, the accepted give-up).
37331
37426
  */
37332
- let { content } = $$props;
37427
+ let { content, allowHtml = false } = $$props;
37333
37428
  $$renderer.push(`<div data-svelte="MarkdownPanel" class="markdown-panel svelte-db6jsb" data-testid="markdown-panel">`);
37334
- MarkdownContent($$renderer, { content });
37429
+ MarkdownContent($$renderer, {
37430
+ content,
37431
+ allowHtml
37432
+ });
37335
37433
  $$renderer.push(`<!----></div>`);
37336
37434
  }
37337
37435
  //#endregion
@@ -37999,7 +38097,10 @@ function WorkspaceFile($$renderer, $$props) {
37999
38097
  } else if (isMarkdown && tab === "preview") {
38000
38098
  $$renderer.push("<!--[5-->");
38001
38099
  $$renderer.push(`<div class="file-scroll svelte-tsr372">`);
38002
- MarkdownPanel($$renderer, { content: text ?? "" });
38100
+ MarkdownPanel($$renderer, {
38101
+ content: text ?? "",
38102
+ allowHtml: true
38103
+ });
38003
38104
  $$renderer.push(`<!----></div>`);
38004
38105
  } else {
38005
38106
  $$renderer.push("<!--[-1-->");
@@ -39394,4 +39495,4 @@ function _page($$renderer, $$props) {
39394
39495
  }
39395
39496
 
39396
39497
  export { _page as default };
39397
- //# sourceMappingURL=_page.svelte.js-DlLAziUY.js.map
39498
+ //# sourceMappingURL=_page.svelte.js-tSeYvTqX.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-D2umW-Cg.js';
13
- import { m as manifest } from './manifest.js-CaT4HRXz.js';
12
+ import { S as Server } from './index.js-CAZuEVlJ.js';
13
+ import { m as manifest } from './manifest.js-Bq-QTetg.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-BRlzTcii.js.map
1735
+ //# sourceMappingURL=handler-CdfDULha.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-Cu5N8_4R.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-D_dNqBcA.js';
7
7
  import { h as has_resolution_suffix, a as has_data_suffix, s as strip_resolution_suffix, b as strip_data_suffix, d as decode_pathname, c as add_data_suffix, e as add_resolution_suffix, f as find_route, n as normalize_path, g as disable_search, v as validate_layout_server_exports, i as validate_layout_exports, j as validate_page_server_exports, k as validate_page_exports, r as resolve, l as hash, m as make_trackable } from './chunks/exports.js-D5zA1U7A.js';
8
8
  import { S as readable, T as writable } from './chunks/server.js-Dijo7DtV.js';
9
9
 
@@ -3821,4 +3821,4 @@ var Server = class {
3821
3821
  };
3822
3822
 
3823
3823
  export { Server as S };
3824
- //# sourceMappingURL=index.js-D2umW-Cg.js.map
3824
+ //# sourceMappingURL=index.js-CAZuEVlJ.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.DdPLwPDt.js",app:"_app/immutable/entry/app.ezxtVZch.js",imports:["_app/immutable/entry/start.DdPLwPDt.js","_app/immutable/chunks/UPlr67N1.js","_app/immutable/chunks/0Tfhif1V.js","_app/immutable/entry/app.ezxtVZch.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.Bo2gqLX-.js",app:"_app/immutable/entry/app.wTcqn7d3.js",imports:["_app/immutable/entry/start.Bo2gqLX-.js","_app/immutable/chunks/CLf6wcwo.js","_app/immutable/chunks/0Tfhif1V.js","_app/immutable/entry/app.wTcqn7d3.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
15
  __memo(() => import('./nodes/0.js-B8ciwPSu.js')),
16
- __memo(() => import('./nodes/1.js-cXTCbvze.js')),
17
- __memo(() => import('./nodes/2.js-CF_m1q-z.js'))
16
+ __memo(() => import('./nodes/1.js-CKR9qKW9.js')),
17
+ __memo(() => import('./nodes/2.js-BuwXpGsh.js'))
18
18
  ],
19
19
  remotes: {
20
20
 
@@ -53,105 +53,105 @@ return {
53
53
  pattern: /^\/api\/browser\/?$/,
54
54
  params: [],
55
55
  page: null,
56
- endpoint: __memo(() => import('./entries/endpoints/api/browser/_server.ts.js-0Gye8oLN.js'))
56
+ endpoint: __memo(() => import('./entries/endpoints/api/browser/_server.ts.js-pQmJm_Io.js'))
57
57
  },
58
58
  {
59
59
  id: "/api/browser/[id]/activate",
60
60
  pattern: /^\/api\/browser\/([^/]+?)\/activate\/?$/,
61
61
  params: [{"name":"id","optional":false,"rest":false,"chained":false}],
62
62
  page: null,
63
- endpoint: __memo(() => import('./entries/endpoints/api/browser/_id_/activate/_server.ts.js-BxfB-QXT.js'))
63
+ endpoint: __memo(() => import('./entries/endpoints/api/browser/_id_/activate/_server.ts.js-DlbbO3RF.js'))
64
64
  },
65
65
  {
66
66
  id: "/api/browser/[id]/closetab",
67
67
  pattern: /^\/api\/browser\/([^/]+?)\/closetab\/?$/,
68
68
  params: [{"name":"id","optional":false,"rest":false,"chained":false}],
69
69
  page: null,
70
- endpoint: __memo(() => import('./entries/endpoints/api/browser/_id_/closetab/_server.ts.js-Cwu4C98Y.js'))
70
+ endpoint: __memo(() => import('./entries/endpoints/api/browser/_id_/closetab/_server.ts.js-Dt5Bxv2-.js'))
71
71
  },
72
72
  {
73
73
  id: "/api/browser/[id]/close",
74
74
  pattern: /^\/api\/browser\/([^/]+?)\/close\/?$/,
75
75
  params: [{"name":"id","optional":false,"rest":false,"chained":false}],
76
76
  page: null,
77
- endpoint: __memo(() => import('./entries/endpoints/api/browser/_id_/close/_server.ts.js-DT6rU-EU.js'))
77
+ endpoint: __memo(() => import('./entries/endpoints/api/browser/_id_/close/_server.ts.js-B85bLw4w.js'))
78
78
  },
79
79
  {
80
80
  id: "/api/browser/[id]/element",
81
81
  pattern: /^\/api\/browser\/([^/]+?)\/element\/?$/,
82
82
  params: [{"name":"id","optional":false,"rest":false,"chained":false}],
83
83
  page: null,
84
- endpoint: __memo(() => import('./entries/endpoints/api/browser/_id_/element/_server.ts.js-B55tx3-S.js'))
84
+ endpoint: __memo(() => import('./entries/endpoints/api/browser/_id_/element/_server.ts.js-uJ5BnGUA.js'))
85
85
  },
86
86
  {
87
87
  id: "/api/browser/[id]/history",
88
88
  pattern: /^\/api\/browser\/([^/]+?)\/history\/?$/,
89
89
  params: [{"name":"id","optional":false,"rest":false,"chained":false}],
90
90
  page: null,
91
- endpoint: __memo(() => import('./entries/endpoints/api/browser/_id_/history/_server.ts.js-D2ft7u0s.js'))
91
+ endpoint: __memo(() => import('./entries/endpoints/api/browser/_id_/history/_server.ts.js-CVCoWk2n.js'))
92
92
  },
93
93
  {
94
94
  id: "/api/browser/[id]/input",
95
95
  pattern: /^\/api\/browser\/([^/]+?)\/input\/?$/,
96
96
  params: [{"name":"id","optional":false,"rest":false,"chained":false}],
97
97
  page: null,
98
- endpoint: __memo(() => import('./entries/endpoints/api/browser/_id_/input/_server.ts.js-BO1uO6i3.js'))
98
+ endpoint: __memo(() => import('./entries/endpoints/api/browser/_id_/input/_server.ts.js-CmhQ7zGO.js'))
99
99
  },
100
100
  {
101
101
  id: "/api/browser/[id]/mcp",
102
102
  pattern: /^\/api\/browser\/([^/]+?)\/mcp\/?$/,
103
103
  params: [{"name":"id","optional":false,"rest":false,"chained":false}],
104
104
  page: null,
105
- endpoint: __memo(() => import('./entries/endpoints/api/browser/_id_/mcp/_server.ts.js-zOccgfJZ.js'))
105
+ endpoint: __memo(() => import('./entries/endpoints/api/browser/_id_/mcp/_server.ts.js-CFtpmSCd.js'))
106
106
  },
107
107
  {
108
108
  id: "/api/browser/[id]/navigate",
109
109
  pattern: /^\/api\/browser\/([^/]+?)\/navigate\/?$/,
110
110
  params: [{"name":"id","optional":false,"rest":false,"chained":false}],
111
111
  page: null,
112
- endpoint: __memo(() => import('./entries/endpoints/api/browser/_id_/navigate/_server.ts.js-DgyR0sLf.js'))
112
+ endpoint: __memo(() => import('./entries/endpoints/api/browser/_id_/navigate/_server.ts.js-BH8MNt9W.js'))
113
113
  },
114
114
  {
115
115
  id: "/api/browser/[id]/opentab",
116
116
  pattern: /^\/api\/browser\/([^/]+?)\/opentab\/?$/,
117
117
  params: [{"name":"id","optional":false,"rest":false,"chained":false}],
118
118
  page: null,
119
- endpoint: __memo(() => import('./entries/endpoints/api/browser/_id_/opentab/_server.ts.js-CPCIL2MG.js'))
119
+ endpoint: __memo(() => import('./entries/endpoints/api/browser/_id_/opentab/_server.ts.js-uIrK0T8h.js'))
120
120
  },
121
121
  {
122
122
  id: "/api/browser/[id]/page",
123
123
  pattern: /^\/api\/browser\/([^/]+?)\/page\/?$/,
124
124
  params: [{"name":"id","optional":false,"rest":false,"chained":false}],
125
125
  page: null,
126
- endpoint: __memo(() => import('./entries/endpoints/api/browser/_id_/page/_server.ts.js-Cjvr5nEt.js'))
126
+ endpoint: __memo(() => import('./entries/endpoints/api/browser/_id_/page/_server.ts.js-Bg5yHS9F.js'))
127
127
  },
128
128
  {
129
129
  id: "/api/browser/[id]/stream",
130
130
  pattern: /^\/api\/browser\/([^/]+?)\/stream\/?$/,
131
131
  params: [{"name":"id","optional":false,"rest":false,"chained":false}],
132
132
  page: null,
133
- endpoint: __memo(() => import('./entries/endpoints/api/browser/_id_/stream/_server.ts.js-Bb3DkB-H.js'))
133
+ endpoint: __memo(() => import('./entries/endpoints/api/browser/_id_/stream/_server.ts.js-DG6xvUsm.js'))
134
134
  },
135
135
  {
136
136
  id: "/api/browser/[id]/tabs",
137
137
  pattern: /^\/api\/browser\/([^/]+?)\/tabs\/?$/,
138
138
  params: [{"name":"id","optional":false,"rest":false,"chained":false}],
139
139
  page: null,
140
- endpoint: __memo(() => import('./entries/endpoints/api/browser/_id_/tabs/_server.ts.js-DVcq1pYf.js'))
140
+ endpoint: __memo(() => import('./entries/endpoints/api/browser/_id_/tabs/_server.ts.js-RiXP45mV.js'))
141
141
  },
142
142
  {
143
143
  id: "/api/browser/[id]/viewport",
144
144
  pattern: /^\/api\/browser\/([^/]+?)\/viewport\/?$/,
145
145
  params: [{"name":"id","optional":false,"rest":false,"chained":false}],
146
146
  page: null,
147
- endpoint: __memo(() => import('./entries/endpoints/api/browser/_id_/viewport/_server.ts.js-D1xgkwTO.js'))
147
+ endpoint: __memo(() => import('./entries/endpoints/api/browser/_id_/viewport/_server.ts.js-w9MNQddQ.js'))
148
148
  },
149
149
  {
150
150
  id: "/api/browser/[id]/zoom",
151
151
  pattern: /^\/api\/browser\/([^/]+?)\/zoom\/?$/,
152
152
  params: [{"name":"id","optional":false,"rest":false,"chained":false}],
153
153
  page: null,
154
- endpoint: __memo(() => import('./entries/endpoints/api/browser/_id_/zoom/_server.ts.js-DFo94fTq.js'))
154
+ endpoint: __memo(() => import('./entries/endpoints/api/browser/_id_/zoom/_server.ts.js-BoXDoshV.js'))
155
155
  },
156
156
  {
157
157
  id: "/api/config",
@@ -606,4 +606,4 @@ return {
606
606
  })();
607
607
 
608
608
  export { manifest as m };
609
- //# sourceMappingURL=manifest.js-CaT4HRXz.js.map
609
+ //# sourceMappingURL=manifest.js-Bq-QTetg.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-MpJVAPPn.js')).default;
4
+ const imports = ["_app/immutable/nodes/1.5Yu0dCHp.js","_app/immutable/chunks/0Tfhif1V.js","_app/immutable/chunks/xihTtKlq.js","_app/immutable/chunks/BXbGQv0I.js","_app/immutable/chunks/CLf6wcwo.js","_app/immutable/chunks/D9jhmf3I.js"];
5
+ const stylesheets = [];
6
+ const fonts = [];
7
+
8
+ export { component, fonts, imports, index, stylesheets };
9
+ //# sourceMappingURL=1.js-CKR9qKW9.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-DlLAziUY.js')).default;
22
+ const component = async () => component_cache ??= (await import('../entries/pages/_page.svelte.js-tSeYvTqX.js')).default;
23
23
  const server_id = "src/routes/+page.server.ts";
24
- const imports = ["_app/immutable/nodes/2.9BE7-E5x.js","_app/immutable/chunks/0Tfhif1V.js","_app/immutable/chunks/UPlr67N1.js","_app/immutable/chunks/HclGiUj8.js","_app/immutable/chunks/xihTtKlq.js","_app/immutable/chunks/D9jhmf3I.js","_app/immutable/chunks/CTWtsoJD.js","_app/immutable/chunks/e-3PBXxJ.js"];
24
+ const imports = ["_app/immutable/nodes/2.DAzLHFNq.js","_app/immutable/chunks/0Tfhif1V.js","_app/immutable/chunks/CLf6wcwo.js","_app/immutable/chunks/HclGiUj8.js","_app/immutable/chunks/xihTtKlq.js","_app/immutable/chunks/D9jhmf3I.js","_app/immutable/chunks/CTWtsoJD.js","_app/immutable/chunks/BXbGQv0I.js"];
25
25
  const stylesheets = ["_app/immutable/assets/2.glyfXGzi.css"];
26
26
  const fonts = [];
27
27
 
28
28
  export { component, fonts, imports, index, server_id, stylesheets };
29
- //# sourceMappingURL=2.js-CF_m1q-z.js.map
29
+ //# sourceMappingURL=2.js-BuwXpGsh.js.map
package/package.json CHANGED
@@ -1,6 +1,6 @@
1
1
  {
2
2
  "name": "@deepseek-insight/dsi",
3
- "version": "0.11.0",
3
+ "version": "0.11.2",
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",
@@ -0,0 +1,96 @@
1
+ ---
2
+ name: "dsi-host-drive"
3
+ description: "Drive the HOST floor's Terminal Desk from inside a VM floor over the OrbStack bridge (host.orb.internal + Host-header pass) — reach a Mac that has no ssh, run install/build/launch anything on the operator's physical machine, same baton law. Reserved keyword"
4
+ ---
5
+
6
+ # Drive Host Terminal (VM → Host over the bridge)
7
+
8
+ One goal → run commands on the HOST machine (the operator's Mac) while
9
+ working from a VM floor, by driving the HOST floor's own Terminal Desk over
10
+ its HTTP wire. Same baton law as `dsi-drive-terminal` — load that skill
11
+ first for the etiquette core (heal-on-refusal, echo+marker gates, silent
12
+ eaters, dead sessions); THIS skill carries only what is special about
13
+ crossing the VM→host boundary.
14
+
15
+ ## Why this exists (earned 2026-11-08, the Glass Chassis drive)
16
+
17
+ The Mac has no ssh (port 22 refused), its LAN IP drifts on every reboot
18
+ (192.168.1.9 → .1.3 within one day), and its services bind loopback —
19
+ so the ONLY stable path from a VM to the Mac's shell is the Mac's own
20
+ DSI floor, reached through OrbStack's host alias.
21
+
22
+ ## The access recipe (all four rules are load-bearing)
23
+
24
+ 1. **Alias, not IP.** The Mac's LAN IP (`192.168.1.x`) refuses every port
25
+ from the VM (000). Use `http://host.orb.internal:<port>` — OrbStack
26
+ forwards it to the Mac's loopback.
27
+ 2. **Host header pass.** The floor's guard blocks the alias name
28
+ ("Blocked request. This host is not allowed"). Send the request with
29
+ `Host: localhost:<port>`:
30
+ ```sh
31
+ H=http://host.orb.internal:5175
32
+ HH="Host: localhost:5175"
33
+ curl -s -m5 -H "$HH" "$H/api/terminal"
34
+ ```
35
+ 3. **curl, never node fetch.** Node's `fetch`/`urllib` silently DROP the
36
+ spoofed Host header and every write comes back 403 blocked — the
37
+ entire drive must run on curl (or curl via subprocess).
38
+ 4. **Same shell quirks as home.** The host floor's terminal API is the
39
+ same code — open (`POST /api/terminal`), reattach for the baton,
40
+ paced per-char writes, `?fromByte=` ring reads, exit markers — exactly
41
+ per `dsi-drive-terminal` Steps 1–4.
42
+
43
+ ## Host-specific traps (each one bit the 2026-11-08 drive)
44
+
45
+ - **A dead session still answers `written:true`** — after opening a fresh
46
+ desk tab, CHECK `GET /api/terminal`'s `exited` flag and the ECHO before
47
+ trusting receipts. Two full command sequences vanished into an exited
48
+ `t-3` this way.
49
+ - **The operator's focused tab steals the baton** — its watcher
50
+ auto-reattaches, so long paced sequences die mid-way with
51
+ `FOREIGN_SESSION`. Prefer driving the tab the operator just activated
52
+ FOR you, in short healed bursts; or accept the heal loop and retry the
53
+ SAME keystroke after each reattach.
54
+ - **macOS `git` pages on the host** (`(END)` from a plain `git log`) —
55
+ export `GIT_PAGER=cat PAGER=cat` in the first command you send; escape
56
+ a live pager with `q` (and RETURN for less's sub-prompts).
57
+ - **The host shell may carry a proxy env** — in-band
58
+ `curl http://127.0.0.1:<port>/status` on the Mac can fail with exit 6
59
+ (proxy can't resolve) while the companion is perfectly up. Verify
60
+ host-local services from the VM over the alias, or add `--noproxy '*'`.
61
+ - **The host checkout drifts** — always `GIT_PAGER=cat git pull --rebase`
62
+ before running repo code there; the operator commits on the Mac too
63
+ (its local docs commit once refused a `--ff-only` pull).
64
+
65
+ ## Companion-grade longevity (things that must outlive the tab)
66
+
67
+ Anything the HOST should keep running (a chassis companion, a dev server)
68
+ must NOT be a background job of the desk session: the session's idle
69
+ teardown kills the process tree, `nohup` notwithstanding — this killed the
70
+ glass chassis three times in one evening. Detach with launchd:
71
+
72
+ ```sh
73
+ launchctl remove dsi-chassis 2>/dev/null
74
+ launchctl submit -l dsi-chassis -- <abs-node-path> <abs-repo>/bin/dsi-chassis.mjs --bind 127.0.0.1 --port 9525
75
+ launchctl list | grep dsi-chassis # pid + last exit status
76
+ ```
77
+
78
+ - `launchctl submit` runs with cwd `/` — absolute paths REQUIRED.
79
+ - Check health from the VM over the alias, never in-band (proxy trap).
80
+
81
+ ## Checklist
82
+
83
+ ```
84
+ 📋 host-drive: {goal} — host floor :<port>
85
+
86
+ [ ] 1.1 Host floor found via host.orb.internal (never the LAN IP)
87
+ [ ] 1.2 Host-header pass on EVERY request (curl only)
88
+ [ ] 1.3 Session id from GET /api/terminal + exited flag (badge law)
89
+ [ ] 2.1 Baton via reattach; FOREIGN_SESSION → heal, retry same write
90
+ [ ] 2.2 GIT_PAGER=cat exported before any git command
91
+ [ ] 2.3 Exit markers gate completion; echoes checked (dead-session law)
92
+ [ ] 3.1 Ring reads from the reattach offset (stale bytes fake markers)
93
+ [ ] 4.1 Long-lived processes detached via launchctl (absolute paths)
94
+ [ ] 4.2 Health verified from the VM over the alias
95
+ ━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━
96
+ ```
Binary file
Binary file
@@ -1 +0,0 @@
1
- import{U as e}from"../nodes/2.9BE7-E5x.js";export{e as startPanelResize};
@@ -1 +0,0 @@
1
- import{r as e}from"../nodes/2.9BE7-E5x.js";export{e as stringify};
@@ -1 +0,0 @@
1
- import{o as e,r as t}from"../chunks/UPlr67N1.js";export{e as load_css,t as start};
@@ -1,9 +0,0 @@
1
- const index = 1;
2
- let component_cache;
3
- const component = async () => component_cache ??= (await import('../entries/pages/_error.svelte.js-CJ9RHd_3.js')).default;
4
- const imports = ["_app/immutable/nodes/1.CGppLUrN.js","_app/immutable/chunks/0Tfhif1V.js","_app/immutable/chunks/xihTtKlq.js","_app/immutable/chunks/e-3PBXxJ.js","_app/immutable/chunks/UPlr67N1.js","_app/immutable/chunks/D9jhmf3I.js"];
5
- const stylesheets = [];
6
- const fonts = [];
7
-
8
- export { component, fonts, imports, index, stylesheets };
9
- //# sourceMappingURL=1.js-cXTCbvze.js.map