better-dsh 0.3.0 → 0.3.1-a

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 (76) hide show
  1. package/README.md +49 -177
  2. package/cordis.patch.yml +5 -36
  3. package/docs/20_specs/kernel-provisioning/spec.md +2 -0
  4. package/docs/adr/0015-independent-bundles-agent-remote.md +40 -0
  5. package/docs/remote-tools.md +56 -0
  6. package/docs/specs/kernel-provisioning/spec.md +12 -40
  7. package/docs/specs/omp-python-repl-port/runtime-guide.md +35 -0
  8. package/docs/specs/omp-python-repl-port/spec.md +68 -0
  9. package/docs/specs/remote-tool-enhancement/spec.md +203 -0
  10. package/dsh-docs/baseline.md +13 -0
  11. package/dsh-docs/subsystems/invariants.md +3 -0
  12. package/dsh-docs/subsystems/invariants.zh.md +3 -0
  13. package/eval-description.md +7 -3
  14. package/lib/LaunchOptions-0Mr6meJc.js +4 -0
  15. package/lib/{LaunchOptions-kGXcZOe0.js → LaunchOptions-iE9M-STS.js} +1 -1
  16. package/lib/{bidi-BalpKaJc.js → bidi-CaQeBZHY.js} +1 -1
  17. package/lib/client/index.js +30 -6
  18. package/lib/failover/index.js +1 -1
  19. package/lib/fs-aware/sandbox-plugin.js +3 -3
  20. package/lib/{index-browser-CysrjMyM.js → index-browser-CJzxT9Vi.js} +4 -4
  21. package/lib/index.d.ts +16 -50
  22. package/lib/index.js +482 -1720
  23. package/lib/kernel-env-x_WkG6Fr.js +76 -0
  24. package/lib/kernel-env.d.ts +5 -69
  25. package/lib/kernel-env.js +2 -2
  26. package/lib/{lsp-server-registry-BXvUTBY7.js → lsp-server-registry-BcdkHROD.js} +1 -1
  27. package/lib/{lsp-server-registry-CH9WNFFt.js → lsp-server-registry-D4VLs1Sm.js} +1 -1
  28. package/lib/{main-BQeFrBM1.js → main-taSMz1KX.js} +1 -1
  29. package/lib/{main-CupOhMp5.js → main-uqGqYYnA.js} +7 -5
  30. package/lib/mobile/plugin.d.ts +1 -1
  31. package/lib/omp-python/DILL-LICENSE +35 -0
  32. package/lib/omp-python/OMP-LICENSE +23 -0
  33. package/lib/omp-python/better_snapshot.py +391 -0
  34. package/lib/omp-python/better_support.py +425 -0
  35. package/lib/omp-python/dill-provenance.json +55 -0
  36. package/lib/omp-python/provenance.json +13 -0
  37. package/lib/omp-python/runner.py +2499 -0
  38. package/lib/omp-python/vendor/dill/__diff.py +234 -0
  39. package/lib/omp-python/vendor/dill/__info__.py +291 -0
  40. package/lib/omp-python/vendor/dill/__init__.py +119 -0
  41. package/lib/omp-python/vendor/dill/_dill.py +2265 -0
  42. package/lib/omp-python/vendor/dill/_objects.py +545 -0
  43. package/lib/omp-python/vendor/dill/_shims.py +193 -0
  44. package/lib/omp-python/vendor/dill/detect.py +287 -0
  45. package/lib/omp-python/vendor/dill/logger.py +285 -0
  46. package/lib/omp-python/vendor/dill/objtypes.py +24 -0
  47. package/lib/omp-python/vendor/dill/pointers.py +122 -0
  48. package/lib/omp-python/vendor/dill/session.py +612 -0
  49. package/lib/omp-python/vendor/dill/settings.py +25 -0
  50. package/lib/omp-python/vendor/dill/source.py +1025 -0
  51. package/lib/omp-python/vendor/dill/temp.py +252 -0
  52. package/lib/{puppeteer-core-CSk2PtSm.js → puppeteer-core-C-4NyOpY.js} +8 -8
  53. package/lib/remote/plugin.d.ts +459 -5
  54. package/lib/remote/plugin.js +2389 -210
  55. package/lib/url-schemes/index.d.ts +11 -11
  56. package/lib/url-schemes/index.js +11 -11
  57. package/lib/web-password.d.ts +8 -8
  58. package/lib/web-password.js +5 -1
  59. package/lib/{web-trust-Dej_RI2B.d.ts → web-trust-C_Y6o8Z2.d.ts} +11 -11
  60. package/lib/web-trust.d.ts +1 -2
  61. package/lib/welcome-notice.d.ts +5 -7
  62. package/lib/welcome-notice.js +9 -48
  63. package/lib/{wrap-T4I0nfPM.js → wrap-0VA0uFx8.js} +1 -1
  64. package/package.json +7 -24
  65. package/scripts/kernel-check.mjs +5 -0
  66. package/lib/LaunchOptions-B874eBu2.js +0 -4
  67. package/lib/bundle-delivery.d.ts +0 -20
  68. package/lib/bundle-delivery.js +0 -209
  69. package/lib/hmr.d.ts +0 -32
  70. package/lib/hmr.js +0 -49
  71. package/lib/kernel-bridge.py +0 -172
  72. package/lib/kernel-env-D8UOWeji.js +0 -195
  73. package/lib/webserver.d.ts +0 -10
  74. package/lib/webserver.js +0 -19
  75. package/scripts/kernel-provision.mjs +0 -35
  76. package/scripts/register-bundle.mjs +0 -80
@@ -1,6 +1,6 @@
1
- import { t as Schema } from "../index-DTDXUe6m.js";
2
1
  import { Context } from "@deepseek-ai/cordis";
3
2
  import { ToolDefinition } from "@deepseek-ai/dsh-tools";
3
+ import * as _deepseek_ai_schemastery11 from "@deepseek-ai/schemastery";
4
4
 
5
5
  //#region src/url-schemes/tools/write.d.ts
6
6
 
@@ -50,12 +50,12 @@ declare const inject: string[];
50
50
  * real patch-line config. Schema-level defaults (both ON — the service is
51
51
  * opt-out) survive every overlay layer, per the v0.2.2a ruling.
52
52
  */
53
- declare const Config: Schema<Schemastery.ObjectS<NoInfer<{
54
- urlSchemes: Schema<boolean, boolean, "defined">;
55
- hashline: Schema<boolean, boolean, "defined">;
53
+ declare const Config: _deepseek_ai_schemastery11.default<Schemastery.ObjectS<NoInfer<{
54
+ urlSchemes: _deepseek_ai_schemastery11.default<boolean, boolean, "defined">;
55
+ hashline: _deepseek_ai_schemastery11.default<boolean, boolean, "defined">;
56
56
  }>>, Schemastery.ObjectT<NoInfer<{
57
- urlSchemes: Schema<boolean, boolean, "defined">;
58
- hashline: Schema<boolean, boolean, "defined">;
57
+ urlSchemes: _deepseek_ai_schemastery11.default<boolean, boolean, "defined">;
58
+ hashline: _deepseek_ai_schemastery11.default<boolean, boolean, "defined">;
59
59
  }>>, "plain">;
60
60
  /** Register the four URL-aware tools on one agent's own scope layer. */
61
61
  /**
@@ -75,12 +75,12 @@ declare function apply(ctx: Context, config: UrlSchemesConfig | undefined): void
75
75
  declare const _default: {
76
76
  name: string;
77
77
  inject: string[];
78
- Config: Schema<Schemastery.ObjectS<NoInfer<{
79
- urlSchemes: Schema<boolean, boolean, "defined">;
80
- hashline: Schema<boolean, boolean, "defined">;
78
+ Config: _deepseek_ai_schemastery11.default<Schemastery.ObjectS<NoInfer<{
79
+ urlSchemes: _deepseek_ai_schemastery11.default<boolean, boolean, "defined">;
80
+ hashline: _deepseek_ai_schemastery11.default<boolean, boolean, "defined">;
81
81
  }>>, Schemastery.ObjectT<NoInfer<{
82
- urlSchemes: Schema<boolean, boolean, "defined">;
83
- hashline: Schema<boolean, boolean, "defined">;
82
+ urlSchemes: _deepseek_ai_schemastery11.default<boolean, boolean, "defined">;
83
+ hashline: _deepseek_ai_schemastery11.default<boolean, boolean, "defined">;
84
84
  }>>, "plain">;
85
85
  apply: typeof apply;
86
86
  };
@@ -1,28 +1,28 @@
1
1
  import { r as __toESM, t as __commonJS } from "../chunk-DQxbwPpZ.js";
2
2
  import { t as Schema } from "../lib-C8_jXvwA.js";
3
- import { a as PACKAGE_ROOT } from "../kernel-env-D8UOWeji.js";
3
+ import { t as PACKAGE_ROOT } from "../kernel-env-x_WkG6Fr.js";
4
4
  import { n as captureNativeTools } from "../native-capture-BEByDXYM.js";
5
- import { a as createHttpHandler, c as listDvcDevices, d as UrlResolver, f as UrlSchemesError, h as SCHEME_NAMES, i as HTTP_SCHEMES, l as registerDvcDevice, m as parseUrl, n as wrapFsWithSchemes, o as createDvcHandler, p as applySelector, r as resolveDocsDir, s as dispatchDvcWrite, u as createDshHandler } from "../wrap-T4I0nfPM.js";
5
+ import { a as createHttpHandler, c as listDvcDevices, d as UrlResolver, f as UrlSchemesError, h as SCHEME_NAMES, i as HTTP_SCHEMES, l as registerDvcDevice, m as parseUrl, n as wrapFsWithSchemes, o as createDvcHandler, p as applySelector, r as resolveDocsDir, s as dispatchDvcWrite, u as createDshHandler } from "../wrap-0VA0uFx8.js";
6
6
  import { n as Parser } from "../web-tree-sitter-CPrPD4J2.js";
7
- import { a as primaryServerForFile, c as serversForFile, n as findWorkspaceRoot, o as resolveCommandPath, r as installHintFor, s as serverByName } from "../lsp-server-registry-CH9WNFFt.js";
7
+ import { a as primaryServerForFile, c as serversForFile, n as findWorkspaceRoot, o as resolveCommandPath, r as installHintFor, s as serverByName } from "../lsp-server-registry-D4VLs1Sm.js";
8
8
  import { createRequire } from "node:module";
9
9
  import { createHash, randomUUID } from "node:crypto";
10
- import { spawn } from "node:child_process";
11
- import * as fsPromises from "node:fs/promises";
12
- import { mkdir, mkdtemp, readFile, readdir, rename, rm, stat, unlink, writeFile } from "node:fs/promises";
10
+ import { accessSync, constants, existsSync, readFileSync, readdirSync, statSync, writeFileSync } from "node:fs";
13
11
  import * as path$1 from "node:path";
14
12
  import { dirname, isAbsolute, join, posix, relative, resolve, sep } from "node:path";
13
+ import { spawn } from "node:child_process";
15
14
  import { fileURLToPath, pathToFileURL } from "node:url";
16
- import { AsyncLocalStorage } from "node:async_hooks";
17
- import { accessSync, constants, existsSync, readFileSync, readdirSync, statSync, writeFileSync } from "node:fs";
18
15
  import { homedir, tmpdir } from "node:os";
19
16
  import { defineTool } from "@deepseek-ai/dsh-tools";
17
+ import * as fsPromises from "node:fs/promises";
18
+ import { lstat, mkdir, mkdtemp, readFile, readdir, readlink, rename, rm, stat, unlink, writeFile } from "node:fs/promises";
20
19
  import { FsError } from "@deepseek-ai/dsh-fs";
21
20
  import { ESCALATION_TARGETS, approveEscalation, escalationHintMarker, sandboxDenialMarker, validateEscalationArgs } from "@deepseek-ai/dsh-sandbox";
22
21
  import { gunzipSync } from "node:zlib";
23
22
  import { SessionId } from "@deepseek-ai/dsh-session";
24
23
  import { resolveDshHome } from "@deepseek-ai/dsh-home-paths";
25
24
  import { DatabaseSync } from "node:sqlite";
25
+ import { AsyncLocalStorage } from "node:async_hooks";
26
26
 
27
27
  //#region src/devices/ast/engine/grammar-manifest.mjs
28
28
  /**
@@ -1435,7 +1435,7 @@ const PUPPETEER_CORE_VERSION = "25.3.0";
1435
1435
  */
1436
1436
  async function loadPuppeteer() {
1437
1437
  if (puppeteerModule === void 0) try {
1438
- puppeteerModule = await import("../puppeteer-core-CSk2PtSm.js");
1438
+ puppeteerModule = await import("../puppeteer-core-C-4NyOpY.js");
1439
1439
  } catch {
1440
1440
  try {
1441
1441
  puppeteerModule = await import(pathToFileURL((await ensureVendored({
@@ -2500,7 +2500,7 @@ function ensureMustHave(gate, language) {
2500
2500
  if (!MUST_HAVE.has(language) || gate.installTried.has(language)) return;
2501
2501
  gate.installTried.add(language);
2502
2502
  (async () => {
2503
- const registry = await import("../lsp-server-registry-BXvUTBY7.js");
2503
+ const registry = await import("../lsp-server-registry-BcdkHROD.js");
2504
2504
  const probePath = `/tmp/x.${language === "python" ? "py" : "ts"}`;
2505
2505
  const primary = registry.primaryServerForFile(probePath);
2506
2506
  if (primary === null) return;
@@ -3189,7 +3189,7 @@ async function lspDeviceRead(subpath, session) {
3189
3189
  if (parsed === void 0) return `unknown read path dvc://lsp/${subpath} — reads: status | diagnostics?file=…[&all=1] | definition?file=&line=[&character=|&symbol=] | references?… | hover?…`;
3190
3190
  if (parsed.action === "status") {
3191
3191
  const availability = {};
3192
- const registry = await import("../lsp-server-registry-BXvUTBY7.js");
3192
+ const registry = await import("../lsp-server-registry-BcdkHROD.js");
3193
3193
  for (const language of [
3194
3194
  "python",
3195
3195
  "typescript",
@@ -1,7 +1,7 @@
1
- import { t as Schema } from "./index-DTDXUe6m.js";
2
1
  import { Context } from "@deepseek-ai/cordis";
3
- import { CredentialRecord } from "@deepseek-ai/dsh-credentials";
4
2
  import { IncomingMessage } from "node:http";
3
+ import { CredentialRecord } from "@deepseek-ai/dsh-credentials";
4
+ import * as _deepseek_ai_schemastery21 from "@deepseek-ai/schemastery";
5
5
 
6
6
  //#region src/web-password.d.ts
7
7
 
@@ -123,10 +123,10 @@ interface WebPasswordConfig {
123
123
  /** Absolute browser-session lifetime in days. Default: 30 (the native default). */
124
124
  cookieMaxAgeDays?: number;
125
125
  }
126
- declare const Config: Schema<Schemastery.ObjectS<NoInfer<{
127
- cookieMaxAgeDays: Schema<number, number, "defined">;
126
+ declare const Config: _deepseek_ai_schemastery21.default<Schemastery.ObjectS<NoInfer<{
127
+ cookieMaxAgeDays: _deepseek_ai_schemastery21.default<number, number, "defined">;
128
128
  }>>, Schemastery.ObjectT<NoInfer<{
129
- cookieMaxAgeDays: Schema<number, number, "defined">;
129
+ cookieMaxAgeDays: _deepseek_ai_schemastery21.default<number, number, "defined">;
130
130
  }>>, "plain">;
131
131
  /** Cordis plugin name; also the scope of this row's credential record. */
132
132
  declare const name = "dashr-web-password";
@@ -145,10 +145,10 @@ declare function apply(ctx: Context, config?: WebPasswordConfig): void;
145
145
  declare const _default: {
146
146
  name: string;
147
147
  inject: string[];
148
- Config: Schema<Schemastery.ObjectS<NoInfer<{
149
- cookieMaxAgeDays: Schema<number, number, "defined">;
148
+ Config: _deepseek_ai_schemastery21.default<Schemastery.ObjectS<NoInfer<{
149
+ cookieMaxAgeDays: _deepseek_ai_schemastery21.default<number, number, "defined">;
150
150
  }>>, Schemastery.ObjectT<NoInfer<{
151
- cookieMaxAgeDays: Schema<number, number, "defined">;
151
+ cookieMaxAgeDays: _deepseek_ai_schemastery21.default<number, number, "defined">;
152
152
  }>>, "plain">;
153
153
  apply: typeof apply;
154
154
  };
@@ -335,7 +335,7 @@ async function resolveDistIndex() {
335
335
  * @returns the markup with `<base href="./">` after the head open tag.
336
336
  */
337
337
  function withBaseHref(html) {
338
- return html.replace(/<head(?:\s[^>]*)?>/i, (open) => `${open}<base href="./">`);
338
+ return html.replace(/<head(?:\s[^>]*)?>/i, (open$1) => `${open$1}<base href="./">`);
339
339
  }
340
340
  /**
341
341
  * The root-route gate: one exact `/` handler owning the door, and the only
@@ -388,6 +388,10 @@ var PasswordGate = class {
388
388
  */
389
389
  async handle(req, res) {
390
390
  try {
391
+ if (this.ctx.get("profileContext")?.name === "desktop" && req.method === "GET" && new URL(req.url ?? "/", "http://dsh.invalid").searchParams.has("token")) {
392
+ this.ctx.connection.authorizeIndex(req, res);
393
+ return;
394
+ }
391
395
  const state = await this.gateState();
392
396
  if (req.method === "POST") {
393
397
  await this.handleLogin(req, res, state);
@@ -1,5 +1,5 @@
1
- import { t as Schema } from "./index-DTDXUe6m.js";
2
1
  import { Context } from "@deepseek-ai/cordis";
2
+ import * as _deepseek_ai_schemastery0 from "@deepseek-ai/schemastery";
3
3
 
4
4
  //#region src/web-trust.d.ts
5
5
 
@@ -76,12 +76,12 @@ interface TrustConfig {
76
76
  trustedPageAuthorities?: readonly string[];
77
77
  }
78
78
  /** Row config schema (schema-level default derives from `DSH_TRUSTED_HOSTS`). */
79
- declare const Config: Schema<Schemastery.ObjectS<NoInfer<{
80
- trustAllHosts: Schema<boolean, boolean, "defined">;
81
- trustedPageAuthorities: Schema<string[], string[], "defined">;
79
+ declare const Config: _deepseek_ai_schemastery0.default<Schemastery.ObjectS<NoInfer<{
80
+ trustAllHosts: _deepseek_ai_schemastery0.default<boolean, boolean, "defined">;
81
+ trustedPageAuthorities: _deepseek_ai_schemastery0.default<string[], string[], "defined">;
82
82
  }>>, Schemastery.ObjectT<NoInfer<{
83
- trustAllHosts: Schema<boolean, boolean, "defined">;
84
- trustedPageAuthorities: Schema<string[], string[], "defined">;
83
+ trustAllHosts: _deepseek_ai_schemastery0.default<boolean, boolean, "defined">;
84
+ trustedPageAuthorities: _deepseek_ai_schemastery0.default<string[], string[], "defined">;
85
85
  }>>, "plain">;
86
86
  /** Cordis plugin name. */
87
87
  declare const name = "dashr-web-trust";
@@ -100,12 +100,12 @@ declare function apply(ctx: Context, config: TrustConfig | undefined): void;
100
100
  declare const _default: {
101
101
  name: string;
102
102
  inject: string[];
103
- Config: Schema<Schemastery.ObjectS<NoInfer<{
104
- trustAllHosts: Schema<boolean, boolean, "defined">;
105
- trustedPageAuthorities: Schema<string[], string[], "defined">;
103
+ Config: _deepseek_ai_schemastery0.default<Schemastery.ObjectS<NoInfer<{
104
+ trustAllHosts: _deepseek_ai_schemastery0.default<boolean, boolean, "defined">;
105
+ trustedPageAuthorities: _deepseek_ai_schemastery0.default<string[], string[], "defined">;
106
106
  }>>, Schemastery.ObjectT<NoInfer<{
107
- trustAllHosts: Schema<boolean, boolean, "defined">;
108
- trustedPageAuthorities: Schema<string[], string[], "defined">;
107
+ trustAllHosts: _deepseek_ai_schemastery0.default<boolean, boolean, "defined">;
108
+ trustedPageAuthorities: _deepseek_ai_schemastery0.default<string[], string[], "defined">;
109
109
  }>>, "plain">;
110
110
  apply: typeof apply;
111
111
  };
@@ -1,3 +1,2 @@
1
- import "./index-DTDXUe6m.js";
2
- import { a as _default, c as buildTrustScript, d as name, i as TrustConfig, l as deriveDefaultPageAuthorities, n as Config, o as apply, r as MobileConfig, s as buildMobileScript, t as BootScriptRow, u as inject } from "./web-trust-Dej_RI2B.js";
1
+ import { a as _default, c as buildTrustScript, d as name, i as TrustConfig, l as deriveDefaultPageAuthorities, n as Config, o as apply, r as MobileConfig, s as buildMobileScript, t as BootScriptRow, u as inject } from "./web-trust-C_Y6o8Z2.js";
3
2
  export { BootScriptRow, Config, MobileConfig, TrustConfig, apply, buildMobileScript, buildTrustScript, _default as default, deriveDefaultPageAuthorities, inject, name };
@@ -1,18 +1,16 @@
1
1
  import { Context } from "@deepseek-ai/cordis";
2
+ import * as _deepseek_ai_schemastery9 from "@deepseek-ai/schemastery";
2
3
 
3
4
  //#region src/welcome-notice.d.ts
4
5
  declare const name = "dashr-welcome-notice";
5
6
  declare const inject: string[];
6
- /** The private upstream constant has no Host export; reject changed layouts rather than guess. */
7
- declare function parseWelcomeVersion(client: string): string;
8
- /** Resolve from the owning DSH installation, never from this plugin's build dependencies. */
9
- declare function readHostWelcomeVersion(installAnchor: string): string;
10
- /** Keep the original settings namespace and native UI; project policy before startup settles. */
11
- declare function apply(ctx: Context): Promise<(() => Promise<void>) | undefined>;
7
+ declare const Config: _deepseek_ai_schemastery9.default<NoInfer<Schemastery.ObjectS<{}>>, NoInfer<Schemastery.ObjectT<{}>>, "volatile">;
8
+ declare function apply(ctx: Context): void;
12
9
  declare const _default: {
13
10
  name: string;
14
11
  inject: string[];
12
+ Config: _deepseek_ai_schemastery9.default<NoInfer<Schemastery.ObjectS<{}>>, NoInfer<Schemastery.ObjectT<{}>>, "volatile">;
15
13
  apply: typeof apply;
16
14
  };
17
15
  //#endregion
18
- export { apply, _default as default, inject, name, parseWelcomeVersion, readHostWelcomeVersion };
16
+ export { Config, apply, _default as default, inject, name };
@@ -1,59 +1,20 @@
1
- import { createRequire } from "node:module";
2
- import { readFileSync } from "node:fs";
1
+ import { t as Schema } from "./lib-C8_jXvwA.js";
3
2
 
4
3
  //#region src/welcome-notice.ts
5
4
  const name = "dashr-welcome-notice";
6
- const inject = ["loader", "profileContext"];
7
- const NAMESPACE = "ui-settings-general";
8
- const FIELD = "welcomeNoticeVersion";
9
- /** The private upstream constant has no Host export; reject changed layouts rather than guess. */
10
- function parseWelcomeVersion(client) {
11
- const values = [...client.matchAll(/\b(?:const|let|var)\s+WELCOME_NOTICE_VERSION\s*=\s*(['"])([^'"\\\r\n]+)\1\s*[;,]/g)];
12
- if (values.length !== 1) throw new Error("dashr-welcome-notice: expected one WELCOME_NOTICE_VERSION in the installed Models client; check the upstream bundle layout or disable this entry");
13
- return values[0][2];
14
- }
15
- /** Resolve from the owning DSH installation, never from this plugin's build dependencies. */
16
- function readHostWelcomeVersion(installAnchor) {
17
- return parseWelcomeVersion(readFileSync(createRequire(createRequire(installAnchor).resolve("@deepseek-ai/dsh-web-app/package.json")).resolve("@deepseek-ai/dsh-client-ui-settings-models/client"), "utf8"));
18
- }
19
- /** Keep the original settings namespace and native UI; project policy before startup settles. */
20
- async function apply(ctx) {
21
- const entry = [...ctx.loader.entries()].find((entry$1) => entry$1.options.id === NAMESPACE);
22
- if (entry === void 0 || entry.disabled) return;
23
- const version = readHostWelcomeVersion(ctx.profileContext.installAnchor);
24
- const original = { ...entry.options.config ?? {} };
25
- const unhook = ctx.on("internal/config", function(_raw, next) {
26
- const config = next();
27
- return this.entry?.options.id === NAMESPACE ? {
28
- ...config,
29
- [FIELD]: version
30
- } : config;
31
- }, { global: true });
32
- try {
33
- if (entry.fiber === void 0) await entry.init();
34
- await entry.fiber?.await();
35
- await entry.update({ config: {
36
- ...original,
37
- [FIELD]: version
38
- } });
39
- } catch (error) {
40
- unhook();
41
- throw error;
42
- }
43
- return async () => {
44
- unhook();
45
- if (entry.fiber === void 0 || entry.disabled) return;
46
- const config = { ...entry.options.config ?? {} };
47
- if (Object.hasOwn(original, FIELD)) config[FIELD] = original[FIELD];
48
- else delete config[FIELD];
49
- await entry.update({ config });
50
- };
5
+ const inject = [];
6
+ const Config = Schema.object({}).volatile();
7
+ function apply(ctx) {
8
+ ctx.inject(["settings"], (child) => {
9
+ child.effect(() => child.settings.configure({ auto: false }, ctx.fiber));
10
+ });
51
11
  }
52
12
  var welcome_notice_default = {
53
13
  name,
54
14
  inject,
15
+ Config,
55
16
  apply
56
17
  };
57
18
 
58
19
  //#endregion
59
- export { apply, welcome_notice_default as default, inject, name, parseWelcomeVersion, readHostWelcomeVersion };
20
+ export { Config, apply, welcome_notice_default as default, inject, name };
@@ -1,6 +1,6 @@
1
+ import { promises, statSync } from "node:fs";
1
2
  import { dirname, isAbsolute, join, relative, resolve, sep } from "node:path";
2
3
  import { fileURLToPath } from "node:url";
3
- import { promises, statSync } from "node:fs";
4
4
 
5
5
  //#region src/url-schemes/catalog.ts
6
6
  /**
package/package.json CHANGED
@@ -1,7 +1,7 @@
1
1
  {
2
2
  "name": "better-dsh",
3
- "version": "0.3.0",
4
- "description": "Make your dsh ready for serious coding tasks. (Tools x Schemas)^REPL. `skill://`, `ctx://`, `agent://`, `dvc://`, `dsh://`, IPython REPL, Context as Variables, cross compactions recallable, full context revive. `hash-edit`, `dvc://browser`, subagent as function, workflow as function.",
3
+ "version": "0.3.1-a",
4
+ "description": "Make your dsh ready for serious coding tasks. (Tools x Schemas)^REPL. `skill://`, `ctx://`, `agent://`, `dvc://`, `dsh://`, Python REPL, Context as Variables, cross compactions recallable, full context revive. `hash-edit`, `dvc://browser`, subagent as function, workflow as function.",
5
5
  "type": "module",
6
6
  "main": "lib/index.js",
7
7
  "types": "lib/index.d.ts",
@@ -55,18 +55,6 @@
55
55
  "./welcome-notice": {
56
56
  "types": "./lib/welcome-notice.d.ts",
57
57
  "default": "./lib/welcome-notice.js"
58
- },
59
- "./webserver": {
60
- "types": "./lib/webserver.d.ts",
61
- "default": "./lib/webserver.js"
62
- },
63
- "./bundle-delivery": {
64
- "types": "./lib/bundle-delivery.d.ts",
65
- "default": "./lib/bundle-delivery.js"
66
- },
67
- "./hmr": {
68
- "types": "./lib/hmr.d.ts",
69
- "default": "./lib/hmr.js"
70
58
  }
71
59
  },
72
60
  "imports": {
@@ -83,8 +71,7 @@
83
71
  "cordis.patch.yml",
84
72
  "eval-description.md",
85
73
  "url-schemes-instruction.md",
86
- "scripts/kernel-provision.mjs",
87
- "scripts/register-bundle.mjs"
74
+ "scripts/kernel-check.mjs"
88
75
  ],
89
76
  "scripts": {
90
77
  "prebuild": "node scripts/copy-docs.mjs",
@@ -94,7 +81,7 @@
94
81
  "typecheck:client": "tsc -p tsconfig.client.json",
95
82
  "test": "vitest --run",
96
83
  "test:watch": "vitest",
97
- "kernel:venv": "node scripts/kernel-provision.mjs",
84
+ "kernel:check": "node scripts/kernel-check.mjs",
98
85
  "build-client": "tsx scripts/build-client.ts"
99
86
  },
100
87
  "license": "MIT",
@@ -144,7 +131,6 @@
144
131
  "@deepseek-ai/dsh-fs-local": ">=0.1.5-0 <0.3.0-0",
145
132
  "@deepseek-ai/dsh-home-paths": ">=0.1.5-0 <0.3.0-0",
146
133
  "@deepseek-ai/dsh-host-webserver": ">=0.1.5-0 <0.3.0-0",
147
- "@deepseek-ai/dsh-invariants": ">=0.1.5-0 <0.3.0-0",
148
134
  "@deepseek-ai/dsh-llm": ">=0.1.5-0 <0.3.0-0",
149
135
  "@deepseek-ai/dsh-llm-retry": ">=0.1.5-0 <0.3.0-0",
150
136
  "@deepseek-ai/dsh-persona": ">=0.1.5-0 <0.3.0-0",
@@ -180,7 +166,7 @@
180
166
  "@deepseek-ai/dsh-atomic-write": ">=0.1.5-0 <0.3.0-0",
181
167
  "@deepseek-ai/dsh-cmdline": ">=0.1.5-0 <0.3.0-0",
182
168
  "@deepseek-ai/dsh-plugin-manager": ">=0.1.5-0 <0.3.0-0",
183
- "@deepseek-ai/dsh-hmr": ">=0.1.5-0 <0.3.0-0"
169
+ "@deepseek-ai/dsh-jobs": ">=0.1.5-0 <0.3.0-0"
184
170
  },
185
171
  "peerDependenciesMeta": {
186
172
  "@deepseek-ai/cordis": {
@@ -228,9 +214,6 @@
228
214
  "@deepseek-ai/dsh-home-paths": {
229
215
  "optional": true
230
216
  },
231
- "@deepseek-ai/dsh-invariants": {
232
- "optional": true
233
- },
234
217
  "@deepseek-ai/dsh-llm": {
235
218
  "optional": true
236
219
  },
@@ -372,7 +355,7 @@
372
355
  "@deepseek-ai/dsh-plugin-manager": {
373
356
  "optional": true
374
357
  },
375
- "@deepseek-ai/dsh-hmr": {
358
+ "@deepseek-ai/dsh-jobs": {
376
359
  "optional": true
377
360
  }
378
361
  },
@@ -418,7 +401,7 @@
418
401
  "deepseek-harness",
419
402
  "repl",
420
403
  "eval",
421
- "ipython",
404
+ "python",
422
405
  "kernel",
423
406
  "agent",
424
407
  "plugin"
@@ -0,0 +1,5 @@
1
+ #!/usr/bin/env node
2
+ /** Check an existing interpreter; never install Python or create an environment. */
3
+ const { resolveKernelEnv } = await import(new URL('../lib/kernel-env.js', import.meta.url).href)
4
+ const env = await resolveKernelEnv({ python: process.env.DASHR_KERNEL_PYTHON })
5
+ console.log(`Better Python REPL ready: Python ${env.version} at ${env.python}`)
@@ -1,4 +0,0 @@
1
- import "./main-CupOhMp5.js";
2
- import { t as convertPuppeteerChannelToBrowsersChannel } from "./LaunchOptions-kGXcZOe0.js";
3
-
4
- export { convertPuppeteerChannelToBrowsersChannel };
@@ -1,20 +0,0 @@
1
- import { Context } from "@deepseek-ai/cordis";
2
- import { ProfileContext } from "@deepseek-ai/dsh-app-boot";
3
-
4
- //#region src/bundle-delivery.d.ts
5
- declare const name = "dashr-bundle-delivery";
6
- declare const inject: string[];
7
- interface DeliveryResult {
8
- installed: string[];
9
- restartRequired: boolean;
10
- }
11
- /** First registration enables a companion; native reconciliation preserves retained disablement. */
12
- declare function reconcileBundledDelivery(profile: ProfileContext, signal?: AbortSignal): Promise<DeliveryResult>;
13
- declare function apply(ctx: Context): void;
14
- declare const _default: {
15
- name: string;
16
- inject: string[];
17
- apply: typeof apply;
18
- };
19
- //#endregion
20
- export { apply, _default as default, inject, name, reconcileBundledDelivery };
@@ -1,209 +0,0 @@
1
- import { createHash, randomUUID } from "node:crypto";
2
- import { spawn } from "node:child_process";
3
- import { mkdir, readFile, realpath, rename, rm, writeFile } from "node:fs/promises";
4
- import { dirname, isAbsolute, join, relative, resolve } from "node:path";
5
- import { fileURLToPath } from "node:url";
6
- import { withFileLock, writeFileAtomic } from "@deepseek-ai/dsh-atomic-write";
7
-
8
- //#region src/bundle-delivery.ts
9
- const name = "dashr-bundle-delivery";
10
- const inject = ["profileContext", "appReady"];
11
- const hash = (bytes) => createHash("sha256").update(bytes).digest("hex");
12
- const json = async (path$1) => JSON.parse(await readFile(path$1, "utf8"));
13
- async function optionalJson(path$1) {
14
- try {
15
- return await json(path$1);
16
- } catch (error) {
17
- if (error.code === "ENOENT") return void 0;
18
- throw error;
19
- }
20
- }
21
- async function contained(root, path$1) {
22
- if (isAbsolute(path$1)) throw new Error("Pack delivery path must be relative");
23
- const base = await realpath(root), file = await realpath(resolve(base, path$1));
24
- const rel = relative(base, file);
25
- if (rel === ".." || rel.startsWith(`..${process.platform === "win32" ? "\\" : "/"}`) || isAbsolute(rel)) throw new Error("Pack delivery path escapes its owner");
26
- return file;
27
- }
28
- /** A child process avoids inheriting a running HMR transaction's AsyncLocalStorage. */
29
- async function installNative(profile, archive, expected, signal) {
30
- signal?.throwIfAborted();
31
- const childScript = fileURLToPath(new URL("../scripts/register-bundle.mjs", import.meta.url));
32
- return new Promise((done, fail) => {
33
- const child = spawn(process.execPath, [childScript], {
34
- stdio: [
35
- "pipe",
36
- "pipe",
37
- "pipe"
38
- ],
39
- cwd: profile.dir
40
- });
41
- let output = "", diagnostic = "";
42
- const abort = () => {
43
- child.kill("SIGTERM");
44
- };
45
- const timeout = setTimeout(abort, 36e4);
46
- signal?.addEventListener("abort", abort, { once: true });
47
- child.stdout.setEncoding("utf8").on("data", (chunk) => {
48
- output = (output + chunk).slice(-32768);
49
- });
50
- child.stderr.setEncoding("utf8").on("data", (chunk) => {
51
- diagnostic = (diagnostic + chunk).slice(-4096);
52
- });
53
- child.on("error", fail);
54
- child.on("close", (code) => {
55
- clearTimeout(timeout);
56
- signal?.removeEventListener("abort", abort);
57
- if (signal?.aborted) {
58
- fail(signal.reason);
59
- return;
60
- }
61
- if (code !== 0) {
62
- fail(/* @__PURE__ */ new Error(`Native companion registration failed (${code}): ${diagnostic.trim() || output.trim()}`));
63
- return;
64
- }
65
- try {
66
- const result = JSON.parse(output);
67
- if (result.exitCode !== 0) fail(/* @__PURE__ */ new Error(`Native companion registration failed (${result.exitCode}); diagnostics: ${result.logPath ?? "unavailable"}`));
68
- else if (![
69
- "installed",
70
- "owner-changed",
71
- "companion-changed",
72
- "companion-removed"
73
- ].includes(result.disposition)) fail(/* @__PURE__ */ new Error("Native companion registration returned an invalid disposition"));
74
- else done(result.disposition);
75
- } catch (error) {
76
- fail(error);
77
- }
78
- });
79
- child.stdin.on("error", () => {});
80
- child.stdin.end(JSON.stringify({
81
- profile,
82
- archive,
83
- expected
84
- }));
85
- });
86
- }
87
- /** First registration enables a companion; native reconciliation preserves retained disablement. */
88
- async function reconcileBundledDelivery(profile, signal) {
89
- const directory = join(profile.home, "bundle-artifacts");
90
- await mkdir(directory, {
91
- recursive: true,
92
- mode: 448
93
- });
94
- const key = hash(profile.dir);
95
- return withFileLock(join(directory, key + ".delivery"), async () => {
96
- signal?.throwIfAborted();
97
- const receiptPath = join(directory, key + ".json");
98
- const receipts = await optionalJson(receiptPath) ?? {};
99
- const manifest = await json(join(profile.dir, "package.json"));
100
- const result = {
101
- installed: [],
102
- restartRequired: false
103
- };
104
- for (const owner of Object.keys(manifest.dependencies ?? {})) {
105
- const ownerDir = join(profile.dir, "node_modules", owner);
106
- const ownerManifest = await optionalJson(join(ownerDir, "package.json"));
107
- if (ownerManifest?.superd?.delivery === void 0) continue;
108
- const descriptorPath = await contained(ownerDir, ownerManifest.superd.delivery);
109
- const descriptor = await json(descriptorPath);
110
- if (!Array.isArray(descriptor.companions)) throw new Error("Invalid pack delivery descriptor");
111
- for (const item of descriptor.companions) {
112
- if (item.name !== "better-dsh" || item.version !== ownerManifest.dependencies?.[item.name] || !/^[a-f0-9]{64}$/.test(item.sha256)) throw new Error("Invalid companion identity/version/digest");
113
- const bytes = await readFile(await contained(dirname(descriptorPath), item.tarball));
114
- if (hash(bytes) !== item.sha256) throw new Error(`Pack companion SHA256 mismatch: ${item.name}`);
115
- const archive = join(directory, `${item.name}-${item.sha256}.tgz`);
116
- const cached = await optionalJson(join(profile.dir, "node_modules", item.name, "package.json"));
117
- const current = await json(join(profile.dir, "package.json"));
118
- const ownerSpec = current.dependencies?.[owner];
119
- if (ownerSpec === void 0) continue;
120
- const priorSpec = current.dependencies?.[item.name];
121
- const receiptKey = `${owner}:${item.name}`;
122
- if (priorSpec === void 0 && receipts[receiptKey] === item.sha256) continue;
123
- if (priorSpec === "file:" + archive && cached?.name === item.name && cached.version === item.version) {
124
- receipts[receiptKey] = item.sha256;
125
- await writeFileAtomic(receiptPath, JSON.stringify(receipts) + "\n", { mode: 384 });
126
- continue;
127
- }
128
- try {
129
- if (hash(await readFile(archive)) !== item.sha256) throw new Error(`Cached companion SHA256 mismatch: ${item.name}`);
130
- } catch (error) {
131
- if (error.code !== "ENOENT") throw error;
132
- const temporary = archive + "." + randomUUID() + ".tmp";
133
- try {
134
- await writeFile(temporary, bytes, {
135
- flag: "wx",
136
- mode: 384
137
- });
138
- await rename(temporary, archive);
139
- } finally {
140
- await rm(temporary, { force: true });
141
- }
142
- }
143
- signal?.throwIfAborted();
144
- const disposition = await installNative(profile, archive, {
145
- owner,
146
- ownerSpec,
147
- companion: item,
148
- ...priorSpec === void 0 ? {} : { priorSpec }
149
- }, signal);
150
- if (disposition === "owner-changed" || disposition === "companion-changed") continue;
151
- receipts[receiptKey] = item.sha256;
152
- await writeFileAtomic(receiptPath, JSON.stringify(receipts) + "\n", { mode: 384 });
153
- if (disposition === "companion-removed") continue;
154
- result.installed.push(`${item.name}@${item.version}`);
155
- result.restartRequired ||= priorSpec !== void 0;
156
- }
157
- }
158
- return result;
159
- }, { waitMs: 12e4 });
160
- }
161
- function apply(ctx) {
162
- const signal = new AbortController();
163
- let started = false, running = false, again = false;
164
- const reconcile = async () => {
165
- if (!started || signal.signal.aborted) return;
166
- if (running) {
167
- again = true;
168
- return;
169
- }
170
- running = true;
171
- try {
172
- const result = await reconcileBundledDelivery(ctx.profileContext, signal.signal);
173
- if (result.installed.length) {
174
- ctx.logger.info(`Registered ${result.installed.join(", ")} from its containing local pack${result.restartRequired ? "; restart DSH to use the updated code" : ""}`);
175
- ctx.emit("plugin-manager/changed", { reason: "install" });
176
- }
177
- } catch (error) {
178
- if (!signal.signal.aborted) ctx.logger.error("Local pack companion registration failed; retry by re-enabling the bundle", error);
179
- } finally {
180
- running = false;
181
- if (again && !signal.signal.aborted) {
182
- again = false;
183
- reconcile();
184
- }
185
- }
186
- };
187
- ctx.effect(() => {
188
- const offReady = ctx.appReady.onReady(() => {
189
- started = true;
190
- reconcile();
191
- });
192
- const offChange = ctx.on("plugin-manager/changed", () => {
193
- reconcile();
194
- });
195
- return () => {
196
- offReady();
197
- offChange();
198
- signal.abort();
199
- };
200
- }, "bundle-delivery: native registration");
201
- }
202
- var bundle_delivery_default = {
203
- name,
204
- inject,
205
- apply
206
- };
207
-
208
- //#endregion
209
- export { apply, bundle_delivery_default as default, inject, name, reconcileBundledDelivery };