@muyichengshayu/promptx 0.1.41 → 0.1.43

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 (69) hide show
  1. package/CHANGELOG.md +14 -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 +233 -1
  5. package/apps/web/dist/assets/CodexSessionManagerDialog-DxrPimh4.js +1 -0
  6. package/apps/web/dist/assets/TaskDiffReviewDialog-D4rUvNG6.js +2 -0
  7. package/apps/web/dist/assets/WorkbenchSettingsDialog-ClVb-_Av.js +1 -0
  8. package/apps/web/dist/assets/WorkbenchView-D0SJDU9Q.js +47 -0
  9. package/apps/web/dist/assets/WorkbenchView-DHfai3aW.css +1 -0
  10. package/apps/web/dist/assets/index-CsDHhm4n.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-DIyrqeBY.js} +4 -4
  13. package/apps/web/dist/assets/vendor-shiki-lang-bash-DziaAEzp.js +1 -0
  14. package/apps/web/dist/assets/vendor-shiki-lang-c-DxZVXGej.js +1 -0
  15. package/apps/web/dist/assets/vendor-shiki-lang-cpp-C0nFeuYF.js +1 -0
  16. package/apps/web/dist/assets/vendor-shiki-lang-css-5_xDM_L5.js +1 -0
  17. package/apps/web/dist/assets/vendor-shiki-lang-diff-DV4GsN7t.js +1 -0
  18. package/apps/web/dist/assets/vendor-shiki-lang-dockerfile-C-v4Vs5o.js +1 -0
  19. package/apps/web/dist/assets/vendor-shiki-lang-fish-BJ5QHV1v.js +1 -0
  20. package/apps/web/dist/assets/vendor-shiki-lang-go-BNuwOTVZ.js +1 -0
  21. package/apps/web/dist/assets/vendor-shiki-lang-html-CUvSKgQ6.js +1 -0
  22. package/apps/web/dist/assets/vendor-shiki-lang-java-BgscQPPM.js +1 -0
  23. package/apps/web/dist/assets/vendor-shiki-lang-javascript-BAicPUAA.js +1 -0
  24. package/apps/web/dist/assets/vendor-shiki-lang-json-C_GpujJu.js +1 -0
  25. package/apps/web/dist/assets/vendor-shiki-lang-markdown-Isb_iOaL.js +1 -0
  26. package/apps/web/dist/assets/vendor-shiki-lang-powershell-xNYeLH7k.js +1 -0
  27. package/apps/web/dist/assets/vendor-shiki-lang-python-ByInZN1m.js +1 -0
  28. package/apps/web/dist/assets/vendor-shiki-lang-rust-DTGgkwhP.js +1 -0
  29. package/apps/web/dist/assets/vendor-shiki-lang-sql-paI0NZrg.js +1 -0
  30. package/apps/web/dist/assets/vendor-shiki-lang-tsx-BXEzAsy_.js +1 -0
  31. package/apps/web/dist/assets/vendor-shiki-lang-typescript-CPG3q_60.js +1 -0
  32. package/apps/web/dist/assets/vendor-shiki-lang-vue-BoIQS9wF.js +1 -0
  33. package/apps/web/dist/assets/vendor-shiki-lang-xml-DzGGQ07l.js +1 -0
  34. package/apps/web/dist/assets/vendor-shiki-lang-yaml-DuPzWjyg.js +1 -0
  35. package/apps/web/dist/assets/vendor-shiki-theme-github-dark-default-DxFCgFpQ.js +1 -0
  36. package/apps/web/dist/assets/vendor-shiki-theme-github-light-CcI-1qo0.js +1 -0
  37. package/apps/web/dist/assets/{vendor-ui-DlJXv6Z0.js → vendor-ui-DTqxu3Qf.js} +55 -45
  38. package/apps/web/dist/index.html +2 -2
  39. package/package.json +1 -1
  40. package/apps/web/dist/assets/CodexSessionManagerDialog-BnWKH7m2.js +0 -2
  41. package/apps/web/dist/assets/CodexSessionManagerDialog-DH2dM17T.css +0 -1
  42. package/apps/web/dist/assets/TaskDiffReviewDialog-CDlXLxwB.js +0 -2
  43. package/apps/web/dist/assets/WorkbenchSettingsDialog-CPwGc4tA.js +0 -1
  44. package/apps/web/dist/assets/WorkbenchView-CmvPuVjx.css +0 -1
  45. package/apps/web/dist/assets/WorkbenchView-CvwlcKDL.js +0 -45
  46. package/apps/web/dist/assets/index-BMQs4_K_.css +0 -1
  47. package/apps/web/dist/assets/index-OmCIb58a.js +0 -2
  48. package/apps/web/dist/assets/vendor-shiki-lang-bash-CsFNeEqN.js +0 -1
  49. package/apps/web/dist/assets/vendor-shiki-lang-c-BcjOwTnT.js +0 -1
  50. package/apps/web/dist/assets/vendor-shiki-lang-cpp-RQOeHt9v.js +0 -1
  51. package/apps/web/dist/assets/vendor-shiki-lang-css-CnK7V8uS.js +0 -1
  52. package/apps/web/dist/assets/vendor-shiki-lang-diff-Ba_mN76d.js +0 -1
  53. package/apps/web/dist/assets/vendor-shiki-lang-dockerfile-DexPvRap.js +0 -1
  54. package/apps/web/dist/assets/vendor-shiki-lang-go-Dk57BT_E.js +0 -1
  55. package/apps/web/dist/assets/vendor-shiki-lang-html-D-4N43uu.js +0 -1
  56. package/apps/web/dist/assets/vendor-shiki-lang-java-Ataf9s36.js +0 -1
  57. package/apps/web/dist/assets/vendor-shiki-lang-javascript-BmgvEpOZ.js +0 -1
  58. package/apps/web/dist/assets/vendor-shiki-lang-json-BM2fuodu.js +0 -1
  59. package/apps/web/dist/assets/vendor-shiki-lang-markdown-D1kkAUm_.js +0 -1
  60. package/apps/web/dist/assets/vendor-shiki-lang-python-NfTv2t04.js +0 -1
  61. package/apps/web/dist/assets/vendor-shiki-lang-rust-CnDh16MN.js +0 -1
  62. package/apps/web/dist/assets/vendor-shiki-lang-sql-s5-_63Hi.js +0 -1
  63. package/apps/web/dist/assets/vendor-shiki-lang-tsx-CLUFHL3U.js +0 -1
  64. package/apps/web/dist/assets/vendor-shiki-lang-typescript-Ctu8XPGP.js +0 -1
  65. package/apps/web/dist/assets/vendor-shiki-lang-vue-C5VFP2hw.js +0 -1
  66. package/apps/web/dist/assets/vendor-shiki-lang-xml-_rmOJA0y.js +0 -1
  67. package/apps/web/dist/assets/vendor-shiki-lang-yaml-DIKR-ygN.js +0 -1
  68. package/apps/web/dist/assets/vendor-shiki-theme-github-dark-default-DvEFPrX1.js +0 -1
  69. package/apps/web/dist/assets/vendor-shiki-theme-github-light-DxBVwbUZ.js +0 -1
package/CHANGELOG.md CHANGED
@@ -1,5 +1,19 @@
1
1
  # Changelog
2
2
 
3
+ ## 0.1.43
4
+
5
+ - 继续完善项目源码查看:左侧目录树、路径搜索、内容搜索、`@` 文件选择器与代码变更文件列表统一为同一套选中 / hover / 间距 / 图标 / 副文本视觉语言,深浅主题下的状态反馈更一致。
6
+ - 项目源码查看补齐键盘与搜索体验:支持 `↑ / ↓ / ← / → / Enter / Esc / Tab` 的连续操作,输入框默认接管焦点;内容搜索结果改为按文件分组展示,右侧预览可同步滚到命中行,并区分“命中行 / 当前命中行 / 命中关键词”三层高亮。
7
+ - 优化源码预览性能:同一文件内多处命中切换不再重复请求完整内容,弹窗内增加最近使用预览缓存,减少内容搜索场景下的重复加载与闪烁。
8
+ - 新增项目只读源码浏览链路与接口:项目管理支持直接打开源码弹层,服务端补充工作区目录树、路径搜索、内容搜索与文件内容读取能力,并补齐相关前后端测试。
9
+
10
+ ## 0.1.42
11
+
12
+ - 继续收敛中栏消息阅读体验:去掉 `PromptX` 与 `response` 卡片头部的“展开 / 收起”入口,两类卡片默认始终完整展开,避免频繁折叠造成阅读打断。
13
+ - 修复切换任务时中栏消息区偶发没有滚到底部的问题:任务切换后的 run 历史加载、事件懒加载以及回复区异步 Markdown / 代码高亮渲染完成后,都会按最新一轮补做滚底跟随,避免长任务停在半截。
14
+ - 为任务切换滚底链路补充回归测试,锁住 `scrollToLatest` 必须强制滚底的行为,减少后续重构时再次回归。
15
+ - 调整 `WeChat` 主题的文本选区颜色:把选中背景从接近 `PromptX` 卡片的浅绿色改为更清晰的浅蓝色,避免选中文本时和消息气泡背景撞色。
16
+
3
17
  ## 0.1.41
4
18
 
5
19
  - 项目管理新增只读源码查看能力:编辑项目时可打开“查看源码”弹层,左侧浏览目录树,右侧预览文件内容,并支持嵌套目录懒加载与项目路径标题展示。
@@ -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',
@@ -63,6 +68,7 @@ const TEXT_FILE_EXTENSIONS = new Set([
63
68
  '.log',
64
69
  '.md',
65
70
  '.mjs',
71
+ '.ps1',
66
72
  '.py',
67
73
  '.rb',
68
74
  '.rs',
@@ -87,6 +93,7 @@ const IMAGE_MIME_TYPES = new Map([
87
93
  ['.jpeg', 'image/jpeg'],
88
94
  ['.jpg', 'image/jpeg'],
89
95
  ['.png', 'image/png'],
96
+ ['.svg', 'image/svg+xml'],
90
97
  ['.webp', 'image/webp'],
91
98
  ])
92
99
 
@@ -96,8 +103,10 @@ const LANGUAGE_BY_EXTENSION = new Map([
96
103
  ['.c', 'c'],
97
104
  ['.cc', 'cpp'],
98
105
  ['.cpp', 'cpp'],
106
+ ['.csh', 'bash'],
99
107
  ['.css', 'css'],
100
108
  ['.diff', 'diff'],
109
+ ['.fish', 'fish'],
101
110
  ['.go', 'go'],
102
111
  ['.h', 'c'],
103
112
  ['.html', 'html'],
@@ -107,6 +116,7 @@ const LANGUAGE_BY_EXTENSION = new Map([
107
116
  ['.jsx', 'react'],
108
117
  ['.md', 'markdown'],
109
118
  ['.mjs', 'javascript'],
119
+ ['.ps1', 'powershell'],
110
120
  ['.py', 'python'],
111
121
  ['.rs', 'rust'],
112
122
  ['.sh', 'bash'],
@@ -120,8 +130,18 @@ const LANGUAGE_BY_EXTENSION = new Map([
120
130
  ['.yaml', 'yaml'],
121
131
  ['.yml', 'yaml'],
122
132
  ['Dockerfile', 'dockerfile'],
133
+ ['pip', 'python'],
134
+ ['pip3', 'python'],
123
135
  ])
124
136
 
137
+ const LANGUAGE_BY_SHEBANG_PATTERN = [
138
+ [/python(?:\d+(?:\.\d+)*)?$/, 'python'],
139
+ [/(?:ba|z|k|c|tc)?sh$/, 'bash'],
140
+ [/fish$/, 'fish'],
141
+ [/(?:pwsh|powershell)$/, 'powershell'],
142
+ [/node$/, 'javascript'],
143
+ ]
144
+
125
145
  function createHttpError(message, statusCode = 400) {
126
146
  return createApiError('', message, statusCode)
127
147
  }
@@ -379,11 +399,46 @@ function getFileLanguage(relativePath = '', absolutePath = '') {
379
399
  return LANGUAGE_BY_EXTENSION.get(extension) || ''
380
400
  }
381
401
 
402
+ function getShebangLanguage(buffer) {
403
+ if (!Buffer.isBuffer(buffer) || !buffer.length) {
404
+ return ''
405
+ }
406
+
407
+ const firstLine = buffer.toString('utf8', 0, Math.min(buffer.length, 200)).split(/\r?\n/, 1)[0] || ''
408
+ if (!firstLine.startsWith('#!')) {
409
+ return ''
410
+ }
411
+
412
+ const command = firstLine
413
+ .replace(/^#!\s*/, '')
414
+ .replace(/\s+-\S+/g, ' ')
415
+ .trim()
416
+ .split(/\s+/)
417
+ .pop() || ''
418
+ const executable = path.basename(command).toLowerCase()
419
+
420
+ for (const [pattern, language] of LANGUAGE_BY_SHEBANG_PATTERN) {
421
+ if (pattern.test(executable)) {
422
+ return language
423
+ }
424
+ }
425
+
426
+ return ''
427
+ }
428
+
382
429
  function getImageMimeType(relativePath = '', absolutePath = '') {
383
430
  const extension = path.extname(String(relativePath || absolutePath || '')).toLowerCase()
384
431
  return IMAGE_MIME_TYPES.get(extension) || ''
385
432
  }
386
433
 
434
+ function isKnownTextFilePath(relativePath = '', absolutePath = '') {
435
+ const targetName = path.basename(String(relativePath || absolutePath || '').trim())
436
+ const extension = path.extname(targetName).toLowerCase()
437
+
438
+ return TEXT_FILE_EXTENSIONS.has(targetName)
439
+ || TEXT_FILE_EXTENSIONS.has(extension)
440
+ }
441
+
387
442
  function removeExtension(value = '') {
388
443
  const normalized = String(value || '')
389
444
  const extensionIndex = normalized.lastIndexOf('.')
@@ -557,6 +612,45 @@ function scoreWorkspaceMatch(relativePath = '', query = '') {
557
612
  return Math.max(pathScore, nameScore, segmentScore)
558
613
  }
559
614
 
615
+ function isSearchableTextFile(relativePath = '', absolutePath = '', stats = null) {
616
+ if (isKnownTextFilePath(relativePath, absolutePath)) {
617
+ return true
618
+ }
619
+
620
+ const sampleSize = Math.min(Number(stats?.size || 0), 8192)
621
+ if (sampleSize <= 0) {
622
+ return true
623
+ }
624
+
625
+ try {
626
+ const sample = readFileSlice(absolutePath, sampleSize)
627
+ return !isLikelyBinaryBuffer(sample)
628
+ } catch {
629
+ return false
630
+ }
631
+ }
632
+
633
+ function createContentSearchPreview(line = '', matchIndex = 0, matchLength = 0, maxLength = 180) {
634
+ const source = String(line || '')
635
+ if (!source) {
636
+ return ''
637
+ }
638
+
639
+ const safeMatchIndex = Math.max(0, Number(matchIndex) || 0)
640
+ const safeMatchLength = Math.max(1, Number(matchLength) || 1)
641
+ if (source.length <= maxLength) {
642
+ return source
643
+ }
644
+
645
+ const padding = Math.max(24, Math.floor((maxLength - safeMatchLength) / 2))
646
+ const start = Math.max(0, safeMatchIndex - padding)
647
+ const end = Math.min(source.length, safeMatchIndex + safeMatchLength + padding)
648
+ const prefix = start > 0 ? '…' : ''
649
+ const suffix = end < source.length ? '…' : ''
650
+
651
+ return `${prefix}${source.slice(start, end)}${suffix}`
652
+ }
653
+
560
654
  export function listWorkspaceTree(workspacePath, options = {}) {
561
655
  const target = resolveWorkspaceTarget(workspacePath, options.path)
562
656
  const type = getPathType(target.absolutePath)
@@ -679,6 +773,142 @@ export function searchWorkspaceEntries(workspacePath, options = {}) {
679
773
  }
680
774
  }
681
775
 
776
+ export function searchWorkspaceFileContent(workspacePath, options = {}) {
777
+ const root = path.resolve(String(workspacePath || ''))
778
+ const query = String(options.query || '').trim()
779
+ const limit = clampLimit(options.limit, DEFAULT_CONTENT_SEARCH_LIMIT, 200)
780
+
781
+ if (!query) {
782
+ return {
783
+ cwd: root,
784
+ query: '',
785
+ items: [],
786
+ truncated: false,
787
+ }
788
+ }
789
+
790
+ const normalizedQuery = query.toLowerCase()
791
+ const matches = []
792
+ let visited = 0
793
+ let truncated = false
794
+ const stack = ['']
795
+
796
+ while (stack.length) {
797
+ const currentRelativePath = stack.pop()
798
+ const currentAbsolutePath = currentRelativePath
799
+ ? path.join(root, currentRelativePath)
800
+ : root
801
+
802
+ let entries = []
803
+ try {
804
+ entries = fs.readdirSync(currentAbsolutePath, { withFileTypes: true })
805
+ } catch {
806
+ continue
807
+ }
808
+
809
+ entries.sort((left, right) => left.name.localeCompare(right.name, 'zh-CN'))
810
+
811
+ for (const entry of entries) {
812
+ if (shouldIgnoreDirectory(entry)) {
813
+ continue
814
+ }
815
+
816
+ visited += 1
817
+ if (visited > MAX_SEARCH_VISITS) {
818
+ truncated = true
819
+ stack.length = 0
820
+ break
821
+ }
822
+
823
+ const relativePath = currentRelativePath
824
+ ? `${toPosixPath(currentRelativePath)}/${entry.name}`
825
+ : entry.name
826
+ const absolutePath = path.join(currentAbsolutePath, entry.name)
827
+
828
+ if (entry.isDirectory()) {
829
+ stack.push(path.join(currentRelativePath, entry.name))
830
+ continue
831
+ }
832
+
833
+ let stats
834
+ try {
835
+ stats = fs.statSync(absolutePath)
836
+ } catch {
837
+ continue
838
+ }
839
+
840
+ if (!stats.isFile() || stats.size > MAX_CONTENT_SEARCH_FILE_BYTES) {
841
+ continue
842
+ }
843
+
844
+ if (!isSearchableTextFile(relativePath, absolutePath, stats)) {
845
+ continue
846
+ }
847
+
848
+ let content = ''
849
+ try {
850
+ content = fs.readFileSync(absolutePath, 'utf8').replace(/\r\n/g, '\n')
851
+ } catch {
852
+ continue
853
+ }
854
+
855
+ const lines = content.split('\n')
856
+ let fileMatchCount = 0
857
+
858
+ for (let lineIndex = 0; lineIndex < lines.length; lineIndex += 1) {
859
+ const line = String(lines[lineIndex] || '')
860
+ const normalizedLine = line.toLowerCase()
861
+ const matchIndex = normalizedLine.indexOf(normalizedQuery)
862
+ if (matchIndex < 0) {
863
+ continue
864
+ }
865
+
866
+ matches.push({
867
+ name: path.basename(relativePath),
868
+ path: toPosixPath(relativePath),
869
+ type: 'file',
870
+ line: lineIndex + 1,
871
+ column: matchIndex + 1,
872
+ preview: createContentSearchPreview(line, matchIndex, normalizedQuery.length),
873
+ })
874
+ fileMatchCount += 1
875
+
876
+ if (matches.length >= limit) {
877
+ truncated = true
878
+ stack.length = 0
879
+ break
880
+ }
881
+
882
+ if (fileMatchCount >= MAX_CONTENT_MATCHES_PER_FILE) {
883
+ truncated = true
884
+ break
885
+ }
886
+
887
+ if (truncated) {
888
+ break
889
+ }
890
+ }
891
+
892
+ if (truncated) {
893
+ break
894
+ }
895
+ }
896
+ }
897
+
898
+ matches.sort((left, right) => (
899
+ left.path.localeCompare(right.path, 'zh-CN')
900
+ || left.line - right.line
901
+ || left.column - right.column
902
+ ))
903
+
904
+ return {
905
+ cwd: root,
906
+ query,
907
+ items: matches.slice(0, limit),
908
+ truncated: truncated || matches.length > limit,
909
+ }
910
+ }
911
+
682
912
  export function readWorkspaceFileContent(workspacePath, options = {}) {
683
913
  const target = resolveWorkspaceTarget(workspacePath, options.path)
684
914
  const previewLimit = clampLimit(options.limit, DEFAULT_FILE_PREVIEW_LIMIT, DEFAULT_FILE_PREVIEW_LIMIT)
@@ -695,7 +925,7 @@ export function readWorkspaceFileContent(workspacePath, options = {}) {
695
925
  throw createApiError('errors.fileOnly', '只能读取文件内容。')
696
926
  }
697
927
 
698
- const language = getFileLanguage(target.relativePath, target.absolutePath)
928
+ let language = getFileLanguage(target.relativePath, target.absolutePath)
699
929
  const imageMimeType = getImageMimeType(target.relativePath, target.absolutePath)
700
930
  const basePayload = {
701
931
  cwd: target.root,
@@ -734,6 +964,7 @@ export function readWorkspaceFileContent(workspacePath, options = {}) {
734
964
  const extension = path.extname(fileName).toLowerCase()
735
965
  const isKnownTextFile = TEXT_FILE_EXTENSIONS.has(extension)
736
966
  const binary = !isKnownTextFile && isLikelyBinaryBuffer(buffer)
967
+ language = language || getShebangLanguage(buffer)
737
968
 
738
969
  if (binary) {
739
970
  return {
@@ -744,6 +975,7 @@ export function readWorkspaceFileContent(workspacePath, options = {}) {
744
975
 
745
976
  return {
746
977
  ...basePayload,
978
+ language,
747
979
  content: buffer.toString('utf8').replace(/\r\n/g, '\n'),
748
980
  truncated: stats.size > previewLimit,
749
981
  tooLarge: stats.size > previewLimit,
@@ -0,0 +1 @@
1
+ import{u as De,f as ut,c as dt}from"./index-CsDHhm4n.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-D0SJDU9Q.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 u,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"},un=["onClick"],dn=["onClick"],cn={class:"min-w-0 flex-1"},pn={key:0,class:"theme-list-item-subtitle theme-list-item-subtitle--mono truncate"},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,d=e!=null&&e.loading?1:0;return`${s}:${a}:${d}`}).join("|")),ye=S(()=>P.value&&!ae.value&&!r.value&&!g.value),Ve=S(()=>P.value&&ae.value&&!r.value&&!g.value&&!L.value.length),ue=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 d=s.replace(/\\/g,"/");return d.length>1&&!/^[a-z]:\/?$/i.test(d)&&d!=="/"&&(d=d.replace(/\/+$/,"")),a?d.toLowerCase():d}function X(e="",s=""){const a=T(e),d=T(s);return!a||!d?!1:a===d||a.startsWith(`${d}/`)}function j(e="",s=""){const a=String(e||"").trim(),d=String(s||"").trim();return a?d?se(a)?/^[a-z]:\\?$/i.test(a)?`${a.replace(/[\\/]+$/,"")}\\${d}`:`${a.replace(/[\\/]+$/,"")}\\${d}`:a==="/"?`/${d}`:`${a.replace(/\/+$/,"")}/${d}`:a:d}function qe(e="",s=""){const a=T(e),d=T(s);if(!a||!d||!X(d,a))return[];const B=d===a?"":d.slice(a.length).replace(/^\//,"");return B?B.split("/").filter(Boolean):[]}function de(e=""){const s=String(e||"").trim();if(!s||T(s)===T(M.value))return"";const a=se(s),d=s.replace(/\\/g,"/");if(a){const Z=d.replace(/\/+$/,""),t=Z.lastIndexOf("/");if(t<=2)return"";const i=Z.slice(0,t).replace(/\//g,"\\");return X(i,M.value)?i:""}const B=d.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||""),d=String(s||"").trim().toLowerCase();if(!a||!d)return null;const B=a.toLowerCase(),G=B.indexOf(d);if(G>=0)return{start:G,end:G+d.length};const ve=d.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||""),d=Ee(a,s);return d?`${oe(a.slice(0,d.start))}<mark class="theme-search-highlight">${oe(a.slice(d.start,d.end))}</mark>${oe(a.slice(d.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 d of s){if(T(d.path)===a)return d;if(d.children.length){const B=ne(e,d.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(d=>Y((d==null?void 0:d.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(),d=a<0?0:(a+e+s.length)%s.length;return z(s[d]),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(),d=s[a+1];return d&&de(d.path)===e.path?(z(d),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=de(e.path);if(!s)return!1;const a=ne(s);return a?(z(a),re(le),!0):!1}function ge(e){var s,a,d;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}(d=e==null?void 0:e.stopPropagation)==null||d.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(d=>ke(d,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 d=qe(M.value,s);for(const B of d){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,u(l(v)("directoryPicker.title")),1)]),n("p",Bt,u(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,u(l(v)("directoryPicker.currentSelection")),1),n("span",zt,u(I.value||l(v)("directoryPicker.selectionPlaceholder")),1)])]),n("label",Ht,[n("span",null,u(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,u(g.value),1)):!P.value&&y.value?(p(),m("div",Qt,u(y.value),1)):P.value&&r.value?(p(),m("div",Gt,[k(l(Ge),{class:"h-4 w-4 animate-spin"}),n("span",null,u(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,u(l(v)("directoryPicker.treeLoading")),1)])):ye.value?(p(),m("div",Xt,u(l(v)("directoryPicker.searchMinKeywordHint",{count:l(Ye)})),1)):Ve.value?(p(),m("div",Yt,u(l(v)("directoryPicker.noSearchResults")),1)):ue.value?(p(),m("div",Zt,u(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:d=>ce(a.path,d),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:d=>Re(a)},[k(l(ze),{class:"theme-list-item-icon"}),n("div",nn,[n("div",null,[n("span",{class:"theme-list-item-title truncate",innerHTML:Ae(a)},null,8,an)]),n("div",{class:"theme-list-item-subtitle theme-list-item-subtitle--mono truncate",innerHTML:Le(a)},null,8,sn)])],10,tn))),128)),Q.value?(p(),m("p",ln,u(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:d=>ce(a.path,d),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(d=>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,un),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:d=>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)]"])},u(be(a)),3),a.isHomeRoot?(p(),m("div",pn,u(a.path),1)):C("",!0)])],8,dn)])],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"))},u(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,u(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,u(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,u(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,u(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,u(o.duplicateCwdMessage),1)):o.cwdReadonlyMessage?(p(),m("p",jn,u(o.cwdReadonlyMessage),1)):C("",!0)]),n("label",In,[n("span",null,u(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)]"])},u(((g=M.value)==null?void 0:g.label)||l(v)("projectManager.selectEngine")),3),M.value&&M.value.enabled===!1?(p(),m("span",Tn,u(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,u(r.label),1),(r==null?void 0:r.enabled)===!1?(p(),m("span",Ln,u(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,u(o.engineReadonlyMessage),1)):C("",!0)]),n("label",Bn,[n("span",null,u(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,u(o.sessionIdCopied?l(v)("projectManager.sessionIdCopied"):l(v)("projectManager.copySessionId")),1)],8,Un)):C("",!0)]),o.sessionIdReadonlyMessage?(p(),m("p",zn,u(o.sessionIdReadonlyMessage),1)):(p(),m("p",Hn,u(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,u(l(v)("projectManager.projectList")),1),o.hasSessions?C("",!0):(p(),m("p",qn,u(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,u(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")},u(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},u(g.cwd),9,Zn),n("div",ea,[n("span",null,u(l(He)(g.engine)),1),o.mobile?C("",!0):(p(),m("span",ta,"·")),o.mobile?C("",!0):(p(),m("span",na,u(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)])},u(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(" "+u(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)])},u(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"},ua={key:0,class:"h-1.5 w-1.5 rounded-full bg-current animate-pulse"},da={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,u(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",ua)):C("",!0),it(" "+u(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)])},u(o.getThreadStatusLabel(o.activeSession)),3),(x=o.activeSession)!=null&&x.id&&o.isCurrentSession(o.activeSession.id)?(p(),m("span",da,u(l(R)("projectManager.currentProject")),1)):C("",!0)])]),n("div",ca,[n("div",pa,u(l(R)("projectManager.engine")),1),n("div",fa,u(l(He)((y=o.activeSession)==null?void 0:y.engine)),1)]),n("div",ga,[n("div",va,u(l(R)("projectManager.workingDirectory")),1),n("div",ma,u(((r=o.activeSession)==null?void 0:r.cwd)||l(R)("projectManager.notSet")),1)]),n("div",ha,[n("div",xa,u(l(R)("projectManager.updatedAt")),1),n("div",ya,u(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,u(l(R)("projectManager.note")),1)]),n("p",Sa,u(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),ue=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()),de=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||dt(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:ut(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 d(){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:de.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,u(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,u(l(c)("projectManager.projectList")),1)],8,qa),n("div",Wa,[n("div",Qa,u(ke.value),1),x.value==="edit"&&((w=b.value)!=null&&w.cwd)?(p(),m("p",Ga,u(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")},u(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")},u(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":de.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,u(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:d},u(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},u(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||ue.value,onClick:i[10]||(i[10]=D=>F.value=!0)},u(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||ue.value,onClick:i[11]||(i[11]=D=>K.value=!0)},u(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,u(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":de.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,u(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,u(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||ue.value,onClick:i[4]||(i[4]=D=>F.value=!0)},[k(l(Rt),{class:"h-4 w-4"}),n("span",null,u(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||ue.value,onClick:i[5]||(i[5]=D=>K.value=!0)},[k(l(Tt),{class:"h-4 w-4"}),n("span",null,u(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"))},u(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},u(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:d},u(Le.value),9,Oa)])])])]))]}),_:1},8,["open","close-disabled","close-on-backdrop","close-on-escape"])],64))}};export{gs as default};
@@ -0,0 +1,2 @@
1
+ import{g as Ze,t as P,f as Ge,u as Re,a as et,b as tt}from"./index-CsDHhm4n.js";import{u as st,g as $e,l as at,r as nt,e as it,D as Te,a as lt,i as ot,b as rt,_ as ut,c as dt}from"./WorkbenchView-D0SJDU9Q.js";import{w as z,c as V,b as H,n as qe,aD as g,aE as y,aF as a,aR as ne,aS as Se,aL as D,aQ as c,aG as $,u as t,aW as De,aX as ct,aN as J,aI as Ie,aJ as ue,f as ft,a$ as Me}from"./vendor-misc-DxKJ95A9.js";import{c as ht,j as Ne,C as Be,R as Ve,b as mt,i as vt,h as Ke,F as ze,z as Ee}from"./vendor-ui-DTqxu3Qf.js";import"./vendor-router-iukOUtEP.js";import"./vendor-markdown-BENmzbO1.js";import"./vendor-tiptap-COqMdKic.js";function se(e,i,r=""){const h=i==="run"?"run":i==="task"?"task":"workspace";return[String(e||"").trim(),h,String(r||"").trim()].join("::")}function gt(e="",i=""){return`${String(e||"").trim()}::${String(i||"").trim()}`}function pt(e=""){return`${String(e||"").trim()}::`}function Je(e){if(!e||typeof e!="object")return e;try{return JSON.parse(JSON.stringify(e))}catch{return e}}function we(e,i){const r=e.get(i);return r?(e.delete(i),e.set(i,r),Je(r)):null}function _e(e,i,r,h=0){for(e.delete(i),e.set(i,Je(r));h>0&&e.size>h;){const f=e.keys().next().value;if(typeof f>"u")break;e.delete(f)}}function ae(e=""){const i=String(e||"").trim().toUpperCase();return i==="A"||i==="D"?i:"M"}function xt(e=""){const i=String(e||"");if(!i)return[];const r=i.split(`
2
+ `),h=[];let f=0,R=0;return r.forEach((b,u)=>{const T=b.match(/^@@ -(\d+)(?:,\d+)? \+(\d+)(?:,\d+)? @@/);if(T){f=Number(T[1]),R=Number(T[2]),h.push({id:`hunk-${u}`,kind:"hunk",oldNumber:"",newNumber:"",content:b});return}if(b.startsWith("+")&&!b.startsWith("+++")){h.push({id:`line-${u}`,kind:"add",oldNumber:"",newNumber:R,content:b}),R+=1;return}if(b.startsWith("-")&&!b.startsWith("---")){h.push({id:`line-${u}`,kind:"delete",oldNumber:f,newNumber:"",content:b}),f+=1;return}if(b.startsWith(" ")){h.push({id:`line-${u}`,kind:"context",oldNumber:f,newNumber:R,content:b}),f+=1,R+=1;return}h.push({id:`line-${u}`,kind:"meta",oldNumber:"",newNumber:"",content:b})}),h}function kt(e=""){const i=String(e||"").trim();if(!i)return"";const r=i.match(/^当前分支已从 (.+) 切换到 (.+)$/);return r?P("diffReview.warningBranchChanged",{from:r[1],to:r[2]}):i==="当前 HEAD 已不在基线 commit 的后续历史中,仓库可能经历了 reset、rebase 或切分支"?P("diffReview.warningHeadDetachedFromBaseline"):i}function We(e=""){const i=String(e||"").trim();if(!i)return"";const h=new Map([["二进制文件暂不支持在线 diff 预览。","diffReview.binaryPreviewUnavailable"],["文件内容较大,暂不展示具体 diff。","diffReview.fileTooLarge"],["diff 内容较长,暂不在页面内完整展示。","diffReview.diffTooLong"],["当前工作目录不是 Git 仓库,暂不支持代码变更审查。","diffReview.notGitRepo"],["任务不存在。","diffReview.taskNotFound"],["请选择一轮执行后再查看本轮代码变更。","diffReview.runRequired"],["没有找到对应的执行记录。","diffReview.runNotFound"],["这轮执行还没有建立代码变更基线,暂时无法查看本轮 diff。","diffReview.runBaselineMissing"],["当前任务还没有建立代码变更基线,请先让 Codex 执行一轮。","diffReview.taskBaselineMissing"],["这轮执行缺少结束快照,暂时无法准确还原本轮代码变更。","diffReview.runSnapshotMissing"],["原工作目录已不是有效的 Git 仓库,暂时无法读取代码变更。","diffReview.originalRepoInvalid"],["基线对应的 commit 已不存在,仓库可能被 reset、rebase 或切换到无关历史,暂时无法准确读取该范围的代码变更。","diffReview.baselineCommitMissing"]]).get(i);return h?P(h):i}function He(e=null){return!e||typeof e!="object"?e:{...e,reason:We(e.reason),warnings:Array.isArray(e.warnings)?e.warnings.map(i=>kt(i)).filter(Boolean):[],files:Array.isArray(e.files)?e.files.map(i=>({...i,message:We(i==null?void 0:i.message)})):[]}}function yt(e){const i=H("workspace"),r=H(""),h=H(""),f=H("all"),R=H(""),b=H([]),u=H(null),T=H(!1),A=H(!1),O=H(""),l=H(!1),w=H(null),S=H(0),L=new Map,j=st();let p=0,n=0,d="",F="",E="",W=-1;const U=new Map,B=new Map,G=new Map,ie=V(()=>b.value.filter(s=>s.completed)),de=V(()=>{var o;const s={all:0,A:0,M:0,D:0};return(((o=u.value)==null?void 0:o.files)||[]).forEach(m=>{const k=ae(m==null?void 0:m.status);s.all+=1,s[k]+=1}),s}),Z=V(()=>{var m;const s=((m=u.value)==null?void 0:m.files)||[],o=String(R.value||"").trim().toLowerCase();return s.filter(k=>f.value!=="all"&&ae(k==null?void 0:k.status)!==f.value?!1:o?String((k==null?void 0:k.path)||"").toLowerCase().includes(o):!0)}),ce=V(()=>{const s=Z.value;return s.find(o=>o.path===h.value)||s[0]||null}),re=V(()=>{var s;return xt(((s=ce.value)==null?void 0:s.patch)||"")}),q=V(()=>re.value.map((s,o)=>({...s,index:o})).filter(s=>s.kind==="hunk")),fe=V(()=>{var s,o;return A.value&&!((o=(s=u.value)==null?void 0:s.summary)!=null&&o.statsComplete)}),ee=V(()=>{var m;const s=((m=u.value)==null?void 0:m.baseline)||null;if(!(s!=null&&s.createdAt)&&!(s!=null&&s.headShort))return"";const o=[];return s.createdAt&&o.push(P("diffReview.baselineTime",{value:Ge(s.createdAt)})),s.branch&&o.push(P("diffReview.baselineBranch",{value:s.branch})),s.headShort&&o.push(P("diffReview.baselineCommit",{value:s.headShort})),s.currentHeadShort&&o.push(P("diffReview.currentHead",{value:s.currentHeadShort})),o.join(" · ")});function M(s){return(s==null?void 0:s.status)==="completed"?P("diffReview.completed"):(s==null?void 0:s.status)==="error"?P("diffReview.failed"):(s==null?void 0:s.status)==="interrupted"?P("diffReview.interrupted"):P("diffReview.stopped")}function C(s,o){if(s){if(o){L.set(s,o);return}L.delete(s)}}function he(s,o={}){const m=q.value;if(!m.length)return;const k=Math.min(Math.max(0,Number(s)||0),m.length-1),N=m[k],_=L.get(N.id);_&&(S.value=k,_.scrollIntoView({block:o.block||"center",behavior:o.behavior||"smooth"}))}function me(s=1){q.value.length&&he(S.value+s)}function K(s){return`${new Date((s==null?void 0:s.startedAt)||(s==null?void 0:s.createdAt)).toLocaleString(Ze())} · ${M(s)}`}function v(){const s=ie.value;if(!s.length){r.value="";return}s.some(o=>o.id===r.value)||(r.value=s[0].id)}function te(){const s=Z.value;if(!s.length){h.value="";return}s.some(o=>o.path===h.value)||(h.value=s[0].path)}function ve(s=""){return ae(s)==="A"?P("diffReview.added"):ae(s)==="D"?P("diffReview.deleted"):P("diffReview.modified")}function ge(s=""){return ae(s)==="A"?"theme-status-success":ae(s)==="D"?"theme-status-danger":"theme-status-warning"}function pe(s="all"){return s==="A"?P("diffReview.added"):s==="D"?P("diffReview.deleted"):s==="M"?P("diffReview.modified"):P("diffReview.all")}function xe(s="all"){return f.value===s?"theme-filter-active":"theme-filter-idle"}function x(s="context"){return s==="add"?"theme-patch-add":s==="delete"?"theme-patch-delete":s==="hunk"?"theme-patch-hunk":s==="meta"?"theme-patch-meta":"theme-patch-context"}function le(s,o=""){const m=String(o||"").trim();m&&Array.from(s.keys()).forEach(k=>{String(k||"").startsWith(m)&&s.delete(k)})}function Fe(){const s=pt(e.taskSlug);le(U,s),le(B,s),le(G,s)}async function Qe(){if(!e.taskSlug){b.value=[],r.value="",E="",W=-1;return}const s=j.getTaskRunSyncVersion(e.taskSlug);if(E===e.taskSlug&&W===s)return;const o=await at(e.taskSlug,{limit:20,events:"none"});b.value=o.items||[],E=e.taskSlug,W=s,v()}async function Ce(){if(!e.taskSlug||!e.active)return;const s=++p;T.value=!0,A.value=!1,O.value="";try{const o=i.value==="run"?"run":i.value==="task"?"task":"workspace";o==="run"&&await Qe();const m=se(e.taskSlug,o,o==="run"?r.value:"");if(o==="run"&&!r.value){u.value={supported:!1,reason:P("diffReview.noReviewRuns"),repoRoot:"",summary:{fileCount:0,additions:0,deletions:0,statsComplete:!0},files:[]},te();return}const k=we(U,m);if(k){u.value=k,d=m;const I=we(B,m);I?(u.value={...k,baseline:I.baseline||k.baseline||null,warnings:I.warnings||k.warnings||[],summary:I.summary||k.summary},F=m):F="",te(),ke().catch(()=>{}),I||Ae().catch(()=>{});return}const N=await $e(e.taskSlug,{scope:o,runId:o==="run"?r.value:"",includeStats:!1});if(s!==p)return;const _=He(N);u.value=_,_e(U,m,_,36),d=m,F="",te(),ke().catch(()=>{}),Ae().catch(()=>{})}catch(o){if(s!==p)return;O.value=o.message,u.value=null}finally{s===p&&(T.value=!1)}}async function Ae(){var N,_,I;if(!e.taskSlug||!e.active||!((N=u.value)!=null&&N.supported))return;const s=i.value==="run"?"run":i.value==="task"?"task":"workspace",o=s==="run"?r.value:"",m=se(e.taskSlug,s,o);if(F===m&&((I=(_=u.value)==null?void 0:_.summary)!=null&&I.statsComplete))return;const k=we(B,m);if(k){u.value={...u.value,baseline:k.baseline||u.value.baseline||null,warnings:k.warnings||u.value.warnings||[],summary:k.summary||u.value.summary},F=m,A.value=!1;return}A.value=!0;try{const X=await $e(e.taskSlug,{scope:s,runId:o,includeFiles:!1,includeStats:!0}),oe=se(e.taskSlug,i.value,i.value==="run"?r.value:"");if(m!==oe||!u.value)return;const Q=He(X);u.value={...u.value,baseline:Q.baseline||u.value.baseline||null,warnings:Q.warnings||u.value.warnings||[],summary:Q.summary||u.value.summary},_e(B,m,{baseline:Q.baseline||null,warnings:Q.warnings||[],summary:Q.summary||null},36),F=m}catch{}finally{const X=se(e.taskSlug,i.value,i.value==="run"?r.value:"");m===X&&(A.value=!1)}}async function ke(){var oe,Q,je;const s=String(h.value||"").trim();if(!e.taskSlug||!e.active||!s||l.value)return;const o=i.value==="run"?"run":i.value==="task"?"task":"workspace",m=o==="run"?r.value:"",k=se(e.taskSlug,o,m),N=(((oe=u.value)==null?void 0:oe.files)||[]).find(Y=>Y.path===s);if(!N||N.patchLoaded||N.binary||N.tooLarge||N.message)return;const _=gt(k,s),I=we(G,_);if(I&&((Q=u.value)!=null&&Q.files)){u.value={...u.value,files:u.value.files.map(Y=>Y.path===s?I:Y)};return}const X=++n;l.value=!0;try{const Y=await $e(e.taskSlug,{scope:o,runId:m,filePath:s});if(X!==n)return;const Ye=se(e.taskSlug,i.value,i.value==="run"?r.value:"");if(k!==Ye)return;const Le=He(Y),Pe=(Le.files||[]).find(be=>be.path===s);if(!Pe||!((je=u.value)!=null&&je.files))return;_e(G,_,Pe,120),u.value={...u.value,baseline:Le.baseline||u.value.baseline||null,warnings:Le.warnings||u.value.warnings||[],files:u.value.files.map(be=>be.path===s?Pe:be)}}catch(Y){O.value=Y.message}finally{X===n&&(l.value=!1,String(h.value||"").trim()!==s&&ke().catch(()=>{}))}}function ye({force:s=!1}={}){if(!e.taskSlug||!e.active)return;const o=se(e.taskSlug,i.value,i.value==="run"?r.value:"");!s&&o===d||Ce().catch(()=>{})}async function Xe(){!e.taskSlug||!e.active||T.value||(Fe(),d="",F="",E="",W=-1,await Ce())}return z(()=>[e.taskSlug,e.active,i.value,r.value],([s,o],m=[])=>{const k=m[0]||"";s!==k&&(h.value="",d="",b.value=[],r.value="",E="",W=-1,F=""),!(!s||!o)&&ye()},{immediate:!0}),z(()=>{var s,o;return[f.value,((o=(s=u.value)==null?void 0:s.files)==null?void 0:o.length)||0]},()=>{te()}),z(()=>[h.value,q.value.length],()=>{S.value=0,L.clear(),qe(()=>{var s,o;q.value.length?he(0,{behavior:"auto",block:"start"}):(o=(s=w.value)==null?void 0:s.scrollTo)==null||o.call(s,{top:0,behavior:"auto"})})}),z(()=>h.value,()=>{ke().catch(()=>{})},{immediate:!0}),z(()=>[e.preferredScope,e.preferredRunId,e.focusToken],([s,o,m],k=[])=>{const N=Number(k[2]||0),_=s==="run"?"run":s==="task"?"task":"workspace",I=_==="run"&&o?String(o||""):"",X=i.value!==_,oe=_==="run"&&I&&r.value!==I;i.value=_,I&&(r.value=I),_!=="run"&&(r.value=""),!X&&!oe&&e.active&&e.taskSlug&&m!==N&&(d="",ye())},{immediate:!0}),z(()=>j.readyVersion.value,()=>{!e.active||!e.taskSlug||(E="",W=-1,d="",F="",ye({force:!0}))}),z(()=>j.getTaskDiffSyncVersion(e.taskSlug),()=>{!e.active||!e.taskSlug||(E="",W=-1,F="",d="",ye({force:!0}))}),{activeHunkIndex:S,baselineMetaText:ee,diffPayload:u,diffScope:i,error:O,fileSearch:R,filteredFiles:Z,getFilterButtonClass:xe,getFilterLabel:pe,getPatchLineClass:x,getRunStatusLabel:M,getStatusClass:ge,getStatusLabel:ve,jumpToAdjacentHunk:me,loadDiff:Ce,loading:T,normalizeFileStatus:ae,patchLoading:l,patchViewportRef:w,runs:b,selectedFile:ce,selectedFilePath:h,selectedPatchHunks:q,selectedPatchLines:re,selectedRunId:r,setPatchLineRef:C,showSummarySkeleton:fe,statsLoading:A,statusCounts:de,statusFilter:f,terminalRuns:ie,formatRunOptionLabel:K,refreshDiff:Xe}}const bt={class:"mb-3 grid grid-cols-2 gap-2"},wt=["onClick"],St={class:"theme-input-shell mb-3 flex items-center gap-2 rounded-sm border px-3 py-2 text-xs text-[var(--theme-textMuted)]"},Rt=["placeholder"],Ft={key:0,class:"theme-empty-state theme-empty-state-strong mb-3 px-3 py-2 text-[11px]"},Ct={key:1,class:"theme-empty-state px-3 py-4 text-xs"},Lt={key:2,class:"theme-empty-state px-3 py-4 text-xs"},Pt={key:3,class:"space-y-1"},$t=["onClick","onKeydown"],Tt={class:"min-w-0 flex-1"},_t={class:"theme-list-item-title break-all"},Ht={class:"theme-list-item-meta mt-1"},Oe={__name:"TaskDiffFileList",props:{diffPayload:{type:Object,default:null},fileSearch:{type:String,default:""},autoFocusSelected:{type:Boolean,default:!1},filteredFiles:{type:Array,default:()=>[]},focusToken:{type:Number,default:0},getFilterButtonClass:{type:Function,default:()=>""},getFilterLabel:{type:Function,default:e=>e},getStatusClass:{type:Function,default:()=>""},getStatusLabel:{type:Function,default:e=>e},selectedFilePath:{type:String,default:""},showSummarySkeleton:{type:Boolean,default:!1},statusCounts:{type:Object,default:()=>({})},statusFilter:{type:String,default:"all"}},emits:["select-file","update:fileSearch","update:statusFilter"],setup(e,{emit:i}){const r=e,h=i,{t:f}=Re(),R=new Map,b=H(0),u=H(0),T=V({get:()=>r.fileSearch,set:p=>h("update:fileSearch",p)}),A=V({get:()=>r.statusFilter,set:p=>h("update:statusFilter",p)}),O=V(()=>{var p;return Array.isArray((p=r.diffPayload)==null?void 0:p.files)&&r.diffPayload.files.length>0});function l(p,n){if(n){R.set(p,n);return}R.delete(p)}function w(p){qe(()=>{var d,F;const n=R.get(p);(d=n==null?void 0:n.focus)==null||d.call(n),(F=n==null?void 0:n.scrollIntoView)==null||F.call(n,{block:"nearest",inline:"nearest"})})}function S(){!r.autoFocusSelected||!r.selectedFilePath||b.value===u.value||(u.value=b.value,w(r.selectedFilePath))}function L(p=1,n=""){const d=Array.isArray(r.filteredFiles)?r.filteredFiles:[];if(!d.length)return;const F=d.findIndex(G=>G.path===n),E=d.findIndex(G=>G.path===r.selectedFilePath),U=(Math.max(0,F>=0?F:E)+p+d.length)%d.length,B=d[U];B!=null&&B.path&&(h("select-file",B.path),w(B.path))}function j(p,n){const d=String((p==null?void 0:p.key)||"");if(d==="ArrowDown"){p.preventDefault(),L(1,n);return}if(d==="ArrowUp"){p.preventDefault(),L(-1,n);return}(d==="Enter"||d===" ")&&n&&(p.preventDefault(),h("select-file",n))}return z(()=>r.focusToken,p=>{b.value=p,S()},{immediate:!0}),z(()=>r.selectedFilePath,()=>{S()}),(p,n)=>(g(),y(ne,null,[a("div",bt,[(g(),y(ne,null,Se(["all","A","M","D"],d=>a("button",{key:d,type:"button",class:D(["inline-flex w-full items-center justify-center gap-1 whitespace-nowrap rounded-sm border px-2 py-1 text-[11px] transition",e.getFilterButtonClass(d)]),onClick:F=>A.value=d},c(e.getFilterLabel(d))+" "+c(e.statusCounts[d]||0),11,wt)),64))]),a("label",St,[$(t(ht),{class:"h-3.5 w-3.5 shrink-0"}),De(a("input",{"onUpdate:modelValue":n[0]||(n[0]=d=>T.value=d),type:"text",placeholder:t(f)("diffReview.searchFilePath"),class:"min-w-0 flex-1 bg-transparent text-xs text-[var(--theme-textPrimary)] outline-none placeholder:text-[var(--theme-textMuted)]"},null,8,Rt),[[ct,T.value]])]),e.showSummarySkeleton?(g(),y("div",Ft,c(t(f)("diffReview.statsPending")),1)):J("",!0),O.value?e.filteredFiles.length?(g(),y("div",Pt,[(g(!0),y(ne,null,Se(e.filteredFiles,d=>(g(),y("button",{key:d.path,ref_for:!0,ref:F=>l(d.path,F),type:"button",class:D(["theme-list-row focus:outline-none",d.path===e.selectedFilePath?"theme-list-item-active":"theme-list-item-hover"]),onClick:F=>h("select-file",d.path),onKeydown:F=>j(F,d.path)},[a("span",{class:D(["theme-list-item-badge",e.getStatusClass(d.status)])},c(e.getStatusLabel(d.status)),3),a("div",Tt,[a("div",_t,c(d.path),1),a("div",Ht,c(d.statsLoaded?`+${d.additions} / -${d.deletions}`:t(f)("diffReview.statsOnDemand")),1)])],42,$t))),128))])):(g(),y("div",Lt,c(t(f)("diffReview.noMatches")),1)):(g(),y("div",Ct,c(t(f)("diffReview.noChanges")),1))],64))}},Dt={key:0,class:"flex h-full min-h-0 flex-col overflow-hidden"},It={class:"theme-divider theme-secondary-text border-b px-4 py-3 text-xs"},At={class:"space-y-3 sm:hidden"},jt={class:"flex items-start gap-2"},Mt={class:"min-w-0 break-all font-medium text-[var(--theme-textPrimary)]"},Nt={class:"flex items-center justify-between gap-3"},Bt={class:"opacity-75"},Vt=["disabled"],zt={class:"min-w-[64px] text-center text-[11px] text-[var(--theme-textSecondary)]"},Et=["disabled"],Wt={class:"hidden items-center gap-3 sm:flex"},Ot={class:"flex min-w-0 flex-1 flex-wrap items-center gap-2"},Ut={class:"break-all font-medium text-[var(--theme-textPrimary)]"},Gt={class:"opacity-75"},qt=["disabled"],Kt={class:"min-w-[64px] text-center text-[11px] text-[var(--theme-textSecondary)]"},Jt=["disabled"],Qt={key:0,class:"theme-secondary-text flex-1 overflow-y-auto px-4 py-4 text-sm"},Xt={class:"theme-empty-state px-4 py-4"},Yt={key:1,class:"theme-muted-text flex-1 overflow-y-auto px-4 py-4 text-sm"},Zt={class:"min-w-max px-4 py-4 font-mono text-[11px] leading-5"},es={class:"task-diff-row__number select-none"},ts={class:"task-diff-row__number select-none"},ss=["innerHTML"],as={key:3,class:"theme-secondary-text flex-1 overflow-y-auto px-4 py-4 text-sm"},ns={class:"theme-empty-state px-4 py-4"},is={key:1,class:"theme-muted-text flex h-full items-center justify-center px-5 text-sm"},ls={__name:"TaskDiffPatchView",props:{activeHunkIndex:{type:Number,default:0},getPatchLineClass:{type:Function,default:()=>""},getStatusClass:{type:Function,default:()=>""},getStatusLabel:{type:Function,default:e=>e},jumpToAdjacentHunk:{type:Function,default:()=>{}},patchLoading:{type:Boolean,default:!1},selectedFile:{type:Object,default:null},selectedPatchHunks:{type:Array,default:()=>[]},selectedPatchLines:{type:Array,default:()=>[]},setPatchLineRef:{type:Function,default:()=>{}},setPatchViewportRef:{type:Function,default:()=>{}}},setup(e){const i=e,{t:r}=Re(),{isDark:h}=tt(),f=H([]),R=V(()=>{var l;return ot(((l=i.selectedFile)==null?void 0:l.path)||"")});function b(l){return(l==null?void 0:l.kind)==="add"?"+":(l==null?void 0:l.kind)==="delete"?"-":(l==null?void 0:l.kind)==="context"?" ":""}function u(l){const w=String((l==null?void 0:l.content)||"");return(l==null?void 0:l.kind)==="add"||(l==null?void 0:l.kind)==="delete"||(l==null?void 0:l.kind)==="context"?w.slice(1):w}function T(l=""){return String(l||"").replace(/&/g,"&amp;").replace(/</g,"&lt;").replace(/>/g,"&gt;").replace(/"/g,"&quot;").replace(/'/g,"&#39;")}function A(l,w=""){if((l==null?void 0:l.kind)==="add"||(l==null?void 0:l.kind)==="delete"||(l==null?void 0:l.kind)==="context"){const S=b(l),L=`task-diff-line__prefix--${l.kind}`;return{...l,renderedHtml:`<span class="task-diff-line__prefix ${L}">${T(S||" ")}</span><span class="task-diff-line__body">${w||"&#8203;"}</span>`}}return{...l,renderedHtml:T(String((l==null?void 0:l.content)||""))}}async function O(){const l=Array.isArray(i.selectedPatchLines)?i.selectedPatchLines:[],w=[];l.forEach((n,d)=>{((n==null?void 0:n.kind)==="add"||(n==null?void 0:n.kind)==="delete"||(n==null?void 0:n.kind)==="context")&&w.push({lineIndex:d,body:u(n)})});const S=nt(w.map(n=>n.body));let L=0;if(f.value=l.map(n=>{if((n==null?void 0:n.kind)==="add"||(n==null?void 0:n.kind)==="delete"||(n==null?void 0:n.kind)==="context"){const d=S[L]||"&#8203;";return L+=1,A(n,d)}return A(n)}),!w.length||it(w.map(n=>n.body),Te))return;const j=await lt(w.map(n=>n.body),{isDark:h.value,language:R.value,maxHighlightLines:Te.maxLines,maxHighlightChars:Te.maxChars});let p=0;f.value=l.map(n=>{if((n==null?void 0:n.kind)==="add"||(n==null?void 0:n.kind)==="delete"||(n==null?void 0:n.kind)==="context"){const d=j[p]||"&#8203;";return p+=1,A(n,d)}return A(n)})}return z(()=>{var l;return[i.selectedPatchLines,(l=i.selectedFile)==null?void 0:l.path,h.value]},()=>{O()},{immediate:!0,deep:!0}),(l,w)=>e.selectedFile?(g(),y("div",Dt,[a("div",It,[a("div",At,[a("div",jt,[a("span",{class:D(["inline-flex shrink-0 rounded-sm border px-1.5 py-0.5 text-[10px]",e.getStatusClass(e.selectedFile.status)])},c(e.getStatusLabel(e.selectedFile.status)),3),a("span",Mt,c(e.selectedFile.path),1)]),a("div",Nt,[a("span",Bt,c(e.selectedFile.statsLoaded?`+${e.selectedFile.additions} / -${e.selectedFile.deletions}`:t(r)("diffReview.statsOnDemand")),1),a("div",{class:D(["inline-flex h-8 shrink-0 items-center gap-1 rounded-sm border px-1.5 py-1",e.selectedPatchHunks.length?"theme-inline-panel":"pointer-events-none invisible border-transparent"])},[a("button",{type:"button",class:"theme-icon-button h-6 w-6 disabled:opacity-50",disabled:e.activeHunkIndex<=0,onClick:w[0]||(w[0]=S=>e.jumpToAdjacentHunk(-1))},[$(t(Ne),{class:"h-4 w-4"})],8,Vt),a("span",zt,c(t(r)("diffReview.changeIndex",{current:Math.min(e.activeHunkIndex+1,e.selectedPatchHunks.length),total:e.selectedPatchHunks.length})),1),a("button",{type:"button",class:"theme-icon-button h-6 w-6 disabled:opacity-50",disabled:e.activeHunkIndex>=e.selectedPatchHunks.length-1,onClick:w[1]||(w[1]=S=>e.jumpToAdjacentHunk(1))},[$(t(Be),{class:"h-4 w-4"})],8,Et)],2)])]),a("div",Wt,[a("div",Ot,[a("span",{class:D(["inline-flex rounded-sm border px-1.5 py-0.5 text-[10px]",e.getStatusClass(e.selectedFile.status)])},c(e.getStatusLabel(e.selectedFile.status)),3),a("span",Ut,c(e.selectedFile.path),1),a("span",Gt,c(e.selectedFile.statsLoaded?`+${e.selectedFile.additions} / -${e.selectedFile.deletions}`:t(r)("diffReview.statsOnDemand")),1)]),a("div",{class:D(["inline-flex h-8 w-[132px] shrink-0 items-center gap-1 rounded-sm border px-1.5 py-1",e.selectedPatchHunks.length?"theme-inline-panel":"pointer-events-none invisible border-transparent"])},[a("button",{type:"button",class:"theme-icon-button h-6 w-6 disabled:opacity-50",disabled:e.activeHunkIndex<=0,onClick:w[2]||(w[2]=S=>e.jumpToAdjacentHunk(-1))},[$(t(Ne),{class:"h-4 w-4"})],8,qt),a("span",Kt,c(t(r)("diffReview.changeIndex",{current:Math.min(e.activeHunkIndex+1,e.selectedPatchHunks.length),total:e.selectedPatchHunks.length})),1),a("button",{type:"button",class:"theme-icon-button h-6 w-6 disabled:opacity-50",disabled:e.activeHunkIndex>=e.selectedPatchHunks.length-1,onClick:w[3]||(w[3]=S=>e.jumpToAdjacentHunk(1))},[$(t(Be),{class:"h-4 w-4"})],8,Jt)],2)])]),e.selectedFile.message?(g(),y("div",Qt,[a("div",Xt,c(e.selectedFile.message),1)])):e.patchLoading&&!e.selectedFile.patchLoaded?(g(),y("div",Yt,c(t(r)("diffReview.loadingFileDiff")),1)):e.selectedPatchLines.length?(g(),y("div",{key:2,ref:e.setPatchViewportRef,class:"flex-1 overflow-auto"},[a("div",Zt,[(g(!0),y(ne,null,Se(f.value,S=>{var L;return g(),y("div",{key:S.id,ref_for:!0,ref:j=>e.setPatchLineRef(S.id,j),class:D(["task-diff-row grid",[e.getPatchLineClass(S.kind),S.kind==="hunk"&&((L=e.selectedPatchHunks[e.activeHunkIndex])==null?void 0:L.id)===S.id?"ring-1 ring-inset ring-[var(--theme-warning)]":""]])},[a("span",es,c(S.oldNumber),1),a("span",ts,c(S.newNumber),1),a("pre",{class:D(["task-diff-line overflow-visible whitespace-pre px-3 py-0.5",S.kind==="meta"||S.kind==="hunk"?"task-diff-line--plain":""]),innerHTML:S.renderedHtml},null,10,ss)],2)}),128))])],512)):(g(),y("div",as,[a("div",ns,c(t(r)("diffReview.noFileDiffContent")),1)]))])):(g(),y("div",is,c(t(r)("diffReview.selectFile")),1))}},Ue=et(ls,[["__scopeId","data-v-1a81fddc"]]),os={class:"panel flex h-full min-h-0 flex-col overflow-hidden"},rs={class:"theme-divider border-b px-4 py-3"},us={class:"flex flex-col gap-2"},ds={class:"grid grid-cols-4 gap-2 sm:flex sm:flex-wrap sm:items-center"},cs={class:"sm:hidden"},fs={class:"hidden sm:inline"},hs={class:"sm:hidden"},ms={class:"hidden sm:inline"},vs=["disabled"],gs={class:"sm:hidden"},ps={class:"hidden sm:inline"},xs={class:"truncate text-xs text-[var(--theme-textPrimary)]"},ks={class:"theme-divider theme-muted-text border-b border-dashed px-3 py-2 text-[11px]"},ys=["onClick"],bs={class:"flex items-start gap-3"},ws={class:"min-w-0 flex-1"},Ss={class:"truncate text-xs font-medium text-[var(--theme-textPrimary)]"},Rs={class:"theme-muted-text mt-1 text-[11px]"},Fs={key:0,class:"theme-divider theme-danger-text border-b px-4 py-3 text-sm"},Cs={class:"inline-flex items-start gap-2"},Ls={class:"break-all"},Ps={key:1,class:"theme-muted-text flex flex-1 items-center justify-center px-5 text-sm"},$s={key:2,class:"flex flex-1 items-center justify-center px-5"},Ts={class:"theme-empty-state w-full max-w-xl px-4 py-5 text-sm text-[var(--theme-textSecondary)]"},_s={class:"theme-heading inline-flex items-center gap-2 font-medium"},Hs={class:"mt-2 break-all leading-7"},Ds={key:0,class:"mt-3 flex flex-wrap gap-2 text-xs"},Is={class:"theme-status-neutral inline-flex items-center gap-2 rounded-sm border border-dashed px-2.5 py-1.5"},As={class:"break-all"},js={key:0,class:"theme-status-success inline-flex items-center gap-2 rounded-sm border border-dashed px-2.5 py-1.5"},Ms={key:3,class:"flex min-h-0 flex-1 flex-col overflow-hidden"},Ns={class:"theme-divider theme-secondary-text border-b px-4 py-3 text-xs"},Bs={class:"flex flex-wrap items-center gap-2"},Vs={key:0,class:"theme-status-info inline-flex min-w-0 items-center gap-2 rounded-sm border border-dashed px-2.5 py-1.5"},zs={class:"min-w-0 break-all"},Es={class:"theme-status-success inline-flex items-center gap-2 rounded-sm border border-dashed px-2.5 py-1.5"},Ws={class:"text-[var(--theme-textPrimary)]"},Os={class:"font-medium text-[var(--theme-success)]"},Us={class:"font-medium text-[var(--theme-danger)]"},Gs={key:2,class:"opacity-75"},qs={key:0,class:"mt-2 break-all text-[11px] opacity-75"},Ks={key:1,class:"mt-2 flex flex-col gap-1"},Js={key:0,class:"flex min-h-0 flex-1 flex-col overflow-hidden"},Qs={class:"theme-divider border-b px-3 py-3"},Xs={class:"grid grid-cols-2 gap-2"},Ys=["disabled"],Zs={class:"theme-divider theme-muted-panel min-h-0 flex-1 overflow-y-auto p-3"},ea={class:"min-h-0 flex-1 overflow-hidden bg-[var(--theme-appPanelStrong)]"},ta={key:1,class:"grid min-h-0 flex-1 grid-cols-[320px_minmax(0,1fr)] overflow-hidden"},sa={class:"theme-divider theme-muted-panel min-h-0 overflow-y-auto border-r p-3"},aa={class:"min-h-0 overflow-hidden bg-[var(--theme-appPanelStrong)]"},na={__name:"TaskDiffReviewPanel",props:{taskSlug:{type:String,default:""},preferredScope:{type:String,default:"workspace"},preferredRunId:{type:String,default:""},focusToken:{type:Number,default:0},active:{type:Boolean,default:!1}},setup(e){const i=e,{activeHunkIndex:r,baselineMetaText:h,diffPayload:f,diffScope:R,error:b,fileSearch:u,filteredFiles:T,formatRunOptionLabel:A,getFilterButtonClass:O,getFilterLabel:l,getPatchLineClass:w,getRunStatusLabel:S,getStatusClass:L,getStatusLabel:j,jumpToAdjacentHunk:p,loading:n,patchLoading:d,patchViewportRef:F,refreshDiff:E,selectedFile:W,selectedFilePath:U,selectedPatchHunks:B,selectedPatchLines:G,selectedRunId:ie,setPatchLineRef:de,showSummarySkeleton:Z,statsLoading:ce,statusCounts:re,statusFilter:q,terminalRuns:fe}=yt(i),{matches:ee}=rt("(max-width: 767px)"),M=H("files"),{t:C}=Re();function he(K){U.value=K,ee.value&&(M.value="patch")}function me(K){F.value=K||null}return z(ee,K=>{K||(M.value="files")},{immediate:!0}),z(U,K=>{!K&&ee.value&&(M.value="files")}),z(R,()=>{ee.value&&(M.value="files")}),(K,v)=>{var te,ve,ge,pe,xe;return g(),y("section",os,[a("div",rs,[a("div",us,[a("div",ds,[a("button",{type:"button",class:D(["tool-button inline-flex items-center justify-center gap-2 px-3 py-2 text-xs",t(R)==="workspace"?"theme-filter-active":""]),onClick:v[0]||(v[0]=x=>R.value="workspace")},[a("span",cs,c(t(C)("diffReview.scopeCurrentShort")),1),a("span",fs,c(t(C)("diffReview.scopeCurrent")),1)],2),a("button",{type:"button",class:D(["tool-button inline-flex items-center justify-center gap-2 px-3 py-2 text-xs",t(R)==="task"?"theme-filter-active":""]),onClick:v[1]||(v[1]=x=>R.value="task")},[a("span",hs,c(t(C)("diffReview.scopeTaskShort")),1),a("span",ms,c(t(C)("diffReview.scopeTask")),1)],2),a("button",{type:"button",class:D(["tool-button inline-flex items-center justify-center gap-2 px-3 py-2 text-xs",t(R)==="run"?"theme-filter-active":""]),onClick:v[2]||(v[2]=x=>R.value="run")},[a("span",null,c(t(C)("diffReview.scopeRun")),1)],2),a("button",{type:"button",class:"tool-button tool-button-info-subtle inline-flex shrink-0 items-center justify-center gap-2 px-3 py-2 text-xs",disabled:t(n),onClick:v[3]||(v[3]=(...x)=>t(E)&&t(E)(...x))},[$(t(Ve),{class:D(["h-3.5 w-3.5 sm:hidden",t(n)?"animate-spin":""])},null,8,["class"]),a("span",gs,c(t(C)("diffReview.refresh")),1),$(t(Ve),{class:D(["hidden h-3.5 w-3.5 sm:inline-block",t(n)?"animate-spin":""])},null,8,["class"]),a("span",ps,c(t(n)?t(C)("diffReview.refreshing"):t(ce)?t(C)("diffReview.computing"):t(C)("diffReview.refresh")),1)],8,vs)]),t(R)==="run"?(g(),Ie(ut,{key:0,modelValue:t(ie),"onUpdate:modelValue":v[4]||(v[4]=x=>ft(ie)?ie.value=x:null),class:"min-w-0 sm:max-w-[360px]",options:t(fe),loading:t(n),"get-option-value":x=>(x==null?void 0:x.id)||"",placeholder:t(C)("diffReview.selectRun"),"empty-text":t(C)("diffReview.noRuns")},{trigger:ue(({selectedOption:x})=>[a("div",xs,c(x?t(A)(x):t(C)("diffReview.selectRun")),1)]),header:ue(()=>[a("div",ks,c(t(C)("diffReview.runCount",{count:t(fe).length})),1)]),option:ue(({option:x,selected:le,select:Fe})=>[a("button",{type:"button",class:D(["w-full rounded-sm border border-dashed px-3 py-2 text-left transition",le?"theme-filter-active":"theme-filter-idle"]),onClick:Fe},[a("div",bs,[a("div",ws,[a("div",Ss,c(t(Ge)(x.startedAt||x.createdAt)),1),a("div",Rs,c(t(S)(x)),1)]),le?(g(),Ie(t(mt),{key:0,class:"mt-0.5 h-4 w-4 shrink-0 text-[var(--theme-textSecondary)]"})):J("",!0)])],10,ys)]),_:1},8,["modelValue","options","loading","get-option-value","placeholder","empty-text"])):J("",!0)])]),t(b)?(g(),y("div",Fs,[a("div",Cs,[$(t(vt),{class:"mt-0.5 h-4 w-4 shrink-0"}),a("span",Ls,c(t(b)),1)])])):J("",!0),t(n)&&!t(f)?(g(),y("div",Ps,c(t(C)("diffReview.loading")),1)):t(f)&&!t(f).supported?(g(),y("div",$s,[a("div",Ts,[a("div",_s,[$(t(Ke),{class:"h-4 w-4"}),a("span",null,c(t(C)("diffReview.unavailableTitle")),1)]),a("p",Hs,c(t(f).reason||t(C)("diffReview.unavailableReason")),1),t(f).repoRoot?(g(),y("div",Ds,[a("div",Is,[$(t(ze),{class:"h-3.5 w-3.5 shrink-0"}),a("span",As,c(t(f).repoRoot),1)]),t(f).branch?(g(),y("div",js,[$(t(Ee),{class:"h-3.5 w-3.5 shrink-0"}),a("span",null,c(t(f).branch),1)])):J("",!0)])):J("",!0)])])):t(f)?(g(),y("div",Ms,[a("div",Ns,[a("div",Bs,[t(f).repoRoot?(g(),y("div",Vs,[$(t(ze),{class:"h-3.5 w-3.5 shrink-0"}),a("span",zs,c(t(f).repoRoot),1)])):J("",!0),a("div",Es,[$(t(Ee),{class:"h-3.5 w-3.5 shrink-0"}),a("span",null,c(t(f).branch||t(C)("diffReview.unknownBranch")),1),v[16]||(v[16]=a("span",{class:"opacity-50"},"•",-1)),a("span",Ws,c(t(C)("diffReview.fileCount",{count:((te=t(f).summary)==null?void 0:te.fileCount)||0})),1),(ve=t(f).summary)!=null&&ve.statsComplete?(g(),y(ne,{key:0},[v[12]||(v[12]=a("span",{class:"opacity-50"},"•",-1)),a("span",Os,"+"+c(((ge=t(f).summary)==null?void 0:ge.additions)||0),1),a("span",Us,"-"+c(((pe=t(f).summary)==null?void 0:pe.deletions)||0),1)],64)):t(Z)?(g(),y(ne,{key:1},[v[13]||(v[13]=a("span",{class:"opacity-50"},"•",-1)),v[14]||(v[14]=a("span",{class:"h-3 w-10 animate-pulse rounded bg-[var(--theme-successSoft)]"},null,-1)),v[15]||(v[15]=a("span",{class:"h-3 w-10 animate-pulse rounded bg-[var(--theme-dangerSoft)]"},null,-1))],64)):(g(),y("span",Gs,c(t(C)("diffReview.waitingStats")),1))])]),t(h)?(g(),y("p",qs,c(t(h)),1)):J("",!0),(xe=t(f).warnings)!=null&&xe.length?(g(),y("div",Ks,[(g(!0),y(ne,null,Se(t(f).warnings,x=>(g(),y("p",{key:x,class:"text-[11px] text-[var(--theme-warningText)]"},c(x),1))),128))])):J("",!0)]),t(ee)?(g(),y("div",Js,[a("div",Qs,[a("div",Xs,[a("button",{type:"button",class:D(["tool-button px-3 py-2 text-sm",M.value==="files"?"tool-button-accent-subtle":""]),onClick:v[5]||(v[5]=x=>M.value="files")},c(t(C)("diffReview.filesTab")),3),a("button",{type:"button",class:D(["tool-button px-3 py-2 text-sm",M.value==="patch"?"tool-button-accent-subtle":""]),disabled:!t(W),onClick:v[6]||(v[6]=x=>M.value="patch")},c(t(C)("diffReview.diffTab")),11,Ys)])]),De(a("div",Zs,[$(Oe,{"auto-focus-selected":e.active&&M.value==="files","diff-payload":t(f),"file-search":t(u),"focus-token":e.focusToken,"filtered-files":t(T),"get-filter-button-class":t(O),"get-filter-label":t(l),"get-status-class":t(L),"get-status-label":t(j),"selected-file-path":t(U),"show-summary-skeleton":t(Z),"status-counts":t(re),"status-filter":t(q),"onUpdate:fileSearch":v[7]||(v[7]=x=>u.value=x),"onUpdate:statusFilter":v[8]||(v[8]=x=>q.value=x),onSelectFile:he},null,8,["auto-focus-selected","diff-payload","file-search","focus-token","filtered-files","get-filter-button-class","get-filter-label","get-status-class","get-status-label","selected-file-path","show-summary-skeleton","status-counts","status-filter"])],512),[[Me,M.value==="files"]]),De(a("div",ea,[$(Ue,{"active-hunk-index":t(r),"get-patch-line-class":t(w),"get-status-class":t(L),"get-status-label":t(j),"jump-to-adjacent-hunk":t(p),"patch-loading":t(d),"selected-file":t(W),"selected-patch-hunks":t(B),"selected-patch-lines":t(G),"set-patch-line-ref":t(de),"set-patch-viewport-ref":me},null,8,["active-hunk-index","get-patch-line-class","get-status-class","get-status-label","jump-to-adjacent-hunk","patch-loading","selected-file","selected-patch-hunks","selected-patch-lines","set-patch-line-ref"])],512),[[Me,M.value==="patch"]])])):(g(),y("div",ta,[a("div",sa,[$(Oe,{"auto-focus-selected":e.active,"diff-payload":t(f),"file-search":t(u),"focus-token":e.focusToken,"filtered-files":t(T),"get-filter-button-class":t(O),"get-filter-label":t(l),"get-status-class":t(L),"get-status-label":t(j),"selected-file-path":t(U),"show-summary-skeleton":t(Z),"status-counts":t(re),"status-filter":t(q),"onUpdate:fileSearch":v[9]||(v[9]=x=>u.value=x),"onUpdate:statusFilter":v[10]||(v[10]=x=>q.value=x),onSelectFile:v[11]||(v[11]=x=>U.value=x)},null,8,["auto-focus-selected","diff-payload","file-search","focus-token","filtered-files","get-filter-button-class","get-filter-label","get-status-class","get-status-label","selected-file-path","show-summary-skeleton","status-counts","status-filter"])]),a("div",aa,[$(Ue,{"active-hunk-index":t(r),"get-patch-line-class":t(w),"get-status-class":t(L),"get-status-label":t(j),"jump-to-adjacent-hunk":t(p),"patch-loading":t(d),"selected-file":t(W),"selected-patch-hunks":t(B),"selected-patch-lines":t(G),"set-patch-line-ref":t(de),"set-patch-viewport-ref":me},null,8,["active-hunk-index","get-patch-line-class","get-status-class","get-status-label","jump-to-adjacent-hunk","patch-loading","selected-file","selected-patch-hunks","selected-patch-lines","set-patch-line-ref"])])]))])):J("",!0)])}}},ia={class:"theme-heading inline-flex items-center gap-2 text-sm font-medium"},ha={__name:"TaskDiffReviewDialog",props:{open:{type:Boolean,default:!1},taskSlug:{type:String,default:""},taskTitle:{type:String,default:""},preferredScope:{type:String,default:"task"},preferredRunId:{type:String,default:""},focusToken:{type:Number,default:0}},emits:["close"],setup(e,{emit:i}){const r=e,h=i,{t:f}=Re(),R=V(()=>{const b=String(r.taskTitle||"").trim();return b?f("diffReview.dialogTitleWithTask",{title:b}):f("diffReview.dialogTitle")});return(b,u)=>(g(),Ie(dt,{open:e.open,"stack-level":2,"panel-class":"settings-dialog-panel h-full sm:h-[90vh] sm:w-[90vw] sm:max-w-[90vw]","header-class":"settings-dialog-header px-5 py-4","body-class":"settings-dialog-body min-h-0 flex-1 overflow-hidden p-3 sm:p-4",onClose:u[0]||(u[0]=T=>h("close"))},{title:ue(()=>[a("div",ia,[$(t(Ke),{class:"h-4 w-4"}),a("span",null,c(R.value),1)])]),default:ue(()=>[$(na,{"task-slug":e.taskSlug,active:e.open,"preferred-scope":e.preferredScope,"preferred-run-id":e.preferredRunId,"focus-token":e.focusToken},null,8,["task-slug","active","preferred-scope","preferred-run-id","focus-token"])]),_:1},8,["open"]))}};export{ha as default};