@springbrand/message-panel 0.1.3-alpha.32 → 0.1.3-alpha.34
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/cloud-os/chat/cloud-os-chat-messages.tsx +44 -178
- package/cloud-os/chat/rich-blocks.tsx +276 -247
- package/cloud-os/chat/tool-rows.tsx +69 -306
- package/cloud-os/chat/transcript-model.ts +1 -108
- package/cloud-os/index.ts +0 -5
- package/cloud-os/styles/cloud-os.css +0 -12
- package/demo/chat-scenarios.ts +3 -9
- package/package.json +1 -1
- package/cloud-os/assets/thinking-spark.svg +0 -9
- package/cloud-os/chat/use-lifecycle-disclosure.ts +0 -65
|
@@ -51,8 +51,6 @@
|
|
|
51
51
|
--color-kumo-success: oklch(72.3% 0.219 149.579);
|
|
52
52
|
--color-kumo-success-tint: oklch(92% 0.08 150);
|
|
53
53
|
|
|
54
|
-
--color-operation-base: #ffffff;
|
|
55
|
-
|
|
56
54
|
--color-kumo-tip-shadow: #14111014;
|
|
57
55
|
--color-kumo-tip-stroke: transparent;
|
|
58
56
|
|
|
@@ -75,10 +73,6 @@
|
|
|
75
73
|
--color-cos-status-live: oklch(72.3% 0.219 149.579);
|
|
76
74
|
--color-cos-status-draft: oklch(68.1% 0.162 75.834);
|
|
77
75
|
--color-cos-status-building: oklch(62.3% 0.214 259.815);
|
|
78
|
-
--text-color-cos-work-description: rgba(0, 0, 0, 0.5);
|
|
79
|
-
--text-color-cos-work-description-subtle: rgba(0, 0, 0, 0.7);
|
|
80
|
-
--text-color-cos-tool-group: rgba(0, 0, 0, 0.5);
|
|
81
|
-
--text-color-cos-output: #000000b3;
|
|
82
76
|
}
|
|
83
77
|
|
|
84
78
|
/* ── 作用域根:通用 token 只在 cloud-os 子树内生效 ─────────────────────────── */
|
|
@@ -158,8 +152,6 @@
|
|
|
158
152
|
--color-kumo-success: oklch(52.7% 0.154 150.069);
|
|
159
153
|
--color-kumo-success-tint: oklch(0.25 0.06 150.069);
|
|
160
154
|
|
|
161
|
-
--color-operation-base: var(--color-kumo-base);
|
|
162
|
-
|
|
163
155
|
--color-kumo-tip-shadow: #00000066;
|
|
164
156
|
--color-kumo-tip-stroke: oklch(0.34 0.022 285);
|
|
165
157
|
|
|
@@ -180,10 +172,6 @@
|
|
|
180
172
|
--color-cos-status-live: oklch(79.2% 0.209 151.711);
|
|
181
173
|
--color-cos-status-draft: oklch(82.8% 0.189 84.429);
|
|
182
174
|
--color-cos-status-building: oklch(74% 0.16 250);
|
|
183
|
-
--text-color-cos-work-description: var(--text-color-kumo-subtle);
|
|
184
|
-
--text-color-cos-work-description-subtle: var(--text-color-kumo-subtle);
|
|
185
|
-
--text-color-cos-tool-group: var(--text-color-kumo-inactive);
|
|
186
|
-
--text-color-cos-output: var(--text-color-kumo-subtle);
|
|
187
175
|
|
|
188
176
|
--color-selection-bg: color-mix(in srgb, var(--color-kumo-brand) 28%, transparent);
|
|
189
177
|
--color-selection-text: oklch(0.97 0.006 285);
|
package/demo/chat-scenarios.ts
CHANGED
|
@@ -18,7 +18,6 @@ export interface ComposerCommandLike {
|
|
|
18
18
|
}
|
|
19
19
|
const demoCompletedAt = Date.now() - 1_000;
|
|
20
20
|
const demoTurnStartedAt = demoCompletedAt - 18_000;
|
|
21
|
-
const demoTurnId = "camel-demo-research-turn";
|
|
22
21
|
export const defaultPrompt =
|
|
23
22
|
"请调研 2026 年 AI Agent 产品的交互趋势,并给出可落地的消息 UI 建议。";
|
|
24
23
|
export const demoModels = [
|
|
@@ -745,7 +744,7 @@ const commandMessages = [
|
|
|
745
744
|
const runningWork = {
|
|
746
745
|
id: "camel-demo-running-work",
|
|
747
746
|
role: "assistant",
|
|
748
|
-
metadata: {
|
|
747
|
+
metadata: { turnStartedAt: demoTurnStartedAt },
|
|
749
748
|
parts: [
|
|
750
749
|
{
|
|
751
750
|
type: "reasoning",
|
|
@@ -772,7 +771,7 @@ const runningWork = {
|
|
|
772
771
|
const completedResearch = {
|
|
773
772
|
id: "camel-demo-completed-research",
|
|
774
773
|
role: "assistant",
|
|
775
|
-
metadata: {
|
|
774
|
+
metadata: { turnStartedAt: demoTurnStartedAt },
|
|
776
775
|
parts: [
|
|
777
776
|
{
|
|
778
777
|
type: "reasoning",
|
|
@@ -807,7 +806,6 @@ const completedResearch = {
|
|
|
807
806
|
const completedSynthesis = {
|
|
808
807
|
id: "camel-demo-completed-synthesis",
|
|
809
808
|
role: "assistant",
|
|
810
|
-
metadata: { turnId: demoTurnId },
|
|
811
809
|
parts: [
|
|
812
810
|
{
|
|
813
811
|
type: "tool-update_plan",
|
|
@@ -839,7 +837,6 @@ const completedSynthesis = {
|
|
|
839
837
|
const approvalRequest = {
|
|
840
838
|
id: "camel-demo-approval-request",
|
|
841
839
|
role: "assistant",
|
|
842
|
-
metadata: { turnId: demoTurnId },
|
|
843
840
|
parts: [
|
|
844
841
|
{
|
|
845
842
|
type: "tool-write_file",
|
|
@@ -855,7 +852,6 @@ const approvalRequest = {
|
|
|
855
852
|
const collectedAnswer = {
|
|
856
853
|
id: "camel-demo-collected-answer",
|
|
857
854
|
role: "assistant",
|
|
858
|
-
metadata: { turnId: demoTurnId },
|
|
859
855
|
parts: [
|
|
860
856
|
{
|
|
861
857
|
type: "text",
|
|
@@ -872,7 +868,6 @@ const finalAnswer = {
|
|
|
872
868
|
id: "camel-demo-final-answer",
|
|
873
869
|
role: "assistant",
|
|
874
870
|
metadata: {
|
|
875
|
-
turnId: demoTurnId,
|
|
876
871
|
createdAt: demoCompletedAt,
|
|
877
872
|
completedAt: demoCompletedAt,
|
|
878
873
|
turnDurationMs: 18_000,
|
|
@@ -941,7 +936,6 @@ const interruptedByUser = {
|
|
|
941
936
|
id: "camel-demo-interrupted",
|
|
942
937
|
role: "assistant",
|
|
943
938
|
metadata: {
|
|
944
|
-
turnId: demoTurnId,
|
|
945
939
|
createdAt: demoCompletedAt,
|
|
946
940
|
completedAt: demoCompletedAt + 2_000,
|
|
947
941
|
turnDurationMs: 2_000,
|
|
@@ -971,7 +965,7 @@ const compactSummary = {
|
|
|
971
965
|
const failedWork = {
|
|
972
966
|
id: "camel-demo-failed-work",
|
|
973
967
|
role: "assistant",
|
|
974
|
-
metadata: {
|
|
968
|
+
metadata: { turnStartedAt: demoTurnStartedAt },
|
|
975
969
|
parts: [
|
|
976
970
|
...completedResearch.parts,
|
|
977
971
|
{
|
package/package.json
CHANGED
|
@@ -1,9 +0,0 @@
|
|
|
1
|
-
<svg preserveAspectRatio="none" overflow="visible" width="12.2369" height="12.2369" viewBox="0 0 12.2369 12.2369" fill="none" xmlns="http://www.w3.org/2000/svg">
|
|
2
|
-
<path d="M5.18061 0.652963C5.50276 -0.217655 6.73415 -0.217654 7.05631 0.652964L7.64089 2.23277C8.04603 3.32764 8.90927 4.19089 10.0042 4.59603L11.584 5.18061C12.4546 5.50276 12.4546 6.73415 11.584 7.05631L10.0041 7.64089C8.90927 8.04603 8.04603 8.90927 7.64089 10.0042L7.05631 11.584C6.73415 12.4546 5.50276 12.4546 5.18061 11.584L4.59603 10.0041C4.19089 8.90927 3.32764 8.04603 2.23277 7.64089L0.652963 7.05631C-0.217655 6.73415 -0.217654 5.50276 0.652964 5.18061L2.23277 4.59603C3.32764 4.19089 4.19089 3.32764 4.59603 2.23277L5.18061 0.652963Z" fill="url(#thinking-spark-gradient)"/>
|
|
3
|
-
<defs>
|
|
4
|
-
<radialGradient id="thinking-spark-gradient" cx="0" cy="0" r="1" gradientUnits="userSpaceOnUse" gradientTransform="translate(6.11846 2.11846) rotate(90) scale(12)">
|
|
5
|
-
<stop stop-color="#FF9938"/>
|
|
6
|
-
<stop offset="1" stop-color="#FFE46C"/>
|
|
7
|
-
</radialGradient>
|
|
8
|
-
</defs>
|
|
9
|
-
</svg>
|
|
@@ -1,65 +0,0 @@
|
|
|
1
|
-
import { useCallback, useEffect, useRef, useState } from "react";
|
|
2
|
-
|
|
3
|
-
export type DisclosurePolicy = "always-open" | "lifecycle";
|
|
4
|
-
|
|
5
|
-
export const DISCLOSURE_POLICY: DisclosurePolicy = "lifecycle";
|
|
6
|
-
|
|
7
|
-
export function reconcileExpandedWithAutoOpen(
|
|
8
|
-
expanded: ReadonlySet<string>,
|
|
9
|
-
previousAutoOpenKeys: ReadonlySet<string>,
|
|
10
|
-
autoOpenKeys: ReadonlySet<string>,
|
|
11
|
-
): ReadonlySet<string> {
|
|
12
|
-
const next = new Set(expanded);
|
|
13
|
-
for (const key of previousAutoOpenKeys) {
|
|
14
|
-
if (!autoOpenKeys.has(key)) next.delete(key);
|
|
15
|
-
}
|
|
16
|
-
for (const key of autoOpenKeys) {
|
|
17
|
-
if (!previousAutoOpenKeys.has(key)) next.add(key);
|
|
18
|
-
}
|
|
19
|
-
if (next.size !== expanded.size) return next;
|
|
20
|
-
return [...next].every((key) => expanded.has(key)) ? expanded : next;
|
|
21
|
-
}
|
|
22
|
-
|
|
23
|
-
export function useDisclosureExpandedKeys(
|
|
24
|
-
disclosureKeys: ReadonlySet<string>,
|
|
25
|
-
runningKeys: ReadonlySet<string>,
|
|
26
|
-
) {
|
|
27
|
-
const autoOpenKeys =
|
|
28
|
-
DISCLOSURE_POLICY === "always-open" ? disclosureKeys : runningKeys;
|
|
29
|
-
const [expanded, setExpanded] = useState<ReadonlySet<string>>(autoOpenKeys);
|
|
30
|
-
const previousAutoOpenKeys = useRef(autoOpenKeys);
|
|
31
|
-
|
|
32
|
-
useEffect(() => {
|
|
33
|
-
const previous = previousAutoOpenKeys.current;
|
|
34
|
-
previousAutoOpenKeys.current = autoOpenKeys;
|
|
35
|
-
setExpanded((current) =>
|
|
36
|
-
reconcileExpandedWithAutoOpen(current, previous, autoOpenKeys),
|
|
37
|
-
);
|
|
38
|
-
}, [autoOpenKeys]);
|
|
39
|
-
|
|
40
|
-
const toggle = useCallback((key: string) => {
|
|
41
|
-
setExpanded((current) => {
|
|
42
|
-
const next = new Set(current);
|
|
43
|
-
if (next.has(key)) next.delete(key);
|
|
44
|
-
else next.add(key);
|
|
45
|
-
return next;
|
|
46
|
-
});
|
|
47
|
-
}, []);
|
|
48
|
-
|
|
49
|
-
return [expanded, toggle] as const;
|
|
50
|
-
}
|
|
51
|
-
|
|
52
|
-
/** User choice persists while the policy-derived automatic state is unchanged. */
|
|
53
|
-
export function useLifecycleDisclosure(running: boolean) {
|
|
54
|
-
const autoOpen = DISCLOSURE_POLICY === "always-open" || running;
|
|
55
|
-
const [state, setState] = useState(() => ({ autoOpen, open: autoOpen }));
|
|
56
|
-
const open = state.autoOpen === autoOpen ? state.open : autoOpen;
|
|
57
|
-
|
|
58
|
-
useEffect(() => {
|
|
59
|
-
setState((current) =>
|
|
60
|
-
current.autoOpen === autoOpen ? current : { autoOpen, open: autoOpen }
|
|
61
|
-
);
|
|
62
|
-
}, [autoOpen]);
|
|
63
|
-
|
|
64
|
-
return [open, () => setState({ autoOpen, open: !open })] as const;
|
|
65
|
-
}
|