diff --git a/packages/web/src/components/Share.tsx b/packages/web/src/components/Share.tsx index 99ed3e13..619b8874 100644 --- a/packages/web/src/components/Share.tsx +++ b/packages/web/src/components/Share.tsx @@ -399,21 +399,12 @@ export default function Share(props: { api: string }) { }) }) - const models = createMemo(() => { - const result: string[][] = [] - for (const msg of messages()) { - if (msg.role === "assistant" && msg.metadata?.assistant) { - result.push([ - msg.metadata.assistant.providerID, - msg.metadata.assistant.modelID, - ]) - } - } - return result - }) - - const metrics = createMemo(() => { + const data = createMemo(() => { const result = { + created: undefined as number | undefined, + system: [] as string[], + messages: [] as SessionMessage[], + models: [] as string[][], cost: 0, tokens: { input: 0, @@ -421,16 +412,39 @@ export default function Share(props: { api: string }) { reasoning: 0, }, } - for (const msg of messages()) { + for (let i = 0; i < messages().length; i++) { + const msg = messages()[i] + + const system = i === 0 && msg.role === "system" const assistant = msg.metadata?.assistant - if (!assistant) continue - result.cost += assistant.cost - result.tokens.input += assistant.tokens.input - result.tokens.output += assistant.tokens.output - result.tokens.reasoning += assistant.tokens.reasoning + + if (system) { + for (const part of msg.parts) { + if (part.type === "text") { + result.system.push(part.text) + } + } + result.created = msg.metadata?.time.created + continue + } + + result.messages.push(msg) + + if (assistant) { + result.cost += assistant.cost + result.tokens.input += assistant.tokens.input + result.tokens.output += assistant.tokens.output + result.tokens.reasoning += assistant.tokens.reasoning + + result.models.push([ + assistant.providerID, + assistant.modelID, + ]) + } } return result }) + const [showingSystemPrompt, showSystemPrompt] = createSignal(false) return (
@@ -439,14 +453,14 @@ export default function Share(props: { api: string }) {

{store.info?.title}

- {messages().length > 0 && messages()[0].metadata?.time.created ? ( + {data().created ? ( {DateTime.fromMillis( - messages()[0].metadata?.time.created || 0, + data().created || 0, ).toLocaleString(DateTime.DATE_MED)} ) : ( @@ -465,40 +479,40 @@ export default function Share(props: { api: string }) {
  • Cost - {metrics().cost !== undefined ? ( - ${metrics().cost.toFixed(2)} + {data().cost !== undefined ? ( + ${data().cost.toFixed(2)} ) : ( )}
  • Input Tokens - {metrics().tokens.input ? ( - {metrics().tokens.input} + {data().tokens.input ? ( + {data().tokens.input} ) : ( )}
  • Output Tokens - {metrics().tokens.output ? ( - {metrics().tokens.output} + {data().tokens.output ? ( + {data().tokens.output} ) : ( )}
  • Reasoning Tokens - {metrics().tokens.reasoning ? ( - {metrics().tokens.reasoning} + {data().tokens.reasoning ? ( + {data().tokens.reasoning} ) : ( )}
    - {models().length > 0 ? ( - + {data().models.length > 0 ? ( + {([provider, model]) => (
  • @@ -515,16 +529,44 @@ export default function Share(props: { api: string }) {
  • )}
+
+
+ +
+
+ + + + +
+
0} + when={data().messages.length > 0} fallback={

Waiting for messages...

} >
- + {(msg, msgIndex) => ( {(part, partIndex) => { @@ -537,13 +579,9 @@ export default function Share(props: { api: string }) { const [results, showResults] = createSignal(false) const isLastPart = createMemo( () => - messages().length === msgIndex() + 1 && + data().messages.length === msgIndex() + 1 && msg.parts.length === partIndex() + 1, ) - const time = - msg.metadata?.time.completed || - msg.metadata?.time.created || - 0 return ( {/* User text */} @@ -918,11 +956,11 @@ export default function Share(props: { api: string }) { }} > 0} + when={data().messages.length > 0} fallback={

Waiting for messages...

} >
    - + {(msg) => (
  • div { + flex: 0 0 auto; display: flex; flex-direction: column; gap: 0.5rem; @@ -127,6 +119,11 @@ -webkit-box-orient: vertical; -webkit-line-clamp: 2; overflow: hidden; + + @media (max-width: 30rem) { + font-size: 1.25rem; + -webkit-line-clamp: 3; + } } [data-section="stats"] { @@ -163,10 +160,34 @@ } span[data-stat-model] { - color: var(sl-color-text); + color: var(--sl-color-text); } } } + [data-section="system-prompt"] { + display: flex; + gap: 0.3125rem; + + [data-section="icon"] { + flex: 0 0 auto; + color: var(--sl-color-text-dimmed); + opacity: 0.85; + svg { + display: block; + } + } + + [data-section="content"] { + display: flex; + flex-direction: column; + gap: 0.5rem; + } + + button { + line-height: 1rem; + font-size: 0.875rem; + } + } } .parts {