Merge feat/creation-recommendations into plugin recommendation experiment

This commit is contained in:
ZiyaZhang committed 2026-10-22 06:50:25 -07:00
commit c6d9a964d3
193 files changed
+5786 -3181

No files matched your search

-4
View File
@@ -234,10 +234,6 @@ describe('client bundle purity gate', () => {
expect(() => resolveId('@deepseek-ai/dsh-spill-policy/notice/internal')).toThrow(/purity/)
})
it('inlines the zero-dependency dsh-action fence utility', () => {
expect(resolveId('@deepseek-ai/dsh-util-action-block')).toBeNull()
})
it('inlines the stateless file-drag entry without admitting its subpaths or UI plugin', () => {
expect(resolveId('@deepseek-ai/dsh-util-file-drag')).toBeNull()
expect(() => resolveId('@deepseek-ai/dsh-util-file-drag/internal')).toThrow(/purity/)
-1
View File
@@ -90,7 +90,6 @@ const PACKAGE_LIBRARIES: Readonly<Record<string, string>> = {
'packages/test-support/remote-mock': 'Browser-side test infrastructure; mounts nothing into a product composition.',
'packages/typert/generator': 'Build-time generator run outside any agent runtime.',
'packages/typert/protocol': 'Compiler-independent protocol declarations.',
'packages/util/action-block': 'Zero-dependency fenced-block parser; exports helpers without a plugin entry.',
'packages/util/atomic-write': 'Zero-dependency filesystem write utility.',
'packages/util/brand': 'Stateless nominal-string and canonical-key constructors.',
'packages/util/crypto': 'Zero-dependency identifier minting utility.',
+2 -2
View File
@@ -48,9 +48,9 @@ const MAX_DECL_CHARS = 1200
* share that hands down a subsystem instead of a share, and prose that grew
* into a manual. Every report also lists one line per standard prop seat of its
* scope, so the widest Session-scope slot (`tool.call.toolview`, with the
* global and Session access seats) sets the current 122.
* global and Session access seats) sets the current 123.
*/
const MAX_ENTRY_LINES = 122
const MAX_ENTRY_LINES = 123
/** One register-call option as the catalog teaches it. */
interface OptionDoc {
+5 -4
View File
@@ -60,7 +60,7 @@ export const SERVICE_PAGE: Record<string, string> = {
productAnalytics: 'product-telemetry.md',
connection: 'web-server.md',
pluginManager: 'boot.md',
creationRecommendations: 'boot.md',
actionCards: 'boot.md',
pluginRecommendations: 'boot.md',
pluginMarket: 'boot.md',
pluginRegistryProbe: 'boot.md',
@@ -906,9 +906,10 @@ export const FOUNDATION_TYPE_NAMES: ReadonlySet<string> = new Set([
/** Project types deliberately documented outside the subsystems catalog. */
export const TYPE_LINK_EXEMPTIONS: Readonly<Record<string, string>> = {
CreationActionResult: 'packages/experimental/creation-recommendations/README.md',
CreationSlot: 'packages/experimental/creation-recommendations/README.md',
RecommendationActionResult: 'packages/experimental/plugin-recommendations/README.md',
ActionCardDecision: 'packages/experimental/action-cards/README.md',
ActionCardKind: 'packages/experimental/action-cards/README.md',
ActionCardResult: 'packages/experimental/action-cards/README.md',
ActionCardView: 'packages/experimental/action-cards/README.md',
RecommendationDetails: 'packages/experimental/plugin-recommendations/README.md',
ProductEvent: 'Desktop event fields are owned by packages/client/product-analytics/README.md and src/events.ts',
ConnectionFetchHandler: 'shared Fetch dispatch is owned by packages/client/connection/src/rpc.ts',
+5 -5
View File
@@ -108,12 +108,12 @@ const GROUP_ORDER = [
const SERVICE_ROLES: ServiceRole[] = [
{
key: 'creationRecommendations',
pkg: 'experimental-creation-recommendations',
title: 'Explicit-need interface creation',
key: 'actionCards',
pkg: 'experimental-action-cards',
title: 'Optional action cards',
mode: 'service',
consumers: ['experimental-client-ui-creation-recommendations'],
note: 'Starts a Creator after a human choice and owns installation and removal of the new bundle.',
consumers: ['experimental-creation-recommendations', 'experimental-client-ui-action-cards'],
note: 'Owns the card tool, card state, user actions and status notices; card kinds register their actions and handlers.',
},
{
key: 'pluginRecommendations',
+15
View File
@@ -43,6 +43,8 @@ import SubagentRuntime from '@deepseek-ai/dsh-subagent'
import type { SubagentProvider } from '@deepseek-ai/dsh-subagent'
import * as ToolSubagentControl from '@deepseek-ai/dsh-tool-subagent-control'
import SkillRegistry from '@deepseek-ai/dsh-skill'
import ActionCards from '@deepseek-ai/dsh-experimental-action-cards'
import RemoteAccess from '@deepseek-ai/dsh-api-remote-access'
import * as SkillFileSystem from '@deepseek-ai/dsh-skill-filesystem'
import LocalJobRegistry from '@deepseek-ai/dsh-jobs-local'
import * as ToolAskUser from '@deepseek-ai/dsh-tool-ask-user'
@@ -239,6 +241,19 @@ const TOOL_PACKAGES: ToolPackage[] = [
})
},
},
{
pkg: '@deepseek-ai/dsh-experimental-action-cards',
dir: 'action-cards',
source: 'packages/experimental/action-cards/src/index.ts',
requires: ['ctx.tools', 'ctx.agents', 'ctx.sessionProjections', 'ctx.remoteAccess'],
writes: ['tool/call', 'tool/result', 'plugin:action-cards/decision', 'user/message'],
async mount(ctx) {
await ctx.plugin(AgentRegistry)
await ctx.plugin(RemoteAccess)
await ctx.plugin(ActionCards)
},
note: 'Declared only to an Agent that loaded the skill of a registered card kind; the kind packages register their actions, and the Personalized pages bundle supplies the only shipped kind.',
},
{
pkg: '@deepseek-ai/dsh-tool-ask-user',
dir: 'tool-ask-user',
+2
View File
@@ -49,6 +49,7 @@ describe('release families', () => {
expect(members
.filter(member => member.directory.startsWith('packages/experimental/'))
.map(member => member.name)).toEqual([
'@deepseek-ai/dsh-experimental-action-cards',
'@deepseek-ai/dsh-experimental-agent-team-profile',
'@deepseek-ai/dsh-experimental-agent-team',
'@deepseek-ai/dsh-experimental-api-speech-to-text',
@@ -59,6 +60,7 @@ describe('release families', () => {
'@deepseek-ai/dsh-experimental-browser-use-runtime',
'@deepseek-ai/dsh-experimental-browser-use-stagehand-native',
'@deepseek-ai/dsh-experimental-claude-code-mods',
'@deepseek-ai/dsh-experimental-client-ui-action-cards',
'@deepseek-ai/dsh-experimental-client-ui-agent-team',
'@deepseek-ai/dsh-experimental-client-ui-claude-code-mods',
'@deepseek-ai/dsh-experimental-client-ui-cot-translation',
@@ -36,7 +36,6 @@ const NO_MODEL_EXPERIENCE_SECTION: Readonly<Record<string, string>> = {
'packages/util/home-paths': 'The package only resolves harness-owned host paths; model-facing consumers own any rendered use.',
'packages/util/launch-environment': 'The package only resolves host environment values; model-facing consumers own any rendered use.',
'packages/util/workspace-path': 'The package only formats Workspace paths for browser UI; it never constructs model input.',
'packages/util/action-block': 'The package only parses and hides fenced blocks in answer text; the card experiments that consume it own the model-facing contract.',
'packages/util/values': 'The package only validates, snapshots, compares, freezes, or rejects caller-owned values; consumers own every model-facing use.',
'packages/boot/official-bundles': 'The package only lists bundle package names and their display metadata; the loaded plugin tree owns model context.',
'packages/util/code-language': 'The package only maps a filename suffix to a syntax-highlighting language id; the read consumer owns the persisted hint.',
@@ -57,8 +56,9 @@ const SENTENCE_MODEL_EXPERIENCE: Readonly<Record<string, SentenceContract>> = {
'packages/experimental/speech-to-text-sensevoice': { kind: 'none', reason: 'Local recognition returns transient text without modifying model context.' },
'packages/experimental/client-ui-voice-input': { kind: 'none', reason: 'Inserts reviewable text into the unsent draft without submitting to the Agent.' },
'packages/experimental/plugin-market-bundle': { kind: 'indirect', reason: 'Mounts the pluginMarket service, which lets the Creator preset register the plugin_market tool documented in packages/boot/plugin-market.' },
'packages/experimental/client-ui-creation-recommendations': { kind: 'indirect', reason: 'The card starts a Creator through the Host creation service; the Host owns its logged task and tool schema.' },
'packages/experimental/client-ui-plugin-recommendations': { kind: 'indirect', reason: 'The card calls the Host recommendation service, which owns the skill and the logged status notice.' },
'packages/experimental/client-ui-action-cards': { kind: 'indirect', reason: 'Card actions go to the Host card service, which owns the logged tool, decisions and status notice.' },
'packages/experimental/client-ui-creation-recommendations': { kind: 'indirect', reason: 'The page card body starts a Creator through the Host page kind; the Host owns its logged task.' },
'packages/experimental/client-ui-plugin-recommendations': { kind: 'indirect', reason: 'The plugin card body enables through the Host plugin kind; the Host card service owns the logged tool, decisions and status notice.' },
'packages/experimental/voice-input-bundle': { kind: 'none', reason: 'Composes dictation and preparation plugins without adding any model-facing contribution.' },
'packages/telemetry/otel': { kind: 'none', reason: 'The service delivers caller-selected records without changing model context.' },
'packages/host/product-telemetry-otel': { kind: 'none', reason: 'The plugin exports explicit analytics records without contributing model context.' },