@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.
- package/README.md +118 -30
- package/bin/dsi-chassis.mjs +371 -0
- package/bin/dsi.mjs +22 -5
- package/build/client/_app/immutable/chunks/{e-3PBXxJ.js → BXbGQv0I.js} +1 -1
- package/build/client/_app/immutable/chunks/{UPlr67N1.js → CLf6wcwo.js} +2 -2
- package/build/client/_app/immutable/chunks/DXwjOJ3W.js +1 -0
- package/build/client/_app/immutable/chunks/FP3OKgFQ.js +1 -0
- package/build/client/_app/immutable/entry/{app.ezxtVZch.js → app.wTcqn7d3.js} +2 -2
- package/build/client/_app/immutable/entry/start.Bo2gqLX-.js +1 -0
- package/build/client/_app/immutable/nodes/{1.CGppLUrN.js → 1.5Yu0dCHp.js} +1 -1
- package/build/client/_app/immutable/nodes/{2.9BE7-E5x.js → 2.DAzLHFNq.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-Cu5N8_4R.js → internal2.js-D_dNqBcA.js} +2 -2
- package/build/server/chunks/chunks/{registry.js-Bwc2MNSZ.js → registry.js-Cnmd1vW3.js} +194 -19
- package/build/server/chunks/chunks/{state.js-CRPhnJJH.js → state.js-BIGPexgb.js} +2 -2
- package/build/server/chunks/entries/endpoints/api/browser/_id_/activate/{_server.ts.js-BxfB-QXT.js → _server.ts.js-DlbbO3RF.js} +2 -2
- package/build/server/chunks/entries/endpoints/api/browser/_id_/close/{_server.ts.js-DT6rU-EU.js → _server.ts.js-B85bLw4w.js} +2 -2
- package/build/server/chunks/entries/endpoints/api/browser/_id_/closetab/{_server.ts.js-Cwu4C98Y.js → _server.ts.js-Dt5Bxv2-.js} +2 -2
- package/build/server/chunks/entries/endpoints/api/browser/_id_/element/{_server.ts.js-B55tx3-S.js → _server.ts.js-uJ5BnGUA.js} +2 -2
- package/build/server/chunks/entries/endpoints/api/browser/_id_/history/{_server.ts.js-D2ft7u0s.js → _server.ts.js-CVCoWk2n.js} +2 -2
- package/build/server/chunks/entries/endpoints/api/browser/_id_/input/{_server.ts.js-BO1uO6i3.js → _server.ts.js-CmhQ7zGO.js} +2 -2
- package/build/server/chunks/entries/endpoints/api/browser/_id_/mcp/{_server.ts.js-zOccgfJZ.js → _server.ts.js-CFtpmSCd.js} +2 -2
- package/build/server/chunks/entries/endpoints/api/browser/_id_/navigate/{_server.ts.js-DgyR0sLf.js → _server.ts.js-BH8MNt9W.js} +2 -2
- package/build/server/chunks/entries/endpoints/api/browser/_id_/opentab/{_server.ts.js-CPCIL2MG.js → _server.ts.js-uIrK0T8h.js} +2 -2
- package/build/server/chunks/entries/endpoints/api/browser/_id_/page/{_server.ts.js-Cjvr5nEt.js → _server.ts.js-Bg5yHS9F.js} +2 -2
- package/build/server/chunks/entries/endpoints/api/browser/_id_/stream/{_server.ts.js-Bb3DkB-H.js → _server.ts.js-DG6xvUsm.js} +2 -2
- package/build/server/chunks/entries/endpoints/api/browser/_id_/tabs/{_server.ts.js-DVcq1pYf.js → _server.ts.js-RiXP45mV.js} +2 -2
- package/build/server/chunks/entries/endpoints/api/browser/_id_/viewport/{_server.ts.js-D1xgkwTO.js → _server.ts.js-w9MNQddQ.js} +2 -2
- package/build/server/chunks/entries/endpoints/api/browser/_id_/zoom/{_server.ts.js-DFo94fTq.js → _server.ts.js-BoXDoshV.js} +2 -2
- package/build/server/chunks/entries/endpoints/api/browser/{_server.ts.js-0Gye8oLN.js → _server.ts.js-pQmJm_Io.js} +2 -2
- package/build/server/chunks/entries/pages/{_error.svelte.js-CJ9RHd_3.js → _error.svelte.js-MpJVAPPn.js} +3 -3
- package/build/server/chunks/entries/pages/{_page.svelte.js-DlLAziUY.js → _page.svelte.js-tSeYvTqX.js} +111 -10
- package/build/server/chunks/{handler-BRlzTcii.js → handler-CdfDULha.js} +3 -3
- package/build/server/chunks/{index.js-D2umW-Cg.js → index.js-CAZuEVlJ.js} +2 -2
- package/build/server/chunks/{manifest.js-CaT4HRXz.js → manifest.js-Bq-QTetg.js} +19 -19
- package/build/server/chunks/nodes/1.js-CKR9qKW9.js +9 -0
- package/build/server/chunks/nodes/{2.js-CF_m1q-z.js → 2.js-BuwXpGsh.js} +3 -3
- package/package.json +1 -1
- package/skills/dsi-host-drive/SKILL.md +96 -0
- package/template/.dsi/prompts.sqlite-shm +0 -0
- package/template/.dsi/prompts.sqlite-wal +0 -0
- package/build/client/_app/immutable/chunks/Dj8AK3pr.js +0 -1
- package/build/client/_app/immutable/chunks/WySTHi46.js +0 -1
- package/build/client/_app/immutable/entry/start.DdPLwPDt.js +0 -1
- 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-
|
|
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-
|
|
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.
|
|
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, {
|
|
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, {
|
|
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-
|
|
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-
|
|
13
|
-
import { m as manifest } from './manifest.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-
|
|
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-
|
|
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-
|
|
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.
|
|
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-
|
|
17
|
-
__memo(() => import('./nodes/2.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-
|
|
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-
|
|
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-
|
|
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-
|
|
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-
|
|
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-
|
|
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-
|
|
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-
|
|
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-
|
|
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-
|
|
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-
|
|
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-
|
|
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-
|
|
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-
|
|
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-
|
|
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-
|
|
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-
|
|
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.
|
|
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-
|
|
29
|
+
//# sourceMappingURL=2.js-BuwXpGsh.js.map
|
package/package.json
CHANGED
|
@@ -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
|