codexmate 0.1.2 → 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.
@@ -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",
@@ -2443,7 +2449,12 @@ return function render(_ctx, _cache) {
2443
2449
  type: "button",
2444
2450
  class: _normalizeClass(['segment', { active: _ctx.configMode === 'opencode' }]),
2445
2451
  onClick: $event => (_ctx.switchConfigMode('opencode'))
2446
- }, _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"])
2447
2458
  ]))
2448
2459
  : _createCommentVNode("v-if", true),
2449
2460
  _createElementVNode("section", {
@@ -2800,6 +2811,265 @@ return function render(_ctx, _cache) {
2800
2811
  ], 8 /* PROPS */, ["aria-labelledby"]), [
2801
2812
  [_vShow, _ctx.mainTab === 'config' && _ctx.configMode === 'opencode']
2802
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
+ ]),
2803
3073
  _createCommentVNode(" 会话浏览模式 "),
2804
3074
  _withDirectives(_createElementVNode("div", {
2805
3075
  class: "mode-content",
@@ -5244,6 +5514,31 @@ return function render(_ctx, _cache) {
5244
5514
  _createElementVNode("span", { class: "docs-summary-label" }, _toDisplayString(_ctx.t('common.registry')), 1 /* TEXT */),
5245
5515
  _createElementVNode("strong", { class: "docs-summary-value" }, _toDisplayString(_ctx.installRegistryPreview || 'npmmirror'), 1 /* TEXT */)
5246
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)
5247
5542
  ])
5248
5543
  ]),
5249
5544
  _createElementVNode("div", { class: "selector-section" }, [
@@ -325,6 +325,16 @@
325
325
  box-shadow: var(--shadow-input-focus);
326
326
  }
327
327
 
328
+ .template-textarea[readonly] {
329
+ cursor: default;
330
+ }
331
+
332
+ .template-textarea[readonly]:focus {
333
+ background: rgba(255, 255, 255, 0.72);
334
+ border-color: var(--color-border);
335
+ box-shadow: var(--shadow-subtle);
336
+ }
337
+
328
338
  .codex-config-grid {
329
339
  display: grid;
330
340
  gap: 10px;
@@ -69,6 +69,57 @@
69
69
  word-break: break-word;
70
70
  }
71
71
 
72
+ .docs-installed-card {
73
+ margin-top: 12px;
74
+ padding: 12px;
75
+ border: 1px solid var(--color-border-soft);
76
+ border-radius: var(--radius-md);
77
+ background: var(--color-bg-soft);
78
+ }
79
+
80
+ .docs-installed-head,
81
+ .docs-installed-main {
82
+ display: flex;
83
+ align-items: center;
84
+ justify-content: space-between;
85
+ gap: 10px;
86
+ }
87
+
88
+ .docs-installed-title,
89
+ .docs-installed-name {
90
+ font-weight: 700;
91
+ color: var(--color-text-primary);
92
+ }
93
+
94
+ .docs-installed-count,
95
+ .docs-installed-version {
96
+ font-size: 12px;
97
+ color: var(--color-text-muted);
98
+ }
99
+
100
+ .docs-installed-list {
101
+ display: grid;
102
+ gap: 8px;
103
+ margin-top: 10px;
104
+ }
105
+
106
+ .docs-installed-item {
107
+ min-width: 0;
108
+ padding: 10px;
109
+ border-radius: var(--radius-sm);
110
+ background: var(--color-bg-card);
111
+ }
112
+
113
+ .docs-installed-command {
114
+ display: block;
115
+ margin-top: 6px;
116
+ overflow: hidden;
117
+ text-overflow: ellipsis;
118
+ white-space: nowrap;
119
+ font-size: 12px;
120
+ color: var(--color-text-secondary);
121
+ }
122
+
72
123
  /* ---- Install rows ---- */
73
124
  .docs-install-list {
74
125
  display: flex;
@@ -397,6 +397,17 @@ body::after {
397
397
  position: relative;
398
398
  }
399
399
 
400
+ .side-item-compact {
401
+ padding-top: 7px;
402
+ padding-bottom: 7px;
403
+ gap: 2px;
404
+ }
405
+
406
+ .side-item-compact::before {
407
+ height: 14px;
408
+ }
409
+
410
+
400
411
  .side-item-icon {
401
412
  display: none;
402
413
  width: 28px;