dsh-better-display 0.1.1
This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
- package/CHANGELOG.md +51 -0
- package/DESIGN.md +72 -0
- package/LICENSE +24 -0
- package/README.en.md +41 -0
- package/README.md +41 -0
- package/THIRD_PARTY_NOTICES.md +65 -0
- package/cordis.patch.yml +5 -0
- package/cordis.yml +4 -0
- package/dshx.yml +5 -0
- package/lib/client.js +49923 -0
- package/lib/client.js.map +1 -0
- package/lib/dsh-better-display.js +256 -0
- package/lib/types/client/Blocks.d.ts +45 -0
- package/lib/types/client/Blocks.d.ts.map +1 -0
- package/lib/types/client/Blocks.js +136 -0
- package/lib/types/client/Blocks.js.map +1 -0
- package/lib/types/client/ChoreographedFlow.d.ts +22 -0
- package/lib/types/client/ChoreographedFlow.d.ts.map +1 -0
- package/lib/types/client/ChoreographedFlow.js +170 -0
- package/lib/types/client/ChoreographedFlow.js.map +1 -0
- package/lib/types/client/ClosedProcessSummary.d.ts +9 -0
- package/lib/types/client/ClosedProcessSummary.d.ts.map +1 -0
- package/lib/types/client/ClosedProcessSummary.js +15 -0
- package/lib/types/client/ClosedProcessSummary.js.map +1 -0
- package/lib/types/client/LiveFold.d.ts +10 -0
- package/lib/types/client/LiveFold.d.ts.map +1 -0
- package/lib/types/client/LiveFold.js +39 -0
- package/lib/types/client/LiveFold.js.map +1 -0
- package/lib/types/client/McpAppFrame.d.ts +32 -0
- package/lib/types/client/McpAppFrame.d.ts.map +1 -0
- package/lib/types/client/McpAppFrame.js +193 -0
- package/lib/types/client/McpAppFrame.js.map +1 -0
- package/lib/types/client/Reader.d.ts +3 -0
- package/lib/types/client/Reader.d.ts.map +1 -0
- package/lib/types/client/Reader.js +537 -0
- package/lib/types/client/Reader.js.map +1 -0
- package/lib/types/client/ReasoningCard.d.ts +11 -0
- package/lib/types/client/ReasoningCard.d.ts.map +1 -0
- package/lib/types/client/ReasoningCard.js +301 -0
- package/lib/types/client/ReasoningCard.js.map +1 -0
- package/lib/types/client/StickyLane.d.ts +8 -0
- package/lib/types/client/StickyLane.d.ts.map +1 -0
- package/lib/types/client/StickyLane.js +28 -0
- package/lib/types/client/StickyLane.js.map +1 -0
- package/lib/types/client/TimelineRail.d.ts +10 -0
- package/lib/types/client/TimelineRail.d.ts.map +1 -0
- package/lib/types/client/TimelineRail.js +168 -0
- package/lib/types/client/TimelineRail.js.map +1 -0
- package/lib/types/client/ToolActivity.d.ts +17 -0
- package/lib/types/client/ToolActivity.d.ts.map +1 -0
- package/lib/types/client/ToolActivity.js +192 -0
- package/lib/types/client/ToolActivity.js.map +1 -0
- package/lib/types/client/TurnMetrics.d.ts +11 -0
- package/lib/types/client/TurnMetrics.d.ts.map +1 -0
- package/lib/types/client/TurnMetrics.js +44 -0
- package/lib/types/client/TurnMetrics.js.map +1 -0
- package/lib/types/client/WaitingStatus.d.ts +6 -0
- package/lib/types/client/WaitingStatus.d.ts.map +1 -0
- package/lib/types/client/WaitingStatus.js +19 -0
- package/lib/types/client/WaitingStatus.js.map +1 -0
- package/lib/types/client/conversation-scroll.d.ts +19 -0
- package/lib/types/client/conversation-scroll.d.ts.map +1 -0
- package/lib/types/client/conversation-scroll.js +25 -0
- package/lib/types/client/conversation-scroll.js.map +1 -0
- package/lib/types/client/deliverables.d.ts +24 -0
- package/lib/types/client/deliverables.d.ts.map +1 -0
- package/lib/types/client/deliverables.js +104 -0
- package/lib/types/client/deliverables.js.map +1 -0
- package/lib/types/client/entry-policy.d.ts +10 -0
- package/lib/types/client/entry-policy.d.ts.map +1 -0
- package/lib/types/client/entry-policy.js +24 -0
- package/lib/types/client/entry-policy.js.map +1 -0
- package/lib/types/client/entry.d.ts +4 -0
- package/lib/types/client/entry.d.ts.map +1 -0
- package/lib/types/client/entry.js +34 -0
- package/lib/types/client/entry.js.map +1 -0
- package/lib/types/client/fold-choreography.d.ts +28 -0
- package/lib/types/client/fold-choreography.d.ts.map +1 -0
- package/lib/types/client/fold-choreography.js +31 -0
- package/lib/types/client/fold-choreography.js.map +1 -0
- package/lib/types/client/index.d.ts +7 -0
- package/lib/types/client/index.d.ts.map +1 -0
- package/lib/types/client/index.js +153 -0
- package/lib/types/client/index.js.map +1 -0
- package/lib/types/client/live-turn.d.ts +58 -0
- package/lib/types/client/live-turn.d.ts.map +1 -0
- package/lib/types/client/live-turn.js +144 -0
- package/lib/types/client/live-turn.js.map +1 -0
- package/lib/types/client/markdown/MarkdownText.d.ts +39 -0
- package/lib/types/client/markdown/MarkdownText.d.ts.map +1 -0
- package/lib/types/client/markdown/MarkdownText.js +171 -0
- package/lib/types/client/markdown/MarkdownText.js.map +1 -0
- package/lib/types/client/markdown/cjkFriendlyStrong.d.ts +9 -0
- package/lib/types/client/markdown/cjkFriendlyStrong.d.ts.map +1 -0
- package/lib/types/client/markdown/cjkFriendlyStrong.js +73 -0
- package/lib/types/client/markdown/cjkFriendlyStrong.js.map +1 -0
- package/lib/types/client/markdown/incremental.d.ts +69 -0
- package/lib/types/client/markdown/incremental.d.ts.map +1 -0
- package/lib/types/client/markdown/incremental.js +108 -0
- package/lib/types/client/markdown/incremental.js.map +1 -0
- package/lib/types/client/markdown/katex.d.ts +27 -0
- package/lib/types/client/markdown/katex.d.ts.map +1 -0
- package/lib/types/client/markdown/katex.js +88 -0
- package/lib/types/client/markdown/katex.js.map +1 -0
- package/lib/types/client/markdown/mathCompatibility.d.ts +11 -0
- package/lib/types/client/markdown/mathCompatibility.d.ts.map +1 -0
- package/lib/types/client/markdown/mathCompatibility.js +293 -0
- package/lib/types/client/markdown/mathCompatibility.js.map +1 -0
- package/lib/types/client/markdown/parse.d.ts +25 -0
- package/lib/types/client/markdown/parse.d.ts.map +1 -0
- package/lib/types/client/markdown/parse.js +42 -0
- package/lib/types/client/markdown/parse.js.map +1 -0
- package/lib/types/client/markdown/render.d.ts +119 -0
- package/lib/types/client/markdown/render.d.ts.map +1 -0
- package/lib/types/client/markdown/render.js +435 -0
- package/lib/types/client/markdown/render.js.map +1 -0
- package/lib/types/client/mcp-app.d.ts +50 -0
- package/lib/types/client/mcp-app.d.ts.map +1 -0
- package/lib/types/client/mcp-app.js +328 -0
- package/lib/types/client/mcp-app.js.map +1 -0
- package/lib/types/client/message-chrome.d.ts +19 -0
- package/lib/types/client/message-chrome.d.ts.map +1 -0
- package/lib/types/client/message-chrome.js +42 -0
- package/lib/types/client/message-chrome.js.map +1 -0
- package/lib/types/client/motion.d.ts +38 -0
- package/lib/types/client/motion.d.ts.map +1 -0
- package/lib/types/client/motion.js +367 -0
- package/lib/types/client/motion.js.map +1 -0
- package/lib/types/client/native/ContextBody.d.ts +130 -0
- package/lib/types/client/native/ContextBody.d.ts.map +1 -0
- package/lib/types/client/native/ContextBody.js +398 -0
- package/lib/types/client/native/ContextBody.js.map +1 -0
- package/lib/types/client/native/ContextInjectionRow.d.ts +26 -0
- package/lib/types/client/native/ContextInjectionRow.d.ts.map +1 -0
- package/lib/types/client/native/ContextInjectionRow.js +27 -0
- package/lib/types/client/native/ContextInjectionRow.js.map +1 -0
- package/lib/types/client/native/ReferenceIcon.d.ts +16 -0
- package/lib/types/client/native/ReferenceIcon.d.ts.map +1 -0
- package/lib/types/client/native/ReferenceIcon.js +16 -0
- package/lib/types/client/native/ReferenceIcon.js.map +1 -0
- package/lib/types/client/native/tool-call-model.d.ts +58 -0
- package/lib/types/client/native/tool-call-model.d.ts.map +1 -0
- package/lib/types/client/native/tool-call-model.js +219 -0
- package/lib/types/client/native/tool-call-model.js.map +1 -0
- package/lib/types/client/open-file.d.ts +24 -0
- package/lib/types/client/primitive-labels.d.ts +10 -0
- package/lib/types/client/primitive-labels.d.ts.map +1 -0
- package/lib/types/client/primitive-labels.js +37 -0
- package/lib/types/client/primitive-labels.js.map +1 -0
- package/lib/types/client/projection.d.ts +41 -0
- package/lib/types/client/projection.d.ts.map +1 -0
- package/lib/types/client/projection.js +112 -0
- package/lib/types/client/projection.js.map +1 -0
- package/lib/types/client/reasoning-follow.d.ts +6 -0
- package/lib/types/client/reasoning-follow.d.ts.map +1 -0
- package/lib/types/client/reasoning-follow.js +12 -0
- package/lib/types/client/reasoning-follow.js.map +1 -0
- package/lib/types/client/settings-copy.d.ts +6 -0
- package/lib/types/client/settings-slots.d.ts +16 -0
- package/lib/types/client/store.d.ts +17 -0
- package/lib/types/client/store.d.ts.map +1 -0
- package/lib/types/client/store.js +13 -0
- package/lib/types/client/store.js.map +1 -0
- package/lib/types/client/stream-buffer.d.ts +29 -0
- package/lib/types/client/stream-buffer.d.ts.map +1 -0
- package/lib/types/client/stream-buffer.js +113 -0
- package/lib/types/client/stream-buffer.js.map +1 -0
- package/lib/types/client/streaming.d.ts +18 -0
- package/lib/types/client/streaming.d.ts.map +1 -0
- package/lib/types/client/streaming.js +77 -0
- package/lib/types/client/streaming.js.map +1 -0
- package/lib/types/client/timeline.d.ts +26 -0
- package/lib/types/client/timeline.d.ts.map +1 -0
- package/lib/types/client/timeline.js +48 -0
- package/lib/types/client/timeline.js.map +1 -0
- package/lib/types/client/tool-activity.d.ts +52 -0
- package/lib/types/client/tool-activity.d.ts.map +1 -0
- package/lib/types/client/tool-activity.js +178 -0
- package/lib/types/client/tool-activity.js.map +1 -0
- package/lib/types/client/types.d.ts +66 -0
- package/lib/types/client/types.d.ts.map +1 -0
- package/lib/types/client/types.js +2 -0
- package/lib/types/client/types.js.map +1 -0
- package/lib/types/client/waiting-clock.d.ts +17 -0
- package/lib/types/client/waiting-clock.d.ts.map +1 -0
- package/lib/types/client/waiting-clock.js +24 -0
- package/lib/types/client/waiting-clock.js.map +1 -0
- package/lib/types/client/word-motion.d.ts +16 -0
- package/lib/types/client/word-motion.d.ts.map +1 -0
- package/lib/types/client/word-motion.js +89 -0
- package/lib/types/client/word-motion.js.map +1 -0
- package/lib/types/client/word-timeline.d.ts +28 -0
- package/lib/types/client/word-timeline.d.ts.map +1 -0
- package/lib/types/client/word-timeline.js +100 -0
- package/lib/types/client/word-timeline.js.map +1 -0
- package/lib/types/dsh-better-display.d.ts +17 -0
- package/lib/types/dsh-better-display.d.ts.map +1 -0
- package/lib/types/dsh-better-display.js +53 -0
- package/lib/types/dsh-better-display.js.map +1 -0
- package/package.json +121 -0
- package/scripts/build-motion-fixture.mjs +26 -0
- package/scripts/link-harness-dependencies.mjs +51 -0
- package/skills/generative-mcpapps/SKILL.md +47 -0
- package/skills/generative-mcpapps/examples/interactive_quiz.html +153 -0
- package/skills/generative-mcpapps/references/html_boilerplate.md +122 -0
- package/skills/generative-mcpapps/references/sep1865_protocol.md +54 -0
- package/src/client/Blocks.tsx +205 -0
- package/src/client/ChoreographedFlow.tsx +182 -0
- package/src/client/ClosedProcessSummary.tsx +19 -0
- package/src/client/LiveFold.tsx +43 -0
- package/src/client/McpAppFrame.module.css +210 -0
- package/src/client/McpAppFrame.tsx +317 -0
- package/src/client/Reader.module.css +329 -0
- package/src/client/Reader.tsx +814 -0
- package/src/client/ReasoningCard.tsx +285 -0
- package/src/client/SettingsSection.module.css +147 -0
- package/src/client/SettingsSection.tsx +117 -0
- package/src/client/StickyLane.tsx +24 -0
- package/src/client/TimelineRail.module.css +170 -0
- package/src/client/TimelineRail.tsx +262 -0
- package/src/client/ToolActivity.tsx +214 -0
- package/src/client/TurnMetrics.module.css +139 -0
- package/src/client/TurnMetrics.tsx +160 -0
- package/src/client/WaitingStatus.tsx +22 -0
- package/src/client/conversation-scroll.ts +28 -0
- package/src/client/deliverables.ts +122 -0
- package/src/client/entry-policy.ts +20 -0
- package/src/client/entry.tsx +40 -0
- package/src/client/fold-choreography.ts +38 -0
- package/src/client/index.tsx +198 -0
- package/src/client/live-turn.ts +155 -0
- package/src/client/markdown/MarkdownText.module.css +304 -0
- package/src/client/markdown/MarkdownText.tsx +187 -0
- package/src/client/markdown/cjkFriendlyStrong.ts +84 -0
- package/src/client/markdown/incremental.ts +131 -0
- package/src/client/markdown/katex.tsx +91 -0
- package/src/client/markdown/mathCompatibility.ts +350 -0
- package/src/client/markdown/parse.ts +45 -0
- package/src/client/markdown/render.tsx +630 -0
- package/src/client/markdown/upstream.json +14 -0
- package/src/client/mcp-app.ts +323 -0
- package/src/client/message-chrome.ts +47 -0
- package/src/client/motion.tsx +338 -0
- package/src/client/native/ContextBody.module.css +161 -0
- package/src/client/native/ContextBody.tsx +591 -0
- package/src/client/native/ContextInjectionRow.module.css +62 -0
- package/src/client/native/ContextInjectionRow.tsx +72 -0
- package/src/client/native/ReferenceIcon.tsx +35 -0
- package/src/client/native/tool-call-model.ts +248 -0
- package/src/client/native/upstream.json +41 -0
- package/src/client/open-file.ts +94 -0
- package/src/client/pending-submission.ts +49 -0
- package/src/client/primitive-labels.ts +53 -0
- package/src/client/projection.ts +118 -0
- package/src/client/reasoning-follow.ts +12 -0
- package/src/client/settings-copy.ts +53 -0
- package/src/client/settings-slots.ts +20 -0
- package/src/client/settings.tsx +73 -0
- package/src/client/skill-status.ts +78 -0
- package/src/client/store.ts +30 -0
- package/src/client/stream-buffer.ts +100 -0
- package/src/client/streaming.tsx +62 -0
- package/src/client/style.d.ts +4 -0
- package/src/client/timeline.ts +77 -0
- package/src/client/tool-activity.ts +152 -0
- package/src/client/types.ts +66 -0
- package/src/client/waiting-clock.ts +25 -0
- package/src/client/word-motion.tsx +91 -0
- package/src/client/word-timeline.ts +96 -0
- package/src/dsh-better-display.ts +108 -0
- package/src/skill-roots.ts +138 -0
- package/src/skill-status.ts +81 -0
- package/tests/browser-closed-gap.tsx +20 -0
- package/tests/browser-motion.tsx +65 -0
- package/tests/browser-sticky-lanes.tsx +22 -0
- package/tests/browser-waiting-clock.tsx +14 -0
- package/tests/chat-flow-hook.test.ts +66 -0
- package/tests/cloud-gate.test.ts +34 -0
- package/tests/conversation-scroll.test.ts +47 -0
- package/tests/deliverables.test.ts +128 -0
- package/tests/entry.test.ts +42 -0
- package/tests/fixtures/maid-composer-hide.html +31 -0
- package/tests/fold-choreography.test.ts +38 -0
- package/tests/history-word-regression.test.ts +16 -0
- package/tests/live-turn.test.ts +218 -0
- package/tests/mcp-apps.test.ts +157 -0
- package/tests/message-chrome.test.ts +29 -0
- package/tests/open-file.test.ts +103 -0
- package/tests/pending-submission.test.ts +45 -0
- package/tests/projection.test.ts +184 -0
- package/tests/reasoning-follow.test.ts +34 -0
- package/tests/settings-copy.test.ts +63 -0
- package/tests/skill-status.test.ts +137 -0
- package/tests/stock-install.test.ts +50 -0
- package/tests/stream-buffer.test.ts +97 -0
- package/tests/timeline.test.ts +59 -0
- package/tests/waiting-clock.test.ts +24 -0
- package/tests/word-timeline.test.ts +136 -0
- package/tsconfig.json +11 -0
- package/tsdown.config.ts +49 -0
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"types.d.ts","sourceRoot":"","sources":["../../../src/client/types.ts"],"names":[],"mappings":"AAAA,OAAO,KAAK,EAAE,kBAAkB,EAAE,MAAM,6BAA6B,CAAC;AACtE,OAAO,KAAK,EAAE,cAAc,EAAE,MAAM,gDAAgD,CAAC;AACrF,OAAO,KAAK,EAAE,oBAAoB,EAAE,MAAM,uCAAuC,CAAC;AAClF,OAAO,KAAK,EAAE,WAAW,EAAE,gBAAgB,EAAE,YAAY,EAAE,UAAU,EAAE,MAAM,kCAAkC,CAAC;AAIhH,OAAO,KAAK,EAAE,iBAAiB,EAAE,MAAM,YAAY,CAAC;AAEpD,MAAM,WAAW,gBAAgB;IAC/B,KAAK,EAAE,cAAc,CAAC;IACtB,SAAS,EAAE,OAAO,CAAC;IACnB,MAAM,EAAE,WAAW,GAAG,MAAM,GAAG,MAAM,CAAC;CACvC;AAED,OAAO,QAAQ,kCAAkC,CAAC;IAChD,UAAU,OAAO;QACf,yFAAyF;QACzF,0BAA0B,EAAE;YAAE,IAAI,EAAE,OAAO,CAAC;YAAC,KAAK,EAAE,SAAS,CAAC;YAAC,KAAK,EAAE,gBAAgB,CAAA;SAAE,CAAC;KAC1F;CACF;AAED,MAAM,WAAW,cAAc;IAC7B,SAAS,EAAE,MAAM,OAAO,CAAC,IAAI,CAAC,CAAC;IAC/B,SAAS,EAAE,CAAC,UAAU,EAAE,kBAAkB,KAAK,OAAO,CAAC;QAAE,IAAI,EAAE,UAAU,CAAC;QAAC,SAAS,EAAE,MAAM,CAAA;KAAE,CAAC,CAAC;IAChG;;;;OAIG;IACH,YAAY,EAAE,CAAC,IAAI,EAAE,MAAM,KAAK,OAAO,CAAC;IACxC,kFAAkF;IAClF,QAAQ,EAAE,CAAC,IAAI,EAAE,MAAM,KAAK,OAAO,CAAC,IAAI,CAAC,GAAG,IAAI,CAAC;IACjD,iFAAiF;IACjF,UAAU,CAAC,EAAE,CAAC,IAAI,EAAE,MAAM,KAAK,OAAO,CAAC,IAAI,CAAC,GAAG,IAAI,CAAC;IACpD,sFAAsF;IACtF,MAAM,CAAC,EAAE,CAAC,GAAG,EAAE,MAAM,KAAK,IAAI,CAAC;IAC/B,6DAA6D;IAC7D,WAAW,CAAC,EAAE,CAAC,GAAG,EAAE,OAAO,KAAK,OAAO,CAAC,IAAI,CAAC,CAAC;CAC/C;AACD,MAAM,MAAM,WAAW,GAAG,YAAY,CAAC,mBAAmB,CAAC,GACvD,WAAW,CAAC,MAAM,CAAC,GACnB,gBAAgB,CAAC,0BAA0B,CAAC,GAC5C,UAAU,CAAC,UAAU,CAAC,OAAO,iBAAiB,CAAC,CAAC,GAChD,cAAc,CAAC;AACnB,MAAM,MAAM,gBAAgB,GAAG,IAAI,CAAC,WAAW,EAAE,iBAAiB,GAAG,WAAW,GAAG,cAAc,CAAC,GAAG;IACnG,QAAQ,CAAC,EAAE,CAAC,IAAI,EAAE,MAAM,KAAK,OAAO,CAAC,IAAI,CAAC,GAAG,IAAI,CAAC;IAClD,UAAU,CAAC,EAAE,CAAC,IAAI,EAAE,MAAM,KAAK,OAAO,CAAC,IAAI,CAAC,GAAG,IAAI,CAAC;IACpD,MAAM,CAAC,EAAE,CAAC,GAAG,EAAE,MAAM,KAAK,IAAI,CAAC;IAC/B,6FAA6F;IAC7F,OAAO,CAAC,EAAE,MAAM,CAAC;IACjB,YAAY,CAAC,EAAE,oBAAoB,CAAC;IACpC,OAAO,CAAC,EAAE;QACR,KAAK,CAAC,EAAE,WAAW,CAAC,OAAO,wCAAwC,EAAE,gBAAgB,CAAC,YAAY,CAAC,CAAC,CAAC;QACrG,KAAK,CAAC,EAAE,MAAM,CAAC;QACf,eAAe,CAAC,EAAE,MAAM,CAAC;QACzB,MAAM,CAAC,EAAE,MAAM,CAAC;QAChB,iEAAiE;QACjE,OAAO,CAAC,EAAE,MAAM,CAAC;KAClB,CAAC;CACH,CAAC"}
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"types.js","sourceRoot":"","sources":["../../../src/client/types.ts"],"names":[],"mappings":""}
|
|
@@ -0,0 +1,17 @@
|
|
|
1
|
+
export interface WaitingAnchor {
|
|
2
|
+
key: string;
|
|
3
|
+
time: number | null;
|
|
4
|
+
}
|
|
5
|
+
type InputNode = {
|
|
6
|
+
kind: string;
|
|
7
|
+
data: unknown;
|
|
8
|
+
};
|
|
9
|
+
type Submission = {
|
|
10
|
+
requestId: string;
|
|
11
|
+
time: number;
|
|
12
|
+
placement?: string;
|
|
13
|
+
};
|
|
14
|
+
/** Waiting is scoped to the latest human input, never the enclosing turn. */
|
|
15
|
+
export declare function waitingAnchor(order: readonly string[], get: (key: string) => InputNode | undefined, pending?: readonly Submission[]): WaitingAnchor;
|
|
16
|
+
export {};
|
|
17
|
+
//# sourceMappingURL=waiting-clock.d.ts.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"waiting-clock.d.ts","sourceRoot":"","sources":["../../../src/client/waiting-clock.ts"],"names":[],"mappings":"AAAA,MAAM,WAAW,aAAa;IAAG,GAAG,EAAE,MAAM,CAAC;IAAC,IAAI,EAAE,MAAM,GAAG,IAAI,CAAA;CAAE;AACnE,KAAK,SAAS,GAAG;IAAE,IAAI,EAAE,MAAM,CAAC;IAAC,IAAI,EAAE,OAAO,CAAA;CAAE,CAAC;AACjD,KAAK,UAAU,GAAG;IAAE,SAAS,EAAE,MAAM,CAAC;IAAC,IAAI,EAAE,MAAM,CAAC;IAAC,SAAS,CAAC,EAAE,MAAM,CAAA;CAAE,CAAC;AAG1E,6EAA6E;AAC7E,wBAAgB,aAAa,CAAC,KAAK,EAAE,SAAS,MAAM,EAAE,EAAE,GAAG,EAAE,CAAC,GAAG,EAAE,MAAM,KAAK,SAAS,GAAG,SAAS,EAAE,OAAO,GAAE,SAAS,UAAU,EAAO,GAAG,aAAa,CAkBvJ"}
|
|
@@ -0,0 +1,24 @@
|
|
|
1
|
+
const timestamp = (value) => typeof value === 'number' && Number.isFinite(value) && value >= 0 ? value : null;
|
|
2
|
+
/** Waiting is scoped to the latest human input, never the enclosing turn. */
|
|
3
|
+
export function waitingAnchor(order, get, pending = []) {
|
|
4
|
+
let anchor = { key: 'unresolved', time: null };
|
|
5
|
+
for (let i = order.length - 1; i >= 0; i--) {
|
|
6
|
+
const node = get(order[i]);
|
|
7
|
+
if (node?.kind === 'user' || node?.kind === 'steering') {
|
|
8
|
+
const time = node.data && typeof node.data === 'object' && 'time' in node.data && typeof node.data.time === 'number' ? node.data.time : undefined;
|
|
9
|
+
anchor = { key: order[i], time: timestamp(time) };
|
|
10
|
+
break;
|
|
11
|
+
}
|
|
12
|
+
}
|
|
13
|
+
for (let i = pending.length - 1; i >= 0; i--) {
|
|
14
|
+
const input = pending[i];
|
|
15
|
+
if (input.placement === 'queued')
|
|
16
|
+
continue;
|
|
17
|
+
const time = timestamp(input.time);
|
|
18
|
+
if (time === null || anchor.time === null || time >= anchor.time)
|
|
19
|
+
return { key: `pending:${input.requestId}`, time };
|
|
20
|
+
break;
|
|
21
|
+
}
|
|
22
|
+
return anchor;
|
|
23
|
+
}
|
|
24
|
+
//# sourceMappingURL=waiting-clock.js.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"waiting-clock.js","sourceRoot":"","sources":["../../../src/client/waiting-clock.ts"],"names":[],"mappings":"AAGA,MAAM,SAAS,GAAG,CAAC,KAAyB,EAAiB,EAAE,CAAC,OAAO,KAAK,KAAK,QAAQ,IAAI,MAAM,CAAC,QAAQ,CAAC,KAAK,CAAC,IAAI,KAAK,IAAI,CAAC,CAAC,CAAC,CAAC,KAAK,CAAC,CAAC,CAAC,IAAI,CAAC;AAEjJ,6EAA6E;AAC7E,MAAM,UAAU,aAAa,CAAC,KAAwB,EAAE,GAA2C,EAAE,UAAiC,EAAE;IACtI,IAAI,MAAM,GAAkB,EAAE,GAAG,EAAE,YAAY,EAAE,IAAI,EAAE,IAAI,EAAE,CAAC;IAC9D,KAAK,IAAI,CAAC,GAAG,KAAK,CAAC,MAAM,GAAG,CAAC,EAAE,CAAC,IAAI,CAAC,EAAE,CAAC,EAAE,EAAE,CAAC;QAC3C,MAAM,IAAI,GAAG,GAAG,CAAC,KAAK,CAAC,CAAC,CAAC,CAAC,CAAC;QAC3B,IAAI,IAAI,EAAE,IAAI,KAAK,MAAM,IAAI,IAAI,EAAE,IAAI,KAAK,UAAU,EAAE,CAAC;YACvD,MAAM,IAAI,GAAG,IAAI,CAAC,IAAI,IAAI,OAAO,IAAI,CAAC,IAAI,KAAK,QAAQ,IAAI,MAAM,IAAI,IAAI,CAAC,IAAI,IAAI,OAAO,IAAI,CAAC,IAAI,CAAC,IAAI,KAAK,QAAQ,CAAC,CAAC,CAAC,IAAI,CAAC,IAAI,CAAC,IAAI,CAAC,CAAC,CAAC,SAAS,CAAC;YAClJ,MAAM,GAAG,EAAE,GAAG,EAAE,KAAK,CAAC,CAAC,CAAC,EAAE,IAAI,EAAE,SAAS,CAAC,IAAI,CAAC,EAAE,CAAC;YAClD,MAAM;QACR,CAAC;IACH,CAAC;IACD,KAAK,IAAI,CAAC,GAAG,OAAO,CAAC,MAAM,GAAG,CAAC,EAAE,CAAC,IAAI,CAAC,EAAE,CAAC,EAAE,EAAE,CAAC;QAC7C,MAAM,KAAK,GAAG,OAAO,CAAC,CAAC,CAAC,CAAC;QACzB,IAAI,KAAK,CAAC,SAAS,KAAK,QAAQ;YAAE,SAAS;QAC3C,MAAM,IAAI,GAAG,SAAS,CAAC,KAAK,CAAC,IAAI,CAAC,CAAC;QACnC,IAAI,IAAI,KAAK,IAAI,IAAI,MAAM,CAAC,IAAI,KAAK,IAAI,IAAI,IAAI,IAAI,MAAM,CAAC,IAAI;YAAE,OAAO,EAAE,GAAG,EAAE,WAAW,KAAK,CAAC,SAAS,EAAE,EAAE,IAAI,EAAE,CAAC;QACrH,MAAM;IACR,CAAC;IACD,OAAO,MAAM,CAAC;AAChB,CAAC"}
|
|
@@ -0,0 +1,16 @@
|
|
|
1
|
+
import type { MarkdownFileMentions } from '@deepseek-ai/dsh-client-ui-primitives';
|
|
2
|
+
/** Native Think is literal text, not Markdown. Spans never alter its bytes. */
|
|
3
|
+
export declare function MotionPlainText({ text, enabled, revision }: {
|
|
4
|
+
text: string;
|
|
5
|
+
enabled: boolean;
|
|
6
|
+
revision: number;
|
|
7
|
+
}): import("react").JSX.Element;
|
|
8
|
+
/** Native DSH Markdown semantics with a stable text-leaf animation hook. */
|
|
9
|
+
export declare function MotionMarkdown({ text, streaming, enabled, revision, fileMentions }: {
|
|
10
|
+
text: string;
|
|
11
|
+
streaming: boolean;
|
|
12
|
+
enabled: boolean;
|
|
13
|
+
revision: number;
|
|
14
|
+
fileMentions?: MarkdownFileMentions;
|
|
15
|
+
}): import("react").JSX.Element;
|
|
16
|
+
//# sourceMappingURL=word-motion.d.ts.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"word-motion.d.ts","sourceRoot":"","sources":["../../../src/client/word-motion.tsx"],"names":[],"mappings":"AAEA,OAAO,KAAK,EAAE,oBAAoB,EAAE,MAAM,uCAAuC,CAAC;AAkDlF,+EAA+E;AAC/E,wBAAgB,eAAe,CAAC,EAAE,IAAI,EAAE,OAAO,EAAE,QAAQ,EAAE,EAAE;IAAE,IAAI,EAAE,MAAM,CAAC;IAAC,OAAO,EAAE,OAAO,CAAC;IAAC,QAAQ,EAAE,MAAM,CAAA;CAAE,+BAYhH;AAED,4EAA4E;AAC5E,wBAAgB,cAAc,CAAC,EAAE,IAAI,EAAE,SAAS,EAAE,OAAO,EAAE,QAAQ,EAAE,YAAY,EAAE,EAAE;IACnF,IAAI,EAAE,MAAM,CAAC;IAAC,SAAS,EAAE,OAAO,CAAC;IAAC,OAAO,EAAE,OAAO,CAAC;IAAC,QAAQ,EAAE,MAAM,CAAC;IAAC,YAAY,CAAC,EAAE,oBAAoB,CAAC;CAC3G,+BAoBA"}
|
|
@@ -0,0 +1,89 @@
|
|
|
1
|
+
import { jsx as _jsx } from "react/jsx-runtime";
|
|
2
|
+
import { createContext, useContext, useLayoutEffect, useMemo, useRef } from 'react';
|
|
3
|
+
import { MarkdownText } from './markdown/MarkdownText.js';
|
|
4
|
+
import { WORD_MOTION, WordTimeline } from './word-timeline.js';
|
|
5
|
+
import css from './Reader.module.css';
|
|
6
|
+
const WordScope = createContext({ enabled: false, generation: 0 });
|
|
7
|
+
const CODE_LABELS = { copyLabel: '复制代码', copiedLabel: '已复制' };
|
|
8
|
+
function useSourceReveal(element, born, generation) {
|
|
9
|
+
const scope = useContext(WordScope);
|
|
10
|
+
const cancelled = useRef(false);
|
|
11
|
+
useLayoutEffect(() => {
|
|
12
|
+
const target = element.current;
|
|
13
|
+
if (!target)
|
|
14
|
+
return;
|
|
15
|
+
target.dataset.wordState = 'settled';
|
|
16
|
+
if (!scope.enabled || scope.generation !== generation) {
|
|
17
|
+
cancelled.current = true;
|
|
18
|
+
return;
|
|
19
|
+
}
|
|
20
|
+
if (cancelled.current || born === null || document.hidden)
|
|
21
|
+
return;
|
|
22
|
+
const age = Number(document.timeline.currentTime ?? performance.now()) - born;
|
|
23
|
+
if (age >= WORD_MOTION.duration || typeof target.animate !== 'function')
|
|
24
|
+
return;
|
|
25
|
+
// The reference opacity + blur frames, applied only to this new word.
|
|
26
|
+
// No color interpolation, stylesheet mutation, or whole-paragraph wipe.
|
|
27
|
+
const animation = target.animate([
|
|
28
|
+
{ opacity: 0, filter: `blur(${WORD_MOTION.blur}px)` },
|
|
29
|
+
{ opacity: 1, filter: 'blur(0px)' },
|
|
30
|
+
], { duration: WORD_MOTION.duration, easing: WORD_MOTION.easing, fill: 'backwards' });
|
|
31
|
+
// One absolute clock prevents newly mounted/resegmented leaves from getting
|
|
32
|
+
// a fresh delay or running ahead because their layout effects ran later.
|
|
33
|
+
animation.startTime = born;
|
|
34
|
+
target.dataset.wordState = 'resolving';
|
|
35
|
+
const finish = () => { animation.cancel(); target.dataset.wordState = 'settled'; document.removeEventListener('visibilitychange', hidden); };
|
|
36
|
+
animation.onfinish = finish;
|
|
37
|
+
const hidden = () => { if (document.hidden) {
|
|
38
|
+
cancelled.current = true;
|
|
39
|
+
finish();
|
|
40
|
+
} };
|
|
41
|
+
document.addEventListener('visibilitychange', hidden);
|
|
42
|
+
return () => { animation.cancel(); document.removeEventListener('visibilitychange', hidden); target.dataset.wordState = 'settled'; };
|
|
43
|
+
}, [element, born, generation, scope.enabled, scope.generation]);
|
|
44
|
+
}
|
|
45
|
+
function Word({ children, born, generation, offset, inline }) {
|
|
46
|
+
const element = useRef(null);
|
|
47
|
+
useSourceReveal(element, born, generation);
|
|
48
|
+
return _jsx("span", { ref: element, className: inline ? css.streamInlineWord : css.streamWord, "data-reader-word": true, "data-source-start": offset, "data-source-birth": born ?? undefined, children: children });
|
|
49
|
+
}
|
|
50
|
+
/** A native code block enters on the same clock, without rebuilding its text. */
|
|
51
|
+
function MotionAtom({ children, born, generation, offset }) {
|
|
52
|
+
const element = useRef(null);
|
|
53
|
+
useSourceReveal(element, born, generation);
|
|
54
|
+
return _jsx("div", { ref: element, className: css.streamAtom, "data-reader-atom": true, "data-source-start": offset, "data-source-birth": born ?? undefined, children: children });
|
|
55
|
+
}
|
|
56
|
+
/** Native Think is literal text, not Markdown. Spans never alter its bytes. */
|
|
57
|
+
export function MotionPlainText({ text, enabled, revision }) {
|
|
58
|
+
const timeline = useRef();
|
|
59
|
+
timeline.current ??= new WordTimeline();
|
|
60
|
+
timeline.current.begin(text, enabled, revision, Number(document.timeline.currentTime ?? performance.now()));
|
|
61
|
+
const current = timeline.current;
|
|
62
|
+
const generation = current.generation;
|
|
63
|
+
const scope = useMemo(() => ({ enabled, generation }), [enabled, generation]);
|
|
64
|
+
return _jsx(WordScope.Provider, { value: scope, children: _jsx("div", { className: css.reasonPlain, children: current.hasLiveText ? current.words(text, 0).map(word => word.text.trim()
|
|
65
|
+
? _jsx(Word, { born: word.born, generation: generation, offset: word.key, inline: true, children: word.text }, word.key)
|
|
66
|
+
: word.text) : text }) });
|
|
67
|
+
}
|
|
68
|
+
/** Native DSH Markdown semantics with a stable text-leaf animation hook. */
|
|
69
|
+
export function MotionMarkdown({ text, streaming, enabled, revision, fileMentions }) {
|
|
70
|
+
const timeline = useRef();
|
|
71
|
+
timeline.current ??= new WordTimeline();
|
|
72
|
+
timeline.current.begin(text, enabled, revision, Number(document.timeline.currentTime ?? performance.now()));
|
|
73
|
+
const generation = timeline.current.generation;
|
|
74
|
+
const scope = useMemo(() => ({ enabled, generation }), [enabled, generation]);
|
|
75
|
+
const renderText = useMemo(() => (value, offset, inline = false) => {
|
|
76
|
+
const current = timeline.current;
|
|
77
|
+
if (!current.hasLiveText)
|
|
78
|
+
return value;
|
|
79
|
+
return current.words(value, offset).map(word => word.text.trim()
|
|
80
|
+
? _jsx(Word, { born: word.born, generation: current.generation, offset: word.key, inline: inline || /^\p{P}+$/u.test(word.text), children: word.text }, word.key)
|
|
81
|
+
: word.text);
|
|
82
|
+
}, []);
|
|
83
|
+
const renderAtom = useMemo(() => (children, offset) => {
|
|
84
|
+
const current = timeline.current;
|
|
85
|
+
return current.hasLiveText ? _jsx(MotionAtom, { born: current.bornAt(offset), generation: current.generation, offset: offset, children: children }) : children;
|
|
86
|
+
}, []);
|
|
87
|
+
return _jsx(WordScope.Provider, { value: scope, children: _jsx(MarkdownText, { text: text, streaming: streaming, codeLabels: CODE_LABELS, fileMentions: fileMentions, renderText: renderText, renderAtom: renderAtom }) });
|
|
88
|
+
}
|
|
89
|
+
//# sourceMappingURL=word-motion.js.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"word-motion.js","sourceRoot":"","sources":["../../../src/client/word-motion.tsx"],"names":[],"mappings":"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"}
|
|
@@ -0,0 +1,28 @@
|
|
|
1
|
+
/** Motion parameters from the public transitions.dev streaming-text recipe. */
|
|
2
|
+
export declare const WORD_MOTION: {
|
|
3
|
+
readonly duration: 350;
|
|
4
|
+
readonly gap: 60;
|
|
5
|
+
readonly blur: 1;
|
|
6
|
+
readonly easing: "cubic-bezier(0.22, 1, 0.36, 1)";
|
|
7
|
+
readonly maxDelay: 240;
|
|
8
|
+
};
|
|
9
|
+
export interface RevealingWord {
|
|
10
|
+
key: number;
|
|
11
|
+
text: string;
|
|
12
|
+
born: number | null;
|
|
13
|
+
}
|
|
14
|
+
/** Source-offset identity survives reparsing, frozen blocks, and final formatting. */
|
|
15
|
+
export declare class WordTimeline {
|
|
16
|
+
generation: number;
|
|
17
|
+
hasLiveText: boolean;
|
|
18
|
+
private source;
|
|
19
|
+
private enabled;
|
|
20
|
+
private revision;
|
|
21
|
+
private floor;
|
|
22
|
+
private lastBirth;
|
|
23
|
+
private readonly births;
|
|
24
|
+
begin(source: string, enabled: boolean, revision: number, now: number): void;
|
|
25
|
+
bornAt(offset: number): number | null;
|
|
26
|
+
words(value: string, offset: number): RevealingWord[];
|
|
27
|
+
}
|
|
28
|
+
//# sourceMappingURL=word-timeline.d.ts.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"word-timeline.d.ts","sourceRoot":"","sources":["../../../src/client/word-timeline.ts"],"names":[],"mappings":"AAAA,+EAA+E;AAC/E,eAAO,MAAM,WAAW;;;;;;CAMd,CAAC;AAKX,MAAM,WAAW,aAAa;IAAG,GAAG,EAAE,MAAM,CAAC;IAAC,IAAI,EAAE,MAAM,CAAC;IAAC,IAAI,EAAE,MAAM,GAAG,IAAI,CAAA;CAAE;AAGjF,sFAAsF;AACtF,qBAAa,YAAY;IACvB,UAAU,SAAK;IACf,WAAW,UAAS;IACpB,OAAO,CAAC,MAAM,CAAuB;IACrC,OAAO,CAAC,OAAO,CAAS;IACxB,OAAO,CAAC,QAAQ,CAAK;IACrB,OAAO,CAAC,KAAK,CAAK;IAClB,OAAO,CAAC,SAAS,CAAa;IAC9B,OAAO,CAAC,QAAQ,CAAC,MAAM,CAAqB;IAE5C,KAAK,CAAC,MAAM,EAAE,MAAM,EAAE,OAAO,EAAE,OAAO,EAAE,QAAQ,EAAE,MAAM,EAAE,GAAG,EAAE,MAAM,GAAG,IAAI;IAkC5E,MAAM,CAAC,MAAM,EAAE,MAAM,GAAG,MAAM,GAAG,IAAI;IAYrC,KAAK,CAAC,KAAK,EAAE,MAAM,EAAE,MAAM,EAAE,MAAM,GAAG,aAAa,EAAE;CAuBtD"}
|
|
@@ -0,0 +1,100 @@
|
|
|
1
|
+
/** Motion parameters from the public transitions.dev streaming-text recipe. */
|
|
2
|
+
export const WORD_MOTION = {
|
|
3
|
+
duration: 350,
|
|
4
|
+
gap: 60,
|
|
5
|
+
blur: 1,
|
|
6
|
+
easing: 'cubic-bezier(0.22, 1, 0.36, 1)',
|
|
7
|
+
maxDelay: 240,
|
|
8
|
+
};
|
|
9
|
+
const segmenter = new Intl.Segmenter(undefined, { granularity: 'word' });
|
|
10
|
+
const closingPunctuation = /^[\p{Pe}\p{Pf},.!?:;,。!?、;:%‰…·]+$/u;
|
|
11
|
+
const openingPunctuation = /^[\p{Ps}\p{Pi}]+$/u;
|
|
12
|
+
/** Source-offset identity survives reparsing, frozen blocks, and final formatting. */
|
|
13
|
+
export class WordTimeline {
|
|
14
|
+
generation = 0;
|
|
15
|
+
hasLiveText = false;
|
|
16
|
+
source = null;
|
|
17
|
+
enabled = false;
|
|
18
|
+
revision = 0;
|
|
19
|
+
floor = 0;
|
|
20
|
+
lastBirth = -Infinity;
|
|
21
|
+
births = [];
|
|
22
|
+
begin(source, enabled, revision, now) {
|
|
23
|
+
if (this.source === source && this.enabled === enabled && this.revision === revision)
|
|
24
|
+
return;
|
|
25
|
+
const replaced = revision !== this.revision || (this.source !== null && !source.startsWith(this.source));
|
|
26
|
+
if (replaced || !enabled) {
|
|
27
|
+
this.births.length = 0;
|
|
28
|
+
this.lastBirth = -Infinity;
|
|
29
|
+
this.generation++;
|
|
30
|
+
this.floor = source.length;
|
|
31
|
+
}
|
|
32
|
+
else if (this.source === null) {
|
|
33
|
+
// A mounted historical prefix must not replay; a fresh live buffer mounts empty.
|
|
34
|
+
this.floor = source.length;
|
|
35
|
+
}
|
|
36
|
+
else {
|
|
37
|
+
// Allocate in source order, before Markdown can split/reorder text leaves.
|
|
38
|
+
// Intervals cover every offset, so resegmented CJK words inherit the time
|
|
39
|
+
// of their characters rather than falling through as instant "history".
|
|
40
|
+
const from = this.source.length;
|
|
41
|
+
for (const part of segmenter.segment(source.slice(from))) {
|
|
42
|
+
let born = Number.isFinite(this.lastBirth) ? this.lastBirth : null;
|
|
43
|
+
if (part.segment.trim()) {
|
|
44
|
+
born = Math.min(now + WORD_MOTION.maxDelay, Math.max(now, this.lastBirth + WORD_MOTION.gap));
|
|
45
|
+
this.lastBirth = born;
|
|
46
|
+
}
|
|
47
|
+
const end = from + part.index + part.segment.length;
|
|
48
|
+
const previous = this.births.at(-1);
|
|
49
|
+
if (previous && previous.born === born)
|
|
50
|
+
previous.end = end;
|
|
51
|
+
else
|
|
52
|
+
this.births.push({ end, born });
|
|
53
|
+
}
|
|
54
|
+
}
|
|
55
|
+
this.source = source;
|
|
56
|
+
this.enabled = enabled;
|
|
57
|
+
this.revision = revision;
|
|
58
|
+
this.hasLiveText = enabled && this.births.length > 0;
|
|
59
|
+
}
|
|
60
|
+
bornAt(offset) {
|
|
61
|
+
if (!this.enabled || offset < this.floor || this.births.length === 0)
|
|
62
|
+
return null;
|
|
63
|
+
let low = 0;
|
|
64
|
+
let high = this.births.length - 1;
|
|
65
|
+
while (low < high) {
|
|
66
|
+
const middle = (low + high) >>> 1;
|
|
67
|
+
if (this.births[middle].end <= offset)
|
|
68
|
+
low = middle + 1;
|
|
69
|
+
else
|
|
70
|
+
high = middle;
|
|
71
|
+
}
|
|
72
|
+
return this.births[low].born;
|
|
73
|
+
}
|
|
74
|
+
words(value, offset) {
|
|
75
|
+
// Atomic inline animation boxes must not turn commas into legal line starts
|
|
76
|
+
// or strand opening quotes at a line end. Keep source-offset identities when
|
|
77
|
+
// punctuation arrives in a later chunk, so the preceding word never replays.
|
|
78
|
+
// Already received text is one inert leaf, not thousands of React Words.
|
|
79
|
+
// Only the newly appended suffix needs word identities and birth times.
|
|
80
|
+
const prefixLength = Math.min(value.length, Math.max(0, this.floor - offset));
|
|
81
|
+
const prefix = prefixLength > 0
|
|
82
|
+
? [{ key: offset, text: value.slice(0, prefixLength), born: null }]
|
|
83
|
+
: [];
|
|
84
|
+
const parts = [];
|
|
85
|
+
for (const segment of segmenter.segment(value.slice(prefixLength))) {
|
|
86
|
+
const part = { index: prefixLength + segment.index, segment: segment.segment };
|
|
87
|
+
const previous = parts.at(-1);
|
|
88
|
+
if (previous?.segment.trim() && (closingPunctuation.test(part.segment) || openingPunctuation.test(previous.segment))) {
|
|
89
|
+
previous.segment += part.segment;
|
|
90
|
+
}
|
|
91
|
+
else
|
|
92
|
+
parts.push({ index: part.index, segment: part.segment });
|
|
93
|
+
}
|
|
94
|
+
return prefix.concat(parts.map(part => {
|
|
95
|
+
const key = offset + part.index;
|
|
96
|
+
return { key, text: part.segment, born: this.bornAt(key) };
|
|
97
|
+
}));
|
|
98
|
+
}
|
|
99
|
+
}
|
|
100
|
+
//# sourceMappingURL=word-timeline.js.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"word-timeline.js","sourceRoot":"","sources":["../../../src/client/word-timeline.ts"],"names":[],"mappings":"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"}
|
|
@@ -0,0 +1,17 @@
|
|
|
1
|
+
import type { IncomingMessage, ServerResponse } from 'node:http';
|
|
2
|
+
import type { Context } from '@deepseek-ai/cordis';
|
|
3
|
+
declare module '@deepseek-ai/cordis' {
|
|
4
|
+
interface Context {
|
|
5
|
+
webServer?: {
|
|
6
|
+
register: (route: {
|
|
7
|
+
kind: 'exact' | 'prefix';
|
|
8
|
+
path: string;
|
|
9
|
+
handler: (req: IncomingMessage, res: ServerResponse) => void | Promise<void>;
|
|
10
|
+
}) => () => void;
|
|
11
|
+
};
|
|
12
|
+
}
|
|
13
|
+
}
|
|
14
|
+
export declare const name = "dsh-better-display";
|
|
15
|
+
export declare const inject: string[];
|
|
16
|
+
export declare function apply(ctx: Context): void;
|
|
17
|
+
//# sourceMappingURL=dsh-better-display.d.ts.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"dsh-better-display.d.ts","sourceRoot":"","sources":["../../src/dsh-better-display.ts"],"names":[],"mappings":"AACA,OAAO,KAAK,EAAE,eAAe,EAAE,cAAc,EAAE,MAAM,WAAW,CAAC;AACjE,OAAO,KAAK,EAAE,OAAO,EAAE,MAAM,qBAAqB,CAAC;AAEnD,OAAO,QAAQ,qBAAqB,CAAC;IACnC,UAAU,OAAO;QACf,SAAS,CAAC,EAAE;YACV,QAAQ,EAAE,CAAC,KAAK,EAAE;gBAChB,IAAI,EAAE,OAAO,GAAG,QAAQ,CAAC;gBACzB,IAAI,EAAE,MAAM,CAAC;gBACb,OAAO,EAAE,CAAC,GAAG,EAAE,eAAe,EAAE,GAAG,EAAE,cAAc,KAAK,IAAI,GAAG,OAAO,CAAC,IAAI,CAAC,CAAC;aAC9E,KAAK,MAAM,IAAI,CAAC;SAClB,CAAC;KACH;CACF;AAED,eAAO,MAAM,IAAI,uBAAuB,CAAC;AACzC,eAAO,MAAM,MAAM,UAAgB,CAAC;AAEpC,wBAAgB,KAAK,CAAC,GAAG,EAAE,OAAO,GAAG,IAAI,CAgDxC"}
|
|
@@ -0,0 +1,53 @@
|
|
|
1
|
+
import { spawn } from 'node:child_process';
|
|
2
|
+
export const name = 'dsh-better-display';
|
|
3
|
+
export const inject = ['webServer'];
|
|
4
|
+
export function apply(ctx) {
|
|
5
|
+
console.log('[my-plugins/dsh-better-display] loaded');
|
|
6
|
+
if (ctx.webServer) {
|
|
7
|
+
ctx.effect(() => {
|
|
8
|
+
return ctx.webServer.register({
|
|
9
|
+
kind: 'exact',
|
|
10
|
+
path: '/better-display/reveal',
|
|
11
|
+
handler: async (req, res) => {
|
|
12
|
+
if (req.method !== 'POST') {
|
|
13
|
+
res.statusCode = 405;
|
|
14
|
+
res.end();
|
|
15
|
+
return;
|
|
16
|
+
}
|
|
17
|
+
let body = '';
|
|
18
|
+
req.on('data', chunk => { body += chunk; });
|
|
19
|
+
req.on('end', () => {
|
|
20
|
+
try {
|
|
21
|
+
const data = JSON.parse(body);
|
|
22
|
+
const targetPath = typeof data.path === 'string' ? data.path.trim() : '';
|
|
23
|
+
if (!targetPath) {
|
|
24
|
+
res.statusCode = 400;
|
|
25
|
+
res.end(JSON.stringify({ ok: false, error: 'Empty path' }));
|
|
26
|
+
return;
|
|
27
|
+
}
|
|
28
|
+
if (process.platform === 'darwin') {
|
|
29
|
+
// Exact file reveal in macOS Finder with selection highlight
|
|
30
|
+
spawn('open', ['-R', targetPath], { detached: true, stdio: 'ignore' });
|
|
31
|
+
}
|
|
32
|
+
else if (process.platform === 'win32') {
|
|
33
|
+
// Exact file selection in Windows Explorer
|
|
34
|
+
spawn('explorer.exe', [`/select,${targetPath}`], { detached: true, stdio: 'ignore' });
|
|
35
|
+
}
|
|
36
|
+
else {
|
|
37
|
+
spawn('xdg-open', [targetPath], { detached: true, stdio: 'ignore' });
|
|
38
|
+
}
|
|
39
|
+
res.setHeader('Content-Type', 'application/json');
|
|
40
|
+
res.statusCode = 200;
|
|
41
|
+
res.end(JSON.stringify({ ok: true }));
|
|
42
|
+
}
|
|
43
|
+
catch (err) {
|
|
44
|
+
res.statusCode = 400;
|
|
45
|
+
res.end(JSON.stringify({ ok: false, error: String(err) }));
|
|
46
|
+
}
|
|
47
|
+
});
|
|
48
|
+
},
|
|
49
|
+
});
|
|
50
|
+
}, 'dsh-better-display: /api/better-display/reveal route');
|
|
51
|
+
}
|
|
52
|
+
}
|
|
53
|
+
//# sourceMappingURL=dsh-better-display.js.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"dsh-better-display.js","sourceRoot":"","sources":["../../src/dsh-better-display.ts"],"names":[],"mappings":"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"}
|
package/package.json
ADDED
|
@@ -0,0 +1,121 @@
|
|
|
1
|
+
{
|
|
2
|
+
"name": "dsh-better-display",
|
|
3
|
+
"version": "0.1.1",
|
|
4
|
+
"description": "A calmer reading view for DeepSeek Harness: native process details, live reasoning, and clean final answers.",
|
|
5
|
+
"type": "module",
|
|
6
|
+
"license": "MIT",
|
|
7
|
+
"main": "lib/dsh-better-display.js",
|
|
8
|
+
"types": "lib/types/dsh-better-display.d.ts",
|
|
9
|
+
"exports": {
|
|
10
|
+
".": {
|
|
11
|
+
"types": "./lib/types/dsh-better-display.d.ts",
|
|
12
|
+
"default": "./lib/dsh-better-display.js"
|
|
13
|
+
},
|
|
14
|
+
"./client": {
|
|
15
|
+
"types": "./lib/types/client/index.d.ts",
|
|
16
|
+
"default": "./lib/client.js"
|
|
17
|
+
},
|
|
18
|
+
"./package.json": "./package.json"
|
|
19
|
+
},
|
|
20
|
+
"dsh": {
|
|
21
|
+
"bundle": {
|
|
22
|
+
"patch": "./cordis.patch.yml"
|
|
23
|
+
},
|
|
24
|
+
"client": {
|
|
25
|
+
"platform": "web",
|
|
26
|
+
"inject": [
|
|
27
|
+
"@deepseek-ai/dsh-api-session-controller",
|
|
28
|
+
"@deepseek-ai/dsh-client-ui-chat",
|
|
29
|
+
"@deepseek-ai/dsh-client-ui-conversation",
|
|
30
|
+
"@deepseek-ai/dsh-client-ui-renderer",
|
|
31
|
+
"@deepseek-ai/dsh-client-ui-session"
|
|
32
|
+
]
|
|
33
|
+
}
|
|
34
|
+
},
|
|
35
|
+
"scripts": {
|
|
36
|
+
"build": "tsc -p tsconfig.json && tsdown",
|
|
37
|
+
"typecheck": "tsc -p tsconfig.json --noEmit",
|
|
38
|
+
"test": "node --import tsx/esm --test tests/*.test.ts",
|
|
39
|
+
"link:harness": "node scripts/link-harness-dependencies.mjs"
|
|
40
|
+
},
|
|
41
|
+
"peerDependencies": {
|
|
42
|
+
"@deepseek-ai/cordis": "^4.0.2",
|
|
43
|
+
"@deepseek-ai/dsh-api-session-controller": "^0.1.2-rc.1",
|
|
44
|
+
"@deepseek-ai/dsh-attachment": "^0.1.2-rc.1",
|
|
45
|
+
"@deepseek-ai/dsh-client-store": "^0.1.2-rc.1",
|
|
46
|
+
"@deepseek-ai/dsh-client-ui-chat": "^0.1.2-rc.1",
|
|
47
|
+
"@deepseek-ai/dsh-client-ui-conversation": "^0.1.2-rc.1",
|
|
48
|
+
"@deepseek-ai/dsh-client-ui-primitives": "^0.1.2-rc.1",
|
|
49
|
+
"@deepseek-ai/dsh-client-ui-renderer": "^0.1.2-rc.1",
|
|
50
|
+
"@deepseek-ai/dsh-client-ui-session": "^0.1.2-rc.1",
|
|
51
|
+
"@deepseek-ai/dsh-client-ui-slots": "^0.1.2-rc.1",
|
|
52
|
+
"@deepseek-ai/dsh-session": "^0.1.2-rc.1",
|
|
53
|
+
"@deepseek-ai/dsh-util-workspace-path": "^0.1.2-rc.1",
|
|
54
|
+
"react": "^18.2.0"
|
|
55
|
+
},
|
|
56
|
+
"devDependencies": {
|
|
57
|
+
"@deepseek-ai/dsh-api-session-controller": "0.1.2-rc.1",
|
|
58
|
+
"@deepseek-ai/dsh-session-turn-outline": "0.1.2-rc.1",
|
|
59
|
+
"@types/mdast": "^4.0.4",
|
|
60
|
+
"@types/node": "^22.20.0",
|
|
61
|
+
"@types/react": "~18.3.1",
|
|
62
|
+
"tsdown": "^0.22.2",
|
|
63
|
+
"tsx": "^4.22.4",
|
|
64
|
+
"typescript": "^6.0.3"
|
|
65
|
+
},
|
|
66
|
+
"dependencies": {
|
|
67
|
+
"clsx": "^2.0.0",
|
|
68
|
+
"katex": "^0.16.47",
|
|
69
|
+
"mdast-util-from-markdown": "^2.0.3",
|
|
70
|
+
"mdast-util-gfm": "^3.1.0",
|
|
71
|
+
"mdast-util-math": "^3.0.0",
|
|
72
|
+
"micromark-core-commonmark": "^2.0.3",
|
|
73
|
+
"micromark-extension-gfm": "^3.0.0",
|
|
74
|
+
"micromark-extension-math": "^3.1.0",
|
|
75
|
+
"micromark-factory-space": "^2.0.1",
|
|
76
|
+
"micromark-util-character": "^2.1.1",
|
|
77
|
+
"micromark-util-classify-character": "^2.0.1",
|
|
78
|
+
"micromark-util-sanitize-uri": "^2.0.1",
|
|
79
|
+
"micromark-util-symbol": "^2.0.1",
|
|
80
|
+
"micromark-util-types": "^2.0.2"
|
|
81
|
+
},
|
|
82
|
+
"files": [
|
|
83
|
+
"lib",
|
|
84
|
+
"skills",
|
|
85
|
+
"src",
|
|
86
|
+
"tests",
|
|
87
|
+
"scripts",
|
|
88
|
+
"cordis.yml",
|
|
89
|
+
"cordis.patch.yml",
|
|
90
|
+
"dshx.yml",
|
|
91
|
+
"tsconfig.json",
|
|
92
|
+
"tsdown.config.ts",
|
|
93
|
+
"README.md",
|
|
94
|
+
"README.en.md",
|
|
95
|
+
"DESIGN.md",
|
|
96
|
+
"LICENSE",
|
|
97
|
+
"THIRD_PARTY_NOTICES.md",
|
|
98
|
+
"CHANGELOG.md"
|
|
99
|
+
],
|
|
100
|
+
"engines": {
|
|
101
|
+
"node": "^22.19.0 || >=24.0.0"
|
|
102
|
+
},
|
|
103
|
+
"repository": {
|
|
104
|
+
"type": "git",
|
|
105
|
+
"url": "git+https://github.com/aa2246740/dsh-better-display.git"
|
|
106
|
+
},
|
|
107
|
+
"homepage": "https://github.com/aa2246740/dsh-better-display#readme",
|
|
108
|
+
"bugs": {
|
|
109
|
+
"url": "https://github.com/aa2246740/dsh-better-display/issues"
|
|
110
|
+
},
|
|
111
|
+
"keywords": [
|
|
112
|
+
"deepseek-harness",
|
|
113
|
+
"dsh",
|
|
114
|
+
"dsh-plugin",
|
|
115
|
+
"dshx",
|
|
116
|
+
"conversation",
|
|
117
|
+
"reasoning",
|
|
118
|
+
"streaming",
|
|
119
|
+
"accessibility"
|
|
120
|
+
]
|
|
121
|
+
}
|
|
@@ -0,0 +1,26 @@
|
|
|
1
|
+
import { createRequire } from 'node:module';
|
|
2
|
+
import { readFile, writeFile, mkdir } from 'node:fs/promises';
|
|
3
|
+
import { resolve } from 'node:path';
|
|
4
|
+
import { pathToFileURL } from 'node:url';
|
|
5
|
+
const require = createRequire(import.meta.url);
|
|
6
|
+
const deps = createRequire(require.resolve('tsdown'));
|
|
7
|
+
const { rolldown } = await import(pathToFileURL(deps.resolve('rolldown')).href);
|
|
8
|
+
const { transform } = deps('lightningcss');
|
|
9
|
+
const build = await rolldown({ input: process.argv[2] ?? 'tests/browser-motion.tsx', platform: 'browser', transform: { jsx: { runtime: 'automatic' }, define: { 'process.env.NODE_ENV': JSON.stringify('production') } }, plugins: [{
|
|
10
|
+
name: 'fixture-css',
|
|
11
|
+
resolveId(source, importer) { if (source.endsWith('.module.css')) return resolve(importer ? resolve(importer,'..') : '.',source) + '.mjs'; },
|
|
12
|
+
async load(id) {
|
|
13
|
+
if (!id.endsWith('.module.css.mjs')) return;
|
|
14
|
+
const path = id.slice(0, -4);
|
|
15
|
+
const {code,exports} = transform({filename:path,code:await readFile(path),cssModules:{pattern:'[hash]_[local]'}});
|
|
16
|
+
const map=Object.fromEntries(Object.entries(exports).map(([key,value])=>[key,value.name]));
|
|
17
|
+
return `const style=document.createElement('style');style.textContent=${JSON.stringify(code.toString())};document.head.append(style);export default ${JSON.stringify(map)};`;
|
|
18
|
+
},
|
|
19
|
+
}] });
|
|
20
|
+
await mkdir('.delivery',{recursive:true});
|
|
21
|
+
const result = await build.generate({ format:'iife', name:'ReaderMotionFixture' });
|
|
22
|
+
const js=result.output.find(x=>x.type==='chunk').code;
|
|
23
|
+
await writeFile('.delivery/motion-fixture.js',js);
|
|
24
|
+
await writeFile('.delivery/motion-fixture.html',`<!doctype html><meta charset="utf-8"><meta name="viewport" content="width=device-width, initial-scale=1"><title>Reader transition verification</title><style>body{margin:0;font:16px/1.75 system-ui;background:#fff;color:#242424;--dsw-alias-label-primary:#242424;--dsw-alias-label-secondary:#666;--dsw-alias-label-tertiary:#888;--dsw-alias-bg-base:#fff;--dsw-alias-bg-module-platform:#f6f7f8;--dsw-alias-border-l2:#dedede}button{cursor:pointer}</style><div id="app"></div><script>${js.replaceAll('</script','<\\/script')}</script>`);
|
|
25
|
+
await build.close();
|
|
26
|
+
console.log('Built .delivery/motion-fixture.html using actual plugin components');
|
|
@@ -0,0 +1,51 @@
|
|
|
1
|
+
import { existsSync, mkdirSync, symlinkSync, realpathSync, readFileSync } from 'node:fs';
|
|
2
|
+
import { dirname, join, resolve } from 'node:path';
|
|
3
|
+
import { createRequire } from 'node:module';
|
|
4
|
+
|
|
5
|
+
const root = resolve(process.argv[2] || '');
|
|
6
|
+
if (!process.argv[2] || !existsSync(join(root, 'tools/dshx/src/client-build.js'))) throw new Error('Pass a prepared Harness checkout.');
|
|
7
|
+
const local = resolve('node_modules');
|
|
8
|
+
mkdirSync(local, { recursive: true });
|
|
9
|
+
const shared = {
|
|
10
|
+
'@deepseek-ai/cordis': 'vendor/cordis',
|
|
11
|
+
'@deepseek-ai/dsh-api-session-controller': 'packages/api/session-controller',
|
|
12
|
+
'@deepseek-ai/dsh-session-turn-outline': 'packages/session/session-turn-outline',
|
|
13
|
+
'@deepseek-ai/dsh-client-store': 'packages/client/store',
|
|
14
|
+
'@deepseek-ai/dsh-client-ui-chat': 'packages/client/ui-chat',
|
|
15
|
+
'@deepseek-ai/dsh-client-ui-conversation': 'packages/client/ui-conversation',
|
|
16
|
+
'@deepseek-ai/dsh-client-ui-primitives': 'packages/client/ui-primitives',
|
|
17
|
+
'@deepseek-ai/dsh-client-ui-renderer': 'packages/client/ui-renderer',
|
|
18
|
+
'@deepseek-ai/dsh-client-ui-session': 'packages/client/ui-session',
|
|
19
|
+
'@deepseek-ai/dsh-client-ui-slots': 'packages/client/ui-slots',
|
|
20
|
+
'@deepseek-ai/dsh-attachment': 'packages/attachment/attachment',
|
|
21
|
+
'@deepseek-ai/dsh-session': 'packages/core/session',
|
|
22
|
+
'@deepseek-ai/dsh-util-workspace-path': 'packages/util/workspace-path',
|
|
23
|
+
};
|
|
24
|
+
function link(name, target) {
|
|
25
|
+
if (!existsSync(target)) throw new Error(`Missing Harness dependency target: ${name} (${target})`);
|
|
26
|
+
const destination = join(local, name);
|
|
27
|
+
mkdirSync(dirname(destination), { recursive: true });
|
|
28
|
+
if (existsSync(destination)) {
|
|
29
|
+
if (realpathSync(destination) !== realpathSync(target)) throw new Error(`Dependency mismatch: ${name}`);
|
|
30
|
+
return;
|
|
31
|
+
}
|
|
32
|
+
symlinkSync(target, destination);
|
|
33
|
+
}
|
|
34
|
+
for (const [name, path] of Object.entries(shared)) link(name, join(root, path));
|
|
35
|
+
const require = createRequire(join(root, 'packages/client/ui-conversation/package.json'));
|
|
36
|
+
const rootRequire = createRequire(join(root, 'package.json'));
|
|
37
|
+
for (const name of ['react', '@types/react']) link(name, dirname(require.resolve(`${name}/package.json`)));
|
|
38
|
+
for (const name of ['@types/node', 'typescript', 'tsdown', 'tsx']) link(name, dirname(rootRequire.resolve(`${name}/package.json`)));
|
|
39
|
+
for (const name of ['@types/mdast', 'clsx', 'katex', 'mdast-util-from-markdown', 'mdast-util-gfm', 'mdast-util-math', 'micromark-core-commonmark', 'micromark-extension-gfm', 'micromark-extension-math', 'micromark-factory-space', 'micromark-util-character', 'micromark-util-classify-character', 'micromark-util-sanitize-uri', 'micromark-util-symbol', 'micromark-util-types']) {
|
|
40
|
+
link(name, join(root, 'packages/client/ui-primitives/node_modules', name));
|
|
41
|
+
}
|
|
42
|
+
mkdirSync(join(local, '.bin'), { recursive: true });
|
|
43
|
+
for (const name of ['typescript', 'tsdown']) {
|
|
44
|
+
const pkg = JSON.parse(readFileSync(join(local, name, 'package.json'), 'utf8'));
|
|
45
|
+
const bins = typeof pkg.bin === 'string' ? { [name]: pkg.bin } : pkg.bin;
|
|
46
|
+
for (const [command, path] of Object.entries(bins)) {
|
|
47
|
+
const target = join(local, '.bin', command);
|
|
48
|
+
if (!existsSync(target)) symlinkSync(join(local, name, path), target);
|
|
49
|
+
}
|
|
50
|
+
}
|
|
51
|
+
console.log('Development dependencies linked to the selected Harness; no package download or Harness mutation.');
|