codexmate 0.1.1 → 0.1.3

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 (38) hide show
  1. package/README.md +6 -3
  2. package/cli/openai-bridge-retry.js +17 -9
  3. package/cli/openai-bridge-runtime.js +14 -1
  4. package/cli/openai-bridge.js +20 -10
  5. package/cli.js +375 -4
  6. package/package.json +1 -1
  7. package/web-ui/app.js +18 -4
  8. package/web-ui/index.html +1 -0
  9. package/web-ui/modules/app.computed.dashboard.mjs +14 -0
  10. package/web-ui/modules/app.methods.agents.mjs +2 -2
  11. package/web-ui/modules/app.methods.index.mjs +2 -0
  12. package/web-ui/modules/app.methods.install.mjs +14 -0
  13. package/web-ui/modules/app.methods.kilocode-config.mjs +164 -0
  14. package/web-ui/modules/app.methods.navigation.mjs +12 -0
  15. package/web-ui/modules/app.methods.openclaw-core.mjs +87 -0
  16. package/web-ui/modules/app.methods.providers.mjs +5 -32
  17. package/web-ui/modules/app.methods.startup-claude.mjs +2 -1
  18. package/web-ui/modules/app.methods.tool-config-permissions.mjs +3 -2
  19. package/web-ui/modules/app.methods.web-ui-preferences.mjs +2 -1
  20. package/web-ui/modules/config-mode.computed.mjs +11 -1
  21. package/web-ui/modules/i18n/locales/en.mjs +31 -4
  22. package/web-ui/modules/i18n/locales/ja.mjs +34 -8
  23. package/web-ui/modules/i18n/locales/vi.mjs +35 -9
  24. package/web-ui/modules/i18n/locales/zh-tw.mjs +36 -9
  25. package/web-ui/modules/i18n/locales/zh.mjs +40 -13
  26. package/web-ui/partials/index/layout-header.html +32 -21
  27. package/web-ui/partials/index/modal-config-template-agents.html +8 -4
  28. package/web-ui/partials/index/modals-basic.html +0 -26
  29. package/web-ui/partials/index/panel-config-kilocode.html +101 -0
  30. package/web-ui/partials/index/panel-config-openclaw.html +42 -14
  31. package/web-ui/partials/index/panel-config-opencode.html +1 -0
  32. package/web-ui/partials/index/panel-docs.html +17 -1
  33. package/web-ui/res/web-ui-render.precompiled.js +400 -123
  34. package/web-ui/styles/controls-forms.css +10 -0
  35. package/web-ui/styles/docs-panel.css +51 -0
  36. package/web-ui/styles/layout-shell.css +12 -0
  37. package/web-ui/styles/modals-core.css +79 -0
  38. package/web-ui/styles/openclaw-structured.css +117 -71
@@ -71,7 +71,7 @@ return function render(_ctx, _cache) {
71
71
  "data-config-mode": _ctx.configMode,
72
72
  tabindex: _ctx.mainTab === 'config' ? 0 : -1,
73
73
  "aria-selected": _ctx.mainTab === 'config',
74
- "aria-controls": _ctx.configMode === 'claude' ? 'panel-config-claude' : (_ctx.configMode === 'openclaw' ? 'panel-config-openclaw' : (_ctx.configMode === 'opencode' ? 'panel-config-opencode' : 'panel-config-provider')),
74
+ "aria-controls": _ctx.configMode === 'claude' ? 'panel-config-claude' : (_ctx.configMode === 'openclaw' ? 'panel-config-openclaw' : (_ctx.configMode === 'opencode' ? 'panel-config-opencode' : (_ctx.configMode === 'kilocode' ? 'panel-config-kilocode' : 'panel-config-provider'))),
75
75
  onPointerdown: $event => (_ctx.onMainTabPointerDown('config', $event)),
76
76
  onClick: $event => (_ctx.onMainTabClick('config', $event))
77
77
  }, _toDisplayString(_ctx.t('tab.config')), 43 /* TEXT, CLASS, PROPS, NEED_HYDRATION */, ["data-config-mode", "tabindex", "aria-selected", "aria-controls", "onPointerdown", "onClick"]),
@@ -284,7 +284,7 @@ return function render(_ctx, _cache) {
284
284
  "data-main-tab": "config",
285
285
  "data-config-mode": "codex",
286
286
  "aria-current": _ctx.mainTab === 'config' && _ctx.configMode === 'codex' ? 'page' : null,
287
- class: _normalizeClass(['side-item', { active: _ctx.isConfigModeNavActive('codex') }]),
287
+ class: _normalizeClass(['side-item', 'side-item-compact', { active: _ctx.isConfigModeNavActive('codex') }]),
288
288
  onPointerdown: $event => (_ctx.onConfigTabPointerDown('codex', $event)),
289
289
  onClick: $event => (_ctx.onConfigTabClick('codex', $event))
290
290
  }, [
@@ -294,10 +294,7 @@ return function render(_ctx, _cache) {
294
294
  }, "C"),
295
295
  _createElementVNode("div", { class: "side-item-title" }, _toDisplayString(_ctx.t('side.config.codex')), 1 /* TEXT */),
296
296
  _createElementVNode("div", { class: "side-item-meta" }, [
297
- _createElementVNode("span", null, _toDisplayString(_ctx.t('side.config.codex.meta')), 1 /* TEXT */),
298
- (_ctx.currentProvider)
299
- ? (_openBlock(), _createElementBlock("span", { key: 0 }, _toDisplayString(_ctx.t('common.current', { value: _ctx.currentProvider })), 1 /* TEXT */))
300
- : _createCommentVNode("v-if", true)
297
+ _createElementVNode("span", null, _toDisplayString(_ctx.t('side.config.codex.meta')), 1 /* TEXT */)
301
298
  ])
302
299
  ], 42 /* CLASS, PROPS, NEED_HYDRATION */, ["aria-current", "onPointerdown", "onClick"]),
303
300
  _createElementVNode("button", {
@@ -305,7 +302,7 @@ return function render(_ctx, _cache) {
305
302
  "data-main-tab": "config",
306
303
  "data-config-mode": "claude",
307
304
  "aria-current": _ctx.mainTab === 'config' && _ctx.configMode === 'claude' ? 'page' : null,
308
- class: _normalizeClass(['side-item', { active: _ctx.isConfigModeNavActive('claude') }]),
305
+ class: _normalizeClass(['side-item', 'side-item-compact', { active: _ctx.isConfigModeNavActive('claude') }]),
309
306
  onPointerdown: $event => (_ctx.onConfigTabPointerDown('claude', $event)),
310
307
  onClick: $event => (_ctx.onConfigTabClick('claude', $event))
311
308
  }, [
@@ -315,10 +312,7 @@ return function render(_ctx, _cache) {
315
312
  }, "A"),
316
313
  _createElementVNode("div", { class: "side-item-title" }, _toDisplayString(_ctx.t('side.config.claude')), 1 /* TEXT */),
317
314
  _createElementVNode("div", { class: "side-item-meta" }, [
318
- _createElementVNode("span", null, _toDisplayString(_ctx.t('side.config.claude.meta')), 1 /* TEXT */),
319
- (_ctx.currentClaudeConfig)
320
- ? (_openBlock(), _createElementBlock("span", { key: 0 }, _toDisplayString(_ctx.t('common.current', { value: _ctx.currentClaudeConfig })), 1 /* TEXT */))
321
- : _createCommentVNode("v-if", true)
315
+ _createElementVNode("span", null, _toDisplayString(_ctx.t('side.config.claude.meta')), 1 /* TEXT */)
322
316
  ])
323
317
  ], 42 /* CLASS, PROPS, NEED_HYDRATION */, ["aria-current", "onPointerdown", "onClick"]),
324
318
  _createElementVNode("button", {
@@ -326,7 +320,7 @@ return function render(_ctx, _cache) {
326
320
  "data-main-tab": "config",
327
321
  "data-config-mode": "openclaw",
328
322
  "aria-current": _ctx.mainTab === 'config' && _ctx.configMode === 'openclaw' ? 'page' : null,
329
- class: _normalizeClass(['side-item', { active: _ctx.isConfigModeNavActive('openclaw') }]),
323
+ class: _normalizeClass(['side-item', 'side-item-compact', { active: _ctx.isConfigModeNavActive('openclaw') }]),
330
324
  onPointerdown: $event => (_ctx.onConfigTabPointerDown('openclaw', $event)),
331
325
  onClick: $event => (_ctx.onConfigTabClick('openclaw', $event))
332
326
  }, [
@@ -336,10 +330,7 @@ return function render(_ctx, _cache) {
336
330
  }, "O"),
337
331
  _createElementVNode("div", { class: "side-item-title" }, _toDisplayString(_ctx.t('side.config.openclaw')), 1 /* TEXT */),
338
332
  _createElementVNode("div", { class: "side-item-meta" }, [
339
- _createElementVNode("span", null, _toDisplayString(_ctx.t('side.config.openclaw.meta')), 1 /* TEXT */),
340
- (_ctx.currentOpenclawConfig)
341
- ? (_openBlock(), _createElementBlock("span", { key: 0 }, _toDisplayString(_ctx.t('common.current', { value: _ctx.currentOpenclawConfig })), 1 /* TEXT */))
342
- : _createCommentVNode("v-if", true)
333
+ _createElementVNode("span", null, _toDisplayString(_ctx.t('side.config.openclaw.meta')), 1 /* TEXT */)
343
334
  ])
344
335
  ], 42 /* CLASS, PROPS, NEED_HYDRATION */, ["aria-current", "onPointerdown", "onClick"]),
345
336
  _createElementVNode("button", {
@@ -347,7 +338,7 @@ return function render(_ctx, _cache) {
347
338
  "data-main-tab": "config",
348
339
  "data-config-mode": "opencode",
349
340
  "aria-current": _ctx.mainTab === 'config' && _ctx.configMode === 'opencode' ? 'page' : null,
350
- class: _normalizeClass(['side-item', { active: _ctx.isConfigModeNavActive('opencode') }]),
341
+ class: _normalizeClass(['side-item', 'side-item-compact', { active: _ctx.isConfigModeNavActive('opencode') }]),
351
342
  onPointerdown: $event => (_ctx.onConfigTabPointerDown('opencode', $event)),
352
343
  onClick: $event => (_ctx.onConfigTabClick('opencode', $event))
353
344
  }, [
@@ -357,36 +348,34 @@ return function render(_ctx, _cache) {
357
348
  }, "N"),
358
349
  _createElementVNode("div", { class: "side-item-title" }, _toDisplayString(_ctx.t('side.config.opencode')), 1 /* TEXT */),
359
350
  _createElementVNode("div", { class: "side-item-meta" }, [
360
- _createElementVNode("span", null, _toDisplayString(_ctx.t('side.config.opencode.meta')), 1 /* TEXT */),
361
- (_ctx.opencodeModel)
362
- ? (_openBlock(), _createElementBlock("span", { key: 0 }, _toDisplayString(_ctx.t('common.current', { value: _ctx.opencodeModel })), 1 /* TEXT */))
363
- : _createCommentVNode("v-if", true)
351
+ _createElementVNode("span", null, _toDisplayString(_ctx.t('side.config.opencode.meta')), 1 /* TEXT */)
364
352
  ])
365
353
  ], 42 /* CLASS, PROPS, NEED_HYDRATION */, ["aria-current", "onPointerdown", "onClick"]),
366
354
  _createElementVNode("button", {
367
- id: "side-tab-prompts",
368
- "data-main-tab": "prompts",
369
- "aria-current": _ctx.mainTab === 'prompts' ? 'page' : null,
370
- class: _normalizeClass(['side-item', { active: _ctx.isMainTabNavActive('prompts') }]),
371
- onPointerdown: $event => (_ctx.onMainTabPointerDown('prompts', $event)),
372
- onClick: $event => (_ctx.onMainTabClick('prompts', $event))
355
+ id: "side-tab-config-kilocode",
356
+ "data-main-tab": "config",
357
+ "data-config-mode": "kilocode",
358
+ "aria-current": _ctx.mainTab === 'config' && _ctx.configMode === 'kilocode' ? 'page' : null,
359
+ class: _normalizeClass(['side-item', 'side-item-compact', { active: _ctx.isConfigModeNavActive('kilocode') }]),
360
+ onPointerdown: $event => (_ctx.onConfigTabPointerDown('kilocode', $event)),
361
+ onClick: $event => (_ctx.onConfigTabClick('kilocode', $event))
373
362
  }, [
374
363
  _createElementVNode("span", {
375
364
  class: "side-item-icon",
376
365
  "aria-hidden": "true"
377
- }, "P"),
378
- _createElementVNode("div", { class: "side-item-title" }, _toDisplayString(_ctx.t('side.prompts')), 1 /* TEXT */),
366
+ }, "K"),
367
+ _createElementVNode("div", { class: "side-item-title" }, _toDisplayString(_ctx.t('side.config.kilocode')), 1 /* TEXT */),
379
368
  _createElementVNode("div", { class: "side-item-meta" }, [
380
- _createElementVNode("span", null, _toDisplayString(_ctx.t('side.prompts.meta')), 1 /* TEXT */)
369
+ _createElementVNode("span", null, _toDisplayString(_ctx.t('side.config.kilocode.meta')), 1 /* TEXT */)
381
370
  ])
382
371
  ], 42 /* CLASS, PROPS, NEED_HYDRATION */, ["aria-current", "onPointerdown", "onClick"])
383
372
  ], 8 /* PROPS */, ["aria-label"]),
384
373
  _createElementVNode("div", {
385
374
  class: "side-section",
386
375
  role: "navigation",
387
- "aria-label": _ctx.t('side.sessions')
376
+ "aria-label": _ctx.t('side.workspace')
388
377
  }, [
389
- _createElementVNode("div", { class: "side-section-title" }, _toDisplayString(_ctx.t('side.sessions')), 1 /* TEXT */),
378
+ _createElementVNode("div", { class: "side-section-title" }, _toDisplayString(_ctx.t('side.workspace')), 1 /* TEXT */),
390
379
  _createElementVNode("button", {
391
380
  id: "side-tab-sessions",
392
381
  "data-main-tab": "sessions",
@@ -405,6 +394,23 @@ return function render(_ctx, _cache) {
405
394
  _createElementVNode("span", null, _toDisplayString(_ctx.t('sessions.sourceLabel', { value: (_ctx.sessionFilterSource === 'all' ? _ctx.t('sessions.source.all') : (_ctx.sessionFilterSource === 'claude' ? 'Claude Code' : (_ctx.sessionFilterSource === 'gemini' ? 'Gemini CLI' : (_ctx.sessionFilterSource === 'codebuddy' ? 'CodeBuddy Code' : 'Codex')))) })), 1 /* TEXT */)
406
395
  ])
407
396
  ], 42 /* CLASS, PROPS, NEED_HYDRATION */, ["aria-current", "onPointerdown", "onClick"]),
397
+ _createElementVNode("button", {
398
+ id: "side-tab-prompts",
399
+ "data-main-tab": "prompts",
400
+ "aria-current": _ctx.mainTab === 'prompts' ? 'page' : null,
401
+ class: _normalizeClass(['side-item', { active: _ctx.isMainTabNavActive('prompts') }]),
402
+ onPointerdown: $event => (_ctx.onMainTabPointerDown('prompts', $event)),
403
+ onClick: $event => (_ctx.onMainTabClick('prompts', $event))
404
+ }, [
405
+ _createElementVNode("span", {
406
+ class: "side-item-icon",
407
+ "aria-hidden": "true"
408
+ }, "P"),
409
+ _createElementVNode("div", { class: "side-item-title" }, _toDisplayString(_ctx.t('side.prompts')), 1 /* TEXT */),
410
+ _createElementVNode("div", { class: "side-item-meta" }, [
411
+ _createElementVNode("span", null, _toDisplayString(_ctx.t('side.prompts.meta')), 1 /* TEXT */)
412
+ ])
413
+ ], 42 /* CLASS, PROPS, NEED_HYDRATION */, ["aria-current", "onPointerdown", "onClick"]),
408
414
  _createElementVNode("button", {
409
415
  id: "side-tab-usage",
410
416
  "data-main-tab": "usage",
@@ -2243,6 +2249,32 @@ return function render(_ctx, _cache) {
2243
2249
  ]))
2244
2250
  : _createCommentVNode("v-if", true),
2245
2251
  _createElementVNode("div", { class: "openclaw-layout" }, [
2252
+ _createElementVNode("section", {
2253
+ class: "settings-card settings-card--wide openclaw-summary-card",
2254
+ "aria-label": "OpenClaw 当前摘要"
2255
+ }, [
2256
+ _createElementVNode("div", { class: "settings-card-body" }, [
2257
+ _createElementVNode("div", { class: "openclaw-summary-header" }, [
2258
+ _createElementVNode("div", null, [
2259
+ _createElementVNode("div", { class: "summary-eyebrow" }, "OPENCLAW"),
2260
+ _createElementVNode("div", { class: "summary-title" }, "配置与本地诊断")
2261
+ ]),
2262
+ _createElementVNode("div", { class: "summary-note" }, "配置摘要")
2263
+ ]),
2264
+ _createElementVNode("div", { class: "openclaw-summary-grid" }, [
2265
+ (_openBlock(true), _createElementBlock(_Fragment, null, _renderList(_ctx.getOpenclawStatusSummaryItems(), (item) => {
2266
+ return (_openBlock(), _createElementBlock("div", {
2267
+ key: item.key,
2268
+ class: _normalizeClass(['openclaw-summary-item', item.tone || ''])
2269
+ }, [
2270
+ _createElementVNode("div", { class: "summary-item-label" }, _toDisplayString(item.label), 1 /* TEXT */),
2271
+ _createElementVNode("div", { class: "summary-item-value" }, _toDisplayString(item.value), 1 /* TEXT */)
2272
+ ], 2 /* CLASS */))
2273
+ }), 128 /* KEYED_FRAGMENT */))
2274
+ ]),
2275
+ _createElementVNode("div", { class: "openclaw-diagnostic-note" }, " 本页仅管理配置与工作区文件。 ")
2276
+ ])
2277
+ ]),
2246
2278
  _createElementVNode("section", { class: "settings-card settings-card--wide openclaw-workspace-card" }, [
2247
2279
  _createElementVNode("div", { class: "settings-card-body" }, [
2248
2280
  _createElementVNode("div", { class: "openclaw-tools-grid" }, [
@@ -2254,7 +2286,7 @@ return function render(_ctx, _cache) {
2254
2286
  _createElementVNode("div", { class: "tool-icon" }, "📄"),
2255
2287
  _createElementVNode("div", { class: "tool-content" }, [
2256
2288
  _createElementVNode("div", { class: "tool-title" }, "AGENTS.md"),
2257
- _createElementVNode("div", { class: "tool-meta" }, _toDisplayString(_ctx.agentsLoading ? _ctx.t('config.modelLoading') : _ctx.t('openclaw.agents.hint')), 1 /* TEXT */)
2289
+ _createElementVNode("div", { class: "tool-meta" }, _toDisplayString(_ctx.agentsLoading ? _ctx.t('config.modelLoading') : 'Workspace file'), 1 /* TEXT */)
2258
2290
  ]),
2259
2291
  (_openBlock(), _createElementBlock("svg", {
2260
2292
  class: "tool-chevron",
@@ -2266,28 +2298,30 @@ return function render(_ctx, _cache) {
2266
2298
  _createElementVNode("path", { d: "M9 18l6-6-6-6" })
2267
2299
  ]))
2268
2300
  ], 8 /* PROPS */, ["onClick", "disabled"]),
2269
- _createElementVNode("div", { class: "openclaw-workspace-card" }, [
2270
- _createElementVNode("label", {
2271
- class: "workspace-label",
2272
- for: "openclaw-workspace-file"
2273
- }, _toDisplayString(_ctx.t('openclaw.workspaceFile')), 1 /* TEXT */),
2274
- _createElementVNode("div", { class: "workspace-input-group" }, [
2275
- _withDirectives(_createElementVNode("input", {
2276
- id: "openclaw-workspace-file",
2277
- class: "form-input",
2278
- "onUpdate:modelValue": $event => ((_ctx.openclawWorkspaceFileName) = $event),
2279
- placeholder: _ctx.t('openclaw.workspace.placeholder')
2280
- }, null, 8 /* PROPS */, ["onUpdate:modelValue", "placeholder"]), [
2281
- [_vModelText, _ctx.openclawWorkspaceFileName]
2301
+ (_openBlock(true), _createElementBlock(_Fragment, null, _renderList(_ctx.getOpenclawQuickWorkspaceFiles(), (fileName) => {
2302
+ return (_openBlock(), _createElementBlock("button", {
2303
+ key: fileName,
2304
+ type: "button",
2305
+ class: "openclaw-tool-btn",
2306
+ onClick: $event => (_ctx.openOpenclawQuickWorkspaceFile(fileName)),
2307
+ disabled: _ctx.loading || !!_ctx.initError || _ctx.agentsLoading
2308
+ }, [
2309
+ _createElementVNode("div", { class: "tool-icon" }, "📄"),
2310
+ _createElementVNode("div", { class: "tool-content" }, [
2311
+ _createElementVNode("div", { class: "tool-title" }, _toDisplayString(fileName), 1 /* TEXT */),
2312
+ _createElementVNode("div", { class: "tool-meta" }, "Workspace file")
2282
2313
  ]),
2283
- _createElementVNode("button", {
2284
- class: "btn-tool",
2285
- onClick: _ctx.openOpenclawWorkspaceEditor,
2286
- disabled: _ctx.loading || !!_ctx.initError || _ctx.agentsLoading
2287
- }, _toDisplayString(_ctx.agentsLoading ? _ctx.t('config.modelLoading') : _ctx.t('openclaw.workspace.open')), 9 /* TEXT, PROPS */, ["onClick", "disabled"])
2288
- ]),
2289
- _createElementVNode("div", { class: "workspace-meta" }, _toDisplayString(_ctx.t('openclaw.workspace.hint')), 1 /* TEXT */)
2290
- ])
2314
+ (_openBlock(), _createElementBlock("svg", {
2315
+ class: "tool-chevron",
2316
+ viewBox: "0 0 24 24",
2317
+ fill: "none",
2318
+ stroke: "currentColor",
2319
+ "stroke-width": "2"
2320
+ }, [
2321
+ _createElementVNode("path", { d: "M9 18l6-6-6-6" })
2322
+ ]))
2323
+ ], 8 /* PROPS */, ["onClick", "disabled"]))
2324
+ }), 128 /* KEYED_FRAGMENT */))
2291
2325
  ])
2292
2326
  ])
2293
2327
  ]),
@@ -2315,7 +2349,19 @@ return function render(_ctx, _cache) {
2315
2349
  _createElementVNode("div", { class: "card-icon" }, _toDisplayString(name.charAt(0).toUpperCase()), 1 /* TEXT */),
2316
2350
  _createElementVNode("div", { class: "card-content" }, [
2317
2351
  _createElementVNode("div", { class: "card-title" }, _toDisplayString(name), 1 /* TEXT */),
2318
- _createElementVNode("div", { class: "card-subtitle" }, _toDisplayString(_ctx.openclawSubtitle(config)), 1 /* TEXT */)
2352
+ _createElementVNode("div", { class: "card-subtitle" }, _toDisplayString(_ctx.openclawSubtitle(config)), 1 /* TEXT */),
2353
+ (_ctx.openclawHasContent(config))
2354
+ ? (_openBlock(), _createElementBlock("div", {
2355
+ key: 0,
2356
+ class: "openclaw-config-summary-mini"
2357
+ }, [
2358
+ (_openBlock(true), _createElementBlock(_Fragment, null, _renderList(_ctx.getOpenclawConfigSummary(config).slice(0, 3), (item) => {
2359
+ return (_openBlock(), _createElementBlock("span", {
2360
+ key: item.key
2361
+ }, _toDisplayString(item.label) + ": " + _toDisplayString(item.value), 1 /* TEXT */))
2362
+ }), 128 /* KEYED_FRAGMENT */))
2363
+ ]))
2364
+ : _createCommentVNode("v-if", true)
2319
2365
  ])
2320
2366
  ]),
2321
2367
  _createElementVNode("div", { class: "card-trailing" }, [
@@ -2403,7 +2449,12 @@ return function render(_ctx, _cache) {
2403
2449
  type: "button",
2404
2450
  class: _normalizeClass(['segment', { active: _ctx.configMode === 'opencode' }]),
2405
2451
  onClick: $event => (_ctx.switchConfigMode('opencode'))
2406
- }, _toDisplayString(_ctx.t('tab.config.opencode')), 11 /* TEXT, CLASS, PROPS */, ["onClick"])
2452
+ }, _toDisplayString(_ctx.t('tab.config.opencode')), 11 /* TEXT, CLASS, PROPS */, ["onClick"]),
2453
+ _createElementVNode("button", {
2454
+ type: "button",
2455
+ class: _normalizeClass(['segment', { active: _ctx.configMode === 'kilocode' }]),
2456
+ onClick: $event => (_ctx.switchConfigMode('kilocode'))
2457
+ }, _toDisplayString(_ctx.t('tab.config.kilocode')), 11 /* TEXT, CLASS, PROPS */, ["onClick"])
2407
2458
  ]))
2408
2459
  : _createCommentVNode("v-if", true),
2409
2460
  _createElementVNode("section", {
@@ -2760,6 +2811,265 @@ return function render(_ctx, _cache) {
2760
2811
  ], 8 /* PROPS */, ["aria-labelledby"]), [
2761
2812
  [_vShow, _ctx.mainTab === 'config' && _ctx.configMode === 'opencode']
2762
2813
  ]),
2814
+ _createCommentVNode(" KiloCode 配置 "),
2815
+ _withDirectives(_createElementVNode("div", {
2816
+ class: "mode-content mode-cards",
2817
+ id: "panel-config-kilocode",
2818
+ role: "tabpanel",
2819
+ "aria-labelledby": _ctx.forceCompactLayout ? 'tab-config' : 'side-tab-config-kilocode'
2820
+ }, [
2821
+ (_ctx.forceCompactLayout && !_ctx.sessionStandalone)
2822
+ ? (_openBlock(), _createElementBlock("div", {
2823
+ key: 0,
2824
+ class: "segmented-control"
2825
+ }, [
2826
+ _createElementVNode("button", {
2827
+ type: "button",
2828
+ class: _normalizeClass(['segment', { active: _ctx.configMode === 'codex' }]),
2829
+ onClick: $event => (_ctx.switchConfigMode('codex'))
2830
+ }, _toDisplayString(_ctx.t('tab.config.codex')), 11 /* TEXT, CLASS, PROPS */, ["onClick"]),
2831
+ _createElementVNode("button", {
2832
+ type: "button",
2833
+ class: _normalizeClass(['segment', { active: _ctx.configMode === 'claude' }]),
2834
+ onClick: $event => (_ctx.switchConfigMode('claude'))
2835
+ }, _toDisplayString(_ctx.t('tab.config.claude')), 11 /* TEXT, CLASS, PROPS */, ["onClick"]),
2836
+ _createElementVNode("button", {
2837
+ type: "button",
2838
+ class: _normalizeClass(['segment', { active: _ctx.configMode === 'openclaw' }]),
2839
+ onClick: $event => (_ctx.switchConfigMode('openclaw'))
2840
+ }, _toDisplayString(_ctx.t('tab.config.openclaw')), 11 /* TEXT, CLASS, PROPS */, ["onClick"]),
2841
+ _createElementVNode("button", {
2842
+ type: "button",
2843
+ class: _normalizeClass(['segment', { active: _ctx.configMode === 'opencode' }]),
2844
+ onClick: $event => (_ctx.switchConfigMode('opencode'))
2845
+ }, _toDisplayString(_ctx.t('tab.config.opencode')), 11 /* TEXT, CLASS, PROPS */, ["onClick"]),
2846
+ _createElementVNode("button", {
2847
+ type: "button",
2848
+ class: _normalizeClass(['segment', { active: _ctx.configMode === 'kilocode' }]),
2849
+ onClick: $event => (_ctx.switchConfigMode('kilocode'))
2850
+ }, _toDisplayString(_ctx.t('tab.config.kilocode')), 11 /* TEXT, CLASS, PROPS */, ["onClick"])
2851
+ ]))
2852
+ : _createCommentVNode("v-if", true),
2853
+ _createElementVNode("section", {
2854
+ class: "tool-config-write-card",
2855
+ "aria-label": _ctx.t('toolConfig.kilocode.title')
2856
+ }, [
2857
+ _createElementVNode("div", { class: "tool-config-write-copy" }, [
2858
+ _createElementVNode("div", { class: "tool-config-write-title" }, _toDisplayString(_ctx.t('toolConfig.kilocode.title')), 1 /* TEXT */),
2859
+ _createElementVNode("p", { class: "tool-config-write-desc" }, _toDisplayString(_ctx.t('toolConfig.kilocode.desc')), 1 /* TEXT */)
2860
+ ]),
2861
+ _createElementVNode("label", { class: "settings-toggle-row tool-config-write-toggle" }, [
2862
+ _createElementVNode("input", {
2863
+ type: "checkbox",
2864
+ autocomplete: "off",
2865
+ checked: _ctx.isToolConfigWriteAllowed('kilocode'),
2866
+ disabled: _ctx.toolConfigPermissionSaving.kilocode,
2867
+ onChange: $event => (_ctx.setToolConfigPermission('kilocode', $event.target.checked))
2868
+ }, null, 40 /* PROPS, NEED_HYDRATION */, ["checked", "disabled", "onChange"]),
2869
+ _createElementVNode("span", { class: "toggle-track" }, [
2870
+ _createElementVNode("span", { class: "toggle-thumb" })
2871
+ ]),
2872
+ _createElementVNode("span", null, _toDisplayString(_ctx.toolConfigPermissionStatusLabel('kilocode')), 1 /* TEXT */)
2873
+ ])
2874
+ ], 8 /* PROPS */, ["aria-label"]),
2875
+ _createElementVNode("div", {
2876
+ class: _normalizeClass(["tool-config-write-scope", { locked: !_ctx.isToolConfigWriteAllowed('kilocode') }])
2877
+ }, [
2878
+ _createElementVNode("div", { class: "tool-config-write-body" }, [
2879
+ _createElementVNode("section", { class: "selector-section" }, [
2880
+ _createElementVNode("div", { class: "selector-header" }, [
2881
+ _createElementVNode("span", { class: "selector-title" }, _toDisplayString(_ctx.t('kilocode.providerModel.title')), 1 /* TEXT */)
2882
+ ]),
2883
+ _createElementVNode("div", { class: "config-template-hint" }, _toDisplayString(_ctx.t('kilocode.targetFile', { path: _ctx.kilocodeConfigPath || '~/.config/kilo/kilo.jsonc', status: _ctx.kilocodeConfigExists ? _ctx.t('common.exists') : _ctx.t('common.notExistsWillCreateOnSave') })), 1 /* TEXT */),
2884
+ _createElementVNode("div", { class: "codex-config-grid" }, [
2885
+ _createElementVNode("div", { class: "form-group codex-config-field" }, [
2886
+ _createElementVNode("label", {
2887
+ class: "form-label",
2888
+ for: "kilocode-provider"
2889
+ }, _toDisplayString(_ctx.t('field.provider')), 1 /* TEXT */),
2890
+ _withDirectives(_createElementVNode("input", {
2891
+ id: "kilocode-provider",
2892
+ class: "form-input",
2893
+ "onUpdate:modelValue": $event => ((_ctx.kilocodeProvider) = $event),
2894
+ autocomplete: "off",
2895
+ spellcheck: "false",
2896
+ placeholder: "codexmate",
2897
+ onBlur: _ctx.autoSaveKilocodeConfig
2898
+ }, null, 40 /* PROPS, NEED_HYDRATION */, ["onUpdate:modelValue", "onBlur"]), [
2899
+ [_vModelText, _ctx.kilocodeProvider]
2900
+ ])
2901
+ ]),
2902
+ _createElementVNode("div", { class: "form-group codex-config-field" }, [
2903
+ _createElementVNode("label", {
2904
+ class: "form-label",
2905
+ for: "kilocode-base-url"
2906
+ }, _toDisplayString(_ctx.t('field.url')), 1 /* TEXT */),
2907
+ _withDirectives(_createElementVNode("input", {
2908
+ id: "kilocode-base-url",
2909
+ class: "form-input",
2910
+ "onUpdate:modelValue": $event => ((_ctx.kilocodeBaseUrl) = $event),
2911
+ autocomplete: "off",
2912
+ spellcheck: "false",
2913
+ placeholder: "https://api.example.com/v1",
2914
+ onBlur: _ctx.autoSaveKilocodeConfig
2915
+ }, null, 40 /* PROPS, NEED_HYDRATION */, ["onUpdate:modelValue", "onBlur"]), [
2916
+ [_vModelText, _ctx.kilocodeBaseUrl]
2917
+ ])
2918
+ ]),
2919
+ _createElementVNode("div", { class: "form-group codex-config-field" }, [
2920
+ _createElementVNode("label", {
2921
+ class: "form-label",
2922
+ for: "kilocode-model"
2923
+ }, _toDisplayString(_ctx.t('field.model')), 1 /* TEXT */),
2924
+ _withDirectives(_createElementVNode("input", {
2925
+ id: "kilocode-model",
2926
+ class: "form-input",
2927
+ "onUpdate:modelValue": $event => ((_ctx.kilocodeModel) = $event),
2928
+ autocomplete: "off",
2929
+ spellcheck: "false",
2930
+ placeholder: "gpt-5.3",
2931
+ onBlur: _ctx.autoSaveKilocodeConfig
2932
+ }, null, 40 /* PROPS, NEED_HYDRATION */, ["onUpdate:modelValue", "onBlur"]), [
2933
+ [_vModelText, _ctx.kilocodeModel]
2934
+ ])
2935
+ ]),
2936
+ _createElementVNode("div", { class: "form-group codex-config-field" }, [
2937
+ _createElementVNode("label", {
2938
+ class: "form-label",
2939
+ for: "kilocode-api-key"
2940
+ }, _toDisplayString(_ctx.t('opencode.field.apiKeyKeep')), 1 /* TEXT */),
2941
+ _createElementVNode("div", { class: "input-with-toggle" }, [
2942
+ _withDirectives(_createElementVNode("input", {
2943
+ id: "kilocode-api-key",
2944
+ class: "form-input",
2945
+ "onUpdate:modelValue": $event => ((_ctx.kilocodeApiKey) = $event),
2946
+ type: _ctx.kilocodeShowKey ? 'text' : 'password',
2947
+ autocomplete: "off",
2948
+ spellcheck: "false",
2949
+ placeholder: "sk-...",
2950
+ onBlur: _ctx.autoSaveKilocodeConfig
2951
+ }, null, 40 /* PROPS, NEED_HYDRATION */, ["onUpdate:modelValue", "type", "onBlur"]), [
2952
+ [_vModelDynamic, _ctx.kilocodeApiKey]
2953
+ ]),
2954
+ _createElementVNode("button", {
2955
+ type: "button",
2956
+ class: "input-toggle-btn",
2957
+ onMousedown: _withModifiers(() => {}, ["prevent"]),
2958
+ onClick: $event => (_ctx.kilocodeShowKey = !_ctx.kilocodeShowKey),
2959
+ title: _ctx.kilocodeShowKey ? _ctx.t('common.hide') : _ctx.t('common.show'),
2960
+ "aria-label": _ctx.kilocodeShowKey ? _ctx.t('common.hide') : _ctx.t('common.show')
2961
+ }, [
2962
+ (!_ctx.kilocodeShowKey)
2963
+ ? (_openBlock(), _createElementBlock("svg", {
2964
+ key: 0,
2965
+ viewBox: "0 0 20 20",
2966
+ fill: "none",
2967
+ stroke: "currentColor",
2968
+ "stroke-width": "1.5",
2969
+ width: "16",
2970
+ height: "16"
2971
+ }, [
2972
+ _createElementVNode("path", { d: "M10 4C5 4 1.73 8.11 1 10c.73 1.89 4 6 9 6s8.27-4.11 9-6c-.73-1.89-4-6-9-6z" }),
2973
+ _createElementVNode("circle", {
2974
+ cx: "10",
2975
+ cy: "10",
2976
+ r: "3"
2977
+ })
2978
+ ]))
2979
+ : (_openBlock(), _createElementBlock("svg", {
2980
+ key: 1,
2981
+ viewBox: "0 0 20 20",
2982
+ fill: "none",
2983
+ stroke: "currentColor",
2984
+ "stroke-width": "1.5",
2985
+ width: "16",
2986
+ height: "16"
2987
+ }, [
2988
+ _createElementVNode("path", { d: "M2 2l16 16M8.2 4.2A9.9 9.9 0 0 1 10 4c5 0 8.27 4.11 9 6-.44.94-1.5 2.7-3.2 4.2M14.5 14.5A5.9 5.9 0 0 1 10 16c-5 0-8.27-4.11-9-6 .76-1.66 2.2-3.6 4.3-5" })
2989
+ ]))
2990
+ ], 40 /* PROPS, NEED_HYDRATION */, ["onMousedown", "onClick", "title", "aria-label"])
2991
+ ])
2992
+ ])
2993
+ ]),
2994
+ (_ctx.kilocodeError)
2995
+ ? (_openBlock(), _createElementBlock("div", {
2996
+ key: 0,
2997
+ class: "config-template-hint error-text"
2998
+ }, _toDisplayString(_ctx.kilocodeError), 1 /* TEXT */))
2999
+ : _createCommentVNode("v-if", true)
3000
+ ]),
3001
+ (_ctx.kilocodeProviders.length)
3002
+ ? (_openBlock(), _createElementBlock("section", {
3003
+ key: 0,
3004
+ class: "selector-section"
3005
+ }, [
3006
+ _createElementVNode("div", { class: "selector-header" }, [
3007
+ _createElementVNode("span", { class: "selector-title" }, _toDisplayString(_ctx.t('kilocode.summary.title')), 1 /* TEXT */)
3008
+ ]),
3009
+ _createElementVNode("div", { class: "card-list" }, [
3010
+ (_openBlock(true), _createElementBlock(_Fragment, null, _renderList(_ctx.kilocodeProviders, (provider) => {
3011
+ return (_openBlock(), _createElementBlock("div", {
3012
+ key: provider.name,
3013
+ class: _normalizeClass(['card', { active: _ctx.normalizeKilocodeProviderNameForUi(provider.name) === _ctx.normalizeKilocodeProviderNameForUi(_ctx.kilocodeProvider) }]),
3014
+ onDblclick: $event => (_ctx.selectKilocodeProvider(provider)),
3015
+ onKeydown: _withKeys(_withModifiers($event => (_ctx.selectKilocodeProvider(provider)), ["self","prevent"]), ["enter"]),
3016
+ tabindex: "0",
3017
+ role: "button",
3018
+ "aria-current": _ctx.normalizeKilocodeProviderNameForUi(provider.name) === _ctx.normalizeKilocodeProviderNameForUi(_ctx.kilocodeProvider) ? 'true' : null
3019
+ }, [
3020
+ _createElementVNode("div", { class: "card-leading" }, [
3021
+ _createElementVNode("div", { class: "card-icon" }, _toDisplayString(provider.name.charAt(0).toUpperCase()), 1 /* TEXT */),
3022
+ _createElementVNode("div", { class: "card-content" }, [
3023
+ _createElementVNode("div", { class: "card-title" }, _toDisplayString(provider.name), 1 /* TEXT */),
3024
+ _createElementVNode("div", { class: "card-subtitle" }, _toDisplayString(provider.baseURL || provider.api || _ctx.t('config.url.unset')), 1 /* TEXT */),
3025
+ _createElementVNode("div", { class: "card-subtitle" }, _toDisplayString((provider.models || []).join(', ') || _ctx.t('opencode.summary.noModel')), 1 /* TEXT */)
3026
+ ])
3027
+ ]),
3028
+ _createElementVNode("div", { class: "card-trailing" }, [
3029
+ _createElementVNode("span", {
3030
+ class: _normalizeClass(['pill', provider.hasKey ? 'configured' : 'empty'])
3031
+ }, _toDisplayString(provider.hasKey ? _ctx.t('common.configured') : _ctx.t('common.notConfigured')), 3 /* TEXT, CLASS */)
3032
+ ])
3033
+ ], 42 /* CLASS, PROPS, NEED_HYDRATION */, ["onDblclick", "onKeydown", "aria-current"]))
3034
+ }), 128 /* KEYED_FRAGMENT */))
3035
+ ])
3036
+ ]))
3037
+ : _createCommentVNode("v-if", true),
3038
+ _createElementVNode("section", { class: "selector-section" }, [
3039
+ _createElementVNode("div", { class: "selector-header" }, [
3040
+ _createElementVNode("span", { class: "selector-title" }, _toDisplayString(_ctx.t('kilocode.configPreview.title')), 1 /* TEXT */)
3041
+ ]),
3042
+ _createElementVNode("textarea", {
3043
+ class: "template-textarea",
3044
+ value: _ctx.kilocodeContent,
3045
+ spellcheck: "false",
3046
+ readonly: "",
3047
+ "aria-readonly": "true"
3048
+ }, null, 8 /* PROPS */, ["value"]),
3049
+ _createElementVNode("div", { class: "config-template-hint" }, _toDisplayString(_ctx.t('kilocode.configPreview.hint')), 1 /* TEXT */)
3050
+ ]),
3051
+ (!_ctx.isToolConfigWriteAllowed('kilocode'))
3052
+ ? (_openBlock(), _createElementBlock("div", {
3053
+ key: 1,
3054
+ class: "tool-config-write-overlay"
3055
+ }, [
3056
+ _createElementVNode("div", { class: "tool-config-write-overlay-card" }, [
3057
+ _createElementVNode("div", { class: "tool-config-write-overlay-title" }, _toDisplayString(_ctx.t('toolConfig.kilocode.lockedTitle')), 1 /* TEXT */),
3058
+ _createElementVNode("p", null, _toDisplayString(_ctx.t('toolConfig.kilocode.lockedDesc')), 1 /* TEXT */),
3059
+ _createElementVNode("button", {
3060
+ type: "button",
3061
+ class: "btn-tool",
3062
+ onClick: $event => (_ctx.setToolConfigPermission('kilocode', true)),
3063
+ disabled: _ctx.toolConfigPermissionSaving.kilocode
3064
+ }, _toDisplayString(_ctx.t('toolConfig.enableWrite')), 9 /* TEXT, PROPS */, ["onClick", "disabled"])
3065
+ ])
3066
+ ]))
3067
+ : _createCommentVNode("v-if", true)
3068
+ ])
3069
+ ], 2 /* CLASS */)
3070
+ ], 8 /* PROPS */, ["aria-labelledby"]), [
3071
+ [_vShow, _ctx.mainTab === 'config' && _ctx.configMode === 'kilocode']
3072
+ ]),
2763
3073
  _createCommentVNode(" 会话浏览模式 "),
2764
3074
  _withDirectives(_createElementVNode("div", {
2765
3075
  class: "mode-content",
@@ -5204,6 +5514,31 @@ return function render(_ctx, _cache) {
5204
5514
  _createElementVNode("span", { class: "docs-summary-label" }, _toDisplayString(_ctx.t('common.registry')), 1 /* TEXT */),
5205
5515
  _createElementVNode("strong", { class: "docs-summary-value" }, _toDisplayString(_ctx.installRegistryPreview || 'npmmirror'), 1 /* TEXT */)
5206
5516
  ])
5517
+ ]),
5518
+ _createElementVNode("div", { class: "docs-installed-card" }, [
5519
+ _createElementVNode("div", { class: "docs-installed-head" }, [
5520
+ _createElementVNode("span", { class: "docs-installed-title" }, _toDisplayString(_ctx.t('docs.installed.title')), 1 /* TEXT */),
5521
+ _createElementVNode("span", { class: "docs-installed-count" }, _toDisplayString(_ctx.currentInstalledCommandCards.length ? _ctx.t('docs.installed.count', { count: _ctx.currentInstalledCommandCards.length }) : _ctx.t('docs.installed.empty')), 1 /* TEXT */)
5522
+ ]),
5523
+ (_ctx.currentInstalledCommandCards.length)
5524
+ ? (_openBlock(), _createElementBlock("div", {
5525
+ key: 0,
5526
+ class: "docs-installed-list"
5527
+ }, [
5528
+ (_openBlock(true), _createElementBlock(_Fragment, null, _renderList(_ctx.currentInstalledCommandCards, (target) => {
5529
+ return (_openBlock(), _createElementBlock("div", {
5530
+ key: 'docs-installed-' + target.id,
5531
+ class: "docs-installed-item"
5532
+ }, [
5533
+ _createElementVNode("div", { class: "docs-installed-main" }, [
5534
+ _createElementVNode("span", { class: "docs-installed-name" }, _toDisplayString(target.name), 1 /* TEXT */),
5535
+ _createElementVNode("span", { class: "docs-installed-version" }, _toDisplayString(target.version || '—'), 1 /* TEXT */)
5536
+ ]),
5537
+ _createElementVNode("code", { class: "docs-installed-command" }, _toDisplayString(target.commandPath || target.bin), 1 /* TEXT */)
5538
+ ]))
5539
+ }), 128 /* KEYED_FRAGMENT */))
5540
+ ]))
5541
+ : _createCommentVNode("v-if", true)
5207
5542
  ])
5208
5543
  ]),
5209
5544
  _createElementVNode("div", { class: "selector-section" }, [
@@ -7171,37 +7506,6 @@ return function render(_ctx, _cache) {
7171
7506
  _createTextVNode(" " + _toDisplayString(_ctx.t('field.useBuiltinTransform')), 1 /* TEXT */)
7172
7507
  ])
7173
7508
  ]),
7174
- (_ctx.newProvider.useTransform)
7175
- ? (_openBlock(), _createElementBlock("div", {
7176
- key: 0,
7177
- class: "form-group"
7178
- }, [
7179
- _createElementVNode("label", { class: "form-label" }, _toDisplayString(_ctx.t('field.transformMaxRetries')), 1 /* TEXT */),
7180
- _withDirectives(_createElementVNode("input", {
7181
- "onUpdate:modelValue": $event => ((_ctx.newProvider.openaiBridgeMaxRetries) = $event),
7182
- type: "number",
7183
- min: "2",
7184
- max: "10",
7185
- step: "1",
7186
- class: _normalizeClass(['form-input', { invalid: !!_ctx.providerFieldError('add', 'openaiBridgeMaxRetries') }]),
7187
- onBlur: $event => (_ctx.normalizeProviderDraft('add'))
7188
- }, null, 42 /* CLASS, PROPS, NEED_HYDRATION */, ["onUpdate:modelValue", "onBlur"]), [
7189
- [
7190
- _vModelText,
7191
- _ctx.newProvider.openaiBridgeMaxRetries,
7192
- void 0,
7193
- { number: true }
7194
- ]
7195
- ]),
7196
- _createElementVNode("div", { class: "form-hint" }, _toDisplayString(_ctx.t('hint.transformMaxRetries')), 1 /* TEXT */),
7197
- (_ctx.providerFieldError('add', 'openaiBridgeMaxRetries'))
7198
- ? (_openBlock(), _createElementBlock("div", {
7199
- key: 0,
7200
- class: "form-hint form-error"
7201
- }, _toDisplayString(_ctx.providerFieldError('add', 'openaiBridgeMaxRetries')), 1 /* TEXT */))
7202
- : _createCommentVNode("v-if", true)
7203
- ]))
7204
- : _createCommentVNode("v-if", true),
7205
7509
  _createElementVNode("div", { class: "btn-group" }, [
7206
7510
  _createElementVNode("button", {
7207
7511
  class: "btn btn-cancel",
@@ -7314,37 +7618,6 @@ return function render(_ctx, _cache) {
7314
7618
  ], 8 /* PROPS */, ["onClick", "title", "aria-label"])
7315
7619
  ])
7316
7620
  ]),
7317
- (_ctx.editingProvider.useTransform)
7318
- ? (_openBlock(), _createElementBlock("div", {
7319
- key: 0,
7320
- class: "form-group"
7321
- }, [
7322
- _createElementVNode("label", { class: "form-label" }, _toDisplayString(_ctx.t('field.transformMaxRetries')), 1 /* TEXT */),
7323
- _withDirectives(_createElementVNode("input", {
7324
- "onUpdate:modelValue": $event => ((_ctx.editingProvider.openaiBridgeMaxRetries) = $event),
7325
- type: "number",
7326
- min: "2",
7327
- max: "10",
7328
- step: "1",
7329
- class: _normalizeClass(['form-input', { invalid: !!_ctx.providerFieldError('edit', 'openaiBridgeMaxRetries') }]),
7330
- onBlur: $event => (_ctx.normalizeProviderDraft('edit'))
7331
- }, null, 42 /* CLASS, PROPS, NEED_HYDRATION */, ["onUpdate:modelValue", "onBlur"]), [
7332
- [
7333
- _vModelText,
7334
- _ctx.editingProvider.openaiBridgeMaxRetries,
7335
- void 0,
7336
- { number: true }
7337
- ]
7338
- ]),
7339
- _createElementVNode("div", { class: "form-hint" }, _toDisplayString(_ctx.t('hint.transformMaxRetries')), 1 /* TEXT */),
7340
- (_ctx.providerFieldError('edit', 'openaiBridgeMaxRetries'))
7341
- ? (_openBlock(), _createElementBlock("div", {
7342
- key: 0,
7343
- class: "form-hint form-error"
7344
- }, _toDisplayString(_ctx.providerFieldError('edit', 'openaiBridgeMaxRetries')), 1 /* TEXT */))
7345
- : _createCommentVNode("v-if", true)
7346
- ]))
7347
- : _createCommentVNode("v-if", true),
7348
7621
  _createElementVNode("div", { class: "btn-group" }, [
7349
7622
  _createElementVNode("button", {
7350
7623
  class: "btn btn-cancel",
@@ -9234,8 +9507,10 @@ return function render(_ctx, _cache) {
9234
9507
  }, _toDisplayString(_ctx.agentsSaving ? (_ctx.agentsDiffVisible ? _ctx.t('common.saving') : _ctx.t('common.previewing')) : (_ctx.agentsDiffVisible ? _ctx.t('common.save') : _ctx.t('common.preview'))), 9 /* TEXT, PROPS */, ["onClick", "disabled"])
9235
9508
  ])
9236
9509
  ]),
9237
- _createElementVNode("div", { class: "modal-editor-body" }, [
9238
- _createElementVNode("div", { class: "form-group" }, [
9510
+ _createElementVNode("div", {
9511
+ class: _normalizeClass(["modal-editor-body", { 'modal-editor-body--openclaw-workspace': _ctx.agentsContext === 'openclaw-workspace' }])
9512
+ }, [
9513
+ _createElementVNode("div", { class: "form-group agents-target-file-group" }, [
9239
9514
  _createElementVNode("label", { class: "form-label" }, _toDisplayString(_ctx.t('modal.agents.targetFile')), 1 /* TEXT */),
9240
9515
  _createElementVNode("div", { class: "form-hint" }, [
9241
9516
  _createTextVNode(_toDisplayString(_ctx.agentsPath || _ctx.t('common.notLoaded')) + " ", 1 /* TEXT */),
@@ -9244,8 +9519,10 @@ return function render(_ctx, _cache) {
9244
9519
  : _createCommentVNode("v-if", true)
9245
9520
  ])
9246
9521
  ]),
9247
- _createElementVNode("div", { class: "form-group" }, [
9248
- _createElementVNode("label", { class: "form-label" }, _toDisplayString(_ctx.t(_ctx.agentsContext === 'claude-project' ? 'modal.agents.contentLabel.claudeProject' : 'modal.agents.contentLabel')), 1 /* TEXT */),
9522
+ _createElementVNode("div", { class: "form-group agents-content-group" }, [
9523
+ _createElementVNode("label", { class: "form-label" }, _toDisplayString(_ctx.agentsContext === 'openclaw-workspace'
9524
+ ? `${_ctx.agentsWorkspaceFileName || '工作区文件'} 内容`
9525
+ : _ctx.t(_ctx.agentsContext === 'claude-project' ? 'modal.agents.contentLabel.claudeProject' : 'modal.agents.contentLabel')), 1 /* TEXT */),
9249
9526
  (!_ctx.agentsLoading && (_ctx.hasAgentsContentChanged() || _ctx.agentsDiffVisible))
9250
9527
  ? (_openBlock(), _createElementBlock("div", {
9251
9528
  key: 0,
@@ -9343,7 +9620,7 @@ return function render(_ctx, _cache) {
9343
9620
  }, _toDisplayString(_ctx.t('diff.viewHint.preview')), 1 /* TEXT */))
9344
9621
  ])
9345
9622
  ])
9346
- ])
9623
+ ], 2 /* CLASS */)
9347
9624
  ])
9348
9625
  ], 8 /* PROPS */, ["onClick"]))
9349
9626
  : _createCommentVNode("v-if", true),