feat(web,hub): export session conversation (#808)

* test: reproduce issue #793

* fix: add session conversation export (closes #793)

* fix(hub): sort session export by display time for invoked scheduled messages

Export now uses COALESCE(invoked_at, created_at) ordering so JSON/Markdown
exports match the visible chat chronology after scheduled messages are invoked.

Co-authored-by: Cursor <cursoragent@cursor.com>

* fix(web): escape newlines in session export YAML front matter

Prevent session metadata containing newlines or quotes from breaking
Markdown export front matter.

Co-authored-by: Cursor <cursoragent@cursor.com>

---------

Co-authored-by: Cursor <cursoragent@cursor.com>
This commit is contained in:
SSU-WEI HUANG
2026-06-05 21:40:59 +08:00
committed by GitHub
co-authored by Cursor
parent dbc9646d06
commit f086949a8a
18 changed files with 901 additions and 3 deletions
+16
View File
@@ -131,6 +131,7 @@ export default {
// Session actions
'session.action.rename': 'Rename',
'session.action.export': 'Export conversation',
'session.action.archive': 'Archive',
'session.action.delete': 'Delete',
'session.action.copy': 'Copy',
@@ -155,6 +156,21 @@ export default {
'dialog.delete.confirming': 'Deleting…',
'dialog.error.default': 'Operation failed. Please try again.',
// Session export
'session.export.title': 'Export conversation',
'session.export.description': 'Choose a format, then download the full visible conversation.',
'session.export.format.json': 'JSON',
'session.export.format.json.description': 'Lossless payload with session metadata and messages.',
'session.export.format.markdown': 'Markdown',
'session.export.format.markdown.description': 'Readable view generated from the same export payload.',
'session.export.download': 'Download',
'session.export.downloading': 'Exporting…',
'session.export.error.noApi': 'Not connected to server',
'session.export.error.default': 'Failed to export conversation',
'session.export.toast.success.title': 'Conversation exported',
'session.export.toast.success.body': 'Downloaded {filename}',
'session.export.toast.error.title': 'Export failed',
// Common buttons
'button.cancel': 'Cancel',
'button.save': 'Save',