codexmate 0.0.45 → 0.0.47

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.
@@ -1,5 +1,5 @@
1
1
  window.__CODEXMATE_WEB_UI_RENDER__ = (() => {
2
- const { toDisplayString: _toDisplayString, openBlock: _openBlock, createElementBlock: _createElementBlock, createCommentVNode: _createCommentVNode, createTextVNode: _createTextVNode, createElementVNode: _createElementVNode, normalizeClass: _normalizeClass, Fragment: _Fragment, renderList: _renderList, vShow: _vShow, withDirectives: _withDirectives, vModelSelect: _vModelSelect, vModelText: _vModelText, withKeys: _withKeys, withModifiers: _withModifiers, isMemoSame: _isMemoSame, withMemo: _withMemo, normalizeStyle: _normalizeStyle, vModelDynamic: _vModelDynamic, vModelCheckbox: _vModelCheckbox } = Vue
2
+ const { toDisplayString: _toDisplayString, openBlock: _openBlock, createElementBlock: _createElementBlock, createCommentVNode: _createCommentVNode, createTextVNode: _createTextVNode, createElementVNode: _createElementVNode, normalizeClass: _normalizeClass, Fragment: _Fragment, renderList: _renderList, vShow: _vShow, withDirectives: _withDirectives, vModelSelect: _vModelSelect, vModelText: _vModelText, withKeys: _withKeys, withModifiers: _withModifiers, vModelDynamic: _vModelDynamic, vModelCheckbox: _vModelCheckbox, isMemoSame: _isMemoSame, withMemo: _withMemo, normalizeStyle: _normalizeStyle } = Vue
3
3
 
4
4
  return function render(_ctx, _cache) {
5
5
  return (_openBlock(), _createElementBlock(_Fragment, null, [
@@ -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' : 'panel-config-provider'),
74
+ "aria-controls": _ctx.configMode === 'claude' ? 'panel-config-claude' : (_ctx.configMode === 'openclaw' ? 'panel-config-openclaw' : (_ctx.configMode === 'opencode' ? 'panel-config-opencode' : '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"]),
@@ -193,15 +193,7 @@ return function render(_ctx, _cache) {
193
193
  alt: "Codex Mate logo"
194
194
  }),
195
195
  _createElementVNode("div", { class: "brand-copy" }, [
196
- _createElementVNode("div", { class: "brand-kicker" }, [
197
- _createTextVNode("Codex Mate"),
198
- (_ctx.appVersion)
199
- ? (_openBlock(), _createElementBlock("span", {
200
- key: 0,
201
- class: "brand-version"
202
- }, " v" + _toDisplayString(_ctx.appVersion), 1 /* TEXT */))
203
- : _createCommentVNode("v-if", true)
204
- ])
196
+ _createElementVNode("div", { class: "brand-kicker" }, "Codex Mate")
205
197
  ])
206
198
  ]),
207
199
  (_ctx.isAppVersionStatusVisible())
@@ -319,6 +311,23 @@ return function render(_ctx, _cache) {
319
311
  ? (_openBlock(), _createElementBlock("span", { key: 0 }, _toDisplayString(_ctx.t('common.current', { value: _ctx.currentOpenclawConfig })), 1 /* TEXT */))
320
312
  : _createCommentVNode("v-if", true)
321
313
  ])
314
+ ], 42 /* CLASS, PROPS, NEED_HYDRATION */, ["aria-current", "onPointerdown", "onClick"]),
315
+ _createElementVNode("button", {
316
+ id: "side-tab-config-opencode",
317
+ "data-main-tab": "config",
318
+ "data-config-mode": "opencode",
319
+ "aria-current": _ctx.mainTab === 'config' && _ctx.configMode === 'opencode' ? 'page' : null,
320
+ class: _normalizeClass(['side-item', { active: _ctx.isConfigModeNavActive('opencode') }]),
321
+ onPointerdown: $event => (_ctx.onConfigTabPointerDown('opencode', $event)),
322
+ onClick: $event => (_ctx.onConfigTabClick('opencode', $event))
323
+ }, [
324
+ _createElementVNode("div", { class: "side-item-title" }, _toDisplayString(_ctx.t('side.config.opencode')), 1 /* TEXT */),
325
+ _createElementVNode("div", { class: "side-item-meta" }, [
326
+ _createElementVNode("span", null, _toDisplayString(_ctx.t('side.config.opencode.meta')), 1 /* TEXT */),
327
+ (_ctx.opencodeModel)
328
+ ? (_openBlock(), _createElementBlock("span", { key: 0 }, _toDisplayString(_ctx.t('common.current', { value: _ctx.opencodeModel })), 1 /* TEXT */))
329
+ : _createCommentVNode("v-if", true)
330
+ ])
322
331
  ], 42 /* CLASS, PROPS, NEED_HYDRATION */, ["aria-current", "onPointerdown", "onClick"])
323
332
  ], 8 /* PROPS */, ["aria-label"]),
324
333
  _createElementVNode("div", {
@@ -570,13 +579,28 @@ return function render(_ctx, _cache) {
570
579
  _createElementVNode("span", { class: "value" }, _toDisplayString(_ctx.openclawWorkspaceFileName || _ctx.t('common.notSelected')), 1 /* TEXT */)
571
580
  ])
572
581
  ], 64 /* STABLE_FRAGMENT */))
573
- : (_openBlock(), _createElementBlock("div", {
574
- key: 3,
575
- class: "status-chip"
576
- }, [
577
- _createElementVNode("span", { class: "label" }, _toDisplayString(_ctx.t('status.configMode')), 1 /* TEXT */),
578
- _createElementVNode("span", { class: "value" }, _toDisplayString(_ctx.t('common.notSelected')), 1 /* TEXT */)
579
- ]))
582
+ : (_ctx.configMode === 'opencode')
583
+ ? (_openBlock(), _createElementBlock(_Fragment, { key: 3 }, [
584
+ _createElementVNode("div", { class: "status-chip" }, [
585
+ _createElementVNode("span", { class: "label" }, _toDisplayString(_ctx.t('status.opencodeProvider')), 1 /* TEXT */),
586
+ _createElementVNode("span", { class: "value" }, _toDisplayString(_ctx.opencodeProvider || _ctx.t('common.notSelected')), 1 /* TEXT */)
587
+ ]),
588
+ _createElementVNode("div", { class: "status-chip" }, [
589
+ _createElementVNode("span", { class: "label" }, _toDisplayString(_ctx.t('status.opencodeModel')), 1 /* TEXT */),
590
+ _createElementVNode("span", { class: "value" }, _toDisplayString(_ctx.opencodeModel || _ctx.t('common.notSelected')), 1 /* TEXT */)
591
+ ]),
592
+ _createElementVNode("div", { class: "status-chip" }, [
593
+ _createElementVNode("span", { class: "label" }, _toDisplayString(_ctx.t('status.opencodeConfig')), 1 /* TEXT */),
594
+ _createElementVNode("span", { class: "value" }, _toDisplayString(_ctx.opencodeConfigPath || _ctx.t('common.notSelected')), 1 /* TEXT */)
595
+ ])
596
+ ], 64 /* STABLE_FRAGMENT */))
597
+ : (_openBlock(), _createElementBlock("div", {
598
+ key: 4,
599
+ class: "status-chip"
600
+ }, [
601
+ _createElementVNode("span", { class: "label" }, _toDisplayString(_ctx.t('status.configMode')), 1 /* TEXT */),
602
+ _createElementVNode("span", { class: "value" }, _toDisplayString(_ctx.t('common.notSelected')), 1 /* TEXT */)
603
+ ]))
580
604
  ]))
581
605
  : (!_ctx.sessionStandalone && _ctx.mainTab === 'sessions')
582
606
  ? (_openBlock(), _createElementBlock("div", {
@@ -1569,25 +1593,25 @@ return function render(_ctx, _cache) {
1569
1593
  ], 42 /* CLASS, PROPS, NEED_HYDRATION */, ["onClick", "onKeydown", "tabindex", "aria-current"]))
1570
1594
  }), 128 /* KEYED_FRAGMENT */))
1571
1595
  ]))
1596
+ : _createCommentVNode("v-if", true),
1597
+ (!_ctx.isToolConfigWriteAllowed('codex'))
1598
+ ? (_openBlock(), _createElementBlock("div", {
1599
+ key: 4,
1600
+ class: "tool-config-write-overlay"
1601
+ }, [
1602
+ _createElementVNode("div", { class: "tool-config-write-overlay-card" }, [
1603
+ _createElementVNode("div", { class: "tool-config-write-overlay-title" }, _toDisplayString(_ctx.t('toolConfig.codex.lockedTitle')), 1 /* TEXT */),
1604
+ _createElementVNode("p", null, _toDisplayString(_ctx.t('toolConfig.codex.lockedDesc')), 1 /* TEXT */),
1605
+ _createElementVNode("button", {
1606
+ type: "button",
1607
+ class: "btn-tool",
1608
+ onClick: $event => (_ctx.setToolConfigPermission('codex', true)),
1609
+ disabled: _ctx.toolConfigPermissionSaving.codex
1610
+ }, _toDisplayString(_ctx.t('toolConfig.enableWrite')), 9 /* TEXT, PROPS */, ["onClick", "disabled"])
1611
+ ])
1612
+ ]))
1572
1613
  : _createCommentVNode("v-if", true)
1573
- ]),
1574
- (!_ctx.isToolConfigWriteAllowed('codex'))
1575
- ? (_openBlock(), _createElementBlock("div", {
1576
- key: 0,
1577
- class: "tool-config-write-overlay"
1578
- }, [
1579
- _createElementVNode("div", { class: "tool-config-write-overlay-card" }, [
1580
- _createElementVNode("div", { class: "tool-config-write-overlay-title" }, _toDisplayString(_ctx.t('toolConfig.codex.lockedTitle')), 1 /* TEXT */),
1581
- _createElementVNode("p", null, _toDisplayString(_ctx.t('toolConfig.codex.lockedDesc')), 1 /* TEXT */),
1582
- _createElementVNode("button", {
1583
- type: "button",
1584
- class: "btn-tool",
1585
- onClick: $event => (_ctx.setToolConfigPermission('codex', true)),
1586
- disabled: _ctx.toolConfigPermissionSaving.codex
1587
- }, _toDisplayString(_ctx.t('toolConfig.enableWrite')), 9 /* TEXT, PROPS */, ["onClick", "disabled"])
1588
- ])
1589
- ]))
1590
- : _createCommentVNode("v-if", true)
1614
+ ])
1591
1615
  ], 2 /* CLASS */)
1592
1616
  ], 64 /* STABLE_FRAGMENT */))
1593
1617
  ], 8 /* PROPS */, ["aria-labelledby"]), [
@@ -2097,25 +2121,25 @@ return function render(_ctx, _cache) {
2097
2121
  ])
2098
2122
  ], 42 /* CLASS, PROPS, NEED_HYDRATION */, ["onClick", "onKeydown", "aria-current"]))
2099
2123
  }), 128 /* KEYED_FRAGMENT */))
2100
- ])
2101
- ]),
2102
- (!_ctx.isToolConfigWriteAllowed('claude'))
2103
- ? (_openBlock(), _createElementBlock("div", {
2104
- key: 0,
2105
- class: "tool-config-write-overlay"
2106
- }, [
2107
- _createElementVNode("div", { class: "tool-config-write-overlay-card" }, [
2108
- _createElementVNode("div", { class: "tool-config-write-overlay-title" }, _toDisplayString(_ctx.t('toolConfig.claude.lockedTitle')), 1 /* TEXT */),
2109
- _createElementVNode("p", null, _toDisplayString(_ctx.t('toolConfig.claude.lockedDesc')), 1 /* TEXT */),
2110
- _createElementVNode("button", {
2111
- type: "button",
2112
- class: "btn-tool",
2113
- onClick: $event => (_ctx.setToolConfigPermission('claude', true)),
2114
- disabled: _ctx.toolConfigPermissionSaving.claude
2115
- }, _toDisplayString(_ctx.t('toolConfig.enableWrite')), 9 /* TEXT, PROPS */, ["onClick", "disabled"])
2116
- ])
2117
- ]))
2118
- : _createCommentVNode("v-if", true)
2124
+ ]),
2125
+ (!_ctx.isToolConfigWriteAllowed('claude'))
2126
+ ? (_openBlock(), _createElementBlock("div", {
2127
+ key: 1,
2128
+ class: "tool-config-write-overlay"
2129
+ }, [
2130
+ _createElementVNode("div", { class: "tool-config-write-overlay-card" }, [
2131
+ _createElementVNode("div", { class: "tool-config-write-overlay-title" }, _toDisplayString(_ctx.t('toolConfig.claude.lockedTitle')), 1 /* TEXT */),
2132
+ _createElementVNode("p", null, _toDisplayString(_ctx.t('toolConfig.claude.lockedDesc')), 1 /* TEXT */),
2133
+ _createElementVNode("button", {
2134
+ type: "button",
2135
+ class: "btn-tool",
2136
+ onClick: $event => (_ctx.setToolConfigPermission('claude', true)),
2137
+ disabled: _ctx.toolConfigPermissionSaving.claude
2138
+ }, _toDisplayString(_ctx.t('toolConfig.enableWrite')), 9 /* TEXT, PROPS */, ["onClick", "disabled"])
2139
+ ])
2140
+ ]))
2141
+ : _createCommentVNode("v-if", true)
2142
+ ])
2119
2143
  ], 2 /* CLASS */)
2120
2144
  ], 64 /* STABLE_FRAGMENT */))
2121
2145
  ], 8 /* PROPS */, ["aria-labelledby"]), [
@@ -2280,6 +2304,394 @@ return function render(_ctx, _cache) {
2280
2304
  ], 8 /* PROPS */, ["aria-labelledby"]), [
2281
2305
  [_vShow, _ctx.mainTab === 'config' && _ctx.configMode === 'openclaw']
2282
2306
  ]),
2307
+ _createCommentVNode(" OpenCode 配置 "),
2308
+ _withDirectives(_createElementVNode("div", {
2309
+ class: "mode-content mode-cards",
2310
+ id: "panel-config-opencode",
2311
+ role: "tabpanel",
2312
+ "aria-labelledby": _ctx.forceCompactLayout ? 'tab-config' : 'side-tab-config-opencode'
2313
+ }, [
2314
+ (_ctx.forceCompactLayout && !_ctx.sessionStandalone)
2315
+ ? (_openBlock(), _createElementBlock("div", {
2316
+ key: 0,
2317
+ class: "segmented-control"
2318
+ }, [
2319
+ _createElementVNode("button", {
2320
+ type: "button",
2321
+ class: _normalizeClass(['segment', { active: _ctx.configMode === 'codex' }]),
2322
+ onClick: $event => (_ctx.switchConfigMode('codex'))
2323
+ }, _toDisplayString(_ctx.t('tab.config.codex')), 11 /* TEXT, CLASS, PROPS */, ["onClick"]),
2324
+ _createElementVNode("button", {
2325
+ type: "button",
2326
+ class: _normalizeClass(['segment', { active: _ctx.configMode === 'claude' }]),
2327
+ onClick: $event => (_ctx.switchConfigMode('claude'))
2328
+ }, _toDisplayString(_ctx.t('tab.config.claude')), 11 /* TEXT, CLASS, PROPS */, ["onClick"]),
2329
+ _createElementVNode("button", {
2330
+ type: "button",
2331
+ class: _normalizeClass(['segment', { active: _ctx.configMode === 'openclaw' }]),
2332
+ onClick: $event => (_ctx.switchConfigMode('openclaw'))
2333
+ }, _toDisplayString(_ctx.t('tab.config.openclaw')), 11 /* TEXT, CLASS, PROPS */, ["onClick"]),
2334
+ _createElementVNode("button", {
2335
+ type: "button",
2336
+ class: _normalizeClass(['segment', { active: _ctx.configMode === 'opencode' }]),
2337
+ onClick: $event => (_ctx.switchConfigMode('opencode'))
2338
+ }, _toDisplayString(_ctx.t('tab.config.opencode')), 11 /* TEXT, CLASS, PROPS */, ["onClick"])
2339
+ ]))
2340
+ : _createCommentVNode("v-if", true),
2341
+ _createElementVNode("section", {
2342
+ class: "tool-config-write-card",
2343
+ "aria-label": _ctx.t('opencode.writeAria')
2344
+ }, [
2345
+ _createElementVNode("div", { class: "tool-config-write-copy" }, [
2346
+ _createElementVNode("div", { class: "tool-config-write-title" }, _toDisplayString(_ctx.t('toolConfig.opencode.title')), 1 /* TEXT */),
2347
+ _createElementVNode("p", { class: "tool-config-write-desc" }, _toDisplayString(_ctx.t('toolConfig.opencode.desc')), 1 /* TEXT */)
2348
+ ]),
2349
+ _createElementVNode("label", { class: "settings-toggle-row tool-config-write-toggle" }, [
2350
+ _createElementVNode("input", {
2351
+ type: "checkbox",
2352
+ autocomplete: "off",
2353
+ checked: _ctx.isToolConfigWriteAllowed('opencode'),
2354
+ disabled: _ctx.toolConfigPermissionSaving.opencode,
2355
+ onChange: $event => (_ctx.setToolConfigPermission('opencode', $event.target.checked))
2356
+ }, null, 40 /* PROPS, NEED_HYDRATION */, ["checked", "disabled", "onChange"]),
2357
+ _createElementVNode("span", { class: "toggle-track" }, [
2358
+ _createElementVNode("span", { class: "toggle-thumb" })
2359
+ ]),
2360
+ _createElementVNode("span", null, _toDisplayString(_ctx.toolConfigPermissionStatusLabel('opencode')), 1 /* TEXT */)
2361
+ ])
2362
+ ], 8 /* PROPS */, ["aria-label"]),
2363
+ _createElementVNode("div", {
2364
+ class: _normalizeClass(["tool-config-write-scope", { locked: !_ctx.isToolConfigWriteAllowed('opencode') }])
2365
+ }, [
2366
+ _createElementVNode("div", { class: "tool-config-write-body" }, [
2367
+ _createElementVNode("section", { class: "selector-section" }, [
2368
+ _createElementVNode("div", { class: "selector-header" }, [
2369
+ _createElementVNode("span", { class: "selector-title" }, _toDisplayString(_ctx.t('opencode.providerModel.title')), 1 /* TEXT */),
2370
+ _createElementVNode("div", { class: "selector-actions opencode-provider-actions" }, [
2371
+ _createElementVNode("button", {
2372
+ type: "button",
2373
+ class: "btn-tool btn-tool-compact",
2374
+ onClick: $event => (_ctx.loadOpencodeConfig({ toast: true })),
2375
+ disabled: _ctx.opencodeLoading
2376
+ }, _toDisplayString(_ctx.opencodeLoading ? _ctx.t('common.refreshing') : _ctx.t('common.refresh')), 9 /* TEXT, PROPS */, ["onClick", "disabled"]),
2377
+ _createElementVNode("button", {
2378
+ type: "button",
2379
+ class: "btn-tool btn-tool-compact",
2380
+ onClick: _ctx.applyOpencodeSelection,
2381
+ disabled: _ctx.opencodeApplying || _ctx.opencodeLoading || !_ctx.isToolConfigWriteAllowed('opencode')
2382
+ }, _toDisplayString(_ctx.opencodeApplying ? _ctx.t('common.applying') : _ctx.t('opencode.applySelection')), 9 /* TEXT, PROPS */, ["onClick", "disabled"])
2383
+ ])
2384
+ ]),
2385
+ _createElementVNode("div", { class: "config-template-hint" }, _toDisplayString(_ctx.t('opencode.targetFile', { path: _ctx.opencodeConfigPath || '~/.config/opencode/opencode.jsonc', status: _ctx.opencodeConfigExists ? _ctx.t('common.exists') : _ctx.t('common.notExistsWillCreateOnSave') })), 1 /* TEXT */),
2386
+ _createElementVNode("div", { class: "config-template-hint" }, _toDisplayString(_ctx.t('opencode.providerStoreFile', { path: _ctx.opencodeProviderStorePath || '~/.codexmate/opencode/providers.json' })), 1 /* TEXT */),
2387
+ _createElementVNode("div", { class: "codex-config-grid" }, [
2388
+ _createElementVNode("div", { class: "form-group codex-config-field" }, [
2389
+ _createElementVNode("label", {
2390
+ class: "form-label",
2391
+ for: "opencode-provider"
2392
+ }, _toDisplayString(_ctx.t('field.provider')), 1 /* TEXT */),
2393
+ _withDirectives(_createElementVNode("input", {
2394
+ id: "opencode-provider",
2395
+ class: "form-input",
2396
+ "onUpdate:modelValue": $event => ((_ctx.opencodeProvider) = $event),
2397
+ list: "opencode-provider-options",
2398
+ autocomplete: "off",
2399
+ spellcheck: "false",
2400
+ onChange: $event => (_ctx.fillOpencodeProvider(_ctx.opencodeProvider)),
2401
+ onBlur: $event => (_ctx.fillOpencodeProvider(_ctx.opencodeProvider)),
2402
+ placeholder: "anthropic / openai / gemini"
2403
+ }, null, 40 /* PROPS, NEED_HYDRATION */, ["onUpdate:modelValue", "onChange", "onBlur"]), [
2404
+ [_vModelText, _ctx.opencodeProvider]
2405
+ ]),
2406
+ _createElementVNode("datalist", { id: "opencode-provider-options" }, [
2407
+ (_openBlock(true), _createElementBlock(_Fragment, null, _renderList(_ctx.opencodeProviderCatalog(), (provider) => {
2408
+ return (_openBlock(), _createElementBlock("option", {
2409
+ key: provider,
2410
+ value: provider
2411
+ }, null, 8 /* PROPS */, ["value"]))
2412
+ }), 128 /* KEYED_FRAGMENT */))
2413
+ ])
2414
+ ]),
2415
+ _createElementVNode("div", { class: "form-group codex-config-field" }, [
2416
+ _createElementVNode("label", {
2417
+ class: "form-label",
2418
+ for: "opencode-model"
2419
+ }, _toDisplayString(_ctx.t('field.model')), 1 /* TEXT */),
2420
+ _withDirectives(_createElementVNode("input", {
2421
+ id: "opencode-model",
2422
+ class: "form-input",
2423
+ "onUpdate:modelValue": $event => ((_ctx.opencodeModel) = $event),
2424
+ list: "opencode-model-options",
2425
+ autocomplete: "off",
2426
+ spellcheck: "false",
2427
+ placeholder: "claude-3.7-sonnet / gpt-4.1"
2428
+ }, null, 8 /* PROPS */, ["onUpdate:modelValue"]), [
2429
+ [_vModelText, _ctx.opencodeModel]
2430
+ ]),
2431
+ _createElementVNode("datalist", { id: "opencode-model-options" }, [
2432
+ (_openBlock(true), _createElementBlock(_Fragment, null, _renderList(_ctx.opencodeModelCatalogForProvider(_ctx.opencodeProvider), (model) => {
2433
+ return (_openBlock(), _createElementBlock("option", {
2434
+ key: model,
2435
+ value: model
2436
+ }, null, 8 /* PROPS */, ["value"]))
2437
+ }), 128 /* KEYED_FRAGMENT */))
2438
+ ])
2439
+ ]),
2440
+ _createElementVNode("div", { class: "form-group codex-config-field" }, [
2441
+ _createElementVNode("label", {
2442
+ class: "form-label",
2443
+ for: "opencode-agent"
2444
+ }, _toDisplayString(_ctx.t('opencode.field.agent')), 1 /* TEXT */),
2445
+ _withDirectives(_createElementVNode("input", {
2446
+ id: "opencode-agent",
2447
+ class: "form-input",
2448
+ "onUpdate:modelValue": $event => ((_ctx.opencodeAgent) = $event),
2449
+ list: "opencode-agent-options",
2450
+ autocomplete: "off",
2451
+ spellcheck: "false",
2452
+ placeholder: "build"
2453
+ }, null, 8 /* PROPS */, ["onUpdate:modelValue"]), [
2454
+ [_vModelText, _ctx.opencodeAgent]
2455
+ ]),
2456
+ _createElementVNode("datalist", { id: "opencode-agent-options" }, [
2457
+ _createElementVNode("option", { value: "build" }),
2458
+ _createElementVNode("option", { value: "plan" }),
2459
+ _createElementVNode("option", { value: "general" }),
2460
+ _createElementVNode("option", { value: "summary" }),
2461
+ _createElementVNode("option", { value: "compaction" }),
2462
+ _createElementVNode("option", { value: "title" }),
2463
+ (_openBlock(true), _createElementBlock(_Fragment, null, _renderList(_ctx.opencodeAgents, (agent) => {
2464
+ return (_openBlock(), _createElementBlock("option", {
2465
+ key: agent.name,
2466
+ value: agent.name
2467
+ }, null, 8 /* PROPS */, ["value"]))
2468
+ }), 128 /* KEYED_FRAGMENT */))
2469
+ ])
2470
+ ]),
2471
+ _createElementVNode("div", { class: "form-group codex-config-field" }, [
2472
+ _createElementVNode("label", {
2473
+ class: "form-label",
2474
+ for: "opencode-api-key"
2475
+ }, _toDisplayString(_ctx.t('opencode.field.apiKeyKeep')), 1 /* TEXT */),
2476
+ _createElementVNode("div", { class: "input-with-toggle" }, [
2477
+ _withDirectives(_createElementVNode("input", {
2478
+ id: "opencode-api-key",
2479
+ class: "form-input",
2480
+ "onUpdate:modelValue": $event => ((_ctx.opencodeApiKey) = $event),
2481
+ type: _ctx.opencodeShowKey ? 'text' : 'password',
2482
+ autocomplete: "off",
2483
+ spellcheck: "false",
2484
+ placeholder: "sk-..."
2485
+ }, null, 8 /* PROPS */, ["onUpdate:modelValue", "type"]), [
2486
+ [_vModelDynamic, _ctx.opencodeApiKey]
2487
+ ]),
2488
+ _createElementVNode("button", {
2489
+ type: "button",
2490
+ class: "input-toggle-btn",
2491
+ onClick: $event => (_ctx.opencodeShowKey = !_ctx.opencodeShowKey),
2492
+ title: _ctx.opencodeShowKey ? _ctx.t('common.hide') : _ctx.t('common.show')
2493
+ }, _toDisplayString(_ctx.opencodeShowKey ? _ctx.t('common.hide') : _ctx.t('common.show')), 9 /* TEXT, PROPS */, ["onClick", "title"])
2494
+ ])
2495
+ ]),
2496
+ _createElementVNode("div", { class: "form-group codex-config-field" }, [
2497
+ _createElementVNode("label", {
2498
+ class: "form-label",
2499
+ for: "opencode-max-tokens"
2500
+ }, _toDisplayString(_ctx.t('opencode.field.maxTokens')), 1 /* TEXT */),
2501
+ _withDirectives(_createElementVNode("input", {
2502
+ id: "opencode-max-tokens",
2503
+ class: "form-input",
2504
+ "onUpdate:modelValue": $event => ((_ctx.opencodeMaxTokens) = $event),
2505
+ inputmode: "numeric",
2506
+ autocomplete: "off",
2507
+ placeholder: "5000"
2508
+ }, null, 8 /* PROPS */, ["onUpdate:modelValue"]), [
2509
+ [_vModelText, _ctx.opencodeMaxTokens]
2510
+ ])
2511
+ ]),
2512
+ _createElementVNode("div", { class: "form-group codex-config-field" }, [
2513
+ _createElementVNode("label", {
2514
+ class: "form-label",
2515
+ for: "opencode-reasoning-effort"
2516
+ }, _toDisplayString(_ctx.t('opencode.field.reasoningEffort')), 1 /* TEXT */),
2517
+ _withDirectives(_createElementVNode("select", {
2518
+ id: "opencode-reasoning-effort",
2519
+ class: "model-select",
2520
+ "onUpdate:modelValue": $event => ((_ctx.opencodeReasoningEffort) = $event)
2521
+ }, [
2522
+ _createElementVNode("option", { value: "" }, _toDisplayString(_ctx.t('opencode.option.keepUnchanged')), 1 /* TEXT */),
2523
+ _createElementVNode("option", { value: "low" }, _toDisplayString(_ctx.t('opencode.option.reasoningLow')), 1 /* TEXT */),
2524
+ _createElementVNode("option", { value: "medium" }, _toDisplayString(_ctx.t('opencode.option.reasoningMedium')), 1 /* TEXT */),
2525
+ _createElementVNode("option", { value: "high" }, _toDisplayString(_ctx.t('opencode.option.reasoningHigh')), 1 /* TEXT */)
2526
+ ], 8 /* PROPS */, ["onUpdate:modelValue"]), [
2527
+ [_vModelSelect, _ctx.opencodeReasoningEffort]
2528
+ ])
2529
+ ])
2530
+ ]),
2531
+ _createElementVNode("label", {
2532
+ class: "settings-toggle-row",
2533
+ style: {"margin-top":"12px"}
2534
+ }, [
2535
+ _withDirectives(_createElementVNode("input", {
2536
+ type: "checkbox",
2537
+ "onUpdate:modelValue": $event => ((_ctx.opencodeApplyToCoreAgents) = $event)
2538
+ }, null, 8 /* PROPS */, ["onUpdate:modelValue"]), [
2539
+ [_vModelCheckbox, _ctx.opencodeApplyToCoreAgents]
2540
+ ]),
2541
+ _createElementVNode("span", { class: "toggle-track" }, [
2542
+ _createElementVNode("span", { class: "toggle-thumb" })
2543
+ ]),
2544
+ _createElementVNode("span", null, _toDisplayString(_ctx.t('opencode.applyToCoreAgents')), 1 /* TEXT */)
2545
+ ]),
2546
+ _createElementVNode("label", {
2547
+ class: "settings-toggle-row",
2548
+ style: {"margin-top":"8px"}
2549
+ }, [
2550
+ _withDirectives(_createElementVNode("input", {
2551
+ type: "checkbox",
2552
+ "onUpdate:modelValue": $event => ((_ctx.opencodeAutoCompact) = $event)
2553
+ }, null, 8 /* PROPS */, ["onUpdate:modelValue"]), [
2554
+ [_vModelCheckbox, _ctx.opencodeAutoCompact]
2555
+ ]),
2556
+ _createElementVNode("span", { class: "toggle-track" }, [
2557
+ _createElementVNode("span", { class: "toggle-thumb" })
2558
+ ]),
2559
+ _createElementVNode("span", null, _toDisplayString(_ctx.t('opencode.enableAutoCompaction')), 1 /* TEXT */)
2560
+ ]),
2561
+ _createElementVNode("label", {
2562
+ class: "settings-toggle-row",
2563
+ style: {"margin-top":"8px"}
2564
+ }, [
2565
+ _withDirectives(_createElementVNode("input", {
2566
+ type: "checkbox",
2567
+ "onUpdate:modelValue": $event => ((_ctx.opencodeProviderDisabled) = $event)
2568
+ }, null, 8 /* PROPS */, ["onUpdate:modelValue"]), [
2569
+ [_vModelCheckbox, _ctx.opencodeProviderDisabled]
2570
+ ]),
2571
+ _createElementVNode("span", { class: "toggle-track" }, [
2572
+ _createElementVNode("span", { class: "toggle-thumb" })
2573
+ ]),
2574
+ _createElementVNode("span", null, _toDisplayString(_ctx.t('opencode.disableProvider')), 1 /* TEXT */)
2575
+ ])
2576
+ ]),
2577
+ _createElementVNode("section", { class: "selector-section" }, [
2578
+ _createElementVNode("div", { class: "selector-header" }, [
2579
+ _createElementVNode("span", { class: "selector-title" }, _toDisplayString(_ctx.t('opencode.configFile.title')), 1 /* TEXT */),
2580
+ _createElementVNode("div", { class: "selector-actions" }, [
2581
+ _createElementVNode("button", {
2582
+ type: "button",
2583
+ class: "btn-tool btn-tool-compact",
2584
+ onClick: $event => (_ctx.$refs.opencodeImportInput && _ctx.$refs.opencodeImportInput.click())
2585
+ }, _toDisplayString(_ctx.t('opencode.importParse')), 9 /* TEXT, PROPS */, ["onClick"]),
2586
+ _createElementVNode("button", {
2587
+ type: "button",
2588
+ class: "btn-tool btn-tool-compact",
2589
+ onClick: _ctx.saveOpencodeConfig,
2590
+ disabled: _ctx.opencodeSaving || _ctx.opencodeLoading || !_ctx.isToolConfigWriteAllowed('opencode')
2591
+ }, _toDisplayString(_ctx.opencodeSaving ? _ctx.t('common.saving') : _ctx.t('opencode.saveConfig')), 9 /* TEXT, PROPS */, ["onClick", "disabled"])
2592
+ ])
2593
+ ]),
2594
+ _createElementVNode("input", {
2595
+ ref: "opencodeImportInput",
2596
+ class: "sr-only",
2597
+ type: "file",
2598
+ accept: ".json,.jsonc,.opencode",
2599
+ onChange: _ctx.handleOpencodeImportChange
2600
+ }, null, 40 /* PROPS, NEED_HYDRATION */, ["onChange"]),
2601
+ (_ctx.opencodeImportFileName)
2602
+ ? (_openBlock(), _createElementBlock("div", {
2603
+ key: 0,
2604
+ class: "config-template-hint"
2605
+ }, _toDisplayString(_ctx.t('opencode.parsedFile', { file: _ctx.opencodeImportFileName })), 1 /* TEXT */))
2606
+ : _createCommentVNode("v-if", true),
2607
+ (_ctx.opencodeError || _ctx.opencodeImportError)
2608
+ ? (_openBlock(), _createElementBlock("div", {
2609
+ key: 1,
2610
+ class: "config-template-hint error-text"
2611
+ }, _toDisplayString(_ctx.opencodeError || _ctx.opencodeImportError), 1 /* TEXT */))
2612
+ : _createCommentVNode("v-if", true),
2613
+ _withDirectives(_createElementVNode("textarea", {
2614
+ class: "template-textarea",
2615
+ "onUpdate:modelValue": $event => ((_ctx.opencodeContent) = $event),
2616
+ spellcheck: "false",
2617
+ readonly: _ctx.opencodeSaving || _ctx.opencodeLoading,
2618
+ placeholder: _ctx.t('opencode.textarea.placeholder')
2619
+ }, null, 8 /* PROPS */, ["onUpdate:modelValue", "readonly", "placeholder"]), [
2620
+ [_vModelText, _ctx.opencodeContent]
2621
+ ]),
2622
+ _createElementVNode("div", { class: "config-template-hint" }, _toDisplayString(_ctx.t('opencode.configFile.hint')), 1 /* TEXT */)
2623
+ ]),
2624
+ (_ctx.opencodeProviders.length || _ctx.opencodeAgents.length)
2625
+ ? (_openBlock(), _createElementBlock("section", {
2626
+ key: 0,
2627
+ class: "selector-section"
2628
+ }, [
2629
+ _createElementVNode("div", { class: "selector-header" }, [
2630
+ _createElementVNode("span", { class: "selector-title" }, _toDisplayString(_ctx.t('opencode.summary.title')), 1 /* TEXT */)
2631
+ ]),
2632
+ _createElementVNode("div", { class: "card-list" }, [
2633
+ (_openBlock(true), _createElementBlock(_Fragment, null, _renderList(_ctx.opencodeProviders, (provider) => {
2634
+ return (_openBlock(), _createElementBlock("div", {
2635
+ key: provider.name,
2636
+ class: "card"
2637
+ }, [
2638
+ _createElementVNode("div", { class: "card-leading" }, [
2639
+ _createElementVNode("div", { class: "card-icon" }, _toDisplayString(provider.name.charAt(0).toUpperCase()), 1 /* TEXT */),
2640
+ _createElementVNode("div", { class: "card-content" }, [
2641
+ _createElementVNode("div", { class: "card-title" }, _toDisplayString(provider.name), 1 /* TEXT */),
2642
+ _createElementVNode("div", { class: "card-subtitle" }, _toDisplayString(provider.hasKey ? provider.apiKey : _ctx.t('opencode.summary.noApiKey')), 1 /* TEXT */)
2643
+ ])
2644
+ ]),
2645
+ _createElementVNode("div", { class: "card-trailing" }, [
2646
+ _createElementVNode("span", {
2647
+ class: _normalizeClass(['pill', provider.disabled ? 'empty' : 'configured'])
2648
+ }, _toDisplayString(provider.disabled ? _ctx.t('common.disabled') : _ctx.t('common.enabled')), 3 /* TEXT, CLASS */),
2649
+ _createElementVNode("span", { class: "pill empty" }, _toDisplayString(provider.source === 'codexmate' ? _ctx.t('opencode.summary.sourceCodexMate') : _ctx.t('opencode.summary.sourceOpenCode')), 1 /* TEXT */)
2650
+ ])
2651
+ ]))
2652
+ }), 128 /* KEYED_FRAGMENT */)),
2653
+ (_openBlock(true), _createElementBlock(_Fragment, null, _renderList(_ctx.opencodeAgents, (agent) => {
2654
+ return (_openBlock(), _createElementBlock("div", {
2655
+ key: agent.name,
2656
+ class: "card"
2657
+ }, [
2658
+ _createElementVNode("div", { class: "card-leading" }, [
2659
+ _createElementVNode("div", { class: "card-icon" }, "A"),
2660
+ _createElementVNode("div", { class: "card-content" }, [
2661
+ _createElementVNode("div", { class: "card-title" }, _toDisplayString(agent.name), 1 /* TEXT */),
2662
+ _createElementVNode("div", { class: "card-subtitle" }, _toDisplayString(agent.model || _ctx.t('opencode.summary.noModel')), 1 /* TEXT */)
2663
+ ])
2664
+ ]),
2665
+ _createElementVNode("div", { class: "card-trailing" }, [
2666
+ _createElementVNode("span", { class: "pill configured" }, _toDisplayString(_ctx.t('opencode.summary.agentType')), 1 /* TEXT */)
2667
+ ])
2668
+ ]))
2669
+ }), 128 /* KEYED_FRAGMENT */))
2670
+ ])
2671
+ ]))
2672
+ : _createCommentVNode("v-if", true),
2673
+ (!_ctx.isToolConfigWriteAllowed('opencode'))
2674
+ ? (_openBlock(), _createElementBlock("div", {
2675
+ key: 1,
2676
+ class: "tool-config-write-overlay"
2677
+ }, [
2678
+ _createElementVNode("div", { class: "tool-config-write-overlay-card" }, [
2679
+ _createElementVNode("div", { class: "tool-config-write-overlay-title" }, _toDisplayString(_ctx.t('toolConfig.opencode.lockedTitle')), 1 /* TEXT */),
2680
+ _createElementVNode("p", null, _toDisplayString(_ctx.t('toolConfig.opencode.lockedDesc')), 1 /* TEXT */),
2681
+ _createElementVNode("button", {
2682
+ type: "button",
2683
+ class: "btn-tool",
2684
+ onClick: $event => (_ctx.setToolConfigPermission('opencode', true)),
2685
+ disabled: _ctx.toolConfigPermissionSaving.opencode
2686
+ }, _toDisplayString(_ctx.t('toolConfig.enableWrite')), 9 /* TEXT, PROPS */, ["onClick", "disabled"])
2687
+ ])
2688
+ ]))
2689
+ : _createCommentVNode("v-if", true)
2690
+ ])
2691
+ ], 2 /* CLASS */)
2692
+ ], 8 /* PROPS */, ["aria-labelledby"]), [
2693
+ [_vShow, _ctx.mainTab === 'config' && _ctx.configMode === 'opencode']
2694
+ ]),
2283
2695
  _createCommentVNode(" 会话浏览模式 "),
2284
2696
  _withDirectives(_createElementVNode("div", {
2285
2697
  class: "mode-content",