dsh-better-display 0.1.1
This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
- package/CHANGELOG.md +51 -0
- package/DESIGN.md +72 -0
- package/LICENSE +24 -0
- package/README.en.md +41 -0
- package/README.md +41 -0
- package/THIRD_PARTY_NOTICES.md +65 -0
- package/cordis.patch.yml +5 -0
- package/cordis.yml +4 -0
- package/dshx.yml +5 -0
- package/lib/client.js +49923 -0
- package/lib/client.js.map +1 -0
- package/lib/dsh-better-display.js +256 -0
- package/lib/types/client/Blocks.d.ts +45 -0
- package/lib/types/client/Blocks.d.ts.map +1 -0
- package/lib/types/client/Blocks.js +136 -0
- package/lib/types/client/Blocks.js.map +1 -0
- package/lib/types/client/ChoreographedFlow.d.ts +22 -0
- package/lib/types/client/ChoreographedFlow.d.ts.map +1 -0
- package/lib/types/client/ChoreographedFlow.js +170 -0
- package/lib/types/client/ChoreographedFlow.js.map +1 -0
- package/lib/types/client/ClosedProcessSummary.d.ts +9 -0
- package/lib/types/client/ClosedProcessSummary.d.ts.map +1 -0
- package/lib/types/client/ClosedProcessSummary.js +15 -0
- package/lib/types/client/ClosedProcessSummary.js.map +1 -0
- package/lib/types/client/LiveFold.d.ts +10 -0
- package/lib/types/client/LiveFold.d.ts.map +1 -0
- package/lib/types/client/LiveFold.js +39 -0
- package/lib/types/client/LiveFold.js.map +1 -0
- package/lib/types/client/McpAppFrame.d.ts +32 -0
- package/lib/types/client/McpAppFrame.d.ts.map +1 -0
- package/lib/types/client/McpAppFrame.js +193 -0
- package/lib/types/client/McpAppFrame.js.map +1 -0
- package/lib/types/client/Reader.d.ts +3 -0
- package/lib/types/client/Reader.d.ts.map +1 -0
- package/lib/types/client/Reader.js +537 -0
- package/lib/types/client/Reader.js.map +1 -0
- package/lib/types/client/ReasoningCard.d.ts +11 -0
- package/lib/types/client/ReasoningCard.d.ts.map +1 -0
- package/lib/types/client/ReasoningCard.js +301 -0
- package/lib/types/client/ReasoningCard.js.map +1 -0
- package/lib/types/client/StickyLane.d.ts +8 -0
- package/lib/types/client/StickyLane.d.ts.map +1 -0
- package/lib/types/client/StickyLane.js +28 -0
- package/lib/types/client/StickyLane.js.map +1 -0
- package/lib/types/client/TimelineRail.d.ts +10 -0
- package/lib/types/client/TimelineRail.d.ts.map +1 -0
- package/lib/types/client/TimelineRail.js +168 -0
- package/lib/types/client/TimelineRail.js.map +1 -0
- package/lib/types/client/ToolActivity.d.ts +17 -0
- package/lib/types/client/ToolActivity.d.ts.map +1 -0
- package/lib/types/client/ToolActivity.js +192 -0
- package/lib/types/client/ToolActivity.js.map +1 -0
- package/lib/types/client/TurnMetrics.d.ts +11 -0
- package/lib/types/client/TurnMetrics.d.ts.map +1 -0
- package/lib/types/client/TurnMetrics.js +44 -0
- package/lib/types/client/TurnMetrics.js.map +1 -0
- package/lib/types/client/WaitingStatus.d.ts +6 -0
- package/lib/types/client/WaitingStatus.d.ts.map +1 -0
- package/lib/types/client/WaitingStatus.js +19 -0
- package/lib/types/client/WaitingStatus.js.map +1 -0
- package/lib/types/client/conversation-scroll.d.ts +19 -0
- package/lib/types/client/conversation-scroll.d.ts.map +1 -0
- package/lib/types/client/conversation-scroll.js +25 -0
- package/lib/types/client/conversation-scroll.js.map +1 -0
- package/lib/types/client/deliverables.d.ts +24 -0
- package/lib/types/client/deliverables.d.ts.map +1 -0
- package/lib/types/client/deliverables.js +104 -0
- package/lib/types/client/deliverables.js.map +1 -0
- package/lib/types/client/entry-policy.d.ts +10 -0
- package/lib/types/client/entry-policy.d.ts.map +1 -0
- package/lib/types/client/entry-policy.js +24 -0
- package/lib/types/client/entry-policy.js.map +1 -0
- package/lib/types/client/entry.d.ts +4 -0
- package/lib/types/client/entry.d.ts.map +1 -0
- package/lib/types/client/entry.js +34 -0
- package/lib/types/client/entry.js.map +1 -0
- package/lib/types/client/fold-choreography.d.ts +28 -0
- package/lib/types/client/fold-choreography.d.ts.map +1 -0
- package/lib/types/client/fold-choreography.js +31 -0
- package/lib/types/client/fold-choreography.js.map +1 -0
- package/lib/types/client/index.d.ts +7 -0
- package/lib/types/client/index.d.ts.map +1 -0
- package/lib/types/client/index.js +153 -0
- package/lib/types/client/index.js.map +1 -0
- package/lib/types/client/live-turn.d.ts +58 -0
- package/lib/types/client/live-turn.d.ts.map +1 -0
- package/lib/types/client/live-turn.js +144 -0
- package/lib/types/client/live-turn.js.map +1 -0
- package/lib/types/client/markdown/MarkdownText.d.ts +39 -0
- package/lib/types/client/markdown/MarkdownText.d.ts.map +1 -0
- package/lib/types/client/markdown/MarkdownText.js +171 -0
- package/lib/types/client/markdown/MarkdownText.js.map +1 -0
- package/lib/types/client/markdown/cjkFriendlyStrong.d.ts +9 -0
- package/lib/types/client/markdown/cjkFriendlyStrong.d.ts.map +1 -0
- package/lib/types/client/markdown/cjkFriendlyStrong.js +73 -0
- package/lib/types/client/markdown/cjkFriendlyStrong.js.map +1 -0
- package/lib/types/client/markdown/incremental.d.ts +69 -0
- package/lib/types/client/markdown/incremental.d.ts.map +1 -0
- package/lib/types/client/markdown/incremental.js +108 -0
- package/lib/types/client/markdown/incremental.js.map +1 -0
- package/lib/types/client/markdown/katex.d.ts +27 -0
- package/lib/types/client/markdown/katex.d.ts.map +1 -0
- package/lib/types/client/markdown/katex.js +88 -0
- package/lib/types/client/markdown/katex.js.map +1 -0
- package/lib/types/client/markdown/mathCompatibility.d.ts +11 -0
- package/lib/types/client/markdown/mathCompatibility.d.ts.map +1 -0
- package/lib/types/client/markdown/mathCompatibility.js +293 -0
- package/lib/types/client/markdown/mathCompatibility.js.map +1 -0
- package/lib/types/client/markdown/parse.d.ts +25 -0
- package/lib/types/client/markdown/parse.d.ts.map +1 -0
- package/lib/types/client/markdown/parse.js +42 -0
- package/lib/types/client/markdown/parse.js.map +1 -0
- package/lib/types/client/markdown/render.d.ts +119 -0
- package/lib/types/client/markdown/render.d.ts.map +1 -0
- package/lib/types/client/markdown/render.js +435 -0
- package/lib/types/client/markdown/render.js.map +1 -0
- package/lib/types/client/mcp-app.d.ts +50 -0
- package/lib/types/client/mcp-app.d.ts.map +1 -0
- package/lib/types/client/mcp-app.js +328 -0
- package/lib/types/client/mcp-app.js.map +1 -0
- package/lib/types/client/message-chrome.d.ts +19 -0
- package/lib/types/client/message-chrome.d.ts.map +1 -0
- package/lib/types/client/message-chrome.js +42 -0
- package/lib/types/client/message-chrome.js.map +1 -0
- package/lib/types/client/motion.d.ts +38 -0
- package/lib/types/client/motion.d.ts.map +1 -0
- package/lib/types/client/motion.js +367 -0
- package/lib/types/client/motion.js.map +1 -0
- package/lib/types/client/native/ContextBody.d.ts +130 -0
- package/lib/types/client/native/ContextBody.d.ts.map +1 -0
- package/lib/types/client/native/ContextBody.js +398 -0
- package/lib/types/client/native/ContextBody.js.map +1 -0
- package/lib/types/client/native/ContextInjectionRow.d.ts +26 -0
- package/lib/types/client/native/ContextInjectionRow.d.ts.map +1 -0
- package/lib/types/client/native/ContextInjectionRow.js +27 -0
- package/lib/types/client/native/ContextInjectionRow.js.map +1 -0
- package/lib/types/client/native/ReferenceIcon.d.ts +16 -0
- package/lib/types/client/native/ReferenceIcon.d.ts.map +1 -0
- package/lib/types/client/native/ReferenceIcon.js +16 -0
- package/lib/types/client/native/ReferenceIcon.js.map +1 -0
- package/lib/types/client/native/tool-call-model.d.ts +58 -0
- package/lib/types/client/native/tool-call-model.d.ts.map +1 -0
- package/lib/types/client/native/tool-call-model.js +219 -0
- package/lib/types/client/native/tool-call-model.js.map +1 -0
- package/lib/types/client/open-file.d.ts +24 -0
- package/lib/types/client/primitive-labels.d.ts +10 -0
- package/lib/types/client/primitive-labels.d.ts.map +1 -0
- package/lib/types/client/primitive-labels.js +37 -0
- package/lib/types/client/primitive-labels.js.map +1 -0
- package/lib/types/client/projection.d.ts +41 -0
- package/lib/types/client/projection.d.ts.map +1 -0
- package/lib/types/client/projection.js +112 -0
- package/lib/types/client/projection.js.map +1 -0
- package/lib/types/client/reasoning-follow.d.ts +6 -0
- package/lib/types/client/reasoning-follow.d.ts.map +1 -0
- package/lib/types/client/reasoning-follow.js +12 -0
- package/lib/types/client/reasoning-follow.js.map +1 -0
- package/lib/types/client/settings-copy.d.ts +6 -0
- package/lib/types/client/settings-slots.d.ts +16 -0
- package/lib/types/client/store.d.ts +17 -0
- package/lib/types/client/store.d.ts.map +1 -0
- package/lib/types/client/store.js +13 -0
- package/lib/types/client/store.js.map +1 -0
- package/lib/types/client/stream-buffer.d.ts +29 -0
- package/lib/types/client/stream-buffer.d.ts.map +1 -0
- package/lib/types/client/stream-buffer.js +113 -0
- package/lib/types/client/stream-buffer.js.map +1 -0
- package/lib/types/client/streaming.d.ts +18 -0
- package/lib/types/client/streaming.d.ts.map +1 -0
- package/lib/types/client/streaming.js +77 -0
- package/lib/types/client/streaming.js.map +1 -0
- package/lib/types/client/timeline.d.ts +26 -0
- package/lib/types/client/timeline.d.ts.map +1 -0
- package/lib/types/client/timeline.js +48 -0
- package/lib/types/client/timeline.js.map +1 -0
- package/lib/types/client/tool-activity.d.ts +52 -0
- package/lib/types/client/tool-activity.d.ts.map +1 -0
- package/lib/types/client/tool-activity.js +178 -0
- package/lib/types/client/tool-activity.js.map +1 -0
- package/lib/types/client/types.d.ts +66 -0
- package/lib/types/client/types.d.ts.map +1 -0
- package/lib/types/client/types.js +2 -0
- package/lib/types/client/types.js.map +1 -0
- package/lib/types/client/waiting-clock.d.ts +17 -0
- package/lib/types/client/waiting-clock.d.ts.map +1 -0
- package/lib/types/client/waiting-clock.js +24 -0
- package/lib/types/client/waiting-clock.js.map +1 -0
- package/lib/types/client/word-motion.d.ts +16 -0
- package/lib/types/client/word-motion.d.ts.map +1 -0
- package/lib/types/client/word-motion.js +89 -0
- package/lib/types/client/word-motion.js.map +1 -0
- package/lib/types/client/word-timeline.d.ts +28 -0
- package/lib/types/client/word-timeline.d.ts.map +1 -0
- package/lib/types/client/word-timeline.js +100 -0
- package/lib/types/client/word-timeline.js.map +1 -0
- package/lib/types/dsh-better-display.d.ts +17 -0
- package/lib/types/dsh-better-display.d.ts.map +1 -0
- package/lib/types/dsh-better-display.js +53 -0
- package/lib/types/dsh-better-display.js.map +1 -0
- package/package.json +121 -0
- package/scripts/build-motion-fixture.mjs +26 -0
- package/scripts/link-harness-dependencies.mjs +51 -0
- package/skills/generative-mcpapps/SKILL.md +47 -0
- package/skills/generative-mcpapps/examples/interactive_quiz.html +153 -0
- package/skills/generative-mcpapps/references/html_boilerplate.md +122 -0
- package/skills/generative-mcpapps/references/sep1865_protocol.md +54 -0
- package/src/client/Blocks.tsx +205 -0
- package/src/client/ChoreographedFlow.tsx +182 -0
- package/src/client/ClosedProcessSummary.tsx +19 -0
- package/src/client/LiveFold.tsx +43 -0
- package/src/client/McpAppFrame.module.css +210 -0
- package/src/client/McpAppFrame.tsx +317 -0
- package/src/client/Reader.module.css +329 -0
- package/src/client/Reader.tsx +814 -0
- package/src/client/ReasoningCard.tsx +285 -0
- package/src/client/SettingsSection.module.css +147 -0
- package/src/client/SettingsSection.tsx +117 -0
- package/src/client/StickyLane.tsx +24 -0
- package/src/client/TimelineRail.module.css +170 -0
- package/src/client/TimelineRail.tsx +262 -0
- package/src/client/ToolActivity.tsx +214 -0
- package/src/client/TurnMetrics.module.css +139 -0
- package/src/client/TurnMetrics.tsx +160 -0
- package/src/client/WaitingStatus.tsx +22 -0
- package/src/client/conversation-scroll.ts +28 -0
- package/src/client/deliverables.ts +122 -0
- package/src/client/entry-policy.ts +20 -0
- package/src/client/entry.tsx +40 -0
- package/src/client/fold-choreography.ts +38 -0
- package/src/client/index.tsx +198 -0
- package/src/client/live-turn.ts +155 -0
- package/src/client/markdown/MarkdownText.module.css +304 -0
- package/src/client/markdown/MarkdownText.tsx +187 -0
- package/src/client/markdown/cjkFriendlyStrong.ts +84 -0
- package/src/client/markdown/incremental.ts +131 -0
- package/src/client/markdown/katex.tsx +91 -0
- package/src/client/markdown/mathCompatibility.ts +350 -0
- package/src/client/markdown/parse.ts +45 -0
- package/src/client/markdown/render.tsx +630 -0
- package/src/client/markdown/upstream.json +14 -0
- package/src/client/mcp-app.ts +323 -0
- package/src/client/message-chrome.ts +47 -0
- package/src/client/motion.tsx +338 -0
- package/src/client/native/ContextBody.module.css +161 -0
- package/src/client/native/ContextBody.tsx +591 -0
- package/src/client/native/ContextInjectionRow.module.css +62 -0
- package/src/client/native/ContextInjectionRow.tsx +72 -0
- package/src/client/native/ReferenceIcon.tsx +35 -0
- package/src/client/native/tool-call-model.ts +248 -0
- package/src/client/native/upstream.json +41 -0
- package/src/client/open-file.ts +94 -0
- package/src/client/pending-submission.ts +49 -0
- package/src/client/primitive-labels.ts +53 -0
- package/src/client/projection.ts +118 -0
- package/src/client/reasoning-follow.ts +12 -0
- package/src/client/settings-copy.ts +53 -0
- package/src/client/settings-slots.ts +20 -0
- package/src/client/settings.tsx +73 -0
- package/src/client/skill-status.ts +78 -0
- package/src/client/store.ts +30 -0
- package/src/client/stream-buffer.ts +100 -0
- package/src/client/streaming.tsx +62 -0
- package/src/client/style.d.ts +4 -0
- package/src/client/timeline.ts +77 -0
- package/src/client/tool-activity.ts +152 -0
- package/src/client/types.ts +66 -0
- package/src/client/waiting-clock.ts +25 -0
- package/src/client/word-motion.tsx +91 -0
- package/src/client/word-timeline.ts +96 -0
- package/src/dsh-better-display.ts +108 -0
- package/src/skill-roots.ts +138 -0
- package/src/skill-status.ts +81 -0
- package/tests/browser-closed-gap.tsx +20 -0
- package/tests/browser-motion.tsx +65 -0
- package/tests/browser-sticky-lanes.tsx +22 -0
- package/tests/browser-waiting-clock.tsx +14 -0
- package/tests/chat-flow-hook.test.ts +66 -0
- package/tests/cloud-gate.test.ts +34 -0
- package/tests/conversation-scroll.test.ts +47 -0
- package/tests/deliverables.test.ts +128 -0
- package/tests/entry.test.ts +42 -0
- package/tests/fixtures/maid-composer-hide.html +31 -0
- package/tests/fold-choreography.test.ts +38 -0
- package/tests/history-word-regression.test.ts +16 -0
- package/tests/live-turn.test.ts +218 -0
- package/tests/mcp-apps.test.ts +157 -0
- package/tests/message-chrome.test.ts +29 -0
- package/tests/open-file.test.ts +103 -0
- package/tests/pending-submission.test.ts +45 -0
- package/tests/projection.test.ts +184 -0
- package/tests/reasoning-follow.test.ts +34 -0
- package/tests/settings-copy.test.ts +63 -0
- package/tests/skill-status.test.ts +137 -0
- package/tests/stock-install.test.ts +50 -0
- package/tests/stream-buffer.test.ts +97 -0
- package/tests/timeline.test.ts +59 -0
- package/tests/waiting-clock.test.ts +24 -0
- package/tests/word-timeline.test.ts +136 -0
- package/tsconfig.json +11 -0
- package/tsdown.config.ts +49 -0
|
@@ -0,0 +1,25 @@
|
|
|
1
|
+
/**
|
|
2
|
+
* Conversation-column scroll helpers. Official ChatView lands Turns by writing
|
|
3
|
+
* the enclosing `[data-conversation-scroll]` box; `Element.scrollIntoView`
|
|
4
|
+
* also walks ancestor scrollers and can lift the sticky composer off the
|
|
5
|
+
* bottom of the viewport (rail jump to top, then to bottom).
|
|
6
|
+
*/
|
|
7
|
+
/** Reading-line offset used by ui-chat ChatView.landOnRow. */
|
|
8
|
+
export const READING_LINE_OFFSET_PX = 24;
|
|
9
|
+
/** Active column host when present; otherwise the view-local scroller. */
|
|
10
|
+
export function scrollerOf(from) {
|
|
11
|
+
return from.closest('[data-conversation-scroll]') ?? from;
|
|
12
|
+
}
|
|
13
|
+
/** Row position in scrollport coordinates (viewport-independent). */
|
|
14
|
+
export function flowTop(row, scrollport) {
|
|
15
|
+
return row.getBoundingClientRect().top - scrollport.getBoundingClientRect().top;
|
|
16
|
+
}
|
|
17
|
+
/**
|
|
18
|
+
* Place `row` on the conversation scroller only. Never calls scrollIntoView.
|
|
19
|
+
* @param row - a rendered `[data-reader-turn]` row.
|
|
20
|
+
* @param scrollport - `scrollerOf` of the reader root.
|
|
21
|
+
*/
|
|
22
|
+
export function landTurn(row, scrollport, offsetPx = READING_LINE_OFFSET_PX) {
|
|
23
|
+
scrollport.scrollTop += flowTop(row, scrollport) - offsetPx;
|
|
24
|
+
}
|
|
25
|
+
//# sourceMappingURL=conversation-scroll.js.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"conversation-scroll.js","sourceRoot":"","sources":["../../../src/client/conversation-scroll.ts"],"names":[],"mappings":"AAAA;;;;;GAKG;AAEH,8DAA8D;AAC9D,MAAM,CAAC,MAAM,sBAAsB,GAAG,EAAE,CAAC;AAEzC,0EAA0E;AAC1E,MAAM,UAAU,UAAU,CAAC,IAAiB;IAC1C,OAAO,IAAI,CAAC,OAAO,CAAC,4BAA4B,CAAC,IAAI,IAAI,CAAC;AAC5D,CAAC;AAED,qEAAqE;AACrE,MAAM,UAAU,OAAO,CAAC,GAAgB,EAAE,UAAuB;IAC/D,OAAO,GAAG,CAAC,qBAAqB,EAAE,CAAC,GAAG,GAAG,UAAU,CAAC,qBAAqB,EAAE,CAAC,GAAG,CAAC;AAClF,CAAC;AAED;;;;GAIG;AACH,MAAM,UAAU,QAAQ,CAAC,GAAgB,EAAE,UAAuB,EAAE,QAAQ,GAAG,sBAAsB;IACnG,UAAU,CAAC,SAAS,IAAI,OAAO,CAAC,GAAG,EAAE,UAAU,CAAC,GAAG,QAAQ,CAAC;AAC9D,CAAC"}
|
|
@@ -0,0 +1,24 @@
|
|
|
1
|
+
import type { TurnLocation } from '@deepseek-ai/dsh-client-ui-conversation/client';
|
|
2
|
+
import type { MarkdownFileMentions } from '@deepseek-ai/dsh-client-ui-primitives';
|
|
3
|
+
import type { ReaderFlowEntry } from './tool-activity.js';
|
|
4
|
+
/** Extract standard filename without directory components. */
|
|
5
|
+
export declare function basename(path: string): string;
|
|
6
|
+
/** Extract parent directory of a path (or '.' if top-level). */
|
|
7
|
+
export declare function dirname(path: string): string;
|
|
8
|
+
/**
|
|
9
|
+
* The produced-files chip row waits for turn close. Live writes still
|
|
10
|
+
* accumulate, but the row must not interrupt an in-progress process.
|
|
11
|
+
*/
|
|
12
|
+
export declare function showDeliverablesRow(status: 'open' | 'closed' | 'unknown', paths: readonly string[]): boolean;
|
|
13
|
+
/**
|
|
14
|
+
* Extract all unique file paths produced/modified in one turn.
|
|
15
|
+
* Respects official deliverables data when available, and falls back to
|
|
16
|
+
* inspecting successful write/edit tool invocations in the turn flow.
|
|
17
|
+
*/
|
|
18
|
+
export declare function getTurnDeliverables(turn: TurnLocation | undefined, flow?: readonly ReaderFlowEntry[]): readonly string[];
|
|
19
|
+
/**
|
|
20
|
+
* File-mention resolver: converts inline-code tokens matching produced paths
|
|
21
|
+
* into clickable file references that open the corresponding file on the host.
|
|
22
|
+
*/
|
|
23
|
+
export declare function createProducedFileMentions(paths: readonly string[], openFile: (path: string) => void): MarkdownFileMentions;
|
|
24
|
+
//# sourceMappingURL=deliverables.d.ts.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"deliverables.d.ts","sourceRoot":"","sources":["../../../src/client/deliverables.ts"],"names":[],"mappings":"AAAA,OAAO,KAAK,EAAE,YAAY,EAAE,MAAM,gDAAgD,CAAC;AACnF,OAAO,KAAK,EAAE,oBAAoB,EAAE,MAAM,uCAAuC,CAAC;AAClF,OAAO,KAAK,EAAE,eAAe,EAAE,MAAM,oBAAoB,CAAC;AAY1D,8DAA8D;AAC9D,wBAAgB,QAAQ,CAAC,IAAI,EAAE,MAAM,GAAG,MAAM,CAI7C;AAED,gEAAgE;AAChE,wBAAgB,OAAO,CAAC,IAAI,EAAE,MAAM,GAAG,MAAM,CAI5C;AAED;;;GAGG;AACH,wBAAgB,mBAAmB,CAAC,MAAM,EAAE,MAAM,GAAG,QAAQ,GAAG,SAAS,EAAE,KAAK,EAAE,SAAS,MAAM,EAAE,GAAG,OAAO,CAE5G;AAED;;;;GAIG;AACH,wBAAgB,mBAAmB,CAAC,IAAI,EAAE,YAAY,GAAG,SAAS,EAAE,IAAI,CAAC,EAAE,SAAS,eAAe,EAAE,GAAG,SAAS,MAAM,EAAE,CAmDxH;AAQD;;;GAGG;AACH,wBAAgB,0BAA0B,CACxC,KAAK,EAAE,SAAS,MAAM,EAAE,EACxB,QAAQ,EAAE,CAAC,IAAI,EAAE,MAAM,KAAK,IAAI,GAC/B,oBAAoB,CActB"}
|
|
@@ -0,0 +1,104 @@
|
|
|
1
|
+
import { inputFields, stringValue, toolIdentity } from './tool-activity.js';
|
|
2
|
+
/** Extract standard filename without directory components. */
|
|
3
|
+
export function basename(path) {
|
|
4
|
+
const normalized = path.replace(/[/\\]+$/, '');
|
|
5
|
+
const at = Math.max(normalized.lastIndexOf('/'), normalized.lastIndexOf('\\'));
|
|
6
|
+
return at === -1 ? normalized : normalized.slice(at + 1);
|
|
7
|
+
}
|
|
8
|
+
/** Extract parent directory of a path (or '.' if top-level). */
|
|
9
|
+
export function dirname(path) {
|
|
10
|
+
const normalized = path.replace(/[/\\]+$/, '');
|
|
11
|
+
const at = Math.max(normalized.lastIndexOf('/'), normalized.lastIndexOf('\\'));
|
|
12
|
+
return at === -1 ? '.' : normalized.slice(0, at) || '.';
|
|
13
|
+
}
|
|
14
|
+
/**
|
|
15
|
+
* The produced-files chip row waits for turn close. Live writes still
|
|
16
|
+
* accumulate, but the row must not interrupt an in-progress process.
|
|
17
|
+
*/
|
|
18
|
+
export function showDeliverablesRow(status, paths) {
|
|
19
|
+
return status === 'closed' && paths.length > 0;
|
|
20
|
+
}
|
|
21
|
+
/**
|
|
22
|
+
* Extract all unique file paths produced/modified in one turn.
|
|
23
|
+
* Respects official deliverables data when available, and falls back to
|
|
24
|
+
* inspecting successful write/edit tool invocations in the turn flow.
|
|
25
|
+
*/
|
|
26
|
+
export function getTurnDeliverables(turn, flow) {
|
|
27
|
+
const paths = [];
|
|
28
|
+
const seen = new Set();
|
|
29
|
+
// 1. Check official deliverables turn data from @deepseek-ai/dsh-client-ui-deliverables
|
|
30
|
+
const deliverables = turn?.data?.get('deliverables');
|
|
31
|
+
if (deliverables?.produced && Array.isArray(deliverables.produced)) {
|
|
32
|
+
for (const item of deliverables.produced) {
|
|
33
|
+
if (typeof item?.path === 'string' && item.path.trim().length > 0) {
|
|
34
|
+
const clean = item.path.trim();
|
|
35
|
+
if (!seen.has(clean)) {
|
|
36
|
+
seen.add(clean);
|
|
37
|
+
paths.push(clean);
|
|
38
|
+
}
|
|
39
|
+
}
|
|
40
|
+
}
|
|
41
|
+
}
|
|
42
|
+
if (paths.length > 0)
|
|
43
|
+
return paths;
|
|
44
|
+
// 2. Fallback: inspect successful file modification tool calls in the flow
|
|
45
|
+
if (flow) {
|
|
46
|
+
for (const item of flow) {
|
|
47
|
+
if (item.kind !== 'tool' || !item.block)
|
|
48
|
+
continue;
|
|
49
|
+
// Skip failed tool results
|
|
50
|
+
if ('isError' in item.block && item.block.isError)
|
|
51
|
+
continue;
|
|
52
|
+
const { name, raw } = toolIdentity(item);
|
|
53
|
+
const toolName = name !== '工具调用' ? name : (item.block.name || item.block.call?.name);
|
|
54
|
+
const toolRaw = raw || (item.block.argsRaw || item.block.call?.argsRaw || '');
|
|
55
|
+
if (toolName === 'write' || toolName === 'edit' || toolName === 'apply_patch') {
|
|
56
|
+
const args = inputFields(toolRaw);
|
|
57
|
+
const target = stringValue(args, 'file_path', 'path', 'filename', 'filePath');
|
|
58
|
+
if (target && !seen.has(target)) {
|
|
59
|
+
seen.add(target);
|
|
60
|
+
paths.push(target);
|
|
61
|
+
}
|
|
62
|
+
}
|
|
63
|
+
else if (toolName === 'str_replace_editor') {
|
|
64
|
+
const args = inputFields(toolRaw);
|
|
65
|
+
const cmd = stringValue(args, 'command');
|
|
66
|
+
if (cmd === 'create' || cmd === 'str_replace' || cmd === 'insert') {
|
|
67
|
+
const target = stringValue(args, 'path');
|
|
68
|
+
if (target && !seen.has(target)) {
|
|
69
|
+
seen.add(target);
|
|
70
|
+
paths.push(target);
|
|
71
|
+
}
|
|
72
|
+
}
|
|
73
|
+
}
|
|
74
|
+
}
|
|
75
|
+
}
|
|
76
|
+
return paths;
|
|
77
|
+
}
|
|
78
|
+
/** The single produced path whose basename is exactly value, or undefined. */
|
|
79
|
+
function onlyPathWithBasename(paths, value) {
|
|
80
|
+
const matches = paths.filter(path => basename(path) === value);
|
|
81
|
+
return matches.length === 1 ? matches[0] : undefined;
|
|
82
|
+
}
|
|
83
|
+
/**
|
|
84
|
+
* File-mention resolver: converts inline-code tokens matching produced paths
|
|
85
|
+
* into clickable file references that open the corresponding file on the host.
|
|
86
|
+
*/
|
|
87
|
+
export function createProducedFileMentions(paths, openFile) {
|
|
88
|
+
return {
|
|
89
|
+
resolve(value) {
|
|
90
|
+
if (!value || value.includes('\n'))
|
|
91
|
+
return undefined;
|
|
92
|
+
const clean = value.trim();
|
|
93
|
+
const path = paths.includes(clean) ? clean : onlyPathWithBasename(paths, clean);
|
|
94
|
+
if (path === undefined)
|
|
95
|
+
return undefined;
|
|
96
|
+
return {
|
|
97
|
+
open: () => { openFile(path); },
|
|
98
|
+
label: `打开 ${path}`,
|
|
99
|
+
title: path,
|
|
100
|
+
};
|
|
101
|
+
},
|
|
102
|
+
};
|
|
103
|
+
}
|
|
104
|
+
//# sourceMappingURL=deliverables.js.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"deliverables.js","sourceRoot":"","sources":["../../../src/client/deliverables.ts"],"names":[],"mappings":"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"}
|
|
@@ -0,0 +1,10 @@
|
|
|
1
|
+
/** Select the reading view on entry, without fighting a later explicit tab choice. */
|
|
2
|
+
export declare class ReaderEntryPolicy {
|
|
3
|
+
private readonly requested;
|
|
4
|
+
private readonly consumeRequest;
|
|
5
|
+
private entered;
|
|
6
|
+
constructor(requested: boolean, consumeRequest?: () => void);
|
|
7
|
+
select(view: string | null | undefined): 'reader' | null;
|
|
8
|
+
}
|
|
9
|
+
export declare function readerEntryRequested(search: string): boolean;
|
|
10
|
+
//# sourceMappingURL=entry-policy.d.ts.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"entry-policy.d.ts","sourceRoot":"","sources":["../../../src/client/entry-policy.ts"],"names":[],"mappings":"AAAA,sFAAsF;AACtF,qBAAa,iBAAiB;IAGhB,OAAO,CAAC,QAAQ,CAAC,SAAS;IAAW,OAAO,CAAC,QAAQ,CAAC,cAAc;IAFhF,OAAO,CAAC,OAAO,CAAS;gBAEK,SAAS,EAAE,OAAO,EAAmB,cAAc,GAAE,MAAM,IAAe;IAEvG,MAAM,CAAC,IAAI,EAAE,MAAM,GAAG,IAAI,GAAG,SAAS,GAAG,QAAQ,GAAG,IAAI;CAQzD;AAED,wBAAgB,oBAAoB,CAAC,MAAM,EAAE,MAAM,GAAG,OAAO,CAG5D"}
|
|
@@ -0,0 +1,24 @@
|
|
|
1
|
+
/** Select the reading view on entry, without fighting a later explicit tab choice. */
|
|
2
|
+
export class ReaderEntryPolicy {
|
|
3
|
+
requested;
|
|
4
|
+
consumeRequest;
|
|
5
|
+
entered = false;
|
|
6
|
+
constructor(requested, consumeRequest = () => { }) {
|
|
7
|
+
this.requested = requested;
|
|
8
|
+
this.consumeRequest = consumeRequest;
|
|
9
|
+
}
|
|
10
|
+
select(view) {
|
|
11
|
+
const requested = !this.entered && this.requested;
|
|
12
|
+
if (!this.entered) {
|
|
13
|
+
this.entered = true;
|
|
14
|
+
if (this.requested)
|
|
15
|
+
this.consumeRequest();
|
|
16
|
+
}
|
|
17
|
+
return (requested || view == null) && view !== 'reader' ? 'reader' : null;
|
|
18
|
+
}
|
|
19
|
+
}
|
|
20
|
+
export function readerEntryRequested(search) {
|
|
21
|
+
const value = new URLSearchParams(search).get('reader');
|
|
22
|
+
return value === '1' || /^0\.1\.0-trial\.\d+$/.test(value ?? '');
|
|
23
|
+
}
|
|
24
|
+
//# sourceMappingURL=entry-policy.js.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"entry-policy.js","sourceRoot":"","sources":["../../../src/client/entry-policy.ts"],"names":[],"mappings":"AAAA,sFAAsF;AACtF,MAAM,OAAO,iBAAiB;IAGC;IAAqC;IAF1D,OAAO,GAAG,KAAK,CAAC;IAExB,YAA6B,SAAkB,EAAmB,iBAA6B,GAAG,EAAE,GAAE,CAAC;QAA1E,cAAS,GAAT,SAAS,CAAS;QAAmB,mBAAc,GAAd,cAAc,CAAuB;IAAG,CAAC;IAE3G,MAAM,CAAC,IAA+B;QACpC,MAAM,SAAS,GAAG,CAAC,IAAI,CAAC,OAAO,IAAI,IAAI,CAAC,SAAS,CAAC;QAClD,IAAI,CAAC,IAAI,CAAC,OAAO,EAAE,CAAC;YAClB,IAAI,CAAC,OAAO,GAAG,IAAI,CAAC;YACpB,IAAI,IAAI,CAAC,SAAS;gBAAE,IAAI,CAAC,cAAc,EAAE,CAAC;QAC5C,CAAC;QACD,OAAO,CAAC,SAAS,IAAI,IAAI,IAAI,IAAI,CAAC,IAAI,IAAI,KAAK,QAAQ,CAAC,CAAC,CAAC,QAAQ,CAAC,CAAC,CAAC,IAAI,CAAC;IAC5E,CAAC;CACF;AAED,MAAM,UAAU,oBAAoB,CAAC,MAAc;IACjD,MAAM,KAAK,GAAG,IAAI,eAAe,CAAC,MAAM,CAAC,CAAC,GAAG,CAAC,QAAQ,CAAC,CAAC;IACxD,OAAO,KAAK,KAAK,GAAG,IAAI,sBAAsB,CAAC,IAAI,CAAC,KAAK,IAAI,EAAE,CAAC,CAAC;AACnE,CAAC"}
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"entry.d.ts","sourceRoot":"","sources":["../../../src/client/entry.tsx"],"names":[],"mappings":"AACA,OAAO,KAAK,EAAE,OAAO,EAAE,MAAM,qBAAqB,CAAC;AAuBnD,oFAAoF;AACpF,wBAAgB,kBAAkB,CAAC,GAAG,EAAE,OAAO,GAAG,MAAM,IAAI,CAc3D"}
|
|
@@ -0,0 +1,34 @@
|
|
|
1
|
+
import { useLayoutEffect } from 'react';
|
|
2
|
+
import { ReaderEntryPolicy, readerEntryRequested } from './entry-policy.js';
|
|
3
|
+
function isConversationStore(store) {
|
|
4
|
+
return typeof store === 'object' && store !== null
|
|
5
|
+
&& store.spec.persist === 'dsh.conversation'
|
|
6
|
+
&& typeof store.spec.actions.setView === 'function';
|
|
7
|
+
}
|
|
8
|
+
function ReaderEntry({ useStore, actions, policy }) {
|
|
9
|
+
const view = useStore(state => state.view);
|
|
10
|
+
useLayoutEffect(() => {
|
|
11
|
+
const next = policy.select(view);
|
|
12
|
+
if (next)
|
|
13
|
+
actions.setView(next);
|
|
14
|
+
}, [view, actions, policy]);
|
|
15
|
+
return null;
|
|
16
|
+
}
|
|
17
|
+
/** Reuse the native store handle; its framework-owned instance preserves drafts. */
|
|
18
|
+
export function installReaderEntry(ctx) {
|
|
19
|
+
const native = ctx.slots.entriesOfSlot('conversation.session')[0]?.store;
|
|
20
|
+
if (!isConversationStore(native))
|
|
21
|
+
throw new Error('DSH Reader cannot bind the native conversation view store.');
|
|
22
|
+
const policy = new ReaderEntryPolicy(readerEntryRequested(location.search), () => {
|
|
23
|
+
const url = new URL(location.href);
|
|
24
|
+
url.searchParams.delete('reader');
|
|
25
|
+
history.replaceState(history.state, '', `${url.pathname}${url.search}${url.hash}`);
|
|
26
|
+
});
|
|
27
|
+
return ctx.slots.register({
|
|
28
|
+
name: 'conversation.input.dock',
|
|
29
|
+
id: 'dsh-better-display-entry',
|
|
30
|
+
store: native,
|
|
31
|
+
inject: () => ({ policy }),
|
|
32
|
+
}, ReaderEntry);
|
|
33
|
+
}
|
|
34
|
+
//# sourceMappingURL=entry.js.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"entry.js","sourceRoot":"","sources":["../../../src/client/entry.tsx"],"names":[],"mappings":"AAAA,OAAO,EAAE,eAAe,EAAE,MAAM,OAAO,CAAC;AAKxC,OAAO,EAAE,iBAAiB,EAAE,oBAAoB,EAAE,MAAM,mBAAmB,CAAC;AAE5E,SAAS,mBAAmB,CAAC,KAA4B;IACvD,OAAO,OAAO,KAAK,KAAK,QAAQ,IAAI,KAAK,KAAK,IAAI;WAC7C,KAAK,CAAC,IAAI,CAAC,OAAO,KAAK,kBAAkB;WACzC,OAAO,KAAK,CAAC,IAAI,CAAC,OAAO,CAAC,OAAO,KAAK,UAAU,CAAC;AACxD,CAAC;AAID,SAAS,WAAW,CAAC,EAAE,QAAQ,EAAE,OAAO,EAAE,MAAM,EAAc;IAC5D,MAAM,IAAI,GAAG,QAAQ,CAAC,KAAK,CAAC,EAAE,CAAC,KAAK,CAAC,IAAI,CAAC,CAAC;IAC3C,eAAe,CAAC,GAAG,EAAE;QACnB,MAAM,IAAI,GAAG,MAAM,CAAC,MAAM,CAAC,IAAI,CAAC,CAAC;QACjC,IAAI,IAAI;YAAE,OAAO,CAAC,OAAO,CAAC,IAAI,CAAC,CAAC;IAClC,CAAC,EAAE,CAAC,IAAI,EAAE,OAAO,EAAE,MAAM,CAAC,CAAC,CAAC;IAC5B,OAAO,IAAI,CAAC;AACd,CAAC;AAED,oFAAoF;AACpF,MAAM,UAAU,kBAAkB,CAAC,GAAY;IAC7C,MAAM,MAAM,GAAG,GAAG,CAAC,KAAK,CAAC,aAAa,CAAC,sBAAsB,CAAC,CAAC,CAAC,CAAC,EAAE,KAAK,CAAC;IACzE,IAAI,CAAC,mBAAmB,CAAC,MAAM,CAAC;QAAE,MAAM,IAAI,KAAK,CAAC,4DAA4D,CAAC,CAAC;IAChH,MAAM,MAAM,GAAG,IAAI,iBAAiB,CAAC,oBAAoB,CAAC,QAAQ,CAAC,MAAM,CAAC,EAAE,GAAG,EAAE;QAC/E,MAAM,GAAG,GAAG,IAAI,GAAG,CAAC,QAAQ,CAAC,IAAI,CAAC,CAAC;QACnC,GAAG,CAAC,YAAY,CAAC,MAAM,CAAC,QAAQ,CAAC,CAAC;QAClC,OAAO,CAAC,YAAY,CAAC,OAAO,CAAC,KAAK,EAAE,EAAE,EAAE,GAAG,GAAG,CAAC,QAAQ,GAAG,GAAG,CAAC,MAAM,GAAG,GAAG,CAAC,IAAI,EAAE,CAAC,CAAC;IACrF,CAAC,CAAC,CAAC;IACH,OAAO,GAAG,CAAC,KAAK,CAAC,QAAQ,CAAC;QACxB,IAAI,EAAE,yBAAyB;QAC/B,EAAE,EAAE,0BAA0B;QAC9B,KAAK,EAAE,MAAM;QACb,MAAM,EAAE,GAAG,EAAE,CAAC,CAAC,EAAE,MAAM,EAAE,CAAC;KAC3B,EAAE,WAAW,CAAC,CAAC;AAClB,CAAC"}
|
|
@@ -0,0 +1,28 @@
|
|
|
1
|
+
import type { LiveStep, LiveTurnItem } from './live-turn.js';
|
|
2
|
+
/** Presentation clock, not model/network time. */
|
|
3
|
+
export declare const FOLD_TIMING: {
|
|
4
|
+
readonly collapse: 320;
|
|
5
|
+
readonly count: 160;
|
|
6
|
+
readonly settle: 80;
|
|
7
|
+
readonly reveal: 180;
|
|
8
|
+
};
|
|
9
|
+
export type FoldPhase = 'idle' | 'collapse' | 'count' | 'settle' | 'reveal';
|
|
10
|
+
export type FlowRow = {
|
|
11
|
+
kind: 'summary';
|
|
12
|
+
key: string;
|
|
13
|
+
item: Extract<LiveTurnItem, {
|
|
14
|
+
kind: 'fold';
|
|
15
|
+
}>;
|
|
16
|
+
} | {
|
|
17
|
+
kind: 'step';
|
|
18
|
+
key: string;
|
|
19
|
+
step: LiveStep;
|
|
20
|
+
foldKey?: string;
|
|
21
|
+
};
|
|
22
|
+
/** A step always has the same parent and React key, even when its membership changes. */
|
|
23
|
+
export declare function flowRows(items: readonly LiveTurnItem[]): FlowRow[];
|
|
24
|
+
export declare function retiringKeys(before: readonly LiveTurnItem[], after: readonly LiveTurnItem[], open: Readonly<Record<string, boolean>>): string[];
|
|
25
|
+
/** Insert only new summary slots. Never admit incoming content during shrink. */
|
|
26
|
+
export declare function collapseRows(before: readonly LiveTurnItem[], target: readonly LiveTurnItem[]): FlowRow[];
|
|
27
|
+
export declare function containsNewUser(before: readonly LiveTurnItem[], after: readonly LiveTurnItem[]): boolean;
|
|
28
|
+
//# sourceMappingURL=fold-choreography.d.ts.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"fold-choreography.d.ts","sourceRoot":"","sources":["../../../src/client/fold-choreography.ts"],"names":[],"mappings":"AAAA,OAAO,KAAK,EAAE,QAAQ,EAAE,YAAY,EAAE,MAAM,gBAAgB,CAAC;AAE7D,kDAAkD;AAClD,eAAO,MAAM,WAAW;;;;;CAAkE,CAAC;AAC3F,MAAM,MAAM,SAAS,GAAG,MAAM,GAAG,UAAU,GAAG,OAAO,GAAG,QAAQ,GAAG,QAAQ,CAAC;AAC5E,MAAM,MAAM,OAAO,GACf;IAAE,IAAI,EAAE,SAAS,CAAC;IAAC,GAAG,EAAE,MAAM,CAAC;IAAC,IAAI,EAAE,OAAO,CAAC,YAAY,EAAE;QAAE,IAAI,EAAE,MAAM,CAAA;KAAE,CAAC,CAAA;CAAE,GAC/E;IAAE,IAAI,EAAE,MAAM,CAAC;IAAC,GAAG,EAAE,MAAM,CAAC;IAAC,IAAI,EAAE,QAAQ,CAAC;IAAC,OAAO,CAAC,EAAE,MAAM,CAAA;CAAE,CAAC;AAEpE,yFAAyF;AACzF,wBAAgB,QAAQ,CAAC,KAAK,EAAE,SAAS,YAAY,EAAE,GAAG,OAAO,EAAE,CAIlE;AAED,wBAAgB,YAAY,CAAC,MAAM,EAAE,SAAS,YAAY,EAAE,EAAE,KAAK,EAAE,SAAS,YAAY,EAAE,EAAE,IAAI,EAAE,QAAQ,CAAC,MAAM,CAAC,MAAM,EAAE,OAAO,CAAC,CAAC,GAAG,MAAM,EAAE,CAG/I;AAED,iFAAiF;AACjF,wBAAgB,YAAY,CAAC,MAAM,EAAE,SAAS,YAAY,EAAE,EAAE,MAAM,EAAE,SAAS,YAAY,EAAE,GAAG,OAAO,EAAE,CAUxG;AAED,wBAAgB,eAAe,CAAC,MAAM,EAAE,SAAS,YAAY,EAAE,EAAE,KAAK,EAAE,SAAS,YAAY,EAAE,GAAG,OAAO,CAGxG"}
|
|
@@ -0,0 +1,31 @@
|
|
|
1
|
+
/** Presentation clock, not model/network time. */
|
|
2
|
+
export const FOLD_TIMING = { collapse: 320, count: 160, settle: 80, reveal: 180 };
|
|
3
|
+
/** A step always has the same parent and React key, even when its membership changes. */
|
|
4
|
+
export function flowRows(items) {
|
|
5
|
+
return items.flatMap((item) => item.kind === 'fold'
|
|
6
|
+
? [{ kind: 'summary', key: item.key, item }, ...item.steps.map(step => ({ kind: 'step', key: step.key, step, foldKey: item.key }))]
|
|
7
|
+
: [{ kind: 'step', key: item.key, step: item.step }]);
|
|
8
|
+
}
|
|
9
|
+
export function retiringKeys(before, after, open) {
|
|
10
|
+
const folded = new Set(flowRows(after).filter(row => row.kind === 'step' && row.foldKey && !open[row.foldKey]).map(row => row.key));
|
|
11
|
+
return flowRows(before).filter(row => row.kind === 'step' && !row.foldKey && folded.has(row.key)).map(row => row.key);
|
|
12
|
+
}
|
|
13
|
+
/** Insert only new summary slots. Never admit incoming content during shrink. */
|
|
14
|
+
export function collapseRows(before, target) {
|
|
15
|
+
const rows = flowRows(before);
|
|
16
|
+
const headers = new Set(rows.filter(row => row.kind === 'summary').map(row => row.key));
|
|
17
|
+
for (const item of target) {
|
|
18
|
+
if (item.kind !== 'fold' || headers.has(item.key))
|
|
19
|
+
continue;
|
|
20
|
+
const members = new Set(item.steps.map(step => step.key));
|
|
21
|
+
const at = rows.findIndex(row => members.has(row.key));
|
|
22
|
+
if (at >= 0)
|
|
23
|
+
rows.splice(at, 0, { kind: 'summary', key: item.key, item: { ...item, summary: item.summary.replace(/\d+/g, '0') } });
|
|
24
|
+
}
|
|
25
|
+
return rows;
|
|
26
|
+
}
|
|
27
|
+
export function containsNewUser(before, after) {
|
|
28
|
+
const users = new Set(before.filter(item => item.kind === 'user').map(item => item.key));
|
|
29
|
+
return after.some(item => item.kind === 'user' && !users.has(item.key));
|
|
30
|
+
}
|
|
31
|
+
//# sourceMappingURL=fold-choreography.js.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"fold-choreography.js","sourceRoot":"","sources":["../../../src/client/fold-choreography.ts"],"names":[],"mappings":"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"}
|
|
@@ -0,0 +1,7 @@
|
|
|
1
|
+
import type { Context } from '@deepseek-ai/cordis';
|
|
2
|
+
export type { ReaderBlockOwner } from './types.js';
|
|
3
|
+
export { McpAppFrame } from './McpAppFrame.js';
|
|
4
|
+
export declare const name = "dsh-better-display-client";
|
|
5
|
+
export declare const inject: string[];
|
|
6
|
+
export declare function apply(ctx: Context): void;
|
|
7
|
+
//# sourceMappingURL=index.d.ts.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"index.d.ts","sourceRoot":"","sources":["../../../src/client/index.tsx"],"names":[],"mappings":"AAAA,OAAO,KAAK,EAAE,OAAO,EAAE,MAAM,qBAAqB,CAAC;AAqBnD,YAAY,EAAE,gBAAgB,EAAE,MAAM,YAAY,CAAC;AACnD,OAAO,EAAE,WAAW,EAAE,MAAM,kBAAkB,CAAC;AAC/C,eAAO,MAAM,IAAI,8BAA8B,CAAC;AAChD,eAAO,MAAM,MAAM,UAAoE,CAAC;AAExF,wBAAgB,KAAK,CAAC,GAAG,EAAE,OAAO,GAAG,IAAI,CAsIxC"}
|
|
@@ -0,0 +1,153 @@
|
|
|
1
|
+
import { resolveWorkspacePath } from '@deepseek-ai/dsh-util-workspace-path';
|
|
2
|
+
import { dirname } from './deliverables.js';
|
|
3
|
+
import { Reader } from './Reader.js';
|
|
4
|
+
import { createReaderStore } from './store.js';
|
|
5
|
+
import { installReaderEntry } from './entry.js';
|
|
6
|
+
import { fillComposerDom } from './mcp-app.js';
|
|
7
|
+
export { McpAppFrame } from './McpAppFrame.js';
|
|
8
|
+
export const name = 'dsh-better-display-client';
|
|
9
|
+
export const inject = ['slots', 'sessions', 'conversation', 'remote', 'remote.session'];
|
|
10
|
+
export function apply(ctx) {
|
|
11
|
+
const store = createReaderStore();
|
|
12
|
+
ctx.slots.inject('conversation.view', function* () {
|
|
13
|
+
yield ctx.slots.register({
|
|
14
|
+
name: 'conversation.view',
|
|
15
|
+
id: 'reader',
|
|
16
|
+
order: -5,
|
|
17
|
+
label: () => '阅读',
|
|
18
|
+
locale: 'chat',
|
|
19
|
+
children: { 'dsh-better-display.block': { kind: 'chain', scope: 'session' } },
|
|
20
|
+
store,
|
|
21
|
+
inject: (sessionId) => {
|
|
22
|
+
const session = () => {
|
|
23
|
+
const current = ctx.sessions.binding(sessionId)?.session;
|
|
24
|
+
if (!current)
|
|
25
|
+
throw new Error('阅读页对应的会话已关闭。');
|
|
26
|
+
return current;
|
|
27
|
+
};
|
|
28
|
+
return {
|
|
29
|
+
loadOlder: async () => { await session().loadOlder(); },
|
|
30
|
+
loadImage: async (attachment) => {
|
|
31
|
+
const receipt = await session().readAttachment(attachment.attachmentId);
|
|
32
|
+
if (!receipt.ok)
|
|
33
|
+
throw new Error(receipt.error.message);
|
|
34
|
+
return { data: Uint8Array.from(receipt.value.data), mediaType: receipt.value.attachment.mediaType };
|
|
35
|
+
},
|
|
36
|
+
openFile: async (path) => {
|
|
37
|
+
try {
|
|
38
|
+
const cwd = ctx.sessions?.list?.getSnapshot?.()?.byId[sessionId]?.cwd;
|
|
39
|
+
const targetPath = path === '.' || path === ''
|
|
40
|
+
? (cwd ?? '.')
|
|
41
|
+
: resolveWorkspacePath(cwd, path);
|
|
42
|
+
const remote = ctx.remote;
|
|
43
|
+
const remoteSession = remote?.session
|
|
44
|
+
?? ctx.get?.('remote.session')
|
|
45
|
+
?? (ctx.get?.('remote')?.session);
|
|
46
|
+
if (remoteSession?.openWorkspacePath) {
|
|
47
|
+
const result = await remoteSession.openWorkspacePath({ path: targetPath });
|
|
48
|
+
if (!result?.ok) {
|
|
49
|
+
console.warn('[dsh-better-display] openWorkspacePath failed:', result?.error?.message);
|
|
50
|
+
}
|
|
51
|
+
}
|
|
52
|
+
else {
|
|
53
|
+
console.warn('[dsh-better-display] remote.session is not available');
|
|
54
|
+
}
|
|
55
|
+
}
|
|
56
|
+
catch (error) {
|
|
57
|
+
console.warn('[dsh-better-display] openFile error:', error);
|
|
58
|
+
}
|
|
59
|
+
},
|
|
60
|
+
revealFile: async (path) => {
|
|
61
|
+
try {
|
|
62
|
+
const cwd = ctx.sessions?.list?.getSnapshot?.()?.byId[sessionId]?.cwd;
|
|
63
|
+
const targetPath = resolveWorkspacePath(cwd, path);
|
|
64
|
+
// 1. Try dedicated host endpoint for native file highlighting (open -R / explorer /select)
|
|
65
|
+
try {
|
|
66
|
+
const res = await fetch('/better-display/reveal', {
|
|
67
|
+
method: 'POST',
|
|
68
|
+
headers: { 'Content-Type': 'application/json' },
|
|
69
|
+
body: JSON.stringify({ path: targetPath }),
|
|
70
|
+
});
|
|
71
|
+
if (res.ok) {
|
|
72
|
+
const data = await res.json();
|
|
73
|
+
if (data.ok)
|
|
74
|
+
return;
|
|
75
|
+
}
|
|
76
|
+
}
|
|
77
|
+
catch {
|
|
78
|
+
// Server endpoint not yet available, fallback to directory open
|
|
79
|
+
}
|
|
80
|
+
// 2. Fallback to official opener with parent directory
|
|
81
|
+
const parentDir = dirname(targetPath);
|
|
82
|
+
const remote = ctx.remote;
|
|
83
|
+
const remoteSession = remote?.session
|
|
84
|
+
?? ctx.get?.('remote.session');
|
|
85
|
+
if (remoteSession?.openWorkspacePath) {
|
|
86
|
+
await remoteSession.openWorkspacePath({ path: parentDir });
|
|
87
|
+
}
|
|
88
|
+
}
|
|
89
|
+
catch (error) {
|
|
90
|
+
console.warn('[dsh-better-display] revealFile error:', error);
|
|
91
|
+
}
|
|
92
|
+
},
|
|
93
|
+
forkAt: (seq) => {
|
|
94
|
+
// A missing anchor would silently fork the whole session instead of
|
|
95
|
+
// the intended turn prefix, so refuse it loudly rather than guessing.
|
|
96
|
+
if (typeof seq !== 'number' || !Number.isFinite(seq)) {
|
|
97
|
+
console.warn('[dsh-better-display] fork refused: missing anchor seq');
|
|
98
|
+
return;
|
|
99
|
+
}
|
|
100
|
+
try {
|
|
101
|
+
const sessionsApi = ctx.sessions;
|
|
102
|
+
if (sessionsApi?.fork) {
|
|
103
|
+
sessionsApi.fork({ sessionId, atSeq: seq, increaseTitle: true })
|
|
104
|
+
.then(childId => { sessionsApi.open?.(childId); })
|
|
105
|
+
.catch(err => { console.warn('[dsh-better-display] fork failed:', err); });
|
|
106
|
+
}
|
|
107
|
+
}
|
|
108
|
+
catch (error) {
|
|
109
|
+
console.warn('[dsh-better-display] forkAt error:', error);
|
|
110
|
+
}
|
|
111
|
+
},
|
|
112
|
+
loadThrough: async (seq) => {
|
|
113
|
+
try {
|
|
114
|
+
const current = session();
|
|
115
|
+
if (typeof current?.loadThrough === 'function') {
|
|
116
|
+
await current.loadThrough(seq);
|
|
117
|
+
}
|
|
118
|
+
else {
|
|
119
|
+
await session().loadOlder();
|
|
120
|
+
}
|
|
121
|
+
}
|
|
122
|
+
catch (error) {
|
|
123
|
+
console.warn('[dsh-better-display] loadThrough error:', error);
|
|
124
|
+
}
|
|
125
|
+
},
|
|
126
|
+
fillComposer: (text) => {
|
|
127
|
+
// Sanctioned path: the conversation input shell owns the Lexical
|
|
128
|
+
// editor, so setDraft lands in the draft store deterministically.
|
|
129
|
+
try {
|
|
130
|
+
const conversation = ctx.conversation;
|
|
131
|
+
const shell = conversation?.input?.shell?.(sessionId);
|
|
132
|
+
if (shell && typeof shell.setDraft === 'function') {
|
|
133
|
+
shell.setDraft(text);
|
|
134
|
+
return true;
|
|
135
|
+
}
|
|
136
|
+
}
|
|
137
|
+
catch {
|
|
138
|
+
// Fall through to the DOM path below.
|
|
139
|
+
}
|
|
140
|
+
try {
|
|
141
|
+
return fillComposerDom(text);
|
|
142
|
+
}
|
|
143
|
+
catch {
|
|
144
|
+
return false;
|
|
145
|
+
}
|
|
146
|
+
},
|
|
147
|
+
};
|
|
148
|
+
},
|
|
149
|
+
}, Reader);
|
|
150
|
+
yield installReaderEntry(ctx);
|
|
151
|
+
});
|
|
152
|
+
}
|
|
153
|
+
//# sourceMappingURL=index.js.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"index.js","sourceRoot":"","sources":["../../../src/client/index.tsx"],"names":[],"mappings":"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"}
|
|
@@ -0,0 +1,58 @@
|
|
|
1
|
+
import type { ChatConversationViewNode } from '@deepseek-ai/dsh-client-ui-chat/client';
|
|
2
|
+
import type { AssistantBlock } from '@deepseek-ai/dsh-client-ui-conversation/client';
|
|
3
|
+
import type { TurnBoundary } from './projection.js';
|
|
4
|
+
import type { ReaderFlowEntry, ToolActivityEntry } from './tool-activity.js';
|
|
5
|
+
export type LiveStep = {
|
|
6
|
+
kind: 'reasoning';
|
|
7
|
+
key: string;
|
|
8
|
+
nodeKey: string;
|
|
9
|
+
start: number;
|
|
10
|
+
blocks: AssistantBlock[];
|
|
11
|
+
step: number;
|
|
12
|
+
} | {
|
|
13
|
+
kind: 'body';
|
|
14
|
+
key: string;
|
|
15
|
+
nodeKey: string;
|
|
16
|
+
start: number;
|
|
17
|
+
blocks: AssistantBlock[];
|
|
18
|
+
step: number;
|
|
19
|
+
} | {
|
|
20
|
+
kind: 'tool';
|
|
21
|
+
key: string;
|
|
22
|
+
entry: ToolActivityEntry;
|
|
23
|
+
} | {
|
|
24
|
+
kind: 'user';
|
|
25
|
+
key: string;
|
|
26
|
+
nodeKey: string;
|
|
27
|
+
} | {
|
|
28
|
+
kind: 'other';
|
|
29
|
+
key: string;
|
|
30
|
+
nodeKey: string;
|
|
31
|
+
};
|
|
32
|
+
export type LiveTurnItem = {
|
|
33
|
+
kind: 'user';
|
|
34
|
+
key: string;
|
|
35
|
+
step: Extract<LiveStep, {
|
|
36
|
+
kind: 'user';
|
|
37
|
+
}>;
|
|
38
|
+
} | {
|
|
39
|
+
kind: 'fold';
|
|
40
|
+
key: string;
|
|
41
|
+
steps: readonly LiveStep[];
|
|
42
|
+
summary: string;
|
|
43
|
+
} | {
|
|
44
|
+
kind: 'open';
|
|
45
|
+
key: string;
|
|
46
|
+
step: LiveStep;
|
|
47
|
+
};
|
|
48
|
+
export declare function liveFoldEnabled(boundary: TurnBoundary): boolean;
|
|
49
|
+
export declare function foldSummary(steps: readonly LiveStep[]): string;
|
|
50
|
+
/** One chain: fold only when a new reasoning step has prior body/tool/reasoning. */
|
|
51
|
+
export declare function splitChain(chain: readonly LiveStep[]): {
|
|
52
|
+
fold: readonly LiveStep[] | null;
|
|
53
|
+
open: readonly LiveStep[];
|
|
54
|
+
};
|
|
55
|
+
/** Expand readerFlow into source-ordered live steps using existing block boundaries. */
|
|
56
|
+
export declare function segmentLiveTurn(flow: readonly ReaderFlowEntry[], get: (key: string) => ChatConversationViewNode | undefined): LiveStep[];
|
|
57
|
+
export declare function presentLiveTurn(steps: readonly LiveStep[], boundary: TurnBoundary, autoFold?: boolean): LiveTurnItem[];
|
|
58
|
+
//# sourceMappingURL=live-turn.d.ts.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"live-turn.d.ts","sourceRoot":"","sources":["../../../src/client/live-turn.ts"],"names":[],"mappings":"AAAA,OAAO,KAAK,EAAqB,wBAAwB,EAAE,MAAM,wCAAwC,CAAC;AAC1G,OAAO,KAAK,EAAE,cAAc,EAAE,MAAM,gDAAgD,CAAC;AAErF,OAAO,KAAK,EAAE,YAAY,EAAE,MAAM,iBAAiB,CAAC;AACpD,OAAO,KAAK,EAAE,eAAe,EAAE,iBAAiB,EAAE,MAAM,oBAAoB,CAAC;AAE7E,MAAM,MAAM,QAAQ,GAChB;IAAE,IAAI,EAAE,WAAW,CAAC;IAAC,GAAG,EAAE,MAAM,CAAC;IAAC,OAAO,EAAE,MAAM,CAAC;IAAC,KAAK,EAAE,MAAM,CAAC;IAAC,MAAM,EAAE,cAAc,EAAE,CAAC;IAAC,IAAI,EAAE,MAAM,CAAA;CAAE,GAC1G;IAAE,IAAI,EAAE,MAAM,CAAC;IAAC,GAAG,EAAE,MAAM,CAAC;IAAC,OAAO,EAAE,MAAM,CAAC;IAAC,KAAK,EAAE,MAAM,CAAC;IAAC,MAAM,EAAE,cAAc,EAAE,CAAC;IAAC,IAAI,EAAE,MAAM,CAAA;CAAE,GACrG;IAAE,IAAI,EAAE,MAAM,CAAC;IAAC,GAAG,EAAE,MAAM,CAAC;IAAC,KAAK,EAAE,iBAAiB,CAAA;CAAE,GACvD;IAAE,IAAI,EAAE,MAAM,CAAC;IAAC,GAAG,EAAE,MAAM,CAAC;IAAC,OAAO,EAAE,MAAM,CAAA;CAAE,GAC9C;IAAE,IAAI,EAAE,OAAO,CAAC;IAAC,GAAG,EAAE,MAAM,CAAC;IAAC,OAAO,EAAE,MAAM,CAAA;CAAE,CAAC;AAEpD,MAAM,MAAM,YAAY,GACpB;IAAE,IAAI,EAAE,MAAM,CAAC;IAAC,GAAG,EAAE,MAAM,CAAC;IAAC,IAAI,EAAE,OAAO,CAAC,QAAQ,EAAE;QAAE,IAAI,EAAE,MAAM,CAAA;KAAE,CAAC,CAAA;CAAE,GACxE;IAAE,IAAI,EAAE,MAAM,CAAC;IAAC,GAAG,EAAE,MAAM,CAAC;IAAC,KAAK,EAAE,SAAS,QAAQ,EAAE,CAAC;IAAC,OAAO,EAAE,MAAM,CAAA;CAAE,GAC1E;IAAE,IAAI,EAAE,MAAM,CAAC;IAAC,GAAG,EAAE,MAAM,CAAC;IAAC,IAAI,EAAE,QAAQ,CAAA;CAAE,CAAC;AAElD,wBAAgB,eAAe,CAAC,QAAQ,EAAE,YAAY,GAAG,OAAO,CAE/D;AAED,wBAAgB,WAAW,CAAC,KAAK,EAAE,SAAS,QAAQ,EAAE,GAAG,MAAM,CAiB9D;AAED,oFAAoF;AACpF,wBAAgB,UAAU,CAAC,KAAK,EAAE,SAAS,QAAQ,EAAE,GAAG;IAAE,IAAI,EAAE,SAAS,QAAQ,EAAE,GAAG,IAAI,CAAC;IAAC,IAAI,EAAE,SAAS,QAAQ,EAAE,CAAA;CAAE,CAQtH;AA0CD,wFAAwF;AACxF,wBAAgB,eAAe,CAC7B,IAAI,EAAE,SAAS,eAAe,EAAE,EAChC,GAAG,EAAE,CAAC,GAAG,EAAE,MAAM,KAAK,wBAAwB,GAAG,SAAS,GACzD,QAAQ,EAAE,CA4BZ;AAED,wBAAgB,eAAe,CAAC,KAAK,EAAE,SAAS,QAAQ,EAAE,EAAE,QAAQ,EAAE,YAAY,EAAE,QAAQ,UAAO,GAAG,YAAY,EAAE,CA4BnH"}
|