@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,452 @@
|
|
|
1
|
+
import { jsx as _jsx, jsxs as _jsxs, Fragment as _Fragment } from "react/jsx-runtime";
|
|
2
|
+
// Adapted from DeepSeek Harness b150a551b8d465e31e418e1b2eaf5e79bbb7d28e (MIT). See THIRD_PARTY_NOTICES.md.
|
|
3
|
+
/**
|
|
4
|
+
* Direct mdast→React markdown renderer. Replaces the react-markdown /
|
|
5
|
+
* remark-rehype pipeline with one switch over parsed nodes so streaming can
|
|
6
|
+
* cache frozen blocks as React elements; the rendered DOM is pinned
|
|
7
|
+
* byte-for-byte by `tests/fixtures/markdown-dom` and must not drift.
|
|
8
|
+
*
|
|
9
|
+
* Untrusted-output policy (unchanged from the replaced pipeline): link and
|
|
10
|
+
* image destinations pass a protocol allowlist, images additionally require
|
|
11
|
+
* absolute HTTP(S), raw HTML renders as literal text (no HTML enters the
|
|
12
|
+
* DOM), and KaTeX runs without trusted commands. Fragment-anchor URLs fail
|
|
13
|
+
* the allowlist, so footnote references and back-references render as plain
|
|
14
|
+
* text rather than in-page links.
|
|
15
|
+
*
|
|
16
|
+
* Merge-extensible node unions fall through the documented default (render
|
|
17
|
+
* nothing) rather than ending in assertNever: grammars registered elsewhere
|
|
18
|
+
* may add node types this renderer has no mapping for.
|
|
19
|
+
*/
|
|
20
|
+
import { Fragment, createElement, useState } from 'react';
|
|
21
|
+
import clsx from 'clsx';
|
|
22
|
+
import { normalizeUri } from 'micromark-util-sanitize-uri';
|
|
23
|
+
import { CodeBlock } from '@deepseek-ai/dsh-client-ui-primitives';
|
|
24
|
+
import { renderTexToReact } from './katex.js';
|
|
25
|
+
import { McpAppCodeBlock, StreamingMcpAppPlaceholder } from '../McpAppFrame.js';
|
|
26
|
+
import { isMcpAppCodeBlock, extractMcpAppTitle, extractMcpAppHeight } from '../mcp-app.js';
|
|
27
|
+
import css from './MarkdownText.module.css';
|
|
28
|
+
function sanitizeUrl(url) {
|
|
29
|
+
try {
|
|
30
|
+
switch (new URL(url).protocol) {
|
|
31
|
+
case 'http:':
|
|
32
|
+
case 'https:':
|
|
33
|
+
case 'mailto:':
|
|
34
|
+
return url;
|
|
35
|
+
default:
|
|
36
|
+
return '';
|
|
37
|
+
}
|
|
38
|
+
}
|
|
39
|
+
catch {
|
|
40
|
+
// Relative and otherwise unparsable destinations are disallowed alongside
|
|
41
|
+
// disallowed protocols; new URL() has no other failure mode for strings.
|
|
42
|
+
return '';
|
|
43
|
+
}
|
|
44
|
+
}
|
|
45
|
+
function remoteImageUrl(url) {
|
|
46
|
+
try {
|
|
47
|
+
const protocol = new URL(url).protocol;
|
|
48
|
+
return protocol === 'http:' || protocol === 'https:' ? url : undefined;
|
|
49
|
+
}
|
|
50
|
+
catch {
|
|
51
|
+
// Same single failure mode as above: not an absolute URL.
|
|
52
|
+
return undefined;
|
|
53
|
+
}
|
|
54
|
+
}
|
|
55
|
+
/**
|
|
56
|
+
* Create an empty {@link ReferenceTargets}.
|
|
57
|
+
* @returns Fresh empty maps.
|
|
58
|
+
*/
|
|
59
|
+
export function createReferenceTargets() {
|
|
60
|
+
return { definitions: new Map(), footnotes: new Map() };
|
|
61
|
+
}
|
|
62
|
+
/**
|
|
63
|
+
* Record every definition and footnote definition under `nodes` into
|
|
64
|
+
* `targets`, depth-first, keeping the first definition per identifier.
|
|
65
|
+
* @param nodes - Subtrees to walk (top-level blocks or any nested children).
|
|
66
|
+
* @param targets - Accumulator, typically shared across incremental segments.
|
|
67
|
+
*/
|
|
68
|
+
export function collectReferenceTargets(nodes, targets) {
|
|
69
|
+
for (const node of nodes) {
|
|
70
|
+
if (node.type === 'definition') {
|
|
71
|
+
const id = node.identifier.toUpperCase();
|
|
72
|
+
if (!targets.definitions.has(id))
|
|
73
|
+
targets.definitions.set(id, node);
|
|
74
|
+
}
|
|
75
|
+
else if (node.type === 'footnoteDefinition') {
|
|
76
|
+
const id = node.identifier.toUpperCase();
|
|
77
|
+
if (!targets.footnotes.has(id))
|
|
78
|
+
targets.footnotes.set(id, node);
|
|
79
|
+
}
|
|
80
|
+
if ('children' in node)
|
|
81
|
+
collectReferenceTargets(node.children, targets);
|
|
82
|
+
}
|
|
83
|
+
}
|
|
84
|
+
/**
|
|
85
|
+
* Render top-level blocks. Nodes that render nothing (definitions, unmapped
|
|
86
|
+
* types) are dropped rather than kept as null placeholders, matching the
|
|
87
|
+
* replaced pipeline's child lists so separator newlines land identically.
|
|
88
|
+
* @param blocks - Blocks with their stream-stable render keys.
|
|
89
|
+
* @param context - The pass state; footnote numbering mutates in document order.
|
|
90
|
+
* @returns One React node per rendered block.
|
|
91
|
+
*/
|
|
92
|
+
export function renderBlocks(blocks, context) {
|
|
93
|
+
return blocks
|
|
94
|
+
.map(block => renderNode(block.node, block.key, {
|
|
95
|
+
...context,
|
|
96
|
+
sourceOffset: block.key - (block.node.position?.start.offset ?? block.key),
|
|
97
|
+
}))
|
|
98
|
+
.filter(element => element !== null);
|
|
99
|
+
}
|
|
100
|
+
/**
|
|
101
|
+
* Interleave the newline text nodes the replaced pipeline emitted between
|
|
102
|
+
* block-level children. They are invisible between elements but coalesce
|
|
103
|
+
* into adjacent literal raw-HTML text, where the DOM parity fixtures pin
|
|
104
|
+
* them.
|
|
105
|
+
* @param elements - Rendered block children with empty renders already dropped.
|
|
106
|
+
* @param edges - Also emit the leading and trailing newline (hast's loose wrap).
|
|
107
|
+
* @returns The interleaved children.
|
|
108
|
+
*/
|
|
109
|
+
export function wrapBlockChildren(elements, edges) {
|
|
110
|
+
const wrapped = [];
|
|
111
|
+
for (const element of elements) {
|
|
112
|
+
if (edges || wrapped.length > 0)
|
|
113
|
+
wrapped.push('\n');
|
|
114
|
+
wrapped.push(element);
|
|
115
|
+
}
|
|
116
|
+
if (edges && elements.length > 0)
|
|
117
|
+
wrapped.push('\n');
|
|
118
|
+
return wrapped;
|
|
119
|
+
}
|
|
120
|
+
/** Render container children into {@link BlockEntry} values, dropping empty renders. */
|
|
121
|
+
function renderBlockEntries(blocks, context) {
|
|
122
|
+
const entries = [];
|
|
123
|
+
for (const [index, block] of blocks.entries()) {
|
|
124
|
+
if (block.type === 'paragraph') {
|
|
125
|
+
entries.push({ paragraph: renderChildren(block.children, context) });
|
|
126
|
+
}
|
|
127
|
+
else {
|
|
128
|
+
const element = renderNode(block, index, context);
|
|
129
|
+
if (element !== null)
|
|
130
|
+
entries.push({ element });
|
|
131
|
+
}
|
|
132
|
+
}
|
|
133
|
+
return entries;
|
|
134
|
+
}
|
|
135
|
+
function renderChildren(nodes, context) {
|
|
136
|
+
return nodes.map((node, index) => renderNode(node, index, context));
|
|
137
|
+
}
|
|
138
|
+
function renderNode(node, key, context) {
|
|
139
|
+
switch (node.type) {
|
|
140
|
+
case 'text':
|
|
141
|
+
return context.renderText ? context.renderText(node.value, (context.sourceOffset ?? 0) + (node.position?.start.offset ?? 0)) : node.value;
|
|
142
|
+
case 'paragraph':
|
|
143
|
+
return _jsx("p", { children: renderChildren(node.children, context) }, key);
|
|
144
|
+
case 'heading':
|
|
145
|
+
return createElement(`h${node.depth}`, { key }, ...renderChildren(node.children, context));
|
|
146
|
+
case 'blockquote':
|
|
147
|
+
return (_jsx("blockquote", { children: wrapBlockChildren(renderChildren(node.children, { ...context, inBlockquote: true }).filter(child => child !== null), true) }, key));
|
|
148
|
+
case 'thematicBreak':
|
|
149
|
+
return _jsx("hr", {}, key);
|
|
150
|
+
case 'break':
|
|
151
|
+
// The replaced pipeline emitted a newline text node after each <br>.
|
|
152
|
+
return _jsxs(Fragment, { children: [_jsx("br", {}), '\n'] }, key);
|
|
153
|
+
case 'strong':
|
|
154
|
+
return _jsx("strong", { children: renderChildren(node.children, context) }, key);
|
|
155
|
+
case 'emphasis':
|
|
156
|
+
return _jsx("em", { children: renderChildren(node.children, context) }, key);
|
|
157
|
+
case 'delete':
|
|
158
|
+
return _jsx("del", { children: renderChildren(node.children, context) }, key);
|
|
159
|
+
case 'inlineCode': {
|
|
160
|
+
// Parity with mdast-util-to-hast: inline code renders line endings as spaces.
|
|
161
|
+
const value = node.value.replace(/\r?\n|\r/g, ' ');
|
|
162
|
+
// Native code chips are inline-flex. Keep a single inline formatting
|
|
163
|
+
// context so motion spans do not become flex items or drop code spaces.
|
|
164
|
+
const content = context.renderText ? _jsx("span", { children: context.renderText(value, (context.sourceOffset ?? 0) + (node.position?.start.offset ?? 0), true) }) : value;
|
|
165
|
+
// An inline-code token that is entirely an absolute HTTP(S) URL keeps
|
|
166
|
+
// its code chrome and gains the same safe external anchor as a link;
|
|
167
|
+
// commands, partial URLs, and other schemes stay inert. The value is
|
|
168
|
+
// authored text, not a parsed destination, so no normalizeUri: port,
|
|
169
|
+
// path, and query render unchanged.
|
|
170
|
+
const href = inlineCodeHttpUrl(value);
|
|
171
|
+
if (href !== undefined)
|
|
172
|
+
return _jsx("code", { children: renderSafeLink(href, [content], 'link') }, key);
|
|
173
|
+
// A token the owner's file-mention vocabulary recognizes opens that
|
|
174
|
+
// file; the resolver, not this renderer, decides what names a file.
|
|
175
|
+
// Inside an anchor the token stays inert — a button cannot nest there.
|
|
176
|
+
const mention = context.inLink === true ? undefined : context.fileMentions?.resolve(value);
|
|
177
|
+
if (mention !== undefined) {
|
|
178
|
+
return (_jsx("code", { children: _jsx("button", { type: "button", className: css.fileMention, title: mention.title, "aria-label": mention.label, onClick: mention.open, children: content }) }, key));
|
|
179
|
+
}
|
|
180
|
+
return _jsx("code", { children: content }, key);
|
|
181
|
+
}
|
|
182
|
+
case 'html':
|
|
183
|
+
// No HTML parser enters the pipeline: raw HTML stays literal text.
|
|
184
|
+
return context.renderText ? context.renderText(node.value, (context.sourceOffset ?? 0) + (node.position?.start.offset ?? 0)) : node.value;
|
|
185
|
+
case 'code': {
|
|
186
|
+
const code = renderCode(node, key, context);
|
|
187
|
+
return context.renderAtom ? _jsx(Fragment, { children: context.renderAtom(code, (context.sourceOffset ?? 0) + (node.position?.start.offset ?? 0)) }, key) : code;
|
|
188
|
+
}
|
|
189
|
+
case 'math':
|
|
190
|
+
return _jsx(Fragment, { children: renderTexToReact(node.value, true) }, key);
|
|
191
|
+
case 'inlineMath':
|
|
192
|
+
return _jsx(Fragment, { children: renderTexToReact(node.value, false) }, key);
|
|
193
|
+
case 'list':
|
|
194
|
+
return renderList(node, key, context);
|
|
195
|
+
case 'listItem':
|
|
196
|
+
// Reachable only in hand-built trees: the grammar emits items inside lists.
|
|
197
|
+
return renderListItem(node, listItemLoose(node), key, context);
|
|
198
|
+
case 'table':
|
|
199
|
+
return renderTable(node, key, context);
|
|
200
|
+
case 'link':
|
|
201
|
+
return renderAnchor(node.url, renderChildren(node.children, { ...context, inLink: true }), key);
|
|
202
|
+
case 'linkReference':
|
|
203
|
+
return renderLinkReference(node, key, context);
|
|
204
|
+
case 'image':
|
|
205
|
+
return renderImage(node.url, node.alt ?? '', key, context);
|
|
206
|
+
case 'imageReference':
|
|
207
|
+
return renderImageReference(node, key, context);
|
|
208
|
+
case 'footnoteReference':
|
|
209
|
+
return renderFootnoteReference(node, key, context);
|
|
210
|
+
case 'definition':
|
|
211
|
+
case 'footnoteDefinition':
|
|
212
|
+
// Targets render elsewhere: definitions resolve references in place;
|
|
213
|
+
// footnote bodies render in the trailing section.
|
|
214
|
+
return null;
|
|
215
|
+
default:
|
|
216
|
+
// Documented default for the merge-extensible union: node types without
|
|
217
|
+
// a mapping (tableRow/tableCell outside a table, frontmatter, future
|
|
218
|
+
// grammar contributions) render nothing.
|
|
219
|
+
return null;
|
|
220
|
+
}
|
|
221
|
+
}
|
|
222
|
+
function renderCode(node, key, context) {
|
|
223
|
+
const language = node.lang ?? undefined;
|
|
224
|
+
if (node.value === '') {
|
|
225
|
+
// Parity: the replaced pipeline kept the stock <pre> for an empty fence.
|
|
226
|
+
return (_jsx("pre", { children: _jsx("code", { className: language === undefined ? undefined : `language-${language}` }) }, key));
|
|
227
|
+
}
|
|
228
|
+
// The replaced pipeline recovered the grammar id from the hast class with
|
|
229
|
+
// /language-([\w-]+)/, which truncates at the first non-word character.
|
|
230
|
+
const lang = language === undefined ? undefined : /^[\w-]+/.exec(language)?.[0];
|
|
231
|
+
if (isMcpAppCodeBlock(node.lang, node.meta, node.value)) {
|
|
232
|
+
const title = extractMcpAppTitle(node.meta, node.value);
|
|
233
|
+
const initialHeight = extractMcpAppHeight(node.meta);
|
|
234
|
+
if (context.streaming) {
|
|
235
|
+
return _jsx(StreamingMcpAppPlaceholder, { title: title }, key);
|
|
236
|
+
}
|
|
237
|
+
return _jsx(McpAppCodeBlock, { html: node.value, title: title, initialHeight: initialHeight }, key);
|
|
238
|
+
}
|
|
239
|
+
if (!context.streaming && lang === 'math') {
|
|
240
|
+
// ```math fences render as display TeX once settled (rehype-katex parity);
|
|
241
|
+
// its text extraction saw the code block's trailing newline.
|
|
242
|
+
return _jsx(Fragment, { children: renderTexToReact(`${node.value}\n`, true) }, key);
|
|
243
|
+
}
|
|
244
|
+
return (_jsx(CodeBlock, {
|
|
245
|
+
// The replaced hast pipeline appended one synthetic newline that
|
|
246
|
+
// CodeBlock's display trim removes; feeding the bare value would make
|
|
247
|
+
// that trim eat a REAL trailing blank line inside the fence instead.
|
|
248
|
+
code: `${node.value}\n`, lang: context.streaming ? undefined : lang, copyLabel: context.codeLabels?.copyLabel ?? '复制代码', copiedLabel: context.codeLabels?.copiedLabel ?? '已复制' }, key));
|
|
249
|
+
}
|
|
250
|
+
/** A list is loose when it or any of its items is spread; every item then keeps its paragraphs. */
|
|
251
|
+
function listLoose(list) {
|
|
252
|
+
return (list.spread ?? false) || list.children.some(listItemLoose);
|
|
253
|
+
}
|
|
254
|
+
function listItemLoose(item) {
|
|
255
|
+
return item.spread ?? item.children.length > 1;
|
|
256
|
+
}
|
|
257
|
+
function renderList(node, key, context) {
|
|
258
|
+
const loose = listLoose(node);
|
|
259
|
+
const properties = {};
|
|
260
|
+
if (typeof node.start === 'number' && node.start !== 1)
|
|
261
|
+
properties.start = node.start;
|
|
262
|
+
if (node.children.some(item => typeof item.checked === 'boolean')) {
|
|
263
|
+
properties.className = 'contains-task-list';
|
|
264
|
+
}
|
|
265
|
+
return createElement(node.ordered === true ? 'ol' : 'ul', { key, ...properties }, ...node.children.map((item, index) => renderListItem(item, loose, index, context)));
|
|
266
|
+
}
|
|
267
|
+
function renderListItem(item, loose, key, context) {
|
|
268
|
+
const entries = renderBlockEntries(item.children, context);
|
|
269
|
+
const task = typeof item.checked === 'boolean';
|
|
270
|
+
if (task) {
|
|
271
|
+
const checkbox = _jsx("input", { type: "checkbox", checked: item.checked === true, disabled: true }, "task-checkbox");
|
|
272
|
+
const head = entries[0];
|
|
273
|
+
if (head !== undefined && 'paragraph' in head) {
|
|
274
|
+
head.paragraph = head.paragraph.length > 0 ? [checkbox, ' ', ...head.paragraph] : [checkbox];
|
|
275
|
+
}
|
|
276
|
+
else {
|
|
277
|
+
entries.unshift({ paragraph: [checkbox] });
|
|
278
|
+
}
|
|
279
|
+
}
|
|
280
|
+
// Newline placement and tight-paragraph unwrapping mirror
|
|
281
|
+
// mdast-util-to-hast's list-item handler: a newline before every child
|
|
282
|
+
// except a tight leading paragraph, and after a trailing non-paragraph
|
|
283
|
+
// (or any trailing child when loose).
|
|
284
|
+
const parts = [];
|
|
285
|
+
for (const [index, entry] of entries.entries()) {
|
|
286
|
+
const isParagraph = 'paragraph' in entry;
|
|
287
|
+
if (loose || index !== 0 || !isParagraph)
|
|
288
|
+
parts.push('\n');
|
|
289
|
+
if (!isParagraph)
|
|
290
|
+
parts.push(entry.element);
|
|
291
|
+
else if (loose)
|
|
292
|
+
parts.push(_jsx("p", { children: entry.paragraph }, `p-${index}`));
|
|
293
|
+
else
|
|
294
|
+
parts.push(_jsx(Fragment, { children: entry.paragraph }, `p-${index}`));
|
|
295
|
+
}
|
|
296
|
+
const tail = entries[entries.length - 1];
|
|
297
|
+
if (tail !== undefined && (loose || !('paragraph' in tail)))
|
|
298
|
+
parts.push('\n');
|
|
299
|
+
return (_jsx("li", { className: task ? 'task-list-item' : undefined, children: parts }, key));
|
|
300
|
+
}
|
|
301
|
+
function renderTable(node, key, context) {
|
|
302
|
+
const align = node.align ?? null;
|
|
303
|
+
const [headRow, ...bodyRows] = node.children;
|
|
304
|
+
const columns = align === null ? headRow?.children.length ?? 0 : align.length;
|
|
305
|
+
// Four or more columns read as a comparison matrix: the block keeps the
|
|
306
|
+
// table at natural width and exposes the stable `md-table-wide` hook so a
|
|
307
|
+
// hosting layout (the chat transcript) can widen it past the message
|
|
308
|
+
// column. Narrower tables — and any table inside a blockquote — fill the
|
|
309
|
+
// column and wrap instead (deepsuite chat TableWrapper parity).
|
|
310
|
+
const wide = columns >= 4 && context.inBlockquote !== true;
|
|
311
|
+
return (_jsx("div", { className: clsx(css.tableScroll, wide ? 'md-table-wide' : css.tableFill), tabIndex: wide ? 0 : undefined, children: _jsxs("table", { children: [headRow !== undefined && _jsx("thead", { children: renderTableRow(headRow, 'th', align, 0, context) }), bodyRows.length > 0 && (_jsx("tbody", { children: bodyRows.map((row, index) => renderTableRow(row, 'td', align, index + 1, context)) }))] }) }, key));
|
|
312
|
+
}
|
|
313
|
+
function renderTableRow(row, cellTag, align, key, context) {
|
|
314
|
+
// With column alignment present, every row renders exactly one cell per
|
|
315
|
+
// column, padding or truncating the row (mdast-util-to-hast parity).
|
|
316
|
+
const length = align === null ? row.children.length : align.length;
|
|
317
|
+
const cells = [];
|
|
318
|
+
for (let index = 0; index < length; index++) {
|
|
319
|
+
const cell = row.children[index];
|
|
320
|
+
const alignValue = align?.[index];
|
|
321
|
+
cells.push(createElement(cellTag,
|
|
322
|
+
// hast-util-to-jsx-runtime's default tableCellAlignToStyle turned the
|
|
323
|
+
// deprecated align attribute into an inline style; keep that DOM.
|
|
324
|
+
{ key: index, style: alignValue == null ? undefined : { textAlign: alignValue } }, ...(cell === undefined ? [] : renderChildren(cell.children, context))));
|
|
325
|
+
}
|
|
326
|
+
return _jsx("tr", { children: cells }, key);
|
|
327
|
+
}
|
|
328
|
+
/** Anchor over an already-authored href: allowlisted or unwrapped, external links get the safe attributes. */
|
|
329
|
+
function renderSafeLink(href, children, key) {
|
|
330
|
+
const safeHref = sanitizeUrl(href);
|
|
331
|
+
if (safeHref === '')
|
|
332
|
+
return _jsx(Fragment, { children: children }, key);
|
|
333
|
+
const external = ['http:', 'https:'].includes(new URL(safeHref).protocol);
|
|
334
|
+
return (_jsx("a", { href: safeHref, ...(external ? { target: '_blank', rel: 'noopener noreferrer' } : {}), children: children }, key));
|
|
335
|
+
}
|
|
336
|
+
/** Anchor over a parsed markdown destination, which hast normalized before the allowlist saw it. */
|
|
337
|
+
function renderAnchor(url, children, key) {
|
|
338
|
+
return renderSafeLink(normalizeUri(url), children, key);
|
|
339
|
+
}
|
|
340
|
+
/**
|
|
341
|
+
* The complete inline-code value when it is exactly an absolute HTTP(S) URL
|
|
342
|
+
* (no surrounding whitespace); anything else stays inert code.
|
|
343
|
+
*/
|
|
344
|
+
function inlineCodeHttpUrl(value) {
|
|
345
|
+
if (value.trim() !== value)
|
|
346
|
+
return undefined;
|
|
347
|
+
try {
|
|
348
|
+
const protocol = new URL(value).protocol;
|
|
349
|
+
return protocol === 'http:' || protocol === 'https:' ? value : undefined;
|
|
350
|
+
}
|
|
351
|
+
catch {
|
|
352
|
+
// Not an absolute URL at all — the only way new URL() rejects a string.
|
|
353
|
+
return undefined;
|
|
354
|
+
}
|
|
355
|
+
}
|
|
356
|
+
function renderImage(url, alt, key, context) {
|
|
357
|
+
// RC2 semantics, including the revalidation of a trusted vocabulary result.
|
|
358
|
+
const remote = remoteImageUrl(sanitizeUrl(normalizeUri(url)));
|
|
359
|
+
const rewritten = remote === undefined ? context.pathImages?.resolve(url) : undefined;
|
|
360
|
+
let imageSrc = remote;
|
|
361
|
+
if (rewritten !== undefined) {
|
|
362
|
+
try {
|
|
363
|
+
const parsed = new URL(rewritten);
|
|
364
|
+
if (['http:', 'https:', 'blob:', 'data:'].includes(parsed.protocol) || rewritten.startsWith('dsh-app://app/api/file?'))
|
|
365
|
+
imageSrc = rewritten;
|
|
366
|
+
}
|
|
367
|
+
catch { /* A vocabulary result must be an absolute URL. */ }
|
|
368
|
+
}
|
|
369
|
+
if (imageSrc === undefined) {
|
|
370
|
+
return _jsx("span", { className: css.imageAlt, children: alt }, key);
|
|
371
|
+
}
|
|
372
|
+
return _jsx(MarkdownImage, { src: imageSrc, alt: alt, destination: url }, `${key}:${imageSrc}`);
|
|
373
|
+
}
|
|
374
|
+
function MarkdownImage({ src, alt, destination }) {
|
|
375
|
+
const [failed, setFailed] = useState(false);
|
|
376
|
+
if (failed)
|
|
377
|
+
return _jsx("span", { className: css.imageAlt, children: alt || destination });
|
|
378
|
+
return (_jsx("img", { className: css.image, src: src, alt: alt, onError: () => { setFailed(true); }, loading: "lazy", decoding: "async", referrerPolicy: "no-referrer" }));
|
|
379
|
+
}
|
|
380
|
+
/** The bracketed source text a reference reverts to when its definition is missing. */
|
|
381
|
+
function referenceSuffix(node) {
|
|
382
|
+
if (node.referenceType === 'collapsed')
|
|
383
|
+
return '][]';
|
|
384
|
+
if (node.referenceType === 'full')
|
|
385
|
+
return `][${node.label ?? node.identifier}]`;
|
|
386
|
+
return ']';
|
|
387
|
+
}
|
|
388
|
+
function renderLinkReference(node, key, context) {
|
|
389
|
+
const definition = context.targets.definitions.get(node.identifier.toUpperCase());
|
|
390
|
+
if (definition === undefined) {
|
|
391
|
+
// The grammar only emits references whose definitions exist somewhere in
|
|
392
|
+
// the same parse, but incremental segments and hand-built trees may still
|
|
393
|
+
// present unresolved ones: revert to the bracketed source text — which is
|
|
394
|
+
// not an anchor, so mentions inside it stay live.
|
|
395
|
+
return _jsxs(Fragment, { children: ['[', renderChildren(node.children, context), referenceSuffix(node)] }, key);
|
|
396
|
+
}
|
|
397
|
+
return renderAnchor(definition.url, renderChildren(node.children, { ...context, inLink: true }), key);
|
|
398
|
+
}
|
|
399
|
+
function renderImageReference(node, key, context) {
|
|
400
|
+
const definition = context.targets.definitions.get(node.identifier.toUpperCase());
|
|
401
|
+
if (definition === undefined)
|
|
402
|
+
return `![${node.alt ?? ''}${referenceSuffix(node)}`;
|
|
403
|
+
return renderImage(definition.url, node.alt ?? '', key, context);
|
|
404
|
+
}
|
|
405
|
+
function renderFootnoteReference(node, key, context) {
|
|
406
|
+
const id = node.identifier.toUpperCase();
|
|
407
|
+
const seen = context.footnoteCounts.get(id);
|
|
408
|
+
if (seen === undefined)
|
|
409
|
+
context.footnoteOrder.push(id);
|
|
410
|
+
context.footnoteCounts.set(id, (seen ?? 0) + 1);
|
|
411
|
+
// The in-page anchor fails the protocol allowlist, so only the numbered
|
|
412
|
+
// superscript renders (matching the replaced pipeline's unwrapped link).
|
|
413
|
+
return _jsx("sup", { children: String(context.footnoteOrder.indexOf(id) + 1) }, key);
|
|
414
|
+
}
|
|
415
|
+
/**
|
|
416
|
+
* Render the trailing footnote section for every footnote referenced during
|
|
417
|
+
* the pass, in first-reference order, with one plain-text back-reference
|
|
418
|
+
* marker per rendered reference.
|
|
419
|
+
* @param context - The pass state after all blocks rendered.
|
|
420
|
+
* @returns The section, or null when no referenced footnote has a definition.
|
|
421
|
+
*/
|
|
422
|
+
export function renderFootnoteSection(context) {
|
|
423
|
+
const items = [];
|
|
424
|
+
for (const id of context.footnoteOrder) {
|
|
425
|
+
const definition = context.targets.footnotes.get(id);
|
|
426
|
+
if (definition === undefined)
|
|
427
|
+
continue;
|
|
428
|
+
const count = context.footnoteCounts.get(id) ?? 0;
|
|
429
|
+
const backrefs = [];
|
|
430
|
+
for (let reference = 1; reference <= count; reference++) {
|
|
431
|
+
if (backrefs.length > 0)
|
|
432
|
+
backrefs.push(' ');
|
|
433
|
+
backrefs.push('↩');
|
|
434
|
+
if (reference > 1)
|
|
435
|
+
backrefs.push(_jsx("sup", { children: String(reference) }, `re-${reference}`));
|
|
436
|
+
}
|
|
437
|
+
const entries = renderBlockEntries(definition.children, context);
|
|
438
|
+
const tail = entries[entries.length - 1];
|
|
439
|
+
const body = entries.map((entry, index) => ('paragraph' in entry
|
|
440
|
+
? (_jsxs("p", { children: [entry.paragraph, entry === tail && _jsxs(_Fragment, { children: [' ', backrefs] })] }, `p-${index}`))
|
|
441
|
+
: entry.element));
|
|
442
|
+
// Without a trailing paragraph the back-references join the block list
|
|
443
|
+
// itself (and pick up the wrap newlines), as in the replaced pipeline.
|
|
444
|
+
if (tail === undefined || !('paragraph' in tail))
|
|
445
|
+
body.push(...backrefs);
|
|
446
|
+
items.push(_jsx("li", { id: `user-content-fn-${normalizeUri(id.toLowerCase())}`, children: wrapBlockChildren(body, true) }, id));
|
|
447
|
+
}
|
|
448
|
+
if (items.length === 0)
|
|
449
|
+
return null;
|
|
450
|
+
return (_jsxs("section", { "data-footnotes": true, className: "footnotes", children: [_jsx("h2", { id: "footnote-label", className: "sr-only", children: "Footnotes" }), _jsx("ol", { children: items })] }, "footnotes"));
|
|
451
|
+
}
|
|
452
|
+
//# sourceMappingURL=render.js.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"render.js","sourceRoot":"","sources":["../../../../src/client/markdown/render.tsx"],"names":[],"mappings":"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"}
|
|
@@ -0,0 +1,50 @@
|
|
|
1
|
+
/**
|
|
2
|
+
* Core pure functions for SEP-1865 / MCP Apps integration.
|
|
3
|
+
* Free of CSS module imports so it can be cleanly tested in Node test environments.
|
|
4
|
+
*/
|
|
5
|
+
export declare function getHostTheme(): 'dark' | 'light';
|
|
6
|
+
export declare function getCssTokens(theme: 'dark' | 'light'): Record<string, string>;
|
|
7
|
+
/**
|
|
8
|
+
* Extracts a title from the HTML document's <title> tag.
|
|
9
|
+
*/
|
|
10
|
+
export declare function extractHtmlTitle(html: string): string | undefined;
|
|
11
|
+
/**
|
|
12
|
+
* Normalizes user/model generated HTML to ensure a valid HTML5 structure
|
|
13
|
+
* and embeds a dynamic theme listener so dark/light mode switches take effect immediately.
|
|
14
|
+
*/
|
|
15
|
+
export declare function ensureHtmlDocument(rawHtml: string, initialTheme?: 'dark' | 'light'): string;
|
|
16
|
+
/**
|
|
17
|
+
* Determines whether a markdown code block represents an MCP App.
|
|
18
|
+
*/
|
|
19
|
+
export declare function isMcpAppCodeBlock(lang: string | null | undefined, meta: string | null | undefined, value: string): boolean;
|
|
20
|
+
/**
|
|
21
|
+
* Extracts a title from code block meta or HTML content.
|
|
22
|
+
*/
|
|
23
|
+
export declare function extractMcpAppTitle(meta: string | null | undefined, value: string): string | undefined;
|
|
24
|
+
/**
|
|
25
|
+
* Extracts an explicit height budget from code block meta (e.g. height=600 or height="500px").
|
|
26
|
+
*/
|
|
27
|
+
export declare function extractMcpAppHeight(meta: string | null | undefined): number | undefined;
|
|
28
|
+
/**
|
|
29
|
+
* Formats a user-submitted MCP App event into a concise, natural language conversational prompt.
|
|
30
|
+
* Avoids raw multiline JSON and excessive whitespace.
|
|
31
|
+
*/
|
|
32
|
+
export declare function formatReceiptPrompt(params: Record<string, unknown>, title?: string): string;
|
|
33
|
+
/**
|
|
34
|
+
* Finds the DSH composer textarea. The page can contain multiple (hidden)
|
|
35
|
+
* textareas, so prefer a visible, enabled one carrying the input-bar
|
|
36
|
+
* `data-phase` marker; fall back to the tallest visible, then any enabled.
|
|
37
|
+
*/
|
|
38
|
+
export declare function findComposerTextarea(doc?: Document): HTMLTextAreaElement | null;
|
|
39
|
+
/**
|
|
40
|
+
* DOM fallback for composer fill: types into the Lexical contenteditable
|
|
41
|
+
* surface (`[data-composer-input]`) via execCommand insertText so the editor
|
|
42
|
+
* adopts the change as a genuine user edit. Returns true when accepted.
|
|
43
|
+
*/
|
|
44
|
+
export declare function fillComposerDom(text: string, doc?: Document): boolean;
|
|
45
|
+
/**
|
|
46
|
+
* Updates a React-controlled textarea and properly notifies React's valueTracker
|
|
47
|
+
* so the backdrop and input state immediately reflect the text.
|
|
48
|
+
*/
|
|
49
|
+
export declare function setReactInputValue(textarea: HTMLTextAreaElement, value: string): void;
|
|
50
|
+
//# sourceMappingURL=mcp-app.d.ts.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"mcp-app.d.ts","sourceRoot":"","sources":["../../../src/client/mcp-app.ts"],"names":[],"mappings":"AAAA;;;GAGG;AAEH,wBAAgB,YAAY,IAAI,MAAM,GAAG,OAAO,CAS/C;AAED,wBAAgB,YAAY,CAAC,KAAK,EAAE,MAAM,GAAG,OAAO,GAAG,MAAM,CAAC,MAAM,EAAE,MAAM,CAAC,CAY5E;AAED;;GAEG;AACH,wBAAgB,gBAAgB,CAAC,IAAI,EAAE,MAAM,GAAG,MAAM,GAAG,SAAS,CAGjE;AAED;;;GAGG;AACH,wBAAgB,kBAAkB,CAAC,OAAO,EAAE,MAAM,EAAE,YAAY,GAAE,MAAM,GAAG,OAAiB,GAAG,MAAM,CA6HpG;AAED;;GAEG;AACH,wBAAgB,iBAAiB,CAAC,IAAI,EAAE,MAAM,GAAG,IAAI,GAAG,SAAS,EAAE,IAAI,EAAE,MAAM,GAAG,IAAI,GAAG,SAAS,EAAE,KAAK,EAAE,MAAM,GAAG,OAAO,CAa1H;AAED;;GAEG;AACH,wBAAgB,kBAAkB,CAAC,IAAI,EAAE,MAAM,GAAG,IAAI,GAAG,SAAS,EAAE,KAAK,EAAE,MAAM,GAAG,MAAM,GAAG,SAAS,CAQrG;AAED;;GAEG;AACH,wBAAgB,mBAAmB,CAAC,IAAI,EAAE,MAAM,GAAG,IAAI,GAAG,SAAS,GAAG,MAAM,GAAG,SAAS,CAQvF;AAED;;;GAGG;AACH,wBAAgB,mBAAmB,CAAC,MAAM,EAAE,MAAM,CAAC,MAAM,EAAE,OAAO,CAAC,EAAE,KAAK,CAAC,EAAE,MAAM,GAAG,MAAM,CAqB3F;AAED;;;;GAIG;AACH,wBAAgB,oBAAoB,CAAC,GAAG,CAAC,EAAE,QAAQ,GAAG,mBAAmB,GAAG,IAAI,CAe/E;AAED;;;;GAIG;AACH,wBAAgB,eAAe,CAAC,IAAI,EAAE,MAAM,EAAE,GAAG,CAAC,EAAE,QAAQ,GAAG,OAAO,CAiCrE;AAED;;;GAGG;AACH,wBAAgB,kBAAkB,CAAC,QAAQ,EAAE,mBAAmB,EAAE,KAAK,EAAE,MAAM,GAAG,IAAI,CAgBrF"}
|