openclaw-agent-dashboard 1.0.21 → 1.0.23

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 (135) hide show
  1. package/README.md +55 -321
  2. package/frontend-dist/assets/index-B7XqKAxm.css +1 -0
  3. package/frontend-dist/assets/index-CxJaSYyo.js +24 -0
  4. package/{frontend → frontend-dist}/index.html +2 -1
  5. package/{plugin/openclaw.plugin.json → openclaw.plugin.json} +2 -2
  6. package/package.json +21 -13
  7. package/.github/workflows/release.yml +0 -56
  8. package/VERSION_DISPLAY_delivery.md +0 -242
  9. package/VERSION_DISPLAY_implementation_summary.md +0 -315
  10. package/design_manifest.md +0 -100
  11. package/docs/CHANGELOG_AGENT_MODIFICATIONS.md +0 -132
  12. package/docs/MAINTAINER_RELEASE_WORKFLOW.md +0 -211
  13. package/docs/Openclaw-Agent-Dashboard/345/217/221/345/270/203/344/270/216/346/233/264/346/226/260.md +0 -147
  14. package/docs/RELEASE-LATEST.md +0 -189
  15. package/docs/RELEASE-MODEL-CONFIG.md +0 -95
  16. package/docs/WINDOWS_INSTALL_TROUBLESHOOTING.md +0 -171
  17. package/docs/design/.gitkeep +0 -0
  18. package/docs/design/VERSION_DISPLAY_design.md +0 -1236
  19. package/docs/release-guide.md +0 -259
  20. package/docs/release-operations-manual.md +0 -167
  21. package/docs/reviews/.gitkeep +0 -0
  22. package/docs/reviews/approval_history.json +0 -14
  23. package/docs/reviews/cr_VERSION_DISPLAY.md +0 -397
  24. package/docs/reviews/traceability_manifest.json +0 -279
  25. package/docs/specs/VERSION_DISPLAY_spec.md +0 -371
  26. package/docs/specs/tr3-install-system.md +0 -580
  27. package/docs/windows-collaboration-model-paths-troubleshooting.md +0 -0
  28. package/frontend/package-lock.json +0 -1240
  29. package/frontend/package.json +0 -19
  30. package/frontend/src/App.vue +0 -355
  31. package/frontend/src/components/AgentCard.vue +0 -796
  32. package/frontend/src/components/AgentConfigPanel.vue +0 -539
  33. package/frontend/src/components/AgentDetailPanel.vue +0 -738
  34. package/frontend/src/components/ErrorAnalysisView.vue +0 -546
  35. package/frontend/src/components/ErrorCenterPanel.vue +0 -844
  36. package/frontend/src/components/PerformanceMonitor.vue +0 -515
  37. package/frontend/src/components/SettingsPanel.vue +0 -236
  38. package/frontend/src/components/TokenAnalysisPanel.vue +0 -683
  39. package/frontend/src/components/chain/ChainEdge.vue +0 -85
  40. package/frontend/src/components/chain/ChainNode.vue +0 -166
  41. package/frontend/src/components/chain/TaskChainView.vue +0 -425
  42. package/frontend/src/components/chain/index.ts +0 -3
  43. package/frontend/src/components/chain/types.ts +0 -70
  44. package/frontend/src/components/collaboration/CollaborationFlowSection.vue +0 -1032
  45. package/frontend/src/components/collaboration/CollaborationFlowWrapper.vue +0 -113
  46. package/frontend/src/components/common/VersionDisplay.vue +0 -187
  47. package/frontend/src/components/performance/PerformancePanel.vue +0 -119
  48. package/frontend/src/components/performance/PerformanceSection.vue +0 -1137
  49. package/frontend/src/components/tasks/TaskStatusSection.vue +0 -973
  50. package/frontend/src/components/timeline/TimelineConnector.vue +0 -31
  51. package/frontend/src/components/timeline/TimelineRound.vue +0 -135
  52. package/frontend/src/components/timeline/TimelineStep.vue +0 -691
  53. package/frontend/src/components/timeline/TimelineToolLink.vue +0 -109
  54. package/frontend/src/components/timeline/TimelineView.vue +0 -540
  55. package/frontend/src/components/timeline/index.ts +0 -5
  56. package/frontend/src/components/timeline/types.ts +0 -120
  57. package/frontend/src/composables/index.ts +0 -7
  58. package/frontend/src/composables/useDebounce.ts +0 -48
  59. package/frontend/src/composables/useRealtime.ts +0 -52
  60. package/frontend/src/composables/useState.ts +0 -52
  61. package/frontend/src/composables/useThrottle.ts +0 -46
  62. package/frontend/src/composables/useVirtualScroll.ts +0 -106
  63. package/frontend/src/main.ts +0 -4
  64. package/frontend/src/managers/EventDispatcher.ts +0 -127
  65. package/frontend/src/managers/RealtimeDataManager.ts +0 -302
  66. package/frontend/src/managers/StateManager.ts +0 -128
  67. package/frontend/src/managers/index.ts +0 -5
  68. package/frontend/src/types/collaboration.ts +0 -135
  69. package/frontend/src/types/index.ts +0 -20
  70. package/frontend/src/types/performance.ts +0 -105
  71. package/frontend/src/types/task.ts +0 -38
  72. package/frontend/vite.config.ts +0 -18
  73. package/legacy_code_anatomy.md +0 -518
  74. package/plugin/README.md +0 -99
  75. package/plugin/config.json.example +0 -1
  76. package/plugin/package.json +0 -26
  77. package/scripts/build-plugin.js +0 -81
  78. package/scripts/bundle.sh +0 -62
  79. package/scripts/install-plugin.sh +0 -162
  80. package/scripts/install-python-deps.sh +0 -226
  81. package/scripts/install.js +0 -684
  82. package/scripts/install.sh +0 -367
  83. package/scripts/lib/common.sh +0 -137
  84. package/scripts/release-pack.sh +0 -110
  85. package/scripts/start.js +0 -50
  86. package/scripts/test_available_models.py +0 -284
  87. package/scripts/test_version_display.sh +0 -128
  88. package/scripts/test_websocket_ping.py +0 -44
  89. package/session_registry.json +0 -58
  90. package/tests/.gitkeep +0 -0
  91. package/tests/qa_regression_report.md +0 -359
  92. package/tests/qa_version_display_report.md +0 -598
  93. /package/{src/backend → dashboard}/agents.py +0 -0
  94. /package/{src/backend → dashboard}/api/__init__.py +0 -0
  95. /package/{src/backend → dashboard}/api/agent_config_api.py +0 -0
  96. /package/{src/backend → dashboard}/api/agents.py +0 -0
  97. /package/{src/backend → dashboard}/api/agents_config.py +0 -0
  98. /package/{src/backend → dashboard}/api/chains.py +0 -0
  99. /package/{src/backend → dashboard}/api/collaboration.py +0 -0
  100. /package/{src/backend → dashboard}/api/debug_paths.py +0 -0
  101. /package/{src/backend → dashboard}/api/error_analysis.py +0 -0
  102. /package/{src/backend → dashboard}/api/errors.py +0 -0
  103. /package/{src/backend → dashboard}/api/performance.py +0 -0
  104. /package/{src/backend → dashboard}/api/subagents.py +0 -0
  105. /package/{src/backend → dashboard}/api/timeline.py +0 -0
  106. /package/{src/backend → dashboard}/api/version.py +0 -0
  107. /package/{src/backend → dashboard}/api/websocket.py +0 -0
  108. /package/{src/backend → dashboard}/collaboration.py +0 -0
  109. /package/{src/backend → dashboard}/data/__init__.py +0 -0
  110. /package/{src/backend → dashboard}/data/agent_config_manager.py +0 -0
  111. /package/{src/backend → dashboard}/data/chain_reader.py +0 -0
  112. /package/{src/backend → dashboard}/data/config_reader.py +0 -0
  113. /package/{src/backend → dashboard}/data/error_analyzer.py +0 -0
  114. /package/{src/backend → dashboard}/data/session_reader.py +0 -0
  115. /package/{src/backend → dashboard}/data/subagent_reader.py +0 -0
  116. /package/{src/backend → dashboard}/data/task_history.py +0 -0
  117. /package/{src/backend → dashboard}/data/timeline_reader.py +0 -0
  118. /package/{src/backend → dashboard}/data/version_info_reader.py +0 -0
  119. /package/{src/backend → dashboard}/errors.py +0 -0
  120. /package/{src/backend → dashboard}/main.py +0 -0
  121. /package/{src/backend → dashboard}/mechanism_reader.py +0 -0
  122. /package/{src/backend → dashboard}/mechanisms.py +0 -0
  123. /package/{src/backend → dashboard}/performance.py +0 -0
  124. /package/{src/backend → dashboard}/requirements.txt +0 -0
  125. /package/{src/backend → dashboard}/session_reader.py +0 -0
  126. /package/{src/backend → dashboard}/status/__init__.py +0 -0
  127. /package/{src/backend → dashboard}/status/change_tracker.py +0 -0
  128. /package/{src/backend → dashboard}/status/error_detector.py +0 -0
  129. /package/{src/backend → dashboard}/status/status_cache.py +0 -0
  130. /package/{src/backend → dashboard}/status/status_calculator.py +0 -0
  131. /package/{src/backend → dashboard}/status_calculator.py +0 -0
  132. /package/{src/backend → dashboard}/subagent_reader.py +0 -0
  133. /package/{src/backend → dashboard}/watchers/__init__.py +0 -0
  134. /package/{src/backend → dashboard}/watchers/file_watcher.py +0 -0
  135. /package/{plugin/index.js → index.js} +0 -0
@@ -1,19 +0,0 @@
1
- {
2
- "name": "openclaw-agent-dashboard-frontend",
3
- "version": "1.0.0",
4
- "type": "module",
5
- "scripts": {
6
- "dev": "vite",
7
- "build": "vite build",
8
- "preview": "vite preview"
9
- },
10
- "dependencies": {
11
- "vue": "^3.4.0"
12
- },
13
- "devDependencies": {
14
- "@types/node": "^25.3.2",
15
- "@vitejs/plugin-vue": "^5.0.0",
16
- "typescript": "^5.3.0",
17
- "vite": "^5.0.0"
18
- }
19
- }
@@ -1,355 +0,0 @@
1
- <template>
2
- <div id="app">
3
- <header>
4
- <h1>OpenClaw Agent Dashboard</h1>
5
- <div class="controls">
6
- <VersionDisplay />
7
- <button @click="refreshData">刷新</button>
8
- <button @click="showSettings = true">⚙️ 设置</button>
9
- <span class="connection-status" :class="connectionState.status">
10
- {{ connectionLabel }}
11
- </span>
12
- </div>
13
- </header>
14
-
15
- <main>
16
- <!-- 协作流程(主 Agent + 子 Agents 合并展示,含连线)-->
17
- <section class="collaboration-section">
18
- <CollaborationFlowWrapper
19
- :main-agent="mainAgent"
20
- :sub-agents="subAgents"
21
- :main-agent-id="mainAgentId"
22
- @agent-click="onAgentNodeClick"
23
- />
24
- </section>
25
-
26
- <!-- 任务状态展示区域 -->
27
- <section class="task-status-section">
28
- <TaskStatusSection />
29
- </section>
30
-
31
- <!-- 性能数据展示区域 (整合 TPM/Token) -->
32
- <section class="performance-section">
33
- <PerformancePanel />
34
- </section>
35
-
36
- <!-- 错误中心(含 API 状态) -->
37
- <section class="error-center-section">
38
- <ErrorCenterPanel />
39
- </section>
40
- </main>
41
-
42
- <!-- 设置面板 -->
43
- <SettingsPanel
44
- v-if="showSettings"
45
- @close="showSettings = false"
46
- @settings-changed="onSettingsChanged"
47
- />
48
-
49
- <!-- 详情面板 -->
50
- <AgentDetailPanel
51
- v-if="selectedAgent"
52
- :agent="selectedAgent"
53
- @close="selectedAgent = null"
54
- />
55
- </div>
56
- </template>
57
-
58
- <script setup lang="ts">
59
- import { ref, computed, onMounted, onUnmounted, provide } from 'vue'
60
- import AgentDetailPanel from './components/AgentDetailPanel.vue'
61
- import SettingsPanel from './components/SettingsPanel.vue'
62
-
63
- // 核心组件
64
- import CollaborationFlowWrapper from './components/collaboration/CollaborationFlowWrapper.vue'
65
- import TaskStatusSection from './components/tasks/TaskStatusSection.vue'
66
- import PerformancePanel from './components/performance/PerformancePanel.vue'
67
- import ErrorCenterPanel from './components/ErrorCenterPanel.vue'
68
-
69
- // 版本显示组件
70
- import VersionDisplay from './components/common/VersionDisplay.vue'
71
-
72
- // 数据管理
73
- import { getRealtimeManager, getStateManager, getEventDispatcher } from './managers'
74
- import type { ConnectionState } from './types'
75
-
76
- interface Agent {
77
- id: string
78
- name: string
79
- role: string
80
- status: 'idle' | 'working' | 'down'
81
- currentTask?: string
82
- lastActiveFormatted?: string
83
- error?: any
84
- }
85
-
86
- // 初始化管理器
87
- const realtimeManager = getRealtimeManager()
88
- const stateManager = getStateManager()
89
- const eventDispatcher = getEventDispatcher()
90
-
91
- // 提供给子组件使用
92
- provide('realtimeManager', realtimeManager)
93
- provide('stateManager', stateManager)
94
- provide('eventDispatcher', eventDispatcher)
95
-
96
- const agents = ref<Agent[]>([])
97
- const selectedAgent = ref<Agent | null>(null)
98
- const showSettings = ref(false)
99
-
100
- // 连接状态
101
- const connectionState = ref<ConnectionState>({
102
- status: 'disconnected',
103
- reconnectAttempts: 0
104
- })
105
-
106
- const connectionLabel = computed(() => {
107
- switch (connectionState.value.status) {
108
- case 'connected': return '已连接'
109
- case 'connecting': return '连接中...'
110
- case 'disconnected': return '未连接'
111
- case 'error': return '连接错误'
112
- default: return '未知'
113
- }
114
- })
115
-
116
- // 主 Agent
117
- const mainAgent = ref<Agent | null>(null)
118
- const mainAgentId = ref<string>('main')
119
-
120
- // 子 Agents
121
- const subAgents = ref<Agent[]>([])
122
-
123
- async function refreshData() {
124
- try {
125
- const [agentsRes, configRes] = await Promise.all([
126
- fetch('/api/agents'),
127
- fetch('/api/config').catch(() => null)
128
- ])
129
- const agentsData = await agentsRes.json()
130
- agents.value = Array.isArray(agentsData) ? agentsData : []
131
- if (configRes?.ok) {
132
- const cfg = await configRes.json()
133
- mainAgentId.value = (cfg && cfg.mainAgentId) || 'main'
134
- }
135
- const agentsList = Array.isArray(agents.value) ? agents.value : []
136
- const main = agentsList.find((a: { id?: string }) => a.id === mainAgentId.value)
137
- if (main) mainAgent.value = main
138
- subAgents.value = agentsList.filter((a: { id?: string }) => a.id !== mainAgentId.value)
139
- } catch (error) {
140
- console.error('刷新数据失败:', error)
141
- }
142
- }
143
-
144
- function showAgentDetail(agent: Agent) {
145
- selectedAgent.value = agent
146
- }
147
-
148
- function onAgentNodeClick(node: { id: string; name: string; status: string }) {
149
- const agent = node.id === mainAgentId.value ? mainAgent.value : subAgents.value.find(a => a.id === node.id)
150
- if (agent) {
151
- showAgentDetail(agent)
152
- } else {
153
- // 协作流程中的 Agent 可能尚未在 /api/agents 中,用节点信息构造
154
- showAgentDetail({
155
- id: node.id,
156
- name: node.name,
157
- role: node.id === mainAgentId.value ? '主 Agent' : '子 Agent',
158
- status: (node.status === 'error' ? 'down' : node.status) as 'idle' | 'working' | 'down'
159
- })
160
- }
161
- }
162
-
163
- function onSettingsChanged(_settings: any) {
164
- refreshData()
165
- }
166
-
167
- // 监听连接状态变化
168
- function handleConnectionStateChange(state: ConnectionState) {
169
- connectionState.value = state
170
- }
171
-
172
- let unsubState: (() => void) | null = null
173
- let unsubAgents: (() => void) | null = null
174
- let unsubAgentsUpdate: (() => void) | null = null
175
-
176
- onMounted(() => {
177
- refreshData()
178
- realtimeManager.connect()
179
- unsubState = realtimeManager.onStateChange(handleConnectionStateChange)
180
- unsubAgents = realtimeManager.subscribe('agents', (data: unknown) => {
181
- if (Array.isArray(data)) {
182
- agents.value = data as Agent[]
183
- const main = (data as Agent[]).find(a => a.id === mainAgentId.value)
184
- mainAgent.value = main || null
185
- subAgents.value = (data as Agent[]).filter(a => a.id !== mainAgentId.value)
186
- }
187
- })
188
-
189
- // 新增:订阅增量状态更新
190
- unsubAgentsUpdate = realtimeManager.subscribe('agents_update', (data: unknown) => {
191
- if (Array.isArray(data)) {
192
- // 增量更新
193
- (data as Agent[]).forEach((updatedAgent: Agent) => {
194
- const index = agents.value.findIndex(a => a.id === updatedAgent.id)
195
- if (index >= 0) {
196
- // 合并更新(保留未变化的字段)
197
- agents.value[index] = { ...agents.value[index], ...updatedAgent }
198
- }
199
- })
200
- // 更新主 Agent 和子 Agents
201
- const main = agents.value.find(a => a.id === mainAgentId.value)
202
- if (main) mainAgent.value = main
203
- subAgents.value = agents.value.filter(a => a.id !== mainAgentId.value)
204
- }
205
- })
206
- })
207
-
208
- onUnmounted(() => {
209
- unsubState?.()
210
- unsubAgents?.()
211
- unsubAgentsUpdate?.()
212
- realtimeManager.disconnect()
213
- })
214
- </script>
215
-
216
- <style>
217
- /* 全局样式变量 */
218
- :root {
219
- --color-primary: #4a9eff;
220
- --color-success: #22c55e;
221
- --color-warning: #f59e0b;
222
- --color-error: #ef4444;
223
-
224
- --status-idle: #94a3b8;
225
- --status-active: #4a9eff;
226
- --status-completed: #22c55e;
227
- --status-error: #ef4444;
228
-
229
- --spacing-xs: 0.25rem;
230
- --spacing-sm: 0.5rem;
231
- --spacing-md: 1rem;
232
- --spacing-lg: 1.5rem;
233
- --spacing-xl: 2rem;
234
-
235
- --radius-sm: 4px;
236
- --radius-md: 6px;
237
- --radius-lg: 8px;
238
-
239
- --shadow-sm: 0 1px 2px rgba(0, 0, 0, 0.05);
240
- --shadow-md: 0 2px 8px rgba(0, 0, 0, 0.1);
241
- --shadow-lg: 0 4px 16px rgba(0, 0, 0, 0.15);
242
- }
243
- </style>
244
-
245
- <style scoped>
246
- header {
247
- display: flex;
248
- justify-content: space-between;
249
- align-items: center;
250
- padding: 1rem 2rem;
251
- background: #1a1a2e;
252
- color: white;
253
- flex-wrap: wrap;
254
- gap: 1rem;
255
- }
256
-
257
- header h1 {
258
- margin: 0;
259
- font-size: 1.5rem;
260
- }
261
-
262
- .controls {
263
- display: flex;
264
- align-items: center;
265
- gap: 1rem;
266
- flex-wrap: wrap;
267
- }
268
-
269
- button {
270
- padding: 0.5rem 1rem;
271
- background: #4a9eff;
272
- color: white;
273
- border: none;
274
- border-radius: 4px;
275
- cursor: pointer;
276
- }
277
-
278
- button:hover {
279
- background: #3a8eef;
280
- }
281
-
282
- .connection-status {
283
- font-size: 0.85rem;
284
- padding: 0.25rem 0.75rem;
285
- border-radius: 20px;
286
- background: #2d3748;
287
- }
288
-
289
- .connection-status.connected {
290
- background: #22c55e;
291
- }
292
-
293
- .connection-status.connecting {
294
- background: #f59e0b;
295
- }
296
-
297
- .connection-status.disconnected,
298
- .connection-status.error {
299
- background: #ef4444;
300
- }
301
-
302
- main {
303
- padding: 2rem;
304
- max-width: 1600px;
305
- margin: 0 auto;
306
- }
307
-
308
- .collaboration-section {
309
- margin-bottom: 2rem;
310
- min-height: 400px;
311
- /* 确保协作流程方框始终可见 */
312
- }
313
-
314
- .task-status-section {
315
- margin-bottom: 2rem;
316
- }
317
-
318
-
319
-
320
-
321
- .performance-section {
322
- margin-bottom: 2rem;
323
- }
324
-
325
- .error-center-section {
326
- margin-bottom: 2rem;
327
- }
328
-
329
- h2 {
330
- margin-bottom: 1rem;
331
- color: #333;
332
- }
333
-
334
- /* 响应式布局 */
335
- @media (max-width: 1024px) {
336
- main {
337
- padding: 1rem;
338
- }
339
-
340
- header {
341
- padding: 1rem;
342
- }
343
- }
344
-
345
- @media (max-width: 640px) {
346
- header h1 {
347
- font-size: 1.2rem;
348
- }
349
-
350
- .controls {
351
- width: 100%;
352
- justify-content: space-between;
353
- }
354
- }
355
- </style>