Skip to content
Closed
Show file tree
Hide file tree
Changes from all commits
Commits
File filter

Filter by extension

Filter by extension


Conversations
Failed to load comments.
Loading
Jump to
Jump to file
Failed to load files.
Loading
Diff view
Diff view
2 changes: 1 addition & 1 deletion .github/workflows/ci.yml
Original file line number Diff line number Diff line change
Expand Up @@ -67,7 +67,7 @@ jobs:

- name: Install DSH CLI for Web smoke
if: ${{ matrix.node == '22.19.0' }}
run: npm install --global @deepseek-ai/dsh@0.1.1-rc.2
run: npm install --global @deepseek-ai/dsh@0.1.2-alpha.1

- name: Verify isolated DSH Web profile and tool catalog
if: ${{ matrix.node == '22.19.0' }}
Expand Down
2 changes: 1 addition & 1 deletion .github/workflows/release-mtmharness.yml
Original file line number Diff line number Diff line change
Expand Up @@ -86,7 +86,7 @@ jobs:
run: pnpm dlx publint run "${{ steps.pack.outputs.tarball }}" --strict

- name: Install DSH CLI for Web smoke
run: npm install --global @deepseek-ai/dsh@0.1.1-rc.2
run: npm install --global @deepseek-ai/dsh@0.1.2-alpha.1

- name: Verify isolated DSH Web profile and tool catalog
env:
Expand Down
89 changes: 43 additions & 46 deletions packages/mtmharness/package.json
Original file line number Diff line number Diff line change
Expand Up @@ -22,14 +22,12 @@
"platform": "web",
"inject": [
"@deepseek-ai/dsh-client-connection",
"@deepseek-ai/dsh-client-runtime",
"@deepseek-ai/dsh-client-ui-primitives",
"@deepseek-ai/dsh-client-ui-renderer",
"@deepseek-ai/dsh-client-ui-sidebar",
"@deepseek-ai/dsh-client-ui-layout",
"@deepseek-ai/dsh-client-locale",
"@deepseek-ai/dsh-client-ui-settings",
"@deepseek-ai/dsh-client-ui-settings-plugins",
"@deepseek-ai/dsh-client-ui-slots"
"@deepseek-ai/dsh-client-ui-settings-plugins"
]
}
},
Expand Down Expand Up @@ -67,53 +65,52 @@
},
"peerDependencies": {
"@deepseek-ai/cordis": "^4.0.1",
"@deepseek-ai/dsh-agent": "^0.1.1-rc.2",
"@deepseek-ai/dsh-commands": "^0.1.1-rc.2",
"@deepseek-ai/dsh-fs": "^0.1.1-rc.2",
"@deepseek-ai/dsh-host-directory-picker": "^0.1.1-rc.2",
"@deepseek-ai/dsh-llm": "^0.1.1-rc.2",
"@deepseek-ai/dsh-mcp-client": "^0.1.1-rc.2",
"@deepseek-ai/dsh-session": "^0.1.1-rc.2",
"@deepseek-ai/dsh-settings": "^0.1.1-rc.2",
"@deepseek-ai/dsh-skill": "^0.1.1-rc.2",
"@deepseek-ai/dsh-subprocess": "^0.1.1-rc.2",
"@deepseek-ai/dsh-system-prompt": "^0.1.1-rc.2",
"@deepseek-ai/dsh-tools": "^0.1.1-rc.2",
"@deepseek-ai/dsh-client-connection": "^0.1.1-rc.2",
"@deepseek-ai/dsh-client-locale": "^0.1.1-rc.2",
"@deepseek-ai/dsh-client-runtime": "^0.1.1-rc.2",
"@deepseek-ai/dsh-client-ui-primitives": "^0.1.1-rc.2",
"@deepseek-ai/dsh-client-ui-settings": "^0.1.1-rc.2",
"@deepseek-ai/dsh-client-ui-settings-plugins": "^0.1.1-rc.2",
"@deepseek-ai/dsh-client-ui-sidebar": "^0.1.1-rc.2",
"@deepseek-ai/dsh-client-ui-layout": "^0.1.1-rc.2",
"@deepseek-ai/dsh-client-ui-slots": "^0.1.1-rc.2",
"@deepseek-ai/dsh-agent": "^0.1.2-alpha.1",
"@deepseek-ai/dsh-commands": "^0.1.2-alpha.1",
"@deepseek-ai/dsh-fs": "^0.1.2-alpha.1",
"@deepseek-ai/dsh-host-directory-picker": "^0.1.2-alpha.1",
"@deepseek-ai/dsh-llm": "^0.1.2-alpha.1",
"@deepseek-ai/dsh-mcp-client": "^0.1.2-alpha.1",
"@deepseek-ai/dsh-session": "^0.1.2-alpha.1",
"@deepseek-ai/dsh-settings": "^0.1.2-alpha.1",
"@deepseek-ai/dsh-skill": "^0.1.2-alpha.1",
"@deepseek-ai/dsh-subprocess": "^0.1.2-alpha.1",
"@deepseek-ai/dsh-system-prompt": "^0.1.2-alpha.1",
"@deepseek-ai/dsh-tools": "^0.1.2-alpha.1",
"@deepseek-ai/dsh-client-connection": "^0.1.2-alpha.1",
"@deepseek-ai/dsh-client-locale": "^0.1.2-alpha.1",
"@deepseek-ai/dsh-client-ui-renderer": "^0.1.2-alpha.1",
"@deepseek-ai/dsh-client-ui-settings": "^0.1.2-alpha.1",
"@deepseek-ai/dsh-client-ui-settings-plugins": "^0.1.2-alpha.1",
"@deepseek-ai/dsh-client-ui-sidebar": "^0.1.2-alpha.1",
"@deepseek-ai/dsh-client-ui-layout": "^0.1.2-alpha.1",
"react": ">=18.2.0 <20"
},
"devDependencies": {
"@base-ui/react": "1.7.0",
"@deepseek-ai/cordis": "4.0.1",
"@deepseek-ai/dsh-agent": "0.1.1-rc.2",
"@deepseek-ai/dsh-commands": "0.1.1-rc.2",
"@deepseek-ai/dsh-fs": "0.1.1-rc.2",
"@deepseek-ai/dsh-host-directory-picker": "0.1.1-rc.2",
"@deepseek-ai/dsh-llm": "0.1.1-rc.2",
"@deepseek-ai/dsh-mcp-client": "0.1.1-rc.2",
"@deepseek-ai/dsh-session": "0.1.1-rc.2",
"@deepseek-ai/dsh-settings": "0.1.1-rc.2",
"@deepseek-ai/dsh-skill": "0.1.1-rc.2",
"@deepseek-ai/dsh-subprocess": "0.1.1-rc.2",
"@deepseek-ai/dsh-system-prompt": "0.1.1-rc.2",
"@deepseek-ai/dsh-tools": "0.1.1-rc.2",
"@deepseek-ai/dsh-client-connection": "0.1.1-rc.2",
"@deepseek-ai/dsh-client-locale": "0.1.1-rc.2",
"@deepseek-ai/dsh-client-runtime": "0.1.1-rc.2",
"@deepseek-ai/dsh-client-ui-primitives": "0.1.1-rc.2",
"@deepseek-ai/dsh-client-ui-settings": "0.1.1-rc.2",
"@deepseek-ai/dsh-client-ui-settings-plugins": "0.1.1-rc.2",
"@deepseek-ai/dsh-client-ui-sidebar": "0.1.1-rc.2",
"@deepseek-ai/dsh-client-ui-layout": "0.1.1-rc.2",
"@deepseek-ai/dsh-client-ui-slots": "0.1.1-rc.2",
"@deepseek-ai/dsh-agent": "0.1.2-alpha.1",
"@deepseek-ai/dsh-commands": "0.1.2-alpha.1",
"@deepseek-ai/dsh-fs": "0.1.2-alpha.1",
"@deepseek-ai/dsh-host-directory-picker": "0.1.2-alpha.1",
"@deepseek-ai/dsh-llm": "0.1.2-alpha.1",
"@deepseek-ai/dsh-mcp-client": "0.1.2-alpha.1",
"@deepseek-ai/dsh-session": "0.1.2-alpha.1",
"@deepseek-ai/dsh-settings": "0.1.2-alpha.1",
"@deepseek-ai/dsh-skill": "0.1.2-alpha.1",
"@deepseek-ai/dsh-subprocess": "0.1.2-alpha.1",
"@deepseek-ai/dsh-system-prompt": "0.1.2-alpha.1",
"@deepseek-ai/dsh-tools": "0.1.2-alpha.1",
"@deepseek-ai/dsh-client-connection": "0.1.2-alpha.1",
"@deepseek-ai/dsh-client-locale": "0.1.2-alpha.1",
"@deepseek-ai/dsh-client-store": "0.1.2-alpha.1",
"@deepseek-ai/dsh-client-ui-primitives": "0.1.2-alpha.1",
"@deepseek-ai/dsh-client-ui-renderer": "0.1.2-alpha.1",
"@deepseek-ai/dsh-client-ui-settings": "0.1.2-alpha.1",
"@deepseek-ai/dsh-client-ui-settings-plugins": "0.1.2-alpha.1",
"@deepseek-ai/dsh-client-ui-sidebar": "0.1.2-alpha.1",
"@deepseek-ai/dsh-client-ui-layout": "0.1.2-alpha.1",
"@deepseek-ai/dsh-client-ui-slots": "0.1.2-alpha.1",
"@tailwindcss/vite": "4.3.3",
"@tanstack/react-router": "1.169.2",
"@types/node": "22.20.1",
Expand Down
2 changes: 1 addition & 1 deletion packages/mtmharness/scripts/profile-migration.mjs
Original file line number Diff line number Diff line change
Expand Up @@ -13,7 +13,7 @@ if (tarballArg === undefined) throw new Error("usage: profile-migration.mjs <mtm
const tarball = resolve(process.cwd(), tarballArg);
if (!existsSync(tarball)) throw new Error("mtmharness profile: tarball does not exist: " + tarball);

const dshPackage = process.env.DSH_PACKAGE ?? "@deepseek-ai/dsh@0.1.1-rc.2";
const dshPackage = process.env.DSH_PACKAGE ?? "@deepseek-ai/dsh@0.1.2-alpha.1";
const root = mkdtempSync(join(tmpdir(), "mtmharness-profile-"));
const dshHome = join(root, "dsh-home");
const legacyRoot = join(root, "legacy");
Expand Down
4 changes: 1 addition & 3 deletions packages/mtmharness/scripts/verify-package.mjs
Original file line number Diff line number Diff line change
Expand Up @@ -18,14 +18,12 @@ if (manifest.dsh?.bundle?.patch !== "./cordis.patch.yml") fail("dsh.bundle.patch
if (manifest.dsh?.client?.platform !== "web") fail("dsh.client.platform must be web");
const expectedInject = [
"@deepseek-ai/dsh-client-connection",
"@deepseek-ai/dsh-client-runtime",
"@deepseek-ai/dsh-client-ui-primitives",
"@deepseek-ai/dsh-client-ui-renderer",
"@deepseek-ai/dsh-client-ui-sidebar",
"@deepseek-ai/dsh-client-ui-layout",
"@deepseek-ai/dsh-client-locale",
"@deepseek-ai/dsh-client-ui-settings",
"@deepseek-ai/dsh-client-ui-settings-plugins",
"@deepseek-ai/dsh-client-ui-slots",
];
if (JSON.stringify(manifest.dsh?.client?.inject) !== JSON.stringify(expectedInject)) {
fail("dsh.client.inject must exactly match " + JSON.stringify(expectedInject));
Expand Down
5 changes: 3 additions & 2 deletions packages/mtmharness/src/client/index.ts
Original file line number Diff line number Diff line change
@@ -1,5 +1,6 @@
/** Assemble the MTM Harness client domains into one DSH plugin entry. */
import type { ClientContext } from "@deepseek-ai/dsh-client-runtime/client";
import type { Context } from "@deepseek-ai/cordis";
import type {} from "@deepseek-ai/dsh-client-ui-renderer/client";
import type {} from "@deepseek-ai/dsh-client-locale/client";
import type {} from "@deepseek-ai/dsh-client-ui-settings/client";
import type {} from "@deepseek-ai/dsh-client-ui-settings-plugins/client";
Expand All @@ -18,7 +19,7 @@ export { applyCoding };
export const inject = ["slots", "connection", "locale", "settingsScope"];

/** Register every MTM and coding feature under one plugin-owned lifecycle. */
export function apply(ctx: ClientContext): void {
export function apply(ctx: Context): void {
if (ctx.get("connection") === undefined) throw new Error("mtmharness: DSH connection service is unavailable");
applyCoding(ctx);
const runtime = applyConnect(ctx);
Expand Down
4 changes: 2 additions & 2 deletions packages/mtmharness/src/features/canvas/client/index.ts
Original file line number Diff line number Diff line change
@@ -1,10 +1,10 @@
import type { ClientContext } from "@deepseek-ai/dsh-client-runtime/client";
import type { Context } from "@deepseek-ai/cordis";
import type { ConnectionHandle } from "@deepseek-ai/dsh-client-connection/client";
import { CanvasRuntime } from "./runtime.ts";
import { MTM_CANVAS_CSS } from "./styles.ts";

/** Mount the browser Canvas runtime and its plugin-owned styles. */
export function apply(ctx: ClientContext): CanvasRuntime {
export function apply(ctx: Context): CanvasRuntime {
const connection = ctx.get("connection") as ConnectionHandle | undefined;
if (connection === undefined) throw new Error("mtm-canvas: DSH connection service is unavailable");
const runtime = new CanvasRuntime(connection.rpc);
Expand Down
2 changes: 1 addition & 1 deletion packages/mtmharness/src/features/canvas/client/runtime.ts
Original file line number Diff line number Diff line change
@@ -1,4 +1,4 @@
import type { ObservableSnapshot } from "@deepseek-ai/dsh-client-runtime/client";
import type { ObservableSnapshot } from "@deepseek-ai/dsh-client-store";
import type { ClientConnectionRpc } from "@deepseek-ai/dsh-client-connection/client";
import { MTM_CANVAS_CHANNEL, type CanvasFileWire, type CanvasReadWire } from "../contract/rpc.ts";
import { createCanvasDocument, createNodeId, validateCanvasDocument, type CanvasDocument, type CanvasPosition } from "../contract/canvas.ts";
Expand Down
2 changes: 1 addition & 1 deletion packages/mtmharness/src/features/canvas/index.ts
Original file line number Diff line number Diff line change
Expand Up @@ -110,7 +110,7 @@ export function createCanvasRpcHandler(ctx: Context) {
/** Mount the file-backed Canvas RPC on the existing loopback Connection seam. */
export function apply(ctx: Context): void {
ctx.effect(() => {
const remove = ctx.connection.rpc.handle(MTM_CANVAS_CHANNEL, createCanvasRpcHandler(ctx), { authority: "loopback" });
const remove = ctx.connection.rpc.handle(MTM_CANVAS_CHANNEL, createCanvasRpcHandler(ctx));
return remove;
}, "mtm-canvas: file-backed RPC");
}
5 changes: 3 additions & 2 deletions packages/mtmharness/src/features/coding/client/controller.ts
Original file line number Diff line number Diff line change
@@ -1,5 +1,6 @@
import type { SettingsScope, SnapshotStore } from "@deepseek-ai/dsh-client-runtime/client";
import { createSnapshotStore } from "@deepseek-ai/dsh-client-runtime/client";
import type { SnapshotStore } from "@deepseek-ai/dsh-client-store";
import { createSnapshotStore } from "@deepseek-ai/dsh-client-store";
import type { SettingsScope } from "@deepseek-ai/dsh-client-ui-settings/client";
import type { MtmCodingSettings, PonytailMode, RtkMode } from "../types.js";

export const SETTINGS_NAMESPACE = "mtm-coding";
Expand Down
5 changes: 3 additions & 2 deletions packages/mtmharness/src/features/coding/client/index.tsx
Original file line number Diff line number Diff line change
@@ -1,4 +1,5 @@
import type { ClientContext } from "@deepseek-ai/dsh-client-runtime/client";
import type { Context } from "@deepseek-ai/cordis";
import type {} from "@deepseek-ai/dsh-client-ui-renderer/client";
import type {} from "@deepseek-ai/dsh-client-locale/client";
import type {} from "@deepseek-ai/dsh-client-ui-settings/client";
import type {} from "@deepseek-ai/dsh-client-ui-settings-plugins/client";
Expand All @@ -17,7 +18,7 @@ declare module "@deepseek-ai/dsh-client-ui-slots" {
export const name = "mtm-coding-client";
export const inject = ["slots", "locale", "settingsScope"];

export function apply(ctx: ClientContext): void {
export function apply(ctx: Context): void {
const t = ctx.locale.bind("mtm.coding");
ctx.effect(() => ctx.locale.register("mtm.coding", { en, zh }), "mtm-coding: locale");
const controller = new MtmCodingCardController(ctx.settingsScope.bind({ namespace: SETTINGS_NAMESPACE }));
Expand Down
4 changes: 2 additions & 2 deletions packages/mtmharness/src/features/connect/client/index.ts
Original file line number Diff line number Diff line change
@@ -1,10 +1,10 @@
import type { ClientContext } from "@deepseek-ai/dsh-client-runtime/client";
import type { Context } from "@deepseek-ai/cordis";
import type { ConnectionHandle } from "@deepseek-ai/dsh-client-connection/client";
import { createMtmConnectTransport, MtmConnectClientRuntime } from "./runtime.ts";
import { MTM_CONNECT_CSS } from "./styles.ts";

/** Mount the browser connection runtime and its scoped styles. */
export function apply(ctx: ClientContext): MtmConnectClientRuntime {
export function apply(ctx: Context): MtmConnectClientRuntime {
const connection = ctx.get("connection") as ConnectionHandle | undefined;
if (connection === undefined) throw new Error("mtm-connect: DSH connection service is unavailable");
const runtime = new MtmConnectClientRuntime({ transport: createMtmConnectTransport(connection.rpc) });
Expand Down
2 changes: 1 addition & 1 deletion packages/mtmharness/src/features/connect/client/runtime.ts
Original file line number Diff line number Diff line change
@@ -1,4 +1,4 @@
import type { ObservableSnapshot } from "@deepseek-ai/dsh-client-runtime/client";
import type { ObservableSnapshot } from "@deepseek-ai/dsh-client-store";
import type { ClientConnectionRpc } from "@deepseek-ai/dsh-client-connection/client";
import type { EventProjection, EventPolicy, ExternalConnectionEvent } from "../contract/event.ts";
import type { CapabilityInvocationResult, MtmConnectInvocationRequest, MtmConnectMutation, MtmConnectSnapshot } from "../contract/connection.ts";
Expand Down
1 change: 0 additions & 1 deletion packages/mtmharness/src/features/connect/index.ts
Original file line number Diff line number Diff line change
Expand Up @@ -83,7 +83,6 @@ export function apply(ctx: Context, config: MtmConnectHostConfig = {}): void {
const remove = ctx.connection.rpc.handle(
MTM_CONNECT_CHANNEL,
createMtmConnectRpcHandler(registry, { allowControlReconcile: config.allowControlReconcile === true }),
{ authority: "loopback" },
);
return async () => {
await remove();
Expand Down
15 changes: 0 additions & 15 deletions packages/mtmharness/tests/client-runtime-stub.ts

This file was deleted.

2 changes: 1 addition & 1 deletion packages/mtmharness/tests/coding-controller.test.mjs
Original file line number Diff line number Diff line change
Expand Up @@ -81,7 +81,7 @@ function loadClient() {
assert.ok(registration, "client artifact must register with the DSH loader");

const external = new Map([
["@deepseek-ai/dsh-client-runtime/client", { createSnapshotStore }],
["@deepseek-ai/dsh-client-store", { createSnapshotStore }],
["@deepseek-ai/dsh-client-ui-primitives", {
Button: () => null,
Modal: () => null,
Expand Down
1 change: 0 additions & 1 deletion packages/mtmharness/vitest.config.ts
Original file line number Diff line number Diff line change
Expand Up @@ -8,7 +8,6 @@ export default defineConfig({
alias: {
"@": fileURLToPath(new URL("./standalone/src", import.meta.url)),
"@deepseek-ai/dsh-client-ui-primitives": fileURLToPath(new URL("./tests/primitive-stub.tsx", import.meta.url)),
"@deepseek-ai/dsh-client-runtime/client": fileURLToPath(new URL("./tests/client-runtime-stub.ts", import.meta.url)),
},
},
test: {
Expand Down
Loading
Loading