@bitseek/hermes-webui 0.1.0-beta.0 → 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/package.json +2 -2
- package/vendor/agent-frontend-shell/.bitseek-source.json +2 -2
- package/vendor/agent-frontend-shell/CHANGELOG.md +178 -1
- package/vendor/agent-frontend-shell/CONTRIBUTORS.md +5 -5
- package/vendor/agent-frontend-shell/api/agent_health.py +134 -0
- package/vendor/agent-frontend-shell/api/config.py +145 -104
- package/vendor/agent-frontend-shell/api/gateway_chat.py +56 -12
- package/vendor/agent-frontend-shell/api/helpers.py +4 -2
- package/vendor/agent-frontend-shell/api/models.py +202 -20
- package/vendor/agent-frontend-shell/api/paths.py +77 -0
- package/vendor/agent-frontend-shell/api/plugins.py +185 -0
- package/vendor/agent-frontend-shell/api/profiles.py +95 -16
- package/vendor/agent-frontend-shell/api/routes.py +831 -30
- package/vendor/agent-frontend-shell/api/run_journal.py +1 -0
- package/vendor/agent-frontend-shell/api/state_sync.py +5 -4
- package/vendor/agent-frontend-shell/api/streaming.py +211 -56
- package/vendor/agent-frontend-shell/api/todo_state.py +122 -0
- package/vendor/agent-frontend-shell/api/updates.py +30 -3
- package/vendor/agent-frontend-shell/api/upload.py +251 -18
- package/vendor/agent-frontend-shell/api/workspace.py +323 -65
- package/vendor/agent-frontend-shell/bitseek_docs/BitSeek_Claw_Operation_Manual_EN.docx +0 -0
- package/vendor/agent-frontend-shell/bitseek_docs/BitSeek_Claw_Operation_Manual_ZH.docx +0 -0
- package/vendor/agent-frontend-shell/bitseek_docs/en/00-Installation.md +174 -0
- package/vendor/agent-frontend-shell/bitseek_docs/en/01-Overview.md +128 -0
- package/vendor/agent-frontend-shell/bitseek_docs/en/02-Page-Operations.md +461 -0
- package/vendor/agent-frontend-shell/bitseek_docs/en/README.md +61 -0
- package/vendor/agent-frontend-shell/bitseek_docs/en/images/ai-colleagues.png +0 -0
- package/vendor/agent-frontend-shell/bitseek_docs/en/images/chat-area.png +0 -0
- package/vendor/agent-frontend-shell/bitseek_docs/en/images/kanban.png +0 -0
- package/vendor/agent-frontend-shell/bitseek_docs/en/images/main-page.png +0 -0
- package/vendor/agent-frontend-shell/bitseek_docs/en/images/memory-notes.png +0 -0
- package/vendor/agent-frontend-shell/bitseek_docs/en/images/memory-overview.png +0 -0
- package/vendor/agent-frontend-shell/bitseek_docs/en/images/memory-profile.png +0 -0
- package/vendor/agent-frontend-shell/bitseek_docs/en/images/memory-soul.png +0 -0
- package/vendor/agent-frontend-shell/bitseek_docs/en/images/memory.png +0 -0
- package/vendor/agent-frontend-shell/bitseek_docs/en/images/navigation-bar.png +0 -0
- package/vendor/agent-frontend-shell/bitseek_docs/en/images/settings-appearance.png +0 -0
- package/vendor/agent-frontend-shell/bitseek_docs/en/images/settings-conversation.png +0 -0
- package/vendor/agent-frontend-shell/bitseek_docs/en/images/settings-overview.png +0 -0
- package/vendor/agent-frontend-shell/bitseek_docs/en/images/settings-plugins.png +0 -0
- package/vendor/agent-frontend-shell/bitseek_docs/en/images/settings-preferences.png +0 -0
- package/vendor/agent-frontend-shell/bitseek_docs/en/images/settings-providers.png +0 -0
- package/vendor/agent-frontend-shell/bitseek_docs/en/images/settings-system.png +0 -0
- package/vendor/agent-frontend-shell/bitseek_docs/en/images/settings.png +0 -0
- package/vendor/agent-frontend-shell/bitseek_docs/en/images/sidebar.png +0 -0
- package/vendor/agent-frontend-shell/bitseek_docs/en/images/skills.png +0 -0
- package/vendor/agent-frontend-shell/bitseek_docs/en/images/tasks.png +0 -0
- package/vendor/agent-frontend-shell/bitseek_docs/en/images/workspace-panel.png +0 -0
- package/vendor/agent-frontend-shell/bitseek_docs/md_to_docx.py +351 -0
- package/vendor/agent-frontend-shell/bitseek_docs/zh/00-/345/256/211/350/243/205/345/220/257/345/212/250.md +174 -0
- package/vendor/agent-frontend-shell/bitseek_docs/zh/01-/346/225/264/344/275/223/346/246/202/350/247/210.md +128 -0
- package/vendor/agent-frontend-shell/bitseek_docs/zh/02-/351/241/265/351/235/242/346/223/215/344/275/234.md +463 -0
- package/vendor/agent-frontend-shell/bitseek_docs/zh/README.md +61 -0
- package/vendor/agent-frontend-shell/bitseek_docs/zh/images/ai-colleagues.png +0 -0
- package/vendor/agent-frontend-shell/bitseek_docs/zh/images/chat-area.png +0 -0
- package/vendor/agent-frontend-shell/bitseek_docs/zh/images/kanban.png +0 -0
- package/vendor/agent-frontend-shell/bitseek_docs/zh/images/main-page.png +0 -0
- package/vendor/agent-frontend-shell/bitseek_docs/zh/images/memory-notes.png +0 -0
- package/vendor/agent-frontend-shell/bitseek_docs/zh/images/memory-overview.png +0 -0
- package/vendor/agent-frontend-shell/bitseek_docs/zh/images/memory-profile.png +0 -0
- package/vendor/agent-frontend-shell/bitseek_docs/zh/images/memory-soul.png +0 -0
- package/vendor/agent-frontend-shell/bitseek_docs/zh/images/memory.png +0 -0
- package/vendor/agent-frontend-shell/bitseek_docs/zh/images/navigation-bar.png +0 -0
- package/vendor/agent-frontend-shell/bitseek_docs/zh/images/settings-appearance.png +0 -0
- package/vendor/agent-frontend-shell/bitseek_docs/zh/images/settings-conversation.png +0 -0
- package/vendor/agent-frontend-shell/bitseek_docs/zh/images/settings-overview.png +0 -0
- package/vendor/agent-frontend-shell/bitseek_docs/zh/images/settings-plugins.png +0 -0
- package/vendor/agent-frontend-shell/bitseek_docs/zh/images/settings-preferences.png +0 -0
- package/vendor/agent-frontend-shell/bitseek_docs/zh/images/settings-providers.png +0 -0
- package/vendor/agent-frontend-shell/bitseek_docs/zh/images/settings-system.png +0 -0
- package/vendor/agent-frontend-shell/bitseek_docs/zh/images/settings.png +0 -0
- package/vendor/agent-frontend-shell/bitseek_docs/zh/images/sidebar.png +0 -0
- package/vendor/agent-frontend-shell/bitseek_docs/zh/images/skills.png +0 -0
- package/vendor/agent-frontend-shell/bitseek_docs/zh/images/tasks.png +0 -0
- package/vendor/agent-frontend-shell/bitseek_docs/zh/images/workspace-panel.png +0 -0
- package/vendor/agent-frontend-shell/build-release.sh +62 -0
- package/vendor/agent-frontend-shell/ctl.sh +1 -0
- package/vendor/agent-frontend-shell/docker-compose.local.yml +33 -0
- package/vendor/agent-frontend-shell/docker-compose.yml +8 -0
- package/vendor/agent-frontend-shell/docker_init.bash +1 -0
- package/vendor/agent-frontend-shell/docs/rfcs/hermes-run-adapter-contract.md +74 -15
- package/vendor/agent-frontend-shell/extensions/common/index.css +6 -0
- package/vendor/agent-frontend-shell/extensions/manifest.json +6 -0
- package/vendor/agent-frontend-shell/extensions/pages/ai-teammates/page.js +60 -14
- package/vendor/agent-frontend-shell/readme-simple.md +103 -0
- package/vendor/agent-frontend-shell/requirements.txt +5 -0
- package/vendor/agent-frontend-shell/server.py +7 -0
- package/vendor/agent-frontend-shell/static/boot.js +53 -1
- package/vendor/agent-frontend-shell/static/commands.js +20 -10
- package/vendor/agent-frontend-shell/static/i18n.js +1142 -1016
- package/vendor/agent-frontend-shell/static/index.html +13 -3
- package/vendor/agent-frontend-shell/static/messages.js +48 -3
- package/vendor/agent-frontend-shell/static/panels.js +199 -30
- package/vendor/agent-frontend-shell/static/sessions.js +249 -39
- package/vendor/agent-frontend-shell/static/style.css +46 -2
- package/vendor/agent-frontend-shell/static/ui.js +323 -79
- package/vendor/agent-frontend-shell/static/workspace.js +185 -7
- package/vendor/agent-frontend-shell/README-CUSTOM.md +0 -76
- package/vendor/agent-frontend-shell/docker-compose.custom.yml +0 -26
|
@@ -0,0 +1,351 @@
|
|
|
1
|
+
#!/usr/bin/env python3
|
|
2
|
+
"""
|
|
3
|
+
Markdown to Word Converter for BitSeek Claw Documentation
|
|
4
|
+
Generates two Word documents: one English, one Chinese
|
|
5
|
+
"""
|
|
6
|
+
|
|
7
|
+
import re
|
|
8
|
+
import os
|
|
9
|
+
from pathlib import Path
|
|
10
|
+
from docx import Document
|
|
11
|
+
from docx.shared import Inches, Pt, RGBColor, Cm
|
|
12
|
+
from docx.enum.text import WD_ALIGN_PARAGRAPH
|
|
13
|
+
from docx.enum.style import WD_STYLE_TYPE
|
|
14
|
+
from docx.oxml.ns import qn
|
|
15
|
+
|
|
16
|
+
# Base directory
|
|
17
|
+
BASE_DIR = Path(__file__).parent
|
|
18
|
+
|
|
19
|
+
|
|
20
|
+
def parse_markdown_table(lines):
|
|
21
|
+
"""Parse a markdown table into rows of cells."""
|
|
22
|
+
rows = []
|
|
23
|
+
for line in lines:
|
|
24
|
+
line = line.strip()
|
|
25
|
+
if line.startswith('|') and line.endswith('|'):
|
|
26
|
+
# Skip separator line
|
|
27
|
+
if re.match(r'^\|[\s\-:|]+\|$', line):
|
|
28
|
+
continue
|
|
29
|
+
cells = [cell.strip() for cell in line.split('|')[1:-1]]
|
|
30
|
+
rows.append(cells)
|
|
31
|
+
return rows
|
|
32
|
+
|
|
33
|
+
|
|
34
|
+
def add_table_to_doc(doc, rows):
|
|
35
|
+
"""Add a table to the document from parsed rows."""
|
|
36
|
+
if not rows:
|
|
37
|
+
return
|
|
38
|
+
|
|
39
|
+
num_cols = len(rows[0])
|
|
40
|
+
table = doc.add_table(rows=len(rows), cols=num_cols, style='Table Grid')
|
|
41
|
+
|
|
42
|
+
for i, row_data in enumerate(rows):
|
|
43
|
+
for j, cell_text in enumerate(row_data):
|
|
44
|
+
cell = table.cell(i, j)
|
|
45
|
+
cell.text = ''
|
|
46
|
+
p = cell.paragraphs[0]
|
|
47
|
+
# Use bold for header row
|
|
48
|
+
run = p.add_run(cell_text)
|
|
49
|
+
if i == 0:
|
|
50
|
+
run.bold = True
|
|
51
|
+
run.font.size = Pt(10)
|
|
52
|
+
else:
|
|
53
|
+
run.font.size = Pt(10)
|
|
54
|
+
|
|
55
|
+
doc.add_paragraph() # Add space after table
|
|
56
|
+
|
|
57
|
+
|
|
58
|
+
def parse_markdown(md_content, doc, lang_dir='en'):
|
|
59
|
+
"""Parse markdown content and add to Word document.
|
|
60
|
+
|
|
61
|
+
Args:
|
|
62
|
+
md_content: Markdown text content
|
|
63
|
+
doc: Word document object
|
|
64
|
+
lang_dir: Language subdirectory ('en' or 'zh') for image path resolution
|
|
65
|
+
"""
|
|
66
|
+
lines = md_content.split('\n')
|
|
67
|
+
i = 0
|
|
68
|
+
in_code_block = False
|
|
69
|
+
code_lines = []
|
|
70
|
+
in_table = False
|
|
71
|
+
table_lines = []
|
|
72
|
+
image_refs = []
|
|
73
|
+
|
|
74
|
+
while i < len(lines):
|
|
75
|
+
line = lines[i]
|
|
76
|
+
|
|
77
|
+
# Handle code blocks
|
|
78
|
+
if line.strip().startswith('```'):
|
|
79
|
+
if in_code_block:
|
|
80
|
+
# End of code block
|
|
81
|
+
code_text = '\n'.join(code_lines)
|
|
82
|
+
if code_text.strip():
|
|
83
|
+
p = doc.add_paragraph()
|
|
84
|
+
p.style = doc.styles['Normal']
|
|
85
|
+
run = p.add_run(code_text)
|
|
86
|
+
run.font.name = 'Courier New'
|
|
87
|
+
run.font.size = Pt(9)
|
|
88
|
+
run.font.color.rgb = RGBColor(0x33, 0x33, 0x33)
|
|
89
|
+
code_lines = []
|
|
90
|
+
in_code_block = False
|
|
91
|
+
else:
|
|
92
|
+
# Start of code block
|
|
93
|
+
in_code_block = True
|
|
94
|
+
i += 1
|
|
95
|
+
continue
|
|
96
|
+
|
|
97
|
+
if in_code_block:
|
|
98
|
+
code_lines.append(line)
|
|
99
|
+
i += 1
|
|
100
|
+
continue
|
|
101
|
+
|
|
102
|
+
# Handle tables
|
|
103
|
+
if line.strip().startswith('|') and line.strip().endswith('|'):
|
|
104
|
+
table_lines.append(line)
|
|
105
|
+
i += 1
|
|
106
|
+
continue
|
|
107
|
+
elif table_lines:
|
|
108
|
+
# End of table
|
|
109
|
+
rows = parse_markdown_table(table_lines)
|
|
110
|
+
add_table_to_doc(doc, rows)
|
|
111
|
+
table_lines = []
|
|
112
|
+
|
|
113
|
+
# Handle images
|
|
114
|
+
img_match = re.match(r'!\[([^\]]*)\]\(([^\)]+)\)', line.strip())
|
|
115
|
+
if img_match:
|
|
116
|
+
alt_text = img_match.group(1)
|
|
117
|
+
img_path = img_match.group(2)
|
|
118
|
+
# Try to add the image - resolve path relative to language subdirectory
|
|
119
|
+
full_img_path = BASE_DIR / lang_dir / img_path
|
|
120
|
+
if full_img_path.exists():
|
|
121
|
+
try:
|
|
122
|
+
from PIL import Image as PILImage
|
|
123
|
+
with PILImage.open(str(full_img_path)) as pil_img:
|
|
124
|
+
w_px, h_px = pil_img.size
|
|
125
|
+
# Calculate width to fit within max height of 300pt (~400px at 96dpi)
|
|
126
|
+
max_height = Pt(300)
|
|
127
|
+
aspect = w_px / h_px if h_px > 0 else 1
|
|
128
|
+
target_height = min(h_px, 300 * 96 / 72) # 300pt -> px
|
|
129
|
+
target_width = target_height * aspect
|
|
130
|
+
from docx.shared import Emu
|
|
131
|
+
# Use width as primary constraint, cap height at 300pt
|
|
132
|
+
pic = doc.add_picture(str(full_img_path), width=Inches(5))
|
|
133
|
+
# Scale down if height exceeds 300pt
|
|
134
|
+
if pic.height > max_height:
|
|
135
|
+
scale = max_height / pic.height
|
|
136
|
+
pic.width = int(pic.width * scale)
|
|
137
|
+
pic.height = max_height
|
|
138
|
+
last_paragraph = doc.paragraphs[-1]
|
|
139
|
+
last_paragraph.alignment = WD_ALIGN_PARAGRAPH.CENTER
|
|
140
|
+
except ImportError:
|
|
141
|
+
# Fallback: just insert without PIL
|
|
142
|
+
doc.add_picture(str(full_img_path), width=Inches(5))
|
|
143
|
+
last_paragraph = doc.paragraphs[-1]
|
|
144
|
+
last_paragraph.alignment = WD_ALIGN_PARAGRAPH.CENTER
|
|
145
|
+
except Exception as e:
|
|
146
|
+
# If image fails, add alt text as caption
|
|
147
|
+
p = doc.add_paragraph(f'[{alt_text}]')
|
|
148
|
+
p.alignment = WD_ALIGN_PARAGRAPH.CENTER
|
|
149
|
+
else:
|
|
150
|
+
p = doc.add_paragraph(f'[{alt_text}]')
|
|
151
|
+
p.alignment = WD_ALIGN_PARAGRAPH.CENTER
|
|
152
|
+
i += 1
|
|
153
|
+
continue
|
|
154
|
+
|
|
155
|
+
# Handle headings
|
|
156
|
+
if line.startswith('#'):
|
|
157
|
+
level = len(line.split(' ')[0])
|
|
158
|
+
text = line.lstrip('#').strip()
|
|
159
|
+
if level == 1:
|
|
160
|
+
p = doc.add_heading(text, level=0)
|
|
161
|
+
elif level == 2:
|
|
162
|
+
p = doc.add_heading(text, level=1)
|
|
163
|
+
elif level == 3:
|
|
164
|
+
p = doc.add_heading(text, level=2)
|
|
165
|
+
elif level == 4:
|
|
166
|
+
p = doc.add_heading(text, level=3)
|
|
167
|
+
else:
|
|
168
|
+
p = doc.add_heading(text, level=4)
|
|
169
|
+
i += 1
|
|
170
|
+
continue
|
|
171
|
+
|
|
172
|
+
# Handle horizontal rules
|
|
173
|
+
if line.strip() in ('---', '***', '___'):
|
|
174
|
+
# Add a thin line
|
|
175
|
+
p = doc.add_paragraph()
|
|
176
|
+
p.paragraph_format.space_before = Pt(6)
|
|
177
|
+
p.paragraph_format.space_after = Pt(6)
|
|
178
|
+
i += 1
|
|
179
|
+
continue
|
|
180
|
+
|
|
181
|
+
# Handle empty lines
|
|
182
|
+
if not line.strip():
|
|
183
|
+
i += 1
|
|
184
|
+
continue
|
|
185
|
+
|
|
186
|
+
# Handle ordered lists
|
|
187
|
+
ol_match = re.match(r'^(\s*)\d+\.\s+(.*)', line)
|
|
188
|
+
if ol_match:
|
|
189
|
+
text = ol_match.group(2)
|
|
190
|
+
p = doc.add_paragraph(style='List Number')
|
|
191
|
+
parse_inline_formatting(p, text)
|
|
192
|
+
i += 1
|
|
193
|
+
continue
|
|
194
|
+
|
|
195
|
+
# Handle unordered lists
|
|
196
|
+
ul_match = re.match(r'^(\s*)[-*+]\s+(.*)', line)
|
|
197
|
+
if ul_match:
|
|
198
|
+
text = ul_match.group(2)
|
|
199
|
+
p = doc.add_paragraph(style='List Bullet')
|
|
200
|
+
parse_inline_formatting(p, text)
|
|
201
|
+
i += 1
|
|
202
|
+
continue
|
|
203
|
+
|
|
204
|
+
# Handle regular paragraphs
|
|
205
|
+
p = doc.add_paragraph()
|
|
206
|
+
parse_inline_formatting(p, line)
|
|
207
|
+
i += 1
|
|
208
|
+
|
|
209
|
+
# Process any remaining table lines
|
|
210
|
+
if table_lines:
|
|
211
|
+
rows = parse_markdown_table(table_lines)
|
|
212
|
+
add_table_to_doc(doc, rows)
|
|
213
|
+
|
|
214
|
+
|
|
215
|
+
def parse_inline_formatting(p, text):
|
|
216
|
+
"""Parse inline markdown formatting (bold, code, links) and add to paragraph."""
|
|
217
|
+
# Pattern to match **bold**, `code`, and [link](url)
|
|
218
|
+
pattern = r'(\*\*[^*]+\*\*|`[^`]+`|\[[^\]]+\]\([^)]+\))'
|
|
219
|
+
|
|
220
|
+
parts = re.split(pattern, text)
|
|
221
|
+
|
|
222
|
+
for part in parts:
|
|
223
|
+
if not part:
|
|
224
|
+
continue
|
|
225
|
+
|
|
226
|
+
# Bold text
|
|
227
|
+
if part.startswith('**') and part.endswith('**'):
|
|
228
|
+
run = p.add_run(part[2:-2])
|
|
229
|
+
run.bold = True
|
|
230
|
+
# Inline code
|
|
231
|
+
elif part.startswith('`') and part.endswith('`'):
|
|
232
|
+
run = p.add_run(part[1:-1])
|
|
233
|
+
run.font.name = 'Courier New'
|
|
234
|
+
run.font.size = Pt(9)
|
|
235
|
+
run.font.color.rgb = RGBColor(0xC7, 0x25, 0x4E)
|
|
236
|
+
# Link
|
|
237
|
+
elif part.startswith('['):
|
|
238
|
+
link_match = re.match(r'\[([^\]]+)\]\(([^)]+)\)', part)
|
|
239
|
+
if link_match:
|
|
240
|
+
run = p.add_run(link_match.group(1))
|
|
241
|
+
run.font.color.rgb = RGBColor(0x00, 0x66, 0xCC)
|
|
242
|
+
run.underline = True
|
|
243
|
+
# Regular text
|
|
244
|
+
else:
|
|
245
|
+
p.add_run(part)
|
|
246
|
+
|
|
247
|
+
|
|
248
|
+
def create_document(title, subtitle, md_files, output_path, lang_dir='en'):
|
|
249
|
+
"""Create a Word document from markdown files.
|
|
250
|
+
|
|
251
|
+
Args:
|
|
252
|
+
title: Document title
|
|
253
|
+
subtitle: Document subtitle
|
|
254
|
+
md_files: List of markdown file paths (relative to BASE_DIR)
|
|
255
|
+
output_path: Output Word file path
|
|
256
|
+
lang_dir: Language subdirectory ('en' or 'zh') for image resolution
|
|
257
|
+
"""
|
|
258
|
+
doc = Document()
|
|
259
|
+
|
|
260
|
+
# Set default font
|
|
261
|
+
style = doc.styles['Normal']
|
|
262
|
+
font = style.font
|
|
263
|
+
font.name = 'Arial'
|
|
264
|
+
font.size = Pt(11)
|
|
265
|
+
|
|
266
|
+
# Configure heading styles
|
|
267
|
+
for i in range(1, 5):
|
|
268
|
+
heading_style = doc.styles[f'Heading {i}']
|
|
269
|
+
heading_font = heading_style.font
|
|
270
|
+
heading_font.color.rgb = RGBColor(0x1A, 0x1A, 0x2E)
|
|
271
|
+
|
|
272
|
+
# Add title page
|
|
273
|
+
p = doc.add_paragraph()
|
|
274
|
+
p.alignment = WD_ALIGN_PARAGRAPH.CENTER
|
|
275
|
+
run = p.add_run(title)
|
|
276
|
+
run.bold = True
|
|
277
|
+
run.font.size = Pt(28)
|
|
278
|
+
run.font.color.rgb = RGBColor(0x1A, 0x1A, 0x2E)
|
|
279
|
+
|
|
280
|
+
p = doc.add_paragraph()
|
|
281
|
+
p.alignment = WD_ALIGN_PARAGRAPH.CENTER
|
|
282
|
+
run = p.add_run(subtitle)
|
|
283
|
+
run.font.size = Pt(14)
|
|
284
|
+
run.font.color.rgb = RGBColor(0x66, 0x66, 0x66)
|
|
285
|
+
|
|
286
|
+
doc.add_paragraph()
|
|
287
|
+
doc.add_paragraph()
|
|
288
|
+
|
|
289
|
+
# Add each markdown file as a section
|
|
290
|
+
for md_file in md_files:
|
|
291
|
+
md_path = BASE_DIR / md_file
|
|
292
|
+
if md_path.exists():
|
|
293
|
+
with open(md_path, 'r', encoding='utf-8') as f:
|
|
294
|
+
content = f.read()
|
|
295
|
+
|
|
296
|
+
# Add page break before each section (except the first)
|
|
297
|
+
if md_files.index(md_file) > 0:
|
|
298
|
+
doc.add_page_break()
|
|
299
|
+
|
|
300
|
+
# Parse and add content
|
|
301
|
+
parse_markdown(content, doc, lang_dir)
|
|
302
|
+
|
|
303
|
+
# Save document
|
|
304
|
+
doc.save(output_path)
|
|
305
|
+
print(f'Created: {output_path}')
|
|
306
|
+
|
|
307
|
+
|
|
308
|
+
def main():
|
|
309
|
+
# English document
|
|
310
|
+
en_files = [
|
|
311
|
+
'en/README.md',
|
|
312
|
+
'en/00-Installation.md',
|
|
313
|
+
'en/01-Overview.md',
|
|
314
|
+
'en/02-Page-Operations.md',
|
|
315
|
+
]
|
|
316
|
+
|
|
317
|
+
# Chinese document
|
|
318
|
+
zh_files = [
|
|
319
|
+
'zh/README.md',
|
|
320
|
+
'zh/00-安装启动.md',
|
|
321
|
+
'zh/01-整体概览.md',
|
|
322
|
+
'zh/02-页面操作.md',
|
|
323
|
+
]
|
|
324
|
+
|
|
325
|
+
output_dir = BASE_DIR
|
|
326
|
+
|
|
327
|
+
# Generate English document
|
|
328
|
+
create_document(
|
|
329
|
+
title='BitSeek Claw',
|
|
330
|
+
subtitle='Operation Manual',
|
|
331
|
+
md_files=en_files,
|
|
332
|
+
output_path=output_dir / 'BitSeek_Claw_Operation_Manual_EN.docx',
|
|
333
|
+
lang_dir='en'
|
|
334
|
+
)
|
|
335
|
+
|
|
336
|
+
# Generate Chinese document
|
|
337
|
+
create_document(
|
|
338
|
+
title='BitSeek Claw',
|
|
339
|
+
subtitle='操作文档',
|
|
340
|
+
md_files=zh_files,
|
|
341
|
+
output_path=output_dir / 'BitSeek_Claw_Operation_Manual_ZH.docx',
|
|
342
|
+
lang_dir='zh'
|
|
343
|
+
)
|
|
344
|
+
|
|
345
|
+
print('\nDone! Generated:')
|
|
346
|
+
print(' - BitSeek_Claw_Operation_Manual_EN.docx')
|
|
347
|
+
print(' - BitSeek_Claw_Operation_Manual_ZH.docx')
|
|
348
|
+
|
|
349
|
+
|
|
350
|
+
if __name__ == '__main__':
|
|
351
|
+
main()
|
|
@@ -0,0 +1,174 @@
|
|
|
1
|
+
# 安装和启动 BitSeek Claw
|
|
2
|
+
|
|
3
|
+
本指南介绍如何安装和启动 BitSeek Claw(Hermes WebUI)。
|
|
4
|
+
|
|
5
|
+
## 系统要求
|
|
6
|
+
|
|
7
|
+
- **操作系统**:macOS、Linux 或 WSL2(Windows 需通过 WSL2)
|
|
8
|
+
- **Python**:3.8 或更高版本
|
|
9
|
+
- **Hermes Agent**:需要预先安装 Hermes Agent
|
|
10
|
+
|
|
11
|
+
## 安装步骤
|
|
12
|
+
|
|
13
|
+
### 1. 克隆仓库
|
|
14
|
+
|
|
15
|
+
```bash
|
|
16
|
+
git clone https://github.com/your-repo/agent-frontend-shell.git
|
|
17
|
+
cd agent-frontend-shell
|
|
18
|
+
```
|
|
19
|
+
|
|
20
|
+
### 2. 环境配置
|
|
21
|
+
|
|
22
|
+
#### 方法一:使用 `.env` 文件(推荐)
|
|
23
|
+
|
|
24
|
+
```bash
|
|
25
|
+
# 复制示例环境文件
|
|
26
|
+
cp .env.example .env
|
|
27
|
+
|
|
28
|
+
# 编辑 .env 文件配置必要参数
|
|
29
|
+
nano .env
|
|
30
|
+
```
|
|
31
|
+
|
|
32
|
+
#### 方法二:直接设置环境变量
|
|
33
|
+
|
|
34
|
+
```bash
|
|
35
|
+
export HERMES_WEBUI_HOST=127.0.0.1
|
|
36
|
+
export HERMES_WEBUI_PORT=8787
|
|
37
|
+
export HERMES_HOME=~/.hermes
|
|
38
|
+
```
|
|
39
|
+
|
|
40
|
+
### 3. 启动服务
|
|
41
|
+
|
|
42
|
+
#### 方法一:使用启动脚本(推荐)
|
|
43
|
+
|
|
44
|
+
```bash
|
|
45
|
+
# 使用 start.sh 启动
|
|
46
|
+
./start.sh
|
|
47
|
+
```
|
|
48
|
+
|
|
49
|
+
#### 方法二:使用 Python 启动器
|
|
50
|
+
|
|
51
|
+
```bash
|
|
52
|
+
# 使用 bootstrap.py 启动(会自动检查依赖)
|
|
53
|
+
python3 bootstrap.py
|
|
54
|
+
```
|
|
55
|
+
|
|
56
|
+
#### 方法三:使用控制脚本
|
|
57
|
+
|
|
58
|
+
```bash
|
|
59
|
+
# 使用 ctl.sh 管理服务
|
|
60
|
+
./ctl.sh start
|
|
61
|
+
```
|
|
62
|
+
|
|
63
|
+
## 启动参数
|
|
64
|
+
|
|
65
|
+
### 环境变量配置
|
|
66
|
+
|
|
67
|
+
| 变量名 | 默认值 | 说明 |
|
|
68
|
+
|--------|--------|------|
|
|
69
|
+
| `HERMES_WEBUI_HOST` | `127.0.0.1` | 监听地址 |
|
|
70
|
+
| `HERMES_WEBUI_PORT` | `8787` | 监听端口 |
|
|
71
|
+
| `HERMES_HOME` | `~/.hermes` | Hermes 主目录 |
|
|
72
|
+
| `HERMES_WEBUI_STATE_DIR` | - | 状态目录路径 |
|
|
73
|
+
| `HERMES_WEBUI_DEFAULT_WORKSPACE` | - | 默认工作区路径 |
|
|
74
|
+
|
|
75
|
+
### 启动选项
|
|
76
|
+
|
|
77
|
+
```bash
|
|
78
|
+
# 指定端口启动
|
|
79
|
+
HERMES_WEBUI_PORT=8888 ./start.sh
|
|
80
|
+
|
|
81
|
+
# 指定主机和端口
|
|
82
|
+
HERMES_WEBUI_HOST=0.0.0.0 HERMES_WEBUI_PORT=8787 ./start.sh
|
|
83
|
+
|
|
84
|
+
# 使用自定义状态目录
|
|
85
|
+
HERMES_WEBUI_STATE_DIR=/tmp/hermes-state ./start.sh
|
|
86
|
+
```
|
|
87
|
+
|
|
88
|
+
## 访问界面
|
|
89
|
+
|
|
90
|
+
启动成功后,在浏览器中访问:
|
|
91
|
+
|
|
92
|
+
```
|
|
93
|
+
http://localhost:8787
|
|
94
|
+
```
|
|
95
|
+
|
|
96
|
+
### 首次访问
|
|
97
|
+
|
|
98
|
+
1. 打开浏览器访问上述地址
|
|
99
|
+
2. 首次访问会进入**首次运行向导**
|
|
100
|
+
3. 按照向导提示配置:
|
|
101
|
+
- AI 提供商设置(如 OpenAI、Anthropic 等)
|
|
102
|
+
- API 密钥配置
|
|
103
|
+
- 基本偏好设置
|
|
104
|
+
|
|
105
|
+
## Docker 部署
|
|
106
|
+
|
|
107
|
+
### 单容器部署
|
|
108
|
+
|
|
109
|
+
```bash
|
|
110
|
+
# 使用 Docker Compose
|
|
111
|
+
docker-compose up -d
|
|
112
|
+
|
|
113
|
+
# 或使用自定义配置
|
|
114
|
+
docker-compose -f docker-compose.custom.yml up -d
|
|
115
|
+
```
|
|
116
|
+
|
|
117
|
+
### 多容器部署
|
|
118
|
+
|
|
119
|
+
```bash
|
|
120
|
+
# 三容器架构
|
|
121
|
+
docker-compose -f docker-compose.three-container.yml up -d
|
|
122
|
+
|
|
123
|
+
# 两容器架构
|
|
124
|
+
docker-compose -f docker-compose.two-container.yml up -d
|
|
125
|
+
```
|
|
126
|
+
|
|
127
|
+
## 常见问题
|
|
128
|
+
|
|
129
|
+
### 端口被占用
|
|
130
|
+
|
|
131
|
+
```bash
|
|
132
|
+
# 检查端口占用
|
|
133
|
+
lsof -i :8787
|
|
134
|
+
|
|
135
|
+
# 使用其他端口
|
|
136
|
+
HERMES_WEBUI_PORT=8788 ./start.sh
|
|
137
|
+
```
|
|
138
|
+
|
|
139
|
+
### 权限问题
|
|
140
|
+
|
|
141
|
+
```bash
|
|
142
|
+
# 确保脚本有执行权限
|
|
143
|
+
chmod +x start.sh
|
|
144
|
+
chmod +x ctl.sh
|
|
145
|
+
chmod +x bootstrap.py
|
|
146
|
+
```
|
|
147
|
+
|
|
148
|
+
### 依赖缺失
|
|
149
|
+
|
|
150
|
+
```bash
|
|
151
|
+
# 安装 Python 依赖
|
|
152
|
+
pip install -r requirements.txt
|
|
153
|
+
|
|
154
|
+
# 或使用虚拟环境
|
|
155
|
+
python3 -m venv venv
|
|
156
|
+
source venv/bin/activate
|
|
157
|
+
pip install -r requirements.txt
|
|
158
|
+
```
|
|
159
|
+
|
|
160
|
+
## 停止服务
|
|
161
|
+
|
|
162
|
+
```bash
|
|
163
|
+
# 使用控制脚本停止
|
|
164
|
+
./ctl.sh stop
|
|
165
|
+
|
|
166
|
+
# 或查找进程并终止
|
|
167
|
+
pkill -f "python.*server.py"
|
|
168
|
+
```
|
|
169
|
+
|
|
170
|
+
## 下一步
|
|
171
|
+
|
|
172
|
+
安装启动完成后,请查看:
|
|
173
|
+
- **[整体概览](01-整体概览.md)** - 了解界面布局
|
|
174
|
+
- **[页面操作](02-页面操作.md)** - 学习具体操作
|
|
@@ -0,0 +1,128 @@
|
|
|
1
|
+
# BitSeek Claw 整体概览
|
|
2
|
+
|
|
3
|
+
BitSeek Claw 采用现代化的三栏布局设计,提供直观的用户界面。以下是界面的整体结构介绍。
|
|
4
|
+
|
|
5
|
+
## 界面布局
|
|
6
|
+
|
|
7
|
+

|
|
8
|
+
|
|
9
|
+
BitSeek Claw 的界面分为三个主要区域:
|
|
10
|
+
|
|
11
|
+
1. **顶部导航栏** - 功能模块切换
|
|
12
|
+
2. **左侧边栏** - 会话管理和导航
|
|
13
|
+
3. **中央主区域** - 聊天和工作区
|
|
14
|
+
4. **右侧面板** - 文件浏览(可选)
|
|
15
|
+
|
|
16
|
+
## 顶部导航栏
|
|
17
|
+
|
|
18
|
+

|
|
19
|
+
|
|
20
|
+
导航栏位于页面顶部,包含以下功能模块:
|
|
21
|
+
|
|
22
|
+
| 图标 | 名称 | 功能描述 |
|
|
23
|
+
|------|------|----------|
|
|
24
|
+
| 💬 | 聊天 | 与 AI 进行对话交流 |
|
|
25
|
+
| 👥 | AI 同事 | 管理和交互多个 AI 代理 |
|
|
26
|
+
| 📋 | 任务 | 查看和管理任务列表 |
|
|
27
|
+
| 📊 | 看板 | 任务看板视图 |
|
|
28
|
+
| ⚡ | 技能 | 管理 AI 技能库 |
|
|
29
|
+
| 🧠 | 记忆 | 查看和管理 AI 记忆 |
|
|
30
|
+
| 📁 | 工作区 | 文件和项目管理 |
|
|
31
|
+
| ⚙️ | 配置 | 代理配置管理 |
|
|
32
|
+
| ✅ | 待办 | 待办事项管理 |
|
|
33
|
+
| 📈 | 统计 | 使用统计和洞察 |
|
|
34
|
+
| 📊 | Hermes 仪表盘 | 系统监控面板 |
|
|
35
|
+
| 📝 | 日志 | 系统日志查看 |
|
|
36
|
+
| ⚙️ | 设置 | 系统设置 |
|
|
37
|
+
|
|
38
|
+
## 左侧边栏
|
|
39
|
+
|
|
40
|
+

|
|
41
|
+
|
|
42
|
+
左侧边栏提供会话管理和快速导航:
|
|
43
|
+
|
|
44
|
+
### 会话管理
|
|
45
|
+
- **新建对话** - 创建新的聊天会话
|
|
46
|
+
- **筛选对话** - 按关键词筛选会话
|
|
47
|
+
- **会话列表** - 显示所有历史会话
|
|
48
|
+
- 按时间分组(今天、昨天、上周等)
|
|
49
|
+
- 每个会话显示标题和最后活跃时间
|
|
50
|
+
- 右键菜单提供更多操作
|
|
51
|
+
|
|
52
|
+
### 项目管理
|
|
53
|
+
- **所有** - 查看所有会话
|
|
54
|
+
- **未分配** - 查看未分配项目的会话
|
|
55
|
+
- **新建项目** - 创建新项目分组
|
|
56
|
+
|
|
57
|
+
## 中央主区域
|
|
58
|
+
|
|
59
|
+

|
|
60
|
+
|
|
61
|
+
中央主区域是主要工作区,根据当前选择的功能模块显示不同内容:
|
|
62
|
+
|
|
63
|
+
### 聊天界面
|
|
64
|
+
- **欢迎消息** - 显示引导问题
|
|
65
|
+
- **消息输入框** - 输入消息与 AI 交流
|
|
66
|
+
- **快捷操作** - 文件选择、听写等功能
|
|
67
|
+
- **上下文信息** - 显示当前模型、工作区等
|
|
68
|
+
|
|
69
|
+
### 其他功能界面
|
|
70
|
+
- 任务管理、看板视图、技能管理等
|
|
71
|
+
- 每个功能模块都有专门的界面布局
|
|
72
|
+
|
|
73
|
+
## 右侧工作区面板
|
|
74
|
+
|
|
75
|
+

|
|
76
|
+
|
|
77
|
+
右侧工作区面板提供文件管理功能:
|
|
78
|
+
|
|
79
|
+
### 文件浏览器
|
|
80
|
+
- **文件列表** - 显示工作区中的文件和文件夹
|
|
81
|
+
- **文件操作** - 新建文件、文件夹、刷新等
|
|
82
|
+
- **文件预览** - 点击文件可预览内容
|
|
83
|
+
|
|
84
|
+
### 功能标签
|
|
85
|
+
- **Files** - 文件浏览器
|
|
86
|
+
- **Artifacts** - 生成的工件和内容
|
|
87
|
+
|
|
88
|
+
## 底部控制栏
|
|
89
|
+
|
|
90
|
+
底部控制栏提供会话级别的控制:
|
|
91
|
+
|
|
92
|
+
### 模型选择
|
|
93
|
+
- **AI 模型** - 切换不同的 AI 模型
|
|
94
|
+
- **推理强度** - 调整 AI 推理强度
|
|
95
|
+
- **配置文件** - 切换用户配置文件
|
|
96
|
+
|
|
97
|
+
### 消息操作
|
|
98
|
+
- **发送按钮** - 发送输入的消息
|
|
99
|
+
- **文件附件** - 附加文件到消息
|
|
100
|
+
- **听写功能** - 语音输入支持
|
|
101
|
+
|
|
102
|
+
## 主题和外观
|
|
103
|
+
|
|
104
|
+
BitSeek Claw 支持多种主题:
|
|
105
|
+
|
|
106
|
+
- **深色主题** - 默认主题,护眼舒适
|
|
107
|
+
- **浅色主题** - 明亮清爽的界面
|
|
108
|
+
- **自定义主题** - 支持自定义颜色方案
|
|
109
|
+
|
|
110
|
+
## 响应式设计
|
|
111
|
+
|
|
112
|
+
界面支持不同屏幕尺寸:
|
|
113
|
+
- **桌面端** - 完整三栏布局
|
|
114
|
+
- **平板端** - 可折叠侧边栏
|
|
115
|
+
- **移动端** - 单栏布局,适配手机屏幕
|
|
116
|
+
|
|
117
|
+
## 快捷键
|
|
118
|
+
|
|
119
|
+
常用快捷键:
|
|
120
|
+
- `Ctrl/Cmd + N` - 新建对话
|
|
121
|
+
- `Ctrl/Cmd + /` - 聚焦搜索框
|
|
122
|
+
- `Ctrl/Cmd + Enter` - 发送消息
|
|
123
|
+
- `Esc` - 关闭弹窗或取消操作
|
|
124
|
+
|
|
125
|
+
## 下一步
|
|
126
|
+
|
|
127
|
+
了解整体布局后,请查看:
|
|
128
|
+
- **[页面操作](02-页面操作.md)** - 各个功能模块的详细操作指南
|