@drscrewdriver/dsh-better-display 0.3.3-fork.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 +259 -0
- package/DESIGN.md +72 -0
- package/LICENSE +24 -0
- package/README.en.md +55 -0
- package/README.md +55 -0
- package/THIRD_PARTY_NOTICES.md +65 -0
- package/compat/harness-rc2.json +99 -0
- package/cordis.patch.yml +5 -0
- package/cordis.yml +4 -0
- package/docs/official-rendering-bridge.md +65 -0
- package/dshx.yml +5 -0
- package/lib/client.js +49292 -0
- package/lib/client.js.map +1 -0
- package/lib/dsh-better-display.js +101 -0
- package/lib/types/client/Blocks.d.ts +49 -0
- package/lib/types/client/Blocks.d.ts.map +1 -0
- package/lib/types/client/Blocks.js +143 -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 +218 -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 +16 -0
- package/lib/types/client/ClosedProcessSummary.js.map +1 -0
- package/lib/types/client/DiffPanel.d.ts +13 -0
- package/lib/types/client/DiffPanel.d.ts.map +1 -0
- package/lib/types/client/DiffPanel.js +115 -0
- package/lib/types/client/DiffPanel.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/OfficialContent.d.ts +25 -0
- package/lib/types/client/OfficialContent.d.ts.map +1 -0
- package/lib/types/client/OfficialContent.js +53 -0
- package/lib/types/client/OfficialContent.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 +603 -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 +322 -0
- package/lib/types/client/ReasoningCard.js.map +1 -0
- package/lib/types/client/SettingsSection.d.ts +37 -0
- package/lib/types/client/SettingsSection.d.ts.map +1 -0
- package/lib/types/client/SettingsSection.js +63 -0
- package/lib/types/client/SettingsSection.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 +39 -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 +244 -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/WaitClock.d.ts +16 -0
- package/lib/types/client/WaitClock.d.ts.map +1 -0
- package/lib/types/client/WaitClock.js +29 -0
- package/lib/types/client/WaitClock.js.map +1 -0
- package/lib/types/client/WaitingClock.d.ts +15 -0
- package/lib/types/client/WaitingClock.d.ts.map +1 -0
- package/lib/types/client/WaitingClock.js +30 -0
- package/lib/types/client/WaitingClock.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 +9 -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 +40 -0
- package/lib/types/client/fold-choreography.d.ts.map +1 -0
- package/lib/types/client/fold-choreography.js +48 -0
- package/lib/types/client/fold-choreography.js.map +1 -0
- package/lib/types/client/fold-intensity.d.ts +11 -0
- package/lib/types/client/fold-intensity.d.ts.map +1 -0
- package/lib/types/client/fold-intensity.js +32 -0
- package/lib/types/client/fold-intensity.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 +195 -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 +190 -0
- package/lib/types/client/live-turn.js.map +1 -0
- package/lib/types/client/markdown/MarkdownText.d.ts +41 -0
- package/lib/types/client/markdown/MarkdownText.d.ts.map +1 -0
- package/lib/types/client/markdown/MarkdownText.js +178 -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 +121 -0
- package/lib/types/client/markdown/render.d.ts.map +1 -0
- package/lib/types/client/markdown/render.js +452 -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 +453 -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 +35 -0
- package/lib/types/client/native/ContextInjectionRow.d.ts.map +1 -0
- package/lib/types/client/native/ContextInjectionRow.js +42 -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/native/tool-update.d.ts +23 -0
- package/lib/types/client/native/tool-update.d.ts.map +1 -0
- package/lib/types/client/native/tool-update.js +22 -0
- package/lib/types/client/native/tool-update.js.map +1 -0
- package/lib/types/client/official-slots.d.ts +71 -0
- package/lib/types/client/official-slots.d.ts.map +1 -0
- package/lib/types/client/official-slots.js +183 -0
- package/lib/types/client/official-slots.js.map +1 -0
- package/lib/types/client/open-file.d.ts +29 -0
- package/lib/types/client/open-file.d.ts.map +1 -0
- package/lib/types/client/open-file.js +71 -0
- package/lib/types/client/open-file.js.map +1 -0
- package/lib/types/client/pending-submission.d.ts +28 -0
- package/lib/types/client/pending-submission.d.ts.map +1 -0
- package/lib/types/client/pending-submission.js +28 -0
- package/lib/types/client/pending-submission.js.map +1 -0
- package/lib/types/client/platform-media.d.ts +6 -0
- package/lib/types/client/platform-media.d.ts.map +1 -0
- package/lib/types/client/platform-media.js +18 -0
- package/lib/types/client/platform-media.js.map +1 -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 +38 -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 +10 -0
- package/lib/types/client/reasoning-follow.d.ts.map +1 -0
- package/lib/types/client/reasoning-follow.js +21 -0
- package/lib/types/client/reasoning-follow.js.map +1 -0
- package/lib/types/client/resource-address.d.ts +3 -0
- package/lib/types/client/resource-address.d.ts.map +1 -0
- package/lib/types/client/resource-address.js +33 -0
- package/lib/types/client/resource-address.js.map +1 -0
- package/lib/types/client/settings-copy.d.ts +7 -0
- package/lib/types/client/settings-copy.d.ts.map +1 -0
- package/lib/types/client/settings-copy.js +53 -0
- package/lib/types/client/settings-copy.js.map +1 -0
- package/lib/types/client/settings-slots.d.ts +23 -0
- package/lib/types/client/settings-slots.d.ts.map +1 -0
- package/lib/types/client/settings-slots.js +2 -0
- package/lib/types/client/settings-slots.js.map +1 -0
- package/lib/types/client/settings.d.ts +4 -0
- package/lib/types/client/settings.d.ts.map +1 -0
- package/lib/types/client/settings.js +60 -0
- package/lib/types/client/settings.js.map +1 -0
- package/lib/types/client/skill-status.d.ts +25 -0
- package/lib/types/client/skill-status.d.ts.map +1 -0
- package/lib/types/client/skill-status.js +44 -0
- package/lib/types/client/skill-status.js.map +1 -0
- package/lib/types/client/store.d.ts +35 -0
- package/lib/types/client/store.d.ts.map +1 -0
- package/lib/types/client/store.js +37 -0
- package/lib/types/client/store.js.map +1 -0
- package/lib/types/client/stream-buffer.d.ts +37 -0
- package/lib/types/client/stream-buffer.d.ts.map +1 -0
- package/lib/types/client/stream-buffer.js +150 -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 +84 -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 +98 -0
- package/lib/types/client/tool-activity.d.ts.map +1 -0
- package/lib/types/client/tool-activity.js +301 -0
- package/lib/types/client/tool-activity.js.map +1 -0
- package/lib/types/client/types.d.ts +91 -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 +49 -0
- package/lib/types/client/waiting-clock.d.ts.map +1 -0
- package/lib/types/client/waiting-clock.js +80 -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 +90 -0
- package/lib/types/client/word-motion.js.map +1 -0
- package/lib/types/client/word-timeline.d.ts +32 -0
- package/lib/types/client/word-timeline.d.ts.map +1 -0
- package/lib/types/client/word-timeline.js +119 -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 +93 -0
- package/lib/types/dsh-better-display.js.map +1 -0
- package/lib/types/skill-roots.d.ts +22 -0
- package/lib/types/skill-roots.d.ts.map +1 -0
- package/lib/types/skill-roots.js +126 -0
- package/lib/types/skill-roots.js.map +1 -0
- package/lib/types/skill-status.d.ts +36 -0
- package/lib/types/skill-status.d.ts.map +1 -0
- package/lib/types/skill-status.js +51 -0
- package/lib/types/skill-status.js.map +1 -0
- package/package.json +133 -0
- package/scripts/build-motion-fixture.mjs +26 -0
- package/scripts/check-harness-compat.mjs +71 -0
- package/scripts/link-harness-dependencies.mjs +54 -0
- package/scripts/verify-auto-fold.mjs +114 -0
- package/scripts/verify-official-bridge.mjs +121 -0
- package/scripts/verify-tool-shimmer.mjs +62 -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 +213 -0
- package/src/client/ChoreographedFlow.tsx +232 -0
- package/src/client/ClosedProcessSummary.tsx +23 -0
- package/src/client/DiffPanel.tsx +124 -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/OfficialContent.tsx +69 -0
- package/src/client/Reader.module.css +692 -0
- package/src/client/Reader.tsx +878 -0
- package/src/client/ReasoningCard.tsx +306 -0
- package/src/client/SettingsSection.module.css +184 -0
- package/src/client/SettingsSection.tsx +194 -0
- package/src/client/StickyLane.tsx +34 -0
- package/src/client/TimelineRail.module.css +170 -0
- package/src/client/TimelineRail.tsx +262 -0
- package/src/client/ToolActivity.tsx +274 -0
- package/src/client/TurnMetrics.module.css +139 -0
- package/src/client/TurnMetrics.tsx +160 -0
- package/src/client/WaitClock.tsx +33 -0
- package/src/client/WaitingStatus.tsx +13 -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 +55 -0
- package/src/client/fold-intensity.ts +36 -0
- package/src/client/index.tsx +222 -0
- package/src/client/live-turn.ts +198 -0
- package/src/client/markdown/MarkdownText.module.css +304 -0
- package/src/client/markdown/MarkdownText.tsx +195 -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 +647 -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 +410 -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 +66 -0
- package/src/client/native/ContextInjectionRow.tsx +106 -0
- package/src/client/native/ReferenceIcon.tsx +35 -0
- package/src/client/native/tool-call-model.ts +248 -0
- package/src/client/native/tool-update.ts +32 -0
- package/src/client/native/upstream.json +41 -0
- package/src/client/official-slots.tsx +211 -0
- package/src/client/open-file.ts +94 -0
- package/src/client/pending-submission.ts +49 -0
- package/src/client/platform-media.ts +17 -0
- package/src/client/primitive-labels.ts +54 -0
- package/src/client/projection.ts +118 -0
- package/src/client/reasoning-follow.ts +28 -0
- package/src/client/settings-copy.ts +80 -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 +75 -0
- package/src/client/stream-buffer.ts +136 -0
- package/src/client/streaming.tsx +70 -0
- package/src/client/style.d.ts +4 -0
- package/src/client/timeline.ts +77 -0
- package/src/client/tool-activity.ts +298 -0
- package/src/client/types.ts +89 -0
- package/src/client/waiting-clock.ts +83 -0
- package/src/client/word-motion.tsx +92 -0
- package/src/client/word-timeline.ts +113 -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-auto-fold.tsx +64 -0
- package/tests/browser-closed-gap.tsx +20 -0
- package/tests/browser-motion.tsx +65 -0
- package/tests/browser-official-bridge.tsx +152 -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/context-tool-update.test.ts +33 -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 +54 -0
- package/tests/fold-intensity.test.ts +94 -0
- package/tests/footer-precedence.test.ts +129 -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/official-slots.test.ts +112 -0
- package/tests/open-file.test.ts +114 -0
- package/tests/pending-submission.test.ts +45 -0
- package/tests/platform-media.test.ts +23 -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 +58 -0
- package/tests/stream-buffer.test.ts +102 -0
- package/tests/timeline.test.ts +59 -0
- package/tests/tool-diff.test.ts +57 -0
- package/tests/waiting-clock.test.ts +83 -0
- package/tests/word-timeline.test.ts +146 -0
- package/tsconfig.json +11 -0
- package/tsdown.config.ts +51 -0
|
@@ -0,0 +1,44 @@
|
|
|
1
|
+
import { jsx as _jsx, jsxs as _jsxs, Fragment as _Fragment } from "react/jsx-runtime";
|
|
2
|
+
import { memo, useEffect, useRef, useState } from 'react';
|
|
3
|
+
import { formatRanFor, formatRunDuration } from './message-chrome.js';
|
|
4
|
+
import css from './TurnMetrics.module.css';
|
|
5
|
+
function formatTokens(count) {
|
|
6
|
+
if (count >= 1_000_000)
|
|
7
|
+
return `${(count / 1_000_000).toFixed(2)}M tok`;
|
|
8
|
+
if (count >= 1000)
|
|
9
|
+
return `${(count / 1000).toFixed(1)}k tok`;
|
|
10
|
+
return `${count} tok`;
|
|
11
|
+
}
|
|
12
|
+
export const TurnMetrics = memo(function TurnMetrics({ usage, runMs, tokensPerSecond, ttftMs, }) {
|
|
13
|
+
const [open, setOpen] = useState(false);
|
|
14
|
+
const containerRef = useRef(null);
|
|
15
|
+
useEffect(() => {
|
|
16
|
+
if (!open)
|
|
17
|
+
return;
|
|
18
|
+
const onClickOutside = (e) => {
|
|
19
|
+
if (containerRef.current && !containerRef.current.contains(e.target)) {
|
|
20
|
+
setOpen(false);
|
|
21
|
+
}
|
|
22
|
+
};
|
|
23
|
+
const onKeyDown = (e) => {
|
|
24
|
+
if (e.key === 'Escape')
|
|
25
|
+
setOpen(false);
|
|
26
|
+
};
|
|
27
|
+
document.addEventListener('pointerdown', onClickOutside);
|
|
28
|
+
document.addEventListener('keydown', onKeyDown);
|
|
29
|
+
return () => {
|
|
30
|
+
document.removeEventListener('pointerdown', onClickOutside);
|
|
31
|
+
document.removeEventListener('keydown', onKeyDown);
|
|
32
|
+
};
|
|
33
|
+
}, [open]);
|
|
34
|
+
const totalTokens = usage?.totalTokens;
|
|
35
|
+
const hasTiming = typeof runMs === 'number' && runMs > 0;
|
|
36
|
+
const hasTokens = typeof totalTokens === 'number' && totalTokens > 0;
|
|
37
|
+
if (!hasTiming && !hasTokens)
|
|
38
|
+
return null;
|
|
39
|
+
const cacheHitPercent = usage && usage.cacheReadTokens && usage.totalTokens > usage.outputTokens
|
|
40
|
+
? Math.round((usage.cacheReadTokens / (usage.totalTokens - usage.outputTokens)) * 100)
|
|
41
|
+
: null;
|
|
42
|
+
return (_jsxs("span", { ref: containerRef, className: css.container, children: [hasTokens && typeof totalTokens === 'number' && (_jsxs("button", { type: "button", className: css.pillButton, "data-active": open, onClick: () => setOpen(v => !v), "aria-expanded": open, title: "\u67E5\u770B\u672C\u8F6E Token \u6D88\u8017", children: [_jsxs("svg", { className: css.pillIcon, viewBox: "0 0 16 16", fill: "none", stroke: "currentColor", children: [_jsx("ellipse", { cx: "8", cy: "4.2", rx: "5", ry: "2.2", strokeWidth: "1.2" }), _jsx("path", { d: "M3 4.2v7.6c0 1.2 2.2 2.2 5 2.2s5-1 5-2.2V4.2", strokeWidth: "1.2" }), _jsx("path", { d: "M3 8c0 1.2 2.2 2.2 5 2.2s5-1 5-2.2", strokeWidth: "1.2" })] }), _jsxs("span", { children: ["\u7528\u91CF ", formatTokens(totalTokens)] })] })), hasTiming && typeof runMs === 'number' && (_jsxs("button", { type: "button", className: css.timeButton, "data-active": open, onClick: () => setOpen(v => !v), "aria-expanded": open, "aria-label": formatRanFor(runMs), title: "\u67E5\u770B\u672C\u8F6E\u7528\u65F6\u548C\u901F\u5EA6", children: [_jsxs("svg", { className: css.pillIcon, viewBox: "0 0 16 16", fill: "none", stroke: "currentColor", children: [_jsx("circle", { cx: "8", cy: "8", r: "6.5", strokeWidth: "1.2" }), _jsx("path", { d: "M8 4.5v3.8l2.5 1.5", strokeWidth: "1.2", strokeLinecap: "round", strokeLinejoin: "round" })] }), _jsx("span", { children: formatRanFor(runMs) })] })), open && (_jsxs("div", { className: css.metricsPop, role: "dialog", "aria-label": "\u672C\u8F6E\u6982\u51B5", children: [_jsx("div", { className: css.popHeader, children: _jsx("span", { children: "\u672C\u8F6E\u6027\u80FD\u4E0E\u7528\u91CF\u6982\u51B5" }) }), hasTiming && typeof runMs === 'number' && (_jsxs("div", { className: css.popSection, children: [_jsx("div", { className: css.popSectionTitle, children: "\u8017\u65F6\u4E0E\u751F\u6210\u901F\u5EA6" }), _jsxs("div", { className: css.popGrid, children: [_jsx("span", { className: css.popLabel, children: "\u603B\u7528\u65F6" }), _jsx("span", { className: css.popValue, children: formatRunDuration(runMs) }), typeof tokensPerSecond === 'number' && tokensPerSecond > 0 && (_jsxs(_Fragment, { children: [_jsx("span", { className: css.popLabel, children: "\u751F\u6210\u541E\u5410 (TPS)" }), _jsxs("span", { className: css.popValue, children: [tokensPerSecond.toFixed(1), " tok/s"] })] })), typeof ttftMs === 'number' && ttftMs > 0 && (_jsxs(_Fragment, { children: [_jsx("span", { className: css.popLabel, children: "\u9996\u5B57\u5EF6\u8FDF (TTFT)" }), _jsxs("span", { className: css.popValue, children: [(ttftMs / 1000).toFixed(2), "s"] })] }))] })] })), hasTokens && usage && (_jsxs("div", { className: css.popSection, children: [_jsx("div", { className: css.popSectionTitle, children: "Token \u6D88\u8017\u5206\u89E3" }), _jsxs("div", { className: css.popGrid, children: [_jsx("span", { className: css.popLabel, children: "\u603B\u6D88\u8017" }), _jsxs("span", { className: css.popValue, children: [usage.totalTokens.toLocaleString(), " tok"] }), _jsxs("span", { className: css.popLabel, children: ["\u8F93\u5165", cacheHitPercent !== null && (_jsxs("span", { className: css.popBadge, children: ["\u547D\u4E2D ", cacheHitPercent, "%"] }))] }), _jsxs("span", { className: css.popValue, children: [(usage.totalTokens - usage.outputTokens).toLocaleString(), " tok"] }), typeof usage.cacheReadTokens === 'number' && usage.cacheReadTokens > 0 && (_jsxs(_Fragment, { children: [_jsx("span", { className: css.popLabel, children: "\u7F13\u5B58\u8BFB\u53D6" }), _jsxs("span", { className: css.popValue, children: [usage.cacheReadTokens.toLocaleString(), " tok"] })] })), _jsxs("span", { className: css.popLabel, children: ["\u8F93\u51FA", typeof usage.reasoningTokens === 'number' && usage.reasoningTokens > 0 && (_jsxs("span", { className: css.popBadge, children: ["\u601D\u8003 ", usage.reasoningTokens.toLocaleString()] }))] }), _jsxs("span", { className: css.popValue, children: [usage.outputTokens?.toLocaleString() ?? 0, " tok"] })] })] }))] }))] }));
|
|
43
|
+
});
|
|
44
|
+
//# sourceMappingURL=TurnMetrics.js.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"TurnMetrics.js","sourceRoot":"","sources":["../../../src/client/TurnMetrics.tsx"],"names":[],"mappings":"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"}
|
|
@@ -0,0 +1,16 @@
|
|
|
1
|
+
/** Past this, a wait stops being a pause and reads as the model not answering. */
|
|
2
|
+
export declare const WAIT_OVERTIME_MS = 10000;
|
|
3
|
+
/**
|
|
4
|
+
* How long the model has been given the turn, counted in plain seconds.
|
|
5
|
+
*
|
|
6
|
+
* Just the number and, past ten seconds, a「暂未响应」badge — no bar, because the
|
|
7
|
+
* question the reader has is「how long has this been hanging」, not「how far
|
|
8
|
+
* along」: there is no known total to be a fraction of.
|
|
9
|
+
*
|
|
10
|
+
* The clock restarts whenever the anchor changes, so each wait is timed from the
|
|
11
|
+
* event that started it rather than from the beginning of the turn.
|
|
12
|
+
*/
|
|
13
|
+
export declare function WaitClock({ startTime }: {
|
|
14
|
+
startTime: number | null;
|
|
15
|
+
}): import("react").JSX.Element;
|
|
16
|
+
//# sourceMappingURL=WaitClock.d.ts.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"WaitClock.d.ts","sourceRoot":"","sources":["../../../src/client/WaitClock.tsx"],"names":[],"mappings":"AAIA,kFAAkF;AAClF,eAAO,MAAM,gBAAgB,QAAS,CAAC;AAEvC;;;;;;;;;GASG;AACH,wBAAgB,SAAS,CAAC,EAAE,SAAS,EAAE,EAAE;IAAE,SAAS,EAAE,MAAM,GAAG,IAAI,CAAA;CAAE,+BAepE"}
|
|
@@ -0,0 +1,29 @@
|
|
|
1
|
+
import { jsx as _jsx, jsxs as _jsxs } from "react/jsx-runtime";
|
|
2
|
+
import { useEffect, useState } from 'react';
|
|
3
|
+
import { formatRunDuration } from './message-chrome.js';
|
|
4
|
+
import css from './Reader.module.css';
|
|
5
|
+
/** Past this, a wait stops being a pause and reads as the model not answering. */
|
|
6
|
+
export const WAIT_OVERTIME_MS = 10_000;
|
|
7
|
+
/**
|
|
8
|
+
* How long the model has been given the turn, counted in plain seconds.
|
|
9
|
+
*
|
|
10
|
+
* Just the number and, past ten seconds, a「暂未响应」badge — no bar, because the
|
|
11
|
+
* question the reader has is「how long has this been hanging」, not「how far
|
|
12
|
+
* along」: there is no known total to be a fraction of.
|
|
13
|
+
*
|
|
14
|
+
* The clock restarts whenever the anchor changes, so each wait is timed from the
|
|
15
|
+
* event that started it rather than from the beginning of the turn.
|
|
16
|
+
*/
|
|
17
|
+
export function WaitClock({ startTime }) {
|
|
18
|
+
const [mountedAt] = useState(() => Date.now());
|
|
19
|
+
const [now, setNow] = useState(() => Date.now());
|
|
20
|
+
const anchor = startTime ?? mountedAt;
|
|
21
|
+
useEffect(() => {
|
|
22
|
+
const id = setInterval(() => setNow(Date.now()), 250);
|
|
23
|
+
return () => clearInterval(id);
|
|
24
|
+
}, []);
|
|
25
|
+
const waited = Math.max(0, now - anchor);
|
|
26
|
+
const overtime = waited >= WAIT_OVERTIME_MS;
|
|
27
|
+
return _jsxs("span", { className: css.waitClock, "data-reader-wait-clock": true, ...(overtime ? { 'data-overtime': '' } : {}), children: [_jsx("span", { className: css.waitSeconds, children: formatRunDuration(waited) }), overtime && _jsx("span", { className: css.waitOvertime, "data-reader-wait-badge": true, children: "\u6682\u672A\u54CD\u5E94" })] });
|
|
28
|
+
}
|
|
29
|
+
//# sourceMappingURL=WaitClock.js.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"WaitClock.js","sourceRoot":"","sources":["../../../src/client/WaitClock.tsx"],"names":[],"mappings":";AAAA,OAAO,EAAE,SAAS,EAAE,QAAQ,EAAE,MAAM,OAAO,CAAC;AAC5C,OAAO,EAAE,iBAAiB,EAAE,MAAM,qBAAqB,CAAC;AACxD,OAAO,GAAG,MAAM,qBAAqB,CAAC;AAEtC,kFAAkF;AAClF,MAAM,CAAC,MAAM,gBAAgB,GAAG,MAAM,CAAC;AAEvC;;;;;;;;;GASG;AACH,MAAM,UAAU,SAAS,CAAC,EAAE,SAAS,EAAgC;IACnE,MAAM,CAAC,SAAS,CAAC,GAAG,QAAQ,CAAC,GAAG,EAAE,CAAC,IAAI,CAAC,GAAG,EAAE,CAAC,CAAC;IAC/C,MAAM,CAAC,GAAG,EAAE,MAAM,CAAC,GAAG,QAAQ,CAAC,GAAG,EAAE,CAAC,IAAI,CAAC,GAAG,EAAE,CAAC,CAAC;IACjD,MAAM,MAAM,GAAG,SAAS,IAAI,SAAS,CAAC;IACtC,SAAS,CAAC,GAAG,EAAE;QACb,MAAM,EAAE,GAAG,WAAW,CAAC,GAAG,EAAE,CAAC,MAAM,CAAC,IAAI,CAAC,GAAG,EAAE,CAAC,EAAE,GAAG,CAAC,CAAC;QACtD,OAAO,GAAG,EAAE,CAAC,aAAa,CAAC,EAAE,CAAC,CAAC;IACjC,CAAC,EAAE,EAAE,CAAC,CAAC;IACP,MAAM,MAAM,GAAG,IAAI,CAAC,GAAG,CAAC,CAAC,EAAE,GAAG,GAAG,MAAM,CAAC,CAAC;IACzC,MAAM,QAAQ,GAAG,MAAM,IAAI,gBAAgB,CAAC;IAC5C,OAAO,gBAAM,SAAS,EAAE,GAAG,CAAC,SAAS,qCAC/B,CAAC,QAAQ,CAAC,CAAC,CAAC,EAAE,eAAe,EAAE,EAAE,EAAE,CAAC,CAAC,CAAC,EAAE,CAAC,aAC7C,eAAM,SAAS,EAAE,GAAG,CAAC,WAAW,YAAG,iBAAiB,CAAC,MAAM,CAAC,GAAQ,EACnE,QAAQ,IAAI,eAAM,SAAS,EAAE,GAAG,CAAC,YAAY,yEAAoC,IAC7E,CAAC;AACV,CAAC"}
|
|
@@ -0,0 +1,15 @@
|
|
|
1
|
+
/** Past this, a wait stops being a pause and becomes worth flagging. */
|
|
2
|
+
export declare const WAIT_OVERTIME_MS = 10000;
|
|
3
|
+
/**
|
|
4
|
+
* The elapsed seconds of a wait, plus a bar that fills toward the ten-second
|
|
5
|
+
* mark. Lives beside the status label rather than in the reader's own footer,
|
|
6
|
+
* because the group status is what the eye is on while the model works — and it
|
|
7
|
+
* is the only indicator that survives the model emitting its first tool call.
|
|
8
|
+
*
|
|
9
|
+
* Before the mark, the bar reads as progress; after it, the badge says the wait
|
|
10
|
+
* has run long while the seconds keep counting.
|
|
11
|
+
*/
|
|
12
|
+
export declare function WaitClock({ startTime }: {
|
|
13
|
+
startTime: number | null;
|
|
14
|
+
}): import("react").JSX.Element;
|
|
15
|
+
//# sourceMappingURL=WaitingClock.d.ts.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"WaitingClock.d.ts","sourceRoot":"","sources":["../../../src/client/WaitingClock.tsx"],"names":[],"mappings":"AAIA,wEAAwE;AACxE,eAAO,MAAM,gBAAgB,QAAS,CAAC;AAEvC;;;;;;;;GAQG;AACH,wBAAgB,SAAS,CAAC,EAAE,SAAS,EAAE,EAAE;IAAE,SAAS,EAAE,MAAM,GAAG,IAAI,CAAA;CAAE,+BAqBpE"}
|
|
@@ -0,0 +1,30 @@
|
|
|
1
|
+
import { jsx as _jsx, jsxs as _jsxs } from "react/jsx-runtime";
|
|
2
|
+
import { useEffect, useState } from 'react';
|
|
3
|
+
import { formatRunDuration } from './message-chrome.js';
|
|
4
|
+
import css from './Reader.module.css';
|
|
5
|
+
/** Past this, a wait stops being a pause and becomes worth flagging. */
|
|
6
|
+
export const WAIT_OVERTIME_MS = 10_000;
|
|
7
|
+
/**
|
|
8
|
+
* The elapsed seconds of a wait, plus a bar that fills toward the ten-second
|
|
9
|
+
* mark. Lives beside the status label rather than in the reader's own footer,
|
|
10
|
+
* because the group status is what the eye is on while the model works — and it
|
|
11
|
+
* is the only indicator that survives the model emitting its first tool call.
|
|
12
|
+
*
|
|
13
|
+
* Before the mark, the bar reads as progress; after it, the badge says the wait
|
|
14
|
+
* has run long while the seconds keep counting.
|
|
15
|
+
*/
|
|
16
|
+
export function WaitClock({ startTime }) {
|
|
17
|
+
const [mountedAt] = useState(() => Date.now());
|
|
18
|
+
const [now, setNow] = useState(() => Date.now());
|
|
19
|
+
const anchor = startTime ?? mountedAt;
|
|
20
|
+
useEffect(() => {
|
|
21
|
+
// 250ms keeps the bar moving smoothly; only the readout changes after that.
|
|
22
|
+
const id = setInterval(() => setNow(Date.now()), 250);
|
|
23
|
+
return () => clearInterval(id);
|
|
24
|
+
}, []);
|
|
25
|
+
const waited = Math.max(0, now - anchor);
|
|
26
|
+
const overtime = waited >= WAIT_OVERTIME_MS;
|
|
27
|
+
const progress = Math.min(1, waited / WAIT_OVERTIME_MS);
|
|
28
|
+
return _jsxs("span", { className: css.waitClock, "data-reader-wait-clock": true, ...(overtime ? { 'data-overtime': '' } : {}), children: [_jsxs("span", { className: css.waitTrack, "aria-hidden": "true", children: [_jsx("span", { className: css.waitFill, style: { transform: `scaleX(${progress})` } }), _jsx("span", { className: css.waitMark, title: "10 \u79D2" })] }), _jsx("span", { className: css.waitSeconds, children: formatRunDuration(waited) }), overtime && _jsx("span", { className: css.waitOvertime, "data-reader-wait-badge": true, children: "\u6682\u672A\u54CD\u5E94" })] });
|
|
29
|
+
}
|
|
30
|
+
//# sourceMappingURL=WaitingClock.js.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"WaitingClock.js","sourceRoot":"","sources":["../../../src/client/WaitingClock.tsx"],"names":[],"mappings":";AAAA,OAAO,EAAE,SAAS,EAAE,QAAQ,EAAE,MAAM,OAAO,CAAC;AAC5C,OAAO,EAAE,iBAAiB,EAAE,MAAM,qBAAqB,CAAC;AACxD,OAAO,GAAG,MAAM,qBAAqB,CAAC;AAEtC,wEAAwE;AACxE,MAAM,CAAC,MAAM,gBAAgB,GAAG,MAAM,CAAC;AAEvC;;;;;;;;GAQG;AACH,MAAM,UAAU,SAAS,CAAC,EAAE,SAAS,EAAgC;IACnE,MAAM,CAAC,SAAS,CAAC,GAAG,QAAQ,CAAC,GAAG,EAAE,CAAC,IAAI,CAAC,GAAG,EAAE,CAAC,CAAC;IAC/C,MAAM,CAAC,GAAG,EAAE,MAAM,CAAC,GAAG,QAAQ,CAAC,GAAG,EAAE,CAAC,IAAI,CAAC,GAAG,EAAE,CAAC,CAAC;IACjD,MAAM,MAAM,GAAG,SAAS,IAAI,SAAS,CAAC;IACtC,SAAS,CAAC,GAAG,EAAE;QACb,4EAA4E;QAC5E,MAAM,EAAE,GAAG,WAAW,CAAC,GAAG,EAAE,CAAC,MAAM,CAAC,IAAI,CAAC,GAAG,EAAE,CAAC,EAAE,GAAG,CAAC,CAAC;QACtD,OAAO,GAAG,EAAE,CAAC,aAAa,CAAC,EAAE,CAAC,CAAC;IACjC,CAAC,EAAE,EAAE,CAAC,CAAC;IACP,MAAM,MAAM,GAAG,IAAI,CAAC,GAAG,CAAC,CAAC,EAAE,GAAG,GAAG,MAAM,CAAC,CAAC;IACzC,MAAM,QAAQ,GAAG,MAAM,IAAI,gBAAgB,CAAC;IAC5C,MAAM,QAAQ,GAAG,IAAI,CAAC,GAAG,CAAC,CAAC,EAAE,MAAM,GAAG,gBAAgB,CAAC,CAAC;IACxD,OAAO,gBAAM,SAAS,EAAE,GAAG,CAAC,SAAS,qCAC/B,CAAC,QAAQ,CAAC,CAAC,CAAC,EAAE,eAAe,EAAE,EAAE,EAAE,CAAC,CAAC,CAAC,EAAE,CAAC,aAC7C,gBAAM,SAAS,EAAE,GAAG,CAAC,SAAS,iBAAc,MAAM,aAChD,eAAM,SAAS,EAAE,GAAG,CAAC,QAAQ,EAAE,KAAK,EAAE,EAAE,SAAS,EAAE,UAAU,QAAQ,GAAG,EAAE,GAAI,EAC9E,eAAM,SAAS,EAAE,GAAG,CAAC,QAAQ,EAAE,KAAK,EAAC,WAAM,GAAG,IACzC,EACP,eAAM,SAAS,EAAE,GAAG,CAAC,WAAW,YAAG,iBAAiB,CAAC,MAAM,CAAC,GAAQ,EACnE,QAAQ,IAAI,eAAM,SAAS,EAAE,GAAG,CAAC,YAAY,yEAAoC,IAC7E,CAAC;AACV,CAAC"}
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"WaitingStatus.d.ts","sourceRoot":"","sources":["../../../src/client/WaitingStatus.tsx"],"names":[],"mappings":"AACA,OAAO,KAAK,EAAE,aAAa,EAAE,MAAM,oBAAoB,CAAC;AAGxD,wBAAgB,aAAa,CAAC,EAAE,MAAM,EAAE,KAAK,EAAE,EAAE;IAAE,MAAM,EAAE,aAAa,CAAC;IAAC,KAAK,EAAE,MAAM,CAAA;CAAE,+BAQxF"}
|
|
@@ -0,0 +1,9 @@
|
|
|
1
|
+
import { jsx as _jsx, jsxs as _jsxs } from "react/jsx-runtime";
|
|
2
|
+
import { WaitClock } from './WaitClock.js';
|
|
3
|
+
import css from './Reader.module.css';
|
|
4
|
+
export function WaitingStatus({ anchor, label }) {
|
|
5
|
+
// A new input gets its own clock even if the waiting indicator stays mounted;
|
|
6
|
+
// the readout itself is shared with the group status so the two never disagree.
|
|
7
|
+
return _jsxs("div", { className: css.turnStatus, role: "status", "aria-live": "polite", "data-reader-turn-status": true, "data-reader-wait-start": anchor.time ?? '', children: [_jsx("span", { className: css.turnStatusLabel, children: label }), _jsx(WaitClock, { startTime: anchor.time }, anchor.key)] });
|
|
8
|
+
}
|
|
9
|
+
//# sourceMappingURL=WaitingStatus.js.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"WaitingStatus.js","sourceRoot":"","sources":["../../../src/client/WaitingStatus.tsx"],"names":[],"mappings":";AAAA,OAAO,EAAE,SAAS,EAAE,MAAM,gBAAgB,CAAC;AAE3C,OAAO,GAAG,MAAM,qBAAqB,CAAC;AAEtC,MAAM,UAAU,aAAa,CAAC,EAAE,MAAM,EAAE,KAAK,EAA4C;IACvF,8EAA8E;IAC9E,gFAAgF;IAChF,OAAO,eAAK,SAAS,EAAE,GAAG,CAAC,UAAU,EAAE,IAAI,EAAC,QAAQ,eAAW,QAAQ,6DAC7C,MAAM,CAAC,IAAI,IAAI,EAAE,aACzC,eAAM,SAAS,EAAE,GAAG,CAAC,eAAe,YAAG,KAAK,GAAQ,EACpD,KAAC,SAAS,IAAkB,SAAS,EAAE,MAAM,CAAC,IAAI,IAAlC,MAAM,CAAC,GAAG,CAA4B,IAClD,CAAC;AACT,CAAC"}
|
|
@@ -0,0 +1,19 @@
|
|
|
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 declare const READING_LINE_OFFSET_PX = 24;
|
|
9
|
+
/** Active column host when present; otherwise the view-local scroller. */
|
|
10
|
+
export declare function scrollerOf(from: HTMLElement): HTMLElement;
|
|
11
|
+
/** Row position in scrollport coordinates (viewport-independent). */
|
|
12
|
+
export declare function flowTop(row: HTMLElement, scrollport: HTMLElement): number;
|
|
13
|
+
/**
|
|
14
|
+
* Place `row` on the conversation scroller only. Never calls scrollIntoView.
|
|
15
|
+
* @param row - a rendered `[data-reader-turn]` row.
|
|
16
|
+
* @param scrollport - `scrollerOf` of the reader root.
|
|
17
|
+
*/
|
|
18
|
+
export declare function landTurn(row: HTMLElement, scrollport: HTMLElement, offsetPx?: number): void;
|
|
19
|
+
//# sourceMappingURL=conversation-scroll.d.ts.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"conversation-scroll.d.ts","sourceRoot":"","sources":["../../../src/client/conversation-scroll.ts"],"names":[],"mappings":"AAAA;;;;;GAKG;AAEH,8DAA8D;AAC9D,eAAO,MAAM,sBAAsB,KAAK,CAAC;AAEzC,0EAA0E;AAC1E,wBAAgB,UAAU,CAAC,IAAI,EAAE,WAAW,GAAG,WAAW,CAEzD;AAED,qEAAqE;AACrE,wBAAgB,OAAO,CAAC,GAAG,EAAE,WAAW,EAAE,UAAU,EAAE,WAAW,GAAG,MAAM,CAEzE;AAED;;;;GAIG;AACH,wBAAgB,QAAQ,CAAC,GAAG,EAAE,WAAW,EAAE,UAAU,EAAE,WAAW,EAAE,QAAQ,SAAyB,GAAG,IAAI,CAE3G"}
|
|
@@ -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,40 @@
|
|
|
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
|
+
* Slack added to every phase deadline before the watchdog forces the next phase.
|
|
10
|
+
*
|
|
11
|
+
* The choreography advances on animation promises and rendered frames. Both are
|
|
12
|
+
* best-effort: a cancelled animation *rejects* and a compositor that never
|
|
13
|
+
* finishes one leaves its promise pending, while a backgrounded tab stops
|
|
14
|
+
* delivering frames. Without a deadline the machine would sit in a non-idle
|
|
15
|
+
* phase forever, and a non-idle phase freezes both the frame source and the text
|
|
16
|
+
* reveal, so the turn would look stuck until a remount. This is the liveness
|
|
17
|
+
* guarantee that does not depend on any of them.
|
|
18
|
+
*/
|
|
19
|
+
readonly watchdogSlack: 240;
|
|
20
|
+
};
|
|
21
|
+
export type FoldPhase = 'idle' | 'collapse' | 'count' | 'settle' | 'reveal';
|
|
22
|
+
export type FlowRow = {
|
|
23
|
+
kind: 'summary';
|
|
24
|
+
key: string;
|
|
25
|
+
item: Extract<LiveTurnItem, {
|
|
26
|
+
kind: 'fold';
|
|
27
|
+
}>;
|
|
28
|
+
} | {
|
|
29
|
+
kind: 'step';
|
|
30
|
+
key: string;
|
|
31
|
+
step: LiveStep;
|
|
32
|
+
foldKey?: string;
|
|
33
|
+
};
|
|
34
|
+
/** A step always has the same parent and React key, even when its membership changes. */
|
|
35
|
+
export declare function flowRows(items: readonly LiveTurnItem[]): FlowRow[];
|
|
36
|
+
export declare function retiringKeys(before: readonly LiveTurnItem[], after: readonly LiveTurnItem[], open: Readonly<Record<string, boolean>>): string[];
|
|
37
|
+
/** Insert only new summary slots. Never admit incoming content during shrink. */
|
|
38
|
+
export declare function collapseRows(before: readonly LiveTurnItem[], target: readonly LiveTurnItem[]): FlowRow[];
|
|
39
|
+
export declare function containsNewUser(before: readonly LiveTurnItem[], after: readonly LiveTurnItem[]): boolean;
|
|
40
|
+
//# 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;;;;;IAKtB;;;;;;;;;;OAUG;;CAEK,CAAC;AACX,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,48 @@
|
|
|
1
|
+
/** Presentation clock, not model/network time. */
|
|
2
|
+
export const FOLD_TIMING = {
|
|
3
|
+
collapse: 320,
|
|
4
|
+
count: 160,
|
|
5
|
+
settle: 80,
|
|
6
|
+
reveal: 180,
|
|
7
|
+
/**
|
|
8
|
+
* Slack added to every phase deadline before the watchdog forces the next phase.
|
|
9
|
+
*
|
|
10
|
+
* The choreography advances on animation promises and rendered frames. Both are
|
|
11
|
+
* best-effort: a cancelled animation *rejects* and a compositor that never
|
|
12
|
+
* finishes one leaves its promise pending, while a backgrounded tab stops
|
|
13
|
+
* delivering frames. Without a deadline the machine would sit in a non-idle
|
|
14
|
+
* phase forever, and a non-idle phase freezes both the frame source and the text
|
|
15
|
+
* reveal, so the turn would look stuck until a remount. This is the liveness
|
|
16
|
+
* guarantee that does not depend on any of them.
|
|
17
|
+
*/
|
|
18
|
+
watchdogSlack: 240,
|
|
19
|
+
};
|
|
20
|
+
/** A step always has the same parent and React key, even when its membership changes. */
|
|
21
|
+
export function flowRows(items) {
|
|
22
|
+
return items.flatMap((item) => item.kind === 'fold'
|
|
23
|
+
? [{ kind: 'summary', key: item.key, item }, ...item.steps.map(step => ({ kind: 'step', key: step.key, step, foldKey: item.key }))]
|
|
24
|
+
: [{ kind: 'step', key: item.key, step: item.step }]);
|
|
25
|
+
}
|
|
26
|
+
export function retiringKeys(before, after, open) {
|
|
27
|
+
const folded = new Set(flowRows(after).filter(row => row.kind === 'step' && row.foldKey && !open[row.foldKey]).map(row => row.key));
|
|
28
|
+
return flowRows(before).filter(row => row.kind === 'step' && !row.foldKey && folded.has(row.key)).map(row => row.key);
|
|
29
|
+
}
|
|
30
|
+
/** Insert only new summary slots. Never admit incoming content during shrink. */
|
|
31
|
+
export function collapseRows(before, target) {
|
|
32
|
+
const rows = flowRows(before);
|
|
33
|
+
const headers = new Set(rows.filter(row => row.kind === 'summary').map(row => row.key));
|
|
34
|
+
for (const item of target) {
|
|
35
|
+
if (item.kind !== 'fold' || headers.has(item.key))
|
|
36
|
+
continue;
|
|
37
|
+
const members = new Set(item.steps.map(step => step.key));
|
|
38
|
+
const at = rows.findIndex(row => members.has(row.key));
|
|
39
|
+
if (at >= 0)
|
|
40
|
+
rows.splice(at, 0, { kind: 'summary', key: item.key, item: { ...item, summary: item.summary.replace(/\d+/g, '0') } });
|
|
41
|
+
}
|
|
42
|
+
return rows;
|
|
43
|
+
}
|
|
44
|
+
export function containsNewUser(before, after) {
|
|
45
|
+
const users = new Set(before.filter(item => item.kind === 'user').map(item => item.key));
|
|
46
|
+
return after.some(item => item.kind === 'user' && !users.has(item.key));
|
|
47
|
+
}
|
|
48
|
+
//# 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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"}
|