dsh-plugin-core 0.25.0 → 0.27.0
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/dist/session/SessionViewModal.d.ts.map +1 -1
- package/dist/session/SessionViewModal.js +54 -17
- package/dist/session/SessionViewModal.js.map +1 -1
- package/dist/session/mirror/ChatView.d.ts.map +1 -1
- package/dist/session/mirror/ChatView.js +9 -1
- package/dist/session/mirror/ChatView.js.map +1 -1
- package/dist/session/mirror/Deliverables.d.ts.map +1 -1
- package/dist/session/mirror/Deliverables.js +42 -27
- package/dist/session/mirror/Deliverables.js.map +1 -1
- package/dist/session/mirror/GenericCommandCard.d.ts.map +1 -1
- package/dist/session/mirror/GenericCommandCard.js +2 -3
- package/dist/session/mirror/GenericCommandCard.js.map +1 -1
- package/dist/session/mirror/MessageIconActions.d.ts.map +1 -1
- package/dist/session/mirror/MessageIconActions.js +3 -5
- package/dist/session/mirror/MessageIconActions.js.map +1 -1
- package/dist/session/mirror/MessageItem.d.ts +2 -0
- package/dist/session/mirror/MessageItem.d.ts.map +1 -1
- package/dist/session/mirror/MessageItem.js +22 -11
- package/dist/session/mirror/MessageItem.js.map +1 -1
- package/dist/session/mirror/ReasoningRow.d.ts.map +1 -1
- package/dist/session/mirror/ReasoningRow.js +79 -17
- package/dist/session/mirror/ReasoningRow.js.map +1 -1
- package/dist/session/mirror/RunningStatus.d.ts +12 -0
- package/dist/session/mirror/RunningStatus.d.ts.map +1 -0
- package/dist/session/mirror/RunningStatus.js +57 -0
- package/dist/session/mirror/RunningStatus.js.map +1 -0
- package/dist/session/mirror/TurnProcessNodeView.d.ts.map +1 -1
- package/dist/session/mirror/TurnProcessNodeView.js +27 -38
- package/dist/session/mirror/TurnProcessNodeView.js.map +1 -1
- package/dist/session/mirror/TurnTailNodeView.d.ts +25 -0
- package/dist/session/mirror/TurnTailNodeView.d.ts.map +1 -1
- package/dist/session/mirror/TurnTailNodeView.js +65 -7
- package/dist/session/mirror/TurnTailNodeView.js.map +1 -1
- package/dist/session/mirror/TurnTriggerNodeView.d.ts.map +1 -1
- package/dist/session/mirror/TurnTriggerNodeView.js +36 -20
- package/dist/session/mirror/TurnTriggerNodeView.js.map +1 -1
- package/dist/session/mirror/message-chrome.d.ts +10 -4
- package/dist/session/mirror/message-chrome.d.ts.map +1 -1
- package/dist/session/mirror/message-chrome.js +11 -16
- package/dist/session/mirror/message-chrome.js.map +1 -1
- package/dist/session/official-classes.d.ts.map +1 -1
- package/dist/session/official-classes.js +5 -3
- package/dist/session/official-classes.js.map +1 -1
- package/dist/ui/AlertModal.d.ts +2 -0
- package/dist/ui/AlertModal.d.ts.map +1 -1
- package/dist/ui/AlertModal.js +1 -0
- package/dist/ui/AlertModal.js.map +1 -1
- package/dist/ui/ConfirmModal.d.ts +2 -0
- package/dist/ui/ConfirmModal.d.ts.map +1 -1
- package/dist/ui/ConfirmModal.js +1 -0
- package/dist/ui/ConfirmModal.js.map +1 -1
- package/dist/ui/FlipText.d.ts +38 -0
- package/dist/ui/FlipText.d.ts.map +1 -0
- package/dist/ui/FlipText.js +58 -0
- package/dist/ui/FlipText.js.map +1 -0
- package/dist/ui/Modal.d.ts +6 -0
- package/dist/ui/Modal.d.ts.map +1 -1
- package/dist/ui/Modal.js +5 -2
- package/dist/ui/Modal.js.map +1 -1
- package/dist/ui/SideSheet.d.ts +2 -0
- package/dist/ui/SideSheet.d.ts.map +1 -1
- package/dist/ui/SideSheet.js +6 -1
- package/dist/ui/SideSheet.js.map +1 -1
- package/dist/ui/feedback-css.generated.d.ts +1 -1
- package/dist/ui/feedback-css.generated.d.ts.map +1 -1
- package/dist/ui/feedback-css.generated.js +1 -1
- package/dist/ui/feedback-css.generated.js.map +1 -1
- package/dist/ui/flip-css.d.ts +2 -0
- package/dist/ui/flip-css.d.ts.map +1 -0
- package/dist/ui/flip-css.generated.d.ts +2 -0
- package/dist/ui/flip-css.generated.d.ts.map +1 -0
- package/dist/ui/flip-css.generated.js +4 -0
- package/dist/ui/flip-css.generated.js.map +1 -0
- package/dist/ui/flip-css.js +4 -0
- package/dist/ui/flip-css.js.map +1 -0
- package/dist/ui/index.d.ts +1 -0
- package/dist/ui/index.d.ts.map +1 -1
- package/dist/ui/index.js +1 -0
- package/dist/ui/index.js.map +1 -1
- package/dist/ui/side-sheet-css.generated.d.ts +1 -1
- package/dist/ui/side-sheet-css.generated.d.ts.map +1 -1
- package/dist/ui/side-sheet-css.generated.js +1 -1
- package/dist/ui/side-sheet-css.generated.js.map +1 -1
- package/dist/utils/i18n.d.ts +1 -1
- package/dist/utils/i18n.d.ts.map +1 -1
- package/dist/utils/i18n.js +20 -14
- package/dist/utils/i18n.js.map +1 -1
- package/docs/help/ui.doc.ts +48 -1
- package/docs/help/ui.md +43 -1
- package/docs/requirements.md +10 -1
- package/package.json +1 -1
|
@@ -1,56 +1,42 @@
|
|
|
1
|
-
// 官方对照:packages/client/ui-chat
|
|
1
|
+
// 官方对照:packages/client/ui-chat@0.2.2-alpha.3 lib/client.js:8668-8730(TurnProcessNodeView)
|
|
2
2
|
// root(button,高 calc(33px + delta)、border-bottom .5px border-l2、padding 0 0 8px、flex)
|
|
3
|
-
// :disabled{cursor:default} / :not(:disabled)
|
|
4
|
-
// > label(13px,ellipsis)> chevron(14px
|
|
5
|
-
// label
|
|
6
|
-
//
|
|
7
|
-
//
|
|
8
|
-
//
|
|
9
|
-
|
|
3
|
+
// :disabled{cursor:default} / :hover:not(:disabled){color:secondary} / [data-open] 内 chevron 旋转 180°
|
|
4
|
+
// > label(13px,ellipsis)> chevron(14px,color:inherit)
|
|
5
|
+
// label:stopped(aborted/interrupted)→「已停止」;error →「处理失败」;
|
|
6
|
+
// 有时长 →「已完成,用时 」+ duration parts(数字段套 durationNumber 等宽数字);无时长 →「已完成」。
|
|
7
|
+
// ⚠ 0.2.x 起 turn 未关闭时**整块不渲染**(`turn?.status !== "closed"` return null)——
|
|
8
|
+
// 运行中的「深度求索中,用时 N 秒 ···」改由 ChatView 的 RunningStatus 在流末尾单独一行显示
|
|
9
|
+
// (见 RunningStatus.ts)。别再把 running 分支加回来,否则与官方重叠出两行。
|
|
10
|
+
import { Fragment, createElement as h } from 'react';
|
|
10
11
|
import { IconChevronDownOutlineRegular } from '../../ui/official.js';
|
|
11
12
|
import { officialClass } from '../official-classes.js';
|
|
12
|
-
import {
|
|
13
|
-
/** 官方 LIVE_RUN_CLOCK_INTERVAL_MS(lib/client.js:979)。 */
|
|
14
|
-
const LIVE_RUN_CLOCK_INTERVAL_MS = 1000;
|
|
13
|
+
import { formatRunDuration } from './message-chrome.js';
|
|
15
14
|
/** Turn 过程行:折叠时只有 label + 箭头;点开由外层 seat 把过程节点放出来。 */
|
|
16
15
|
export function TurnProcessNodeViewMirror(props) {
|
|
17
16
|
const { turn, turnProcess, t } = props;
|
|
18
|
-
|
|
19
|
-
const [now, setNow] = useState(() => Date.now());
|
|
20
|
-
const ticking = turn?.status === 'open' && turn.start !== undefined;
|
|
21
|
-
useEffect(() => {
|
|
22
|
-
if (!ticking)
|
|
23
|
-
return;
|
|
24
|
-
setNow(Date.now());
|
|
25
|
-
const timer = setInterval(() => { setNow(Date.now()); }, LIVE_RUN_CLOCK_INTERVAL_MS);
|
|
26
|
-
return () => { clearInterval(timer); };
|
|
27
|
-
}, [ticking]);
|
|
28
|
-
if (turn === undefined || (turn.start === undefined && turn.status !== 'closed'))
|
|
17
|
+
if (turn === undefined || turn.status !== 'closed')
|
|
29
18
|
return null;
|
|
19
|
+
const open = !turnProcess.foldable || turnProcess.open;
|
|
30
20
|
const canCollapse = turnProcess.foldable && turnProcess.hasContent && !turnProcess.alwaysOpen;
|
|
31
|
-
const running = turn.status === 'open';
|
|
32
21
|
const reason = turn.end?.data?.reason?.kind;
|
|
33
|
-
const
|
|
34
|
-
const
|
|
22
|
+
const stopped = reason === 'aborted' || reason === 'interrupted';
|
|
23
|
+
const elapsedMs = turn.start === undefined || turn.end === undefined
|
|
24
|
+
? undefined
|
|
25
|
+
: Math.max(1000, turn.end.time - turn.start.time);
|
|
26
|
+
const duration = elapsedMs === undefined || stopped || reason === 'error'
|
|
35
27
|
? undefined
|
|
36
|
-
:
|
|
37
|
-
const label =
|
|
38
|
-
|
|
39
|
-
|
|
40
|
-
|
|
41
|
-
: duration === undefined ? t('turnProcessWorked') : t('turnProcessTook', { duration });
|
|
42
|
-
const announcement = running
|
|
43
|
-
? t('chatDeepDiving')
|
|
44
|
-
: reason === 'aborted' ? t('turnStopped')
|
|
45
|
-
: reason === 'error' ? t('turnProcessFailed')
|
|
46
|
-
: t('turnProcessWorked');
|
|
28
|
+
: formatRunDuration(elapsedMs, t);
|
|
29
|
+
const label = stopped ? t('turnStopped')
|
|
30
|
+
: reason === 'error' ? t('turnProcessFailed')
|
|
31
|
+
: duration === undefined ? t('turnProcessWorked') : t('turnProcessTook');
|
|
32
|
+
const durationNumberClass = officialClass('TurnProcessNodeView', 'durationNumber') ?? undefined;
|
|
47
33
|
const spec = turnProcess.spec;
|
|
48
34
|
return h(Fragment, null, h('span', {
|
|
49
35
|
className: officialClass('accessibility', 'visuallyHidden') ?? '',
|
|
50
36
|
role: 'status',
|
|
51
37
|
'aria-live': 'polite',
|
|
52
38
|
'aria-atomic': 'true',
|
|
53
|
-
},
|
|
39
|
+
}, stopped ? t('turnStopped') : reason === 'error' ? t('turnProcessFailed') : t('turnProcessWorked')), h('button', {
|
|
54
40
|
type: 'button',
|
|
55
41
|
className: officialClass('TurnProcessNodeView', 'root') ?? '',
|
|
56
42
|
'data-open': open || undefined,
|
|
@@ -61,7 +47,10 @@ export function TurnProcessNodeViewMirror(props) {
|
|
|
61
47
|
disabled: !canCollapse,
|
|
62
48
|
'aria-expanded': turnProcess.hasContent ? open : undefined,
|
|
63
49
|
onClick: () => { turnProcess.setOpen(!open); },
|
|
64
|
-
}, h('span', { className: officialClass('TurnProcessNodeView', 'label') ?? '' }, label),
|
|
50
|
+
}, h('span', { className: officialClass('TurnProcessNodeView', 'label') ?? '' }, label, duration?.map((part, index) => h('span', {
|
|
51
|
+
key: index,
|
|
52
|
+
className: part.numeric ? durationNumberClass : undefined,
|
|
53
|
+
}, part.text))), canCollapse
|
|
65
54
|
? h(IconChevronDownOutlineRegular, { className: officialClass('TurnProcessNodeView', 'chevron') ?? '' })
|
|
66
55
|
: null));
|
|
67
56
|
}
|
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"TurnProcessNodeView.js","sourceRoot":"","sources":["../../../src/session/mirror/TurnProcessNodeView.ts"],"names":[],"mappings":"AAAA,
|
|
1
|
+
{"version":3,"file":"TurnProcessNodeView.js","sourceRoot":"","sources":["../../../src/session/mirror/TurnProcessNodeView.ts"],"names":[],"mappings":"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"}
|
|
@@ -1,5 +1,6 @@
|
|
|
1
1
|
import { createElement as h, type ReactNode } from 'react';
|
|
2
2
|
import type { Translate } from '../../utils/i18n.js';
|
|
3
|
+
import type { ChatNodeStoreFace } from '../faces.js';
|
|
3
4
|
import { type TurnTokenUsageFace } from './TurnUsagePanel.js';
|
|
4
5
|
/** 官方 AssistantContentBlock 的消费面(只用到 kind / text)。 */
|
|
5
6
|
interface ContentBlockFace {
|
|
@@ -13,12 +14,34 @@ export interface TurnTailDataFace {
|
|
|
13
14
|
closing: {
|
|
14
15
|
time: number;
|
|
15
16
|
blocks: ReadonlyArray<ContentBlockFace>;
|
|
17
|
+
/** 官方 closing.finalNode.seq(判定「该轮之后还有内容」用)。 */
|
|
18
|
+
finalNode?: {
|
|
19
|
+
seq: number;
|
|
20
|
+
};
|
|
16
21
|
} | null;
|
|
17
22
|
branchUnavailable?: boolean;
|
|
18
23
|
tokenUsage?: TurnTokenUsageFace;
|
|
19
24
|
}
|
|
20
25
|
/** 官方 hasAssistantReplyContent。 */
|
|
21
26
|
export declare function hasAssistantReplyContent(blocks: ReadonlyArray<ContentBlockFace>): boolean;
|
|
27
|
+
/** 尾部操作行要的两个判定(官方用 nodeStore 快照算;这里按同一 order/store 预计算)。 */
|
|
28
|
+
export interface TurnTailFacts {
|
|
29
|
+
/** 官方 endsWithResponse:操作行常显(true)还是悬停才显(false)。 */
|
|
30
|
+
endsWithResponse(turn: number): boolean;
|
|
31
|
+
/** 官方 hasLaterChatNode:该轮之后还有内容(分支不可用)。 */
|
|
32
|
+
hasLaterChatNode(turn: number, anchorSeq: number): boolean;
|
|
33
|
+
}
|
|
34
|
+
/**
|
|
35
|
+
* 按 order + nodeStore 预计算尾部事实。
|
|
36
|
+
* @param props.order - 渲染顺序(官方 order)。
|
|
37
|
+
* @param props.store - 节点仓库。
|
|
38
|
+
* @param props.lastTurn - 最后一轮的 turn 号(官方 timeline.turnOrder.at(-1))。
|
|
39
|
+
*/
|
|
40
|
+
export declare function buildTurnTailFacts(props: {
|
|
41
|
+
order: readonly string[];
|
|
42
|
+
store: ChatNodeStoreFace;
|
|
43
|
+
lastTurn: number | undefined;
|
|
44
|
+
}): TurnTailFacts;
|
|
22
45
|
/** Turn 尾部操作行:复制 / 分支 / 用量 / 结束时钟。 */
|
|
23
46
|
export declare function TurnTailNodeViewMirror(props: {
|
|
24
47
|
data: TurnTailDataFace;
|
|
@@ -26,6 +49,8 @@ export declare function TurnTailNodeViewMirror(props: {
|
|
|
26
49
|
onBranchAt?: (seq: number) => void;
|
|
27
50
|
/** 官方 conversation.chat.turnTail 插槽内容(如 DeliverablesTail),渲染在操作行之前。 */
|
|
28
51
|
tailSlot?: ReactNode;
|
|
52
|
+
/** 官方 endsWithResponse / hasLaterChatNode(undefined = 操作行常显、分支可用)。 */
|
|
53
|
+
facts?: TurnTailFacts;
|
|
29
54
|
t: Translate;
|
|
30
55
|
}): ReturnType<typeof h> | null;
|
|
31
56
|
export {};
|
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"TurnTailNodeView.d.ts","sourceRoot":"","sources":["../../../src/session/mirror/TurnTailNodeView.ts"],"names":[],"mappings":"
|
|
1
|
+
{"version":3,"file":"TurnTailNodeView.d.ts","sourceRoot":"","sources":["../../../src/session/mirror/TurnTailNodeView.ts"],"names":[],"mappings":"AAOA,OAAO,EAAE,aAAa,IAAI,CAAC,EAAE,KAAK,SAAS,EAAE,MAAM,OAAO,CAAA;AAE1D,OAAO,KAAK,EAAE,SAAS,EAAE,MAAM,qBAAqB,CAAA;AACpD,OAAO,KAAK,EAAgB,iBAAiB,EAAE,MAAM,aAAa,CAAA;AAGlE,OAAO,EAAwB,KAAK,kBAAkB,EAAE,MAAM,qBAAqB,CAAA;AAEnF,sDAAsD;AACtD,UAAU,gBAAgB;IACxB,IAAI,CAAC,EAAE,MAAM,CAAA;IACb,IAAI,CAAC,EAAE,MAAM,CAAA;CACd;AAED,sEAAsE;AACtE,MAAM,WAAW,gBAAgB;IAC/B,IAAI,EAAE,MAAM,CAAA;IACZ,GAAG,EAAE,MAAM,CAAA;IACX,OAAO,EAAE;QACP,IAAI,EAAE,MAAM,CAAA;QACZ,MAAM,EAAE,aAAa,CAAC,gBAAgB,CAAC,CAAA;QACvC,+CAA+C;QAC/C,SAAS,CAAC,EAAE;YAAE,GAAG,EAAE,MAAM,CAAA;SAAE,CAAA;KAC5B,GAAG,IAAI,CAAA;IACR,iBAAiB,CAAC,EAAE,OAAO,CAAA;IAC3B,UAAU,CAAC,EAAE,kBAAkB,CAAA;CAChC;AAED,mCAAmC;AACnC,wBAAgB,wBAAwB,CAAC,MAAM,EAAE,aAAa,CAAC,gBAAgB,CAAC,GAAG,OAAO,CAMzF;AAkBD,4DAA4D;AAC5D,MAAM,WAAW,aAAa;IAC5B,oDAAoD;IACpD,gBAAgB,CAAC,IAAI,EAAE,MAAM,GAAG,OAAO,CAAA;IACvC,2CAA2C;IAC3C,gBAAgB,CAAC,IAAI,EAAE,MAAM,EAAE,SAAS,EAAE,MAAM,GAAG,OAAO,CAAA;CAC3D;AAED;;;;;GAKG;AACH,wBAAgB,kBAAkB,CAAC,KAAK,EAAE;IACxC,KAAK,EAAE,SAAS,MAAM,EAAE,CAAA;IACxB,KAAK,EAAE,iBAAiB,CAAA;IACxB,QAAQ,EAAE,MAAM,GAAG,SAAS,CAAA;CAC7B,GAAG,aAAa,CA8BhB;AAED,sCAAsC;AACtC,wBAAgB,sBAAsB,CAAC,KAAK,EAAE;IAC5C,IAAI,EAAE,gBAAgB,CAAA;IACtB,kDAAkD;IAClD,UAAU,CAAC,EAAE,CAAC,GAAG,EAAE,MAAM,KAAK,IAAI,CAAA;IAClC,uEAAuE;IACvE,QAAQ,CAAC,EAAE,SAAS,CAAA;IACpB,sEAAsE;IACtE,KAAK,CAAC,EAAE,aAAa,CAAA;IACrB,CAAC,EAAE,SAAS,CAAA;CACb,GAAG,UAAU,CAAC,OAAO,CAAC,CAAC,GAAG,IAAI,CA0B9B"}
|
|
@@ -1,11 +1,13 @@
|
|
|
1
|
-
// 官方对照:
|
|
2
|
-
// root(flex column,gap 16px)> actions(margin-top 4px / margin-left -6px)
|
|
3
|
-
// data-turn-tail = turn;data-actions-reveal
|
|
4
|
-
//
|
|
1
|
+
// 官方对照:ui-chat@0.2.1-rc.5 lib/client.js:6986-7045(lastContent / TurnTailNodeView)
|
|
2
|
+
// root(flex column,gap 16px)> [tailSlot] > actions(margin-top 4px / margin-left -6px)
|
|
3
|
+
// data-turn-tail = turn;data-actions-reveal = endsWithResponse ? "always" : "hover"
|
|
4
|
+
// endsWithResponse = 该轮是最后一场 turn,且该轮最后一条内容节点的最后一个可见块算「回复」
|
|
5
|
+
// (reasoning / tool-call 不算,空文本不算)——官方据此决定操作行常显还是悬停才显。
|
|
5
6
|
// closing === null(本轮没有回复)⇒ 只留 turnTail 插槽;弹窗无插槽 ⇒ 整块不渲染。
|
|
6
|
-
//
|
|
7
|
+
// branchUnavailable = data.branchUnavailable || hasLaterChatNode(该轮之后还有内容 ⇒ 不能从这轮开分支)。
|
|
7
8
|
import { createElement as h } from 'react';
|
|
8
9
|
import { officialClass } from '../official-classes.js';
|
|
10
|
+
import { turnOf } from './ChatNodeSeat.js';
|
|
9
11
|
import { MessageIconActionsMirror } from './MessageIconActions.js';
|
|
10
12
|
import { TurnUsagePanelMirror } from './TurnUsagePanel.js';
|
|
11
13
|
/** 官方 hasAssistantReplyContent。 */
|
|
@@ -22,17 +24,71 @@ export function hasAssistantReplyContent(blocks) {
|
|
|
22
24
|
function assistantText(blocks) {
|
|
23
25
|
return blocks.flatMap(block => (block.kind === 'text' ? [block.text ?? ''] : [])).join('');
|
|
24
26
|
}
|
|
27
|
+
/** 官方 lastContent:该轮最后一个内容节点(跳过 turn-tail / turn-process,可选跳过 turn-max-tokens)。 */
|
|
28
|
+
function lastContent(nodes, skipMaxTokens) {
|
|
29
|
+
for (let index = nodes.length - 1; index >= 0; index--) {
|
|
30
|
+
const node = nodes[index];
|
|
31
|
+
if (node === undefined || node.kind === 'turn-tail' || node.kind === 'turn-process')
|
|
32
|
+
continue;
|
|
33
|
+
if (skipMaxTokens && node.kind === 'turn-max-tokens')
|
|
34
|
+
continue;
|
|
35
|
+
return node;
|
|
36
|
+
}
|
|
37
|
+
return undefined;
|
|
38
|
+
}
|
|
39
|
+
/**
|
|
40
|
+
* 按 order + nodeStore 预计算尾部事实。
|
|
41
|
+
* @param props.order - 渲染顺序(官方 order)。
|
|
42
|
+
* @param props.store - 节点仓库。
|
|
43
|
+
* @param props.lastTurn - 最后一轮的 turn 号(官方 timeline.turnOrder.at(-1))。
|
|
44
|
+
*/
|
|
45
|
+
export function buildTurnTailFacts(props) {
|
|
46
|
+
const { order, store, lastTurn } = props;
|
|
47
|
+
const nodesOfTurn = (turn) => {
|
|
48
|
+
const out = [];
|
|
49
|
+
for (const key of order) {
|
|
50
|
+
const node = store.get(key);
|
|
51
|
+
if (node !== undefined && turnOf(node) === turn)
|
|
52
|
+
out.push(node);
|
|
53
|
+
}
|
|
54
|
+
return out;
|
|
55
|
+
};
|
|
56
|
+
return {
|
|
57
|
+
endsWithResponse(turn) {
|
|
58
|
+
if (lastTurn !== turn)
|
|
59
|
+
return false;
|
|
60
|
+
const last = lastContent(nodesOfTurn(turn), false);
|
|
61
|
+
const blocks = last?.kind === 'assistant-step' ? last.data?.blocks : undefined;
|
|
62
|
+
if (!Array.isArray(blocks))
|
|
63
|
+
return false;
|
|
64
|
+
for (let index = blocks.length - 1; index >= 0; index--) {
|
|
65
|
+
const block = blocks[index];
|
|
66
|
+
if (block === undefined)
|
|
67
|
+
continue;
|
|
68
|
+
// 官方 findLast 条件:非 text/reasoning 块,或文本非空。
|
|
69
|
+
if ((block.kind !== 'text' && block.kind !== 'reasoning') || (block.text ?? '').trim() !== '') {
|
|
70
|
+
return hasAssistantReplyContent([block]);
|
|
71
|
+
}
|
|
72
|
+
}
|
|
73
|
+
return false;
|
|
74
|
+
},
|
|
75
|
+
hasLaterChatNode(turn, anchorSeq) {
|
|
76
|
+
return (lastContent(nodesOfTurn(turn), true)?.anchorSeq ?? -1) > anchorSeq;
|
|
77
|
+
},
|
|
78
|
+
};
|
|
79
|
+
}
|
|
25
80
|
/** Turn 尾部操作行:复制 / 分支 / 用量 / 结束时钟。 */
|
|
26
81
|
export function TurnTailNodeViewMirror(props) {
|
|
27
|
-
const { data, onBranchAt, tailSlot, t } = props;
|
|
82
|
+
const { data, onBranchAt, tailSlot, facts, t } = props;
|
|
28
83
|
const closing = data.closing;
|
|
29
84
|
if (closing === null || closing === undefined)
|
|
30
85
|
return null;
|
|
31
86
|
const text = assistantText(closing.blocks);
|
|
87
|
+
const anchorSeq = closing.finalNode?.seq ?? data.seq;
|
|
32
88
|
return h('div', {
|
|
33
89
|
className: officialClass('TurnTailNodeView', 'root') ?? '',
|
|
34
90
|
'data-turn-tail': data.turn,
|
|
35
|
-
'data-actions-reveal': 'always',
|
|
91
|
+
'data-actions-reveal': facts === undefined || facts.endsWithResponse(data.turn) ? 'always' : 'hover',
|
|
36
92
|
}, tailSlot === undefined || tailSlot === null ? null : tailSlot, h(MessageIconActionsMirror, {
|
|
37
93
|
text,
|
|
38
94
|
time: closing.time,
|
|
@@ -40,6 +96,8 @@ export function TurnTailNodeViewMirror(props) {
|
|
|
40
96
|
// 分支:点分支 = 确认框 → fork({ atSeq: 该轮 tail seq })——从这条消息位置截断开分支;
|
|
41
97
|
// 头部按钮 = 省略 atSeq(最新已完成 turn 前缀)。
|
|
42
98
|
onBranch: onBranchAt === undefined ? undefined : () => { onBranchAt(data.seq); },
|
|
99
|
+
branchUnavailable: data.branchUnavailable === true
|
|
100
|
+
|| facts?.hasLaterChatNode(data.turn, anchorSeq),
|
|
43
101
|
className: officialClass('TurnTailNodeView', 'actions') ?? '',
|
|
44
102
|
usageAction: data.tokenUsage === undefined ? undefined : h(TurnUsagePanelMirror, { usage: data.tokenUsage, t }),
|
|
45
103
|
t,
|
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"TurnTailNodeView.js","sourceRoot":"","sources":["../../../src/session/mirror/TurnTailNodeView.ts"],"names":[],"mappings":"AAAA,
|
|
1
|
+
{"version":3,"file":"TurnTailNodeView.js","sourceRoot":"","sources":["../../../src/session/mirror/TurnTailNodeView.ts"],"names":[],"mappings":"AAAA,kFAAkF;AAClF,wFAAwF;AACxF,sFAAsF;AACtF,+DAA+D;AAC/D,2DAA2D;AAC3D,4DAA4D;AAC5D,yFAAyF;AACzF,OAAO,EAAE,aAAa,IAAI,CAAC,EAAkB,MAAM,OAAO,CAAA;AAC1D,OAAO,EAAE,aAAa,EAAE,MAAM,wBAAwB,CAAA;AAGtD,OAAO,EAAE,MAAM,EAAE,MAAM,mBAAmB,CAAA;AAC1C,OAAO,EAAE,wBAAwB,EAAE,MAAM,yBAAyB,CAAA;AAClE,OAAO,EAAE,oBAAoB,EAA2B,MAAM,qBAAqB,CAAA;AAsBnF,mCAAmC;AACnC,MAAM,UAAU,wBAAwB,CAAC,MAAuC;IAC9E,OAAO,MAAM,CAAC,IAAI,CAAC,CAAC,KAAK,EAAE,EAAE;QAC3B,IAAI,KAAK,CAAC,IAAI,KAAK,WAAW,IAAI,KAAK,CAAC,IAAI,KAAK,WAAW;YAAE,OAAO,KAAK,CAAA;QAC1E,IAAI,KAAK,CAAC,IAAI,KAAK,MAAM;YAAE,OAAO,CAAC,KAAK,CAAC,IAAI,IAAI,EAAE,CAAC,CAAC,IAAI,EAAE,KAAK,EAAE,CAAA;QAClE,OAAO,IAAI,CAAA;IACb,CAAC,CAAC,CAAA;AACJ,CAAC;AAED,kCAAkC;AAClC,SAAS,aAAa,CAAC,MAAuC;IAC5D,OAAO,MAAM,CAAC,OAAO,CAAC,KAAK,CAAC,EAAE,CAAC,CAAC,KAAK,CAAC,IAAI,KAAK,MAAM,CAAC,CAAC,CAAC,CAAC,KAAK,CAAC,IAAI,IAAI,EAAE,CAAC,CAAC,CAAC,CAAC,EAAE,CAAC,CAAC,CAAC,IAAI,CAAC,EAAE,CAAC,CAAA;AAC5F,CAAC;AAED,mFAAmF;AACnF,SAAS,WAAW,CAAC,KAA8B,EAAE,aAAsB;IACzE,KAAK,IAAI,KAAK,GAAG,KAAK,CAAC,MAAM,GAAG,CAAC,EAAE,KAAK,IAAI,CAAC,EAAE,KAAK,EAAE,EAAE,CAAC;QACvD,MAAM,IAAI,GAAG,KAAK,CAAC,KAAK,CAAC,CAAA;QACzB,IAAI,IAAI,KAAK,SAAS,IAAI,IAAI,CAAC,IAAI,KAAK,WAAW,IAAI,IAAI,CAAC,IAAI,KAAK,cAAc;YAAE,SAAQ;QAC7F,IAAI,aAAa,IAAI,IAAI,CAAC,IAAI,KAAK,iBAAiB;YAAE,SAAQ;QAC9D,OAAO,IAAI,CAAA;IACb,CAAC;IACD,OAAO,SAAS,CAAA;AAClB,CAAC;AAUD;;;;;GAKG;AACH,MAAM,UAAU,kBAAkB,CAAC,KAIlC;IACC,MAAM,EAAE,KAAK,EAAE,KAAK,EAAE,QAAQ,EAAE,GAAG,KAAK,CAAA;IACxC,MAAM,WAAW,GAAG,CAAC,IAAY,EAAkB,EAAE;QACnD,MAAM,GAAG,GAAmB,EAAE,CAAA;QAC9B,KAAK,MAAM,GAAG,IAAI,KAAK,EAAE,CAAC;YACxB,MAAM,IAAI,GAAG,KAAK,CAAC,GAAG,CAAC,GAAG,CAAC,CAAA;YAC3B,IAAI,IAAI,KAAK,SAAS,IAAI,MAAM,CAAC,IAAI,CAAC,KAAK,IAAI;gBAAE,GAAG,CAAC,IAAI,CAAC,IAAI,CAAC,CAAA;QACjE,CAAC;QACD,OAAO,GAAG,CAAA;IACZ,CAAC,CAAA;IACD,OAAO;QACL,gBAAgB,CAAC,IAAY;YAC3B,IAAI,QAAQ,KAAK,IAAI;gBAAE,OAAO,KAAK,CAAA;YACnC,MAAM,IAAI,GAAG,WAAW,CAAC,WAAW,CAAC,IAAI,CAAC,EAAE,KAAK,CAAC,CAAA;YAClD,MAAM,MAAM,GAAG,IAAI,EAAE,IAAI,KAAK,gBAAgB,CAAC,CAAC,CAAC,IAAI,CAAC,IAAI,EAAE,MAAM,CAAC,CAAC,CAAC,SAAS,CAAA;YAC9E,IAAI,CAAC,KAAK,CAAC,OAAO,CAAC,MAAM,CAAC;gBAAE,OAAO,KAAK,CAAA;YACxC,KAAK,IAAI,KAAK,GAAG,MAAM,CAAC,MAAM,GAAG,CAAC,EAAE,KAAK,IAAI,CAAC,EAAE,KAAK,EAAE,EAAE,CAAC;gBACxD,MAAM,KAAK,GAAG,MAAM,CAAC,KAAK,CAAiC,CAAA;gBAC3D,IAAI,KAAK,KAAK,SAAS;oBAAE,SAAQ;gBACjC,2CAA2C;gBAC3C,IAAI,CAAC,KAAK,CAAC,IAAI,KAAK,MAAM,IAAI,KAAK,CAAC,IAAI,KAAK,WAAW,CAAC,IAAI,CAAC,KAAK,CAAC,IAAI,IAAI,EAAE,CAAC,CAAC,IAAI,EAAE,KAAK,EAAE,EAAE,CAAC;oBAC9F,OAAO,wBAAwB,CAAC,CAAC,KAAK,CAAC,CAAC,CAAA;gBAC1C,CAAC;YACH,CAAC;YACD,OAAO,KAAK,CAAA;QACd,CAAC;QACD,gBAAgB,CAAC,IAAY,EAAE,SAAiB;YAC9C,OAAO,CAAC,WAAW,CAAC,WAAW,CAAC,IAAI,CAAC,EAAE,IAAI,CAAC,EAAE,SAAS,IAAI,CAAC,CAAC,CAAC,GAAG,SAAS,CAAA;QAC5E,CAAC;KACF,CAAA;AACH,CAAC;AAED,sCAAsC;AACtC,MAAM,UAAU,sBAAsB,CAAC,KAStC;IACC,MAAM,EAAE,IAAI,EAAE,UAAU,EAAE,QAAQ,EAAE,KAAK,EAAE,CAAC,EAAE,GAAG,KAAK,CAAA;IACtD,MAAM,OAAO,GAAG,IAAI,CAAC,OAAO,CAAA;IAC5B,IAAI,OAAO,KAAK,IAAI,IAAI,OAAO,KAAK,SAAS;QAAE,OAAO,IAAI,CAAA;IAC1D,MAAM,IAAI,GAAG,aAAa,CAAC,OAAO,CAAC,MAAM,CAAC,CAAA;IAC1C,MAAM,SAAS,GAAG,OAAO,CAAC,SAAS,EAAE,GAAG,IAAI,IAAI,CAAC,GAAG,CAAA;IACpD,OAAO,CAAC,CAAC,KAAK,EAAE;QACd,SAAS,EAAE,aAAa,CAAC,kBAAkB,EAAE,MAAM,CAAC,IAAI,EAAE;QAC1D,gBAAgB,EAAE,IAAI,CAAC,IAAI;QAC3B,qBAAqB,EAAE,KAAK,KAAK,SAAS,IAAI,KAAK,CAAC,gBAAgB,CAAC,IAAI,CAAC,IAAI,CAAC,CAAC,CAAC,CAAC,QAAQ,CAAC,CAAC,CAAC,OAAO;KACrG,EACC,QAAQ,KAAK,SAAS,IAAI,QAAQ,KAAK,IAAI,CAAC,CAAC,CAAC,IAAI,CAAC,CAAC,CAAC,QAAQ,EAC7D,CAAC,CAAC,wBAAwB,EAAE;QAC1B,IAAI;QACJ,IAAI,EAAE,OAAO,CAAC,IAAI;QAClB,KAAK,EAAE,KAAK;QACZ,6DAA6D;QAC7D,kCAAkC;QAClC,QAAQ,EAAE,UAAU,KAAK,SAAS,CAAC,CAAC,CAAC,SAAS,CAAC,CAAC,CAAC,GAAG,EAAE,GAAG,UAAU,CAAC,IAAI,CAAC,GAAG,CAAC,CAAA,CAAC,CAAC;QAC/E,iBAAiB,EAAE,IAAI,CAAC,iBAAiB,KAAK,IAAI;eAC7C,KAAK,EAAE,gBAAgB,CAAC,IAAI,CAAC,IAAI,EAAE,SAAS,CAAC;QAClD,SAAS,EAAE,aAAa,CAAC,kBAAkB,EAAE,SAAS,CAAC,IAAI,EAAE;QAC7D,WAAW,EAAE,IAAI,CAAC,UAAU,KAAK,SAAS,CAAC,CAAC,CAAC,SAAS,CAAC,CAAC,CAAC,CAAC,CAAC,oBAAoB,EAAE,EAAE,KAAK,EAAE,IAAI,CAAC,UAAU,EAAE,CAAC,EAAE,CAAC;QAC/G,CAAC;KACF,CAAC,CACH,CAAA;AACH,CAAC"}
|
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"TurnTriggerNodeView.d.ts","sourceRoot":"","sources":["../../../src/session/mirror/TurnTriggerNodeView.ts"],"names":[],"mappings":"
|
|
1
|
+
{"version":3,"file":"TurnTriggerNodeView.d.ts","sourceRoot":"","sources":["../../../src/session/mirror/TurnTriggerNodeView.ts"],"names":[],"mappings":"AASA,OAAO,EAAE,aAAa,IAAI,CAAC,EAAmB,MAAM,OAAO,CAAA;AAe3D,OAAO,KAAK,EAAE,cAAc,EAAE,SAAS,EAAE,MAAM,qBAAqB,CAAA;AAoBpE,+DAA+D;AAC/D,wBAAgB,kBAAkB,CAAC,MAAM,EAAE,OAAO,GAAG;IAAE,KAAK,EAAE,cAAc,CAAC;IAAC,IAAI,EAAE,MAAM,CAAA;CAAE,CAmB3F;AAED,6CAA6C;AAC7C,wBAAgB,yBAAyB,CAAC,KAAK,EAAE;IAC/C,8DAA8D;IAC9D,IAAI,EAAE,MAAM,CAAC,MAAM,EAAE,OAAO,CAAC,GAAG,SAAS,CAAA;IACzC,CAAC,EAAE,SAAS,CAAA;CACb,GAAG,UAAU,CAAC,OAAO,CAAC,CAAC,CAiDvB"}
|
|
@@ -1,16 +1,17 @@
|
|
|
1
|
-
// 官方对照:
|
|
2
|
-
// + turn-trigger.
|
|
3
|
-
// root(border .5px border-l1 / radius-xl / bg
|
|
4
|
-
// > header(button,padding 12px 16px,gap 10px)
|
|
5
|
-
// > icon(14px
|
|
1
|
+
// 官方对照:ui-chat@0.2.1-rc.5 lib/client.js:7118-7195(TurnTriggerNodeView)
|
|
2
|
+
// + turn-trigger.js 的 turnTriggerDetails / TRIGGER_ICONS。
|
|
3
|
+
// root(section,border .5px border-l1 / radius-xl / bg turn-trigger-bg / hover turn-trigger-bg-hover)
|
|
4
|
+
// > header(button,padding 12px 16px,gap 10px,aria-expanded + aria-controls)
|
|
5
|
+
// > icon(14px)> title(14px)> time(margin-left:auto,xxs-12)
|
|
6
6
|
// > chevron(12px;展开用 openChevron = rotate 180°)
|
|
7
|
-
// > body
|
|
7
|
+
// > body(展开时)> explanation(8px 0)+ content > ModelFacingContent(每条文本一个
|
|
8
|
+
// pre[data-context-text],超 20000 字符截断;未知块走 JsonBlock)
|
|
8
9
|
// 「非人类触发的 turn」就以这一行开头——官方原图里那句「收到执行请求 9月26日 01:35」就是它。
|
|
9
|
-
import { createElement as h, useState } from 'react';
|
|
10
|
-
import { IconAgentPresetOutlineRegular,
|
|
10
|
+
import { createElement as h, useId, useState } from 'react';
|
|
11
|
+
import { IconAgentPresetOutlineRegular, IconBranchOutlineRegular, IconChevronDownOutlineRegular, IconClockOutlineRegular, IconContextInjectionOutlineRegular, IconCordisPluginOutlineRegular, IconGlobeOutlineRegular, IconGoalOutlineRegular, IconPaperPlaneOutlineRegular, IconQueueOutlineRegular, } from '../../ui/official.js';
|
|
11
12
|
import { officialClass } from '../official-classes.js';
|
|
12
13
|
import { formatMessageClock } from './message-chrome.js';
|
|
13
|
-
/** 官方 TRIGGER_ICONS(lib/client.js:
|
|
14
|
+
/** 官方 TRIGGER_ICONS(lib/client.js:7122-7131)。 */
|
|
14
15
|
const TRIGGER_ICONS = {
|
|
15
16
|
request: IconContextInjectionOutlineRegular,
|
|
16
17
|
goal: IconGoalOutlineRegular,
|
|
@@ -19,10 +20,12 @@ const TRIGGER_ICONS = {
|
|
|
19
20
|
subagent: IconAgentPresetOutlineRegular,
|
|
20
21
|
github: IconBranchOutlineRegular,
|
|
21
22
|
webhook: IconGlobeOutlineRegular,
|
|
22
|
-
schedule:
|
|
23
|
+
schedule: IconClockOutlineRegular,
|
|
23
24
|
job: IconQueueOutlineRegular,
|
|
24
25
|
plugin: IconCordisPluginOutlineRegular,
|
|
25
26
|
};
|
|
27
|
+
/** 官方 MAX_CHARS(lib/client.js:4416):模型面向文本的显示上限。 */
|
|
28
|
+
const MAX_CHARS = 20000;
|
|
26
29
|
/** 官方 turnTriggerDetails:source.kind → 标题与图标家族(默认 request)。 */
|
|
27
30
|
export function turnTriggerDetails(source) {
|
|
28
31
|
const record = (value) => (typeof value === 'object' && value !== null && !Array.isArray(value) ? value : {});
|
|
@@ -47,10 +50,10 @@ export function turnTriggerDetails(source) {
|
|
|
47
50
|
export function TurnTriggerNodeViewMirror(props) {
|
|
48
51
|
const { data, t } = props;
|
|
49
52
|
const [open, setOpen] = useState(false);
|
|
53
|
+
const bodyId = useId();
|
|
50
54
|
const details = turnTriggerDetails(data?.source);
|
|
51
55
|
const TriggerIcon = TRIGGER_ICONS[details.icon] ?? IconContextInjectionOutlineRegular;
|
|
52
56
|
const time = typeof data?.time === 'number' ? data.time : undefined;
|
|
53
|
-
const content = triggerContent(data?.content);
|
|
54
57
|
return h('section', {
|
|
55
58
|
className: officialClass('TurnTriggerNodeView', 'root') ?? '',
|
|
56
59
|
'data-turn-trigger': true,
|
|
@@ -58,6 +61,7 @@ export function TurnTriggerNodeViewMirror(props) {
|
|
|
58
61
|
type: 'button',
|
|
59
62
|
className: officialClass('TurnTriggerNodeView', 'header') ?? '',
|
|
60
63
|
'aria-expanded': open,
|
|
64
|
+
'aria-controls': bodyId,
|
|
61
65
|
onClick: () => { setOpen(value => !value); },
|
|
62
66
|
}, h('span', { className: officialClass('TurnTriggerNodeView', 'icon') ?? '', 'aria-hidden': true }, h(TriggerIcon, { size: 14 })), h('span', { className: officialClass('TurnTriggerNodeView', 'title') ?? '' }, t(details.title)), time === undefined
|
|
63
67
|
? null
|
|
@@ -70,18 +74,30 @@ export function TurnTriggerNodeViewMirror(props) {
|
|
|
70
74
|
? officialClass('TurnTriggerNodeView', 'openChevron') ?? ''
|
|
71
75
|
: officialClass('TurnTriggerNodeView', 'chevron') ?? '',
|
|
72
76
|
})), open
|
|
73
|
-
? h('div', { className: officialClass('TurnTriggerNodeView', 'body') ?? '' }, h('p', { className: officialClass('TurnTriggerNodeView', 'explanation') ?? '' }, t('triggerExplanation')), h('div', { className: officialClass('TurnTriggerNodeView', 'content') ?? '' }, content
|
|
77
|
+
? h('div', { id: bodyId, className: officialClass('TurnTriggerNodeView', 'body') ?? '' }, h('p', { className: officialClass('TurnTriggerNodeView', 'explanation') ?? '' }, t('triggerExplanation')), h('div', { className: officialClass('TurnTriggerNodeView', 'content') ?? '' }, modelFacingRuns(data?.content, t).map((text, index) => h('pre', {
|
|
78
|
+
key: index,
|
|
79
|
+
className: officialClass('ContextBody', 'text') ?? '',
|
|
80
|
+
'data-context-text': true,
|
|
81
|
+
}, text.length > MAX_CHARS
|
|
82
|
+
? `${text.slice(0, MAX_CHARS)}\n${t('jsonTruncated', { total: text.length })}`
|
|
83
|
+
: text))))
|
|
74
84
|
: null);
|
|
75
85
|
}
|
|
76
|
-
/**
|
|
77
|
-
function
|
|
86
|
+
/** 官方 contentRuns:连续 text 块合并成一段(未知块不参与文本拼接)。 */
|
|
87
|
+
function modelFacingRuns(content, t) {
|
|
78
88
|
if (!Array.isArray(content))
|
|
79
|
-
return '';
|
|
80
|
-
|
|
89
|
+
return [t('sessionEmpty')];
|
|
90
|
+
const runs = [];
|
|
91
|
+
for (const block of content) {
|
|
81
92
|
const b = block;
|
|
82
|
-
if (b
|
|
83
|
-
|
|
84
|
-
|
|
85
|
-
|
|
93
|
+
if (b === null || typeof b !== 'object' || b.type !== 'text' || typeof b.text !== 'string')
|
|
94
|
+
continue;
|
|
95
|
+
const last = runs.length - 1;
|
|
96
|
+
if (last >= 0)
|
|
97
|
+
runs[last] += b.text;
|
|
98
|
+
else
|
|
99
|
+
runs.push(b.text);
|
|
100
|
+
}
|
|
101
|
+
return runs.length === 0 ? [t('sessionEmpty')] : runs;
|
|
86
102
|
}
|
|
87
103
|
//# sourceMappingURL=TurnTriggerNodeView.js.map
|
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"TurnTriggerNodeView.js","sourceRoot":"","sources":["../../../src/session/mirror/TurnTriggerNodeView.ts"],"names":[],"mappings":"AAAA,
|
|
1
|
+
{"version":3,"file":"TurnTriggerNodeView.js","sourceRoot":"","sources":["../../../src/session/mirror/TurnTriggerNodeView.ts"],"names":[],"mappings":"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"}
|
|
@@ -5,12 +5,18 @@ export { pad2 };
|
|
|
5
5
|
export declare function startOfLocalDay(ms: number): number;
|
|
6
6
|
/** 距下一个本机零点(官方 msUntilNextLocalMidnight)。 */
|
|
7
7
|
export declare function msUntilNextLocalMidnight(ms: number): number;
|
|
8
|
+
/** 官方 formatRunDuration 的片段(numeric = 数字段,调用方按官方套等宽数字字体)。 */
|
|
9
|
+
export interface DurationPart {
|
|
10
|
+
text: string;
|
|
11
|
+
numeric: boolean;
|
|
12
|
+
}
|
|
8
13
|
/**
|
|
9
|
-
* 官方 formatRunDuration
|
|
14
|
+
* 官方 formatRunDuration(0.2.x,lib/client.js:5067-5095):整秒;≥1 分带分;≥1 小时带小时。
|
|
15
|
+
* 单位是独立片段(`duration.hourUnit` / `minuteUnit` / `secondUnit`),不是一条带占位的模板。
|
|
10
16
|
*/
|
|
11
|
-
export declare function formatRunDuration(ms: number, tt: Translate):
|
|
12
|
-
/**
|
|
13
|
-
export declare function
|
|
17
|
+
export declare function formatRunDuration(ms: number, tt: Translate): readonly DurationPart[];
|
|
18
|
+
/** 时长片段拼成单行文本(塞进带占位符的文案 / aria 用)。 */
|
|
19
|
+
export declare function durationText(parts: readonly DurationPart[]): string;
|
|
14
20
|
/**
|
|
15
21
|
* 官方 formatMessageClock:同日 → `HH:mm`;同年 → `{m}月{d}日 HH:mm`;跨年 → `{y}年{m}月{d}日 HH:mm`。
|
|
16
22
|
*/
|
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"message-chrome.d.ts","sourceRoot":"","sources":["../../../src/session/mirror/message-chrome.ts"],"names":[],"mappings":"AAKA,OAAO,EAAE,IAAI,EAAE,MAAM,qBAAqB,CAAA;AAC1C,OAAO,KAAK,EAAE,SAAS,EAAE,MAAM,qBAAqB,CAAA;AAEpD,OAAO,EAAE,IAAI,EAAE,CAAA;AAEf,kCAAkC;AAClC,wBAAgB,eAAe,CAAC,EAAE,EAAE,MAAM,GAAG,MAAM,CAIlD;AAED,6CAA6C;AAC7C,wBAAgB,wBAAwB,CAAC,EAAE,EAAE,MAAM,GAAG,MAAM,CAI3D;AAED
|
|
1
|
+
{"version":3,"file":"message-chrome.d.ts","sourceRoot":"","sources":["../../../src/session/mirror/message-chrome.ts"],"names":[],"mappings":"AAKA,OAAO,EAAE,IAAI,EAAE,MAAM,qBAAqB,CAAA;AAC1C,OAAO,KAAK,EAAE,SAAS,EAAE,MAAM,qBAAqB,CAAA;AAEpD,OAAO,EAAE,IAAI,EAAE,CAAA;AAEf,kCAAkC;AAClC,wBAAgB,eAAe,CAAC,EAAE,EAAE,MAAM,GAAG,MAAM,CAIlD;AAED,6CAA6C;AAC7C,wBAAgB,wBAAwB,CAAC,EAAE,EAAE,MAAM,GAAG,MAAM,CAI3D;AAED,6DAA6D;AAC7D,MAAM,WAAW,YAAY;IAC3B,IAAI,EAAE,MAAM,CAAA;IACZ,OAAO,EAAE,OAAO,CAAA;CACjB;AAED;;;GAGG;AACH,wBAAgB,iBAAiB,CAAC,EAAE,EAAE,MAAM,EAAE,EAAE,EAAE,SAAS,GAAG,SAAS,YAAY,EAAE,CAUpF;AAED,sCAAsC;AACtC,wBAAgB,YAAY,CAAC,KAAK,EAAE,SAAS,YAAY,EAAE,GAAG,MAAM,CAEnE;AAED;;GAEG;AACH,wBAAgB,kBAAkB,CAAC,IAAI,EAAE,MAAM,EAAE,EAAE,EAAE,SAAS,EAAE,GAAG,GAAE,MAAmB,GAAG,MAAM,CAQhG;AAED,oDAAoD;AACpD,wBAAgB,cAAc,IAAI,MAAM,CAavC;AAED,iDAAiD;AACjD,wBAAgB,YAAY,CAAC,KAAK,EAAE,MAAM,EAAE,EAAE,EAAE,SAAS,GAAG,MAAM,CAMjE;AAED,iDAAiD;AACjD,wBAAgB,kBAAkB,CAAC,KAAK,EAAE,MAAM,EAAE,EAAE,EAAE,SAAS,GAAG,MAAM,CAEvE;AAED,4DAA4D;AAC5D,wBAAgB,iBAAiB,CAAC,KAAK,EAAE,MAAM,EAAE,EAAE,EAAE,SAAS,GAAG,MAAM,CAKtE;AAED,yCAAyC;AACzC,wBAAgB,gBAAgB,CAAC,KAAK,EAAE,MAAM,EAAE,EAAE,EAAE,SAAS,GAAG,MAAM,CAErE;AA2BD;;;GAGG;AACH,wBAAgB,qBAAqB,CAAC,eAAe,EAAE,MAAM,EAAE,YAAY,EAAE,MAAM,EAAE,aAAa,SAAI,GAAG,MAAM,GAAG,IAAI,CAwBrH"}
|
|
@@ -18,30 +18,25 @@ export function msUntilNextLocalMidnight(ms) {
|
|
|
18
18
|
return Math.max(next.getTime() - ms, 1);
|
|
19
19
|
}
|
|
20
20
|
/**
|
|
21
|
-
* 官方 formatRunDuration
|
|
21
|
+
* 官方 formatRunDuration(0.2.x,lib/client.js:5067-5095):整秒;≥1 分带分;≥1 小时带小时。
|
|
22
|
+
* 单位是独立片段(`duration.hourUnit` / `minuteUnit` / `secondUnit`),不是一条带占位的模板。
|
|
22
23
|
*/
|
|
23
24
|
export function formatRunDuration(ms, tt) {
|
|
24
25
|
const total = Math.max(0, Math.floor(ms / 1e3));
|
|
25
26
|
const hours = Math.floor(total / 3600);
|
|
26
27
|
const minutes = Math.floor(total / 60) % 60;
|
|
27
28
|
const seconds = total % 60;
|
|
29
|
+
const parts = [];
|
|
28
30
|
if (hours > 0)
|
|
29
|
-
|
|
30
|
-
|
|
31
|
-
|
|
32
|
-
|
|
31
|
+
parts.push({ text: String(hours), numeric: true }, { text: tt('durationHourUnit'), numeric: false });
|
|
32
|
+
if (total >= 60)
|
|
33
|
+
parts.push({ text: String(minutes), numeric: true }, { text: tt('durationMinuteUnit'), numeric: false });
|
|
34
|
+
parts.push({ text: String(seconds), numeric: true }, { text: tt('durationSecondUnit'), numeric: false });
|
|
35
|
+
return parts;
|
|
33
36
|
}
|
|
34
|
-
/**
|
|
35
|
-
export function
|
|
36
|
-
|
|
37
|
-
const hours = Math.floor(totalSeconds / 3600);
|
|
38
|
-
const minutes = Math.floor(totalSeconds / 60) % 60;
|
|
39
|
-
const seconds = String(totalSeconds % 60);
|
|
40
|
-
if (hours > 0)
|
|
41
|
-
return tt('durationHours', { hours, minutes: pad2(minutes), seconds });
|
|
42
|
-
return minutes > 0
|
|
43
|
-
? tt('durationMinutes', { minutes, seconds })
|
|
44
|
-
: tt('durationSeconds', { seconds });
|
|
37
|
+
/** 时长片段拼成单行文本(塞进带占位符的文案 / aria 用)。 */
|
|
38
|
+
export function durationText(parts) {
|
|
39
|
+
return parts.map(part => part.text).join('');
|
|
45
40
|
}
|
|
46
41
|
/**
|
|
47
42
|
* 官方 formatMessageClock:同日 → `HH:mm`;同年 → `{m}月{d}日 HH:mm`;跨年 → `{y}年{m}月{d}日 HH:mm`。
|
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"message-chrome.js","sourceRoot":"","sources":["../../../src/session/mirror/message-chrome.ts"],"names":[],"mappings":"AAAA,oGAAoG;AACpG,gDAAgD;AAChD,gDAAgD;AAChD,wEAAwE;AACxE,OAAO,EAAE,SAAS,EAAE,QAAQ,EAAE,MAAM,OAAO,CAAA;AAC3C,OAAO,EAAE,IAAI,EAAE,MAAM,qBAAqB,CAAA;AAG1C,OAAO,EAAE,IAAI,EAAE,CAAA;AAEf,kCAAkC;AAClC,MAAM,UAAU,eAAe,CAAC,EAAU;IACxC,MAAM,CAAC,GAAG,IAAI,IAAI,CAAC,EAAE,CAAC,CAAA;IACtB,CAAC,CAAC,QAAQ,CAAC,CAAC,EAAE,CAAC,EAAE,CAAC,EAAE,CAAC,CAAC,CAAA;IACtB,OAAO,CAAC,CAAC,OAAO,EAAE,CAAA;AACpB,CAAC;AAED,6CAA6C;AAC7C,MAAM,UAAU,wBAAwB,CAAC,EAAU;IACjD,MAAM,IAAI,GAAG,IAAI,IAAI,CAAC,EAAE,CAAC,CAAA;IACzB,IAAI,CAAC,QAAQ,CAAC,EAAE,EAAE,CAAC,EAAE,CAAC,EAAE,CAAC,CAAC,CAAA;IAC1B,OAAO,IAAI,CAAC,GAAG,CAAC,IAAI,CAAC,OAAO,EAAE,GAAG,EAAE,EAAE,CAAC,CAAC,CAAA;AACzC,CAAC;
|
|
1
|
+
{"version":3,"file":"message-chrome.js","sourceRoot":"","sources":["../../../src/session/mirror/message-chrome.ts"],"names":[],"mappings":"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"}
|
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"official-classes.d.ts","sourceRoot":"","sources":["../../src/session/official-classes.ts"],"names":[],"mappings":"
|
|
1
|
+
{"version":3,"file":"official-classes.d.ts","sourceRoot":"","sources":["../../src/session/official-classes.ts"],"names":[],"mappings":"AAyCA,uBAAuB;AACvB,MAAM,MAAM,gBAAgB,GAAG,GAAG,CAAC,MAAM,EAAE,MAAM,CAAC,CAAA;AAElD;;;;;GAKG;AACH,wBAAgB,gBAAgB,CAAC,GAAG,EAAE,MAAM,GAAG,gBAAgB,CAiC9D;AAKD;;;GAGG;AACH,wBAAgB,uBAAuB,IAAI,GAAG,CAAC,MAAM,EAAE,gBAAgB,CAAC,CAwBvE;AAED,wCAAwC;AACxC,wBAAgB,mBAAmB,IAAI,MAAM,CAE5C;AAED;;;;GAIG;AACH,wBAAgB,aAAa,CAAC,MAAM,EAAE,MAAM,EAAE,QAAQ,EAAE,MAAM,GAAG,MAAM,GAAG,IAAI,CAE7E;AAED;;;GAGG;AACH,wBAAgB,eAAe,CAAC,GAAG,KAAK,EAAE,KAAK,CAAC,CAAC,MAAM,EAAE,MAAM,CAAC,CAAC,GAAG,MAAM,CAOzE"}
|
|
@@ -12,7 +12,8 @@
|
|
|
12
12
|
// 不空白),并在控制台告警一次。
|
|
13
13
|
//
|
|
14
14
|
// 已知官方模块与语义名(源码 *_module_css_default 实测清单):
|
|
15
|
-
// ChatView(
|
|
15
|
+
// ChatView(19): frame root scroll column flowItem hint older callRow openError modalAction toBottom toBottomSlot
|
|
16
|
+
// running runningDivider runningContent runningText runningIcon runningWhaleAnimated runningWhaleStill
|
|
16
17
|
// AssistantMarkdown(4): root body actions stopped
|
|
17
18
|
// MessageItem(32): bubble userRow userStack contextRow fileCard ... turnErrorRow retryRow ...
|
|
18
19
|
// GenericCommandCard(8): root row title summary body chevron leading separator
|
|
@@ -21,7 +22,8 @@
|
|
|
21
22
|
// ToolRow(30): root row leading title sep summary summarySuffix diffStat fileLink
|
|
22
23
|
// errorSummary stoppedSummary bodyWrap inspectButton detailsBodyWrap bodyScroll ioCard
|
|
23
24
|
// ioSection ioLabel ioDivider ioText codeBody terminalBody diffBody readBody imageBody
|
|
24
|
-
// searchBody webBody searchRecovery
|
|
25
|
+
// searchBody webBody searchRecovery imageExtra imageMeta visuallyHidden
|
|
26
|
+
// (0.2.x 已删 chevron / imageLabel:箭头样式并入 primitives DisclosureRow)
|
|
25
27
|
// ui-sidebar-documentpreview 包(官方文件预览体,2026-09 U11 文本渲染对齐时接入):
|
|
26
28
|
// CodeBody(2): renderer code(CodeBlock + lineNumbers 的官方外壳)
|
|
27
29
|
// ui-deliverables 包(交付文件行 + 交付文件卡,2026-09 U11 产出物入口接入):
|
|
@@ -73,7 +75,7 @@ export function parseOfficialCss(css) {
|
|
|
73
75
|
if (prefix === '')
|
|
74
76
|
return out;
|
|
75
77
|
for (const token of tokens) {
|
|
76
|
-
if (!token.startsWith(prefix
|
|
78
|
+
if (!token.startsWith(`${prefix}_`))
|
|
77
79
|
continue;
|
|
78
80
|
const semantic = token.slice(prefix.length + 1);
|
|
79
81
|
// 语义名是 camelCase,不含下划线;跳过复合类名(如 foo_bar_baz 的剩余部分)
|