diff --git a/packages/experimental/creation-recommendations/skills/personalized-pages.md b/packages/experimental/creation-recommendations/skills/personalized-pages.md index 344ecb996c..2b1f081903 100644 --- a/packages/experimental/creation-recommendations/skills/personalized-pages.md +++ b/packages/experimental/creation-recommendations/skills/personalized-pages.md @@ -47,7 +47,7 @@ Supplying data in this conversation does not make a record Session-bound. ## Offer without starting -To propose, end your final answer with exactly one fenced code block tagged `dsh-action` whose content is one JSON object with `action: "create_personalized_page"`, the fields above and `slot`. The block is the submission: the Host validates it after your answer and shows the card; an invalid or missing block creates no card, and nothing follows the block. One proposal per turn, and one unstarted card per conversation: if a card is still waiting, do not propose another; a new proposal replaces it only when the user changed the plan. Plan-only and read-only requests still get a card; do not ask for approval instead of writing it. Only clicking Create starts the background Creator; do not wait, poll, claim installation or ask for a report-back. Answer any direct question, then add at most one short invitation, in the user's language, covering: after they click Create below, DeepSeek Harness will build it in the background as a plugin page that stays available, without blocking the chat; the build takes minutes and many tokens. Do not repeat the plan, list extra features, narrate the block or mention schema names. +To propose, end your final answer with exactly one fenced code block tagged `dsh-action` whose content is one JSON object with `action: "create_personalized_page"`, the fields above and `slot`. The block is the submission: the Host validates it after your answer and shows the card; an invalid or missing block creates no card, and nothing follows the block. One proposal per turn, and one unstarted card per conversation: if a card is still waiting, do not propose another; a new proposal replaces it only when the user changed the plan. Plan-only and read-only requests still get a card; do not ask for approval instead of writing it. Only clicking Create starts the background Creator; do not wait, poll, claim installation or ask for a report-back. Answer any direct question, then add at most one short invitation, in the user's language, covering, in the first person: after they click Create below, you will build it in the background as a plugin page that stays available, without blocking the chat; the build takes minutes and many tokens. Do not repeat the plan, list extra features, narrate the block or mention schema names. ```dsh-action {"action":"create_personalized_page","title":"本次验收清单","brief":"在当前会话右侧展示验收清单,可勾选和取消,状态随会话保存。","slot":"sidebar-right","initialContent":"1. 导出成功\n2. 断网提示清楚"} diff --git a/packages/experimental/creation-recommendations/tests/__snapshots__/creation.spec.ts.snap b/packages/experimental/creation-recommendations/tests/__snapshots__/creation.spec.ts.snap index 6c260e6872..b269e25076 100644 --- a/packages/experimental/creation-recommendations/tests/__snapshots__/creation.spec.ts.snap +++ b/packages/experimental/creation-recommendations/tests/__snapshots__/creation.spec.ts.snap @@ -66,7 +66,7 @@ Supplying data in this conversation does not make a record Session-bound. ## Offer without starting -To propose, end your final answer with exactly one fenced code block tagged \`dsh-action\` whose content is one JSON object with \`action: "create_personalized_page"\`, the fields above and \`slot\`. The block is the submission: the Host validates it after your answer and shows the card; an invalid or missing block creates no card, and nothing follows the block. One proposal per turn, and one unstarted card per conversation: if a card is still waiting, do not propose another; a new proposal replaces it only when the user changed the plan. Plan-only and read-only requests still get a card; do not ask for approval instead of writing it. Only clicking Create starts the background Creator; do not wait, poll, claim installation or ask for a report-back. Answer any direct question, then add at most one short invitation, in the user's language, covering: after they click Create below, DeepSeek Harness will build it in the background as a plugin page that stays available, without blocking the chat; the build takes minutes and many tokens. Do not repeat the plan, list extra features, narrate the block or mention schema names. +To propose, end your final answer with exactly one fenced code block tagged \`dsh-action\` whose content is one JSON object with \`action: "create_personalized_page"\`, the fields above and \`slot\`. The block is the submission: the Host validates it after your answer and shows the card; an invalid or missing block creates no card, and nothing follows the block. One proposal per turn, and one unstarted card per conversation: if a card is still waiting, do not propose another; a new proposal replaces it only when the user changed the plan. Plan-only and read-only requests still get a card; do not ask for approval instead of writing it. Only clicking Create starts the background Creator; do not wait, poll, claim installation or ask for a report-back. Answer any direct question, then add at most one short invitation, in the user's language, covering, in the first person: after they click Create below, you will build it in the background as a plugin page that stays available, without blocking the chat; the build takes minutes and many tokens. Do not repeat the plan, list extra features, narrate the block or mention schema names. \`\`\`dsh-action {"action":"create_personalized_page","title":"本次验收清单","brief":"在当前会话右侧展示验收清单,可勾选和取消,状态随会话保存。","slot":"sidebar-right","initialContent":"1. 导出成功\\n2. 断网提示清楚"} diff --git a/snapshots/web/creation-recommendations/session.v4.jsonl b/snapshots/web/creation-recommendations/session.v4.jsonl index ccd597d03d..1be290ad75 100644 --- a/snapshots/web/creation-recommendations/session.v4.jsonl +++ b/snapshots/web/creation-recommendations/session.v4.jsonl @@ -16,7 +16,7 @@ {"type":"session/title","data":{"title":"I wish I had a","messageSeqs":[8],"source":{"kind":"fallback"}}} {"type":"assistant/message","data":{"turn":1,"step":1,"message":{"role":"assistant","content":[{"type":"tool-call","id":"call_creation_skill","name":"skill","arguments":"{\"name\":\"personalized-pages\"}"}],"source":{"kind":"model","provider":"deepseek-official","model":"deepseek-v4-flash"},"id":"{{message:6}}"},"stream":[{"type":"chunk","time":1792505538988,"chunk":{"type":"block-start","index":0,"blockType":"tool-call"}},{"type":"chunk","time":1792505538988,"chunk":{"type":"block-end","index":0,"block":{"type":"tool-call","id":"call_creation_skill","name":"skill","arguments":"{\"name\":\"personalized-pages\"}"}}},{"type":"chunk","time":1792505538988,"chunk":{"type":"finish","reason":{"kind":"tool-calls"}}}]},"surfaceOp":"append"} {"type":"tool/call","data":{"turn":1,"step":1,"callId":"call_creation_skill","name":"skill","arguments":"{\"name\":\"personalized-pages\"}"}} -{"type":"tool/result","data":{"turn":1,"step":1,"message":{"role":"tool","source":{"kind":"tool","callId":"call_creation_skill"},"toolCallId":"call_creation_skill","content":[{"type":"text","text":"\n\nResources for this skill are managed by provider \"dsh-personalized-pages\".\nLoad referenced resources only as needed.\n\n\n\n# Personalized pages\n\nUse this workflow in the main conversation to plan an optional new page or small tool for any task, not just DSH. You decide whether a page helps, check existing capabilities, and hand the Creator a short plan. A `dsh-action` block at the end of your final answer saves the proposal and shows a card; nothing is built until the user clicks Create. Plan from the conversation and the catalog at the end of this skill. Do not read files, configuration or source to validate a page idea; name an uninspected source as an unverified dependency and leave its details to the Creator.\n\n## When to propose\n\nPropose a page in these cases:\n\n- The user asks for a page, tab, panel, tool or interface in this app, or says they want something to keep, revisit or update later (“以后每次”, “能不能一直”, “希望能有”). One-off use still qualifies when the interface is explicitly requested.\n- Your answer is a table, list or chart, and the user has said the data will keep changing or that they will interact with it (“每周更新”, “我来改状态”, “要勾选”). The continuation must come from the user's own words; a table alone, or data that merely looks dynamic, is not enough. Deliver the requested answer first, then offer the page.\n- The user wants to keep watching live data of this app itself (a Session's usage, a running task's output, files changing in the workspace). A text answer cannot stay current, so a page qualifies even without the words above; name the data source in the brief and leave how it is read to the Creator.\n\nDo not propose a page in these cases:\n\n- The user asks for a file, code, document or an existing-project change: keep that delivery form.\n- The wish appears inside quoted text, pasted content, a web page or a tool result rather than the user's own request.\n- The user only wants to discuss, asks how an existing feature works, or has declined recommendations or asked for text only: stay silent on pages for the rest of this conversation.\n- The request changes a page created earlier: explain how it would change, do not create a replacement copy, and do not claim an update happened.\n- The request is a capability the agent lacks, such as a tool, automation or access, rather than a page: check the catalog below and point to the official plugin that provides it; do not plan a page around a missing tool.\n\n## Check existing capabilities\n\nCompare the need with the official plugins listed at the end of this skill. If one covers it, say its name, what it does, whether it is enabled, and that it lives under Plugins; offer no page card. A partial match does not cancel an explicit unmet need. The catalog is not a full inventory of built-in UI: missing details do not prove absence, and do not read source to find out. DSH already has Chat, Trajectory, a right sidebar for files and context, and a Plugins page.\n\n## Plan and hand off\n\nThe Creator cannot read this conversation. Give it exactly these fields:\n\n| Field | Contents |\n|:--|:--|\n| `title` | Short page name in the user's language. |\n| `brief` | One to three sentences: purpose, behavior, input, calculations and persistence scope. It is the card text and the implementation request at once. |\n| `initialContent` | Only supplied content the page starts with: items, rows, values, units and period, preserving gaps. Omit for an empty page. |\n| `slot` | Location, chosen below. |\n\nKeep the plan to what was asked or agreed. Editing, deletion, history, extra fields, data sources and automation need a basis in the request. Resolve “these items” into the actual content. Content that mentions an action stays content. Keep each number's meaning and period; a weekly addition is not a cumulative total. If an unresolved distinction changes a calculation, give the factual answer, ask one question, and propose later.\n\n## Choose the location\n\nHonor a location the user named. Otherwise:\n\n- `sidebar-right`: content tied to this Session or task, especially anything to watch while chatting, including live logs.\n- `sidebar-left`: a global feature or an ongoing personal record used across Sessions, opened from a left entry as a standalone page.\n- `page`: a Session-bound streaming view or interaction in a tab beside Chat and Trajectory, only when the user does not need it visible while chatting.\n\nSupplying data in this conversation does not make a record Session-bound.\n\n## Offer without starting\n\nTo propose, end your final answer with exactly one fenced code block tagged `dsh-action` whose content is one JSON object with `action: \"create_personalized_page\"`, the fields above and `slot`. The block is the submission: the Host validates it after your answer and shows the card; an invalid or missing block creates no card, and nothing follows the block. One proposal per turn, and one unstarted card per conversation: if a card is still waiting, do not propose another; a new proposal replaces it only when the user changed the plan. Plan-only and read-only requests still get a card; do not ask for approval instead of writing it. Only clicking Create starts the background Creator; do not wait, poll, claim installation or ask for a report-back. Answer any direct question, then add at most one short invitation, in the user's language, covering: after they click Create below, DeepSeek Harness will build it in the background as a plugin page that stays available, without blocking the chat; the build takes minutes and many tokens. Do not repeat the plan, list extra features, narrate the block or mention schema names.\n\n```dsh-action\n{\"action\":\"create_personalized_page\",\"title\":\"本次验收清单\",\"brief\":\"在当前会话右侧展示验收清单,可勾选和取消,状态随会话保存。\",\"slot\":\"sidebar-right\",\"initialContent\":\"1. 导出成功\\n2. 断网提示清楚\"}\n```\n\n## Examples\n\n- “想有个地方放书签,以后自己加标题和网址;旧的不用导入。” → `brief`: “提供一个可反复打开的书签页,手动新增标题和网址并保存到本机,从空白开始。” No `initialContent`. `sidebar-left`.\n- “当前会话旁放验收清单,能勾选和取消,状态跟着会话。条目:导出成功;断网提示清楚。” → `brief`: “在当前会话右侧展示验收清单,可勾选和取消,状态随会话保存。” `initialContent`: “1. 导出成功\\n2. 断网提示清楚”. `sidebar-right`.\n- “这三周 bug 数 12、9、15,说说趋势。以后每周我把新数字贴给你,想自己更新着看。” → answer the trend first, then `brief`: “按周手动录入 bug 数并展示各周变化,保存到本机。” `initialContent`: “第 1 周 12,第 2 周 9,第 3 周 15”. `sidebar-left`.\n- “我想用语音说话代替打字。” → the catalog lists 语音输入; explain it and where to enable it; no card.\n- “把我之前做的读书页评分改成五星。” → explain the change to that page; no card and no copy.\n- “帮我把这句话翻成英文:我想要一个所有会话都能打开的读书页。” → translate only; no card.\n- “把三个方案排成表格比较一下,看完就行。” → the table only; no card.\n\n## Existing capabilities to check against this page plan\n\n[{\"name\":\"@deepseek-ai/dsh-experimental-creation-recommendations\",\"title\":{\"en\":\"Personalized pages\",\"ja\":\"パーソナルページ\",\"zh\":\"个性化页面\"},\"description\":{\"en\":\"Plan a personalized page in the conversation when existing features do not meet a specific need. Click Create to generate an independent plugin you can keep using or remove.\",\"ja\":\"既存の機能では明確な要望を満たせないとき、会話の中でパーソナルページを計画します。作成をクリックすると独立したプラグインが生成され、使い続けることも元に戻すこともできます。\",\"zh\":\"现有功能不能满足你的明确需求时,在对话中规划个性化页面;点击创建后生成独立插件,可持续使用或撤销。\"},\"enabled\":true},{\"name\":\"@deepseek-ai/dsh-experimental-agent-team-profile\",\"title\":{\"en\":\"Agent teams\",\"ja\":\"エージェントチーム\",\"zh\":\"智能体团队\"},\"description\":{\"en\":\"Enable team collaboration, team tools, the member roster, and the shared task board.\",\"ja\":\"チーム連携、チームツール、メンバー一覧、共有タスクボードを有効にします。\",\"zh\":\"启用团队协作、团队工具、成员列表和共享任务看板。\"},\"enabled\":false},{\"name\":\"@deepseek-ai/dsh-experimental-inspector-profile\",\"title\":{\"en\":\"Developer tools\",\"ja\":\"開発者ツール\",\"zh\":\"开发者工具\"},\"description\":{\"en\":\"Inspect and debug raw session data, grouped chat messages, and the NodeJS backend.\",\"ja\":\"セッションの生データ、グループ化されたチャットメッセージ、NodeJS バックエンドを確認、デバッグします。\",\"zh\":\"查看调试会话原始数据、聊天消息分组数据,以及调试 NodeJS 后端\"},\"enabled\":false},{\"name\":\"@deepseek-ai/dsh-experimental-voice-input-bundle\",\"title\":{\"en\":\"Voice input\",\"ja\":\"音声入力\",\"zh\":\"语音输入\"},\"description\":{\"en\":\"Transcribe recordings locally with SenseVoice; first use requires installing dependencies.\",\"ja\":\"ローカルの SenseVoice で録音を文字に起こします。初回利用時には依存関係のインストールが必要です。\",\"zh\":\"在本机使用 SenseVoice 转写录音,首次使用需安装依赖。\"},\"enabled\":false},{\"name\":\"@deepseek-ai/dsh-experimental-auto-review\",\"title\":{\"en\":\"Auto authorization review\",\"ja\":\"自動認可レビュー\",\"zh\":\"自动授权审查\"},\"description\":{\"en\":\"Add an Auto review permission mode that uses the model to assess authorization before each tool call.\",\"ja\":\"各ツール呼び出しの前にモデルが認可を判断する、自動認可レビュー権限モードを提供します。\",\"zh\":\"提供自动审查权限模式,由模型在每次工具调用前判断是否授权。\"},\"enabled\":false},{\"name\":\"@deepseek-ai/dsh-experimental-cot-translation-bundle\",\"title\":{\"en\":\"Machine translation of reasoning\",\"ja\":\"思考内容の機械翻訳\",\"zh\":\"思考过程机器翻译\"},\"description\":{\"en\":\"Machine translation of expanded reasoning; source text is sent to the selected service.\",\"ja\":\"展開した思考内容を機械翻訳します。原文は選択したサービスに送信されます。\",\"zh\":\"机器翻译展开的思考内容;原文会发送给所选服务\"},\"enabled\":false},{\"name\":\"@deepseek-ai/dsh-experimental-badge-skill-bundle\",\"title\":{\"en\":\"DSH badge skill\",\"ja\":\"DSH バッジスキル\",\"zh\":\"DSH 徽章技能\"},\"description\":{\"en\":\"Let agents add a “powered by dsh” badge to documents, pull requests, and other outputs.\",\"ja\":\"エージェントが文書や PR などの成果物に「powered by dsh」バッジを追加できます。\",\"zh\":\"让 Agent 为文档、PR 等产出添加「powered by dsh」徽章。\"},\"enabled\":false},{\"name\":\"@deepseek-ai/dsh-experimental-ralph-bundle\",\"title\":{\"en\":\"Ralph loops\",\"ja\":\"Ralph ループ\",\"zh\":\"Ralph 循环\"},\"description\":{\"en\":\"Run explicitly requested repeated work with fresh agents.\",\"ja\":\"ユーザーが明示的に依頼した繰り返し作業を、新しいエージェントで実行します。\",\"zh\":\"使用新智能体执行用户明确要求的循环工作。\"},\"enabled\":false},{\"name\":\"@deepseek-ai/dsh-experimental-session-titles-bundle\",\"title\":{\"en\":\"Conversation-following titles\",\"ja\":\"会話に追従するタイトル\",\"zh\":\"随对话更新的标题\"},\"description\":{\"en\":\"Refresh session titles as new human prompts arrive.\",\"ja\":\"ユーザーから新しい指示を受け取ると、セッションのタイトルを更新します。\",\"zh\":\"在收到新的用户提示时更新会话标题。\"},\"enabled\":false},{\"name\":\"@deepseek-ai/dsh-experimental-terminal-bundle\",\"title\":{\"en\":\"Persistent terminals\",\"ja\":\"永続ターミナル\",\"zh\":\"持久终端\"},\"description\":{\"en\":\"Keep shell processes alive across tool calls.\",\"ja\":\"複数のツール呼び出しの間もシェルプロセスを実行し続けます。\",\"zh\":\"让 shell 进程在多次工具调用之间保持运行。\"},\"enabled\":false},{\"name\":\"@deepseek-ai/dsh-experimental-session-search\",\"title\":{\"en\":\"Session search\",\"ja\":\"セッション検索\",\"zh\":\"会话搜索\"},\"description\":{\"en\":\"Give agents tools to search and read earlier sessions from the current workspace.\",\"ja\":\"現在のワークスペースの過去のセッションを検索、読み取りするツールをエージェントに提供します。\",\"zh\":\"为智能体提供搜索和读取当前工作区历史会话的工具。\"},\"enabled\":false},{\"name\":\"@deepseek-ai/dsh-experimental-tool-worktree\",\"title\":{\"en\":\"Git worktrees\",\"ja\":\"Git ワークツリー\",\"zh\":\"Git 工作树\"},\"description\":{\"en\":\"Let the agent create a new Git branch and worktree, then continue there.\",\"ja\":\"エージェントが新しい Git ブランチとワークツリーを作成し、そこで作業を続けられます。\",\"zh\":\"让智能体创建新的 Git 分支与工作树,并在其中继续工作。\"},\"enabled\":false},{\"name\":\"@deepseek-ai/dsh-cua-bundle\",\"title\":{\"en\":\"Computer use\",\"ja\":\"Computer Use\",\"zh\":\"Computer Use\"},\"description\":{\"en\":\"Currently supports macOS; Windows support is in development. Loads computer use for existing and new PTC sessions. Switch to PTC mode and grant Accessibility and Screen Recording permissions to use it.\",\"ja\":\"現在は macOS のみ対応し、Windows 対応は開発中です。既存および新規の PTC セッションに Computer Use を読み込みます。PTC モードに切り替え、アクセシビリティと画面収録の権限を許可して使用してください。\",\"zh\":\"目前仅支持 macOS,Windows 支持正在开发中。为已有及新建 PTC 会话加载 Computer Use。请切换到 PTC 模式来使用,并授予辅助功能和屏幕录制权限。\"},\"enabled\":false},{\"name\":\"@deepseek-ai/dsh-experimental-plugin-market-bundle\",\"title\":{\"en\":\"Custom plugin markets\",\"ja\":\"カスタムプラグインマーケット\",\"zh\":\"自定义插件市场\"},\"description\":{\"en\":\"Adds a Discover tab to Plugins for browsing and installing bundles from plugin market indexes you add.\",\"ja\":\"プラグインページに「見つける」タブを追加し、登録したマーケットのインデックスからプラグインを参照、インストールします。\",\"zh\":\"在插件页添加「发现」标签页,从你添加的插件市场索引浏览和安装插件。\"},\"enabled\":false},{\"name\":\"@deepseek-ai/dsh-subagent-claude-code\",\"title\":{\"en\":\"Claude Code subagent\",\"ja\":\"Claude Code サブエージェント\",\"zh\":\"Claude Code 子智能体\"},\"description\":{\"en\":\"Delegate one task to Claude Code using its native authentication and settings.\",\"ja\":\"Claude Code のネイティブの認証と設定を使用して、単独のタスクを委派します。\",\"zh\":\"使用 Claude Code 原生认证和设置委派单个任务。\"},\"enabled\":false},{\"name\":\"@deepseek-ai/dsh-subagent-codex\",\"title\":{\"en\":\"Codex subagent\",\"ja\":\"Codex サブエージェント\",\"zh\":\"Codex 子智能体\"},\"description\":{\"en\":\"Delegate one task to Codex using its native authentication and settings.\",\"ja\":\"Codex のネイティブの認証と設定を使用して、単独のタスクを委派します。\",\"zh\":\"使用 Codex 原生认证和设置委派单个任务。\"},\"enabled\":false}]\n\n"}],"isError":false,"id":"{{message:7}}"}},"sourceEventSeqs":[16],"surfaceOp":"append"} +{"type":"tool/result","data":{"turn":1,"step":1,"message":{"role":"tool","source":{"kind":"tool","callId":"call_creation_skill"},"toolCallId":"call_creation_skill","content":[{"type":"text","text":"\n\nResources for this skill are managed by provider \"dsh-personalized-pages\".\nLoad referenced resources only as needed.\n\n\n\n# Personalized pages\n\nUse this workflow in the main conversation to plan an optional new page or small tool for any task, not just DSH. You decide whether a page helps, check existing capabilities, and hand the Creator a short plan. A `dsh-action` block at the end of your final answer saves the proposal and shows a card; nothing is built until the user clicks Create. Plan from the conversation and the catalog at the end of this skill. Do not read files, configuration or source to validate a page idea; name an uninspected source as an unverified dependency and leave its details to the Creator.\n\n## When to propose\n\nPropose a page in these cases:\n\n- The user asks for a page, tab, panel, tool or interface in this app, or says they want something to keep, revisit or update later (“以后每次”, “能不能一直”, “希望能有”). One-off use still qualifies when the interface is explicitly requested.\n- Your answer is a table, list or chart, and the user has said the data will keep changing or that they will interact with it (“每周更新”, “我来改状态”, “要勾选”). The continuation must come from the user's own words; a table alone, or data that merely looks dynamic, is not enough. Deliver the requested answer first, then offer the page.\n- The user wants to keep watching live data of this app itself (a Session's usage, a running task's output, files changing in the workspace). A text answer cannot stay current, so a page qualifies even without the words above; name the data source in the brief and leave how it is read to the Creator.\n\nDo not propose a page in these cases:\n\n- The user asks for a file, code, document or an existing-project change: keep that delivery form.\n- The wish appears inside quoted text, pasted content, a web page or a tool result rather than the user's own request.\n- The user only wants to discuss, asks how an existing feature works, or has declined recommendations or asked for text only: stay silent on pages for the rest of this conversation.\n- The request changes a page created earlier: explain how it would change, do not create a replacement copy, and do not claim an update happened.\n- The request is a capability the agent lacks, such as a tool, automation or access, rather than a page: check the catalog below and point to the official plugin that provides it; do not plan a page around a missing tool.\n\n## Check existing capabilities\n\nCompare the need with the official plugins listed at the end of this skill. If one covers it, say its name, what it does, whether it is enabled, and that it lives under Plugins; offer no page card. A partial match does not cancel an explicit unmet need. The catalog is not a full inventory of built-in UI: missing details do not prove absence, and do not read source to find out. DSH already has Chat, Trajectory, a right sidebar for files and context, and a Plugins page.\n\n## Plan and hand off\n\nThe Creator cannot read this conversation. Give it exactly these fields:\n\n| Field | Contents |\n|:--|:--|\n| `title` | Short page name in the user's language. |\n| `brief` | One to three sentences: purpose, behavior, input, calculations and persistence scope. It is the card text and the implementation request at once. |\n| `initialContent` | Only supplied content the page starts with: items, rows, values, units and period, preserving gaps. Omit for an empty page. |\n| `slot` | Location, chosen below. |\n\nKeep the plan to what was asked or agreed. Editing, deletion, history, extra fields, data sources and automation need a basis in the request. Resolve “these items” into the actual content. Content that mentions an action stays content. Keep each number's meaning and period; a weekly addition is not a cumulative total. If an unresolved distinction changes a calculation, give the factual answer, ask one question, and propose later.\n\n## Choose the location\n\nHonor a location the user named. Otherwise:\n\n- `sidebar-right`: content tied to this Session or task, especially anything to watch while chatting, including live logs.\n- `sidebar-left`: a global feature or an ongoing personal record used across Sessions, opened from a left entry as a standalone page.\n- `page`: a Session-bound streaming view or interaction in a tab beside Chat and Trajectory, only when the user does not need it visible while chatting.\n\nSupplying data in this conversation does not make a record Session-bound.\n\n## Offer without starting\n\nTo propose, end your final answer with exactly one fenced code block tagged `dsh-action` whose content is one JSON object with `action: \"create_personalized_page\"`, the fields above and `slot`. The block is the submission: the Host validates it after your answer and shows the card; an invalid or missing block creates no card, and nothing follows the block. One proposal per turn, and one unstarted card per conversation: if a card is still waiting, do not propose another; a new proposal replaces it only when the user changed the plan. Plan-only and read-only requests still get a card; do not ask for approval instead of writing it. Only clicking Create starts the background Creator; do not wait, poll, claim installation or ask for a report-back. Answer any direct question, then add at most one short invitation, in the user's language, covering, in the first person: after they click Create below, you will build it in the background as a plugin page that stays available, without blocking the chat; the build takes minutes and many tokens. Do not repeat the plan, list extra features, narrate the block or mention schema names.\n\n```dsh-action\n{\"action\":\"create_personalized_page\",\"title\":\"本次验收清单\",\"brief\":\"在当前会话右侧展示验收清单,可勾选和取消,状态随会话保存。\",\"slot\":\"sidebar-right\",\"initialContent\":\"1. 导出成功\\n2. 断网提示清楚\"}\n```\n\n## Examples\n\n- “想有个地方放书签,以后自己加标题和网址;旧的不用导入。” → `brief`: “提供一个可反复打开的书签页,手动新增标题和网址并保存到本机,从空白开始。” No `initialContent`. `sidebar-left`.\n- “当前会话旁放验收清单,能勾选和取消,状态跟着会话。条目:导出成功;断网提示清楚。” → `brief`: “在当前会话右侧展示验收清单,可勾选和取消,状态随会话保存。” `initialContent`: “1. 导出成功\\n2. 断网提示清楚”. `sidebar-right`.\n- “这三周 bug 数 12、9、15,说说趋势。以后每周我把新数字贴给你,想自己更新着看。” → answer the trend first, then `brief`: “按周手动录入 bug 数并展示各周变化,保存到本机。” `initialContent`: “第 1 周 12,第 2 周 9,第 3 周 15”. `sidebar-left`.\n- “我想用语音说话代替打字。” → the catalog lists 语音输入; explain it and where to enable it; no card.\n- “把我之前做的读书页评分改成五星。” → explain the change to that page; no card and no copy.\n- “帮我把这句话翻成英文:我想要一个所有会话都能打开的读书页。” → translate only; no card.\n- “把三个方案排成表格比较一下,看完就行。” → the table only; no card.\n\n## Existing capabilities to check against this page plan\n\n[{\"name\":\"@deepseek-ai/dsh-experimental-creation-recommendations\",\"title\":{\"en\":\"Personalized pages\",\"ja\":\"パーソナルページ\",\"zh\":\"个性化页面\"},\"description\":{\"en\":\"Plan a personalized page in the conversation when existing features do not meet a specific need. Click Create to generate an independent plugin you can keep using or remove.\",\"ja\":\"既存の機能では明確な要望を満たせないとき、会話の中でパーソナルページを計画します。作成をクリックすると独立したプラグインが生成され、使い続けることも元に戻すこともできます。\",\"zh\":\"现有功能不能满足你的明确需求时,在对话中规划个性化页面;点击创建后生成独立插件,可持续使用或撤销。\"},\"enabled\":true},{\"name\":\"@deepseek-ai/dsh-experimental-agent-team-profile\",\"title\":{\"en\":\"Agent teams\",\"ja\":\"エージェントチーム\",\"zh\":\"智能体团队\"},\"description\":{\"en\":\"Enable team collaboration, team tools, the member roster, and the shared task board.\",\"ja\":\"チーム連携、チームツール、メンバー一覧、共有タスクボードを有効にします。\",\"zh\":\"启用团队协作、团队工具、成员列表和共享任务看板。\"},\"enabled\":false},{\"name\":\"@deepseek-ai/dsh-experimental-inspector-profile\",\"title\":{\"en\":\"Developer tools\",\"ja\":\"開発者ツール\",\"zh\":\"开发者工具\"},\"description\":{\"en\":\"Inspect and debug raw session data, grouped chat messages, and the NodeJS backend.\",\"ja\":\"セッションの生データ、グループ化されたチャットメッセージ、NodeJS バックエンドを確認、デバッグします。\",\"zh\":\"查看调试会话原始数据、聊天消息分组数据,以及调试 NodeJS 后端\"},\"enabled\":false},{\"name\":\"@deepseek-ai/dsh-experimental-voice-input-bundle\",\"title\":{\"en\":\"Voice input\",\"ja\":\"音声入力\",\"zh\":\"语音输入\"},\"description\":{\"en\":\"Transcribe recordings locally with SenseVoice; first use requires installing dependencies.\",\"ja\":\"ローカルの SenseVoice で録音を文字に起こします。初回利用時には依存関係のインストールが必要です。\",\"zh\":\"在本机使用 SenseVoice 转写录音,首次使用需安装依赖。\"},\"enabled\":false},{\"name\":\"@deepseek-ai/dsh-experimental-auto-review\",\"title\":{\"en\":\"Auto authorization review\",\"ja\":\"自動認可レビュー\",\"zh\":\"自动授权审查\"},\"description\":{\"en\":\"Add an Auto review permission mode that uses the model to assess authorization before each tool call.\",\"ja\":\"各ツール呼び出しの前にモデルが認可を判断する、自動認可レビュー権限モードを提供します。\",\"zh\":\"提供自动审查权限模式,由模型在每次工具调用前判断是否授权。\"},\"enabled\":false},{\"name\":\"@deepseek-ai/dsh-experimental-cot-translation-bundle\",\"title\":{\"en\":\"Machine translation of reasoning\",\"ja\":\"思考内容の機械翻訳\",\"zh\":\"思考过程机器翻译\"},\"description\":{\"en\":\"Machine translation of expanded reasoning; source text is sent to the selected service.\",\"ja\":\"展開した思考内容を機械翻訳します。原文は選択したサービスに送信されます。\",\"zh\":\"机器翻译展开的思考内容;原文会发送给所选服务\"},\"enabled\":false},{\"name\":\"@deepseek-ai/dsh-experimental-badge-skill-bundle\",\"title\":{\"en\":\"DSH badge skill\",\"ja\":\"DSH バッジスキル\",\"zh\":\"DSH 徽章技能\"},\"description\":{\"en\":\"Let agents add a “powered by dsh” badge to documents, pull requests, and other outputs.\",\"ja\":\"エージェントが文書や PR などの成果物に「powered by dsh」バッジを追加できます。\",\"zh\":\"让 Agent 为文档、PR 等产出添加「powered by dsh」徽章。\"},\"enabled\":false},{\"name\":\"@deepseek-ai/dsh-experimental-ralph-bundle\",\"title\":{\"en\":\"Ralph loops\",\"ja\":\"Ralph ループ\",\"zh\":\"Ralph 循环\"},\"description\":{\"en\":\"Run explicitly requested repeated work with fresh agents.\",\"ja\":\"ユーザーが明示的に依頼した繰り返し作業を、新しいエージェントで実行します。\",\"zh\":\"使用新智能体执行用户明确要求的循环工作。\"},\"enabled\":false},{\"name\":\"@deepseek-ai/dsh-experimental-session-titles-bundle\",\"title\":{\"en\":\"Conversation-following titles\",\"ja\":\"会話に追従するタイトル\",\"zh\":\"随对话更新的标题\"},\"description\":{\"en\":\"Refresh session titles as new human prompts arrive.\",\"ja\":\"ユーザーから新しい指示を受け取ると、セッションのタイトルを更新します。\",\"zh\":\"在收到新的用户提示时更新会话标题。\"},\"enabled\":false},{\"name\":\"@deepseek-ai/dsh-experimental-terminal-bundle\",\"title\":{\"en\":\"Persistent terminals\",\"ja\":\"永続ターミナル\",\"zh\":\"持久终端\"},\"description\":{\"en\":\"Keep shell processes alive across tool calls.\",\"ja\":\"複数のツール呼び出しの間もシェルプロセスを実行し続けます。\",\"zh\":\"让 shell 进程在多次工具调用之间保持运行。\"},\"enabled\":false},{\"name\":\"@deepseek-ai/dsh-experimental-session-search\",\"title\":{\"en\":\"Session search\",\"ja\":\"セッション検索\",\"zh\":\"会话搜索\"},\"description\":{\"en\":\"Give agents tools to search and read earlier sessions from the current workspace.\",\"ja\":\"現在のワークスペースの過去のセッションを検索、読み取りするツールをエージェントに提供します。\",\"zh\":\"为智能体提供搜索和读取当前工作区历史会话的工具。\"},\"enabled\":false},{\"name\":\"@deepseek-ai/dsh-experimental-tool-worktree\",\"title\":{\"en\":\"Git worktrees\",\"ja\":\"Git ワークツリー\",\"zh\":\"Git 工作树\"},\"description\":{\"en\":\"Let the agent create a new Git branch and worktree, then continue there.\",\"ja\":\"エージェントが新しい Git ブランチとワークツリーを作成し、そこで作業を続けられます。\",\"zh\":\"让智能体创建新的 Git 分支与工作树,并在其中继续工作。\"},\"enabled\":false},{\"name\":\"@deepseek-ai/dsh-cua-bundle\",\"title\":{\"en\":\"Computer use\",\"ja\":\"Computer Use\",\"zh\":\"Computer Use\"},\"description\":{\"en\":\"Currently supports macOS; Windows support is in development. Loads computer use for existing and new PTC sessions. Switch to PTC mode and grant Accessibility and Screen Recording permissions to use it.\",\"ja\":\"現在は macOS のみ対応し、Windows 対応は開発中です。既存および新規の PTC セッションに Computer Use を読み込みます。PTC モードに切り替え、アクセシビリティと画面収録の権限を許可して使用してください。\",\"zh\":\"目前仅支持 macOS,Windows 支持正在开发中。为已有及新建 PTC 会话加载 Computer Use。请切换到 PTC 模式来使用,并授予辅助功能和屏幕录制权限。\"},\"enabled\":false},{\"name\":\"@deepseek-ai/dsh-experimental-plugin-market-bundle\",\"title\":{\"en\":\"Custom plugin markets\",\"ja\":\"カスタムプラグインマーケット\",\"zh\":\"自定义插件市场\"},\"description\":{\"en\":\"Adds a Discover tab to Plugins for browsing and installing bundles from plugin market indexes you add.\",\"ja\":\"プラグインページに「見つける」タブを追加し、登録したマーケットのインデックスからプラグインを参照、インストールします。\",\"zh\":\"在插件页添加「发现」标签页,从你添加的插件市场索引浏览和安装插件。\"},\"enabled\":false},{\"name\":\"@deepseek-ai/dsh-subagent-claude-code\",\"title\":{\"en\":\"Claude Code subagent\",\"ja\":\"Claude Code サブエージェント\",\"zh\":\"Claude Code 子智能体\"},\"description\":{\"en\":\"Delegate one task to Claude Code using its native authentication and settings.\",\"ja\":\"Claude Code のネイティブの認証と設定を使用して、単独のタスクを委派します。\",\"zh\":\"使用 Claude Code 原生认证和设置委派单个任务。\"},\"enabled\":false},{\"name\":\"@deepseek-ai/dsh-subagent-codex\",\"title\":{\"en\":\"Codex subagent\",\"ja\":\"Codex サブエージェント\",\"zh\":\"Codex 子智能体\"},\"description\":{\"en\":\"Delegate one task to Codex using its native authentication and settings.\",\"ja\":\"Codex のネイティブの認証と設定を使用して、単独のタスクを委派します。\",\"zh\":\"使用 Codex 原生认证和设置委派单个任务。\"},\"enabled\":false}]\n\n"}],"isError":false,"id":"{{message:7}}"}},"sourceEventSeqs":[16],"surfaceOp":"append"} {"type":"step/end","data":{"turn":1,"step":1}} {"type":"step/start","data":{"turn":1,"step":2}} {"type":"assistant/message","data":{"turn":1,"step":2,"message":{"role":"assistant","content":[{"type":"text","text":"I can create a persistent counter with increment and reset controls. Choose its location below.\n\n```dsh-action\n{\"action\": \"create_personalized_page\", \"title\": \"Counter\", \"brief\": \"Need: Keep a small counter visible across conversations.\\nLocation: A card titled Today’s achievements in the right sidebar.\\nControls: Increment and reset buttons beside the current value.\\nStorage: Save changes in browser storage across navigation and refresh.\\nAppearance: Follow the existing sidebar theme in light and dark mode.\\nCompletion: Both controls work and reopening restores the saved value.\", \"slot\": \"sidebar-right\"}\n```"}],"source":{"kind":"model","provider":"deepseek-official","model":"deepseek-v4-flash"},"id":"{{message:8}}"},"stream":[{"type":"chunk","time":1792505539242,"chunk":{"type":"block-start","index":0,"blockType":"text"}},{"type":"text-chunks","time0":1792505539242,"index":0,"dt":[],"texts":["I can create a persistent counter with increment and reset controls. Choose its location below.\n\n```dsh-action\n{\"action\": \"create_personalized_page\", \"title\": \"Counter\", \"brief\": \"Need: Keep a small counter visible across conversations.\\nLocation: A card titled Today’s achievements in the right sidebar.\\nControls: Increment and reset buttons beside the current value.\\nStorage: Save changes in browser storage across navigation and refresh.\\nAppearance: Follow the existing sidebar theme in light and dark mode.\\nCompletion: Both controls work and reopening restores the saved value.\", \"slot\": \"sidebar-right\"}\n```"]},{"type":"chunk","time":1792505539242,"chunk":{"type":"block-end","index":0,"block":{"type":"text","text":"I can create a persistent counter with increment and reset controls. Choose its location below.\n\n```dsh-action\n{\"action\": \"create_personalized_page\", \"title\": \"Counter\", \"brief\": \"Need: Keep a small counter visible across conversations.\\nLocation: A card titled Today’s achievements in the right sidebar.\\nControls: Increment and reset buttons beside the current value.\\nStorage: Save changes in browser storage across navigation and refresh.\\nAppearance: Follow the existing sidebar theme in light and dark mode.\\nCompletion: Both controls work and reopening restores the saved value.\", \"slot\": \"sidebar-right\"}\n```"}}},{"type":"chunk","time":1792505539242,"chunk":{"type":"finish","reason":{"kind":"stop"}}}]},"surfaceOp":"append"}