From 4ca29218f6940068e862d69ba1248ba5036715d9 Mon Sep 17 00:00:00 2001 From: a Date: Wed, 2 Sep 2026 20:36:24 +0000 Subject: [PATCH] fix(mtmharness): align with DSH alpha5 --- packages/mtmharness/README.md | 8 +- packages/mtmharness/package.json | 140 ++-- packages/mtmharness/src/client/index.test.ts | 19 +- packages/mtmharness/src/client/index.ts | 2 +- .../src/features/coding/client/locales.ts | 12 +- .../src/features/coding/codebase-memory.ts | 43 +- .../mtmharness/src/features/coding/index.ts | 75 +- .../src/features/coding/manifest.ts | 36 +- .../src/features/coding/packages.json | 15 + .../src/features/coding/ponytail.ts | 10 +- .../mtmharness/src/features/coding/rtk.ts | 85 +-- .../mtmharness/src/features/coding/types.ts | 8 +- .../src/features/mtm-connect/client/index.tsx | 2 +- .../src/features/secondary/client.test.ts | 3 + .../src/features/secondary/client.ts | 18 +- .../src/features/update/index.test.ts | 20 +- .../mtmharness/src/features/update/index.ts | 58 +- packages/mtmharness/src/skill-files.ts | 182 ++++- .../mtmharness/tests/coding-plugin.test.mjs | 45 +- .../mtmharness/tests/packed-install.test.mjs | 13 +- .../mtmharness/tests/skill-filesystem.test.ts | 54 +- pnpm-lock.yaml | 647 +++++++++--------- pnpm-workspace.yaml | 74 +- 23 files changed, 947 insertions(+), 622 deletions(-) diff --git a/packages/mtmharness/README.md b/packages/mtmharness/README.md index 6a4272f..5384ad0 100644 --- a/packages/mtmharness/README.md +++ b/packages/mtmharness/README.md @@ -5,15 +5,15 @@ - **DSH Web plugin**: the package root and `./client` export use the official `dsh.client` lazy-CJS contract. One installation provides the settings-controlled MTM Connect secondary extension and the Codebase Memory/Modern Go/Ponytail/RTK coding features. - **Independent web client**: the package also publishes a BrowserHistory static app and a MemoryHistory script/embed entry. These artifacts own their React root, router, styles, and teardown and never load the local coding runtime. -The DSH plugin is assembled from coding and secondary frontend domains under one Host/Client lifecycle. Codebase Memory keeps its `codebase_memory` server namespace and `mcp__codebase_memory__*` tool names; Ponytail exposes six externally installed skills through DSH's native skill surface. The `/ponytail` command controls per-agent intensity; the five companion names remain available as native skills and are not duplicated as host commands. The `mtm-coding` settings namespace contains the runtime extension toggles. +The DSH plugin is assembled from coding and secondary frontend domains under one Host/Client lifecycle. Codebase Memory keeps its `codebase_memory` server namespace and `mcp__codebase_memory__*` tool names; Ponytail exposes six externally installed skills through DSH's native skill surface. The `/ponytail` command controls per-agent automatic prompt intensity; `off` suppresses that section while explicit native skill invocation remains available. The five companion names are not duplicated as host commands. The `mtm-coding` settings namespace contains the runtime extension toggles. Modern Go Guidelines is enabled by default as the externally installed `use-modern-go` skill. Its trusted manifest pins the JetBrains `v0.1.1` source and SHA-256; the first enable downloads it into `$DSH_HOME/mtmharness/skills/modern-go`, and `modernGoEnabled` removes the skill from the DSH catalog. Existing files are user-owned and are never overwritten automatically. -RTK is an optional coding feature in the same `mtm-coding` settings namespace. `rtkMode` defaults to `auto`: it transparently rewrites Bash calls when the DSH `tools/pre-record-input` capability is available and falls back to guidance when it is not. Explicit `rewrite` is strict and reports `unavailable` on older DSH runtimes instead of changing frozen tool inputs. The pinned RTK `v0.45.0` binary is resolved and installed lazily from the matching command hook under the DSH home with checksum verification; there is no separate RTK skill document. RTK telemetry, tracking, and tee output are disabled for plugin-managed runs. +RTK is an optional coding feature in the same `mtm-coding` settings namespace. `rtkMode` defaults to `auto` and provides guidance for explicitly invoking an RTK command when the executable is available. The current DSH ToolRuntime has no supported pre-dispatch input-rewrite seam, so the plugin does not register a speculative hook; `rewrite` reports `unavailable` and leaves frozen tool arguments unchanged. The pinned RTK `v0.45.0` runtime helpers remain checksum-verified for explicit integrations; there is no separate RTK skill document. RTK telemetry, tracking, and tee output are disabled for plugin-managed runs. ## Coding Skill Files -The trusted package catalog is data in `src/features/coding/packages.json`: it owns labels, icon keys, immutable GitHub commit pins, expected file digests, and static prompt declarations. On first enable, Ponytail and Modern Go documents are downloaded into `$DSH_HOME/mtmharness/skills/` only when that directory is absent. Downloads are size-limited, SHA-256 checked, written to a temporary sibling, and atomically renamed; an existing directory is treated as an editable user copy. Each enabled package mounts one uniquely named official `@deepseek-ai/dsh-skill-filesystem` provider against its managed custom root, so agents can read and edit the files. Static manifest prompts are mounted only while their package is enabled. +The trusted package catalog is data in `src/features/coding/packages.json`: it owns labels, icon keys, immutable GitHub commit pins, expected file digests, and static prompt declarations. On first enable, Ponytail and Modern Go documents plus their pinned resources are downloaded into `$DSH_HOME/mtmharness/skills/` only when that directory is absent; an existing older directory is completed only with missing bundle files. Downloads are size-limited, SHA-256 checked, written to a temporary sibling, and atomically renamed; existing files remain user-owned and are never overwritten. Each enabled package mounts one uniquely named official `@deepseek-ai/dsh-skill-filesystem` provider against its managed custom root, so agents can read the files while writes remain subject to the active DSH filesystem policy. Static manifest prompts are mounted only while their package is enabled. ## DSH Web Plugin @@ -24,7 +24,7 @@ Install the package into a web profile: Restart the DSH Web host after changing profile composition. Open Settings > Plugins > Plugin configuration to control MTM Connect. The host owns the React root, session connection, and lifecycle. -The plugin registers the `mtm-connect` settings namespace and its externally managed coding skills. No local device backend, token, or loopback RPC is activated by this frontend experiment. The independent static/embed client remains a separate application surface and is not part of the DSH plugin. +The plugin registers the `mtm-connect` settings namespace and its externally managed coding skills. MTM Connect itself activates no local device backend or token flow; package updates use the host's official DSH connection RPC. The independent static/embed client remains a separate application surface and is not part of the DSH plugin. ## Secondary Extensions diff --git a/packages/mtmharness/package.json b/packages/mtmharness/package.json index fc0c918..0de7c44 100644 --- a/packages/mtmharness/package.json +++ b/packages/mtmharness/package.json @@ -1,6 +1,6 @@ { "name": "mtmharness", - "version": "0.9.2", + "version": "0.9.3", "description": "Unified DeepSeek Harness Web plugin with Connect, Codebase Memory, Modern Go, Ponytail, and independent static/embed clients.", "type": "module", "engines": { "node": ">=22.19.0", "pnpm": ">=11.7.0" }, @@ -60,83 +60,83 @@ "repository": { "type": "git", "url": "git+https://github.com/codeh007/mtmdsh.git", "directory": "packages/mtmharness" }, "dependencies": { "@deepseek-ai/schemastery": "3.18.2", - "npm": "11.7.0" + "npm": "11.7.0", + "yaml": "^2.4.2" }, "peerDependencies": { "@deepseek-ai/cordis": "^4.0.2", - "@deepseek-ai/dsh-agent": "^0.1.2-alpha.4", - "@deepseek-ai/dsh-attachment": "^0.1.2-alpha.4", - "@deepseek-ai/dsh-brand": "^0.1.2-alpha.4", - "@deepseek-ai/dsh-code-runtime": "^0.1.2-alpha.4", - "@deepseek-ai/dsh-commands": "^0.1.2-alpha.4", - "@deepseek-ai/dsh-llm": "^0.1.2-alpha.4", - "@deepseek-ai/dsh-mcp-client": "^0.1.2-alpha.4", - "@deepseek-ai/dsh-sandbox": "^0.1.2-alpha.4", - "@deepseek-ai/dsh-scope": "^0.1.2-alpha.4", - "@deepseek-ai/dsh-session-projection": "^0.1.2-alpha.4", - "@deepseek-ai/dsh-session": "^0.1.2-alpha.4", - "@deepseek-ai/dsh-session-turn-outline": "^0.1.2-alpha.4", - "@deepseek-ai/dsh-settings": "^0.1.2-alpha.4", - "@deepseek-ai/dsh-fs": "^0.1.2-alpha.4", - "@deepseek-ai/dsh-home-paths": "^0.1.2-alpha.4", - "@deepseek-ai/dsh-invariants": "^0.1.2-alpha.4", - "@deepseek-ai/dsh-skill": "^0.1.2-alpha.4", - "@deepseek-ai/dsh-skill-filesystem": "^0.1.2-alpha.4", - "@deepseek-ai/dsh-subprocess": "^0.1.2-alpha.4", - "@deepseek-ai/dsh-system-prompt": "^0.1.2-alpha.4", - "@deepseek-ai/dsh-timeout": "^0.1.2-alpha.4", - "@deepseek-ai/dsh-tools": "^0.1.2-alpha.4", - "@deepseek-ai/dsh-typert-protocol": "^0.1.2-alpha.4", - "@deepseek-ai/dsh-user-approval": "^0.1.2-alpha.4", - "@deepseek-ai/dsh-client-connection": "^0.1.2-alpha.4", - "@deepseek-ai/dsh-client-locale": "^0.1.2-alpha.4", - "@deepseek-ai/dsh-client-store": "^0.1.2-alpha.4", - "@deepseek-ai/dsh-client-ui-renderer": "^0.1.2-alpha.4", - "@deepseek-ai/dsh-client-ui-primitives": "^0.1.2-alpha.4", - "@deepseek-ai/dsh-client-ui-settings": "^0.1.2-alpha.4", - "@deepseek-ai/dsh-client-ui-settings-plugins": "^0.1.2-alpha.4", - "@deepseek-ai/dsh-client-ui-sidebar": "^0.1.2-alpha.4", - "@deepseek-ai/dsh-client-ui-layout": "^0.1.2-alpha.4", - "@deepseek-ai/dsh-client-ui-slots": "^0.1.2-alpha.4", + "@deepseek-ai/dsh-agent": "0.1.2-alpha.5", + "@deepseek-ai/dsh-attachment": "0.1.2-alpha.5", + "@deepseek-ai/dsh-brand": "0.1.2-alpha.5", + "@deepseek-ai/dsh-code-runtime": "0.1.2-alpha.5", + "@deepseek-ai/dsh-commands": "0.1.2-alpha.5", + "@deepseek-ai/dsh-llm": "0.1.2-alpha.5", + "@deepseek-ai/dsh-mcp-client": "0.1.2-alpha.5", + "@deepseek-ai/dsh-sandbox": "0.1.2-alpha.5", + "@deepseek-ai/dsh-scope": "0.1.2-alpha.5", + "@deepseek-ai/dsh-session-projection": "0.1.2-alpha.5", + "@deepseek-ai/dsh-session": "0.1.2-alpha.5", + "@deepseek-ai/dsh-session-turn-outline": "0.1.2-alpha.5", + "@deepseek-ai/dsh-settings": "0.1.2-alpha.5", + "@deepseek-ai/dsh-fs": "0.1.2-alpha.5", + "@deepseek-ai/dsh-home-paths": "0.1.2-alpha.5", + "@deepseek-ai/dsh-skill": "0.1.2-alpha.5", + "@deepseek-ai/dsh-skill-filesystem": "0.1.2-alpha.5", + "@deepseek-ai/dsh-subprocess": "0.1.2-alpha.5", + "@deepseek-ai/dsh-system-prompt": "0.1.2-alpha.5", + "@deepseek-ai/dsh-timeout": "0.1.2-alpha.5", + "@deepseek-ai/dsh-tools": "0.1.2-alpha.5", + "@deepseek-ai/dsh-typert-protocol": "0.1.2-alpha.5", + "@deepseek-ai/dsh-user-approval": "0.1.2-alpha.5", + "@deepseek-ai/dsh-client-connection": "0.1.2-alpha.5", + "@deepseek-ai/dsh-client-locale": "0.1.2-alpha.5", + "@deepseek-ai/dsh-client-store": "0.1.2-alpha.5", + "@deepseek-ai/dsh-client-ui-renderer": "0.1.2-alpha.5", + "@deepseek-ai/dsh-client-ui-primitives": "0.1.2-alpha.5", + "@deepseek-ai/dsh-client-ui-settings": "0.1.2-alpha.5", + "@deepseek-ai/dsh-client-ui-settings-plugins": "0.1.2-alpha.5", + "@deepseek-ai/dsh-client-ui-sidebar": "0.1.2-alpha.5", + "@deepseek-ai/dsh-client-ui-layout": "0.1.2-alpha.5", + "@deepseek-ai/dsh-client-ui-slots": "0.1.2-alpha.5", "react": ">=18.2.0 <20" }, "devDependencies": { "@base-ui/react": "1.7.0", "@deepseek-ai/cordis": "4.0.2", - "@deepseek-ai/dsh-agent": "0.1.2-alpha.4", - "@deepseek-ai/dsh-attachment": "0.1.2-alpha.4", - "@deepseek-ai/dsh-brand": "0.1.2-alpha.4", - "@deepseek-ai/dsh-code-runtime": "0.1.2-alpha.4", - "@deepseek-ai/dsh-commands": "0.1.2-alpha.4", - "@deepseek-ai/dsh-llm": "0.1.2-alpha.4", - "@deepseek-ai/dsh-mcp-client": "0.1.2-alpha.4", - "@deepseek-ai/dsh-sandbox": "0.1.2-alpha.4", - "@deepseek-ai/dsh-scope": "0.1.2-alpha.4", - "@deepseek-ai/dsh-session-projection": "0.1.2-alpha.4", - "@deepseek-ai/dsh-session": "0.1.2-alpha.4", - "@deepseek-ai/dsh-session-turn-outline": "0.1.2-alpha.4", - "@deepseek-ai/dsh-settings": "0.1.2-alpha.4", - "@deepseek-ai/dsh-fs": "0.1.2-alpha.4", - "@deepseek-ai/dsh-home-paths": "0.1.2-alpha.4", - "@deepseek-ai/dsh-invariants": "0.1.2-alpha.4", - "@deepseek-ai/dsh-skill": "0.1.2-alpha.4", - "@deepseek-ai/dsh-skill-filesystem": "0.1.2-alpha.4", - "@deepseek-ai/dsh-subprocess": "0.1.2-alpha.4", - "@deepseek-ai/dsh-system-prompt": "0.1.2-alpha.4", - "@deepseek-ai/dsh-timeout": "0.1.2-alpha.4", - "@deepseek-ai/dsh-tools": "0.1.2-alpha.4", - "@deepseek-ai/dsh-typert-protocol": "0.1.2-alpha.4", - "@deepseek-ai/dsh-user-approval": "0.1.2-alpha.4", - "@deepseek-ai/dsh-client-connection": "0.1.2-alpha.4", - "@deepseek-ai/dsh-client-locale": "0.1.2-alpha.4", - "@deepseek-ai/dsh-client-store": "0.1.2-alpha.4", - "@deepseek-ai/dsh-client-ui-renderer": "0.1.2-alpha.4", - "@deepseek-ai/dsh-client-ui-primitives": "0.1.2-alpha.4", - "@deepseek-ai/dsh-client-ui-settings": "0.1.2-alpha.4", - "@deepseek-ai/dsh-client-ui-settings-plugins": "0.1.2-alpha.4", - "@deepseek-ai/dsh-client-ui-sidebar": "0.1.2-alpha.4", - "@deepseek-ai/dsh-client-ui-layout": "0.1.2-alpha.4", - "@deepseek-ai/dsh-client-ui-slots": "0.1.2-alpha.4", + "@deepseek-ai/dsh-agent": "0.1.2-alpha.5", + "@deepseek-ai/dsh-attachment": "0.1.2-alpha.5", + "@deepseek-ai/dsh-brand": "0.1.2-alpha.5", + "@deepseek-ai/dsh-code-runtime": "0.1.2-alpha.5", + "@deepseek-ai/dsh-commands": "0.1.2-alpha.5", + "@deepseek-ai/dsh-llm": "0.1.2-alpha.5", + "@deepseek-ai/dsh-mcp-client": "0.1.2-alpha.5", + "@deepseek-ai/dsh-sandbox": "0.1.2-alpha.5", + "@deepseek-ai/dsh-scope": "0.1.2-alpha.5", + "@deepseek-ai/dsh-session-projection": "0.1.2-alpha.5", + "@deepseek-ai/dsh-session": "0.1.2-alpha.5", + "@deepseek-ai/dsh-session-turn-outline": "0.1.2-alpha.5", + "@deepseek-ai/dsh-settings": "0.1.2-alpha.5", + "@deepseek-ai/dsh-fs": "0.1.2-alpha.5", + "@deepseek-ai/dsh-home-paths": "0.1.2-alpha.5", + "@deepseek-ai/dsh-invariants": "0.1.2-alpha.5", + "@deepseek-ai/dsh-skill": "0.1.2-alpha.5", + "@deepseek-ai/dsh-skill-filesystem": "0.1.2-alpha.5", + "@deepseek-ai/dsh-subprocess": "0.1.2-alpha.5", + "@deepseek-ai/dsh-system-prompt": "0.1.2-alpha.5", + "@deepseek-ai/dsh-timeout": "0.1.2-alpha.5", + "@deepseek-ai/dsh-tools": "0.1.2-alpha.5", + "@deepseek-ai/dsh-typert-protocol": "0.1.2-alpha.5", + "@deepseek-ai/dsh-user-approval": "0.1.2-alpha.5", + "@deepseek-ai/dsh-client-connection": "0.1.2-alpha.5", + "@deepseek-ai/dsh-client-locale": "0.1.2-alpha.5", + "@deepseek-ai/dsh-client-store": "0.1.2-alpha.5", + "@deepseek-ai/dsh-client-ui-renderer": "0.1.2-alpha.5", + "@deepseek-ai/dsh-client-ui-primitives": "0.1.2-alpha.5", + "@deepseek-ai/dsh-client-ui-settings": "0.1.2-alpha.5", + "@deepseek-ai/dsh-client-ui-settings-plugins": "0.1.2-alpha.5", + "@deepseek-ai/dsh-client-ui-sidebar": "0.1.2-alpha.5", + "@deepseek-ai/dsh-client-ui-layout": "0.1.2-alpha.5", + "@deepseek-ai/dsh-client-ui-slots": "0.1.2-alpha.5", "@tailwindcss/vite": "4.3.3", "@tanstack/react-router": "1.169.2", "@types/node": "22.20.1", diff --git a/packages/mtmharness/src/client/index.test.ts b/packages/mtmharness/src/client/index.test.ts index 3b7433c..273ce67 100644 --- a/packages/mtmharness/src/client/index.test.ts +++ b/packages/mtmharness/src/client/index.test.ts @@ -1,3 +1,4 @@ +import { Context } from "@deepseek-ai/cordis"; import { describe, expect, it } from "vitest"; import { apply as applyHost } from "../index.ts"; import { apply, inject } from "./index.ts"; @@ -144,7 +145,23 @@ describe("mtmharness Host half", () => { describe("mtmharness browser half", () => { it("declares the combined service dependencies", () => { - expect(inject).toEqual(["slots", "locale", "settingsScope"]); + expect(inject).toEqual(["slots", "locale", "settingsScope", "connection"]); + }); + + it("waits for connection before the direct client entry runs", async () => { + const root = new Context(); + for (const service of ["slots", "locale", "settingsScope"]) root.provide(service, {}); + let seen: unknown; + const consumer = { + inject, + apply(ctx: { get(name: string): unknown }) { seen = ctx.get("connection"); }, + }; + const provider = { + apply(ctx: { provide(name: string, value: unknown): void }) { ctx.provide("connection", {}); }, + }; + const [consumerFiber, providerFiber] = await Promise.all([root.plugin(consumer), root.plugin(provider)]); + expect(seen).toBeDefined(); + await Promise.all([consumerFiber.dispose(), providerFiber.dispose()]); }); it("only exposes update actions for loopback connections", () => { diff --git a/packages/mtmharness/src/client/index.ts b/packages/mtmharness/src/client/index.ts index d58988f..b1ce7e1 100644 --- a/packages/mtmharness/src/client/index.ts +++ b/packages/mtmharness/src/client/index.ts @@ -9,7 +9,7 @@ import { apply as applyMtmConnect } from "../features/mtm-connect/client/index.t import { apply as applySecondary } from "../features/secondary/client.ts"; export { applyCoding }; -export const inject = ["slots", "locale", "settingsScope"]; +export const inject = ["slots", "locale", "settingsScope", "connection"]; /** Register coding and secondary features under one plugin-owned lifecycle. */ export function apply(ctx: ClientContext): void { diff --git a/packages/mtmharness/src/features/coding/client/locales.ts b/packages/mtmharness/src/features/coding/client/locales.ts index 9dbcf1f..0e68811 100644 --- a/packages/mtmharness/src/features/coding/client/locales.ts +++ b/packages/mtmharness/src/features/coding/client/locales.ts @@ -68,11 +68,11 @@ export const en: Record = { ponytailSubagents: "Apply Ponytail to subagents", ponytailSubagentsHint: "Carry the coding rules into child agents.", rtkMode: "RTK mode", - rtkModeHint: "Rewrite transparently when supported; otherwise use inline guidance.", + rtkModeHint: "Use guidance for explicit RTK commands; transparent rewrite is unavailable with the current DSH tool contract.", rtkModeOff: "Off", rtkModeGuidance: "Guidance", - rtkModeAuto: "Automatic fallback", - rtkModeRewrite: "Transparent rewrite", + rtkModeAuto: "Guidance (default)", + rtkModeRewrite: "Unavailable rewrite", modeOff: "Off", modeLite: "Lite", modeFull: "Full", @@ -120,11 +120,11 @@ export const zh: Record = { ponytailSubagents: "对子 agent 启用 Ponytail", ponytailSubagentsHint: "将编程规则传递给子 agent。", rtkMode: "RTK 模式", - rtkModeHint: "在支持时透明重写;否则使用内联指导。", + rtkModeHint: "使用指导显式调用 RTK;当前 DSH 工具契约不支持透明重写。", rtkModeOff: "关闭", rtkModeGuidance: "指导", - rtkModeAuto: "自动降级", - rtkModeRewrite: "透明重写", + rtkModeAuto: "指导(默认)", + rtkModeRewrite: "透明重写(不可用)", modeOff: "关闭", modeLite: "精简", modeFull: "完整", diff --git a/packages/mtmharness/src/features/coding/codebase-memory.ts b/packages/mtmharness/src/features/coding/codebase-memory.ts index e5d9aac..897893c 100644 --- a/packages/mtmharness/src/features/coding/codebase-memory.ts +++ b/packages/mtmharness/src/features/coding/codebase-memory.ts @@ -24,6 +24,7 @@ const DEFAULT_TOOL_TIMEOUT_MS = 60_000; const DEFAULT_HOOK_TIMEOUT_MS = 2_000; const MAX_HOOK_TIMEOUT_MS = 10_000; const MAX_TOOL_TIMEOUT_MS = 2_147_483_647; +const MAX_TIMER_DELAY_MS = 2_147_483_647; export interface Config { serverName?: string; @@ -42,9 +43,9 @@ export interface Config { const Reconnect = z.object({ enabled: z.boolean().default(true), - initialDelayMs: z.number().default(500), - maxDelayMs: z.number().default(30_000), - maxAttempts: z.number().default(10), + initialDelayMs: z.number().min(1).max(MAX_TIMER_DELAY_MS).default(500), + maxDelayMs: z.number().min(1).max(MAX_TIMER_DELAY_MS).default(30_000), + maxAttempts: z.number().step(1).min(1).max(Number.MAX_SAFE_INTEGER).default(10), }); export const Config: z = z.object({ @@ -92,6 +93,24 @@ export function resolveConfig(config: Config = {}): ResolvedConfig { || Object.entries(env).some(([key, value]) => key.length === 0 || typeof value !== "string")) { throw new Error("mtm-coding: env must be a string map"); } + const reconnect = config.reconnect === undefined ? undefined : (() => { + const initialDelayMs = config.reconnect.initialDelayMs ?? 500; + const maxDelayMs = config.reconnect.maxDelayMs ?? 30_000; + const maxAttempts = config.reconnect.maxAttempts ?? 10; + if (!Number.isFinite(initialDelayMs) || initialDelayMs < 1 || initialDelayMs > MAX_TIMER_DELAY_MS) { + throw new Error("mtm-coding: reconnect.initialDelayMs must be a positive finite number no greater than " + MAX_TIMER_DELAY_MS); + } + if (!Number.isFinite(maxDelayMs) || maxDelayMs < 1 || maxDelayMs > MAX_TIMER_DELAY_MS) { + throw new Error("mtm-coding: reconnect.maxDelayMs must be a positive finite number no greater than " + MAX_TIMER_DELAY_MS); + } + if (initialDelayMs > maxDelayMs) { + throw new Error("mtm-coding: reconnect.initialDelayMs must be less than or equal to maxDelayMs"); + } + if (!Number.isInteger(maxAttempts) || maxAttempts < 1 || maxAttempts > Number.MAX_SAFE_INTEGER) { + throw new Error("mtm-coding: reconnect.maxAttempts must be a positive integer"); + } + return { ...config.reconnect, initialDelayMs, maxDelayMs, maxAttempts }; + })(); const timeout = ( label: string, value: number | undefined, @@ -120,7 +139,7 @@ export function resolveConfig(config: Config = {}): ResolvedConfig { ), augmentHooks: config.augmentHooks ?? true, failOnStartupError: config.failOnStartupError ?? false, - reconnect: config.reconnect, + reconnect, }; } @@ -276,17 +295,27 @@ export async function apply(ctx: Context, rawConfig: Config = {}): Promise const lifecycleAbort = new AbortController(); const lifecycleStates = new WeakMap(); const pendingToolHooks = new Map>(); - ctx.effect(() => () => { + const pendingHookRuns = new Set>(); + const trackHook = (promise: Promise): Promise => { + pendingHookRuns.add(promise); + void promise.finally(() => { pendingHookRuns.delete(promise); }).catch(() => {}); + return promise; + }; + const hookSignal = (signal?: AbortSignal): AbortSignal => signal === undefined + ? lifecycleAbort.signal + : AbortSignal.any([lifecycleAbort.signal, signal]); + ctx.effect(() => async () => { lifecycleAbort.abort(new Error("mtm-coding disposed")); pendingToolHooks.clear(); + await Promise.allSettled([...pendingHookRuns]); }, "mtm-coding.lifecycle"); const startHook = (event: HookEvent, signal?: AbortSignal): Promise => - runHookAugment(ctx, command, event.cwd, hookEnv, event.payload, config.hookTimeoutMs, signal) + trackHook(runHookAugment(ctx, command, event.cwd, hookEnv, event.payload, config.hookTimeoutMs, hookSignal(signal)) .catch((error: unknown) => { ctx.logger.debug("mtm-coding hook augmentation skipped: " + String(error)); return undefined; - }); + })); ctx.on("agent/session-start", ({ agent }) => { if (!config.augmentHooks) return; diff --git a/packages/mtmharness/src/features/coding/index.ts b/packages/mtmharness/src/features/coding/index.ts index 8871878..48ba39d 100644 --- a/packages/mtmharness/src/features/coding/index.ts +++ b/packages/mtmharness/src/features/coding/index.ts @@ -39,7 +39,9 @@ const CodebaseMemoryFeature = { const ModernGoFeature = { name: "mtm-coding-modern-go", inject: ["skills"], - apply: (ctx: Context) => applyManifestPackage(ctx, MTM_CODING_PACKAGES.modernGo), + apply: async (ctx: Context): Promise => { + await applyManifestPackage(ctx, MTM_CODING_PACKAGES.modernGo); + }, }; const PonytailFeature = { @@ -115,50 +117,74 @@ export async function apply(ctx: Context, rawConfig: MtmCodingConfig = {}): Prom const nextPonytailKey = ponytailKey(next); const nextRtkKey = rtkKey(next); - if (nextCodebaseKey !== activeCodebaseKey) { + if (nextCodebaseKey !== activeCodebaseKey || (next.codebaseMemoryEnabled && codebaseMemoryFiber === undefined)) { await dispose(codebaseMemoryFiber); codebaseMemoryFiber = undefined; activeCodebaseKey = ""; if (next.codebaseMemoryEnabled) { - codebaseMemoryFiber = await ctx.plugin( - CodebaseMemoryFeature, - codebaseMemoryConfig(next) as CodebaseMemoryConfig, - ); + try { + codebaseMemoryFiber = await ctx.plugin( + CodebaseMemoryFeature, + codebaseMemoryConfig(next) as CodebaseMemoryConfig, + ); + activeCodebaseKey = nextCodebaseKey; + } catch (error) { + ctx.logger.warn("mtm-coding: Codebase Memory is unavailable: " + String(error)); + } + } else { + activeCodebaseKey = nextCodebaseKey; } - activeCodebaseKey = nextCodebaseKey; } - if (nextModernGoKey !== activeModernGoKey) { + if (nextModernGoKey !== activeModernGoKey || (next.modernGoEnabled && modernGoFiber === undefined)) { await dispose(modernGoFiber); modernGoFiber = undefined; activeModernGoKey = ""; if (next.modernGoEnabled) { - modernGoFiber = await ctx.plugin(ModernGoFeature); + try { + modernGoFiber = await ctx.plugin(ModernGoFeature); + activeModernGoKey = nextModernGoKey; + } catch (error) { + ctx.logger.warn("mtm-coding: Modern Go is unavailable: " + String(error)); + } + } else { + activeModernGoKey = nextModernGoKey; } - activeModernGoKey = nextModernGoKey; } - if (nextPonytailKey !== activePonytailKey) { + if (nextPonytailKey !== activePonytailKey || (next.ponytailEnabled && ponytailFiber === undefined)) { await dispose(ponytailFiber); ponytailFiber = undefined; activePonytailKey = ""; if (next.ponytailEnabled) { - ponytailFiber = await ctx.plugin(PonytailFeature, { - mode: next.ponytailMode, - applyToSubagents: next.ponytailSubagents, - }); + try { + ponytailFiber = await ctx.plugin(PonytailFeature, { + mode: next.ponytailMode, + applyToSubagents: next.ponytailSubagents, + }); + activePonytailKey = nextPonytailKey; + } catch (error) { + ctx.logger.warn("mtm-coding: Ponytail is unavailable: " + String(error)); + } + } else { + activePonytailKey = nextPonytailKey; } - activePonytailKey = nextPonytailKey; } - if (nextRtkKey !== activeRtkKey) { + if (nextRtkKey !== activeRtkKey || (next.rtkMode !== "off" && rtkFiber === undefined)) { await dispose(rtkFiber); rtkFiber = undefined; activeRtkKey = ""; if (next.rtkMode !== "off" && typeof ctx.plugin === "function") { - rtkFiber = await ctx.plugin(RtkFeature, { mode: next.rtkMode }); + try { + rtkFiber = await ctx.plugin(RtkFeature, { mode: next.rtkMode }); + activeRtkKey = nextRtkKey; + } catch (error) { + ctx.logger.warn("mtm-coding: RTK is unavailable: " + String(error)); + } + } else { + activeRtkKey = nextRtkKey; } - activeRtkKey = nextRtkKey; } }; @@ -174,19 +200,12 @@ export async function apply(ctx: Context, rawConfig: MtmCodingConfig = {}): Prom if (stopped) return; return queueReconcile(); }); - await queueReconcile(); ctx.effect(() => async () => { stopped = true; stopWatching(); await reconciling; - await dispose(rtkFiber); - await dispose(modernGoFiber); - await dispose(ponytailFiber); - await dispose(codebaseMemoryFiber); - rtkFiber = undefined; - modernGoFiber = undefined; - ponytailFiber = undefined; - codebaseMemoryFiber = undefined; }, "mtm-coding.lifecycle"); + + await queueReconcile(); } diff --git a/packages/mtmharness/src/features/coding/manifest.ts b/packages/mtmharness/src/features/coding/manifest.ts index be5b42e..11bbfb9 100644 --- a/packages/mtmharness/src/features/coding/manifest.ts +++ b/packages/mtmharness/src/features/coding/manifest.ts @@ -5,7 +5,9 @@ import packageCatalog from "./packages.json" with { type: "json" }; export type MtmCodingPackageKind = "data-only" | "runtime-backed"; export interface MtmCodingSkillFile { + /** Owning skill name; resource entries may repeat this name. */ readonly name: string; + /** Pinned repository path; the path below the owning skill is preserved locally. */ readonly path: string; readonly sha256: string; } @@ -45,6 +47,15 @@ function isRecord(value: unknown): value is Record { return value !== null && typeof value === "object" && !Array.isArray(value); } +function skillRelativeParts(name: string, path: string): string[] | undefined { + const pathParts = path.split("/"); + if (!pathParts.every((part) => PATH_PART.test(part) && part !== "." && part !== "..")) return undefined; + const skillIndex = pathParts.lastIndexOf(name); + if (skillIndex < 0 || skillIndex === pathParts.length - 1) return undefined; + const relative = pathParts.slice(skillIndex + 1); + return relative.every((part) => PATH_PART.test(part) && part !== "." && part !== "..") ? relative : undefined; +} + function assertSkillSource(value: unknown, label: string): asserts value is MtmCodingSkillSource { if (!isRecord(value) || typeof value.repository !== "string" || typeof value.revision !== "string" || !Array.isArray(value.files)) { throw new Error("mtm-coding: invalid skill source metadata for " + label); @@ -60,15 +71,26 @@ function assertSkillSource(value: unknown, label: string): asserts value is MtmC throw new Error("mtm-coding: invalid pinned skill source for " + label); } const names = new Set(); + const documents = new Set(); + const localPaths = new Set(); for (const file of value.files) { if (!isRecord(file) || typeof file.name !== "string" || typeof file.path !== "string" || typeof file.sha256 !== "string") { throw new Error("mtm-coding: invalid skill file metadata for " + label); } - const pathParts = file.path.split("/"); - if (!ID.test(file.name) || names.has(file.name) || !SHA256.test(file.sha256) || pathParts.at(-1) !== "SKILL.md" || pathParts.some((part) => !PATH_PART.test(part) || part === "." || part === "..")) { + const relative = skillRelativeParts(file.name, file.path); + const localPath = relative === undefined ? undefined : file.name + "/" + relative.join("/"); + if (!ID.test(file.name) || !SHA256.test(file.sha256) || relative === undefined || localPath === undefined || localPaths.has(localPath)) { throw new Error("mtm-coding: invalid skill file metadata for " + label); } names.add(file.name); + localPaths.add(localPath); + if (relative.length === 1 && relative[0] === "SKILL.md") { + if (documents.has(file.name)) throw new Error("mtm-coding: duplicate skill document metadata for " + label); + documents.add(file.name); + } + } + for (const name of names) { + if (!documents.has(name)) throw new Error("mtm-coding: skill source has no SKILL.md for " + name); } } @@ -95,14 +117,17 @@ assertCatalog(packageCatalog); export const MTM_CODING_PACKAGES: MtmCodingPackageCatalog = packageCatalog; /** Install and mount one package's external skills, then its static prompt. */ -export async function applyManifestPackage(ctx: Context, packageManifest: MtmCodingPackageManifest): Promise { +export async function applyManifestPackage(ctx: Context, packageManifest: MtmCodingPackageManifest): Promise { if (packageManifest.skills !== undefined) { + const lifecycle = new AbortController(); + ctx.effect(() => () => { lifecycle.abort(new Error("mtm-coding skill package disposed")); }, "mtm-coding:" + packageManifest.id + ":skill-install"); try { - const root = await ensureSkillPackage(packageManifest as MtmCodingPackageManifest & { readonly skills: MtmCodingSkillSource }); + const root = await ensureSkillPackage(packageManifest as MtmCodingPackageManifest & { readonly skills: MtmCodingSkillSource }, { signal: lifecycle.signal }); + if (lifecycle.signal.aborted) throw lifecycle.signal.reason ?? new Error("mtm-coding skill package disposed"); applyFileSkills(ctx, "mtm-coding-" + packageManifest.id, root); } catch (error) { ctx.logger.warn("mtm-coding: " + packageManifest.label + " skills are unavailable: " + String(error)); - return false; + throw error; } } if (packageManifest.prompt !== undefined) { @@ -112,5 +137,4 @@ export async function applyManifestPackage(ctx: Context, packageManifest: MtmCod text: packageManifest.prompt.text, }); } - return true; } diff --git a/packages/mtmharness/src/features/coding/packages.json b/packages/mtmharness/src/features/coding/packages.json index 875a9eb..6c6b559 100644 --- a/packages/mtmharness/src/features/coding/packages.json +++ b/packages/mtmharness/src/features/coding/packages.json @@ -20,6 +20,21 @@ "name": "use-modern-go", "path": "plugin/skills/use-modern-go/SKILL.md", "sha256": "333346bebb212d7acded062cdeb1f5a01e421ebdab976c4c4fcb02cca31508f7" + }, + { + "name": "use-modern-go", + "path": "plugin/skills/use-modern-go/scripts/VERSION", + "sha256": "d0b4f9120ba026c00fa23cb84b4e1620a2e6436592e58155a5151653179572c0" + }, + { + "name": "use-modern-go", + "path": "plugin/skills/use-modern-go/scripts/run-tool.ps1", + "sha256": "7bd7bd8c8394e9cdbd290251b143e54639e527d52a1099135f1ba91edb5a677b" + }, + { + "name": "use-modern-go", + "path": "plugin/skills/use-modern-go/scripts/run-tool.sh", + "sha256": "a593b2484834fc7d068e7cbe1a09f92b149ed61b9a07556ea50790d95f50a25b" } ] } diff --git a/packages/mtmharness/src/features/coding/ponytail.ts b/packages/mtmharness/src/features/coding/ponytail.ts index 2c867e6..918647b 100644 --- a/packages/mtmharness/src/features/coding/ponytail.ts +++ b/packages/mtmharness/src/features/coding/ponytail.ts @@ -1,7 +1,7 @@ import type { Context } from "@deepseek-ai/cordis"; import type { Agent } from "@deepseek-ai/dsh-agent"; import type { AssembleContext } from "@deepseek-ai/dsh-system-prompt"; -import type { SkillDefinition } from "@deepseek-ai/dsh-skill"; +import { isModelInvocable, type SkillDefinition } from "@deepseek-ai/dsh-skill"; import type { CommandResult } from "@deepseek-ai/dsh-commands"; import { applyManifestPackage, MTM_CODING_PACKAGES } from "./manifest.js"; import type { PonytailMode } from "./types.js"; @@ -41,7 +41,8 @@ function modeForAgent(states: WeakMap, agent: Agent | undef async function loadCoreSkill(ctx: Context): Promise { try { - return await ctx.skills.get("ponytail"); + const skill = await ctx.skills.get("ponytail"); + return skill !== undefined && isModelInvocable(skill) ? skill : undefined; } catch (error) { ctx.logger.warn("mtm-coding: Ponytail skill document unavailable: " + String(error)); return undefined; @@ -57,7 +58,7 @@ export async function apply(ctx: Context, config: { mode?: PonytailMode; applyToSubagents?: boolean; } = {}): Promise { - if (!await applyManifestPackage(ctx, MTM_CODING_PACKAGES.ponytail)) return; + await applyManifestPackage(ctx, MTM_CODING_PACKAGES.ponytail); const defaultMode = normalizeMode(config.mode); const applyToSubagents = config.applyToSubagents ?? true; const states = new WeakMap(); @@ -68,8 +69,9 @@ export async function apply(ctx: Context, config: { ctx.on("skills/change", () => { refreshing = refreshing.then(async () => { const next = await loadCoreSkill(ctx); - if (active && next !== undefined) coreSkill = next; + if (active) coreSkill = next; }); + return refreshing; }); ctx.effect(() => async () => { active = false; diff --git a/packages/mtmharness/src/features/coding/rtk.ts b/packages/mtmharness/src/features/coding/rtk.ts index 4569771..0e9d0cb 100644 --- a/packages/mtmharness/src/features/coding/rtk.ts +++ b/packages/mtmharness/src/features/coding/rtk.ts @@ -1,62 +1,21 @@ import type { Context } from "@deepseek-ai/cordis"; -import type { Agent } from "@deepseek-ai/dsh-agent"; import { createUserMessage } from "@deepseek-ai/dsh-llm"; import type { AssembleContext } from "@deepseek-ai/dsh-system-prompt"; import type { CommandResult } from "@deepseek-ai/dsh-commands"; -import type {} from "@deepseek-ai/dsh-tools"; import { applyManifestPackage, MTM_CODING_PACKAGES } from "./manifest.js"; -import { resolveWorkingDirectory } from "./runtime.js"; -import { bashInput, ensureRtk, rewriteRtk, shouldRewriteRtk } from "./rtk-runtime.js"; import type { RtkMode } from "./types.js"; export const name = "mtm-coding-rtk"; export const inject = ["systemPrompt", "commands"]; -export type RtkStatus = "disabled" | "guidance" | "rewrite" | "unavailable"; - -type RecordCandidate = { - readonly name: string; - readonly arguments: unknown; - readonly agent?: Agent; - readonly signal: AbortSignal; -}; - -type RecordDecision = - | { readonly kind: "unchanged" } - | { readonly kind: "rewrite"; readonly arguments: unknown }; - -type RecordListener = (candidate: RecordCandidate, next: () => Promise) => Promise; -type RtkContext = Context & { - readonly get?: (key: string) => unknown; - readonly tools?: { readonly resolveRecordInput?: unknown; readonly get?: (name: string, agent?: Agent) => unknown }; - readonly subprocess?: unknown; -}; +export type RtkStatus = "disabled" | "guidance" | "unavailable"; const pluginSource = { kind: "plugin" as const, plugin: name }; -function service(ctx: Context, key: string): unknown { - const candidate = ctx as RtkContext; - return typeof candidate.get === "function" ? candidate.get(key) : candidate[key as "tools" | "subprocess"]; -} - -function hasPreRecordCapability(ctx: Context): boolean { - return typeof (service(ctx, "tools") as RtkContext["tools"] | undefined)?.resolveRecordInput === "function"; -} - -function hasSubprocessCapability(ctx: Context): boolean { - return service(ctx, "subprocess") !== undefined; -} - -function hasBashTool(ctx: Context, agent?: Agent): boolean { - const tools = service(ctx, "tools") as RtkContext["tools"] | undefined; - return typeof tools?.get === "function" && tools.get("bash", agent) !== undefined; -} - function statusText(status: RtkStatus): string { switch (status) { - case "guidance": return "RTK guidance is active; explicit rtk-prefixed Bash commands are available."; - case "rewrite": return "RTK transparent rewrite is active for Bash tool calls; DSH policy still decides the effective call."; - case "unavailable": return "RTK transparent rewrite is unavailable in this DSH runtime; explicit rtk-prefixed Bash commands remain available."; + case "guidance": return "RTK guidance is active; use an explicitly invoked RTK command when the executable is available."; + case "unavailable": return "RTK transparent rewrite is unavailable in this DSH runtime; tool arguments remain unchanged."; case "disabled": return "RTK is disabled."; } } @@ -79,16 +38,12 @@ function prompt(status: RtkStatus): string { ].join("\n"); } -/** Mount RTK guidance and, when supported, the pre-record rewrite listener. */ +/** Mount RTK guidance using the current DSH ToolRuntime contract. */ export async function apply(ctx: Context, config: { mode?: RtkMode } = {}): Promise { const requested = config.mode ?? "auto"; if (requested === "off") return; await applyManifestPackage(ctx, MTM_CODING_PACKAGES.rtk); - const transparentCapability = hasPreRecordCapability(ctx) && hasSubprocessCapability(ctx); - const transparent = (requested === "auto" || requested === "rewrite") && transparentCapability; - const status: RtkStatus = requested === "rewrite" - ? (transparent ? "rewrite" : "unavailable") - : transparent ? "rewrite" : "guidance"; + const status: RtkStatus = requested === "rewrite" ? "unavailable" : "guidance"; ctx.systemPrompt.section({ name: "mtm-coding:rtk:status", order: 109.1, @@ -105,34 +60,4 @@ export async function apply(ctx: Context, config: { mode?: RtkMode } = {}): Prom ctx.on("agent/session-start", ({ agent }) => { agent.inject(notice(status)); }); - if (!transparent) return; - - const resolveRuntime = (input: { cwd?: string; signal?: AbortSignal }): Promise<{ command: string; home: string; env: Record }> => - ensureRtk(ctx, { cwd: input.cwd, signal: input.signal }); - const register = ctx.on as unknown as (event: string, listener: RecordListener) => unknown; - register("tools/pre-record-input", async (candidate, next) => { - const downstream = await next(); - if (candidate.name !== "bash" || downstream.kind !== "unchanged") return downstream; - const input = bashInput(candidate.arguments); - if (input === undefined || !hasBashTool(ctx, candidate.agent) || !shouldRewriteRtk(input.command)) return downstream; - try { - const cwd = resolveWorkingDirectory(input.cwd, candidate.agent?.session.header.cwd); - const runtimeInfo = await resolveRuntime({ cwd, signal: candidate.signal }); - const rewritten = await rewriteRtk( - ctx, - runtimeInfo.command, - input.command, - cwd, - runtimeInfo.env, - candidate.signal, - ); - if (rewritten === undefined) return downstream; - return { kind: "rewrite", arguments: { ...(candidate.arguments as Record), command: rewritten.command } }; - } catch (error) { - candidate.signal.throwIfAborted(); - // Availability is capability state; one failed rewrite remains fail-open and retryable. - ctx.logger.warn("mtm-coding RTK rewrite failed; original command retained: " + String(error)); - return downstream; - } - }); } diff --git a/packages/mtmharness/src/features/coding/types.ts b/packages/mtmharness/src/features/coding/types.ts index 917b594..2123571 100644 --- a/packages/mtmharness/src/features/coding/types.ts +++ b/packages/mtmharness/src/features/coding/types.ts @@ -28,11 +28,13 @@ export interface MtmCodingSettings { export type MtmCodingConfig = Partial; +const MAX_TIMER_DELAY_MS = 2_147_483_647; + const Reconnect = z.object({ enabled: z.boolean().default(true), - initialDelayMs: z.number().default(500), - maxDelayMs: z.number().default(30_000), - maxAttempts: z.number().default(10), + initialDelayMs: z.number().min(1).max(MAX_TIMER_DELAY_MS).default(500), + maxDelayMs: z.number().min(1).max(MAX_TIMER_DELAY_MS).default(30_000), + maxAttempts: z.number().step(1).min(1).max(Number.MAX_SAFE_INTEGER).default(10), }); export const MtmCodingSettingsSchema: z = z.object({ diff --git a/packages/mtmharness/src/features/mtm-connect/client/index.tsx b/packages/mtmharness/src/features/mtm-connect/client/index.tsx index c14b2ca..7fc2cf8 100644 --- a/packages/mtmharness/src/features/mtm-connect/client/index.tsx +++ b/packages/mtmharness/src/features/mtm-connect/client/index.tsx @@ -24,6 +24,7 @@ export function apply(ctx: ClientContext): void { const settings = ctx.settingsScope.bind({ namespace: SETTINGS_NAMESPACE }); const runtime = new MtmSecondaryClientRuntime({ document: typeof document === "undefined" ? undefined : document }, MTM_CONNECT_EXTENSION); const controller = new MtmConnectCardController(settings, runtime); + ctx.effect(() => async () => { await controller.dispose(); }, "mtm-connect: client lifecycle"); const t = ctx.locale.bind("mtm.connect"); ctx.effect(() => ctx.locale.register("mtm.connect", { en, zh }), "mtm-connect: locale"); ctx.slots.inject("settings.plugin.item", () => ctx.slots.register({ @@ -32,5 +33,4 @@ export function apply(ctx: ClientContext): void { locale: "mtm.connect", inject: () => controller.inject(), }, (props) => )); - ctx.effect(() => async () => { await controller.dispose(); }, "mtm-connect: client lifecycle"); } diff --git a/packages/mtmharness/src/features/secondary/client.test.ts b/packages/mtmharness/src/features/secondary/client.test.ts index 88bc8c9..9bf3c36 100644 --- a/packages/mtmharness/src/features/secondary/client.test.ts +++ b/packages/mtmharness/src/features/secondary/client.test.ts @@ -165,6 +165,9 @@ describe("secondary extension lifecycle", () => { await state.runtime.setEnabled(false); expect(state.runtime.getSnapshot()).toEqual({ desired: false, status: "disabled" }); expect(state.cleanup).toHaveBeenCalledTimes(2); + await state.runtime.setEnabled(true); + expect(state.runtime.getSnapshot()).toEqual({ desired: true, status: "enabled" }); + await state.runtime.dispose(); }); it("replays show requested while loading after mount", async () => { diff --git a/packages/mtmharness/src/features/secondary/client.ts b/packages/mtmharness/src/features/secondary/client.ts index 2801a4e..b0aeb90 100644 --- a/packages/mtmharness/src/features/secondary/client.ts +++ b/packages/mtmharness/src/features/secondary/client.ts @@ -199,6 +199,14 @@ export class MtmSecondaryClientRuntime { } return; } + if (this.root === undefined && this.cleanup !== undefined) { + try { + await this.unload(); + } catch (error) { + this.publish({ desired: true, status: "failed", error: errorText(error) }); + return; + } + } if (this.root !== undefined) return; try { await this.load(); @@ -287,15 +295,19 @@ export class MtmSecondaryClientRuntime { private async unload(): Promise { const cleanup = this.cleanup; const root = this.root; + let cleaned = cleanup === undefined; try { - if (cleanup !== undefined) await cleanup(); + if (cleanup !== undefined) { + await cleanup(); + cleaned = true; + } } finally { root?.remove(); + this.root = undefined; this.pendingShow = false; this.pendingFocusSelector = undefined; + if (cleaned) this.cleanup = undefined; } - this.cleanup = undefined; - this.root = undefined; } private publish(next: MtmSecondarySnapshot): void { diff --git a/packages/mtmharness/src/features/update/index.test.ts b/packages/mtmharness/src/features/update/index.test.ts index e3fbf61..7d319ef 100644 --- a/packages/mtmharness/src/features/update/index.test.ts +++ b/packages/mtmharness/src/features/update/index.test.ts @@ -33,6 +33,7 @@ interface FakeOptions { readonly updateVersion?: string; readonly updateDelayMs?: number; readonly missingPnpm?: boolean; + readonly onUpdateStart?: () => void; } function fakeContext(profileDir: string, options: FakeOptions = {}) { @@ -52,7 +53,10 @@ function fakeContext(profileDir: string, options: FakeOptions = {}) { active += 1; maxActive = Math.max(maxActive, active); const isView = spec.argv.includes("view"); - if (!isView) updateCount += 1; + if (!isView) { + updateCount += 1; + options.onUpdateStart?.(); + } const output = isView ? options.latestOutput ?? "\"0.6.0\"\n" : ""; const exitCode = isView ? options.latestExitCode ?? 0 : options.updateExitCode ?? 0; const delay = isView ? 0 : options.updateDelayMs ?? 0; @@ -176,6 +180,20 @@ describe("mtm-update Host", () => { expect(failedResult).toMatchObject({ status: "failed", currentVersion: "0.5.5", latestVersion: "0.6.0", restartRequired: false }); }); + it("drains and cancels requests when the RPC owner is disposed", async () => { + const profileDir = profile(); + let resolveUpdateStarted!: () => void; + const updateStarted = new Promise((resolve) => { resolveUpdateStarted = resolve; }); + const state = fakeContext(profileDir, { updateDelayMs: 20, onUpdateStart: resolveUpdateStarted }); + const handler = createMtmUpdateRpcHandler(state.ctx as never); + const pending = handler("request", { args: { kind: "update" } }, new AbortController().signal); + await updateStarted; + expect(state.stats().updateCount).toBe(1); + await handler.dispose(); + expect(responseValue(await pending)).toMatchObject({ status: "failed", error: "mtm-update: operation cancelled" }); + expect(state.stats().updateCount).toBe(1); + }); + it("rejects malformed installed manifests and serializes concurrent updates", async () => { const malformedDir = profile(); writeFileSync(join(malformedDir, "node_modules", "mtmharness", "package.json"), "not json"); diff --git a/packages/mtmharness/src/features/update/index.ts b/packages/mtmharness/src/features/update/index.ts index ffea86b..2494636 100644 --- a/packages/mtmharness/src/features/update/index.ts +++ b/packages/mtmharness/src/features/update/index.ts @@ -199,9 +199,16 @@ async function update(ctx: Context, signal: AbortSignal, markRestartRequired: () export const name = "mtm-update"; export const inject = ["connection", "subprocess"]; -export function createMtmUpdateRpcHandler(ctx: Context): (endpoint: string, payload: unknown, signal: AbortSignal) => Promise> { +export type MtmUpdateRpcHandler = ((endpoint: string, payload: unknown, signal: AbortSignal) => Promise>) & { + dispose(): Promise; +}; + +export function createMtmUpdateRpcHandler(ctx: Context): MtmUpdateRpcHandler { let restartRequired = false; let tail: Promise = Promise.resolve(); + let disposed = false; + const owner = new AbortController(); + const active = new Set>(); const enqueue = (job: () => Promise): Promise => { const result = tail.then(job, job); @@ -209,24 +216,47 @@ export function createMtmUpdateRpcHandler(ctx: Context): (endpoint: string, payl return result; }; - return async (endpoint, payload, signal) => { - if (endpoint !== "request") return failure(new Error("mtm-update: unknown RPC endpoint")); - try { - const request = parseMtmUpdateRpcRequest((payload as { args?: unknown } | null)?.args); - const value = await enqueue(() => request.kind === "check" - ? check(ctx, signal) - : update(ctx, signal, () => { restartRequired = true; })); - return { ok: true, value: { ...value, restartRequired: value.restartRequired || restartRequired } }; - } catch (error) { - return failure(error); - } - }; + const handler = Object.assign( + async (endpoint: string, payload: unknown, signal: AbortSignal): Promise> => { + if (owner.signal.aborted) return failure(new Error("mtm-update: operation cancelled")); + if (endpoint !== "request") return failure(new Error("mtm-update: unknown RPC endpoint")); + try { + const request = parseMtmUpdateRpcRequest((payload as { args?: unknown } | null)?.args); + const requestSignal = AbortSignal.any([owner.signal, signal]); + const pending = enqueue(() => request.kind === "check" + ? check(ctx, requestSignal) + : update(ctx, requestSignal, () => { restartRequired = true; })); + active.add(pending); + try { + const value = await pending; + return { ok: true, value: { ...value, restartRequired: value.restartRequired || restartRequired } }; + } finally { + active.delete(pending); + } + } catch (error) { + return failure(error); + } + }, + { + async dispose(): Promise { + if (!disposed) { + disposed = true; + owner.abort(new Error("mtm-update disposed")); + } + await Promise.allSettled([...active]); + }, + }, + ); + return handler; } export function apply(ctx: Context): void { const handler = createMtmUpdateRpcHandler(ctx); ctx.effect(() => { const remove = ctx.connection.rpc.handle(MTM_UPDATE_CHANNEL, handler); - return async () => { await remove(); }; + return async () => { + await handler.dispose(); + await remove(); + }; }, "mtm-update: Host RPC"); } diff --git a/packages/mtmharness/src/skill-files.ts b/packages/mtmharness/src/skill-files.ts index c64216c..8cf6f76 100644 --- a/packages/mtmharness/src/skill-files.ts +++ b/packages/mtmharness/src/skill-files.ts @@ -4,12 +4,14 @@ import { dirname, join } from "node:path"; import type { Context } from "@deepseek-ai/cordis"; import { resolveDshHome } from "@deepseek-ai/dsh-home-paths"; import * as SkillFilesystem from "@deepseek-ai/dsh-skill-filesystem"; -import type { MtmCodingPackageManifest, MtmCodingSkillSource } from "./features/coding/manifest.js"; +import { parse as parseYaml } from "yaml"; +import type { MtmCodingPackageManifest, MtmCodingSkillFile, MtmCodingSkillSource } from "./features/coding/manifest.js"; const MAX_SKILL_BYTES = 1_048_576; const SKILL_NAME = /^[a-z0-9]+(?:-[a-z0-9]+)*$/u; const REVISION = /^[0-9a-f]{40}$/u; const SHA256 = /^[0-9a-f]{64}$/u; +const PATH_PART = /^[A-Za-z0-9._-]+$/u; const installing = new Map>(); export type FetchLike = (input: string, init?: RequestInit) => Promise; @@ -38,7 +40,7 @@ function remoteUrl(source: MtmCodingSkillSource, path: string): string { if (repository.protocol !== "https:" || repository.hostname !== "github.com" || repository.port !== "" || repository.username !== "" || repository.password !== "" || repository.search !== "" || repository.hash !== "" || repositoryParts.length !== 2 || repositoryParts.some((part) => !/^[A-Za-z0-9._-]+$/u.test(part))) { throw new Error("mtm-coding: skill repository must be a GitHub HTTPS repository"); } - if (!REVISION.test(source.revision) || pathParts.at(-1) !== "SKILL.md" || pathParts.some((part) => part === "" || part === "." || part === ".." || !/^[A-Za-z0-9._-]+$/u.test(part))) { + if (!REVISION.test(source.revision) || pathParts.some((part) => part === "" || part === "." || part === ".." || !PATH_PART.test(part))) { throw new Error("mtm-coding: invalid pinned skill source"); } return [ @@ -49,7 +51,101 @@ function remoteUrl(source: MtmCodingSkillSource, path: string): string { ].join("/"); } -async function responseBytes(response: Response, url: string): Promise { +interface ValidatedSkillFile { + readonly file: MtmCodingSkillFile; + readonly relative: readonly string[]; + readonly document: boolean; +} + +function validateSkillFiles(source: MtmCodingSkillSource): ValidatedSkillFile[] { + if (source.files.length === 0) throw new Error("mtm-coding: skill package has no files"); + const names = new Set(); + const documents = new Set(); + const localPaths = new Set(); + const files: ValidatedSkillFile[] = []; + for (const file of source.files) { + if (file === null || typeof file !== "object" || typeof file.name !== "string" || typeof file.path !== "string" || typeof file.sha256 !== "string") { + throw new Error("mtm-coding: invalid skill metadata"); + } + const pathParts = file.path.split("/"); + const skillIndex = pathParts.lastIndexOf(file.name); + const relative = skillIndex < 0 ? [] : pathParts.slice(skillIndex + 1); + const document = relative.length === 1 && relative[0] === "SKILL.md"; + const localPath = file.name + "/" + relative.join("/"); + if (!SKILL_NAME.test(file.name) || !SHA256.test(file.sha256) || skillIndex < 0 || relative.length === 0 || relative.some((part) => !PATH_PART.test(part) || part === "." || part === "..") || localPaths.has(localPath)) { + throw new Error("mtm-coding: invalid skill metadata for " + file.name); + } + if (document && documents.has(file.name)) throw new Error("mtm-coding: duplicate skill document metadata for " + file.name); + names.add(file.name); + localPaths.add(localPath); + if (document) documents.add(file.name); + files.push({ file, relative, document }); + } + for (const name of names) { + if (!documents.has(name)) throw new Error("mtm-coding: skill source has no SKILL.md for " + name); + } + return files; +} + +async function existingFile(path: string): Promise { + try { + const entry = await lstat(path); + if (entry.isSymbolicLink() || !entry.isFile()) throw new Error("mtm-coding: skill resource is not a regular file: " + path); + return true; + } catch (error) { + if (errno(error) === "ENOENT") return false; + throw error; + } +} + +async function ensureDirectory(path: string): Promise { + try { + const entry = await lstat(path); + if (entry.isSymbolicLink() || !entry.isDirectory()) throw new Error("mtm-coding: skill resource parent is not a regular directory: " + path); + } catch (error) { + if (errno(error) !== "ENOENT") throw error; + await mkdir(path); + } +} + +async function ensureTargetDirectory(root: string, file: ValidatedSkillFile): Promise { + let directory = join(root, file.file.name); + await ensureDirectory(directory); + for (const part of file.relative.slice(0, -1)) { + directory = join(directory, part); + await ensureDirectory(directory); + } + return join(directory, file.relative.at(-1)!); +} + +async function downloadFile(source: MtmCodingSkillSource, file: MtmCodingSkillFile, fetchImpl: FetchLike, signal?: AbortSignal): Promise { + assertNotAborted(signal); + const url = remoteUrl(source, file.path); + const response = await fetchImpl(url, { redirect: "error", signal: requestSignal(signal) }); + const body = await responseBytes(response, url, signal); + if (createHash("sha256").update(body).digest("hex") !== file.sha256) { + throw new Error("mtm-coding: checksum mismatch for " + file.path); + } + return body; +} + +function validateSkillDocument(file: ValidatedSkillFile, body: Buffer): void { + if (!file.document) return; + const documentName = parseSkillDocumentName(body.toString("utf8")); + if (documentName !== file.file.name) throw new Error("mtm-coding: skill document name mismatch for " + file.file.name); +} + +function assertNotAborted(signal: AbortSignal | undefined): void { + if (signal?.aborted) throw new Error("mtm-coding: skill installation cancelled"); +} + +function requestSignal(signal: AbortSignal | undefined): AbortSignal { + const timeout = AbortSignal.timeout(20_000); + return signal === undefined ? timeout : AbortSignal.any([signal, timeout]); +} + +async function responseBytes(response: Response, url: string, signal?: AbortSignal): Promise { + assertNotAborted(signal); if (!response.ok) throw new Error("mtm-coding: skill download failed with HTTP " + response.status + ": " + url); const declared = Number(response.headers.get("content-length")); if (Number.isFinite(declared) && declared > MAX_SKILL_BYTES) throw new Error("mtm-coding: skill document exceeds the size limit"); @@ -58,6 +154,7 @@ async function responseBytes(response: Response, url: string): Promise { const chunks: Uint8Array[] = []; let total = 0; while (true) { + assertNotAborted(signal); const chunk = await reader.read(); if (chunk.done) break; total += chunk.value.byteLength; @@ -70,34 +167,68 @@ async function responseBytes(response: Response, url: string): Promise { return Buffer.concat(chunks, total); } -async function install(id: string, source: MtmCodingSkillSource, root: string, fetchImpl: FetchLike): Promise { +function parseSkillDocumentName(document: string): string | undefined { + const firstLineEnd = document.indexOf("\n"); + if (firstLineEnd < 0 || document.slice(0, firstLineEnd).replace(/\r$/u, "") !== "---") return undefined; + let lineStart = firstLineEnd + 1; + while (lineStart <= document.length) { + const nextNewline = document.indexOf("\n", lineStart); + const lineEnd = nextNewline < 0 ? document.length : nextNewline; + const line = document.slice(lineStart, lineEnd).replace(/\r$/u, ""); + if (line === "---") { + const parsed = parseYaml(document.slice(firstLineEnd + 1, lineStart)) as unknown; + if (parsed === null || typeof parsed !== "object" || Array.isArray(parsed)) return undefined; + const data = parsed as Record; + const name = data.name; + const description = data.description; + return typeof name === "string" && name.length > 0 + && typeof description === "string" && description.length > 0 + ? name + : undefined; + } + if (nextNewline < 0) return undefined; + lineStart = nextNewline + 1; + } + return undefined; +} + +async function completeExistingPackage(root: string, files: readonly ValidatedSkillFile[], source: MtmCodingSkillSource, fetchImpl: FetchLike, signal?: AbortSignal): Promise { + for (const file of files) { + assertNotAborted(signal); + const target = await ensureTargetDirectory(root, file); + if (await existingFile(target)) continue; + const body = await downloadFile(source, file.file, fetchImpl, signal); + validateSkillDocument(file, body); + assertNotAborted(signal); + try { + await writeFile(target, body, { flag: "wx" }); + } catch (error) { + if (errno(error) !== "EEXIST" || !await existingFile(target)) throw error; + } + } +} + +async function install(id: string, source: MtmCodingSkillSource, root: string, fetchImpl: FetchLike, signal?: AbortSignal): Promise { if (!SKILL_NAME.test(id)) throw new Error("mtm-coding: invalid package id " + id); + const operationSignal = requestSignal(signal); + assertNotAborted(operationSignal); + const files = validateSkillFiles(source); if (await existingDirectory(root)) { - // ponytail: installed roots are user-owned; add an explicit update/reset action before replacing edits. + // Installed roots are user-owned; add only missing pinned bundle files. + await completeExistingPackage(root, files, source, fetchImpl, operationSignal); return root; } const parent = dirname(root); await mkdir(parent, { recursive: true }); let temporary = await mkdtemp(join(parent, "." + id + "-")); try { - const names = new Set(); - if (source.files.length === 0) throw new Error("mtm-coding: skill package has no files"); - for (const file of source.files) { - if (!SKILL_NAME.test(file.name) || names.has(file.name) || !SHA256.test(file.sha256) || file.path.split("/").at(-1) !== "SKILL.md") throw new Error("mtm-coding: invalid skill metadata for " + file.name); - names.add(file.name); - const url = remoteUrl(source, file.path); - const response = await fetchImpl(url, { redirect: "error", signal: AbortSignal.timeout(20_000) }); - const body = await responseBytes(response, url); - if (createHash("sha256").update(body).digest("hex") !== file.sha256) { - throw new Error("mtm-coding: checksum mismatch for " + file.name); - } - const document = body.toString("utf8"); - const frontmatter = /^---\r?\nname:\s*([^\r\n]+)\r?\ndescription:\s*/u.exec(document); - const documentName = frontmatter?.[1].replace(/^['"]|['"]$/gu, "").trim(); - if (documentName !== file.name) throw new Error("mtm-coding: skill document name mismatch for " + file.name); - const directory = join(temporary, file.name); - await mkdir(directory); - await writeFile(join(directory, "SKILL.md"), body, { flag: "wx" }); + for (const file of files) { + assertNotAborted(operationSignal); + const body = await downloadFile(source, file.file, fetchImpl, operationSignal); + validateSkillDocument(file, body); + assertNotAborted(operationSignal); + const target = await ensureTargetDirectory(temporary, file); + await writeFile(target, body, { flag: "wx" }); } await writeFile(join(temporary, ".mtmharness.json"), JSON.stringify({ packageId: id, status: "installed", source }, null, 2) + "\n", { flag: "wx" }); try { @@ -106,6 +237,7 @@ async function install(id: string, source: MtmCodingSkillSource, root: string, f } catch (error) { if (errno(error) !== "EEXIST" && errno(error) !== "ENOTEMPTY") throw error; if (!await existingDirectory(root)) throw error; + await completeExistingPackage(root, files, source, fetchImpl, operationSignal); } return root; } finally { @@ -120,12 +252,12 @@ export function skillPackageRoot(id: string, dshHome = resolveDshHome()): string export async function ensureSkillPackage( packageManifest: MtmCodingPackageManifest & { readonly skills: MtmCodingSkillSource }, - options: { readonly root?: string; readonly fetch?: FetchLike } = {}, + options: { readonly root?: string; readonly fetch?: FetchLike; readonly signal?: AbortSignal } = {}, ): Promise { const root = options.root ?? skillPackageRoot(packageManifest.id); let pending = installing.get(root); if (pending === undefined) { - pending = install(packageManifest.id, packageManifest.skills, root, options.fetch ?? fetch); + pending = install(packageManifest.id, packageManifest.skills, root, options.fetch ?? fetch, options.signal); installing.set(root, pending); pending.finally(() => { if (installing.get(root) === pending) installing.delete(root); }).catch(() => {}); } diff --git a/packages/mtmharness/tests/coding-plugin.test.mjs b/packages/mtmharness/tests/coding-plugin.test.mjs index eb37759..a4be0e3 100644 --- a/packages/mtmharness/tests/coding-plugin.test.mjs +++ b/packages/mtmharness/tests/coding-plugin.test.mjs @@ -8,6 +8,7 @@ import { applyCodebaseMemory, applyPonytail, applyRtk, + resolveConfig, MTM_CODING_PACKAGES, name, } from "../lib/index.js"; @@ -50,6 +51,9 @@ function manifestSkillNames() { } writeSkill(join(managedSkillsRoot, "modern-go"), "use-modern-go", "Modern Go test guidance.", "Run go run github.com/JetBrains/go-modern-guidelines@v0.1.1 list --file-path."); +const modernGoScripts = join(managedSkillsRoot, "modern-go", "use-modern-go", "scripts"); +mkdirSync(modernGoScripts, { recursive: true }); +for (const name of ["VERSION", "run-tool.ps1", "run-tool.sh"]) writeFileSync(join(modernGoScripts, name), "pinned resource fixture\n"); for (const name of ["ponytail", "ponytail-review", "ponytail-audit", "ponytail-debt", "ponytail-gain", "ponytail-help"]) { writeSkill(join(managedSkillsRoot, "ponytail"), name, "Ponytail test guidance.", "Ponytail skill body."); } @@ -141,7 +145,8 @@ function createContext(settingsValue = {}) { const previous = currentFiber; currentFiber = fiber; try { - await plugin.apply(context, config); + const result = await plugin.apply(context, config); + if (result !== undefined && typeof result !== "function") throw new TypeError("Invalid effect"); } finally { currentFiber = previous; } @@ -275,6 +280,13 @@ test("Codebase Memory mounts the official MCP client and graph guidance", async assert.match(fake.sections[0].text, /data, not instructions/); }); +test("Codebase Memory rejects reconnect values outside the DSH contract", () => { + assert.throws(() => resolveConfig({ reconnect: { initialDelayMs: 0 } }), /initialDelayMs/); + assert.throws(() => resolveConfig({ reconnect: { maxDelayMs: 1.5 } }), /maxDelayMs/); + assert.throws(() => resolveConfig({ reconnect: { maxAttempts: 0 } }), /maxAttempts/); + assert.throws(() => resolveConfig({ reconnect: { initialDelayMs: 2_000, maxDelayMs: 1_000 } }), /less than or equal/); +}); + test("Codebase Memory does not preflight its lazy npx command", async () => { const fake = createContext({ codebaseMemoryEnabled: true, @@ -439,9 +451,13 @@ test("Modern Go can be disabled and uses the pinned Go module command", async () assert.equal(enabled.skillProviders.length, 0); }); -test("RTK stays honest when the DSH pre-record capability is absent", async () => { +test("RTK does not register an unsupported DSH input hook", async () => { const fake = createContext(); + fake.context.get = (key) => key === "tools" + ? { resolveRecordInput() {}, get() { return {}; } } + : key === "subprocess" ? {} : undefined; await applyRtk(fake.context, { mode: "rewrite" }); + assert.equal(fake.listeners.has("tools/pre-record-input"), false); assert.equal(await fake.context.skills.get("rtk"), undefined); const section = fake.sections.find((item) => item.name === "mtm-coding:rtk:status"); assert.ok(section); @@ -486,6 +502,31 @@ test("Ponytail exposes skills without duplicating companion commands", async () assert.equal(fake.skillProviders.length, 0); }); +test("Ponytail respects model invocation and clears stale skills", async () => { + const fake = createContext(); + let coreSkill = { + name: "ponytail", + description: "Ponytail rules.", + invocation: { modelInvocable: true, userInvocable: true }, + provider: "test", + source: "custom", + content: "Ponytail skill body.", + }; + fake.context.skills.get = async (name) => name === "ponytail" ? coreSkill : undefined; + await applyPonytail(fake.context, { mode: "full" }); + const section = fake.sections[0]; + assert.match(section.text({}), /Ponytail skill body/); + + coreSkill = { ...coreSkill, invocation: { modelInvocable: false, userInvocable: true } }; + await onlyListener(fake.listeners, "skills/change")(); + assert.equal(section.text({}), ""); + + coreSkill = undefined; + await onlyListener(fake.listeners, "skills/change")(); + assert.equal(section.text({}), ""); + await fake.dispose(); +}); + test("Ponytail can be excluded from subagent system prompts", async () => { const fake = createContext(); await applyPonytail(fake.context, { mode: "full", applyToSubagents: false }); diff --git a/packages/mtmharness/tests/packed-install.test.mjs b/packages/mtmharness/tests/packed-install.test.mjs index bbf8c21..81c86b7 100644 --- a/packages/mtmharness/tests/packed-install.test.mjs +++ b/packages/mtmharness/tests/packed-install.test.mjs @@ -128,11 +128,13 @@ test("packed mtmharness discovers skills from its editable DSH home", async () = mkdirSync(packRoot); mkdirSync(installRoot); const skillPath = join(dshHome, "mtmharness", "skills", "modern-go", "use-modern-go", "SKILL.md"); - mkdirSync(join(skillPath, ".."), { recursive: true }); + const skillDirectory = join(skillPath, ".."); + mkdirSync(join(skillDirectory, "scripts"), { recursive: true }); writeFileSync(skillPath, "---\nname: use-modern-go\ndescription: Modern Go guidance.\n---\n\ngo run github.com/JetBrains/go-modern-guidelines@v0.1.1 list --file-path\n"); + for (const name of ["VERSION", "run-tool.ps1", "run-tool.sh"]) writeFileSync(join(skillDirectory, "scripts", name), "pinned resource fixture\n"); process.env.DSH_HOME = dshHome; - execFileSync("npm", ["pack", "--pack-destination", packRoot], { cwd: packageRoot, stdio: "pipe" }); + execFileSync("npm", ["pack", "--ignore-scripts", "--pack-destination", packRoot], { cwd: packageRoot, stdio: "pipe" }); const archiveName = readdirSync(packRoot).find((name) => name.endsWith(".tgz")); assert.ok(archiveName); const archive = join(packRoot, archiveName); @@ -147,7 +149,12 @@ test("packed mtmharness discovers skills from its editable DSH home", async () = const installedPackage = resolve(installRoot, "node_modules", "mtmharness"); const installed = await import(pathToFileURL(join(installedPackage, "lib/index.js")).href); - assert.deepEqual(installed.MTM_CODING_PACKAGES.modernGo.skills.files.map((file) => file.name), ["use-modern-go"]); + assert.deepEqual(installed.MTM_CODING_PACKAGES.modernGo.skills.files.map((file) => file.path), [ + "plugin/skills/use-modern-go/SKILL.md", + "plugin/skills/use-modern-go/scripts/VERSION", + "plugin/skills/use-modern-go/scripts/run-tool.ps1", + "plugin/skills/use-modern-go/scripts/run-tool.sh", + ]); const fake = createContext(); await installed.applyCoding(fake.context, { diff --git a/packages/mtmharness/tests/skill-filesystem.test.ts b/packages/mtmharness/tests/skill-filesystem.test.ts index 4478f72..552e9ff 100644 --- a/packages/mtmharness/tests/skill-filesystem.test.ts +++ b/packages/mtmharness/tests/skill-filesystem.test.ts @@ -1,6 +1,6 @@ /* @vitest-environment node */ import { createHash } from "node:crypto"; -import { mkdtemp, readFile, rm, writeFile } from "node:fs/promises"; +import { mkdir, mkdtemp, readFile, rm, writeFile } from "node:fs/promises"; import { tmpdir } from "node:os"; import { join } from "node:path"; import { Context } from "@deepseek-ai/cordis"; @@ -9,8 +9,9 @@ import { describe, expect, it } from "vitest"; import { applyFileSkills, ensureSkillPackage } from "../src/skill-files.ts"; import type { MtmCodingPackageManifest, MtmCodingSkillSource } from "../src/features/coding/manifest.ts"; -const DOCUMENT = "---\nname: example-skill\ndescription: Test external skill.\n---\n\n# External\n\nOriginal body.\n"; +const DOCUMENT = "---\r\n# Metadata may be reordered.\r\ndescription: >\r\n Test external skill.\r\nwhenToUse: Verify YAML frontmatter parsing.\r\nname: example-skill # inline comments are valid.\r\n---\r\n\r\n# External\r\n\r\nOriginal body.\r\n"; const EDITED = DOCUMENT.replace("Original body.", "User edit."); +const RESOURCE = "resource payload\n"; const source: MtmCodingSkillSource = { repository: "https://github.com/example/skills", revision: "a".repeat(40), @@ -18,6 +19,10 @@ const source: MtmCodingSkillSource = { name: "example-skill", path: "skills/example-skill/SKILL.md", sha256: createHash("sha256").update(DOCUMENT).digest("hex"), + }, { + name: "example-skill", + path: "skills/example-skill/scripts/run-tool.sh", + sha256: createHash("sha256").update(RESOURCE).digest("hex"), }], }; const packageManifest: MtmCodingPackageManifest & { readonly skills: MtmCodingSkillSource } = { @@ -40,13 +45,15 @@ describe("external coding skills", () => { root, fetch: async (url) => { urls.push(url); - return new Response(DOCUMENT); + return new Response(url.endsWith("/scripts/run-tool.sh") ? RESOURCE : DOCUMENT); }, }); expect(urls).toEqual([ "https://raw.githubusercontent.com/example/skills/" + source.revision + "/skills/example-skill/SKILL.md", + "https://raw.githubusercontent.com/example/skills/" + source.revision + "/skills/example-skill/scripts/run-tool.sh", ]); expect(await readFile(join(root, "example-skill", "SKILL.md"), "utf8")).toBe(DOCUMENT); + expect(await readFile(join(root, "example-skill", "scripts", "run-tool.sh"), "utf8")).toBe(RESOURCE); await ctx.plugin(SkillRegistry); applyFileSkills(ctx, "test-external", root); @@ -60,6 +67,21 @@ describe("external coding skills", () => { }); expect((await ctx.skills.get("example-skill"))?.content).toContain("User edit."); + const legacyRoot = join(temporary, "legacy"); + await mkdir(join(legacyRoot, "example-skill"), { recursive: true }); + await writeFile(join(legacyRoot, "example-skill", "SKILL.md"), DOCUMENT); + const legacyUrls: string[] = []; + await ensureSkillPackage(packageManifest, { + root: legacyRoot, + fetch: async (url) => { + legacyUrls.push(url); + return new Response(RESOURCE); + }, + }); + expect(legacyUrls).toHaveLength(1); + expect(await readFile(join(legacyRoot, "example-skill", "SKILL.md"), "utf8")).toBe(DOCUMENT); + expect(await readFile(join(legacyRoot, "example-skill", "scripts", "run-tool.sh"), "utf8")).toBe(RESOURCE); + const invalidRoot = join(temporary, "invalid"); const invalid = { ...packageManifest, @@ -77,11 +99,35 @@ describe("external coding skills", () => { skills: { ...source, files: [{ ...source.files[0], path: "../SKILL.md" }] }, }; await expect(ensureSkillPackage(unsafe, { root: unsafeRoot, fetch: async () => new Response(DOCUMENT) })) - .rejects.toThrow("invalid pinned skill source"); + .rejects.toThrow("invalid skill metadata"); await expect(readFile(join(unsafeRoot, "example-skill", "SKILL.md"), "utf8")).rejects.toMatchObject({ code: "ENOENT" }); } finally { await ctx.fiber.dispose(); await rm(temporary, { recursive: true, force: true }); } }); + + it("cancels an in-flight bundle install without leaving a partial root", async () => { + const temporary = await mkdtemp(join(tmpdir(), "mtmharness-skill-cancel-")); + const root = join(temporary, "cancelled"); + let resolveStarted!: () => void; + const started = new Promise((resolve) => { resolveStarted = resolve; }); + const controller = new AbortController(); + try { + const pending = ensureSkillPackage({ ...packageManifest, id: "cancelled" }, { + root, + signal: controller.signal, + fetch: async (_url, init) => new Promise((_resolve, reject) => { + resolveStarted(); + init?.signal?.addEventListener("abort", () => reject(new DOMException("cancelled", "AbortError")), { once: true }); + }), + }); + await started; + controller.abort(); + await expect(pending).rejects.toThrow("cancelled"); + await expect(readFile(root, "utf8")).rejects.toMatchObject({ code: "ENOENT" }); + } finally { + await rm(temporary, { recursive: true, force: true }); + } + }); }); diff --git a/pnpm-lock.yaml b/pnpm-lock.yaml index 0f763ab..566f699 100644 --- a/pnpm-lock.yaml +++ b/pnpm-lock.yaml @@ -77,6 +77,9 @@ importers: npm: specifier: 11.7.0 version: 11.7.0 + yaml: + specifier: ^2.4.2 + version: 2.9.0 devDependencies: '@base-ui/react': specifier: 1.7.0 @@ -85,107 +88,107 @@ importers: specifier: 4.0.2 version: 4.0.2 '@deepseek-ai/dsh-agent': - specifier: 0.1.2-alpha.4 - version: 0.1.2-alpha.4(c5cc672bd5ee417388896b008bce4ee7) + specifier: 0.1.2-alpha.5 + version: 0.1.2-alpha.5(fa501c54d1bae9af3acbbd6956a25b22) '@deepseek-ai/dsh-attachment': - specifier: 0.1.2-alpha.4 - version: 0.1.2-alpha.4(@deepseek-ai/cordis@4.0.2)(@deepseek-ai/dsh-brand@0.1.2-alpha.4(@deepseek-ai/cordis@4.0.2)) + specifier: 0.1.2-alpha.5 + version: 0.1.2-alpha.5(@deepseek-ai/cordis@4.0.2)(@deepseek-ai/dsh-brand@0.1.2-alpha.5(@deepseek-ai/cordis@4.0.2)) '@deepseek-ai/dsh-brand': - specifier: 0.1.2-alpha.4 - version: 0.1.2-alpha.4(@deepseek-ai/cordis@4.0.2) + specifier: 0.1.2-alpha.5 + version: 0.1.2-alpha.5(@deepseek-ai/cordis@4.0.2) '@deepseek-ai/dsh-client-connection': - specifier: 0.1.2-alpha.4 - version: 0.1.2-alpha.4(@deepseek-ai/cordis@4.0.2)(@deepseek-ai/dsh-invariants@0.1.2-alpha.4(@deepseek-ai/cordis@4.0.2)) + specifier: 0.1.2-alpha.5 + version: 0.1.2-alpha.5(@deepseek-ai/cordis@4.0.2)(@deepseek-ai/dsh-invariants@0.1.2-alpha.5(@deepseek-ai/cordis@4.0.2)) '@deepseek-ai/dsh-client-locale': - specifier: 0.1.2-alpha.4 - version: 0.1.2-alpha.4(@deepseek-ai/cordis@4.0.2) + specifier: 0.1.2-alpha.5 + version: 0.1.2-alpha.5(@deepseek-ai/cordis@4.0.2) '@deepseek-ai/dsh-client-store': - specifier: 0.1.2-alpha.4 - version: 0.1.2-alpha.4(@deepseek-ai/cordis@4.0.2)(@types/react@18.3.31)(react@18.3.1) + specifier: 0.1.2-alpha.5 + version: 0.1.2-alpha.5(@deepseek-ai/cordis@4.0.2)(@types/react@18.3.31)(react@18.3.1) '@deepseek-ai/dsh-client-ui-layout': - specifier: 0.1.2-alpha.4 - version: 0.1.2-alpha.4(@deepseek-ai/cordis@4.0.2) + specifier: 0.1.2-alpha.5 + version: 0.1.2-alpha.5(@deepseek-ai/cordis@4.0.2) '@deepseek-ai/dsh-client-ui-primitives': - specifier: 0.1.2-alpha.4 - version: 0.1.2-alpha.4(@deepseek-ai/cordis@4.0.2) + specifier: 0.1.2-alpha.5 + version: 0.1.2-alpha.5(@deepseek-ai/cordis@4.0.2) '@deepseek-ai/dsh-client-ui-renderer': - specifier: 0.1.2-alpha.4 - version: 0.1.2-alpha.4(@deepseek-ai/cordis@4.0.2)(react@18.3.1) + specifier: 0.1.2-alpha.5 + version: 0.1.2-alpha.5(@deepseek-ai/cordis@4.0.2)(react@18.3.1) '@deepseek-ai/dsh-client-ui-settings': - specifier: 0.1.2-alpha.4 - version: 0.1.2-alpha.4(@deepseek-ai/cordis@4.0.2) + specifier: 0.1.2-alpha.5 + version: 0.1.2-alpha.5(@deepseek-ai/cordis@4.0.2) '@deepseek-ai/dsh-client-ui-settings-plugins': - specifier: 0.1.2-alpha.4 - version: 0.1.2-alpha.4(@deepseek-ai/cordis@4.0.2) + specifier: 0.1.2-alpha.5 + version: 0.1.2-alpha.5(@deepseek-ai/cordis@4.0.2) '@deepseek-ai/dsh-client-ui-sidebar': - specifier: 0.1.2-alpha.4 - version: 0.1.2-alpha.4(@deepseek-ai/cordis@4.0.2) + specifier: 0.1.2-alpha.5 + version: 0.1.2-alpha.5(@deepseek-ai/cordis@4.0.2) '@deepseek-ai/dsh-client-ui-slots': - specifier: 0.1.2-alpha.4 - version: 0.1.2-alpha.4(@deepseek-ai/cordis@4.0.2) + specifier: 0.1.2-alpha.5 + version: 0.1.2-alpha.5(@deepseek-ai/cordis@4.0.2) '@deepseek-ai/dsh-code-runtime': - specifier: 0.1.2-alpha.4 - version: 0.1.2-alpha.4(@deepseek-ai/cordis@4.0.2) + specifier: 0.1.2-alpha.5 + version: 0.1.2-alpha.5(@deepseek-ai/cordis@4.0.2) '@deepseek-ai/dsh-commands': - specifier: 0.1.2-alpha.4 - version: 0.1.2-alpha.4(@deepseek-ai/cordis@4.0.2)(@deepseek-ai/dsh-agent@0.1.2-alpha.4(c5cc672bd5ee417388896b008bce4ee7))(@deepseek-ai/dsh-attachment@0.1.2-alpha.4(@deepseek-ai/cordis@4.0.2)(@deepseek-ai/dsh-brand@0.1.2-alpha.4(@deepseek-ai/cordis@4.0.2)))(@deepseek-ai/dsh-brand@0.1.2-alpha.4(@deepseek-ai/cordis@4.0.2))(@deepseek-ai/dsh-invariants@0.1.2-alpha.4(@deepseek-ai/cordis@4.0.2))(@deepseek-ai/dsh-llm@0.1.2-alpha.4(@deepseek-ai/cordis@4.0.2))(@deepseek-ai/dsh-scope@0.1.2-alpha.4(@deepseek-ai/cordis@4.0.2)(@deepseek-ai/dsh-invariants@0.1.2-alpha.4(@deepseek-ai/cordis@4.0.2)))(@deepseek-ai/dsh-session@0.1.2-alpha.4(@deepseek-ai/cordis@4.0.2)(@deepseek-ai/dsh-scope@0.1.2-alpha.4(@deepseek-ai/cordis@4.0.2)(@deepseek-ai/dsh-invariants@0.1.2-alpha.4(@deepseek-ai/cordis@4.0.2))))(@deepseek-ai/dsh-typert-protocol@0.1.2-alpha.4(@deepseek-ai/cordis@4.0.2)) + specifier: 0.1.2-alpha.5 + version: 0.1.2-alpha.5(@deepseek-ai/cordis@4.0.2)(@deepseek-ai/dsh-agent@0.1.2-alpha.5(fa501c54d1bae9af3acbbd6956a25b22))(@deepseek-ai/dsh-attachment@0.1.2-alpha.5(@deepseek-ai/cordis@4.0.2)(@deepseek-ai/dsh-brand@0.1.2-alpha.5(@deepseek-ai/cordis@4.0.2)))(@deepseek-ai/dsh-brand@0.1.2-alpha.5(@deepseek-ai/cordis@4.0.2))(@deepseek-ai/dsh-invariants@0.1.2-alpha.5(@deepseek-ai/cordis@4.0.2))(@deepseek-ai/dsh-llm@0.1.2-alpha.5(@deepseek-ai/cordis@4.0.2))(@deepseek-ai/dsh-scope@0.1.2-alpha.5(@deepseek-ai/cordis@4.0.2)(@deepseek-ai/dsh-invariants@0.1.2-alpha.5(@deepseek-ai/cordis@4.0.2)))(@deepseek-ai/dsh-session@0.1.2-alpha.5(@deepseek-ai/cordis@4.0.2)(@deepseek-ai/dsh-scope@0.1.2-alpha.5(@deepseek-ai/cordis@4.0.2)(@deepseek-ai/dsh-invariants@0.1.2-alpha.5(@deepseek-ai/cordis@4.0.2))))(@deepseek-ai/dsh-typert-protocol@0.1.2-alpha.5(@deepseek-ai/cordis@4.0.2)) '@deepseek-ai/dsh-fs': - specifier: 0.1.2-alpha.4 - version: 0.1.2-alpha.4(@deepseek-ai/cordis@4.0.2)(@deepseek-ai/dsh-brand@0.1.2-alpha.4(@deepseek-ai/cordis@4.0.2))(@deepseek-ai/dsh-invariants@0.1.2-alpha.4(@deepseek-ai/cordis@4.0.2))(@deepseek-ai/dsh-llm@0.1.2-alpha.4(@deepseek-ai/cordis@4.0.2))(@deepseek-ai/dsh-sandbox@0.1.2-alpha.4(@deepseek-ai/cordis@4.0.2)(@deepseek-ai/dsh-llm@0.1.2-alpha.4(@deepseek-ai/cordis@4.0.2))(@deepseek-ai/dsh-session@0.1.2-alpha.4(@deepseek-ai/cordis@4.0.2)(@deepseek-ai/dsh-scope@0.1.2-alpha.4(@deepseek-ai/cordis@4.0.2)(@deepseek-ai/dsh-invariants@0.1.2-alpha.4(@deepseek-ai/cordis@4.0.2))))) + specifier: 0.1.2-alpha.5 + version: 0.1.2-alpha.5(@deepseek-ai/cordis@4.0.2)(@deepseek-ai/dsh-brand@0.1.2-alpha.5(@deepseek-ai/cordis@4.0.2))(@deepseek-ai/dsh-invariants@0.1.2-alpha.5(@deepseek-ai/cordis@4.0.2))(@deepseek-ai/dsh-llm@0.1.2-alpha.5(@deepseek-ai/cordis@4.0.2))(@deepseek-ai/dsh-sandbox@0.1.2-alpha.5(@deepseek-ai/cordis@4.0.2)(@deepseek-ai/dsh-llm@0.1.2-alpha.5(@deepseek-ai/cordis@4.0.2))(@deepseek-ai/dsh-session@0.1.2-alpha.5(@deepseek-ai/cordis@4.0.2)(@deepseek-ai/dsh-scope@0.1.2-alpha.5(@deepseek-ai/cordis@4.0.2)(@deepseek-ai/dsh-invariants@0.1.2-alpha.5(@deepseek-ai/cordis@4.0.2))))) '@deepseek-ai/dsh-home-paths': - specifier: 0.1.2-alpha.4 - version: 0.1.2-alpha.4(@deepseek-ai/cordis@4.0.2) + specifier: 0.1.2-alpha.5 + version: 0.1.2-alpha.5(@deepseek-ai/cordis@4.0.2) '@deepseek-ai/dsh-invariants': - specifier: 0.1.2-alpha.4 - version: 0.1.2-alpha.4(@deepseek-ai/cordis@4.0.2) + specifier: 0.1.2-alpha.5 + version: 0.1.2-alpha.5(@deepseek-ai/cordis@4.0.2) '@deepseek-ai/dsh-llm': - specifier: 0.1.2-alpha.4 - version: 0.1.2-alpha.4(@deepseek-ai/cordis@4.0.2) + specifier: 0.1.2-alpha.5 + version: 0.1.2-alpha.5(@deepseek-ai/cordis@4.0.2) '@deepseek-ai/dsh-mcp-client': - specifier: 0.1.2-alpha.4 - version: 0.1.2-alpha.4(@deepseek-ai/cordis@4.0.2)(@deepseek-ai/dsh-attachment@0.1.2-alpha.4(@deepseek-ai/cordis@4.0.2)(@deepseek-ai/dsh-brand@0.1.2-alpha.4(@deepseek-ai/cordis@4.0.2)))(@deepseek-ai/dsh-llm@0.1.2-alpha.4(@deepseek-ai/cordis@4.0.2))(@deepseek-ai/dsh-scope@0.1.2-alpha.4(@deepseek-ai/cordis@4.0.2)(@deepseek-ai/dsh-invariants@0.1.2-alpha.4(@deepseek-ai/cordis@4.0.2)))(@deepseek-ai/dsh-subprocess@0.1.2-alpha.4(@deepseek-ai/cordis@4.0.2))(@deepseek-ai/dsh-timeout@0.1.2-alpha.4(@deepseek-ai/cordis@4.0.2))(@deepseek-ai/dsh-tools@0.1.2-alpha.4(6f17de9b01b7bb711bb9888e3e73adf0)) + specifier: 0.1.2-alpha.5 + version: 0.1.2-alpha.5(@deepseek-ai/cordis@4.0.2)(@deepseek-ai/dsh-attachment@0.1.2-alpha.5(@deepseek-ai/cordis@4.0.2)(@deepseek-ai/dsh-brand@0.1.2-alpha.5(@deepseek-ai/cordis@4.0.2)))(@deepseek-ai/dsh-llm@0.1.2-alpha.5(@deepseek-ai/cordis@4.0.2))(@deepseek-ai/dsh-scope@0.1.2-alpha.5(@deepseek-ai/cordis@4.0.2)(@deepseek-ai/dsh-invariants@0.1.2-alpha.5(@deepseek-ai/cordis@4.0.2)))(@deepseek-ai/dsh-subprocess@0.1.2-alpha.5(@deepseek-ai/cordis@4.0.2))(@deepseek-ai/dsh-timeout@0.1.2-alpha.5(@deepseek-ai/cordis@4.0.2))(@deepseek-ai/dsh-tools@0.1.2-alpha.5(d031d96ea0c8995b40a270db2b7a6288)) '@deepseek-ai/dsh-sandbox': - specifier: 0.1.2-alpha.4 - version: 0.1.2-alpha.4(@deepseek-ai/cordis@4.0.2)(@deepseek-ai/dsh-llm@0.1.2-alpha.4(@deepseek-ai/cordis@4.0.2))(@deepseek-ai/dsh-session@0.1.2-alpha.4(@deepseek-ai/cordis@4.0.2)(@deepseek-ai/dsh-scope@0.1.2-alpha.4(@deepseek-ai/cordis@4.0.2)(@deepseek-ai/dsh-invariants@0.1.2-alpha.4(@deepseek-ai/cordis@4.0.2)))) + specifier: 0.1.2-alpha.5 + version: 0.1.2-alpha.5(@deepseek-ai/cordis@4.0.2)(@deepseek-ai/dsh-llm@0.1.2-alpha.5(@deepseek-ai/cordis@4.0.2))(@deepseek-ai/dsh-session@0.1.2-alpha.5(@deepseek-ai/cordis@4.0.2)(@deepseek-ai/dsh-scope@0.1.2-alpha.5(@deepseek-ai/cordis@4.0.2)(@deepseek-ai/dsh-invariants@0.1.2-alpha.5(@deepseek-ai/cordis@4.0.2)))) '@deepseek-ai/dsh-scope': - specifier: 0.1.2-alpha.4 - version: 0.1.2-alpha.4(@deepseek-ai/cordis@4.0.2)(@deepseek-ai/dsh-invariants@0.1.2-alpha.4(@deepseek-ai/cordis@4.0.2)) + specifier: 0.1.2-alpha.5 + version: 0.1.2-alpha.5(@deepseek-ai/cordis@4.0.2)(@deepseek-ai/dsh-invariants@0.1.2-alpha.5(@deepseek-ai/cordis@4.0.2)) '@deepseek-ai/dsh-session': - specifier: 0.1.2-alpha.4 - version: 0.1.2-alpha.4(@deepseek-ai/cordis@4.0.2)(@deepseek-ai/dsh-scope@0.1.2-alpha.4(@deepseek-ai/cordis@4.0.2)(@deepseek-ai/dsh-invariants@0.1.2-alpha.4(@deepseek-ai/cordis@4.0.2))) + specifier: 0.1.2-alpha.5 + version: 0.1.2-alpha.5(@deepseek-ai/cordis@4.0.2)(@deepseek-ai/dsh-scope@0.1.2-alpha.5(@deepseek-ai/cordis@4.0.2)(@deepseek-ai/dsh-invariants@0.1.2-alpha.5(@deepseek-ai/cordis@4.0.2))) '@deepseek-ai/dsh-session-projection': - specifier: 0.1.2-alpha.4 - version: 0.1.2-alpha.4(@deepseek-ai/cordis@4.0.2)(@deepseek-ai/dsh-session@0.1.2-alpha.4(@deepseek-ai/cordis@4.0.2)(@deepseek-ai/dsh-scope@0.1.2-alpha.4(@deepseek-ai/cordis@4.0.2)(@deepseek-ai/dsh-invariants@0.1.2-alpha.4(@deepseek-ai/cordis@4.0.2)))) + specifier: 0.1.2-alpha.5 + version: 0.1.2-alpha.5(@deepseek-ai/cordis@4.0.2)(@deepseek-ai/dsh-session@0.1.2-alpha.5(@deepseek-ai/cordis@4.0.2)(@deepseek-ai/dsh-scope@0.1.2-alpha.5(@deepseek-ai/cordis@4.0.2)(@deepseek-ai/dsh-invariants@0.1.2-alpha.5(@deepseek-ai/cordis@4.0.2)))) '@deepseek-ai/dsh-session-turn-outline': - specifier: 0.1.2-alpha.4 - version: 0.1.2-alpha.4(@deepseek-ai/cordis@4.0.2)(@deepseek-ai/dsh-llm@0.1.2-alpha.4(@deepseek-ai/cordis@4.0.2))(@deepseek-ai/dsh-session-projection@0.1.2-alpha.4(@deepseek-ai/cordis@4.0.2)(@deepseek-ai/dsh-session@0.1.2-alpha.4(@deepseek-ai/cordis@4.0.2)(@deepseek-ai/dsh-scope@0.1.2-alpha.4(@deepseek-ai/cordis@4.0.2)(@deepseek-ai/dsh-invariants@0.1.2-alpha.4(@deepseek-ai/cordis@4.0.2)))))(@deepseek-ai/dsh-session@0.1.2-alpha.4(@deepseek-ai/cordis@4.0.2)(@deepseek-ai/dsh-scope@0.1.2-alpha.4(@deepseek-ai/cordis@4.0.2)(@deepseek-ai/dsh-invariants@0.1.2-alpha.4(@deepseek-ai/cordis@4.0.2)))) + specifier: 0.1.2-alpha.5 + version: 0.1.2-alpha.5(@deepseek-ai/cordis@4.0.2)(@deepseek-ai/dsh-llm@0.1.2-alpha.5(@deepseek-ai/cordis@4.0.2))(@deepseek-ai/dsh-session-projection@0.1.2-alpha.5(@deepseek-ai/cordis@4.0.2)(@deepseek-ai/dsh-session@0.1.2-alpha.5(@deepseek-ai/cordis@4.0.2)(@deepseek-ai/dsh-scope@0.1.2-alpha.5(@deepseek-ai/cordis@4.0.2)(@deepseek-ai/dsh-invariants@0.1.2-alpha.5(@deepseek-ai/cordis@4.0.2)))))(@deepseek-ai/dsh-session@0.1.2-alpha.5(@deepseek-ai/cordis@4.0.2)(@deepseek-ai/dsh-scope@0.1.2-alpha.5(@deepseek-ai/cordis@4.0.2)(@deepseek-ai/dsh-invariants@0.1.2-alpha.5(@deepseek-ai/cordis@4.0.2)))) '@deepseek-ai/dsh-settings': - specifier: 0.1.2-alpha.4 - version: 0.1.2-alpha.4(@deepseek-ai/cordis@4.0.2)(@deepseek-ai/dsh-brand@0.1.2-alpha.4(@deepseek-ai/cordis@4.0.2))(@deepseek-ai/dsh-invariants@0.1.2-alpha.4(@deepseek-ai/cordis@4.0.2))(@deepseek-ai/dsh-session@0.1.2-alpha.4(@deepseek-ai/cordis@4.0.2)(@deepseek-ai/dsh-scope@0.1.2-alpha.4(@deepseek-ai/cordis@4.0.2)(@deepseek-ai/dsh-invariants@0.1.2-alpha.4(@deepseek-ai/cordis@4.0.2))))(@deepseek-ai/schemastery@3.18.2) + specifier: 0.1.2-alpha.5 + version: 0.1.2-alpha.5(@deepseek-ai/cordis@4.0.2)(@deepseek-ai/dsh-brand@0.1.2-alpha.5(@deepseek-ai/cordis@4.0.2))(@deepseek-ai/dsh-invariants@0.1.2-alpha.5(@deepseek-ai/cordis@4.0.2))(@deepseek-ai/dsh-session@0.1.2-alpha.5(@deepseek-ai/cordis@4.0.2)(@deepseek-ai/dsh-scope@0.1.2-alpha.5(@deepseek-ai/cordis@4.0.2)(@deepseek-ai/dsh-invariants@0.1.2-alpha.5(@deepseek-ai/cordis@4.0.2))))(@deepseek-ai/schemastery@3.18.2) '@deepseek-ai/dsh-skill': - specifier: 0.1.2-alpha.4 - version: 0.1.2-alpha.4(@deepseek-ai/cordis@4.0.2)(@deepseek-ai/dsh-llm@0.1.2-alpha.4(@deepseek-ai/cordis@4.0.2))(@deepseek-ai/dsh-scope@0.1.2-alpha.4(@deepseek-ai/cordis@4.0.2)(@deepseek-ai/dsh-invariants@0.1.2-alpha.4(@deepseek-ai/cordis@4.0.2))) + specifier: 0.1.2-alpha.5 + version: 0.1.2-alpha.5(@deepseek-ai/cordis@4.0.2)(@deepseek-ai/dsh-llm@0.1.2-alpha.5(@deepseek-ai/cordis@4.0.2))(@deepseek-ai/dsh-scope@0.1.2-alpha.5(@deepseek-ai/cordis@4.0.2)(@deepseek-ai/dsh-invariants@0.1.2-alpha.5(@deepseek-ai/cordis@4.0.2))) '@deepseek-ai/dsh-skill-filesystem': - specifier: 0.1.2-alpha.4 - version: 0.1.2-alpha.4(@deepseek-ai/cordis@4.0.2)(@deepseek-ai/dsh-fs@0.1.2-alpha.4(@deepseek-ai/cordis@4.0.2)(@deepseek-ai/dsh-brand@0.1.2-alpha.4(@deepseek-ai/cordis@4.0.2))(@deepseek-ai/dsh-invariants@0.1.2-alpha.4(@deepseek-ai/cordis@4.0.2))(@deepseek-ai/dsh-llm@0.1.2-alpha.4(@deepseek-ai/cordis@4.0.2))(@deepseek-ai/dsh-sandbox@0.1.2-alpha.4(@deepseek-ai/cordis@4.0.2)(@deepseek-ai/dsh-llm@0.1.2-alpha.4(@deepseek-ai/cordis@4.0.2))(@deepseek-ai/dsh-session@0.1.2-alpha.4(@deepseek-ai/cordis@4.0.2)(@deepseek-ai/dsh-scope@0.1.2-alpha.4(@deepseek-ai/cordis@4.0.2)(@deepseek-ai/dsh-invariants@0.1.2-alpha.4(@deepseek-ai/cordis@4.0.2))))))(@deepseek-ai/dsh-home-paths@0.1.2-alpha.4(@deepseek-ai/cordis@4.0.2))(@deepseek-ai/dsh-skill@0.1.2-alpha.4(@deepseek-ai/cordis@4.0.2)(@deepseek-ai/dsh-llm@0.1.2-alpha.4(@deepseek-ai/cordis@4.0.2))(@deepseek-ai/dsh-scope@0.1.2-alpha.4(@deepseek-ai/cordis@4.0.2)(@deepseek-ai/dsh-invariants@0.1.2-alpha.4(@deepseek-ai/cordis@4.0.2)))) + specifier: 0.1.2-alpha.5 + version: 0.1.2-alpha.5(@deepseek-ai/cordis@4.0.2)(@deepseek-ai/dsh-fs@0.1.2-alpha.5(@deepseek-ai/cordis@4.0.2)(@deepseek-ai/dsh-brand@0.1.2-alpha.5(@deepseek-ai/cordis@4.0.2))(@deepseek-ai/dsh-invariants@0.1.2-alpha.5(@deepseek-ai/cordis@4.0.2))(@deepseek-ai/dsh-llm@0.1.2-alpha.5(@deepseek-ai/cordis@4.0.2))(@deepseek-ai/dsh-sandbox@0.1.2-alpha.5(@deepseek-ai/cordis@4.0.2)(@deepseek-ai/dsh-llm@0.1.2-alpha.5(@deepseek-ai/cordis@4.0.2))(@deepseek-ai/dsh-session@0.1.2-alpha.5(@deepseek-ai/cordis@4.0.2)(@deepseek-ai/dsh-scope@0.1.2-alpha.5(@deepseek-ai/cordis@4.0.2)(@deepseek-ai/dsh-invariants@0.1.2-alpha.5(@deepseek-ai/cordis@4.0.2))))))(@deepseek-ai/dsh-home-paths@0.1.2-alpha.5(@deepseek-ai/cordis@4.0.2))(@deepseek-ai/dsh-skill@0.1.2-alpha.5(@deepseek-ai/cordis@4.0.2)(@deepseek-ai/dsh-llm@0.1.2-alpha.5(@deepseek-ai/cordis@4.0.2))(@deepseek-ai/dsh-scope@0.1.2-alpha.5(@deepseek-ai/cordis@4.0.2)(@deepseek-ai/dsh-invariants@0.1.2-alpha.5(@deepseek-ai/cordis@4.0.2)))) '@deepseek-ai/dsh-subprocess': - specifier: 0.1.2-alpha.4 - version: 0.1.2-alpha.4(@deepseek-ai/cordis@4.0.2) + specifier: 0.1.2-alpha.5 + version: 0.1.2-alpha.5(@deepseek-ai/cordis@4.0.2) '@deepseek-ai/dsh-system-prompt': - specifier: 0.1.2-alpha.4 - version: 0.1.2-alpha.4(@deepseek-ai/cordis@4.0.2)(@deepseek-ai/dsh-invariants@0.1.2-alpha.4(@deepseek-ai/cordis@4.0.2))(@deepseek-ai/dsh-llm@0.1.2-alpha.4(@deepseek-ai/cordis@4.0.2))(@deepseek-ai/dsh-scope@0.1.2-alpha.4(@deepseek-ai/cordis@4.0.2)(@deepseek-ai/dsh-invariants@0.1.2-alpha.4(@deepseek-ai/cordis@4.0.2))) + specifier: 0.1.2-alpha.5 + version: 0.1.2-alpha.5(@deepseek-ai/cordis@4.0.2)(@deepseek-ai/dsh-invariants@0.1.2-alpha.5(@deepseek-ai/cordis@4.0.2))(@deepseek-ai/dsh-llm@0.1.2-alpha.5(@deepseek-ai/cordis@4.0.2))(@deepseek-ai/dsh-scope@0.1.2-alpha.5(@deepseek-ai/cordis@4.0.2)(@deepseek-ai/dsh-invariants@0.1.2-alpha.5(@deepseek-ai/cordis@4.0.2))) '@deepseek-ai/dsh-timeout': - specifier: 0.1.2-alpha.4 - version: 0.1.2-alpha.4(@deepseek-ai/cordis@4.0.2) + specifier: 0.1.2-alpha.5 + version: 0.1.2-alpha.5(@deepseek-ai/cordis@4.0.2) '@deepseek-ai/dsh-tools': - specifier: 0.1.2-alpha.4 - version: 0.1.2-alpha.4(6f17de9b01b7bb711bb9888e3e73adf0) + specifier: 0.1.2-alpha.5 + version: 0.1.2-alpha.5(d031d96ea0c8995b40a270db2b7a6288) '@deepseek-ai/dsh-typert-protocol': - specifier: 0.1.2-alpha.4 - version: 0.1.2-alpha.4(@deepseek-ai/cordis@4.0.2) + specifier: 0.1.2-alpha.5 + version: 0.1.2-alpha.5(@deepseek-ai/cordis@4.0.2) '@deepseek-ai/dsh-user-approval': - specifier: 0.1.2-alpha.4 - version: 0.1.2-alpha.4(@deepseek-ai/cordis@4.0.2)(@deepseek-ai/dsh-agent@0.1.2-alpha.4(c5cc672bd5ee417388896b008bce4ee7))(@deepseek-ai/dsh-brand@0.1.2-alpha.4(@deepseek-ai/cordis@4.0.2))(@deepseek-ai/dsh-invariants@0.1.2-alpha.4(@deepseek-ai/cordis@4.0.2))(@deepseek-ai/dsh-llm@0.1.2-alpha.4(@deepseek-ai/cordis@4.0.2))(@deepseek-ai/dsh-scope@0.1.2-alpha.4(@deepseek-ai/cordis@4.0.2)(@deepseek-ai/dsh-invariants@0.1.2-alpha.4(@deepseek-ai/cordis@4.0.2)))(@deepseek-ai/dsh-session@0.1.2-alpha.4(@deepseek-ai/cordis@4.0.2)(@deepseek-ai/dsh-scope@0.1.2-alpha.4(@deepseek-ai/cordis@4.0.2)(@deepseek-ai/dsh-invariants@0.1.2-alpha.4(@deepseek-ai/cordis@4.0.2))))(@deepseek-ai/dsh-system-prompt@0.1.2-alpha.4(@deepseek-ai/cordis@4.0.2)(@deepseek-ai/dsh-invariants@0.1.2-alpha.4(@deepseek-ai/cordis@4.0.2))(@deepseek-ai/dsh-llm@0.1.2-alpha.4(@deepseek-ai/cordis@4.0.2))(@deepseek-ai/dsh-scope@0.1.2-alpha.4(@deepseek-ai/cordis@4.0.2)(@deepseek-ai/dsh-invariants@0.1.2-alpha.4(@deepseek-ai/cordis@4.0.2)))) + specifier: 0.1.2-alpha.5 + version: 0.1.2-alpha.5(@deepseek-ai/cordis@4.0.2)(@deepseek-ai/dsh-agent@0.1.2-alpha.5(fa501c54d1bae9af3acbbd6956a25b22))(@deepseek-ai/dsh-brand@0.1.2-alpha.5(@deepseek-ai/cordis@4.0.2))(@deepseek-ai/dsh-invariants@0.1.2-alpha.5(@deepseek-ai/cordis@4.0.2))(@deepseek-ai/dsh-llm@0.1.2-alpha.5(@deepseek-ai/cordis@4.0.2))(@deepseek-ai/dsh-scope@0.1.2-alpha.5(@deepseek-ai/cordis@4.0.2)(@deepseek-ai/dsh-invariants@0.1.2-alpha.5(@deepseek-ai/cordis@4.0.2)))(@deepseek-ai/dsh-session@0.1.2-alpha.5(@deepseek-ai/cordis@4.0.2)(@deepseek-ai/dsh-scope@0.1.2-alpha.5(@deepseek-ai/cordis@4.0.2)(@deepseek-ai/dsh-invariants@0.1.2-alpha.5(@deepseek-ai/cordis@4.0.2))))(@deepseek-ai/dsh-system-prompt@0.1.2-alpha.5(@deepseek-ai/cordis@4.0.2)(@deepseek-ai/dsh-invariants@0.1.2-alpha.5(@deepseek-ai/cordis@4.0.2))(@deepseek-ai/dsh-llm@0.1.2-alpha.5(@deepseek-ai/cordis@4.0.2))(@deepseek-ai/dsh-scope@0.1.2-alpha.5(@deepseek-ai/cordis@4.0.2)(@deepseek-ai/dsh-invariants@0.1.2-alpha.5(@deepseek-ai/cordis@4.0.2)))) '@tailwindcss/vite': specifier: 4.3.3 version: 4.3.3(vite@8.2.2(@types/node@22.20.1)(esbuild@0.28.2)(jiti@2.7.0)(yaml@2.9.0)) @@ -340,250 +343,250 @@ packages: '@deepseek-ai/cosmokit@1.8.3': resolution: {integrity: sha512-qBo+ronVM6Eu2WNVJXi8JcMiqZ19T9BRIpV+5qJUFPXjGH/Z0QKcQMC/IZJ7L394YTOtJgcovbk9qP0w2GsBXQ==} - '@deepseek-ai/dsh-agent@0.1.2-alpha.4': - resolution: {integrity: sha512-2wpsA57gNFqRFVyk2L4jTXIgRGTXYTYPWOlHfPVAMMG+uYroFynn/0xHq5WGfW0HpS/BgEK9Otewv7Qj0w3PcA==} + '@deepseek-ai/dsh-agent@0.1.2-alpha.5': + resolution: {integrity: sha512-vkl+p28Slcer7AUITOm0+LxFzyTHELU8lWA6CO3GYn4IGscNsa/2XSqF4+StZdu80ky+BxYq2hcW6NdTsOGDEw==} peerDependencies: '@deepseek-ai/cordis': ^4.0.2 - '@deepseek-ai/dsh-invariants': ^0.1.2-alpha.4 - '@deepseek-ai/dsh-llm': ^0.1.2-alpha.4 - '@deepseek-ai/dsh-scope': ^0.1.2-alpha.4 - '@deepseek-ai/dsh-session': ^0.1.2-alpha.4 - '@deepseek-ai/dsh-session-projection': ^0.1.2-alpha.4 - '@deepseek-ai/dsh-system-prompt': ^0.1.2-alpha.4 - '@deepseek-ai/dsh-typert-protocol': ^0.1.2-alpha.4 - - '@deepseek-ai/dsh-attachment@0.1.2-alpha.4': - resolution: {integrity: sha512-Jl9Uo/U9mE7LHCyyRcteaMNz+kHpuHCDg094byhAmuudm04QQ/1tGOHH011wzyKi94XEt5crjus0dZp3dbc6Kg==} + '@deepseek-ai/dsh-invariants': ^0.1.2-alpha.5 + '@deepseek-ai/dsh-llm': ^0.1.2-alpha.5 + '@deepseek-ai/dsh-scope': ^0.1.2-alpha.5 + '@deepseek-ai/dsh-session': ^0.1.2-alpha.5 + '@deepseek-ai/dsh-session-projection': ^0.1.2-alpha.5 + '@deepseek-ai/dsh-system-prompt': ^0.1.2-alpha.5 + '@deepseek-ai/dsh-typert-protocol': ^0.1.2-alpha.5 + + '@deepseek-ai/dsh-attachment@0.1.2-alpha.5': + resolution: {integrity: sha512-n95PPpNfOBhsfwqt1aHCPBa0Mk3HhOOsy1nhobGTmCZUNYCqfMPwfp+inG3z9HpMeJcTM1Xlhy5E/egPTLb4cw==} peerDependencies: '@deepseek-ai/cordis': ^4.0.2 - '@deepseek-ai/dsh-brand': ^0.1.2-alpha.4 + '@deepseek-ai/dsh-brand': ^0.1.2-alpha.5 - '@deepseek-ai/dsh-brand@0.1.2-alpha.4': - resolution: {integrity: sha512-ebOnMr64GIXin+eyk9jbFkxF3esP8QuvnIrpem3vMNaN0oKyeGy8opzuLyVWtUMtFLmO3ehCI88u0cQSsLsEhQ==} + '@deepseek-ai/dsh-brand@0.1.2-alpha.5': + resolution: {integrity: sha512-jpOkfEV4p80UzxfuXCUE9Br+VCvf9VT3fun9fP9aIUh7kw/16MJQVFFdQAfKY/IAeW/Dj3GtkjXxJMBctqv3AQ==} peerDependencies: '@deepseek-ai/cordis': ^4.0.2 - '@deepseek-ai/dsh-client-connection@0.1.2-alpha.4': - resolution: {integrity: sha512-FABaVqKwZlZ66hsr0HrpgQ/Tu/E8zeoOov7pI92mt7cV17EUjXVanbjEOI3+wSubXmq24DxpFzybrF3qx+kKTA==} + '@deepseek-ai/dsh-client-connection@0.1.2-alpha.5': + resolution: {integrity: sha512-g80LVXFyCZMGlvE3Ki1XWRDoekHcHDYKEREj/ruIIyLweswxal9g4Y/KSGHvz16S+zghHjTPoWmFuzVJtPtlvA==} peerDependencies: '@deepseek-ai/cordis': ^4.0.2 - '@deepseek-ai/dsh-client-locale@0.1.2-alpha.4': - resolution: {integrity: sha512-1R+fa4NE03iAJYaYHNwF2s2OZGRaJ+vvONS3ps1T8je7kN2+6ubbFSawBmCMT9Kh2iQGNuzYEUcidUB81yHDsA==} + '@deepseek-ai/dsh-client-locale@0.1.2-alpha.5': + resolution: {integrity: sha512-u7+Q0tIuN4yEEABM9VyFpScunpFBIt5f4/M0S26Ka3cx9+b9jnSQdxDRvFv4IWxe8rPAD/xTNHVYjvPNaBrRGg==} peerDependencies: '@deepseek-ai/cordis': ^4.0.2 - '@deepseek-ai/dsh-client-store@0.1.2-alpha.4': - resolution: {integrity: sha512-0Zh7Iwa5w28CnItX1jyy0ItVkdbRM2RjGqlo4tfAIzT/0Xo0wQgTQ+OVQW714Pqo3Ce1P+h4nNECELfUFXRkSg==} + '@deepseek-ai/dsh-client-store@0.1.2-alpha.5': + resolution: {integrity: sha512-q8lEPC8UT5RSHOv0GVU7pJcV/GZ3XghkwR9APV/Poqbhx5DDrSUY2PY3scVTeFCqHVXgBEmd13yygjzyyRz8TQ==} peerDependencies: '@deepseek-ai/cordis': ^4.0.2 - '@deepseek-ai/dsh-client-ui-layout@0.1.2-alpha.4': - resolution: {integrity: sha512-+QfMqChBi2AmfLD7rGfbFrAPzatYd291AyGjkbP+71qxAs9rpqbag2SlSKpcfYVYKZvL/xON2haTBp+vzFeHNg==} + '@deepseek-ai/dsh-client-ui-layout@0.1.2-alpha.5': + resolution: {integrity: sha512-l0hIFTNr139KqA3kKoOvw0oDxzzDSDybOx1sz+d0M3La/WrFfg/BK1sjoKNQW7Bb49qydma89EAR0E8gJO0k0w==} peerDependencies: '@deepseek-ai/cordis': ^4.0.2 - '@deepseek-ai/dsh-client-ui-primitives@0.1.2-alpha.4': - resolution: {integrity: sha512-8lhzSMqA3k7JrIGlsROqy32vM36lS7G6z1qN86UeTnlbhM8zBxWIIM0zbQnbvZy0s6z8Z1Z8I4W7G+q1Efo69A==} + '@deepseek-ai/dsh-client-ui-primitives@0.1.2-alpha.5': + resolution: {integrity: sha512-14EpzwRiPLBP7+6Vaeu/wYAqy+PTz+RR7wVke0Lg7HiQdXXRJNTyNlpPHlGIAsmk1qa8h6KzCR8Wylw5EsJY5A==} peerDependencies: '@deepseek-ai/cordis': ^4.0.2 - '@deepseek-ai/dsh-client-ui-renderer@0.1.2-alpha.4': - resolution: {integrity: sha512-TPhCTYZBHFrm3Jl9uFeV7IgJBu2tsr9WSb24clqPYDIoDfeHmRYUTkpWdHxYxgUmVp5DJ6B2GI5pMqw5oMRKMg==} + '@deepseek-ai/dsh-client-ui-renderer@0.1.2-alpha.5': + resolution: {integrity: sha512-Ly+5khkg5GrsRjbMXJcuHvP40JC3tYM2y5URjz+6eIhDN9EXzTSfW13RQ7TLkKLca79nCskSrdt+Mxa79uemew==} peerDependencies: '@deepseek-ai/cordis': ^4.0.2 - '@deepseek-ai/dsh-client-ui-settings-plugins@0.1.2-alpha.4': - resolution: {integrity: sha512-TtHx8asSHMyxwS79zQ0eqaHBXOQEqvm4YaNioxUF0d3VGGNRIWDNmUnEfjPORB1mYNjmD/G73iRXYbIsiu7RJg==} + '@deepseek-ai/dsh-client-ui-settings-plugins@0.1.2-alpha.5': + resolution: {integrity: sha512-pKxitVjDBMZoFj8elvhEGpxqGHMn7GwqqlE5EMeHhDziBZcXCYh4IORFdl2Z1KgM1UluXRv1ELim4Qkzd1UY7Q==} peerDependencies: '@deepseek-ai/cordis': ^4.0.2 - '@deepseek-ai/dsh-client-ui-settings@0.1.2-alpha.4': - resolution: {integrity: sha512-5Q5sPw9Hy+ibpYSKGAnq1viTleGvq4tPJMIDNEgP2VUAHES7d7hbfMPXodD4I6hCCBeKd4Xw1kKXUYRbZPFjKw==} + '@deepseek-ai/dsh-client-ui-settings@0.1.2-alpha.5': + resolution: {integrity: sha512-clOlWHDVonS7MvN/ZSdsJudQGKCtiDgRjv52Vx058YArnxzlQZHSi5OTBGg1/Xmh5IOEcNAFf8lBEVTxVP8HLA==} peerDependencies: '@deepseek-ai/cordis': ^4.0.2 - '@deepseek-ai/dsh-client-ui-sidebar@0.1.2-alpha.4': - resolution: {integrity: sha512-c1pXdChzH12Nmai4GK89rqaI125pavMDVuceCufE9XhWgV/8OC/AQW2UVZYNXnJ4JAx6Fw0KGHRFgI7YS1Fwyw==} + '@deepseek-ai/dsh-client-ui-sidebar@0.1.2-alpha.5': + resolution: {integrity: sha512-VxqcJeDjYm8N3iXL2ArYT+sgmyPlf/0WUdZQIZlDh4fviwElTvxVncFdl5NP4nPIFap2ebP1J1OesMaArVnJGg==} peerDependencies: '@deepseek-ai/cordis': ^4.0.2 - '@deepseek-ai/dsh-client-ui-slots@0.1.2-alpha.4': - resolution: {integrity: sha512-eZu5OXjNJSjWbWiLLzp49PnkS4l5m2/ChVVZYzgdWnSiVu0wpFO3x9Q+QX+JN4gWHKjBii0Pmgw5aZpRxC8zqg==} + '@deepseek-ai/dsh-client-ui-slots@0.1.2-alpha.5': + resolution: {integrity: sha512-S3B3gmCBHeytkX05AgM2hAov2h0LFRI8jPzgINrAdKsGnwf+BiMDNQcwsjwpaIbZHuphT0Sfxbhm6ltgXvpVPw==} peerDependencies: '@deepseek-ai/cordis': ^4.0.2 - '@deepseek-ai/dsh-code-runtime@0.1.2-alpha.4': - resolution: {integrity: sha512-8B+/ZQ5VAhuy4epENFeO9QBrHyhxbQEKU0d3V2WlQ8oTMaD4ETY7/UGWvJAyXZnRNNtaM1M8OgD01ZZ398gFmA==} + '@deepseek-ai/dsh-code-runtime@0.1.2-alpha.5': + resolution: {integrity: sha512-ZRVuIDmYnyb30VDuFitd9/4oVId9qq2oQJj1boV/VCritu/fhrpx76S8MRaKmm8l66h299/XCTDkZ+z6tanmhQ==} peerDependencies: '@deepseek-ai/cordis': ^4.0.2 - '@deepseek-ai/dsh-commands@0.1.2-alpha.4': - resolution: {integrity: sha512-2zBu1iPcy/ctduaLcVaecjaYLOvJq96sFYGWFFGFQrTsNQddbhqZZ1ikzQu693Q0KNPmBVPYm/rzTySDDCiMxw==} + '@deepseek-ai/dsh-commands@0.1.2-alpha.5': + resolution: {integrity: sha512-Fjj8t+fIADqePo8BxHD+BZyw9jQQsRhJquxblgY3X3jrZrNUQan7N6pHAE0X70dnVmOaQ9zP+QAGXT9cVcL+lQ==} peerDependencies: '@deepseek-ai/cordis': ^4.0.2 - '@deepseek-ai/dsh-agent': ^0.1.2-alpha.4 - '@deepseek-ai/dsh-attachment': ^0.1.2-alpha.4 - '@deepseek-ai/dsh-brand': ^0.1.2-alpha.4 - '@deepseek-ai/dsh-invariants': ^0.1.2-alpha.4 - '@deepseek-ai/dsh-llm': ^0.1.2-alpha.4 - '@deepseek-ai/dsh-scope': ^0.1.2-alpha.4 - '@deepseek-ai/dsh-session': ^0.1.2-alpha.4 - '@deepseek-ai/dsh-typert-protocol': ^0.1.2-alpha.4 - - '@deepseek-ai/dsh-credentials@0.1.2-alpha.4': - resolution: {integrity: sha512-9yjUQqMrLrMo2ADWIZXtCRk0HQtgZM3uh8kuwjBvqmR6rEMa46u9HKaGo0t6+3NB7y1TQGVaQ7HnJeOvsm3alA==} + '@deepseek-ai/dsh-agent': ^0.1.2-alpha.5 + '@deepseek-ai/dsh-attachment': ^0.1.2-alpha.5 + '@deepseek-ai/dsh-brand': ^0.1.2-alpha.5 + '@deepseek-ai/dsh-invariants': ^0.1.2-alpha.5 + '@deepseek-ai/dsh-llm': ^0.1.2-alpha.5 + '@deepseek-ai/dsh-scope': ^0.1.2-alpha.5 + '@deepseek-ai/dsh-session': ^0.1.2-alpha.5 + '@deepseek-ai/dsh-typert-protocol': ^0.1.2-alpha.5 + + '@deepseek-ai/dsh-credentials@0.1.2-alpha.5': + resolution: {integrity: sha512-5Sq7h0qVqMMKdoUy7aBCUqAm/cmU/38Dm04hwctdqX9fMKUqL5KA87purx3j9vSsKjCgFs0wilbFGt/uAefllw==} peerDependencies: '@deepseek-ai/cordis': ^4.0.2 - '@deepseek-ai/dsh-invariants': ^0.1.2-alpha.4 + '@deepseek-ai/dsh-invariants': ^0.1.2-alpha.5 - '@deepseek-ai/dsh-fs@0.1.2-alpha.4': - resolution: {integrity: sha512-xcTEiMwOC7YW7uGwqmgPsmDtg2v1qNPj8k2VFmlwilrbBe4ACmPy0TVf1MehVpxazmMou/KiSulKCT8QnZA+eg==} + '@deepseek-ai/dsh-fs@0.1.2-alpha.5': + resolution: {integrity: sha512-32FkAo4q2gLNmIj+HfgQsdFOwSf5tlsUr11roDVuMFbPP/F6Hr3pQtos0mPgsRfUJqei3Fh4FrSkarSnsSdAUg==} peerDependencies: '@deepseek-ai/cordis': ^4.0.2 - '@deepseek-ai/dsh-brand': ^0.1.2-alpha.4 - '@deepseek-ai/dsh-invariants': ^0.1.2-alpha.4 - '@deepseek-ai/dsh-llm': ^0.1.2-alpha.4 - '@deepseek-ai/dsh-sandbox': ^0.1.2-alpha.4 + '@deepseek-ai/dsh-brand': ^0.1.2-alpha.5 + '@deepseek-ai/dsh-invariants': ^0.1.2-alpha.5 + '@deepseek-ai/dsh-llm': ^0.1.2-alpha.5 + '@deepseek-ai/dsh-sandbox': ^0.1.2-alpha.5 - '@deepseek-ai/dsh-home-paths@0.1.2-alpha.4': - resolution: {integrity: sha512-53VRRI5ToBNhEaRqsVLUNk3b4xQ95NgndPpz2PlDki61D0B0c8kX+wCmvskq3qdwhi+OB0gXaYLQ5FVulcNFYA==} + '@deepseek-ai/dsh-home-paths@0.1.2-alpha.5': + resolution: {integrity: sha512-QOydDkW0bbHoWWucsm442+HpX5qVuxxWPoxSzBw/vf0Wz+soSMFn9ZV+OVDiVCjpPe72Rd5VWr8Nrb71muS6Qw==} peerDependencies: '@deepseek-ai/cordis': ^4.0.2 - '@deepseek-ai/dsh-invariants@0.1.2-alpha.4': - resolution: {integrity: sha512-ZbnGBEN3zmsn2jTAnsOzK9Su3lLdkTyyE+HstP7amiuzq31WSDIICtWHaXj475V6NbYTUgyGCwG1GU0mD3zlLg==} + '@deepseek-ai/dsh-invariants@0.1.2-alpha.5': + resolution: {integrity: sha512-UC7rpUR3wAt0Ez3/uvY+pmdYb19SnrmAqHCMFzdiXxb+q/V5kHM26NYx57FlqaQf0LMhEds8Ek4BrHLe7xn0Rw==} peerDependencies: '@deepseek-ai/cordis': ^4.0.2 - '@deepseek-ai/dsh-llm@0.1.2-alpha.4': - resolution: {integrity: sha512-8tghHvYdUswCh3EkI5tVaHvsxnbQiK/tICB1RLr7Zx7wMkODECjKg/pN8n77idO1xg6YQTy4jmggkW7cbjjEcg==} + '@deepseek-ai/dsh-llm@0.1.2-alpha.5': + resolution: {integrity: sha512-po0FJyAmOQM/pUUR3eIOPdM4aDODAt9NvS8p8/Y0PJ7gvisRYL4oqXyEk8y9nbryfEnNJNSOaxv/maBdmeHpGQ==} peerDependencies: '@deepseek-ai/cordis': ^4.0.2 - '@deepseek-ai/dsh-mcp-client@0.1.2-alpha.4': - resolution: {integrity: sha512-r2ZRqN7csgwHYukOgREcLDRzbZaqgyDEV1FTUXu+2Z7uLng05gJj/1KNxPN1VYJFiX/OMKJ4r/X95Lt5Nm3hzw==} + '@deepseek-ai/dsh-mcp-client@0.1.2-alpha.5': + resolution: {integrity: sha512-jmKN/ECYM6Y9R9yU+v8oAAbuju+nHl7BTkUgaqqkMTPBFM0E6XrdMXY3bwLKKlazxOx3hlHVpHV3nAmR64/19w==} peerDependencies: '@deepseek-ai/cordis': ^4.0.2 - '@deepseek-ai/dsh-attachment': ^0.1.2-alpha.4 - '@deepseek-ai/dsh-llm': ^0.1.2-alpha.4 - '@deepseek-ai/dsh-scope': ^0.1.2-alpha.4 - '@deepseek-ai/dsh-subprocess': ^0.1.2-alpha.4 - '@deepseek-ai/dsh-timeout': ^0.1.2-alpha.4 - '@deepseek-ai/dsh-tools': ^0.1.2-alpha.4 - - '@deepseek-ai/dsh-sandbox@0.1.2-alpha.4': - resolution: {integrity: sha512-FB2BBHlJi/+yTx/fL0ERvNjSLtnXJkLd0gm208AA9YQQlsG6D4+FWe2j0IOWZh5sIGcwSI4F8J4vF+dJd/qoHg==} + '@deepseek-ai/dsh-attachment': ^0.1.2-alpha.5 + '@deepseek-ai/dsh-llm': ^0.1.2-alpha.5 + '@deepseek-ai/dsh-scope': ^0.1.2-alpha.5 + '@deepseek-ai/dsh-subprocess': ^0.1.2-alpha.5 + '@deepseek-ai/dsh-timeout': ^0.1.2-alpha.5 + '@deepseek-ai/dsh-tools': ^0.1.2-alpha.5 + + '@deepseek-ai/dsh-sandbox@0.1.2-alpha.5': + resolution: {integrity: sha512-UR+uthY+pP/HS7DahkNwnpt0Yg+0ZOegw8gv9vdIYpeQi2CLlt0BI9mC5zwKapNcyYvIXeGijW8ZhgTrtu9myQ==} peerDependencies: '@deepseek-ai/cordis': ^4.0.2 - '@deepseek-ai/dsh-llm': ^0.1.2-alpha.4 - '@deepseek-ai/dsh-session': ^0.1.2-alpha.4 + '@deepseek-ai/dsh-llm': ^0.1.2-alpha.5 + '@deepseek-ai/dsh-session': ^0.1.2-alpha.5 - '@deepseek-ai/dsh-scope@0.1.2-alpha.4': - resolution: {integrity: sha512-rrnlf/lU43C6tgWEUBD3hAUIT8Sgw+CQUAb5RsHzIAcLXLkMpuUxZewRGzkWzjUxLJILZCSRMzxlcPtLdEks+w==} + '@deepseek-ai/dsh-scope@0.1.2-alpha.5': + resolution: {integrity: sha512-uWPbN6//COBRgjQZkp09h3A2A4vBBFr/VE2TdZ9epdiroSa5l6QByyPGXi5i6gCPj5pB8q1TXIqhzyhr/CUGig==} peerDependencies: '@deepseek-ai/cordis': ^4.0.2 - '@deepseek-ai/dsh-invariants': ^0.1.2-alpha.4 + '@deepseek-ai/dsh-invariants': ^0.1.2-alpha.5 - '@deepseek-ai/dsh-session-projection@0.1.2-alpha.4': - resolution: {integrity: sha512-cjS896eQEyPxVY5Q/79Y/1T05dNDVg9Z/9eO+5iVbszcSBVqJUVtHXzyLpAlg76Go+dTEq5TbzmP6qOlLVE6+w==} + '@deepseek-ai/dsh-session-projection@0.1.2-alpha.5': + resolution: {integrity: sha512-2N+TOFGy1zxEc4OrJJ7pHdDrHQo5OqJ+/KlBIWoI93m9uSK9iOzYn/DWSsqh2x0WPGEeeDz9AZ4IKw7tXYK7Aw==} peerDependencies: '@deepseek-ai/cordis': ^4.0.2 - '@deepseek-ai/dsh-session': ^0.1.2-alpha.4 + '@deepseek-ai/dsh-session': ^0.1.2-alpha.5 - '@deepseek-ai/dsh-session-turn-outline@0.1.2-alpha.4': - resolution: {integrity: sha512-N7oQo1RquU/WzQu0Ml7fpe6HRtePQ9hdBbr6ioxlKP4k5sYDDkxTpkpwI97jSutXE+swcsZ2IbQVMqug0Qqe9w==} + '@deepseek-ai/dsh-session-turn-outline@0.1.2-alpha.5': + resolution: {integrity: sha512-z9hzmjPzeZG5ALJLJibbnqaHVdHMzEAGrebR5Lnz5Bj0qmEkY0m4LNdy1WnCqa9jptZAJGwcBFdH8FTNI3iuJQ==} peerDependencies: '@deepseek-ai/cordis': ^4.0.2 - '@deepseek-ai/dsh-llm': ^0.1.2-alpha.4 - '@deepseek-ai/dsh-session': ^0.1.2-alpha.4 - '@deepseek-ai/dsh-session-projection': ^0.1.2-alpha.4 + '@deepseek-ai/dsh-llm': ^0.1.2-alpha.5 + '@deepseek-ai/dsh-session': ^0.1.2-alpha.5 + '@deepseek-ai/dsh-session-projection': ^0.1.2-alpha.5 - '@deepseek-ai/dsh-session@0.1.2-alpha.4': - resolution: {integrity: sha512-QuW/7RJILAHPP4HY8ESggRPaa1DoJb11ElNGSm9XpFvnGZk81jxcmR3ab/vniloWyx7PdMMtkJf2Z/mui6sN3g==} + '@deepseek-ai/dsh-session@0.1.2-alpha.5': + resolution: {integrity: sha512-GOjXnU82ROSKZxPi765EvbNC5b5zsKajY+r1UpDVLrvLJO9lqLMFAc2SgO9M0kFl6DYHV2j5L7yAemajTDqqAA==} peerDependencies: '@deepseek-ai/cordis': ^4.0.2 - '@deepseek-ai/dsh-scope': ^0.1.2-alpha.4 + '@deepseek-ai/dsh-scope': ^0.1.2-alpha.5 - '@deepseek-ai/dsh-settings@0.1.2-alpha.4': - resolution: {integrity: sha512-xGQg3sqFJmlg2Vl0u6C6EPX+Bf9EjQkyGLY4zSwEPwgoZqyjjHLBOvtkD0PibKSjLvi3wc6q5RTztJqZX5HPVw==} + '@deepseek-ai/dsh-settings@0.1.2-alpha.5': + resolution: {integrity: sha512-XWHV/Bi5l+v+HFaOyCrBCUVRwoCfvCvyWppBkct5zp7RAtJDv15V0aBHaLnlAHkdIlaq4+QYH1F2S+pW35xuKA==} peerDependencies: '@deepseek-ai/cordis': ^4.0.2 - '@deepseek-ai/dsh-brand': ^0.1.2-alpha.4 - '@deepseek-ai/dsh-invariants': ^0.1.2-alpha.4 - '@deepseek-ai/dsh-session': ^0.1.2-alpha.4 + '@deepseek-ai/dsh-brand': ^0.1.2-alpha.5 + '@deepseek-ai/dsh-invariants': ^0.1.2-alpha.5 + '@deepseek-ai/dsh-session': ^0.1.2-alpha.5 '@deepseek-ai/schemastery': ^3.18.2 - '@deepseek-ai/dsh-skill-filesystem@0.1.2-alpha.4': - resolution: {integrity: sha512-ATXJUxiGDNfPW6QelOawdyemp5skG7ZYNhPer4CGGTFE4Effp8mJkyDFQPmu57DF5EAAZzs62cOiwgdigW/f/Q==} + '@deepseek-ai/dsh-skill-filesystem@0.1.2-alpha.5': + resolution: {integrity: sha512-WsEhfk/Qvyhc+lLf6SGQ61QKDF/ltpKnn3X1SNTEDIB8I/nO4h7vCBV7kFuim7shRBVdJhdUiS3xefP8ucK8rg==} peerDependencies: '@deepseek-ai/cordis': ^4.0.2 - '@deepseek-ai/dsh-fs': ^0.1.2-alpha.4 - '@deepseek-ai/dsh-home-paths': ^0.1.2-alpha.4 - '@deepseek-ai/dsh-skill': ^0.1.2-alpha.4 + '@deepseek-ai/dsh-fs': ^0.1.2-alpha.5 + '@deepseek-ai/dsh-home-paths': ^0.1.2-alpha.5 + '@deepseek-ai/dsh-skill': ^0.1.2-alpha.5 - '@deepseek-ai/dsh-skill@0.1.2-alpha.4': - resolution: {integrity: sha512-0s3ze+k8uVuz3UbKqtDLzotej7y71leNMkA+gqfxuIhoyOcc2iUMJ1b2zrHMc3Wa8S1BDWNuEHiQnZHbv4fT0A==} + '@deepseek-ai/dsh-skill@0.1.2-alpha.5': + resolution: {integrity: sha512-UpcuOBSU8NkMW/rasKybUF95T/XEB0FjLD0Pzcj/cA8s2fFsCLi3K+qsJ1Rkg+aSDQhFKzTWf6jiyiIhlQFmUA==} peerDependencies: '@deepseek-ai/cordis': ^4.0.2 - '@deepseek-ai/dsh-llm': ^0.1.2-alpha.4 - '@deepseek-ai/dsh-scope': ^0.1.2-alpha.4 + '@deepseek-ai/dsh-llm': ^0.1.2-alpha.5 + '@deepseek-ai/dsh-scope': ^0.1.2-alpha.5 - '@deepseek-ai/dsh-subprocess@0.1.2-alpha.4': - resolution: {integrity: sha512-GCcnoRV0ul9zg0JEThttrhJK+KhK+OWrSP+YrUSj6WQiugqdPOza+yvyzP6+5mrz1XZsZ/dqQ6lPvmiWUyNPsw==} + '@deepseek-ai/dsh-subprocess@0.1.2-alpha.5': + resolution: {integrity: sha512-mjnF4tJnMMJBYqEt5LnMVaTF3TWjwx/aZSDE5IHkF6kGFD82DqB21cw1QaUH5yT063osyLSr6wNLlu3ZyMD1ww==} peerDependencies: '@deepseek-ai/cordis': ^4.0.2 - '@deepseek-ai/dsh-system-prompt@0.1.2-alpha.4': - resolution: {integrity: sha512-/jqTJFxRO+Ms6Ud4TvZY3RrLfAPGTMi38jPYmp+It1YRo21KxVT4vxGRalYbyXg/4ORC80CI8QzxelJKqekeVg==} + '@deepseek-ai/dsh-system-prompt@0.1.2-alpha.5': + resolution: {integrity: sha512-SBg0hQB+0ulXHZZ6tFQcvieZzpI9/z9ij7pkrpj2AX7EbZbLfa+vVn0NG6lfGz4ZWpoMDzlVBAbXJqyda/8W1g==} peerDependencies: '@deepseek-ai/cordis': ^4.0.2 - '@deepseek-ai/dsh-invariants': ^0.1.2-alpha.4 - '@deepseek-ai/dsh-llm': ^0.1.2-alpha.4 - '@deepseek-ai/dsh-scope': ^0.1.2-alpha.4 + '@deepseek-ai/dsh-invariants': ^0.1.2-alpha.5 + '@deepseek-ai/dsh-llm': ^0.1.2-alpha.5 + '@deepseek-ai/dsh-scope': ^0.1.2-alpha.5 - '@deepseek-ai/dsh-timeout@0.1.2-alpha.4': - resolution: {integrity: sha512-axL9FrDFCP2APEioIMg8mBG/2erU1eXZpD8wBPobtEpnKiVcEvHvyGTT5BhHCQG8KO1YdnT8txPZZ4+RVxAm6A==} + '@deepseek-ai/dsh-timeout@0.1.2-alpha.5': + resolution: {integrity: sha512-CRz+ssho5Qi4hdw1lh/ISeegvbcIkG0tZgjgkMGrhtkSQcXJQRn0qCHU0apYk+lEsTZLooEsNGXEoHStMDc8LQ==} peerDependencies: '@deepseek-ai/cordis': ^4.0.2 - '@deepseek-ai/dsh-tools@0.1.2-alpha.4': - resolution: {integrity: sha512-h5BuVzCETKY3U6nEx4B9lc2jz7+5aAn2ewQDksrJlN2Q1Bz5BwKZx85Q/JdICR5i8el89JNo4sUPDOg0HjBYHA==} + '@deepseek-ai/dsh-tools@0.1.2-alpha.5': + resolution: {integrity: sha512-ay1dNbDawfphNgHBIpewesNp46Bl4c9iAB4Ul+nzjhTozULbLbKbHfN6RPhvk4dfnoYjXKeMU4gOTNP1Tr3vNA==} peerDependencies: '@deepseek-ai/cordis': ^4.0.2 - '@deepseek-ai/dsh-agent': ^0.1.2-alpha.4 - '@deepseek-ai/dsh-code-runtime': ^0.1.2-alpha.4 - '@deepseek-ai/dsh-invariants': ^0.1.2-alpha.4 - '@deepseek-ai/dsh-llm': ^0.1.2-alpha.4 - '@deepseek-ai/dsh-scope': ^0.1.2-alpha.4 - '@deepseek-ai/dsh-session': ^0.1.2-alpha.4 - '@deepseek-ai/dsh-system-prompt': ^0.1.2-alpha.4 - '@deepseek-ai/dsh-user-approval': ^0.1.2-alpha.4 - - '@deepseek-ai/dsh-typert-protocol@0.1.2-alpha.4': - resolution: {integrity: sha512-NCkPCpZUDiYOLPQzdvxMgBQ9HTCl56leL+dbkuvsFU3IgKFdA7b0iW+P40/LuqPeg4RBOs1rL6GJTft/Mye3Tg==} + '@deepseek-ai/dsh-agent': ^0.1.2-alpha.5 + '@deepseek-ai/dsh-code-runtime': ^0.1.2-alpha.5 + '@deepseek-ai/dsh-invariants': ^0.1.2-alpha.5 + '@deepseek-ai/dsh-llm': ^0.1.2-alpha.5 + '@deepseek-ai/dsh-scope': ^0.1.2-alpha.5 + '@deepseek-ai/dsh-session': ^0.1.2-alpha.5 + '@deepseek-ai/dsh-system-prompt': ^0.1.2-alpha.5 + '@deepseek-ai/dsh-user-approval': ^0.1.2-alpha.5 + + '@deepseek-ai/dsh-typert-protocol@0.1.2-alpha.5': + resolution: {integrity: sha512-9+THodbDJuRCa5PF5sglO+aDCKyCmDmKNlg7VqMflUcmudSdGfcGteivgNXxKaQkYncL4DbYwqRsw5S0/iHeHw==} peerDependencies: '@deepseek-ai/cordis': ^4.0.2 - '@deepseek-ai/dsh-user-approval@0.1.2-alpha.4': - resolution: {integrity: sha512-Hd8pPBuZ4dX1I2BXkUwDkR1B+Re2lg3g/SuwzXkrFlU1EBSAJ5K8Q1W5quz95uY3JYJmErL0WjJfZ3ynuZSTQQ==} + '@deepseek-ai/dsh-user-approval@0.1.2-alpha.5': + resolution: {integrity: sha512-9TwAwI3JKCrz7iLahO58RWZHieNG0pNMrDdXQjoahDxmKBo0jfk/w9J0Fxh8o9ZPiIdyXR1dr2JvLJjucp6qeA==} peerDependencies: '@deepseek-ai/cordis': ^4.0.2 - '@deepseek-ai/dsh-agent': ^0.1.2-alpha.4 - '@deepseek-ai/dsh-brand': ^0.1.2-alpha.4 - '@deepseek-ai/dsh-invariants': ^0.1.2-alpha.4 - '@deepseek-ai/dsh-llm': ^0.1.2-alpha.4 - '@deepseek-ai/dsh-scope': ^0.1.2-alpha.4 - '@deepseek-ai/dsh-session': ^0.1.2-alpha.4 - '@deepseek-ai/dsh-system-prompt': ^0.1.2-alpha.4 - - '@deepseek-ai/dsh-util-crypto@0.1.2-alpha.4': - resolution: {integrity: sha512-GqISEjIJ/TGuM2K/Aw/fPAX6OslszupZaFEHGB5GQB2+JGV5+gq9sombjQbqr/BKemjXbAZp3i8P7ImPq989Pg==} + '@deepseek-ai/dsh-agent': ^0.1.2-alpha.5 + '@deepseek-ai/dsh-brand': ^0.1.2-alpha.5 + '@deepseek-ai/dsh-invariants': ^0.1.2-alpha.5 + '@deepseek-ai/dsh-llm': ^0.1.2-alpha.5 + '@deepseek-ai/dsh-scope': ^0.1.2-alpha.5 + '@deepseek-ai/dsh-session': ^0.1.2-alpha.5 + '@deepseek-ai/dsh-system-prompt': ^0.1.2-alpha.5 + + '@deepseek-ai/dsh-util-crypto@0.1.2-alpha.5': + resolution: {integrity: sha512-E7MnetX+Gt1DuIkf2mrGfoF/yFGzyvueDJxLX7SdiCr1CEZ2z24dz5I0NkU4k1I4XkCMmt6QbbaGfmCcqCFdUw==} peerDependencies: '@deepseek-ai/cordis': ^4.0.2 - '@deepseek-ai/dsh-util-values@0.1.2-alpha.4': - resolution: {integrity: sha512-4V0Q4Qv5RH+vfrj0q2U1ZqAfkidJbONjwRJzKLKFy3SjbRPVde2LdIdWv3ygUFNuT/kuvkvVnzX8Tc2ozGLITA==} + '@deepseek-ai/dsh-util-values@0.1.2-alpha.5': + resolution: {integrity: sha512-1rhtBUw5exfiuws3MkpXU07k0wcdV9tFSGf6FrUoFrD0KzqLUN5N3lNrgL8BDjRml9ihtYh/3i0pJhfuEvZ+7w==} peerDependencies: '@deepseek-ai/cordis': ^4.0.2 @@ -2455,41 +2458,41 @@ snapshots: '@deepseek-ai/cosmokit@1.8.3': {} - '@deepseek-ai/dsh-agent@0.1.2-alpha.4(c5cc672bd5ee417388896b008bce4ee7)': + '@deepseek-ai/dsh-agent@0.1.2-alpha.5(fa501c54d1bae9af3acbbd6956a25b22)': dependencies: '@deepseek-ai/cordis': 4.0.2 - '@deepseek-ai/dsh-invariants': 0.1.2-alpha.4(@deepseek-ai/cordis@4.0.2) - '@deepseek-ai/dsh-llm': 0.1.2-alpha.4(@deepseek-ai/cordis@4.0.2) - '@deepseek-ai/dsh-scope': 0.1.2-alpha.4(@deepseek-ai/cordis@4.0.2)(@deepseek-ai/dsh-invariants@0.1.2-alpha.4(@deepseek-ai/cordis@4.0.2)) - '@deepseek-ai/dsh-session': 0.1.2-alpha.4(@deepseek-ai/cordis@4.0.2)(@deepseek-ai/dsh-scope@0.1.2-alpha.4(@deepseek-ai/cordis@4.0.2)(@deepseek-ai/dsh-invariants@0.1.2-alpha.4(@deepseek-ai/cordis@4.0.2))) - '@deepseek-ai/dsh-session-projection': 0.1.2-alpha.4(@deepseek-ai/cordis@4.0.2)(@deepseek-ai/dsh-session@0.1.2-alpha.4(@deepseek-ai/cordis@4.0.2)(@deepseek-ai/dsh-scope@0.1.2-alpha.4(@deepseek-ai/cordis@4.0.2)(@deepseek-ai/dsh-invariants@0.1.2-alpha.4(@deepseek-ai/cordis@4.0.2)))) - '@deepseek-ai/dsh-system-prompt': 0.1.2-alpha.4(@deepseek-ai/cordis@4.0.2)(@deepseek-ai/dsh-invariants@0.1.2-alpha.4(@deepseek-ai/cordis@4.0.2))(@deepseek-ai/dsh-llm@0.1.2-alpha.4(@deepseek-ai/cordis@4.0.2))(@deepseek-ai/dsh-scope@0.1.2-alpha.4(@deepseek-ai/cordis@4.0.2)(@deepseek-ai/dsh-invariants@0.1.2-alpha.4(@deepseek-ai/cordis@4.0.2))) - '@deepseek-ai/dsh-typert-protocol': 0.1.2-alpha.4(@deepseek-ai/cordis@4.0.2) + '@deepseek-ai/dsh-invariants': 0.1.2-alpha.5(@deepseek-ai/cordis@4.0.2) + '@deepseek-ai/dsh-llm': 0.1.2-alpha.5(@deepseek-ai/cordis@4.0.2) + '@deepseek-ai/dsh-scope': 0.1.2-alpha.5(@deepseek-ai/cordis@4.0.2)(@deepseek-ai/dsh-invariants@0.1.2-alpha.5(@deepseek-ai/cordis@4.0.2)) + '@deepseek-ai/dsh-session': 0.1.2-alpha.5(@deepseek-ai/cordis@4.0.2)(@deepseek-ai/dsh-scope@0.1.2-alpha.5(@deepseek-ai/cordis@4.0.2)(@deepseek-ai/dsh-invariants@0.1.2-alpha.5(@deepseek-ai/cordis@4.0.2))) + '@deepseek-ai/dsh-session-projection': 0.1.2-alpha.5(@deepseek-ai/cordis@4.0.2)(@deepseek-ai/dsh-session@0.1.2-alpha.5(@deepseek-ai/cordis@4.0.2)(@deepseek-ai/dsh-scope@0.1.2-alpha.5(@deepseek-ai/cordis@4.0.2)(@deepseek-ai/dsh-invariants@0.1.2-alpha.5(@deepseek-ai/cordis@4.0.2)))) + '@deepseek-ai/dsh-system-prompt': 0.1.2-alpha.5(@deepseek-ai/cordis@4.0.2)(@deepseek-ai/dsh-invariants@0.1.2-alpha.5(@deepseek-ai/cordis@4.0.2))(@deepseek-ai/dsh-llm@0.1.2-alpha.5(@deepseek-ai/cordis@4.0.2))(@deepseek-ai/dsh-scope@0.1.2-alpha.5(@deepseek-ai/cordis@4.0.2)(@deepseek-ai/dsh-invariants@0.1.2-alpha.5(@deepseek-ai/cordis@4.0.2))) + '@deepseek-ai/dsh-typert-protocol': 0.1.2-alpha.5(@deepseek-ai/cordis@4.0.2) - '@deepseek-ai/dsh-attachment@0.1.2-alpha.4(@deepseek-ai/cordis@4.0.2)(@deepseek-ai/dsh-brand@0.1.2-alpha.4(@deepseek-ai/cordis@4.0.2))': + '@deepseek-ai/dsh-attachment@0.1.2-alpha.5(@deepseek-ai/cordis@4.0.2)(@deepseek-ai/dsh-brand@0.1.2-alpha.5(@deepseek-ai/cordis@4.0.2))': dependencies: '@deepseek-ai/cordis': 4.0.2 - '@deepseek-ai/dsh-brand': 0.1.2-alpha.4(@deepseek-ai/cordis@4.0.2) + '@deepseek-ai/dsh-brand': 0.1.2-alpha.5(@deepseek-ai/cordis@4.0.2) - '@deepseek-ai/dsh-brand@0.1.2-alpha.4(@deepseek-ai/cordis@4.0.2)': + '@deepseek-ai/dsh-brand@0.1.2-alpha.5(@deepseek-ai/cordis@4.0.2)': dependencies: '@deepseek-ai/cordis': 4.0.2 - '@deepseek-ai/dsh-client-connection@0.1.2-alpha.4(@deepseek-ai/cordis@4.0.2)(@deepseek-ai/dsh-invariants@0.1.2-alpha.4(@deepseek-ai/cordis@4.0.2))': + '@deepseek-ai/dsh-client-connection@0.1.2-alpha.5(@deepseek-ai/cordis@4.0.2)(@deepseek-ai/dsh-invariants@0.1.2-alpha.5(@deepseek-ai/cordis@4.0.2))': dependencies: '@deepseek-ai/cordis': 4.0.2 - '@deepseek-ai/dsh-credentials': 0.1.2-alpha.4(@deepseek-ai/cordis@4.0.2)(@deepseek-ai/dsh-invariants@0.1.2-alpha.4(@deepseek-ai/cordis@4.0.2)) + '@deepseek-ai/dsh-credentials': 0.1.2-alpha.5(@deepseek-ai/cordis@4.0.2)(@deepseek-ai/dsh-invariants@0.1.2-alpha.5(@deepseek-ai/cordis@4.0.2)) '@deepseek-ai/schemastery': 3.18.2 zod: 4.4.3 transitivePeerDependencies: - '@deepseek-ai/dsh-invariants' - '@deepseek-ai/dsh-client-locale@0.1.2-alpha.4(@deepseek-ai/cordis@4.0.2)': + '@deepseek-ai/dsh-client-locale@0.1.2-alpha.5(@deepseek-ai/cordis@4.0.2)': dependencies: '@deepseek-ai/cordis': 4.0.2 '@deepseek-ai/schemastery': 3.18.2 - '@deepseek-ai/dsh-client-store@0.1.2-alpha.4(@deepseek-ai/cordis@4.0.2)(@types/react@18.3.31)(react@18.3.1)': + '@deepseek-ai/dsh-client-store@0.1.2-alpha.5(@deepseek-ai/cordis@4.0.2)(@types/react@18.3.31)(react@18.3.1)': dependencies: '@deepseek-ai/cordis': 4.0.2 immer: 10.2.0 @@ -2498,11 +2501,11 @@ snapshots: - '@types/react' - react - '@deepseek-ai/dsh-client-ui-layout@0.1.2-alpha.4(@deepseek-ai/cordis@4.0.2)': + '@deepseek-ai/dsh-client-ui-layout@0.1.2-alpha.5(@deepseek-ai/cordis@4.0.2)': dependencies: '@deepseek-ai/cordis': 4.0.2 - '@deepseek-ai/dsh-client-ui-primitives@0.1.2-alpha.4(@deepseek-ai/cordis@4.0.2)': + '@deepseek-ai/dsh-client-ui-primitives@0.1.2-alpha.5(@deepseek-ai/cordis@4.0.2)': dependencies: '@deepseek-ai/cordis': 4.0.2 '@shikijs/langs': 4.4.3 @@ -2528,92 +2531,92 @@ snapshots: transitivePeerDependencies: - supports-color - '@deepseek-ai/dsh-client-ui-renderer@0.1.2-alpha.4(@deepseek-ai/cordis@4.0.2)(react@18.3.1)': + '@deepseek-ai/dsh-client-ui-renderer@0.1.2-alpha.5(@deepseek-ai/cordis@4.0.2)(react@18.3.1)': dependencies: '@deepseek-ai/cordis': 4.0.2 use-sync-external-store: 1.2.0(react@18.3.1) transitivePeerDependencies: - react - '@deepseek-ai/dsh-client-ui-settings-plugins@0.1.2-alpha.4(@deepseek-ai/cordis@4.0.2)': + '@deepseek-ai/dsh-client-ui-settings-plugins@0.1.2-alpha.5(@deepseek-ai/cordis@4.0.2)': dependencies: '@deepseek-ai/cordis': 4.0.2 clsx: 2.1.1 - '@deepseek-ai/dsh-client-ui-settings@0.1.2-alpha.4(@deepseek-ai/cordis@4.0.2)': + '@deepseek-ai/dsh-client-ui-settings@0.1.2-alpha.5(@deepseek-ai/cordis@4.0.2)': dependencies: '@deepseek-ai/cordis': 4.0.2 - '@deepseek-ai/dsh-client-ui-sidebar@0.1.2-alpha.4(@deepseek-ai/cordis@4.0.2)': + '@deepseek-ai/dsh-client-ui-sidebar@0.1.2-alpha.5(@deepseek-ai/cordis@4.0.2)': dependencies: '@deepseek-ai/cordis': 4.0.2 clsx: 2.1.1 - '@deepseek-ai/dsh-client-ui-slots@0.1.2-alpha.4(@deepseek-ai/cordis@4.0.2)': + '@deepseek-ai/dsh-client-ui-slots@0.1.2-alpha.5(@deepseek-ai/cordis@4.0.2)': dependencies: '@deepseek-ai/cordis': 4.0.2 - '@deepseek-ai/dsh-code-runtime@0.1.2-alpha.4(@deepseek-ai/cordis@4.0.2)': + '@deepseek-ai/dsh-code-runtime@0.1.2-alpha.5(@deepseek-ai/cordis@4.0.2)': dependencies: '@deepseek-ai/cordis': 4.0.2 - '@deepseek-ai/dsh-commands@0.1.2-alpha.4(@deepseek-ai/cordis@4.0.2)(@deepseek-ai/dsh-agent@0.1.2-alpha.4(c5cc672bd5ee417388896b008bce4ee7))(@deepseek-ai/dsh-attachment@0.1.2-alpha.4(@deepseek-ai/cordis@4.0.2)(@deepseek-ai/dsh-brand@0.1.2-alpha.4(@deepseek-ai/cordis@4.0.2)))(@deepseek-ai/dsh-brand@0.1.2-alpha.4(@deepseek-ai/cordis@4.0.2))(@deepseek-ai/dsh-invariants@0.1.2-alpha.4(@deepseek-ai/cordis@4.0.2))(@deepseek-ai/dsh-llm@0.1.2-alpha.4(@deepseek-ai/cordis@4.0.2))(@deepseek-ai/dsh-scope@0.1.2-alpha.4(@deepseek-ai/cordis@4.0.2)(@deepseek-ai/dsh-invariants@0.1.2-alpha.4(@deepseek-ai/cordis@4.0.2)))(@deepseek-ai/dsh-session@0.1.2-alpha.4(@deepseek-ai/cordis@4.0.2)(@deepseek-ai/dsh-scope@0.1.2-alpha.4(@deepseek-ai/cordis@4.0.2)(@deepseek-ai/dsh-invariants@0.1.2-alpha.4(@deepseek-ai/cordis@4.0.2))))(@deepseek-ai/dsh-typert-protocol@0.1.2-alpha.4(@deepseek-ai/cordis@4.0.2))': + '@deepseek-ai/dsh-commands@0.1.2-alpha.5(@deepseek-ai/cordis@4.0.2)(@deepseek-ai/dsh-agent@0.1.2-alpha.5(fa501c54d1bae9af3acbbd6956a25b22))(@deepseek-ai/dsh-attachment@0.1.2-alpha.5(@deepseek-ai/cordis@4.0.2)(@deepseek-ai/dsh-brand@0.1.2-alpha.5(@deepseek-ai/cordis@4.0.2)))(@deepseek-ai/dsh-brand@0.1.2-alpha.5(@deepseek-ai/cordis@4.0.2))(@deepseek-ai/dsh-invariants@0.1.2-alpha.5(@deepseek-ai/cordis@4.0.2))(@deepseek-ai/dsh-llm@0.1.2-alpha.5(@deepseek-ai/cordis@4.0.2))(@deepseek-ai/dsh-scope@0.1.2-alpha.5(@deepseek-ai/cordis@4.0.2)(@deepseek-ai/dsh-invariants@0.1.2-alpha.5(@deepseek-ai/cordis@4.0.2)))(@deepseek-ai/dsh-session@0.1.2-alpha.5(@deepseek-ai/cordis@4.0.2)(@deepseek-ai/dsh-scope@0.1.2-alpha.5(@deepseek-ai/cordis@4.0.2)(@deepseek-ai/dsh-invariants@0.1.2-alpha.5(@deepseek-ai/cordis@4.0.2))))(@deepseek-ai/dsh-typert-protocol@0.1.2-alpha.5(@deepseek-ai/cordis@4.0.2))': dependencies: '@deepseek-ai/cordis': 4.0.2 - '@deepseek-ai/dsh-agent': 0.1.2-alpha.4(c5cc672bd5ee417388896b008bce4ee7) - '@deepseek-ai/dsh-attachment': 0.1.2-alpha.4(@deepseek-ai/cordis@4.0.2)(@deepseek-ai/dsh-brand@0.1.2-alpha.4(@deepseek-ai/cordis@4.0.2)) - '@deepseek-ai/dsh-brand': 0.1.2-alpha.4(@deepseek-ai/cordis@4.0.2) - '@deepseek-ai/dsh-invariants': 0.1.2-alpha.4(@deepseek-ai/cordis@4.0.2) - '@deepseek-ai/dsh-llm': 0.1.2-alpha.4(@deepseek-ai/cordis@4.0.2) - '@deepseek-ai/dsh-scope': 0.1.2-alpha.4(@deepseek-ai/cordis@4.0.2)(@deepseek-ai/dsh-invariants@0.1.2-alpha.4(@deepseek-ai/cordis@4.0.2)) - '@deepseek-ai/dsh-session': 0.1.2-alpha.4(@deepseek-ai/cordis@4.0.2)(@deepseek-ai/dsh-scope@0.1.2-alpha.4(@deepseek-ai/cordis@4.0.2)(@deepseek-ai/dsh-invariants@0.1.2-alpha.4(@deepseek-ai/cordis@4.0.2))) - '@deepseek-ai/dsh-typert-protocol': 0.1.2-alpha.4(@deepseek-ai/cordis@4.0.2) - '@deepseek-ai/dsh-util-crypto': 0.1.2-alpha.4(@deepseek-ai/cordis@4.0.2) + '@deepseek-ai/dsh-agent': 0.1.2-alpha.5(fa501c54d1bae9af3acbbd6956a25b22) + '@deepseek-ai/dsh-attachment': 0.1.2-alpha.5(@deepseek-ai/cordis@4.0.2)(@deepseek-ai/dsh-brand@0.1.2-alpha.5(@deepseek-ai/cordis@4.0.2)) + '@deepseek-ai/dsh-brand': 0.1.2-alpha.5(@deepseek-ai/cordis@4.0.2) + '@deepseek-ai/dsh-invariants': 0.1.2-alpha.5(@deepseek-ai/cordis@4.0.2) + '@deepseek-ai/dsh-llm': 0.1.2-alpha.5(@deepseek-ai/cordis@4.0.2) + '@deepseek-ai/dsh-scope': 0.1.2-alpha.5(@deepseek-ai/cordis@4.0.2)(@deepseek-ai/dsh-invariants@0.1.2-alpha.5(@deepseek-ai/cordis@4.0.2)) + '@deepseek-ai/dsh-session': 0.1.2-alpha.5(@deepseek-ai/cordis@4.0.2)(@deepseek-ai/dsh-scope@0.1.2-alpha.5(@deepseek-ai/cordis@4.0.2)(@deepseek-ai/dsh-invariants@0.1.2-alpha.5(@deepseek-ai/cordis@4.0.2))) + '@deepseek-ai/dsh-typert-protocol': 0.1.2-alpha.5(@deepseek-ai/cordis@4.0.2) + '@deepseek-ai/dsh-util-crypto': 0.1.2-alpha.5(@deepseek-ai/cordis@4.0.2) zod: 4.4.3 - '@deepseek-ai/dsh-credentials@0.1.2-alpha.4(@deepseek-ai/cordis@4.0.2)(@deepseek-ai/dsh-invariants@0.1.2-alpha.4(@deepseek-ai/cordis@4.0.2))': + '@deepseek-ai/dsh-credentials@0.1.2-alpha.5(@deepseek-ai/cordis@4.0.2)(@deepseek-ai/dsh-invariants@0.1.2-alpha.5(@deepseek-ai/cordis@4.0.2))': dependencies: '@deepseek-ai/cordis': 4.0.2 - '@deepseek-ai/dsh-brand': 0.1.2-alpha.4(@deepseek-ai/cordis@4.0.2) - '@deepseek-ai/dsh-invariants': 0.1.2-alpha.4(@deepseek-ai/cordis@4.0.2) + '@deepseek-ai/dsh-brand': 0.1.2-alpha.5(@deepseek-ai/cordis@4.0.2) + '@deepseek-ai/dsh-invariants': 0.1.2-alpha.5(@deepseek-ai/cordis@4.0.2) - '@deepseek-ai/dsh-fs@0.1.2-alpha.4(@deepseek-ai/cordis@4.0.2)(@deepseek-ai/dsh-brand@0.1.2-alpha.4(@deepseek-ai/cordis@4.0.2))(@deepseek-ai/dsh-invariants@0.1.2-alpha.4(@deepseek-ai/cordis@4.0.2))(@deepseek-ai/dsh-llm@0.1.2-alpha.4(@deepseek-ai/cordis@4.0.2))(@deepseek-ai/dsh-sandbox@0.1.2-alpha.4(@deepseek-ai/cordis@4.0.2)(@deepseek-ai/dsh-llm@0.1.2-alpha.4(@deepseek-ai/cordis@4.0.2))(@deepseek-ai/dsh-session@0.1.2-alpha.4(@deepseek-ai/cordis@4.0.2)(@deepseek-ai/dsh-scope@0.1.2-alpha.4(@deepseek-ai/cordis@4.0.2)(@deepseek-ai/dsh-invariants@0.1.2-alpha.4(@deepseek-ai/cordis@4.0.2)))))': + '@deepseek-ai/dsh-fs@0.1.2-alpha.5(@deepseek-ai/cordis@4.0.2)(@deepseek-ai/dsh-brand@0.1.2-alpha.5(@deepseek-ai/cordis@4.0.2))(@deepseek-ai/dsh-invariants@0.1.2-alpha.5(@deepseek-ai/cordis@4.0.2))(@deepseek-ai/dsh-llm@0.1.2-alpha.5(@deepseek-ai/cordis@4.0.2))(@deepseek-ai/dsh-sandbox@0.1.2-alpha.5(@deepseek-ai/cordis@4.0.2)(@deepseek-ai/dsh-llm@0.1.2-alpha.5(@deepseek-ai/cordis@4.0.2))(@deepseek-ai/dsh-session@0.1.2-alpha.5(@deepseek-ai/cordis@4.0.2)(@deepseek-ai/dsh-scope@0.1.2-alpha.5(@deepseek-ai/cordis@4.0.2)(@deepseek-ai/dsh-invariants@0.1.2-alpha.5(@deepseek-ai/cordis@4.0.2)))))': dependencies: '@deepseek-ai/cordis': 4.0.2 - '@deepseek-ai/dsh-brand': 0.1.2-alpha.4(@deepseek-ai/cordis@4.0.2) - '@deepseek-ai/dsh-invariants': 0.1.2-alpha.4(@deepseek-ai/cordis@4.0.2) - '@deepseek-ai/dsh-llm': 0.1.2-alpha.4(@deepseek-ai/cordis@4.0.2) - '@deepseek-ai/dsh-sandbox': 0.1.2-alpha.4(@deepseek-ai/cordis@4.0.2)(@deepseek-ai/dsh-llm@0.1.2-alpha.4(@deepseek-ai/cordis@4.0.2))(@deepseek-ai/dsh-session@0.1.2-alpha.4(@deepseek-ai/cordis@4.0.2)(@deepseek-ai/dsh-scope@0.1.2-alpha.4(@deepseek-ai/cordis@4.0.2)(@deepseek-ai/dsh-invariants@0.1.2-alpha.4(@deepseek-ai/cordis@4.0.2)))) + '@deepseek-ai/dsh-brand': 0.1.2-alpha.5(@deepseek-ai/cordis@4.0.2) + '@deepseek-ai/dsh-invariants': 0.1.2-alpha.5(@deepseek-ai/cordis@4.0.2) + '@deepseek-ai/dsh-llm': 0.1.2-alpha.5(@deepseek-ai/cordis@4.0.2) + '@deepseek-ai/dsh-sandbox': 0.1.2-alpha.5(@deepseek-ai/cordis@4.0.2)(@deepseek-ai/dsh-llm@0.1.2-alpha.5(@deepseek-ai/cordis@4.0.2))(@deepseek-ai/dsh-session@0.1.2-alpha.5(@deepseek-ai/cordis@4.0.2)(@deepseek-ai/dsh-scope@0.1.2-alpha.5(@deepseek-ai/cordis@4.0.2)(@deepseek-ai/dsh-invariants@0.1.2-alpha.5(@deepseek-ai/cordis@4.0.2)))) - '@deepseek-ai/dsh-home-paths@0.1.2-alpha.4(@deepseek-ai/cordis@4.0.2)': + '@deepseek-ai/dsh-home-paths@0.1.2-alpha.5(@deepseek-ai/cordis@4.0.2)': dependencies: '@deepseek-ai/cordis': 4.0.2 - '@deepseek-ai/dsh-invariants@0.1.2-alpha.4(@deepseek-ai/cordis@4.0.2)': + '@deepseek-ai/dsh-invariants@0.1.2-alpha.5(@deepseek-ai/cordis@4.0.2)': dependencies: '@deepseek-ai/cordis': 4.0.2 '@deepseek-ai/schemastery': 3.18.2 - '@deepseek-ai/dsh-llm@0.1.2-alpha.4(@deepseek-ai/cordis@4.0.2)': + '@deepseek-ai/dsh-llm@0.1.2-alpha.5(@deepseek-ai/cordis@4.0.2)': dependencies: '@deepseek-ai/cordis': 4.0.2 - '@deepseek-ai/dsh-brand': 0.1.2-alpha.4(@deepseek-ai/cordis@4.0.2) - '@deepseek-ai/dsh-timeout': 0.1.2-alpha.4(@deepseek-ai/cordis@4.0.2) - '@deepseek-ai/dsh-typert-protocol': 0.1.2-alpha.4(@deepseek-ai/cordis@4.0.2) - '@deepseek-ai/dsh-util-crypto': 0.1.2-alpha.4(@deepseek-ai/cordis@4.0.2) - '@deepseek-ai/dsh-util-values': 0.1.2-alpha.4(@deepseek-ai/cordis@4.0.2) + '@deepseek-ai/dsh-brand': 0.1.2-alpha.5(@deepseek-ai/cordis@4.0.2) + '@deepseek-ai/dsh-timeout': 0.1.2-alpha.5(@deepseek-ai/cordis@4.0.2) + '@deepseek-ai/dsh-typert-protocol': 0.1.2-alpha.5(@deepseek-ai/cordis@4.0.2) + '@deepseek-ai/dsh-util-crypto': 0.1.2-alpha.5(@deepseek-ai/cordis@4.0.2) + '@deepseek-ai/dsh-util-values': 0.1.2-alpha.5(@deepseek-ai/cordis@4.0.2) '@deepseek-ai/schemastery': 3.18.2 zod: 4.4.3 - '@deepseek-ai/dsh-mcp-client@0.1.2-alpha.4(@deepseek-ai/cordis@4.0.2)(@deepseek-ai/dsh-attachment@0.1.2-alpha.4(@deepseek-ai/cordis@4.0.2)(@deepseek-ai/dsh-brand@0.1.2-alpha.4(@deepseek-ai/cordis@4.0.2)))(@deepseek-ai/dsh-llm@0.1.2-alpha.4(@deepseek-ai/cordis@4.0.2))(@deepseek-ai/dsh-scope@0.1.2-alpha.4(@deepseek-ai/cordis@4.0.2)(@deepseek-ai/dsh-invariants@0.1.2-alpha.4(@deepseek-ai/cordis@4.0.2)))(@deepseek-ai/dsh-subprocess@0.1.2-alpha.4(@deepseek-ai/cordis@4.0.2))(@deepseek-ai/dsh-timeout@0.1.2-alpha.4(@deepseek-ai/cordis@4.0.2))(@deepseek-ai/dsh-tools@0.1.2-alpha.4(6f17de9b01b7bb711bb9888e3e73adf0))': + '@deepseek-ai/dsh-mcp-client@0.1.2-alpha.5(@deepseek-ai/cordis@4.0.2)(@deepseek-ai/dsh-attachment@0.1.2-alpha.5(@deepseek-ai/cordis@4.0.2)(@deepseek-ai/dsh-brand@0.1.2-alpha.5(@deepseek-ai/cordis@4.0.2)))(@deepseek-ai/dsh-llm@0.1.2-alpha.5(@deepseek-ai/cordis@4.0.2))(@deepseek-ai/dsh-scope@0.1.2-alpha.5(@deepseek-ai/cordis@4.0.2)(@deepseek-ai/dsh-invariants@0.1.2-alpha.5(@deepseek-ai/cordis@4.0.2)))(@deepseek-ai/dsh-subprocess@0.1.2-alpha.5(@deepseek-ai/cordis@4.0.2))(@deepseek-ai/dsh-timeout@0.1.2-alpha.5(@deepseek-ai/cordis@4.0.2))(@deepseek-ai/dsh-tools@0.1.2-alpha.5(d031d96ea0c8995b40a270db2b7a6288))': dependencies: '@deepseek-ai/cordis': 4.0.2 - '@deepseek-ai/dsh-attachment': 0.1.2-alpha.4(@deepseek-ai/cordis@4.0.2)(@deepseek-ai/dsh-brand@0.1.2-alpha.4(@deepseek-ai/cordis@4.0.2)) - '@deepseek-ai/dsh-llm': 0.1.2-alpha.4(@deepseek-ai/cordis@4.0.2) - '@deepseek-ai/dsh-scope': 0.1.2-alpha.4(@deepseek-ai/cordis@4.0.2)(@deepseek-ai/dsh-invariants@0.1.2-alpha.4(@deepseek-ai/cordis@4.0.2)) - '@deepseek-ai/dsh-subprocess': 0.1.2-alpha.4(@deepseek-ai/cordis@4.0.2) - '@deepseek-ai/dsh-timeout': 0.1.2-alpha.4(@deepseek-ai/cordis@4.0.2) - '@deepseek-ai/dsh-tools': 0.1.2-alpha.4(6f17de9b01b7bb711bb9888e3e73adf0) + '@deepseek-ai/dsh-attachment': 0.1.2-alpha.5(@deepseek-ai/cordis@4.0.2)(@deepseek-ai/dsh-brand@0.1.2-alpha.5(@deepseek-ai/cordis@4.0.2)) + '@deepseek-ai/dsh-llm': 0.1.2-alpha.5(@deepseek-ai/cordis@4.0.2) + '@deepseek-ai/dsh-scope': 0.1.2-alpha.5(@deepseek-ai/cordis@4.0.2)(@deepseek-ai/dsh-invariants@0.1.2-alpha.5(@deepseek-ai/cordis@4.0.2)) + '@deepseek-ai/dsh-subprocess': 0.1.2-alpha.5(@deepseek-ai/cordis@4.0.2) + '@deepseek-ai/dsh-timeout': 0.1.2-alpha.5(@deepseek-ai/cordis@4.0.2) + '@deepseek-ai/dsh-tools': 0.1.2-alpha.5(d031d96ea0c8995b40a270db2b7a6288) '@deepseek-ai/schemastery': 3.18.2 '@modelcontextprotocol/sdk': 1.30.0(zod@4.4.3) zod: 4.4.3 @@ -2621,119 +2624,119 @@ snapshots: - '@cfworker/json-schema' - supports-color - '@deepseek-ai/dsh-sandbox@0.1.2-alpha.4(@deepseek-ai/cordis@4.0.2)(@deepseek-ai/dsh-llm@0.1.2-alpha.4(@deepseek-ai/cordis@4.0.2))(@deepseek-ai/dsh-session@0.1.2-alpha.4(@deepseek-ai/cordis@4.0.2)(@deepseek-ai/dsh-scope@0.1.2-alpha.4(@deepseek-ai/cordis@4.0.2)(@deepseek-ai/dsh-invariants@0.1.2-alpha.4(@deepseek-ai/cordis@4.0.2))))': + '@deepseek-ai/dsh-sandbox@0.1.2-alpha.5(@deepseek-ai/cordis@4.0.2)(@deepseek-ai/dsh-llm@0.1.2-alpha.5(@deepseek-ai/cordis@4.0.2))(@deepseek-ai/dsh-session@0.1.2-alpha.5(@deepseek-ai/cordis@4.0.2)(@deepseek-ai/dsh-scope@0.1.2-alpha.5(@deepseek-ai/cordis@4.0.2)(@deepseek-ai/dsh-invariants@0.1.2-alpha.5(@deepseek-ai/cordis@4.0.2))))': dependencies: '@deepseek-ai/cordis': 4.0.2 - '@deepseek-ai/dsh-llm': 0.1.2-alpha.4(@deepseek-ai/cordis@4.0.2) - '@deepseek-ai/dsh-session': 0.1.2-alpha.4(@deepseek-ai/cordis@4.0.2)(@deepseek-ai/dsh-scope@0.1.2-alpha.4(@deepseek-ai/cordis@4.0.2)(@deepseek-ai/dsh-invariants@0.1.2-alpha.4(@deepseek-ai/cordis@4.0.2))) - '@deepseek-ai/dsh-util-values': 0.1.2-alpha.4(@deepseek-ai/cordis@4.0.2) + '@deepseek-ai/dsh-llm': 0.1.2-alpha.5(@deepseek-ai/cordis@4.0.2) + '@deepseek-ai/dsh-session': 0.1.2-alpha.5(@deepseek-ai/cordis@4.0.2)(@deepseek-ai/dsh-scope@0.1.2-alpha.5(@deepseek-ai/cordis@4.0.2)(@deepseek-ai/dsh-invariants@0.1.2-alpha.5(@deepseek-ai/cordis@4.0.2))) + '@deepseek-ai/dsh-util-values': 0.1.2-alpha.5(@deepseek-ai/cordis@4.0.2) - '@deepseek-ai/dsh-scope@0.1.2-alpha.4(@deepseek-ai/cordis@4.0.2)(@deepseek-ai/dsh-invariants@0.1.2-alpha.4(@deepseek-ai/cordis@4.0.2))': + '@deepseek-ai/dsh-scope@0.1.2-alpha.5(@deepseek-ai/cordis@4.0.2)(@deepseek-ai/dsh-invariants@0.1.2-alpha.5(@deepseek-ai/cordis@4.0.2))': dependencies: '@deepseek-ai/cordis': 4.0.2 - '@deepseek-ai/dsh-invariants': 0.1.2-alpha.4(@deepseek-ai/cordis@4.0.2) + '@deepseek-ai/dsh-invariants': 0.1.2-alpha.5(@deepseek-ai/cordis@4.0.2) - '@deepseek-ai/dsh-session-projection@0.1.2-alpha.4(@deepseek-ai/cordis@4.0.2)(@deepseek-ai/dsh-session@0.1.2-alpha.4(@deepseek-ai/cordis@4.0.2)(@deepseek-ai/dsh-scope@0.1.2-alpha.4(@deepseek-ai/cordis@4.0.2)(@deepseek-ai/dsh-invariants@0.1.2-alpha.4(@deepseek-ai/cordis@4.0.2))))': + '@deepseek-ai/dsh-session-projection@0.1.2-alpha.5(@deepseek-ai/cordis@4.0.2)(@deepseek-ai/dsh-session@0.1.2-alpha.5(@deepseek-ai/cordis@4.0.2)(@deepseek-ai/dsh-scope@0.1.2-alpha.5(@deepseek-ai/cordis@4.0.2)(@deepseek-ai/dsh-invariants@0.1.2-alpha.5(@deepseek-ai/cordis@4.0.2))))': dependencies: '@deepseek-ai/cordis': 4.0.2 - '@deepseek-ai/dsh-session': 0.1.2-alpha.4(@deepseek-ai/cordis@4.0.2)(@deepseek-ai/dsh-scope@0.1.2-alpha.4(@deepseek-ai/cordis@4.0.2)(@deepseek-ai/dsh-invariants@0.1.2-alpha.4(@deepseek-ai/cordis@4.0.2))) + '@deepseek-ai/dsh-session': 0.1.2-alpha.5(@deepseek-ai/cordis@4.0.2)(@deepseek-ai/dsh-scope@0.1.2-alpha.5(@deepseek-ai/cordis@4.0.2)(@deepseek-ai/dsh-invariants@0.1.2-alpha.5(@deepseek-ai/cordis@4.0.2))) zod: 4.4.3 - '@deepseek-ai/dsh-session-turn-outline@0.1.2-alpha.4(@deepseek-ai/cordis@4.0.2)(@deepseek-ai/dsh-llm@0.1.2-alpha.4(@deepseek-ai/cordis@4.0.2))(@deepseek-ai/dsh-session-projection@0.1.2-alpha.4(@deepseek-ai/cordis@4.0.2)(@deepseek-ai/dsh-session@0.1.2-alpha.4(@deepseek-ai/cordis@4.0.2)(@deepseek-ai/dsh-scope@0.1.2-alpha.4(@deepseek-ai/cordis@4.0.2)(@deepseek-ai/dsh-invariants@0.1.2-alpha.4(@deepseek-ai/cordis@4.0.2)))))(@deepseek-ai/dsh-session@0.1.2-alpha.4(@deepseek-ai/cordis@4.0.2)(@deepseek-ai/dsh-scope@0.1.2-alpha.4(@deepseek-ai/cordis@4.0.2)(@deepseek-ai/dsh-invariants@0.1.2-alpha.4(@deepseek-ai/cordis@4.0.2))))': + '@deepseek-ai/dsh-session-turn-outline@0.1.2-alpha.5(@deepseek-ai/cordis@4.0.2)(@deepseek-ai/dsh-llm@0.1.2-alpha.5(@deepseek-ai/cordis@4.0.2))(@deepseek-ai/dsh-session-projection@0.1.2-alpha.5(@deepseek-ai/cordis@4.0.2)(@deepseek-ai/dsh-session@0.1.2-alpha.5(@deepseek-ai/cordis@4.0.2)(@deepseek-ai/dsh-scope@0.1.2-alpha.5(@deepseek-ai/cordis@4.0.2)(@deepseek-ai/dsh-invariants@0.1.2-alpha.5(@deepseek-ai/cordis@4.0.2)))))(@deepseek-ai/dsh-session@0.1.2-alpha.5(@deepseek-ai/cordis@4.0.2)(@deepseek-ai/dsh-scope@0.1.2-alpha.5(@deepseek-ai/cordis@4.0.2)(@deepseek-ai/dsh-invariants@0.1.2-alpha.5(@deepseek-ai/cordis@4.0.2))))': dependencies: '@deepseek-ai/cordis': 4.0.2 - '@deepseek-ai/dsh-llm': 0.1.2-alpha.4(@deepseek-ai/cordis@4.0.2) - '@deepseek-ai/dsh-session': 0.1.2-alpha.4(@deepseek-ai/cordis@4.0.2)(@deepseek-ai/dsh-scope@0.1.2-alpha.4(@deepseek-ai/cordis@4.0.2)(@deepseek-ai/dsh-invariants@0.1.2-alpha.4(@deepseek-ai/cordis@4.0.2))) - '@deepseek-ai/dsh-session-projection': 0.1.2-alpha.4(@deepseek-ai/cordis@4.0.2)(@deepseek-ai/dsh-session@0.1.2-alpha.4(@deepseek-ai/cordis@4.0.2)(@deepseek-ai/dsh-scope@0.1.2-alpha.4(@deepseek-ai/cordis@4.0.2)(@deepseek-ai/dsh-invariants@0.1.2-alpha.4(@deepseek-ai/cordis@4.0.2)))) + '@deepseek-ai/dsh-llm': 0.1.2-alpha.5(@deepseek-ai/cordis@4.0.2) + '@deepseek-ai/dsh-session': 0.1.2-alpha.5(@deepseek-ai/cordis@4.0.2)(@deepseek-ai/dsh-scope@0.1.2-alpha.5(@deepseek-ai/cordis@4.0.2)(@deepseek-ai/dsh-invariants@0.1.2-alpha.5(@deepseek-ai/cordis@4.0.2))) + '@deepseek-ai/dsh-session-projection': 0.1.2-alpha.5(@deepseek-ai/cordis@4.0.2)(@deepseek-ai/dsh-session@0.1.2-alpha.5(@deepseek-ai/cordis@4.0.2)(@deepseek-ai/dsh-scope@0.1.2-alpha.5(@deepseek-ai/cordis@4.0.2)(@deepseek-ai/dsh-invariants@0.1.2-alpha.5(@deepseek-ai/cordis@4.0.2)))) zod: 4.4.3 - '@deepseek-ai/dsh-session@0.1.2-alpha.4(@deepseek-ai/cordis@4.0.2)(@deepseek-ai/dsh-scope@0.1.2-alpha.4(@deepseek-ai/cordis@4.0.2)(@deepseek-ai/dsh-invariants@0.1.2-alpha.4(@deepseek-ai/cordis@4.0.2)))': + '@deepseek-ai/dsh-session@0.1.2-alpha.5(@deepseek-ai/cordis@4.0.2)(@deepseek-ai/dsh-scope@0.1.2-alpha.5(@deepseek-ai/cordis@4.0.2)(@deepseek-ai/dsh-invariants@0.1.2-alpha.5(@deepseek-ai/cordis@4.0.2)))': dependencies: '@deepseek-ai/cordis': 4.0.2 - '@deepseek-ai/dsh-brand': 0.1.2-alpha.4(@deepseek-ai/cordis@4.0.2) - '@deepseek-ai/dsh-llm': 0.1.2-alpha.4(@deepseek-ai/cordis@4.0.2) - '@deepseek-ai/dsh-scope': 0.1.2-alpha.4(@deepseek-ai/cordis@4.0.2)(@deepseek-ai/dsh-invariants@0.1.2-alpha.4(@deepseek-ai/cordis@4.0.2)) - '@deepseek-ai/dsh-util-values': 0.1.2-alpha.4(@deepseek-ai/cordis@4.0.2) + '@deepseek-ai/dsh-brand': 0.1.2-alpha.5(@deepseek-ai/cordis@4.0.2) + '@deepseek-ai/dsh-llm': 0.1.2-alpha.5(@deepseek-ai/cordis@4.0.2) + '@deepseek-ai/dsh-scope': 0.1.2-alpha.5(@deepseek-ai/cordis@4.0.2)(@deepseek-ai/dsh-invariants@0.1.2-alpha.5(@deepseek-ai/cordis@4.0.2)) + '@deepseek-ai/dsh-util-values': 0.1.2-alpha.5(@deepseek-ai/cordis@4.0.2) - '@deepseek-ai/dsh-settings@0.1.2-alpha.4(@deepseek-ai/cordis@4.0.2)(@deepseek-ai/dsh-brand@0.1.2-alpha.4(@deepseek-ai/cordis@4.0.2))(@deepseek-ai/dsh-invariants@0.1.2-alpha.4(@deepseek-ai/cordis@4.0.2))(@deepseek-ai/dsh-session@0.1.2-alpha.4(@deepseek-ai/cordis@4.0.2)(@deepseek-ai/dsh-scope@0.1.2-alpha.4(@deepseek-ai/cordis@4.0.2)(@deepseek-ai/dsh-invariants@0.1.2-alpha.4(@deepseek-ai/cordis@4.0.2))))(@deepseek-ai/schemastery@3.18.2)': + '@deepseek-ai/dsh-settings@0.1.2-alpha.5(@deepseek-ai/cordis@4.0.2)(@deepseek-ai/dsh-brand@0.1.2-alpha.5(@deepseek-ai/cordis@4.0.2))(@deepseek-ai/dsh-invariants@0.1.2-alpha.5(@deepseek-ai/cordis@4.0.2))(@deepseek-ai/dsh-session@0.1.2-alpha.5(@deepseek-ai/cordis@4.0.2)(@deepseek-ai/dsh-scope@0.1.2-alpha.5(@deepseek-ai/cordis@4.0.2)(@deepseek-ai/dsh-invariants@0.1.2-alpha.5(@deepseek-ai/cordis@4.0.2))))(@deepseek-ai/schemastery@3.18.2)': dependencies: '@deepseek-ai/cordis': 4.0.2 - '@deepseek-ai/dsh-brand': 0.1.2-alpha.4(@deepseek-ai/cordis@4.0.2) - '@deepseek-ai/dsh-invariants': 0.1.2-alpha.4(@deepseek-ai/cordis@4.0.2) - '@deepseek-ai/dsh-session': 0.1.2-alpha.4(@deepseek-ai/cordis@4.0.2)(@deepseek-ai/dsh-scope@0.1.2-alpha.4(@deepseek-ai/cordis@4.0.2)(@deepseek-ai/dsh-invariants@0.1.2-alpha.4(@deepseek-ai/cordis@4.0.2))) - '@deepseek-ai/dsh-util-values': 0.1.2-alpha.4(@deepseek-ai/cordis@4.0.2) + '@deepseek-ai/dsh-brand': 0.1.2-alpha.5(@deepseek-ai/cordis@4.0.2) + '@deepseek-ai/dsh-invariants': 0.1.2-alpha.5(@deepseek-ai/cordis@4.0.2) + '@deepseek-ai/dsh-session': 0.1.2-alpha.5(@deepseek-ai/cordis@4.0.2)(@deepseek-ai/dsh-scope@0.1.2-alpha.5(@deepseek-ai/cordis@4.0.2)(@deepseek-ai/dsh-invariants@0.1.2-alpha.5(@deepseek-ai/cordis@4.0.2))) + '@deepseek-ai/dsh-util-values': 0.1.2-alpha.5(@deepseek-ai/cordis@4.0.2) '@deepseek-ai/schemastery': 3.18.2 - '@deepseek-ai/dsh-skill-filesystem@0.1.2-alpha.4(@deepseek-ai/cordis@4.0.2)(@deepseek-ai/dsh-fs@0.1.2-alpha.4(@deepseek-ai/cordis@4.0.2)(@deepseek-ai/dsh-brand@0.1.2-alpha.4(@deepseek-ai/cordis@4.0.2))(@deepseek-ai/dsh-invariants@0.1.2-alpha.4(@deepseek-ai/cordis@4.0.2))(@deepseek-ai/dsh-llm@0.1.2-alpha.4(@deepseek-ai/cordis@4.0.2))(@deepseek-ai/dsh-sandbox@0.1.2-alpha.4(@deepseek-ai/cordis@4.0.2)(@deepseek-ai/dsh-llm@0.1.2-alpha.4(@deepseek-ai/cordis@4.0.2))(@deepseek-ai/dsh-session@0.1.2-alpha.4(@deepseek-ai/cordis@4.0.2)(@deepseek-ai/dsh-scope@0.1.2-alpha.4(@deepseek-ai/cordis@4.0.2)(@deepseek-ai/dsh-invariants@0.1.2-alpha.4(@deepseek-ai/cordis@4.0.2))))))(@deepseek-ai/dsh-home-paths@0.1.2-alpha.4(@deepseek-ai/cordis@4.0.2))(@deepseek-ai/dsh-skill@0.1.2-alpha.4(@deepseek-ai/cordis@4.0.2)(@deepseek-ai/dsh-llm@0.1.2-alpha.4(@deepseek-ai/cordis@4.0.2))(@deepseek-ai/dsh-scope@0.1.2-alpha.4(@deepseek-ai/cordis@4.0.2)(@deepseek-ai/dsh-invariants@0.1.2-alpha.4(@deepseek-ai/cordis@4.0.2))))': + '@deepseek-ai/dsh-skill-filesystem@0.1.2-alpha.5(@deepseek-ai/cordis@4.0.2)(@deepseek-ai/dsh-fs@0.1.2-alpha.5(@deepseek-ai/cordis@4.0.2)(@deepseek-ai/dsh-brand@0.1.2-alpha.5(@deepseek-ai/cordis@4.0.2))(@deepseek-ai/dsh-invariants@0.1.2-alpha.5(@deepseek-ai/cordis@4.0.2))(@deepseek-ai/dsh-llm@0.1.2-alpha.5(@deepseek-ai/cordis@4.0.2))(@deepseek-ai/dsh-sandbox@0.1.2-alpha.5(@deepseek-ai/cordis@4.0.2)(@deepseek-ai/dsh-llm@0.1.2-alpha.5(@deepseek-ai/cordis@4.0.2))(@deepseek-ai/dsh-session@0.1.2-alpha.5(@deepseek-ai/cordis@4.0.2)(@deepseek-ai/dsh-scope@0.1.2-alpha.5(@deepseek-ai/cordis@4.0.2)(@deepseek-ai/dsh-invariants@0.1.2-alpha.5(@deepseek-ai/cordis@4.0.2))))))(@deepseek-ai/dsh-home-paths@0.1.2-alpha.5(@deepseek-ai/cordis@4.0.2))(@deepseek-ai/dsh-skill@0.1.2-alpha.5(@deepseek-ai/cordis@4.0.2)(@deepseek-ai/dsh-llm@0.1.2-alpha.5(@deepseek-ai/cordis@4.0.2))(@deepseek-ai/dsh-scope@0.1.2-alpha.5(@deepseek-ai/cordis@4.0.2)(@deepseek-ai/dsh-invariants@0.1.2-alpha.5(@deepseek-ai/cordis@4.0.2))))': dependencies: '@deepseek-ai/cordis': 4.0.2 - '@deepseek-ai/dsh-fs': 0.1.2-alpha.4(@deepseek-ai/cordis@4.0.2)(@deepseek-ai/dsh-brand@0.1.2-alpha.4(@deepseek-ai/cordis@4.0.2))(@deepseek-ai/dsh-invariants@0.1.2-alpha.4(@deepseek-ai/cordis@4.0.2))(@deepseek-ai/dsh-llm@0.1.2-alpha.4(@deepseek-ai/cordis@4.0.2))(@deepseek-ai/dsh-sandbox@0.1.2-alpha.4(@deepseek-ai/cordis@4.0.2)(@deepseek-ai/dsh-llm@0.1.2-alpha.4(@deepseek-ai/cordis@4.0.2))(@deepseek-ai/dsh-session@0.1.2-alpha.4(@deepseek-ai/cordis@4.0.2)(@deepseek-ai/dsh-scope@0.1.2-alpha.4(@deepseek-ai/cordis@4.0.2)(@deepseek-ai/dsh-invariants@0.1.2-alpha.4(@deepseek-ai/cordis@4.0.2))))) - '@deepseek-ai/dsh-home-paths': 0.1.2-alpha.4(@deepseek-ai/cordis@4.0.2) - '@deepseek-ai/dsh-skill': 0.1.2-alpha.4(@deepseek-ai/cordis@4.0.2)(@deepseek-ai/dsh-llm@0.1.2-alpha.4(@deepseek-ai/cordis@4.0.2))(@deepseek-ai/dsh-scope@0.1.2-alpha.4(@deepseek-ai/cordis@4.0.2)(@deepseek-ai/dsh-invariants@0.1.2-alpha.4(@deepseek-ai/cordis@4.0.2))) + '@deepseek-ai/dsh-fs': 0.1.2-alpha.5(@deepseek-ai/cordis@4.0.2)(@deepseek-ai/dsh-brand@0.1.2-alpha.5(@deepseek-ai/cordis@4.0.2))(@deepseek-ai/dsh-invariants@0.1.2-alpha.5(@deepseek-ai/cordis@4.0.2))(@deepseek-ai/dsh-llm@0.1.2-alpha.5(@deepseek-ai/cordis@4.0.2))(@deepseek-ai/dsh-sandbox@0.1.2-alpha.5(@deepseek-ai/cordis@4.0.2)(@deepseek-ai/dsh-llm@0.1.2-alpha.5(@deepseek-ai/cordis@4.0.2))(@deepseek-ai/dsh-session@0.1.2-alpha.5(@deepseek-ai/cordis@4.0.2)(@deepseek-ai/dsh-scope@0.1.2-alpha.5(@deepseek-ai/cordis@4.0.2)(@deepseek-ai/dsh-invariants@0.1.2-alpha.5(@deepseek-ai/cordis@4.0.2))))) + '@deepseek-ai/dsh-home-paths': 0.1.2-alpha.5(@deepseek-ai/cordis@4.0.2) + '@deepseek-ai/dsh-skill': 0.1.2-alpha.5(@deepseek-ai/cordis@4.0.2)(@deepseek-ai/dsh-llm@0.1.2-alpha.5(@deepseek-ai/cordis@4.0.2))(@deepseek-ai/dsh-scope@0.1.2-alpha.5(@deepseek-ai/cordis@4.0.2)(@deepseek-ai/dsh-invariants@0.1.2-alpha.5(@deepseek-ai/cordis@4.0.2))) '@deepseek-ai/schemastery': 3.18.2 chokidar: 5.0.0 yaml: 2.9.0 - '@deepseek-ai/dsh-skill@0.1.2-alpha.4(@deepseek-ai/cordis@4.0.2)(@deepseek-ai/dsh-llm@0.1.2-alpha.4(@deepseek-ai/cordis@4.0.2))(@deepseek-ai/dsh-scope@0.1.2-alpha.4(@deepseek-ai/cordis@4.0.2)(@deepseek-ai/dsh-invariants@0.1.2-alpha.4(@deepseek-ai/cordis@4.0.2)))': + '@deepseek-ai/dsh-skill@0.1.2-alpha.5(@deepseek-ai/cordis@4.0.2)(@deepseek-ai/dsh-llm@0.1.2-alpha.5(@deepseek-ai/cordis@4.0.2))(@deepseek-ai/dsh-scope@0.1.2-alpha.5(@deepseek-ai/cordis@4.0.2)(@deepseek-ai/dsh-invariants@0.1.2-alpha.5(@deepseek-ai/cordis@4.0.2)))': dependencies: '@deepseek-ai/cordis': 4.0.2 - '@deepseek-ai/dsh-llm': 0.1.2-alpha.4(@deepseek-ai/cordis@4.0.2) - '@deepseek-ai/dsh-scope': 0.1.2-alpha.4(@deepseek-ai/cordis@4.0.2)(@deepseek-ai/dsh-invariants@0.1.2-alpha.4(@deepseek-ai/cordis@4.0.2)) - '@deepseek-ai/dsh-util-values': 0.1.2-alpha.4(@deepseek-ai/cordis@4.0.2) + '@deepseek-ai/dsh-llm': 0.1.2-alpha.5(@deepseek-ai/cordis@4.0.2) + '@deepseek-ai/dsh-scope': 0.1.2-alpha.5(@deepseek-ai/cordis@4.0.2)(@deepseek-ai/dsh-invariants@0.1.2-alpha.5(@deepseek-ai/cordis@4.0.2)) + '@deepseek-ai/dsh-util-values': 0.1.2-alpha.5(@deepseek-ai/cordis@4.0.2) '@deepseek-ai/schemastery': 3.18.2 - '@deepseek-ai/dsh-subprocess@0.1.2-alpha.4(@deepseek-ai/cordis@4.0.2)': + '@deepseek-ai/dsh-subprocess@0.1.2-alpha.5(@deepseek-ai/cordis@4.0.2)': dependencies: '@deepseek-ai/cordis': 4.0.2 - '@deepseek-ai/dsh-system-prompt@0.1.2-alpha.4(@deepseek-ai/cordis@4.0.2)(@deepseek-ai/dsh-invariants@0.1.2-alpha.4(@deepseek-ai/cordis@4.0.2))(@deepseek-ai/dsh-llm@0.1.2-alpha.4(@deepseek-ai/cordis@4.0.2))(@deepseek-ai/dsh-scope@0.1.2-alpha.4(@deepseek-ai/cordis@4.0.2)(@deepseek-ai/dsh-invariants@0.1.2-alpha.4(@deepseek-ai/cordis@4.0.2)))': + '@deepseek-ai/dsh-system-prompt@0.1.2-alpha.5(@deepseek-ai/cordis@4.0.2)(@deepseek-ai/dsh-invariants@0.1.2-alpha.5(@deepseek-ai/cordis@4.0.2))(@deepseek-ai/dsh-llm@0.1.2-alpha.5(@deepseek-ai/cordis@4.0.2))(@deepseek-ai/dsh-scope@0.1.2-alpha.5(@deepseek-ai/cordis@4.0.2)(@deepseek-ai/dsh-invariants@0.1.2-alpha.5(@deepseek-ai/cordis@4.0.2)))': dependencies: '@deepseek-ai/cordis': 4.0.2 - '@deepseek-ai/dsh-invariants': 0.1.2-alpha.4(@deepseek-ai/cordis@4.0.2) - '@deepseek-ai/dsh-llm': 0.1.2-alpha.4(@deepseek-ai/cordis@4.0.2) - '@deepseek-ai/dsh-scope': 0.1.2-alpha.4(@deepseek-ai/cordis@4.0.2)(@deepseek-ai/dsh-invariants@0.1.2-alpha.4(@deepseek-ai/cordis@4.0.2)) + '@deepseek-ai/dsh-invariants': 0.1.2-alpha.5(@deepseek-ai/cordis@4.0.2) + '@deepseek-ai/dsh-llm': 0.1.2-alpha.5(@deepseek-ai/cordis@4.0.2) + '@deepseek-ai/dsh-scope': 0.1.2-alpha.5(@deepseek-ai/cordis@4.0.2)(@deepseek-ai/dsh-invariants@0.1.2-alpha.5(@deepseek-ai/cordis@4.0.2)) '@deepseek-ai/schemastery': 3.18.2 - '@deepseek-ai/dsh-timeout@0.1.2-alpha.4(@deepseek-ai/cordis@4.0.2)': + '@deepseek-ai/dsh-timeout@0.1.2-alpha.5(@deepseek-ai/cordis@4.0.2)': dependencies: '@deepseek-ai/cordis': 4.0.2 - '@deepseek-ai/dsh-tools@0.1.2-alpha.4(6f17de9b01b7bb711bb9888e3e73adf0)': + '@deepseek-ai/dsh-tools@0.1.2-alpha.5(d031d96ea0c8995b40a270db2b7a6288)': dependencies: '@deepseek-ai/cordis': 4.0.2 - '@deepseek-ai/dsh-agent': 0.1.2-alpha.4(c5cc672bd5ee417388896b008bce4ee7) - '@deepseek-ai/dsh-brand': 0.1.2-alpha.4(@deepseek-ai/cordis@4.0.2) - '@deepseek-ai/dsh-code-runtime': 0.1.2-alpha.4(@deepseek-ai/cordis@4.0.2) - '@deepseek-ai/dsh-invariants': 0.1.2-alpha.4(@deepseek-ai/cordis@4.0.2) - '@deepseek-ai/dsh-llm': 0.1.2-alpha.4(@deepseek-ai/cordis@4.0.2) - '@deepseek-ai/dsh-scope': 0.1.2-alpha.4(@deepseek-ai/cordis@4.0.2)(@deepseek-ai/dsh-invariants@0.1.2-alpha.4(@deepseek-ai/cordis@4.0.2)) - '@deepseek-ai/dsh-session': 0.1.2-alpha.4(@deepseek-ai/cordis@4.0.2)(@deepseek-ai/dsh-scope@0.1.2-alpha.4(@deepseek-ai/cordis@4.0.2)(@deepseek-ai/dsh-invariants@0.1.2-alpha.4(@deepseek-ai/cordis@4.0.2))) - '@deepseek-ai/dsh-system-prompt': 0.1.2-alpha.4(@deepseek-ai/cordis@4.0.2)(@deepseek-ai/dsh-invariants@0.1.2-alpha.4(@deepseek-ai/cordis@4.0.2))(@deepseek-ai/dsh-llm@0.1.2-alpha.4(@deepseek-ai/cordis@4.0.2))(@deepseek-ai/dsh-scope@0.1.2-alpha.4(@deepseek-ai/cordis@4.0.2)(@deepseek-ai/dsh-invariants@0.1.2-alpha.4(@deepseek-ai/cordis@4.0.2))) - '@deepseek-ai/dsh-user-approval': 0.1.2-alpha.4(@deepseek-ai/cordis@4.0.2)(@deepseek-ai/dsh-agent@0.1.2-alpha.4(c5cc672bd5ee417388896b008bce4ee7))(@deepseek-ai/dsh-brand@0.1.2-alpha.4(@deepseek-ai/cordis@4.0.2))(@deepseek-ai/dsh-invariants@0.1.2-alpha.4(@deepseek-ai/cordis@4.0.2))(@deepseek-ai/dsh-llm@0.1.2-alpha.4(@deepseek-ai/cordis@4.0.2))(@deepseek-ai/dsh-scope@0.1.2-alpha.4(@deepseek-ai/cordis@4.0.2)(@deepseek-ai/dsh-invariants@0.1.2-alpha.4(@deepseek-ai/cordis@4.0.2)))(@deepseek-ai/dsh-session@0.1.2-alpha.4(@deepseek-ai/cordis@4.0.2)(@deepseek-ai/dsh-scope@0.1.2-alpha.4(@deepseek-ai/cordis@4.0.2)(@deepseek-ai/dsh-invariants@0.1.2-alpha.4(@deepseek-ai/cordis@4.0.2))))(@deepseek-ai/dsh-system-prompt@0.1.2-alpha.4(@deepseek-ai/cordis@4.0.2)(@deepseek-ai/dsh-invariants@0.1.2-alpha.4(@deepseek-ai/cordis@4.0.2))(@deepseek-ai/dsh-llm@0.1.2-alpha.4(@deepseek-ai/cordis@4.0.2))(@deepseek-ai/dsh-scope@0.1.2-alpha.4(@deepseek-ai/cordis@4.0.2)(@deepseek-ai/dsh-invariants@0.1.2-alpha.4(@deepseek-ai/cordis@4.0.2)))) - '@deepseek-ai/dsh-util-values': 0.1.2-alpha.4(@deepseek-ai/cordis@4.0.2) + '@deepseek-ai/dsh-agent': 0.1.2-alpha.5(fa501c54d1bae9af3acbbd6956a25b22) + '@deepseek-ai/dsh-brand': 0.1.2-alpha.5(@deepseek-ai/cordis@4.0.2) + '@deepseek-ai/dsh-code-runtime': 0.1.2-alpha.5(@deepseek-ai/cordis@4.0.2) + '@deepseek-ai/dsh-invariants': 0.1.2-alpha.5(@deepseek-ai/cordis@4.0.2) + '@deepseek-ai/dsh-llm': 0.1.2-alpha.5(@deepseek-ai/cordis@4.0.2) + '@deepseek-ai/dsh-scope': 0.1.2-alpha.5(@deepseek-ai/cordis@4.0.2)(@deepseek-ai/dsh-invariants@0.1.2-alpha.5(@deepseek-ai/cordis@4.0.2)) + '@deepseek-ai/dsh-session': 0.1.2-alpha.5(@deepseek-ai/cordis@4.0.2)(@deepseek-ai/dsh-scope@0.1.2-alpha.5(@deepseek-ai/cordis@4.0.2)(@deepseek-ai/dsh-invariants@0.1.2-alpha.5(@deepseek-ai/cordis@4.0.2))) + '@deepseek-ai/dsh-system-prompt': 0.1.2-alpha.5(@deepseek-ai/cordis@4.0.2)(@deepseek-ai/dsh-invariants@0.1.2-alpha.5(@deepseek-ai/cordis@4.0.2))(@deepseek-ai/dsh-llm@0.1.2-alpha.5(@deepseek-ai/cordis@4.0.2))(@deepseek-ai/dsh-scope@0.1.2-alpha.5(@deepseek-ai/cordis@4.0.2)(@deepseek-ai/dsh-invariants@0.1.2-alpha.5(@deepseek-ai/cordis@4.0.2))) + '@deepseek-ai/dsh-user-approval': 0.1.2-alpha.5(@deepseek-ai/cordis@4.0.2)(@deepseek-ai/dsh-agent@0.1.2-alpha.5(fa501c54d1bae9af3acbbd6956a25b22))(@deepseek-ai/dsh-brand@0.1.2-alpha.5(@deepseek-ai/cordis@4.0.2))(@deepseek-ai/dsh-invariants@0.1.2-alpha.5(@deepseek-ai/cordis@4.0.2))(@deepseek-ai/dsh-llm@0.1.2-alpha.5(@deepseek-ai/cordis@4.0.2))(@deepseek-ai/dsh-scope@0.1.2-alpha.5(@deepseek-ai/cordis@4.0.2)(@deepseek-ai/dsh-invariants@0.1.2-alpha.5(@deepseek-ai/cordis@4.0.2)))(@deepseek-ai/dsh-session@0.1.2-alpha.5(@deepseek-ai/cordis@4.0.2)(@deepseek-ai/dsh-scope@0.1.2-alpha.5(@deepseek-ai/cordis@4.0.2)(@deepseek-ai/dsh-invariants@0.1.2-alpha.5(@deepseek-ai/cordis@4.0.2))))(@deepseek-ai/dsh-system-prompt@0.1.2-alpha.5(@deepseek-ai/cordis@4.0.2)(@deepseek-ai/dsh-invariants@0.1.2-alpha.5(@deepseek-ai/cordis@4.0.2))(@deepseek-ai/dsh-llm@0.1.2-alpha.5(@deepseek-ai/cordis@4.0.2))(@deepseek-ai/dsh-scope@0.1.2-alpha.5(@deepseek-ai/cordis@4.0.2)(@deepseek-ai/dsh-invariants@0.1.2-alpha.5(@deepseek-ai/cordis@4.0.2)))) + '@deepseek-ai/dsh-util-values': 0.1.2-alpha.5(@deepseek-ai/cordis@4.0.2) '@deepseek-ai/schemastery': 3.18.2 - '@deepseek-ai/dsh-typert-protocol@0.1.2-alpha.4(@deepseek-ai/cordis@4.0.2)': + '@deepseek-ai/dsh-typert-protocol@0.1.2-alpha.5(@deepseek-ai/cordis@4.0.2)': dependencies: '@deepseek-ai/cordis': 4.0.2 - '@deepseek-ai/dsh-user-approval@0.1.2-alpha.4(@deepseek-ai/cordis@4.0.2)(@deepseek-ai/dsh-agent@0.1.2-alpha.4(c5cc672bd5ee417388896b008bce4ee7))(@deepseek-ai/dsh-brand@0.1.2-alpha.4(@deepseek-ai/cordis@4.0.2))(@deepseek-ai/dsh-invariants@0.1.2-alpha.4(@deepseek-ai/cordis@4.0.2))(@deepseek-ai/dsh-llm@0.1.2-alpha.4(@deepseek-ai/cordis@4.0.2))(@deepseek-ai/dsh-scope@0.1.2-alpha.4(@deepseek-ai/cordis@4.0.2)(@deepseek-ai/dsh-invariants@0.1.2-alpha.4(@deepseek-ai/cordis@4.0.2)))(@deepseek-ai/dsh-session@0.1.2-alpha.4(@deepseek-ai/cordis@4.0.2)(@deepseek-ai/dsh-scope@0.1.2-alpha.4(@deepseek-ai/cordis@4.0.2)(@deepseek-ai/dsh-invariants@0.1.2-alpha.4(@deepseek-ai/cordis@4.0.2))))(@deepseek-ai/dsh-system-prompt@0.1.2-alpha.4(@deepseek-ai/cordis@4.0.2)(@deepseek-ai/dsh-invariants@0.1.2-alpha.4(@deepseek-ai/cordis@4.0.2))(@deepseek-ai/dsh-llm@0.1.2-alpha.4(@deepseek-ai/cordis@4.0.2))(@deepseek-ai/dsh-scope@0.1.2-alpha.4(@deepseek-ai/cordis@4.0.2)(@deepseek-ai/dsh-invariants@0.1.2-alpha.4(@deepseek-ai/cordis@4.0.2))))': + '@deepseek-ai/dsh-user-approval@0.1.2-alpha.5(@deepseek-ai/cordis@4.0.2)(@deepseek-ai/dsh-agent@0.1.2-alpha.5(fa501c54d1bae9af3acbbd6956a25b22))(@deepseek-ai/dsh-brand@0.1.2-alpha.5(@deepseek-ai/cordis@4.0.2))(@deepseek-ai/dsh-invariants@0.1.2-alpha.5(@deepseek-ai/cordis@4.0.2))(@deepseek-ai/dsh-llm@0.1.2-alpha.5(@deepseek-ai/cordis@4.0.2))(@deepseek-ai/dsh-scope@0.1.2-alpha.5(@deepseek-ai/cordis@4.0.2)(@deepseek-ai/dsh-invariants@0.1.2-alpha.5(@deepseek-ai/cordis@4.0.2)))(@deepseek-ai/dsh-session@0.1.2-alpha.5(@deepseek-ai/cordis@4.0.2)(@deepseek-ai/dsh-scope@0.1.2-alpha.5(@deepseek-ai/cordis@4.0.2)(@deepseek-ai/dsh-invariants@0.1.2-alpha.5(@deepseek-ai/cordis@4.0.2))))(@deepseek-ai/dsh-system-prompt@0.1.2-alpha.5(@deepseek-ai/cordis@4.0.2)(@deepseek-ai/dsh-invariants@0.1.2-alpha.5(@deepseek-ai/cordis@4.0.2))(@deepseek-ai/dsh-llm@0.1.2-alpha.5(@deepseek-ai/cordis@4.0.2))(@deepseek-ai/dsh-scope@0.1.2-alpha.5(@deepseek-ai/cordis@4.0.2)(@deepseek-ai/dsh-invariants@0.1.2-alpha.5(@deepseek-ai/cordis@4.0.2))))': dependencies: '@deepseek-ai/cordis': 4.0.2 - '@deepseek-ai/dsh-agent': 0.1.2-alpha.4(c5cc672bd5ee417388896b008bce4ee7) - '@deepseek-ai/dsh-brand': 0.1.2-alpha.4(@deepseek-ai/cordis@4.0.2) - '@deepseek-ai/dsh-invariants': 0.1.2-alpha.4(@deepseek-ai/cordis@4.0.2) - '@deepseek-ai/dsh-llm': 0.1.2-alpha.4(@deepseek-ai/cordis@4.0.2) - '@deepseek-ai/dsh-scope': 0.1.2-alpha.4(@deepseek-ai/cordis@4.0.2)(@deepseek-ai/dsh-invariants@0.1.2-alpha.4(@deepseek-ai/cordis@4.0.2)) - '@deepseek-ai/dsh-session': 0.1.2-alpha.4(@deepseek-ai/cordis@4.0.2)(@deepseek-ai/dsh-scope@0.1.2-alpha.4(@deepseek-ai/cordis@4.0.2)(@deepseek-ai/dsh-invariants@0.1.2-alpha.4(@deepseek-ai/cordis@4.0.2))) - '@deepseek-ai/dsh-system-prompt': 0.1.2-alpha.4(@deepseek-ai/cordis@4.0.2)(@deepseek-ai/dsh-invariants@0.1.2-alpha.4(@deepseek-ai/cordis@4.0.2))(@deepseek-ai/dsh-llm@0.1.2-alpha.4(@deepseek-ai/cordis@4.0.2))(@deepseek-ai/dsh-scope@0.1.2-alpha.4(@deepseek-ai/cordis@4.0.2)(@deepseek-ai/dsh-invariants@0.1.2-alpha.4(@deepseek-ai/cordis@4.0.2))) + '@deepseek-ai/dsh-agent': 0.1.2-alpha.5(fa501c54d1bae9af3acbbd6956a25b22) + '@deepseek-ai/dsh-brand': 0.1.2-alpha.5(@deepseek-ai/cordis@4.0.2) + '@deepseek-ai/dsh-invariants': 0.1.2-alpha.5(@deepseek-ai/cordis@4.0.2) + '@deepseek-ai/dsh-llm': 0.1.2-alpha.5(@deepseek-ai/cordis@4.0.2) + '@deepseek-ai/dsh-scope': 0.1.2-alpha.5(@deepseek-ai/cordis@4.0.2)(@deepseek-ai/dsh-invariants@0.1.2-alpha.5(@deepseek-ai/cordis@4.0.2)) + '@deepseek-ai/dsh-session': 0.1.2-alpha.5(@deepseek-ai/cordis@4.0.2)(@deepseek-ai/dsh-scope@0.1.2-alpha.5(@deepseek-ai/cordis@4.0.2)(@deepseek-ai/dsh-invariants@0.1.2-alpha.5(@deepseek-ai/cordis@4.0.2))) + '@deepseek-ai/dsh-system-prompt': 0.1.2-alpha.5(@deepseek-ai/cordis@4.0.2)(@deepseek-ai/dsh-invariants@0.1.2-alpha.5(@deepseek-ai/cordis@4.0.2))(@deepseek-ai/dsh-llm@0.1.2-alpha.5(@deepseek-ai/cordis@4.0.2))(@deepseek-ai/dsh-scope@0.1.2-alpha.5(@deepseek-ai/cordis@4.0.2)(@deepseek-ai/dsh-invariants@0.1.2-alpha.5(@deepseek-ai/cordis@4.0.2))) '@deepseek-ai/schemastery': 3.18.2 - '@deepseek-ai/dsh-util-crypto@0.1.2-alpha.4(@deepseek-ai/cordis@4.0.2)': + '@deepseek-ai/dsh-util-crypto@0.1.2-alpha.5(@deepseek-ai/cordis@4.0.2)': dependencies: '@deepseek-ai/cordis': 4.0.2 - '@deepseek-ai/dsh-util-values@0.1.2-alpha.4(@deepseek-ai/cordis@4.0.2)': + '@deepseek-ai/dsh-util-values@0.1.2-alpha.5(@deepseek-ai/cordis@4.0.2)': dependencies: '@deepseek-ai/cordis': 4.0.2 diff --git a/pnpm-workspace.yaml b/pnpm-workspace.yaml index b7c06c4..8aacc6c 100644 --- a/pnpm-workspace.yaml +++ b/pnpm-workspace.yaml @@ -3,40 +3,40 @@ packages: allowBuilds: esbuild: true minimumReleaseAgeExclude: - - '@deepseek-ai/dsh-session-turn-outline@0.1.2-alpha.4' - - '@deepseek-ai/dsh-agent@0.1.2-alpha.4' - - '@deepseek-ai/dsh-attachment@0.1.2-alpha.4' - - '@deepseek-ai/dsh-brand@0.1.2-alpha.4' - - '@deepseek-ai/dsh-client-connection@0.1.2-alpha.4' - - '@deepseek-ai/dsh-client-locale@0.1.2-alpha.4' - - '@deepseek-ai/dsh-client-store@0.1.2-alpha.4' - - '@deepseek-ai/dsh-client-ui-layout@0.1.2-alpha.4' - - '@deepseek-ai/dsh-client-ui-primitives@0.1.2-alpha.4' - - '@deepseek-ai/dsh-client-ui-renderer@0.1.2-alpha.4' - - '@deepseek-ai/dsh-client-ui-settings-plugins@0.1.2-alpha.4' - - '@deepseek-ai/dsh-client-ui-settings@0.1.2-alpha.4' - - '@deepseek-ai/dsh-client-ui-sidebar@0.1.2-alpha.4' - - '@deepseek-ai/dsh-client-ui-slots@0.1.2-alpha.4' - - '@deepseek-ai/dsh-code-runtime@0.1.2-alpha.4' - - '@deepseek-ai/dsh-commands@0.1.2-alpha.4' - - '@deepseek-ai/dsh-credentials@0.1.2-alpha.4' - - '@deepseek-ai/dsh-fs@0.1.2-alpha.4' - - '@deepseek-ai/dsh-home-paths@0.1.2-alpha.4' - - '@deepseek-ai/dsh-invariants@0.1.2-alpha.4' - - '@deepseek-ai/dsh-llm@0.1.2-alpha.4' - - '@deepseek-ai/dsh-mcp-client@0.1.2-alpha.4' - - '@deepseek-ai/dsh-sandbox@0.1.2-alpha.4' - - '@deepseek-ai/dsh-scope@0.1.2-alpha.4' - - '@deepseek-ai/dsh-session-projection@0.1.2-alpha.4' - - '@deepseek-ai/dsh-session@0.1.2-alpha.4' - - '@deepseek-ai/dsh-settings@0.1.2-alpha.4' - - '@deepseek-ai/dsh-skill-filesystem@0.1.2-alpha.4' - - '@deepseek-ai/dsh-skill@0.1.2-alpha.4' - - '@deepseek-ai/dsh-subprocess@0.1.2-alpha.4' - - '@deepseek-ai/dsh-system-prompt@0.1.2-alpha.4' - - '@deepseek-ai/dsh-timeout@0.1.2-alpha.4' - - '@deepseek-ai/dsh-tools@0.1.2-alpha.4' - - '@deepseek-ai/dsh-typert-protocol@0.1.2-alpha.4' - - '@deepseek-ai/dsh-user-approval@0.1.2-alpha.4' - - '@deepseek-ai/dsh-util-crypto@0.1.2-alpha.4' - - '@deepseek-ai/dsh-util-values@0.1.2-alpha.4' + - '@deepseek-ai/dsh-session-turn-outline@0.1.2-alpha.5' + - '@deepseek-ai/dsh-agent@0.1.2-alpha.5' + - '@deepseek-ai/dsh-attachment@0.1.2-alpha.5' + - '@deepseek-ai/dsh-brand@0.1.2-alpha.5' + - '@deepseek-ai/dsh-client-connection@0.1.2-alpha.5' + - '@deepseek-ai/dsh-client-locale@0.1.2-alpha.5' + - '@deepseek-ai/dsh-client-store@0.1.2-alpha.5' + - '@deepseek-ai/dsh-client-ui-layout@0.1.2-alpha.5' + - '@deepseek-ai/dsh-client-ui-primitives@0.1.2-alpha.5' + - '@deepseek-ai/dsh-client-ui-renderer@0.1.2-alpha.5' + - '@deepseek-ai/dsh-client-ui-settings-plugins@0.1.2-alpha.5' + - '@deepseek-ai/dsh-client-ui-settings@0.1.2-alpha.5' + - '@deepseek-ai/dsh-client-ui-sidebar@0.1.2-alpha.5' + - '@deepseek-ai/dsh-client-ui-slots@0.1.2-alpha.5' + - '@deepseek-ai/dsh-code-runtime@0.1.2-alpha.5' + - '@deepseek-ai/dsh-commands@0.1.2-alpha.5' + - '@deepseek-ai/dsh-credentials@0.1.2-alpha.5' + - '@deepseek-ai/dsh-fs@0.1.2-alpha.5' + - '@deepseek-ai/dsh-home-paths@0.1.2-alpha.5' + - '@deepseek-ai/dsh-invariants@0.1.2-alpha.5' + - '@deepseek-ai/dsh-llm@0.1.2-alpha.5' + - '@deepseek-ai/dsh-mcp-client@0.1.2-alpha.5' + - '@deepseek-ai/dsh-sandbox@0.1.2-alpha.5' + - '@deepseek-ai/dsh-scope@0.1.2-alpha.5' + - '@deepseek-ai/dsh-session-projection@0.1.2-alpha.5' + - '@deepseek-ai/dsh-session@0.1.2-alpha.5' + - '@deepseek-ai/dsh-settings@0.1.2-alpha.5' + - '@deepseek-ai/dsh-skill-filesystem@0.1.2-alpha.5' + - '@deepseek-ai/dsh-skill@0.1.2-alpha.5' + - '@deepseek-ai/dsh-subprocess@0.1.2-alpha.5' + - '@deepseek-ai/dsh-system-prompt@0.1.2-alpha.5' + - '@deepseek-ai/dsh-timeout@0.1.2-alpha.5' + - '@deepseek-ai/dsh-tools@0.1.2-alpha.5' + - '@deepseek-ai/dsh-typert-protocol@0.1.2-alpha.5' + - '@deepseek-ai/dsh-user-approval@0.1.2-alpha.5' + - '@deepseek-ai/dsh-util-crypto@0.1.2-alpha.5' + - '@deepseek-ai/dsh-util-values@0.1.2-alpha.5'