@qnote/q-ai-note 1.0.14 → 1.0.15

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.
@@ -1 +1 @@
1
- {"version":3,"file":"sandbox.d.ts","sourceRoot":"","sources":["../../../src/server/api/sandbox.ts"],"names":[],"mappings":"AAQA,QAAA,MAAM,MAAM,4CAAW,CAAC;AA2WxB,eAAe,MAAM,CAAC"}
1
+ {"version":3,"file":"sandbox.d.ts","sourceRoot":"","sources":["../../../src/server/api/sandbox.ts"],"names":[],"mappings":"AASA,QAAA,MAAM,MAAM,4CAAW,CAAC;AAosBxB,eAAe,MAAM,CAAC"}
@@ -1,5 +1,6 @@
1
1
  import { Router } from 'express';
2
2
  import { v4 as uuidv4 } from 'uuid';
3
+ import * as XLSX from 'xlsx';
3
4
  import { db } from '../db.js';
4
5
  import { canCreateSandbox, canReadSandbox, canWriteSandbox } from '../accessControl.js';
5
6
  import { forbid, getAccessContextFromResponse, ensurePageAccess } from './accessHelpers.js';
@@ -20,6 +21,254 @@ function isHttpUrl(value) {
20
21
  function toBool(value) {
21
22
  return value === true || value === 1 || value === '1';
22
23
  }
24
+ function safeParseObject(value) {
25
+ if (value && typeof value === 'object')
26
+ return value;
27
+ if (typeof value === 'string' && value.trim()) {
28
+ try {
29
+ const parsed = JSON.parse(value);
30
+ if (parsed && typeof parsed === 'object')
31
+ return parsed;
32
+ }
33
+ catch {
34
+ // Ignore invalid JSON content and fallback to empty object.
35
+ }
36
+ }
37
+ return {};
38
+ }
39
+ function toMarkdownPlainText(value) {
40
+ return String(value || '').replace(/\r\n/g, '\n').trim();
41
+ }
42
+ function parseMarkdownExportWorkItem(row) {
43
+ return {
44
+ id: String(row.id || ''),
45
+ parent_id: row.parent_id === null ? null : String(row.parent_id || ''),
46
+ name: String(row.name || '').trim(),
47
+ description: String(row.description || '').trim(),
48
+ assignee: String(row.assignee || '').trim(),
49
+ status: String(row.status || 'pending').trim() || 'pending',
50
+ priority: String(row.priority || 'medium').trim() || 'medium',
51
+ extra_data: safeParseObject(row.extra_data),
52
+ };
53
+ }
54
+ function sanitizeFileName(rawName) {
55
+ const normalized = String(rawName || '').trim() || 'sandbox';
56
+ return normalized
57
+ .replace(/[\\/:*?"<>|]/g, '-')
58
+ .replace(/\s+/g, '-')
59
+ .replace(/-+/g, '-')
60
+ .replace(/^-|-$/g, '')
61
+ .slice(0, 64) || 'sandbox';
62
+ }
63
+ function toAsciiFilename(rawFileName, fallbackExt = '.txt') {
64
+ const normalized = String(rawFileName || `sandbox${fallbackExt}`)
65
+ .replace(/[^\x20-\x7E]/g, '-')
66
+ .replace(/["\\]/g, '')
67
+ .replace(/\s+/g, '-')
68
+ .replace(/-+/g, '-')
69
+ .replace(/^-|-$/g, '');
70
+ const withExt = normalized.endsWith(fallbackExt) ? normalized : `${normalized}${fallbackExt}`;
71
+ return withExt === fallbackExt ? `sandbox${fallbackExt}` : withExt;
72
+ }
73
+ function buildSandboxMarkdownExport(sandboxId) {
74
+ const sandbox = db.prepare('SELECT * FROM sandboxes WHERE id = ?').get(sandboxId);
75
+ if (!sandbox)
76
+ return null;
77
+ const workItems = db.prepare('SELECT * FROM work_items WHERE sandbox_id = ? ORDER BY created_at ASC').all(sandboxId);
78
+ const parsedItems = workItems.map(parseMarkdownExportWorkItem);
79
+ const nodeEntities = listNodeEntities({ sandbox_id: sandboxId })
80
+ .sort((a, b) => String(a.created_at || '').localeCompare(String(b.created_at || '')));
81
+ const diaries = db.prepare('SELECT * FROM diaries WHERE 1=1 AND sandbox_id = ? ORDER BY created_at ASC').all(sandboxId);
82
+ const childrenByParent = new Map();
83
+ const entitiesByWorkItem = new Map();
84
+ const diariesByWorkItem = new Map();
85
+ const rootKey = '__root__';
86
+ parsedItems.forEach((item) => {
87
+ const key = item.parent_id || rootKey;
88
+ if (!childrenByParent.has(key))
89
+ childrenByParent.set(key, []);
90
+ childrenByParent.get(key)?.push(item);
91
+ });
92
+ nodeEntities.forEach((entity) => {
93
+ const key = String(entity.work_item_id || '');
94
+ if (!key)
95
+ return;
96
+ if (!entitiesByWorkItem.has(key))
97
+ entitiesByWorkItem.set(key, []);
98
+ entitiesByWorkItem.get(key)?.push(entity);
99
+ });
100
+ diaries.forEach((row) => {
101
+ const key = String(row.work_item_id || '').trim();
102
+ if (!key)
103
+ return;
104
+ if (!diariesByWorkItem.has(key))
105
+ diariesByWorkItem.set(key, []);
106
+ diariesByWorkItem.get(key)?.push(row);
107
+ });
108
+ const lines = [];
109
+ if (sandbox.description) {
110
+ lines.push(toMarkdownPlainText(sandbox.description));
111
+ lines.push('');
112
+ }
113
+ const appendItem = (item, depth) => {
114
+ const headingLevel = depth;
115
+ const isDirectoryLevel = depth <= 3;
116
+ const indent = ' '.repeat(Math.max(0, depth - 4));
117
+ const todo = safeParseObject(item.extra_data.todo);
118
+ const todoStart = String(todo.planned_start_date || item.extra_data.planned_start_date || '').trim();
119
+ const todoDue = String(todo.due_date || item.extra_data.due_date || '').trim();
120
+ const metaParts = [
121
+ `状态: ${item.status || '-'}`,
122
+ `优先级: ${item.priority || '-'}`,
123
+ `负责人: ${item.assignee || '-'}`,
124
+ ];
125
+ if (todoStart || todoDue) {
126
+ metaParts.push(`计划启动: ${todoStart || '-'}`);
127
+ metaParts.push(`截止: ${todoDue || '-'}`);
128
+ }
129
+ if (isDirectoryLevel) {
130
+ lines.push(`${'#'.repeat(Math.min(6, headingLevel))} ${item.name || '未命名工作项'}`);
131
+ lines.push('');
132
+ lines.push(`- ${metaParts.join(' | ')}`);
133
+ if (item.description) {
134
+ lines.push(`- 描述: ${toMarkdownPlainText(item.description)}`);
135
+ }
136
+ }
137
+ else {
138
+ lines.push(`${indent}- **${item.name || '未命名工作项'}**(L${depth})`);
139
+ lines.push(`${indent} - ${metaParts.join(' | ')}`);
140
+ if (item.description) {
141
+ lines.push(`${indent} - 描述: ${toMarkdownPlainText(item.description)}`);
142
+ }
143
+ }
144
+ const entities = entitiesByWorkItem.get(item.id) || [];
145
+ if (entities.length) {
146
+ if (isDirectoryLevel) {
147
+ lines.push('- 关联记录:');
148
+ }
149
+ else {
150
+ lines.push(`${indent} - 关联记录:`);
151
+ }
152
+ entities.forEach((entity) => {
153
+ const entityType = String(entity.entity_type || '').trim() || 'record';
154
+ const title = String(entity.title || '').trim() || '未命名记录';
155
+ const status = String(entity.status || '').trim();
156
+ const assignee = String(entity.assignee || '').trim();
157
+ const dueDate = String(entity.due_date || '').trim();
158
+ const details = [status ? `状态 ${status}` : '', assignee ? `负责人 ${assignee}` : '', dueDate ? `截止 ${dueDate}` : '']
159
+ .filter(Boolean)
160
+ .join(' | ');
161
+ const prefix = isDirectoryLevel ? ' ' : `${indent} `;
162
+ lines.push(`${prefix}- [${entityType}] ${title}${details ? `(${details})` : ''}`);
163
+ const contentMd = toMarkdownPlainText(entity.content_md);
164
+ if (contentMd) {
165
+ lines.push(`${prefix} - 内容: ${contentMd}`);
166
+ }
167
+ });
168
+ }
169
+ const itemDiaries = diariesByWorkItem.get(item.id) || [];
170
+ if (itemDiaries.length) {
171
+ if (isDirectoryLevel) {
172
+ lines.push('- 关联日记:');
173
+ }
174
+ else {
175
+ lines.push(`${indent} - 关联日记:`);
176
+ }
177
+ itemDiaries.forEach((row) => {
178
+ const createdAt = String(row.created_at || '').trim();
179
+ const diaryContent = toMarkdownPlainText(row.content);
180
+ const firstLine = diaryContent.split('\n')[0] || '';
181
+ const prefix = isDirectoryLevel ? ' ' : `${indent} `;
182
+ lines.push(`${prefix}- ${createdAt || '-'} ${firstLine}`.trim());
183
+ });
184
+ }
185
+ lines.push('');
186
+ const children = childrenByParent.get(item.id) || [];
187
+ children.forEach((child) => appendItem(child, depth + 1));
188
+ };
189
+ const roots = childrenByParent.get(rootKey) || [];
190
+ roots.forEach((item) => appendItem(item, 1));
191
+ if (!roots.length) {
192
+ lines.push('_当前沙盘暂无工作项_');
193
+ }
194
+ return {
195
+ filename: `${sanitizeFileName(sandbox.name)}.md`,
196
+ content: `${lines.join('\n').trim()}\n`,
197
+ };
198
+ }
199
+ function buildSandboxExcelExport(sandboxId) {
200
+ const sandbox = db.prepare('SELECT * FROM sandboxes WHERE id = ?').get(sandboxId);
201
+ if (!sandbox)
202
+ return null;
203
+ const workItems = db.prepare('SELECT * FROM work_items WHERE sandbox_id = ? ORDER BY created_at ASC').all(sandboxId);
204
+ const parsedItems = workItems.map(parseMarkdownExportWorkItem);
205
+ const nodeEntities = listNodeEntities({ sandbox_id: sandboxId })
206
+ .sort((a, b) => String(a.created_at || '').localeCompare(String(b.created_at || '')));
207
+ const diaries = db.prepare('SELECT * FROM diaries WHERE 1=1 AND sandbox_id = ? ORDER BY created_at ASC').all(sandboxId);
208
+ const childrenByParent = new Map();
209
+ const entitiesByWorkItem = new Map();
210
+ const diariesByWorkItem = new Map();
211
+ const rootKey = '__root__';
212
+ parsedItems.forEach((item) => {
213
+ const key = item.parent_id || rootKey;
214
+ if (!childrenByParent.has(key))
215
+ childrenByParent.set(key, []);
216
+ childrenByParent.get(key)?.push(item);
217
+ });
218
+ nodeEntities.forEach((entity) => {
219
+ const key = String(entity.work_item_id || '');
220
+ if (!key)
221
+ return;
222
+ if (!entitiesByWorkItem.has(key))
223
+ entitiesByWorkItem.set(key, []);
224
+ entitiesByWorkItem.get(key)?.push(entity);
225
+ });
226
+ diaries.forEach((row) => {
227
+ const key = String(row.work_item_id || '').trim();
228
+ if (!key)
229
+ return;
230
+ if (!diariesByWorkItem.has(key))
231
+ diariesByWorkItem.set(key, []);
232
+ diariesByWorkItem.get(key)?.push(row);
233
+ });
234
+ const rows = [];
235
+ rows.push(['层级', '类型', '标题', '状态', '优先级', '负责人', '计划启动', '截止日期', '内容']);
236
+ const appendRow = (level, type, title, status = '', priority = '', assignee = '', plannedStart = '', dueDate = '', content = '') => {
237
+ const indentedTitle = `${' '.repeat(Math.max(0, level - 1))}${title}`;
238
+ rows.push([level, type, indentedTitle, status, priority, assignee, plannedStart, dueDate, content]);
239
+ };
240
+ const appendItem = (item, depth) => {
241
+ const todo = safeParseObject(item.extra_data.todo);
242
+ const plannedStart = String(todo.planned_start_date || item.extra_data.planned_start_date || '').trim();
243
+ const dueDate = String(todo.due_date || item.extra_data.due_date || '').trim();
244
+ appendRow(depth, 'work_item', item.name || '未命名工作项', item.status || '-', item.priority || '-', item.assignee || '-', plannedStart, dueDate, item.description || '');
245
+ const entities = entitiesByWorkItem.get(item.id) || [];
246
+ entities.forEach((entity) => {
247
+ appendRow(depth + 1, String(entity.entity_type || 'record'), String(entity.title || '未命名记录'), String(entity.status || ''), String(entity.priority || ''), String(entity.assignee || ''), '', String(entity.due_date || ''), toMarkdownPlainText(entity.content_md));
248
+ });
249
+ const itemDiaries = diariesByWorkItem.get(item.id) || [];
250
+ itemDiaries.forEach((row) => {
251
+ const createdAt = String(row.created_at || '').trim();
252
+ const diaryContent = toMarkdownPlainText(row.content);
253
+ appendRow(depth + 1, 'diary', createdAt || '日记', '', '', '', '', '', diaryContent);
254
+ });
255
+ const children = childrenByParent.get(item.id) || [];
256
+ children.forEach((child) => appendItem(child, depth + 1));
257
+ };
258
+ const roots = childrenByParent.get(rootKey) || [];
259
+ roots.forEach((item) => appendItem(item, 1));
260
+ if (!roots.length) {
261
+ appendRow(1, 'work_item', '当前沙盘暂无工作项');
262
+ }
263
+ const sheet = XLSX.utils.aoa_to_sheet(rows);
264
+ const workbook = XLSX.utils.book_new();
265
+ XLSX.utils.book_append_sheet(workbook, sheet, 'Sandbox');
266
+ const arrayBuffer = XLSX.write(workbook, { bookType: 'xlsx', type: 'buffer' });
267
+ return {
268
+ filename: `${sanitizeFileName(sandbox.name)}.xlsx`,
269
+ buffer: Buffer.isBuffer(arrayBuffer) ? arrayBuffer : Buffer.from(arrayBuffer),
270
+ };
271
+ }
23
272
  function buildSandboxCopyPayload(sandboxId) {
24
273
  const sandbox = db.prepare('SELECT * FROM sandboxes WHERE id = ?').get(sandboxId);
25
274
  if (!sandbox)
@@ -193,6 +442,56 @@ router.get('/:id/copy-payload', (req, res) => {
193
442
  res.status(500).json(response);
194
443
  }
195
444
  });
445
+ router.get('/:id/export-markdown', (req, res) => {
446
+ try {
447
+ if (!ensurePageAccess(res, 'sandboxes')) {
448
+ return forbid(res, 'No permission to export sandbox markdown');
449
+ }
450
+ const access = getAccessContextFromResponse(res);
451
+ if (!canReadSandbox(access, req.params.id)) {
452
+ return forbid(res, 'No permission to export sandbox markdown');
453
+ }
454
+ const payload = buildSandboxMarkdownExport(req.params.id);
455
+ if (!payload) {
456
+ const response = { success: false, error: 'Sandbox not found' };
457
+ return res.status(404).json(response);
458
+ }
459
+ const asciiFilename = toAsciiFilename(payload.filename, '.md');
460
+ const encodedUtf8Filename = encodeURIComponent(payload.filename);
461
+ res.setHeader('Content-Type', 'text/markdown; charset=utf-8');
462
+ res.setHeader('Content-Disposition', `attachment; filename="${asciiFilename}"; filename*=UTF-8''${encodedUtf8Filename}`);
463
+ res.send(payload.content);
464
+ }
465
+ catch (error) {
466
+ const response = { success: false, error: String(error) };
467
+ res.status(500).json(response);
468
+ }
469
+ });
470
+ router.get('/:id/export-excel', (req, res) => {
471
+ try {
472
+ if (!ensurePageAccess(res, 'sandboxes')) {
473
+ return forbid(res, 'No permission to export sandbox excel');
474
+ }
475
+ const access = getAccessContextFromResponse(res);
476
+ if (!canReadSandbox(access, req.params.id)) {
477
+ return forbid(res, 'No permission to export sandbox excel');
478
+ }
479
+ const payload = buildSandboxExcelExport(req.params.id);
480
+ if (!payload) {
481
+ const response = { success: false, error: 'Sandbox not found' };
482
+ return res.status(404).json(response);
483
+ }
484
+ const asciiFilename = toAsciiFilename(payload.filename, '.xlsx');
485
+ const encodedUtf8Filename = encodeURIComponent(payload.filename);
486
+ res.setHeader('Content-Type', 'application/vnd.openxmlformats-officedocument.spreadsheetml.sheet');
487
+ res.setHeader('Content-Disposition', `attachment; filename="${asciiFilename}"; filename*=UTF-8''${encodedUtf8Filename}`);
488
+ res.send(payload.buffer);
489
+ }
490
+ catch (error) {
491
+ const response = { success: false, error: String(error) };
492
+ res.status(500).json(response);
493
+ }
494
+ });
196
495
  router.post('/:id/copy-link', (req, res) => {
197
496
  try {
198
497
  if (!ensurePageAccess(res, 'sandboxes')) {
@@ -1 +1 @@
1
- {"version":3,"file":"sandbox.js","sourceRoot":"","sources":["../../../src/server/api/sandbox.ts"],"names":[],"mappings":"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"}
1
+ {"version":3,"file":"sandbox.js","sourceRoot":"","sources":["../../../src/server/api/sandbox.ts"],"names":[],"mappings":"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"}
package/dist/web/app.js CHANGED
@@ -1545,15 +1545,26 @@ function ensureMermaidRuntime() {
1545
1545
  }
1546
1546
  if (mermaidLoadPromise) return mermaidLoadPromise;
1547
1547
  mermaidLoadPromise = new Promise((resolve, reject) => {
1548
+ const timeoutId = window.setTimeout(() => {
1549
+ reject(new Error('Mermaid script load timeout'));
1550
+ }, 2000);
1551
+ const finalizeResolve = () => {
1552
+ window.clearTimeout(timeoutId);
1553
+ resolve(window.mermaid);
1554
+ };
1555
+ const finalizeReject = (error) => {
1556
+ window.clearTimeout(timeoutId);
1557
+ reject(error);
1558
+ };
1548
1559
  const existing = document.querySelector('script[data-mermaid-runtime="1"]');
1549
1560
  if (existing) {
1550
1561
  existing.addEventListener('load', () => {
1551
1562
  if (window.mermaid && typeof window.mermaid.initialize === 'function') {
1552
1563
  window.mermaid.initialize({ startOnLoad: false, securityLevel: 'strict' });
1553
1564
  }
1554
- resolve(window.mermaid);
1565
+ finalizeResolve();
1555
1566
  }, { once: true });
1556
- existing.addEventListener('error', () => reject(new Error('Mermaid script load failed')), { once: true });
1567
+ existing.addEventListener('error', () => finalizeReject(new Error('Mermaid script load failed')), { once: true });
1557
1568
  return;
1558
1569
  }
1559
1570
  const script = document.createElement('script');
@@ -1564,11 +1575,15 @@ function ensureMermaidRuntime() {
1564
1575
  if (window.mermaid && typeof window.mermaid.initialize === 'function') {
1565
1576
  window.mermaid.initialize({ startOnLoad: false, securityLevel: 'strict' });
1566
1577
  }
1567
- resolve(window.mermaid);
1578
+ finalizeResolve();
1568
1579
  }, { once: true });
1569
- script.addEventListener('error', () => reject(new Error('Mermaid script load failed')), { once: true });
1580
+ script.addEventListener('error', () => finalizeReject(new Error('Mermaid script load failed')), { once: true });
1570
1581
  document.head.appendChild(script);
1571
1582
  });
1583
+ mermaidLoadPromise = mermaidLoadPromise.catch((error) => {
1584
+ mermaidLoadPromise = null;
1585
+ throw error;
1586
+ });
1572
1587
  return mermaidLoadPromise;
1573
1588
  }
1574
1589
 
@@ -1733,6 +1748,14 @@ function getNodeDiariesByNodeId(nodeId) {
1733
1748
  return (state.currentSandbox?.diaries || []).filter((row) => row.work_item_id === nodeId);
1734
1749
  }
1735
1750
 
1751
+ function getEntityTypeLabel(type) {
1752
+ const normalized = String(type || '').trim().toLowerCase();
1753
+ if (normalized === 'issue') return '问题';
1754
+ if (normalized === 'knowledge') return '知识';
1755
+ if (normalized === 'capability') return '能力';
1756
+ return String(type || '');
1757
+ }
1758
+
1736
1759
  function closeNodeEntityDrawer() {
1737
1760
  const drawer = document.getElementById('node-entity-drawer');
1738
1761
  if (!drawer) return;
@@ -1776,10 +1799,10 @@ function renderNodeEntitySummary(nodeId) {
1776
1799
  const todos = getNodeTodoItems(nodeId);
1777
1800
  const openIssues = issues.filter((row) => row.status === 'open' || row.status === 'in_progress' || row.status === 'blocked').length;
1778
1801
  container.innerHTML = `
1779
- <div class="summary-card"><div class="label">Issue</div><div class="value">${issues.length}</div></div>
1780
- <div class="summary-card"><div class="label">Open Issue</div><div class="value">${openIssues}</div></div>
1781
- <div class="summary-card"><div class="label">Knowledge</div><div class="value">${knowledges.length}</div></div>
1782
- <div class="summary-card"><div class="label">Capability</div><div class="value">${capabilities.length}</div></div>
1802
+ <div class="summary-card"><div class="label">问题</div><div class="value">${issues.length}</div></div>
1803
+ <div class="summary-card"><div class="label">开放问题</div><div class="value">${openIssues}</div></div>
1804
+ <div class="summary-card"><div class="label">知识</div><div class="value">${knowledges.length}</div></div>
1805
+ <div class="summary-card"><div class="label">能力</div><div class="value">${capabilities.length}</div></div>
1783
1806
  <div class="summary-card"><div class="label">Todo</div><div class="value">${todos.length}</div></div>
1784
1807
  <div class="summary-card"><div class="label">Diary</div><div class="value">${diaries.length}</div></div>
1785
1808
  `;
@@ -1875,7 +1898,7 @@ function renderNodeEntityList(nodeId) {
1875
1898
  <div class="entity-card">
1876
1899
  <div class="entity-card-header">
1877
1900
  <div>
1878
- <span class="entity-type-pill">${safeText(row.entity_type)}</span>
1901
+ <span class="entity-type-pill">${safeText(getEntityTypeLabel(row.entity_type))}</span>
1879
1902
  <strong>${safeText(row.title || '-')}</strong>
1880
1903
  </div>
1881
1904
  ${state.readonly ? '' : `
@@ -2100,7 +2123,7 @@ function getStatusOptionsByEntityType(entityType) {
2100
2123
  }
2101
2124
  if (entityType === 'issue') {
2102
2125
  return [
2103
- { value: '', label: '状态(Issue,默认 open)' },
2126
+ { value: '', label: '状态(问题,默认 open)' },
2104
2127
  { value: 'open', label: 'open' },
2105
2128
  { value: 'in_progress', label: 'in_progress' },
2106
2129
  { value: 'blocked', label: 'blocked' },
@@ -2110,12 +2133,12 @@ function getStatusOptionsByEntityType(entityType) {
2110
2133
  }
2111
2134
  if (entityType === 'capability') {
2112
2135
  return [
2113
- { value: '', label: '状态(Capability,默认 building)' },
2136
+ { value: '', label: '状态(能力,默认 building)' },
2114
2137
  { value: 'building', label: 'building' },
2115
2138
  { value: 'ready', label: 'ready' },
2116
2139
  ];
2117
2140
  }
2118
- return [{ value: '', label: '无状态(Knowledge)' }];
2141
+ return [{ value: '', label: '无状态(知识)' }];
2119
2142
  }
2120
2143
 
2121
2144
  function applyEntityFormMode() {
@@ -2148,10 +2171,10 @@ function applyEntityFormMode() {
2148
2171
  hint.textContent = type === 'todo'
2149
2172
  ? 'Todo 将作为当前节点子任务创建。'
2150
2173
  : type === 'issue'
2151
- ? 'Issue 推荐填写状态/优先级/负责人。'
2174
+ ? '问题推荐填写状态/优先级/负责人。'
2152
2175
  : type === 'knowledge'
2153
- ? 'Knowledge 可仅保存链接或少量 Markdown。'
2154
- : 'Capability 建议填写能力类型与简述。';
2176
+ ? '知识可仅保存链接或少量 Markdown。'
2177
+ : '能力建议填写能力类型与简述。';
2155
2178
  }
2156
2179
  }
2157
2180
 
@@ -2398,7 +2421,7 @@ function renderSandboxes() {
2398
2421
  onOpen: (id) => {
2399
2422
  window.location.hash = `/sandbox/${id}`;
2400
2423
  },
2401
- onEdit: (state.readonly || !state.fullAccess) ? undefined : (id) => {
2424
+ onEdit: (id) => {
2402
2425
  const current = state.sandboxes.find((sandbox) => sandbox.id === id);
2403
2426
  if (!current) return;
2404
2427
  const dialog = document.getElementById('sandbox-dialog');
@@ -2412,7 +2435,7 @@ function renderSandboxes() {
2412
2435
  document.getElementById('new-sandbox-desc').value = String(current.description || '');
2413
2436
  dialog.showModal();
2414
2437
  },
2415
- onCopyLink: (state.readonly || !state.fullAccess) ? undefined : async (id) => {
2438
+ onCopyLink: async (id) => {
2416
2439
  try {
2417
2440
  const data = await apiRequest(`${API_BASE}/sandboxes/${id}/copy-link`, { method: 'POST' });
2418
2441
  const copyLink = String(data?.copy_link || '');
@@ -2423,7 +2446,7 @@ function renderSandboxes() {
2423
2446
  alert(`复制链接失败: ${error.message}`);
2424
2447
  }
2425
2448
  },
2426
- onDelete: (state.readonly || !state.fullAccess) ? undefined : async (id) => {
2449
+ onDelete: async (id) => {
2427
2450
  const current = state.sandboxes.find((sandbox) => String(sandbox.id || '') === String(id || ''));
2428
2451
  if (!current) return;
2429
2452
  const expectedName = String(current.name || '').trim();
@@ -2436,7 +2459,10 @@ function renderSandboxes() {
2436
2459
  await apiRequest(`${API_BASE}/sandboxes/${id}`, { method: 'DELETE' });
2437
2460
  await loadSandboxes();
2438
2461
  },
2439
- readonly: state.readonly || !state.fullAccess,
2462
+ canEdit: (sandbox) => canWriteSandboxById(sandbox?.id),
2463
+ canDelete: (sandbox) => canWriteSandboxById(sandbox?.id),
2464
+ canCopyLink: (sandbox) => canReadSandboxById(sandbox?.id),
2465
+ readonly: state.readonly,
2440
2466
  });
2441
2467
  }
2442
2468
 
@@ -2449,7 +2475,7 @@ function renderTaskBoardList(containerId, rows = []) {
2449
2475
  }
2450
2476
  container.innerHTML = rows.map((row) => `
2451
2477
  <article class="task-board-item">
2452
- <div><strong>${safeText(row.name || '-')}</strong> <span class="entity-type-pill">${safeText(row.record_type || 'todo')}</span></div>
2478
+ <div><strong>${safeText(row.name || '-')}</strong> <span class="entity-type-pill">${safeText(getEntityTypeLabel(row.record_type || 'todo'))}</span></div>
2453
2479
  <div class="task-board-item-meta">沙盘:${safeText(row.sandbox_name || row.sandbox_id || '-')}</div>
2454
2480
  <div class="task-board-item-meta">负责人:${safeText(row.assignee || '我(未指派)')} · 状态:${safeText(row.status || '-')}</div>
2455
2481
  <div class="task-board-item-meta">计划启动:${safeText(row.planned_start_date || '-')} · 截止:${safeText(row.due_date || '-')}</div>
@@ -2563,8 +2589,8 @@ function renderSandboxOverview() {
2563
2589
  <div class="summary-card"><div class="label">待处理/进行中</div><div class="value">${byStatus.pending}/${byStatus.inProgress}</div></div>
2564
2590
  <div class="summary-card"><div class="label">已完成</div><div class="value">${byStatus.done}</div></div>
2565
2591
  <div class="summary-card"><div class="label">关联日记</div><div class="value">${diaries.length}</div></div>
2566
- <div class="summary-card"><div class="label">Issue(Open)</div><div class="value">${entityStats.issue?.total || 0}(${(entityStats.issue?.open || 0) + (entityStats.issue?.in_progress || 0) + (entityStats.issue?.blocked || 0)})</div></div>
2567
- <div class="summary-card"><div class="label">Knowledge / Capability</div><div class="value">${entityStats.knowledge?.total || 0} / ${entityStats.capability?.total || 0}</div></div>
2592
+ <div class="summary-card"><div class="label">问题(开放)</div><div class="value">${entityStats.issue?.total || 0}(${(entityStats.issue?.open || 0) + (entityStats.issue?.in_progress || 0) + (entityStats.issue?.blocked || 0)})</div></div>
2593
+ <div class="summary-card"><div class="label">知识 / 能力</div><div class="value">${entityStats.knowledge?.total || 0} / ${entityStats.capability?.total || 0}</div></div>
2568
2594
  `;
2569
2595
  }
2570
2596
 
@@ -3291,6 +3317,25 @@ function collectProjectSettingsPayload() {
3291
3317
  };
3292
3318
  }
3293
3319
 
3320
+ function collectIneffectiveProfileNames(payload) {
3321
+ const profiles = Array.isArray(payload?.profiles) ? payload.profiles : [];
3322
+ const bindings = Array.isArray(payload?.bindings) ? payload.bindings : [];
3323
+ const boundProfileIds = new Set();
3324
+ bindings.forEach((binding) => {
3325
+ const profileIds = Array.isArray(binding?.profile_ids) ? binding.profile_ids : [];
3326
+ profileIds.forEach((id) => boundProfileIds.add(String(id || '').trim()));
3327
+ });
3328
+ return profiles
3329
+ .filter((profile) => {
3330
+ const id = String(profile?.id || '').trim();
3331
+ const applyAll = Boolean(profile?.apply_to_all_users);
3332
+ if (!id || applyAll) return false;
3333
+ return !boundProfileIds.has(id);
3334
+ })
3335
+ .map((profile) => String(profile?.name || profile?.id || '').trim())
3336
+ .filter(Boolean);
3337
+ }
3338
+
3294
3339
  function createSettingHeaderRow(key = '', value = '') {
3295
3340
  const row = document.createElement('div');
3296
3341
  row.className = 'settings-kv-row';
@@ -4383,6 +4428,15 @@ async function initApp() {
4383
4428
  if (state.readonly || (!state.fullAccess && !state.pageAccess.settings)) return;
4384
4429
  try {
4385
4430
  const payload = collectProjectSettingsPayload();
4431
+ const ineffectiveProfiles = collectIneffectiveProfileNames(payload);
4432
+ if (ineffectiveProfiles.length) {
4433
+ const preview = ineffectiveProfiles.slice(0, 3).join('、');
4434
+ const more = ineffectiveProfiles.length > 3 ? ` 等 ${ineffectiveProfiles.length} 个` : '';
4435
+ const proceed = confirm(
4436
+ `检测到未生效的 Profile:${preview}${more}。\n这些 Profile 既未勾选 apply_to_all_users,也未被任何 Binding 绑定。\n是否仍然继续保存?`,
4437
+ );
4438
+ if (!proceed) return;
4439
+ }
4386
4440
  await apiRequest(`${API_BASE}/project-settings`, {
4387
4441
  method: 'PUT',
4388
4442
  body: JSON.stringify(payload),
@@ -4470,6 +4524,60 @@ async function initApp() {
4470
4524
  alert('汇报已复制');
4471
4525
  });
4472
4526
 
4527
+ const parseDownloadFilename = (contentDisposition, fallbackName) => {
4528
+ const encodedMatch = String(contentDisposition || '').match(/filename\*=UTF-8''([^;]+)/i);
4529
+ if (encodedMatch?.[1]) {
4530
+ try {
4531
+ return decodeURIComponent(encodedMatch[1]);
4532
+ } catch {
4533
+ // Ignore malformed encoding and fallback.
4534
+ }
4535
+ }
4536
+ const plainMatch = String(contentDisposition || '').match(/filename="([^"]+)"/i);
4537
+ if (plainMatch?.[1]) return plainMatch[1];
4538
+ return fallbackName;
4539
+ };
4540
+
4541
+ document.getElementById('export-sandbox-markdown-btn')?.addEventListener('click', async () => {
4542
+ if (!state.currentSandbox) return;
4543
+ const response = await fetch(`${API_BASE}/sandboxes/${encodeURIComponent(state.currentSandbox.id)}/export-markdown`);
4544
+ if (!response.ok) {
4545
+ alert('导出失败');
4546
+ return;
4547
+ }
4548
+ const blob = await response.blob();
4549
+ const contentDisposition = response.headers.get('content-disposition') || '';
4550
+ const filename = parseDownloadFilename(contentDisposition, `${state.currentSandbox.name || 'sandbox'}.md`);
4551
+ const href = URL.createObjectURL(blob);
4552
+ const link = document.createElement('a');
4553
+ link.href = href;
4554
+ link.download = filename;
4555
+ document.body.appendChild(link);
4556
+ link.click();
4557
+ link.remove();
4558
+ URL.revokeObjectURL(href);
4559
+ });
4560
+
4561
+ document.getElementById('export-sandbox-excel-btn')?.addEventListener('click', async () => {
4562
+ if (!state.currentSandbox) return;
4563
+ const response = await fetch(`${API_BASE}/sandboxes/${encodeURIComponent(state.currentSandbox.id)}/export-excel`);
4564
+ if (!response.ok) {
4565
+ alert('导出失败');
4566
+ return;
4567
+ }
4568
+ const blob = await response.blob();
4569
+ const contentDisposition = response.headers.get('content-disposition') || '';
4570
+ const filename = parseDownloadFilename(contentDisposition, `${state.currentSandbox.name || 'sandbox'}.xlsx`);
4571
+ const href = URL.createObjectURL(blob);
4572
+ const link = document.createElement('a');
4573
+ link.href = href;
4574
+ link.download = filename;
4575
+ document.body.appendChild(link);
4576
+ link.click();
4577
+ link.remove();
4578
+ URL.revokeObjectURL(href);
4579
+ });
4580
+
4473
4581
  document.getElementById('generate-insight-btn')?.addEventListener('click', async () => {
4474
4582
  if (!state.currentSandbox) return;
4475
4583
  const output = document.getElementById('sandbox-insight-output');
@@ -65,6 +65,8 @@
65
65
  <div class="action-strip">
66
66
  <button class="btn btn-secondary btn-sm" id="generate-insight-btn">智能总结</button>
67
67
  <button class="btn btn-secondary btn-sm" id="generate-report-btn">生成汇报</button>
68
+ <button class="btn btn-secondary btn-sm" id="export-sandbox-markdown-btn">导出Markdown</button>
69
+ <button class="btn btn-secondary btn-sm" id="export-sandbox-excel-btn">导出Excel</button>
68
70
  <button class="btn btn-secondary btn-sm ai-toggle-btn" id="toggle-sandbox-chat-btn" type="button">
69
71
  <span class="icon" aria-hidden="true">🤖</span>
70
72
  <span>显示 AI 助手</span>
@@ -95,9 +97,9 @@
95
97
  </select>
96
98
  <select id="work-item-element-preview-mode">
97
99
  <option value="none">能力要素:不显示</option>
98
- <option value="issue">能力要素:Issue</option>
99
- <option value="knowledge">能力要素:Knowledge</option>
100
- <option value="capability">能力要素:Capability</option>
100
+ <option value="issue">能力要素:问题</option>
101
+ <option value="knowledge">能力要素:知识</option>
102
+ <option value="capability">能力要素:能力</option>
101
103
  <option value="all">能力要素:全部</option>
102
104
  </select>
103
105
  <label class="inline-checkbox">
@@ -118,9 +120,9 @@
118
120
  <div class="work-tree-legend">
119
121
  <span class="legend-title">图例</span>
120
122
  <span class="legend-chip">1/2/3</span>
121
- <span class="legend-text">顺序:Issue / Knowledge / Capability</span>
122
- <span class="legend-state issue-open"><span class="dot"></span>Issue 有未关闭项</span>
123
- <span class="legend-state issue-closed"><span class="dot"></span>Issue 已关闭</span>
123
+ <span class="legend-text">顺序:问题 / 知识 / 能力</span>
124
+ <span class="legend-state issue-open"><span class="dot"></span>问题有未关闭项</span>
125
+ <span class="legend-state issue-closed"><span class="dot"></span>问题已关闭</span>
124
126
  </div>
125
127
  <div class="work-tree" id="work-tree"></div>
126
128
  </div>
@@ -170,22 +172,22 @@
170
172
  <div class="entity-filter-tabs" id="entity-filter-tabs">
171
173
  <button class="btn btn-secondary btn-sm active" data-entity-filter="all">全部</button>
172
174
  <button class="btn btn-secondary btn-sm" data-entity-filter="todo">Todo</button>
173
- <button class="btn btn-secondary btn-sm" data-entity-filter="issue">Issue</button>
174
- <button class="btn btn-secondary btn-sm" data-entity-filter="knowledge">Knowledge</button>
175
- <button class="btn btn-secondary btn-sm" data-entity-filter="capability">Capability</button>
175
+ <button class="btn btn-secondary btn-sm" data-entity-filter="issue">问题</button>
176
+ <button class="btn btn-secondary btn-sm" data-entity-filter="knowledge">知识</button>
177
+ <button class="btn btn-secondary btn-sm" data-entity-filter="capability">能力</button>
176
178
  <button class="btn btn-secondary btn-sm" data-entity-filter="diary">Diary</button>
177
179
  </div>
178
180
 
179
181
  <div class="drawer-create-form hidden" id="drawer-create-form">
180
182
  <select id="entity-type-select">
181
183
  <option value="todo">Todo</option>
182
- <option value="issue">Issue</option>
183
- <option value="knowledge">Knowledge</option>
184
- <option value="capability">Capability</option>
184
+ <option value="issue">问题</option>
185
+ <option value="knowledge">知识</option>
186
+ <option value="capability">能力</option>
185
187
  </select>
186
188
  <input type="text" id="entity-title-input" placeholder="标题(必填)">
187
189
  <div class="entity-field-group" id="entity-assignee-group">
188
- <input type="text" id="entity-assignee-input" placeholder="负责人(Issue可选)">
190
+ <input type="text" id="entity-assignee-input" placeholder="负责人(问题可选)">
189
191
  </div>
190
192
  <div class="entity-field-group hidden" id="entity-due-date-group">
191
193
  <input type="date" id="entity-due-date-input">
@@ -207,7 +209,7 @@
207
209
  </div>
208
210
  <div class="entity-field-group" id="entity-priority-group">
209
211
  <select id="entity-priority-select">
210
- <option value="">优先级(Issue可选)</option>
212
+ <option value="">优先级(问题可选)</option>
211
213
  <option value="low">low</option>
212
214
  <option value="medium">medium</option>
213
215
  <option value="high">high</option>
@@ -216,7 +218,7 @@
216
218
  </div>
217
219
  <div class="entity-field-group" id="entity-capability-type-group">
218
220
  <select id="entity-capability-type-input">
219
- <option value="">能力类型(Capability可选)</option>
221
+ <option value="">能力类型(能力项可选)</option>
220
222
  <option value="workflow">workflow(流程能力)</option>
221
223
  <option value="automation">automation(自动化能力)</option>
222
224
  <option value="tooling">tooling(工具能力)</option>
@@ -227,7 +229,7 @@
227
229
  <option value="other">other(其他)</option>
228
230
  </select>
229
231
  </div>
230
- <textarea id="entity-content-input" rows="4" placeholder="Markdown 内容(Knowledge/Capability 推荐)"></textarea>
232
+ <textarea id="entity-content-input" rows="4" placeholder="Markdown 内容(知识/能力 推荐)"></textarea>
231
233
  <div class="entity-form-hint" id="entity-form-hint"></div>
232
234
  <div class="entity-form-actions">
233
235
  <button class="btn btn-secondary btn-sm hidden" id="cancel-edit-entity-btn" type="button">取消编辑</button>
@@ -22,6 +22,9 @@ export function mountSandboxGrid(targetId, options) {
22
22
  onDelete,
23
23
  onCopyLink,
24
24
  readonly = false,
25
+ canEdit,
26
+ canDelete,
27
+ canCopyLink,
25
28
  } = options || {};
26
29
 
27
30
  if (!sandboxes.length) {
@@ -29,23 +32,29 @@ export function mountSandboxGrid(targetId, options) {
29
32
  return;
30
33
  }
31
34
 
32
- container.innerHTML = sandboxes.map((sandbox) => `
33
- <div class="card sandbox-card" data-open-id="${esc(sandbox.id)}">
34
- <h3>${esc(sandbox.name)}</h3>
35
- <p>${esc(sandbox.description || '暂无描述')}</p>
36
- <div class="sandbox-meta">
37
- <span>创建:${esc(new Date(sandbox.created_at).toLocaleDateString())}</span>
38
- <span>更新:${esc(new Date(sandbox.updated_at).toLocaleDateString())}</span>
39
- </div>
40
- ${readonly ? '' : `
41
- <div class="sandbox-actions">
42
- <button class="btn btn-secondary btn-sm" data-edit-id="${esc(sandbox.id)}">编辑</button>
43
- <button class="btn btn-secondary btn-sm" data-copy-link-id="${esc(sandbox.id)}">复制链接</button>
44
- <button class="btn btn-secondary btn-sm sandbox-delete-weak" data-delete-id="${esc(sandbox.id)}">删除</button>
35
+ container.innerHTML = sandboxes.map((sandbox) => {
36
+ const editable = !readonly && Boolean(onEdit) && (typeof canEdit === 'function' ? Boolean(canEdit(sandbox)) : true);
37
+ const copyable = !readonly && Boolean(onCopyLink) && (typeof canCopyLink === 'function' ? Boolean(canCopyLink(sandbox)) : true);
38
+ const deletable = !readonly && Boolean(onDelete) && (typeof canDelete === 'function' ? Boolean(canDelete(sandbox)) : true);
39
+ const hasActions = editable || copyable || deletable;
40
+ return `
41
+ <div class="card sandbox-card" data-open-id="${esc(sandbox.id)}">
42
+ <h3>${esc(sandbox.name)}</h3>
43
+ <p>${esc(sandbox.description || '暂无描述')}</p>
44
+ <div class="sandbox-meta">
45
+ <span>创建:${esc(new Date(sandbox.created_at).toLocaleDateString())}</span>
46
+ <span>更新:${esc(new Date(sandbox.updated_at).toLocaleDateString())}</span>
47
+ </div>
48
+ ${hasActions ? `
49
+ <div class="sandbox-actions">
50
+ ${editable ? `<button class="btn btn-secondary btn-sm" data-edit-id="${esc(sandbox.id)}">编辑</button>` : ''}
51
+ ${copyable ? `<button class="btn btn-secondary btn-sm" data-copy-link-id="${esc(sandbox.id)}">复制链接</button>` : ''}
52
+ ${deletable ? `<button class="btn btn-secondary btn-sm sandbox-delete-weak" data-delete-id="${esc(sandbox.id)}">删除</button>` : ''}
53
+ </div>
54
+ ` : ''}
45
55
  </div>
46
- `}
47
- </div>
48
- `).join('');
56
+ `;
57
+ }).join('');
49
58
 
50
59
  container.querySelectorAll('[data-open-id]').forEach((el) => {
51
60
  el.addEventListener('click', () => onOpen?.(el.getAttribute('data-open-id')));
package/package.json CHANGED
@@ -1,6 +1,6 @@
1
1
  {
2
2
  "name": "@qnote/q-ai-note",
3
- "version": "1.0.14",
3
+ "version": "1.0.15",
4
4
  "type": "module",
5
5
  "description": "AI-assisted personal work sandbox and diary system",
6
6
  "main": "dist/server/index.js",
@@ -30,7 +30,8 @@
30
30
  "dependencies": {
31
31
  "express": "^4.18.2",
32
32
  "uuid": "^9.0.0",
33
- "vue": "^3.5.29"
33
+ "vue": "^3.5.29",
34
+ "xlsx": "^0.18.5"
34
35
  },
35
36
  "devDependencies": {
36
37
  "@playwright/test": "^1.58.2",