@brainpilot/web 0.0.3 → 0.0.5

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.
Files changed (97) hide show
  1. package/dist/assets/index-C-8G4D4j.js +448 -0
  2. package/dist/assets/index-C501m5OS.css +1 -0
  3. package/dist/index.html +2 -2
  4. package/index.html +13 -0
  5. package/package.json +9 -3
  6. package/src/App.tsx +10 -0
  7. package/src/__tests__/api.test.ts +103 -0
  8. package/src/__tests__/messageGroups.test.ts +80 -0
  9. package/src/__tests__/newUiComponents.test.tsx +101 -0
  10. package/src/__tests__/newUiEvents.test.ts +236 -0
  11. package/src/components/chat/AskUserCard.tsx +123 -0
  12. package/src/components/chat/AutoRetryIndicator.tsx +71 -0
  13. package/src/components/chat/ComposerInput.tsx +73 -0
  14. package/src/components/chat/ComposerSendButton.tsx +26 -0
  15. package/src/components/chat/MarkdownMessage.tsx +24 -0
  16. package/src/components/chat/MessageStream.tsx +464 -0
  17. package/src/components/chat/PromptComposer.tsx +398 -0
  18. package/src/components/chat/SystemMessageBubble.tsx +46 -0
  19. package/src/components/demo/DemoFileTree.tsx +146 -0
  20. package/src/components/demo/DemoView.tsx +668 -0
  21. package/src/components/demo/TraceNodeModal.tsx +76 -0
  22. package/src/components/demo/demoBundle.ts +218 -0
  23. package/src/components/demo/demoCache.ts +42 -0
  24. package/src/components/files/FilePreviewView.tsx +153 -0
  25. package/src/components/files/FileSidebar.tsx +664 -0
  26. package/src/components/files/filePreview.ts +113 -0
  27. package/src/components/primitives/CustomSelect.tsx +200 -0
  28. package/src/components/primitives/IconButton.tsx +27 -0
  29. package/src/components/quota/DiskQuotaCriticalDialog.tsx +56 -0
  30. package/src/components/quota/DiskQuotaWarningDialog.tsx +65 -0
  31. package/src/components/quota/QuotaFileManager.tsx +197 -0
  32. package/src/components/search/SearchDialog.tsx +101 -0
  33. package/src/components/session/AgentNetwork.tsx +1240 -0
  34. package/src/components/session/AgentTraceViews.tsx +381 -0
  35. package/src/components/session/AnalyticsTab.tsx +386 -0
  36. package/src/components/session/GlobalOverview.tsx +108 -0
  37. package/src/components/session/NodeTooltip.tsx +127 -0
  38. package/src/components/session/TimelineTab.tsx +320 -0
  39. package/src/components/session/TraceGraphView.tsx +301 -0
  40. package/src/components/session/TraceNodeDetail.tsx +142 -0
  41. package/src/components/session/agentAnalytics.ts +397 -0
  42. package/src/components/session/agentNetworkShared.ts +329 -0
  43. package/src/components/session/traceLayout.ts +150 -0
  44. package/src/components/settings/SettingsDialog.tsx +719 -0
  45. package/src/components/shell/DesktopShell.tsx +236 -0
  46. package/src/components/shell/SandboxBuildingOverlay.tsx +73 -0
  47. package/src/components/shell/SandboxStatus.tsx +287 -0
  48. package/src/components/shell/TerminalDrawer.tsx +387 -0
  49. package/src/components/sidebar/Sidebar.tsx +187 -0
  50. package/src/config.ts +10 -0
  51. package/src/contexts/AppProviders.tsx +20 -0
  52. package/src/contexts/AuthContext.tsx +61 -0
  53. package/src/contexts/PreferencesContext.tsx +125 -0
  54. package/src/contexts/SSEContext.tsx +175 -0
  55. package/src/contexts/SandboxContext.tsx +310 -0
  56. package/src/contexts/SessionContext.tsx +608 -0
  57. package/src/contexts/draftStore.ts +103 -0
  58. package/src/contexts/messageFilters.ts +29 -0
  59. package/src/contexts/messageGroups.ts +77 -0
  60. package/src/contexts/messageReducer.ts +401 -0
  61. package/src/contexts/newUiEvents.ts +190 -0
  62. package/src/contracts/backend.ts +846 -0
  63. package/src/contracts/demoBundle.ts +83 -0
  64. package/src/i18n/messages/analytics.ts +96 -0
  65. package/src/i18n/messages/chat.ts +108 -0
  66. package/src/i18n/messages/contexts.ts +40 -0
  67. package/src/i18n/messages/demo.ts +80 -0
  68. package/src/i18n/messages/files.ts +82 -0
  69. package/src/i18n/messages/network.ts +186 -0
  70. package/src/i18n/messages/profile.ts +40 -0
  71. package/src/i18n/messages/quota.ts +36 -0
  72. package/src/i18n/messages/sandbox.ts +116 -0
  73. package/src/i18n/messages/search.ts +16 -0
  74. package/src/i18n/messages/settings.ts +184 -0
  75. package/src/i18n/messages/shell.ts +38 -0
  76. package/src/i18n/messages/sidebar.ts +52 -0
  77. package/src/i18n/messages/terminal.ts +22 -0
  78. package/src/i18n/messages/trace.ts +84 -0
  79. package/src/i18n/messages.ts +32 -0
  80. package/src/i18n/translate.ts +46 -0
  81. package/src/i18n/types.ts +15 -0
  82. package/src/i18n/useT.ts +15 -0
  83. package/src/main.tsx +13 -0
  84. package/src/mocks/backend.ts +722 -0
  85. package/src/styles/global.css +7429 -0
  86. package/src/styles/tokens.css +161 -0
  87. package/src/utils/api.ts +627 -0
  88. package/src/utils/download.ts +18 -0
  89. package/src/utils/format.ts +7 -0
  90. package/src/utils/zip.ts +119 -0
  91. package/src/vite-env.d.ts +1 -0
  92. package/tsconfig.app.json +22 -0
  93. package/tsconfig.json +7 -0
  94. package/tsconfig.node.json +13 -0
  95. package/vite.config.ts +13 -0
  96. package/dist/assets/index-Cd0Mi_WU.css +0 -1
  97. package/dist/assets/index-FGg-DeYR.js +0 -448
@@ -0,0 +1,83 @@
1
+ import { AgentStatus, ChatMessage, TraceGraph } from "./backend";
2
+
3
+ /**
4
+ * Portable "live demo" bundle — a single self-contained JSON file capturing a
5
+ * session's conversation, reasoning/trace graph, and produced files so it can be
6
+ * shared and replayed offline (in-app import). See the demo player in
7
+ * components/demo/DemoView.tsx.
8
+ */
9
+
10
+ export const DEMO_BUNDLE_FORMAT = "neuro-demo-bundle";
11
+ export const DEMO_BUNDLE_VERSION = 1;
12
+
13
+ /** Per-file embed cap (original bytes). Larger files are recorded but skipped. */
14
+ export const MAX_FILE_BYTES = 2 * 1024 * 1024;
15
+ /** Total embed budget, counted on encoded (base64/utf8) length. */
16
+ export const MAX_TOTAL_BYTES = 25 * 1024 * 1024;
17
+
18
+ /** A raw AG-UI event line from frontend_events.jsonl, carrying a real `_ts`. */
19
+ export interface RawAgUiEvent {
20
+ _ts?: string | number;
21
+ type: string;
22
+ [key: string]: unknown;
23
+ }
24
+
25
+ export interface DemoFile {
26
+ /** Workspace-relative path, e.g. "results/fig1.png". */
27
+ path: string;
28
+ /** Best-effort MIME from the extension. */
29
+ mime: string;
30
+ encoding: "utf8" | "base64";
31
+ /** Original byte size. */
32
+ size: number;
33
+ /** True when the file was not embedded (too large, over budget, or unreadable). */
34
+ truncated: boolean;
35
+ /** Why it was not embedded — distinguishes a real size cap from a read failure. */
36
+ reason?: "tooLarge" | "unreadable";
37
+ /** Human-readable detail for `reason: "unreadable"` (e.g. the backend error). */
38
+ detail?: string;
39
+ /** Omitted when truncated. */
40
+ data?: string;
41
+ }
42
+
43
+ export interface DemoBundle {
44
+ format: typeof DEMO_BUNDLE_FORMAT;
45
+ version: number;
46
+ exportedAt: string;
47
+ appVersion?: string;
48
+ /** "timestamped" = real `events`; "ordered" = pre-folded `messages` fallback. */
49
+ timeline: "timestamped" | "ordered";
50
+
51
+ session: {
52
+ id: string;
53
+ title: string;
54
+ createdAt?: string;
55
+ updatedAt?: string;
56
+ };
57
+
58
+ /** Present iff timeline === "timestamped". Folded by the player at replay. */
59
+ events?: RawAgUiEvent[];
60
+ /** Present iff timeline === "ordered". Already folded ChatMessages. */
61
+ messages?: ChatMessage[];
62
+
63
+ trace: TraceGraph;
64
+ agents: AgentStatus[];
65
+ files: DemoFile[];
66
+ }
67
+
68
+ /** Runtime validation for imported bundles. */
69
+ export function isDemoBundle(value: unknown): value is DemoBundle {
70
+ if (!value || typeof value !== "object") {
71
+ return false;
72
+ }
73
+ const v = value as Record<string, unknown>;
74
+ return (
75
+ v.format === DEMO_BUNDLE_FORMAT &&
76
+ typeof v.version === "number" &&
77
+ typeof v.session === "object" &&
78
+ v.session !== null &&
79
+ typeof v.trace === "object" &&
80
+ v.trace !== null &&
81
+ Array.isArray(v.files)
82
+ );
83
+ }
@@ -0,0 +1,96 @@
1
+ import { defineMessages } from "../types";
2
+
3
+ export default defineMessages(
4
+ {
5
+ // AnalyticsTab
6
+ "analytics.empty": "暂无数据。Agent 开始通信后这里会出现统计图表。",
7
+ "analytics.card.totalMessages": "消息总数",
8
+ "analytics.card.activeAgents": "活跃 Agent",
9
+ "analytics.card.runningNow": "{count} 个正在运行",
10
+ "analytics.card.avgLatency": "平均延迟",
11
+ "analytics.card.median": "中位数 {value}",
12
+ "analytics.card.noPairs": "暂无配对",
13
+ "analytics.card.errors": "错误",
14
+ "analytics.card.allClear": "一切正常",
15
+ "analytics.card.needsAttention": "需要关注",
16
+ "analytics.chart.volume": "消息量(最近一小时)",
17
+ "analytics.chart.load": "Agent 负载",
18
+ "analytics.chart.types": "消息类型",
19
+ "analytics.chart.latency": "响应延迟",
20
+ "analytics.chart.tokens": "Token 估算(已发送)",
21
+ "analytics.chart.heatmap": "活动热力图",
22
+ "analytics.table.agent": "Agent",
23
+ "analytics.table.msgs": "消息数",
24
+ "analytics.table.avgLen": "平均长度",
25
+ "analytics.table.tokens": "~Token",
26
+ "analytics.aria.volume": "消息量随时间变化",
27
+ "analytics.aria.load": "Agent 负载分布",
28
+ "analytics.aria.types": "消息类型分布",
29
+ "analytics.aria.latency": "响应延迟箱线图",
30
+ "analytics.aria.heatmap": "Agent 活动热力图",
31
+ // TimelineTab
32
+ "timeline.empty": "暂无消息。Agent 开始通信后这里会出现时间轴。",
33
+ "timeline.fit": "适应",
34
+ "timeline.filter.delegate": "委派",
35
+ "timeline.filter.result": "结果",
36
+ "timeline.filter.other": "其他",
37
+ "timeline.aria": "消息时间轴",
38
+ "overview.title": "会话概览",
39
+ "overview.agents": "Agent",
40
+ "overview.liveDormant": "{live} 在线 · {dormant} 休眠",
41
+ "overview.total": "共 {total} 个",
42
+ "overview.runningNow": "正在运行",
43
+ "overview.messages": "消息",
44
+ "overview.acrossLinks": "跨 {count} 条连接",
45
+ "overview.avgResponse": "平均响应",
46
+ "overview.median": "中位数 {value}",
47
+ "overview.lastActivity": "最近活动",
48
+ "overview.tipPrefix": "点击节点或消息链接查看详情,或切换到 ",
49
+ "overview.tipSuffix": " 获取更深入的洞察。",
50
+ },
51
+ {
52
+ "analytics.empty": "No data yet. Charts will appear here once agents start communicating.",
53
+ "analytics.card.totalMessages": "Total messages",
54
+ "analytics.card.activeAgents": "Active agents",
55
+ "analytics.card.runningNow": "{count} running now",
56
+ "analytics.card.avgLatency": "Avg latency",
57
+ "analytics.card.median": "median {value}",
58
+ "analytics.card.noPairs": "no pairs yet",
59
+ "analytics.card.errors": "Errors",
60
+ "analytics.card.allClear": "all clear",
61
+ "analytics.card.needsAttention": "needs attention",
62
+ "analytics.chart.volume": "Message volume (last hour)",
63
+ "analytics.chart.load": "Agent load",
64
+ "analytics.chart.types": "Message types",
65
+ "analytics.chart.latency": "Response latency",
66
+ "analytics.chart.tokens": "Token estimate (sent)",
67
+ "analytics.chart.heatmap": "Activity heatmap",
68
+ "analytics.table.agent": "Agent",
69
+ "analytics.table.msgs": "Msgs",
70
+ "analytics.table.avgLen": "Avg len",
71
+ "analytics.table.tokens": "~Tokens",
72
+ "analytics.aria.volume": "Message volume over time",
73
+ "analytics.aria.load": "Agent load distribution",
74
+ "analytics.aria.types": "Message type distribution",
75
+ "analytics.aria.latency": "Response latency box plot",
76
+ "analytics.aria.heatmap": "Agent activity heatmap",
77
+ "timeline.empty": "No messages yet. A timeline will appear here once agents start communicating.",
78
+ "timeline.fit": "Fit",
79
+ "timeline.filter.delegate": "delegate",
80
+ "timeline.filter.result": "result",
81
+ "timeline.filter.other": "other",
82
+ "timeline.aria": "Message timeline",
83
+ "overview.title": "Session Overview",
84
+ "overview.agents": "Agents",
85
+ "overview.liveDormant": "{live} live · {dormant} dormant",
86
+ "overview.total": "{total} total",
87
+ "overview.runningNow": "Running now",
88
+ "overview.messages": "Messages",
89
+ "overview.acrossLinks": "across {count} links",
90
+ "overview.avgResponse": "Avg response",
91
+ "overview.median": "median {value}",
92
+ "overview.lastActivity": "Last activity",
93
+ "overview.tipPrefix": "Click a node or message link for details, or switch to ",
94
+ "overview.tipSuffix": " for deeper insights.",
95
+ },
96
+ );
@@ -0,0 +1,108 @@
1
+ import { defineMessages } from "../types";
2
+
3
+ export default defineMessages(
4
+ {
5
+ "chat.generating": "正在生成...",
6
+ "chat.totalTime": "本轮对话用时 {time}",
7
+ "chat.streaming": "生成中",
8
+ "chat.toolPrefix": "工具:{name}",
9
+ "chat.thinkingSteps": "思考过程 · {count} 步",
10
+ "chat.toolCall": "调用工具:{name}",
11
+ "chat.thinking": "思考中…",
12
+ "chat.heading": "要在 BrainPilot 中研究什么?",
13
+ "chat.aria.messages": "对话消息",
14
+ "chat.messageCount": "{count} 条消息",
15
+ "chat.aria.expandThinking": "展开思考过程",
16
+ "chat.agentThinking": "智能体思考中",
17
+ "chat.aria.stop": "停止生成",
18
+ "chat.stop": "停止",
19
+ "chat.aria.newPrompt": "新的研究提问",
20
+ "chat.srAsk": "提出一个研究问题",
21
+ "chat.placeholder": "向 MAS 提问。输入 @ 使用插件或提及文件",
22
+ "chat.aria.attachContext": "添加上下文",
23
+ "chat.command": "命令",
24
+ "chat.modelPlaceholder": "模型",
25
+ "chat.aria.voice": "语音输入",
26
+ "chat.aria.attachFile": "添加文件",
27
+ "chat.aria.send": "发送消息",
28
+ "chat.copy": "复制",
29
+ "chat.copied": "已复制",
30
+ "chat.aria.copyMessage": "复制消息",
31
+ "chat.aria.suggested": "推荐研究任务",
32
+ "chat.noActiveProvider": "无活动服务商",
33
+ "chat.providerTitle": "服务商:{name}",
34
+ "chat.status.startSandbox": "请先启动 sandbox。",
35
+ "chat.status.preparing": "正在准备发送。",
36
+ "chat.status.connecting": "正在连接实时通道。",
37
+ "chat.error.saveModel": "保存模型选择失败:{msg}",
38
+ "chat.error.reloadConfig": "模型已保存,但容器热更新失败:{msg}",
39
+ "chat.system.info": "信息",
40
+ "chat.system.warning": "警告",
41
+ "chat.system.error": "错误",
42
+ "chat.system.fatal": "严重错误",
43
+ "chat.system.details": "技术详情",
44
+ "chat.ask.title": "需要你的输入",
45
+ "chat.ask.freeTextPlaceholder": "输入你的回答…",
46
+ "chat.ask.submit": "提交",
47
+ "chat.ask.answered": "已回答:{answer}",
48
+ "chat.ask.timeoutLeft": "剩余 {sec} 秒",
49
+ "chat.ask.timedOut": "已超时",
50
+ "chat.retry.title": "自动重试中",
51
+ "chat.retry.attempt": "第 {attempt}/{max} 次尝试",
52
+ "chat.retry.countdown": "{sec} 秒后重试",
53
+ "chat.retry.cancel": "取消",
54
+ "chat.retry.cancelled": "已取消重试",
55
+ },
56
+ {
57
+ "chat.generating": "Generating...",
58
+ "chat.totalTime": "Total time: {time}",
59
+ "chat.streaming": "streaming",
60
+ "chat.toolPrefix": "Tool: {name}",
61
+ "chat.thinkingSteps": "Thinking · {count} steps",
62
+ "chat.toolCall": "Calling tool: {name}",
63
+ "chat.thinking": "Thinking…",
64
+ "chat.heading": "What would you like to research in BrainPilot?",
65
+ "chat.aria.messages": "Conversation messages",
66
+ "chat.messageCount": "{count} messages",
67
+ "chat.aria.expandThinking": "Expand thinking process",
68
+ "chat.agentThinking": "Agent is thinking",
69
+ "chat.aria.stop": "Stop generating",
70
+ "chat.stop": "stop",
71
+ "chat.aria.newPrompt": "New research prompt",
72
+ "chat.srAsk": "Ask a research question",
73
+ "chat.placeholder": "Ask MAS. Type @ to use plugins or mention files",
74
+ "chat.aria.attachContext": "Attach context",
75
+ "chat.command": "command",
76
+ "chat.modelPlaceholder": "Model",
77
+ "chat.aria.voice": "Voice input",
78
+ "chat.aria.attachFile": "Attach file",
79
+ "chat.aria.send": "Send message",
80
+ "chat.copy": "Copy",
81
+ "chat.copied": "Copied",
82
+ "chat.aria.copyMessage": "Copy message",
83
+ "chat.aria.suggested": "Suggested research tasks",
84
+ "chat.noActiveProvider": "No active provider",
85
+ "chat.providerTitle": "Provider: {name}",
86
+ "chat.status.startSandbox": "Please start the sandbox first.",
87
+ "chat.status.preparing": "Preparing to send.",
88
+ "chat.status.connecting": "Connecting to the live channel.",
89
+ "chat.error.saveModel": "Failed to save model selection: {msg}",
90
+ "chat.error.reloadConfig": "Model saved, but container hot-reload failed: {msg}",
91
+ "chat.system.info": "Info",
92
+ "chat.system.warning": "Warning",
93
+ "chat.system.error": "Error",
94
+ "chat.system.fatal": "Fatal error",
95
+ "chat.system.details": "Technical details",
96
+ "chat.ask.title": "Your input is needed",
97
+ "chat.ask.freeTextPlaceholder": "Type your answer…",
98
+ "chat.ask.submit": "Submit",
99
+ "chat.ask.answered": "Answered: {answer}",
100
+ "chat.ask.timeoutLeft": "{sec}s left",
101
+ "chat.ask.timedOut": "Timed out",
102
+ "chat.retry.title": "Auto-retrying",
103
+ "chat.retry.attempt": "Attempt {attempt}/{max}",
104
+ "chat.retry.countdown": "Retrying in {sec}s",
105
+ "chat.retry.cancel": "Cancel",
106
+ "chat.retry.cancelled": "Retry cancelled",
107
+ },
108
+ );
@@ -0,0 +1,40 @@
1
+ import { defineMessages } from "../types";
2
+
3
+ export default defineMessages(
4
+ {
5
+ "ctx.session.loadFailed": "加载会话失败",
6
+ "ctx.session.updateFailed": "更新会话失败",
7
+ "ctx.session.deleteFailed": "删除会话失败",
8
+ "ctx.session.startSandbox": "请先启动 sandbox",
9
+ "ctx.session.createFailed": "创建会话失败",
10
+ "ctx.session.newSession": "新研究会话",
11
+ "ctx.session.noConnection": "实时连接尚未建立",
12
+ "ctx.session.sendFailed": "发送失败",
13
+ "ctx.session.interruptFailed": "中断失败",
14
+ "ctx.session.refreshFailed": "刷新消息失败",
15
+ "ctx.sandbox.loadFailed": "加载沙箱失败",
16
+ "ctx.sandbox.createFailed": "创建沙箱失败",
17
+ "ctx.sandbox.rebuildFailed": "重建沙箱失败",
18
+ "ctx.sandbox.deleteFailed": "删除沙箱失败",
19
+ "ctx.sandbox.reloadFailed": "热更新失败",
20
+ "ctx.sse.parseError": "无法解析 SSE 事件",
21
+ },
22
+ {
23
+ "ctx.session.loadFailed": "Failed to load sessions",
24
+ "ctx.session.updateFailed": "Failed to update session",
25
+ "ctx.session.deleteFailed": "Failed to delete session",
26
+ "ctx.session.startSandbox": "Please start the sandbox first",
27
+ "ctx.session.createFailed": "Failed to create session",
28
+ "ctx.session.newSession": "New research session",
29
+ "ctx.session.noConnection": "Live connection not established yet",
30
+ "ctx.session.sendFailed": "Failed to send",
31
+ "ctx.session.interruptFailed": "Failed to interrupt",
32
+ "ctx.session.refreshFailed": "Failed to refresh messages",
33
+ "ctx.sandbox.loadFailed": "Failed to load sandbox",
34
+ "ctx.sandbox.createFailed": "Failed to create sandbox",
35
+ "ctx.sandbox.rebuildFailed": "Failed to rebuild sandbox",
36
+ "ctx.sandbox.deleteFailed": "Failed to delete sandbox",
37
+ "ctx.sandbox.reloadFailed": "Hot-reload failed",
38
+ "ctx.sse.parseError": "Unable to parse SSE event",
39
+ },
40
+ );
@@ -0,0 +1,80 @@
1
+ import { defineMessages } from "../types";
2
+
3
+ export default defineMessages(
4
+ {
5
+ "demo.title": "Live Demo",
6
+ "demo.eyebrow": "推理过程回放",
7
+ "demo.landing.heading": "生成或导入一个 Live Demo",
8
+ "demo.landing.subtitle": "把一次对话打包成可分享的回放,或导入他人分享的 demo。",
9
+ "demo.landing.fromSession.title": "从已有对话生成",
10
+ "demo.landing.fromSession.desc": "选择一个会话,打包对话、推理图与产出文件。",
11
+ "demo.landing.fromSession.empty": "暂无会话",
12
+ "demo.landing.import.title": "导入本地文件",
13
+ "demo.landing.import.desc": "打开一个 .json demo 文件进行离线回放。",
14
+ "demo.landing.import.button": "点击选择文件",
15
+ "demo.landing.import.dropHint": "或将 .json 文件拖到此处",
16
+ "demo.packing": "正在打包…",
17
+ "demo.exportButton": "导出 Live Demo",
18
+ "demo.reselect": "重新选择",
19
+ "demo.error.build": "生成 demo 失败",
20
+ "demo.error.parse": "无法读取该文件",
21
+ "demo.files.title": "产出文件",
22
+ "demo.files.empty": "本 demo 未包含文件",
23
+ "demo.files.skipped": "已跳过(过大)",
24
+ "demo.files.unreadable": "读取失败",
25
+ "demo.files.noSandbox": "打包时无运行中的沙箱,文件未嵌入",
26
+ "demo.files.none": "选择一个文件以预览",
27
+ "demo.tree.title": "文件树",
28
+ "demo.trace.title": "推理图",
29
+ "demo.conversation.title": "对话",
30
+ "demo.conversation.empty": "回放到此处尚无对话内容。",
31
+ "demo.transport.play": "播放",
32
+ "demo.transport.pause": "暂停",
33
+ "demo.transport.prev": "上一步",
34
+ "demo.transport.next": "下一步",
35
+ "demo.transport.restart": "重新开始",
36
+ "demo.transport.speed": "速度",
37
+ "demo.transport.step": "第 {index}/{total} 步",
38
+ "demo.node.modalClose": "关闭",
39
+ "demo.meta.exported": "导出于 {time}",
40
+ "demo.meta.steps": "{visible} / {total} 节点",
41
+ },
42
+ {
43
+ "demo.title": "Live Demo",
44
+ "demo.eyebrow": "Reasoning replay",
45
+ "demo.landing.heading": "Generate or import a Live Demo",
46
+ "demo.landing.subtitle": "Package a conversation into a shareable replay, or import one shared with you.",
47
+ "demo.landing.fromSession.title": "Generate from a conversation",
48
+ "demo.landing.fromSession.desc": "Pick a session to package its conversation, reasoning graph, and produced files.",
49
+ "demo.landing.fromSession.empty": "No conversations yet",
50
+ "demo.landing.import.title": "Import a local file",
51
+ "demo.landing.import.desc": "Open a .json demo file for offline replay.",
52
+ "demo.landing.import.button": "Click to choose a file",
53
+ "demo.landing.import.dropHint": "or drag a .json file here",
54
+ "demo.packing": "Packing…",
55
+ "demo.exportButton": "Export Live Demo",
56
+ "demo.reselect": "Start over",
57
+ "demo.error.build": "Failed to generate demo",
58
+ "demo.error.parse": "Could not read that file",
59
+ "demo.files.title": "Produced files",
60
+ "demo.files.empty": "This demo contains no files",
61
+ "demo.files.skipped": "skipped (too large)",
62
+ "demo.files.unreadable": "unreadable",
63
+ "demo.files.noSandbox": "No running sandbox at pack time; files not embedded",
64
+ "demo.files.none": "Select a file to preview",
65
+ "demo.tree.title": "Files",
66
+ "demo.trace.title": "Reasoning graph",
67
+ "demo.conversation.title": "Conversation",
68
+ "demo.conversation.empty": "No conversation revealed at this point yet.",
69
+ "demo.transport.play": "Play",
70
+ "demo.transport.pause": "Pause",
71
+ "demo.transport.prev": "Previous step",
72
+ "demo.transport.next": "Next step",
73
+ "demo.transport.restart": "Restart",
74
+ "demo.transport.speed": "Speed",
75
+ "demo.transport.step": "Step {index}/{total}",
76
+ "demo.node.modalClose": "Close",
77
+ "demo.meta.exported": "Exported {time}",
78
+ "demo.meta.steps": "{visible} / {total} nodes",
79
+ },
80
+ );
@@ -0,0 +1,82 @@
1
+ import { defineMessages } from "../types";
2
+
3
+ export default defineMessages(
4
+ {
5
+ "files.aria.sidebar": "工作区文件",
6
+ "files.aria.resizeSidebar": "调整文件栏宽度",
7
+ "files.eyebrow.workspace": "工作区",
8
+ "files.title": "文件",
9
+ "files.selectedCount": "已选 {count} 个",
10
+ "files.packing": "打包中",
11
+ "files.download": "下载",
12
+ "files.aria.clearSelection": "清除文件选择",
13
+ "files.aria.refresh": "刷新文件",
14
+ "files.aria.close": "关闭文件",
15
+ "files.live": "实时后端",
16
+ "files.offline": "沙盒离线",
17
+ "files.aria.tree": "文件树",
18
+ "files.selectForDownload": "选择 {name} 以下载",
19
+ "files.error.notRunning": "Sandbox 未运行,无法读取文件。",
20
+ "files.error.downloadFailed": "下载文件失败",
21
+ "files.error.refreshFailed": "刷新文件失败",
22
+ "files.error.previewFailed": "无法预览文件",
23
+ "files.error.loadPreviewFailed": "无法加载文件预览",
24
+ "files.preview.aria": "文件预览",
25
+ "files.preview.ariaResize": "调整预览宽度",
26
+ "files.preview.eyebrow": "预览",
27
+ "files.preview.downloading": "下载中",
28
+ "files.preview.download": "下载",
29
+ "files.preview.restore": "还原预览",
30
+ "files.preview.maximize": "最大化预览",
31
+ "files.preview.close": "关闭预览",
32
+ "files.preview.path": "路径",
33
+ "files.preview.size": "大小",
34
+ "files.preview.modified": "修改时间",
35
+ "files.preview.mode": "权限",
36
+ "files.preview.tooLarge": "该文件超过内嵌预览大小上限,可下载后查看。",
37
+ "files.preview.unreadable": "打包时无法读取该文件(可能路径无效或不在当前沙箱中)。",
38
+ "files.preview.loadingImage": "正在加载图片…",
39
+ "files.preview.loadingPdf": "正在加载 PDF…",
40
+ "files.preview.notPreviewable": "该文件类型可下载,但不支持内嵌预览。",
41
+ "files.preview.loading": "正在加载预览…",
42
+ },
43
+ {
44
+ "files.aria.sidebar": "Workspace files",
45
+ "files.aria.resizeSidebar": "Resize files sidebar",
46
+ "files.eyebrow.workspace": "Workspace",
47
+ "files.title": "Files",
48
+ "files.selectedCount": "{count} selected",
49
+ "files.packing": "Packing",
50
+ "files.download": "Download",
51
+ "files.aria.clearSelection": "Clear file selection",
52
+ "files.aria.refresh": "Refresh files",
53
+ "files.aria.close": "Close files",
54
+ "files.live": "live backend",
55
+ "files.offline": "sandbox offline",
56
+ "files.aria.tree": "File tree",
57
+ "files.selectForDownload": "Select {name} for download",
58
+ "files.error.notRunning": "Sandbox is not running; cannot read files.",
59
+ "files.error.downloadFailed": "Failed to download file",
60
+ "files.error.refreshFailed": "Failed to refresh files",
61
+ "files.error.previewFailed": "Unable to preview file",
62
+ "files.error.loadPreviewFailed": "Unable to load file preview",
63
+ "files.preview.aria": "File preview",
64
+ "files.preview.ariaResize": "Resize file preview",
65
+ "files.preview.eyebrow": "Preview",
66
+ "files.preview.downloading": "Downloading",
67
+ "files.preview.download": "Download",
68
+ "files.preview.restore": "Restore preview",
69
+ "files.preview.maximize": "Maximize preview",
70
+ "files.preview.close": "Close preview",
71
+ "files.preview.path": "Path",
72
+ "files.preview.size": "Size",
73
+ "files.preview.modified": "Modified",
74
+ "files.preview.mode": "Mode",
75
+ "files.preview.tooLarge": "This file is larger than the inline preview limit; download it to view.",
76
+ "files.preview.unreadable": "This file could not be read when the demo was packaged (path invalid or not in the current sandbox).",
77
+ "files.preview.loadingImage": "Loading image...",
78
+ "files.preview.loadingPdf": "Loading PDF...",
79
+ "files.preview.notPreviewable": "This file type is available for download but is not previewed inline.",
80
+ "files.preview.loading": "Loading preview...",
81
+ },
82
+ );