@muyichengshayu/promptx 0.1.42 → 0.1.44

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 (76) hide show
  1. package/CHANGELOG.md +13 -0
  2. package/apps/server/src/codexRoutes.js +13 -0
  3. package/apps/server/src/index.js +2 -0
  4. package/apps/server/src/workspaceFiles.js +242 -1
  5. package/apps/web/dist/assets/CodexSessionManagerDialog-D7MUHe2h.js +1 -0
  6. package/apps/web/dist/assets/TaskDiffReviewDialog-C3WgGtC2.js +2 -0
  7. package/apps/web/dist/assets/WorkbenchSettingsDialog-DPnL7UAx.js +1 -0
  8. package/apps/web/dist/assets/WorkbenchView-CB2beALS.js +47 -0
  9. package/apps/web/dist/assets/WorkbenchView-caF5wQfm.css +1 -0
  10. package/apps/web/dist/assets/index-By0kbUJQ.js +2 -0
  11. package/apps/web/dist/assets/index-qxA1pzRS.css +1 -0
  12. package/apps/web/dist/assets/{vendor-shiki-core-BEj7WMrf.js → vendor-shiki-core-BnzZnwfD.js} +4 -4
  13. package/apps/web/dist/assets/vendor-shiki-lang-bash-DvIe5yFX.js +1 -0
  14. package/apps/web/dist/assets/vendor-shiki-lang-c-DsfNMf57.js +1 -0
  15. package/apps/web/dist/assets/vendor-shiki-lang-cpp-DJeq1KY_.js +1 -0
  16. package/apps/web/dist/assets/vendor-shiki-lang-csharp-CfWxWYxW.js +1 -0
  17. package/apps/web/dist/assets/vendor-shiki-lang-css-oWiIfyaT.js +1 -0
  18. package/apps/web/dist/assets/vendor-shiki-lang-diff-DPOfCluu.js +1 -0
  19. package/apps/web/dist/assets/vendor-shiki-lang-dockerfile-CehKevaB.js +1 -0
  20. package/apps/web/dist/assets/vendor-shiki-lang-dotenv-OOt7jwxE.js +1 -0
  21. package/apps/web/dist/assets/vendor-shiki-lang-fish-BIcGBJxU.js +1 -0
  22. package/apps/web/dist/assets/vendor-shiki-lang-go-B46FgY49.js +1 -0
  23. package/apps/web/dist/assets/vendor-shiki-lang-html-D2lGgzRb.js +1 -0
  24. package/apps/web/dist/assets/vendor-shiki-lang-ini-BRO-4anr.js +1 -0
  25. package/apps/web/dist/assets/vendor-shiki-lang-java-CNTxAD-j.js +1 -0
  26. package/apps/web/dist/assets/vendor-shiki-lang-javascript-hLLwg4kE.js +1 -0
  27. package/apps/web/dist/assets/vendor-shiki-lang-json-DVxgtBUk.js +1 -0
  28. package/apps/web/dist/assets/vendor-shiki-lang-less-Bm0zE0qZ.js +1 -0
  29. package/apps/web/dist/assets/vendor-shiki-lang-markdown-Ctd6eGrZ.js +1 -0
  30. package/apps/web/dist/assets/vendor-shiki-lang-powershell-C4XrPiEo.js +1 -0
  31. package/apps/web/dist/assets/vendor-shiki-lang-python-DzOtNOWI.js +1 -0
  32. package/apps/web/dist/assets/vendor-shiki-lang-rust-BYDOAjeh.js +1 -0
  33. package/apps/web/dist/assets/vendor-shiki-lang-sass-CegctIKi.js +1 -0
  34. package/apps/web/dist/assets/vendor-shiki-lang-scss-COA3uazA.js +1 -0
  35. package/apps/web/dist/assets/vendor-shiki-lang-sql-DUzqOedr.js +1 -0
  36. package/apps/web/dist/assets/vendor-shiki-lang-toml-BPfcgC5W.js +1 -0
  37. package/apps/web/dist/assets/vendor-shiki-lang-tsx-wehLdarw.js +1 -0
  38. package/apps/web/dist/assets/vendor-shiki-lang-typescript-CdBtsRXV.js +1 -0
  39. package/apps/web/dist/assets/vendor-shiki-lang-vue-Dz_8CJBS.js +1 -0
  40. package/apps/web/dist/assets/vendor-shiki-lang-xml-DvWyHJVz.js +1 -0
  41. package/apps/web/dist/assets/vendor-shiki-lang-yaml-DzJ1MBJQ.js +1 -0
  42. package/apps/web/dist/assets/vendor-shiki-theme-github-dark-default-CgnhGCyu.js +1 -0
  43. package/apps/web/dist/assets/vendor-shiki-theme-github-light-UIi0TSpi.js +1 -0
  44. package/apps/web/dist/assets/{vendor-ui-DlJXv6Z0.js → vendor-ui-DTqxu3Qf.js} +55 -45
  45. package/apps/web/dist/index.html +2 -2
  46. package/package.json +1 -1
  47. package/apps/web/dist/assets/CodexSessionManagerDialog-DH2dM17T.css +0 -1
  48. package/apps/web/dist/assets/CodexSessionManagerDialog-l1owFA6n.js +0 -2
  49. package/apps/web/dist/assets/TaskDiffReviewDialog-BQB_ZIjd.js +0 -2
  50. package/apps/web/dist/assets/WorkbenchSettingsDialog-CgvCPSFx.js +0 -1
  51. package/apps/web/dist/assets/WorkbenchView-BTxN9MWc.js +0 -45
  52. package/apps/web/dist/assets/WorkbenchView-CmvPuVjx.css +0 -1
  53. package/apps/web/dist/assets/index-CCgke-qd.css +0 -1
  54. package/apps/web/dist/assets/index-DFFeo0Jj.js +0 -2
  55. package/apps/web/dist/assets/vendor-shiki-lang-bash-CsFNeEqN.js +0 -1
  56. package/apps/web/dist/assets/vendor-shiki-lang-c-BcjOwTnT.js +0 -1
  57. package/apps/web/dist/assets/vendor-shiki-lang-cpp-RQOeHt9v.js +0 -1
  58. package/apps/web/dist/assets/vendor-shiki-lang-css-CnK7V8uS.js +0 -1
  59. package/apps/web/dist/assets/vendor-shiki-lang-diff-Ba_mN76d.js +0 -1
  60. package/apps/web/dist/assets/vendor-shiki-lang-dockerfile-DexPvRap.js +0 -1
  61. package/apps/web/dist/assets/vendor-shiki-lang-go-Dk57BT_E.js +0 -1
  62. package/apps/web/dist/assets/vendor-shiki-lang-html-D-4N43uu.js +0 -1
  63. package/apps/web/dist/assets/vendor-shiki-lang-java-Ataf9s36.js +0 -1
  64. package/apps/web/dist/assets/vendor-shiki-lang-javascript-BmgvEpOZ.js +0 -1
  65. package/apps/web/dist/assets/vendor-shiki-lang-json-BM2fuodu.js +0 -1
  66. package/apps/web/dist/assets/vendor-shiki-lang-markdown-D1kkAUm_.js +0 -1
  67. package/apps/web/dist/assets/vendor-shiki-lang-python-NfTv2t04.js +0 -1
  68. package/apps/web/dist/assets/vendor-shiki-lang-rust-CnDh16MN.js +0 -1
  69. package/apps/web/dist/assets/vendor-shiki-lang-sql-s5-_63Hi.js +0 -1
  70. package/apps/web/dist/assets/vendor-shiki-lang-tsx-CLUFHL3U.js +0 -1
  71. package/apps/web/dist/assets/vendor-shiki-lang-typescript-Ctu8XPGP.js +0 -1
  72. package/apps/web/dist/assets/vendor-shiki-lang-vue-C5VFP2hw.js +0 -1
  73. package/apps/web/dist/assets/vendor-shiki-lang-xml-_rmOJA0y.js +0 -1
  74. package/apps/web/dist/assets/vendor-shiki-lang-yaml-DIKR-ygN.js +0 -1
  75. package/apps/web/dist/assets/vendor-shiki-theme-github-dark-default-DvEFPrX1.js +0 -1
  76. package/apps/web/dist/assets/vendor-shiki-theme-github-light-DxBVwbUZ.js +0 -1
package/CHANGELOG.md CHANGED
@@ -1,5 +1,18 @@
1
1
  # Changelog
2
2
 
3
+ ## 0.1.44
4
+
5
+ - 修复源码相关搜索列表的路径截断:源码查看、目录选择与 `@` 文件选择器里的搜索结果,文件名与完整路径都改为优先完整展示,不再因为单行省略而看不清长路径。
6
+ - 补齐常用样式 / 配置文件的语言识别与高亮:新增 `SCSS / Sass / Less / TOML / INI / .env / C#` 的源码预览与回复代码块语言映射,解决 `.scss` 等文件明明是代码却仍按纯文本展示的问题。
7
+ - 为上述语言识别补充前后端回归测试,并再次确认前端构建无大包告警,保证这轮补丁发布足够稳定。
8
+
9
+ ## 0.1.43
10
+
11
+ - 继续完善项目源码查看:左侧目录树、路径搜索、内容搜索、`@` 文件选择器与代码变更文件列表统一为同一套选中 / hover / 间距 / 图标 / 副文本视觉语言,深浅主题下的状态反馈更一致。
12
+ - 项目源码查看补齐键盘与搜索体验:支持 `↑ / ↓ / ← / → / Enter / Esc / Tab` 的连续操作,输入框默认接管焦点;内容搜索结果改为按文件分组展示,右侧预览可同步滚到命中行,并区分“命中行 / 当前命中行 / 命中关键词”三层高亮。
13
+ - 优化源码预览性能:同一文件内多处命中切换不再重复请求完整内容,弹窗内增加最近使用预览缓存,减少内容搜索场景下的重复加载与闪烁。
14
+ - 新增项目只读源码浏览链路与接口:项目管理支持直接打开源码弹层,服务端补充工作区目录树、路径搜索、内容搜索与文件内容读取能力,并补齐相关前后端测试。
15
+
3
16
  ## 0.1.42
4
17
 
5
18
  - 继续收敛中栏消息阅读体验:去掉 `PromptX` 与 `response` 卡片头部的“展开 / 收起”入口,两类卡片默认始终完整展开,避免频繁折叠造成阅读打断。
@@ -77,6 +77,7 @@ function registerCodexRoutes(app, options = {}) {
77
77
  resetPromptxCodexSession = () => null,
78
78
  runDispatchService,
79
79
  searchDirectoryPickerEntries,
80
+ searchWorkspaceFileContent,
80
81
  searchWorkspaceEntries,
81
82
  updatePromptxCodexSession,
82
83
  } = options
@@ -140,6 +141,18 @@ function registerCodexRoutes(app, options = {}) {
140
141
  })
141
142
  })
142
143
 
144
+ app.get('/api/codex/sessions/:sessionId/files/content-search', async (request, reply) => {
145
+ const session = getPromptxCodexSessionById(request.params.sessionId)
146
+ if (!session) {
147
+ return reply.code(404).send({ messageKey: 'errors.sessionNotFound', message: '没有找到对应的 PromptX 项目。' })
148
+ }
149
+
150
+ return searchWorkspaceFileContent(session.cwd, {
151
+ query: request.query?.q,
152
+ limit: request.query?.limit,
153
+ })
154
+ })
155
+
143
156
  app.post('/api/codex/sessions', async (request, reply) => {
144
157
  const session = createPromptxCodexSession(request.body || {})
145
158
  broadcastServerEvent('sessions.changed', {
@@ -55,6 +55,7 @@ import {
55
55
  readWorkspaceFileContent,
56
56
  listWorkspaceTree,
57
57
  searchDirectoryPickerEntries,
58
+ searchWorkspaceFileContent,
58
59
  searchWorkspaceEntries,
59
60
  } from './workspaceFiles.js'
60
61
  import { ensurePromptxStorageReady, serverRootDir } from './appPaths.js'
@@ -422,6 +423,7 @@ registerCodexRoutes(app, {
422
423
  resetPromptxCodexSession,
423
424
  runDispatchService,
424
425
  searchDirectoryPickerEntries,
426
+ searchWorkspaceFileContent,
425
427
  searchWorkspaceEntries,
426
428
  updatePromptxCodexSession,
427
429
  })
@@ -37,19 +37,24 @@ const DIRECTORY_PICKER_HIDDEN_NAMES = new Set([
37
37
 
38
38
  const DEFAULT_TREE_LIMIT = 200
39
39
  const DEFAULT_SEARCH_LIMIT = 80
40
+ const DEFAULT_CONTENT_SEARCH_LIMIT = 80
40
41
  const MAX_SEARCH_VISITS = 20000
41
42
  const DIRECTORY_PICKER_LIMIT = 240
42
43
  const DEFAULT_FILE_PREVIEW_LIMIT = 200 * 1024
43
44
  const MAX_IMAGE_PREVIEW_BYTES = 2 * 1024 * 1024
45
+ const MAX_CONTENT_SEARCH_FILE_BYTES = 1024 * 1024
46
+ const MAX_CONTENT_MATCHES_PER_FILE = 20
44
47
 
45
48
  const TEXT_FILE_EXTENSIONS = new Set([
46
49
  '.c',
47
50
  '.cc',
48
51
  '.conf',
49
52
  '.cpp',
53
+ '.csh',
50
54
  '.css',
51
55
  '.csv',
52
56
  '.env',
57
+ '.fish',
53
58
  '.gitignore',
54
59
  '.go',
55
60
  '.graphql',
@@ -60,12 +65,16 @@ const TEXT_FILE_EXTENSIONS = new Set([
60
65
  '.js',
61
66
  '.json',
62
67
  '.jsx',
68
+ '.less',
63
69
  '.log',
64
70
  '.md',
65
71
  '.mjs',
72
+ '.ps1',
66
73
  '.py',
67
74
  '.rb',
68
75
  '.rs',
76
+ '.sass',
77
+ '.scss',
69
78
  '.sh',
70
79
  '.sql',
71
80
  '.svg',
@@ -87,6 +96,7 @@ const IMAGE_MIME_TYPES = new Map([
87
96
  ['.jpeg', 'image/jpeg'],
88
97
  ['.jpg', 'image/jpeg'],
89
98
  ['.png', 'image/png'],
99
+ ['.svg', 'image/svg+xml'],
90
100
  ['.webp', 'image/webp'],
91
101
  ])
92
102
 
@@ -96,22 +106,31 @@ const LANGUAGE_BY_EXTENSION = new Map([
96
106
  ['.c', 'c'],
97
107
  ['.cc', 'cpp'],
98
108
  ['.cpp', 'cpp'],
109
+ ['.csh', 'bash'],
99
110
  ['.css', 'css'],
100
111
  ['.diff', 'diff'],
112
+ ['.env', 'dotenv'],
113
+ ['.fish', 'fish'],
101
114
  ['.go', 'go'],
102
115
  ['.h', 'c'],
103
116
  ['.html', 'html'],
117
+ ['.ini', 'ini'],
104
118
  ['.java', 'java'],
105
119
  ['.js', 'javascript'],
106
120
  ['.json', 'json'],
107
121
  ['.jsx', 'react'],
122
+ ['.less', 'less'],
108
123
  ['.md', 'markdown'],
109
124
  ['.mjs', 'javascript'],
125
+ ['.ps1', 'powershell'],
110
126
  ['.py', 'python'],
111
127
  ['.rs', 'rust'],
128
+ ['.sass', 'sass'],
129
+ ['.scss', 'scss'],
112
130
  ['.sh', 'bash'],
113
131
  ['.sql', 'sql'],
114
132
  ['.svg', 'svg'],
133
+ ['.toml', 'toml'],
115
134
  ['.ts', 'typescript'],
116
135
  ['.tsx', 'react'],
117
136
  ['.txt', 'text'],
@@ -120,8 +139,18 @@ const LANGUAGE_BY_EXTENSION = new Map([
120
139
  ['.yaml', 'yaml'],
121
140
  ['.yml', 'yaml'],
122
141
  ['Dockerfile', 'dockerfile'],
142
+ ['pip', 'python'],
143
+ ['pip3', 'python'],
123
144
  ])
124
145
 
146
+ const LANGUAGE_BY_SHEBANG_PATTERN = [
147
+ [/python(?:\d+(?:\.\d+)*)?$/, 'python'],
148
+ [/(?:ba|z|k|c|tc)?sh$/, 'bash'],
149
+ [/fish$/, 'fish'],
150
+ [/(?:pwsh|powershell)$/, 'powershell'],
151
+ [/node$/, 'javascript'],
152
+ ]
153
+
125
154
  function createHttpError(message, statusCode = 400) {
126
155
  return createApiError('', message, statusCode)
127
156
  }
@@ -379,11 +408,46 @@ function getFileLanguage(relativePath = '', absolutePath = '') {
379
408
  return LANGUAGE_BY_EXTENSION.get(extension) || ''
380
409
  }
381
410
 
411
+ function getShebangLanguage(buffer) {
412
+ if (!Buffer.isBuffer(buffer) || !buffer.length) {
413
+ return ''
414
+ }
415
+
416
+ const firstLine = buffer.toString('utf8', 0, Math.min(buffer.length, 200)).split(/\r?\n/, 1)[0] || ''
417
+ if (!firstLine.startsWith('#!')) {
418
+ return ''
419
+ }
420
+
421
+ const command = firstLine
422
+ .replace(/^#!\s*/, '')
423
+ .replace(/\s+-\S+/g, ' ')
424
+ .trim()
425
+ .split(/\s+/)
426
+ .pop() || ''
427
+ const executable = path.basename(command).toLowerCase()
428
+
429
+ for (const [pattern, language] of LANGUAGE_BY_SHEBANG_PATTERN) {
430
+ if (pattern.test(executable)) {
431
+ return language
432
+ }
433
+ }
434
+
435
+ return ''
436
+ }
437
+
382
438
  function getImageMimeType(relativePath = '', absolutePath = '') {
383
439
  const extension = path.extname(String(relativePath || absolutePath || '')).toLowerCase()
384
440
  return IMAGE_MIME_TYPES.get(extension) || ''
385
441
  }
386
442
 
443
+ function isKnownTextFilePath(relativePath = '', absolutePath = '') {
444
+ const targetName = path.basename(String(relativePath || absolutePath || '').trim())
445
+ const extension = path.extname(targetName).toLowerCase()
446
+
447
+ return TEXT_FILE_EXTENSIONS.has(targetName)
448
+ || TEXT_FILE_EXTENSIONS.has(extension)
449
+ }
450
+
387
451
  function removeExtension(value = '') {
388
452
  const normalized = String(value || '')
389
453
  const extensionIndex = normalized.lastIndexOf('.')
@@ -557,6 +621,45 @@ function scoreWorkspaceMatch(relativePath = '', query = '') {
557
621
  return Math.max(pathScore, nameScore, segmentScore)
558
622
  }
559
623
 
624
+ function isSearchableTextFile(relativePath = '', absolutePath = '', stats = null) {
625
+ if (isKnownTextFilePath(relativePath, absolutePath)) {
626
+ return true
627
+ }
628
+
629
+ const sampleSize = Math.min(Number(stats?.size || 0), 8192)
630
+ if (sampleSize <= 0) {
631
+ return true
632
+ }
633
+
634
+ try {
635
+ const sample = readFileSlice(absolutePath, sampleSize)
636
+ return !isLikelyBinaryBuffer(sample)
637
+ } catch {
638
+ return false
639
+ }
640
+ }
641
+
642
+ function createContentSearchPreview(line = '', matchIndex = 0, matchLength = 0, maxLength = 180) {
643
+ const source = String(line || '')
644
+ if (!source) {
645
+ return ''
646
+ }
647
+
648
+ const safeMatchIndex = Math.max(0, Number(matchIndex) || 0)
649
+ const safeMatchLength = Math.max(1, Number(matchLength) || 1)
650
+ if (source.length <= maxLength) {
651
+ return source
652
+ }
653
+
654
+ const padding = Math.max(24, Math.floor((maxLength - safeMatchLength) / 2))
655
+ const start = Math.max(0, safeMatchIndex - padding)
656
+ const end = Math.min(source.length, safeMatchIndex + safeMatchLength + padding)
657
+ const prefix = start > 0 ? '…' : ''
658
+ const suffix = end < source.length ? '…' : ''
659
+
660
+ return `${prefix}${source.slice(start, end)}${suffix}`
661
+ }
662
+
560
663
  export function listWorkspaceTree(workspacePath, options = {}) {
561
664
  const target = resolveWorkspaceTarget(workspacePath, options.path)
562
665
  const type = getPathType(target.absolutePath)
@@ -679,6 +782,142 @@ export function searchWorkspaceEntries(workspacePath, options = {}) {
679
782
  }
680
783
  }
681
784
 
785
+ export function searchWorkspaceFileContent(workspacePath, options = {}) {
786
+ const root = path.resolve(String(workspacePath || ''))
787
+ const query = String(options.query || '').trim()
788
+ const limit = clampLimit(options.limit, DEFAULT_CONTENT_SEARCH_LIMIT, 200)
789
+
790
+ if (!query) {
791
+ return {
792
+ cwd: root,
793
+ query: '',
794
+ items: [],
795
+ truncated: false,
796
+ }
797
+ }
798
+
799
+ const normalizedQuery = query.toLowerCase()
800
+ const matches = []
801
+ let visited = 0
802
+ let truncated = false
803
+ const stack = ['']
804
+
805
+ while (stack.length) {
806
+ const currentRelativePath = stack.pop()
807
+ const currentAbsolutePath = currentRelativePath
808
+ ? path.join(root, currentRelativePath)
809
+ : root
810
+
811
+ let entries = []
812
+ try {
813
+ entries = fs.readdirSync(currentAbsolutePath, { withFileTypes: true })
814
+ } catch {
815
+ continue
816
+ }
817
+
818
+ entries.sort((left, right) => left.name.localeCompare(right.name, 'zh-CN'))
819
+
820
+ for (const entry of entries) {
821
+ if (shouldIgnoreDirectory(entry)) {
822
+ continue
823
+ }
824
+
825
+ visited += 1
826
+ if (visited > MAX_SEARCH_VISITS) {
827
+ truncated = true
828
+ stack.length = 0
829
+ break
830
+ }
831
+
832
+ const relativePath = currentRelativePath
833
+ ? `${toPosixPath(currentRelativePath)}/${entry.name}`
834
+ : entry.name
835
+ const absolutePath = path.join(currentAbsolutePath, entry.name)
836
+
837
+ if (entry.isDirectory()) {
838
+ stack.push(path.join(currentRelativePath, entry.name))
839
+ continue
840
+ }
841
+
842
+ let stats
843
+ try {
844
+ stats = fs.statSync(absolutePath)
845
+ } catch {
846
+ continue
847
+ }
848
+
849
+ if (!stats.isFile() || stats.size > MAX_CONTENT_SEARCH_FILE_BYTES) {
850
+ continue
851
+ }
852
+
853
+ if (!isSearchableTextFile(relativePath, absolutePath, stats)) {
854
+ continue
855
+ }
856
+
857
+ let content = ''
858
+ try {
859
+ content = fs.readFileSync(absolutePath, 'utf8').replace(/\r\n/g, '\n')
860
+ } catch {
861
+ continue
862
+ }
863
+
864
+ const lines = content.split('\n')
865
+ let fileMatchCount = 0
866
+
867
+ for (let lineIndex = 0; lineIndex < lines.length; lineIndex += 1) {
868
+ const line = String(lines[lineIndex] || '')
869
+ const normalizedLine = line.toLowerCase()
870
+ const matchIndex = normalizedLine.indexOf(normalizedQuery)
871
+ if (matchIndex < 0) {
872
+ continue
873
+ }
874
+
875
+ matches.push({
876
+ name: path.basename(relativePath),
877
+ path: toPosixPath(relativePath),
878
+ type: 'file',
879
+ line: lineIndex + 1,
880
+ column: matchIndex + 1,
881
+ preview: createContentSearchPreview(line, matchIndex, normalizedQuery.length),
882
+ })
883
+ fileMatchCount += 1
884
+
885
+ if (matches.length >= limit) {
886
+ truncated = true
887
+ stack.length = 0
888
+ break
889
+ }
890
+
891
+ if (fileMatchCount >= MAX_CONTENT_MATCHES_PER_FILE) {
892
+ truncated = true
893
+ break
894
+ }
895
+
896
+ if (truncated) {
897
+ break
898
+ }
899
+ }
900
+
901
+ if (truncated) {
902
+ break
903
+ }
904
+ }
905
+ }
906
+
907
+ matches.sort((left, right) => (
908
+ left.path.localeCompare(right.path, 'zh-CN')
909
+ || left.line - right.line
910
+ || left.column - right.column
911
+ ))
912
+
913
+ return {
914
+ cwd: root,
915
+ query,
916
+ items: matches.slice(0, limit),
917
+ truncated: truncated || matches.length > limit,
918
+ }
919
+ }
920
+
682
921
  export function readWorkspaceFileContent(workspacePath, options = {}) {
683
922
  const target = resolveWorkspaceTarget(workspacePath, options.path)
684
923
  const previewLimit = clampLimit(options.limit, DEFAULT_FILE_PREVIEW_LIMIT, DEFAULT_FILE_PREVIEW_LIMIT)
@@ -695,7 +934,7 @@ export function readWorkspaceFileContent(workspacePath, options = {}) {
695
934
  throw createApiError('errors.fileOnly', '只能读取文件内容。')
696
935
  }
697
936
 
698
- const language = getFileLanguage(target.relativePath, target.absolutePath)
937
+ let language = getFileLanguage(target.relativePath, target.absolutePath)
699
938
  const imageMimeType = getImageMimeType(target.relativePath, target.absolutePath)
700
939
  const basePayload = {
701
940
  cwd: target.root,
@@ -734,6 +973,7 @@ export function readWorkspaceFileContent(workspacePath, options = {}) {
734
973
  const extension = path.extname(fileName).toLowerCase()
735
974
  const isKnownTextFile = TEXT_FILE_EXTENSIONS.has(extension)
736
975
  const binary = !isKnownTextFile && isLikelyBinaryBuffer(buffer)
976
+ language = language || getShebangLanguage(buffer)
737
977
 
738
978
  if (binary) {
739
979
  return {
@@ -744,6 +984,7 @@ export function readWorkspaceFileContent(workspacePath, options = {}) {
744
984
 
745
985
  return {
746
986
  ...basePayload,
987
+ language,
747
988
  content: buffer.toString('utf8').replace(/\r\n/g, '\n'),
748
989
  truncated: stats.size > previewLimit,
749
990
  tooLarge: stats.size > previewLimit,
@@ -0,0 +1 @@
1
+ import{u as De,f as dt,c as ut}from"./index-By0kbUJQ.js";import{A as ct,n as Je,j as He,d as pt,W as Ye,c as st,k as ft,s as gt,m as vt,o as Ze,_ as mt,b as ht,p as et}from"./WorkbenchView-CB2beALS.js";import{w as me,n as re,ak as lt,aD as p,aI as he,aJ as xe,aF as n,aQ as d,u as l,aG as k,aW as xt,aU as yt,aX as bt,aE as m,aR as Te,aS as Ke,aL as A,aN as C,aV as wt,aK as St,b as _,c as S,aZ as it,r as kt}from"./vendor-misc-DxKJ95A9.js";import{c as $t,L as Ge,F as ze,e as _t,b as ot,M as Ct,o as Mt,x as jt,P as It,i as tt,E as Pt,N as Rt,n as Tt,r as Dt,O as Et}from"./vendor-ui-DTqxu3Qf.js";import"./vendor-router-iukOUtEP.js";import"./vendor-markdown-BENmzbO1.js";import"./vendor-tiptap-COqMdKic.js";function At(o=[]){return(Array.isArray(o)&&o.length?o:ct).filter($=>$&&typeof $=="object").map($=>{const f=Je($.value);return{...$,value:f,label:String($.label||He(f)).trim()||He(f),enabled:$.enabled!==!1,available:$.available!==!1}})}function Xe(o=[]){return At(o).filter(R=>R.enabled&&R.available)}async function Lt(){const o=await pt("/api/meta",{cache:"no-store"});return Xe(o==null?void 0:o.agentEngineOptions)}const Ft={class:"theme-heading inline-flex items-center gap-2 text-sm font-medium"},Bt={class:"theme-muted-text mt-1 text-xs leading-5"},Nt={class:"theme-divider mt-4 rounded-sm border border-dashed px-3 py-2"},Ot={class:"flex items-start gap-2 text-xs leading-5"},Ut={class:"theme-muted-text shrink-0"},zt={class:"min-w-0 break-all font-mono text-[var(--theme-textPrimary)]"},Ht={class:"theme-muted-text mt-4 block text-xs"},Kt={class:"theme-input-shell mt-1 flex h-10 items-center gap-2 rounded-sm border px-3 transition focus-within:ring-2"},Vt=["placeholder"],qt={class:"theme-content-panel mt-3 min-h-0 flex-1 overflow-y-auto p-2"},Wt={key:0,class:"theme-status-danger rounded-sm border border-dashed px-3 py-3 text-xs"},Qt={key:1,class:"theme-status-danger rounded-sm border border-dashed px-3 py-3 text-xs"},Gt={key:2,class:"theme-empty-state flex items-center justify-center gap-2 px-3 py-8 text-sm"},Jt={key:3,class:"theme-empty-state flex items-center justify-center gap-2 px-3 py-8 text-sm"},Xt={key:4,class:"theme-empty-state px-3 py-8 text-sm"},Yt={key:5,class:"theme-empty-state px-3 py-8 text-sm"},Zt={key:6,class:"theme-empty-state px-3 py-8 text-sm"},en={key:7,class:"space-y-1"},tn=["onClick"],nn={class:"min-w-0 flex-1"},an=["innerHTML"],sn=["innerHTML"],ln={key:0,class:"theme-muted-text px-1 pt-2 text-xs"},on={key:8,class:"space-y-1"},rn={class:"flex items-start gap-1.5"},dn=["onClick"],un=["onClick"],cn={class:"min-w-0 flex-1"},pn={key:0,class:"theme-list-item-subtitle theme-list-item-subtitle--mono break-all"},fn={class:"theme-divider flex flex-col-reverse gap-2 border-t border-dashed px-4 py-4 sm:flex-row sm:items-center sm:justify-end sm:px-5"},gn={class:"flex flex-col-reverse gap-2 sm:flex-row sm:items-center"},vn=["disabled"],mn=["disabled"],hn={__name:"CodexDirectoryPickerDialog",props:{open:{type:Boolean,default:!1},initialPath:{type:String,default:""},suggestions:{type:Array,default:()=>[]}},emits:["close","select"],setup(o,{emit:R}){const $=o,f=R,{t:v}=De(),M=_(""),c=_(null),x=_(!1),y=_(""),r=_(!1),g=_(""),L=_([]),Q=_(!1),E=_(""),I=_(""),K=_(null);let F=null,N=0,O=null;const V=new Map,ee=S(()=>$e(c.value?[c.value]:[])),q=S(()=>String(E.value||"").trim()),ae=S(()=>q.value.length>=Ye),P=S(()=>!!q.value),J=S(()=>P.value?L.value:ee.value),b=S(()=>J.value.map(e=>{const s=T((e==null?void 0:e.path)||""),a=e!=null&&e.expanded?1:0,u=e!=null&&e.loading?1:0;return`${s}:${a}:${u}`}).join("|")),ye=S(()=>P.value&&!ae.value&&!r.value&&!g.value),Ve=S(()=>P.value&&ae.value&&!r.value&&!g.value&&!L.value.length),de=S(()=>!P.value&&!x.value&&!y.value&&!ee.value.length);function se(e=""){const s=String(e||"").trim();return/^[a-z]:[\\/]/i.test(s)||s.includes("\\")}function T(e=""){const s=String(e||"").trim();if(!s)return"";const a=se(s);let u=s.replace(/\\/g,"/");return u.length>1&&!/^[a-z]:\/?$/i.test(u)&&u!=="/"&&(u=u.replace(/\/+$/,"")),a?u.toLowerCase():u}function X(e="",s=""){const a=T(e),u=T(s);return!a||!u?!1:a===u||a.startsWith(`${u}/`)}function j(e="",s=""){const a=String(e||"").trim(),u=String(s||"").trim();return a?u?se(a)?/^[a-z]:\\?$/i.test(a)?`${a.replace(/[\\/]+$/,"")}\\${u}`:`${a.replace(/[\\/]+$/,"")}\\${u}`:a==="/"?`/${u}`:`${a.replace(/\/+$/,"")}/${u}`:a:u}function qe(e="",s=""){const a=T(e),u=T(s);if(!a||!u||!X(u,a))return[];const B=u===a?"":u.slice(a.length).replace(/^\//,"");return B?B.split("/").filter(Boolean):[]}function ue(e=""){const s=String(e||"").trim();if(!s||T(s)===T(M.value))return"";const a=se(s),u=s.replace(/\\/g,"/");if(a){const Z=u.replace(/\/+$/,""),t=Z.lastIndexOf("/");if(t<=2)return"";const i=Z.slice(0,t).replace(/\//g,"\\");return X(i,M.value)?i:""}const B=u.replace(/\/+$/,""),G=B.lastIndexOf("/");if(G<=0)return"";const ve=B.slice(0,G)||"/";return X(ve,M.value)?ve:""}function be(e){return(e==null?void 0:e.name)||(e==null?void 0:e.path)||v("directoryPicker.unnamedDirectory")}function we(e=""){const s=String(e||"").trim();return s?s.split(/[\\/]/).filter(Boolean).at(-1)||s:"Home"}function oe(e=""){return String(e||"").replace(/&/g,"&amp;").replace(/</g,"&lt;").replace(/>/g,"&gt;").replace(/"/g,"&quot;").replace(/'/g,"&#39;")}function Ee(e="",s=""){const a=String(e||""),u=String(s||"").trim().toLowerCase();if(!a||!u)return null;const B=a.toLowerCase(),G=B.indexOf(u);if(G>=0)return{start:G,end:G+u.length};const ve=u.split(/[\\/\s_.-]+/).filter(Boolean).sort((Z,t)=>t.length-Z.length);for(const Z of ve){if(Z.length<2)continue;const t=B.indexOf(Z);if(t>=0)return{start:t,end:t+Z.length}}return null}function Se(e="",s=""){const a=String(e||""),u=Ee(a,s);return u?`${oe(a.slice(0,u.start))}<mark class="theme-search-highlight">${oe(a.slice(u.start,u.end))}</mark>${oe(a.slice(u.end))}`:oe(a)}function Ae(e){return Se(be(e),E.value)}function Le(e){return Se((e==null?void 0:e.path)||"",E.value)}function ke(e,s=0){return{...e,depth:s,expanded:!1,loaded:!1,loading:!1,children:[]}}function $e(e=[],s=[]){return e.forEach(a=>{s.push(a),a.expanded&&a.children.length&&$e(a.children,s)}),s}function te(){c.value&&(c.value={...c.value})}function U(){F&&(window.clearTimeout(F),F=null),O&&(O.abort(),O=null)}function ne(e,s=c.value?[c.value]:[]){const a=T(e);if(!a)return null;for(const u of s){if(T(u.path)===a)return u;if(u.children.length){const B=ne(e,u.children);if(B)return B}}return null}function z(e){I.value=String((e==null?void 0:e.path)||"").trim()}function Y(e=""){return T(e)}function ce(e,s){const a=Y(e);if(a){if(s){V.set(a,s);return}V.delete(a)}}function le(){var s;const e=V.get(Y(I.value));(s=e==null?void 0:e.scrollIntoView)==null||s.call(e,{block:"nearest"})}function _e(){re(()=>{var e,s;(s=(e=K.value)==null?void 0:e.focus)==null||s.call(e)})}function Ce(){const e=J.value;if(!e.length){I.value="";return}const s=Y(I.value);s&&e.some(a=>Y((a==null?void 0:a.path)||"")===s)||z(e[0])}function pe(){const e=J.value;if(!e.length)return-1;const s=Y(I.value),a=e.findIndex(u=>Y((u==null?void 0:u.path)||"")===s);return a>=0?a:0}function ie(){const e=J.value,s=pe();return s<0||!e.length?null:e[s]||null}function W(e=1){const s=J.value;if(!s.length)return!1;const a=pe(),u=a<0?0:(a+e+s.length)%s.length;return z(s[u]),re(le),!0}async function fe(){if(P.value)return!1;const e=ie();if(!e||!e.hasChildren)return!1;if(!e.expanded)return await Pe(e),!0;const s=J.value,a=pe(),u=s[a+1];return u&&ue(u.path)===e.path?(z(u),re(le),!0):!1}function Me(){if(P.value)return!1;const e=ie();if(!e)return!1;if(e.expanded&&e.hasChildren)return e.expanded=!1,te(),z(e),!0;const s=ue(e.path);if(!s)return!1;const a=ne(s);return a?(z(a),re(le),!0):!1}function ge(e){var s,a,u;if((s=e==null?void 0:e.preventDefault)==null||s.call(e),q.value){(a=e==null?void 0:e.stopPropagation)==null||a.call(e),E.value="";return}(u=e==null?void 0:e.stopPropagation)==null||u.call(e),f("close")}function Fe(e){const s=String((e==null?void 0:e.key)||"");if(["ArrowDown","ArrowUp","ArrowLeft","ArrowRight","Enter","Escape"].includes(s)&&!(P.value&&(s==="ArrowLeft"||s==="ArrowRight"))){if(s==="ArrowDown"){e.preventDefault(),W(1);return}if(s==="ArrowUp"){e.preventDefault(),W(-1);return}if(s==="Escape"){ge(e);return}if(P.value){if(s==="Enter"){e.preventDefault();const a=ie();a&&Re(a)}return}if(s==="ArrowRight"){e.preventDefault(),fe();return}if(s==="ArrowLeft"){e.preventDefault(),Me();return}s==="Enter"&&(e.preventDefault(),Ue())}}async function je(e,s={}){if(!(!e||e.loading)&&!(e.loaded&&!s.force)){e.loading=!0,y.value="",te();try{const a=await Ze({path:e.path,limit:240});e.children=(a.items||[]).map(u=>ke(u,e.depth+1)),e.loaded=!0}catch(a){y.value=a.message||v("directoryPicker.loadFailed")}finally{e.loading=!1,te()}}}async function We(){x.value=!0,y.value="";try{const e=await Ze({limit:240});M.value=String(e.path||""),c.value=ke({name:we(e.path||""),path:String(e.path||""),type:"directory",hasChildren:!0,isHomeRoot:!0},0),c.value.children=(e.items||[]).map(s=>ke(s,1)),c.value.loaded=!0,c.value.expanded=!0,z(c.value)}catch(e){y.value=e.message||v("directoryPicker.treeLoadFailed"),c.value=null,M.value=""}finally{x.value=!1}}async function Ie(e=""){const s=String(e||"").trim();if(!s||!M.value||!X(s,M.value))return;let a=c.value;if(!a)return;z(a);const u=qe(M.value,s);for(const B of u){await je(a),a.expanded=!0,te();const G=ne(j(a.path,B),a.children);if(!G)break;a=G,z(a)}}async function Qe(){E.value="",L.value=[],g.value="",Q.value=!1,I.value="",await We();const e=String($.initialPath||"").trim();e&&X(e,M.value)&&await Ie(e)}async function Pe(e){if(e!=null&&e.path&&(z(e),!!e.hasChildren)){if(!e.loaded){e.expanded=!0,te(),await je(e);return}e.expanded=!e.expanded,te()}}function Be(e){e!=null&&e.path&&z(e)}async function Ne(){const e=String(E.value||"").trim();N+=1;const s=N;if(U(),!$.open||!e||!M.value||!ae.value){r.value=!1,g.value="",L.value=[],Q.value=!1;return}r.value=!0,g.value="",O=new AbortController;try{const a=await gt(e,{path:M.value,limit:80,signal:O.signal});if(s!==N)return;L.value=Array.isArray(a.items)?a.items:[],Q.value=!!a.truncated}catch(a){if(vt(a)||s!==N)return;g.value=a.message||v("directoryPicker.searchFailed"),L.value=[],Q.value=!1}finally{s===N&&(O=null),s===N&&(r.value=!1)}}function Oe(){if(U(),!String(E.value||"").trim()||!ae.value){r.value=!1,g.value="",L.value=[],Q.value=!1;return}r.value=!0,g.value="",F=window.setTimeout(()=>{F=null,Ne()},ft)}async function Re(e){e!=null&&e.path&&(await Ie(e.path),E.value="")}function Ue(){I.value&&(f("select",I.value),f("close"))}return me(E,()=>{Oe()}),me(b,()=>{Ce(),re(le)},{immediate:!0}),me(()=>$.open,e=>{if(e){Qe().catch(()=>{}),_e();return}U()}),lt(()=>{U()}),(e,s)=>(p(),he(st,{open:o.open,"stack-level":1,"panel-class":"settings-dialog-panel h-full max-w-4xl sm:h-auto sm:max-h-[86vh]","header-class":"settings-dialog-header px-5 py-4","body-class":"settings-dialog-body flex min-h-0 flex-1 flex-col overflow-hidden px-4 py-4 sm:px-5","close-disabled":x.value||r.value,"close-on-backdrop":!(x.value||r.value),"close-on-escape":!(x.value||r.value),onClose:s[2]||(s[2]=a=>f("close"))},{title:xe(()=>[n("div",null,[n("div",Ft,[k(l(ze),{class:"h-4 w-4"}),n("span",null,d(l(v)("directoryPicker.title")),1)]),n("p",Bt,d(l(v)("directoryPicker.intro")),1)])]),default:xe(()=>[n("div",{class:"flex min-h-0 flex-1 flex-col overflow-hidden",onKeydown:Fe},[n("div",Nt,[n("div",Ot,[n("span",Ut,d(l(v)("directoryPicker.currentSelection")),1),n("span",zt,d(I.value||l(v)("directoryPicker.selectionPlaceholder")),1)])]),n("label",Ht,[n("span",null,d(l(v)("directoryPicker.searchLabel")),1),n("div",Kt,[k(l($t),{class:"h-4 w-4 shrink-0 text-[var(--theme-textMuted)]"}),xt(n("input",{ref_key:"searchInputRef",ref:K,"onUpdate:modelValue":s[0]||(s[0]=a=>E.value=a),type:"text",placeholder:l(v)("directoryPicker.searchPlaceholder"),class:"min-w-0 flex-1 border-0 bg-transparent px-0 text-sm text-[var(--theme-textPrimary)] outline-none placeholder:text-[var(--theme-textMuted)]",onKeydown:yt(ge,["esc"])},null,40,Vt),[[bt,E.value]])])]),n("div",qt,[P.value&&g.value?(p(),m("div",Wt,d(g.value),1)):!P.value&&y.value?(p(),m("div",Qt,d(y.value),1)):P.value&&r.value?(p(),m("div",Gt,[k(l(Ge),{class:"h-4 w-4 animate-spin"}),n("span",null,d(l(v)("directoryPicker.searching")),1)])):!P.value&&x.value?(p(),m("div",Jt,[k(l(Ge),{class:"h-4 w-4 animate-spin"}),n("span",null,d(l(v)("directoryPicker.treeLoading")),1)])):ye.value?(p(),m("div",Xt,d(l(v)("directoryPicker.searchMinKeywordHint",{count:l(Ye)})),1)):Ve.value?(p(),m("div",Yt,d(l(v)("directoryPicker.noSearchResults")),1)):de.value?(p(),m("div",Zt,d(l(v)("directoryPicker.emptyTree")),1)):P.value?(p(),m("div",en,[(p(!0),m(Te,null,Ke(L.value,a=>(p(),m("button",{key:a.path,ref_for:!0,ref:u=>ce(a.path,u),type:"button",class:A(["theme-list-row focus:outline-none",T(I.value)===T(a.path)?"theme-list-item-active":"theme-list-item-hover"]),onClick:u=>Re(a)},[k(l(ze),{class:"theme-list-item-icon"}),n("div",nn,[n("div",null,[n("span",{class:"theme-list-item-title block break-all",innerHTML:Ae(a)},null,8,an)]),n("div",{class:"theme-list-item-subtitle theme-list-item-subtitle--mono break-all",innerHTML:Le(a)},null,8,sn)])],10,tn))),128)),Q.value?(p(),m("p",ln,d(l(v)("directoryPicker.truncatedHint")),1)):C("",!0)])):(p(),m("div",on,[(p(!0),m(Te,null,Ke(ee.value,a=>(p(),m("div",{key:a.path,ref_for:!0,ref:u=>ce(a.path,u),class:A(["theme-list-tree-item outline-none focus:outline-none focus-visible:outline-none",T(I.value)===T(a.path)?"theme-list-item-active":a.expanded?"theme-list-item-expanded":"theme-list-item-hover"]),style:wt({paddingLeft:`${a.depth*16+6}px`})},[n("div",rn,[n("button",{type:"button",class:A(["theme-icon-button h-5 w-5 shrink-0",a.hasChildren?"":"invisible pointer-events-none"]),onClick:St(u=>Pe(a),["stop"])},[a.loading?(p(),he(l(Ge),{key:0,class:"h-3.5 w-3.5 animate-spin"})):(p(),he(l(_t),{key:1,class:A(["h-3.5 w-3.5 transition",a.expanded?"rotate-90 text-[var(--theme-textPrimary)]":""])},null,8,["class"]))],10,dn),n("button",{type:"button",class:"flex min-w-0 flex-1 items-start gap-1.5 rounded-sm px-0.5 py-0.5 text-left",onClick:u=>Be(a)},[k(l(ze),{class:A(["h-4 w-4 shrink-0",T(I.value)===T(a.path)?"text-[var(--theme-textPrimary)]":"text-[var(--theme-textMuted)]"])},null,8,["class"]),n("div",cn,[n("div",{class:A(["theme-list-item-title truncate",a.isHomeRoot?"font-medium text-[var(--theme-textSecondary)]":"font-medium text-[var(--theme-textPrimary)]"])},d(be(a)),3),a.isHomeRoot?(p(),m("div",pn,d(a.path),1)):C("",!0)])],8,un)])],6))),128))]))])],32),n("div",fn,[n("div",gn,[n("button",{type:"button",class:"tool-button w-full px-3 py-2 text-xs sm:w-auto",disabled:x.value||r.value,onClick:s[1]||(s[1]=a=>f("close"))},d(l(v)("directoryPicker.cancel")),9,vn),n("button",{type:"button",class:"tool-button tool-button-primary inline-flex w-full items-center justify-center gap-2 px-3 py-2 text-xs sm:w-auto",disabled:x.value||r.value||!I.value,onClick:Ue},[k(l(ot),{class:"h-4 w-4"}),n("span",null,d(l(v)("directoryPicker.useCurrentDirectory")),1)],8,mn)])])]),_:1},8,["open","close-disabled","close-on-backdrop","close-on-escape"]))}},xn={class:"grid gap-4"},yn={class:"theme-muted-text block text-xs"},bn=["value","disabled"],wn={class:"theme-muted-text block text-xs"},Sn={class:"mt-1 flex gap-2"},kn=["value","disabled"],$n=["disabled"],_n={id:"codex-manager-workspace-suggestions"},Cn=["value"],Mn={key:0,class:"mt-2 text-[11px] leading-5 text-[var(--theme-warningText)]"},jn={key:1,class:"theme-muted-text mt-2 text-[11px] leading-5"},In={class:"theme-muted-text block text-xs"},Pn={class:"mt-1"},Rn={class:"flex items-center gap-2 text-sm"},Tn={key:0,class:"theme-muted-text rounded-sm border border-dashed px-1.5 py-0.5 text-[10px]"},Dn=["disabled","onClick"],En={class:"flex items-center justify-between gap-3"},An={class:"min-w-0 flex-1 truncate"},Ln={key:0,class:"theme-muted-text rounded-sm border border-dashed px-1.5 py-0.5 text-[10px]"},Fn={key:0,class:"theme-muted-text mt-2 text-[11px] leading-5"},Bn={class:"theme-muted-text block text-xs"},Nn={class:"mt-1 flex gap-2"},On=["value","disabled"],Un=["disabled"],zn={key:0,class:"theme-muted-text mt-2 text-[11px] leading-5"},Hn={key:1,class:"theme-muted-text mt-2 text-[11px] leading-5"},nt={__name:"CodexSessionManagerForm",props:{busy:{type:Boolean,default:!1},canEditEngine:{type:Boolean,default:!0},canEditCwd:{type:Boolean,default:!0},canEditSessionId:{type:Boolean,default:!0},cwd:{type:String,default:""},cwdReadonlyMessage:{type:String,default:""},duplicateCwdMessage:{type:String,default:""},engine:{type:String,default:"codex"},engineOptions:{type:Array,default:()=>[]},engineReadonlyMessage:{type:String,default:""},mobile:{type:Boolean,default:!1},sessionId:{type:String,default:""},sessionIdCopied:{type:Boolean,default:!1},sessionIdReadonlyMessage:{type:String,default:""},title:{type:String,default:""},workspaceSuggestions:{type:Array,default:()=>[]}},emits:["copy-session-id","open-directory-picker","update:cwd","update:engine","update:sessionId","update:title"],setup(o,{emit:R}){const $=o,f=R,{t:v}=De(),M=S(()=>{const x=String($.engine||"").trim();return $.engineOptions.find(y=>String((y==null?void 0:y.value)||"").trim()===x)||null}),c=S(()=>String($.sessionId||"").trim());return(x,y)=>(p(),m("div",xn,[n("label",yn,[n("span",null,d(l(v)("projectManager.projectTitleOptional")),1),n("input",{value:o.title,type:"text",maxlength:"140",placeholder:"",class:"tool-input mt-1",disabled:o.busy,onInput:y[0]||(y[0]=r=>f("update:title",r.target.value))},null,40,bn)]),n("label",wn,[n("span",null,d(l(v)("projectManager.workingDirectoryField")),1),n("div",Sn,[n("input",{value:o.cwd,type:"text",list:"codex-manager-workspace-suggestions",placeholder:"",class:A(["tool-input min-w-0 flex-1 disabled:cursor-not-allowed disabled:opacity-80",o.duplicateCwdMessage?"border-[var(--theme-warning)]":""]),disabled:o.busy||!o.canEditCwd,onInput:y[1]||(y[1]=r=>f("update:cwd",r.target.value))},null,42,kn),n("button",{type:"button",class:"tool-button inline-flex shrink-0 items-center gap-2 px-3 py-2 text-xs",disabled:o.busy||!o.canEditCwd,onClick:y[2]||(y[2]=r=>f("open-directory-picker"))},[k(l(ze),{class:"h-4 w-4"}),n("span",null,d(o.mobile?l(v)("projectManager.choose"):l(v)("projectManager.chooseDirectory")),1)],8,$n)]),n("datalist",_n,[(p(!0),m(Te,null,Ke(o.workspaceSuggestions,r=>(p(),m("option",{key:r,value:r},null,8,Cn))),128))]),o.duplicateCwdMessage?(p(),m("p",Mn,d(o.duplicateCwdMessage),1)):o.cwdReadonlyMessage?(p(),m("p",jn,d(o.cwdReadonlyMessage),1)):C("",!0)]),n("label",In,[n("span",null,d(l(v)("projectManager.engineField")),1),n("div",Pn,[k(mt,{"model-value":o.engine,options:o.engineOptions,disabled:o.busy||!o.canEditEngine,placeholder:l(v)("projectManager.selectEngine"),"empty-text":l(v)("projectManager.noEngines"),"get-option-value":r=>(r==null?void 0:r.value)||"","onUpdate:modelValue":y[3]||(y[3]=r=>f("update:engine",r))},{trigger:xe(({disabled:r})=>{var g;return[n("div",Rn,[n("span",{class:A(["min-w-0 flex-1 truncate",r?"theme-muted-text":"text-[var(--theme-textPrimary)]"])},d(((g=M.value)==null?void 0:g.label)||l(v)("projectManager.selectEngine")),3),M.value&&M.value.enabled===!1?(p(),m("span",Tn,d(l(v)("projectManager.comingSoon")),1)):C("",!0)])]}),option:xe(({option:r,selected:g,select:L})=>[n("button",{type:"button",class:A(["w-full rounded-sm border border-dashed px-3 py-2 text-left text-sm transition",g?"theme-filter-active":"theme-filter-idle"]),disabled:(r==null?void 0:r.enabled)===!1,onClick:L},[n("div",En,[n("span",An,d(r.label),1),(r==null?void 0:r.enabled)===!1?(p(),m("span",Ln,d(l(v)("projectManager.comingSoon")),1)):C("",!0)])],10,Dn)]),_:1},8,["model-value","options","disabled","placeholder","empty-text","get-option-value"])]),o.engineReadonlyMessage?(p(),m("p",Fn,d(o.engineReadonlyMessage),1)):C("",!0)]),n("label",Bn,[n("span",null,d(l(v)("projectManager.sessionId")),1),n("div",Nn,[n("input",{value:o.sessionId,type:"text",placeholder:"",class:"tool-input min-w-0 flex-1 disabled:cursor-not-allowed disabled:opacity-80",disabled:o.busy||!o.canEditSessionId,onInput:y[4]||(y[4]=r=>f("update:sessionId",r.target.value))},null,40,On),c.value?(p(),m("button",{key:0,type:"button",class:"tool-button inline-flex shrink-0 items-center gap-2 px-3 py-2 text-xs",disabled:o.busy,onClick:y[5]||(y[5]=r=>f("copy-session-id"))},[o.sessionIdCopied?(p(),he(l(ot),{key:0,class:"h-4 w-4"})):(p(),he(l(Ct),{key:1,class:"h-4 w-4"})),n("span",null,d(o.sessionIdCopied?l(v)("projectManager.sessionIdCopied"):l(v)("projectManager.copySessionId")),1)],8,Un)):C("",!0)]),o.sessionIdReadonlyMessage?(p(),m("p",zn,d(o.sessionIdReadonlyMessage),1)):(p(),m("p",Hn,d(l(v)("projectManager.sessionIdHint")),1))])]))}},Kn={class:"flex items-center justify-between gap-3"},Vn={class:"theme-heading text-sm font-medium"},qn={key:0,class:"theme-muted-text mt-1 text-xs"},Wn=["disabled"],Qn=["onClick"],Gn={key:0,class:"theme-selection-indicator absolute inset-y-3 left-0 w-1 rounded-full"},Jn={class:"flex w-full flex-col gap-2 text-left"},Xn={class:"theme-heading min-w-0 text-sm font-medium"},Yn=["title"],Zn=["title"],ea={class:"theme-muted-text flex flex-wrap items-center gap-x-2 gap-y-1 text-[11px] leading-5"},ta={key:0,"aria-hidden":"true"},na={key:1},aa={class:"flex flex-wrap items-center gap-2 pt-1"},sa={key:0,class:"h-1.5 w-1.5 rounded-full bg-current animate-pulse"},at={__name:"CodexSessionManagerList",props:{busy:{type:Boolean,default:!1},editingSessionId:{type:String,default:""},formatUpdatedAt:{type:Function,default:o=>o},getRuntimeStatusClass:{type:Function,default:()=>""},getRuntimeStatusLabel:{type:Function,default:()=>""},getThreadStatusClass:{type:Function,default:()=>""},getThreadStatusLabel:{type:Function,default:()=>""},hasSessions:{type:Boolean,default:!1},isCurrentSession:{type:Function,default:()=>!1},isSessionRunning:{type:Function,default:()=>!1},mode:{type:String,default:"edit"},mobile:{type:Boolean,default:!1},sessions:{type:Array,default:()=>[]}},emits:["create","select"],setup(o,{emit:R}){const $=o,f=R,{t:v}=De();function M(y){return $.mode==="edit"&&$.editingSessionId===y.id?"theme-card-selected":$.isSessionRunning(y.id)?"theme-card-warning":"theme-card-idle-strong"}function c(y){return $.isCurrentSession(y.id)?v("projectManager.current"):v("projectManager.regular")}function x(y){return $.isCurrentSession(y.id)?"theme-status-info":"theme-status-neutral"}return(y,r)=>(p(),m("div",{class:A(o.mobile?"flex h-full min-h-0 flex-col":"")},[n("div",Kn,[n("div",null,[n("div",Vn,d(l(v)("projectManager.projectList")),1),o.hasSessions?C("",!0):(p(),m("p",qn,d(l(v)("projectManager.noProjects")),1))]),n("button",{type:"button",class:"tool-button tool-button-primary inline-flex items-center gap-2 px-3 py-2 text-xs",disabled:o.busy,onClick:r[0]||(r[0]=g=>f("create"))},[k(l(Mt),{class:"h-4 w-4"}),n("span",null,d(l(v)("projectManager.create")),1)],8,Wn)]),n("div",{class:A(["mt-4 space-y-2",o.mobile?"min-h-0 flex-1 overflow-y-auto":"max-h-52 overflow-y-auto pr-1 sm:max-h-64 lg:max-h-[calc(88vh-11rem)]"])},[(p(!0),m(Te,null,Ke(o.sessions,g=>(p(),m("article",{key:g.id,class:A(["relative cursor-pointer rounded-sm border p-3 transition",M(g)]),onClick:L=>f("select",g.id)},[o.mode==="edit"&&o.editingSessionId===g.id?(p(),m("span",Gn)):C("",!0),n("div",Jn,[n("div",Xn,[n("span",{class:"block truncate",title:g.title||l(v)("projectManager.untitledProject")},d(g.title||l(v)("projectManager.untitledProject")),9,Yn)]),n("div",{class:"theme-muted-text break-all font-mono text-[11px] leading-5",title:g.cwd},d(g.cwd),9,Zn),n("div",ea,[n("span",null,d(l(He)(g.engine)),1),o.mobile?C("",!0):(p(),m("span",ta,"·")),o.mobile?C("",!0):(p(),m("span",na,d(o.formatUpdatedAt(g.updatedAt)),1))]),n("div",aa,[n("span",{class:A(["inline-flex shrink-0 whitespace-nowrap rounded-sm border border-dashed px-1.5 py-0.5 text-[10px]",x(g)])},d(c(g)),3),n("span",{class:A(["inline-flex shrink-0 items-center gap-1 whitespace-nowrap rounded-sm border border-dashed px-1.5 py-0.5 text-[10px]",o.getRuntimeStatusClass(g.id)])},[o.isSessionRunning(g.id)?(p(),m("span",sa)):C("",!0),it(" "+d(o.getRuntimeStatusLabel(g.id)),1)],2),n("span",{class:A(["inline-flex shrink-0 whitespace-nowrap rounded-sm border border-dashed px-1.5 py-0.5 text-[10px]",o.getThreadStatusClass(g)])},d(o.getThreadStatusLabel(g)),3)])])],10,Qn))),128))],2)],2))}},la={class:"space-y-3"},ia={class:"dashed-panel px-3 py-3"},oa={class:"theme-muted-text text-[11px]"},ra={class:"mt-2 flex flex-wrap gap-2"},da={key:0,class:"h-1.5 w-1.5 rounded-full bg-current animate-pulse"},ua={key:0,class:"theme-status-info inline-flex items-center gap-1 rounded-sm border border-dashed px-2 py-1 text-xs"},ca={class:"dashed-panel px-3 py-3"},pa={class:"theme-muted-text text-[11px]"},fa={class:"mt-2 text-sm text-[var(--theme-textPrimary)]"},ga={class:"dashed-panel px-3 py-3"},va={class:"theme-muted-text text-[11px]"},ma={class:"mt-2 break-all font-mono text-xs leading-6 text-[var(--theme-textPrimary)]"},ha={class:"dashed-panel px-3 py-3"},xa={class:"theme-muted-text text-[11px]"},ya={class:"mt-2 text-sm text-[var(--theme-textPrimary)]"},ba={class:"dashed-panel px-3 py-3"},wa={class:"theme-muted-text inline-flex items-center gap-2 text-[11px]"},Sa={class:"mt-2 text-xs leading-6 text-[var(--theme-textSecondary)]"},ka={__name:"CodexSessionManagerStatus",props:{activeSession:{type:Object,default:null},formatUpdatedAt:{type:Function,default:o=>o},getRuntimeStatusClass:{type:Function,default:()=>""},getRuntimeStatusLabel:{type:Function,default:()=>""},getThreadStatusClass:{type:Function,default:()=>""},getThreadStatusLabel:{type:Function,default:()=>""},isCurrentSession:{type:Function,default:()=>!1},isSessionRunning:{type:Function,default:()=>!1}},setup(o){const{t:R}=De();return($,f)=>{var v,M,c,x,y,r,g;return p(),m("div",la,[n("div",ia,[n("div",oa,d(l(R)("projectManager.runtimeStatus")),1),n("div",ra,[n("span",{class:A(["inline-flex items-center gap-1 rounded-sm border border-dashed px-2 py-1 text-xs",o.getRuntimeStatusClass((v=o.activeSession)==null?void 0:v.id)])},[o.isSessionRunning((M=o.activeSession)==null?void 0:M.id)?(p(),m("span",da)):C("",!0),it(" "+d(o.getRuntimeStatusLabel((c=o.activeSession)==null?void 0:c.id)),1)],2),n("span",{class:A(["inline-flex items-center gap-1 rounded-sm border border-dashed px-2 py-1 text-xs",o.getThreadStatusClass(o.activeSession)])},d(o.getThreadStatusLabel(o.activeSession)),3),(x=o.activeSession)!=null&&x.id&&o.isCurrentSession(o.activeSession.id)?(p(),m("span",ua,d(l(R)("projectManager.currentProject")),1)):C("",!0)])]),n("div",ca,[n("div",pa,d(l(R)("projectManager.engine")),1),n("div",fa,d(l(He)((y=o.activeSession)==null?void 0:y.engine)),1)]),n("div",ga,[n("div",va,d(l(R)("projectManager.workingDirectory")),1),n("div",ma,d(((r=o.activeSession)==null?void 0:r.cwd)||l(R)("projectManager.notSet")),1)]),n("div",ha,[n("div",xa,d(l(R)("projectManager.updatedAt")),1),n("div",ya,d(o.formatUpdatedAt((g=o.activeSession)==null?void 0:g.updatedAt)),1)]),n("div",ba,[n("div",wa,[k(l(jt),{class:"h-3.5 w-3.5"}),n("span",null,d(l(R)("projectManager.note")),1)]),n("p",Sa,d(l(R)("projectManager.noteDescription")),1)])])}}},$a={class:"theme-heading inline-flex items-center gap-2 text-sm font-medium"},_a={key:0,class:"grid min-h-0 flex-1 gap-0 lg:grid-cols-[minmax(0,300px)_minmax(0,1fr)]"},Ca={class:"theme-divider theme-muted-panel border-b px-3 py-3 sm:px-4 sm:py-4 lg:border-b-0 lg:border-r"},Ma={class:"min-h-0 overflow-y-auto px-4 py-4 sm:px-5"},ja={class:"flex flex-wrap items-start justify-between gap-3"},Ia={class:"theme-heading inline-flex items-center gap-2 text-sm font-medium"},Pa={class:"mt-5"},Ra={key:0,class:"theme-danger-text mt-4 inline-flex items-center gap-2 text-sm"},Ta={class:"theme-divider mt-6 flex flex-col gap-3 border-t border-dashed pt-4 sm:flex-row sm:items-center sm:justify-between"},Da={class:"flex flex-wrap items-center gap-2"},Ea=["disabled"],Aa=["disabled"],La=["disabled"],Fa={class:"flex flex-col-reverse gap-2 sm:flex-row sm:flex-wrap sm:items-center"},Ba=["disabled"],Na=["disabled"],Oa=["disabled"],Ua={key:1,class:"flex min-h-0 flex-1 flex-col overflow-hidden"},za={key:0,class:"flex min-h-0 flex-1 flex-col overflow-hidden"},Ha={class:"min-h-0 flex-1 overflow-hidden px-3 py-3"},Ka={key:1,class:"flex min-h-0 flex-1 flex-col overflow-hidden"},Va={class:"theme-divider flex items-center gap-3 border-b px-4 py-3"},qa=["disabled"],Wa={class:"min-w-0 flex-1"},Qa={class:"theme-heading truncate text-sm font-medium"},Ga={key:0,class:"theme-muted-text mt-1 truncate text-xs"},Ja={class:"theme-divider border-b px-4 py-3"},Xa={class:"grid grid-cols-2 gap-2"},Ya=["disabled"],Za={class:"min-h-0 flex-1 overflow-y-auto px-4 py-4"},es={key:0},ts={key:0,class:"theme-danger-text mt-4 inline-flex items-center gap-2 text-sm"},ns={class:"theme-divider mt-6 flex flex-col gap-3 border-t border-dashed pt-4"},as=["disabled"],ss=["disabled"],ls=["disabled"],is=["disabled"],gs={__name:"CodexSessionManagerDialog",props:{open:{type:Boolean,default:!1},sessions:{type:Array,default:()=>[]},workspaces:{type:Array,default:()=>[]},selectedSessionId:{type:String,default:""},selectionLocked:{type:Boolean,default:!1},selectionLockReason:{type:String,default:""},loading:{type:Boolean,default:!1},sending:{type:Boolean,default:!1},onRefresh:{type:Function,default:null},onCreate:{type:Function,default:null},onUpdate:{type:Function,default:null},onDelete:{type:Function,default:null},onReset:{type:Function,default:null}},emits:["close","project-created","select-session","open-source-browser"],setup(o,{expose:R,emit:$}){const f=o,v=$,{locale:M,t:c}=De(),x=_("edit"),y=_(""),r=kt({title:"",engine:"codex",cwd:"",sessionId:""}),g=_(""),L=_(!1),Q=_(!1),E=_(!1),I=_(!1),K=_(!1),F=_(!1),N=_(!1),O=_(!1),{matches:V}=ht("(max-width: 767px)"),ee=_("list"),q=_("basic"),ae=_(Xe());let P=null;const J=S(()=>z(f.sessions)),b=S(()=>f.sessions.find(t=>t.id===y.value)||null),ye=S(()=>f.sessions.length>0),Ve=S(()=>f.sessions.find(t=>t.id===f.selectedSessionId)||null),de=S(()=>!!(b.value&&U(b.value.id))),se=S(()=>{var t;return!((t=b.value)!=null&&t.started)}),T=S(()=>{var t;return!((t=b.value)!=null&&t.started)}),X=S(()=>{var t;return!((t=b.value)!=null&&t.started)}),j=S(()=>f.loading||L.value||Q.value||E.value||I.value),qe=S(()=>String(r.sessionId||"").trim()),ue=S(()=>{var h,w;const t=new Set,i=[];return[r.cwd,(h=b.value)==null?void 0:h.cwd,(w=Ve.value)==null?void 0:w.cwd,...f.workspaces,...f.sessions.map(H=>H.cwd)].forEach(H=>{const D=String(H||"").trim();!D||t.has(D)||(t.add(D),i.push(D))}),i.slice(0,12)}),be=S(()=>ae.value),we=S(()=>{const t=te(r.cwd);return t?f.sessions.filter(i=>{var h;return i.id===((h=b.value)==null?void 0:h.id)?!1:te(i.cwd)===t}):[]}),oe=S(()=>{if(!we.value.length)return"";const t=we.value.slice(0,3).map(i=>{const h=i.title||c("projectManager.untitledProject");return M.value==="en-US"?`"${h}"`:`「${h}」`}).join(M.value==="en-US"?", ":"、");return c("projectManager.duplicateDirectory",{labels:t,count:we.value.length})}),Ee=S(()=>x.value!=="edit"||se.value?"":c("projectManager.cwdReadonly")),Se=S(()=>x.value!=="edit"||!b.value||T.value?"":c("projectManager.engineReadonly")),Ae=S(()=>x.value!=="edit"||!b.value||X.value?"":c("projectManager.sessionIdReadonly")),Le=S(()=>x.value==="create"?L.value?c("projectManager.creatingProject"):c("projectManager.createProject"):Q.value?c("projectManager.savingChanges"):c("projectManager.saveChanges")),ke=S(()=>{var t;return x.value==="create"?c("projectManager.newProject"):((t=b.value)==null?void 0:t.title)||c("projectManager.untitledProject")});function $e(t=""){const i=Date.parse(String(t||""));return Number.isFinite(i)?i:0}function te(t=""){const i=String(t||"").trim();if(!i)return"";const h=/^[a-z]:[\\/]/i.test(i)||i.includes("\\");let w=i.replace(/\\/g,"/");return w.length>1&&!/^[a-z]:\/$/i.test(w)&&(w=w.replace(/\/+$/,"")),h?w.toLowerCase():w}function U(t){var i;return!!((i=f.sessions.find(h=>h.id===t))!=null&&i.running)}function ne(t){return!!t&&t===f.selectedSessionId}function z(t=[]){return[...t].sort((i,h)=>{const w=Number(U(h.id))-Number(U(i.id));if(w)return w;const H=Number(ne(h.id))-Number(ne(i.id));if(H)return H;const D=$e(h.updatedAt)-$e(i.updatedAt);return D||ut(String(i.title||i.cwd||i.id),String(h.title||h.cwd||h.id))})}function Y(t){return U(t)?c("projectManager.running"):c("projectManager.idle")}function ce(t){return U(t)?"theme-status-warning":"theme-status-success"}function le(t){return t!=null&&t.started?c("projectManager.threadBound"):c("projectManager.notStarted")}function _e(t){return t!=null&&t.started?"theme-status-success":"theme-status-neutral"}function Ce(t=""){if(!t)return c("projectManager.unknown");const i=new Date(t);return Number.isNaN(i.getTime())?t:dt(i.toISOString(),{year:"numeric",month:"numeric",day:"numeric",hour:"2-digit",minute:"2-digit"})}function pe(t){r.title=String((t==null?void 0:t.title)||""),r.engine=Je(t==null?void 0:t.engine),r.cwd=String((t==null?void 0:t.cwd)||""),r.sessionId=String((t==null?void 0:t.sessionId)||(t==null?void 0:t.engineSessionId)||(t==null?void 0:t.engineThreadId)||(t==null?void 0:t.codexThreadId)||"").trim()}function ie(){x.value="create",y.value="",g.value="",r.title="",r.engine="codex",r.cwd="",r.sessionId=""}function W(t){const i=f.sessions.find(h=>h.id===t);i&&(x.value="edit",y.value=i.id,g.value="",pe(i))}function fe(){var t;return f.selectedSessionId&&f.sessions.some(i=>i.id===f.selectedSessionId)?f.selectedSessionId:((t=J.value[0])==null?void 0:t.id)||""}function Me(t="basic"){ee.value="detail",q.value=t}function ge(){ee.value="list",q.value="basic"}function Fe(){ie(),V.value&&Me("basic")}function je(t){j.value||(W(t),V.value&&Me("basic"))}function We(t){r.cwd=String(t||"").trim()}async function Ie(){var i,h;const t=((i=b.value)==null?void 0:i.id)||fe();return!t||((!b.value||b.value.id!==t)&&(W(t),await re()),!((h=b.value)!=null&&h.cwd))?!1:(V.value&&Me("basic"),v("open-source-browser",b.value),v("close"),!0)}function Qe(){return K.value?(K.value=!1,!0):F.value?(F.value=!1,!0):N.value?(N.value=!1,!0):f.open?(v("close"),!0):!1}function Pe(t){r.title=String(t||"")}function Be(t){r.engine=Je(t)}function Ne(t){r.cwd=String(t||"")}function Oe(t){r.sessionId=String(t||"")}function Re(){g.value="",K.value=!1,F.value=!1,O.value=!1,q.value="basic",ee.value=V.value?"list":"detail";const t=fe();if(t){W(t);return}ie()}async function Ue(){if(!(j.value||typeof f.onRefresh!="function")){g.value="";try{await Promise.all([f.onRefresh(),e()])}catch(t){g.value=t.message}}}async function e(){try{ae.value=await Lt()}catch{ae.value=Xe()}}async function s(t){var h;if((h=navigator.clipboard)!=null&&h.writeText&&window.isSecureContext){await navigator.clipboard.writeText(t);return}const i=document.createElement("textarea");i.value=t,i.setAttribute("readonly","true"),i.style.position="fixed",i.style.opacity="0",i.style.pointerEvents="none",document.body.appendChild(i),i.select(),document.execCommand("copy"),document.body.removeChild(i)}async function a(){const t=qe.value;if(t)try{await s(t),O.value=!0,P&&clearTimeout(P),P=setTimeout(()=>{O.value=!1,P=null},1800)}catch(i){g.value=(i==null?void 0:i.message)||c("projectManager.copySessionIdFailed")}}async function u(){if(!j.value){g.value="";try{const t=B();if(!t)return;await G(t)}catch(t){g.value=t.message}}}function B(){if(x.value==="create"){const i=String(r.cwd||"").trim();return i?{type:"create",cwd:i,payload:{title:r.title,engine:r.engine,cwd:i,sessionId:String(r.sessionId||"").trim()}}:(g.value=c("projectManager.directoryRequired"),null)}if(!b.value)return g.value=c("projectManager.projectMissing"),null;const t={title:r.title,engine:r.engine};return se.value&&(t.cwd=r.cwd),X.value&&(t.sessionId=String(r.sessionId||"").trim()),{type:"update",sessionId:b.value.id,payload:t}}async function G(t){var i,h;if(t.type==="create"){L.value=!0;try{const w=await((i=f.onCreate)==null?void 0:i.call(f,t.payload));w!=null&&w.id&&(W(w.id),v("select-session",w.id),await re(),v("project-created",w),v("close"));return}finally{L.value=!1}}Q.value=!0;try{const w=await((h=f.onUpdate)==null?void 0:h.call(f,t.sessionId,t.payload));w!=null&&w.id&&W(w.id)}finally{Q.value=!1}}async function ve(){var i,h;if(!b.value||E.value)return;const t=b.value.id;g.value="",E.value=!0;try{const w=await((i=f.onDelete)==null?void 0:i.call(f,t));K.value=!1;const H=f.sessions.filter(rt=>rt.id!==t),D=(w==null?void 0:w.selectedSessionId)||((h=z(H)[0])==null?void 0:h.id)||"";v("select-session",D),D?(W(D),V.value&&ge()):(ie(),V.value&&ge())}catch(w){g.value=w.message}finally{E.value=!1}}async function Z(){var i;if(!b.value||I.value)return;const t=b.value.id;g.value="",I.value=!0;try{const h=await((i=f.onReset)==null?void 0:i.call(f,t));F.value=!1;const w=(h==null?void 0:h.session)||f.sessions.find(H=>H.id===t)||null;w!=null&&w.id&&W(w.id)}catch(h){g.value=h.message}finally{I.value=!1}}return me(()=>f.open,t=>{if(t){Re(),typeof f.onRefresh=="function"?Ue().catch(()=>{}):e().catch(()=>{});return}N.value=!1,K.value=!1,F.value=!1,O.value=!1,g.value=""},{immediate:!0}),me(V,t=>{t||(ee.value="detail")},{immediate:!0}),me(()=>f.sessions,()=>{if(!f.open)return;if(x.value==="create"){if(!!(String(r.title||"").trim()||String(r.cwd||"").trim())||!!String(r.sessionId||"").trim())return;const h=fe();h&&W(h);return}if(b.value){pe(b.value);return}const t=fe();if(t){W(t);return}ie()}),lt(()=>{P&&(clearTimeout(P),P=null)}),R({closeTopDialog:Qe}),(t,i)=>(p(),m(Te,null,[k(et,{open:F.value,title:l(c)("projectManager.confirmResetTitle"),description:b.value?l(c)("projectManager.confirmResetDescription",{title:b.value.title||l(c)("projectManager.untitledProject")}):"","confirm-text":l(c)("projectManager.confirmReset"),"cancel-text":l(c)("projectManager.keep"),loading:I.value,onCancel:i[0]||(i[0]=h=>F.value=!1),onConfirm:Z},null,8,["open","title","description","confirm-text","cancel-text","loading"]),k(et,{open:K.value,title:l(c)("projectManager.confirmDeleteTitle"),description:b.value?l(c)("projectManager.confirmDeleteDescription",{title:b.value.title||l(c)("projectManager.untitledProject")}):"","confirm-text":l(c)("projectManager.confirmDelete"),"cancel-text":l(c)("projectManager.keep"),loading:E.value,danger:"",onCancel:i[1]||(i[1]=h=>K.value=!1),onConfirm:ve},null,8,["open","title","description","confirm-text","cancel-text","loading"]),k(hn,{open:N.value,"initial-path":r.cwd,suggestions:ue.value,onClose:i[2]||(i[2]=h=>N.value=!1),onSelect:We},null,8,["open","initial-path","suggestions"]),k(st,{open:o.open,"panel-class":"settings-dialog-panel h-full max-w-5xl sm:h-auto sm:max-h-[88vh]","header-class":"settings-dialog-header px-5 py-4","body-class":"settings-dialog-body flex min-h-0 flex-1 overflow-hidden","close-disabled":j.value,"close-on-backdrop":!j.value,"close-on-escape":!j.value,onClose:i[12]||(i[12]=h=>v("close"))},{title:xe(()=>[n("div",$a,[k(l(Et),{class:"h-4 w-4"}),n("span",null,d(l(c)("projectManager.managingTitle")),1)])]),default:xe(()=>{var h,w,H;return[l(V)?(p(),m("div",Ua,[ee.value==="list"?(p(),m("div",za,[n("div",Ha,[k(at,{mobile:"",busy:j.value,"editing-session-id":y.value,"format-updated-at":Ce,"get-runtime-status-class":ce,"get-runtime-status-label":Y,"get-thread-status-class":_e,"get-thread-status-label":le,"has-sessions":ye.value,"is-current-session":ne,"is-session-running":U,mode:x.value,sessions:J.value,onCreate:Fe,onSelect:je},null,8,["busy","editing-session-id","has-sessions","mode","sessions"])])])):(p(),m("div",Ka,[n("div",Va,[n("button",{type:"button",class:"tool-button inline-flex items-center gap-1.5 px-3 py-2 text-xs",disabled:j.value,onClick:ge},[k(l(Dt),{class:"h-4 w-4"}),n("span",null,d(l(c)("projectManager.projectList")),1)],8,qa),n("div",Wa,[n("div",Qa,d(ke.value),1),x.value==="edit"&&((w=b.value)!=null&&w.cwd)?(p(),m("p",Ga,d(b.value.cwd),1)):C("",!0)])]),n("div",Ja,[n("div",Xa,[n("button",{type:"button",class:A(["tool-button px-3 py-2 text-sm",q.value==="basic"?"tool-button-accent-subtle":""]),onClick:i[7]||(i[7]=D=>q.value="basic")},d(l(c)("projectManager.basicInfo")),3),n("button",{type:"button",class:A(["tool-button px-3 py-2 text-sm",q.value==="status"?"tool-button-accent-subtle":""]),disabled:x.value==="create",onClick:i[8]||(i[8]=D=>q.value="status")},d(l(c)("projectManager.status")),11,Ya)])]),n("div",Za,[q.value==="basic"?(p(),m("div",es,[k(nt,{mobile:"",busy:j.value,"can-edit-engine":x.value!=="edit"||T.value,"can-edit-cwd":x.value!=="edit"||se.value,"can-edit-session-id":x.value!=="edit"||X.value,cwd:r.cwd,"cwd-readonly-message":Ee.value,"duplicate-cwd-message":oe.value,engine:r.engine,"engine-options":be.value,"engine-readonly-message":Se.value,"session-id":r.sessionId,"session-id-copied":O.value,"session-id-readonly-message":Ae.value,title:r.title,"workspace-suggestions":ue.value,onCopySessionId:a,onOpenDirectoryPicker:i[9]||(i[9]=D=>N.value=!0),"onUpdate:cwd":Ne,"onUpdate:engine":Be,"onUpdate:sessionId":Oe,"onUpdate:title":Pe},null,8,["busy","can-edit-engine","can-edit-cwd","can-edit-session-id","cwd","cwd-readonly-message","duplicate-cwd-message","engine","engine-options","engine-readonly-message","session-id","session-id-copied","session-id-readonly-message","title","workspace-suggestions"]),g.value?(p(),m("p",ts,[k(l(tt),{class:"h-4 w-4"}),n("span",null,d(g.value),1)])):C("",!0),n("div",ns,[n("button",{type:"button",class:"tool-button tool-button-primary w-full px-3 py-2 text-sm",disabled:j.value,onClick:u},d(Le.value),9,as),x.value==="edit"&&b.value?(p(),m("button",{key:0,type:"button",class:"tool-button w-full px-3 py-2 text-sm",disabled:j.value||!((H=b.value)!=null&&H.cwd),onClick:Ie},d(l(c)("projectManager.viewSource")),9,ss)):C("",!0),x.value==="edit"&&b.value?(p(),m("button",{key:1,type:"button",class:"tool-button w-full px-3 py-2 text-sm",disabled:j.value||de.value,onClick:i[10]||(i[10]=D=>F.value=!0)},d(I.value?l(c)("projectManager.resettingSession"):l(c)("projectManager.newSession")),9,ls)):C("",!0),x.value==="edit"&&b.value?(p(),m("button",{key:2,type:"button",class:"tool-button tool-button-danger-subtle w-full px-3 py-2 text-sm",disabled:j.value||de.value,onClick:i[11]||(i[11]=D=>K.value=!0)},d(E.value?l(c)("projectManager.deletingProject"):l(c)("projectManager.deleteProject")),9,is)):C("",!0)])])):(p(),he(ka,{key:1,"active-session":b.value,"format-updated-at":Ce,"get-runtime-status-class":ce,"get-runtime-status-label":Y,"get-thread-status-class":_e,"get-thread-status-label":le,"is-current-session":ne,"is-session-running":U},null,8,["active-session"]))])]))])):(p(),m("div",_a,[n("aside",Ca,[k(at,{busy:j.value,"editing-session-id":y.value,"format-updated-at":Ce,"get-runtime-status-class":ce,"get-runtime-status-label":Y,"get-thread-status-class":_e,"get-thread-status-label":le,"has-sessions":ye.value,"is-current-session":ne,"is-session-running":U,mode:x.value,sessions:J.value,onCreate:Fe,onSelect:je},null,8,["busy","editing-session-id","has-sessions","mode","sessions"])]),n("div",Ma,[n("div",ja,[n("div",null,[n("div",Ia,[k(l(It),{class:"h-4 w-4"}),n("span",null,d(x.value==="create"?l(c)("projectManager.createTitle"):l(c)("projectManager.editTitle")),1)])])]),n("div",Pa,[k(nt,{busy:j.value,"can-edit-engine":x.value!=="edit"||T.value,"can-edit-cwd":x.value!=="edit"||se.value,"can-edit-session-id":x.value!=="edit"||X.value,cwd:r.cwd,"cwd-readonly-message":Ee.value,"duplicate-cwd-message":oe.value,engine:r.engine,"engine-options":be.value,"engine-readonly-message":Se.value,"session-id":r.sessionId,"session-id-copied":O.value,"session-id-readonly-message":Ae.value,title:r.title,"workspace-suggestions":ue.value,onCopySessionId:a,onOpenDirectoryPicker:i[3]||(i[3]=D=>N.value=!0),"onUpdate:cwd":Ne,"onUpdate:engine":Be,"onUpdate:sessionId":Oe,"onUpdate:title":Pe},null,8,["busy","can-edit-engine","can-edit-cwd","can-edit-session-id","cwd","cwd-readonly-message","duplicate-cwd-message","engine","engine-options","engine-readonly-message","session-id","session-id-copied","session-id-readonly-message","title","workspace-suggestions"])]),g.value?(p(),m("p",Ra,[k(l(tt),{class:"h-4 w-4"}),n("span",null,d(g.value),1)])):C("",!0),n("div",Ta,[n("div",Da,[x.value==="edit"&&b.value?(p(),m("button",{key:0,type:"button",class:"tool-button inline-flex items-center gap-2 px-3 py-2 text-xs",disabled:j.value||!((h=b.value)!=null&&h.cwd),onClick:Ie},[k(l(Pt),{class:"h-4 w-4"}),n("span",null,d(l(c)("projectManager.viewSource")),1)],8,Ea)):C("",!0),x.value==="edit"&&b.value?(p(),m("button",{key:1,type:"button",class:"tool-button inline-flex items-center gap-2 px-3 py-2 text-xs",disabled:j.value||de.value,onClick:i[4]||(i[4]=D=>F.value=!0)},[k(l(Rt),{class:"h-4 w-4"}),n("span",null,d(I.value?l(c)("projectManager.resettingSession"):l(c)("projectManager.newSession")),1)],8,Aa)):C("",!0),x.value==="edit"&&b.value?(p(),m("button",{key:2,type:"button",class:"tool-button tool-button-danger-subtle inline-flex items-center gap-2 px-3 py-2 text-xs",disabled:j.value||de.value,onClick:i[5]||(i[5]=D=>K.value=!0)},[k(l(Tt),{class:"h-4 w-4"}),n("span",null,d(E.value?l(c)("projectManager.deletingProject"):l(c)("projectManager.deleteProject")),1)],8,La)):C("",!0)]),n("div",Fa,[n("button",{type:"button",class:"tool-button w-full px-3 py-2 text-xs sm:w-auto",disabled:j.value,onClick:i[6]||(i[6]=D=>v("close"))},d(l(c)("projectManager.close")),9,Ba),x.value==="create"&&ye.value?(p(),m("button",{key:0,type:"button",class:"tool-button w-full px-3 py-2 text-xs sm:w-auto",disabled:j.value,onClick:Re},d(l(c)("projectManager.backToList")),9,Na)):C("",!0),n("button",{type:"button",class:"tool-button tool-button-primary w-full px-3 py-2 text-xs sm:w-auto",disabled:j.value,onClick:u},d(Le.value),9,Oa)])])])]))]}),_:1},8,["open","close-disabled","close-on-backdrop","close-on-escape"])],64))}};export{gs as default};