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