feat(codex): import and resume sessions from runners (#1088)

* fix codex import resume flow

* fix hub restart session active state

* fix codex transcript workspace scoping

* Address Codex import review findings

* Fix Codex import machine selection

* Update Codex sessions error test

* Address Codex import review findings

* Preserve forked Codex session id on sync

* Make Codex duplicate cleanup source-aware

* Handle Codex archive failures

* Limit existing session flag to Codex

* Preserve Codex import machine binding

* fix: rebase runner Codex import onto current main

* fix: preserve runner-scoped Codex import behavior

---------

Co-authored-by: syy <815728149@qq.com>
This commit is contained in:
NightWatcher314
2026-07-19 14:14:42 +08:00
committed by GitHub
co-authored by syy
parent 651c83a1d9
commit 64834467e3
42 changed files with 2536 additions and 133 deletions
+22
View File
@@ -57,6 +57,7 @@ export default {
'sessions.group.showLess': 'Show less',
'sessions.group.new': 'New session in this directory',
'codexSync.tooltip': 'Import sessions from Codex into Hapi',
'codexSync.newSessionAction': 'Import Codex history',
'codexSync.confirm.title': 'Import Codex sessions',
'codexSync.confirm.description': 'Choose Codex sessions to import into Hapi',
// 中文注释:以下文案支撑导入弹窗的多选列表、加载态,以及右上角重启 Codex 客户端按钮提示。
@@ -74,6 +75,9 @@ export default {
'codexSync.confirm.loading': 'Loading local Codex sessions…',
'codexSync.success.title': 'Import complete',
'codexSync.success.body': 'Imported {n} Codex session(s) into Hapi.',
'codexSync.manual.success.title': 'Codex sync complete',
'codexSync.manual.success.body': 'Synced {n} Codex session(s).',
'codexSync.manual.failed.title': 'Failed to sync Codex session',
'codexSync.error.timeout': 'Operation timed out',
'codexSync.error.active': 'This session is still active. Please wait until it ends and try again.',
'codexSync.failed.title': 'Failed to import Codex sessions',
@@ -157,6 +161,7 @@ export default {
// Session actions
'session.action.rename': 'Rename',
'session.action.export': 'Export conversation',
'session.action.syncCodex': 'Sync from Codex',
'session.action.archive': 'Archive',
'session.action.reopen': 'Reopen',
'session.action.reopenCursorChecking': 'Checking whether Cursor chat data is still available on the recorded machine.',
@@ -785,4 +790,21 @@ export default {
'share.preview.empty': '(empty share)',
'share.preview.files': '{n} files',
'share.noActiveSessions': 'No active sessions. Pick "New session" below.',
'button.refresh': 'Refresh',
'sessions.refresh.success.title': 'Refreshed',
'sessions.refresh.success.body': 'Session list updated.',
'sessions.refresh.failed.title': 'Refresh failed',
'codexSync.newSessionInline.title': 'Import Codex history',
'codexSync.newSessionInline.description': 'Optional: choose one local Codex session, then pick model/settings and Create to import.',
'codexSync.newSessionInline.clear': 'Clear selected history',
'codexSync.newSessionInline.choose': 'Choose history',
'codexSync.confirm.search': 'Search',
'codexSync.confirm.searchPlaceholder': 'Search title, message, directory, session id',
'codexSync.confirm.useSelected': 'Use selected',
'codexSync.confirm.imported': 'Imported',
'codexSync.confirm.original': 'Original',
'codexSync.confirm.fork': 'Fork',
'codexSync.confirm.archiveAction': 'Archive in Codex',
'session.action.syncCodexDisabledActive': 'Stop or archive the running session before syncing Codex history.',
'codexSync.manual.success.noNewMessages': 'No new Codex messages.',
} as const