diff --git a/.agents/notes/implemented/architecture/2026-09-14-deepseek-account-login.i18n.yaml b/.agents/notes/implemented/architecture/2026-09-14-deepseek-account-login.i18n.yaml index a97feda0c1..b6a41569d2 100644 --- a/.agents/notes/implemented/architecture/2026-09-14-deepseek-account-login.i18n.yaml +++ b/.agents/notes/implemented/architecture/2026-09-14-deepseek-account-login.i18n.yaml @@ -2,5 +2,5 @@ # side as of the last confirmed-consistent state. Both languages carry equal authority; # after editing either side, bring the other along and re-record with: # pnpm run verify-translation-pairing --write .agents/notes/implemented/architecture/2026-09-14-deepseek-account-login.md -2026-09-14-deepseek-account-login.md: 65405b293cdea14a231d8d700589f9c3e7ef6db7 -2026-09-14-deepseek-account-login.zh.md: 0aca011826006a0fb8f0557464187b73da377238 +2026-09-14-deepseek-account-login.md: 9d9853617a3b7e288084c93eac4e150f3c180999 +2026-09-14-deepseek-account-login.zh.md: d9cdbed25b0ae79caa4c61b310383cc52d8b586a diff --git a/.agents/notes/implemented/architecture/2026-09-14-deepseek-account-login.md b/.agents/notes/implemented/architecture/2026-09-14-deepseek-account-login.md index 65405b293c..9d9853617a 100644 --- a/.agents/notes/implemented/architecture/2026-09-14-deepseek-account-login.md +++ b/.agents/notes/implemented/architecture/2026-09-14-deepseek-account-login.md @@ -46,7 +46,7 @@ Profile and recharge-wallet queries use independent getProfile and getBalance op Deployment authentication uses explicit Host-only requestHeaders on the configured Platform origin. The provider rejects redirects and reserved-header overrides so deployment cookies cannot replace account authorization or follow a browser destination. Environment-specific authentication protocols remain outside the account provider. -The Host sends login_source (desktop or web) in auth_init so Platform can choose the completion experience. Web failures close the authorization tab while the original tab receives Host state; no Web UI return URL is used. The backend accepts localhost callbacks. DSH preserves the browser-supplied localhost hostname and port without DNS resolution or conversion to an IP literal. +The bundled account UI is Desktop-only: its preload bridge enables the account launcher, settings and sign-in onboarding. Plain Web retains API-key onboarding and the standard Settings launcher without account subscription or login. The Host protocol accepts login_source (desktop or web) in auth_init; the bundled UI sends desktop. The backend accepts localhost callbacks. DSH preserves the browser-supplied localhost hostname and port without DNS resolution or conversion to an IP literal. The macOS development launcher registers an isolated, ad-hoc-signed application bundle for `dsh://open`. The bundle retains the workspace entry and development paths for Launch Services cold starts without copying credentials or changing the package-manager-owned Electron application. Protocol registration targets the latest launched development or packaged application. diff --git a/.agents/notes/implemented/architecture/2026-09-14-deepseek-account-login.zh.md b/.agents/notes/implemented/architecture/2026-09-14-deepseek-account-login.zh.md index 0aca011826..d9cdbed25b 100644 --- a/.agents/notes/implemented/architecture/2026-09-14-deepseek-account-login.zh.md +++ b/.agents/notes/implemented/architecture/2026-09-14-deepseek-account-login.zh.md @@ -46,7 +46,7 @@ DSH 授权通过 x-dsh-auth-token 请求头鉴权 Platform、推理和 Files 请 开发环境认证通过配置的平台来源上的显式 Host 请求头 requestHeaders 完成。提供者拒绝重定向和保留请求头覆盖,防止开发环境 Cookie 替换账号授权或跟随浏览器跳转地址。特定环境的认证协议不属于账号提供者。 -Host 在 auth_init 中发送 login_source(desktop 或 web),供 Platform 选择完成页交互。Web 失败时关闭授权标签页,原标签页接收 Host 状态,不使用 Web UI 返回地址。后端接受 localhost 回调。DSH 保留浏览器提供的 localhost 主机名和端口,不做 DNS 解析或 IP 字面量转换。 +内置账号界面仅用于 Desktop:preload 桥接启用账号入口、设置和登录引导。普通 Web 保留 API Key 引导及标准设置入口,不订阅账号状态或显示登录。Host 协议在 auth_init 中接受 login_source(desktop 或 web);内置界面发送 desktop。后端接受 localhost 回调。DSH 保留浏览器提供的 localhost 主机名和端口,不做 DNS 解析或 IP 字面量转换。 macOS 开发启动器为 `dsh://open` 注册独立、经临时签名的应用包。该应用包保留工作区入口和开发路径,使 Launch Services 能够冷启动;凭证不会被复制,也不修改包管理器安装的 Electron 应用。协议注册指向最近启动的开发版或打包版应用。 diff --git a/apps/cli/package.json b/apps/cli/package.json index b1efe06eeb..ed960a9b39 100644 --- a/apps/cli/package.json +++ b/apps/cli/package.json @@ -1,7 +1,7 @@ { "name": "@deepseek-ai/dsh", "description": "dsh CLI: profile launch, plugin management, and configuration inspection", - "version": "0.1.6-alpha.2", + "version": "0.1.7-alpha.1", "publishConfig": { "access": "public" }, diff --git a/apps/desktop-host/package.json b/apps/desktop-host/package.json index 40814af281..32bad4b043 100644 --- a/apps/desktop-host/package.json +++ b/apps/desktop-host/package.json @@ -1,7 +1,7 @@ { "name": "@deepseek-ai/dsh-desktop-host", "description": "Private Node-mode host process for the Electron desktop application", - "version": "0.1.6-alpha.2", + "version": "0.1.7-alpha.1", "private": true, "license": "MIT", "type": "module", diff --git a/apps/desktop/package.json b/apps/desktop/package.json index 294606fd72..0840c6cb04 100644 --- a/apps/desktop/package.json +++ b/apps/desktop/package.json @@ -1,7 +1,7 @@ { "name": "@deepseek-ai/dsh-desktop", "description": "Electron desktop shell for a bundled dsh runtime and external plugins", - "version": "0.1.6-alpha.2", + "version": "0.1.7-alpha.1", "private": true, "license": "MIT", "type": "module", diff --git a/apps/web/package.json b/apps/web/package.json index baf572840b..35f2e07840 100644 --- a/apps/web/package.json +++ b/apps/web/package.json @@ -1,7 +1,7 @@ { "name": "@deepseek-ai/dsh-web-frontend", "description": "Web application entry: vite build over the @deepseek-ai/dsh-client-web shell library; dist/ served by apps/cli's dsh web", - "version": "0.1.6-alpha.2", + "version": "0.1.7-alpha.1", "publishConfig": { "access": "public" }, diff --git a/apps/web/tests/agent-preset-authoring.e2e.ts b/apps/web/tests/agent-preset-authoring.e2e.ts index 562f81b33f..301b268177 100644 --- a/apps/web/tests/agent-preset-authoring.e2e.ts +++ b/apps/web/tests/agent-preset-authoring.e2e.ts @@ -5,7 +5,7 @@ import type { Browser, Page } from 'playwright' import { chromium } from 'playwright' import { afterAll, beforeAll, describe, expect, it, onTestFailed } from 'vitest' import { captureStableAria, compareOrRefreshGolden, launchWebScaffold, watchConsole, webSnapshotMode, type WebScaffold } from './scaffold.ts' -import { openSettingsFromAccountMenu, ZH_BROWSER_LOCALE, connectFreshWorkspaceZh, saveFailureShot } from './support.ts' +import { openSettings, ZH_BROWSER_LOCALE, connectFreshWorkspaceZh, saveFailureShot } from './support.ts' const EXPECTED = fileURLToPath(new URL('./expected/agent-preset-authoring', import.meta.url)) const mode = webSnapshotMode() @@ -21,7 +21,7 @@ describe('web e2e: preset roster guidance', () => { page = await browser.newPage({ viewport: { width: 1680, height: 1000 }, locale: ZH_BROWSER_LOCALE }) tripwire = watchConsole(page) await page.goto(scaffold.authenticatedUrl, { waitUntil: 'load' }) - await openSettingsFromAccountMenu(page, 'zh') + await openSettings(page, 'zh') await page.getByRole('dialog', { name: '设置' }).getByRole('button', { name: 'Agent 预设' }).click() await page.getByRole('heading', { name: 'Agent 预设' }).waitFor() }, 120_000) @@ -61,7 +61,7 @@ describe('web e2e: preset roster guidance', () => { // so the flow needs a connected workspace to enter. await page.getByRole('dialog', { name: '设置' }).getByRole('button', { name: '关闭', exact: true }).last().click() await connectFreshWorkspaceZh(page, scaffold.workspaceCwd) - await openSettingsFromAccountMenu(page, 'zh') + await openSettings(page, 'zh') const settings = page.getByRole('dialog', { name: '设置' }) await settings.getByRole('button', { name: 'Agent 预设' }).click() await settings.getByRole('button', { name: '让 Agent 帮我创建预设模式', exact: true }).click() diff --git a/apps/web/tests/agent-preset-selection.e2e.ts b/apps/web/tests/agent-preset-selection.e2e.ts index bb45f94247..c8be11b929 100644 --- a/apps/web/tests/agent-preset-selection.e2e.ts +++ b/apps/web/tests/agent-preset-selection.e2e.ts @@ -24,7 +24,7 @@ import { captureStableAria, compareOrRefreshGolden, launchWebScaffold, seedSession, watchConsole, webSnapshotMode, type WebScaffold, } from './scaffold.ts' -import { openSettingsFromAccountMenu, +import { openSettings, connectFreshWorkspace, newEnglishPage, saveFailureShot, writeComposerDraft, } from './support.ts' @@ -254,7 +254,7 @@ describe('web e2e: agent-preset selection', () => { await connectFreshWorkspace(page, scaffold.workspaceCwd) await page.getByRole('button', { name: 'Standard mode', exact: true }).waitFor({ timeout: 10_000 }) - await openSettingsFromAccountMenu(page, 'en') + await openSettings(page, 'en') const dialog = page.getByRole('dialog', { name: 'Settings' }) await dialog.getByRole('button', { name: 'Agent presets' }).click() const toggle = dialog.getByRole('switch', { name: 'Choose a mode for new tasks' }) @@ -347,7 +347,7 @@ describe('web e2e: agent-preset selection', () => { onTestFailed(() => saveFailureShot(page, 'web-e2e-agent-preset-disabled')) await expect.poll(() => livePreset(scaffold), { timeout: 15_000 }).toBe('standard') - await openSettingsFromAccountMenu(page, 'en') + await openSettings(page, 'en') const dialog = page.getByRole('dialog', { name: 'Settings' }) await dialog.getByRole('button', { name: 'Agent presets' }).click() await dialog.getByRole('button', { name: 'Set as new task default: Minimal mode' }).click() @@ -364,7 +364,7 @@ describe('web e2e: agent-preset selection', () => { // The switch controls availability only: re-enabling restores the saved // default and aligns this same still-blank task with it. - await openSettingsFromAccountMenu(page, 'en') + await openSettings(page, 'en') const reopened = page.getByRole('dialog', { name: 'Settings' }) await reopened.getByRole('button', { name: 'Agent presets' }).click() const reopenedToggle = reopened.getByRole('switch', { name: 'Choose a mode for new tasks' }) diff --git a/apps/web/tests/agent-team-panel.e2e.ts b/apps/web/tests/agent-team-panel.e2e.ts index 54a75ee28b..3e5ad5e0c2 100644 --- a/apps/web/tests/agent-team-panel.e2e.ts +++ b/apps/web/tests/agent-team-panel.e2e.ts @@ -158,7 +158,7 @@ describe('web e2e: Agent Teams panel', () => { expect(await trigger.evaluate(element => element === document.activeElement)).toBe(true) await page.keyboard.press('Enter') await panel.waitFor() - const outside = page.getByRole('button', { name: 'Account menu', exact: true }) + const outside = page.getByRole('button', { name: 'Settings', exact: true }) await outside.focus() await panel.waitFor({ state: 'detached' }) expect(await outside.evaluate(element => element === document.activeElement)).toBe(true) diff --git a/apps/web/tests/changed-files-turn.e2e.ts b/apps/web/tests/changed-files-turn.e2e.ts index 454e71f9b3..523a27d6a6 100644 --- a/apps/web/tests/changed-files-turn.e2e.ts +++ b/apps/web/tests/changed-files-turn.e2e.ts @@ -14,7 +14,7 @@ import { fixtureUserPrompts, launchWebScaffold, recordFixture, watchConsole, webSnapshotMode, type WebScaffold, } from './scaffold.ts' -import { openSettingsFromAccountMenu, connectFreshWorkspaceZh, ZH_BROWSER_LOCALE } from './support.ts' +import { openSettings, connectFreshWorkspaceZh, ZH_BROWSER_LOCALE } from './support.ts' const DIR = fileURLToPath(new URL('../../../snapshots/web/changed-files-turn', import.meta.url)) const FIXTURE = join(DIR, 'session.v3.jsonl') @@ -136,7 +136,7 @@ describe('web e2e: a git workspace turn ends with its changed files', () => { expect(await header.getByRole('tablist').count()).toBe(0) const compactHeight = await header.evaluate(element => element.getBoundingClientRect().height) expect(compactHeight).toBeLessThan(60) - await openSettingsFromAccountMenu(page, 'zh') + await openSettings(page, 'zh') const settings = page.getByRole('dialog', { name: '设置' }) await settings.getByRole('switch', { name: '开发者工具' }).click() await expect.poll(() => settings.getByRole('switch', { name: '开发者工具' }).getAttribute('aria-checked')).toBe('true') diff --git a/apps/web/tests/clickable-links-gallery.e2e.ts b/apps/web/tests/clickable-links-gallery.e2e.ts index 59afb67257..2689cf8769 100644 --- a/apps/web/tests/clickable-links-gallery.e2e.ts +++ b/apps/web/tests/clickable-links-gallery.e2e.ts @@ -35,7 +35,7 @@ import { webSnapshotMode, type WebScaffold, } from './scaffold.ts' -import { openSettingsFromAccountMenu, expandTurnProcesses, newEnglishPage, saveFailureShot } from './support.ts' +import { openSettings, expandTurnProcesses, newEnglishPage, saveFailureShot } from './support.ts' const SNAPSHOT_DIR = fileURLToPath(new URL('./expected/clickable-links-gallery', import.meta.url)) const UI_EXPECTED = fileURLToPath(new URL('./expected/clickable-links-gallery/ui.expected.md', import.meta.url)) @@ -453,7 +453,7 @@ describe('web e2e: clickable links gallery', () => { await markdown.locator(`a[href="${HTTP_URL}"]`).click() await expect.poll(() => browserAddress.inputValue()).toBe(HTTP_URL) - await openSettingsFromAccountMenu(page, 'en') + await openSettings(page, 'en') await page.getByRole('button', { name: 'Built-in browser', exact: true }).click() await page.getByRole('menuitem', { name: 'New browser tab', exact: true }).click() await expect.poll(() => scaffold.ctx.settings.describe().find(row => row.ns === 'ui-chat')?.value).toMatchObject({ linkOpening: 'new-tab' }) @@ -470,7 +470,7 @@ describe('web e2e: clickable links gallery', () => { } await page.reload() - await openSettingsFromAccountMenu(page, 'en') + await openSettings(page, 'en') await page.getByRole('button', { name: 'New browser tab', exact: true }).click() await page.getByRole('menuitem', { name: 'Built-in browser', exact: true }).click() await expect.poll(() => scaffold.ctx.settings.describe().find(row => row.ns === 'ui-chat')?.value).toMatchObject({ linkOpening: 'sidebar' }) diff --git a/apps/web/tests/client-plugin-live.e2e.ts b/apps/web/tests/client-plugin-live.e2e.ts index 2167baa1c8..8c8ff2b55f 100644 --- a/apps/web/tests/client-plugin-live.e2e.ts +++ b/apps/web/tests/client-plugin-live.e2e.ts @@ -9,7 +9,7 @@ import { assertFixtureInventory, captureStableAria, compareOrRefreshGolden, launchWebScaffold, seedSession, watchConsole, webSnapshotMode, } from './scaffold.ts' -import { openSettingsFromAccountMenu, newEnglishPage, saveFailureShot, ZH_BROWSER_LOCALE } from './support.ts' +import { openSettings, newEnglishPage, saveFailureShot, ZH_BROWSER_LOCALE } from './support.ts' const FIXTURE = fileURLToPath(new URL('./fixtures/plugins/fixture-live-client', import.meta.url)) const EXPECTED = fileURLToPath(new URL('./expected/client-plugin-live', import.meta.url)) @@ -19,7 +19,7 @@ const SESSION_TITLE = 'Session action extension' async function openInventory(page: Page, url: string) { await page.goto(url, { waitUntil: 'load' }) - await openSettingsFromAccountMenu(page, 'zh') + await openSettings(page, 'zh') const dialog = page.getByRole('dialog', { name: '设置' }) await dialog.getByRole('button', { name: '内置插件', exact: true }).click() await dialog.getByRole('searchbox', { name: '搜索插件' }).waitFor() diff --git a/apps/web/tests/deepseek-messages-settings.e2e.ts b/apps/web/tests/deepseek-messages-settings.e2e.ts index fb12fd204f..8e5f2a9617 100644 --- a/apps/web/tests/deepseek-messages-settings.e2e.ts +++ b/apps/web/tests/deepseek-messages-settings.e2e.ts @@ -8,7 +8,7 @@ import { captureStableAria, compareOrRefreshGolden, launchWebScaffold, watchConsole, webSnapshotMode, type WebScaffold, } from './scaffold.ts' -import { openSettingsFromAccountMenu, connectFreshWorkspaceZh, saveFailureShot, ZH_BROWSER_LOCALE } from './support.ts' +import { openSettings, connectFreshWorkspaceZh, saveFailureShot, ZH_BROWSER_LOCALE } from './support.ts' const EXPECTED = fileURLToPath(new URL('./expected/deepseek-messages-settings/', import.meta.url)) @@ -39,13 +39,11 @@ describe.skipIf(webSnapshotMode() === 'record')('web e2e: DeepSeek Messages sett expect(scaffold.ctx.llm.listProviders()).toContainEqual({ id: 'deepseek-official', name: 'DeepSeek' }) expect(scaffold.ctx.llm.listProviders().filter(provider => provider.id === 'deepseek-official')).toHaveLength(1) expect(scaffold.ctx.agentDefaultModel.currentSelection()).toEqual({ provider: 'deepseek-official', model: 'deepseek-flash' }) - await page.getByRole('dialog', { name: '开始你的创作' }) - .getByRole('button', { name: '添加 API Key', exact: true }).click() const onboarding = page.getByRole('dialog', { name: '添加一个 API Key 开始使用' }) await onboarding.getByLabel('API 密钥', { exact: true }).fill('sk-messages-onboarding') await onboarding.getByRole('button', { name: '保存并继续' }).click() await onboarding.waitFor({ state: 'detached' }) - await openSettingsFromAccountMenu(page, 'zh') + await openSettings(page, 'zh') const dialog = page.getByRole('dialog', { name: '设置', exact: true }) await dialog.getByRole('button', { name: '模型', exact: true }).click() await dialog.getByText('DeepSeek', { exact: true }).waitFor() diff --git a/apps/web/tests/desktop-locale.e2e.ts b/apps/web/tests/desktop-locale.e2e.ts index af27ad0813..e392789d8d 100644 --- a/apps/web/tests/desktop-locale.e2e.ts +++ b/apps/web/tests/desktop-locale.e2e.ts @@ -8,7 +8,7 @@ import { acknowledgeReloadConnectionLoss, assertFixtureInventory, captureStableAria, compareOrRefreshGolden, launchWebScaffold, watchConsole, webSnapshotMode, type WebScaffold, } from './scaffold.ts' -import { openSettingsFromAccountMenu, saveFailureShot } from './support.ts' +import { openSettings, saveFailureShot } from './support.ts' const SNAPSHOT_DIR = fileURLToPath(new URL('./expected/desktop-locale', import.meta.url)) const MODE = webSnapshotMode() @@ -53,7 +53,7 @@ describe.skipIf(MODE === 'record')('web e2e: native and Client locale preference it('uses OS languages without saving them, then shares an explicit choice across reloads', async () => { onTestFailed(() => saveFailureShot(page, 'web-e2e-desktop-locale')) await page.goto(scaffold.authenticatedUrl, { waitUntil: 'load' }) - await openSettingsFromAccountMenu(page, 'zh') + await openSettings(page, 'zh') const zhDialog = page.getByRole('dialog', { name: '设置', exact: true }) await zhDialog.getByRole('button', { name: '中文', exact: true }).waitFor() await expect.poll(() => reported).toEqual(['zh']) @@ -73,7 +73,7 @@ describe.skipIf(MODE === 'record')('web e2e: native and Client locale preference reported.length = 0 await page.reload({ waitUntil: 'load' }) acknowledgeReloadConnectionLoss(tripwire, warningsBefore) - await openSettingsFromAccountMenu(page, 'en') + await openSettings(page, 'en') await enDialog.getByRole('button', { name: 'English', exact: true }).waitFor() await expect.poll(() => reported).toEqual(['en']) expect(await page.evaluate(() => document.documentElement.lang)).toBe('en') diff --git a/apps/web/tests/developer-tools-settings.e2e.ts b/apps/web/tests/developer-tools-settings.e2e.ts index 95afa498bc..28bec282cc 100644 --- a/apps/web/tests/developer-tools-settings.e2e.ts +++ b/apps/web/tests/developer-tools-settings.e2e.ts @@ -4,7 +4,7 @@ import { join } from 'node:path' import { chromium } from 'playwright' import { expect, it, onTestFinished } from 'vitest' import { launchWebScaffold } from './scaffold.ts' -import { openSettingsFromAccountMenu, newEnglishPage } from './support.ts' +import { openSettings, newEnglishPage } from './support.ts' it('persists developer tools in the Host settings document and restores the accepted choice', async () => { const scaffold = await launchWebScaffold() @@ -13,7 +13,7 @@ it('persists developer tools in the Host settings document and restores the acce onTestFinished(() => browser.close()) const page = await newEnglishPage(browser) await page.goto(scaffold.authenticatedUrl) - await openSettingsFromAccountMenu(page, 'en') + await openSettings(page, 'en') const toggle = page.getByRole('switch', { name: 'Developer tools' }) expect(await toggle.getAttribute('aria-checked')).toBe('true') expect(await readFile(join(scaffold.harnessHome, 'profiles', 'scaffold', 'cordis.patch.yml'), 'utf8')).not.toMatch(/id: ui-settings(?:\r?\n|$)/) @@ -21,7 +21,7 @@ it('persists developer tools in the Host settings document and restores the acce await expect.poll(() => toggle.getAttribute('aria-checked')).toBe('false') expect(await readFile(join(scaffold.harnessHome, 'profiles', 'scaffold', 'cordis.patch.yml'), 'utf8')).toContain('enabled: false') await page.reload() - await openSettingsFromAccountMenu(page, 'en') + await openSettings(page, 'en') await expect.poll(() => toggle.getAttribute('aria-checked')).toBe('false') await page.getByRole('button', { name: 'Agent presets', exact: true }).click() diff --git a/apps/web/tests/document-preview.e2e.ts b/apps/web/tests/document-preview.e2e.ts index 456009064b..2a2a2ba60d 100644 --- a/apps/web/tests/document-preview.e2e.ts +++ b/apps/web/tests/document-preview.e2e.ts @@ -14,7 +14,7 @@ import { excelDrawingFixture } from '../../../packages/client/ui-sidebar-documen import { xlsFixture } from '../../../packages/client/ui-sidebar-documentpreview/tests/xls-fixture.ts' import { pdfFixture, selectionPdfFixture } from '../../../packages/client/ui-sidebar-documentpreview/tests/pdf-fixture.ts' import { assertFixtureInventory, compareOrRefreshGolden, launchWebScaffold, watchConsole, webSnapshotMode, type WebScaffold } from './scaffold.ts' -import { openSettingsFromAccountMenu, connectFreshWorkspace, newEnglishPage, saveFailureShot } from './support.ts' +import { openSettings, connectFreshWorkspace, newEnglishPage, saveFailureShot } from './support.ts' const FIXTURE = fileURLToPath(new URL('../../../snapshots/web/lifecycle-chrome/session.v3.jsonl', import.meta.url)) const SNAPSHOT_DIR = fileURLToPath(new URL('../../../snapshots/web/document-preview', import.meta.url)) @@ -425,7 +425,7 @@ else process.exit(1); `- Local script: ${await basicHtml.locator('#local-result').innerText()}`, `- Network requests: ${previewNetworkRequests}`, ].join('\n')) - await openSettingsFromAccountMenu(page, 'en') + await openSettings(page, 'en') const settings = page.getByRole('dialog', { name: 'Settings' }) await settings.getByRole('switch', { name: 'Developer tools' }).click() await expect.poll(() => settings.getByRole('switch', { name: 'Developer tools' }).getAttribute('aria-checked')).toBe('true') diff --git a/apps/web/tests/expected/onboarding-deepseek-config/sign-in.expected.md b/apps/web/tests/expected/onboarding-deepseek-config/sign-in.expected.md deleted file mode 100644 index 578696fd5c..0000000000 --- a/apps/web/tests/expected/onboarding-deepseek-config/sign-in.expected.md +++ /dev/null @@ -1,6 +0,0 @@ -- dialog "开始你的创作": - - heading "开始你的创作" [level=2] - - button "关闭" - - paragraph: 登录后即可创建、编辑和分享你的设计项目,所有内容在本地保存。 - - button "添加 API Key" - - button "登录" diff --git a/apps/web/tests/expected/voice-download.expected.md b/apps/web/tests/expected/voice-download.expected.md new file mode 100644 index 0000000000..b0714ffaed --- /dev/null +++ b/apps/web/tests/expected/voice-download.expected.md @@ -0,0 +1,4 @@ +- alert: + - paragraph: "Cannot download model.int8.onnx: the download service returned HTTP 503." + - paragraph: Confirm that the download address is available and the proxy can reach the download service, or retry later. + - text: "Download source: https://model-mirror.example" diff --git a/apps/web/tests/message-actions.e2e.ts b/apps/web/tests/message-actions.e2e.ts index d51f4c1195..8c6e7ea615 100644 --- a/apps/web/tests/message-actions.e2e.ts +++ b/apps/web/tests/message-actions.e2e.ts @@ -14,7 +14,7 @@ import { acknowledgeReloadConnectionLoss, assertFixtureInventory, captureStableAria, compareOrRefreshGolden, fixtureUserPrompts, launchWebScaffold, parseSeedFixture, renderSeedFixture, seedSession, watchConsole, webSnapshotMode, type WebScaffold, } from './scaffold.ts' -import { openSettingsFromAccountMenu, newEnglishPage, saveFailureShot } from './support.ts' +import { openSettings, newEnglishPage, saveFailureShot } from './support.ts' const SNAPSHOT_DIR = fileURLToPath(new URL('../../../snapshots/web/message-actions', import.meta.url)) // Borrowed read-only: this scenario needs any settled user+assistant pair, not @@ -321,7 +321,7 @@ describe('web e2e: message IconActions and clocks on settled history', () => { it.skipIf(MODE === 'record')('persists performance detail and hides statistics in Compact', async () => { onTestFailed(() => saveFailureShot(page, 'web-e2e-performance-usage')) const stats = page.locator('[data-composer-stats]') - await openSettingsFromAccountMenu(page, 'en') + await openSettings(page, 'en') const dialog = page.getByRole('dialog', { name: 'Settings', exact: true }) const row = dialog.getByText('Performance & usage', { exact: true }).locator('../..') await row.getByRole('button', { name: 'Detailed', exact: true }).click() @@ -336,7 +336,7 @@ describe('web e2e: message IconActions and clocks on settled history', () => { await compareOrRefreshGolden(join(SNAPSHOT_DIR, 'compact.expected.md'), await captureStableAria(page, '[data-composer-stats]', scaffold.workspaceCwd), MODE) const warningStart = tripwire.warnings.length await page.reload() - await openSettingsFromAccountMenu(page, 'en') + await openSettings(page, 'en') await row.getByRole('button', { name: 'Compact', exact: true }).waitFor() acknowledgeReloadConnectionLoss(tripwire, warningStart) await row.getByRole('button', { name: 'Compact', exact: true }).click() diff --git a/apps/web/tests/models-settings-recovery.e2e.ts b/apps/web/tests/models-settings-recovery.e2e.ts index 5f460edc3d..c9cb16617f 100644 --- a/apps/web/tests/models-settings-recovery.e2e.ts +++ b/apps/web/tests/models-settings-recovery.e2e.ts @@ -9,7 +9,7 @@ import { captureStableAria, compareOrRefreshGolden, launchWebScaffold, watchConsole, webSnapshotMode, type WebScaffold, } from './scaffold.ts' -import { openSettingsFromAccountMenu, saveFailureShot, ZH_BROWSER_LOCALE } from './support.ts' +import { openSettings, saveFailureShot, ZH_BROWSER_LOCALE } from './support.ts' const EXPECTED = fileURLToPath(new URL('./expected/models-settings-recovery/stored-error.expected.md', import.meta.url)) const FAILURE = 'llm-pi-ai: provider "openrouter" model "111" needs an api; ' @@ -37,7 +37,7 @@ describe('web e2e: repairs a stored provider after catalog drift', () => { page = await browser.newPage({ viewport: { width: 1680, height: 1000 }, locale: ZH_BROWSER_LOCALE }) tripwire = watchConsole(page) await page.goto(scaffold.authenticatedUrl, { waitUntil: 'load' }) - await openSettingsFromAccountMenu(page, 'zh') + await openSettings(page, 'zh') const dialog = page.getByRole('dialog', { name: '设置' }) await dialog.getByRole('button', { name: '模型', exact: true }).click() await dialog.getByText(FAILURE, { exact: true }).waitFor() diff --git a/apps/web/tests/models-settings.e2e.ts b/apps/web/tests/models-settings.e2e.ts index d901d80df0..68857956f3 100644 --- a/apps/web/tests/models-settings.e2e.ts +++ b/apps/web/tests/models-settings.e2e.ts @@ -25,7 +25,7 @@ import { assertFixtureInventory, captureStableAria, compareOrRefreshGolden, launchWebScaffold, watchConsole, webSnapshotMode, type WebScaffold, } from './scaffold.ts' -import { openSettingsFromAccountMenu, ZH_BROWSER_LOCALE, saveFailureShot } from './support.ts' +import { openSettings, ZH_BROWSER_LOCALE, saveFailureShot } from './support.ts' const SNAPSHOT_DIR = fileURLToPath(new URL('./expected/models-settings', import.meta.url)) const EMPTY_EXPECTED = join(SNAPSHOT_DIR, 'empty.expected.md') @@ -72,7 +72,7 @@ describe('web e2e: Models settings page configures a dormant provider', () => { it('opens the add card over the dormant directory vocabulary', async () => { onTestFailed(() => saveFailureShot(page, 'web-e2e-models-empty')) - await openSettingsFromAccountMenu(page, 'zh') + await openSettings(page, 'zh') const dialog = page.getByRole('dialog', { name: '设置' }) await dialog.waitFor({ timeout: 10_000 }) await dialog.getByRole('button', { name: '模型', exact: true }).click() diff --git a/apps/web/tests/onboarding-deepseek-config.e2e.ts b/apps/web/tests/onboarding-deepseek-config.e2e.ts index c084088c5b..30cae9db7b 100644 --- a/apps/web/tests/onboarding-deepseek-config.e2e.ts +++ b/apps/web/tests/onboarding-deepseek-config.e2e.ts @@ -16,11 +16,10 @@ import { WELCOME_NOTICE_ACK_FIELD, WELCOME_NOTICE_COPY, WELCOME_NOTICE_SETTINGS_NAMESPACE, WELCOME_NOTICE_VERSION, } from './scaffold.ts' -import { openSettingsFromAccountMenu, ZH_BROWSER_LOCALE, connectFreshWorkspaceZh, saveFailureShot } from './support.ts' +import { openSettings, ZH_BROWSER_LOCALE, connectFreshWorkspaceZh, saveFailureShot } from './support.ts' const SNAPSHOT_DIR = fileURLToPath(new URL('./expected/onboarding-deepseek-config', import.meta.url)) const WELCOME_EXPECTED = join(SNAPSHOT_DIR, 'welcome.expected.md') -const SIGN_IN_EXPECTED = join(SNAPSHOT_DIR, 'sign-in.expected.md') const MISSING_EXPECTED = join(SNAPSHOT_DIR, 'missing.expected.md') const MODELS_EXPECTED = join(SNAPSHOT_DIR, 'models.expected.md') const DEFAULT_MODELS_EXPECTED = join(SNAPSHOT_DIR, 'default-models.expected.md') @@ -73,13 +72,10 @@ describe.skipIf(MODE === 'record')('web e2e: first-run DeepSeek credential setup await welcome.getByRole('button', { name: WELCOME_NOTICE_COPY.zh.continueLabel }).click() await welcome.waitFor({ state: 'detached', timeout: 15_000 }) - const signIn = page.getByRole('dialog', { name: '开始你的创作' }) - await signIn.waitFor({ timeout: 15_000 }) - await compareOrRefreshGolden(SIGN_IN_EXPECTED, - await captureStableAria(page, '[role="dialog"]', scaffold.workspaceCwd), MODE) - await signIn.getByRole('button', { name: '添加 API Key', exact: true }).click() const credentialStep = page.getByRole('dialog', { name: '添加一个 API Key 开始使用' }) await credentialStep.waitFor({ timeout: 15_000 }) + expect(await page.getByRole('dialog', { name: '开始你的创作' }).count()).toBe(0) + expect(await page.getByRole('button', { name: '账号菜单', exact: true }).count()).toBe(0) const keyInput = credentialStep.getByLabel('API 密钥', { exact: true }) await keyInput.waitFor({ timeout: 10_000 }) const initial = await captureStableAria(page, '[role="dialog"]', scaffold.workspaceCwd) @@ -102,7 +98,7 @@ describe.skipIf(MODE === 'record')('web e2e: first-run DeepSeek credential setup // The ordinary Models surface reuses the refreshed join and exposes the // configured write-only placeholder without a reload. - await openSettingsFromAccountMenu(page, 'zh') + await openSettings(page, 'zh') const settings = page.getByRole('dialog', { name: '设置' }) await settings.waitFor({ timeout: 10_000 }) await settings.getByRole('button', { name: '模型', exact: true }).click() @@ -203,7 +199,7 @@ describe.skipIf(MODE === 'record')('web e2e: first-run DeepSeek credential setup onTestFailed(() => saveFailureShot(page, 'web-e2e-onboarding-deepseek-models')) // Opened here rather than inherited: the credential test reloads the page // after configuring the key, so nothing carries an open dialog across. - await openSettingsFromAccountMenu(page, 'zh') + await openSettings(page, 'zh') const settings = page.getByRole('dialog', { name: '设置' }) await settings.waitFor({ timeout: 10_000 }) await settings.getByRole('button', { name: '模型', exact: true }).click() @@ -292,7 +288,7 @@ describe.skipIf(MODE === 'record')('web e2e: first-run DeepSeek credential setup it('keeps the fixture inventory closed', async () => { await assertFixtureInventory( SNAPSHOT_DIR, - ['welcome.expected.md', 'sign-in.expected.md', 'missing.expected.md', 'models.expected.md', 'default-models.expected.md'], + ['welcome.expected.md', 'missing.expected.md', 'models.expected.md', 'default-models.expected.md'], ) }) }) diff --git a/apps/web/tests/onboarding-native.e2e.ts b/apps/web/tests/onboarding-native.e2e.ts index 8a61c95e8c..c899288606 100644 --- a/apps/web/tests/onboarding-native.e2e.ts +++ b/apps/web/tests/onboarding-native.e2e.ts @@ -8,7 +8,7 @@ import { acknowledgeReloadConnectionLoss, assertFixtureInventory, captureStableAria, compareOrRefreshGolden, launchWebScaffold, watchConsole, webSnapshotMode, WELCOME_NOTICE_COPY, type WebScaffold, } from './scaffold.ts' -import { openSettingsFromAccountMenu, ZH_BROWSER_LOCALE, saveFailureShot } from './support.ts' +import { openSettings, ZH_BROWSER_LOCALE, saveFailureShot } from './support.ts' const SNAPSHOT_DIR = fileURLToPath(new URL('./expected/onboarding-native', import.meta.url)) const MODE = webSnapshotMode() @@ -52,7 +52,14 @@ describe.skipIf(MODE === 'record').each([false, true])('web e2e: native credenti await page.reload({ waitUntil: 'load' }) acknowledgeReloadConnectionLoss(tripwire, warningsBefore) } - await openSettingsFromAccountMenu(page, 'zh') + const accountMenu = page.getByRole('button', { name: '账号菜单', exact: true }) + if (desktop) await accountMenu.waitFor() + else { + await page.getByRole('button', { name: '设置', exact: true }).waitFor() + expect(await accountMenu.count()).toBe(0) + expect(await page.getByRole('dialog', { name: '开始你的创作' }).count()).toBe(0) + } + await openSettings(page, 'zh') const settings = page.getByRole('dialog', { name: '设置', exact: true }) await settings.getByRole('button', { name: '模型', exact: true }).click() await settings.getByLabel('API 密钥', { exact: true }).waitFor() diff --git a/apps/web/tests/onboarding-usable-provider.e2e.ts b/apps/web/tests/onboarding-usable-provider.e2e.ts index 615dc3daaa..ebddfb8e34 100644 --- a/apps/web/tests/onboarding-usable-provider.e2e.ts +++ b/apps/web/tests/onboarding-usable-provider.e2e.ts @@ -14,7 +14,7 @@ import { acknowledgeReloadConnectionLoss, assertFixtureInventory, captureStableAria, compareOrRefreshGolden, launchWebScaffold, watchConsole, webSnapshotMode, type WebScaffold, } from './scaffold.ts' -import { openSettingsFromAccountMenu, ZH_BROWSER_LOCALE, saveFailureShot } from './support.ts' +import { openSettings, ZH_BROWSER_LOCALE, saveFailureShot } from './support.ts' const SNAPSHOT_DIR = fileURLToPath(new URL('./expected/onboarding-usable-provider', import.meta.url)) const DISMISSED_EXPECTED = join(SNAPSHOT_DIR, 'dismissed.expected.md') @@ -44,15 +44,14 @@ describe.skipIf(MODE === 'record')('web e2e: another usable provider ends first- it('closes the setup card without discarding the add card beside it', async () => { onTestFailed(() => saveFailureShot(page, 'web-e2e-onboarding-setup-card-cancel')) - const signIn = page.getByRole('dialog', { name: '开始你的创作' }) - await signIn.waitFor({ timeout: 15_000 }) - await signIn.getByRole('button', { name: '添加 API Key', exact: true }).click() const credentialStep = page.getByRole('dialog', { name: CREDENTIAL_STEP }) await credentialStep.waitFor({ timeout: 15_000 }) + expect(await page.getByRole('dialog', { name: '开始你的创作' }).count()).toBe(0) + expect(await page.getByRole('button', { name: '账号菜单', exact: true }).count()).toBe(0) await credentialStep.getByRole('button', { name: '稍后配置' }).click() await credentialStep.waitFor({ state: 'detached', timeout: 15_000 }) - await openSettingsFromAccountMenu(page, 'zh') + await openSettings(page, 'zh') const settings = page.getByRole('dialog', { name: '设置' }) await settings.waitFor({ timeout: 10_000 }) // Dismissing the onboarding step leaves Settings closed, so enter the @@ -116,7 +115,7 @@ describe.skipIf(MODE === 'record')('web e2e: another usable provider ends first- // The Models page agrees: DeepSeek stays a row rather than reopening its // setup card over a user who already has somewhere to send a request. - await openSettingsFromAccountMenu(page, 'zh') + await openSettings(page, 'zh') await settings.waitFor({ timeout: 10_000 }) await settings.getByRole('button', { name: '模型', exact: true }).click() await settings.getByRole('button', { name: '编辑 DeepSeek (deepseek-official)' }).waitFor({ timeout: 10_000 }) diff --git a/apps/web/tests/plugin-manager.e2e.ts b/apps/web/tests/plugin-manager.e2e.ts index f3ed5e5f19..19a9c96e4d 100644 --- a/apps/web/tests/plugin-manager.e2e.ts +++ b/apps/web/tests/plugin-manager.e2e.ts @@ -14,7 +14,7 @@ import { SCAFFOLD_DEFAULTS_BUNDLE, assertFixtureInventory, captureStableAria, compareOrRefreshGolden, launchWebScaffold, watchConsole, webSnapshotMode, type WebScaffold, } from './scaffold.ts' -import { ZH_BROWSER_LOCALE, connectFreshWorkspaceZh, openSettingsFromAccountMenu, saveFailureShot } from './support.ts' +import { ZH_BROWSER_LOCALE, connectFreshWorkspaceZh, openSettings, saveFailureShot } from './support.ts' const SNAPSHOT_DIR = fileURLToPath(new URL('./expected/plugin-manager', import.meta.url)) const MANAGER_EXPECTED = join(SNAPSHOT_DIR, 'manager.expected.md') @@ -64,7 +64,7 @@ describe('web e2e: plugin manager', () => { const source = language === 'en' ? '中文' : 'English' const target = language === 'en' ? 'English' : '中文' if (await page.getByRole('dialog', { name: settings }).count() === 0) { - await openSettingsFromAccountMenu(page, language === 'en' ? 'zh' : 'en') + await openSettings(page, language === 'en' ? 'zh' : 'en') } await page.getByRole('dialog', { name: settings }).getByRole('button', { name: source }).click() await page.getByRole('menuitem', { name: target }).click() diff --git a/apps/web/tests/preview-boot.e2e.ts b/apps/web/tests/preview-boot.e2e.ts index b416eea019..3e92ed1e34 100644 --- a/apps/web/tests/preview-boot.e2e.ts +++ b/apps/web/tests/preview-boot.e2e.ts @@ -316,7 +316,6 @@ async function bootPreview(origin: string, browser: Browser): Promise { const continueButton = page.getByRole('button', { name: 'Continue' }) await continueButton.waitFor({ timeout: HERO_TIMEOUT_MS }) await continueButton.click() - await page.getByRole('button', { name: 'Add API Key', exact: true }).click() const configureLater = page.getByRole('button', { name: 'Configure later' }) await configureLater.waitFor({ timeout: 30_000 }) await configureLater.click() diff --git a/apps/web/tests/settings-chrome.e2e.ts b/apps/web/tests/settings-chrome.e2e.ts index c2374ff6c8..ea014fd3b2 100644 --- a/apps/web/tests/settings-chrome.e2e.ts +++ b/apps/web/tests/settings-chrome.e2e.ts @@ -19,7 +19,7 @@ import { acknowledgeReloadConnectionLoss, assertFixtureInventory, captureStableAria, compareOrRefreshGolden, launchWebScaffold, watchConsole, webSnapshotMode, type WebScaffold, } from './scaffold.ts' -import { openSettingsFromAccountMenu, ZH_BROWSER_LOCALE, saveFailureShot } from './support.ts' +import { openSettings, ZH_BROWSER_LOCALE, saveFailureShot } from './support.ts' const SNAPSHOT_DIR = fileURLToPath(new URL('./expected/settings-chrome', import.meta.url)) const DIALOG_EXPECTED = join(SNAPSHOT_DIR, 'dialog.expected.md') @@ -59,15 +59,13 @@ describe('web e2e: settings modal and General preferences', () => { it('opens the settings dialog, switches sections, and closes by every path', async () => { onTestFailed(() => saveFailureShot(page, 'web-e2e-settings-shell')) - const trigger = page.getByRole('button', { name: '账号菜单', exact: true }) - expect(await trigger.getAttribute('aria-haspopup')).toBe('menu') + const trigger = page.getByRole('button', { name: '设置', exact: true }) + expect(await trigger.getAttribute('aria-haspopup')).toBe('dialog') expect(await trigger.getAttribute('aria-expanded')).toBe('false') await trigger.click() - expect(await trigger.getAttribute('aria-expanded')).toBe('true') - await page.getByRole('menuitem', { name: '设置', exact: true }).click() const dialog = page.getByRole('dialog', { name: '设置' }) await dialog.waitFor({ timeout: 10_000 }) - expect(await trigger.getAttribute('aria-expanded')).toBe('false') + expect(await trigger.getAttribute('aria-expanded')).toBe('true') // General is active by default; Permission, Language and Appearance are functional. expect(await dialog.getByRole('button', { name: '通用设置' }).getAttribute('aria-current')).toBe('true') await dialog.getByRole('button', { name: '工作区内修改' }).waitFor({ timeout: 10_000 }) @@ -186,7 +184,7 @@ describe('web e2e: settings modal and General preferences', () => { await expect.poll(() => page.getByRole('dialog', { name: '设置' }).count(), { timeout: 5_000 }).toBe(0) expect(await trigger.getAttribute('aria-expanded')).toBe('false') // Close path 2: the header close button (focus lands there on open). - await openSettingsFromAccountMenu(page, 'zh') + await openSettings(page, 'zh') await page.getByRole('dialog', { name: '设置' }).getByRole('button', { name: '关闭' }).click() await expect.poll(() => page.getByRole('dialog', { name: '设置' }).count(), { timeout: 5_000 }).toBe(0) expect(tripwire.pageErrors).toEqual([]) @@ -198,7 +196,7 @@ describe('web e2e: settings modal and General preferences', () => { onTestFailed(() => saveFailureShot(overflowPage, 'web-e2e-settings-navigation')) const console = watchConsole(overflowPage) await overflowPage.goto(scaffold.authenticatedUrl, { waitUntil: 'load' }) - await openSettingsFromAccountMenu(overflowPage, 'zh') + await openSettings(overflowPage, 'zh') const dialog = overflowPage.getByRole('dialog', { name: '设置', exact: true }) const navigation = dialog.getByRole('navigation') const list = navigation.locator('[class*="_navList"]') @@ -242,7 +240,7 @@ describe('web e2e: settings modal and General preferences', () => { expect(existing.snapshotEvents().find(event => event.type === 'permission/preset')?.data) .toEqual({ preset: 'workspace-write' }) - await openSettingsFromAccountMenu(page, 'zh') + await openSettings(page, 'zh') const dialog = page.getByRole('dialog', { name: '设置' }) await dialog.waitFor({ timeout: 10_000 }) const selector = dialog.getByRole('button', { name: '工作区内修改' }) @@ -309,7 +307,7 @@ describe('web e2e: settings modal and General preferences', () => { it('uses the persisted dark preference while plugins are still loading', async () => { onTestFailed(() => saveFailureShot(page, 'web-e2e-settings-boot-theme')) await page.emulateMedia({ colorScheme: 'light' }) - await openSettingsFromAccountMenu(page, 'zh') + await openSettings(page, 'zh') const initialDialog = page.getByRole('dialog', { name: '设置' }) const darkCube = initialDialog.getByRole('button', { name: '深色' }) await selectTheme(darkCube, 'dark') @@ -355,7 +353,7 @@ describe('web e2e: settings modal and General preferences', () => { await page.waitForSelector('[class*="frame"]', { timeout: 30_000 }) acknowledgeReloadConnectionLoss(tripwire, warningStart) - await openSettingsFromAccountMenu(page, 'zh') + await openSettings(page, 'zh') const restoredDialog = page.getByRole('dialog', { name: '设置' }) const systemCube = restoredDialog.getByRole('button', { name: '跟随系统' }) // The boot palette precedes the settings mirror's saved preference. @@ -409,7 +407,7 @@ describe('web e2e: settings modal and General preferences', () => { expect(light.faviconPaths).toEqual(['/favicon.svg']) expectThemeColorSynchronized(light) - await openSettingsFromAccountMenu(page, 'zh') + await openSettings(page, 'zh') const dialog = page.getByRole('dialog', { name: '设置' }) await dialog.waitFor({ timeout: 10_000 }) const darkCube = dialog.getByRole('button', { name: '深色' }) @@ -463,7 +461,7 @@ describe('web e2e: settings modal and General preferences', () => { } // `system` follows the emulated OS scheme (dark stays dark, light clears). - await openSettingsFromAccountMenu(page, 'zh') + await openSettings(page, 'zh') const systemCube = page.getByRole('dialog', { name: '设置' }).getByRole('button', { name: '跟随系统' }) await selectTheme(systemCube, 'system') await expect.poll(() => systemCube.getAttribute('aria-pressed'), { timeout: 5_000 }).toBe('true') @@ -525,7 +523,7 @@ describe('web e2e: settings modal and General preferences', () => { } expect(await readFontSize()).toBe('14px') expect(await readSecondaryFontSize()).toBe('13px') - await openSettingsFromAccountMenu(page, 'zh') + await openSettings(page, 'zh') const dialog = page.getByRole('dialog', { name: '设置' }) await dialog.waitFor({ timeout: 10_000 }) // The stepper reveals its arrows on hover; the up arrow steps 14 → 15 → 16. @@ -550,7 +548,7 @@ describe('web e2e: settings modal and General preferences', () => { expect(await readSecondaryFontSize()).toBe('14px') // Restore the default for the specs that follow (and the dialog golden). - await openSettingsFromAccountMenu(page, 'zh') + await openSettings(page, 'zh') const restored = page.getByRole('dialog', { name: '设置' }) await restored.waitFor({ timeout: 10_000 }) await restored.getByText('16', { exact: true }).hover() @@ -565,7 +563,7 @@ describe('web e2e: settings modal and General preferences', () => { ['detailed', '详细'], ['expanded', '完全展开'], ] as const)('persists the %s work-details mode across reload', async (mode, label) => { onTestFailed(() => saveFailureShot(page, 'web-e2e-settings-transcript-view')) - await openSettingsFromAccountMenu(page, 'zh') + await openSettings(page, 'zh') const dialog = page.getByRole('dialog', { name: '设置' }) await dialog.waitFor({ timeout: 10_000 }) await dialog.getByText('工作过程展示', { exact: true }).waitFor({ timeout: 10_000 }) @@ -581,7 +579,7 @@ describe('web e2e: settings modal and General preferences', () => { await page.reload({ waitUntil: 'load' }) await page.waitForSelector('[class*="frame"]', { timeout: 30_000 }) acknowledgeReloadConnectionLoss(tripwire, warningStart) - await openSettingsFromAccountMenu(page, 'zh') + await openSettings(page, 'zh') const reloaded = page.getByRole('dialog', { name: '设置' }) const restoredDetails = reloaded.getByText('工作过程展示', { exact: true }).locator('../..') await restoredDetails.getByRole('button', { name: label, exact: true }).waitFor({ timeout: 10_000 }) @@ -597,7 +595,7 @@ describe('web e2e: settings modal and General preferences', () => { it('persists the busy-state Enter behavior across reload and a distinct port', async () => { onTestFailed(() => saveFailureShot(page, 'web-e2e-settings-enter-behavior')) - await openSettingsFromAccountMenu(page, 'zh') + await openSettings(page, 'zh') const dialog = page.getByRole('dialog', { name: '设置' }) await dialog.waitFor({ timeout: 10_000 }) await dialog.getByRole('button', { name: '排队发送' }).click() @@ -612,7 +610,7 @@ describe('web e2e: settings modal and General preferences', () => { await page.reload({ waitUntil: 'load' }) await page.waitForSelector('[class*="frame"]', { timeout: 30_000 }) acknowledgeReloadConnectionLoss(tripwire, warningStart) - await openSettingsFromAccountMenu(page, 'zh') + await openSettings(page, 'zh') const reloaded = page.getByRole('dialog', { name: '设置' }) await reloaded.getByRole('button', { name: '插话发送' }).waitFor({ timeout: 10_000 }) @@ -623,7 +621,7 @@ describe('web e2e: settings modal and General preferences', () => { expect(second.baseUrl).not.toBe(scaffold.baseUrl) await secondPage.goto(second.authenticatedUrl, { waitUntil: 'load' }) await secondPage.waitForSelector('[class*="frame"]', { timeout: 30_000 }) - await openSettingsFromAccountMenu(secondPage, 'zh') + await openSettings(secondPage, 'zh') await secondPage.getByRole('dialog', { name: '设置' }) .getByRole('button', { name: '插话发送' }).waitFor({ timeout: 10_000 }) expect(await secondPage.evaluate(() => localStorage.getItem('dsh.conversation.busyEnter'))).toBeNull() @@ -646,7 +644,7 @@ describe('web e2e: settings modal and General preferences', () => { it('persists the settings language across reload and a distinct port', async () => { onTestFailed(() => saveFailureShot(page, 'web-e2e-settings-language')) - await openSettingsFromAccountMenu(page, 'zh') + await openSettings(page, 'zh') const zhDialog = page.getByRole('dialog', { name: '设置' }) await zhDialog.waitFor({ timeout: 10_000 }) // The document language follows the active locale in the assembled app, not @@ -678,7 +676,7 @@ describe('web e2e: settings modal and General preferences', () => { await page.reload({ waitUntil: 'load' }) await page.waitForSelector('[class*="frame"]', { timeout: 30_000 }) acknowledgeReloadConnectionLoss(tripwire, warningStart) - const enTrigger = page.getByRole('button', { name: 'Account menu' }) + const enTrigger = page.getByRole('button', { name: 'Settings' }) await enTrigger.waitFor({ timeout: 10_000 }) // A Chinese browser on another port still receives the explicit English @@ -690,7 +688,7 @@ describe('web e2e: settings modal and General preferences', () => { expect(second.baseUrl).not.toBe(scaffold.baseUrl) await secondPage.goto(second.authenticatedUrl, { waitUntil: 'load' }) await secondPage.waitForSelector('[class*="frame"]', { timeout: 30_000 }) - await openSettingsFromAccountMenu(secondPage, 'en') + await openSettings(secondPage, 'en') await secondPage.getByRole('dialog', { name: 'Settings' }) .getByRole('button', { name: 'English' }).waitFor({ timeout: 10_000 }) expect(await secondPage.evaluate(() => localStorage.getItem('dsh.locale'))).toBeNull() @@ -701,7 +699,7 @@ describe('web e2e: settings modal and General preferences', () => { await second.close() } - await openSettingsFromAccountMenu(page, 'en') + await openSettings(page, 'en') await page.getByRole('dialog', { name: 'Settings' }).getByRole('button', { name: 'English' }).click() await page.getByRole('menuitem', { name: '中文' }).click() await page.getByRole('dialog', { name: '设置' }).waitFor({ timeout: 10_000 }) @@ -725,7 +723,7 @@ describe('web e2e: settings modal and General preferences', () => { await enPage.goto(fresh.authenticatedUrl, { waitUntil: 'load' }) await enPage.waitForSelector('[class*="frame"]', { timeout: 30_000 }) expect(await enPage.evaluate(() => localStorage.getItem('dsh.locale'))).toBeNull() - await openSettingsFromAccountMenu(enPage, 'en') + await openSettings(enPage, 'en') const dialog = enPage.getByRole('dialog', { name: 'Settings' }) await dialog.waitFor({ timeout: 10_000 }) await dialog.getByRole('button', { name: 'English' }).waitFor({ timeout: 10_000 }) @@ -764,7 +762,7 @@ describe('web e2e: settings modal and General preferences', () => { await frPage.goto(fresh.authenticatedUrl, { waitUntil: 'load' }) await frPage.waitForSelector('[class*="frame"]', { timeout: 30_000 }) expect(await frPage.evaluate(() => localStorage.getItem('dsh.locale'))).toBeNull() - await openSettingsFromAccountMenu(frPage, 'en') + await openSettings(frPage, 'en') const dialog = frPage.getByRole('dialog', { name: 'Settings' }) await dialog.waitFor({ timeout: 10_000 }) await dialog.getByRole('button', { name: 'English' }).waitFor({ timeout: 10_000 }) @@ -798,7 +796,7 @@ describe('web e2e: settings modal and General preferences', () => { onTestFinished(() => withoutBrowser.close()) const browserConsole = watchConsole(withoutBrowser) await withoutBrowser.goto(fresh.authenticatedUrl, { waitUntil: 'load' }) - await openSettingsFromAccountMenu(withoutBrowser, 'en') + await openSettings(withoutBrowser, 'en') const dialog = withoutBrowser.getByRole('dialog', { name: 'Settings' }) await dialog.getByRole('button', { name: 'Detailed', exact: true }).waitFor() expect(await dialog.getByText('Open chat links in', { exact: true }).count()).toBe(0) diff --git a/apps/web/tests/sidebar-terminal.e2e.ts b/apps/web/tests/sidebar-terminal.e2e.ts index 37f8041b0c..aac87b9f54 100644 --- a/apps/web/tests/sidebar-terminal.e2e.ts +++ b/apps/web/tests/sidebar-terminal.e2e.ts @@ -8,7 +8,7 @@ import type {} from '@deepseek-ai/dsh-api-terminal-controller' import type { SubprocessTerminalHandle } from '@deepseek-ai/dsh-subprocess' import { createProcessInspector, type ProcessIdentity } from '@deepseek-ai/dsh-subprocess-local/src/process-inspector.ts' import { compareOrRefreshGolden, launchWebScaffold, watchConsole, webSnapshotMode, type WebScaffold } from './scaffold.ts' -import { openSettingsFromAccountMenu, connectFreshWorkspace, saveFailureShot } from './support.ts' +import { openSettings, connectFreshWorkspace, saveFailureShot } from './support.ts' const expected = fileURLToPath(new URL('./expected/sidebar-terminal/running.expected.md', import.meta.url)) const shots = fileURLToPath(new URL('../../../.artifacts/screenshots/sidebar-terminal/', import.meta.url)) @@ -47,7 +47,7 @@ async function controlTransport(page: Page) { } async function selectTerminalTheme(page: Page, name: string): Promise { - await openSettingsFromAccountMenu(page, 'en') + await openSettings(page, 'en') const dialog = page.getByRole('dialog', { name: 'Settings' }) const [response] = await Promise.all([ page.waitForResponse(candidate => new URL(candidate.url()).pathname === '/api/settings/mutate' && candidate.request().method() === 'POST'), diff --git a/apps/web/tests/steering.e2e.ts b/apps/web/tests/steering.e2e.ts index 2ff082e473..0006353491 100644 --- a/apps/web/tests/steering.e2e.ts +++ b/apps/web/tests/steering.e2e.ts @@ -16,7 +16,7 @@ import { compareOrRefreshGolden, fixtureUserPrompts, launchWebScaffold, recordFixture, watchConsole, webSnapshotMode, type WebScaffold, } from './scaffold.ts' -import { openSettingsFromAccountMenu, connectFreshWorkspace, newEnglishPage, saveFailureShot } from './support.ts' +import { openSettings, connectFreshWorkspace, newEnglishPage, saveFailureShot } from './support.ts' const SNAPSHOT_DIR = fileURLToPath(new URL('../../../snapshots/web/steering', import.meta.url)) const FIXTURE = join(SNAPSHOT_DIR, 'session.v3.jsonl') @@ -309,7 +309,7 @@ describe('web e2e: composer shortcut follows the swapped busy behavior', () => { it.skipIf(MODE === 'record')('queues Cmd+Enter when plain Enter is configured to Steer', async () => { onTestFailed(() => saveFailureShot(page, 'web-e2e-composer-swapped-shortcut')) - await openSettingsFromAccountMenu(page, 'en') + await openSettings(page, 'en') const dialog = page.getByRole('dialog', { name: 'Settings' }) await dialog.getByRole('button', { name: 'Queue' }).click() await page.getByRole('menuitem', { name: 'Steer' }).click() diff --git a/apps/web/tests/support.ts b/apps/web/tests/support.ts index e71096fb86..9945da66a4 100644 --- a/apps/web/tests/support.ts +++ b/apps/web/tests/support.ts @@ -226,11 +226,16 @@ export function conversationContextKey(kind: string, id: string): string { return `${kind.length}:${kind}${id}` } -/** Open Settings through the sidebar account menu. +/** Open Settings through the Web gear or Desktop account menu. * @param page - browser page with the mounted sidebar. * @param locale - current UI language. */ -export async function openSettingsFromAccountMenu(page: Page, locale: 'en' | 'zh'): Promise { - await page.getByRole('button', { name: locale === 'zh' ? '账号菜单' : 'Account menu', exact: true }).click() - await page.getByRole('menuitem', { name: locale === 'zh' ? '设置' : 'Settings', exact: true }).click() +export async function openSettings(page: Page, locale: 'en' | 'zh'): Promise { + const label = locale === 'zh' ? '设置' : 'Settings' + if (await page.evaluate(() => 'dshDesktop' in globalThis)) { + await page.getByRole('button', { name: locale === 'zh' ? '账号菜单' : 'Account menu', exact: true }).click() + await page.getByRole('menuitem', { name: label, exact: true }).click() + } else { + await page.getByRole('button', { name: label, exact: true }).click() + } } diff --git a/apps/web/tests/turn-tail-actions.e2e.ts b/apps/web/tests/turn-tail-actions.e2e.ts index b88688fc26..7a7bfe9293 100644 --- a/apps/web/tests/turn-tail-actions.e2e.ts +++ b/apps/web/tests/turn-tail-actions.e2e.ts @@ -20,7 +20,7 @@ import { acknowledgeReloadConnectionLoss, assertFixtureInventory, captureStableAria, compareOrRefreshGolden, fixtureUserPrompts, launchWebScaffold, recordFixture, watchConsole, webSnapshotMode, type WebScaffold, } from './scaffold.ts' -import { openSettingsFromAccountMenu, connectFreshWorkspace, expandOwningTurnProcess, newEnglishPage, saveFailureShot, WEB_FIXTURE_TIME } from './support.ts' +import { openSettings, connectFreshWorkspace, expandOwningTurnProcess, newEnglishPage, saveFailureShot, WEB_FIXTURE_TIME } from './support.ts' const SNAPSHOT_DIR = fileURLToPath(new URL('../../../snapshots/web/turn-tail-actions', import.meta.url)) const FIXTURE = join(SNAPSHOT_DIR, 'session.v3.jsonl') @@ -256,7 +256,7 @@ describe('web e2e: assistant IconActions wait for the turn to end', () => { expect(await process.getAttribute('aria-expanded')).toBe('false') expect(await tool.isVisible()).toBe(false) - await openSettingsFromAccountMenu(page, 'en') + await openSettings(page, 'en') const dialog = page.getByRole('dialog', { name: 'Settings' }) await dialog.getByText('Work details', { exact: true }).locator('../..') .getByRole('button', { name: 'Compact', exact: true }).click() @@ -279,7 +279,7 @@ describe('web e2e: assistant IconActions wait for the turn to end', () => { expect(await tool.isVisible()).toBe(true) await process.click() - await openSettingsFromAccountMenu(page, 'en') + await openSettings(page, 'en') const restored = page.getByRole('dialog', { name: 'Settings' }) await restored.getByText('Work details', { exact: true }).locator('../..') .getByRole('button', { name: label, exact: true }).click() diff --git a/apps/web/tests/voice-download.e2e.ts b/apps/web/tests/voice-download.e2e.ts new file mode 100644 index 0000000000..32161bceb3 --- /dev/null +++ b/apps/web/tests/voice-download.e2e.ts @@ -0,0 +1,61 @@ +/** The real local provider publishes actionable download failures through the speech Remote to bundle details. */ +import { once } from 'node:events' +import { mkdtemp, rm, writeFile } from 'node:fs/promises' +import { createServer } from 'node:http' +import { tmpdir } from 'node:os' +import { join } from 'node:path' +import { fileURLToPath } from 'node:url' +import { chromium, type Browser } from 'playwright' +import { expect, it, onTestFinished } from 'vitest' +import { captureStableAria, compareOrRefreshGolden, launchWebScaffold, watchConsole, webSnapshotMode, type WebScaffold } from './scaffold.ts' +import { newEnglishPage } from './support.ts' + +const bundle = fileURLToPath(new URL('../../../packages/experimental/voice-input-bundle', import.meta.url)) +const expected = fileURLToPath(new URL('./expected/voice-download.expected.md', import.meta.url)) + +it('shows the failed asset, actual download source and recovery advice, then retries on request', async () => { + const resources: { scaffold?: WebScaffold; browser?: Browser } = {} + const root = await mkdtemp(join(tmpdir(), 'dsh-voice-download-')) + onTestFinished(async () => { await rm(root, { recursive: true, force: true }) }) + let status = 503 + const requests: string[] = [] + const server = createServer((request, response) => { + requests.push(request.url!) + response.writeHead(status); response.end() + }) + onTestFinished(async () => { + try { await resources.browser?.close() } finally { + try { await resources.scaffold?.close() } finally { + const closed = new Promise((resolve, reject) => { server.close((error) => { if (error) reject(error); else resolve() }) }) + server.closeAllConnections(); await closed + } + } + }) + server.listen(0, '127.0.0.1'); await once(server, 'listening') + const address = server.address() + if (!address || typeof address === 'string') throw new Error('Expected a loopback listener') + const origin = `http://127.0.0.1:${address.port}`, overlay = join(root, 'voice.patch.yml') + await writeFile(overlay, `- id: speech-to-text-sensevoice\n config:\n dataRoot: ${JSON.stringify(join(root, 'models'))}\n modelOrigin: ${origin}\n`) + const scaffold = await launchWebScaffold({ profile: { packages: [{ dir: bundle, enabled: true }] }, extraOverlayPath: overlay }) + resources.scaffold = scaffold + const browser = await chromium.launch() + resources.browser = browser + const page = await newEnglishPage(browser), tripwire = watchConsole(page) + await page.goto(scaffold.authenticatedUrl) + await page.getByRole('button', { name: 'Plugins', exact: true }).click() + await page.locator('[data-plugin-package="@deepseek-ai/dsh-experimental-voice-input-bundle"]').getByRole('button').click() + await page.getByRole('button', { name: 'Download and prepare', exact: true }).click() + const alert = page.getByRole('alert').filter({ hasText: 'Cannot download model.int8.onnx' }) + await alert.waitFor() + expect(await alert.textContent()).toContain('HTTP 503') + expect(await alert.textContent()).toContain(`Download source: ${origin}`) + expect(requests).toHaveLength(1) + expect(requests[0]).toContain('/resolve/2365baeacb507f821a0c8120fcee3d484dba7a07/model.int8.onnx') + await compareOrRefreshGolden(expected, + (await captureStableAria(page, '[role="alert"]', scaffold.workspaceCwd)).replaceAll(origin, 'https://model-mirror.example'), webSnapshotMode()) + status = 404 + await page.getByRole('button', { name: 'Retry preparation', exact: true }).click() + await expect.poll(() => alert.textContent()).toContain('HTTP 404') + expect(requests).toHaveLength(2) + expect(tripwire.pageErrors).toEqual([]) +}) diff --git a/apps/web/tests/workspace-management.e2e.ts b/apps/web/tests/workspace-management.e2e.ts index e47267eacf..6f1a7f99db 100644 --- a/apps/web/tests/workspace-management.e2e.ts +++ b/apps/web/tests/workspace-management.e2e.ts @@ -556,7 +556,7 @@ describe('web e2e: workspace management (create / rename / grouping / hover affo expect(await copied.isVisible()).toBe(true) expect(await page.evaluate(() => navigator.clipboard.readText())).toBe(rowTitle) // Leaving anchor and card together closes it after the grace. - await page.getByRole('button', { name: 'Account menu' }).hover() + await page.getByRole('button', { name: 'Settings' }).hover() await expect.poll(() => card.count(), { timeout: 5_000 }).toBe(0) expect(tripwire.pageErrors).toEqual([]) }, 60_000) @@ -586,7 +586,7 @@ describe('web e2e: workspace management (create / rename / grouping / hover affo await page.waitForTimeout(POINTER_HOLD_MS) expect(await page.getByRole('menuitem', { name: 'Rename' }).count()).toBe(1) // Pointer-leave dismissal still applies once the pointer genuinely leaves. - await page.getByRole('button', { name: 'Account menu' }).hover() + await page.getByRole('button', { name: 'Settings' }).hover() await expect.poll(() => page.getByRole('menuitem', { name: 'Rename' }).count(), { timeout: 5_000 }).toBe(0) expect(tripwire.pageErrors).toEqual([]) }, 60_000) diff --git a/apps/web/tsconfig.json b/apps/web/tsconfig.json index 5747556002..3c7faf36b5 100644 --- a/apps/web/tsconfig.json +++ b/apps/web/tsconfig.json @@ -29,6 +29,7 @@ "tests/scaffold.ts", "tests/voice-input.e2e.ts", "tests/voice-setup.e2e.ts", + "tests/voice-download.e2e.ts", "tests/prefix-proxy.ts", "tests/auto-review-fixture.ts", "tests/scaffold-generation.spec.ts", diff --git a/docs/subsystems/voice-input.i18n.yaml b/docs/subsystems/voice-input.i18n.yaml index b0886646aa..c1b12085c1 100644 --- a/docs/subsystems/voice-input.i18n.yaml +++ b/docs/subsystems/voice-input.i18n.yaml @@ -2,5 +2,5 @@ # side as of the last confirmed-consistent state. Both languages carry equal authority; # after editing either side, bring the other along and re-record with: # pnpm run verify-translation-pairing --write docs/subsystems/voice-input.md -voice-input.md: 32517d418512078cde5af221594d94171054abf4 -voice-input.zh.md: 162a28162d8a171ac214dd59a2096752172c8081 +voice-input.md: 1c128b268c8fbbcabc13f4ca52daaa62534a6366 +voice-input.zh.md: 5ce0626f4dc769cb12a842b7ad296eb915cb94ea diff --git a/docs/subsystems/voice-input.md b/docs/subsystems/voice-input.md index 32517d4185..1c128b268c 100644 --- a/docs/subsystems/voice-input.md +++ b/docs/subsystems/voice-input.md @@ -20,6 +20,8 @@ The input facade captures a revision-bearing selection before recording. `InputA The Host provider owns one preparation task across page and Session changes. The Client shares one `follow()` subscription across the composer, setup prompt and bundle details. Optional `SpeechSetupEstimate` metadata supplies provider-specific planning hints, separate from measured progress. `SpeechPreparationStepKind` identifies ordered resource operations; `SpeechPreparationStep` records each status and start time. The complete `SpeechPreparationState` retains these steps after cancellation or failure. The collapsed UI shows the current operation; expanding lists all steps, with byte progress or elapsed time only for the running step. Closing an observer never cancels preparation. Verified files survive retries and idle worker reclamation. +Failed preparation can include `SpeechDownloadFailure` with the asset, source origin, classified reason and optional diagnostic code or HTTP status. The Client localizes recovery advice; raw download causes remain on the Host. + The microphone occupies `conversation.input.activity`, between the model selector and Send. Clicking starts capture and expands the toolbar; Stop transcribes and inserts into the draft. The activity preserves the editor and submit action, owns local feedback, and releases expansion on unmount. Cancel, Escape or hiding the page discards capture. Waveform history displays measured microphone amplitude. Bundle details contain recognition preferences, preparation state and progress. Explicit enablement uses `plugins.bundle.activation` to guide users with missing models to setup; the list shows only the bundle description and switch. ## Design rationale diff --git a/docs/subsystems/voice-input.zh.md b/docs/subsystems/voice-input.zh.md index 162a28162d..5ce0626f4d 100644 --- a/docs/subsystems/voice-input.zh.md +++ b/docs/subsystems/voice-input.zh.md @@ -20,6 +20,8 @@ Host Provider 在页面和 Session 变化期间拥有同一个准备任务。Client 在输入框、安装引导弹窗、Bundle 详情之间共享一份 `follow()` 订阅。可选 `SpeechSetupEstimate` 元数据提供各 Provider 的资源预期,与实测进度分开。`SpeechPreparationStepKind` 标识有序资源操作;`SpeechPreparationStep` 记录各步骤状态与开始时间。完整 `SpeechPreparationState` 在取消或失败后保留这些步骤。折叠 UI 显示当前操作,展开后列出所有步骤,仅进行中步骤显示字节进度或等待时间。关闭观察者不会取消准备。已校验文件在重试及空闲进程回收后继续复用。 +准备失败时可包含 `SpeechDownloadFailure`,提供文件、下载源、原因分类以及可选错误码或 HTTP 状态。Client 将恢复建议本地化;原始下载错误留在 Host。 + 麦克风占用模型选择器与发送按钮之间的 `conversation.input.activity`。点击开始录音并展开工具栏;停止后转写并插入草稿。活动栏保留编辑器与提交按钮,拥有局部反馈,并在卸载时释放展开状态。取消、Escape 或隐藏页面会丢弃录音。波形历史展示实测麦克风音量。Bundle 详情包含识别偏好、准备状态和进度。显式启用时通过 `plugins.bundle.activation` 引导缺少模型的用户前往安装;列表只显示 Bundle 描述和开关。 ## 设计依据 diff --git a/package.json b/package.json index 46e0c73091..a7acc3ab12 100644 --- a/package.json +++ b/package.json @@ -1,6 +1,6 @@ { "name": "@deepseek-ai/dsh-root", - "version": "0.1.6-alpha.2", + "version": "0.1.7-alpha.1", "license": "MIT", "private": true, "type": "module", diff --git a/packages/acp/acp/package.json b/packages/acp/acp/package.json index f703576cbe..9edecb9090 100644 --- a/packages/acp/acp/package.json +++ b/packages/acp/acp/package.json @@ -1,7 +1,7 @@ { "name": "@deepseek-ai/dsh-acp", "description": "Automation-only Agent Client Protocol server for driving DeepSeek Harness agents over JSON-RPC stdio", - "version": "0.1.6-alpha.2", + "version": "0.1.7-alpha.1", "publishConfig": { "access": "public" }, diff --git a/packages/api/account-controller/package.json b/packages/api/account-controller/package.json index 3835f5d9be..122558236b 100644 --- a/packages/api/account-controller/package.json +++ b/packages/api/account-controller/package.json @@ -1,7 +1,7 @@ { "name": "@deepseek-ai/dsh-api-account-controller", "description": "Expose safe account operations over authenticated Remote", - "version": "0.1.6-alpha.2", + "version": "0.1.7-alpha.1", "publishConfig": { "access": "public" }, diff --git a/packages/api/gateway/package.json b/packages/api/gateway/package.json index c8f90d0cbf..9985966d8b 100644 --- a/packages/api/gateway/package.json +++ b/packages/api/gateway/package.json @@ -1,7 +1,7 @@ { "name": "@deepseek-ai/dsh-api-gateway", "description": "Typert Remote Host dispatcher and Client API endpoint", - "version": "0.1.6-alpha.2", + "version": "0.1.7-alpha.1", "publishConfig": { "access": "public" }, diff --git a/packages/api/job-controller/package.json b/packages/api/job-controller/package.json index 30fcb07689..dde1d2000b 100644 --- a/packages/api/job-controller/package.json +++ b/packages/api/job-controller/package.json @@ -1,7 +1,7 @@ { "name": "@deepseek-ai/dsh-api-job-controller", "description": "Job Remote observation stream and the reference-counted client job-output service", - "version": "0.1.6-alpha.2", + "version": "0.1.7-alpha.1", "publishConfig": { "access": "public" }, diff --git a/packages/api/remotes/package.json b/packages/api/remotes/package.json index ceab60d671..53ad17d4f2 100644 --- a/packages/api/remotes/package.json +++ b/packages/api/remotes/package.json @@ -1,7 +1,7 @@ { "name": "@deepseek-ai/dsh-api-remotes", "description": "Remote BFF assembly for application-selected Host capabilities", - "version": "0.1.6-alpha.2", + "version": "0.1.7-alpha.1", "publishConfig": { "access": "public" }, diff --git a/packages/api/session-controller/package.json b/packages/api/session-controller/package.json index 18cce123b6..f1525e8bf3 100644 --- a/packages/api/session-controller/package.json +++ b/packages/api/session-controller/package.json @@ -1,7 +1,7 @@ { "name": "@deepseek-ai/dsh-api-session-controller", "description": "Session Remote commands, cold reads, and live control transport", - "version": "0.1.6-alpha.2", + "version": "0.1.7-alpha.1", "publishConfig": { "access": "public" }, diff --git a/packages/api/settings-controller/package.json b/packages/api/settings-controller/package.json index 819bcb12a0..e15ce96424 100644 --- a/packages/api/settings-controller/package.json +++ b/packages/api/settings-controller/package.json @@ -1,7 +1,7 @@ { "name": "@deepseek-ai/dsh-api-settings-controller", "description": "Remote owner for the configuration surfaces over the settings-domain seams", - "version": "0.1.6-alpha.2", + "version": "0.1.7-alpha.1", "publishConfig": { "access": "public" }, diff --git a/packages/api/terminal-controller/package.json b/packages/api/terminal-controller/package.json index 8862def77e..279c79b96c 100644 --- a/packages/api/terminal-controller/package.json +++ b/packages/api/terminal-controller/package.json @@ -1,7 +1,7 @@ { "name": "@deepseek-ai/dsh-api-terminal-controller", "description": "Session-owned interactive terminals with shell discovery, screen recovery and typed Remote control", - "version": "0.1.6-alpha.2", + "version": "0.1.7-alpha.1", "publishConfig": { "access": "public" }, diff --git a/packages/api/workspace-controller/package.json b/packages/api/workspace-controller/package.json index 8085412c62..cccde98f40 100644 --- a/packages/api/workspace-controller/package.json +++ b/packages/api/workspace-controller/package.json @@ -1,7 +1,7 @@ { "name": "@deepseek-ai/dsh-api-workspace-controller", "description": "Workspace Remote commands and reconnect-safe state transport", - "version": "0.1.6-alpha.2", + "version": "0.1.7-alpha.1", "publishConfig": { "access": "public" }, diff --git a/packages/api/workspace-files/package.json b/packages/api/workspace-files/package.json index 480f133ed8..b7554a8224 100644 --- a/packages/api/workspace-files/package.json +++ b/packages/api/workspace-files/package.json @@ -1,7 +1,7 @@ { "name": "@deepseek-ai/dsh-api-workspace-files", "description": "Workspace file service and Client resource provider: bounded reads, directory listing, and live metadata over the workspaceFiles Remote namespace", - "version": "0.1.6-alpha.2", + "version": "0.1.7-alpha.1", "publishConfig": { "access": "public" }, diff --git a/packages/attachment/attachment-local/package.json b/packages/attachment/attachment-local/package.json index 4ed94f2ea2..005cd77c4c 100644 --- a/packages/attachment/attachment-local/package.json +++ b/packages/attachment/attachment-local/package.json @@ -1,7 +1,7 @@ { "name": "@deepseek-ai/dsh-attachment-local", "description": "Private content-addressed DSH_HOME attachment storage", - "version": "0.1.6-alpha.2", + "version": "0.1.7-alpha.1", "publishConfig": { "access": "public" }, diff --git a/packages/attachment/attachment/package.json b/packages/attachment/attachment/package.json index 5ae32b4c25..9c69bed474 100644 --- a/packages/attachment/attachment/package.json +++ b/packages/attachment/attachment/package.json @@ -1,7 +1,7 @@ { "name": "@deepseek-ai/dsh-attachment", "description": "Durable immutable attachment storage seam for the DeepSeek Harness", - "version": "0.1.6-alpha.2", + "version": "0.1.7-alpha.1", "publishConfig": { "access": "public" }, diff --git a/packages/boot/app-boot/package.json b/packages/boot/app-boot/package.json index 366ef4e968..bf09307b3d 100644 --- a/packages/boot/app-boot/package.json +++ b/packages/boot/app-boot/package.json @@ -1,7 +1,7 @@ { "name": "@deepseek-ai/dsh-app-boot", "description": "Shared boot glue for the app bins: .env loading, fail-loud Loader guards, snapshot-aware config resolution, and the Loader boot sequence", - "version": "0.1.6-alpha.2", + "version": "0.1.7-alpha.1", "publishConfig": { "access": "public" }, diff --git a/packages/boot/cmdline/package.json b/packages/boot/cmdline/package.json index 30f5e459ab..88c76e667b 100644 --- a/packages/boot/cmdline/package.json +++ b/packages/boot/cmdline/package.json @@ -1,7 +1,7 @@ { "name": "@deepseek-ai/dsh-cmdline", "description": "Immutable command-line handoff from a dsh launcher to any app plugin that injects cmdlineArgs", - "version": "0.1.6-alpha.2", + "version": "0.1.7-alpha.1", "publishConfig": { "access": "public" }, diff --git a/packages/boot/config-editor/package.json b/packages/boot/config-editor/package.json index 85ba5938f1..aba05d7311 100644 --- a/packages/boot/config-editor/package.json +++ b/packages/boot/config-editor/package.json @@ -1,7 +1,7 @@ { "name": "@deepseek-ai/dsh-config-editor", "description": "Persist plugin configuration through profile patches and Loader reconciliation", - "version": "0.1.6-alpha.2", + "version": "0.1.7-alpha.1", "publishConfig": { "access": "public" }, diff --git a/packages/boot/hmr/package.json b/packages/boot/hmr/package.json index fabd3700f1..14757f45c7 100644 --- a/packages/boot/hmr/package.json +++ b/packages/boot/hmr/package.json @@ -1,7 +1,7 @@ { "name": "@deepseek-ai/dsh-hmr", "description": "Coordinated module and profile configuration hot reload", - "version": "0.1.6-alpha.2", + "version": "0.1.7-alpha.1", "publishConfig": { "access": "public" }, diff --git a/packages/boot/plugin-manager/package.json b/packages/boot/plugin-manager/package.json index ccbb9439ef..292b74a61f 100644 --- a/packages/boot/plugin-manager/package.json +++ b/packages/boot/plugin-manager/package.json @@ -1,7 +1,7 @@ { "name": "@deepseek-ai/dsh-plugin-manager", "description": "Current-profile plugin and bundle management shared by dsh CLI, Web and agent tools", - "version": "0.1.6-alpha.2", + "version": "0.1.7-alpha.1", "publishConfig": { "access": "public" }, diff --git a/packages/browser-use/browser-use/package.json b/packages/browser-use/browser-use/package.json index d017536b4e..6ce71c831b 100644 --- a/packages/browser-use/browser-use/package.json +++ b/packages/browser-use/browser-use/package.json @@ -1,7 +1,7 @@ { "name": "@deepseek-ai/dsh-browser-use", "description": "Exclusive named browser-use provider registration", - "version": "0.1.6-alpha.2", + "version": "0.1.7-alpha.1", "publishConfig": { "access": "public" }, diff --git a/packages/bundle/acp-app/package.json b/packages/bundle/acp-app/package.json index 3d73f1324c..238e70fb36 100644 --- a/packages/bundle/acp-app/package.json +++ b/packages/bundle/acp-app/package.json @@ -1,7 +1,7 @@ { "name": "@deepseek-ai/dsh-acp-app", "description": "The dsh ACP profile bundle: automation-only JSON-RPC stdio and process lifecycle over dsh-base", - "version": "0.1.6-alpha.2", + "version": "0.1.7-alpha.1", "publishConfig": { "access": "public" }, diff --git a/packages/bundle/base/package.json b/packages/bundle/base/package.json index 7a497fdfe2..7364ea5268 100644 --- a/packages/bundle/base/package.json +++ b/packages/bundle/base/package.json @@ -1,7 +1,7 @@ { "name": "@deepseek-ai/dsh-base", "description": "The shared dsh core as a profile bundle: the first patch layer of base-backed profiles, inserting core rows over the empty profile root", - "version": "0.1.6-alpha.2", + "version": "0.1.7-alpha.1", "publishConfig": { "access": "public" }, diff --git a/packages/bundle/headless/package.json b/packages/bundle/headless/package.json index 428929dea0..aaa64d7ee9 100644 --- a/packages/bundle/headless/package.json +++ b/packages/bundle/headless/package.json @@ -1,7 +1,7 @@ { "name": "@deepseek-ai/dsh-headless", "description": "The dsh one-shot bundle: a direct core Agent/Session runner over dsh-base with no Host, HTTP, or browser layer", - "version": "0.1.6-alpha.2", + "version": "0.1.7-alpha.1", "publishConfig": { "access": "public" }, diff --git a/packages/bundle/sdk-app/package.json b/packages/bundle/sdk-app/package.json index bdc3bd2c84..b22f4a974b 100644 --- a/packages/bundle/sdk-app/package.json +++ b/packages/bundle/sdk-app/package.json @@ -1,7 +1,7 @@ { "name": "@deepseek-ai/dsh-sdk-app", "description": "The dsh SDK profile bundle: stdio JSON-RPC serving and process lifecycle over dsh-base", - "version": "0.1.6-alpha.2", + "version": "0.1.7-alpha.1", "publishConfig": { "access": "public" }, diff --git a/packages/bundle/sdk-minimal/package.json b/packages/bundle/sdk-minimal/package.json index 626f45a58d..00443c256c 100644 --- a/packages/bundle/sdk-minimal/package.json +++ b/packages/bundle/sdk-minimal/package.json @@ -1,7 +1,7 @@ { "name": "@deepseek-ai/dsh-sdk-minimal", "description": "The standalone minimal SDK profile bundle: JSON-RPC, one DeepSeek adapter, persistent shell, and JSONL sessions", - "version": "0.1.6-alpha.2", + "version": "0.1.7-alpha.1", "publishConfig": { "access": "public" }, diff --git a/packages/bundle/web-app/package.json b/packages/bundle/web-app/package.json index ed64aaaaa5..6d3db15d18 100644 --- a/packages/bundle/web-app/package.json +++ b/packages/bundle/web-app/package.json @@ -1,7 +1,7 @@ { "name": "@deepseek-ai/dsh-web-app", "description": "The dsh browser-surface bundle: the web patch layer over dsh-base plus the runtime glue plugin (frontend dist serving, web-surface prompt, bash runtime variables, URL line)", - "version": "0.1.6-alpha.2", + "version": "0.1.7-alpha.1", "publishConfig": { "access": "public" }, diff --git a/packages/client/connection/package.json b/packages/client/connection/package.json index 8b95205a05..5ce575e9f3 100644 --- a/packages/client/connection/package.json +++ b/packages/client/connection/package.json @@ -1,7 +1,7 @@ { "name": "@deepseek-ai/dsh-client-connection", "description": "Authenticated RPC transport and generation lifecycle", - "version": "0.1.6-alpha.2", + "version": "0.1.7-alpha.1", "publishConfig": { "access": "public" }, diff --git a/packages/client/file-upload/package.json b/packages/client/file-upload/package.json index c49d120753..756c1fd785 100644 --- a/packages/client/file-upload/package.json +++ b/packages/client/file-upload/package.json @@ -1,7 +1,7 @@ { "name": "@deepseek-ai/dsh-client-file-upload", "description": "Agent-scoped browser file upload, streaming intake, and staged receipt service", - "version": "0.1.6-alpha.2", + "version": "0.1.7-alpha.1", "publishConfig": { "access": "public" }, diff --git a/packages/client/hmr/package.json b/packages/client/hmr/package.json index bdb36e09e0..99db6b8511 100644 --- a/packages/client/hmr/package.json +++ b/packages/client/hmr/package.json @@ -1,7 +1,7 @@ { "name": "@deepseek-ai/dsh-client-hmr", "description": "Web client graph synchronization and rebuilt-bundle reload transport", - "version": "0.1.6-alpha.2", + "version": "0.1.7-alpha.1", "publishConfig": { "access": "public" }, diff --git a/packages/client/locale/package.json b/packages/client/locale/package.json index 7a40d48b79..00332a7c88 100644 --- a/packages/client/locale/package.json +++ b/packages/client/locale/package.json @@ -1,7 +1,7 @@ { "name": "@deepseek-ai/dsh-client-locale", "description": "Locale plugin: Host-backed preference, extensible language catalog, browser fallback, and typed built-in dictionaries", - "version": "0.1.6-alpha.2", + "version": "0.1.7-alpha.1", "publishConfig": { "access": "public" }, diff --git a/packages/client/modules/package.json b/packages/client/modules/package.json index 65df885767..7a727b9a81 100644 --- a/packages/client/modules/package.json +++ b/packages/client/modules/package.json @@ -1,7 +1,7 @@ { "name": "@deepseek-ai/dsh-client-modules", "description": "Client module system, dual-face: node half composes the __DSH_BOOT__ entry graph (incremental dsh.client scan, bundle route, index tap, webPlugins service); browser half is the lazy-CJS module table the vendored cordis Loader consumes as its internal seam", - "version": "0.1.6-alpha.2", + "version": "0.1.7-alpha.1", "publishConfig": { "access": "public" }, diff --git a/packages/client/resources/package.json b/packages/client/resources/package.json index 59720c9836..bb919f4fb5 100644 --- a/packages/client/resources/package.json +++ b/packages/client/resources/package.json @@ -1,7 +1,7 @@ { "name": "@deepseek-ai/dsh-client-resources", "description": "Unified client resource model: protocol-registered providers turn URL addresses into live values, consumed through the useResource global standard hook", - "version": "0.1.6-alpha.2", + "version": "0.1.7-alpha.1", "publishConfig": { "access": "public" }, diff --git a/packages/client/store/package.json b/packages/client/store/package.json index b83c090001..89ff9d212b 100644 --- a/packages/client/store/package.json +++ b/packages/client/store/package.json @@ -1,7 +1,7 @@ { "name": "@deepseek-ai/dsh-client-store", "description": "React-free observable and snapshot-store contracts with the shared Zustand/Immer engine", - "version": "0.1.6-alpha.2", + "version": "0.1.7-alpha.1", "publishConfig": { "access": "public" }, diff --git a/packages/client/ui-agent-preset/package.json b/packages/client/ui-agent-preset/package.json index 7a7932feee..fd83da3206 100644 --- a/packages/client/ui-agent-preset/package.json +++ b/packages/client/ui-agent-preset/package.json @@ -1,7 +1,7 @@ { "name": "@deepseek-ai/dsh-client-ui-agent-preset", "description": "Agent-preset surfaces: the default for later sessions, this session's seat, and the composition editor", - "version": "0.1.6-alpha.2", + "version": "0.1.7-alpha.1", "publishConfig": { "access": "public" }, diff --git a/packages/client/ui-approval/package.json b/packages/client/ui-approval/package.json index 47652605ca..acb0a0c9ed 100644 --- a/packages/client/ui-approval/package.json +++ b/packages/client/ui-approval/package.json @@ -1,7 +1,7 @@ { "name": "@deepseek-ai/dsh-client-ui-approval", "description": "Approval composer takeover over the scoped Remote Event waterfall", - "version": "0.1.6-alpha.2", + "version": "0.1.7-alpha.1", "publishConfig": { "access": "public" }, diff --git a/packages/client/ui-attachment/package.json b/packages/client/ui-attachment/package.json index b2d93fd8aa..d767cdc8b2 100644 --- a/packages/client/ui-attachment/package.json +++ b/packages/client/ui-attachment/package.json @@ -1,7 +1,7 @@ { "name": "@deepseek-ai/dsh-client-ui-attachment", "description": "Dynamic attachment presentation plugin for conversation input, message-image, and trajectory image slots", - "version": "0.1.6-alpha.2", + "version": "0.1.7-alpha.1", "publishConfig": { "access": "public" }, diff --git a/packages/client/ui-brand-official/package.json b/packages/client/ui-brand-official/package.json index 3fd7446384..e99d48b16e 100644 --- a/packages/client/ui-brand-official/package.json +++ b/packages/client/ui-brand-official/package.json @@ -1,7 +1,7 @@ { "name": "@deepseek-ai/dsh-client-ui-brand-official", "description": "Official DeepSeek Harness brand occupants for the Web client's sidebar slots", - "version": "0.1.6-alpha.2", + "version": "0.1.7-alpha.1", "publishConfig": { "access": "public" }, diff --git a/packages/client/ui-chat/package.json b/packages/client/ui-chat/package.json index 8ce7022573..a81325b054 100644 --- a/packages/client/ui-chat/package.json +++ b/packages/client/ui-chat/package.json @@ -1,7 +1,7 @@ { "name": "@deepseek-ai/dsh-client-ui-chat", "description": "Chat Conversation target, node definitions, renderers, and details surface", - "version": "0.1.6-alpha.2", + "version": "0.1.7-alpha.1", "publishConfig": { "access": "public" }, diff --git a/packages/client/ui-commands/package.json b/packages/client/ui-commands/package.json index d2c9cfb939..3b0b2cc6fb 100644 --- a/packages/client/ui-commands/package.json +++ b/packages/client/ui-commands/package.json @@ -1,7 +1,7 @@ { "name": "@deepseek-ai/dsh-client-ui-commands", "description": "Client command surface: global directory cache, '/' source, three command UI kinds, popupSelect registry", - "version": "0.1.6-alpha.2", + "version": "0.1.7-alpha.1", "publishConfig": { "access": "public" }, diff --git a/packages/client/ui-conversation/package.json b/packages/client/ui-conversation/package.json index e195ce4858..37093c371d 100644 --- a/packages/client/ui-conversation/package.json +++ b/packages/client/ui-conversation/package.json @@ -1,7 +1,7 @@ { "name": "@deepseek-ai/dsh-client-ui-conversation", "description": "Target-neutral Conversation assembly, shell, composer, queue, and view navigation", - "version": "0.1.6-alpha.2", + "version": "0.1.7-alpha.1", "publishConfig": { "access": "public" }, diff --git a/packages/client/ui-deliverables/package.json b/packages/client/ui-deliverables/package.json index aec5567878..ed6f4f7f8c 100644 --- a/packages/client/ui-deliverables/package.json +++ b/packages/client/ui-deliverables/package.json @@ -1,7 +1,7 @@ { "name": "@deepseek-ai/dsh-client-ui-deliverables", "description": "Changed-files card with per-file comparison tabs, delivery cards, and clickable final-response file references for Web", - "version": "0.1.6-alpha.2", + "version": "0.1.7-alpha.1", "publishConfig": { "access": "public" }, diff --git a/packages/client/ui-directory-picker-browse/package.json b/packages/client/ui-directory-picker-browse/package.json index 1b4f6cddf7..4c36927836 100644 --- a/packages/client/ui-directory-picker-browse/package.json +++ b/packages/client/ui-directory-picker-browse/package.json @@ -1,7 +1,7 @@ { "name": "@deepseek-ai/dsh-client-ui-directory-picker-browse", "description": "In-app directory browsing surface: the workspace directory-flow owner rendering the host's listing and creation primitives", - "version": "0.1.6-alpha.2", + "version": "0.1.7-alpha.1", "publishConfig": { "access": "public" }, diff --git a/packages/client/ui-directory-picker-native/package.json b/packages/client/ui-directory-picker-native/package.json index cf07905a2c..a98526585b 100644 --- a/packages/client/ui-directory-picker-native/package.json +++ b/packages/client/ui-directory-picker-native/package.json @@ -1,7 +1,7 @@ { "name": "@deepseek-ai/dsh-client-ui-directory-picker-native", "description": "Native directory-picker surface: the renderless workspace directory-flow occupant driving the local Desktop or Host OS chooser", - "version": "0.1.6-alpha.2", + "version": "0.1.7-alpha.1", "publishConfig": { "access": "public" }, diff --git a/packages/client/ui-dockkit/package.json b/packages/client/ui-dockkit/package.json index bf7e254f8b..435cde2785 100644 --- a/packages/client/ui-dockkit/package.json +++ b/packages/client/ui-dockkit/package.json @@ -1,7 +1,7 @@ { "name": "@deepseek-ai/dsh-client-ui-dockkit", "description": "Docking layout kit: split-tree engine with invertible operations, and the React components that render and drive it (zero cordis)", - "version": "0.1.6-alpha.2", + "version": "0.1.7-alpha.1", "publishConfig": { "access": "public" }, diff --git a/packages/client/ui-goal/package.json b/packages/client/ui-goal/package.json index 40807cb930..ecd1e59c4a 100644 --- a/packages/client/ui-goal/package.json +++ b/packages/client/ui-goal/package.json @@ -1,7 +1,7 @@ { "name": "@deepseek-ai/dsh-client-ui-goal", "description": "Session goal surface: GoalBar docked above the composer, read from the goal session projection", - "version": "0.1.6-alpha.2", + "version": "0.1.7-alpha.1", "publishConfig": { "access": "public" }, diff --git a/packages/client/ui-input-trigger/package.json b/packages/client/ui-input-trigger/package.json index d2a3fac7ee..2e008aa00d 100644 --- a/packages/client/ui-input-trigger/package.json +++ b/packages/client/ui-input-trigger/package.json @@ -1,7 +1,7 @@ { "name": "@deepseek-ai/dsh-client-ui-input-trigger", "description": "Input trigger pipeline: '/' and '@' detection, candidate menu, pick routing to registered sources", - "version": "0.1.6-alpha.2", + "version": "0.1.7-alpha.1", "publishConfig": { "access": "public" }, diff --git a/packages/client/ui-jobs/package.json b/packages/client/ui-jobs/package.json index 2777b18ecd..533c729dcd 100644 --- a/packages/client/ui-jobs/package.json +++ b/packages/client/ui-jobs/package.json @@ -1,7 +1,7 @@ { "name": "@deepseek-ai/dsh-client-ui-jobs", "description": "Session-header background-job list with on-demand streaming record panels", - "version": "0.1.6-alpha.2", + "version": "0.1.7-alpha.1", "type": "module", "main": "lib/index.js", "types": "lib/types/index.d.ts", diff --git a/packages/client/ui-layout/package.json b/packages/client/ui-layout/package.json index cb915838a5..3ae2159164 100644 --- a/packages/client/ui-layout/package.json +++ b/packages/client/ui-layout/package.json @@ -1,7 +1,7 @@ { "name": "@deepseek-ai/dsh-client-ui-layout", "description": "Shell plugin: three-column AppFrame with drag handles, ctx.layout viewing-state service (navigation + panels)", - "version": "0.1.6-alpha.2", + "version": "0.1.7-alpha.1", "publishConfig": { "access": "public" }, diff --git a/packages/client/ui-message-feedback/package.json b/packages/client/ui-message-feedback/package.json index 612d65d86d..b27cce2458 100644 --- a/packages/client/ui-message-feedback/package.json +++ b/packages/client/ui-message-feedback/package.json @@ -1,7 +1,7 @@ { "name": "@deepseek-ai/dsh-client-ui-message-feedback", "description": "The Web feedback surface: per-message Like/Dislike in the assistant-message action strip and the feedback dialog behind both ratings and /feedback, backed by the messageFeedback and sessionFeedback Host Remotes", - "version": "0.1.6-alpha.2", + "version": "0.1.7-alpha.1", "publishConfig": { "access": "public" }, diff --git a/packages/client/ui-model-selection/package.json b/packages/client/ui-model-selection/package.json index 9a4ab3183b..eaaf7a5071 100644 --- a/packages/client/ui-model-selection/package.json +++ b/packages/client/ui-model-selection/package.json @@ -1,7 +1,7 @@ { "name": "@deepseek-ai/dsh-client-ui-model-selection", "description": "Model selection over the shared model catalog, Session projection, and session.selectModel", - "version": "0.1.6-alpha.2", + "version": "0.1.7-alpha.1", "publishConfig": { "access": "public" }, diff --git a/packages/client/ui-open-in-app/package.json b/packages/client/ui-open-in-app/package.json index fde52fc3e9..1d4d53f0de 100644 --- a/packages/client/ui-open-in-app/package.json +++ b/packages/client/ui-open-in-app/package.json @@ -1,7 +1,7 @@ { "name": "@deepseek-ai/dsh-client-ui-open-in-app", "description": "Web \"Open In...\" controls: the Session-header split button opening the workspace directory in an installed application, and the document preview's default-application controls for one file", - "version": "0.1.6-alpha.2", + "version": "0.1.7-alpha.1", "publishConfig": { "access": "public" }, diff --git a/packages/client/ui-permission-presets/package.json b/packages/client/ui-permission-presets/package.json index 69879368f4..3af5f76112 100644 --- a/packages/client/ui-permission-presets/package.json +++ b/packages/client/ui-permission-presets/package.json @@ -1,7 +1,7 @@ { "name": "@deepseek-ai/dsh-client-ui-permission-presets", "description": "Permission surfaces: a new-session default in General settings and a current-session /permission popup over the permissions projection", - "version": "0.1.6-alpha.2", + "version": "0.1.7-alpha.1", "publishConfig": { "access": "public" }, diff --git a/packages/client/ui-plan/package.json b/packages/client/ui-plan/package.json index a9122c3f23..5da11d8113 100644 --- a/packages/client/ui-plan/package.json +++ b/packages/client/ui-plan/package.json @@ -1,7 +1,7 @@ { "name": "@deepseek-ai/dsh-client-ui-plan", "description": "Plan mode controls, persistent transcript plan cards, and sidebar Markdown previews", - "version": "0.1.6-alpha.2", + "version": "0.1.7-alpha.1", "publishConfig": { "access": "public" }, diff --git a/packages/client/ui-plugin-manager/package.json b/packages/client/ui-plugin-manager/package.json index 56b5629298..bc375c0b9f 100644 --- a/packages/client/ui-plugin-manager/package.json +++ b/packages/client/ui-plugin-manager/package.json @@ -1,7 +1,7 @@ { "name": "@deepseek-ai/dsh-client-ui-plugin-manager", "description": "Plugin management for the dsh web client: the sidebar Plugins panel installs, enables, disables, retries, and composes installed plugin packages", - "version": "0.1.6-alpha.2", + "version": "0.1.7-alpha.1", "publishConfig": { "access": "public" }, diff --git a/packages/client/ui-primitives/package.json b/packages/client/ui-primitives/package.json index a80e556607..a3002de65d 100644 --- a/packages/client/ui-primitives/package.json +++ b/packages/client/ui-primitives/package.json @@ -1,7 +1,7 @@ { "name": "@deepseek-ai/dsh-client-ui-primitives", "description": "Pure React atoms for the dsh web UI: controls, icons, markdown, and JSON inspectors (zero cordis)", - "version": "0.1.6-alpha.2", + "version": "0.1.7-alpha.1", "publishConfig": { "access": "public" }, diff --git a/packages/client/ui-primitives/src/icons/index.tsx b/packages/client/ui-primitives/src/icons/index.tsx index 1c048370c1..fddac899db 100644 --- a/packages/client/ui-primitives/src/icons/index.tsx +++ b/packages/client/ui-primitives/src/icons/index.tsx @@ -1596,16 +1596,17 @@ export const IconSlidersTwoOutlineMedium = (props: IconProps) => ( const IconMicrophoneOutlineArtwork = ({ size = 16, className, strokeWidth }: WeightedIconProps) => ( ) -/** Regular one-pixel microphone artwork. */ +/** Microphone with uniform one-pixel strokes. */ export const IconMicrophoneOutlineRegular = (props: IconProps) => ( ) -/** Medium microphone artwork with a 1.3px stroke. */ +/** Microphone with uniform 1.3px strokes. */ export const IconMicrophoneOutlineMedium = (props: IconProps) => ( ) diff --git a/packages/client/ui-reference/package.json b/packages/client/ui-reference/package.json index f6e6c36be1..7031eb0758 100644 --- a/packages/client/ui-reference/package.json +++ b/packages/client/ui-reference/package.json @@ -1,7 +1,7 @@ { "name": "@deepseek-ai/dsh-client-ui-reference", "description": "Unified Web @file and @session reference source", - "version": "0.1.6-alpha.2", + "version": "0.1.7-alpha.1", "publishConfig": { "access": "public" }, diff --git a/packages/client/ui-renderer/package.json b/packages/client/ui-renderer/package.json index bc157add33..eb17289206 100644 --- a/packages/client/ui-renderer/package.json +++ b/packages/client/ui-renderer/package.json @@ -1,7 +1,7 @@ { "name": "@deepseek-ai/dsh-client-ui-renderer", "description": "Browser UI renderer: React slot bindings, ctx.uiRenderer, and the assembled application root", - "version": "0.1.6-alpha.2", + "version": "0.1.7-alpha.1", "publishConfig": { "access": "public" }, diff --git a/packages/client/ui-schedule/package.json b/packages/client/ui-schedule/package.json index 484cfd93b9..ad9266892e 100644 --- a/packages/client/ui-schedule/package.json +++ b/packages/client/ui-schedule/package.json @@ -1,7 +1,7 @@ { "name": "@deepseek-ai/dsh-client-ui-schedule", "description": "Read-only active Schedule catalog in the Web Session header", - "version": "0.1.6-alpha.2", + "version": "0.1.7-alpha.1", "type": "module", "main": "lib/index.js", "types": "lib/types/index.d.ts", diff --git a/packages/client/ui-session/package.json b/packages/client/ui-session/package.json index 3420171409..f6cd7e1ae3 100644 --- a/packages/client/ui-session/package.json +++ b/packages/client/ui-session/package.json @@ -1,7 +1,7 @@ { "name": "@deepseek-ai/dsh-client-ui-session", "description": "Session Controller adapter for React and session-scoped slots", - "version": "0.1.6-alpha.2", + "version": "0.1.7-alpha.1", "publishConfig": { "access": "public" }, diff --git a/packages/client/ui-settings-account/README.i18n.yaml b/packages/client/ui-settings-account/README.i18n.yaml index cb697284a7..e5508b767d 100644 --- a/packages/client/ui-settings-account/README.i18n.yaml +++ b/packages/client/ui-settings-account/README.i18n.yaml @@ -2,5 +2,5 @@ # side as of the last confirmed-consistent state. Both languages carry equal authority; # after editing either side, bring the other along and re-record with: # pnpm run verify-translation-pairing --write packages/client/ui-settings-account/README.md -README.md: fdbbc4c391e7b4d6f6111de936b23f2fa101f3e3 -README.zh.md: 64acaa4b975c5b37213990bb866b268c9a689d1e +README.md: f024f7ef6506c1c9317d80660aaa0c8221e6a51e +README.zh.md: 2868d46a11db60cfec57f1eee6b146316b989288 diff --git a/packages/client/ui-settings-account/README.md b/packages/client/ui-settings-account/README.md index fdbbc4c391..f024f7ef65 100644 --- a/packages/client/ui-settings-account/README.md +++ b/packages/client/ui-settings-account/README.md @@ -1,5 +1,5 @@ --- -description: "The Account settings section displays DeepSeek login state and offers browser sign-in and cancellation; the sidebar account menu provides Platform sign-out." +description: "Desktop Account settings display DeepSeek login state and offer browser authorization and cancellation; the sidebar account menu provides Platform sign-out." kind: "package-reference" --- @@ -9,7 +9,7 @@ English | [中文](README.zh.md) ## Summary -The Account settings section displays DeepSeek login state and offers browser sign-in and cancellation; the sidebar account menu provides Platform sign-out. +Desktop Account settings display DeepSeek login state and offer browser authorization and cancellation; the sidebar account menu provides Platform sign-out. ## Table of Contents @@ -20,19 +20,21 @@ The Account settings section displays DeepSeek login state and offers browser si ## Use this package +The client activates only inside Desktop, identified by its preload bridge. Plain Web clients keep the standard Settings launcher and API-key onboarding without account login, account settings, or an account-state subscription. + The sidebar and Account settings display the profile avatar as a circular image, with the account icon as fallback when the URL is absent or the image fails to load. The collapsed sidebar centers the avatar in a 36 × 36 px button. The section registers through settings.section and uses the account Remote namespace. The stream survives carrier reconnects through the shared Remote supervisor. The page renders feature-owned English and Chinese copy and keeps API keys separate from account state. Balances use Platform Web currency formatting: two decimal places and digit grouping, positive amounts truncated to cents, positive sub-cent amounts shown as <0.01, and negative amounts rounded with a minimum displayed magnitude of 0.01. Raw Host balance strings remain unchanged. -Desktop usage and top-up actions open an isolated native Platform view below a 48px return bar. Back destroys the view and preserves the Account settings page. Browser clients retain external links. Loading failures retain the return action and show a centered localized error with Retry. Retry reloads the same destination; renderer commands never receive the account token. +Desktop usage and top-up actions open an isolated native Platform view below a 48px return bar. Back destroys the view and preserves the Account settings page. Loading failures retain the return action and show a centered localized error with Retry. Retry reloads the same destination; renderer commands never receive the account token. -Contact us opens the Feishu questionnaire in the system browser on Desktop or a new browser tab on Web. It supplies the available Platform UID, build version, UI locale and physical screen resolution as prefill_* parameters, with hide_*=1 for every context field; tokens and contact details are excluded. Configure contactFormUrl on the ui-settings-account plugin to select another HTTPS form. contactSource defaults to empty until the questionnaire supports a Harness source option; OS and device fields remain unfilled, matching the Web implementation. +Contact us opens the Feishu questionnaire in the system browser. It supplies the available Platform UID, build version, UI locale and physical screen resolution as prefill_* parameters, with hide_*=1 for every context field; tokens and contact details are excluded. Configure contactFormUrl on the ui-settings-account plugin to select another HTTPS form. contactSource defaults to empty until the questionnaire supports a Harness source option; OS and device fields remain unfilled, matching the Web implementation. The sidebar account menu uses the shared Menu surface, backdrop blur, spacing, and row typography; feature styles only size its launcher. -The account card’s More account information link opens `https://platform.deepseek.com` in the system browser on Desktop or a new tab on Web. +The account card’s More account information link opens `https://platform.deepseek.com` in the system browser. ## Understand the implementation @@ -44,7 +46,7 @@ The Account section appears first in Settings only while signed in; it is hidden The [credentials subsystem](../../../docs/subsystems/credentials.md) owns storage APIs; the [architecture](../../../docs/architecture.md) explains application composition. -Account login uses a dismissible dialog before the model onboarding credential editor. The dialog uses a compact, right-aligned action row with the primary action last. The sidebar displays the profile name, falling back to the server-masked phone number or email when the name is absent; it stays blank while the profile is loading. Dialog copy and the sidebar account label are not text-selectable; the copy-link button remains available and restores its label two seconds after each successful copy. Clipboard failures show Copy failed on the link for two seconds without interrupting sign-in. Waiting shows a copyable authorization link and a loading indicator; timeout and failure require an explicit retry. Sign-in failures render in that dialog; the launcher's inline failure line reports only a failed sign-out. Closing a waiting dialog cancels its Host attempt. The sidebar can reopen the same API-key editor through the settings coordinator. Browser login preopens a tab on the click and navigates it only when that attempt receives its authorization URL; blocked popups retain the copy-link route. The original tab retains the authorization window handle and closes it on failure, timeout, or cancellation. Login feedback stays in the original tab; callbacks never navigate to a second Web UI. +Account login uses a dismissible dialog before the model onboarding credential editor. The dialog uses a compact, right-aligned action row with the primary action last. The sidebar displays the profile name, falling back to the server-masked phone number or email when the name is absent; it stays blank while the profile is loading. Dialog copy and the sidebar account label are not text-selectable; the copy-link button remains available and restores its label two seconds after each successful copy. Clipboard failures show Copy failed on the link for two seconds without interrupting sign-in. Waiting shows a copyable authorization link and a loading indicator; timeout and failure require an explicit retry. Sign-in failures render in that dialog; the launcher's inline failure line reports only a failed sign-out. Closing a waiting dialog cancels its Host attempt. The sidebar can reopen the same API-key editor through the settings coordinator. A terminal account-state stream failure appears in the sign-in dialog or Account settings. Plugin unload suppresses late failure reports. diff --git a/packages/client/ui-settings-account/README.zh.md b/packages/client/ui-settings-account/README.zh.md index 64acaa4b97..2868d46a11 100644 --- a/packages/client/ui-settings-account/README.zh.md +++ b/packages/client/ui-settings-account/README.zh.md @@ -1,5 +1,5 @@ --- -description: "设置中的账号页面显示 DeepSeek 登录状态,并提供浏览器登录和取消;侧边栏账号菜单提供 Platform 退出登录。" +description: "Desktop 设置中的账号页面显示 DeepSeek 登录状态,并提供浏览器授权和取消;侧边栏账号菜单提供 Platform 退出登录。" kind: "package-reference" --- @@ -9,7 +9,7 @@ kind: "package-reference" ## 概述 -设置中的账号页面显示 DeepSeek 登录状态,并提供浏览器登录和取消;侧边栏账号菜单提供 Platform 退出登录。 +Desktop 设置中的账号页面显示 DeepSeek 登录状态,并提供浏览器授权和取消;侧边栏账号菜单提供 Platform 退出登录。 ## 目录 @@ -20,19 +20,21 @@ kind: "package-reference" ## 使用此包 +客户端仅在具有 preload 桥接的 Desktop 内启用。普通 Web 客户端保留标准设置入口和 API Key 引导,不显示账号登录和账号设置,也不订阅账号状态。 + 侧边栏和账号设置以圆形图片显示账号头像;头像 URL 缺失或图片加载失败时使用账号图标兜底。折叠侧边栏将头像居中放置在 36 × 36 px 的按钮内。 该页面通过 settings.section 注册,并使用 account Remote 命名空间。共享 Remote 管理器负责连接恢复后的流重连。页面使用功能自有的中英文文案,将 API Key 与账号状态分开。 余额沿用 Platform Web 的金额格式:两位小数和千分位分组,正金额截断至分,小于一分的正金额显示为 <0.01,负金额按舍入规则处理且显示绝对值至少为 0.01。Host 返回的原始余额字符串保持不变。 -Desktop 的用量和充值操作在 48px 返回栏下方打开隔离的原生 Platform 视图。返回操作销毁视图并保留 Account 设置页。浏览器客户端继续使用外链。加载失败时保留返回操作,居中显示本地化错误提示和“重试”按钮。重试重新加载同一目标页面;渲染进程命令不接收账号 token。 +Desktop 的用量和充值操作在 48px 返回栏下方打开隔离的原生 Platform 视图。返回操作销毁视图并保留 Account 设置页。加载失败时保留返回操作,居中显示本地化错误提示和“重试”按钮。重试重新加载同一目标页面;渲染进程命令不接收账号 token。 -“联系我们”在 Desktop 的系统浏览器或 Web 的新标签页打开飞书问卷。链接通过 prefill_* 参数填写已有的 Platform UID、构建版本、界面语言和屏幕物理分辨率,并为所有上下文字段设置 hide_*=1;不传 token 或联系方式。可在 ui-settings-account 插件配置 contactFormUrl,切换到另一个 HTTPS 问卷。问卷支持 Harness 来源选项前,contactSource 默认为空;OS 和设备字段沿用 Web 实现,保持未填写。 +“联系我们”在系统浏览器中打开飞书问卷。链接通过 prefill_* 参数填写已有的 Platform UID、构建版本、界面语言和屏幕物理分辨率,并为所有上下文字段设置 hide_*=1;不传 token 或联系方式。可在 ui-settings-account 插件配置 contactFormUrl,切换到另一个 HTTPS 问卷。问卷支持 Harness 来源选项前,contactSource 默认为空;OS 和设备字段沿用 Web 实现,保持未填写。 侧边栏账号菜单使用公共 Menu 的表面、背景模糊、间距和菜单项排版;功能样式仅设置入口布局。 -账号卡片的“更多账号信息”链接在 Desktop 中通过系统浏览器打开 `https://platform.deepseek.com`,在 Web 中打开新标签页。 +账号卡片的“更多账号信息”链接通过系统浏览器打开 `https://platform.deepseek.com`。 ## 理解实现 @@ -44,7 +46,7 @@ Desktop 的用量和充值操作在 48px 返回栏下方打开隔离的原生 Pl [凭证子系统](../../../docs/subsystems/credentials.zh.md)定义存储接口;[架构](../../../docs/architecture.zh.md)说明应用组合。 -账号登录在模型引导的凭证编辑器之前显示可关闭的弹窗。弹窗底部采用紧凑的右对齐横排操作,主操作位于末尾。侧边栏优先显示昵称,缺少昵称时显示服务端返回的脱敏手机号或邮箱;资料加载期间保持留空。 弹窗文字和侧边栏账号状态文字不可选中,复制登录链接按钮始终可用,并在每次复制成功两秒后恢复原文案。剪贴板失败时,链接原位显示“复制失败”两秒,不中断登录。等待状态提供可复制的授权链接和加载图标;超时和失败均须用户手动重试。登录失败在该弹窗内呈现;侧边栏入口的内联失败提示仅用于退出登录失败。关闭等待弹窗会取消对应 Host 登录流程。侧边栏通过设置协调器重新打开同一个 API Key 编辑器。浏览器登录在点击时预先打开标签页,只有该次流程收到授权地址后才导航;弹窗被拦截时保留复制链接入口。原标签页保留授权窗口引用,并在失败、超时或取消时关闭它。登录反馈留在原标签页,回调不会导航到第二个 Web UI。 +账号登录在模型引导的凭证编辑器之前显示可关闭的弹窗。弹窗底部采用紧凑的右对齐横排操作,主操作位于末尾。侧边栏优先显示昵称,缺少昵称时显示服务端返回的脱敏手机号或邮箱;资料加载期间保持留空。 弹窗文字和侧边栏账号状态文字不可选中,复制登录链接按钮始终可用,并在每次复制成功两秒后恢复原文案。剪贴板失败时,链接原位显示“复制失败”两秒,不中断登录。等待状态提供可复制的授权链接和加载图标;超时和失败均须用户手动重试。登录失败在该弹窗内呈现;侧边栏入口的内联失败提示仅用于退出登录失败。关闭等待弹窗会取消对应 Host 登录流程。侧边栏通过设置协调器重新打开同一个 API Key 编辑器。 账户状态流的终止错误会显示在登录对话框或账户设置中。插件卸载后不再报告延迟到达的错误。 diff --git a/packages/client/ui-settings-account/package.json b/packages/client/ui-settings-account/package.json index fd26fbff69..c2701b6f22 100644 --- a/packages/client/ui-settings-account/package.json +++ b/packages/client/ui-settings-account/package.json @@ -1,7 +1,7 @@ { "name": "@deepseek-ai/dsh-client-ui-settings-account", "description": "Manage DeepSeek login and open Platform billing pages", - "version": "0.1.6-alpha.2", + "version": "0.1.7-alpha.1", "publishConfig": { "access": "public" }, diff --git a/packages/client/ui-settings-account/src/client/browser-login.ts b/packages/client/ui-settings-account/src/client/browser-login.ts deleted file mode 100644 index cb342f6ad3..0000000000 --- a/packages/client/ui-settings-account/src/client/browser-login.ts +++ /dev/null @@ -1,71 +0,0 @@ -/** Browser tab ownership for one UI-initiated authorization attempt. */ -import type { AccountView, SignInAttemptId } from '@deepseek-ai/dsh-deepseek-account/types' - -/** Keeps a preopened browser tab separate from Host authorization state. */ -export class BrowserLogin { - private popup: Window | null = null - private navigated = false - private attempt: SignInAttemptId | undefined - - /** - * Preopen a tab and bind it to the attempt returned by the Host. - * @param request - authenticated Host start request. - * @param latest - most recent streamed state, including frames received before the response. - * @returns after this UI is following the new attempt. - */ - async start(request: () => Promise, latest: () => AccountView | undefined): Promise { - this.begin() - try { - this.follow(await request()) - this.update(latest()) - } catch (error) { - this.dispose() - throw error - } - } - - /** Preopen a tab during the user's click; blocked popups need the copy-link route. */ - begin(): void { - this.dispose() - this.popup = window.open('about:blank', '_blank') - if (this.popup) this.popup.opener = null - } - - /** - * Bind the preopened tab to its Host attempt. - * @param view - initial RPC response identifying this UI's attempt. - */ - follow(view: AccountView): void { - this.attempt = view.attempt?.id - this.update(view) - } - - /** - * Navigate or close the pending tab when its attempt changes. - * @param view - latest Host state. - */ - update(view: AccountView | undefined): void { - const attempt = view?.attempt - if (attempt?.id !== this.attempt) return - if (attempt && ['failed', 'expired', 'cancelled'].includes(attempt.phase)) { - this.dispose() - return - } - if (attempt?.phase === 'succeeded') { - this.popup = null - this.attempt = undefined - return - } - if (!attempt?.authorizeUrl || this.navigated) return - this.navigated = true - if (this.popup && !this.popup.closed) this.popup.location.replace(attempt.authorizeUrl) - } - - /** Close the owned authorization tab and stop following its attempt. */ - dispose(): void { - this.popup?.close() - this.popup = null - this.attempt = undefined - this.navigated = false - } -} diff --git a/packages/client/ui-settings-account/src/client/index.ts b/packages/client/ui-settings-account/src/client/index.ts index 3226eab0e6..1d5df935b4 100644 --- a/packages/client/ui-settings-account/src/client/index.ts +++ b/packages/client/ui-settings-account/src/client/index.ts @@ -1,4 +1,4 @@ -/** Account settings slot registration and reconnecting Remote subscription. */ +/** Desktop account settings registration and reconnecting Remote subscription. */ import type { Context } from '@deepseek-ai/cordis' import type {} from '@deepseek-ai/dsh-client-locale/client' import type {} from '@deepseek-ai/dsh-client-ui-settings/client' @@ -8,7 +8,6 @@ import type { AccountView, AccountDetails } from '@deepseek-ai/dsh-deepseek-acco import type { PlatformBridge } from './PlatformOverlay.tsx' import { Config, CONTACT_CONFIG_GLOBAL } from '../contact-config.ts' import { contactUrl } from './contact-url.ts' -import { BrowserLogin } from './browser-login.ts' import { AccountOnboarding } from './AccountOnboarding.tsx' import { AccountMenu } from './AccountMenu.tsx' import { AccountSection, type AccountSnapshot, type AccountSectionInjected } from './AccountSection.tsx' @@ -23,15 +22,14 @@ declare module '@deepseek-ai/dsh-client-ui-slots' { } /** Services required by account settings. */ export const inject = ['slots', 'locale', 'remote', 'remote.account'] -/** @param ctx - browser plugin context. */ +/** Register account UI only in the Desktop renderer. @param ctx - client plugin context. */ export function apply(ctx: Context): void { + if (!('dshDesktop' in globalThis)) return ctx.effect(() => ctx.locale.register('settings.account', { en, zh }), 'account: dictionaries') const t = ctx.locale.bind('settings.account') const page = globalThis as Partial> const config = Config(page[CONTACT_CONFIG_GLOBAL] ?? {}) let snapshot: AccountSnapshot = { view: undefined, details: undefined, failed: false, loginVisible: false } - const browser = new BrowserLogin() - ctx.effect(() => () => { browser.dispose() }, 'account: pending browser window') const listeners = new Set<() => void>() const publish = (value: AccountSnapshot) => { snapshot = value; for (const listener of listeners) listener() } let revision = 0 @@ -74,7 +72,6 @@ export function apply(ctx: Context): void { revision++ refreshing = undefined publish({ ...snapshot, view: frame.value, details: undefined, failed: false }) - browser.update(frame.value) frame.accept() void refresh() } @@ -104,17 +101,11 @@ export function apply(ctx: Context): void { const transport = (globalThis as typeof globalThis & { __DSH_TRANSPORT__?: { streamBaseUrl?: string } }).__DSH_TRANSPORT__ - const desktop = 'dshDesktop' in globalThis - const request = async () => { - const result = await ctx.remote.account.startSignIn(ctx.locale.getSnapshot().active, - desktop && transport?.streamBaseUrl !== undefined ? new URL(transport.streamBaseUrl).origin : window.location.origin, - desktop ? 'desktop' : 'web') - if (!result.ok) throw new Error('account start failed') - return result.value - } try { - if (!desktop) await browser.start(request, () => snapshot.view) - else await request() + const result = await ctx.remote.account.startSignIn(ctx.locale.getSnapshot().active, + transport?.streamBaseUrl !== undefined ? new URL(transport.streamBaseUrl).origin : window.location.origin, + 'desktop') + if (!result.ok) throw new Error('account start failed') } catch (error) { publish({ ...snapshot, loginFailed: true }) throw error diff --git a/packages/client/ui-settings-account/tests/apply.client.spec.ts b/packages/client/ui-settings-account/tests/apply.client.spec.ts index e1bf83f08e..a0544845f2 100644 --- a/packages/client/ui-settings-account/tests/apply.client.spec.ts +++ b/packages/client/ui-settings-account/tests/apply.client.spec.ts @@ -1,5 +1,5 @@ // @vitest-environment jsdom -/** Account operations and request lifetimes in the shipped web composition. */ +/** Desktop account operations and ordinary-browser isolation in the shipped client composition. */ import { afterEach, expect, vi } from 'vitest' import { ok } from '@deepseek-ai/dsh-remote-mock' import { RemoteError } from '@deepseek-ai/dsh-typert-protocol' @@ -20,9 +20,23 @@ function operations(c: TestClient): AccountSectionInjected { } afterEach(() => { vi.unstubAllGlobals(); vi.restoreAllMocks() }) +it('keeps account UI and account RPC inactive in a plain browser, including after reload', async ({ start, mock }) => { + const c = await start() + for (const reload of [false, true]) { + if (reload) await c.reload(SELF) + await c.flush() + expect(c.ctx.slots.entries('settings.launcher')).toHaveLength(0) + expect(c.ctx.slots.entries('settings.models.sign-in')).toHaveLength(0) + expect(c.ctx.slots.entries('settings.section').some(entry => entry.options.id === 'account')).toBe(false) + expect(mock.log.calls().filter(call => call.endpoint.startsWith('account/'))).toEqual([]) + expect(mock.log.streams().filter(stream => stream.endpoint.startsWith('account/'))).toEqual([]) + } +}, 60_000) + it('shares account actions across seats, publishes dialog ownership, and opens contextual support', async ({ start }) => { vi.stubGlobal(CONTACT_CONFIG_GLOBAL, { contactFormUrl: 'https://example.test/form/', contactSource: 'harness' }) const open = vi.spyOn(window, 'open').mockReturnValue(null) + vi.stubGlobal('dshDesktop', {}) const c = await start() const actions = operations(c) expect(c.ctx.slots.entries('settings.models.sign-in')[0]!.inject!()).toBe(actions) @@ -55,6 +69,7 @@ it('shares account actions across seats, publishes dialog ownership, and opens c }, 60_000) it('coalesces refreshes, publishes independent failures, and rejects stale responses after sign-out or unload', async ({ start }) => { + vi.stubGlobal('dshDesktop', {}) const c = await start() const actions = operations(c) const pending = Promise.withResolvers>>() @@ -82,14 +97,14 @@ it('coalesces refreshes, publishes independent failures, and rejects stale respo expect(actions.hooks.account.getSnapshot().details?.profile).toEqual({ status: 'failed' }) }, 60_000) -for (const desktop of [false, true]) it(`uses the browser or Desktop login carrier (Desktop: ${desktop}) and exposes operation errors`, async ({ start, mock }) => { +it('uses the Desktop login carrier and exposes operation errors', async ({ start, mock }) => { vi.spyOn(window, 'open').mockReturnValue(null) - if (desktop) vi.stubGlobal('dshDesktop', {}) + vi.stubGlobal('dshDesktop', {}) const c = await start() const actions = operations(c) mock.remote.account.startSignIn.mockResolvedValue(ok(view)) await actions.start() - expect(mock.remote.account.startSignIn).toHaveBeenCalledWith('en', window.location.origin, desktop ? 'desktop' : 'web') + expect(mock.remote.account.startSignIn).toHaveBeenCalledWith('en', window.location.origin, 'desktop') const failure = { ok: false as const, error: new RemoteError('gateway/internal', 'offline', {}) } mock.remote.account.startSignIn.mockResolvedValueOnce(failure) await expect(actions.start()).rejects.toThrow('account start failed') @@ -104,8 +119,8 @@ for (const desktop of [false, true]) it(`uses the browser or Desktop login carri }, 60_000) it('uses the Desktop stream origin and exposes the native platform bridge', async ({ start, mock }) => { - const c = await start() vi.stubGlobal('dshDesktop', {}) + const c = await start() vi.stubGlobal('__DSH_TRANSPORT__', { streamBaseUrl: 'http://localhost:9876/stream' }) const platform = { open: vi.fn(), setBounds: vi.fn(), close: vi.fn() } vi.stubGlobal('dshPlatform', platform) @@ -119,6 +134,7 @@ it('uses the Desktop stream origin and exposes the native platform bridge', asyn it('publishes a terminal state-stream failure without mistaking it for plugin disposal', async ({ start }) => { + vi.stubGlobal('dshDesktop', {}) const c = await start() const actions = operations(c) await c.mock.streams.opened('account/watch', 1) @@ -127,6 +143,7 @@ it('publishes a terminal state-stream failure without mistaking it for plugin di }, 60_000) it('ignores a terminal stream error when plugin disposal already owns teardown', async ({ start }) => { + vi.stubGlobal('dshDesktop', {}) const c = await start() let disposal: Promise | undefined const original = c.ctx.remote.$stream.bind(c.ctx.remote) diff --git a/packages/client/ui-settings-account/tests/browser-login.client.spec.ts b/packages/client/ui-settings-account/tests/browser-login.client.spec.ts deleted file mode 100644 index 85fabc3f5d..0000000000 --- a/packages/client/ui-settings-account/tests/browser-login.client.spec.ts +++ /dev/null @@ -1,85 +0,0 @@ -// @vitest-environment jsdom -/** Browser handoff tracks the initiating attempt and cleans up unused tabs. */ -import { afterEach, expect, it, vi } from 'vitest' -import type { AccountView, SignInAttemptId } from '@deepseek-ai/dsh-deepseek-account/types' -import { BrowserLogin } from '../src/client/browser-login.ts' - -afterEach(() => { vi.restoreAllMocks() }) -function view(phase: NonNullable['phase'], authorizeUrl?: string): AccountView { - return { status: 'signed-out', links: { usageUrl: '', topUpUrl: '' }, - attempt: { id: 'attempt' as SignInAttemptId, phase, ...(authorizeUrl ? { authorizeUrl } : {}) } } -} -function setup() { - const close = vi.fn() - const replace = vi.fn() - const popup: { closed: boolean; opener: unknown; close: typeof close; location: { replace: typeof replace } } = { - closed: false, opener: window, close, location: { replace }, - } - vi.spyOn(window, 'open').mockReturnValue(new Proxy(window, { - get(target, property, receiver): unknown { - if (property === 'closed') return popup.closed - if (property === 'opener') return popup.opener - if (property === 'close') return popup.close - if (property === 'location') return popup.location - return Reflect.get(target, property, receiver) - }, - set(target, property, value: unknown, receiver) { - if (property === 'opener') { popup.opener = value; return true } - return Reflect.set(target, property, value, receiver) - }, - })) - const browser = new BrowserLogin() - browser.begin() - return { browser, popup, close, replace } -} -it('navigates once when waiting-browser arrives after the initial RPC response', () => { - const { browser, popup, replace, close } = setup() - expect(popup.opener).toBeNull() - browser.follow(view('initializing')) - expect(replace).not.toHaveBeenCalled() - browser.update(view('waiting-browser', 'https://platform.deepseek.com/dsh/authorize')) - browser.update(view('waiting-browser', 'https://platform.deepseek.com/dsh/authorize')) - expect(replace).toHaveBeenCalledExactlyOnceWith('https://platform.deepseek.com/dsh/authorize') - browser.dispose() - expect(close).toHaveBeenCalledOnce() -}) -it('closes the blank tab on request failure without later navigating it', () => { - const { browser, close, replace } = setup() - browser.dispose() - browser.update(view('waiting-browser', 'https://platform.deepseek.com/dsh/authorize')) - expect(close).toHaveBeenCalledOnce() - expect(replace).not.toHaveBeenCalled() -}) -it('retains the manual link route when popup opening is blocked', () => { - vi.spyOn(window, 'open').mockReturnValue(null) - const browser = new BrowserLogin() - browser.begin() - expect(() => { browser.follow(view('waiting-browser', 'https://platform.deepseek.com/dsh/authorize')) }).not.toThrow() -}) - -it('closes the pending tab when the authenticated start request rejects', async () => { - const { browser, close, replace } = setup() - close.mockClear() - await expect(browser.start(() => Promise.reject(new Error('disconnected')), () => undefined)).rejects.toThrow('disconnected') - expect(close).toHaveBeenCalledTimes(2) - expect(replace).not.toHaveBeenCalled() -}) -it('uses a waiting frame received before the initial response', async () => { - const { browser, replace } = setup() - await browser.start(async () => view('initializing'), () => view('waiting-browser', 'https://platform.deepseek.com/dsh/authorize')) - expect(replace).toHaveBeenCalledExactlyOnceWith('https://platform.deepseek.com/dsh/authorize') -}) - -it.each(['failed', 'expired', 'cancelled'] as const)('closes an already navigated tab on %s', (phase) => { - const { browser, close } = setup() - browser.follow(view('waiting-browser', 'https://platform.deepseek.com/dsh/authorize')) - browser.update(view(phase)) - expect(close).toHaveBeenCalledOnce() -}) -it('leaves success completion to the Platform page', () => { - const { browser, close } = setup() - browser.follow(view('waiting-browser', 'https://platform.deepseek.com/dsh/authorize')) - browser.update(view('succeeded')) - browser.dispose() - expect(close).not.toHaveBeenCalled() -}) diff --git a/packages/client/ui-settings-agent-loop/package.json b/packages/client/ui-settings-agent-loop/package.json index 7b5f9ad075..4f5fb92be4 100644 --- a/packages/client/ui-settings-agent-loop/package.json +++ b/packages/client/ui-settings-agent-loop/package.json @@ -1,7 +1,7 @@ { "name": "@deepseek-ai/dsh-client-ui-settings-agent-loop", "description": "Settings page of the agent loop on the dsh web client's Plugins page: the parallel tool-call cap of the agent-loop namespace", - "version": "0.1.6-alpha.2", + "version": "0.1.7-alpha.1", "publishConfig": { "access": "public" }, diff --git a/packages/client/ui-settings-general/package.json b/packages/client/ui-settings-general/package.json index 54b2ae7aa5..5791636067 100644 --- a/packages/client/ui-settings-general/package.json +++ b/packages/client/ui-settings-general/package.json @@ -1,7 +1,7 @@ { "name": "@deepseek-ai/dsh-client-ui-settings-general", "description": "Settings ownerless-copy and product onboarding plugin: the General section, shell trigger/header chrome content, settings dictionaries, and the versioned welcome notice", - "version": "0.1.6-alpha.2", + "version": "0.1.7-alpha.1", "publishConfig": { "access": "public" }, diff --git a/packages/client/ui-settings-general/tests/shell.client.spec.ts b/packages/client/ui-settings-general/tests/shell.client.spec.ts index b75d903e36..908884592d 100644 --- a/packages/client/ui-settings-general/tests/shell.client.spec.ts +++ b/packages/client/ui-settings-general/tests/shell.client.spec.ts @@ -109,7 +109,9 @@ describe('ui-settings-general shell', () => { off() }) - it('shows Account first only while signed in and removes it on sign-out', async ({ start }) => { + it('shows Account first in Desktop while signed in and removes it on sign-out', async ({ start }) => { + vi.stubGlobal('dshDesktop', {}) + onTestFinished(() => { vi.unstubAllGlobals() }) const c = await start() const { sections } = injectedOf(c).hooks await c.mock.streams.opened('account/watch', 1) diff --git a/packages/client/ui-settings-models/package.json b/packages/client/ui-settings-models/package.json index fe1dcc15b1..5d89bd7e81 100644 --- a/packages/client/ui-settings-models/package.json +++ b/packages/client/ui-settings-models/package.json @@ -1,7 +1,7 @@ { "name": "@deepseek-ai/dsh-client-ui-settings-models", "description": "Models settings and shared product-onboarding dialogs over existing settings and credential joins", - "version": "0.1.6-alpha.2", + "version": "0.1.7-alpha.1", "publishConfig": { "access": "public" }, diff --git a/packages/client/ui-settings-plugin-inventory/package.json b/packages/client/ui-settings-plugin-inventory/package.json index 4e11b38798..319adb4f6a 100644 --- a/packages/client/ui-settings-plugin-inventory/package.json +++ b/packages/client/ui-settings-plugin-inventory/package.json @@ -1,7 +1,7 @@ { "name": "@deepseek-ai/dsh-client-ui-settings-plugin-inventory", "description": "Read-only Cordis Loader inventory tab in Web Plugins settings", - "version": "0.1.6-alpha.2", + "version": "0.1.7-alpha.1", "publishConfig": { "access": "public" }, diff --git a/packages/client/ui-settings-plugins/package.json b/packages/client/ui-settings-plugins/package.json index 89c3dab631..4594e0123a 100644 --- a/packages/client/ui-settings-plugins/package.json +++ b/packages/client/ui-settings-plugins/package.json @@ -1,7 +1,7 @@ { "name": "@deepseek-ai/dsh-client-ui-settings-plugins", "description": "Built-in plugins settings section for the dsh web client: the Settings navigation entry and the tab chrome feature-owned tabs register into", - "version": "0.1.6-alpha.2", + "version": "0.1.7-alpha.1", "publishConfig": { "access": "public" }, diff --git a/packages/client/ui-settings-shell/package.json b/packages/client/ui-settings-shell/package.json index 555e6ac94a..4ede15ac42 100644 --- a/packages/client/ui-settings-shell/package.json +++ b/packages/client/ui-settings-shell/package.json @@ -1,7 +1,7 @@ { "name": "@deepseek-ai/dsh-client-ui-settings-shell", "description": "Settings page of the shell executor on the dsh web client's Plugins page: the command timeout and the per-stream output cap of the shell namespace", - "version": "0.1.6-alpha.2", + "version": "0.1.7-alpha.1", "publishConfig": { "access": "public" }, diff --git a/packages/client/ui-settings-subagent/package.json b/packages/client/ui-settings-subagent/package.json index dd7673cb54..19bc8b197c 100644 --- a/packages/client/ui-settings-subagent/package.json +++ b/packages/client/ui-settings-subagent/package.json @@ -1,7 +1,7 @@ { "name": "@deepseek-ai/dsh-client-ui-settings-subagent", "description": "Settings page of Subagent delegation on the dsh web client's Plugins page: recursion depth, parallel capacity, and the models agents may choose for subagents", - "version": "0.1.6-alpha.2", + "version": "0.1.7-alpha.1", "publishConfig": { "access": "public" }, diff --git a/packages/client/ui-settings-web-search/package.json b/packages/client/ui-settings-web-search/package.json index 57e5b76fe8..d64740adc4 100644 --- a/packages/client/ui-settings-web-search/package.json +++ b/packages/client/ui-settings-web-search/package.json @@ -1,7 +1,7 @@ { "name": "@deepseek-ai/dsh-client-ui-settings-web-search", "description": "Settings page of the DeepSeek web-search provider on the dsh web client's Plugins page: its API key, endpoint, and per-request search budget", - "version": "0.1.6-alpha.2", + "version": "0.1.7-alpha.1", "publishConfig": { "access": "public" }, diff --git a/packages/client/ui-settings/package.json b/packages/client/ui-settings/package.json index cc8762b55c..a6bf6a5a3c 100644 --- a/packages/client/ui-settings/package.json +++ b/packages/client/ui-settings/package.json @@ -1,7 +1,7 @@ { "name": "@deepseek-ai/dsh-client-ui-settings", "description": "Settings domain base plugin: shared configuration forms and the canonical settings slot-type contract", - "version": "0.1.6-alpha.2", + "version": "0.1.7-alpha.1", "publishConfig": { "access": "public" }, diff --git a/packages/client/ui-sidebar-browser/package.json b/packages/client/ui-sidebar-browser/package.json index 94f05df6ed..5adf9a3482 100644 --- a/packages/client/ui-sidebar-browser/package.json +++ b/packages/client/ui-sidebar-browser/package.json @@ -1,7 +1,7 @@ { "name": "@deepseek-ai/dsh-client-ui-sidebar-browser", "description": "Sandboxed Web browser tabs for the right Sidebar", - "version": "0.1.6-alpha.2", + "version": "0.1.7-alpha.1", "publishConfig": { "access": "public" }, diff --git a/packages/client/ui-sidebar-documentpreview/package.json b/packages/client/ui-sidebar-documentpreview/package.json index fe1a8b1a7c..aa69c49b32 100644 --- a/packages/client/ui-sidebar-documentpreview/package.json +++ b/packages/client/ui-sidebar-documentpreview/package.json @@ -1,7 +1,7 @@ { "name": "@deepseek-ai/dsh-client-ui-sidebar-documentpreview", "description": "Extensible Sidebar previews for Office documents, spreadsheets, Markdown, code, images, PDF, HTML, and plain text", - "version": "0.1.6-alpha.2", + "version": "0.1.7-alpha.1", "publishConfig": { "access": "public" }, diff --git a/packages/client/ui-sidebar-files/package.json b/packages/client/ui-sidebar-files/package.json index 20d74ac18c..14d2b9c6c9 100644 --- a/packages/client/ui-sidebar-files/package.json +++ b/packages/client/ui-sidebar-files/package.json @@ -1,7 +1,7 @@ { "name": "@deepseek-ai/dsh-client-ui-sidebar-files", "description": "Workspace file tree tab type for the right Sidebar: lazy directory listing over the workspaceFiles Remote namespace, opening files into the Sidebar", - "version": "0.1.6-alpha.2", + "version": "0.1.7-alpha.1", "publishConfig": { "access": "public" }, diff --git a/packages/client/ui-sidebar-right/package.json b/packages/client/ui-sidebar-right/package.json index a62d0a9aaf..e16e516198 100644 --- a/packages/client/ui-sidebar-right/package.json +++ b/packages/client/ui-sidebar-right/package.json @@ -1,7 +1,7 @@ { "name": "@deepseek-ai/dsh-client-ui-sidebar-right", "description": "Right Sidebar: the docking surface's session-bound state, its panel and header expand control, and the navigation service over it", - "version": "0.1.6-alpha.2", + "version": "0.1.7-alpha.1", "publishConfig": { "access": "public" }, diff --git a/packages/client/ui-sidebar-terminal/package.json b/packages/client/ui-sidebar-terminal/package.json index d9a9fa48ac..ec1e664b2c 100644 --- a/packages/client/ui-sidebar-terminal/package.json +++ b/packages/client/ui-sidebar-terminal/package.json @@ -1,7 +1,7 @@ { "name": "@deepseek-ai/dsh-client-ui-sidebar-terminal", "description": "Interactive shell tabs for the right Sidebar", - "version": "0.1.6-alpha.2", + "version": "0.1.7-alpha.1", "publishConfig": { "access": "public" }, diff --git a/packages/client/ui-sidebar/package.json b/packages/client/ui-sidebar/package.json index 2b33960260..08d1e28058 100644 --- a/packages/client/ui-sidebar/package.json +++ b/packages/client/ui-sidebar/package.json @@ -1,7 +1,7 @@ { "name": "@deepseek-ai/dsh-client-ui-sidebar", "description": "Sidebar plugin: session multi-level tree, search, grouping, state dots", - "version": "0.1.6-alpha.2", + "version": "0.1.7-alpha.1", "publishConfig": { "access": "public" }, diff --git a/packages/client/ui-skill/package.json b/packages/client/ui-skill/package.json index c2e6f16ce5..5f47f81404 100644 --- a/packages/client/ui-skill/package.json +++ b/packages/client/ui-skill/package.json @@ -1,7 +1,7 @@ { "name": "@deepseek-ai/dsh-client-ui-skill", "description": "Web skill references and the dedicated skill tool row", - "version": "0.1.6-alpha.2", + "version": "0.1.7-alpha.1", "publishConfig": { "access": "public" }, diff --git a/packages/client/ui-slots/package.json b/packages/client/ui-slots/package.json index ea6760d124..b805b27033 100644 --- a/packages/client/ui-slots/package.json +++ b/packages/client/ui-slots/package.json @@ -1,7 +1,7 @@ { "name": "@deepseek-ai/dsh-client-ui-slots", "description": "Slot registry pure core: typed ordinary Slots and reusable Component Factories, derived props, Store seats, and renderer installation", - "version": "0.1.6-alpha.2", + "version": "0.1.7-alpha.1", "publishConfig": { "access": "public" }, diff --git a/packages/client/ui-subagent/package.json b/packages/client/ui-subagent/package.json index b67de14a56..591992812a 100644 --- a/packages/client/ui-subagent/package.json +++ b/packages/client/ui-subagent/package.json @@ -1,7 +1,7 @@ { "name": "@deepseek-ai/dsh-client-ui-subagent", "description": "Subagent conversation catalog, continuation routing UI, and '@' reference source", - "version": "0.1.6-alpha.2", + "version": "0.1.7-alpha.1", "publishConfig": { "access": "public" }, diff --git a/packages/client/ui-theme/package.json b/packages/client/ui-theme/package.json index 71187232cb..dc0a7b10fe 100644 --- a/packages/client/ui-theme/package.json +++ b/packages/client/ui-theme/package.json @@ -1,7 +1,7 @@ { "name": "@deepseek-ai/dsh-client-ui-theme", "description": "Theme plugin: Host bootstrap for the pre-plugin palette; DOM-free ThemeRuntime for light/dark/system state; --dsw-* token styles and Appearance settings row", - "version": "0.1.6-alpha.2", + "version": "0.1.7-alpha.1", "publishConfig": { "access": "public" }, diff --git a/packages/client/ui-tool/package.json b/packages/client/ui-tool/package.json index 28d7df5621..87acc5a4e9 100644 --- a/packages/client/ui-tool/package.json +++ b/packages/client/ui-tool/package.json @@ -1,7 +1,7 @@ { "name": "@deepseek-ai/dsh-client-ui-tool", "description": "Client Tool call-tree renderer and keyed per-tool presentation slot", - "version": "0.1.6-alpha.2", + "version": "0.1.7-alpha.1", "publishConfig": { "access": "public" }, diff --git a/packages/client/ui-trajectory/package.json b/packages/client/ui-trajectory/package.json index 3c19291ffc..766c6a5948 100644 --- a/packages/client/ui-trajectory/package.json +++ b/packages/client/ui-trajectory/package.json @@ -1,7 +1,7 @@ { "name": "@deepseek-ai/dsh-client-ui-trajectory", "description": "Trajectory event ledger with an interactive timing overview: pure-consumer plugin registering into the conversation ViewMap (no service)", - "version": "0.1.6-alpha.2", + "version": "0.1.7-alpha.1", "publishConfig": { "access": "public" }, diff --git a/packages/client/ui-user-questions/package.json b/packages/client/ui-user-questions/package.json index 1b6c469eb9..f84d156b5a 100644 --- a/packages/client/ui-user-questions/package.json +++ b/packages/client/ui-user-questions/package.json @@ -1,7 +1,7 @@ { "name": "@deepseek-ai/dsh-client-ui-user-questions", "description": "Web ask_user_question composer takeover and plan-review presentation UI", - "version": "0.1.6-alpha.2", + "version": "0.1.7-alpha.1", "publishConfig": { "access": "public" }, diff --git a/packages/client/ui-workflow-run/package.json b/packages/client/ui-workflow-run/package.json index ca7939dd83..8fb7adbf80 100644 --- a/packages/client/ui-workflow-run/package.json +++ b/packages/client/ui-workflow-run/package.json @@ -1,7 +1,7 @@ { "name": "@deepseek-ai/dsh-client-ui-workflow-run", "description": "Durable workflow-run Conversation Node and nested member disclosure for dsh web", - "version": "0.1.6-alpha.2", + "version": "0.1.7-alpha.1", "publishConfig": { "access": "public" }, diff --git a/packages/client/ui-workspace/package.json b/packages/client/ui-workspace/package.json index d7056a9789..7bbb525f01 100644 --- a/packages/client/ui-workspace/package.json +++ b/packages/client/ui-workspace/package.json @@ -1,7 +1,7 @@ { "name": "@deepseek-ai/dsh-client-ui-workspace", "description": "Workspace picker plugin: one WorkspacePicker registered into the sidebar and empty-state workspace slots", - "version": "0.1.6-alpha.2", + "version": "0.1.7-alpha.1", "publishConfig": { "access": "public" }, diff --git a/packages/client/web/package.json b/packages/client/web/package.json index d908cb0837..dbdceed9cc 100644 --- a/packages/client/web/package.json +++ b/packages/client/web/package.json @@ -1,7 +1,7 @@ { "name": "@deepseek-ai/dsh-client-web", "description": "Web boot kernel: static module table, Cordis loader, framework-free boot page, and UI-renderer handoff", - "version": "0.1.6-alpha.2", + "version": "0.1.7-alpha.1", "publishConfig": { "access": "public" }, diff --git a/packages/compaction/command-compact/package.json b/packages/compaction/command-compact/package.json index 985ba09ae1..cb2280b0e6 100644 --- a/packages/compaction/command-compact/package.json +++ b/packages/compaction/command-compact/package.json @@ -1,7 +1,7 @@ { "name": "@deepseek-ai/dsh-command-compact", "description": "Human-facing slash command for explicit session compaction", - "version": "0.1.6-alpha.2", + "version": "0.1.7-alpha.1", "publishConfig": { "access": "public" }, diff --git a/packages/compaction/compaction-basic/package.json b/packages/compaction/compaction-basic/package.json index 76f5184d57..a7d9bf1b37 100644 --- a/packages/compaction/compaction-basic/package.json +++ b/packages/compaction/compaction-basic/package.json @@ -1,7 +1,7 @@ { "name": "@deepseek-ai/dsh-compaction-basic", "description": "Token-meter-driven compaction policy and LLM summarization backend for the DeepSeek Harness", - "version": "0.1.6-alpha.2", + "version": "0.1.7-alpha.1", "publishConfig": { "access": "public" }, diff --git a/packages/compaction/compaction-image-offload/package.json b/packages/compaction/compaction-image-offload/package.json index 0baa3e2d2d..9e44e450ff 100644 --- a/packages/compaction/compaction-image-offload/package.json +++ b/packages/compaction/compaction-image-offload/package.json @@ -1,7 +1,7 @@ { "name": "@deepseek-ai/dsh-compaction-image-offload", "description": "Durable image offload for image-capable routes: replace over-budget request images with placeholders and retry", - "version": "0.1.6-alpha.2", + "version": "0.1.7-alpha.1", "publishConfig": { "access": "public" }, diff --git a/packages/compaction/compaction-tool-result-pruner/package.json b/packages/compaction/compaction-tool-result-pruner/package.json index 3b7cc8626f..20f2fdb52d 100644 --- a/packages/compaction/compaction-tool-result-pruner/package.json +++ b/packages/compaction/compaction-tool-result-pruner/package.json @@ -1,7 +1,7 @@ { "name": "@deepseek-ai/dsh-compaction-tool-result-pruner", "description": "Replay-safe model-free head/middle/tail pruning for tool-result surface nodes", - "version": "0.1.6-alpha.2", + "version": "0.1.7-alpha.1", "publishConfig": { "access": "public" }, diff --git a/packages/compaction/compaction/package.json b/packages/compaction/compaction/package.json index 8be19988bc..9abbe6e1a1 100644 --- a/packages/compaction/compaction/package.json +++ b/packages/compaction/compaction/package.json @@ -1,7 +1,7 @@ { "name": "@deepseek-ai/dsh-compaction", "description": "Abstract compaction service seam (ctx.compaction) for the DeepSeek Harness", - "version": "0.1.6-alpha.2", + "version": "0.1.7-alpha.1", "publishConfig": { "access": "public" }, diff --git a/packages/computer-use/computer-use/package.json b/packages/computer-use/computer-use/package.json index 455f361ad4..06e8ffe1ce 100644 --- a/packages/computer-use/computer-use/package.json +++ b/packages/computer-use/computer-use/package.json @@ -1,7 +1,7 @@ { "name": "@deepseek-ai/dsh-computer-use", "description": "Exclusive named computer-use provider registration", - "version": "0.1.6-alpha.2", + "version": "0.1.7-alpha.1", "publishConfig": { "access": "public" }, diff --git a/packages/context/agent-instructions/package.json b/packages/context/agent-instructions/package.json index 78b124ed79..f1aadb8161 100644 --- a/packages/context/agent-instructions/package.json +++ b/packages/context/agent-instructions/package.json @@ -1,7 +1,7 @@ { "name": "@deepseek-ai/dsh-agent-instructions", "description": "Workspace context loader for AGENTS.md/CLAUDE.md instruction files", - "version": "0.1.6-alpha.2", + "version": "0.1.7-alpha.1", "publishConfig": { "access": "public" }, diff --git a/packages/context/file-reference-local/package.json b/packages/context/file-reference-local/package.json index 9bf0158ee4..3ba90a6f9c 100644 --- a/packages/context/file-reference-local/package.json +++ b/packages/context/file-reference-local/package.json @@ -1,7 +1,7 @@ { "name": "@deepseek-ai/dsh-file-reference-local", "description": "Local-filesystem ctx.fileReferences provider with bounded fuzzy indexes", - "version": "0.1.6-alpha.2", + "version": "0.1.7-alpha.1", "publishConfig": { "access": "public" }, diff --git a/packages/context/file-reference/package.json b/packages/context/file-reference/package.json index f3c3a776ca..4e62eec197 100644 --- a/packages/context/file-reference/package.json +++ b/packages/context/file-reference/package.json @@ -1,7 +1,7 @@ { "name": "@deepseek-ai/dsh-file-reference", "description": "File-reference discovery contract and shared @file grammar", - "version": "0.1.6-alpha.2", + "version": "0.1.7-alpha.1", "publishConfig": { "access": "public" }, diff --git a/packages/context/session-reference/package.json b/packages/context/session-reference/package.json index 221fdb8e6e..63b6a472e2 100644 --- a/packages/context/session-reference/package.json +++ b/packages/context/session-reference/package.json @@ -1,7 +1,7 @@ { "name": "@deepseek-ai/dsh-session-reference", "description": "Cross-session snapshot references and durable untrusted model context (ctx.sessionReferenceResolver)", - "version": "0.1.6-alpha.2", + "version": "0.1.7-alpha.1", "publishConfig": { "access": "public" }, diff --git a/packages/context/time-context/package.json b/packages/context/time-context/package.json index 59d2912e29..fbe6b3e1a6 100644 --- a/packages/context/time-context/package.json +++ b/packages/context/time-context/package.json @@ -1,7 +1,7 @@ { "name": "@deepseek-ai/dsh-time-context", "description": "Opt-in durable per-step context with the current time and elapsed time", - "version": "0.1.6-alpha.2", + "version": "0.1.7-alpha.1", "publishConfig": { "access": "public" }, diff --git a/packages/context/tmux-context/package.json b/packages/context/tmux-context/package.json index 464ea636f7..a55f52143a 100644 --- a/packages/context/tmux-context/package.json +++ b/packages/context/tmux-context/package.json @@ -1,7 +1,7 @@ { "name": "@deepseek-ai/dsh-tmux-context", "description": "Opt-in durable per-step context with this agent's tmux pane and window location", - "version": "0.1.6-alpha.2", + "version": "0.1.7-alpha.1", "publishConfig": { "access": "public" }, diff --git a/packages/core/agent-default-model/package.json b/packages/core/agent-default-model/package.json index 9a23381962..3c178f4b2f 100644 --- a/packages/core/agent-default-model/package.json +++ b/packages/core/agent-default-model/package.json @@ -1,7 +1,7 @@ { "name": "@deepseek-ai/dsh-agent-default-model", "description": "Default model selection shared by Agent entry points", - "version": "0.1.6-alpha.2", + "version": "0.1.7-alpha.1", "publishConfig": { "access": "public" }, diff --git a/packages/core/agent-loop/package.json b/packages/core/agent-loop/package.json index 9b5452195a..775a18287a 100644 --- a/packages/core/agent-loop/package.json +++ b/packages/core/agent-loop/package.json @@ -1,7 +1,7 @@ { "name": "@deepseek-ai/dsh-agent-loop", "description": "The concrete agent loop plugin for the DeepSeek Harness", - "version": "0.1.6-alpha.2", + "version": "0.1.7-alpha.1", "publishConfig": { "access": "public" }, diff --git a/packages/core/agent-tool-presentation/package.json b/packages/core/agent-tool-presentation/package.json index 8e29edb2ea..766045b25d 100644 --- a/packages/core/agent-tool-presentation/package.json +++ b/packages/core/agent-tool-presentation/package.json @@ -1,7 +1,7 @@ { "name": "@deepseek-ai/dsh-agent-tool-presentation", "description": "Agent-plane presentation selector: composes one agent's tools as PTC mode, native, or both", - "version": "0.1.6-alpha.2", + "version": "0.1.7-alpha.1", "publishConfig": { "access": "public" }, diff --git a/packages/core/agent/package.json b/packages/core/agent/package.json index 013a586ebe..328e14dc26 100644 --- a/packages/core/agent/package.json +++ b/packages/core/agent/package.json @@ -1,7 +1,7 @@ { "name": "@deepseek-ai/dsh-agent", "description": "Agent interface, registry, initiator scope, and event vocabulary for the DeepSeek Harness", - "version": "0.1.6-alpha.2", + "version": "0.1.7-alpha.1", "publishConfig": { "access": "public" }, diff --git a/packages/core/scope/package.json b/packages/core/scope/package.json index 2f4656b3bf..6800bec82a 100644 --- a/packages/core/scope/package.json +++ b/packages/core/scope/package.json @@ -1,7 +1,7 @@ { "name": "@deepseek-ai/dsh-scope", "description": "Scoped-context registration primitive (scope tags, scope-filtered event dispatch) for the DeepSeek Harness", - "version": "0.1.6-alpha.2", + "version": "0.1.7-alpha.1", "publishConfig": { "access": "public" }, diff --git a/packages/core/session/package.json b/packages/core/session/package.json index 453d4d85cb..1280425853 100644 --- a/packages/core/session/package.json +++ b/packages/core/session/package.json @@ -1,7 +1,7 @@ { "name": "@deepseek-ai/dsh-session", "description": "Event-sourced session store for the DeepSeek Harness", - "version": "0.1.6-alpha.2", + "version": "0.1.7-alpha.1", "publishConfig": { "access": "public" }, diff --git a/packages/core/system-prompt/package.json b/packages/core/system-prompt/package.json index 4d430d9ea6..2437ea15ba 100644 --- a/packages/core/system-prompt/package.json +++ b/packages/core/system-prompt/package.json @@ -1,7 +1,7 @@ { "name": "@deepseek-ai/dsh-system-prompt", "description": "System prompt assembly registry for the DeepSeek Harness", - "version": "0.1.6-alpha.2", + "version": "0.1.7-alpha.1", "publishConfig": { "access": "public" }, diff --git a/packages/core/tools/package.json b/packages/core/tools/package.json index 041bf5570b..805e36f866 100644 --- a/packages/core/tools/package.json +++ b/packages/core/tools/package.json @@ -1,7 +1,7 @@ { "name": "@deepseek-ai/dsh-tools", "description": "Tool registry and execution pipeline for the DeepSeek Harness", - "version": "0.1.6-alpha.2", + "version": "0.1.7-alpha.1", "publishConfig": { "access": "public" }, diff --git a/packages/credentials/authorization/package.json b/packages/credentials/authorization/package.json index d74bce9de0..15a497a54d 100644 --- a/packages/credentials/authorization/package.json +++ b/packages/credentials/authorization/package.json @@ -1,7 +1,7 @@ { "name": "@deepseek-ai/dsh-authorization", "description": "Authorization seam (ctx.authorization): plugin-owned flows that obtain a credential through a conversation with the human", - "version": "0.1.6-alpha.2", + "version": "0.1.7-alpha.1", "publishConfig": { "access": "public" }, diff --git a/packages/credentials/credentials-local/package.json b/packages/credentials/credentials-local/package.json index 13affc9457..f4995df85c 100644 --- a/packages/credentials/credentials-local/package.json +++ b/packages/credentials/credentials-local/package.json @@ -1,7 +1,7 @@ { "name": "@deepseek-ai/dsh-credentials-local", "description": "File-backed credentials provider ($DSH_HOME/.env under the live process environment) for the DeepSeek Harness", - "version": "0.1.6-alpha.2", + "version": "0.1.7-alpha.1", "publishConfig": { "access": "public" }, diff --git a/packages/credentials/credentials/package.json b/packages/credentials/credentials/package.json index 068fc157c7..e34be8589a 100644 --- a/packages/credentials/credentials/package.json +++ b/packages/credentials/credentials/package.json @@ -1,7 +1,7 @@ { "name": "@deepseek-ai/dsh-credentials", "description": "Abstract credential seam (ctx.credentials): settings carry references to secrets, providers own the values", - "version": "0.1.6-alpha.2", + "version": "0.1.7-alpha.1", "publishConfig": { "access": "public" }, diff --git a/packages/credentials/deepseek-account-platform/package.json b/packages/credentials/deepseek-account-platform/package.json index 96e46579ee..5db5f3247a 100644 --- a/packages/credentials/deepseek-account-platform/package.json +++ b/packages/credentials/deepseek-account-platform/package.json @@ -1,7 +1,7 @@ { "name": "@deepseek-ai/dsh-deepseek-account-platform", "description": "Authorize DeepSeek accounts through browser PKCE", - "version": "0.1.6-alpha.2", + "version": "0.1.7-alpha.1", "publishConfig": { "access": "public" }, diff --git a/packages/credentials/deepseek-account/package.json b/packages/credentials/deepseek-account/package.json index 63cc95546d..9940eb6146 100644 --- a/packages/credentials/deepseek-account/package.json +++ b/packages/credentials/deepseek-account/package.json @@ -1,7 +1,7 @@ { "name": "@deepseek-ai/dsh-deepseek-account", "description": "Read account state and resolve official API credentials", - "version": "0.1.6-alpha.2", + "version": "0.1.7-alpha.1", "publishConfig": { "access": "public" }, diff --git a/packages/deliverables/tool-present/package.json b/packages/deliverables/tool-present/package.json index f50b3e820f..316b890fbf 100644 --- a/packages/deliverables/tool-present/package.json +++ b/packages/deliverables/tool-present/package.json @@ -1,7 +1,7 @@ { "name": "@deepseek-ai/dsh-tool-present", "description": "Explicit workspace file delivery declarations for the DeepSeek Harness", - "version": "0.1.6-alpha.2", + "version": "0.1.7-alpha.1", "publishConfig": { "access": "public" }, diff --git a/packages/deliverables/workspace-changes/package.json b/packages/deliverables/workspace-changes/package.json index f1b7b87afc..274a8e97c6 100644 --- a/packages/deliverables/workspace-changes/package.json +++ b/packages/deliverables/workspace-changes/package.json @@ -1,7 +1,7 @@ { "name": "@deepseek-ai/dsh-workspace-changes", "description": "Per-turn workspace file changes recorded from git working-tree snapshots and whole-file captures, with per-file comparisons, for the DeepSeek Harness", - "version": "0.1.6-alpha.2", + "version": "0.1.7-alpha.1", "publishConfig": { "access": "public" }, diff --git a/packages/document/office-to-pdf/package.json b/packages/document/office-to-pdf/package.json index f6eb50a443..b2fcb0b1ec 100644 --- a/packages/document/office-to-pdf/package.json +++ b/packages/document/office-to-pdf/package.json @@ -1,7 +1,7 @@ { "name": "@deepseek-ai/dsh-office-to-pdf", "description": "Shared Office-to-PDF conversion with bounded queues and caching", - "version": "0.1.6-alpha.2", + "version": "0.1.7-alpha.1", "publishConfig": { "access": "public" }, diff --git a/packages/experimental/agent-team-profile/package.json b/packages/experimental/agent-team-profile/package.json index fcc06fcf37..8b8f13ab09 100644 --- a/packages/experimental/agent-team-profile/package.json +++ b/packages/experimental/agent-team-profile/package.json @@ -1,7 +1,7 @@ { "name": "@deepseek-ai/dsh-experimental-agent-team-profile", "description": "Agent Teams collaboration, tools, and Web UI in one experimental bundle", - "version": "0.1.6-alpha.2", + "version": "0.1.7-alpha.1", "icon": "./icon.svg", "publishConfig": { "access": "public" diff --git a/packages/experimental/agent-team/package.json b/packages/experimental/agent-team/package.json index db127f9f7e..14767611c6 100644 --- a/packages/experimental/agent-team/package.json +++ b/packages/experimental/agent-team/package.json @@ -1,7 +1,7 @@ { "name": "@deepseek-ai/dsh-experimental-agent-team", "description": "Implicit-root Agent Teams roster, durable peer mailbox, and shared task DAG", - "version": "0.1.6-alpha.2", + "version": "0.1.7-alpha.1", "publishConfig": { "access": "public" }, diff --git a/packages/experimental/api-speech-to-text/package.json b/packages/experimental/api-speech-to-text/package.json index d591297900..dc224aba5e 100644 --- a/packages/experimental/api-speech-to-text/package.json +++ b/packages/experimental/api-speech-to-text/package.json @@ -1,7 +1,7 @@ { "name": "@deepseek-ai/dsh-experimental-api-speech-to-text", "description": "Authenticated experimental speech transcription for browser clients", - "version": "0.1.6-alpha.2", + "version": "0.1.7-alpha.1", "publishConfig": { "access": "public" }, diff --git a/packages/experimental/auto-review/package.json b/packages/experimental/auto-review/package.json index f75c46c8da..d29d47aa09 100644 --- a/packages/experimental/auto-review/package.json +++ b/packages/experimental/auto-review/package.json @@ -1,7 +1,7 @@ { "name": "@deepseek-ai/dsh-experimental-auto-review", "description": "Per-tool LLM authorization review for the DeepSeek Harness Auto permission preset", - "version": "0.1.6-alpha.2", + "version": "0.1.7-alpha.1", "repository": { "type": "git", "url": "git+https://github.com/deepseek-ai/deepseek-harness.git", diff --git a/packages/experimental/browser-use-chrome-devtools-mcp/package.json b/packages/experimental/browser-use-chrome-devtools-mcp/package.json index 014c008ad8..03a619848e 100644 --- a/packages/experimental/browser-use-chrome-devtools-mcp/package.json +++ b/packages/experimental/browser-use-chrome-devtools-mcp/package.json @@ -1,7 +1,7 @@ { "name": "@deepseek-ai/dsh-experimental-browser-use-chrome-devtools-mcp", "description": "Experimental per-Session Chromium browser tools through chrome-devtools-mcp", - "version": "0.1.6-alpha.2", + "version": "0.1.7-alpha.1", "publishConfig": { "access": "public" }, diff --git a/packages/experimental/browser-use-playwright-mcp/package.json b/packages/experimental/browser-use-playwright-mcp/package.json index eaabc9607b..8ebd6c3776 100644 --- a/packages/experimental/browser-use-playwright-mcp/package.json +++ b/packages/experimental/browser-use-playwright-mcp/package.json @@ -1,7 +1,7 @@ { "name": "@deepseek-ai/dsh-experimental-browser-use-playwright-mcp", "description": "Experimental per-Session Chromium browser tools through @playwright/mcp", - "version": "0.1.6-alpha.2", + "version": "0.1.7-alpha.1", "publishConfig": { "access": "public" }, diff --git a/packages/experimental/browser-use-runtime/package.json b/packages/experimental/browser-use-runtime/package.json index 309680dd6c..68998b1a4e 100644 --- a/packages/experimental/browser-use-runtime/package.json +++ b/packages/experimental/browser-use-runtime/package.json @@ -1,7 +1,7 @@ { "name": "@deepseek-ai/dsh-experimental-browser-use-runtime", "description": "Session-owned browser resource lifecycles and MCP integration for experimental providers", - "version": "0.1.6-alpha.2", + "version": "0.1.7-alpha.1", "publishConfig": { "access": "public" }, diff --git a/packages/experimental/browser-use-stagehand-native/package.json b/packages/experimental/browser-use-stagehand-native/package.json index e88afeeabe..9c6a106167 100644 --- a/packages/experimental/browser-use-stagehand-native/package.json +++ b/packages/experimental/browser-use-stagehand-native/package.json @@ -1,7 +1,7 @@ { "name": "@deepseek-ai/dsh-experimental-browser-use-stagehand-native", "description": "Experimental Stagehand browser tools with separately configured native models", - "version": "0.1.6-alpha.2", + "version": "0.1.7-alpha.1", "publishConfig": { "access": "public" }, diff --git a/packages/experimental/client-ui-agent-team/package.json b/packages/experimental/client-ui-agent-team/package.json index cbde881879..645eebb8ab 100644 --- a/packages/experimental/client-ui-agent-team/package.json +++ b/packages/experimental/client-ui-agent-team/package.json @@ -1,7 +1,7 @@ { "name": "@deepseek-ai/dsh-experimental-client-ui-agent-team", "description": "Web Agent Teams roster, task board, and teammate navigation", - "version": "0.1.6-alpha.2", + "version": "0.1.7-alpha.1", "publishConfig": { "access": "public" }, diff --git a/packages/experimental/client-ui-voice-input/README.i18n.yaml b/packages/experimental/client-ui-voice-input/README.i18n.yaml index 3ec7d19f10..c81fd5bd73 100644 --- a/packages/experimental/client-ui-voice-input/README.i18n.yaml +++ b/packages/experimental/client-ui-voice-input/README.i18n.yaml @@ -2,5 +2,5 @@ # side as of the last confirmed-consistent state. Both languages carry equal authority; # after editing either side, bring the other along and re-record with: # pnpm run verify-translation-pairing --write packages/experimental/client-ui-voice-input/README.md -README.md: b9966a6bbfc8dd9ec3209f93c0355fbe5ceff383 -README.zh.md: 83e7e1f23267ec838dbf7f44f5add4a78da06048 +README.md: 4d859f4d9837c249c564abfbba0682f1493502d9 +README.zh.md: 84a02e4f620feb35706de5b3bc10ec291f32c423 diff --git a/packages/experimental/client-ui-voice-input/README.md b/packages/experimental/client-ui-voice-input/README.md index b9966a6bbf..4d859f4d98 100644 --- a/packages/experimental/client-ui-voice-input/README.md +++ b/packages/experimental/client-ui-voice-input/README.md @@ -9,7 +9,7 @@ English | [中文](README.zh.md) ## Summary -This optional browser plugin adds a microphone between the model selector and Send. Clicking it opens a recording toolbar with measured audio levels, Cancel and Stop. The waveform stays shorter than the recording buttons. Stopping transcribes into the draft. Recognition preferences and model preparation live in plugin settings; language choices come from the selected provider. +This optional browser plugin adds an outline microphone icon between the model selector and Send. Clicking it opens a recording toolbar with measured audio levels, Cancel and Stop. The waveform stays shorter than the recording buttons. Stopping transcribes into the draft. Recognition preferences and model preparation live in plugin settings; language choices come from the selected provider. ## Table of Contents diff --git a/packages/experimental/client-ui-voice-input/README.zh.md b/packages/experimental/client-ui-voice-input/README.zh.md index 83e7e1f232..84a02e4f62 100644 --- a/packages/experimental/client-ui-voice-input/README.zh.md +++ b/packages/experimental/client-ui-voice-input/README.zh.md @@ -9,7 +9,7 @@ kind: "package-reference" ## 概述 -此可选浏览器插件在模型选择器与发送按钮之间添加麦克风。点击后展开录音栏,显示实际音量以及取消、停止按钮。声波高度低于录音按钮高度。停止后转写到草稿。识别偏好和模型准备放在插件设置中;语言选项来自所选 Provider。 +此可选浏览器插件在模型选择器与发送按钮之间添加空心麦克风图标。点击后展开录音栏,显示实际音量以及取消、停止按钮。声波高度低于录音按钮高度。停止后转写到草稿。识别偏好和模型准备放在插件设置中;语言选项来自所选 Provider。 ## 目录 diff --git a/packages/experimental/client-ui-voice-input/package.json b/packages/experimental/client-ui-voice-input/package.json index ec2e3c4e6f..b5c7d6e948 100644 --- a/packages/experimental/client-ui-voice-input/package.json +++ b/packages/experimental/client-ui-voice-input/package.json @@ -1,7 +1,7 @@ { "name": "@deepseek-ai/dsh-experimental-client-ui-voice-input", "description": "Record speech and insert editable text into the conversation draft", - "version": "0.1.6-alpha.2", + "version": "0.1.7-alpha.1", "publishConfig": { "access": "public" }, diff --git a/packages/experimental/client-ui-voice-input/src/client/PreparationCard.tsx b/packages/experimental/client-ui-voice-input/src/client/PreparationCard.tsx index 23fc399921..61a81b4586 100644 --- a/packages/experimental/client-ui-voice-input/src/client/PreparationCard.tsx +++ b/packages/experimental/client-ui-voice-input/src/client/PreparationCard.tsx @@ -29,6 +29,17 @@ function DownloadProgress({ state, t }: { state: SpeechPreparationState } & Prop ? : null } +function PreparationFailure({ state, t }: { state: Extract } & PropsLocale) { + const failure = state.download + if (!failure) return

{t('preparationFailed', { message: state.message })}

+ return
+

{t(`download.${failure.reason}`, { resource: failure.resource, status: String(failure.status) })}

+

{t(`downloadAdvice.${failure.reason}`)}

+ {t('downloadSource', { source: failure.source })} + {failure.code && {t('downloadCode', { code: failure.code })}} +
+} + /** Render a collapsed current-step summary or all Host-owned preparation steps. */ export function PreparationCard({ provider, connected, prepare, cancelPreparation, t }: PreparationCardProps) { const state = provider.preparation @@ -88,7 +99,7 @@ export function PreparationCard({ provider, connected, prepare, cancelPreparatio {!expanded && } - {state.phase === 'failed' &&

{t('preparationFailed', { message: state.message })}

} + {state.phase === 'failed' && }
{['unprepared', 'cancelled', 'failed'].includes(state.phase) && } diff --git a/packages/experimental/client-ui-voice-input/src/client/VoiceInput.module.css b/packages/experimental/client-ui-voice-input/src/client/VoiceInput.module.css index 71c865bb1e..436b2d5286 100644 --- a/packages/experimental/client-ui-voice-input/src/client/VoiceInput.module.css +++ b/packages/experimental/client-ui-voice-input/src/client/VoiceInput.module.css @@ -12,6 +12,7 @@ .preparationActions { display: flex; gap: 8px; } .preparationActions:empty { display: none; } .preparationError { color: var(--dsw-alias-state-error-primary); overflow-wrap: anywhere; font-size: 12px; } +.downloadFailure { display: grid; gap: 6px; overflow-wrap: anywhere; } .summaryRow { min-height: 28px; height: auto; flex-wrap: wrap; gap: 4px; } .summaryTitle { flex: 1; min-width: 0; } .metric { font-size: 12px; color: var(--dsw-alias-label-tertiary); } diff --git a/packages/experimental/client-ui-voice-input/src/client/locales.ts b/packages/experimental/client-ui-voice-input/src/client/locales.ts index 5289da2d3c..f275ad72d6 100644 --- a/packages/experimental/client-ui-voice-input/src/client/locales.ts +++ b/packages/experimental/client-ui-voice-input/src/client/locales.ts @@ -40,6 +40,24 @@ export const zh = { 'downloadUnknown': '已下载 {completed} MB', 'elapsed': '已等待 {seconds} 秒', 'preparationFailed': '准备失败:{message}', + 'download.network': '无法下载 {resource}:连接下载服务失败。', + 'download.dns': '无法下载 {resource}:无法解析下载地址。', + 'download.timeout': '下载 {resource} 超时。', + 'download.certificate': '无法下载 {resource}:安全连接的证书校验失败。', + 'download.http': '无法下载 {resource}:下载服务返回 HTTP {status}。', + 'download.integrity': '{resource} 下载不完整或文件校验失败。', + 'download.storage': '无法保存 {resource}:磁盘空间不足或没有写入权限。', + 'download.unknown': '准备 {resource} 失败。', + 'downloadAdvice.network': '请检查运行 DSH 的机器能否访问下载来源及其模型下载服务;如需代理,请在该机器上配置后重试。', + 'downloadAdvice.dns': '请检查运行 DSH 的机器的 DNS 和代理设置,确认可以解析下载来源的域名后重试。', + 'downloadAdvice.timeout': '请检查运行 DSH 的机器的网络或代理连接,稍后重试。已下载并通过校验的文件会保留。', + 'downloadAdvice.certificate': '请检查运行 DSH 的机器的系统时间、受信任证书和代理设置后重试。', + 'downloadAdvice.http': '请确认下载地址可用、代理可正常连接下载服务,或稍后重试。', + 'downloadAdvice.integrity': '请重试下载。已完成并通过校验的其他文件会保留。', + 'downloadAdvice.storage': '请检查运行 DSH 的机器的剩余磁盘空间,以及模型目录的写入权限后重试。', + 'downloadAdvice.unknown': '请检查运行 DSH 的机器的网络、磁盘空间和模型目录权限后重试。', + downloadSource: '下载来源:{source}', + downloadCode: '错误码:{code}', 'reconnecting': '正在连接语音服务…', 'preparation.unprepared': '首次使用需要下载本地识别模型。', 'preparation.checking': '正在检查本地资源…', @@ -59,7 +77,8 @@ export const zh = { start: '开始录音', stop: '停止并识别', cancel: '取消', insert: '插入文字', loading: '正在读取识别服务…', requesting: '请允许使用麦克风…', recording: '正在录音…', interrupted: '录音中断,请重试。', - local: '音频在运行 DSH 的机器上识别。', cloud: '音频将发送至所选云端服务。', + local: '音频在运行 DSH 的机器上识别。首次准备默认从 Hugging Face 下载模型,该机器需要能访问 Hugging Face 及其模型下载服务。如需代理,请在该机器上配置。', + cloud: '音频将发送至所选云端服务。', empty: '未识别到语音', cancelled: '已取消语音输入。', conflict: '草稿已被修改。识别文字已保留,可在当前光标位置插入。', failed: '语音识别失败:{message}', @@ -108,6 +127,24 @@ export const en: Record = { 'downloadUnknown': 'Downloaded {completed} MB', 'elapsed': 'Waiting {seconds} seconds', 'preparationFailed': 'Preparation failed: {message}', + 'download.network': 'Cannot download {resource}: connection to the download service failed.', + 'download.dns': 'Cannot download {resource}: the download address could not be resolved.', + 'download.timeout': 'The download of {resource} timed out.', + 'download.certificate': 'Cannot download {resource}: certificate verification failed.', + 'download.http': 'Cannot download {resource}: the download service returned HTTP {status}.', + 'download.integrity': 'The download of {resource} is incomplete or failed verification.', + 'download.storage': 'Cannot save {resource}: insufficient disk space or write permission.', + 'download.unknown': 'Could not prepare {resource}.', + 'downloadAdvice.network': 'Check that the machine running DSH can reach the download source and its model download services. Configure a proxy on that machine if needed, then retry.', + 'downloadAdvice.dns': 'Check DNS and proxy settings on the machine running DSH. Confirm that it can resolve the download source domain, then retry.', + 'downloadAdvice.timeout': 'Check the network or proxy connection on the machine running DSH, then retry later. Verified downloaded files are retained.', + 'downloadAdvice.certificate': 'Check the system clock, trusted certificates and proxy settings on the machine running DSH, then retry.', + 'downloadAdvice.http': 'Confirm that the download address is available and the proxy can reach the download service, or retry later.', + 'downloadAdvice.integrity': 'Retry the download. Other completed and verified files are retained.', + 'downloadAdvice.storage': 'Check available disk space and write permission for the model directory on the machine running DSH, then retry.', + 'downloadAdvice.unknown': 'Check the network, disk space and model directory permissions on the machine running DSH, then retry.', + downloadSource: 'Download source: {source}', + downloadCode: 'Error code: {code}', 'reconnecting': 'Connecting to speech recognition…', 'preparation.unprepared': 'First use downloads the local recognition models.', 'preparation.checking': 'Checking local resources…', @@ -127,7 +164,8 @@ export const en: Record = { start: 'Start recording', stop: 'Stop and transcribe', cancel: 'Cancel', insert: 'Insert text', loading: 'Loading recognition services…', requesting: 'Allow microphone access to continue…', recording: 'Recording…', interrupted: 'Recording was interrupted. Please try again.', - local: 'Audio is recognized on the machine running DSH.', cloud: 'Audio will be sent to the selected cloud service.', + local: 'Audio is recognized on the machine running DSH. First setup downloads models from Hugging Face by default, so that machine must be able to access Hugging Face and its model download services. If a proxy is needed, configure it on that machine.', + cloud: 'Audio will be sent to the selected cloud service.', empty: 'No speech recognized', cancelled: 'Voice input cancelled.', conflict: 'Your draft changed. The transcript is preserved and can be inserted at the current cursor.', failed: 'Speech recognition failed: {message}', diff --git a/packages/experimental/client-ui-voice-input/tests/preparation.client.spec.tsx b/packages/experimental/client-ui-voice-input/tests/preparation.client.spec.tsx index dea23e9c01..759bb1f994 100644 --- a/packages/experimental/client-ui-voice-input/tests/preparation.client.spec.tsx +++ b/packages/experimental/client-ui-voice-input/tests/preparation.client.spec.tsx @@ -84,6 +84,30 @@ it('shows waking without an explicit preparation cancellation control', () => { expect(screen.getByText('已等待 5 秒')).toBeTruthy() expect(screen.queryByRole('button', { name: zh.cancelPrepare })).toBeNull() }) +it('explains download failures on the Host machine and retains an actionable retry', () => { + const b = fixture({ phase: 'failed', message: 'fetch failed', download: { + resource: 'model.int8.onnx', source: 'https://mirror.example', reason: 'dns', code: 'ENOTFOUND', + } }) + const alert = screen.getByRole('alert') + expect(alert.textContent).toContain('无法下载 model.int8.onnx:无法解析下载地址。') + expect(alert.textContent).toContain('运行 DSH 的机器的 DNS 和代理设置') + expect(alert.textContent).toContain('下载来源:https://mirror.example') + expect(alert.textContent).toContain('错误码:ENOTFOUND') + expect(alert.textContent).not.toContain('fetch failed') + expect(alert.textContent).not.toContain('Hugging Face') + fireEvent.click(screen.getByRole('button', { name: zh.retryPrepare })) + expect(b.prepare).toHaveBeenCalledWith(id) + b.rerender() + expect(screen.getByRole('alert').textContent).toContain('无法下载 tokens.txt:下载服务返回 HTTP 503。') + expect(screen.getByRole('alert').textContent).not.toContain('错误码') + b.rerender() + expect(screen.getByRole('alert').textContent).toBe('准备失败:runtime missing') +}) it('persists settings and reports disconnection in the detail card', async () => { const store = createSnapshotStore({ connected: true, error: null, catalog: { selection: { providerId: id, language: 'auto' }, maxAudioBytes: 100, maxDurationSeconds: 120, diff --git a/packages/experimental/computer-use-cua-driver-mcp/package.json b/packages/experimental/computer-use-cua-driver-mcp/package.json index 6dc75993e4..3266280b0c 100644 --- a/packages/experimental/computer-use-cua-driver-mcp/package.json +++ b/packages/experimental/computer-use-cua-driver-mcp/package.json @@ -1,7 +1,7 @@ { "name": "@deepseek-ai/dsh-experimental-computer-use-cua-driver-mcp", "description": "Experimental computer use through an installed Cua Driver MCP executable", - "version": "0.1.6-alpha.2", + "version": "0.1.7-alpha.1", "publishConfig": { "access": "public" }, diff --git a/packages/experimental/computer-use-cua-driver-native/package.json b/packages/experimental/computer-use-cua-driver-native/package.json index 933322cf08..8287331a15 100644 --- a/packages/experimental/computer-use-cua-driver-native/package.json +++ b/packages/experimental/computer-use-cua-driver-native/package.json @@ -1,7 +1,7 @@ { "name": "@deepseek-ai/dsh-experimental-computer-use-cua-driver-native", "description": "Experimental computer-use provider embedding the Cua Driver native npm SDK", - "version": "0.1.6-alpha.2", + "version": "0.1.7-alpha.1", "publishConfig": { "access": "public" }, diff --git a/packages/experimental/inspector/package.json b/packages/experimental/inspector/package.json index 8dcdb4af44..e7b98ab61e 100644 --- a/packages/experimental/inspector/package.json +++ b/packages/experimental/inspector/package.json @@ -1,7 +1,7 @@ { "name": "@deepseek-ai/dsh-experimental-inspector", "description": "Experimental cross-realm CDP hub for Host debugging and Client Runtime inspection", - "version": "0.1.6-alpha.2", + "version": "0.1.7-alpha.1", "publishConfig": { "access": "public" }, diff --git a/packages/experimental/ptc-runtime-python/package.json b/packages/experimental/ptc-runtime-python/package.json index 48a103ef57..3d8acd591a 100644 --- a/packages/experimental/ptc-runtime-python/package.json +++ b/packages/experimental/ptc-runtime-python/package.json @@ -1,7 +1,7 @@ { "name": "@deepseek-ai/dsh-experimental-ptc-runtime-python", "description": "CPython subprocess implementation of the DeepSeek Harness PTC execution seam", - "version": "0.1.6-alpha.2", + "version": "0.1.7-alpha.1", "repository": { "type": "git", "url": "git+https://github.com/deepseek-ai/deepseek-harness.git", diff --git a/packages/experimental/speech-to-text-sensevoice/README.i18n.yaml b/packages/experimental/speech-to-text-sensevoice/README.i18n.yaml index df7b1b5d04..a6f7e23754 100644 --- a/packages/experimental/speech-to-text-sensevoice/README.i18n.yaml +++ b/packages/experimental/speech-to-text-sensevoice/README.i18n.yaml @@ -2,5 +2,5 @@ # side as of the last confirmed-consistent state. Both languages carry equal authority; # after editing either side, bring the other along and re-record with: # pnpm run verify-translation-pairing --write packages/experimental/speech-to-text-sensevoice/README.md -README.md: ea751ca1e080ac4805a4cdff58e47dfb9b1dc75d -README.zh.md: fc142d1f8bd0f46d93904a29915d985ed9eb2ba0 +README.md: 412b179d03e8b6a9eff143a5884bfb393996249b +README.zh.md: b9a00d7ba9cb454fab9b1153bb1855107b08a34a diff --git a/packages/experimental/speech-to-text-sensevoice/README.md b/packages/experimental/speech-to-text-sensevoice/README.md index ea751ca1e0..412b179d03 100644 --- a/packages/experimental/speech-to-text-sensevoice/README.md +++ b/packages/experimental/speech-to-text-sensevoice/README.md @@ -27,6 +27,8 @@ This provider recognizes speech with SenseVoiceSmall ONNX and Silero VAD on the The [bundle](../voice-input-bundle/README.md) supplies an absolute `dataRoot` under the DSH home. Preparation downloads revision-pinned model files, verifies their sizes and SHA-256 hashes, then loads them. `precision` defaults to `int8`; `fp32` selects the larger reference weights. `modelDirectory` supplies an existing absolute directory containing the selected ONNX file and `tokens.txt`; `vadModelPath` selects an existing Silero ONNX file. `modelOrigin` selects a Hugging Face-compatible download origin while preserving pinned paths and checksums. Verified completed files remain reusable after cancellation or failure. +Download failures identify the asset and source origin, with a classified cause and HTTP status or diagnostic code when available. The public state omits URL credentials, query strings and raw cause messages. Retry reuses verified files; partial downloads restart. + Every activation checks the selected model, tokens and VAD on disk. Complete verified caches restore readiness immediately after inspection; the first recording wakes the worker. Missing files or mismatched managed checksums require explicit preparation, while unreadable paths report an error. Explicit deployment paths are checked for accessibility; their contents remain the deployer's responsibility. Disabling the plugin or restarting the Host does not require downloading intact caches again. ----- diff --git a/packages/experimental/speech-to-text-sensevoice/README.zh.md b/packages/experimental/speech-to-text-sensevoice/README.zh.md index fc142d1f8b..b9a00d7ba9 100644 --- a/packages/experimental/speech-to-text-sensevoice/README.zh.md +++ b/packages/experimental/speech-to-text-sensevoice/README.zh.md @@ -27,6 +27,8 @@ kind: "package-reference" [Bundle](../voice-input-bundle/README.zh.md) 在 DSH 主目录下提供绝对 `dataRoot`。准备会下载固定修订的模型文件,校验大小与 SHA-256,再加载模型。`precision` 默认为 `int8`,`fp32` 选择较大的参考权重。`modelDirectory` 提供包含所选 ONNX 文件和 `tokens.txt` 的已有绝对目录,`vadModelPath` 选择已有 Silero ONNX 文件。`modelOrigin` 选择兼容 Hugging Face 的下载源,固定路径和校验值保持不变。取消或失败后复用已完成并通过校验的文件。 +下载失败会标明文件与下载源,并提供原因分类,以及可用的 HTTP 状态或错误码。公开状态不包含 URL 凭据、查询参数和原始底层错误消息。重试复用已校验文件,未完成的文件重新下载。 + 每次启用都会检查磁盘上的所选模型、词表与 VAD。缓存完整且校验通过后立即恢复就绪,首次录音再唤醒工作进程。文件缺失或托管文件校验不符时需要显式准备;路径不可读时报告错误。显式部署路径只检查可访问性,文件内容由部署者负责。禁用插件或重启 Host 后,无需重新下载完好的缓存。 ----- diff --git a/packages/experimental/speech-to-text-sensevoice/package.json b/packages/experimental/speech-to-text-sensevoice/package.json index 9b0b523b57..72f5d6582f 100644 --- a/packages/experimental/speech-to-text-sensevoice/package.json +++ b/packages/experimental/speech-to-text-sensevoice/package.json @@ -1,7 +1,7 @@ { "name": "@deepseek-ai/dsh-experimental-speech-to-text-sensevoice", "description": "Local SenseVoice ONNX transcription with a managed sherpa-onnx process", - "version": "0.1.6-alpha.2", + "version": "0.1.7-alpha.1", "publishConfig": { "access": "public" }, diff --git a/packages/experimental/speech-to-text-sensevoice/src/download-error.ts b/packages/experimental/speech-to-text-sensevoice/src/download-error.ts new file mode 100644 index 0000000000..358f267a1a --- /dev/null +++ b/packages/experimental/speech-to-text-sensevoice/src/download-error.ts @@ -0,0 +1,46 @@ +/** Download failures retain their cause locally and expose only safe, structured diagnostics to clients. */ +import type { SpeechDownloadFailure } from '@deepseek-ai/dsh-experimental-speech-to-text/types' +import { TimeoutReason } from '@deepseek-ai/dsh-timeout' + +type FailureKind = Pick + +const codes: readonly [SpeechDownloadFailure['reason'], RegExp][] = [ + ['dns', /^(ENOTFOUND|EAI_AGAIN)$/], + ['timeout', /^(ETIMEDOUT|ERR_SOCKET_CONNECTION_TIMEOUT|UND_ERR_(CONNECT|HEADERS|BODY)_TIMEOUT)$/], + ['certificate', /^(CERT_[A-Z_]+|ERR_TLS_CERT_ALTNAME_INVALID|DEPTH_ZERO_SELF_SIGNED_CERT|SELF_SIGNED_CERT_IN_CHAIN|UNABLE_TO_VERIFY_LEAF_SIGNATURE|UNABLE_TO_GET_ISSUER_CERT_LOCALLY)$/], + ['storage', /^(ENOSPC|EDQUOT|EACCES|EPERM|EROFS)$/], + ['network', /^(ECONNREFUSED|ECONNRESET|ENETUNREACH|EHOSTUNREACH|EPIPE|UND_ERR_SOCKET)$/], +] + +/** + * Inspect native fetch causes, including aggregate connection attempts, without publishing their messages. + * @param failure - error received from the network or filesystem. + * @returns an actionable category and recognized diagnostic code, or a generic failure. + */ +export function classifyDownloadFailure(failure: unknown): FailureKind { + const pending: unknown[] = [failure], visited = new Set() + let reason: SpeechDownloadFailure['reason'] = 'unknown' + while (pending.length > 0) { + const error = pending.shift() + if (!(error instanceof Error) || visited.has(error)) continue + visited.add(error) + if (error instanceof TimeoutReason || error.name === 'TimeoutError') return { reason: 'timeout' } + if ('code' in error && typeof error.code === 'string') { + for (const [kind, pattern] of codes) if (pattern.test(error.code)) return { reason: kind, code: error.code } + } + if (error instanceof TypeError && error.message === 'fetch failed') reason = 'network' + pending.push(error.cause) + if (error instanceof AggregateError) { + const causes: readonly unknown[] = error.errors + pending.push(...causes) + } + } + return { reason } +} + +/** A preparation error whose public details exclude raw causes, credentials, signed URLs and local paths. */ +export class SpeechDownloadError extends Error { + constructor(readonly download: SpeechDownloadFailure, options?: ErrorOptions) { + super(`Unable to prepare ${download.resource} from ${download.source}: ${download.reason}${download.code ? ` (${download.code})` : ''}${download.status === undefined ? '' : ` (HTTP ${download.status})`}`, options) + } +} diff --git a/packages/experimental/speech-to-text-sensevoice/src/recognizer.ts b/packages/experimental/speech-to-text-sensevoice/src/recognizer.ts index d0a2c0e58b..fefd02acac 100644 --- a/packages/experimental/speech-to-text-sensevoice/src/recognizer.ts +++ b/packages/experimental/speech-to-text-sensevoice/src/recognizer.ts @@ -8,6 +8,7 @@ import { deadline } from '@deepseek-ai/dsh-timeout' import { z } from 'zod' import type { Config } from './config.ts' import { SpeechInputError } from './input.ts' +import { SpeechDownloadError } from './download-error.ts' import { inspectRuntime, prepareRuntime, type RuntimePaths } from './runtime.ts' const transcriptSchema = z.object({ @@ -186,7 +187,8 @@ export class SenseVoiceWorker { .catch((error: unknown) => { if (this.lifetime.signal.aborted) return this.publish(abort.signal.aborted ? { phase: 'cancelled' } - : { phase: 'failed', message: error instanceof Error ? error.message : String(error) }) + : { phase: 'failed', message: error instanceof Error ? error.message : String(error), + ...error instanceof SpeechDownloadError ? { download: error.download } : {} }) }).finally(() => { this.preparing = undefined }) } diff --git a/packages/experimental/speech-to-text-sensevoice/src/runtime.ts b/packages/experimental/speech-to-text-sensevoice/src/runtime.ts index a2ef43a17d..e67adfe240 100644 --- a/packages/experimental/speech-to-text-sensevoice/src/runtime.ts +++ b/packages/experimental/speech-to-text-sensevoice/src/runtime.ts @@ -11,6 +11,8 @@ import type { Context } from '@deepseek-ai/cordis' import type {} from '@deepseek-ai/dsh-subprocess' import type { Config } from './config.ts' import type { SpeechPreparationState } from '@deepseek-ai/dsh-experimental-speech-to-text/types' +import { timeoutOf } from '@deepseek-ai/dsh-timeout' +import { classifyDownloadFailure, SpeechDownloadError } from './download-error.ts' /** Release-pinned downloadable file. */ export interface Asset { @@ -96,36 +98,50 @@ export async function inspectRuntime(config: Config, signal: AbortSignal): Promi * @param root - provider-owned cache directory. * @param signal - preparation cancellation. * @param report - Host-owned progress publisher. - * @returns verified local file path. + * @returns verified local file path; failures carry localized-UI diagnostics through SpeechDownloadError. */ export async function downloadAsset(asset: Asset, root: string, signal: AbortSignal, report: (state: SpeechPreparationState) => void = () => {}): Promise { signal.throwIfAborted() - await mkdir(root, { recursive: true }) const destination = join(root, asset.name) - if (await matchesAsset(destination, asset, signal)) return destination const partial = `${destination}.${randomUUID()}.part` + let source = new URL(asset.url).origin try { - const response = await fetch(asset.url, { signal }) - if (!response.ok || !response.body) throw new Error(`Speech asset download failed: HTTP ${response.status}`) - const digest = createHash('sha256') - let completedBytes = 0 - const publish = (): void => { report({ phase: 'downloading', resource: asset.name, completedBytes, totalBytes: asset.bytes }) } - publish() - const hashing = new Transform({ transform(chunk: Buffer, _encoding, callback) { - completedBytes += chunk.length - if (completedBytes > asset.bytes) { callback(new Error(`Speech asset exceeds its pinned size: ${asset.name}`)); return } - digest.update(chunk); publish(); callback(null, chunk) - } }) - await pipeline(response.body, hashing, createWriteStream(partial, { flags: 'wx', mode: 0o600 }), { signal }) - if (completedBytes !== asset.bytes || digest.digest('hex') !== asset.sha256) { - throw new Error(`Speech asset checksum or size mismatch: ${asset.name}`) + await mkdir(root, { recursive: true }) + if (await matchesAsset(destination, asset, signal)) return destination + try { + const response = await fetch(asset.url, { signal }) + source = new URL(response.url || asset.url).origin + if (!response.ok || !response.body) { + throw new SpeechDownloadError({ resource: asset.name, source, reason: 'http', status: response.status }) + } + const digest = createHash('sha256') + let completedBytes = 0 + const publish = (): void => { report({ phase: 'downloading', resource: asset.name, completedBytes, totalBytes: asset.bytes }) } + publish() + const hashing = new Transform({ transform(chunk: Buffer, _encoding, callback) { + completedBytes += chunk.length + if (completedBytes > asset.bytes) { + callback(new SpeechDownloadError({ resource: asset.name, source, reason: 'integrity' })); return + } + digest.update(chunk); publish(); callback(null, chunk) + } }) + await pipeline(response.body, hashing, createWriteStream(partial, { flags: 'wx', mode: 0o600 }), { signal }) + if (completedBytes !== asset.bytes || digest.digest('hex') !== asset.sha256) { + throw new SpeechDownloadError({ resource: asset.name, source, reason: 'integrity' }) + } + signal.throwIfAborted() + await rename(partial, destination) + return destination + } finally { + await rm(partial, { force: true }) } - signal.throwIfAborted() - await rename(partial, destination) - return destination - } finally { - await rm(partial, { force: true }) + } catch (error) { + const timedOut = timeoutOf(signal) + if (signal.aborted && !timedOut || error instanceof SpeechDownloadError) throw error + throw new SpeechDownloadError({ resource: asset.name, source, + ...timedOut ? { reason: 'timeout' } : classifyDownloadFailure(error), + }, { cause: error }) } } diff --git a/packages/experimental/speech-to-text-sensevoice/tests/download-error.spec.ts b/packages/experimental/speech-to-text-sensevoice/tests/download-error.spec.ts new file mode 100644 index 0000000000..71a24b08cb --- /dev/null +++ b/packages/experimental/speech-to-text-sensevoice/tests/download-error.spec.ts @@ -0,0 +1,25 @@ +/** Download diagnostics distinguish actionable causes without publishing raw network errors. */ +import { TimeoutReason } from '@deepseek-ai/dsh-timeout' +import { expect, it } from 'vitest' +import { classifyDownloadFailure } from '../src/download-error.ts' + +it.each([ + ['ENOTFOUND', 'dns'], ['EAI_AGAIN', 'dns'], ['ETIMEDOUT', 'timeout'], ['UND_ERR_CONNECT_TIMEOUT', 'timeout'], + ['CERT_HAS_EXPIRED', 'certificate'], ['SELF_SIGNED_CERT_IN_CHAIN', 'certificate'], + ['ENOSPC', 'storage'], ['EACCES', 'storage'], ['ECONNREFUSED', 'network'], ['UND_ERR_SOCKET', 'network'], +])('classifies nested %s as %s', (code, reason) => { + const cause = Object.assign(new Error('private details'), { code }) + expect(classifyDownloadFailure(new TypeError('fetch failed', { cause: new AggregateError([new Error('unknown'), cause]) }))) + .toEqual({ reason, code }) +}) + +it('recognizes deadlines and preserves generic classifications when a cause is unavailable', () => { + expect(classifyDownloadFailure(new TimeoutReason('SPEECH_PREPARE_TIMEOUT', 1000))).toEqual({ reason: 'timeout' }) + expect(classifyDownloadFailure(new DOMException('expired', 'TimeoutError'))).toEqual({ reason: 'timeout' }) + expect(classifyDownloadFailure(new TypeError('fetch failed'))).toEqual({ reason: 'network' }) + expect(classifyDownloadFailure(Object.assign(new Error('unknown'), { code: 'PRIVATE_DATA' }))).toEqual({ reason: 'unknown' }) + expect(classifyDownloadFailure('unknown rejection')).toEqual({ reason: 'unknown' }) + const cyclic = new Error('unknown') + cyclic.cause = cyclic + expect(classifyDownloadFailure(cyclic)).toEqual({ reason: 'unknown' }) +}) diff --git a/packages/experimental/speech-to-text-sensevoice/tests/runtime.spec.ts b/packages/experimental/speech-to-text-sensevoice/tests/runtime.spec.ts index e14c700987..1cbb5f355c 100644 --- a/packages/experimental/speech-to-text-sensevoice/tests/runtime.spec.ts +++ b/packages/experimental/speech-to-text-sensevoice/tests/runtime.spec.ts @@ -4,6 +4,7 @@ import { mkdtemp, readFile, readdir, rm, writeFile } from 'node:fs/promises' import { tmpdir } from 'node:os' import { join } from 'node:path' import { afterEach, expect, it, vi } from 'vitest' +import { TimeoutReason } from '@deepseek-ai/dsh-timeout' import { downloadAsset } from '../src/runtime.ts' const cleanup: Array<() => Promise> = [] @@ -33,17 +34,68 @@ it('publishes verified files, reuses them offline, and replaces corrupted cached it('rejects altered downloads and HTTP failures without leaving partial files', async () => { const root = await fixture() vi.stubGlobal('fetch', async () => new Response('corrupt')) - await expect(downloadAsset(asset, root, signal())).rejects.toThrow('checksum') + await expect(downloadAsset(asset, root, signal())).rejects.toMatchObject({ download: { reason: 'integrity', resource: asset.name } }) vi.stubGlobal('fetch', async () => new Response(bytes)) - await expect(downloadAsset({ ...asset, sha256: 'bad-digest' }, root, signal())).rejects.toThrow('checksum') - await expect(downloadAsset({ ...asset, bytes: 1 }, root, signal())).rejects.toThrow('pinned size') + await expect(downloadAsset({ ...asset, sha256: 'bad-digest' }, root, signal())).rejects.toMatchObject({ download: { reason: 'integrity' } }) + await expect(downloadAsset({ ...asset, bytes: 1 }, root, signal())).rejects.toMatchObject({ download: { reason: 'integrity' } }) vi.stubGlobal('fetch', async () => new Response(null, { status: 503 })) - await expect(downloadAsset(asset, root, signal())).rejects.toThrow('503') + await expect(downloadAsset(asset, root, signal())).rejects.toMatchObject({ download: { + reason: 'http', resource: asset.name, source: 'https://example.invalid', status: 503, + } }) vi.stubGlobal('fetch', async () => new Response(null, { status: 200 })) await expect(downloadAsset(asset, root, signal())).rejects.toThrow('200') expect(await readdir(root)).toEqual([]) }) +it('reports fetch causes without exposing credentials, query strings or raw cause messages', async () => { + const root = await fixture() + const cause = Object.assign(new Error('private proxy details'), { code: 'ENOTFOUND' }) + vi.stubGlobal('fetch', async () => { throw new TypeError('fetch failed', { cause }) }) + await expect(downloadAsset({ ...asset, url: 'https://user:secret@example.invalid/model?token=private' }, root, signal())) + .rejects.toMatchObject({ + message: 'Unable to prepare model.bin from https://example.invalid: dns (ENOTFOUND)', + download: { reason: 'dns', resource: 'model.bin', source: 'https://example.invalid', code: 'ENOTFOUND' }, + }) + expect(await readdir(root)).toEqual([]) +}) + +it('reports the redirected source and cleans interrupted downloads while preserving verified files for retry', async () => { + const root = await fixture() + vi.stubGlobal('fetch', async () => new Response(bytes)) + await downloadAsset(asset, root, signal()) + const other = { ...asset, name: 'tokens.txt' } + const response = new Response(new ReadableStream({ start(controller) { + controller.enqueue(bytes.subarray(0, 2)) + controller.error(Object.assign(new Error('connection closed'), { code: 'ECONNRESET' })) + } })) + Object.defineProperty(response, 'url', { value: 'https://cdn.example.invalid/model?signature=private' }) + vi.stubGlobal('fetch', async () => response) + await expect(downloadAsset(other, root, signal())).rejects.toMatchObject({ download: { + reason: 'network', source: 'https://cdn.example.invalid', code: 'ECONNRESET', resource: 'tokens.txt', + } }) + expect(await readdir(root)).toEqual(['model.bin']) + const retry = vi.fn(async () => new Response(bytes)) + vi.stubGlobal('fetch', retry) + await downloadAsset(asset, root, signal()); await downloadAsset(other, root, signal()) + expect(retry).toHaveBeenCalledOnce() + expect(await readFile(join(root, 'model.bin'))).toEqual(bytes) +}) + +it.each([false, true])('distinguishes explicit cancellation from a preparation deadline (timeout: %s)', async (timedOut) => { + const root = await fixture(), abort = new AbortController(), started = Promise.withResolvers() + const reason = timedOut ? new TimeoutReason('SPEECH_PREPARE_TIMEOUT', 1000) : new Error('user cancelled') + vi.stubGlobal('fetch', async () => await new Promise((_resolve, reject) => { + abort.signal.addEventListener('abort', () => { reject(reason) }, { once: true }) + started.resolve(undefined) + })) + const pending = downloadAsset(asset, root, abort.signal) + const rejected = timedOut ? expect(pending).rejects.toMatchObject({ download: { reason: 'timeout', resource: asset.name } }) + : expect(pending).rejects.toBe(reason) + cleanup.push(async () => { abort.abort(); await pending.catch(() => {}) }) + await started.promise; abort.abort(reason); await rejected + expect(await readdir(root)).toEqual([]) +}) + it('cancels streaming downloads and refuses invalid cache locations', async () => { const root = await fixture(), cancel = new AbortController(), reading = Promise.withResolvers() vi.stubGlobal('fetch', async () => new Response(new ReadableStream({ diff --git a/packages/experimental/speech-to-text-sensevoice/tests/worker.spec.ts b/packages/experimental/speech-to-text-sensevoice/tests/worker.spec.ts index 730256df43..bedad8ff35 100644 --- a/packages/experimental/speech-to-text-sensevoice/tests/worker.spec.ts +++ b/packages/experimental/speech-to-text-sensevoice/tests/worker.spec.ts @@ -10,6 +10,7 @@ import { afterEach, expect, it, vi } from 'vitest' import { Config } from '../src/config.ts' import { SenseVoiceWorker } from '../src/recognizer.ts' import { inspectRuntime, prepareRuntime } from '../src/runtime.ts' +import { SpeechDownloadError } from '../src/download-error.ts' vi.mock('../src/runtime.ts', () => ({ inspectRuntime: vi.fn(), prepareRuntime: vi.fn() })) const cleanup: Array<() => Promise> = [] @@ -217,6 +218,18 @@ it('recovers after a provider error or unexpected worker exit', async () => { expect((await worker.transcribe({ audio, language: 'zh' }, signal())).text).toBe('zh') }) +it('publishes safe download diagnostics and clears them after a successful retry', async () => { + const { worker } = await fixture() + const download = { resource: 'model.int8.onnx', source: 'https://mirror.example', reason: 'dns' as const, code: 'ENOTFOUND' } + vi.mocked(prepareRuntime).mockRejectedValueOnce(new SpeechDownloadError(download, { cause: new Error('private details') })) + worker.prepare() + await vi.waitFor(() => { expect(worker.snapshot()).toMatchObject({ phase: 'failed', download }) }) + expect(JSON.stringify(worker.snapshot())).not.toContain('private details') + await prepare(worker) + expect(worker.snapshot()).toMatchObject({ phase: 'ready' }) + expect(worker.snapshot()).not.toHaveProperty('download') +}) + it('applies inference deadlines and reports runtime preparation failure', async () => { const { worker } = await fixture({ inferenceTimeoutMs: 100 }) await prepare(worker) diff --git a/packages/experimental/speech-to-text/package.json b/packages/experimental/speech-to-text/package.json index 19cc4b0bde..e517471e13 100644 --- a/packages/experimental/speech-to-text/package.json +++ b/packages/experimental/speech-to-text/package.json @@ -1,7 +1,7 @@ { "name": "@deepseek-ai/dsh-experimental-speech-to-text", "description": "Experimental speech recognition with independently selectable providers", - "version": "0.1.6-alpha.2", + "version": "0.1.7-alpha.1", "publishConfig": { "access": "public" }, diff --git a/packages/experimental/speech-to-text/src/types.ts b/packages/experimental/speech-to-text/src/types.ts index 47a246a461..a7f885fd69 100644 --- a/packages/experimental/speech-to-text/src/types.ts +++ b/packages/experimental/speech-to-text/src/types.ts @@ -32,12 +32,21 @@ export interface SpeechPreparationStep { readonly startedAt?: number } +/** Safe download diagnostics for localized preparation guidance; URLs omit credentials and query strings. */ +export interface SpeechDownloadFailure { + readonly resource: string + readonly source: string + readonly reason: 'network' | 'dns' | 'timeout' | 'certificate' | 'http' | 'integrity' | 'storage' | 'unknown' + readonly code?: string + readonly status?: number +} + /** Host-owned preparation state; byte totals describe downloads, never estimated installation percentages. */ export type SpeechPreparationState = ( | { readonly phase: 'unprepared' | 'ready' | 'standby' | 'cancelled' } | { readonly phase: 'downloading'; readonly resource: string; readonly completedBytes: number; readonly totalBytes?: number } | { readonly phase: 'checking' | 'loading' | 'waking' | 'cancelling'; readonly startedAt: number } - | { readonly phase: 'failed'; readonly message: string } + | { readonly phase: 'failed'; readonly message: string; readonly download?: SpeechDownloadFailure } ) & { readonly step?: SpeechPreparationStepKind readonly steps?: readonly SpeechPreparationStep[] diff --git a/packages/experimental/tool-agent-team/package.json b/packages/experimental/tool-agent-team/package.json index f1436528f3..8878b25505 100644 --- a/packages/experimental/tool-agent-team/package.json +++ b/packages/experimental/tool-agent-team/package.json @@ -1,7 +1,7 @@ { "name": "@deepseek-ai/dsh-experimental-tool-agent-team", "description": "Scoped model-facing Agent Teams tools over ctx.agentTeams", - "version": "0.1.6-alpha.2", + "version": "0.1.7-alpha.1", "publishConfig": { "access": "public" }, diff --git a/packages/experimental/voice-input-bundle/README.i18n.yaml b/packages/experimental/voice-input-bundle/README.i18n.yaml index a97ade03fb..ddc89c0e44 100644 --- a/packages/experimental/voice-input-bundle/README.i18n.yaml +++ b/packages/experimental/voice-input-bundle/README.i18n.yaml @@ -2,5 +2,5 @@ # side as of the last confirmed-consistent state. Both languages carry equal authority; # after editing either side, bring the other along and re-record with: # pnpm run verify-translation-pairing --write packages/experimental/voice-input-bundle/README.md -README.md: 13984083581a6c574ab74cf5ef6361fcd8254119 -README.zh.md: 013ad4a0cf6edb27753fb4c1df3fb6952ea070f4 +README.md: 48320f7430bd9f1343492e49d3199c180970acad +README.zh.md: f0a5b49741966b2e139ec5f803c15ddd79d12043 diff --git a/packages/experimental/voice-input-bundle/README.md b/packages/experimental/voice-input-bundle/README.md index 1398408358..48320f7430 100644 --- a/packages/experimental/voice-input-bundle/README.md +++ b/packages/experimental/voice-input-bundle/README.md @@ -25,7 +25,7 @@ This optional bundle composes a speech Service Definition, local SenseVoice prov ## Use this package -Open Plugins in the Web sidebar and enable Voice Input. If models need preparation, a dialog offers Go to setup or Later; Go to setup opens the bundle details. Complete caches need no setup prompt. In the details, choose Download and prepare; the collapsed current-step summary expands to the complete step list. Downloads report actual bytes; verification and loading show elapsed time. Once ready, click the microphone between the model selector and Send, then Stop to insert a transcript. Bundle details store the recognizer and language through the Settings service. Disabling the bundle cancels active work; cached assets remain on disk. +Open Plugins in the Web sidebar and enable Voice Input, marked by a blue waveform icon. If models need preparation, a dialog offers Go to setup or Later; Go to setup opens the bundle details. Complete caches need no setup prompt. In the details, choose Download and prepare; the collapsed current-step summary expands to the complete step list. Downloads report actual bytes; verification and loading show elapsed time. Once ready, click the microphone between the model selector and Send, then Stop to insert a transcript. Bundle details store the recognizer and language through the Settings service. Disabling the bundle cancels active work; cached assets remain on disk. ----- diff --git a/packages/experimental/voice-input-bundle/README.zh.md b/packages/experimental/voice-input-bundle/README.zh.md index 013ad4a0cf..f0a5b49741 100644 --- a/packages/experimental/voice-input-bundle/README.zh.md +++ b/packages/experimental/voice-input-bundle/README.zh.md @@ -25,7 +25,7 @@ kind: "package-bundle" ## 使用此包 -打开 Web 侧栏的插件管理页并启用“语音输入”。模型需要准备时,弹窗提供“前往安装”和“稍后”选项;“前往安装”打开 Bundle 详情。缓存完整时不会提示安装。在详情中选择“下载并准备”;默认折叠的当前步骤摘要可展开为完整步骤列表。下载报告真实字节,校验和加载显示等待时间。就绪后点击模型选择器与发送按钮之间的麦克风,再点击停止以插入转写文字。Bundle 详情通过 Settings 服务保存识别器和语言。禁用 Bundle 会取消当前任务;缓存资源保留在磁盘上。 +打开 Web 侧栏的插件管理页并启用带蓝色声波图标的“语音输入”。模型需要准备时,弹窗提供“前往安装”和“稍后”选项;“前往安装”打开 Bundle 详情。缓存完整时不会提示安装。在详情中选择“下载并准备”;默认折叠的当前步骤摘要可展开为完整步骤列表。下载报告真实字节,校验和加载显示等待时间。就绪后点击模型选择器与发送按钮之间的麦克风,再点击停止以插入转写文字。Bundle 详情通过 Settings 服务保存识别器和语言。禁用 Bundle 会取消当前任务;缓存资源保留在磁盘上。 ----- diff --git a/packages/experimental/voice-input-bundle/icon.svg b/packages/experimental/voice-input-bundle/icon.svg new file mode 100644 index 0000000000..4dd3ef06ac --- /dev/null +++ b/packages/experimental/voice-input-bundle/icon.svg @@ -0,0 +1,9 @@ + + + + + + + + + diff --git a/packages/experimental/voice-input-bundle/package.json b/packages/experimental/voice-input-bundle/package.json index 3472418a3a..2c11f37297 100644 --- a/packages/experimental/voice-input-bundle/package.json +++ b/packages/experimental/voice-input-bundle/package.json @@ -1,7 +1,8 @@ { "name": "@deepseek-ai/dsh-experimental-voice-input-bundle", "description": "Experimental voice input with local SenseVoice; downloads its runtime on first use", - "version": "0.1.6-alpha.2", + "version": "0.1.7-alpha.1", + "icon": "./icon.svg", "publishConfig": { "access": "public" }, @@ -24,6 +25,7 @@ "./locale/*.json": "./locale/*.json" }, "files": [ + "icon.svg", "locale/*.json", "lib/index.js", "cordis.patch.yml", diff --git a/packages/experimental/webworker-packer/package.json b/packages/experimental/webworker-packer/package.json index 76ca35e75a..ceb1b1676e 100644 --- a/packages/experimental/webworker-packer/package.json +++ b/packages/experimental/webworker-packer/package.json @@ -1,7 +1,7 @@ { "name": "@deepseek-ai/dsh-experimental-webworker-packer", "description": "Build-time packer for the browser runtime's base VFS image and ordered data-overlay archives", - "version": "0.1.6-alpha.2", + "version": "0.1.7-alpha.1", "publishConfig": { "access": "public" }, diff --git a/packages/experimental/webworker-runtime/package.json b/packages/experimental/webworker-runtime/package.json index fde92fb05f..060daf31de 100644 --- a/packages/experimental/webworker-runtime/package.json +++ b/packages/experimental/webworker-runtime/package.json @@ -1,7 +1,7 @@ { "name": "@deepseek-ai/dsh-experimental-webworker-runtime", "description": "Browser-only harness runtime: in-memory VFS, module transform and loader, postMessage tunnel, and the dedicated Web Worker assembly, with the Node-compatibility layer that lets the host tree run unchanged", - "version": "0.1.6-alpha.2", + "version": "0.1.7-alpha.1", "publishConfig": { "access": "public" }, diff --git a/packages/extensions/cordis-client-runner/package.json b/packages/extensions/cordis-client-runner/package.json index f06794f87b..8bd3a99f18 100644 --- a/packages/extensions/cordis-client-runner/package.json +++ b/packages/extensions/cordis-client-runner/package.json @@ -1,7 +1,7 @@ { "name": "@deepseek-ai/dsh-cordis-client-runner", "description": "Browser half of dynamic dual-half plugin packages: event subscription, closure evaluation, guard facade, and loader entries", - "version": "0.1.6-alpha.2", + "version": "0.1.7-alpha.1", "publishConfig": { "access": "public" }, diff --git a/packages/extensions/cordis-host-runner/package.json b/packages/extensions/cordis-host-runner/package.json index 116524ec7b..5503116c1d 100644 --- a/packages/extensions/cordis-host-runner/package.json +++ b/packages/extensions/cordis-host-runner/package.json @@ -1,7 +1,7 @@ { "name": "@deepseek-ai/dsh-cordis-host-runner", "description": "Dynamic package definition registry, host-half sandbox lifecycle, and invoke handler table for model-mounted dual-half packages", - "version": "0.1.6-alpha.2", + "version": "0.1.7-alpha.1", "publishConfig": { "access": "public" }, diff --git a/packages/extensions/tool-cordis/package.json b/packages/extensions/tool-cordis/package.json index e7db558f31..cb1875f606 100644 --- a/packages/extensions/tool-cordis/package.json +++ b/packages/extensions/tool-cordis/package.json @@ -1,7 +1,7 @@ { "name": "@deepseek-ai/dsh-tool-cordis", "description": "Read-only runtime API inspection for Harness plugin development", - "version": "0.1.6-alpha.2", + "version": "0.1.7-alpha.1", "publishConfig": { "access": "public" }, diff --git a/packages/extensions/tool-cordis/src/api-catalog.ts b/packages/extensions/tool-cordis/src/api-catalog.ts index ef89008d91..70edb3e6a2 100644 --- a/packages/extensions/tool-cordis/src/api-catalog.ts +++ b/packages/extensions/tool-cordis/src/api-catalog.ts @@ -6711,6 +6711,10 @@ export const TYPE_API: readonly TypeApiEntry[] = [ name: 'SpeechCatalog', declaration: 'export interface SpeechCatalog extends SpeechSnapshot {\n readonly maxAudioBytes: number;\n readonly maxDurationSeconds: number;\n}', }, + { + name: 'SpeechDownloadFailure', + declaration: 'export interface SpeechDownloadFailure {\n readonly resource: string;\n readonly source: string;\n readonly reason: \'network\' | \'dns\' | \'timeout\' | \'certificate\' | \'http\' | \'integrity\' | \'storage\' | \'unknown\';\n readonly code?: string;\n readonly status?: number;\n}', + }, { name: 'SpeechInput', declaration: 'export interface SpeechInput {\n readonly audio: Uint8Array;\n readonly language: string;\n}', @@ -6721,7 +6725,7 @@ export const TYPE_API: readonly TypeApiEntry[] = [ }, { name: 'SpeechPreparationState', - declaration: 'export type SpeechPreparationState = ({\n readonly phase: \'unprepared\' | \'ready\' | \'standby\' | \'cancelled\';\n} | {\n readonly phase: \'downloading\';\n readonly resource: string;\n readonly completedBytes: number;\n readonly totalBytes?: number;\n} | {\n readonly phase: \'checking\' | \'loading\' | \'waking\' | \'cancelling\';\n readonly startedAt: number;\n} | {\n readonly phase: \'failed\';\n readonly message: string;\n}) & {\n readonly step?: SpeechPreparationStepKind;\n readonly steps?: readonly SpeechPreparationStep[];\n};', + declaration: 'export type SpeechPreparationState = ({\n readonly phase: \'unprepared\' | \'ready\' | \'standby\' | \'cancelled\';\n} | {\n readonly phase: \'downloading\';\n readonly resource: string;\n readonly completedBytes: number;\n readonly totalBytes?: number;\n} | {\n readonly phase: \'checking\' | \'loading\' | \'waking\' | \'cancelling\';\n readonly startedAt: number;\n} | {\n readonly phase: \'failed\';\n readonly message: string;\n readonly download?: SpeechDownloadFailure;\n}) & {\n readonly step?: SpeechPreparationStepKind;\n readonly steps?: readonly SpeechPreparationStep[];\n};', }, { name: 'SpeechPreparationStep', diff --git a/packages/extensions/ui-cordis/package.json b/packages/extensions/ui-cordis/package.json index 1772cb911d..c161f93943 100644 --- a/packages/extensions/ui-cordis/package.json +++ b/packages/extensions/ui-cordis/package.json @@ -1,7 +1,7 @@ { "name": "@deepseek-ai/dsh-client-ui-cordis", "description": "Cordis dynamic-plugin definition card: the keyed cordis_define tool row with its run/stop switch", - "version": "0.1.6-alpha.2", + "version": "0.1.7-alpha.1", "publishConfig": { "access": "public" }, diff --git a/packages/feedback/command-feedback/package.json b/packages/feedback/command-feedback/package.json index d37393c6ab..b1995415b8 100644 --- a/packages/feedback/command-feedback/package.json +++ b/packages/feedback/command-feedback/package.json @@ -1,7 +1,7 @@ { "name": "@deepseek-ai/dsh-command-feedback", "description": "Log-only session feedback: the record event, the sessionFeedback Host Remote, and the human-facing slash command", - "version": "0.1.6-alpha.2", + "version": "0.1.7-alpha.1", "publishConfig": { "access": "public" }, diff --git a/packages/feedback/message-feedback/package.json b/packages/feedback/message-feedback/package.json index dde1cebae9..106946fca5 100644 --- a/packages/feedback/message-feedback/package.json +++ b/packages/feedback/message-feedback/package.json @@ -1,7 +1,7 @@ { "name": "@deepseek-ai/dsh-message-feedback", "description": "Canonical Session-log ratings and notes for finalized assistant messages", - "version": "0.1.6-alpha.2", + "version": "0.1.7-alpha.1", "publishConfig": { "access": "public" }, diff --git a/packages/fs/fs-local/package.json b/packages/fs/fs-local/package.json index c781f81f20..8e53c16028 100644 --- a/packages/fs/fs-local/package.json +++ b/packages/fs/fs-local/package.json @@ -1,7 +1,7 @@ { "name": "@deepseek-ai/dsh-fs-local", "description": "Local-filesystem implementation of the DeepSeek Harness filesystem seam (ctx.fs)", - "version": "0.1.6-alpha.2", + "version": "0.1.7-alpha.1", "publishConfig": { "access": "public" }, diff --git a/packages/fs/fs-observation-policy/package.json b/packages/fs/fs-observation-policy/package.json index 173783e733..24efe2095b 100644 --- a/packages/fs/fs-observation-policy/package.json +++ b/packages/fs/fs-observation-policy/package.json @@ -1,7 +1,7 @@ { "name": "@deepseek-ai/dsh-fs-observation-policy", "description": "File-context policy plugin for the DeepSeek Harness — observed-state, read-before-edit, and version-guarded write/edit added over the ctx.fs provider seam through the fs/* event gate (no service API)", - "version": "0.1.6-alpha.2", + "version": "0.1.7-alpha.1", "publishConfig": { "access": "public" }, diff --git a/packages/fs/fs-sandbox/package.json b/packages/fs/fs-sandbox/package.json index 04ad3d27f4..ac8a07338d 100644 --- a/packages/fs/fs-sandbox/package.json +++ b/packages/fs/fs-sandbox/package.json @@ -1,7 +1,7 @@ { "name": "@deepseek-ai/dsh-fs-sandbox", "description": "Sandbox-enforcing implementation of the DeepSeek Harness filesystem seam: fences write/edit by the per-call sandbox mode (read-only denies mutation, workspace-write contains it to the workspace + temp roots) while reads pass through", - "version": "0.1.6-alpha.2", + "version": "0.1.7-alpha.1", "publishConfig": { "access": "public" }, diff --git a/packages/fs/fs/package.json b/packages/fs/fs/package.json index 11337dc0e9..000c94d81a 100644 --- a/packages/fs/fs/package.json +++ b/packages/fs/fs/package.json @@ -1,7 +1,7 @@ { "name": "@deepseek-ai/dsh-fs", "description": "Abstract filesystem capability seam (ctx.fs) for the DeepSeek Harness — vocabulary types, the FileSystem service (text IO + optional version-guarded atomic mutations), and the fs/* policy event vocabulary", - "version": "0.1.6-alpha.2", + "version": "0.1.7-alpha.1", "publishConfig": { "access": "public" }, diff --git a/packages/fs/tool-fs-search/package.json b/packages/fs/tool-fs-search/package.json index b00cf3a2f8..8ae76f64f5 100644 --- a/packages/fs/tool-fs-search/package.json +++ b/packages/fs/tool-fs-search/package.json @@ -1,7 +1,7 @@ { "name": "@deepseek-ai/dsh-tool-fs-search", "description": "Model-facing filesystem discovery tools (glob, grep) backed by the packaged ripgrep binary (@vscode/ripgrep)", - "version": "0.1.6-alpha.2", + "version": "0.1.7-alpha.1", "publishConfig": { "access": "public" }, diff --git a/packages/fs/tool-fs/package.json b/packages/fs/tool-fs/package.json index 4f0e9a11a6..56c0cda123 100644 --- a/packages/fs/tool-fs/package.json +++ b/packages/fs/tool-fs/package.json @@ -1,7 +1,7 @@ { "name": "@deepseek-ai/dsh-tool-fs", "description": "Model-facing filesystem tools (read, write, edit) over the DeepSeek Harness filesystem seam (ctx.fs)", - "version": "0.1.6-alpha.2", + "version": "0.1.7-alpha.1", "publishConfig": { "access": "public" }, diff --git a/packages/fs/tool-str-replace-editor/package.json b/packages/fs/tool-str-replace-editor/package.json index da5a7bc917..29031060a8 100644 --- a/packages/fs/tool-str-replace-editor/package.json +++ b/packages/fs/tool-str-replace-editor/package.json @@ -1,7 +1,7 @@ { "name": "@deepseek-ai/dsh-tool-str-replace-editor", "description": "Model-facing view, create, literal replace, and line insert tool over the Harness filesystem service", - "version": "0.1.6-alpha.2", + "version": "0.1.7-alpha.1", "publishConfig": { "access": "public" }, diff --git a/packages/goal/command-goal/package.json b/packages/goal/command-goal/package.json index a3edea6e33..2f93584227 100644 --- a/packages/goal/command-goal/package.json +++ b/packages/goal/command-goal/package.json @@ -1,7 +1,7 @@ { "name": "@deepseek-ai/dsh-command-goal", "description": "Human-facing slash command for persisted same-session goals", - "version": "0.1.6-alpha.2", + "version": "0.1.7-alpha.1", "publishConfig": { "access": "public" }, diff --git a/packages/goal/goal-round-driver/package.json b/packages/goal/goal-round-driver/package.json index dbe8e6d44a..c6e47d27a7 100644 --- a/packages/goal/goal-round-driver/package.json +++ b/packages/goal/goal-round-driver/package.json @@ -1,7 +1,7 @@ { "name": "@deepseek-ai/dsh-goal-round-driver", "description": "Race-fenced same-session goal-round driver", - "version": "0.1.6-alpha.2", + "version": "0.1.7-alpha.1", "publishConfig": { "access": "public" }, diff --git a/packages/goal/goal/package.json b/packages/goal/goal/package.json index b5f225b6ab..618856b551 100644 --- a/packages/goal/goal/package.json +++ b/packages/goal/goal/package.json @@ -1,7 +1,7 @@ { "name": "@deepseek-ai/dsh-goal", "description": "Event-sourced same-session goal state and lifecycle service for the DeepSeek Harness", - "version": "0.1.6-alpha.2", + "version": "0.1.7-alpha.1", "publishConfig": { "access": "public" }, diff --git a/packages/goal/tool-goal/package.json b/packages/goal/tool-goal/package.json index 5ca8ef1f1d..bf2fcbe3b2 100644 --- a/packages/goal/tool-goal/package.json +++ b/packages/goal/tool-goal/package.json @@ -1,7 +1,7 @@ { "name": "@deepseek-ai/dsh-tool-goal", "description": "Model-facing same-session goal tools with execution-time authority checks", - "version": "0.1.6-alpha.2", + "version": "0.1.7-alpha.1", "publishConfig": { "access": "public" }, diff --git a/packages/guard/repeat-tool-reminder/package.json b/packages/guard/repeat-tool-reminder/package.json index 9152cc7c5c..086c8ccd7f 100644 --- a/packages/guard/repeat-tool-reminder/package.json +++ b/packages/guard/repeat-tool-reminder/package.json @@ -1,7 +1,7 @@ { "name": "@deepseek-ai/dsh-repeat-tool-reminder", "description": "Repeat-tool-call guard plugin: advisory reminders when an agent loops on identical tool calls", - "version": "0.1.6-alpha.2", + "version": "0.1.7-alpha.1", "publishConfig": { "access": "public" }, diff --git a/packages/guard/timeout-policy/package.json b/packages/guard/timeout-policy/package.json index c4c80f8980..d50a9fc65a 100644 --- a/packages/guard/timeout-policy/package.json +++ b/packages/guard/timeout-policy/package.json @@ -1,7 +1,7 @@ { "name": "@deepseek-ai/dsh-tool-call-timeout-policy", "description": "Tool-call timeout policy: a tools/execute wrapper that arms a per-tool deadline on exec.signal and returns TOOL_TIMEOUT when it wins", - "version": "0.1.6-alpha.2", + "version": "0.1.7-alpha.1", "publishConfig": { "access": "public" }, diff --git a/packages/hooks/hook-protocol/package.json b/packages/hooks/hook-protocol/package.json index 46bc9cc918..578b5d2e98 100644 --- a/packages/hooks/hook-protocol/package.json +++ b/packages/hooks/hook-protocol/package.json @@ -1,7 +1,7 @@ { "name": "@deepseek-ai/dsh-hook-protocol", "description": "Shared Claude Code / Codex hook wire protocol: matcher engine, stdin/exit-code/stdout codec, multi-hook merge, and hook/* session events", - "version": "0.1.6-alpha.2", + "version": "0.1.7-alpha.1", "publishConfig": { "access": "public" }, diff --git a/packages/hooks/hooks-claude-code/package.json b/packages/hooks/hooks-claude-code/package.json index 27e70f15da..7d9aa1f78c 100644 --- a/packages/hooks/hooks-claude-code/package.json +++ b/packages/hooks/hooks-claude-code/package.json @@ -1,7 +1,7 @@ { "name": "@deepseek-ai/dsh-hooks-claude-code", "description": "Bridge plugin: run a Claude Code hooks.json / settings hook config on the DeepSeek Harness interception seams", - "version": "0.1.6-alpha.2", + "version": "0.1.7-alpha.1", "publishConfig": { "access": "public" }, diff --git a/packages/hooks/hooks-codex/package.json b/packages/hooks/hooks-codex/package.json index 9be8d766c0..c517e8f4b3 100644 --- a/packages/hooks/hooks-codex/package.json +++ b/packages/hooks/hooks-codex/package.json @@ -1,7 +1,7 @@ { "name": "@deepseek-ai/dsh-hooks-codex", "description": "Bridge plugin: run a Codex hooks.json hook config on the DeepSeek Harness interception seams", - "version": "0.1.6-alpha.2", + "version": "0.1.7-alpha.1", "publishConfig": { "access": "public" }, diff --git a/packages/host/directory-picker-auto/package.json b/packages/host/directory-picker-auto/package.json index 3f07279979..7ca27050c3 100644 --- a/packages/host/directory-picker-auto/package.json +++ b/packages/host/directory-picker-auto/package.json @@ -1,7 +1,7 @@ { "name": "@deepseek-ai/dsh-host-directory-picker-auto", "description": "Adaptive chooser of the directory-picker seam: resolves the host situation at boot and mounts the native or browse backend for the DeepSeek Harness web GUI host", - "version": "0.1.6-alpha.2", + "version": "0.1.7-alpha.1", "publishConfig": { "access": "public" }, diff --git a/packages/host/directory-picker-browse/package.json b/packages/host/directory-picker-browse/package.json index f8dc068d26..2d1f70a67b 100644 --- a/packages/host/directory-picker-browse/package.json +++ b/packages/host/directory-picker-browse/package.json @@ -1,7 +1,7 @@ { "name": "@deepseek-ai/dsh-host-directory-picker-browse", "description": "In-app browsing backend of the directory-picker seam (listing/creation primitives over the host filesystem)", - "version": "0.1.6-alpha.2", + "version": "0.1.7-alpha.1", "publishConfig": { "access": "public" }, diff --git a/packages/host/directory-picker-native/package.json b/packages/host/directory-picker-native/package.json index 51d5967648..909bcadec2 100644 --- a/packages/host/directory-picker-native/package.json +++ b/packages/host/directory-picker-native/package.json @@ -1,7 +1,7 @@ { "name": "@deepseek-ai/dsh-host-directory-picker-native", "description": "Native-OS-chooser backend of the directory-picker seam for the DeepSeek Harness web GUI host", - "version": "0.1.6-alpha.2", + "version": "0.1.7-alpha.1", "publishConfig": { "access": "public" }, diff --git a/packages/host/directory-picker/package.json b/packages/host/directory-picker/package.json index d7f3c45eb0..6ef0b99e7b 100644 --- a/packages/host/directory-picker/package.json +++ b/packages/host/directory-picker/package.json @@ -1,7 +1,7 @@ { "name": "@deepseek-ai/dsh-host-directory-picker", "description": "Abstract workspace-directory picking seam (ctx.directoryPicker) for the DeepSeek Harness web GUI host", - "version": "0.1.6-alpha.2", + "version": "0.1.7-alpha.1", "publishConfig": { "access": "public" }, diff --git a/packages/host/frontend-static/package.json b/packages/host/frontend-static/package.json index 2f507c4e45..9263fd96dc 100644 --- a/packages/host/frontend-static/package.json +++ b/packages/host/frontend-static/package.json @@ -1,7 +1,7 @@ { "name": "@deepseek-ai/dsh-host-frontend-static", "description": "SPA dist server for the Web shell: owns the webserver fallback seat, serving explicit index entries and static assets with traversal rejection and 404 misses", - "version": "0.1.6-alpha.2", + "version": "0.1.7-alpha.1", "publishConfig": { "access": "public" }, diff --git a/packages/host/open-in-app/package.json b/packages/host/open-in-app/package.json index 0a31a29205..928da709c3 100644 --- a/packages/host/open-in-app/package.json +++ b/packages/host/open-in-app/package.json @@ -1,7 +1,7 @@ { "name": "@deepseek-ai/dsh-host-open-in-app", "description": "Host half of open-in-app: resolved application catalog, icons, and the launch endpoint as three webServer routes", - "version": "0.1.6-alpha.2", + "version": "0.1.7-alpha.1", "publishConfig": { "access": "public" }, diff --git a/packages/host/plugin-inventory/package.json b/packages/host/plugin-inventory/package.json index f618d47924..7be45cdd39 100644 --- a/packages/host/plugin-inventory/package.json +++ b/packages/host/plugin-inventory/package.json @@ -1,7 +1,7 @@ { "name": "@deepseek-ai/dsh-host-plugin-inventory", "description": "Read-only Remote projection of current Cordis Loader plugin state", - "version": "0.1.6-alpha.2", + "version": "0.1.7-alpha.1", "publishConfig": { "access": "public" }, diff --git a/packages/host/product-telemetry-otel/package.json b/packages/host/product-telemetry-otel/package.json index 2bcdeb691b..1fe09a1061 100644 --- a/packages/host/product-telemetry-otel/package.json +++ b/packages/host/product-telemetry-otel/package.json @@ -1,7 +1,7 @@ { "name": "@deepseek-ai/dsh-host-product-telemetry-otel", "description": "Explicit product usage events exported through OpenTelemetry HTTP logs", - "version": "0.1.6-alpha.2", + "version": "0.1.7-alpha.1", "publishConfig": { "access": "public" }, diff --git a/packages/host/webserver/package.json b/packages/host/webserver/package.json index 16a3d87d84..bcf79225bd 100644 --- a/packages/host/webserver/package.json +++ b/packages/host/webserver/package.json @@ -1,7 +1,7 @@ { "name": "@deepseek-ai/dsh-host-webserver", "description": "Web route-registration plugin: HTTP and upgrade routes, index transform taps, and static dist fallback; knows no harness concepts", - "version": "0.1.6-alpha.2", + "version": "0.1.7-alpha.1", "publishConfig": { "access": "public" }, diff --git a/packages/identity/anonymous-user-id/package.json b/packages/identity/anonymous-user-id/package.json index 282be9dd70..157318f4b7 100644 --- a/packages/identity/anonymous-user-id/package.json +++ b/packages/identity/anonymous-user-id/package.json @@ -1,7 +1,7 @@ { "name": "@deepseek-ai/dsh-anonymous-user-id", "description": "Shared anonymous user identity for DeepSeek Harness telemetry and feedback correlation", - "version": "0.1.6-alpha.2", + "version": "0.1.7-alpha.1", "publishConfig": { "access": "public" }, diff --git a/packages/interaction/commands/package.json b/packages/interaction/commands/package.json index 8a41dc35bf..ac7dc28609 100644 --- a/packages/interaction/commands/package.json +++ b/packages/interaction/commands/package.json @@ -1,7 +1,7 @@ { "name": "@deepseek-ai/dsh-commands", "description": "Plugin-owned human command registry for DeepSeek Harness UIs", - "version": "0.1.6-alpha.2", + "version": "0.1.7-alpha.1", "publishConfig": { "access": "public" }, diff --git a/packages/interaction/permission-presets/package.json b/packages/interaction/permission-presets/package.json index 6de1320cbc..e64ddaf2ee 100644 --- a/packages/interaction/permission-presets/package.json +++ b/packages/interaction/permission-presets/package.json @@ -1,7 +1,7 @@ { "name": "@deepseek-ai/dsh-permission-presets", "description": "User-facing permission presets (ctx.permissionPresets) for the DeepSeek Harness: one product-level Permissions select bundling the sandbox-mode and approval-policy knobs, written through to their own session events", - "version": "0.1.6-alpha.2", + "version": "0.1.7-alpha.1", "publishConfig": { "access": "public" }, diff --git a/packages/interaction/tool-ask-user/package.json b/packages/interaction/tool-ask-user/package.json index d4f94242c8..afa6fa7b61 100644 --- a/packages/interaction/tool-ask-user/package.json +++ b/packages/interaction/tool-ask-user/package.json @@ -1,7 +1,7 @@ { "name": "@deepseek-ai/dsh-tool-ask-user", "description": "Model-facing ask_user_question tool over the ctx.userQuestions seam", - "version": "0.1.6-alpha.2", + "version": "0.1.7-alpha.1", "publishConfig": { "access": "public" }, diff --git a/packages/interaction/user-approval/package.json b/packages/interaction/user-approval/package.json index d0f4f32215..ff1ff26931 100644 --- a/packages/interaction/user-approval/package.json +++ b/packages/interaction/user-approval/package.json @@ -1,7 +1,7 @@ { "name": "@deepseek-ai/dsh-user-approval", "description": "User-approval seam (ctx.approval) for the DeepSeek Harness: one-shot permission decisions dispatched to composed answerers over the approval/request waterfall, fail-closed by default", - "version": "0.1.6-alpha.2", + "version": "0.1.7-alpha.1", "publishConfig": { "access": "public" }, diff --git a/packages/interaction/user-questions/package.json b/packages/interaction/user-questions/package.json index 2a2b782740..26f7cf5eb0 100644 --- a/packages/interaction/user-questions/package.json +++ b/packages/interaction/user-questions/package.json @@ -1,7 +1,7 @@ { "name": "@deepseek-ai/dsh-user-questions", "description": "Abstract user-questions seam (ctx.userQuestions) for asking the human during agent runs", - "version": "0.1.6-alpha.2", + "version": "0.1.7-alpha.1", "publishConfig": { "access": "public" }, diff --git a/packages/jobs/jobs-local/package.json b/packages/jobs/jobs-local/package.json index 7251a74a48..05c79b691a 100644 --- a/packages/jobs/jobs-local/package.json +++ b/packages/jobs/jobs-local/package.json @@ -1,7 +1,7 @@ { "name": "@deepseek-ai/dsh-jobs-local", "description": "Process-local implementation of the DeepSeek Harness background job registry seam", - "version": "0.1.6-alpha.2", + "version": "0.1.7-alpha.1", "publishConfig": { "access": "public" }, diff --git a/packages/jobs/jobs/package.json b/packages/jobs/jobs/package.json index 6a2e3e92a2..fe9229b664 100644 --- a/packages/jobs/jobs/package.json +++ b/packages/jobs/jobs/package.json @@ -1,7 +1,7 @@ { "name": "@deepseek-ai/dsh-jobs", "description": "Background job registry (ctx.jobs) for the DeepSeek Harness — shared ids, owner isolation, polling, cancellation, and completion listeners for long-running tool work", - "version": "0.1.6-alpha.2", + "version": "0.1.7-alpha.1", "publishConfig": { "access": "public" }, diff --git a/packages/jobs/tool-jobs/package.json b/packages/jobs/tool-jobs/package.json index 95ad16b3d4..e00765bbdc 100644 --- a/packages/jobs/tool-jobs/package.json +++ b/packages/jobs/tool-jobs/package.json @@ -1,7 +1,7 @@ { "name": "@deepseek-ai/dsh-tool-jobs", "description": "Model-facing background job control tools (job_output, job_list, job_kill) over the ctx.jobs registry", - "version": "0.1.6-alpha.2", + "version": "0.1.7-alpha.1", "publishConfig": { "access": "public" }, diff --git a/packages/llm/deepseek-llm-api-extensions/package.json b/packages/llm/deepseek-llm-api-extensions/package.json index fc4c9fa621..d5b27e916f 100644 --- a/packages/llm/deepseek-llm-api-extensions/package.json +++ b/packages/llm/deepseek-llm-api-extensions/package.json @@ -1,7 +1,7 @@ { "name": "@deepseek-ai/dsh-deepseek-llm-api-extensions", "description": "Additive request-field registry for the official DeepSeek LLM API adapter", - "version": "0.1.6-alpha.2", + "version": "0.1.7-alpha.1", "publishConfig": { "access": "public" }, diff --git a/packages/llm/llm-deepseek/package.json b/packages/llm/llm-deepseek/package.json index 7d90f57c92..10f7451c0a 100644 --- a/packages/llm/llm-deepseek/package.json +++ b/packages/llm/llm-deepseek/package.json @@ -1,7 +1,7 @@ { "name": "@deepseek-ai/dsh-llm-deepseek", "description": "DeepSeek Messages adapter", - "version": "0.1.6-alpha.2", + "version": "0.1.7-alpha.1", "publishConfig": { "access": "public" }, diff --git a/packages/llm/llm-pi-ai/package.json b/packages/llm/llm-pi-ai/package.json index 937a44838e..15ce066afa 100644 --- a/packages/llm/llm-pi-ai/package.json +++ b/packages/llm/llm-pi-ai/package.json @@ -1,7 +1,7 @@ { "name": "@deepseek-ai/dsh-llm-pi-ai", "description": "pi-ai-backed DeepSeek adapter for the DeepSeek Harness LLM seam (design-verification twin of dsh-llm-deepseek)", - "version": "0.1.6-alpha.2", + "version": "0.1.7-alpha.1", "publishConfig": { "access": "public" }, diff --git a/packages/llm/llm-retry/package.json b/packages/llm/llm-retry/package.json index 7000164d80..639c9bcaf1 100644 --- a/packages/llm/llm-retry/package.json +++ b/packages/llm/llm-retry/package.json @@ -1,7 +1,7 @@ { "name": "@deepseek-ai/dsh-llm-retry", "description": "Provider-routed LLM request retry policy for the DeepSeek Harness", - "version": "0.1.6-alpha.2", + "version": "0.1.7-alpha.1", "publishConfig": { "access": "public" }, diff --git a/packages/llm/llm/package.json b/packages/llm/llm/package.json index 7f88e79256..e4d5b7aa86 100644 --- a/packages/llm/llm/package.json +++ b/packages/llm/llm/package.json @@ -1,7 +1,7 @@ { "name": "@deepseek-ai/dsh-llm", "description": "Provider-neutral LLM service interface for the DeepSeek Harness", - "version": "0.1.6-alpha.2", + "version": "0.1.7-alpha.1", "publishConfig": { "access": "public" }, diff --git a/packages/llm/plugin-package-inventory-deepseek/package.json b/packages/llm/plugin-package-inventory-deepseek/package.json index 8be9721018..d9303dfb9b 100644 --- a/packages/llm/plugin-package-inventory-deepseek/package.json +++ b/packages/llm/plugin-package-inventory-deepseek/package.json @@ -1,7 +1,7 @@ { "name": "@deepseek-ai/dsh-plugin-package-inventory-deepseek", "description": "Active Loader-backed plugin package inventory for official DeepSeek LLM API requests", - "version": "0.1.6-alpha.2", + "version": "0.1.7-alpha.1", "publishConfig": { "access": "public" }, diff --git a/packages/llm/token-meter/package.json b/packages/llm/token-meter/package.json index 4eeaf55e34..b721369092 100644 --- a/packages/llm/token-meter/package.json +++ b/packages/llm/token-meter/package.json @@ -1,7 +1,7 @@ { "name": "@deepseek-ai/dsh-token-meter", "description": "Replay-aware token measurement service (ctx.tokenMeter) for the DeepSeek Harness", - "version": "0.1.6-alpha.2", + "version": "0.1.7-alpha.1", "publishConfig": { "access": "public" }, diff --git a/packages/lsp/lsp-stdio/package.json b/packages/lsp/lsp-stdio/package.json index 4a79a07dbb..be9f4655e6 100644 --- a/packages/lsp/lsp-stdio/package.json +++ b/packages/lsp/lsp-stdio/package.json @@ -1,7 +1,7 @@ { "name": "@deepseek-ai/dsh-lsp-stdio", "description": "Generic stdio language-server provider for the DeepSeek Harness LSP capability seam (ctx.lsp) — spawns configured servers, translates JSON-RPC, and serves transient-open goToDefinition/findReferences/goToImplementation/hover queries in the host filesystem namespace", - "version": "0.1.6-alpha.2", + "version": "0.1.7-alpha.1", "publishConfig": { "access": "public" }, diff --git a/packages/lsp/lsp/package.json b/packages/lsp/lsp/package.json index 93ac2a883c..676582a86c 100644 --- a/packages/lsp/lsp/package.json +++ b/packages/lsp/lsp/package.json @@ -1,7 +1,7 @@ { "name": "@deepseek-ai/dsh-lsp", "description": "Abstract LSP capability seam (ctx.lsp) for the DeepSeek Harness — language-server provider registry keyed by branded id and extension mapping, order-independent per-query selection, normalized definition/references/implementation/hover requests and results, and the LspError taxonomy", - "version": "0.1.6-alpha.2", + "version": "0.1.7-alpha.1", "publishConfig": { "access": "public" }, diff --git a/packages/lsp/tool-lsp/package.json b/packages/lsp/tool-lsp/package.json index ea2a3049cf..5cb0eddcbe 100644 --- a/packages/lsp/tool-lsp/package.json +++ b/packages/lsp/tool-lsp/package.json @@ -1,7 +1,7 @@ { "name": "@deepseek-ai/dsh-tool-lsp", "description": "Model-facing lsp tool over the DeepSeek Harness LSP capability seam (ctx.lsp) — one read-only tool with goToDefinition/findReferences/goToImplementation/hover operations, one-based UTF-16 cursor coordinates, bounded location rendering, and hover normalization", - "version": "0.1.6-alpha.2", + "version": "0.1.7-alpha.1", "publishConfig": { "access": "public" }, diff --git a/packages/mcp/mcp-client/package.json b/packages/mcp/mcp-client/package.json index 4e4c4f7b57..28fc45a965 100644 --- a/packages/mcp/mcp-client/package.json +++ b/packages/mcp/mcp-client/package.json @@ -1,7 +1,7 @@ { "name": "@deepseek-ai/dsh-mcp-client", "description": "MCP client bridge: connects to MCP servers and registers their tools on ctx.tools", - "version": "0.1.6-alpha.2", + "version": "0.1.7-alpha.1", "publishConfig": { "access": "public" }, diff --git a/packages/mcp/mcp-resources/package.json b/packages/mcp/mcp-resources/package.json index 032b5dc914..aae011e7a0 100644 --- a/packages/mcp/mcp-resources/package.json +++ b/packages/mcp/mcp-resources/package.json @@ -1,7 +1,7 @@ { "name": "@deepseek-ai/dsh-mcp-resources", "description": "Scoped MCP resource discovery and reading through shared model tools", - "version": "0.1.6-alpha.2", + "version": "0.1.7-alpha.1", "publishConfig": { "access": "public" }, diff --git a/packages/plan/plan-mode/package.json b/packages/plan/plan-mode/package.json index 48fb15031a..57909fa81d 100644 --- a/packages/plan/plan-mode/package.json +++ b/packages/plan/plan-mode/package.json @@ -1,7 +1,7 @@ { "name": "@deepseek-ai/dsh-plan-mode", "description": "Logged per-agent plan mode with deployment guidance, a direct slash command, and a user-reviewed exit", - "version": "0.1.6-alpha.2", + "version": "0.1.7-alpha.1", "publishConfig": { "access": "public" }, diff --git a/packages/preset/agent-preset-registry/package.json b/packages/preset/agent-preset-registry/package.json index 71b0d8865a..437f8156c6 100644 --- a/packages/preset/agent-preset-registry/package.json +++ b/packages/preset/agent-preset-registry/package.json @@ -1,7 +1,7 @@ { "name": "@deepseek-ai/dsh-agent-preset-registry", "description": "Declarative Agent preset registry and profile-backed editing", - "version": "0.1.6-alpha.2", + "version": "0.1.7-alpha.1", "publishConfig": { "access": "public" }, diff --git a/packages/preset/agent-preset/package.json b/packages/preset/agent-preset/package.json index 1009a1001b..f738797bba 100644 --- a/packages/preset/agent-preset/package.json +++ b/packages/preset/agent-preset/package.json @@ -1,7 +1,7 @@ { "name": "@deepseek-ai/dsh-agent-preset", "description": "Declare an Agent capability composition in Cordis YAML", - "version": "0.1.6-alpha.2", + "version": "0.1.7-alpha.1", "publishConfig": { "access": "public" }, diff --git a/packages/preset/persona/package.json b/packages/preset/persona/package.json index e6f2d3feb4..ee2bf4e835 100644 --- a/packages/preset/persona/package.json +++ b/packages/preset/persona/package.json @@ -1,7 +1,7 @@ { "name": "@deepseek-ai/dsh-persona", "description": "Composition-authored deployment persona section for the DeepSeek Harness", - "version": "0.1.6-alpha.2", + "version": "0.1.7-alpha.1", "publishConfig": { "access": "public" }, diff --git a/packages/ptc-runtime/ptc-runtime-node/package.json b/packages/ptc-runtime/ptc-runtime-node/package.json index c91f4afa2c..2c63093030 100644 --- a/packages/ptc-runtime/ptc-runtime-node/package.json +++ b/packages/ptc-runtime/ptc-runtime-node/package.json @@ -1,7 +1,7 @@ { "name": "@deepseek-ai/dsh-ptc-runtime-node", "description": "Sandboxed Node process implementation of the DeepSeek Harness PTC execution capability", - "version": "0.1.6-alpha.2", + "version": "0.1.7-alpha.1", "publishConfig": { "access": "public" }, diff --git a/packages/ptc-runtime/ptc-runtime/package.json b/packages/ptc-runtime/ptc-runtime/package.json index 183d61d88c..ce16281c34 100644 --- a/packages/ptc-runtime/ptc-runtime/package.json +++ b/packages/ptc-runtime/ptc-runtime/package.json @@ -1,7 +1,7 @@ { "name": "@deepseek-ai/dsh-ptc-runtime", "description": "Abstract PTC execution seam (ctx.ptcRuntime) for the DeepSeek Harness", - "version": "0.1.6-alpha.2", + "version": "0.1.7-alpha.1", "publishConfig": { "access": "public" }, diff --git a/packages/runtime-diagnostics/invariants/package.json b/packages/runtime-diagnostics/invariants/package.json index ba1af4b231..4cb33c7d25 100644 --- a/packages/runtime-diagnostics/invariants/package.json +++ b/packages/runtime-diagnostics/invariants/package.json @@ -1,7 +1,7 @@ { "name": "@deepseek-ai/dsh-invariants", "description": "Registry service for package-owned DeepSeek Harness runtime invariants", - "version": "0.1.6-alpha.2", + "version": "0.1.7-alpha.1", "publishConfig": { "access": "public" }, diff --git a/packages/sandbox/sandbox-local/package.json b/packages/sandbox/sandbox-local/package.json index 863cb4185f..cdf84a9e33 100644 --- a/packages/sandbox/sandbox-local/package.json +++ b/packages/sandbox/sandbox-local/package.json @@ -1,7 +1,7 @@ { "name": "@deepseek-ai/dsh-sandbox-local", "description": "Local process-sandbox backends for the DeepSeek Harness sandbox seam: bwrap, the npm-distributed landlock-run launcher, macOS Seatbelt, or the Windows ACL restricted-token runner — functionally probed, fail-closed", - "version": "0.1.6-alpha.2", + "version": "0.1.7-alpha.1", "publishConfig": { "access": "public" }, diff --git a/packages/sandbox/sandbox-policy/package.json b/packages/sandbox/sandbox-policy/package.json index 5f02de815f..354b83966d 100644 --- a/packages/sandbox/sandbox-policy/package.json +++ b/packages/sandbox/sandbox-policy/package.json @@ -1,7 +1,7 @@ { "name": "@deepseek-ai/dsh-sandbox-policy", "description": "Per-call sandbox policy resolver and current model context: deployment fallbacks plus each session's mode and workspace root, shared by every enforcing capability family", - "version": "0.1.6-alpha.2", + "version": "0.1.7-alpha.1", "publishConfig": { "access": "public" }, diff --git a/packages/sandbox/sandbox-windows-acl/package.json b/packages/sandbox/sandbox-windows-acl/package.json index 05fa2c64f0..1d5ceb80cc 100644 --- a/packages/sandbox/sandbox-windows-acl/package.json +++ b/packages/sandbox/sandbox-windows-acl/package.json @@ -1,7 +1,7 @@ { "name": "@deepseek-ai/dsh-sandbox-windows-acl", "description": "Windows ACL write-restriction sandbox backend (restricted-token spawn with capability-SID write allowlist) for the DeepSeek Harness sandbox seam", - "version": "0.1.6-alpha.2", + "version": "0.1.7-alpha.1", "publishConfig": { "access": "public" }, diff --git a/packages/sandbox/sandbox/package.json b/packages/sandbox/sandbox/package.json index 2894459359..f2224705c6 100644 --- a/packages/sandbox/sandbox/package.json +++ b/packages/sandbox/sandbox/package.json @@ -1,7 +1,7 @@ { "name": "@deepseek-ai/dsh-sandbox", "description": "Abstract process-sandbox seam (ctx.sandbox) for the DeepSeek Harness: same-world confinement vocabulary and the SandboxProvider contract", - "version": "0.1.6-alpha.2", + "version": "0.1.7-alpha.1", "publishConfig": { "access": "public" }, diff --git a/packages/schedule/schedule/package.json b/packages/schedule/schedule/package.json index 65f4956e15..3c74ff0fe0 100644 --- a/packages/schedule/schedule/package.json +++ b/packages/schedule/schedule/package.json @@ -1,7 +1,7 @@ { "name": "@deepseek-ai/dsh-schedule", "description": "Agent-scoped durable after, at, and fixed-rate reminders over the session event log", - "version": "0.1.6-alpha.2", + "version": "0.1.7-alpha.1", "publishConfig": { "access": "public" }, diff --git a/packages/sdk/client/package.json b/packages/sdk/client/package.json index 7601ebaf37..e7bf253781 100644 --- a/packages/sdk/client/package.json +++ b/packages/sdk/client/package.json @@ -1,7 +1,7 @@ { "name": "@deepseek-ai/dsh-sdk-client", "description": "TypeScript client SDK for driving a DeepSeek Harness runtime subprocess over stdio JSON-RPC: the DeepSeekHarness high-level turns API and the lower-level HarnessClient", - "version": "0.1.6-alpha.2", + "version": "0.1.7-alpha.1", "publishConfig": { "access": "public" }, diff --git a/packages/sdk/protocol/package.json b/packages/sdk/protocol/package.json index ea91db882a..df75c81272 100644 --- a/packages/sdk/protocol/package.json +++ b/packages/sdk/protocol/package.json @@ -1,7 +1,7 @@ { "name": "@deepseek-ai/dsh-sdk-protocol", "description": "Shared wire protocol for the DeepSeek Harness SDK runtime: the newline-delimited JSON-RPC stdio transport and the named request, result, and notification types spoken between the runtime server and SDK clients", - "version": "0.1.6-alpha.2", + "version": "0.1.7-alpha.1", "publishConfig": { "access": "public" }, diff --git a/packages/sdk/server/package.json b/packages/sdk/server/package.json index 3670aea92a..871c8d28f5 100644 --- a/packages/sdk/server/package.json +++ b/packages/sdk/server/package.json @@ -1,7 +1,7 @@ { "name": "@deepseek-ai/dsh-sdk-jsonrpc-server", "description": "Stdio JSON-RPC server plugin for out-of-process DeepSeek Harness SDK clients", - "version": "0.1.6-alpha.2", + "version": "0.1.7-alpha.1", "publishConfig": { "access": "public" }, diff --git a/packages/session-query/session-log-export/package.json b/packages/session-query/session-log-export/package.json index 7e3a26f866..d0a809e3ea 100644 --- a/packages/session-query/session-log-export/package.json +++ b/packages/session-query/session-log-export/package.json @@ -1,7 +1,7 @@ { "name": "@deepseek-ai/dsh-session-log-export", "description": "Web Session-log export command and shared download dialog", - "version": "0.1.6-alpha.2", + "version": "0.1.7-alpha.1", "publishConfig": { "access": "public" }, diff --git a/packages/session-query/session-query-sqlite/package.json b/packages/session-query/session-query-sqlite/package.json index aec1841aed..c498223650 100644 --- a/packages/session-query/session-query-sqlite/package.json +++ b/packages/session-query/session-query-sqlite/package.json @@ -1,7 +1,7 @@ { "name": "@deepseek-ai/dsh-session-query-sqlite", "description": "Concrete ctx.sessionQuery backend with SQLite FTS5 search", - "version": "0.1.6-alpha.2", + "version": "0.1.7-alpha.1", "publishConfig": { "access": "public" }, diff --git a/packages/session-query/session-query/package.json b/packages/session-query/session-query/package.json index a8e4b8e25b..d8e849eb97 100644 --- a/packages/session-query/session-query/package.json +++ b/packages/session-query/session-query/package.json @@ -1,7 +1,7 @@ { "name": "@deepseek-ai/dsh-session-query", "description": "Combined session query service contract with concrete reads, traces, and filters", - "version": "0.1.6-alpha.2", + "version": "0.1.7-alpha.1", "publishConfig": { "access": "public" }, diff --git a/packages/session-query/tool-session-query/package.json b/packages/session-query/tool-session-query/package.json index eb993e0c9f..243301c16b 100644 --- a/packages/session-query/tool-session-query/package.json +++ b/packages/session-query/tool-session-query/package.json @@ -1,7 +1,7 @@ { "name": "@deepseek-ai/dsh-tool-session-query", "description": "Workspace-authorized model-facing session history search, trace, and event read tools", - "version": "0.1.6-alpha.2", + "version": "0.1.7-alpha.1", "publishConfig": { "access": "public" }, diff --git a/packages/session/session-checkpoint-policy/package.json b/packages/session/session-checkpoint-policy/package.json index 5b69e39bcf..5291298dfb 100644 --- a/packages/session/session-checkpoint-policy/package.json +++ b/packages/session/session-checkpoint-policy/package.json @@ -1,7 +1,7 @@ { "name": "@deepseek-ai/dsh-session-checkpoint-policy", "description": "Semantic session durability checkpoints before model requests and tool side effects", - "version": "0.1.6-alpha.2", + "version": "0.1.7-alpha.1", "publishConfig": { "access": "public" }, diff --git a/packages/session/session-format-catalog/package.json b/packages/session/session-format-catalog/package.json index 5009d93f6d..579e622fc4 100644 --- a/packages/session/session-format-catalog/package.json +++ b/packages/session/session-format-catalog/package.json @@ -1,7 +1,7 @@ { "name": "@deepseek-ai/dsh-session-format-catalog", "description": "Build-static first-party Session format codec and migration catalog", - "version": "0.1.6-alpha.2", + "version": "0.1.7-alpha.1", "publishConfig": { "access": "public" }, diff --git a/packages/session/session-format-v0-to-v1/package.json b/packages/session/session-format-v0-to-v1/package.json index 2b2fa9d263..9d19f7a1e2 100644 --- a/packages/session/session-format-v0-to-v1/package.json +++ b/packages/session/session-format-v0-to-v1/package.json @@ -1,7 +1,7 @@ { "name": "@deepseek-ai/dsh-session-format-v0-to-v1", "description": "Frozen released-v0 Session codec and identity migration to v1", - "version": "0.1.6-alpha.2", + "version": "0.1.7-alpha.1", "publishConfig": { "access": "public" }, diff --git a/packages/session/session-format-v1-to-v2/package.json b/packages/session/session-format-v1-to-v2/package.json index 89c8b7b10f..d8e272f6a9 100644 --- a/packages/session/session-format-v1-to-v2/package.json +++ b/packages/session/session-format-v1-to-v2/package.json @@ -1,7 +1,7 @@ { "name": "@deepseek-ai/dsh-session-format-v1-to-v2", "description": "Frozen released-v1 Session codec and assistant-stream migration to v2", - "version": "0.1.6-alpha.2", + "version": "0.1.7-alpha.1", "publishConfig": { "access": "public" }, diff --git a/packages/session/session-format-v2-to-v3/package.json b/packages/session/session-format-v2-to-v3/package.json index da088fc477..ee3d72de6b 100644 --- a/packages/session/session-format-v2-to-v3/package.json +++ b/packages/session/session-format-v2-to-v3/package.json @@ -1,7 +1,7 @@ { "name": "@deepseek-ai/dsh-session-format-v2-to-v3", "description": "Streaming system-prompt, canonical-envelope and PTC migration into V3", - "version": "0.1.6-alpha.2", + "version": "0.1.7-alpha.1", "publishConfig": { "access": "public" }, diff --git a/packages/session/session-format-v3-to-v4/package.json b/packages/session/session-format-v3-to-v4/package.json index d99577e387..bc1b81174c 100644 --- a/packages/session/session-format-v3-to-v4/package.json +++ b/packages/session/session-format-v3-to-v4/package.json @@ -1,7 +1,7 @@ { "name": "@deepseek-ai/dsh-session-format-v3-to-v4", "description": "Streaming tool-role migration and delivery validation from Session V3 to V4", - "version": "0.1.6-alpha.2", + "version": "0.1.7-alpha.1", "publishConfig": { "access": "public" }, diff --git a/packages/session/session-format/package.json b/packages/session/session-format/package.json index c72c7385ce..b2f97b61e5 100644 --- a/packages/session/session-format/package.json +++ b/packages/session/session-format/package.json @@ -1,7 +1,7 @@ { "name": "@deepseek-ai/dsh-session-format", "description": "Streaming adjacent Session format migration machinery", - "version": "0.1.6-alpha.2", + "version": "0.1.7-alpha.1", "publishConfig": { "access": "public" }, diff --git a/packages/session/session-log-deepseek/package.json b/packages/session/session-log-deepseek/package.json index cc4739e290..204012c54b 100644 --- a/packages/session/session-log-deepseek/package.json +++ b/packages/session/session-log-deepseek/package.json @@ -1,7 +1,7 @@ { "name": "@deepseek-ai/dsh-session-log-deepseek", "description": "Incremental lossless session-log request extension for the official DeepSeek LLM API", - "version": "0.1.6-alpha.2", + "version": "0.1.7-alpha.1", "publishConfig": { "access": "public" }, diff --git a/packages/session/session-persistence-jsonl/package.json b/packages/session/session-persistence-jsonl/package.json index 0966adcd58..5304380064 100644 --- a/packages/session/session-persistence-jsonl/package.json +++ b/packages/session/session-persistence-jsonl/package.json @@ -1,7 +1,7 @@ { "name": "@deepseek-ai/dsh-session-persistence-jsonl", "description": "JSONL durable session persistence backend for the DeepSeek Harness", - "version": "0.1.6-alpha.2", + "version": "0.1.7-alpha.1", "publishConfig": { "access": "public" }, diff --git a/packages/session/session-persistence/package.json b/packages/session/session-persistence/package.json index e6e8d71eec..e7ba5f7075 100644 --- a/packages/session/session-persistence/package.json +++ b/packages/session/session-persistence/package.json @@ -1,7 +1,7 @@ { "name": "@deepseek-ai/dsh-session-persistence", "description": "Abstract durable session persistence seam (ctx.sessionPersistence) for the DeepSeek Harness", - "version": "0.1.6-alpha.2", + "version": "0.1.7-alpha.1", "publishConfig": { "access": "public" }, diff --git a/packages/session/session-projection-cache/package.json b/packages/session/session-projection-cache/package.json index 020e55fc02..a80d0ff61f 100644 --- a/packages/session/session-projection-cache/package.json +++ b/packages/session/session-projection-cache/package.json @@ -1,7 +1,7 @@ { "name": "@deepseek-ai/dsh-session-projection-cache", "description": "Persisted projection cache (ctx.sessionProjectionCache): durable per-session checkpoint records on the session_projcache storage domain (per-record layout), throttled write-behind, and the cached listing read", - "version": "0.1.6-alpha.2", + "version": "0.1.7-alpha.1", "publishConfig": { "access": "public" }, diff --git a/packages/session/session-projection/package.json b/packages/session/session-projection/package.json index ba366a8a92..a79cb2f4cc 100644 --- a/packages/session/session-projection/package.json +++ b/packages/session/session-projection/package.json @@ -1,7 +1,7 @@ { "name": "@deepseek-ai/dsh-session-projection", "description": "Session-projection seam: the merge-extensible projection type table, the provider contract, and the ctx.sessionProjections registry serving whole current values of log-derived per-session state", - "version": "0.1.6-alpha.2", + "version": "0.1.7-alpha.1", "publishConfig": { "access": "public" }, diff --git a/packages/session/session-stats/package.json b/packages/session/session-stats/package.json index 0d63f3cb02..bee46f93f5 100644 --- a/packages/session/session-stats/package.json +++ b/packages/session/session-stats/package.json @@ -1,7 +1,7 @@ { "name": "@deepseek-ai/dsh-session-stats", "description": "Whole-log conversation counts and wall times projection (sessionStats) for the DeepSeek Harness", - "version": "0.1.6-alpha.2", + "version": "0.1.7-alpha.1", "publishConfig": { "access": "public" }, diff --git a/packages/session/session-telemetry-otel/package.json b/packages/session/session-telemetry-otel/package.json index 9cef56bbcc..9226704736 100644 --- a/packages/session/session-telemetry-otel/package.json +++ b/packages/session/session-telemetry-otel/package.json @@ -1,7 +1,7 @@ { "name": "@deepseek-ai/dsh-session-telemetry-otel", "description": "OpenTelemetry backend for the DeepSeek Harness telemetry seam: hands captured session records to the OTel JS SDK's log pipeline", - "version": "0.1.6-alpha.2", + "version": "0.1.7-alpha.1", "publishConfig": { "access": "public" }, diff --git a/packages/session/session-telemetry/package.json b/packages/session/session-telemetry/package.json index f7ae2b4687..6b789bc439 100644 --- a/packages/session/session-telemetry/package.json +++ b/packages/session/session-telemetry/package.json @@ -1,7 +1,7 @@ { "name": "@deepseek-ai/dsh-session-telemetry", "description": "SessionTelemetryBackend seam for the DeepSeek Harness: session-event capture, projection, redaction, and handoff to a reporting backend", - "version": "0.1.6-alpha.2", + "version": "0.1.7-alpha.1", "publishConfig": { "access": "public" }, diff --git a/packages/session/session-title-all-prompts-llm/package.json b/packages/session/session-title-all-prompts-llm/package.json index 707c4309eb..63de05feb5 100644 --- a/packages/session/session-title-all-prompts-llm/package.json +++ b/packages/session/session-title-all-prompts-llm/package.json @@ -1,7 +1,7 @@ { "name": "@deepseek-ai/dsh-session-title-all-prompts-llm", "description": "All-user-messages LLM provider plugin for DeepSeek Harness session titles", - "version": "0.1.6-alpha.2", + "version": "0.1.7-alpha.1", "publishConfig": { "access": "public" }, diff --git a/packages/session/session-title-first-prompt-llm/package.json b/packages/session/session-title-first-prompt-llm/package.json index 9df24b618f..94d62269da 100644 --- a/packages/session/session-title-first-prompt-llm/package.json +++ b/packages/session/session-title-first-prompt-llm/package.json @@ -1,7 +1,7 @@ { "name": "@deepseek-ai/dsh-session-title-first-prompt-llm", "description": "First-message LLM provider plugin for DeepSeek Harness session titles", - "version": "0.1.6-alpha.2", + "version": "0.1.7-alpha.1", "publishConfig": { "access": "public" }, diff --git a/packages/session/session-title-llm/package.json b/packages/session/session-title-llm/package.json index ecaeec25d9..309ebd8b76 100644 --- a/packages/session/session-title-llm/package.json +++ b/packages/session/session-title-llm/package.json @@ -1,7 +1,7 @@ { "name": "@deepseek-ai/dsh-session-title-llm", "description": "Shared LLM generation policy for DeepSeek Harness session-title providers", - "version": "0.1.6-alpha.2", + "version": "0.1.7-alpha.1", "publishConfig": { "access": "public" }, diff --git a/packages/session/session-title/package.json b/packages/session/session-title/package.json index f0a5282c8c..f9e4daffbc 100644 --- a/packages/session/session-title/package.json +++ b/packages/session/session-title/package.json @@ -1,7 +1,7 @@ { "name": "@deepseek-ai/dsh-session-title", "description": "Log-backed session title service and provider registry for the DeepSeek Harness", - "version": "0.1.6-alpha.2", + "version": "0.1.7-alpha.1", "publishConfig": { "access": "public" }, diff --git a/packages/session/session-turn-outline/package.json b/packages/session/session-turn-outline/package.json index 63e6b7732b..263a236c2e 100644 --- a/packages/session/session-turn-outline/package.json +++ b/packages/session/session-turn-outline/package.json @@ -1,7 +1,7 @@ { "name": "@deepseek-ai/dsh-session-turn-outline", "description": "Whole-log turn outline projection (turnOutline) for the DeepSeek Harness", - "version": "0.1.6-alpha.2", + "version": "0.1.7-alpha.1", "publishConfig": { "access": "public" }, diff --git a/packages/settings/settings/package.json b/packages/settings/settings/package.json index cc061e8c10..485844b794 100644 --- a/packages/settings/settings/package.json +++ b/packages/settings/settings/package.json @@ -1,7 +1,7 @@ { "name": "@deepseek-ai/dsh-settings", "description": "Abstract user-settings seam (ctx.settings) for the DeepSeek Harness", - "version": "0.1.6-alpha.2", + "version": "0.1.7-alpha.1", "publishConfig": { "access": "public" }, diff --git a/packages/shell/bash-local/package.json b/packages/shell/bash-local/package.json index 32e853f646..fcc79274cd 100644 --- a/packages/shell/bash-local/package.json +++ b/packages/shell/bash-local/package.json @@ -1,7 +1,7 @@ { "name": "@deepseek-ai/dsh-bash-local", "description": "Local-subprocess implementation of the DeepSeek Harness bash executor seam", - "version": "0.1.6-alpha.2", + "version": "0.1.7-alpha.1", "publishConfig": { "access": "public" }, diff --git a/packages/shell/bash-sandbox/package.json b/packages/shell/bash-sandbox/package.json index cdc83d8d92..36601e482f 100644 --- a/packages/shell/bash-sandbox/package.json +++ b/packages/shell/bash-sandbox/package.json @@ -1,7 +1,7 @@ { "name": "@deepseek-ai/dsh-bash-sandbox", "description": "Sandbox-consuming implementation of the DeepSeek Harness bash executor seam (confines every command via ctx.sandbox, reports denial/enforcement result facts)", - "version": "0.1.6-alpha.2", + "version": "0.1.7-alpha.1", "publishConfig": { "access": "public" }, diff --git a/packages/shell/pwsh-local/package.json b/packages/shell/pwsh-local/package.json index 1e3c486d14..765a695468 100644 --- a/packages/shell/pwsh-local/package.json +++ b/packages/shell/pwsh-local/package.json @@ -1,7 +1,7 @@ { "name": "@deepseek-ai/dsh-pwsh-local", "description": "Local PowerShell implementation of the DeepSeek Harness bash executor seam", - "version": "0.1.6-alpha.2", + "version": "0.1.7-alpha.1", "publishConfig": { "access": "public" }, diff --git a/packages/shell/pwsh-sandbox/package.json b/packages/shell/pwsh-sandbox/package.json index 7e15881771..d923d8619c 100644 --- a/packages/shell/pwsh-sandbox/package.json +++ b/packages/shell/pwsh-sandbox/package.json @@ -1,7 +1,7 @@ { "name": "@deepseek-ai/dsh-pwsh-sandbox", "description": "Sandbox-consuming implementation of the DeepSeek Harness PowerShell executor seam (confines every command via ctx.sandbox, reports denial/enforcement result facts)", - "version": "0.1.6-alpha.2", + "version": "0.1.7-alpha.1", "publishConfig": { "access": "public" }, diff --git a/packages/shell/shell-env/package.json b/packages/shell/shell-env/package.json index aaea7d341e..96f9b94fda 100644 --- a/packages/shell/shell-env/package.json +++ b/packages/shell/shell-env/package.json @@ -1,7 +1,7 @@ { "name": "@deepseek-ai/dsh-shell-env", "description": "Tool-independent managed DSH_* shell environment registry", - "version": "0.1.6-alpha.2", + "version": "0.1.7-alpha.1", "publishConfig": { "access": "public" }, diff --git a/packages/shell/shell/package.json b/packages/shell/shell/package.json index 4600d165e4..5f35c20062 100644 --- a/packages/shell/shell/package.json +++ b/packages/shell/shell/package.json @@ -1,7 +1,7 @@ { "name": "@deepseek-ai/dsh-shell", "description": "Abstract bash executor seam (ctx.shell) for the DeepSeek Harness", - "version": "0.1.6-alpha.2", + "version": "0.1.7-alpha.1", "publishConfig": { "access": "public" }, diff --git a/packages/shell/tool-bash-persistent/package.json b/packages/shell/tool-bash-persistent/package.json index 7587e0be20..3822d63a47 100644 --- a/packages/shell/tool-bash-persistent/package.json +++ b/packages/shell/tool-bash-persistent/package.json @@ -1,7 +1,7 @@ { "name": "@deepseek-ai/dsh-tool-bash-persistent", "description": "Model-facing owner-scoped persistent Bash tool backed by the Harness PTY service", - "version": "0.1.6-alpha.2", + "version": "0.1.7-alpha.1", "publishConfig": { "access": "public" }, diff --git a/packages/shell/tool-bash/package.json b/packages/shell/tool-bash/package.json index 311493595c..813f8d95e7 100644 --- a/packages/shell/tool-bash/package.json +++ b/packages/shell/tool-bash/package.json @@ -1,7 +1,7 @@ { "name": "@deepseek-ai/dsh-tool-bash", "description": "Model-facing bash tool with optional generic background-job and sandbox-escalation support", - "version": "0.1.6-alpha.2", + "version": "0.1.7-alpha.1", "publishConfig": { "access": "public" }, diff --git a/packages/shell/tool-pwsh-persistent/package.json b/packages/shell/tool-pwsh-persistent/package.json index 2d14f4f879..9698a5832d 100644 --- a/packages/shell/tool-pwsh-persistent/package.json +++ b/packages/shell/tool-pwsh-persistent/package.json @@ -1,7 +1,7 @@ { "name": "@deepseek-ai/dsh-tool-pwsh-persistent", "description": "Model-facing owner-scoped persistent PowerShell tool backed by the Harness PTY service", - "version": "0.1.6-alpha.2", + "version": "0.1.7-alpha.1", "publishConfig": { "access": "public" }, diff --git a/packages/shell/tool-pwsh/package.json b/packages/shell/tool-pwsh/package.json index b8ce764201..7af38c8972 100644 --- a/packages/shell/tool-pwsh/package.json +++ b/packages/shell/tool-pwsh/package.json @@ -1,7 +1,7 @@ { "name": "@deepseek-ai/dsh-tool-pwsh", "description": "Model-facing pwsh tool over the bash executor seam", - "version": "0.1.6-alpha.2", + "version": "0.1.7-alpha.1", "publishConfig": { "access": "public" }, diff --git a/packages/skill/skill-badge/package.json b/packages/skill/skill-badge/package.json index 9e4608803a..8122558117 100644 --- a/packages/skill/skill-badge/package.json +++ b/packages/skill/skill-badge/package.json @@ -1,7 +1,7 @@ { "name": "@deepseek-ai/dsh-skill-badge", "description": "Bundled dsh badge skill provider for DeepSeek Harness", - "version": "0.1.6-alpha.2", + "version": "0.1.7-alpha.1", "publishConfig": { "access": "public" }, diff --git a/packages/skill/skill-filesystem/package.json b/packages/skill/skill-filesystem/package.json index 3c5681f1eb..fe72f0e106 100644 --- a/packages/skill/skill-filesystem/package.json +++ b/packages/skill/skill-filesystem/package.json @@ -1,7 +1,7 @@ { "name": "@deepseek-ai/dsh-skill-filesystem", "description": "Local filesystem skill provider for the DeepSeek Harness", - "version": "0.1.6-alpha.2", + "version": "0.1.7-alpha.1", "publishConfig": { "access": "public" }, diff --git a/packages/skill/skill-office/package.json b/packages/skill/skill-office/package.json index d0bbe66c05..36f0ae92f5 100644 --- a/packages/skill/skill-office/package.json +++ b/packages/skill/skill-office/package.json @@ -1,7 +1,7 @@ { "name": "@deepseek-ai/dsh-skill-office", "description": "Bundled Word, PowerPoint, and Excel workflows and structural checks", - "version": "0.1.6-alpha.2", + "version": "0.1.7-alpha.1", "publishConfig": { "access": "public" }, diff --git a/packages/skill/skill/package.json b/packages/skill/skill/package.json index f4777807e2..de98277f65 100644 --- a/packages/skill/skill/package.json +++ b/packages/skill/skill/package.json @@ -1,7 +1,7 @@ { "name": "@deepseek-ai/dsh-skill", "description": "Agent skill provider registry for the DeepSeek Harness", - "version": "0.1.6-alpha.2", + "version": "0.1.7-alpha.1", "publishConfig": { "access": "public" }, diff --git a/packages/skill/tool-skill/package.json b/packages/skill/tool-skill/package.json index 83bcd81edb..0ee2ea74f9 100644 --- a/packages/skill/tool-skill/package.json +++ b/packages/skill/tool-skill/package.json @@ -1,7 +1,7 @@ { "name": "@deepseek-ai/dsh-tool-skill", "description": "Model-facing skill loading tool for the DeepSeek Harness", - "version": "0.1.6-alpha.2", + "version": "0.1.7-alpha.1", "publishConfig": { "access": "public" }, diff --git a/packages/skill/tool-workspace-dependencies/package.json b/packages/skill/tool-workspace-dependencies/package.json index 81597a74dc..f7ef09ea2a 100644 --- a/packages/skill/tool-workspace-dependencies/package.json +++ b/packages/skill/tool-workspace-dependencies/package.json @@ -1,7 +1,7 @@ { "name": "@deepseek-ai/dsh-tool-workspace-dependencies", "description": "The load_workspace_dependencies tool: absolute paths into a bundled Python, Node.js, and pnpm payload", - "version": "0.1.6-alpha.2", + "version": "0.1.7-alpha.1", "publishConfig": { "access": "public" }, diff --git a/packages/spill/spill-local/package.json b/packages/spill/spill-local/package.json index 3578d9bc57..3ab384ea3d 100644 --- a/packages/spill/spill-local/package.json +++ b/packages/spill/spill-local/package.json @@ -1,7 +1,7 @@ { "name": "@deepseek-ai/dsh-spill-local", "description": "Local-filesystem implementation of the DeepSeek Harness spill storage seam (private session-scoped files)", - "version": "0.1.6-alpha.2", + "version": "0.1.7-alpha.1", "publishConfig": { "access": "public" }, diff --git a/packages/spill/spill-policy/package.json b/packages/spill/spill-policy/package.json index b4370df6b0..6a33a2b49c 100644 --- a/packages/spill/spill-policy/package.json +++ b/packages/spill/spill-policy/package.json @@ -1,7 +1,7 @@ { "name": "@deepseek-ai/dsh-spill-policy", "description": "Token-budgeted tool-result retention with recoverable text and image paths", - "version": "0.1.6-alpha.2", + "version": "0.1.7-alpha.1", "publishConfig": { "access": "public" }, diff --git a/packages/spill/spill/package.json b/packages/spill/spill/package.json index 3e39db6dc6..2518b045a4 100644 --- a/packages/spill/spill/package.json +++ b/packages/spill/spill/package.json @@ -1,7 +1,7 @@ { "name": "@deepseek-ai/dsh-spill", "description": "Abstract spill storage seam (ctx.spillStore) for the DeepSeek Harness — save oversized tool text and return a retrieval locator", - "version": "0.1.6-alpha.2", + "version": "0.1.7-alpha.1", "publishConfig": { "access": "public" }, diff --git a/packages/ssh/fs-ssh/package.json b/packages/ssh/fs-ssh/package.json index 3db42bcaad..625890d87d 100644 --- a/packages/ssh/fs-ssh/package.json +++ b/packages/ssh/fs-ssh/package.json @@ -1,7 +1,7 @@ { "name": "@deepseek-ai/dsh-fs-ssh", "description": "Filesystem provider over the shared POSIX SSH helper", - "version": "0.1.6-alpha.2", + "version": "0.1.7-alpha.1", "publishConfig": { "access": "public" }, diff --git a/packages/ssh/sandbox-ssh/package.json b/packages/ssh/sandbox-ssh/package.json index 0f6464597f..7248a63c96 100644 --- a/packages/ssh/sandbox-ssh/package.json +++ b/packages/ssh/sandbox-ssh/package.json @@ -1,7 +1,7 @@ { "name": "@deepseek-ai/dsh-sandbox-ssh", "description": "Remote POSIX sandbox argv provider over the shared SSH helper", - "version": "0.1.6-alpha.2", + "version": "0.1.7-alpha.1", "publishConfig": { "access": "public" }, diff --git a/packages/ssh/ssh/package.json b/packages/ssh/ssh/package.json index 6926a8a028..5439fa8028 100644 --- a/packages/ssh/ssh/package.json +++ b/packages/ssh/ssh/package.json @@ -1,7 +1,7 @@ { "name": "@deepseek-ai/dsh-ssh", "description": "Shared OpenSSH connection and versioned POSIX remote helper", - "version": "0.1.6-alpha.2", + "version": "0.1.7-alpha.1", "publishConfig": { "access": "public" }, diff --git a/packages/ssh/subprocess-ssh/package.json b/packages/ssh/subprocess-ssh/package.json index db2acd71cb..29200a015a 100644 --- a/packages/ssh/subprocess-ssh/package.json +++ b/packages/ssh/subprocess-ssh/package.json @@ -1,7 +1,7 @@ { "name": "@deepseek-ai/dsh-subprocess-ssh", "description": "Subprocess and terminal provider over the shared POSIX SSH helper", - "version": "0.1.6-alpha.2", + "version": "0.1.7-alpha.1", "publishConfig": { "access": "public" }, diff --git a/packages/storage/storage-domain/package.json b/packages/storage/storage-domain/package.json index 2c411745f2..53ba90df95 100644 --- a/packages/storage/storage-domain/package.json +++ b/packages/storage/storage-domain/package.json @@ -1,7 +1,7 @@ { "name": "@deepseek-ai/dsh-storage-domain", "description": "Domain data form (ctx.storage.domain): schema-validated, event-emitting KV domains over storage backends for the DeepSeek Harness", - "version": "0.1.6-alpha.2", + "version": "0.1.7-alpha.1", "publishConfig": { "access": "public" }, diff --git a/packages/storage/storage-json/package.json b/packages/storage/storage-json/package.json index f4a60d6726..727f28e5db 100644 --- a/packages/storage/storage-json/package.json +++ b/packages/storage/storage-json/package.json @@ -1,7 +1,7 @@ { "name": "@deepseek-ai/dsh-storage-json", "description": "JSON file KV storage backend for the DeepSeek Harness storage hub", - "version": "0.1.6-alpha.2", + "version": "0.1.7-alpha.1", "publishConfig": { "access": "public" }, diff --git a/packages/storage/storage-sqlite/package.json b/packages/storage/storage-sqlite/package.json index 3a6422c3dc..c66976b0d3 100644 --- a/packages/storage/storage-sqlite/package.json +++ b/packages/storage/storage-sqlite/package.json @@ -1,7 +1,7 @@ { "name": "@deepseek-ai/dsh-storage-sqlite", "description": "SQLite storage backend (kv facet) for the DeepSeek Harness storage hub", - "version": "0.1.6-alpha.2", + "version": "0.1.7-alpha.1", "publishConfig": { "access": "public" }, diff --git a/packages/storage/storage/package.json b/packages/storage/storage/package.json index 1088ace1d9..9e50e2de52 100644 --- a/packages/storage/storage/package.json +++ b/packages/storage/storage/package.json @@ -1,7 +1,7 @@ { "name": "@deepseek-ai/dsh-storage", "description": "Storage hub (ctx.storage): named backend registry plus mounted data-form facilities for the DeepSeek Harness", - "version": "0.1.6-alpha.2", + "version": "0.1.7-alpha.1", "publishConfig": { "access": "public" }, diff --git a/packages/subagent/subagent-acp/package.json b/packages/subagent/subagent-acp/package.json index c478e0edf9..05e1e305b4 100644 --- a/packages/subagent/subagent-acp/package.json +++ b/packages/subagent/subagent-acp/package.json @@ -1,7 +1,7 @@ { "name": "@deepseek-ai/dsh-subagent-acp", "description": "Out-of-process ACP subagent backend: drives a child agent in a spawned subprocess over the Agent Client Protocol", - "version": "0.1.6-alpha.2", + "version": "0.1.7-alpha.1", "publishConfig": { "access": "public" }, diff --git a/packages/subagent/subagent-claude-code/package.json b/packages/subagent/subagent-claude-code/package.json index 319f432ec6..738a01542b 100644 --- a/packages/subagent/subagent-claude-code/package.json +++ b/packages/subagent/subagent-claude-code/package.json @@ -1,7 +1,7 @@ { "name": "@deepseek-ai/dsh-subagent-claude-code", "description": "One-shot Claude Code subagent provider over the official Agent SDK", - "version": "0.1.6-alpha.2", + "version": "0.1.7-alpha.1", "publishConfig": { "access": "public" }, diff --git a/packages/subagent/subagent-codex/package.json b/packages/subagent/subagent-codex/package.json index 35c6f9a607..859ea693ef 100644 --- a/packages/subagent/subagent-codex/package.json +++ b/packages/subagent/subagent-codex/package.json @@ -1,7 +1,7 @@ { "name": "@deepseek-ai/dsh-subagent-codex", "description": "One-shot Codex subagent provider over the official app-server protocol", - "version": "0.1.6-alpha.2", + "version": "0.1.7-alpha.1", "publishConfig": { "access": "public" }, diff --git a/packages/subagent/subagent-dsh-sdk/package.json b/packages/subagent/subagent-dsh-sdk/package.json index 8bd7216cbe..b9f974c5b0 100644 --- a/packages/subagent/subagent-dsh-sdk/package.json +++ b/packages/subagent/subagent-dsh-sdk/package.json @@ -1,7 +1,7 @@ { "name": "@deepseek-ai/dsh-subagent-dsh-sdk", "description": "Out-of-process SDK subagent backend: drives a child DeepSeek Harness runtime subprocess over stdio JSON-RPC through the TypeScript SDK client", - "version": "0.1.6-alpha.2", + "version": "0.1.7-alpha.1", "publishConfig": { "access": "public" }, diff --git a/packages/subagent/subagent-fork-in-process/package.json b/packages/subagent/subagent-fork-in-process/package.json index 15f15b7623..aa789347c3 100644 --- a/packages/subagent/subagent-fork-in-process/package.json +++ b/packages/subagent/subagent-fork-in-process/package.json @@ -1,7 +1,7 @@ { "name": "@deepseek-ai/dsh-subagent-fork-in-process", "description": "In-process fork subagent backend: runs a child agent seeded with a prefix of the parent's log", - "version": "0.1.6-alpha.2", + "version": "0.1.7-alpha.1", "publishConfig": { "access": "public" }, diff --git a/packages/subagent/subagent-in-process-driver/package.json b/packages/subagent/subagent-in-process-driver/package.json index 21094f1a44..2d8d04981d 100644 --- a/packages/subagent/subagent-in-process-driver/package.json +++ b/packages/subagent/subagent-in-process-driver/package.json @@ -1,7 +1,7 @@ { "name": "@deepseek-ai/dsh-subagent-in-process-driver", "description": "Shared in-process subagent run driver: drives a child agent on ctx.agents (used by the spawn and fork backends)", - "version": "0.1.6-alpha.2", + "version": "0.1.7-alpha.1", "publishConfig": { "access": "public" }, diff --git a/packages/subagent/subagent-spawn-in-process/package.json b/packages/subagent/subagent-spawn-in-process/package.json index dbd9ef16ce..74ca46a6b7 100644 --- a/packages/subagent/subagent-spawn-in-process/package.json +++ b/packages/subagent/subagent-spawn-in-process/package.json @@ -1,7 +1,7 @@ { "name": "@deepseek-ai/dsh-subagent-spawn-in-process", "description": "In-process spawn subagent backend: runs a fresh child agent on ctx.agents", - "version": "0.1.6-alpha.2", + "version": "0.1.7-alpha.1", "publishConfig": { "access": "public" }, diff --git a/packages/subagent/subagent/package.json b/packages/subagent/subagent/package.json index f9d2b7b6bc..aa3e26127b 100644 --- a/packages/subagent/subagent/package.json +++ b/packages/subagent/subagent/package.json @@ -1,7 +1,7 @@ { "name": "@deepseek-ai/dsh-subagent", "description": "Abstract subagent seam (ctx.subagents): named-provider registry for delegating to child agents", - "version": "0.1.6-alpha.2", + "version": "0.1.7-alpha.1", "publishConfig": { "access": "public" }, diff --git a/packages/subagent/tool-subagent-control/package.json b/packages/subagent/tool-subagent-control/package.json index fc65e8c5d2..7178d0e486 100644 --- a/packages/subagent/tool-subagent-control/package.json +++ b/packages/subagent/tool-subagent-control/package.json @@ -1,7 +1,7 @@ { "name": "@deepseek-ai/dsh-tool-subagent-control", "description": "Globally named send_message, interrupt_agent, and list_agents tools over ctx.subagents continuations", - "version": "0.1.6-alpha.2", + "version": "0.1.7-alpha.1", "publishConfig": { "access": "public" }, diff --git a/packages/subagent/tool-subagent/package.json b/packages/subagent/tool-subagent/package.json index 41abc00a2d..1c8d7dc647 100644 --- a/packages/subagent/tool-subagent/package.json +++ b/packages/subagent/tool-subagent/package.json @@ -1,7 +1,7 @@ { "name": "@deepseek-ai/dsh-tool-subagent", "description": "Model-facing subagent delegation tool over the ctx.subagents seam", - "version": "0.1.6-alpha.2", + "version": "0.1.7-alpha.1", "publishConfig": { "access": "public" }, diff --git a/packages/subprocess/subprocess-local/package.json b/packages/subprocess/subprocess-local/package.json index a3f53b2c93..17ffd7df2e 100644 --- a/packages/subprocess/subprocess-local/package.json +++ b/packages/subprocess/subprocess-local/package.json @@ -1,7 +1,7 @@ { "name": "@deepseek-ai/dsh-subprocess-local", "description": "Local-subprocess implementation of the DeepSeek Harness subprocess seam", - "version": "0.1.6-alpha.2", + "version": "0.1.7-alpha.1", "publishConfig": { "access": "public" }, diff --git a/packages/subprocess/subprocess/package.json b/packages/subprocess/subprocess/package.json index 608efe051e..edf1c8b758 100644 --- a/packages/subprocess/subprocess/package.json +++ b/packages/subprocess/subprocess/package.json @@ -1,7 +1,7 @@ { "name": "@deepseek-ai/dsh-subprocess", "description": "Subprocess seam (ctx.subprocess) for the DeepSeek Harness \u2014 managed process groups, bounded spill-backed output, and escalated kills behind one abstract service", - "version": "0.1.6-alpha.2", + "version": "0.1.7-alpha.1", "publishConfig": { "access": "public" }, diff --git a/packages/subprocess/win32-process/package.json b/packages/subprocess/win32-process/package.json index bbd577b638..8111fcfe80 100644 --- a/packages/subprocess/win32-process/package.json +++ b/packages/subprocess/win32-process/package.json @@ -1,7 +1,7 @@ { "name": "@deepseek-ai/dsh-win32-process", "description": "Shared low-level Win32 process, stdio, and Job Object primitives", - "version": "0.1.6-alpha.2", + "version": "0.1.7-alpha.1", "publishConfig": { "access": "public" }, diff --git a/packages/terminal/terminal-bash/package.json b/packages/terminal/terminal-bash/package.json index 45bf3dbc77..e2158b08ee 100644 --- a/packages/terminal/terminal-bash/package.json +++ b/packages/terminal/terminal-bash/package.json @@ -1,7 +1,7 @@ { "name": "@deepseek-ai/dsh-terminal-bash", "description": "Persistent shell PTY backend over the DeepSeek Harness subprocess terminal primitive", - "version": "0.1.6-alpha.2", + "version": "0.1.7-alpha.1", "publishConfig": { "access": "public" }, diff --git a/packages/terminal/terminal/package.json b/packages/terminal/terminal/package.json index 56834e85aa..1b503f28cd 100644 --- a/packages/terminal/terminal/package.json +++ b/packages/terminal/terminal/package.json @@ -1,7 +1,7 @@ { "name": "@deepseek-ai/dsh-terminal", "description": "Persistent PTY session seam for the DeepSeek Harness — owner-scoped ids, backend registry, interactive sends, reads, signals, and awaited cleanup", - "version": "0.1.6-alpha.2", + "version": "0.1.7-alpha.1", "publishConfig": { "access": "public" }, diff --git a/packages/terminal/tool-terminal/package.json b/packages/terminal/tool-terminal/package.json index fefd88d568..8ff5ea3763 100644 --- a/packages/terminal/tool-terminal/package.json +++ b/packages/terminal/tool-terminal/package.json @@ -1,7 +1,7 @@ { "name": "@deepseek-ai/dsh-tool-terminal", "description": "Six model-facing persistent PTY tools with owner isolation and generic background-job integration", - "version": "0.1.6-alpha.2", + "version": "0.1.7-alpha.1", "publishConfig": { "access": "public" }, diff --git a/packages/test-support/agent-loop-testkit/package.json b/packages/test-support/agent-loop-testkit/package.json index 85c890db4d..b4331fb1c5 100644 --- a/packages/test-support/agent-loop-testkit/package.json +++ b/packages/test-support/agent-loop-testkit/package.json @@ -1,7 +1,7 @@ { "name": "@deepseek-ai/dsh-agent-loop-testkit", "description": "Prerequisite mounting, production AgentLoop drivers, and Inbox stubs for tests", - "version": "0.1.6-alpha.2", + "version": "0.1.7-alpha.1", "publishConfig": { "access": "public" }, diff --git a/packages/test-support/client-runtime/package.json b/packages/test-support/client-runtime/package.json index a1eadf5d76..7a9ebf2b12 100644 --- a/packages/test-support/client-runtime/package.json +++ b/packages/test-support/client-runtime/package.json @@ -1,7 +1,7 @@ { "name": "@deepseek-ai/dsh-client-test-runtime", "description": "Browser test runtimes: a jsdom slot bench with test-owned Session and Workspace doubles, and a whole-client tier that boots the web roster through the production bootClient over an endpoint-named Remote mock", - "version": "0.1.6-alpha.2", + "version": "0.1.7-alpha.1", "publishConfig": { "access": "public" }, diff --git a/packages/test-support/llm-mock-server/package.json b/packages/test-support/llm-mock-server/package.json index 225c056215..6298fce136 100644 --- a/packages/test-support/llm-mock-server/package.json +++ b/packages/test-support/llm-mock-server/package.json @@ -1,7 +1,7 @@ { "name": "@deepseek-ai/dsh-llm-mock-server", "description": "Scriptable Messages HTTP/SSE fault server for LLM recovery tests", - "version": "0.1.6-alpha.2", + "version": "0.1.7-alpha.1", "publishConfig": { "access": "public" }, diff --git a/packages/test-support/llm-replay/package.json b/packages/test-support/llm-replay/package.json index 96e06fd0a9..64cd1e63e1 100644 --- a/packages/test-support/llm-replay/package.json +++ b/packages/test-support/llm-replay/package.json @@ -1,7 +1,7 @@ { "name": "@deepseek-ai/dsh-llm-replay", "description": "Replay LLM plugin: short-circuits llm/stream with model chunks reconstructed from a recorded session JSONL (keyless snapshot tests)", - "version": "0.1.6-alpha.2", + "version": "0.1.7-alpha.1", "publishConfig": { "access": "public" }, diff --git a/packages/test-support/loader-smoke/package.json b/packages/test-support/loader-smoke/package.json index f5fe3da125..e7c7af6546 100644 --- a/packages/test-support/loader-smoke/package.json +++ b/packages/test-support/loader-smoke/package.json @@ -1,7 +1,7 @@ { "name": "@deepseek-ai/dsh-loader-smoke", "description": "Shared subprocess and direct-agent harness for keyless real-Loader example smoke tests", - "version": "0.1.6-alpha.2", + "version": "0.1.7-alpha.1", "publishConfig": { "access": "public" }, diff --git a/packages/test-support/remote-mock/package.json b/packages/test-support/remote-mock/package.json index af878fcb05..25735fa53c 100644 --- a/packages/test-support/remote-mock/package.json +++ b/packages/test-support/remote-mock/package.json @@ -1,7 +1,7 @@ { "name": "@deepseek-ai/dsh-remote-mock", "description": "Endpoint-named mock for Typert Remote traffic: unary answers and stream scripts per /, live stream control, a log, and the Connection carrier face whole-client specs install", - "version": "0.1.6-alpha.2", + "version": "0.1.7-alpha.1", "publishConfig": { "access": "public" }, diff --git a/packages/test-support/session-snapshot/package.json b/packages/test-support/session-snapshot/package.json index 09d4a774b6..8f248fa4e3 100644 --- a/packages/test-support/session-snapshot/package.json +++ b/packages/test-support/session-snapshot/package.json @@ -1,7 +1,7 @@ { "name": "@deepseek-ai/dsh-session-snapshot", "description": "Session-log snapshot core with an ACP protocol adapter, expected-output normalization, and fixture invariants", - "version": "0.1.6-alpha.2", + "version": "0.1.7-alpha.1", "publishConfig": { "access": "public" }, diff --git a/packages/todo/tool-todo/package.json b/packages/todo/tool-todo/package.json index c1795d1114..5140cff59a 100644 --- a/packages/todo/tool-todo/package.json +++ b/packages/todo/tool-todo/package.json @@ -1,7 +1,7 @@ { "name": "@deepseek-ai/dsh-tool-todo", "description": "Model-facing todo_write tool over the DeepSeek Harness event-sourced session log", - "version": "0.1.6-alpha.2", + "version": "0.1.7-alpha.1", "publishConfig": { "access": "public" }, diff --git a/packages/typert/generator/package.json b/packages/typert/generator/package.json index 5b7f2feca7..9e5e5aa290 100644 --- a/packages/typert/generator/package.json +++ b/packages/typert/generator/package.json @@ -1,7 +1,7 @@ { "name": "@deepseek-ai/dsh-typert-generator", "description": "TypeScript project analyzer and model-driven Typert artifact generator", - "version": "0.1.6-alpha.2", + "version": "0.1.7-alpha.1", "publishConfig": { "access": "public" }, diff --git a/packages/typert/loader/package.json b/packages/typert/loader/package.json index afedc5a157..8b161836b4 100644 --- a/packages/typert/loader/package.json +++ b/packages/typert/loader/package.json @@ -1,7 +1,7 @@ { "name": "@deepseek-ai/dsh-typert-loader", "description": "Loader integration for generated Typert package contributions", - "version": "0.1.6-alpha.2", + "version": "0.1.7-alpha.1", "publishConfig": { "access": "public" }, diff --git a/packages/typert/protocol/package.json b/packages/typert/protocol/package.json index 0b998c9897..aa5edf0b80 100644 --- a/packages/typert/protocol/package.json +++ b/packages/typert/protocol/package.json @@ -1,7 +1,7 @@ { "name": "@deepseek-ai/dsh-typert-protocol", "description": "Compiler-independent Remote metadata and Typert provider protocols", - "version": "0.1.6-alpha.2", + "version": "0.1.7-alpha.1", "publishConfig": { "access": "public" }, diff --git a/packages/typert/registry/package.json b/packages/typert/registry/package.json index 88198de32b..84790a40fb 100644 --- a/packages/typert/registry/package.json +++ b/packages/typert/registry/package.json @@ -1,7 +1,7 @@ { "name": "@deepseek-ai/dsh-typert-registry", "description": "Runtime registry for generated package reflection and Zod schemas", - "version": "0.1.6-alpha.2", + "version": "0.1.7-alpha.1", "publishConfig": { "access": "public" }, diff --git a/packages/util/atomic-write/package.json b/packages/util/atomic-write/package.json index a995f1f0e4..9d6d863e42 100644 --- a/packages/util/atomic-write/package.json +++ b/packages/util/atomic-write/package.json @@ -1,7 +1,7 @@ { "name": "@deepseek-ai/dsh-atomic-write", "description": "Zero-dependency atomic file replacement: exclusive-create random-suffix temp + rename carrying the caller-stated permissions (writeFileAtomic)", - "version": "0.1.6-alpha.2", + "version": "0.1.7-alpha.1", "publishConfig": { "access": "public" }, diff --git a/packages/util/brand/package.json b/packages/util/brand/package.json index c78b56fbde..0932e48f2d 100644 --- a/packages/util/brand/package.json +++ b/packages/util/brand/package.json @@ -1,7 +1,7 @@ { "name": "@deepseek-ai/dsh-brand", "description": "Stateless branded primitive types for the DeepSeek Harness", - "version": "0.1.6-alpha.2", + "version": "0.1.7-alpha.1", "publishConfig": { "access": "public" }, diff --git a/packages/util/chunked-list/package.json b/packages/util/chunked-list/package.json index 5c942e2179..6a8afe59af 100644 --- a/packages/util/chunked-list/package.json +++ b/packages/util/chunked-list/package.json @@ -1,7 +1,7 @@ { "name": "@deepseek-ai/dsh-chunked-list", "description": "Persistent append-only chunked lists with bounded copying and JSON checkpoint validation", - "version": "0.1.6-alpha.2", + "version": "0.1.7-alpha.1", "publishConfig": { "access": "public" }, diff --git a/packages/util/crypto/package.json b/packages/util/crypto/package.json index ab4af4d311..8cc37cef9c 100644 --- a/packages/util/crypto/package.json +++ b/packages/util/crypto/package.json @@ -1,7 +1,7 @@ { "name": "@deepseek-ai/dsh-util-crypto", "description": "Zero-dependency browser-safe UUID and byte-encoding helpers", - "version": "0.1.6-alpha.2", + "version": "0.1.7-alpha.1", "publishConfig": { "access": "public" }, diff --git a/packages/util/deque/package.json b/packages/util/deque/package.json index bd3d9fed4f..c58ba16417 100644 --- a/packages/util/deque/package.json +++ b/packages/util/deque/package.json @@ -1,7 +1,7 @@ { "name": "@deepseek-ai/dsh-deque", "description": "Zero-dependency circular deque with amortized constant-time end operations and bounded vacant storage", - "version": "0.1.6-alpha.2", + "version": "0.1.7-alpha.1", "publishConfig": { "access": "public" }, diff --git a/packages/util/home-paths/package.json b/packages/util/home-paths/package.json index fba82db446..01effdac17 100644 --- a/packages/util/home-paths/package.json +++ b/packages/util/home-paths/package.json @@ -1,7 +1,7 @@ { "name": "@deepseek-ai/dsh-home-paths", "description": "Shared filesystem path helpers for the DeepSeek Harness", - "version": "0.1.6-alpha.2", + "version": "0.1.7-alpha.1", "publishConfig": { "access": "public" }, diff --git a/packages/util/http-proxy/package.json b/packages/util/http-proxy/package.json index 1e1d3db9a4..d225608dce 100644 --- a/packages/util/http-proxy/package.json +++ b/packages/util/http-proxy/package.json @@ -1,7 +1,7 @@ { "name": "@deepseek-ai/dsh-http-proxy", "description": "Process-wide outbound HTTP proxy policy for DeepSeek Harness: resolve it from the launch environment and install it as undici's global dispatcher", - "version": "0.1.6-alpha.2", + "version": "0.1.7-alpha.1", "publishConfig": { "access": "public" }, diff --git a/packages/util/launch-environment/package.json b/packages/util/launch-environment/package.json index d360510623..f04c5d4ac9 100644 --- a/packages/util/launch-environment/package.json +++ b/packages/util/launch-environment/package.json @@ -1,7 +1,7 @@ { "name": "@deepseek-ai/dsh-launch-environment", "description": "Immutable DeepSeek Harness launch environment that records which layer supplied each value", - "version": "0.1.6-alpha.2", + "version": "0.1.7-alpha.1", "publishConfig": { "access": "public" }, diff --git a/packages/util/lazy-require/package.json b/packages/util/lazy-require/package.json index a37843d251..1408b8bff8 100644 --- a/packages/util/lazy-require/package.json +++ b/packages/util/lazy-require/package.json @@ -1,7 +1,7 @@ { "name": "@deepseek-ai/dsh-lazy-require", "description": "Caller-relative, success-cached lazy loading for CommonJS-compatible Host dependencies", - "version": "0.1.6-alpha.2", + "version": "0.1.7-alpha.1", "publishConfig": { "access": "public" }, diff --git a/packages/util/native-command/package.json b/packages/util/native-command/package.json index 9fc16ba0a9..9515651d12 100644 --- a/packages/util/native-command/package.json +++ b/packages/util/native-command/package.json @@ -1,7 +1,7 @@ { "name": "@deepseek-ai/dsh-native-command", "description": "Host-native command and path-opening utilities with shell-free execution, cancellation, desktop detection, and WSL handoff", - "version": "0.1.6-alpha.2", + "version": "0.1.7-alpha.1", "publishConfig": { "access": "public" }, diff --git a/packages/util/output-retention/package.json b/packages/util/output-retention/package.json index e48e40ff32..06f4aa0c54 100644 --- a/packages/util/output-retention/package.json +++ b/packages/util/output-retention/package.json @@ -1,7 +1,7 @@ { "name": "@deepseek-ai/dsh-output-retention", "description": "Zero-dependency bounded-retention primitive: ItemRetainer/TextRetainer + neutral notice helpers (what did we keep, what did we omit)", - "version": "0.1.6-alpha.2", + "version": "0.1.7-alpha.1", "publishConfig": { "access": "public" }, diff --git a/packages/util/package-manifest/package.json b/packages/util/package-manifest/package.json index b9d9244308..afc0b1cecb 100644 --- a/packages/util/package-manifest/package.json +++ b/packages/util/package-manifest/package.json @@ -1,7 +1,7 @@ { "name": "@deepseek-ai/dsh-package-manifest", "description": "Shared type declarations for package.json.dsh configuration fields", - "version": "0.1.6-alpha.2", + "version": "0.1.7-alpha.1", "publishConfig": { "access": "public" }, diff --git a/packages/util/time/package.json b/packages/util/time/package.json index 5ffb0806f9..ed345644d2 100644 --- a/packages/util/time/package.json +++ b/packages/util/time/package.json @@ -1,7 +1,7 @@ { "name": "@deepseek-ai/dsh-util-time", "description": "Zero-dependency time vocabulary shared by wire boundaries: canonicalClientTimeZone (IANA zone validation and canonicalization only, no formatting)", - "version": "0.1.6-alpha.2", + "version": "0.1.7-alpha.1", "publishConfig": { "access": "public" }, diff --git a/packages/util/timeout/package.json b/packages/util/timeout/package.json index 26d59d16a1..fac137dcea 100644 --- a/packages/util/timeout/package.json +++ b/packages/util/timeout/package.json @@ -1,7 +1,7 @@ { "name": "@deepseek-ai/dsh-timeout", "description": "Zero-dependency timeout/deadline primitive: clampTimeout, deadline, timeoutOf, TimeoutReason (timing + classification only, no termination)", - "version": "0.1.6-alpha.2", + "version": "0.1.7-alpha.1", "publishConfig": { "access": "public" }, diff --git a/packages/util/values/package.json b/packages/util/values/package.json index 954188b90b..21a4f5123c 100644 --- a/packages/util/values/package.json +++ b/packages/util/values/package.json @@ -1,7 +1,7 @@ { "name": "@deepseek-ai/dsh-util-values", "description": "Duplicate-install-safe value primitives for the DeepSeek Harness", - "version": "0.1.6-alpha.2", + "version": "0.1.7-alpha.1", "publishConfig": { "access": "public" }, diff --git a/packages/util/workspace-path/package.json b/packages/util/workspace-path/package.json index c61b85c5d0..8aa62b515d 100644 --- a/packages/util/workspace-path/package.json +++ b/packages/util/workspace-path/package.json @@ -1,7 +1,7 @@ { "name": "@deepseek-ai/dsh-util-workspace-path", "description": "Browser-safe Workspace path and display helpers", - "version": "0.1.6-alpha.2", + "version": "0.1.7-alpha.1", "publishConfig": { "access": "public" }, diff --git a/packages/web/tool-web/package.json b/packages/web/tool-web/package.json index f12ac855bb..5f1fdaf8f0 100644 --- a/packages/web/tool-web/package.json +++ b/packages/web/tool-web/package.json @@ -1,7 +1,7 @@ { "name": "@deepseek-ai/dsh-tool-web", "description": "Model-facing web tools (web_search, web_fetch) over the DeepSeek Harness web capability seam (ctx.web)", - "version": "0.1.6-alpha.2", + "version": "0.1.7-alpha.1", "publishConfig": { "access": "public" }, diff --git a/packages/web/web-fetch-http/package.json b/packages/web/web-fetch-http/package.json index 031a18cbd0..af81853773 100644 --- a/packages/web/web-fetch-http/package.json +++ b/packages/web/web-fetch-http/package.json @@ -1,7 +1,7 @@ { "name": "@deepseek-ai/dsh-web-fetch-http", "description": "Anonymous public HTTP(S) fetch provider for the DeepSeek Harness web capability seam (ctx.web)", - "version": "0.1.6-alpha.2", + "version": "0.1.7-alpha.1", "publishConfig": { "access": "public" }, diff --git a/packages/web/web-search-deepseek/package.json b/packages/web/web-search-deepseek/package.json index f2af653622..13a0966713 100644 --- a/packages/web/web-search-deepseek/package.json +++ b/packages/web/web-search-deepseek/package.json @@ -1,7 +1,7 @@ { "name": "@deepseek-ai/dsh-web-search-deepseek", "description": "DeepSeek-backed search provider (native web_search via the Anthropic-compatible API) for the DeepSeek Harness web capability seam (ctx.web)", - "version": "0.1.6-alpha.2", + "version": "0.1.7-alpha.1", "publishConfig": { "access": "public" }, diff --git a/packages/web/web-search-exa/package.json b/packages/web/web-search-exa/package.json index 79f24d7ded..6a65cb575a 100644 --- a/packages/web/web-search-exa/package.json +++ b/packages/web/web-search-exa/package.json @@ -1,7 +1,7 @@ { "name": "@deepseek-ai/dsh-web-search-exa", "description": "Exa-backed search provider for the DeepSeek Harness web capability seam (ctx.web)", - "version": "0.1.6-alpha.2", + "version": "0.1.7-alpha.1", "publishConfig": { "access": "public" }, diff --git a/packages/web/web-search-perplexity/package.json b/packages/web/web-search-perplexity/package.json index 23855db513..769e0c9089 100644 --- a/packages/web/web-search-perplexity/package.json +++ b/packages/web/web-search-perplexity/package.json @@ -1,7 +1,7 @@ { "name": "@deepseek-ai/dsh-web-search-perplexity", "description": "Perplexity-backed search provider for the DeepSeek Harness web capability seam (ctx.web)", - "version": "0.1.6-alpha.2", + "version": "0.1.7-alpha.1", "publishConfig": { "access": "public" }, diff --git a/packages/web/web/package.json b/packages/web/web/package.json index 415335d60e..ac8f6223da 100644 --- a/packages/web/web/package.json +++ b/packages/web/web/package.json @@ -1,7 +1,7 @@ { "name": "@deepseek-ai/dsh-web", "description": "Abstract web access capability seam (ctx.web) for the DeepSeek Harness — search/fetch provider registry, registration-order-independent selection, request/result vocabulary, and the WebError taxonomy", - "version": "0.1.6-alpha.2", + "version": "0.1.7-alpha.1", "publishConfig": { "access": "public" }, diff --git a/packages/webhook/webhook-github/package.json b/packages/webhook/webhook-github/package.json index c76cd85499..359e867d4e 100644 --- a/packages/webhook/webhook-github/package.json +++ b/packages/webhook/webhook-github/package.json @@ -1,7 +1,7 @@ { "name": "@deepseek-ai/dsh-webhook-github", "description": "Signed GitHub HTTP webhook adapter for the DeepSeek Harness webhook runtime", - "version": "0.1.6-alpha.2", + "version": "0.1.7-alpha.1", "publishConfig": { "access": "public" }, diff --git a/packages/webhook/webhook/package.json b/packages/webhook/webhook/package.json index c97287e923..8168263373 100644 --- a/packages/webhook/webhook/package.json +++ b/packages/webhook/webhook/package.json @@ -1,7 +1,7 @@ { "name": "@deepseek-ai/dsh-webhook", "description": "Fire-and-forget webhook rule runtime that creates Workspace-backed DeepSeek Harness Sessions", - "version": "0.1.6-alpha.2", + "version": "0.1.7-alpha.1", "publishConfig": { "access": "public" }, diff --git a/packages/workflow/tool-ralph/package.json b/packages/workflow/tool-ralph/package.json index f1ee61c121..6694dcd605 100644 --- a/packages/workflow/tool-ralph/package.json +++ b/packages/workflow/tool-ralph/package.json @@ -1,7 +1,7 @@ { "name": "@deepseek-ai/dsh-tool-ralph", "description": "Model-facing fresh-agent Ralph loop over the workflow and subagent seams", - "version": "0.1.6-alpha.2", + "version": "0.1.7-alpha.1", "publishConfig": { "access": "public" }, diff --git a/packages/workflow/tool-workflow/package.json b/packages/workflow/tool-workflow/package.json index 806919274f..ba6ffb7504 100644 --- a/packages/workflow/tool-workflow/package.json +++ b/packages/workflow/tool-workflow/package.json @@ -1,7 +1,7 @@ { "name": "@deepseek-ai/dsh-tool-workflow", "description": "Model-facing workflow tool: run a JavaScript orchestration script over ctx.workflowEngine", - "version": "0.1.6-alpha.2", + "version": "0.1.7-alpha.1", "publishConfig": { "access": "public" }, diff --git a/packages/workflow/workflow-ptc/package.json b/packages/workflow/workflow-ptc/package.json index e6332dc373..474bed2648 100644 --- a/packages/workflow/workflow-ptc/package.json +++ b/packages/workflow/workflow-ptc/package.json @@ -1,7 +1,7 @@ { "name": "@deepseek-ai/dsh-workflow-ptc", "description": "Workflow orchestration in the shared sandboxed Node PTC runtime", - "version": "0.1.6-alpha.2", + "version": "0.1.7-alpha.1", "publishConfig": { "access": "public" }, diff --git a/packages/workflow/workflow/package.json b/packages/workflow/workflow/package.json index a604da9e5c..b2d3ba391f 100644 --- a/packages/workflow/workflow/package.json +++ b/packages/workflow/workflow/package.json @@ -1,7 +1,7 @@ { "name": "@deepseek-ai/dsh-workflow", "description": "Workflow capability seam: ctx.workflowEngine service, run vocabulary, and workflow/* events", - "version": "0.1.6-alpha.2", + "version": "0.1.7-alpha.1", "publishConfig": { "access": "public" }, diff --git a/packages/workspace/workspace/package.json b/packages/workspace/workspace/package.json index 62f75566fc..f65c5cc97b 100644 --- a/packages/workspace/workspace/package.json +++ b/packages/workspace/workspace/package.json @@ -1,7 +1,7 @@ { "name": "@deepseek-ai/dsh-workspace", "description": "Workspace entity registry (ctx.workspaceRegistry): durable workspace records with validated session attachment over the domain data form for the DeepSeek Harness", - "version": "0.1.6-alpha.2", + "version": "0.1.7-alpha.1", "publishConfig": { "access": "public" }, diff --git a/scripts/gen-cordis-catalog.ts b/scripts/gen-cordis-catalog.ts index c224e04f55..2a7914015c 100644 --- a/scripts/gen-cordis-catalog.ts +++ b/scripts/gen-cordis-catalog.ts @@ -620,6 +620,7 @@ export const LINK_MAP: Readonly> = { JobEventListener: 'jobs.md', JobEvents: 'jobs.md', JobSettleCause: 'jobs.md', + SpeechDownloadFailure: 'voice-input.md', SpeechPreparationState: 'voice-input.md', SpeechPreparationStep: 'voice-input.md', SpeechPreparationStepKind: 'voice-input.md', diff --git a/snapshots/web/lifecycle-chrome/connection-error.expected.md b/snapshots/web/lifecycle-chrome/connection-error.expected.md index 51ccb442fa..6674078cb3 100644 --- a/snapshots/web/lifecycle-chrome/connection-error.expected.md +++ b/snapshots/web/lifecycle-chrome/connection-error.expected.md @@ -1,2 +1,2 @@ -- button "Account menu": Not signed in +- button "Settings" - button "Reconnecting, reconnect now": Reconnecting diff --git a/snapshots/web/lifecycle-chrome/hero.expected.md b/snapshots/web/lifecycle-chrome/hero.expected.md index 4d1f24ef42..ce6698be33 100644 --- a/snapshots/web/lifecycle-chrome/hero.expected.md +++ b/snapshots/web/lifecycle-chrome/hero.expected.md @@ -11,7 +11,7 @@ - tree "Sessions": - treeitem "workspace" [expanded] - treeitem "New Session" [selected] -- button "Account menu": Not signed in +- button "Settings" - banner: - button "Open right sidebar" - text: Into the Unknown Preview diff --git a/snapshots/web/lifecycle-chrome/plan-active-zh.expected.md b/snapshots/web/lifecycle-chrome/plan-active-zh.expected.md index 67147659df..c01c19bc4b 100644 --- a/snapshots/web/lifecycle-chrome/plan-active-zh.expected.md +++ b/snapshots/web/lifecycle-chrome/plan-active-zh.expected.md @@ -11,7 +11,7 @@ - tree "会话": - treeitem "workspace" [expanded] - treeitem "新会话" [selected] -- button "账号菜单": 尚未登录 +- button "设置" - banner: - button "打开右侧边栏" - text: 探索未至之境 预览版 diff --git a/snapshots/web/lifecycle-chrome/plan-active.expected.md b/snapshots/web/lifecycle-chrome/plan-active.expected.md index 9d0ee73cde..dee04dc9e8 100644 --- a/snapshots/web/lifecycle-chrome/plan-active.expected.md +++ b/snapshots/web/lifecycle-chrome/plan-active.expected.md @@ -11,7 +11,7 @@ - tree "Sessions": - treeitem "workspace" [expanded] - treeitem "New Session" [selected] -- button "Account menu": Not signed in +- button "Settings" - banner: - button "Open right sidebar" - text: Into the Unknown Preview diff --git a/tsconfig.host.json b/tsconfig.host.json index 99a9b2ec78..a176af9937 100644 --- a/tsconfig.host.json +++ b/tsconfig.host.json @@ -17,6 +17,7 @@ "apps/web/tests/scaffold.ts", "apps/web/tests/voice-input.e2e.ts", "apps/web/tests/voice-setup.e2e.ts", + "apps/web/tests/voice-download.e2e.ts", "apps/web/tests/prefix-proxy.ts", "apps/web/tests/developer-tools-settings.e2e.ts", "apps/web/tests/auto-review-fixture.ts", diff --git a/vendor/cordis/package.json b/vendor/cordis/package.json index 9d36e622af..46ad178a84 100644 --- a/vendor/cordis/package.json +++ b/vendor/cordis/package.json @@ -1,7 +1,7 @@ { "name": "@deepseek-ai/cordis", "description": "Meta-Framework for Modern JavaScript Applications", - "version": "4.0.2", + "version": "4.0.3", "publishConfig": { "access": "public" }, diff --git a/vendor/cosmokit/package.json b/vendor/cosmokit/package.json index a250fe3347..0e3aa0692f 100644 --- a/vendor/cosmokit/package.json +++ b/vendor/cosmokit/package.json @@ -1,7 +1,7 @@ { "name": "@deepseek-ai/cosmokit", "description": "A collection of common utilities", - "version": "1.8.3", + "version": "1.8.4", "publishConfig": { "access": "public" }, diff --git a/vendor/group/package.json b/vendor/group/package.json index cf8780b670..98c2e9bd8a 100644 --- a/vendor/group/package.json +++ b/vendor/group/package.json @@ -1,7 +1,7 @@ { "name": "@deepseek-ai/cordis-plugin-group", "description": "Nested plugin group for cordis", - "version": "1.0.2", + "version": "1.0.3", "publishConfig": { "access": "public" }, diff --git a/vendor/hmr/package.json b/vendor/hmr/package.json index 52c42b0551..6cd07604d0 100644 --- a/vendor/hmr/package.json +++ b/vendor/hmr/package.json @@ -1,7 +1,7 @@ { "name": "@deepseek-ai/cordis-plugin-hmr", "description": "Hot Module Replacement Plugin for Cordis", - "version": "1.0.17", + "version": "1.0.18", "publishConfig": { "access": "public" }, diff --git a/vendor/include/package.json b/vendor/include/package.json index dfb7a292c6..fdd41d672d 100644 --- a/vendor/include/package.json +++ b/vendor/include/package.json @@ -1,7 +1,7 @@ { "name": "@deepseek-ai/cordis-plugin-include", "description": "Include files in cordis configurations", - "version": "1.0.7", + "version": "1.0.8", "publishConfig": { "access": "public" }, diff --git a/vendor/loader/package.json b/vendor/loader/package.json index 6ae5a43e9b..28e568c351 100644 --- a/vendor/loader/package.json +++ b/vendor/loader/package.json @@ -1,7 +1,7 @@ { "name": "@deepseek-ai/cordis-plugin-loader", "description": "Plugin loader for cordis", - "version": "1.0.3", + "version": "1.0.4", "publishConfig": { "access": "public" }, diff --git a/vendor/logger-console/package.json b/vendor/logger-console/package.json index 77f2e84f3c..62f0590354 100644 --- a/vendor/logger-console/package.json +++ b/vendor/logger-console/package.json @@ -1,7 +1,7 @@ { "name": "@deepseek-ai/cordis-plugin-logger-console", "description": "Console logger exporter for cordis", - "version": "1.0.2", + "version": "1.0.3", "publishConfig": { "access": "public" }, diff --git a/vendor/schemastery/package.json b/vendor/schemastery/package.json index 92f9b09b82..0f0402276f 100644 --- a/vendor/schemastery/package.json +++ b/vendor/schemastery/package.json @@ -1,7 +1,7 @@ { "name": "@deepseek-ai/schemastery", "description": "Type driven schema validator", - "version": "3.18.2", + "version": "3.18.3", "publishConfig": { "access": "public" }, diff --git a/vendor/timer/package.json b/vendor/timer/package.json index edfd566cac..bb64d6153f 100644 --- a/vendor/timer/package.json +++ b/vendor/timer/package.json @@ -1,7 +1,7 @@ { "name": "@deepseek-ai/cordis-plugin-timer", "description": "Timer service for cordis", - "version": "1.1.4", + "version": "1.1.5", "publishConfig": { "access": "public" },