Compare commits
9
Commits
| Author | SHA1 | Date | |
|---|---|---|---|
|
|
504a01a957 | ||
|
|
199ffe37ba | ||
|
|
f425304f7b | ||
|
|
940aafcadb | ||
|
|
41736cdec5 | ||
|
|
cb7f0878e4 | ||
|
|
72624bae95 | ||
|
|
c38265a00e | ||
|
|
cc4446eecc |
No files matched your search
@@ -1,7 +1,7 @@
|
||||
{
|
||||
"name": "@deepseek-ai/dsh",
|
||||
"description": "dsh CLI: profile launch, plugin management, and configuration inspection",
|
||||
"version": "0.2.1-rc.3",
|
||||
"version": "0.2.1-rc.4",
|
||||
"publishConfig": {
|
||||
"access": "public"
|
||||
},
|
||||
|
||||
@@ -0,0 +1,159 @@
|
||||
/** Account catalog and MCP resource-listing diagnostics keep the shipped ACP profile's stdout JSON-RPC only. */
|
||||
import { once } from 'node:events'
|
||||
import { mkdir, mkdtemp, 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 { PROTOCOL_VERSION } from '@agentclientprotocol/sdk'
|
||||
import { startMockLlmServer } from '@deepseek-ai/dsh-llm-mock-server'
|
||||
import { launchAcpTestAgent, type AgentUnderTest, type LaunchedAcpTestAgent } from '@deepseek-ai/dsh-session-snapshot'
|
||||
import { expect, it } from 'vitest'
|
||||
import { cleanupAcpExampleTest } from './cleanup.ts'
|
||||
|
||||
const repoRoot = fileURLToPath(new URL('../../../../../../', import.meta.url))
|
||||
const binScript = join(repoRoot, 'apps/cli/src/bin.ts')
|
||||
const tsconfigPath = join(repoRoot, 'tsconfig.json')
|
||||
|
||||
/** Parse every stdout line as a JSON-RPC frame; a diagnostic line fails the parse with its leading text. */
|
||||
function jsonRpcFrames(launched: LaunchedAcpTestAgent): Record<string, unknown>[] {
|
||||
const frames = launched.rawStdout().trim().split('\n').map(line => JSON.parse(line) as Record<string, unknown>)
|
||||
for (const frame of frames) expect(frame).toMatchObject({ jsonrpc: '2.0' })
|
||||
return frames
|
||||
}
|
||||
|
||||
it('keeps account model-listing diagnostics on stderr during API-key session creation', async () => {
|
||||
const cwd = await mkdtemp(join(tmpdir(), 'dsh-acp-stdout-'))
|
||||
const token = 'acp-catalog-fixture-token'
|
||||
const requests: Array<{ method: string | undefined; path: string | undefined; token: string | string[] | undefined }> = []
|
||||
const server = createServer((request, response) => {
|
||||
requests.push({ method: request.method, path: request.url, token: request.headers['x-dsh-auth-token'] })
|
||||
request.resume()
|
||||
if (request.method !== 'GET' || request.url !== '/models') {
|
||||
response.writeHead(500).end('unexpected request')
|
||||
return
|
||||
}
|
||||
response.writeHead(200, { 'content-type': 'application/json' }).end(JSON.stringify({
|
||||
data: [
|
||||
{
|
||||
id: 'deepseek-flash', name: 'Account fixture model', input_modalities: ['text'], output_modalities: ['text'],
|
||||
context_window: 1_048_576, max_output_tokens: 393_216, api_capabilities: { anthropic_messages: {} },
|
||||
},
|
||||
{ id: 'deepseek-v4-pro' },
|
||||
],
|
||||
}))
|
||||
})
|
||||
let launched: LaunchedAcpTestAgent | undefined
|
||||
try {
|
||||
server.listen(0, '127.0.0.1')
|
||||
await once(server, 'listening')
|
||||
const address = server.address()
|
||||
if (address === null || typeof address === 'string') throw new Error('account catalog server has no port')
|
||||
const origin = `http://127.0.0.1:${address.port}`
|
||||
await mkdir(join(cwd, '.dsh'))
|
||||
await writeFile(join(cwd, '.dsh', '.credentials.yaml'), JSON.stringify({
|
||||
version: 1,
|
||||
records: {
|
||||
'deepseek-account-platform/default': { kind: 'grant', payload: { version: 1, token, issuer: origin } },
|
||||
},
|
||||
}) + '\n', { mode: 0o600 })
|
||||
const configPath = join(cwd, 'catalog.patch.yml')
|
||||
await writeFile(configPath, JSON.stringify([
|
||||
{ id: 'deepseek-account', config: { platformOrigin: origin, inferenceOrigin: origin, allowLoopbackHttp: true } },
|
||||
{ id: 'llm-deepseek-account', config: { baseURL: `${origin}/anthropic` } },
|
||||
{ id: 'llm-deepseek', config: { baseURL: `${origin}/anthropic`, models: [{ id: 'fixture-api-key-model' }] } },
|
||||
// Catalog discovery requires the account service to have loaded the stored grant.
|
||||
{
|
||||
id: 'acp', inject: ['acpAppStartup', 'deepseekAccount'],
|
||||
config: { provider: 'deepseek-official', model: 'fixture-api-key-model' },
|
||||
},
|
||||
{ id: 'session-persistence-jsonl', config: { root: join(cwd, 'sessions'), compression: 'none' } },
|
||||
]) + '\n')
|
||||
const agent: AgentUnderTest = {
|
||||
binScript: fileURLToPath(new URL('../../../../src/bin.ts', import.meta.url)),
|
||||
configPath,
|
||||
profile: 'acp',
|
||||
tsconfigPath: fileURLToPath(new URL('../../../../../../tsconfig.json', import.meta.url)),
|
||||
}
|
||||
launched = launchAcpTestAgent({
|
||||
agent,
|
||||
cwd,
|
||||
env: { DEEPSEEK_API_KEY: 'acp-fixture-api-key', DEEPSEEK_BASE_URL: `${origin}/anthropic`, DSH_TELEMETRY_DISABLED: '1' },
|
||||
})
|
||||
await launched.client.initialize({ protocolVersion: PROTOCOL_VERSION, clientCapabilities: {} })
|
||||
const created = await launched.client.newSession({ cwd, mcpServers: [] })
|
||||
expect(created.configOptions).toContainEqual(expect.objectContaining({
|
||||
id: 'model', currentValue: JSON.stringify(['deepseek-official', 'fixture-api-key-model']),
|
||||
}))
|
||||
await launched.client.closeSession({ sessionId: created.sessionId })
|
||||
// Closing joins both pipes; receiving a stdout response alone does not drain stderr.
|
||||
await launched.close()
|
||||
|
||||
expect(launched.child.signalCode).toBeNull()
|
||||
expect(launched.child.exitCode).toBe(0)
|
||||
expect(requests).toEqual([{ method: 'GET', path: '/models', token }])
|
||||
const frames = launched.rawStdout().trim().split('\n').map(line => JSON.parse(line) as Record<string, unknown>)
|
||||
expect(frames.length).toBeGreaterThanOrEqual(3)
|
||||
for (const frame of frames) expect(frame).toMatchObject({ jsonrpc: '2.0' })
|
||||
expect(launched.stderr()).toContain(`[llm-deepseek-account] model listing from ${origin}/models loaded 2 model(s), skipped 0 row(s)`)
|
||||
expect(launched.stderr()).toContain('[llm-deepseek-account] model "deepseek-v4-pro" declares no api_capabilities.anthropic_messages')
|
||||
expect(launched.stderr()).not.toContain(token)
|
||||
} finally {
|
||||
const cleanup = await Promise.allSettled([cleanupAcpExampleTest(launched, cwd)])
|
||||
server.closeAllConnections()
|
||||
cleanup.push(...await Promise.allSettled([
|
||||
server.listening ? new Promise<void>((resolve, reject) => server.close((error) => {
|
||||
if (error === undefined) resolve()
|
||||
else reject(error)
|
||||
})) : undefined,
|
||||
]))
|
||||
const failures: unknown[] = []
|
||||
for (const result of cleanup) if (result.status === 'rejected') failures.push(result.reason)
|
||||
if (failures.length > 0) throw new AggregateError(failures, 'ACP catalog test cleanup failed')
|
||||
}
|
||||
})
|
||||
|
||||
it('keeps MCP resource-listing diagnostics off stdout for a tools-only client server', async () => {
|
||||
const cwd = await mkdtemp(join(tmpdir(), 'dsh-acp-stdout-'))
|
||||
const llm = await startMockLlmServer({
|
||||
sequence: ['tool_call_success', 'success'],
|
||||
toolName: 'list_mcp_resources',
|
||||
toolArguments: JSON.stringify({ server: 'fixture' }),
|
||||
})
|
||||
let launched: LaunchedAcpTestAgent | undefined
|
||||
try {
|
||||
const configPath = join(cwd, 'mcp.patch.yml')
|
||||
await writeFile(configPath, JSON.stringify([
|
||||
{ id: 'llm-deepseek', config: { baseURL: llm.baseURL, models: [{ id: 'fixture-api-key-model' }] } },
|
||||
{ id: 'acp', config: { provider: 'deepseek-official', model: 'fixture-api-key-model' } },
|
||||
{ id: 'session-persistence-jsonl', config: { root: join(cwd, 'sessions'), compression: 'none' } },
|
||||
]) + '\n')
|
||||
launched = launchAcpTestAgent({
|
||||
agent: { binScript, configPath, profile: 'acp', tsconfigPath },
|
||||
cwd,
|
||||
env: { DEEPSEEK_API_KEY: 'acp-fixture-api-key', DEEPSEEK_BASE_URL: llm.baseURL, DSH_TELEMETRY_DISABLED: '1' },
|
||||
})
|
||||
await launched.client.initialize({ protocolVersion: PROTOCOL_VERSION, clientCapabilities: {} })
|
||||
// The fixture server advertises only the tools capability.
|
||||
const mcpServer = join(repoRoot, 'packages/mcp/mcp-client/tests/fixture-server.ts')
|
||||
const created = await launched.client.newSession({
|
||||
cwd, mcpServers: [{ name: 'fixture', command: process.execPath, args: [mcpServer], env: [] }],
|
||||
})
|
||||
await expect(launched.client.prompt({
|
||||
sessionId: created.sessionId,
|
||||
prompt: [{ type: 'text', text: 'list the fixture resources' }],
|
||||
})).resolves.toEqual({ stopReason: 'end_turn' })
|
||||
expect(launched.updates).toContainEqual(expect.objectContaining({ sessionUpdate: 'tool_call_update', status: 'completed' }))
|
||||
await launched.client.closeSession({ sessionId: created.sessionId })
|
||||
await launched.close()
|
||||
|
||||
expect(launched.child.exitCode).toBe(0)
|
||||
expect(llm.requests.map(request => request.behavior)).toEqual(['tool_call_success', 'success'])
|
||||
expect(jsonRpcFrames(launched).length).toBeGreaterThanOrEqual(5)
|
||||
} finally {
|
||||
const cleanup = await Promise.allSettled([cleanupAcpExampleTest(launched, cwd), llm.close()])
|
||||
const failures: unknown[] = []
|
||||
for (const result of cleanup) if (result.status === 'rejected') failures.push(result.reason)
|
||||
if (failures.length > 0) throw new AggregateError(failures, 'ACP MCP test cleanup failed')
|
||||
}
|
||||
})
|
||||
@@ -1,7 +1,7 @@
|
||||
{
|
||||
"name": "@deepseek-ai/dsh-desktop-host",
|
||||
"description": "Private Node-mode host process for the Electron desktop application",
|
||||
"version": "0.2.1-rc.3",
|
||||
"version": "0.2.1-rc.4",
|
||||
"private": true,
|
||||
"license": "MIT",
|
||||
"type": "module",
|
||||
|
||||
@@ -1,7 +1,7 @@
|
||||
{
|
||||
"name": "@deepseek-ai/dsh-desktop",
|
||||
"description": "Electron desktop shell for a bundled dsh runtime and external plugins",
|
||||
"version": "0.2.1-rc.3",
|
||||
"version": "0.2.1-rc.4",
|
||||
"private": true,
|
||||
"license": "MIT",
|
||||
"type": "module",
|
||||
|
||||
@@ -1,7 +1,7 @@
|
||||
{
|
||||
"name": "@deepseek-ai/dsh-plugin-market-generator",
|
||||
"description": "Reference generator of plugin market index files from a list of npm packages and Git repositories",
|
||||
"version": "0.2.1-rc.3",
|
||||
"version": "0.2.1-rc.4",
|
||||
"private": true,
|
||||
"type": "module",
|
||||
"scripts": {
|
||||
|
||||
@@ -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.2.1-rc.3",
|
||||
"version": "0.2.1-rc.4",
|
||||
"publishConfig": {
|
||||
"access": "public"
|
||||
},
|
||||
|
||||
+1
-1
@@ -1,6 +1,6 @@
|
||||
{
|
||||
"name": "@deepseek-ai/dsh-root",
|
||||
"version": "0.2.1-rc.3",
|
||||
"version": "0.2.1-rc.4",
|
||||
"license": "MIT",
|
||||
"private": true,
|
||||
"type": "module",
|
||||
|
||||
@@ -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.2.1-rc.3",
|
||||
"version": "0.2.1-rc.4",
|
||||
"publishConfig": {
|
||||
"access": "public"
|
||||
},
|
||||
|
||||
@@ -1,7 +1,7 @@
|
||||
{
|
||||
"name": "@deepseek-ai/dsh-api-account-controller",
|
||||
"description": "Expose safe account operations over authenticated Remote",
|
||||
"version": "0.2.1-rc.3",
|
||||
"version": "0.2.1-rc.4",
|
||||
"publishConfig": {
|
||||
"access": "public"
|
||||
},
|
||||
|
||||
@@ -1,7 +1,7 @@
|
||||
{
|
||||
"name": "@deepseek-ai/dsh-api-gateway",
|
||||
"description": "Typert Remote Host dispatcher and Client API endpoint",
|
||||
"version": "0.2.1-rc.3",
|
||||
"version": "0.2.1-rc.4",
|
||||
"publishConfig": {
|
||||
"access": "public"
|
||||
},
|
||||
|
||||
@@ -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.2.1-rc.3",
|
||||
"version": "0.2.1-rc.4",
|
||||
"publishConfig": {
|
||||
"access": "public"
|
||||
},
|
||||
|
||||
@@ -1,7 +1,7 @@
|
||||
{
|
||||
"name": "@deepseek-ai/dsh-api-remote-access",
|
||||
"description": "Method-level Remote access control for non-owner Peers and the per-Peer access snapshot",
|
||||
"version": "0.2.1-rc.3",
|
||||
"version": "0.2.1-rc.4",
|
||||
"publishConfig": {
|
||||
"access": "public"
|
||||
},
|
||||
|
||||
@@ -1,7 +1,7 @@
|
||||
{
|
||||
"name": "@deepseek-ai/dsh-api-remotes",
|
||||
"description": "Remote BFF assembly for application-selected Host capabilities",
|
||||
"version": "0.2.1-rc.3",
|
||||
"version": "0.2.1-rc.4",
|
||||
"publishConfig": {
|
||||
"access": "public"
|
||||
},
|
||||
|
||||
@@ -1,7 +1,7 @@
|
||||
{
|
||||
"name": "@deepseek-ai/dsh-api-session-controller",
|
||||
"description": "Session Remote commands, cold reads, and live control transport",
|
||||
"version": "0.2.1-rc.3",
|
||||
"version": "0.2.1-rc.4",
|
||||
"publishConfig": {
|
||||
"access": "public"
|
||||
},
|
||||
|
||||
@@ -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.2.1-rc.3",
|
||||
"version": "0.2.1-rc.4",
|
||||
"publishConfig": {
|
||||
"access": "public"
|
||||
},
|
||||
|
||||
@@ -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.2.1-rc.3",
|
||||
"version": "0.2.1-rc.4",
|
||||
"publishConfig": {
|
||||
"access": "public"
|
||||
},
|
||||
|
||||
@@ -1,7 +1,7 @@
|
||||
{
|
||||
"name": "@deepseek-ai/dsh-api-workspace-controller",
|
||||
"description": "Workspace Remote commands and reconnect-safe state transport",
|
||||
"version": "0.2.1-rc.3",
|
||||
"version": "0.2.1-rc.4",
|
||||
"publishConfig": {
|
||||
"access": "public"
|
||||
},
|
||||
|
||||
@@ -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.2.1-rc.3",
|
||||
"version": "0.2.1-rc.4",
|
||||
"publishConfig": {
|
||||
"access": "public"
|
||||
},
|
||||
|
||||
@@ -1,7 +1,7 @@
|
||||
{
|
||||
"name": "@deepseek-ai/dsh-attachment-local",
|
||||
"description": "Private content-addressed DSH_HOME attachment storage",
|
||||
"version": "0.2.1-rc.3",
|
||||
"version": "0.2.1-rc.4",
|
||||
"publishConfig": {
|
||||
"access": "public"
|
||||
},
|
||||
|
||||
@@ -1,7 +1,7 @@
|
||||
{
|
||||
"name": "@deepseek-ai/dsh-attachment",
|
||||
"description": "Durable immutable attachment storage seam for the DeepSeek Harness",
|
||||
"version": "0.2.1-rc.3",
|
||||
"version": "0.2.1-rc.4",
|
||||
"publishConfig": {
|
||||
"access": "public"
|
||||
},
|
||||
|
||||
@@ -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.2.1-rc.3",
|
||||
"version": "0.2.1-rc.4",
|
||||
"publishConfig": {
|
||||
"access": "public"
|
||||
},
|
||||
|
||||
@@ -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.2.1-rc.3",
|
||||
"version": "0.2.1-rc.4",
|
||||
"publishConfig": {
|
||||
"access": "public"
|
||||
},
|
||||
|
||||
@@ -1,7 +1,7 @@
|
||||
{
|
||||
"name": "@deepseek-ai/dsh-config-editor",
|
||||
"description": "Persist plugin configuration through profile patches and Loader reconciliation",
|
||||
"version": "0.2.1-rc.3",
|
||||
"version": "0.2.1-rc.4",
|
||||
"publishConfig": {
|
||||
"access": "public"
|
||||
},
|
||||
|
||||
@@ -1,7 +1,7 @@
|
||||
{
|
||||
"name": "@deepseek-ai/dsh-hmr",
|
||||
"description": "Coordinated module and profile configuration hot reload",
|
||||
"version": "0.2.1-rc.3",
|
||||
"version": "0.2.1-rc.4",
|
||||
"publishConfig": {
|
||||
"access": "public"
|
||||
},
|
||||
|
||||
@@ -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.2.1-rc.3",
|
||||
"version": "0.2.1-rc.4",
|
||||
"publishConfig": {
|
||||
"access": "public"
|
||||
},
|
||||
|
||||
@@ -1,7 +1,7 @@
|
||||
{
|
||||
"name": "@deepseek-ai/dsh-plugin-market",
|
||||
"description": "Configured plugin market indexes for the Web Discover page and the plugin_market agent tool",
|
||||
"version": "0.2.1-rc.3",
|
||||
"version": "0.2.1-rc.4",
|
||||
"publishConfig": {
|
||||
"access": "public"
|
||||
},
|
||||
|
||||
@@ -1,7 +1,7 @@
|
||||
{
|
||||
"name": "@deepseek-ai/dsh-browser-use",
|
||||
"description": "Exclusive named browser-use provider registration",
|
||||
"version": "0.2.1-rc.3",
|
||||
"version": "0.2.1-rc.4",
|
||||
"publishConfig": {
|
||||
"access": "public"
|
||||
},
|
||||
|
||||
@@ -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.2.1-rc.3",
|
||||
"version": "0.2.1-rc.4",
|
||||
"publishConfig": {
|
||||
"access": "public"
|
||||
},
|
||||
|
||||
@@ -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.2.1-rc.3",
|
||||
"version": "0.2.1-rc.4",
|
||||
"publishConfig": {
|
||||
"access": "public"
|
||||
},
|
||||
|
||||
@@ -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.2.1-rc.3",
|
||||
"version": "0.2.1-rc.4",
|
||||
"publishConfig": {
|
||||
"access": "public"
|
||||
},
|
||||
|
||||
@@ -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.2.1-rc.3",
|
||||
"version": "0.2.1-rc.4",
|
||||
"publishConfig": {
|
||||
"access": "public"
|
||||
},
|
||||
|
||||
@@ -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.2.1-rc.3",
|
||||
"version": "0.2.1-rc.4",
|
||||
"publishConfig": {
|
||||
"access": "public"
|
||||
},
|
||||
|
||||
@@ -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, bash runtime variables, URL line)",
|
||||
"version": "0.2.1-rc.3",
|
||||
"version": "0.2.1-rc.4",
|
||||
"publishConfig": {
|
||||
"access": "public"
|
||||
},
|
||||
|
||||
@@ -1,7 +1,7 @@
|
||||
{
|
||||
"name": "@deepseek-ai/dsh-client-connection",
|
||||
"description": "Authenticated RPC transport and generation lifecycle",
|
||||
"version": "0.2.1-rc.3",
|
||||
"version": "0.2.1-rc.4",
|
||||
"publishConfig": {
|
||||
"access": "public"
|
||||
},
|
||||
|
||||
@@ -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.2.1-rc.3",
|
||||
"version": "0.2.1-rc.4",
|
||||
"publishConfig": {
|
||||
"access": "public"
|
||||
},
|
||||
|
||||
@@ -1,7 +1,7 @@
|
||||
{
|
||||
"name": "@deepseek-ai/dsh-client-hmr",
|
||||
"description": "Web client graph synchronization and rebuilt-bundle reload transport",
|
||||
"version": "0.2.1-rc.3",
|
||||
"version": "0.2.1-rc.4",
|
||||
"publishConfig": {
|
||||
"access": "public"
|
||||
},
|
||||
|
||||
@@ -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.2.1-rc.3",
|
||||
"version": "0.2.1-rc.4",
|
||||
"publishConfig": {
|
||||
"access": "public"
|
||||
},
|
||||
|
||||
@@ -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.2.1-rc.3",
|
||||
"version": "0.2.1-rc.4",
|
||||
"publishConfig": {
|
||||
"access": "public"
|
||||
},
|
||||
|
||||
@@ -1,7 +1,7 @@
|
||||
{
|
||||
"name": "@deepseek-ai/dsh-client-product-analytics",
|
||||
"description": "Desktop product event collection and authenticated Host reporting",
|
||||
"version": "0.2.1-rc.3",
|
||||
"version": "0.2.1-rc.4",
|
||||
"publishConfig": {
|
||||
"access": "public"
|
||||
},
|
||||
|
||||
@@ -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.2.1-rc.3",
|
||||
"version": "0.2.1-rc.4",
|
||||
"publishConfig": {
|
||||
"access": "public"
|
||||
},
|
||||
|
||||
@@ -1,7 +1,7 @@
|
||||
{
|
||||
"name": "@deepseek-ai/dsh-client-shortcuts",
|
||||
"description": "Application keyboard command registry and physical-key routing",
|
||||
"version": "0.2.1-rc.3",
|
||||
"version": "0.2.1-rc.4",
|
||||
"publishConfig": {
|
||||
"access": "public"
|
||||
},
|
||||
|
||||
@@ -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.2.1-rc.3",
|
||||
"version": "0.2.1-rc.4",
|
||||
"publishConfig": {
|
||||
"access": "public"
|
||||
},
|
||||
|
||||
@@ -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.2.1-rc.3",
|
||||
"version": "0.2.1-rc.4",
|
||||
"publishConfig": {
|
||||
"access": "public"
|
||||
},
|
||||
|
||||
@@ -1,7 +1,7 @@
|
||||
{
|
||||
"name": "@deepseek-ai/dsh-client-ui-approval",
|
||||
"description": "Approval composer takeover over the scoped Remote Event waterfall",
|
||||
"version": "0.2.1-rc.3",
|
||||
"version": "0.2.1-rc.4",
|
||||
"publishConfig": {
|
||||
"access": "public"
|
||||
},
|
||||
|
||||
@@ -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.2.1-rc.3",
|
||||
"version": "0.2.1-rc.4",
|
||||
"publishConfig": {
|
||||
"access": "public"
|
||||
},
|
||||
|
||||
@@ -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.2.1-rc.3",
|
||||
"version": "0.2.1-rc.4",
|
||||
"publishConfig": {
|
||||
"access": "public"
|
||||
},
|
||||
|
||||
@@ -1,7 +1,7 @@
|
||||
{
|
||||
"name": "@deepseek-ai/dsh-client-ui-chat",
|
||||
"description": "Chat Conversation target, node definitions, renderers, and details surface",
|
||||
"version": "0.2.1-rc.3",
|
||||
"version": "0.2.1-rc.4",
|
||||
"publishConfig": {
|
||||
"access": "public"
|
||||
},
|
||||
|
||||
@@ -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.2.1-rc.3",
|
||||
"version": "0.2.1-rc.4",
|
||||
"publishConfig": {
|
||||
"access": "public"
|
||||
},
|
||||
|
||||
@@ -21,8 +21,8 @@
|
||||
en: 9912b286384c41d7
|
||||
zh: 3e994887c1948677
|
||||
/deepseek-ai-dsh-client-ui-conversation/shell-and-standard-props:
|
||||
en: 626f5095ffbd8018
|
||||
zh: 672a7762384f4caf
|
||||
en: 8165a139b328785a
|
||||
zh: 7a976d4a4af6a018
|
||||
/deepseek-ai-dsh-client-ui-conversation/temporary-composer-entries:
|
||||
en: bb1244310f5c0382
|
||||
zh: 824b84077432b559
|
||||
|
||||
@@ -72,7 +72,7 @@ The context-occupancy button shows a ring and percentage below the input card, a
|
||||
|
||||
With Coding Tools off, the shell hides only Trajectory; other plugin-contributed Views remain available. The View tab bar is hidden when fewer than two Views are available. Turning Coding Tools off while Trajectory is active returns to Chat; stored View preferences and recorded Session data remain intact. Turning it on makes Trajectory available again. View owners receive the available roster so their navigation actions can follow the same visibility.
|
||||
|
||||
While the root-scoped `conversation.session.header.views.actions` list has registrations, a **More conversation views** button with a tooltip follows the View tabs in the tab row. It opens a menu whose rows are that list's registrations. Each receives `entries` (Views outside the header in registration order with `id`, `label`, `pinned`, and `active`; Chat is never listed), `onOpen(id)`, which selects the View in this Session, `onPinnedChange(id, pinned)`, and `onDismiss()`, which closes the menu. The header keeps an in-memory list of unpinned View ids shared by every Session; the tab bar omits unpinned Views and places registered Chat first so it always remains outside More. Plugin reload resets pin choices, and legacy localStorage values are ignored. The tab bar's visibility counts available Views, not pinned ones, so the bar and More stay while every other View is unpinned. Unpinning the active View hides its tab immediately without changing the selected content. More lists only Views outside the header and identifies the current View through `active`. The header reads its available row width, reserves 48px for More and padding, and estimates 120px per tab. Remaining Views keep registration order in More. A single ResizeObserver watches the tab row so window resizing and sidebar expansion update the split; active selection does not change the order. The observer disconnects when the row is removed. If ResizeObserver is unavailable, the initial width calculation still applies without subsequent observation. The More button highlights and names the active View in its tooltip when that View is folded. Individual tabs are not measured. At least one preferred tab remains outside, and long labels truncate with a full-name tooltip. Unregistered View ids remain in the in-memory pin list until plugin reload.
|
||||
While the root-scoped `conversation.session.header.views.actions` list has registrations, a **More conversation views** button with a tooltip follows the View tabs in the tab row. It opens a menu whose rows are that list's registrations. Each receives `entries` (Views outside the header in registration order with `id`, `label`, `pinned`, and `active`; Chat is never listed), `onOpen(id)`, which selects the View in this Session, `onPinnedChange(id, pinned)`, and `onDismiss()`, which closes the menu. The header keeps an in-memory list of unpinned View ids shared by every Session; the tab bar omits unpinned Views and places registered Chat first so it always remains outside More. Plugin reload resets pin choices, and legacy localStorage values are ignored. The tab bar's visibility counts available Views, not pinned ones, so the bar and More stay while every other View is unpinned. Unpinning the active View hides its tab immediately without changing the selected content. More lists only Views outside the header and identifies the current View through `active`. The header reads its available row width, reserves 48px for More and padding, and estimates 120px per tab. Remaining Views keep registration order in More. A single ResizeObserver watches the tab row so window resizing and sidebar expansion update the split; active selection does not change the order. The observer disconnects when the row is removed. If ResizeObserver is unavailable, the initial width calculation still applies without subsequent observation. The More button highlights when the active View is folded. Each tab label estimates its text width from the glyphs; its full-name tooltip appears only when that estimate exceeds the 88px cell. At least one preferred tab remains outside. Unregistered View ids remain in the in-memory pin list until plugin reload.
|
||||
|
||||
The composer registers the File command action and owns its label, availability, and native file-dialog callback. Menu availability and invocation both consult the mounted composer's current attachment-intake policy. Unmounting or locking the composer disables that action; disposing the plugin removes its registration. The callback binding stays inside the input module.
|
||||
|
||||
|
||||
@@ -72,7 +72,7 @@ Queue 预览启用空白折叠和文档边缘 trim,保留 emoji,并使用 CS
|
||||
|
||||
关闭代码工作工具时,外壳仅隐藏 Trajectory;其他插件贡献的 View 仍然可用。可用 View 少于两个时隐藏 View 标签栏。在 Trajectory 激活时关闭代码工作工具会返回 Chat;已保存的 View 偏好和 Session 记录保持不变。开启后,Trajectory 恢复可用。View 所有者接收可用列表,使导航操作跟随相同的可见性。
|
||||
|
||||
root 作用域的 `conversation.session.header.views.actions` list 有注册项时,标签行中的 View 标签之后显示带提示框的**更多会话视图**按钮。它打开的菜单以该 list 的注册项为菜单行。每个注册项接收 `entries`(按注册顺序的头部之外的 View,含 `id`、`label`、`pinned` 与 `active`;不含 Chat)、在本 Session 选择 View 的 `onOpen(id)`、`onPinnedChange(id, pinned)`,以及关闭菜单的 `onDismiss()`。头部在内存中保存所有 Session 共用的已收起 View id 列表;标签栏不显示已收起的 View,并将已注册的 Chat 放在首位,确保它始终留在更多菜单外。插件重新加载时 Pin 选择重置,不读取旧 localStorage 值。标签栏是否显示按可用 View 计算,不按已固定的 View 计算,因此其他 View 全部收起时,标签栏和“更多”仍然显示。收起当前激活的 View 会立即隐藏其标签,但不会切走其内容。更多菜单仅包含头部之外的 View,通过 `active` 标识当前 View。头部读取当前行可用宽度,为更多按钮与内边距预留 48px,每个标签估算 120px,其余 View 按注册顺序进入更多。单个 ResizeObserver 观察标签行,使窗口缩放和侧栏展开能够更新分组;当前选中项变化不改变顺序。标签行移除时断开观察。如果环境没有 ResizeObserver,仍按初始宽度计算,但不继续观察。当前 View 收起时,更多按钮高亮并在提示框中显示其名称。不逐项测量标签。至少保留一个优先展示的外部标签,长标题截断并通过提示框提供全名。未注册 View 的 id 保留在内存 Pin 列表中,直到插件重新加载。
|
||||
root 作用域的 `conversation.session.header.views.actions` list 有注册项时,标签行中的 View 标签之后显示带提示框的**更多会话视图**按钮。它打开的菜单以该 list 的注册项为菜单行。每个注册项接收 `entries`(按注册顺序的头部之外的 View,含 `id`、`label`、`pinned` 与 `active`;不含 Chat)、在本 Session 选择 View 的 `onOpen(id)`、`onPinnedChange(id, pinned)`,以及关闭菜单的 `onDismiss()`。头部在内存中保存所有 Session 共用的已收起 View id 列表;标签栏不显示已收起的 View,并将已注册的 Chat 放在首位,确保它始终留在更多菜单外。插件重新加载时 Pin 选择重置,不读取旧 localStorage 值。标签栏是否显示按可用 View 计算,不按已固定的 View 计算,因此其他 View 全部收起时,标签栏和“更多”仍然显示。收起当前激活的 View 会立即隐藏其标签,但不会切走其内容。更多菜单仅包含头部之外的 View,通过 `active` 标识当前 View。头部读取当前行可用宽度,为更多按钮与内边距预留 48px,每个标签估算 120px,其余 View 按注册顺序进入更多。单个 ResizeObserver 观察标签行,使窗口缩放和侧栏展开能够更新分组;当前选中项变化不改变顺序。标签行移除时断开观察。如果环境没有 ResizeObserver,仍按初始宽度计算,但不继续观察。当前 View 收起时,更多按钮高亮。每个标签按字符宽度估算文本宽度;只有估算结果超过 88px 单元格时,才通过提示框提供全名。至少保留一个优先展示的外部标签。未注册 View 的 id 保留在内存 Pin 列表中,直到插件重新加载。
|
||||
|
||||
输入框注册「文件」命令动作,负责其标题、可用性和原生文件选择器回调。菜单可用性与实际调用都读取已挂载输入框当前的附件接收策略。输入框卸载或锁定后该动作不可用,插件 dispose(资源释放)时移除注册。回调绑定留在输入模块内部。
|
||||
|
||||
|
||||
@@ -1,7 +1,7 @@
|
||||
{
|
||||
"name": "@deepseek-ai/dsh-client-ui-conversation",
|
||||
"description": "Target-neutral Conversation assembly, shell, composer, queue, and view navigation",
|
||||
"version": "0.2.1-rc.3",
|
||||
"version": "0.2.1-rc.4",
|
||||
"publishConfig": {
|
||||
"access": "public"
|
||||
},
|
||||
|
||||
@@ -79,7 +79,6 @@ export const zh = {
|
||||
'hero.chooseWorkspace': '选择工作区',
|
||||
'session.hierarchy': '会话层级',
|
||||
'session.moreViews': '更多会话视图',
|
||||
'session.moreViewsCurrent': '更多会话视图 · {name}',
|
||||
'todo.title': '任务',
|
||||
'todo.progress.done': '{done} 已完成',
|
||||
'todo.progress.active': '{active} 进行中',
|
||||
@@ -461,7 +460,6 @@ export const en = {
|
||||
'hero.chooseWorkspace': 'Choose workspace',
|
||||
'session.hierarchy': 'Session hierarchy',
|
||||
'session.moreViews': 'More conversation views',
|
||||
'session.moreViewsCurrent': 'More conversation views · {name}',
|
||||
'todo.title': 'To-dos',
|
||||
'todo.progress.done': '{done} completed',
|
||||
'todo.progress.active': '{active} in progress',
|
||||
|
||||
@@ -43,6 +43,29 @@ function ViewsMoreMenu({ label, current, entries, onOpen, onPinnedChange, render
|
||||
)
|
||||
}
|
||||
|
||||
/** Approximate 13px text advance: full-width glyphs take one em, other glyphs about half. */
|
||||
const WIDE_GLYPH = /[\u1100-\u115F\u2E80-\uA4CF\uAC00-\uD7A3\uF900-\uFAFF\uFE30-\uFE4F\uFF00-\uFF60\uFFE0-\uFFE6]/u
|
||||
const WIDE_GLYPH_WIDTH = 13
|
||||
const NARROW_GLYPH_WIDTH = 7
|
||||
/** Mirrors the `.tabLabel` max-width in `ConversationRoot.module.css`. */
|
||||
const TAB_LABEL_MAX_WIDTH = 88
|
||||
|
||||
/** Estimate whether a View tab label exceeds its 88px cell. */
|
||||
function labelNeedsTooltip(label: string): boolean {
|
||||
let width = 0
|
||||
for (const glyph of label) width += WIDE_GLYPH.test(glyph) ? WIDE_GLYPH_WIDTH : NARROW_GLYPH_WIDTH
|
||||
return width > TAB_LABEL_MAX_WIDTH
|
||||
}
|
||||
|
||||
/** One View tab label; its full-name tooltip is offered only when the text is expected to overflow. */
|
||||
function ViewTabLabel({ label }: { readonly label: string }) {
|
||||
return (
|
||||
<Tooltip label={label} portal disabled={!labelNeedsTooltip(label)}>
|
||||
<span className={css.tabLabel}>{label}</span>
|
||||
</Tooltip>
|
||||
)
|
||||
}
|
||||
|
||||
interface Breadcrumb {
|
||||
readonly id: SessionId
|
||||
readonly displayTitle: string
|
||||
@@ -205,13 +228,13 @@ export function ConversationSessionHeader({
|
||||
className={clsx(css.tab, viewTab.id === active?.id && css.tabActive)}
|
||||
onClick={() => { selectView(viewTab.id) }}
|
||||
>
|
||||
<Tooltip label={viewTab.label} portal><span className={css.tabLabel}>{viewTab.label}</span></Tooltip>
|
||||
<ViewTabLabel label={viewTab.label} />
|
||||
</button>
|
||||
))}
|
||||
</div>
|
||||
{hasEntryActions && (
|
||||
<ViewsMoreMenu
|
||||
label={currentInMore && active !== undefined ? t('session.moreViewsCurrent', { name: active.label }) : t('session.moreViews')}
|
||||
label={t('session.moreViews')}
|
||||
current={currentInMore}
|
||||
entries={moreTabs.map(viewTab => ({
|
||||
id: viewTab.id, label: viewTab.label,
|
||||
|
||||
@@ -2,7 +2,7 @@
|
||||
import type { GlobalStandardProps, PropsRuntime } from '@deepseek-ai/dsh-client-ui-slots'
|
||||
import { afterEach, beforeEach, describe, expect, it, vi } from 'vitest'
|
||||
import { createContext, useContext, type ReactNode } from 'react'
|
||||
import { act, cleanup, fireEvent, render, within } from '@testing-library/react'
|
||||
import { act, cleanup, fireEvent, render, screen, within } from '@testing-library/react'
|
||||
import type { Context } from '@deepseek-ai/cordis'
|
||||
import type { SessionListState, SessionSnapshot } from '@deepseek-ai/dsh-api-session-controller/client'
|
||||
import type { WorkspaceSnapshot, WorkspaceView } from '@deepseek-ai/dsh-api-workspace-controller/client'
|
||||
@@ -735,6 +735,29 @@ describe('ConversationRoot resident composer', () => {
|
||||
expect(b.view.queryByRole('menu')).toBeNull()
|
||||
})
|
||||
|
||||
it('offers a View tab tooltip only when the label is expected to overflow', () => {
|
||||
const b = mount(sessionSnapshotOf(), undefined, undefined, {
|
||||
viewTabs: [
|
||||
{ id: 'chat', label: 'Chat' },
|
||||
{ id: 'short', label: '轨迹' },
|
||||
{ id: 'long-cjk', label: '很长的视图名称' },
|
||||
{ id: 'long-latin', label: 'A very long view name' },
|
||||
],
|
||||
headerOnly: true,
|
||||
})
|
||||
const tooltipFor = (label: string): string | null => {
|
||||
const span = within(b.view.getByRole('tab', { name: label })).getByText(label)
|
||||
fireEvent.mouseEnter(span)
|
||||
const tooltip = screen.queryByRole('tooltip', { hidden: true })?.textContent ?? null
|
||||
fireEvent.mouseLeave(span)
|
||||
return tooltip
|
||||
}
|
||||
expect(tooltipFor('Chat')).toBeNull()
|
||||
expect(tooltipFor('轨迹')).toBeNull()
|
||||
expect(tooltipFor('很长的视图名称')).toBe('很长的视图名称')
|
||||
expect(tooltipFor('A very long view name')).toBe('A very long view name')
|
||||
})
|
||||
|
||||
it('reuses the width budget on View roster and selection changes without a window resize listener', () => {
|
||||
let width = 480
|
||||
const readWidth = vi.spyOn(HTMLElement.prototype, 'clientWidth', 'get').mockImplementation(() => width)
|
||||
@@ -752,7 +775,7 @@ describe('ConversationRoot resident composer', () => {
|
||||
act(() => { b.actionsOwner().onOpen('inspector') })
|
||||
expect(external()).toEqual(['Chat', 'Trajectory', 'Timeline'])
|
||||
expect(b.actionsOwner().entries.find(entry => entry.id === 'inspector')?.active).toBe(true)
|
||||
expect(b.view.getByRole('button', { name: '更多会话视图 · Inspector' })).toBeTruthy()
|
||||
expect(b.view.getByRole('button', { name: zh['session.moreViews'] })).toBeTruthy()
|
||||
const reads = readWidth.mock.calls.length
|
||||
width = 1000
|
||||
fireEvent(window, new Event('resize'))
|
||||
@@ -779,7 +802,7 @@ describe('ConversationRoot resident composer', () => {
|
||||
width = 300
|
||||
act(() => { fireResize(row) })
|
||||
expect(external()).toEqual(['chat', 'trajectory'])
|
||||
fireEvent.click(b.view.getByRole('button', { name: '更多会话视图 · notes' }))
|
||||
fireEvent.click(b.view.getByRole('button', { name: zh['session.moreViews'] }))
|
||||
expect(b.actionsOwner().entries.map(entry => entry.id)).toEqual(['timeline', 'inspector', 'notes'])
|
||||
expect(b.actionsOwner().entries.find(entry => entry.id === 'notes')?.active).toBe(true)
|
||||
width = 1000
|
||||
|
||||
@@ -1,7 +1,7 @@
|
||||
{
|
||||
"name": "@deepseek-ai/dsh-client-ui-deepseek-model-label-1017",
|
||||
"description": "Temporary 1017 release badge for official DeepSeek Flash model labels",
|
||||
"version": "0.2.1-rc.3",
|
||||
"version": "0.2.1-rc.4",
|
||||
"publishConfig": {
|
||||
"access": "public"
|
||||
},
|
||||
|
||||
@@ -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.2.1-rc.3",
|
||||
"version": "0.2.1-rc.4",
|
||||
"publishConfig": {
|
||||
"access": "public"
|
||||
},
|
||||
|
||||
@@ -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.2.1-rc.3",
|
||||
"version": "0.2.1-rc.4",
|
||||
"publishConfig": {
|
||||
"access": "public"
|
||||
},
|
||||
|
||||
@@ -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.2.1-rc.3",
|
||||
"version": "0.2.1-rc.4",
|
||||
"publishConfig": {
|
||||
"access": "public"
|
||||
},
|
||||
|
||||
@@ -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.2.1-rc.3",
|
||||
"version": "0.2.1-rc.4",
|
||||
"publishConfig": {
|
||||
"access": "public"
|
||||
},
|
||||
|
||||
@@ -1,6 +1,6 @@
|
||||
{
|
||||
"name": "@deepseek-ai/dsh-client-ui-entry-customization",
|
||||
"version": "0.2.1-rc.3",
|
||||
"version": "0.2.1-rc.4",
|
||||
"description": "Customize plugin entries in the left sidebar, conversation views, and right sidebar, and quickly create new plugins.",
|
||||
"publishConfig": { "access": "public" },
|
||||
"repository": {
|
||||
|
||||
@@ -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.2.1-rc.3",
|
||||
"version": "0.2.1-rc.4",
|
||||
"publishConfig": {
|
||||
"access": "public"
|
||||
},
|
||||
|
||||
@@ -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.2.1-rc.3",
|
||||
"version": "0.2.1-rc.4",
|
||||
"publishConfig": {
|
||||
"access": "public"
|
||||
},
|
||||
|
||||
@@ -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.2.1-rc.3",
|
||||
"version": "0.2.1-rc.4",
|
||||
"type": "module",
|
||||
"main": "lib/index.js",
|
||||
"types": "lib/types/index.d.ts",
|
||||
|
||||
@@ -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.2.1-rc.3",
|
||||
"version": "0.2.1-rc.4",
|
||||
"publishConfig": {
|
||||
"access": "public"
|
||||
},
|
||||
|
||||
@@ -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.2.1-rc.3",
|
||||
"version": "0.2.1-rc.4",
|
||||
"publishConfig": {
|
||||
"access": "public"
|
||||
},
|
||||
|
||||
@@ -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.2.1-rc.3",
|
||||
"version": "0.2.1-rc.4",
|
||||
"publishConfig": {
|
||||
"access": "public"
|
||||
},
|
||||
|
||||
@@ -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.2.1-rc.3",
|
||||
"version": "0.2.1-rc.4",
|
||||
"publishConfig": {
|
||||
"access": "public"
|
||||
},
|
||||
|
||||
@@ -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.2.1-rc.3",
|
||||
"version": "0.2.1-rc.4",
|
||||
"publishConfig": {
|
||||
"access": "public"
|
||||
},
|
||||
|
||||
@@ -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.2.1-rc.3",
|
||||
"version": "0.2.1-rc.4",
|
||||
"publishConfig": {
|
||||
"access": "public"
|
||||
},
|
||||
|
||||
@@ -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.2.1-rc.3",
|
||||
"version": "0.2.1-rc.4",
|
||||
"publishConfig": {
|
||||
"access": "public"
|
||||
},
|
||||
|
||||
@@ -1,7 +1,7 @@
|
||||
{
|
||||
"name": "@deepseek-ai/dsh-client-ui-plugin-market",
|
||||
"description": "Discover tab of the dsh web Plugins page: browse configured plugin market indexes and install their bundles",
|
||||
"version": "0.2.1-rc.3",
|
||||
"version": "0.2.1-rc.4",
|
||||
"publishConfig": {
|
||||
"access": "public"
|
||||
},
|
||||
|
||||
@@ -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.2.1-rc.3",
|
||||
"version": "0.2.1-rc.4",
|
||||
"publishConfig": {
|
||||
"access": "public"
|
||||
},
|
||||
|
||||
@@ -1,7 +1,7 @@
|
||||
{
|
||||
"name": "@deepseek-ai/dsh-client-ui-reference",
|
||||
"description": "Unified Web @file and @session reference source",
|
||||
"version": "0.2.1-rc.3",
|
||||
"version": "0.2.1-rc.4",
|
||||
"publishConfig": {
|
||||
"access": "public"
|
||||
},
|
||||
|
||||
@@ -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.2.1-rc.3",
|
||||
"version": "0.2.1-rc.4",
|
||||
"publishConfig": {
|
||||
"access": "public"
|
||||
},
|
||||
|
||||
@@ -1,7 +1,7 @@
|
||||
{
|
||||
"name": "@deepseek-ai/dsh-client-ui-schedule",
|
||||
"description": "Host task management page and Session reminder catalog",
|
||||
"version": "0.2.1-rc.3",
|
||||
"version": "0.2.1-rc.4",
|
||||
"type": "module",
|
||||
"main": "lib/index.js",
|
||||
"types": "lib/types/index.d.ts",
|
||||
|
||||
@@ -1,7 +1,7 @@
|
||||
{
|
||||
"name": "@deepseek-ai/dsh-client-ui-secret-mask",
|
||||
"description": "Web display masking for recognized credentials in sent user text",
|
||||
"version": "0.2.1-rc.3",
|
||||
"version": "0.2.1-rc.4",
|
||||
"publishConfig": {
|
||||
"access": "public"
|
||||
},
|
||||
|
||||
@@ -1,7 +1,7 @@
|
||||
{
|
||||
"name": "@deepseek-ai/dsh-client-ui-session",
|
||||
"description": "Session Controller adapter for React and session-scoped slots",
|
||||
"version": "0.2.1-rc.3",
|
||||
"version": "0.2.1-rc.4",
|
||||
"publishConfig": {
|
||||
"access": "public"
|
||||
},
|
||||
|
||||
@@ -1,7 +1,7 @@
|
||||
{
|
||||
"name": "@deepseek-ai/dsh-client-ui-settings-account",
|
||||
"description": "Manage DeepSeek login and open Platform billing pages",
|
||||
"version": "0.2.1-rc.3",
|
||||
"version": "0.2.1-rc.4",
|
||||
"publishConfig": {
|
||||
"access": "public"
|
||||
},
|
||||
|
||||
@@ -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.2.1-rc.3",
|
||||
"version": "0.2.1-rc.4",
|
||||
"publishConfig": {
|
||||
"access": "public"
|
||||
},
|
||||
|
||||
@@ -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.2.1-rc.3",
|
||||
"version": "0.2.1-rc.4",
|
||||
"publishConfig": {
|
||||
"access": "public"
|
||||
},
|
||||
|
||||
@@ -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.2.1-rc.3",
|
||||
"version": "0.2.1-rc.4",
|
||||
"publishConfig": {
|
||||
"access": "public"
|
||||
},
|
||||
|
||||
@@ -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.2.1-rc.3",
|
||||
"version": "0.2.1-rc.4",
|
||||
"publishConfig": {
|
||||
"access": "public"
|
||||
},
|
||||
|
||||
@@ -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.2.1-rc.3",
|
||||
"version": "0.2.1-rc.4",
|
||||
"publishConfig": {
|
||||
"access": "public"
|
||||
},
|
||||
|
||||
@@ -1,7 +1,7 @@
|
||||
{
|
||||
"name": "@deepseek-ai/dsh-client-ui-settings-session-log",
|
||||
"description": "General settings control for Session-log upload with DeepSeek API requests",
|
||||
"version": "0.2.1-rc.3",
|
||||
"version": "0.2.1-rc.4",
|
||||
"publishConfig": {
|
||||
"access": "public"
|
||||
},
|
||||
|
||||
@@ -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.2.1-rc.3",
|
||||
"version": "0.2.1-rc.4",
|
||||
"publishConfig": {
|
||||
"access": "public"
|
||||
},
|
||||
|
||||
@@ -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.2.1-rc.3",
|
||||
"version": "0.2.1-rc.4",
|
||||
"publishConfig": {
|
||||
"access": "public"
|
||||
},
|
||||
|
||||
@@ -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.2.1-rc.3",
|
||||
"version": "0.2.1-rc.4",
|
||||
"publishConfig": {
|
||||
"access": "public"
|
||||
},
|
||||
|
||||
@@ -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.2.1-rc.3",
|
||||
"version": "0.2.1-rc.4",
|
||||
"publishConfig": {
|
||||
"access": "public"
|
||||
},
|
||||
|
||||
@@ -1,7 +1,7 @@
|
||||
{
|
||||
"name": "@deepseek-ai/dsh-client-ui-shortcuts",
|
||||
"description": "Keyboard shortcut reference, recording, and local preference editing",
|
||||
"version": "0.2.1-rc.3",
|
||||
"version": "0.2.1-rc.4",
|
||||
"publishConfig": {
|
||||
"access": "public"
|
||||
},
|
||||
|
||||
@@ -1,7 +1,7 @@
|
||||
{
|
||||
"name": "@deepseek-ai/dsh-client-ui-sidebar-browser",
|
||||
"description": "Sandboxed Web browser tabs for the right Sidebar",
|
||||
"version": "0.2.1-rc.3",
|
||||
"version": "0.2.1-rc.4",
|
||||
"publishConfig": {
|
||||
"access": "public"
|
||||
},
|
||||
|
||||
@@ -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.2.1-rc.3",
|
||||
"version": "0.2.1-rc.4",
|
||||
"publishConfig": {
|
||||
"access": "public"
|
||||
},
|
||||
|
||||
@@ -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.2.1-rc.3",
|
||||
"version": "0.2.1-rc.4",
|
||||
"publishConfig": {
|
||||
"access": "public"
|
||||
},
|
||||
|
||||
@@ -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.2.1-rc.3",
|
||||
"version": "0.2.1-rc.4",
|
||||
"publishConfig": {
|
||||
"access": "public"
|
||||
},
|
||||
|
||||
@@ -1,7 +1,7 @@
|
||||
{
|
||||
"name": "@deepseek-ai/dsh-client-ui-sidebar-terminal",
|
||||
"description": "Interactive shell tabs for the right Sidebar",
|
||||
"version": "0.2.1-rc.3",
|
||||
"version": "0.2.1-rc.4",
|
||||
"publishConfig": {
|
||||
"access": "public"
|
||||
},
|
||||
|
||||
@@ -1,7 +1,7 @@
|
||||
{
|
||||
"name": "@deepseek-ai/dsh-client-ui-sidebar",
|
||||
"description": "Sidebar plugin: session multi-level tree, search, grouping, state dots",
|
||||
"version": "0.2.1-rc.3",
|
||||
"version": "0.2.1-rc.4",
|
||||
"publishConfig": {
|
||||
"access": "public"
|
||||
},
|
||||
|
||||
@@ -1,7 +1,7 @@
|
||||
{
|
||||
"name": "@deepseek-ai/dsh-client-ui-skill",
|
||||
"description": "Web skill references and the dedicated skill tool row",
|
||||
"version": "0.2.1-rc.3",
|
||||
"version": "0.2.1-rc.4",
|
||||
"publishConfig": {
|
||||
"access": "public"
|
||||
},
|
||||
|
||||
@@ -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.2.1-rc.3",
|
||||
"version": "0.2.1-rc.4",
|
||||
"publishConfig": {
|
||||
"access": "public"
|
||||
},
|
||||
|
||||
@@ -1,7 +1,7 @@
|
||||
{
|
||||
"name": "@deepseek-ai/dsh-client-ui-subagent",
|
||||
"description": "Subagent conversation catalog, continuation routing UI, and '@' reference source",
|
||||
"version": "0.2.1-rc.3",
|
||||
"version": "0.2.1-rc.4",
|
||||
"publishConfig": {
|
||||
"access": "public"
|
||||
},
|
||||
|
||||
@@ -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.2.1-rc.3",
|
||||
"version": "0.2.1-rc.4",
|
||||
"publishConfig": {
|
||||
"access": "public"
|
||||
},
|
||||
|
||||
Loaded 100 of 369 files, more files were not shown because too many files have changed in this diff.
Show more
Reference in new issue
Block a user