@khorsheed/dsh-context-lens 0.0.0-stage → 0.1.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/CHANGELOG.md +16 -0
- package/README.en.md +53 -0
- package/README.i18n.yaml +6 -0
- package/README.md +52 -2
- package/cordis.patch.yml +13 -0
- package/lib/client.js +26953 -0
- package/lib/index.js +3943 -0
- package/lib/typert.host.d.ts +3 -0
- package/lib/typert.host.js +1569 -0
- package/lib/typert.remote-client.d.ts +40 -0
- package/lib/typert.remote-client.js +1202 -0
- package/lib/types/changes.d.ts +72 -0
- package/lib/types/changes.js +328 -0
- package/lib/types/client/AgentTabs.d.ts +34 -0
- package/lib/types/client/AgentTabs.js +89 -0
- package/lib/types/client/ChangeList.d.ts +28 -0
- package/lib/types/client/ChangeList.js +109 -0
- package/lib/types/client/ConfigFacts.d.ts +21 -0
- package/lib/types/client/ConfigFacts.js +30 -0
- package/lib/types/client/HeaderUtility.d.ts +12 -0
- package/lib/types/client/HeaderUtility.js +8 -0
- package/lib/types/client/InspectorPanel.d.ts +5 -0
- package/lib/types/client/InspectorPanel.js +486 -0
- package/lib/types/client/RawView.d.ts +18 -0
- package/lib/types/client/RawView.js +8 -0
- package/lib/types/client/RequestFacts.d.ts +19 -0
- package/lib/types/client/RequestFacts.js +39 -0
- package/lib/types/client/RoomDecisionsView.d.ts +24 -0
- package/lib/types/client/RoomDecisionsView.js +52 -0
- package/lib/types/client/SchemaFields.d.ts +13 -0
- package/lib/types/client/SchemaFields.js +96 -0
- package/lib/types/client/SegCtl.d.ts +32 -0
- package/lib/types/client/SegCtl.js +12 -0
- package/lib/types/client/SegmentBlocks.d.ts +28 -0
- package/lib/types/client/SegmentBlocks.js +225 -0
- package/lib/types/client/TimingView.d.ts +17 -0
- package/lib/types/client/TimingView.js +98 -0
- package/lib/types/client/TokenView.d.ts +21 -0
- package/lib/types/client/TokenView.js +22 -0
- package/lib/types/client/ToolCatalog.d.ts +9 -0
- package/lib/types/client/ToolCatalog.js +51 -0
- package/lib/types/client/Trend.d.ts +25 -0
- package/lib/types/client/Trend.js +100 -0
- package/lib/types/client/TurnAction.d.ts +14 -0
- package/lib/types/client/TurnAction.js +31 -0
- package/lib/types/client/TurnMenu.d.ts +36 -0
- package/lib/types/client/TurnMenu.js +50 -0
- package/lib/types/client/aggregate.d.ts +141 -0
- package/lib/types/client/aggregate.js +213 -0
- package/lib/types/client/contract.d.ts +58 -0
- package/lib/types/client/contract.js +1 -0
- package/lib/types/client/definition.d.ts +47 -0
- package/lib/types/client/definition.js +25 -0
- package/lib/types/client/icons-local.d.ts +19 -0
- package/lib/types/client/icons-local.js +3 -0
- package/lib/types/client/icons.d.ts +18 -0
- package/lib/types/client/icons.js +2 -0
- package/lib/types/client/index.d.ts +42 -0
- package/lib/types/client/index.js +139 -0
- package/lib/types/client/locales.d.ts +365 -0
- package/lib/types/client/locales.js +705 -0
- package/lib/types/client/preset-visibility.d.ts +99 -0
- package/lib/types/client/preset-visibility.js +108 -0
- package/lib/types/client/scroll-sync.d.ts +54 -0
- package/lib/types/client/scroll-sync.js +118 -0
- package/lib/types/client/timing.d.ts +29 -0
- package/lib/types/client/timing.js +117 -0
- package/lib/types/client/wire.d.ts +13 -0
- package/lib/types/client/wire.js +11 -0
- package/lib/types/index.d.ts +32 -0
- package/lib/types/index.js +25 -0
- package/lib/types/log-lane.d.ts +198 -0
- package/lib/types/log-lane.js +841 -0
- package/lib/types/messages.d.ts +96 -0
- package/lib/types/messages.js +254 -0
- package/lib/types/prefix-diff.d.ts +4 -0
- package/lib/types/prefix-diff.js +20 -0
- package/lib/types/remote.d.ts +45 -0
- package/lib/types/remote.js +99 -0
- package/lib/types/room.d.ts +66 -0
- package/lib/types/room.js +101 -0
- package/lib/types/segmenter.d.ts +100 -0
- package/lib/types/segmenter.js +184 -0
- package/lib/types/service.d.ts +145 -0
- package/lib/types/service.js +493 -0
- package/lib/types/store.d.ts +424 -0
- package/lib/types/store.js +1920 -0
- package/lib/types/tool-summary.d.ts +6 -0
- package/lib/types/tool-summary.js +7 -0
- package/lib/types/types.d.ts +703 -0
- package/lib/types/types.js +18 -0
- package/locale/en.json +6 -0
- package/locale/zh.json +6 -0
- package/package.json +133 -3
|
@@ -0,0 +1,109 @@
|
|
|
1
|
+
import { jsxs as _jsxs, jsx as _jsx, Fragment as _Fragment } from "react/jsx-runtime";
|
|
2
|
+
/**
|
|
3
|
+
* The cache section's break line and change list. Each card names the host
|
|
4
|
+
* fact behind it (replacement, compaction, prune, or a bare id-level
|
|
5
|
+
* remove/add), shows its producer verbatim, and expands into the exact
|
|
6
|
+
* difference; the card where the prefix first differs carries the break mark
|
|
7
|
+
* and opens by default. Jumps go to the module that owns the detail (the
|
|
8
|
+
* composition filter, the compaction request, the pre-prune request).
|
|
9
|
+
*/
|
|
10
|
+
import { useState } from 'react';
|
|
11
|
+
import { fmt, fmtSpan, requestNumberText } from "./aggregate.js";
|
|
12
|
+
import { categoryLabelKey } from "./SegmentBlocks.js";
|
|
13
|
+
import css from './ChangeList.module.css';
|
|
14
|
+
const pad = (index) => String(index).padStart(3, '0');
|
|
15
|
+
function range(rows) {
|
|
16
|
+
if (rows.length === 0)
|
|
17
|
+
return '';
|
|
18
|
+
const indexes = rows.map(row => row.index);
|
|
19
|
+
const lo = Math.min(...indexes), hi = Math.max(...indexes);
|
|
20
|
+
return lo === hi ? pad(lo) : `${pad(lo)}–${pad(hi)}`;
|
|
21
|
+
}
|
|
22
|
+
const sum = (rows) => rows.reduce((n, row) => n + row.chars, 0);
|
|
23
|
+
/** One-line character diff: shared context, then what left and what arrived. */
|
|
24
|
+
export function InlineDiff({ text, t }) {
|
|
25
|
+
const leading = `${text.leadingOmitted ? '…' : ''}${text.leading}`;
|
|
26
|
+
const trailing = `${text.trailing}${text.trailingOmitted ? '…' : ''}`;
|
|
27
|
+
return _jsxs(_Fragment, { children: [_jsxs("pre", { className: css.diff, children: [leading, text.removedChars > 0 && _jsxs("del", { children: [text.removed, text.removedChars > 160 ? '…' : ''] }), text.addedChars > 0 && _jsxs("ins", { children: [text.added, text.addedChars > 160 ? '…' : ''] }), trailing, !leading && !trailing && text.removedChars === 0 && text.addedChars === 0 && t('lens.diffEmpty')] }), (text.removedChars > 160 || text.addedChars > 160) && _jsx("span", { className: css.meta, children: t('lens.diffTruncated') })] });
|
|
28
|
+
}
|
|
29
|
+
function Size({ minus, plus }) {
|
|
30
|
+
return _jsxs("span", { className: css.size, children: [minus > 0 && _jsxs("span", { className: css.minus, children: ["\u2212", fmt(minus)] }), minus > 0 && plus > 0 && ' ', plus > 0 && _jsxs("span", { className: css.plus, children: ["+", fmt(plus)] })] });
|
|
31
|
+
}
|
|
32
|
+
function Rows({ label, rows, gone, t }) {
|
|
33
|
+
if (rows.length === 0)
|
|
34
|
+
return null;
|
|
35
|
+
return _jsxs("div", { className: css.rowsBlock, children: [_jsx("span", { className: css.rowsLabel, children: label }), _jsx("div", { className: css.rows, children: rows.map(row => _jsxs("div", { className: gone ? css.rowGone : css.row, children: [_jsxs("span", { className: css.rowIdx, children: [pad(row.index), " ", t(categoryLabelKey(row.category))] }), _jsx("span", { className: css.rowText, title: row.preview, children: row.preview || t('lens.diffEmpty') }), _jsx("span", { className: css.rowChars, children: fmt(row.chars) })] }, `${row.index}-${row.messageId ?? ''}`)) })] });
|
|
36
|
+
}
|
|
37
|
+
function titleOf(change, t) {
|
|
38
|
+
if (change.system)
|
|
39
|
+
return change.section === undefined ? t('chg.system') : `${t('chg.system')} · ${t('chg.section', { section: change.section })}`;
|
|
40
|
+
const from = change.removed.length, to = change.added.length;
|
|
41
|
+
switch (change.kind) {
|
|
42
|
+
case 'compaction': return t('chg.compacted', { from: String(from) });
|
|
43
|
+
case 'prune': return t('chg.pruned', { source: change.added[0]?.source ?? change.removed[0]?.source ?? '' });
|
|
44
|
+
case 'remove': return t('chg.n', { count: String(from) });
|
|
45
|
+
case 'add': return t('chg.n', { count: String(to) });
|
|
46
|
+
default: return to === 0 ? t('chg.toEmpty', { from: String(from) }) : t('chg.nToM', { from: String(from), to: String(to) });
|
|
47
|
+
}
|
|
48
|
+
}
|
|
49
|
+
function whereOf(change, t) {
|
|
50
|
+
const rows = change.added.length > 0 ? change.added : change.removed;
|
|
51
|
+
const parts = [t('chg.messages', { range: range(rows) })];
|
|
52
|
+
if (change.eventSeq !== undefined && change.replacedSeqs !== undefined)
|
|
53
|
+
parts.push(t('chg.seq', { seq: String(change.eventSeq), replaced: change.replacedSeqs.join('、') }));
|
|
54
|
+
return parts.join(' · ');
|
|
55
|
+
}
|
|
56
|
+
function sourceOf(change) {
|
|
57
|
+
if (change.source !== undefined)
|
|
58
|
+
return change.source.op === undefined ? change.source.kind : `${change.source.kind} · ${change.source.op}`;
|
|
59
|
+
const sources = [...new Set([...change.removed, ...change.added].map(row => row.source))];
|
|
60
|
+
return sources.length === 0 ? undefined : sources.join(' · ');
|
|
61
|
+
}
|
|
62
|
+
function Card({ chip, kind, title, where, source, size, isBreak, children, t }) {
|
|
63
|
+
const [open, setOpen] = useState(isBreak);
|
|
64
|
+
return _jsxs("div", { className: isBreak ? css.cardBreak : css.card, children: [_jsxs("button", { type: "button", className: css.head, "aria-expanded": open, onClick: () => setOpen(v => !v), children: [_jsx("span", { className: css.kind, "data-kind": kind, children: chip }), _jsxs("span", { className: css.where, children: [_jsxs("b", { children: [title, isBreak && _jsx("span", { className: css.flag, children: t('chg.break') })] }), _jsxs("span", { children: [where, source !== undefined && _jsxs(_Fragment, { children: [" \u00B7 ", _jsx("code", { className: css.src, children: source })] })] })] }), size, _jsx("span", { className: css.chev, "aria-hidden": "true", children: "\u203A" })] }), open && _jsx("div", { className: css.body, children: children })] });
|
|
65
|
+
}
|
|
66
|
+
function MessageCard({ change, prefix, onOpenRequest, onShowCategory, t }) {
|
|
67
|
+
const minus = change.text ? change.text.removedChars : sum(change.removed);
|
|
68
|
+
const plus = change.text ? change.text.addedChars : sum(change.added);
|
|
69
|
+
const previous = requestNumberText({ requestNumber: prefix.previousRequestNumber });
|
|
70
|
+
return _jsxs(Card, { chip: t(`chg.kind.${change.kind}`), kind: change.kind, title: titleOf(change, t), where: whereOf(change, t), source: sourceOf(change), size: _jsx(Size, { minus: minus, plus: plus }), isBreak: change.isBreak === true, t: t, children: [change.text && _jsx(InlineDiff, { text: change.text, t: t }), change.system && change.parts && _jsx("div", { className: css.parts, children: change.parts.map((part, i) => _jsxs("div", { children: [_jsx("span", { className: css.rowIdx, children: part.eventSeq === undefined ? t(`chg.kind.${part.kind}`) : `seq ${part.eventSeq}` }), _jsx("span", { children: part.replacedSeqs === undefined
|
|
71
|
+
? t(part.added.length > 0 ? 'chg.partAdd' : 'chg.partRemove', { range: range(part.added.length > 0 ? part.added : part.removed) })
|
|
72
|
+
: part.added.length === 0
|
|
73
|
+
? t('chg.partEmptied', { replaced: part.replacedSeqs.join('、'), range: range(part.removed) })
|
|
74
|
+
: t('chg.partReplaced', { replaced: part.replacedSeqs.join('、'), range: range(part.added) }) })] }, i)) }), !change.system && !change.text && _jsxs(_Fragment, { children: [_jsx(Rows, { label: t('chg.out'), rows: change.removed, gone: true, t: t }), _jsx(Rows, { label: t('chg.in'), rows: change.added, t: t })] }), change.sameAs && _jsx("div", { className: css.fact, children: t('chg.sameAs', { seq: previous, index: pad(change.sameAs.index) }) }), _jsxs("div", { className: css.links, children: [change.system && onShowCategory && _jsx("button", { type: "button", onClick: () => onShowCategory('system'), children: t('chg.viewSystem') }), change.compactionRequest && onOpenRequest && _jsxs("button", { type: "button", onClick: () => onOpenRequest(change.compactionRequest), children: [t('chg.openCompaction'), " \u2197"] }), change.pruneBefore && onOpenRequest && _jsxs("button", { type: "button", onClick: () => onOpenRequest(change.pruneBefore), children: [t('chg.openPruned', { seq: requestNumberText(change.pruneBefore) }), " \u2197"] })] })] });
|
|
75
|
+
}
|
|
76
|
+
function ToolCard({ change, onShowCategory, t }) {
|
|
77
|
+
const what = change.change !== 'modified' ? t(`chg.tool.${change.change}`)
|
|
78
|
+
: t('chg.tool.changed', { parts: [change.description && t('chg.tool.desc'), change.parameters && t('chg.tool.params')].filter(Boolean).join(t('chg.tool.and')) });
|
|
79
|
+
const plus = (change.description?.addedChars ?? 0) + (change.parameters?.addedChars ?? 0);
|
|
80
|
+
const minus = (change.description?.removedChars ?? 0) + (change.parameters?.removedChars ?? 0);
|
|
81
|
+
return _jsxs(Card, { chip: t('chg.kind.tool'), kind: "tool", title: `${change.name} · ${what}`, where: t('chg.toolWhere'), source: change.owner, size: _jsx(Size, { minus: minus, plus: plus }), isBreak: change.isBreak === true, t: t, children: [change.description && _jsxs(_Fragment, { children: [_jsx("span", { className: css.meta, children: t('chg.tool.desc') }), _jsx(InlineDiff, { text: change.description, t: t })] }), change.parameters && _jsxs(_Fragment, { children: [_jsx("span", { className: css.meta, children: t('chg.tool.params') }), _jsx(InlineDiff, { text: change.parameters, t: t })] }), onShowCategory && _jsx("div", { className: css.links, children: _jsx("button", { type: "button", onClick: () => onShowCategory('tool-definition'), children: t('chg.viewTools') }) })] });
|
|
82
|
+
}
|
|
83
|
+
/** The one-line break marker: where the prefix first differs, or that it does not. */
|
|
84
|
+
function BreakLine({ request, prefix, t }) {
|
|
85
|
+
const broken = prefix.changes?.find(change => change.isBreak);
|
|
86
|
+
const tool = prefix.toolChanges?.find(change => change.isBreak);
|
|
87
|
+
const previous = requestNumberText({ requestNumber: prefix.previousRequestNumber });
|
|
88
|
+
if (prefix.configChanged !== undefined) {
|
|
89
|
+
return _jsxs("div", { className: css.breakLine, children: [_jsx("i", {}), _jsx("b", { children: t('chg.breakConfig') }), _jsxs("span", { className: css.mono, children: [prefix.configChanged.from, " \u2192 ", prefix.configChanged.to] }), _jsx("span", { children: t('chg.configNote') })] });
|
|
90
|
+
}
|
|
91
|
+
if (broken === undefined && tool === undefined && prefix.changed === undefined) {
|
|
92
|
+
return _jsxs("div", { className: css.breakOk, children: [_jsx("i", {}), _jsx("b", { children: t('chg.noBreak') }), _jsx("span", { children: t('lens.prefixSame', { seq: previous, gap: fmtSpan(prefix.gapMs) }) })] });
|
|
93
|
+
}
|
|
94
|
+
if (broken === undefined && tool !== undefined) {
|
|
95
|
+
return _jsxs("div", { className: css.breakLine, children: [_jsx("i", {}), _jsx("b", { children: t('chg.breakTool', { name: tool.name }) }), _jsx("span", { children: t('chg.toolOrder') })] });
|
|
96
|
+
}
|
|
97
|
+
const index = prefix.changed?.index ?? broken?.added[0]?.index ?? broken?.removed[0]?.index ?? 0;
|
|
98
|
+
const category = prefix.changed?.afterCategory ?? prefix.changed?.beforeCategory ?? broken?.added[0]?.category ?? broken?.removed[0]?.category;
|
|
99
|
+
const offset = broken?.system ? broken.text?.offset : prefix.changed?.text?.offset;
|
|
100
|
+
const rows = [...request.segments.system, ...request.segments.history, ...request.segments.added];
|
|
101
|
+
const sameBefore = rows.filter(row => row.index >= 0 && row.index < index).reduce((n, row) => n + row.chars, 0) + (offset ?? 0);
|
|
102
|
+
return _jsxs("div", { className: css.breakLine, children: [_jsx("i", {}), _jsx("b", { children: t('chg.breakAt', { index: pad(index), category: category === undefined ? '' : t(categoryLabelKey(category)) }) }), offset !== undefined && _jsx("span", { className: css.mono, children: t('chg.breakChar', { offset: fmt(offset + 1) }) }), _jsx("span", { children: t('chg.breakReuse', { seq: previous, count: fmt(sameBefore) }) })] });
|
|
103
|
+
}
|
|
104
|
+
export function ChangeList({ request, prefix, onOpenRequest, onShowCategory, t }) {
|
|
105
|
+
const changes = prefix.changes ?? [];
|
|
106
|
+
const tools = prefix.toolChanges ?? [];
|
|
107
|
+
const count = changes.length + tools.length;
|
|
108
|
+
return _jsxs(_Fragment, { children: [_jsx(BreakLine, { request: request, prefix: prefix, t: t }), count > 0 && _jsxs("div", { className: css.listHead, children: [_jsx("h4", { children: t('chg.title') }), _jsx("span", { children: t('chg.count', { count: String(count) }) })] }), _jsxs("div", { className: css.list, children: [changes.map((change, i) => _jsx(MessageCard, { change: change, prefix: prefix, onOpenRequest: onOpenRequest, onShowCategory: onShowCategory, t: t }, `m${i}`)), tools.map(change => _jsx(ToolCard, { change: change, onShowCategory: onShowCategory, t: t }, `t${change.name}`))] }), prefix.tail && _jsx("div", { className: css.tail, children: t('chg.tail', { count: String(prefix.tail.count), sources: prefix.tail.sources.join('、') }) })] });
|
|
109
|
+
}
|
|
@@ -0,0 +1,21 @@
|
|
|
1
|
+
import type { AgentScopeOverview, RequestConfig, RequestListItem } from '../types.ts';
|
|
2
|
+
import type { InspectorTabProps } from './contract.ts';
|
|
3
|
+
type T = InspectorTabProps['t'];
|
|
4
|
+
/** Only dispatch facts, not inferred provider defaults. */
|
|
5
|
+
export declare function ConfigFacts({ config, t }: {
|
|
6
|
+
config?: RequestConfig | undefined;
|
|
7
|
+
t: T;
|
|
8
|
+
}): import("react").JSX.Element;
|
|
9
|
+
/** Consecutive runs preserve A→B→A switches instead of collapsing to one scope snapshot. */
|
|
10
|
+
export declare function configRuns(requests: readonly RequestListItem[]): {
|
|
11
|
+
key: string;
|
|
12
|
+
config?: RequestConfig | undefined;
|
|
13
|
+
requests: RequestListItem[];
|
|
14
|
+
}[];
|
|
15
|
+
export declare function ScopeConfigs({ scope, onOpenRequest, t }: {
|
|
16
|
+
scope: AgentScopeOverview;
|
|
17
|
+
onOpenRequest: (seq: number, scopeId: string) => void;
|
|
18
|
+
t: T;
|
|
19
|
+
}): import("react").JSX.Element | null;
|
|
20
|
+
export {};
|
|
21
|
+
//# sourceMappingURL=ConfigFacts.d.ts.map
|
|
@@ -0,0 +1,30 @@
|
|
|
1
|
+
import { jsx as _jsx, jsxs as _jsxs } from "react/jsx-runtime";
|
|
2
|
+
import { requestNumberText, fmt } from "./aggregate.js";
|
|
3
|
+
import css from './ConfigFacts.module.css';
|
|
4
|
+
/** Only dispatch facts, not inferred provider defaults. */
|
|
5
|
+
export function ConfigFacts({ config = {}, t }) {
|
|
6
|
+
return _jsxs("div", { className: css.facts, role: "group", "aria-label": t('config.title'), title: t('config.hint'), children: [_jsxs("div", { className: css.route, children: [_jsx("b", { children: config.model || t('config.unknown') }), _jsx("span", { children: config.provider || '—' })] }), _jsxs("dl", { children: [_jsxs("div", { children: [_jsx("dt", { children: t('config.effort') }), _jsx("dd", { children: config.reasoningEffort ?? t('config.unknown') })] }), _jsxs("div", { children: [_jsx("dt", { children: t('config.maxTokens') }), _jsx("dd", { children: config.maxTokens === undefined ? t('config.unknown') : `${fmt(config.maxTokens)} tok` })] }), config.temperature !== undefined && _jsxs("div", { children: [_jsx("dt", { children: t('config.temperature') }), _jsx("dd", { children: config.temperature })] })] })] });
|
|
7
|
+
}
|
|
8
|
+
/** Consecutive runs preserve A→B→A switches instead of collapsing to one scope snapshot. */
|
|
9
|
+
export function configRuns(requests) {
|
|
10
|
+
const runs = [];
|
|
11
|
+
for (const r of [...requests].sort((a, b) => a.startedAt - b.startedAt || a.seq - b.seq)) {
|
|
12
|
+
const c = r.config;
|
|
13
|
+
const key = JSON.stringify([c?.provider, c?.model, c?.reasoningEffort, c?.maxTokens, c?.temperature]);
|
|
14
|
+
const last = runs[runs.length - 1];
|
|
15
|
+
if (last?.key === key)
|
|
16
|
+
last.requests.push(r);
|
|
17
|
+
else
|
|
18
|
+
runs.push({ key, config: c, requests: [r] });
|
|
19
|
+
}
|
|
20
|
+
return runs;
|
|
21
|
+
}
|
|
22
|
+
export function ScopeConfigs({ scope, onOpenRequest, t }) {
|
|
23
|
+
const runs = configRuns(scope.requests);
|
|
24
|
+
if (!runs.length)
|
|
25
|
+
return null;
|
|
26
|
+
return _jsxs("section", { className: css.scope, "aria-label": t('config.title'), children: [_jsx("h3", { children: t('config.runs', { count: String(runs.length) }) }), _jsx("div", { className: css.runs, children: runs.map(run => {
|
|
27
|
+
const first = run.requests[0], last = run.requests[run.requests.length - 1];
|
|
28
|
+
return _jsxs("div", { className: css.run, children: [_jsxs("button", { type: "button", "aria-label": t('config.open', { seq: requestNumberText(first) }), onClick: () => onOpenRequest(first.seq, scope.scopeId), children: ["#", requestNumberText(first), last.seq !== first.seq ? ` – #${requestNumberText(last)}` : ''] }), _jsx(ConfigFacts, { config: run.config, t: t })] }, first.seq);
|
|
29
|
+
}) })] });
|
|
30
|
+
}
|
|
@@ -0,0 +1,12 @@
|
|
|
1
|
+
/**
|
|
2
|
+
* 「请求明细」: the session-header utility (`conversation.session.header.
|
|
3
|
+
* utilities`, the worktrees badge's seat). One click opens the inspector tab
|
|
4
|
+
* at the session's latest turn.
|
|
5
|
+
*
|
|
6
|
+
* @module @khorsheed/dsh-context-lens/client
|
|
7
|
+
*/
|
|
8
|
+
import type { ReactNode } from 'react';
|
|
9
|
+
import type { InspectorUtilityProps } from './contract.ts';
|
|
10
|
+
/** The session-header utility icon. */
|
|
11
|
+
export declare function HeaderInspectUtility({ sessionId, openLatest, t }: InspectorUtilityProps): ReactNode;
|
|
12
|
+
//# sourceMappingURL=HeaderUtility.d.ts.map
|
|
@@ -0,0 +1,8 @@
|
|
|
1
|
+
import { jsx as _jsx } from "react/jsx-runtime";
|
|
2
|
+
import { Tooltip } from '@deepseek-ai/dsh-client-ui-primitives';
|
|
3
|
+
import { IconRequestInspectorOutlineMedium } from "./icons-local.js";
|
|
4
|
+
import css from './EntryIcon.module.css';
|
|
5
|
+
/** The session-header utility icon. */
|
|
6
|
+
export function HeaderInspectUtility({ sessionId, openLatest, t }) {
|
|
7
|
+
return (_jsx(Tooltip, { label: t('action.inspect'), side: "bottom", children: _jsx("button", { type: "button", className: css.action, "aria-label": t('action.inspect'), onClick: () => { openLatest(sessionId); }, children: _jsx(IconRequestInspectorOutlineMedium, {}) }) }));
|
|
8
|
+
}
|
|
@@ -0,0 +1,5 @@
|
|
|
1
|
+
/** Session/turn/scope navigation; request detail owns its JSON toggle. */
|
|
2
|
+
import { type ReactNode } from 'react';
|
|
3
|
+
import type { InspectorTabProps } from './contract.ts';
|
|
4
|
+
export declare function InspectorPanel({ sessionId: ownSessionId, useTabInfo, t, listTurns, loadTurns, loadThrough, getTurn, getRequest, getTurnTiming, getSessionTrend, }: InspectorTabProps): ReactNode;
|
|
5
|
+
//# sourceMappingURL=InspectorPanel.d.ts.map
|