codexmate 0.1.27 → 0.1.29

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 (48) hide show
  1. package/README.md +53 -44
  2. package/README.vi.md +45 -36
  3. package/README.zh.md +51 -42
  4. package/cli/config-bootstrap.js +2 -9
  5. package/cli/session-usage.js +2 -2
  6. package/cli.js +407 -40
  7. package/package.json +1 -1
  8. package/web-ui/app.js +7 -0
  9. package/web-ui/index.html +12 -0
  10. package/web-ui/logic.sessions.mjs +6 -4
  11. package/web-ui/modules/app.computed.session.mjs +52 -33
  12. package/web-ui/modules/app.methods.agents.mjs +36 -0
  13. package/web-ui/modules/app.methods.codex-config.mjs +3 -1
  14. package/web-ui/modules/app.methods.index.mjs +2 -0
  15. package/web-ui/modules/app.methods.providers.mjs +12 -4
  16. package/web-ui/modules/app.methods.session-actions.mjs +10 -8
  17. package/web-ui/modules/app.methods.session-browser.mjs +3 -1
  18. package/web-ui/modules/app.methods.session-trash.mjs +16 -16
  19. package/web-ui/modules/app.methods.theme.mjs +39 -0
  20. package/web-ui/modules/app.methods.web-ui-preferences.mjs +9 -0
  21. package/web-ui/modules/i18n/locales/en.mjs +80 -2
  22. package/web-ui/modules/i18n/locales/ja.mjs +80 -2
  23. package/web-ui/modules/i18n/locales/vi.mjs +80 -2
  24. package/web-ui/modules/i18n/locales/zh-tw.mjs +80 -2
  25. package/web-ui/modules/i18n/locales/zh.mjs +80 -2
  26. package/web-ui/modules/i18n.mjs +7 -0
  27. package/web-ui/partials/index/modal-config-template-agents.html +1 -1
  28. package/web-ui/partials/index/modal-health-check.html +1 -1
  29. package/web-ui/partials/index/modal-openclaw-config.html +50 -50
  30. package/web-ui/partials/index/panel-dashboard.html +1 -1
  31. package/web-ui/partials/index/panel-prompts.html +2 -2
  32. package/web-ui/partials/index/panel-sessions.html +47 -30
  33. package/web-ui/partials/index/panel-settings.html +30 -0
  34. package/web-ui/res/web-ui-render.precompiled.js +244 -157
  35. package/web-ui/session-helpers.mjs +3 -0
  36. package/web-ui/styles/base-theme.css +3 -2
  37. package/web-ui/styles/bridge-pool.css +1 -1
  38. package/web-ui/styles/controls-forms.css +1 -1
  39. package/web-ui/styles/layout-shell.css +0 -1
  40. package/web-ui/styles/sessions-preview.css +77 -0
  41. package/web-ui/styles/sessions-toolbar-trash.css +1 -1
  42. package/web-ui/styles/sessions-usage.css +1 -1
  43. package/web-ui/styles/settings-panel.css +2 -2
  44. package/web-ui/styles/theme-dark-tokens.css +83 -0
  45. package/web-ui/styles/theme-dark.css +1355 -0
  46. package/web-ui/styles/theme-ocean-tokens.css +88 -0
  47. package/web-ui/styles/theme-ocean.css +920 -0
  48. package/web-ui/styles.css +2 -0
@@ -875,7 +875,7 @@ return function render(_ctx, _cache) {
875
875
  _createElementVNode("div", { class: "doctor-health-title" }, [
876
876
  _createTextVNode(_toDisplayString(_ctx.healthCheckResult.ok ? _ctx.t('dashboard.health.ok') : _ctx.t('dashboard.health.fail')) + " ", 1 /* TEXT */),
877
877
  (_ctx.healthCheckResult.issues && _ctx.healthCheckResult.issues.length)
878
- ? (_openBlock(), _createElementBlock("span", { key: 0 }, "(" + _toDisplayString(_ctx.t('dashboard.health.issues', { count: _ctx.healthCheckResult.issues.length })) + ")", 1 /* TEXT */))
878
+ ? (_openBlock(), _createElementBlock("span", { key: 0 }, _toDisplayString(_ctx.paren(_ctx.t('dashboard.health.issues', { count: _ctx.healthCheckResult.issues.length }))), 1 /* TEXT */))
879
879
  : _createCommentVNode("v-if", true)
880
880
  ])
881
881
  ], 2 /* CLASS */),
@@ -3857,7 +3857,7 @@ return function render(_ctx, _cache) {
3857
3857
  : _createCommentVNode("v-if", true),
3858
3858
  _createCommentVNode(" 会话浏览模式 "),
3859
3859
  _withDirectives(_createElementVNode("div", {
3860
- class: "mode-content",
3860
+ class: "mode-content session-browser-refined",
3861
3861
  id: "panel-sessions",
3862
3862
  role: "tabpanel",
3863
3863
  "aria-labelledby": 'tab-sessions'
@@ -4052,8 +4052,8 @@ return function render(_ctx, _cache) {
4052
4052
  type: "button",
4053
4053
  onClick: _ctx.toggleSelectAllVisibleForBatch,
4054
4054
  disabled: _ctx.sessionsLoading,
4055
- title: _ctx.isAllVisibleBatchSelected() ? _ctx.t('sessions.batch.unselectAll') : _ctx.t('sessions.batch.selectAll')
4056
- }, _toDisplayString(_ctx.isAllVisibleBatchSelected() ? _ctx.t('sessions.batch.unselectAll') : _ctx.t('sessions.batch.selectAll')), 9 /* TEXT, PROPS */, ["onClick", "disabled", "title"]),
4055
+ title: _ctx.isAllVisibleBatchSelected() ? _ctx.t('sessions.batch.unselectAll') : _ctx.t('sessions.batch.selectAllVisibleN', { count: _ctx.getVisibleBatchSelectableCount() })
4056
+ }, _toDisplayString(_ctx.isAllVisibleBatchSelected() ? _ctx.t('sessions.batch.unselectAll') : _ctx.t('sessions.batch.selectAllVisibleN', { count: _ctx.getVisibleBatchSelectableCount() })), 9 /* TEXT, PROPS */, ["onClick", "disabled", "title"]),
4057
4057
  _createElementVNode("button", {
4058
4058
  class: "btn-tool btn-tool-compact btn-tool-batch-delete",
4059
4059
  type: "button",
@@ -4105,18 +4105,44 @@ return function render(_ctx, _cache) {
4105
4105
  ], 8 /* PROPS */, ["aria-label"]))
4106
4106
  : _createCommentVNode("v-if", true)
4107
4107
  ]),
4108
- (_ctx.sessionsLoading && _ctx.sessionsList.length === 0)
4108
+ (_ctx.sessionSearchInfo && !_ctx.sessionsLoading)
4109
4109
  ? (_openBlock(), _createElementBlock("div", {
4110
4110
  key: 0,
4111
+ class: "session-search-status",
4112
+ role: "status"
4113
+ }, [
4114
+ _createElementVNode("span", { class: "session-search-count" }, _toDisplayString(_ctx.t('sessions.search.coverage', { scanned: _ctx.sessionSearchInfo.scanned, candidates: _ctx.sessionSearchInfo.candidates })), 1 /* TEXT */),
4115
+ (!_ctx.sessionSearchInfo.complete)
4116
+ ? (_openBlock(), _createElementBlock("span", {
4117
+ key: 0,
4118
+ class: "session-search-partial"
4119
+ }, _toDisplayString(_ctx.t('sessions.search.partial')), 1 /* TEXT */))
4120
+ : _createCommentVNode("v-if", true),
4121
+ _createElementVNode("small", { class: "session-search-scope" }, _toDisplayString(_ctx.t('sessions.search.scopeHint')), 1 /* TEXT */)
4122
+ ]))
4123
+ : _createCommentVNode("v-if", true),
4124
+ (_ctx.sessionsLoading && _ctx.sessionsList.length === 0)
4125
+ ? (_openBlock(), _createElementBlock("div", {
4126
+ key: 1,
4111
4127
  class: "state-message"
4112
4128
  }, _toDisplayString(_ctx.t('sessions.loadingList')), 1 /* TEXT */))
4113
4129
  : (!_ctx.sessionsLoading && _ctx.sessionsList.length === 0)
4114
4130
  ? (_openBlock(), _createElementBlock("div", {
4115
- key: 1,
4116
- class: "session-empty"
4117
- }, _toDisplayString(_ctx.t('sessions.empty')), 1 /* TEXT */))
4118
- : (_openBlock(), _createElementBlock("div", {
4119
4131
  key: 2,
4132
+ class: "session-empty session-empty-refined"
4133
+ }, [
4134
+ _createElementVNode("p", null, _toDisplayString(_ctx.t(_ctx.hasActiveSessionFilters() ? 'sessions.empty.filtered' : 'sessions.empty.source')), 1 /* TEXT */),
4135
+ (_ctx.hasActiveSessionFilters())
4136
+ ? (_openBlock(), _createElementBlock("button", {
4137
+ key: 0,
4138
+ class: "btn-tool btn-tool-compact",
4139
+ type: "button",
4140
+ onClick: _ctx.clearSessionFilters
4141
+ }, _toDisplayString(_ctx.t('sessions.empty.clearFilters')), 9 /* TEXT, PROPS */, ["onClick"]))
4142
+ : _createCommentVNode("v-if", true)
4143
+ ]))
4144
+ : (_openBlock(), _createElementBlock("div", {
4145
+ key: 3,
4120
4146
  class: "session-layout"
4121
4147
  }, [
4122
4148
  (_ctx.sessionListRenderEnabled)
@@ -4318,53 +4344,22 @@ return function render(_ctx, _cache) {
4318
4344
  ]))
4319
4345
  : _createCommentVNode("v-if", true)
4320
4346
  ]),
4321
- _createElementVNode("div", { class: "session-actions" }, [
4322
- _createElementVNode("button", {
4323
- class: "btn-session-refresh has-label",
4324
- onClick: _ctx.loadActiveSessionDetail,
4325
- disabled: _ctx.sessionDetailLoading || !_ctx.activeSession,
4326
- title: _ctx.sessionDetailLoading ? _ctx.t('sessions.preview.loading') : _ctx.t('sessions.preview.refresh'),
4327
- "aria-label": _ctx.sessionDetailLoading ? _ctx.t('sessions.preview.loading') : _ctx.t('sessions.preview.refresh')
4347
+ _createElementVNode("div", { class: "session-export-control" }, [
4348
+ _createElementVNode("label", {
4349
+ class: "session-export-label",
4350
+ for: "session-export-range"
4351
+ }, _toDisplayString(_ctx.t('sessions.export.range')), 1 /* TEXT */),
4352
+ _withDirectives(_createElementVNode("select", {
4353
+ id: "session-export-range",
4354
+ "onUpdate:modelValue": $event => ((_ctx.sessionExportRange) = $event),
4355
+ disabled: _ctx.sessionExporting[_ctx.getSessionExportKey(_ctx.activeSession)],
4356
+ "aria-describedby": "session-export-scope"
4328
4357
  }, [
4329
- (_openBlock(), _createElementBlock("svg", {
4330
- viewBox: "0 0 16 16",
4331
- fill: "none",
4332
- stroke: "currentColor",
4333
- "stroke-width": "1.8",
4334
- "stroke-linecap": "round",
4335
- "stroke-linejoin": "round"
4336
- }, [
4337
- _createElementVNode("path", { d: "M2.5 8a5.5 5.5 0 0 1 9.4-3.8" }),
4338
- _createElementVNode("path", { d: "M13.5 8a5.5 5.5 0 0 1-9.4 3.8" }),
4339
- _createElementVNode("polyline", { points: "2.5 2 2.5 5 5.5 5" }),
4340
- _createElementVNode("polyline", { points: "13.5 14 13.5 11 10.5 11" })
4341
- ])),
4342
- _createElementVNode("span", { class: "session-action-label" }, _toDisplayString(_ctx.t('sessions.preview.refresh')), 1 /* TEXT */)
4343
- ], 8 /* PROPS */, ["onClick", "disabled", "title", "aria-label"]),
4344
- (_ctx.isDeleteAvailable(_ctx.activeSession))
4345
- ? (_openBlock(), _createElementBlock("button", {
4346
- key: 0,
4347
- class: "btn-session-delete has-label",
4348
- onClick: $event => (_ctx.deleteSession(_ctx.activeSession)),
4349
- disabled: !_ctx.activeSession || _ctx.sessionsLoading || _ctx.sessionDeleting[_ctx.getSessionExportKey(_ctx.activeSession)],
4350
- title: (_ctx.activeSession && _ctx.sessionDeleting[_ctx.getSessionExportKey(_ctx.activeSession)]) ? (_ctx.sessionTrashEnabled === false ? _ctx.t('sessions.preview.deleting') : _ctx.t('sessions.preview.moving')) : (_ctx.sessionTrashEnabled === false ? _ctx.t('sessions.preview.deleteHard') : _ctx.t('sessions.preview.moveToTrash')),
4351
- "aria-label": (_ctx.activeSession && _ctx.sessionDeleting[_ctx.getSessionExportKey(_ctx.activeSession)]) ? (_ctx.sessionTrashEnabled === false ? _ctx.t('sessions.preview.deleting') : _ctx.t('sessions.preview.moving')) : (_ctx.sessionTrashEnabled === false ? _ctx.t('sessions.preview.deleteHard') : _ctx.t('sessions.preview.moveToTrash'))
4352
- }, [
4353
- (_openBlock(), _createElementBlock("svg", {
4354
- viewBox: "0 0 16 16",
4355
- fill: "none",
4356
- stroke: "currentColor",
4357
- "stroke-width": "1.8",
4358
- "stroke-linecap": "round",
4359
- "stroke-linejoin": "round"
4360
- }, [
4361
- _createElementVNode("polyline", { points: "3 4 4 4 13 4" }),
4362
- _createElementVNode("path", { d: "M5.5 4V2.5a1 1 0 0 1 1-1h3a1 1 0 0 1 1 1V4" }),
4363
- _createElementVNode("path", { d: "M12 4v9.5a1.5 1.5 0 0 1-1.5 1.5h-5A1.5 1.5 0 0 1 4 13.5V4" })
4364
- ])),
4365
- _createElementVNode("span", { class: "session-action-label" }, _toDisplayString((_ctx.activeSession && _ctx.sessionDeleting[_ctx.getSessionExportKey(_ctx.activeSession)]) ? (_ctx.sessionTrashEnabled === false ? _ctx.t('sessions.preview.deleting') : _ctx.t('sessions.preview.moving')) : (_ctx.sessionTrashEnabled === false ? _ctx.t('sessions.preview.deleteHard') : _ctx.t('sessions.preview.moveToTrash'))), 1 /* TEXT */)
4366
- ], 8 /* PROPS */, ["onClick", "disabled", "title", "aria-label"]))
4367
- : _createCommentVNode("v-if", true),
4358
+ _createElementVNode("option", { value: "default" }, _toDisplayString(_ctx.t('sessions.export.default')), 1 /* TEXT */),
4359
+ _createElementVNode("option", { value: "all" }, _toDisplayString(_ctx.t('sessions.export.all')), 1 /* TEXT */)
4360
+ ], 8 /* PROPS */, ["onUpdate:modelValue", "disabled"]), [
4361
+ [_vModelSelect, _ctx.sessionExportRange]
4362
+ ]),
4368
4363
  _createElementVNode("button", {
4369
4364
  class: "btn-session-export has-label",
4370
4365
  onClick: $event => (_ctx.exportSession(_ctx.activeSession)),
@@ -4385,14 +4380,16 @@ return function render(_ctx, _cache) {
4385
4380
  _createElementVNode("path", { d: "M2.5 12v1.5a1 1 0 0 0 1 1h9a1 1 0 0 0 1-1V12" })
4386
4381
  ])),
4387
4382
  _createElementVNode("span", { class: "session-action-label" }, _toDisplayString((_ctx.activeSession && _ctx.sessionExporting[_ctx.getSessionExportKey(_ctx.activeSession)]) ? _ctx.t('sessions.preview.exporting') : _ctx.t('sessions.preview.export')), 1 /* TEXT */)
4388
- ], 8 /* PROPS */, ["onClick", "disabled", "title", "aria-label"]),
4389
- _createElementVNode("div", { class: "session-link-group" }, [
4383
+ ], 8 /* PROPS */, ["onClick", "disabled", "title", "aria-label"])
4384
+ ]),
4385
+ _createElementVNode("div", { class: "session-actions session-preview-actions" }, [
4386
+ _createElementVNode("div", { class: "session-secondary-actions" }, [
4390
4387
  _createElementVNode("button", {
4391
- class: "btn-session-open",
4392
- onClick: $event => (_ctx.copySessionLink(_ctx.activeSession)),
4393
- disabled: !_ctx.activeSession || !_ctx.canBuildStandaloneUrl(_ctx.activeSession),
4394
- title: _ctx.t('sessions.preview.copyLink'),
4395
- "aria-label": _ctx.t('sessions.preview.copyLink')
4388
+ class: "btn-session-refresh has-label",
4389
+ onClick: _ctx.loadActiveSessionDetail,
4390
+ disabled: _ctx.sessionDetailLoading || !_ctx.activeSession,
4391
+ title: _ctx.sessionDetailLoading ? _ctx.t('sessions.preview.loading') : _ctx.t('sessions.preview.refresh'),
4392
+ "aria-label": _ctx.sessionDetailLoading ? _ctx.t('sessions.preview.loading') : _ctx.t('sessions.preview.refresh')
4396
4393
  }, [
4397
4394
  (_openBlock(), _createElementBlock("svg", {
4398
4395
  viewBox: "0 0 16 16",
@@ -4402,16 +4399,61 @@ return function render(_ctx, _cache) {
4402
4399
  "stroke-linecap": "round",
4403
4400
  "stroke-linejoin": "round"
4404
4401
  }, [
4405
- _createElementVNode("path", { d: "M6.5 9.5a3.5 3.5 0 0 0 5 0l2-2a3.5 3.5 0 0 0-5-5l-1 1" }),
4406
- _createElementVNode("path", { d: "M9.5 6.5a3.5 3.5 0 0 0-5 0l-2 2a3.5 3.5 0 0 0 5 5l1-1" })
4407
- ]))
4402
+ _createElementVNode("path", { d: "M2.5 8a5.5 5.5 0 0 1 9.4-3.8" }),
4403
+ _createElementVNode("path", { d: "M13.5 8a5.5 5.5 0 0 1-9.4 3.8" }),
4404
+ _createElementVNode("polyline", { points: "2.5 2 2.5 5 5.5 5" }),
4405
+ _createElementVNode("polyline", { points: "13.5 14 13.5 11 10.5 11" })
4406
+ ])),
4407
+ _createElementVNode("span", { class: "session-action-label" }, _toDisplayString(_ctx.t('sessions.preview.refresh')), 1 /* TEXT */)
4408
4408
  ], 8 /* PROPS */, ["onClick", "disabled", "title", "aria-label"]),
4409
+ _createElementVNode("div", { class: "session-link-group" }, [
4410
+ _createElementVNode("button", {
4411
+ class: "btn-session-open",
4412
+ onClick: $event => (_ctx.copySessionLink(_ctx.activeSession)),
4413
+ disabled: !_ctx.activeSession || !_ctx.canBuildStandaloneUrl(_ctx.activeSession),
4414
+ title: _ctx.t('sessions.preview.copyLink'),
4415
+ "aria-label": _ctx.t('sessions.preview.copyLink')
4416
+ }, [
4417
+ (_openBlock(), _createElementBlock("svg", {
4418
+ viewBox: "0 0 16 16",
4419
+ fill: "none",
4420
+ stroke: "currentColor",
4421
+ "stroke-width": "1.8",
4422
+ "stroke-linecap": "round",
4423
+ "stroke-linejoin": "round"
4424
+ }, [
4425
+ _createElementVNode("path", { d: "M6.5 9.5a3.5 3.5 0 0 0 5 0l2-2a3.5 3.5 0 0 0-5-5l-1 1" }),
4426
+ _createElementVNode("path", { d: "M9.5 6.5a3.5 3.5 0 0 0-5 0l-2 2a3.5 3.5 0 0 0 5 5l1-1" })
4427
+ ]))
4428
+ ], 8 /* PROPS */, ["onClick", "disabled", "title", "aria-label"]),
4429
+ _createTextVNode(),
4430
+ _createElementVNode("button", {
4431
+ class: "btn-session-open",
4432
+ onClick: $event => (_ctx.openSessionLink(_ctx.activeSession)),
4433
+ disabled: !_ctx.activeSession || !_ctx.canBuildStandaloneUrl(_ctx.activeSession),
4434
+ title: _ctx.t('sessions.preview.openLink'),
4435
+ "aria-label": _ctx.t('sessions.preview.openLink')
4436
+ }, [
4437
+ (_openBlock(), _createElementBlock("svg", {
4438
+ viewBox: "0 0 16 16",
4439
+ fill: "none",
4440
+ stroke: "currentColor",
4441
+ "stroke-width": "1.8",
4442
+ "stroke-linecap": "round",
4443
+ "stroke-linejoin": "round"
4444
+ }, [
4445
+ _createElementVNode("path", { d: "M12 2h-8.5A1.5 1.5 0 0 0 2 3.5v8A1.5 1.5 0 0 0 3.5 13h8a1.5 1.5 0 0 0 1.5-1.5v-3" }),
4446
+ _createElementVNode("path", { d: "M13 2v4h-4" }),
4447
+ _createElementVNode("path", { d: "M13 2L7 8" })
4448
+ ]))
4449
+ ], 8 /* PROPS */, ["onClick", "disabled", "title", "aria-label"])
4450
+ ]),
4409
4451
  _createElementVNode("button", {
4410
- class: "btn-session-open",
4411
- onClick: $event => (_ctx.openSessionLink(_ctx.activeSession)),
4412
- disabled: !_ctx.activeSession || !_ctx.canBuildStandaloneUrl(_ctx.activeSession),
4413
- title: _ctx.t('sessions.preview.openLink'),
4414
- "aria-label": _ctx.t('sessions.preview.openLink')
4452
+ class: "btn-session-open has-label",
4453
+ onClick: $event => (_ctx.copySessionPath(_ctx.activeSession)),
4454
+ disabled: !_ctx.activeSession || !_ctx.getSessionFilePath(_ctx.activeSession),
4455
+ title: _ctx.t('sessions.preview.copyPath'),
4456
+ "aria-label": _ctx.t('sessions.preview.copyPath')
4415
4457
  }, [
4416
4458
  (_openBlock(), _createElementBlock("svg", {
4417
4459
  viewBox: "0 0 16 16",
@@ -4421,33 +4463,49 @@ return function render(_ctx, _cache) {
4421
4463
  "stroke-linecap": "round",
4422
4464
  "stroke-linejoin": "round"
4423
4465
  }, [
4424
- _createElementVNode("path", { d: "M12 2h-8.5A1.5 1.5 0 0 0 2 3.5v8A1.5 1.5 0 0 0 3.5 13h8a1.5 1.5 0 0 0 1.5-1.5v-3" }),
4425
- _createElementVNode("path", { d: "M13 2v4h-4" }),
4426
- _createElementVNode("path", { d: "M13 2L7 8" })
4427
- ]))
4466
+ _createElementVNode("path", { d: "M2 5.5V12.5a1 1 0 0 0 1 1h10a1 1 0 0 0 1-1V7.5a1 1 0 0 0-1-1H8L6.5 5H3a1 1 0 0 0-1 1z" })
4467
+ ])),
4468
+ _createElementVNode("span", { class: "session-action-label" }, _toDisplayString(_ctx.t('sessions.preview.copyPath')), 1 /* TEXT */)
4428
4469
  ], 8 /* PROPS */, ["onClick", "disabled", "title", "aria-label"])
4429
4470
  ]),
4430
- _createElementVNode("button", {
4431
- class: "btn-session-open has-label",
4432
- onClick: $event => (_ctx.copySessionPath(_ctx.activeSession)),
4433
- disabled: !_ctx.activeSession || !_ctx.getSessionFilePath(_ctx.activeSession),
4434
- title: _ctx.t('sessions.preview.copyPath'),
4435
- "aria-label": _ctx.t('sessions.preview.copyPath')
4436
- }, [
4437
- (_openBlock(), _createElementBlock("svg", {
4438
- viewBox: "0 0 16 16",
4439
- fill: "none",
4440
- stroke: "currentColor",
4441
- "stroke-width": "1.8",
4442
- "stroke-linecap": "round",
4443
- "stroke-linejoin": "round"
4444
- }, [
4445
- _createElementVNode("path", { d: "M2 5.5V12.5a1 1 0 0 0 1 1h10a1 1 0 0 0 1-1V7.5a1 1 0 0 0-1-1H8L6.5 5H3a1 1 0 0 0-1 1z" })
4446
- ])),
4447
- _createElementVNode("span", { class: "session-action-label" }, _toDisplayString(_ctx.t('sessions.preview.copyPath')), 1 /* TEXT */)
4448
- ], 8 /* PROPS */, ["onClick", "disabled", "title", "aria-label"])
4471
+ _createElementVNode("div", { class: "session-danger-action" }, [
4472
+ (_ctx.isDeleteAvailable(_ctx.activeSession))
4473
+ ? (_openBlock(), _createElementBlock("button", {
4474
+ key: 0,
4475
+ class: "btn-session-delete has-label",
4476
+ onClick: $event => (_ctx.deleteSession(_ctx.activeSession)),
4477
+ disabled: !_ctx.activeSession || _ctx.sessionsLoading || _ctx.sessionDeleting[_ctx.getSessionExportKey(_ctx.activeSession)],
4478
+ title: (_ctx.activeSession && _ctx.sessionDeleting[_ctx.getSessionExportKey(_ctx.activeSession)]) ? (_ctx.sessionTrashEnabled === false ? _ctx.t('sessions.preview.deleting') : _ctx.t('sessions.preview.moving')) : (_ctx.sessionTrashEnabled === false ? _ctx.t('sessions.preview.deleteHard') : _ctx.t('sessions.preview.moveToTrash')),
4479
+ "aria-label": (_ctx.activeSession && _ctx.sessionDeleting[_ctx.getSessionExportKey(_ctx.activeSession)]) ? (_ctx.sessionTrashEnabled === false ? _ctx.t('sessions.preview.deleting') : _ctx.t('sessions.preview.moving')) : (_ctx.sessionTrashEnabled === false ? _ctx.t('sessions.preview.deleteHard') : _ctx.t('sessions.preview.moveToTrash'))
4480
+ }, [
4481
+ (_openBlock(), _createElementBlock("svg", {
4482
+ viewBox: "0 0 16 16",
4483
+ fill: "none",
4484
+ stroke: "currentColor",
4485
+ "stroke-width": "1.8",
4486
+ "stroke-linecap": "round",
4487
+ "stroke-linejoin": "round"
4488
+ }, [
4489
+ _createElementVNode("polyline", { points: "3 4 4 4 13 4" }),
4490
+ _createElementVNode("path", { d: "M5.5 4V2.5a1 1 0 0 1 1-1h3a1 1 0 0 1 1 1V4" }),
4491
+ _createElementVNode("path", { d: "M12 4v9.5a1.5 1.5 0 0 1-1.5 1.5h-5A1.5 1.5 0 0 1 4 13.5V4" })
4492
+ ])),
4493
+ _createElementVNode("span", { class: "session-action-label" }, _toDisplayString((_ctx.activeSession && _ctx.sessionDeleting[_ctx.getSessionExportKey(_ctx.activeSession)]) ? (_ctx.sessionTrashEnabled === false ? _ctx.t('sessions.preview.deleting') : _ctx.t('sessions.preview.moving')) : (_ctx.sessionTrashEnabled === false ? _ctx.t('sessions.preview.deleteHard') : _ctx.t('sessions.preview.moveToTrash'))), 1 /* TEXT */)
4494
+ ], 8 /* PROPS */, ["onClick", "disabled", "title", "aria-label"]))
4495
+ : _createCommentVNode("v-if", true)
4496
+ ])
4449
4497
  ])
4450
4498
  ], 512 /* NEED_PATCH */),
4499
+ _createElementVNode("div", { class: "session-export-feedback" }, [
4500
+ _createElementVNode("small", { id: "session-export-scope" }, _toDisplayString(_ctx.t('sessions.export.scopeHint')), 1 /* TEXT */),
4501
+ (_ctx.sessionExportNotice && _ctx.sessionExportNotice.key === _ctx.getSessionExportKey(_ctx.activeSession))
4502
+ ? (_openBlock(), _createElementBlock("p", {
4503
+ key: 0,
4504
+ class: "session-export-notice",
4505
+ role: "status"
4506
+ }, _toDisplayString(_ctx.t('sessions.export.truncated')), 1 /* TEXT */))
4507
+ : _createCommentVNode("v-if", true)
4508
+ ]),
4451
4509
  (_ctx.sessionDetailLoading && !_ctx.sessionPreviewLoadingMore)
4452
4510
  ? (_openBlock(), _createElementBlock("div", {
4453
4511
  key: 0,
@@ -5535,6 +5593,35 @@ return function render(_ctx, _cache) {
5535
5593
  ])
5536
5594
  ])
5537
5595
  ], 8 /* PROPS */, ["aria-label"]),
5596
+ _createElementVNode("section", {
5597
+ class: "settings-card",
5598
+ "aria-label": _ctx.t('settings.theme.title')
5599
+ }, [
5600
+ _createElementVNode("div", { class: "settings-card-main" }, [
5601
+ _createElementVNode("div", { class: "settings-card-content" }, [
5602
+ _createElementVNode("div", { class: "settings-card-title" }, _toDisplayString(_ctx.t('settings.theme.title')), 1 /* TEXT */),
5603
+ _createElementVNode("p", { class: "settings-card-desc" }, _toDisplayString(_ctx.t('settings.theme.meta')), 1 /* TEXT */),
5604
+ _createElementVNode("div", { class: "settings-toggle-group" }, [
5605
+ _createElementVNode("button", {
5606
+ type: "button",
5607
+ class: _normalizeClass(['toggle-btn', { active: _ctx.theme === 'light' }]),
5608
+ onClick: $event => (_ctx.setTheme('light'))
5609
+ }, _toDisplayString(_ctx.t('settings.theme.light')), 11 /* TEXT, CLASS, PROPS */, ["onClick"]),
5610
+ _createElementVNode("button", {
5611
+ type: "button",
5612
+ class: _normalizeClass(['toggle-btn', { active: _ctx.theme === 'dark' }]),
5613
+ onClick: $event => (_ctx.setTheme('dark'))
5614
+ }, _toDisplayString(_ctx.t('settings.theme.dark')), 11 /* TEXT, CLASS, PROPS */, ["onClick"]),
5615
+ _createElementVNode("button", {
5616
+ type: "button",
5617
+ class: _normalizeClass(['toggle-btn', { active: _ctx.theme === 'ocean' }]),
5618
+ onClick: $event => (_ctx.setTheme('ocean'))
5619
+ }, _toDisplayString(_ctx.t('settings.theme.ocean')), 11 /* TEXT, CLASS, PROPS */, ["onClick"])
5620
+ ]),
5621
+ _createElementVNode("p", { class: "settings-card-hint" }, _toDisplayString(_ctx.t('settings.theme.hint')), 1 /* TEXT */)
5622
+ ])
5623
+ ])
5624
+ ], 8 /* PROPS */, ["aria-label"]),
5538
5625
  _createElementVNode("section", {
5539
5626
  class: "settings-card",
5540
5627
  "aria-label": _ctx.t('settings.sharePrefix.title')
@@ -7067,7 +7154,7 @@ return function render(_ctx, _cache) {
7067
7154
  _createElementVNode("div", { class: "form-hint" }, [
7068
7155
  _createTextVNode(_toDisplayString(_ctx.agentsPath || _ctx.t('common.notLoaded')) + " ", 1 /* TEXT */),
7069
7156
  (_ctx.agentsPath)
7070
- ? (_openBlock(), _createElementBlock("span", { key: 0 }, " (" + _toDisplayString(_ctx.agentsExists ? _ctx.t('common.exists') : _ctx.t('common.notExistsWillCreateOnSave')) + ") ", 1 /* TEXT */))
7157
+ ? (_openBlock(), _createElementBlock("span", { key: 0 }, _toDisplayString(_ctx.paren(_ctx.agentsExists ? _ctx.t('common.exists') : _ctx.t('common.notExistsWillCreateOnSave'))), 1 /* TEXT */))
7071
7158
  : _createCommentVNode("v-if", true),
7072
7159
  (_ctx.agentsPath)
7073
7160
  ? (_openBlock(), _createElementBlock("span", {
@@ -7619,7 +7706,7 @@ return function render(_ctx, _cache) {
7619
7706
  _createElementVNode("div", { class: "form-hint" }, [
7620
7707
  _createTextVNode(_toDisplayString(_ctx.sysPromptPath || _ctx.t('common.notLoaded')) + " ", 1 /* TEXT */),
7621
7708
  (_ctx.sysPromptPath)
7622
- ? (_openBlock(), _createElementBlock("span", { key: 0 }, " (" + _toDisplayString(_ctx.sysPromptExists ? _ctx.t('common.exists') : _ctx.t('common.notExistsWillCreateOnSave')) + ") ", 1 /* TEXT */))
7709
+ ? (_openBlock(), _createElementBlock("span", { key: 0 }, _toDisplayString(_ctx.paren(_ctx.sysPromptExists ? _ctx.t('common.exists') : _ctx.t('common.notExistsWillCreateOnSave'))), 1 /* TEXT */))
7623
7710
  : _createCommentVNode("v-if", true),
7624
7711
  (_ctx.sysPromptPath)
7625
7712
  ? (_openBlock(), _createElementBlock("span", {
@@ -9329,7 +9416,7 @@ return function render(_ctx, _cache) {
9329
9416
  _createElementVNode("div", { class: "form-hint" }, [
9330
9417
  _createTextVNode(_toDisplayString(_ctx.openclawConfigPath || _ctx.t('common.notLoaded')) + " ", 1 /* TEXT */),
9331
9418
  (_ctx.openclawConfigPath)
9332
- ? (_openBlock(), _createElementBlock("span", { key: 0 }, " (" + _toDisplayString(_ctx.openclawConfigExists ? _ctx.t('common.exists') : _ctx.t('common.notExistsWillCreateOnApply')) + ") ", 1 /* TEXT */))
9419
+ ? (_openBlock(), _createElementBlock("span", { key: 0 }, _toDisplayString(_ctx.paren(_ctx.openclawConfigExists ? _ctx.t('common.exists') : _ctx.t('common.notExistsWillCreateOnApply'))), 1 /* TEXT */))
9333
9420
  : _createCommentVNode("v-if", true)
9334
9421
  ]),
9335
9422
  _createElementVNode("div", {
@@ -9403,9 +9490,9 @@ return function render(_ctx, _cache) {
9403
9490
  _withDirectives(_createElementVNode("input", {
9404
9491
  "onUpdate:modelValue": $event => ((_ctx.openclawQuick.providerName) = $event),
9405
9492
  class: "form-input",
9406
- placeholder: "例如: custom-myapi",
9493
+ placeholder: _ctx.t('modal.openclaw.quick.providerNamePlaceholder'),
9407
9494
  onInput: _ctx.validateProviderName
9408
- }, null, 40 /* PROPS, NEED_HYDRATION */, ["onUpdate:modelValue", "onInput"]), [
9495
+ }, null, 40 /* PROPS, NEED_HYDRATION */, ["onUpdate:modelValue", "placeholder", "onInput"]), [
9409
9496
  [_vModelText, _ctx.openclawQuick.providerName]
9410
9497
  ]),
9411
9498
  _createElementVNode("div", {
@@ -9491,7 +9578,7 @@ return function render(_ctx, _cache) {
9491
9578
  class: "btn btn-confirm btn-sm",
9492
9579
  onClick: _ctx.nextAccordionStep,
9493
9580
  disabled: !_ctx.openclawQuick.providerName
9494
- }, " 下一步 → ", 8 /* PROPS */, ["onClick", "disabled"])
9581
+ }, _toDisplayString(_ctx.t('modal.openclaw.next')), 9 /* TEXT, PROPS */, ["onClick", "disabled"])
9495
9582
  ])
9496
9583
  ], 512 /* NEED_PATCH */), [
9497
9584
  [_vShow, _ctx.openclawAccordionStep === 1]
@@ -9545,7 +9632,7 @@ return function render(_ctx, _cache) {
9545
9632
  ]),
9546
9633
  _createElementVNode("div", {
9547
9634
  class: _normalizeClass(["form-hint", { 'hint-error': !_ctx.openclawValidation.modelId.valid }])
9548
- }, _toDisplayString(_ctx.openclawValidation.modelId.message || '必填,例如: gpt-4'), 3 /* TEXT, CLASS */)
9635
+ }, _toDisplayString(_ctx.openclawValidation.modelId.message || _ctx.t('modal.openclaw.quick.modelIdHint')), 3 /* TEXT, CLASS */)
9549
9636
  ]),
9550
9637
  _createElementVNode("div", { class: "form-group" }, [
9551
9638
  _createElementVNode("label", { class: "form-label" }, _toDisplayString(_ctx.t('field.displayName')), 1 /* TEXT */),
@@ -9556,7 +9643,7 @@ return function render(_ctx, _cache) {
9556
9643
  }, null, 8 /* PROPS */, ["onUpdate:modelValue", "placeholder"]), [
9557
9644
  [_vModelText, _ctx.openclawQuick.modelName]
9558
9645
  ]),
9559
- _createElementVNode("div", { class: "form-hint" }, "可选,用于显示")
9646
+ _createElementVNode("div", { class: "form-hint" }, _toDisplayString(_ctx.t('modal.openclaw.quick.modelNameHint')), 1 /* TEXT */)
9560
9647
  ]),
9561
9648
  _createElementVNode("div", { class: "form-group" }, [
9562
9649
  _createElementVNode("label", { class: "form-label" }, _toDisplayString(_ctx.t('field.contextAndMaxOutput')), 1 /* TEXT */),
@@ -9582,12 +9669,12 @@ return function render(_ctx, _cache) {
9582
9669
  _createElementVNode("button", {
9583
9670
  class: "btn btn-cancel btn-sm",
9584
9671
  onClick: _ctx.prevAccordionStep
9585
- }, " ← 上一步 ", 8 /* PROPS */, ["onClick"]),
9672
+ }, _toDisplayString(_ctx.t('modal.openclaw.prev')), 9 /* TEXT, PROPS */, ["onClick"]),
9586
9673
  _createElementVNode("button", {
9587
9674
  class: "btn btn-confirm btn-sm",
9588
9675
  onClick: _ctx.nextAccordionStep,
9589
9676
  disabled: !_ctx.openclawQuick.modelId
9590
- }, " 下一步 → ", 8 /* PROPS */, ["onClick", "disabled"])
9677
+ }, _toDisplayString(_ctx.t('modal.openclaw.next')), 9 /* TEXT, PROPS */, ["onClick", "disabled"])
9591
9678
  ])
9592
9679
  ], 512 /* NEED_PATCH */), [
9593
9680
  [_vShow, _ctx.openclawAccordionStep === 2]
@@ -9612,7 +9699,7 @@ return function render(_ctx, _cache) {
9612
9699
  ], 64 /* STABLE_FRAGMENT */))
9613
9700
  ]),
9614
9701
  _createElementVNode("span", { class: "accordion-title" }, _toDisplayString(_ctx.t('modal.openclaw.quick.optionsTitle')), 1 /* TEXT */),
9615
- _createElementVNode("span", { class: "accordion-status" }, "高级选项"),
9702
+ _createElementVNode("span", { class: "accordion-status" }, _toDisplayString(_ctx.t('modal.openclaw.quick.advancedOptions')), 1 /* TEXT */),
9616
9703
  (_openBlock(), _createElementBlock("svg", {
9617
9704
  class: "accordion-chevron",
9618
9705
  viewBox: "0 0 24 24",
@@ -9656,11 +9743,11 @@ return function render(_ctx, _cache) {
9656
9743
  _createElementVNode("button", {
9657
9744
  class: "btn btn-cancel btn-sm",
9658
9745
  onClick: _ctx.prevAccordionStep
9659
- }, " ← 上一步 ", 8 /* PROPS */, ["onClick"]),
9746
+ }, _toDisplayString(_ctx.t('modal.openclaw.prev')), 9 /* TEXT, PROPS */, ["onClick"]),
9660
9747
  _createElementVNode("button", {
9661
9748
  class: "btn btn-confirm btn-sm",
9662
9749
  onClick: _ctx.finishAccordionStep
9663
- }, " 完成 ✓ ", 8 /* PROPS */, ["onClick"])
9750
+ }, _toDisplayString(_ctx.t('modal.openclaw.finish')), 9 /* TEXT, PROPS */, ["onClick"])
9664
9751
  ])
9665
9752
  ], 512 /* NEED_PATCH */), [
9666
9753
  [_vShow, _ctx.openclawAccordionStep === 3]
@@ -9676,24 +9763,24 @@ return function render(_ctx, _cache) {
9676
9763
  ]),
9677
9764
  _createElementVNode("div", { class: "structured-section" }, [
9678
9765
  _createElementVNode("div", { class: "structured-header" }, [
9679
- _createElementVNode("span", { class: "structured-title" }, "结构化配置(高级)"),
9766
+ _createElementVNode("span", { class: "structured-title" }, _toDisplayString(_ctx.t('modal.openclaw.structured.title')), 1 /* TEXT */),
9680
9767
  _createElementVNode("span", { class: "form-hint" }, _toDisplayString(_ctx.t('modal.openclaw.structured.writeHint')), 1 /* TEXT */)
9681
9768
  ]),
9682
9769
  _createElementVNode("div", { class: "structured-grid" }, [
9683
9770
  _createElementVNode("div", { class: "structured-card" }, [
9684
9771
  _createElementVNode("div", { class: "structured-card-title" }, "Agents Defaults"),
9685
9772
  _createElementVNode("div", { class: "form-group" }, [
9686
- _createElementVNode("label", { class: "form-label" }, "主模型"),
9773
+ _createElementVNode("label", { class: "form-label" }, _toDisplayString(_ctx.t('modal.openclaw.structured.primaryModel')), 1 /* TEXT */),
9687
9774
  _withDirectives(_createElementVNode("input", {
9688
9775
  "onUpdate:modelValue": $event => ((_ctx.openclawStructured.agentPrimary) = $event),
9689
9776
  class: "form-input",
9690
- placeholder: "例如: provider/model"
9691
- }, null, 8 /* PROPS */, ["onUpdate:modelValue"]), [
9777
+ placeholder: _ctx.t('modal.openclaw.structured.providerModelPlaceholder')
9778
+ }, null, 8 /* PROPS */, ["onUpdate:modelValue", "placeholder"]), [
9692
9779
  [_vModelText, _ctx.openclawStructured.agentPrimary]
9693
9780
  ])
9694
9781
  ]),
9695
9782
  _createElementVNode("div", { class: "form-group" }, [
9696
- _createElementVNode("label", { class: "form-label" }, "备选模型"),
9783
+ _createElementVNode("label", { class: "form-label" }, _toDisplayString(_ctx.t('modal.openclaw.structured.fallbackModels')), 1 /* TEXT */),
9697
9784
  (_openBlock(true), _createElementBlock(_Fragment, null, _renderList(_ctx.openclawStructured.agentFallbacks, (item, index) => {
9698
9785
  return (_openBlock(), _createElementBlock("div", {
9699
9786
  class: "list-row",
@@ -9702,28 +9789,28 @@ return function render(_ctx, _cache) {
9702
9789
  _withDirectives(_createElementVNode("input", {
9703
9790
  "onUpdate:modelValue": $event => ((_ctx.openclawStructured.agentFallbacks[index]) = $event),
9704
9791
  class: "form-input",
9705
- placeholder: "例如: provider/model"
9706
- }, null, 8 /* PROPS */, ["onUpdate:modelValue"]), [
9792
+ placeholder: _ctx.t('modal.openclaw.structured.providerModelPlaceholder')
9793
+ }, null, 8 /* PROPS */, ["onUpdate:modelValue", "placeholder"]), [
9707
9794
  [_vModelText, _ctx.openclawStructured.agentFallbacks[index]]
9708
9795
  ]),
9709
9796
  _createElementVNode("button", {
9710
9797
  class: "btn-mini delete",
9711
9798
  onClick: $event => (_ctx.removeOpenclawFallback(index))
9712
- }, "删除", 8 /* PROPS */, ["onClick"])
9799
+ }, _toDisplayString(_ctx.t('common.delete')), 9 /* TEXT, PROPS */, ["onClick"])
9713
9800
  ]))
9714
9801
  }), 128 /* KEYED_FRAGMENT */)),
9715
9802
  _createElementVNode("button", {
9716
9803
  class: "btn-mini",
9717
9804
  onClick: _ctx.addOpenclawFallback
9718
- }, "添加备选", 8 /* PROPS */, ["onClick"])
9805
+ }, _toDisplayString(_ctx.t('modal.openclaw.structured.addFallback')), 9 /* TEXT, PROPS */, ["onClick"])
9719
9806
  ]),
9720
9807
  _createElementVNode("div", { class: "form-group" }, [
9721
9808
  _createElementVNode("label", { class: "form-label" }, "Workspace"),
9722
9809
  _withDirectives(_createElementVNode("input", {
9723
9810
  "onUpdate:modelValue": $event => ((_ctx.openclawStructured.workspace) = $event),
9724
9811
  class: "form-input",
9725
- placeholder: "例如: ~/.openclaw/workspace"
9726
- }, null, 8 /* PROPS */, ["onUpdate:modelValue"]), [
9812
+ placeholder: _ctx.t('modal.openclaw.structured.workspacePlaceholder')
9813
+ }, null, 8 /* PROPS */, ["onUpdate:modelValue", "placeholder"]), [
9727
9814
  [_vModelText, _ctx.openclawStructured.workspace]
9728
9815
  ])
9729
9816
  ]),
@@ -9732,8 +9819,8 @@ return function render(_ctx, _cache) {
9732
9819
  _withDirectives(_createElementVNode("input", {
9733
9820
  "onUpdate:modelValue": $event => ((_ctx.openclawStructured.timeout) = $event),
9734
9821
  class: "form-input",
9735
- placeholder: "例如: 600"
9736
- }, null, 8 /* PROPS */, ["onUpdate:modelValue"]), [
9822
+ placeholder: _ctx.t('modal.openclaw.structured.timeoutPlaceholder')
9823
+ }, null, 8 /* PROPS */, ["onUpdate:modelValue", "placeholder"]), [
9737
9824
  [_vModelText, _ctx.openclawStructured.timeout]
9738
9825
  ])
9739
9826
  ]),
@@ -9742,8 +9829,8 @@ return function render(_ctx, _cache) {
9742
9829
  _withDirectives(_createElementVNode("input", {
9743
9830
  "onUpdate:modelValue": $event => ((_ctx.openclawStructured.contextTokens) = $event),
9744
9831
  class: "form-input",
9745
- placeholder: "例如: 4096"
9746
- }, null, 8 /* PROPS */, ["onUpdate:modelValue"]), [
9832
+ placeholder: _ctx.t('modal.openclaw.structured.contextTokensPlaceholder')
9833
+ }, null, 8 /* PROPS */, ["onUpdate:modelValue", "placeholder"]), [
9747
9834
  [_vModelText, _ctx.openclawStructured.contextTokens]
9748
9835
  ])
9749
9836
  ]),
@@ -9752,8 +9839,8 @@ return function render(_ctx, _cache) {
9752
9839
  _withDirectives(_createElementVNode("input", {
9753
9840
  "onUpdate:modelValue": $event => ((_ctx.openclawStructured.maxConcurrent) = $event),
9754
9841
  class: "form-input",
9755
- placeholder: "例如: 2"
9756
- }, null, 8 /* PROPS */, ["onUpdate:modelValue"]), [
9842
+ placeholder: _ctx.t('modal.openclaw.structured.maxConcurrentPlaceholder')
9843
+ }, null, 8 /* PROPS */, ["onUpdate:modelValue", "placeholder"]), [
9757
9844
  [_vModelText, _ctx.openclawStructured.maxConcurrent]
9758
9845
  ])
9759
9846
  ])
@@ -9761,7 +9848,7 @@ return function render(_ctx, _cache) {
9761
9848
  _createElementVNode("div", { class: "structured-card" }, [
9762
9849
  _createElementVNode("div", { class: "structured-card-title" }, "Env"),
9763
9850
  _createElementVNode("div", { class: "form-group" }, [
9764
- _createElementVNode("label", { class: "form-label" }, "环境变量"),
9851
+ _createElementVNode("label", { class: "form-label" }, _toDisplayString(_ctx.t('modal.openclaw.structured.envVars')), 1 /* TEXT */),
9765
9852
  (_openBlock(true), _createElementBlock(_Fragment, null, _renderList(_ctx.openclawStructured.envItems, (item, index) => {
9766
9853
  return (_openBlock(), _createElementBlock("div", {
9767
9854
  class: "list-row",
@@ -9785,17 +9872,17 @@ return function render(_ctx, _cache) {
9785
9872
  _createElementVNode("button", {
9786
9873
  class: "btn-mini",
9787
9874
  onClick: $event => (_ctx.toggleOpenclawEnvItem(index))
9788
- }, _toDisplayString(item.show ? '隐藏' : '显示'), 9 /* TEXT, PROPS */, ["onClick"]),
9875
+ }, _toDisplayString(item.show ? _ctx.t('common.hide') : _ctx.t('common.show')), 9 /* TEXT, PROPS */, ["onClick"]),
9789
9876
  _createElementVNode("button", {
9790
9877
  class: "btn-mini delete",
9791
9878
  onClick: $event => (_ctx.removeOpenclawEnvItem(index))
9792
- }, "删除", 8 /* PROPS */, ["onClick"])
9879
+ }, _toDisplayString(_ctx.t('common.delete')), 9 /* TEXT, PROPS */, ["onClick"])
9793
9880
  ]))
9794
9881
  }), 128 /* KEYED_FRAGMENT */)),
9795
9882
  _createElementVNode("button", {
9796
9883
  class: "btn-mini",
9797
9884
  onClick: _ctx.addOpenclawEnvItem
9798
- }, "添加变量", 8 /* PROPS */, ["onClick"])
9885
+ }, _toDisplayString(_ctx.t('modal.openclaw.structured.addEnvVar')), 9 /* TEXT, PROPS */, ["onClick"])
9799
9886
  ])
9800
9887
  ]),
9801
9888
  _createElementVNode("div", { class: "structured-card" }, [
@@ -9824,20 +9911,20 @@ return function render(_ctx, _cache) {
9824
9911
  _withDirectives(_createElementVNode("input", {
9825
9912
  "onUpdate:modelValue": $event => ((_ctx.openclawStructured.toolsAllow[index]) = $event),
9826
9913
  class: "form-input",
9827
- placeholder: "例如: fs.read*"
9828
- }, null, 8 /* PROPS */, ["onUpdate:modelValue"]), [
9914
+ placeholder: _ctx.t('modal.openclaw.structured.allowPlaceholder')
9915
+ }, null, 8 /* PROPS */, ["onUpdate:modelValue", "placeholder"]), [
9829
9916
  [_vModelText, _ctx.openclawStructured.toolsAllow[index]]
9830
9917
  ]),
9831
9918
  _createElementVNode("button", {
9832
9919
  class: "btn-mini delete",
9833
9920
  onClick: $event => (_ctx.removeOpenclawToolsAllow(index))
9834
- }, "删除", 8 /* PROPS */, ["onClick"])
9921
+ }, _toDisplayString(_ctx.t('common.delete')), 9 /* TEXT, PROPS */, ["onClick"])
9835
9922
  ]))
9836
9923
  }), 128 /* KEYED_FRAGMENT */)),
9837
9924
  _createElementVNode("button", {
9838
9925
  class: "btn-mini",
9839
9926
  onClick: _ctx.addOpenclawToolsAllow
9840
- }, "添加 allow", 8 /* PROPS */, ["onClick"])
9927
+ }, _toDisplayString(_ctx.t('modal.openclaw.structured.addAllow')), 9 /* TEXT, PROPS */, ["onClick"])
9841
9928
  ]),
9842
9929
  _createElementVNode("div", { class: "form-group" }, [
9843
9930
  _createElementVNode("label", { class: "form-label" }, "Deny"),
@@ -9849,29 +9936,29 @@ return function render(_ctx, _cache) {
9849
9936
  _withDirectives(_createElementVNode("input", {
9850
9937
  "onUpdate:modelValue": $event => ((_ctx.openclawStructured.toolsDeny[index]) = $event),
9851
9938
  class: "form-input",
9852
- placeholder: "例如: net.*"
9853
- }, null, 8 /* PROPS */, ["onUpdate:modelValue"]), [
9939
+ placeholder: _ctx.t('modal.openclaw.structured.denyPlaceholder')
9940
+ }, null, 8 /* PROPS */, ["onUpdate:modelValue", "placeholder"]), [
9854
9941
  [_vModelText, _ctx.openclawStructured.toolsDeny[index]]
9855
9942
  ]),
9856
9943
  _createElementVNode("button", {
9857
9944
  class: "btn-mini delete",
9858
9945
  onClick: $event => (_ctx.removeOpenclawToolsDeny(index))
9859
- }, "删除", 8 /* PROPS */, ["onClick"])
9946
+ }, _toDisplayString(_ctx.t('common.delete')), 9 /* TEXT, PROPS */, ["onClick"])
9860
9947
  ]))
9861
9948
  }), 128 /* KEYED_FRAGMENT */)),
9862
9949
  _createElementVNode("button", {
9863
9950
  class: "btn-mini",
9864
9951
  onClick: _ctx.addOpenclawToolsDeny
9865
- }, "添加 deny", 8 /* PROPS */, ["onClick"])
9952
+ }, _toDisplayString(_ctx.t('modal.openclaw.structured.addDeny')), 9 /* TEXT, PROPS */, ["onClick"])
9866
9953
  ])
9867
9954
  ]),
9868
9955
  _createElementVNode("div", { class: "structured-card" }, [
9869
- _createElementVNode("div", { class: "structured-card-title" }, "Providers(只读)"),
9956
+ _createElementVNode("div", { class: "structured-card-title" }, _toDisplayString(_ctx.t('modal.openclaw.structured.providersTitle')), 1 /* TEXT */),
9870
9957
  (_ctx.openclawProviders.length === 0)
9871
9958
  ? (_openBlock(), _createElementBlock("div", {
9872
9959
  key: 0,
9873
9960
  class: "form-hint"
9874
- }, " 未发现 providers 配置(可能使用环境变量或外部配置)。 "))
9961
+ }, _toDisplayString(_ctx.t('modal.openclaw.structured.noProviders')), 1 /* TEXT */))
9875
9962
  : (_openBlock(), _createElementBlock("div", {
9876
9963
  key: 1,
9877
9964
  class: "provider-list"
@@ -9883,19 +9970,19 @@ return function render(_ctx, _cache) {
9883
9970
  }, [
9884
9971
  _createElementVNode("div", { class: "provider-header" }, [
9885
9972
  _createElementVNode("span", { class: "provider-name" }, _toDisplayString(provider.key), 1 /* TEXT */),
9886
- _createElementVNode("span", { class: "provider-source" }, "来源: " + _toDisplayString(provider.source), 1 /* TEXT */),
9973
+ _createElementVNode("span", { class: "provider-source" }, _toDisplayString(_ctx.t('modal.openclaw.structured.sourceLabel')) + ": " + _toDisplayString(provider.source), 1 /* TEXT */),
9887
9974
  (provider.isActive)
9888
9975
  ? (_openBlock(), _createElementBlock("span", {
9889
9976
  key: 0,
9890
9977
  class: "pill configured"
9891
- }, "使用中"))
9978
+ }, _toDisplayString(_ctx.t('modal.openclaw.structured.active')), 1 /* TEXT */))
9892
9979
  : _createCommentVNode("v-if", true)
9893
9980
  ]),
9894
9981
  (provider.fields.length === 0)
9895
9982
  ? (_openBlock(), _createElementBlock("div", {
9896
9983
  key: 0,
9897
9984
  class: "form-hint"
9898
- }, "未配置字段"))
9985
+ }, _toDisplayString(_ctx.t('modal.openclaw.structured.noFields')), 1 /* TEXT */))
9899
9986
  : (_openBlock(), _createElementBlock("div", {
9900
9987
  key: 1,
9901
9988
  class: "provider-fields"
@@ -9917,16 +10004,16 @@ return function render(_ctx, _cache) {
9917
10004
  ? (_openBlock(), _createElementBlock("div", {
9918
10005
  key: 2,
9919
10006
  class: "form-hint"
9920
- }, " 使用中的 provider 未在配置中显示:" + _toDisplayString(_ctx.openclawMissingProviders.join(', ')) + "。 ", 1 /* TEXT */))
10007
+ }, _toDisplayString(_ctx.t('modal.openclaw.structured.missingProviders', { list: _ctx.openclawMissingProviders.join(', ') })), 1 /* TEXT */))
9921
10008
  : _createCommentVNode("v-if", true)
9922
10009
  ]),
9923
10010
  _createElementVNode("div", { class: "structured-card" }, [
9924
- _createElementVNode("div", { class: "structured-card-title" }, "Agents(只读)"),
10011
+ _createElementVNode("div", { class: "structured-card-title" }, _toDisplayString(_ctx.t('modal.openclaw.structured.agentsTitle')), 1 /* TEXT */),
9925
10012
  (_ctx.openclawAgentsList.length === 0)
9926
10013
  ? (_openBlock(), _createElementBlock("div", {
9927
10014
  key: 0,
9928
10015
  class: "form-hint"
9929
- }, " 未发现 agents.list 配置。 "))
10016
+ }, _toDisplayString(_ctx.t('modal.openclaw.structured.noAgents')), 1 /* TEXT */))
9930
10017
  : (_openBlock(), _createElementBlock("div", {
9931
10018
  key: 1,
9932
10019
  class: "agent-list"
@@ -9946,13 +10033,13 @@ return function render(_ctx, _cache) {
9946
10033
  class: "agent-meta"
9947
10034
  }, [
9948
10035
  (agent.theme)
9949
- ? (_openBlock(), _createElementBlock("span", { key: 0 }, "主题: " + _toDisplayString(agent.theme), 1 /* TEXT */))
10036
+ ? (_openBlock(), _createElementBlock("span", { key: 0 }, _toDisplayString(_ctx.t('modal.openclaw.structured.themeLabel')) + ": " + _toDisplayString(agent.theme), 1 /* TEXT */))
9950
10037
  : _createCommentVNode("v-if", true),
9951
10038
  (agent.emoji)
9952
- ? (_openBlock(), _createElementBlock("span", { key: 1 }, "表情: " + _toDisplayString(agent.emoji), 1 /* TEXT */))
10039
+ ? (_openBlock(), _createElementBlock("span", { key: 1 }, _toDisplayString(_ctx.t('modal.openclaw.structured.emojiLabel')) + ": " + _toDisplayString(agent.emoji), 1 /* TEXT */))
9953
10040
  : _createCommentVNode("v-if", true),
9954
10041
  (agent.avatar)
9955
- ? (_openBlock(), _createElementBlock("span", { key: 2 }, "头像: " + _toDisplayString(agent.avatar), 1 /* TEXT */))
10042
+ ? (_openBlock(), _createElementBlock("span", { key: 2 }, _toDisplayString(_ctx.t('modal.openclaw.structured.avatarLabel')) + ": " + _toDisplayString(agent.avatar), 1 /* TEXT */))
9956
10043
  : _createCommentVNode("v-if", true)
9957
10044
  ]))
9958
10045
  : _createCommentVNode("v-if", true)
@@ -9965,7 +10052,7 @@ return function render(_ctx, _cache) {
9965
10052
  _createElementVNode("button", {
9966
10053
  class: "btn btn-confirm secondary",
9967
10054
  onClick: _ctx.syncOpenclawStructuredFromText
9968
- }, "从文本刷新", 8 /* PROPS */, ["onClick"]),
10055
+ }, _toDisplayString(_ctx.t('common.refreshFromText')), 9 /* TEXT, PROPS */, ["onClick"]),
9969
10056
  _createElementVNode("button", {
9970
10057
  class: "btn btn-confirm",
9971
10058
  onClick: _ctx.applyOpenclawStructuredToText
@@ -9973,20 +10060,20 @@ return function render(_ctx, _cache) {
9973
10060
  ])
9974
10061
  ]),
9975
10062
  _createElementVNode("div", { class: "form-group" }, [
9976
- _createElementVNode("label", { class: "form-label" }, "OpenClaw 配置(JSON5)"),
10063
+ _createElementVNode("label", { class: "form-label" }, _toDisplayString(_ctx.t('modal.openclaw.editorLabel')), 1 /* TEXT */),
9977
10064
  _withDirectives(_createElementVNode("textarea", {
9978
10065
  "onUpdate:modelValue": $event => ((_ctx.openclawEditing.content) = $event),
9979
10066
  class: "form-input template-editor",
9980
10067
  spellcheck: "false",
9981
10068
  readonly: _ctx.openclawSaving || _ctx.openclawApplying,
9982
- placeholder: "在这里编辑 OpenClaw 配置(JSON5)"
9983
- }, null, 8 /* PROPS */, ["onUpdate:modelValue", "readonly"]), [
10069
+ placeholder: _ctx.t('modal.openclaw.editorPlaceholder')
10070
+ }, null, 8 /* PROPS */, ["onUpdate:modelValue", "readonly", "placeholder"]), [
9984
10071
  [_vModelText, _ctx.openclawEditing.content]
9985
10072
  ]),
9986
10073
  _createElementVNode("div", { class: "template-editor-warning" }, [
9987
10074
  (_ctx.openclawEditing.lockName && _ctx.isDefaultOpenclawConfig(_ctx.openclawEditing.name))
9988
- ? (_openBlock(), _createElementBlock("span", { key: 0 }, "默认配置始终映射当前 openclaw.json,请直接使用“保存并应用”。"))
9989
- : (_openBlock(), _createElementBlock("span", { key: 1 }, "保存仅写入本地配置库。点击“保存并应用”后会写入 openclaw.json。"))
10075
+ ? (_openBlock(), _createElementBlock("span", { key: 0 }, _toDisplayString(_ctx.t('modal.openclaw.defaultConfigHint')), 1 /* TEXT */))
10076
+ : (_openBlock(), _createElementBlock("span", { key: 1 }, _toDisplayString(_ctx.t('modal.openclaw.saveOnlyHint')), 1 /* TEXT */))
9990
10077
  ])
9991
10078
  ]),
9992
10079
  _createElementVNode("div", { class: "btn-group" }, [
@@ -9994,17 +10081,17 @@ return function render(_ctx, _cache) {
9994
10081
  class: "btn btn-cancel",
9995
10082
  onClick: _ctx.closeOpenclawConfigModal,
9996
10083
  disabled: _ctx.openclawSaving || _ctx.openclawApplying
9997
- }, "取消", 8 /* PROPS */, ["onClick", "disabled"]),
10084
+ }, _toDisplayString(_ctx.t('common.cancel')), 9 /* TEXT, PROPS */, ["onClick", "disabled"]),
9998
10085
  _createElementVNode("button", {
9999
10086
  class: "btn btn-confirm",
10000
10087
  onClick: _ctx.saveOpenclawConfig,
10001
10088
  disabled: _ctx.openclawSaving || _ctx.openclawApplying || (_ctx.openclawEditing.lockName && _ctx.isDefaultOpenclawConfig(_ctx.openclawEditing.name))
10002
- }, _toDisplayString(_ctx.openclawSaving ? '保存中...' : '保存'), 9 /* TEXT, PROPS */, ["onClick", "disabled"]),
10089
+ }, _toDisplayString(_ctx.openclawSaving ? _ctx.t('common.saving') : _ctx.t('common.save')), 9 /* TEXT, PROPS */, ["onClick", "disabled"]),
10003
10090
  _createElementVNode("button", {
10004
10091
  class: "btn btn-confirm secondary",
10005
10092
  onClick: _ctx.saveAndApplyOpenclawConfig,
10006
10093
  disabled: _ctx.openclawSaving || _ctx.openclawApplying
10007
- }, _toDisplayString(_ctx.openclawApplying ? '应用中...' : '保存并应用'), 9 /* TEXT, PROPS */, ["onClick", "disabled"])
10094
+ }, _toDisplayString(_ctx.openclawApplying ? _ctx.t('common.applying') : _ctx.t('common.saveApply')), 9 /* TEXT, PROPS */, ["onClick", "disabled"])
10008
10095
  ])
10009
10096
  ])
10010
10097
  ], 8 /* PROPS */, ["onClick"]))
@@ -10216,7 +10303,7 @@ return function render(_ctx, _cache) {
10216
10303
  _createElementVNode("div", { class: "form-hint" }, [
10217
10304
  _createTextVNode(_toDisplayString(_ctx.agentsPath || _ctx.t('common.notLoaded')) + " ", 1 /* TEXT */),
10218
10305
  (_ctx.agentsPath)
10219
- ? (_openBlock(), _createElementBlock("span", { key: 0 }, " (" + _toDisplayString(_ctx.agentsExists ? _ctx.t('common.exists') : _ctx.t('common.notExistsWillCreateOnSave')) + ") ", 1 /* TEXT */))
10306
+ ? (_openBlock(), _createElementBlock("span", { key: 0 }, _toDisplayString(_ctx.paren(_ctx.agentsExists ? _ctx.t('common.exists') : _ctx.t('common.notExistsWillCreateOnSave'))), 1 /* TEXT */))
10220
10307
  : _createCommentVNode("v-if", true)
10221
10308
  ])
10222
10309
  ]),
@@ -10656,7 +10743,7 @@ return function render(_ctx, _cache) {
10656
10743
  _createElementVNode("div", { class: "form-hint" }, [
10657
10744
  _createTextVNode(_toDisplayString(_ctx.healthCheckResult.ok ? _ctx.t('config.health.ok') : _ctx.t('config.health.fail')) + " ", 1 /* TEXT */),
10658
10745
  (_ctx.healthCheckResult.issues)
10659
- ? (_openBlock(), _createElementBlock("span", { key: 0 }, "(" + _toDisplayString(_ctx.t('config.health.issues', { count: _ctx.healthCheckResult.issues.length })) + ")", 1 /* TEXT */))
10746
+ ? (_openBlock(), _createElementBlock("span", { key: 0 }, _toDisplayString(_ctx.paren(_ctx.t('config.health.issues', { count: _ctx.healthCheckResult.issues.length }))), 1 /* TEXT */))
10660
10747
  : _createCommentVNode("v-if", true)
10661
10748
  ]),
10662
10749
  (_ctx.healthCheckResult.remote && _ctx.healthCheckResult.remote.type === 'remote-health-check')